@mushi-mushi/web 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/i18n/en.ts","../src/i18n/ja.ts","../src/i18n/th.ts","../src/i18n/es.ts","../src/i18n/index.ts","../src/styles.ts","../src/widget.ts","../src/rewards.ts","../src/capture/console.ts","../src/internal-requests.ts","../src/capture/network.ts","../src/capture/screenshot.ts","../src/capture/performance.ts","../src/capture/element-selector.ts","../src/capture/timeline.ts","../src/capture/discovery.ts","../src/sentry.ts","../src/proactive-triggers.ts","../src/proactive-manager.ts","../src/version.ts","../src/mushi.ts"],"names":["MAX_ENTRIES","getSessionId","scope","handleClick","handleError","handleUnhandledRejection","apiClient","MUSHI_INTERNAL_INIT_MARKER"],"mappings":"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","file":"index.js","sourcesContent":["import type { MushiLocale } from './types';\n\nexport const en: MushiLocale = {\n widget: {\n trigger: 'Report Issue',\n title: 'Report an Issue',\n close: 'Close',\n back: 'Back',\n submit: 'Submit',\n submitting: 'Submitting…',\n submitted: 'Thank you! Your report has been submitted.',\n error: 'Something went wrong. Please try again.',\n },\n step1: {\n heading: 'What kind of issue?',\n categories: {\n bug: 'Bug',\n slow: 'Slow / Laggy',\n visual: 'Visual Glitch',\n confusing: 'Confusing',\n other: 'Other',\n },\n categoryDescriptions: {\n bug: 'Something is broken or not working',\n slow: 'Performance issue or slow loading',\n visual: 'Layout, styling, or display problem',\n confusing: 'Hard to understand or navigate',\n other: 'Something else',\n },\n },\n step2: {\n heading: 'What happened?',\n intents: {\n bug: ['Crash', 'Unresponsive', 'Data loss', 'Wrong result', 'Other'],\n slow: ['Page load', 'Interaction', 'API call', 'Animation', 'Other'],\n visual: ['Layout broken', 'Overlapping', 'Missing element', 'Wrong color/font', 'Other'],\n confusing: ['Unclear label', 'Missing help', 'Unexpected flow', 'Lost navigation', 'Other'],\n other: ['Feature request', 'Accessibility', 'Typo', 'Other'],\n },\n },\n step3: {\n heading: 'Tell us more',\n descriptionPlaceholder: 'Describe what happened…',\n screenshotButton: 'Attach Screenshot',\n screenshotAttached: 'Screenshot attached',\n elementButton: 'Select Element',\n elementSelected: 'Element selected',\n optional: '(optional)',\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const ja: MushiLocale = {\n widget: {\n trigger: '問題を報告',\n title: '問題を報告する',\n close: '閉じる',\n back: '戻る',\n submit: '送信',\n submitting: '送信中…',\n submitted: 'ありがとうございます!レポートが送信されました。',\n error: 'エラーが発生しました。もう一度お試しください。',\n },\n step1: {\n heading: 'どのような問題ですか?',\n categories: {\n bug: 'バグ',\n slow: '遅い・重い',\n visual: '表示の問題',\n confusing: 'わかりにくい',\n other: 'その他',\n },\n categoryDescriptions: {\n bug: '動作しない、壊れている',\n slow: 'パフォーマンスが悪い、読み込みが遅い',\n visual: 'レイアウト、デザイン、表示の問題',\n confusing: '理解しにくい、操作がわかりにくい',\n other: 'その他の問題',\n },\n },\n step2: {\n heading: '何が起きましたか?',\n intents: {\n bug: ['クラッシュ', '無反応', 'データ消失', '誤った結果', 'その他'],\n slow: ['ページ読込', '操作反応', 'API通信', 'アニメーション', 'その他'],\n visual: ['レイアウト崩れ', '要素の重なり', '要素が表示されない', '色/フォントが違う', 'その他'],\n confusing: ['ラベルが不明瞭', 'ヘルプがない', '予想外のフロー', 'ナビゲーション迷子', 'その他'],\n other: ['機能要望', 'アクセシビリティ', '誤字脱字', 'その他'],\n },\n },\n step3: {\n heading: '詳細を教えてください',\n descriptionPlaceholder: '何が起きたか説明してください…',\n screenshotButton: 'スクリーンショット添付',\n screenshotAttached: 'スクリーンショット添付済み',\n elementButton: '要素を選択',\n elementSelected: '要素選択済み',\n optional: '(任意)',\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const th: MushiLocale = {\n widget: {\n trigger: 'รายงานปัญหา',\n title: 'รายงานปัญหา',\n close: 'ปิด',\n back: 'กลับ',\n submit: 'ส่ง',\n submitting: 'กำลังส่ง…',\n submitted: 'ขอบคุณครับ/ค่ะ! รายงานของคุณถูกส่งแล้ว',\n error: 'เกิดข้อผิดพลาด กรุณาลองใหม่อีกครั้ง',\n },\n step1: {\n heading: 'ปัญหาประเภทไหน?',\n categories: {\n bug: 'บัก',\n slow: 'ช้า / แลค',\n visual: 'แสดงผลผิดปกติ',\n confusing: 'สับสน',\n other: 'อื่นๆ',\n },\n categoryDescriptions: {\n bug: 'มีบางอย่างเสียหรือทำงานไม่ถูกต้อง',\n slow: 'ปัญหาประสิทธิภาพหรือโหลดช้า',\n visual: 'ปัญหาเลย์เอาต์ สไตล์ หรือการแสดงผล',\n confusing: 'เข้าใจยากหรือนำทางยาก',\n other: 'อย่างอื่น',\n },\n },\n step2: {\n heading: 'เกิดอะไรขึ้น?',\n intents: {\n bug: ['แครช', 'ไม่ตอบสนอง', 'ข้อมูลหาย', 'ผลลัพธ์ผิด', 'อื่นๆ'],\n slow: ['โหลดหน้า', 'การโต้ตอบ', 'API', 'แอนิเมชัน', 'อื่นๆ'],\n visual: ['เลย์เอาต์เสีย', 'ซ้อนทับ', 'องค์ประกอบหาย', 'สี/ฟอนต์ผิด', 'อื่นๆ'],\n confusing: ['ป้ายไม่ชัด', 'ไม่มีคำแนะนำ', 'ขั้นตอนไม่คาดคิด', 'หลงทาง', 'อื่นๆ'],\n other: ['ขอฟีเจอร์', 'การเข้าถึง', 'พิมพ์ผิด', 'อื่นๆ'],\n },\n },\n step3: {\n heading: 'บอกเราเพิ่มเติม',\n descriptionPlaceholder: 'อธิบายสิ่งที่เกิดขึ้น…',\n screenshotButton: 'แนบสกรีนช็อต',\n screenshotAttached: 'แนบสกรีนช็อตแล้ว',\n elementButton: 'เลือกองค์ประกอบ',\n elementSelected: 'เลือกองค์ประกอบแล้ว',\n optional: '(ไม่บังคับ)',\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const es: MushiLocale = {\n widget: {\n trigger: 'Reportar problema',\n title: 'Reportar un problema',\n close: 'Cerrar',\n back: 'Volver',\n submit: 'Enviar',\n submitting: 'Enviando…',\n submitted: '¡Gracias! Tu reporte ha sido enviado.',\n error: 'Algo salió mal. Por favor, inténtalo de nuevo.',\n },\n step1: {\n heading: '¿Qué tipo de problema?',\n categories: {\n bug: 'Error',\n slow: 'Lento',\n visual: 'Problema visual',\n confusing: 'Confuso',\n other: 'Otro',\n },\n categoryDescriptions: {\n bug: 'Algo está roto o no funciona',\n slow: 'Problema de rendimiento o carga lenta',\n visual: 'Problema de diseño, estilo o visualización',\n confusing: 'Difícil de entender o navegar',\n other: 'Otro problema',\n },\n },\n step2: {\n heading: '¿Qué pasó?',\n intents: {\n bug: ['Crash', 'Sin respuesta', 'Pérdida de datos', 'Resultado incorrecto', 'Otro'],\n slow: ['Carga de página', 'Interacción', 'Llamada API', 'Animación', 'Otro'],\n visual: ['Layout roto', 'Superposición', 'Elemento faltante', 'Color/fuente incorrecta', 'Otro'],\n confusing: ['Etiqueta confusa', 'Sin ayuda', 'Flujo inesperado', 'Navegación perdida', 'Otro'],\n other: ['Solicitud de función', 'Accesibilidad', 'Error tipográfico', 'Otro'],\n },\n },\n step3: {\n heading: 'Cuéntanos más',\n descriptionPlaceholder: 'Describe lo que pasó…',\n screenshotButton: 'Adjuntar captura',\n screenshotAttached: 'Captura adjunta',\n elementButton: 'Seleccionar elemento',\n elementSelected: 'Elemento seleccionado',\n optional: '(opcional)',\n },\n};\n","import type { MushiLocale } from './types';\nimport { en } from './en';\nimport { ja } from './ja';\nimport { th } from './th';\nimport { es } from './es';\n\nexport type { MushiLocale } from './types';\n\nconst locales: Record<string, MushiLocale> = { en, ja, th, es };\n\nexport function getLocale(code?: string): MushiLocale {\n if (!code) return en;\n const base = code.split('-')[0].toLowerCase();\n return locales[base] ?? en;\n}\n\nexport function getAvailableLocales(): string[] {\n return Object.keys(locales);\n}\n","/**\n * FILE: packages/web/src/styles.ts\n * PURPOSE: Visual design system for the bug-capture widget. Returns a single\n * string of CSS scoped to the widget's shadow root.\n *\n * DESIGN LANGUAGE — \"Mushi Mushi Editorial\"\n *\n * The product name is 虫々 (mushi-mushi, Japanese for \"bug, bug\"). Earlier\n * versions of this widget rendered as a generic SaaS chatbot — round purple\n * button, Inter font, drop-shadowed white modal — indistinguishable from\n * every Intercom/Crisp/UserBack clone. We lean into the brand instead.\n *\n * The aesthetic borrows from Japanese print + editorial design:\n *\n * • PAPER + INK — warm cream surface, deep sumi ink type, no flat\n * white. Subtle paper grain via a single noise SVG\n * background-image to break the digital flatness.\n * • VERMILLION 朱 — single signature accent (#E03C2C) used as a hanko\n * stamp colour. Replaces the generic SaaS purple.\n * Used only for: active state, focus underline,\n * submit button, and the success stamp animation.\n * • SERIF DISPLAY — Iowan/Palatino/Georgia stack for headings (a real\n * editorial serif on every desktop OS, no web font\n * fetch, no FOUT).\n * • MONO METADATA — ui-monospace for step counters, captions, and the\n * submit-button label, evoking a printer's ledger.\n * • RULE LINES — content separators are 1px hairlines, not boxes.\n * Categories list looks like a contents page, not a\n * card stack.\n * • STAMP INTERACTIONS — submit button has a vermillion ink-bloom\n * animation; the success step shows a 朱印 (red\n * stamp) ring with \"RECEIVED\" in mono caps.\n *\n * Constraints respected: typography ≥ 12px (skill: design-frontend),\n * touch targets ≥ 44px, focus-visible always rendered, prefers-reduced-\n * motion fully honoured, AA contrast in both themes, no external fonts.\n */\n\nexport function getWidgetStyles(theme: 'light' | 'dark'): string {\n const isDark = theme === 'dark';\n\n /* ── Tokens ──────────────────────────────────────────────────────────\n Named for the material they evoke (paper, ink, rule, vermillion)\n rather than the role (background, text, border) so the palette is\n hard to dilute with a generic \"primary/secondary\" rename later. */\n\n const paper = isDark ? '#0F0E0C' : '#F8F4ED'; // washi cream / dark wash\n const ink = isDark ? '#F2EBDD' : '#0E0D0B'; // sumi black / cream type\n const inkMuted = isDark ? '#928B7E' : '#5C5852'; // captions, descriptions\n const inkFaint = isDark ? '#5A5650' : '#9A9489'; // disabled, separators\n const rule = isDark ? 'rgba(242,235,221,0.10)' : 'rgba(14,13,11,0.10)';\n const ruleStrong = isDark ? 'rgba(242,235,221,0.18)' : 'rgba(14,13,11,0.16)';\n const vermillion = isDark ? '#FF5A47' : '#E03C2C'; // 朱 hanko red\n const vermillionWash = isDark ? 'rgba(255,90,71,0.12)' : 'rgba(224,60,44,0.08)';\n const vermillionInk = isDark ? '#FFE5E0' : '#7A1F15'; // text on vermillion wash\n\n /* Type stacks. Pure system stacks — no web-font fetch — but curated so\n every OS lands on a high-quality serif/mono rather than a generic\n fallback. The body sans intentionally avoids Inter/Roboto (skill:\n design-frontend \"Anti-Generic\"); system-ui resolves to SF Pro on\n Apple, Segoe UI Variable on Windows 11, Roboto on Android — all\n more characterful than Inter at small sizes. */\n const fontDisplay = `'Iowan Old Style', 'Palatino Linotype', 'Palatino', 'Book Antiqua', 'Cambria', Georgia, 'Times New Roman', serif`;\n const fontBody = `system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI Variable Display', 'Segoe UI', sans-serif`;\n const fontMono = `ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, 'Liberation Mono', monospace`;\n\n /* Custom easing — a soft back-out that feels like a stamp pressing down,\n not a generic ease. Used everywhere a panel/button moves so the whole\n widget shares a single motion signature. */\n const easeStamp = 'cubic-bezier(0.22, 1, 0.36, 1)';\n\n return `\n :host {\n all: initial;\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1.55;\n color: ${ink};\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n font-feature-settings: 'ss01', 'cv11'; /* nicer system-ui glyphs where supported */\n }\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n button { font-family: inherit; }\n\n .mushi-trigger {\n position: fixed;\n width: 52px;\n height: 52px;\n border: 1px solid ${ruleStrong};\n border-radius: 4px;\n background: ${paper};\n color: ${ink};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: ${fontDisplay};\n font-size: 22px;\n line-height: 1;\n box-shadow:\n 0 1px 0 ${rule},\n 0 6px 14px -8px rgba(14,13,11,0.35),\n inset 0 -3px 0 ${vermillion};\n transition: transform 200ms ${easeStamp}, box-shadow 200ms ${easeStamp};\n overflow: visible;\n isolation: isolate;\n }\n .mushi-trigger::after {\n content: '';\n position: absolute;\n top: 6px;\n right: 6px;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: ${vermillion};\n box-shadow: 0 0 0 0 ${vermillion};\n animation: mushi-pulse 2.4s ${easeStamp} infinite;\n }\n .mushi-trigger:hover {\n transform: translateY(-2px) rotate(-1.5deg);\n box-shadow:\n 0 1px 0 ${rule},\n 0 14px 24px -10px rgba(14,13,11,0.45),\n inset 0 -3px 0 ${vermillion};\n }\n .mushi-trigger:active {\n transform: translateY(0) rotate(0);\n box-shadow:\n 0 1px 0 ${rule},\n 0 2px 4px -2px rgba(14,13,11,0.35),\n inset 0 -2px 0 ${vermillion};\n }\n .mushi-trigger:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 3px;\n }\n .mushi-trigger.bottom-right {\n bottom: var(--mushi-bottom, calc(24px + env(safe-area-inset-bottom, 0px)));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n }\n .mushi-trigger.bottom-left {\n bottom: var(--mushi-bottom, calc(24px + env(safe-area-inset-bottom, 0px)));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n }\n .mushi-trigger.top-right {\n top: var(--mushi-top, calc(24px + env(safe-area-inset-top, 0px)));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n }\n .mushi-trigger.top-left {\n top: var(--mushi-top, calc(24px + env(safe-area-inset-top, 0px)));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n }\n .mushi-trigger.edge-tab {\n width: 32px;\n height: 88px;\n border-radius: 4px 0 0 4px;\n writing-mode: vertical-rl;\n text-orientation: upright;\n font-size: 16px;\n box-shadow:\n 0 1px 0 ${rule},\n 0 10px 24px -14px rgba(14,13,11,0.45),\n inset -3px 0 0 ${vermillion};\n }\n .mushi-trigger.edge-tab.bottom-right,\n .mushi-trigger.edge-tab.top-right {\n right: var(--mushi-right, 0);\n }\n .mushi-trigger.edge-tab.bottom-left,\n .mushi-trigger.edge-tab.top-left {\n left: var(--mushi-left, 0);\n border-radius: 0 4px 4px 0;\n box-shadow:\n 0 1px 0 ${rule},\n 0 10px 24px -14px rgba(14,13,11,0.45),\n inset 3px 0 0 ${vermillion};\n }\n .mushi-trigger.shrunk {\n width: 36px;\n height: 36px;\n opacity: 0.82;\n transform: scale(0.92);\n }\n\n @keyframes mushi-pulse {\n 0% { box-shadow: 0 0 0 0 ${vermillion}; opacity: 1; }\n 70% { box-shadow: 0 0 0 8px rgba(224,60,44,0); opacity: 0.5; }\n 100% { box-shadow: 0 0 0 0 rgba(224,60,44,0); opacity: 1; }\n }\n\n .mushi-panel {\n position: fixed;\n width: 384px;\n max-width: calc(100vw - 32px);\n max-height: min(640px, calc(100vh - 120px));\n background: ${paper};\n border: 1px solid ${ruleStrong};\n border-radius: 6px;\n box-shadow:\n 0 1px 0 ${rule},\n 0 24px 56px -20px rgba(14,13,11,0.30),\n 0 8px 16px -8px rgba(14,13,11,0.20);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n transform-origin: var(--mushi-origin, bottom right);\n }\n .mushi-panel.open { animation: mushi-stamp-in 320ms ${easeStamp} both; }\n .mushi-panel.closed { display: none; }\n .mushi-panel.bottom-right {\n bottom: var(--mushi-panel-bottom, calc(var(--mushi-bottom, 24px) + 64px));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n --mushi-origin: bottom right;\n }\n .mushi-panel.bottom-left {\n bottom: var(--mushi-panel-bottom, calc(var(--mushi-bottom, 24px) + 64px));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n --mushi-origin: bottom left;\n }\n .mushi-panel.top-right {\n top: var(--mushi-panel-top, calc(var(--mushi-top, 24px) + 64px));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n --mushi-origin: top right;\n }\n .mushi-panel.top-left {\n top: var(--mushi-panel-top, calc(var(--mushi-top, 24px) + 64px));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n --mushi-origin: top left;\n }\n .mushi-outdated {\n margin: 12px 14px 0;\n padding: 10px 12px;\n border: 1px solid ${vermillionWash};\n background: ${vermillionWash};\n color: ${vermillionInk};\n font-family: ${fontBody};\n font-size: 12px;\n line-height: 1.4;\n }\n .mushi-outdated strong {\n display: block;\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n margin-bottom: 2px;\n }\n .mushi-outdated span {\n display: block;\n margin-top: 3px;\n color: ${inkMuted};\n }\n\n @keyframes mushi-stamp-in {\n 0% { opacity: 0; transform: scale(0.94) translateY(6px); }\n 60% { opacity: 1; }\n 100% { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n .mushi-header {\n padding: 18px 20px 14px;\n border-bottom: 1px solid ${rule};\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: end;\n gap: 12px;\n }\n .mushi-header-mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border-radius: 3px;\n background: ${vermillion};\n color: #FAF7F0;\n font-family: ${fontDisplay};\n font-size: 14px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: -0.02em;\n transform: rotate(-3deg);\n flex-shrink: 0;\n }\n .mushi-header-titles {\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .mushi-header-eyebrow {\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.18em;\n text-transform: uppercase;\n color: ${inkMuted};\n }\n .mushi-header h3 {\n font-family: ${fontDisplay};\n font-size: 19px;\n font-weight: 500;\n line-height: 1.15;\n letter-spacing: -0.01em;\n color: ${ink};\n }\n .mushi-header-meta {\n align-self: start;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .mushi-step-counter {\n font-family: ${fontMono};\n font-size: 11px;\n color: ${inkMuted};\n letter-spacing: 0.06em;\n tab-size: 2ch;\n padding-top: 2px;\n }\n .mushi-step-counter b {\n font-weight: 600;\n color: ${ink};\n }\n .mushi-close, .mushi-back {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: ${inkMuted};\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1;\n border-radius: 3px;\n transition: color 150ms ${easeStamp};\n }\n .mushi-close:hover, .mushi-back:hover { color: ${vermillion}; }\n .mushi-close:focus-visible, .mushi-back:focus-visible {\n outline: 1.5px solid ${vermillion};\n outline-offset: 2px;\n }\n\n /* ── Body ───────────────────────────────────────────────────────\n Generous left/right padding (22px) so type breathes. Vertical\n padding tighter at top because the header rule already creates\n breathing room. */\n .mushi-body {\n padding: 8px 22px 16px;\n overflow-y: auto;\n flex: 1;\n scrollbar-width: thin;\n scrollbar-color: ${inkFaint} transparent;\n }\n .mushi-body::-webkit-scrollbar { width: 6px; }\n .mushi-body::-webkit-scrollbar-thumb { background: ${inkFaint}; border-radius: 3px; }\n\n .mushi-option-btn {\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: center;\n gap: 14px;\n width: 100%;\n padding: 14px 0;\n border: none;\n border-bottom: 1px solid ${rule};\n background: transparent;\n cursor: pointer;\n color: inherit;\n text-align: left;\n transition: padding 220ms ${easeStamp}, color 220ms ${easeStamp};\n position: relative;\n }\n .mushi-option-btn:last-child { border-bottom: none; }\n .mushi-option-btn:hover { padding-left: 6px; color: ${vermillion}; }\n .mushi-option-btn:hover .mushi-option-arrow { opacity: 1; transform: translateX(0); color: ${vermillion}; }\n .mushi-option-btn:focus-visible {\n outline: none;\n padding-left: 6px;\n box-shadow: inset 2px 0 0 ${vermillion};\n }\n .mushi-option-icon {\n font-size: 18px;\n line-height: 1;\n flex-shrink: 0;\n filter: ${isDark ? 'none' : 'grayscale(0.15)'};\n }\n .mushi-option-text { display: flex; flex-direction: column; gap: 3px; min-width: 0; }\n .mushi-option-label {\n font-family: ${fontDisplay};\n font-size: 16px;\n font-weight: 500;\n letter-spacing: -0.005em;\n line-height: 1.2;\n }\n .mushi-option-desc {\n font-size: 12px;\n color: ${inkMuted};\n letter-spacing: 0.005em;\n }\n .mushi-option-arrow {\n font-family: ${fontMono};\n font-size: 14px;\n color: ${inkFaint};\n opacity: 0;\n transform: translateX(-4px);\n transition: opacity 220ms ${easeStamp}, transform 220ms ${easeStamp}, color 220ms ${easeStamp};\n }\n .mushi-report-row {\n width: 100%;\n display: grid;\n grid-template-columns: auto 1fr auto;\n gap: 8px;\n align-items: center;\n padding: 10px 0;\n border: 0;\n border-bottom: 1px solid ${rule};\n background: transparent;\n color: ${ink};\n cursor: pointer;\n text-align: left;\n }\n .mushi-report-status {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${vermillion};\n text-transform: uppercase;\n }\n .mushi-report-title {\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .mushi-thread-summary {\n border-bottom: 1px solid ${rule};\n padding-bottom: 10px;\n margin-bottom: 10px;\n }\n .mushi-thread-summary span {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${vermillion};\n text-transform: uppercase;\n }\n .mushi-thread {\n display: grid;\n gap: 8px;\n max-height: 180px;\n overflow: auto;\n margin-bottom: 12px;\n }\n .mushi-thread-comment {\n padding: 8px 10px;\n border: 1px solid ${rule};\n background: ${isDark ? 'rgba(242,235,221,0.04)' : 'rgba(14,13,11,0.03)'};\n }\n .mushi-thread-comment.reporter {\n border-color: ${vermillionWash};\n background: ${vermillionWash};\n }\n .mushi-thread-comment strong {\n display: block;\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n margin-bottom: 3px;\n }\n .mushi-thread-comment p,\n .mushi-muted,\n .mushi-error-inline {\n font-size: 12px;\n color: ${inkMuted};\n line-height: 1.45;\n }\n .mushi-error-inline { color: ${vermillion}; }\n\n .mushi-selected-category {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px 6px 12px;\n border-left: 2px solid ${vermillion};\n background: ${vermillionWash};\n color: ${vermillionInk};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n margin: 4px 0 14px;\n border-radius: 0 3px 3px 0;\n }\n .mushi-selected-category span:first-child { font-size: 14px; }\n .mushi-intents {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .mushi-intent-btn {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 12px 0;\n border: none;\n border-bottom: 1px solid ${rule};\n background: transparent;\n cursor: pointer;\n color: inherit;\n text-align: left;\n font-family: ${fontDisplay};\n font-size: 15px;\n transition: padding 220ms ${easeStamp}, color 220ms ${easeStamp};\n }\n .mushi-intent-btn::after {\n content: '\\u2192';\n font-family: ${fontMono};\n font-size: 13px;\n color: ${inkFaint};\n opacity: 0;\n transform: translateX(-4px);\n transition: opacity 220ms ${easeStamp}, transform 220ms ${easeStamp};\n }\n .mushi-intent-btn:last-child { border-bottom: none; }\n .mushi-intent-btn:hover { padding-left: 6px; color: ${vermillion}; }\n .mushi-intent-btn:hover::after { opacity: 1; transform: translateX(0); color: ${vermillion}; }\n .mushi-intent-btn:focus-visible {\n outline: none;\n padding-left: 6px;\n box-shadow: inset 2px 0 0 ${vermillion};\n }\n\n .mushi-textarea {\n width: 100%;\n min-height: 96px;\n padding: 8px 0 10px;\n border: none;\n border-bottom: 1px solid ${ruleStrong};\n background: transparent;\n color: ${ink};\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1.5;\n resize: vertical;\n outline: none;\n transition: border-color 200ms ${easeStamp};\n }\n .mushi-textarea::placeholder {\n color: ${inkFaint};\n font-style: italic;\n }\n .mushi-textarea:focus { border-bottom-color: ${vermillion}; }\n\n .mushi-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 12px;\n }\n .mushi-attach-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 10px;\n border: 1px solid ${ruleStrong};\n border-radius: 3px;\n background: transparent;\n color: ${inkMuted};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n cursor: pointer;\n transition: color 180ms ${easeStamp}, border-color 180ms ${easeStamp}, background 180ms ${easeStamp};\n }\n .mushi-attach-btn:hover {\n color: ${ink};\n border-color: ${ink};\n }\n .mushi-attach-btn.active {\n color: ${vermillion};\n border-color: ${vermillion};\n background: ${vermillionWash};\n }\n .mushi-attach-btn.danger {\n color: ${vermillionInk};\n border-color: ${vermillionWash};\n background: transparent;\n }\n .mushi-attach-btn.danger:hover {\n color: ${vermillion};\n border-color: ${vermillion};\n background: ${vermillionWash};\n }\n .mushi-attach-btn:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 2px;\n }\n\n .mushi-footer {\n padding: 14px 22px 16px;\n border-top: 1px solid ${rule};\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n }\n .mushi-footer-hint {\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.10em;\n text-transform: uppercase;\n color: ${inkFaint};\n }\n .mushi-submit {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid ${vermillion};\n border-radius: 3px;\n background: ${vermillion};\n color: #FAF7F0;\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.16em;\n text-transform: uppercase;\n cursor: pointer;\n overflow: hidden;\n transition: transform 180ms ${easeStamp}, box-shadow 180ms ${easeStamp};\n box-shadow: 0 2px 0 ${isDark ? '#7A1F15' : '#9A2A1E'};\n }\n .mushi-submit::after {\n content: '';\n position: absolute;\n inset: 0;\n background: radial-gradient(circle at center, rgba(255,255,255,0.35) 0%, transparent 60%);\n opacity: 0;\n transform: scale(0.4);\n transition: opacity 280ms ${easeStamp}, transform 380ms ${easeStamp};\n pointer-events: none;\n }\n .mushi-submit:hover {\n transform: translateY(-1px);\n box-shadow: 0 3px 0 ${isDark ? '#7A1F15' : '#9A2A1E'};\n }\n .mushi-submit:hover::after { opacity: 1; transform: scale(1.4); }\n .mushi-submit:active { transform: translateY(1px); box-shadow: 0 1px 0 ${isDark ? '#7A1F15' : '#9A2A1E'}; }\n .mushi-submit:disabled {\n cursor: wait;\n opacity: 0.7;\n }\n .mushi-submit:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 3px;\n }\n .mushi-submit-arrow {\n display: inline-block;\n transition: transform 220ms ${easeStamp};\n }\n .mushi-submit:hover .mushi-submit-arrow { transform: translateX(3px); }\n\n .mushi-brand-footer {\n padding: 9px 14px 11px;\n border-top: 1px solid ${rule};\n color: ${inkFaint};\n font-family: ${fontMono};\n font-size: 9px;\n letter-spacing: 0.16em;\n text-align: center;\n text-transform: uppercase;\n }\n\n .mushi-step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 22px 14px;\n color: ${inkFaint};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.10em;\n }\n .mushi-step-num {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n transition: color 200ms ${easeStamp};\n }\n .mushi-step-num.done { color: ${inkMuted}; text-decoration: line-through; text-decoration-color: ${inkFaint}; }\n .mushi-step-num.active {\n color: ${vermillion};\n font-family: ${fontDisplay};\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0;\n }\n .mushi-step-sep { width: 14px; height: 1px; background: ${rule}; }\n\n .mushi-success {\n text-align: center;\n padding: 28px 16px 20px;\n }\n .mushi-success-stamp {\n position: relative;\n width: 96px;\n height: 96px;\n margin: 0 auto 16px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .mushi-success-stamp svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n }\n .mushi-success-stamp circle {\n fill: none;\n stroke: ${vermillion};\n stroke-width: 3;\n stroke-dasharray: 280;\n stroke-dashoffset: 280;\n transform: rotate(-90deg);\n transform-origin: center;\n animation: mushi-stamp-ring 700ms ${easeStamp} 80ms forwards;\n }\n .mushi-success-stamp-label {\n font-family: ${fontDisplay};\n font-size: 18px;\n font-weight: 600;\n color: ${vermillion};\n letter-spacing: 0.04em;\n transform: rotate(-6deg);\n opacity: 0;\n animation: mushi-stamp-press 360ms ${easeStamp} 600ms forwards;\n }\n .mushi-success-headline {\n font-family: ${fontDisplay};\n font-size: 18px;\n font-weight: 500;\n color: ${ink};\n margin-bottom: 4px;\n }\n .mushi-success-meta {\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.10em;\n text-transform: uppercase;\n color: ${inkMuted};\n }\n\n @keyframes mushi-stamp-ring {\n to { stroke-dashoffset: 0; }\n }\n @keyframes mushi-stamp-press {\n 0% { opacity: 0; transform: rotate(-6deg) scale(1.3); }\n 60% { opacity: 1; transform: rotate(-6deg) scale(0.94); }\n 100% { opacity: 1; transform: rotate(-6deg) scale(1); }\n }\n\n .mushi-error {\n margin-top: 10px;\n padding: 8px 0 8px 10px;\n border-left: 2px solid ${vermillion};\n color: ${vermillion};\n font-size: 12px;\n font-family: ${fontMono};\n letter-spacing: 0.02em;\n }\n\n /* ── Rewards nudge (category step) ───────────────────────────── */\n .mushi-rewards-nudge {\n border-top: 1px solid ${rule};\n padding: 10px 0 4px;\n margin-top: 6px;\n }\n .mushi-rewards-row {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 8px;\n }\n .mushi-tier-pip {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n .mushi-rewards-tier-name {\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: ${ink};\n }\n .mushi-rewards-pts-count {\n font-family: ${fontMono};\n font-size: 11px;\n color: ${inkMuted};\n margin-right: auto;\n }\n .mushi-rewards-pts-earn {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${vermillion};\n letter-spacing: 0.04em;\n white-space: nowrap;\n }\n .mushi-tier-bar-track {\n height: 3px;\n background: ${ruleStrong};\n border-radius: 2px;\n overflow: hidden;\n margin-bottom: 5px;\n }\n .mushi-tier-bar-fill {\n height: 100%;\n background: ${vermillion};\n border-radius: 2px;\n transition: width 600ms ${easeStamp};\n }\n .mushi-rewards-next-label {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${inkMuted};\n text-align: right;\n letter-spacing: 0.02em;\n }\n\n /* ── Rewards on success step ─────────────────────────────────── */\n .mushi-success-rewards {\n margin-top: 14px;\n padding-top: 12px;\n border-top: 1px solid ${rule};\n width: 100%;\n }\n .mushi-success-pts-award {\n font-family: ${fontMono};\n font-size: 22px;\n font-weight: 700;\n color: ${vermillion};\n text-align: center;\n letter-spacing: 0.06em;\n margin-bottom: 10px;\n opacity: 0;\n animation: mushi-pts-pop 420ms ${easeStamp} 900ms forwards;\n }\n .success-bar { margin: 0 0 5px; }\n\n @keyframes mushi-pts-pop {\n from { opacity: 0; transform: scale(0.75) translateY(6px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n /* ─── Beta mode strip (category step) ─────────────────────────────── */\n\n .mushi-beta-strip {\n margin: 0 16px 2px;\n padding: 9px 12px;\n background: rgba(99, 102, 241, 0.07);\n border: 1px solid rgba(99, 102, 241, 0.18);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .mushi-beta-strip-row {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .mushi-beta-tag {\n display: inline-flex;\n align-items: center;\n padding: 1px 6px;\n border-radius: 4px;\n background: rgba(245, 158, 11, 0.15);\n border: 1px solid rgba(245, 158, 11, 0.35);\n color: #b45309;\n font-family: var(--mushi-font-mono);\n font-size: 9px;\n font-weight: 700;\n letter-spacing: 0.08em;\n line-height: 1.6;\n white-space: nowrap;\n flex-shrink: 0;\n }\n\n @media (prefers-color-scheme: dark) {\n .mushi-beta-tag {\n background: rgba(245, 158, 11, 0.12);\n border-color: rgba(245, 158, 11, 0.28);\n color: #fbbf24;\n }\n }\n\n .mushi-beta-msg {\n font-size: 11px;\n color: var(--mushi-text-dim);\n line-height: 1.45;\n }\n\n .mushi-beta-contact-hint {\n font-size: 10px;\n color: var(--mushi-text-dim);\n opacity: 0.72;\n font-family: var(--mushi-font-mono);\n }\n\n .mushi-beta-perks {\n list-style: none;\n margin: 2px 0 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .mushi-beta-perks li {\n font-size: 10.5px;\n color: #4f46e5;\n font-weight: 500;\n }\n\n @media (prefers-color-scheme: dark) {\n .mushi-beta-perks li {\n color: #818cf8;\n }\n }\n\n /* ─── Beta changelog (collapsible What's new) ──────────────────────── */\n\n .mushi-changelog {\n margin-top: 5px;\n }\n\n .mushi-changelog-summary {\n font-size: 10.5px;\n color: var(--mushi-text-dim);\n cursor: pointer;\n list-style: none;\n display: flex;\n align-items: center;\n gap: 4px;\n user-select: none;\n }\n\n .mushi-changelog-summary::before {\n content: '▶';\n font-size: 7px;\n opacity: 0.6;\n transition: transform 0.15s ease;\n }\n\n .mushi-changelog[open] .mushi-changelog-summary::before {\n transform: rotate(90deg);\n }\n\n .mushi-changelog-list {\n margin: 5px 0 0 4px;\n padding: 0;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .mushi-changelog-list li {\n font-size: 10.5px;\n color: var(--mushi-text-dim);\n line-height: 1.5;\n }\n\n /* ─── Beta success footer ───────────────────────────────────────────── */\n\n .mushi-beta-success-footer {\n margin-top: 14px;\n padding: 10px 14px;\n background: rgba(99, 102, 241, 0.06);\n border: 1px solid rgba(99, 102, 241, 0.14);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 3px;\n text-align: left;\n }\n\n .mushi-beta-success-line {\n font-size: 11px;\n color: var(--mushi-text-dim);\n line-height: 1.5;\n }\n\n .mushi-beta-success-dim {\n opacity: 0.65;\n font-size: 10.5px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.001ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.001ms !important;\n }\n .mushi-success-stamp circle { stroke-dashoffset: 0; }\n .mushi-success-stamp-label { opacity: 1; }\n .mushi-success-pts-award { opacity: 1; }\n }\n `;\n}\n","/**\n * FILE: packages/web/src/widget.ts\n * PURPOSE: The bug-capture widget — floating trigger + multi-step report\n * panel — that mounts into a customer's app via `Mushi.init()`.\n *\n * DESIGN: Visual styling lives in `./styles.ts` (\"Mushi Mushi Editorial\":\n * paper + sumi ink + 朱 vermillion, serif display + monospace\n * metadata, ledger-style step counter, hanko stamp animation on\n * success). This file owns the DOM structure, state, and all\n * user-facing ARIA / keyboard wiring.\n */\n\nimport type {\n MushiReportCategory,\n MushiReporterComment,\n MushiReporterReport,\n MushiWidgetConfig,\n} from '@mushi-mushi/core';\nimport { getLocale, type MushiLocale } from './i18n';\nimport { getWidgetStyles } from './styles';\n\ntype WidgetStep = 'category' | 'intent' | 'details' | 'success' | 'reports' | 'report-detail';\n\nconst CATEGORY_ICONS: Record<MushiReportCategory, string> = {\n bug: '\\u26A0\\uFE0F',\n slow: '\\uD83D\\uDC0C',\n visual: '\\uD83C\\uDFA8',\n confusing: '\\uD83D\\uDE15',\n other: '\\uD83D\\uDCDD',\n};\n\n/** The two-digit padded step number used in the header ledger (\"01 / 03\"). */\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\nconst TOTAL_STEPS = 3;\nconst STEP_NUMBER: Record<Exclude<WidgetStep, 'success'>, number> = {\n category: 1,\n intent: 2,\n details: 3,\n reports: 1,\n 'report-detail': 1,\n};\n\n/** Detects modifier-key presses for the Ctrl/Cmd+Enter submit shortcut.\n * metaKey covers macOS, ctrlKey covers Windows/Linux/ChromeOS. */\nfunction isSubmitShortcut(e: KeyboardEvent): boolean {\n return (e.metaKey || e.ctrlKey) && e.key === 'Enter';\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nexport interface WidgetRewardsState {\n tier: { slug: string; displayName: string; pointsThreshold: number } | null;\n nextTier: { displayName: string; pointsThreshold: number } | null;\n totalPoints: number;\n /** Expected base points for a `report_submit` action (default 50). */\n pointsForReport: number;\n}\n\nexport interface WidgetCallbacks {\n onSubmit(data: { category: MushiReportCategory; description: string; intent?: string }): void;\n onOpen(): void;\n onClose(): void;\n onScreenshotRequest(): void;\n onScreenshotRemove?(): void;\n onElementSelectorRequest?(): void;\n onReporterReportsRequest?(): Promise<MushiReporterReport[]>;\n onReporterCommentsRequest?(reportId: string): Promise<MushiReporterComment[]>;\n onReporterReply?(reportId: string, body: string): Promise<void>;\n}\n\nexport class MushiWidget {\n private host: HTMLElement;\n private shadow: ShadowRoot;\n private config: Required<MushiWidgetConfig>;\n private callbacks: WidgetCallbacks;\n private locale: MushiLocale;\n private isOpen = false;\n private step: WidgetStep = 'category';\n private selectedCategory: MushiReportCategory | null = null;\n private selectedIntent: string | null = null;\n private screenshotAttached = false;\n private allowScreenshotRemove = true;\n private elementSelected = false;\n private submitting = false;\n private triggerVisible = true;\n private triggerShrunk = false;\n private triggerHiddenByScroll = false;\n private sdkFreshness: { latest: string | null; current: string; deprecated: boolean; message?: string | null } | null = null;\n private reporterReports: MushiReporterReport[] = [];\n private reporterComments: MushiReporterComment[] = [];\n private selectedReportId: string | null = null;\n private reporterLoading = false;\n private reporterError: string | null = null;\n private attachedLaunchers: Array<() => void> = [];\n private smartHideCleanup: (() => void) | null = null;\n private smartHideTimer: ReturnType<typeof setTimeout> | null = null;\n /** Captured at the moment of submit so the success ledger metadata\n * (\"REPORT · 14:23:07 JST\") doesn't drift while the success step\n * is on screen. */\n private submittedAt: Date | null = null;\n /** Pending success-state + auto-close timers. Tracked so destroy()\n * can clear them — otherwise a host that unmounts mid-submit leaks\n * this MushiWidget reference (and re-renders into a detached shadow\n * root) for up to ~3.3s after destroy. */\n private successTimer: ReturnType<typeof setTimeout> | null = null;\n private autoCloseTimer: ReturnType<typeof setTimeout> | null = null;\n private rewardsState: WidgetRewardsState | null = null;\n\n constructor(config: MushiWidgetConfig = {}, callbacks: WidgetCallbacks, private readonly sdkVersion = '0.7.0') {\n this.config = {\n position: config.position ?? 'bottom-right',\n anchor: config.anchor ?? {},\n theme: config.theme ?? 'auto',\n // Falsy-OR (NOT `??`) on purpose: `triggerText: ''` is semantically\n // nonsense — it would render a labelless, glyphless trigger button\n // that users can't see or aim at. Treat empty string the same as\n // omitted so any caller that wires this to a cleared form input or\n // pastes a legacy snippet that emitted `triggerText: \"\"` (see\n // apps/admin/src/lib/sdkSnippets.ts widgetLines history) still gets\n // the default 🐛 and a visible button.\n triggerText: config.triggerText || '\\uD83D\\uDC1B',\n expandedTitle: config.expandedTitle ?? '',\n mode: config.mode ?? 'conversational',\n locale: config.locale ?? 'auto',\n zIndex: config.zIndex ?? 99999,\n trigger: config.trigger ?? 'auto',\n attachToSelector: config.attachToSelector ?? '',\n inset: config.inset ?? {},\n respectSafeArea: config.respectSafeArea ?? true,\n hideOnSelector: config.hideOnSelector ?? '',\n hideOnRoutes: config.hideOnRoutes ?? [],\n environments: config.environments ?? {},\n smartHide: config.smartHide ?? false,\n draggable: config.draggable ?? false,\n brandFooter: config.brandFooter ?? true,\n outdatedBanner: config.outdatedBanner ?? 'auto',\n betaMode: config.betaMode ?? {},\n };\n this.callbacks = callbacks;\n this.locale = getLocale(this.config.locale === 'auto' ? undefined : this.config.locale);\n\n this.host = document.createElement('div');\n this.host.id = 'mushi-mushi-widget';\n this.shadow = this.host.attachShadow({ mode: 'closed' });\n }\n\n mount(): void {\n if (this.host.isConnected) return;\n document.body.appendChild(this.host);\n this.syncAttachedLaunchers();\n this.syncSmartHide();\n this.render();\n }\n\n getIsMounted(): boolean {\n return this.host.isConnected;\n }\n\n updateConfig(config: MushiWidgetConfig = {}): void {\n this.config = {\n ...this.config,\n ...(config.position ? { position: config.position } : {}),\n ...(config.anchor !== undefined ? { anchor: config.anchor } : {}),\n ...(config.theme ? { theme: config.theme } : {}),\n ...(config.triggerText !== undefined ? { triggerText: config.triggerText || '\\uD83D\\uDC1B' } : {}),\n ...(config.expandedTitle !== undefined ? { expandedTitle: config.expandedTitle } : {}),\n ...(config.mode ? { mode: config.mode } : {}),\n ...(config.locale ? { locale: config.locale } : {}),\n ...(config.zIndex !== undefined ? { zIndex: config.zIndex } : {}),\n ...(config.trigger ? { trigger: config.trigger } : {}),\n ...(config.attachToSelector !== undefined ? { attachToSelector: config.attachToSelector } : {}),\n ...(config.inset !== undefined ? { inset: config.inset } : {}),\n ...(config.respectSafeArea !== undefined ? { respectSafeArea: config.respectSafeArea } : {}),\n ...(config.hideOnSelector !== undefined ? { hideOnSelector: config.hideOnSelector } : {}),\n ...(config.hideOnRoutes !== undefined ? { hideOnRoutes: config.hideOnRoutes } : {}),\n ...(config.environments !== undefined ? { environments: config.environments } : {}),\n ...(config.smartHide !== undefined ? { smartHide: config.smartHide } : {}),\n ...(config.draggable !== undefined ? { draggable: config.draggable } : {}),\n ...(config.brandFooter !== undefined ? { brandFooter: config.brandFooter } : {}),\n ...(config.outdatedBanner !== undefined ? { outdatedBanner: config.outdatedBanner } : {}),\n ...(config.betaMode !== undefined ? { betaMode: config.betaMode } : {}),\n };\n this.locale = getLocale(this.config.locale === 'auto' ? undefined : this.config.locale);\n this.syncAttachedLaunchers();\n this.syncSmartHide();\n this.render();\n }\n\n open(options?: { category?: MushiReportCategory }): void {\n if (this.isOpen) return;\n this.isOpen = true;\n this.screenshotAttached = false;\n this.elementSelected = false;\n this.submitting = false;\n this.submittedAt = null;\n\n if (options?.category) {\n this.selectedCategory = options.category;\n this.selectedIntent = null;\n this.step = 'intent';\n } else {\n this.selectedCategory = null;\n this.selectedIntent = null;\n this.step = 'category';\n }\n\n this.render();\n this.callbacks.onOpen();\n }\n\n close(): void {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.render();\n this.callbacks.onClose();\n }\n\n getIsOpen(): boolean {\n return this.isOpen;\n }\n\n showTrigger(): void {\n this.triggerVisible = true;\n this.render();\n }\n\n hideTrigger(): void {\n this.triggerVisible = false;\n this.render();\n }\n\n setTrigger(trigger: NonNullable<MushiWidgetConfig['trigger']>): void {\n this.updateConfig({ trigger });\n }\n\n attachTo(selectorOrElement: string | Element, options: MushiWidgetConfig = {}): () => void {\n const elements = typeof selectorOrElement === 'string'\n ? Array.from(document.querySelectorAll(selectorOrElement))\n : [selectorOrElement];\n const cleanups = elements.map((el) => {\n const onClick = (event: Event) => {\n event.preventDefault();\n this.updateConfig(options);\n this.open();\n };\n el.addEventListener('click', onClick);\n return () => el.removeEventListener('click', onClick);\n });\n return () => cleanups.forEach((cleanup) => cleanup());\n }\n\n setScreenshotAttached(attached: boolean): void {\n this.screenshotAttached = attached;\n if (this.isOpen) this.render();\n }\n\n setAllowScreenshotRemove(allow: boolean): void {\n this.allowScreenshotRemove = allow;\n if (this.isOpen) this.render();\n }\n\n setElementSelected(selected: boolean): void {\n this.elementSelected = selected;\n if (this.isOpen) this.render();\n }\n\n setSdkFreshness(info: { latest: string | null; current: string; deprecated: boolean; message?: string | null }): void {\n this.sdkFreshness = info;\n if (this.isOpen) this.render();\n }\n\n setRewardsState(state: WidgetRewardsState | null): void {\n this.rewardsState = state;\n if (this.isOpen) this.render();\n }\n\n destroy(): void {\n if (this.successTimer !== null) {\n clearTimeout(this.successTimer);\n this.successTimer = null;\n }\n if (this.autoCloseTimer !== null) {\n clearTimeout(this.autoCloseTimer);\n this.autoCloseTimer = null;\n }\n if (this.smartHideTimer !== null) {\n clearTimeout(this.smartHideTimer);\n this.smartHideTimer = null;\n }\n this.smartHideCleanup?.();\n this.smartHideCleanup = null;\n this.attachedLaunchers.forEach((cleanup) => cleanup());\n this.attachedLaunchers = [];\n this.host.remove();\n }\n\n private syncAttachedLaunchers(): void {\n this.attachedLaunchers.forEach((cleanup) => cleanup());\n this.attachedLaunchers = [];\n if (this.config.trigger !== 'attach' || !this.config.attachToSelector) return;\n if (typeof document === 'undefined') return;\n this.attachedLaunchers.push(this.attachTo(this.config.attachToSelector));\n }\n\n private syncSmartHide(): void {\n this.smartHideCleanup?.();\n this.smartHideCleanup = null;\n this.triggerShrunk = false;\n this.triggerHiddenByScroll = false;\n if (!this.config.smartHide || typeof window === 'undefined') return;\n\n const smart = this.config.smartHide === true\n ? { onMobile: 'edge-tab' as const, onScroll: 'shrink' as const, onIdleMs: 900 }\n : this.config.smartHide;\n if (!smart.onScroll) return;\n\n const onScroll = () => {\n if (smart.onScroll === 'hide') {\n this.triggerHiddenByScroll = true;\n } else {\n this.triggerShrunk = true;\n }\n this.render();\n if (this.smartHideTimer !== null) clearTimeout(this.smartHideTimer);\n this.smartHideTimer = setTimeout(() => {\n this.triggerHiddenByScroll = false;\n this.triggerShrunk = false;\n this.render();\n }, smart.onIdleMs ?? 900);\n };\n window.addEventListener('scroll', onScroll, { passive: true });\n this.smartHideCleanup = () => window.removeEventListener('scroll', onScroll);\n }\n\n private shouldRenderTrigger(): boolean {\n if (!this.triggerVisible) return false;\n if (this.triggerHiddenByScroll) return false;\n if (this.config.trigger === 'manual' || this.config.trigger === 'hidden' || this.config.trigger === 'attach') {\n return false;\n }\n if (this.isMobileSmartHidden()) return false;\n if (this.isRouteHidden()) return false;\n if (this.config.hideOnSelector && document.querySelector(this.config.hideOnSelector)) return false;\n const action = this.config.environments[this.detectEnvironment()];\n return action !== 'never' && action !== 'manual';\n }\n\n private effectiveTrigger(): NonNullable<MushiWidgetConfig['trigger']> {\n if (!this.config.smartHide || typeof window === 'undefined') return this.config.trigger;\n const smart = this.config.smartHide === true\n ? { onMobile: 'edge-tab' as const }\n : this.config.smartHide;\n if (window.matchMedia('(max-width: 768px)').matches && smart.onMobile === 'edge-tab') {\n return 'edge-tab';\n }\n return this.config.trigger;\n }\n\n private isMobileSmartHidden(): boolean {\n if (!this.config.smartHide || typeof window === 'undefined') return false;\n const smart = this.config.smartHide === true ? { onMobile: 'edge-tab' as const } : this.config.smartHide;\n return window.matchMedia('(max-width: 768px)').matches && smart.onMobile === 'hide';\n }\n\n private detectEnvironment(): 'production' | 'staging' | 'development' {\n const host = typeof location !== 'undefined' ? location.hostname : '';\n if (host === 'localhost' || host === '127.0.0.1' || host.endsWith('.local')) return 'development';\n if (/\\b(staging|stage|preview|dev)\\b/i.test(host)) return 'staging';\n return 'production';\n }\n\n private isRouteHidden(): boolean {\n if (!this.config.hideOnRoutes.length || typeof location === 'undefined') return false;\n return this.config.hideOnRoutes.some((route) => location.pathname.includes(route));\n }\n\n private getTheme(): 'light' | 'dark' {\n if (this.config.theme !== 'auto') return this.config.theme;\n if (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n return 'light';\n }\n\n private render(): void {\n const theme = this.getTheme();\n const pos = this.config.position;\n const t = this.locale;\n\n this.shadow.innerHTML = '';\n\n const style = document.createElement('style');\n style.textContent = getWidgetStyles(theme);\n this.shadow.appendChild(style);\n\n if (this.shouldRenderTrigger()) {\n const effectiveTrigger = this.effectiveTrigger();\n const trigger = document.createElement('button');\n trigger.className = `mushi-trigger ${pos}${effectiveTrigger === 'edge-tab' ? ' edge-tab' : ''}${this.triggerShrunk ? ' shrunk' : ''}`;\n trigger.textContent = this.config.triggerText;\n trigger.setAttribute('aria-label', t.widget.trigger);\n trigger.setAttribute('aria-haspopup', 'dialog');\n trigger.setAttribute('aria-expanded', String(this.isOpen));\n trigger.style.zIndex = String(this.config.zIndex);\n this.applyInsetVars(trigger);\n trigger.addEventListener('click', () => {\n if (this.isOpen) this.close();\n else this.open();\n });\n this.shadow.appendChild(trigger);\n }\n\n const panel = document.createElement('div');\n panel.className = `mushi-panel ${pos}${this.isOpen ? ' open' : ' closed'}`;\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-modal', 'true');\n panel.setAttribute('aria-label', t.widget.title);\n panel.style.zIndex = String(this.config.zIndex + 1);\n this.applyInsetVars(panel);\n\n if (this.isOpen) {\n panel.innerHTML = `${this.renderOutdatedBanner()}${this.renderStep()}${this.renderBrandFooter()}`;\n this.shadow.appendChild(panel);\n this.attachHandlers(panel);\n this.trapFocus(panel);\n }\n }\n\n private applyInsetVars(el: HTMLElement): void {\n const { anchor } = this.config;\n if (anchor && Object.keys(anchor).length > 0) {\n (['top', 'right', 'bottom', 'left'] as const).forEach((edge) => {\n const value = anchor[edge];\n if (value !== undefined) el.style.setProperty(`--mushi-${edge}`, value);\n });\n el.style.setProperty('--mushi-safe-area', this.config.respectSafeArea ? '1' : '0');\n return;\n }\n\n const { inset } = this.config;\n if (!this.config.respectSafeArea) {\n (['top', 'right', 'bottom', 'left'] as const).forEach((edge) => {\n if (inset[edge] === undefined) el.style.setProperty(`--mushi-${edge}`, '24px');\n });\n }\n (['top', 'right', 'bottom', 'left'] as const).forEach((edge) => {\n const value = inset[edge];\n if (value === undefined) return;\n el.style.setProperty(`--mushi-${edge}`, value === 'auto' ? 'auto' : `${value}px`);\n });\n el.style.setProperty('--mushi-safe-area', this.config.respectSafeArea ? '1' : '0');\n }\n\n private renderStep(): string {\n switch (this.step) {\n case 'category': return this.renderCategoryStep();\n case 'intent': return this.renderIntentStep();\n case 'details': return this.renderDetailsStep();\n case 'success': return this.renderSuccessStep();\n case 'reports': return this.renderReportsStep();\n case 'report-detail': return this.renderReportDetailStep();\n }\n }\n\n private renderOutdatedBanner(): string {\n if (!this.sdkFreshness) return '';\n if (this.config.outdatedBanner === 'off' || this.config.outdatedBanner === 'console-only') return '';\n const { latest, current, deprecated, message } = this.sdkFreshness;\n if (!latest && !deprecated) return '';\n return `\n <div class=\"mushi-outdated\" role=\"status\">\n <strong>Mushi SDK ${escapeHtml(current)}</strong>\n ${latest ? `latest is ${escapeHtml(latest)}.` : 'needs attention.'}\n ${message ? `<span>${escapeHtml(message)}</span>` : ''}\n </div>\n `;\n }\n\n private renderBrandFooter(): string {\n if (this.config.brandFooter === false) return '';\n return `<div class=\"mushi-brand-footer\">Powered by Mushi v${escapeHtml(this.sdkVersion)}</div>`;\n }\n\n /**\n * Editorial masthead. Always carries:\n * • the brand mark (虫 kanji on vermillion, \"MUSHI\" in mono above)\n * • the page title (serif display)\n * • the close affordance\n *\n * On sub-steps it additionally renders a back button (replacing the\n * \"MUSHI\" eyebrow with a \"← BACK\" mono link) and a step counter\n * ledger (\"02 / 03\") on the far right.\n */\n private renderHeader(opts: {\n title: string;\n showBack?: boolean;\n step?: number;\n eyebrow?: string;\n }): string {\n const t = this.locale;\n const { title, showBack = false, step, eyebrow } = opts;\n\n const eyebrowHtml = showBack\n ? `<button type=\"button\" class=\"mushi-back\" data-action=\"back\" aria-label=\"${t.widget.back}\">\\u2190 ${t.widget.back}</button>`\n : `<span class=\"mushi-header-eyebrow\">${eyebrow ?? 'Mushi \\u00B7 Report'}</span>`;\n\n const counterHtml = step\n ? `<span class=\"mushi-step-counter\" aria-label=\"Step ${step} of ${TOTAL_STEPS}\"><b>${pad2(step)}</b> / ${pad2(TOTAL_STEPS)}</span>`\n : '';\n\n return `\n <div class=\"mushi-header\">\n <div class=\"mushi-header-mark\" aria-hidden=\"true\">\\u866B</div>\n <div class=\"mushi-header-titles\">\n ${eyebrowHtml}\n <h3>${title}</h3>\n </div>\n <div class=\"mushi-header-meta\">\n ${counterHtml}\n <button type=\"button\" class=\"mushi-close\" data-action=\"close\" aria-label=\"${t.widget.close}\">\\u2715</button>\n </div>\n </div>\n `;\n }\n\n /**\n * Numeral step indicator: \"01 — 02 — 03\", with the active step in\n * vermillion serif and completed steps struck through in mono.\n * Replaces the original three-dot indicator (a generic SaaS pattern).\n */\n private renderStepIndicator(currentStep: number): string {\n const segments: string[] = [];\n for (let i = 1; i <= TOTAL_STEPS; i++) {\n const cls =\n i < currentStep ? 'mushi-step-num done' :\n i === currentStep ? 'mushi-step-num active' :\n 'mushi-step-num';\n segments.push(`<span class=\"${cls}\">${pad2(i)}</span>`);\n if (i < TOTAL_STEPS) segments.push('<span class=\"mushi-step-sep\" aria-hidden=\"true\"></span>');\n }\n return `<div class=\"mushi-step-indicator\" aria-hidden=\"true\">${segments.join('')}</div>`;\n }\n\n private renderCategoryStep(): string {\n const t = this.locale;\n const categories = (['bug', 'slow', 'visual', 'confusing', 'other'] as MushiReportCategory[])\n .map((id) => `\n <button type=\"button\" class=\"mushi-option-btn\" data-category=\"${id}\" role=\"radio\" aria-checked=\"false\">\n <span class=\"mushi-option-icon\" aria-hidden=\"true\">${CATEGORY_ICONS[id]}</span>\n <div class=\"mushi-option-text\">\n <span class=\"mushi-option-label\">${t.step1.categories[id]}</span>\n <span class=\"mushi-option-desc\">${t.step1.categoryDescriptions[id]}</span>\n </div>\n <span class=\"mushi-option-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n `).join('');\n\n return `\n ${this.renderHeader({ title: t.step1.heading, step: STEP_NUMBER.category })}\n ${this.config.betaMode?.enabled ? this.renderBetaStrip() : ''}\n <div class=\"mushi-body\" role=\"radiogroup\" aria-label=\"${t.step1.heading}\">\n <button type=\"button\" class=\"mushi-option-btn mushi-reports-entry\" data-action=\"reports\">\n <span class=\"mushi-option-icon\" aria-hidden=\"true\">\\uD83D\\uDCEC</span>\n <div class=\"mushi-option-text\">\n <span class=\"mushi-option-label\">Your reports${this.unreadCount() ? ` (${this.unreadCount()} new)` : ''}</span>\n <span class=\"mushi-option-desc\">See status, developer replies, and respond</span>\n </div>\n <span class=\"mushi-option-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n ${categories}\n ${this.rewardsState ? this.renderRewardsNudge() : ''}\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.category)}\n `;\n }\n\n /** Collapsible \"What's new\" changelog row. Closes the reporter feedback loop. */\n private renderBetaChangelog(): string {\n const entries = this.config.betaMode?.changelogItems;\n if (!entries?.length) return '';\n const latest = entries[0];\n const items = latest.items.map((item) => `<li>\\u2022 ${escapeHtml(item)}</li>`).join('');\n const label = latest.date\n ? `What\\u2019s new in ${escapeHtml(latest.version)} \\u00B7 ${escapeHtml(latest.date)}`\n : `What\\u2019s new in ${escapeHtml(latest.version)}`;\n return `\n <details class=\"mushi-changelog\">\n <summary class=\"mushi-changelog-summary\">${label}</summary>\n <ul class=\"mushi-changelog-list\">${items}</ul>\n </details>\n `;\n }\n\n /**\n * Discreet beta status strip: communicates \"work in progress\", invites\n * feedback, and sets expectations — reducing user frustration while\n * nudging the reciprocity instinct (\"your reports help us build this\").\n */\n private renderBetaStrip(): string {\n const beta = this.config.betaMode!;\n const appName = escapeHtml(beta.appName ?? 'This app');\n const message = beta.message\n ? escapeHtml(beta.message)\n : `${appName} is in early development — updates ship weekly`;\n const email = beta.contactEmail ? escapeHtml(beta.contactEmail) : null;\n const perks = beta.perks ?? [];\n\n return `\n <div class=\"mushi-beta-strip\" role=\"note\" aria-label=\"Beta status\">\n <div class=\"mushi-beta-strip-row\">\n <span class=\"mushi-beta-tag\" aria-hidden=\"true\">BETA</span>\n <span class=\"mushi-beta-msg\">${message}</span>\n </div>\n ${email ? `<div class=\"mushi-beta-contact-hint\">Reports go to ${email} · reviewed by the team</div>` : ''}\n ${perks.length > 0 ? `\n <ul class=\"mushi-beta-perks\" aria-label=\"Beta tester perks\">\n ${perks.map((p) => `<li>\\u2713 ${escapeHtml(p)}</li>`).join('')}\n </ul>\n ` : ''}\n ${this.renderBetaChangelog()}\n </div>\n `;\n }\n\n private renderReportsStep(): string {\n const reports = this.reporterReports.map((report) => `\n <button type=\"button\" class=\"mushi-report-row\" data-report-id=\"${escapeHtml(report.id)}\">\n <span class=\"mushi-report-status\">${escapeHtml(report.status)}</span>\n <span class=\"mushi-report-title\">${escapeHtml(report.summary ?? report.description ?? `Report ${report.id.slice(0, 8)}`)}</span>\n ${report.unread_count ? `<b>${report.unread_count}</b>` : ''}\n </button>\n `).join('');\n return `\n ${this.renderHeader({ title: 'Your reports', showBack: true, eyebrow: 'Mushi · Inbox' })}\n <div class=\"mushi-body\">\n ${this.reporterLoading ? '<p class=\"mushi-muted\">Loading reports…</p>' : ''}\n ${this.reporterError ? `<p class=\"mushi-error-inline\">${escapeHtml(this.reporterError)}</p>` : ''}\n ${reports || (!this.reporterLoading ? '<p class=\"mushi-muted\">No reports from this browser yet.</p>' : '')}\n </div>\n `;\n }\n\n private renderReportDetailStep(): string {\n const report = this.reporterReports.find((r) => r.id === this.selectedReportId);\n const comments = this.reporterComments.map((comment) => `\n <div class=\"mushi-thread-comment ${comment.author_kind}\">\n <strong>${escapeHtml(comment.author_kind === 'reporter' ? 'You' : (comment.author_name ?? 'Developer'))}</strong>\n <p>${escapeHtml(comment.body)}</p>\n </div>\n `).join('');\n return `\n ${this.renderHeader({ title: 'Report thread', showBack: true, eyebrow: 'Mushi · Inbox' })}\n <div class=\"mushi-body\">\n <div class=\"mushi-thread-summary\">\n <span>${escapeHtml(report?.status ?? 'unknown')}</span>\n <p>${escapeHtml(report?.summary ?? report?.description ?? 'Report details')}</p>\n </div>\n <div class=\"mushi-thread\">\n ${this.reporterLoading ? '<p class=\"mushi-muted\">Loading thread…</p>' : comments || '<p class=\"mushi-muted\">No developer replies yet.</p>'}\n </div>\n <textarea class=\"mushi-textarea\" data-role=\"reporter-reply\" rows=\"3\" placeholder=\"Reply to the developer…\"></textarea>\n <button type=\"button\" class=\"mushi-submit\" data-action=\"reporter-reply\">\n <span>Reply</span><span class=\"mushi-submit-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n </div>\n `;\n }\n\n private renderIntentStep(): string {\n const t = this.locale;\n const cat = this.selectedCategory!;\n const intents = t.step2.intents[cat] || [];\n\n const options = intents.map((intent) => `\n <button type=\"button\" class=\"mushi-intent-btn\" data-intent=\"${intent}\">\n ${intent}\n </button>\n `).join('');\n\n return `\n ${this.renderHeader({ title: t.step2.heading, showBack: true, step: STEP_NUMBER.intent })}\n <div class=\"mushi-body\">\n <div class=\"mushi-selected-category\">\n <span aria-hidden=\"true\">${CATEGORY_ICONS[cat]}</span>\n <span>${t.step1.categories[cat]}</span>\n </div>\n <div class=\"mushi-intents\">\n ${options}\n </div>\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.intent)}\n `;\n }\n\n private renderDetailsStep(): string {\n const t = this.locale;\n\n return `\n ${this.renderHeader({ title: t.step3.heading, showBack: true, step: STEP_NUMBER.details })}\n <div class=\"mushi-body\">\n <textarea\n class=\"mushi-textarea\"\n placeholder=\"${t.step3.descriptionPlaceholder}\"\n rows=\"4\"\n aria-label=\"${t.step3.heading}\"\n autofocus\n ></textarea>\n <div class=\"mushi-attachments\">\n <button type=\"button\" class=\"mushi-attach-btn${this.screenshotAttached ? ' active' : ''}\" data-action=\"screenshot\">\n \\uD83D\\uDCF8 ${this.screenshotAttached ? t.step3.screenshotAttached : t.step3.screenshotButton}\n </button>\n ${this.screenshotAttached && this.allowScreenshotRemove\n ? '<button type=\"button\" class=\"mushi-attach-btn danger\" data-action=\"remove-screenshot\">\\u2715 Remove screenshot</button>'\n : ''}\n <button type=\"button\" class=\"mushi-attach-btn${this.elementSelected ? ' active' : ''}\" data-action=\"element\">\n \\uD83C\\uDFAF ${this.elementSelected ? t.step3.elementSelected : t.step3.elementButton}\n </button>\n </div>\n <div class=\"mushi-error\" style=\"display:none\" role=\"alert\"></div>\n </div>\n <div class=\"mushi-footer\">\n <span class=\"mushi-footer-hint\" aria-hidden=\"true\">\\u2318 + ENTER \\u2192 send</span>\n <button type=\"button\" class=\"mushi-submit\" data-action=\"submit\"${this.submitting ? ' disabled' : ''}>\n <span>${this.submitting ? t.widget.submitting : t.widget.submit}</span>\n <span class=\"mushi-submit-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.details)}\n `;\n }\n\n /**\n * Editorial success state: 朱印-style red stamp ring with the kanji\n * 受 (\"received\") at its centre, the localised \"thank you\" string\n * in serif below, and a mono ledger receipt (\"REPORT · HH:MM:SS\").\n * The ring + label animations are defined in styles.ts so this stays\n * pure markup and `prefers-reduced-motion` flips them to the final\n * frame instantly.\n */\n private renderSuccessStep(): string {\n const t = this.locale;\n const stamp = this.submittedAt ?? new Date();\n const time = stamp.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false });\n\n return `\n ${this.renderHeader({ title: t.widget.title, eyebrow: 'Mushi \\u00B7 Receipt' })}\n <div class=\"mushi-body\">\n <div class=\"mushi-success\">\n <div class=\"mushi-success-stamp\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid meet\"><circle cx=\"50\" cy=\"50\" r=\"44\"/></svg>\n <span class=\"mushi-success-stamp-label\">\\u53D7</span>\n </div>\n <div class=\"mushi-success-headline\">${t.widget.submitted}</div>\n <div class=\"mushi-success-meta\">REPORT \\u00B7 ${time}</div>\n ${this.rewardsState ? this.renderSuccessRewards() : ''}\n ${this.config.betaMode?.enabled ? this.renderBetaSuccessFooter() : ''}\n </div>\n </div>\n `;\n }\n\n /**\n * Reciprocity footer on the success step: closes the feedback loop by\n * attributing where the report goes, sets a response expectation, and\n * reinforces the \"beta tester\" identity (Peak-End Rule — the last thing\n * the user sees shapes their entire impression of the interaction).\n */\n private renderBetaSuccessFooter(): string {\n const beta = this.config.betaMode!;\n const email = beta.contactEmail ? escapeHtml(beta.contactEmail) : null;\n const appName = escapeHtml(beta.appName ?? 'the team');\n return `\n <div class=\"mushi-beta-success-footer\" role=\"note\" aria-label=\"Beta feedback acknowledgement\">\n ${email\n ? `<div class=\"mushi-beta-success-line\">\\uD83D\\uDCEC Sent to ${email}</div>`\n : `<div class=\"mushi-beta-success-line\">\\uD83D\\uDCEC Sent to ${appName}</div>`\n }\n <div class=\"mushi-beta-success-line mushi-beta-success-dim\">We aim to review within 48h · thank you for helping build this</div>\n </div>\n `;\n }\n\n private tierColor(slug: string): string {\n const colors: Record<string, string> = {\n free: '#6b7280',\n explorer: '#3b82f6',\n contributor: '#8b5cf6',\n champion: '#f59e0b',\n };\n return colors[slug] ?? '#6c47ff';\n }\n\n /** Compact rewards nudge rendered at the bottom of the category-step body. */\n private renderRewardsNudge(): string {\n const { tier, nextTier, totalPoints, pointsForReport } = this.rewardsState!;\n const tierName = tier?.displayName ?? 'Free';\n const tierSlug = tier?.slug ?? 'free';\n const color = this.tierColor(tierSlug);\n\n let pct = 100;\n let nextLabel = '';\n if (nextTier) {\n const base = tier?.pointsThreshold ?? 0;\n const ceiling = nextTier.pointsThreshold;\n pct = ceiling > base ? Math.round(Math.min(1, (totalPoints - base) / (ceiling - base)) * 100) : 100;\n const remaining = Math.max(0, ceiling - totalPoints);\n nextLabel = `${remaining.toLocaleString()} pts to ${escapeHtml(nextTier.displayName)}`;\n }\n\n return `\n <div class=\"mushi-rewards-nudge\" aria-label=\"Rewards progress\">\n <div class=\"mushi-rewards-row\">\n <span class=\"mushi-tier-pip\" style=\"background:${color}\" aria-hidden=\"true\"></span>\n <span class=\"mushi-rewards-tier-name\">${escapeHtml(tierName)}</span>\n <span class=\"mushi-rewards-pts-count\">${totalPoints.toLocaleString()} pts</span>\n <span class=\"mushi-rewards-pts-earn\">+${pointsForReport} pts for a report</span>\n </div>\n ${nextTier ? `\n <div class=\"mushi-tier-bar-track\" role=\"progressbar\" aria-valuenow=\"${pct}\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-label=\"Progress to ${escapeHtml(nextTier.displayName)}\">\n <div class=\"mushi-tier-bar-fill\" style=\"width:${pct}%\"></div>\n </div>\n <div class=\"mushi-rewards-next-label\">${nextLabel}</div>\n ` : ''}\n </div>\n `;\n }\n\n /** Points earned + tier progress shown on the success step. */\n private renderSuccessRewards(): string {\n const { tier, nextTier, totalPoints, pointsForReport } = this.rewardsState!;\n const projected = totalPoints + pointsForReport;\n\n let pctAfter = 100;\n let nextLabel = '';\n if (nextTier) {\n const base = tier?.pointsThreshold ?? 0;\n const ceiling = nextTier.pointsThreshold;\n pctAfter = ceiling > base ? Math.round(Math.min(1, (projected - base) / (ceiling - base)) * 100) : 100;\n const remaining = Math.max(0, ceiling - projected);\n nextLabel = remaining > 0\n ? `${remaining.toLocaleString()} pts to ${escapeHtml(nextTier.displayName)}`\n : `\\uD83C\\uDF89 ${escapeHtml(nextTier.displayName)} reached!`;\n }\n\n return `\n <div class=\"mushi-success-rewards\">\n <div class=\"mushi-success-pts-award\">+${pointsForReport} pts</div>\n ${nextTier ? `\n <div class=\"mushi-tier-bar-track success-bar\" role=\"progressbar\" aria-valuenow=\"${pctAfter}\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-label=\"Progress to ${escapeHtml(nextTier.displayName)}\">\n <div class=\"mushi-tier-bar-fill\" style=\"width:${pctAfter}%\"></div>\n </div>\n <div class=\"mushi-rewards-next-label\">${nextLabel}</div>\n ` : ''}\n </div>\n `;\n }\n\n private attachHandlers(panel: HTMLElement): void {\n const t = this.locale;\n\n panel.querySelector('[data-action=\"close\"]')?.addEventListener('click', () => this.close());\n panel.querySelector('[data-action=\"back\"]')?.addEventListener('click', () => {\n if (this.step === 'intent') { this.step = 'category'; this.selectedCategory = null; }\n else if (this.step === 'details') { this.step = 'intent'; this.selectedIntent = null; }\n else if (this.step === 'reports') { this.step = 'category'; }\n else if (this.step === 'report-detail') { this.step = 'reports'; this.selectedReportId = null; }\n this.render();\n });\n\n panel.querySelector('[data-action=\"reports\"]')?.addEventListener('click', () => {\n void this.loadReporterReports();\n });\n\n panel.querySelectorAll('[data-report-id]').forEach((btn) => {\n btn.addEventListener('click', () => {\n const reportId = (btn as HTMLElement).dataset.reportId;\n if (reportId) void this.loadReporterComments(reportId);\n });\n });\n\n panel.querySelector('[data-action=\"reporter-reply\"]')?.addEventListener('click', () => {\n void this.submitReporterReply(panel);\n });\n\n panel.querySelectorAll('[data-category]').forEach((btn) => {\n btn.addEventListener('click', () => {\n this.selectedCategory = (btn as HTMLElement).dataset.category as MushiReportCategory;\n this.step = 'intent';\n this.render();\n });\n });\n\n panel.querySelectorAll('[data-intent]').forEach((btn) => {\n btn.addEventListener('click', () => {\n this.selectedIntent = (btn as HTMLElement).dataset.intent ?? null;\n this.step = 'details';\n this.render();\n });\n });\n\n panel.querySelector('[data-action=\"screenshot\"]')?.addEventListener('click', () => {\n this.callbacks.onScreenshotRequest();\n });\n panel.querySelector('[data-action=\"remove-screenshot\"]')?.addEventListener('click', () => {\n this.callbacks.onScreenshotRemove?.();\n });\n\n panel.querySelector('[data-action=\"element\"]')?.addEventListener('click', () => {\n this.callbacks.onElementSelectorRequest?.();\n });\n\n const submitReport = (): void => {\n const textarea = panel.querySelector('.mushi-textarea') as HTMLTextAreaElement | null;\n const description = textarea?.value?.trim() ?? '';\n const errorEl = panel.querySelector('.mushi-error') as HTMLElement | null;\n\n // V5.3 §2.1: increased from 5 to 20 to filter low-value \"doesn't work\"\n // submissions that the LLM cannot meaningfully classify. Empirically this\n // removed ~30% of unactionable reports without measurable drop in valid ones.\n const MIN_DESCRIPTION_LENGTH = 20;\n if (description.length < MIN_DESCRIPTION_LENGTH) {\n if (errorEl) {\n errorEl.textContent = `${t.widget.error} (${description.length}/${MIN_DESCRIPTION_LENGTH})`;\n errorEl.style.display = 'block';\n }\n return;\n }\n\n this.submitting = true;\n this.submittedAt = new Date();\n this.render();\n\n this.callbacks.onSubmit({\n category: this.selectedCategory!,\n description,\n intent: this.selectedIntent ?? undefined,\n });\n\n this.successTimer = setTimeout(() => {\n this.successTimer = null;\n this.submitting = false;\n this.step = 'success';\n this.render();\n this.autoCloseTimer = setTimeout(() => {\n this.autoCloseTimer = null;\n if (this.step === 'success') this.close();\n }, 2800);\n }, 500);\n };\n\n panel.querySelector('[data-action=\"submit\"]')?.addEventListener('click', submitReport);\n\n panel.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n this.close();\n return;\n }\n // Ctrl/Cmd+Enter submits from anywhere in the panel — primarily to\n // catch the textarea where Enter alone needs to insert a newline.\n // Only the details step has a submit action, so guard on that.\n if (this.step === 'details' && isSubmitShortcut(e)) {\n e.preventDefault();\n submitReport();\n }\n });\n }\n\n private trapFocus(panel: HTMLElement): void {\n requestAnimationFrame(() => {\n // Prefer the textarea on the details step so users can start typing\n // immediately without an extra Tab. Otherwise focus the first\n // interactive element so keyboard users can navigate the list.\n const textarea = panel.querySelector('textarea') as HTMLElement | null;\n if (textarea) {\n textarea.focus();\n return;\n }\n const focusable = panel.querySelectorAll('button, textarea, [tabindex]');\n if (focusable.length > 0) (focusable[0] as HTMLElement).focus();\n });\n }\n\n private unreadCount(): number {\n return this.reporterReports.reduce((sum, report) => sum + (report.unread_count ?? 0), 0);\n }\n\n private async loadReporterReports(): Promise<void> {\n this.step = 'reports';\n this.reporterLoading = true;\n this.reporterError = null;\n this.render();\n try {\n this.reporterReports = await this.callbacks.onReporterReportsRequest?.() ?? [];\n } catch (err) {\n this.reporterError = err instanceof Error ? err.message : 'Could not load reports.';\n } finally {\n this.reporterLoading = false;\n this.render();\n }\n }\n\n private async loadReporterComments(reportId: string): Promise<void> {\n this.selectedReportId = reportId;\n this.step = 'report-detail';\n this.reporterLoading = true;\n this.reporterError = null;\n this.render();\n try {\n this.reporterComments = await this.callbacks.onReporterCommentsRequest?.(reportId) ?? [];\n } catch (err) {\n this.reporterError = err instanceof Error ? err.message : 'Could not load thread.';\n } finally {\n this.reporterLoading = false;\n this.render();\n }\n }\n\n private async submitReporterReply(panel: HTMLElement): Promise<void> {\n const reportId = this.selectedReportId;\n const textarea = panel.querySelector('[data-role=\"reporter-reply\"]') as HTMLTextAreaElement | null;\n const replyButton = panel.querySelector('[data-action=\"reporter-reply\"]') as HTMLButtonElement | null;\n const body = textarea?.value.trim() ?? '';\n // Guard: reject empty bodies AND already-in-flight submits — both prevented\n // double-posts in dogfood when users mashed Enter on a slow link.\n if (!reportId || !body || this.reporterLoading) return;\n this.reporterLoading = true;\n if (replyButton) replyButton.disabled = true;\n this.render();\n try {\n await this.callbacks.onReporterReply?.(reportId, body);\n // Clear the field on success so the next render (driven by\n // loadReporterComments) doesn't repaint the just-sent text and tempt\n // the user into a duplicate submit.\n if (textarea) textarea.value = '';\n await this.loadReporterComments(reportId);\n } catch (err) {\n this.reporterError = err instanceof Error ? err.message : 'Could not send reply.';\n this.reporterLoading = false;\n this.render();\n }\n }\n}\n","// ============================================================\n// rewards.ts — Web SDK rewards subsystem\n//\n// Owns:\n// 1. Activity batcher: coalesces events into 5-min flushes\n// with IndexedDB backing for offline resilience.\n// 2. Auto-track listeners: route changes, [data-testid] clicks,\n// session dwell — piggybacks on installAutoBreadcrumbs infra.\n// 3. In-widget tier/points badge (shadow-DOM, themable).\n// 4. Consent surface (explicit mode).\n//\n// Wired by createInstance() only when config.rewards.enabled === true.\n// All state is keyed by projectId so multi-instance setups don't bleed.\n// ============================================================\n\nimport type { MushiApiClient, MushiRewardsConfig, MushiTierResult, MushiActivityEvent } from '@mushi-mushi/core';\n\nconst MIN_FLUSH_INTERVAL = 30_000;\nconst DEFAULT_FLUSH_INTERVAL = 300_000; // 5 min\nconst DWELL_SAMPLE_INTERVAL = 60_000; // emit session_minute every 60s\nconst MAX_SESSION_MINUTES_PER_DAY = 60;\nconst DAILY_RESET_KEY_PREFIX = 'mushi_session_min_day_';\n\n// ──────────────────────────────────────────────────────────────\n// Internal queue (in-memory; IndexedDB for offline persistence)\n// ──────────────────────────────────────────────────────────────\n\ninterface QueuedEvent extends MushiActivityEvent {\n queuedAt: number;\n}\n\nlet pendingEvents: QueuedEvent[] = [];\nlet flushTimer: ReturnType<typeof setInterval> | null = null;\nlet dwellTimer: ReturnType<typeof setInterval> | null = null;\nlet currentUserId: string | null = null;\nlet currentUserTraits: { email?: string; name?: string; provider?: string } | null = null;\nlet reporterTokenHash: string | null = null;\nlet apiClient: MushiApiClient | null = null;\nlet optedIn = false;\nlet tierCache: MushiTierResult | null = null;\nlet tierCacheTime = 0;\nconst TIER_CACHE_TTL = 5 * 60 * 1000; // 5 min\n\n// Track seen routes to avoid duplicate screen_view_unique_per_day\nconst seenRoutes = new Set<string>();\n\n// ──────────────────────────────────────────────────────────────\n// Consent helpers\n// ──────────────────────────────────────────────────────────────\n\nfunction getConsentKey(projectId: string): string {\n return `mushi_rewards_consent_${projectId}`;\n}\n\nfunction isConsentGranted(projectId: string): boolean {\n try {\n return localStorage.getItem(getConsentKey(projectId)) === '1';\n } catch {\n return false;\n }\n}\n\nfunction setConsentGranted(projectId: string, granted: boolean): void {\n try {\n if (granted) {\n localStorage.setItem(getConsentKey(projectId), '1');\n } else {\n localStorage.removeItem(getConsentKey(projectId));\n }\n optedIn = granted;\n apiClient?.submitActivity(currentUserId ?? '', [], { optedIn: granted }).catch(() => {});\n } catch { /* private browsing */ }\n}\n\n// ──────────────────────────────────────────────────────────────\n// Session-minute daily cap\n// ──────────────────────────────────────────────────────────────\n\nfunction getTodayKey(): string {\n return new Date().toISOString().slice(0, 10); // YYYY-MM-DD\n}\n\nfunction getSessionMinutesToday(projectId: string): number {\n try {\n const val = sessionStorage.getItem(`${DAILY_RESET_KEY_PREFIX}${projectId}_${getTodayKey()}`);\n return val ? parseInt(val, 10) : 0;\n } catch { return 0; }\n}\n\nfunction incrementSessionMinutes(projectId: string): number {\n const today = getTodayKey();\n const key = `${DAILY_RESET_KEY_PREFIX}${projectId}_${today}`;\n try {\n const next = (getSessionMinutesToday(projectId) + 1);\n sessionStorage.setItem(key, String(next));\n return next;\n } catch { return 99; }\n}\n\n// ──────────────────────────────────────────────────────────────\n// Public API\n// ──────────────────────────────────────────────────────────────\n\nexport interface RewardsContext {\n client: MushiApiClient;\n config: MushiRewardsConfig;\n projectId: string;\n userId: string;\n traits?: { email?: string; name?: string; provider?: string };\n reporterToken?: string;\n}\n\n/** Called by createInstance() when a user is identified and rewards are enabled. */\nexport function initRewards(ctx: RewardsContext): void {\n apiClient = ctx.client;\n currentUserId = ctx.userId;\n currentUserTraits = ctx.traits ?? null;\n reporterTokenHash = ctx.reporterToken ?? null;\n\n const { projectId } = ctx;\n const flushMs = Math.max(\n MIN_FLUSH_INTERVAL,\n ctx.config.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL,\n );\n\n // Resolve consent\n if (ctx.config.consentMode === 'auto') {\n optedIn = true;\n setConsentGranted(projectId, true);\n } else {\n optedIn = isConsentGranted(projectId);\n }\n\n // Install auto-track listeners when trackActivity is on\n if (ctx.config.trackActivity) {\n installActivityListeners(projectId);\n }\n\n // Start flush timer\n if (flushTimer) clearInterval(flushTimer);\n flushTimer = setInterval(() => flush(ctx), flushMs);\n\n // Dwell timer — emits session_minute every 60s (capped)\n if (dwellTimer) clearInterval(dwellTimer);\n dwellTimer = setInterval(() => {\n if (!optedIn || !currentUserId) return;\n const minutes = getSessionMinutesToday(projectId);\n if (minutes < MAX_SESSION_MINUTES_PER_DAY) {\n incrementSessionMinutes(projectId);\n enqueue({ action: 'session_minute', metadata: { minutes_today: minutes + 1 } });\n }\n }, DWELL_SAMPLE_INTERVAL);\n\n // Eager tier fetch for the widget badge\n if (ctx.config.showInWidget) {\n fetchAndCacheTier(currentUserId).then((tier) => {\n if (tier) renderTierBadge(tier, ctx.config);\n });\n }\n\n // Show consent surface if explicit mode and not yet granted\n if (ctx.config.consentMode !== 'auto' && !optedIn) {\n renderConsentBanner(projectId, ctx.config);\n }\n}\n\n/** Called by Mushi.identify() to update the current user context. */\nexport function updateRewardsUser(\n userId: string,\n traits?: { email?: string; name?: string; provider?: string },\n): void {\n currentUserId = userId;\n currentUserTraits = traits ?? null;\n // Invalidate tier cache on user change\n tierCache = null;\n tierCacheTime = 0;\n}\n\n/** Manually enqueue a host-defined activity event. */\nexport function enqueue(event: MushiActivityEvent): void {\n if (!optedIn || !currentUserId) return;\n pendingEvents.push({ ...event, queuedAt: Date.now() });\n}\n\n/** Force-flush the pending event queue. */\nexport async function flush(ctx: RewardsContext): Promise<void> {\n if (!optedIn || !currentUserId || pendingEvents.length === 0) return;\n\n // P2: attach host-app JWT if verifyUserToken callback is configured\n let hostJwt: string | null = null;\n if (ctx.config.verifyUserToken) {\n try {\n hostJwt = await ctx.config.verifyUserToken();\n } catch {\n // Non-fatal — activity still submits without JWT;\n // server will mark jwt_verified_at = null\n }\n }\n\n const batch = pendingEvents.splice(0, 100);\n try {\n await ctx.client.submitActivity(currentUserId, batch, {\n userTraits: currentUserTraits ?? undefined,\n reporterTokenHash: reporterTokenHash ?? undefined,\n optedIn: true,\n hostJwt: hostJwt ?? undefined,\n });\n } catch {\n // On failure, re-queue for next flush (simplified offline; full\n // IndexedDB queue is left for a follow-up to keep this file focussed)\n pendingEvents.unshift(...batch.slice(0, 50)); // cap re-queue at 50\n }\n}\n\nexport async function getTier(userId: string): Promise<MushiTierResult | null> {\n const now = Date.now();\n if (tierCache && now - tierCacheTime < TIER_CACHE_TTL) return tierCache;\n return fetchAndCacheTier(userId);\n}\n\nasync function fetchAndCacheTier(userId: string): Promise<MushiTierResult | null> {\n if (!apiClient) return null;\n const res = await apiClient.getMyTier(userId);\n if (res.ok && res.data) {\n tierCache = res.data as MushiTierResult;\n tierCacheTime = Date.now();\n return tierCache;\n }\n return null;\n}\n\nexport function teardown(): void {\n if (flushTimer) { clearInterval(flushTimer); flushTimer = null; }\n if (dwellTimer) { clearInterval(dwellTimer); dwellTimer = null; }\n removeActivityListeners();\n removeTierBadge();\n if (consentHost) { consentHost.remove(); consentHost = null; }\n pendingEvents = [];\n currentUserId = null;\n apiClient = null;\n optedIn = false;\n tierCache = null;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Auto-track listeners\n// ──────────────────────────────────────────────────────────────\n\nlet routeObserver: MutationObserver | null = null;\nlet clickHandler: ((e: MouseEvent) => void) | null = null;\nlet popstateHandler: (() => void) | null = null;\nlet origPushState: typeof history.pushState | null = null;\nlet lastRoute = '';\n\nfunction installActivityListeners(projectId: string): void {\n // Route: pushState + popstate\n const emitRoute = () => {\n const route = location.pathname;\n if (route === lastRoute) return;\n lastRoute = route;\n const isNewToday = !seenRoutes.has(`${projectId}:${route}`);\n if (isNewToday) {\n seenRoutes.add(`${projectId}:${route}`);\n enqueue({ action: 'screen_view_unique_per_day', metadata: { route } });\n }\n };\n\n origPushState = history.pushState.bind(history);\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPushState!(...args);\n emitRoute();\n };\n popstateHandler = emitRoute;\n window.addEventListener('popstate', emitRoute);\n emitRoute(); // record initial route\n\n // DOM mutation observer for SPA route changes that don't use pushState\n routeObserver = new MutationObserver(() => emitRoute());\n const main = document.querySelector('main') ?? document.body;\n routeObserver.observe(main, { childList: true, subtree: false });\n\n // Click: track [data-testid] interactions\n clickHandler = (e: MouseEvent) => {\n const target = (e.target as HTMLElement).closest('[data-testid]') as HTMLElement | null;\n if (!target) return;\n const testid = target.dataset.testid;\n if (!testid) return;\n enqueue({ action: 'element_selected', metadata: { testid, route: location.pathname } });\n };\n document.addEventListener('click', clickHandler, { capture: true, passive: true });\n}\n\nfunction removeActivityListeners(): void {\n // Restore original pushState before removing listeners\n if (origPushState) {\n history.pushState = origPushState;\n origPushState = null;\n }\n if (popstateHandler) {\n window.removeEventListener('popstate', popstateHandler);\n popstateHandler = null;\n }\n routeObserver?.disconnect();\n routeObserver = null;\n if (clickHandler) {\n document.removeEventListener('click', clickHandler, { capture: true });\n clickHandler = null;\n }\n}\n\n// ──────────────────────────────────────────────────────────────\n// Shadow-DOM tier badge\n// ──────────────────────────────────────────────────────────────\n\nlet badgeHost: HTMLElement | null = null;\n\nfunction renderTierBadge(tier: MushiTierResult, config: MushiRewardsConfig): void {\n if (!config.showInWidget) return;\n if (badgeHost) badgeHost.remove();\n\n badgeHost = document.createElement('div');\n badgeHost.id = 'mushi-tier-badge';\n Object.assign(badgeHost.style, {\n position: 'fixed',\n bottom: '56px', // above the widget button\n right: '16px',\n zIndex: '2147483645',\n fontFamily: 'system-ui, sans-serif',\n });\n\n const shadow = badgeHost.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n <style>\n :host { display: block; }\n .badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 999px;\n background: rgba(0,0,0,0.75);\n color: #fff;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n backdrop-filter: blur(6px);\n cursor: default;\n user-select: none;\n }\n .dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #6c47ff;\n flex-shrink: 0;\n }\n </style>\n <div class=\"badge\">\n <span class=\"dot\"></span>\n <span>${tier.displayName}</span>\n </div>\n `;\n\n document.body.appendChild(badgeHost);\n}\n\nfunction removeTierBadge(): void {\n badgeHost?.remove();\n badgeHost = null;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Consent banner (explicit mode)\n// ──────────────────────────────────────────────────────────────\n\nlet consentHost: HTMLElement | null = null;\n\nfunction renderConsentBanner(projectId: string, config: MushiRewardsConfig): void {\n if (consentHost) return; // already shown\n\n consentHost = document.createElement('div');\n consentHost.id = 'mushi-consent-banner';\n Object.assign(consentHost.style, {\n position: 'fixed',\n bottom: '80px',\n right: '16px',\n zIndex: '2147483646',\n maxWidth: '280px',\n fontFamily: 'system-ui, sans-serif',\n });\n\n const shadow = consentHost.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n <style>\n :host { display: block; }\n .banner {\n background: #fff;\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n box-shadow: 0 8px 24px rgba(0,0,0,0.12);\n padding: 14px 16px;\n font-size: 13px;\n line-height: 1.5;\n color: #374151;\n }\n .title { font-weight: 700; margin-bottom: 6px; color: #111827; }\n .actions { display: flex; gap: 8px; margin-top: 10px; }\n button {\n flex: 1;\n padding: 6px 10px;\n border-radius: 6px;\n border: none;\n cursor: pointer;\n font-size: 12px;\n font-weight: 600;\n }\n .accept { background: #6c47ff; color: #fff; }\n .decline { background: #f3f4f6; color: #374151; }\n </style>\n <div class=\"banner\">\n <div class=\"title\">🎯 Earn rewards</div>\n <div>Help improve this app and earn points, badges, and perks for your contributions.</div>\n <div class=\"actions\">\n <button class=\"accept\" id=\"accept\">Enable</button>\n <button class=\"decline\" id=\"decline\">No thanks</button>\n </div>\n </div>\n `;\n\n shadow.getElementById('accept')?.addEventListener('click', () => {\n setConsentGranted(projectId, true);\n consentHost?.remove();\n consentHost = null;\n if (config.showInWidget && currentUserId) {\n fetchAndCacheTier(currentUserId).then((tier) => {\n if (tier) renderTierBadge(tier, config);\n });\n }\n });\n\n shadow.getElementById('decline')?.addEventListener('click', () => {\n setConsentGranted(projectId, false);\n consentHost?.remove();\n consentHost = null;\n });\n\n document.body.appendChild(consentHost);\n}\n","import type { MushiConsoleEntry } from '@mushi-mushi/core';\n\nconst MAX_ENTRIES = 50;\nconst MAX_MESSAGE_LENGTH = 500;\n\nexport interface ConsoleCapture {\n getEntries(): MushiConsoleEntry[];\n clear(): void;\n destroy(): void;\n}\n\nexport function createConsoleCapture(): ConsoleCapture {\n const entries: MushiConsoleEntry[] = [];\n const originals: Partial<Record<string, (...args: unknown[]) => void>> = {};\n const levels: Array<MushiConsoleEntry['level']> = ['log', 'warn', 'error', 'info', 'debug'];\n\n for (const level of levels) {\n const original = console[level];\n originals[level] = original;\n\n console[level] = (...args: unknown[]) => {\n const message = args\n .map((arg) => {\n try {\n return typeof arg === 'string' ? arg : JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n })\n .join(' ')\n .slice(0, MAX_MESSAGE_LENGTH);\n\n const entry: MushiConsoleEntry = {\n level,\n message,\n timestamp: Date.now(),\n };\n\n if (level === 'error' && args[0] instanceof Error) {\n entry.stack = (args[0] as Error).stack?.slice(0, 1000);\n }\n\n entries.push(entry);\n if (entries.length > MAX_ENTRIES) {\n entries.shift();\n }\n\n original.call(console, ...args);\n };\n }\n\n return {\n getEntries() {\n return [...entries];\n },\n clear() {\n entries.length = 0;\n },\n destroy() {\n for (const level of levels) {\n if (originals[level]) {\n console[level] = originals[level] as typeof console.log;\n }\n }\n },\n };\n}\n","import {\n MUSHI_INTERNAL_HEADER,\n MUSHI_INTERNAL_INIT_MARKER,\n type MushiInternalRequestKind,\n type MushiUrlMatcher,\n} from '@mushi-mushi/core';\n\nexport interface InternalRequestOptions {\n apiEndpoint?: string;\n ignoreUrls?: MushiUrlMatcher[];\n}\n\nexport const DEFAULT_INTERNAL_URL_MATCHERS: MushiUrlMatcher[] = [\n /\\/v1\\/sdk(?:\\/|$)/,\n /\\/v1\\/reports(?:\\/|$)/,\n /\\/v1\\/notifications(?:\\/|$)/,\n /\\/v1\\/reputation(?:\\/|$)/,\n];\n\nexport function getRequestUrl(input: RequestInfo | URL): string {\n if (typeof input === 'string') return input;\n if (input instanceof URL) return input.href;\n return input.url;\n}\n\nexport function getInternalRequestKind(\n input: RequestInfo | URL,\n init?: RequestInit,\n): MushiInternalRequestKind | null {\n const marker = (init as (RequestInit & { [MUSHI_INTERNAL_INIT_MARKER]?: MushiInternalRequestKind }) | undefined)\n ?.[MUSHI_INTERNAL_INIT_MARKER];\n if (marker) return marker;\n\n const initHeader = readHeader(init?.headers, MUSHI_INTERNAL_HEADER);\n if (initHeader) return initHeader as MushiInternalRequestKind;\n\n if (typeof Request !== 'undefined' && input instanceof Request) {\n const requestHeader = input.headers.get(MUSHI_INTERNAL_HEADER);\n if (requestHeader) return requestHeader as MushiInternalRequestKind;\n }\n\n return null;\n}\n\nexport function shouldIgnoreMushiUrl(url: string, options: InternalRequestOptions = {}): boolean {\n const matchers = [...DEFAULT_INTERNAL_URL_MATCHERS, ...(options.ignoreUrls ?? [])];\n if (matchers.some((matcher) => matchesUrl(url, matcher))) return true;\n\n const endpoint = normalizeUrlPrefix(options.apiEndpoint);\n return endpoint ? normalizeComparableUrl(url).startsWith(endpoint) : false;\n}\n\nexport function matchesUrl(url: string, matcher: MushiUrlMatcher): boolean {\n if (typeof matcher === 'string') {\n return normalizeComparableUrl(url).includes(matcher);\n }\n matcher.lastIndex = 0;\n return matcher.test(url);\n}\n\nexport function normalizeUrlPrefix(url?: string): string | null {\n if (!url) return null;\n return normalizeComparableUrl(url).replace(/\\/+$/, '');\n}\n\nexport function isLocalhostEndpoint(url?: string): boolean {\n if (!url) return false;\n try {\n const parsed = new URL(url);\n return parsed.hostname === 'localhost'\n || parsed.hostname === '127.0.0.1'\n || parsed.hostname === '::1'\n || parsed.hostname.endsWith('.localhost');\n } catch {\n return /\\blocalhost\\b|127\\.0\\.0\\.1/.test(url);\n }\n}\n\nfunction normalizeComparableUrl(url: string): string {\n try {\n return new URL(url, typeof location !== 'undefined' ? location.href : 'http://localhost').href;\n } catch {\n return url;\n }\n}\n\nfunction readHeader(headers: HeadersInit | undefined, name: string): string | null {\n if (!headers) return null;\n if (typeof Headers !== 'undefined' && headers instanceof Headers) {\n return headers.get(name);\n }\n if (Array.isArray(headers)) {\n const found = headers.find(([key]) => key.toLowerCase() === name.toLowerCase());\n return found?.[1] ?? null;\n }\n const record = headers as Record<string, string>;\n return record[name] ?? record[name.toLowerCase()] ?? null;\n}\n","import type { MushiNetworkEntry, MushiUrlMatcher } from '@mushi-mushi/core';\nimport { getInternalRequestKind, getRequestUrl, shouldIgnoreMushiUrl } from '../internal-requests';\n\nconst MAX_ENTRIES = 30;\n\nexport interface NetworkCapture {\n getEntries(): MushiNetworkEntry[];\n clear(): void;\n updateOptions(options: NetworkCaptureOptions): void;\n destroy(): void;\n}\n\nexport interface NetworkCaptureOptions {\n apiEndpoint?: string;\n ignoreUrls?: MushiUrlMatcher[];\n}\n\nexport function createNetworkCapture(options: NetworkCaptureOptions = {}): NetworkCapture {\n const entries: MushiNetworkEntry[] = [];\n const originalFetch = globalThis.fetch;\n let activeOptions = options;\n\n globalThis.fetch = async function mushiFetchInterceptor(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const startTime = Date.now();\n const method = init?.method?.toUpperCase() ?? 'GET';\n const url = getRequestUrl(input);\n const internalKind = getInternalRequestKind(input, init);\n const shouldRecord = !internalKind && !shouldIgnoreMushiUrl(url, activeOptions);\n\n try {\n const response = await originalFetch.call(globalThis, input, init);\n\n if (shouldRecord) {\n addEntry({\n method,\n url: truncateUrl(url),\n status: response.status,\n duration: Date.now() - startTime,\n timestamp: startTime,\n });\n }\n\n return response;\n } catch (error) {\n if (shouldRecord) {\n addEntry({\n method,\n url: truncateUrl(url),\n status: 0,\n duration: Date.now() - startTime,\n timestamp: startTime,\n error: error instanceof Error ? error.message : 'Network error',\n });\n }\n throw error;\n }\n };\n\n function addEntry(entry: MushiNetworkEntry): void {\n entries.push(entry);\n if (entries.length > MAX_ENTRIES) {\n entries.shift();\n }\n }\n\n return {\n getEntries() {\n return [...entries];\n },\n clear() {\n entries.length = 0;\n },\n updateOptions(nextOptions) {\n activeOptions = nextOptions;\n },\n destroy() {\n globalThis.fetch = originalFetch;\n },\n };\n}\n\nfunction truncateUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const path = parsed.pathname + parsed.search;\n if (path.length > 200) {\n return parsed.origin + path.slice(0, 200) + '...';\n }\n return parsed.origin + path;\n } catch {\n return url.slice(0, 200);\n }\n}\n","import type { MushiPrivacyConfig } from '@mushi-mushi/core';\n\nexport interface ScreenshotCapture {\n take(): Promise<string | null>;\n updateOptions(options: ScreenshotCaptureOptions): void;\n}\n\nexport interface ScreenshotCaptureOptions {\n privacy?: MushiPrivacyConfig;\n}\n\nexport function createScreenshotCapture(options: ScreenshotCaptureOptions = {}): ScreenshotCapture {\n let activeOptions = options;\n\n async function take(): Promise<string | null> {\n try {\n if (typeof document === 'undefined') return null;\n\n // Prefer native getDisplayMedia if available (requires user gesture)\n // Fall back to simple canvas-based capture of visible viewport\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n const width = window.innerWidth;\n const height = window.innerHeight;\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n ctx.scale(dpr, dpr);\n\n // Capture via SVG foreignObject — works for most DOM content\n const safeDocument = buildPrivacySafeDocument(activeOptions.privacy);\n const svgData = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\">\n <foreignObject width=\"100%\" height=\"100%\">\n <div xmlns=\"http://www.w3.org/1999/xhtml\">\n ${new XMLSerializer().serializeToString(safeDocument)}\n </div>\n </foreignObject>\n </svg>\n `;\n\n const img = new Image();\n const blob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n\n return new Promise((resolve) => {\n img.onload = () => {\n ctx.drawImage(img, 0, 0, width, height);\n URL.revokeObjectURL(url);\n try {\n const dataUrl = canvas.toDataURL('image/jpeg', 0.7);\n resolve(dataUrl);\n } catch {\n resolve(null);\n }\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve(null);\n };\n img.src = url;\n });\n } catch {\n return null;\n }\n }\n\n return {\n take,\n updateOptions(nextOptions) {\n activeOptions = nextOptions;\n },\n };\n}\n\nfunction buildPrivacySafeDocument(privacy?: MushiPrivacyConfig): Element {\n const clone = document.documentElement.cloneNode(true) as Element;\n\n for (const selector of privacy?.blockSelectors ?? []) {\n for (const el of safeQueryAll(clone, selector)) {\n el.remove();\n }\n }\n\n for (const selector of privacy?.maskSelectors ?? []) {\n for (const el of safeQueryAll(clone, selector)) {\n maskElement(el as HTMLElement);\n }\n }\n\n return clone;\n}\n\nfunction safeQueryAll(root: Element, selector: string): Element[] {\n try {\n return Array.from(root.querySelectorAll(selector));\n } catch {\n return [];\n }\n}\n\nfunction maskElement(el: HTMLElement): void {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n el.value = '';\n el.setAttribute('value', '');\n el.setAttribute('placeholder', '••••');\n }\n el.textContent = el.children.length === 0 ? '••••' : el.textContent;\n el.setAttribute(\n 'style',\n `${el.getAttribute('style') ?? ''};background:#8f8f8f!important;color:transparent!important;text-shadow:none!important;`,\n );\n el.setAttribute('data-mushi-masked', 'true');\n}\n","import type { MushiPerformanceMetrics } from '@mushi-mushi/core';\n\nexport interface PerformanceCapture {\n getMetrics(): MushiPerformanceMetrics;\n destroy(): void;\n}\n\nexport function createPerformanceCapture(): PerformanceCapture {\n const metrics: MushiPerformanceMetrics = {};\n const observers: PerformanceObserver[] = [];\n\n if (typeof PerformanceObserver !== 'undefined') {\n try {\n const paintObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n metrics.fcp = entry.startTime;\n }\n }\n });\n paintObserver.observe({ type: 'paint', buffered: true });\n observers.push(paintObserver);\n } catch {\n // paint observer not supported\n }\n\n try {\n const lcpObserver = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n if (entries.length > 0) {\n metrics.lcp = entries[entries.length - 1]!.startTime;\n }\n });\n lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true });\n observers.push(lcpObserver);\n } catch {\n // LCP not supported\n }\n\n try {\n let clsValue = 0;\n const clsObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!(entry as PerformanceEntry & { hadRecentInput?: boolean }).hadRecentInput) {\n clsValue += (entry as PerformanceEntry & { value?: number }).value ?? 0;\n metrics.cls = clsValue;\n }\n }\n });\n clsObserver.observe({ type: 'layout-shift', buffered: true });\n observers.push(clsObserver);\n } catch {\n // CLS not supported\n }\n\n try {\n let longTaskCount = 0;\n const longTaskObserver = new PerformanceObserver((list) => {\n longTaskCount += list.getEntries().length;\n metrics.longTasks = longTaskCount;\n });\n longTaskObserver.observe({ type: 'longtask', buffered: true });\n observers.push(longTaskObserver);\n } catch {\n // longtask not supported\n }\n }\n\n // Navigation timing for TTFB\n if (typeof performance !== 'undefined' && performance.getEntriesByType) {\n try {\n const navEntries = performance.getEntriesByType('navigation') as PerformanceNavigationTiming[];\n if (navEntries.length > 0 && navEntries[0]) {\n metrics.ttfb = navEntries[0].responseStart - navEntries[0].requestStart;\n }\n } catch {\n // navigation timing not available\n }\n }\n\n return {\n getMetrics() {\n return { ...metrics };\n },\n destroy() {\n for (const obs of observers) {\n obs.disconnect();\n }\n observers.length = 0;\n },\n };\n}\n","import type { MushiSelectedElement } from '@mushi-mushi/core';\n\nexport interface ElementSelector {\n activate(): Promise<MushiSelectedElement | null>;\n deactivate(): void;\n isActive(): boolean;\n}\n\nexport function createElementSelector(): ElementSelector {\n let active = false;\n let overlay: HTMLDivElement | null = null;\n let resolvePromise: ((el: MushiSelectedElement | null) => void) | null = null;\n\n /**\n * Walk up the DOM until we find an ancestor with `data-testid`.\n *\n * Why ascending and not descending: testids in modern apps are placed\n * on the OUTER interactive container (\"BuyProButton\") rather than on\n * the deepest leaf the click event hit (the SVG inside the icon).\n * Walking up matches authoring intent.\n *\n * Bounded at 20 hops so a misbehaving page can't pin the SDK in a\n * pathological tree.\n */\n function findNearestTestid(el: Element | null): string | null {\n let cur: Element | null = el;\n let hops = 0;\n while (cur && hops < 20) {\n const tid = cur.getAttribute?.('data-testid');\n if (tid) return tid;\n cur = cur.parentElement;\n hops++;\n }\n return null;\n }\n\n function getXPath(el: Element): string {\n const parts: string[] = [];\n let current: Element | null = el;\n while (current && current !== document.body) {\n let index = 1;\n let sibling: Element | null = current.previousElementSibling;\n while (sibling) {\n if (sibling.tagName === current.tagName) index++;\n sibling = sibling.previousElementSibling;\n }\n const tag = current.tagName.toLowerCase();\n parts.unshift(index > 1 ? `${tag}[${index}]` : tag);\n current = current.parentElement;\n }\n return '//' + parts.join('/');\n }\n\n function captureElement(el: Element): MushiSelectedElement {\n const rect = el.getBoundingClientRect();\n return {\n tagName: el.tagName.toLowerCase(),\n id: el.id || undefined,\n className: el.className || undefined,\n textContent: el.textContent?.trim().slice(0, 200) || undefined,\n xpath: getXPath(el),\n rect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n // v2 (whitepaper §4.7): the closest ancestor's `data-testid` lets the\n // server map this report → an Action node in the inventory graph\n // without a fuzzy NLP guess. We walk to the body so a deeply nested\n // span inside a button-with-testid still resolves correctly.\n nearestTestid: findNearestTestid(el) || undefined,\n route: typeof window !== 'undefined' ? window.location.pathname : undefined,\n };\n }\n\n function createOverlay(): HTMLDivElement {\n const el = document.createElement('div');\n el.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 2147483647;\n border: 2px solid #6366f1;\n background: rgba(99, 102, 241, 0.1);\n border-radius: 4px;\n transition: all 0.1s ease;\n display: none;\n `;\n document.body.appendChild(el);\n return el;\n }\n\n function positionOverlay(target: Element) {\n if (!overlay) return;\n const rect = target.getBoundingClientRect();\n overlay.style.left = `${rect.left}px`;\n overlay.style.top = `${rect.top}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n overlay.style.display = 'block';\n }\n\n function handleMouseMove(e: MouseEvent) {\n const target = e.target as Element;\n if (target === overlay) return;\n positionOverlay(target);\n }\n\n function handleClick(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n const target = e.target as Element;\n if (target === overlay) return;\n const captured = captureElement(target);\n finish(captured);\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n finish(null);\n }\n }\n\n function finish(result: MushiSelectedElement | null) {\n deactivate();\n resolvePromise?.(result);\n resolvePromise = null;\n }\n\n function activate(): Promise<MushiSelectedElement | null> {\n if (active) deactivate();\n\n return new Promise((resolve) => {\n resolvePromise = resolve;\n active = true;\n overlay = createOverlay();\n document.body.style.cursor = 'crosshair';\n\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('click', handleClick, true);\n document.addEventListener('keydown', handleKeyDown, true);\n });\n }\n\n function deactivate() {\n if (!active) return;\n active = false;\n document.body.style.cursor = '';\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('keydown', handleKeyDown, true);\n\n if (overlay) {\n overlay.remove();\n overlay = null;\n }\n }\n\n return { activate, deactivate, isActive: () => active };\n}\n","import type { MushiConsoleEntry, MushiNetworkEntry, MushiTimelineEntry } from '@mushi-mushi/core';\n\nconst MAX_TIMELINE_ENTRIES = 120;\n\nexport interface TimelineCapture {\n setScreen(screen: { name: string; route?: string; feature?: string }): void;\n getEntries(input?: {\n consoleLogs?: MushiConsoleEntry[] | null;\n networkLogs?: MushiNetworkEntry[] | null;\n }): MushiTimelineEntry[];\n clear(): void;\n destroy(): void;\n}\n\nexport function createTimelineCapture(): TimelineCapture {\n const entries: MushiTimelineEntry[] = [];\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n const handlePopState = () => recordRoute('popstate');\n const handleHashChange = () => recordRoute('hashchange');\n\n recordRoute('initial');\n\n function record(entry: MushiTimelineEntry): void {\n entries.push(entry);\n if (entries.length > MAX_TIMELINE_ENTRIES) entries.shift();\n }\n\n function recordRoute(source: string): void {\n if (typeof location === 'undefined') return;\n record({\n ts: Date.now(),\n kind: 'route',\n payload: {\n source,\n route: `${location.pathname}${location.search}${location.hash}`,\n href: location.href,\n },\n });\n }\n\n function handleClick(event: MouseEvent): void {\n const target = event.target instanceof Element ? event.target : null;\n if (!target) return;\n const el = target.closest('button,a,[role=\"button\"],input,textarea,select,[data-mushi-track]') ?? target;\n record({\n ts: Date.now(),\n kind: 'click',\n payload: {\n tag: el.tagName.toLowerCase(),\n id: (el as HTMLElement).id || undefined,\n text: textSnippet(el),\n },\n });\n }\n\n history.pushState = function mushiPushState(this: History, ...args) {\n const result = originalPushState.apply(this, args);\n recordRoute('pushState');\n return result;\n } as typeof history.pushState;\n\n history.replaceState = function mushiReplaceState(this: History, ...args) {\n const result = originalReplaceState.apply(this, args);\n recordRoute('replaceState');\n return result;\n } as typeof history.replaceState;\n\n window.addEventListener('popstate', handlePopState);\n window.addEventListener('hashchange', handleHashChange);\n document.addEventListener('click', handleClick, true);\n\n return {\n setScreen(screen) {\n record({\n ts: Date.now(),\n kind: 'screen',\n payload: screen,\n });\n },\n getEntries(input = {}) {\n const merged = [\n ...entries,\n ...(input.consoleLogs ?? []).map((log): MushiTimelineEntry => ({\n ts: log.timestamp,\n kind: 'log',\n payload: {\n level: log.level,\n message: log.message,\n },\n })),\n ...(input.networkLogs ?? []).map((network): MushiTimelineEntry => ({\n ts: network.timestamp,\n kind: 'request',\n payload: {\n method: network.method,\n url: network.url,\n status: network.status,\n duration: network.duration,\n error: network.error,\n },\n })),\n ].sort((a, b) => a.ts - b.ts);\n return merged.slice(-MAX_TIMELINE_ENTRIES);\n },\n clear() {\n entries.length = 0;\n },\n destroy() {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n window.removeEventListener('popstate', handlePopState);\n window.removeEventListener('hashchange', handleHashChange);\n document.removeEventListener('click', handleClick, true);\n },\n };\n}\n\nfunction textSnippet(el: Element): string | undefined {\n const text = (el.textContent ?? '').replace(/\\s+/g, ' ').trim();\n return text ? text.slice(0, 80) : undefined;\n}\n","/**\n * Mushi Mushi v2.1 — passive inventory discovery (whitepaper §6 hybrid mode).\n *\n * What this captures\n * ──────────────────\n * - location.pathname, normalized to a route TEMPLATE (e.g.\n * /practice/abc-123 → /practice/[id]) using either an explicit list\n * of templates from the host framework's route config OR a small\n * heuristic that collapses uuid / numeric / 24-char-hex segments.\n * - document.title\n * - all `[data-testid]` values currently in the DOM\n * - the most recent N fetch/XHR paths captured by the existing\n * network capturer (we do NOT instrument fetch ourselves — we\n * borrow its observations to keep responsibility in one place)\n * - a ≤200-char DOM summary built from <h1> / <title> / <main>\n * - sanitized query-param keys (keys only, never values)\n * - a SHA-256 of (userId || sessionId) so the server can count\n * distinct users without storing identity\n *\n * What this does NOT capture\n * ──────────────────────────\n * - any other DOM content\n * - query-param VALUES, fragments, or hashes (only key names)\n * - cookies, localStorage, sessionStorage\n * - input values, focused elements, or scroll positions\n * - the user's IP or any device fingerprint (the server already\n * redacts what it gets, but we never send any)\n *\n * Throttling\n * ──────────\n * At most one emission per (route, throttleMs) window. Default 60s.\n * This keeps the ingest volume on a high-traffic SPA bounded — even\n * a customer with a million PVs/day generates at most ~1.4M rows.\n */\n\nimport type { MushiDiscoverInventoryConfig } from '@mushi-mushi/core';\n\nexport interface DiscoveryEvent {\n route: string;\n page_title: string | null;\n dom_summary: string | null;\n testids: string[];\n network_paths: string[];\n query_param_keys: string[];\n user_id_hash: string | null;\n observed_at: string;\n}\n\nexport interface DiscoveryCaptureOptions {\n config: MushiDiscoverInventoryConfig;\n /** Returns the recent fetch/XHR paths from the network capturer. */\n getRecentNetworkPaths: () => string[];\n /** Returns the current user identifier (or null) for hash input. */\n getUserId: () => string | null;\n /** Stable session id for dedup when no userId is set. */\n getSessionId: () => string;\n /** Called when a new discovery event is ready to ship. */\n onEvent: (e: DiscoveryEvent) => void;\n}\n\nexport interface DiscoveryCapture {\n destroy: () => void;\n /** Emit immediately for the current pathname. Used on init. */\n flushNow: () => void;\n}\n\nconst DEFAULT_THROTTLE_MS = 60_000;\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst HEX24_RE = /^[0-9a-f]{20,}$/i;\nconst NUMERIC_RE = /^\\d+$/;\nconst SLUG_HASHY_RE = /^[a-z0-9]{16,}$/i;\n\n/**\n * Collapse a single path segment to a template placeholder when it\n * looks like an opaque identifier. We are deliberately conservative\n * — if a heuristic isn't confident, we leave the segment alone, since\n * over-collapsing is worse than under-collapsing for the proposer.\n */\nexport function normalizeSegment(seg: string): string {\n if (seg.length === 0) return seg;\n if (UUID_RE.test(seg)) return '[id]';\n if (HEX24_RE.test(seg)) return '[id]';\n if (NUMERIC_RE.test(seg)) return '[id]';\n // Heuristic: a single segment of 16+ alphanumeric chars with at least\n // one digit is almost certainly an id, not a slug. (`thai-language` →\n // keep; `sku_abc12345xyz` → collapse.)\n if (SLUG_HASHY_RE.test(seg) && /\\d/.test(seg)) return '[id]';\n return seg;\n}\n\n/**\n * Normalize a pathname to a route template, preferring an exact-match\n * against `routeTemplates` if the host has provided them.\n *\n * /practice/abc-123 + ['/practice/[id]'] → '/practice/[id]'\n * /practice/01H8H8… without templates → '/practice/[id]'\n * /tags/thai-language without templates → '/tags/thai-language'\n */\nexport function normalizeRoute(\n pathname: string,\n templates: string[] | undefined,\n): string {\n // Strip trailing slash so /a and /a/ look the same to the proposer.\n const clean = pathname.length > 1 && pathname.endsWith('/')\n ? pathname.slice(0, -1)\n : pathname;\n if (templates?.length) {\n const matched = matchTemplate(clean, templates);\n if (matched) return matched;\n }\n return '/' + clean\n .split('/')\n .filter((s) => s.length > 0)\n .map(normalizeSegment)\n .join('/');\n}\n\n/**\n * Walk the host's static route templates and pick the one whose shape\n * matches the live pathname. `[id]`-style placeholders match any\n * single segment.\n */\nfunction matchTemplate(pathname: string, templates: string[]): string | null {\n const segs = pathname.split('/').filter((s) => s.length > 0);\n // Sort longer-first so /a/b/[c] beats /a/b on a 3-segment URL.\n const sorted = [...templates].sort(\n (a, b) => b.split('/').length - a.split('/').length,\n );\n for (const tpl of sorted) {\n const tplSegs = tpl.split('/').filter((s) => s.length > 0);\n if (tplSegs.length !== segs.length) continue;\n let ok = true;\n for (let i = 0; i < tplSegs.length; i++) {\n const t = tplSegs[i]!;\n const s = segs[i]!;\n if (t.startsWith('[') && t.endsWith(']')) continue;\n if (t.startsWith(':')) continue;\n if (t === s) continue;\n ok = false;\n break;\n }\n if (ok) return '/' + tplSegs.join('/');\n }\n return null;\n}\n\nfunction readTestids(): string[] {\n if (typeof document === 'undefined') return [];\n const out = new Set<string>();\n const els = document.querySelectorAll('[data-testid]');\n for (const el of Array.from(els)) {\n const v = el.getAttribute('data-testid');\n if (v && v.length > 0 && v.length < 120) out.add(v);\n }\n return Array.from(out).sort();\n}\n\nfunction readQueryParamKeys(): string[] {\n if (typeof window === 'undefined') return [];\n try {\n const params = new URLSearchParams(window.location.search);\n const out = new Set<string>();\n params.forEach((_, key) => out.add(key));\n return Array.from(out).sort();\n } catch {\n return [];\n }\n}\n\n/**\n * Build a ≤200-char summary from the document's most prominent text.\n * We try `<h1>` first (most apps put the page heading there), fall\n * back to `<title>`, then `<main>`'s first paragraph, then null.\n */\nfunction readDomSummary(): string | null {\n if (typeof document === 'undefined') return null;\n const trim = (s: string | null | undefined) =>\n (s ?? '').replace(/\\s+/g, ' ').trim().slice(0, 200);\n const h1 = trim(document.querySelector('h1')?.textContent);\n if (h1) return h1;\n const title = trim(document.title);\n if (title) return title;\n const main = trim(document.querySelector('main')?.textContent);\n return main || null;\n}\n\n/**\n * SHA-256 (lowercase hex) of `userId || sessionId`, using the platform\n * SubtleCrypto. Falls back to `null` if crypto.subtle isn't available\n * (rare; means we won't dedupe distinct users on this client). Never\n * throws.\n */\nasync function hashUserId(input: string | null): Promise<string | null> {\n if (!input || typeof crypto === 'undefined' || !crypto.subtle) return null;\n try {\n const data = new TextEncoder().encode(input);\n const buf = await crypto.subtle.digest('SHA-256', data);\n const bytes = new Uint8Array(buf);\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i]!.toString(16).padStart(2, '0');\n }\n return hex;\n } catch {\n return null;\n }\n}\n\n/**\n * Stand up the discovery capturer. Returns a disposer.\n *\n * Implementation notes\n * ────────────────────\n * - We hook `pushState` / `replaceState` because `popstate` alone misses\n * SPA navigations triggered by frameworks calling `history.pushState`\n * directly (Next.js / React Router both do this).\n * - The first emission fires after a 100ms delay so the host app has\n * a chance to settle the new DOM before we read testids.\n * - Hash-only changes (`#section`) are intentionally ignored; they're\n * not real navigations as far as the inventory is concerned.\n */\nexport function createDiscoveryCapture(opts: DiscoveryCaptureOptions): DiscoveryCapture {\n const {\n config,\n getRecentNetworkPaths,\n getUserId,\n getSessionId,\n onEvent,\n } = opts;\n\n const throttleMs = config.throttleMs ?? DEFAULT_THROTTLE_MS;\n const captureSummary = config.captureDomSummary !== false;\n const userIdSource = config.userIdSource ?? 'auto';\n\n const lastEmittedAt = new Map<string, number>();\n let lastPath: string | null = null;\n let pendingTimer: ReturnType<typeof setTimeout> | null = null;\n\n async function emitForCurrent() {\n if (typeof window === 'undefined') return;\n const route = normalizeRoute(window.location.pathname, config.routeTemplates);\n const now = Date.now();\n const last = lastEmittedAt.get(route) ?? 0;\n if (now - last < throttleMs) return;\n lastEmittedAt.set(route, now);\n\n let userIdInput: string | null = null;\n if (userIdSource === 'auto') {\n userIdInput = getUserId() ?? getSessionId();\n } else if (userIdSource === 'session-only') {\n userIdInput = getSessionId();\n }\n\n const event: DiscoveryEvent = {\n route,\n page_title: typeof document !== 'undefined'\n ? (document.title || '').slice(0, 300) || null\n : null,\n dom_summary: captureSummary ? readDomSummary() : null,\n testids: readTestids(),\n network_paths: getRecentNetworkPaths().slice(-50),\n query_param_keys: readQueryParamKeys(),\n user_id_hash: await hashUserId(userIdInput),\n observed_at: new Date().toISOString(),\n };\n onEvent(event);\n }\n\n function scheduleEmit() {\n if (pendingTimer) return;\n pendingTimer = setTimeout(() => {\n pendingTimer = null;\n void emitForCurrent();\n }, 100);\n }\n\n function onMaybeNavigation() {\n if (typeof window === 'undefined') return;\n const path = window.location.pathname + window.location.search;\n if (path === lastPath) return;\n lastPath = path;\n scheduleEmit();\n }\n\n if (typeof window === 'undefined') {\n return {\n destroy: () => undefined,\n flushNow: () => undefined,\n };\n }\n\n // Patch history.pushState / replaceState.\n const originalPush = window.history.pushState.bind(window.history);\n const originalReplace = window.history.replaceState.bind(window.history);\n const patchedPush: typeof window.history.pushState = function patched(\n ...args\n ) {\n const out = originalPush(...args);\n onMaybeNavigation();\n return out;\n };\n const patchedReplace: typeof window.history.replaceState = function patched(\n ...args\n ) {\n const out = originalReplace(...args);\n onMaybeNavigation();\n return out;\n };\n window.history.pushState = patchedPush;\n window.history.replaceState = patchedReplace;\n\n const onPop = () => onMaybeNavigation();\n window.addEventListener('popstate', onPop);\n\n // Initial emission for the landing page.\n scheduleEmit();\n\n return {\n destroy() {\n window.removeEventListener('popstate', onPop);\n // Best-effort restoration; if another piece of code patched it\n // after us, leave it alone.\n if (window.history.pushState === patchedPush) {\n window.history.pushState = originalPush;\n }\n if (window.history.replaceState === patchedReplace) {\n window.history.replaceState = originalReplace;\n }\n if (pendingTimer) {\n clearTimeout(pendingTimer);\n pendingTimer = null;\n }\n lastEmittedAt.clear();\n },\n flushNow() {\n // Bypass throttle on explicit flush.\n lastEmittedAt.clear();\n void emitForCurrent();\n },\n };\n}\n\n// Pure exports for the unit tests.\nexport const __test = { matchTemplate };\n","import type { MushiSentryConfig, MushiSentryContext } from '@mushi-mushi/core';\n\n/**\n * Sentry integration — boosted 2026-05-07.\n *\n * Goal: when a host has Sentry installed (v7, v8, or v9), every Mushi\n * report carries enough trace data for the admin to pivot directly into\n * Sentry's MCP / web UI without the user manually pasting links.\n *\n * Detection strategy:\n * 1. v8/v9 expose `Sentry.lastEventId()`, `Sentry.getCurrentScope()`,\n * `Sentry.getReplay()`, `Sentry.getActiveSpan()`. The global lives\n * under `window.Sentry`; the SDK wraps internals in\n * `__SENTRY__.version === '8'` or `'9'`.\n * 2. v7 exposes `Sentry.getCurrentHub()` and writes hub state under\n * `window.__SENTRY__.hub`.\n * 3. Replay can also be on `window.__SENTRY_REPLAY__` for sites that\n * attach the replay integration manually.\n *\n * Every probe is wrapped in a `try/catch` because Sentry's APIs change\n * between point releases — a v8.13.0 method can throw \"not a function\"\n * on v8.0.0. We accept partial captures by design; the goal is \"as much\n * context as we can get\" rather than \"all or nothing\".\n */\nexport type { MushiSentryContext as SentryContext };\n\n// ---- Detection layer --------------------------------------------------------\n\ninterface SentryV8Like {\n lastEventId?: () => string | undefined;\n getCurrentScope?: () => SentryScopeLike | undefined;\n getActiveSpan?: () => SentrySpanLike | undefined;\n getRootSpan?: (span: SentrySpanLike) => SentrySpanLike | undefined;\n getReplay?: () => SentryReplayLike | undefined;\n getClient?: () => SentryClientLike | undefined;\n setTag?: (key: string, value: string | number | boolean) => void;\n setContext?: (name: string, ctx: Record<string, unknown> | null) => void;\n addBreadcrumb?: (crumb: Record<string, unknown>) => void;\n}\n\ninterface SentryV7Like {\n getCurrentHub?: () => SentryHubLike | undefined;\n setTag?: (key: string, value: string | number | boolean) => void;\n setContext?: (name: string, ctx: Record<string, unknown> | null) => void;\n addBreadcrumb?: (crumb: Record<string, unknown>) => void;\n}\n\ninterface SentryHubLike {\n getClient?: () => SentryClientLike | undefined;\n getScope?: () => SentryScopeLike | undefined;\n configureScope?: (cb: (scope: SentryScopeLike) => void) => void;\n}\n\ninterface SentryScopeLike {\n getLastEventId?: () => string | undefined;\n getUser?: () => Record<string, unknown> | undefined;\n getTags?: () => Record<string, string | number | boolean> | undefined;\n getTransactionName?: () => string | undefined;\n getTransaction?: () => { name?: string } | undefined;\n getSpan?: () => SentrySpanLike | undefined;\n getSession?: () => { sid?: string } | undefined;\n getBreadcrumbs?: () => Record<string, unknown>[] | undefined;\n setTag?: (key: string, value: string | number | boolean) => void;\n setContext?: (name: string, ctx: Record<string, unknown> | null) => void;\n // Internal API: most Sentry SDK versions expose breadcrumbs at\n // `_breadcrumbs` even when there's no public getter for it. We use\n // it as a last-resort fallback inside a try/catch.\n _breadcrumbs?: Record<string, unknown>[];\n}\n\ninterface SentrySpanLike {\n spanContext?: () => { traceId?: string; spanId?: string };\n // v7 stored these directly on the span object.\n traceId?: string;\n spanId?: string;\n}\n\ninterface SentryReplayLike {\n getReplayId?: () => string | undefined;\n}\n\ninterface SentryClientLike {\n getOptions?: () => { release?: string; environment?: string; dsn?: string } | undefined;\n getDsn?: () => { projectId?: string; host?: string; publicKey?: string } | undefined;\n}\n\nfunction getSentryGlobal(): SentryV8Like | SentryV7Like | undefined {\n try {\n const w = globalThis as Record<string, unknown>;\n if (w.Sentry) return w.Sentry as SentryV8Like | SentryV7Like;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getSentryReplayGlobal(): SentryReplayLike | undefined {\n try {\n const w = globalThis as Record<string, unknown>;\n return w.__SENTRY_REPLAY__ as SentryReplayLike | undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction detectSentrySdkFamily(): MushiSentryContext['sdk'] {\n try {\n const w = globalThis as Record<string, unknown>;\n const meta = w.__SENTRY__ as { version?: string } | undefined;\n const sentry = w.Sentry as Record<string, unknown> | undefined;\n if (meta?.version === '9' || (sentry && typeof sentry.lastEventId === 'function')) {\n // v9 dropped `getCurrentHub` entirely; presence of `lastEventId`\n // as a top-level fn distinguishes v8/v9 from v7.\n return meta?.version === '9' ? 'v9' : 'v8';\n }\n if (meta?.version === '8') return 'v8';\n if (sentry && typeof (sentry as SentryV7Like).getCurrentHub === 'function') return 'v7';\n return 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\n// ---- Public surface ---------------------------------------------------------\n\n/**\n * Snapshot the current Sentry scope. `_config` is reserved for future\n * `useReplay`/`enrichWithSeer` toggles — for now every host that has\n * Sentry available gets the full snapshot.\n *\n * `breadcrumbsLimit` defaults to 30 (Sentry's own default `maxBreadcrumbs`).\n * Callers can pass a smaller value when ingest payload size matters\n * (mobile clients on lossy networks, etc.).\n */\nexport function captureSentryContext(\n _config: MushiSentryConfig,\n options: { breadcrumbsLimit?: number } = {},\n): MushiSentryContext {\n const limit = Math.max(0, options.breadcrumbsLimit ?? 30);\n const out: MushiSentryContext = {};\n const sentry = getSentryGlobal();\n if (!sentry) return out;\n out.sdk = detectSentrySdkFamily();\n\n // 1) eventId — Sentry v8/v9 exposes a top-level `lastEventId()`. v7\n // pulls it off the active scope.\n try {\n const v8 = sentry as SentryV8Like;\n if (typeof v8.lastEventId === 'function') {\n out.eventId = v8.lastEventId() ?? undefined;\n } else {\n const v7 = sentry as SentryV7Like;\n const scope = v7.getCurrentHub?.()?.getScope?.();\n out.eventId = scope?.getLastEventId?.() ?? undefined;\n }\n } catch {\n // Swallow — different Sentry versions throw \"not a function\" on\n // arbitrary internals between point releases.\n }\n\n // 2) Scope — user / tags / transaction / breadcrumbs / session.\n let scope: SentryScopeLike | undefined;\n try {\n const v8 = sentry as SentryV8Like;\n if (typeof v8.getCurrentScope === 'function') {\n scope = v8.getCurrentScope();\n } else {\n const v7 = sentry as SentryV7Like;\n scope = v7.getCurrentHub?.()?.getScope?.();\n }\n } catch {\n // Sentry not available\n }\n if (scope) {\n try {\n const user = scope.getUser?.();\n if (user) {\n out.user = {\n id: typeof user.id === 'string' ? user.id : undefined,\n email: typeof user.email === 'string' ? user.email : undefined,\n username: typeof user.username === 'string' ? user.username : undefined,\n ip_address: typeof user.ip_address === 'string' ? user.ip_address : undefined,\n };\n }\n } catch {\n // Swallow — Sentry's scope methods change shape across releases.\n }\n try {\n const tags = scope.getTags?.();\n if (tags && typeof tags === 'object') {\n // Filter to scalar values — `setTag` accepts arrays in some\n // Sentry versions but our schema is scalar-only and the LLM\n // grounding relies on `key=string` shapes anyway.\n const pruned: Record<string, string | number | boolean> = {};\n for (const [k, v] of Object.entries(tags)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n pruned[k] = v;\n }\n }\n if (Object.keys(pruned).length > 0) out.tags = pruned;\n }\n } catch {\n // Swallow.\n }\n try {\n // v8 uses `getTransactionName`; v7 used `getTransaction()?.name`.\n out.transactionName =\n scope.getTransactionName?.() ?? scope.getTransaction?.()?.name ?? undefined;\n } catch {\n // Swallow.\n }\n try {\n out.sessionId = scope.getSession?.()?.sid ?? undefined;\n } catch {\n // Swallow.\n }\n try {\n // Public getter when present, fall back to the internal `_breadcrumbs`\n // array which has lived at the same path since Sentry 5.\n const raw = scope.getBreadcrumbs?.() ?? scope._breadcrumbs ?? [];\n if (Array.isArray(raw) && raw.length > 0) {\n const sliced = raw.slice(-limit);\n out.breadcrumbs = sliced.map((b) => {\n const r = b as Record<string, unknown>;\n return {\n timestamp:\n typeof r.timestamp === 'number'\n ? // Sentry stores breadcrumb timestamps in seconds; convert\n // to ms so the field is comparable to Mushi's own.\n r.timestamp < 1e12\n ? Math.round(r.timestamp * 1000)\n : r.timestamp\n : undefined,\n category: typeof r.category === 'string' ? r.category : undefined,\n level: typeof r.level === 'string' ? r.level : undefined,\n message: typeof r.message === 'string' ? r.message : undefined,\n type: typeof r.type === 'string' ? r.type : undefined,\n data:\n r.data && typeof r.data === 'object'\n ? (r.data as Record<string, unknown>)\n : undefined,\n };\n });\n }\n } catch {\n // Swallow.\n }\n }\n\n // 3) Trace — ask Sentry for the active span and read its trace/span ids.\n try {\n const v8 = sentry as SentryV8Like;\n let span: SentrySpanLike | undefined;\n if (typeof v8.getActiveSpan === 'function') {\n span = v8.getActiveSpan();\n } else if (scope?.getSpan) {\n span = scope.getSpan();\n }\n if (span) {\n const ctx = span.spanContext?.();\n out.traceId = ctx?.traceId ?? span.traceId ?? undefined;\n out.spanId = ctx?.spanId ?? span.spanId ?? undefined;\n }\n } catch {\n // Swallow — `getActiveSpan` errored on v8.0.0 - v8.5.0 when no\n // tracing integration was configured. Reading is best-effort.\n }\n\n // 4) Client options — release + environment + DSN-derived issue url.\n let client: SentryClientLike | undefined;\n try {\n const v8 = sentry as SentryV8Like;\n if (typeof v8.getClient === 'function') {\n client = v8.getClient();\n } else {\n const v7 = sentry as SentryV7Like;\n client = v7.getCurrentHub?.()?.getClient?.();\n }\n } catch {\n // Swallow.\n }\n if (client) {\n try {\n const opts = client.getOptions?.();\n if (opts?.release) out.release = opts.release;\n if (opts?.environment) out.environment = opts.environment;\n } catch {\n // Swallow.\n }\n try {\n // DSN parts — used to synthesize a deeplink to the issue.\n const dsn = client.getDsn?.();\n if (dsn?.host && dsn?.projectId && out.eventId) {\n // The org slug is not directly exposed by Sentry's DSN object;\n // we synthesize the canonical events URL which Sentry redirects\n // to the right issue. Falls back to undefined when we can't\n // construct a valid URL.\n const orgHost = dsn.host.replace(/^o\\d+\\./, '');\n out.issueUrl = `https://${orgHost}/issues/?query=${encodeURIComponent(out.eventId)}`;\n }\n } catch {\n // Swallow.\n }\n }\n\n // 5) Replay — try the modern `getReplay()` first, fall back to the\n // legacy `__SENTRY_REPLAY__` global some integrations attach manually.\n try {\n const v8 = sentry as SentryV8Like;\n const replay = v8.getReplay?.() ?? getSentryReplayGlobal();\n out.replayId = replay?.getReplayId?.() ?? undefined;\n } catch {\n // Swallow.\n }\n\n return out;\n}\n\n/**\n * Bidirectional linkage. Call this *after* a successful Mushi report\n * submission with the server-assigned report id. We drop a tag on\n * Sentry's current scope so any subsequent Sentry events from the\n * same session reference the Mushi report. We also write a\n * `mushi_report` context block that the Sentry MCP `search_events`\n * tool surfaces on the issue page.\n *\n * Best-effort and silent on failure — a Sentry that's mid-bootstrap\n * or an SDK version with a different scope API must never break a\n * report that's already been accepted by Mushi.\n */\nexport function tagSentryScope(reportId: string, options: { reportUrl?: string } = {}): void {\n const sentry = getSentryGlobal();\n if (!sentry) return;\n try {\n // v8/v9: top-level `setTag` + `setContext` write to the active scope.\n const v8 = sentry as SentryV8Like;\n if (typeof v8.setTag === 'function') {\n v8.setTag('mushi.report_id', reportId);\n if (options.reportUrl) v8.setTag('mushi.report_url', options.reportUrl);\n }\n if (typeof v8.setContext === 'function') {\n v8.setContext('mushi_report', {\n id: reportId,\n ...(options.reportUrl ? { url: options.reportUrl } : {}),\n captured_at: new Date().toISOString(),\n });\n }\n // Also drop a Sentry breadcrumb so the link is visible in the\n // breadcrumb timeline of the next Sentry event the user\n // produces, not just on the scope.\n if (typeof v8.addBreadcrumb === 'function') {\n v8.addBreadcrumb({\n category: 'mushi',\n type: 'info',\n level: 'info',\n message: `Mushi report submitted (${reportId})`,\n data: { report_id: reportId, ...(options.reportUrl ? { url: options.reportUrl } : {}) },\n });\n }\n } catch {\n // Sentry not available\n }\n\n // v7 fallback: configure the scope on the active hub.\n try {\n const v7 = sentry as SentryV7Like;\n const scope = v7.getCurrentHub?.()?.getScope?.();\n if (scope) {\n scope.setTag?.('mushi.report_id', reportId);\n if (options.reportUrl) scope.setTag?.('mushi.report_url', options.reportUrl);\n scope.setContext?.('mushi_report', {\n id: reportId,\n ...(options.reportUrl ? { url: options.reportUrl } : {}),\n });\n }\n } catch {\n // Swallow.\n }\n}\n\n// ---- Feedback interceptor (kept from prior revision) -----------------------\n\nexport interface SentryFeedbackInterceptor {\n start(): void;\n stop(): void;\n}\n\nexport function createSentryFeedbackInterceptor(\n _config: MushiSentryConfig,\n onFeedback: (feedback: { eventId?: string; message: string; email?: string; name?: string }) => void,\n): SentryFeedbackInterceptor {\n let observer: MutationObserver | null = null;\n\n function start() {\n if (typeof MutationObserver === 'undefined') return;\n\n observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (node instanceof HTMLElement && node.getAttribute('data-sentry-feedback')) {\n interceptFeedbackForm(node);\n }\n }\n }\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n }\n\n function interceptFeedbackForm(container: HTMLElement) {\n const form = container.querySelector('form');\n if (!form) return;\n\n form.addEventListener('submit', () => {\n const formData = new FormData(form);\n onFeedback({\n message: (formData.get('message') as string) ?? '',\n email: (formData.get('email') as string) ?? undefined,\n name: (formData.get('name') as string) ?? undefined,\n });\n });\n }\n\n function stop() {\n observer?.disconnect();\n observer = null;\n }\n\n return { start, stop };\n}\n","import type { MushiApiCascadeConfig, MushiUrlMatcher } from '@mushi-mushi/core'\nimport { getInternalRequestKind, getRequestUrl, shouldIgnoreMushiUrl } from './internal-requests'\n\nexport interface ProactiveTriggerConfig {\n rageClick?: boolean\n longTask?: boolean\n apiCascade?: boolean | MushiApiCascadeConfig\n apiEndpoint?: string\n errorBoundary?: boolean\n}\n\nexport interface ProactiveTriggerCallbacks {\n onTrigger: (type: string, context: Record<string, unknown>) => void\n}\n\nexport interface ProactiveTriggerCleanup {\n destroy: () => void\n}\n\nexport function setupProactiveTriggers(\n callbacks: ProactiveTriggerCallbacks,\n config: ProactiveTriggerConfig = {},\n): ProactiveTriggerCleanup {\n const cleanups: Array<() => void> = []\n\n // --- Rage Click Detection ---\n if (config.rageClick !== false) {\n let clickTimes: number[] = []\n let lastClickTarget: EventTarget | null = null\n\n function handleClick(e: MouseEvent) {\n const now = Date.now()\n if (e.target === lastClickTarget) {\n clickTimes.push(now)\n clickTimes = clickTimes.filter(t => now - t < 500)\n if (clickTimes.length >= 3) {\n const el = e.target as HTMLElement\n callbacks.onTrigger('rage_click', {\n element: el.tagName,\n id: el.id,\n text: el.textContent?.slice(0, 50),\n })\n clickTimes = []\n }\n } else {\n lastClickTarget = e.target\n clickTimes = [now]\n }\n }\n document.addEventListener('click', handleClick, true)\n cleanups.push(() => document.removeEventListener('click', handleClick, true))\n }\n\n // --- Long Task Detection ---\n if (config.longTask !== false && typeof PerformanceObserver !== 'undefined') {\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.duration > 5000) {\n callbacks.onTrigger('long_task', {\n duration: Math.round(entry.duration),\n startTime: Math.round(entry.startTime),\n })\n }\n }\n })\n observer.observe({ entryTypes: ['longtask'] })\n cleanups.push(() => observer.disconnect())\n } catch {\n // longtask not supported\n }\n }\n\n // --- API Cascade Failure ---\n const apiCascade = normalizeApiCascadeConfig(config.apiCascade)\n if (apiCascade.enabled) {\n const failedRequests: number[] = []\n const origFetch = globalThis.fetch\n\n globalThis.fetch = async function (this: unknown, ...args: Parameters<typeof fetch>) {\n const [input, init] = args\n const url = getRequestUrl(input)\n const ignoreFailure = Boolean(getInternalRequestKind(input, init))\n || shouldIgnoreMushiUrl(url, {\n apiEndpoint: config.apiEndpoint,\n ignoreUrls: apiCascade.ignoreUrls,\n })\n\n try {\n const res = await origFetch.apply(this, args)\n if (!ignoreFailure && !res.ok && res.status >= 400) {\n recordApiFailure(failedRequests, callbacks)\n }\n return res\n } catch (err) {\n if (!ignoreFailure) recordApiFailure(failedRequests, callbacks)\n throw err\n }\n } as typeof fetch\n\n cleanups.push(() => { globalThis.fetch = origFetch })\n }\n\n // --- Global Error Boundary ---\n if (config.errorBoundary) {\n function handleError(event: ErrorEvent) {\n callbacks.onTrigger('error_boundary', {\n message: event.message,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n })\n }\n function handleUnhandledRejection(event: PromiseRejectionEvent) {\n callbacks.onTrigger('error_boundary', {\n message: event.reason instanceof Error ? event.reason.message : String(event.reason),\n type: 'unhandled_rejection',\n })\n }\n window.addEventListener('error', handleError)\n window.addEventListener('unhandledrejection', handleUnhandledRejection)\n cleanups.push(() => {\n window.removeEventListener('error', handleError)\n window.removeEventListener('unhandledrejection', handleUnhandledRejection)\n })\n }\n\n return {\n destroy() {\n cleanups.forEach(fn => fn())\n },\n }\n}\n\nfunction normalizeApiCascadeConfig(\n config: boolean | MushiApiCascadeConfig | undefined,\n): Required<Pick<MushiApiCascadeConfig, 'enabled'>> & { ignoreUrls: MushiUrlMatcher[] } {\n if (config === false) return { enabled: false, ignoreUrls: [] }\n if (config && typeof config === 'object') {\n return {\n enabled: config.enabled !== false,\n ignoreUrls: config.ignoreUrls ?? [],\n }\n }\n return { enabled: true, ignoreUrls: [] }\n}\n\nfunction recordApiFailure(failedRequests: number[], callbacks: ProactiveTriggerCallbacks): void {\n const now = Date.now()\n failedRequests.push(now)\n const recentFailures = failedRequests.filter(t => now - t < 10000)\n if (recentFailures.length >= 3) {\n callbacks.onTrigger('api_cascade', {\n failureCount: recentFailures.length,\n windowMs: 10000,\n })\n failedRequests.length = 0\n }\n}\n","export interface ProactiveConfig {\n maxProactivePerSession: number\n dismissCooldownHours: number\n suppressAfterDismissals: number\n}\n\nexport interface ProactiveManager {\n shouldShow(triggerType: string): boolean\n recordDismissal(): void\n recordSubmission(): void\n reset(): void\n}\n\nconst STORAGE_KEY_LAST_DISMISS = 'mushi:lastDismiss'\nconst STORAGE_KEY_CONSEC_DISMISS = 'mushi:consecDismiss'\n\nfunction readStorage(key: string): string | null {\n try { return localStorage.getItem(key) } catch { return null }\n}\n\nfunction writeStorage(key: string, value: string): void {\n try { localStorage.setItem(key, value) } catch { /* noop */ }\n}\n\nexport function createProactiveManager(\n config: Partial<ProactiveConfig> = {},\n): ProactiveManager {\n const maxPerSession = config.maxProactivePerSession ?? 2\n const cooldownHours = config.dismissCooldownHours ?? 24\n const suppressThreshold = config.suppressAfterDismissals ?? 3\n\n let sessionPromptCount = 0\n const sessionTriggerTypes = new Set<string>()\n\n function shouldShow(triggerType: string): boolean {\n // Permanent suppression check\n const consecDismissals = parseInt(readStorage(STORAGE_KEY_CONSEC_DISMISS) ?? '0', 10)\n if (consecDismissals >= suppressThreshold) return false\n\n // Cooldown check\n const lastDismiss = readStorage(STORAGE_KEY_LAST_DISMISS)\n if (lastDismiss) {\n const elapsed = Date.now() - parseInt(lastDismiss, 10)\n if (elapsed < cooldownHours * 60 * 60 * 1000) return false\n }\n\n // Session limit\n if (sessionPromptCount >= maxPerSession) return false\n\n // Dedup: same trigger type not shown twice per session\n if (sessionTriggerTypes.has(triggerType)) return false\n\n sessionTriggerTypes.add(triggerType)\n sessionPromptCount++\n return true\n }\n\n function recordDismissal(): void {\n writeStorage(STORAGE_KEY_LAST_DISMISS, String(Date.now()))\n const current = parseInt(readStorage(STORAGE_KEY_CONSEC_DISMISS) ?? '0', 10)\n writeStorage(STORAGE_KEY_CONSEC_DISMISS, String(current + 1))\n }\n\n function recordSubmission(): void {\n writeStorage(STORAGE_KEY_CONSEC_DISMISS, '0')\n }\n\n function reset(): void {\n sessionPromptCount = 0\n sessionTriggerTypes.clear()\n }\n\n return { shouldShow, recordDismissal, recordSubmission, reset }\n}\n","declare const __MUSHI_SDK_VERSION__: string | undefined;\n\nexport const MUSHI_SDK_PACKAGE = '@mushi-mushi/web';\nexport const MUSHI_SDK_VERSION =\n typeof __MUSHI_SDK_VERSION__ === 'string' && __MUSHI_SDK_VERSION__\n ? __MUSHI_SDK_VERSION__\n : '0.7.0';\n","import {\n type MushiConfig,\n type MushiReport,\n type MushiReportCategory,\n type MushiRuntimeSdkConfig,\n type MushiSdkVersionInfo,\n type MushiEventType,\n type MushiEventHandler,\n type MushiSDKInstance,\n type MushiDiagnosticsResult,\n DEFAULT_API_ENDPOINT,\n MUSHI_INTERNAL_INIT_MARKER,\n createApiClient,\n createPreFilter,\n createOfflineQueue,\n captureEnvironment,\n getReporterToken,\n getDeviceFingerprintHash,\n getSessionId,\n createRateLimiter,\n createPiiScrubber,\n createLogger,\n noopLogger,\n createBreadcrumbBuffer,\n type BreadcrumbBuffer,\n normaliseThrown,\n} from '@mushi-mushi/core';\n\nimport { MushiWidget } from './widget';\nimport {\n initRewards,\n updateRewardsUser,\n enqueue as enqueueActivity,\n getTier as getRewardsTier,\n type RewardsContext,\n} from './rewards';\nimport {\n createConsoleCapture,\n createNetworkCapture,\n createScreenshotCapture,\n createPerformanceCapture,\n createElementSelector,\n createTimelineCapture,\n createDiscoveryCapture,\n type DiscoveryCapture,\n} from './capture';\nimport { captureSentryContext, tagSentryScope } from './sentry';\nimport { setupProactiveTriggers, type ProactiveTriggerCleanup } from './proactive-triggers';\nimport { createProactiveManager, type ProactiveManager } from './proactive-manager';\nimport { isLocalhostEndpoint } from './internal-requests';\nimport { MUSHI_SDK_PACKAGE, MUSHI_SDK_VERSION } from './version';\n\nlet instance: MushiSDKInstance | null = null;\n\nexport class Mushi {\n private constructor() {}\n\n static init(config: MushiConfig): MushiSDKInstance {\n if (instance) {\n createLogger({ scope: 'mushi', level: 'warn', format: 'pretty' })\n .warn('Already initialized — call destroy() first to reinitialize');\n return instance;\n }\n\n if (!config.projectId) {\n throw new Error('[mushi] projectId is required');\n }\n\n if (!config.apiKey) {\n throw new Error('[mushi] apiKey is required');\n }\n\n if (config.enabled === false) {\n return createNoopInstance();\n }\n\n instance = createInstance(config);\n return instance;\n }\n\n static getInstance(): MushiSDKInstance | null {\n return instance;\n }\n\n static destroy(): void {\n instance?.destroy();\n instance = null;\n }\n\n static diagnose(): Promise<MushiDiagnosticsResult> {\n return instance?.diagnose() ?? diagnoseWithoutInstance();\n }\n}\n\nfunction createInstance(config: MushiConfig): MushiSDKInstance {\n const bootstrapConfig = applyPresetConfig(config);\n let activeConfig: MushiConfig = bootstrapConfig;\n const log = (config.debug ?? false)\n ? createLogger({ scope: 'mushi', level: 'debug', format: 'pretty' })\n : noopLogger;\n\n const apiClient = createApiClient({\n projectId: bootstrapConfig.projectId,\n apiKey: bootstrapConfig.apiKey,\n ...(bootstrapConfig.apiEndpoint ? { apiEndpoint: bootstrapConfig.apiEndpoint } : {}),\n });\n\n const preFilter = createPreFilter(bootstrapConfig.preFilter);\n const offlineQueue = createOfflineQueue(bootstrapConfig.offline);\n const rateLimiter = createRateLimiter({ maxBurst: 10, refillRate: 1, refillIntervalMs: 5_000 });\n const piiScrubber = createPiiScrubber();\n\n // Apply the same scrubber that runs over `description` to the\n // observability surfaces (breadcrumbs, tags, sentry context) right\n // before they leave the SDK. The buffer/sentry layers are kept\n // pristine so `getBreadcrumbs()` returns the host's own values; this\n // pass only mutates the snapshot that goes on the wire.\n function scrubBreadcrumbsForWire<T extends { message?: string; data?: Record<string, unknown> }>(\n crumbs: T[],\n ): T[] {\n return crumbs.map((c) => {\n const next: T = { ...c };\n if (typeof c.message === 'string') {\n next.message = piiScrubber.scrub(c.message);\n }\n if (c.data && typeof c.data === 'object') {\n const cleaned: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(c.data)) {\n cleaned[k] = typeof v === 'string' ? piiScrubber.scrub(v) : v;\n }\n next.data = cleaned;\n }\n return next;\n });\n }\n function scrubTagsForWire(\n tags: Record<string, string | number | boolean> | undefined,\n ): Record<string, string | number | boolean> | undefined {\n if (!tags) return undefined;\n const out: Record<string, string | number | boolean> = {};\n for (const [k, v] of Object.entries(tags)) {\n out[k] = typeof v === 'string' ? piiScrubber.scrub(v) : v;\n }\n return out;\n }\n\n let consoleCap: ReturnType<typeof createConsoleCapture> | null = null;\n let networkCap: ReturnType<typeof createNetworkCapture> | null = null;\n let perfCap: ReturnType<typeof createPerformanceCapture> | null = null;\n let screenshotCap: ReturnType<typeof createScreenshotCapture> | null = null;\n let elementSelector: ReturnType<typeof createElementSelector> | null = null;\n let discoveryCap: DiscoveryCapture | null = null;\n const timelineCap = createTimelineCapture();\n let widget!: MushiWidget;\n\n function syncCaptureModules() {\n if (activeConfig.capture?.console !== false) {\n consoleCap ??= createConsoleCapture();\n } else {\n consoleCap?.destroy();\n consoleCap = null;\n }\n\n if (activeConfig.capture?.network !== false) {\n const networkOptions = {\n apiEndpoint: resolveApiEndpoint(activeConfig),\n ignoreUrls: activeConfig.capture?.ignoreUrls,\n };\n if (networkCap) {\n networkCap.updateOptions(networkOptions);\n } else {\n networkCap = createNetworkCapture(networkOptions);\n }\n } else {\n networkCap?.destroy();\n networkCap = null;\n }\n\n if (activeConfig.capture?.performance !== false) {\n perfCap ??= createPerformanceCapture();\n } else {\n perfCap?.destroy();\n perfCap = null;\n }\n\n if (activeConfig.capture?.screenshot !== 'off') {\n const screenshotOptions = { privacy: activeConfig.privacy };\n if (screenshotCap) {\n screenshotCap.updateOptions(screenshotOptions);\n } else {\n screenshotCap = createScreenshotCapture(screenshotOptions);\n }\n } else {\n screenshotCap = null;\n }\n if (!screenshotCap) pendingScreenshot = null;\n widget.setAllowScreenshotRemove(activeConfig.privacy?.allowUserRemoveScreenshot !== false);\n\n if (activeConfig.capture?.elementSelector !== false) {\n elementSelector ??= createElementSelector();\n } else {\n elementSelector?.deactivate();\n elementSelector = null;\n pendingElement = null;\n }\n\n // Mushi v2.1: passive inventory discovery. Default OFF — only stand\n // up when the host explicitly opts in. We deliberately re-create the\n // capturer when the config changes (rather than mutating it) so the\n // route-template list and throttle window are picked up cleanly.\n const discoveryRaw = activeConfig.capture?.discoverInventory;\n const discoveryConfig =\n discoveryRaw === true\n ? {}\n : discoveryRaw && typeof discoveryRaw === 'object'\n ? discoveryRaw\n : null;\n const discoveryEnabled =\n discoveryConfig != null && discoveryConfig.enabled !== false;\n if (discoveryEnabled) {\n discoveryCap?.destroy();\n discoveryCap = createDiscoveryCapture({\n config: discoveryConfig!,\n getRecentNetworkPaths: () => {\n if (!networkCap) return [];\n return networkCap\n .getEntries()\n .map((e) => {\n try {\n const u = new URL(e.url, typeof window !== 'undefined' ? window.location.href : 'http://localhost');\n // Only same-origin or otherwise meaningful paths — skip\n // tracking pixels and the Mushi ingest endpoint itself.\n if (u.host && typeof window !== 'undefined' && u.host !== window.location.host) return null;\n return u.pathname;\n } catch {\n return null;\n }\n })\n .filter((p): p is string => p != null && p.length > 0 && p.length < 200);\n },\n getUserId: () => userInfo?.id ?? null,\n getSessionId,\n onEvent: (event) => {\n // Best-effort; never throw, never block.\n void apiClient\n .postDiscoveryEvent({\n ...event,\n sdk_version: MUSHI_SDK_VERSION,\n })\n .catch((err) => {\n log.debug('discovery emit failed', { err: String(err) });\n });\n },\n });\n } else {\n discoveryCap?.destroy();\n discoveryCap = null;\n }\n }\n\n const listeners = new Map<MushiEventType, Set<MushiEventHandler>>();\n function emit(type: MushiEventType, data?: unknown) {\n listeners.get(type)?.forEach((handler) => handler({ type, data }));\n }\n\n let pendingScreenshot: string | null = null;\n let pendingElement: { tagName: string; id?: string; className?: string; xpath?: string } | null = null;\n let pendingProactiveTrigger: string | null = null;\n let runtimeConfigLoaded = false;\n let userInfo: { id: string; email?: string; name?: string } | null = null;\n const customMetadata: Record<string, unknown> = {};\n // Sticky tags applied to every subsequent report. Cleared by\n // `clearTag()` (single key) or `clearTag()` with no args (all keys).\n // We coerce to scalar values at insert time so the wire format is\n // already canonical when the report serialises.\n const stickyTags: Record<string, string | number | boolean> = {};\n // Breadcrumb ring buffer — Sentry-grade observability surface that\n // works whether or not the host has Sentry installed. Auto-populated\n // by SDK lifecycle events (`init` / `report:opened` / `report:sent`),\n // route changes, console errors, and `[data-testid]` clicks. Hosts\n // can also call `Mushi.addBreadcrumb()` directly.\n const breadcrumbs: BreadcrumbBuffer = createBreadcrumbBuffer({ max: 50 });\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: 'Mushi SDK init',\n data: { projectId: bootstrapConfig.projectId, sdkVersion: MUSHI_SDK_VERSION },\n });\n // Auto-breadcrumb teardown handles. Stored at module scope so\n // `destroy()` can detach them cleanly — leaks here would tail every\n // re-init in HMR'd dev sessions.\n let detachAutoBreadcrumbs: (() => void) | null = null;\n detachAutoBreadcrumbs = installAutoBreadcrumbs(breadcrumbs);\n widget = new MushiWidget(bootstrapConfig.widget, {\n onSubmit: async ({ category, description, intent }) => {\n log.info('Report submitted', { category, intent });\n proactiveManager?.recordSubmission();\n await submitReport(category, description, intent);\n },\n onOpen: () => {\n log.debug('Widget opened');\n emit('widget:opened');\n },\n onClose: () => {\n log.debug('Widget closed');\n if (pendingProactiveTrigger) {\n proactiveManager?.recordDismissal();\n emit('proactive:dismissed', { type: pendingProactiveTrigger });\n }\n pendingScreenshot = null;\n pendingElement = null;\n pendingProactiveTrigger = null;\n emit('widget:closed');\n },\n onScreenshotRequest: async () => {\n if (!screenshotCap || activeConfig.capture?.screenshot === 'off') return;\n log.debug('Taking screenshot');\n pendingScreenshot = await screenshotCap.take();\n widget.setScreenshotAttached(pendingScreenshot !== null);\n },\n onScreenshotRemove: () => {\n log.debug('Screenshot attachment removed');\n pendingScreenshot = null;\n widget.setScreenshotAttached(false);\n },\n onElementSelectorRequest: async () => {\n if (!elementSelector || activeConfig.capture?.elementSelector === false) return;\n log.debug('Element selector activated');\n const el = await elementSelector.activate();\n if (el) {\n pendingElement = el;\n widget.setElementSelected(true);\n log.debug('Element selected', { tagName: el.tagName, xpath: el.xpath });\n }\n },\n async onReporterReportsRequest() {\n const result = await apiClient.listReporterReports(getReporterToken());\n if (!result.ok) throw new Error(result.error?.message ?? 'Could not load reports');\n return result.data?.reports ?? [];\n },\n async onReporterCommentsRequest(reportId) {\n const result = await apiClient.listReporterComments(reportId, getReporterToken());\n if (!result.ok) throw new Error(result.error?.message ?? 'Could not load thread');\n return result.data?.comments ?? [];\n },\n async onReporterReply(reportId, body) {\n const result = await apiClient.replyToReporterReport(reportId, getReporterToken(), body);\n if (!result.ok) throw new Error(result.error?.message ?? 'Could not send reply');\n },\n }, MUSHI_SDK_VERSION);\n syncCaptureModules();\n\n if (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => widget.mount());\n } else {\n widget.mount();\n }\n }\n\n // --- Proactive triggers + fatigue prevention ---\n let proactiveTriggers: ProactiveTriggerCleanup | null = null;\n let proactiveManager: ProactiveManager | null = null;\n\n const proactiveCfg = activeConfig.proactive;\n const hasAnyProactive = proactiveCfg\n && (proactiveCfg.rageClick !== false\n || proactiveCfg.longTask !== false\n || proactiveCfg.apiCascade !== false\n || proactiveCfg.errorBoundary === true);\n\n if (hasAnyProactive && typeof document !== 'undefined') {\n proactiveManager = createProactiveManager(proactiveCfg?.cooldown);\n\n proactiveTriggers = setupProactiveTriggers(\n {\n onTrigger: (type, context) => {\n if (!proactiveManager!.shouldShow(type)) {\n log.debug('Proactive trigger suppressed by fatigue prevention', { type });\n return;\n }\n log.info('Proactive trigger fired', { type, context });\n pendingProactiveTrigger = type;\n emit('proactive:triggered', { type, context });\n widget.open();\n },\n },\n {\n rageClick: proactiveCfg?.rageClick,\n longTask: proactiveCfg?.longTask,\n apiCascade: proactiveCfg?.apiCascade,\n apiEndpoint: resolveApiEndpoint(activeConfig),\n errorBoundary: proactiveCfg?.errorBoundary,\n },\n );\n\n log.debug('Proactive triggers enabled', {\n rageClick: proactiveCfg?.rageClick !== false,\n longTask: proactiveCfg?.longTask !== false,\n apiCascade: proactiveCfg?.apiCascade !== false,\n errorBoundary: proactiveCfg?.errorBoundary === true,\n });\n }\n\n offlineQueue.startAutoSync(apiClient);\n offlineQueue.flush(apiClient).then((result) => {\n if (result.sent > 0) log.info('Synced offline reports', { sent: result.sent });\n });\n\n function applyRuntimeConfig(runtime: MushiRuntimeSdkConfig) {\n runtimeConfigLoaded = true;\n if (runtime.enabled === false) {\n activeConfig = bootstrapConfig;\n clearCachedRuntimeConfig(config.projectId);\n syncCaptureModules();\n widget.updateConfig(activeConfig.widget);\n log.debug('Runtime SDK config disabled; using bootstrap config', { version: runtime.version });\n return;\n }\n activeConfig = mergeRuntimeConfig(activeConfig, runtime);\n syncCaptureModules();\n if (runtime.widget) widget.updateConfig(activeConfig.widget);\n log.debug('Applied runtime SDK config', { version: runtime.version });\n }\n\n if (shouldUseRuntimeConfig(config)) {\n const cached = readCachedRuntimeConfig(config.projectId);\n if (cached) applyRuntimeConfig(cached);\n apiClient.getSdkConfig().then((result) => {\n if (result.ok && result.data) {\n cacheRuntimeConfig(config.projectId, result.data);\n applyRuntimeConfig(result.data);\n } else if (result.error) {\n log.debug('Runtime SDK config unavailable', result.error);\n }\n }).catch((err) => {\n log.debug('Runtime SDK config fetch failed', { error: err instanceof Error ? err.message : String(err) });\n });\n } else if (config.runtimeConfig !== false && isLocalhostEndpoint(resolveApiEndpoint(config))) {\n log.debug('Runtime SDK config skipped for localhost apiEndpoint; set runtimeConfig: true to force it');\n }\n\n void checkSdkFreshness();\n\n log.info('Initialized', { projectId: config.projectId });\n\n async function checkSdkFreshness(): Promise<void> {\n if (activeConfig.widget?.outdatedBanner === 'off') return;\n const cached = readCachedSdkVersion(MUSHI_SDK_PACKAGE);\n if (cached) applySdkFreshness(cached);\n const result = await apiClient.getLatestSdkVersion(MUSHI_SDK_PACKAGE);\n if (!result.ok || !result.data) return;\n cacheSdkVersion(MUSHI_SDK_PACKAGE, result.data);\n applySdkFreshness(result.data);\n }\n\n function applySdkFreshness(info: MushiSdkVersionInfo): void {\n const latest = info.latest;\n const outdated = Boolean(latest && isVersionOlder(MUSHI_SDK_VERSION, latest));\n if (!outdated && !info.deprecated) return;\n const message = info.deprecationMessage ?? (outdated ? `Update ${MUSHI_SDK_PACKAGE} to ${latest}.` : null);\n log.warn('Mushi SDK is outdated', {\n package: MUSHI_SDK_PACKAGE,\n current: MUSHI_SDK_VERSION,\n latest,\n deprecated: info.deprecated,\n message,\n });\n if (activeConfig.widget?.outdatedBanner !== 'console-only') {\n widget.setSdkFreshness({\n latest,\n current: MUSHI_SDK_VERSION,\n deprecated: info.deprecated,\n message,\n });\n }\n }\n\n async function submitReport(category: MushiReportCategory, description: string, intent?: string) {\n const filterResult = preFilter.check(description);\n if (!filterResult.passed) {\n log.info('Report blocked by pre-filter', { reason: filterResult.reason });\n return;\n }\n\n const wasm = config.preFilter?.wasmClassifier;\n if (wasm) {\n try {\n const verdict = await wasm.classify({\n description,\n category,\n url: typeof location !== 'undefined' ? location.href : undefined,\n hasScreenshot: pendingScreenshot !== null,\n hasSelectedElement: pendingElement !== null,\n hasNetworkErrors: networkCap?.getEntries()?.some((e) => e.status >= 400 || !!e.error) ?? false,\n hasConsoleErrors: consoleCap?.getEntries()?.some((e) => e.level === 'error') ?? false,\n proactiveTrigger: pendingProactiveTrigger ?? undefined,\n });\n if (verdict.verdict === 'block') {\n log.info('Report blocked by on-device classifier', {\n modelId: verdict.modelId,\n confidence: verdict.confidence,\n reason: verdict.reason,\n });\n return;\n }\n log.debug('On-device classifier verdict', { ...verdict });\n } catch (err) {\n log.warn('On-device classifier threw — falling through to server', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (!rateLimiter.tryConsume()) {\n log.warn('Report throttled — rate limit exceeded');\n return;\n }\n\n const scrubbedDescription = piiScrubber.scrub(preFilter.truncate(description));\n\n const sentryCtx = config.sentry ? captureSentryContext(config.sentry) : undefined;\n const fingerprintHash = await getDeviceFingerprintHash().catch(() => null);\n const consoleLogs = activeConfig.capture?.console === false ? undefined : consoleCap?.getEntries();\n const networkLogs = activeConfig.capture?.network === false ? undefined : networkCap?.getEntries();\n\n // Snapshot breadcrumbs *before* we add the lifecycle \"submitting\"\n // beat — we want the report's timeline to end with the user-action\n // event, not with our own bookkeeping. We then add the submit\n // breadcrumb so it shows up on the *next* report (typical pattern\n // in production: a user files two reports in close succession,\n // and the second carries a \"previous report submitted\" hint).\n const reportBreadcrumbs = scrubBreadcrumbsForWire(breadcrumbs.getAll());\n const stickyTagSnapshot = scrubTagsForWire(\n Object.keys(stickyTags).length > 0 ? { ...stickyTags } : undefined,\n );\n const sentryCtxScrubbed = sentryCtx\n ? {\n ...sentryCtx,\n ...(sentryCtx.breadcrumbs\n ? { breadcrumbs: scrubBreadcrumbsForWire(sentryCtx.breadcrumbs) }\n : {}),\n ...(sentryCtx.tags ? { tags: scrubTagsForWire(sentryCtx.tags) } : {}),\n }\n : undefined;\n\n const report: MushiReport = {\n id: crypto.randomUUID?.() ?? `mushi_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n projectId: config.projectId,\n category,\n description: scrubbedDescription,\n userIntent: intent,\n environment: captureEnvironment(),\n consoleLogs,\n networkLogs,\n performanceMetrics: activeConfig.capture?.performance === false ? undefined : perfCap?.getMetrics(),\n timeline: timelineCap.getEntries({ consoleLogs, networkLogs }),\n screenshotDataUrl: pendingScreenshot ?? undefined,\n selectedElement: pendingElement ?? undefined,\n metadata: {\n ...customMetadata,\n ...(userInfo ? { user: userInfo } : {}),\n ...(sentryCtx?.release ? { sentryRelease: sentryCtx.release } : {}),\n },\n sessionId: getSessionId(),\n reporterToken: getReporterToken(),\n ...(fingerprintHash ? { fingerprintHash } : {}),\n appVersion: config.integrations?.vercel?.analyticsId,\n sdkPackage: MUSHI_SDK_PACKAGE,\n sdkVersion: MUSHI_SDK_VERSION,\n proactiveTrigger: pendingProactiveTrigger ?? undefined,\n // Top-level Sentry-grade observability fields. Breadcrumbs are\n // surfaced separately from `consoleLogs` because they're the\n // higher-signal \"what just happened\" trail (vs. the high-volume\n // raw console mirror), and the admin /reports drawer shows them\n // in different panes.\n ...(reportBreadcrumbs.length > 0 ? { breadcrumbs: reportBreadcrumbs } : {}),\n ...(stickyTagSnapshot ? { tags: stickyTagSnapshot } : {}),\n ...(sentryCtxScrubbed ? { sentryContext: sentryCtxScrubbed } : {}),\n sentryEventId: sentryCtx?.eventId,\n sentryReplayId: sentryCtx?.replayId,\n createdAt: new Date().toISOString(),\n };\n\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: `Mushi report submitting (${category})`,\n data: { reportId: report.id, category },\n });\n\n if (config.integrations?.custom) {\n const builder = {\n addMetadata(key: string, value: unknown) {\n (report.metadata as Record<string, unknown>)[key] = value;\n },\n setCategory(cat: MushiReportCategory) {\n report.category = cat;\n },\n setDescription(desc: string) {\n report.description = desc;\n },\n };\n config.integrations.custom(builder);\n }\n\n emit('report:submitted', { reportId: report.id });\n\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n await offlineQueue.enqueue(report);\n log.info('Offline — report queued', { reportId: report.id });\n emit('report:queued', { reportId: report.id });\n return;\n }\n\n const result = await apiClient.submitReport(report);\n if (result.ok) {\n log.info('Report sent', { reportId: result.data?.reportId });\n emit('report:sent', { reportId: result.data?.reportId });\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: `Mushi report sent (${result.data?.reportId ?? report.id})`,\n });\n // Award points for the report submission. This is client-side so\n // the activity batch is flushed on the next tick with the correct\n // user_id already set via identify(). The server awards 50 pts by\n // default (configurable via the rewards rules dashboard).\n enqueueActivity({\n action: 'report_submit',\n metadata: { category, reportId: result.data?.reportId ?? report.id },\n });\n // Bidirectional Sentry linkage. After a successful submit we tag\n // Sentry's current scope so any subsequent Sentry events show\n // the Mushi correlation (`mushi.report_id` tag) and the issue\n // page picks up a `mushi_report` context block. Wrapped in\n // `try/catch` because Sentry's globals can be in a half-bootstrap\n // state immediately after page load.\n try {\n if (config.sentry && result.data?.reportId) {\n tagSentryScope(result.data.reportId);\n }\n } catch {\n // Swallow — never break a successful submit because Sentry's\n // scope API moved between point releases.\n }\n } else {\n log.warn('Report failed, queuing for retry', { reportId: report.id, error: result.error });\n await offlineQueue.enqueue(report);\n emit('report:failed', { reportId: report.id, error: result.error });\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'warning',\n message: `Mushi report queued for retry (${report.id})`,\n });\n }\n\n pendingScreenshot = null;\n pendingElement = null;\n pendingProactiveTrigger = null;\n }\n\n const sdk: MushiSDKInstance = {\n report(options) {\n widget.open(options);\n },\n\n on(event: MushiEventType, handler: MushiEventHandler) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(handler);\n return () => listeners.get(event)?.delete(handler);\n },\n\n setUser(user) {\n userInfo = user;\n },\n\n setMetadata(key, value) {\n customMetadata[key] = value;\n },\n\n setScreen(screen) {\n timelineCap.setScreen(screen);\n },\n\n isOpen() {\n return widget.getIsOpen();\n },\n\n open() {\n widget.open();\n },\n\n openWith(category) {\n widget.open({ category });\n },\n\n show() {\n widget.showTrigger();\n },\n\n hide() {\n widget.hideTrigger();\n },\n\n attachTo(selectorOrElement, options) {\n return widget.attachTo(selectorOrElement, options);\n },\n\n setTrigger(trigger) {\n widget.setTrigger(trigger);\n },\n\n close() {\n widget.close();\n },\n\n updateConfig(runtimeConfig) {\n applyRuntimeConfig(runtimeConfig);\n },\n\n diagnose() {\n return runDiagnostics({\n apiEndpoint: resolveApiEndpoint(activeConfig),\n widgetMounted: widget.getIsMounted(),\n runtimeConfigLoaded,\n captureScreenshotAvailable: screenshotCap !== null,\n captureNetworkIntercepting: networkCap !== null,\n });\n },\n\n destroy() {\n proactiveTriggers?.destroy();\n proactiveManager?.reset();\n widget.destroy();\n consoleCap?.destroy();\n networkCap?.destroy();\n perfCap?.destroy();\n elementSelector?.deactivate();\n timelineCap.destroy();\n discoveryCap?.destroy();\n discoveryCap = null;\n offlineQueue.stopAutoSync();\n detachAutoBreadcrumbs?.();\n detachAutoBreadcrumbs = null;\n breadcrumbs.clear();\n listeners.clear();\n instance = null;\n log.debug('Destroyed');\n },\n\n // Wave G4 — unified `captureEvent` API for programmatic/adapter-driven\n // reports. Skips the widget, runs the same PII scrub + rate limit +\n // offline-queue path as `submit()`, and returns the server report id.\n async captureEvent(input) {\n if (!rateLimiter.tryConsume()) {\n log.warn('captureEvent throttled — rate limit exceeded');\n return null;\n }\n const description = piiScrubber.scrub(preFilter.truncate(input.description));\n const category = input.category ?? 'bug';\n const sentryCtx = config.sentry ? captureSentryContext(config.sentry) : undefined;\n const captureBreadcrumbs = scrubBreadcrumbsForWire(breadcrumbs.getAll());\n // Sticky tags merge with per-call `input.tags` — call-site wins\n // when both supply the same key. Keeps adapters that already\n // pass per-event tags compatible while letting hosts set\n // app-wide defaults via `setTag()`. We then run the same\n // PII scrubber over string values so secrets a host accidentally\n // shoved into a tag (e.g. `Mushi.setTag('email', user.email)`)\n // never hit the wire.\n const mergedTags = scrubTagsForWire(\n Object.keys(stickyTags).length === 0 && !input.tags\n ? undefined\n : { ...stickyTags, ...(input.tags ?? {}) },\n );\n const sentryCtxScrubbed = sentryCtx\n ? {\n ...sentryCtx,\n ...(sentryCtx.breadcrumbs\n ? { breadcrumbs: scrubBreadcrumbsForWire(sentryCtx.breadcrumbs) }\n : {}),\n ...(sentryCtx.tags ? { tags: scrubTagsForWire(sentryCtx.tags) } : {}),\n }\n : undefined;\n const report: MushiReport = {\n id: crypto.randomUUID?.() ?? `mushi_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n projectId: config.projectId,\n category,\n description,\n environment: captureEnvironment(),\n timeline: timelineCap.getEntries(),\n metadata: {\n ...(input.metadata ?? {}),\n ...(userInfo ? { user: userInfo } : {}),\n ...(input.error ? { error: input.error } : {}),\n ...(input.severity ? { severity: input.severity } : {}),\n ...(input.component ? { component: input.component } : {}),\n ...(input.source ? { source: input.source } : { source: 'captureEvent' }),\n },\n ...(captureBreadcrumbs.length > 0 ? { breadcrumbs: captureBreadcrumbs } : {}),\n ...(mergedTags && Object.keys(mergedTags).length > 0 ? { tags: mergedTags } : {}),\n ...(sentryCtxScrubbed ? { sentryContext: sentryCtxScrubbed } : {}),\n sessionId: getSessionId(),\n reporterToken: getReporterToken(),\n sdkPackage: MUSHI_SDK_PACKAGE,\n sdkVersion: MUSHI_SDK_VERSION,\n sentryEventId: sentryCtx?.eventId,\n sentryReplayId: sentryCtx?.replayId,\n createdAt: new Date().toISOString(),\n };\n emit('report:submitted', { reportId: report.id });\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n await offlineQueue.enqueue(report);\n emit('report:queued', { reportId: report.id });\n return null;\n }\n const res = await apiClient.submitReport(report);\n if (res.ok) {\n emit('report:sent', { reportId: res.data?.reportId });\n try {\n if (config.sentry && res.data?.reportId) tagSentryScope(res.data.reportId);\n } catch {\n // Swallow.\n }\n return res.data?.reportId ?? null;\n }\n await offlineQueue.enqueue(report);\n emit('report:failed', { reportId: report.id, error: res.error });\n return null;\n },\n\n async captureException(error, options) {\n const normalised = normaliseThrown(error);\n // Drop a breadcrumb at the call site so this exception shows up\n // in Mushi's own timeline even if the report itself is rate-limited\n // or rejected by the pre-filter — losing the report shouldn't lose\n // the trace.\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'error',\n message: `Mushi.captureException(${normalised.name}): ${normalised.message}`,\n ...(normalised.stack ? { data: { stack: normalised.stack.slice(0, 500) } } : {}),\n });\n const description =\n options?.description?.trim() ||\n `${normalised.name}: ${normalised.message}` ||\n 'Uncaught exception';\n return sdk.captureEvent({\n description,\n category: options?.category ?? 'bug',\n severity: options?.severity ?? 'high',\n ...(options?.component ? { component: options.component } : {}),\n ...(options?.tags ? { tags: options.tags } : {}),\n source: options?.source ?? 'captureException',\n error: {\n name: normalised.name,\n message: normalised.message,\n ...(normalised.stack ? { stack: normalised.stack } : {}),\n },\n metadata: {\n ...(options?.metadata ?? {}),\n ...(normalised.cause ? { cause: normalised.cause } : {}),\n },\n });\n },\n\n identify(userId, traits) {\n userInfo = { id: userId, ...(traits?.email ? { email: traits.email } : {}), ...(traits?.name ? { name: traits.name } : {}) };\n if (traits) {\n for (const [k, v] of Object.entries(traits)) {\n if (k !== 'email' && k !== 'name') customMetadata[`user.${k}`] = v;\n }\n }\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: `Mushi.identify(${userId})`,\n });\n\n // Wire rewards program when enabled\n if (activeConfig.rewards?.enabled) {\n const rewardsCtx: RewardsContext = {\n client: apiClient,\n config: activeConfig.rewards,\n projectId: bootstrapConfig.projectId,\n userId,\n traits: traits\n ? { email: traits.email as string | undefined, name: traits.name as string | undefined, provider: traits.provider as string | undefined }\n : undefined,\n };\n if (userInfo.id === userId) {\n // First identify → full init\n initRewards(rewardsCtx);\n } else {\n // Already initialized; just update user context\n updateRewardsUser(userId, rewardsCtx.traits);\n }\n\n // Fetch reputation to hydrate the in-widget rewards nudge and success\n // points display. Fire-and-forget: never blocks the identify call.\n if (activeConfig.rewards.showInWidget !== false) {\n void apiClient.getMyPoints(userId).then((res) => {\n if (!res.ok) return;\n const d = res.data as {\n total_points?: number;\n tier?: { slug?: string; display_name?: string; points_threshold?: number } | null;\n next_tier?: { display_name?: string; points_threshold?: number } | null;\n report_submit_pts?: number;\n };\n widget.setRewardsState({\n tier: d.tier\n ? { slug: d.tier.slug ?? 'free', displayName: d.tier.display_name ?? 'Free', pointsThreshold: d.tier.points_threshold ?? 0 }\n : null,\n nextTier: d.next_tier\n ? { displayName: d.next_tier.display_name ?? '', pointsThreshold: d.next_tier.points_threshold ?? 0 }\n : null,\n totalPoints: d.total_points ?? 0,\n pointsForReport: d.report_submit_pts ?? 50,\n });\n }).catch(() => { /* non-fatal */ });\n }\n }\n },\n\n addBreadcrumb(crumb) {\n breadcrumbs.add(crumb);\n },\n\n getBreadcrumbs() {\n return breadcrumbs.getAll();\n },\n\n setTag(key, value) {\n if (typeof key !== 'string' || key.length === 0) return;\n stickyTags[key] = value;\n },\n\n setTags(tags) {\n if (!tags || typeof tags !== 'object') return;\n for (const [k, v] of Object.entries(tags)) {\n if (typeof k === 'string' && k.length > 0) {\n stickyTags[k] = v;\n }\n }\n },\n\n clearTag(key) {\n if (typeof key === 'string' && key.length > 0) {\n delete stickyTags[key];\n return;\n }\n // No-arg variant: clear every sticky tag (used in test teardown\n // and on app-level \"logout\" handlers).\n for (const k of Object.keys(stickyTags)) delete stickyTags[k];\n },\n\n // ─── Rewards program (P1) ──────────────────────────────────\n\n async getReputation() {\n if (!userInfo?.id) return null;\n const res = await apiClient.getMyPoints(userInfo.id);\n if (!res.ok) return null;\n return {\n totalPoints: (res.data as { total_points: number }).total_points ?? 0,\n points30d: (res.data as { points_30d: number }).points_30d ?? 0,\n reputation: 1.0,\n confirmedBugs: 0,\n totalReports: 0,\n };\n },\n\n async getTier() {\n if (!userInfo?.id) return null;\n return getRewardsTier(userInfo.id);\n },\n\n recordActivity(action, metadata) {\n if (!activeConfig.rewards?.enabled) return;\n enqueueActivity({ action, metadata });\n },\n };\n\n return sdk;\n}\n\nfunction mergeRuntimeConfig(config: MushiConfig, runtime: MushiRuntimeSdkConfig): MushiConfig {\n const nativeTrigger = runtime.native?.triggerMode;\n const widgetTrigger = runtime.widget?.trigger\n ?? (nativeTrigger === 'none' || nativeTrigger === 'shake' ? 'manual' : undefined);\n return {\n ...config,\n widget: {\n ...config.widget,\n ...runtime.widget,\n ...(widgetTrigger ? { trigger: widgetTrigger } : {}),\n // betaMode is local-only: set by the host app, not the dashboard.\n // Restore it after the runtime spread so it is never silently cleared.\n ...(config.widget?.betaMode ? { betaMode: config.widget.betaMode } : {}),\n },\n capture: {\n ...config.capture,\n ...runtime.capture,\n },\n privacy: {\n ...config.privacy,\n },\n };\n}\n\nfunction applyPresetConfig(config: MushiConfig): MushiConfig {\n if (!config.preset) return config;\n const preset = presetDefaults(config.preset);\n return {\n ...config,\n widget: {\n ...preset.widget,\n ...config.widget,\n },\n capture: {\n ...preset.capture,\n ...config.capture,\n },\n proactive: {\n ...preset.proactive,\n ...config.proactive,\n cooldown: {\n ...preset.proactive?.cooldown,\n ...config.proactive?.cooldown,\n },\n },\n };\n}\n\nfunction presetDefaults(preset: NonNullable<MushiConfig['preset']>): Pick<MushiConfig, 'widget' | 'capture' | 'proactive'> {\n switch (preset) {\n case 'manual-only':\n return {\n widget: { trigger: 'manual', outdatedBanner: 'console-only' },\n capture: { console: true, network: true, performance: false, screenshot: 'on-report', elementSelector: false },\n proactive: { rageClick: false, longTask: false, apiCascade: false, errorBoundary: false },\n };\n case 'beta-loud':\n return {\n widget: { trigger: 'auto', outdatedBanner: 'banner' },\n capture: { console: true, network: true, performance: true, screenshot: 'auto', elementSelector: true },\n proactive: { rageClick: true, longTask: true, apiCascade: true, errorBoundary: true },\n };\n case 'internal-debug':\n return {\n widget: { trigger: 'auto', outdatedBanner: 'banner', brandFooter: true },\n capture: { console: true, network: true, performance: true, screenshot: 'auto', elementSelector: true },\n proactive: {\n rageClick: true,\n longTask: true,\n apiCascade: true,\n errorBoundary: true,\n cooldown: { maxProactivePerSession: 10, dismissCooldownHours: 0, suppressAfterDismissals: 99 },\n },\n };\n case 'production-calm':\n return {\n widget: { trigger: 'auto', outdatedBanner: 'console-only' },\n capture: { console: true, network: true, performance: false, screenshot: 'on-report', elementSelector: false },\n proactive: { rageClick: false, longTask: false, apiCascade: false, errorBoundary: false },\n };\n }\n}\n\nfunction resolveApiEndpoint(config: Pick<MushiConfig, 'apiEndpoint'>): string {\n return config.apiEndpoint ?? DEFAULT_API_ENDPOINT;\n}\n\nfunction shouldUseRuntimeConfig(config: MushiConfig): boolean {\n if (config.runtimeConfig === false) return false;\n if (config.runtimeConfig === true) return true;\n return !isLocalhostEndpoint(resolveApiEndpoint(config));\n}\n\nasync function runDiagnostics(options: {\n apiEndpoint: string;\n widgetMounted: boolean;\n runtimeConfigLoaded: boolean;\n captureScreenshotAvailable: boolean;\n captureNetworkIntercepting: boolean;\n}): Promise<MushiDiagnosticsResult> {\n const endpoint = await probeApiEndpoint(options.apiEndpoint);\n return {\n apiEndpointReachable: endpoint.reachable,\n cspAllowsEndpoint: endpoint.cspAllowed,\n widgetMounted: options.widgetMounted,\n shadowDomAvailable: typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.attachShadow === 'function',\n dialogSupported: typeof HTMLDialogElement !== 'undefined',\n runtimeConfigLoaded: options.runtimeConfigLoaded,\n captureScreenshotAvailable: options.captureScreenshotAvailable,\n captureNetworkIntercepting: options.captureNetworkIntercepting,\n sdkVersion: MUSHI_SDK_VERSION,\n };\n}\n\nasync function diagnoseWithoutInstance(): Promise<MushiDiagnosticsResult> {\n return {\n apiEndpointReachable: false,\n cspAllowsEndpoint: false,\n widgetMounted: false,\n shadowDomAvailable: typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.attachShadow === 'function',\n dialogSupported: typeof HTMLDialogElement !== 'undefined',\n runtimeConfigLoaded: false,\n captureScreenshotAvailable: false,\n captureNetworkIntercepting: false,\n sdkVersion: MUSHI_SDK_VERSION,\n };\n}\n\nasync function probeApiEndpoint(apiEndpoint: string): Promise<{ reachable: boolean; cspAllowed: boolean }> {\n if (typeof fetch === 'undefined') return { reachable: false, cspAllowed: false };\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timer = controller ? setTimeout(() => controller.abort(), 3_000) : null;\n try {\n const response = await fetch(`${apiEndpoint.replace(/\\/$/, '')}/health`, {\n method: 'GET',\n cache: 'no-store',\n ...(controller ? { signal: controller.signal } : {}),\n [MUSHI_INTERNAL_INIT_MARKER]: 'diagnose',\n } as RequestInit & { [MUSHI_INTERNAL_INIT_MARKER]?: 'diagnose' });\n return { reachable: response.ok, cspAllowed: true };\n } catch {\n return { reachable: false, cspAllowed: false };\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nfunction runtimeConfigCacheKey(projectId: string): string {\n return `mushi:sdk-config:${projectId}`;\n}\n\nfunction sdkVersionCacheKey(packageName: string): string {\n return `mushi:sdk-version:${packageName}`;\n}\n\nfunction readCachedRuntimeConfig(projectId: string): MushiRuntimeSdkConfig | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(runtimeConfigCacheKey(projectId));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { config?: MushiRuntimeSdkConfig };\n return parsed.config ?? null;\n } catch {\n return null;\n }\n}\n\nfunction cacheRuntimeConfig(projectId: string, config: MushiRuntimeSdkConfig): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(runtimeConfigCacheKey(projectId), JSON.stringify({\n cachedAt: Date.now(),\n config,\n }));\n } catch {\n // Storage can be unavailable in private/restricted contexts.\n }\n}\n\nfunction clearCachedRuntimeConfig(projectId: string): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.removeItem(runtimeConfigCacheKey(projectId));\n } catch {\n // Storage can be unavailable in private/restricted contexts.\n }\n}\n\nfunction readCachedSdkVersion(packageName: string): MushiSdkVersionInfo | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(sdkVersionCacheKey(packageName));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { cachedAt?: number; data?: MushiSdkVersionInfo };\n if (!parsed.data || !parsed.cachedAt || Date.now() - parsed.cachedAt > 86_400_000) return null;\n return parsed.data;\n } catch {\n return null;\n }\n}\n\nfunction cacheSdkVersion(packageName: string, data: MushiSdkVersionInfo): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(sdkVersionCacheKey(packageName), JSON.stringify({\n cachedAt: Date.now(),\n data,\n }));\n } catch {\n // Storage can be unavailable in private/restricted contexts.\n }\n}\n\nfunction isVersionOlder(current: string, latest: string): boolean {\n const currentParts = parseVersion(current);\n const latestParts = parseVersion(latest);\n for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n const cur = currentParts[i] ?? 0;\n const next = latestParts[i] ?? 0;\n if (cur < next) return true;\n if (cur > next) return false;\n }\n return false;\n}\n\nfunction parseVersion(version: string): number[] {\n return version\n .split(/[.-]/)\n .map((part) => Number.parseInt(part, 10))\n .filter((part) => Number.isFinite(part));\n}\n\nfunction createNoopInstance(): MushiSDKInstance {\n return {\n report: () => {},\n on: () => () => {},\n setUser: () => {},\n setMetadata: () => {},\n setScreen: () => {},\n isOpen: () => false,\n open: () => {},\n close: () => {},\n updateConfig: () => {},\n diagnose: diagnoseWithoutInstance,\n openWith: () => {},\n show: () => {},\n hide: () => {},\n attachTo: () => () => {},\n setTrigger: () => {},\n destroy: () => {\n instance = null;\n },\n captureEvent: async () => null,\n captureException: async () => null,\n identify: () => {},\n addBreadcrumb: () => {},\n getBreadcrumbs: () => [],\n setTag: () => {},\n setTags: () => {},\n clearTag: () => {},\n getReputation: async () => null,\n getTier: async () => null,\n recordActivity: () => {},\n };\n}\n\n/**\n * Auto-breadcrumb installer — attaches passive listeners that turn\n * common host-app signals into Mushi breadcrumbs without the host\n * lifting a finger.\n *\n * - Route changes via `popstate` and the `history.pushState` /\n * `replaceState` patches that single-page apps already trigger.\n * - `console.error` and `console.warn` callsites — distinct from\n * the existing `console-capture` (which mirrors the *content* of\n * console for the report's `consoleLogs` array; breadcrumbs\n * capture only that an error happened, what file/line, and one\n * short message).\n * - `[data-testid]` clicks anywhere on the page — testids are the\n * same identifiers the v2 inventory + Triage LLM grounds against,\n * so a breadcrumb of `clicked checkout-submit` is dramatically\n * more useful for triage than `clicked button.btn-primary`.\n *\n * Returns a teardown closure that detaches every listener. We keep\n * the closure in scope of `createInstance` so `Mushi.destroy()` can\n * call it before re-init — without this, dev-mode HMR would tail a\n * fresh listener stack on every reload.\n */\nfunction installAutoBreadcrumbs(buffer: BreadcrumbBuffer): () => void {\n if (typeof window === 'undefined') return () => {};\n const cleanups: Array<() => void> = [];\n\n // 1) Route changes — covers SSR-hydrated SPAs (Next, Remix, SvelteKit)\n // and old-school history-pushed apps. We patch the prototype methods\n // because most SPA frameworks call them directly instead of dispatching\n // an event the host could subscribe to.\n try {\n const dispatchRouteChange = (kind: 'pushState' | 'replaceState' | 'popstate') => {\n buffer.add({\n category: 'navigation',\n level: 'info',\n message: `${kind}: ${window.location.pathname}`,\n data: { url: window.location.href, kind },\n });\n };\n const onPop = () => dispatchRouteChange('popstate');\n window.addEventListener('popstate', onPop, { passive: true });\n cleanups.push(() => window.removeEventListener('popstate', onPop));\n\n const origPush = window.history.pushState;\n const origReplace = window.history.replaceState;\n window.history.pushState = function patched(...args: Parameters<History['pushState']>) {\n const ret = origPush.apply(this, args);\n try {\n dispatchRouteChange('pushState');\n } catch {\n // Swallow — never break navigation because the breadcrumb buffer\n // mis-stringified an URL.\n }\n return ret;\n };\n window.history.replaceState = function patched(...args: Parameters<History['replaceState']>) {\n const ret = origReplace.apply(this, args);\n try {\n dispatchRouteChange('replaceState');\n } catch {\n // Swallow.\n }\n return ret;\n };\n cleanups.push(() => {\n window.history.pushState = origPush;\n window.history.replaceState = origReplace;\n });\n } catch {\n // History API unavailable (some sandboxed iframes) — skip silently.\n }\n\n // 2) `console.error` and `console.warn` — wrap *only* these two so\n // we don't add overhead to `console.log` on the hot path. The\n // `console-capture` module already mirrors content; this layer\n // adds a \"something went wrong\" beat to the breadcrumb timeline.\n try {\n const origError = console.error;\n const origWarn = console.warn;\n console.error = function (...args: unknown[]) {\n try {\n buffer.add({\n category: 'console',\n level: 'error',\n message: args.map(stringifyConsoleArg).join(' '),\n });\n } catch {\n // Swallow.\n }\n return origError.apply(this, args as Parameters<typeof origError>);\n };\n console.warn = function (...args: unknown[]) {\n try {\n buffer.add({\n category: 'console',\n level: 'warning',\n message: args.map(stringifyConsoleArg).join(' '),\n });\n } catch {\n // Swallow.\n }\n return origWarn.apply(this, args as Parameters<typeof origWarn>);\n };\n cleanups.push(() => {\n console.error = origError;\n console.warn = origWarn;\n });\n } catch {\n // Console patching can fail in locked-down environments — non-fatal.\n }\n\n // 3) `[data-testid]` clicks — capture the testid, the tag name, and\n // the visible text (capped) so a breadcrumb of \"clicked submit-cta\n // — Buy now\" tells the triage path what the user just touched\n // without leaking arbitrary innerHTML.\n try {\n const onClick = (ev: MouseEvent) => {\n try {\n const target = ev.target;\n if (!(target instanceof Element)) return;\n let cur: Element | null = target;\n let hops = 0;\n while (cur && hops < 10) {\n const tid = cur.getAttribute('data-testid');\n if (tid) {\n const text = (cur.textContent ?? '').trim().slice(0, 80);\n buffer.add({\n category: 'ui.click',\n level: 'info',\n message: `clicked ${tid}${text ? ` — ${text}` : ''}`,\n data: { testid: tid, tag: cur.tagName.toLowerCase() },\n });\n return;\n }\n cur = cur.parentElement;\n hops++;\n }\n } catch {\n // Swallow — listener errors must never propagate.\n }\n };\n document.addEventListener('click', onClick, { passive: true, capture: true });\n cleanups.push(() => document.removeEventListener('click', onClick, true));\n } catch {\n // Swallow.\n }\n\n return () => {\n for (const c of cleanups) {\n try {\n c();\n } catch {\n // Swallow.\n }\n }\n };\n}\n\n/**\n * Coerce arbitrary console arguments to a short string for breadcrumb\n * messages. Errors get their `name + message`; objects get JSON-encoded\n * with a 200-char cap; everything else is `String(...)` truncated to\n * 200 chars. We never invoke a `toString` that throws — failures fall\n * back to the type label.\n */\nfunction stringifyConsoleArg(arg: unknown): string {\n try {\n if (arg instanceof Error) {\n return `${arg.name}: ${arg.message}`;\n }\n if (typeof arg === 'object' && arg !== null) {\n const json = JSON.stringify(arg);\n return json.length > 200 ? `${json.slice(0, 200)}…` : json;\n }\n const s = String(arg);\n return s.length > 200 ? `${s.slice(0, 200)}…` : s;\n } catch {\n return `[${typeof arg}]`;\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/i18n/en.ts","../src/i18n/ja.ts","../src/i18n/th.ts","../src/i18n/es.ts","../src/i18n/index.ts","../src/styles.ts","../src/widget.ts","../src/marketing-recorder.ts","../src/rewards.ts","../src/capture/console.ts","../src/internal-requests.ts","../src/capture/network.ts","../src/capture/screenshot.ts","../src/capture/performance.ts","../src/capture/element-selector.ts","../src/capture/timeline.ts","../src/capture/discovery.ts","../src/sentry.ts","../src/proactive-triggers.ts","../src/proactive-manager.ts","../src/version.ts","../src/mushi.ts"],"names":["MAX_ENTRIES","getSessionId","scope","handleClick","handleError","handleUnhandledRejection","apiClient","MUSHI_INTERNAL_INIT_MARKER"],"mappings":";;;;;AAEO,IAAM,EAAA,GAAkB;AAAA,EAC7B,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO,iBAAA;AAAA,IACP,KAAA,EAAO,OAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,UAAA,EAAY,kBAAA;AAAA,IACZ,SAAA,EAAW,4CAAA;AAAA,IACX,KAAA,EAAO;AAAA,GACT;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,qBAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,GAAA,EAAK,KAAA;AAAA,MACL,IAAA,EAAM,cAAA;AAAA,MACN,MAAA,EAAQ,eAAA;AAAA,MACR,SAAA,EAAW,WAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACT;AAAA,IACA,oBAAA,EAAsB;AAAA,MACpB,GAAA,EAAK,oCAAA;AAAA,MACL,IAAA,EAAM,mCAAA;AAAA,MACN,MAAA,EAAQ,qCAAA;AAAA,MACR,SAAA,EAAW,gCAAA;AAAA,MACX,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,gBAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,KAAK,CAAC,OAAA,EAAS,cAAA,EAAgB,WAAA,EAAa,gBAAgB,OAAO,CAAA;AAAA,MACnE,MAAM,CAAC,WAAA,EAAa,aAAA,EAAe,UAAA,EAAY,aAAa,OAAO,CAAA;AAAA,MACnE,QAAQ,CAAC,eAAA,EAAiB,aAAA,EAAe,iBAAA,EAAmB,oBAAoB,OAAO,CAAA;AAAA,MACvF,WAAW,CAAC,eAAA,EAAiB,cAAA,EAAgB,iBAAA,EAAmB,mBAAmB,OAAO,CAAA;AAAA,MAC1F,KAAA,EAAO,CAAC,iBAAA,EAAmB,eAAA,EAAiB,QAAQ,OAAO;AAAA;AAC7D,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,cAAA;AAAA,IACT,sBAAA,EAAwB,8BAAA;AAAA,IACxB,gBAAA,EAAkB,mBAAA;AAAA,IAClB,kBAAA,EAAoB,qBAAA;AAAA,IACpB,aAAA,EAAe,gBAAA;AAAA,IACf,eAAA,EAAiB,kBAAA;AAAA,IACjB,QAAA,EAAU;AAAA;AAEd,CAAA;;;AC/CO,IAAM,EAAA,GAAkB;AAAA,EAC7B,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,gCAAA;AAAA,IACT,KAAA,EAAO,4CAAA;AAAA,IACP,KAAA,EAAO,oBAAA;AAAA,IACP,IAAA,EAAM,cAAA;AAAA,IACN,MAAA,EAAQ,cAAA;AAAA,IACR,UAAA,EAAY,0BAAA;AAAA,IACZ,SAAA,EAAW,kJAAA;AAAA,IACX,KAAA,EAAO;AAAA,GACT;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,oEAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,GAAA,EAAK,cAAA;AAAA,MACL,IAAA,EAAM,gCAAA;AAAA,MACN,MAAA,EAAQ,gCAAA;AAAA,MACR,SAAA,EAAW,sCAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACT;AAAA,IACA,oBAAA,EAAsB;AAAA,MACpB,GAAA,EAAK,oEAAA;AAAA,MACL,IAAA,EAAM,8GAAA;AAAA,MACN,MAAA,EAAQ,kGAAA;AAAA,MACR,SAAA,EAAW,kGAAA;AAAA,MACX,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,wDAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,KAAK,CAAC,gCAAA,EAAS,oBAAA,EAAO,gCAAA,EAAS,kCAAS,oBAAK,CAAA;AAAA,MAC7C,MAAM,CAAC,gCAAA,EAAS,0BAAA,EAAQ,iBAAA,EAAS,8CAAW,oBAAK,CAAA;AAAA,MACjD,QAAQ,CAAC,4CAAA,EAAW,sCAAA,EAAU,wDAAA,EAAa,qDAAa,oBAAK,CAAA;AAAA,MAC7D,WAAW,CAAC,4CAAA,EAAW,sCAAA,EAAU,4CAAA,EAAW,0DAAa,oBAAK,CAAA;AAAA,MAC9D,KAAA,EAAO,CAAC,0BAAA,EAAQ,kDAAA,EAAY,4BAAQ,oBAAK;AAAA;AAC3C,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,8DAAA;AAAA,IACT,sBAAA,EAAwB,4FAAA;AAAA,IACxB,gBAAA,EAAkB,oEAAA;AAAA,IAClB,kBAAA,EAAoB,gFAAA;AAAA,IACpB,aAAA,EAAe,gCAAA;AAAA,IACf,eAAA,EAAiB,sCAAA;AAAA,IACjB,QAAA,EAAU;AAAA;AAEd,CAAA;;;AC/CO,IAAM,EAAA,GAAkB;AAAA,EAC7B,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,oEAAA;AAAA,IACT,KAAA,EAAO,oEAAA;AAAA,IACP,KAAA,EAAO,oBAAA;AAAA,IACP,IAAA,EAAM,0BAAA;AAAA,IACN,MAAA,EAAQ,oBAAA;AAAA,IACR,UAAA,EAAY,wDAAA;AAAA,IACZ,SAAA,EAAW,uNAAA;AAAA,IACX,KAAA,EAAO;AAAA,GACT;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,uFAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,GAAA,EAAK,oBAAA;AAAA,MACL,IAAA,EAAM,yCAAA;AAAA,MACN,MAAA,EAAQ,gFAAA;AAAA,MACR,SAAA,EAAW,gCAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACT;AAAA,IACA,oBAAA,EAAsB;AAAA,MACpB,GAAA,EAAK,wMAAA;AAAA,MACL,IAAA,EAAM,oKAAA;AAAA,MACN,MAAA,EAAQ,oMAAA;AAAA,MACR,SAAA,EAAW,gIAAA;AAAA,MACX,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,2EAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,KAAK,CAAC,0BAAA,EAAQ,8DAAA,EAAc,wDAAA,EAAa,gEAAc,gCAAO,CAAA;AAAA,MAC9D,MAAM,CAAC,kDAAA,EAAY,wDAAA,EAAa,KAAA,EAAO,0DAAa,gCAAO,CAAA;AAAA,MAC3D,QAAQ,CAAC,gFAAA,EAAiB,4CAAA,EAAW,gFAAA,EAAiB,iEAAe,gCAAO,CAAA;AAAA,MAC5E,WAAW,CAAC,8DAAA,EAAc,0EAAA,EAAgB,kGAAA,EAAoB,wCAAU,gCAAO,CAAA;AAAA,MAC/E,KAAA,EAAO,CAAC,wDAAA,EAAa,8DAAA,EAAc,oDAAY,gCAAO;AAAA;AACxD,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,4FAAA;AAAA,IACT,sBAAA,EAAwB,sIAAA;AAAA,IACxB,gBAAA,EAAkB,0EAAA;AAAA,IAClB,kBAAA,EAAoB,kGAAA;AAAA,IACpB,aAAA,EAAe,4FAAA;AAAA,IACf,eAAA,EAAiB,oHAAA;AAAA,IACjB,QAAA,EAAU;AAAA;AAEd,CAAA;;;AC/CO,IAAM,EAAA,GAAkB;AAAA,EAC7B,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,mBAAA;AAAA,IACT,KAAA,EAAO,sBAAA;AAAA,IACP,KAAA,EAAO,QAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,UAAA,EAAY,gBAAA;AAAA,IACZ,SAAA,EAAW,0CAAA;AAAA,IACX,KAAA,EAAO;AAAA,GACT;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,8BAAA;AAAA,IACT,UAAA,EAAY;AAAA,MACV,GAAA,EAAK,OAAA;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,iBAAA;AAAA,MACR,SAAA,EAAW,SAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACT;AAAA,IACA,oBAAA,EAAsB;AAAA,MACpB,GAAA,EAAK,iCAAA;AAAA,MACL,IAAA,EAAM,uCAAA;AAAA,MACN,MAAA,EAAQ,kDAAA;AAAA,MACR,SAAA,EAAW,kCAAA;AAAA,MACX,KAAA,EAAO;AAAA;AACT,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,qBAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP,KAAK,CAAC,OAAA,EAAS,eAAA,EAAiB,qBAAA,EAAoB,wBAAwB,MAAM,CAAA;AAAA,MAClF,MAAM,CAAC,oBAAA,EAAmB,gBAAA,EAAe,aAAA,EAAe,gBAAa,MAAM,CAAA;AAAA,MAC3E,QAAQ,CAAC,aAAA,EAAe,kBAAA,EAAiB,mBAAA,EAAqB,2BAA2B,MAAM,CAAA;AAAA,MAC/F,WAAW,CAAC,kBAAA,EAAoB,WAAA,EAAa,kBAAA,EAAoB,yBAAsB,MAAM,CAAA;AAAA,MAC7F,KAAA,EAAO,CAAC,yBAAA,EAAwB,eAAA,EAAiB,wBAAqB,MAAM;AAAA;AAC9E,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,qBAAA;AAAA,IACT,sBAAA,EAAwB,+BAAA;AAAA,IACxB,gBAAA,EAAkB,kBAAA;AAAA,IAClB,kBAAA,EAAoB,iBAAA;AAAA,IACpB,aAAA,EAAe,sBAAA;AAAA,IACf,eAAA,EAAiB,uBAAA;AAAA,IACjB,QAAA,EAAU;AAAA;AAEd,CAAA;;;ACzCA,IAAM,OAAA,GAAuC,EAAE,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAG;AAEvD,SAAS,UAAU,IAAA,EAA4B;AACpD,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EAAE,WAAA,EAAY;AAC5C,EAAA,OAAO,OAAA,CAAQ,IAAI,CAAA,IAAK,EAAA;AAC1B;AAEO,SAAS,mBAAA,GAAgC;AAC9C,EAAA,OAAO,MAAA,CAAO,KAAK,OAAO,CAAA;AAC5B;;;ACoBO,SAAS,gBAAgB,KAAA,EAAiC;AAC/D,EAAA,MAAM,SAAS,KAAA,KAAU,MAAA;AAOzB,EAAA,MAAM,KAAA,GAAe,SAAS,SAAA,GAAY,SAAA;AAC1C,EAAA,MAAM,GAAA,GAAe,SAAS,SAAA,GAAY,SAAA;AAC1C,EAAA,MAAM,QAAA,GAAe,SAAS,SAAA,GAAY,SAAA;AAC1C,EAAA,MAAM,QAAA,GAAe,SAAS,SAAA,GAAY,SAAA;AAC1C,EAAA,MAAM,IAAA,GAAe,SAAS,wBAAA,GAA2B,qBAAA;AACzD,EAAA,MAAM,UAAA,GAAe,SAAS,wBAAA,GAA2B,qBAAA;AACzD,EAAA,MAAM,UAAA,GAAe,SAAS,SAAA,GAAY,SAAA;AAC1C,EAAA,MAAM,cAAA,GAAiB,SAAS,sBAAA,GAAyB,sBAAA;AACzD,EAAA,MAAM,aAAA,GAAiB,SAAS,SAAA,GAAY,SAAA;AAQ5C,EAAA,MAAM,WAAA,GAAc,CAAA,gHAAA,CAAA;AACpB,EAAA,MAAM,QAAA,GAAc,CAAA,iGAAA,CAAA;AACpB,EAAA,MAAM,QAAA,GAAc,CAAA,wFAAA,CAAA;AAKpB,EAAA,MAAM,SAAA,GAAY,gCAAA;AAElB,EAAA,OAAO;AAAA;AAAA;AAAA,mBAAA,EAGY,QAAQ,CAAA;AAAA;AAAA;AAAA,aAAA,EAGd,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EAYQ,UAAU,CAAA;AAAA;AAAA,kBAAA,EAEhB,KAAK,CAAA;AAAA,aAAA,EACV,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAKG,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAId,IAAI,CAAA;AAAA;AAAA,uBAAA,EAEG,UAAU,CAAA;AAAA,kCAAA,EACC,SAAS,sBAAsB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAYxD,UAAU,CAAA;AAAA,0BAAA,EACF,UAAU,CAAA;AAAA,kCAAA,EACF,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAK3B,IAAI,CAAA;AAAA;AAAA,uBAAA,EAEG,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAKjB,IAAI,CAAA;AAAA;AAAA,uBAAA,EAEG,UAAU,CAAA;AAAA;AAAA;AAAA,yBAAA,EAGR,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EA2BnB,IAAI,CAAA;AAAA;AAAA,uBAAA,EAEG,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAWjB,IAAI,CAAA;AAAA;AAAA,sBAAA,EAEE,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,iCAAA,EAUC,UAAU,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAUzB,KAAK,CAAA;AAAA,wBAAA,EACC,UAAU,CAAA;AAAA;AAAA;AAAA,gBAAA,EAGlB,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yDAAA,EAQqC,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EAyB1C,cAAc,CAAA;AAAA,kBAAA,EACpB,cAAc,CAAA;AAAA,aAAA,EACnB,aAAa,CAAA;AAAA,mBAAA,EACP,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAMR,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EASd,QAAQ,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,+BAAA,EAWU,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAajB,UAAU,CAAA;AAAA;AAAA,mBAAA,EAET,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAeX,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAId,QAAQ,CAAA;AAAA;AAAA;AAAA,mBAAA,EAGF,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAKjB,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EASG,QAAQ,CAAA;AAAA;AAAA,aAAA,EAEd,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAOR,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAOH,QAAQ,CAAA;AAAA,mBAAA,EACF,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAIG,SAAS,CAAA;AAAA;AAAA,mDAAA,EAEY,UAAU,CAAA;AAAA;AAAA,2BAAA,EAElC,UAAU,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAad,QAAQ,CAAA;AAAA;AAAA;AAAA,uDAAA,EAGwB,QAAQ,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAA,EAUhC,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,EAKH,SAAS,iBAAiB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA,wDAAA,EAIX,UAAU,CAAA;AAAA,+FAAA,EAC6B,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,EAIzE,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAM5B,MAAA,GAAS,SAAS,iBAAiB,CAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAI9B,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAQjB,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAIF,QAAQ,CAAA;AAAA;AAAA,aAAA,EAEd,QAAQ,CAAA;AAAA;AAAA;AAAA,gCAAA,EAGW,SAAS,CAAA,kBAAA,EAAqB,SAAS,CAAA,cAAA,EAAiB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAA,EAUlE,IAAI,CAAA;AAAA;AAAA,aAAA,EAEtB,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAKG,QAAQ,CAAA;AAAA;AAAA,aAAA,EAEd,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAA,EAUQ,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAKhB,QAAQ,CAAA;AAAA;AAAA,aAAA,EAEd,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EAYC,IAAI,CAAA;AAAA,kBAAA,EACV,MAAA,GAAS,2BAA2B,qBAAqB,CAAA;AAAA;AAAA;AAAA,oBAAA,EAGvD,cAAc,CAAA;AAAA,kBAAA,EAChB,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAIb,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAUd,QAAQ,CAAA;AAAA;AAAA;AAAA,iCAAA,EAGY,UAAU,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAA,EAOd,UAAU,CAAA;AAAA,kBAAA,EACrB,cAAc,CAAA;AAAA,aAAA,EACnB,aAAa,CAAA;AAAA,mBAAA,EACP,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAA,EAoBI,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAKhB,WAAW,CAAA;AAAA;AAAA,gCAAA,EAEE,SAAS,iBAAiB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAIhD,QAAQ,CAAA;AAAA;AAAA,aAAA,EAEd,QAAQ,CAAA;AAAA;AAAA;AAAA,gCAAA,EAGW,SAAS,qBAAqB,SAAS,CAAA;AAAA;AAAA;AAAA,wDAAA,EAGf,UAAU,CAAA;AAAA,kFAAA,EACgB,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,EAI5D,UAAU,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAAA,EAQX,UAAU,CAAA;AAAA;AAAA,aAAA,EAE5B,GAAG,CAAA;AAAA,mBAAA,EACG,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAAA,EAKU,SAAS,CAAA;AAAA;AAAA;AAAA,aAAA,EAGjC,QAAQ,CAAA;AAAA;AAAA;AAAA,iDAAA,EAG4B,UAAU,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EAanC,UAAU,CAAA;AAAA;AAAA;AAAA,aAAA,EAGrB,QAAQ,CAAA;AAAA,mBAAA,EACF,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAKG,SAAS,CAAA,qBAAA,EAAwB,SAAS,CAAA,mBAAA,EAAsB,SAAS,CAAA;AAAA;AAAA;AAAA,aAAA,EAG1F,GAAG,CAAA;AAAA,oBAAA,EACI,GAAG,CAAA;AAAA;AAAA;AAAA,aAAA,EAGV,UAAU,CAAA;AAAA,oBAAA,EACH,UAAU,CAAA;AAAA,kBAAA,EACZ,cAAc,CAAA;AAAA;AAAA;AAAA,aAAA,EAGnB,aAAa,CAAA;AAAA,oBAAA,EACN,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAIrB,UAAU,CAAA;AAAA,oBAAA,EACH,UAAU,CAAA;AAAA,kBAAA,EACZ,cAAc,CAAA;AAAA;AAAA;AAAA,yBAAA,EAGP,UAAU,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,4BAAA,EAMP,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAOb,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAId,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAA,EAQG,UAAU,CAAA;AAAA;AAAA,kBAAA,EAEhB,UAAU,CAAA;AAAA;AAAA,mBAAA,EAET,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAA,EAMO,SAAS,sBAAsB,SAAS,CAAA;AAAA,0BAAA,EAChD,MAAA,GAAS,YAAY,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,EASxB,SAAS,qBAAqB,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAA,EAK7C,MAAA,GAAS,YAAY,SAAS,CAAA;AAAA;AAAA;AAAA,2EAAA,EAGmB,MAAA,GAAS,YAAY,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAMhF,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAA,EAKD,SAAS,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,4BAAA,EAMf,IAAI,CAAA;AAAA,aAAA,EACnB,QAAQ,CAAA;AAAA,mBAAA,EACF,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAad,QAAQ,CAAA;AAAA,mBAAA,EACF,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAQG,SAAS,CAAA;AAAA;AAAA,kCAAA,EAEL,QAAQ,2DAA2D,QAAQ,CAAA;AAAA;AAAA,aAAA,EAEhG,UAAU,CAAA;AAAA,mBAAA,EACJ,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4DAAA,EAK8B,IAAI,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAuBlD,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAAA,EAMgB,SAAS,CAAA;AAAA;AAAA;AAAA,mBAAA,EAG9B,WAAW,CAAA;AAAA;AAAA;AAAA,aAAA,EAGjB,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA,yCAAA,EAIkB,SAAS,CAAA;AAAA;AAAA;AAAA,mBAAA,EAG/B,WAAW,CAAA;AAAA;AAAA;AAAA,aAAA,EAGjB,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAIG,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAId,QAAQ,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,6BAAA,EAeQ,UAAU,CAAA;AAAA,aAAA,EAC1B,UAAU,CAAA;AAAA;AAAA,mBAAA,EAEJ,QAAQ,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,4BAAA,EAMC,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAiBb,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAId,GAAG,CAAA;AAAA;AAAA;AAAA,mBAAA,EAGG,QAAQ,CAAA;AAAA;AAAA,aAAA,EAEd,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAIF,QAAQ,CAAA;AAAA;AAAA,aAAA,EAEd,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAML,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAOV,UAAU,CAAA;AAAA;AAAA,8BAAA,EAEE,SAAS,CAAA;AAAA;AAAA;AAAA,mBAAA,EAGpB,QAAQ,CAAA;AAAA;AAAA,aAAA,EAEd,QAAQ,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EASO,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,mBAAA,EAIb,QAAQ,CAAA;AAAA;AAAA;AAAA,aAAA,EAGd,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAAA,EAKc,SAAS,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAwKhD;;;ACn+BA,IAAM,cAAA,GAAsD;AAAA,EAC1D,GAAA,EAAK,cAAA;AAAA,EACL,IAAA,EAAM,WAAA;AAAA,EACN,MAAA,EAAQ,WAAA;AAAA,EACR,SAAA,EAAW,WAAA;AAAA,EACX,KAAA,EAAO;AACT,CAAA;AAGA,SAAS,KAAK,CAAA,EAAmB;AAC/B,EAAA,OAAO,IAAI,EAAA,GAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,GAAK,OAAO,CAAC,CAAA;AACpC;AAEA,IAAM,WAAA,GAAc,CAAA;AACpB,IAAM,WAAA,GAA8D;AAAA,EAClE,QAAA,EAAU,CAAA;AAAA,EACV,MAAA,EAAQ,CAAA;AAAA,EACR,OAAA,EAAS,CAGX,CAAA;AAIA,SAAS,iBAAiB,CAAA,EAA2B;AACnD,EAAA,OAAA,CAAQ,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,EAAE,GAAA,KAAQ,OAAA;AAC/C;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,MACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC1B;AAsBO,IAAM,cAAN,MAAkB;AAAA,EAsCvB,YAAY,MAAA,GAA4B,EAAC,EAAG,SAAA,EAA6C,aAAa,OAAA,EAAS;AAAtB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACvF,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,QAAA,EAAU,OAAO,QAAA,IAAY,cAAA;AAAA,MAC7B,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,EAAC;AAAA,MAC1B,KAAA,EAAO,OAAO,KAAA,IAAS,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQvB,WAAA,EAAa,OAAO,WAAA,IAAe,WAAA;AAAA,MACnC,aAAA,EAAe,OAAO,aAAA,IAAiB,EAAA;AAAA,MACvC,IAAA,EAAM,OAAO,IAAA,IAAQ,gBAAA;AAAA,MACrB,MAAA,EAAQ,OAAO,MAAA,IAAU,MAAA;AAAA,MACzB,MAAA,EAAQ,OAAO,MAAA,IAAU,KAAA;AAAA,MACzB,OAAA,EAAS,OAAO,OAAA,IAAW,MAAA;AAAA,MAC3B,gBAAA,EAAkB,OAAO,gBAAA,IAAoB,EAAA;AAAA,MAC7C,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,EAAC;AAAA,MACxB,eAAA,EAAiB,OAAO,eAAA,IAAmB,IAAA;AAAA,MAC3C,cAAA,EAAgB,OAAO,cAAA,IAAkB,EAAA;AAAA,MACzC,YAAA,EAAc,MAAA,CAAO,YAAA,IAAgB,EAAC;AAAA,MACtC,YAAA,EAAc,MAAA,CAAO,YAAA,IAAgB,EAAC;AAAA,MACtC,SAAA,EAAW,OAAO,SAAA,IAAa,KAAA;AAAA,MAC/B,SAAA,EAAW,OAAO,SAAA,IAAa,KAAA;AAAA,MAC/B,WAAA,EAAa,OAAO,WAAA,IAAe,IAAA;AAAA,MACnC,cAAA,EAAgB,OAAO,cAAA,IAAkB,MAAA;AAAA,MACzC,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY;AAAC,KAChC;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,UAAU,IAAA,CAAK,MAAA,CAAO,WAAW,MAAA,GAAS,MAAA,GAAY,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAEtF,IAAA,IAAA,CAAK,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,IAAA,CAAK,KAAK,EAAA,GAAK,oBAAA;AACf,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,IAAA,CAAK,aAAa,EAAE,IAAA,EAAM,UAAU,CAAA;AAAA,EACzD;AAAA,EApCyF,UAAA;AAAA,EArCjF,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,IAAA,GAAmB,UAAA;AAAA,EACnB,gBAAA,GAA+C,IAAA;AAAA,EAC/C,cAAA,GAAgC,IAAA;AAAA,EAChC,kBAAA,GAAqB,KAAA;AAAA,EACrB,qBAAA,GAAwB,IAAA;AAAA,EACxB,eAAA,GAAkB,KAAA;AAAA,EAClB,UAAA,GAAa,KAAA;AAAA,EACb,cAAA,GAAiB,IAAA;AAAA,EACjB,aAAA,GAAgB,KAAA;AAAA,EAChB,qBAAA,GAAwB,KAAA;AAAA,EACxB,YAAA,GAAgH,IAAA;AAAA,EAChH,kBAAyC,EAAC;AAAA,EAC1C,mBAA2C,EAAC;AAAA,EAC5C,gBAAA,GAAkC,IAAA;AAAA,EAClC,eAAA,GAAkB,KAAA;AAAA,EAClB,aAAA,GAA+B,IAAA;AAAA,EAC/B,oBAAuC,EAAC;AAAA,EACxC,gBAAA,GAAwC,IAAA;AAAA,EACxC,cAAA,GAAuD,IAAA;AAAA;AAAA;AAAA;AAAA,EAIvD,WAAA,GAA2B,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK3B,YAAA,GAAqD,IAAA;AAAA,EACrD,cAAA,GAAuD,IAAA;AAAA,EACvD,YAAA,GAA0C,IAAA;AAAA,EAwClD,KAAA,GAAc;AACZ,IAAA,IAAI,IAAA,CAAK,KAAK,WAAA,EAAa;AAC3B,IAAA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AACnC,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAEA,YAAA,GAAwB;AACtB,IAAA,OAAO,KAAK,IAAA,CAAK,WAAA;AAAA,EACnB;AAAA,EAEA,YAAA,CAAa,MAAA,GAA4B,EAAC,EAAS;AACjD,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,GAAG,IAAA,CAAK,MAAA;AAAA,MACR,GAAI,OAAO,QAAA,GAAW,EAAE,UAAU,MAAA,CAAO,QAAA,KAAa,EAAC;AAAA,MACvD,GAAI,OAAO,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO,GAAI,EAAC;AAAA,MAC/D,GAAI,OAAO,KAAA,GAAQ,EAAE,OAAO,MAAA,CAAO,KAAA,KAAU,EAAC;AAAA,MAC9C,GAAI,MAAA,CAAO,WAAA,KAAgB,MAAA,GAAY,EAAE,aAAa,MAAA,CAAO,WAAA,IAAe,WAAA,EAAe,GAAI,EAAC;AAAA,MAChG,GAAI,OAAO,aAAA,KAAkB,MAAA,GAAY,EAAE,aAAA,EAAe,MAAA,CAAO,aAAA,EAAc,GAAI,EAAC;AAAA,MACpF,GAAI,OAAO,IAAA,GAAO,EAAE,MAAM,MAAA,CAAO,IAAA,KAAS,EAAC;AAAA,MAC3C,GAAI,OAAO,MAAA,GAAS,EAAE,QAAQ,MAAA,CAAO,MAAA,KAAW,EAAC;AAAA,MACjD,GAAI,OAAO,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAO,GAAI,EAAC;AAAA,MAC/D,GAAI,OAAO,OAAA,GAAU,EAAE,SAAS,MAAA,CAAO,OAAA,KAAY,EAAC;AAAA,MACpD,GAAI,OAAO,gBAAA,KAAqB,MAAA,GAAY,EAAE,gBAAA,EAAkB,MAAA,CAAO,gBAAA,EAAiB,GAAI,EAAC;AAAA,MAC7F,GAAI,OAAO,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,GAAI,EAAC;AAAA,MAC5D,GAAI,OAAO,eAAA,KAAoB,MAAA,GAAY,EAAE,eAAA,EAAiB,MAAA,CAAO,eAAA,EAAgB,GAAI,EAAC;AAAA,MAC1F,GAAI,OAAO,cAAA,KAAmB,MAAA,GAAY,EAAE,cAAA,EAAgB,MAAA,CAAO,cAAA,EAAe,GAAI,EAAC;AAAA,MACvF,GAAI,OAAO,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,EAAc,MAAA,CAAO,YAAA,EAAa,GAAI,EAAC;AAAA,MACjF,GAAI,OAAO,YAAA,KAAiB,MAAA,GAAY,EAAE,YAAA,EAAc,MAAA,CAAO,YAAA,EAAa,GAAI,EAAC;AAAA,MACjF,GAAI,OAAO,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,GAAI,EAAC;AAAA,MACxE,GAAI,OAAO,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,EAAW,MAAA,CAAO,SAAA,EAAU,GAAI,EAAC;AAAA,MACxE,GAAI,OAAO,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,MAAA,CAAO,WAAA,EAAY,GAAI,EAAC;AAAA,MAC9E,GAAI,OAAO,cAAA,KAAmB,MAAA,GAAY,EAAE,cAAA,EAAgB,MAAA,CAAO,cAAA,EAAe,GAAI,EAAC;AAAA,MACvF,GAAI,OAAO,QAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAAS,GAAI;AAAC,KACvE;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,UAAU,IAAA,CAAK,MAAA,CAAO,WAAW,MAAA,GAAS,MAAA,GAAY,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AACtF,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAEA,KAAK,OAAA,EAAoD;AACvD,IAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAC1B,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAEnB,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,QAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AAAA,IACd,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,IAAA,CAAK,UAAU,MAAA,EAAO;AAAA,EACxB;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,IAAA,CAAK,UAAU,OAAA,EAAQ;AAAA,EACzB;AAAA,EAEA,SAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAEA,WAAW,OAAA,EAA0D;AACnE,IAAA,IAAA,CAAK,YAAA,CAAa,EAAE,OAAA,EAAS,CAAA;AAAA,EAC/B;AAAA,EAEA,QAAA,CAAS,iBAAA,EAAqC,OAAA,GAA6B,EAAC,EAAe;AACzF,IAAA,MAAM,QAAA,GAAW,OAAO,iBAAA,KAAsB,QAAA,GAC1C,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,iBAAiB,CAAC,CAAA,GACvD,CAAC,iBAAiB,CAAA;AACtB,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO;AACpC,MAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAiB;AAChC,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AACzB,QAAA,IAAA,CAAK,IAAA,EAAK;AAAA,MACZ,CAAA;AACA,MAAA,EAAA,CAAG,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACpC,MAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAAA,IACtD,CAAC,CAAA;AACD,IAAA,OAAO,MAAM,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY,SAAS,CAAA;AAAA,EACtD;AAAA,EAEA,sBAAsB,QAAA,EAAyB;AAC7C,IAAA,IAAA,CAAK,kBAAA,GAAqB,QAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO;AAAA,EAC/B;AAAA,EAEA,yBAAyB,KAAA,EAAsB;AAC7C,IAAA,IAAA,CAAK,qBAAA,GAAwB,KAAA;AAC7B,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO;AAAA,EAC/B;AAAA,EAEA,mBAAmB,QAAA,EAAyB;AAC1C,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAA;AACvB,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO;AAAA,EAC/B;AAAA,EAEA,gBAAgB,IAAA,EAAsG;AACpH,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO;AAAA,EAC/B;AAAA,EAEA,gBAAgB,KAAA,EAAwC;AACtD,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO;AAAA,EAC/B;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAI,IAAA,CAAK,iBAAiB,IAAA,EAAM;AAC9B,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAC9B,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AACA,IAAA,IAAI,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAChC,MAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AACA,IAAA,IAAI,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAChC,MAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,gBAAA,IAAmB;AACxB,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,CAAC,OAAA,KAAY,SAAS,CAAA;AACrD,IAAA,IAAA,CAAK,oBAAoB,EAAC;AAC1B,IAAA,IAAA,CAAK,KAAK,MAAA,EAAO;AAAA,EACnB;AAAA,EAEQ,qBAAA,GAA8B;AACpC,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,CAAC,OAAA,KAAY,SAAS,CAAA;AACrD,IAAA,IAAA,CAAK,oBAAoB,EAAC;AAC1B,IAAA,IAAI,KAAK,MAAA,CAAO,OAAA,KAAY,YAAY,CAAC,IAAA,CAAK,OAAO,gBAAA,EAAkB;AACvE,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA,CAAO,gBAAgB,CAAC,CAAA;AAAA,EACzE;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAA,CAAK,gBAAA,IAAmB;AACxB,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,IAAA,CAAK,qBAAA,GAAwB,KAAA;AAC7B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,OAAO,WAAW,WAAA,EAAa;AAE7D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,SAAA,KAAc,OACpC,EAAiC,QAAA,EAAU,QAAA,EAAmB,QAAA,EAAU,GAAA,EAAI,GAC5E,KAAK,MAAA,CAAO,SAAA;AAChB,IAAA,IAAI,CAAC,MAAM,QAAA,EAAU;AAErB,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAQ;AAC7B,QAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,MACvB;AACA,MAAA,IAAA,CAAK,MAAA,EAAO;AACZ,MAAA,IAAI,IAAA,CAAK,cAAA,KAAmB,IAAA,EAAM,YAAA,CAAa,KAAK,cAAc,CAAA;AAClE,MAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACrC,QAAA,IAAA,CAAK,qBAAA,GAAwB,KAAA;AAC7B,QAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,QAAA,IAAA,CAAK,MAAA,EAAO;AAAA,MACd,CAAA,EAAG,KAAA,CAAM,QAAA,IAAY,GAAG,CAAA;AAAA,IAC1B,CAAA;AACA,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AAC7D,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAM,MAAA,CAAO,mBAAA,CAAoB,UAAU,QAAQ,CAAA;AAAA,EAC7E;AAAA,EAEQ,mBAAA,GAA+B;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,EAAgB,OAAO,KAAA;AACjC,IAAA,IAAI,IAAA,CAAK,uBAAuB,OAAO,KAAA;AACvC,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,OAAA,KAAY,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,OAAA,KAAY,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,OAAA,KAAY,QAAA,EAAU;AAC5G,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,mBAAA,EAAoB,EAAG,OAAO,KAAA;AACvC,IAAA,IAAI,IAAA,CAAK,aAAA,EAAc,EAAG,OAAO,KAAA;AACjC,IAAA,IAAI,IAAA,CAAK,OAAO,cAAA,IAAkB,QAAA,CAAS,cAAc,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA,EAAG,OAAO,KAAA;AAC7F,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,mBAAmB,CAAA;AAChE,IAAA,OAAO,MAAA,KAAW,WAAW,MAAA,KAAW,QAAA;AAAA,EAC1C;AAAA,EAEQ,gBAAA,GAA8D;AACpE,IAAA,IAAI,CAAC,KAAK,MAAA,CAAO,SAAA,IAAa,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA;AAChF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,SAAA,KAAc,IAAA,GACpC,EAAE,QAAA,EAAU,UAAA,EAAoB,GAChC,IAAA,CAAK,MAAA,CAAO,SAAA;AAChB,IAAA,IAAI,OAAO,UAAA,CAAW,oBAAoB,EAAE,OAAA,IAAW,KAAA,CAAM,aAAa,UAAA,EAAY;AACpF,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,EACrB;AAAA,EAEQ,mBAAA,GAA+B;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,aAAa,OAAO,MAAA,KAAW,aAAa,OAAO,KAAA;AACpE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,SAAA,KAAc,IAAA,GAAO,EAAE,QAAA,EAAU,UAAA,EAAoB,GAAI,IAAA,CAAK,MAAA,CAAO,SAAA;AAC/F,IAAA,OAAO,OAAO,UAAA,CAAW,oBAAoB,CAAA,CAAE,OAAA,IAAW,MAAM,QAAA,KAAa,MAAA;AAAA,EAC/E;AAAA,EAEQ,iBAAA,GAA8D;AACpE,IAAA,MAAM,IAAA,GAAO,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,QAAA,GAAW,EAAA;AACnE,IAAA,IAAI,IAAA,KAAS,eAAe,IAAA,KAAS,WAAA,IAAe,KAAK,QAAA,CAAS,QAAQ,GAAG,OAAO,aAAA;AACpF,IAAA,IAAI,kCAAA,CAAmC,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,SAAA;AAC1D,IAAA,OAAO,YAAA;AAAA,EACT;AAAA,EAEQ,aAAA,GAAyB;AAC/B,IAAA,IAAI,CAAC,KAAK,MAAA,CAAO,YAAA,CAAa,UAAU,OAAO,QAAA,KAAa,aAAa,OAAO,KAAA;AAChF,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,IAAA,CAAK,CAAC,UAAU,QAAA,CAAS,QAAA,CAAS,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,EACnF;AAAA,EAEQ,QAAA,GAA6B;AACnC,IAAA,IAAI,KAAK,MAAA,CAAO,KAAA,KAAU,MAAA,EAAQ,OAAO,KAAK,MAAA,CAAO,KAAA;AACrD,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,UAAA,CAAW,8BAA8B,EAAE,OAAA,EAAS;AAC9F,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAC5B,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,QAAA;AACxB,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AAEf,IAAA,IAAA,CAAK,OAAO,SAAA,GAAY,EAAA;AAExB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,WAAA,GAAc,gBAAgB,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,MAAA,CAAO,YAAY,KAAK,CAAA;AAE7B,IAAA,IAAI,IAAA,CAAK,qBAAoB,EAAG;AAC9B,MAAA,MAAM,gBAAA,GAAmB,KAAK,gBAAA,EAAiB;AAC/C,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC/C,MAAA,OAAA,CAAQ,SAAA,GAAY,CAAA,cAAA,EAAiB,GAAG,CAAA,EAAG,gBAAA,KAAqB,UAAA,GAAa,WAAA,GAAc,EAAE,CAAA,EAAG,IAAA,CAAK,aAAA,GAAgB,SAAA,GAAY,EAAE,CAAA,CAAA;AACnI,MAAA,OAAA,CAAQ,WAAA,GAAc,KAAK,MAAA,CAAO,WAAA;AAClC,MAAA,OAAA,CAAQ,YAAA,CAAa,YAAA,EAAc,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACnD,MAAA,OAAA,CAAQ,YAAA,CAAa,iBAAiB,QAAQ,CAAA;AAC9C,MAAA,OAAA,CAAQ,YAAA,CAAa,eAAA,EAAiB,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AACzD,MAAA,OAAA,CAAQ,KAAA,CAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,OAAO,MAAM,CAAA;AAChD,MAAA,IAAA,CAAK,eAAe,OAAO,CAAA;AAC3B,MAAA,OAAA,CAAQ,gBAAA,CAAiB,SAAS,MAAM;AACtC,QAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAM;AAAA,kBAClB,IAAA,EAAK;AAAA,MACjB,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,MAAA,CAAO,YAAY,OAAO,CAAA;AAAA,IACjC;AAEA,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,IAAA,KAAA,CAAM,YAAY,CAAA,YAAA,EAAe,GAAG,GAAG,IAAA,CAAK,MAAA,GAAS,UAAU,SAAS,CAAA,CAAA;AACxE,IAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,QAAQ,CAAA;AACnC,IAAA,KAAA,CAAM,YAAA,CAAa,cAAc,MAAM,CAAA;AACvC,IAAA,KAAA,CAAM,YAAA,CAAa,YAAA,EAAc,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAC/C,IAAA,KAAA,CAAM,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA;AAClD,IAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AAEzB,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,KAAA,CAAM,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,oBAAA,EAAsB,CAAA,EAAG,IAAA,CAAK,UAAA,EAAY,CAAA,EAAG,IAAA,CAAK,iBAAA,EAAmB,CAAA,CAAA;AAC/F,MAAA,IAAA,CAAK,MAAA,CAAO,YAAY,KAAK,CAAA;AAC7B,MAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AACzB,MAAA,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,eAAe,EAAA,EAAuB;AAC5C,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,IAAA,CAAK,MAAA;AACxB,IAAA,IAAI,UAAU,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAC5C,MAAC,CAAC,OAAO,OAAA,EAAS,QAAA,EAAU,MAAM,CAAA,CAAY,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC9D,QAAA,MAAM,KAAA,GAAQ,OAAO,IAAI,CAAA;AACzB,QAAA,IAAI,KAAA,KAAU,QAAW,EAAA,CAAG,KAAA,CAAM,YAAY,CAAA,QAAA,EAAW,IAAI,IAAI,KAAK,CAAA;AAAA,MACxE,CAAC,CAAA;AACD,MAAA,EAAA,CAAG,MAAM,WAAA,CAAY,mBAAA,EAAqB,KAAK,MAAA,CAAO,eAAA,GAAkB,MAAM,GAAG,CAAA;AACjF,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,MAAA;AACvB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,eAAA,EAAiB;AAChC,MAAC,CAAC,OAAO,OAAA,EAAS,QAAA,EAAU,MAAM,CAAA,CAAY,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC9D,QAAA,IAAI,KAAA,CAAM,IAAI,CAAA,KAAM,MAAA,EAAW,EAAA,CAAG,MAAM,WAAA,CAAY,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA;AAAA,MAC/E,CAAC,CAAA;AAAA,IACH;AACA,IAAC,CAAC,OAAO,OAAA,EAAS,QAAA,EAAU,MAAM,CAAA,CAAY,OAAA,CAAQ,CAAC,IAAA,KAAS;AAC9D,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAI,CAAA;AACxB,MAAA,IAAI,UAAU,MAAA,EAAW;AACzB,MAAA,EAAA,CAAG,KAAA,CAAM,WAAA,CAAY,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,EAAI,UAAU,MAAA,GAAS,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,IAClF,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,MAAM,WAAA,CAAY,mBAAA,EAAqB,KAAK,MAAA,CAAO,eAAA,GAAkB,MAAM,GAAG,CAAA;AAAA,EACnF;AAAA,EAEQ,UAAA,GAAqB;AAC3B,IAAA,QAAQ,KAAK,IAAA;AAAM,MACjB,KAAK,UAAA;AAAY,QAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,MAChD,KAAK,QAAA;AAAU,QAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,MAC5C,KAAK,SAAA;AAAW,QAAA,OAAO,KAAK,iBAAA,EAAkB;AAAA,MAC9C,KAAK,SAAA;AAAW,QAAA,OAAO,KAAK,iBAAA,EAAkB;AAAA,MAC9C,KAAK,SAAA;AAAW,QAAA,OAAO,KAAK,iBAAA,EAAkB;AAAA,MAC9C,KAAK,eAAA;AAAiB,QAAA,OAAO,KAAK,sBAAA,EAAuB;AAAA;AAC3D,EACF;AAAA,EAEQ,oBAAA,GAA+B;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,EAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,OAAO,cAAA,KAAmB,KAAA,IAAS,KAAK,MAAA,CAAO,cAAA,KAAmB,gBAAgB,OAAO,EAAA;AAClG,IAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,OAAA,KAAY,IAAA,CAAK,YAAA;AACtD,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,EAAY,OAAO,EAAA;AACnC,IAAA,OAAO;AAAA;AAAA,0BAAA,EAEiB,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,QAAA,EACrC,SAAS,CAAA,UAAA,EAAa,UAAA,CAAW,MAAM,CAAC,MAAM,kBAAkB;AAAA,QAAA,EAChE,UAAU,CAAA,MAAA,EAAS,UAAA,CAAW,OAAO,CAAC,YAAY,EAAE;AAAA;AAAA,IAAA,CAAA;AAAA,EAG5D;AAAA,EAEQ,iBAAA,GAA4B;AAClC,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,WAAA,KAAgB,KAAA,EAAO,OAAO,EAAA;AAC9C,IAAA,OAAO,CAAA,kDAAA,EAAqD,UAAA,CAAW,IAAA,CAAK,UAAU,CAAC,CAAA,MAAA,CAAA;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,aAAa,IAAA,EAKV;AACT,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,MAAM,EAAE,KAAA,EAAO,QAAA,GAAW,KAAA,EAAO,IAAA,EAAM,SAAQ,GAAI,IAAA;AAEnD,IAAA,MAAM,WAAA,GAAc,QAAA,GAChB,CAAA,wEAAA,EAA2E,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA,SAAA,EAAY,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA,SAAA,CAAA,GACjH,CAAA,mCAAA,EAAsC,WAAW,mBAAqB,CAAA,OAAA,CAAA;AAE1E,IAAA,MAAM,WAAA,GAAc,IAAA,GAChB,CAAA,kDAAA,EAAqD,IAAI,OAAO,WAAW,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,OAAA,EAAU,IAAA,CAAK,WAAW,CAAC,CAAA,OAAA,CAAA,GACxH,EAAA;AAEJ,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA,UAAA,EAIC,WAAW;AAAA,cAAA,EACP,KAAK,CAAA;AAAA;AAAA;AAAA,UAAA,EAGT,WAAW;AAAA,oFAAA,EAC+D,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAIlG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAoB,WAAA,EAA6B;AACvD,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,WAAA,EAAa,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,MACJ,CAAA,GAAI,WAAA,GAAc,qBAAA,GAClB,CAAA,KAAM,cAAc,uBAAA,GACpB,gBAAA;AACF,MAAA,QAAA,CAAS,KAAK,CAAA,aAAA,EAAgB,GAAG,KAAK,IAAA,CAAK,CAAC,CAAC,CAAA,OAAA,CAAS,CAAA;AACtD,MAAA,IAAI,CAAA,GAAI,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,yDAAyD,CAAA;AAAA,IAC9F;AACA,IAAA,OAAO,CAAA,qDAAA,EAAwD,QAAA,CAAS,IAAA,CAAK,EAAE,CAAC,CAAA,MAAA,CAAA;AAAA,EAClF;AAAA,EAEQ,kBAAA,GAA6B;AACnC,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,MAAM,UAAA,GAAc,CAAC,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,aAAa,OAAO,CAAA,CAC/D,GAAA,CAAI,CAAC,EAAA,KAAO;AAAA,sEAAA,EACqD,EAAE,CAAA;AAAA,6DAAA,EACX,cAAA,CAAe,EAAE,CAAC,CAAA;AAAA;AAAA,6CAAA,EAElC,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,EAAE,CAAC,CAAA;AAAA,4CAAA,EACvB,CAAA,CAAE,KAAA,CAAM,oBAAA,CAAqB,EAAE,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAIvE,CAAA,CAAE,KAAK,EAAE,CAAA;AAEZ,IAAA,OAAO;AAAA,MAAA,EACH,IAAA,CAAK,YAAA,CAAa,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,OAAA,EAAS,IAAA,EAAM,WAAA,CAAY,QAAA,EAAU,CAAC;AAAA,MAAA,EACzE,KAAK,MAAA,CAAO,QAAA,EAAU,UAAU,IAAA,CAAK,eAAA,KAAoB,EAAE;AAAA,4DAAA,EACL,CAAA,CAAE,MAAM,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,yDAAA,EAIlB,IAAA,CAAK,aAAY,GAAI,CAAA,EAAA,EAAK,KAAK,WAAA,EAAa,UAAU,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAKzG,UAAU;AAAA,QAAA,EACV,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,kBAAA,KAAuB,EAAE;AAAA;AAAA,MAAA,EAEpD,IAAA,CAAK,mBAAA,CAAoB,WAAA,CAAY,QAAQ,CAAC;AAAA,IAAA,CAAA;AAAA,EAEpD;AAAA;AAAA,EAGQ,mBAAA,GAA8B;AACpC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,cAAA;AACtC,IAAA,IAAI,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,EAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,WAAA,EAAc,UAAA,CAAW,IAAI,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,KAAK,EAAE,CAAA;AACvF,IAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,GACjB,sBAAsB,UAAA,CAAW,MAAA,CAAO,OAAO,CAAC,CAAA,MAAA,EAAW,UAAA,CAAW,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA,GAClF,sBAAsB,UAAA,CAAW,MAAA,CAAO,OAAO,CAAC,CAAA,CAAA;AACpD,IAAA,OAAO;AAAA;AAAA,iDAAA,EAEwC,KAAK,CAAA;AAAA,yCAAA,EACb,KAAK,CAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAG9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,eAAA,GAA0B;AAChC,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,QAAA;AACzB,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,IAAA,CAAK,OAAA,IAAW,UAAU,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,KAAK,OAAA,GACjB,UAAA,CAAW,KAAK,OAAO,CAAA,GACvB,GAAG,OAAO,CAAA,mDAAA,CAAA;AACd,IAAA,MAAM,QAAQ,IAAA,CAAK,YAAA,GAAe,UAAA,CAAW,IAAA,CAAK,YAAY,CAAA,GAAI,IAAA;AAClE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAE7B,IAAA,OAAO;AAAA;AAAA;AAAA;AAAA,uCAAA,EAI8B,OAAO,CAAA;AAAA;AAAA,QAAA,EAEtC,KAAA,GAAQ,CAAA,mDAAA,EAAsD,KAAK,CAAA,gCAAA,CAAA,GAAkC,EAAE;AAAA,QAAA,EACvG,KAAA,CAAM,SAAS,CAAA,GAAI;AAAA;AAAA,YAAA,EAEf,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,WAAA,EAAc,UAAA,CAAW,CAAC,CAAC,CAAA,KAAA,CAAO,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC;AAAA;AAAA,QAAA,CAAA,GAE/D,EAAE;AAAA,QAAA,EACJ,IAAA,CAAK,qBAAqB;AAAA;AAAA,IAAA,CAAA;AAAA,EAGlC;AAAA,EAEQ,iBAAA,GAA4B;AAClC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,CAAC,MAAA,KAAW;AAAA,qEAAA,EACc,UAAA,CAAW,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,0CAAA,EAChD,UAAA,CAAW,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,yCAAA,EAC1B,UAAA,CAAW,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,WAAA,IAAe,CAAA,OAAA,EAAU,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,EAAE,CAAC,CAAA;AAAA,QAAA,EACtH,OAAO,YAAA,GAAe,CAAA,GAAA,EAAM,MAAA,CAAO,YAAY,SAAS,EAAE;AAAA;AAAA,IAAA,CAE/D,CAAA,CAAE,KAAK,EAAE,CAAA;AACV,IAAA,OAAO;AAAA,MAAA,EACH,IAAA,CAAK,YAAA,CAAa,EAAE,KAAA,EAAO,cAAA,EAAgB,UAAU,IAAA,EAAM,OAAA,EAAS,kBAAA,EAAiB,CAAC;AAAA;AAAA,QAAA,EAEpF,IAAA,CAAK,eAAA,GAAkB,kDAAA,GAAgD,EAAE;AAAA,QAAA,EACzE,IAAA,CAAK,gBAAgB,CAAA,8BAAA,EAAiC,UAAA,CAAW,KAAK,aAAa,CAAC,SAAS,EAAE;AAAA,QAAA,EAC/F,OAAA,KAAY,CAAC,IAAA,CAAK,eAAA,GAAkB,iEAAiE,EAAA,CAAG;AAAA;AAAA,IAAA,CAAA;AAAA,EAGhH;AAAA,EAEQ,sBAAA,GAAiC;AACvC,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,gBAAgB,CAAA;AAC9E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,CAAC,OAAA,KAAY;AAAA,uCAAA,EACnB,QAAQ,WAAW,CAAA;AAAA,gBAAA,EAC1C,UAAA,CAAW,QAAQ,WAAA,KAAgB,UAAA,GAAa,QAAS,OAAA,CAAQ,WAAA,IAAe,WAAY,CAAC,CAAA;AAAA,WAAA,EAClG,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA;AAAA,IAAA,CAEhC,CAAA,CAAE,KAAK,EAAE,CAAA;AACV,IAAA,OAAO;AAAA,MAAA,EACH,IAAA,CAAK,YAAA,CAAa,EAAE,KAAA,EAAO,eAAA,EAAiB,UAAU,IAAA,EAAM,OAAA,EAAS,kBAAA,EAAiB,CAAC;AAAA;AAAA;AAAA,gBAAA,EAG7E,UAAA,CAAW,MAAA,EAAQ,MAAA,IAAU,SAAS,CAAC,CAAA;AAAA,aAAA,EAC1C,WAAW,MAAA,EAAQ,OAAA,IAAW,MAAA,EAAQ,WAAA,IAAe,gBAAgB,CAAC,CAAA;AAAA;AAAA;AAAA,UAAA,EAGzE,IAAA,CAAK,eAAA,GAAkB,iDAAA,GAA+C,QAAA,IAAY,sDAAsD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAQlJ;AAAA,EAEQ,gBAAA,GAA2B;AACjC,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,MAAM,MAAM,IAAA,CAAK,gBAAA;AACjB,IAAA,MAAM,UAAU,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,GAAG,KAAK,EAAC;AAEzC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAAA,kEAAA,EACwB,MAAM,CAAA;AAAA,QAAA,EAChE,MAAM;AAAA;AAAA,IAAA,CAEX,CAAA,CAAE,KAAK,EAAE,CAAA;AAEV,IAAA,OAAO;AAAA,MAAA,EACH,IAAA,CAAK,YAAA,CAAa,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,WAAA,CAAY,MAAA,EAAQ,CAAC;AAAA;AAAA;AAAA,mCAAA,EAG1D,cAAA,CAAe,GAAG,CAAC,CAAA;AAAA,gBAAA,EACtC,CAAA,CAAE,KAAA,CAAM,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA;AAAA;AAAA,UAAA,EAG7B,OAAO;AAAA;AAAA;AAAA,MAAA,EAGX,IAAA,CAAK,mBAAA,CAAoB,WAAA,CAAY,MAAM,CAAC;AAAA,IAAA,CAAA;AAAA,EAElD;AAAA,EAEQ,iBAAA,GAA4B;AAClC,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AAEf,IAAA,OAAO;AAAA,MAAA,EACH,IAAA,CAAK,YAAA,CAAa,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,OAAA,EAAS,QAAA,EAAU,IAAA,EAAM,IAAA,EAAM,WAAA,CAAY,OAAA,EAAS,CAAC;AAAA;AAAA;AAAA;AAAA,uBAAA,EAIvE,CAAA,CAAE,MAAM,sBAAsB,CAAA;AAAA;AAAA,sBAAA,EAE/B,CAAA,CAAE,MAAM,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,uDAAA,EAIkB,IAAA,CAAK,kBAAA,GAAqB,SAAA,GAAY,EAAE,CAAA;AAAA,sBAAA,EACtE,KAAK,kBAAA,GAAqB,CAAA,CAAE,MAAM,kBAAA,GAAqB,CAAA,CAAE,MAAM,gBAAgB;AAAA;AAAA,UAAA,EAE9F,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,qBAAA,GAC9B,4HACA,EAAE;AAAA,uDAAA,EACyC,IAAA,CAAK,eAAA,GAAkB,SAAA,GAAY,EAAE,CAAA;AAAA,sBAAA,EACnE,KAAK,eAAA,GAAkB,CAAA,CAAE,MAAM,eAAA,GAAkB,CAAA,CAAE,MAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uEAAA,EAOxB,IAAA,CAAK,UAAA,GAAa,WAAA,GAAc,EAAE,CAAA;AAAA,gBAAA,EACzF,KAAK,UAAA,GAAa,CAAA,CAAE,OAAO,UAAA,GAAa,CAAA,CAAE,OAAO,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,MAAA,EAIjE,IAAA,CAAK,mBAAA,CAAoB,WAAA,CAAY,OAAO,CAAC;AAAA,IAAA,CAAA;AAAA,EAEnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,iBAAA,GAA4B;AAClC,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,oBAAe,IAAI,IAAA,EAAK;AAC3C,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,kBAAA,CAAmB,MAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,OAAO,CAAA;AAEzH,IAAA,OAAO;AAAA,MAAA,EACH,IAAA,CAAK,YAAA,CAAa,EAAE,KAAA,EAAO,CAAA,CAAE,OAAO,KAAA,EAAO,OAAA,EAAS,oBAAA,EAAwB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8CAAA,EAOrC,CAAA,CAAE,OAAO,SAAS,CAAA;AAAA,sDAAA,EACR,IAAI,CAAA;AAAA,UAAA,EAClD,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,oBAAA,KAAyB,EAAE;AAAA,UAAA,EACpD,KAAK,MAAA,CAAO,QAAA,EAAU,UAAU,IAAA,CAAK,uBAAA,KAA4B,EAAE;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAI7E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,uBAAA,GAAkC;AACxC,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,QAAA;AACzB,IAAA,MAAM,QAAQ,IAAA,CAAK,YAAA,GAAe,UAAA,CAAW,IAAA,CAAK,YAAY,CAAA,GAAI,IAAA;AAClE,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,IAAA,CAAK,OAAA,IAAW,UAAU,CAAA;AACrD,IAAA,OAAO;AAAA;AAAA,QAAA,EAED,QACE,CAAA,uDAAA,EAA6D,KAAK,CAAA,MAAA,CAAA,GAClE,CAAA,uDAAA,EAA6D,OAAO,CAAA,MAAA,CACxE;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAIN;AAAA,EAEQ,UAAU,IAAA,EAAsB;AACtC,IAAA,MAAM,MAAA,GAAiC;AAAA,MACrC,IAAA,EAAM,SAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,WAAA,EAAa,SAAA;AAAA,MACb,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,OAAO,MAAA,CAAO,IAAI,CAAA,IAAK,SAAA;AAAA,EACzB;AAAA;AAAA,EAGQ,kBAAA,GAA6B;AACnC,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,eAAA,KAAoB,IAAA,CAAK,YAAA;AAC9D,IAAA,MAAM,QAAA,GAAW,MAAM,WAAA,IAAe,MAAA;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,IAAQ,MAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAErC,IAAA,IAAI,GAAA,GAAM,GAAA;AACV,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAA,GAAO,MAAM,eAAA,IAAmB,CAAA;AACtC,MAAA,MAAM,UAAU,QAAA,CAAS,eAAA;AACzB,MAAA,GAAA,GAAM,OAAA,GAAU,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,WAAA,GAAc,IAAA,KAAS,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAChG,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,WAAW,CAAA;AACnD,MAAA,SAAA,GAAY,CAAA,EAAG,UAAU,cAAA,EAAgB,WAAW,UAAA,CAAW,QAAA,CAAS,WAAW,CAAC,CAAA,CAAA;AAAA,IACtF;AAEA,IAAA,OAAO;AAAA;AAAA;AAAA,yDAAA,EAGgD,KAAK,CAAA;AAAA,gDAAA,EACd,UAAA,CAAW,QAAQ,CAAC,CAAA;AAAA,gDAAA,EACpB,WAAA,CAAY,gBAAgB,CAAA;AAAA,gDAAA,EAC5B,eAAe,CAAA;AAAA;AAAA,QAAA,EAEvD,QAAA,GAAW;AAAA,8EAAA,EAC2D,GAAG,CAAA,gEAAA,EAAmE,UAAA,CAAW,QAAA,CAAS,WAAW,CAAC,CAAA;AAAA,0DAAA,EAC1H,GAAG,CAAA;AAAA;AAAA,gDAAA,EAEb,SAAS,CAAA;AAAA,QAAA,CAAA,GAC/C,EAAE;AAAA;AAAA,IAAA,CAAA;AAAA,EAGZ;AAAA;AAAA,EAGQ,oBAAA,GAA+B;AACrC,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,WAAA,EAAa,eAAA,KAAoB,IAAA,CAAK,YAAA;AAC9D,IAAA,MAAM,YAAY,WAAA,GAAc,eAAA;AAEhC,IAAA,IAAI,QAAA,GAAW,GAAA;AACf,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAA,GAAO,MAAM,eAAA,IAAmB,CAAA;AACtC,MAAA,MAAM,UAAU,QAAA,CAAS,eAAA;AACzB,MAAA,QAAA,GAAW,OAAA,GAAU,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,SAAA,GAAY,IAAA,KAAS,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AACnG,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,SAAS,CAAA;AACjD,MAAA,SAAA,GAAY,YAAY,CAAA,GACpB,CAAA,EAAG,SAAA,CAAU,cAAA,EAAgB,CAAA,QAAA,EAAW,UAAA,CAAW,QAAA,CAAS,WAAW,CAAC,CAAA,CAAA,GACxE,CAAA,UAAA,EAAgB,UAAA,CAAW,QAAA,CAAS,WAAW,CAAC,CAAA,SAAA,CAAA;AAAA,IACtD;AAEA,IAAA,OAAO;AAAA;AAAA,8CAAA,EAEqC,eAAe,CAAA;AAAA,QAAA,EACrD,QAAA,GAAW;AAAA,0FAAA,EACuE,QAAQ,CAAA,gEAAA,EAAmE,UAAA,CAAW,QAAA,CAAS,WAAW,CAAC,CAAA;AAAA,0DAAA,EAC3I,QAAQ,CAAA;AAAA;AAAA,gDAAA,EAElB,SAAS,CAAA;AAAA,QAAA,CAAA,GAC/C,EAAE;AAAA;AAAA,IAAA,CAAA;AAAA,EAGZ;AAAA,EAEQ,eAAe,KAAA,EAA0B;AAC/C,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AAEf,IAAA,KAAA,CAAM,aAAA,CAAc,uBAAuB,CAAA,EAAG,gBAAA,CAAiB,SAAS,MAAM,IAAA,CAAK,OAAO,CAAA;AAC1F,IAAA,KAAA,CAAM,aAAA,CAAc,sBAAsB,CAAA,EAAG,gBAAA,CAAiB,SAAS,MAAM;AAC3E,MAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAAE,QAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAAY,QAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,MAAM,CAAA,MAAA,IAC3E,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW;AAAE,QAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AAAU,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,MAAM,CAAA,MAAA,IAC7E,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW;AAAE,QAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAAA,MAAY,CAAA,MAAA,IACnD,IAAA,CAAK,IAAA,KAAS,eAAA,EAAiB;AAAE,QAAA,IAAA,CAAK,IAAA,GAAO,SAAA;AAAW,QAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,MAAM;AAC/F,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IACd,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,aAAA,CAAc,yBAAyB,CAAA,EAAG,gBAAA,CAAiB,SAAS,MAAM;AAC9E,MAAA,KAAK,KAAK,mBAAA,EAAoB;AAAA,IAChC,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,gBAAA,CAAiB,kBAAkB,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AAC1D,MAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAClC,QAAA,MAAM,QAAA,GAAY,IAAoB,OAAA,CAAQ,QAAA;AAC9C,QAAA,IAAI,QAAA,EAAU,KAAK,IAAA,CAAK,oBAAA,CAAqB,QAAQ,CAAA;AAAA,MACvD,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,aAAA,CAAc,gCAAgC,CAAA,EAAG,gBAAA,CAAiB,SAAS,MAAM;AACrF,MAAA,KAAK,IAAA,CAAK,oBAAoB,KAAK,CAAA;AAAA,IACrC,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,gBAAA,CAAiB,iBAAiB,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACzD,MAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAClC,QAAA,IAAA,CAAK,gBAAA,GAAoB,IAAoB,OAAA,CAAQ,QAAA;AACrD,QAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AACZ,QAAA,IAAA,CAAK,MAAA,EAAO;AAAA,MACd,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,gBAAA,CAAiB,eAAe,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACvD,MAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAClC,QAAA,IAAA,CAAK,cAAA,GAAkB,GAAA,CAAoB,OAAA,CAAQ,MAAA,IAAU,IAAA;AAC7D,QAAA,IAAA,CAAK,IAAA,GAAO,SAAA;AACZ,QAAA,IAAA,CAAK,MAAA,EAAO;AAAA,MACd,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,aAAA,CAAc,4BAA4B,CAAA,EAAG,gBAAA,CAAiB,SAAS,MAAM;AACjF,MAAA,IAAA,CAAK,UAAU,mBAAA,EAAoB;AAAA,IACrC,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,aAAA,CAAc,mCAAmC,CAAA,EAAG,gBAAA,CAAiB,SAAS,MAAM;AACxF,MAAA,IAAA,CAAK,UAAU,kBAAA,IAAqB;AAAA,IACtC,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,aAAA,CAAc,yBAAyB,CAAA,EAAG,gBAAA,CAAiB,SAAS,MAAM;AAC9E,MAAA,IAAA,CAAK,UAAU,wBAAA,IAA2B;AAAA,IAC5C,CAAC,CAAA;AAED,IAAA,MAAM,eAAe,MAAY;AAC/B,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,aAAA,CAAc,iBAAiB,CAAA;AACtD,MAAA,MAAM,WAAA,GAAc,QAAA,EAAU,KAAA,EAAO,IAAA,EAAK,IAAK,EAAA;AAC/C,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,aAAA,CAAc,cAAc,CAAA;AAKlD,MAAA,MAAM,sBAAA,GAAyB,EAAA;AAC/B,MAAA,IAAI,WAAA,CAAY,SAAS,sBAAA,EAAwB;AAC/C,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,OAAA,CAAQ,WAAA,GAAc,GAAG,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,EAAA,EAAK,WAAA,CAAY,MAAM,CAAA,CAAA,EAAI,sBAAsB,CAAA,CAAA,CAAA;AACxF,UAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,OAAA;AAAA,QAC1B;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,WAAA,uBAAkB,IAAA,EAAK;AAC5B,MAAA,IAAA,CAAK,MAAA,EAAO;AAEZ,MAAA,IAAA,CAAK,UAAU,QAAA,CAAS;AAAA,QACtB,UAAU,IAAA,CAAK,gBAAA;AAAA,QACf,WAAA;AAAA,QACA,MAAA,EAAQ,KAAK,cAAA,IAAkB;AAAA,OAChC,CAAA;AAED,MAAA,IAAA,CAAK,YAAA,GAAe,WAAW,MAAM;AACnC,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,QAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,QAAA,IAAA,CAAK,IAAA,GAAO,SAAA;AACZ,QAAA,IAAA,CAAK,MAAA,EAAO;AACZ,QAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACrC,UAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,UAAA,IAAI,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW,IAAA,CAAK,KAAA,EAAM;AAAA,QAC1C,GAAG,IAAI,CAAA;AAAA,MACT,GAAG,GAAG,CAAA;AAAA,IACR,CAAA;AAEA,IAAA,KAAA,CAAM,aAAA,CAAc,wBAAwB,CAAA,EAAG,gBAAA,CAAiB,SAAS,YAAY,CAAA;AAErF,IAAA,KAAA,CAAM,gBAAA,CAAiB,SAAA,EAAW,CAAC,CAAA,KAAM;AACvC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,IAAA,CAAK,KAAA,EAAM;AACX,QAAA;AAAA,MACF;AAIA,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,SAAA,IAAa,gBAAA,CAAiB,CAAC,CAAA,EAAG;AAClD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,YAAA,EAAa;AAAA,MACf;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,UAAU,KAAA,EAA0B;AAC1C,IAAA,qBAAA,CAAsB,MAAM;AAI1B,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,aAAA,CAAc,UAAU,CAAA;AAC/C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,KAAA,EAAM;AACf,QAAA;AAAA,MACF;AACA,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,gBAAA,CAAiB,8BAA8B,CAAA;AACvE,MAAA,IAAI,UAAU,MAAA,GAAS,CAAA,EAAI,SAAA,CAAU,CAAC,EAAkB,KAAA,EAAM;AAAA,IAChE,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,WAAA,GAAsB;AAC5B,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,CAAC,GAAA,EAAK,WAAW,GAAA,IAAO,MAAA,CAAO,YAAA,IAAgB,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,EACzF;AAAA,EAEA,MAAc,mBAAA,GAAqC;AACjD,IAAA,IAAA,CAAK,IAAA,GAAO,SAAA;AACZ,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,kBAAkB,MAAM,IAAA,CAAK,SAAA,CAAU,wBAAA,QAAgC,EAAC;AAAA,IAC/E,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,aAAA,GAAgB,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,yBAAA;AAAA,IAC5D,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAc,qBAAqB,QAAA,EAAiC;AAClE,IAAA,IAAA,CAAK,gBAAA,GAAmB,QAAA;AACxB,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AACZ,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,mBAAmB,MAAM,IAAA,CAAK,UAAU,yBAAA,GAA4B,QAAQ,KAAK,EAAC;AAAA,IACzF,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,aAAA,GAAgB,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AAAA,IAC5D,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,KAAA,EAAmC;AACnE,IAAA,MAAM,WAAW,IAAA,CAAK,gBAAA;AACtB,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,aAAA,CAAc,8BAA8B,CAAA;AACnE,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,aAAA,CAAc,gCAAgC,CAAA;AACxE,IAAA,MAAM,IAAA,GAAO,QAAA,EAAU,KAAA,CAAM,IAAA,EAAK,IAAK,EAAA;AAGvC,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,IAAA,IAAQ,KAAK,eAAA,EAAiB;AAChD,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAI,WAAA,cAAyB,QAAA,GAAW,IAAA;AACxC,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,SAAA,CAAU,eAAA,GAAkB,QAAA,EAAU,IAAI,CAAA;AAIrD,MAAA,IAAI,QAAA,WAAmB,KAAA,GAAQ,EAAA;AAC/B,MAAA,MAAM,IAAA,CAAK,qBAAqB,QAAQ,CAAA;AAAA,IAC1C,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,aAAA,GAAgB,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,uBAAA;AAC1D,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IACd;AAAA,EACF;AAAA;AAAA,EAIA,eAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA,EAEA,kBAAA,GAAqC;AACnC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,gBAAgB,CAAA;AAAA,EACnD;AAAA,EAEA,0BAA0B,QAAA,EAA+C;AACvE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,CAAA,gBAAA,EAAmB,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,EAClE;AAAA,EAEA,wBAAwB,KAAA,EAA+B;AACrD,IAAA,OACE,MAAM,IAAA,CAAK,IAAA,CAAK,OAAO,gBAAA,CAAiB,eAAe,CAAC,CAAA,CAAE,IAAA;AAAA,MACxD,CAAC,EAAA,KAAQ,EAAA,CAAmB,OAAA,CAAQ,MAAA,KAAW;AAAA,KACjD,IAAK,IAAA;AAAA,EAET;AAAA,EAEA,uBAAA,GAA0C;AACxC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,wBAAwB,CAAA;AAAA,EAC3D;AAAA,EAEA,oBAAA,GAA6B;AAC3B,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,IAAA,EAAK;AAAA,EACZ;AAAA,EAEA,uBAAuB,QAAA,EAAqC;AAC1D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAK;AAC5B,IAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IACd;AACA,IAAA,IAAA,CAAK,gBAAA,GAAmB,QAAA;AACxB,IAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AACZ,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAEA,qBAAqB,KAAA,EAAqB;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,SAAS,QAAA,EAAU;AAC5C,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,IAAA,IAAA,CAAK,IAAA,GAAO,SAAA;AACZ,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAEA,wBAAA,GAAiC;AAC/B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,iBAAiB,CAAA;AAC5D,IAAA,QAAA,EAAU,KAAA,EAAM;AAAA,EAClB;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,wBAAwB,CAAA;AACjE,IAAA,MAAA,EAAQ,KAAA,EAAM;AAAA,EAChB;AACF;;;AC5jCA,SAAS,SAAS,EAAA,EAAgD;AAChE,EAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,EAAA,MAAM,CAAA,GAAI,GAAG,qBAAA,EAAsB;AACnC,EAAA,IAAI,EAAE,KAAA,KAAU,CAAA,IAAK,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,IAAA;AAC5C,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,MAAA,GAAS,CAAA,EAAE;AAC5D;AAEO,SAAS,wBAAwB,MAAA,EAA2B;AACjE,EAAA,IAAI,OAAO,eAAe,WAAA,EAAa;AAEvC,EAAA,MAAM,GAAA,GAA8B;AAAA,IAClC,KAAA,EAAO,MAAM,MAAA,CAAO,YAAA,EAAa;AAAA,IACjC,OAAA,EAAS,MAAM,MAAA,CAAO,eAAA,EAAgB;AAAA,IACtC,gBAAA,EAAkB,MAAM,QAAA,CAAS,MAAA,CAAO,oBAAoB,CAAA;AAAA,IAC5D,mBAAmB,CAAC,QAAA,KAAa,SAAS,MAAA,CAAO,yBAAA,CAA0B,QAAQ,CAAC,CAAA;AAAA,IACpF,iBAAiB,CAAC,KAAA,KAAU,SAAS,MAAA,CAAO,uBAAA,CAAwB,KAAK,CAAC,CAAA;AAAA,IAC1E,eAAA,EAAiB,MAAM,QAAA,CAAS,MAAA,CAAO,yBAAyB,CAAA;AAAA,IAChE,YAAA,EAAc,MAAM,MAAA,CAAO,oBAAA,EAAqB;AAAA,IAChD,cAAA,EAAgB,CAAC,QAAA,KAAa,MAAA,CAAO,uBAAuB,QAAQ,CAAA;AAAA,IACpE,YAAA,EAAc,CAAC,KAAA,KAAU,MAAA,CAAO,qBAAqB,KAAK,CAAA;AAAA,IAC1D,gBAAA,EAAkB,MAAM,MAAA,CAAO,wBAAA,EAAyB;AAAA,IACxD,MAAA,EAAQ,MAAM,MAAA,CAAO,cAAA;AAAe,GACtC;AAEA,EAAC,WAAgF,eAAA,GAAkB,GAAA;AACrG;;;ACpCA,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,sBAAA,GAAyB,GAAA;AAC/B,IAAM,qBAAA,GAAwB,GAAA;AAC9B,IAAM,2BAAA,GAA8B,EAAA;AACpC,IAAM,sBAAA,GAAyB,wBAAA;AAU/B,IAAI,gBAA+B,EAAC;AACpC,IAAI,UAAA,GAAoD,IAAA;AACxD,IAAI,UAAA,GAAoD,IAAA;AACxD,IAAI,aAAA,GAA+B,IAAA;AACnC,IAAI,iBAAA,GAAiF,IAAA;AACrF,IAAI,iBAAA,GAAmC,IAAA;AACvC,IAAI,SAAA,GAAmC,IAAA;AACvC,IAAI,OAAA,GAAU,KAAA;AACd,IAAI,SAAA,GAAoC,IAAA;AACxC,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAM,cAAA,GAAiB,IAAI,EAAA,GAAK,GAAA;AAGhC,IAAM,UAAA,uBAAiB,GAAA,EAAY;AAMnC,SAAS,cAAc,SAAA,EAA2B;AAChD,EAAA,OAAO,yBAAyB,SAAS,CAAA,CAAA;AAC3C;AAEA,SAAS,iBAAiB,SAAA,EAA4B;AACpD,EAAA,IAAI;AACF,IAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,aAAA,CAAc,SAAS,CAAC,CAAA,KAAM,GAAA;AAAA,EAC5D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,iBAAA,CAAkB,WAAmB,OAAA,EAAwB;AACpE,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,YAAA,CAAa,OAAA,CAAQ,aAAA,CAAc,SAAS,CAAA,EAAG,GAAG,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,UAAA,CAAW,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA,IAClD;AACA,IAAA,OAAA,GAAU,OAAA;AACV,IAAA,SAAA,EAAW,cAAA,CAAe,aAAA,IAAiB,EAAA,EAAI,EAAC,EAAG,EAAE,OAAA,EAAS,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EACzF,CAAA,CAAA,MAAQ;AAAA,EAAyB;AACnC;AAMA,SAAS,WAAA,GAAsB;AAC7B,EAAA,OAAA,qBAAW,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAC7C;AAEA,SAAS,uBAAuB,SAAA,EAA2B;AACzD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,cAAA,CAAe,OAAA,CAAQ,CAAA,EAAG,sBAAsB,GAAG,SAAS,CAAA,CAAA,EAAI,WAAA,EAAa,CAAA,CAAE,CAAA;AAC3F,IAAA,OAAO,GAAA,GAAM,QAAA,CAAS,GAAA,EAAK,EAAE,CAAA,GAAI,CAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,CAAA;AAAA,EAAG;AACtB;AAEA,SAAS,wBAAwB,SAAA,EAA2B;AAC1D,EAAA,MAAM,QAAQ,WAAA,EAAY;AAC1B,EAAA,MAAM,MAAM,CAAA,EAAG,sBAAsB,CAAA,EAAG,SAAS,IAAI,KAAK,CAAA,CAAA;AAC1D,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAQ,sBAAA,CAAuB,SAAS,CAAA,GAAI,CAAA;AAClD,IAAA,cAAA,CAAe,OAAA,CAAQ,GAAA,EAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,EAAA;AAAA,EAAI;AACvB;AAgBO,SAAS,YAAY,GAAA,EAA2B;AACrD,EAAA,SAAA,GAAY,GAAA,CAAI,MAAA;AAChB,EAAA,aAAA,GAAgB,GAAA,CAAI,MAAA;AACpB,EAAA,iBAAA,GAAoB,IAAI,MAAA,IAAU,IAAA;AAClC,EAAA,iBAAA,GAAoB,IAAI,aAAA,IAAiB,IAAA;AAEzC,EAAA,MAAM,EAAE,WAAU,GAAI,GAAA;AACtB,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AAAA,IACnB,kBAAA;AAAA,IACA,GAAA,CAAI,OAAO,eAAA,IAAmB;AAAA,GAChC;AAGA,EAAA,IAAI,GAAA,CAAI,MAAA,CAAO,WAAA,KAAgB,MAAA,EAAQ;AACrC,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,iBAAA,CAAkB,WAAW,IAAI,CAAA;AAAA,EACnC,CAAA,MAAO;AACL,IAAA,OAAA,GAAU,iBAAiB,SAAS,CAAA;AAAA,EACtC;AAGA,EAAA,IAAI,GAAA,CAAI,OAAO,aAAA,EAAe;AAC5B,IAAA,wBAAA,CAAyB,SAAS,CAAA;AAAA,EACpC;AAGA,EAAA,IAAI,UAAA,gBAA0B,UAAU,CAAA;AACxC,EAAA,UAAA,GAAa,WAAA,CAAY,MAAM,KAAA,CAAM,GAAG,GAAG,OAAO,CAAA;AAGlD,EAAA,IAAI,UAAA,gBAA0B,UAAU,CAAA;AACxC,EAAA,UAAA,GAAa,YAAY,MAAM;AAC7B,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,EAAe;AAChC,IAAA,MAAM,OAAA,GAAU,uBAAuB,SAAS,CAAA;AAChD,IAAA,IAAI,UAAU,2BAAA,EAA6B;AACzC,MAAA,uBAAA,CAAwB,SAAS,CAAA;AACjC,MAAA,OAAA,CAAQ,EAAE,QAAQ,gBAAA,EAAkB,QAAA,EAAU,EAAE,aAAA,EAAe,OAAA,GAAU,CAAA,EAAE,EAAG,CAAA;AAAA,IAChF;AAAA,EACF,GAAG,qBAAqB,CAAA;AAGxB,EAAA,IAAI,GAAA,CAAI,OAAO,YAAA,EAAc;AAC3B,IAAA,iBAAA,CAAkB,aAAa,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS;AAC9C,MAAA,IAAI,IAAA,EAAM,eAAA,CAAgB,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AAAA,IAC5C,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,GAAA,CAAI,MAAA,CAAO,WAAA,KAAgB,MAAA,IAAU,CAAC,OAAA,EAAS;AACjD,IAAA,mBAAA,CAAoB,SAAA,EAAW,IAAI,MAAM,CAAA;AAAA,EAC3C;AACF;AAGO,SAAS,iBAAA,CACd,QACA,MAAA,EACM;AACN,EAAA,aAAA,GAAgB,MAAA;AAChB,EAAA,iBAAA,GAAoB,MAAA,IAAU,IAAA;AAE9B,EAAA,SAAA,GAAY,IAAA;AACZ,EAAA,aAAA,GAAgB,CAAA;AAClB;AAGO,SAAS,QAAQ,KAAA,EAAiC;AACvD,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,EAAe;AAChC,EAAA,aAAA,CAAc,IAAA,CAAK,EAAE,GAAG,KAAA,EAAO,UAAU,IAAA,CAAK,GAAA,IAAO,CAAA;AACvD;AAGA,eAAsB,MAAM,GAAA,EAAoC;AAC9D,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,aAAA,IAAiB,aAAA,CAAc,WAAW,CAAA,EAAG;AAG9D,EAAA,IAAI,OAAA,GAAyB,IAAA;AAC7B,EAAA,IAAI,GAAA,CAAI,OAAO,eAAA,EAAiB;AAC9B,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAAM,GAAA,CAAI,MAAA,CAAO,eAAA,EAAgB;AAAA,IAC7C,CAAA,CAAA,MAAQ;AAAA,IAGR;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,MAAA,CAAO,CAAA,EAAG,GAAG,CAAA;AACzC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,CAAI,MAAA,CAAO,cAAA,CAAe,aAAA,EAAe,KAAA,EAAO;AAAA,MACpD,YAAY,iBAAA,IAAqB,KAAA,CAAA;AAAA,MACjC,mBAAmB,iBAAA,IAAqB,KAAA,CAAA;AAAA,MACxC,OAAA,EAAS,IAAA;AAAA,MACT,SAAS,OAAA,IAAW,KAAA;AAAA,KACrB,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAGN,IAAA,aAAA,CAAc,QAAQ,GAAG,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,EAC7C;AACF;AAEA,eAAsB,QAAQ,MAAA,EAAiD;AAC7E,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,IAAI,SAAA,IAAa,GAAA,GAAM,aAAA,GAAgB,cAAA,EAAgB,OAAO,SAAA;AAC9D,EAAA,OAAO,kBAAkB,MAAM,CAAA;AACjC;AAEA,eAAe,kBAAkB,MAAA,EAAiD;AAChF,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,EAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAAU,SAAA,CAAU,MAAM,CAAA;AAC5C,EAAA,IAAI,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,IAAA,EAAM;AACtB,IAAA,SAAA,GAAY,GAAA,CAAI,IAAA;AAChB,IAAA,aAAA,GAAgB,KAAK,GAAA,EAAI;AACzB,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAmBA,IAAI,aAAA,GAAyC,IAAA;AAC7C,IAAI,YAAA,GAAiD,IAAA;AAErD,IAAI,aAAA,GAAiD,IAAA;AACrD,IAAI,SAAA,GAAY,EAAA;AAEhB,SAAS,yBAAyB,SAAA,EAAyB;AAEzD,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,MAAM,QAAQ,QAAA,CAAS,QAAA;AACvB,IAAA,IAAI,UAAU,SAAA,EAAW;AACzB,IAAA,SAAA,GAAY,KAAA;AACZ,IAAA,MAAM,UAAA,GAAa,CAAC,UAAA,CAAW,GAAA,CAAI,GAAG,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAC1D,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,UAAA,CAAW,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AACtC,MAAA,OAAA,CAAQ,EAAE,MAAA,EAAQ,4BAAA,EAA8B,UAAU,EAAE,KAAA,IAAS,CAAA;AAAA,IACvE;AAAA,EACF,CAAA;AAEA,EAAA,aAAA,GAAgB,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AAC9C,EAAA,OAAA,CAAQ,SAAA,GAAY,YAAa,IAAA,EAA4C;AAC3E,IAAA,aAAA,CAAe,GAAG,IAAI,CAAA;AACtB,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,SAAS,CAAA;AAC7C,EAAA,SAAA,EAAU;AAGV,EAAA,aAAA,GAAgB,IAAI,gBAAA,CAAiB,MAAM,SAAA,EAAW,CAAA;AACtD,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,KAAK,QAAA,CAAS,IAAA;AACxD,EAAA,aAAA,CAAc,QAAQ,IAAA,EAAM,EAAE,WAAW,IAAA,EAAM,OAAA,EAAS,OAAO,CAAA;AAG/D,EAAA,YAAA,GAAe,CAAC,CAAA,KAAkB;AAChC,IAAA,MAAM,MAAA,GAAU,CAAA,CAAE,MAAA,CAAuB,OAAA,CAAQ,eAAe,CAAA;AAChE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,MAAA,GAAS,OAAO,OAAA,CAAQ,MAAA;AAC9B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,OAAA,CAAQ,EAAE,MAAA,EAAQ,kBAAA,EAAoB,QAAA,EAAU,EAAE,QAAQ,KAAA,EAAO,QAAA,CAAS,QAAA,EAAS,EAAG,CAAA;AAAA,EACxF,CAAA;AACA,EAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,YAAA,EAAc,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AACnF;AAwBA,IAAI,SAAA,GAAgC,IAAA;AAEpC,SAAS,eAAA,CAAgB,MAAuB,MAAA,EAAkC;AAChF,EAAA,IAAI,CAAC,OAAO,YAAA,EAAc;AAC1B,EAAA,IAAI,SAAA,YAAqB,MAAA,EAAO;AAEhC,EAAA,SAAA,GAAY,QAAA,CAAS,cAAc,KAAK,CAAA;AACxC,EAAA,SAAA,CAAU,EAAA,GAAK,kBAAA;AACf,EAAA,MAAA,CAAO,MAAA,CAAO,UAAU,KAAA,EAAO;AAAA,IAC7B,QAAA,EAAU,OAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,YAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,MAAM,SAAS,SAAA,CAAU,YAAA,CAAa,EAAE,IAAA,EAAM,UAAU,CAAA;AACxD,EAAA,MAAA,CAAO,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,EA4BP,KAAK,WAAW,CAAA;AAAA;AAAA,EAAA,CAAA;AAI5B,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,SAAS,CAAA;AACrC;AAWA,IAAI,WAAA,GAAkC,IAAA;AAEtC,SAAS,mBAAA,CAAoB,WAAmB,MAAA,EAAkC;AAChF,EAAA,IAAI,WAAA,EAAa;AAEjB,EAAA,WAAA,GAAc,QAAA,CAAS,cAAc,KAAK,CAAA;AAC1C,EAAA,WAAA,CAAY,EAAA,GAAK,sBAAA;AACjB,EAAA,MAAA,CAAO,MAAA,CAAO,YAAY,KAAA,EAAO;AAAA,IAC/B,QAAA,EAAU,OAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,YAAA;AAAA,IACR,QAAA,EAAU,OAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,MAAM,SAAS,WAAA,CAAY,YAAA,CAAa,EAAE,IAAA,EAAM,UAAU,CAAA;AAC1D,EAAA,MAAA,CAAO,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAqCnB,EAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,CAAA,EAAG,gBAAA,CAAiB,SAAS,MAAM;AAC/D,IAAA,iBAAA,CAAkB,WAAW,IAAI,CAAA;AACjC,IAAA,WAAA,EAAa,MAAA,EAAO;AACpB,IAAA,WAAA,GAAc,IAAA;AACd,IAAA,IAAI,MAAA,CAAO,gBAAgB,aAAA,EAAe;AACxC,MAAA,iBAAA,CAAkB,aAAa,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS;AAC9C,QAAA,IAAI,IAAA,EAAM,eAAA,CAAgB,IAAA,EAAM,MAAM,CAAA;AAAA,MACxC,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,cAAA,CAAe,SAAS,CAAA,EAAG,gBAAA,CAAiB,SAAS,MAAM;AAChE,IAAA,iBAAA,CAAkB,WAAW,KAAK,CAAA;AAClC,IAAA,WAAA,EAAa,MAAA,EAAO;AACpB,IAAA,WAAA,GAAc,IAAA;AAAA,EAChB,CAAC,CAAA;AAED,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,WAAW,CAAA;AACvC;;;AC7bA,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,kBAAA,GAAqB,GAAA;AAQpB,SAAS,oBAAA,GAAuC;AACrD,EAAA,MAAM,UAA+B,EAAC;AACtC,EAAA,MAAM,YAAmE,EAAC;AAC1E,EAAA,MAAM,SAA4C,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,QAAQ,OAAO,CAAA;AAE1F,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,QAAQ,KAAK,CAAA;AAC9B,IAAA,SAAA,CAAU,KAAK,CAAA,GAAI,QAAA;AAEnB,IAAA,OAAA,CAAQ,KAAK,CAAA,GAAI,CAAA,GAAI,IAAA,KAAoB;AACvC,MAAA,MAAM,OAAA,GAAU,IAAA,CACb,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,QAAA,IAAI;AACF,UAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,GAAM,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,QAC3D,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,OAAO,GAAG,CAAA;AAAA,QACnB;AAAA,MACF,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA,CACR,KAAA,CAAM,GAAG,kBAAkB,CAAA;AAE9B,MAAA,MAAM,KAAA,GAA2B;AAAA,QAC/B,KAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAA;AAAI,OACtB;AAEA,MAAA,IAAI,KAAA,KAAU,OAAA,IAAW,IAAA,CAAK,CAAC,aAAa,KAAA,EAAO;AACjD,QAAA,KAAA,CAAM,QAAS,IAAA,CAAK,CAAC,EAAY,KAAA,EAAO,KAAA,CAAM,GAAG,GAAI,CAAA;AAAA,MACvD;AAEA,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,MAAA,IAAI,OAAA,CAAQ,SAAS,WAAA,EAAa;AAChC,QAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,MAChB;AAEA,MAAA,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,IAChC,CAAA;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,UAAA,GAAa;AACX,MAAA,OAAO,CAAC,GAAG,OAAO,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,KAAA,GAAQ;AACN,MAAA,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG;AACpB,UAAA,OAAA,CAAQ,KAAK,CAAA,GAAI,SAAA,CAAU,KAAK,CAAA;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;ACtDO,IAAM,6BAAA,GAAmD;AAAA,EAC9D,mBAAA;AAAA,EACA,uBAAA;AAAA,EACA,6BAAA;AAAA,EACA;AACF,CAAA;AAEO,SAAS,cAAc,KAAA,EAAkC;AAC9D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,KAAA,YAAiB,GAAA,EAAK,OAAO,KAAA,CAAM,IAAA;AACvC,EAAA,OAAO,KAAA,CAAM,GAAA;AACf;AAEO,SAAS,sBAAA,CACd,OACA,IAAA,EACiC;AACjC,EAAA,MAAM,MAAA,GAAU,OACX,0BAA0B,CAAA;AAC/B,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,IAAA,EAAM,OAAA,EAAS,qBAAqB,CAAA;AAClE,EAAA,IAAI,YAAY,OAAO,UAAA;AAEvB,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,KAAA,YAAiB,OAAA,EAAS;AAC9D,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA;AAC7D,IAAA,IAAI,eAAe,OAAO,aAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,oBAAA,CAAqB,GAAA,EAAa,OAAA,GAAkC,EAAC,EAAY;AAC/F,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,6BAAA,EAA+B,GAAI,OAAA,CAAQ,UAAA,IAAc,EAAG,CAAA;AACjF,EAAA,IAAI,QAAA,CAAS,KAAK,CAAC,OAAA,KAAY,WAAW,GAAA,EAAK,OAAO,CAAC,CAAA,EAAG,OAAO,IAAA;AAEjE,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,OAAA,CAAQ,WAAW,CAAA;AACvD,EAAA,OAAO,WAAW,sBAAA,CAAuB,GAAG,CAAA,CAAE,UAAA,CAAW,QAAQ,CAAA,GAAI,KAAA;AACvE;AAEO,SAAS,UAAA,CAAW,KAAa,OAAA,EAAmC;AACzE,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO,sBAAA,CAAuB,GAAG,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA;AAAA,EACrD;AACA,EAAA,OAAA,CAAQ,SAAA,GAAY,CAAA;AACpB,EAAA,OAAO,OAAA,CAAQ,KAAK,GAAG,CAAA;AACzB;AAEO,SAAS,mBAAmB,GAAA,EAA6B;AAC9D,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,OAAO,sBAAA,CAAuB,GAAG,CAAA,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACvD;AAEO,SAAS,oBAAoB,GAAA,EAAuB;AACzD,EAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,OAAO,MAAA,CAAO,QAAA,KAAa,WAAA,IACtB,MAAA,CAAO,QAAA,KAAa,WAAA,IACpB,MAAA,CAAO,QAAA,KAAa,KAAA,IACpB,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,4BAAA,CAA6B,KAAK,GAAG,CAAA;AAAA,EAC9C;AACF;AAEA,SAAS,uBAAuB,GAAA,EAAqB;AACnD,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,IAAI,GAAA,EAAK,OAAO,aAAa,WAAA,GAAc,QAAA,CAAS,IAAA,GAAO,kBAAkB,CAAA,CAAE,IAAA;AAAA,EAC5F,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAEA,SAAS,UAAA,CAAW,SAAkC,IAAA,EAA6B;AACjF,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,YAAmB,OAAA,EAAS;AAChE,IAAA,OAAO,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,EACzB;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,GAAG,CAAA,KAAM,GAAA,CAAI,WAAA,EAAY,KAAM,IAAA,CAAK,WAAA,EAAa,CAAA;AAC9E,IAAA,OAAO,KAAA,GAAQ,CAAC,CAAA,IAAK,IAAA;AAAA,EACvB;AACA,EAAA,MAAM,MAAA,GAAS,OAAA;AACf,EAAA,OAAO,OAAO,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,WAAA,EAAa,CAAA,IAAK,IAAA;AACvD;;;AC9FA,IAAMA,YAAAA,GAAc,EAAA;AAcb,SAAS,oBAAA,CAAqB,OAAA,GAAiC,EAAC,EAAmB;AACxF,EAAA,MAAM,UAA+B,EAAC;AACtC,EAAA,MAAM,gBAAgB,UAAA,CAAW,KAAA;AACjC,EAAA,IAAI,aAAA,GAAgB,OAAA;AAEpB,EAAA,UAAA,CAAW,KAAA,GAAQ,eAAe,qBAAA,CAChC,KAAA,EACA,IAAA,EACmB;AACnB,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,MAAA,GAAS,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAY,IAAK,KAAA;AAC9C,IAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,IAAA,MAAM,YAAA,GAAe,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AACvD,IAAA,MAAM,eAAe,CAAC,YAAA,IAAgB,CAAC,oBAAA,CAAqB,KAAK,aAAa,CAAA;AAE9E,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,aAAA,CAAc,IAAA,CAAK,UAAA,EAAY,OAAO,IAAI,CAAA;AAEjE,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,QAAA,CAAS;AAAA,UACP,MAAA;AAAA,UACA,GAAA,EAAK,YAAY,GAAG,CAAA;AAAA,UACpB,QAAQ,QAAA,CAAS,MAAA;AAAA,UACjB,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,UACvB,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,QAAA,CAAS;AAAA,UACP,MAAA;AAAA,UACA,GAAA,EAAK,YAAY,GAAG,CAAA;AAAA,UACpB,MAAA,EAAQ,CAAA;AAAA,UACR,QAAA,EAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,UACvB,SAAA,EAAW,SAAA;AAAA,UACX,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SACjD,CAAA;AAAA,MACH;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF,CAAA;AAEA,EAAA,SAAS,SAAS,KAAA,EAAgC;AAChD,IAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,IAAA,IAAI,OAAA,CAAQ,SAASA,YAAAA,EAAa;AAChC,MAAA,OAAA,CAAQ,KAAA,EAAM;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,UAAA,GAAa;AACX,MAAA,OAAO,CAAC,GAAG,OAAO,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,KAAA,GAAQ;AACN,MAAA,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,cAAc,WAAA,EAAa;AACzB,MAAA,aAAA,GAAgB,WAAA;AAAA,IAClB,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,UAAA,CAAW,KAAA,GAAQ,aAAA;AAAA,IACrB;AAAA,GACF;AACF;AAEA,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,MAAA;AACtC,IAAA,IAAI,IAAA,CAAK,SAAS,GAAA,EAAK;AACrB,MAAA,OAAO,OAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAAA,IAC9C;AACA,IAAA,OAAO,OAAO,MAAA,GAAS,IAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAAA,EACzB;AACF;;;ACpFO,SAAS,uBAAA,CAAwB,OAAA,GAAoC,EAAC,EAAsB;AACjG,EAAA,IAAI,aAAA,GAAgB,OAAA;AAEpB,EAAA,eAAe,IAAA,GAA+B;AAC5C,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAI5C,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,MAAA,MAAM,QAAQ,MAAA,CAAO,UAAA;AACrB,MAAA,MAAM,SAAS,MAAA,CAAO,WAAA;AACtB,MAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,gBAAA,IAAoB,GAAG,CAAC,CAAA;AAEpD,MAAA,MAAA,CAAO,QAAQ,KAAA,GAAQ,GAAA;AACvB,MAAA,MAAA,CAAO,SAAS,MAAA,GAAS,GAAA;AACzB,MAAA,GAAA,CAAI,KAAA,CAAM,KAAK,GAAG,CAAA;AAGlB,MAAA,MAAM,YAAA,GAAe,wBAAA,CAAyB,aAAA,CAAc,OAAO,CAAA;AACnE,MAAA,MAAM,OAAA,GAAU;AAAA,uDAAA,EACmC,KAAK,aAAa,MAAM,CAAA;AAAA;AAAA;AAAA,cAAA,EAGjE,IAAI,aAAA,EAAc,CAAE,iBAAA,CAAkB,YAAY,CAAC;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAM7D,MAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,OAAO,CAAA,EAAG,EAAE,IAAA,EAAM,6BAAA,EAA+B,CAAA;AACxE,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AAEpC,MAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,QAAA,GAAA,CAAI,SAAS,MAAM;AACjB,UAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACtC,UAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACvB,UAAA,IAAI;AACF,YAAA,MAAM,OAAA,GAAU,MAAA,CAAO,SAAA,CAAU,YAAA,EAAc,GAAG,CAAA;AAClD,YAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,UACjB,CAAA,CAAA,MAAQ;AACN,YAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,UACd;AAAA,QACF,CAAA;AACA,QAAA,GAAA,CAAI,UAAU,MAAM;AAClB,UAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACvB,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,QACd,CAAA;AACA,QAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AAAA,MACZ,CAAC,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,cAAc,WAAA,EAAa;AACzB,MAAA,aAAA,GAAgB,WAAA;AAAA,IAClB;AAAA,GACF;AACF;AAEA,SAAS,yBAAyB,OAAA,EAAuC;AACvE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AAErD,EAAA,KAAA,MAAW,QAAA,IAAY,OAAA,EAAS,cAAA,IAAkB,EAAC,EAAG;AACpD,IAAA,KAAA,MAAW,EAAA,IAAM,YAAA,CAAa,KAAA,EAAO,QAAQ,CAAA,EAAG;AAC9C,MAAA,EAAA,CAAG,MAAA,EAAO;AAAA,IACZ;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,QAAA,IAAY,OAAA,EAAS,aAAA,IAAiB,EAAC,EAAG;AACnD,IAAA,KAAA,MAAW,EAAA,IAAM,YAAA,CAAa,KAAA,EAAO,QAAQ,CAAA,EAAG;AAC9C,MAAA,WAAA,CAAY,EAAiB,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,YAAA,CAAa,MAAe,QAAA,EAA6B;AAChE,EAAA,IAAI;AACF,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAC,CAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAAS,YAAY,EAAA,EAAuB;AAC1C,EAAA,IAAI,EAAA,YAAc,gBAAA,IAAoB,EAAA,YAAc,mBAAA,EAAqB;AACvE,IAAA,EAAA,CAAG,KAAA,GAAQ,EAAA;AACX,IAAA,EAAA,CAAG,YAAA,CAAa,SAAS,EAAE,CAAA;AAC3B,IAAA,EAAA,CAAG,YAAA,CAAa,eAAe,0BAAM,CAAA;AAAA,EACvC;AACA,EAAA,EAAA,CAAG,cAAc,EAAA,CAAG,QAAA,CAAS,MAAA,KAAW,CAAA,GAAI,6BAAS,EAAA,CAAG,WAAA;AACxD,EAAA,EAAA,CAAG,YAAA;AAAA,IACD,OAAA;AAAA,IACA,CAAA,EAAG,EAAA,CAAG,YAAA,CAAa,OAAO,KAAK,EAAE,CAAA,qFAAA;AAAA,GACnC;AACA,EAAA,EAAA,CAAG,YAAA,CAAa,qBAAqB,MAAM,CAAA;AAC7C;;;AC7GO,SAAS,wBAAA,GAA+C;AAC7D,EAAA,MAAM,UAAmC,EAAC;AAC1C,EAAA,MAAM,YAAmC,EAAC;AAE1C,EAAA,IAAI,OAAO,wBAAwB,WAAA,EAAa;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,IAAI,mBAAA,CAAoB,CAAC,IAAA,KAAS;AACtD,QAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,UAAA,EAAW,EAAG;AACrC,UAAA,IAAI,KAAA,CAAM,SAAS,wBAAA,EAA0B;AAC3C,YAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,SAAA;AAAA,UACtB;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AACD,MAAA,aAAA,CAAc,QAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,MAAM,CAAA;AACvD,MAAA,SAAA,CAAU,KAAK,aAAa,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,IAAI,mBAAA,CAAoB,CAAC,IAAA,KAAS;AACpD,QAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAW;AAChC,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,UAAA,OAAA,CAAQ,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,CAAG,SAAA;AAAA,QAC7C;AAAA,MACF,CAAC,CAAA;AACD,MAAA,WAAA,CAAY,QAAQ,EAAE,IAAA,EAAM,0BAAA,EAA4B,QAAA,EAAU,MAAM,CAAA;AACxE,MAAA,SAAA,CAAU,KAAK,WAAW,CAAA;AAAA,IAC5B,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,MAAM,WAAA,GAAc,IAAI,mBAAA,CAAoB,CAAC,IAAA,KAAS;AACpD,QAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,UAAA,EAAW,EAAG;AACrC,UAAA,IAAI,CAAE,MAA0D,cAAA,EAAgB;AAC9E,YAAA,QAAA,IAAa,MAAgD,KAAA,IAAS,CAAA;AACtE,YAAA,OAAA,CAAQ,GAAA,GAAM,QAAA;AAAA,UAChB;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AACD,MAAA,WAAA,CAAY,QAAQ,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,MAAM,CAAA;AAC5D,MAAA,SAAA,CAAU,KAAK,WAAW,CAAA;AAAA,IAC5B,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,MAAA,MAAM,gBAAA,GAAmB,IAAI,mBAAA,CAAoB,CAAC,IAAA,KAAS;AACzD,QAAA,aAAA,IAAiB,IAAA,CAAK,YAAW,CAAE,MAAA;AACnC,QAAA,OAAA,CAAQ,SAAA,GAAY,aAAA;AAAA,MACtB,CAAC,CAAA;AACD,MAAA,gBAAA,CAAiB,QAAQ,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,MAAM,CAAA;AAC7D,MAAA,SAAA,CAAU,KAAK,gBAAgB,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,WAAA,KAAgB,WAAA,IAAe,WAAA,CAAY,gBAAA,EAAkB;AACtE,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,WAAA,CAAY,gBAAA,CAAiB,YAAY,CAAA;AAC5D,MAAA,IAAI,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,UAAA,CAAW,CAAC,CAAA,EAAG;AAC1C,QAAA,OAAA,CAAQ,OAAO,UAAA,CAAW,CAAC,EAAE,aAAA,GAAgB,UAAA,CAAW,CAAC,CAAA,CAAE,YAAA;AAAA,MAC7D;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,UAAA,GAAa;AACX,MAAA,OAAO,EAAE,GAAG,OAAA,EAAQ;AAAA,IACtB,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,QAAA,GAAA,CAAI,UAAA,EAAW;AAAA,MACjB;AACA,MAAA,SAAA,CAAU,MAAA,GAAS,CAAA;AAAA,IACrB;AAAA,GACF;AACF;;;ACnFO,SAAS,qBAAA,GAAyC;AACvD,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,OAAA,GAAiC,IAAA;AACrC,EAAA,IAAI,cAAA,GAAqE,IAAA;AAazE,EAAA,SAAS,kBAAkB,EAAA,EAAmC;AAC5D,IAAA,IAAI,GAAA,GAAsB,EAAA;AAC1B,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,OAAO,GAAA,IAAO,OAAO,EAAA,EAAI;AACvB,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,YAAA,GAAe,aAAa,CAAA;AAC5C,MAAA,IAAI,KAAK,OAAO,GAAA;AAChB,MAAA,GAAA,GAAM,GAAA,CAAI,aAAA;AACV,MAAA,IAAA,EAAA;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,SAAS,SAAS,EAAA,EAAqB;AACrC,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,OAAA,GAA0B,EAAA;AAC9B,IAAA,OAAO,OAAA,IAAW,OAAA,KAAY,QAAA,CAAS,IAAA,EAAM;AAC3C,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,UAA0B,OAAA,CAAQ,sBAAA;AACtC,MAAA,OAAO,OAAA,EAAS;AACd,QAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAA;AACzC,QAAA,OAAA,GAAU,OAAA,CAAQ,sBAAA;AAAA,MACpB;AACA,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AACxC,MAAA,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,MAAM,GAAG,CAAA;AAClD,MAAA,OAAA,GAAU,OAAA,CAAQ,aAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAAA,EAC9B;AAEA,EAAA,SAAS,eAAe,EAAA,EAAmC;AACzD,IAAA,MAAM,IAAA,GAAO,GAAG,qBAAA,EAAsB;AACtC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AAAA,MAChC,EAAA,EAAI,GAAG,EAAA,IAAM,MAAA;AAAA,MACb,SAAA,EAAW,GAAG,SAAA,IAAa,MAAA;AAAA,MAC3B,WAAA,EAAa,GAAG,WAAA,EAAa,IAAA,GAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,IAAK,MAAA;AAAA,MACrD,KAAA,EAAO,SAAS,EAAE,CAAA;AAAA,MAClB,IAAA,EAAM;AAAA,QACJ,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAAA,QACpB,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AAAA,QACpB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAAA,QAC5B,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM;AAAA,OAChC;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,aAAA,EAAe,iBAAA,CAAkB,EAAE,CAAA,IAAK,MAAA;AAAA,MACxC,OAAO,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,QAAA,GAAW;AAAA,KACpE;AAAA,EACF;AAEA,EAAA,SAAS,aAAA,GAAgC;AACvC,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,IAAA,EAAA,CAAG,MAAM,OAAA,GAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAUnB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,EAAE,CAAA;AAC5B,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,SAAS,gBAAgB,MAAA,EAAiB;AACxC,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,IAAA,OAAA,CAAQ,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAA,CAAA;AACjC,IAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA,EAAA,CAAA;AAC/B,IAAA,OAAA,CAAQ,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AACnC,IAAA,OAAA,CAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAA,CAAA;AACrC,IAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,OAAA;AAAA,EAC1B;AAEA,EAAA,SAAS,gBAAgB,CAAA,EAAe;AACtC,IAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,IAAA,IAAI,WAAW,OAAA,EAAS;AACxB,IAAA,eAAA,CAAgB,MAAM,CAAA;AAAA,EACxB;AAEA,EAAA,SAAS,YAAY,CAAA,EAAe;AAClC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,IAAA,IAAI,WAAW,OAAA,EAAS;AACxB,IAAA,MAAM,QAAA,GAAW,eAAe,MAAM,CAAA;AACtC,IAAA,MAAA,CAAO,QAAQ,CAAA;AAAA,EACjB;AAEA,EAAA,SAAS,cAAc,CAAA,EAAkB;AACvC,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,MAAA,CAAO,IAAI,CAAA;AAAA,IACb;AAAA,EACF;AAEA,EAAA,SAAS,OAAO,MAAA,EAAqC;AACnD,IAAA,UAAA,EAAW;AACX,IAAA,cAAA,GAAiB,MAAM,CAAA;AACvB,IAAA,cAAA,GAAiB,IAAA;AAAA,EACnB;AAEA,EAAA,SAAS,QAAA,GAAiD;AACxD,IAAA,IAAI,QAAQ,UAAA,EAAW;AAEvB,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,cAAA,GAAiB,OAAA;AACjB,MAAA,MAAA,GAAS,IAAA;AACT,MAAA,OAAA,GAAU,aAAA,EAAc;AACxB,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,MAAA,GAAS,WAAA;AAE7B,MAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,eAAA,EAAiB,IAAI,CAAA;AAC5D,MAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,WAAA,EAAa,IAAI,CAAA;AACpD,MAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,aAAA,EAAe,IAAI,CAAA;AAAA,IAC1D,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,UAAA,GAAa;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAA,GAAS,KAAA;AACT,IAAA,QAAA,CAAS,IAAA,CAAK,MAAM,MAAA,GAAS,EAAA;AAC7B,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,eAAA,EAAiB,IAAI,CAAA;AAC/D,IAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,WAAA,EAAa,IAAI,CAAA;AACvD,IAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,aAAA,EAAe,IAAI,CAAA;AAE3D,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,MAAA,EAAO;AACf,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,MAAM,MAAA,EAAO;AACxD;;;AC7JA,IAAM,oBAAA,GAAuB,GAAA;AAYtB,SAAS,qBAAA,GAAyC;AACvD,EAAA,MAAM,UAAgC,EAAC;AACvC,EAAA,MAAM,oBAAoB,OAAA,CAAQ,SAAA;AAClC,EAAA,MAAM,uBAAuB,OAAA,CAAQ,YAAA;AACrC,EAAA,MAAM,cAAA,GAAiB,MAAM,WAAA,CAAY,UAAU,CAAA;AACnD,EAAA,MAAM,gBAAA,GAAmB,MAAM,WAAA,CAAY,YAAY,CAAA;AAEvD,EAAA,WAAA,CAAY,SAAS,CAAA;AAErB,EAAA,SAAS,OAAO,KAAA,EAAiC;AAC/C,IAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,IAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,oBAAA,EAAsB,OAAA,CAAQ,KAAA,EAAM;AAAA,EAC3D;AAEA,EAAA,SAAS,YAAY,MAAA,EAAsB;AACzC,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,IAAA,MAAA,CAAO;AAAA,MACL,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,MACb,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,MAAA;AAAA,QACA,KAAA,EAAO,GAAG,QAAA,CAAS,QAAQ,GAAG,QAAA,CAAS,MAAM,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,CAAA;AAAA,QAC7D,MAAM,QAAA,CAAS;AAAA;AACjB,KACD,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,YAAY,KAAA,EAAyB;AAC5C,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,YAAkB,OAAA,GAAU,MAAM,MAAA,GAAS,IAAA;AAChE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,OAAA,CAAQ,mEAAmE,CAAA,IAAK,MAAA;AAClG,IAAA,MAAA,CAAO;AAAA,MACL,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,MACb,IAAA,EAAM,OAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,GAAA,EAAK,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AAAA,QAC5B,EAAA,EAAK,GAAmB,EAAA,IAAM,MAAA;AAAA,QAC9B,IAAA,EAAM,YAAY,EAAE;AAAA;AACtB,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAA,CAAQ,SAAA,GAAY,SAAS,cAAA,CAAA,GAAiC,IAAA,EAAM;AAClE,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AACjD,IAAA,WAAA,CAAY,WAAW,CAAA;AACvB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAA,CAAQ,YAAA,GAAe,SAAS,iBAAA,CAAA,GAAoC,IAAA,EAAM;AACxE,IAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AACpD,IAAA,WAAA,CAAY,cAAc,CAAA;AAC1B,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,cAAc,CAAA;AAClD,EAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,gBAAgB,CAAA;AACtD,EAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,WAAA,EAAa,IAAI,CAAA;AAEpD,EAAA,OAAO;AAAA,IACL,UAAU,MAAA,EAAQ;AAChB,MAAA,MAAA,CAAO;AAAA,QACL,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,QACb,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,CAAA;AAAA,IACA,UAAA,CAAW,KAAA,GAAQ,EAAC,EAAG;AACrB,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,GAAG,OAAA;AAAA,QACH,IAAI,KAAA,CAAM,WAAA,IAAe,EAAC,EAAG,GAAA,CAAI,CAAC,GAAA,MAA6B;AAAA,UAC7D,IAAI,GAAA,CAAI,SAAA;AAAA,UACR,IAAA,EAAM,KAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP,OAAO,GAAA,CAAI,KAAA;AAAA,YACX,SAAS,GAAA,CAAI;AAAA;AACf,SACF,CAAE,CAAA;AAAA,QACF,IAAI,KAAA,CAAM,WAAA,IAAe,EAAC,EAAG,GAAA,CAAI,CAAC,OAAA,MAAiC;AAAA,UACjE,IAAI,OAAA,CAAQ,SAAA;AAAA,UACZ,IAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,KAAK,OAAA,CAAQ,GAAA;AAAA,YACb,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,YAClB,OAAO,OAAA,CAAQ;AAAA;AACjB,SACF,CAAE;AAAA,OACJ,CAAE,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,EAAA,GAAK,EAAE,EAAE,CAAA;AAC5B,MAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAC,oBAAoB,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,KAAA,GAAQ;AACN,MAAA,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,OAAA,CAAQ,SAAA,GAAY,iBAAA;AACpB,MAAA,OAAA,CAAQ,YAAA,GAAe,oBAAA;AACvB,MAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,cAAc,CAAA;AACrD,MAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,gBAAgB,CAAA;AACzD,MAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,WAAA,EAAa,IAAI,CAAA;AAAA,IACzD;AAAA,GACF;AACF;AAEA,SAAS,YAAY,EAAA,EAAiC;AACpD,EAAA,MAAM,IAAA,GAAA,CAAQ,GAAG,WAAA,IAAe,EAAA,EAAI,QAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAC9D,EAAA,OAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AACpC;;;ACvDA,IAAM,mBAAA,GAAsB,GAAA;AAE5B,IAAM,OAAA,GAAU,4EAAA;AAChB,IAAM,QAAA,GAAW,kBAAA;AACjB,IAAM,UAAA,GAAa,OAAA;AACnB,IAAM,aAAA,GAAgB,kBAAA;AAQf,SAAS,iBAAiB,GAAA,EAAqB;AACpD,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAC7B,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,MAAA;AAC9B,EAAA,IAAI,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,MAAA;AAC/B,EAAA,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,MAAA;AAIjC,EAAA,IAAI,aAAA,CAAc,KAAK,GAAG,CAAA,IAAK,KAAK,IAAA,CAAK,GAAG,GAAG,OAAO,MAAA;AACtD,EAAA,OAAO,GAAA;AACT;AAUO,SAAS,cAAA,CACd,UACA,SAAA,EACQ;AAER,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,GACtD,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GACpB,QAAA;AACJ,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAM,OAAA,GAAU,aAAA,CAAc,KAAA,EAAO,SAAS,CAAA;AAC9C,IAAA,IAAI,SAAS,OAAO,OAAA;AAAA,EACtB;AACA,EAAA,OAAO,MAAM,KAAA,CACV,KAAA,CAAM,GAAG,CAAA,CACT,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAC1B,GAAA,CAAI,gBAAgB,CAAA,CACpB,KAAK,GAAG,CAAA;AACb;AAOA,SAAS,aAAA,CAAc,UAAkB,SAAA,EAAoC;AAC3E,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAE3D,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,SAAS,CAAA,CAAE,IAAA;AAAA,IAC5B,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE;AAAA,GAC/C;AACA,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACzD,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,IAAA,CAAK,MAAA,EAAQ;AACpC,IAAA,IAAI,EAAA,GAAK,IAAA;AACT,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,MAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,MAAA,IAAI,EAAE,UAAA,CAAW,GAAG,KAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1C,MAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,MAAA,IAAI,MAAM,CAAA,EAAG;AACb,MAAA,EAAA,GAAK,KAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,EAAA,EAAI,OAAO,GAAA,GAAM,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAA,GAAwB;AAC/B,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,EAAC;AAC7C,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,gBAAA,CAAiB,eAAe,CAAA;AACrD,EAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAG;AAChC,IAAA,MAAM,CAAA,GAAI,EAAA,CAAG,YAAA,CAAa,aAAa,CAAA;AACvC,IAAA,IAAI,CAAA,IAAK,EAAE,MAAA,GAAS,CAAA,IAAK,EAAE,MAAA,GAAS,GAAA,EAAK,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAAK;AAC9B;AAEA,SAAS,kBAAA,GAA+B;AACtC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,EAAC;AAC3C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AACzD,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,IAAA,MAAA,CAAO,QAAQ,CAAC,CAAA,EAAG,QAAQ,GAAA,CAAI,GAAA,CAAI,GAAG,CAAC,CAAA;AACvC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAAK;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAOA,SAAS,cAAA,GAAgC;AACvC,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAA,CACX,CAAA,IAAK,EAAA,EAAI,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,GAAG,GAAG,CAAA;AACpD,EAAA,MAAM,KAAK,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,IAAI,GAAG,WAAW,CAAA;AACzD,EAAA,IAAI,IAAI,OAAO,EAAA;AACf,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA;AACjC,EAAA,IAAI,OAAO,OAAO,KAAA;AAClB,EAAA,MAAM,OAAO,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,MAAM,GAAG,WAAW,CAAA;AAC7D,EAAA,OAAO,IAAA,IAAQ,IAAA;AACjB;AAQA,eAAe,WAAW,KAAA,EAA8C;AACtE,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA,KAAW,eAAe,CAAC,MAAA,CAAO,QAAQ,OAAO,IAAA;AACtE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,IAAI,WAAA,EAAY,CAAE,OAAO,KAAK,CAAA;AAC3C,IAAA,MAAM,MAAM,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,IAAI,CAAA;AACtD,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,GAAG,CAAA;AAChC,IAAA,IAAI,GAAA,GAAM,EAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,GAAA,IAAO,KAAA,CAAM,CAAC,CAAA,CAAG,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAeO,SAAS,uBAAuB,IAAA,EAAiD;AACtF,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,qBAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA,EAAAC,aAAAA;AAAA,IACA;AAAA,GACF,GAAI,IAAA;AAEJ,EAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,mBAAA;AACxC,EAAA,MAAM,cAAA,GAAiB,OAAO,iBAAA,KAAsB,KAAA;AACpD,EAAA,MAAM,YAAA,GAAe,OAAO,YAAA,IAAgB,MAAA;AAE5C,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,EAAA,IAAI,YAAA,GAAqD,IAAA;AAEzD,EAAA,eAAe,cAAA,GAAiB;AAC9B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,MAAM,QAAQ,cAAA,CAAe,MAAA,CAAO,QAAA,CAAS,QAAA,EAAU,OAAO,cAAc,CAAA;AAC5E,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,IAAK,CAAA;AACzC,IAAA,IAAI,GAAA,GAAM,OAAO,UAAA,EAAY;AAC7B,IAAA,aAAA,CAAc,GAAA,CAAI,OAAO,GAAG,CAAA;AAE5B,IAAA,IAAI,WAAA,GAA6B,IAAA;AACjC,IAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,MAAA,WAAA,GAAc,SAAA,MAAeA,aAAAA,EAAa;AAAA,IAC5C,CAAA,MAAA,IAAW,iBAAiB,cAAA,EAAgB;AAC1C,MAAA,WAAA,GAAcA,aAAAA,EAAa;AAAA,IAC7B;AAEA,IAAA,MAAM,KAAA,GAAwB;AAAA,MAC5B,KAAA;AAAA,MACA,UAAA,EAAY,OAAO,QAAA,KAAa,WAAA,GAAA,CAC3B,QAAA,CAAS,KAAA,IAAS,EAAA,EAAI,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,IAAK,IAAA,GACxC,IAAA;AAAA,MACJ,WAAA,EAAa,cAAA,GAAiB,cAAA,EAAe,GAAI,IAAA;AAAA,MACjD,SAAS,WAAA,EAAY;AAAA,MACrB,aAAA,EAAe,qBAAA,EAAsB,CAAE,KAAA,CAAM,GAAG,CAAA;AAAA,MAChD,kBAAkB,kBAAA,EAAmB;AAAA,MACrC,YAAA,EAAc,MAAM,UAAA,CAAW,WAAW,CAAA;AAAA,MAC1C,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACtC;AACA,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf;AAEA,EAAA,SAAS,YAAA,GAAe;AACtB,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,YAAA,GAAe,WAAW,MAAM;AAC9B,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,KAAK,cAAA,EAAe;AAAA,IACtB,GAAG,GAAG,CAAA;AAAA,EACR;AAEA,EAAA,SAAS,iBAAA,GAAoB;AAC3B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,QAAA,GAAW,OAAO,QAAA,CAAS,MAAA;AACxD,IAAA,IAAI,SAAS,QAAA,EAAU;AACvB,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,YAAA,EAAa;AAAA,EACf;AAEA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO;AAAA,MACL,SAAS,MAAM,MAAA;AAAA,MACf,UAAU,MAAM;AAAA,KAClB;AAAA,EACF;AAGA,EAAA,MAAM,eAAe,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,OAAO,OAAO,CAAA;AACjE,EAAA,MAAM,kBAAkB,MAAA,CAAO,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,OAAO,OAAO,CAAA;AACvE,EAAA,MAAM,WAAA,GAA+C,SAAS,OAAA,CAAA,GACzD,IAAA,EACH;AACA,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAG,IAAI,CAAA;AAChC,IAAA,iBAAA,EAAkB;AAClB,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,cAAA,GAAqD,SAAS,OAAA,CAAA,GAC/D,IAAA,EACH;AACA,IAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,GAAG,IAAI,CAAA;AACnC,IAAA,iBAAA,EAAkB;AAClB,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAA,CAAO,QAAQ,SAAA,GAAY,WAAA;AAC3B,EAAA,MAAA,CAAO,QAAQ,YAAA,GAAe,cAAA;AAE9B,EAAA,MAAM,KAAA,GAAQ,MAAM,iBAAA,EAAkB;AACtC,EAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,KAAK,CAAA;AAGzC,EAAA,YAAA,EAAa;AAEb,EAAA,OAAO;AAAA,IACL,OAAA,GAAU;AACR,MAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,KAAK,CAAA;AAG5C,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,SAAA,KAAc,WAAA,EAAa;AAC5C,QAAA,MAAA,CAAO,QAAQ,SAAA,GAAY,YAAA;AAAA,MAC7B;AACA,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,YAAA,KAAiB,cAAA,EAAgB;AAClD,QAAA,MAAA,CAAO,QAAQ,YAAA,GAAe,eAAA;AAAA,MAChC;AACA,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,YAAY,CAAA;AACzB,QAAA,YAAA,GAAe,IAAA;AAAA,MACjB;AACA,MAAA,aAAA,CAAc,KAAA,EAAM;AAAA,IACtB,CAAA;AAAA,IACA,QAAA,GAAW;AAET,MAAA,aAAA,CAAc,KAAA,EAAM;AACpB,MAAA,KAAK,cAAA,EAAe;AAAA,IACtB;AAAA,GACF;AACF;;;AC/PA,SAAS,eAAA,GAA2D;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,UAAA;AACV,IAAA,IAAI,CAAA,CAAE,MAAA,EAAQ,OAAO,CAAA,CAAE,MAAA;AACvB,IAAA,OAAO,KAAA,CAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,qBAAA,GAAsD;AAC7D,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,UAAA;AACV,IAAA,OAAO,CAAA,CAAE,iBAAA;AAAA,EACX,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,qBAAA,GAAmD;AAC1D,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,UAAA;AACV,IAAA,MAAM,OAAO,CAAA,CAAE,UAAA;AACf,IAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,IAAA,IAAI,MAAM,OAAA,KAAY,GAAA,IAAQ,UAAU,OAAO,MAAA,CAAO,gBAAgB,UAAA,EAAa;AAGjF,MAAA,OAAO,IAAA,EAAM,OAAA,KAAY,GAAA,GAAM,IAAA,GAAO,IAAA;AAAA,IACxC;AACA,IAAA,IAAI,IAAA,EAAM,OAAA,KAAY,GAAA,EAAK,OAAO,IAAA;AAClC,IAAA,IAAI,MAAA,IAAU,OAAQ,MAAA,CAAwB,aAAA,KAAkB,YAAY,OAAO,IAAA;AACnF,IAAA,OAAO,SAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,SAAA;AAAA,EACT;AACF;AAaO,SAAS,oBAAA,CACd,OAAA,EACA,OAAA,GAAyC,EAAC,EACtB;AACpB,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,oBAAoB,EAAE,CAAA;AACxD,EAAA,MAAM,MAA0B,EAAC;AACjC,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,IAAI,CAAC,QAAQ,OAAO,GAAA;AACpB,EAAA,GAAA,CAAI,MAAM,qBAAA,EAAsB;AAIhC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,MAAA;AACX,IAAA,IAAI,OAAO,EAAA,CAAG,WAAA,KAAgB,UAAA,EAAY;AACxC,MAAA,GAAA,CAAI,OAAA,GAAU,EAAA,CAAG,WAAA,EAAY,IAAK,KAAA,CAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,MAAM,EAAA,GAAK,MAAA;AACX,MAAA,MAAMC,MAAAA,GAAQ,EAAA,CAAG,aAAA,IAAgB,EAAG,QAAA,IAAW;AAC/C,MAAA,GAAA,CAAI,OAAA,GAAUA,MAAAA,EAAO,cAAA,IAAiB,IAAK,KAAA,CAAA;AAAA,IAC7C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAGR;AAGA,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,MAAA;AACX,IAAA,IAAI,OAAO,EAAA,CAAG,eAAA,KAAoB,UAAA,EAAY;AAC5C,MAAA,KAAA,GAAQ,GAAG,eAAA,EAAgB;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,MAAM,EAAA,GAAK,MAAA;AACX,MAAA,KAAA,GAAQ,EAAA,CAAG,aAAA,IAAgB,EAAG,QAAA,IAAW;AAAA,IAC3C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,IAAU;AAC7B,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,GAAA,CAAI,IAAA,GAAO;AAAA,UACT,IAAI,OAAO,IAAA,CAAK,EAAA,KAAO,QAAA,GAAW,KAAK,EAAA,GAAK,KAAA,CAAA;AAAA,UAC5C,OAAO,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GAAW,KAAK,KAAA,GAAQ,KAAA,CAAA;AAAA,UACrD,UAAU,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,KAAK,QAAA,GAAW,KAAA,CAAA;AAAA,UAC9D,YAAY,OAAO,IAAA,CAAK,UAAA,KAAe,QAAA,GAAW,KAAK,UAAA,GAAa,KAAA;AAAA,SACtE;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,IAAU;AAC7B,MAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AAIpC,QAAA,MAAM,SAAoD,EAAC;AAC3D,QAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzC,UAAA,IAAI,OAAO,MAAM,QAAA,IAAY,OAAO,MAAM,QAAA,IAAY,OAAO,MAAM,SAAA,EAAW;AAC5E,YAAA,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA;AAAA,UACd;AAAA,QACF;AACA,QAAA,IAAI,OAAO,IAAA,CAAK,MAAM,EAAE,MAAA,GAAS,CAAA,MAAO,IAAA,GAAO,MAAA;AAAA,MACjD;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI;AAEF,MAAA,GAAA,CAAI,kBACF,KAAA,CAAM,kBAAA,QAA0B,KAAA,CAAM,cAAA,MAAoB,IAAA,IAAQ,KAAA,CAAA;AAAA,IACtE,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI;AACF,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA,CAAM,UAAA,IAAa,EAAG,GAAA,IAAO,KAAA,CAAA;AAAA,IAC/C,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI;AAGF,MAAA,MAAM,MAAM,KAAA,CAAM,cAAA,IAAiB,IAAK,KAAA,CAAM,gBAAgB,EAAC;AAC/D,MAAA,IAAI,MAAM,OAAA,CAAQ,GAAG,CAAA,IAAK,GAAA,CAAI,SAAS,CAAA,EAAG;AACxC,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,CAAC,KAAK,CAAA;AAC/B,QAAA,GAAA,CAAI,WAAA,GAAc,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AAClC,UAAA,MAAM,CAAA,GAAI,CAAA;AACV,UAAA,OAAO;AAAA,YACL,SAAA,EACE,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA;AAAA;AAAA;AAAA,cAGnB,CAAA,CAAE,YAAY,IAAA,GACZ,IAAA,CAAK,MAAM,CAAA,CAAE,SAAA,GAAY,GAAI,CAAA,GAC7B,CAAA,CAAE;AAAA,gBACJ,KAAA,CAAA;AAAA,YACN,UAAU,OAAO,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,EAAE,QAAA,GAAW,KAAA,CAAA;AAAA,YACxD,OAAO,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,GAAQ,KAAA,CAAA;AAAA,YAC/C,SAAS,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,KAAA,CAAA;AAAA,YACrD,MAAM,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,GAAO,KAAA,CAAA;AAAA,YAC5C,IAAA,EACE,EAAE,IAAA,IAAQ,OAAO,EAAE,IAAA,KAAS,QAAA,GACvB,EAAE,IAAA,GACH,KAAA;AAAA,WACR;AAAA,QACF,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,MAAA;AACX,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,OAAO,EAAA,CAAG,aAAA,KAAkB,UAAA,EAAY;AAC1C,MAAA,IAAA,GAAO,GAAG,aAAA,EAAc;AAAA,IAC1B,CAAA,MAAA,IAAW,OAAO,OAAA,EAAS;AACzB,MAAA,IAAA,GAAO,MAAM,OAAA,EAAQ;AAAA,IACvB;AACA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,GAAA,GAAM,KAAK,WAAA,IAAc;AAC/B,MAAA,GAAA,CAAI,OAAA,GAAU,GAAA,EAAK,OAAA,IAAW,IAAA,CAAK,OAAA,IAAW,KAAA,CAAA;AAC9C,MAAA,GAAA,CAAI,MAAA,GAAS,GAAA,EAAK,MAAA,IAAU,IAAA,CAAK,MAAA,IAAU,KAAA,CAAA;AAAA,IAC7C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAGR;AAGA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,MAAA;AACX,IAAA,IAAI,OAAO,EAAA,CAAG,SAAA,KAAc,UAAA,EAAY;AACtC,MAAA,MAAA,GAAS,GAAG,SAAA,EAAU;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,MAAM,EAAA,GAAK,MAAA;AACX,MAAA,MAAA,GAAS,EAAA,CAAG,aAAA,IAAgB,EAAG,SAAA,IAAY;AAAA,IAC7C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,OAAO,UAAA,IAAa;AACjC,MAAA,IAAI,IAAA,EAAM,OAAA,EAAS,GAAA,CAAI,OAAA,GAAU,IAAA,CAAK,OAAA;AACtC,MAAA,IAAI,IAAA,EAAM,WAAA,EAAa,GAAA,CAAI,WAAA,GAAc,IAAA,CAAK,WAAA;AAAA,IAChD,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI;AAEF,MAAA,MAAM,GAAA,GAAM,OAAO,MAAA,IAAS;AAC5B,MAAA,IAAI,GAAA,EAAK,IAAA,IAAQ,GAAA,EAAK,SAAA,IAAa,IAAI,OAAA,EAAS;AAK9C,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,WAAW,EAAE,CAAA;AAC9C,QAAA,GAAA,CAAI,WAAW,CAAA,QAAA,EAAW,OAAO,kBAAkB,kBAAA,CAAmB,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA;AAAA,MACpF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAIA,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,MAAA;AACX,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,SAAA,IAAY,IAAK,qBAAA,EAAsB;AACzD,IAAA,GAAA,CAAI,QAAA,GAAW,MAAA,EAAQ,WAAA,IAAc,IAAK,KAAA,CAAA;AAAA,EAC5C,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,GAAA;AACT;AAcO,SAAS,cAAA,CAAe,QAAA,EAAkB,OAAA,GAAkC,EAAC,EAAS;AAC3F,EAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,IAAI;AAEF,IAAA,MAAM,EAAA,GAAK,MAAA;AACX,IAAA,IAAI,OAAO,EAAA,CAAG,MAAA,KAAW,UAAA,EAAY;AACnC,MAAA,EAAA,CAAG,MAAA,CAAO,mBAAmB,QAAQ,CAAA;AACrC,MAAA,IAAI,QAAQ,SAAA,EAAW,EAAA,CAAG,MAAA,CAAO,kBAAA,EAAoB,QAAQ,SAAS,CAAA;AAAA,IACxE;AACA,IAAA,IAAI,OAAO,EAAA,CAAG,UAAA,KAAe,UAAA,EAAY;AACvC,MAAA,EAAA,CAAG,WAAW,cAAA,EAAgB;AAAA,QAC5B,EAAA,EAAI,QAAA;AAAA,QACJ,GAAI,QAAQ,SAAA,GAAY,EAAE,KAAK,OAAA,CAAQ,SAAA,KAAc,EAAC;AAAA,QACtD,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACrC,CAAA;AAAA,IACH;AAIA,IAAA,IAAI,OAAO,EAAA,CAAG,aAAA,KAAkB,UAAA,EAAY;AAC1C,MAAA,EAAA,CAAG,aAAA,CAAc;AAAA,QACf,QAAA,EAAU,OAAA;AAAA,QACV,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS,2BAA2B,QAAQ,CAAA,CAAA,CAAA;AAAA,QAC5C,IAAA,EAAM,EAAE,SAAA,EAAW,QAAA,EAAU,GAAI,OAAA,CAAQ,SAAA,GAAY,EAAE,GAAA,EAAK,OAAA,CAAQ,SAAA,EAAU,GAAI,EAAC;AAAG,OACvF,CAAA;AAAA,IACH;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,GAAK,MAAA;AACX,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,aAAA,IAAgB,EAAG,QAAA,IAAW;AAC/C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,MAAA,GAAS,mBAAmB,QAAQ,CAAA;AAC1C,MAAA,IAAI,QAAQ,SAAA,EAAW,KAAA,CAAM,MAAA,GAAS,kBAAA,EAAoB,QAAQ,SAAS,CAAA;AAC3E,MAAA,KAAA,CAAM,aAAa,cAAA,EAAgB;AAAA,QACjC,EAAA,EAAI,QAAA;AAAA,QACJ,GAAI,QAAQ,SAAA,GAAY,EAAE,KAAK,OAAA,CAAQ,SAAA,KAAc;AAAC,OACvD,CAAA;AAAA,IACH;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;ACvWO,SAAS,sBAAA,CACd,SAAA,EACA,MAAA,GAAiC,EAAC,EACT;AACzB,EAAA,MAAM,WAA8B,EAAC;AAGrC,EAAA,IAAI,MAAA,CAAO,cAAc,KAAA,EAAO;AAI9B,IAAA,IAASC,YAAAA,GAAT,SAAqB,CAAA,EAAe;AAClC,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,IAAI,CAAA,CAAE,WAAW,eAAA,EAAiB;AAChC,QAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AACnB,QAAA,UAAA,GAAa,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,GAAA,GAAM,IAAI,GAAG,CAAA;AACjD,QAAA,IAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC1B,UAAA,MAAM,KAAK,CAAA,CAAE,MAAA;AACb,UAAA,SAAA,CAAU,UAAU,YAAA,EAAc;AAAA,YAChC,SAAS,EAAA,CAAG,OAAA;AAAA,YACZ,IAAI,EAAA,CAAG,EAAA;AAAA,YACP,IAAA,EAAM,EAAA,CAAG,WAAA,EAAa,KAAA,CAAM,GAAG,EAAE;AAAA,WAClC,CAAA;AACD,UAAA,UAAA,GAAa,EAAC;AAAA,QAChB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,eAAA,GAAkB,CAAA,CAAE,MAAA;AACpB,QAAA,UAAA,GAAa,CAAC,GAAG,CAAA;AAAA,MACnB;AAAA,IACF,CAAA;AArBA,IAAA,IAAI,aAAuB,EAAC;AAC5B,IAAA,IAAI,eAAA,GAAsC,IAAA;AAqB1C,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAASA,YAAAA,EAAa,IAAI,CAAA;AACpD,IAAA,QAAA,CAAS,KAAK,MAAM,QAAA,CAAS,oBAAoB,OAAA,EAASA,YAAAA,EAAa,IAAI,CAAC,CAAA;AAAA,EAC9E;AAGA,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,KAAA,IAAS,OAAO,wBAAwB,WAAA,EAAa;AAC3E,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,IAAI,mBAAA,CAAoB,CAAC,IAAA,KAAS;AACjD,QAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,UAAA,EAAW,EAAG;AACrC,UAAA,IAAI,KAAA,CAAM,WAAW,GAAA,EAAM;AACzB,YAAA,SAAA,CAAU,UAAU,WAAA,EAAa;AAAA,cAC/B,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA;AAAA,cACnC,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,SAAS;AAAA,aACtC,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AACD,MAAA,QAAA,CAAS,QAAQ,EAAE,UAAA,EAAY,CAAC,UAAU,GAAG,CAAA;AAC7C,MAAA,QAAA,CAAS,IAAA,CAAK,MAAM,QAAA,CAAS,UAAA,EAAY,CAAA;AAAA,IAC3C,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,yBAAA,CAA0B,MAAA,CAAO,UAAU,CAAA;AAC9D,EAAA,IAAI,WAAW,OAAA,EAAS;AACtB,IAAA,MAAM,iBAA2B,EAAC;AAClC,IAAA,MAAM,YAAY,UAAA,CAAW,KAAA;AAE7B,IAAA,UAAA,CAAW,KAAA,GAAQ,kBAAkC,IAAA,EAAgC;AACnF,MAAA,MAAM,CAAC,KAAA,EAAO,IAAI,CAAA,GAAI,IAAA;AACtB,MAAA,MAAM,GAAA,GAAM,cAAc,KAAK,CAAA;AAC/B,MAAA,MAAM,aAAA,GAAgB,QAAQ,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAC,CAAA,IAC5D,qBAAqB,GAAA,EAAK;AAAA,QAC3B,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,YAAY,UAAA,CAAW;AAAA,OACxB,CAAA;AAEH,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAAU,KAAA,CAAM,MAAM,IAAI,CAAA;AAC5C,QAAA,IAAI,CAAC,aAAA,IAAiB,CAAC,IAAI,EAAA,IAAM,GAAA,CAAI,UAAU,GAAA,EAAK;AAClD,UAAA,gBAAA,CAAiB,gBAAgB,SAAS,CAAA;AAAA,QAC5C;AACA,QAAA,OAAO,GAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,CAAC,aAAA,EAAe,gBAAA,CAAiB,cAAA,EAAgB,SAAS,CAAA;AAC9D,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,KAAK,MAAM;AAAE,MAAA,UAAA,CAAW,KAAA,GAAQ,SAAA;AAAA,IAAU,CAAC,CAAA;AAAA,EACtD;AAGA,EAAA,IAAI,OAAO,aAAA,EAAe;AACxB,IAAA,IAASC,YAAAA,GAAT,SAAqB,KAAA,EAAmB;AACtC,MAAA,SAAA,CAAU,UAAU,gBAAA,EAAkB;AAAA,QACpC,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,OAAO,KAAA,CAAM;AAAA,OACd,CAAA;AAAA,IACH,CAAA,EACSC,yBAAAA,GAAT,SAAkC,KAAA,EAA8B;AAC9D,MAAA,SAAA,CAAU,UAAU,gBAAA,EAAkB;AAAA,QACpC,OAAA,EAAS,MAAM,MAAA,YAAkB,KAAA,GAAQ,MAAM,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAAA,QACnF,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAASD,YAAW,CAAA;AAC5C,IAAA,MAAA,CAAO,gBAAA,CAAiB,sBAAsBC,yBAAwB,CAAA;AACtE,IAAA,QAAA,CAAS,KAAK,MAAM;AAClB,MAAA,MAAA,CAAO,mBAAA,CAAoB,SAASD,YAAW,CAAA;AAC/C,MAAA,MAAA,CAAO,mBAAA,CAAoB,sBAAsBC,yBAAwB,CAAA;AAAA,IAC3E,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,GAAU;AACR,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAA,EAAA,KAAM,EAAA,EAAI,CAAA;AAAA,IAC7B;AAAA,GACF;AACF;AAEA,SAAS,0BACP,MAAA,EACsF;AACtF,EAAA,IAAI,MAAA,KAAW,OAAO,OAAO,EAAE,SAAS,KAAA,EAAO,UAAA,EAAY,EAAC,EAAE;AAC9D,EAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AACxC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAO,OAAA,KAAY,KAAA;AAAA,MAC5B,UAAA,EAAY,MAAA,CAAO,UAAA,IAAc;AAAC,KACpC;AAAA,EACF;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,EAAC,EAAE;AACzC;AAEA,SAAS,gBAAA,CAAiB,gBAA0B,SAAA,EAA4C;AAC9F,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,cAAA,CAAe,KAAK,GAAG,CAAA;AACvB,EAAA,MAAM,iBAAiB,cAAA,CAAe,MAAA,CAAO,CAAA,CAAA,KAAK,GAAA,GAAM,IAAI,GAAK,CAAA;AACjE,EAAA,IAAI,cAAA,CAAe,UAAU,CAAA,EAAG;AAC9B,IAAA,SAAA,CAAU,UAAU,aAAA,EAAe;AAAA,MACjC,cAAc,cAAA,CAAe,MAAA;AAAA,MAC7B,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,cAAA,CAAe,MAAA,GAAS,CAAA;AAAA,EAC1B;AACF;;;ACjJA,IAAM,wBAAA,GAA2B,mBAAA;AACjC,IAAM,0BAAA,GAA6B,qBAAA;AAEnC,SAAS,YAAY,GAAA,EAA4B;AAC/C,EAAA,IAAI;AAAE,IAAA,OAAO,YAAA,CAAa,QAAQ,GAAG,CAAA;AAAA,EAAE,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,IAAA;AAAA,EAAK;AAC/D;AAEA,SAAS,YAAA,CAAa,KAAa,KAAA,EAAqB;AACtD,EAAA,IAAI;AAAE,IAAA,YAAA,CAAa,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,EAAE,CAAA,CAAA,MAAQ;AAAA,EAAa;AAC9D;AAEO,SAAS,sBAAA,CACd,MAAA,GAAmC,EAAC,EAClB;AAClB,EAAA,MAAM,aAAA,GAAgB,OAAO,sBAAA,IAA0B,CAAA;AACvD,EAAA,MAAM,aAAA,GAAgB,OAAO,oBAAA,IAAwB,EAAA;AACrD,EAAA,MAAM,iBAAA,GAAoB,OAAO,uBAAA,IAA2B,CAAA;AAE5D,EAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,EAAA,MAAM,mBAAA,uBAA0B,GAAA,EAAY;AAE5C,EAAA,SAAS,WAAW,WAAA,EAA8B;AAEhD,IAAA,MAAM,mBAAmB,QAAA,CAAS,WAAA,CAAY,0BAA0B,CAAA,IAAK,KAAK,EAAE,CAAA;AACpF,IAAA,IAAI,gBAAA,IAAoB,mBAAmB,OAAO,KAAA;AAGlD,IAAA,MAAM,WAAA,GAAc,YAAY,wBAAwB,CAAA;AACxD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,CAAS,aAAa,EAAE,CAAA;AACrD,MAAA,IAAI,OAAA,GAAU,aAAA,GAAgB,EAAA,GAAK,EAAA,GAAK,KAAM,OAAO,KAAA;AAAA,IACvD;AAGA,IAAA,IAAI,kBAAA,IAAsB,eAAe,OAAO,KAAA;AAGhD,IAAA,IAAI,mBAAA,CAAoB,GAAA,CAAI,WAAW,CAAA,EAAG,OAAO,KAAA;AAEjD,IAAA,mBAAA,CAAoB,IAAI,WAAW,CAAA;AACnC,IAAA,kBAAA,EAAA;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,SAAS,eAAA,GAAwB;AAC/B,IAAA,YAAA,CAAa,wBAAA,EAA0B,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAC,CAAA;AACzD,IAAA,MAAM,UAAU,QAAA,CAAS,WAAA,CAAY,0BAA0B,CAAA,IAAK,KAAK,EAAE,CAAA;AAC3E,IAAA,YAAA,CAAa,0BAAA,EAA4B,MAAA,CAAO,OAAA,GAAU,CAAC,CAAC,CAAA;AAAA,EAC9D;AAEA,EAAA,SAAS,gBAAA,GAAyB;AAChC,IAAA,YAAA,CAAa,4BAA4B,GAAG,CAAA;AAAA,EAC9C;AAEA,EAAA,SAAS,KAAA,GAAc;AACrB,IAAA,kBAAA,GAAqB,CAAA;AACrB,IAAA,mBAAA,CAAoB,KAAA,EAAM;AAAA,EAC5B;AAEA,EAAA,OAAO,EAAE,UAAA,EAAY,eAAA,EAAiB,gBAAA,EAAkB,KAAA,EAAM;AAChE;;;ACvEO,IAAM,iBAAA,GAAoB,kBAAA;AAC1B,IAAM,iBAAA,GAEP,OAAA,CACA;;;AC+CN,IAAI,QAAA,GAAoC,IAAA;AAEjC,IAAM,QAAN,MAAY;AAAA,EACT,WAAA,GAAc;AAAA,EAAC;AAAA,EAEvB,OAAO,KAAK,MAAA,EAAuC;AACjD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,YAAA,CAAa,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,QAAQ,QAAA,EAAU,CAAA,CAC7D,IAAA,CAAK,iEAA4D,CAAA;AACpE,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,MAAA,CAAO,YAAY,KAAA,EAAO;AAC5B,MAAA,OAAO,kBAAA,EAAmB;AAAA,IAC5B;AAEA,IAAA,QAAA,GAAW,eAAe,MAAM,CAAA;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,OAAO,WAAA,GAAuC;AAC5C,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,OAAO,OAAA,GAAgB;AACrB,IAAA,QAAA,EAAU,OAAA,EAAQ;AAClB,IAAA,QAAA,GAAW,IAAA;AAAA,EACb;AAAA,EAEA,OAAO,QAAA,GAA4C;AACjD,IAAA,OAAO,QAAA,EAAU,QAAA,EAAS,IAAK,uBAAA,EAAwB;AAAA,EACzD;AACF;AAEA,SAAS,eAAe,MAAA,EAAuC;AAC7D,EAAA,MAAM,eAAA,GAAkB,kBAAkB,MAAM,CAAA;AAChD,EAAA,IAAI,YAAA,GAA4B,eAAA;AAChC,EAAA,MAAM,GAAA,GAAO,MAAA,CAAO,KAAA,IAAS,KAAA,GACzB,YAAA,CAAa,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,CAAA,GACjE,UAAA;AAEJ,EAAA,MAAMC,aAAY,eAAA,CAAgB;AAAA,IAChC,WAAW,eAAA,CAAgB,SAAA;AAAA,IAC3B,QAAQ,eAAA,CAAgB,MAAA;AAAA,IACxB,GAAI,gBAAgB,WAAA,GAAc,EAAE,aAAa,eAAA,CAAgB,WAAA,KAAgB;AAAC,GACnF,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,eAAA,CAAgB,SAAS,CAAA;AAC3D,EAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,eAAA,CAAgB,OAAO,CAAA;AAC/D,EAAA,MAAM,WAAA,GAAc,kBAAkB,EAAE,QAAA,EAAU,IAAI,UAAA,EAAY,CAAA,EAAG,gBAAA,EAAkB,GAAA,EAAO,CAAA;AAC9F,EAAA,MAAM,cAAc,iBAAA,EAAkB;AAOtC,EAAA,SAAS,wBACP,MAAA,EACK;AACL,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACvB,MAAA,MAAM,IAAA,GAAU,EAAE,GAAG,CAAA,EAAE;AACvB,MAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU;AACjC,QAAA,IAAA,CAAK,OAAA,GAAU,WAAA,CAAY,KAAA,CAAM,CAAA,CAAE,OAAO,CAAA;AAAA,MAC5C;AACA,MAAA,IAAI,CAAA,CAAE,IAAA,IAAQ,OAAO,CAAA,CAAE,SAAS,QAAA,EAAU;AACxC,QAAA,MAAM,UAAmC,EAAC;AAC1C,QAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA,EAAG;AAC3C,UAAA,OAAA,CAAQ,CAAC,IAAI,OAAO,CAAA,KAAM,WAAW,WAAA,CAAY,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,QAC9D;AACA,QAAA,IAAA,CAAK,IAAA,GAAO,OAAA;AAAA,MACd;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AACA,EAAA,SAAS,iBACP,IAAA,EACuD;AACvD,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,IAAA,MAAM,MAAiD,EAAC;AACxD,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzC,MAAA,GAAA,CAAI,CAAC,IAAI,OAAO,CAAA,KAAM,WAAW,WAAA,CAAY,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAA,GAA6D,IAAA;AACjE,EAAA,IAAI,UAAA,GAA6D,IAAA;AACjE,EAAA,IAAI,OAAA,GAA8D,IAAA;AAClE,EAAA,IAAI,aAAA,GAAmE,IAAA;AACvE,EAAA,IAAI,eAAA,GAAmE,IAAA;AACvE,EAAA,IAAI,YAAA,GAAwC,IAAA;AAC5C,EAAA,MAAM,cAAc,qBAAA,EAAsB;AAC1C,EAAA,IAAI,MAAA;AAEJ,EAAA,SAAS,kBAAA,GAAqB;AAC5B,IAAA,IAAI,YAAA,CAAa,OAAA,EAAS,OAAA,KAAY,KAAA,EAAO;AAC3C,MAAA,UAAA,KAAe,oBAAA,EAAqB;AAAA,IACtC,CAAA,MAAO;AACL,MAAA,UAAA,EAAY,OAAA,EAAQ;AACpB,MAAA,UAAA,GAAa,IAAA;AAAA,IACf;AAEA,IAAA,IAAI,YAAA,CAAa,OAAA,EAAS,OAAA,KAAY,KAAA,EAAO;AAC3C,MAAA,MAAM,cAAA,GAAiB;AAAA,QACrB,WAAA,EAAa,mBAAmB,YAAY,CAAA;AAAA,QAC5C,UAAA,EAAY,aAAa,OAAA,EAAS;AAAA,OACpC;AACA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,UAAA,CAAW,cAAc,cAAc,CAAA;AAAA,MACzC,CAAA,MAAO;AACL,QAAA,UAAA,GAAa,qBAAqB,cAAc,CAAA;AAAA,MAClD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,UAAA,EAAY,OAAA,EAAQ;AACpB,MAAA,UAAA,GAAa,IAAA;AAAA,IACf;AAEA,IAAA,IAAI,YAAA,CAAa,OAAA,EAAS,WAAA,KAAgB,KAAA,EAAO;AAC/C,MAAA,OAAA,KAAY,wBAAA,EAAyB;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,OAAA,EAAS,OAAA,EAAQ;AACjB,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAEA,IAAA,IAAI,YAAA,CAAa,OAAA,EAAS,UAAA,KAAe,KAAA,EAAO;AAC9C,MAAA,MAAM,iBAAA,GAAoB,EAAE,OAAA,EAAS,YAAA,CAAa,OAAA,EAAQ;AAC1D,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,aAAA,CAAc,cAAc,iBAAiB,CAAA;AAAA,MAC/C,CAAA,MAAO;AACL,QAAA,aAAA,GAAgB,wBAAwB,iBAAiB,CAAA;AAAA,MAC3D;AAAA,IACF,CAAA,MAAO;AACL,MAAA,aAAA,GAAgB,IAAA;AAAA,IAClB;AACA,IAAA,IAAI,CAAC,eAAe,iBAAA,GAAoB,IAAA;AACxC,IAAA,MAAA,CAAO,wBAAA,CAAyB,YAAA,CAAa,OAAA,EAAS,yBAAA,KAA8B,KAAK,CAAA;AAEzF,IAAA,IAAI,YAAA,CAAa,OAAA,EAAS,eAAA,KAAoB,KAAA,EAAO;AACnD,MAAA,eAAA,KAAoB,qBAAA,EAAsB;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,eAAA,EAAiB,UAAA,EAAW;AAC5B,MAAA,eAAA,GAAkB,IAAA;AAClB,MAAA,cAAA,GAAiB,IAAA;AAAA,IACnB;AAMA,IAAA,MAAM,YAAA,GAAe,aAAa,OAAA,EAAS,iBAAA;AAC3C,IAAA,MAAM,eAAA,GACJ,iBAAiB,IAAA,GACb,KACA,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAA,GACtC,YAAA,GACA,IAAA;AACR,IAAA,MAAM,gBAAA,GACJ,eAAA,IAAmB,IAAA,IAAQ,eAAA,CAAgB,OAAA,KAAY,KAAA;AACzD,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,YAAA,EAAc,OAAA,EAAQ;AACtB,MAAA,YAAA,GAAe,sBAAA,CAAuB;AAAA,QACpC,MAAA,EAAQ,eAAA;AAAA,QACR,uBAAuB,MAAM;AAC3B,UAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AACzB,UAAA,OAAO,UAAA,CACJ,UAAA,EAAW,CACX,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,YAAA,IAAI;AACF,cAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,CAAA,CAAE,GAAA,EAAK,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,kBAAkB,CAAA;AAGlG,cAAA,IAAI,CAAA,CAAE,IAAA,IAAQ,OAAO,MAAA,KAAW,WAAA,IAAe,EAAE,IAAA,KAAS,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,OAAO,IAAA;AACvF,cAAA,OAAO,CAAA,CAAE,QAAA;AAAA,YACX,CAAA,CAAA,MAAQ;AACN,cAAA,OAAO,IAAA;AAAA,YACT;AAAA,UACF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAmB,CAAA,IAAK,IAAA,IAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,MAAA,GAAS,GAAG,CAAA;AAAA,QAC3E,CAAA;AAAA,QACA,SAAA,EAAW,MAAM,QAAA,EAAU,EAAA,IAAM,IAAA;AAAA,QACjC,YAAA;AAAA,QACA,OAAA,EAAS,CAAC,KAAA,KAAU;AAElB,UAAA,KAAKA,WACF,kBAAA,CAAmB;AAAA,YAClB,GAAG,KAAA;AAAA,YACH,WAAA,EAAa;AAAA,WACd,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,YAAA,GAAA,CAAI,MAAM,uBAAA,EAAyB,EAAE,KAAK,MAAA,CAAO,GAAG,GAAG,CAAA;AAAA,UACzD,CAAC,CAAA;AAAA,QACL;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,YAAA,EAAc,OAAA,EAAQ;AACtB,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA4C;AAClE,EAAA,SAAS,IAAA,CAAK,MAAsB,IAAA,EAAgB;AAClD,IAAA,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA,EAAG,OAAA,CAAQ,CAAC,OAAA,KAAY,OAAA,CAAQ,EAAE,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,EACnE;AAEA,EAAA,IAAI,iBAAA,GAAmC,IAAA;AACvC,EAAA,IAAI,cAAA,GAA8F,IAAA;AAClG,EAAA,IAAI,uBAAA,GAAyC,IAAA;AAC7C,EAAA,IAAI,mBAAA,GAAsB,KAAA;AAC1B,EAAA,IAAI,QAAA,GAAiE,IAAA;AACrE,EAAA,MAAM,iBAA0C,EAAC;AAKjD,EAAA,MAAM,aAAwD,EAAC;AAM/D,EAAA,MAAM,WAAA,GAAgC,sBAAA,CAAuB,EAAE,GAAA,EAAK,IAAI,CAAA;AACxE,EAAA,WAAA,CAAY,GAAA,CAAI;AAAA,IACd,QAAA,EAAU,WAAA;AAAA,IACV,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,gBAAA;AAAA,IACT,MAAM,EAAE,SAAA,EAAW,eAAA,CAAgB,SAAA,EAAW,YAAY,iBAAA;AAAkB,GAC7E,CAAA;AAID,EAAA,IAAI,qBAAA,GAA6C,IAAA;AACjD,EAAA,qBAAA,GAAwB,uBAAuB,WAAW,CAAA;AAC1D,EAAA,MAAA,GAAS,IAAI,WAAA,CAAY,eAAA,CAAgB,MAAA,EAAQ;AAAA,IAC/C,UAAU,OAAO,EAAE,QAAA,EAAU,WAAA,EAAa,QAAO,KAAM;AACrD,MAAA,GAAA,CAAI,IAAA,CAAK,kBAAA,EAAoB,EAAE,QAAA,EAAU,QAAQ,CAAA;AACjD,MAAA,gBAAA,EAAkB,gBAAA,EAAiB;AACnC,MAAA,MAAM,YAAA,CAAa,QAAA,EAAU,WAAA,EAAa,MAAM,CAAA;AAAA,IAClD,CAAA;AAAA,IACA,QAAQ,MAAM;AACZ,MAAA,GAAA,CAAI,MAAM,eAAe,CAAA;AACzB,MAAA,IAAA,CAAK,eAAe,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,SAAS,MAAM;AACb,MAAA,GAAA,CAAI,MAAM,eAAe,CAAA;AACzB,MAAA,IAAI,uBAAA,EAAyB;AAC3B,QAAA,gBAAA,EAAkB,eAAA,EAAgB;AAClC,QAAA,IAAA,CAAK,qBAAA,EAAuB,EAAE,IAAA,EAAM,uBAAA,EAAyB,CAAA;AAAA,MAC/D;AACA,MAAA,iBAAA,GAAoB,IAAA;AACpB,MAAA,cAAA,GAAiB,IAAA;AACjB,MAAA,uBAAA,GAA0B,IAAA;AAC1B,MAAA,IAAA,CAAK,eAAe,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,qBAAqB,YAAY;AAC/B,MAAA,IAAI,CAAC,aAAA,IAAiB,YAAA,CAAa,OAAA,EAAS,eAAe,KAAA,EAAO;AAClE,MAAA,GAAA,CAAI,MAAM,mBAAmB,CAAA;AAC7B,MAAA,iBAAA,GAAoB,MAAM,cAAc,IAAA,EAAK;AAC7C,MAAA,MAAA,CAAO,qBAAA,CAAsB,sBAAsB,IAAI,CAAA;AAAA,IACzD,CAAA;AAAA,IACA,oBAAoB,MAAM;AACxB,MAAA,GAAA,CAAI,MAAM,+BAA+B,CAAA;AACzC,MAAA,iBAAA,GAAoB,IAAA;AACpB,MAAA,MAAA,CAAO,sBAAsB,KAAK,CAAA;AAAA,IACpC,CAAA;AAAA,IACA,0BAA0B,YAAY;AACpC,MAAA,IAAI,CAAC,eAAA,IAAmB,YAAA,CAAa,OAAA,EAAS,oBAAoB,KAAA,EAAO;AACzE,MAAA,GAAA,CAAI,MAAM,4BAA4B,CAAA;AACtC,MAAA,MAAM,EAAA,GAAK,MAAM,eAAA,CAAgB,QAAA,EAAS;AAC1C,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,cAAA,GAAiB,EAAA;AACjB,QAAA,MAAA,CAAO,mBAAmB,IAAI,CAAA;AAC9B,QAAA,GAAA,CAAI,KAAA,CAAM,oBAAoB,EAAE,OAAA,EAAS,GAAG,OAAA,EAAS,KAAA,EAAO,EAAA,CAAG,KAAA,EAAO,CAAA;AAAA,MACxE;AAAA,IACF,CAAA;AAAA,IACA,MAAM,wBAAA,GAA2B;AAC/B,MAAA,MAAM,MAAA,GAAS,MAAMA,UAAAA,CAAU,mBAAA,CAAoB,kBAAkB,CAAA;AACrE,MAAA,IAAI,CAAC,OAAO,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,wBAAwB,CAAA;AACjF,MAAA,OAAO,MAAA,CAAO,IAAA,EAAM,OAAA,IAAW,EAAC;AAAA,IAClC,CAAA;AAAA,IACA,MAAM,0BAA0B,QAAA,EAAU;AACxC,MAAA,MAAM,SAAS,MAAMA,UAAAA,CAAU,oBAAA,CAAqB,QAAA,EAAU,kBAAkB,CAAA;AAChF,MAAA,IAAI,CAAC,OAAO,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,uBAAuB,CAAA;AAChF,MAAA,OAAO,MAAA,CAAO,IAAA,EAAM,QAAA,IAAY,EAAC;AAAA,IACnC,CAAA;AAAA,IACA,MAAM,eAAA,CAAgB,QAAA,EAAU,IAAA,EAAM;AACpC,MAAA,MAAM,SAAS,MAAMA,UAAAA,CAAU,sBAAsB,QAAA,EAAU,gBAAA,IAAoB,IAAI,CAAA;AACvF,MAAA,IAAI,CAAC,OAAO,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,sBAAsB,CAAA;AAAA,IACjF;AAAA,KACC,iBAAiB,CAAA;AACpB,EAAA,kBAAA,EAAmB;AAEnB,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,IAAI,QAAA,CAAS,eAAe,SAAA,EAAW;AACrC,MAAA,QAAA,CAAS,gBAAA,CAAiB,kBAAA,EAAoB,MAAM,MAAA,CAAO,OAAO,CAAA;AAAA,IACpE,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAA,EAAM;AAAA,IACf;AAAA,EACF;AAGA,EAAA,IAAI,iBAAA,GAAoD,IAAA;AACxD,EAAA,IAAI,gBAAA,GAA4C,IAAA;AAEhD,EAAA,MAAM,eAAe,YAAA,CAAa,SAAA;AAClC,EAAA,MAAM,eAAA,GAAkB,YAAA,KAClB,YAAA,CAAa,SAAA,KAAc,KAAA,IAC1B,YAAA,CAAa,QAAA,KAAa,KAAA,IAC1B,YAAA,CAAa,UAAA,KAAe,KAAA,IAC5B,YAAA,CAAa,aAAA,KAAkB,IAAA,CAAA;AAEtC,EAAA,IAAI,eAAA,IAAmB,OAAO,QAAA,KAAa,WAAA,EAAa;AACtD,IAAA,gBAAA,GAAmB,sBAAA,CAAuB,cAAc,QAAQ,CAAA;AAEhE,IAAA,iBAAA,GAAoB,sBAAA;AAAA,MAClB;AAAA,QACE,SAAA,EAAW,CAAC,IAAA,EAAM,OAAA,KAAY;AAC5B,UAAA,IAAI,CAAC,gBAAA,CAAkB,UAAA,CAAW,IAAI,CAAA,EAAG;AACvC,YAAA,GAAA,CAAI,KAAA,CAAM,oDAAA,EAAsD,EAAE,IAAA,EAAM,CAAA;AACxE,YAAA;AAAA,UACF;AACA,UAAA,GAAA,CAAI,IAAA,CAAK,yBAAA,EAA2B,EAAE,IAAA,EAAM,SAAS,CAAA;AACrD,UAAA,uBAAA,GAA0B,IAAA;AAC1B,UAAA,IAAA,CAAK,qBAAA,EAAuB,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAC7C,UAAA,MAAA,CAAO,IAAA,EAAK;AAAA,QACd;AAAA,OACF;AAAA,MACA;AAAA,QACE,WAAW,YAAA,EAAc,SAAA;AAAA,QACzB,UAAU,YAAA,EAAc,QAAA;AAAA,QACxB,YAAY,YAAA,EAAc,UAAA;AAAA,QAC1B,WAAA,EAAa,mBAAmB,YAAY,CAAA;AAAA,QAC5C,eAAe,YAAA,EAAc;AAAA;AAC/B,KACF;AAEA,IAAA,GAAA,CAAI,MAAM,4BAAA,EAA8B;AAAA,MACtC,SAAA,EAAW,cAAc,SAAA,KAAc,KAAA;AAAA,MACvC,QAAA,EAAU,cAAc,QAAA,KAAa,KAAA;AAAA,MACrC,UAAA,EAAY,cAAc,UAAA,KAAe,KAAA;AAAA,MACzC,aAAA,EAAe,cAAc,aAAA,KAAkB;AAAA,KAChD,CAAA;AAAA,EACH;AAEA,EAAA,YAAA,CAAa,cAAcA,UAAS,CAAA;AACpC,EAAA,YAAA,CAAa,KAAA,CAAMA,UAAS,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AAC7C,IAAA,IAAI,MAAA,CAAO,IAAA,GAAO,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,0BAA0B,EAAE,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,EAC/E,CAAC,CAAA;AAED,EAAA,SAAS,mBAAmB,OAAA,EAAgC;AAC1D,IAAA,mBAAA,GAAsB,IAAA;AACtB,IAAA,IAAI,OAAA,CAAQ,YAAY,KAAA,EAAO;AAC7B,MAAA,YAAA,GAAe,eAAA;AACf,MAAA,wBAAA,CAAyB,OAAO,SAAS,CAAA;AACzC,MAAA,kBAAA,EAAmB;AACnB,MAAA,MAAA,CAAO,YAAA,CAAa,aAAa,MAAM,CAAA;AACvC,MAAA,GAAA,CAAI,MAAM,qDAAA,EAAuD,EAAE,OAAA,EAAS,OAAA,CAAQ,SAAS,CAAA;AAC7F,MAAA;AAAA,IACF;AACA,IAAA,YAAA,GAAe,kBAAA,CAAmB,cAAc,OAAO,CAAA;AACvD,IAAA,kBAAA,EAAmB;AACnB,IAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,MAAA,CAAO,YAAA,CAAa,aAAa,MAAM,CAAA;AAC3D,IAAA,GAAA,CAAI,MAAM,4BAAA,EAA8B,EAAE,OAAA,EAAS,OAAA,CAAQ,SAAS,CAAA;AAAA,EACtE;AAEA,EAAA,IAAI,sBAAA,CAAuB,MAAM,CAAA,EAAG;AAClC,IAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,MAAA,CAAO,SAAS,CAAA;AACvD,IAAA,IAAI,MAAA,qBAA2B,MAAM,CAAA;AACrC,IAAAA,UAAAA,CAAU,YAAA,EAAa,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AACxC,MAAA,IAAI,MAAA,CAAO,EAAA,IAAM,MAAA,CAAO,IAAA,EAAM;AAC5B,QAAA,kBAAA,CAAmB,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,IAAI,CAAA;AAChD,QAAA,kBAAA,CAAmB,OAAO,IAAI,CAAA;AAAA,MAChC,CAAA,MAAA,IAAW,OAAO,KAAA,EAAO;AACvB,QAAA,GAAA,CAAI,KAAA,CAAM,gCAAA,EAAkC,MAAA,CAAO,KAAK,CAAA;AAAA,MAC1D;AAAA,IACF,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AAChB,MAAA,GAAA,CAAI,KAAA,CAAM,iCAAA,EAAmC,EAAE,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAA,EAAG,CAAA;AAAA,IAC1G,CAAC,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,OAAO,aAAA,KAAkB,KAAA,IAAS,oBAAoB,kBAAA,CAAmB,MAAM,CAAC,CAAA,EAAG;AAC5F,IAAA,GAAA,CAAI,MAAM,2FAA2F,CAAA;AAAA,EACvG;AAEA,EAAA,KAAK,iBAAA,EAAkB;AAEvB,EAAA,GAAA,CAAI,KAAK,aAAA,EAAe,EAAE,SAAA,EAAW,MAAA,CAAO,WAAW,CAAA;AAEvD,EAAA,eAAe,iBAAA,GAAmC;AAChD,IAAA,IAAI,YAAA,CAAa,MAAA,EAAQ,cAAA,KAAmB,KAAA,EAAO;AACnD,IAAA,MAAM,MAAA,GAAS,qBAAqB,iBAAiB,CAAA;AACrD,IAAA,IAAI,MAAA,oBAA0B,MAAM,CAAA;AACpC,IAAA,MAAM,MAAA,GAAS,MAAMA,UAAAA,CAAU,mBAAA,CAAoB,iBAAiB,CAAA;AACpE,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,IAAM,CAAC,OAAO,IAAA,EAAM;AAChC,IAAA,eAAA,CAAgB,iBAAA,EAAmB,OAAO,IAAI,CAAA;AAC9C,IAAA,iBAAA,CAAkB,OAAO,IAAI,CAAA;AAAA,EAC/B;AAEA,EAAA,SAAS,kBAAkB,IAAA,EAAiC;AAC1D,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,MAAM,WAAW,OAAA,CAAQ,MAAA,IAAU,cAAA,CAAe,iBAAA,EAAmB,MAAM,CAAC,CAAA;AAC5E,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,IAAA,CAAK,UAAA,EAAY;AACnC,IAAA,MAAM,OAAA,GAAU,KAAK,kBAAA,KAAuB,QAAA,GAAW,UAAU,iBAAiB,CAAA,IAAA,EAAO,MAAM,CAAA,CAAA,CAAA,GAAM,IAAA,CAAA;AACrG,IAAA,GAAA,CAAI,KAAK,uBAAA,EAAyB;AAAA,MAChC,OAAA,EAAS,iBAAA;AAAA,MACT,OAAA,EAAS,iBAAA;AAAA,MACT,MAAA;AAAA,MACA,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB;AAAA,KACD,CAAA;AACD,IAAA,IAAI,YAAA,CAAa,MAAA,EAAQ,cAAA,KAAmB,cAAA,EAAgB;AAC1D,MAAA,MAAA,CAAO,eAAA,CAAgB;AAAA,QACrB,MAAA;AAAA,QACA,OAAA,EAAS,iBAAA;AAAA,QACT,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,eAAe,YAAA,CAAa,QAAA,EAA+B,WAAA,EAAqB,MAAA,EAAiB;AAC/F,IAAA,MAAM,YAAA,GAAe,SAAA,CAAU,KAAA,CAAM,WAAW,CAAA;AAChD,IAAA,IAAI,CAAC,aAAa,MAAA,EAAQ;AACxB,MAAA,GAAA,CAAI,KAAK,8BAAA,EAAgC,EAAE,MAAA,EAAQ,YAAA,CAAa,QAAQ,CAAA;AACxE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,OAAO,SAAA,EAAW,cAAA;AAC/B,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS;AAAA,UAClC,WAAA;AAAA,UACA,QAAA;AAAA,UACA,GAAA,EAAK,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,IAAA,GAAO,KAAA,CAAA;AAAA,UACvD,eAAe,iBAAA,KAAsB,IAAA;AAAA,UACrC,oBAAoB,cAAA,KAAmB,IAAA;AAAA,UACvC,gBAAA,EAAkB,UAAA,EAAY,UAAA,EAAW,EAAG,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,IAAU,GAAA,IAAO,CAAC,CAAC,CAAA,CAAE,KAAK,CAAA,IAAK,KAAA;AAAA,UACzF,gBAAA,EAAkB,UAAA,EAAY,UAAA,EAAW,EAAG,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,OAAO,CAAA,IAAK,KAAA;AAAA,UAChF,kBAAkB,uBAAA,IAA2B,KAAA;AAAA,SAC9C,CAAA;AACD,QAAA,IAAI,OAAA,CAAQ,YAAY,OAAA,EAAS;AAC/B,UAAA,GAAA,CAAI,KAAK,wCAAA,EAA0C;AAAA,YACjD,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,YAAY,OAAA,CAAQ,UAAA;AAAA,YACpB,QAAQ,OAAA,CAAQ;AAAA,WACjB,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,GAAA,CAAI,KAAA,CAAM,8BAAA,EAAgC,EAAE,GAAG,SAAS,CAAA;AAAA,MAC1D,SAAS,GAAA,EAAK;AACZ,QAAA,GAAA,CAAI,KAAK,6DAAA,EAA0D;AAAA,UACjE,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SACvD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,WAAA,CAAY,UAAA,EAAW,EAAG;AAC7B,MAAA,GAAA,CAAI,KAAK,6CAAwC,CAAA;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,sBAAsB,WAAA,CAAY,KAAA,CAAM,SAAA,CAAU,QAAA,CAAS,WAAW,CAAC,CAAA;AAE7E,IAAA,MAAM,YAAY,MAAA,CAAO,MAAA,GAAS,oBAAA,CAAqB,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA;AACxE,IAAA,MAAM,kBAAkB,MAAM,wBAAA,EAAyB,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AACzE,IAAA,MAAM,cAAc,YAAA,CAAa,OAAA,EAAS,YAAY,KAAA,GAAQ,MAAA,GAAY,YAAY,UAAA,EAAW;AACjG,IAAA,MAAM,cAAc,YAAA,CAAa,OAAA,EAAS,YAAY,KAAA,GAAQ,MAAA,GAAY,YAAY,UAAA,EAAW;AAQjG,IAAA,MAAM,iBAAA,GAAoB,uBAAA,CAAwB,WAAA,CAAY,MAAA,EAAQ,CAAA;AACtE,IAAA,MAAM,iBAAA,GAAoB,gBAAA;AAAA,MACxB,MAAA,CAAO,KAAK,UAAU,CAAA,CAAE,SAAS,CAAA,GAAI,EAAE,GAAG,UAAA,EAAW,GAAI;AAAA,KAC3D;AACA,IAAA,MAAM,oBAAoB,SAAA,GACtB;AAAA,MACE,GAAG,SAAA;AAAA,MACH,GAAI,SAAA,CAAU,WAAA,GACV,EAAE,WAAA,EAAa,wBAAwB,SAAA,CAAU,WAAW,CAAA,EAAE,GAC9D,EAAC;AAAA,MACL,GAAI,SAAA,CAAU,IAAA,GAAO,EAAE,IAAA,EAAM,iBAAiB,SAAA,CAAU,IAAI,CAAA,EAAE,GAAI;AAAC,KACrE,GACA,MAAA;AAEJ,IAAA,MAAM,MAAA,GAAsB;AAAA,MAC1B,IAAI,MAAA,CAAO,UAAA,IAAa,IAAK,CAAA,MAAA,EAAS,KAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,QAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,MACvF,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,QAAA;AAAA,MACA,WAAA,EAAa,mBAAA;AAAA,MACb,UAAA,EAAY,MAAA;AAAA,MACZ,aAAa,kBAAA,EAAmB;AAAA,MAChC,WAAA;AAAA,MACA,WAAA;AAAA,MACA,oBAAoB,YAAA,CAAa,OAAA,EAAS,gBAAgB,KAAA,GAAQ,MAAA,GAAY,SAAS,UAAA,EAAW;AAAA,MAClG,UAAU,WAAA,CAAY,UAAA,CAAW,EAAE,WAAA,EAAa,aAAa,CAAA;AAAA,MAC7D,mBAAmB,iBAAA,IAAqB,MAAA;AAAA,MACxC,iBAAiB,cAAA,IAAkB,MAAA;AAAA,MACnC,QAAA,EAAU;AAAA,QACR,GAAG,cAAA;AAAA,QACH,GAAI,QAAA,GAAW,EAAE,IAAA,EAAM,QAAA,KAAa,EAAC;AAAA,QACrC,GAAI,WAAW,OAAA,GAAU,EAAE,eAAe,SAAA,CAAU,OAAA,KAAY;AAAC,OACnE;AAAA,MACA,WAAW,YAAA,EAAa;AAAA,MACxB,eAAe,gBAAA,EAAiB;AAAA,MAChC,GAAI,eAAA,GAAkB,EAAE,eAAA,KAAoB,EAAC;AAAA,MAC7C,UAAA,EAAY,MAAA,CAAO,YAAA,EAAc,MAAA,EAAQ,WAAA;AAAA,MACzC,UAAA,EAAY,iBAAA;AAAA,MACZ,UAAA,EAAY,iBAAA;AAAA,MACZ,kBAAkB,uBAAA,IAA2B,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAM7C,GAAI,kBAAkB,MAAA,GAAS,CAAA,GAAI,EAAE,WAAA,EAAa,iBAAA,KAAsB,EAAC;AAAA,MACzE,GAAI,iBAAA,GAAoB,EAAE,IAAA,EAAM,iBAAA,KAAsB,EAAC;AAAA,MACvD,GAAI,iBAAA,GAAoB,EAAE,aAAA,EAAe,iBAAA,KAAsB,EAAC;AAAA,MAChE,eAAe,SAAA,EAAW,OAAA;AAAA,MAC1B,gBAAgB,SAAA,EAAW,QAAA;AAAA,MAC3B,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AAEA,IAAA,WAAA,CAAY,GAAA,CAAI;AAAA,MACd,QAAA,EAAU,WAAA;AAAA,MACV,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,4BAA4B,QAAQ,CAAA,CAAA,CAAA;AAAA,MAC7C,IAAA,EAAM,EAAE,QAAA,EAAU,MAAA,CAAO,IAAI,QAAA;AAAS,KACvC,CAAA;AAED,IAAA,IAAI,MAAA,CAAO,cAAc,MAAA,EAAQ;AAC/B,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,WAAA,CAAY,KAAa,KAAA,EAAgB;AACvC,UAAC,MAAA,CAAO,QAAA,CAAqC,GAAG,CAAA,GAAI,KAAA;AAAA,QACtD,CAAA;AAAA,QACA,YAAY,GAAA,EAA0B;AACpC,UAAA,MAAA,CAAO,QAAA,GAAW,GAAA;AAAA,QACpB,CAAA;AAAA,QACA,eAAe,IAAA,EAAc;AAC3B,UAAA,MAAA,CAAO,WAAA,GAAc,IAAA;AAAA,QACvB;AAAA,OACF;AACA,MAAA,MAAA,CAAO,YAAA,CAAa,OAAO,OAAO,CAAA;AAAA,IACpC;AAEA,IAAA,IAAA,CAAK,kBAAA,EAAoB,EAAE,QAAA,EAAU,MAAA,CAAO,IAAI,CAAA;AAEhD,IAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,CAAC,UAAU,MAAA,EAAQ;AACzD,MAAA,MAAM,YAAA,CAAa,QAAQ,MAAM,CAAA;AACjC,MAAA,GAAA,CAAI,KAAK,8BAAA,EAA2B,EAAE,QAAA,EAAU,MAAA,CAAO,IAAI,CAAA;AAC3D,MAAA,IAAA,CAAK,eAAA,EAAiB,EAAE,QAAA,EAAU,MAAA,CAAO,IAAI,CAAA;AAC7C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAMA,UAAAA,CAAU,YAAA,CAAa,MAAM,CAAA;AAClD,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,GAAA,CAAI,KAAK,aAAA,EAAe,EAAE,UAAU,MAAA,CAAO,IAAA,EAAM,UAAU,CAAA;AAC3D,MAAA,IAAA,CAAK,eAAe,EAAE,QAAA,EAAU,MAAA,CAAO,IAAA,EAAM,UAAU,CAAA;AACvD,MAAA,WAAA,CAAY,GAAA,CAAI;AAAA,QACd,QAAA,EAAU,WAAA;AAAA,QACV,KAAA,EAAO,MAAA;AAAA,QACP,SAAS,CAAA,mBAAA,EAAsB,MAAA,CAAO,IAAA,EAAM,QAAA,IAAY,OAAO,EAAE,CAAA,CAAA;AAAA,OAClE,CAAA;AAKD,MAAA,OAAA,CAAgB;AAAA,QACd,MAAA,EAAQ,eAAA;AAAA,QACR,QAAA,EAAU,EAAE,QAAA,EAAU,QAAA,EAAU,OAAO,IAAA,EAAM,QAAA,IAAY,OAAO,EAAA;AAAG,OACpE,CAAA;AAOD,MAAA,IAAI;AACF,QAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,IAAA,EAAM,QAAA,EAAU;AAC1C,UAAA,cAAA,CAAe,MAAA,CAAO,KAAK,QAAQ,CAAA;AAAA,QACrC;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAGR;AAAA,IACF,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,IAAA,CAAK,oCAAoC,EAAE,QAAA,EAAU,OAAO,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,CAAA;AACzF,MAAA,MAAM,YAAA,CAAa,QAAQ,MAAM,CAAA;AACjC,MAAA,IAAA,CAAK,eAAA,EAAiB,EAAE,QAAA,EAAU,MAAA,CAAO,IAAI,KAAA,EAAO,MAAA,CAAO,OAAO,CAAA;AAClE,MAAA,WAAA,CAAY,GAAA,CAAI;AAAA,QACd,QAAA,EAAU,WAAA;AAAA,QACV,KAAA,EAAO,SAAA;AAAA,QACP,OAAA,EAAS,CAAA,+BAAA,EAAkC,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,OACrD,CAAA;AAAA,IACH;AAEA,IAAA,iBAAA,GAAoB,IAAA;AACpB,IAAA,cAAA,GAAiB,IAAA;AACjB,IAAA,uBAAA,GAA0B,IAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,GAAA,GAAwB;AAAA,IAC5B,OAAO,OAAA,EAAS;AACd,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,IACrB,CAAA;AAAA,IAEA,EAAA,CAAG,OAAuB,OAAA,EAA4B;AACpD,MAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,YAAa,GAAA,CAAI,KAAA,kBAAO,IAAI,GAAA,EAAK,CAAA;AACzD,MAAA,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,CAAG,GAAA,CAAI,OAAO,CAAA;AACjC,MAAA,OAAO,MAAM,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,OAAO,CAAA;AAAA,IACnD,CAAA;AAAA,IAEA,QAAQ,IAAA,EAAM;AACZ,MAAA,QAAA,GAAW,IAAA;AAAA,IACb,CAAA;AAAA,IAEA,WAAA,CAAY,KAAK,KAAA,EAAO;AACtB,MAAA,cAAA,CAAe,GAAG,CAAA,GAAI,KAAA;AAAA,IACxB,CAAA;AAAA,IAEA,UAAU,MAAA,EAAQ;AAChB,MAAA,WAAA,CAAY,UAAU,MAAM,CAAA;AAAA,IAC9B,CAAA;AAAA,IAEA,MAAA,GAAS;AACP,MAAA,OAAO,OAAO,SAAA,EAAU;AAAA,IAC1B,CAAA;AAAA,IAEA,IAAA,GAAO;AACL,MAAA,MAAA,CAAO,IAAA,EAAK;AAAA,IACd,CAAA;AAAA,IAEA,SAAS,QAAA,EAAU;AACjB,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,QAAA,EAAU,CAAA;AAAA,IAC1B,CAAA;AAAA,IAEA,IAAA,GAAO;AACL,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB,CAAA;AAAA,IAEA,IAAA,GAAO;AACL,MAAA,MAAA,CAAO,WAAA,EAAY;AAAA,IACrB,CAAA;AAAA,IAEA,QAAA,CAAS,mBAAmB,OAAA,EAAS;AACnC,MAAA,OAAO,MAAA,CAAO,QAAA,CAAS,iBAAA,EAAmB,OAAO,CAAA;AAAA,IACnD,CAAA;AAAA,IAEA,WAAW,OAAA,EAAS;AAClB,MAAA,MAAA,CAAO,WAAW,OAAO,CAAA;AAAA,IAC3B,CAAA;AAAA,IAEA,KAAA,GAAQ;AACN,MAAA,MAAA,CAAO,KAAA,EAAM;AAAA,IACf,CAAA;AAAA,IAEA,aAAa,aAAA,EAAe;AAC1B,MAAA,kBAAA,CAAmB,aAAa,CAAA;AAAA,IAClC,CAAA;AAAA,IAEA,QAAA,GAAW;AACT,MAAA,OAAO,cAAA,CAAe;AAAA,QACpB,WAAA,EAAa,mBAAmB,YAAY,CAAA;AAAA,QAC5C,aAAA,EAAe,OAAO,YAAA,EAAa;AAAA,QACnC,mBAAA;AAAA,QACA,4BAA4B,aAAA,KAAkB,IAAA;AAAA,QAC9C,4BAA4B,UAAA,KAAe;AAAA,OAC5C,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,OAAA,GAAU;AACR,MAAA,iBAAA,EAAmB,OAAA,EAAQ;AAC3B,MAAA,gBAAA,EAAkB,KAAA,EAAM;AACxB,MAAA,MAAA,CAAO,OAAA,EAAQ;AACf,MAAA,UAAA,EAAY,OAAA,EAAQ;AACpB,MAAA,UAAA,EAAY,OAAA,EAAQ;AACpB,MAAA,OAAA,EAAS,OAAA,EAAQ;AACjB,MAAA,eAAA,EAAiB,UAAA,EAAW;AAC5B,MAAA,WAAA,CAAY,OAAA,EAAQ;AACpB,MAAA,YAAA,EAAc,OAAA,EAAQ;AACtB,MAAA,YAAA,GAAe,IAAA;AACf,MAAA,YAAA,CAAa,YAAA,EAAa;AAC1B,MAAA,qBAAA,IAAwB;AACxB,MAAA,qBAAA,GAAwB,IAAA;AACxB,MAAA,WAAA,CAAY,KAAA,EAAM;AAClB,MAAA,SAAA,CAAU,KAAA,EAAM;AAChB,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,GAAA,CAAI,MAAM,WAAW,CAAA;AAAA,IACvB,CAAA;AAAA;AAAA;AAAA;AAAA,IAKA,MAAM,aAAa,KAAA,EAAO;AACxB,MAAA,IAAI,CAAC,WAAA,CAAY,UAAA,EAAW,EAAG;AAC7B,QAAA,GAAA,CAAI,KAAK,mDAA8C,CAAA;AACvD,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,cAAc,WAAA,CAAY,KAAA,CAAM,UAAU,QAAA,CAAS,KAAA,CAAM,WAAW,CAAC,CAAA;AAC3E,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,KAAA;AACnC,MAAA,MAAM,YAAY,MAAA,CAAO,MAAA,GAAS,oBAAA,CAAqB,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA;AACxE,MAAA,MAAM,kBAAA,GAAqB,uBAAA,CAAwB,WAAA,CAAY,MAAA,EAAQ,CAAA;AAQvE,MAAA,MAAM,UAAA,GAAa,gBAAA;AAAA,QACjB,OAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,KAAW,KAAK,CAAC,KAAA,CAAM,IAAA,GAC3C,MAAA,GACA,EAAE,GAAG,UAAA,EAAY,GAAI,KAAA,CAAM,IAAA,IAAQ,EAAC;AAAG,OAC7C;AACA,MAAA,MAAM,oBAAoB,SAAA,GACtB;AAAA,QACE,GAAG,SAAA;AAAA,QACH,GAAI,SAAA,CAAU,WAAA,GACV,EAAE,WAAA,EAAa,wBAAwB,SAAA,CAAU,WAAW,CAAA,EAAE,GAC9D,EAAC;AAAA,QACL,GAAI,SAAA,CAAU,IAAA,GAAO,EAAE,IAAA,EAAM,iBAAiB,SAAA,CAAU,IAAI,CAAA,EAAE,GAAI;AAAC,OACrE,GACA,MAAA;AACJ,MAAA,MAAM,MAAA,GAAsB;AAAA,QAC1B,IAAI,MAAA,CAAO,UAAA,IAAa,IAAK,CAAA,MAAA,EAAS,KAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,QAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAAA,QACvF,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,QAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAa,kBAAA,EAAmB;AAAA,QAChC,QAAA,EAAU,YAAY,UAAA,EAAW;AAAA,QACjC,QAAA,EAAU;AAAA,UACR,GAAI,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,UACvB,GAAI,QAAA,GAAW,EAAE,IAAA,EAAM,QAAA,KAAa,EAAC;AAAA,UACrC,GAAI,MAAM,KAAA,GAAQ,EAAE,OAAO,KAAA,CAAM,KAAA,KAAU,EAAC;AAAA,UAC5C,GAAI,MAAM,QAAA,GAAW,EAAE,UAAU,KAAA,CAAM,QAAA,KAAa,EAAC;AAAA,UACrD,GAAI,MAAM,SAAA,GAAY,EAAE,WAAW,KAAA,CAAM,SAAA,KAAc,EAAC;AAAA,UACxD,GAAI,KAAA,CAAM,MAAA,GAAS,EAAE,MAAA,EAAQ,MAAM,MAAA,EAAO,GAAI,EAAE,MAAA,EAAQ,cAAA;AAAe,SACzE;AAAA,QACA,GAAI,mBAAmB,MAAA,GAAS,CAAA,GAAI,EAAE,WAAA,EAAa,kBAAA,KAAuB,EAAC;AAAA,QAC3E,GAAI,UAAA,IAAc,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,EAAE,IAAA,EAAM,UAAA,EAAW,GAAI,EAAC;AAAA,QAC/E,GAAI,iBAAA,GAAoB,EAAE,aAAA,EAAe,iBAAA,KAAsB,EAAC;AAAA,QAChE,WAAW,YAAA,EAAa;AAAA,QACxB,eAAe,gBAAA,EAAiB;AAAA,QAChC,UAAA,EAAY,iBAAA;AAAA,QACZ,UAAA,EAAY,iBAAA;AAAA,QACZ,eAAe,SAAA,EAAW,OAAA;AAAA,QAC1B,gBAAgB,SAAA,EAAW,QAAA;AAAA,QAC3B,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC;AACA,MAAA,IAAA,CAAK,kBAAA,EAAoB,EAAE,QAAA,EAAU,MAAA,CAAO,IAAI,CAAA;AAChD,MAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,CAAC,UAAU,MAAA,EAAQ;AACzD,QAAA,MAAM,YAAA,CAAa,QAAQ,MAAM,CAAA;AACjC,QAAA,IAAA,CAAK,eAAA,EAAiB,EAAE,QAAA,EAAU,MAAA,CAAO,IAAI,CAAA;AAC7C,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,GAAA,GAAM,MAAMA,UAAAA,CAAU,YAAA,CAAa,MAAM,CAAA;AAC/C,MAAA,IAAI,IAAI,EAAA,EAAI;AACV,QAAA,IAAA,CAAK,eAAe,EAAE,QAAA,EAAU,GAAA,CAAI,IAAA,EAAM,UAAU,CAAA;AACpD,QAAA,IAAI;AACF,UAAA,IAAI,MAAA,CAAO,UAAU,GAAA,CAAI,IAAA,EAAM,UAAU,cAAA,CAAe,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,QAC3E,CAAA,CAAA,MAAQ;AAAA,QAER;AACA,QAAA,OAAO,GAAA,CAAI,MAAM,QAAA,IAAY,IAAA;AAAA,MAC/B;AACA,MAAA,MAAM,YAAA,CAAa,QAAQ,MAAM,CAAA;AACjC,MAAA,IAAA,CAAK,eAAA,EAAiB,EAAE,QAAA,EAAU,MAAA,CAAO,IAAI,KAAA,EAAO,GAAA,CAAI,OAAO,CAAA;AAC/D,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,gBAAA,CAAiB,KAAA,EAAO,OAAA,EAAS;AACrC,MAAA,MAAM,UAAA,GAAa,gBAAgB,KAAK,CAAA;AAKxC,MAAA,WAAA,CAAY,GAAA,CAAI;AAAA,QACd,QAAA,EAAU,WAAA;AAAA,QACV,KAAA,EAAO,OAAA;AAAA,QACP,SAAS,CAAA,uBAAA,EAA0B,UAAA,CAAW,IAAI,CAAA,GAAA,EAAM,WAAW,OAAO,CAAA,CAAA;AAAA,QAC1E,GAAI,UAAA,CAAW,KAAA,GAAQ,EAAE,MAAM,EAAE,KAAA,EAAO,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA,EAAG,GAAG,CAAA,EAAE,KAAM;AAAC,OAC/E,CAAA;AACD,MAAA,MAAM,WAAA,GACJ,OAAA,EAAS,WAAA,EAAa,IAAA,EAAK,IAC3B,CAAA,EAAG,UAAA,CAAW,IAAI,CAAA,EAAA,EAAK,UAAA,CAAW,OAAO,CAAA,CAAA,IACzC,oBAAA;AACF,MAAA,OAAO,IAAI,YAAA,CAAa;AAAA,QACtB,WAAA;AAAA,QACA,QAAA,EAAU,SAAS,QAAA,IAAY,KAAA;AAAA,QAC/B,QAAA,EAAU,SAAS,QAAA,IAAY,MAAA;AAAA,QAC/B,GAAI,SAAS,SAAA,GAAY,EAAE,WAAW,OAAA,CAAQ,SAAA,KAAc,EAAC;AAAA,QAC7D,GAAI,SAAS,IAAA,GAAO,EAAE,MAAM,OAAA,CAAQ,IAAA,KAAS,EAAC;AAAA,QAC9C,MAAA,EAAQ,SAAS,MAAA,IAAU,kBAAA;AAAA,QAC3B,KAAA,EAAO;AAAA,UACL,MAAM,UAAA,CAAW,IAAA;AAAA,UACjB,SAAS,UAAA,CAAW,OAAA;AAAA,UACpB,GAAI,WAAW,KAAA,GAAQ,EAAE,OAAO,UAAA,CAAW,KAAA,KAAU;AAAC,SACxD;AAAA,QACA,QAAA,EAAU;AAAA,UACR,GAAI,OAAA,EAAS,QAAA,IAAY,EAAC;AAAA,UAC1B,GAAI,WAAW,KAAA,GAAQ,EAAE,OAAO,UAAA,CAAW,KAAA,KAAU;AAAC;AACxD,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,QAAA,CAAS,QAAQ,MAAA,EAAQ;AACvB,MAAA,QAAA,GAAW,EAAE,IAAI,MAAA,EAAQ,GAAI,QAAQ,KAAA,GAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,GAAI,EAAC,EAAI,GAAI,QAAQ,IAAA,GAAO,EAAE,MAAM,MAAA,CAAO,IAAA,EAAK,GAAI,EAAC,EAAG;AAC3H,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC3C,UAAA,IAAI,CAAA,KAAM,WAAW,CAAA,KAAM,MAAA,iBAAuB,CAAA,KAAA,EAAQ,CAAC,EAAE,CAAA,GAAI,CAAA;AAAA,QACnE;AAAA,MACF;AACA,MAAA,WAAA,CAAY,GAAA,CAAI;AAAA,QACd,QAAA,EAAU,WAAA;AAAA,QACV,KAAA,EAAO,MAAA;AAAA,QACP,OAAA,EAAS,kBAAkB,MAAM,CAAA,CAAA;AAAA,OAClC,CAAA;AAGD,MAAA,IAAI,YAAA,CAAa,SAAS,OAAA,EAAS;AACjC,QAAA,MAAM,UAAA,GAA6B;AAAA,UACjC,MAAA,EAAQA,UAAAA;AAAA,UACR,QAAQ,YAAA,CAAa,OAAA;AAAA,UACrB,WAAW,eAAA,CAAgB,SAAA;AAAA,UAC3B,MAAA;AAAA,UACA,MAAA,EAAQ,MAAA,GACJ,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAA6B,IAAA,EAAM,MAAA,CAAO,IAAA,EAA4B,QAAA,EAAU,MAAA,CAAO,QAAA,EAA+B,GACtI;AAAA,SACN;AACA,QAAA,IAAI,QAAA,CAAS,OAAO,MAAA,EAAQ;AAE1B,UAAA,WAAA,CAAY,UAAU,CAAA;AAAA,QACxB,CAAA,MAAO;AAEL,UAAA,iBAAA,CAAkB,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,QAC7C;AAIA,QAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,YAAA,KAAiB,KAAA,EAAO;AAC/C,UAAA,KAAKA,WAAU,WAAA,CAAY,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,GAAA,KAAQ;AAC/C,YAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACb,YAAA,MAAM,IAAI,GAAA,CAAI,IAAA;AAMd,YAAA,MAAA,CAAO,eAAA,CAAgB;AAAA,cACrB,MAAM,CAAA,CAAE,IAAA,GACJ,EAAE,IAAA,EAAM,CAAA,CAAE,KAAK,IAAA,IAAQ,MAAA,EAAQ,aAAa,CAAA,CAAE,IAAA,CAAK,gBAAgB,MAAA,EAAQ,eAAA,EAAiB,EAAE,IAAA,CAAK,gBAAA,IAAoB,GAAE,GACzH,IAAA;AAAA,cACJ,QAAA,EAAU,CAAA,CAAE,SAAA,GACR,EAAE,aAAa,CAAA,CAAE,SAAA,CAAU,YAAA,IAAgB,EAAA,EAAI,eAAA,EAAiB,CAAA,CAAE,SAAA,CAAU,gBAAA,IAAoB,GAAE,GAClG,IAAA;AAAA,cACJ,WAAA,EAAa,EAAE,YAAA,IAAgB,CAAA;AAAA,cAC/B,eAAA,EAAiB,EAAE,iBAAA,IAAqB;AAAA,aACzC,CAAA;AAAA,UACH,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,UAAkB,CAAC,CAAA;AAAA,QACpC;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IAEA,cAAc,KAAA,EAAO;AACnB,MAAA,WAAA,CAAY,IAAI,KAAK,CAAA;AAAA,IACvB,CAAA;AAAA,IAEA,cAAA,GAAiB;AACf,MAAA,OAAO,YAAY,MAAA,EAAO;AAAA,IAC5B,CAAA;AAAA,IAEA,MAAA,CAAO,KAAK,KAAA,EAAO;AACjB,MAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,WAAW,CAAA,EAAG;AACjD,MAAA,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,IACpB,CAAA;AAAA,IAEA,QAAQ,IAAA,EAAM;AACZ,MAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACvC,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzC,QAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,SAAS,CAAA,EAAG;AACzC,UAAA,UAAA,CAAW,CAAC,CAAA,GAAI,CAAA;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IAEA,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC7C,QAAA,OAAO,WAAW,GAAG,CAAA;AACrB,QAAA;AAAA,MACF;AAGA,MAAA,KAAA,MAAW,KAAK,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG,OAAO,WAAW,CAAC,CAAA;AAAA,IAC9D,CAAA;AAAA;AAAA,IAIA,MAAM,aAAA,GAAgB;AACpB,MAAA,IAAI,CAAC,QAAA,EAAU,EAAA,EAAI,OAAO,IAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,MAAMA,UAAAA,CAAU,WAAA,CAAY,SAAS,EAAE,CAAA;AACnD,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,MAAA,OAAO;AAAA,QACL,WAAA,EAAc,GAAA,CAAI,IAAA,CAAkC,YAAA,IAAgB,CAAA;AAAA,QACpE,SAAA,EAAY,GAAA,CAAI,IAAA,CAAgC,UAAA,IAAc,CAAA;AAAA,QAC9D,UAAA,EAAY,CAAA;AAAA,QACZ,aAAA,EAAe,CAAA;AAAA,QACf,YAAA,EAAc;AAAA,OAChB;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,OAAA,GAAU;AACd,MAAA,IAAI,CAAC,QAAA,EAAU,EAAA,EAAI,OAAO,IAAA;AAC1B,MAAA,OAAO,OAAA,CAAe,SAAS,EAAE,CAAA;AAAA,IACnC,CAAA;AAAA,IAEA,cAAA,CAAe,QAAQ,QAAA,EAAU;AAC/B,MAAA,IAAI,CAAC,YAAA,CAAa,OAAA,EAAS,OAAA,EAAS;AACpC,MAAA,OAAA,CAAgB,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAA;AAAA,IACtC;AAAA,GACF;AAEA,EAAA,IAAI,OAAO,UAAA,KAAe,WAAA,KAAgB,eAAA,CAAgB,SAAS,KAAA,CAAA,EAAQ;AACzE,IAAA,uBAAA,CAAwB,MAAM,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,QAAqB,OAAA,EAA6C;AAC5F,EAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,EAAQ,WAAA;AACtC,EAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,EAAQ,OAAA,KAChC,kBAAkB,MAAA,IAAU,aAAA,KAAkB,UAAU,QAAA,GAAW,MAAA,CAAA;AACzE,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,MAAA,EAAQ;AAAA,MACN,GAAG,MAAA,CAAO,MAAA;AAAA,MACV,GAAG,OAAA,CAAQ,MAAA;AAAA,MACX,GAAI,aAAA,GAAgB,EAAE,OAAA,EAAS,aAAA,KAAkB,EAAC;AAAA;AAAA;AAAA,MAGlD,GAAI,MAAA,CAAO,MAAA,EAAQ,QAAA,GAAW,EAAE,UAAU,MAAA,CAAO,MAAA,CAAO,QAAA,EAAS,GAAI;AAAC,KACxE;AAAA,IACA,OAAA,EAAS;AAAA,MACP,GAAG,MAAA,CAAO,OAAA;AAAA,MACV,GAAG,OAAA,CAAQ;AAAA,KACb;AAAA,IACA,OAAA,EAAS;AAAA,MACP,GAAG,MAAA,CAAO;AAAA;AACZ,GACF;AACF;AAEA,SAAS,kBAAkB,MAAA,EAAkC;AAC3D,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAA;AAC3B,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,MAAA,CAAO,MAAM,CAAA;AAC3C,EAAA,OAAO;AAAA,IACL,GAAG,MAAA;AAAA,IACH,MAAA,EAAQ;AAAA,MACN,GAAG,MAAA,CAAO,MAAA;AAAA,MACV,GAAG,MAAA,CAAO;AAAA,KACZ;AAAA,IACA,OAAA,EAAS;AAAA,MACP,GAAG,MAAA,CAAO,OAAA;AAAA,MACV,GAAG,MAAA,CAAO;AAAA,KACZ;AAAA,IACA,SAAA,EAAW;AAAA,MACT,GAAG,MAAA,CAAO,SAAA;AAAA,MACV,GAAG,MAAA,CAAO,SAAA;AAAA,MACV,QAAA,EAAU;AAAA,QACR,GAAG,OAAO,SAAA,EAAW,QAAA;AAAA,QACrB,GAAG,OAAO,SAAA,EAAW;AAAA;AACvB;AACF,GACF;AACF;AAEA,SAAS,eAAe,MAAA,EAAmG;AACzH,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,aAAA;AACH,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,EAAE,OAAA,EAAS,QAAA,EAAU,gBAAgB,cAAA,EAAe;AAAA,QAC5D,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,UAAA,EAAY,WAAA,EAAa,eAAA,EAAiB,KAAA,EAAM;AAAA,QAC7G,SAAA,EAAW,EAAE,SAAA,EAAW,KAAA,EAAO,UAAU,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,aAAA,EAAe,KAAA;AAAM,OAC1F;AAAA,IACF,KAAK,WAAA;AACH,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,EAAE,OAAA,EAAS,MAAA,EAAQ,gBAAgB,QAAA,EAAS;AAAA,QACpD,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,MAAA,EAAQ,eAAA,EAAiB,IAAA,EAAK;AAAA,QACtG,SAAA,EAAW,EAAE,SAAA,EAAW,IAAA,EAAM,UAAU,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,aAAA,EAAe,IAAA;AAAK,OACtF;AAAA,IACF,KAAK,gBAAA;AACH,MAAA,OAAO;AAAA,QACL,QAAQ,EAAE,OAAA,EAAS,QAAQ,cAAA,EAAgB,QAAA,EAAU,aAAa,IAAA,EAAK;AAAA,QACvE,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,MAAA,EAAQ,eAAA,EAAiB,IAAA,EAAK;AAAA,QACtG,SAAA,EAAW;AAAA,UACT,SAAA,EAAW,IAAA;AAAA,UACX,QAAA,EAAU,IAAA;AAAA,UACV,UAAA,EAAY,IAAA;AAAA,UACZ,aAAA,EAAe,IAAA;AAAA,UACf,UAAU,EAAE,sBAAA,EAAwB,IAAI,oBAAA,EAAsB,CAAA,EAAG,yBAAyB,EAAA;AAAG;AAC/F,OACF;AAAA,IACF,KAAK,iBAAA;AACH,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,EAAE,OAAA,EAAS,MAAA,EAAQ,gBAAgB,cAAA,EAAe;AAAA,QAC1D,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,UAAA,EAAY,WAAA,EAAa,eAAA,EAAiB,KAAA,EAAM;AAAA,QAC7G,SAAA,EAAW,EAAE,SAAA,EAAW,KAAA,EAAO,UAAU,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,aAAA,EAAe,KAAA;AAAM,OAC1F;AAAA;AAEN;AAEA,SAAS,mBAAmB,MAAA,EAAkD;AAC5E,EAAA,OAAO,OAAO,WAAA,IAAe,oBAAA;AAC/B;AAEA,SAAS,uBAAuB,MAAA,EAA8B;AAC5D,EAAA,IAAI,MAAA,CAAO,aAAA,KAAkB,KAAA,EAAO,OAAO,KAAA;AAC3C,EAAA,IAAI,MAAA,CAAO,aAAA,KAAkB,IAAA,EAAM,OAAO,IAAA;AAC1C,EAAA,OAAO,CAAC,mBAAA,CAAoB,kBAAA,CAAmB,MAAM,CAAC,CAAA;AACxD;AAEA,eAAe,eAAe,OAAA,EAMM;AAClC,EAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAiB,OAAA,CAAQ,WAAW,CAAA;AAC3D,EAAA,OAAO;AAAA,IACL,sBAAsB,QAAA,CAAS,SAAA;AAAA,IAC/B,mBAAmB,QAAA,CAAS,UAAA;AAAA,IAC5B,eAAe,OAAA,CAAQ,aAAA;AAAA,IACvB,oBAAoB,OAAO,WAAA,KAAgB,eAAe,OAAO,WAAA,CAAY,UAAU,YAAA,KAAiB,UAAA;AAAA,IACxG,eAAA,EAAiB,OAAO,iBAAA,KAAsB,WAAA;AAAA,IAC9C,qBAAqB,OAAA,CAAQ,mBAAA;AAAA,IAC7B,4BAA4B,OAAA,CAAQ,0BAAA;AAAA,IACpC,4BAA4B,OAAA,CAAQ,0BAAA;AAAA,IACpC,UAAA,EAAY;AAAA,GACd;AACF;AAEA,eAAe,uBAAA,GAA2D;AACxE,EAAA,OAAO;AAAA,IACL,oBAAA,EAAsB,KAAA;AAAA,IACtB,iBAAA,EAAmB,KAAA;AAAA,IACnB,aAAA,EAAe,KAAA;AAAA,IACf,oBAAoB,OAAO,WAAA,KAAgB,eAAe,OAAO,WAAA,CAAY,UAAU,YAAA,KAAiB,UAAA;AAAA,IACxG,eAAA,EAAiB,OAAO,iBAAA,KAAsB,WAAA;AAAA,IAC9C,mBAAA,EAAqB,KAAA;AAAA,IACrB,0BAAA,EAA4B,KAAA;AAAA,IAC5B,0BAAA,EAA4B,KAAA;AAAA,IAC5B,UAAA,EAAY;AAAA,GACd;AACF;AAEA,eAAe,iBAAiB,WAAA,EAA2E;AACzG,EAAA,IAAI,OAAO,UAAU,WAAA,EAAa,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,YAAY,KAAA,EAAM;AAC/E,EAAA,MAAM,aAAa,OAAO,eAAA,KAAoB,WAAA,GAAc,IAAI,iBAAgB,GAAI,IAAA;AACpF,EAAA,MAAM,KAAA,GAAQ,aAAa,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,GAAK,CAAA,GAAI,IAAA;AACzE,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,YAAY,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,MACvE,MAAA,EAAQ,KAAA;AAAA,MACR,KAAA,EAAO,UAAA;AAAA,MACP,GAAI,UAAA,GAAa,EAAE,QAAQ,UAAA,CAAW,MAAA,KAAW,EAAC;AAAA,MAClD,CAACC,0BAA0B,GAAG;AAAA,KACgC,CAAA;AAChE,IAAA,OAAO,EAAE,SAAA,EAAW,QAAA,CAAS,EAAA,EAAI,YAAY,IAAA,EAAK;AAAA,EACpD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,UAAA,EAAY,KAAA,EAAM;AAAA,EAC/C,CAAA,SAAE;AACA,IAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAAA,EAC/B;AACF;AAEA,SAAS,sBAAsB,SAAA,EAA2B;AACxD,EAAA,OAAO,oBAAoB,SAAS,CAAA,CAAA;AACtC;AAEA,SAAS,mBAAmB,WAAA,EAA6B;AACvD,EAAA,OAAO,qBAAqB,WAAW,CAAA,CAAA;AACzC;AAEA,SAAS,wBAAwB,SAAA,EAAiD;AAChF,EAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,IAAA;AAChD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,qBAAA,CAAsB,SAAS,CAAC,CAAA;AACjE,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,OAAO,OAAO,MAAA,IAAU,IAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,kBAAA,CAAmB,WAAmB,MAAA,EAAqC;AAClF,EAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACzC,EAAA,IAAI;AACF,IAAA,YAAA,CAAa,OAAA,CAAQ,qBAAA,CAAsB,SAAS,CAAA,EAAG,KAAK,SAAA,CAAU;AAAA,MACpE,QAAA,EAAU,KAAK,GAAA,EAAI;AAAA,MACnB;AAAA,KACD,CAAC,CAAA;AAAA,EACJ,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,SAAS,yBAAyB,SAAA,EAAyB;AACzD,EAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACzC,EAAA,IAAI;AACF,IAAA,YAAA,CAAa,UAAA,CAAW,qBAAA,CAAsB,SAAS,CAAC,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,SAAS,qBAAqB,WAAA,EAAiD;AAC7E,EAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,IAAA;AAChD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,kBAAA,CAAmB,WAAW,CAAC,CAAA;AAChE,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,MAAA,CAAO,IAAA,IAAQ,CAAC,MAAA,CAAO,QAAA,IAAY,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,QAAA,GAAW,KAAA,EAAY,OAAO,IAAA;AAC1F,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,eAAA,CAAgB,aAAqB,IAAA,EAAiC;AAC7E,EAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACzC,EAAA,IAAI;AACF,IAAA,YAAA,CAAa,OAAA,CAAQ,kBAAA,CAAmB,WAAW,CAAA,EAAG,KAAK,SAAA,CAAU;AAAA,MACnE,QAAA,EAAU,KAAK,GAAA,EAAI;AAAA,MACnB;AAAA,KACD,CAAC,CAAA;AAAA,EACJ,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,SAAS,cAAA,CAAe,SAAiB,MAAA,EAAyB;AAChE,EAAA,MAAM,YAAA,GAAe,aAAa,OAAO,CAAA;AACzC,EAAA,MAAM,WAAA,GAAc,aAAa,MAAM,CAAA;AACvC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,aAAa,MAAA,EAAQ,WAAA,CAAY,MAAM,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1E,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,CAAC,CAAA,IAAK,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA;AAC/B,IAAA,IAAI,GAAA,GAAM,MAAM,OAAO,IAAA;AACvB,IAAA,IAAI,GAAA,GAAM,MAAM,OAAO,KAAA;AAAA,EACzB;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,aAAa,OAAA,EAA2B;AAC/C,EAAA,OAAO,QACJ,KAAA,CAAM,MAAM,EACZ,GAAA,CAAI,CAAC,SAAS,MAAA,CAAO,QAAA,CAAS,MAAM,EAAE,CAAC,EACvC,MAAA,CAAO,CAAC,SAAS,MAAA,CAAO,QAAA,CAAS,IAAI,CAAC,CAAA;AAC3C;AAEA,SAAS,kBAAA,GAAuC;AAC9C,EAAA,OAAO;AAAA,IACL,QAAQ,MAAM;AAAA,IAAC,CAAA;AAAA,IACf,EAAA,EAAI,MAAM,MAAM;AAAA,IAAC,CAAA;AAAA,IACjB,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,aAAa,MAAM;AAAA,IAAC,CAAA;AAAA,IACpB,WAAW,MAAM;AAAA,IAAC,CAAA;AAAA,IAClB,QAAQ,MAAM,KAAA;AAAA,IACd,MAAM,MAAM;AAAA,IAAC,CAAA;AAAA,IACb,OAAO,MAAM;AAAA,IAAC,CAAA;AAAA,IACd,cAAc,MAAM;AAAA,IAAC,CAAA;AAAA,IACrB,QAAA,EAAU,uBAAA;AAAA,IACV,UAAU,MAAM;AAAA,IAAC,CAAA;AAAA,IACjB,MAAM,MAAM;AAAA,IAAC,CAAA;AAAA,IACb,MAAM,MAAM;AAAA,IAAC,CAAA;AAAA,IACb,QAAA,EAAU,MAAM,MAAM;AAAA,IAAC,CAAA;AAAA,IACvB,YAAY,MAAM;AAAA,IAAC,CAAA;AAAA,IACnB,SAAS,MAAM;AACb,MAAA,QAAA,GAAW,IAAA;AAAA,IACb,CAAA;AAAA,IACA,cAAc,YAAY,IAAA;AAAA,IAC1B,kBAAkB,YAAY,IAAA;AAAA,IAC9B,UAAU,MAAM;AAAA,IAAC,CAAA;AAAA,IACjB,eAAe,MAAM;AAAA,IAAC,CAAA;AAAA,IACtB,cAAA,EAAgB,MAAM,EAAC;AAAA,IACvB,QAAQ,MAAM;AAAA,IAAC,CAAA;AAAA,IACf,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,UAAU,MAAM;AAAA,IAAC,CAAA;AAAA,IACjB,eAAe,YAAY,IAAA;AAAA,IAC3B,SAAS,YAAY,IAAA;AAAA,IACrB,gBAAgB,MAAM;AAAA,IAAC;AAAA,GACzB;AACF;AAwBA,SAAS,uBAAuB,MAAA,EAAsC;AACpE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,MAAM;AAAA,EAAC,CAAA;AACjD,EAAA,MAAM,WAA8B,EAAC;AAMrC,EAAA,IAAI;AACF,IAAA,MAAM,mBAAA,GAAsB,CAAC,IAAA,KAAoD;AAC/E,MAAA,MAAA,CAAO,GAAA,CAAI;AAAA,QACT,QAAA,EAAU,YAAA;AAAA,QACV,KAAA,EAAO,MAAA;AAAA,QACP,SAAS,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,SAAS,QAAQ,CAAA,CAAA;AAAA,QAC7C,MAAM,EAAE,GAAA,EAAK,MAAA,CAAO,QAAA,CAAS,MAAM,IAAA;AAAK,OACzC,CAAA;AAAA,IACH,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,mBAAA,CAAoB,UAAU,CAAA;AAClD,IAAA,MAAA,CAAO,iBAAiB,UAAA,EAAY,KAAA,EAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AAC5D,IAAA,QAAA,CAAS,KAAK,MAAM,MAAA,CAAO,mBAAA,CAAoB,UAAA,EAAY,KAAK,CAAC,CAAA;AAEjE,IAAA,MAAM,QAAA,GAAW,OAAO,OAAA,CAAQ,SAAA;AAChC,IAAA,MAAM,WAAA,GAAc,OAAO,OAAA,CAAQ,YAAA;AACnC,IAAA,MAAA,CAAO,OAAA,CAAQ,SAAA,GAAY,SAAS,OAAA,CAAA,GAAW,IAAA,EAAwC;AACrF,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AACrC,MAAA,IAAI;AACF,QAAA,mBAAA,CAAoB,WAAW,CAAA;AAAA,MACjC,CAAA,CAAA,MAAQ;AAAA,MAGR;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAA,CAAO,OAAA,CAAQ,YAAA,GAAe,SAAS,OAAA,CAAA,GAAW,IAAA,EAA2C;AAC3F,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AACxC,MAAA,IAAI;AACF,QAAA,mBAAA,CAAoB,cAAc,CAAA;AAAA,MACpC,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AACA,IAAA,QAAA,CAAS,KAAK,MAAM;AAClB,MAAA,MAAA,CAAO,QAAQ,SAAA,GAAY,QAAA;AAC3B,MAAA,MAAA,CAAO,QAAQ,YAAA,GAAe,WAAA;AAAA,IAChC,CAAC,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAER;AAMA,EAAA,IAAI;AACF,IAAA,MAAM,YAAY,OAAA,CAAQ,KAAA;AAC1B,IAAA,MAAM,WAAW,OAAA,CAAQ,IAAA;AACzB,IAAA,OAAA,CAAQ,KAAA,GAAQ,YAAa,IAAA,EAAiB;AAC5C,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,GAAA,CAAI;AAAA,UACT,QAAA,EAAU,SAAA;AAAA,UACV,KAAA,EAAO,OAAA;AAAA,UACP,SAAS,IAAA,CAAK,GAAA,CAAI,mBAAmB,CAAA,CAAE,KAAK,GAAG;AAAA,SAChD,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,OAAO,SAAA,CAAU,KAAA,CAAM,IAAA,EAAM,IAAoC,CAAA;AAAA,IACnE,CAAA;AACA,IAAA,OAAA,CAAQ,IAAA,GAAO,YAAa,IAAA,EAAiB;AAC3C,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,GAAA,CAAI;AAAA,UACT,QAAA,EAAU,SAAA;AAAA,UACV,KAAA,EAAO,SAAA;AAAA,UACP,SAAS,IAAA,CAAK,GAAA,CAAI,mBAAmB,CAAA,CAAE,KAAK,GAAG;AAAA,SAChD,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,OAAO,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,IAAmC,CAAA;AAAA,IACjE,CAAA;AACA,IAAA,QAAA,CAAS,KAAK,MAAM;AAClB,MAAA,OAAA,CAAQ,KAAA,GAAQ,SAAA;AAChB,MAAA,OAAA,CAAQ,IAAA,GAAO,QAAA;AAAA,IACjB,CAAC,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAER;AAMA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,CAAC,EAAA,KAAmB;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,EAAA,CAAG,MAAA;AAClB,QAAA,IAAI,EAAE,kBAAkB,OAAA,CAAA,EAAU;AAClC,QAAA,IAAI,GAAA,GAAsB,MAAA;AAC1B,QAAA,IAAI,IAAA,GAAO,CAAA;AACX,QAAA,OAAO,GAAA,IAAO,OAAO,EAAA,EAAI;AACvB,UAAA,MAAM,GAAA,GAAM,GAAA,CAAI,YAAA,CAAa,aAAa,CAAA;AAC1C,UAAA,IAAI,GAAA,EAAK;AACP,YAAA,MAAM,IAAA,GAAA,CAAQ,IAAI,WAAA,IAAe,EAAA,EAAI,MAAK,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACvD,YAAA,MAAA,CAAO,GAAA,CAAI;AAAA,cACT,QAAA,EAAU,UAAA;AAAA,cACV,KAAA,EAAO,MAAA;AAAA,cACP,OAAA,EAAS,WAAW,GAAG,CAAA,EAAG,OAAO,CAAA,QAAA,EAAM,IAAI,KAAK,EAAE,CAAA,CAAA;AAAA,cAClD,IAAA,EAAM,EAAE,MAAA,EAAQ,GAAA,EAAK,KAAK,GAAA,CAAI,OAAA,CAAQ,aAAY;AAAE,aACrD,CAAA;AACD,YAAA;AAAA,UACF;AACA,UAAA,GAAA,GAAM,GAAA,CAAI,aAAA;AACV,UAAA,IAAA,EAAA;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,OAAA,EAAS,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAC5E,IAAA,QAAA,CAAS,KAAK,MAAM,QAAA,CAAS,oBAAoB,OAAA,EAAS,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,EAC1E,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,IAAI;AACF,QAAA,CAAA,EAAE;AAAA,MACJ,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAA;AACF;AASA,SAAS,oBAAoB,GAAA,EAAsB;AACjD,EAAA,IAAI;AACF,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,OAAO,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,IAAI,OAAO,CAAA,CAAA;AAAA,IACpC;AACA,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,EAAM;AAC3C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAC/B,MAAA,OAAO,IAAA,CAAK,SAAS,GAAA,GAAM,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,MAAA,CAAA,GAAM,IAAA;AAAA,IACxD;AACA,IAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,IAAA,OAAO,CAAA,CAAE,SAAS,GAAA,GAAM,CAAA,EAAG,EAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,MAAA,CAAA,GAAM,CAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,CAAA,CAAA,EAAI,OAAO,GAAG,CAAA,CAAA,CAAA;AAAA,EACvB;AACF","file":"index.js","sourcesContent":["import type { MushiLocale } from './types';\n\nexport const en: MushiLocale = {\n widget: {\n trigger: 'Report Issue',\n title: 'Report an Issue',\n close: 'Close',\n back: 'Back',\n submit: 'Submit',\n submitting: 'Submitting…',\n submitted: 'Thank you! Your report has been submitted.',\n error: 'Something went wrong. Please try again.',\n },\n step1: {\n heading: 'What kind of issue?',\n categories: {\n bug: 'Bug',\n slow: 'Slow / Laggy',\n visual: 'Visual Glitch',\n confusing: 'Confusing',\n other: 'Other',\n },\n categoryDescriptions: {\n bug: 'Something is broken or not working',\n slow: 'Performance issue or slow loading',\n visual: 'Layout, styling, or display problem',\n confusing: 'Hard to understand or navigate',\n other: 'Something else',\n },\n },\n step2: {\n heading: 'What happened?',\n intents: {\n bug: ['Crash', 'Unresponsive', 'Data loss', 'Wrong result', 'Other'],\n slow: ['Page load', 'Interaction', 'API call', 'Animation', 'Other'],\n visual: ['Layout broken', 'Overlapping', 'Missing element', 'Wrong color/font', 'Other'],\n confusing: ['Unclear label', 'Missing help', 'Unexpected flow', 'Lost navigation', 'Other'],\n other: ['Feature request', 'Accessibility', 'Typo', 'Other'],\n },\n },\n step3: {\n heading: 'Tell us more',\n descriptionPlaceholder: 'Describe what happened…',\n screenshotButton: 'Attach Screenshot',\n screenshotAttached: 'Screenshot attached',\n elementButton: 'Select Element',\n elementSelected: 'Element selected',\n optional: '(optional)',\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const ja: MushiLocale = {\n widget: {\n trigger: '問題を報告',\n title: '問題を報告する',\n close: '閉じる',\n back: '戻る',\n submit: '送信',\n submitting: '送信中…',\n submitted: 'ありがとうございます!レポートが送信されました。',\n error: 'エラーが発生しました。もう一度お試しください。',\n },\n step1: {\n heading: 'どのような問題ですか?',\n categories: {\n bug: 'バグ',\n slow: '遅い・重い',\n visual: '表示の問題',\n confusing: 'わかりにくい',\n other: 'その他',\n },\n categoryDescriptions: {\n bug: '動作しない、壊れている',\n slow: 'パフォーマンスが悪い、読み込みが遅い',\n visual: 'レイアウト、デザイン、表示の問題',\n confusing: '理解しにくい、操作がわかりにくい',\n other: 'その他の問題',\n },\n },\n step2: {\n heading: '何が起きましたか?',\n intents: {\n bug: ['クラッシュ', '無反応', 'データ消失', '誤った結果', 'その他'],\n slow: ['ページ読込', '操作反応', 'API通信', 'アニメーション', 'その他'],\n visual: ['レイアウト崩れ', '要素の重なり', '要素が表示されない', '色/フォントが違う', 'その他'],\n confusing: ['ラベルが不明瞭', 'ヘルプがない', '予想外のフロー', 'ナビゲーション迷子', 'その他'],\n other: ['機能要望', 'アクセシビリティ', '誤字脱字', 'その他'],\n },\n },\n step3: {\n heading: '詳細を教えてください',\n descriptionPlaceholder: '何が起きたか説明してください…',\n screenshotButton: 'スクリーンショット添付',\n screenshotAttached: 'スクリーンショット添付済み',\n elementButton: '要素を選択',\n elementSelected: '要素選択済み',\n optional: '(任意)',\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const th: MushiLocale = {\n widget: {\n trigger: 'รายงานปัญหา',\n title: 'รายงานปัญหา',\n close: 'ปิด',\n back: 'กลับ',\n submit: 'ส่ง',\n submitting: 'กำลังส่ง…',\n submitted: 'ขอบคุณครับ/ค่ะ! รายงานของคุณถูกส่งแล้ว',\n error: 'เกิดข้อผิดพลาด กรุณาลองใหม่อีกครั้ง',\n },\n step1: {\n heading: 'ปัญหาประเภทไหน?',\n categories: {\n bug: 'บัก',\n slow: 'ช้า / แลค',\n visual: 'แสดงผลผิดปกติ',\n confusing: 'สับสน',\n other: 'อื่นๆ',\n },\n categoryDescriptions: {\n bug: 'มีบางอย่างเสียหรือทำงานไม่ถูกต้อง',\n slow: 'ปัญหาประสิทธิภาพหรือโหลดช้า',\n visual: 'ปัญหาเลย์เอาต์ สไตล์ หรือการแสดงผล',\n confusing: 'เข้าใจยากหรือนำทางยาก',\n other: 'อย่างอื่น',\n },\n },\n step2: {\n heading: 'เกิดอะไรขึ้น?',\n intents: {\n bug: ['แครช', 'ไม่ตอบสนอง', 'ข้อมูลหาย', 'ผลลัพธ์ผิด', 'อื่นๆ'],\n slow: ['โหลดหน้า', 'การโต้ตอบ', 'API', 'แอนิเมชัน', 'อื่นๆ'],\n visual: ['เลย์เอาต์เสีย', 'ซ้อนทับ', 'องค์ประกอบหาย', 'สี/ฟอนต์ผิด', 'อื่นๆ'],\n confusing: ['ป้ายไม่ชัด', 'ไม่มีคำแนะนำ', 'ขั้นตอนไม่คาดคิด', 'หลงทาง', 'อื่นๆ'],\n other: ['ขอฟีเจอร์', 'การเข้าถึง', 'พิมพ์ผิด', 'อื่นๆ'],\n },\n },\n step3: {\n heading: 'บอกเราเพิ่มเติม',\n descriptionPlaceholder: 'อธิบายสิ่งที่เกิดขึ้น…',\n screenshotButton: 'แนบสกรีนช็อต',\n screenshotAttached: 'แนบสกรีนช็อตแล้ว',\n elementButton: 'เลือกองค์ประกอบ',\n elementSelected: 'เลือกองค์ประกอบแล้ว',\n optional: '(ไม่บังคับ)',\n },\n};\n","import type { MushiLocale } from './types';\n\nexport const es: MushiLocale = {\n widget: {\n trigger: 'Reportar problema',\n title: 'Reportar un problema',\n close: 'Cerrar',\n back: 'Volver',\n submit: 'Enviar',\n submitting: 'Enviando…',\n submitted: '¡Gracias! Tu reporte ha sido enviado.',\n error: 'Algo salió mal. Por favor, inténtalo de nuevo.',\n },\n step1: {\n heading: '¿Qué tipo de problema?',\n categories: {\n bug: 'Error',\n slow: 'Lento',\n visual: 'Problema visual',\n confusing: 'Confuso',\n other: 'Otro',\n },\n categoryDescriptions: {\n bug: 'Algo está roto o no funciona',\n slow: 'Problema de rendimiento o carga lenta',\n visual: 'Problema de diseño, estilo o visualización',\n confusing: 'Difícil de entender o navegar',\n other: 'Otro problema',\n },\n },\n step2: {\n heading: '¿Qué pasó?',\n intents: {\n bug: ['Crash', 'Sin respuesta', 'Pérdida de datos', 'Resultado incorrecto', 'Otro'],\n slow: ['Carga de página', 'Interacción', 'Llamada API', 'Animación', 'Otro'],\n visual: ['Layout roto', 'Superposición', 'Elemento faltante', 'Color/fuente incorrecta', 'Otro'],\n confusing: ['Etiqueta confusa', 'Sin ayuda', 'Flujo inesperado', 'Navegación perdida', 'Otro'],\n other: ['Solicitud de función', 'Accesibilidad', 'Error tipográfico', 'Otro'],\n },\n },\n step3: {\n heading: 'Cuéntanos más',\n descriptionPlaceholder: 'Describe lo que pasó…',\n screenshotButton: 'Adjuntar captura',\n screenshotAttached: 'Captura adjunta',\n elementButton: 'Seleccionar elemento',\n elementSelected: 'Elemento seleccionado',\n optional: '(opcional)',\n },\n};\n","import type { MushiLocale } from './types';\nimport { en } from './en';\nimport { ja } from './ja';\nimport { th } from './th';\nimport { es } from './es';\n\nexport type { MushiLocale } from './types';\n\nconst locales: Record<string, MushiLocale> = { en, ja, th, es };\n\nexport function getLocale(code?: string): MushiLocale {\n if (!code) return en;\n const base = code.split('-')[0].toLowerCase();\n return locales[base] ?? en;\n}\n\nexport function getAvailableLocales(): string[] {\n return Object.keys(locales);\n}\n","/**\n * FILE: packages/web/src/styles.ts\n * PURPOSE: Visual design system for the bug-capture widget. Returns a single\n * string of CSS scoped to the widget's shadow root.\n *\n * DESIGN LANGUAGE — \"Mushi Mushi Editorial\"\n *\n * The product name is 虫々 (mushi-mushi, Japanese for \"bug, bug\"). Earlier\n * versions of this widget rendered as a generic SaaS chatbot — round purple\n * button, Inter font, drop-shadowed white modal — indistinguishable from\n * every Intercom/Crisp/UserBack clone. We lean into the brand instead.\n *\n * The aesthetic borrows from Japanese print + editorial design:\n *\n * • PAPER + INK — warm cream surface, deep sumi ink type, no flat\n * white. Subtle paper grain via a single noise SVG\n * background-image to break the digital flatness.\n * • VERMILLION 朱 — single signature accent (#E03C2C) used as a hanko\n * stamp colour. Replaces the generic SaaS purple.\n * Used only for: active state, focus underline,\n * submit button, and the success stamp animation.\n * • SERIF DISPLAY — Iowan/Palatino/Georgia stack for headings (a real\n * editorial serif on every desktop OS, no web font\n * fetch, no FOUT).\n * • MONO METADATA — ui-monospace for step counters, captions, and the\n * submit-button label, evoking a printer's ledger.\n * • RULE LINES — content separators are 1px hairlines, not boxes.\n * Categories list looks like a contents page, not a\n * card stack.\n * • STAMP INTERACTIONS — submit button has a vermillion ink-bloom\n * animation; the success step shows a 朱印 (red\n * stamp) ring with \"RECEIVED\" in mono caps.\n *\n * Constraints respected: typography ≥ 12px (skill: design-frontend),\n * touch targets ≥ 44px, focus-visible always rendered, prefers-reduced-\n * motion fully honoured, AA contrast in both themes, no external fonts.\n */\n\nexport function getWidgetStyles(theme: 'light' | 'dark'): string {\n const isDark = theme === 'dark';\n\n /* ── Tokens ──────────────────────────────────────────────────────────\n Named for the material they evoke (paper, ink, rule, vermillion)\n rather than the role (background, text, border) so the palette is\n hard to dilute with a generic \"primary/secondary\" rename later. */\n\n const paper = isDark ? '#0F0E0C' : '#F8F4ED'; // washi cream / dark wash\n const ink = isDark ? '#F2EBDD' : '#0E0D0B'; // sumi black / cream type\n const inkMuted = isDark ? '#928B7E' : '#5C5852'; // captions, descriptions\n const inkFaint = isDark ? '#5A5650' : '#9A9489'; // disabled, separators\n const rule = isDark ? 'rgba(242,235,221,0.10)' : 'rgba(14,13,11,0.10)';\n const ruleStrong = isDark ? 'rgba(242,235,221,0.18)' : 'rgba(14,13,11,0.16)';\n const vermillion = isDark ? '#FF5A47' : '#E03C2C'; // 朱 hanko red\n const vermillionWash = isDark ? 'rgba(255,90,71,0.12)' : 'rgba(224,60,44,0.08)';\n const vermillionInk = isDark ? '#FFE5E0' : '#7A1F15'; // text on vermillion wash\n\n /* Type stacks. Pure system stacks — no web-font fetch — but curated so\n every OS lands on a high-quality serif/mono rather than a generic\n fallback. The body sans intentionally avoids Inter/Roboto (skill:\n design-frontend \"Anti-Generic\"); system-ui resolves to SF Pro on\n Apple, Segoe UI Variable on Windows 11, Roboto on Android — all\n more characterful than Inter at small sizes. */\n const fontDisplay = `'Iowan Old Style', 'Palatino Linotype', 'Palatino', 'Book Antiqua', 'Cambria', Georgia, 'Times New Roman', serif`;\n const fontBody = `system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI Variable Display', 'Segoe UI', sans-serif`;\n const fontMono = `ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, 'Liberation Mono', monospace`;\n\n /* Custom easing — a soft back-out that feels like a stamp pressing down,\n not a generic ease. Used everywhere a panel/button moves so the whole\n widget shares a single motion signature. */\n const easeStamp = 'cubic-bezier(0.22, 1, 0.36, 1)';\n\n return `\n :host {\n all: initial;\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1.55;\n color: ${ink};\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n font-feature-settings: 'ss01', 'cv11'; /* nicer system-ui glyphs where supported */\n }\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n button { font-family: inherit; }\n\n .mushi-trigger {\n position: fixed;\n width: 52px;\n height: 52px;\n border: 1px solid ${ruleStrong};\n border-radius: 4px;\n background: ${paper};\n color: ${ink};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-family: ${fontDisplay};\n font-size: 22px;\n line-height: 1;\n box-shadow:\n 0 1px 0 ${rule},\n 0 6px 14px -8px rgba(14,13,11,0.35),\n inset 0 -3px 0 ${vermillion};\n transition: transform 200ms ${easeStamp}, box-shadow 200ms ${easeStamp};\n overflow: visible;\n isolation: isolate;\n }\n .mushi-trigger::after {\n content: '';\n position: absolute;\n top: 6px;\n right: 6px;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: ${vermillion};\n box-shadow: 0 0 0 0 ${vermillion};\n animation: mushi-pulse 2.4s ${easeStamp} infinite;\n }\n .mushi-trigger:hover {\n transform: translateY(-2px) rotate(-1.5deg);\n box-shadow:\n 0 1px 0 ${rule},\n 0 14px 24px -10px rgba(14,13,11,0.45),\n inset 0 -3px 0 ${vermillion};\n }\n .mushi-trigger:active {\n transform: translateY(0) rotate(0);\n box-shadow:\n 0 1px 0 ${rule},\n 0 2px 4px -2px rgba(14,13,11,0.35),\n inset 0 -2px 0 ${vermillion};\n }\n .mushi-trigger:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 3px;\n }\n .mushi-trigger.bottom-right {\n bottom: var(--mushi-bottom, calc(24px + env(safe-area-inset-bottom, 0px)));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n }\n .mushi-trigger.bottom-left {\n bottom: var(--mushi-bottom, calc(24px + env(safe-area-inset-bottom, 0px)));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n }\n .mushi-trigger.top-right {\n top: var(--mushi-top, calc(24px + env(safe-area-inset-top, 0px)));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n }\n .mushi-trigger.top-left {\n top: var(--mushi-top, calc(24px + env(safe-area-inset-top, 0px)));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n }\n .mushi-trigger.edge-tab {\n width: 32px;\n height: 88px;\n border-radius: 4px 0 0 4px;\n writing-mode: vertical-rl;\n text-orientation: upright;\n font-size: 16px;\n box-shadow:\n 0 1px 0 ${rule},\n 0 10px 24px -14px rgba(14,13,11,0.45),\n inset -3px 0 0 ${vermillion};\n }\n .mushi-trigger.edge-tab.bottom-right,\n .mushi-trigger.edge-tab.top-right {\n right: var(--mushi-right, 0);\n }\n .mushi-trigger.edge-tab.bottom-left,\n .mushi-trigger.edge-tab.top-left {\n left: var(--mushi-left, 0);\n border-radius: 0 4px 4px 0;\n box-shadow:\n 0 1px 0 ${rule},\n 0 10px 24px -14px rgba(14,13,11,0.45),\n inset 3px 0 0 ${vermillion};\n }\n .mushi-trigger.shrunk {\n width: 36px;\n height: 36px;\n opacity: 0.82;\n transform: scale(0.92);\n }\n\n @keyframes mushi-pulse {\n 0% { box-shadow: 0 0 0 0 ${vermillion}; opacity: 1; }\n 70% { box-shadow: 0 0 0 8px rgba(224,60,44,0); opacity: 0.5; }\n 100% { box-shadow: 0 0 0 0 rgba(224,60,44,0); opacity: 1; }\n }\n\n .mushi-panel {\n position: fixed;\n width: 384px;\n max-width: calc(100vw - 32px);\n max-height: min(640px, calc(100vh - 120px));\n background: ${paper};\n border: 1px solid ${ruleStrong};\n border-radius: 6px;\n box-shadow:\n 0 1px 0 ${rule},\n 0 24px 56px -20px rgba(14,13,11,0.30),\n 0 8px 16px -8px rgba(14,13,11,0.20);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n transform-origin: var(--mushi-origin, bottom right);\n }\n .mushi-panel.open { animation: mushi-stamp-in 320ms ${easeStamp} both; }\n .mushi-panel.closed { display: none; }\n .mushi-panel.bottom-right {\n bottom: var(--mushi-panel-bottom, calc(var(--mushi-bottom, 24px) + 64px));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n --mushi-origin: bottom right;\n }\n .mushi-panel.bottom-left {\n bottom: var(--mushi-panel-bottom, calc(var(--mushi-bottom, 24px) + 64px));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n --mushi-origin: bottom left;\n }\n .mushi-panel.top-right {\n top: var(--mushi-panel-top, calc(var(--mushi-top, 24px) + 64px));\n right: var(--mushi-right, calc(24px + env(safe-area-inset-right, 0px)));\n --mushi-origin: top right;\n }\n .mushi-panel.top-left {\n top: var(--mushi-panel-top, calc(var(--mushi-top, 24px) + 64px));\n left: var(--mushi-left, calc(24px + env(safe-area-inset-left, 0px)));\n --mushi-origin: top left;\n }\n .mushi-outdated {\n margin: 12px 14px 0;\n padding: 10px 12px;\n border: 1px solid ${vermillionWash};\n background: ${vermillionWash};\n color: ${vermillionInk};\n font-family: ${fontBody};\n font-size: 12px;\n line-height: 1.4;\n }\n .mushi-outdated strong {\n display: block;\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n margin-bottom: 2px;\n }\n .mushi-outdated span {\n display: block;\n margin-top: 3px;\n color: ${inkMuted};\n }\n\n @keyframes mushi-stamp-in {\n 0% { opacity: 0; transform: scale(0.94) translateY(6px); }\n 60% { opacity: 1; }\n 100% { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n .mushi-header {\n padding: 18px 20px 14px;\n border-bottom: 1px solid ${rule};\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: end;\n gap: 12px;\n }\n .mushi-header-mark {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border-radius: 3px;\n background: ${vermillion};\n color: #FAF7F0;\n font-family: ${fontDisplay};\n font-size: 14px;\n font-weight: 600;\n line-height: 1;\n letter-spacing: -0.02em;\n transform: rotate(-3deg);\n flex-shrink: 0;\n }\n .mushi-header-titles {\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .mushi-header-eyebrow {\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.18em;\n text-transform: uppercase;\n color: ${inkMuted};\n }\n .mushi-header h3 {\n font-family: ${fontDisplay};\n font-size: 19px;\n font-weight: 500;\n line-height: 1.15;\n letter-spacing: -0.01em;\n color: ${ink};\n }\n .mushi-header-meta {\n align-self: start;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .mushi-step-counter {\n font-family: ${fontMono};\n font-size: 11px;\n color: ${inkMuted};\n letter-spacing: 0.06em;\n tab-size: 2ch;\n padding-top: 2px;\n }\n .mushi-step-counter b {\n font-weight: 600;\n color: ${ink};\n }\n .mushi-close, .mushi-back {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n color: ${inkMuted};\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1;\n border-radius: 3px;\n transition: color 150ms ${easeStamp};\n }\n .mushi-close:hover, .mushi-back:hover { color: ${vermillion}; }\n .mushi-close:focus-visible, .mushi-back:focus-visible {\n outline: 1.5px solid ${vermillion};\n outline-offset: 2px;\n }\n\n /* ── Body ───────────────────────────────────────────────────────\n Generous left/right padding (22px) so type breathes. Vertical\n padding tighter at top because the header rule already creates\n breathing room. */\n .mushi-body {\n padding: 8px 22px 16px;\n overflow-y: auto;\n flex: 1;\n scrollbar-width: thin;\n scrollbar-color: ${inkFaint} transparent;\n }\n .mushi-body::-webkit-scrollbar { width: 6px; }\n .mushi-body::-webkit-scrollbar-thumb { background: ${inkFaint}; border-radius: 3px; }\n\n .mushi-option-btn {\n display: grid;\n grid-template-columns: auto 1fr auto;\n align-items: center;\n gap: 14px;\n width: 100%;\n padding: 14px 0;\n border: none;\n border-bottom: 1px solid ${rule};\n background: transparent;\n cursor: pointer;\n color: inherit;\n text-align: left;\n transition: padding 220ms ${easeStamp}, color 220ms ${easeStamp};\n position: relative;\n }\n .mushi-option-btn:last-child { border-bottom: none; }\n .mushi-option-btn:hover { padding-left: 6px; color: ${vermillion}; }\n .mushi-option-btn:hover .mushi-option-arrow { opacity: 1; transform: translateX(0); color: ${vermillion}; }\n .mushi-option-btn:focus-visible {\n outline: none;\n padding-left: 6px;\n box-shadow: inset 2px 0 0 ${vermillion};\n }\n .mushi-option-icon {\n font-size: 18px;\n line-height: 1;\n flex-shrink: 0;\n filter: ${isDark ? 'none' : 'grayscale(0.15)'};\n }\n .mushi-option-text { display: flex; flex-direction: column; gap: 3px; min-width: 0; }\n .mushi-option-label {\n font-family: ${fontDisplay};\n font-size: 16px;\n font-weight: 500;\n letter-spacing: -0.005em;\n line-height: 1.2;\n }\n .mushi-option-desc {\n font-size: 12px;\n color: ${inkMuted};\n letter-spacing: 0.005em;\n }\n .mushi-option-arrow {\n font-family: ${fontMono};\n font-size: 14px;\n color: ${inkFaint};\n opacity: 0;\n transform: translateX(-4px);\n transition: opacity 220ms ${easeStamp}, transform 220ms ${easeStamp}, color 220ms ${easeStamp};\n }\n .mushi-report-row {\n width: 100%;\n display: grid;\n grid-template-columns: auto 1fr auto;\n gap: 8px;\n align-items: center;\n padding: 10px 0;\n border: 0;\n border-bottom: 1px solid ${rule};\n background: transparent;\n color: ${ink};\n cursor: pointer;\n text-align: left;\n }\n .mushi-report-status {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${vermillion};\n text-transform: uppercase;\n }\n .mushi-report-title {\n font-size: 13px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .mushi-thread-summary {\n border-bottom: 1px solid ${rule};\n padding-bottom: 10px;\n margin-bottom: 10px;\n }\n .mushi-thread-summary span {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${vermillion};\n text-transform: uppercase;\n }\n .mushi-thread {\n display: grid;\n gap: 8px;\n max-height: 180px;\n overflow: auto;\n margin-bottom: 12px;\n }\n .mushi-thread-comment {\n padding: 8px 10px;\n border: 1px solid ${rule};\n background: ${isDark ? 'rgba(242,235,221,0.04)' : 'rgba(14,13,11,0.03)'};\n }\n .mushi-thread-comment.reporter {\n border-color: ${vermillionWash};\n background: ${vermillionWash};\n }\n .mushi-thread-comment strong {\n display: block;\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n margin-bottom: 3px;\n }\n .mushi-thread-comment p,\n .mushi-muted,\n .mushi-error-inline {\n font-size: 12px;\n color: ${inkMuted};\n line-height: 1.45;\n }\n .mushi-error-inline { color: ${vermillion}; }\n\n .mushi-selected-category {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 10px 6px 12px;\n border-left: 2px solid ${vermillion};\n background: ${vermillionWash};\n color: ${vermillionInk};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n margin: 4px 0 14px;\n border-radius: 0 3px 3px 0;\n }\n .mushi-selected-category span:first-child { font-size: 14px; }\n .mushi-intents {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .mushi-intent-btn {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 12px 0;\n border: none;\n border-bottom: 1px solid ${rule};\n background: transparent;\n cursor: pointer;\n color: inherit;\n text-align: left;\n font-family: ${fontDisplay};\n font-size: 15px;\n transition: padding 220ms ${easeStamp}, color 220ms ${easeStamp};\n }\n .mushi-intent-btn::after {\n content: '\\u2192';\n font-family: ${fontMono};\n font-size: 13px;\n color: ${inkFaint};\n opacity: 0;\n transform: translateX(-4px);\n transition: opacity 220ms ${easeStamp}, transform 220ms ${easeStamp};\n }\n .mushi-intent-btn:last-child { border-bottom: none; }\n .mushi-intent-btn:hover { padding-left: 6px; color: ${vermillion}; }\n .mushi-intent-btn:hover::after { opacity: 1; transform: translateX(0); color: ${vermillion}; }\n .mushi-intent-btn:focus-visible {\n outline: none;\n padding-left: 6px;\n box-shadow: inset 2px 0 0 ${vermillion};\n }\n\n .mushi-textarea {\n width: 100%;\n min-height: 96px;\n padding: 8px 0 10px;\n border: none;\n border-bottom: 1px solid ${ruleStrong};\n background: transparent;\n color: ${ink};\n font-family: ${fontBody};\n font-size: 14px;\n line-height: 1.5;\n resize: vertical;\n outline: none;\n transition: border-color 200ms ${easeStamp};\n }\n .mushi-textarea::placeholder {\n color: ${inkFaint};\n font-style: italic;\n }\n .mushi-textarea:focus { border-bottom-color: ${vermillion}; }\n\n .mushi-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-top: 12px;\n }\n .mushi-attach-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 5px 10px;\n border: 1px solid ${ruleStrong};\n border-radius: 3px;\n background: transparent;\n color: ${inkMuted};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n cursor: pointer;\n transition: color 180ms ${easeStamp}, border-color 180ms ${easeStamp}, background 180ms ${easeStamp};\n }\n .mushi-attach-btn:hover {\n color: ${ink};\n border-color: ${ink};\n }\n .mushi-attach-btn.active {\n color: ${vermillion};\n border-color: ${vermillion};\n background: ${vermillionWash};\n }\n .mushi-attach-btn.danger {\n color: ${vermillionInk};\n border-color: ${vermillionWash};\n background: transparent;\n }\n .mushi-attach-btn.danger:hover {\n color: ${vermillion};\n border-color: ${vermillion};\n background: ${vermillionWash};\n }\n .mushi-attach-btn:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 2px;\n }\n\n .mushi-footer {\n padding: 14px 22px 16px;\n border-top: 1px solid ${rule};\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n }\n .mushi-footer-hint {\n font-family: ${fontMono};\n font-size: 10px;\n letter-spacing: 0.10em;\n text-transform: uppercase;\n color: ${inkFaint};\n }\n .mushi-submit {\n position: relative;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 10px 18px;\n border: 1px solid ${vermillion};\n border-radius: 3px;\n background: ${vermillion};\n color: #FAF7F0;\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.16em;\n text-transform: uppercase;\n cursor: pointer;\n overflow: hidden;\n transition: transform 180ms ${easeStamp}, box-shadow 180ms ${easeStamp};\n box-shadow: 0 2px 0 ${isDark ? '#7A1F15' : '#9A2A1E'};\n }\n .mushi-submit::after {\n content: '';\n position: absolute;\n inset: 0;\n background: radial-gradient(circle at center, rgba(255,255,255,0.35) 0%, transparent 60%);\n opacity: 0;\n transform: scale(0.4);\n transition: opacity 280ms ${easeStamp}, transform 380ms ${easeStamp};\n pointer-events: none;\n }\n .mushi-submit:hover {\n transform: translateY(-1px);\n box-shadow: 0 3px 0 ${isDark ? '#7A1F15' : '#9A2A1E'};\n }\n .mushi-submit:hover::after { opacity: 1; transform: scale(1.4); }\n .mushi-submit:active { transform: translateY(1px); box-shadow: 0 1px 0 ${isDark ? '#7A1F15' : '#9A2A1E'}; }\n .mushi-submit:disabled {\n cursor: wait;\n opacity: 0.7;\n }\n .mushi-submit:focus-visible {\n outline: 2px solid ${vermillion};\n outline-offset: 3px;\n }\n .mushi-submit-arrow {\n display: inline-block;\n transition: transform 220ms ${easeStamp};\n }\n .mushi-submit:hover .mushi-submit-arrow { transform: translateX(3px); }\n\n .mushi-brand-footer {\n padding: 9px 14px 11px;\n border-top: 1px solid ${rule};\n color: ${inkFaint};\n font-family: ${fontMono};\n font-size: 9px;\n letter-spacing: 0.16em;\n text-align: center;\n text-transform: uppercase;\n }\n\n .mushi-step-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px 22px 14px;\n color: ${inkFaint};\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.10em;\n }\n .mushi-step-num {\n display: inline-flex;\n align-items: baseline;\n gap: 4px;\n transition: color 200ms ${easeStamp};\n }\n .mushi-step-num.done { color: ${inkMuted}; text-decoration: line-through; text-decoration-color: ${inkFaint}; }\n .mushi-step-num.active {\n color: ${vermillion};\n font-family: ${fontDisplay};\n font-size: 14px;\n font-weight: 600;\n letter-spacing: 0;\n }\n .mushi-step-sep { width: 14px; height: 1px; background: ${rule}; }\n\n .mushi-success {\n text-align: center;\n padding: 28px 16px 20px;\n }\n .mushi-success-stamp {\n position: relative;\n width: 96px;\n height: 96px;\n margin: 0 auto 16px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .mushi-success-stamp svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n }\n .mushi-success-stamp circle {\n fill: none;\n stroke: ${vermillion};\n stroke-width: 3;\n stroke-dasharray: 280;\n stroke-dashoffset: 280;\n transform: rotate(-90deg);\n transform-origin: center;\n animation: mushi-stamp-ring 700ms ${easeStamp} 80ms forwards;\n }\n .mushi-success-stamp-label {\n font-family: ${fontDisplay};\n font-size: 18px;\n font-weight: 600;\n color: ${vermillion};\n letter-spacing: 0.04em;\n transform: rotate(-6deg);\n opacity: 0;\n animation: mushi-stamp-press 360ms ${easeStamp} 600ms forwards;\n }\n .mushi-success-headline {\n font-family: ${fontDisplay};\n font-size: 18px;\n font-weight: 500;\n color: ${ink};\n margin-bottom: 4px;\n }\n .mushi-success-meta {\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.10em;\n text-transform: uppercase;\n color: ${inkMuted};\n }\n\n @keyframes mushi-stamp-ring {\n to { stroke-dashoffset: 0; }\n }\n @keyframes mushi-stamp-press {\n 0% { opacity: 0; transform: rotate(-6deg) scale(1.3); }\n 60% { opacity: 1; transform: rotate(-6deg) scale(0.94); }\n 100% { opacity: 1; transform: rotate(-6deg) scale(1); }\n }\n\n .mushi-error {\n margin-top: 10px;\n padding: 8px 0 8px 10px;\n border-left: 2px solid ${vermillion};\n color: ${vermillion};\n font-size: 12px;\n font-family: ${fontMono};\n letter-spacing: 0.02em;\n }\n\n /* ── Rewards nudge (category step) ───────────────────────────── */\n .mushi-rewards-nudge {\n border-top: 1px solid ${rule};\n padding: 10px 0 4px;\n margin-top: 6px;\n }\n .mushi-rewards-row {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 8px;\n }\n .mushi-tier-pip {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n .mushi-rewards-tier-name {\n font-family: ${fontMono};\n font-size: 11px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: ${ink};\n }\n .mushi-rewards-pts-count {\n font-family: ${fontMono};\n font-size: 11px;\n color: ${inkMuted};\n margin-right: auto;\n }\n .mushi-rewards-pts-earn {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${vermillion};\n letter-spacing: 0.04em;\n white-space: nowrap;\n }\n .mushi-tier-bar-track {\n height: 3px;\n background: ${ruleStrong};\n border-radius: 2px;\n overflow: hidden;\n margin-bottom: 5px;\n }\n .mushi-tier-bar-fill {\n height: 100%;\n background: ${vermillion};\n border-radius: 2px;\n transition: width 600ms ${easeStamp};\n }\n .mushi-rewards-next-label {\n font-family: ${fontMono};\n font-size: 10px;\n color: ${inkMuted};\n text-align: right;\n letter-spacing: 0.02em;\n }\n\n /* ── Rewards on success step ─────────────────────────────────── */\n .mushi-success-rewards {\n margin-top: 14px;\n padding-top: 12px;\n border-top: 1px solid ${rule};\n width: 100%;\n }\n .mushi-success-pts-award {\n font-family: ${fontMono};\n font-size: 22px;\n font-weight: 700;\n color: ${vermillion};\n text-align: center;\n letter-spacing: 0.06em;\n margin-bottom: 10px;\n opacity: 0;\n animation: mushi-pts-pop 420ms ${easeStamp} 900ms forwards;\n }\n .success-bar { margin: 0 0 5px; }\n\n @keyframes mushi-pts-pop {\n from { opacity: 0; transform: scale(0.75) translateY(6px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n }\n\n /* ─── Beta mode strip (category step) ─────────────────────────────── */\n\n .mushi-beta-strip {\n margin: 0 16px 2px;\n padding: 9px 12px;\n background: rgba(99, 102, 241, 0.07);\n border: 1px solid rgba(99, 102, 241, 0.18);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .mushi-beta-strip-row {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .mushi-beta-tag {\n display: inline-flex;\n align-items: center;\n padding: 1px 6px;\n border-radius: 4px;\n background: rgba(245, 158, 11, 0.15);\n border: 1px solid rgba(245, 158, 11, 0.35);\n color: #b45309;\n font-family: var(--mushi-font-mono);\n font-size: 9px;\n font-weight: 700;\n letter-spacing: 0.08em;\n line-height: 1.6;\n white-space: nowrap;\n flex-shrink: 0;\n }\n\n @media (prefers-color-scheme: dark) {\n .mushi-beta-tag {\n background: rgba(245, 158, 11, 0.12);\n border-color: rgba(245, 158, 11, 0.28);\n color: #fbbf24;\n }\n }\n\n .mushi-beta-msg {\n font-size: 11px;\n color: var(--mushi-text-dim);\n line-height: 1.45;\n }\n\n .mushi-beta-contact-hint {\n font-size: 10px;\n color: var(--mushi-text-dim);\n opacity: 0.72;\n font-family: var(--mushi-font-mono);\n }\n\n .mushi-beta-perks {\n list-style: none;\n margin: 2px 0 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .mushi-beta-perks li {\n font-size: 10.5px;\n color: #4f46e5;\n font-weight: 500;\n }\n\n @media (prefers-color-scheme: dark) {\n .mushi-beta-perks li {\n color: #818cf8;\n }\n }\n\n /* ─── Beta changelog (collapsible What's new) ──────────────────────── */\n\n .mushi-changelog {\n margin-top: 5px;\n }\n\n .mushi-changelog-summary {\n font-size: 10.5px;\n color: var(--mushi-text-dim);\n cursor: pointer;\n list-style: none;\n display: flex;\n align-items: center;\n gap: 4px;\n user-select: none;\n }\n\n .mushi-changelog-summary::before {\n content: '▶';\n font-size: 7px;\n opacity: 0.6;\n transition: transform 0.15s ease;\n }\n\n .mushi-changelog[open] .mushi-changelog-summary::before {\n transform: rotate(90deg);\n }\n\n .mushi-changelog-list {\n margin: 5px 0 0 4px;\n padding: 0;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .mushi-changelog-list li {\n font-size: 10.5px;\n color: var(--mushi-text-dim);\n line-height: 1.5;\n }\n\n /* ─── Beta success footer ───────────────────────────────────────────── */\n\n .mushi-beta-success-footer {\n margin-top: 14px;\n padding: 10px 14px;\n background: rgba(99, 102, 241, 0.06);\n border: 1px solid rgba(99, 102, 241, 0.14);\n border-radius: 8px;\n display: flex;\n flex-direction: column;\n gap: 3px;\n text-align: left;\n }\n\n .mushi-beta-success-line {\n font-size: 11px;\n color: var(--mushi-text-dim);\n line-height: 1.5;\n }\n\n .mushi-beta-success-dim {\n opacity: 0.65;\n font-size: 10.5px;\n }\n\n @media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.001ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.001ms !important;\n }\n .mushi-success-stamp circle { stroke-dashoffset: 0; }\n .mushi-success-stamp-label { opacity: 1; }\n .mushi-success-pts-award { opacity: 1; }\n }\n `;\n}\n","/**\n * FILE: packages/web/src/widget.ts\n * PURPOSE: The bug-capture widget — floating trigger + multi-step report\n * panel — that mounts into a customer's app via `Mushi.init()`.\n *\n * DESIGN: Visual styling lives in `./styles.ts` (\"Mushi Mushi Editorial\":\n * paper + sumi ink + 朱 vermillion, serif display + monospace\n * metadata, ledger-style step counter, hanko stamp animation on\n * success). This file owns the DOM structure, state, and all\n * user-facing ARIA / keyboard wiring.\n */\n\nimport type {\n MushiReportCategory,\n MushiReporterComment,\n MushiReporterReport,\n MushiWidgetConfig,\n} from '@mushi-mushi/core';\nimport { getLocale, type MushiLocale } from './i18n';\nimport { getWidgetStyles } from './styles';\n\ntype WidgetStep = 'category' | 'intent' | 'details' | 'success' | 'reports' | 'report-detail';\n\nconst CATEGORY_ICONS: Record<MushiReportCategory, string> = {\n bug: '\\u26A0\\uFE0F',\n slow: '\\uD83D\\uDC0C',\n visual: '\\uD83C\\uDFA8',\n confusing: '\\uD83D\\uDE15',\n other: '\\uD83D\\uDCDD',\n};\n\n/** The two-digit padded step number used in the header ledger (\"01 / 03\"). */\nfunction pad2(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n\nconst TOTAL_STEPS = 3;\nconst STEP_NUMBER: Record<Exclude<WidgetStep, 'success'>, number> = {\n category: 1,\n intent: 2,\n details: 3,\n reports: 1,\n 'report-detail': 1,\n};\n\n/** Detects modifier-key presses for the Ctrl/Cmd+Enter submit shortcut.\n * metaKey covers macOS, ctrlKey covers Windows/Linux/ChromeOS. */\nfunction isSubmitShortcut(e: KeyboardEvent): boolean {\n return (e.metaKey || e.ctrlKey) && e.key === 'Enter';\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nexport interface WidgetRewardsState {\n tier: { slug: string; displayName: string; pointsThreshold: number } | null;\n nextTier: { displayName: string; pointsThreshold: number } | null;\n totalPoints: number;\n /** Expected base points for a `report_submit` action (default 50). */\n pointsForReport: number;\n}\n\nexport interface WidgetCallbacks {\n onSubmit(data: { category: MushiReportCategory; description: string; intent?: string }): void;\n onOpen(): void;\n onClose(): void;\n onScreenshotRequest(): void;\n onScreenshotRemove?(): void;\n onElementSelectorRequest?(): void;\n onReporterReportsRequest?(): Promise<MushiReporterReport[]>;\n onReporterCommentsRequest?(reportId: string): Promise<MushiReporterComment[]>;\n onReporterReply?(reportId: string, body: string): Promise<void>;\n}\n\nexport class MushiWidget {\n private host: HTMLElement;\n private shadow: ShadowRoot;\n private config: Required<MushiWidgetConfig>;\n private callbacks: WidgetCallbacks;\n private locale: MushiLocale;\n private isOpen = false;\n private step: WidgetStep = 'category';\n private selectedCategory: MushiReportCategory | null = null;\n private selectedIntent: string | null = null;\n private screenshotAttached = false;\n private allowScreenshotRemove = true;\n private elementSelected = false;\n private submitting = false;\n private triggerVisible = true;\n private triggerShrunk = false;\n private triggerHiddenByScroll = false;\n private sdkFreshness: { latest: string | null; current: string; deprecated: boolean; message?: string | null } | null = null;\n private reporterReports: MushiReporterReport[] = [];\n private reporterComments: MushiReporterComment[] = [];\n private selectedReportId: string | null = null;\n private reporterLoading = false;\n private reporterError: string | null = null;\n private attachedLaunchers: Array<() => void> = [];\n private smartHideCleanup: (() => void) | null = null;\n private smartHideTimer: ReturnType<typeof setTimeout> | null = null;\n /** Captured at the moment of submit so the success ledger metadata\n * (\"REPORT · 14:23:07 JST\") doesn't drift while the success step\n * is on screen. */\n private submittedAt: Date | null = null;\n /** Pending success-state + auto-close timers. Tracked so destroy()\n * can clear them — otherwise a host that unmounts mid-submit leaks\n * this MushiWidget reference (and re-renders into a detached shadow\n * root) for up to ~3.3s after destroy. */\n private successTimer: ReturnType<typeof setTimeout> | null = null;\n private autoCloseTimer: ReturnType<typeof setTimeout> | null = null;\n private rewardsState: WidgetRewardsState | null = null;\n\n constructor(config: MushiWidgetConfig = {}, callbacks: WidgetCallbacks, private readonly sdkVersion = '0.7.0') {\n this.config = {\n position: config.position ?? 'bottom-right',\n anchor: config.anchor ?? {},\n theme: config.theme ?? 'auto',\n // Falsy-OR (NOT `??`) on purpose: `triggerText: ''` is semantically\n // nonsense — it would render a labelless, glyphless trigger button\n // that users can't see or aim at. Treat empty string the same as\n // omitted so any caller that wires this to a cleared form input or\n // pastes a legacy snippet that emitted `triggerText: \"\"` (see\n // apps/admin/src/lib/sdkSnippets.ts widgetLines history) still gets\n // the default 🐛 and a visible button.\n triggerText: config.triggerText || '\\uD83D\\uDC1B',\n expandedTitle: config.expandedTitle ?? '',\n mode: config.mode ?? 'conversational',\n locale: config.locale ?? 'auto',\n zIndex: config.zIndex ?? 99999,\n trigger: config.trigger ?? 'auto',\n attachToSelector: config.attachToSelector ?? '',\n inset: config.inset ?? {},\n respectSafeArea: config.respectSafeArea ?? true,\n hideOnSelector: config.hideOnSelector ?? '',\n hideOnRoutes: config.hideOnRoutes ?? [],\n environments: config.environments ?? {},\n smartHide: config.smartHide ?? false,\n draggable: config.draggable ?? false,\n brandFooter: config.brandFooter ?? true,\n outdatedBanner: config.outdatedBanner ?? 'auto',\n betaMode: config.betaMode ?? {},\n };\n this.callbacks = callbacks;\n this.locale = getLocale(this.config.locale === 'auto' ? undefined : this.config.locale);\n\n this.host = document.createElement('div');\n this.host.id = 'mushi-mushi-widget';\n this.shadow = this.host.attachShadow({ mode: 'closed' });\n }\n\n mount(): void {\n if (this.host.isConnected) return;\n document.body.appendChild(this.host);\n this.syncAttachedLaunchers();\n this.syncSmartHide();\n this.render();\n }\n\n getIsMounted(): boolean {\n return this.host.isConnected;\n }\n\n updateConfig(config: MushiWidgetConfig = {}): void {\n this.config = {\n ...this.config,\n ...(config.position ? { position: config.position } : {}),\n ...(config.anchor !== undefined ? { anchor: config.anchor } : {}),\n ...(config.theme ? { theme: config.theme } : {}),\n ...(config.triggerText !== undefined ? { triggerText: config.triggerText || '\\uD83D\\uDC1B' } : {}),\n ...(config.expandedTitle !== undefined ? { expandedTitle: config.expandedTitle } : {}),\n ...(config.mode ? { mode: config.mode } : {}),\n ...(config.locale ? { locale: config.locale } : {}),\n ...(config.zIndex !== undefined ? { zIndex: config.zIndex } : {}),\n ...(config.trigger ? { trigger: config.trigger } : {}),\n ...(config.attachToSelector !== undefined ? { attachToSelector: config.attachToSelector } : {}),\n ...(config.inset !== undefined ? { inset: config.inset } : {}),\n ...(config.respectSafeArea !== undefined ? { respectSafeArea: config.respectSafeArea } : {}),\n ...(config.hideOnSelector !== undefined ? { hideOnSelector: config.hideOnSelector } : {}),\n ...(config.hideOnRoutes !== undefined ? { hideOnRoutes: config.hideOnRoutes } : {}),\n ...(config.environments !== undefined ? { environments: config.environments } : {}),\n ...(config.smartHide !== undefined ? { smartHide: config.smartHide } : {}),\n ...(config.draggable !== undefined ? { draggable: config.draggable } : {}),\n ...(config.brandFooter !== undefined ? { brandFooter: config.brandFooter } : {}),\n ...(config.outdatedBanner !== undefined ? { outdatedBanner: config.outdatedBanner } : {}),\n ...(config.betaMode !== undefined ? { betaMode: config.betaMode } : {}),\n };\n this.locale = getLocale(this.config.locale === 'auto' ? undefined : this.config.locale);\n this.syncAttachedLaunchers();\n this.syncSmartHide();\n this.render();\n }\n\n open(options?: { category?: MushiReportCategory }): void {\n if (this.isOpen) return;\n this.isOpen = true;\n this.screenshotAttached = false;\n this.elementSelected = false;\n this.submitting = false;\n this.submittedAt = null;\n\n if (options?.category) {\n this.selectedCategory = options.category;\n this.selectedIntent = null;\n this.step = 'intent';\n } else {\n this.selectedCategory = null;\n this.selectedIntent = null;\n this.step = 'category';\n }\n\n this.render();\n this.callbacks.onOpen();\n }\n\n close(): void {\n if (!this.isOpen) return;\n this.isOpen = false;\n this.render();\n this.callbacks.onClose();\n }\n\n getIsOpen(): boolean {\n return this.isOpen;\n }\n\n showTrigger(): void {\n this.triggerVisible = true;\n this.render();\n }\n\n hideTrigger(): void {\n this.triggerVisible = false;\n this.render();\n }\n\n setTrigger(trigger: NonNullable<MushiWidgetConfig['trigger']>): void {\n this.updateConfig({ trigger });\n }\n\n attachTo(selectorOrElement: string | Element, options: MushiWidgetConfig = {}): () => void {\n const elements = typeof selectorOrElement === 'string'\n ? Array.from(document.querySelectorAll(selectorOrElement))\n : [selectorOrElement];\n const cleanups = elements.map((el) => {\n const onClick = (event: Event) => {\n event.preventDefault();\n this.updateConfig(options);\n this.open();\n };\n el.addEventListener('click', onClick);\n return () => el.removeEventListener('click', onClick);\n });\n return () => cleanups.forEach((cleanup) => cleanup());\n }\n\n setScreenshotAttached(attached: boolean): void {\n this.screenshotAttached = attached;\n if (this.isOpen) this.render();\n }\n\n setAllowScreenshotRemove(allow: boolean): void {\n this.allowScreenshotRemove = allow;\n if (this.isOpen) this.render();\n }\n\n setElementSelected(selected: boolean): void {\n this.elementSelected = selected;\n if (this.isOpen) this.render();\n }\n\n setSdkFreshness(info: { latest: string | null; current: string; deprecated: boolean; message?: string | null }): void {\n this.sdkFreshness = info;\n if (this.isOpen) this.render();\n }\n\n setRewardsState(state: WidgetRewardsState | null): void {\n this.rewardsState = state;\n if (this.isOpen) this.render();\n }\n\n destroy(): void {\n if (this.successTimer !== null) {\n clearTimeout(this.successTimer);\n this.successTimer = null;\n }\n if (this.autoCloseTimer !== null) {\n clearTimeout(this.autoCloseTimer);\n this.autoCloseTimer = null;\n }\n if (this.smartHideTimer !== null) {\n clearTimeout(this.smartHideTimer);\n this.smartHideTimer = null;\n }\n this.smartHideCleanup?.();\n this.smartHideCleanup = null;\n this.attachedLaunchers.forEach((cleanup) => cleanup());\n this.attachedLaunchers = [];\n this.host.remove();\n }\n\n private syncAttachedLaunchers(): void {\n this.attachedLaunchers.forEach((cleanup) => cleanup());\n this.attachedLaunchers = [];\n if (this.config.trigger !== 'attach' || !this.config.attachToSelector) return;\n if (typeof document === 'undefined') return;\n this.attachedLaunchers.push(this.attachTo(this.config.attachToSelector));\n }\n\n private syncSmartHide(): void {\n this.smartHideCleanup?.();\n this.smartHideCleanup = null;\n this.triggerShrunk = false;\n this.triggerHiddenByScroll = false;\n if (!this.config.smartHide || typeof window === 'undefined') return;\n\n const smart = this.config.smartHide === true\n ? { onMobile: 'edge-tab' as const, onScroll: 'shrink' as const, onIdleMs: 900 }\n : this.config.smartHide;\n if (!smart.onScroll) return;\n\n const onScroll = () => {\n if (smart.onScroll === 'hide') {\n this.triggerHiddenByScroll = true;\n } else {\n this.triggerShrunk = true;\n }\n this.render();\n if (this.smartHideTimer !== null) clearTimeout(this.smartHideTimer);\n this.smartHideTimer = setTimeout(() => {\n this.triggerHiddenByScroll = false;\n this.triggerShrunk = false;\n this.render();\n }, smart.onIdleMs ?? 900);\n };\n window.addEventListener('scroll', onScroll, { passive: true });\n this.smartHideCleanup = () => window.removeEventListener('scroll', onScroll);\n }\n\n private shouldRenderTrigger(): boolean {\n if (!this.triggerVisible) return false;\n if (this.triggerHiddenByScroll) return false;\n if (this.config.trigger === 'manual' || this.config.trigger === 'hidden' || this.config.trigger === 'attach') {\n return false;\n }\n if (this.isMobileSmartHidden()) return false;\n if (this.isRouteHidden()) return false;\n if (this.config.hideOnSelector && document.querySelector(this.config.hideOnSelector)) return false;\n const action = this.config.environments[this.detectEnvironment()];\n return action !== 'never' && action !== 'manual';\n }\n\n private effectiveTrigger(): NonNullable<MushiWidgetConfig['trigger']> {\n if (!this.config.smartHide || typeof window === 'undefined') return this.config.trigger;\n const smart = this.config.smartHide === true\n ? { onMobile: 'edge-tab' as const }\n : this.config.smartHide;\n if (window.matchMedia('(max-width: 768px)').matches && smart.onMobile === 'edge-tab') {\n return 'edge-tab';\n }\n return this.config.trigger;\n }\n\n private isMobileSmartHidden(): boolean {\n if (!this.config.smartHide || typeof window === 'undefined') return false;\n const smart = this.config.smartHide === true ? { onMobile: 'edge-tab' as const } : this.config.smartHide;\n return window.matchMedia('(max-width: 768px)').matches && smart.onMobile === 'hide';\n }\n\n private detectEnvironment(): 'production' | 'staging' | 'development' {\n const host = typeof location !== 'undefined' ? location.hostname : '';\n if (host === 'localhost' || host === '127.0.0.1' || host.endsWith('.local')) return 'development';\n if (/\\b(staging|stage|preview|dev)\\b/i.test(host)) return 'staging';\n return 'production';\n }\n\n private isRouteHidden(): boolean {\n if (!this.config.hideOnRoutes.length || typeof location === 'undefined') return false;\n return this.config.hideOnRoutes.some((route) => location.pathname.includes(route));\n }\n\n private getTheme(): 'light' | 'dark' {\n if (this.config.theme !== 'auto') return this.config.theme;\n if (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n return 'light';\n }\n\n private render(): void {\n const theme = this.getTheme();\n const pos = this.config.position;\n const t = this.locale;\n\n this.shadow.innerHTML = '';\n\n const style = document.createElement('style');\n style.textContent = getWidgetStyles(theme);\n this.shadow.appendChild(style);\n\n if (this.shouldRenderTrigger()) {\n const effectiveTrigger = this.effectiveTrigger();\n const trigger = document.createElement('button');\n trigger.className = `mushi-trigger ${pos}${effectiveTrigger === 'edge-tab' ? ' edge-tab' : ''}${this.triggerShrunk ? ' shrunk' : ''}`;\n trigger.textContent = this.config.triggerText;\n trigger.setAttribute('aria-label', t.widget.trigger);\n trigger.setAttribute('aria-haspopup', 'dialog');\n trigger.setAttribute('aria-expanded', String(this.isOpen));\n trigger.style.zIndex = String(this.config.zIndex);\n this.applyInsetVars(trigger);\n trigger.addEventListener('click', () => {\n if (this.isOpen) this.close();\n else this.open();\n });\n this.shadow.appendChild(trigger);\n }\n\n const panel = document.createElement('div');\n panel.className = `mushi-panel ${pos}${this.isOpen ? ' open' : ' closed'}`;\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-modal', 'true');\n panel.setAttribute('aria-label', t.widget.title);\n panel.style.zIndex = String(this.config.zIndex + 1);\n this.applyInsetVars(panel);\n\n if (this.isOpen) {\n panel.innerHTML = `${this.renderOutdatedBanner()}${this.renderStep()}${this.renderBrandFooter()}`;\n this.shadow.appendChild(panel);\n this.attachHandlers(panel);\n this.trapFocus(panel);\n }\n }\n\n private applyInsetVars(el: HTMLElement): void {\n const { anchor } = this.config;\n if (anchor && Object.keys(anchor).length > 0) {\n (['top', 'right', 'bottom', 'left'] as const).forEach((edge) => {\n const value = anchor[edge];\n if (value !== undefined) el.style.setProperty(`--mushi-${edge}`, value);\n });\n el.style.setProperty('--mushi-safe-area', this.config.respectSafeArea ? '1' : '0');\n return;\n }\n\n const { inset } = this.config;\n if (!this.config.respectSafeArea) {\n (['top', 'right', 'bottom', 'left'] as const).forEach((edge) => {\n if (inset[edge] === undefined) el.style.setProperty(`--mushi-${edge}`, '24px');\n });\n }\n (['top', 'right', 'bottom', 'left'] as const).forEach((edge) => {\n const value = inset[edge];\n if (value === undefined) return;\n el.style.setProperty(`--mushi-${edge}`, value === 'auto' ? 'auto' : `${value}px`);\n });\n el.style.setProperty('--mushi-safe-area', this.config.respectSafeArea ? '1' : '0');\n }\n\n private renderStep(): string {\n switch (this.step) {\n case 'category': return this.renderCategoryStep();\n case 'intent': return this.renderIntentStep();\n case 'details': return this.renderDetailsStep();\n case 'success': return this.renderSuccessStep();\n case 'reports': return this.renderReportsStep();\n case 'report-detail': return this.renderReportDetailStep();\n }\n }\n\n private renderOutdatedBanner(): string {\n if (!this.sdkFreshness) return '';\n if (this.config.outdatedBanner === 'off' || this.config.outdatedBanner === 'console-only') return '';\n const { latest, current, deprecated, message } = this.sdkFreshness;\n if (!latest && !deprecated) return '';\n return `\n <div class=\"mushi-outdated\" role=\"status\">\n <strong>Mushi SDK ${escapeHtml(current)}</strong>\n ${latest ? `latest is ${escapeHtml(latest)}.` : 'needs attention.'}\n ${message ? `<span>${escapeHtml(message)}</span>` : ''}\n </div>\n `;\n }\n\n private renderBrandFooter(): string {\n if (this.config.brandFooter === false) return '';\n return `<div class=\"mushi-brand-footer\">Powered by Mushi v${escapeHtml(this.sdkVersion)}</div>`;\n }\n\n /**\n * Editorial masthead. Always carries:\n * • the brand mark (虫 kanji on vermillion, \"MUSHI\" in mono above)\n * • the page title (serif display)\n * • the close affordance\n *\n * On sub-steps it additionally renders a back button (replacing the\n * \"MUSHI\" eyebrow with a \"← BACK\" mono link) and a step counter\n * ledger (\"02 / 03\") on the far right.\n */\n private renderHeader(opts: {\n title: string;\n showBack?: boolean;\n step?: number;\n eyebrow?: string;\n }): string {\n const t = this.locale;\n const { title, showBack = false, step, eyebrow } = opts;\n\n const eyebrowHtml = showBack\n ? `<button type=\"button\" class=\"mushi-back\" data-action=\"back\" aria-label=\"${t.widget.back}\">\\u2190 ${t.widget.back}</button>`\n : `<span class=\"mushi-header-eyebrow\">${eyebrow ?? 'Mushi \\u00B7 Report'}</span>`;\n\n const counterHtml = step\n ? `<span class=\"mushi-step-counter\" aria-label=\"Step ${step} of ${TOTAL_STEPS}\"><b>${pad2(step)}</b> / ${pad2(TOTAL_STEPS)}</span>`\n : '';\n\n return `\n <div class=\"mushi-header\">\n <div class=\"mushi-header-mark\" aria-hidden=\"true\">\\u866B</div>\n <div class=\"mushi-header-titles\">\n ${eyebrowHtml}\n <h3>${title}</h3>\n </div>\n <div class=\"mushi-header-meta\">\n ${counterHtml}\n <button type=\"button\" class=\"mushi-close\" data-action=\"close\" aria-label=\"${t.widget.close}\">\\u2715</button>\n </div>\n </div>\n `;\n }\n\n /**\n * Numeral step indicator: \"01 — 02 — 03\", with the active step in\n * vermillion serif and completed steps struck through in mono.\n * Replaces the original three-dot indicator (a generic SaaS pattern).\n */\n private renderStepIndicator(currentStep: number): string {\n const segments: string[] = [];\n for (let i = 1; i <= TOTAL_STEPS; i++) {\n const cls =\n i < currentStep ? 'mushi-step-num done' :\n i === currentStep ? 'mushi-step-num active' :\n 'mushi-step-num';\n segments.push(`<span class=\"${cls}\">${pad2(i)}</span>`);\n if (i < TOTAL_STEPS) segments.push('<span class=\"mushi-step-sep\" aria-hidden=\"true\"></span>');\n }\n return `<div class=\"mushi-step-indicator\" aria-hidden=\"true\">${segments.join('')}</div>`;\n }\n\n private renderCategoryStep(): string {\n const t = this.locale;\n const categories = (['bug', 'slow', 'visual', 'confusing', 'other'] as MushiReportCategory[])\n .map((id) => `\n <button type=\"button\" class=\"mushi-option-btn\" data-category=\"${id}\" role=\"radio\" aria-checked=\"false\">\n <span class=\"mushi-option-icon\" aria-hidden=\"true\">${CATEGORY_ICONS[id]}</span>\n <div class=\"mushi-option-text\">\n <span class=\"mushi-option-label\">${t.step1.categories[id]}</span>\n <span class=\"mushi-option-desc\">${t.step1.categoryDescriptions[id]}</span>\n </div>\n <span class=\"mushi-option-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n `).join('');\n\n return `\n ${this.renderHeader({ title: t.step1.heading, step: STEP_NUMBER.category })}\n ${this.config.betaMode?.enabled ? this.renderBetaStrip() : ''}\n <div class=\"mushi-body\" role=\"radiogroup\" aria-label=\"${t.step1.heading}\">\n <button type=\"button\" class=\"mushi-option-btn mushi-reports-entry\" data-action=\"reports\">\n <span class=\"mushi-option-icon\" aria-hidden=\"true\">\\uD83D\\uDCEC</span>\n <div class=\"mushi-option-text\">\n <span class=\"mushi-option-label\">Your reports${this.unreadCount() ? ` (${this.unreadCount()} new)` : ''}</span>\n <span class=\"mushi-option-desc\">See status, developer replies, and respond</span>\n </div>\n <span class=\"mushi-option-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n ${categories}\n ${this.rewardsState ? this.renderRewardsNudge() : ''}\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.category)}\n `;\n }\n\n /** Collapsible \"What's new\" changelog row. Closes the reporter feedback loop. */\n private renderBetaChangelog(): string {\n const entries = this.config.betaMode?.changelogItems;\n if (!entries?.length) return '';\n const latest = entries[0];\n const items = latest.items.map((item) => `<li>\\u2022 ${escapeHtml(item)}</li>`).join('');\n const label = latest.date\n ? `What\\u2019s new in ${escapeHtml(latest.version)} \\u00B7 ${escapeHtml(latest.date)}`\n : `What\\u2019s new in ${escapeHtml(latest.version)}`;\n return `\n <details class=\"mushi-changelog\">\n <summary class=\"mushi-changelog-summary\">${label}</summary>\n <ul class=\"mushi-changelog-list\">${items}</ul>\n </details>\n `;\n }\n\n /**\n * Discreet beta status strip: communicates \"work in progress\", invites\n * feedback, and sets expectations — reducing user frustration while\n * nudging the reciprocity instinct (\"your reports help us build this\").\n */\n private renderBetaStrip(): string {\n const beta = this.config.betaMode!;\n const appName = escapeHtml(beta.appName ?? 'This app');\n const message = beta.message\n ? escapeHtml(beta.message)\n : `${appName} is in early development — updates ship weekly`;\n const email = beta.contactEmail ? escapeHtml(beta.contactEmail) : null;\n const perks = beta.perks ?? [];\n\n return `\n <div class=\"mushi-beta-strip\" role=\"note\" aria-label=\"Beta status\">\n <div class=\"mushi-beta-strip-row\">\n <span class=\"mushi-beta-tag\" aria-hidden=\"true\">BETA</span>\n <span class=\"mushi-beta-msg\">${message}</span>\n </div>\n ${email ? `<div class=\"mushi-beta-contact-hint\">Reports go to ${email} · reviewed by the team</div>` : ''}\n ${perks.length > 0 ? `\n <ul class=\"mushi-beta-perks\" aria-label=\"Beta tester perks\">\n ${perks.map((p) => `<li>\\u2713 ${escapeHtml(p)}</li>`).join('')}\n </ul>\n ` : ''}\n ${this.renderBetaChangelog()}\n </div>\n `;\n }\n\n private renderReportsStep(): string {\n const reports = this.reporterReports.map((report) => `\n <button type=\"button\" class=\"mushi-report-row\" data-report-id=\"${escapeHtml(report.id)}\">\n <span class=\"mushi-report-status\">${escapeHtml(report.status)}</span>\n <span class=\"mushi-report-title\">${escapeHtml(report.summary ?? report.description ?? `Report ${report.id.slice(0, 8)}`)}</span>\n ${report.unread_count ? `<b>${report.unread_count}</b>` : ''}\n </button>\n `).join('');\n return `\n ${this.renderHeader({ title: 'Your reports', showBack: true, eyebrow: 'Mushi · Inbox' })}\n <div class=\"mushi-body\">\n ${this.reporterLoading ? '<p class=\"mushi-muted\">Loading reports…</p>' : ''}\n ${this.reporterError ? `<p class=\"mushi-error-inline\">${escapeHtml(this.reporterError)}</p>` : ''}\n ${reports || (!this.reporterLoading ? '<p class=\"mushi-muted\">No reports from this browser yet.</p>' : '')}\n </div>\n `;\n }\n\n private renderReportDetailStep(): string {\n const report = this.reporterReports.find((r) => r.id === this.selectedReportId);\n const comments = this.reporterComments.map((comment) => `\n <div class=\"mushi-thread-comment ${comment.author_kind}\">\n <strong>${escapeHtml(comment.author_kind === 'reporter' ? 'You' : (comment.author_name ?? 'Developer'))}</strong>\n <p>${escapeHtml(comment.body)}</p>\n </div>\n `).join('');\n return `\n ${this.renderHeader({ title: 'Report thread', showBack: true, eyebrow: 'Mushi · Inbox' })}\n <div class=\"mushi-body\">\n <div class=\"mushi-thread-summary\">\n <span>${escapeHtml(report?.status ?? 'unknown')}</span>\n <p>${escapeHtml(report?.summary ?? report?.description ?? 'Report details')}</p>\n </div>\n <div class=\"mushi-thread\">\n ${this.reporterLoading ? '<p class=\"mushi-muted\">Loading thread…</p>' : comments || '<p class=\"mushi-muted\">No developer replies yet.</p>'}\n </div>\n <textarea class=\"mushi-textarea\" data-role=\"reporter-reply\" rows=\"3\" placeholder=\"Reply to the developer…\"></textarea>\n <button type=\"button\" class=\"mushi-submit\" data-action=\"reporter-reply\">\n <span>Reply</span><span class=\"mushi-submit-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n </div>\n `;\n }\n\n private renderIntentStep(): string {\n const t = this.locale;\n const cat = this.selectedCategory!;\n const intents = t.step2.intents[cat] || [];\n\n const options = intents.map((intent) => `\n <button type=\"button\" class=\"mushi-intent-btn\" data-intent=\"${intent}\">\n ${intent}\n </button>\n `).join('');\n\n return `\n ${this.renderHeader({ title: t.step2.heading, showBack: true, step: STEP_NUMBER.intent })}\n <div class=\"mushi-body\">\n <div class=\"mushi-selected-category\">\n <span aria-hidden=\"true\">${CATEGORY_ICONS[cat]}</span>\n <span>${t.step1.categories[cat]}</span>\n </div>\n <div class=\"mushi-intents\">\n ${options}\n </div>\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.intent)}\n `;\n }\n\n private renderDetailsStep(): string {\n const t = this.locale;\n\n return `\n ${this.renderHeader({ title: t.step3.heading, showBack: true, step: STEP_NUMBER.details })}\n <div class=\"mushi-body\">\n <textarea\n class=\"mushi-textarea\"\n placeholder=\"${t.step3.descriptionPlaceholder}\"\n rows=\"4\"\n aria-label=\"${t.step3.heading}\"\n autofocus\n ></textarea>\n <div class=\"mushi-attachments\">\n <button type=\"button\" class=\"mushi-attach-btn${this.screenshotAttached ? ' active' : ''}\" data-action=\"screenshot\">\n \\uD83D\\uDCF8 ${this.screenshotAttached ? t.step3.screenshotAttached : t.step3.screenshotButton}\n </button>\n ${this.screenshotAttached && this.allowScreenshotRemove\n ? '<button type=\"button\" class=\"mushi-attach-btn danger\" data-action=\"remove-screenshot\">\\u2715 Remove screenshot</button>'\n : ''}\n <button type=\"button\" class=\"mushi-attach-btn${this.elementSelected ? ' active' : ''}\" data-action=\"element\">\n \\uD83C\\uDFAF ${this.elementSelected ? t.step3.elementSelected : t.step3.elementButton}\n </button>\n </div>\n <div class=\"mushi-error\" style=\"display:none\" role=\"alert\"></div>\n </div>\n <div class=\"mushi-footer\">\n <span class=\"mushi-footer-hint\" aria-hidden=\"true\">\\u2318 + ENTER \\u2192 send</span>\n <button type=\"button\" class=\"mushi-submit\" data-action=\"submit\"${this.submitting ? ' disabled' : ''}>\n <span>${this.submitting ? t.widget.submitting : t.widget.submit}</span>\n <span class=\"mushi-submit-arrow\" aria-hidden=\"true\">\\u2192</span>\n </button>\n </div>\n ${this.renderStepIndicator(STEP_NUMBER.details)}\n `;\n }\n\n /**\n * Editorial success state: 朱印-style red stamp ring with the kanji\n * 受 (\"received\") at its centre, the localised \"thank you\" string\n * in serif below, and a mono ledger receipt (\"REPORT · HH:MM:SS\").\n * The ring + label animations are defined in styles.ts so this stays\n * pure markup and `prefers-reduced-motion` flips them to the final\n * frame instantly.\n */\n private renderSuccessStep(): string {\n const t = this.locale;\n const stamp = this.submittedAt ?? new Date();\n const time = stamp.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false });\n\n return `\n ${this.renderHeader({ title: t.widget.title, eyebrow: 'Mushi \\u00B7 Receipt' })}\n <div class=\"mushi-body\">\n <div class=\"mushi-success\">\n <div class=\"mushi-success-stamp\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 100 100\" preserveAspectRatio=\"xMidYMid meet\"><circle cx=\"50\" cy=\"50\" r=\"44\"/></svg>\n <span class=\"mushi-success-stamp-label\">\\u53D7</span>\n </div>\n <div class=\"mushi-success-headline\">${t.widget.submitted}</div>\n <div class=\"mushi-success-meta\">REPORT \\u00B7 ${time}</div>\n ${this.rewardsState ? this.renderSuccessRewards() : ''}\n ${this.config.betaMode?.enabled ? this.renderBetaSuccessFooter() : ''}\n </div>\n </div>\n `;\n }\n\n /**\n * Reciprocity footer on the success step: closes the feedback loop by\n * attributing where the report goes, sets a response expectation, and\n * reinforces the \"beta tester\" identity (Peak-End Rule — the last thing\n * the user sees shapes their entire impression of the interaction).\n */\n private renderBetaSuccessFooter(): string {\n const beta = this.config.betaMode!;\n const email = beta.contactEmail ? escapeHtml(beta.contactEmail) : null;\n const appName = escapeHtml(beta.appName ?? 'the team');\n return `\n <div class=\"mushi-beta-success-footer\" role=\"note\" aria-label=\"Beta feedback acknowledgement\">\n ${email\n ? `<div class=\"mushi-beta-success-line\">\\uD83D\\uDCEC Sent to ${email}</div>`\n : `<div class=\"mushi-beta-success-line\">\\uD83D\\uDCEC Sent to ${appName}</div>`\n }\n <div class=\"mushi-beta-success-line mushi-beta-success-dim\">We aim to review within 48h · thank you for helping build this</div>\n </div>\n `;\n }\n\n private tierColor(slug: string): string {\n const colors: Record<string, string> = {\n free: '#6b7280',\n explorer: '#3b82f6',\n contributor: '#8b5cf6',\n champion: '#f59e0b',\n };\n return colors[slug] ?? '#6c47ff';\n }\n\n /** Compact rewards nudge rendered at the bottom of the category-step body. */\n private renderRewardsNudge(): string {\n const { tier, nextTier, totalPoints, pointsForReport } = this.rewardsState!;\n const tierName = tier?.displayName ?? 'Free';\n const tierSlug = tier?.slug ?? 'free';\n const color = this.tierColor(tierSlug);\n\n let pct = 100;\n let nextLabel = '';\n if (nextTier) {\n const base = tier?.pointsThreshold ?? 0;\n const ceiling = nextTier.pointsThreshold;\n pct = ceiling > base ? Math.round(Math.min(1, (totalPoints - base) / (ceiling - base)) * 100) : 100;\n const remaining = Math.max(0, ceiling - totalPoints);\n nextLabel = `${remaining.toLocaleString()} pts to ${escapeHtml(nextTier.displayName)}`;\n }\n\n return `\n <div class=\"mushi-rewards-nudge\" aria-label=\"Rewards progress\">\n <div class=\"mushi-rewards-row\">\n <span class=\"mushi-tier-pip\" style=\"background:${color}\" aria-hidden=\"true\"></span>\n <span class=\"mushi-rewards-tier-name\">${escapeHtml(tierName)}</span>\n <span class=\"mushi-rewards-pts-count\">${totalPoints.toLocaleString()} pts</span>\n <span class=\"mushi-rewards-pts-earn\">+${pointsForReport} pts for a report</span>\n </div>\n ${nextTier ? `\n <div class=\"mushi-tier-bar-track\" role=\"progressbar\" aria-valuenow=\"${pct}\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-label=\"Progress to ${escapeHtml(nextTier.displayName)}\">\n <div class=\"mushi-tier-bar-fill\" style=\"width:${pct}%\"></div>\n </div>\n <div class=\"mushi-rewards-next-label\">${nextLabel}</div>\n ` : ''}\n </div>\n `;\n }\n\n /** Points earned + tier progress shown on the success step. */\n private renderSuccessRewards(): string {\n const { tier, nextTier, totalPoints, pointsForReport } = this.rewardsState!;\n const projected = totalPoints + pointsForReport;\n\n let pctAfter = 100;\n let nextLabel = '';\n if (nextTier) {\n const base = tier?.pointsThreshold ?? 0;\n const ceiling = nextTier.pointsThreshold;\n pctAfter = ceiling > base ? Math.round(Math.min(1, (projected - base) / (ceiling - base)) * 100) : 100;\n const remaining = Math.max(0, ceiling - projected);\n nextLabel = remaining > 0\n ? `${remaining.toLocaleString()} pts to ${escapeHtml(nextTier.displayName)}`\n : `\\uD83C\\uDF89 ${escapeHtml(nextTier.displayName)} reached!`;\n }\n\n return `\n <div class=\"mushi-success-rewards\">\n <div class=\"mushi-success-pts-award\">+${pointsForReport} pts</div>\n ${nextTier ? `\n <div class=\"mushi-tier-bar-track success-bar\" role=\"progressbar\" aria-valuenow=\"${pctAfter}\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-label=\"Progress to ${escapeHtml(nextTier.displayName)}\">\n <div class=\"mushi-tier-bar-fill\" style=\"width:${pctAfter}%\"></div>\n </div>\n <div class=\"mushi-rewards-next-label\">${nextLabel}</div>\n ` : ''}\n </div>\n `;\n }\n\n private attachHandlers(panel: HTMLElement): void {\n const t = this.locale;\n\n panel.querySelector('[data-action=\"close\"]')?.addEventListener('click', () => this.close());\n panel.querySelector('[data-action=\"back\"]')?.addEventListener('click', () => {\n if (this.step === 'intent') { this.step = 'category'; this.selectedCategory = null; }\n else if (this.step === 'details') { this.step = 'intent'; this.selectedIntent = null; }\n else if (this.step === 'reports') { this.step = 'category'; }\n else if (this.step === 'report-detail') { this.step = 'reports'; this.selectedReportId = null; }\n this.render();\n });\n\n panel.querySelector('[data-action=\"reports\"]')?.addEventListener('click', () => {\n void this.loadReporterReports();\n });\n\n panel.querySelectorAll('[data-report-id]').forEach((btn) => {\n btn.addEventListener('click', () => {\n const reportId = (btn as HTMLElement).dataset.reportId;\n if (reportId) void this.loadReporterComments(reportId);\n });\n });\n\n panel.querySelector('[data-action=\"reporter-reply\"]')?.addEventListener('click', () => {\n void this.submitReporterReply(panel);\n });\n\n panel.querySelectorAll('[data-category]').forEach((btn) => {\n btn.addEventListener('click', () => {\n this.selectedCategory = (btn as HTMLElement).dataset.category as MushiReportCategory;\n this.step = 'intent';\n this.render();\n });\n });\n\n panel.querySelectorAll('[data-intent]').forEach((btn) => {\n btn.addEventListener('click', () => {\n this.selectedIntent = (btn as HTMLElement).dataset.intent ?? null;\n this.step = 'details';\n this.render();\n });\n });\n\n panel.querySelector('[data-action=\"screenshot\"]')?.addEventListener('click', () => {\n this.callbacks.onScreenshotRequest();\n });\n panel.querySelector('[data-action=\"remove-screenshot\"]')?.addEventListener('click', () => {\n this.callbacks.onScreenshotRemove?.();\n });\n\n panel.querySelector('[data-action=\"element\"]')?.addEventListener('click', () => {\n this.callbacks.onElementSelectorRequest?.();\n });\n\n const submitReport = (): void => {\n const textarea = panel.querySelector('.mushi-textarea') as HTMLTextAreaElement | null;\n const description = textarea?.value?.trim() ?? '';\n const errorEl = panel.querySelector('.mushi-error') as HTMLElement | null;\n\n // V5.3 §2.1: increased from 5 to 20 to filter low-value \"doesn't work\"\n // submissions that the LLM cannot meaningfully classify. Empirically this\n // removed ~30% of unactionable reports without measurable drop in valid ones.\n const MIN_DESCRIPTION_LENGTH = 20;\n if (description.length < MIN_DESCRIPTION_LENGTH) {\n if (errorEl) {\n errorEl.textContent = `${t.widget.error} (${description.length}/${MIN_DESCRIPTION_LENGTH})`;\n errorEl.style.display = 'block';\n }\n return;\n }\n\n this.submitting = true;\n this.submittedAt = new Date();\n this.render();\n\n this.callbacks.onSubmit({\n category: this.selectedCategory!,\n description,\n intent: this.selectedIntent ?? undefined,\n });\n\n this.successTimer = setTimeout(() => {\n this.successTimer = null;\n this.submitting = false;\n this.step = 'success';\n this.render();\n this.autoCloseTimer = setTimeout(() => {\n this.autoCloseTimer = null;\n if (this.step === 'success') this.close();\n }, 2800);\n }, 500);\n };\n\n panel.querySelector('[data-action=\"submit\"]')?.addEventListener('click', submitReport);\n\n panel.addEventListener('keydown', (e) => {\n if (e.key === 'Escape') {\n this.close();\n return;\n }\n // Ctrl/Cmd+Enter submits from anywhere in the panel — primarily to\n // catch the textarea where Enter alone needs to insert a newline.\n // Only the details step has a submit action, so guard on that.\n if (this.step === 'details' && isSubmitShortcut(e)) {\n e.preventDefault();\n submitReport();\n }\n });\n }\n\n private trapFocus(panel: HTMLElement): void {\n requestAnimationFrame(() => {\n // Prefer the textarea on the details step so users can start typing\n // immediately without an extra Tab. Otherwise focus the first\n // interactive element so keyboard users can navigate the list.\n const textarea = panel.querySelector('textarea') as HTMLElement | null;\n if (textarea) {\n textarea.focus();\n return;\n }\n const focusable = panel.querySelectorAll('button, textarea, [tabindex]');\n if (focusable.length > 0) (focusable[0] as HTMLElement).focus();\n });\n }\n\n private unreadCount(): number {\n return this.reporterReports.reduce((sum, report) => sum + (report.unread_count ?? 0), 0);\n }\n\n private async loadReporterReports(): Promise<void> {\n this.step = 'reports';\n this.reporterLoading = true;\n this.reporterError = null;\n this.render();\n try {\n this.reporterReports = await this.callbacks.onReporterReportsRequest?.() ?? [];\n } catch (err) {\n this.reporterError = err instanceof Error ? err.message : 'Could not load reports.';\n } finally {\n this.reporterLoading = false;\n this.render();\n }\n }\n\n private async loadReporterComments(reportId: string): Promise<void> {\n this.selectedReportId = reportId;\n this.step = 'report-detail';\n this.reporterLoading = true;\n this.reporterError = null;\n this.render();\n try {\n this.reporterComments = await this.callbacks.onReporterCommentsRequest?.(reportId) ?? [];\n } catch (err) {\n this.reporterError = err instanceof Error ? err.message : 'Could not load thread.';\n } finally {\n this.reporterLoading = false;\n this.render();\n }\n }\n\n private async submitReporterReply(panel: HTMLElement): Promise<void> {\n const reportId = this.selectedReportId;\n const textarea = panel.querySelector('[data-role=\"reporter-reply\"]') as HTMLTextAreaElement | null;\n const replyButton = panel.querySelector('[data-action=\"reporter-reply\"]') as HTMLButtonElement | null;\n const body = textarea?.value.trim() ?? '';\n // Guard: reject empty bodies AND already-in-flight submits — both prevented\n // double-posts in dogfood when users mashed Enter on a slow link.\n if (!reportId || !body || this.reporterLoading) return;\n this.reporterLoading = true;\n if (replyButton) replyButton.disabled = true;\n this.render();\n try {\n await this.callbacks.onReporterReply?.(reportId, body);\n // Clear the field on success so the next render (driven by\n // loadReporterComments) doesn't repaint the just-sent text and tempt\n // the user into a duplicate submit.\n if (textarea) textarea.value = '';\n await this.loadReporterComments(reportId);\n } catch (err) {\n this.reporterError = err instanceof Error ? err.message : 'Could not send reply.';\n this.reporterLoading = false;\n this.render();\n }\n }\n\n /* ── Marketing / Playwright recorder (debug GIF capture) ─────────── */\n\n getRecorderStep(): WidgetStep {\n return this.step;\n }\n\n getRecorderTrigger(): Element | null {\n return this.shadow.querySelector('.mushi-trigger');\n }\n\n getRecorderCategoryButton(category: MushiReportCategory): Element | null {\n return this.shadow.querySelector(`[data-category=\"${category}\"]`);\n }\n\n getRecorderIntentButton(label: string): Element | null {\n return (\n Array.from(this.shadow.querySelectorAll('[data-intent]')).find(\n (el) => (el as HTMLElement).dataset.intent === label,\n ) ?? null\n );\n }\n\n getRecorderSubmitButton(): Element | null {\n return this.shadow.querySelector('[data-action=\"submit\"]');\n }\n\n recorderClickTrigger(): void {\n if (this.isOpen) this.close();\n this.open();\n }\n\n recorderSelectCategory(category: MushiReportCategory): void {\n if (!this.isOpen) this.open();\n if (this.step !== 'category') {\n this.selectedCategory = null;\n this.selectedIntent = null;\n this.step = 'category';\n this.render();\n }\n this.selectedCategory = category;\n this.step = 'intent';\n this.render();\n }\n\n recorderSelectIntent(label: string): void {\n if (!this.isOpen || this.step !== 'intent') return;\n this.selectedIntent = label;\n this.step = 'details';\n this.render();\n }\n\n recorderFocusDescription(): void {\n const textarea = this.shadow.querySelector('.mushi-textarea') as HTMLTextAreaElement | null;\n textarea?.focus();\n }\n\n recorderSubmit(): void {\n const submit = this.shadow.querySelector('[data-action=\"submit\"]') as HTMLButtonElement | null;\n submit?.click();\n }\n}\n","/**\n * Dev-only Playwright helpers for marketing GIFs. Exposed on\n * `window.__mushiRecorder` when the SDK is initialized with `debug: true`.\n * Drives the closed shadow-DOM widget through the full reporter flow.\n */\n\nimport type { MushiReportCategory } from '@mushi-mushi/core';\nimport type { MushiWidget } from './widget';\n\nexport interface MushiRecorderCenter {\n x: number;\n y: number;\n}\n\nexport interface MushiMarketingRecorder {\n ready(): boolean;\n getStep(): string;\n getTriggerCenter(): MushiRecorderCenter | null;\n getCategoryCenter(category: MushiReportCategory): MushiRecorderCenter | null;\n getIntentCenter(label: string): MushiRecorderCenter | null;\n getSubmitCenter(): MushiRecorderCenter | null;\n clickTrigger(): void;\n selectCategory(category: MushiReportCategory): void;\n selectIntent(label: string): void;\n focusDescription(): void;\n submit(): void;\n}\n\nfunction centerOf(el: Element | null): MushiRecorderCenter | null {\n if (!el) return null;\n const r = el.getBoundingClientRect();\n if (r.width === 0 && r.height === 0) return null;\n return { x: r.left + r.width / 2, y: r.top + r.height / 2 };\n}\n\nexport function exposeMarketingRecorder(widget: MushiWidget): void {\n if (typeof globalThis === 'undefined') return;\n\n const api: MushiMarketingRecorder = {\n ready: () => widget.getIsMounted(),\n getStep: () => widget.getRecorderStep(),\n getTriggerCenter: () => centerOf(widget.getRecorderTrigger()),\n getCategoryCenter: (category) => centerOf(widget.getRecorderCategoryButton(category)),\n getIntentCenter: (label) => centerOf(widget.getRecorderIntentButton(label)),\n getSubmitCenter: () => centerOf(widget.getRecorderSubmitButton()),\n clickTrigger: () => widget.recorderClickTrigger(),\n selectCategory: (category) => widget.recorderSelectCategory(category),\n selectIntent: (label) => widget.recorderSelectIntent(label),\n focusDescription: () => widget.recorderFocusDescription(),\n submit: () => widget.recorderSubmit(),\n };\n\n (globalThis as typeof globalThis & { __mushiRecorder?: MushiMarketingRecorder }).__mushiRecorder = api;\n}\n","// ============================================================\n// rewards.ts — Web SDK rewards subsystem\n//\n// Owns:\n// 1. Activity batcher: coalesces events into 5-min flushes\n// with IndexedDB backing for offline resilience.\n// 2. Auto-track listeners: route changes, [data-testid] clicks,\n// session dwell — piggybacks on installAutoBreadcrumbs infra.\n// 3. In-widget tier/points badge (shadow-DOM, themable).\n// 4. Consent surface (explicit mode).\n//\n// Wired by createInstance() only when config.rewards.enabled === true.\n// All state is keyed by projectId so multi-instance setups don't bleed.\n// ============================================================\n\nimport type { MushiApiClient, MushiRewardsConfig, MushiTierResult, MushiActivityEvent } from '@mushi-mushi/core';\n\nconst MIN_FLUSH_INTERVAL = 30_000;\nconst DEFAULT_FLUSH_INTERVAL = 300_000; // 5 min\nconst DWELL_SAMPLE_INTERVAL = 60_000; // emit session_minute every 60s\nconst MAX_SESSION_MINUTES_PER_DAY = 60;\nconst DAILY_RESET_KEY_PREFIX = 'mushi_session_min_day_';\n\n// ──────────────────────────────────────────────────────────────\n// Internal queue (in-memory; IndexedDB for offline persistence)\n// ──────────────────────────────────────────────────────────────\n\ninterface QueuedEvent extends MushiActivityEvent {\n queuedAt: number;\n}\n\nlet pendingEvents: QueuedEvent[] = [];\nlet flushTimer: ReturnType<typeof setInterval> | null = null;\nlet dwellTimer: ReturnType<typeof setInterval> | null = null;\nlet currentUserId: string | null = null;\nlet currentUserTraits: { email?: string; name?: string; provider?: string } | null = null;\nlet reporterTokenHash: string | null = null;\nlet apiClient: MushiApiClient | null = null;\nlet optedIn = false;\nlet tierCache: MushiTierResult | null = null;\nlet tierCacheTime = 0;\nconst TIER_CACHE_TTL = 5 * 60 * 1000; // 5 min\n\n// Track seen routes to avoid duplicate screen_view_unique_per_day\nconst seenRoutes = new Set<string>();\n\n// ──────────────────────────────────────────────────────────────\n// Consent helpers\n// ──────────────────────────────────────────────────────────────\n\nfunction getConsentKey(projectId: string): string {\n return `mushi_rewards_consent_${projectId}`;\n}\n\nfunction isConsentGranted(projectId: string): boolean {\n try {\n return localStorage.getItem(getConsentKey(projectId)) === '1';\n } catch {\n return false;\n }\n}\n\nfunction setConsentGranted(projectId: string, granted: boolean): void {\n try {\n if (granted) {\n localStorage.setItem(getConsentKey(projectId), '1');\n } else {\n localStorage.removeItem(getConsentKey(projectId));\n }\n optedIn = granted;\n apiClient?.submitActivity(currentUserId ?? '', [], { optedIn: granted }).catch(() => {});\n } catch { /* private browsing */ }\n}\n\n// ──────────────────────────────────────────────────────────────\n// Session-minute daily cap\n// ──────────────────────────────────────────────────────────────\n\nfunction getTodayKey(): string {\n return new Date().toISOString().slice(0, 10); // YYYY-MM-DD\n}\n\nfunction getSessionMinutesToday(projectId: string): number {\n try {\n const val = sessionStorage.getItem(`${DAILY_RESET_KEY_PREFIX}${projectId}_${getTodayKey()}`);\n return val ? parseInt(val, 10) : 0;\n } catch { return 0; }\n}\n\nfunction incrementSessionMinutes(projectId: string): number {\n const today = getTodayKey();\n const key = `${DAILY_RESET_KEY_PREFIX}${projectId}_${today}`;\n try {\n const next = (getSessionMinutesToday(projectId) + 1);\n sessionStorage.setItem(key, String(next));\n return next;\n } catch { return 99; }\n}\n\n// ──────────────────────────────────────────────────────────────\n// Public API\n// ──────────────────────────────────────────────────────────────\n\nexport interface RewardsContext {\n client: MushiApiClient;\n config: MushiRewardsConfig;\n projectId: string;\n userId: string;\n traits?: { email?: string; name?: string; provider?: string };\n reporterToken?: string;\n}\n\n/** Called by createInstance() when a user is identified and rewards are enabled. */\nexport function initRewards(ctx: RewardsContext): void {\n apiClient = ctx.client;\n currentUserId = ctx.userId;\n currentUserTraits = ctx.traits ?? null;\n reporterTokenHash = ctx.reporterToken ?? null;\n\n const { projectId } = ctx;\n const flushMs = Math.max(\n MIN_FLUSH_INTERVAL,\n ctx.config.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL,\n );\n\n // Resolve consent\n if (ctx.config.consentMode === 'auto') {\n optedIn = true;\n setConsentGranted(projectId, true);\n } else {\n optedIn = isConsentGranted(projectId);\n }\n\n // Install auto-track listeners when trackActivity is on\n if (ctx.config.trackActivity) {\n installActivityListeners(projectId);\n }\n\n // Start flush timer\n if (flushTimer) clearInterval(flushTimer);\n flushTimer = setInterval(() => flush(ctx), flushMs);\n\n // Dwell timer — emits session_minute every 60s (capped)\n if (dwellTimer) clearInterval(dwellTimer);\n dwellTimer = setInterval(() => {\n if (!optedIn || !currentUserId) return;\n const minutes = getSessionMinutesToday(projectId);\n if (minutes < MAX_SESSION_MINUTES_PER_DAY) {\n incrementSessionMinutes(projectId);\n enqueue({ action: 'session_minute', metadata: { minutes_today: minutes + 1 } });\n }\n }, DWELL_SAMPLE_INTERVAL);\n\n // Eager tier fetch for the widget badge\n if (ctx.config.showInWidget) {\n fetchAndCacheTier(currentUserId).then((tier) => {\n if (tier) renderTierBadge(tier, ctx.config);\n });\n }\n\n // Show consent surface if explicit mode and not yet granted\n if (ctx.config.consentMode !== 'auto' && !optedIn) {\n renderConsentBanner(projectId, ctx.config);\n }\n}\n\n/** Called by Mushi.identify() to update the current user context. */\nexport function updateRewardsUser(\n userId: string,\n traits?: { email?: string; name?: string; provider?: string },\n): void {\n currentUserId = userId;\n currentUserTraits = traits ?? null;\n // Invalidate tier cache on user change\n tierCache = null;\n tierCacheTime = 0;\n}\n\n/** Manually enqueue a host-defined activity event. */\nexport function enqueue(event: MushiActivityEvent): void {\n if (!optedIn || !currentUserId) return;\n pendingEvents.push({ ...event, queuedAt: Date.now() });\n}\n\n/** Force-flush the pending event queue. */\nexport async function flush(ctx: RewardsContext): Promise<void> {\n if (!optedIn || !currentUserId || pendingEvents.length === 0) return;\n\n // P2: attach host-app JWT if verifyUserToken callback is configured\n let hostJwt: string | null = null;\n if (ctx.config.verifyUserToken) {\n try {\n hostJwt = await ctx.config.verifyUserToken();\n } catch {\n // Non-fatal — activity still submits without JWT;\n // server will mark jwt_verified_at = null\n }\n }\n\n const batch = pendingEvents.splice(0, 100);\n try {\n await ctx.client.submitActivity(currentUserId, batch, {\n userTraits: currentUserTraits ?? undefined,\n reporterTokenHash: reporterTokenHash ?? undefined,\n optedIn: true,\n hostJwt: hostJwt ?? undefined,\n });\n } catch {\n // On failure, re-queue for next flush (simplified offline; full\n // IndexedDB queue is left for a follow-up to keep this file focussed)\n pendingEvents.unshift(...batch.slice(0, 50)); // cap re-queue at 50\n }\n}\n\nexport async function getTier(userId: string): Promise<MushiTierResult | null> {\n const now = Date.now();\n if (tierCache && now - tierCacheTime < TIER_CACHE_TTL) return tierCache;\n return fetchAndCacheTier(userId);\n}\n\nasync function fetchAndCacheTier(userId: string): Promise<MushiTierResult | null> {\n if (!apiClient) return null;\n const res = await apiClient.getMyTier(userId);\n if (res.ok && res.data) {\n tierCache = res.data as MushiTierResult;\n tierCacheTime = Date.now();\n return tierCache;\n }\n return null;\n}\n\nexport function teardown(): void {\n if (flushTimer) { clearInterval(flushTimer); flushTimer = null; }\n if (dwellTimer) { clearInterval(dwellTimer); dwellTimer = null; }\n removeActivityListeners();\n removeTierBadge();\n if (consentHost) { consentHost.remove(); consentHost = null; }\n pendingEvents = [];\n currentUserId = null;\n apiClient = null;\n optedIn = false;\n tierCache = null;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Auto-track listeners\n// ──────────────────────────────────────────────────────────────\n\nlet routeObserver: MutationObserver | null = null;\nlet clickHandler: ((e: MouseEvent) => void) | null = null;\nlet popstateHandler: (() => void) | null = null;\nlet origPushState: typeof history.pushState | null = null;\nlet lastRoute = '';\n\nfunction installActivityListeners(projectId: string): void {\n // Route: pushState + popstate\n const emitRoute = () => {\n const route = location.pathname;\n if (route === lastRoute) return;\n lastRoute = route;\n const isNewToday = !seenRoutes.has(`${projectId}:${route}`);\n if (isNewToday) {\n seenRoutes.add(`${projectId}:${route}`);\n enqueue({ action: 'screen_view_unique_per_day', metadata: { route } });\n }\n };\n\n origPushState = history.pushState.bind(history);\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPushState!(...args);\n emitRoute();\n };\n popstateHandler = emitRoute;\n window.addEventListener('popstate', emitRoute);\n emitRoute(); // record initial route\n\n // DOM mutation observer for SPA route changes that don't use pushState\n routeObserver = new MutationObserver(() => emitRoute());\n const main = document.querySelector('main') ?? document.body;\n routeObserver.observe(main, { childList: true, subtree: false });\n\n // Click: track [data-testid] interactions\n clickHandler = (e: MouseEvent) => {\n const target = (e.target as HTMLElement).closest('[data-testid]') as HTMLElement | null;\n if (!target) return;\n const testid = target.dataset.testid;\n if (!testid) return;\n enqueue({ action: 'element_selected', metadata: { testid, route: location.pathname } });\n };\n document.addEventListener('click', clickHandler, { capture: true, passive: true });\n}\n\nfunction removeActivityListeners(): void {\n // Restore original pushState before removing listeners\n if (origPushState) {\n history.pushState = origPushState;\n origPushState = null;\n }\n if (popstateHandler) {\n window.removeEventListener('popstate', popstateHandler);\n popstateHandler = null;\n }\n routeObserver?.disconnect();\n routeObserver = null;\n if (clickHandler) {\n document.removeEventListener('click', clickHandler, { capture: true });\n clickHandler = null;\n }\n}\n\n// ──────────────────────────────────────────────────────────────\n// Shadow-DOM tier badge\n// ──────────────────────────────────────────────────────────────\n\nlet badgeHost: HTMLElement | null = null;\n\nfunction renderTierBadge(tier: MushiTierResult, config: MushiRewardsConfig): void {\n if (!config.showInWidget) return;\n if (badgeHost) badgeHost.remove();\n\n badgeHost = document.createElement('div');\n badgeHost.id = 'mushi-tier-badge';\n Object.assign(badgeHost.style, {\n position: 'fixed',\n bottom: '56px', // above the widget button\n right: '16px',\n zIndex: '2147483645',\n fontFamily: 'system-ui, sans-serif',\n });\n\n const shadow = badgeHost.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n <style>\n :host { display: block; }\n .badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n border-radius: 999px;\n background: rgba(0,0,0,0.75);\n color: #fff;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n backdrop-filter: blur(6px);\n cursor: default;\n user-select: none;\n }\n .dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #6c47ff;\n flex-shrink: 0;\n }\n </style>\n <div class=\"badge\">\n <span class=\"dot\"></span>\n <span>${tier.displayName}</span>\n </div>\n `;\n\n document.body.appendChild(badgeHost);\n}\n\nfunction removeTierBadge(): void {\n badgeHost?.remove();\n badgeHost = null;\n}\n\n// ──────────────────────────────────────────────────────────────\n// Consent banner (explicit mode)\n// ──────────────────────────────────────────────────────────────\n\nlet consentHost: HTMLElement | null = null;\n\nfunction renderConsentBanner(projectId: string, config: MushiRewardsConfig): void {\n if (consentHost) return; // already shown\n\n consentHost = document.createElement('div');\n consentHost.id = 'mushi-consent-banner';\n Object.assign(consentHost.style, {\n position: 'fixed',\n bottom: '80px',\n right: '16px',\n zIndex: '2147483646',\n maxWidth: '280px',\n fontFamily: 'system-ui, sans-serif',\n });\n\n const shadow = consentHost.attachShadow({ mode: 'closed' });\n shadow.innerHTML = `\n <style>\n :host { display: block; }\n .banner {\n background: #fff;\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n box-shadow: 0 8px 24px rgba(0,0,0,0.12);\n padding: 14px 16px;\n font-size: 13px;\n line-height: 1.5;\n color: #374151;\n }\n .title { font-weight: 700; margin-bottom: 6px; color: #111827; }\n .actions { display: flex; gap: 8px; margin-top: 10px; }\n button {\n flex: 1;\n padding: 6px 10px;\n border-radius: 6px;\n border: none;\n cursor: pointer;\n font-size: 12px;\n font-weight: 600;\n }\n .accept { background: #6c47ff; color: #fff; }\n .decline { background: #f3f4f6; color: #374151; }\n </style>\n <div class=\"banner\">\n <div class=\"title\">🎯 Earn rewards</div>\n <div>Help improve this app and earn points, badges, and perks for your contributions.</div>\n <div class=\"actions\">\n <button class=\"accept\" id=\"accept\">Enable</button>\n <button class=\"decline\" id=\"decline\">No thanks</button>\n </div>\n </div>\n `;\n\n shadow.getElementById('accept')?.addEventListener('click', () => {\n setConsentGranted(projectId, true);\n consentHost?.remove();\n consentHost = null;\n if (config.showInWidget && currentUserId) {\n fetchAndCacheTier(currentUserId).then((tier) => {\n if (tier) renderTierBadge(tier, config);\n });\n }\n });\n\n shadow.getElementById('decline')?.addEventListener('click', () => {\n setConsentGranted(projectId, false);\n consentHost?.remove();\n consentHost = null;\n });\n\n document.body.appendChild(consentHost);\n}\n","import type { MushiConsoleEntry } from '@mushi-mushi/core';\n\nconst MAX_ENTRIES = 50;\nconst MAX_MESSAGE_LENGTH = 500;\n\nexport interface ConsoleCapture {\n getEntries(): MushiConsoleEntry[];\n clear(): void;\n destroy(): void;\n}\n\nexport function createConsoleCapture(): ConsoleCapture {\n const entries: MushiConsoleEntry[] = [];\n const originals: Partial<Record<string, (...args: unknown[]) => void>> = {};\n const levels: Array<MushiConsoleEntry['level']> = ['log', 'warn', 'error', 'info', 'debug'];\n\n for (const level of levels) {\n const original = console[level];\n originals[level] = original;\n\n console[level] = (...args: unknown[]) => {\n const message = args\n .map((arg) => {\n try {\n return typeof arg === 'string' ? arg : JSON.stringify(arg);\n } catch {\n return String(arg);\n }\n })\n .join(' ')\n .slice(0, MAX_MESSAGE_LENGTH);\n\n const entry: MushiConsoleEntry = {\n level,\n message,\n timestamp: Date.now(),\n };\n\n if (level === 'error' && args[0] instanceof Error) {\n entry.stack = (args[0] as Error).stack?.slice(0, 1000);\n }\n\n entries.push(entry);\n if (entries.length > MAX_ENTRIES) {\n entries.shift();\n }\n\n original.call(console, ...args);\n };\n }\n\n return {\n getEntries() {\n return [...entries];\n },\n clear() {\n entries.length = 0;\n },\n destroy() {\n for (const level of levels) {\n if (originals[level]) {\n console[level] = originals[level] as typeof console.log;\n }\n }\n },\n };\n}\n","import {\n MUSHI_INTERNAL_HEADER,\n MUSHI_INTERNAL_INIT_MARKER,\n type MushiInternalRequestKind,\n type MushiUrlMatcher,\n} from '@mushi-mushi/core';\n\nexport interface InternalRequestOptions {\n apiEndpoint?: string;\n ignoreUrls?: MushiUrlMatcher[];\n}\n\nexport const DEFAULT_INTERNAL_URL_MATCHERS: MushiUrlMatcher[] = [\n /\\/v1\\/sdk(?:\\/|$)/,\n /\\/v1\\/reports(?:\\/|$)/,\n /\\/v1\\/notifications(?:\\/|$)/,\n /\\/v1\\/reputation(?:\\/|$)/,\n];\n\nexport function getRequestUrl(input: RequestInfo | URL): string {\n if (typeof input === 'string') return input;\n if (input instanceof URL) return input.href;\n return input.url;\n}\n\nexport function getInternalRequestKind(\n input: RequestInfo | URL,\n init?: RequestInit,\n): MushiInternalRequestKind | null {\n const marker = (init as (RequestInit & { [MUSHI_INTERNAL_INIT_MARKER]?: MushiInternalRequestKind }) | undefined)\n ?.[MUSHI_INTERNAL_INIT_MARKER];\n if (marker) return marker;\n\n const initHeader = readHeader(init?.headers, MUSHI_INTERNAL_HEADER);\n if (initHeader) return initHeader as MushiInternalRequestKind;\n\n if (typeof Request !== 'undefined' && input instanceof Request) {\n const requestHeader = input.headers.get(MUSHI_INTERNAL_HEADER);\n if (requestHeader) return requestHeader as MushiInternalRequestKind;\n }\n\n return null;\n}\n\nexport function shouldIgnoreMushiUrl(url: string, options: InternalRequestOptions = {}): boolean {\n const matchers = [...DEFAULT_INTERNAL_URL_MATCHERS, ...(options.ignoreUrls ?? [])];\n if (matchers.some((matcher) => matchesUrl(url, matcher))) return true;\n\n const endpoint = normalizeUrlPrefix(options.apiEndpoint);\n return endpoint ? normalizeComparableUrl(url).startsWith(endpoint) : false;\n}\n\nexport function matchesUrl(url: string, matcher: MushiUrlMatcher): boolean {\n if (typeof matcher === 'string') {\n return normalizeComparableUrl(url).includes(matcher);\n }\n matcher.lastIndex = 0;\n return matcher.test(url);\n}\n\nexport function normalizeUrlPrefix(url?: string): string | null {\n if (!url) return null;\n return normalizeComparableUrl(url).replace(/\\/+$/, '');\n}\n\nexport function isLocalhostEndpoint(url?: string): boolean {\n if (!url) return false;\n try {\n const parsed = new URL(url);\n return parsed.hostname === 'localhost'\n || parsed.hostname === '127.0.0.1'\n || parsed.hostname === '::1'\n || parsed.hostname.endsWith('.localhost');\n } catch {\n return /\\blocalhost\\b|127\\.0\\.0\\.1/.test(url);\n }\n}\n\nfunction normalizeComparableUrl(url: string): string {\n try {\n return new URL(url, typeof location !== 'undefined' ? location.href : 'http://localhost').href;\n } catch {\n return url;\n }\n}\n\nfunction readHeader(headers: HeadersInit | undefined, name: string): string | null {\n if (!headers) return null;\n if (typeof Headers !== 'undefined' && headers instanceof Headers) {\n return headers.get(name);\n }\n if (Array.isArray(headers)) {\n const found = headers.find(([key]) => key.toLowerCase() === name.toLowerCase());\n return found?.[1] ?? null;\n }\n const record = headers as Record<string, string>;\n return record[name] ?? record[name.toLowerCase()] ?? null;\n}\n","import type { MushiNetworkEntry, MushiUrlMatcher } from '@mushi-mushi/core';\nimport { getInternalRequestKind, getRequestUrl, shouldIgnoreMushiUrl } from '../internal-requests';\n\nconst MAX_ENTRIES = 30;\n\nexport interface NetworkCapture {\n getEntries(): MushiNetworkEntry[];\n clear(): void;\n updateOptions(options: NetworkCaptureOptions): void;\n destroy(): void;\n}\n\nexport interface NetworkCaptureOptions {\n apiEndpoint?: string;\n ignoreUrls?: MushiUrlMatcher[];\n}\n\nexport function createNetworkCapture(options: NetworkCaptureOptions = {}): NetworkCapture {\n const entries: MushiNetworkEntry[] = [];\n const originalFetch = globalThis.fetch;\n let activeOptions = options;\n\n globalThis.fetch = async function mushiFetchInterceptor(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const startTime = Date.now();\n const method = init?.method?.toUpperCase() ?? 'GET';\n const url = getRequestUrl(input);\n const internalKind = getInternalRequestKind(input, init);\n const shouldRecord = !internalKind && !shouldIgnoreMushiUrl(url, activeOptions);\n\n try {\n const response = await originalFetch.call(globalThis, input, init);\n\n if (shouldRecord) {\n addEntry({\n method,\n url: truncateUrl(url),\n status: response.status,\n duration: Date.now() - startTime,\n timestamp: startTime,\n });\n }\n\n return response;\n } catch (error) {\n if (shouldRecord) {\n addEntry({\n method,\n url: truncateUrl(url),\n status: 0,\n duration: Date.now() - startTime,\n timestamp: startTime,\n error: error instanceof Error ? error.message : 'Network error',\n });\n }\n throw error;\n }\n };\n\n function addEntry(entry: MushiNetworkEntry): void {\n entries.push(entry);\n if (entries.length > MAX_ENTRIES) {\n entries.shift();\n }\n }\n\n return {\n getEntries() {\n return [...entries];\n },\n clear() {\n entries.length = 0;\n },\n updateOptions(nextOptions) {\n activeOptions = nextOptions;\n },\n destroy() {\n globalThis.fetch = originalFetch;\n },\n };\n}\n\nfunction truncateUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const path = parsed.pathname + parsed.search;\n if (path.length > 200) {\n return parsed.origin + path.slice(0, 200) + '...';\n }\n return parsed.origin + path;\n } catch {\n return url.slice(0, 200);\n }\n}\n","import type { MushiPrivacyConfig } from '@mushi-mushi/core';\n\nexport interface ScreenshotCapture {\n take(): Promise<string | null>;\n updateOptions(options: ScreenshotCaptureOptions): void;\n}\n\nexport interface ScreenshotCaptureOptions {\n privacy?: MushiPrivacyConfig;\n}\n\nexport function createScreenshotCapture(options: ScreenshotCaptureOptions = {}): ScreenshotCapture {\n let activeOptions = options;\n\n async function take(): Promise<string | null> {\n try {\n if (typeof document === 'undefined') return null;\n\n // Prefer native getDisplayMedia if available (requires user gesture)\n // Fall back to simple canvas-based capture of visible viewport\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n const width = window.innerWidth;\n const height = window.innerHeight;\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n ctx.scale(dpr, dpr);\n\n // Capture via SVG foreignObject — works for most DOM content\n const safeDocument = buildPrivacySafeDocument(activeOptions.privacy);\n const svgData = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\">\n <foreignObject width=\"100%\" height=\"100%\">\n <div xmlns=\"http://www.w3.org/1999/xhtml\">\n ${new XMLSerializer().serializeToString(safeDocument)}\n </div>\n </foreignObject>\n </svg>\n `;\n\n const img = new Image();\n const blob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n\n return new Promise((resolve) => {\n img.onload = () => {\n ctx.drawImage(img, 0, 0, width, height);\n URL.revokeObjectURL(url);\n try {\n const dataUrl = canvas.toDataURL('image/jpeg', 0.7);\n resolve(dataUrl);\n } catch {\n resolve(null);\n }\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve(null);\n };\n img.src = url;\n });\n } catch {\n return null;\n }\n }\n\n return {\n take,\n updateOptions(nextOptions) {\n activeOptions = nextOptions;\n },\n };\n}\n\nfunction buildPrivacySafeDocument(privacy?: MushiPrivacyConfig): Element {\n const clone = document.documentElement.cloneNode(true) as Element;\n\n for (const selector of privacy?.blockSelectors ?? []) {\n for (const el of safeQueryAll(clone, selector)) {\n el.remove();\n }\n }\n\n for (const selector of privacy?.maskSelectors ?? []) {\n for (const el of safeQueryAll(clone, selector)) {\n maskElement(el as HTMLElement);\n }\n }\n\n return clone;\n}\n\nfunction safeQueryAll(root: Element, selector: string): Element[] {\n try {\n return Array.from(root.querySelectorAll(selector));\n } catch {\n return [];\n }\n}\n\nfunction maskElement(el: HTMLElement): void {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n el.value = '';\n el.setAttribute('value', '');\n el.setAttribute('placeholder', '••••');\n }\n el.textContent = el.children.length === 0 ? '••••' : el.textContent;\n el.setAttribute(\n 'style',\n `${el.getAttribute('style') ?? ''};background:#8f8f8f!important;color:transparent!important;text-shadow:none!important;`,\n );\n el.setAttribute('data-mushi-masked', 'true');\n}\n","import type { MushiPerformanceMetrics } from '@mushi-mushi/core';\n\nexport interface PerformanceCapture {\n getMetrics(): MushiPerformanceMetrics;\n destroy(): void;\n}\n\nexport function createPerformanceCapture(): PerformanceCapture {\n const metrics: MushiPerformanceMetrics = {};\n const observers: PerformanceObserver[] = [];\n\n if (typeof PerformanceObserver !== 'undefined') {\n try {\n const paintObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.name === 'first-contentful-paint') {\n metrics.fcp = entry.startTime;\n }\n }\n });\n paintObserver.observe({ type: 'paint', buffered: true });\n observers.push(paintObserver);\n } catch {\n // paint observer not supported\n }\n\n try {\n const lcpObserver = new PerformanceObserver((list) => {\n const entries = list.getEntries();\n if (entries.length > 0) {\n metrics.lcp = entries[entries.length - 1]!.startTime;\n }\n });\n lcpObserver.observe({ type: 'largest-contentful-paint', buffered: true });\n observers.push(lcpObserver);\n } catch {\n // LCP not supported\n }\n\n try {\n let clsValue = 0;\n const clsObserver = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (!(entry as PerformanceEntry & { hadRecentInput?: boolean }).hadRecentInput) {\n clsValue += (entry as PerformanceEntry & { value?: number }).value ?? 0;\n metrics.cls = clsValue;\n }\n }\n });\n clsObserver.observe({ type: 'layout-shift', buffered: true });\n observers.push(clsObserver);\n } catch {\n // CLS not supported\n }\n\n try {\n let longTaskCount = 0;\n const longTaskObserver = new PerformanceObserver((list) => {\n longTaskCount += list.getEntries().length;\n metrics.longTasks = longTaskCount;\n });\n longTaskObserver.observe({ type: 'longtask', buffered: true });\n observers.push(longTaskObserver);\n } catch {\n // longtask not supported\n }\n }\n\n // Navigation timing for TTFB\n if (typeof performance !== 'undefined' && performance.getEntriesByType) {\n try {\n const navEntries = performance.getEntriesByType('navigation') as PerformanceNavigationTiming[];\n if (navEntries.length > 0 && navEntries[0]) {\n metrics.ttfb = navEntries[0].responseStart - navEntries[0].requestStart;\n }\n } catch {\n // navigation timing not available\n }\n }\n\n return {\n getMetrics() {\n return { ...metrics };\n },\n destroy() {\n for (const obs of observers) {\n obs.disconnect();\n }\n observers.length = 0;\n },\n };\n}\n","import type { MushiSelectedElement } from '@mushi-mushi/core';\n\nexport interface ElementSelector {\n activate(): Promise<MushiSelectedElement | null>;\n deactivate(): void;\n isActive(): boolean;\n}\n\nexport function createElementSelector(): ElementSelector {\n let active = false;\n let overlay: HTMLDivElement | null = null;\n let resolvePromise: ((el: MushiSelectedElement | null) => void) | null = null;\n\n /**\n * Walk up the DOM until we find an ancestor with `data-testid`.\n *\n * Why ascending and not descending: testids in modern apps are placed\n * on the OUTER interactive container (\"BuyProButton\") rather than on\n * the deepest leaf the click event hit (the SVG inside the icon).\n * Walking up matches authoring intent.\n *\n * Bounded at 20 hops so a misbehaving page can't pin the SDK in a\n * pathological tree.\n */\n function findNearestTestid(el: Element | null): string | null {\n let cur: Element | null = el;\n let hops = 0;\n while (cur && hops < 20) {\n const tid = cur.getAttribute?.('data-testid');\n if (tid) return tid;\n cur = cur.parentElement;\n hops++;\n }\n return null;\n }\n\n function getXPath(el: Element): string {\n const parts: string[] = [];\n let current: Element | null = el;\n while (current && current !== document.body) {\n let index = 1;\n let sibling: Element | null = current.previousElementSibling;\n while (sibling) {\n if (sibling.tagName === current.tagName) index++;\n sibling = sibling.previousElementSibling;\n }\n const tag = current.tagName.toLowerCase();\n parts.unshift(index > 1 ? `${tag}[${index}]` : tag);\n current = current.parentElement;\n }\n return '//' + parts.join('/');\n }\n\n function captureElement(el: Element): MushiSelectedElement {\n const rect = el.getBoundingClientRect();\n return {\n tagName: el.tagName.toLowerCase(),\n id: el.id || undefined,\n className: el.className || undefined,\n textContent: el.textContent?.trim().slice(0, 200) || undefined,\n xpath: getXPath(el),\n rect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n },\n // v2 (whitepaper §4.7): the closest ancestor's `data-testid` lets the\n // server map this report → an Action node in the inventory graph\n // without a fuzzy NLP guess. We walk to the body so a deeply nested\n // span inside a button-with-testid still resolves correctly.\n nearestTestid: findNearestTestid(el) || undefined,\n route: typeof window !== 'undefined' ? window.location.pathname : undefined,\n };\n }\n\n function createOverlay(): HTMLDivElement {\n const el = document.createElement('div');\n el.style.cssText = `\n position: fixed;\n pointer-events: none;\n z-index: 2147483647;\n border: 2px solid #6366f1;\n background: rgba(99, 102, 241, 0.1);\n border-radius: 4px;\n transition: all 0.1s ease;\n display: none;\n `;\n document.body.appendChild(el);\n return el;\n }\n\n function positionOverlay(target: Element) {\n if (!overlay) return;\n const rect = target.getBoundingClientRect();\n overlay.style.left = `${rect.left}px`;\n overlay.style.top = `${rect.top}px`;\n overlay.style.width = `${rect.width}px`;\n overlay.style.height = `${rect.height}px`;\n overlay.style.display = 'block';\n }\n\n function handleMouseMove(e: MouseEvent) {\n const target = e.target as Element;\n if (target === overlay) return;\n positionOverlay(target);\n }\n\n function handleClick(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n const target = e.target as Element;\n if (target === overlay) return;\n const captured = captureElement(target);\n finish(captured);\n }\n\n function handleKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n finish(null);\n }\n }\n\n function finish(result: MushiSelectedElement | null) {\n deactivate();\n resolvePromise?.(result);\n resolvePromise = null;\n }\n\n function activate(): Promise<MushiSelectedElement | null> {\n if (active) deactivate();\n\n return new Promise((resolve) => {\n resolvePromise = resolve;\n active = true;\n overlay = createOverlay();\n document.body.style.cursor = 'crosshair';\n\n document.addEventListener('mousemove', handleMouseMove, true);\n document.addEventListener('click', handleClick, true);\n document.addEventListener('keydown', handleKeyDown, true);\n });\n }\n\n function deactivate() {\n if (!active) return;\n active = false;\n document.body.style.cursor = '';\n document.removeEventListener('mousemove', handleMouseMove, true);\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('keydown', handleKeyDown, true);\n\n if (overlay) {\n overlay.remove();\n overlay = null;\n }\n }\n\n return { activate, deactivate, isActive: () => active };\n}\n","import type { MushiConsoleEntry, MushiNetworkEntry, MushiTimelineEntry } from '@mushi-mushi/core';\n\nconst MAX_TIMELINE_ENTRIES = 120;\n\nexport interface TimelineCapture {\n setScreen(screen: { name: string; route?: string; feature?: string }): void;\n getEntries(input?: {\n consoleLogs?: MushiConsoleEntry[] | null;\n networkLogs?: MushiNetworkEntry[] | null;\n }): MushiTimelineEntry[];\n clear(): void;\n destroy(): void;\n}\n\nexport function createTimelineCapture(): TimelineCapture {\n const entries: MushiTimelineEntry[] = [];\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n const handlePopState = () => recordRoute('popstate');\n const handleHashChange = () => recordRoute('hashchange');\n\n recordRoute('initial');\n\n function record(entry: MushiTimelineEntry): void {\n entries.push(entry);\n if (entries.length > MAX_TIMELINE_ENTRIES) entries.shift();\n }\n\n function recordRoute(source: string): void {\n if (typeof location === 'undefined') return;\n record({\n ts: Date.now(),\n kind: 'route',\n payload: {\n source,\n route: `${location.pathname}${location.search}${location.hash}`,\n href: location.href,\n },\n });\n }\n\n function handleClick(event: MouseEvent): void {\n const target = event.target instanceof Element ? event.target : null;\n if (!target) return;\n const el = target.closest('button,a,[role=\"button\"],input,textarea,select,[data-mushi-track]') ?? target;\n record({\n ts: Date.now(),\n kind: 'click',\n payload: {\n tag: el.tagName.toLowerCase(),\n id: (el as HTMLElement).id || undefined,\n text: textSnippet(el),\n },\n });\n }\n\n history.pushState = function mushiPushState(this: History, ...args) {\n const result = originalPushState.apply(this, args);\n recordRoute('pushState');\n return result;\n } as typeof history.pushState;\n\n history.replaceState = function mushiReplaceState(this: History, ...args) {\n const result = originalReplaceState.apply(this, args);\n recordRoute('replaceState');\n return result;\n } as typeof history.replaceState;\n\n window.addEventListener('popstate', handlePopState);\n window.addEventListener('hashchange', handleHashChange);\n document.addEventListener('click', handleClick, true);\n\n return {\n setScreen(screen) {\n record({\n ts: Date.now(),\n kind: 'screen',\n payload: screen,\n });\n },\n getEntries(input = {}) {\n const merged = [\n ...entries,\n ...(input.consoleLogs ?? []).map((log): MushiTimelineEntry => ({\n ts: log.timestamp,\n kind: 'log',\n payload: {\n level: log.level,\n message: log.message,\n },\n })),\n ...(input.networkLogs ?? []).map((network): MushiTimelineEntry => ({\n ts: network.timestamp,\n kind: 'request',\n payload: {\n method: network.method,\n url: network.url,\n status: network.status,\n duration: network.duration,\n error: network.error,\n },\n })),\n ].sort((a, b) => a.ts - b.ts);\n return merged.slice(-MAX_TIMELINE_ENTRIES);\n },\n clear() {\n entries.length = 0;\n },\n destroy() {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n window.removeEventListener('popstate', handlePopState);\n window.removeEventListener('hashchange', handleHashChange);\n document.removeEventListener('click', handleClick, true);\n },\n };\n}\n\nfunction textSnippet(el: Element): string | undefined {\n const text = (el.textContent ?? '').replace(/\\s+/g, ' ').trim();\n return text ? text.slice(0, 80) : undefined;\n}\n","/**\n * Mushi Mushi v2.1 — passive inventory discovery (whitepaper §6 hybrid mode).\n *\n * What this captures\n * ──────────────────\n * - location.pathname, normalized to a route TEMPLATE (e.g.\n * /practice/abc-123 → /practice/[id]) using either an explicit list\n * of templates from the host framework's route config OR a small\n * heuristic that collapses uuid / numeric / 24-char-hex segments.\n * - document.title\n * - all `[data-testid]` values currently in the DOM\n * - the most recent N fetch/XHR paths captured by the existing\n * network capturer (we do NOT instrument fetch ourselves — we\n * borrow its observations to keep responsibility in one place)\n * - a ≤200-char DOM summary built from <h1> / <title> / <main>\n * - sanitized query-param keys (keys only, never values)\n * - a SHA-256 of (userId || sessionId) so the server can count\n * distinct users without storing identity\n *\n * What this does NOT capture\n * ──────────────────────────\n * - any other DOM content\n * - query-param VALUES, fragments, or hashes (only key names)\n * - cookies, localStorage, sessionStorage\n * - input values, focused elements, or scroll positions\n * - the user's IP or any device fingerprint (the server already\n * redacts what it gets, but we never send any)\n *\n * Throttling\n * ──────────\n * At most one emission per (route, throttleMs) window. Default 60s.\n * This keeps the ingest volume on a high-traffic SPA bounded — even\n * a customer with a million PVs/day generates at most ~1.4M rows.\n */\n\nimport type { MushiDiscoverInventoryConfig } from '@mushi-mushi/core';\n\nexport interface DiscoveryEvent {\n route: string;\n page_title: string | null;\n dom_summary: string | null;\n testids: string[];\n network_paths: string[];\n query_param_keys: string[];\n user_id_hash: string | null;\n observed_at: string;\n}\n\nexport interface DiscoveryCaptureOptions {\n config: MushiDiscoverInventoryConfig;\n /** Returns the recent fetch/XHR paths from the network capturer. */\n getRecentNetworkPaths: () => string[];\n /** Returns the current user identifier (or null) for hash input. */\n getUserId: () => string | null;\n /** Stable session id for dedup when no userId is set. */\n getSessionId: () => string;\n /** Called when a new discovery event is ready to ship. */\n onEvent: (e: DiscoveryEvent) => void;\n}\n\nexport interface DiscoveryCapture {\n destroy: () => void;\n /** Emit immediately for the current pathname. Used on init. */\n flushNow: () => void;\n}\n\nconst DEFAULT_THROTTLE_MS = 60_000;\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst HEX24_RE = /^[0-9a-f]{20,}$/i;\nconst NUMERIC_RE = /^\\d+$/;\nconst SLUG_HASHY_RE = /^[a-z0-9]{16,}$/i;\n\n/**\n * Collapse a single path segment to a template placeholder when it\n * looks like an opaque identifier. We are deliberately conservative\n * — if a heuristic isn't confident, we leave the segment alone, since\n * over-collapsing is worse than under-collapsing for the proposer.\n */\nexport function normalizeSegment(seg: string): string {\n if (seg.length === 0) return seg;\n if (UUID_RE.test(seg)) return '[id]';\n if (HEX24_RE.test(seg)) return '[id]';\n if (NUMERIC_RE.test(seg)) return '[id]';\n // Heuristic: a single segment of 16+ alphanumeric chars with at least\n // one digit is almost certainly an id, not a slug. (`thai-language` →\n // keep; `sku_abc12345xyz` → collapse.)\n if (SLUG_HASHY_RE.test(seg) && /\\d/.test(seg)) return '[id]';\n return seg;\n}\n\n/**\n * Normalize a pathname to a route template, preferring an exact-match\n * against `routeTemplates` if the host has provided them.\n *\n * /practice/abc-123 + ['/practice/[id]'] → '/practice/[id]'\n * /practice/01H8H8… without templates → '/practice/[id]'\n * /tags/thai-language without templates → '/tags/thai-language'\n */\nexport function normalizeRoute(\n pathname: string,\n templates: string[] | undefined,\n): string {\n // Strip trailing slash so /a and /a/ look the same to the proposer.\n const clean = pathname.length > 1 && pathname.endsWith('/')\n ? pathname.slice(0, -1)\n : pathname;\n if (templates?.length) {\n const matched = matchTemplate(clean, templates);\n if (matched) return matched;\n }\n return '/' + clean\n .split('/')\n .filter((s) => s.length > 0)\n .map(normalizeSegment)\n .join('/');\n}\n\n/**\n * Walk the host's static route templates and pick the one whose shape\n * matches the live pathname. `[id]`-style placeholders match any\n * single segment.\n */\nfunction matchTemplate(pathname: string, templates: string[]): string | null {\n const segs = pathname.split('/').filter((s) => s.length > 0);\n // Sort longer-first so /a/b/[c] beats /a/b on a 3-segment URL.\n const sorted = [...templates].sort(\n (a, b) => b.split('/').length - a.split('/').length,\n );\n for (const tpl of sorted) {\n const tplSegs = tpl.split('/').filter((s) => s.length > 0);\n if (tplSegs.length !== segs.length) continue;\n let ok = true;\n for (let i = 0; i < tplSegs.length; i++) {\n const t = tplSegs[i]!;\n const s = segs[i]!;\n if (t.startsWith('[') && t.endsWith(']')) continue;\n if (t.startsWith(':')) continue;\n if (t === s) continue;\n ok = false;\n break;\n }\n if (ok) return '/' + tplSegs.join('/');\n }\n return null;\n}\n\nfunction readTestids(): string[] {\n if (typeof document === 'undefined') return [];\n const out = new Set<string>();\n const els = document.querySelectorAll('[data-testid]');\n for (const el of Array.from(els)) {\n const v = el.getAttribute('data-testid');\n if (v && v.length > 0 && v.length < 120) out.add(v);\n }\n return Array.from(out).sort();\n}\n\nfunction readQueryParamKeys(): string[] {\n if (typeof window === 'undefined') return [];\n try {\n const params = new URLSearchParams(window.location.search);\n const out = new Set<string>();\n params.forEach((_, key) => out.add(key));\n return Array.from(out).sort();\n } catch {\n return [];\n }\n}\n\n/**\n * Build a ≤200-char summary from the document's most prominent text.\n * We try `<h1>` first (most apps put the page heading there), fall\n * back to `<title>`, then `<main>`'s first paragraph, then null.\n */\nfunction readDomSummary(): string | null {\n if (typeof document === 'undefined') return null;\n const trim = (s: string | null | undefined) =>\n (s ?? '').replace(/\\s+/g, ' ').trim().slice(0, 200);\n const h1 = trim(document.querySelector('h1')?.textContent);\n if (h1) return h1;\n const title = trim(document.title);\n if (title) return title;\n const main = trim(document.querySelector('main')?.textContent);\n return main || null;\n}\n\n/**\n * SHA-256 (lowercase hex) of `userId || sessionId`, using the platform\n * SubtleCrypto. Falls back to `null` if crypto.subtle isn't available\n * (rare; means we won't dedupe distinct users on this client). Never\n * throws.\n */\nasync function hashUserId(input: string | null): Promise<string | null> {\n if (!input || typeof crypto === 'undefined' || !crypto.subtle) return null;\n try {\n const data = new TextEncoder().encode(input);\n const buf = await crypto.subtle.digest('SHA-256', data);\n const bytes = new Uint8Array(buf);\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i]!.toString(16).padStart(2, '0');\n }\n return hex;\n } catch {\n return null;\n }\n}\n\n/**\n * Stand up the discovery capturer. Returns a disposer.\n *\n * Implementation notes\n * ────────────────────\n * - We hook `pushState` / `replaceState` because `popstate` alone misses\n * SPA navigations triggered by frameworks calling `history.pushState`\n * directly (Next.js / React Router both do this).\n * - The first emission fires after a 100ms delay so the host app has\n * a chance to settle the new DOM before we read testids.\n * - Hash-only changes (`#section`) are intentionally ignored; they're\n * not real navigations as far as the inventory is concerned.\n */\nexport function createDiscoveryCapture(opts: DiscoveryCaptureOptions): DiscoveryCapture {\n const {\n config,\n getRecentNetworkPaths,\n getUserId,\n getSessionId,\n onEvent,\n } = opts;\n\n const throttleMs = config.throttleMs ?? DEFAULT_THROTTLE_MS;\n const captureSummary = config.captureDomSummary !== false;\n const userIdSource = config.userIdSource ?? 'auto';\n\n const lastEmittedAt = new Map<string, number>();\n let lastPath: string | null = null;\n let pendingTimer: ReturnType<typeof setTimeout> | null = null;\n\n async function emitForCurrent() {\n if (typeof window === 'undefined') return;\n const route = normalizeRoute(window.location.pathname, config.routeTemplates);\n const now = Date.now();\n const last = lastEmittedAt.get(route) ?? 0;\n if (now - last < throttleMs) return;\n lastEmittedAt.set(route, now);\n\n let userIdInput: string | null = null;\n if (userIdSource === 'auto') {\n userIdInput = getUserId() ?? getSessionId();\n } else if (userIdSource === 'session-only') {\n userIdInput = getSessionId();\n }\n\n const event: DiscoveryEvent = {\n route,\n page_title: typeof document !== 'undefined'\n ? (document.title || '').slice(0, 300) || null\n : null,\n dom_summary: captureSummary ? readDomSummary() : null,\n testids: readTestids(),\n network_paths: getRecentNetworkPaths().slice(-50),\n query_param_keys: readQueryParamKeys(),\n user_id_hash: await hashUserId(userIdInput),\n observed_at: new Date().toISOString(),\n };\n onEvent(event);\n }\n\n function scheduleEmit() {\n if (pendingTimer) return;\n pendingTimer = setTimeout(() => {\n pendingTimer = null;\n void emitForCurrent();\n }, 100);\n }\n\n function onMaybeNavigation() {\n if (typeof window === 'undefined') return;\n const path = window.location.pathname + window.location.search;\n if (path === lastPath) return;\n lastPath = path;\n scheduleEmit();\n }\n\n if (typeof window === 'undefined') {\n return {\n destroy: () => undefined,\n flushNow: () => undefined,\n };\n }\n\n // Patch history.pushState / replaceState.\n const originalPush = window.history.pushState.bind(window.history);\n const originalReplace = window.history.replaceState.bind(window.history);\n const patchedPush: typeof window.history.pushState = function patched(\n ...args\n ) {\n const out = originalPush(...args);\n onMaybeNavigation();\n return out;\n };\n const patchedReplace: typeof window.history.replaceState = function patched(\n ...args\n ) {\n const out = originalReplace(...args);\n onMaybeNavigation();\n return out;\n };\n window.history.pushState = patchedPush;\n window.history.replaceState = patchedReplace;\n\n const onPop = () => onMaybeNavigation();\n window.addEventListener('popstate', onPop);\n\n // Initial emission for the landing page.\n scheduleEmit();\n\n return {\n destroy() {\n window.removeEventListener('popstate', onPop);\n // Best-effort restoration; if another piece of code patched it\n // after us, leave it alone.\n if (window.history.pushState === patchedPush) {\n window.history.pushState = originalPush;\n }\n if (window.history.replaceState === patchedReplace) {\n window.history.replaceState = originalReplace;\n }\n if (pendingTimer) {\n clearTimeout(pendingTimer);\n pendingTimer = null;\n }\n lastEmittedAt.clear();\n },\n flushNow() {\n // Bypass throttle on explicit flush.\n lastEmittedAt.clear();\n void emitForCurrent();\n },\n };\n}\n\n// Pure exports for the unit tests.\nexport const __test = { matchTemplate };\n","import type { MushiSentryConfig, MushiSentryContext } from '@mushi-mushi/core';\n\n/**\n * Sentry integration — boosted 2026-05-07.\n *\n * Goal: when a host has Sentry installed (v7, v8, or v9), every Mushi\n * report carries enough trace data for the admin to pivot directly into\n * Sentry's MCP / web UI without the user manually pasting links.\n *\n * Detection strategy:\n * 1. v8/v9 expose `Sentry.lastEventId()`, `Sentry.getCurrentScope()`,\n * `Sentry.getReplay()`, `Sentry.getActiveSpan()`. The global lives\n * under `window.Sentry`; the SDK wraps internals in\n * `__SENTRY__.version === '8'` or `'9'`.\n * 2. v7 exposes `Sentry.getCurrentHub()` and writes hub state under\n * `window.__SENTRY__.hub`.\n * 3. Replay can also be on `window.__SENTRY_REPLAY__` for sites that\n * attach the replay integration manually.\n *\n * Every probe is wrapped in a `try/catch` because Sentry's APIs change\n * between point releases — a v8.13.0 method can throw \"not a function\"\n * on v8.0.0. We accept partial captures by design; the goal is \"as much\n * context as we can get\" rather than \"all or nothing\".\n */\nexport type { MushiSentryContext as SentryContext };\n\n// ---- Detection layer --------------------------------------------------------\n\ninterface SentryV8Like {\n lastEventId?: () => string | undefined;\n getCurrentScope?: () => SentryScopeLike | undefined;\n getActiveSpan?: () => SentrySpanLike | undefined;\n getRootSpan?: (span: SentrySpanLike) => SentrySpanLike | undefined;\n getReplay?: () => SentryReplayLike | undefined;\n getClient?: () => SentryClientLike | undefined;\n setTag?: (key: string, value: string | number | boolean) => void;\n setContext?: (name: string, ctx: Record<string, unknown> | null) => void;\n addBreadcrumb?: (crumb: Record<string, unknown>) => void;\n}\n\ninterface SentryV7Like {\n getCurrentHub?: () => SentryHubLike | undefined;\n setTag?: (key: string, value: string | number | boolean) => void;\n setContext?: (name: string, ctx: Record<string, unknown> | null) => void;\n addBreadcrumb?: (crumb: Record<string, unknown>) => void;\n}\n\ninterface SentryHubLike {\n getClient?: () => SentryClientLike | undefined;\n getScope?: () => SentryScopeLike | undefined;\n configureScope?: (cb: (scope: SentryScopeLike) => void) => void;\n}\n\ninterface SentryScopeLike {\n getLastEventId?: () => string | undefined;\n getUser?: () => Record<string, unknown> | undefined;\n getTags?: () => Record<string, string | number | boolean> | undefined;\n getTransactionName?: () => string | undefined;\n getTransaction?: () => { name?: string } | undefined;\n getSpan?: () => SentrySpanLike | undefined;\n getSession?: () => { sid?: string } | undefined;\n getBreadcrumbs?: () => Record<string, unknown>[] | undefined;\n setTag?: (key: string, value: string | number | boolean) => void;\n setContext?: (name: string, ctx: Record<string, unknown> | null) => void;\n // Internal API: most Sentry SDK versions expose breadcrumbs at\n // `_breadcrumbs` even when there's no public getter for it. We use\n // it as a last-resort fallback inside a try/catch.\n _breadcrumbs?: Record<string, unknown>[];\n}\n\ninterface SentrySpanLike {\n spanContext?: () => { traceId?: string; spanId?: string };\n // v7 stored these directly on the span object.\n traceId?: string;\n spanId?: string;\n}\n\ninterface SentryReplayLike {\n getReplayId?: () => string | undefined;\n}\n\ninterface SentryClientLike {\n getOptions?: () => { release?: string; environment?: string; dsn?: string } | undefined;\n getDsn?: () => { projectId?: string; host?: string; publicKey?: string } | undefined;\n}\n\nfunction getSentryGlobal(): SentryV8Like | SentryV7Like | undefined {\n try {\n const w = globalThis as Record<string, unknown>;\n if (w.Sentry) return w.Sentry as SentryV8Like | SentryV7Like;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction getSentryReplayGlobal(): SentryReplayLike | undefined {\n try {\n const w = globalThis as Record<string, unknown>;\n return w.__SENTRY_REPLAY__ as SentryReplayLike | undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction detectSentrySdkFamily(): MushiSentryContext['sdk'] {\n try {\n const w = globalThis as Record<string, unknown>;\n const meta = w.__SENTRY__ as { version?: string } | undefined;\n const sentry = w.Sentry as Record<string, unknown> | undefined;\n if (meta?.version === '9' || (sentry && typeof sentry.lastEventId === 'function')) {\n // v9 dropped `getCurrentHub` entirely; presence of `lastEventId`\n // as a top-level fn distinguishes v8/v9 from v7.\n return meta?.version === '9' ? 'v9' : 'v8';\n }\n if (meta?.version === '8') return 'v8';\n if (sentry && typeof (sentry as SentryV7Like).getCurrentHub === 'function') return 'v7';\n return 'unknown';\n } catch {\n return 'unknown';\n }\n}\n\n// ---- Public surface ---------------------------------------------------------\n\n/**\n * Snapshot the current Sentry scope. `_config` is reserved for future\n * `useReplay`/`enrichWithSeer` toggles — for now every host that has\n * Sentry available gets the full snapshot.\n *\n * `breadcrumbsLimit` defaults to 30 (Sentry's own default `maxBreadcrumbs`).\n * Callers can pass a smaller value when ingest payload size matters\n * (mobile clients on lossy networks, etc.).\n */\nexport function captureSentryContext(\n _config: MushiSentryConfig,\n options: { breadcrumbsLimit?: number } = {},\n): MushiSentryContext {\n const limit = Math.max(0, options.breadcrumbsLimit ?? 30);\n const out: MushiSentryContext = {};\n const sentry = getSentryGlobal();\n if (!sentry) return out;\n out.sdk = detectSentrySdkFamily();\n\n // 1) eventId — Sentry v8/v9 exposes a top-level `lastEventId()`. v7\n // pulls it off the active scope.\n try {\n const v8 = sentry as SentryV8Like;\n if (typeof v8.lastEventId === 'function') {\n out.eventId = v8.lastEventId() ?? undefined;\n } else {\n const v7 = sentry as SentryV7Like;\n const scope = v7.getCurrentHub?.()?.getScope?.();\n out.eventId = scope?.getLastEventId?.() ?? undefined;\n }\n } catch {\n // Swallow — different Sentry versions throw \"not a function\" on\n // arbitrary internals between point releases.\n }\n\n // 2) Scope — user / tags / transaction / breadcrumbs / session.\n let scope: SentryScopeLike | undefined;\n try {\n const v8 = sentry as SentryV8Like;\n if (typeof v8.getCurrentScope === 'function') {\n scope = v8.getCurrentScope();\n } else {\n const v7 = sentry as SentryV7Like;\n scope = v7.getCurrentHub?.()?.getScope?.();\n }\n } catch {\n // Sentry not available\n }\n if (scope) {\n try {\n const user = scope.getUser?.();\n if (user) {\n out.user = {\n id: typeof user.id === 'string' ? user.id : undefined,\n email: typeof user.email === 'string' ? user.email : undefined,\n username: typeof user.username === 'string' ? user.username : undefined,\n ip_address: typeof user.ip_address === 'string' ? user.ip_address : undefined,\n };\n }\n } catch {\n // Swallow — Sentry's scope methods change shape across releases.\n }\n try {\n const tags = scope.getTags?.();\n if (tags && typeof tags === 'object') {\n // Filter to scalar values — `setTag` accepts arrays in some\n // Sentry versions but our schema is scalar-only and the LLM\n // grounding relies on `key=string` shapes anyway.\n const pruned: Record<string, string | number | boolean> = {};\n for (const [k, v] of Object.entries(tags)) {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\n pruned[k] = v;\n }\n }\n if (Object.keys(pruned).length > 0) out.tags = pruned;\n }\n } catch {\n // Swallow.\n }\n try {\n // v8 uses `getTransactionName`; v7 used `getTransaction()?.name`.\n out.transactionName =\n scope.getTransactionName?.() ?? scope.getTransaction?.()?.name ?? undefined;\n } catch {\n // Swallow.\n }\n try {\n out.sessionId = scope.getSession?.()?.sid ?? undefined;\n } catch {\n // Swallow.\n }\n try {\n // Public getter when present, fall back to the internal `_breadcrumbs`\n // array which has lived at the same path since Sentry 5.\n const raw = scope.getBreadcrumbs?.() ?? scope._breadcrumbs ?? [];\n if (Array.isArray(raw) && raw.length > 0) {\n const sliced = raw.slice(-limit);\n out.breadcrumbs = sliced.map((b) => {\n const r = b as Record<string, unknown>;\n return {\n timestamp:\n typeof r.timestamp === 'number'\n ? // Sentry stores breadcrumb timestamps in seconds; convert\n // to ms so the field is comparable to Mushi's own.\n r.timestamp < 1e12\n ? Math.round(r.timestamp * 1000)\n : r.timestamp\n : undefined,\n category: typeof r.category === 'string' ? r.category : undefined,\n level: typeof r.level === 'string' ? r.level : undefined,\n message: typeof r.message === 'string' ? r.message : undefined,\n type: typeof r.type === 'string' ? r.type : undefined,\n data:\n r.data && typeof r.data === 'object'\n ? (r.data as Record<string, unknown>)\n : undefined,\n };\n });\n }\n } catch {\n // Swallow.\n }\n }\n\n // 3) Trace — ask Sentry for the active span and read its trace/span ids.\n try {\n const v8 = sentry as SentryV8Like;\n let span: SentrySpanLike | undefined;\n if (typeof v8.getActiveSpan === 'function') {\n span = v8.getActiveSpan();\n } else if (scope?.getSpan) {\n span = scope.getSpan();\n }\n if (span) {\n const ctx = span.spanContext?.();\n out.traceId = ctx?.traceId ?? span.traceId ?? undefined;\n out.spanId = ctx?.spanId ?? span.spanId ?? undefined;\n }\n } catch {\n // Swallow — `getActiveSpan` errored on v8.0.0 - v8.5.0 when no\n // tracing integration was configured. Reading is best-effort.\n }\n\n // 4) Client options — release + environment + DSN-derived issue url.\n let client: SentryClientLike | undefined;\n try {\n const v8 = sentry as SentryV8Like;\n if (typeof v8.getClient === 'function') {\n client = v8.getClient();\n } else {\n const v7 = sentry as SentryV7Like;\n client = v7.getCurrentHub?.()?.getClient?.();\n }\n } catch {\n // Swallow.\n }\n if (client) {\n try {\n const opts = client.getOptions?.();\n if (opts?.release) out.release = opts.release;\n if (opts?.environment) out.environment = opts.environment;\n } catch {\n // Swallow.\n }\n try {\n // DSN parts — used to synthesize a deeplink to the issue.\n const dsn = client.getDsn?.();\n if (dsn?.host && dsn?.projectId && out.eventId) {\n // The org slug is not directly exposed by Sentry's DSN object;\n // we synthesize the canonical events URL which Sentry redirects\n // to the right issue. Falls back to undefined when we can't\n // construct a valid URL.\n const orgHost = dsn.host.replace(/^o\\d+\\./, '');\n out.issueUrl = `https://${orgHost}/issues/?query=${encodeURIComponent(out.eventId)}`;\n }\n } catch {\n // Swallow.\n }\n }\n\n // 5) Replay — try the modern `getReplay()` first, fall back to the\n // legacy `__SENTRY_REPLAY__` global some integrations attach manually.\n try {\n const v8 = sentry as SentryV8Like;\n const replay = v8.getReplay?.() ?? getSentryReplayGlobal();\n out.replayId = replay?.getReplayId?.() ?? undefined;\n } catch {\n // Swallow.\n }\n\n return out;\n}\n\n/**\n * Bidirectional linkage. Call this *after* a successful Mushi report\n * submission with the server-assigned report id. We drop a tag on\n * Sentry's current scope so any subsequent Sentry events from the\n * same session reference the Mushi report. We also write a\n * `mushi_report` context block that the Sentry MCP `search_events`\n * tool surfaces on the issue page.\n *\n * Best-effort and silent on failure — a Sentry that's mid-bootstrap\n * or an SDK version with a different scope API must never break a\n * report that's already been accepted by Mushi.\n */\nexport function tagSentryScope(reportId: string, options: { reportUrl?: string } = {}): void {\n const sentry = getSentryGlobal();\n if (!sentry) return;\n try {\n // v8/v9: top-level `setTag` + `setContext` write to the active scope.\n const v8 = sentry as SentryV8Like;\n if (typeof v8.setTag === 'function') {\n v8.setTag('mushi.report_id', reportId);\n if (options.reportUrl) v8.setTag('mushi.report_url', options.reportUrl);\n }\n if (typeof v8.setContext === 'function') {\n v8.setContext('mushi_report', {\n id: reportId,\n ...(options.reportUrl ? { url: options.reportUrl } : {}),\n captured_at: new Date().toISOString(),\n });\n }\n // Also drop a Sentry breadcrumb so the link is visible in the\n // breadcrumb timeline of the next Sentry event the user\n // produces, not just on the scope.\n if (typeof v8.addBreadcrumb === 'function') {\n v8.addBreadcrumb({\n category: 'mushi',\n type: 'info',\n level: 'info',\n message: `Mushi report submitted (${reportId})`,\n data: { report_id: reportId, ...(options.reportUrl ? { url: options.reportUrl } : {}) },\n });\n }\n } catch {\n // Sentry not available\n }\n\n // v7 fallback: configure the scope on the active hub.\n try {\n const v7 = sentry as SentryV7Like;\n const scope = v7.getCurrentHub?.()?.getScope?.();\n if (scope) {\n scope.setTag?.('mushi.report_id', reportId);\n if (options.reportUrl) scope.setTag?.('mushi.report_url', options.reportUrl);\n scope.setContext?.('mushi_report', {\n id: reportId,\n ...(options.reportUrl ? { url: options.reportUrl } : {}),\n });\n }\n } catch {\n // Swallow.\n }\n}\n\n// ---- Feedback interceptor (kept from prior revision) -----------------------\n\nexport interface SentryFeedbackInterceptor {\n start(): void;\n stop(): void;\n}\n\nexport function createSentryFeedbackInterceptor(\n _config: MushiSentryConfig,\n onFeedback: (feedback: { eventId?: string; message: string; email?: string; name?: string }) => void,\n): SentryFeedbackInterceptor {\n let observer: MutationObserver | null = null;\n\n function start() {\n if (typeof MutationObserver === 'undefined') return;\n\n observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (node instanceof HTMLElement && node.getAttribute('data-sentry-feedback')) {\n interceptFeedbackForm(node);\n }\n }\n }\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n }\n\n function interceptFeedbackForm(container: HTMLElement) {\n const form = container.querySelector('form');\n if (!form) return;\n\n form.addEventListener('submit', () => {\n const formData = new FormData(form);\n onFeedback({\n message: (formData.get('message') as string) ?? '',\n email: (formData.get('email') as string) ?? undefined,\n name: (formData.get('name') as string) ?? undefined,\n });\n });\n }\n\n function stop() {\n observer?.disconnect();\n observer = null;\n }\n\n return { start, stop };\n}\n","import type { MushiApiCascadeConfig, MushiUrlMatcher } from '@mushi-mushi/core'\nimport { getInternalRequestKind, getRequestUrl, shouldIgnoreMushiUrl } from './internal-requests'\n\nexport interface ProactiveTriggerConfig {\n rageClick?: boolean\n longTask?: boolean\n apiCascade?: boolean | MushiApiCascadeConfig\n apiEndpoint?: string\n errorBoundary?: boolean\n}\n\nexport interface ProactiveTriggerCallbacks {\n onTrigger: (type: string, context: Record<string, unknown>) => void\n}\n\nexport interface ProactiveTriggerCleanup {\n destroy: () => void\n}\n\nexport function setupProactiveTriggers(\n callbacks: ProactiveTriggerCallbacks,\n config: ProactiveTriggerConfig = {},\n): ProactiveTriggerCleanup {\n const cleanups: Array<() => void> = []\n\n // --- Rage Click Detection ---\n if (config.rageClick !== false) {\n let clickTimes: number[] = []\n let lastClickTarget: EventTarget | null = null\n\n function handleClick(e: MouseEvent) {\n const now = Date.now()\n if (e.target === lastClickTarget) {\n clickTimes.push(now)\n clickTimes = clickTimes.filter(t => now - t < 500)\n if (clickTimes.length >= 3) {\n const el = e.target as HTMLElement\n callbacks.onTrigger('rage_click', {\n element: el.tagName,\n id: el.id,\n text: el.textContent?.slice(0, 50),\n })\n clickTimes = []\n }\n } else {\n lastClickTarget = e.target\n clickTimes = [now]\n }\n }\n document.addEventListener('click', handleClick, true)\n cleanups.push(() => document.removeEventListener('click', handleClick, true))\n }\n\n // --- Long Task Detection ---\n if (config.longTask !== false && typeof PerformanceObserver !== 'undefined') {\n try {\n const observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.duration > 5000) {\n callbacks.onTrigger('long_task', {\n duration: Math.round(entry.duration),\n startTime: Math.round(entry.startTime),\n })\n }\n }\n })\n observer.observe({ entryTypes: ['longtask'] })\n cleanups.push(() => observer.disconnect())\n } catch {\n // longtask not supported\n }\n }\n\n // --- API Cascade Failure ---\n const apiCascade = normalizeApiCascadeConfig(config.apiCascade)\n if (apiCascade.enabled) {\n const failedRequests: number[] = []\n const origFetch = globalThis.fetch\n\n globalThis.fetch = async function (this: unknown, ...args: Parameters<typeof fetch>) {\n const [input, init] = args\n const url = getRequestUrl(input)\n const ignoreFailure = Boolean(getInternalRequestKind(input, init))\n || shouldIgnoreMushiUrl(url, {\n apiEndpoint: config.apiEndpoint,\n ignoreUrls: apiCascade.ignoreUrls,\n })\n\n try {\n const res = await origFetch.apply(this, args)\n if (!ignoreFailure && !res.ok && res.status >= 400) {\n recordApiFailure(failedRequests, callbacks)\n }\n return res\n } catch (err) {\n if (!ignoreFailure) recordApiFailure(failedRequests, callbacks)\n throw err\n }\n } as typeof fetch\n\n cleanups.push(() => { globalThis.fetch = origFetch })\n }\n\n // --- Global Error Boundary ---\n if (config.errorBoundary) {\n function handleError(event: ErrorEvent) {\n callbacks.onTrigger('error_boundary', {\n message: event.message,\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n })\n }\n function handleUnhandledRejection(event: PromiseRejectionEvent) {\n callbacks.onTrigger('error_boundary', {\n message: event.reason instanceof Error ? event.reason.message : String(event.reason),\n type: 'unhandled_rejection',\n })\n }\n window.addEventListener('error', handleError)\n window.addEventListener('unhandledrejection', handleUnhandledRejection)\n cleanups.push(() => {\n window.removeEventListener('error', handleError)\n window.removeEventListener('unhandledrejection', handleUnhandledRejection)\n })\n }\n\n return {\n destroy() {\n cleanups.forEach(fn => fn())\n },\n }\n}\n\nfunction normalizeApiCascadeConfig(\n config: boolean | MushiApiCascadeConfig | undefined,\n): Required<Pick<MushiApiCascadeConfig, 'enabled'>> & { ignoreUrls: MushiUrlMatcher[] } {\n if (config === false) return { enabled: false, ignoreUrls: [] }\n if (config && typeof config === 'object') {\n return {\n enabled: config.enabled !== false,\n ignoreUrls: config.ignoreUrls ?? [],\n }\n }\n return { enabled: true, ignoreUrls: [] }\n}\n\nfunction recordApiFailure(failedRequests: number[], callbacks: ProactiveTriggerCallbacks): void {\n const now = Date.now()\n failedRequests.push(now)\n const recentFailures = failedRequests.filter(t => now - t < 10000)\n if (recentFailures.length >= 3) {\n callbacks.onTrigger('api_cascade', {\n failureCount: recentFailures.length,\n windowMs: 10000,\n })\n failedRequests.length = 0\n }\n}\n","export interface ProactiveConfig {\n maxProactivePerSession: number\n dismissCooldownHours: number\n suppressAfterDismissals: number\n}\n\nexport interface ProactiveManager {\n shouldShow(triggerType: string): boolean\n recordDismissal(): void\n recordSubmission(): void\n reset(): void\n}\n\nconst STORAGE_KEY_LAST_DISMISS = 'mushi:lastDismiss'\nconst STORAGE_KEY_CONSEC_DISMISS = 'mushi:consecDismiss'\n\nfunction readStorage(key: string): string | null {\n try { return localStorage.getItem(key) } catch { return null }\n}\n\nfunction writeStorage(key: string, value: string): void {\n try { localStorage.setItem(key, value) } catch { /* noop */ }\n}\n\nexport function createProactiveManager(\n config: Partial<ProactiveConfig> = {},\n): ProactiveManager {\n const maxPerSession = config.maxProactivePerSession ?? 2\n const cooldownHours = config.dismissCooldownHours ?? 24\n const suppressThreshold = config.suppressAfterDismissals ?? 3\n\n let sessionPromptCount = 0\n const sessionTriggerTypes = new Set<string>()\n\n function shouldShow(triggerType: string): boolean {\n // Permanent suppression check\n const consecDismissals = parseInt(readStorage(STORAGE_KEY_CONSEC_DISMISS) ?? '0', 10)\n if (consecDismissals >= suppressThreshold) return false\n\n // Cooldown check\n const lastDismiss = readStorage(STORAGE_KEY_LAST_DISMISS)\n if (lastDismiss) {\n const elapsed = Date.now() - parseInt(lastDismiss, 10)\n if (elapsed < cooldownHours * 60 * 60 * 1000) return false\n }\n\n // Session limit\n if (sessionPromptCount >= maxPerSession) return false\n\n // Dedup: same trigger type not shown twice per session\n if (sessionTriggerTypes.has(triggerType)) return false\n\n sessionTriggerTypes.add(triggerType)\n sessionPromptCount++\n return true\n }\n\n function recordDismissal(): void {\n writeStorage(STORAGE_KEY_LAST_DISMISS, String(Date.now()))\n const current = parseInt(readStorage(STORAGE_KEY_CONSEC_DISMISS) ?? '0', 10)\n writeStorage(STORAGE_KEY_CONSEC_DISMISS, String(current + 1))\n }\n\n function recordSubmission(): void {\n writeStorage(STORAGE_KEY_CONSEC_DISMISS, '0')\n }\n\n function reset(): void {\n sessionPromptCount = 0\n sessionTriggerTypes.clear()\n }\n\n return { shouldShow, recordDismissal, recordSubmission, reset }\n}\n","declare const __MUSHI_SDK_VERSION__: string | undefined;\n\nexport const MUSHI_SDK_PACKAGE = '@mushi-mushi/web';\nexport const MUSHI_SDK_VERSION =\n typeof __MUSHI_SDK_VERSION__ === 'string' && __MUSHI_SDK_VERSION__\n ? __MUSHI_SDK_VERSION__\n : '0.7.0';\n","import {\n type MushiConfig,\n type MushiReport,\n type MushiReportCategory,\n type MushiRuntimeSdkConfig,\n type MushiSdkVersionInfo,\n type MushiEventType,\n type MushiEventHandler,\n type MushiSDKInstance,\n type MushiDiagnosticsResult,\n DEFAULT_API_ENDPOINT,\n MUSHI_INTERNAL_INIT_MARKER,\n createApiClient,\n createPreFilter,\n createOfflineQueue,\n captureEnvironment,\n getReporterToken,\n getDeviceFingerprintHash,\n getSessionId,\n createRateLimiter,\n createPiiScrubber,\n createLogger,\n noopLogger,\n createBreadcrumbBuffer,\n type BreadcrumbBuffer,\n normaliseThrown,\n} from '@mushi-mushi/core';\n\nimport { MushiWidget } from './widget';\nimport { exposeMarketingRecorder } from './marketing-recorder';\nimport {\n initRewards,\n updateRewardsUser,\n enqueue as enqueueActivity,\n getTier as getRewardsTier,\n type RewardsContext,\n} from './rewards';\nimport {\n createConsoleCapture,\n createNetworkCapture,\n createScreenshotCapture,\n createPerformanceCapture,\n createElementSelector,\n createTimelineCapture,\n createDiscoveryCapture,\n type DiscoveryCapture,\n} from './capture';\nimport { captureSentryContext, tagSentryScope } from './sentry';\nimport { setupProactiveTriggers, type ProactiveTriggerCleanup } from './proactive-triggers';\nimport { createProactiveManager, type ProactiveManager } from './proactive-manager';\nimport { isLocalhostEndpoint } from './internal-requests';\nimport { MUSHI_SDK_PACKAGE, MUSHI_SDK_VERSION } from './version';\n\nlet instance: MushiSDKInstance | null = null;\n\nexport class Mushi {\n private constructor() {}\n\n static init(config: MushiConfig): MushiSDKInstance {\n if (instance) {\n createLogger({ scope: 'mushi', level: 'warn', format: 'pretty' })\n .warn('Already initialized — call destroy() first to reinitialize');\n return instance;\n }\n\n if (!config.projectId) {\n throw new Error('[mushi] projectId is required');\n }\n\n if (!config.apiKey) {\n throw new Error('[mushi] apiKey is required');\n }\n\n if (config.enabled === false) {\n return createNoopInstance();\n }\n\n instance = createInstance(config);\n return instance;\n }\n\n static getInstance(): MushiSDKInstance | null {\n return instance;\n }\n\n static destroy(): void {\n instance?.destroy();\n instance = null;\n }\n\n static diagnose(): Promise<MushiDiagnosticsResult> {\n return instance?.diagnose() ?? diagnoseWithoutInstance();\n }\n}\n\nfunction createInstance(config: MushiConfig): MushiSDKInstance {\n const bootstrapConfig = applyPresetConfig(config);\n let activeConfig: MushiConfig = bootstrapConfig;\n const log = (config.debug ?? false)\n ? createLogger({ scope: 'mushi', level: 'debug', format: 'pretty' })\n : noopLogger;\n\n const apiClient = createApiClient({\n projectId: bootstrapConfig.projectId,\n apiKey: bootstrapConfig.apiKey,\n ...(bootstrapConfig.apiEndpoint ? { apiEndpoint: bootstrapConfig.apiEndpoint } : {}),\n });\n\n const preFilter = createPreFilter(bootstrapConfig.preFilter);\n const offlineQueue = createOfflineQueue(bootstrapConfig.offline);\n const rateLimiter = createRateLimiter({ maxBurst: 10, refillRate: 1, refillIntervalMs: 5_000 });\n const piiScrubber = createPiiScrubber();\n\n // Apply the same scrubber that runs over `description` to the\n // observability surfaces (breadcrumbs, tags, sentry context) right\n // before they leave the SDK. The buffer/sentry layers are kept\n // pristine so `getBreadcrumbs()` returns the host's own values; this\n // pass only mutates the snapshot that goes on the wire.\n function scrubBreadcrumbsForWire<T extends { message?: string; data?: Record<string, unknown> }>(\n crumbs: T[],\n ): T[] {\n return crumbs.map((c) => {\n const next: T = { ...c };\n if (typeof c.message === 'string') {\n next.message = piiScrubber.scrub(c.message);\n }\n if (c.data && typeof c.data === 'object') {\n const cleaned: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(c.data)) {\n cleaned[k] = typeof v === 'string' ? piiScrubber.scrub(v) : v;\n }\n next.data = cleaned;\n }\n return next;\n });\n }\n function scrubTagsForWire(\n tags: Record<string, string | number | boolean> | undefined,\n ): Record<string, string | number | boolean> | undefined {\n if (!tags) return undefined;\n const out: Record<string, string | number | boolean> = {};\n for (const [k, v] of Object.entries(tags)) {\n out[k] = typeof v === 'string' ? piiScrubber.scrub(v) : v;\n }\n return out;\n }\n\n let consoleCap: ReturnType<typeof createConsoleCapture> | null = null;\n let networkCap: ReturnType<typeof createNetworkCapture> | null = null;\n let perfCap: ReturnType<typeof createPerformanceCapture> | null = null;\n let screenshotCap: ReturnType<typeof createScreenshotCapture> | null = null;\n let elementSelector: ReturnType<typeof createElementSelector> | null = null;\n let discoveryCap: DiscoveryCapture | null = null;\n const timelineCap = createTimelineCapture();\n let widget!: MushiWidget;\n\n function syncCaptureModules() {\n if (activeConfig.capture?.console !== false) {\n consoleCap ??= createConsoleCapture();\n } else {\n consoleCap?.destroy();\n consoleCap = null;\n }\n\n if (activeConfig.capture?.network !== false) {\n const networkOptions = {\n apiEndpoint: resolveApiEndpoint(activeConfig),\n ignoreUrls: activeConfig.capture?.ignoreUrls,\n };\n if (networkCap) {\n networkCap.updateOptions(networkOptions);\n } else {\n networkCap = createNetworkCapture(networkOptions);\n }\n } else {\n networkCap?.destroy();\n networkCap = null;\n }\n\n if (activeConfig.capture?.performance !== false) {\n perfCap ??= createPerformanceCapture();\n } else {\n perfCap?.destroy();\n perfCap = null;\n }\n\n if (activeConfig.capture?.screenshot !== 'off') {\n const screenshotOptions = { privacy: activeConfig.privacy };\n if (screenshotCap) {\n screenshotCap.updateOptions(screenshotOptions);\n } else {\n screenshotCap = createScreenshotCapture(screenshotOptions);\n }\n } else {\n screenshotCap = null;\n }\n if (!screenshotCap) pendingScreenshot = null;\n widget.setAllowScreenshotRemove(activeConfig.privacy?.allowUserRemoveScreenshot !== false);\n\n if (activeConfig.capture?.elementSelector !== false) {\n elementSelector ??= createElementSelector();\n } else {\n elementSelector?.deactivate();\n elementSelector = null;\n pendingElement = null;\n }\n\n // Mushi v2.1: passive inventory discovery. Default OFF — only stand\n // up when the host explicitly opts in. We deliberately re-create the\n // capturer when the config changes (rather than mutating it) so the\n // route-template list and throttle window are picked up cleanly.\n const discoveryRaw = activeConfig.capture?.discoverInventory;\n const discoveryConfig =\n discoveryRaw === true\n ? {}\n : discoveryRaw && typeof discoveryRaw === 'object'\n ? discoveryRaw\n : null;\n const discoveryEnabled =\n discoveryConfig != null && discoveryConfig.enabled !== false;\n if (discoveryEnabled) {\n discoveryCap?.destroy();\n discoveryCap = createDiscoveryCapture({\n config: discoveryConfig!,\n getRecentNetworkPaths: () => {\n if (!networkCap) return [];\n return networkCap\n .getEntries()\n .map((e) => {\n try {\n const u = new URL(e.url, typeof window !== 'undefined' ? window.location.href : 'http://localhost');\n // Only same-origin or otherwise meaningful paths — skip\n // tracking pixels and the Mushi ingest endpoint itself.\n if (u.host && typeof window !== 'undefined' && u.host !== window.location.host) return null;\n return u.pathname;\n } catch {\n return null;\n }\n })\n .filter((p): p is string => p != null && p.length > 0 && p.length < 200);\n },\n getUserId: () => userInfo?.id ?? null,\n getSessionId,\n onEvent: (event) => {\n // Best-effort; never throw, never block.\n void apiClient\n .postDiscoveryEvent({\n ...event,\n sdk_version: MUSHI_SDK_VERSION,\n })\n .catch((err) => {\n log.debug('discovery emit failed', { err: String(err) });\n });\n },\n });\n } else {\n discoveryCap?.destroy();\n discoveryCap = null;\n }\n }\n\n const listeners = new Map<MushiEventType, Set<MushiEventHandler>>();\n function emit(type: MushiEventType, data?: unknown) {\n listeners.get(type)?.forEach((handler) => handler({ type, data }));\n }\n\n let pendingScreenshot: string | null = null;\n let pendingElement: { tagName: string; id?: string; className?: string; xpath?: string } | null = null;\n let pendingProactiveTrigger: string | null = null;\n let runtimeConfigLoaded = false;\n let userInfo: { id: string; email?: string; name?: string } | null = null;\n const customMetadata: Record<string, unknown> = {};\n // Sticky tags applied to every subsequent report. Cleared by\n // `clearTag()` (single key) or `clearTag()` with no args (all keys).\n // We coerce to scalar values at insert time so the wire format is\n // already canonical when the report serialises.\n const stickyTags: Record<string, string | number | boolean> = {};\n // Breadcrumb ring buffer — Sentry-grade observability surface that\n // works whether or not the host has Sentry installed. Auto-populated\n // by SDK lifecycle events (`init` / `report:opened` / `report:sent`),\n // route changes, console errors, and `[data-testid]` clicks. Hosts\n // can also call `Mushi.addBreadcrumb()` directly.\n const breadcrumbs: BreadcrumbBuffer = createBreadcrumbBuffer({ max: 50 });\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: 'Mushi SDK init',\n data: { projectId: bootstrapConfig.projectId, sdkVersion: MUSHI_SDK_VERSION },\n });\n // Auto-breadcrumb teardown handles. Stored at module scope so\n // `destroy()` can detach them cleanly — leaks here would tail every\n // re-init in HMR'd dev sessions.\n let detachAutoBreadcrumbs: (() => void) | null = null;\n detachAutoBreadcrumbs = installAutoBreadcrumbs(breadcrumbs);\n widget = new MushiWidget(bootstrapConfig.widget, {\n onSubmit: async ({ category, description, intent }) => {\n log.info('Report submitted', { category, intent });\n proactiveManager?.recordSubmission();\n await submitReport(category, description, intent);\n },\n onOpen: () => {\n log.debug('Widget opened');\n emit('widget:opened');\n },\n onClose: () => {\n log.debug('Widget closed');\n if (pendingProactiveTrigger) {\n proactiveManager?.recordDismissal();\n emit('proactive:dismissed', { type: pendingProactiveTrigger });\n }\n pendingScreenshot = null;\n pendingElement = null;\n pendingProactiveTrigger = null;\n emit('widget:closed');\n },\n onScreenshotRequest: async () => {\n if (!screenshotCap || activeConfig.capture?.screenshot === 'off') return;\n log.debug('Taking screenshot');\n pendingScreenshot = await screenshotCap.take();\n widget.setScreenshotAttached(pendingScreenshot !== null);\n },\n onScreenshotRemove: () => {\n log.debug('Screenshot attachment removed');\n pendingScreenshot = null;\n widget.setScreenshotAttached(false);\n },\n onElementSelectorRequest: async () => {\n if (!elementSelector || activeConfig.capture?.elementSelector === false) return;\n log.debug('Element selector activated');\n const el = await elementSelector.activate();\n if (el) {\n pendingElement = el;\n widget.setElementSelected(true);\n log.debug('Element selected', { tagName: el.tagName, xpath: el.xpath });\n }\n },\n async onReporterReportsRequest() {\n const result = await apiClient.listReporterReports(getReporterToken());\n if (!result.ok) throw new Error(result.error?.message ?? 'Could not load reports');\n return result.data?.reports ?? [];\n },\n async onReporterCommentsRequest(reportId) {\n const result = await apiClient.listReporterComments(reportId, getReporterToken());\n if (!result.ok) throw new Error(result.error?.message ?? 'Could not load thread');\n return result.data?.comments ?? [];\n },\n async onReporterReply(reportId, body) {\n const result = await apiClient.replyToReporterReport(reportId, getReporterToken(), body);\n if (!result.ok) throw new Error(result.error?.message ?? 'Could not send reply');\n },\n }, MUSHI_SDK_VERSION);\n syncCaptureModules();\n\n if (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => widget.mount());\n } else {\n widget.mount();\n }\n }\n\n // --- Proactive triggers + fatigue prevention ---\n let proactiveTriggers: ProactiveTriggerCleanup | null = null;\n let proactiveManager: ProactiveManager | null = null;\n\n const proactiveCfg = activeConfig.proactive;\n const hasAnyProactive = proactiveCfg\n && (proactiveCfg.rageClick !== false\n || proactiveCfg.longTask !== false\n || proactiveCfg.apiCascade !== false\n || proactiveCfg.errorBoundary === true);\n\n if (hasAnyProactive && typeof document !== 'undefined') {\n proactiveManager = createProactiveManager(proactiveCfg?.cooldown);\n\n proactiveTriggers = setupProactiveTriggers(\n {\n onTrigger: (type, context) => {\n if (!proactiveManager!.shouldShow(type)) {\n log.debug('Proactive trigger suppressed by fatigue prevention', { type });\n return;\n }\n log.info('Proactive trigger fired', { type, context });\n pendingProactiveTrigger = type;\n emit('proactive:triggered', { type, context });\n widget.open();\n },\n },\n {\n rageClick: proactiveCfg?.rageClick,\n longTask: proactiveCfg?.longTask,\n apiCascade: proactiveCfg?.apiCascade,\n apiEndpoint: resolveApiEndpoint(activeConfig),\n errorBoundary: proactiveCfg?.errorBoundary,\n },\n );\n\n log.debug('Proactive triggers enabled', {\n rageClick: proactiveCfg?.rageClick !== false,\n longTask: proactiveCfg?.longTask !== false,\n apiCascade: proactiveCfg?.apiCascade !== false,\n errorBoundary: proactiveCfg?.errorBoundary === true,\n });\n }\n\n offlineQueue.startAutoSync(apiClient);\n offlineQueue.flush(apiClient).then((result) => {\n if (result.sent > 0) log.info('Synced offline reports', { sent: result.sent });\n });\n\n function applyRuntimeConfig(runtime: MushiRuntimeSdkConfig) {\n runtimeConfigLoaded = true;\n if (runtime.enabled === false) {\n activeConfig = bootstrapConfig;\n clearCachedRuntimeConfig(config.projectId);\n syncCaptureModules();\n widget.updateConfig(activeConfig.widget);\n log.debug('Runtime SDK config disabled; using bootstrap config', { version: runtime.version });\n return;\n }\n activeConfig = mergeRuntimeConfig(activeConfig, runtime);\n syncCaptureModules();\n if (runtime.widget) widget.updateConfig(activeConfig.widget);\n log.debug('Applied runtime SDK config', { version: runtime.version });\n }\n\n if (shouldUseRuntimeConfig(config)) {\n const cached = readCachedRuntimeConfig(config.projectId);\n if (cached) applyRuntimeConfig(cached);\n apiClient.getSdkConfig().then((result) => {\n if (result.ok && result.data) {\n cacheRuntimeConfig(config.projectId, result.data);\n applyRuntimeConfig(result.data);\n } else if (result.error) {\n log.debug('Runtime SDK config unavailable', result.error);\n }\n }).catch((err) => {\n log.debug('Runtime SDK config fetch failed', { error: err instanceof Error ? err.message : String(err) });\n });\n } else if (config.runtimeConfig !== false && isLocalhostEndpoint(resolveApiEndpoint(config))) {\n log.debug('Runtime SDK config skipped for localhost apiEndpoint; set runtimeConfig: true to force it');\n }\n\n void checkSdkFreshness();\n\n log.info('Initialized', { projectId: config.projectId });\n\n async function checkSdkFreshness(): Promise<void> {\n if (activeConfig.widget?.outdatedBanner === 'off') return;\n const cached = readCachedSdkVersion(MUSHI_SDK_PACKAGE);\n if (cached) applySdkFreshness(cached);\n const result = await apiClient.getLatestSdkVersion(MUSHI_SDK_PACKAGE);\n if (!result.ok || !result.data) return;\n cacheSdkVersion(MUSHI_SDK_PACKAGE, result.data);\n applySdkFreshness(result.data);\n }\n\n function applySdkFreshness(info: MushiSdkVersionInfo): void {\n const latest = info.latest;\n const outdated = Boolean(latest && isVersionOlder(MUSHI_SDK_VERSION, latest));\n if (!outdated && !info.deprecated) return;\n const message = info.deprecationMessage ?? (outdated ? `Update ${MUSHI_SDK_PACKAGE} to ${latest}.` : null);\n log.warn('Mushi SDK is outdated', {\n package: MUSHI_SDK_PACKAGE,\n current: MUSHI_SDK_VERSION,\n latest,\n deprecated: info.deprecated,\n message,\n });\n if (activeConfig.widget?.outdatedBanner !== 'console-only') {\n widget.setSdkFreshness({\n latest,\n current: MUSHI_SDK_VERSION,\n deprecated: info.deprecated,\n message,\n });\n }\n }\n\n async function submitReport(category: MushiReportCategory, description: string, intent?: string) {\n const filterResult = preFilter.check(description);\n if (!filterResult.passed) {\n log.info('Report blocked by pre-filter', { reason: filterResult.reason });\n return;\n }\n\n const wasm = config.preFilter?.wasmClassifier;\n if (wasm) {\n try {\n const verdict = await wasm.classify({\n description,\n category,\n url: typeof location !== 'undefined' ? location.href : undefined,\n hasScreenshot: pendingScreenshot !== null,\n hasSelectedElement: pendingElement !== null,\n hasNetworkErrors: networkCap?.getEntries()?.some((e) => e.status >= 400 || !!e.error) ?? false,\n hasConsoleErrors: consoleCap?.getEntries()?.some((e) => e.level === 'error') ?? false,\n proactiveTrigger: pendingProactiveTrigger ?? undefined,\n });\n if (verdict.verdict === 'block') {\n log.info('Report blocked by on-device classifier', {\n modelId: verdict.modelId,\n confidence: verdict.confidence,\n reason: verdict.reason,\n });\n return;\n }\n log.debug('On-device classifier verdict', { ...verdict });\n } catch (err) {\n log.warn('On-device classifier threw — falling through to server', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (!rateLimiter.tryConsume()) {\n log.warn('Report throttled — rate limit exceeded');\n return;\n }\n\n const scrubbedDescription = piiScrubber.scrub(preFilter.truncate(description));\n\n const sentryCtx = config.sentry ? captureSentryContext(config.sentry) : undefined;\n const fingerprintHash = await getDeviceFingerprintHash().catch(() => null);\n const consoleLogs = activeConfig.capture?.console === false ? undefined : consoleCap?.getEntries();\n const networkLogs = activeConfig.capture?.network === false ? undefined : networkCap?.getEntries();\n\n // Snapshot breadcrumbs *before* we add the lifecycle \"submitting\"\n // beat — we want the report's timeline to end with the user-action\n // event, not with our own bookkeeping. We then add the submit\n // breadcrumb so it shows up on the *next* report (typical pattern\n // in production: a user files two reports in close succession,\n // and the second carries a \"previous report submitted\" hint).\n const reportBreadcrumbs = scrubBreadcrumbsForWire(breadcrumbs.getAll());\n const stickyTagSnapshot = scrubTagsForWire(\n Object.keys(stickyTags).length > 0 ? { ...stickyTags } : undefined,\n );\n const sentryCtxScrubbed = sentryCtx\n ? {\n ...sentryCtx,\n ...(sentryCtx.breadcrumbs\n ? { breadcrumbs: scrubBreadcrumbsForWire(sentryCtx.breadcrumbs) }\n : {}),\n ...(sentryCtx.tags ? { tags: scrubTagsForWire(sentryCtx.tags) } : {}),\n }\n : undefined;\n\n const report: MushiReport = {\n id: crypto.randomUUID?.() ?? `mushi_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n projectId: config.projectId,\n category,\n description: scrubbedDescription,\n userIntent: intent,\n environment: captureEnvironment(),\n consoleLogs,\n networkLogs,\n performanceMetrics: activeConfig.capture?.performance === false ? undefined : perfCap?.getMetrics(),\n timeline: timelineCap.getEntries({ consoleLogs, networkLogs }),\n screenshotDataUrl: pendingScreenshot ?? undefined,\n selectedElement: pendingElement ?? undefined,\n metadata: {\n ...customMetadata,\n ...(userInfo ? { user: userInfo } : {}),\n ...(sentryCtx?.release ? { sentryRelease: sentryCtx.release } : {}),\n },\n sessionId: getSessionId(),\n reporterToken: getReporterToken(),\n ...(fingerprintHash ? { fingerprintHash } : {}),\n appVersion: config.integrations?.vercel?.analyticsId,\n sdkPackage: MUSHI_SDK_PACKAGE,\n sdkVersion: MUSHI_SDK_VERSION,\n proactiveTrigger: pendingProactiveTrigger ?? undefined,\n // Top-level Sentry-grade observability fields. Breadcrumbs are\n // surfaced separately from `consoleLogs` because they're the\n // higher-signal \"what just happened\" trail (vs. the high-volume\n // raw console mirror), and the admin /reports drawer shows them\n // in different panes.\n ...(reportBreadcrumbs.length > 0 ? { breadcrumbs: reportBreadcrumbs } : {}),\n ...(stickyTagSnapshot ? { tags: stickyTagSnapshot } : {}),\n ...(sentryCtxScrubbed ? { sentryContext: sentryCtxScrubbed } : {}),\n sentryEventId: sentryCtx?.eventId,\n sentryReplayId: sentryCtx?.replayId,\n createdAt: new Date().toISOString(),\n };\n\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: `Mushi report submitting (${category})`,\n data: { reportId: report.id, category },\n });\n\n if (config.integrations?.custom) {\n const builder = {\n addMetadata(key: string, value: unknown) {\n (report.metadata as Record<string, unknown>)[key] = value;\n },\n setCategory(cat: MushiReportCategory) {\n report.category = cat;\n },\n setDescription(desc: string) {\n report.description = desc;\n },\n };\n config.integrations.custom(builder);\n }\n\n emit('report:submitted', { reportId: report.id });\n\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n await offlineQueue.enqueue(report);\n log.info('Offline — report queued', { reportId: report.id });\n emit('report:queued', { reportId: report.id });\n return;\n }\n\n const result = await apiClient.submitReport(report);\n if (result.ok) {\n log.info('Report sent', { reportId: result.data?.reportId });\n emit('report:sent', { reportId: result.data?.reportId });\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: `Mushi report sent (${result.data?.reportId ?? report.id})`,\n });\n // Award points for the report submission. This is client-side so\n // the activity batch is flushed on the next tick with the correct\n // user_id already set via identify(). The server awards 50 pts by\n // default (configurable via the rewards rules dashboard).\n enqueueActivity({\n action: 'report_submit',\n metadata: { category, reportId: result.data?.reportId ?? report.id },\n });\n // Bidirectional Sentry linkage. After a successful submit we tag\n // Sentry's current scope so any subsequent Sentry events show\n // the Mushi correlation (`mushi.report_id` tag) and the issue\n // page picks up a `mushi_report` context block. Wrapped in\n // `try/catch` because Sentry's globals can be in a half-bootstrap\n // state immediately after page load.\n try {\n if (config.sentry && result.data?.reportId) {\n tagSentryScope(result.data.reportId);\n }\n } catch {\n // Swallow — never break a successful submit because Sentry's\n // scope API moved between point releases.\n }\n } else {\n log.warn('Report failed, queuing for retry', { reportId: report.id, error: result.error });\n await offlineQueue.enqueue(report);\n emit('report:failed', { reportId: report.id, error: result.error });\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'warning',\n message: `Mushi report queued for retry (${report.id})`,\n });\n }\n\n pendingScreenshot = null;\n pendingElement = null;\n pendingProactiveTrigger = null;\n }\n\n const sdk: MushiSDKInstance = {\n report(options) {\n widget.open(options);\n },\n\n on(event: MushiEventType, handler: MushiEventHandler) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(handler);\n return () => listeners.get(event)?.delete(handler);\n },\n\n setUser(user) {\n userInfo = user;\n },\n\n setMetadata(key, value) {\n customMetadata[key] = value;\n },\n\n setScreen(screen) {\n timelineCap.setScreen(screen);\n },\n\n isOpen() {\n return widget.getIsOpen();\n },\n\n open() {\n widget.open();\n },\n\n openWith(category) {\n widget.open({ category });\n },\n\n show() {\n widget.showTrigger();\n },\n\n hide() {\n widget.hideTrigger();\n },\n\n attachTo(selectorOrElement, options) {\n return widget.attachTo(selectorOrElement, options);\n },\n\n setTrigger(trigger) {\n widget.setTrigger(trigger);\n },\n\n close() {\n widget.close();\n },\n\n updateConfig(runtimeConfig) {\n applyRuntimeConfig(runtimeConfig);\n },\n\n diagnose() {\n return runDiagnostics({\n apiEndpoint: resolveApiEndpoint(activeConfig),\n widgetMounted: widget.getIsMounted(),\n runtimeConfigLoaded,\n captureScreenshotAvailable: screenshotCap !== null,\n captureNetworkIntercepting: networkCap !== null,\n });\n },\n\n destroy() {\n proactiveTriggers?.destroy();\n proactiveManager?.reset();\n widget.destroy();\n consoleCap?.destroy();\n networkCap?.destroy();\n perfCap?.destroy();\n elementSelector?.deactivate();\n timelineCap.destroy();\n discoveryCap?.destroy();\n discoveryCap = null;\n offlineQueue.stopAutoSync();\n detachAutoBreadcrumbs?.();\n detachAutoBreadcrumbs = null;\n breadcrumbs.clear();\n listeners.clear();\n instance = null;\n log.debug('Destroyed');\n },\n\n // Wave G4 — unified `captureEvent` API for programmatic/adapter-driven\n // reports. Skips the widget, runs the same PII scrub + rate limit +\n // offline-queue path as `submit()`, and returns the server report id.\n async captureEvent(input) {\n if (!rateLimiter.tryConsume()) {\n log.warn('captureEvent throttled — rate limit exceeded');\n return null;\n }\n const description = piiScrubber.scrub(preFilter.truncate(input.description));\n const category = input.category ?? 'bug';\n const sentryCtx = config.sentry ? captureSentryContext(config.sentry) : undefined;\n const captureBreadcrumbs = scrubBreadcrumbsForWire(breadcrumbs.getAll());\n // Sticky tags merge with per-call `input.tags` — call-site wins\n // when both supply the same key. Keeps adapters that already\n // pass per-event tags compatible while letting hosts set\n // app-wide defaults via `setTag()`. We then run the same\n // PII scrubber over string values so secrets a host accidentally\n // shoved into a tag (e.g. `Mushi.setTag('email', user.email)`)\n // never hit the wire.\n const mergedTags = scrubTagsForWire(\n Object.keys(stickyTags).length === 0 && !input.tags\n ? undefined\n : { ...stickyTags, ...(input.tags ?? {}) },\n );\n const sentryCtxScrubbed = sentryCtx\n ? {\n ...sentryCtx,\n ...(sentryCtx.breadcrumbs\n ? { breadcrumbs: scrubBreadcrumbsForWire(sentryCtx.breadcrumbs) }\n : {}),\n ...(sentryCtx.tags ? { tags: scrubTagsForWire(sentryCtx.tags) } : {}),\n }\n : undefined;\n const report: MushiReport = {\n id: crypto.randomUUID?.() ?? `mushi_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n projectId: config.projectId,\n category,\n description,\n environment: captureEnvironment(),\n timeline: timelineCap.getEntries(),\n metadata: {\n ...(input.metadata ?? {}),\n ...(userInfo ? { user: userInfo } : {}),\n ...(input.error ? { error: input.error } : {}),\n ...(input.severity ? { severity: input.severity } : {}),\n ...(input.component ? { component: input.component } : {}),\n ...(input.source ? { source: input.source } : { source: 'captureEvent' }),\n },\n ...(captureBreadcrumbs.length > 0 ? { breadcrumbs: captureBreadcrumbs } : {}),\n ...(mergedTags && Object.keys(mergedTags).length > 0 ? { tags: mergedTags } : {}),\n ...(sentryCtxScrubbed ? { sentryContext: sentryCtxScrubbed } : {}),\n sessionId: getSessionId(),\n reporterToken: getReporterToken(),\n sdkPackage: MUSHI_SDK_PACKAGE,\n sdkVersion: MUSHI_SDK_VERSION,\n sentryEventId: sentryCtx?.eventId,\n sentryReplayId: sentryCtx?.replayId,\n createdAt: new Date().toISOString(),\n };\n emit('report:submitted', { reportId: report.id });\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n await offlineQueue.enqueue(report);\n emit('report:queued', { reportId: report.id });\n return null;\n }\n const res = await apiClient.submitReport(report);\n if (res.ok) {\n emit('report:sent', { reportId: res.data?.reportId });\n try {\n if (config.sentry && res.data?.reportId) tagSentryScope(res.data.reportId);\n } catch {\n // Swallow.\n }\n return res.data?.reportId ?? null;\n }\n await offlineQueue.enqueue(report);\n emit('report:failed', { reportId: report.id, error: res.error });\n return null;\n },\n\n async captureException(error, options) {\n const normalised = normaliseThrown(error);\n // Drop a breadcrumb at the call site so this exception shows up\n // in Mushi's own timeline even if the report itself is rate-limited\n // or rejected by the pre-filter — losing the report shouldn't lose\n // the trace.\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'error',\n message: `Mushi.captureException(${normalised.name}): ${normalised.message}`,\n ...(normalised.stack ? { data: { stack: normalised.stack.slice(0, 500) } } : {}),\n });\n const description =\n options?.description?.trim() ||\n `${normalised.name}: ${normalised.message}` ||\n 'Uncaught exception';\n return sdk.captureEvent({\n description,\n category: options?.category ?? 'bug',\n severity: options?.severity ?? 'high',\n ...(options?.component ? { component: options.component } : {}),\n ...(options?.tags ? { tags: options.tags } : {}),\n source: options?.source ?? 'captureException',\n error: {\n name: normalised.name,\n message: normalised.message,\n ...(normalised.stack ? { stack: normalised.stack } : {}),\n },\n metadata: {\n ...(options?.metadata ?? {}),\n ...(normalised.cause ? { cause: normalised.cause } : {}),\n },\n });\n },\n\n identify(userId, traits) {\n userInfo = { id: userId, ...(traits?.email ? { email: traits.email } : {}), ...(traits?.name ? { name: traits.name } : {}) };\n if (traits) {\n for (const [k, v] of Object.entries(traits)) {\n if (k !== 'email' && k !== 'name') customMetadata[`user.${k}`] = v;\n }\n }\n breadcrumbs.add({\n category: 'lifecycle',\n level: 'info',\n message: `Mushi.identify(${userId})`,\n });\n\n // Wire rewards program when enabled\n if (activeConfig.rewards?.enabled) {\n const rewardsCtx: RewardsContext = {\n client: apiClient,\n config: activeConfig.rewards,\n projectId: bootstrapConfig.projectId,\n userId,\n traits: traits\n ? { email: traits.email as string | undefined, name: traits.name as string | undefined, provider: traits.provider as string | undefined }\n : undefined,\n };\n if (userInfo.id === userId) {\n // First identify → full init\n initRewards(rewardsCtx);\n } else {\n // Already initialized; just update user context\n updateRewardsUser(userId, rewardsCtx.traits);\n }\n\n // Fetch reputation to hydrate the in-widget rewards nudge and success\n // points display. Fire-and-forget: never blocks the identify call.\n if (activeConfig.rewards.showInWidget !== false) {\n void apiClient.getMyPoints(userId).then((res) => {\n if (!res.ok) return;\n const d = res.data as {\n total_points?: number;\n tier?: { slug?: string; display_name?: string; points_threshold?: number } | null;\n next_tier?: { display_name?: string; points_threshold?: number } | null;\n report_submit_pts?: number;\n };\n widget.setRewardsState({\n tier: d.tier\n ? { slug: d.tier.slug ?? 'free', displayName: d.tier.display_name ?? 'Free', pointsThreshold: d.tier.points_threshold ?? 0 }\n : null,\n nextTier: d.next_tier\n ? { displayName: d.next_tier.display_name ?? '', pointsThreshold: d.next_tier.points_threshold ?? 0 }\n : null,\n totalPoints: d.total_points ?? 0,\n pointsForReport: d.report_submit_pts ?? 50,\n });\n }).catch(() => { /* non-fatal */ });\n }\n }\n },\n\n addBreadcrumb(crumb) {\n breadcrumbs.add(crumb);\n },\n\n getBreadcrumbs() {\n return breadcrumbs.getAll();\n },\n\n setTag(key, value) {\n if (typeof key !== 'string' || key.length === 0) return;\n stickyTags[key] = value;\n },\n\n setTags(tags) {\n if (!tags || typeof tags !== 'object') return;\n for (const [k, v] of Object.entries(tags)) {\n if (typeof k === 'string' && k.length > 0) {\n stickyTags[k] = v;\n }\n }\n },\n\n clearTag(key) {\n if (typeof key === 'string' && key.length > 0) {\n delete stickyTags[key];\n return;\n }\n // No-arg variant: clear every sticky tag (used in test teardown\n // and on app-level \"logout\" handlers).\n for (const k of Object.keys(stickyTags)) delete stickyTags[k];\n },\n\n // ─── Rewards program (P1) ──────────────────────────────────\n\n async getReputation() {\n if (!userInfo?.id) return null;\n const res = await apiClient.getMyPoints(userInfo.id);\n if (!res.ok) return null;\n return {\n totalPoints: (res.data as { total_points: number }).total_points ?? 0,\n points30d: (res.data as { points_30d: number }).points_30d ?? 0,\n reputation: 1.0,\n confirmedBugs: 0,\n totalReports: 0,\n };\n },\n\n async getTier() {\n if (!userInfo?.id) return null;\n return getRewardsTier(userInfo.id);\n },\n\n recordActivity(action, metadata) {\n if (!activeConfig.rewards?.enabled) return;\n enqueueActivity({ action, metadata });\n },\n };\n\n if (typeof globalThis !== 'undefined' && (bootstrapConfig.debug ?? false)) {\n exposeMarketingRecorder(widget);\n }\n\n return sdk;\n}\n\nfunction mergeRuntimeConfig(config: MushiConfig, runtime: MushiRuntimeSdkConfig): MushiConfig {\n const nativeTrigger = runtime.native?.triggerMode;\n const widgetTrigger = runtime.widget?.trigger\n ?? (nativeTrigger === 'none' || nativeTrigger === 'shake' ? 'manual' : undefined);\n return {\n ...config,\n widget: {\n ...config.widget,\n ...runtime.widget,\n ...(widgetTrigger ? { trigger: widgetTrigger } : {}),\n // betaMode is local-only: set by the host app, not the dashboard.\n // Restore it after the runtime spread so it is never silently cleared.\n ...(config.widget?.betaMode ? { betaMode: config.widget.betaMode } : {}),\n },\n capture: {\n ...config.capture,\n ...runtime.capture,\n },\n privacy: {\n ...config.privacy,\n },\n };\n}\n\nfunction applyPresetConfig(config: MushiConfig): MushiConfig {\n if (!config.preset) return config;\n const preset = presetDefaults(config.preset);\n return {\n ...config,\n widget: {\n ...preset.widget,\n ...config.widget,\n },\n capture: {\n ...preset.capture,\n ...config.capture,\n },\n proactive: {\n ...preset.proactive,\n ...config.proactive,\n cooldown: {\n ...preset.proactive?.cooldown,\n ...config.proactive?.cooldown,\n },\n },\n };\n}\n\nfunction presetDefaults(preset: NonNullable<MushiConfig['preset']>): Pick<MushiConfig, 'widget' | 'capture' | 'proactive'> {\n switch (preset) {\n case 'manual-only':\n return {\n widget: { trigger: 'manual', outdatedBanner: 'console-only' },\n capture: { console: true, network: true, performance: false, screenshot: 'on-report', elementSelector: false },\n proactive: { rageClick: false, longTask: false, apiCascade: false, errorBoundary: false },\n };\n case 'beta-loud':\n return {\n widget: { trigger: 'auto', outdatedBanner: 'banner' },\n capture: { console: true, network: true, performance: true, screenshot: 'auto', elementSelector: true },\n proactive: { rageClick: true, longTask: true, apiCascade: true, errorBoundary: true },\n };\n case 'internal-debug':\n return {\n widget: { trigger: 'auto', outdatedBanner: 'banner', brandFooter: true },\n capture: { console: true, network: true, performance: true, screenshot: 'auto', elementSelector: true },\n proactive: {\n rageClick: true,\n longTask: true,\n apiCascade: true,\n errorBoundary: true,\n cooldown: { maxProactivePerSession: 10, dismissCooldownHours: 0, suppressAfterDismissals: 99 },\n },\n };\n case 'production-calm':\n return {\n widget: { trigger: 'auto', outdatedBanner: 'console-only' },\n capture: { console: true, network: true, performance: false, screenshot: 'on-report', elementSelector: false },\n proactive: { rageClick: false, longTask: false, apiCascade: false, errorBoundary: false },\n };\n }\n}\n\nfunction resolveApiEndpoint(config: Pick<MushiConfig, 'apiEndpoint'>): string {\n return config.apiEndpoint ?? DEFAULT_API_ENDPOINT;\n}\n\nfunction shouldUseRuntimeConfig(config: MushiConfig): boolean {\n if (config.runtimeConfig === false) return false;\n if (config.runtimeConfig === true) return true;\n return !isLocalhostEndpoint(resolveApiEndpoint(config));\n}\n\nasync function runDiagnostics(options: {\n apiEndpoint: string;\n widgetMounted: boolean;\n runtimeConfigLoaded: boolean;\n captureScreenshotAvailable: boolean;\n captureNetworkIntercepting: boolean;\n}): Promise<MushiDiagnosticsResult> {\n const endpoint = await probeApiEndpoint(options.apiEndpoint);\n return {\n apiEndpointReachable: endpoint.reachable,\n cspAllowsEndpoint: endpoint.cspAllowed,\n widgetMounted: options.widgetMounted,\n shadowDomAvailable: typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.attachShadow === 'function',\n dialogSupported: typeof HTMLDialogElement !== 'undefined',\n runtimeConfigLoaded: options.runtimeConfigLoaded,\n captureScreenshotAvailable: options.captureScreenshotAvailable,\n captureNetworkIntercepting: options.captureNetworkIntercepting,\n sdkVersion: MUSHI_SDK_VERSION,\n };\n}\n\nasync function diagnoseWithoutInstance(): Promise<MushiDiagnosticsResult> {\n return {\n apiEndpointReachable: false,\n cspAllowsEndpoint: false,\n widgetMounted: false,\n shadowDomAvailable: typeof HTMLElement !== 'undefined' && typeof HTMLElement.prototype.attachShadow === 'function',\n dialogSupported: typeof HTMLDialogElement !== 'undefined',\n runtimeConfigLoaded: false,\n captureScreenshotAvailable: false,\n captureNetworkIntercepting: false,\n sdkVersion: MUSHI_SDK_VERSION,\n };\n}\n\nasync function probeApiEndpoint(apiEndpoint: string): Promise<{ reachable: boolean; cspAllowed: boolean }> {\n if (typeof fetch === 'undefined') return { reachable: false, cspAllowed: false };\n const controller = typeof AbortController !== 'undefined' ? new AbortController() : null;\n const timer = controller ? setTimeout(() => controller.abort(), 3_000) : null;\n try {\n const response = await fetch(`${apiEndpoint.replace(/\\/$/, '')}/health`, {\n method: 'GET',\n cache: 'no-store',\n ...(controller ? { signal: controller.signal } : {}),\n [MUSHI_INTERNAL_INIT_MARKER]: 'diagnose',\n } as RequestInit & { [MUSHI_INTERNAL_INIT_MARKER]?: 'diagnose' });\n return { reachable: response.ok, cspAllowed: true };\n } catch {\n return { reachable: false, cspAllowed: false };\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nfunction runtimeConfigCacheKey(projectId: string): string {\n return `mushi:sdk-config:${projectId}`;\n}\n\nfunction sdkVersionCacheKey(packageName: string): string {\n return `mushi:sdk-version:${packageName}`;\n}\n\nfunction readCachedRuntimeConfig(projectId: string): MushiRuntimeSdkConfig | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(runtimeConfigCacheKey(projectId));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { config?: MushiRuntimeSdkConfig };\n return parsed.config ?? null;\n } catch {\n return null;\n }\n}\n\nfunction cacheRuntimeConfig(projectId: string, config: MushiRuntimeSdkConfig): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(runtimeConfigCacheKey(projectId), JSON.stringify({\n cachedAt: Date.now(),\n config,\n }));\n } catch {\n // Storage can be unavailable in private/restricted contexts.\n }\n}\n\nfunction clearCachedRuntimeConfig(projectId: string): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.removeItem(runtimeConfigCacheKey(projectId));\n } catch {\n // Storage can be unavailable in private/restricted contexts.\n }\n}\n\nfunction readCachedSdkVersion(packageName: string): MushiSdkVersionInfo | null {\n if (typeof localStorage === 'undefined') return null;\n try {\n const raw = localStorage.getItem(sdkVersionCacheKey(packageName));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { cachedAt?: number; data?: MushiSdkVersionInfo };\n if (!parsed.data || !parsed.cachedAt || Date.now() - parsed.cachedAt > 86_400_000) return null;\n return parsed.data;\n } catch {\n return null;\n }\n}\n\nfunction cacheSdkVersion(packageName: string, data: MushiSdkVersionInfo): void {\n if (typeof localStorage === 'undefined') return;\n try {\n localStorage.setItem(sdkVersionCacheKey(packageName), JSON.stringify({\n cachedAt: Date.now(),\n data,\n }));\n } catch {\n // Storage can be unavailable in private/restricted contexts.\n }\n}\n\nfunction isVersionOlder(current: string, latest: string): boolean {\n const currentParts = parseVersion(current);\n const latestParts = parseVersion(latest);\n for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n const cur = currentParts[i] ?? 0;\n const next = latestParts[i] ?? 0;\n if (cur < next) return true;\n if (cur > next) return false;\n }\n return false;\n}\n\nfunction parseVersion(version: string): number[] {\n return version\n .split(/[.-]/)\n .map((part) => Number.parseInt(part, 10))\n .filter((part) => Number.isFinite(part));\n}\n\nfunction createNoopInstance(): MushiSDKInstance {\n return {\n report: () => {},\n on: () => () => {},\n setUser: () => {},\n setMetadata: () => {},\n setScreen: () => {},\n isOpen: () => false,\n open: () => {},\n close: () => {},\n updateConfig: () => {},\n diagnose: diagnoseWithoutInstance,\n openWith: () => {},\n show: () => {},\n hide: () => {},\n attachTo: () => () => {},\n setTrigger: () => {},\n destroy: () => {\n instance = null;\n },\n captureEvent: async () => null,\n captureException: async () => null,\n identify: () => {},\n addBreadcrumb: () => {},\n getBreadcrumbs: () => [],\n setTag: () => {},\n setTags: () => {},\n clearTag: () => {},\n getReputation: async () => null,\n getTier: async () => null,\n recordActivity: () => {},\n };\n}\n\n/**\n * Auto-breadcrumb installer — attaches passive listeners that turn\n * common host-app signals into Mushi breadcrumbs without the host\n * lifting a finger.\n *\n * - Route changes via `popstate` and the `history.pushState` /\n * `replaceState` patches that single-page apps already trigger.\n * - `console.error` and `console.warn` callsites — distinct from\n * the existing `console-capture` (which mirrors the *content* of\n * console for the report's `consoleLogs` array; breadcrumbs\n * capture only that an error happened, what file/line, and one\n * short message).\n * - `[data-testid]` clicks anywhere on the page — testids are the\n * same identifiers the v2 inventory + Triage LLM grounds against,\n * so a breadcrumb of `clicked checkout-submit` is dramatically\n * more useful for triage than `clicked button.btn-primary`.\n *\n * Returns a teardown closure that detaches every listener. We keep\n * the closure in scope of `createInstance` so `Mushi.destroy()` can\n * call it before re-init — without this, dev-mode HMR would tail a\n * fresh listener stack on every reload.\n */\nfunction installAutoBreadcrumbs(buffer: BreadcrumbBuffer): () => void {\n if (typeof window === 'undefined') return () => {};\n const cleanups: Array<() => void> = [];\n\n // 1) Route changes — covers SSR-hydrated SPAs (Next, Remix, SvelteKit)\n // and old-school history-pushed apps. We patch the prototype methods\n // because most SPA frameworks call them directly instead of dispatching\n // an event the host could subscribe to.\n try {\n const dispatchRouteChange = (kind: 'pushState' | 'replaceState' | 'popstate') => {\n buffer.add({\n category: 'navigation',\n level: 'info',\n message: `${kind}: ${window.location.pathname}`,\n data: { url: window.location.href, kind },\n });\n };\n const onPop = () => dispatchRouteChange('popstate');\n window.addEventListener('popstate', onPop, { passive: true });\n cleanups.push(() => window.removeEventListener('popstate', onPop));\n\n const origPush = window.history.pushState;\n const origReplace = window.history.replaceState;\n window.history.pushState = function patched(...args: Parameters<History['pushState']>) {\n const ret = origPush.apply(this, args);\n try {\n dispatchRouteChange('pushState');\n } catch {\n // Swallow — never break navigation because the breadcrumb buffer\n // mis-stringified an URL.\n }\n return ret;\n };\n window.history.replaceState = function patched(...args: Parameters<History['replaceState']>) {\n const ret = origReplace.apply(this, args);\n try {\n dispatchRouteChange('replaceState');\n } catch {\n // Swallow.\n }\n return ret;\n };\n cleanups.push(() => {\n window.history.pushState = origPush;\n window.history.replaceState = origReplace;\n });\n } catch {\n // History API unavailable (some sandboxed iframes) — skip silently.\n }\n\n // 2) `console.error` and `console.warn` — wrap *only* these two so\n // we don't add overhead to `console.log` on the hot path. The\n // `console-capture` module already mirrors content; this layer\n // adds a \"something went wrong\" beat to the breadcrumb timeline.\n try {\n const origError = console.error;\n const origWarn = console.warn;\n console.error = function (...args: unknown[]) {\n try {\n buffer.add({\n category: 'console',\n level: 'error',\n message: args.map(stringifyConsoleArg).join(' '),\n });\n } catch {\n // Swallow.\n }\n return origError.apply(this, args as Parameters<typeof origError>);\n };\n console.warn = function (...args: unknown[]) {\n try {\n buffer.add({\n category: 'console',\n level: 'warning',\n message: args.map(stringifyConsoleArg).join(' '),\n });\n } catch {\n // Swallow.\n }\n return origWarn.apply(this, args as Parameters<typeof origWarn>);\n };\n cleanups.push(() => {\n console.error = origError;\n console.warn = origWarn;\n });\n } catch {\n // Console patching can fail in locked-down environments — non-fatal.\n }\n\n // 3) `[data-testid]` clicks — capture the testid, the tag name, and\n // the visible text (capped) so a breadcrumb of \"clicked submit-cta\n // — Buy now\" tells the triage path what the user just touched\n // without leaking arbitrary innerHTML.\n try {\n const onClick = (ev: MouseEvent) => {\n try {\n const target = ev.target;\n if (!(target instanceof Element)) return;\n let cur: Element | null = target;\n let hops = 0;\n while (cur && hops < 10) {\n const tid = cur.getAttribute('data-testid');\n if (tid) {\n const text = (cur.textContent ?? '').trim().slice(0, 80);\n buffer.add({\n category: 'ui.click',\n level: 'info',\n message: `clicked ${tid}${text ? ` — ${text}` : ''}`,\n data: { testid: tid, tag: cur.tagName.toLowerCase() },\n });\n return;\n }\n cur = cur.parentElement;\n hops++;\n }\n } catch {\n // Swallow — listener errors must never propagate.\n }\n };\n document.addEventListener('click', onClick, { passive: true, capture: true });\n cleanups.push(() => document.removeEventListener('click', onClick, true));\n } catch {\n // Swallow.\n }\n\n return () => {\n for (const c of cleanups) {\n try {\n c();\n } catch {\n // Swallow.\n }\n }\n };\n}\n\n/**\n * Coerce arbitrary console arguments to a short string for breadcrumb\n * messages. Errors get their `name + message`; objects get JSON-encoded\n * with a 200-char cap; everything else is `String(...)` truncated to\n * 200 chars. We never invoke a `toString` that throws — failures fall\n * back to the type label.\n */\nfunction stringifyConsoleArg(arg: unknown): string {\n try {\n if (arg instanceof Error) {\n return `${arg.name}: ${arg.message}`;\n }\n if (typeof arg === 'object' && arg !== null) {\n const json = JSON.stringify(arg);\n return json.length > 200 ? `${json.slice(0, 200)}…` : json;\n }\n const s = String(arg);\n return s.length > 200 ? `${s.slice(0, 200)}…` : s;\n } catch {\n return `[${typeof arg}]`;\n }\n}\n"]}