@bugport.dev/widget 0.1.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/LICENSE +21 -0
- package/README.md +133 -0
- package/dist/index.cjs +7295 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +576 -0
- package/dist/index.d.ts +576 -0
- package/dist/index.js +7211 -0
- package/dist/index.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/components/page-toolbar-css/index.tsx","../src/components/annotation-popup-css/index.tsx","../src/components/annotation-popup-css/styles.module.scss","../src/components/icon-transitions.module.scss","../src/components/icons.tsx","../src/utils/freeze-animations.ts","../src/utils/element-identification.ts","../src/utils/storage.ts","../src/utils/react-detection.ts","../src/utils/source-location.ts","../src/utils/screenshot.ts","../src/utils/generate-output.ts","../src/diagnostics/payload.ts","../src/components/page-toolbar-css/styles.module.scss","../src/components/page-toolbar-css/annotation-marker/styles.module.scss","../src/components/page-toolbar-css/annotation-marker/index.tsx","../src/components/page-toolbar-css/settings-panel/checkbox-field/index.tsx","../src/components/checkbox/styles.module.scss","../src/components/checkbox/index.tsx","../src/components/tooltip/index.tsx","../src/components/help-tooltip/styles.module.scss","../src/components/help-tooltip/index.tsx","../src/components/page-toolbar-css/settings-panel/checkbox-field/styles.module.scss","../src/components/page-toolbar-css/settings-panel/styles.module.scss","../src/components/page-toolbar-css/settings-panel/index.tsx","../src/components/page-toolbar-css/constants.ts","../src/components/page-toolbar-css/dom-helpers.ts","../src/bugport-api.ts","../src/diagnostics/config.ts","../src/diagnostics/redaction.ts","../src/diagnostics/serialize.ts","../src/diagnostics/collector.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\n\nimport {\n PageFeedbackToolbarCSS,\n type BugportSubmissionPayload,\n type PageFeedbackToolbarCSSProps,\n} from \"./components/page-toolbar-css\";\nimport {\n resolveWidgetProjectKey,\n submitBugPortWidget,\n type BugPortSubmissionResult,\n type WidgetReporter,\n} from \"./bugport-api\";\nimport { DiagnosticsCollector } from \"./diagnostics/collector\";\nimport { normalizeDiagnosticsConfig } from \"./diagnostics/config\";\nimport type {\n BugPortDiagnosticsConfig,\n ResolvedDiagnosticsConfig,\n} from \"./diagnostics/types\";\n\n/**\n * Stable signature of the *instrumentation-affecting* parts of the resolved\n * config. Used as the collector effect's dependency so a parent re-render that\n * passes a fresh `diagnostics` object literal doesn't needlessly re-instrument\n * the page. RegExp/function fields are excluded (they can't be compared cheaply\n * and don't change which globals are wrapped).\n */\nfunction diagnosticsSignature(config: ResolvedDiagnosticsConfig): string {\n return JSON.stringify({\n enabled: config.enabled,\n console: config.console,\n runtimeErrors: config.runtimeErrors,\n fetch: config.fetch,\n xhr: config.xhr,\n requestBodies: config.requestBodies,\n responseBodies: config.responseBodies,\n maxConsoleEvents: config.maxConsoleEvents,\n maxNetworkEvents: config.maxNetworkEvents,\n maxRuntimeErrorEvents: config.maxRuntimeErrorEvents,\n maxBodySizeBytes: config.maxBodySizeBytes,\n allowedUrls: config.allowedUrls.length,\n deniedUrls: config.deniedUrls.length,\n redactHeaders: config.redactHeaders,\n });\n}\n\nexport type {\n DemoAnnotation,\n BugportWidgetProps,\n BugportSubmissionPayload,\n BugportSubmissionScreenshot,\n PageFeedbackToolbarCSSProps,\n} from \"./components/page-toolbar-css\";\nexport { PageFeedbackToolbarCSS } from \"./components/page-toolbar-css\";\n\nexport type BugPortWidgetProps = Omit<\n PageFeedbackToolbarCSSProps,\n \"onSubmitPayload\" | \"diagnosticsConfig\" | \"diagnosticsCollector\"\n> & {\n projectKey?: string;\n publicKey?: string;\n environment?: string;\n apiBaseUrl?: string;\n user?: WidgetReporter;\n /** Optional in-page diagnostics capture configuration. */\n diagnostics?: BugPortDiagnosticsConfig;\n onSubmitted?: (result: BugPortSubmissionResult) => void;\n onError?: (error: Error) => void;\n onSubmitPayload?: (\n payload: BugportSubmissionPayload,\n ) => void | boolean | Promise<void | boolean>;\n};\n\nexport function BugPortWidget({\n projectKey,\n publicKey,\n environment,\n apiBaseUrl,\n user,\n diagnostics,\n onSubmitted,\n onError,\n onSubmitPayload,\n ...props\n}: BugPortWidgetProps) {\n const resolvedProjectKey = resolveWidgetProjectKey(projectKey, publicKey);\n\n // Resolve the diagnostics config and manage the collector's lifecycle. The\n // collector is created and instrumentation installed on mount, and fully\n // uninstalled on unmount so no globals stay patched after the widget leaves.\n const diagnosticsConfig = useMemo(\n () => normalizeDiagnosticsConfig(diagnostics),\n [diagnostics],\n );\n const configSignature = useMemo(\n () => diagnosticsSignature(diagnosticsConfig),\n [diagnosticsConfig],\n );\n const [collector, setCollector] = useState<DiagnosticsCollector | null>(null);\n\n useEffect(() => {\n if (!diagnosticsConfig.enabled) {\n setCollector(null);\n return;\n }\n const instance = new DiagnosticsCollector(diagnosticsConfig);\n instance.install();\n setCollector(instance);\n return () => {\n instance.uninstall();\n setCollector(null);\n };\n // Depend only on `configSignature`: it captures every\n // instrumentation-affecting field, so a parent re-render passing a fresh\n // `diagnostics` object literal won't needlessly re-instrument the page.\n // Non-structural fields (custom redaction patterns, hooks) are read at the\n // next (re)install — an intentional trade-off to keep instrumentation stable.\n }, [configSignature]);\n\n const handleSubmitPayload = useCallback(\n async (payload: BugportSubmissionPayload) => {\n if (resolvedProjectKey) {\n try {\n const result = await submitBugPortWidget({\n apiBaseUrl,\n projectKey: resolvedProjectKey,\n environment,\n payload,\n user,\n });\n onSubmitted?.(result);\n if (onSubmitPayload) {\n await onSubmitPayload(payload);\n }\n return true;\n } catch (error) {\n const normalized = error instanceof Error ? error : new Error(\"Widget submission failed.\");\n onError?.(normalized);\n throw normalized;\n }\n }\n\n if (!onSubmitPayload) {\n return false;\n }\n\n return await onSubmitPayload(payload);\n },\n [apiBaseUrl, environment, onError, onSubmitted, onSubmitPayload, resolvedProjectKey, user],\n );\n\n return (\n <PageFeedbackToolbarCSS\n {...props}\n projectKey={resolvedProjectKey ?? undefined}\n publicKey={resolvedProjectKey ?? undefined}\n onSubmitPayload={handleSubmitPayload}\n diagnosticsConfig={diagnosticsConfig}\n diagnosticsCollector={collector}\n />\n );\n}\n\nexport const BugportWidget = BugPortWidget;\n\nexport type BugPortWidgetHandle = {\n destroy: () => void;\n};\n\nexport function initBugPortWidget(props: BugPortWidgetProps & { target?: HTMLElement }): BugPortWidgetHandle {\n const target = props.target ?? document.createElement(\"div\");\n if (!props.target) {\n document.body.appendChild(target);\n }\n const root: Root = createRoot(target);\n root.render(<BugPortWidget {...props} />);\n return {\n destroy() {\n root.unmount();\n if (!props.target) {\n target.remove();\n }\n },\n };\n}\n\ndeclare global {\n interface Window {\n BugPort?: {\n init: typeof initBugPortWidget;\n };\n }\n}\n\nif (typeof window !== \"undefined\") {\n window.BugPort = window.BugPort ?? { init: initBugPortWidget };\n}\n\nexport { AnnotationPopupCSS } from \"./components/annotation-popup-css\";\nexport type {\n AnnotationPopupCSSProps,\n AnnotationPopupCSSHandle,\n} from \"./components/annotation-popup-css\";\n\nexport * from \"./components/icons\";\n\nexport {\n identifyElement,\n identifyAnimationElement,\n getElementPath,\n getNearbyText,\n getElementClasses,\n isInShadowDOM,\n getShadowHost,\n closestCrossingShadow,\n} from \"./utils/element-identification\";\n\nexport {\n loadAnnotations,\n saveAnnotations,\n getStorageKey,\n} from \"./utils/storage\";\n\nexport type { Annotation } from \"./types\";\nexport type { WidgetReporter, BugPortSubmissionResult };\n\n// --- Diagnostics (optional in-page capture) --------------------------------\nexport {\n DiagnosticsCollector,\n normalizeDiagnosticsConfig,\n createRedactor,\n redactString,\n redactHeaders,\n redactUrl,\n redactBody,\n buildDiagnosticsPayload,\n DEFAULT_REDACT_HEADERS,\n DEFAULT_REDACT_PATTERNS,\n} from \"./diagnostics\";\nexport type {\n BugPortDiagnosticsConfig,\n ResolvedDiagnosticsConfig,\n BugPortDiagnosticEvent,\n BugPortConsoleEvent,\n BugPortConsoleLevel,\n BugPortRuntimeErrorEvent,\n BugPortNetworkEvent,\n BugPortDiagnosticsPayload,\n DiagnosticsConsent,\n} from \"./diagnostics\";\n","// BugPort widget — original implementation. Do not copy third-party sources.\n\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport {\n AnnotationPopupCSS,\n type AnnotationPopupCSSHandle,\n} from \"../annotation-popup-css\";\nimport {\n IconBugPortGlyph,\n IconCamera,\n IconCopyAnimated,\n IconEyeAnimated,\n IconPausePlayAnimated,\n IconSendArrow,\n IconTrashAlt,\n IconXmarkLarge,\n} from \"../icons\";\nimport {\n getAccessibilityInfo,\n getDetailedComputedStyles,\n getElementClasses,\n getForensicComputedStyles,\n getFullElementPath,\n getNearbyElements,\n getNearbyText,\n identifyElement,\n} from \"../../utils/element-identification\";\nimport {\n getStorageKey,\n loadAnnotations,\n saveAnnotations,\n saveToolbarHidden,\n} from \"../../utils/storage\";\nimport { getReactComponentName } from \"../../utils/react-detection\";\nimport {\n findNearestComponentSource,\n formatSourceLocation,\n} from \"../../utils/source-location\";\nimport {\n freeze as freezeAll,\n unfreeze as unfreezeAll,\n} from \"../../utils/freeze-animations\";\nimport { captureDomRegion } from \"../../utils/screenshot\";\nimport { generateOutput } from \"../../utils/generate-output\";\nimport type { Annotation } from \"../../types\";\nimport { buildDiagnosticsPayload } from \"../../diagnostics/payload\";\nimport type {\n BugPortDiagnosticsPayload,\n DiagnosticsConsent,\n ResolvedDiagnosticsConfig,\n} from \"../../diagnostics/types\";\nimport type { DiagnosticsCollector } from \"../../diagnostics/collector\";\nimport styles from \"./styles.module.scss\";\n\nimport { AnnotationMarker, ExitingMarker, PendingMarker } from \"./annotation-marker\";\nimport { SettingsPanel } from \"./settings-panel\";\nimport {\n COLOR_OPTIONS,\n DASHBOARD_LINK,\n DEFAULT_SETTINGS,\n MCP_LINK,\n OUTPUT_TO_REACT_MODE,\n POSITION_STORAGE_KEY,\n THEME_STORAGE_KEY,\n injectBugportWidgetColorTokens,\n loadToolbarSettings,\n saveToolbarSettings,\n type MarkerClickBehavior,\n type ReactComponentMode,\n type ToolbarSettings,\n} from \"./constants\";\nimport {\n INTERACTIVE_SELECTOR,\n buildCursorCss,\n clamp,\n deepElementFromPoint,\n isElementFixed,\n isInsideWidget,\n isTextualTag,\n makeId,\n rectToBox,\n unionBoxes,\n type Box,\n} from \"./dom-helpers\";\n\n// Re-export the public types/values consumed by the package entry + panel.\n// MarkerClickBehavior stays internal-only (imported above) and is intentionally\n// not part of the public surface.\nexport {\n COLOR_OPTIONS,\n type OutputDetailLevel,\n type ReactComponentMode,\n type ToolbarSettings,\n} from \"./constants\";\n\n/** Scripted annotation used by demo mode. */\nexport type DemoAnnotation = {\n selector: string;\n comment: string;\n selectedText?: string;\n};\n\n/** Captured screenshot attached to a submission. */\nexport type BugportSubmissionScreenshot = {\n dataUrl: string;\n mimeType: string;\n width: number;\n height: number;\n capturedAt: number;\n};\n\n/** Payload handed to onSubmitPayload. */\nexport type BugportSubmissionPayload = {\n title?: string;\n description?: string;\n output: string;\n annotations: Annotation[];\n screenshot?: BugportSubmissionScreenshot;\n /**\n * Optional in-page diagnostics, present only when the app owner enabled\n * capture and the user consented to attach at least one source.\n */\n diagnostics?: BugPortDiagnosticsPayload;\n};\n\n/** Full prop surface of the feedback toolbar. */\nexport type PageFeedbackToolbarCSSProps = {\n demoAnnotations?: DemoAnnotation[];\n demoDelay?: number;\n enableDemoMode?: boolean;\n onAnnotationAdd?: (annotation: Annotation) => void;\n onAnnotationDelete?: (annotation: Annotation) => void;\n onAnnotationUpdate?: (annotation: Annotation) => void;\n onAnnotationsClear?: (annotations: Annotation[]) => void;\n onCopy?: (markdown: string) => void;\n onSubmit?: (\n output: string,\n annotations: Annotation[],\n ) => void | boolean | Promise<void | boolean>;\n onSubmitPayload?: (\n payload: BugportSubmissionPayload,\n ) => void | boolean | Promise<void | boolean>;\n projectKey?: string;\n publicKey?: string;\n copyToClipboard?: boolean;\n className?: string;\n /** Resolved diagnostics config (controls which user toggles are shown). */\n diagnosticsConfig?: ResolvedDiagnosticsConfig;\n /** Live diagnostics collector to snapshot from at submit time. */\n diagnosticsCollector?: DiagnosticsCollector | null;\n};\n\n/** Public alias for {@link PageFeedbackToolbarCSSProps}. */\nexport type BugportWidgetProps = PageFeedbackToolbarCSSProps;\n\n// ---------------------------------------------------------------------------\n// Module-level state / constants\n// ---------------------------------------------------------------------------\n\n// Entrance animation plays once per page-load lifetime, not on SPA navigation.\nlet hasPlayedEntranceAnimation = false;\n\nconst CURSOR_STYLE_ID = \"feedback-cursor-styles\";\nconst DRAG_THRESHOLD = 8;\nconst TOOLBAR_DRAG_THRESHOLD = 10;\n\ntype SendState = \"idle\" | \"sending\" | \"sent\" | \"failed\";\ntype SettingsPage = \"submit\" | \"settings\";\n\ntype HoverInfo = {\n elementName: string;\n elementPath: string;\n rect: DOMRect;\n reactComponents: string | null;\n};\n\ntype PendingAnnotation = {\n x: number;\n y: number;\n clientY: number;\n element: string;\n elementPath: string;\n selectedText?: string;\n boundingBox?: Box;\n nearbyText?: string;\n cssClasses?: string;\n isMultiSelect?: boolean;\n isFixed?: boolean;\n fullPath?: string;\n accessibility?: string;\n computedStyles?: string;\n computedStylesObj?: Record<string, string>;\n nearbyElements?: string;\n reactComponents?: string;\n sourceFile?: string;\n elementBoundingBoxes?: Box[];\n targetElement?: HTMLElement;\n};\n\ntype MultiSelectEntry = {\n element: HTMLElement;\n rect: DOMRect;\n name: string;\n path: string;\n};\n\n// Run the colour-token injection a single time at module load.\ninjectBugportWidgetColorTokens();\n\n/** Only surfaces React component names in development builds. */\nfunction resolveReactMode(settings: ToolbarSettings): ReactComponentMode {\n if (!settings.reactEnabled) {\n return \"off\";\n }\n if (typeof process !== \"undefined\" && process.env?.NODE_ENV === \"development\") {\n return OUTPUT_TO_REACT_MODE[settings.outputDetail];\n }\n return \"off\";\n}\n\n/** Annotations that should still be rendered (not resolved / dismissed). */\nfunction isRenderableAnnotation(annotation: Annotation): boolean {\n return annotation.status !== \"resolved\" && annotation.status !== \"dismissed\";\n}\n\n/** Reads the persisted theme flag, defaulting to dark. */\nfunction loadDarkMode(): boolean {\n if (typeof window === \"undefined\") {\n return true;\n }\n try {\n const raw = window.localStorage.getItem(THEME_STORAGE_KEY);\n return raw === null ? true : raw !== \"light\";\n } catch {\n return true;\n }\n}\n\n/** Reads the persisted toolbar drag position. */\nfunction loadToolbarPosition(): { x: number; y: number } | null {\n if (typeof window === \"undefined\") {\n return null;\n }\n try {\n const raw = window.localStorage.getItem(POSITION_STORAGE_KEY);\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw);\n if (\n parsed &&\n typeof parsed.x === \"number\" &&\n typeof parsed.y === \"number\"\n ) {\n return parsed;\n }\n } catch {\n // Ignore malformed values.\n }\n return null;\n}\n\n/**\n * Main feedback toolbar. Renders via a portal into document.body and returns\n * null until mounted, or whenever the toolbar has been permanently hidden.\n */\nexport function PageFeedbackToolbarCSS(\n props: PageFeedbackToolbarCSSProps = {},\n): React.ReactPortal | null {\n const {\n demoAnnotations,\n demoDelay = 1000,\n enableDemoMode = false,\n onAnnotationAdd,\n onAnnotationDelete,\n onAnnotationUpdate,\n onAnnotationsClear,\n onCopy,\n onSubmit,\n onSubmitPayload,\n projectKey,\n publicKey,\n copyToClipboard = true,\n className,\n diagnosticsConfig,\n diagnosticsCollector,\n } = props;\n\n // ---- diagnostics consent (which sources the user wants attached) --------\n const diagConsoleAvailable = Boolean(diagnosticsConfig?.enabled && diagnosticsConfig?.console);\n const diagNetworkAvailable = Boolean(\n diagnosticsConfig?.enabled && (diagnosticsConfig?.fetch || diagnosticsConfig?.xhr),\n );\n const diagRuntimeAvailable = Boolean(\n diagnosticsConfig?.enabled && diagnosticsConfig?.runtimeErrors,\n );\n const diagUserControlled = Boolean(diagnosticsConfig?.userControlled);\n\n const [attachConsole, setAttachConsole] = useState(\n () => diagConsoleAvailable && Boolean(diagnosticsConfig?.defaultAttachConsole),\n );\n const [attachNetwork, setAttachNetwork] = useState(\n () => diagNetworkAvailable && Boolean(diagnosticsConfig?.defaultAttachNetwork),\n );\n const [attachRuntimeErrors, setAttachRuntimeErrors] = useState(\n () => diagRuntimeAvailable && Boolean(diagnosticsConfig?.defaultAttachRuntimeErrors),\n );\n\n // ---- core toolbar state -------------------------------------------------\n const [mounted, setMounted] = useState(false);\n const [isActive, setIsActive] = useState(false);\n const [isToolbarHidden, setIsToolbarHidden] = useState(false);\n\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const [showMarkers, setShowMarkers] = useState(true);\n\n const [hoverInfo, setHoverInfo] = useState<HoverInfo | null>(null);\n const [hoverPosition, setHoverPosition] = useState<{ x: number; y: number }>({\n x: 0,\n y: 0,\n });\n\n const [pendingAnnotation, setPendingAnnotation] =\n useState<PendingAnnotation | null>(null);\n const [pendingExiting, setPendingExiting] = useState(false);\n const [editingAnnotation, setEditingAnnotation] = useState<Annotation | null>(\n null,\n );\n const [editExiting, setEditExiting] = useState(false);\n\n const [hoveredMarkerId, setHoveredMarkerId] = useState<string | null>(null);\n const [deletingMarkerId, setDeletingMarkerId] = useState<string | null>(null);\n const [renumberFrom, setRenumberFrom] = useState<number | null>(null);\n const [animatedMarkers, setAnimatedMarkers] = useState<Set<string>>(\n () => new Set(),\n );\n const [exitingMarkers, setExitingMarkers] = useState<Set<string>>(\n () => new Set(),\n );\n\n const [copied, setCopied] = useState(false);\n const [sendState, setSendState] = useState<SendState>(\"idle\");\n const [isClearing, setIsClearing] = useState(false);\n\n const [isFrozen, setIsFrozen] = useState(false);\n const [isScrolling, setIsScrolling] = useState(false);\n\n const [showSettings, setShowSettings] = useState(false);\n const [showSettingsVisible, setShowSettingsVisible] = useState(false);\n const [settingsPage, setSettingsPage] = useState<SettingsPage>(\"submit\");\n const [submitTitle, setSubmitTitle] = useState(\"\");\n const [submitDescription, setSubmitDescription] = useState(\"\");\n const [submitScreenshot, setSubmitScreenshot] =\n useState<BugportSubmissionScreenshot | null>(null);\n const [submitScreenshotError, setSubmitScreenshotError] = useState<\n string | null\n >(null);\n // Error surfaced to the user when a bug submission fails (e.g. an invalid /\n // missing widget key returned by the API).\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [isCapturingScreenshot, setIsCapturingScreenshot] = useState(false);\n\n const [tooltipsHidden, setTooltipsHidden] = useState(false);\n const [tooltipSessionActive, setTooltipSessionActive] = useState(false);\n\n const [pendingMultiSelect, setPendingMultiSelect] = useState<\n MultiSelectEntry[]\n >([]);\n\n const [settings, setSettings] = useState<ToolbarSettings>(() =>\n loadToolbarSettings(),\n );\n const [isDarkMode, setIsDarkMode] = useState(true);\n const [disableThemeTransition, setDisableThemeTransition] = useState(false);\n const [showEntranceAnimation, setShowEntranceAnimation] = useState(false);\n\n const [toolbarPosition, setToolbarPosition] = useState<{\n x: number;\n y: number;\n } | null>(null);\n const [isDraggingToolbar, setIsDraggingToolbar] = useState(false);\n\n const [isDragging, setIsDragging] = useState(false);\n\n // ---- refs ---------------------------------------------------------------\n const portalWrapperRef = useRef<HTMLDivElement | null>(null);\n const popupRef = useRef<AnnotationPopupCSSHandle | null>(null);\n const editPopupRef = useRef<AnnotationPopupCSSHandle | null>(null);\n const tooltipSessionTimerRef = useRef<number | null>(null);\n const scrollTimeoutRef = useRef<number | null>(null);\n const modifiersHeldRef = useRef<{ cmd: boolean; shift: boolean }>({\n cmd: false,\n shift: false,\n });\n const justFinishedDragRef = useRef(false);\n const justFinishedToolbarDragRef = useRef(false);\n\n // Drag-area selection bookkeeping.\n const mouseDownPosRef = useRef<{ x: number; y: number } | null>(null);\n const dragStartRef = useRef<{ x: number; y: number } | null>(null);\n const dragRectRef = useRef<HTMLDivElement | null>(null);\n const highlightsContainerRef = useRef<HTMLDivElement | null>(null);\n\n // Toolbar drag bookkeeping.\n const toolbarDragStartRef = useRef<{\n pointerX: number;\n pointerY: number;\n originX: number;\n originY: number;\n } | null>(null);\n\n const annotationsRef = useRef<Annotation[]>(annotations);\n annotationsRef.current = annotations;\n\n const pathname = typeof window !== \"undefined\" ? window.location.pathname : \"/\";\n\n // -------------------------------------------------------------------------\n // Derived helpers\n // -------------------------------------------------------------------------\n const hasAnnotations = annotations.length > 0;\n const hasSubmissionTarget =\n Boolean(projectKey || publicKey) || typeof onSubmit === \"function\";\n const canSubmit = hasAnnotations && hasSubmissionTarget;\n\n const reactMode = resolveReactMode(settings);\n\n const visibleAnnotations = annotations.filter(\n (annotation) => !exitingMarkers.has(annotation.id),\n );\n const shouldShowMarkers = isActive && showMarkers;\n\n // -------------------------------------------------------------------------\n // Persistence helpers\n // -------------------------------------------------------------------------\n const persistAnnotations = useCallback(\n (next: Annotation[]) => {\n if (typeof window === \"undefined\") {\n return;\n }\n if (next.length === 0) {\n try {\n window.localStorage.removeItem(getStorageKey(pathname));\n } catch {\n // Ignore.\n }\n return;\n }\n saveAnnotations(pathname, next);\n },\n [pathname],\n );\n\n // -------------------------------------------------------------------------\n // Mount: load persisted state\n // -------------------------------------------------------------------------\n useEffect(() => {\n setMounted(true);\n // The widget must never be permanently removed. Clear any stale persisted\n // \"hidden\" flag from older builds so the launcher always renders.\n saveToolbarHidden(false);\n setIsToolbarHidden(false);\n setIsDarkMode(loadDarkMode());\n setToolbarPosition(loadToolbarPosition());\n\n const loaded = loadAnnotations(pathname).filter(isRenderableAnnotation);\n setAnnotations(loaded);\n if (loaded.length > 0) {\n setAnimatedMarkers(new Set(loaded.map((annotation) => annotation.id)));\n }\n\n if (!hasPlayedEntranceAnimation) {\n hasPlayedEntranceAnimation = true;\n setShowEntranceAnimation(true);\n window.setTimeout(() => setShowEntranceAnimation(false), 750);\n }\n }, []);\n\n // Persist settings + theme on change (after mount).\n useEffect(() => {\n if (!mounted) {\n return;\n }\n saveToolbarSettings(settings);\n }, [settings, mounted]);\n\n useEffect(() => {\n if (!mounted || typeof window === \"undefined\") {\n return;\n }\n try {\n window.localStorage.setItem(\n THEME_STORAGE_KEY,\n isDarkMode ? \"dark\" : \"light\",\n );\n } catch {\n // Ignore.\n }\n }, [isDarkMode, mounted]);\n\n // -------------------------------------------------------------------------\n // Custom cursor while active\n // -------------------------------------------------------------------------\n useEffect(() => {\n if (!isActive || typeof document === \"undefined\") {\n return;\n }\n const style = document.createElement(\"style\");\n style.id = CURSOR_STYLE_ID;\n style.textContent = buildCursorCss();\n document.head.appendChild(style);\n return () => {\n style.remove();\n };\n }, [isActive]);\n\n // -------------------------------------------------------------------------\n // Scroll tracking (suppresses hover visuals briefly)\n // -------------------------------------------------------------------------\n useEffect(() => {\n if (!isActive) {\n return;\n }\n const onScroll = () => {\n setIsScrolling(true);\n if (scrollTimeoutRef.current) {\n window.clearTimeout(scrollTimeoutRef.current);\n }\n scrollTimeoutRef.current = window.setTimeout(\n () => setIsScrolling(false),\n 150,\n );\n };\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => window.removeEventListener(\"scroll\", onScroll);\n }, [isActive]);\n\n // -------------------------------------------------------------------------\n // Annotation mutation core\n // -------------------------------------------------------------------------\n const commitAnnotations = useCallback(\n (next: Annotation[]) => {\n setAnnotations(next);\n persistAnnotations(next);\n },\n [persistAnnotations],\n );\n\n const addAnnotation = useCallback(\n (annotation: Annotation) => {\n const next = [...annotationsRef.current, annotation];\n commitAnnotations(next);\n setAnimatedMarkers((prev) => {\n const updated = new Set(prev);\n updated.add(annotation.id);\n return updated;\n });\n onAnnotationAdd?.(annotation);\n },\n [commitAnnotations, onAnnotationAdd],\n );\n\n const updateAnnotationComment = useCallback(\n (target: Annotation, newComment: string) => {\n const updated: Annotation = { ...target, comment: newComment };\n const next = annotationsRef.current.map((entry) =>\n entry.id === target.id ? updated : entry,\n );\n commitAnnotations(next);\n onAnnotationUpdate?.(updated);\n },\n [commitAnnotations, onAnnotationUpdate],\n );\n\n const removeAnnotation = useCallback(\n (target: Annotation) => {\n const index = annotationsRef.current.findIndex(\n (entry) => entry.id === target.id,\n );\n setDeletingMarkerId(target.id);\n setExitingMarkers((prev) => {\n const updated = new Set(prev);\n updated.add(target.id);\n return updated;\n });\n if (index >= 0) {\n setRenumberFrom(index);\n }\n\n window.setTimeout(() => {\n const next = annotationsRef.current.filter(\n (entry) => entry.id !== target.id,\n );\n commitAnnotations(next);\n setExitingMarkers((prev) => {\n const updated = new Set(prev);\n updated.delete(target.id);\n return updated;\n });\n setDeletingMarkerId(null);\n setRenumberFrom(null);\n }, 300);\n\n onAnnotationDelete?.(target);\n },\n [commitAnnotations, onAnnotationDelete],\n );\n\n const clearAll = useCallback(() => {\n if (annotationsRef.current.length === 0) {\n return;\n }\n const removed = annotationsRef.current;\n setIsClearing(true);\n window.setTimeout(() => {\n commitAnnotations([]);\n setAnimatedMarkers(new Set());\n setExitingMarkers(new Set());\n setIsClearing(false);\n }, 300);\n\n onAnnotationsClear?.(removed);\n }, [commitAnnotations, onAnnotationsClear]);\n\n // -------------------------------------------------------------------------\n // Deactivate side-effects\n // -------------------------------------------------------------------------\n const deactivate = useCallback(() => {\n setIsActive(false);\n }, []);\n\n useEffect(() => {\n if (isActive) {\n return;\n }\n setPendingAnnotation(null);\n setPendingExiting(false);\n setEditingAnnotation(null);\n setEditExiting(false);\n setHoverInfo(null);\n setShowSettings(false);\n setShowSettingsVisible(false);\n setPendingMultiSelect([]);\n if (isFrozen) {\n unfreezeAll();\n setIsFrozen(false);\n }\n }, [isActive, isFrozen]);\n\n // -------------------------------------------------------------------------\n // Build a pending annotation from a target element + click point\n // -------------------------------------------------------------------------\n const buildPendingFromElement = useCallback(\n (\n element: HTMLElement,\n clientX: number,\n clientY: number,\n ): PendingAnnotation => {\n const { name, path } = identifyElement(element);\n const fixed = isElementFixed(element);\n const rect = element.getBoundingClientRect();\n\n let selectedText: string | undefined;\n const selection =\n typeof window !== \"undefined\" ? window.getSelection() : null;\n const selectionText = selection?.toString().trim();\n if (selectionText) {\n selectedText = selectionText.slice(0, 500);\n }\n\n let reactComponents: string | undefined;\n if (reactMode !== \"off\") {\n const info = getReactComponentName(element, { mode: reactMode });\n reactComponents = info.path ?? undefined;\n }\n\n let sourceFile: string | undefined;\n const sourceResult = findNearestComponentSource(element);\n if (sourceResult.found && sourceResult.source) {\n sourceFile = formatSourceLocation(sourceResult.source);\n }\n\n return {\n x: (clientX / window.innerWidth) * 100,\n y: fixed ? clientY : clientY + window.scrollY,\n clientY,\n element: name,\n elementPath: path,\n selectedText,\n boundingBox: rectToBox(rect, !fixed),\n nearbyText: getNearbyText(element),\n cssClasses: getElementClasses(element),\n isFixed: fixed,\n fullPath: getFullElementPath(element),\n accessibility: getAccessibilityInfo(element),\n computedStyles: getForensicComputedStyles(element),\n computedStylesObj: getDetailedComputedStyles(element),\n nearbyElements: getNearbyElements(element),\n reactComponents,\n sourceFile,\n targetElement: element,\n };\n },\n [reactMode],\n );\n\n /** Collapses a multi-select set into a single pending annotation. */\n const createMultiSelectPendingAnnotation = useCallback(\n (entries: MultiSelectEntry[]) => {\n if (entries.length === 0) {\n return;\n }\n if (entries.length === 1) {\n const only = entries[0];\n const rect = only.rect;\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n setPendingAnnotation(\n buildPendingFromElement(only.element, centerX, centerY),\n );\n return;\n }\n\n const anchor = entries[entries.length - 1];\n const boxes = entries.map((entry) =>\n rectToBox(entry.rect, !isElementFixed(entry.element)),\n );\n const combined = unionBoxes(boxes);\n const rect = anchor.rect;\n const fixed = isElementFixed(anchor.element);\n\n const names = entries.map((entry) => entry.name);\n const head = names.slice(0, 2).join(\", \");\n const remaining = names.length - 2;\n const label =\n remaining > 0\n ? `${entries.length} elements: ${head} +${remaining} more`\n : `${entries.length} elements: ${head}`;\n\n const base = buildPendingFromElement(\n anchor.element,\n rect.left + rect.width / 2,\n rect.top + rect.height / 2,\n );\n\n setPendingAnnotation({\n ...base,\n element: label,\n isMultiSelect: true,\n isFixed: fixed,\n boundingBox: combined ?? base.boundingBox,\n elementBoundingBoxes: boxes,\n });\n },\n [buildPendingFromElement],\n );\n\n // -------------------------------------------------------------------------\n // Hover-to-identify\n // -------------------------------------------------------------------------\n useEffect(() => {\n if (!isActive || pendingAnnotation || isDragging) {\n return;\n }\n const onMove = (event: MouseEvent) => {\n if (isScrolling) {\n return;\n }\n const composed = event.composedPath()[0];\n let element: Element | null =\n composed instanceof Element ? composed : null;\n if (!element) {\n element = deepElementFromPoint(event.clientX, event.clientY);\n }\n if (!element || isInsideWidget(element)) {\n setHoverInfo(null);\n return;\n }\n\n const target = element as HTMLElement;\n const { name, path } = identifyElement(target);\n let reactComponents: string | null = null;\n if (reactMode !== \"off\") {\n const info = getReactComponentName(target, { mode: reactMode });\n reactComponents = info.path;\n }\n\n setHoverInfo({\n elementName: name,\n elementPath: path,\n rect: target.getBoundingClientRect(),\n reactComponents,\n });\n setHoverPosition({ x: event.clientX, y: event.clientY });\n };\n\n document.addEventListener(\"mousemove\", onMove);\n return () => document.removeEventListener(\"mousemove\", onMove);\n }, [isActive, pendingAnnotation, isDragging, isScrolling, reactMode]);\n\n // -------------------------------------------------------------------------\n // Capture-phase page click → place annotation\n // -------------------------------------------------------------------------\n useEffect(() => {\n if (!isActive) {\n return;\n }\n const onClick = (event: MouseEvent) => {\n const target = event.target as Element | null;\n if (target && isInsideWidget(target)) {\n return;\n }\n if (justFinishedDragRef.current) {\n justFinishedDragRef.current = false;\n return;\n }\n // Multi-select interactions are handled separately via keyup.\n if (modifiersHeldRef.current.cmd && modifiersHeldRef.current.shift) {\n return;\n }\n\n // An open popup intercepts page clicks and shakes instead.\n if (pendingAnnotation) {\n event.preventDefault();\n event.stopPropagation();\n popupRef.current?.shake();\n return;\n }\n if (editingAnnotation) {\n event.preventDefault();\n event.stopPropagation();\n editPopupRef.current?.shake();\n return;\n }\n\n const composed = event.composedPath()[0];\n let element: Element | null =\n composed instanceof Element ? composed : target;\n if (!element) {\n element = deepElementFromPoint(event.clientX, event.clientY);\n }\n if (!element || isInsideWidget(element)) {\n return;\n }\n\n if (element.closest(INTERACTIVE_SELECTOR)) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n setHoverInfo(null);\n setPendingAnnotation(\n buildPendingFromElement(\n element as HTMLElement,\n event.clientX,\n event.clientY,\n ),\n );\n };\n\n document.addEventListener(\"click\", onClick, true);\n return () => document.removeEventListener(\"click\", onClick, true);\n }, [isActive, pendingAnnotation, editingAnnotation, buildPendingFromElement]);\n\n // -------------------------------------------------------------------------\n // Drag-area selection\n // -------------------------------------------------------------------------\n useEffect(() => {\n if (!isActive || pendingAnnotation || editingAnnotation) {\n return;\n }\n\n const onMouseDown = (event: MouseEvent) => {\n if (event.button !== 0) {\n return;\n }\n const target = event.target as Element | null;\n if (!target || isInsideWidget(target)) {\n return;\n }\n if (isTextualTag(target)) {\n return; // leave native text selection alone\n }\n if (modifiersHeldRef.current.cmd && modifiersHeldRef.current.shift) {\n return;\n }\n mouseDownPosRef.current = { x: event.clientX, y: event.clientY };\n event.preventDefault();\n };\n\n const onMouseMove = (event: MouseEvent) => {\n const start = mouseDownPosRef.current;\n if (!start) {\n return;\n }\n const dx = event.clientX - start.x;\n const dy = event.clientY - start.y;\n if (!isDragging && Math.hypot(dx, dy) < DRAG_THRESHOLD) {\n return;\n }\n if (!isDragging) {\n setIsDragging(true);\n dragStartRef.current = start;\n }\n\n const sx = dragStartRef.current?.x ?? start.x;\n const sy = dragStartRef.current?.y ?? start.y;\n const left = Math.min(sx, event.clientX);\n const top = Math.min(sy, event.clientY);\n const width = Math.abs(event.clientX - sx);\n const height = Math.abs(event.clientY - sy);\n if (dragRectRef.current) {\n dragRectRef.current.style.transform = `translate(${left}px, ${top}px)`;\n dragRectRef.current.style.width = `${width}px`;\n dragRectRef.current.style.height = `${height}px`;\n }\n };\n\n const onMouseUp = (event: MouseEvent) => {\n const start = dragStartRef.current ?? mouseDownPosRef.current;\n mouseDownPosRef.current = null;\n\n if (!isDragging || !start) {\n dragStartRef.current = null;\n return;\n }\n\n const left = Math.min(start.x, event.clientX);\n const top = Math.min(start.y, event.clientY);\n const width = Math.abs(event.clientX - start.x);\n const height = Math.abs(event.clientY - start.y);\n\n setIsDragging(false);\n dragStartRef.current = null;\n justFinishedDragRef.current = true;\n\n const meaningful = Array.from(\n document.querySelectorAll<HTMLElement>(\n \"button,a,input,img,p,h1,h2,h3,h4,h5,h6,li,label,td,th\",\n ),\n ).filter((el) => {\n if (isInsideWidget(el)) {\n return false;\n }\n const rect = el.getBoundingClientRect();\n return (\n rect.left < left + width &&\n rect.right > left &&\n rect.top < top + height &&\n rect.bottom > top\n );\n });\n\n // Drop parents that fully contain another match.\n const filtered = meaningful.filter(\n (el) => !meaningful.some((other) => other !== el && el.contains(other)),\n );\n\n if (filtered.length > 0) {\n const entries: MultiSelectEntry[] = filtered.map((el) => {\n const { name, path } = identifyElement(el);\n return { element: el, rect: el.getBoundingClientRect(), name, path };\n });\n createMultiSelectPendingAnnotation(entries);\n } else if (width > 20 && height > 20) {\n setPendingAnnotation({\n x: ((left + width / 2) / window.innerWidth) * 100,\n y: top + height / 2 + window.scrollY,\n clientY: top + height / 2,\n element: \"Area selection\",\n elementPath: \"page region\",\n isMultiSelect: true,\n boundingBox: {\n x: left + window.scrollX,\n y: top + window.scrollY,\n width,\n height,\n },\n });\n }\n };\n\n document.addEventListener(\"mousedown\", onMouseDown, true);\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n return () => {\n document.removeEventListener(\"mousedown\", onMouseDown, true);\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n }, [\n isActive,\n isDragging,\n pendingAnnotation,\n editingAnnotation,\n createMultiSelectPendingAnnotation,\n ]);\n\n // -------------------------------------------------------------------------\n // Cmd+Shift+click multi-select\n // -------------------------------------------------------------------------\n useEffect(() => {\n if (!isActive) {\n return;\n }\n\n const onClickCapture = (event: MouseEvent) => {\n if (!(modifiersHeldRef.current.cmd && modifiersHeldRef.current.shift)) {\n return;\n }\n const target = event.target as Element | null;\n if (!target || isInsideWidget(target)) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n\n const element = target as HTMLElement;\n const { name, path } = identifyElement(element);\n setPendingMultiSelect((prev) => {\n const existing = prev.findIndex((entry) => entry.element === element);\n if (existing >= 0) {\n return prev.filter((_, idx) => idx !== existing);\n }\n return [\n ...prev,\n { element, rect: element.getBoundingClientRect(), name, path },\n ];\n });\n };\n\n const onKeyUp = (event: KeyboardEvent) => {\n if (event.key === \"Meta\" || event.key === \"Control\") {\n modifiersHeldRef.current.cmd = false;\n }\n if (event.key === \"Shift\") {\n modifiersHeldRef.current.shift = false;\n }\n if (\n (!modifiersHeldRef.current.cmd || !modifiersHeldRef.current.shift) &&\n pendingMultiSelect.length >= 1\n ) {\n createMultiSelectPendingAnnotation(pendingMultiSelect);\n setPendingMultiSelect([]);\n }\n };\n\n const onBlur = () => {\n setPendingMultiSelect([]);\n modifiersHeldRef.current.cmd = false;\n modifiersHeldRef.current.shift = false;\n };\n\n document.addEventListener(\"click\", onClickCapture, true);\n window.addEventListener(\"keyup\", onKeyUp);\n window.addEventListener(\"blur\", onBlur);\n return () => {\n document.removeEventListener(\"click\", onClickCapture, true);\n window.removeEventListener(\"keyup\", onKeyUp);\n window.removeEventListener(\"blur\", onBlur);\n };\n }, [isActive, pendingMultiSelect, createMultiSelectPendingAnnotation]);\n\n // -------------------------------------------------------------------------\n // Keyboard shortcuts\n // -------------------------------------------------------------------------\n const copyOutput = useCallback(() => {\n if (annotationsRef.current.length === 0) {\n return;\n }\n const displayUrl =\n typeof window !== \"undefined\"\n ? window.location.pathname +\n window.location.search +\n window.location.hash\n : pathname;\n const markdown = generateOutput(\n annotationsRef.current,\n displayUrl,\n settings.outputDetail,\n );\n if (!markdown) {\n return;\n }\n\n if (copyToClipboard !== false && navigator.clipboard) {\n void navigator.clipboard.writeText(markdown).catch(() => {});\n }\n onCopy?.(markdown);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 2000);\n }, [settings.outputDetail, copyToClipboard, onCopy, pathname]);\n\n const toggleFreeze = useCallback(() => {\n setIsFrozen((prev) => {\n if (prev) {\n unfreezeAll();\n return false;\n }\n freezeAll();\n return true;\n });\n }, []);\n\n const openSubmitPanel = useCallback(() => {\n setSettingsPage(\"submit\");\n setShowSettings(true);\n setShowSettingsVisible(true);\n }, []);\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement | null;\n const typing =\n target instanceof HTMLElement &&\n (target.tagName === \"INPUT\" ||\n target.tagName === \"TEXTAREA\" ||\n target.isContentEditable);\n\n if (event.key === \"Meta\" || event.key === \"Control\") {\n modifiersHeldRef.current.cmd = true;\n }\n if (event.key === \"Shift\") {\n modifiersHeldRef.current.shift = true;\n }\n\n // Toggle active: Cmd/Ctrl+Shift+F\n if (\n (event.metaKey || event.ctrlKey) &&\n event.shiftKey &&\n (event.key === \"f\" || event.key === \"F\")\n ) {\n event.preventDefault();\n setIsActive((prev) => !prev);\n return;\n }\n\n if (typing) {\n return;\n }\n\n if (event.key === \"Escape\") {\n if (pendingMultiSelect.length > 0) {\n setPendingMultiSelect([]);\n return;\n }\n if (pendingAnnotation) {\n setPendingExiting(true);\n window.setTimeout(() => {\n setPendingAnnotation(null);\n setPendingExiting(false);\n }, 150);\n return;\n }\n if (editingAnnotation) {\n setEditExiting(true);\n window.setTimeout(() => {\n setEditingAnnotation(null);\n setEditExiting(false);\n }, 150);\n return;\n }\n if (isActive) {\n deactivate();\n }\n return;\n }\n\n // The remaining shortcuts are ignored while meta/ctrl is held.\n if (event.metaKey || event.ctrlKey) {\n return;\n }\n if (!isActive) {\n return;\n }\n\n if (event.key === \"p\" || event.key === \"P\") {\n toggleFreeze();\n } else if (event.key === \"h\" || event.key === \"H\") {\n if (annotationsRef.current.length > 0) {\n setShowMarkers((prev) => !prev);\n }\n } else if (event.key === \"c\" || event.key === \"C\") {\n if (annotationsRef.current.length > 0) {\n copyOutput();\n }\n } else if (event.key === \"x\" || event.key === \"X\") {\n if (annotationsRef.current.length > 0) {\n clearAll();\n }\n } else if (event.key === \"s\" || event.key === \"S\") {\n if (annotationsRef.current.length > 0 && sendState === \"idle\") {\n openSubmitPanel();\n }\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [\n isActive,\n pendingAnnotation,\n editingAnnotation,\n pendingMultiSelect,\n sendState,\n deactivate,\n toggleFreeze,\n copyOutput,\n clearAll,\n openSubmitPanel,\n ]);\n\n // -------------------------------------------------------------------------\n // Demo mode\n // -------------------------------------------------------------------------\n useEffect(() => {\n if (\n !enableDemoMode ||\n !demoAnnotations ||\n demoAnnotations.length === 0 ||\n annotationsRef.current.length > 0\n ) {\n return;\n }\n const timer = window.setTimeout(() => {\n setIsActive(true);\n demoAnnotations.forEach((demo, index) => {\n window.setTimeout(() => {\n const element = document.querySelector<HTMLElement>(demo.selector);\n if (!element) {\n return;\n }\n const rect = element.getBoundingClientRect();\n const base = buildPendingFromElement(\n element,\n rect.left + rect.width / 2,\n rect.top + rect.height / 2,\n );\n addAnnotation({\n id: makeId(),\n x: base.x,\n y: base.y,\n comment: demo.comment,\n element: base.element,\n elementPath: base.elementPath,\n timestamp: Date.now(),\n selectedText: demo.selectedText,\n boundingBox: base.boundingBox,\n isFixed: base.isFixed,\n kind: \"feedback\",\n });\n }, index * 300);\n });\n }, demoDelay);\n return () => window.clearTimeout(timer);\n }, [enableDemoMode]);\n\n // -------------------------------------------------------------------------\n // Unmount cleanup\n // -------------------------------------------------------------------------\n useEffect(() => {\n return () => {\n unfreezeAll();\n };\n }, []);\n\n // -------------------------------------------------------------------------\n // Popup handlers\n // -------------------------------------------------------------------------\n const submitPendingComment = useCallback(\n (text: string) => {\n const pending = pendingAnnotation;\n if (!pending) {\n return;\n }\n const annotation: Annotation = {\n id: makeId(),\n x: pending.x,\n y: pending.y,\n comment: text,\n element: pending.element,\n elementPath: pending.elementPath,\n timestamp: Date.now(),\n selectedText: pending.selectedText,\n boundingBox: pending.boundingBox,\n nearbyText: pending.nearbyText,\n cssClasses: pending.cssClasses,\n nearbyElements: pending.nearbyElements,\n computedStyles: pending.computedStyles,\n fullPath: pending.fullPath,\n accessibility: pending.accessibility,\n isMultiSelect: pending.isMultiSelect,\n isFixed: pending.isFixed,\n reactComponents: pending.reactComponents,\n sourceFile: pending.sourceFile,\n elementBoundingBoxes: pending.elementBoundingBoxes,\n kind: \"feedback\",\n };\n addAnnotation(annotation);\n setPendingAnnotation(null);\n },\n [pendingAnnotation, addAnnotation],\n );\n\n const cancelPending = useCallback(() => {\n setPendingExiting(true);\n window.setTimeout(() => {\n setPendingAnnotation(null);\n setPendingExiting(false);\n }, 150);\n }, []);\n\n const startEditAnnotation = useCallback((annotation: Annotation) => {\n setEditingAnnotation(annotation);\n }, []);\n\n const submitEdit = useCallback(\n (text: string) => {\n if (!editingAnnotation) {\n return;\n }\n updateAnnotationComment(editingAnnotation, text);\n setEditExiting(true);\n window.setTimeout(() => {\n setEditingAnnotation(null);\n setEditExiting(false);\n }, 150);\n },\n [editingAnnotation, updateAnnotationComment],\n );\n\n const cancelEdit = useCallback(() => {\n setEditExiting(true);\n window.setTimeout(() => {\n setEditingAnnotation(null);\n setEditExiting(false);\n }, 150);\n }, []);\n\n const deleteEditing = useCallback(() => {\n if (!editingAnnotation) {\n return;\n }\n const target = editingAnnotation;\n setEditExiting(true);\n window.setTimeout(() => {\n setEditingAnnotation(null);\n setEditExiting(false);\n removeAnnotation(target);\n }, 150);\n }, [editingAnnotation, removeAnnotation]);\n\n const handleMarkerClick = useCallback(\n (annotation: Annotation) => {\n const behavior: MarkerClickBehavior = settings.markerClickBehavior;\n if (behavior === \"delete\") {\n removeAnnotation(annotation);\n } else {\n startEditAnnotation(annotation);\n }\n },\n [settings.markerClickBehavior, removeAnnotation, startEditAnnotation],\n );\n\n // -------------------------------------------------------------------------\n // Screenshot capture\n // -------------------------------------------------------------------------\n const captureSubmissionScreenshot = useCallback(async () => {\n if (typeof window === \"undefined\") {\n return;\n }\n setIsCapturingScreenshot(true);\n setSubmitScreenshotError(null);\n\n const root = document.querySelector<HTMLElement>(\n \"[data-bugport-widget-root]\",\n );\n const prevVisibility = root?.style.visibility ?? \"\";\n if (root) {\n root.style.visibility = \"hidden\";\n }\n\n const restore = () => {\n if (root) {\n root.style.visibility = prevVisibility;\n }\n };\n\n try {\n const media = navigator.mediaDevices;\n if (media && typeof media.getDisplayMedia === \"function\") {\n const stream = await media.getDisplayMedia({ video: true });\n // Allow the widget to stay hidden briefly while the frame settles.\n await new Promise((resolve) => window.setTimeout(resolve, 180));\n\n const video = document.createElement(\"video\");\n video.srcObject = stream;\n await video.play().catch(() => {});\n\n const sourceW = video.videoWidth || window.innerWidth;\n const sourceH = video.videoHeight || window.innerHeight;\n const maxDimension = 1600;\n const scale = Math.min(1, maxDimension / Math.max(sourceW, sourceH));\n const width = Math.round(sourceW * scale);\n const height = Math.round(sourceH * scale);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n ctx.drawImage(video, 0, 0, width, height);\n }\n stream.getTracks().forEach((track) => track.stop());\n\n const dataUrl = canvas.toDataURL(\"image/jpeg\", 0.9);\n setSubmitScreenshot({\n dataUrl,\n mimeType: \"image/jpeg\",\n width,\n height,\n capturedAt: Date.now(),\n });\n return;\n }\n\n // DOM fallback.\n const dataUrl = await captureDomRegion(\n 0,\n 0,\n window.innerWidth,\n window.innerHeight,\n [],\n );\n if (dataUrl) {\n setSubmitScreenshot({\n dataUrl,\n mimeType: \"image/jpeg\",\n width: window.innerWidth,\n height: window.innerHeight,\n capturedAt: Date.now(),\n });\n } else {\n setSubmitScreenshotError(\"Screenshot capture is not available.\");\n }\n } catch (error) {\n const name = (error as { name?: string } | null)?.name ?? \"\";\n if (name === \"NotAllowedError\" || name === \"AbortError\") {\n setSubmitScreenshotError(\"Screenshot capture was cancelled.\");\n } else {\n setSubmitScreenshotError(\"Screenshot capture failed.\");\n }\n } finally {\n restore();\n setIsCapturingScreenshot(false);\n }\n }, []);\n\n const clearSubmissionScreenshot = useCallback(() => {\n setSubmitScreenshot(null);\n setSubmitScreenshotError(null);\n }, []);\n\n // -------------------------------------------------------------------------\n // Submit flow\n // -------------------------------------------------------------------------\n const submitBug = useCallback(async () => {\n const displayUrl =\n typeof window !== \"undefined\"\n ? window.location.pathname +\n window.location.search +\n window.location.hash\n : pathname;\n\n let output = generateOutput(\n annotationsRef.current,\n displayUrl,\n settings.outputDetail,\n );\n if (!output) {\n output = `## Page Feedback: ${displayUrl}\\n`;\n }\n\n const title = submitTitle.trim();\n const description = submitDescription.trim();\n if (title || description) {\n const summary = [\n title ? `## Bug Report: ${title}` : \"## Bug Report\",\n description,\n ]\n .filter(Boolean)\n .join(\"\\n\\n\");\n output = `${summary}\\n\\n${output}`;\n }\n\n setSendState(\"sending\");\n setSubmitError(null);\n await new Promise((resolve) => window.setTimeout(resolve, 150));\n\n const consent: DiagnosticsConsent = {\n console: diagConsoleAvailable && attachConsole,\n network: diagNetworkAvailable && attachNetwork,\n runtimeErrors: diagRuntimeAvailable && attachRuntimeErrors,\n };\n const diagnostics = diagnosticsConfig?.enabled\n ? buildDiagnosticsPayload(diagnosticsCollector, consent)\n : undefined;\n\n const payload: BugportSubmissionPayload = {\n title: title || undefined,\n description: description || undefined,\n output,\n annotations: annotationsRef.current,\n screenshot: submitScreenshot ?? undefined,\n diagnostics,\n };\n\n let callbackSucceeded = false;\n try {\n if (onSubmit) {\n const result = await onSubmit(output, annotationsRef.current);\n callbackSucceeded = result !== false;\n }\n\n if (onSubmitPayload) {\n const result = await onSubmitPayload(payload);\n callbackSucceeded = callbackSucceeded || result !== false;\n }\n } catch (error) {\n // A submission handler can reject (e.g. the API rejects an invalid or\n // missing widget key). Surface a readable message instead of leaving the\n // button stuck on \"Submitting...\".\n setSendState(\"failed\");\n setSubmitError(\n error instanceof Error && error.message\n ? error.message\n : \"Submission failed. Please try again.\",\n );\n window.setTimeout(() => setSendState(\"idle\"), 2500);\n return;\n }\n\n const success = callbackSucceeded;\n setSendState(success ? \"sent\" : \"failed\");\n if (!success) {\n setSubmitError(\"Submission failed. Please try again.\");\n }\n window.setTimeout(() => setSendState(\"idle\"), 2500);\n\n if (success) {\n setSubmitError(null);\n setShowSettings(false);\n setShowSettingsVisible(false);\n setSettingsPage(\"submit\");\n setSubmitTitle(\"\");\n setSubmitDescription(\"\");\n setSubmitScreenshot(null);\n setSubmitScreenshotError(null);\n }\n }, [\n settings.outputDetail,\n submitTitle,\n submitDescription,\n submitScreenshot,\n onSubmit,\n onSubmitPayload,\n pathname,\n diagnosticsConfig,\n diagnosticsCollector,\n diagConsoleAvailable,\n diagNetworkAvailable,\n diagRuntimeAvailable,\n attachConsole,\n attachNetwork,\n attachRuntimeErrors,\n ]);\n\n // -------------------------------------------------------------------------\n // Settings / theme handlers\n // -------------------------------------------------------------------------\n const patchSettings = useCallback((patch: Partial<ToolbarSettings>) => {\n setSettings((prev) => {\n const next = { ...prev, ...patch };\n if (\n patch.annotationColorId !== undefined &&\n !COLOR_OPTIONS.some((color) => color.id === patch.annotationColorId)\n ) {\n next.annotationColorId = DEFAULT_SETTINGS.annotationColorId;\n }\n return next;\n });\n }, []);\n\n const toggleTheme = useCallback(() => {\n setDisableThemeTransition(true);\n setIsDarkMode((prev) => !prev);\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => setDisableThemeTransition(false));\n });\n }, []);\n\n const toggleSubmitPanel = useCallback(() => {\n setShowSettings((prev) => {\n const next = !prev;\n setShowSettingsVisible(next);\n if (next) {\n setSettingsPage(\"submit\");\n }\n return next;\n });\n }, []);\n\n // -------------------------------------------------------------------------\n // Tooltip suppression\n // -------------------------------------------------------------------------\n const hideTooltipsUntilMouseLeave = useCallback(() => {\n setTooltipsHidden(true);\n }, []);\n\n const onControlsMouseEnter = useCallback(() => {\n if (tooltipSessionTimerRef.current) {\n window.clearTimeout(tooltipSessionTimerRef.current);\n }\n tooltipSessionTimerRef.current = window.setTimeout(\n () => setTooltipSessionActive(true),\n 850,\n );\n }, []);\n\n const onControlsMouseLeave = useCallback(() => {\n setTooltipsHidden(false);\n setTooltipSessionActive(false);\n if (tooltipSessionTimerRef.current) {\n window.clearTimeout(tooltipSessionTimerRef.current);\n tooltipSessionTimerRef.current = null;\n }\n }, []);\n\n // -------------------------------------------------------------------------\n // Collapsed circle activation\n // -------------------------------------------------------------------------\n const activate = useCallback(() => {\n if (justFinishedToolbarDragRef.current) {\n justFinishedToolbarDragRef.current = false;\n return;\n }\n setIsActive(true);\n }, []);\n\n // -------------------------------------------------------------------------\n // -------------------------------------------------------------------------\n // Toolbar drag\n // -------------------------------------------------------------------------\n const onToolbarPointerDown = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n const target = event.target as Element;\n if (\n target.closest(\"button\") ||\n target.closest(\"[data-bugport-widget-settings-panel]\")\n ) {\n return;\n }\n toolbarDragStartRef.current = {\n pointerX: event.clientX,\n pointerY: event.clientY,\n originX: toolbarPosition?.x ?? event.clientX,\n originY: toolbarPosition?.y ?? event.clientY,\n };\n\n const onMove = (move: PointerEvent) => {\n const start = toolbarDragStartRef.current;\n if (!start) {\n return;\n }\n const dx = move.clientX - start.pointerX;\n const dy = move.clientY - start.pointerY;\n if (!isDraggingToolbar && Math.hypot(dx, dy) < TOOLBAR_DRAG_THRESHOLD) {\n return;\n }\n setIsDraggingToolbar(true);\n const padding = 20;\n const contentWidth = isActive ? 297 : 44;\n const height = 44;\n const maxX = window.innerWidth - contentWidth - padding;\n const maxY = window.innerHeight - height - padding;\n setToolbarPosition({\n x: clamp(start.originX + dx, padding, Math.max(padding, maxX)),\n y: clamp(start.originY + dy, padding, Math.max(padding, maxY)),\n });\n };\n\n const onUp = () => {\n document.removeEventListener(\"pointermove\", onMove);\n document.removeEventListener(\"pointerup\", onUp);\n if (isDraggingToolbar) {\n justFinishedToolbarDragRef.current = true;\n setIsDraggingToolbar(false);\n try {\n if (toolbarPosition) {\n window.localStorage.setItem(\n POSITION_STORAGE_KEY,\n JSON.stringify(toolbarPosition),\n );\n }\n } catch {\n // Ignore.\n }\n }\n toolbarDragStartRef.current = null;\n };\n\n document.addEventListener(\"pointermove\", onMove);\n document.addEventListener(\"pointerup\", onUp);\n },\n [toolbarPosition, isDraggingToolbar, isActive],\n );\n\n // Re-constrain on resize.\n useEffect(() => {\n if (!toolbarPosition) {\n return;\n }\n const onResize = () => {\n const padding = 20;\n const contentWidth = isActive ? 297 : 44;\n const height = 44;\n setToolbarPosition((prev) => {\n if (!prev) {\n return prev;\n }\n return {\n x: clamp(\n prev.x,\n padding,\n Math.max(padding, window.innerWidth - contentWidth - padding),\n ),\n y: clamp(\n prev.y,\n padding,\n Math.max(padding, window.innerHeight - height - padding),\n ),\n };\n });\n };\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, [toolbarPosition, isActive]);\n\n // -------------------------------------------------------------------------\n // Portal wrapper propagation guard\n // -------------------------------------------------------------------------\n const stopHostPropagation = useCallback(\n (event: React.SyntheticEvent) => {\n // Stop events that originate inside the widget from reaching host-page\n // click-outside listeners.\n event.stopPropagation();\n },\n [],\n );\n\n // -------------------------------------------------------------------------\n // Render gating\n // -------------------------------------------------------------------------\n if (!mounted || isToolbarHidden) {\n return null;\n }\n\n const accentVar = \"var(--bugport-widget-color-accent)\";\n const toolbarNearBottom =\n typeof window !== \"undefined\" &&\n (toolbarPosition?.y ?? window.innerHeight - 64) >\n window.innerHeight - 290;\n\n // Popup positioning helpers.\n const popupStyleFor = (\n xPercent: number,\n yPixels: number,\n isFixed: boolean | undefined,\n ): React.CSSProperties => {\n const left = clamp((xPercent / 100) * window.innerWidth, 160, window.innerWidth - 160);\n const markerY = isFixed ? yPixels : yPixels - window.scrollY;\n // Prefer opening the popup ABOVE the marker so it never spills below the\n // fold. Only fall back to opening below when the marker sits too close to\n // the top of the viewport to fit the popup above it.\n const POPUP_HEIGHT = 280;\n const openAbove = markerY > POPUP_HEIGHT;\n return {\n left,\n top: openAbove ? markerY - 12 : markerY + 24,\n position: isFixed ? \"fixed\" : \"absolute\",\n transform: openAbove ? \"translate(-50%, -100%)\" : \"translateX(-50%)\",\n };\n };\n\n // Tooltip flip helper.\n const getTooltipPosition = (\n annotation: Annotation,\n ): React.CSSProperties | undefined => {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n const markerY = annotation.isFixed\n ? annotation.y\n : annotation.y - window.scrollY;\n const flipAbove = window.innerHeight - markerY < 80;\n const leftPx = clamp((annotation.x / 100) * window.innerWidth, 10, window.innerWidth - 10);\n return {\n left: leftPx,\n top: flipAbove ? markerY - 8 : markerY + 28,\n };\n };\n\n // Split markers into static + fixed layers.\n const staticAnnotations = visibleAnnotations.filter((a) => !a.isFixed);\n const fixedAnnotations = visibleAnnotations.filter((a) => a.isFixed);\n\n const renderMarker = (\n annotation: Annotation,\n layerIndex: number,\n layerSize: number,\n ) => {\n const globalIndex = annotations.findIndex(\n (entry) => entry.id === annotation.id,\n );\n return (\n <AnnotationMarker\n key={annotation.id}\n annotation={annotation}\n globalIndex={globalIndex}\n layerIndex={layerIndex}\n layerSize={layerSize}\n isExiting={exitingMarkers.has(annotation.id)}\n isClearing={isClearing}\n isAnimated={animatedMarkers.has(annotation.id)}\n isHovered={hoveredMarkerId === annotation.id}\n isDeleting={deletingMarkerId === annotation.id}\n isEditingAny={editingAnnotation !== null}\n renumberFrom={renumberFrom}\n markerClickBehavior={settings.markerClickBehavior}\n tooltipStyle={getTooltipPosition(annotation)}\n onHoverEnter={(a) => setHoveredMarkerId(a.id)}\n onHoverLeave={() => setHoveredMarkerId(null)}\n onClick={handleMarkerClick}\n onContextMenu={startEditAnnotation}\n />\n );\n };\n\n const overlayClassName = [\n styles.overlay,\n isActive ? styles.active : \"\",\n isDarkMode ? \"\" : styles.light,\n disableThemeTransition ? styles.disableTransitions : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const toolbarContainerClassName = [\n styles.toolbarContainer,\n isActive ? styles.expanded : styles.collapsed,\n showEntranceAnimation ? styles.entrance : \"\",\n className ?? \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const controlsClassName = [\n styles.controlsContent,\n tooltipsHidden ? styles.tooltipsHidden : \"\",\n tooltipSessionActive ? styles.tooltipsInSession : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const toolbarStyle: React.CSSProperties | undefined = toolbarPosition\n ? { position: \"fixed\", left: toolbarPosition.x, top: toolbarPosition.y }\n : undefined;\n\n const overlay = (\n <div\n ref={portalWrapperRef}\n data-bugport-widget-root\n data-bugport-widget-accent={settings.annotationColorId}\n data-bugport-widget-theme={isDarkMode ? \"dark\" : \"light\"}\n style={{ display: \"contents\" }}\n onMouseDown={stopHostPropagation}\n onClick={stopHostPropagation}\n onPointerDown={stopHostPropagation}\n >\n <div\n className={overlayClassName}\n data-feedback-toolbar\n style={isDarkMode ? undefined : { colorScheme: \"light\" }}\n >\n {/* Hover identify overlay */}\n {isActive &&\n hoverInfo &&\n !pendingAnnotation &&\n !isScrolling &&\n !isDragging ? (\n <>\n <div\n className={styles.hoverHighlight}\n style={{\n position: \"fixed\",\n left: hoverInfo.rect.left,\n top: hoverInfo.rect.top,\n width: hoverInfo.rect.width,\n height: hoverInfo.rect.height,\n backgroundColor: `color-mix(in srgb, ${accentVar} 12%, transparent)`,\n borderColor: `color-mix(in srgb, ${accentVar} 60%, transparent)`,\n }}\n >\n <span className={styles.selectedElementHighlight} />\n </div>\n {(() => {\n // Flip the tooltip above/left of the cursor near viewport edges.\n const flipUp = hoverPosition.y > window.innerHeight - 80;\n const flipLeft = hoverPosition.x > window.innerWidth - 220;\n const directionClass = flipUp ? styles.top : styles.tooltipBelow;\n const sideClass = flipLeft ? styles.left : \"\";\n return (\n <div\n className={`${styles.hoverTooltip} ${directionClass} ${sideClass}`.trim()}\n style={{\n position: \"fixed\",\n left: flipLeft ? hoverPosition.x - 12 : hoverPosition.x + 12,\n top: flipUp ? hoverPosition.y - 16 : hoverPosition.y + 16,\n }}\n >\n <span className={styles.hoverElementName}>\n {hoverInfo.elementName}\n </span>\n {hoverInfo.reactComponents ? (\n <span className={styles.hoverReactPath}>\n {hoverInfo.reactComponents}\n </span>\n ) : null}\n </div>\n );\n })()}\n </>\n ) : null}\n\n {/* Drag-selection rectangle + live highlights */}\n {isDragging ? (\n <>\n <div ref={dragRectRef} className={styles.dragSelection} />\n <div ref={highlightsContainerRef} className={styles.highlightsContainer} />\n </>\n ) : null}\n\n {/* Multi-select in-progress outlines */}\n {pendingMultiSelect.map((entry, index) => (\n <div\n key={index}\n className={\n pendingMultiSelect.length >= 2\n ? styles.multiSelectOutline\n : styles.singleSelectOutline\n }\n style={{\n position: \"fixed\",\n left: entry.rect.left,\n top: entry.rect.top,\n width: entry.rect.width,\n height: entry.rect.height,\n }}\n />\n ))}\n\n {/* Hidden draw canvas (draw-mode button is intentionally not exposed) */}\n <canvas className={styles.drawCanvas} style={{ display: \"none\" }} />\n\n {/* Marker layers — kept mounted so visibility can animate via CSS */}\n <>\n <div\n className={`${styles.markersLayer} ${\n shouldShowMarkers ? styles.visible : styles.hidden\n }`}\n >\n {shouldShowMarkers\n ? staticAnnotations.map((annotation, index) =>\n renderMarker(annotation, index, staticAnnotations.length),\n )\n : null}\n </div>\n <div\n className={`${styles.fixedMarkersLayer} ${\n shouldShowMarkers ? styles.visible : styles.hidden\n }`}\n >\n {shouldShowMarkers\n ? fixedAnnotations.map((annotation, index) =>\n renderMarker(annotation, index, fixedAnnotations.length),\n )\n : null}\n </div>\n </>\n\n {/* Exiting markers (deletion animation) */}\n {Array.from(exitingMarkers).map((id) => {\n const annotation = annotations.find((entry) => entry.id === id);\n if (!annotation) {\n return null;\n }\n return (\n <ExitingMarker\n key={`exit-${id}`}\n annotation={annotation}\n fixed={annotation.isFixed}\n />\n );\n })}\n\n {/* Pending marker + comment popup */}\n {pendingAnnotation ? (\n <div className={pendingAnnotation.isFixed ? styles.fixedMarkersLayer : styles.markersLayer}>\n <PendingMarker\n x={pendingAnnotation.x}\n y={pendingAnnotation.isFixed ? pendingAnnotation.clientY : pendingAnnotation.y}\n isMultiSelect={pendingAnnotation.isMultiSelect}\n isExiting={pendingExiting}\n />\n </div>\n ) : null}\n\n {pendingAnnotation ? (\n <AnnotationPopupCSS\n ref={popupRef}\n element={pendingAnnotation.element}\n selectedText={pendingAnnotation.selectedText}\n computedStyles={pendingAnnotation.computedStylesObj}\n lightMode={!isDarkMode}\n accentColor={pendingAnnotation.isMultiSelect ? undefined : undefined}\n isExiting={pendingExiting}\n style={popupStyleFor(\n pendingAnnotation.x,\n pendingAnnotation.isFixed\n ? pendingAnnotation.clientY\n : pendingAnnotation.y,\n pendingAnnotation.isFixed,\n )}\n onSubmit={submitPendingComment}\n onCancel={cancelPending}\n />\n ) : null}\n\n {/* Edit popup */}\n {editingAnnotation ? (\n <AnnotationPopupCSS\n ref={editPopupRef}\n element={editingAnnotation.element}\n selectedText={editingAnnotation.selectedText}\n initialValue={editingAnnotation.comment}\n submitLabel=\"Save\"\n lightMode={!isDarkMode}\n isExiting={editExiting}\n style={popupStyleFor(\n editingAnnotation.x,\n editingAnnotation.isFixed\n ? editingAnnotation.y\n : editingAnnotation.y,\n editingAnnotation.isFixed,\n )}\n onSubmit={submitEdit}\n onCancel={cancelEdit}\n onDelete={deleteEditing}\n />\n ) : null}\n\n {/* Fixed-position launcher container (bottom-right) */}\n <div\n className={styles.toolbar}\n data-feedback-toolbar\n data-bugport-widget-toolbar\n style={toolbarStyle}\n >\n <div\n className={toolbarContainerClassName}\n onPointerDown={onToolbarPointerDown}\n >\n {!isActive ? (\n <div\n className={styles.toggleContent}\n role=\"button\"\n tabIndex={0}\n title=\"Start feedback mode\"\n onClick={activate}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n activate();\n }\n }}\n >\n <span className={styles.toggleLogo}>\n <IconBugPortGlyph size={42} />\n </span>\n {hasAnnotations ? (\n <span className={styles.badge}>{annotations.length}</span>\n ) : null}\n </div>\n ) : (\n <div>\n <div\n className={controlsClassName}\n onMouseEnter={onControlsMouseEnter}\n onMouseLeave={onControlsMouseLeave}\n >\n <div className={`${styles.buttonWrapper} ${styles.buttonWrapperAlignLeft}`}>\n <button\n type=\"button\"\n className={`${styles.controlButton} ${isFrozen ? styles.active : \"\"}`}\n onClick={() => {\n hideTooltipsUntilMouseLeave();\n toggleFreeze();\n }}\n >\n <IconPausePlayAnimated isPaused={isFrozen} size={20} />\n </button>\n <span className={`${styles.buttonTooltip} ${styles.bottom}`}>\n {isFrozen ? \"Resume\" : \"Pause\"}\n <span className={styles.shortcut}>P</span>\n </span>\n </div>\n\n <div className={styles.buttonWrapper}>\n <button\n type=\"button\"\n className={styles.controlButton}\n disabled={isCapturingScreenshot}\n onClick={() => {\n hideTooltipsUntilMouseLeave();\n openSubmitPanel();\n void captureSubmissionScreenshot();\n }}\n >\n <IconCamera size={18} />\n </button>\n <span className={`${styles.buttonTooltip} ${styles.bottom}`}>\n Screenshot\n </span>\n </div>\n\n <div className={styles.buttonWrapper}>\n <button\n type=\"button\"\n className={`${styles.controlButton} ${showMarkers ? styles.active : \"\"}`}\n disabled={!hasAnnotations}\n onClick={() => {\n hideTooltipsUntilMouseLeave();\n setShowMarkers((prev) => !prev);\n }}\n >\n <IconEyeAnimated isOpen={showMarkers} size={20} />\n </button>\n <span className={`${styles.buttonTooltip} ${styles.bottom}`}>\n {showMarkers ? \"Hide markers\" : \"Show markers\"}\n <span className={styles.shortcut}>H</span>\n </span>\n </div>\n\n <div className={styles.divider} />\n\n <div className={styles.buttonWrapper}>\n <button\n type=\"button\"\n className={`${styles.controlButton} ${copied ? styles.statusShowing : \"\"}`}\n disabled={!hasAnnotations}\n onClick={() => {\n hideTooltipsUntilMouseLeave();\n copyOutput();\n }}\n >\n <IconCopyAnimated copied={copied} size={18} tint={accentVar} />\n </button>\n <span className={`${styles.buttonTooltip} ${styles.bottom}`}>\n Copy feedback\n <span className={styles.shortcut}>C</span>\n </span>\n </div>\n\n <div className={styles.buttonWrapper}>\n <button\n type=\"button\"\n className={styles.controlButton}\n disabled={!hasAnnotations}\n onClick={() => {\n hideTooltipsUntilMouseLeave();\n clearAll();\n }}\n >\n <IconTrashAlt size={18} />\n </button>\n <span className={`${styles.buttonTooltip} ${styles.bottom}`}>\n Clear all\n <span className={styles.shortcut}>X</span>\n </span>\n </div>\n\n <div className={styles.divider} />\n\n <div className={styles.buttonWrapper}>\n <button\n type=\"button\"\n className={`${styles.controlButton} ${sendState !== \"idle\" ? styles.statusShowing : \"\"}`}\n disabled={!hasAnnotations}\n onClick={() => {\n hideTooltipsUntilMouseLeave();\n toggleSubmitPanel();\n }}\n >\n <IconSendArrow state={sendState} size={18} />\n </button>\n <span className={`${styles.buttonTooltip} ${styles.bottom}`}>\n Submit\n <span className={styles.shortcut}>S</span>\n </span>\n </div>\n\n <div className={`${styles.buttonWrapper} ${styles.buttonWrapperAlignRight}`}>\n <button\n type=\"button\"\n className={styles.controlButton}\n onClick={() => {\n hideTooltipsUntilMouseLeave();\n deactivate();\n }}\n >\n <IconXmarkLarge size={20} />\n </button>\n <span className={`${styles.buttonTooltip} ${styles.bottom}`}>\n Exit\n </span>\n </div>\n </div>\n\n {showSettings ? (\n <div\n className={`${\n showSettingsVisible ? styles.enter : styles.exit\n } ${sendState === \"sending\" ? styles.fadeOut : \"\"}`.trim()}\n >\n <SettingsPanel\n settings={settings}\n onSettingsChange={patchSettings}\n submitTitle={submitTitle}\n onSubmitTitleChange={setSubmitTitle}\n submitDescription={submitDescription}\n onSubmitDescriptionChange={setSubmitDescription}\n submitScreenshot={submitScreenshot}\n onCaptureScreenshot={() => void captureSubmissionScreenshot()}\n onClearScreenshot={clearSubmissionScreenshot}\n screenshotError={submitScreenshotError}\n isCapturingScreenshot={isCapturingScreenshot}\n onSubmitBug={() => void submitBug()}\n submitError={submitError}\n canSubmit={canSubmit}\n isSubmitting={sendState === \"sending\"}\n hasSubmissionTarget={hasSubmissionTarget}\n isDarkMode={isDarkMode}\n onToggleTheme={toggleTheme}\n isVisible={showSettingsVisible}\n toolbarNearBottom={toolbarNearBottom}\n settingsPage={settingsPage}\n onSettingsPageChange={setSettingsPage}\n dashboardUrl={DASHBOARD_LINK}\n mcpUrl={MCP_LINK}\n diagnostics={\n diagUserControlled &&\n (diagConsoleAvailable || diagNetworkAvailable || diagRuntimeAvailable)\n ? {\n showConsole: diagConsoleAvailable,\n showNetwork: diagNetworkAvailable,\n showRuntimeErrors: diagRuntimeAvailable,\n attachConsole,\n attachNetwork,\n attachRuntimeErrors,\n onToggleConsole: setAttachConsole,\n onToggleNetwork: setAttachNetwork,\n onToggleRuntimeErrors: setAttachRuntimeErrors,\n responseBodiesEnabled: Boolean(\n diagnosticsConfig?.responseBodies,\n ),\n }\n : undefined\n }\n />\n </div>\n ) : null}\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n\n return createPortal(overlay, document.body);\n}\n","\"use client\";\n\n// BugPort widget — original implementation. Do not copy third-party sources.\n\nimport {\n useState,\n useRef,\n useEffect,\n useCallback,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\nimport styles from \"./styles.module.scss\";\nimport { IconTrash } from \"../icons\";\nimport { originalSetTimeout } from \"../../utils/freeze-animations\";\n\n/** Public prop contract for the CSS annotation popup. */\nexport interface AnnotationPopupCSSProps {\n /** Element name to display in header */\n element: string;\n /** Optional timestamp display (e.g., \"@ 1.23s\" for animation feedback) */\n timestamp?: string;\n /** Optional selected/highlighted text */\n selectedText?: string;\n /** Placeholder text for the textarea */\n placeholder?: string;\n /** Initial value for textarea (for edit mode) */\n initialValue?: string;\n /** Label for submit button (default: \"Add\") */\n submitLabel?: string;\n /** Called when annotation is submitted with text */\n onSubmit: (text: string) => void;\n /** Called when popup is cancelled/dismissed */\n onCancel: () => void;\n /** Called when delete button is clicked (only shown if provided) */\n onDelete?: () => void;\n /** Position styles (left, top) */\n style?: React.CSSProperties;\n /** Custom color for submit button and textarea focus (hex) */\n accentColor?: string;\n /** External exit state (parent controls exit animation) */\n isExiting?: boolean;\n /** Light mode styling */\n lightMode?: boolean;\n /** Computed styles for the selected element */\n computedStyles?: Record<string, string>;\n}\n\n/** Imperative surface that parents can drive through a ref. */\nexport interface AnnotationPopupCSSHandle {\n /** Shake the popup (e.g., when user clicks outside) */\n shake: () => void;\n}\n\n/** Lifecycle phases for the mount/exit transition. */\ntype TransitionPhase = \"initial\" | \"enter\" | \"entered\" | \"exit\";\n\n/** Convenient alias for the opaque timer handle our timeouts return. */\ntype TimerHandle = ReturnType<Window[\"setTimeout\"]>;\n\n/**\n * Move focus onto `el` while shielding the action from any focus-trap library\n * (e.g. Radix FocusScope) that listens for focusin/focusout to reclaim focus.\n * We briefly mount capturing listeners that swallow those events, focus, then\n * always tear the listeners back down.\n */\nfunction focusBypassingTraps(el: HTMLElement | null): void {\n if (el === null) {\n return;\n }\n\n const trap = (event: Event): void => {\n event.stopImmediatePropagation();\n };\n\n document.addEventListener(\"focusin\", trap, true);\n document.addEventListener(\"focusout\", trap, true);\n\n try {\n el.focus();\n } finally {\n document.removeEventListener(\"focusin\", trap, true);\n document.removeEventListener(\"focusout\", trap, true);\n }\n}\n\n/** Turn a camelCase CSS property name into its kebab-case wire form. */\nfunction toKebabProperty(name: string): string {\n return name.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n}\n\nexport const AnnotationPopupCSS = forwardRef<\n AnnotationPopupCSSHandle,\n AnnotationPopupCSSProps\n>(function AnnotationPopupCSS(props, ref) {\n const {\n element,\n timestamp,\n selectedText,\n placeholder = \"What should change?\",\n initialValue = \"\",\n submitLabel = \"Add\",\n onSubmit,\n onCancel,\n onDelete,\n style,\n accentColor = \"#611f69\",\n isExiting = false,\n lightMode = false,\n computedStyles,\n } = props;\n\n const [text, setText] = useState<string>(initialValue);\n const [isShaking, setIsShaking] = useState<boolean>(false);\n const [phase, setPhase] = useState<TransitionPhase>(\"initial\");\n const [isFocused, setIsFocused] = useState<boolean>(false);\n const [isStylesExpanded, setIsStylesExpanded] = useState<boolean>(false);\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n const cancelTimerRef = useRef<TimerHandle | null>(null);\n const shakeTimerRef = useRef<TimerHandle | null>(null);\n\n const hasComputedStyles =\n computedStyles !== undefined && Object.keys(computedStyles).length > 0;\n\n // Parent can request the exit animation by flipping `isExiting`.\n useEffect(() => {\n if (isExiting && phase !== \"exit\") {\n setPhase(\"exit\");\n }\n }, [isExiting, phase]);\n\n // Mount choreography: stage the enter classes and drop focus into the field.\n useEffect(() => {\n originalSetTimeout(() => setPhase(\"enter\"), 0);\n\n const enterTimer = originalSetTimeout(() => setPhase(\"entered\"), 200);\n\n const focusTimer = originalSetTimeout(() => {\n const field = textareaRef.current;\n focusBypassingTraps(field);\n if (field) {\n const caret = field.value.length;\n field.selectionStart = caret;\n field.selectionEnd = caret;\n field.scrollTop = field.scrollHeight;\n }\n }, 50);\n\n return () => {\n clearTimeout(enterTimer);\n clearTimeout(focusTimer);\n if (cancelTimerRef.current !== null) {\n clearTimeout(cancelTimerRef.current);\n }\n if (shakeTimerRef.current !== null) {\n clearTimeout(shakeTimerRef.current);\n }\n };\n }, []);\n\n const shake = useCallback(() => {\n if (shakeTimerRef.current !== null) {\n clearTimeout(shakeTimerRef.current);\n }\n setIsShaking(true);\n shakeTimerRef.current = originalSetTimeout(() => {\n setIsShaking(false);\n focusBypassingTraps(textareaRef.current);\n }, 250);\n }, []);\n\n useImperativeHandle(ref, () => ({ shake }), [shake]);\n\n const handleCancel = useCallback(() => {\n setPhase(\"exit\");\n cancelTimerRef.current = originalSetTimeout(() => onCancel(), 150);\n }, [onCancel]);\n\n const handleSubmit = useCallback(() => {\n const trimmed = text.trim();\n if (!trimmed) {\n return;\n }\n onSubmit(trimmed);\n }, [text, onSubmit]);\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n event.stopPropagation();\n\n if (event.nativeEvent.isComposing) {\n return;\n }\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n handleSubmit();\n return;\n }\n\n if (event.key === \"Escape\") {\n handleCancel();\n }\n },\n [handleSubmit, handleCancel]\n );\n\n const handleToggleStyles = useCallback(() => {\n const wasExpanded = isStylesExpanded;\n setIsStylesExpanded(!wasExpanded);\n if (wasExpanded) {\n originalSetTimeout(() => focusBypassingTraps(textareaRef.current), 0);\n }\n }, [isStylesExpanded]);\n\n const popupClassName = [\n styles.popup,\n lightMode ? styles.light : \"\",\n phase === \"enter\" ? styles.enter : \"\",\n phase === \"entered\" ? styles.entered : \"\",\n phase === \"exit\" ? styles.exit : \"\",\n isShaking ? styles.shake : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const hasText = Boolean(text.trim());\n\n return (\n <div\n ref={popupRef}\n className={popupClassName}\n data-annotation-popup\n style={style}\n onClick={(event) => event.stopPropagation()}\n >\n <div className={styles.header}>\n {hasComputedStyles ? (\n <button\n type=\"button\"\n className={styles.headerToggle}\n onClick={handleToggleStyles}\n >\n <svg\n className={`${styles.chevron} ${\n isStylesExpanded ? styles.expanded : \"\"\n }`}\n width={14}\n height={14}\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.5 10.25L9 7.25L5.75 4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <span className={styles.element}>{element}</span>\n </button>\n ) : (\n <span className={styles.element}>{element}</span>\n )}\n {timestamp ? (\n <span className={styles.timestamp}>{timestamp}</span>\n ) : null}\n </div>\n\n {hasComputedStyles ? (\n <div\n className={`${styles.stylesWrapper} ${\n isStylesExpanded ? styles.expanded : \"\"\n }`}\n >\n <div className={styles.stylesInner}>\n <div className={styles.stylesBlock}>\n {Object.entries(computedStyles).map(([property, value]) => (\n <div key={property} className={styles.styleLine}>\n <span className={styles.styleProperty}>\n {toKebabProperty(property)}\n </span>\n {\": \"}\n <span className={styles.styleValue}>{value}</span>\n {\";\"}\n </div>\n ))}\n </div>\n </div>\n </div>\n ) : null}\n\n {selectedText ? (\n <div className={styles.quote}>\n “{selectedText.slice(0, 80)}\n {selectedText.length > 80 ? \"...\" : \"\"}”\n </div>\n ) : null}\n\n <textarea\n ref={textareaRef}\n className={styles.textarea}\n style={{ borderColor: isFocused ? accentColor : undefined }}\n placeholder={placeholder}\n value={text}\n onChange={(event) => setText(event.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n rows={2}\n onKeyDown={handleKeyDown}\n />\n\n <div className={styles.actions}>\n {onDelete ? (\n <div className={styles.deleteWrapper}>\n <button\n className={styles.deleteButton}\n onClick={onDelete}\n type=\"button\"\n >\n <IconTrash size={22} />\n </button>\n </div>\n ) : null}\n <button className={styles.cancel} onClick={handleCancel}>\n Cancel\n </button>\n <button\n className={styles.submit}\n style={{ backgroundColor: accentColor, opacity: hasText ? 1 : 0.4 }}\n onClick={handleSubmit}\n disabled={!hasText}\n >\n {submitLabel}\n </button>\n </div>\n </div>\n );\n});\n\nexport default AnnotationPopupCSS;\n","\nconst css = \"@keyframes styles-module__popupEnter___AuQDN {\\n from {\\n opacity: 0;\\n transform: translateX(-50%) scale(0.95) translateY(4px);\\n }\\n to {\\n opacity: 1;\\n transform: translateX(-50%) scale(1) translateY(0);\\n }\\n}\\n@keyframes styles-module__popupExit___JJKQX {\\n from {\\n opacity: 1;\\n transform: translateX(-50%) scale(1) translateY(0);\\n }\\n to {\\n opacity: 0;\\n transform: translateX(-50%) scale(0.95) translateY(4px);\\n }\\n}\\n@keyframes styles-module__shake___jdbWe {\\n 0% {\\n transform: translateX(-50%) scale(1) translateY(0) translateX(0);\\n }\\n 20% {\\n transform: translateX(-50%) scale(1) translateY(0) translateX(-3px);\\n }\\n 40% {\\n transform: translateX(-50%) scale(1) translateY(0) translateX(3px);\\n }\\n 60% {\\n transform: translateX(-50%) scale(1) translateY(0) translateX(-2px);\\n }\\n 80% {\\n transform: translateX(-50%) scale(1) translateY(0) translateX(2px);\\n }\\n 100% {\\n transform: translateX(-50%) scale(1) translateY(0) translateX(0);\\n }\\n}\\n.styles-module__popup___IhzrD {\\n position: fixed;\\n z-index: 100001;\\n width: 280px;\\n padding: 0.75rem 1rem 14px;\\n border-radius: 8px;\\n background: #481a54;\\n box-shadow: 0 14px 32px rgba(46, 0, 57, 0.32), 0 0 0 1px rgba(234, 200, 254, 0.2);\\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n transform: translateX(-50%);\\n opacity: 0;\\n will-change: transform, opacity;\\n}\\n.styles-module__popup___IhzrD svg[fill=none] {\\n fill: none !important;\\n}\\n.styles-module__popup___IhzrD svg[fill=none] :not([fill]) {\\n fill: none !important;\\n}\\n.styles-module__popup___IhzrD.styles-module__enter___L7U7N {\\n animation: styles-module__popupEnter___AuQDN 0.2s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;\\n}\\n.styles-module__popup___IhzrD.styles-module__entered___COX-w {\\n opacity: 1;\\n transform: translateX(-50%) scale(1) translateY(0);\\n}\\n.styles-module__popup___IhzrD.styles-module__exit___5eGjE {\\n animation: styles-module__popupExit___JJKQX 0.15s ease-in forwards;\\n}\\n.styles-module__popup___IhzrD.styles-module__entered___COX-w.styles-module__shake___jdbWe {\\n animation: styles-module__shake___jdbWe 0.25s ease-out;\\n}\\n\\n.styles-module__header___wWsSi {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n margin-bottom: 0.5625rem;\\n}\\n\\n.styles-module__element___fTV2z {\\n flex: 1;\\n max-width: 100%;\\n overflow: hidden;\\n font-size: 0.75rem;\\n font-weight: 400;\\n color: rgba(254, 251, 255, 0.6);\\n text-overflow: ellipsis;\\n white-space: nowrap;\\n}\\n\\n.styles-module__headerToggle___WpW0b {\\n display: flex;\\n flex: 1;\\n min-width: 0;\\n align-items: center;\\n gap: 0.25rem;\\n padding: 0;\\n border: none;\\n background: none;\\n text-align: left;\\n cursor: pointer;\\n}\\n.styles-module__headerToggle___WpW0b .styles-module__element___fTV2z {\\n flex: 1;\\n}\\n\\n.styles-module__chevron___ZZJlR {\\n flex-shrink: 0;\\n color: rgba(254, 251, 255, 0.5);\\n transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1);\\n}\\n.styles-module__chevron___ZZJlR.styles-module__expanded___2Hxgv {\\n transform: rotate(90deg);\\n}\\n\\n.styles-module__stylesWrapper___pnHgy {\\n display: grid;\\n grid-template-rows: 0fr;\\n transition: grid-template-rows 0.3s cubic-bezier(0.16, 1, 0.3, 1);\\n}\\n.styles-module__stylesWrapper___pnHgy.styles-module__expanded___2Hxgv {\\n grid-template-rows: 1fr;\\n}\\n\\n.styles-module__stylesInner___YYZe2 {\\n overflow: hidden;\\n}\\n\\n.styles-module__stylesBlock___VfQKn {\\n padding: 0.5rem 0.625rem;\\n margin-bottom: 0.5rem;\\n border-radius: 0.375rem;\\n background: rgba(234, 200, 254, 0.08);\\n font-family: ui-monospace, SFMono-Regular, \\\"SF Mono\\\", Menlo, Consolas, monospace;\\n font-size: 0.6875rem;\\n line-height: 1.5;\\n}\\n\\n.styles-module__styleLine___1YQiD {\\n color: rgba(254, 251, 255, 0.85);\\n word-break: break-word;\\n}\\n\\n.styles-module__styleProperty___84L1i {\\n color: #d17dfe;\\n}\\n\\n.styles-module__styleValue___q51-h {\\n color: rgba(254, 251, 255, 0.85);\\n}\\n\\n.styles-module__timestamp___Dtpsv {\\n flex-shrink: 0;\\n margin-left: 0.5rem;\\n font-size: 0.625rem;\\n font-weight: 500;\\n color: rgba(254, 251, 255, 0.4);\\n font-variant-numeric: tabular-nums;\\n}\\n\\n.styles-module__quote___mcMmQ {\\n padding: 0.4rem 0.5rem;\\n margin-bottom: 0.5rem;\\n border-radius: 0.25rem;\\n background: rgba(234, 200, 254, 0.08);\\n font-size: 12px;\\n font-style: italic;\\n line-height: 1.45;\\n color: rgba(254, 251, 255, 0.6);\\n}\\n\\n.styles-module__textarea___jrSae {\\n box-sizing: border-box;\\n width: 100%;\\n padding: 0.5rem 0.625rem;\\n border: 1px solid rgba(234, 200, 254, 0.28);\\n border-radius: 8px;\\n background: rgba(255, 255, 255, 0.06);\\n font-family: inherit;\\n font-size: 0.8125rem;\\n color: #fefbff;\\n resize: none;\\n outline: none;\\n transition: border-color 0.15s ease;\\n}\\n.styles-module__textarea___jrSae:focus {\\n border-color: var(--bugport-widget-color-blue);\\n}\\n.styles-module__textarea___jrSae.styles-module__green___99l3h:focus {\\n border-color: var(--bugport-widget-color-green);\\n}\\n.styles-module__textarea___jrSae::placeholder {\\n color: rgba(254, 251, 255, 0.4);\\n}\\n.styles-module__textarea___jrSae::-webkit-scrollbar {\\n width: 6px;\\n}\\n.styles-module__textarea___jrSae::-webkit-scrollbar-track {\\n background: transparent;\\n}\\n.styles-module__textarea___jrSae::-webkit-scrollbar-thumb {\\n border-radius: 3px;\\n background: rgba(234, 200, 254, 0.28);\\n}\\n\\n.styles-module__actions___D6x3f {\\n display: flex;\\n justify-content: flex-end;\\n gap: 0.375rem;\\n margin-top: 0.5rem;\\n}\\n\\n.styles-module__cancel___hRjnL,\\n.styles-module__submit___K-mIR {\\n padding: 0.4rem 0.875rem;\\n border: none;\\n border-radius: 8px;\\n font-size: 0.75rem;\\n font-weight: 500;\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease, opacity 0.15s ease;\\n}\\n\\n.styles-module__cancel___hRjnL {\\n background: transparent;\\n color: rgba(254, 251, 255, 0.6);\\n}\\n.styles-module__cancel___hRjnL:hover {\\n background: rgba(234, 200, 254, 0.14);\\n color: rgba(254, 251, 255, 0.9);\\n}\\n\\n.styles-module__submit___K-mIR {\\n color: #fff;\\n}\\n.styles-module__submit___K-mIR:hover:not(:disabled) {\\n filter: brightness(0.9);\\n}\\n.styles-module__submit___K-mIR:disabled {\\n cursor: not-allowed;\\n}\\n\\n.styles-module__deleteWrapper___oSjdo {\\n margin-right: auto;\\n}\\n\\n.styles-module__deleteButton___4VuAE {\\n display: flex;\\n width: 28px;\\n height: 28px;\\n align-items: center;\\n justify-content: center;\\n border: none;\\n border-radius: 50%;\\n background: transparent;\\n color: rgba(254, 251, 255, 0.4);\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease, transform 0.1s ease;\\n}\\n.styles-module__deleteButton___4VuAE:hover {\\n background: color-mix(in srgb, var(--bugport-widget-color-red) 25%, transparent);\\n color: var(--bugport-widget-color-red);\\n}\\n.styles-module__deleteButton___4VuAE:active {\\n transform: scale(0.92);\\n}\\n\\n.styles-module__light___6AaSQ.styles-module__popup___IhzrD {\\n background: #fefbff;\\n box-shadow: 0 12px 32px rgba(29, 28, 29, 0.12), 0 0 0 1px rgba(234, 200, 254, 0.5);\\n}\\n.styles-module__light___6AaSQ .styles-module__element___fTV2z {\\n color: #696969;\\n}\\n.styles-module__light___6AaSQ .styles-module__chevron___ZZJlR {\\n color: rgba(29, 28, 29, 0.4);\\n}\\n.styles-module__light___6AaSQ .styles-module__stylesBlock___VfQKn {\\n background: rgba(97, 31, 105, 0.05);\\n}\\n.styles-module__light___6AaSQ .styles-module__styleLine___1YQiD {\\n color: rgba(29, 28, 29, 0.78);\\n}\\n.styles-module__light___6AaSQ .styles-module__styleProperty___84L1i {\\n color: #611f69;\\n}\\n.styles-module__light___6AaSQ .styles-module__styleValue___q51-h {\\n color: rgba(29, 28, 29, 0.78);\\n}\\n.styles-module__light___6AaSQ .styles-module__timestamp___Dtpsv {\\n color: rgba(29, 28, 29, 0.4);\\n}\\n.styles-module__light___6AaSQ .styles-module__quote___mcMmQ {\\n background: rgba(97, 31, 105, 0.05);\\n color: #696969;\\n}\\n.styles-module__light___6AaSQ .styles-module__textarea___jrSae {\\n border-color: #eac8fe;\\n background: #fff;\\n color: #1d1c1d;\\n}\\n.styles-module__light___6AaSQ .styles-module__textarea___jrSae::placeholder {\\n color: rgba(105, 105, 105, 0.7);\\n}\\n.styles-module__light___6AaSQ .styles-module__textarea___jrSae::-webkit-scrollbar-thumb {\\n background: rgba(97, 31, 105, 0.2);\\n}\\n.styles-module__light___6AaSQ .styles-module__cancel___hRjnL {\\n color: #696969;\\n}\\n.styles-module__light___6AaSQ .styles-module__cancel___hRjnL:hover {\\n background: rgba(97, 31, 105, 0.08);\\n color: #1d1c1d;\\n}\\n.styles-module__light___6AaSQ .styles-module__deleteButton___4VuAE {\\n color: rgba(29, 28, 29, 0.4);\\n}\\n.styles-module__light___6AaSQ .styles-module__deleteButton___4VuAE:hover {\\n background: color-mix(in srgb, var(--bugport-widget-color-red) 25%, transparent);\\n color: var(--bugport-widget-color-red);\\n}\";\nconst classNames = {\"popup\":\"styles-module__popup___IhzrD\",\"enter\":\"styles-module__enter___L7U7N\",\"popupEnter\":\"styles-module__popupEnter___AuQDN\",\"entered\":\"styles-module__entered___COX-w\",\"exit\":\"styles-module__exit___5eGjE\",\"popupExit\":\"styles-module__popupExit___JJKQX\",\"shake\":\"styles-module__shake___jdbWe\",\"header\":\"styles-module__header___wWsSi\",\"element\":\"styles-module__element___fTV2z\",\"headerToggle\":\"styles-module__headerToggle___WpW0b\",\"chevron\":\"styles-module__chevron___ZZJlR\",\"expanded\":\"styles-module__expanded___2Hxgv\",\"stylesWrapper\":\"styles-module__stylesWrapper___pnHgy\",\"stylesInner\":\"styles-module__stylesInner___YYZe2\",\"stylesBlock\":\"styles-module__stylesBlock___VfQKn\",\"styleLine\":\"styles-module__styleLine___1YQiD\",\"styleProperty\":\"styles-module__styleProperty___84L1i\",\"styleValue\":\"styles-module__styleValue___q51-h\",\"timestamp\":\"styles-module__timestamp___Dtpsv\",\"quote\":\"styles-module__quote___mcMmQ\",\"textarea\":\"styles-module__textarea___jrSae\",\"green\":\"styles-module__green___99l3h\",\"actions\":\"styles-module__actions___D6x3f\",\"cancel\":\"styles-module__cancel___hRjnL\",\"submit\":\"styles-module__submit___K-mIR\",\"deleteWrapper\":\"styles-module__deleteWrapper___oSjdo\",\"deleteButton\":\"styles-module__deleteButton___4VuAE\",\"light\":\"styles-module__light___6AaSQ\"};\n\nif (typeof document !== \"undefined\") {\n let style = document.getElementById(\"bugport-widget-styles-annotation-popup-css-styles\");\n if (!style) {\n style = document.createElement(\"style\");\n style.id = \"bugport-widget-styles-annotation-popup-css-styles\";\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","\nconst css = \".icon-transitions-module__iconState___uqK9J {\\n transition: opacity 0.2s ease, transform 0.2s ease;\\n transform-origin: center;\\n}\\n\\n.icon-transitions-module__iconStateFast___HxlMm {\\n transition: opacity 0.15s ease, transform 0.15s ease;\\n transform-origin: center;\\n}\\n\\n.icon-transitions-module__iconFade___nPwXg {\\n transition: opacity 0.2s ease;\\n}\\n\\n.icon-transitions-module__iconFadeFast___Ofb2t {\\n transition: opacity 0.15s ease;\\n}\\n\\n.icon-transitions-module__visible___PlHsU {\\n opacity: 1 !important;\\n}\\n\\n.icon-transitions-module__hidden___ETykt {\\n opacity: 0 !important;\\n}\\n\\n.icon-transitions-module__visibleScaled___8Qog- {\\n opacity: 1 !important;\\n transform: scale(1);\\n}\\n\\n.icon-transitions-module__hiddenScaled___JXn-m {\\n opacity: 0 !important;\\n transform: scale(0.8);\\n}\\n\\n.icon-transitions-module__sending___uaLN- {\\n opacity: 0.5 !important;\\n transform: scale(0.8);\\n}\";\nconst classNames = {\"iconState\":\"icon-transitions-module__iconState___uqK9J\",\"iconStateFast\":\"icon-transitions-module__iconStateFast___HxlMm\",\"iconFade\":\"icon-transitions-module__iconFade___nPwXg\",\"iconFadeFast\":\"icon-transitions-module__iconFadeFast___Ofb2t\",\"visible\":\"icon-transitions-module__visible___PlHsU\",\"hidden\":\"icon-transitions-module__hidden___ETykt\",\"visibleScaled\":\"icon-transitions-module__visibleScaled___8Qog-\",\"hiddenScaled\":\"icon-transitions-module__hiddenScaled___JXn-m\",\"sending\":\"icon-transitions-module__sending___uaLN-\"};\n\nif (typeof document !== \"undefined\") {\n let style = document.getElementById(\"bugport-widget-styles-components-icon-transitions\");\n if (!style) {\n style = document.createElement(\"style\");\n style.id = \"bugport-widget-styles-components-icon-transitions\";\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","// BugPort widget — original icon set. Original geometry; not copied from third-party sources.\n\"use client\";\n\nimport s from \"./icon-transitions.module.scss\";\n\n// =============================================================================\n// Icons\n// =============================================================================\n\n// Small X for marker delete\nexport const IconClose = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M4.25 4.25L11.75 11.75M11.75 4.25L4.25 11.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Plus icon\nexport const IconPlus = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 2.75V13.25M2.75 8H13.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Checkmark icon\nexport const IconCheck = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M3.25 8.25L6.5 11.5L12.75 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Checkbox checkmark (smaller, optimized for checkboxes)\nexport const IconCheckSmall = ({ size = 14 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M4 7.1L6.1 9.2L10.4 4.9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// List with sparkle icon\nexport const IconListSparkle = ({\n size = 24,\n style = {},\n}: {\n size?: number;\n style?: React.CSSProperties;\n}) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" style={style}>\n <g clipPath=\"url(#clip0_list_sparkle)\">\n <path\n d=\"M5.5 6.75H18.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5.5 12H11.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5.5 17.25H9.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M16 12.5C16.35 13.85 17.15 14.65 18.5 15C17.15 15.35 16.35 16.15 16 17.5C15.65 16.15 14.85 15.35 13.5 15C14.85 14.65 15.65 13.85 16 12.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_list_sparkle\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\n// BugPort's own mark: a stylized \"B\" portal — a rounded square frame with an\n// inset notch suggesting an open port, authored from scratch for BugPort.\n// Official BugPort app icon (logo kit — bugport-icon-dark): a bug silhouette\n// with a central port/dock shape on the brand plum rounded-square background.\nexport const IconBugPortGlyph = ({\n size = 24,\n}: {\n size?: number;\n}) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 512 512\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n {/* Brand plum rounded-square backdrop */}\n <rect width=\"512\" height=\"512\" rx=\"104\" fill=\"#481A54\" />\n <g transform=\"translate(76 55) scale(1.15)\">\n {/* Bug body — symmetric silhouette */}\n <path\n d=\"M95 82C55 84 24 117 24 158C24 181 34 202 50 216C29 232 16 257 16 286C16 331 52 367 97 367H119V223L158 200V86H95Z\"\n fill=\"#FFFFFF\"\n />\n <path\n d=\"M221 82C261 84 292 117 292 158C292 181 282 202 266 216C287 232 300 257 300 286C300 331 264 367 219 367H197V223L158 200V86H221Z\"\n fill=\"#FFFFFF\"\n />\n {/* Central port / dock shape */}\n <path\n d=\"M148 90H168V206L217 235V367H99V235L148 206V90Z\"\n fill=\"#481A54\"\n />\n {/* Antennae */}\n <path d=\"M78 80L28 30\" stroke=\"#FFFFFF\" strokeWidth=\"16\" strokeLinecap=\"round\" />\n <path d=\"M238 80L288 30\" stroke=\"#FFFFFF\" strokeWidth=\"16\" strokeLinecap=\"round\" />\n <circle cx=\"28\" cy=\"30\" r=\"17\" fill=\"#FFFFFF\" />\n <circle cx=\"288\" cy=\"30\" r=\"17\" fill=\"#FFFFFF\" />\n {/* Violet accent bands */}\n <path d=\"M120 286H196L208 306H108L120 286Z\" fill=\"#D17DFE\" />\n <path d=\"M111 323H205\" stroke=\"#D17DFE\" strokeWidth=\"18\" />\n <path d=\"M94 358H222\" stroke=\"#D17DFE\" strokeWidth=\"18\" />\n </g>\n </svg>\n);\n\n// Help/Question mark icon for tooltips\nexport const IconHelp = ({\n size = 20,\n ...props\n}: { size?: number } & React.SVGProps<SVGSVGElement>) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"6.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n />\n <path\n d=\"M8.25 8.25C8.4 7.55 9.1 7.2 10 7.25C10.9 7.3 11.6 7.95 11.6 8.85C11.6 10 10 10.3 10 11.1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"10\" cy=\"13.25\" r=\"0.7\" fill=\"currentColor\" />\n </svg>\n);\n\n// Animated checkmark with draw + bounce effect\nexport const IconCheckSmallAnimated = ({ size = 14 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 14 14\" fill=\"none\">\n <style>{`\n @keyframes checkDraw {\n 0% {\n stroke-dashoffset: 12;\n }\n 100% {\n stroke-dashoffset: 0;\n }\n }\n @keyframes checkBounce {\n 0% {\n transform: scale(0.5);\n opacity: 0;\n }\n 50% {\n transform: scale(1.12);\n opacity: 1;\n }\n 75% {\n transform: scale(0.95);\n }\n 100% {\n transform: scale(1);\n }\n }\n .check-path-animated {\n stroke-dasharray: 12;\n stroke-dashoffset: 0;\n transform-origin: center;\n animation: checkDraw 0.18s ease-out, checkBounce 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);\n }\n `}</style>\n <path\n className=\"check-path-animated\"\n d=\"M4 7.1L6.1 9.2L10.4 4.9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// =============================================================================\n// Additional icons\n// =============================================================================\n\n// Copy icon (two overlapping rectangles)\nexport const IconCopyAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <rect\n x=\"4.75\"\n y=\"9.75\"\n width=\"9.5\"\n height=\"9.5\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M9.75 6.5C9.75 5.53 10.53 4.75 11.5 4.75H17.5C18.47 4.75 19.25 5.53 19.25 6.5V12.5C19.25 13.47 18.47 14.25 17.5 14.25H17\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\nexport const IconCamera = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M4.75 9C4.75 7.9 5.65 7 6.75 7H8.6C8.95 7 9.27 6.82 9.45 6.52L10.1 5.45C10.28 5.15 10.6 4.97 10.95 4.97H13.05C13.4 4.97 13.72 5.15 13.9 5.45L14.55 6.52C14.73 6.82 15.05 7 15.4 7H17.25C18.35 7 19.25 7.9 19.25 9V16.25C19.25 17.35 18.35 18.25 17.25 18.25H6.75C5.65 18.25 4.75 17.35 4.75 16.25V9Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <circle cx=\"12\" cy=\"12.25\" r=\"3.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <circle cx=\"16.85\" cy=\"9.15\" r=\"0.9\" fill=\"currentColor\" />\n </svg>\n);\n\n// Animated copy/checkmark icon\nexport const IconCopyAnimated = ({\n size = 24,\n copied = false,\n tint,\n}: {\n size?: number;\n copied?: boolean;\n tint?: string;\n}) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" style={tint ? { color: tint, transition: 'color 0.3s ease' } : undefined}>\n {/* Copy icon */}\n <g\n className={`${s.iconState} ${copied ? s.hiddenScaled : s.visibleScaled}`}\n >\n <rect\n x=\"4.75\"\n y=\"9.75\"\n width=\"9.5\"\n height=\"9.5\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M9.75 6.5C9.75 5.53 10.53 4.75 11.5 4.75H17.5C18.47 4.75 19.25 5.53 19.25 6.5V12.5C19.25 13.47 18.47 14.25 17.5 14.25H17\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </g>\n {/* Checkmark circle */}\n <g\n className={`${s.iconState} ${copied ? s.visibleScaled : s.hiddenScaled}`}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"8\"\n stroke=\"var(--bugport-widget-color-green)\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M8.5 12.25L10.75 14.5L15.5 9.75\"\n stroke=\"var(--bugport-widget-color-green)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n </svg>\n);\n\n// Animated send arrow icon (paper plane style with checkmark/error transition)\nexport const IconSendArrow = ({\n size = 24,\n state = \"idle\",\n}: {\n size?: number;\n state?: \"idle\" | \"sending\" | \"sent\" | \"failed\";\n}) => {\n const showArrow = state === \"idle\";\n const showCheck = state === \"sent\";\n const showError = state === \"failed\";\n const isSending = state === \"sending\";\n\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Send arrow (paper plane) */}\n <g\n className={`${s.iconStateFast} ${showArrow ? s.visibleScaled : isSending ? s.sending : s.hiddenScaled}`}\n >\n <path\n d=\"M19.5 4.5L4.5 10.25C3.85 10.5 3.85 11.4 4.5 11.65L10.25 13.75L12.35 19.5C12.6 20.15 13.5 20.15 13.75 19.5L19.5 4.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.25 13.75L13.5 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n {/* Green checkmark circle */}\n <g\n className={`${s.iconStateFast} ${showCheck ? s.visibleScaled : s.hiddenScaled}`}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"8\"\n stroke=\"var(--bugport-widget-color-green)\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M8.5 12.25L10.75 14.5L15.5 9.75\"\n stroke=\"var(--bugport-widget-color-green)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n {/* Red error circle with exclamation */}\n <g\n className={`${s.iconStateFast} ${showError ? s.visibleScaled : s.hiddenScaled}`}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"8\"\n stroke=\"var(--bugport-widget-color-red)\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M12 8V12.25\"\n stroke=\"var(--bugport-widget-color-red)\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <circle\n cx=\"12\"\n cy=\"15\"\n r=\"0.5\"\n fill=\"var(--bugport-widget-color-red)\"\n stroke=\"var(--bugport-widget-color-red)\"\n strokeWidth=\"1\"\n />\n </g>\n </svg>\n );\n};\n\n// Animated send/checkmark icon (for \"Send to Agent\" button)\nexport const IconSendAnimated = ({\n size = 24,\n sent = false,\n}: {\n size?: number;\n sent?: boolean;\n}) => (\n <svg width={size} height={size} viewBox=\"0 0 22 21\" fill=\"none\">\n {/* Send icon (document with arrow) */}\n <g className={`${s.iconState} ${sent ? s.hiddenScaled : s.visibleScaled}`}>\n <path\n d=\"M9.5 5H6.5C4.84 5 3.5 6.34 3.5 8V15C3.5 16.66 4.84 18 6.5 18H13.5C15.16 18 16.5 16.66 16.5 15V12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M13.5 8.5L18.5 3.5M18.5 3.5H14.5M18.5 3.5V7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7.4 13.75H12.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M7.4 10.75H10.6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </g>\n {/* Checkmark circle (success state) */}\n <g className={`${s.iconState} ${sent ? s.visibleScaled : s.hiddenScaled}`}>\n <circle\n cx=\"11\"\n cy=\"11\"\n r=\"8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M7.5 11.25L9.75 13.5L14.5 8.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n </svg>\n);\n\n// Eye icon (original)\nexport const IconEye = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 6.75C8.4 6.75 5.6 9.7 4.6 11.5C4.4 11.8 4.4 12.2 4.6 12.5C5.6 14.3 8.4 17.25 12 17.25C15.6 17.25 18.4 14.3 19.4 12.5C19.6 12.2 19.6 11.8 19.4 11.5C18.4 9.7 15.6 6.75 12 6.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"12\" cy=\"12\" r=\"2.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n);\n\n// Eye icon (alt version - larger pupil)\nexport const IconEyeAlt = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 5.5C7.8 5.5 4.85 9.4 3.9 11.3C3.7 11.75 3.7 12.25 3.9 12.7C4.85 14.6 7.8 18.5 12 18.5C16.2 18.5 19.15 14.6 20.1 12.7C20.3 12.25 20.3 11.75 20.1 11.3C19.15 9.4 16.2 5.5 12 5.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"12\" cy=\"12\" r=\"2.85\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n);\n\n// Eye closed (with slash)\nexport const IconEyeClosed = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M4 12C5.2 14 8 17 12 17C16 17 18.8 14 20 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5.25 18.75L18.75 5.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Animated eye icon that transitions between open/closed states\nexport const IconEyeAnimated = ({\n size = 24,\n isOpen = true,\n}: {\n size?: number;\n isOpen?: boolean;\n}) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Open state - full outline + pupil */}\n <g className={`${s.iconFade} ${isOpen ? s.visible : s.hidden}`}>\n <path\n d=\"M12 5.5C7.8 5.5 4.85 9.4 3.9 11.3C3.7 11.75 3.7 12.25 3.9 12.7C4.85 14.6 7.8 18.5 12 18.5C16.2 18.5 19.15 14.6 20.1 12.7C20.3 12.25 20.3 11.75 20.1 11.3C19.15 9.4 16.2 5.5 12 5.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"12\" cy=\"12\" r=\"2.85\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </g>\n {/* Closed state - arc + slash */}\n <g className={`${s.iconFade} ${isOpen ? s.hidden : s.visible}`}>\n <path\n d=\"M4 12C5.2 14 8 17 12 17C16 17 18.8 14 20 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5.25 18.75L18.75 5.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </g>\n </svg>\n);\n\n// Animated pause/play icon that transitions between states\nexport const IconPausePlayAnimated = ({\n size = 24,\n isPaused = false,\n}: {\n size?: number;\n isPaused?: boolean;\n}) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Pause bars - visible when not paused */}\n <g className={`${s.iconFadeFast} ${isPaused ? s.hidden : s.visible}`}>\n <path\n d=\"M8 6V18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M16 6V18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </g>\n {/* Play triangle - visible when paused */}\n <path\n className={`${s.iconFadeFast} ${isPaused ? s.visible : s.hidden}`}\n d=\"M8 6.25L18 12L8 17.75V6.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Eye with minus (hidden/collapsed state)\nexport const IconEyeMinus = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 6.75C8.4 6.75 5.6 9.7 4.6 11.5C4.4 11.8 4.4 12.2 4.6 12.5C5.6 14.3 8.4 17.25 12 17.25C15.6 17.25 18.4 14.3 19.4 12.5C19.6 12.2 19.6 11.8 19.4 11.5C18.4 9.7 15.6 6.75 12 6.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9.25 12H14.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Gear icon\nexport const IconGear = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M10.5 4.5H13.5L13.95 6.6C14.55 6.82 15.1 7.14 15.58 7.54L17.65 6.86L19.15 9.46L17.55 10.9C17.6 11.26 17.6 11.62 17.55 11.98L17.55 12.02C17.6 12.38 17.6 12.74 17.55 13.1L19.15 14.54L17.65 17.14L15.58 16.46C15.1 16.86 14.55 17.18 13.95 17.4L13.5 19.5H10.5L10.05 17.4C9.45 17.18 8.9 16.86 8.42 16.46L6.35 17.14L4.85 14.54L6.45 13.1C6.4 12.74 6.4 12.38 6.4 12C6.4 11.62 6.4 11.26 6.45 10.9L4.85 9.46L6.35 6.86L8.42 7.54C8.9 7.14 9.45 6.82 10.05 6.6L10.5 4.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"12\" cy=\"12\" r=\"2.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n);\n\n// Pause icon (two vertical bars - original)\nexport const IconPauseAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <rect\n x=\"5.75\"\n y=\"5.75\"\n width=\"4.5\"\n height=\"12.5\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <rect\n x=\"13.75\"\n y=\"5.75\"\n width=\"4.5\"\n height=\"12.5\"\n rx=\"1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n);\n\n// Pause icon (simple lines)\nexport const IconPause = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M8 6V18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M16 6V18\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Play icon (triangle pointing right)\nexport const IconPlayAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M8 6.25L18 12L8 17.75V6.25Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Trash can icon (filled)\nexport const IconTrashAlt = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10.5 4C9.26 4 8.25 5.01 8.25 6.25V7H5.5C5.09 7 4.75 7.34 4.75 7.75C4.75 8.16 5.09 8.5 5.5 8.5H6.04L6.42 16.4C6.47 17.42 6.5 18.04 6.62 18.55C6.95 19.96 8.1 21 9.55 21H14.45C15.9 21 17.05 19.96 17.38 18.55C17.5 18.04 17.53 17.42 17.58 16.4L17.96 8.5H18.5C18.91 8.5 19.25 8.16 19.25 7.75C19.25 7.34 18.91 7 18.5 7H15.75V6.25C15.75 5.01 14.74 4 13.5 4H10.5ZM14.25 7V6.25C14.25 5.84 13.91 5.5 13.5 5.5H10.5C10.09 5.5 9.75 5.84 9.75 6.25V7H14.25ZM10.25 11.5C10.25 11.09 9.91 10.75 9.5 10.75C9.09 10.75 8.75 11.09 8.75 11.5V16C8.75 16.41 9.09 16.75 9.5 16.75C9.91 16.75 10.25 16.41 10.25 16V11.5ZM15.25 11.5C15.25 11.09 14.91 10.75 14.5 10.75C14.09 10.75 13.75 11.09 13.75 11.5V16C13.75 16.41 14.09 16.75 14.5 16.75C14.91 16.75 15.25 16.41 15.25 16V11.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n// Chat bubble with ellipsis\nexport const IconChatEllipsis = ({\n size = 16,\n style = {},\n}: {\n size?: number;\n style?: React.CSSProperties;\n}) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 4.75C7.72 4.75 4.25 7.92 4.25 11.83C4.25 15.74 7.72 18.92 12 18.92C12.95 18.92 13.86 18.76 14.7 18.48L18.6 19.6C18.95 19.7 19.27 19.38 19.17 19.03L18.27 15.83C19 14.66 19.42 13.29 19.42 11.83C19.42 7.92 16.28 4.75 12 4.75Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={style}\n />\n <circle cx=\"15\" cy=\"11.75\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"12\" cy=\"11.75\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"11.75\" r=\"1\" fill=\"currentColor\" />\n </svg>\n);\n\n// Checkmark icon\nexport const IconCheckmark = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_2_45)\">\n <path\n d=\"M7.25 12.25L10 15L16.25 8.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_2_45\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\n// Large checkmark icon\nexport const IconCheckmarkLarge = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_2_37)\">\n <path\n d=\"M6.25 12.5L9.5 15.75L17.75 7.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_2_37\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\n// Checkmark in circle icon\nexport const IconCheckmarkCircle = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_checkmark_circle)\">\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M8.5 12.25L10.75 14.5L15.5 9.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_checkmark_circle\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\n// X mark / close icon\nexport const IconXmark = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_2_53)\">\n <path\n d=\"M7.75 7.75L16.25 16.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M16.25 7.75L7.75 16.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_2_53\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\n// X mark large / close icon (larger variant)\nexport const IconXmarkLarge = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M6.5 6.5L17.5 17.5M17.5 6.5L6.5 17.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n />\n </svg>\n);\n\n// Sun icon (light mode)\nexport const IconSun = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\">\n <circle cx=\"10\" cy=\"10\" r=\"2.75\" stroke=\"currentColor\" strokeWidth=\"1.25\" />\n <g\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 4V5.1\" />\n <path d=\"M10 14.9V16\" />\n <path d=\"M4 10H5.1\" />\n <path d=\"M14.9 10H16\" />\n <path d=\"M5.75 5.75L6.53 6.53\" />\n <path d=\"M13.47 13.47L14.25 14.25\" />\n <path d=\"M5.75 14.25L6.53 13.47\" />\n <path d=\"M13.47 6.53L14.25 5.75\" />\n </g>\n </svg>\n);\n\n// Moon icon (dark mode)\nexport const IconMoon = ({ size = 16 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M15.5 10.5C15.1 13.4 12.6 15.5 9.7 15.5C6.5 15.5 4 12.9 4 9.8C4 6.95 6.1 4.55 8.8 4.15C8.25 5.05 8 6.1 8.2 7.15C8.55 9.1 10.1 10.6 12.05 10.85C13.2 11 14.45 10.85 15.5 10.5Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.15\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Edit/pencil icon for marker hover\nexport const IconEdit = ({ size = 16 }: { size?: number }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9.1 4.65L11.35 6.9M9.1 4.65L10.05 3.7C10.67 3.08 11.68 3.08 12.3 3.7C12.92 4.32 12.92 5.33 12.3 5.95L11.35 6.9M9.1 4.65L4.55 9.2C4.42 9.33 4.33 9.49 4.29 9.67L3.7 12.3L6.33 11.71C6.51 11.67 6.67 11.58 6.8 11.45L11.35 6.9\"\n stroke=\"currentColor\"\n strokeWidth=\"0.9\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Trash icon for delete button in edit panel\nexport const IconTrash = ({ size = 24 }: { size?: number }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10.5 4C9.26 4 8.25 5.01 8.25 6.25V7H5.5C5.09 7 4.75 7.34 4.75 7.75C4.75 8.16 5.09 8.5 5.5 8.5H6.04L6.42 16.4C6.47 17.42 6.5 18.04 6.62 18.55C6.95 19.96 8.1 21 9.55 21H14.45C15.9 21 17.05 19.96 17.38 18.55C17.5 18.04 17.53 17.42 17.58 16.4L17.96 8.5H18.5C18.91 8.5 19.25 8.16 19.25 7.75C19.25 7.34 18.91 7 18.5 7H15.75V6.25C15.75 5.01 14.74 4 13.5 4H10.5ZM14.25 7V6.25C14.25 5.84 13.91 5.5 13.5 5.5H10.5C10.09 5.5 9.75 5.84 9.75 6.25V7H14.25ZM10.25 11.5C10.25 11.09 9.91 10.75 9.5 10.75C9.09 10.75 8.75 11.09 8.75 11.5V16C8.75 16.41 9.09 16.75 9.5 16.75C9.91 16.75 10.25 16.41 10.25 16V11.5ZM15.25 11.5C15.25 11.09 14.91 10.75 14.5 10.75C14.09 10.75 13.75 11.09 13.75 11.5V16C13.75 16.41 14.09 16.75 14.5 16.75C14.91 16.75 15.25 16.41 15.25 16V11.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n// Chevron icons for navigation\nexport const IconChevronLeft = ({ size = 16 }: { size?: number }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 3.5L5.5 8L10 12.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport const IconChevronRight = ({ size = 16 }: { size?: number }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 3.5L10.5 8L6 12.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n// Layout / grid icon for layout mode\nexport const IconLayout = ({ size = 24 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n <rect\n x=\"3\"\n y=\"3\"\n width=\"18\"\n height=\"18\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <line\n x1=\"3\"\n y1=\"9\"\n x2=\"21\"\n y2=\"9\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <line\n x1=\"9\"\n y1=\"9\"\n x2=\"9\"\n y2=\"21\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n);\n","// BugPort widget — original implementation. Do not copy third-party sources.\n//\n// Page \"freeze\" utility for the BugPort feedback widget.\n//\n// When the widget captures a screenshot or lets the user annotate the page it\n// needs the underlying page to hold perfectly still: no CSS animations or\n// transitions advancing, no timers mutating the DOM, no playing videos. This\n// module installs frozen-aware wrappers around the page's timing primitives and\n// exposes `freeze()` / `unfreeze()` to toggle the still state.\n//\n// The widget's own UI must keep working while the page is frozen, so it exposes\n// the genuine (un-patched) timing functions for widget code to use, and it\n// excludes its own DOM subtrees from both the CSS freeze and WAAPI pausing.\n//\n// This file intentionally has NO project-internal imports; it relies only on\n// browser globals so it can be loaded as early as possible.\n\n/* -------------------------------------------------------------------------- */\n/* Shared state */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Shape of the mutable singleton we stash on `window`. Keeping it on the global\n * means an HMR re-evaluation of this module reuses the same object instead of\n * re-patching the timing functions (which would capture already-patched\n * versions as the \"originals\").\n */\ninterface FreezeState {\n frozen: boolean;\n installed: boolean;\n origSetTimeout: Window[\"setTimeout\"];\n origSetInterval: Window[\"setInterval\"];\n origRAF: typeof requestAnimationFrame;\n pausedAnimations: Animation[];\n frozenTimeoutQueue: Array<() => void>;\n frozenRAFQueue: FrameRequestCallback[];\n}\n\nconst STATE_KEY = \"__bugport-widget_freeze\";\n\n/** Attributes whose subtrees identify widget-owned UI that must never freeze. */\nconst EXCLUDE_ATTRS = [\n \"data-feedback-toolbar\",\n \"data-annotation-popup\",\n \"data-annotation-marker\",\n] as const;\n\nconst FREEZE_STYLE_ID = \"feedback-freeze-styles\";\n\nconst LOG_PREFIX = \"[bugport-widget]\";\n\n/**\n * Returns the shared freeze state, creating + installing it on first access.\n *\n * In a window-less environment (SSR) we hand back a self-contained stub whose\n * `installed` flag is already true so the patch step is skipped, and whose\n * \"original\" timers point at the bare globals (with a no-op rAF).\n */\nfunction getState(): FreezeState {\n if (typeof window === \"undefined\") {\n return {\n frozen: false,\n installed: true,\n origSetTimeout: setTimeout as unknown as Window[\"setTimeout\"],\n origSetInterval: setInterval as unknown as Window[\"setInterval\"],\n origRAF: ((_cb: FrameRequestCallback) => 0) as typeof requestAnimationFrame,\n pausedAnimations: [],\n frozenTimeoutQueue: [],\n frozenRAFQueue: [],\n };\n }\n\n const host = window as unknown as Record<string, FreezeState | undefined>;\n let state = host[STATE_KEY];\n\n if (!state) {\n state = {\n frozen: false,\n installed: false,\n origSetTimeout: window.setTimeout.bind(window) as Window[\"setTimeout\"],\n origSetInterval: window.setInterval.bind(window) as Window[\"setInterval\"],\n origRAF: window.requestAnimationFrame.bind(\n window,\n ) as typeof requestAnimationFrame,\n pausedAnimations: [],\n frozenTimeoutQueue: [],\n frozenRAFQueue: [],\n };\n host[STATE_KEY] = state;\n }\n\n return state;\n}\n\n/* -------------------------------------------------------------------------- */\n/* Timing patches */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Replaces the global timing primitives with frozen-aware wrappers. Guarded so\n * it only runs once per real window (and never in SSR).\n */\nfunction installPatches(): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const state = getState();\n if (state.installed) {\n return;\n }\n\n const realSetTimeout = state.origSetTimeout;\n const realSetInterval = state.origSetInterval;\n const realRAF = state.origRAF;\n\n // --- setTimeout: defer firing while frozen, replay on unfreeze. ---\n const patchedSetTimeout = function (\n handler: TimerHandler,\n timeout?: number,\n ...args: unknown[]\n ): number {\n // String handlers (eval-style) are not something we can re-defer safely;\n // hand them straight to the real implementation.\n if (typeof handler === \"string\") {\n return realSetTimeout(handler, timeout) as unknown as number;\n }\n\n const fn = handler as (...a: unknown[]) => void;\n return realSetTimeout(() => {\n const live = getState();\n if (live.frozen) {\n live.frozenTimeoutQueue.push(() => fn(...args));\n return;\n }\n fn(...args);\n }, timeout) as unknown as number;\n } as unknown as Window[\"setTimeout\"];\n\n // --- setInterval: drop ticks that land while frozen (never replay). ---\n const patchedSetInterval = function (\n handler: TimerHandler,\n timeout?: number,\n ...args: unknown[]\n ): number {\n if (typeof handler === \"string\") {\n return realSetInterval(handler, timeout) as unknown as number;\n }\n\n const fn = handler as (...a: unknown[]) => void;\n return realSetInterval(() => {\n if (getState().frozen) {\n return;\n }\n fn(...args);\n }, timeout) as unknown as number;\n } as unknown as Window[\"setInterval\"];\n\n // --- requestAnimationFrame: queue frames while frozen, replay on unfreeze. ---\n const patchedRAF = function (callback: FrameRequestCallback): number {\n return realRAF((timestamp: number) => {\n const live = getState();\n if (live.frozen) {\n live.frozenRAFQueue.push(callback);\n return;\n }\n callback(timestamp);\n });\n } as typeof requestAnimationFrame;\n\n // Cast through `unknown` when assigning: ambient @types/node augments the\n // global timers with extra overloads (e.g. `__promisify__`) that the DOM\n // signature does not carry, which would otherwise reject these assignments.\n const target = window as unknown as {\n setTimeout: unknown;\n setInterval: unknown;\n requestAnimationFrame: unknown;\n };\n target.setTimeout = patchedSetTimeout;\n target.setInterval = patchedSetInterval;\n target.requestAnimationFrame = patchedRAF;\n\n state.installed = true;\n}\n\n// Importing the module installs the patches as a side effect.\ninstallPatches();\n\n/* -------------------------------------------------------------------------- */\n/* Public timing exports (genuine originals) */\n/* -------------------------------------------------------------------------- */\n\nexport const originalSetTimeout: Window[\"setTimeout\"] =\n getState().origSetTimeout;\n\nexport const originalSetInterval: Window[\"setInterval\"] =\n getState().origSetInterval;\n\nexport const originalRequestAnimationFrame: typeof requestAnimationFrame =\n getState().origRAF;\n\n/* -------------------------------------------------------------------------- */\n/* DOM helpers */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Builds the `:not()` chain that exempts widget UI from the freeze rule.\n * For each excluded attribute we skip both the element itself and any\n * descendant of it.\n */\nfunction buildExclusionChain(): string {\n return EXCLUDE_ATTRS.map(\n (attr) => `:not([${attr}]):not([${attr}] *)`,\n ).join(\"\");\n}\n\n/** True when `el` lives inside (or is) a widget-owned subtree. */\nfunction isBugportWidgetElement(el: Element | null): boolean {\n if (!el) {\n return false;\n }\n for (const attr of EXCLUDE_ATTRS) {\n if (el.closest?.(`[${attr}]`)) {\n return true;\n }\n }\n return false;\n}\n\n/** Resolves the DOM element targeted by a WAAPI animation, if any. */\nfunction animationTarget(anim: Animation): Element | null {\n const effect = anim.effect as AnimationEffect & { target?: Element | null };\n // KeyframeEffect.target carries the element. We read it defensively rather\n // than relying on `instanceof KeyframeEffect`, which is absent in some test\n // environments (jsdom) and on non-keyframe effects.\n const target = effect?.target;\n return target instanceof Element ? target : null;\n}\n\n/**\n * Injects (or refreshes) the freeze stylesheet. The rule pauses animations and\n * disables transitions on everything except widget UI.\n */\nfunction applyFreezeStyles(): void {\n const exclusion = buildExclusionChain();\n const selector = `*${exclusion}, *${exclusion}::before, *${exclusion}::after`;\n const css = `${selector} { animation-play-state: paused !important; transition: none !important; }`;\n\n let styleEl = document.getElementById(\n FREEZE_STYLE_ID,\n ) as HTMLStyleElement | null;\n\n if (!styleEl) {\n styleEl = document.createElement(\"style\");\n styleEl.id = FREEZE_STYLE_ID;\n document.head.appendChild(styleEl);\n }\n\n styleEl.textContent = css;\n}\n\n/** Removes the freeze stylesheet if it is present. */\nfunction removeFreezeStyles(): void {\n const styleEl = document.getElementById(FREEZE_STYLE_ID);\n if (styleEl?.parentNode) {\n styleEl.parentNode.removeChild(styleEl);\n }\n}\n\n/* -------------------------------------------------------------------------- */\n/* freeze / unfreeze */\n/* -------------------------------------------------------------------------- */\n\nexport function freeze(): void {\n if (typeof document === \"undefined\") {\n return;\n }\n\n const state = getState();\n if (state.frozen) {\n return;\n }\n\n state.frozen = true;\n state.frozenTimeoutQueue = [];\n state.frozenRAFQueue = [];\n\n // 1. CSS-level freeze for the whole (non-widget) page.\n applyFreezeStyles();\n\n // 2. Pause running WAAPI animations on non-widget elements.\n try {\n const animations = document.getAnimations();\n for (const anim of animations) {\n if (anim.playState !== \"running\") {\n continue;\n }\n if (isBugportWidgetElement(animationTarget(anim))) {\n continue;\n }\n anim.pause();\n state.pausedAnimations.push(anim);\n }\n } catch {\n // getAnimations() may be unavailable (older browsers / jsdom). Ignore.\n }\n\n // 3. Pause any playing videos, remembering which ones we touched.\n const videos = document.querySelectorAll(\"video\");\n videos.forEach((video) => {\n if (!video.paused) {\n video.pause();\n video.dataset.wasPaused = \"false\";\n }\n });\n}\n\nexport function unfreeze(): void {\n if (typeof document === \"undefined\") {\n return;\n }\n\n const state = getState();\n if (!state.frozen) {\n return;\n }\n\n state.frozen = false;\n\n // 1. Replay deferred setTimeout callbacks via the genuine setTimeout.\n const pendingTimeouts = state.frozenTimeoutQueue;\n state.frozenTimeoutQueue = [];\n for (const queued of pendingTimeouts) {\n state.origSetTimeout(() => {\n const live = getState();\n // Re-frozen between scheduling and firing? Defer again.\n if (live.frozen) {\n live.frozenTimeoutQueue.push(queued);\n return;\n }\n try {\n queued();\n } catch (error) {\n console.warn(`${LOG_PREFIX} Error replaying queued timeout:`, error);\n }\n }, 0);\n }\n\n // 2. Replay deferred animation-frame callbacks via the genuine rAF.\n const pendingFrames = state.frozenRAFQueue;\n state.frozenRAFQueue = [];\n for (const queued of pendingFrames) {\n state.origRAF((timestamp: number) => {\n const live = getState();\n if (live.frozen) {\n live.frozenRAFQueue.push(queued);\n return;\n }\n queued(timestamp);\n });\n }\n\n // 3. Resume exactly the animations we paused — BEFORE touching the CSS so the\n // browser does not swap the underlying animation objects on us.\n for (const anim of state.pausedAnimations) {\n try {\n anim.play();\n } catch (error) {\n console.warn(`${LOG_PREFIX} Error resuming animation:`, error);\n }\n }\n state.pausedAnimations = [];\n\n // 4. Drop the freeze stylesheet.\n removeFreezeStyles();\n\n // 5. Resume the videos we paused, and clear our marker.\n const videos = document.querySelectorAll(\"video\");\n videos.forEach((video) => {\n if (video.dataset.wasPaused === \"false\") {\n void video.play().catch(() => {\n // Autoplay may be blocked; nothing actionable.\n });\n delete video.dataset.wasPaused;\n }\n });\n}\n","// BugPort widget — original implementation. Do not copy third-party sources.\n\n/**\n * Utilities for producing human-readable descriptions of DOM elements, walking\n * ancestry across shadow boundaries, and snapshotting computed styles. Depends\n * only on standard browser DOM APIs — no package-internal imports.\n */\n\n// Shadow-boundary marker. U+27E8 / U+27E9 angle brackets plus a trailing space.\nconst SHADOW_MARK = '⟨shadow⟩ ';\n\n// Style values we treat as \"uninteresting\" and never emit.\nconst DEFAULT_STYLE_VALUES = new Set<string>([\n 'none',\n 'normal',\n 'auto',\n '0px',\n 'rgba(0, 0, 0, 0)',\n 'transparent',\n 'static',\n 'visible',\n]);\n\n// Forensic dump iterates exactly these props, in this order.\nconst FORENSIC_PROPERTIES = [\n 'color',\n 'backgroundColor',\n 'borderColor',\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'lineHeight',\n 'letterSpacing',\n 'textAlign',\n 'width',\n 'height',\n 'padding',\n 'margin',\n 'border',\n 'borderRadius',\n 'display',\n 'position',\n 'top',\n 'right',\n 'bottom',\n 'left',\n 'zIndex',\n 'flexDirection',\n 'justifyContent',\n 'alignItems',\n 'gap',\n 'opacity',\n 'visibility',\n 'overflow',\n 'boxShadow',\n 'transform',\n] as const;\n\nconst TEXT_ELEMENTS = new Set<string>([\n 'p',\n 'span',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'label',\n 'li',\n 'td',\n 'th',\n 'blockquote',\n 'figcaption',\n 'caption',\n 'legend',\n 'dt',\n 'dd',\n 'pre',\n 'code',\n 'em',\n 'strong',\n 'b',\n 'i',\n 'a',\n 'time',\n 'cite',\n 'q',\n]);\n\nconst FORM_INPUT_ELEMENTS = new Set<string>(['input', 'textarea', 'select']);\n\nconst MEDIA_ELEMENTS = new Set<string>(['img', 'video', 'canvas', 'svg']);\n\nconst CONTAINER_ELEMENTS = new Set<string>([\n 'div',\n 'section',\n 'article',\n 'nav',\n 'header',\n 'footer',\n 'aside',\n 'main',\n 'ul',\n 'ol',\n 'form',\n 'fieldset',\n]);\n\n// Tags treated as \"containers\" by identifyElement's class-derived naming.\nconst NAMING_CONTAINERS = new Set<string>([\n 'div',\n 'section',\n 'article',\n 'nav',\n 'header',\n 'footer',\n 'aside',\n 'main',\n]);\n\n/**\n * Module-private ancestry step that transparently crosses shadow boundaries.\n * Falls back to the shadow host when an element has no light-DOM parent but\n * lives inside a ShadowRoot.\n */\nfunction getParentElement(element: Element): Element | null {\n if (element.parentElement) {\n return element.parentElement;\n }\n const root = element.getRootNode();\n if (root instanceof ShadowRoot) {\n return root.host;\n }\n return null;\n}\n\nfunction camelToKebab(name: string): string {\n return name.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\n\nfunction tagOf(element: Element): string {\n return element.tagName.toLowerCase();\n}\n\n/** Safely read className as a string, or '' when it isn't a string. */\nfunction classNameString(element: Element): string {\n const raw = (element as { className?: unknown }).className;\n return typeof raw === 'string' ? raw : '';\n}\n\nexport function closestCrossingShadow(\n element: Element,\n selector: string,\n): Element | null {\n let current: Element | null = element;\n while (current) {\n if (current.matches(selector)) {\n return current;\n }\n current = getParentElement(current);\n }\n return null;\n}\n\nexport function isInShadowDOM(element: Element): boolean {\n return element.getRootNode() instanceof ShadowRoot;\n}\n\nexport function getShadowHost(element: Element): Element | null {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root.host : null;\n}\n\nexport function getElementPath(target: HTMLElement, maxDepth = 4): string {\n const parts: string[] = [];\n let current: Element | null = target;\n let depth = 0;\n\n while (current && depth < maxDepth) {\n const tag = tagOf(current);\n if (tag === 'html' || tag === 'body') {\n break;\n }\n\n let identifier: string;\n const id = current.id;\n const classes = classNameString(current);\n\n if (id) {\n identifier = `#${id}`;\n } else if (classes) {\n const picked = classes\n .split(/\\s+/)\n .find(\n (cls) =>\n cls.length > 2 &&\n !/^[a-z]{1,2}$/.test(cls) &&\n !/[A-Z0-9]{5,}/.test(cls),\n );\n identifier = picked ? `.${picked.split('_')[0]}` : tag;\n } else {\n identifier = tag;\n }\n\n if (!current.parentElement && getParentElement(current)) {\n identifier = `${SHADOW_MARK}${identifier}`;\n }\n\n parts.unshift(identifier);\n current = getParentElement(current);\n depth += 1;\n }\n\n return parts.join(' > ');\n}\n\nexport function identifyElement(target: HTMLElement): {\n name: string;\n path: string;\n} {\n const path = getElementPath(target);\n const tag = tagOf(target);\n\n const name = ((): string => {\n // (1) explicit override\n if (target.dataset.element) {\n return target.dataset.element;\n }\n\n // (2) svg leaf graphics\n if (\n tag === 'path' ||\n tag === 'circle' ||\n tag === 'rect' ||\n tag === 'line' ||\n tag === 'g'\n ) {\n const svg = closestCrossingShadow(target, 'svg');\n if (svg) {\n const svgParent = getParentElement(svg);\n if (svgParent instanceof HTMLElement) {\n return `graphic in ${identifyElement(svgParent).name}`;\n }\n }\n return 'graphic element';\n }\n\n // (3) svg root\n if (tag === 'svg') {\n const parent = getParentElement(target);\n if (parent && tagOf(parent) === 'button') {\n const btnText = parent.textContent?.trim() ?? '';\n return btnText ? `icon in \"${btnText}\" button` : 'button icon';\n }\n return 'icon';\n }\n\n // (4) button\n if (tag === 'button') {\n const ariaLabel = target.getAttribute('aria-label');\n if (ariaLabel) {\n return `button [${ariaLabel}]`;\n }\n const text = target.textContent?.trim() ?? '';\n return text ? `button \"${text.slice(0, 25)}\"` : 'button';\n }\n\n // (5) anchor\n if (tag === 'a') {\n const text = target.textContent?.trim() ?? '';\n if (text) {\n return `link \"${text.slice(0, 25)}\"`;\n }\n const href = target.getAttribute('href');\n if (href) {\n return `link to ${href.slice(0, 30)}`;\n }\n return 'link';\n }\n\n // (6) input\n if (tag === 'input') {\n const type = target.getAttribute('type') || 'text';\n const placeholder = target.getAttribute('placeholder');\n if (placeholder) {\n return `input \"${placeholder}\"`;\n }\n const nameAttr = target.getAttribute('name');\n if (nameAttr) {\n return `input [${nameAttr}]`;\n }\n return `${type} input`;\n }\n\n // (7) headings\n if (/^h[1-6]$/.test(tag)) {\n const text = target.textContent?.trim() ?? '';\n return text ? `${tag} \"${text.slice(0, 35)}\"` : tag;\n }\n\n // (8) paragraph\n if (tag === 'p') {\n const text = target.textContent?.trim() ?? '';\n if (!text) {\n return 'paragraph';\n }\n const ellipsis = text.length > 40 ? '...' : '';\n return `paragraph: \"${text.slice(0, 40)}${ellipsis}\"`;\n }\n\n // (9) span / label\n if (tag === 'span' || tag === 'label') {\n const text = target.textContent?.trim() ?? '';\n return text.length < 40 && text ? `\"${text}\"` : tag;\n }\n\n // (10) list item\n if (tag === 'li') {\n const text = target.textContent?.trim() ?? '';\n return text.length < 40 && text\n ? `list item: \"${text.slice(0, 35)}\"`\n : 'list item';\n }\n\n // (11) blockquote\n if (tag === 'blockquote') {\n return 'blockquote';\n }\n\n // (12) code\n if (tag === 'code') {\n const text = target.textContent?.trim() ?? '';\n return text.length < 30 && text ? `code: \\`${text}\\`` : 'code';\n }\n\n // (13) pre\n if (tag === 'pre') {\n return 'code block';\n }\n\n // (14) image\n if (tag === 'img') {\n const alt = target.getAttribute('alt');\n return alt ? `image \"${alt.slice(0, 30)}\"` : 'image';\n }\n\n // (15) video\n if (tag === 'video') {\n return 'video';\n }\n\n // (16) containers\n if (NAMING_CONTAINERS.has(tag)) {\n const ariaLabel = target.getAttribute('aria-label');\n if (ariaLabel) {\n return `${tag} [${ariaLabel}]`;\n }\n const role = target.getAttribute('role');\n if (role) {\n return role;\n }\n const classes = classNameString(target);\n if (classes) {\n const derived = classes\n .split(/[\\s_-]+/)\n .map((token) => token.replace(/[A-Z0-9]{5,}.*$/, ''))\n .filter((token) => token.length > 2 && !/^[a-z]{1,2}$/.test(token))\n .slice(0, 2)\n .join(' ');\n if (derived) {\n return derived;\n }\n }\n return tag === 'div' ? 'container' : tag;\n }\n\n // (17) default\n return tag;\n })();\n\n return { name, path };\n}\n\nexport function getNearbyText(element: HTMLElement): string {\n const parts: string[] = [];\n\n const ownText = element.textContent?.trim() ?? '';\n if (ownText && ownText.length < 100) {\n parts.push(ownText);\n }\n\n const prev = element.previousElementSibling;\n if (prev) {\n const prevText = prev.textContent?.trim() ?? '';\n if (prevText && prevText.length < 50) {\n parts.unshift(`[before: \"${prevText.slice(0, 40)}\"]`);\n }\n }\n\n const next = element.nextElementSibling;\n if (next) {\n const nextText = next.textContent?.trim() ?? '';\n if (nextText && nextText.length < 50) {\n parts.push(`[after: \"${nextText.slice(0, 40)}\"]`);\n }\n }\n\n return parts.join(' ');\n}\n\nexport function identifyAnimationElement(target: HTMLElement): string {\n if (target.dataset.element) {\n return target.dataset.element;\n }\n\n const tag = tagOf(target);\n\n const svgMap: Record<string, string> = {\n path: 'path',\n circle: 'circle',\n rect: 'rectangle',\n line: 'line',\n ellipse: 'ellipse',\n polygon: 'polygon',\n g: 'group',\n svg: 'svg',\n };\n if (svgMap[tag]) {\n return svgMap[tag];\n }\n\n if (tag === 'button') {\n const text = target.textContent?.trim() ?? '';\n return text ? `button \"${text}\"` : 'button';\n }\n\n if (tag === 'input') {\n const type = target.getAttribute('type') || 'text';\n return `input (${type})`;\n }\n\n if (tag === 'span' || tag === 'p' || tag === 'label') {\n const text = target.textContent?.trim() ?? '';\n return text.length < 30 && text ? `\"${text}\"` : 'text';\n }\n\n if (tag === 'div') {\n const classes = classNameString(target);\n if (classes) {\n const derived = classes\n .split(/[\\s_-]+/)\n .map((token) => token.replace(/[A-Z0-9]{5,}.*$/, ''))\n .filter((token) => token.length > 2 && !/^[a-z]{1,2}$/.test(token))\n .slice(0, 2)\n .join(' ');\n if (derived) {\n return derived;\n }\n }\n return 'container';\n }\n\n return tag;\n}\n\nexport function getNearbyElements(element: HTMLElement): string {\n const parent = getParentElement(element);\n if (!parent) {\n return '';\n }\n\n const childSource =\n element.getRootNode() instanceof ShadowRoot && element.parentElement\n ? Array.from(element.parentElement.children)\n : Array.from(parent.children);\n\n const siblings = childSource.filter(\n (child): child is HTMLElement =>\n child !== element && child instanceof HTMLElement,\n );\n\n if (siblings.length === 0) {\n return '';\n }\n\n const pickClass = (raw: string): string | undefined =>\n raw\n .split(/\\s+/)\n .map((token) => token.replace(/[_][a-zA-Z0-9]{5,}.*$/, ''))\n .find((token) => token.length > 2 && !/^[a-z]{1,2}$/.test(token));\n\n const siblingIds = siblings.slice(0, 4).map((sibling) => {\n const sTag = tagOf(sibling);\n let id = sTag;\n const classes = classNameString(sibling);\n if (classes) {\n const cls = pickClass(classes);\n if (cls) {\n id = `${sTag}.${cls}`;\n }\n }\n if (sTag === 'button' || sTag === 'a') {\n const text = (sibling.textContent?.trim() ?? '').slice(0, 15);\n if (text) {\n id += ` \"${text}\"`;\n }\n }\n return id;\n });\n\n const parentTag = tagOf(parent);\n let parentId = parentTag;\n const parentClasses = classNameString(parent);\n if (parentClasses) {\n const cls = pickClass(parentClasses);\n if (cls) {\n parentId = `${parentTag}.${cls}`;\n }\n }\n\n const total = parent.children.length;\n let suffix = '';\n if (total > siblingIds.length + 1) {\n suffix = ` (${total} total in ${parentId})`;\n }\n\n return siblingIds.join(', ') + suffix;\n}\n\nexport function getElementClasses(target: HTMLElement): string {\n const raw = (target as { className?: unknown }).className;\n if (typeof raw !== 'string' || raw.length === 0) {\n return '';\n }\n\n const seen = new Set<string>();\n const cleaned: string[] = [];\n\n for (const cls of raw.split(/\\s+/)) {\n if (!cls) {\n continue;\n }\n const match = cls.match(\n /^([a-zA-Z][a-zA-Z0-9_-]*?)(?:_[a-zA-Z0-9]{5,})?$/,\n );\n const name = match ? match[1] : cls;\n if (!seen.has(name)) {\n seen.add(name);\n cleaned.push(name);\n }\n }\n\n return cleaned.join(', ');\n}\n\nexport function getComputedStylesSnapshot(target: HTMLElement): string {\n if (typeof window === 'undefined') {\n return '';\n }\n\n const styles = window.getComputedStyle(target);\n const parts: string[] = [];\n\n if (styles.color && styles.color !== 'rgb(0, 0, 0)') {\n parts.push(`color: ${styles.color}`);\n }\n const bg = styles.backgroundColor;\n if (bg && bg !== 'rgba(0, 0, 0, 0)' && bg !== 'transparent') {\n parts.push(`bg: ${bg}`);\n }\n if (styles.fontSize) {\n parts.push(`font: ${styles.fontSize}`);\n }\n if (\n styles.fontWeight &&\n styles.fontWeight !== '400' &&\n styles.fontWeight !== 'normal'\n ) {\n parts.push(`weight: ${styles.fontWeight}`);\n }\n if (styles.padding && styles.padding !== '0px') {\n parts.push(`padding: ${styles.padding}`);\n }\n if (styles.margin && styles.margin !== '0px') {\n parts.push(`margin: ${styles.margin}`);\n }\n if (\n styles.display &&\n styles.display !== 'block' &&\n styles.display !== 'inline'\n ) {\n parts.push(`display: ${styles.display}`);\n }\n if (styles.position && styles.position !== 'static') {\n parts.push(`position: ${styles.position}`);\n }\n if (styles.borderRadius && styles.borderRadius !== '0px') {\n parts.push(`radius: ${styles.borderRadius}`);\n }\n\n return parts.join(', ');\n}\n\nexport function getDetailedComputedStyles(\n target: HTMLElement,\n): Record<string, string> {\n if (typeof window === 'undefined') {\n return {};\n }\n\n const tag = tagOf(target);\n let properties: string[];\n\n if (TEXT_ELEMENTS.has(tag)) {\n properties = ['color', 'fontSize', 'fontWeight', 'fontFamily', 'lineHeight'];\n } else if (\n tag === 'button' ||\n (tag === 'a' && target.getAttribute('role') === 'button')\n ) {\n properties = [\n 'backgroundColor',\n 'color',\n 'padding',\n 'borderRadius',\n 'fontSize',\n ];\n } else if (FORM_INPUT_ELEMENTS.has(tag)) {\n properties = [\n 'backgroundColor',\n 'color',\n 'padding',\n 'borderRadius',\n 'fontSize',\n ];\n } else if (MEDIA_ELEMENTS.has(tag)) {\n properties = ['width', 'height', 'objectFit', 'borderRadius'];\n } else if (CONTAINER_ELEMENTS.has(tag)) {\n properties = ['display', 'padding', 'margin', 'gap', 'backgroundColor'];\n } else {\n properties = ['color', 'fontSize', 'margin', 'padding', 'backgroundColor'];\n }\n\n const styles = window.getComputedStyle(target);\n const result: Record<string, string> = {};\n\n for (const prop of properties) {\n const value = styles.getPropertyValue(camelToKebab(prop));\n if (value && !DEFAULT_STYLE_VALUES.has(value)) {\n result[prop] = value;\n }\n }\n\n return result;\n}\n\nexport function getForensicComputedStyles(target: HTMLElement): string {\n if (typeof window === 'undefined') {\n return '';\n }\n\n const styles = window.getComputedStyle(target);\n const parts: string[] = [];\n\n for (const prop of FORENSIC_PROPERTIES) {\n const kebab = camelToKebab(prop);\n const value = styles.getPropertyValue(kebab);\n if (value && !DEFAULT_STYLE_VALUES.has(value)) {\n parts.push(`${kebab}: ${value}`);\n }\n }\n\n return parts.join('; ');\n}\n\nexport function parseComputedStylesString(\n stylesStr: string | undefined,\n): Record<string, string> | undefined {\n if (!stylesStr) {\n return undefined;\n }\n\n const result: Record<string, string> = {};\n\n for (const segment of stylesStr.split(';')) {\n const part = segment.trim();\n if (!part) {\n continue;\n }\n const colonIndex = part.indexOf(':');\n if (colonIndex > 0) {\n const key = part.slice(0, colonIndex).trim();\n const value = part.slice(colonIndex + 1).trim();\n if (key && value) {\n result[key] = value;\n }\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nexport function getAccessibilityInfo(target: HTMLElement): string {\n const parts: string[] = [];\n\n const role = target.getAttribute('role');\n if (role) {\n parts.push(`role=\"${role}\"`);\n }\n const ariaLabel = target.getAttribute('aria-label');\n if (ariaLabel) {\n parts.push(`aria-label=\"${ariaLabel}\"`);\n }\n const ariaDescribedBy = target.getAttribute('aria-describedby');\n if (ariaDescribedBy) {\n parts.push(`aria-describedby=\"${ariaDescribedBy}\"`);\n }\n const tabindex = target.getAttribute('tabindex');\n if (tabindex !== null) {\n parts.push(`tabindex=${tabindex}`);\n }\n if (target.getAttribute('aria-hidden') === 'true') {\n parts.push('aria-hidden');\n }\n\n if (target.matches('a, button, input, select, textarea, [tabindex]')) {\n parts.push('focusable');\n }\n\n return parts.join(', ');\n}\n\nexport function getFullElementPath(target: HTMLElement): string {\n const parts: string[] = [];\n let current: Element | null = target;\n\n while (current) {\n const tag = tagOf(current);\n if (tag === 'html') {\n break;\n }\n\n let identifier: string;\n const id = current.id;\n const classes = classNameString(current);\n\n if (id) {\n identifier = `${tag}#${id}`;\n } else if (classes) {\n const cls = classes\n .split(/\\s+/)\n .map((token) => token.replace(/[_][a-zA-Z0-9]{5,}.*$/, ''))\n .find((token) => token.length > 2);\n identifier = cls ? `${tag}.${cls}` : tag;\n } else {\n identifier = tag;\n }\n\n if (!current.parentElement && getParentElement(current)) {\n identifier = `${SHADOW_MARK}${identifier}`;\n }\n\n parts.unshift(identifier);\n current = getParentElement(current);\n }\n\n return parts.join(' > ');\n}\n","// BugPort widget — original implementation. Do not copy third-party sources.\n//\n// Persistence helpers for the BugPort widget. Annotations and a per-tab toolbar\n// flag are kept in web storage. Every reader degrades to a safe default under\n// SSR or on any failure, and every writer is a silent no-op when storage is\n// unavailable.\n\nimport type { Annotation } from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Key prefixes — these literal strings are a persistence contract shared with\n// previously shipped versions and across importing components. Do not change.\n// ---------------------------------------------------------------------------\n\nconst ANNOTATIONS_PREFIX = \"feedback-annotations-\";\n\n/** Key under sessionStorage for the per-tab toolbar-hidden flag. */\nconst TOOLBAR_HIDDEN_KEY = \"bugport-widget-session-toolbar-hidden\";\n\n/** Sentinel value persisted when the toolbar is hidden. */\nconst TOOLBAR_HIDDEN_FLAG = \"1\";\n\n/** Annotations older than this many days are dropped on read. */\nconst DEFAULT_RETENTION_DAYS = 7;\n\n// ---------------------------------------------------------------------------\n// Small internal utilities\n// ---------------------------------------------------------------------------\n\n/** True when running outside a browser (e.g. server-side rendering). */\nfunction isServerSide(): boolean {\n return typeof window === \"undefined\";\n}\n\n/** Timestamp before which annotations are considered stale, evaluated now. */\nfunction retentionCutoff(): number {\n const msPerDay = 24 * 60 * 60 * 1000;\n return Date.now() - DEFAULT_RETENTION_DAYS * msPerDay;\n}\n\n/**\n * Decide whether a single annotation-like record survives retention. An entry\n * is kept when it carries no numeric `timestamp`, or when that timestamp is\n * strictly newer than the cutoff.\n */\nfunction isWithinRetention(entry: unknown, cutoff: number): boolean {\n if (entry === null || typeof entry !== \"object\") {\n return true;\n }\n const stamp = (entry as { timestamp?: unknown }).timestamp;\n if (typeof stamp !== \"number\") {\n return true;\n }\n return stamp > cutoff;\n}\n\n/**\n * Parse a stored JSON array and apply the retention filter. Anything that is\n * not an array yields an empty list.\n */\nfunction parseAndFilter<T>(raw: string): T[] {\n const parsed = JSON.parse(raw);\n if (!Array.isArray(parsed)) {\n return [];\n }\n const cutoff = retentionCutoff();\n return parsed.filter((item) => isWithinRetention(item, cutoff)) as T[];\n}\n\n// ---------------------------------------------------------------------------\n// Annotation key + core load/save/clear\n// ---------------------------------------------------------------------------\n\nexport function getStorageKey(pathname: string): string {\n return ANNOTATIONS_PREFIX + pathname;\n}\n\nexport function loadAnnotations<T = Annotation>(pathname: string): T[] {\n if (isServerSide()) {\n return [];\n }\n try {\n const raw = window.localStorage.getItem(getStorageKey(pathname));\n if (raw === null) {\n return [];\n }\n return parseAndFilter<T>(raw);\n } catch {\n return [];\n }\n}\n\nexport function saveAnnotations<T = Annotation>(\n pathname: string,\n annotations: T[]\n): void {\n if (isServerSide()) {\n return;\n }\n try {\n window.localStorage.setItem(\n getStorageKey(pathname),\n JSON.stringify(annotations)\n );\n } catch {\n // Storage may be full or disabled — intentionally ignore.\n }\n}\n\nexport function clearAnnotations(pathname: string): void {\n if (isServerSide()) {\n return;\n }\n try {\n window.localStorage.removeItem(getStorageKey(pathname));\n } catch {\n // Ignore removal failures.\n }\n}\n\n/**\n * Walk every localStorage key, gather annotation buckets, filter each by\n * retention and return a Map keyed by pathname. Buckets that end up empty are\n * left out. Any thrown error halts iteration and returns what was gathered.\n */\nexport function loadAllAnnotations<T = Annotation>(): Map<string, T[]> {\n const collected = new Map<string, T[]>();\n if (isServerSide()) {\n return collected;\n }\n try {\n const store = window.localStorage;\n for (let index = 0; index < store.length; index += 1) {\n const key = store.key(index);\n if (key === null || !key.startsWith(ANNOTATIONS_PREFIX)) {\n continue;\n }\n const raw = store.getItem(key);\n if (raw === null) {\n continue;\n }\n const filtered = parseAndFilter<T>(raw);\n if (filtered.length > 0) {\n const pathname = key.slice(ANNOTATIONS_PREFIX.length);\n collected.set(pathname, filtered);\n }\n }\n } catch {\n // Return whatever made it into the Map before the failure.\n }\n return collected;\n}\n\n// ---------------------------------------------------------------------------\n// Toolbar visibility — per-tab, stored in sessionStorage\n// ---------------------------------------------------------------------------\n\nexport function loadToolbarHidden(): boolean {\n if (isServerSide()) {\n return false;\n }\n try {\n return (\n window.sessionStorage.getItem(TOOLBAR_HIDDEN_KEY) === TOOLBAR_HIDDEN_FLAG\n );\n } catch {\n return false;\n }\n}\n\nexport function saveToolbarHidden(hidden: boolean): void {\n if (isServerSide()) {\n return;\n }\n try {\n if (hidden) {\n window.sessionStorage.setItem(TOOLBAR_HIDDEN_KEY, TOOLBAR_HIDDEN_FLAG);\n } else {\n window.sessionStorage.removeItem(TOOLBAR_HIDDEN_KEY);\n }\n } catch {\n // Ignore.\n }\n}\n","// BugPort widget — original implementation. Do not copy third-party sources.\n\n/**\n * React detection utilities.\n *\n * This module inspects a live DOM tree to figure out whether a page is driven\n * by React, and — given a concrete element — walks the React fiber tree to\n * surface a chain of human-meaningful component names. Everything here is\n * self-contained: no external imports, all fiber typings and tag tables are\n * declared inline.\n */\n\n/* ------------------------------------------------------------------ *\n * Internal fiber typings\n * ------------------------------------------------------------------ */\n\ninterface ComponentType {\n name?: string;\n displayName?: string;\n render?: { name?: string; displayName?: string };\n type?: ComponentType;\n _context?: { displayName?: string };\n _status?: number;\n _result?: ComponentType;\n $$typeof?: symbol;\n}\n\ninterface ReactFiber {\n tag: number;\n type: ComponentType | string | null;\n elementType: ComponentType | null;\n return: ReactFiber | null;\n}\n\n/**\n * React work tags. These numbers come straight from React's internal\n * `ReactWorkTags` enumeration and must line up exactly with the runtime.\n */\nconst FiberTags = {\n FunctionComponent: 0,\n ClassComponent: 1,\n IndeterminateComponent: 2,\n HostRoot: 3,\n HostPortal: 4,\n HostComponent: 5,\n HostText: 6,\n Fragment: 7,\n Mode: 8,\n ContextConsumer: 9,\n ContextProvider: 10,\n ForwardRef: 11,\n Profiler: 12,\n SuspenseComponent: 13,\n MemoComponent: 14,\n SimpleMemoComponent: 15,\n LazyComponent: 16,\n IncompleteClassComponent: 17,\n DehydratedFragment: 18,\n SuspenseListComponent: 19,\n // 20 is intentionally absent.\n ScopeComponent: 21,\n OffscreenComponent: 22,\n LegacyHiddenComponent: 23,\n CacheComponent: 24,\n TracingMarkerComponent: 25,\n HostHoistable: 26,\n HostSingleton: 27,\n IncompleteFunctionComponent: 28,\n Throw: 29,\n ViewTransitionComponent: 30,\n ActivityComponent: 31,\n} as const;\n\n/* ------------------------------------------------------------------ *\n * Public types\n * ------------------------------------------------------------------ */\n\nexport type ReactDetectionMode = \"all\" | \"filtered\" | \"smart\";\n\nexport interface ReactDetectionConfig {\n maxComponents?: number;\n maxDepth?: number;\n mode?: ReactDetectionMode;\n skipExact?: Set<string> | string[];\n skipPatterns?: RegExp[];\n userPatterns?: RegExp[];\n filter?: (name: string, depth: number) => boolean;\n}\n\nexport interface ReactComponentInfo {\n path: string | null;\n components: string[];\n}\n\n/* ------------------------------------------------------------------ *\n * Default skip configuration (exported)\n * ------------------------------------------------------------------ */\n\n/**\n * Exact component names that are always considered framework noise. Consumers\n * may read or merge this set; it is shared module state, so treat it as\n * read-only.\n */\nexport const DEFAULT_SKIP_EXACT: Set<string> = new Set([\n \"Component\",\n \"PureComponent\",\n \"Fragment\",\n \"Suspense\",\n \"Profiler\",\n \"StrictMode\",\n \"Routes\",\n \"Route\",\n \"Outlet\",\n \"Root\",\n \"ErrorBoundaryHandler\",\n \"HotReload\",\n \"Hot\",\n]);\n\n/**\n * Regex signatures for framework-internal component names. Each pattern is\n * deliberately narrow so genuine app components (e.g. `ServerStatus`,\n * `ClientProfile`) are not swept up. A name is skipped if any pattern matches.\n */\nexport const DEFAULT_SKIP_PATTERNS: RegExp[] = [\n /Boundary$/,\n /BoundaryHandler$/,\n /Provider$/,\n /Consumer$/,\n /^(Inner|Outer)/,\n /Router$/,\n /^Client(Page|Segment|Root)/,\n /^Segment(ViewNode|Node)$/,\n /^LayoutSegment/,\n /^Server(Root|Component|Render)/,\n /^RSC/,\n /Context$/,\n /^Hot(Reload)?$/,\n /^(Dev|React)(Overlay|Tools|Root)/,\n /Overlay$/,\n /Handler$/,\n /^With[A-Z]/,\n /Wrapper$/,\n /^Root$/,\n];\n\n/**\n * Fallback heuristics for \"looks like a user-authored component\", consulted by\n * smart mode when DOM correlation comes up empty. Internal only.\n */\nconst DEFAULT_USER_PATTERNS: RegExp[] = [\n /Page$/,\n /View$/,\n /Screen$/,\n /Section$/,\n /Card$/,\n /List$/,\n /Item$/,\n /Form$/,\n /Modal$/,\n /Dialog$/,\n /Button$/,\n /Nav$/,\n /Header$/,\n /Footer$/,\n /Layout$/,\n /Panel$/,\n /Tab$/,\n /Menu$/,\n];\n\n/* ------------------------------------------------------------------ *\n * Module-level caches\n * ------------------------------------------------------------------ */\n\n/**\n * A WeakMap can't be cleared in place, so we keep it inside a mutable box and\n * swap a fresh map in on reset. The page-detection result is a simple tri-state\n * box (null = not yet computed).\n */\nconst cacheState: {\n isReactPage: boolean | null;\n componentInfo: WeakMap<HTMLElement, ReactComponentInfo>;\n} = {\n isReactPage: null,\n componentInfo: new WeakMap<HTMLElement, ReactComponentInfo>(),\n};\n\nexport function clearReactDetectionCache(): void {\n cacheState.isReactPage = null;\n cacheState.componentInfo = new WeakMap<HTMLElement, ReactComponentInfo>();\n}\n\n/* ------------------------------------------------------------------ *\n * Resolved configuration\n * ------------------------------------------------------------------ */\n\ninterface ResolvedConfig {\n maxComponents: number;\n maxDepth: number;\n mode: ReactDetectionMode;\n skipExact: Set<string>;\n skipPatterns: RegExp[];\n userPatterns: RegExp[];\n filter?: (name: string, depth: number) => boolean;\n}\n\nfunction resolveConfig(config?: ReactDetectionConfig): ResolvedConfig {\n const cfg = config ?? {};\n\n let skipExact: Set<string>;\n if (cfg.skipExact !== undefined) {\n const extra = Array.isArray(cfg.skipExact)\n ? cfg.skipExact\n : Array.from(cfg.skipExact);\n skipExact = new Set<string>([...DEFAULT_SKIP_EXACT, ...extra]);\n } else {\n skipExact = DEFAULT_SKIP_EXACT;\n }\n\n const skipPatterns =\n cfg.skipPatterns !== undefined\n ? [...DEFAULT_SKIP_PATTERNS, ...cfg.skipPatterns]\n : DEFAULT_SKIP_PATTERNS;\n\n const userPatterns =\n cfg.userPatterns !== undefined ? cfg.userPatterns : DEFAULT_USER_PATTERNS;\n\n return {\n maxComponents: cfg.maxComponents ?? 6,\n maxDepth: cfg.maxDepth ?? 30,\n mode: cfg.mode ?? \"filtered\",\n skipExact,\n skipPatterns,\n userPatterns,\n filter: cfg.filter,\n };\n}\n\n/* ------------------------------------------------------------------ *\n * Low-level DOM / fiber key probing\n * ------------------------------------------------------------------ */\n\nconst FIBER_KEY_PREFIXES = [\"__reactFiber$\", \"__reactInternalInstance$\"];\nconst PAGE_KEY_PREFIXES = [\n \"__reactFiber$\",\n \"__reactInternalInstance$\",\n \"__reactProps$\",\n];\n\n/** Page-level probe: any of the three React-attached property prefixes count. */\nfunction hasReactFiber(element: Element): boolean {\n for (const key of Object.keys(element)) {\n for (const prefix of PAGE_KEY_PREFIXES) {\n if (key.startsWith(prefix)) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Returns the property name that holds the traversable fiber, if present.\n * `__reactProps$` deliberately does NOT qualify here — it carries props, not a\n * fiber node.\n */\nfunction getReactFiberKey(element: HTMLElement): string | null {\n for (const key of Object.keys(element)) {\n for (const prefix of FIBER_KEY_PREFIXES) {\n if (key.startsWith(prefix)) {\n return key;\n }\n }\n }\n return null;\n}\n\n/* ------------------------------------------------------------------ *\n * isReactPage\n * ------------------------------------------------------------------ */\n\nconst ROOT_SELECTORS = [\"#root\", \"#app\", \"#__next\", \"[data-reactroot]\"];\n\nexport function isReactPage(): boolean {\n if (typeof document === \"undefined\") {\n return false;\n }\n\n if (cacheState.isReactPage !== null) {\n return cacheState.isReactPage;\n }\n\n const detected = scanForReact();\n cacheState.isReactPage = detected;\n return detected;\n}\n\nfunction scanForReact(): boolean {\n const body = document.body;\n\n // (1) The body element itself.\n if (body && hasReactFiber(body)) {\n return true;\n }\n\n // (2) Well-known root containers, in priority order.\n for (const selector of ROOT_SELECTORS) {\n const candidate = document.querySelector(selector);\n if (candidate && hasReactFiber(candidate)) {\n return true;\n }\n }\n\n // (3) Any direct child of the body.\n if (body) {\n for (const child of Array.from(body.children)) {\n if (hasReactFiber(child)) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/* ------------------------------------------------------------------ *\n * Name derivation\n * ------------------------------------------------------------------ */\n\n/** displayName wins over name; otherwise nothing. */\nfunction getComponentNameFromType(\n type: ComponentType | string | null | undefined,\n): string | null {\n if (!type || typeof type === \"string\") {\n return null;\n }\n if (type.displayName) {\n return type.displayName;\n }\n if (type.name) {\n return type.name;\n }\n return null;\n}\n\n/**\n * Maps a single fiber to a candidate component name (or null when the fiber is\n * a host/internal node that should never contribute a name).\n */\nfunction getComponentNameFromFiber(fiber: ReactFiber): string | null {\n const tag = fiber.tag;\n const type = fiber.type;\n const elementType = fiber.elementType;\n\n switch (tag) {\n // Host and structural noise — never named.\n case FiberTags.HostComponent:\n case FiberTags.HostText:\n case FiberTags.HostHoistable:\n case FiberTags.HostSingleton:\n case FiberTags.Fragment:\n case FiberTags.Mode:\n case FiberTags.Profiler:\n case FiberTags.DehydratedFragment:\n case FiberTags.HostRoot:\n case FiberTags.HostPortal:\n case FiberTags.ScopeComponent:\n case FiberTags.OffscreenComponent:\n case FiberTags.LegacyHiddenComponent:\n case FiberTags.CacheComponent:\n case FiberTags.TracingMarkerComponent:\n case FiberTags.Throw:\n case FiberTags.ViewTransitionComponent:\n case FiberTags.ActivityComponent:\n case FiberTags.SuspenseComponent:\n case FiberTags.SuspenseListComponent:\n return null;\n\n case FiberTags.ForwardRef: {\n if (elementType && elementType.render) {\n const fromRender = getComponentNameFromType(elementType.render);\n if (fromRender) {\n return fromRender;\n }\n }\n if (elementType && elementType.displayName) {\n return elementType.displayName;\n }\n return getComponentNameFromType(type);\n }\n\n case FiberTags.MemoComponent:\n case FiberTags.SimpleMemoComponent: {\n if (elementType && elementType.type) {\n const fromInner = getComponentNameFromType(elementType.type);\n if (fromInner) {\n return fromInner;\n }\n }\n if (elementType && elementType.displayName) {\n return elementType.displayName;\n }\n return getComponentNameFromType(type);\n }\n\n case FiberTags.ContextProvider: {\n if (type && typeof type !== \"string\" && type._context?.displayName) {\n return `${type._context.displayName}.Provider`;\n }\n return null;\n }\n\n case FiberTags.ContextConsumer: {\n if (type && typeof type !== \"string\" && type.displayName) {\n return `${type.displayName}.Consumer`;\n }\n return null;\n }\n\n case FiberTags.LazyComponent: {\n if (elementType && elementType._status === 1 && elementType._result) {\n return getComponentNameFromType(elementType._result);\n }\n return null;\n }\n\n case FiberTags.IncompleteClassComponent:\n case FiberTags.IncompleteFunctionComponent:\n // Best effort even though the render errored out mid-flight.\n return getComponentNameFromType(type);\n\n case FiberTags.FunctionComponent:\n case FiberTags.ClassComponent:\n case FiberTags.IndeterminateComponent:\n return getComponentNameFromType(type);\n\n default:\n return null;\n }\n}\n\n/** Heuristic: minifiers tend to emit ultra-short, all-lowercase identifiers. */\nfunction isMinifiedName(name: string): boolean {\n if (name.length <= 2) {\n return true;\n }\n if (name.length <= 3 && name === name.toLowerCase()) {\n return true;\n }\n return false;\n}\n\n/* ------------------------------------------------------------------ *\n * Name normalization & DOM correlation\n * ------------------------------------------------------------------ */\n\n/** PascalCase / camelCase -> kebab-case, lowercased. */\nfunction normalizeComponentName(name: string): string {\n return name\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/([A-Z])([A-Z][a-z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\n/**\n * Collects normalized CSS class tokens from the element plus up to `maxDepth`\n * ancestors, stripping CSS-module hash suffixes along the way.\n */\nfunction getAncestorClasses(element: HTMLElement, maxDepth = 10): Set<string> {\n const classes = new Set<string>();\n let current: HTMLElement | null = element;\n let depth = 0;\n\n while (current && depth <= maxDepth) {\n const className = current.className;\n if (typeof className === \"string\") {\n for (const token of className.split(/\\s+/)) {\n if (token.length > 1) {\n const cleaned = token\n .replace(/[_][a-zA-Z0-9]{5,}.*$/, \"\")\n .toLowerCase();\n if (cleaned.length > 1) {\n classes.add(cleaned);\n }\n }\n }\n }\n current = current.parentElement;\n depth++;\n }\n\n return classes;\n}\n\n/**\n * True when the component's normalized name lines up with one of the gathered\n * DOM classes — either an exact match or overlapping significant word fragments.\n */\nfunction componentCorrelatesWithDOM(\n componentName: string,\n domClasses: Set<string>,\n): boolean {\n const normalized = normalizeComponentName(componentName);\n const componentWords = normalized.split(\"-\").filter((w) => w.length > 2);\n\n for (const cls of domClasses) {\n if (cls === normalized) {\n return true;\n }\n const classWords = cls.split(\"-\").filter((w) => w.length > 2);\n for (const cw of componentWords) {\n for (const lw of classWords) {\n if (cw === lw || cw.includes(lw) || lw.includes(cw)) {\n return true;\n }\n }\n }\n }\n\n return false;\n}\n\n/* ------------------------------------------------------------------ *\n * Inclusion decision\n * ------------------------------------------------------------------ */\n\nfunction matchesAnyPattern(name: string, patterns: RegExp[]): boolean {\n for (const pattern of patterns) {\n if (pattern.test(name)) {\n return true;\n }\n }\n return false;\n}\n\nfunction shouldIncludeComponent(\n name: string,\n depth: number,\n config: ResolvedConfig,\n domClasses?: Set<string>,\n): boolean {\n // A user-supplied filter, when present, has the final word.\n if (config.filter) {\n return config.filter(name, depth);\n }\n\n switch (config.mode) {\n case \"all\":\n return true;\n\n case \"filtered\": {\n if (config.skipExact.has(name)) {\n return false;\n }\n if (matchesAnyPattern(name, config.skipPatterns)) {\n return false;\n }\n return true;\n }\n\n case \"smart\": {\n if (config.skipExact.has(name)) {\n return false;\n }\n if (matchesAnyPattern(name, config.skipPatterns)) {\n return false;\n }\n if (domClasses && componentCorrelatesWithDOM(name, domClasses)) {\n return true;\n }\n if (matchesAnyPattern(name, config.userPatterns)) {\n return true;\n }\n return false;\n }\n\n default:\n return true;\n }\n}\n\n/* ------------------------------------------------------------------ *\n * getReactComponentName\n * ------------------------------------------------------------------ */\n\nfunction emptyResult(): ReactComponentInfo {\n return { path: null, components: [] };\n}\n\nexport function getReactComponentName(\n element: HTMLElement,\n config?: ReactDetectionConfig,\n): ReactComponentInfo {\n const resolved = resolveConfig(config);\n const useCache = resolved.mode === \"all\";\n\n if (useCache) {\n const cached = cacheState.componentInfo.get(element);\n if (cached) {\n return cached;\n }\n }\n\n const finalize = (result: ReactComponentInfo): ReactComponentInfo => {\n if (useCache) {\n cacheState.componentInfo.set(element, result);\n }\n return result;\n };\n\n if (!isReactPage()) {\n return finalize(emptyResult());\n }\n\n // Smart mode needs the surrounding DOM class context up front.\n const domClasses =\n resolved.mode === \"smart\" ? getAncestorClasses(element, 10) : undefined;\n\n const components: string[] = [];\n\n try {\n const fiberKey = getReactFiberKey(element);\n if (!fiberKey) {\n return finalize(emptyResult());\n }\n\n let fiber = (element as unknown as Record<string, ReactFiber | null>)[\n fiberKey\n ] as ReactFiber | null;\n\n let depth = 0;\n while (\n fiber !== null &&\n depth < resolved.maxDepth &&\n components.length < resolved.maxComponents\n ) {\n const name = getComponentNameFromFiber(fiber);\n if (\n name &&\n !isMinifiedName(name) &&\n shouldIncludeComponent(name, depth, resolved, domClasses)\n ) {\n components.push(name);\n }\n fiber = fiber.return;\n depth++;\n }\n } catch {\n return finalize(emptyResult());\n }\n\n if (components.length === 0) {\n return finalize(emptyResult());\n }\n\n // `components` is innermost-first; the readable path runs outermost-in.\n const path = components\n .slice()\n .reverse()\n .map((name) => `<${name}>`)\n .join(\" \");\n\n return finalize({ path, components });\n}\n","// BugPort widget — original implementation. Do not copy third-party sources.\n//\n// Resolves the source file/line of the React component behind a DOM element.\n// Strategy: read the fiber off the element, then try (in order) the legacy\n// `_debugSource` annotation, the React-19 debug props, and finally a\n// hook-dispatcher stack-trace probe. None of this requires project-internal\n// imports — only React itself, which we poke at for the dispatcher trick.\n\nimport React from \"react\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface SourceLocation {\n fileName: string;\n lineNumber: number;\n columnNumber?: number;\n componentName?: string;\n reactVersion?: string;\n}\n\nexport type SourceLocationNotFoundReason =\n | \"not-react-app\"\n | \"production-build\"\n | \"no-fiber\"\n | \"no-debug-source\"\n | \"react-19-changed\"\n | \"element-not-in-react-tree\"\n | \"unknown\";\n\nexport interface SourceLocationResult {\n found: boolean;\n source?: SourceLocation;\n reason?: SourceLocationNotFoundReason;\n isReactApp: boolean;\n isProduction: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Internal types (not exported, but referenced by public signatures)\n// ---------------------------------------------------------------------------\n\ninterface DebugSource {\n fileName: string;\n lineNumber: number;\n columnNumber?: number;\n}\n\ntype FiberType =\n | {\n name?: string;\n displayName?: string;\n prototype?: { isReactComponent?: boolean };\n }\n | string\n | null;\n\ninterface ReactFiber {\n _debugSource?: DebugSource;\n _debugOwner?: ReactFiber;\n type?: FiberType;\n elementType?: unknown;\n tag?: number;\n return?: ReactFiber | null;\n child?: ReactFiber | null;\n sibling?: ReactFiber | null;\n memoizedProps?: Record<string, unknown>;\n stateNode?: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Fiber tag classification (from the React reconciler's WorkTag enum)\n// ---------------------------------------------------------------------------\n\nconst FIBER_TAGS = {\n FunctionComponent: 0,\n ClassComponent: 1,\n IndeterminateComponent: 2,\n HostRoot: 3,\n HostPortal: 4,\n HostComponent: 5,\n HostText: 6,\n Fragment: 7,\n Mode: 8,\n ContextConsumer: 9,\n ContextProvider: 10,\n ForwardRef: 11,\n Profiler: 12,\n SuspenseComponent: 13,\n MemoComponent: 14,\n SimpleMemoComponent: 15,\n LazyComponent: 16,\n} as const;\n\n// ---------------------------------------------------------------------------\n// React detection\n// ---------------------------------------------------------------------------\n\nexport function detectReactApp(): {\n isReact: boolean;\n version?: string;\n isProduction: boolean;\n} {\n if (typeof window === \"undefined\") {\n return { isReact: false, isProduction: true };\n }\n\n const win = window as unknown as Record<string, unknown>;\n const hook = win.__REACT_DEVTOOLS_GLOBAL_HOOK__ as\n | {\n renderers?: Map<unknown, { version?: string }>;\n supportsFiber?: boolean;\n }\n | undefined;\n\n // Preferred signal: the DevTools global hook with at least one renderer.\n if (hook && typeof hook === \"object\") {\n const renderers = hook.renderers;\n if (renderers instanceof Map && renderers.size > 0) {\n const first = renderers.values().next().value as\n | { version?: string }\n | undefined;\n return {\n isReact: true,\n version: (first && first.version) || \"unknown\",\n isProduction: !hook.supportsFiber,\n };\n }\n }\n\n // Fallback signals scraped from the DOM.\n const reactRootEl = document.querySelector(\"[data-reactroot]\");\n const hasReactRoot = reactRootEl !== null;\n\n const rootContainer = document.getElementById(\"root\") as\n | (HTMLElement & { _reactRootContainer?: unknown })\n | null;\n const hasReactContainer =\n rootContainer != null && rootContainer._reactRootContainer !== undefined;\n\n let hasFiberKey = false;\n if (document.body) {\n const bodyChildren = document.body.children;\n for (let i = 0; i < bodyChildren.length; i += 1) {\n const child = bodyChildren[i];\n const ownKeys = Object.keys(child);\n const matched = ownKeys.some(\n (k) =>\n k.startsWith(\"__reactFiber$\") ||\n k.startsWith(\"__reactInternalInstance$\")\n );\n if (matched) {\n hasFiberKey = true;\n break;\n }\n }\n }\n\n if (hasReactRoot || hasReactContainer || hasFiberKey) {\n return {\n isReact: true,\n version: \"unknown\",\n isProduction: !hook,\n };\n }\n\n return { isReact: false, isProduction: true };\n}\n\n// ---------------------------------------------------------------------------\n// Fiber extraction\n// ---------------------------------------------------------------------------\n\nexport function getFiberFromElement(element: HTMLElement): ReactFiber | null {\n if (!element || typeof element !== \"object\") {\n return null;\n }\n\n const el = element as unknown as Record<string, ReactFiber | undefined>;\n const keys = Object.keys(el);\n\n const fiberKey = keys.find((k) => k.startsWith(\"__reactFiber$\"));\n if (fiberKey) {\n return el[fiberKey] || null;\n }\n\n const instanceKey = keys.find((k) =>\n k.startsWith(\"__reactInternalInstance$\")\n );\n if (instanceKey) {\n return el[instanceKey] || null;\n }\n\n const looseKey = keys.find((k) => {\n if (!k.startsWith(\"__react\")) {\n return false;\n }\n const value = el[k];\n return (\n !!value &&\n typeof value === \"object\" &&\n Object.prototype.hasOwnProperty.call(value, \"_debugSource\")\n );\n });\n if (looseKey) {\n return el[looseKey] || null;\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Name + debug-source helpers\n// ---------------------------------------------------------------------------\n\nfunction getComponentName(fiber: ReactFiber): string | null {\n const { type } = fiber;\n if (!type) {\n return null;\n }\n if (typeof type === \"string\") {\n // Host element (e.g. \"div\") — not a component we care to name.\n return null;\n }\n if (type.displayName) {\n return type.displayName;\n }\n if (type.name) {\n return type.name;\n }\n return null;\n}\n\ninterface DebugInfo {\n source: DebugSource;\n componentName: string | null;\n}\n\nfunction findDebugSource(fiber: ReactFiber, maxDepth = 50): DebugInfo | null {\n let current: ReactFiber | null | undefined = fiber;\n let depth = 0;\n\n while (current && depth < maxDepth) {\n if (current._debugSource) {\n return {\n source: current._debugSource,\n componentName: getComponentName(current),\n };\n }\n const owner = current._debugOwner;\n if (owner && owner._debugSource) {\n return {\n source: owner._debugSource,\n componentName: getComponentName(owner),\n };\n }\n current = current.return;\n depth += 1;\n }\n\n return null;\n}\n\nfunction findDebugSourceReact19(fiber: ReactFiber): DebugInfo | null {\n const candidateKeys = [\"_debugSource\", \"__source\", \"_source\", \"debugSource\"];\n let current: ReactFiber | null | undefined = fiber;\n let depth = 0;\n const maxDepth = 50;\n\n while (current && depth < maxDepth) {\n const record = current as unknown as Record<string, unknown>;\n\n for (const key of candidateKeys) {\n const value = record[key];\n if (value && typeof value === \"object\" && \"fileName\" in value) {\n return {\n source: value as DebugSource,\n componentName: getComponentName(current),\n };\n }\n }\n\n const props = current.memoizedProps;\n if (props && typeof props === \"object\") {\n const propSource = props.__source as\n | { fileName?: string; lineNumber?: number; columnNumber?: number }\n | undefined;\n if (\n propSource &&\n typeof propSource === \"object\" &&\n propSource.fileName !== undefined &&\n propSource.lineNumber !== undefined\n ) {\n return {\n source: {\n fileName: propSource.fileName,\n lineNumber: propSource.lineNumber,\n columnNumber: propSource.columnNumber,\n },\n componentName: getComponentName(current),\n };\n }\n }\n\n current = current.return;\n depth += 1;\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Stack-trace probe fallback\n// ---------------------------------------------------------------------------\n\n// A renderable component callable (function/forwardRef render/memo inner).\ntype ComponentFn = (...args: unknown[]) => unknown;\n\n// Memoizes probe outcomes per component function across calls. The cache is\n// intentionally long-lived: the same function reference resolves once.\nconst sourceProbeCache = new Map<ComponentFn, SourceLocation | null>();\n\nfunction unwrapComponentType(fiber: ReactFiber): ComponentFn | null {\n const { type, tag } = fiber;\n\n if (typeof type === \"string\" || type == null) {\n return null;\n }\n\n // Class components render via lifecycle, not a plain call — skip.\n if (\n typeof type === \"function\" &&\n (type as { prototype?: { isReactComponent?: boolean } }).prototype\n ?.isReactComponent\n ) {\n return null;\n }\n\n if (\n tag === FIBER_TAGS.FunctionComponent ||\n tag === FIBER_TAGS.IndeterminateComponent\n ) {\n if (typeof type === \"function\") {\n return type as unknown as ComponentFn;\n }\n }\n\n if (tag === FIBER_TAGS.ForwardRef) {\n const render = (fiber.elementType as { render?: unknown } | undefined)\n ?.render;\n if (typeof render === \"function\") {\n return render as ComponentFn;\n }\n }\n\n if (\n tag === FIBER_TAGS.MemoComponent ||\n tag === FIBER_TAGS.SimpleMemoComponent\n ) {\n const inner = (fiber.elementType as { type?: unknown } | undefined)?.type;\n if (typeof inner === \"function\") {\n return inner as ComponentFn;\n }\n }\n\n if (typeof type === \"function\") {\n return type as unknown as ComponentFn;\n }\n\n return null;\n}\n\ninterface Dispatcher {\n get: () => unknown;\n set: (value: unknown) => void;\n}\n\nfunction getReactDispatcher(): Dispatcher | null {\n const r = React as unknown as Record<string, unknown>;\n\n const clientInternals =\n r.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE as\n | Record<string, unknown>\n | undefined;\n if (clientInternals && \"H\" in clientInternals) {\n return {\n get: () => clientInternals.H,\n set: (value: unknown) => {\n clientInternals.H = value;\n },\n };\n }\n\n const secretInternals =\n r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED as\n | { ReactCurrentDispatcher?: Record<string, unknown> }\n | undefined;\n const currentDispatcher = secretInternals?.ReactCurrentDispatcher;\n if (currentDispatcher && \"current\" in currentDispatcher) {\n return {\n get: () => currentDispatcher.current,\n set: (value: unknown) => {\n currentDispatcher.current = value;\n },\n };\n }\n\n return null;\n}\n\nconst IGNORED_FRAME_PATTERNS: RegExp[] = [\n /source-location/,\n /\\/dist\\/index\\./,\n /node_modules\\//,\n /react-dom/,\n /react\\.development/,\n /react\\.production/,\n /chunk-[A-Z0-9]+/i,\n /react-stack-bottom-frame/,\n /react-reconciler/,\n /scheduler/,\n /<anonymous>/,\n];\n\ninterface ParsedFrame {\n fileName: string;\n line: number;\n column: number;\n}\n\nfunction parseComponentFrame(stack: string): ParsedFrame | null {\n const lines = stack.split(\"\\n\");\n const v8Pattern = /^\\s*at\\s+(?:.*?\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/;\n const geckoPattern = /^[^@]*@(.+?):(\\d+):(\\d+)$/;\n\n for (const rawLine of lines) {\n const trimmed = rawLine.trim();\n if (!trimmed) {\n continue;\n }\n if (IGNORED_FRAME_PATTERNS.some((re) => re.test(trimmed))) {\n continue;\n }\n\n const v8 = trimmed.match(v8Pattern);\n if (v8) {\n return {\n fileName: v8[1],\n line: parseInt(v8[2], 10),\n column: parseInt(v8[3], 10),\n };\n }\n\n const gecko = trimmed.match(geckoPattern);\n if (gecko) {\n return {\n fileName: gecko[1],\n line: parseInt(gecko[2], 10),\n column: parseInt(gecko[3], 10),\n };\n }\n }\n\n return null;\n}\n\nfunction cleanSourcePath(rawPath: string): string {\n let path = rawPath;\n\n // Drop query strings / fragments first.\n path = path.replace(/[?#].*$/, \"\");\n\n // Turbopack project-relative marker.\n path = path.replace(/^turbopack:\\/\\/\\/\\[project\\]\\//, \"\");\n\n // Webpack internal variants.\n path = path.replace(/^webpack-internal:\\/\\/\\/\\.\\//, \"\");\n path = path.replace(/^webpack-internal:\\/\\/\\//, \"\");\n\n // Webpack source-map variants.\n path = path.replace(/^webpack:\\/\\/\\/\\.\\//, \"\");\n path = path.replace(/^webpack:\\/\\/\\//, \"\");\n\n // Generic turbopack prefix.\n path = path.replace(/^turbopack:\\/\\/\\//, \"\");\n\n // Plain dev-server URLs (host stripped, path kept).\n path = path.replace(/^https?:\\/\\/[^/]+\\//, \"\");\n\n // Local file URLs become absolute paths.\n path = path.replace(/^file:\\/\\/\\//, \"/\");\n\n // Webpack chunk-group prefix like \"(app-pages-browser)/./\".\n path = path.replace(/^\\([^)]+\\)\\/\\.\\//, \"\");\n\n // Leftover leading \"./\".\n path = path.replace(/^\\.\\//, \"\");\n\n return path;\n}\n\nfunction probeComponentSource(fiber: ReactFiber): SourceLocation | null {\n const fn = unwrapComponentType(fiber);\n if (!fn) {\n return null;\n }\n\n if (sourceProbeCache.has(fn)) {\n return sourceProbeCache.get(fn) ?? null;\n }\n\n const dispatcher = getReactDispatcher();\n if (!dispatcher) {\n sourceProbeCache.set(fn, null);\n return null;\n }\n\n const original = dispatcher.get();\n let result: SourceLocation | null = null;\n\n // A dispatcher proxy whose every hook access throws, giving us a stack\n // that originates inside the component's own source.\n const trap = new Proxy(\n {},\n {\n get() {\n throw new Error(\"probe\");\n },\n }\n );\n\n try {\n dispatcher.set(trap);\n try {\n (fn as (props: Record<string, unknown>) => unknown)({});\n } catch (e) {\n if (\n e instanceof Error &&\n e.message === \"probe\" &&\n typeof e.stack === \"string\"\n ) {\n const frame = parseComponentFrame(e.stack);\n if (frame) {\n result = {\n fileName: cleanSourcePath(frame.fileName),\n lineNumber: frame.line,\n columnNumber: frame.column,\n componentName: getComponentName(fiber) || undefined,\n };\n }\n }\n }\n } finally {\n dispatcher.set(original);\n }\n\n sourceProbeCache.set(fn, result);\n return result;\n}\n\nfunction probeSourceWalk(\n fiber: ReactFiber,\n maxDepth = 15\n): SourceLocation | null {\n let current: ReactFiber | null | undefined = fiber;\n let depth = 0;\n\n while (current && depth < maxDepth) {\n const probed = probeComponentSource(current);\n if (probed) {\n return probed;\n }\n current = current.return;\n depth += 1;\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Primary entry point\n// ---------------------------------------------------------------------------\n\nexport function getSourceLocation(element: HTMLElement): SourceLocationResult {\n const fiber = getFiberFromElement(element);\n if (!fiber) {\n return {\n found: false,\n reason: \"no-fiber\",\n isReactApp: false,\n isProduction: false,\n };\n }\n\n // We intentionally avoid detectReactApp() here: its production heuristic\n // produces false positives, so every resolved result reports\n // isProduction:false / isReactApp:true once a fiber is present.\n\n let debugInfo = findDebugSource(fiber);\n if (!debugInfo) {\n debugInfo = findDebugSourceReact19(fiber);\n }\n\n if (debugInfo && debugInfo.source) {\n const { source } = debugInfo;\n return {\n found: true,\n source: {\n fileName: source.fileName,\n lineNumber: source.lineNumber,\n columnNumber: source.columnNumber,\n componentName: debugInfo.componentName || undefined,\n },\n isReactApp: true,\n isProduction: false,\n };\n }\n\n const probed = probeSourceWalk(fiber);\n if (probed) {\n return {\n found: true,\n source: probed,\n isReactApp: true,\n isProduction: false,\n };\n }\n\n return {\n found: false,\n reason: \"no-debug-source\",\n isReactApp: true,\n isProduction: false,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Formatting & convenience wrappers\n// ---------------------------------------------------------------------------\n\nexport function formatSourceLocation(\n source: SourceLocation,\n format: \"path\" | \"vscode\" = \"path\"\n): string {\n let location = `${source.fileName}:${source.lineNumber}`;\n if (source.columnNumber !== undefined) {\n location += `:${source.columnNumber}`;\n }\n\n if (format === \"vscode\") {\n const prefix = source.fileName.startsWith(\"/\") ? \"\" : \"/\";\n return `vscode://file${prefix}${location}`;\n }\n\n return location;\n}\n\nexport function getSourceLocations(\n elements: HTMLElement[]\n): SourceLocationResult[] {\n return elements.map((element) => getSourceLocation(element));\n}\n\nexport function findNearestComponentSource(\n element: HTMLElement,\n maxAncestors = 10\n): SourceLocationResult {\n let current: HTMLElement | null = element;\n let hops = 0;\n\n while (current && hops < maxAncestors) {\n const result = getSourceLocation(current);\n if (result.found) {\n return result;\n }\n current = current.parentElement;\n hops += 1;\n }\n\n // Nothing found in the chain: report against the original element so the\n // failure reason refers to where the caller started.\n return getSourceLocation(element);\n}\n\nexport function getComponentHierarchy(element: HTMLElement): SourceLocation[] {\n const fiber = getFiberFromElement(element);\n if (!fiber) {\n return [];\n }\n\n const collected: SourceLocation[] = [];\n const seen = new Set<string>();\n let current: ReactFiber | null | undefined = fiber;\n let depth = 0;\n const maxDepth = 100;\n\n while (current && depth < maxDepth) {\n const debug = current._debugSource;\n if (debug) {\n const key = `${debug.fileName}:${debug.lineNumber}`;\n if (!seen.has(key)) {\n seen.add(key);\n collected.push({\n fileName: debug.fileName,\n lineNumber: debug.lineNumber,\n columnNumber: debug.columnNumber,\n componentName: getComponentName(current) || undefined,\n });\n }\n }\n current = current.return;\n depth += 1;\n }\n\n return collected;\n}\n\n// ---------------------------------------------------------------------------\n// Diagnostics\n// ---------------------------------------------------------------------------\n\nexport function checkSourceLocationSupport(): {\n supported: boolean;\n reason: string;\n suggestions: string[];\n} {\n const detection = detectReactApp();\n\n if (!detection.isReact) {\n return {\n supported: false,\n reason: \"No React application detected on this page\",\n suggestions: [\n \"Ensure you're on a page built with React\",\n \"The page may use a different framework (Vue, Angular, etc.)\",\n ],\n };\n }\n\n if (detection.isProduction) {\n return {\n supported: false,\n reason: \"Production build detected - source info is stripped\",\n suggestions: [\n \"Run the application in development mode\",\n \"Set NODE_ENV=development\",\n \"Ensure your bundler includes source info in development\",\n ],\n };\n }\n\n const hasDevTools =\n typeof window !== \"undefined\" &&\n !!(window as unknown as Record<string, unknown>)\n .__REACT_DEVTOOLS_GLOBAL_HOOK__;\n\n if (!hasDevTools) {\n return {\n supported: true,\n reason: \"Development mode detected, but React DevTools not installed\",\n suggestions: [\n \"Install React DevTools browser extension for best results\",\n \"Source detection may still work without it\",\n ],\n };\n }\n\n return {\n supported: true,\n reason: `React ${detection.version || \"unknown\"} development mode detected`,\n suggestions: [],\n };\n}\n","// BugPort widget — original implementation. Do not copy third-party sources.\n\n/**\n * DOM screenshot utilities for the BugPort widget.\n *\n * This module is intentionally self-contained: it relies only on browser\n * globals (document, window, console) plus the OPTIONAL peer dependency\n * `modern-screenshot`, which is loaded lazily so that bundlers do not try to\n * statically resolve it. Everything degrades gracefully when that dependency\n * is missing.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** A single freehand drawing stroke captured by the widget toolbar. */\ninterface WidgetStroke {\n points: Array<{ x: number; y: number }>;\n color: string;\n fixed: boolean;\n}\n\n/** The subset of the `modern-screenshot` API surface this module consumes. */\ninterface ScreenshotModule {\n domToCanvas: (\n node: Node,\n options?: Record<string, unknown>,\n ) => Promise<HTMLCanvasElement>;\n}\n\n/** Signature of the dynamically-constructed importer function. */\ntype DynamicImporter = (specifier: string) => Promise<unknown>;\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst WIDGET_ROOT_ATTRIBUTE = 'data-bugport-widget-root';\nconst WIDGET_ROOT_SELECTOR = '[data-bugport-widget-root]';\nconst CAPTURE_BACKGROUND = '#ffffff';\nconst DOM_MAX_DIM = 600;\nconst STROKE_MAX_DIM = 400;\nconst DOM_TIMEOUT_MS = 5000;\n\n// ---------------------------------------------------------------------------\n// Lazy module loading (three-state memoization)\n//\n// undefined -> not yet attempted\n// null -> attempted and failed (cached permanently)\n// object -> attempted and succeeded\n// ---------------------------------------------------------------------------\n\nlet cachedModule: ScreenshotModule | null | undefined;\n\n/**\n * Optional importer override. Production code leaves this undefined and relies\n * on the runtime-built `new Function` importer; test environments (where a\n * `new Function` `import()` has no host callback) may inject a working importer\n * here. It is intentionally not part of the public capture API.\n */\nlet importerOverride: DynamicImporter | undefined;\n\n/**\n * Builds a dynamic-import function at runtime. Constructing the importer via\n * `new Function` keeps the `import()` opaque to bundlers, so the optional\n * dependency is never statically required.\n */\nfunction buildImporter(): DynamicImporter {\n if (importerOverride) {\n return importerOverride;\n }\n return new Function(\n 'specifier',\n 'return import(specifier);',\n ) as DynamicImporter;\n}\n\n/**\n * Resolves (and memoizes) the `modern-screenshot` module. Returns the loaded\n * module on success or `null` on failure. The result is cached for the page\n * lifetime; a failure is never retried.\n */\nasync function getDomCapture(): Promise<ScreenshotModule | null> {\n if (cachedModule !== undefined) {\n return cachedModule;\n }\n\n try {\n const importer = buildImporter();\n const loaded = (await importer('modern-screenshot')) as ScreenshotModule;\n cachedModule = loaded ?? null;\n } catch {\n cachedModule = null;\n }\n\n return cachedModule;\n}\n\n/**\n * Test-only seam: installs a custom module importer. Not used by application\n * code. Passing `undefined` restores the default runtime importer.\n */\nexport function __setImporterForTests(\n importer: DynamicImporter | undefined,\n): void {\n importerOverride = importer;\n}\n\n// ---------------------------------------------------------------------------\n// Geometry helpers\n// ---------------------------------------------------------------------------\n\ninterface CaptureRect {\n captureX: number;\n captureY: number;\n captureW: number;\n captureH: number;\n}\n\ninterface OutputDims {\n outW: number;\n outH: number;\n scale: number;\n}\n\n/**\n * Expands a region by `padding` on every side. The top-left is clamped to be\n * non-negative, but the width/height are NOT reduced by that clamp.\n */\nfunction buildCaptureRect(\n regionX: number,\n regionY: number,\n regionW: number,\n regionH: number,\n padding: number,\n): CaptureRect {\n return {\n captureX: Math.max(0, regionX - padding),\n captureY: Math.max(0, regionY - padding),\n captureW: regionW + padding * 2,\n captureH: regionH + padding * 2,\n };\n}\n\n/**\n * Computes downscale-only output dimensions so the larger side fits within\n * `maxDim`. The scale is clamped to a maximum of 1 (never upscale).\n */\nfunction computeOutputDims(rect: CaptureRect, maxDim: number): OutputDims {\n const largestSide = Math.max(rect.captureW, rect.captureH);\n const scale = Math.min(1, maxDim / largestSide);\n\n return {\n scale,\n outW: Math.round(rect.captureW * scale),\n outH: Math.round(rect.captureH * scale),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Stroke compositing (shared)\n// ---------------------------------------------------------------------------\n\n/**\n * Renders each stroke as a connected polyline onto the supplied 2D context.\n *\n * Coordinate mapping: every point's viewport coordinates are translated into\n * canvas space relative to `originX`/`originY` and multiplied by `scale`.\n * Non-fixed strokes are shifted up by the current `window.scrollY` (read once\n * up front); fixed strokes are anchored to the viewport and not shifted.\n */\nfunction drawStrokesOnCanvas(\n ctx: CanvasRenderingContext2D,\n strokes: WidgetStroke[],\n originX: number,\n originY: number,\n scale: number,\n): void {\n const scrollY = window.scrollY;\n const lineWidth = Math.max(2, 2.5 * scale);\n\n for (const stroke of strokes) {\n if (stroke.points.length < 2) {\n continue;\n }\n\n ctx.save();\n ctx.strokeStyle = stroke.color;\n ctx.lineWidth = lineWidth;\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n ctx.beginPath();\n\n let first = true;\n for (const point of stroke.points) {\n const viewportX = point.x;\n const viewportY = stroke.fixed ? point.y : point.y - scrollY;\n const canvasX = (viewportX - originX) * scale;\n const canvasY = (viewportY - originY) * scale;\n\n if (first) {\n ctx.moveTo(canvasX, canvasY);\n first = false;\n } else {\n ctx.lineTo(canvasX, canvasY);\n }\n }\n\n ctx.stroke();\n ctx.restore();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Capture-target selection\n// ---------------------------------------------------------------------------\n\n/**\n * Returns true if the element is part of the widget UI, a <canvas>, or a root\n * document element — all of which are unsuitable capture targets.\n */\nfunction isUnsuitableTarget(el: HTMLElement): boolean {\n if (el === document.documentElement || el === document.body) {\n return true;\n }\n if (el.tagName === 'CANVAS') {\n return true;\n }\n if (el.hasAttribute?.(WIDGET_ROOT_ATTRIBUTE)) {\n return true;\n }\n if (el.closest?.(WIDGET_ROOT_SELECTOR)) {\n return true;\n }\n return false;\n}\n\n/**\n * Picks the element to hand to `domToCanvas`. It samples the elements stacked\n * at the center of the capture rect (most-specific-first) and returns the\n * first that covers roughly the whole region. Falls back to `document.body`.\n */\nfunction findCaptureTarget(rect: CaptureRect): HTMLElement {\n const { captureX, captureY, captureW, captureH } = rect;\n const centerX = captureX + captureW / 2;\n const centerY = captureY + captureH / 2;\n\n const leftLimit = captureX + captureW * 0.1;\n const topLimit = captureY + captureH * 0.1;\n const rightLimit = captureX + captureW * 0.9;\n const bottomLimit = captureY + captureH * 0.9;\n\n const stacked = document.elementsFromPoint(centerX, centerY);\n\n for (const candidate of stacked) {\n if (!(candidate instanceof HTMLElement)) {\n continue;\n }\n if (isUnsuitableTarget(candidate)) {\n continue;\n }\n\n const bounds = candidate.getBoundingClientRect();\n const coversRegion =\n bounds.left <= leftLimit &&\n bounds.top <= topLimit &&\n bounds.right >= rightLimit &&\n bounds.bottom >= bottomLimit;\n\n if (coversRegion) {\n return candidate;\n }\n }\n\n return document.body;\n}\n\n// ---------------------------------------------------------------------------\n// Widget visibility toggling\n// ---------------------------------------------------------------------------\n\ninterface HiddenWidget {\n element: HTMLElement | null;\n previousVisibility: string | null;\n}\n\n/** Hides the widget root (if present) and records its prior inline value. */\nfunction hideWidgetRoot(): HiddenWidget {\n const element = document.querySelector<HTMLElement>(WIDGET_ROOT_SELECTOR);\n if (!element) {\n return { element: null, previousVisibility: null };\n }\n\n const previousVisibility = element.style.visibility;\n element.style.visibility = 'hidden';\n return { element, previousVisibility };\n}\n\n/** Restores the widget root to its saved inline visibility (or ''). */\nfunction restoreWidgetRoot(hidden: HiddenWidget): void {\n if (!hidden.element) {\n return;\n }\n hidden.element.style.visibility = hidden.previousVisibility ?? '';\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves to `true` when the optional `modern-screenshot` dependency can be\n * loaded, `false` otherwise. The first call triggers (and caches) the import\n * attempt; later calls reuse the cached result without re-importing.\n */\nexport async function isDomCaptureAvailable(): Promise<boolean> {\n const module = await getDomCapture();\n return module !== null;\n}\n\n/**\n * Captures a viewport region of the live DOM as a JPEG data-URL, with drawing\n * strokes composited on top. Resolves to `null` when capture cannot proceed\n * (dependency missing, degenerate dimensions, no 2D context, or a thrown\n * error — which is logged and swallowed).\n */\nexport async function captureDomRegion(\n regionX: number,\n regionY: number,\n regionW: number,\n regionH: number,\n strokes: Array<{\n points: Array<{ x: number; y: number }>;\n color: string;\n fixed: boolean;\n }>,\n padding = 32,\n quality = 0.85,\n): Promise<string | null> {\n const screenshot = await getDomCapture();\n if (!screenshot) {\n return null;\n }\n\n const rect = buildCaptureRect(regionX, regionY, regionW, regionH, padding);\n const { outW, outH, scale } = computeOutputDims(rect, DOM_MAX_DIM);\n if (outW < 1 || outH < 1) {\n return null;\n }\n\n // From here on the widget UI is hidden; it MUST be restored no matter what.\n const hidden = hideWidgetRoot();\n\n try {\n const target = findCaptureTarget(rect);\n const targetRect = target.getBoundingClientRect();\n\n const sourceCanvas = await screenshot.domToCanvas(target, {\n backgroundColor: CAPTURE_BACKGROUND,\n timeout: DOM_TIMEOUT_MS,\n });\n\n const ratioX =\n sourceCanvas.width / (target.scrollWidth || targetRect.width);\n const ratioY =\n sourceCanvas.height / (target.scrollHeight || targetRect.height);\n\n const isBody = target === document.body;\n const scrollLeft = isBody ? window.scrollX : target.scrollLeft;\n const scrollTop = isBody ? window.scrollY : target.scrollTop;\n\n const cropX = (rect.captureX - targetRect.left + scrollLeft) * ratioX;\n const cropY = (rect.captureY - targetRect.top + scrollTop) * ratioY;\n const cropW = rect.captureW * ratioX;\n const cropH = rect.captureH * ratioY;\n\n const output = document.createElement('canvas');\n output.width = outW;\n output.height = outH;\n\n const ctx = output.getContext('2d');\n if (!ctx) {\n return null;\n }\n\n // White base so any crop region beyond the source reads white, not blank.\n ctx.fillStyle = CAPTURE_BACKGROUND;\n ctx.fillRect(0, 0, outW, outH);\n\n ctx.drawImage(\n sourceCanvas,\n cropX,\n cropY,\n cropW,\n cropH,\n 0,\n 0,\n outW,\n outH,\n );\n\n drawStrokesOnCanvas(ctx, strokes, rect.captureX, rect.captureY, scale);\n\n return output.toDataURL('image/jpeg', quality);\n } catch (error) {\n console.warn('[bugport-widget] DOM capture failed:', error);\n return null;\n } finally {\n restoreWidgetRoot(hidden);\n }\n}\n\n/**\n * Synchronous fallback that renders only the drawing strokes onto a\n * translucent white background and returns a PNG data-URL. Used when DOM\n * capture is unavailable. Returns `null` on degenerate size, missing context,\n * or a thrown error (logged and swallowed).\n */\nexport function captureDrawingStrokes(\n regionX: number,\n regionY: number,\n regionW: number,\n regionH: number,\n strokes: Array<{\n points: Array<{ x: number; y: number }>;\n color: string;\n fixed: boolean;\n }>,\n padding = 32,\n): string | null {\n try {\n const rect = buildCaptureRect(regionX, regionY, regionW, regionH, padding);\n const { outW, outH, scale } = computeOutputDims(rect, STROKE_MAX_DIM);\n if (outW < 1 || outH < 1) {\n return null;\n }\n\n const output = document.createElement('canvas');\n output.width = outW;\n output.height = outH;\n\n const ctx = output.getContext('2d');\n if (!ctx) {\n return null;\n }\n\n ctx.fillStyle = 'rgba(255, 255, 255, 0.85)';\n ctx.fillRect(0, 0, outW, outH);\n\n drawStrokesOnCanvas(ctx, strokes, rect.captureX, rect.captureY, scale);\n\n return output.toDataURL('image/png');\n } catch (error) {\n console.warn('[bugport-widget] Stroke capture failed:', error);\n return null;\n }\n}\n","// BugPort widget — original implementation. Do not copy third-party sources.\n\nimport type { OutputDetailLevel, ReactComponentMode } from \"../components/page-toolbar-css\";\nimport type { Annotation } from \"../types\";\n\n/**\n * Maps each output verbosity level to the React-component capture mode that\n * should accompany it. Consumed by the toolbar to keep the two settings in\n * sync when React capture is enabled.\n */\nexport const OUTPUT_TO_REACT_MODE: Record<OutputDetailLevel, ReactComponentMode> = {\n compact: \"off\",\n standard: \"filtered\",\n detailed: \"smart\",\n forensic: \"all\",\n};\n\n/**\n * Ordered option list backing the output-detail picker. The order here is the\n * order the options are presented to the user.\n */\nexport const OUTPUT_DETAIL_OPTIONS: { value: OutputDetailLevel; label: string }[] = [\n { value: \"compact\", label: \"Compact\" },\n { value: \"standard\", label: \"Standard\" },\n { value: \"detailed\", label: \"Detailed\" },\n { value: \"forensic\", label: \"Forensic\" },\n];\n\n// Unicode multiplication sign (U+00D7) used for dimension separators.\nconst TIMES = \"×\";\n\n/** True when a DOM window is available (i.e. not running under SSR). */\nfunction hasWindow(): boolean {\n return typeof window !== \"undefined\";\n}\n\n/** Resolves the viewport descriptor, falling back to 'unknown' under SSR. */\nfunction resolveViewport(): string {\n if (hasWindow()) {\n return `${window.innerWidth}${TIMES}${window.innerHeight}`;\n }\n return \"unknown\";\n}\n\n/**\n * Appends a `**Label:** value` line (terminated by a newline) to the running\n * list of lines, but only when the value is truthy.\n */\nfunction pushField(lines: string[], label: string, value: unknown): void {\n if (value) {\n lines.push(`**${label}:** ${value}\\n`);\n }\n}\n\n/** Renders the forensic-mode Environment block, including the trailing rule. */\nfunction renderEnvironment(viewport: string): string {\n const lines: string[] = [\"\", \"**Environment:**\", `- Viewport: ${viewport}`];\n\n if (hasWindow()) {\n lines.push(`- URL: ${window.location.href}`);\n lines.push(`- User Agent: ${navigator.userAgent}`);\n lines.push(`- Timestamp: ${new Date().toISOString()}`);\n lines.push(`- Device Pixel Ratio: ${window.devicePixelRatio}`);\n }\n\n return lines.join(\"\\n\") + \"\\n---\\n\";\n}\n\n/** Compact mode: a single dense line per annotation. */\nfunction renderCompact(annotation: Annotation, position: number): string {\n let line = `${position}. **${annotation.element}**`;\n\n if (annotation.sourceFile) {\n line += ` (${annotation.sourceFile})`;\n }\n\n line += `: ${annotation.comment}`;\n\n const selected = annotation.selectedText;\n if (selected) {\n const excerpt = selected.slice(0, 30);\n const suffix = selected.length > 30 ? \"...\" : \"\";\n line += ` (re: \"${excerpt}${suffix}\")`;\n }\n\n return line + \"\\n\";\n}\n\n/** Forensic mode: every captured signal for the annotation. */\nfunction renderForensic(annotation: Annotation, position: number): string {\n const lines: string[] = [`### ${position}. ${annotation.element}\\n`];\n\n if (annotation.isMultiSelect && annotation.fullPath) {\n lines.push(\"*Forensic data shown for first element of selection*\\n\");\n }\n\n pushField(lines, \"Full DOM Path\", annotation.fullPath);\n pushField(lines, \"CSS Classes\", annotation.cssClasses);\n\n const box = annotation.boundingBox;\n if (box) {\n const x = Math.round(box.x);\n const y = Math.round(box.y);\n const w = Math.round(box.width);\n const h = Math.round(box.height);\n lines.push(`**Position:** x:${x}, y:${y} (${w}${TIMES}${h}px)\\n`);\n }\n\n lines.push(\n `**Annotation at:** ${annotation.x.toFixed(1)}% from left, ${Math.round(annotation.y)}px from top\\n`,\n );\n\n if (annotation.selectedText) {\n lines.push(`**Selected text:** \"${annotation.selectedText}\"\\n`);\n } else if (annotation.nearbyText) {\n lines.push(`**Context:** ${annotation.nearbyText.slice(0, 100)}\\n`);\n }\n\n pushField(lines, \"Computed Styles\", annotation.computedStyles);\n pushField(lines, \"Accessibility\", annotation.accessibility);\n pushField(lines, \"Nearby Elements\", annotation.nearbyElements);\n pushField(lines, \"Source\", annotation.sourceFile);\n pushField(lines, \"React\", annotation.reactComponents);\n\n lines.push(`**Feedback:** ${annotation.comment}\\n\\n`);\n\n return lines.join(\"\");\n}\n\n/** Standard and detailed modes share a base shape; detailed adds extra fields. */\nfunction renderStandardOrDetailed(\n annotation: Annotation,\n position: number,\n detailed: boolean,\n): string {\n const lines: string[] = [\n `### ${position}. ${annotation.element}\\n`,\n `**Location:** ${annotation.elementPath}\\n`,\n ];\n\n pushField(lines, \"Source\", annotation.sourceFile);\n pushField(lines, \"React\", annotation.reactComponents);\n\n if (detailed) {\n pushField(lines, \"Classes\", annotation.cssClasses);\n\n const box = annotation.boundingBox;\n if (box) {\n const x = Math.round(box.x);\n const y = Math.round(box.y);\n const w = Math.round(box.width);\n const h = Math.round(box.height);\n lines.push(`**Position:** ${x}px, ${y}px (${w}${TIMES}${h}px)\\n`);\n }\n }\n\n if (annotation.selectedText) {\n lines.push(`**Selected text:** \"${annotation.selectedText}\"\\n`);\n } else if (detailed && annotation.nearbyText) {\n lines.push(`**Context:** ${annotation.nearbyText.slice(0, 100)}\\n`);\n }\n\n lines.push(`**Feedback:** ${annotation.comment}\\n\\n`);\n\n return lines.join(\"\");\n}\n\n/**\n * Produces a Markdown summary of the supplied page annotations at the requested\n * verbosity. Returns an empty string when there is nothing to report.\n */\nexport function generateOutput(\n annotations: Annotation[],\n pathname: string,\n detailLevel: OutputDetailLevel = \"standard\",\n): string {\n if (annotations.length === 0) {\n return \"\";\n }\n\n const viewport = resolveViewport();\n\n const sections: string[] = [`## Page Feedback: ${pathname}\\n`];\n\n if (detailLevel === \"forensic\") {\n sections.push(renderEnvironment(viewport));\n } else if (detailLevel !== \"compact\") {\n // standard & detailed share a single viewport line.\n sections.push(`**Viewport:** ${viewport}\\n`);\n }\n // compact: no viewport/environment section at all.\n\n sections.push(\"\\n\");\n\n annotations.forEach((annotation, index) => {\n const position = index + 1;\n\n if (detailLevel === \"compact\") {\n sections.push(renderCompact(annotation, position));\n } else if (detailLevel === \"forensic\") {\n sections.push(renderForensic(annotation, position));\n } else {\n sections.push(renderStandardOrDetailed(annotation, position, detailLevel === \"detailed\"));\n }\n });\n\n return sections.join(\"\").trim();\n}\n","// BugPort widget — original implementation. Do not copy third-party sources.\n//\n// Builds the diagnostics block that rides along on a widget submission,\n// honouring per-source user consent. Only consented sources are included.\n\nimport type { DiagnosticsCollector } from \"./collector\";\nimport type {\n BugPortDiagnosticsPayload,\n DiagnosticsConsent,\n} from \"./types\";\n\n/**\n * Snapshot the collector buffers into a submission payload, including only the\n * sources the user has consented to. Returns `undefined` when nothing is to be\n * attached, keeping the submission byte-for-byte identical to a pre-diagnostics\n * report.\n */\nexport function buildDiagnosticsPayload(\n collector: DiagnosticsCollector | null | undefined,\n consent: DiagnosticsConsent,\n): BugPortDiagnosticsPayload | undefined {\n if (!collector) {\n return undefined;\n }\n\n const console = consent.console ? collector.getConsoleEvents() : [];\n const runtimeErrors = consent.runtimeErrors ? collector.getRuntimeErrorEvents() : [];\n const network = consent.network ? collector.getNetworkEvents() : [];\n\n if (console.length === 0 && runtimeErrors.length === 0 && network.length === 0) {\n // Still record consent so the backend/dashboard can distinguish \"user said\n // no\" from \"nothing was captured\" — but only when the user actually opted\n // into at least one source.\n if (!consent.console && !consent.runtimeErrors && !consent.network) {\n return undefined;\n }\n }\n\n return {\n console: console.length > 0 ? console : undefined,\n runtimeErrors: runtimeErrors.length > 0 ? runtimeErrors : undefined,\n network: network.length > 0 ? network : undefined,\n capturedAt: new Date().toISOString(),\n userConsent: {\n console: consent.console,\n runtimeErrors: consent.runtimeErrors,\n network: consent.network,\n },\n };\n}\n\n/** True when a collector currently holds at least one event of any kind. */\nexport function hasDiagnosticEvents(collector: DiagnosticsCollector | null | undefined): boolean {\n if (!collector) {\n return false;\n }\n return (\n collector.getConsoleEvents().length > 0 ||\n collector.getRuntimeErrorEvents().length > 0 ||\n collector.getNetworkEvents().length > 0\n );\n}\n","\nconst css = \".styles-module__toolbar___wNsdK {\\n --bp-cream-canvas: #fefbff;\\n --bp-surface: #ffffff;\\n --bp-surface-muted: #f9f0ff;\\n --bp-surface-hover: #f2defe;\\n --bp-border: #edeaed;\\n --bp-brand-border: #eac8fe;\\n --bp-text: #1d1c1d;\\n --bp-text-muted: #696969;\\n --bp-primary: #611f69;\\n --bp-primary-hover: #3d0157;\\n --bp-launcher-surface: #ffffff;\\n --bp-launcher-hover: #f9f0ff;\\n --bp-tooltip-surface: #1d1c1d;\\n --bp-tooltip-text: #fefbff;\\n --bp-shadow-soft: 0 5px 20px rgba(29, 28, 29, 0.08), 0 0 0 1px rgba(234, 200, 254, 0.55);\\n position: fixed;\\n bottom: 1.25rem;\\n right: 1.25rem;\\n width: 337px;\\n z-index: 100000;\\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, Helvetica, Arial, sans-serif;\\n pointer-events: none;\\n transition: left 0s, top 0s, right 0s, bottom 0s;\\n}\\n[data-bugport-widget-theme=dark] .styles-module__toolbar___wNsdK {\\n --bp-surface: #481a54;\\n --bp-surface-muted: rgba(255, 255, 255, 0.12);\\n --bp-surface-hover: rgba(255, 255, 255, 0.16);\\n --bp-border: rgba(234, 200, 254, 0.18);\\n --bp-brand-border: rgba(234, 200, 254, 0.28);\\n --bp-text: #fefbff;\\n --bp-text-muted: rgba(254, 251, 255, 0.72);\\n --bp-primary: #d17dfe;\\n --bp-primary-hover: #eac8fe;\\n --bp-launcher-surface: #fefbff;\\n --bp-launcher-hover: #f2defe;\\n --bp-tooltip-surface: #fefbff;\\n --bp-tooltip-text: #1d1c1d;\\n --bp-shadow-soft: 0 10px 26px rgba(46, 0, 57, 0.28), 0 0 0 1px rgba(234, 200, 254, 0.24);\\n}\\n\\n:where(.styles-module__toolbar___wNsdK) {\\n bottom: 1.25rem;\\n right: 1.25rem;\\n}\\n\\n.styles-module__toolbar___wNsdK svg[fill=none],\\n.styles-module__markersLayer___-25j1 svg[fill=none],\\n.styles-module__fixedMarkersLayer___ffyX6 svg[fill=none] {\\n fill: none !important;\\n}\\n.styles-module__toolbar___wNsdK svg[fill=none] *:not([fill]),\\n.styles-module__markersLayer___-25j1 svg[fill=none] *:not([fill]),\\n.styles-module__fixedMarkersLayer___ffyX6 svg[fill=none] *:not([fill]) {\\n fill: none !important;\\n}\\n\\n.styles-module__toolbarContainer___dIhma {\\n position: relative;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n margin-left: auto;\\n align-self: flex-end;\\n background: var(--bp-surface);\\n color: var(--bp-text);\\n border: 1px solid var(--bp-brand-border);\\n box-shadow: var(--bp-shadow-soft);\\n pointer-events: auto;\\n transition: width 0.4s cubic-bezier(0.19, 1, 0.22, 1), transform 0.4s cubic-bezier(0.19, 1, 0.22, 1);\\n}\\n\\n.styles-module__entrance___sgHd8 {\\n animation: styles-module__toolbarEnter___u8RRu 0.5s cubic-bezier(0.34, 1.2, 0.64, 1) forwards;\\n}\\n\\n.styles-module__hiding___1td44 {\\n animation: styles-module__toolbarHide___y8kaT 0.4s ease-in forwards;\\n pointer-events: none;\\n}\\n\\n.styles-module__collapsed___Rydsn {\\n width: 48px;\\n height: 48px;\\n border-radius: 8px;\\n padding: 0;\\n cursor: pointer;\\n background: var(--bp-launcher-surface);\\n}\\n.styles-module__collapsed___Rydsn svg {\\n display: block;\\n}\\n.styles-module__collapsed___Rydsn:hover {\\n background: var(--bp-launcher-hover);\\n}\\n.styles-module__collapsed___Rydsn:active {\\n transform: scale(0.95);\\n}\\n\\n.styles-module__expanded___ofKPx {\\n height: 48px;\\n border-radius: 8px;\\n padding: 0.375rem;\\n width: 297px;\\n}\\n\\n.styles-module__toggleLogo___cdWHM {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 42px;\\n height: 42px;\\n}\\n\\n.styles-module__toggleContent___0yfyP {\\n position: absolute;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n transition: opacity 0.1s ease;\\n}\\n.styles-module__toggleContent___0yfyP.styles-module__visible___KHwEW {\\n opacity: 1;\\n visibility: visible;\\n pointer-events: auto;\\n}\\n.styles-module__toggleContent___0yfyP.styles-module__hidden___Ae8H4 {\\n opacity: 0;\\n pointer-events: none;\\n}\\n\\n.styles-module__controlsContent___9GJWU {\\n display: flex;\\n align-items: center;\\n gap: 0.375rem;\\n transition: filter 0.8s cubic-bezier(0.19, 1, 0.22, 1), opacity 0.8s cubic-bezier(0.19, 1, 0.22, 1), transform 0.6s cubic-bezier(0.19, 1, 0.22, 1);\\n}\\n.styles-module__controlsContent___9GJWU.styles-module__visible___KHwEW {\\n opacity: 1;\\n filter: blur(0);\\n transform: scale(1);\\n visibility: visible;\\n pointer-events: auto;\\n}\\n.styles-module__controlsContent___9GJWU.styles-module__hidden___Ae8H4 {\\n opacity: 0;\\n filter: blur(10px);\\n transform: scale(0.4);\\n visibility: hidden;\\n pointer-events: none;\\n}\\n.styles-module__controlsContent___9GJWU :where(button, input, select, textarea, label) {\\n background: unset;\\n border: unset;\\n border-radius: unset;\\n padding: unset;\\n margin: unset;\\n color: unset;\\n font-family: unset;\\n font-weight: unset;\\n font-style: unset;\\n line-height: unset;\\n letter-spacing: unset;\\n text-transform: unset;\\n text-decoration: unset;\\n box-shadow: unset;\\n outline: unset;\\n}\\n\\n.styles-module__badge___2XsgF {\\n position: absolute;\\n top: -13px;\\n right: -13px;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n min-width: 18px;\\n height: 18px;\\n padding: 0 5px;\\n border-radius: 9px;\\n background: var(--bugport-widget-color-accent);\\n color: #ffffff;\\n font-size: 0.625rem;\\n font-weight: 600;\\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15), inset 0 0 0 1px rgba(255, 255, 255, 0.04);\\n transition: transform 0.3s, opacity 0.2s;\\n}\\n.styles-module__badge___2XsgF.styles-module__fadeOut___6Ut6- {\\n opacity: 0;\\n transform: scale(0);\\n pointer-events: none;\\n}\\n.styles-module__badge___2XsgF.styles-module__entrance___sgHd8 {\\n animation: styles-module__badgeEnter___mVQLj 0.3s cubic-bezier(0.34, 1.56, 0.64, 1) 0.4s both;\\n}\\n\\n.styles-module__controlButton___8Q0jc {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 34px;\\n height: 34px;\\n border-radius: 6px;\\n border: none;\\n background: transparent;\\n color: var(--bp-text-muted);\\n transition: background 0.15s, color 0.15s, transform 0.1s, opacity 0.2s;\\n}\\n.styles-module__controlButton___8Q0jc:hover:not(:disabled):not(.styles-module__active___-zoN6):not([data-failed=true]):not([data-auto-sync=true]):not([data-error=true]):not([data-no-hover=true]) {\\n background: var(--bp-surface-hover);\\n color: var(--bp-text);\\n}\\n.styles-module__controlButton___8Q0jc:active {\\n transform: scale(0.92);\\n}\\n.styles-module__controlButton___8Q0jc:disabled {\\n opacity: 0.35;\\n cursor: not-allowed;\\n}\\n.styles-module__controlButton___8Q0jc[data-active=true] {\\n color: var(--bp-primary);\\n background: var(--bp-surface-muted);\\n}\\n.styles-module__controlButton___8Q0jc[data-error=true], .styles-module__controlButton___8Q0jc[data-failed=true] {\\n color: var(--bugport-widget-color-red);\\n background: color-mix(in srgb, var(--bugport-widget-color-red) 25%, transparent);\\n}\\n.styles-module__controlButton___8Q0jc[data-danger]:hover {\\n background: color-mix(in srgb, var(--bugport-widget-color-red) 25%, transparent);\\n color: var(--bugport-widget-color-red);\\n}\\n.styles-module__controlButton___8Q0jc[data-no-hover=true], .styles-module__controlButton___8Q0jc.styles-module__statusShowing___te6iu {\\n cursor: default;\\n pointer-events: none;\\n background: transparent !important;\\n}\\n.styles-module__controlButton___8Q0jc[data-auto-sync=true] {\\n color: var(--bugport-widget-color-green);\\n background: transparent;\\n cursor: default;\\n}\\n\\n.styles-module__buttonBadge___NeFWb {\\n position: absolute;\\n top: 0;\\n right: 0;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n min-width: 16px;\\n height: 16px;\\n padding: 0 4px;\\n border-radius: 8px;\\n background: var(--bugport-widget-color-accent);\\n color: #ffffff;\\n font-size: 0.625rem;\\n font-weight: 600;\\n box-shadow: 0 0 0 2px var(--bp-surface), 0 1px 3px rgba(0, 0, 0, 0.2);\\n pointer-events: none;\\n}\\n\\n.styles-module__buttonWrapper___rBcdv {\\n position: relative;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n}\\n.styles-module__buttonWrapper___rBcdv:hover .styles-module__buttonTooltip___Burd9 {\\n opacity: 1;\\n visibility: visible;\\n transform: translateX(-50%) scale(1);\\n transition-delay: 0.85s;\\n}\\n.styles-module__buttonWrapper___rBcdv:has(.styles-module__controlButton___8Q0jc:disabled):hover .styles-module__buttonTooltip___Burd9 {\\n opacity: 0;\\n visibility: hidden;\\n}\\n\\n.styles-module__tooltipsInSession___-0lHH .styles-module__buttonWrapper___rBcdv:hover .styles-module__buttonTooltip___Burd9 {\\n transition-delay: 0s;\\n}\\n\\n.styles-module__buttonTooltip___Burd9 {\\n position: absolute;\\n bottom: calc(100% + 14px);\\n left: 50%;\\n transform: translateX(-50%) scale(0.95);\\n padding: 6px 10px;\\n background: var(--bp-tooltip-surface);\\n color: var(--bp-tooltip-text);\\n font-size: 12px;\\n font-weight: 500;\\n border-radius: 8px;\\n white-space: nowrap;\\n z-index: 100001;\\n box-shadow: 0 8px 24px rgba(29, 28, 29, 0.16), 0 0 0 1px rgba(234, 200, 254, 0.35);\\n opacity: 0;\\n visibility: hidden;\\n pointer-events: none;\\n transition: opacity 0.135s ease, transform 0.135s ease, visibility 0.135s ease;\\n}\\n.styles-module__buttonTooltip___Burd9::after {\\n content: \\\"\\\";\\n position: absolute;\\n top: calc(100% - 4px);\\n left: 50%;\\n width: 8px;\\n height: 8px;\\n background: var(--bp-tooltip-surface);\\n border-radius: 0 0 2px 0;\\n transform: translateX(-50%) rotate(45deg);\\n}\\n\\n.styles-module__tooltipBelow___m6ats .styles-module__buttonTooltip___Burd9 {\\n bottom: auto;\\n top: calc(100% + 14px);\\n}\\n.styles-module__tooltipBelow___m6ats .styles-module__buttonTooltip___Burd9::after {\\n top: -4px;\\n border-radius: 2px 0 0 0;\\n}\\n.styles-module__tooltipBelow___m6ats .styles-module__buttonWrapper___rBcdv:hover .styles-module__buttonTooltip___Burd9 {\\n transform: translateX(-50%) scale(1);\\n}\\n\\n.styles-module__buttonWrapperAlignLeft___myzIp .styles-module__buttonTooltip___Burd9 {\\n transform: translateX(-12px) scale(0.95);\\n}\\n.styles-module__buttonWrapperAlignLeft___myzIp .styles-module__buttonTooltip___Burd9::after {\\n left: 16px;\\n}\\n.styles-module__buttonWrapperAlignLeft___myzIp:hover .styles-module__buttonTooltip___Burd9 {\\n transform: translateX(-12px) scale(1);\\n}\\n.styles-module__buttonWrapperAlignLeft___myzIp.styles-module__tooltipBelow___m6ats:hover .styles-module__buttonTooltip___Burd9, .styles-module__tooltipBelow___m6ats .styles-module__buttonWrapperAlignLeft___myzIp:hover .styles-module__buttonTooltip___Burd9 {\\n transform: translateX(-12px) scale(1);\\n}\\n\\n.styles-module__buttonWrapperAlignRight___HCQFR .styles-module__buttonTooltip___Burd9 {\\n transform: translateX(calc(-100% + 12px)) scale(0.95);\\n}\\n.styles-module__buttonWrapperAlignRight___HCQFR .styles-module__buttonTooltip___Burd9::after {\\n left: auto;\\n right: 8px;\\n}\\n.styles-module__buttonWrapperAlignRight___HCQFR:hover .styles-module__buttonTooltip___Burd9 {\\n transform: translateX(calc(-100% + 12px)) scale(1);\\n}\\n.styles-module__buttonWrapperAlignRight___HCQFR.styles-module__tooltipBelow___m6ats:hover .styles-module__buttonTooltip___Burd9, .styles-module__tooltipBelow___m6ats .styles-module__buttonWrapperAlignRight___HCQFR:hover .styles-module__buttonTooltip___Burd9 {\\n transform: translateX(calc(-100% + 12px)) scale(1);\\n}\\n\\n.styles-module__shortcut___lEAQk {\\n margin-left: 4px;\\n opacity: 0.5;\\n}\\n\\n.styles-module__tooltipsHidden___VtLJG .styles-module__buttonTooltip___Burd9 {\\n opacity: 0 !important;\\n visibility: hidden !important;\\n transition: none !important;\\n}\\n\\n.styles-module__divider___c--s1 {\\n width: 1px;\\n height: 12px;\\n background: var(--bp-border);\\n margin: 0 0.125rem;\\n}\\n\\n.styles-module__overlay___Q1O9y {\\n position: fixed;\\n inset: 0;\\n z-index: 99997;\\n pointer-events: none;\\n}\\n.styles-module__overlay___Q1O9y > * {\\n pointer-events: auto;\\n}\\n\\n.styles-module__hoverHighlight___ogakW {\\n position: fixed;\\n border: 2px solid color-mix(in srgb, var(--bugport-widget-color-accent) 50%, transparent);\\n background: color-mix(in srgb, var(--bugport-widget-color-accent) 4%, transparent);\\n border-radius: 4px;\\n pointer-events: none !important;\\n box-sizing: border-box;\\n will-change: opacity;\\n contain: layout style;\\n}\\n.styles-module__hoverHighlight___ogakW.styles-module__enter___WFIki {\\n animation: styles-module__hoverHighlightIn___6WYHY 0.12s ease-out forwards;\\n}\\n\\n.styles-module__multiSelectOutline___cSJ-m {\\n position: fixed;\\n border: 2px dashed color-mix(in srgb, var(--bugport-widget-color-green) 60%, transparent);\\n background: color-mix(in srgb, var(--bugport-widget-color-green) 5%, transparent);\\n border-radius: 4px;\\n pointer-events: none !important;\\n contain: layout style;\\n}\\n.styles-module__multiSelectOutline___cSJ-m.styles-module__enter___WFIki {\\n animation: styles-module__fadeIn___b9qmf 0.15s ease-out forwards;\\n}\\n.styles-module__multiSelectOutline___cSJ-m.styles-module__exit___fyOJ0 {\\n animation: styles-module__fadeOut___6Ut6- 0.15s ease-out forwards;\\n}\\n\\n.styles-module__singleSelectOutline___QhX-O {\\n position: fixed;\\n border: 2px solid color-mix(in srgb, var(--bugport-widget-color-blue) 60%, transparent);\\n background: color-mix(in srgb, var(--bugport-widget-color-blue) 5%, transparent);\\n border-radius: 4px;\\n pointer-events: none !important;\\n contain: layout style;\\n}\\n.styles-module__singleSelectOutline___QhX-O.styles-module__enter___WFIki {\\n animation: styles-module__fadeIn___b9qmf 0.15s ease-out forwards;\\n}\\n.styles-module__singleSelectOutline___QhX-O.styles-module__exit___fyOJ0 {\\n animation: styles-module__fadeOut___6Ut6- 0.15s ease-out forwards;\\n}\\n\\n.styles-module__hoverTooltip___bvLk7 {\\n position: fixed;\\n font-size: 0.6875rem;\\n font-weight: 500;\\n color: #ffffff;\\n background: rgba(0, 0, 0, 0.85);\\n padding: 0.35rem 0.6rem;\\n border-radius: 0.375rem;\\n white-space: nowrap;\\n max-width: 280px;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n pointer-events: none !important;\\n}\\n.styles-module__hoverTooltip___bvLk7.styles-module__enter___WFIki {\\n animation: styles-module__hoverTooltipIn___FYGQx 0.1s ease-out forwards;\\n}\\n\\n.styles-module__hoverReactPath___gx1IJ {\\n font-size: 0.625rem;\\n color: rgba(255, 255, 255, 0.6);\\n margin-bottom: 0.15rem;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n.styles-module__hoverElementName___QMLMl {\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n.styles-module__markersLayer___-25j1 {\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n height: 0;\\n z-index: 99998;\\n pointer-events: none;\\n}\\n.styles-module__markersLayer___-25j1 > * {\\n pointer-events: auto;\\n}\\n\\n.styles-module__fixedMarkersLayer___ffyX6 {\\n position: fixed;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n z-index: 99998;\\n pointer-events: none;\\n}\\n.styles-module__fixedMarkersLayer___ffyX6 > * {\\n pointer-events: auto;\\n}\\n\\n.styles-module__drawCanvas___7cG9U {\\n position: fixed;\\n inset: 0;\\n z-index: 99996;\\n pointer-events: none !important;\\n}\\n.styles-module__drawCanvas___7cG9U.styles-module__active___-zoN6 {\\n pointer-events: auto !important;\\n cursor: crosshair !important;\\n}\\n.styles-module__drawCanvas___7cG9U.styles-module__active___-zoN6[data-stroke-hover] {\\n cursor: pointer !important;\\n}\\n\\n.styles-module__dragSelection___kZLq2 {\\n position: fixed;\\n top: 0;\\n left: 0;\\n border: 2px solid color-mix(in srgb, var(--bugport-widget-color-green) 60%, transparent);\\n background: color-mix(in srgb, var(--bugport-widget-color-green) 8%, transparent);\\n border-radius: 4px;\\n pointer-events: none;\\n z-index: 99997;\\n will-change: transform, width, height;\\n contain: layout style;\\n}\\n\\n.styles-module__highlightsContainer___-0xzG {\\n position: fixed;\\n top: 0;\\n left: 0;\\n pointer-events: none;\\n z-index: 99996;\\n}\\n\\n.styles-module__selectedElementHighlight___fyVlI {\\n position: fixed;\\n border: 2px solid color-mix(in srgb, var(--bugport-widget-color-green) 50%, transparent);\\n background: color-mix(in srgb, var(--bugport-widget-color-green) 6%, transparent);\\n border-radius: 4px;\\n pointer-events: none;\\n will-change: transform, width, height;\\n contain: layout style;\\n}\\n\\n.styles-module__disableTransitions___EopxO :is(*, *::before, *::after) {\\n transition: none !important;\\n}\\n\\n[data-bugport-widget-theme=light] .styles-module__toolbarContainer___dIhma {\\n background: #ffffff;\\n color: rgba(0, 0, 0, 0.85);\\n box-shadow: 0 5px 20px rgba(0, 0, 0, 0.08), 0 0 0 1px rgba(0, 0, 0, 0.06);\\n}\\n[data-bugport-widget-theme=light] .styles-module__controlButton___8Q0jc {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n[data-bugport-widget-theme=light] .styles-module__controlButton___8Q0jc:hover:not(:disabled):not(.styles-module__active___-zoN6):not([data-failed=true]):not([data-auto-sync=true]):not([data-error=true]):not([data-no-hover=true]) {\\n background: rgba(0, 0, 0, 0.06);\\n color: rgba(0, 0, 0, 0.85);\\n}\\n[data-bugport-widget-theme=light] .styles-module__controlButton___8Q0jc[data-active=true] {\\n color: var(--bugport-widget-color-blue);\\n background: color-mix(in srgb, var(--bugport-widget-color-blue) 15%, transparent);\\n}\\n[data-bugport-widget-theme=light] .styles-module__controlButton___8Q0jc[data-error=true], [data-bugport-widget-theme=light] .styles-module__controlButton___8Q0jc[data-failed=true] {\\n color: var(--bugport-widget-color-red);\\n background: color-mix(in srgb, var(--bugport-widget-color-red) 15%, transparent);\\n}\\n[data-bugport-widget-theme=light] .styles-module__controlButton___8Q0jc[data-danger]:hover {\\n background: color-mix(in srgb, var(--bugport-widget-color-red) 15%, transparent);\\n color: var(--bugport-widget-color-red);\\n}\\n[data-bugport-widget-theme=light] .styles-module__buttonTooltip___Burd9 {\\n background: #ffffff;\\n color: rgba(0, 0, 0, 0.85);\\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.06);\\n}\\n[data-bugport-widget-theme=light] .styles-module__buttonTooltip___Burd9::after {\\n background: #ffffff;\\n}\\n[data-bugport-widget-theme=light] .styles-module__divider___c--s1 {\\n background: rgba(0, 0, 0, 0.1);\\n}\\n\\n@keyframes styles-module__toolbarEnter___u8RRu {\\n from {\\n opacity: 0;\\n transform: scale(0.5) rotate(90deg);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1) rotate(0deg);\\n }\\n}\\n@keyframes styles-module__toolbarHide___y8kaT {\\n from {\\n opacity: 1;\\n transform: scale(1);\\n }\\n to {\\n opacity: 0;\\n transform: scale(0.8);\\n }\\n}\\n@keyframes styles-module__badgeEnter___mVQLj {\\n from {\\n opacity: 0;\\n transform: scale(0);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n@keyframes styles-module__scaleIn___c-r1K {\\n from {\\n opacity: 0;\\n transform: scale(0.85);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n@keyframes styles-module__slideUp___kgD36 {\\n from {\\n opacity: 0;\\n transform: scale(0.85) translateY(8px);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1) translateY(0);\\n }\\n}\\n@keyframes styles-module__slideDown___zcdje {\\n from {\\n opacity: 0;\\n transform: scale(0.85) translateY(-8px);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1) translateY(0);\\n }\\n}\\n@keyframes styles-module__fadeIn___b9qmf {\\n from {\\n opacity: 0;\\n }\\n to {\\n opacity: 1;\\n }\\n}\\n@keyframes styles-module__fadeOut___6Ut6- {\\n from {\\n opacity: 1;\\n }\\n to {\\n opacity: 0;\\n }\\n}\\n@keyframes styles-module__hoverHighlightIn___6WYHY {\\n from {\\n opacity: 0;\\n transform: scale(0.98);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1);\\n }\\n}\\n@keyframes styles-module__hoverTooltipIn___FYGQx {\\n from {\\n opacity: 0;\\n transform: scale(0.95) translateY(4px);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1) translateY(0);\\n }\\n}\";\nconst classNames = {\"toolbar\":\"styles-module__toolbar___wNsdK\",\"markersLayer\":\"styles-module__markersLayer___-25j1\",\"fixedMarkersLayer\":\"styles-module__fixedMarkersLayer___ffyX6\",\"toolbarContainer\":\"styles-module__toolbarContainer___dIhma\",\"entrance\":\"styles-module__entrance___sgHd8\",\"toolbarEnter\":\"styles-module__toolbarEnter___u8RRu\",\"hiding\":\"styles-module__hiding___1td44\",\"toolbarHide\":\"styles-module__toolbarHide___y8kaT\",\"collapsed\":\"styles-module__collapsed___Rydsn\",\"expanded\":\"styles-module__expanded___ofKPx\",\"toggleLogo\":\"styles-module__toggleLogo___cdWHM\",\"toggleContent\":\"styles-module__toggleContent___0yfyP\",\"visible\":\"styles-module__visible___KHwEW\",\"hidden\":\"styles-module__hidden___Ae8H4\",\"controlsContent\":\"styles-module__controlsContent___9GJWU\",\"badge\":\"styles-module__badge___2XsgF\",\"fadeOut\":\"styles-module__fadeOut___6Ut6-\",\"badgeEnter\":\"styles-module__badgeEnter___mVQLj\",\"controlButton\":\"styles-module__controlButton___8Q0jc\",\"active\":\"styles-module__active___-zoN6\",\"statusShowing\":\"styles-module__statusShowing___te6iu\",\"buttonBadge\":\"styles-module__buttonBadge___NeFWb\",\"buttonWrapper\":\"styles-module__buttonWrapper___rBcdv\",\"buttonTooltip\":\"styles-module__buttonTooltip___Burd9\",\"tooltipsInSession\":\"styles-module__tooltipsInSession___-0lHH\",\"tooltipBelow\":\"styles-module__tooltipBelow___m6ats\",\"buttonWrapperAlignLeft\":\"styles-module__buttonWrapperAlignLeft___myzIp\",\"buttonWrapperAlignRight\":\"styles-module__buttonWrapperAlignRight___HCQFR\",\"shortcut\":\"styles-module__shortcut___lEAQk\",\"tooltipsHidden\":\"styles-module__tooltipsHidden___VtLJG\",\"divider\":\"styles-module__divider___c--s1\",\"overlay\":\"styles-module__overlay___Q1O9y\",\"hoverHighlight\":\"styles-module__hoverHighlight___ogakW\",\"enter\":\"styles-module__enter___WFIki\",\"hoverHighlightIn\":\"styles-module__hoverHighlightIn___6WYHY\",\"multiSelectOutline\":\"styles-module__multiSelectOutline___cSJ-m\",\"fadeIn\":\"styles-module__fadeIn___b9qmf\",\"exit\":\"styles-module__exit___fyOJ0\",\"singleSelectOutline\":\"styles-module__singleSelectOutline___QhX-O\",\"hoverTooltip\":\"styles-module__hoverTooltip___bvLk7\",\"hoverTooltipIn\":\"styles-module__hoverTooltipIn___FYGQx\",\"hoverReactPath\":\"styles-module__hoverReactPath___gx1IJ\",\"hoverElementName\":\"styles-module__hoverElementName___QMLMl\",\"drawCanvas\":\"styles-module__drawCanvas___7cG9U\",\"dragSelection\":\"styles-module__dragSelection___kZLq2\",\"highlightsContainer\":\"styles-module__highlightsContainer___-0xzG\",\"selectedElementHighlight\":\"styles-module__selectedElementHighlight___fyVlI\",\"disableTransitions\":\"styles-module__disableTransitions___EopxO\",\"scaleIn\":\"styles-module__scaleIn___c-r1K\",\"slideUp\":\"styles-module__slideUp___kgD36\",\"slideDown\":\"styles-module__slideDown___zcdje\"};\n\nif (typeof document !== \"undefined\") {\n let style = document.getElementById(\"bugport-widget-styles-page-toolbar-css-styles\");\n if (!style) {\n style = document.createElement(\"style\");\n style.id = \"bugport-widget-styles-page-toolbar-css-styles\";\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","\nconst css = \"@keyframes styles-module__markerIn___x4G8D {\\n 0% {\\n opacity: 0;\\n transform: translate(-50%, -50%) scale(0.3);\\n }\\n 100% {\\n opacity: 1;\\n transform: translate(-50%, -50%) scale(1);\\n }\\n}\\n@keyframes styles-module__markerOut___6VhQN {\\n 0% {\\n opacity: 1;\\n transform: translate(-50%, -50%) scale(1);\\n }\\n 100% {\\n opacity: 0;\\n transform: translate(-50%, -50%) scale(0.3);\\n }\\n}\\n@keyframes styles-module__renumberRoll___akV9B {\\n 0% {\\n opacity: 0;\\n transform: translateX(-40%);\\n }\\n 100% {\\n opacity: 1;\\n transform: translateX(0);\\n }\\n}\\n@keyframes styles-module__tooltipIn___aJslQ {\\n from {\\n opacity: 0;\\n transform: translateX(-50%) translateY(2px) scale(0.891);\\n }\\n to {\\n opacity: 1;\\n transform: translateX(-50%) translateY(0) scale(0.909);\\n }\\n}\\n.styles-module__marker___9CKF7 {\\n position: absolute;\\n z-index: 1;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 22px;\\n height: 22px;\\n border-radius: 50%;\\n background-color: var(--bugport-widget-color-blue);\\n color: #fff;\\n font-size: 0.6875rem;\\n font-weight: 600;\\n transform: translate(-50%, -50%) scale(1);\\n opacity: 1;\\n cursor: pointer;\\n user-select: none;\\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2), inset 0 0 0 1px rgba(0, 0, 0, 0.04);\\n will-change: transform, opacity;\\n contain: layout style;\\n}\\n.styles-module__marker___9CKF7:hover {\\n z-index: 2;\\n}\\n.styles-module__marker___9CKF7:not(.styles-module__enter___8kI3q):not(.styles-module__exit___KBdR3):not(.styles-module__clearing___8rM7K) {\\n transition: background-color 0.15s ease, transform 0.1s ease;\\n}\\n.styles-module__marker___9CKF7:not(.styles-module__enter___8kI3q):not(.styles-module__exit___KBdR3):not(.styles-module__clearing___8rM7K):hover {\\n transform: translate(-50%, -50%) scale(1.1);\\n}\\n\\n.styles-module__enter___8kI3q {\\n animation: styles-module__markerIn___x4G8D 0.25s cubic-bezier(0.22, 1, 0.36, 1) both;\\n}\\n\\n.styles-module__exit___KBdR3 {\\n animation: styles-module__markerOut___6VhQN 0.2s ease-out both;\\n pointer-events: none;\\n}\\n\\n.styles-module__clearing___8rM7K {\\n animation: styles-module__markerOut___6VhQN 0.15s ease-out both;\\n pointer-events: none;\\n}\\n\\n.styles-module__pending___BiY-U {\\n position: fixed;\\n background-color: var(--bugport-widget-color-blue);\\n cursor: default;\\n}\\n.styles-module__pending___BiY-U.styles-module__multiSelect___CPfTC {\\n background-color: var(--bugport-widget-color-green);\\n}\\n\\n.styles-module__fixed___aKrQO {\\n position: fixed;\\n}\\n\\n.styles-module__multiSelect___CPfTC {\\n width: 26px;\\n height: 26px;\\n border-radius: 6px;\\n font-size: 0.75rem;\\n background-color: var(--bugport-widget-color-green);\\n}\\n.styles-module__multiSelect___CPfTC.styles-module__pending___BiY-U {\\n background-color: var(--bugport-widget-color-green);\\n}\\n\\n.styles-module__hovered___-mg2N {\\n background-color: var(--bugport-widget-color-red);\\n}\\n\\n.styles-module__renumber___16lvD {\\n display: block;\\n animation: styles-module__renumberRoll___akV9B 0.2s ease-out;\\n}\\n\\n.styles-module__markerTooltip___-VUm- {\\n position: absolute;\\n top: calc(100% + 10px);\\n left: 50%;\\n z-index: 100002;\\n min-width: 120px;\\n max-width: 200px;\\n padding: 8px 0.75rem;\\n border-radius: 0.75rem;\\n background: #1a1a1a;\\n color: #fff;\\n font-family: system-ui, -apple-system, BlinkMacSystemFont, \\\"Segoe UI\\\", Roboto, sans-serif;\\n font-weight: 400;\\n transform: translateX(-50%) scale(0.909);\\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.08);\\n pointer-events: none;\\n cursor: default;\\n}\\n.styles-module__markerTooltip___-VUm-.styles-module__enter___8kI3q {\\n animation: styles-module__tooltipIn___aJslQ 0.1s ease-out forwards;\\n}\\n\\n.styles-module__markerQuote___tQake {\\n display: block;\\n margin-bottom: 0.3125rem;\\n color: rgba(255, 255, 255, 0.6);\\n font-size: 12px;\\n font-style: italic;\\n line-height: 1.4;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n.styles-module__markerNote___Rh4eI {\\n display: block;\\n padding-bottom: 2px;\\n color: #fff;\\n font-size: 13px;\\n font-weight: 400;\\n line-height: 1.4;\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n}\\n\\n[data-bugport-widget-theme=light] .styles-module__markerTooltip___-VUm- {\\n background: #fff;\\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.06);\\n}\\n[data-bugport-widget-theme=light] .styles-module__markerQuote___tQake {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n[data-bugport-widget-theme=light] .styles-module__markerNote___Rh4eI {\\n color: rgba(0, 0, 0, 0.85);\\n}\";\nconst classNames = {\"marker\":\"styles-module__marker___9CKF7\",\"enter\":\"styles-module__enter___8kI3q\",\"exit\":\"styles-module__exit___KBdR3\",\"clearing\":\"styles-module__clearing___8rM7K\",\"markerIn\":\"styles-module__markerIn___x4G8D\",\"markerOut\":\"styles-module__markerOut___6VhQN\",\"pending\":\"styles-module__pending___BiY-U\",\"multiSelect\":\"styles-module__multiSelect___CPfTC\",\"fixed\":\"styles-module__fixed___aKrQO\",\"hovered\":\"styles-module__hovered___-mg2N\",\"renumber\":\"styles-module__renumber___16lvD\",\"renumberRoll\":\"styles-module__renumberRoll___akV9B\",\"markerTooltip\":\"styles-module__markerTooltip___-VUm-\",\"tooltipIn\":\"styles-module__tooltipIn___aJslQ\",\"markerQuote\":\"styles-module__markerQuote___tQake\",\"markerNote\":\"styles-module__markerNote___Rh4eI\"};\n\nif (typeof document !== \"undefined\") {\n let style = document.getElementById(\"bugport-widget-styles-annotation-marker-styles\");\n if (!style) {\n style = document.createElement(\"style\");\n style.id = \"bugport-widget-styles-annotation-marker-styles\";\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","// BugPort widget — original implementation. Do not copy third-party sources.\n\"use client\";\n\nimport type { JSX } from \"react\";\nimport { Annotation } from \"../../../types\";\nimport { IconEdit, IconPlus, IconXmark } from \"../../icons\";\nimport styles from \"./styles.module.scss\";\n\n// CSS custom properties used for the two marker tints.\nconst ACCENT_TINT = \"var(--bugport-widget-color-accent)\";\nconst GREEN_TINT = \"var(--bugport-widget-color-green)\";\n\n// Each consecutive marker in a layer is offset by this many milliseconds so the\n// enter / exit animations cascade rather than firing all at once.\nconst STAGGER_STEP_MS = 20;\n\n// Quoted snippets shown in the tooltip are capped at this many characters.\nconst QUOTE_LIMIT = 30;\n\n/**\n * Decides what happens when the body of a marker is clicked: either it opens\n * the editor or it removes the annotation outright.\n */\ntype MarkerClickBehavior = \"edit\" | \"delete\";\n\ntype AnnotationMarkerProps = {\n annotation: Annotation;\n globalIndex: number;\n /** Display index within this layer (for staggered animation delays) */\n layerIndex: number;\n layerSize: number;\n isExiting: boolean;\n isClearing: boolean;\n isAnimated: boolean;\n isHovered: boolean;\n isDeleting: boolean;\n isEditingAny: boolean;\n renumberFrom: number | null;\n markerClickBehavior: MarkerClickBehavior;\n tooltipStyle?: React.CSSProperties;\n onHoverEnter: (annotation: Annotation) => void;\n onHoverLeave: () => void;\n onClick: (annotation: Annotation) => void;\n onContextMenu?: (annotation: Annotation) => void;\n};\n\n/**\n * Picks the animation modifier class for the marker. Exiting and clearing take\n * precedence over the entrance animation; an already-animated marker gets none.\n */\nfunction pickAnimationClass(\n isExiting: boolean,\n isClearing: boolean,\n isAnimated: boolean,\n): string {\n if (isExiting) return styles.exit;\n if (isClearing) return styles.clearing;\n if (!isAnimated) return styles.enter;\n return \"\";\n}\n\n/**\n * Builds the tooltip's quoted-selection fragment. Returns an empty string when\n * there is no selected text so the caller can simply concatenate it.\n */\nfunction formatSelectedQuote(selectedText: string | undefined): string {\n if (!selectedText) return \"\";\n const head = selectedText.slice(0, QUOTE_LIMIT);\n const ellipsis = selectedText.length > QUOTE_LIMIT ? \"...\" : \"\";\n return ` \"${head}${ellipsis}\"`;\n}\n\n/**\n * A single placed annotation bubble. Shows its 1-based number by default, and\n * swaps to an edit or delete affordance while hovered/deleting. On hover it also\n * surfaces a tooltip describing the target element and the author's note.\n */\nexport function AnnotationMarker({\n annotation,\n globalIndex,\n layerIndex,\n layerSize,\n isExiting,\n isClearing,\n isAnimated,\n isHovered,\n isDeleting,\n isEditingAny,\n renumberFrom,\n markerClickBehavior,\n tooltipStyle,\n onHoverEnter,\n onHoverLeave,\n onClick,\n onContextMenu,\n}: AnnotationMarkerProps): JSX.Element {\n const isMulti = annotation.isMultiSelect;\n\n // While editing is in progress everywhere, affordances are suppressed so the\n // user keeps seeing the plain numbers.\n const showDeleteState = (isHovered || isDeleting) && !isEditingAny;\n const showDeleteHover = showDeleteState && markerClickBehavior === \"delete\";\n\n const tint = isMulti ? GREEN_TINT : ACCENT_TINT;\n const animationClass = pickAnimationClass(isExiting, isClearing, isAnimated);\n\n // Exiting markers unwind from the end of the layer; everything else cascades\n // forward from the start.\n const delayUnits = isExiting ? layerSize - 1 - layerIndex : layerIndex;\n const animationDelay = `${delayUnits * STAGGER_STEP_MS}ms`;\n\n const rootClassName = [\n styles.marker,\n isMulti ? styles.multiSelect : \"\",\n animationClass,\n showDeleteHover ? styles.hovered : \"\",\n ].join(\" \");\n\n // The hover class supplies the background through CSS, so we skip the inline\n // tint in that case to let the stylesheet win.\n const rootStyle: React.CSSProperties = {\n left: `${annotation.x}%`,\n top: annotation.y,\n backgroundColor: showDeleteHover ? undefined : tint,\n animationDelay,\n };\n\n const handleClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n if (!isExiting) {\n onClick(annotation);\n }\n };\n\n // Right-click only does something in delete mode; otherwise we leave the\n // attribute absent entirely when no handler was provided.\n const handleContextMenu = onContextMenu\n ? (event: React.MouseEvent) => {\n if (markerClickBehavior !== \"delete\") return;\n event.preventDefault();\n event.stopPropagation();\n if (!isExiting) {\n onContextMenu(annotation);\n }\n }\n : undefined;\n\n const isRenumbered =\n renumberFrom !== null && globalIndex >= renumberFrom;\n\n const showTooltip = isHovered && !isEditingAny;\n\n let body: JSX.Element;\n if (showDeleteState) {\n body = showDeleteHover ? (\n <IconXmark size={isMulti ? 18 : 16} />\n ) : (\n <IconEdit size={16} />\n );\n } else {\n body = (\n <span className={isRenumbered ? styles.renumber : undefined}>\n {globalIndex + 1}\n </span>\n );\n }\n\n return (\n <div\n data-annotation-marker\n className={rootClassName}\n style={rootStyle}\n onMouseEnter={() => onHoverEnter(annotation)}\n onMouseLeave={onHoverLeave}\n onClick={handleClick}\n onContextMenu={handleContextMenu}\n >\n {body}\n {showTooltip ? (\n <div\n className={`${styles.markerTooltip} ${styles.enter}`}\n style={tooltipStyle}\n >\n <span className={styles.markerQuote}>\n {annotation.element}\n {formatSelectedQuote(annotation.selectedText)}\n </span>\n <span className={styles.markerNote}>{annotation.comment}</span>\n </div>\n ) : null}\n </div>\n );\n}\n\ntype PendingMarkerProps = {\n x: number;\n y: number;\n isMultiSelect?: boolean;\n isExiting: boolean;\n};\n\n/**\n * A short-lived placeholder shown at the click location while a brand-new\n * annotation is being authored. Deliberately omits the data-annotation-marker\n * attribute so freeze/hit-test logic ignores it.\n */\nexport function PendingMarker({\n x,\n y,\n isMultiSelect,\n isExiting,\n}: PendingMarkerProps): JSX.Element {\n const className = `${styles.marker} ${styles.pending} ${\n isMultiSelect ? styles.multiSelect : \"\"\n } ${isExiting ? styles.exit : styles.enter}`;\n\n return (\n <div\n className={className}\n style={{\n left: `${x}%`,\n top: y,\n backgroundColor: isMultiSelect ? GREEN_TINT : ACCENT_TINT,\n }}\n >\n <IconPlus size={12} />\n </div>\n );\n}\n\ntype ExitingMarkerProps = {\n annotation: Annotation;\n fixed?: boolean;\n};\n\n/**\n * Renders a marker frozen in its removal animation. Used while an annotation is\n * being deleted; `fixed` switches it to viewport-fixed positioning.\n */\nexport function ExitingMarker({\n annotation,\n fixed,\n}: ExitingMarkerProps): JSX.Element {\n const isMulti = annotation.isMultiSelect;\n\n const className = `${styles.marker} ${fixed ? styles.fixed : \"\"} ${\n styles.hovered\n } ${isMulti ? styles.multiSelect : \"\"} ${styles.exit}`;\n\n return (\n <div\n data-annotation-marker\n className={className}\n style={{ left: `${annotation.x}%`, top: annotation.y }}\n >\n <IconXmark size={isMulti ? 12 : 10} />\n </div>\n );\n}\n","// BugPort widget — original implementation. Do not copy third-party sources.\n\nimport { useId } from \"react\";\n\nimport { Checkbox } from \"../../../checkbox\";\nimport { HelpTooltip } from \"../../../help-tooltip\";\nimport styles from \"./styles.module.scss\";\n\n/**\n * Public props for {@link CheckboxField}.\n *\n * The component is a row layout that pairs a styled checkbox with a clickable\n * text label and, optionally, a help tooltip. Because it extends the standard\n * div attribute set, callers can attach arbitrary DOM props (data-*, aria-*,\n * id, event handlers, etc.) directly to the rendered container.\n */\nexport interface CheckboxFieldProps\n extends React.HTMLAttributes<HTMLDivElement> {\n /** Visible text rendered inside the associated `<label>`. */\n label: string;\n /** When provided (and non-empty), shows a help tooltip next to the label. */\n tooltip?: string;\n /** Controlled checked state forwarded to the underlying checkbox input. */\n checked?: boolean;\n /** Change handler forwarded to the underlying checkbox input. */\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n}\n\n/**\n * A single settings row: a checkbox wired to a clickable label, with an\n * optional inline help tooltip.\n *\n * The checkbox and label are connected through a per-instance id (generated by\n * `useId`) so that activating the label toggles the input — this gives us\n * native label/control association for free, including keyboard and screen\n * reader behaviour.\n */\nexport const CheckboxField = ({\n className = \"\",\n label,\n tooltip,\n checked,\n onChange,\n ...props\n}: CheckboxFieldProps) => {\n // Unique, stable-per-render-instance id linking the input to its label.\n const fieldId = useId();\n\n return (\n <div className={`${styles.container} ${className}`} {...props}>\n <Checkbox id={fieldId} onChange={onChange} checked={checked} />\n <label className={styles.label} htmlFor={fieldId}>\n {label}\n </label>\n {tooltip && <HelpTooltip content={tooltip} />}\n </div>\n );\n};\n","\nconst css = \".styles-module__checkboxContainer___joqZk {\\n position: relative;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 14px;\\n height: 14px;\\n border: 1px solid var(--bp-border, #edeaed);\\n border-radius: 4px;\\n background-color: var(--bp-surface, #ffffff);\\n transition: background-color 0.2s ease;\\n}\\n[data-bugport-widget-theme=dark] .styles-module__checkboxContainer___joqZk {\\n border-color: var(--bp-brand-border, rgba(234, 200, 254, 0.28));\\n background-color: color-mix(in srgb, var(--bp-surface, #481a54) 92%, white 8%);\\n}\\n.styles-module__checkboxContainer___joqZk:has(.styles-module__checkboxInput___ECzzO:checked) {\\n background-color: var(--bp-primary, #611f69);\\n}\\n[data-bugport-widget-theme=dark] .styles-module__checkboxContainer___joqZk:has(.styles-module__checkboxInput___ECzzO:checked) {\\n background-color: var(--bp-primary, #d17dfe);\\n}\\n\\n.styles-module__checkboxInput___ECzzO {\\n position: absolute;\\n inset: -1px;\\n z-index: 1;\\n border-radius: inherit;\\n opacity: 0;\\n cursor: pointer;\\n}\\n\\n.styles-module__checkboxCheck___fUXpr {\\n color: #fafafa;\\n}\\n[data-bugport-widget-theme=dark] .styles-module__checkboxCheck___fUXpr {\\n color: #2e0039;\\n}\\n\\n.styles-module__checkboxCheckPath___cDyh8 {\\n color: #fafafa;\\n stroke-dasharray: 9.29px;\\n stroke-dashoffset: 9.29px;\\n transition: stroke-dashoffset 0.1s ease;\\n}\\n[data-bugport-widget-theme=dark] .styles-module__checkboxCheckPath___cDyh8 {\\n color: #2e0039;\\n}\\n.styles-module__checkboxContainer___joqZk:has(.styles-module__checkboxInput___ECzzO:checked) .styles-module__checkboxCheckPath___cDyh8 {\\n stroke-dashoffset: 0;\\n transition-duration: 0.2s;\\n}\";\nconst classNames = {\"checkboxContainer\":\"styles-module__checkboxContainer___joqZk\",\"checkboxInput\":\"styles-module__checkboxInput___ECzzO\",\"checkboxCheck\":\"styles-module__checkboxCheck___fUXpr\",\"checkboxCheckPath\":\"styles-module__checkboxCheckPath___cDyh8\"};\n\nif (typeof document !== \"undefined\") {\n let style = document.getElementById(\"bugport-widget-styles-checkbox-styles\");\n if (!style) {\n style = document.createElement(\"style\");\n style.id = \"bugport-widget-styles-checkbox-styles\";\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","// BugPort widget — original implementation. Do not copy third-party sources.\n\nimport styles from \"./styles.module.scss\";\n\n/**\n * Props for {@link Checkbox}. Intentionally a thin wrapper around the native\n * input attributes so callers can pass `checked`, `onChange`, `disabled`,\n * `id`, `name`, `aria-*`, `data-*`, etc. straight through to the underlying\n * `<input type=\"checkbox\">`.\n *\n * Not exported on purpose — only the `Checkbox` component is part of the\n * public surface.\n */\ntype CheckboxProps = React.InputHTMLAttributes<HTMLInputElement>;\n\n/**\n * A presentational, stateless checkbox.\n *\n * The visible check is a decorative SVG; the real interaction lives entirely\n * on the native input that sits behind it. Checked/focus styling is handled in\n * CSS (via `:has(.checkboxInput:checked)` on the wrapper plus an animated\n * stroke on the check path), so this component keeps no internal state, refs,\n * or handlers — every behavioural prop is forwarded to the input untouched.\n *\n * `className` is the one exception: it is peeled off and appended to the\n * wrapper's class list rather than the input.\n */\nexport const Checkbox = ({ className = \"\", ...props }: CheckboxProps) => {\n return (\n <div className={`${styles.checkboxContainer} ${className}`}>\n <input type=\"checkbox\" className={styles.checkboxInput} {...props} />\n <svg\n className={styles.checkboxCheck}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n >\n <path\n className={styles.checkboxCheckPath}\n d=\"M3.94 7L6.13 9.19L10.5 4.81\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n );\n};\n","// BugPort widget — original implementation. Do not copy third-party sources.\n//\n// A lightweight hover tooltip for the BugPort feedback widget.\n//\n// The tooltip bubble is rendered through a portal into `document.body` so it\n// can escape any clipping/overflow on the trigger's ancestors. It appears to\n// the LEFT of the wrapped element after a short hover dwell, and fades out\n// (staying mounted briefly) when the pointer leaves. All styling is inline —\n// there is no CSS module here.\n//\n// Timing uses `originalSetTimeout` (the pristine setTimeout captured before the\n// page-freeze monkeypatch) so the tooltip keeps animating even while the host\n// page is frozen for screenshotting/annotation.\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { originalSetTimeout } from \"../../utils/freeze-animations\";\n\n/** How long the pointer must dwell before the bubble fades in. */\nconst SHOW_DELAY_MS = 500;\n\n/** How long the bubble lingers (mounted) while fading out after pointer leave. */\nconst EXIT_DELAY_MS = 150;\n\n/** Horizontal gap, in px, between the trigger's left edge and the bubble. */\nconst GAP_PX = 8;\n\n/** Fixed-position coordinates for the portal bubble. */\ntype BubblePosition = {\n top: number;\n right: number;\n};\n\ntype TimerHandle = ReturnType<typeof originalSetTimeout> | null;\n\nexport const Tooltip = ({\n content,\n children,\n ...props\n}: { content: string; children: React.ReactNode } & React.HTMLAttributes<HTMLSpanElement>) => {\n // `visible` drives the opacity fade; `shouldRender` controls whether the\n // portal node is in the DOM at all (kept true through the exit animation).\n const [visible, setVisible] = useState(false);\n const [shouldRender, setShouldRender] = useState(false);\n const [position, setPosition] = useState<BubblePosition>({ top: 0, right: 0 });\n\n const triggerRef = useRef<HTMLSpanElement>(null);\n const timeoutRef = useRef<TimerHandle>(null);\n const exitTimeoutRef = useRef<TimerHandle>(null);\n\n // Measure the trigger and place the bubble to its left, vertically centered.\n const updatePosition = () => {\n const node = triggerRef.current;\n if (!node) {\n return;\n }\n const rect = node.getBoundingClientRect();\n setPosition({\n top: rect.top + rect.height / 2,\n right: window.innerWidth - rect.left + GAP_PX,\n });\n };\n\n const handleMouseEnter = () => {\n setShouldRender(true);\n\n // Cancel a pending unmount from a previous quick leave/enter.\n if (exitTimeoutRef.current !== null) {\n clearTimeout(exitTimeoutRef.current);\n exitTimeoutRef.current = null;\n }\n\n updatePosition();\n\n timeoutRef.current = originalSetTimeout(() => {\n setVisible(true);\n }, SHOW_DELAY_MS);\n };\n\n const handleMouseLeave = () => {\n // If the dwell timer hasn't fired yet, abort it so we never show.\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n\n setVisible(false);\n\n exitTimeoutRef.current = originalSetTimeout(() => {\n setShouldRender(false);\n }, EXIT_DELAY_MS);\n };\n\n // Guard against setState-after-unmount by clearing any live timers.\n useEffect(() => {\n return () => {\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n }\n if (exitTimeoutRef.current !== null) {\n clearTimeout(exitTimeoutRef.current);\n }\n };\n }, []);\n\n const bubble = (\n <div\n data-feedback-toolbar\n style={{\n position: \"fixed\",\n top: position.top,\n right: position.right,\n transform: \"translateY(-50%)\",\n padding: \"6px 10px\",\n background: \"#383838\",\n color: \"rgba(255, 255, 255, 0.7)\",\n fontSize: 11,\n fontWeight: 400,\n lineHeight: \"14px\",\n borderRadius: 10,\n width: 180,\n textAlign: \"left\" as const,\n zIndex: 100020,\n pointerEvents: \"none\" as const,\n boxShadow: \"0px 1px 8px rgba(0, 0, 0, 0.28)\",\n opacity: visible ? 1 : 0,\n transition: \"opacity 0.15s ease\",\n }}\n >\n {content}\n </div>\n );\n\n return (\n <>\n <span\n ref={triggerRef}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n {...props}\n >\n {children}\n </span>\n {shouldRender && createPortal(bubble, document.body)}\n </>\n );\n};\n","\nconst css = \".styles-module__tooltip___mcXL2 {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n cursor: help;\\n}\\n\\n.styles-module__tooltipIcon___Nq2nD {\\n color: #fff;\\n opacity: 0.2;\\n transition: opacity 0.15s ease;\\n transform: translateY(0.5px);\\n will-change: transform;\\n}\\n[data-bugport-widget-theme=light] .styles-module__tooltipIcon___Nq2nD {\\n color: #000;\\n}\\n.styles-module__tooltip___mcXL2:hover .styles-module__tooltipIcon___Nq2nD {\\n opacity: 0.5;\\n}\";\nconst classNames = {\"tooltip\":\"styles-module__tooltip___mcXL2\",\"tooltipIcon\":\"styles-module__tooltipIcon___Nq2nD\"};\n\nif (typeof document !== \"undefined\") {\n let style = document.getElementById(\"bugport-widget-styles-help-tooltip-styles\");\n if (!style) {\n style = document.createElement(\"style\");\n style.id = \"bugport-widget-styles-help-tooltip-styles\";\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","// BugPort widget — original implementation. Do not copy third-party sources.\n\nimport { Tooltip } from \"../tooltip\";\nimport { IconHelp } from \"../icons\";\nimport styles from \"./styles.module.scss\";\n\n/**\n * Props for {@link HelpTooltip}. Module-local; intentionally not exported since\n * call sites only depend on the component itself.\n */\ninterface HelpTooltipProps {\n /** Text shown when the help icon is hovered. Forwarded verbatim to Tooltip. */\n content: string;\n}\n\n/**\n * A small presentational helper that pairs a help icon with a tooltip.\n *\n * It is a thin wrapper: all of the interactive behaviour (hover handling,\n * positioning, portals, accessibility) is owned by the underlying `Tooltip`\n * and `IconHelp` components. This layer only wires the two together and\n * passes the provided `content` straight through.\n */\nexport const HelpTooltip = ({ content }: HelpTooltipProps) => (\n <Tooltip className={styles.tooltip} content={content}>\n <IconHelp className={styles.tooltipIcon} />\n </Tooltip>\n);\n","\nconst css = \".styles-module__container___w8eAF {\\n display: flex;\\n align-items: center;\\n height: 24px;\\n}\\n\\n.styles-module__label___J5mxE {\\n padding-inline: 8px 2px;\\n font-size: 13px;\\n line-height: 20px;\\n letter-spacing: -0.15px;\\n color: rgba(26, 26, 26, 0.5);\\n cursor: pointer;\\n}\\n[data-bugport-widget-theme=dark] .styles-module__label___J5mxE {\\n color: rgba(255, 255, 255, 0.5);\\n}\";\nconst classNames = {\"container\":\"styles-module__container___w8eAF\",\"label\":\"styles-module__label___J5mxE\"};\n\nif (typeof document !== \"undefined\") {\n let style = document.getElementById(\"bugport-widget-styles-checkbox-field-styles\");\n if (!style) {\n style = document.createElement(\"style\");\n style.id = \"bugport-widget-styles-checkbox-field-styles\";\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","\nconst css = \"@keyframes styles-module__themeIconIn___qUWMV {\\n from {\\n opacity: 0;\\n transform: scale(0.8) rotate(-30deg);\\n }\\n to {\\n opacity: 1;\\n transform: scale(1) rotate(0);\\n }\\n}\\n@keyframes styles-module__cycleTextIn___VBNTi {\\n from {\\n opacity: 0;\\n transform: translateY(-6px);\\n }\\n to {\\n opacity: 1;\\n transform: translateY(0);\\n }\\n}\\n.styles-module__settingsPanel___qNkn- {\\n position: absolute;\\n right: 5px;\\n bottom: calc(100% + 0.5rem);\\n z-index: 1;\\n width: 100%;\\n max-width: 253px;\\n min-width: 205px;\\n padding: 12px 0;\\n overflow: hidden;\\n border: 1px solid var(--bp-brand-border, #eac8fe);\\n border-radius: 16px;\\n background: var(--bp-cream-canvas, #fefbff);\\n box-shadow: 0 12px 32px rgba(29, 28, 29, 0.12), 0 0 0 1px rgba(234, 200, 254, 0.3);\\n cursor: default;\\n transition: background-color 0.25s ease, box-shadow 0.25s ease;\\n}\\n.styles-module__settingsPanel___qNkn-::before, .styles-module__settingsPanel___qNkn-::after {\\n content: \\\"\\\";\\n position: absolute;\\n top: 0;\\n bottom: 0;\\n width: 16px;\\n z-index: 2;\\n pointer-events: none;\\n}\\n.styles-module__settingsPanel___qNkn-::before {\\n left: 0;\\n background: linear-gradient(to right, var(--bp-surface, #fff), transparent);\\n}\\n.styles-module__settingsPanel___qNkn-::after {\\n right: 0;\\n background: linear-gradient(to left, var(--bp-surface, #fff), transparent);\\n}\\n[data-bugport-widget-theme=dark] .styles-module__settingsPanel___qNkn- {\\n background: var(--bp-surface, #481a54);\\n box-shadow: 0 14px 32px rgba(46, 0, 57, 0.28), inset 0 0 0 1px rgba(234, 200, 254, 0.2);\\n}\\n[data-bugport-widget-theme=light] .styles-module__settingsPanel___qNkn- {\\n background: #fff;\\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06), 0 4px 16px rgba(0, 0, 0, 0.08), 0 0 0 1px rgba(0, 0, 0, 0.04);\\n}\\n[data-bugport-widget-theme=light] .styles-module__settingsPanel___qNkn-::before {\\n background: linear-gradient(to right, #fff, transparent);\\n}\\n[data-bugport-widget-theme=light] .styles-module__settingsPanel___qNkn-::after {\\n background: linear-gradient(to left, #fff, transparent);\\n}\\n\\n.styles-module__enter___wginS {\\n opacity: 1;\\n transform: translateY(0) scale(1);\\n filter: blur(0);\\n transition: opacity 0.2s ease, transform 0.2s ease, filter 0.2s ease;\\n}\\n\\n.styles-module__exit___A4iJc {\\n opacity: 0;\\n transform: translateY(8px) scale(0.95);\\n filter: blur(5px);\\n pointer-events: none;\\n transition: opacity 0.1s ease, transform 0.1s ease, filter 0.1s ease;\\n}\\n\\n.styles-module__settingsPanelContainer___5it-H {\\n position: relative;\\n display: flex;\\n overflow: visible;\\n padding: 0 16px;\\n}\\n\\n.styles-module__settingsPage___BMn-3 {\\n min-width: 100%;\\n flex-basis: 0;\\n flex-shrink: 0;\\n transition: transform 0.2s ease, opacity 0.2s ease;\\n}\\n\\n.styles-module__settingsHeader___Fn1DP {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n min-height: 24px;\\n}\\n\\n.styles-module__settingsBrand___OoKlM {\\n display: inline-flex;\\n align-items: center;\\n gap: 8px;\\n font-size: 0.8125rem;\\n font-weight: 600;\\n letter-spacing: -0.0094em;\\n color: var(--bp-text, #1d1c1d);\\n text-decoration: none;\\n}\\n\\n.styles-module__settingsVersion___rXmL9 {\\n margin-left: auto;\\n font-size: 11px;\\n font-weight: 400;\\n letter-spacing: -0.0094em;\\n color: var(--bp-text-muted, #696969);\\n}\\n[data-bugport-widget-theme=light] .styles-module__settingsVersion___rXmL9 {\\n color: rgba(0, 0, 0, 0.4);\\n}\\n\\n.styles-module__headerActions___xd0wn {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n margin-left: 8px;\\n}\\n\\n.styles-module__themeToggle___3imlT {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 22px;\\n height: 22px;\\n margin-left: 8px;\\n border: none;\\n border-radius: 6px;\\n background: transparent;\\n color: var(--bp-text-muted, #696969);\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease;\\n}\\n.styles-module__themeToggle___3imlT:hover {\\n background: var(--bp-surface-muted, #f9f0ff);\\n color: var(--bp-text, #1d1c1d);\\n}\\n\\n.styles-module__themeIconWrapper___pyaYa {\\n position: relative;\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 20px;\\n height: 20px;\\n}\\n\\n.styles-module__themeIcon___w7lAm {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n animation: styles-module__themeIconIn___qUWMV 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);\\n}\\n\\n.styles-module__headerIconButton___CDobG {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n width: 22px;\\n height: 22px;\\n border: none;\\n border-radius: 6px;\\n background: transparent;\\n color: var(--bp-text-muted, #696969);\\n cursor: pointer;\\n transition: background-color 0.15s ease, color 0.15s ease;\\n}\\n.styles-module__headerIconButton___CDobG:hover {\\n background: var(--bp-surface-muted, #f9f0ff);\\n color: var(--bp-text, #1d1c1d);\\n}\\n\\n.styles-module__divider___h6Yux {\\n width: 100%;\\n height: 1px;\\n margin-block: 8px;\\n background: rgba(26, 26, 26, 0.07);\\n border: none;\\n}\\n[data-bugport-widget-theme=dark] .styles-module__divider___h6Yux {\\n background: rgba(255, 255, 255, 0.07);\\n}\\n\\n.styles-module__settingsSection___n5V-4 {\\n transition: background-color 0.25s ease, color 0.25s ease, border-color 0.25s ease;\\n}\\n[data-bugport-widget-theme=light] .styles-module__settingsSection___n5V-4 {\\n border-top-color: rgba(0, 0, 0, 0.08);\\n}\\n\\n.styles-module__formField___S0SfX {\\n display: flex;\\n flex-direction: column;\\n gap: 6px;\\n}\\n\\n.styles-module__formFieldSpaced___Ibmos {\\n margin-top: 12px;\\n}\\n\\n.styles-module__fieldLabel___S3YZX {\\n font-size: 12px;\\n font-weight: 600;\\n color: var(--bp-text, #1d1c1d);\\n}\\n\\n.styles-module__fieldLabelRow___L9uWh {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: 12px;\\n}\\n\\n.styles-module__textInput___0llmA,\\n.styles-module__textArea___pFvYO {\\n width: 100%;\\n box-sizing: border-box;\\n padding: 10px 12px;\\n border: 1px solid var(--bp-brand-border, #eac8fe);\\n border-radius: 10px;\\n background: var(--bp-surface, #fff);\\n color: var(--bp-text, #1d1c1d);\\n font-family: inherit;\\n font-size: 13px;\\n line-height: 1.4;\\n outline: none;\\n transition: border-color 0.15s ease, box-shadow 0.15s ease, background-color 0.15s ease;\\n}\\n.styles-module__textInput___0llmA::placeholder,\\n.styles-module__textArea___pFvYO::placeholder {\\n color: color-mix(in srgb, var(--bp-text-muted, #696969) 70%, transparent);\\n}\\n.styles-module__textInput___0llmA:focus,\\n.styles-module__textArea___pFvYO:focus {\\n border-color: var(--bp-primary, #611f69);\\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--bp-primary, #611f69) 12%, transparent);\\n}\\n[data-bugport-widget-theme=dark] .styles-module__textInput___0llmA,\\n[data-bugport-widget-theme=dark] .styles-module__textArea___pFvYO {\\n background: var(--bp-surface, #481a54);\\n}\\n\\n.styles-module__textArea___pFvYO {\\n min-height: 104px;\\n resize: vertical;\\n}\\n\\n.styles-module__attachButton___uEK4I,\\n.styles-module__screenshotAction___UnmXL {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n width: 28px;\\n height: 28px;\\n border: 1px solid var(--bp-brand-border, #eac8fe);\\n border-radius: 8px;\\n background: var(--bp-surface, #fff);\\n color: var(--bp-text-muted, #696969);\\n cursor: pointer;\\n transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease, opacity 0.15s ease;\\n}\\n.styles-module__attachButton___uEK4I:hover:not(:disabled),\\n.styles-module__screenshotAction___UnmXL:hover:not(:disabled) {\\n background: var(--bp-surface-muted, #f9f0ff);\\n border-color: color-mix(in srgb, var(--bp-primary, #611f69) 30%, var(--bp-brand-border, #eac8fe));\\n color: var(--bp-text, #1d1c1d);\\n}\\n.styles-module__attachButton___uEK4I:disabled,\\n.styles-module__screenshotAction___UnmXL:disabled {\\n opacity: 0.45;\\n cursor: not-allowed;\\n}\\n\\n.styles-module__screenshotCard___ifRmX {\\n margin-top: 12px;\\n padding: 10px;\\n border: 1px solid var(--bp-brand-border, #eac8fe);\\n border-radius: 12px;\\n background: color-mix(in srgb, var(--bp-surface, #fff) 92%, transparent);\\n}\\n\\n.styles-module__screenshotCardHeader___arJTt {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n gap: 12px;\\n margin-bottom: 10px;\\n}\\n\\n.styles-module__screenshotLabel___9lkIg {\\n font-size: 12px;\\n font-weight: 600;\\n color: var(--bp-text, #1d1c1d);\\n}\\n\\n.styles-module__screenshotActions___I0igk {\\n display: flex;\\n align-items: center;\\n gap: 6px;\\n}\\n\\n.styles-module__screenshotPreview___FN-gq {\\n display: block;\\n width: 100%;\\n max-height: 148px;\\n object-fit: cover;\\n border-radius: 10px;\\n border: 1px solid color-mix(in srgb, var(--bp-brand-border, #eac8fe) 70%, transparent);\\n background: rgba(255, 255, 255, 0.08);\\n}\\n\\n.styles-module__helperText___fPep- {\\n margin: 12px 0 0;\\n font-size: 12px;\\n line-height: 1.5;\\n color: var(--bp-text-muted, #696969);\\n}\\n.styles-module__helperText___fPep- code {\\n font-size: 11px;\\n}\\n\\n.styles-module__helperTextError___hx5H6 {\\n color: var(--bugport-widget-color-red);\\n}\\n\\n.styles-module__diagnosticsHeading___CElWg {\\n margin-bottom: 4px;\\n font-size: 12px;\\n font-weight: 600;\\n letter-spacing: -0.15px;\\n color: var(--bp-text, #1d1c1d);\\n}\\n\\n.styles-module__diagnosticsGroup___ghsCx {\\n display: flex;\\n flex-direction: column;\\n gap: 2px;\\n}\\n\\n.styles-module__linkGrid___7qHB5 {\\n display: grid;\\n grid-template-columns: repeat(2, minmax(0, 1fr));\\n gap: 8px;\\n}\\n\\n.styles-module__panelLink___SEBVB {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n gap: 8px;\\n min-height: 38px;\\n border: 1px solid var(--bp-brand-border, #eac8fe);\\n border-radius: 10px;\\n background: var(--bp-surface, #fff);\\n color: var(--bp-text, #1d1c1d);\\n text-decoration: none;\\n font-size: 13px;\\n font-weight: 600;\\n transition: border-color 0.15s ease, background-color 0.15s ease, color 0.15s ease;\\n}\\n.styles-module__panelLink___SEBVB:hover {\\n background: var(--bp-surface-muted, #f9f0ff);\\n border-color: color-mix(in srgb, var(--bp-primary, #611f69) 30%, var(--bp-brand-border, #eac8fe));\\n}\\n\\n.styles-module__submitError___Eq920 {\\n display: flex;\\n align-items: flex-start;\\n gap: 6px;\\n margin: 0 0 10px;\\n padding: 8px 10px;\\n border: 1px solid color-mix(in srgb, var(--bugport-widget-color-red) 35%, transparent);\\n border-radius: 8px;\\n background: color-mix(in srgb, var(--bugport-widget-color-red) 12%, transparent);\\n font-size: 12px;\\n line-height: 1.4;\\n color: var(--bugport-widget-color-red);\\n}\\n\\n.styles-module__submitButton___CqaVb {\\n width: 100%;\\n min-height: 42px;\\n border: none;\\n border-radius: 10px;\\n background: var(--bp-primary, #611f69);\\n color: #fff;\\n font-family: inherit;\\n font-size: 13px;\\n font-weight: 600;\\n cursor: pointer;\\n transition: background-color 0.15s ease, transform 0.1s ease, opacity 0.15s ease;\\n}\\n.styles-module__submitButton___CqaVb:hover:not(:disabled) {\\n background: var(--bp-primary-hover, #3d0157);\\n}\\n.styles-module__submitButton___CqaVb:active:not(:disabled) {\\n transform: scale(0.98);\\n}\\n.styles-module__submitButton___CqaVb:disabled {\\n opacity: 0.45;\\n cursor: not-allowed;\\n}\\n\\n.styles-module__settingsRow___y-tDE {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n min-height: 24px;\\n}\\n\\n.styles-module__settingsLabel___VCVOQ {\\n display: flex;\\n align-items: center;\\n column-gap: 2px;\\n line-height: 20px;\\n font-size: 13px;\\n font-weight: 400;\\n letter-spacing: -0.15px;\\n color: var(--bp-text-muted, #696969);\\n}\\n[data-bugport-widget-theme=dark] .styles-module__settingsLabel___VCVOQ {\\n color: var(--bp-text-muted, rgba(254, 251, 255, 0.72));\\n}\\n[data-bugport-widget-theme=light] .styles-module__settingsLabel___VCVOQ {\\n color: rgba(0, 0, 0, 0.5);\\n}\\n\\n.styles-module__cycleButton___XMBx3 {\\n display: flex;\\n align-items: center;\\n gap: 0.5rem;\\n padding: 0;\\n border: none;\\n background: transparent;\\n font-size: 0.8125rem;\\n font-weight: 500;\\n letter-spacing: -0.0094em;\\n color: var(--bp-text, #1d1c1d);\\n cursor: pointer;\\n}\\n.styles-module__cycleButton___XMBx3:disabled {\\n opacity: 0.35;\\n cursor: not-allowed;\\n}\\n[data-bugport-widget-theme=light] .styles-module__cycleButton___XMBx3 {\\n color: rgba(0, 0, 0, 0.85);\\n}\\n\\n.styles-module__cycleButtonText___mbbnD {\\n display: inline-block;\\n animation: styles-module__cycleTextIn___VBNTi 0.2s ease-out;\\n}\\n\\n.styles-module__cycleDots___ehp6i {\\n display: flex;\\n flex-direction: column;\\n gap: 2px;\\n}\\n\\n.styles-module__cycleDot___zgSXY {\\n width: 3px;\\n height: 3px;\\n border-radius: 50%;\\n background: color-mix(in srgb, var(--bp-text-muted, #696969) 35%, transparent);\\n transform: scale(0.667);\\n transition: background-color 0.25s ease-out, transform 0.25s ease-out;\\n}\\n.styles-module__cycleDot___zgSXY.styles-module__active___dpAhM {\\n background: var(--bp-primary, #611f69);\\n transform: scale(1);\\n}\\n[data-bugport-widget-theme=light] .styles-module__cycleDot___zgSXY {\\n background: rgba(0, 0, 0, 0.2);\\n}\\n[data-bugport-widget-theme=light] .styles-module__cycleDot___zgSXY.styles-module__active___dpAhM {\\n background: var(--bp-primary, #611f69);\\n}\\n\\n.styles-module__colorOptions___pbxZx {\\n display: flex;\\n align-items: center;\\n justify-content: space-between;\\n height: 26px;\\n margin-top: 6px;\\n}\\n\\n.styles-module__colorOption___Co955 {\\n position: relative;\\n width: 20px;\\n height: 20px;\\n padding: 0;\\n border: none;\\n border-radius: 50%;\\n background-color: var(--bp-surface, #fff);\\n cursor: pointer;\\n --color: var(--swatch);\\n}\\n@supports (color: color(display-p3 1 1 1)) {\\n .styles-module__colorOption___Co955 {\\n --color: var(--swatch-p3, var(--swatch));\\n }\\n}\\n.styles-module__colorOption___Co955::before {\\n content: \\\"\\\";\\n position: absolute;\\n inset: 0;\\n border-radius: 50%;\\n background-color: var(--color);\\n transition: opacity 0.2s ease, transform 0.2s ease;\\n}\\n.styles-module__colorOption___Co955::after {\\n content: \\\"\\\";\\n position: absolute;\\n inset: 0;\\n z-index: -1;\\n border-radius: 50%;\\n background-color: var(--color);\\n opacity: 0;\\n transform: scale(1.2);\\n transition: opacity 0.2s ease, transform 0.2s ease;\\n}\\n[data-bugport-widget-theme=dark] .styles-module__colorOption___Co955 {\\n background-color: var(--bp-surface, #481a54);\\n}\\n.styles-module__colorOption___Co955.styles-module__selected___k1-Vq::before {\\n transform: scale(0.8);\\n}\\n.styles-module__colorOption___Co955.styles-module__selected___k1-Vq::after {\\n opacity: 1;\\n}\";\nconst classNames = {\"settingsPanel\":\"styles-module__settingsPanel___qNkn-\",\"enter\":\"styles-module__enter___wginS\",\"exit\":\"styles-module__exit___A4iJc\",\"settingsPanelContainer\":\"styles-module__settingsPanelContainer___5it-H\",\"settingsPage\":\"styles-module__settingsPage___BMn-3\",\"settingsHeader\":\"styles-module__settingsHeader___Fn1DP\",\"settingsBrand\":\"styles-module__settingsBrand___OoKlM\",\"settingsVersion\":\"styles-module__settingsVersion___rXmL9\",\"headerActions\":\"styles-module__headerActions___xd0wn\",\"themeToggle\":\"styles-module__themeToggle___3imlT\",\"themeIconWrapper\":\"styles-module__themeIconWrapper___pyaYa\",\"themeIcon\":\"styles-module__themeIcon___w7lAm\",\"themeIconIn\":\"styles-module__themeIconIn___qUWMV\",\"headerIconButton\":\"styles-module__headerIconButton___CDobG\",\"divider\":\"styles-module__divider___h6Yux\",\"settingsSection\":\"styles-module__settingsSection___n5V-4\",\"formField\":\"styles-module__formField___S0SfX\",\"formFieldSpaced\":\"styles-module__formFieldSpaced___Ibmos\",\"fieldLabel\":\"styles-module__fieldLabel___S3YZX\",\"fieldLabelRow\":\"styles-module__fieldLabelRow___L9uWh\",\"textInput\":\"styles-module__textInput___0llmA\",\"textArea\":\"styles-module__textArea___pFvYO\",\"attachButton\":\"styles-module__attachButton___uEK4I\",\"screenshotAction\":\"styles-module__screenshotAction___UnmXL\",\"screenshotCard\":\"styles-module__screenshotCard___ifRmX\",\"screenshotCardHeader\":\"styles-module__screenshotCardHeader___arJTt\",\"screenshotLabel\":\"styles-module__screenshotLabel___9lkIg\",\"screenshotActions\":\"styles-module__screenshotActions___I0igk\",\"screenshotPreview\":\"styles-module__screenshotPreview___FN-gq\",\"helperText\":\"styles-module__helperText___fPep-\",\"helperTextError\":\"styles-module__helperTextError___hx5H6\",\"diagnosticsHeading\":\"styles-module__diagnosticsHeading___CElWg\",\"diagnosticsGroup\":\"styles-module__diagnosticsGroup___ghsCx\",\"linkGrid\":\"styles-module__linkGrid___7qHB5\",\"panelLink\":\"styles-module__panelLink___SEBVB\",\"submitError\":\"styles-module__submitError___Eq920\",\"submitButton\":\"styles-module__submitButton___CqaVb\",\"settingsRow\":\"styles-module__settingsRow___y-tDE\",\"settingsLabel\":\"styles-module__settingsLabel___VCVOQ\",\"cycleButton\":\"styles-module__cycleButton___XMBx3\",\"cycleButtonText\":\"styles-module__cycleButtonText___mbbnD\",\"cycleTextIn\":\"styles-module__cycleTextIn___VBNTi\",\"cycleDots\":\"styles-module__cycleDots___ehp6i\",\"cycleDot\":\"styles-module__cycleDot___zgSXY\",\"active\":\"styles-module__active___dpAhM\",\"colorOptions\":\"styles-module__colorOptions___pbxZx\",\"colorOption\":\"styles-module__colorOption___Co955\",\"selected\":\"styles-module__selected___k1-Vq\"};\n\nif (typeof document !== \"undefined\") {\n let style = document.getElementById(\"bugport-widget-styles-settings-panel-styles\");\n if (!style) {\n style = document.createElement(\"style\");\n style.id = \"bugport-widget-styles-settings-panel-styles\";\n document.head.appendChild(style);\n }\n style.textContent = css;\n}\n\nexport default classNames;\n","// BugPort widget — original implementation. Do not copy third-party sources.\n\nimport { COLOR_OPTIONS, ToolbarSettings } from \"..\";\nimport { OUTPUT_DETAIL_OPTIONS } from \"../../../utils/generate-output\";\nimport { CheckboxField } from \"./checkbox-field\";\nimport { HelpTooltip } from \"../../help-tooltip\";\nimport {\n IconBugPortGlyph,\n IconCamera,\n IconChevronLeft,\n IconClose,\n IconGear,\n IconMoon,\n IconSun,\n} from \"../../icons\";\nimport styles from \"./styles.module.scss\";\n\n/** Shape of the optionally-attached screenshot carried in submit state. */\ntype AttachedScreenshot = {\n dataUrl: string;\n mimeType: string;\n width: number;\n height: number;\n capturedAt: number;\n};\n\n/**\n * End-user diagnostics consent controls. Only the toggles whose `show*` flag\n * is true are rendered, so the section adapts to the app owner's config.\n */\nexport type DiagnosticsPanelControls = {\n showConsole: boolean;\n showNetwork: boolean;\n showRuntimeErrors: boolean;\n attachConsole: boolean;\n attachNetwork: boolean;\n attachRuntimeErrors: boolean;\n onToggleConsole: (value: boolean) => void;\n onToggleNetwork: (value: boolean) => void;\n onToggleRuntimeErrors: (value: boolean) => void;\n /** When true, network capture may include response previews — show stronger copy. */\n responseBodiesEnabled: boolean;\n};\n\nexport type SettingsPanelProps = {\n settings: ToolbarSettings;\n onSettingsChange: (patch: Partial<ToolbarSettings>) => void;\n submitTitle: string;\n onSubmitTitleChange: (value: string) => void;\n submitDescription: string;\n onSubmitDescriptionChange: (value: string) => void;\n submitScreenshot: AttachedScreenshot | null;\n onCaptureScreenshot: () => void;\n onClearScreenshot: () => void;\n screenshotError: string | null;\n isCapturingScreenshot: boolean;\n onSubmitBug: () => void;\n /** Error message shown when the last submission attempt failed. */\n submitError: string | null;\n canSubmit: boolean;\n isSubmitting: boolean;\n hasSubmissionTarget: boolean;\n isDarkMode: boolean;\n onToggleTheme: () => void;\n /** Whether the panel is mounted (controls enter/exit class) */\n isVisible: boolean;\n /** Position override: show panel above toolbar when toolbar is near bottom */\n toolbarNearBottom: boolean;\n settingsPage: \"submit\" | \"settings\";\n onSettingsPageChange: (page: \"submit\" | \"settings\") => void;\n dashboardUrl: string;\n mcpUrl: string;\n /** When provided, renders the \"Attach technical details\" consent section. */\n diagnostics?: DiagnosticsPanelControls;\n};\n\n/**\n * Floating panel attached to the toolbar. Renders either the bug-submission\n * form or the preferences page, switching between them via the header toggle.\n *\n * The component is fully controlled: it holds no internal state and derives\n * everything it shows from the props handed down by the parent toolbar.\n */\nexport function SettingsPanel({\n settings,\n onSettingsChange,\n submitTitle,\n onSubmitTitleChange,\n submitDescription,\n onSubmitDescriptionChange,\n submitScreenshot,\n onCaptureScreenshot,\n onClearScreenshot,\n screenshotError,\n isCapturingScreenshot,\n onSubmitBug,\n submitError,\n canSubmit,\n isSubmitting,\n hasSubmissionTarget,\n isDarkMode,\n onToggleTheme,\n isVisible,\n toolbarNearBottom,\n settingsPage,\n onSettingsPageChange,\n dashboardUrl,\n mcpUrl,\n diagnostics,\n}: SettingsPanelProps) {\n const isSubmitPage = settingsPage === \"submit\";\n\n const hasDiagnosticsToggles = Boolean(\n diagnostics &&\n (diagnostics.showConsole ||\n diagnostics.showNetwork ||\n diagnostics.showRuntimeErrors),\n );\n\n // The panel opens upward by default (see the stylesheet's `bottom` rule),\n // which is what we want while the toolbar sits near the bottom of the\n // viewport. Only when the toolbar is near the TOP do we flip it to open\n // downward so it doesn't overflow above the viewport.\n const positionStyle = toolbarNearBottom\n ? undefined\n : { bottom: \"auto\", top: \"calc(100% + 0.5rem)\" };\n\n // Keystrokes inside the form fields must not bubble up to the host page's\n // global shortcut handlers, otherwise typing would trigger them.\n const keepKeystrokesLocal = (event: { stopPropagation: () => void }) => {\n event.stopPropagation();\n };\n\n const flipPage = () => {\n onSettingsPageChange(isSubmitPage ? \"settings\" : \"submit\");\n };\n\n const advanceOutputDetail = () => {\n const total = OUTPUT_DETAIL_OPTIONS.length;\n const currentIndex = OUTPUT_DETAIL_OPTIONS.findIndex(\n (option) => option.value === settings.outputDetail\n );\n const nextIndex = (currentIndex + 1) % total;\n onSettingsChange({ outputDetail: OUTPUT_DETAIL_OPTIONS[nextIndex].value });\n };\n\n const activeDetailLabel = OUTPUT_DETAIL_OPTIONS.find(\n (option) => option.value === settings.outputDetail\n )?.label;\n\n const header = (\n <div className={styles.settingsHeader}>\n <a\n className={styles.settingsBrand}\n href=\"https://bugport.dev\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <IconBugPortGlyph size={18} />\n <span>BugPort</span>\n </a>\n <p className={styles.settingsVersion}>v{__VERSION__}</p>\n <div className={styles.headerActions}>\n <button\n type=\"button\"\n className={styles.themeToggle}\n onClick={onToggleTheme}\n title={isDarkMode ? \"Switch to light mode\" : \"Switch to dark mode\"}\n >\n <span className={styles.themeIconWrapper}>\n <span\n key={isDarkMode ? \"sun\" : \"moon\"}\n className={styles.themeIcon}\n >\n {isDarkMode ? <IconSun size={20} /> : <IconMoon size={20} />}\n </span>\n </span>\n </button>\n <button\n type=\"button\"\n className={styles.headerIconButton}\n onClick={flipPage}\n title={isSubmitPage ? \"Open settings\" : \"Back to submit\"}\n >\n {isSubmitPage ? (\n <IconGear size={18} />\n ) : (\n <IconChevronLeft size={18} />\n )}\n </button>\n </div>\n </div>\n );\n\n const submitPage = (\n <>\n <div className={styles.settingsSection}>\n <div className={styles.formField}>\n <label\n className={styles.fieldLabel}\n htmlFor=\"bugport-widget-submit-title\"\n >\n Title\n </label>\n <input\n id=\"bugport-widget-submit-title\"\n className={styles.textInput}\n placeholder=\"Summarize the bug\"\n value={submitTitle}\n onChange={(event) => onSubmitTitleChange(event.target.value)}\n onKeyDown={keepKeystrokesLocal}\n />\n </div>\n\n <div className={`${styles.formField} ${styles.formFieldSpaced}`}>\n <div className={styles.fieldLabelRow}>\n <label\n className={styles.fieldLabel}\n htmlFor=\"bugport-widget-submit-description\"\n >\n Description\n </label>\n <button\n type=\"button\"\n className={styles.attachButton}\n onClick={onCaptureScreenshot}\n title={\n submitScreenshot ? \"Retake screenshot\" : \"Attach screenshot\"\n }\n disabled={isCapturingScreenshot}\n >\n <IconCamera size={16} />\n </button>\n </div>\n <textarea\n id=\"bugport-widget-submit-description\"\n className={styles.textArea}\n placeholder=\"Describe what is wrong and what should happen instead\"\n value={submitDescription}\n onChange={(event) =>\n onSubmitDescriptionChange(event.target.value)\n }\n onKeyDown={keepKeystrokesLocal}\n />\n </div>\n\n {submitScreenshot ? (\n <div className={styles.screenshotCard}>\n <div className={styles.screenshotCardHeader}>\n <span className={styles.screenshotLabel}>\n Attached screenshot\n </span>\n <div className={styles.screenshotActions}>\n <button\n type=\"button\"\n className={styles.screenshotAction}\n onClick={onCaptureScreenshot}\n title=\"Retake screenshot\"\n disabled={isCapturingScreenshot}\n >\n <IconCamera size={14} />\n </button>\n <button\n type=\"button\"\n className={styles.screenshotAction}\n onClick={onClearScreenshot}\n title=\"Remove screenshot\"\n >\n <IconClose size={14} />\n </button>\n </div>\n </div>\n <img\n className={styles.screenshotPreview}\n src={submitScreenshot.dataUrl}\n alt=\"Attached screenshot preview\"\n />\n </div>\n ) : null}\n\n {screenshotError ? (\n <p className={`${styles.helperText} ${styles.helperTextError}`}>\n {screenshotError}\n </p>\n ) : null}\n\n {!hasSubmissionTarget ? (\n <p className={styles.helperText}>\n Add a BugPort public key or provide an{\" \"}\n <code>onSubmit</code> handler to receive submissions.\n </p>\n ) : null}\n </div>\n\n {hasDiagnosticsToggles && diagnostics ? (\n <>\n <div className={styles.divider} />\n <div className={styles.settingsSection}>\n <div\n className={styles.diagnosticsHeading}\n id=\"bugport-widget-diagnostics-heading\"\n >\n Attach technical details\n </div>\n <div\n className={styles.diagnosticsGroup}\n role=\"group\"\n aria-labelledby=\"bugport-widget-diagnostics-heading\"\n >\n {diagnostics.showConsole ? (\n <CheckboxField\n label=\"Console logs\"\n tooltip=\"Include recent console messages from this page.\"\n checked={diagnostics.attachConsole}\n onChange={(event) =>\n diagnostics.onToggleConsole(event.target.checked)\n }\n />\n ) : null}\n {diagnostics.showNetwork ? (\n <CheckboxField\n label=\"Network activity\"\n tooltip=\"Include recent API requests from this page. Sensitive headers are filtered.\"\n checked={diagnostics.attachNetwork}\n onChange={(event) =>\n diagnostics.onToggleNetwork(event.target.checked)\n }\n />\n ) : null}\n {diagnostics.showRuntimeErrors ? (\n <CheckboxField\n label=\"JavaScript errors\"\n tooltip=\"Include recent page errors and unhandled promise failures.\"\n checked={diagnostics.attachRuntimeErrors}\n onChange={(event) =>\n diagnostics.onToggleRuntimeErrors(event.target.checked)\n }\n />\n ) : null}\n </div>\n {diagnostics.showNetwork && diagnostics.responseBodiesEnabled ? (\n <p className={styles.helperText}>\n Response previews may include data returned by your app. Only\n include this if your team needs it.\n </p>\n ) : null}\n </div>\n </>\n ) : null}\n\n <div className={styles.divider} />\n\n <div className={styles.settingsSection}>\n <div className={styles.linkGrid}>\n <a\n className={styles.panelLink}\n href={dashboardUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span>Dashboard</span>\n </a>\n <a\n className={styles.panelLink}\n href={mcpUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <span>MCP</span>\n </a>\n </div>\n </div>\n\n <div className={styles.divider} />\n\n {submitError ? (\n <p className={styles.submitError} role=\"alert\">\n {submitError}\n </p>\n ) : null}\n\n <button\n type=\"button\"\n className={styles.submitButton}\n onClick={onSubmitBug}\n disabled={!canSubmit || isSubmitting}\n >\n {isSubmitting ? \"Submitting...\" : \"Submit Bug\"}\n </button>\n </>\n );\n\n const settingsPageBody = (\n <>\n <div className={styles.settingsSection}>\n <div className={styles.settingsRow}>\n <div className={styles.settingsLabel}>\n Output Detail\n <HelpTooltip content=\"Controls how much detail is included in the copied output\" />\n </div>\n <button\n type=\"button\"\n className={styles.cycleButton}\n onClick={advanceOutputDetail}\n >\n <span\n key={settings.outputDetail}\n className={styles.cycleButtonText}\n >\n {activeDetailLabel}\n </span>\n <span className={styles.cycleDots}>\n {OUTPUT_DETAIL_OPTIONS.map((option) => (\n <span\n key={option.value}\n className={`${styles.cycleDot} ${\n settings.outputDetail === option.value ? styles.active : \"\"\n }`}\n />\n ))}\n </span>\n </button>\n </div>\n </div>\n\n <div className={styles.divider} />\n\n <div className={styles.settingsSection}>\n <div\n className={`${styles.settingsLabel} ${styles.settingsLabelMarker}`}\n >\n Marker Color\n </div>\n <div className={styles.colorOptions}>\n {COLOR_OPTIONS.map((color) => (\n <button\n key={color.id}\n type=\"button\"\n className={`${styles.colorOption} ${\n settings.annotationColorId === color.id ? styles.selected : \"\"\n }`}\n style={\n {\n \"--swatch\": color.srgb,\n \"--swatch-p3\": color.p3,\n } as React.CSSProperties\n }\n onClick={() => onSettingsChange({ annotationColorId: color.id })}\n title={color.label}\n />\n ))}\n </div>\n </div>\n </>\n );\n\n return (\n <div\n className={`${styles.settingsPanel} ${\n isVisible ? styles.enter : styles.exit\n }`}\n style={positionStyle}\n data-bugport-widget-settings-panel\n >\n <div className={styles.settingsPanelContainer}>\n <div className={styles.settingsPage}>\n {header}\n <div className={styles.divider} />\n {isSubmitPage ? submitPage : settingsPageBody}\n </div>\n </div>\n </div>\n );\n}\n","// BugPort widget — original implementation. Do not copy third-party sources.\n//\n// Shared, runtime-stable constants for the feedback toolbar: the accent-colour\n// palette, the persisted-settings contract, and the colour-token <style>\n// injector. Kept separate from the component so the palette + tokens can be\n// imported by the settings panel without pulling in the whole toolbar.\n\n/** Verbosity tier for generated markdown output. */\nexport type OutputDetailLevel = \"compact\" | \"standard\" | \"detailed\" | \"forensic\";\n\n/** Mode for React component-name detection. */\nexport type ReactComponentMode = \"smart\" | \"filtered\" | \"all\" | \"off\";\n\n/** Whether clicking a placed marker opens its editor or removes it. */\nexport type MarkerClickBehavior = \"edit\" | \"delete\";\n\n/** User-tunable, localStorage-persisted toolbar preferences. */\nexport type ToolbarSettings = {\n outputDetail: OutputDetailLevel;\n autoClearAfterCopy: boolean;\n annotationColorId: string;\n blockInteractions: boolean;\n reactEnabled: boolean;\n markerClickBehavior: MarkerClickBehavior;\n};\n\n/** One entry in the accent-colour palette. */\ntype ColorOption = {\n id: string;\n label: string;\n srgb: string;\n p3: string;\n};\n\n/** Accent colour palette, shared with the settings-panel colour picker. */\nexport const COLOR_OPTIONS: ColorOption[] = [\n { id: \"indigo\", label: \"Indigo\", srgb: \"#6155F5\", p3: \"color(display-p3 0.38 0.33 0.96)\" },\n { id: \"blue\", label: \"Blue\", srgb: \"#0088FF\", p3: \"color(display-p3 0.00 0.53 1.00)\" },\n { id: \"cyan\", label: \"Cyan\", srgb: \"#00C3D0\", p3: \"color(display-p3 0.00 0.76 0.82)\" },\n { id: \"green\", label: \"Green\", srgb: \"#34C759\", p3: \"color(display-p3 0.20 0.78 0.35)\" },\n { id: \"yellow\", label: \"Yellow\", srgb: \"#FFCC00\", p3: \"color(display-p3 1.00 0.80 0.00)\" },\n { id: \"orange\", label: \"Orange\", srgb: \"#FF8D28\", p3: \"color(display-p3 1.00 0.55 0.16)\" },\n { id: \"red\", label: \"Red\", srgb: \"#FF383C\", p3: \"color(display-p3 1.00 0.22 0.24)\" },\n];\n\n/** Default preferences merged under any persisted values. */\nexport const DEFAULT_SETTINGS: ToolbarSettings = {\n outputDetail: \"standard\",\n autoClearAfterCopy: false,\n annotationColorId: \"blue\",\n blockInteractions: true,\n reactEnabled: true,\n markerClickBehavior: \"edit\",\n};\n\n/** Maps an output-verbosity tier to the React-detection mode it implies. */\nexport const OUTPUT_TO_REACT_MODE: Record<OutputDetailLevel, ReactComponentMode> = {\n compact: \"off\",\n standard: \"filtered\",\n detailed: \"smart\",\n forensic: \"all\",\n};\n\n// localStorage / sessionStorage keys owned by the toolbar.\nexport const SETTINGS_STORAGE_KEY = \"feedback-toolbar-settings\";\nexport const THEME_STORAGE_KEY = \"feedback-toolbar-theme\";\nexport const POSITION_STORAGE_KEY = \"feedback-toolbar-position\";\n\n// Outbound links shown in the settings panel.\nexport const DASHBOARD_LINK = \"https://app.bugport.dev\";\nexport const MCP_LINK = \"https://bugport.dev\";\n\n// The <style> element that publishes the accent CSS custom properties.\nconst COLOR_TOKENS_ELEMENT_ID = \"bugport-widget-color-tokens\";\n\n/**\n * Builds the CSS text that maps each palette entry to:\n * - a `--bugport-widget-color-accent` value scoped by `[data-bugport-widget-accent=ID]`\n * - a `:root` level `--bugport-widget-color-<id>` token\n * Display-P3 overrides are emitted inside an `@supports` block.\n */\nfunction buildColorTokenCss(): string {\n const accentRules: string[] = [];\n const rootSrgb: string[] = [];\n const rootP3: string[] = [];\n\n for (const color of COLOR_OPTIONS) {\n accentRules.push(\n `[data-bugport-widget-accent=\"${color.id}\"]{--bugport-widget-color-accent:${color.srgb};}`,\n );\n rootSrgb.push(`--bugport-widget-color-${color.id}:${color.srgb};`);\n rootP3.push(`--bugport-widget-color-${color.id}:${color.p3};`);\n }\n\n const accentP3 = COLOR_OPTIONS.map(\n (color) =>\n `[data-bugport-widget-accent=\"${color.id}\"]{--bugport-widget-color-accent:${color.p3};}`,\n ).join(\"\");\n\n return [\n `:root{${rootSrgb.join(\"\")}}`,\n accentRules.join(\"\"),\n `@supports (color: color(display-p3 1 1 1)){`,\n `:root{${rootP3.join(\"\")}}`,\n accentP3,\n `}`,\n ].join(\"\");\n}\n\n/**\n * Writes the accent colour tokens into a single <style> element in <head>.\n * Idempotent: bails out under SSR and never inserts a second element once one\n * with the known id exists. Safe to call at module-load time.\n */\nexport function injectBugportWidgetColorTokens(): void {\n if (typeof document === \"undefined\") {\n return;\n }\n if (document.getElementById(COLOR_TOKENS_ELEMENT_ID)) {\n return;\n }\n\n const style = document.createElement(\"style\");\n style.id = COLOR_TOKENS_ELEMENT_ID;\n style.textContent = buildColorTokenCss();\n document.head.appendChild(style);\n}\n\n/**\n * Reads + sanitises persisted settings. Unknown / malformed JSON falls back to\n * the defaults, and an `annotationColorId` that is not in the palette is reset\n * to the default accent.\n */\nexport function loadToolbarSettings(): ToolbarSettings {\n if (typeof window === \"undefined\") {\n return { ...DEFAULT_SETTINGS };\n }\n let merged: ToolbarSettings = { ...DEFAULT_SETTINGS };\n try {\n const raw = window.localStorage.getItem(SETTINGS_STORAGE_KEY);\n if (raw) {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\") {\n merged = { ...merged, ...(parsed as Partial<ToolbarSettings>) };\n }\n }\n } catch {\n // Ignore unreadable storage and keep defaults.\n }\n\n const known = COLOR_OPTIONS.some((color) => color.id === merged.annotationColorId);\n if (!known) {\n merged.annotationColorId = DEFAULT_SETTINGS.annotationColorId;\n }\n return merged;\n}\n\n/** Persists settings, swallowing any storage failures. */\nexport function saveToolbarSettings(settings: ToolbarSettings): void {\n if (typeof window === \"undefined\") {\n return;\n }\n try {\n window.localStorage.setItem(SETTINGS_STORAGE_KEY, JSON.stringify(settings));\n } catch {\n // Ignore.\n }\n}\n","// BugPort widget — original implementation. Do not copy third-party sources.\n//\n// Pure DOM / geometry helpers used by the toolbar component. Kept free of React\n// so they stay trivially testable and reusable.\n\n/** Tags whose default cursor should be a text caret while feedback is active. */\nconst TEXT_CURSOR_TAGS = new Set([\n \"p\",\n \"span\",\n \"h1\",\n \"h2\",\n \"h3\",\n \"h4\",\n \"h5\",\n \"h6\",\n \"li\",\n \"td\",\n \"th\",\n \"label\",\n \"a\",\n \"blockquote\",\n \"figcaption\",\n \"pre\",\n \"code\",\n \"em\",\n \"strong\",\n \"b\",\n \"i\",\n]);\n\n/** Selector matching the toolbar's own DOM so it can be excluded from hit-tests. */\nexport const WIDGET_ROOT_SELECTOR = \"[data-bugport-widget-root]\";\n\n/** Selectors of widget-owned UI that should never be treated as page content. */\nexport const WIDGET_UI_SELECTORS =\n \"[data-feedback-toolbar],[data-annotation-popup],[data-annotation-marker],[data-bugport-widget-root]\";\n\n/** Interactive elements that hijack their own clicks. */\nexport const INTERACTIVE_SELECTOR =\n 'button,a,input,select,textarea,[role=\"button\"],[onclick]';\n\n/** True when the supplied node lives inside the widget's own UI. */\nexport function isInsideWidget(node: EventTarget | null): boolean {\n if (!(node instanceof Element)) {\n return false;\n }\n return Boolean(node.closest(WIDGET_UI_SELECTORS));\n}\n\n/** True when a tag is one the user would expect to select text inside. */\nexport function isTextualTag(element: Element): boolean {\n if ((element as HTMLElement).isContentEditable) {\n return true;\n }\n return TEXT_CURSOR_TAGS.has(element.tagName.toLowerCase());\n}\n\n/**\n * Resolves the top-most element at a viewport point, descending through any\n * open shadow roots so we identify the deepest meaningful target.\n */\nexport function deepElementFromPoint(x: number, y: number): Element | null {\n let host: Document | ShadowRoot = document;\n let found: Element | null = null;\n\n for (let guard = 0; guard < 12; guard += 1) {\n const candidate: Element | null = host.elementFromPoint(x, y);\n if (!candidate || candidate === found) {\n break;\n }\n found = candidate;\n const shadow: ShadowRoot | null =\n (candidate as Element & { shadowRoot?: ShadowRoot | null }).shadowRoot ??\n null;\n if (shadow) {\n host = shadow;\n } else {\n break;\n }\n }\n\n return found;\n}\n\n/**\n * Walks ancestry (crossing shadow boundaries) looking for a fixed/sticky\n * position, indicating the marker should pin to the viewport.\n */\nexport function isElementFixed(element: Element | null): boolean {\n let current: Element | null = element;\n let guard = 0;\n while (current && guard < 40) {\n const position = window.getComputedStyle(current).position;\n if (position === \"fixed\" || position === \"sticky\") {\n return true;\n }\n const parent = current.parentElement;\n if (parent) {\n current = parent;\n } else {\n const root = current.getRootNode();\n current = root instanceof ShadowRoot ? root.host : null;\n }\n guard += 1;\n }\n return false;\n}\n\n/** Builds the custom-cursor stylesheet text injected while feedback is active. */\nexport function buildCursorCss(): string {\n const notWidget = `:not(${WIDGET_ROOT_SELECTOR}):not(${WIDGET_ROOT_SELECTOR} *)`;\n const textSelectors = [\n ...Array.from(TEXT_CURSOR_TAGS).map((tag) => `${tag}${notWidget}`),\n `[contenteditable]${notWidget}`,\n ].join(\",\");\n return [\n `*${notWidget}{cursor:crosshair !important;}`,\n `${textSelectors}{cursor:text !important;}`,\n ].join(\"\");\n}\n\n/** http/https URL validation used to gate webhook submission targets. */\nexport function isValidHttpUrl(value: string | undefined | null): boolean {\n if (!value) {\n return false;\n }\n try {\n const url = new URL(value);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\n/** Clamp a number into an inclusive range. */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n/** Cheap unique id generator for new annotations. */\nexport function makeId(): string {\n return `a_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/** Axis-aligned rectangle in document/viewport pixels. */\nexport type Box = { x: number; y: number; width: number; height: number };\n\n/** Converts a DOMRect into a plain serialisable box (optionally page-relative). */\nexport function rectToBox(rect: DOMRect, pageRelative: boolean): Box {\n return {\n x: rect.left + (pageRelative ? window.scrollX : 0),\n y: rect.top + (pageRelative ? window.scrollY : 0),\n width: rect.width,\n height: rect.height,\n };\n}\n\n/** Union of several boxes; returns null for an empty list. */\nexport function unionBoxes(boxes: Box[]): Box | null {\n if (boxes.length === 0) {\n return null;\n }\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const box of boxes) {\n minX = Math.min(minX, box.x);\n minY = Math.min(minY, box.y);\n maxX = Math.max(maxX, box.x + box.width);\n maxY = Math.max(maxY, box.y + box.height);\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n","import type {\n BugportSubmissionPayload,\n BugportSubmissionScreenshot,\n} from \"./components/page-toolbar-css\";\nimport type { Annotation } from \"./types\";\nimport type { BugPortDiagnosticsPayload } from \"./diagnostics/types\";\n\n/** Console-log row shape accepted by the `/widget/bugs` endpoint. */\ntype WidgetConsoleLogPayload = {\n level: string;\n message: string;\n source?: string;\n stack?: string;\n timestamp: string;\n};\n\n/** Network-request row shape accepted by the `/widget/bugs` endpoint. */\ntype WidgetNetworkRequestPayload = {\n method: string;\n url: string;\n status?: number;\n durationMs?: number;\n requestHeaders?: Record<string, string>;\n responseHeaders?: Record<string, string>;\n requestBody?: string;\n responseBody?: string;\n error?: string;\n timestamp: string;\n};\n\nexport type WidgetReporter = {\n id?: string;\n email?: string;\n name?: string;\n};\n\nexport type BugPortSubmissionResult = {\n bugId: string;\n dashboardUrl: string;\n};\n\ntype WidgetViewport = {\n width: number;\n height: number;\n};\n\ntype WidgetBoundingBox = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\ntype WidgetAnnotationPayload = {\n id: string;\n index: number;\n type: \"element\" | \"area\" | \"text\";\n note: string;\n selector?: string;\n xpath?: string;\n tagName?: string;\n idAttr?: string;\n className?: string;\n text?: string;\n ariaLabel?: string;\n role?: string;\n boundingBox: WidgetBoundingBox;\n viewport: WidgetViewport;\n pageUrl: string;\n pageTitle: string;\n timestamp: string;\n};\n\ntype UploadUrlResponse = {\n mediaId: string;\n uploadUrl: string;\n method: string;\n headers?: Record<string, string>;\n};\n\n// Distributed widget runs on customer origins, so it must target BugPort's\n// hosted API by default. Override via the `apiBaseUrl` prop for local/dev.\nconst DEFAULT_API_BASE_URL = \"https://api.bugport.dev/v1\";\n\nexport function resolveWidgetProjectKey(projectKey?: string, publicKey?: string): string | null {\n const value = projectKey?.trim() || publicKey?.trim();\n return value && value.length > 0 ? value : null;\n}\n\nfunction normalizeApiBaseUrl(apiBaseUrl?: string): string {\n const trimmed = apiBaseUrl?.trim();\n if (!trimmed) {\n return DEFAULT_API_BASE_URL;\n }\n return trimmed.replace(/\\/+$/, \"\");\n}\n\nfunction buildWidgetApiBaseCandidates(apiBaseUrl?: string): string[] {\n const normalized = normalizeApiBaseUrl(apiBaseUrl);\n const candidates = [normalized];\n if (!normalized.endsWith(\"/v1\")) {\n candidates.push(`${normalized}/v1`);\n }\n return [...new Set(candidates)];\n}\n\nasync function readErrorMessage(response: Response, fallback: string): Promise<string> {\n try {\n const body = (await response.json()) as {\n message?: string;\n detail?: string;\n // The API nests structured failures under `error` (code + message).\n error?: { code?: string; message?: string };\n };\n return (\n body.error?.message || body.message || body.detail || fallback\n );\n } catch {\n return fallback;\n }\n}\n\nasync function fetchWidgetApi(apiBaseUrl: string | undefined, path: string, init: RequestInit): Promise<Response> {\n const candidates = buildWidgetApiBaseCandidates(apiBaseUrl);\n let lastResponse: Response | null = null;\n\n for (const candidate of candidates) {\n const response = await fetch(`${candidate}${path}`, init);\n if (response.status !== 404) {\n return response;\n }\n lastResponse = response;\n }\n\n if (!lastResponse) {\n throw new Error(\"Widget request failed before reaching the API.\");\n }\n\n return lastResponse;\n}\n\nasync function screenshotToBlob(screenshot: BugportSubmissionScreenshot): Promise<Blob> {\n const response = await fetch(screenshot.dataUrl);\n if (!response.ok) {\n throw new Error(\"Screenshot data could not be prepared for upload.\");\n }\n return await response.blob();\n}\n\nfunction annotationTypeFor(annotation: Annotation): WidgetAnnotationPayload[\"type\"] {\n if (annotation.selectedText?.trim()) {\n return \"text\";\n }\n if (annotation.isMultiSelect || (annotation.elementBoundingBoxes?.length ?? 0) > 1) {\n return \"area\";\n }\n return \"element\";\n}\n\nfunction absoluteY(annotation: Annotation): number {\n const raw = typeof annotation.y === \"string\" ? Number.parseFloat(annotation.y) : annotation.y;\n const base = Number.isFinite(raw) ? raw : 0;\n return annotation.isFixed ? base + window.scrollY : base;\n}\n\nfunction boundingBoxFor(annotation: Annotation, viewport: WidgetViewport): WidgetBoundingBox {\n if (annotation.boundingBox) {\n return annotation.boundingBox;\n }\n\n const width = 24;\n const height = 24;\n const centerX = (annotation.x / 100) * viewport.width;\n const centerY = absoluteY(annotation);\n return {\n x: centerX - width / 2,\n y: centerY - height / 2,\n width,\n height,\n };\n}\n\nfunction mapAnnotation(annotation: Annotation, index: number): WidgetAnnotationPayload {\n const viewport: WidgetViewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n const boundingBox = boundingBoxFor(annotation, viewport);\n const timestamp = new Date(annotation.timestamp || Date.now()).toISOString();\n\n return {\n id: annotation.id,\n index: index + 1,\n type: annotationTypeFor(annotation),\n note: annotation.comment?.trim() || \"\",\n selector: annotation.elementPath || annotation.fullPath || undefined,\n className: annotation.cssClasses || undefined,\n text: annotation.selectedText || annotation.nearbyText || undefined,\n boundingBox,\n viewport,\n pageUrl: window.location.href,\n pageTitle: document.title,\n timestamp,\n };\n}\n\nfunction inferTitle(payload: BugportSubmissionPayload): string {\n const explicit = payload.title?.trim();\n if (explicit) {\n return explicit;\n }\n\n const firstComment = payload.annotations\n .map((annotation) => annotation.comment?.trim())\n .find((value) => Boolean(value));\n if (firstComment) {\n return firstComment.slice(0, 120);\n }\n\n const pageTitle = document.title.trim();\n if (pageTitle) {\n return `Bug report: ${pageTitle}`;\n }\n\n return `Bug report: ${window.location.pathname || \"/\"}`;\n}\n\nasync function uploadScreenshot(args: {\n apiBaseUrl?: string;\n projectKey: string;\n environment?: string;\n screenshot: BugportSubmissionScreenshot;\n}): Promise<string> {\n const blob = await screenshotToBlob(args.screenshot);\n const extension = args.screenshot.mimeType === \"image/png\" ? \"png\" : \"jpg\";\n const filename = `bugport-widget-screenshot-${args.screenshot.capturedAt}.${extension}`;\n\n const uploadResponse = await fetchWidgetApi(args.apiBaseUrl, \"/widget/media/upload-url\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n projectKey: args.projectKey,\n environment: args.environment,\n filename,\n mimeType: args.screenshot.mimeType,\n sizeBytes: blob.size,\n purpose: \"bug_screenshot\",\n }),\n });\n\n if (!uploadResponse.ok) {\n throw new Error(await readErrorMessage(uploadResponse, `Upload URL request failed with ${uploadResponse.status}.`));\n }\n\n const uploadJson = (await uploadResponse.json()) as UploadUrlResponse;\n const directUploadResponse = await fetch(uploadJson.uploadUrl, {\n method: uploadJson.method || \"PUT\",\n headers: uploadJson.headers,\n body: blob,\n });\n if (!directUploadResponse.ok) {\n throw new Error(`Direct upload failed with ${directUploadResponse.status}.`);\n }\n\n const completeResponse = await fetchWidgetApi(args.apiBaseUrl, \"/widget/media/complete\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n projectKey: args.projectKey,\n mediaId: uploadJson.mediaId,\n width: args.screenshot.width,\n height: args.screenshot.height,\n }),\n });\n if (!completeResponse.ok) {\n throw new Error(await readErrorMessage(completeResponse, `Upload completion failed with ${completeResponse.status}.`));\n }\n\n return uploadJson.mediaId;\n}\n\n/**\n * Flatten the diagnostics payload into the two arrays the backend stores:\n * `consoleLogs` (console messages + runtime errors) and `networkRequests`.\n * Runtime errors are folded into the console stream as `error`-level rows so\n * they surface in the dashboard's console panel alongside console output.\n */\nfunction mapDiagnostics(diagnostics: BugPortDiagnosticsPayload | undefined): {\n consoleLogs?: WidgetConsoleLogPayload[];\n networkRequests?: WidgetNetworkRequestPayload[];\n} {\n if (!diagnostics) {\n return {};\n }\n\n const consoleLogs: WidgetConsoleLogPayload[] = [];\n for (const entry of diagnostics.console ?? []) {\n consoleLogs.push({\n level: entry.level,\n message: entry.message,\n timestamp: entry.timestamp,\n });\n }\n for (const entry of diagnostics.runtimeErrors ?? []) {\n consoleLogs.push({\n level: \"error\",\n message: entry.message,\n source: entry.source,\n stack: entry.stack,\n timestamp: entry.timestamp,\n });\n }\n\n const networkRequests: WidgetNetworkRequestPayload[] = (diagnostics.network ?? []).map(\n (entry) => ({\n method: entry.method,\n url: entry.url,\n status: entry.status,\n durationMs: entry.durationMs,\n requestHeaders:\n entry.requestHeaders && Object.keys(entry.requestHeaders).length > 0\n ? entry.requestHeaders\n : undefined,\n responseHeaders:\n entry.responseHeaders && Object.keys(entry.responseHeaders).length > 0\n ? entry.responseHeaders\n : undefined,\n requestBody: entry.requestBodyPreview,\n responseBody: entry.responseBodyPreview,\n error: entry.error,\n timestamp: entry.timestamp,\n }),\n );\n\n return {\n consoleLogs: consoleLogs.length > 0 ? consoleLogs : undefined,\n networkRequests: networkRequests.length > 0 ? networkRequests : undefined,\n };\n}\n\nexport async function submitBugPortWidget(args: {\n apiBaseUrl?: string;\n projectKey: string;\n environment?: string;\n payload: BugportSubmissionPayload;\n user?: WidgetReporter;\n}): Promise<BugPortSubmissionResult> {\n const mediaIds: string[] = [];\n if (args.payload.screenshot) {\n mediaIds.push(\n await uploadScreenshot({\n apiBaseUrl: args.apiBaseUrl,\n projectKey: args.projectKey,\n environment: args.environment,\n screenshot: args.payload.screenshot,\n }),\n );\n }\n\n const { consoleLogs, networkRequests } = mapDiagnostics(args.payload.diagnostics);\n\n const response = await fetchWidgetApi(args.apiBaseUrl, \"/widget/bugs\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n projectKey: args.projectKey,\n environment: args.environment,\n title: inferTitle(args.payload),\n description: args.payload.description?.trim() || undefined,\n reporter: args.user,\n page: {\n url: window.location.href,\n title: document.title,\n userAgent: navigator.userAgent,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n },\n annotations: args.payload.annotations.map(mapAnnotation),\n mediaIds: mediaIds.length > 0 ? mediaIds : undefined,\n consoleLogs,\n networkRequests,\n }),\n });\n\n if (!response.ok) {\n throw new Error(await readErrorMessage(response, `Submission failed with ${response.status}.`));\n }\n\n return (await response.json()) as BugPortSubmissionResult;\n}\n","// BugPort widget — original implementation. Do not copy third-party sources.\n//\n// Resolves the optional, partial `diagnostics` prop into a fully-defaulted\n// config. Defaults are privacy-preserving: capture is OFF unless the app owner\n// opts in, body capture is OFF, and nothing is attached unless the user (or an\n// explicit default-attach flag) says so.\n\nimport type {\n BugPortDiagnosticsConfig,\n ResolvedDiagnosticsConfig,\n} from \"./types\";\n\nconst DEFAULT_MAX_CONSOLE_EVENTS = 100;\nconst DEFAULT_MAX_NETWORK_EVENTS = 100;\nconst DEFAULT_MAX_RUNTIME_ERROR_EVENTS = 50;\nconst DEFAULT_MAX_BODY_SIZE_BYTES = 64 * 1024;\n\n/** Coerce a possibly-undefined boolean to a default. */\nfunction bool(value: boolean | undefined, fallback: boolean): boolean {\n return typeof value === \"boolean\" ? value : fallback;\n}\n\n/** Coerce a positive integer config value to a default. */\nfunction positiveInt(value: number | undefined, fallback: number): number {\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) {\n return Math.floor(value);\n }\n return fallback;\n}\n\nexport function normalizeDiagnosticsConfig(\n config: BugPortDiagnosticsConfig | undefined,\n): ResolvedDiagnosticsConfig {\n const c = config ?? {};\n const enabled = bool(c.enabled, false);\n\n // `network` is a convenience switch for both transports. An explicit\n // fetch/xhr flag always wins over it.\n const networkDefault = bool(c.network, false);\n const fetchEnabled = bool(c.fetch, networkDefault);\n const xhrEnabled = bool(c.xhr, networkDefault);\n\n const maxConsole = positiveInt(\n c.maxConsoleEvents ?? c.maxEvents,\n DEFAULT_MAX_CONSOLE_EVENTS,\n );\n const maxNetwork = positiveInt(\n c.maxNetworkEvents ?? c.maxEvents,\n DEFAULT_MAX_NETWORK_EVENTS,\n );\n const maxRuntime = positiveInt(\n c.maxRuntimeErrorEvents ?? c.maxEvents,\n DEFAULT_MAX_RUNTIME_ERROR_EVENTS,\n );\n\n return {\n enabled,\n console: bool(c.console, false),\n runtimeErrors: bool(c.runtimeErrors, false),\n fetch: fetchEnabled,\n xhr: xhrEnabled,\n requestBodies: bool(c.requestBodies, false),\n responseBodies: bool(c.responseBodies, false),\n userControlled: bool(c.userControlled, true),\n defaultAttachConsole: bool(c.defaultAttachConsole, false),\n defaultAttachNetwork: bool(c.defaultAttachNetwork, false),\n defaultAttachRuntimeErrors: bool(c.defaultAttachRuntimeErrors, false),\n maxConsoleEvents: maxConsole,\n maxNetworkEvents: maxNetwork,\n maxRuntimeErrorEvents: maxRuntime,\n maxBodySizeBytes: positiveInt(c.maxBodySizeBytes, DEFAULT_MAX_BODY_SIZE_BYTES),\n allowedUrls: c.allowedUrls ?? [],\n deniedUrls: c.deniedUrls ?? [],\n redactHeaders: c.redactHeaders ?? [],\n redactPatterns: c.redactPatterns ?? [],\n beforeSendDiagnostic: c.beforeSendDiagnostic,\n };\n}\n\n/** True when at least one capture source is configured to run. */\nexport function hasAnyCaptureEnabled(config: ResolvedDiagnosticsConfig): boolean {\n return (\n config.enabled &&\n (config.console || config.runtimeErrors || config.fetch || config.xhr)\n );\n}\n\n/** Match a URL against an allow/deny list of strings (substring) or RegExps. */\nexport function urlMatches(url: string, patterns: Array<string | RegExp>): boolean {\n return patterns.some((pattern) => {\n if (typeof pattern === \"string\") {\n return url.includes(pattern);\n }\n try {\n return pattern.test(url);\n } catch {\n return false;\n }\n });\n}\n","// BugPort widget — original implementation. Do not copy third-party sources.\n//\n// Privacy-conscious redaction for diagnostics. Sensitive headers, URL query\n// params, JSON body keys, and well-known secret value shapes are scrubbed\n// before anything is stored or submitted. All helpers are defensive.\n\nexport const REDACTED = \"[REDACTED]\";\n\n/** Header names always stripped (case-insensitive). */\nexport const DEFAULT_REDACT_HEADERS: string[] = [\n \"authorization\",\n \"cookie\",\n \"set-cookie\",\n \"x-api-key\",\n \"api-key\",\n \"x-auth-token\",\n \"x-csrf-token\",\n \"proxy-authorization\",\n];\n\n/**\n * Sensitive key-name fragments. A header/query/body key is redacted when its\n * lower-cased, separator-stripped form contains one of these tokens.\n */\nconst SENSITIVE_KEY_TOKENS: string[] = [\n \"authorization\",\n \"cookie\",\n \"apikey\",\n \"token\",\n \"accesstoken\",\n \"refreshtoken\",\n \"idtoken\",\n \"password\",\n \"passwd\",\n \"pwd\",\n \"secret\",\n \"clientsecret\",\n \"session\",\n \"sessionid\",\n \"jwt\",\n \"bearer\",\n \"csrf\",\n \"xsrf\",\n \"otp\",\n \"auth\",\n];\n\n/** Value patterns redacted from free-form strings (URLs, bodies, messages). */\nexport const DEFAULT_REDACT_PATTERNS: RegExp[] = [\n // JWTs (header.payload.signature)\n /\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9._-]+\\.[A-Za-z0-9._-]+\\b/g,\n // Bearer tokens\n /\\bBearer\\s+[A-Za-z0-9\\-._~+/]+=*/gi,\n // Provider-style secret keys (sk_live_..., pk_..., api_...)\n /\\b(?:sk|pk|rk|api)(?:_[A-Za-z0-9]+){2,}\\b/gi,\n];\n\nfunction normalizeKey(key: string): string {\n return key.toLowerCase().replace(/[^a-z0-9]/g, \"\");\n}\n\n/** True when a header/param/body key looks sensitive. */\nexport function isSensitiveKey(key: string, extraHeaderNames: string[] = []): boolean {\n const normalized = normalizeKey(key);\n if (!normalized) {\n return false;\n }\n if (extraHeaderNames.some((name) => normalizeKey(name) === normalized)) {\n return true;\n }\n return SENSITIVE_KEY_TOKENS.some((token) => normalized.includes(token));\n}\n\n/** Apply value-pattern redaction to a free-form string. */\nexport function redactString(value: string, patterns: RegExp[] = DEFAULT_REDACT_PATTERNS): string {\n let out = value;\n for (const pattern of patterns) {\n try {\n // Reset lastIndex for global regexes reused across calls.\n pattern.lastIndex = 0;\n out = out.replace(pattern, REDACTED);\n } catch {\n // Ignore a malformed custom pattern rather than throwing.\n }\n }\n return out;\n}\n\n/** Redact sensitive entries from a header map. */\nexport function redactHeaders(\n headers: Record<string, string>,\n extraHeaderNames: string[] = [],\n patterns: RegExp[] = DEFAULT_REDACT_PATTERNS,\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, rawValue] of Object.entries(headers)) {\n if (isSensitiveKey(key, extraHeaderNames)) {\n out[key] = REDACTED;\n continue;\n }\n out[key] = typeof rawValue === \"string\" ? redactString(rawValue, patterns) : rawValue;\n }\n return out;\n}\n\n/** Redact sensitive query parameters from a URL, preserving its structure. */\nexport function redactUrl(\n url: string,\n extraHeaderNames: string[] = [],\n patterns: RegExp[] = DEFAULT_REDACT_PATTERNS,\n): string {\n try {\n // Resolve relative URLs against the current origin when available.\n const base = typeof window !== \"undefined\" ? window.location.href : \"http://localhost\";\n const parsed = new URL(url, base);\n let mutated = false;\n parsed.searchParams.forEach((_value, key) => {\n if (isSensitiveKey(key, extraHeaderNames)) {\n mutated = true;\n }\n });\n if (mutated) {\n const keys = Array.from(parsed.searchParams.keys());\n for (const key of keys) {\n if (isSensitiveKey(key, extraHeaderNames)) {\n parsed.searchParams.set(key, REDACTED);\n }\n }\n }\n // Preserve the original form (absolute vs path-only) where possible.\n const rebuilt = url.startsWith(parsed.origin) || /^https?:\\/\\//i.test(url)\n ? parsed.toString()\n : `${parsed.pathname}${parsed.search}${parsed.hash}`;\n return redactString(rebuilt, patterns);\n } catch {\n // Not a parseable URL — fall back to pattern redaction only.\n return redactString(url, patterns);\n }\n}\n\n/** Recursively redact sensitive keys/values in a parsed JSON-like value. */\nfunction redactJsonValue(\n value: unknown,\n extraHeaderNames: string[],\n patterns: RegExp[],\n depth = 0,\n): unknown {\n if (depth > 6) {\n return value;\n }\n if (typeof value === \"string\") {\n return redactString(value, patterns);\n }\n if (Array.isArray(value)) {\n return value.map((entry) => redactJsonValue(entry, extraHeaderNames, patterns, depth + 1));\n }\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n out[key] = isSensitiveKey(key, extraHeaderNames)\n ? REDACTED\n : redactJsonValue(entry, extraHeaderNames, patterns, depth + 1);\n }\n return out;\n }\n return value;\n}\n\n/**\n * Redact a request/response body preview. JSON bodies have sensitive keys\n * stripped; everything else is treated as free text. Never throws.\n */\nexport function redactBody(\n body: string,\n extraHeaderNames: string[] = [],\n patterns: RegExp[] = DEFAULT_REDACT_PATTERNS,\n): string {\n const trimmed = body.trimStart();\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n const parsed = JSON.parse(body);\n const redacted = redactJsonValue(parsed, extraHeaderNames, patterns);\n return JSON.stringify(redacted);\n } catch {\n // Not valid JSON — fall through to string redaction.\n }\n }\n return redactString(body, patterns);\n}\n\n/** Build a redactor bound to the resolved header/pattern config. */\nexport function createRedactor(extraHeaderNames: string[], extraPatterns: RegExp[]) {\n const headerNames = [...DEFAULT_REDACT_HEADERS, ...extraHeaderNames];\n const patterns = [...DEFAULT_REDACT_PATTERNS, ...extraPatterns];\n return {\n headerNames,\n patterns,\n string: (value: string) => redactString(value, patterns),\n headers: (headers: Record<string, string>) => redactHeaders(headers, headerNames, patterns),\n url: (url: string) => redactUrl(url, headerNames, patterns),\n body: (body: string) => redactBody(body, headerNames, patterns),\n };\n}\n\nexport type Redactor = ReturnType<typeof createRedactor>;\n","// BugPort widget — original implementation. Do not copy third-party sources.\n//\n// Safe value serialisation for diagnostics. The host app's console can be\n// handed literally anything — circular graphs, DOM nodes, Errors, functions,\n// huge buffers — so every helper here is defensive and never throws.\n\nconst MAX_DEPTH = 4;\nconst MAX_STRING_LENGTH = 8 * 1024;\nconst MAX_ARRAY_ENTRIES = 100;\nconst MAX_OBJECT_KEYS = 100;\n\n/** Truncate a string to a hard cap, appending an ellipsis marker. */\nexport function truncateString(value: string, max = MAX_STRING_LENGTH): string {\n if (value.length <= max) {\n return value;\n }\n return `${value.slice(0, max)}… [truncated ${value.length - max} chars]`;\n}\n\n/**\n * Convert an arbitrary value into a JSON-safe structure: circular references\n * become \"[Circular]\", functions/symbols become tags, Errors keep their\n * message + stack, and depth/size are capped. Never throws.\n */\nexport function safeClone(value: unknown, seen = new WeakSet<object>(), depth = 0): unknown {\n try {\n if (value === null || value === undefined) {\n return value;\n }\n\n const valueType = typeof value;\n if (valueType === \"string\") {\n return truncateString(value as string);\n }\n if (valueType === \"number\" || valueType === \"boolean\") {\n return value;\n }\n if (valueType === \"bigint\") {\n return `${(value as bigint).toString()}n`;\n }\n if (valueType === \"function\") {\n return `[Function ${(value as { name?: string }).name || \"anonymous\"}]`;\n }\n if (valueType === \"symbol\") {\n return (value as symbol).toString();\n }\n\n if (value instanceof Error) {\n return {\n name: value.name,\n message: truncateString(value.message),\n stack: value.stack ? truncateString(value.stack) : undefined,\n };\n }\n\n // DOM nodes: capture a compact descriptor rather than walking the tree.\n if (typeof Node !== \"undefined\" && value instanceof Node) {\n const el = value as Element;\n const tag = el.tagName ? el.tagName.toLowerCase() : el.nodeName;\n const id = el.id ? `#${el.id}` : \"\";\n return `[Node <${tag}${id}>]`;\n }\n\n if (depth >= MAX_DEPTH) {\n return Array.isArray(value) ? \"[Array]\" : \"[Object]\";\n }\n\n if (typeof value === \"object\") {\n if (seen.has(value as object)) {\n return \"[Circular]\";\n }\n seen.add(value as object);\n\n if (Array.isArray(value)) {\n const out = value\n .slice(0, MAX_ARRAY_ENTRIES)\n .map((entry) => safeClone(entry, seen, depth + 1));\n if (value.length > MAX_ARRAY_ENTRIES) {\n out.push(`… [${value.length - MAX_ARRAY_ENTRIES} more items]`);\n }\n seen.delete(value as object);\n return out;\n }\n\n const out: Record<string, unknown> = {};\n const keys = Object.keys(value as Record<string, unknown>).slice(0, MAX_OBJECT_KEYS);\n for (const key of keys) {\n out[key] = safeClone((value as Record<string, unknown>)[key], seen, depth + 1);\n }\n seen.delete(value as object);\n return out;\n }\n\n return String(value);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\n/** Render a single console argument as a readable string. */\nfunction stringifyArg(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value === null) {\n return \"null\";\n }\n if (value === undefined) {\n return \"undefined\";\n }\n if (value instanceof Error) {\n return value.stack || `${value.name}: ${value.message}`;\n }\n try {\n return JSON.stringify(safeClone(value));\n } catch {\n try {\n return String(value);\n } catch {\n return \"[Unserializable]\";\n }\n }\n}\n\n/** Join console arguments into a single human-readable message string. */\nexport function argsToMessage(args: unknown[]): string {\n try {\n return truncateString(args.map(stringifyArg).join(\" \"));\n } catch {\n return \"[Unserializable console message]\";\n }\n}\n","// BugPort widget — original implementation. Do not copy third-party sources.\n//\n// DiagnosticsCollector: optional, in-page capture of console output, runtime\n// errors, and fetch/XHR activity into capped ring buffers. Every wrapper is\n// defensive (never throws into host code), restores the original global on\n// uninstall, and is gated behind the resolved config. SSR-safe: all global\n// access is guarded and `install()` no-ops outside a browser runtime.\n\nimport { hasAnyCaptureEnabled, urlMatches } from \"./config\";\nimport { createRedactor, type Redactor } from \"./redaction\";\nimport { argsToMessage, safeClone, truncateString } from \"./serialize\";\nimport type {\n BugPortConsoleEvent,\n BugPortConsoleLevel,\n BugPortDiagnosticEvent,\n BugPortNetworkEvent,\n BugPortRuntimeErrorEvent,\n ResolvedDiagnosticsConfig,\n} from \"./types\";\n\nconst CONSOLE_LEVELS: BugPortConsoleLevel[] = [\"log\", \"info\", \"warn\", \"error\", \"debug\"];\n\n// Content types we consider safe to read as text. Anything else (images,\n// video, fonts, octet-stream, multipart uploads, …) is skipped.\nconst TEXTUAL_CONTENT_TYPE = /(json|text|xml|javascript|x-www-form-urlencoded|graphql)/i;\n\nlet idCounter = 0;\nfunction nextId(): string {\n idCounter += 1;\n let rand = \"0\";\n try {\n rand = Math.random().toString(36).slice(2, 8);\n } catch {\n // Math.random unavailable — counter alone keeps ids unique enough.\n }\n return `bpd_${Date.now().toString(36)}_${idCounter.toString(36)}_${rand}`;\n}\n\nfunction nowIso(): string {\n try {\n return new Date().toISOString();\n } catch {\n return new Date(0).toISOString();\n }\n}\n\nfunction nowPerf(): number {\n try {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n } catch {\n // ignore\n }\n return Date.now();\n}\n\n/** Normalise a fetch/XHR-ish headers source into a plain record. */\nfunction headersToRecord(source: unknown): Record<string, string> {\n const out: Record<string, string> = {};\n try {\n if (!source) {\n return out;\n }\n if (typeof Headers !== \"undefined\" && source instanceof Headers) {\n source.forEach((value, key) => {\n out[key] = value;\n });\n return out;\n }\n if (Array.isArray(source)) {\n for (const entry of source) {\n if (Array.isArray(entry) && entry.length >= 2) {\n out[String(entry[0])] = String(entry[1]);\n }\n }\n return out;\n }\n if (typeof source === \"object\") {\n for (const [key, value] of Object.entries(source as Record<string, unknown>)) {\n out[key] = String(value);\n }\n }\n } catch {\n // ignore — return whatever we have\n }\n return out;\n}\n\n/** A bounded FIFO buffer. */\nclass RingBuffer<T> {\n private items: T[] = [];\n constructor(private readonly max: number) {}\n\n push(item: T): void {\n this.items.push(item);\n if (this.items.length > this.max) {\n this.items.splice(0, this.items.length - this.max);\n }\n }\n\n snapshot(): T[] {\n return this.items.slice();\n }\n\n clear(): void {\n this.items = [];\n }\n}\n\nexport class DiagnosticsCollector {\n private readonly config: ResolvedDiagnosticsConfig;\n private readonly redactor: Redactor;\n\n private readonly consoleBuffer: RingBuffer<BugPortConsoleEvent>;\n private readonly runtimeBuffer: RingBuffer<BugPortRuntimeErrorEvent>;\n private readonly networkBuffer: RingBuffer<BugPortNetworkEvent>;\n\n private installed = false;\n\n // Saved originals for restoration.\n private originalConsole: Partial<Record<BugPortConsoleLevel, (...args: unknown[]) => void>> = {};\n private originalFetch: typeof fetch | null = null;\n private originalXhrOpen: XMLHttpRequest[\"open\"] | null = null;\n private originalXhrSend: XMLHttpRequest[\"send\"] | null = null;\n private originalXhrSetHeader: XMLHttpRequest[\"setRequestHeader\"] | null = null;\n private errorHandler: ((event: ErrorEvent) => void) | null = null;\n private rejectionHandler: ((event: PromiseRejectionEvent) => void) | null = null;\n\n // Per-XHR capture state.\n private readonly xhrState = new WeakMap<\n XMLHttpRequest,\n {\n method: string;\n url: string;\n start: number;\n requestHeaders: Record<string, string>;\n requestBody?: string;\n }\n >();\n\n constructor(config: ResolvedDiagnosticsConfig) {\n this.config = config;\n this.redactor = createRedactor(config.redactHeaders, config.redactPatterns);\n this.consoleBuffer = new RingBuffer(config.maxConsoleEvents);\n this.runtimeBuffer = new RingBuffer(config.maxRuntimeErrorEvents);\n this.networkBuffer = new RingBuffer(config.maxNetworkEvents);\n }\n\n /** Install configured instrumentation. Safe to call once; no-ops on SSR. */\n install(): void {\n if (this.installed) {\n return;\n }\n if (typeof window === \"undefined\") {\n return;\n }\n if (!hasAnyCaptureEnabled(this.config)) {\n return;\n }\n this.installed = true;\n\n if (this.config.console) {\n this.installConsole();\n }\n if (this.config.runtimeErrors) {\n this.installRuntimeErrors();\n }\n if (this.config.fetch) {\n this.installFetch();\n }\n if (this.config.xhr) {\n this.installXhr();\n }\n }\n\n /** Restore every patched global. Idempotent. */\n uninstall(): void {\n if (!this.installed) {\n return;\n }\n this.installed = false;\n\n try {\n for (const level of CONSOLE_LEVELS) {\n const original = this.originalConsole[level];\n if (original && typeof console !== \"undefined\") {\n console[level] = original as Console[typeof level];\n }\n }\n this.originalConsole = {};\n } catch {\n // ignore\n }\n\n try {\n if (this.originalFetch && typeof window !== \"undefined\") {\n window.fetch = this.originalFetch;\n }\n this.originalFetch = null;\n } catch {\n // ignore\n }\n\n try {\n if (typeof XMLHttpRequest !== \"undefined\") {\n if (this.originalXhrOpen) {\n XMLHttpRequest.prototype.open = this.originalXhrOpen;\n }\n if (this.originalXhrSend) {\n XMLHttpRequest.prototype.send = this.originalXhrSend;\n }\n if (this.originalXhrSetHeader) {\n XMLHttpRequest.prototype.setRequestHeader = this.originalXhrSetHeader;\n }\n }\n this.originalXhrOpen = null;\n this.originalXhrSend = null;\n this.originalXhrSetHeader = null;\n } catch {\n // ignore\n }\n\n try {\n if (this.errorHandler) {\n window.removeEventListener(\"error\", this.errorHandler);\n this.errorHandler = null;\n }\n if (this.rejectionHandler) {\n window.removeEventListener(\"unhandledrejection\", this.rejectionHandler);\n this.rejectionHandler = null;\n }\n } catch {\n // ignore\n }\n }\n\n /** Push an event through the optional `beforeSendDiagnostic` hook + buffer. */\n private emit(event: BugPortDiagnosticEvent): void {\n try {\n let finalEvent: BugPortDiagnosticEvent | null = event;\n if (this.config.beforeSendDiagnostic) {\n finalEvent = this.config.beforeSendDiagnostic(event);\n }\n if (!finalEvent) {\n return;\n }\n if (finalEvent.type === \"console\") {\n this.consoleBuffer.push(finalEvent);\n } else if (finalEvent.type === \"network\") {\n this.networkBuffer.push(finalEvent);\n } else {\n this.runtimeBuffer.push(finalEvent);\n }\n } catch {\n // Never let capture bookkeeping bubble into host code.\n }\n }\n\n // -------------------------------------------------------------------------\n // Console\n // -------------------------------------------------------------------------\n private installConsole(): void {\n if (typeof console === \"undefined\") {\n return;\n }\n for (const level of CONSOLE_LEVELS) {\n const original = console[level];\n if (typeof original !== \"function\") {\n continue;\n }\n // Keep the raw original so uninstall restores the exact reference.\n this.originalConsole[level] = original as (...args: unknown[]) => void;\n const capture = (args: unknown[]) => this.captureConsole(level, args);\n console[level] = function patchedConsoleMethod(this: unknown, ...args: unknown[]) {\n // Preserve original behaviour first, no matter what capture does.\n original.apply(this ?? console, args);\n try {\n capture(args);\n } catch {\n // swallow\n }\n } as Console[typeof level];\n }\n }\n\n private captureConsole(level: BugPortConsoleLevel, args: unknown[]): void {\n const message = this.redactor.string(argsToMessage(args));\n const safeArgs = args.map((arg) => safeClone(arg));\n this.emit({\n id: nextId(),\n type: \"console\",\n level,\n timestamp: nowIso(),\n args: safeArgs,\n message,\n });\n }\n\n // -------------------------------------------------------------------------\n // Runtime errors\n // -------------------------------------------------------------------------\n private installRuntimeErrors(): void {\n this.errorHandler = (event: ErrorEvent) => {\n try {\n const message = event.message || (event.error && String(event.error)) || \"Uncaught error\";\n this.emit({\n id: nextId(),\n type: \"runtime_error\",\n timestamp: nowIso(),\n message: this.redactor.string(truncateString(message)),\n stack: event.error?.stack ? this.redactor.string(truncateString(event.error.stack)) : undefined,\n source: event.filename ? this.redactor.url(event.filename) : undefined,\n line: typeof event.lineno === \"number\" ? event.lineno : undefined,\n column: typeof event.colno === \"number\" ? event.colno : undefined,\n });\n } catch {\n // swallow\n }\n };\n this.rejectionHandler = (event: PromiseRejectionEvent) => {\n try {\n const reason = event.reason;\n let message: string;\n let stack: string | undefined;\n if (reason instanceof Error) {\n message = `${reason.name}: ${reason.message}`;\n stack = reason.stack;\n } else {\n message = argsToMessage([reason]);\n }\n this.emit({\n id: nextId(),\n type: \"unhandled_rejection\",\n timestamp: nowIso(),\n message: this.redactor.string(truncateString(message)),\n stack: stack ? this.redactor.string(truncateString(stack)) : undefined,\n });\n } catch {\n // swallow\n }\n };\n // Passive listeners: we never call preventDefault, so the host app's own\n // error handling proceeds untouched.\n window.addEventListener(\"error\", this.errorHandler);\n window.addEventListener(\"unhandledrejection\", this.rejectionHandler);\n }\n\n // -------------------------------------------------------------------------\n // URL gating + body helpers (shared by fetch + xhr)\n // -------------------------------------------------------------------------\n private shouldCaptureUrl(url: string): boolean {\n try {\n // Never capture data/blob URLs (screenshots, object URLs).\n if (/^(data|blob):/i.test(url)) {\n return false;\n }\n if (this.config.deniedUrls.length > 0 && urlMatches(url, this.config.deniedUrls)) {\n return false;\n }\n if (this.config.allowedUrls.length > 0 && !urlMatches(url, this.config.allowedUrls)) {\n return false;\n }\n } catch {\n return false;\n }\n return true;\n }\n\n /** Cap + flag a textual body to the configured byte budget. */\n private capBody(text: string): { preview: string; truncated: boolean } {\n const max = this.config.maxBodySizeBytes;\n if (text.length <= max) {\n return { preview: text, truncated: false };\n }\n return { preview: text.slice(0, max), truncated: true };\n }\n\n /** Extract a safe, redacted request body preview from a fetch/xhr body. */\n private previewRequestBody(body: unknown): string | undefined {\n if (!this.config.requestBodies || body == null) {\n return undefined;\n }\n try {\n let text: string | undefined;\n if (typeof body === \"string\") {\n text = body;\n } else if (typeof URLSearchParams !== \"undefined\" && body instanceof URLSearchParams) {\n text = body.toString();\n } else {\n // FormData, Blob, ArrayBuffer, ReadableStream → skip (binary / uploads).\n return undefined;\n }\n const { preview } = this.capBody(text);\n return this.redactor.body(preview);\n } catch {\n return undefined;\n }\n }\n\n // -------------------------------------------------------------------------\n // Fetch\n // -------------------------------------------------------------------------\n private installFetch(): void {\n if (typeof window === \"undefined\" || typeof window.fetch !== \"function\") {\n return;\n }\n const original = window.fetch.bind(window);\n this.originalFetch = window.fetch;\n\n // Arrow function: `fetch` is invoked as `window.fetch(...)`, so it has no\n // meaningful `this` of its own — capturing the collector lexically lets us\n // avoid aliasing `this` to a local.\n const patchedFetch = (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const start = nowPerf();\n let method = \"GET\";\n let url = \"\";\n let requestHeaders: Record<string, string> = {};\n let requestBody: unknown;\n try {\n if (typeof input === \"string\") {\n url = input;\n } else if (input instanceof URL) {\n url = input.toString();\n } else if (input && typeof (input as Request).url === \"string\") {\n url = (input as Request).url;\n method = (input as Request).method || method;\n }\n if (init) {\n method = init.method || method;\n requestHeaders = headersToRecord(init.headers);\n requestBody = init.body;\n } else if (input instanceof Request) {\n requestHeaders = headersToRecord(input.headers);\n }\n method = method.toUpperCase();\n } catch {\n // fall through with whatever we parsed\n }\n\n const capturing = (() => {\n try {\n return this.shouldCaptureUrl(url);\n } catch {\n return false;\n }\n })();\n\n const responsePromise = original(input as RequestInfo, init);\n\n if (!capturing) {\n return responsePromise;\n }\n\n const reqHeaders = this.redactor.headers(requestHeaders);\n const reqBodyPreview = this.previewRequestBody(requestBody);\n\n return responsePromise.then(\n (response) => {\n try {\n this.captureFetchResponse({\n start,\n method,\n url,\n requestHeaders: reqHeaders,\n requestBodyPreview: reqBodyPreview,\n response,\n });\n } catch {\n // never disturb the host's response handling\n }\n return response;\n },\n (error: unknown) => {\n try {\n this.emit({\n id: nextId(),\n type: \"network\",\n transport: \"fetch\",\n timestamp: nowIso(),\n method,\n url: this.redactor.url(url),\n durationMs: Math.round(nowPerf() - start),\n requestHeaders: reqHeaders,\n requestBodyPreview: reqBodyPreview,\n error: this.redactor.string(\n error instanceof Error ? `${error.name}: ${error.message}` : String(error),\n ),\n });\n } catch {\n // swallow\n }\n throw error;\n },\n );\n };\n\n window.fetch = patchedFetch as typeof fetch;\n }\n\n private captureFetchResponse(args: {\n start: number;\n method: string;\n url: string;\n requestHeaders: Record<string, string>;\n requestBodyPreview?: string;\n response: Response;\n }): void {\n const { start, method, url, requestHeaders, requestBodyPreview, response } = args;\n const responseHeaders = this.redactor.headers(headersToRecord(response.headers));\n const event: BugPortNetworkEvent = {\n id: nextId(),\n type: \"network\",\n transport: \"fetch\",\n timestamp: nowIso(),\n method,\n url: this.redactor.url(url),\n status: response.status,\n statusText: response.statusText || undefined,\n durationMs: Math.round(nowPerf() - start),\n requestHeaders,\n responseHeaders,\n requestBodyPreview,\n };\n this.emit(event);\n\n // Read the response body off a clone so the host app still consumes the\n // original stream. Fire-and-forget; mutate the buffered event in place.\n if (this.config.responseBodies) {\n try {\n const contentType = response.headers.get(\"content-type\") || \"\";\n const canRead =\n TEXTUAL_CONTENT_TYPE.test(contentType) && typeof response.clone === \"function\" && !response.bodyUsed;\n if (canRead) {\n response\n .clone()\n .text()\n .then((text) => {\n try {\n const { preview, truncated } = this.capBody(text);\n event.responseBodyPreview = this.redactor.body(preview);\n event.responseBodyTruncated = truncated;\n } catch {\n // swallow\n }\n })\n .catch(() => {\n // streaming/aborted clone read — ignore\n });\n }\n } catch {\n // swallow\n }\n }\n }\n\n // -------------------------------------------------------------------------\n // XMLHttpRequest\n // -------------------------------------------------------------------------\n private installXhr(): void {\n if (typeof XMLHttpRequest === \"undefined\") {\n return;\n }\n this.originalXhrOpen = XMLHttpRequest.prototype.open;\n this.originalXhrSend = XMLHttpRequest.prototype.send;\n this.originalXhrSetHeader = XMLHttpRequest.prototype.setRequestHeader;\n const originalOpen = this.originalXhrOpen;\n const originalSend = this.originalXhrSend;\n const originalSetHeader = this.originalXhrSetHeader;\n\n // Per-call capture helpers are arrows so they bind the collector lexically;\n // the patched prototype methods stay `function`s so their own `this` is the\n // XHR instance the host expects.\n const recordOpen = (xhr: XMLHttpRequest, method: string, url: string | URL) => {\n this.xhrState.set(xhr, {\n method: (method || \"GET\").toUpperCase(),\n url: typeof url === \"string\" ? url : String(url),\n start: 0,\n requestHeaders: {},\n });\n };\n const recordHeader = (xhr: XMLHttpRequest, name: string, value: string) => {\n const state = this.xhrState.get(xhr);\n if (state) {\n state.requestHeaders[name] = value;\n }\n };\n const recordSend = (xhr: XMLHttpRequest, body: unknown) => {\n const state = this.xhrState.get(xhr);\n if (state && this.shouldCaptureUrl(state.url)) {\n state.start = nowPerf();\n state.requestBody = this.previewRequestBody(body);\n this.attachXhrListeners(xhr, state);\n }\n };\n\n XMLHttpRequest.prototype.open = function patchedOpen(\n this: XMLHttpRequest,\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n try {\n recordOpen(this, method, url);\n } catch {\n // swallow\n }\n return originalOpen.apply(this, [method, url as string, ...(rest as [])] as never);\n } as XMLHttpRequest[\"open\"];\n\n XMLHttpRequest.prototype.setRequestHeader = function patchedSetHeader(\n this: XMLHttpRequest,\n name: string,\n value: string,\n ) {\n try {\n recordHeader(this, name, value);\n } catch {\n // swallow\n }\n return originalSetHeader.call(this, name, value);\n } as XMLHttpRequest[\"setRequestHeader\"];\n\n XMLHttpRequest.prototype.send = function patchedSend(\n this: XMLHttpRequest,\n body?: Document | XMLHttpRequestBodyInit | null,\n ) {\n try {\n recordSend(this, body);\n } catch {\n // swallow\n }\n return originalSend.call(this, body as XMLHttpRequestBodyInit | null);\n } as XMLHttpRequest[\"send\"];\n }\n\n private attachXhrListeners(\n xhr: XMLHttpRequest,\n state: {\n method: string;\n url: string;\n start: number;\n requestHeaders: Record<string, string>;\n requestBody?: string;\n },\n ): void {\n // A failed XHR fires both \"error\" and \"loadend\"; emit exactly once.\n let finalized = false;\n const finalize = (errorKind?: string) => {\n if (finalized) {\n return;\n }\n finalized = true;\n try {\n const responseHeaders = this.redactor.headers(parseXhrResponseHeaders(xhr));\n const event: BugPortNetworkEvent = {\n id: nextId(),\n type: \"network\",\n transport: \"xhr\",\n timestamp: nowIso(),\n method: state.method,\n url: this.redactor.url(state.url),\n status: errorKind ? undefined : xhr.status || undefined,\n statusText: xhr.statusText || undefined,\n durationMs: Math.round(nowPerf() - state.start),\n requestHeaders: this.redactor.headers(state.requestHeaders),\n responseHeaders,\n requestBodyPreview: state.requestBody,\n error: errorKind ? this.redactor.string(errorKind) : undefined,\n };\n\n if (!errorKind && this.config.responseBodies) {\n const rt = xhr.responseType;\n const isText = rt === \"\" || rt === \"text\";\n const contentType = safeGetResponseHeader(xhr, \"content-type\");\n if (isText && (!contentType || TEXTUAL_CONTENT_TYPE.test(contentType))) {\n try {\n const text = xhr.responseText || \"\";\n const { preview, truncated } = this.capBody(text);\n event.responseBodyPreview = this.redactor.body(preview);\n event.responseBodyTruncated = truncated;\n } catch {\n // accessing responseText can throw for non-text types — ignore\n }\n }\n }\n\n this.emit(event);\n } catch {\n // swallow\n }\n };\n\n // addEventListener preserves any handlers the host app already attached.\n xhr.addEventListener(\"loadend\", () => finalize());\n xhr.addEventListener(\"error\", () => finalize(\"Network error\"));\n xhr.addEventListener(\"timeout\", () => finalize(\"Timeout\"));\n xhr.addEventListener(\"abort\", () => finalize(\"Aborted\"));\n }\n\n // -------------------------------------------------------------------------\n // Snapshots\n // -------------------------------------------------------------------------\n getConsoleEvents(): BugPortConsoleEvent[] {\n return this.consoleBuffer.snapshot();\n }\n\n getRuntimeErrorEvents(): BugPortRuntimeErrorEvent[] {\n return this.runtimeBuffer.snapshot();\n }\n\n getNetworkEvents(): BugPortNetworkEvent[] {\n return this.networkBuffer.snapshot();\n }\n\n clear(): void {\n this.consoleBuffer.clear();\n this.runtimeBuffer.clear();\n this.networkBuffer.clear();\n }\n}\n\nfunction parseXhrResponseHeaders(xhr: XMLHttpRequest): Record<string, string> {\n const out: Record<string, string> = {};\n try {\n const raw = xhr.getAllResponseHeaders();\n if (!raw) {\n return out;\n }\n for (const line of raw.trim().split(/[\\r\\n]+/)) {\n const idx = line.indexOf(\":\");\n if (idx > 0) {\n const key = line.slice(0, idx).trim();\n const value = line.slice(idx + 1).trim();\n if (key) {\n out[key] = value;\n }\n }\n }\n } catch {\n // ignore\n }\n return out;\n}\n\nfunction safeGetResponseHeader(xhr: XMLHttpRequest, name: string): string | null {\n try {\n return xhr.getResponseHeader(name);\n } catch {\n return null;\n }\n}\n"],"mappings":";;;AAAA,SAAS,eAAAA,cAAa,aAAAC,YAAW,SAAS,YAAAC,iBAAgB;AAC1D,SAAS,kBAA6B;;;ACEtC;AAAA,EACE,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,YAAAC;AAAA,OACK;AACP,SAAS,gBAAAC,qBAAoB;;;ACL7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACVP,IAAM,MAAM;AACZ,IAAM,aAAa,EAAC,SAAQ,gCAA+B,SAAQ,gCAA+B,cAAa,qCAAoC,WAAU,kCAAiC,QAAO,+BAA8B,aAAY,oCAAmC,SAAQ,gCAA+B,UAAS,iCAAgC,WAAU,kCAAiC,gBAAe,uCAAsC,WAAU,kCAAiC,YAAW,mCAAkC,iBAAgB,wCAAuC,eAAc,sCAAqC,eAAc,sCAAqC,aAAY,oCAAmC,iBAAgB,wCAAuC,cAAa,qCAAoC,aAAY,oCAAmC,SAAQ,gCAA+B,YAAW,mCAAkC,SAAQ,gCAA+B,WAAU,kCAAiC,UAAS,iCAAgC,UAAS,iCAAgC,iBAAgB,wCAAuC,gBAAe,uCAAsC,SAAQ,+BAA8B;AAEvwC,IAAI,OAAO,aAAa,aAAa;AACnC,MAAI,QAAQ,SAAS,eAAe,mDAAmD;AACvF,MAAI,CAAC,OAAO;AACV,YAAQ,SAAS,cAAc,OAAO;AACtC,UAAM,KAAK;AACX,aAAS,KAAK,YAAY,KAAK;AAAA,EACjC;AACA,QAAM,cAAc;AACtB;AAEA,IAAO,wBAAQ;;;ACbf,IAAMC,OAAM;AACZ,IAAMC,cAAa,EAAC,aAAY,8CAA6C,iBAAgB,kDAAiD,YAAW,6CAA4C,gBAAe,iDAAgD,WAAU,4CAA2C,UAAS,2CAA0C,iBAAgB,kDAAiD,gBAAe,iDAAgD,WAAU,2CAA0C;AAEhiB,IAAI,OAAO,aAAa,aAAa;AACnC,MAAI,QAAQ,SAAS,eAAe,mDAAmD;AACvF,MAAI,CAAC,OAAO;AACV,YAAQ,SAAS,cAAc,OAAO;AACtC,UAAM,KAAK;AACX,aAAS,KAAK,YAAY,KAAK;AAAA,EACjC;AACA,QAAM,cAAcD;AACtB;AAEA,IAAO,kCAAQC;;;ACFX,cAwDA,YAxDA;AAFG,IAAM,YAAY,CAAC,EAAE,OAAO,GAAG,MACpC,oBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA,EAAC;AAAA;AAAA,IACC,GAAE;AAAA,IACF,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA;AAChB,GACF;AAIK,IAAM,WAAW,CAAC,EAAE,OAAO,GAAG,MACnC,oBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA,EAAC;AAAA;AAAA,IACC,GAAE;AAAA,IACF,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA;AAChB,GACF;AAIK,IAAM,YAAY,CAAC,EAAE,OAAO,GAAG,MACpC,oBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA,EAAC;AAAA;AAAA,IACC,GAAE;AAAA,IACF,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA,IACd,gBAAe;AAAA;AACjB,GACF;AAIK,IAAM,iBAAiB,CAAC,EAAE,OAAO,GAAG,MACzC,oBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA,EAAC;AAAA;AAAA,IACC,GAAE;AAAA,IACF,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA,IACd,gBAAe;AAAA;AACjB,GACF;AAIK,IAAM,kBAAkB,CAAC;AAAA,EAC9B,OAAO;AAAA,EACP,QAAQ,CAAC;AACX,MAIE,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QAAO,OAC9D;AAAA,uBAAC,OAAE,UAAS,4BACV;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,gBAAe;AAAA;AAAA,IACjB;AAAA,KACF;AAAA,EACA,oBAAC,UACC,8BAAC,cAAS,IAAG,sBACX,8BAAC,UAAK,OAAM,MAAK,QAAO,MAAK,MAAK,SAAQ,GAC5C,GACF;AAAA,GACF;AAOK,IAAM,mBAAmB,CAAC;AAAA,EAC/B,OAAO;AACT,MAGE;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IACN,eAAY;AAAA,IAGZ;AAAA,0BAAC,UAAK,OAAM,OAAM,QAAO,OAAM,IAAG,OAAM,MAAK,WAAU;AAAA,MACvD,qBAAC,OAAE,WAAU,gCAEX;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QAEA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QAEA,oBAAC,UAAK,GAAE,gBAAe,QAAO,WAAU,aAAY,MAAK,eAAc,SAAQ;AAAA,QAC/E,oBAAC,UAAK,GAAE,kBAAiB,QAAO,WAAU,aAAY,MAAK,eAAc,SAAQ;AAAA,QACjF,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,MAAK,WAAU;AAAA,QAC9C,oBAAC,YAAO,IAAG,OAAM,IAAG,MAAK,GAAE,MAAK,MAAK,WAAU;AAAA,QAE/C,oBAAC,UAAK,GAAE,qCAAoC,MAAK,WAAU;AAAA,QAC3D,oBAAC,UAAK,GAAE,gBAAe,QAAO,WAAU,aAAY,MAAK;AAAA,QACzD,oBAAC,UAAK,GAAE,eAAc,QAAO,WAAU,aAAY,MAAK;AAAA,SAC1D;AAAA;AAAA;AACF;AAIK,IAAM,WAAW,CAAC;AAAA,EACvB,OAAO;AAAA,EACP,GAAG;AACL,MACE;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IACL,GAAG;AAAA,IAEJ;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,IAAG;AAAA,UACH,IAAG;AAAA,UACH,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA;AAAA,MACd;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA;AAAA,MACjB;AAAA,MACA,oBAAC,YAAO,IAAG,MAAK,IAAG,SAAQ,GAAE,OAAM,MAAK,gBAAe;AAAA;AAAA;AACzD;AAIK,IAAM,yBAAyB,CAAC,EAAE,OAAO,GAAG,MACjD,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA,sBAAC,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OA+BN;AAAA,EACF;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA;AAAA,EACjB;AAAA,GACF;AAQK,IAAM,cAAc,CAAC,EAAE,OAAO,GAAG,MACtC,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,GAAE;AAAA,MACF,OAAM;AAAA,MACN,QAAO;AAAA,MACP,IAAG;AAAA,MACH,QAAO;AAAA,MACP,aAAY;AAAA;AAAA,EACd;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA;AAAA,EAChB;AAAA,GACF;AAGK,IAAM,aAAa,CAAC,EAAE,OAAO,GAAG,MACrC,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA;AAAA,EACd;AAAA,EACA,oBAAC,YAAO,IAAG,MAAK,IAAG,SAAQ,GAAE,QAAO,QAAO,gBAAe,aAAY,OAAM;AAAA,EAC5E,oBAAC,YAAO,IAAG,SAAQ,IAAG,QAAO,GAAE,OAAM,MAAK,gBAAe;AAAA,GAC3D;AAIK,IAAM,mBAAmB,CAAC;AAAA,EAC/B,OAAO;AAAA,EACP,SAAS;AAAA,EACT;AACF,MAKE,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QAAO,OAAO,OAAO,EAAE,OAAO,MAAM,YAAY,kBAAkB,IAAI,QAE7H;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,gCAAE,SAAS,IAAI,SAAS,gCAAE,eAAe,gCAAE,aAAa;AAAA,MAEtE;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,GAAE;AAAA,YACF,OAAM;AAAA,YACN,QAAO;AAAA,YACP,IAAG;AAAA,YACH,QAAO;AAAA,YACP,aAAY;AAAA;AAAA,QACd;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,eAAc;AAAA;AAAA,QAChB;AAAA;AAAA;AAAA,EACF;AAAA,EAEA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,gCAAE,SAAS,IAAI,SAAS,gCAAE,gBAAgB,gCAAE,YAAY;AAAA,MAEtE;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,IAAG;AAAA,YACH,GAAE;AAAA,YACF,QAAO;AAAA,YACP,aAAY;AAAA;AAAA,QACd;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,eAAc;AAAA,YACd,gBAAe;AAAA;AAAA,QACjB;AAAA;AAAA;AAAA,EACF;AAAA,GACF;AAIK,IAAM,gBAAgB,CAAC;AAAA,EAC5B,OAAO;AAAA,EACP,QAAQ;AACV,MAGM;AACJ,QAAM,YAAY,UAAU;AAC5B,QAAM,YAAY,UAAU;AAC5B,QAAM,YAAY,UAAU;AAC5B,QAAM,YAAY,UAAU;AAE5B,SACE,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QAEvD;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,gCAAE,aAAa,IAAI,YAAY,gCAAE,gBAAgB,YAAY,gCAAE,UAAU,gCAAE,YAAY;AAAA,QAErG;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,GAAE;AAAA,cACF,QAAO;AAAA,cACP,aAAY;AAAA,cACZ,eAAc;AAAA,cACd,gBAAe;AAAA;AAAA,UACjB;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,GAAE;AAAA,cACF,QAAO;AAAA,cACP,aAAY;AAAA,cACZ,eAAc;AAAA,cACd,gBAAe;AAAA;AAAA,UACjB;AAAA;AAAA;AAAA,IACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,gCAAE,aAAa,IAAI,YAAY,gCAAE,gBAAgB,gCAAE,YAAY;AAAA,QAE7E;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,IAAG;AAAA,cACH,GAAE;AAAA,cACF,QAAO;AAAA,cACP,aAAY;AAAA;AAAA,UACd;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,GAAE;AAAA,cACF,QAAO;AAAA,cACP,aAAY;AAAA,cACZ,eAAc;AAAA,cACd,gBAAe;AAAA;AAAA,UACjB;AAAA;AAAA;AAAA,IACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,gCAAE,aAAa,IAAI,YAAY,gCAAE,gBAAgB,gCAAE,YAAY;AAAA,QAE7E;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,IAAG;AAAA,cACH,GAAE;AAAA,cACF,QAAO;AAAA,cACP,aAAY;AAAA;AAAA,UACd;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,GAAE;AAAA,cACF,QAAO;AAAA,cACP,aAAY;AAAA,cACZ,eAAc;AAAA;AAAA,UAChB;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,IAAG;AAAA,cACH,IAAG;AAAA,cACH,GAAE;AAAA,cACF,MAAK;AAAA,cACL,QAAO;AAAA,cACP,aAAY;AAAA;AAAA,UACd;AAAA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAGO,IAAM,mBAAmB,CAAC;AAAA,EAC/B,OAAO;AAAA,EACP,OAAO;AACT,MAIE,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QAEvD;AAAA,uBAAC,OAAE,WAAW,GAAG,gCAAE,SAAS,IAAI,OAAO,gCAAE,eAAe,gCAAE,aAAa,IACrE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA;AAAA,IAChB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA;AAAA,IAChB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA;AAAA,IAChB;AAAA,KACF;AAAA,EAEA,qBAAC,OAAE,WAAW,GAAG,gCAAE,SAAS,IAAI,OAAO,gCAAE,gBAAgB,gCAAE,YAAY,IACrE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAG;AAAA,QACH,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA;AAAA,IACd;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB;AAAA,KACF;AAAA,GACF;AAIK,IAAM,UAAU,CAAC,EAAE,OAAO,GAAG,MAClC,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA;AAAA,EACjB;AAAA,EACA,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,QAAO,QAAO,gBAAe,aAAY,OAAM;AAAA,GAC3E;AAIK,IAAM,aAAa,CAAC,EAAE,OAAO,GAAG,MACrC,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA;AAAA,EACjB;AAAA,EACA,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,QAAO,QAAO,gBAAe,aAAY,OAAM;AAAA,GAC3E;AAIK,IAAM,gBAAgB,CAAC,EAAE,OAAO,GAAG,MACxC,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA;AAAA,EACjB;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA;AAAA,EAChB;AAAA,GACF;AAIK,IAAM,kBAAkB,CAAC;AAAA,EAC9B,OAAO;AAAA,EACP,SAAS;AACX,MAIE,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QAEvD;AAAA,uBAAC,OAAE,WAAW,GAAG,gCAAE,QAAQ,IAAI,SAAS,gCAAE,UAAU,gCAAE,MAAM,IAC1D;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB;AAAA,IACA,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,QAAO,QAAO,gBAAe,aAAY,OAAM;AAAA,KAC3E;AAAA,EAEA,qBAAC,OAAE,WAAW,GAAG,gCAAE,QAAQ,IAAI,SAAS,gCAAE,SAAS,gCAAE,OAAO,IAC1D;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA;AAAA,IAChB;AAAA,KACF;AAAA,GACF;AAIK,IAAM,wBAAwB,CAAC;AAAA,EACpC,OAAO;AAAA,EACP,WAAW;AACb,MAIE,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QAEvD;AAAA,uBAAC,OAAE,WAAW,GAAG,gCAAE,YAAY,IAAI,WAAW,gCAAE,SAAS,gCAAE,OAAO,IAChE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA;AAAA,IAChB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA;AAAA,IAChB;AAAA,KACF;AAAA,EAEA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,gCAAE,YAAY,IAAI,WAAW,gCAAE,UAAU,gCAAE,MAAM;AAAA,MAC/D,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,gBAAe;AAAA;AAAA,EACjB;AAAA,GACF;AAIK,IAAM,eAAe,CAAC,EAAE,OAAO,GAAG,MACvC,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA;AAAA,EACjB;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA;AAAA,EAChB;AAAA,GACF;AAIK,IAAM,WAAW,CAAC,EAAE,OAAO,GAAG,MACnC,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA;AAAA,EACjB;AAAA,EACA,oBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,OAAM,QAAO,gBAAe,aAAY,OAAM;AAAA,GAC1E;AAIK,IAAM,eAAe,CAAC,EAAE,OAAO,GAAG,MACvC,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,GAAE;AAAA,MACF,OAAM;AAAA,MACN,QAAO;AAAA,MACP,IAAG;AAAA,MACH,QAAO;AAAA,MACP,aAAY;AAAA;AAAA,EACd;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,GAAE;AAAA,MACF,OAAM;AAAA,MACN,QAAO;AAAA,MACP,IAAG;AAAA,MACH,QAAO;AAAA,MACP,aAAY;AAAA;AAAA,EACd;AAAA,GACF;AAIK,IAAM,YAAY,CAAC,EAAE,OAAO,GAAG,MACpC,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA;AAAA,EAChB;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA;AAAA,EAChB;AAAA,GACF;AAIK,IAAM,cAAc,CAAC,EAAE,OAAO,GAAG,MACtC,oBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA,EAAC;AAAA;AAAA,IACC,GAAE;AAAA,IACF,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,gBAAe;AAAA;AACjB,GACF;AAIK,IAAM,eAAe,CAAC,EAAE,OAAO,GAAG,MACvC,oBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA,EAAC;AAAA;AAAA,IACC,UAAS;AAAA,IACT,UAAS;AAAA,IACT,GAAE;AAAA,IACF,MAAK;AAAA;AACP,GACF;AAIK,IAAM,mBAAmB,CAAC;AAAA,EAC/B,OAAO;AAAA,EACP,QAAQ,CAAC;AACX,MAIE,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf;AAAA;AAAA,EACF;AAAA,EACA,oBAAC,YAAO,IAAG,MAAK,IAAG,SAAQ,GAAE,KAAI,MAAK,gBAAe;AAAA,EACrD,oBAAC,YAAO,IAAG,MAAK,IAAG,SAAQ,GAAE,KAAI,MAAK,gBAAe;AAAA,EACrD,oBAAC,YAAO,IAAG,KAAI,IAAG,SAAQ,GAAE,KAAI,MAAK,gBAAe;AAAA,GACtD;AAIK,IAAM,gBAAgB,CAAC,EAAE,OAAO,GAAG,MACxC,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA,sBAAC,OAAE,UAAS,oBACV;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA;AAAA,EACjB,GACF;AAAA,EACA,oBAAC,UACC,8BAAC,cAAS,IAAG,cACX,8BAAC,UAAK,OAAM,MAAK,QAAO,MAAK,MAAK,SAAQ,GAC5C,GACF;AAAA,GACF;AAIK,IAAM,qBAAqB,CAAC,EAAE,OAAO,GAAG,MAC7C,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA,sBAAC,OAAE,UAAS,oBACV;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA;AAAA,EACjB,GACF;AAAA,EACA,oBAAC,UACC,8BAAC,cAAS,IAAG,cACX,8BAAC,UAAK,OAAM,MAAK,QAAO,MAAK,MAAK,SAAQ,GAC5C,GACF;AAAA,GACF;AAIK,IAAM,sBAAsB,CAAC,EAAE,OAAO,GAAG,MAC9C,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA,uBAAC,OAAE,UAAS,gCACV;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,IAAG;AAAA,QACH,IAAG;AAAA,QACH,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA;AAAA,IACd;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB;AAAA,KACF;AAAA,EACA,oBAAC,UACC,8BAAC,cAAS,IAAG,0BACX,8BAAC,UAAK,OAAM,MAAK,QAAO,MAAK,MAAK,SAAQ,GAC5C,GACF;AAAA,GACF;AAIK,IAAM,YAAY,CAAC,EAAE,OAAO,GAAG,MACpC,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA,uBAAC,OAAE,UAAS,oBACV;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB;AAAA,KACF;AAAA,EACA,oBAAC,UACC,8BAAC,cAAS,IAAG,cACX,8BAAC,UAAK,OAAM,MAAK,QAAO,MAAK,MAAK,SAAQ,GAC5C,GACF;AAAA,GACF;AAIK,IAAM,iBAAiB,CAAC,EAAE,OAAO,GAAG,MACzC,oBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA,EAAC;AAAA;AAAA,IACC,GAAE;AAAA,IACF,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA;AAChB,GACF;AAIK,IAAM,UAAU,CAAC,EAAE,OAAO,GAAG,MAClC,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA,sBAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,QAAO,QAAO,gBAAe,aAAY,QAAO;AAAA,EAC1E;AAAA,IAAC;AAAA;AAAA,MACC,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MAEf;AAAA,4BAAC,UAAK,GAAE,aAAY;AAAA,QACpB,oBAAC,UAAK,GAAE,eAAc;AAAA,QACtB,oBAAC,UAAK,GAAE,aAAY;AAAA,QACpB,oBAAC,UAAK,GAAE,eAAc;AAAA,QACtB,oBAAC,UAAK,GAAE,wBAAuB;AAAA,QAC/B,oBAAC,UAAK,GAAE,4BAA2B;AAAA,QACnC,oBAAC,UAAK,GAAE,0BAAyB;AAAA,QACjC,oBAAC,UAAK,GAAE,0BAAyB;AAAA;AAAA;AAAA,EACnC;AAAA,GACF;AAIK,IAAM,WAAW,CAAC,EAAE,OAAO,GAAG,MACnC,oBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA,EAAC;AAAA;AAAA,IACC,GAAE;AAAA,IACF,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA,IACd,gBAAe;AAAA;AACjB,GACF;AAIK,IAAM,WAAW,CAAC,EAAE,OAAO,GAAG,MACnC;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IAEN;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB;AAAA;AACF;AAIK,IAAM,YAAY,CAAC,EAAE,OAAO,GAAG,MACpC;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IAEN;AAAA,MAAC;AAAA;AAAA,QACC,UAAS;AAAA,QACT,UAAS;AAAA,QACT,GAAE;AAAA,QACF,MAAK;AAAA;AAAA,IACP;AAAA;AACF;AAIK,IAAM,kBAAkB,CAAC,EAAE,OAAO,GAAG,MAC1C;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IAEN;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB;AAAA;AACF;AAGK,IAAM,mBAAmB,CAAC,EAAE,OAAO,GAAG,MAC3C;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IAEN;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB;AAAA;AACF;AAIK,IAAM,aAAa,CAAC,EAAE,OAAO,GAAG,MACrC,qBAAC,SAAI,OAAO,MAAM,QAAQ,MAAM,SAAQ,aAAY,MAAK,QACvD;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,GAAE;AAAA,MACF,OAAM;AAAA,MACN,QAAO;AAAA,MACP,IAAG;AAAA,MACH,QAAO;AAAA,MACP,aAAY;AAAA;AAAA,EACd;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,QAAO;AAAA,MACP,aAAY;AAAA;AAAA,EACd;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,IAAG;AAAA,MACH,QAAO;AAAA,MACP,aAAY;AAAA;AAAA,EACd;AAAA,GACF;;;AC34BF,IAAM,YAAY;AAGlB,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,kBAAkB;AAExB,IAAM,aAAa;AASnB,SAAS,WAAwB;AAC/B,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,UAAU,CAAC,QAA8B;AAAA,MACzC,kBAAkB,CAAC;AAAA,MACnB,oBAAoB,CAAC;AAAA,MACrB,gBAAgB,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,OAAO;AACb,MAAI,QAAQ,KAAK,SAAS;AAE1B,MAAI,CAAC,OAAO;AACV,YAAQ;AAAA,MACN,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,gBAAgB,OAAO,WAAW,KAAK,MAAM;AAAA,MAC7C,iBAAiB,OAAO,YAAY,KAAK,MAAM;AAAA,MAC/C,SAAS,OAAO,sBAAsB;AAAA,QACpC;AAAA,MACF;AAAA,MACA,kBAAkB,CAAC;AAAA,MACnB,oBAAoB,CAAC;AAAA,MACrB,gBAAgB,CAAC;AAAA,IACnB;AACA,SAAK,SAAS,IAAI;AAAA,EACpB;AAEA,SAAO;AACT;AAUA,SAAS,iBAAuB;AAC9B,MAAI,OAAO,WAAW,aAAa;AACjC;AAAA,EACF;AAEA,QAAM,QAAQ,SAAS;AACvB,MAAI,MAAM,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM;AAC7B,QAAM,kBAAkB,MAAM;AAC9B,QAAM,UAAU,MAAM;AAGtB,QAAM,oBAAoB,SACxB,SACA,YACG,MACK;AAGR,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO,eAAe,SAAS,OAAO;AAAA,IACxC;AAEA,UAAM,KAAK;AACX,WAAO,eAAe,MAAM;AAC1B,YAAM,OAAO,SAAS;AACtB,UAAI,KAAK,QAAQ;AACf,aAAK,mBAAmB,KAAK,MAAM,GAAG,GAAG,IAAI,CAAC;AAC9C;AAAA,MACF;AACA,SAAG,GAAG,IAAI;AAAA,IACZ,GAAG,OAAO;AAAA,EACZ;AAGA,QAAM,qBAAqB,SACzB,SACA,YACG,MACK;AACR,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO,gBAAgB,SAAS,OAAO;AAAA,IACzC;AAEA,UAAM,KAAK;AACX,WAAO,gBAAgB,MAAM;AAC3B,UAAI,SAAS,EAAE,QAAQ;AACrB;AAAA,MACF;AACA,SAAG,GAAG,IAAI;AAAA,IACZ,GAAG,OAAO;AAAA,EACZ;AAGA,QAAM,aAAa,SAAU,UAAwC;AACnE,WAAO,QAAQ,CAAC,cAAsB;AACpC,YAAM,OAAO,SAAS;AACtB,UAAI,KAAK,QAAQ;AACf,aAAK,eAAe,KAAK,QAAQ;AACjC;AAAA,MACF;AACA,eAAS,SAAS;AAAA,IACpB,CAAC;AAAA,EACH;AAKA,QAAM,SAAS;AAKf,SAAO,aAAa;AACpB,SAAO,cAAc;AACrB,SAAO,wBAAwB;AAE/B,QAAM,YAAY;AACpB;AAGA,eAAe;AAMR,IAAM,qBACX,SAAS,EAAE;AAEN,IAAM,sBACX,SAAS,EAAE;AAEN,IAAM,gCACX,SAAS,EAAE;AAWb,SAAS,sBAA8B;AACrC,SAAO,cAAc;AAAA,IACnB,CAAC,SAAS,SAAS,IAAI,WAAW,IAAI;AAAA,EACxC,EAAE,KAAK,EAAE;AACX;AAGA,SAAS,uBAAuB,IAA6B;AAC3D,MAAI,CAAC,IAAI;AACP,WAAO;AAAA,EACT;AACA,aAAW,QAAQ,eAAe;AAChC,QAAI,GAAG,UAAU,IAAI,IAAI,GAAG,GAAG;AAC7B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,gBAAgB,MAAiC;AACxD,QAAM,SAAS,KAAK;AAIpB,QAAM,SAAS,QAAQ;AACvB,SAAO,kBAAkB,UAAU,SAAS;AAC9C;AAMA,SAAS,oBAA0B;AACjC,QAAM,YAAY,oBAAoB;AACtC,QAAM,WAAW,IAAI,SAAS,MAAM,SAAS,cAAc,SAAS;AACpE,QAAMC,OAAM,GAAG,QAAQ;AAEvB,MAAI,UAAU,SAAS;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,CAAC,SAAS;AACZ,cAAU,SAAS,cAAc,OAAO;AACxC,YAAQ,KAAK;AACb,aAAS,KAAK,YAAY,OAAO;AAAA,EACnC;AAEA,UAAQ,cAAcA;AACxB;AAGA,SAAS,qBAA2B;AAClC,QAAM,UAAU,SAAS,eAAe,eAAe;AACvD,MAAI,SAAS,YAAY;AACvB,YAAQ,WAAW,YAAY,OAAO;AAAA,EACxC;AACF;AAMO,SAAS,SAAe;AAC7B,MAAI,OAAO,aAAa,aAAa;AACnC;AAAA,EACF;AAEA,QAAM,QAAQ,SAAS;AACvB,MAAI,MAAM,QAAQ;AAChB;AAAA,EACF;AAEA,QAAM,SAAS;AACf,QAAM,qBAAqB,CAAC;AAC5B,QAAM,iBAAiB,CAAC;AAGxB,oBAAkB;AAGlB,MAAI;AACF,UAAM,aAAa,SAAS,cAAc;AAC1C,eAAW,QAAQ,YAAY;AAC7B,UAAI,KAAK,cAAc,WAAW;AAChC;AAAA,MACF;AACA,UAAI,uBAAuB,gBAAgB,IAAI,CAAC,GAAG;AACjD;AAAA,MACF;AACA,WAAK,MAAM;AACX,YAAM,iBAAiB,KAAK,IAAI;AAAA,IAClC;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,QAAM,SAAS,SAAS,iBAAiB,OAAO;AAChD,SAAO,QAAQ,CAAC,UAAU;AACxB,QAAI,CAAC,MAAM,QAAQ;AACjB,YAAM,MAAM;AACZ,YAAM,QAAQ,YAAY;AAAA,IAC5B;AAAA,EACF,CAAC;AACH;AAEO,SAAS,WAAiB;AAC/B,MAAI,OAAO,aAAa,aAAa;AACnC;AAAA,EACF;AAEA,QAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,MAAM,QAAQ;AACjB;AAAA,EACF;AAEA,QAAM,SAAS;AAGf,QAAM,kBAAkB,MAAM;AAC9B,QAAM,qBAAqB,CAAC;AAC5B,aAAW,UAAU,iBAAiB;AACpC,UAAM,eAAe,MAAM;AACzB,YAAM,OAAO,SAAS;AAEtB,UAAI,KAAK,QAAQ;AACf,aAAK,mBAAmB,KAAK,MAAM;AACnC;AAAA,MACF;AACA,UAAI;AACF,eAAO;AAAA,MACT,SAAS,OAAO;AACd,gBAAQ,KAAK,GAAG,UAAU,oCAAoC,KAAK;AAAA,MACrE;AAAA,IACF,GAAG,CAAC;AAAA,EACN;AAGA,QAAM,gBAAgB,MAAM;AAC5B,QAAM,iBAAiB,CAAC;AACxB,aAAW,UAAU,eAAe;AAClC,UAAM,QAAQ,CAAC,cAAsB;AACnC,YAAM,OAAO,SAAS;AACtB,UAAI,KAAK,QAAQ;AACf,aAAK,eAAe,KAAK,MAAM;AAC/B;AAAA,MACF;AACA,aAAO,SAAS;AAAA,IAClB,CAAC;AAAA,EACH;AAIA,aAAW,QAAQ,MAAM,kBAAkB;AACzC,QAAI;AACF,WAAK,KAAK;AAAA,IACZ,SAAS,OAAO;AACd,cAAQ,KAAK,GAAG,UAAU,8BAA8B,KAAK;AAAA,IAC/D;AAAA,EACF;AACA,QAAM,mBAAmB,CAAC;AAG1B,qBAAmB;AAGnB,QAAM,SAAS,SAAS,iBAAiB,OAAO;AAChD,SAAO,QAAQ,CAAC,UAAU;AACxB,QAAI,MAAM,QAAQ,cAAc,SAAS;AACvC,WAAK,MAAM,KAAK,EAAE,MAAM,MAAM;AAAA,MAE9B,CAAC;AACD,aAAO,MAAM,QAAQ;AAAA,IACvB;AAAA,EACF,CAAC;AACH;;;AJlJU,SAeI,OAAAC,MAfJ,QAAAC,aAAA;AA9KV,SAAS,oBAAoB,IAA8B;AACzD,MAAI,OAAO,MAAM;AACf;AAAA,EACF;AAEA,QAAM,OAAO,CAAC,UAAuB;AACnC,UAAM,yBAAyB;AAAA,EACjC;AAEA,WAAS,iBAAiB,WAAW,MAAM,IAAI;AAC/C,WAAS,iBAAiB,YAAY,MAAM,IAAI;AAEhD,MAAI;AACF,OAAG,MAAM;AAAA,EACX,UAAE;AACA,aAAS,oBAAoB,WAAW,MAAM,IAAI;AAClD,aAAS,oBAAoB,YAAY,MAAM,IAAI;AAAA,EACrD;AACF;AAGA,SAAS,gBAAgB,MAAsB;AAC7C,SAAO,KAAK,QAAQ,YAAY,KAAK,EAAE,YAAY;AACrD;AAEO,IAAM,qBAAqB,WAGhC,SAASC,oBAAmB,OAAO,KAAK;AACxC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,eAAe;AAAA,IACf,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ;AAAA,EACF,IAAI;AAEJ,QAAM,CAAC,MAAM,OAAO,IAAI,SAAiB,YAAY;AACrD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAkB,KAAK;AACzD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA0B,SAAS;AAC7D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAkB,KAAK;AACzD,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAkB,KAAK;AAEvE,QAAM,cAAc,OAA4B,IAAI;AACpD,QAAM,WAAW,OAAuB,IAAI;AAC5C,QAAM,iBAAiB,OAA2B,IAAI;AACtD,QAAM,gBAAgB,OAA2B,IAAI;AAErD,QAAM,oBACJ,mBAAmB,UAAa,OAAO,KAAK,cAAc,EAAE,SAAS;AAGvE,YAAU,MAAM;AACd,QAAI,aAAa,UAAU,QAAQ;AACjC,eAAS,MAAM;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,WAAW,KAAK,CAAC;AAGrB,YAAU,MAAM;AACd,uBAAmB,MAAM,SAAS,OAAO,GAAG,CAAC;AAE7C,UAAM,aAAa,mBAAmB,MAAM,SAAS,SAAS,GAAG,GAAG;AAEpE,UAAM,aAAa,mBAAmB,MAAM;AAC1C,YAAM,QAAQ,YAAY;AAC1B,0BAAoB,KAAK;AACzB,UAAI,OAAO;AACT,cAAM,QAAQ,MAAM,MAAM;AAC1B,cAAM,iBAAiB;AACvB,cAAM,eAAe;AACrB,cAAM,YAAY,MAAM;AAAA,MAC1B;AAAA,IACF,GAAG,EAAE;AAEL,WAAO,MAAM;AACX,mBAAa,UAAU;AACvB,mBAAa,UAAU;AACvB,UAAI,eAAe,YAAY,MAAM;AACnC,qBAAa,eAAe,OAAO;AAAA,MACrC;AACA,UAAI,cAAc,YAAY,MAAM;AAClC,qBAAa,cAAc,OAAO;AAAA,MACpC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,YAAY,MAAM;AAC9B,QAAI,cAAc,YAAY,MAAM;AAClC,mBAAa,cAAc,OAAO;AAAA,IACpC;AACA,iBAAa,IAAI;AACjB,kBAAc,UAAU,mBAAmB,MAAM;AAC/C,mBAAa,KAAK;AAClB,0BAAoB,YAAY,OAAO;AAAA,IACzC,GAAG,GAAG;AAAA,EACR,GAAG,CAAC,CAAC;AAEL,sBAAoB,KAAK,OAAO,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC;AAEnD,QAAM,eAAe,YAAY,MAAM;AACrC,aAAS,MAAM;AACf,mBAAe,UAAU,mBAAmB,MAAM,SAAS,GAAG,GAAG;AAAA,EACnE,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,eAAe,YAAY,MAAM;AACrC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,aAAS,OAAO;AAAA,EAClB,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,QAAM,gBAAgB;AAAA,IACpB,CAAC,UAAoD;AACnD,YAAM,gBAAgB;AAEtB,UAAI,MAAM,YAAY,aAAa;AACjC;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,WAAW,CAAC,MAAM,UAAU;AAC5C,cAAM,eAAe;AACrB,qBAAa;AACb;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,UAAU;AAC1B,qBAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,CAAC,cAAc,YAAY;AAAA,EAC7B;AAEA,QAAM,qBAAqB,YAAY,MAAM;AAC3C,UAAM,cAAc;AACpB,wBAAoB,CAAC,WAAW;AAChC,QAAI,aAAa;AACf,yBAAmB,MAAM,oBAAoB,YAAY,OAAO,GAAG,CAAC;AAAA,IACtE;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,QAAM,iBAAiB;AAAA,IACrB,sBAAO;AAAA,IACP,YAAY,sBAAO,QAAQ;AAAA,IAC3B,UAAU,UAAU,sBAAO,QAAQ;AAAA,IACnC,UAAU,YAAY,sBAAO,UAAU;AAAA,IACvC,UAAU,SAAS,sBAAO,OAAO;AAAA,IACjC,YAAY,sBAAO,QAAQ;AAAA,EAC7B,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,UAAU,QAAQ,KAAK,KAAK,CAAC;AAEnC,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW;AAAA,MACX,yBAAqB;AAAA,MACrB;AAAA,MACA,SAAS,CAAC,UAAU,MAAM,gBAAgB;AAAA,MAE1C;AAAA,wBAAAA,MAAC,SAAI,WAAW,sBAAO,QACpB;AAAA,8BACC,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,sBAAO;AAAA,cAClB,SAAS;AAAA,cAET;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,GAAG,sBAAO,OAAO,IAC1B,mBAAmB,sBAAO,WAAW,EACvC;AAAA,oBACA,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,OAAM;AAAA,oBAEN,0BAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,GAAE;AAAA,wBACF,QAAO;AAAA,wBACP,aAAY;AAAA,wBACZ,eAAc;AAAA,wBACd,gBAAe;AAAA;AAAA,oBACjB;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAA,KAAC,UAAK,WAAW,sBAAO,SAAU,mBAAQ;AAAA;AAAA;AAAA,UAC5C,IAEA,gBAAAA,KAAC,UAAK,WAAW,sBAAO,SAAU,mBAAQ;AAAA,UAE3C,YACC,gBAAAA,KAAC,UAAK,WAAW,sBAAO,WAAY,qBAAU,IAC5C;AAAA,WACN;AAAA,QAEC,oBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,GAAG,sBAAO,aAAa,IAChC,mBAAmB,sBAAO,WAAW,EACvC;AAAA,YAEA,0BAAAA,KAAC,SAAI,WAAW,sBAAO,aACrB,0BAAAA,KAAC,SAAI,WAAW,sBAAO,aACpB,iBAAO,QAAQ,cAAc,EAAE,IAAI,CAAC,CAAC,UAAU,KAAK,MACnD,gBAAAC,MAAC,SAAmB,WAAW,sBAAO,WACpC;AAAA,8BAAAD,KAAC,UAAK,WAAW,sBAAO,eACrB,0BAAgB,QAAQ,GAC3B;AAAA,cACC;AAAA,cACD,gBAAAA,KAAC,UAAK,WAAW,sBAAO,YAAa,iBAAM;AAAA,cAC1C;AAAA,iBANO,QAOV,CACD,GACH,GACF;AAAA;AAAA,QACF,IACE;AAAA,QAEH,eACC,gBAAAC,MAAC,SAAI,WAAW,sBAAO,OAAO;AAAA;AAAA,UACpB,aAAa,MAAM,GAAG,EAAE;AAAA,UAC/B,aAAa,SAAS,KAAK,QAAQ;AAAA,UAAG;AAAA,WACzC,IACE;AAAA,QAEJ,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,WAAW,sBAAO;AAAA,YAClB,OAAO,EAAE,aAAa,YAAY,cAAc,OAAU;AAAA,YAC1D;AAAA,YACA,OAAO;AAAA,YACP,UAAU,CAAC,UAAU,QAAQ,MAAM,OAAO,KAAK;AAAA,YAC/C,SAAS,MAAM,aAAa,IAAI;AAAA,YAChC,QAAQ,MAAM,aAAa,KAAK;AAAA,YAChC,MAAM;AAAA,YACN,WAAW;AAAA;AAAA,QACb;AAAA,QAEA,gBAAAC,MAAC,SAAI,WAAW,sBAAO,SACpB;AAAA,qBACC,gBAAAD,KAAC,SAAI,WAAW,sBAAO,eACrB,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,sBAAO;AAAA,cAClB,SAAS;AAAA,cACT,MAAK;AAAA,cAEL,0BAAAA,KAAC,aAAU,MAAM,IAAI;AAAA;AAAA,UACvB,GACF,IACE;AAAA,UACJ,gBAAAA,KAAC,YAAO,WAAW,sBAAO,QAAQ,SAAS,cAAc,oBAEzD;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,sBAAO;AAAA,cAClB,OAAO,EAAE,iBAAiB,aAAa,SAAS,UAAU,IAAI,IAAI;AAAA,cAClE,SAAS;AAAA,cACT,UAAU,CAAC;AAAA,cAEV;AAAA;AAAA,UACH;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;;;AK7UD,IAAM,cAAc;AAGpB,IAAM,uBAAuB,oBAAI,IAAY;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,gBAAgB,oBAAI,IAAY;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,sBAAsB,oBAAI,IAAY,CAAC,SAAS,YAAY,QAAQ,CAAC;AAE3E,IAAM,iBAAiB,oBAAI,IAAY,CAAC,OAAO,SAAS,UAAU,KAAK,CAAC;AAExE,IAAM,qBAAqB,oBAAI,IAAY;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,oBAAoB,oBAAI,IAAY;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOD,SAAS,iBAAiB,SAAkC;AAC1D,MAAI,QAAQ,eAAe;AACzB,WAAO,QAAQ;AAAA,EACjB;AACA,QAAM,OAAO,QAAQ,YAAY;AACjC,MAAI,gBAAgB,YAAY;AAC9B,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAEA,SAAS,aAAa,MAAsB;AAC1C,SAAO,KAAK,QAAQ,YAAY,KAAK,EAAE,YAAY;AACrD;AAEA,SAAS,MAAM,SAA0B;AACvC,SAAO,QAAQ,QAAQ,YAAY;AACrC;AAGA,SAAS,gBAAgB,SAA0B;AACjD,QAAM,MAAO,QAAoC;AACjD,SAAO,OAAO,QAAQ,WAAW,MAAM;AACzC;AAEO,SAAS,sBACd,SACA,UACgB;AAChB,MAAI,UAA0B;AAC9B,SAAO,SAAS;AACd,QAAI,QAAQ,QAAQ,QAAQ,GAAG;AAC7B,aAAO;AAAA,IACT;AACA,cAAU,iBAAiB,OAAO;AAAA,EACpC;AACA,SAAO;AACT;AAEO,SAAS,cAAc,SAA2B;AACvD,SAAO,QAAQ,YAAY,aAAa;AAC1C;AAEO,SAAS,cAAc,SAAkC;AAC9D,QAAM,OAAO,QAAQ,YAAY;AACjC,SAAO,gBAAgB,aAAa,KAAK,OAAO;AAClD;AAEO,SAAS,eAAe,QAAqB,WAAW,GAAW;AACxE,QAAM,QAAkB,CAAC;AACzB,MAAI,UAA0B;AAC9B,MAAI,QAAQ;AAEZ,SAAO,WAAW,QAAQ,UAAU;AAClC,UAAM,MAAM,MAAM,OAAO;AACzB,QAAI,QAAQ,UAAU,QAAQ,QAAQ;AACpC;AAAA,IACF;AAEA,QAAI;AACJ,UAAM,KAAK,QAAQ;AACnB,UAAM,UAAU,gBAAgB,OAAO;AAEvC,QAAI,IAAI;AACN,mBAAa,IAAI,EAAE;AAAA,IACrB,WAAW,SAAS;AAClB,YAAM,SAAS,QACZ,MAAM,KAAK,EACX;AAAA,QACC,CAAC,QACC,IAAI,SAAS,KACb,CAAC,eAAe,KAAK,GAAG,KACxB,CAAC,eAAe,KAAK,GAAG;AAAA,MAC5B;AACF,mBAAa,SAAS,IAAI,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK;AAAA,IACrD,OAAO;AACL,mBAAa;AAAA,IACf;AAEA,QAAI,CAAC,QAAQ,iBAAiB,iBAAiB,OAAO,GAAG;AACvD,mBAAa,GAAG,WAAW,GAAG,UAAU;AAAA,IAC1C;AAEA,UAAM,QAAQ,UAAU;AACxB,cAAU,iBAAiB,OAAO;AAClC,aAAS;AAAA,EACX;AAEA,SAAO,MAAM,KAAK,KAAK;AACzB;AAEO,SAAS,gBAAgB,QAG9B;AACA,QAAM,OAAO,eAAe,MAAM;AAClC,QAAM,MAAM,MAAM,MAAM;AAExB,QAAM,QAAQ,MAAc;AAE1B,QAAI,OAAO,QAAQ,SAAS;AAC1B,aAAO,OAAO,QAAQ;AAAA,IACxB;AAGA,QACE,QAAQ,UACR,QAAQ,YACR,QAAQ,UACR,QAAQ,UACR,QAAQ,KACR;AACA,YAAM,MAAM,sBAAsB,QAAQ,KAAK;AAC/C,UAAI,KAAK;AACP,cAAM,YAAY,iBAAiB,GAAG;AACtC,YAAI,qBAAqB,aAAa;AACpC,iBAAO,cAAc,gBAAgB,SAAS,EAAE,IAAI;AAAA,QACtD;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,OAAO;AACjB,YAAM,SAAS,iBAAiB,MAAM;AACtC,UAAI,UAAU,MAAM,MAAM,MAAM,UAAU;AACxC,cAAM,UAAU,OAAO,aAAa,KAAK,KAAK;AAC9C,eAAO,UAAU,YAAY,OAAO,aAAa;AAAA,MACnD;AACA,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,UAAU;AACpB,YAAM,YAAY,OAAO,aAAa,YAAY;AAClD,UAAI,WAAW;AACb,eAAO,WAAW,SAAS;AAAA,MAC7B;AACA,YAAM,OAAO,OAAO,aAAa,KAAK,KAAK;AAC3C,aAAO,OAAO,WAAW,KAAK,MAAM,GAAG,EAAE,CAAC,MAAM;AAAA,IAClD;AAGA,QAAI,QAAQ,KAAK;AACf,YAAM,OAAO,OAAO,aAAa,KAAK,KAAK;AAC3C,UAAI,MAAM;AACR,eAAO,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,MACnC;AACA,YAAM,OAAO,OAAO,aAAa,MAAM;AACvC,UAAI,MAAM;AACR,eAAO,WAAW,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,MACrC;AACA,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,SAAS;AACnB,YAAM,OAAO,OAAO,aAAa,MAAM,KAAK;AAC5C,YAAM,cAAc,OAAO,aAAa,aAAa;AACrD,UAAI,aAAa;AACf,eAAO,UAAU,WAAW;AAAA,MAC9B;AACA,YAAM,WAAW,OAAO,aAAa,MAAM;AAC3C,UAAI,UAAU;AACZ,eAAO,UAAU,QAAQ;AAAA,MAC3B;AACA,aAAO,GAAG,IAAI;AAAA,IAChB;AAGA,QAAI,WAAW,KAAK,GAAG,GAAG;AACxB,YAAM,OAAO,OAAO,aAAa,KAAK,KAAK;AAC3C,aAAO,OAAO,GAAG,GAAG,KAAK,KAAK,MAAM,GAAG,EAAE,CAAC,MAAM;AAAA,IAClD;AAGA,QAAI,QAAQ,KAAK;AACf,YAAM,OAAO,OAAO,aAAa,KAAK,KAAK;AAC3C,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,MACT;AACA,YAAM,WAAW,KAAK,SAAS,KAAK,QAAQ;AAC5C,aAAO,eAAe,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,QAAQ;AAAA,IACpD;AAGA,QAAI,QAAQ,UAAU,QAAQ,SAAS;AACrC,YAAM,OAAO,OAAO,aAAa,KAAK,KAAK;AAC3C,aAAO,KAAK,SAAS,MAAM,OAAO,IAAI,IAAI,MAAM;AAAA,IAClD;AAGA,QAAI,QAAQ,MAAM;AAChB,YAAM,OAAO,OAAO,aAAa,KAAK,KAAK;AAC3C,aAAO,KAAK,SAAS,MAAM,OACvB,eAAe,KAAK,MAAM,GAAG,EAAE,CAAC,MAChC;AAAA,IACN;AAGA,QAAI,QAAQ,cAAc;AACxB,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,QAAQ;AAClB,YAAM,OAAO,OAAO,aAAa,KAAK,KAAK;AAC3C,aAAO,KAAK,SAAS,MAAM,OAAO,WAAW,IAAI,OAAO;AAAA,IAC1D;AAGA,QAAI,QAAQ,OAAO;AACjB,aAAO;AAAA,IACT;AAGA,QAAI,QAAQ,OAAO;AACjB,YAAM,MAAM,OAAO,aAAa,KAAK;AACrC,aAAO,MAAM,UAAU,IAAI,MAAM,GAAG,EAAE,CAAC,MAAM;AAAA,IAC/C;AAGA,QAAI,QAAQ,SAAS;AACnB,aAAO;AAAA,IACT;AAGA,QAAI,kBAAkB,IAAI,GAAG,GAAG;AAC9B,YAAM,YAAY,OAAO,aAAa,YAAY;AAClD,UAAI,WAAW;AACb,eAAO,GAAG,GAAG,KAAK,SAAS;AAAA,MAC7B;AACA,YAAM,OAAO,OAAO,aAAa,MAAM;AACvC,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AACA,YAAM,UAAU,gBAAgB,MAAM;AACtC,UAAI,SAAS;AACX,cAAM,UAAU,QACb,MAAM,SAAS,EACf,IAAI,CAAC,UAAU,MAAM,QAAQ,mBAAmB,EAAE,CAAC,EACnD,OAAO,CAAC,UAAU,MAAM,SAAS,KAAK,CAAC,eAAe,KAAK,KAAK,CAAC,EACjE,MAAM,GAAG,CAAC,EACV,KAAK,GAAG;AACX,YAAI,SAAS;AACX,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO,QAAQ,QAAQ,cAAc;AAAA,IACvC;AAGA,WAAO;AAAA,EACT,GAAG;AAEH,SAAO,EAAE,MAAM,KAAK;AACtB;AAEO,SAAS,cAAc,SAA8B;AAC1D,QAAM,QAAkB,CAAC;AAEzB,QAAM,UAAU,QAAQ,aAAa,KAAK,KAAK;AAC/C,MAAI,WAAW,QAAQ,SAAS,KAAK;AACnC,UAAM,KAAK,OAAO;AAAA,EACpB;AAEA,QAAM,OAAO,QAAQ;AACrB,MAAI,MAAM;AACR,UAAM,WAAW,KAAK,aAAa,KAAK,KAAK;AAC7C,QAAI,YAAY,SAAS,SAAS,IAAI;AACpC,YAAM,QAAQ,aAAa,SAAS,MAAM,GAAG,EAAE,CAAC,IAAI;AAAA,IACtD;AAAA,EACF;AAEA,QAAM,OAAO,QAAQ;AACrB,MAAI,MAAM;AACR,UAAM,WAAW,KAAK,aAAa,KAAK,KAAK;AAC7C,QAAI,YAAY,SAAS,SAAS,IAAI;AACpC,YAAM,KAAK,YAAY,SAAS,MAAM,GAAG,EAAE,CAAC,IAAI;AAAA,IAClD;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,GAAG;AACvB;AAEO,SAAS,yBAAyB,QAA6B;AACpE,MAAI,OAAO,QAAQ,SAAS;AAC1B,WAAO,OAAO,QAAQ;AAAA,EACxB;AAEA,QAAM,MAAM,MAAM,MAAM;AAExB,QAAM,SAAiC;AAAA,IACrC,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,GAAG;AAAA,IACH,KAAK;AAAA,EACP;AACA,MAAI,OAAO,GAAG,GAAG;AACf,WAAO,OAAO,GAAG;AAAA,EACnB;AAEA,MAAI,QAAQ,UAAU;AACpB,UAAM,OAAO,OAAO,aAAa,KAAK,KAAK;AAC3C,WAAO,OAAO,WAAW,IAAI,MAAM;AAAA,EACrC;AAEA,MAAI,QAAQ,SAAS;AACnB,UAAM,OAAO,OAAO,aAAa,MAAM,KAAK;AAC5C,WAAO,UAAU,IAAI;AAAA,EACvB;AAEA,MAAI,QAAQ,UAAU,QAAQ,OAAO,QAAQ,SAAS;AACpD,UAAM,OAAO,OAAO,aAAa,KAAK,KAAK;AAC3C,WAAO,KAAK,SAAS,MAAM,OAAO,IAAI,IAAI,MAAM;AAAA,EAClD;AAEA,MAAI,QAAQ,OAAO;AACjB,UAAM,UAAU,gBAAgB,MAAM;AACtC,QAAI,SAAS;AACX,YAAM,UAAU,QACb,MAAM,SAAS,EACf,IAAI,CAAC,UAAU,MAAM,QAAQ,mBAAmB,EAAE,CAAC,EACnD,OAAO,CAAC,UAAU,MAAM,SAAS,KAAK,CAAC,eAAe,KAAK,KAAK,CAAC,EACjE,MAAM,GAAG,CAAC,EACV,KAAK,GAAG;AACX,UAAI,SAAS;AACX,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,kBAAkB,SAA8B;AAC9D,QAAM,SAAS,iBAAiB,OAAO;AACvC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,cACJ,QAAQ,YAAY,aAAa,cAAc,QAAQ,gBACnD,MAAM,KAAK,QAAQ,cAAc,QAAQ,IACzC,MAAM,KAAK,OAAO,QAAQ;AAEhC,QAAM,WAAW,YAAY;AAAA,IAC3B,CAAC,UACC,UAAU,WAAW,iBAAiB;AAAA,EAC1C;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,CAAC,QACjB,IACG,MAAM,KAAK,EACX,IAAI,CAAC,UAAU,MAAM,QAAQ,yBAAyB,EAAE,CAAC,EACzD,KAAK,CAAC,UAAU,MAAM,SAAS,KAAK,CAAC,eAAe,KAAK,KAAK,CAAC;AAEpE,QAAM,aAAa,SAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY;AACvD,UAAM,OAAO,MAAM,OAAO;AAC1B,QAAI,KAAK;AACT,UAAM,UAAU,gBAAgB,OAAO;AACvC,QAAI,SAAS;AACX,YAAM,MAAM,UAAU,OAAO;AAC7B,UAAI,KAAK;AACP,aAAK,GAAG,IAAI,IAAI,GAAG;AAAA,MACrB;AAAA,IACF;AACA,QAAI,SAAS,YAAY,SAAS,KAAK;AACrC,YAAM,QAAQ,QAAQ,aAAa,KAAK,KAAK,IAAI,MAAM,GAAG,EAAE;AAC5D,UAAI,MAAM;AACR,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,YAAY,MAAM,MAAM;AAC9B,MAAI,WAAW;AACf,QAAM,gBAAgB,gBAAgB,MAAM;AAC5C,MAAI,eAAe;AACjB,UAAM,MAAM,UAAU,aAAa;AACnC,QAAI,KAAK;AACP,iBAAW,GAAG,SAAS,IAAI,GAAG;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,QAAQ,OAAO,SAAS;AAC9B,MAAI,SAAS;AACb,MAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,aAAS,KAAK,KAAK,aAAa,QAAQ;AAAA,EAC1C;AAEA,SAAO,WAAW,KAAK,IAAI,IAAI;AACjC;AAEO,SAAS,kBAAkB,QAA6B;AAC7D,QAAM,MAAO,OAAmC;AAChD,MAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,GAAG;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,UAAoB,CAAC;AAE3B,aAAW,OAAO,IAAI,MAAM,KAAK,GAAG;AAClC,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AACA,UAAM,QAAQ,IAAI;AAAA,MAChB;AAAA,IACF;AACA,UAAM,OAAO,QAAQ,MAAM,CAAC,IAAI;AAChC,QAAI,CAAC,KAAK,IAAI,IAAI,GAAG;AACnB,WAAK,IAAI,IAAI;AACb,cAAQ,KAAK,IAAI;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK,IAAI;AAC1B;AAkDO,SAAS,0BACd,QACwB;AACxB,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,MAAM,MAAM,MAAM;AACxB,MAAI;AAEJ,MAAI,cAAc,IAAI,GAAG,GAAG;AAC1B,iBAAa,CAAC,SAAS,YAAY,cAAc,cAAc,YAAY;AAAA,EAC7E,WACE,QAAQ,YACP,QAAQ,OAAO,OAAO,aAAa,MAAM,MAAM,UAChD;AACA,iBAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,oBAAoB,IAAI,GAAG,GAAG;AACvC,iBAAa;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,eAAe,IAAI,GAAG,GAAG;AAClC,iBAAa,CAAC,SAAS,UAAU,aAAa,cAAc;AAAA,EAC9D,WAAW,mBAAmB,IAAI,GAAG,GAAG;AACtC,iBAAa,CAAC,WAAW,WAAW,UAAU,OAAO,iBAAiB;AAAA,EACxE,OAAO;AACL,iBAAa,CAAC,SAAS,YAAY,UAAU,WAAW,iBAAiB;AAAA,EAC3E;AAEA,QAAM,SAAS,OAAO,iBAAiB,MAAM;AAC7C,QAAM,SAAiC,CAAC;AAExC,aAAW,QAAQ,YAAY;AAC7B,UAAM,QAAQ,OAAO,iBAAiB,aAAa,IAAI,CAAC;AACxD,QAAI,SAAS,CAAC,qBAAqB,IAAI,KAAK,GAAG;AAC7C,aAAO,IAAI,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,0BAA0B,QAA6B;AACrE,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,iBAAiB,MAAM;AAC7C,QAAM,QAAkB,CAAC;AAEzB,aAAW,QAAQ,qBAAqB;AACtC,UAAM,QAAQ,aAAa,IAAI;AAC/B,UAAM,QAAQ,OAAO,iBAAiB,KAAK;AAC3C,QAAI,SAAS,CAAC,qBAAqB,IAAI,KAAK,GAAG;AAC7C,YAAM,KAAK,GAAG,KAAK,KAAK,KAAK,EAAE;AAAA,IACjC;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AA6BO,SAAS,qBAAqB,QAA6B;AAChE,QAAM,QAAkB,CAAC;AAEzB,QAAM,OAAO,OAAO,aAAa,MAAM;AACvC,MAAI,MAAM;AACR,UAAM,KAAK,SAAS,IAAI,GAAG;AAAA,EAC7B;AACA,QAAM,YAAY,OAAO,aAAa,YAAY;AAClD,MAAI,WAAW;AACb,UAAM,KAAK,eAAe,SAAS,GAAG;AAAA,EACxC;AACA,QAAM,kBAAkB,OAAO,aAAa,kBAAkB;AAC9D,MAAI,iBAAiB;AACnB,UAAM,KAAK,qBAAqB,eAAe,GAAG;AAAA,EACpD;AACA,QAAM,WAAW,OAAO,aAAa,UAAU;AAC/C,MAAI,aAAa,MAAM;AACrB,UAAM,KAAK,YAAY,QAAQ,EAAE;AAAA,EACnC;AACA,MAAI,OAAO,aAAa,aAAa,MAAM,QAAQ;AACjD,UAAM,KAAK,aAAa;AAAA,EAC1B;AAEA,MAAI,OAAO,QAAQ,gDAAgD,GAAG;AACpE,UAAM,KAAK,WAAW;AAAA,EACxB;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,mBAAmB,QAA6B;AAC9D,QAAM,QAAkB,CAAC;AACzB,MAAI,UAA0B;AAE9B,SAAO,SAAS;AACd,UAAM,MAAM,MAAM,OAAO;AACzB,QAAI,QAAQ,QAAQ;AAClB;AAAA,IACF;AAEA,QAAI;AACJ,UAAM,KAAK,QAAQ;AACnB,UAAM,UAAU,gBAAgB,OAAO;AAEvC,QAAI,IAAI;AACN,mBAAa,GAAG,GAAG,IAAI,EAAE;AAAA,IAC3B,WAAW,SAAS;AAClB,YAAM,MAAM,QACT,MAAM,KAAK,EACX,IAAI,CAAC,UAAU,MAAM,QAAQ,yBAAyB,EAAE,CAAC,EACzD,KAAK,CAAC,UAAU,MAAM,SAAS,CAAC;AACnC,mBAAa,MAAM,GAAG,GAAG,IAAI,GAAG,KAAK;AAAA,IACvC,OAAO;AACL,mBAAa;AAAA,IACf;AAEA,QAAI,CAAC,QAAQ,iBAAiB,iBAAiB,OAAO,GAAG;AACvD,mBAAa,GAAG,WAAW,GAAG,UAAU;AAAA,IAC1C;AAEA,UAAM,QAAQ,UAAU;AACxB,cAAU,iBAAiB,OAAO;AAAA,EACpC;AAEA,SAAO,MAAM,KAAK,KAAK;AACzB;;;AChvBA,IAAM,qBAAqB;AAG3B,IAAM,qBAAqB;AAG3B,IAAM,sBAAsB;AAG5B,IAAM,yBAAyB;AAO/B,SAAS,eAAwB;AAC/B,SAAO,OAAO,WAAW;AAC3B;AAGA,SAAS,kBAA0B;AACjC,QAAM,WAAW,KAAK,KAAK,KAAK;AAChC,SAAO,KAAK,IAAI,IAAI,yBAAyB;AAC/C;AAOA,SAAS,kBAAkB,OAAgB,QAAyB;AAClE,MAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,QAAS,MAAkC;AACjD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,QAAQ;AACjB;AAMA,SAAS,eAAkB,KAAkB;AAC3C,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,WAAO,CAAC;AAAA,EACV;AACA,QAAM,SAAS,gBAAgB;AAC/B,SAAO,OAAO,OAAO,CAAC,SAAS,kBAAkB,MAAM,MAAM,CAAC;AAChE;AAMO,SAAS,cAAc,UAA0B;AACtD,SAAO,qBAAqB;AAC9B;AAEO,SAAS,gBAAgC,UAAuB;AACrE,MAAI,aAAa,GAAG;AAClB,WAAO,CAAC;AAAA,EACV;AACA,MAAI;AACF,UAAM,MAAM,OAAO,aAAa,QAAQ,cAAc,QAAQ,CAAC;AAC/D,QAAI,QAAQ,MAAM;AAChB,aAAO,CAAC;AAAA,IACV;AACA,WAAO,eAAkB,GAAG;AAAA,EAC9B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,gBACd,UACA,aACM;AACN,MAAI,aAAa,GAAG;AAClB;AAAA,EACF;AACA,MAAI;AACF,WAAO,aAAa;AAAA,MAClB,cAAc,QAAQ;AAAA,MACtB,KAAK,UAAU,WAAW;AAAA,IAC5B;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AA+DO,SAAS,kBAAkB,QAAuB;AACvD,MAAI,aAAa,GAAG;AAClB;AAAA,EACF;AACA,MAAI;AACF,QAAI,QAAQ;AACV,aAAO,eAAe,QAAQ,oBAAoB,mBAAmB;AAAA,IACvE,OAAO;AACL,aAAO,eAAe,WAAW,kBAAkB;AAAA,IACrD;AAAA,EACF,QAAQ;AAAA,EAER;AACF;;;ACjJA,IAAM,YAAY;AAAA,EAChB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,wBAAwB;AAAA,EACxB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,0BAA0B;AAAA,EAC1B,oBAAoB;AAAA,EACpB,uBAAuB;AAAA;AAAA,EAEvB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,wBAAwB;AAAA,EACxB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,6BAA6B;AAAA,EAC7B,OAAO;AAAA,EACP,yBAAyB;AAAA,EACzB,mBAAmB;AACrB;AAgCO,IAAM,qBAAkC,oBAAI,IAAI;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,IAAM,wBAAkC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMA,IAAM,wBAAkC;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAWA,IAAM,aAGF;AAAA,EACF,aAAa;AAAA,EACb,eAAe,oBAAI,QAAyC;AAC9D;AAqBA,SAAS,cAAc,QAA+C;AACpE,QAAM,MAAM,UAAU,CAAC;AAEvB,MAAI;AACJ,MAAI,IAAI,cAAc,QAAW;AAC/B,UAAM,QAAQ,MAAM,QAAQ,IAAI,SAAS,IACrC,IAAI,YACJ,MAAM,KAAK,IAAI,SAAS;AAC5B,gBAAY,oBAAI,IAAY,CAAC,GAAG,oBAAoB,GAAG,KAAK,CAAC;AAAA,EAC/D,OAAO;AACL,gBAAY;AAAA,EACd;AAEA,QAAM,eACJ,IAAI,iBAAiB,SACjB,CAAC,GAAG,uBAAuB,GAAG,IAAI,YAAY,IAC9C;AAEN,QAAM,eACJ,IAAI,iBAAiB,SAAY,IAAI,eAAe;AAEtD,SAAO;AAAA,IACL,eAAe,IAAI,iBAAiB;AAAA,IACpC,UAAU,IAAI,YAAY;AAAA,IAC1B,MAAM,IAAI,QAAQ;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,IAAI;AAAA,EACd;AACF;AAMA,IAAM,qBAAqB,CAAC,iBAAiB,0BAA0B;AACvE,IAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF;AAGA,SAAS,cAAc,SAA2B;AAChD,aAAW,OAAO,OAAO,KAAK,OAAO,GAAG;AACtC,eAAW,UAAU,mBAAmB;AACtC,UAAI,IAAI,WAAW,MAAM,GAAG;AAC1B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAOA,SAAS,iBAAiB,SAAqC;AAC7D,aAAW,OAAO,OAAO,KAAK,OAAO,GAAG;AACtC,eAAW,UAAU,oBAAoB;AACvC,UAAI,IAAI,WAAW,MAAM,GAAG;AAC1B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAMA,IAAM,iBAAiB,CAAC,SAAS,QAAQ,WAAW,kBAAkB;AAE/D,SAAS,cAAuB;AACrC,MAAI,OAAO,aAAa,aAAa;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,gBAAgB,MAAM;AACnC,WAAO,WAAW;AAAA,EACpB;AAEA,QAAM,WAAW,aAAa;AAC9B,aAAW,cAAc;AACzB,SAAO;AACT;AAEA,SAAS,eAAwB;AAC/B,QAAM,OAAO,SAAS;AAGtB,MAAI,QAAQ,cAAc,IAAI,GAAG;AAC/B,WAAO;AAAA,EACT;AAGA,aAAW,YAAY,gBAAgB;AACrC,UAAM,YAAY,SAAS,cAAc,QAAQ;AACjD,QAAI,aAAa,cAAc,SAAS,GAAG;AACzC,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,MAAM;AACR,eAAW,SAAS,MAAM,KAAK,KAAK,QAAQ,GAAG;AAC7C,UAAI,cAAc,KAAK,GAAG;AACxB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAOA,SAAS,yBACP,MACe;AACf,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,aAAa;AACpB,WAAO,KAAK;AAAA,EACd;AACA,MAAI,KAAK,MAAM;AACb,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAMA,SAAS,0BAA0B,OAAkC;AACnE,QAAM,MAAM,MAAM;AAClB,QAAM,OAAO,MAAM;AACnB,QAAM,cAAc,MAAM;AAE1B,UAAQ,KAAK;AAAA;AAAA,IAEX,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AACb,aAAO;AAAA,IAET,KAAK,UAAU,YAAY;AACzB,UAAI,eAAe,YAAY,QAAQ;AACrC,cAAM,aAAa,yBAAyB,YAAY,MAAM;AAC9D,YAAI,YAAY;AACd,iBAAO;AAAA,QACT;AAAA,MACF;AACA,UAAI,eAAe,YAAY,aAAa;AAC1C,eAAO,YAAY;AAAA,MACrB;AACA,aAAO,yBAAyB,IAAI;AAAA,IACtC;AAAA,IAEA,KAAK,UAAU;AAAA,IACf,KAAK,UAAU,qBAAqB;AAClC,UAAI,eAAe,YAAY,MAAM;AACnC,cAAM,YAAY,yBAAyB,YAAY,IAAI;AAC3D,YAAI,WAAW;AACb,iBAAO;AAAA,QACT;AAAA,MACF;AACA,UAAI,eAAe,YAAY,aAAa;AAC1C,eAAO,YAAY;AAAA,MACrB;AACA,aAAO,yBAAyB,IAAI;AAAA,IACtC;AAAA,IAEA,KAAK,UAAU,iBAAiB;AAC9B,UAAI,QAAQ,OAAO,SAAS,YAAY,KAAK,UAAU,aAAa;AAClE,eAAO,GAAG,KAAK,SAAS,WAAW;AAAA,MACrC;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,UAAU,iBAAiB;AAC9B,UAAI,QAAQ,OAAO,SAAS,YAAY,KAAK,aAAa;AACxD,eAAO,GAAG,KAAK,WAAW;AAAA,MAC5B;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,UAAU,eAAe;AAC5B,UAAI,eAAe,YAAY,YAAY,KAAK,YAAY,SAAS;AACnE,eAAO,yBAAyB,YAAY,OAAO;AAAA,MACrD;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAEb,aAAO,yBAAyB,IAAI;AAAA,IAEtC,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AAAA,IACf,KAAK,UAAU;AACb,aAAO,yBAAyB,IAAI;AAAA,IAEtC;AACE,aAAO;AAAA,EACX;AACF;AAGA,SAAS,eAAe,MAAuB;AAC7C,MAAI,KAAK,UAAU,GAAG;AACpB,WAAO;AAAA,EACT;AACA,MAAI,KAAK,UAAU,KAAK,SAAS,KAAK,YAAY,GAAG;AACnD,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAOA,SAAS,uBAAuB,MAAsB;AACpD,SAAO,KACJ,QAAQ,mBAAmB,OAAO,EAClC,QAAQ,wBAAwB,OAAO,EACvC,YAAY;AACjB;AAMA,SAAS,mBAAmB,SAAsB,WAAW,IAAiB;AAC5E,QAAM,UAAU,oBAAI,IAAY;AAChC,MAAI,UAA8B;AAClC,MAAI,QAAQ;AAEZ,SAAO,WAAW,SAAS,UAAU;AACnC,UAAM,YAAY,QAAQ;AAC1B,QAAI,OAAO,cAAc,UAAU;AACjC,iBAAW,SAAS,UAAU,MAAM,KAAK,GAAG;AAC1C,YAAI,MAAM,SAAS,GAAG;AACpB,gBAAM,UAAU,MACb,QAAQ,yBAAyB,EAAE,EACnC,YAAY;AACf,cAAI,QAAQ,SAAS,GAAG;AACtB,oBAAQ,IAAI,OAAO;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,cAAU,QAAQ;AAClB;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,2BACP,eACA,YACS;AACT,QAAM,aAAa,uBAAuB,aAAa;AACvD,QAAM,iBAAiB,WAAW,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAEvE,aAAW,OAAO,YAAY;AAC5B,QAAI,QAAQ,YAAY;AACtB,aAAO;AAAA,IACT;AACA,UAAM,aAAa,IAAI,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC5D,eAAW,MAAM,gBAAgB;AAC/B,iBAAW,MAAM,YAAY;AAC3B,YAAI,OAAO,MAAM,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,EAAE,GAAG;AACnD,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,kBAAkB,MAAc,UAA6B;AACpE,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,KAAK,IAAI,GAAG;AACtB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,uBACP,MACA,OACA,QACA,YACS;AAET,MAAI,OAAO,QAAQ;AACjB,WAAO,OAAO,OAAO,MAAM,KAAK;AAAA,EAClC;AAEA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,IAET,KAAK,YAAY;AACf,UAAI,OAAO,UAAU,IAAI,IAAI,GAAG;AAC9B,eAAO;AAAA,MACT;AACA,UAAI,kBAAkB,MAAM,OAAO,YAAY,GAAG;AAChD,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,SAAS;AACZ,UAAI,OAAO,UAAU,IAAI,IAAI,GAAG;AAC9B,eAAO;AAAA,MACT;AACA,UAAI,kBAAkB,MAAM,OAAO,YAAY,GAAG;AAChD,eAAO;AAAA,MACT;AACA,UAAI,cAAc,2BAA2B,MAAM,UAAU,GAAG;AAC9D,eAAO;AAAA,MACT;AACA,UAAI,kBAAkB,MAAM,OAAO,YAAY,GAAG;AAChD,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAAA,IAEA;AACE,aAAO;AAAA,EACX;AACF;AAMA,SAAS,cAAkC;AACzC,SAAO,EAAE,MAAM,MAAM,YAAY,CAAC,EAAE;AACtC;AAEO,SAAS,sBACd,SACA,QACoB;AACpB,QAAM,WAAW,cAAc,MAAM;AACrC,QAAM,WAAW,SAAS,SAAS;AAEnC,MAAI,UAAU;AACZ,UAAM,SAAS,WAAW,cAAc,IAAI,OAAO;AACnD,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,WAAW,CAAC,WAAmD;AACnE,QAAI,UAAU;AACZ,iBAAW,cAAc,IAAI,SAAS,MAAM;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,YAAY,GAAG;AAClB,WAAO,SAAS,YAAY,CAAC;AAAA,EAC/B;AAGA,QAAM,aACJ,SAAS,SAAS,UAAU,mBAAmB,SAAS,EAAE,IAAI;AAEhE,QAAM,aAAuB,CAAC;AAE9B,MAAI;AACF,UAAM,WAAW,iBAAiB,OAAO;AACzC,QAAI,CAAC,UAAU;AACb,aAAO,SAAS,YAAY,CAAC;AAAA,IAC/B;AAEA,QAAI,QAAS,QACX,QACF;AAEA,QAAI,QAAQ;AACZ,WACE,UAAU,QACV,QAAQ,SAAS,YACjB,WAAW,SAAS,SAAS,eAC7B;AACA,YAAM,OAAO,0BAA0B,KAAK;AAC5C,UACE,QACA,CAAC,eAAe,IAAI,KACpB,uBAAuB,MAAM,OAAO,UAAU,UAAU,GACxD;AACA,mBAAW,KAAK,IAAI;AAAA,MACtB;AACA,cAAQ,MAAM;AACd;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO,SAAS,YAAY,CAAC;AAAA,EAC/B;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,SAAS,YAAY,CAAC;AAAA,EAC/B;AAGA,QAAM,OAAO,WACV,MAAM,EACN,QAAQ,EACR,IAAI,CAAC,SAAS,IAAI,IAAI,GAAG,EACzB,KAAK,GAAG;AAEX,SAAO,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC;;;AChpBA,OAAO,WAAW;AAmElB,IAAM,aAAa;AAAA,EACjB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,wBAAwB;AAAA,EACxB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,UAAU;AAAA,EACV,UAAU;AAAA,EACV,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,eAAe;AACjB;AAiFO,SAAS,oBAAoB,SAAyC;AAC3E,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,KAAK;AACX,QAAM,OAAO,OAAO,KAAK,EAAE;AAE3B,QAAM,WAAW,KAAK,KAAK,CAAC,MAAM,EAAE,WAAW,eAAe,CAAC;AAC/D,MAAI,UAAU;AACZ,WAAO,GAAG,QAAQ,KAAK;AAAA,EACzB;AAEA,QAAM,cAAc,KAAK;AAAA,IAAK,CAAC,MAC7B,EAAE,WAAW,0BAA0B;AAAA,EACzC;AACA,MAAI,aAAa;AACf,WAAO,GAAG,WAAW,KAAK;AAAA,EAC5B;AAEA,QAAM,WAAW,KAAK,KAAK,CAAC,MAAM;AAChC,QAAI,CAAC,EAAE,WAAW,SAAS,GAAG;AAC5B,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,GAAG,CAAC;AAClB,WACE,CAAC,CAAC,SACF,OAAO,UAAU,YACjB,OAAO,UAAU,eAAe,KAAK,OAAO,cAAc;AAAA,EAE9D,CAAC;AACD,MAAI,UAAU;AACZ,WAAO,GAAG,QAAQ,KAAK;AAAA,EACzB;AAEA,SAAO;AACT;AAMA,SAAS,iBAAiB,OAAkC;AAC1D,QAAM,EAAE,KAAK,IAAI;AACjB,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,UAAU;AAE5B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,aAAa;AACpB,WAAO,KAAK;AAAA,EACd;AACA,MAAI,KAAK,MAAM;AACb,WAAO,KAAK;AAAA,EACd;AACA,SAAO;AACT;AAOA,SAAS,gBAAgB,OAAmB,WAAW,IAAsB;AAC3E,MAAI,UAAyC;AAC7C,MAAI,QAAQ;AAEZ,SAAO,WAAW,QAAQ,UAAU;AAClC,QAAI,QAAQ,cAAc;AACxB,aAAO;AAAA,QACL,QAAQ,QAAQ;AAAA,QAChB,eAAe,iBAAiB,OAAO;AAAA,MACzC;AAAA,IACF;AACA,UAAM,QAAQ,QAAQ;AACtB,QAAI,SAAS,MAAM,cAAc;AAC/B,aAAO;AAAA,QACL,QAAQ,MAAM;AAAA,QACd,eAAe,iBAAiB,KAAK;AAAA,MACvC;AAAA,IACF;AACA,cAAU,QAAQ;AAClB,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,OAAqC;AACnE,QAAM,gBAAgB,CAAC,gBAAgB,YAAY,WAAW,aAAa;AAC3E,MAAI,UAAyC;AAC7C,MAAI,QAAQ;AACZ,QAAM,WAAW;AAEjB,SAAO,WAAW,QAAQ,UAAU;AAClC,UAAM,SAAS;AAEf,eAAW,OAAO,eAAe;AAC/B,YAAM,QAAQ,OAAO,GAAG;AACxB,UAAI,SAAS,OAAO,UAAU,YAAY,cAAc,OAAO;AAC7D,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,eAAe,iBAAiB,OAAO;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ;AACtB,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,YAAM,aAAa,MAAM;AAGzB,UACE,cACA,OAAO,eAAe,YACtB,WAAW,aAAa,UACxB,WAAW,eAAe,QAC1B;AACA,eAAO;AAAA,UACL,QAAQ;AAAA,YACN,UAAU,WAAW;AAAA,YACrB,YAAY,WAAW;AAAA,YACvB,cAAc,WAAW;AAAA,UAC3B;AAAA,UACA,eAAe,iBAAiB,OAAO;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,cAAU,QAAQ;AAClB,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAWA,IAAM,mBAAmB,oBAAI,IAAwC;AAErE,SAAS,oBAAoB,OAAuC;AAClE,QAAM,EAAE,MAAM,IAAI,IAAI;AAEtB,MAAI,OAAO,SAAS,YAAY,QAAQ,MAAM;AAC5C,WAAO;AAAA,EACT;AAGA,MACE,OAAO,SAAS,cACf,KAAwD,WACrD,kBACJ;AACA,WAAO;AAAA,EACT;AAEA,MACE,QAAQ,WAAW,qBACnB,QAAQ,WAAW,wBACnB;AACA,QAAI,OAAO,SAAS,YAAY;AAC9B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,YAAY;AACjC,UAAM,SAAU,MAAM,aAClB;AACJ,QAAI,OAAO,WAAW,YAAY;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MACE,QAAQ,WAAW,iBACnB,QAAQ,WAAW,qBACnB;AACA,UAAM,QAAS,MAAM,aAAgD;AACrE,QAAI,OAAO,UAAU,YAAY;AAC/B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,YAAY;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAOA,SAAS,qBAAwC;AAC/C,QAAM,IAAI;AAEV,QAAM,kBACJ,EAAE;AAGJ,MAAI,mBAAmB,OAAO,iBAAiB;AAC7C,WAAO;AAAA,MACL,KAAK,MAAM,gBAAgB;AAAA,MAC3B,KAAK,CAAC,UAAmB;AACvB,wBAAgB,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBACJ,EAAE;AAGJ,QAAM,oBAAoB,iBAAiB;AAC3C,MAAI,qBAAqB,aAAa,mBAAmB;AACvD,WAAO;AAAA,MACL,KAAK,MAAM,kBAAkB;AAAA,MAC7B,KAAK,CAAC,UAAmB;AACvB,0BAAkB,UAAU;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,yBAAmC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQA,SAAS,oBAAoB,OAAmC;AAC9D,QAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,QAAM,YAAY;AAClB,QAAM,eAAe;AAErB,aAAW,WAAW,OAAO;AAC3B,UAAM,UAAU,QAAQ,KAAK;AAC7B,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,QAAI,uBAAuB,KAAK,CAAC,OAAO,GAAG,KAAK,OAAO,CAAC,GAAG;AACzD;AAAA,IACF;AAEA,UAAM,KAAK,QAAQ,MAAM,SAAS;AAClC,QAAI,IAAI;AACN,aAAO;AAAA,QACL,UAAU,GAAG,CAAC;AAAA,QACd,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE;AAAA,QACxB,QAAQ,SAAS,GAAG,CAAC,GAAG,EAAE;AAAA,MAC5B;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,MAAM,YAAY;AACxC,QAAI,OAAO;AACT,aAAO;AAAA,QACL,UAAU,MAAM,CAAC;AAAA,QACjB,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE;AAAA,QAC3B,QAAQ,SAAS,MAAM,CAAC,GAAG,EAAE;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAAyB;AAChD,MAAI,OAAO;AAGX,SAAO,KAAK,QAAQ,WAAW,EAAE;AAGjC,SAAO,KAAK,QAAQ,kCAAkC,EAAE;AAGxD,SAAO,KAAK,QAAQ,gCAAgC,EAAE;AACtD,SAAO,KAAK,QAAQ,4BAA4B,EAAE;AAGlD,SAAO,KAAK,QAAQ,uBAAuB,EAAE;AAC7C,SAAO,KAAK,QAAQ,mBAAmB,EAAE;AAGzC,SAAO,KAAK,QAAQ,qBAAqB,EAAE;AAG3C,SAAO,KAAK,QAAQ,uBAAuB,EAAE;AAG7C,SAAO,KAAK,QAAQ,gBAAgB,GAAG;AAGvC,SAAO,KAAK,QAAQ,oBAAoB,EAAE;AAG1C,SAAO,KAAK,QAAQ,SAAS,EAAE;AAE/B,SAAO;AACT;AAEA,SAAS,qBAAqB,OAA0C;AACtE,QAAM,KAAK,oBAAoB,KAAK;AACpC,MAAI,CAAC,IAAI;AACP,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,IAAI,EAAE,GAAG;AAC5B,WAAO,iBAAiB,IAAI,EAAE,KAAK;AAAA,EACrC;AAEA,QAAM,aAAa,mBAAmB;AACtC,MAAI,CAAC,YAAY;AACf,qBAAiB,IAAI,IAAI,IAAI;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,WAAW,IAAI;AAChC,MAAI,SAAgC;AAIpC,QAAM,OAAO,IAAI;AAAA,IACf,CAAC;AAAA,IACD;AAAA,MACE,MAAM;AACJ,cAAM,IAAI,MAAM,OAAO;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,eAAW,IAAI,IAAI;AACnB,QAAI;AACF,MAAC,GAAmD,CAAC,CAAC;AAAA,IACxD,SAAS,GAAG;AACV,UACE,aAAa,SACb,EAAE,YAAY,WACd,OAAO,EAAE,UAAU,UACnB;AACA,cAAM,QAAQ,oBAAoB,EAAE,KAAK;AACzC,YAAI,OAAO;AACT,mBAAS;AAAA,YACP,UAAU,gBAAgB,MAAM,QAAQ;AAAA,YACxC,YAAY,MAAM;AAAA,YAClB,cAAc,MAAM;AAAA,YACpB,eAAe,iBAAiB,KAAK,KAAK;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,eAAW,IAAI,QAAQ;AAAA,EACzB;AAEA,mBAAiB,IAAI,IAAI,MAAM;AAC/B,SAAO;AACT;AAEA,SAAS,gBACP,OACA,WAAW,IACY;AACvB,MAAI,UAAyC;AAC7C,MAAI,QAAQ;AAEZ,SAAO,WAAW,QAAQ,UAAU;AAClC,UAAM,SAAS,qBAAqB,OAAO;AAC3C,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AACA,cAAU,QAAQ;AAClB,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAMO,SAAS,kBAAkB,SAA4C;AAC5E,QAAM,QAAQ,oBAAoB,OAAO;AACzC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB;AAAA,EACF;AAMA,MAAI,YAAY,gBAAgB,KAAK;AACrC,MAAI,CAAC,WAAW;AACd,gBAAY,uBAAuB,KAAK;AAAA,EAC1C;AAEA,MAAI,aAAa,UAAU,QAAQ;AACjC,UAAM,EAAE,OAAO,IAAI;AACnB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,QACN,UAAU,OAAO;AAAA,QACjB,YAAY,OAAO;AAAA,QACnB,cAAc,OAAO;AAAA,QACrB,eAAe,UAAU,iBAAiB;AAAA,MAC5C;AAAA,MACA,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,SAAS,gBAAgB,KAAK;AACpC,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,cAAc;AAAA,EAChB;AACF;AAMO,SAAS,qBACd,QACA,SAA4B,QACpB;AACR,MAAI,WAAW,GAAG,OAAO,QAAQ,IAAI,OAAO,UAAU;AACtD,MAAI,OAAO,iBAAiB,QAAW;AACrC,gBAAY,IAAI,OAAO,YAAY;AAAA,EACrC;AAEA,MAAI,WAAW,UAAU;AACvB,UAAM,SAAS,OAAO,SAAS,WAAW,GAAG,IAAI,KAAK;AACtD,WAAO,gBAAgB,MAAM,GAAG,QAAQ;AAAA,EAC1C;AAEA,SAAO;AACT;AAQO,SAAS,2BACd,SACA,eAAe,IACO;AACtB,MAAI,UAA8B;AAClC,MAAI,OAAO;AAEX,SAAO,WAAW,OAAO,cAAc;AACrC,UAAM,SAAS,kBAAkB,OAAO;AACxC,QAAI,OAAO,OAAO;AAChB,aAAO;AAAA,IACT;AACA,cAAU,QAAQ;AAClB,YAAQ;AAAA,EACV;AAIA,SAAO,kBAAkB,OAAO;AAClC;;;ACroBA,IAAM,wBAAwB;AAC9B,IAAM,uBAAuB;AAC7B,IAAM,qBAAqB;AAC3B,IAAM,cAAc;AAEpB,IAAM,iBAAiB;AAUvB,IAAI;AAQJ,IAAI;AAOJ,SAAS,gBAAiC;AACxC,MAAI,kBAAkB;AACpB,WAAO;AAAA,EACT;AACA,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAOA,eAAe,gBAAkD;AAC/D,MAAI,iBAAiB,QAAW;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,WAAW,cAAc;AAC/B,UAAM,SAAU,MAAM,SAAS,mBAAmB;AAClD,mBAAe,UAAU;AAAA,EAC3B,QAAQ;AACN,mBAAe;AAAA,EACjB;AAEA,SAAO;AACT;AAiCA,SAAS,iBACP,SACA,SACA,SACA,SACA,SACa;AACb,SAAO;AAAA,IACL,UAAU,KAAK,IAAI,GAAG,UAAU,OAAO;AAAA,IACvC,UAAU,KAAK,IAAI,GAAG,UAAU,OAAO;AAAA,IACvC,UAAU,UAAU,UAAU;AAAA,IAC9B,UAAU,UAAU,UAAU;AAAA,EAChC;AACF;AAMA,SAAS,kBAAkB,MAAmB,QAA4B;AACxE,QAAM,cAAc,KAAK,IAAI,KAAK,UAAU,KAAK,QAAQ;AACzD,QAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,WAAW;AAE9C,SAAO;AAAA,IACL;AAAA,IACA,MAAM,KAAK,MAAM,KAAK,WAAW,KAAK;AAAA,IACtC,MAAM,KAAK,MAAM,KAAK,WAAW,KAAK;AAAA,EACxC;AACF;AAcA,SAAS,oBACP,KACA,SACA,SACA,SACA,OACM;AACN,QAAM,UAAU,OAAO;AACvB,QAAM,YAAY,KAAK,IAAI,GAAG,MAAM,KAAK;AAEzC,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,OAAO,SAAS,GAAG;AAC5B;AAAA,IACF;AAEA,QAAI,KAAK;AACT,QAAI,cAAc,OAAO;AACzB,QAAI,YAAY;AAChB,QAAI,UAAU;AACd,QAAI,WAAW;AACf,QAAI,UAAU;AAEd,QAAI,QAAQ;AACZ,eAAW,SAAS,OAAO,QAAQ;AACjC,YAAM,YAAY,MAAM;AACxB,YAAM,YAAY,OAAO,QAAQ,MAAM,IAAI,MAAM,IAAI;AACrD,YAAM,WAAW,YAAY,WAAW;AACxC,YAAM,WAAW,YAAY,WAAW;AAExC,UAAI,OAAO;AACT,YAAI,OAAO,SAAS,OAAO;AAC3B,gBAAQ;AAAA,MACV,OAAO;AACL,YAAI,OAAO,SAAS,OAAO;AAAA,MAC7B;AAAA,IACF;AAEA,QAAI,OAAO;AACX,QAAI,QAAQ;AAAA,EACd;AACF;AAUA,SAAS,mBAAmB,IAA0B;AACpD,MAAI,OAAO,SAAS,mBAAmB,OAAO,SAAS,MAAM;AAC3D,WAAO;AAAA,EACT;AACA,MAAI,GAAG,YAAY,UAAU;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,GAAG,eAAe,qBAAqB,GAAG;AAC5C,WAAO;AAAA,EACT;AACA,MAAI,GAAG,UAAU,oBAAoB,GAAG;AACtC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAOA,SAAS,kBAAkB,MAAgC;AACzD,QAAM,EAAE,UAAU,UAAU,UAAU,SAAS,IAAI;AACnD,QAAM,UAAU,WAAW,WAAW;AACtC,QAAM,UAAU,WAAW,WAAW;AAEtC,QAAM,YAAY,WAAW,WAAW;AACxC,QAAM,WAAW,WAAW,WAAW;AACvC,QAAM,aAAa,WAAW,WAAW;AACzC,QAAM,cAAc,WAAW,WAAW;AAE1C,QAAM,UAAU,SAAS,kBAAkB,SAAS,OAAO;AAE3D,aAAW,aAAa,SAAS;AAC/B,QAAI,EAAE,qBAAqB,cAAc;AACvC;AAAA,IACF;AACA,QAAI,mBAAmB,SAAS,GAAG;AACjC;AAAA,IACF;AAEA,UAAM,SAAS,UAAU,sBAAsB;AAC/C,UAAM,eACJ,OAAO,QAAQ,aACf,OAAO,OAAO,YACd,OAAO,SAAS,cAChB,OAAO,UAAU;AAEnB,QAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,SAAS;AAClB;AAYA,SAAS,iBAA+B;AACtC,QAAM,UAAU,SAAS,cAA2B,oBAAoB;AACxE,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,SAAS,MAAM,oBAAoB,KAAK;AAAA,EACnD;AAEA,QAAM,qBAAqB,QAAQ,MAAM;AACzC,UAAQ,MAAM,aAAa;AAC3B,SAAO,EAAE,SAAS,mBAAmB;AACvC;AAGA,SAAS,kBAAkB,QAA4B;AACrD,MAAI,CAAC,OAAO,SAAS;AACnB;AAAA,EACF;AACA,SAAO,QAAQ,MAAM,aAAa,OAAO,sBAAsB;AACjE;AAsBA,eAAsB,iBACpB,SACA,SACA,SACA,SACA,SAKA,UAAU,IACV,UAAU,MACc;AACxB,QAAM,aAAa,MAAM,cAAc;AACvC,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,iBAAiB,SAAS,SAAS,SAAS,SAAS,OAAO;AACzE,QAAM,EAAE,MAAM,MAAM,MAAM,IAAI,kBAAkB,MAAM,WAAW;AACjE,MAAI,OAAO,KAAK,OAAO,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,SAAS,eAAe;AAE9B,MAAI;AACF,UAAM,SAAS,kBAAkB,IAAI;AACrC,UAAM,aAAa,OAAO,sBAAsB;AAEhD,UAAM,eAAe,MAAM,WAAW,YAAY,QAAQ;AAAA,MACxD,iBAAiB;AAAA,MACjB,SAAS;AAAA,IACX,CAAC;AAED,UAAM,SACJ,aAAa,SAAS,OAAO,eAAe,WAAW;AACzD,UAAM,SACJ,aAAa,UAAU,OAAO,gBAAgB,WAAW;AAE3D,UAAM,SAAS,WAAW,SAAS;AACnC,UAAM,aAAa,SAAS,OAAO,UAAU,OAAO;AACpD,UAAM,YAAY,SAAS,OAAO,UAAU,OAAO;AAEnD,UAAM,SAAS,KAAK,WAAW,WAAW,OAAO,cAAc;AAC/D,UAAM,SAAS,KAAK,WAAW,WAAW,MAAM,aAAa;AAC7D,UAAM,QAAQ,KAAK,WAAW;AAC9B,UAAM,QAAQ,KAAK,WAAW;AAE9B,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ;AACf,WAAO,SAAS;AAEhB,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AAGA,QAAI,YAAY;AAChB,QAAI,SAAS,GAAG,GAAG,MAAM,IAAI;AAE7B,QAAI;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,wBAAoB,KAAK,SAAS,KAAK,UAAU,KAAK,UAAU,KAAK;AAErE,WAAO,OAAO,UAAU,cAAc,OAAO;AAAA,EAC/C,SAAS,OAAO;AACd,YAAQ,KAAK,wCAAwC,KAAK;AAC1D,WAAO;AAAA,EACT,UAAE;AACA,sBAAkB,MAAM;AAAA,EAC1B;AACF;;;ACtYO,IAAM,wBAAuE;AAAA,EAClF,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,YAAY,OAAO,WAAW;AAAA,EACvC,EAAE,OAAO,YAAY,OAAO,WAAW;AAAA,EACvC,EAAE,OAAO,YAAY,OAAO,WAAW;AACzC;AAGA,IAAM,QAAQ;AAGd,SAAS,YAAqB;AAC5B,SAAO,OAAO,WAAW;AAC3B;AAGA,SAAS,kBAA0B;AACjC,MAAI,UAAU,GAAG;AACf,WAAO,GAAG,OAAO,UAAU,GAAG,KAAK,GAAG,OAAO,WAAW;AAAA,EAC1D;AACA,SAAO;AACT;AAMA,SAAS,UAAU,OAAiB,OAAe,OAAsB;AACvE,MAAI,OAAO;AACT,UAAM,KAAK,KAAK,KAAK,OAAO,KAAK;AAAA,CAAI;AAAA,EACvC;AACF;AAGA,SAAS,kBAAkB,UAA0B;AACnD,QAAM,QAAkB,CAAC,IAAI,oBAAoB,eAAe,QAAQ,EAAE;AAE1E,MAAI,UAAU,GAAG;AACf,UAAM,KAAK,UAAU,OAAO,SAAS,IAAI,EAAE;AAC3C,UAAM,KAAK,iBAAiB,UAAU,SAAS,EAAE;AACjD,UAAM,KAAK,iBAAgB,oBAAI,KAAK,GAAE,YAAY,CAAC,EAAE;AACrD,UAAM,KAAK,yBAAyB,OAAO,gBAAgB,EAAE;AAAA,EAC/D;AAEA,SAAO,MAAM,KAAK,IAAI,IAAI;AAC5B;AAGA,SAAS,cAAc,YAAwB,UAA0B;AACvE,MAAI,OAAO,GAAG,QAAQ,OAAO,WAAW,OAAO;AAE/C,MAAI,WAAW,YAAY;AACzB,YAAQ,KAAK,WAAW,UAAU;AAAA,EACpC;AAEA,UAAQ,KAAK,WAAW,OAAO;AAE/B,QAAM,WAAW,WAAW;AAC5B,MAAI,UAAU;AACZ,UAAM,UAAU,SAAS,MAAM,GAAG,EAAE;AACpC,UAAM,SAAS,SAAS,SAAS,KAAK,QAAQ;AAC9C,YAAQ,UAAU,OAAO,GAAG,MAAM;AAAA,EACpC;AAEA,SAAO,OAAO;AAChB;AAGA,SAAS,eAAe,YAAwB,UAA0B;AACxE,QAAM,QAAkB,CAAC,OAAO,QAAQ,KAAK,WAAW,OAAO;AAAA,CAAI;AAEnE,MAAI,WAAW,iBAAiB,WAAW,UAAU;AACnD,UAAM,KAAK,wDAAwD;AAAA,EACrE;AAEA,YAAU,OAAO,iBAAiB,WAAW,QAAQ;AACrD,YAAU,OAAO,eAAe,WAAW,UAAU;AAErD,QAAM,MAAM,WAAW;AACvB,MAAI,KAAK;AACP,UAAM,IAAI,KAAK,MAAM,IAAI,CAAC;AAC1B,UAAM,IAAI,KAAK,MAAM,IAAI,CAAC;AAC1B,UAAM,IAAI,KAAK,MAAM,IAAI,KAAK;AAC9B,UAAM,IAAI,KAAK,MAAM,IAAI,MAAM;AAC/B,UAAM,KAAK,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC;AAAA,CAAO;AAAA,EAClE;AAEA,QAAM;AAAA,IACJ,sBAAsB,WAAW,EAAE,QAAQ,CAAC,CAAC,gBAAgB,KAAK,MAAM,WAAW,CAAC,CAAC;AAAA;AAAA,EACvF;AAEA,MAAI,WAAW,cAAc;AAC3B,UAAM,KAAK,uBAAuB,WAAW,YAAY;AAAA,CAAK;AAAA,EAChE,WAAW,WAAW,YAAY;AAChC,UAAM,KAAK,gBAAgB,WAAW,WAAW,MAAM,GAAG,GAAG,CAAC;AAAA,CAAI;AAAA,EACpE;AAEA,YAAU,OAAO,mBAAmB,WAAW,cAAc;AAC7D,YAAU,OAAO,iBAAiB,WAAW,aAAa;AAC1D,YAAU,OAAO,mBAAmB,WAAW,cAAc;AAC7D,YAAU,OAAO,UAAU,WAAW,UAAU;AAChD,YAAU,OAAO,SAAS,WAAW,eAAe;AAEpD,QAAM,KAAK,iBAAiB,WAAW,OAAO;AAAA;AAAA,CAAM;AAEpD,SAAO,MAAM,KAAK,EAAE;AACtB;AAGA,SAAS,yBACP,YACA,UACA,UACQ;AACR,QAAM,QAAkB;AAAA,IACtB,OAAO,QAAQ,KAAK,WAAW,OAAO;AAAA;AAAA,IACtC,iBAAiB,WAAW,WAAW;AAAA;AAAA,EACzC;AAEA,YAAU,OAAO,UAAU,WAAW,UAAU;AAChD,YAAU,OAAO,SAAS,WAAW,eAAe;AAEpD,MAAI,UAAU;AACZ,cAAU,OAAO,WAAW,WAAW,UAAU;AAEjD,UAAM,MAAM,WAAW;AACvB,QAAI,KAAK;AACP,YAAM,IAAI,KAAK,MAAM,IAAI,CAAC;AAC1B,YAAM,IAAI,KAAK,MAAM,IAAI,CAAC;AAC1B,YAAM,IAAI,KAAK,MAAM,IAAI,KAAK;AAC9B,YAAM,IAAI,KAAK,MAAM,IAAI,MAAM;AAC/B,YAAM,KAAK,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,GAAG,CAAC;AAAA,CAAO;AAAA,IAClE;AAAA,EACF;AAEA,MAAI,WAAW,cAAc;AAC3B,UAAM,KAAK,uBAAuB,WAAW,YAAY;AAAA,CAAK;AAAA,EAChE,WAAW,YAAY,WAAW,YAAY;AAC5C,UAAM,KAAK,gBAAgB,WAAW,WAAW,MAAM,GAAG,GAAG,CAAC;AAAA,CAAI;AAAA,EACpE;AAEA,QAAM,KAAK,iBAAiB,WAAW,OAAO;AAAA;AAAA,CAAM;AAEpD,SAAO,MAAM,KAAK,EAAE;AACtB;AAMO,SAAS,eACd,aACA,UACA,cAAiC,YACzB;AACR,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,gBAAgB;AAEjC,QAAM,WAAqB,CAAC,qBAAqB,QAAQ;AAAA,CAAI;AAE7D,MAAI,gBAAgB,YAAY;AAC9B,aAAS,KAAK,kBAAkB,QAAQ,CAAC;AAAA,EAC3C,WAAW,gBAAgB,WAAW;AAEpC,aAAS,KAAK,iBAAiB,QAAQ;AAAA,CAAI;AAAA,EAC7C;AAGA,WAAS,KAAK,IAAI;AAElB,cAAY,QAAQ,CAAC,YAAY,UAAU;AACzC,UAAM,WAAW,QAAQ;AAEzB,QAAI,gBAAgB,WAAW;AAC7B,eAAS,KAAK,cAAc,YAAY,QAAQ,CAAC;AAAA,IACnD,WAAW,gBAAgB,YAAY;AACrC,eAAS,KAAK,eAAe,YAAY,QAAQ,CAAC;AAAA,IACpD,OAAO;AACL,eAAS,KAAK,yBAAyB,YAAY,UAAU,gBAAgB,UAAU,CAAC;AAAA,IAC1F;AAAA,EACF,CAAC;AAED,SAAO,SAAS,KAAK,EAAE,EAAE,KAAK;AAChC;;;AC9LO,SAAS,wBACd,WACA,SACuC;AACvC,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAMG,WAAU,QAAQ,UAAU,UAAU,iBAAiB,IAAI,CAAC;AAClE,QAAM,gBAAgB,QAAQ,gBAAgB,UAAU,sBAAsB,IAAI,CAAC;AACnF,QAAM,UAAU,QAAQ,UAAU,UAAU,iBAAiB,IAAI,CAAC;AAElE,MAAIA,SAAQ,WAAW,KAAK,cAAc,WAAW,KAAK,QAAQ,WAAW,GAAG;AAI9E,QAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,iBAAiB,CAAC,QAAQ,SAAS;AAClE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAASA,SAAQ,SAAS,IAAIA,WAAU;AAAA,IACxC,eAAe,cAAc,SAAS,IAAI,gBAAgB;AAAA,IAC1D,SAAS,QAAQ,SAAS,IAAI,UAAU;AAAA,IACxC,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC,aAAa;AAAA,MACX,SAAS,QAAQ;AAAA,MACjB,eAAe,QAAQ;AAAA,MACvB,SAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AACF;;;AChDA,IAAMC,OAAM;AACZ,IAAMC,cAAa,EAAC,WAAU,kCAAiC,gBAAe,uCAAsC,qBAAoB,4CAA2C,oBAAmB,2CAA0C,YAAW,mCAAkC,gBAAe,uCAAsC,UAAS,iCAAgC,eAAc,sCAAqC,aAAY,oCAAmC,YAAW,mCAAkC,cAAa,qCAAoC,iBAAgB,wCAAuC,WAAU,kCAAiC,UAAS,iCAAgC,mBAAkB,0CAAyC,SAAQ,gCAA+B,WAAU,kCAAiC,cAAa,qCAAoC,iBAAgB,wCAAuC,UAAS,iCAAgC,iBAAgB,wCAAuC,eAAc,sCAAqC,iBAAgB,wCAAuC,iBAAgB,wCAAuC,qBAAoB,4CAA2C,gBAAe,uCAAsC,0BAAyB,iDAAgD,2BAA0B,kDAAiD,YAAW,mCAAkC,kBAAiB,yCAAwC,WAAU,kCAAiC,WAAU,kCAAiC,kBAAiB,yCAAwC,SAAQ,gCAA+B,oBAAmB,2CAA0C,sBAAqB,6CAA4C,UAAS,iCAAgC,QAAO,+BAA8B,uBAAsB,8CAA6C,gBAAe,uCAAsC,kBAAiB,yCAAwC,kBAAiB,yCAAwC,oBAAmB,2CAA0C,cAAa,qCAAoC,iBAAgB,wCAAuC,uBAAsB,8CAA6C,4BAA2B,mDAAkD,sBAAqB,6CAA4C,WAAU,kCAAiC,WAAU,kCAAiC,aAAY,mCAAkC;AAEhpF,IAAI,OAAO,aAAa,aAAa;AACnC,MAAI,QAAQ,SAAS,eAAe,+CAA+C;AACnF,MAAI,CAAC,OAAO;AACV,YAAQ,SAAS,cAAc,OAAO;AACtC,UAAM,KAAK;AACX,aAAS,KAAK,YAAY,KAAK;AAAA,EACjC;AACA,QAAM,cAAcD;AACtB;AAEA,IAAOE,yBAAQD;;;ACbf,IAAME,OAAM;AACZ,IAAMC,cAAa,EAAC,UAAS,iCAAgC,SAAQ,gCAA+B,QAAO,+BAA8B,YAAW,mCAAkC,YAAW,mCAAkC,aAAY,oCAAmC,WAAU,kCAAiC,eAAc,sCAAqC,SAAQ,gCAA+B,WAAU,kCAAiC,YAAW,mCAAkC,gBAAe,uCAAsC,iBAAgB,wCAAuC,aAAY,oCAAmC,eAAc,sCAAqC,cAAa,oCAAmC;AAE7uB,IAAI,OAAO,aAAa,aAAa;AACnC,MAAI,QAAQ,SAAS,eAAe,gDAAgD;AACpF,MAAI,CAAC,OAAO;AACV,YAAQ,SAAS,cAAc,OAAO;AACtC,UAAM,KAAK;AACX,aAAS,KAAK,YAAY,KAAK;AAAA,EACjC;AACA,QAAM,cAAcD;AACtB;AAEA,IAAOE,yBAAQD;;;AC6IT,gBAAAE,MA4BI,QAAAC,aA5BJ;AAlJN,IAAM,cAAc;AACpB,IAAM,aAAa;AAInB,IAAM,kBAAkB;AAGxB,IAAM,cAAc;AAiCpB,SAAS,mBACP,WACA,YACA,YACQ;AACR,MAAI,UAAW,QAAOC,uBAAO;AAC7B,MAAI,WAAY,QAAOA,uBAAO;AAC9B,MAAI,CAAC,WAAY,QAAOA,uBAAO;AAC/B,SAAO;AACT;AAMA,SAAS,oBAAoB,cAA0C;AACrE,MAAI,CAAC,aAAc,QAAO;AAC1B,QAAM,OAAO,aAAa,MAAM,GAAG,WAAW;AAC9C,QAAM,WAAW,aAAa,SAAS,cAAc,QAAQ;AAC7D,SAAO,KAAK,IAAI,GAAG,QAAQ;AAC7B;AAOO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AACrC,QAAM,UAAU,WAAW;AAI3B,QAAM,mBAAmB,aAAa,eAAe,CAAC;AACtD,QAAM,kBAAkB,mBAAmB,wBAAwB;AAEnE,QAAM,OAAO,UAAU,aAAa;AACpC,QAAM,iBAAiB,mBAAmB,WAAW,YAAY,UAAU;AAI3E,QAAM,aAAa,YAAY,YAAY,IAAI,aAAa;AAC5D,QAAM,iBAAiB,GAAG,aAAa,eAAe;AAEtD,QAAM,gBAAgB;AAAA,IACpBA,uBAAO;AAAA,IACP,UAAUA,uBAAO,cAAc;AAAA,IAC/B;AAAA,IACA,kBAAkBA,uBAAO,UAAU;AAAA,EACrC,EAAE,KAAK,GAAG;AAIV,QAAM,YAAiC;AAAA,IACrC,MAAM,GAAG,WAAW,CAAC;AAAA,IACrB,KAAK,WAAW;AAAA,IAChB,iBAAiB,kBAAkB,SAAY;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,UAA4B;AAC/C,UAAM,gBAAgB;AACtB,QAAI,CAAC,WAAW;AACd,cAAQ,UAAU;AAAA,IACpB;AAAA,EACF;AAIA,QAAM,oBAAoB,gBACtB,CAAC,UAA4B;AAC3B,QAAI,wBAAwB,SAAU;AACtC,UAAM,eAAe;AACrB,UAAM,gBAAgB;AACtB,QAAI,CAAC,WAAW;AACd,oBAAc,UAAU;AAAA,IAC1B;AAAA,EACF,IACA;AAEJ,QAAM,eACJ,iBAAiB,QAAQ,eAAe;AAE1C,QAAM,cAAc,aAAa,CAAC;AAElC,MAAI;AACJ,MAAI,iBAAiB;AACnB,WAAO,kBACL,gBAAAF,KAAC,aAAU,MAAM,UAAU,KAAK,IAAI,IAEpC,gBAAAA,KAAC,YAAS,MAAM,IAAI;AAAA,EAExB,OAAO;AACL,WACE,gBAAAA,KAAC,UAAK,WAAW,eAAeE,uBAAO,WAAW,QAC/C,wBAAc,GACjB;AAAA,EAEJ;AAEA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,0BAAsB;AAAA,MACtB,WAAW;AAAA,MACX,OAAO;AAAA,MACP,cAAc,MAAM,aAAa,UAAU;AAAA,MAC3C,cAAc;AAAA,MACd,SAAS;AAAA,MACT,eAAe;AAAA,MAEd;AAAA;AAAA,QACA,cACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,GAAGC,uBAAO,aAAa,IAAIA,uBAAO,KAAK;AAAA,YAClD,OAAO;AAAA,YAEP;AAAA,8BAAAD,MAAC,UAAK,WAAWC,uBAAO,aACrB;AAAA,2BAAW;AAAA,gBACX,oBAAoB,WAAW,YAAY;AAAA,iBAC9C;AAAA,cACA,gBAAAF,KAAC,UAAK,WAAWE,uBAAO,YAAa,qBAAW,SAAQ;AAAA;AAAA;AAAA,QAC1D,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;AAcO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoC;AAClC,QAAM,YAAY,GAAGA,uBAAO,MAAM,IAAIA,uBAAO,OAAO,IAClD,gBAAgBA,uBAAO,cAAc,EACvC,IAAI,YAAYA,uBAAO,OAAOA,uBAAO,KAAK;AAE1C,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,MAAM,GAAG,CAAC;AAAA,QACV,KAAK;AAAA,QACL,iBAAiB,gBAAgB,aAAa;AAAA,MAChD;AAAA,MAEA,0BAAAA,KAAC,YAAS,MAAM,IAAI;AAAA;AAAA,EACtB;AAEJ;AAWO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AACF,GAAoC;AAClC,QAAM,UAAU,WAAW;AAE3B,QAAM,YAAY,GAAGE,uBAAO,MAAM,IAAI,QAAQA,uBAAO,QAAQ,EAAE,IAC7DA,uBAAO,OACT,IAAI,UAAUA,uBAAO,cAAc,EAAE,IAAIA,uBAAO,IAAI;AAEpD,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,0BAAsB;AAAA,MACtB;AAAA,MACA,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC,KAAK,KAAK,WAAW,EAAE;AAAA,MAErD,0BAAAA,KAAC,aAAU,MAAM,UAAU,KAAK,IAAI;AAAA;AAAA,EACtC;AAEJ;;;AChQA,SAAS,aAAa;;;ACDtB,IAAMG,OAAM;AACZ,IAAMC,cAAa,EAAC,qBAAoB,4CAA2C,iBAAgB,wCAAuC,iBAAgB,wCAAuC,qBAAoB,2CAA0C;AAE/P,IAAI,OAAO,aAAa,aAAa;AACnC,MAAI,QAAQ,SAAS,eAAe,uCAAuC;AAC3E,MAAI,CAAC,OAAO;AACV,YAAQ,SAAS,cAAc,OAAO;AACtC,UAAM,KAAK;AACX,aAAS,KAAK,YAAY,KAAK;AAAA,EACjC;AACA,QAAM,cAAcD;AACtB;AAEA,IAAOE,yBAAQD;;;ACeX,SACE,OAAAE,MADF,QAAAC,aAAA;AAFG,IAAM,WAAW,CAAC,EAAE,YAAY,IAAI,GAAG,MAAM,MAAqB;AACvE,SACE,gBAAAA,MAAC,SAAI,WAAW,GAAGC,uBAAO,iBAAiB,IAAI,SAAS,IACtD;AAAA,oBAAAF,KAAC,WAAM,MAAK,YAAW,WAAWE,uBAAO,eAAgB,GAAG,OAAO;AAAA,IACnE,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,WAAWE,uBAAO;AAAA,QAClB,OAAM;AAAA,QACN,QAAO;AAAA,QACP,SAAQ;AAAA,QACR,MAAK;AAAA,QAEL,0BAAAF;AAAA,UAAC;AAAA;AAAA,YACC,WAAWE,uBAAO;AAAA,YAClB,GAAE;AAAA,YACF,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,eAAc;AAAA,YACd,gBAAe;AAAA;AAAA,QACjB;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;ACnCA,SAAS,aAAAC,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AAC5C,SAAS,oBAAoB;AA2FzB,SA4BA,UA5BA,OAAAC,MA4BA,QAAAC,aA5BA;AAvFJ,IAAM,gBAAgB;AAGtB,IAAM,gBAAgB;AAGtB,IAAM,SAAS;AAUR,IAAM,UAAU,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAA8F;AAG5F,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAS,KAAK;AAC5C,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAyB,EAAE,KAAK,GAAG,OAAO,EAAE,CAAC;AAE7E,QAAM,aAAaC,QAAwB,IAAI;AAC/C,QAAM,aAAaA,QAAoB,IAAI;AAC3C,QAAM,iBAAiBA,QAAoB,IAAI;AAG/C,QAAM,iBAAiB,MAAM;AAC3B,UAAM,OAAO,WAAW;AACxB,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,UAAM,OAAO,KAAK,sBAAsB;AACxC,gBAAY;AAAA,MACV,KAAK,KAAK,MAAM,KAAK,SAAS;AAAA,MAC9B,OAAO,OAAO,aAAa,KAAK,OAAO;AAAA,IACzC,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,MAAM;AAC7B,oBAAgB,IAAI;AAGpB,QAAI,eAAe,YAAY,MAAM;AACnC,mBAAa,eAAe,OAAO;AACnC,qBAAe,UAAU;AAAA,IAC3B;AAEA,mBAAe;AAEf,eAAW,UAAU,mBAAmB,MAAM;AAC5C,iBAAW,IAAI;AAAA,IACjB,GAAG,aAAa;AAAA,EAClB;AAEA,QAAM,mBAAmB,MAAM;AAE7B,QAAI,WAAW,YAAY,MAAM;AAC/B,mBAAa,WAAW,OAAO;AAC/B,iBAAW,UAAU;AAAA,IACvB;AAEA,eAAW,KAAK;AAEhB,mBAAe,UAAU,mBAAmB,MAAM;AAChD,sBAAgB,KAAK;AAAA,IACvB,GAAG,aAAa;AAAA,EAClB;AAGA,EAAAC,WAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,WAAW,YAAY,MAAM;AAC/B,qBAAa,WAAW,OAAO;AAAA,MACjC;AACA,UAAI,eAAe,YAAY,MAAM;AACnC,qBAAa,eAAe,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,SACJ,gBAAAJ;AAAA,IAAC;AAAA;AAAA,MACC,yBAAqB;AAAA,MACrB,OAAO;AAAA,QACL,UAAU;AAAA,QACV,KAAK,SAAS;AAAA,QACd,OAAO,SAAS;AAAA,QAChB,WAAW;AAAA,QACX,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,OAAO;AAAA,QACP,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,WAAW;AAAA,QACX,SAAS,UAAU,IAAI;AAAA,QACvB,YAAY;AAAA,MACd;AAAA,MAEC;AAAA;AAAA,EACH;AAGF,SACE,gBAAAC,MAAA,YACE;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,cAAc;AAAA,QACd,cAAc;AAAA,QACb,GAAG;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,IACC,gBAAgB,aAAa,QAAQ,SAAS,IAAI;AAAA,KACrD;AAEJ;;;ACjJA,IAAMK,OAAM;AACZ,IAAMC,cAAa,EAAC,WAAU,kCAAiC,eAAc,qCAAoC;AAEjH,IAAI,OAAO,aAAa,aAAa;AACnC,MAAI,QAAQ,SAAS,eAAe,2CAA2C;AAC/E,MAAI,CAAC,OAAO;AACV,YAAQ,SAAS,cAAc,OAAO;AACtC,UAAM,KAAK;AACX,aAAS,KAAK,YAAY,KAAK;AAAA,EACjC;AACA,QAAM,cAAcD;AACtB;AAEA,IAAOE,yBAAQD;;;ACWX,gBAAAE,YAAA;AAFG,IAAM,cAAc,CAAC,EAAE,QAAQ,MACpC,gBAAAA,KAAC,WAAQ,WAAWC,uBAAO,SAAS,SAClC,0BAAAD,KAAC,YAAS,WAAWC,uBAAO,aAAa,GAC3C;;;ACzBF,IAAMC,OAAM;AACZ,IAAMC,cAAa,EAAC,aAAY,oCAAmC,SAAQ,+BAA8B;AAEzG,IAAI,OAAO,aAAa,aAAa;AACnC,MAAI,QAAQ,SAAS,eAAe,6CAA6C;AACjF,MAAI,CAAC,OAAO;AACV,YAAQ,SAAS,cAAc,OAAO;AACtC,UAAM,KAAK;AACX,aAAS,KAAK,YAAY,KAAK;AAAA,EACjC;AACA,QAAM,cAAcD;AACtB;AAEA,IAAOE,yBAAQD;;;ANmCX,SACE,OAAAE,MADF,QAAAC,aAAA;AAZG,IAAM,gBAAgB,CAAC;AAAA,EAC5B,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAA0B;AAExB,QAAM,UAAU,MAAM;AAEtB,SACE,gBAAAA,MAAC,SAAI,WAAW,GAAGC,uBAAO,SAAS,IAAI,SAAS,IAAK,GAAG,OACtD;AAAA,oBAAAF,KAAC,YAAS,IAAI,SAAS,UAAoB,SAAkB;AAAA,IAC7D,gBAAAA,KAAC,WAAM,WAAWE,uBAAO,OAAO,SAAS,SACtC,iBACH;AAAA,IACC,WAAW,gBAAAF,KAAC,eAAY,SAAS,SAAS;AAAA,KAC7C;AAEJ;;;AOxDA,IAAMG,OAAM;AACZ,IAAMC,cAAa,EAAC,iBAAgB,wCAAuC,SAAQ,gCAA+B,QAAO,+BAA8B,0BAAyB,iDAAgD,gBAAe,uCAAsC,kBAAiB,yCAAwC,iBAAgB,wCAAuC,mBAAkB,0CAAyC,iBAAgB,wCAAuC,eAAc,sCAAqC,oBAAmB,2CAA0C,aAAY,oCAAmC,eAAc,sCAAqC,oBAAmB,2CAA0C,WAAU,kCAAiC,mBAAkB,0CAAyC,aAAY,oCAAmC,mBAAkB,0CAAyC,cAAa,qCAAoC,iBAAgB,wCAAuC,aAAY,oCAAmC,YAAW,mCAAkC,gBAAe,uCAAsC,oBAAmB,2CAA0C,kBAAiB,yCAAwC,wBAAuB,+CAA8C,mBAAkB,0CAAyC,qBAAoB,4CAA2C,qBAAoB,4CAA2C,cAAa,qCAAoC,mBAAkB,0CAAyC,sBAAqB,6CAA4C,oBAAmB,2CAA0C,YAAW,mCAAkC,aAAY,oCAAmC,eAAc,sCAAqC,gBAAe,uCAAsC,eAAc,sCAAqC,iBAAgB,wCAAuC,eAAc,sCAAqC,mBAAkB,0CAAyC,eAAc,sCAAqC,aAAY,oCAAmC,YAAW,mCAAkC,UAAS,iCAAgC,gBAAe,uCAAsC,eAAc,sCAAqC,YAAW,kCAAiC;AAErhF,IAAI,OAAO,aAAa,aAAa;AACnC,MAAI,QAAQ,SAAS,eAAe,6CAA6C;AACjF,MAAI,CAAC,OAAO;AACV,YAAQ,SAAS,cAAc,OAAO;AACtC,UAAM,KAAK;AACX,aAAS,KAAK,YAAY,KAAK;AAAA,EACjC;AACA,QAAM,cAAcD;AACtB;AAEA,IAAOE,yBAAQD;;;AC0IT,SA+IE,YAAAE,WAzIA,OAAAC,MANF,QAAAC,aAAA;AArEC,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,eAAe,iBAAiB;AAEtC,QAAM,wBAAwB;AAAA,IAC5B,gBACG,YAAY,eACX,YAAY,eACZ,YAAY;AAAA,EAClB;AAMA,QAAM,gBAAgB,oBAClB,SACA,EAAE,QAAQ,QAAQ,KAAK,sBAAsB;AAIjD,QAAM,sBAAsB,CAAC,UAA2C;AACtE,UAAM,gBAAgB;AAAA,EACxB;AAEA,QAAM,WAAW,MAAM;AACrB,yBAAqB,eAAe,aAAa,QAAQ;AAAA,EAC3D;AAEA,QAAM,sBAAsB,MAAM;AAChC,UAAM,QAAQ,sBAAsB;AACpC,UAAM,eAAe,sBAAsB;AAAA,MACzC,CAAC,WAAW,OAAO,UAAU,SAAS;AAAA,IACxC;AACA,UAAM,aAAa,eAAe,KAAK;AACvC,qBAAiB,EAAE,cAAc,sBAAsB,SAAS,EAAE,MAAM,CAAC;AAAA,EAC3E;AAEA,QAAM,oBAAoB,sBAAsB;AAAA,IAC9C,CAAC,WAAW,OAAO,UAAU,SAAS;AAAA,EACxC,GAAG;AAEH,QAAM,SACJ,gBAAAA,MAAC,SAAI,WAAWC,uBAAO,gBACrB;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,WAAWC,uBAAO;AAAA,QAClB,MAAK;AAAA,QACL,QAAO;AAAA,QACP,KAAI;AAAA,QAEJ;AAAA,0BAAAF,KAAC,oBAAiB,MAAM,IAAI;AAAA,UAC5B,gBAAAA,KAAC,UAAK,qBAAO;AAAA;AAAA;AAAA,IACf;AAAA,IACA,gBAAAC,MAAC,OAAE,WAAWC,uBAAO,iBAAiB;AAAA;AAAA,MAAE;AAAA,OAAY;AAAA,IACpD,gBAAAD,MAAC,SAAI,WAAWC,uBAAO,eACrB;AAAA,sBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAWE,uBAAO;AAAA,UAClB,SAAS;AAAA,UACT,OAAO,aAAa,yBAAyB;AAAA,UAE7C,0BAAAF,KAAC,UAAK,WAAWE,uBAAO,kBACtB,0BAAAF;AAAA,YAAC;AAAA;AAAA,cAEC,WAAWE,uBAAO;AAAA,cAEjB,uBAAa,gBAAAF,KAAC,WAAQ,MAAM,IAAI,IAAK,gBAAAA,KAAC,YAAS,MAAM,IAAI;AAAA;AAAA,YAHrD,aAAa,QAAQ;AAAA,UAI5B,GACF;AAAA;AAAA,MACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAWE,uBAAO;AAAA,UAClB,SAAS;AAAA,UACT,OAAO,eAAe,kBAAkB;AAAA,UAEvC,yBACC,gBAAAF,KAAC,YAAS,MAAM,IAAI,IAEpB,gBAAAA,KAAC,mBAAgB,MAAM,IAAI;AAAA;AAAA,MAE/B;AAAA,OACF;AAAA,KACF;AAGF,QAAM,aACJ,gBAAAC,MAAAF,WAAA,EACE;AAAA,oBAAAE,MAAC,SAAI,WAAWC,uBAAO,iBACrB;AAAA,sBAAAD,MAAC,SAAI,WAAWC,uBAAO,WACrB;AAAA,wBAAAF;AAAA,UAAC;AAAA;AAAA,YACC,WAAWE,uBAAO;AAAA,YAClB,SAAQ;AAAA,YACT;AAAA;AAAA,QAED;AAAA,QACA,gBAAAF;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,WAAWE,uBAAO;AAAA,YAClB,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,UAAU,oBAAoB,MAAM,OAAO,KAAK;AAAA,YAC3D,WAAW;AAAA;AAAA,QACb;AAAA,SACF;AAAA,MAEA,gBAAAD,MAAC,SAAI,WAAW,GAAGC,uBAAO,SAAS,IAAIA,uBAAO,eAAe,IAC3D;AAAA,wBAAAD,MAAC,SAAI,WAAWC,uBAAO,eACrB;AAAA,0BAAAF;AAAA,YAAC;AAAA;AAAA,cACC,WAAWE,uBAAO;AAAA,cAClB,SAAQ;AAAA,cACT;AAAA;AAAA,UAED;AAAA,UACA,gBAAAF;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAWE,uBAAO;AAAA,cAClB,SAAS;AAAA,cACT,OACE,mBAAmB,sBAAsB;AAAA,cAE3C,UAAU;AAAA,cAEV,0BAAAF,KAAC,cAAW,MAAM,IAAI;AAAA;AAAA,UACxB;AAAA,WACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,IAAG;AAAA,YACH,WAAWE,uBAAO;AAAA,YAClB,aAAY;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,CAAC,UACT,0BAA0B,MAAM,OAAO,KAAK;AAAA,YAE9C,WAAW;AAAA;AAAA,QACb;AAAA,SACF;AAAA,MAEC,mBACC,gBAAAD,MAAC,SAAI,WAAWC,uBAAO,gBACrB;AAAA,wBAAAD,MAAC,SAAI,WAAWC,uBAAO,sBACrB;AAAA,0BAAAF,KAAC,UAAK,WAAWE,uBAAO,iBAAiB,iCAEzC;AAAA,UACA,gBAAAD,MAAC,SAAI,WAAWC,uBAAO,mBACrB;AAAA,4BAAAF;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAWE,uBAAO;AAAA,gBAClB,SAAS;AAAA,gBACT,OAAM;AAAA,gBACN,UAAU;AAAA,gBAEV,0BAAAF,KAAC,cAAW,MAAM,IAAI;AAAA;AAAA,YACxB;AAAA,YACA,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAWE,uBAAO;AAAA,gBAClB,SAAS;AAAA,gBACT,OAAM;AAAA,gBAEN,0BAAAF,KAAC,aAAU,MAAM,IAAI;AAAA;AAAA,YACvB;AAAA,aACF;AAAA,WACF;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAWE,uBAAO;AAAA,YAClB,KAAK,iBAAiB;AAAA,YACtB,KAAI;AAAA;AAAA,QACN;AAAA,SACF,IACE;AAAA,MAEH,kBACC,gBAAAF,KAAC,OAAE,WAAW,GAAGE,uBAAO,UAAU,IAAIA,uBAAO,eAAe,IACzD,2BACH,IACE;AAAA,MAEH,CAAC,sBACA,gBAAAD,MAAC,OAAE,WAAWC,uBAAO,YAAY;AAAA;AAAA,QACQ;AAAA,QACvC,gBAAAF,KAAC,UAAK,sBAAQ;AAAA,QAAO;AAAA,SACvB,IACE;AAAA,OACN;AAAA,IAEC,yBAAyB,cACxB,gBAAAC,MAAAF,WAAA,EACE;AAAA,sBAAAC,KAAC,SAAI,WAAWE,uBAAO,SAAS;AAAA,MAChC,gBAAAD,MAAC,SAAI,WAAWC,uBAAO,iBACrB;AAAA,wBAAAF;AAAA,UAAC;AAAA;AAAA,YACC,WAAWE,uBAAO;AAAA,YAClB,IAAG;AAAA,YACJ;AAAA;AAAA,QAED;AAAA,QACA,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,WAAWC,uBAAO;AAAA,YAClB,MAAK;AAAA,YACL,mBAAgB;AAAA,YAEf;AAAA,0BAAY,cACX,gBAAAF;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAM;AAAA,kBACN,SAAQ;AAAA,kBACR,SAAS,YAAY;AAAA,kBACrB,UAAU,CAAC,UACT,YAAY,gBAAgB,MAAM,OAAO,OAAO;AAAA;AAAA,cAEpD,IACE;AAAA,cACH,YAAY,cACX,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAM;AAAA,kBACN,SAAQ;AAAA,kBACR,SAAS,YAAY;AAAA,kBACrB,UAAU,CAAC,UACT,YAAY,gBAAgB,MAAM,OAAO,OAAO;AAAA;AAAA,cAEpD,IACE;AAAA,cACH,YAAY,oBACX,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAM;AAAA,kBACN,SAAQ;AAAA,kBACR,SAAS,YAAY;AAAA,kBACrB,UAAU,CAAC,UACT,YAAY,sBAAsB,MAAM,OAAO,OAAO;AAAA;AAAA,cAE1D,IACE;AAAA;AAAA;AAAA,QACN;AAAA,QACC,YAAY,eAAe,YAAY,wBACtC,gBAAAA,KAAC,OAAE,WAAWE,uBAAO,YAAY,+GAGjC,IACE;AAAA,SACN;AAAA,OACF,IACE;AAAA,IAEJ,gBAAAF,KAAC,SAAI,WAAWE,uBAAO,SAAS;AAAA,IAEhC,gBAAAF,KAAC,SAAI,WAAWE,uBAAO,iBACrB,0BAAAD,MAAC,SAAI,WAAWC,uBAAO,UACrB;AAAA,sBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,WAAWE,uBAAO;AAAA,UAClB,MAAM;AAAA,UACN,QAAO;AAAA,UACP,KAAI;AAAA,UAEJ,0BAAAF,KAAC,UAAK,uBAAS;AAAA;AAAA,MACjB;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAWE,uBAAO;AAAA,UAClB,MAAM;AAAA,UACN,QAAO;AAAA,UACP,KAAI;AAAA,UAEJ,0BAAAF,KAAC,UAAK,iBAAG;AAAA;AAAA,MACX;AAAA,OACF,GACF;AAAA,IAEA,gBAAAA,KAAC,SAAI,WAAWE,uBAAO,SAAS;AAAA,IAE/B,cACC,gBAAAF,KAAC,OAAE,WAAWE,uBAAO,aAAa,MAAK,SACpC,uBACH,IACE;AAAA,IAEJ,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWE,uBAAO;AAAA,QAClB,SAAS;AAAA,QACT,UAAU,CAAC,aAAa;AAAA,QAEvB,yBAAe,kBAAkB;AAAA;AAAA,IACpC;AAAA,KACF;AAGF,QAAM,mBACJ,gBAAAD,MAAAF,WAAA,EACE;AAAA,oBAAAC,KAAC,SAAI,WAAWE,uBAAO,iBACrB,0BAAAD,MAAC,SAAI,WAAWC,uBAAO,aACrB;AAAA,sBAAAD,MAAC,SAAI,WAAWC,uBAAO,eAAe;AAAA;AAAA,QAEpC,gBAAAF,KAAC,eAAY,SAAQ,6DAA4D;AAAA,SACnF;AAAA,MACA,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAWC,uBAAO;AAAA,UAClB,SAAS;AAAA,UAET;AAAA,4BAAAF;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAWE,uBAAO;AAAA,gBAEjB;AAAA;AAAA,cAHI,SAAS;AAAA,YAIhB;AAAA,YACA,gBAAAF,KAAC,UAAK,WAAWE,uBAAO,WACrB,gCAAsB,IAAI,CAAC,WAC1B,gBAAAF;AAAA,cAAC;AAAA;AAAA,gBAEC,WAAW,GAAGE,uBAAO,QAAQ,IAC3B,SAAS,iBAAiB,OAAO,QAAQA,uBAAO,SAAS,EAC3D;AAAA;AAAA,cAHK,OAAO;AAAA,YAId,CACD,GACH;AAAA;AAAA;AAAA,MACF;AAAA,OACF,GACF;AAAA,IAEA,gBAAAF,KAAC,SAAI,WAAWE,uBAAO,SAAS;AAAA,IAEhC,gBAAAD,MAAC,SAAI,WAAWC,uBAAO,iBACrB;AAAA,sBAAAF;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GAAGE,uBAAO,aAAa,IAAIA,uBAAO,mBAAmB;AAAA,UACjE;AAAA;AAAA,MAED;AAAA,MACA,gBAAAF,KAAC,SAAI,WAAWE,uBAAO,cACpB,wBAAc,IAAI,CAAC,UAClB,gBAAAF;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,WAAW,GAAGE,uBAAO,WAAW,IAC9B,SAAS,sBAAsB,MAAM,KAAKA,uBAAO,WAAW,EAC9D;AAAA,UACA,OACE;AAAA,YACE,YAAY,MAAM;AAAA,YAClB,eAAe,MAAM;AAAA,UACvB;AAAA,UAEF,SAAS,MAAM,iBAAiB,EAAE,mBAAmB,MAAM,GAAG,CAAC;AAAA,UAC/D,OAAO,MAAM;AAAA;AAAA,QAZR,MAAM;AAAA,MAab,CACD,GACH;AAAA,OACF;AAAA,KACF;AAGF,SACE,gBAAAF;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAGE,uBAAO,aAAa,IAChC,YAAYA,uBAAO,QAAQA,uBAAO,IACpC;AAAA,MACA,OAAO;AAAA,MACP,sCAAkC;AAAA,MAElC,0BAAAF,KAAC,SAAI,WAAWE,uBAAO,wBACrB,0BAAAD,MAAC,SAAI,WAAWC,uBAAO,cACpB;AAAA;AAAA,QACD,gBAAAF,KAAC,SAAI,WAAWE,uBAAO,SAAS;AAAA,QAC/B,eAAe,aAAa;AAAA,SAC/B,GACF;AAAA;AAAA,EACF;AAEJ;;;ACtbO,IAAM,gBAA+B;AAAA,EAC1C,EAAE,IAAI,UAAU,OAAO,UAAU,MAAM,WAAW,IAAI,mCAAmC;AAAA,EACzF,EAAE,IAAI,QAAQ,OAAO,QAAQ,MAAM,WAAW,IAAI,mCAAmC;AAAA,EACrF,EAAE,IAAI,QAAQ,OAAO,QAAQ,MAAM,WAAW,IAAI,mCAAmC;AAAA,EACrF,EAAE,IAAI,SAAS,OAAO,SAAS,MAAM,WAAW,IAAI,mCAAmC;AAAA,EACvF,EAAE,IAAI,UAAU,OAAO,UAAU,MAAM,WAAW,IAAI,mCAAmC;AAAA,EACzF,EAAE,IAAI,UAAU,OAAO,UAAU,MAAM,WAAW,IAAI,mCAAmC;AAAA,EACzF,EAAE,IAAI,OAAO,OAAO,OAAO,MAAM,WAAW,IAAI,mCAAmC;AACrF;AAGO,IAAM,mBAAoC;AAAA,EAC/C,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,cAAc;AAAA,EACd,qBAAqB;AACvB;AAGO,IAAM,uBAAsE;AAAA,EACjF,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,UAAU;AACZ;AAGO,IAAM,uBAAuB;AAC7B,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;AAG7B,IAAM,iBAAiB;AACvB,IAAM,WAAW;AAGxB,IAAM,0BAA0B;AAQhC,SAAS,qBAA6B;AACpC,QAAM,cAAwB,CAAC;AAC/B,QAAM,WAAqB,CAAC;AAC5B,QAAM,SAAmB,CAAC;AAE1B,aAAW,SAAS,eAAe;AACjC,gBAAY;AAAA,MACV,gCAAgC,MAAM,EAAE,oCAAoC,MAAM,IAAI;AAAA,IACxF;AACA,aAAS,KAAK,0BAA0B,MAAM,EAAE,IAAI,MAAM,IAAI,GAAG;AACjE,WAAO,KAAK,0BAA0B,MAAM,EAAE,IAAI,MAAM,EAAE,GAAG;AAAA,EAC/D;AAEA,QAAM,WAAW,cAAc;AAAA,IAC7B,CAAC,UACC,gCAAgC,MAAM,EAAE,oCAAoC,MAAM,EAAE;AAAA,EACxF,EAAE,KAAK,EAAE;AAET,SAAO;AAAA,IACL,SAAS,SAAS,KAAK,EAAE,CAAC;AAAA,IAC1B,YAAY,KAAK,EAAE;AAAA,IACnB;AAAA,IACA,SAAS,OAAO,KAAK,EAAE,CAAC;AAAA,IACxB;AAAA,IACA;AAAA,EACF,EAAE,KAAK,EAAE;AACX;AAOO,SAAS,iCAAuC;AACrD,MAAI,OAAO,aAAa,aAAa;AACnC;AAAA,EACF;AACA,MAAI,SAAS,eAAe,uBAAuB,GAAG;AACpD;AAAA,EACF;AAEA,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK;AACX,QAAM,cAAc,mBAAmB;AACvC,WAAS,KAAK,YAAY,KAAK;AACjC;AAOO,SAAS,sBAAuC;AACrD,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,EAAE,GAAG,iBAAiB;AAAA,EAC/B;AACA,MAAI,SAA0B,EAAE,GAAG,iBAAiB;AACpD,MAAI;AACF,UAAM,MAAM,OAAO,aAAa,QAAQ,oBAAoB;AAC5D,QAAI,KAAK;AACP,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAI,UAAU,OAAO,WAAW,UAAU;AACxC,iBAAS,EAAE,GAAG,QAAQ,GAAI,OAAoC;AAAA,MAChE;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,QAAQ,cAAc,KAAK,CAAC,UAAU,MAAM,OAAO,OAAO,iBAAiB;AACjF,MAAI,CAAC,OAAO;AACV,WAAO,oBAAoB,iBAAiB;AAAA,EAC9C;AACA,SAAO;AACT;AAGO,SAAS,oBAAoB,UAAiC;AACnE,MAAI,OAAO,WAAW,aAAa;AACjC;AAAA,EACF;AACA,MAAI;AACF,WAAO,aAAa,QAAQ,sBAAsB,KAAK,UAAU,QAAQ,CAAC;AAAA,EAC5E,QAAQ;AAAA,EAER;AACF;;;ACjKA,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAMC,wBAAuB;AAG7B,IAAM,sBACX;AAGK,IAAM,uBACX;AAGK,SAAS,eAAe,MAAmC;AAChE,MAAI,EAAE,gBAAgB,UAAU;AAC9B,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,KAAK,QAAQ,mBAAmB,CAAC;AAClD;AAGO,SAAS,aAAa,SAA2B;AACtD,MAAK,QAAwB,mBAAmB;AAC9C,WAAO;AAAA,EACT;AACA,SAAO,iBAAiB,IAAI,QAAQ,QAAQ,YAAY,CAAC;AAC3D;AAMO,SAAS,qBAAqB,GAAW,GAA2B;AACzE,MAAI,OAA8B;AAClC,MAAI,QAAwB;AAE5B,WAAS,QAAQ,GAAG,QAAQ,IAAI,SAAS,GAAG;AAC1C,UAAM,YAA4B,KAAK,iBAAiB,GAAG,CAAC;AAC5D,QAAI,CAAC,aAAa,cAAc,OAAO;AACrC;AAAA,IACF;AACA,YAAQ;AACR,UAAM,SACH,UAA2D,cAC5D;AACF,QAAI,QAAQ;AACV,aAAO;AAAA,IACT,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,eAAe,SAAkC;AAC/D,MAAI,UAA0B;AAC9B,MAAI,QAAQ;AACZ,SAAO,WAAW,QAAQ,IAAI;AAC5B,UAAM,WAAW,OAAO,iBAAiB,OAAO,EAAE;AAClD,QAAI,aAAa,WAAW,aAAa,UAAU;AACjD,aAAO;AAAA,IACT;AACA,UAAM,SAAS,QAAQ;AACvB,QAAI,QAAQ;AACV,gBAAU;AAAA,IACZ,OAAO;AACL,YAAM,OAAO,QAAQ,YAAY;AACjC,gBAAU,gBAAgB,aAAa,KAAK,OAAO;AAAA,IACrD;AACA,aAAS;AAAA,EACX;AACA,SAAO;AACT;AAGO,SAAS,iBAAyB;AACvC,QAAM,YAAY,QAAQA,qBAAoB,SAASA,qBAAoB;AAC3E,QAAM,gBAAgB;AAAA,IACpB,GAAG,MAAM,KAAK,gBAAgB,EAAE,IAAI,CAAC,QAAQ,GAAG,GAAG,GAAG,SAAS,EAAE;AAAA,IACjE,oBAAoB,SAAS;AAAA,EAC/B,EAAE,KAAK,GAAG;AACV,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,GAAG,aAAa;AAAA,EAClB,EAAE,KAAK,EAAE;AACX;AAgBO,SAAS,MAAM,OAAe,KAAa,KAAqB;AACrE,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;AAGO,SAAS,SAAiB;AAC/B,SAAO,KAAK,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC/E;AAMO,SAAS,UAAU,MAAe,cAA4B;AACnE,SAAO;AAAA,IACL,GAAG,KAAK,QAAQ,eAAe,OAAO,UAAU;AAAA,IAChD,GAAG,KAAK,OAAO,eAAe,OAAO,UAAU;AAAA,IAC/C,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,EACf;AACF;AAGO,SAAS,WAAW,OAA0B;AACnD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,aAAW,OAAO,OAAO;AACvB,WAAO,KAAK,IAAI,MAAM,IAAI,CAAC;AAC3B,WAAO,KAAK,IAAI,MAAM,IAAI,CAAC;AAC3B,WAAO,KAAK,IAAI,MAAM,IAAI,IAAI,IAAI,KAAK;AACvC,WAAO,KAAK,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM;AAAA,EAC1C;AACA,SAAO,EAAE,GAAG,MAAM,GAAG,MAAM,OAAO,OAAO,MAAM,QAAQ,OAAO,KAAK;AACrE;;;A1B2nDM,SA2EI,YAAAC,WA3EJ,OAAAC,MAiGU,QAAAC,aAjGV;AAhoDN,IAAI,6BAA6B;AAEjC,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AACvB,IAAM,yBAAyB;AA2C/B,+BAA+B;AAG/B,SAAS,iBAAiB,UAA+C;AACvE,MAAI,CAAC,SAAS,cAAc;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,YAAY,eAAe,QAAQ,KAAK,aAAa,eAAe;AAC7E,WAAO,qBAAqB,SAAS,YAAY;AAAA,EACnD;AACA,SAAO;AACT;AAGA,SAAS,uBAAuB,YAAiC;AAC/D,SAAO,WAAW,WAAW,cAAc,WAAW,WAAW;AACnE;AAGA,SAAS,eAAwB;AAC/B,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,MAAM,OAAO,aAAa,QAAQ,iBAAiB;AACzD,WAAO,QAAQ,OAAO,OAAO,QAAQ;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,sBAAuD;AAC9D,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,MAAM,OAAO,aAAa,QAAQ,oBAAoB;AAC5D,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AACA,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QACE,UACA,OAAO,OAAO,MAAM,YACpB,OAAO,OAAO,MAAM,UACpB;AACA,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAMO,SAAS,uBACd,QAAqC,CAAC,GACZ;AAC1B,QAAM;AAAA,IACJ;AAAA,IACA,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAGJ,QAAM,uBAAuB,QAAQ,mBAAmB,WAAW,mBAAmB,OAAO;AAC7F,QAAM,uBAAuB;AAAA,IAC3B,mBAAmB,YAAY,mBAAmB,SAAS,mBAAmB;AAAA,EAChF;AACA,QAAM,uBAAuB;AAAA,IAC3B,mBAAmB,WAAW,mBAAmB;AAAA,EACnD;AACA,QAAM,qBAAqB,QAAQ,mBAAmB,cAAc;AAEpE,QAAM,CAAC,eAAe,gBAAgB,IAAIC;AAAA,IACxC,MAAM,wBAAwB,QAAQ,mBAAmB,oBAAoB;AAAA,EAC/E;AACA,QAAM,CAAC,eAAe,gBAAgB,IAAIA;AAAA,IACxC,MAAM,wBAAwB,QAAQ,mBAAmB,oBAAoB;AAAA,EAC/E;AACA,QAAM,CAAC,qBAAqB,sBAAsB,IAAIA;AAAA,IACpD,MAAM,wBAAwB,QAAQ,mBAAmB,0BAA0B;AAAA,EACrF;AAGA,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,KAAK;AAE5D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAuB,CAAC,CAAC;AAC/D,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,IAAI;AAEnD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAA2B,IAAI;AACjE,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAmC;AAAA,IAC3E,GAAG;AAAA,IACH,GAAG;AAAA,EACL,CAAC;AAED,QAAM,CAAC,mBAAmB,oBAAoB,IAC5CA,UAAmC,IAAI;AACzC,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,KAAK;AAC1D,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA;AAAA,IAChD;AAAA,EACF;AACA,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AAEpD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAwB,IAAI;AAC1E,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAwB,IAAI;AAC5E,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAwB,IAAI;AACpE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA;AAAA,IAC5C,MAAM,oBAAI,IAAI;AAAA,EAChB;AACA,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA;AAAA,IAC1C,MAAM,oBAAI,IAAI;AAAA,EAChB;AAEA,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,KAAK;AAC1C,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAoB,MAAM;AAC5D,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAElD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AAEpD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,qBAAqB,sBAAsB,IAAIA,UAAS,KAAK;AACpE,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAuB,QAAQ;AACvE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,EAAE;AACjD,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,EAAE;AAC7D,QAAM,CAAC,kBAAkB,mBAAmB,IAC1CA,UAA6C,IAAI;AACnD,QAAM,CAAC,uBAAuB,wBAAwB,IAAIA,UAExD,IAAI;AAGN,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAwB,IAAI;AAClE,QAAM,CAAC,uBAAuB,wBAAwB,IAAIA,UAAS,KAAK;AAExE,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,UAAS,KAAK;AAC1D,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,UAAS,KAAK;AAEtE,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAElD,CAAC,CAAC;AAEJ,QAAM,CAAC,UAAU,WAAW,IAAIA;AAAA,IAA0B,MACxD,oBAAoB;AAAA,EACtB;AACA,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,IAAI;AACjD,QAAM,CAAC,wBAAwB,yBAAyB,IAAIA,UAAS,KAAK;AAC1E,QAAM,CAAC,uBAAuB,wBAAwB,IAAIA,UAAS,KAAK;AAExE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAGpC,IAAI;AACd,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,KAAK;AAEhE,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAGlD,QAAM,mBAAmBC,QAA8B,IAAI;AAC3D,QAAM,WAAWA,QAAwC,IAAI;AAC7D,QAAM,eAAeA,QAAwC,IAAI;AACjE,QAAM,yBAAyBA,QAAsB,IAAI;AACzD,QAAM,mBAAmBA,QAAsB,IAAI;AACnD,QAAM,mBAAmBA,QAAyC;AAAA,IAChE,KAAK;AAAA,IACL,OAAO;AAAA,EACT,CAAC;AACD,QAAM,sBAAsBA,QAAO,KAAK;AACxC,QAAM,6BAA6BA,QAAO,KAAK;AAG/C,QAAM,kBAAkBA,QAAwC,IAAI;AACpE,QAAM,eAAeA,QAAwC,IAAI;AACjE,QAAM,cAAcA,QAA8B,IAAI;AACtD,QAAM,yBAAyBA,QAA8B,IAAI;AAGjE,QAAM,sBAAsBA,QAKlB,IAAI;AAEd,QAAM,iBAAiBA,QAAqB,WAAW;AACvD,iBAAe,UAAU;AAEzB,QAAM,WAAW,OAAO,WAAW,cAAc,OAAO,SAAS,WAAW;AAK5E,QAAM,iBAAiB,YAAY,SAAS;AAC5C,QAAM,sBACJ,QAAQ,cAAc,SAAS,KAAK,OAAO,aAAa;AAC1D,QAAM,YAAY,kBAAkB;AAEpC,QAAM,YAAY,iBAAiB,QAAQ;AAE3C,QAAM,qBAAqB,YAAY;AAAA,IACrC,CAAC,eAAe,CAAC,eAAe,IAAI,WAAW,EAAE;AAAA,EACnD;AACA,QAAM,oBAAoB,YAAY;AAKtC,QAAM,qBAAqBC;AAAA,IACzB,CAAC,SAAuB;AACtB,UAAI,OAAO,WAAW,aAAa;AACjC;AAAA,MACF;AACA,UAAI,KAAK,WAAW,GAAG;AACrB,YAAI;AACF,iBAAO,aAAa,WAAW,cAAc,QAAQ,CAAC;AAAA,QACxD,QAAQ;AAAA,QAER;AACA;AAAA,MACF;AACA,sBAAgB,UAAU,IAAI;AAAA,IAChC;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAKA,EAAAC,WAAU,MAAM;AACd,eAAW,IAAI;AAGf,sBAAkB,KAAK;AACvB,uBAAmB,KAAK;AACxB,kBAAc,aAAa,CAAC;AAC5B,uBAAmB,oBAAoB,CAAC;AAExC,UAAM,SAAS,gBAAgB,QAAQ,EAAE,OAAO,sBAAsB;AACtE,mBAAe,MAAM;AACrB,QAAI,OAAO,SAAS,GAAG;AACrB,yBAAmB,IAAI,IAAI,OAAO,IAAI,CAAC,eAAe,WAAW,EAAE,CAAC,CAAC;AAAA,IACvE;AAEA,QAAI,CAAC,4BAA4B;AAC/B,mCAA6B;AAC7B,+BAAyB,IAAI;AAC7B,aAAO,WAAW,MAAM,yBAAyB,KAAK,GAAG,GAAG;AAAA,IAC9D;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AACA,wBAAoB,QAAQ;AAAA,EAC9B,GAAG,CAAC,UAAU,OAAO,CAAC;AAEtB,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,OAAO,WAAW,aAAa;AAC7C;AAAA,IACF;AACA,QAAI;AACF,aAAO,aAAa;AAAA,QAClB;AAAA,QACA,aAAa,SAAS;AAAA,MACxB;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,YAAY,OAAO,CAAC;AAKxB,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,YAAY,OAAO,aAAa,aAAa;AAChD;AAAA,IACF;AACA,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,KAAK;AACX,UAAM,cAAc,eAAe;AACnC,aAAS,KAAK,YAAY,KAAK;AAC/B,WAAO,MAAM;AACX,YAAM,OAAO;AAAA,IACf;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAKb,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AACA,UAAM,WAAW,MAAM;AACrB,qBAAe,IAAI;AACnB,UAAI,iBAAiB,SAAS;AAC5B,eAAO,aAAa,iBAAiB,OAAO;AAAA,MAC9C;AACA,uBAAiB,UAAU,OAAO;AAAA,QAChC,MAAM,eAAe,KAAK;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AACA,WAAO,iBAAiB,UAAU,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7D,WAAO,MAAM,OAAO,oBAAoB,UAAU,QAAQ;AAAA,EAC5D,GAAG,CAAC,QAAQ,CAAC;AAKb,QAAM,oBAAoBD;AAAA,IACxB,CAAC,SAAuB;AACtB,qBAAe,IAAI;AACnB,yBAAmB,IAAI;AAAA,IACzB;AAAA,IACA,CAAC,kBAAkB;AAAA,EACrB;AAEA,QAAM,gBAAgBA;AAAA,IACpB,CAAC,eAA2B;AAC1B,YAAM,OAAO,CAAC,GAAG,eAAe,SAAS,UAAU;AACnD,wBAAkB,IAAI;AACtB,yBAAmB,CAAC,SAAS;AAC3B,cAAM,UAAU,IAAI,IAAI,IAAI;AAC5B,gBAAQ,IAAI,WAAW,EAAE;AACzB,eAAO;AAAA,MACT,CAAC;AACD,wBAAkB,UAAU;AAAA,IAC9B;AAAA,IACA,CAAC,mBAAmB,eAAe;AAAA,EACrC;AAEA,QAAM,0BAA0BA;AAAA,IAC9B,CAAC,QAAoB,eAAuB;AAC1C,YAAM,UAAsB,EAAE,GAAG,QAAQ,SAAS,WAAW;AAC7D,YAAM,OAAO,eAAe,QAAQ;AAAA,QAAI,CAAC,UACvC,MAAM,OAAO,OAAO,KAAK,UAAU;AAAA,MACrC;AACA,wBAAkB,IAAI;AACtB,2BAAqB,OAAO;AAAA,IAC9B;AAAA,IACA,CAAC,mBAAmB,kBAAkB;AAAA,EACxC;AAEA,QAAM,mBAAmBA;AAAA,IACvB,CAAC,WAAuB;AACtB,YAAM,QAAQ,eAAe,QAAQ;AAAA,QACnC,CAAC,UAAU,MAAM,OAAO,OAAO;AAAA,MACjC;AACA,0BAAoB,OAAO,EAAE;AAC7B,wBAAkB,CAAC,SAAS;AAC1B,cAAM,UAAU,IAAI,IAAI,IAAI;AAC5B,gBAAQ,IAAI,OAAO,EAAE;AACrB,eAAO;AAAA,MACT,CAAC;AACD,UAAI,SAAS,GAAG;AACd,wBAAgB,KAAK;AAAA,MACvB;AAEA,aAAO,WAAW,MAAM;AACtB,cAAM,OAAO,eAAe,QAAQ;AAAA,UAClC,CAAC,UAAU,MAAM,OAAO,OAAO;AAAA,QACjC;AACA,0BAAkB,IAAI;AACtB,0BAAkB,CAAC,SAAS;AAC1B,gBAAM,UAAU,IAAI,IAAI,IAAI;AAC5B,kBAAQ,OAAO,OAAO,EAAE;AACxB,iBAAO;AAAA,QACT,CAAC;AACD,4BAAoB,IAAI;AACxB,wBAAgB,IAAI;AAAA,MACtB,GAAG,GAAG;AAEN,2BAAqB,MAAM;AAAA,IAC7B;AAAA,IACA,CAAC,mBAAmB,kBAAkB;AAAA,EACxC;AAEA,QAAM,WAAWA,aAAY,MAAM;AACjC,QAAI,eAAe,QAAQ,WAAW,GAAG;AACvC;AAAA,IACF;AACA,UAAM,UAAU,eAAe;AAC/B,kBAAc,IAAI;AAClB,WAAO,WAAW,MAAM;AACtB,wBAAkB,CAAC,CAAC;AACpB,yBAAmB,oBAAI,IAAI,CAAC;AAC5B,wBAAkB,oBAAI,IAAI,CAAC;AAC3B,oBAAc,KAAK;AAAA,IACrB,GAAG,GAAG;AAEN,yBAAqB,OAAO;AAAA,EAC9B,GAAG,CAAC,mBAAmB,kBAAkB,CAAC;AAK1C,QAAM,aAAaA,aAAY,MAAM;AACnC,gBAAY,KAAK;AAAA,EACnB,GAAG,CAAC,CAAC;AAEL,EAAAC,WAAU,MAAM;AACd,QAAI,UAAU;AACZ;AAAA,IACF;AACA,yBAAqB,IAAI;AACzB,sBAAkB,KAAK;AACvB,yBAAqB,IAAI;AACzB,mBAAe,KAAK;AACpB,iBAAa,IAAI;AACjB,oBAAgB,KAAK;AACrB,2BAAuB,KAAK;AAC5B,0BAAsB,CAAC,CAAC;AACxB,QAAI,UAAU;AACZ,eAAY;AACZ,kBAAY,KAAK;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,UAAU,QAAQ,CAAC;AAKvB,QAAM,0BAA0BD;AAAA,IAC9B,CACE,SACA,SACA,YACsB;AACtB,YAAM,EAAE,MAAM,KAAK,IAAI,gBAAgB,OAAO;AAC9C,YAAM,QAAQ,eAAe,OAAO;AACpC,YAAM,OAAO,QAAQ,sBAAsB;AAE3C,UAAI;AACJ,YAAM,YACJ,OAAO,WAAW,cAAc,OAAO,aAAa,IAAI;AAC1D,YAAM,gBAAgB,WAAW,SAAS,EAAE,KAAK;AACjD,UAAI,eAAe;AACjB,uBAAe,cAAc,MAAM,GAAG,GAAG;AAAA,MAC3C;AAEA,UAAI;AACJ,UAAI,cAAc,OAAO;AACvB,cAAM,OAAO,sBAAsB,SAAS,EAAE,MAAM,UAAU,CAAC;AAC/D,0BAAkB,KAAK,QAAQ;AAAA,MACjC;AAEA,UAAI;AACJ,YAAM,eAAe,2BAA2B,OAAO;AACvD,UAAI,aAAa,SAAS,aAAa,QAAQ;AAC7C,qBAAa,qBAAqB,aAAa,MAAM;AAAA,MACvD;AAEA,aAAO;AAAA,QACL,GAAI,UAAU,OAAO,aAAc;AAAA,QACnC,GAAG,QAAQ,UAAU,UAAU,OAAO;AAAA,QACtC;AAAA,QACA,SAAS;AAAA,QACT,aAAa;AAAA,QACb;AAAA,QACA,aAAa,UAAU,MAAM,CAAC,KAAK;AAAA,QACnC,YAAY,cAAc,OAAO;AAAA,QACjC,YAAY,kBAAkB,OAAO;AAAA,QACrC,SAAS;AAAA,QACT,UAAU,mBAAmB,OAAO;AAAA,QACpC,eAAe,qBAAqB,OAAO;AAAA,QAC3C,gBAAgB,0BAA0B,OAAO;AAAA,QACjD,mBAAmB,0BAA0B,OAAO;AAAA,QACpD,gBAAgB,kBAAkB,OAAO;AAAA,QACzC;AAAA,QACA;AAAA,QACA,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAGA,QAAM,qCAAqCA;AAAA,IACzC,CAAC,YAAgC;AAC/B,UAAI,QAAQ,WAAW,GAAG;AACxB;AAAA,MACF;AACA,UAAI,QAAQ,WAAW,GAAG;AACxB,cAAM,OAAO,QAAQ,CAAC;AACtB,cAAME,QAAO,KAAK;AAClB,cAAM,UAAUA,MAAK,OAAOA,MAAK,QAAQ;AACzC,cAAM,UAAUA,MAAK,MAAMA,MAAK,SAAS;AACzC;AAAA,UACE,wBAAwB,KAAK,SAAS,SAAS,OAAO;AAAA,QACxD;AACA;AAAA,MACF;AAEA,YAAM,SAAS,QAAQ,QAAQ,SAAS,CAAC;AACzC,YAAM,QAAQ,QAAQ;AAAA,QAAI,CAAC,UACzB,UAAU,MAAM,MAAM,CAAC,eAAe,MAAM,OAAO,CAAC;AAAA,MACtD;AACA,YAAM,WAAW,WAAW,KAAK;AACjC,YAAM,OAAO,OAAO;AACpB,YAAM,QAAQ,eAAe,OAAO,OAAO;AAE3C,YAAM,QAAQ,QAAQ,IAAI,CAAC,UAAU,MAAM,IAAI;AAC/C,YAAM,OAAO,MAAM,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AACxC,YAAM,YAAY,MAAM,SAAS;AACjC,YAAM,QACJ,YAAY,IACR,GAAG,QAAQ,MAAM,cAAc,IAAI,KAAK,SAAS,UACjD,GAAG,QAAQ,MAAM,cAAc,IAAI;AAEzC,YAAM,OAAO;AAAA,QACX,OAAO;AAAA,QACP,KAAK,OAAO,KAAK,QAAQ;AAAA,QACzB,KAAK,MAAM,KAAK,SAAS;AAAA,MAC3B;AAEA,2BAAqB;AAAA,QACnB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,eAAe;AAAA,QACf,SAAS;AAAA,QACT,aAAa,YAAY,KAAK;AAAA,QAC9B,sBAAsB;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,IACA,CAAC,uBAAuB;AAAA,EAC1B;AAKA,EAAAD,WAAU,MAAM;AACd,QAAI,CAAC,YAAY,qBAAqB,YAAY;AAChD;AAAA,IACF;AACA,UAAM,SAAS,CAAC,UAAsB;AACpC,UAAI,aAAa;AACf;AAAA,MACF;AACA,YAAM,WAAW,MAAM,aAAa,EAAE,CAAC;AACvC,UAAI,UACF,oBAAoB,UAAU,WAAW;AAC3C,UAAI,CAAC,SAAS;AACZ,kBAAU,qBAAqB,MAAM,SAAS,MAAM,OAAO;AAAA,MAC7D;AACA,UAAI,CAAC,WAAW,eAAe,OAAO,GAAG;AACvC,qBAAa,IAAI;AACjB;AAAA,MACF;AAEA,YAAM,SAAS;AACf,YAAM,EAAE,MAAM,KAAK,IAAI,gBAAgB,MAAM;AAC7C,UAAI,kBAAiC;AACrC,UAAI,cAAc,OAAO;AACvB,cAAM,OAAO,sBAAsB,QAAQ,EAAE,MAAM,UAAU,CAAC;AAC9D,0BAAkB,KAAK;AAAA,MACzB;AAEA,mBAAa;AAAA,QACX,aAAa;AAAA,QACb,aAAa;AAAA,QACb,MAAM,OAAO,sBAAsB;AAAA,QACnC;AAAA,MACF,CAAC;AACD,uBAAiB,EAAE,GAAG,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC;AAAA,IACzD;AAEA,aAAS,iBAAiB,aAAa,MAAM;AAC7C,WAAO,MAAM,SAAS,oBAAoB,aAAa,MAAM;AAAA,EAC/D,GAAG,CAAC,UAAU,mBAAmB,YAAY,aAAa,SAAS,CAAC;AAKpE,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AACA,UAAM,UAAU,CAAC,UAAsB;AACrC,YAAM,SAAS,MAAM;AACrB,UAAI,UAAU,eAAe,MAAM,GAAG;AACpC;AAAA,MACF;AACA,UAAI,oBAAoB,SAAS;AAC/B,4BAAoB,UAAU;AAC9B;AAAA,MACF;AAEA,UAAI,iBAAiB,QAAQ,OAAO,iBAAiB,QAAQ,OAAO;AAClE;AAAA,MACF;AAGA,UAAI,mBAAmB;AACrB,cAAM,eAAe;AACrB,cAAM,gBAAgB;AACtB,iBAAS,SAAS,MAAM;AACxB;AAAA,MACF;AACA,UAAI,mBAAmB;AACrB,cAAM,eAAe;AACrB,cAAM,gBAAgB;AACtB,qBAAa,SAAS,MAAM;AAC5B;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,aAAa,EAAE,CAAC;AACvC,UAAI,UACF,oBAAoB,UAAU,WAAW;AAC3C,UAAI,CAAC,SAAS;AACZ,kBAAU,qBAAqB,MAAM,SAAS,MAAM,OAAO;AAAA,MAC7D;AACA,UAAI,CAAC,WAAW,eAAe,OAAO,GAAG;AACvC;AAAA,MACF;AAEA,UAAI,QAAQ,QAAQ,oBAAoB,GAAG;AACzC,cAAM,eAAe;AACrB,cAAM,gBAAgB;AAAA,MACxB;AAEA,mBAAa,IAAI;AACjB;AAAA,QACE;AAAA,UACE;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,aAAS,iBAAiB,SAAS,SAAS,IAAI;AAChD,WAAO,MAAM,SAAS,oBAAoB,SAAS,SAAS,IAAI;AAAA,EAClE,GAAG,CAAC,UAAU,mBAAmB,mBAAmB,uBAAuB,CAAC;AAK5E,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,YAAY,qBAAqB,mBAAmB;AACvD;AAAA,IACF;AAEA,UAAM,cAAc,CAAC,UAAsB;AACzC,UAAI,MAAM,WAAW,GAAG;AACtB;AAAA,MACF;AACA,YAAM,SAAS,MAAM;AACrB,UAAI,CAAC,UAAU,eAAe,MAAM,GAAG;AACrC;AAAA,MACF;AACA,UAAI,aAAa,MAAM,GAAG;AACxB;AAAA,MACF;AACA,UAAI,iBAAiB,QAAQ,OAAO,iBAAiB,QAAQ,OAAO;AAClE;AAAA,MACF;AACA,sBAAgB,UAAU,EAAE,GAAG,MAAM,SAAS,GAAG,MAAM,QAAQ;AAC/D,YAAM,eAAe;AAAA,IACvB;AAEA,UAAM,cAAc,CAAC,UAAsB;AACzC,YAAM,QAAQ,gBAAgB;AAC9B,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AACA,YAAM,KAAK,MAAM,UAAU,MAAM;AACjC,YAAM,KAAK,MAAM,UAAU,MAAM;AACjC,UAAI,CAAC,cAAc,KAAK,MAAM,IAAI,EAAE,IAAI,gBAAgB;AACtD;AAAA,MACF;AACA,UAAI,CAAC,YAAY;AACf,sBAAc,IAAI;AAClB,qBAAa,UAAU;AAAA,MACzB;AAEA,YAAM,KAAK,aAAa,SAAS,KAAK,MAAM;AAC5C,YAAM,KAAK,aAAa,SAAS,KAAK,MAAM;AAC5C,YAAM,OAAO,KAAK,IAAI,IAAI,MAAM,OAAO;AACvC,YAAM,MAAM,KAAK,IAAI,IAAI,MAAM,OAAO;AACtC,YAAM,QAAQ,KAAK,IAAI,MAAM,UAAU,EAAE;AACzC,YAAM,SAAS,KAAK,IAAI,MAAM,UAAU,EAAE;AAC1C,UAAI,YAAY,SAAS;AACvB,oBAAY,QAAQ,MAAM,YAAY,aAAa,IAAI,OAAO,GAAG;AACjE,oBAAY,QAAQ,MAAM,QAAQ,GAAG,KAAK;AAC1C,oBAAY,QAAQ,MAAM,SAAS,GAAG,MAAM;AAAA,MAC9C;AAAA,IACF;AAEA,UAAM,YAAY,CAAC,UAAsB;AACvC,YAAM,QAAQ,aAAa,WAAW,gBAAgB;AACtD,sBAAgB,UAAU;AAE1B,UAAI,CAAC,cAAc,CAAC,OAAO;AACzB,qBAAa,UAAU;AACvB;AAAA,MACF;AAEA,YAAM,OAAO,KAAK,IAAI,MAAM,GAAG,MAAM,OAAO;AAC5C,YAAM,MAAM,KAAK,IAAI,MAAM,GAAG,MAAM,OAAO;AAC3C,YAAM,QAAQ,KAAK,IAAI,MAAM,UAAU,MAAM,CAAC;AAC9C,YAAM,SAAS,KAAK,IAAI,MAAM,UAAU,MAAM,CAAC;AAE/C,oBAAc,KAAK;AACnB,mBAAa,UAAU;AACvB,0BAAoB,UAAU;AAE9B,YAAM,aAAa,MAAM;AAAA,QACvB,SAAS;AAAA,UACP;AAAA,QACF;AAAA,MACF,EAAE,OAAO,CAAC,OAAO;AACf,YAAI,eAAe,EAAE,GAAG;AACtB,iBAAO;AAAA,QACT;AACA,cAAM,OAAO,GAAG,sBAAsB;AACtC,eACE,KAAK,OAAO,OAAO,SACnB,KAAK,QAAQ,QACb,KAAK,MAAM,MAAM,UACjB,KAAK,SAAS;AAAA,MAElB,CAAC;AAGD,YAAM,WAAW,WAAW;AAAA,QAC1B,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,UAAU,UAAU,MAAM,GAAG,SAAS,KAAK,CAAC;AAAA,MACxE;AAEA,UAAI,SAAS,SAAS,GAAG;AACvB,cAAM,UAA8B,SAAS,IAAI,CAAC,OAAO;AACvD,gBAAM,EAAE,MAAM,KAAK,IAAI,gBAAgB,EAAE;AACzC,iBAAO,EAAE,SAAS,IAAI,MAAM,GAAG,sBAAsB,GAAG,MAAM,KAAK;AAAA,QACrE,CAAC;AACD,2CAAmC,OAAO;AAAA,MAC5C,WAAW,QAAQ,MAAM,SAAS,IAAI;AACpC,6BAAqB;AAAA,UACnB,IAAK,OAAO,QAAQ,KAAK,OAAO,aAAc;AAAA,UAC9C,GAAG,MAAM,SAAS,IAAI,OAAO;AAAA,UAC7B,SAAS,MAAM,SAAS;AAAA,UACxB,SAAS;AAAA,UACT,aAAa;AAAA,UACb,eAAe;AAAA,UACf,aAAa;AAAA,YACX,GAAG,OAAO,OAAO;AAAA,YACjB,GAAG,MAAM,OAAO;AAAA,YAChB;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,aAAa,IAAI;AACxD,aAAS,iBAAiB,aAAa,WAAW;AAClD,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,aAAa,IAAI;AAC3D,eAAS,oBAAoB,aAAa,WAAW;AACrD,eAAS,oBAAoB,WAAW,SAAS;AAAA,IACnD;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAKD,EAAAA,WAAU,MAAM;AACd,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,UAAM,iBAAiB,CAAC,UAAsB;AAC5C,UAAI,EAAE,iBAAiB,QAAQ,OAAO,iBAAiB,QAAQ,QAAQ;AACrE;AAAA,MACF;AACA,YAAM,SAAS,MAAM;AACrB,UAAI,CAAC,UAAU,eAAe,MAAM,GAAG;AACrC;AAAA,MACF;AACA,YAAM,eAAe;AACrB,YAAM,gBAAgB;AAEtB,YAAM,UAAU;AAChB,YAAM,EAAE,MAAM,KAAK,IAAI,gBAAgB,OAAO;AAC9C,4BAAsB,CAAC,SAAS;AAC9B,cAAM,WAAW,KAAK,UAAU,CAAC,UAAU,MAAM,YAAY,OAAO;AACpE,YAAI,YAAY,GAAG;AACjB,iBAAO,KAAK,OAAO,CAAC,GAAG,QAAQ,QAAQ,QAAQ;AAAA,QACjD;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,EAAE,SAAS,MAAM,QAAQ,sBAAsB,GAAG,MAAM,KAAK;AAAA,QAC/D;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,CAAC,UAAyB;AACxC,UAAI,MAAM,QAAQ,UAAU,MAAM,QAAQ,WAAW;AACnD,yBAAiB,QAAQ,MAAM;AAAA,MACjC;AACA,UAAI,MAAM,QAAQ,SAAS;AACzB,yBAAiB,QAAQ,QAAQ;AAAA,MACnC;AACA,WACG,CAAC,iBAAiB,QAAQ,OAAO,CAAC,iBAAiB,QAAQ,UAC5D,mBAAmB,UAAU,GAC7B;AACA,2CAAmC,kBAAkB;AACrD,8BAAsB,CAAC,CAAC;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,SAAS,MAAM;AACnB,4BAAsB,CAAC,CAAC;AACxB,uBAAiB,QAAQ,MAAM;AAC/B,uBAAiB,QAAQ,QAAQ;AAAA,IACnC;AAEA,aAAS,iBAAiB,SAAS,gBAAgB,IAAI;AACvD,WAAO,iBAAiB,SAAS,OAAO;AACxC,WAAO,iBAAiB,QAAQ,MAAM;AACtC,WAAO,MAAM;AACX,eAAS,oBAAoB,SAAS,gBAAgB,IAAI;AAC1D,aAAO,oBAAoB,SAAS,OAAO;AAC3C,aAAO,oBAAoB,QAAQ,MAAM;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,UAAU,oBAAoB,kCAAkC,CAAC;AAKrE,QAAM,aAAaD,aAAY,MAAM;AACnC,QAAI,eAAe,QAAQ,WAAW,GAAG;AACvC;AAAA,IACF;AACA,UAAM,aACJ,OAAO,WAAW,cACd,OAAO,SAAS,WAChB,OAAO,SAAS,SAChB,OAAO,SAAS,OAChB;AACN,UAAM,WAAW;AAAA,MACf,eAAe;AAAA,MACf;AAAA,MACA,SAAS;AAAA,IACX;AACA,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,QAAI,oBAAoB,SAAS,UAAU,WAAW;AACpD,WAAK,UAAU,UAAU,UAAU,QAAQ,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC7D;AACA,aAAS,QAAQ;AACjB,cAAU,IAAI;AACd,WAAO,WAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,EAChD,GAAG,CAAC,SAAS,cAAc,iBAAiB,QAAQ,QAAQ,CAAC;AAE7D,QAAM,eAAeA,aAAY,MAAM;AACrC,gBAAY,CAAC,SAAS;AACpB,UAAI,MAAM;AACR,iBAAY;AACZ,eAAO;AAAA,MACT;AACA,aAAU;AACV,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkBA,aAAY,MAAM;AACxC,oBAAgB,QAAQ;AACxB,oBAAgB,IAAI;AACpB,2BAAuB,IAAI;AAAA,EAC7B,GAAG,CAAC,CAAC;AAEL,EAAAC,WAAU,MAAM;AACd,UAAM,YAAY,CAAC,UAAyB;AAC1C,YAAM,SAAS,MAAM;AACrB,YAAM,SACJ,kBAAkB,gBACjB,OAAO,YAAY,WAClB,OAAO,YAAY,cACnB,OAAO;AAEX,UAAI,MAAM,QAAQ,UAAU,MAAM,QAAQ,WAAW;AACnD,yBAAiB,QAAQ,MAAM;AAAA,MACjC;AACA,UAAI,MAAM,QAAQ,SAAS;AACzB,yBAAiB,QAAQ,QAAQ;AAAA,MACnC;AAGA,WACG,MAAM,WAAW,MAAM,YACxB,MAAM,aACL,MAAM,QAAQ,OAAO,MAAM,QAAQ,MACpC;AACA,cAAM,eAAe;AACrB,oBAAY,CAAC,SAAS,CAAC,IAAI;AAC3B;AAAA,MACF;AAEA,UAAI,QAAQ;AACV;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,UAAU;AAC1B,YAAI,mBAAmB,SAAS,GAAG;AACjC,gCAAsB,CAAC,CAAC;AACxB;AAAA,QACF;AACA,YAAI,mBAAmB;AACrB,4BAAkB,IAAI;AACtB,iBAAO,WAAW,MAAM;AACtB,iCAAqB,IAAI;AACzB,8BAAkB,KAAK;AAAA,UACzB,GAAG,GAAG;AACN;AAAA,QACF;AACA,YAAI,mBAAmB;AACrB,yBAAe,IAAI;AACnB,iBAAO,WAAW,MAAM;AACtB,iCAAqB,IAAI;AACzB,2BAAe,KAAK;AAAA,UACtB,GAAG,GAAG;AACN;AAAA,QACF;AACA,YAAI,UAAU;AACZ,qBAAW;AAAA,QACb;AACA;AAAA,MACF;AAGA,UAAI,MAAM,WAAW,MAAM,SAAS;AAClC;AAAA,MACF;AACA,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,OAAO,MAAM,QAAQ,KAAK;AAC1C,qBAAa;AAAA,MACf,WAAW,MAAM,QAAQ,OAAO,MAAM,QAAQ,KAAK;AACjD,YAAI,eAAe,QAAQ,SAAS,GAAG;AACrC,yBAAe,CAAC,SAAS,CAAC,IAAI;AAAA,QAChC;AAAA,MACF,WAAW,MAAM,QAAQ,OAAO,MAAM,QAAQ,KAAK;AACjD,YAAI,eAAe,QAAQ,SAAS,GAAG;AACrC,qBAAW;AAAA,QACb;AAAA,MACF,WAAW,MAAM,QAAQ,OAAO,MAAM,QAAQ,KAAK;AACjD,YAAI,eAAe,QAAQ,SAAS,GAAG;AACrC,mBAAS;AAAA,QACX;AAAA,MACF,WAAW,MAAM,QAAQ,OAAO,MAAM,QAAQ,KAAK;AACjD,YAAI,eAAe,QAAQ,SAAS,KAAK,cAAc,QAAQ;AAC7D,0BAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM,SAAS,oBAAoB,WAAW,SAAS;AAAA,EAChE,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAKD,EAAAA,WAAU,MAAM;AACd,QACE,CAAC,kBACD,CAAC,mBACD,gBAAgB,WAAW,KAC3B,eAAe,QAAQ,SAAS,GAChC;AACA;AAAA,IACF;AACA,UAAM,QAAQ,OAAO,WAAW,MAAM;AACpC,kBAAY,IAAI;AAChB,sBAAgB,QAAQ,CAAC,MAAM,UAAU;AACvC,eAAO,WAAW,MAAM;AACtB,gBAAM,UAAU,SAAS,cAA2B,KAAK,QAAQ;AACjE,cAAI,CAAC,SAAS;AACZ;AAAA,UACF;AACA,gBAAM,OAAO,QAAQ,sBAAsB;AAC3C,gBAAM,OAAO;AAAA,YACX;AAAA,YACA,KAAK,OAAO,KAAK,QAAQ;AAAA,YACzB,KAAK,MAAM,KAAK,SAAS;AAAA,UAC3B;AACA,wBAAc;AAAA,YACZ,IAAI,OAAO;AAAA,YACX,GAAG,KAAK;AAAA,YACR,GAAG,KAAK;AAAA,YACR,SAAS,KAAK;AAAA,YACd,SAAS,KAAK;AAAA,YACd,aAAa,KAAK;AAAA,YAClB,WAAW,KAAK,IAAI;AAAA,YACpB,cAAc,KAAK;AAAA,YACnB,aAAa,KAAK;AAAA,YAClB,SAAS,KAAK;AAAA,YACd,MAAM;AAAA,UACR,CAAC;AAAA,QACH,GAAG,QAAQ,GAAG;AAAA,MAChB,CAAC;AAAA,IACH,GAAG,SAAS;AACZ,WAAO,MAAM,OAAO,aAAa,KAAK;AAAA,EACxC,GAAG,CAAC,cAAc,CAAC;AAKnB,EAAAA,WAAU,MAAM;AACd,WAAO,MAAM;AACX,eAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,CAAC;AAKL,QAAM,uBAAuBD;AAAA,IAC3B,CAAC,SAAiB;AAChB,YAAM,UAAU;AAChB,UAAI,CAAC,SAAS;AACZ;AAAA,MACF;AACA,YAAM,aAAyB;AAAA,QAC7B,IAAI,OAAO;AAAA,QACX,GAAG,QAAQ;AAAA,QACX,GAAG,QAAQ;AAAA,QACX,SAAS;AAAA,QACT,SAAS,QAAQ;AAAA,QACjB,aAAa,QAAQ;AAAA,QACrB,WAAW,KAAK,IAAI;AAAA,QACpB,cAAc,QAAQ;AAAA,QACtB,aAAa,QAAQ;AAAA,QACrB,YAAY,QAAQ;AAAA,QACpB,YAAY,QAAQ;AAAA,QACpB,gBAAgB,QAAQ;AAAA,QACxB,gBAAgB,QAAQ;AAAA,QACxB,UAAU,QAAQ;AAAA,QAClB,eAAe,QAAQ;AAAA,QACvB,eAAe,QAAQ;AAAA,QACvB,SAAS,QAAQ;AAAA,QACjB,iBAAiB,QAAQ;AAAA,QACzB,YAAY,QAAQ;AAAA,QACpB,sBAAsB,QAAQ;AAAA,QAC9B,MAAM;AAAA,MACR;AACA,oBAAc,UAAU;AACxB,2BAAqB,IAAI;AAAA,IAC3B;AAAA,IACA,CAAC,mBAAmB,aAAa;AAAA,EACnC;AAEA,QAAM,gBAAgBA,aAAY,MAAM;AACtC,sBAAkB,IAAI;AACtB,WAAO,WAAW,MAAM;AACtB,2BAAqB,IAAI;AACzB,wBAAkB,KAAK;AAAA,IACzB,GAAG,GAAG;AAAA,EACR,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsBA,aAAY,CAAC,eAA2B;AAClE,yBAAqB,UAAU;AAAA,EACjC,GAAG,CAAC,CAAC;AAEL,QAAM,aAAaA;AAAA,IACjB,CAAC,SAAiB;AAChB,UAAI,CAAC,mBAAmB;AACtB;AAAA,MACF;AACA,8BAAwB,mBAAmB,IAAI;AAC/C,qBAAe,IAAI;AACnB,aAAO,WAAW,MAAM;AACtB,6BAAqB,IAAI;AACzB,uBAAe,KAAK;AAAA,MACtB,GAAG,GAAG;AAAA,IACR;AAAA,IACA,CAAC,mBAAmB,uBAAuB;AAAA,EAC7C;AAEA,QAAM,aAAaA,aAAY,MAAM;AACnC,mBAAe,IAAI;AACnB,WAAO,WAAW,MAAM;AACtB,2BAAqB,IAAI;AACzB,qBAAe,KAAK;AAAA,IACtB,GAAG,GAAG;AAAA,EACR,GAAG,CAAC,CAAC;AAEL,QAAM,gBAAgBA,aAAY,MAAM;AACtC,QAAI,CAAC,mBAAmB;AACtB;AAAA,IACF;AACA,UAAM,SAAS;AACf,mBAAe,IAAI;AACnB,WAAO,WAAW,MAAM;AACtB,2BAAqB,IAAI;AACzB,qBAAe,KAAK;AACpB,uBAAiB,MAAM;AAAA,IACzB,GAAG,GAAG;AAAA,EACR,GAAG,CAAC,mBAAmB,gBAAgB,CAAC;AAExC,QAAM,oBAAoBA;AAAA,IACxB,CAAC,eAA2B;AAC1B,YAAM,WAAgC,SAAS;AAC/C,UAAI,aAAa,UAAU;AACzB,yBAAiB,UAAU;AAAA,MAC7B,OAAO;AACL,4BAAoB,UAAU;AAAA,MAChC;AAAA,IACF;AAAA,IACA,CAAC,SAAS,qBAAqB,kBAAkB,mBAAmB;AAAA,EACtE;AAKA,QAAM,8BAA8BA,aAAY,YAAY;AAC1D,QAAI,OAAO,WAAW,aAAa;AACjC;AAAA,IACF;AACA,6BAAyB,IAAI;AAC7B,6BAAyB,IAAI;AAE7B,UAAM,OAAO,SAAS;AAAA,MACpB;AAAA,IACF;AACA,UAAM,iBAAiB,MAAM,MAAM,cAAc;AACjD,QAAI,MAAM;AACR,WAAK,MAAM,aAAa;AAAA,IAC1B;AAEA,UAAM,UAAU,MAAM;AACpB,UAAI,MAAM;AACR,aAAK,MAAM,aAAa;AAAA,MAC1B;AAAA,IACF;AAEA,QAAI;AACF,YAAM,QAAQ,UAAU;AACxB,UAAI,SAAS,OAAO,MAAM,oBAAoB,YAAY;AACxD,cAAM,SAAS,MAAM,MAAM,gBAAgB,EAAE,OAAO,KAAK,CAAC;AAE1D,cAAM,IAAI,QAAQ,CAAC,YAAY,OAAO,WAAW,SAAS,GAAG,CAAC;AAE9D,cAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,cAAM,YAAY;AAClB,cAAM,MAAM,KAAK,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAEjC,cAAM,UAAU,MAAM,cAAc,OAAO;AAC3C,cAAM,UAAU,MAAM,eAAe,OAAO;AAC5C,cAAM,eAAe;AACrB,cAAM,QAAQ,KAAK,IAAI,GAAG,eAAe,KAAK,IAAI,SAAS,OAAO,CAAC;AACnE,cAAM,QAAQ,KAAK,MAAM,UAAU,KAAK;AACxC,cAAM,SAAS,KAAK,MAAM,UAAU,KAAK;AAEzC,cAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,eAAO,QAAQ;AACf,eAAO,SAAS;AAChB,cAAM,MAAM,OAAO,WAAW,IAAI;AAClC,YAAI,KAAK;AACP,cAAI,UAAU,OAAO,GAAG,GAAG,OAAO,MAAM;AAAA,QAC1C;AACA,eAAO,UAAU,EAAE,QAAQ,CAAC,UAAU,MAAM,KAAK,CAAC;AAElD,cAAMG,WAAU,OAAO,UAAU,cAAc,GAAG;AAClD,4BAAoB;AAAA,UAClB,SAAAA;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA,YAAY,KAAK,IAAI;AAAA,QACvB,CAAC;AACD;AAAA,MACF;AAGA,YAAM,UAAU,MAAM;AAAA,QACpB;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,QACP,CAAC;AAAA,MACH;AACA,UAAI,SAAS;AACX,4BAAoB;AAAA,UAClB;AAAA,UACA,UAAU;AAAA,UACV,OAAO,OAAO;AAAA,UACd,QAAQ,OAAO;AAAA,UACf,YAAY,KAAK,IAAI;AAAA,QACvB,CAAC;AAAA,MACH,OAAO;AACL,iCAAyB,sCAAsC;AAAA,MACjE;AAAA,IACF,SAAS,OAAO;AACd,YAAM,OAAQ,OAAoC,QAAQ;AAC1D,UAAI,SAAS,qBAAqB,SAAS,cAAc;AACvD,iCAAyB,mCAAmC;AAAA,MAC9D,OAAO;AACL,iCAAyB,4BAA4B;AAAA,MACvD;AAAA,IACF,UAAE;AACA,cAAQ;AACR,+BAAyB,KAAK;AAAA,IAChC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,4BAA4BH,aAAY,MAAM;AAClD,wBAAoB,IAAI;AACxB,6BAAyB,IAAI;AAAA,EAC/B,GAAG,CAAC,CAAC;AAKL,QAAM,YAAYA,aAAY,YAAY;AACxC,UAAM,aACJ,OAAO,WAAW,cACd,OAAO,SAAS,WAChB,OAAO,SAAS,SAChB,OAAO,SAAS,OAChB;AAEN,QAAI,SAAS;AAAA,MACX,eAAe;AAAA,MACf;AAAA,MACA,SAAS;AAAA,IACX;AACA,QAAI,CAAC,QAAQ;AACX,eAAS,qBAAqB,UAAU;AAAA;AAAA,IAC1C;AAEA,UAAM,QAAQ,YAAY,KAAK;AAC/B,UAAM,cAAc,kBAAkB,KAAK;AAC3C,QAAI,SAAS,aAAa;AACxB,YAAM,UAAU;AAAA,QACd,QAAQ,kBAAkB,KAAK,KAAK;AAAA,QACpC;AAAA,MACF,EACG,OAAO,OAAO,EACd,KAAK,MAAM;AACd,eAAS,GAAG,OAAO;AAAA;AAAA,EAAO,MAAM;AAAA,IAClC;AAEA,iBAAa,SAAS;AACtB,mBAAe,IAAI;AACnB,UAAM,IAAI,QAAQ,CAAC,YAAY,OAAO,WAAW,SAAS,GAAG,CAAC;AAE9D,UAAM,UAA8B;AAAA,MAClC,SAAS,wBAAwB;AAAA,MACjC,SAAS,wBAAwB;AAAA,MACjC,eAAe,wBAAwB;AAAA,IACzC;AACA,UAAM,cAAc,mBAAmB,UACnC,wBAAwB,sBAAsB,OAAO,IACrD;AAEJ,UAAM,UAAoC;AAAA,MACxC,OAAO,SAAS;AAAA,MAChB,aAAa,eAAe;AAAA,MAC5B;AAAA,MACA,aAAa,eAAe;AAAA,MAC5B,YAAY,oBAAoB;AAAA,MAChC;AAAA,IACF;AAEA,QAAI,oBAAoB;AACxB,QAAI;AACF,UAAI,UAAU;AACZ,cAAM,SAAS,MAAM,SAAS,QAAQ,eAAe,OAAO;AAC5D,4BAAoB,WAAW;AAAA,MACjC;AAEA,UAAI,iBAAiB;AACnB,cAAM,SAAS,MAAM,gBAAgB,OAAO;AAC5C,4BAAoB,qBAAqB,WAAW;AAAA,MACtD;AAAA,IACF,SAAS,OAAO;AAId,mBAAa,QAAQ;AACrB;AAAA,QACE,iBAAiB,SAAS,MAAM,UAC5B,MAAM,UACN;AAAA,MACN;AACA,aAAO,WAAW,MAAM,aAAa,MAAM,GAAG,IAAI;AAClD;AAAA,IACF;AAEA,UAAM,UAAU;AAChB,iBAAa,UAAU,SAAS,QAAQ;AACxC,QAAI,CAAC,SAAS;AACZ,qBAAe,sCAAsC;AAAA,IACvD;AACA,WAAO,WAAW,MAAM,aAAa,MAAM,GAAG,IAAI;AAElD,QAAI,SAAS;AACX,qBAAe,IAAI;AACnB,sBAAgB,KAAK;AACrB,6BAAuB,KAAK;AAC5B,sBAAgB,QAAQ;AACxB,qBAAe,EAAE;AACjB,2BAAqB,EAAE;AACvB,0BAAoB,IAAI;AACxB,+BAAyB,IAAI;AAAA,IAC/B;AAAA,EACF,GAAG;AAAA,IACD,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAKD,QAAM,gBAAgBA,aAAY,CAAC,UAAoC;AACrE,gBAAY,CAAC,SAAS;AACpB,YAAM,OAAO,EAAE,GAAG,MAAM,GAAG,MAAM;AACjC,UACE,MAAM,sBAAsB,UAC5B,CAAC,cAAc,KAAK,CAAC,UAAU,MAAM,OAAO,MAAM,iBAAiB,GACnE;AACA,aAAK,oBAAoB,iBAAiB;AAAA,MAC5C;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,cAAcA,aAAY,MAAM;AACpC,8BAA0B,IAAI;AAC9B,kBAAc,CAAC,SAAS,CAAC,IAAI;AAC7B,WAAO,sBAAsB,MAAM;AACjC,aAAO,sBAAsB,MAAM,0BAA0B,KAAK,CAAC;AAAA,IACrE,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,oBAAoBA,aAAY,MAAM;AAC1C,oBAAgB,CAAC,SAAS;AACxB,YAAM,OAAO,CAAC;AACd,6BAAuB,IAAI;AAC3B,UAAI,MAAM;AACR,wBAAgB,QAAQ;AAAA,MAC1B;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAKL,QAAM,8BAA8BA,aAAY,MAAM;AACpD,sBAAkB,IAAI;AAAA,EACxB,GAAG,CAAC,CAAC;AAEL,QAAM,uBAAuBA,aAAY,MAAM;AAC7C,QAAI,uBAAuB,SAAS;AAClC,aAAO,aAAa,uBAAuB,OAAO;AAAA,IACpD;AACA,2BAAuB,UAAU,OAAO;AAAA,MACtC,MAAM,wBAAwB,IAAI;AAAA,MAClC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,uBAAuBA,aAAY,MAAM;AAC7C,sBAAkB,KAAK;AACvB,4BAAwB,KAAK;AAC7B,QAAI,uBAAuB,SAAS;AAClC,aAAO,aAAa,uBAAuB,OAAO;AAClD,6BAAuB,UAAU;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,CAAC;AAKL,QAAM,WAAWA,aAAY,MAAM;AACjC,QAAI,2BAA2B,SAAS;AACtC,iCAA2B,UAAU;AACrC;AAAA,IACF;AACA,gBAAY,IAAI;AAAA,EAClB,GAAG,CAAC,CAAC;AAML,QAAM,uBAAuBA;AAAA,IAC3B,CAAC,UAA8C;AAC7C,YAAM,SAAS,MAAM;AACrB,UACE,OAAO,QAAQ,QAAQ,KACvB,OAAO,QAAQ,sCAAsC,GACrD;AACA;AAAA,MACF;AACA,0BAAoB,UAAU;AAAA,QAC5B,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,SAAS,iBAAiB,KAAK,MAAM;AAAA,QACrC,SAAS,iBAAiB,KAAK,MAAM;AAAA,MACvC;AAEA,YAAM,SAAS,CAAC,SAAuB;AACrC,cAAM,QAAQ,oBAAoB;AAClC,YAAI,CAAC,OAAO;AACV;AAAA,QACF;AACA,cAAM,KAAK,KAAK,UAAU,MAAM;AAChC,cAAM,KAAK,KAAK,UAAU,MAAM;AAChC,YAAI,CAAC,qBAAqB,KAAK,MAAM,IAAI,EAAE,IAAI,wBAAwB;AACrE;AAAA,QACF;AACA,6BAAqB,IAAI;AACzB,cAAM,UAAU;AAChB,cAAM,eAAe,WAAW,MAAM;AACtC,cAAM,SAAS;AACf,cAAM,OAAO,OAAO,aAAa,eAAe;AAChD,cAAM,OAAO,OAAO,cAAc,SAAS;AAC3C,2BAAmB;AAAA,UACjB,GAAG,MAAM,MAAM,UAAU,IAAI,SAAS,KAAK,IAAI,SAAS,IAAI,CAAC;AAAA,UAC7D,GAAG,MAAM,MAAM,UAAU,IAAI,SAAS,KAAK,IAAI,SAAS,IAAI,CAAC;AAAA,QAC/D,CAAC;AAAA,MACH;AAEA,YAAM,OAAO,MAAM;AACjB,iBAAS,oBAAoB,eAAe,MAAM;AAClD,iBAAS,oBAAoB,aAAa,IAAI;AAC9C,YAAI,mBAAmB;AACrB,qCAA2B,UAAU;AACrC,+BAAqB,KAAK;AAC1B,cAAI;AACF,gBAAI,iBAAiB;AACnB,qBAAO,aAAa;AAAA,gBAClB;AAAA,gBACA,KAAK,UAAU,eAAe;AAAA,cAChC;AAAA,YACF;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AACA,4BAAoB,UAAU;AAAA,MAChC;AAEA,eAAS,iBAAiB,eAAe,MAAM;AAC/C,eAAS,iBAAiB,aAAa,IAAI;AAAA,IAC7C;AAAA,IACA,CAAC,iBAAiB,mBAAmB,QAAQ;AAAA,EAC/C;AAGA,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,iBAAiB;AACpB;AAAA,IACF;AACA,UAAM,WAAW,MAAM;AACrB,YAAM,UAAU;AAChB,YAAM,eAAe,WAAW,MAAM;AACtC,YAAM,SAAS;AACf,yBAAmB,CAAC,SAAS;AAC3B,YAAI,CAAC,MAAM;AACT,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,UACL,GAAG;AAAA,YACD,KAAK;AAAA,YACL;AAAA,YACA,KAAK,IAAI,SAAS,OAAO,aAAa,eAAe,OAAO;AAAA,UAC9D;AAAA,UACA,GAAG;AAAA,YACD,KAAK;AAAA,YACL;AAAA,YACA,KAAK,IAAI,SAAS,OAAO,cAAc,SAAS,OAAO;AAAA,UACzD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,iBAAiB,UAAU,QAAQ;AAC1C,WAAO,MAAM,OAAO,oBAAoB,UAAU,QAAQ;AAAA,EAC5D,GAAG,CAAC,iBAAiB,QAAQ,CAAC;AAK9B,QAAM,sBAAsBD;AAAA,IAC1B,CAAC,UAAgC;AAG/B,YAAM,gBAAgB;AAAA,IACxB;AAAA,IACA,CAAC;AAAA,EACH;AAKA,MAAI,CAAC,WAAW,iBAAiB;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,QAAM,oBACJ,OAAO,WAAW,gBACjB,iBAAiB,KAAK,OAAO,cAAc,MAC1C,OAAO,cAAc;AAGzB,QAAM,gBAAgB,CACpB,UACA,SACA,YACwB;AACxB,UAAM,OAAO,MAAO,WAAW,MAAO,OAAO,YAAY,KAAK,OAAO,aAAa,GAAG;AACrF,UAAM,UAAU,UAAU,UAAU,UAAU,OAAO;AAIrD,UAAM,eAAe;AACrB,UAAM,YAAY,UAAU;AAC5B,WAAO;AAAA,MACL;AAAA,MACA,KAAK,YAAY,UAAU,KAAK,UAAU;AAAA,MAC1C,UAAU,UAAU,UAAU;AAAA,MAC9B,WAAW,YAAY,2BAA2B;AAAA,IACpD;AAAA,EACF;AAGA,QAAM,qBAAqB,CACzB,eACoC;AACpC,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO;AAAA,IACT;AACA,UAAM,UAAU,WAAW,UACvB,WAAW,IACX,WAAW,IAAI,OAAO;AAC1B,UAAM,YAAY,OAAO,cAAc,UAAU;AACjD,UAAM,SAAS,MAAO,WAAW,IAAI,MAAO,OAAO,YAAY,IAAI,OAAO,aAAa,EAAE;AACzF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,YAAY,UAAU,IAAI,UAAU;AAAA,IAC3C;AAAA,EACF;AAGA,QAAM,oBAAoB,mBAAmB,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO;AACrE,QAAM,mBAAmB,mBAAmB,OAAO,CAAC,MAAM,EAAE,OAAO;AAEnE,QAAM,eAAe,CACnB,YACA,YACA,cACG;AACH,UAAM,cAAc,YAAY;AAAA,MAC9B,CAAC,UAAU,MAAM,OAAO,WAAW;AAAA,IACrC;AACA,WACE,gBAAAJ;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,eAAe,IAAI,WAAW,EAAE;AAAA,QAC3C;AAAA,QACA,YAAY,gBAAgB,IAAI,WAAW,EAAE;AAAA,QAC7C,WAAW,oBAAoB,WAAW;AAAA,QAC1C,YAAY,qBAAqB,WAAW;AAAA,QAC5C,cAAc,sBAAsB;AAAA,QACpC;AAAA,QACA,qBAAqB,SAAS;AAAA,QAC9B,cAAc,mBAAmB,UAAU;AAAA,QAC3C,cAAc,CAAC,MAAM,mBAAmB,EAAE,EAAE;AAAA,QAC5C,cAAc,MAAM,mBAAmB,IAAI;AAAA,QAC3C,SAAS;AAAA,QACT,eAAe;AAAA;AAAA,MAjBV,WAAW;AAAA,IAkBlB;AAAA,EAEJ;AAEA,QAAM,mBAAmB;AAAA,IACvBQ,uBAAO;AAAA,IACP,WAAWA,uBAAO,SAAS;AAAA,IAC3B,aAAa,KAAKA,uBAAO;AAAA,IACzB,yBAAyBA,uBAAO,qBAAqB;AAAA,EACvD,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,4BAA4B;AAAA,IAChCA,uBAAO;AAAA,IACP,WAAWA,uBAAO,WAAWA,uBAAO;AAAA,IACpC,wBAAwBA,uBAAO,WAAW;AAAA,IAC1C,aAAa;AAAA,EACf,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,oBAAoB;AAAA,IACxBA,uBAAO;AAAA,IACP,iBAAiBA,uBAAO,iBAAiB;AAAA,IACzC,uBAAuBA,uBAAO,oBAAoB;AAAA,EACpD,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAM,eAAgD,kBAClD,EAAE,UAAU,SAAS,MAAM,gBAAgB,GAAG,KAAK,gBAAgB,EAAE,IACrE;AAEJ,QAAM,UACJ,gBAAAR;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,4BAAwB;AAAA,MACxB,8BAA4B,SAAS;AAAA,MACrC,6BAA2B,aAAa,SAAS;AAAA,MACjD,OAAO,EAAE,SAAS,WAAW;AAAA,MAC7B,aAAa;AAAA,MACb,SAAS;AAAA,MACT,eAAe;AAAA,MAEf,0BAAAC;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,yBAAqB;AAAA,UACrB,OAAO,aAAa,SAAY,EAAE,aAAa,QAAQ;AAAA,UAGtD;AAAA,wBACD,aACA,CAAC,qBACD,CAAC,eACD,CAAC,aACC,gBAAAA,MAAAF,WAAA,EACE;AAAA,8BAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAWQ,uBAAO;AAAA,kBAClB,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,MAAM,UAAU,KAAK;AAAA,oBACrB,KAAK,UAAU,KAAK;AAAA,oBACpB,OAAO,UAAU,KAAK;AAAA,oBACtB,QAAQ,UAAU,KAAK;AAAA,oBACvB,iBAAiB,sBAAsB,SAAS;AAAA,oBAChD,aAAa,sBAAsB,SAAS;AAAA,kBAC9C;AAAA,kBAEA,0BAAAR,KAAC,UAAK,WAAWQ,uBAAO,0BAA0B;AAAA;AAAA,cACpD;AAAA,eACE,MAAM;AAEN,sBAAM,SAAS,cAAc,IAAI,OAAO,cAAc;AACtD,sBAAM,WAAW,cAAc,IAAI,OAAO,aAAa;AACvD,sBAAM,iBAAiB,SAASA,uBAAO,MAAMA,uBAAO;AACpD,sBAAM,YAAY,WAAWA,uBAAO,OAAO;AAC3C,uBACE,gBAAAP;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,GAAGO,uBAAO,YAAY,IAAI,cAAc,IAAI,SAAS,GAAG,KAAK;AAAA,oBACxE,OAAO;AAAA,sBACL,UAAU;AAAA,sBACV,MAAM,WAAW,cAAc,IAAI,KAAK,cAAc,IAAI;AAAA,sBAC1D,KAAK,SAAS,cAAc,IAAI,KAAK,cAAc,IAAI;AAAA,oBACzD;AAAA,oBAEA;AAAA,sCAAAR,KAAC,UAAK,WAAWQ,uBAAO,kBACrB,oBAAU,aACb;AAAA,sBACC,UAAU,kBACT,gBAAAR,KAAC,UAAK,WAAWQ,uBAAO,gBACrB,oBAAU,iBACb,IACE;AAAA;AAAA;AAAA,gBACN;AAAA,cAEJ,GAAG;AAAA,eACL,IACE;AAAA,YAGH,aACC,gBAAAP,MAAAF,WAAA,EACE;AAAA,8BAAAC,KAAC,SAAI,KAAK,aAAa,WAAWQ,uBAAO,eAAe;AAAA,cACxD,gBAAAR,KAAC,SAAI,KAAK,wBAAwB,WAAWQ,uBAAO,qBAAqB;AAAA,eAC3E,IACE;AAAA,YAGH,mBAAmB,IAAI,CAAC,OAAO,UAC9B,gBAAAR;AAAA,cAAC;AAAA;AAAA,gBAEC,WACE,mBAAmB,UAAU,IACzBQ,uBAAO,qBACPA,uBAAO;AAAA,gBAEb,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,MAAM,MAAM,KAAK;AAAA,kBACjB,KAAK,MAAM,KAAK;AAAA,kBAChB,OAAO,MAAM,KAAK;AAAA,kBAClB,QAAQ,MAAM,KAAK;AAAA,gBACrB;AAAA;AAAA,cAZK;AAAA,YAaP,CACD;AAAA,YAGD,gBAAAR,KAAC,YAAO,WAAWQ,uBAAO,YAAY,OAAO,EAAE,SAAS,OAAO,GAAG;AAAA,YAGlE,gBAAAP,MAAAF,WAAA,EACE;AAAA,8BAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,GAAGQ,uBAAO,YAAY,IAC/B,oBAAoBA,uBAAO,UAAUA,uBAAO,MAC9C;AAAA,kBAEC,8BACG,kBAAkB;AAAA,oBAAI,CAAC,YAAY,UACjC,aAAa,YAAY,OAAO,kBAAkB,MAAM;AAAA,kBAC1D,IACA;AAAA;AAAA,cACN;AAAA,cACA,gBAAAR;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,GAAGQ,uBAAO,iBAAiB,IACpC,oBAAoBA,uBAAO,UAAUA,uBAAO,MAC9C;AAAA,kBAEC,8BACG,iBAAiB;AAAA,oBAAI,CAAC,YAAY,UAChC,aAAa,YAAY,OAAO,iBAAiB,MAAM;AAAA,kBACzD,IACA;AAAA;AAAA,cACN;AAAA,eACF;AAAA,YAGC,MAAM,KAAK,cAAc,EAAE,IAAI,CAAC,OAAO;AACtC,oBAAM,aAAa,YAAY,KAAK,CAAC,UAAU,MAAM,OAAO,EAAE;AAC9D,kBAAI,CAAC,YAAY;AACf,uBAAO;AAAA,cACT;AACA,qBACE,gBAAAR;AAAA,gBAAC;AAAA;AAAA,kBAEC;AAAA,kBACA,OAAO,WAAW;AAAA;AAAA,gBAFb,QAAQ,EAAE;AAAA,cAGjB;AAAA,YAEJ,CAAC;AAAA,YAGA,oBACC,gBAAAA,KAAC,SAAI,WAAW,kBAAkB,UAAUQ,uBAAO,oBAAoBA,uBAAO,cAC5E,0BAAAR;AAAA,cAAC;AAAA;AAAA,gBACC,GAAG,kBAAkB;AAAA,gBACrB,GAAG,kBAAkB,UAAU,kBAAkB,UAAU,kBAAkB;AAAA,gBAC7E,eAAe,kBAAkB;AAAA,gBACjC,WAAW;AAAA;AAAA,YACb,GACF,IACE;AAAA,YAEH,oBACC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,SAAS,kBAAkB;AAAA,gBAC3B,cAAc,kBAAkB;AAAA,gBAChC,gBAAgB,kBAAkB;AAAA,gBAClC,WAAW,CAAC;AAAA,gBACZ,aAAa,kBAAkB,gBAAgB,SAAY;AAAA,gBAC3D,WAAW;AAAA,gBACX,OAAO;AAAA,kBACL,kBAAkB;AAAA,kBAClB,kBAAkB,UACd,kBAAkB,UAClB,kBAAkB;AAAA,kBACtB,kBAAkB;AAAA,gBACpB;AAAA,gBACA,UAAU;AAAA,gBACV,UAAU;AAAA;AAAA,YACZ,IACE;AAAA,YAGH,oBACC,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,KAAK;AAAA,gBACL,SAAS,kBAAkB;AAAA,gBAC3B,cAAc,kBAAkB;AAAA,gBAChC,cAAc,kBAAkB;AAAA,gBAChC,aAAY;AAAA,gBACZ,WAAW,CAAC;AAAA,gBACZ,WAAW;AAAA,gBACX,OAAO;AAAA,kBACL,kBAAkB;AAAA,kBAClB,kBAAkB,UACd,kBAAkB,IAClB,kBAAkB;AAAA,kBACtB,kBAAkB;AAAA,gBACpB;AAAA,gBACA,UAAU;AAAA,gBACV,UAAU;AAAA,gBACV,UAAU;AAAA;AAAA,YACZ,IACE;AAAA,YAGJ,gBAAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAWQ,uBAAO;AAAA,gBAClB,yBAAqB;AAAA,gBACrB,+BAA2B;AAAA,gBAC3B,OAAO;AAAA,gBAEP,0BAAAR;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW;AAAA,oBACX,eAAe;AAAA,oBAEhB,WAAC,WACA,gBAAAC;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAWO,uBAAO;AAAA,wBAClB,MAAK;AAAA,wBACL,UAAU;AAAA,wBACV,OAAM;AAAA,wBACN,SAAS;AAAA,wBACT,WAAW,CAAC,UAAU;AACpB,8BAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,kCAAM,eAAe;AACrB,qCAAS;AAAA,0BACX;AAAA,wBACF;AAAA,wBAEA;AAAA,0CAAAR,KAAC,UAAK,WAAWQ,uBAAO,YACtB,0BAAAR,KAAC,oBAAiB,MAAM,IAAI,GAC9B;AAAA,0BACC,iBACC,gBAAAA,KAAC,UAAK,WAAWQ,uBAAO,OAAQ,sBAAY,QAAO,IACjD;AAAA;AAAA;AAAA,oBACN,IAEA,gBAAAP,MAAC,SACC;AAAA,sCAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAW;AAAA,0BACX,cAAc;AAAA,0BACd,cAAc;AAAA,0BAEd;AAAA,4CAAAA,MAAC,SAAI,WAAW,GAAGO,uBAAO,aAAa,IAAIA,uBAAO,sBAAsB,IACtE;AAAA,8CAAAR;AAAA,gCAAC;AAAA;AAAA,kCACC,MAAK;AAAA,kCACL,WAAW,GAAGQ,uBAAO,aAAa,IAAI,WAAWA,uBAAO,SAAS,EAAE;AAAA,kCACnE,SAAS,MAAM;AACb,gEAA4B;AAC5B,iDAAa;AAAA,kCACf;AAAA,kCAEA,0BAAAR,KAAC,yBAAsB,UAAU,UAAU,MAAM,IAAI;AAAA;AAAA,8BACvD;AAAA,8BACA,gBAAAC,MAAC,UAAK,WAAW,GAAGO,uBAAO,aAAa,IAAIA,uBAAO,MAAM,IACtD;AAAA,2CAAW,WAAW;AAAA,gCACvB,gBAAAR,KAAC,UAAK,WAAWQ,uBAAO,UAAU,eAAC;AAAA,iCACrC;AAAA,+BACF;AAAA,4BAEA,gBAAAP,MAAC,SAAI,WAAWO,uBAAO,eACrB;AAAA,8CAAAR;AAAA,gCAAC;AAAA;AAAA,kCACC,MAAK;AAAA,kCACL,WAAWQ,uBAAO;AAAA,kCAClB,UAAU;AAAA,kCACV,SAAS,MAAM;AACb,gEAA4B;AAC5B,oDAAgB;AAChB,yCAAK,4BAA4B;AAAA,kCACnC;AAAA,kCAEA,0BAAAR,KAAC,cAAW,MAAM,IAAI;AAAA;AAAA,8BACxB;AAAA,8BACA,gBAAAA,KAAC,UAAK,WAAW,GAAGQ,uBAAO,aAAa,IAAIA,uBAAO,MAAM,IAAI,wBAE7D;AAAA,+BACF;AAAA,4BAEA,gBAAAP,MAAC,SAAI,WAAWO,uBAAO,eACrB;AAAA,8CAAAR;AAAA,gCAAC;AAAA;AAAA,kCACC,MAAK;AAAA,kCACL,WAAW,GAAGQ,uBAAO,aAAa,IAAI,cAAcA,uBAAO,SAAS,EAAE;AAAA,kCACtE,UAAU,CAAC;AAAA,kCACX,SAAS,MAAM;AACb,gEAA4B;AAC5B,mDAAe,CAAC,SAAS,CAAC,IAAI;AAAA,kCAChC;AAAA,kCAEA,0BAAAR,KAAC,mBAAgB,QAAQ,aAAa,MAAM,IAAI;AAAA;AAAA,8BAClD;AAAA,8BACA,gBAAAC,MAAC,UAAK,WAAW,GAAGO,uBAAO,aAAa,IAAIA,uBAAO,MAAM,IACtD;AAAA,8CAAc,iBAAiB;AAAA,gCAChC,gBAAAR,KAAC,UAAK,WAAWQ,uBAAO,UAAU,eAAC;AAAA,iCACrC;AAAA,+BACF;AAAA,4BAEA,gBAAAR,KAAC,SAAI,WAAWQ,uBAAO,SAAS;AAAA,4BAEhC,gBAAAP,MAAC,SAAI,WAAWO,uBAAO,eACrB;AAAA,8CAAAR;AAAA,gCAAC;AAAA;AAAA,kCACC,MAAK;AAAA,kCACL,WAAW,GAAGQ,uBAAO,aAAa,IAAI,SAASA,uBAAO,gBAAgB,EAAE;AAAA,kCACxE,UAAU,CAAC;AAAA,kCACX,SAAS,MAAM;AACb,gEAA4B;AAC5B,+CAAW;AAAA,kCACb;AAAA,kCAEA,0BAAAR,KAAC,oBAAiB,QAAgB,MAAM,IAAI,MAAM,WAAW;AAAA;AAAA,8BAC/D;AAAA,8BACA,gBAAAC,MAAC,UAAK,WAAW,GAAGO,uBAAO,aAAa,IAAIA,uBAAO,MAAM,IAAI;AAAA;AAAA,gCAE3D,gBAAAR,KAAC,UAAK,WAAWQ,uBAAO,UAAU,eAAC;AAAA,iCACrC;AAAA,+BACF;AAAA,4BAEA,gBAAAP,MAAC,SAAI,WAAWO,uBAAO,eACrB;AAAA,8CAAAR;AAAA,gCAAC;AAAA;AAAA,kCACC,MAAK;AAAA,kCACL,WAAWQ,uBAAO;AAAA,kCAClB,UAAU,CAAC;AAAA,kCACX,SAAS,MAAM;AACb,gEAA4B;AAC5B,6CAAS;AAAA,kCACX;AAAA,kCAEA,0BAAAR,KAAC,gBAAa,MAAM,IAAI;AAAA;AAAA,8BAC1B;AAAA,8BACA,gBAAAC,MAAC,UAAK,WAAW,GAAGO,uBAAO,aAAa,IAAIA,uBAAO,MAAM,IAAI;AAAA;AAAA,gCAE3D,gBAAAR,KAAC,UAAK,WAAWQ,uBAAO,UAAU,eAAC;AAAA,iCACrC;AAAA,+BACF;AAAA,4BAEA,gBAAAR,KAAC,SAAI,WAAWQ,uBAAO,SAAS;AAAA,4BAEhC,gBAAAP,MAAC,SAAI,WAAWO,uBAAO,eACrB;AAAA,8CAAAR;AAAA,gCAAC;AAAA;AAAA,kCACC,MAAK;AAAA,kCACL,WAAW,GAAGQ,uBAAO,aAAa,IAAI,cAAc,SAASA,uBAAO,gBAAgB,EAAE;AAAA,kCACtF,UAAU,CAAC;AAAA,kCACX,SAAS,MAAM;AACb,gEAA4B;AAC5B,sDAAkB;AAAA,kCACpB;AAAA,kCAEA,0BAAAR,KAAC,iBAAc,OAAO,WAAW,MAAM,IAAI;AAAA;AAAA,8BAC7C;AAAA,8BACA,gBAAAC,MAAC,UAAK,WAAW,GAAGO,uBAAO,aAAa,IAAIA,uBAAO,MAAM,IAAI;AAAA;AAAA,gCAE3D,gBAAAR,KAAC,UAAK,WAAWQ,uBAAO,UAAU,eAAC;AAAA,iCACrC;AAAA,+BACF;AAAA,4BAEA,gBAAAP,MAAC,SAAI,WAAW,GAAGO,uBAAO,aAAa,IAAIA,uBAAO,uBAAuB,IACvE;AAAA,8CAAAR;AAAA,gCAAC;AAAA;AAAA,kCACC,MAAK;AAAA,kCACL,WAAWQ,uBAAO;AAAA,kCAClB,SAAS,MAAM;AACb,gEAA4B;AAC5B,+CAAW;AAAA,kCACb;AAAA,kCAEA,0BAAAR,KAAC,kBAAe,MAAM,IAAI;AAAA;AAAA,8BAC5B;AAAA,8BACA,gBAAAA,KAAC,UAAK,WAAW,GAAGQ,uBAAO,aAAa,IAAIA,uBAAO,MAAM,IAAI,kBAE7D;AAAA,+BACF;AAAA;AAAA;AAAA,sBACF;AAAA,sBAEC,eACC,gBAAAR;AAAA,wBAAC;AAAA;AAAA,0BACC,WAAW,GACT,sBAAsBQ,uBAAO,QAAQA,uBAAO,IAC9C,IAAI,cAAc,YAAYA,uBAAO,UAAU,EAAE,GAAG,KAAK;AAAA,0BAE3D,0BAAAR;AAAA,4BAAC;AAAA;AAAA,8BACC;AAAA,8BACA,kBAAkB;AAAA,8BAClB;AAAA,8BACA,qBAAqB;AAAA,8BACrB;AAAA,8BACA,2BAA2B;AAAA,8BAC3B;AAAA,8BACA,qBAAqB,MAAM,KAAK,4BAA4B;AAAA,8BAC5D,mBAAmB;AAAA,8BACnB,iBAAiB;AAAA,8BACjB;AAAA,8BACA,aAAa,MAAM,KAAK,UAAU;AAAA,8BAClC;AAAA,8BACA;AAAA,8BACA,cAAc,cAAc;AAAA,8BAC5B;AAAA,8BACA;AAAA,8BACA,eAAe;AAAA,8BACf,WAAW;AAAA,8BACX;AAAA,8BACA;AAAA,8BACA,sBAAsB;AAAA,8BACtB,cAAc;AAAA,8BACd,QAAQ;AAAA,8BACR,aACE,uBACC,wBAAwB,wBAAwB,wBAC7C;AAAA,gCACE,aAAa;AAAA,gCACb,aAAa;AAAA,gCACb,mBAAmB;AAAA,gCACnB;AAAA,gCACA;AAAA,gCACA;AAAA,gCACA,iBAAiB;AAAA,gCACjB,iBAAiB;AAAA,gCACjB,uBAAuB;AAAA,gCACvB,uBAAuB;AAAA,kCACrB,mBAAmB;AAAA,gCACrB;AAAA,8BACF,IACA;AAAA;AAAA,0BAER;AAAA;AAAA,sBACA,IACE;AAAA,uBACN;AAAA;AAAA,gBAEF;AAAA;AAAA,YACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAGF,SAAOS,cAAa,SAAS,SAAS,IAAI;AAC5C;;;A2BjrEA,IAAM,uBAAuB;AAEtB,SAAS,wBAAwB,YAAqB,WAAmC;AAC9F,QAAM,QAAQ,YAAY,KAAK,KAAK,WAAW,KAAK;AACpD,SAAO,SAAS,MAAM,SAAS,IAAI,QAAQ;AAC7C;AAEA,SAAS,oBAAoB,YAA6B;AACxD,QAAM,UAAU,YAAY,KAAK;AACjC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,QAAQ,QAAQ,EAAE;AACnC;AAEA,SAAS,6BAA6B,YAA+B;AACnE,QAAM,aAAa,oBAAoB,UAAU;AACjD,QAAM,aAAa,CAAC,UAAU;AAC9B,MAAI,CAAC,WAAW,SAAS,KAAK,GAAG;AAC/B,eAAW,KAAK,GAAG,UAAU,KAAK;AAAA,EACpC;AACA,SAAO,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC;AAChC;AAEA,eAAe,iBAAiB,UAAoB,UAAmC;AACrF,MAAI;AACF,UAAM,OAAQ,MAAM,SAAS,KAAK;AAMlC,WACE,KAAK,OAAO,WAAW,KAAK,WAAW,KAAK,UAAU;AAAA,EAE1D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,eAAe,YAAgC,MAAc,MAAsC;AAChH,QAAM,aAAa,6BAA6B,UAAU;AAC1D,MAAI,eAAgC;AAEpC,aAAW,aAAa,YAAY;AAClC,UAAM,WAAW,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,IAAI,IAAI;AACxD,QAAI,SAAS,WAAW,KAAK;AAC3B,aAAO;AAAA,IACT;AACA,mBAAe;AAAA,EACjB;AAEA,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,SAAO;AACT;AAEA,eAAe,iBAAiB,YAAwD;AACtF,QAAM,WAAW,MAAM,MAAM,WAAW,OAAO;AAC/C,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,SAAO,MAAM,SAAS,KAAK;AAC7B;AAEA,SAAS,kBAAkB,YAAyD;AAClF,MAAI,WAAW,cAAc,KAAK,GAAG;AACnC,WAAO;AAAA,EACT;AACA,MAAI,WAAW,kBAAkB,WAAW,sBAAsB,UAAU,KAAK,GAAG;AAClF,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,UAAU,YAAgC;AACjD,QAAM,MAAM,OAAO,WAAW,MAAM,WAAW,OAAO,WAAW,WAAW,CAAC,IAAI,WAAW;AAC5F,QAAM,OAAO,OAAO,SAAS,GAAG,IAAI,MAAM;AAC1C,SAAO,WAAW,UAAU,OAAO,OAAO,UAAU;AACtD;AAEA,SAAS,eAAe,YAAwB,UAA6C;AAC3F,MAAI,WAAW,aAAa;AAC1B,WAAO,WAAW;AAAA,EACpB;AAEA,QAAM,QAAQ;AACd,QAAM,SAAS;AACf,QAAM,UAAW,WAAW,IAAI,MAAO,SAAS;AAChD,QAAM,UAAU,UAAU,UAAU;AACpC,SAAO;AAAA,IACL,GAAG,UAAU,QAAQ;AAAA,IACrB,GAAG,UAAU,SAAS;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,cAAc,YAAwB,OAAwC;AACrF,QAAM,WAA2B;AAAA,IAC/B,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,EACjB;AACA,QAAM,cAAc,eAAe,YAAY,QAAQ;AACvD,QAAM,YAAY,IAAI,KAAK,WAAW,aAAa,KAAK,IAAI,CAAC,EAAE,YAAY;AAE3E,SAAO;AAAA,IACL,IAAI,WAAW;AAAA,IACf,OAAO,QAAQ;AAAA,IACf,MAAM,kBAAkB,UAAU;AAAA,IAClC,MAAM,WAAW,SAAS,KAAK,KAAK;AAAA,IACpC,UAAU,WAAW,eAAe,WAAW,YAAY;AAAA,IAC3D,WAAW,WAAW,cAAc;AAAA,IACpC,MAAM,WAAW,gBAAgB,WAAW,cAAc;AAAA,IAC1D;AAAA,IACA;AAAA,IACA,SAAS,OAAO,SAAS;AAAA,IACzB,WAAW,SAAS;AAAA,IACpB;AAAA,EACF;AACF;AAEA,SAAS,WAAW,SAA2C;AAC7D,QAAM,WAAW,QAAQ,OAAO,KAAK;AACrC,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,QAAQ,YAC1B,IAAI,CAAC,eAAe,WAAW,SAAS,KAAK,CAAC,EAC9C,KAAK,CAAC,UAAU,QAAQ,KAAK,CAAC;AACjC,MAAI,cAAc;AAChB,WAAO,aAAa,MAAM,GAAG,GAAG;AAAA,EAClC;AAEA,QAAM,YAAY,SAAS,MAAM,KAAK;AACtC,MAAI,WAAW;AACb,WAAO,eAAe,SAAS;AAAA,EACjC;AAEA,SAAO,eAAe,OAAO,SAAS,YAAY,GAAG;AACvD;AAEA,eAAe,iBAAiB,MAKZ;AAClB,QAAM,OAAO,MAAM,iBAAiB,KAAK,UAAU;AACnD,QAAM,YAAY,KAAK,WAAW,aAAa,cAAc,QAAQ;AACrE,QAAM,WAAW,6BAA6B,KAAK,WAAW,UAAU,IAAI,SAAS;AAErF,QAAM,iBAAiB,MAAM,eAAe,KAAK,YAAY,4BAA4B;AAAA,IACvF,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB;AAAA,MACA,UAAU,KAAK,WAAW;AAAA,MAC1B,WAAW,KAAK;AAAA,MAChB,SAAS;AAAA,IACX,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,eAAe,IAAI;AACtB,UAAM,IAAI,MAAM,MAAM,iBAAiB,gBAAgB,kCAAkC,eAAe,MAAM,GAAG,CAAC;AAAA,EACpH;AAEA,QAAM,aAAc,MAAM,eAAe,KAAK;AAC9C,QAAM,uBAAuB,MAAM,MAAM,WAAW,WAAW;AAAA,IAC7D,QAAQ,WAAW,UAAU;AAAA,IAC7B,SAAS,WAAW;AAAA,IACpB,MAAM;AAAA,EACR,CAAC;AACD,MAAI,CAAC,qBAAqB,IAAI;AAC5B,UAAM,IAAI,MAAM,6BAA6B,qBAAqB,MAAM,GAAG;AAAA,EAC7E;AAEA,QAAM,mBAAmB,MAAM,eAAe,KAAK,YAAY,0BAA0B;AAAA,IACvF,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,YAAY,KAAK;AAAA,MACjB,SAAS,WAAW;AAAA,MACpB,OAAO,KAAK,WAAW;AAAA,MACvB,QAAQ,KAAK,WAAW;AAAA,IAC1B,CAAC;AAAA,EACH,CAAC;AACD,MAAI,CAAC,iBAAiB,IAAI;AACxB,UAAM,IAAI,MAAM,MAAM,iBAAiB,kBAAkB,iCAAiC,iBAAiB,MAAM,GAAG,CAAC;AAAA,EACvH;AAEA,SAAO,WAAW;AACpB;AAQA,SAAS,eAAe,aAGtB;AACA,MAAI,CAAC,aAAa;AAChB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,cAAyC,CAAC;AAChD,aAAW,SAAS,YAAY,WAAW,CAAC,GAAG;AAC7C,gBAAY,KAAK;AAAA,MACf,OAAO,MAAM;AAAA,MACb,SAAS,MAAM;AAAA,MACf,WAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AACA,aAAW,SAAS,YAAY,iBAAiB,CAAC,GAAG;AACnD,gBAAY,KAAK;AAAA,MACf,OAAO;AAAA,MACP,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,MACd,OAAO,MAAM;AAAA,MACb,WAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,QAAM,mBAAkD,YAAY,WAAW,CAAC,GAAG;AAAA,IACjF,CAAC,WAAW;AAAA,MACV,QAAQ,MAAM;AAAA,MACd,KAAK,MAAM;AAAA,MACX,QAAQ,MAAM;AAAA,MACd,YAAY,MAAM;AAAA,MAClB,gBACE,MAAM,kBAAkB,OAAO,KAAK,MAAM,cAAc,EAAE,SAAS,IAC/D,MAAM,iBACN;AAAA,MACN,iBACE,MAAM,mBAAmB,OAAO,KAAK,MAAM,eAAe,EAAE,SAAS,IACjE,MAAM,kBACN;AAAA,MACN,aAAa,MAAM;AAAA,MACnB,cAAc,MAAM;AAAA,MACpB,OAAO,MAAM;AAAA,MACb,WAAW,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,YAAY,SAAS,IAAI,cAAc;AAAA,IACpD,iBAAiB,gBAAgB,SAAS,IAAI,kBAAkB;AAAA,EAClE;AACF;AAEA,eAAsB,oBAAoB,MAML;AACnC,QAAM,WAAqB,CAAC;AAC5B,MAAI,KAAK,QAAQ,YAAY;AAC3B,aAAS;AAAA,MACP,MAAM,iBAAiB;AAAA,QACrB,YAAY,KAAK;AAAA,QACjB,YAAY,KAAK;AAAA,QACjB,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK,QAAQ;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,EAAE,aAAa,gBAAgB,IAAI,eAAe,KAAK,QAAQ,WAAW;AAEhF,QAAM,WAAW,MAAM,eAAe,KAAK,YAAY,gBAAgB;AAAA,IACrE,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,YAAY,KAAK;AAAA,MACjB,aAAa,KAAK;AAAA,MAClB,OAAO,WAAW,KAAK,OAAO;AAAA,MAC9B,aAAa,KAAK,QAAQ,aAAa,KAAK,KAAK;AAAA,MACjD,UAAU,KAAK;AAAA,MACf,MAAM;AAAA,QACJ,KAAK,OAAO,SAAS;AAAA,QACrB,OAAO,SAAS;AAAA,QAChB,WAAW,UAAU;AAAA,QACrB,UAAU;AAAA,UACR,OAAO,OAAO;AAAA,UACd,QAAQ,OAAO;AAAA,QACjB;AAAA,MACF;AAAA,MACA,aAAa,KAAK,QAAQ,YAAY,IAAI,aAAa;AAAA,MACvD,UAAU,SAAS,SAAS,IAAI,WAAW;AAAA,MAC3C;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,MAAM,iBAAiB,UAAU,0BAA0B,SAAS,MAAM,GAAG,CAAC;AAAA,EAChG;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;;;AC3XA,IAAM,6BAA6B;AACnC,IAAM,6BAA6B;AACnC,IAAM,mCAAmC;AACzC,IAAM,8BAA8B,KAAK;AAGzC,SAAS,KAAK,OAA4B,UAA4B;AACpE,SAAO,OAAO,UAAU,YAAY,QAAQ;AAC9C;AAGA,SAAS,YAAY,OAA2B,UAA0B;AACxE,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AACpE,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AACA,SAAO;AACT;AAEO,SAAS,2BACd,QAC2B;AAC3B,QAAM,IAAI,UAAU,CAAC;AACrB,QAAM,UAAU,KAAK,EAAE,SAAS,KAAK;AAIrC,QAAM,iBAAiB,KAAK,EAAE,SAAS,KAAK;AAC5C,QAAM,eAAe,KAAK,EAAE,OAAO,cAAc;AACjD,QAAM,aAAa,KAAK,EAAE,KAAK,cAAc;AAE7C,QAAM,aAAa;AAAA,IACjB,EAAE,oBAAoB,EAAE;AAAA,IACxB;AAAA,EACF;AACA,QAAM,aAAa;AAAA,IACjB,EAAE,oBAAoB,EAAE;AAAA,IACxB;AAAA,EACF;AACA,QAAM,aAAa;AAAA,IACjB,EAAE,yBAAyB,EAAE;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,KAAK,EAAE,SAAS,KAAK;AAAA,IAC9B,eAAe,KAAK,EAAE,eAAe,KAAK;AAAA,IAC1C,OAAO;AAAA,IACP,KAAK;AAAA,IACL,eAAe,KAAK,EAAE,eAAe,KAAK;AAAA,IAC1C,gBAAgB,KAAK,EAAE,gBAAgB,KAAK;AAAA,IAC5C,gBAAgB,KAAK,EAAE,gBAAgB,IAAI;AAAA,IAC3C,sBAAsB,KAAK,EAAE,sBAAsB,KAAK;AAAA,IACxD,sBAAsB,KAAK,EAAE,sBAAsB,KAAK;AAAA,IACxD,4BAA4B,KAAK,EAAE,4BAA4B,KAAK;AAAA,IACpE,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,uBAAuB;AAAA,IACvB,kBAAkB,YAAY,EAAE,kBAAkB,2BAA2B;AAAA,IAC7E,aAAa,EAAE,eAAe,CAAC;AAAA,IAC/B,YAAY,EAAE,cAAc,CAAC;AAAA,IAC7B,eAAe,EAAE,iBAAiB,CAAC;AAAA,IACnC,gBAAgB,EAAE,kBAAkB,CAAC;AAAA,IACrC,sBAAsB,EAAE;AAAA,EAC1B;AACF;AAGO,SAAS,qBAAqB,QAA4C;AAC/E,SACE,OAAO,YACN,OAAO,WAAW,OAAO,iBAAiB,OAAO,SAAS,OAAO;AAEtE;AAGO,SAAS,WAAW,KAAa,UAA2C;AACjF,SAAO,SAAS,KAAK,CAAC,YAAY;AAChC,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO,IAAI,SAAS,OAAO;AAAA,IAC7B;AACA,QAAI;AACF,aAAO,QAAQ,KAAK,GAAG;AAAA,IACzB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;;;AC7FO,IAAM,WAAW;AAGjB,IAAM,yBAAmC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMA,IAAM,uBAAiC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,0BAAoC;AAAA;AAAA,EAE/C;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AACF;AAEA,SAAS,aAAa,KAAqB;AACzC,SAAO,IAAI,YAAY,EAAE,QAAQ,cAAc,EAAE;AACnD;AAGO,SAAS,eAAe,KAAa,mBAA6B,CAAC,GAAY;AACpF,QAAM,aAAa,aAAa,GAAG;AACnC,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,KAAK,CAAC,SAAS,aAAa,IAAI,MAAM,UAAU,GAAG;AACtE,WAAO;AAAA,EACT;AACA,SAAO,qBAAqB,KAAK,CAAC,UAAU,WAAW,SAAS,KAAK,CAAC;AACxE;AAGO,SAAS,aAAa,OAAe,WAAqB,yBAAiC;AAChG,MAAI,MAAM;AACV,aAAW,WAAW,UAAU;AAC9B,QAAI;AAEF,cAAQ,YAAY;AACpB,YAAM,IAAI,QAAQ,SAAS,QAAQ;AAAA,IACrC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,cACd,SACA,mBAA6B,CAAC,GAC9B,WAAqB,yBACG;AACxB,QAAM,MAA8B,CAAC;AACrC,aAAW,CAAC,KAAK,QAAQ,KAAK,OAAO,QAAQ,OAAO,GAAG;AACrD,QAAI,eAAe,KAAK,gBAAgB,GAAG;AACzC,UAAI,GAAG,IAAI;AACX;AAAA,IACF;AACA,QAAI,GAAG,IAAI,OAAO,aAAa,WAAW,aAAa,UAAU,QAAQ,IAAI;AAAA,EAC/E;AACA,SAAO;AACT;AAGO,SAAS,UACd,KACA,mBAA6B,CAAC,GAC9B,WAAqB,yBACb;AACR,MAAI;AAEF,UAAM,OAAO,OAAO,WAAW,cAAc,OAAO,SAAS,OAAO;AACpE,UAAM,SAAS,IAAI,IAAI,KAAK,IAAI;AAChC,QAAI,UAAU;AACd,WAAO,aAAa,QAAQ,CAAC,QAAQ,QAAQ;AAC3C,UAAI,eAAe,KAAK,gBAAgB,GAAG;AACzC,kBAAU;AAAA,MACZ;AAAA,IACF,CAAC;AACD,QAAI,SAAS;AACX,YAAM,OAAO,MAAM,KAAK,OAAO,aAAa,KAAK,CAAC;AAClD,iBAAW,OAAO,MAAM;AACtB,YAAI,eAAe,KAAK,gBAAgB,GAAG;AACzC,iBAAO,aAAa,IAAI,KAAK,QAAQ;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,IAAI,WAAW,OAAO,MAAM,KAAK,gBAAgB,KAAK,GAAG,IACrE,OAAO,SAAS,IAChB,GAAG,OAAO,QAAQ,GAAG,OAAO,MAAM,GAAG,OAAO,IAAI;AACpD,WAAO,aAAa,SAAS,QAAQ;AAAA,EACvC,QAAQ;AAEN,WAAO,aAAa,KAAK,QAAQ;AAAA,EACnC;AACF;AAGA,SAAS,gBACP,OACA,kBACA,UACA,QAAQ,GACC;AACT,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,aAAa,OAAO,QAAQ;AAAA,EACrC;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,UAAU,gBAAgB,OAAO,kBAAkB,UAAU,QAAQ,CAAC,CAAC;AAAA,EAC3F;AACA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,MAA+B,CAAC;AACtC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAgC,GAAG;AAC3E,UAAI,GAAG,IAAI,eAAe,KAAK,gBAAgB,IAC3C,WACA,gBAAgB,OAAO,kBAAkB,UAAU,QAAQ,CAAC;AAAA,IAClE;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMO,SAAS,WACd,MACA,mBAA6B,CAAC,GAC9B,WAAqB,yBACb;AACR,QAAM,UAAU,KAAK,UAAU;AAC/B,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAG,GAAG;AACtD,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,YAAM,WAAW,gBAAgB,QAAQ,kBAAkB,QAAQ;AACnE,aAAO,KAAK,UAAU,QAAQ;AAAA,IAChC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO,aAAa,MAAM,QAAQ;AACpC;AAGO,SAAS,eAAe,kBAA4B,eAAyB;AAClF,QAAM,cAAc,CAAC,GAAG,wBAAwB,GAAG,gBAAgB;AACnE,QAAM,WAAW,CAAC,GAAG,yBAAyB,GAAG,aAAa;AAC9D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ,CAAC,UAAkB,aAAa,OAAO,QAAQ;AAAA,IACvD,SAAS,CAAC,YAAoC,cAAc,SAAS,aAAa,QAAQ;AAAA,IAC1F,KAAK,CAAC,QAAgB,UAAU,KAAK,aAAa,QAAQ;AAAA,IAC1D,MAAM,CAAC,SAAiB,WAAW,MAAM,aAAa,QAAQ;AAAA,EAChE;AACF;;;ACpMA,IAAM,YAAY;AAClB,IAAM,oBAAoB,IAAI;AAC9B,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;AAGjB,SAAS,eAAe,OAAe,MAAM,mBAA2B;AAC7E,MAAI,MAAM,UAAU,KAAK;AACvB,WAAO;AAAA,EACT;AACA,SAAO,GAAG,MAAM,MAAM,GAAG,GAAG,CAAC,qBAAgB,MAAM,SAAS,GAAG;AACjE;AAOO,SAAS,UAAU,OAAgB,OAAO,oBAAI,QAAgB,GAAG,QAAQ,GAAY;AAC1F,MAAI;AACF,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,OAAO;AACzB,QAAI,cAAc,UAAU;AAC1B,aAAO,eAAe,KAAe;AAAA,IACvC;AACA,QAAI,cAAc,YAAY,cAAc,WAAW;AACrD,aAAO;AAAA,IACT;AACA,QAAI,cAAc,UAAU;AAC1B,aAAO,GAAI,MAAiB,SAAS,CAAC;AAAA,IACxC;AACA,QAAI,cAAc,YAAY;AAC5B,aAAO,aAAc,MAA4B,QAAQ,WAAW;AAAA,IACtE;AACA,QAAI,cAAc,UAAU;AAC1B,aAAQ,MAAiB,SAAS;AAAA,IACpC;AAEA,QAAI,iBAAiB,OAAO;AAC1B,aAAO;AAAA,QACL,MAAM,MAAM;AAAA,QACZ,SAAS,eAAe,MAAM,OAAO;AAAA,QACrC,OAAO,MAAM,QAAQ,eAAe,MAAM,KAAK,IAAI;AAAA,MACrD;AAAA,IACF;AAGA,QAAI,OAAO,SAAS,eAAe,iBAAiB,MAAM;AACxD,YAAM,KAAK;AACX,YAAM,MAAM,GAAG,UAAU,GAAG,QAAQ,YAAY,IAAI,GAAG;AACvD,YAAM,KAAK,GAAG,KAAK,IAAI,GAAG,EAAE,KAAK;AACjC,aAAO,UAAU,GAAG,GAAG,EAAE;AAAA,IAC3B;AAEA,QAAI,SAAS,WAAW;AACtB,aAAO,MAAM,QAAQ,KAAK,IAAI,YAAY;AAAA,IAC5C;AAEA,QAAI,OAAO,UAAU,UAAU;AAC7B,UAAI,KAAK,IAAI,KAAe,GAAG;AAC7B,eAAO;AAAA,MACT;AACA,WAAK,IAAI,KAAe;AAExB,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,cAAMC,OAAM,MACT,MAAM,GAAG,iBAAiB,EAC1B,IAAI,CAAC,UAAU,UAAU,OAAO,MAAM,QAAQ,CAAC,CAAC;AACnD,YAAI,MAAM,SAAS,mBAAmB;AACpC,UAAAA,KAAI,KAAK,WAAM,MAAM,SAAS,iBAAiB,cAAc;AAAA,QAC/D;AACA,aAAK,OAAO,KAAe;AAC3B,eAAOA;AAAA,MACT;AAEA,YAAM,MAA+B,CAAC;AACtC,YAAM,OAAO,OAAO,KAAK,KAAgC,EAAE,MAAM,GAAG,eAAe;AACnF,iBAAW,OAAO,MAAM;AACtB,YAAI,GAAG,IAAI,UAAW,MAAkC,GAAG,GAAG,MAAM,QAAQ,CAAC;AAAA,MAC/E;AACA,WAAK,OAAO,KAAe;AAC3B,aAAO;AAAA,IACT;AAEA,WAAO,OAAO,KAAK;AAAA,EACrB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,aAAa,OAAwB;AAC5C,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM,SAAS,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,EACvD;AACA,MAAI;AACF,WAAO,KAAK,UAAU,UAAU,KAAK,CAAC;AAAA,EACxC,QAAQ;AACN,QAAI;AACF,aAAO,OAAO,KAAK;AAAA,IACrB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAGO,SAAS,cAAc,MAAyB;AACrD,MAAI;AACF,WAAO,eAAe,KAAK,IAAI,YAAY,EAAE,KAAK,GAAG,CAAC;AAAA,EACxD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC/GA,IAAM,iBAAwC,CAAC,OAAO,QAAQ,QAAQ,SAAS,OAAO;AAItF,IAAM,uBAAuB;AAE7B,IAAI,YAAY;AAChB,SAAS,SAAiB;AACxB,eAAa;AACb,MAAI,OAAO;AACX,MAAI;AACF,WAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAAA,EAC9C,QAAQ;AAAA,EAER;AACA,SAAO,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,UAAU,SAAS,EAAE,CAAC,IAAI,IAAI;AACzE;AAEA,SAAS,SAAiB;AACxB,MAAI;AACF,YAAO,oBAAI,KAAK,GAAE,YAAY;AAAA,EAChC,QAAQ;AACN,YAAO,oBAAI,KAAK,CAAC,GAAE,YAAY;AAAA,EACjC;AACF;AAEA,SAAS,UAAkB;AACzB,MAAI;AACF,QAAI,OAAO,gBAAgB,eAAe,OAAO,YAAY,QAAQ,YAAY;AAC/E,aAAO,YAAY,IAAI;AAAA,IACzB;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO,KAAK,IAAI;AAClB;AAGA,SAAS,gBAAgB,QAAyC;AAChE,QAAM,MAA8B,CAAC;AACrC,MAAI;AACF,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,QAAI,OAAO,YAAY,eAAe,kBAAkB,SAAS;AAC/D,aAAO,QAAQ,CAAC,OAAO,QAAQ;AAC7B,YAAI,GAAG,IAAI;AAAA,MACb,CAAC;AACD,aAAO;AAAA,IACT;AACA,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,iBAAW,SAAS,QAAQ;AAC1B,YAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,UAAU,GAAG;AAC7C,cAAI,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,MAAM,CAAC,CAAC;AAAA,QACzC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AACA,QAAI,OAAO,WAAW,UAAU;AAC9B,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAiC,GAAG;AAC5E,YAAI,GAAG,IAAI,OAAO,KAAK;AAAA,MACzB;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAGA,IAAM,aAAN,MAAoB;AAAA,EAElB,YAA6B,KAAa;AAAb;AAD7B,SAAQ,QAAa,CAAC;AAAA,EACqB;AAAA,EAE3C,KAAK,MAAe;AAClB,SAAK,MAAM,KAAK,IAAI;AACpB,QAAI,KAAK,MAAM,SAAS,KAAK,KAAK;AAChC,WAAK,MAAM,OAAO,GAAG,KAAK,MAAM,SAAS,KAAK,GAAG;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,WAAgB;AACd,WAAO,KAAK,MAAM,MAAM;AAAA,EAC1B;AAAA,EAEA,QAAc;AACZ,SAAK,QAAQ,CAAC;AAAA,EAChB;AACF;AAEO,IAAM,uBAAN,MAA2B;AAAA,EA+BhC,YAAY,QAAmC;AAvB/C,SAAQ,YAAY;AAGpB;AAAA,SAAQ,kBAAsF,CAAC;AAC/F,SAAQ,gBAAqC;AAC7C,SAAQ,kBAAiD;AACzD,SAAQ,kBAAiD;AACzD,SAAQ,uBAAkE;AAC1E,SAAQ,eAAqD;AAC7D,SAAQ,mBAAoE;AAG5E;AAAA,SAAiB,WAAW,oBAAI,QAS9B;AAGA,SAAK,SAAS;AACd,SAAK,WAAW,eAAe,OAAO,eAAe,OAAO,cAAc;AAC1E,SAAK,gBAAgB,IAAI,WAAW,OAAO,gBAAgB;AAC3D,SAAK,gBAAgB,IAAI,WAAW,OAAO,qBAAqB;AAChE,SAAK,gBAAgB,IAAI,WAAW,OAAO,gBAAgB;AAAA,EAC7D;AAAA;AAAA,EAGA,UAAgB;AACd,QAAI,KAAK,WAAW;AAClB;AAAA,IACF;AACA,QAAI,OAAO,WAAW,aAAa;AACjC;AAAA,IACF;AACA,QAAI,CAAC,qBAAqB,KAAK,MAAM,GAAG;AACtC;AAAA,IACF;AACA,SAAK,YAAY;AAEjB,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,eAAe;AAAA,IACtB;AACA,QAAI,KAAK,OAAO,eAAe;AAC7B,WAAK,qBAAqB;AAAA,IAC5B;AACA,QAAI,KAAK,OAAO,OAAO;AACrB,WAAK,aAAa;AAAA,IACpB;AACA,QAAI,KAAK,OAAO,KAAK;AACnB,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EAGA,YAAkB;AAChB,QAAI,CAAC,KAAK,WAAW;AACnB;AAAA,IACF;AACA,SAAK,YAAY;AAEjB,QAAI;AACF,iBAAW,SAAS,gBAAgB;AAClC,cAAM,WAAW,KAAK,gBAAgB,KAAK;AAC3C,YAAI,YAAY,OAAO,YAAY,aAAa;AAC9C,kBAAQ,KAAK,IAAI;AAAA,QACnB;AAAA,MACF;AACA,WAAK,kBAAkB,CAAC;AAAA,IAC1B,QAAQ;AAAA,IAER;AAEA,QAAI;AACF,UAAI,KAAK,iBAAiB,OAAO,WAAW,aAAa;AACvD,eAAO,QAAQ,KAAK;AAAA,MACtB;AACA,WAAK,gBAAgB;AAAA,IACvB,QAAQ;AAAA,IAER;AAEA,QAAI;AACF,UAAI,OAAO,mBAAmB,aAAa;AACzC,YAAI,KAAK,iBAAiB;AACxB,yBAAe,UAAU,OAAO,KAAK;AAAA,QACvC;AACA,YAAI,KAAK,iBAAiB;AACxB,yBAAe,UAAU,OAAO,KAAK;AAAA,QACvC;AACA,YAAI,KAAK,sBAAsB;AAC7B,yBAAe,UAAU,mBAAmB,KAAK;AAAA,QACnD;AAAA,MACF;AACA,WAAK,kBAAkB;AACvB,WAAK,kBAAkB;AACvB,WAAK,uBAAuB;AAAA,IAC9B,QAAQ;AAAA,IAER;AAEA,QAAI;AACF,UAAI,KAAK,cAAc;AACrB,eAAO,oBAAoB,SAAS,KAAK,YAAY;AACrD,aAAK,eAAe;AAAA,MACtB;AACA,UAAI,KAAK,kBAAkB;AACzB,eAAO,oBAAoB,sBAAsB,KAAK,gBAAgB;AACtE,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA,EAGQ,KAAK,OAAqC;AAChD,QAAI;AACF,UAAI,aAA4C;AAChD,UAAI,KAAK,OAAO,sBAAsB;AACpC,qBAAa,KAAK,OAAO,qBAAqB,KAAK;AAAA,MACrD;AACA,UAAI,CAAC,YAAY;AACf;AAAA,MACF;AACA,UAAI,WAAW,SAAS,WAAW;AACjC,aAAK,cAAc,KAAK,UAAU;AAAA,MACpC,WAAW,WAAW,SAAS,WAAW;AACxC,aAAK,cAAc,KAAK,UAAU;AAAA,MACpC,OAAO;AACL,aAAK,cAAc,KAAK,UAAU;AAAA,MACpC;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAuB;AAC7B,QAAI,OAAO,YAAY,aAAa;AAClC;AAAA,IACF;AACA,eAAW,SAAS,gBAAgB;AAClC,YAAM,WAAW,QAAQ,KAAK;AAC9B,UAAI,OAAO,aAAa,YAAY;AAClC;AAAA,MACF;AAEA,WAAK,gBAAgB,KAAK,IAAI;AAC9B,YAAM,UAAU,CAAC,SAAoB,KAAK,eAAe,OAAO,IAAI;AACpE,cAAQ,KAAK,IAAI,SAAS,wBAAuC,MAAiB;AAEhF,iBAAS,MAAM,QAAQ,SAAS,IAAI;AACpC,YAAI;AACF,kBAAQ,IAAI;AAAA,QACd,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe,OAA4B,MAAuB;AACxE,UAAM,UAAU,KAAK,SAAS,OAAO,cAAc,IAAI,CAAC;AACxD,UAAM,WAAW,KAAK,IAAI,CAAC,QAAQ,UAAU,GAAG,CAAC;AACjD,SAAK,KAAK;AAAA,MACR,IAAI,OAAO;AAAA,MACX,MAAM;AAAA,MACN;AAAA,MACA,WAAW,OAAO;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAA6B;AACnC,SAAK,eAAe,CAAC,UAAsB;AACzC,UAAI;AACF,cAAM,UAAU,MAAM,WAAY,MAAM,SAAS,OAAO,MAAM,KAAK,KAAM;AACzE,aAAK,KAAK;AAAA,UACR,IAAI,OAAO;AAAA,UACX,MAAM;AAAA,UACN,WAAW,OAAO;AAAA,UAClB,SAAS,KAAK,SAAS,OAAO,eAAe,OAAO,CAAC;AAAA,UACrD,OAAO,MAAM,OAAO,QAAQ,KAAK,SAAS,OAAO,eAAe,MAAM,MAAM,KAAK,CAAC,IAAI;AAAA,UACtF,QAAQ,MAAM,WAAW,KAAK,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,UAC7D,MAAM,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS;AAAA,UACxD,QAAQ,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAAA,QAC1D,CAAC;AAAA,MACH,QAAQ;AAAA,MAER;AAAA,IACF;AACA,SAAK,mBAAmB,CAAC,UAAiC;AACxD,UAAI;AACF,cAAM,SAAS,MAAM;AACrB,YAAI;AACJ,YAAI;AACJ,YAAI,kBAAkB,OAAO;AAC3B,oBAAU,GAAG,OAAO,IAAI,KAAK,OAAO,OAAO;AAC3C,kBAAQ,OAAO;AAAA,QACjB,OAAO;AACL,oBAAU,cAAc,CAAC,MAAM,CAAC;AAAA,QAClC;AACA,aAAK,KAAK;AAAA,UACR,IAAI,OAAO;AAAA,UACX,MAAM;AAAA,UACN,WAAW,OAAO;AAAA,UAClB,SAAS,KAAK,SAAS,OAAO,eAAe,OAAO,CAAC;AAAA,UACrD,OAAO,QAAQ,KAAK,SAAS,OAAO,eAAe,KAAK,CAAC,IAAI;AAAA,QAC/D,CAAC;AAAA,MACH,QAAQ;AAAA,MAER;AAAA,IACF;AAGA,WAAO,iBAAiB,SAAS,KAAK,YAAY;AAClD,WAAO,iBAAiB,sBAAsB,KAAK,gBAAgB;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,KAAsB;AAC7C,QAAI;AAEF,UAAI,iBAAiB,KAAK,GAAG,GAAG;AAC9B,eAAO;AAAA,MACT;AACA,UAAI,KAAK,OAAO,WAAW,SAAS,KAAK,WAAW,KAAK,KAAK,OAAO,UAAU,GAAG;AAChF,eAAO;AAAA,MACT;AACA,UAAI,KAAK,OAAO,YAAY,SAAS,KAAK,CAAC,WAAW,KAAK,KAAK,OAAO,WAAW,GAAG;AACnF,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,QAAQ,MAAuD;AACrE,UAAM,MAAM,KAAK,OAAO;AACxB,QAAI,KAAK,UAAU,KAAK;AACtB,aAAO,EAAE,SAAS,MAAM,WAAW,MAAM;AAAA,IAC3C;AACA,WAAO,EAAE,SAAS,KAAK,MAAM,GAAG,GAAG,GAAG,WAAW,KAAK;AAAA,EACxD;AAAA;AAAA,EAGQ,mBAAmB,MAAmC;AAC5D,QAAI,CAAC,KAAK,OAAO,iBAAiB,QAAQ,MAAM;AAC9C,aAAO;AAAA,IACT;AACA,QAAI;AACF,UAAI;AACJ,UAAI,OAAO,SAAS,UAAU;AAC5B,eAAO;AAAA,MACT,WAAW,OAAO,oBAAoB,eAAe,gBAAgB,iBAAiB;AACpF,eAAO,KAAK,SAAS;AAAA,MACvB,OAAO;AAEL,eAAO;AAAA,MACT;AACA,YAAM,EAAE,QAAQ,IAAI,KAAK,QAAQ,IAAI;AACrC,aAAO,KAAK,SAAS,KAAK,OAAO;AAAA,IACnC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAqB;AAC3B,QAAI,OAAO,WAAW,eAAe,OAAO,OAAO,UAAU,YAAY;AACvE;AAAA,IACF;AACA,UAAM,WAAW,OAAO,MAAM,KAAK,MAAM;AACzC,SAAK,gBAAgB,OAAO;AAK5B,UAAM,eAAe,CACnB,OACA,SACsB;AACtB,YAAM,QAAQ,QAAQ;AACtB,UAAI,SAAS;AACb,UAAI,MAAM;AACV,UAAI,iBAAyC,CAAC;AAC9C,UAAI;AACJ,UAAI;AACF,YAAI,OAAO,UAAU,UAAU;AAC7B,gBAAM;AAAA,QACR,WAAW,iBAAiB,KAAK;AAC/B,gBAAM,MAAM,SAAS;AAAA,QACvB,WAAW,SAAS,OAAQ,MAAkB,QAAQ,UAAU;AAC9D,gBAAO,MAAkB;AACzB,mBAAU,MAAkB,UAAU;AAAA,QACxC;AACA,YAAI,MAAM;AACR,mBAAS,KAAK,UAAU;AACxB,2BAAiB,gBAAgB,KAAK,OAAO;AAC7C,wBAAc,KAAK;AAAA,QACrB,WAAW,iBAAiB,SAAS;AACnC,2BAAiB,gBAAgB,MAAM,OAAO;AAAA,QAChD;AACA,iBAAS,OAAO,YAAY;AAAA,MAC9B,QAAQ;AAAA,MAER;AAEA,YAAM,aAAa,MAAM;AACvB,YAAI;AACF,iBAAO,KAAK,iBAAiB,GAAG;AAAA,QAClC,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF,GAAG;AAEH,YAAM,kBAAkB,SAAS,OAAsB,IAAI;AAE3D,UAAI,CAAC,WAAW;AACd,eAAO;AAAA,MACT;AAEA,YAAM,aAAa,KAAK,SAAS,QAAQ,cAAc;AACvD,YAAM,iBAAiB,KAAK,mBAAmB,WAAW;AAE1D,aAAO,gBAAgB;AAAA,QACrB,CAAC,aAAa;AACZ,cAAI;AACF,iBAAK,qBAAqB;AAAA,cACxB;AAAA,cACA;AAAA,cACA;AAAA,cACA,gBAAgB;AAAA,cAChB,oBAAoB;AAAA,cACpB;AAAA,YACF,CAAC;AAAA,UACH,QAAQ;AAAA,UAER;AACA,iBAAO;AAAA,QACT;AAAA,QACA,CAAC,UAAmB;AAClB,cAAI;AACF,iBAAK,KAAK;AAAA,cACR,IAAI,OAAO;AAAA,cACX,MAAM;AAAA,cACN,WAAW;AAAA,cACX,WAAW,OAAO;AAAA,cAClB;AAAA,cACA,KAAK,KAAK,SAAS,IAAI,GAAG;AAAA,cAC1B,YAAY,KAAK,MAAM,QAAQ,IAAI,KAAK;AAAA,cACxC,gBAAgB;AAAA,cAChB,oBAAoB;AAAA,cACpB,OAAO,KAAK,SAAS;AAAA,gBACnB,iBAAiB,QAAQ,GAAG,MAAM,IAAI,KAAK,MAAM,OAAO,KAAK,OAAO,KAAK;AAAA,cAC3E;AAAA,YACF,CAAC;AAAA,UACH,QAAQ;AAAA,UAER;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEQ,qBAAqB,MAOpB;AACP,UAAM,EAAE,OAAO,QAAQ,KAAK,gBAAgB,oBAAoB,SAAS,IAAI;AAC7E,UAAM,kBAAkB,KAAK,SAAS,QAAQ,gBAAgB,SAAS,OAAO,CAAC;AAC/E,UAAM,QAA6B;AAAA,MACjC,IAAI,OAAO;AAAA,MACX,MAAM;AAAA,MACN,WAAW;AAAA,MACX,WAAW,OAAO;AAAA,MAClB;AAAA,MACA,KAAK,KAAK,SAAS,IAAI,GAAG;AAAA,MAC1B,QAAQ,SAAS;AAAA,MACjB,YAAY,SAAS,cAAc;AAAA,MACnC,YAAY,KAAK,MAAM,QAAQ,IAAI,KAAK;AAAA,MACxC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,KAAK,KAAK;AAIf,QAAI,KAAK,OAAO,gBAAgB;AAC9B,UAAI;AACF,cAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAC5D,cAAM,UACJ,qBAAqB,KAAK,WAAW,KAAK,OAAO,SAAS,UAAU,cAAc,CAAC,SAAS;AAC9F,YAAI,SAAS;AACX,mBACG,MAAM,EACN,KAAK,EACL,KAAK,CAAC,SAAS;AACd,gBAAI;AACF,oBAAM,EAAE,SAAS,UAAU,IAAI,KAAK,QAAQ,IAAI;AAChD,oBAAM,sBAAsB,KAAK,SAAS,KAAK,OAAO;AACtD,oBAAM,wBAAwB;AAAA,YAChC,QAAQ;AAAA,YAER;AAAA,UACF,CAAC,EACA,MAAM,MAAM;AAAA,UAEb,CAAC;AAAA,QACL;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAmB;AACzB,QAAI,OAAO,mBAAmB,aAAa;AACzC;AAAA,IACF;AACA,SAAK,kBAAkB,eAAe,UAAU;AAChD,SAAK,kBAAkB,eAAe,UAAU;AAChD,SAAK,uBAAuB,eAAe,UAAU;AACrD,UAAM,eAAe,KAAK;AAC1B,UAAM,eAAe,KAAK;AAC1B,UAAM,oBAAoB,KAAK;AAK/B,UAAM,aAAa,CAAC,KAAqB,QAAgB,QAAsB;AAC7E,WAAK,SAAS,IAAI,KAAK;AAAA,QACrB,SAAS,UAAU,OAAO,YAAY;AAAA,QACtC,KAAK,OAAO,QAAQ,WAAW,MAAM,OAAO,GAAG;AAAA,QAC/C,OAAO;AAAA,QACP,gBAAgB,CAAC;AAAA,MACnB,CAAC;AAAA,IACH;AACA,UAAM,eAAe,CAAC,KAAqB,MAAc,UAAkB;AACzE,YAAM,QAAQ,KAAK,SAAS,IAAI,GAAG;AACnC,UAAI,OAAO;AACT,cAAM,eAAe,IAAI,IAAI;AAAA,MAC/B;AAAA,IACF;AACA,UAAM,aAAa,CAAC,KAAqB,SAAkB;AACzD,YAAM,QAAQ,KAAK,SAAS,IAAI,GAAG;AACnC,UAAI,SAAS,KAAK,iBAAiB,MAAM,GAAG,GAAG;AAC7C,cAAM,QAAQ,QAAQ;AACtB,cAAM,cAAc,KAAK,mBAAmB,IAAI;AAChD,aAAK,mBAAmB,KAAK,KAAK;AAAA,MACpC;AAAA,IACF;AAEA,mBAAe,UAAU,OAAO,SAAS,YAEvC,QACA,QACG,MACH;AACA,UAAI;AACF,mBAAW,MAAM,QAAQ,GAAG;AAAA,MAC9B,QAAQ;AAAA,MAER;AACA,aAAO,aAAa,MAAM,MAAM,CAAC,QAAQ,KAAe,GAAI,IAAW,CAAU;AAAA,IACnF;AAEA,mBAAe,UAAU,mBAAmB,SAAS,iBAEnD,MACA,OACA;AACA,UAAI;AACF,qBAAa,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MAER;AACA,aAAO,kBAAkB,KAAK,MAAM,MAAM,KAAK;AAAA,IACjD;AAEA,mBAAe,UAAU,OAAO,SAAS,YAEvC,MACA;AACA,UAAI;AACF,mBAAW,MAAM,IAAI;AAAA,MACvB,QAAQ;AAAA,MAER;AACA,aAAO,aAAa,KAAK,MAAM,IAAqC;AAAA,IACtE;AAAA,EACF;AAAA,EAEQ,mBACN,KACA,OAOM;AAEN,QAAI,YAAY;AAChB,UAAM,WAAW,CAAC,cAAuB;AACvC,UAAI,WAAW;AACb;AAAA,MACF;AACA,kBAAY;AACZ,UAAI;AACF,cAAM,kBAAkB,KAAK,SAAS,QAAQ,wBAAwB,GAAG,CAAC;AAC1E,cAAM,QAA6B;AAAA,UACjC,IAAI,OAAO;AAAA,UACX,MAAM;AAAA,UACN,WAAW;AAAA,UACX,WAAW,OAAO;AAAA,UAClB,QAAQ,MAAM;AAAA,UACd,KAAK,KAAK,SAAS,IAAI,MAAM,GAAG;AAAA,UAChC,QAAQ,YAAY,SAAY,IAAI,UAAU;AAAA,UAC9C,YAAY,IAAI,cAAc;AAAA,UAC9B,YAAY,KAAK,MAAM,QAAQ,IAAI,MAAM,KAAK;AAAA,UAC9C,gBAAgB,KAAK,SAAS,QAAQ,MAAM,cAAc;AAAA,UAC1D;AAAA,UACA,oBAAoB,MAAM;AAAA,UAC1B,OAAO,YAAY,KAAK,SAAS,OAAO,SAAS,IAAI;AAAA,QACvD;AAEA,YAAI,CAAC,aAAa,KAAK,OAAO,gBAAgB;AAC5C,gBAAM,KAAK,IAAI;AACf,gBAAM,SAAS,OAAO,MAAM,OAAO;AACnC,gBAAM,cAAc,sBAAsB,KAAK,cAAc;AAC7D,cAAI,WAAW,CAAC,eAAe,qBAAqB,KAAK,WAAW,IAAI;AACtE,gBAAI;AACF,oBAAM,OAAO,IAAI,gBAAgB;AACjC,oBAAM,EAAE,SAAS,UAAU,IAAI,KAAK,QAAQ,IAAI;AAChD,oBAAM,sBAAsB,KAAK,SAAS,KAAK,OAAO;AACtD,oBAAM,wBAAwB;AAAA,YAChC,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAEA,aAAK,KAAK,KAAK;AAAA,MACjB,QAAQ;AAAA,MAER;AAAA,IACF;AAGA,QAAI,iBAAiB,WAAW,MAAM,SAAS,CAAC;AAChD,QAAI,iBAAiB,SAAS,MAAM,SAAS,eAAe,CAAC;AAC7D,QAAI,iBAAiB,WAAW,MAAM,SAAS,SAAS,CAAC;AACzD,QAAI,iBAAiB,SAAS,MAAM,SAAS,SAAS,CAAC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,mBAA0C;AACxC,WAAO,KAAK,cAAc,SAAS;AAAA,EACrC;AAAA,EAEA,wBAAoD;AAClD,WAAO,KAAK,cAAc,SAAS;AAAA,EACrC;AAAA,EAEA,mBAA0C;AACxC,WAAO,KAAK,cAAc,SAAS;AAAA,EACrC;AAAA,EAEA,QAAc;AACZ,SAAK,cAAc,MAAM;AACzB,SAAK,cAAc,MAAM;AACzB,SAAK,cAAc,MAAM;AAAA,EAC3B;AACF;AAEA,SAAS,wBAAwB,KAA6C;AAC5E,QAAM,MAA8B,CAAC;AACrC,MAAI;AACF,UAAM,MAAM,IAAI,sBAAsB;AACtC,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AACA,eAAW,QAAQ,IAAI,KAAK,EAAE,MAAM,SAAS,GAAG;AAC9C,YAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,UAAI,MAAM,GAAG;AACX,cAAM,MAAM,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK;AACpC,cAAM,QAAQ,KAAK,MAAM,MAAM,CAAC,EAAE,KAAK;AACvC,YAAI,KAAK;AACP,cAAI,GAAG,IAAI;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,KAAqB,MAA6B;AAC/E,MAAI;AACF,WAAO,IAAI,kBAAkB,IAAI;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AhCzlBI,gBAAAC,aAAA;AA7HJ,SAAS,qBAAqB,QAA2C;AACvE,SAAO,KAAK,UAAU;AAAA,IACpB,SAAS,OAAO;AAAA,IAChB,SAAS,OAAO;AAAA,IAChB,eAAe,OAAO;AAAA,IACtB,OAAO,OAAO;AAAA,IACd,KAAK,OAAO;AAAA,IACZ,eAAe,OAAO;AAAA,IACtB,gBAAgB,OAAO;AAAA,IACvB,kBAAkB,OAAO;AAAA,IACzB,kBAAkB,OAAO;AAAA,IACzB,uBAAuB,OAAO;AAAA,IAC9B,kBAAkB,OAAO;AAAA,IACzB,aAAa,OAAO,YAAY;AAAA,IAChC,YAAY,OAAO,WAAW;AAAA,IAC9B,eAAe,OAAO;AAAA,EACxB,CAAC;AACH;AA6BO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAuB;AACrB,QAAM,qBAAqB,wBAAwB,YAAY,SAAS;AAKxE,QAAM,oBAAoB;AAAA,IACxB,MAAM,2BAA2B,WAAW;AAAA,IAC5C,CAAC,WAAW;AAAA,EACd;AACA,QAAM,kBAAkB;AAAA,IACtB,MAAM,qBAAqB,iBAAiB;AAAA,IAC5C,CAAC,iBAAiB;AAAA,EACpB;AACA,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAsC,IAAI;AAE5E,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,kBAAkB,SAAS;AAC9B,mBAAa,IAAI;AACjB;AAAA,IACF;AACA,UAAM,WAAW,IAAI,qBAAqB,iBAAiB;AAC3D,aAAS,QAAQ;AACjB,iBAAa,QAAQ;AACrB,WAAO,MAAM;AACX,eAAS,UAAU;AACnB,mBAAa,IAAI;AAAA,IACnB;AAAA,EAMF,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,sBAAsBC;AAAA,IAC1B,OAAO,YAAsC;AAC3C,UAAI,oBAAoB;AACtB,YAAI;AACF,gBAAM,SAAS,MAAM,oBAAoB;AAAA,YACvC;AAAA,YACA,YAAY;AAAA,YACZ;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AACD,wBAAc,MAAM;AACpB,cAAI,iBAAiB;AACnB,kBAAM,gBAAgB,OAAO;AAAA,UAC/B;AACA,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,gBAAM,aAAa,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,2BAA2B;AACzF,oBAAU,UAAU;AACpB,gBAAM;AAAA,QACR;AAAA,MACF;AAEA,UAAI,CAAC,iBAAiB;AACpB,eAAO;AAAA,MACT;AAEA,aAAO,MAAM,gBAAgB,OAAO;AAAA,IACtC;AAAA,IACA,CAAC,YAAY,aAAa,SAAS,aAAa,iBAAiB,oBAAoB,IAAI;AAAA,EAC3F;AAEA,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,YAAY,sBAAsB;AAAA,MAClC,WAAW,sBAAsB;AAAA,MACjC,iBAAiB;AAAA,MACjB;AAAA,MACA,sBAAsB;AAAA;AAAA,EACxB;AAEJ;AAEO,IAAM,gBAAgB;AAMtB,SAAS,kBAAkB,OAA2E;AAC3G,QAAM,SAAS,MAAM,UAAU,SAAS,cAAc,KAAK;AAC3D,MAAI,CAAC,MAAM,QAAQ;AACjB,aAAS,KAAK,YAAY,MAAM;AAAA,EAClC;AACA,QAAM,OAAa,WAAW,MAAM;AACpC,OAAK,OAAO,gBAAAA,MAAC,iBAAe,GAAG,OAAO,CAAE;AACxC,SAAO;AAAA,IACL,UAAU;AACR,WAAK,QAAQ;AACb,UAAI,CAAC,MAAM,QAAQ;AACjB,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;AAUA,IAAI,OAAO,WAAW,aAAa;AACjC,SAAO,UAAU,OAAO,WAAW,EAAE,MAAM,kBAAkB;AAC/D;","names":["useCallback","useEffect","useState","useCallback","useEffect","useRef","useState","createPortal","css","classNames","css","jsx","jsxs","AnnotationPopupCSS","console","css","classNames","styles_module_default","css","classNames","styles_module_default","jsx","jsxs","styles_module_default","css","classNames","styles_module_default","jsx","jsxs","styles_module_default","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","css","classNames","styles_module_default","jsx","styles_module_default","css","classNames","styles_module_default","jsx","jsxs","styles_module_default","css","classNames","styles_module_default","Fragment","jsx","jsxs","styles_module_default","WIDGET_ROOT_SELECTOR","Fragment","jsx","jsxs","useState","useRef","useCallback","useEffect","rect","dataUrl","styles_module_default","createPortal","out","jsx","useState","useEffect","useCallback"]}
|