@weasel-js/labkit 1.4.3 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -2
- package/dist/_dts/{CanvasStackContext-Dde8_1my.d.ts → CanvasStackContext-CqkxkFJW.d.ts} +1 -1
- package/dist/_dts/ToggleBar.d-DbHoWKIA.d.ts +116 -0
- package/dist/_dts/{frac-B5mB8LsJ.d.ts → frac-8R6UmlvN.d.ts} +256 -33
- package/dist/_dts/index-B8uu2ba7.d.ts +237 -0
- package/dist/_dts/{index-DelFfeV0.d.ts → index-retnAut7.d.ts} +45 -12
- package/dist/_dts/{types-B9_zrHmb.d.ts → types-Ca2LCnPq.d.ts} +65 -2
- package/dist/_dts/usePanZoom-nS798rOF.d.ts +160 -0
- package/dist/_dts/useTrialState-jcx_TdU6.d.ts +212 -0
- package/dist/canvas/index.d.ts +17 -128
- package/dist/canvas/index.js +4 -2
- package/dist/chrome/index.d.ts +4 -92
- package/dist/chrome/index.js +9 -5
- package/dist/chunk-67SJLMC7.js +704 -0
- package/dist/chunk-67SJLMC7.js.map +1 -0
- package/dist/chunk-6ZDGOZQV.js +310 -0
- package/dist/chunk-6ZDGOZQV.js.map +1 -0
- package/dist/{chunk-QAGAHJKZ.js → chunk-EKIICY6X.js} +111 -25
- package/dist/chunk-EKIICY6X.js.map +1 -0
- package/dist/{chunk-CTRKTLYZ.js → chunk-H6ZAOWNE.js} +11 -11
- package/dist/chunk-H6ZAOWNE.js.map +1 -0
- package/dist/{chunk-2RQPGOQF.js → chunk-KJALCDWE.js} +9 -7
- package/dist/chunk-KJALCDWE.js.map +1 -0
- package/dist/{chunk-ISCOFAUO.js → chunk-MUKOW3TC.js} +3 -3
- package/dist/{chunk-ISCOFAUO.js.map → chunk-MUKOW3TC.js.map} +1 -1
- package/dist/chunk-NDRYLVOW.js +15 -0
- package/dist/chunk-NDRYLVOW.js.map +1 -0
- package/dist/{chunk-C42T6DJT.js → chunk-NS64DXMN.js} +226 -159
- package/dist/chunk-NS64DXMN.js.map +1 -0
- package/dist/{chunk-I6JCVE24.js → chunk-PGETSEDK.js} +135 -13
- package/dist/chunk-PGETSEDK.js.map +1 -0
- package/dist/{chunk-FQMJUVHJ.js → chunk-QLSV2N3G.js} +32 -37
- package/dist/chunk-QLSV2N3G.js.map +1 -0
- package/dist/chunk-RWNDDKOH.js +682 -0
- package/dist/chunk-RWNDDKOH.js.map +1 -0
- package/dist/chunk-S2SHZRD7.js +7681 -0
- package/dist/chunk-S2SHZRD7.js.map +1 -0
- package/dist/{chunk-ASWKLRKJ.js → chunk-TQBBYTAF.js} +19 -82
- package/dist/chunk-TQBBYTAF.js.map +1 -0
- package/dist/chunk-UU3NJO6N.js +72 -0
- package/dist/chunk-UU3NJO6N.js.map +1 -0
- package/dist/chunk-WIG6XHJ7.js +35 -0
- package/dist/chunk-WIG6XHJ7.js.map +1 -0
- package/dist/{chunk-TJ7QY3OC.js → chunk-ZPH5WTWF.js} +21 -15
- package/dist/chunk-ZPH5WTWF.js.map +1 -0
- package/dist/config/index.d.ts +232 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/controls/index.d.ts +2 -3
- package/dist/controls/index.js +3 -2
- package/dist/dragdrop/index.d.ts +2 -4
- package/dist/index.d.ts +123 -348
- package/dist/index.js +794 -837
- package/dist/index.js.map +1 -1
- package/dist/layers/index.d.ts +3 -5
- package/dist/layers/index.js +2 -2
- package/dist/loupe/index.d.ts +6 -8
- package/dist/loupe/index.js +2 -2
- package/dist/passthrough/weasel-ui.d.ts +169 -117
- package/dist/passthrough/weasel-ui.js +1 -1
- package/dist/primitives/index.d.ts +53 -6
- package/dist/primitives/index.js +6 -4
- package/dist/state/index.d.ts +12 -7
- package/dist/state/index.js +16 -13
- package/dist/state/index.js.map +1 -1
- package/dist/styles.css +163 -62
- package/dist/surface/index.d.ts +44 -7
- package/dist/surface/index.js +2 -1
- package/dist/ui/layers/index.js +1 -1
- package/dist/undo/index.d.ts +2 -4
- package/package.json +15 -8
- package/src/annotations/AnnotationOverlay.tsx +53 -5
- package/src/annotations/Annotations.overlay.test.tsx +85 -6
- package/src/annotations/drawOne.test.ts +1 -1
- package/src/annotations/drawOne.ts +2 -2
- package/src/annotations/frac.test.ts +4 -4
- package/src/annotations/frac.ts +3 -2
- package/src/annotations/index.ts +1 -1
- package/src/annotations/paint.test.ts +2 -2
- package/src/annotations/paint.ts +1 -1
- package/src/annotations/preload.ts +6 -0
- package/src/annotations/store.test.ts +18 -0
- package/src/annotations/store.ts +7 -6
- package/src/annotations/svgNodes.test.ts +2 -2
- package/src/annotations/svgNodes.ts +1 -2
- package/src/annotations/toolMap.ts +3 -3
- package/src/annotations/types.ts +6 -3
- package/src/canvas/CameraWheelContext.ts +12 -0
- package/src/canvas/CanvasStack.test.tsx +25 -0
- package/src/canvas/CanvasStack.tsx +31 -4
- package/src/canvas/Stage.less +18 -0
- package/src/canvas/Stage.test.tsx +186 -0
- package/src/canvas/Stage.tsx +134 -0
- package/src/canvas/camera.test.ts +17 -2
- package/src/canvas/camera.ts +9 -9
- package/src/canvas/index.ts +4 -0
- package/src/canvas/usePanZoom.ts +10 -5
- package/src/chrome/ChromeRegions.stories.tsx +0 -3
- package/src/chrome/LabChrome.tsx +114 -0
- package/src/chrome/builtins.tsx +20 -31
- package/src/chrome/index.ts +15 -0
- package/src/chrome/labRegions.test.tsx +208 -0
- package/src/chrome/labTypes.ts +50 -0
- package/src/chrome/merge.ts +7 -9
- package/src/chrome/regions/PaletteRegion.test.tsx +6 -4
- package/src/chrome/regions/PaletteRegion.tsx +21 -9
- package/src/chrome/regions/SidebarRegion.tsx +25 -13
- package/src/chrome/regions/StatusRegion.tsx +15 -8
- package/src/chrome/regions/ToolbarRegion.tsx +30 -16
- package/src/chrome/types.ts +47 -20
- package/src/config/builder.test.ts +4 -0
- package/src/config/builder.ts +16 -10
- package/src/config/declarationEmit.fixture.ts +11 -0
- package/src/config/declarationEmit.test.ts +51 -0
- package/src/config/entry.test.ts +46 -0
- package/src/config/index.ts +13 -1
- package/src/config/nodeClasses.test.ts +18 -0
- package/src/config/types.ts +3 -1
- package/src/controls/ControlPanel.test.tsx +16 -0
- package/src/controls/ControlPanel.tsx +5 -2
- package/src/fake-indexeddb-auto.d.ts +5 -0
- package/src/index.test.ts +7 -0
- package/src/index.ts +39 -6
- package/src/instrument/serializers.test.ts +22 -0
- package/src/instrument/serializers.ts +11 -0
- package/src/instrument/types.ts +25 -1
- package/src/lab/Lab.less +4 -13
- package/src/lab/Lab.persist.test.tsx +147 -0
- package/src/lab/Lab.stories.tsx +0 -2
- package/src/lab/Lab.surface.test.tsx +66 -3
- package/src/lab/Lab.test.tsx +91 -17
- package/src/lab/Lab.tsx +337 -124
- package/src/lab/LabFit.stories.less +18 -0
- package/src/lab/LabFit.stories.tsx +219 -0
- package/src/lab/LabFullChrome.stories.tsx +0 -3
- package/src/lab/LabHeader.test.tsx +40 -9
- package/src/lab/LabHeader.tsx +7 -13
- package/src/lab/LabPalette.tsx +13 -26
- package/src/lab/LabShell.less +49 -12
- package/src/lab/LabShell.tsx +14 -2
- package/src/lab/LabSwitcher.less +92 -0
- package/src/lab/LabSwitcher.test.tsx +96 -0
- package/src/lab/LabSwitcher.tsx +112 -0
- package/src/lab/Workspace.surface.test.tsx +2 -1
- package/src/lab/fitCheck.test.ts +57 -0
- package/src/lab/fitCheck.ts +125 -0
- package/src/lab/index.ts +2 -0
- package/src/loupe/AGENTS.md +1 -1
- package/src/loupe/Loupe.less +1 -1
- package/src/loupe/canvasLens.ts +1 -1
- package/src/loupe/types.ts +1 -1
- package/src/loupe/useLoupe.test.tsx +1 -1
- package/src/loupe/useLoupe.ts +1 -1
- package/src/passthrough/weasel-ui.ts +9 -0
- package/src/primitives/FloatingPanel.stories.tsx +13 -1
- package/src/primitives/FloatingPanel.test.tsx +47 -16
- package/src/primitives/FloatingPanel.tsx +11 -25
- package/src/primitives/Split.less +14 -0
- package/src/primitives/Split.test.tsx +108 -0
- package/src/primitives/Split.tsx +159 -0
- package/src/primitives/ZoomControl.tsx +5 -2
- package/src/primitives/index.ts +2 -0
- package/src/state/Persistence.stories.tsx +75 -0
- package/src/state/Persistence.tsx +33 -0
- package/src/state/SingletonExperiment.test.tsx +47 -53
- package/src/state/SingletonExperiment.tsx +24 -13
- package/src/state/adapterContract.ts +116 -0
- package/src/state/adapters.test.ts +113 -61
- package/src/state/adapters.ts +328 -69
- package/src/state/document.test.ts +71 -96
- package/src/state/document.ts +66 -52
- package/src/state/helpers.test.ts +20 -0
- package/src/state/helpers.ts +16 -0
- package/src/state/index.ts +8 -0
- package/src/state/labRecords.test.ts +105 -0
- package/src/state/labRecords.ts +160 -0
- package/src/state/openLabStore.test.ts +658 -0
- package/src/state/openLabStore.ts +403 -0
- package/src/state/records.test.ts +234 -0
- package/src/state/records.ts +219 -0
- package/src/state/store.test.ts +104 -635
- package/src/state/store.ts +117 -158
- package/src/state/toolSlot.test.ts +1 -1
- package/src/state/types.ts +39 -15
- package/src/state/useOpenOnce.ts +68 -0
- package/src/state/usePersistedState.test.tsx +125 -0
- package/src/state/usePersistedState.ts +66 -0
- package/src/state/useTrialState.test.tsx +2 -3
- package/src/state/view.test.ts +49 -15
- package/src/state/view.ts +18 -1
- package/src/styles.less +3 -0
- package/src/surface/AGENTS.md +39 -7
- package/src/surface/SurfaceContext.ts +26 -3
- package/src/surface/index.ts +2 -0
- package/src/surface/useSurfaceTile.test.tsx +2 -1
- package/src/surface/useSurfaceTile.ts +6 -5
- package/src/surface/useTiledSurface.test.tsx +175 -0
- package/src/surface/useTiledSurface.ts +54 -5
- package/src/theme/Interstellar.stories.tsx +7 -7
- package/src/theme/base.less +4 -4
- package/src/theme/interstellar.test.ts +1 -1
- package/src/theme/interstellar.tokens.json +2 -2
- package/src/tools/labTool.ts +11 -0
- package/src/trial/Trial.annotations.persist.test.tsx +100 -58
- package/src/trial/Trial.annotations.test.tsx +47 -4
- package/src/trial/Trial.job.test.tsx +3 -3
- package/src/trial/Trial.less +1 -26
- package/src/trial/Trial.stories.tsx +1 -2
- package/src/trial/Trial.test.tsx +28 -4
- package/src/trial/Trial.trialId.test.tsx +23 -1
- package/src/trial/Trial.tsx +118 -38
- package/src/trial/TrialBody.tsx +17 -141
- package/src/trial/TrialChrome.tsx +7 -4
- package/src/trial/trialOps.ts +7 -4
- package/dist/_dts/types-BP2OCcpg.d.ts +0 -155
- package/dist/_dts/types-x92Kfeme.d.ts +0 -62
- package/dist/_dts/useTrialState-D6Vb3T-g.d.ts +0 -99
- package/dist/chunk-2RQPGOQF.js.map +0 -1
- package/dist/chunk-5TROQVQ2.js +0 -547
- package/dist/chunk-5TROQVQ2.js.map +0 -1
- package/dist/chunk-ASWKLRKJ.js.map +0 -1
- package/dist/chunk-C42T6DJT.js.map +0 -1
- package/dist/chunk-CTRKTLYZ.js.map +0 -1
- package/dist/chunk-FQMJUVHJ.js.map +0 -1
- package/dist/chunk-I6JCVE24.js.map +0 -1
- package/dist/chunk-MHAGC6VD.js +0 -7320
- package/dist/chunk-MHAGC6VD.js.map +0 -1
- package/dist/chunk-QAGAHJKZ.js.map +0 -1
- package/dist/chunk-TJ7QY3OC.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../svg/src/types.ts","../../svg/src/transform.ts","../../svg/src/patterns.ts","../../svg/src/path-serializer.ts","../../svg/src/gradients.ts","../../svg/src/serialize.ts","../src/annotations/paint.ts","../src/annotations/staleness.ts","../src/annotations/drawOne.ts","../src/annotations/svgNodes.ts","../src/annotations/capture.ts","../src/annotations/frac.ts","../src/annotations/history.ts","../src/annotations/store.ts","../src/annotations/view.ts","../src/annotations/AnnotationOverlay.tsx","../src/annotations/AnnotationTargets.tsx","../src/config/builder.ts","../src/config/rules.ts","../src/config/resolve.ts","../src/lab/LabContext.ts","../src/config/useConfigSchema.ts","../src/instrument/defineInstrument.ts","../src/instrument/validateConfigSchema.ts","../../theme/src/generated/themes.ts","../../theme/src/theme.ts","../../theme/src/dtcg/color.ts","../../theme/src/dtcg/resolve.ts","../../theme/src/resolveTheme.ts","../../theme/src/applyTheme.ts","../../theme/src/react.tsx","../src/instrument/serializers.ts","../../theme/src/dtcg/types.ts","../../theme/src/dtcg/flatten.ts","../../theme/src/loadDTCG.ts","../src/theme/interstellar.tokens.json","../src/theme/interstellar.ts","../src/state/view.ts","../src/trial/TrialBody.tsx","../src/trial/TrialDragContext.ts","../src/trial/TrialTitleBar.tsx","../src/lab/panelHost.ts","../src/trial/UndockedSections.tsx","../src/trial/TrialChrome.tsx","../src/trial/Trial.tsx","../src/trial/trialOps.ts","../src/lab/LabHeader.tsx","../src/lab/LabPalette.tsx","../src/lab/useSystemMode.ts","../src/lab/LabShell.tsx","../src/lab/Workspace.tsx","../src/lab/Lab.tsx"],"names":["r","y","c","PATH_M","PATH_L","PATH_C","PATH_Q","PATH_Z","escapeAttr","boundsOfPath","PathBuilder","k","resolveStrokeWidth","w","asNodeId","f","jsx","Fragment","useContext","g","createContext","useRef","useMemo","serialize","store","useEffect","jsxs","createPortal","useStore","useState","DEFAULT_VIEW","ZONE_ID","STRATEGIES","Store","createNode","useLayoutEffect","Container","Provider","StrategyRegistryProvider","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Public types for `@weasel-js/svg`. The package exposes a flat,\n * discriminated-union node model (`SvgNode`) that mirrors the SVG element\n * tree but uses weasel-native leaf data (`Path`, `FillStyle`) for geometry and\n * paint.\n *\n * Parsing collapses every `transform=\"...\"` onto its descendants' geometry,\n * so the `SvgNode` tree returned from `parseSvg` never has a non-identity\n * group transform. Consumers may still construct groups with explicit\n * transforms before serializing, in which case the serializer emits a\n * single `matrix(a b c d e f)` on the `<g>`.\n */\n\nimport type { Path, FillStyle, Stroke, StyledRun, TextStyle } from '@weasel-js/core';\n\n/**\n * Opaque pass-through bag for namespaced XML content.\n *\n * weasel-svg does not interpret the contents — it only ensures that any\n * attributes or child elements in a *declared* XML namespace round-trip\n * losslessly through parse → serialize. Consumers (e.g. an app-specific\n * bridge layer) hang their domain semantics off this structure.\n *\n * Keyed by namespace prefix (the prefix is a write-time choice; the URI\n * is the canonical identifier and is supplied via `ParseOptions.namespaces`\n * / `SerializeOptions.namespaces`).\n */\nexport interface NamespaceMeta {\n [prefix: string]: {\n /** Local-name → string-value map for attributes in this namespace. */\n attrs?: Record<string, string>;\n /**\n * Child elements in this namespace, keyed by local name. Each entry\n * is an array because a namespace can host multiple sibling elements\n * with the same tag (e.g. `<wd:layer/><wd:layer/>`).\n */\n elements?: Record<string, NamespacedElement[]>;\n };\n}\n\n/** Opaque structured representation of a namespaced element. */\nexport interface NamespacedElement {\n /** Attribute local-name → string-value. */\n attrs: Record<string, string>;\n /** Text content, when the element contains only text (no child elements). */\n text?: string;\n /** Nested namespaced children, keyed by local name (recursive). */\n children?: Record<string, NamespacedElement[]>;\n}\n\n/**\n * 2x3 affine matrix in column-major form (SVG's `matrix(a b c d e f)`\n * order). Maps `[x', y'] = [a*x + c*y + e, b*x + d*y + f]`.\n */\nexport type Matrix = readonly [number, number, number, number, number, number];\n\n/** Identity matrix — useful as a default in tests / constructors. */\nexport const IDENTITY_MATRIX: Matrix = [1, 0, 0, 1, 0, 0];\n\n/**\n * FillStyle description in the SVG sense — either explicit `none`, a solid\n * color, or a reference to a weasel-native gradient `FillStyle`. Solid colors\n * are normalized to `#rrggbb` strings; opacity is carried separately so\n * `fill-opacity` and `stroke-opacity` round-trip cleanly.\n */\nexport type SvgPaint =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; opacity?: number }\n | { kind: 'gradient'; paint: FillStyle };\n\n/** Stroke description: a paint plus structural line parameters. */\nexport interface SvgStroke {\n paint: SvgPaint;\n width: number;\n opacity?: number;\n /** `stroke-linecap`. Default per SVG spec is `'butt'`. */\n cap?: 'butt' | 'round' | 'square';\n /** `stroke-linejoin`. Default per SVG spec is `'miter'`. SVG's `arcs` / `miter-clip` map to `'miter'` with a warning. */\n join?: 'miter' | 'round' | 'bevel';\n /** `stroke-dasharray` as a flat number array. Odd-length inputs are doubled per SVG spec. */\n dash?: number[];\n /**\n * `stroke-miterlimit`. SVG's default is 4. Weasel's renderer defaults to\n * 10 (Canvas2D) when unset, so parsed strokes without an explicit\n * attribute may render with longer miters than the source SVG intended.\n */\n miterLimit?: number;\n /** `marker-start` / `marker-mid` / `marker-end`, as the bare `url(#id)` key. */\n markerStart?: string;\n markerMid?: string;\n markerEnd?: string;\n}\n\n/**\n * Leaf node: a path geometry plus fill/stroke. All other v1 shapes\n * (`<rect>`, `<ellipse>`, etc.) are lowered to this representation on\n * parse — `<rect>` uses weasel's `RectPath` fast-path subtype when\n * possible, everything else becomes a `PolygonPath`.\n */\nexport interface SvgPathNode {\n kind: 'path';\n path: Path;\n fill: SvgPaint;\n stroke?: SvgStroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the AABB\n * center of the underlying `path` geometry. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Group node: an SVG `<g>`. On parse, `transform` is always omitted (any\n * `transform` attribute is collapsed onto descendants' geometry). On\n * serialize, a non-identity `transform` is emitted as\n * `matrix(a b c d e f)`.\n */\nexport interface SvgGroupNode {\n kind: 'group';\n children: SvgNode[];\n transform?: Matrix;\n opacity?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Width given to an external `<text>` that carries no `data-weasel-width`:\n * large enough that line wrapping never fires, since SVG text flows from a\n * baseline and the source says nothing about a box.\n *\n * It is a wrap sentinel, not a measurement. Anything that treats a text\n * node's width as geometry — a union AABB, a fit-clamp — has to recognize it\n * and substitute an estimate, or one text node swamps the whole file.\n */\nexport const UNBOUNDED_TEXT_WIDTH = 99999;\n\n/**\n * Text leaf node. Mirrors the kit's `TextPose` shape — a bounding box plus\n * text content, optional rich-text `runs` (per-range styling), and an\n * optional `TextStyle` for the node-wide defaults.\n *\n * Note on SVG text geometry: native `<text>` flows from a baseline; it\n * doesn't have width/height attributes. The serializer emits\n * `dominant-baseline=\"text-before-edge\"` so `y` is the top of the text\n * box, plus `data-weasel-width` / `data-weasel-height` so weasel's\n * explicit box dimensions round-trip losslessly. External SVG text\n * (lacking the data-* attrs) imports with estimated dimensions —\n * {@link UNBOUNDED_TEXT_WIDTH} and\n * `height = fontSize * lineHeight * (lineCount || 1)`.\n */\nexport interface SvgTextNode {\n kind: 'text';\n x: number;\n y: number;\n width: number;\n height: number;\n /** Plain text. When `runs` is set, `runsToPlainText(runs)` must equal `text`. */\n text: string;\n /** Optional per-range styling — same shape as `TextPose.runs`. */\n runs?: StyledRun[];\n /** Node-wide typography. Defaults applied at render time via `resolveTextStyle`. */\n style?: TextStyle;\n /**\n * Node-wide glyph paint, the `FillStyle` / `Stroke` a kit text node holds\n * in `data.fill` / `data.stroke`. Not `SvgPaint`, which is the path\n * nodes' shape — a text paint reaches the renderer through the runs, and\n * `StyledRun.fill` / `.stroke` override these per range.\n *\n * `null` is SVG's `fill=\"none\"`: outline-only text, painted by its stroke\n * alone. Absent takes the default black.\n */\n fill?: FillStyle | null;\n stroke?: Stroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Raster-image leaf — an SVG `<image>`. `href` is the element's `href` (or\n * legacy `xlink:href`) verbatim: an external URL or a `data:` URI. The\n * package neither fetches nor decodes it, so an external URL round-trips as\n * a reference and only resolves when something downstream loads it.\n *\n * SVG's `preserveAspectRatio` is not modeled; the box is taken literally.\n */\nexport interface SvgImageNode {\n kind: 'image';\n href: string;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/** Discriminated-union node — the leaf of the public tree. */\nexport type SvgNode = SvgPathNode | SvgGroupNode | SvgTextNode | SvgImageNode;\n\n/** Options for {@link parseSvg}. */\nexport interface ParseOptions {\n /**\n * Map of prefix → URI for XML namespaces the caller wants surfaced.\n * Attributes / child elements in any declared namespace are collected\n * into `SvgNode.meta` (per element) or `ParseResult.documentMeta` (root).\n * Undeclared namespaces are preserved in the DOM but not promoted into\n * the structured `meta` bag; they are silently dropped at serialize time.\n */\n namespaces?: Record<string, string>;\n}\n\n/** Output of {@link parseSvg}. */\nexport interface ParseResult {\n nodes: SvgNode[];\n /** Non-fatal notices (unsupported elements, unrecognized attributes). */\n warnings: string[];\n /**\n * Opaque per-document bag for declared namespaces. Holds root-level\n * namespaced attributes (`documentMeta.<prefix>.attrs`) and namespaced\n * root children (`documentMeta.<prefix>.elements`).\n */\n documentMeta?: NamespaceMeta;\n /** Root `viewBox` attribute, parsed from `\"x y width height\"`. */\n viewBox?: { x: number; y: number; width: number; height: number };\n /** Root `width` attribute, parsed as a unitless number when present. */\n width?: number;\n /** Root `height` attribute, parsed as a unitless number when present. */\n height?: number;\n /** Text content of the first `<title>` child of `<svg>`, when present. */\n title?: string;\n}\n\n/** Options for {@link serializeSvg}. */\nexport interface SerializeOptions {\n /**\n * Override the root `viewBox`. When omitted, the serializer computes\n * a tight bounding box from the supplied nodes.\n */\n viewBox?: { x: number; y: number; width: number; height: number };\n /**\n * Called for paint that can't be expressed in SVG and is dropped — a\n * conic gradient, or a pattern carrying a `TextureHandle` instead of a\n * `TilePatternSpec`. Without this the loss is silent.\n */\n onWarn?: (message: string) => void;\n /** Emit `width=\"...\"` on the root `<svg>`. */\n width?: number;\n /** Emit `height=\"...\"` on the root `<svg>`. */\n height?: number;\n /**\n * Emit `<title>...</title>` as the first child of the root `<svg>`. The\n * value is XML-escaped on output. Empty strings are skipped.\n */\n title?: string;\n /**\n * Map of prefix → URI for XML namespaces to declare on the root\n * `<svg>`. The serializer reads `documentMeta[prefix]` and\n * `node.meta[prefix]` to write the actual attributes and elements.\n */\n namespaces?: Record<string, string>;\n /**\n * Opaque per-document namespaced extras. Each `<prefix>.attrs` becomes\n * `<prefix>:<name>=\"...\"` attributes on the root `<svg>`. Each\n * `<prefix>.elements[localName]` becomes `<prefix>:<localName>...>`\n * children placed immediately before any geometry.\n */\n documentMeta?: NamespaceMeta;\n /** Pretty-print with newlines + indentation. Default `false`. */\n pretty?: boolean;\n}\n","/**\n * SVG transform attribute helpers. Parses the four primitive transform\n * functions weasel-svg supports (`matrix`, `translate`, `scale`, `rotate`)\n * into a single 2x3 affine matrix, and exposes the point/path mappers we\n * need to collapse `transform=` onto leaf geometry at parse time.\n */\n\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\n\n/** Multiply two 2x3 affine matrices (a then b applied to a column vector). */\nexport function multiply(a: Matrix, b: Matrix): Matrix {\n // [a0 a2 a4] [b0 b2 b4]\n // [a1 a3 a5] [b1 b3 b5]\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n a[0] * b[4] + a[2] * b[5] + a[4],\n a[1] * b[4] + a[3] * b[5] + a[5],\n ];\n}\n\n/** Apply a 2x3 affine to a 2D point. */\nexport function applyMatrix(m: Matrix, x: number, y: number): { x: number; y: number } {\n return { x: m[0] * x + m[2] * y + m[4], y: m[1] * x + m[3] * y + m[5] };\n}\n\n/** True if `m` is the identity within a small epsilon. */\nexport function isIdentity(m: Matrix, eps = 1e-9): boolean {\n return (\n Math.abs(m[0] - 1) < eps &&\n Math.abs(m[1]) < eps &&\n Math.abs(m[2]) < eps &&\n Math.abs(m[3] - 1) < eps &&\n Math.abs(m[4]) < eps &&\n Math.abs(m[5]) < eps\n );\n}\n\nconst NUM_RE = /[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g;\n\nfunction readNumbers(s: string): number[] {\n const out: number[] = [];\n const matches = s.match(NUM_RE);\n if (!matches) return out;\n for (const m of matches) {\n const n = Number(m);\n if (Number.isFinite(n)) out.push(n);\n }\n return out;\n}\n\n/**\n * Parse an SVG `transform=\"...\"` string into a single 2x3 matrix.\n * Functions compose right-to-left in SVG's coordinate model: in\n * `transform=\"A B\"`, the rightmost function is applied first to a point's\n * local coordinates. We accumulate accordingly: `result = result * fn`.\n *\n * Unrecognized functions emit a warning via the optional callback and are\n * skipped (the rest of the transform list still applies).\n */\nexport function parseTransform(\n attr: string | null | undefined,\n onWarn?: (message: string) => void,\n): Matrix {\n if (!attr) return IDENTITY_MATRIX;\n let result: Matrix = IDENTITY_MATRIX;\n // Split into \"name(args)\" chunks.\n const fnRe = /([A-Za-z]+)\\s*\\(([^)]*)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = fnRe.exec(attr)) !== null) {\n const name = match[1].toLowerCase();\n const nums = readNumbers(match[2]);\n let local: Matrix | null = null;\n if (name === 'matrix' && nums.length >= 6) {\n local = [nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]];\n } else if (name === 'translate') {\n const tx = nums[0] ?? 0;\n const ty = nums[1] ?? 0;\n local = [1, 0, 0, 1, tx, ty];\n } else if (name === 'scale') {\n const sx = nums[0] ?? 1;\n const sy = nums.length >= 2 ? nums[1] : sx;\n local = [sx, 0, 0, sy, 0, 0];\n } else if (name === 'rotate') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n const rot: Matrix = [c, s, -s, c, 0, 0];\n if (nums.length >= 3) {\n // rotate(angle, cx, cy) = translate(cx,cy) * rotate * translate(-cx,-cy)\n const cx = nums[1];\n const cy = nums[2];\n local = multiply(multiply([1, 0, 0, 1, cx, cy], rot), [1, 0, 0, 1, -cx, -cy]);\n } else {\n local = rot;\n }\n } else if (name === 'skewx' || name === 'skewy') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const t = Math.tan(ang);\n local = name === 'skewx' ? [1, 0, t, 1, 0, 0] : [1, t, 0, 1, 0, 0];\n } else {\n onWarn?.(`unsupported transform function: ${name}`);\n continue;\n }\n result = multiply(result, local);\n }\n return result;\n}\n\n/** Inverse of a 2x3 affine, or null when it is singular. */\nexport function invertMatrix(m: Matrix): Matrix | null {\n const det = m[0] * m[3] - m[1] * m[2];\n if (!Number.isFinite(det) || Math.abs(det) < 1e-12) return null;\n const a = m[3] / det, b = -m[1] / det, c = -m[2] / det, d = m[0] / det;\n return [a, b, c, d, -(a * m[4] + c * m[5]), -(b * m[4] + d * m[5])];\n}\n\n/**\n * Re-express an element's own `transform` in the frame its inherited `ctm`\n * maps into: `ctm * local * ctm⁻¹`.\n *\n * A leaf's geometry is baked through `ctm` at parse time, so its own\n * transform has to move with it. Decomposing the raw local matrix against\n * bounds that have already been through `ctm` compares two different\n * coordinate spaces, and a rotation inside a translated `<g>` fails to\n * decompose for no reason but the offset. A singular `ctm` has no inverse\n * and collapses the geometry anyway; the local matrix passes through.\n */\nexport function rebaseTransform(ctm: Matrix, local: Matrix): Matrix {\n const inv = invertMatrix(ctm);\n return inv ? multiply(multiply(ctm, local), inv) : local;\n}\n\n/** Try to factor `m` as \"rotation by theta about (cx, cy)\". Returns the\n * angle in radians when `m` is (within `eps`) a pure rotation about the\n * given pivot. Returns `null` otherwise.\n *\n * Pure rotation about (cx, cy) has the matrix form:\n * [ cos -sin cx - cx*cos + cy*sin ]\n * [ sin cos cy - cx*sin - cy*cos ]\n * i.e. m[0] = m[3] = cos, m[1] = -m[2] = sin, with a translation that\n * equals the pivot's \"rotate-then-translate-back\" residue. We reconstruct\n * theta from atan2(m[1], m[0]) and verify the rest.\n */\nexport function decomposeRotation(\n m: Matrix,\n cx: number,\n cy: number,\n eps = 1e-4,\n): number | null {\n const [a, b, c, d, e, f] = m;\n // Pure rotation requires a == d and b == -c.\n if (Math.abs(a - d) > eps) return null;\n if (Math.abs(b + c) > eps) return null;\n // Determinant must be 1 (no scale, no flip).\n const det = a * d - b * c;\n if (Math.abs(det - 1) > eps) return null;\n const theta = Math.atan2(b, a);\n // Verify translation = (cx - cx*cos + cy*sin, cy - cx*sin - cy*cos).\n const expectedE = cx - cx * a + cy * b;\n const expectedF = cy - cx * b - cy * a;\n if (Math.abs(e - expectedE) > eps) return null;\n if (Math.abs(f - expectedF) > eps) return null;\n return theta;\n}\n\n/** Best-effort rotational-component extraction for a general matrix (any\n * scale + rotation, ignoring translation). Used for parse-time warnings\n * on un-decomposable matrices: we can detect \"there is a rotation here\"\n * even if we won't preserve it as `node.rotation`. For a non-uniform\n * matrix the \"rotation\" is ambiguous; we report atan2(b, a) which\n * corresponds to where the +x basis vector points.\n */\nexport function rotationComponent(m: Matrix): number {\n return Math.atan2(m[1], m[0]);\n}\n\n/**\n * Format a matrix as an SVG `matrix(a b c d e f)` value. Returns `null`\n * when `m` is (effectively) the identity, so the caller can omit the\n * attribute entirely.\n */\nexport function formatMatrix(m: Matrix): string | null {\n if (isIdentity(m)) return null;\n return `matrix(${m.map((n) => trimNumber(n)).join(' ')})`;\n}\n\n/** Trim trailing zeros from a numeric value for compact SVG output. */\nexport function trimNumber(n: number): string {\n if (!Number.isFinite(n)) return '0';\n // Round to ~6 decimal places to avoid floating-point cruft.\n const r = Math.round(n * 1e6) / 1e6;\n if (Number.isInteger(r)) return String(r);\n return String(r);\n}\n","/**\n * Map between SVG `<pattern>` elements and weasel's `pattern` `FillStyle`.\n * The counterpart to `gradients.ts` for the other paint-server kind.\n *\n * The tile's shapes come from `tileGeometry` in core, so the vector form a\n * viewer sees is generated from the same description that rasterizes the GL\n * texture. Alongside them we write the spec itself onto a `data-weasel-tile`\n * attribute: any SVG consumer renders the shapes, and weasel reads the\n * attribute back to recover the exact spec rather than reverse-engineering\n * it from geometry.\n *\n * A pattern whose payload is a `TextureHandle` has no vector form — the\n * handle is a session-scoped registry key with no tile description behind\n * it — and exports as nothing, with a warning. Same treatment conic\n * gradients get.\n */\n\nimport { tileGeometry, type TileShape } from '@weasel-js/core/patterns-builtin';\nimport type { FillStyle, TilePatternSpec } from '@weasel-js/core';\nimport { collectElementsByTag } from './elements';\nimport { trimNumber } from './transform';\n\ntype PatternFill = Extract<FillStyle, { fill: 'pattern' }>;\n\n/** Collected pattern definitions, keyed by element id. */\nexport type PatternTable = Map<string, FillStyle>;\n\n/** Whether a pattern paint carries a serializable spec. */\nexport function patternSpecOf(paint: PatternFill): TilePatternSpec | null {\n return 'tile' in paint.pattern ? paint.pattern : null;\n}\n\nexport function patternXml(id: string, paint: PatternFill, onWarn?: (m: string) => void): string {\n const spec = patternSpecOf(paint);\n if (!spec) {\n onWarn?.('pattern fill carries a TextureHandle, which has no vector form — omitted from <defs>');\n return '';\n }\n const geometry = tileGeometry(spec);\n const body = geometry.shapes.map(shapeXml).join('');\n const origin = paint.origin ?? { x: 0, y: 0 };\n const attrs = [\n `id=\"${id}\"`,\n 'patternUnits=\"userSpaceOnUse\"',\n `width=\"${trimNumber(geometry.size)}\"`,\n `height=\"${trimNumber(geometry.size)}\"`,\n ];\n if (origin.x !== 0 || origin.y !== 0) {\n attrs.push(`x=\"${trimNumber(origin.x)}\"`, `y=\"${trimNumber(origin.y)}\"`);\n }\n attrs.push(`data-weasel-tile=\"${escapeAttr(JSON.stringify(spec))}\"`);\n return `<pattern ${attrs.join(' ')}>${body}</pattern>`;\n}\n\n/**\n * A single tile as a standalone `<svg>` document, sized to its own extent.\n * For UI that needs to show a tile outside a document — a picker swatch,\n * set as a repeating CSS `background-image` via a data URI. Shares the shape\n * mapper with `patternXml`, so a preview can't drift from what paints.\n */\nexport function tilePreviewSvg(spec: TilePatternSpec, background?: string): string {\n const geometry = tileGeometry(spec);\n const s = trimNumber(geometry.size);\n const bg = background\n ? `<rect width=\"${s}\" height=\"${s}\" fill=\"${background}\"/>`\n : '';\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${s}\" height=\"${s}\" `\n + `viewBox=\"0 0 ${s} ${s}\">${bg}${geometry.shapes.map(shapeXml).join('')}</svg>`;\n}\n\n/** `tilePreviewSvg` packed as a `url(...)` value for CSS `background-image`. */\nexport function tilePreviewCssUrl(spec: TilePatternSpec, background?: string): string {\n return `url(\"data:image/svg+xml,${encodeURIComponent(tilePreviewSvg(spec, background))}\")`;\n}\n\nfunction shapeXml(shape: TileShape): string {\n switch (shape.kind) {\n case 'line':\n return `<line x1=\"${trimNumber(shape.x1)}\" y1=\"${trimNumber(shape.y1)}\" `\n + `x2=\"${trimNumber(shape.x2)}\" y2=\"${trimNumber(shape.y2)}\" `\n + `stroke=\"${shape.color}\" stroke-width=\"${trimNumber(shape.width)}\"/>`;\n case 'circle':\n return `<circle cx=\"${trimNumber(shape.cx)}\" cy=\"${trimNumber(shape.cy)}\" `\n + `r=\"${trimNumber(shape.r)}\" fill=\"${shape.color}\"/>`;\n case 'ellipse': {\n const deg = (shape.rotation * 180) / Math.PI;\n const transform = deg === 0\n ? ''\n : ` transform=\"rotate(${trimNumber(deg)} ${trimNumber(shape.cx)} ${trimNumber(shape.cy)})\"`;\n return `<ellipse cx=\"${trimNumber(shape.cx)}\" cy=\"${trimNumber(shape.cy)}\" `\n + `rx=\"${trimNumber(shape.rx)}\" ry=\"${trimNumber(shape.ry)}\" `\n + `fill=\"${shape.color}\"${transform}/>`;\n }\n case 'rect':\n return `<rect x=\"${trimNumber(shape.x)}\" y=\"${trimNumber(shape.y)}\" `\n + `width=\"${trimNumber(shape.width)}\" height=\"${trimNumber(shape.height)}\" `\n + `fill=\"${shape.color}\"/>`;\n default:\n return '';\n }\n}\n\n/** Read every `<pattern>` in the document back into pattern paints. */\nexport function collectPatterns(svg: Element, onWarn?: (m: string) => void): PatternTable {\n const out: PatternTable = new Map();\n for (const [id, el] of collectElementsByTag(svg, PATTERN_TAGS)) {\n const paint = readPattern(el, onWarn);\n if (paint) out.set(id, paint);\n }\n return out;\n}\n\nconst PATTERN_TAGS = new Set(['pattern']);\n\nfunction readPattern(el: Element, onWarn?: (m: string) => void): FillStyle | null {\n const raw = el.getAttribute('data-weasel-tile');\n if (!raw) {\n // A hand-authored pattern (Illustrator, Inkscape) holds arbitrary\n // geometry no `TilePatternSpec` can express. Recognizing it would mean\n // reverse-engineering a tile from its children; dropping it with a\n // warning is honest, and the element survives in the source file.\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> has no data-weasel-tile — unsupported pattern, dropped`);\n return null;\n }\n let spec: TilePatternSpec;\n try {\n spec = JSON.parse(raw) as TilePatternSpec;\n } catch {\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> has malformed data-weasel-tile — dropped`);\n return null;\n }\n if (typeof spec?.tile !== 'string' || typeof spec?.color !== 'string') {\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> data-weasel-tile is not a tile spec — dropped`);\n return null;\n }\n const x = parseFloat(el.getAttribute('x') ?? '0');\n const y = parseFloat(el.getAttribute('y') ?? '0');\n const paint: PatternFill = { fill: 'pattern', pattern: spec };\n if (x !== 0 || y !== 0) paint.origin = { x, y };\n return paint;\n}\n\nfunction escapeAttr(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n","/**\n * Serialize a weasel `Path` to an SVG `d=` attribute string. `RectPath`\n * lowers to `M h v h Z`; `PolygonPath` walks the (commands, coords)\n * arrays, emitting one SVG command per kit command.\n *\n * Output uses absolute commands only and a small amount of whitespace\n * compression (no leading zeros stripped beyond what `Number.toString`\n * already does). Numbers are rounded to ~6 decimals via `trimNumber`.\n */\n\nimport {\n PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z,\n type Path,\n} from '@weasel-js/core';\nimport { trimNumber } from './transform';\n\n/** Serialize a weasel `Path` to an SVG `d=` attribute string. */\nexport function serializePathD(path: Path): string {\n if (path.kind === 'rect') {\n const { x, y, width, height } = path;\n return `M${trimNumber(x)} ${trimNumber(y)}h${trimNumber(width)}v${trimNumber(height)}h${trimNumber(-width)}Z`;\n }\n const cmds = path.commands;\n const xs = path.coords;\n const out: string[] = [];\n let ci = 0;\n for (let i = 0; i < cmds.length; i++) {\n const c = cmds[i];\n if (c === PATH_M) {\n out.push(`M${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])}`);\n ci += 2;\n } else if (c === PATH_L) {\n out.push(`L${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])}`);\n ci += 2;\n } else if (c === PATH_C) {\n out.push(\n `C${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])} ` +\n `${trimNumber(xs[ci + 2])} ${trimNumber(xs[ci + 3])} ` +\n `${trimNumber(xs[ci + 4])} ${trimNumber(xs[ci + 5])}`,\n );\n ci += 6;\n } else if (c === PATH_Q) {\n out.push(\n `Q${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])} ` +\n `${trimNumber(xs[ci + 2])} ${trimNumber(xs[ci + 3])}`,\n );\n ci += 4;\n } else if (c === PATH_Z) {\n out.push('Z');\n }\n }\n return out.join('');\n}\n","/**\n * Map between SVG `<linearGradient>` / `<radialGradient>` elements and\n * weasel's `FillStyle` gradient variants. Definitions are indexed by id\n * wherever in the document they appear, and looked up when a `fill` /\n * `stroke` attribute references one as `url(#id)`. On serialize, we\n * emit a fresh `<defs>` block with stable generated ids.\n */\n\nimport { getPaintKind, getMarker } from '@weasel-js/core';\nimport type { FillStyle, GradStop, GradientUnits, MarkerEntry } from '@weasel-js/core';\nimport { parsePaintAttr } from './color';\nimport { trimNumber } from './transform';\nimport { patternXml } from './patterns';\nimport { collectElementsByTag, type ElementTable } from './elements';\nimport { serializePathD } from './path-serializer';\n\n/** Collected gradient definitions, keyed by element id. */\nexport type GradientTable = Map<string, FillStyle>;\n\nconst GRADIENT_TAGS = new Set(['lineargradient', 'radialgradient']);\n\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\n/** Read every gradient definition in the document, keyed by element id. */\nexport function collectGradients(svg: Element, onWarn?: (m: string) => void): GradientTable {\n const out: GradientTable = new Map();\n const elements = collectElementsByTag(svg, GRADIENT_TAGS);\n for (const [id, el] of elements) {\n const paint = el.tagName.toLowerCase() === 'lineargradient'\n ? readLinearGradient(el, elements, onWarn)\n : readRadialGradient(el, elements, onWarn);\n if (paint) out.set(id, paint);\n }\n warnUnsupportedDefsChildren(svg, onWarn);\n return out;\n}\n\n/** Paint servers and `<marker>` aside, a `<defs>` child is something this\n * package does not model (`<clipPath>`, a `<use>` template). Say so once here. */\nfunction warnUnsupportedDefsChildren(svg: Element, onWarn?: (m: string) => void): void {\n if (!onWarn) return;\n const defs = svg.getElementsByTagName('defs');\n for (let d = 0; d < defs.length; d++) {\n const root = defs[d];\n for (let i = 0; i < root.children.length; i++) {\n const child = root.children[i];\n const tag = child.tagName.toLowerCase();\n if (GRADIENT_TAGS.has(tag) || tag === 'pattern' || tag === 'marker') continue;\n onWarn(`unsupported <defs> child: <${child.tagName}>`);\n }\n }\n}\n\n/**\n * The gradient a `href` / `xlink:href` attribute points at, or null. SVG lets\n * one gradient inherit another's stops and attributes this way, and authoring\n * tools lean on it heavily — a chain that isn't followed resolves to a\n * gradient with no stops, which paints nothing.\n */\nfunction hrefTarget(el: Element, elements: ElementTable): Element | null {\n const raw = el.getAttribute('href')\n ?? el.getAttributeNS(XLINK_NS, 'href')\n ?? el.getAttribute('xlink:href');\n if (!raw || !raw.startsWith('#')) return null;\n return elements.get(raw.slice(1)) ?? null;\n}\n\n/** An attribute's value on `el` or, when absent, on the gradient it inherits\n * from. `seen` breaks a reference cycle. */\nfunction inheritedAttr(\n el: Element, elements: ElementTable, name: string, seen: Set<Element> = new Set(),\n): string | null {\n if (el.hasAttribute(name)) return el.getAttribute(name);\n seen.add(el);\n const ref = hrefTarget(el, elements);\n if (!ref || seen.has(ref)) return null;\n return inheritedAttr(ref, elements, name, seen);\n}\n\n/** `el`'s own stops or, when it declares none, the stops it inherits. */\nfunction inheritedStops(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n seen: Set<Element> = new Set(),\n): GradStop[] {\n const own = readStops(el, onWarn);\n if (own.length > 0) return own;\n seen.add(el);\n const ref = hrefTarget(el, elements);\n if (!ref || seen.has(ref)) return own;\n return inheritedStops(ref, elements, onWarn, seen);\n}\n\n/** Parse a `stop-opacity` / offset value that may carry a `%` suffix. */\nfunction parseRatio(raw: string): number {\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return NaN;\n return raw.trimEnd().endsWith('%') ? n / 100 : n;\n}\n\nfunction readStops(el: Element, onWarn?: (m: string) => void): GradStop[] {\n const stops: GradStop[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (c.tagName.toLowerCase() !== 'stop') continue;\n const offsetRaw = parseRatio(c.getAttribute('offset') ?? '0');\n const offset = Number.isFinite(offsetRaw) ? offsetRaw : 0;\n const colorAttr = c.getAttribute('stop-color') ?? '#000000';\n const parsed = parsePaintAttr(colorAttr);\n if (parsed && parsed.kind === 'solid') {\n const opacityAttr = c.getAttribute('stop-opacity');\n const own = opacityAttr != null ? parseRatio(opacityAttr) : NaN;\n const alpha = Number.isFinite(own) ? own : parsed.alpha;\n stops.push({ offset, color: alpha < 1 ? applyAlpha(parsed.color, alpha) : parsed.color });\n } else {\n onWarn?.(`gradient stop has unrecognized stop-color: ${colorAttr}`);\n stops.push({ offset, color: '#000000' });\n }\n }\n return stops;\n}\n\nfunction applyAlpha(hex: string, alpha: number): string {\n // Pack alpha into an 8-digit hex so it round-trips through weasel's\n // string-color storage. This is non-standard CSS hex but parses cleanly\n // back via our color.ts parser.\n const a = Math.max(0, Math.min(255, Math.round(alpha * 255)));\n return `${hex}${a.toString(16).padStart(2, '0')}`;\n}\n\n/** SVG `gradientUnits` → the kit's `GradientUnits`. SVG's default is\n * `objectBoundingBox`, which is what the attribute defaults above assume\n * (`x2=\"1\"`, `r=\"0.5\"`), so the two have to be read together. */\nfunction readGradientUnits(el: Element, elements: ElementTable): 'bounds' | 'world' {\n return inheritedAttr(el, elements, 'gradientUnits') === 'userSpaceOnUse' ? 'world' : 'bounds';\n}\n\n/** `gradientTransform` has no slot in the kit's gradient model, so a gradient\n * carrying one paints in the wrong place rather than not at all. */\nfunction warnGradientTransform(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): void {\n const t = inheritedAttr(el, elements, 'gradientTransform');\n if (t != null && t.trim() !== '') {\n onWarn?.(`gradientTransform=\"${t}\" is not modeled; the gradient paints untransformed`);\n }\n}\n\nfunction num(raw: string | null, fallback: number): number {\n if (raw == null) return fallback;\n const n = parseRatio(raw);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction readLinearGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'linear-gradient',\n from: {\n x: num(inheritedAttr(el, elements, 'x1'), 0),\n y: num(inheritedAttr(el, elements, 'y1'), 0),\n },\n to: {\n x: num(inheritedAttr(el, elements, 'x2'), 1),\n y: num(inheritedAttr(el, elements, 'y2'), 0),\n },\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n };\n}\n\nfunction readRadialGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'radial-gradient',\n center: {\n x: num(inheritedAttr(el, elements, 'cx'), 0.5),\n y: num(inheritedAttr(el, elements, 'cy'), 0.5),\n },\n radius: num(inheritedAttr(el, elements, 'r'), 0.5),\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n };\n}\n\n/**\n * Pre-pass that assigns stable serialization ids to the paint servers —\n * gradients and patterns — used by any leaf in the tree. We key on object\n * identity so two leaves sharing the exact same `FillStyle` reference reuse\n * one `<defs>` entry; structurally equal but distinct objects get separate\n * ids.\n */\nexport class PaintServerRegistry {\n private byPaint = new Map<FillStyle, string>();\n private order: FillStyle[] = [];\n private counter = 0;\n\n // Marker keys referenced by any stroke, in first-use order. The `<defs>`\n // id is the marker key itself, not a minted counter id: `parseSvg` reads a\n // `marker-end=\"url(#id)\"` fragment back as the marker key directly (it\n // never inspects the `<marker>` element), so a synthetic id would come\n // back unresolvable and warn on round-trip.\n private markerKeys: string[] = [];\n private markerKeySet = new Set<string>();\n\n register(paint: FillStyle): string {\n const existing = this.byPaint.get(paint);\n if (existing) return existing;\n const id = paint.fill === 'pattern' ? `pat${this.counter++}` : `grad${this.counter++}`;\n this.byPaint.set(paint, id);\n this.order.push(paint);\n return id;\n }\n\n /** The `<defs>` id for a marker key — the key itself, minting nothing.\n * `undefined` when nothing is registered under `key`, so a caller emits no\n * attribute at all rather than a `url(#…)` pointing at a def that will\n * never be written. */\n markerId(key: string): string | undefined {\n if (getMarker(key) === undefined) return undefined;\n if (!this.markerKeySet.has(key)) {\n this.markerKeySet.add(key);\n this.markerKeys.push(key);\n }\n return key;\n }\n\n /** Emit `<defs>...</defs>` XML for every registered paint server and marker. */\n toDefsXml(onWarn?: (m: string) => void): string {\n if (this.order.length === 0 && this.markerKeys.length === 0) return '';\n const parts: string[] = ['<defs>'];\n for (const paint of this.order) {\n parts.push(paintServerXml(this.byPaint.get(paint)!, paint, onWarn));\n }\n for (const key of this.markerKeys) {\n const entry = getMarker(key);\n if (!entry) continue;\n parts.push(entry.toSvg ? entry.toSvg(key, entry) : defaultMarkerXml(key, entry));\n }\n parts.push('</defs>');\n return parts.join('');\n }\n}\n\n/** The `<marker>` def for an entry with no `toSvg` of its own. */\nfunction defaultMarkerXml(id: string, entry: MarkerEntry): string {\n const path = entry.path({ size: 1, stroke: { paint: { fill: 'solid', color: '#000' } } });\n const d = serializePathD(path);\n const fill = entry.fill === 'none' ? 'none' : 'context-stroke';\n const outline = entry.outline\n ? ` stroke=\"context-stroke\" stroke-width=\"${entry.outline.width}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"`\n : '';\n // `overflow=\"visible\"` overrides the UA default of `hidden`, which would\n // otherwise clip the arrowhead to the marker's viewport.\n return (\n `<marker id=\"${id}\" markerUnits=\"strokeWidth\" markerWidth=\"8\" markerHeight=\"8\"` +\n ` refX=\"0\" refY=\"0\" orient=\"auto\" overflow=\"visible\">` +\n `<path d=\"${d}\" fill=\"${fill}\"${outline}/></marker>`\n );\n}\n\n/** One paint server's `<defs>` entry: the built-in mapping, else the kind's\n * own `toSvg`, else nothing plus a warning. The referencing element already\n * carries `fill=\"url(#id)\"`, so a silent omission is a dangling reference and\n * the shape vanishes in a viewer. */\nfunction paintServerXml(id: string, paint: FillStyle, onWarn?: (m: string) => void): string {\n if (paint.fill === 'pattern') return patternXml(id, paint, onWarn);\n const builtin = gradientXml(id, paint);\n if (builtin) return builtin;\n const custom = getPaintKind(paint.fill)?.toSvg?.(id, paint);\n if (custom) return custom;\n onWarn?.(`${paint.fill} fill has no vector form — omitted from <defs>`);\n return '';\n}\n\n/** `GradientUnits` → SVG `gradientUnits`. `'screen'` (the kit's default, and\n * a viewport-fixed wash) has no SVG analog at all; it lowers to user space,\n * which at least puts the paint somewhere the geometry is. */\nfunction gradientUnitsAttr(units: GradientUnits | undefined): string {\n return units === 'bounds' ? 'objectBoundingBox' : 'userSpaceOnUse';\n}\n\nfunction gradientXml(id: string, paint: FillStyle): string {\n if (paint.fill === 'linear-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<linearGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `x1=\"${trimNumber(paint.from.x)}\" y1=\"${trimNumber(paint.from.y)}\" ` +\n `x2=\"${trimNumber(paint.to.x)}\" y2=\"${trimNumber(paint.to.y)}\">${stops}</linearGradient>`\n );\n }\n if (paint.fill === 'radial-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<radialGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `r=\"${trimNumber(paint.radius)}\">${stops}</radialGradient>`\n );\n }\n return '';\n}\n\nfunction stopXml(s: GradStop): string {\n // Detect packed-alpha hex (#rrggbbaa) and split out stop-opacity.\n const m = /^#([0-9a-f]{6})([0-9a-f]{2})$/i.exec(s.color);\n if (m) {\n const alpha = parseInt(m[2], 16) / 255;\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"#${m[1].toLowerCase()}\" stop-opacity=\"${trimNumber(alpha)}\"/>`;\n }\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"${s.color}\"/>`;\n}\n","/**\n * Serialize a `SvgNode[]` tree to an SVG document string. Every leaf is\n * emitted as a `<path>` (even shapes that started as `<rect>` etc.) —\n * lossless geometry round-trip beats round-tripping the element-kind\n * label. Gradient paints are gathered into a single `<defs>` block.\n */\n\nimport type { Path, Stroke } from '@weasel-js/core';\nimport { boundsOfPath, resolveStrokeWidth, SCRIPT_METRICS } from '@weasel-js/core';\nimport type {\n Matrix, NamespaceMeta, NamespacedElement, SerializeOptions, SvgGroupNode,\n SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode, SvgImageNode,\n} from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { serializePathD } from './path-serializer';\nimport { formatMatrix, multiply, trimNumber } from './transform';\nimport { PaintServerRegistry } from './gradients';\n\n/**\n * Walk the tree and produce an SVG document string. The root `<svg>`'s\n * `viewBox` is taken from `opts.viewBox` if supplied, otherwise computed\n * as a tight bounding box around every leaf.\n */\nexport function serializeSvg(nodes: SvgNode[], opts: SerializeOptions = {}): string {\n const registry = new PaintServerRegistry();\n registerPaintServers(nodes, registry);\n\n const bounds = opts.viewBox ?? computeBounds(nodes);\n const vb = `${trimNumber(bounds.x)} ${trimNumber(bounds.y)} ${trimNumber(bounds.width)} ${trimNumber(bounds.height)}`;\n const namespaces = opts.namespaces ?? {};\n\n const rootAttrs: string[] = [`xmlns=\"http://www.w3.org/2000/svg\"`];\n for (const [prefix, uri] of Object.entries(namespaces)) {\n rootAttrs.push(`xmlns:${prefix}=\"${escapeAttr(uri)}\"`);\n }\n rootAttrs.push(`viewBox=\"${vb}\"`);\n if (opts.width != null) rootAttrs.push(`width=\"${trimNumber(opts.width)}\"`);\n if (opts.height != null) rootAttrs.push(`height=\"${trimNumber(opts.height)}\"`);\n // documentMeta attrs onto the root, in declared-namespace order.\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n rootAttrs.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n }\n\n // documentMeta elements after <defs>, before geometry body.\n let docMetaXml = '';\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) docMetaXml += namespacedElementXml(prefix, localName, el);\n }\n }\n }\n\n const defsXml = registry.toDefsXml(opts.onWarn);\n const bodyXml = nodes.map((n) => nodeXml(n, registry, namespaces)).join('');\n\n // `<title>` goes immediately inside `<svg>` per SVG-spec convention; it's\n // an accessibility hook and (for our purposes) a stable place to round-trip\n // the user-visible document title.\n const titleXml = opts.title && opts.title.length > 0\n ? `<title>${escapeText(opts.title)}</title>`\n : '';\n\n return `<svg ${rootAttrs.join(' ')}>${titleXml}${defsXml}${docMetaXml}${bodyXml}</svg>`;\n}\n\nfunction namespacedElementXml(prefix: string, localName: string, el: NamespacedElement): string {\n const attrs: string[] = [];\n for (const [name, value] of Object.entries(el.attrs)) {\n attrs.push(`${name}=\"${escapeAttr(value)}\"`);\n }\n const head = attrs.length > 0 ? `<${prefix}:${localName} ${attrs.join(' ')}>` : `<${prefix}:${localName}>`;\n let body = '';\n if (el.children) {\n for (const [childName, list] of Object.entries(el.children)) {\n for (const child of list) body += namespacedElementXml(prefix, childName, child);\n }\n } else if (el.text != null) {\n body = escapeText(el.text);\n }\n return `${head}${body}</${prefix}:${localName}>`;\n}\n\nfunction metaAttrsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n const parts: string[] = [];\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n parts.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n return parts.length > 0 ? ` ${parts.join(' ')}` : '';\n}\n\nfunction metaElementsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n let out = '';\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) out += namespacedElementXml(prefix, localName, el);\n }\n }\n return out;\n}\n\nfunction registerPaintServers(nodes: SvgNode[], registry: PaintServerRegistry): void {\n for (const n of nodes) {\n if (n.kind === 'group') {\n registerPaintServers(n.children, registry);\n } else if (n.kind === 'path') {\n if (n.fill.kind === 'gradient') registry.register(n.fill.paint);\n if (n.stroke && n.stroke.paint.kind === 'gradient') registry.register(n.stroke.paint.paint);\n registerMarkers(n.stroke, registry);\n } else if (n.kind === 'text') {\n // Text paints flow through `style` / `runs` rather than a top-level\n // SvgPaint, so register direct FillStyle references when present. This\n // pre-pass is load-bearing: `<defs>` is emitted before the body, so a\n // paint first seen while writing an element would be referenced by an\n // id that no definition backs.\n registerTextPaint(n.fill, registry);\n registerTextPaint(n.stroke?.paint, registry);\n registerMarkers(n.stroke, registry);\n for (const run of n.runs ?? []) {\n registerTextPaint(run.fill, registry);\n registerTextPaint(run.stroke?.paint, registry);\n }\n }\n }\n}\n\n/** Register one text paint if it is a paint server rather than a colour. */\nfunction registerTextPaint(\n paint: import('@weasel-js/core').FillStyle | null | undefined,\n registry: PaintServerRegistry,\n): void {\n if (paint && !('color' in paint)) registry.register(paint);\n}\n\n/** A marker reference in either shape — `SvgStroke` stores a bare key, the kit\n * `Stroke` stores a `MarkerRef`. */\nfunction markerKeyOfRef(ref: unknown): string | undefined {\n if (typeof ref === 'string') return ref;\n if (ref && typeof ref === 'object' && 'key' in ref) return String((ref as { key: string }).key);\n return undefined;\n}\n\n/** Mint a `<defs>` id for every marker a stroke names, before the body is\n * written — same reason as the paint pre-pass above. */\nfunction registerMarkers(\n stroke: { markerStart?: unknown; markerMid?: unknown; markerEnd?: unknown } | undefined,\n registry: PaintServerRegistry,\n): void {\n if (!stroke) return;\n for (const ref of [stroke.markerStart, stroke.markerMid, stroke.markerEnd]) {\n const key = markerKeyOfRef(ref);\n if (key) registry.markerId(key);\n }\n}\n\nfunction nodeXml(node: SvgNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n if (node.kind === 'group') return groupXml(node, registry, namespaces);\n if (node.kind === 'text') return textXml(node, registry, namespaces);\n if (node.kind === 'image') return imageXml(node, namespaces);\n return pathXml(node, registry, namespaces);\n}\n\n/**\n * Emit an `<image>`. `preserveAspectRatio=\"none\"` is unconditional: the node\n * carries a literal box and nothing else, so letting a viewer letterbox it\n * would place the pixels somewhere the model never said.\n */\nfunction imageXml(node: SvgImageNode, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `href=\"${escapeAttr(node.href)}\"`,\n `x=\"${trimNumber(node.x)}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `width=\"${trimNumber(node.width)}\"`,\n `height=\"${trimNumber(node.height)}\"`,\n `preserveAspectRatio=\"none\"`,\n ];\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) return `<image ${attrs.join(' ')}${metaAttrs}>${metaEls}</image>`;\n return `<image ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction groupXml(node: SvgGroupNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [];\n if (node.transform) {\n const m = formatMatrix(node.transform);\n if (m) attrs.push(`transform=\"${m}\"`);\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n // `metaAttrs` already starts with a leading space (or is empty), so we\n // can splice it after the existing attr list without extra logic.\n const head = attrs.length > 0\n ? `<g ${attrs.join(' ')}${metaAttrs}>`\n : `<g${metaAttrs}>`;\n const body = node.children.map((c) => nodeXml(c, registry, namespaces)).join('');\n return `${head}${body}${metaElementsXml(node.meta, namespaces)}</g>`;\n}\n\nfunction pathXml(node: SvgPathNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [`d=\"${serializePathD(node.path)}\"`];\n const fillAttrs = paintAttrs(node.fill, 'fill', registry);\n for (const a of fillAttrs) attrs.push(a);\n // Emit fill-rule only when it diverges from SVG's default ('nonzero').\n // RectPath has no fillRule field — only PolygonPath carries one.\n if (node.path.kind === 'polygon' && node.path.fillRule === 'evenodd') {\n attrs.push(`fill-rule=\"evenodd\"`);\n }\n if (node.stroke) {\n const strokeAttrs = strokeAttrsFor(node.stroke, registry);\n for (const a of strokeAttrs) attrs.push(a);\n } else {\n attrs.push('stroke=\"none\"');\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const b = pathBounds(node.path);\n const cx = b.minX + (b.maxX - b.minX) / 2;\n const cy = b.minY + (b.maxY - b.minY) / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) {\n return `<path ${attrs.join(' ')}${metaAttrs}>${metaEls}</path>`;\n }\n return `<path ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction paintAttrs(\n paint: SvgPaint,\n name: 'fill' | 'stroke',\n registry: PaintServerRegistry,\n includeOpacity = true,\n): string[] {\n if (paint.kind === 'none') return [`${name}=\"none\"`];\n if (paint.kind === 'solid') {\n const out = [`${name}=\"${paint.color}\"`];\n if (includeOpacity && paint.opacity != null && paint.opacity !== 1) {\n out.push(`${name}-opacity=\"${trimNumber(paint.opacity)}\"`);\n }\n return out;\n }\n // gradient\n const id = registry.register(paint.paint);\n return [`${name}=\"url(#${id})\"`];\n}\n\n/**\n * Attributes for a kit `Stroke` — the shape text carries, whose `paint` is a\n * `FillStyle` rather than an `SvgPaint`. Text strokes ride inside\n * `TextStyle` / `StyledRun` rather than as a node-level `SvgStroke`, because\n * that is where the kit's text model puts them.\n *\n * Absent, unpainted, or zero-width emits nothing at all: unstroked text should\n * not carry a `stroke` attribute, and SVG's own default (`none`) already says\n * so.\n */\nfunction coreStrokeAttrs(stroke: Stroke | undefined, registry: PaintServerRegistry): string[] {\n const paint = stroke?.paint;\n if (!stroke || !paint) return [];\n // SVG has no accumulated-transform scale to resolve a `{ px }` width\n // against; its number is emitted as-is.\n const width = resolveStrokeWidth(stroke.width ?? 1, 1);\n if (!(width > 0)) return [];\n const attrs: string[] = [];\n if ('color' in paint) {\n attrs.push(`stroke=\"${paint.color}\"`);\n if (paint.opacity != null && paint.opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(paint.opacity)}\"`);\n }\n } else {\n attrs.push(`stroke=\"url(#${registry.register(paint)})\"`);\n }\n attrs.push(`stroke-width=\"${trimNumber(width)}\"`);\n if (stroke.cap) attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n if (stroke.join) attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const key = typeof ref === 'string' ? ref : ref.key;\n const id = registry.markerId(key);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\nfunction strokeAttrsFor(stroke: SvgStroke, registry: PaintServerRegistry): string[] {\n // `SvgStroke.opacity` and the paint's own `opacity` are two models of one\n // SVG attribute, and parse fills in both. Emitting each would write\n // `stroke-opacity` twice, which is not well-formed XML at all.\n const attrs = paintAttrs(stroke.paint, 'stroke', registry, false);\n attrs.push(`stroke-width=\"${trimNumber(stroke.width)}\"`);\n const opacity = stroke.opacity\n ?? (stroke.paint.kind === 'solid' ? stroke.paint.opacity : undefined);\n if (opacity != null && opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(opacity)}\"`);\n }\n if (stroke.cap) {\n attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n }\n if (stroke.join) {\n attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n }\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) {\n attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n }\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const id = registry.markerId(ref);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\n/**\n * Tight bounding box around everything the tree draws, in the root's\n * coordinates — the fallback `viewBox` when the caller supplies none. A\n * node's `rotation` and a group's `transform` both move ink, so both are\n * applied here; a box taken from unrotated geometry crops the document.\n */\nfunction computeBounds(nodes: SvgNode[]): { x: number; y: number; width: number; height: number } {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n const visit = (n: SvgNode, ctm: Matrix): void => {\n if (n.kind === 'group') {\n const childCtm = n.transform ? multiply(ctm, n.transform) : ctm;\n n.children.forEach((c) => visit(c, childCtm));\n return;\n }\n const b = n.kind === 'text' || n.kind === 'image'\n ? { minX: n.x, minY: n.y, maxX: n.x + n.width, maxY: n.y + n.height }\n : pathBounds(n.path);\n const local = n.rotation ? rotateAboutCenter(ctm, b, n.rotation) : ctm;\n for (const [x, y] of corners(b)) {\n const px = local[0] * x + local[2] * y + local[4];\n const py = local[1] * x + local[3] * y + local[5];\n if (px < minX) minX = px;\n if (py < minY) minY = py;\n if (px > maxX) maxX = px;\n if (py > maxY) maxY = py;\n }\n };\n nodes.forEach((n) => visit(n, IDENTITY_MATRIX));\n if (!Number.isFinite(minX)) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction corners(b: { minX: number; minY: number; maxX: number; maxY: number }): [number, number][] {\n return [[b.minX, b.minY], [b.maxX, b.minY], [b.maxX, b.maxY], [b.minX, b.maxY]];\n}\n\n/** `ctm` composed with the same `rotate(angle cx cy)` the element emits. */\nfunction rotateAboutCenter(\n ctm: Matrix,\n b: { minX: number; minY: number; maxX: number; maxY: number },\n angle: number,\n): Matrix {\n const cx = (b.minX + b.maxX) / 2;\n const cy = (b.minY + b.maxY) / 2;\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return multiply(ctm, [c, s, -s, c, cx - cx * c + cy * s, cy - cx * s - cy * c]);\n}\n\n/**\n * Emit a `<text>` element. Uses `dominant-baseline=\"text-before-edge\"` so\n * the `y` attribute matches weasel's top-of-box pose; stashes the explicit\n * width/height (which native SVG text doesn't model) in `data-weasel-*`\n * attributes so they round-trip through the parser losslessly.\n */\nfunction textXml(node: SvgTextNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `x=\"${trimNumber(node.x)}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `dominant-baseline=\"text-before-edge\"`,\n // The runs model stores real line breaks; SVG's default whitespace\n // handling would collapse them (and any indentation) away on re-import.\n `xml:space=\"preserve\"`,\n `data-weasel-width=\"${trimNumber(node.width)}\"`,\n `data-weasel-height=\"${trimNumber(node.height)}\"`,\n ];\n\n const style = node.style;\n if (style?.fontSize != null) attrs.push(`font-size=\"${trimNumber(style.fontSize)}\"`);\n if (style?.fontFamily) attrs.push(`font-family=\"${escapeAttr(style.fontFamily)}\"`);\n if (style?.fontWeight != null) attrs.push(`font-weight=\"${String(style.fontWeight)}\"`);\n if (style?.fontStyle && style.fontStyle !== 'normal') attrs.push(`font-style=\"${style.fontStyle}\"`);\n const direction = style?.direction ?? 'ltr';\n if (direction === 'rtl') attrs.push('direction=\"rtl\"');\n if (style?.align != null || direction === 'rtl') {\n // `text-anchor` is reading-order relative in SVG exactly as `start` / `end`\n // are here, so the two relative values pass straight through and only the\n // absolute pair has to be turned into an edge the reader resolves the same\n // way. Under `ltr` this collapses to what it always wrote.\n const align = style?.align ?? 'left';\n const anchor = align === 'center' ? 'middle'\n : align === 'start' ? 'start'\n : align === 'end' ? 'end'\n : (align === 'left') === (direction === 'ltr') ? 'start' : 'end';\n if (anchor !== 'start') attrs.push(`text-anchor=\"${anchor}\"`);\n }\n if (style?.letterSpacing != null && style.letterSpacing !== 0) {\n attrs.push(`letter-spacing=\"${trimNumber(style.letterSpacing)}\"`);\n }\n const decoration = textDecorationValue(style?.underline, style?.strikethrough, style?.overline);\n if (decoration) attrs.push(`text-decoration=\"${decoration}\"`);\n // Note: `lineHeight` is NOT emitted here. The bridge layer (svgInterop)\n // lifts it into `meta.wd.attrs['line-height']`, which `metaAttrsXml`\n // below emits as `wd:line-height=\"...\"`. There is no compat write of\n // `data-weasel-line-height` — per the SVG-native plan's Migration section,\n // no installed base exists to compat against.\n if (node.fill === null) {\n attrs.push('fill=\"none\"');\n } else if (node.fill) {\n if ('color' in node.fill) {\n attrs.push(`fill=\"${node.fill.color}\"`);\n if (node.fill.opacity != null && node.fill.opacity !== 1) {\n attrs.push(`fill-opacity=\"${trimNumber(node.fill.opacity)}\"`);\n }\n } else {\n const id = registry.register(node.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(node.stroke, registry)) attrs.push(a);\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n\n const body = node.runs && node.runs.length > 0\n ? node.runs.map((r) => runXml(r, registry)).join('')\n : escapeText(node.text);\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n return `<text ${attrs.join(' ')}${metaAttrs}>${body}${metaEls}</text>`;\n}\n\nfunction runXml(run: import('@weasel-js/core').StyledRun, registry: PaintServerRegistry): string {\n const attrs: string[] = [];\n if (run.bold) attrs.push(`font-weight=\"700\"`);\n if (run.italic) attrs.push(`font-style=\"italic\"`);\n if (run.fontFamily) attrs.push(`font-family=\"${escapeAttr(run.fontFamily)}\"`);\n // A percentage `font-size` is relative to the parent's, which is what\n // `fontScale` means; an absolute `fontSize` wins over it here as it does in\n // the runs model.\n //\n // `baseline-shift=\"super\"` carries the preset's *size* as well as its rise,\n // so a run that overrode only the rise has no keyword left to say the size\n // with and must spell it out — without this the superscript comes back\n // full-size at a raised baseline.\n const presetScale = run.script != null && run.baselineShift != null\n ? SCRIPT_METRICS[run.script].size\n : undefined;\n const scale = run.fontScale ?? presetScale;\n if (run.fontSize != null) attrs.push(`font-size=\"${trimNumber(run.fontSize)}\"`);\n else if (scale != null) attrs.push(`font-size=\"${trimNumber(scale * 100)}%\"`);\n // Same story for `baseline-shift`: an SVG percentage resolves against the\n // parent's font size, which is the unit `baselineShift` is already in.\n if (run.baselineShift != null) {\n attrs.push(`baseline-shift=\"${trimNumber(run.baselineShift * 100)}%\"`);\n } else if (run.script) {\n attrs.push(`baseline-shift=\"${run.script}\"`);\n }\n // Unlike the node-level style guard above, a run-level `0` is a meaningful\n // *override* (distinct from \"inherit the node's letterSpacing\") per the\n // runs model's additive-flags contract — emit it whenever it's set.\n if (run.letterSpacing != null) {\n attrs.push(`letter-spacing=\"${trimNumber(run.letterSpacing)}\"`);\n }\n const runDecoration = textDecorationValue(run.underline, run.strikethrough, run.overline);\n if (runDecoration) attrs.push(`text-decoration=\"${runDecoration}\"`);\n if (run.fill) {\n if ('color' in run.fill) {\n attrs.push(`fill=\"${run.fill.color}\"`);\n } else {\n const id = registry.register(run.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(run.stroke, registry)) attrs.push(a);\n const head = attrs.length > 0 ? `<tspan ${attrs.join(' ')}>` : '<tspan>';\n return `${head}${escapeText(run.text)}</tspan>`;\n}\n\n/**\n * Combine the decoration flags into an SVG `text-decoration` value —\n * `\"underline line-through\"` when both are set, a single token when only\n * one is, or `null` (omit the attribute) when none is set.\n */\nfunction textDecorationValue(\n underline: boolean | undefined,\n strikethrough: boolean | undefined,\n overline: boolean | undefined,\n): string | null {\n const tokens: string[] = [];\n if (underline) tokens.push('underline');\n if (strikethrough) tokens.push('line-through');\n if (overline) tokens.push('overline');\n return tokens.length > 0 ? tokens.join(' ') : null;\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<');\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nfunction pathBounds(path: Path): { minX: number; minY: number; maxX: number; maxY: number } {\n if (path.kind === 'rect') {\n return {\n minX: path.x, minY: path.y,\n maxX: path.x + path.width, maxY: path.y + path.height,\n };\n }\n const b = boundsOfPath(path);\n return { minX: b.x, minY: b.y, maxX: b.x + b.width, maxY: b.y + b.height };\n}\n\n","import type { DrawCommand, Path, Stroke } from '@weasel-js/core';\nimport {\n ellipsePath,\n linePath,\n markerDrawCommands,\n PathBuilder,\n rectPath,\n textCommand,\n} from '@weasel-js/core';\nimport type { WorldRect } from './frac';\nimport type { AnnotationData, FracPoint } from './types';\n\n/** One loud color, not a themed one: a mark sits over the instrument's own\n * picture and has to be legible against whatever that picture is. */\nconst MARK_COLOR = '#e5484d';\n/** World units, so a mark thickens with the picture it annotates — and so the\n * marker geometry can be resolved here, which needs a resolved width. */\nconst MARK_WIDTH = 2;\nconst TEXT_SIZE = 14;\n\n/** The subset of a mark's scene node this needs: where it is, and what it is. */\nexport interface PaintableMark {\n pose: WorldRect;\n data: AnnotationData;\n}\n\n/** How a mark is drawn, as opposed to where. Resolved by the overlay from the\n * instrument's vocabulary and the mark's own staleness. */\nexport interface MarkStyle {\n /** The status's colour, or the default. */\n color?: string;\n /** A mark whose stored position no longer describes the picture. Drawn\n * dashed rather than hidden: it still describes *something*, and dropping\n * it would lose it. */\n stale?: boolean;\n}\n\nconst toWorld = (p: FracPoint, content: { w: number; h: number }) => ({\n x: p.x * content.w,\n y: p.y * content.h,\n});\n\n/** A mark's stored vertices in world units, or the pose's diagonal — a stored\n * mark whose `points` did not survive still has to draw somewhere. */\nfunction vertices(m: PaintableMark, content: { w: number; h: number }): { x: number; y: number }[] {\n const stored = m.data.points;\n if (stored && stored.length >= 2) return stored.map((p) => toWorld(p, content));\n const { x, y, width, height } = m.pose;\n return [\n { x, y },\n { x: x + width, y: y + height },\n ];\n}\n\nfunction polyline(points: { x: number; y: number }[]): Path {\n const b = new PathBuilder();\n const first = points[0];\n if (!first) return rectPath(0, 0, 0, 0);\n b.moveTo(first.x, first.y);\n for (const p of points.slice(1)) b.lineTo(p.x, p.y);\n return b.build();\n}\n\n/**\n * What one mark draws, in its target's world.\n *\n * Pure: a node and the target's content box in, draw commands out. Geometry\n * that a bounding box cannot describe — a line's ends, a stroke's path — comes\n * from `data.points`, which is in fractions like the bounds.\n */\nexport function markCommands(\n m: PaintableMark,\n content: { w: number; h: number },\n style: MarkStyle = {},\n): DrawCommand[] {\n const color = style.color ?? MARK_COLOR;\n const stroke: Stroke = {\n paint: { color },\n width: MARK_WIDTH,\n cap: 'round',\n join: 'round',\n ...(style.stale ? { dash: [6, 4] } : {}),\n };\n\n switch (m.data.kind) {\n case 'rect':\n return [\n { kind: 'path', path: rectPath(m.pose.x, m.pose.y, m.pose.width, m.pose.height), stroke },\n ];\n case 'ellipse':\n return [{ kind: 'path', path: ellipsePath(m.pose), stroke }];\n case 'line': {\n const [a, b] = vertices(m, content);\n return [{ kind: 'path', path: linePath(a, b), stroke }];\n }\n case 'arrow': {\n const [a, b] = vertices(m, content);\n // The spec's arrow: a line carrying an end marker, not its own geometry.\n // Markers are separate commands — a stroke's `markerEnd` is inert unless\n // something turns it into geometry, and only the kit's own node painter\n // does that, for the nodes it owns.\n const marked: Stroke = { ...stroke, markerEnd: 'arrow' };\n const path = linePath(a, b);\n return [\n { kind: 'path', path, stroke: marked },\n ...markerDrawCommands(path, marked, MARK_WIDTH, undefined),\n ];\n }\n case 'stroke':\n return [{ kind: 'path', path: polyline(vertices(m, content)), stroke }];\n case 'text': {\n const text = m.data.title;\n if (!text) return [];\n return [\n textCommand(\n m.pose.x,\n m.pose.y,\n text,\n { fontSize: TEXT_SIZE },\n undefined,\n undefined,\n undefined,\n {\n fill: { color },\n },\n ),\n ];\n }\n }\n}\n","/**\n * Whether a stored mark still describes the picture the current config\n * produces. A target names the config keys its positions depend on; labkit\n * snapshots and compares them without knowing what any of them mean.\n */\n\n/** The values of `keys` in `config`, for storing beside a new mark. Keys the\n * config does not carry are omitted rather than stored as undefined, so the\n * snapshot says what was known rather than what was asked. */\nexport function seenFrom(config: unknown, keys: readonly string[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (config === null || typeof config !== 'object') return out;\n const src = config as Record<string, unknown>;\n for (const k of keys) {\n if (k in src) out[k] = src[k];\n }\n return out;\n}\n\n/**\n * Whether the picture moved under the mark.\n *\n * Only keys present in `seen` are compared. A mark filed before its target\n * declared a new dependency must not go stale retroactively: nothing can know\n * what that key was at the time, and guessing would grey out every old mark\n * the first time a target grows a key.\n */\nexport function isStale(\n seen: Readonly<Record<string, unknown>> | undefined,\n config: unknown,\n keys: readonly string[],\n): boolean {\n if (!seen || keys.length === 0) return false;\n if (config === null || typeof config !== 'object') return false;\n const src = config as Record<string, unknown>;\n for (const k of keys) {\n if (!(k in seen)) continue;\n if (!Object.is(seen[k], src[k])) return true;\n }\n return false;\n}\n","import type { DrawCommand, SceneNode, View } from '@weasel-js/core';\nimport type { WorldRect } from './frac';\nimport { type MarkStyle, markCommands } from './paint';\nimport { isStale } from './staleness';\nimport type { AnnotationData, AnnotationMeaning } from './types';\n\n/** What resolving a mark's appearance needs beyond the mark itself. */\nexport interface MarkDrawOptions {\n /** The target's content box — the world a mark's geometry is in. */\n content: { w: number; h: number };\n /** The target's `positionDependsOn`, for staleness. */\n positionDependsOn?: readonly string[];\n /** The trial's config at the time of the draw. */\n config: unknown;\n /** The instrument's vocabulary, for a status's colour. */\n meaning?: AnnotationMeaning;\n}\n\n/**\n * How one mark is drawn — shared by the pane on screen and by an export.\n *\n * One function rather than two call sites building their own, because an\n * export that resolves a status colour or a stale dash differently from the\n * screen produces a picture nobody was looking at.\n */\nexport function createMarkDrawOne(\n opts: MarkDrawOptions,\n): (\n node: SceneNode<AnnotationData, 'marks', WorldRect>,\n pose: WorldRect,\n view: View,\n) => DrawCommand[] {\n return (node, pose) =>\n markCommands({ pose, data: node.data }, opts.content, resolveMarkStyle(node.data, opts));\n}\n\n/** How a mark looks, as opposed to where it is. Separate from the callback\n * above because an SVG export resolves the same appearance without ever\n * building a draw command. */\nexport function resolveMarkStyle(data: AnnotationData, opts: MarkDrawOptions): MarkStyle {\n return {\n color: opts.meaning?.statuses?.find((s) => s.id === data.status)?.color,\n // Read off the node rather than through the store's `isStale`, which\n // wants a projected Annotation this path does not have.\n stale: isStale(data.seen, opts.config, opts.positionDependsOn ?? []),\n };\n}\n","import type { DrawCommand, FillStyle, Stroke } from '@weasel-js/core';\nimport { resolveStrokeWidth } from '@weasel-js/core';\nimport type { SvgNode, SvgPaint, SvgStroke } from '@weasel-js/svg';\nimport { type MarkStyle, markCommands, type PaintableMark } from './paint';\n\nconst NO_PAINT: SvgPaint = { kind: 'none' };\n\nfunction toSvgPaint(paint: FillStyle | undefined): SvgPaint {\n if (!paint) return NO_PAINT;\n if ('color' in paint && typeof paint.color === 'string') {\n return {\n kind: 'solid',\n color: paint.color,\n ...(paint.opacity != null ? { opacity: paint.opacity } : {}),\n };\n }\n return { kind: 'gradient', paint };\n}\n\n/** Marker references are deliberately dropped: `markCommands` already resolves\n * a marker into its own path command, and keeping the reference would make\n * the serializer emit a `<marker>` def that draws the head a second time. */\nfunction toSvgStroke(stroke: Stroke): SvgStroke {\n return {\n paint: toSvgPaint(stroke.paint),\n width: resolveStrokeWidth(stroke.width ?? 1, 1),\n ...(stroke.cap ? { cap: stroke.cap } : {}),\n ...(stroke.join ? { join: stroke.join } : {}),\n ...(stroke.dash ? { dash: [...stroke.dash] } : {}),\n ...(stroke.miterLimit != null ? { miterLimit: stroke.miterLimit } : {}),\n };\n}\n\nfunction toSvgNode(cmd: DrawCommand, m: PaintableMark): SvgNode {\n if (cmd.kind === 'path') {\n return {\n kind: 'path',\n path: cmd.path,\n fill: toSvgPaint(cmd.fill),\n ...(cmd.stroke ? { stroke: toSvgStroke(cmd.stroke) } : {}),\n };\n }\n if (cmd.kind === 'text') {\n return {\n kind: 'text',\n x: cmd.x,\n y: cmd.y,\n width: m.pose.width,\n height: m.pose.height,\n text: cmd.runs.map((run) => run.text).join(''),\n style: cmd.style,\n ...(cmd.runs[0]?.fill ? { fill: cmd.runs[0].fill } : {}),\n };\n }\n // Unreachable while `markCommands` emits only paths and text. A throw rather\n // than a skip: a new mark kind silently vanishing from every export is a\n // worse afternoon than a loud one.\n throw new Error(`[labkit] a mark drew a '${cmd.kind}' command, which has no vector form`);\n}\n\n/**\n * One mark as SVG nodes, converted from the very commands the pane paints.\n *\n * Deliberately not a second switch over `data.kind`: geometry has one source,\n * and this is a translation of it. `serializeSvg` turns the result into a\n * document.\n */\nexport function markSvgNodes(\n m: PaintableMark,\n content: { w: number; h: number },\n style: MarkStyle = {},\n): SvgNode[] {\n return markCommands(m, content, style).map((cmd) => toSvgNode(cmd, m));\n}\n","import { asNodeId, renderSceneToPixels } from '@weasel-js/core';\nimport { serializeSvg } from '@weasel-js/svg';\nimport { createMarkDrawOne, type MarkDrawOptions, resolveMarkStyle } from './drawOne';\nimport type { MarkScene } from './store';\nimport { markSvgNodes } from './svgNodes';\nimport type { AnnotationData, CaptureOptions, CaptureResult, CaptureSource } from './types';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/** Which of the two composition routes an export takes. */\nexport type CapturePlan = 'svg-document' | 'raster-stack';\n\n/**\n * Vector all the way through, or both sides rasterized and stacked.\n *\n * An SVG base is the only one that nests: the marks serialize beside the\n * artifact's own markup and the whole document rasterizes once at the end. A\n * raster base, or none at all, takes the renderer's own path instead — which\n * is also what draws marks onto transparency for a target that declares no\n * base.\n */\nexport function capturePlan(base: CaptureSource | undefined, format: 'png' | 'svg'): CapturePlan {\n if (format === 'svg') return 'svg-document';\n return base?.kind === 'svg' ? 'svg-document' : 'raster-stack';\n}\n\n/** Re-frame a base's own `<svg>` onto the content box, keeping its `viewBox`.\n * Parsed rather than string-spliced: a base whose declared width disagrees\n * with its viewBox would otherwise land at the wrong scale. */\nfunction nestBaseSvg(markup: string, w: number, h: number): string {\n const doc = new DOMParser().parseFromString(markup, 'image/svg+xml');\n const root = doc.documentElement;\n if (doc.getElementsByTagName('parsererror').length > 0 || root.localName !== 'svg') {\n throw new Error(\"[labkit] a target's `base()` returned markup that is not an <svg> document\");\n }\n root.setAttribute('x', '0');\n root.setAttribute('y', '0');\n root.setAttribute('width', String(w));\n root.setAttribute('height', String(h));\n return new XMLSerializer().serializeToString(root);\n}\n\n/** A raster base as an `<image>` filling the content box. An external `src`\n * round-trips as a reference, so the export is only self-contained when it\n * is already a `data:` URI. */\nfunction embedRasterBase(\n base: CaptureSource,\n w: number,\n h: number,\n onWarn?: (m: string) => void,\n): string {\n const href =\n base.kind === 'canvas' ? base.canvas.toDataURL() : base.kind === 'image' ? base.src : '';\n if (base.kind === 'image' && !href.startsWith('data:')) {\n onWarn?.(`base image '${href}' is a reference, so this SVG is not self-contained`);\n }\n return serializeSvg([{ kind: 'image', href, x: 0, y: 0, width: w, height: h }], {\n viewBox: { x: 0, y: 0, width: w, height: h },\n });\n}\n\n/** Every mark on a scene, as SVG nodes, styled the way the pane styles them. */\nfunction markNodesOf(scene: MarkScene, draw: MarkDrawOptions) {\n return [...scene.renderOrder()].flatMap((id) => {\n const node = scene.get(asNodeId(String(id)));\n if (!node) return [];\n return markSvgNodes(\n { pose: node.pose, data: node.data as AnnotationData },\n draw.content,\n resolveMarkStyle(node.data as AnnotationData, draw),\n );\n });\n}\n\nexport interface ComposeSvgArgs {\n base?: CaptureSource;\n scene: MarkScene;\n draw: MarkDrawOptions;\n scale: number;\n onWarn?: (message: string) => void;\n}\n\n/**\n * The base and the marks in one SVG document.\n *\n * The outer `viewBox` is the content box, so marks — which are already in it —\n * need no transform, and `width`/`height` carry the export scale. Both halves\n * nest as child `<svg>` elements, which each establish their own viewport and\n * so keep their own `viewBox` maths out of this function.\n */\nexport function composeCaptureSvg(args: ComposeSvgArgs): string {\n const { base, scene, draw, scale, onWarn } = args;\n const { w, h } = draw.content;\n const baseXml =\n base === undefined\n ? ''\n : base.kind === 'svg'\n ? nestBaseSvg(base.markup, w, h)\n : embedRasterBase(base, w, h, onWarn);\n // No width/height on the marks document: a nested <svg> without them fills\n // the outer viewport exactly, which is the alignment this relies on.\n const marksXml = serializeSvg(markNodesOf(scene, draw), {\n viewBox: { x: 0, y: 0, width: w, height: h },\n onWarn,\n });\n const outW = Math.max(1, Math.round(w * scale));\n const outH = Math.max(1, Math.round(h * scale));\n return `<svg xmlns=\"${SVG_NS}\" width=\"${outW}\" height=\"${outH}\" viewBox=\"0 0 ${w} ${h}\">${baseXml}${marksXml}</svg>`;\n}\n\nfunction context2d(width: number, height: number): CanvasRenderingContext2D {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('[labkit] capture needs a 2D canvas context, and this one has none');\n return ctx;\n}\n\nfunction toPngBlob(canvas: HTMLCanvasElement): Promise<Blob> {\n return new Promise((resolve, reject) => {\n let done: (b: Blob | null) => void;\n try {\n done = (blob) =>\n blob ? resolve(blob) : reject(new Error('[labkit] the browser produced no PNG'));\n canvas.toBlob(done, 'image/png');\n } catch (err) {\n // A base referencing an image from another origin taints the canvas and\n // `toBlob` throws SecurityError. Name the cause: the DOM exception on\n // its own sends people looking at labkit.\n reject(\n new Error(\n '[labkit] the capture canvas is tainted, so it cannot be read back — a base referencing a cross-origin image does this. Embed it as a data: URI.',\n { cause: err },\n ),\n );\n }\n });\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(`[labkit] a capture base failed to load: ${src}`));\n img.src = src;\n });\n}\n\n/** Rasterize a composed document by handing it to the browser's own SVG\n * renderer — one pass over base and marks together. */\nasync function rasterizeSvg(svg: string, width: number, height: number): Promise<Blob> {\n const url = URL.createObjectURL(new Blob([svg], { type: 'image/svg+xml;charset=utf-8' }));\n try {\n const img = await loadImage(url);\n const ctx = context2d(width, height);\n ctx.drawImage(img, 0, 0, width, height);\n return await toPngBlob(ctx.canvas);\n } finally {\n URL.revokeObjectURL(url);\n }\n}\n\n/** Base pixels, then mark pixels over them. The marks come from\n * `renderSceneToPixels` rather than a readback of the live surface, so a\n * capture neither depends on nor disturbs what is on screen. */\nasync function stackRaster(\n args: ComposeSvgArgs & { width: number; height: number },\n): Promise<Blob> {\n const { base, scene, draw, scale, width, height } = args;\n const ctx = context2d(width, height);\n if (base?.kind === 'image') ctx.drawImage(await loadImage(base.src), 0, 0, width, height);\n else if (base?.kind === 'canvas') ctx.drawImage(base.canvas, 0, 0, width, height);\n\n const raster = renderSceneToPixels({\n scene,\n sourceRect: { x: 0, y: 0, width: draw.content.w, height: draw.content.h },\n scale: { x: scale, y: scale },\n drawOne: createMarkDrawOne(draw),\n });\n // Through a second canvas rather than `putImageData` on this one, which\n // replaces pixels instead of compositing and would erase the base.\n const marks = context2d(raster.width, raster.height);\n marks.putImageData(\n new ImageData(Uint8ClampedArray.from(raster.data), raster.width, raster.height),\n 0,\n 0,\n );\n ctx.drawImage(marks.canvas, 0, 0, width, height);\n return toPngBlob(ctx.canvas);\n}\n\n/** What a capture needs about the target it is exporting. */\nexport interface CaptureArgs {\n target: string;\n scene: MarkScene;\n draw: MarkDrawOptions;\n base?: () => CaptureSource | Promise<CaptureSource>;\n onWarn?: (message: string) => void;\n}\n\n/** Export one target's picture with its marks on it. */\nexport async function captureTarget(\n args: CaptureArgs,\n opts: CaptureOptions = {},\n): Promise<CaptureResult> {\n const format = opts.format ?? 'png';\n const scale = opts.scale ?? 2;\n const { content } = args.draw;\n const width = Math.max(1, Math.round(content.w * scale));\n const height = Math.max(1, Math.round(content.h * scale));\n const base = await args.base?.();\n const compose: ComposeSvgArgs = {\n base,\n scene: args.scene,\n draw: args.draw,\n scale,\n onWarn: args.onWarn,\n };\n\n if (capturePlan(base, format) === 'raster-stack') {\n return {\n target: args.target,\n blob: await stackRaster({ ...compose, width, height }),\n format,\n width,\n height,\n };\n }\n\n const svg = composeCaptureSvg(compose);\n const blob =\n format === 'svg'\n ? new Blob([svg], { type: 'image/svg+xml;charset=utf-8' })\n : await rasterizeSvg(svg, width, height);\n return { target: args.target, blob, format, width, height };\n}\n","import type { FracPoint, FracRect } from './types';\n\n/** A mark's box in its target's world: CSS pixels at zoom 1. Matches weasel's\n * default `RectPose`, which is what the scene stores. */\nexport interface WorldRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** Where a fraction lands on a content box of this size. */\nexport function fracToWorld(f: FracRect, content: { w: number; h: number }): WorldRect {\n return {\n x: f.x * content.w,\n y: f.y * content.h,\n width: f.w * content.w,\n height: f.h * content.h,\n };\n}\n\n/** What fraction of the content box a world rect covers.\n *\n * A pane measured before layout is 0×0, and dividing by that would seed every\n * stored position with `NaN` — which compares false against everything and so\n * fails silently rather than loudly. Zero sides give zeros. */\nexport function worldToFrac(r: WorldRect, content: { w: number; h: number }): FracRect {\n const sx = content.w === 0 ? 0 : 1 / content.w;\n const sy = content.h === 0 ? 0 : 1 / content.h;\n return { x: r.x * sx, y: r.y * sy, w: r.width * sx, h: r.height * sy };\n}\n\nconst DP = 10_000;\n\n/** Snap to 4dp. Positions are diffed by humans in stored documents, so the\n * last digits of a float are noise that hides the change that matters. */\nexport function roundFrac(f: FracRect): FracRect {\n return {\n x: Math.round(f.x * DP) / DP,\n y: Math.round(f.y * DP) / DP,\n w: Math.round(f.w * DP) / DP,\n h: Math.round(f.h * DP) / DP,\n };\n}\n\n/** Whether `pt` falls in `box`, widened by `tol` on every side so a hairline\n * mark stays reachable. */\nexport function fracContains(box: FracRect, pt: FracPoint, tol = 0): boolean {\n return (\n pt.x >= box.x - tol &&\n pt.x <= box.x + box.w + tol &&\n pt.y >= box.y - tol &&\n pt.y <= box.y + box.h + tol\n );\n}\n\n/** Whether `outer` wholly encloses `inner`. A marquee takes what it encloses,\n * not what it grazes — brushing selection is a different gesture. */\nexport function fracIntersects(outer: FracRect, inner: FracRect): boolean {\n return (\n inner.x >= outer.x &&\n inner.y >= outer.y &&\n inner.x + inner.w <= outer.x + outer.w &&\n inner.y + inner.h <= outer.y + outer.h\n );\n}\n","import type { Scene } from '@weasel-js/core';\n\n/** What the ordering needs of a scene: its history depth, and the two moves. */\nexport interface HistoryScene {\n historyIndex(): number;\n undo(): boolean;\n redo(): boolean;\n canUndo(): boolean;\n canRedo(): boolean;\n}\n\n/**\n * One undo ordering over several scenes.\n *\n * Each target's marks live in their own scene and each scene owns its own undo\n * stack, so \"take back the last thing I did\" is a question no single scene can\n * answer. This keeps the order changes arrived in.\n *\n * The order is maintained from each scene's `historyIndex()`, not from its\n * subscribe callback: a scene notifies on ephemeral changes that are not\n * history at all, and an undo driven from inside a pane's own keymap has to\n * *move* this ordering rather than append to it.\n */\nexport class MarkHistory {\n private readonly depth = new Map<string, number>();\n private undoable: string[] = [];\n private redoable: string[] = [];\n /** Set while this class is driving, so a redo is not read as a new change. */\n private replaying: 'undo' | 'redo' | null = null;\n\n /** Start following `scene` under `target`. Idempotent per target. */\n track(target: string, scene: HistoryScene): void {\n if (this.depth.has(target)) return;\n this.depth.set(target, scene.historyIndex());\n }\n\n /** Call on every notification from `target`'s scene. */\n observe(target: string, scene: HistoryScene): void {\n const now = scene.historyIndex();\n const before = this.depth.get(target) ?? 0;\n this.depth.set(target, now);\n if (now > before) {\n if (this.replaying === 'redo') {\n drop(this.redoable, target);\n } else {\n // A change dropped whatever was redoable — weasel's own scene did the\n // same to its stack.\n this.redoable = [];\n }\n this.undoable.push(target);\n } else if (now < before) {\n drop(this.undoable, target);\n this.redoable.push(target);\n }\n }\n\n /** The target `undo` would act on, skipping any whose scene has nothing\n * left — a scene can drop entries this ordering still lists. */\n private next(\n stack: string[],\n can: (s: HistoryScene) => boolean,\n at: (t: string) => HistoryScene | undefined,\n ): string | null {\n for (let i = stack.length - 1; i >= 0; i--) {\n const target = stack[i];\n if (target === undefined) continue;\n const scene = at(target);\n if (scene && can(scene)) return target;\n }\n return null;\n }\n\n canUndo(at: (t: string) => HistoryScene | undefined): boolean {\n return this.next(this.undoable, (s) => s.canUndo(), at) !== null;\n }\n\n canRedo(at: (t: string) => HistoryScene | undefined): boolean {\n return this.next(this.redoable, (s) => s.canRedo(), at) !== null;\n }\n\n undo(at: (t: string) => HistoryScene | undefined): boolean {\n const target = this.next(this.undoable, (s) => s.canUndo(), at);\n const scene = target === null ? undefined : at(target);\n if (!scene) return false;\n this.replaying = 'undo';\n try {\n return scene.undo();\n } finally {\n this.replaying = null;\n }\n }\n\n redo(at: (t: string) => HistoryScene | undefined): boolean {\n const target = this.next(this.redoable, (s) => s.canRedo(), at);\n const scene = target === null ? undefined : at(target);\n if (!scene) return false;\n this.replaying = 'redo';\n try {\n return scene.redo();\n } finally {\n this.replaying = null;\n }\n }\n}\n\n/** Remove the last occurrence of `value`, in place. */\nfunction drop(stack: string[], value: string): void {\n for (let i = stack.length - 1; i >= 0; i--) {\n if (stack[i] === value) {\n stack.splice(i, 1);\n return;\n }\n }\n}\n\n/** A `Scene` satisfies `HistoryScene`; this names the narrowing once. */\nexport const asHistoryScene = (scene: Scene<never, never, never> | HistoryScene): HistoryScene =>\n scene as HistoryScene;\n","import {\n asNodeId,\n createScene,\n type Scene,\n type SerializedScene,\n sceneFromJSON,\n} from '@weasel-js/core';\nimport { captureTarget } from './capture';\nimport type { WorldRect } from './frac';\nimport { fracContains, fracIntersects, fracToWorld, roundFrac, worldToFrac } from './frac';\nimport { MarkHistory } from './history';\nimport { isStale as isStaleAgainst, seenFrom } from './staleness';\nimport type {\n Annotation,\n AnnotationData,\n AnnotationInit,\n AnnotationMeaning,\n AnnotationPatch,\n AnnotationQuery,\n AnnotationsApi,\n AnnotationTargetInfo,\n CaptureOptions,\n CaptureResult,\n FracPoint,\n FracRect,\n SerializedAnnotations,\n} from './types';\n\n/** A mark's box in its target's world. Matches weasel's default `RectPose`. */\ntype MarkPose = WorldRect;\n\n/** The scene one target's marks live in. */\nexport type MarkScene = Scene<AnnotationData, 'marks', MarkPose>;\n\n/** A mark scene: one layer, because marks do not stack in tiers. */\nexport function createAnnotationScene(): MarkScene {\n return createScene<AnnotationData, 'marks', MarkPose>({ systemLayers: [{ id: 'marks' }] });\n}\n\nexport interface AnnotationStoreOptions {\n /** Re-read on every call, so a target resizing or gaining a dependency takes\n * effect without rebuilding the store. */\n targets: () => readonly AnnotationTargetInfo[];\n /** Serialized scenes from a previous `toJSON`, keyed by target. */\n restore?: Readonly<Record<string, unknown>>;\n /** The instrument's vocabulary, so an export draws a mark in the colour its\n * status gives it. */\n meaning?: AnnotationMeaning;\n /** The trial's live config. A getter for the same reason `targets` is: the\n * store is built once and the config changes under it. */\n config?: () => unknown;\n /** Notified after every finished export. */\n onCapture?: (result: CaptureResult) => void;\n}\n\n/** Everything a capture needs that is not the store's own state. Split out so\n * `capture.ts` takes data rather than reaching back into the store. */\nexport interface CaptureDeps {\n scene: MarkScene;\n target: AnnotationTargetInfo;\n meaning?: AnnotationMeaning;\n config: unknown;\n}\n\nconst NO_CONTENT = { w: 0, h: 0 };\n\n/** A mark's id is its target and its node. One scene per target, so a node id\n * is only unique within one — and an annotation is addressed by both. */\nfunction splitId(id: string): { target: string; node: string } | undefined {\n const at = id.lastIndexOf('/');\n return at <= 0 ? undefined : { target: id.slice(0, at), node: id.slice(at + 1) };\n}\n\n/**\n * A facade over one weasel scene per target: the scenes are the truth, this\n * answers questions about them. Everything crossing this boundary is in\n * fractions of a target's content box; the scenes hold world units.\n *\n * A scene per target rather than one scene with a `target` field, because a\n * pane's hit-test, marquee and paint all walk the whole scene it is given and\n * take no filter — one shared scene puts every other pane's marks under the\n * pointer.\n */\nexport function createAnnotationStore(opts: AnnotationStoreOptions): AnnotationsApi {\n const { targets, restore } = opts;\n const scenes = new Map<string, MarkScene>();\n const subs = new Set<() => void>();\n const history = new MarkHistory();\n const notify = (): void => {\n for (const fn of subs) fn();\n };\n\n const sceneFor = (target: string): MarkScene => {\n const known = scenes.get(target);\n if (known) return known;\n const raw = restore?.[target];\n const scene = raw\n ? sceneFromJSON<AnnotationData, 'marks', MarkPose>(\n raw as SerializedScene<AnnotationData, 'marks', MarkPose>,\n {},\n )\n : createAnnotationScene();\n scenes.set(target, scene);\n history.track(target, scene);\n scene.subscribe(() => {\n history.observe(target, scene);\n notify();\n });\n return scene;\n };\n\n /** Only for scenes that exist: asking for one would create it, and the\n * ordering never names a target it has not seen. */\n const historySceneAt = (target: string) => scenes.get(target);\n\n // Restored scenes are materialized up front: everything below reads\n // `scenes`, and a mark that only appears once its pane asks for its scene is\n // a mark a sidebar cannot list.\n for (const target of Object.keys(restore ?? {})) sceneFor(target);\n\n const targetOf = (id: string): AnnotationTargetInfo | undefined =>\n targets().find((t) => t.id === id);\n\n const contentOf = (id: string) => targetOf(id)?.content ?? NO_CONTENT;\n\n const project = (target: string, node: string): Annotation | undefined => {\n const found = scenes.get(target)?.get(asNodeId(node));\n if (!found) return undefined;\n return {\n ...found.data,\n target,\n id: `${target}/${node}`,\n frac: roundFrac(worldToFrac(found.pose as MarkPose, contentOf(target))),\n };\n };\n\n /** Every target with a scene, in declaration order — then any whose target\n * the instrument has since stopped declaring, so its marks are not lost. */\n const liveTargets = (): string[] => {\n const declared = targets().map((t) => t.id);\n const rest = [...scenes.keys()].filter((id) => !declared.includes(id));\n return [...declared, ...rest];\n };\n\n const marksOn = (target: string): Annotation[] => {\n const scene = scenes.get(target);\n if (!scene) return [];\n const out: Annotation[] = [];\n for (const id of scene.renderOrder()) {\n const a = project(target, String(id));\n if (a) out.push(a);\n }\n return out;\n };\n\n const all = (): Annotation[] => liveTargets().flatMap(marksOn);\n\n const matches = (a: Annotation, q: AnnotationQuery): boolean => {\n if (q.target !== undefined && a.target !== q.target) return false;\n if (q.kind !== undefined && a.kind !== q.kind) return false;\n if (q.status !== undefined && a.status !== q.status) return false;\n if (q.tags !== undefined) {\n const have = a.tags ?? [];\n for (const t of q.tags) if (!have.includes(t)) return false;\n }\n if (q.where && !q.where(a)) return false;\n return true;\n };\n\n /** The node behind a public id, or undefined. */\n const nodeOf = (id: string) => {\n const parts = splitId(id);\n if (!parts) return undefined;\n const scene = scenes.get(parts.target);\n const node = scene?.get(asNodeId(parts.node));\n return node && scene ? { ...parts, scene, node } : undefined;\n };\n\n return {\n sceneFor,\n\n targets,\n\n get(id) {\n const parts = splitId(id);\n return parts ? project(parts.target, parts.node) : undefined;\n },\n\n query(q) {\n return q ? all().filter((a) => matches(a, q)) : all();\n },\n\n hitTest(target, pt: FracPoint, tol = 0) {\n return marksOn(target)\n .filter((a) => fracContains(a.frac, pt, tol))\n .reverse();\n },\n\n within(target, box: FracRect) {\n return marksOn(target).filter((a) => fracIntersects(box, a.frac));\n },\n\n isStale(a, config) {\n const keys = targetOf(a.target)?.positionDependsOn ?? [];\n return isStaleAgainst(a.seen, config, keys);\n },\n\n canUndo() {\n return history.canUndo(historySceneAt);\n },\n\n canRedo() {\n return history.canRedo(historySceneAt);\n },\n\n undo() {\n return history.undo(historySceneAt);\n },\n\n redo() {\n return history.redo(historySceneAt);\n },\n\n selection() {\n const out: string[] = [];\n for (const target of liveTargets()) {\n const scene = scenes.get(target);\n if (!scene) continue;\n for (const node of scene.getSelection()) {\n if (scene.get(node)) out.push(`${target}/${String(node)}`);\n }\n }\n return out;\n },\n\n setSelection(ids) {\n const wanted = new Map<string, string[]>();\n for (const id of ids) {\n const found = nodeOf(id);\n if (!found) continue;\n const node = String(found.node.id);\n const on = wanted.get(found.target);\n if (!on) wanted.set(found.target, [node]);\n else if (!on.includes(node)) on.push(node);\n }\n for (const [target, scene] of scenes) {\n const next = wanted.get(target) ?? [];\n const now = scene.getSelection();\n if (now.length === next.length && next.every((n, i) => String(now[i]) === n)) continue;\n scene.setSelection(next.map(asNodeId));\n }\n },\n\n subscribe(fn) {\n subs.add(fn);\n return () => {\n subs.delete(fn);\n };\n },\n\n add(init: AnnotationInit, config?: unknown) {\n const target = targetOf(init.target);\n const data: AnnotationData = {\n target: init.target,\n kind: init.kind,\n ...(init.points ? { points: init.points } : {}),\n ...(init.title !== undefined ? { title: init.title } : {}),\n ...(init.status !== undefined ? { status: init.status } : {}),\n ...(init.tags !== undefined ? { tags: init.tags } : {}),\n ...(init.meta !== undefined ? { meta: init.meta } : {}),\n seen: seenFrom(config, target?.positionDependsOn ?? []),\n };\n const node = sceneFor(init.target).add({\n kind: 'leaf',\n layer: 'marks',\n pose: fracToWorld(roundFrac(init.frac), target?.content ?? NO_CONTENT),\n data,\n });\n return `${init.target}/${String(node)}`;\n },\n\n update(id, patch: AnnotationPatch) {\n const found = nodeOf(id);\n if (!found) return;\n const { frac, ...meaning } = patch;\n const nid = asNodeId(found.node.id);\n if (Object.keys(meaning).length > 0) {\n found.scene.update(nid, { data: { ...found.node.data, ...meaning } });\n }\n if (frac) {\n found.scene.setPose(nid, fracToWorld(roundFrac(frac), contentOf(found.target)));\n }\n },\n\n setMeta(id, meta) {\n const found = nodeOf(id);\n if (!found) return;\n found.scene.update(asNodeId(found.node.id), { data: { ...found.node.data, meta } });\n },\n\n remove(id) {\n const found = nodeOf(id);\n if (found) found.scene.remove(asNodeId(found.node.id));\n },\n\n async capture(target: string, captureOpts?: CaptureOptions) {\n const info = targetOf(target);\n if (!info) throw new Error(`[labkit] no annotation target called '${target}'`);\n const result = await captureTarget(\n {\n target,\n scene: sceneFor(target),\n draw: {\n content: info.content,\n positionDependsOn: info.positionDependsOn,\n config: opts.config?.(),\n meaning: opts.meaning,\n },\n base: info.base,\n onWarn: (message) => console.warn(`[labkit] capture: ${message}`),\n },\n captureOpts,\n );\n opts.onCapture?.(result);\n return result;\n },\n\n toJSON(): SerializedAnnotations {\n const out: Record<string, unknown> = {};\n for (const [target, scene] of scenes) out[target] = scene.toJSON();\n return { version: 1, scenes: out };\n },\n };\n}\n\n/** Rebuild a store from what `toJSON` wrote. Unknown or future versions give\n * an empty store rather than throwing: a lab that cannot read its marks\n * should still open. */\nexport function annotationsFromJSON(\n raw: unknown,\n targets: () => readonly AnnotationTargetInfo[],\n rest: Omit<AnnotationStoreOptions, 'targets' | 'restore'> = {},\n): AnnotationsApi {\n const doc = raw as Partial<SerializedAnnotations> | null;\n if (doc?.version !== 1 || !doc.scenes) return createAnnotationStore({ targets, ...rest });\n return createAnnotationStore({ targets, restore: doc.scenes, ...rest });\n}\n","import type { View } from '@weasel-js/core';\nimport type { ViewTransform } from '../instrument/types';\n\n/** A target's world in CSS pixels: the box its fractions are fractions of. */\nexport interface ContentSize {\n w: number;\n h: number;\n}\n\n/** A target's drawn box on the surface, in CSS pixels. */\nexport interface PaneSize {\n w: number;\n h: number;\n}\n\n/** labkit's camera in weasel's shape. Zoom is uniform, so it lands on both\n * scale axes; pan is weasel's translation unchanged. */\nexport function toWeaselView(v: ViewTransform): View {\n return { x: v.pan.x, y: v.pan.y, scale: { x: v.zoom, y: v.zoom } };\n}\n\n/** The inverse. A weasel view with unequal axis scales collapses to its x —\n * labkit's camera has one zoom and cannot hold the other. */\nexport function fromWeaselView(v: View): ViewTransform {\n return { zoom: v.scale.x, pan: { x: v.x, y: v.y } };\n}\n\n/**\n * The camera a target with none of its own draws through: its content box\n * scaled to fit the box it is drawn in, anchored at the origin.\n *\n * The spec calls the camera \"a plain scale\" at zoom 1; zoom 1 is only right\n * when the pane happens to be the content's size, and a mark drawn on a\n * scaled-down pane otherwise lands outside it.\n */\nexport function fitView(content: ContentSize, pane: PaneSize): ViewTransform {\n const zoom =\n content.w > 0 && content.h > 0 ? Math.min(pane.w / content.w, pane.h / content.h) : 1;\n return { zoom: Number.isFinite(zoom) && zoom > 0 ? zoom : 1, pan: { x: 0, y: 0 } };\n}\n","import {\n type InsertNodeFactory,\n SceneCanvas,\n type SceneCanvasApi,\n useActiveToolContext,\n type View,\n WeaselProvider,\n} from '@weasel-js/core';\nimport { type CSSProperties, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { Rect } from '../surface/rect';\nimport { useSurfaceCanvas, useSurfaceOptional, useTileId } from '../surface/useSurfaceTile';\nimport { createMarkDrawOne } from './drawOne';\nimport type { WorldRect } from './frac';\nimport { seenFrom } from './staleness';\nimport type { MarkScene } from './store';\nimport { ANNOTATION_WEASEL_TOOLS, annotationToolInfo } from './toolMap';\nimport type {\n AnnotationData,\n AnnotationKind,\n AnnotationMeaning,\n AnnotationTarget,\n FracPoint,\n} from './types';\nimport { fitView, toWeaselView } from './view';\n\n/** Props for `<AnnotationOverlay>`. */\nexport interface AnnotationOverlayProps {\n target: AnnotationTarget;\n /** The trial's mark scene — shared by every target; a mark's own `target`\n * field is what separates them. */\n scene: MarkScene;\n /** Snapshotted onto each new mark, so staleness can be answered later. */\n config: unknown;\n /** The trial's resolved tool slot. */\n activeToolId: string | null;\n /** The instrument's vocabulary, for a status's colour. */\n meaning?: AnnotationMeaning;\n}\n\nconst sameRect = (a: Rect | null, b: Rect): boolean =>\n a !== null && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;\n\n/** Pushes the trial's tool into the weasel scope this pane owns. Its own\n * component because the context only exists below `<WeaselProvider>`. */\nfunction ToolBridge({ toolId }: { toolId: string }) {\n const tools = useActiveToolContext();\n const setActive = tools.setActive;\n useEffect(() => {\n setActive(toolId);\n }, [toolId, setActive]);\n return null;\n}\n\n/** Every vertex the insert carried, in fractions of the content box. */\nfunction pointsOf(\n extras: Record<string, unknown>,\n content: { w: number; h: number },\n): readonly FracPoint[] | undefined {\n const toFrac = (p: { x: number; y: number }): FracPoint => ({\n x: content.w === 0 ? 0 : p.x / content.w,\n y: content.h === 0 ? 0 : p.y / content.h,\n });\n if (extras.kind === 'line') {\n return [toFrac(extras.a as FracPoint), toFrac(extras.b as FracPoint)];\n }\n if (extras.kind === 'pencil') {\n return (extras.samples as { x: number; y: number }[]).map(toFrac);\n }\n return undefined;\n}\n\n/**\n * One target's drawing surface: a transparent box over the target's element\n * taking the input, and a `<SceneCanvas>` painting into the lab's shared\n * buffer at that box's rect.\n *\n * The box is portalled into the surface container because that is what tile\n * rects are measured against; positioning it among the instrument's own DOM\n * would put it in whatever positioning context happened to be there.\n */\nexport function AnnotationOverlay({\n target,\n scene,\n config,\n activeToolId,\n meaning,\n}: AnnotationOverlayProps) {\n const surface = useSurfaceOptional();\n const canvas = useSurfaceCanvas();\n const [rect, setRect] = useState<Rect | null>(null);\n const [input, setInput] = useState<HTMLDivElement | null>(null);\n const sceneCanvas = useRef<SceneCanvasApi | null>(null);\n\n // Read in the insert factory, which is built once and must see the tool the\n // pane is holding now — `arrow` and `stroke` are indistinguishable from\n // `line` and `pencil` at the weasel end.\n const toolRef = useRef(activeToolId);\n toolRef.current = activeToolId;\n const configRef = useRef(config);\n configRef.current = config;\n\n const id = target.id;\n // The surface's tile namespace is the whole lab's, and every trial of an\n // instrument declares the same target ids — so the tile is registered under\n // the trial-scoped key, not under `id`.\n const tileId = useTileId(id);\n const lastTile = useRef<HTMLElement | null>(null);\n useEffect(() => {\n const el = target.ref.current ?? null;\n if (el === lastTile.current) return;\n lastTile.current = el;\n surface?.registerTile(tileId, el);\n });\n useEffect(\n () => () => {\n // Clearing this is what lets the effect above re-register on the next\n // commit. StrictMode's mount / unmount / mount would otherwise take the\n // tile out and never put it back, and the surface would measure nothing.\n lastTile.current = null;\n surface?.registerTile(tileId, null);\n },\n [surface, tileId],\n );\n\n useEffect(\n () =>\n surface?.registerPainter(tileId, (next) => {\n setRect((prev) => (sameRect(prev, next) ? prev : next));\n // The shared buffer was cleared if it resized this frame; this pane's\n // own loop has no way to know that.\n sceneCanvas.current?.requestRedraw();\n }),\n [surface, tileId],\n );\n\n const container = surface?.getContainer() ?? null;\n if (!container || !rect) return null;\n\n const view: View = toWeaselView(target.view ?? fitView(target.content, { w: rect.w, h: rect.h }));\n\n const drawOne = createMarkDrawOne({\n content: target.content,\n positionDependsOn: target.positionDependsOn,\n config,\n meaning,\n });\n\n const factories: Record<string, InsertNodeFactory> = {};\n for (const weaselTool of ANNOTATION_WEASEL_TOOLS) {\n factories[weaselTool] = (_bounds, extras) => {\n const info = annotationToolInfo(toolRef.current);\n const kind: AnnotationKind | undefined = info?.kind;\n if (!kind) return null;\n const points = pointsOf(extras as unknown as Record<string, unknown>, target.content);\n const data: AnnotationData = {\n target: id,\n kind,\n ...(points ? { points } : {}),\n seen: seenFrom(configRef.current, target.positionDependsOn ?? []),\n };\n return { data };\n };\n }\n\n // A measured rect has nowhere to live but the element's own style. Set as\n // custom properties, which the stylesheet reads — the sanctioned use.\n const box = {\n ['--lk-anno-x' as string]: `${rect.x}px`,\n ['--lk-anno-y' as string]: `${rect.y}px`,\n ['--lk-anno-w' as string]: `${rect.w}px`,\n ['--lk-anno-h' as string]: `${rect.h}px`,\n } as CSSProperties;\n\n return createPortal(\n <>\n <div\n ref={setInput}\n className=\"lk-annotate__input\"\n data-annotation-target={id}\n role=\"application\"\n aria-label={`Annotations on ${id}`}\n // biome-ignore lint/a11y/noNoninteractiveTabindex: role=\"application\" IS the interactive case — a region with its own keymap. The rule's allowed-role list stops at the native widget roles and does not include it, and the gesture dispatcher listens on this element, so without focus no tool's keyboard binding ever fires.\n tabIndex={0}\n style={box}\n />\n {canvas && input ? (\n // One scope per pane: a shared <ActionsProvider> lets only the newest\n // canvas under it respond to input, and the rest go silently dead.\n <WeaselProvider isolate>\n <ToolBridge toolId={annotationToolInfo(activeToolId)?.weaselTool ?? 'select'} />\n <SceneCanvas<AnnotationData, 'marks', WorldRect>\n ref={sceneCanvas}\n scene={scene}\n width={rect.w}\n height={rect.h}\n view={view}\n paintInto={{ canvas, x: rect.x, y: rect.y }}\n inputElement={input}\n defaultTools={ANNOTATION_WEASEL_TOOLS}\n insertNodeFactories={factories}\n layers={{ scene: { drawOne } }}\n />\n </WeaselProvider>\n ) : null}\n </>,\n container,\n );\n}\n","import type { TrialInfo } from '../state/types';\nimport { AnnotationOverlay } from './AnnotationOverlay';\nimport type { AnnotationsApi, AnnotationsCapability } from './types';\n\n/** Props for `<AnnotationTargets>`. */\nexport interface AnnotationTargetsProps {\n capability: AnnotationsCapability;\n state: unknown;\n config: unknown;\n /** The trial these targets belong to. `capability.targets` is told it, so a\n * consumer holding per-trial refs can hand back this trial's. */\n trial: TrialInfo;\n annotations: AnnotationsApi;\n activeToolId: string | null;\n}\n\n/** One overlay per region the instrument said accepts marks. */\nexport function AnnotationTargets({\n capability,\n state,\n config,\n trial,\n annotations,\n activeToolId,\n}: AnnotationTargetsProps) {\n const targets = capability.targets(state, config, trial);\n\n return (\n <>\n {targets.map((t) => (\n <AnnotationOverlay\n key={t.id}\n target={t}\n scene={annotations.sceneFor(t.id)}\n meaning={capability.meaning}\n config={config}\n activeToolId={activeToolId}\n />\n ))}\n </>\n );\n}\n","import type { PrefLeaf } from '@weasel-js/ui';\nimport type {\n Annotations,\n BranchAnnotations,\n BranchOptions,\n ConfigBranch,\n ConfigEntry,\n ConfigNode,\n ConfigOption,\n ConfigSchema,\n ConfigShape,\n ControlRenderer,\n InferConfig,\n NodeOptions,\n} from './types';\n\n/** Whether a schema entry is a branch rather than a leaf. */\nexport function isConfigBranch(entry: ConfigEntry): entry is ConfigBranch {\n return 'children' in entry;\n}\n\n/** Shared chaining surface. Every method clones, so a node can be reused as a\n * base for several leaves without one bleeding into the next. */\nabstract class BaseNode<T> implements ConfigNode<T> {\n abstract readonly kind: string | null;\n\n // `default` is a reserved word in a parameter position, so the field is\n // declared rather than taken as a parameter property.\n readonly default: T;\n\n constructor(\n defaultValue: T,\n readonly annotations: Readonly<Annotations> = {},\n readonly options: Readonly<NodeOptions> = {},\n ) {\n this.default = defaultValue;\n }\n\n /** Clone into the same subclass. Subclasses with extra constructor\n * arguments override this. */\n protected with(annotations: Annotations, options: NodeOptions): this {\n const Ctor = this.constructor as new (d: T, a: Annotations, o: NodeOptions) => this;\n return new Ctor(this.default, annotations, options);\n }\n\n protected ann(patch: Annotations): this {\n return this.with({ ...this.annotations, ...patch }, this.options);\n }\n\n protected opt(patch: NodeOptions): this {\n return this.with(this.annotations, { ...this.options, ...patch });\n }\n\n /** Human-readable label. Defaults to the key, title-cased. */\n label(name: string): this {\n return this.ann({ name });\n }\n\n /** Longer help text, surfaced as a tooltip on the row label. */\n describe(description: string): this {\n return this.ann({ description });\n }\n\n /** Omit from the panel unless it is asked to show hidden leaves. */\n hidden(): this {\n return this.ann({ hidden: true });\n }\n\n /** Pair with a sibling sharing this id, side-by-side on one row. */\n pair(pair: string): this {\n return this.ann({ pair });\n }\n\n /** Render under a named section heading. `collapsed` opens the section\n * folded — say it on any one of the section's leaves. */\n section(label: string, opts: { collapsed?: boolean } = {}): this {\n return this.opt({ section: { label, ...opts } });\n }\n\n /** Show this row only while the predicate holds. Presentational — the value\n * stays in config and the instrument still reads it. */\n showIf(predicate: (config: Record<string, unknown>) => boolean): this {\n return this.opt({ showIf: predicate });\n }\n\n /** Draw this one row yourself, keeping the kind, default and validation. */\n render(renderer: ControlRenderer): this {\n return this.opt({ render: renderer });\n }\n}\n\nclass NumberNode extends BaseNode<number> {\n readonly kind = 'number';\n\n /** Bound the value. A number with both bounds renders as a slider. */\n range(min: number, max: number): this {\n return this.ann({ min, max });\n }\n\n step(step: number): this {\n return this.ann({ step });\n }\n\n /** A display suffix for the value — `'px'`, `'ms'`, `'°'`. Presentation only:\n * it is never parsed, and the stored value stays a plain number. */\n suffix(suffix: string): this {\n return this.ann({ suffix });\n }\n\n /** Force a slider even without both bounds. */\n slider(): this {\n return this.ann({ control: 'slider' });\n }\n\n /** Force a typed input even when both bounds are set. */\n input(): this {\n return this.ann({ control: 'input' });\n }\n}\n\nclass BooleanNode extends BaseNode<boolean> {\n readonly kind = 'boolean';\n\n /** Ask for a switch. `ControlPanel` still draws a checkbox; weasel-ui's\n * `PrefsForm` honors the distinction. */\n toggle(): this {\n return this.ann({ control: 'switch' });\n }\n}\n\nclass StringNode extends BaseNode<string> {\n readonly kind = 'string';\n\n placeholder(placeholder: string): this {\n return this.ann({ placeholder });\n }\n\n maxLength(maxLength: number): this {\n return this.ann({ maxLength });\n }\n\n /** Milliseconds to debounce live writes. 0 commits every keystroke. */\n debounce(debounceMs: number): this {\n return this.ann({ debounceMs });\n }\n}\n\nclass ColorNode extends BaseNode<string> {\n readonly kind = 'color';\n}\n\nclass EnumNode<T extends string> extends BaseNode<T> {\n readonly kind = 'enum';\n\n /** Render as a segmented control rather than a select. */\n radio(): this {\n return this.ann({ control: 'radio' });\n }\n\n /** Relabel the choices. Named `labels` rather than `options` because\n * `options` is the node's own extras bag. */\n labels(options: readonly ConfigOption[]): this {\n return this.ann({ options });\n }\n}\n\n/** A leaf whose kind the rule chain decides. */\nclass ValueNode<T> extends BaseNode<T> {\n readonly kind = null;\n}\n\n/** A leaf of a kind labkit does not ship a row for. */\nclass CustomNode<T> extends BaseNode<T> {\n constructor(\n readonly kind: string,\n defaultValue: T,\n annotations: Readonly<Annotations> = {},\n options: Readonly<NodeOptions> = {},\n ) {\n super(defaultValue, annotations, options);\n }\n\n protected override with(annotations: Annotations, options: NodeOptions): this {\n return new CustomNode(this.kind, this.default, annotations, options) as this;\n }\n}\n\n/**\n * A branch of the schema: its children nest under its key, so a leaf inside\n * one is read and written at a dotted path. Distinct from `.section()`, which\n * puts a heading over sibling leaves and leaves their paths alone.\n */\nclass GroupNode<S extends ConfigShape> implements ConfigBranch<S> {\n constructor(\n readonly children: S,\n readonly annotations: Readonly<BranchAnnotations> = {},\n readonly options: Readonly<BranchOptions> = {},\n ) {}\n\n private with(annotations: BranchAnnotations, options: BranchOptions): GroupNode<S> {\n return new GroupNode(this.children, annotations, options);\n }\n\n /** Heading for the group's rows. Defaults to the key, title-cased. */\n label(name: string): GroupNode<S> {\n return this.with({ ...this.annotations, name }, this.options);\n }\n\n /** Longer help text. Carried on the resolved `PrefGroup`, where weasel-ui's\n * `PrefsForm` draws it under the heading; `ControlPanel` has no place for\n * it yet and shows the heading alone. */\n describe(description: string): GroupNode<S> {\n return this.with({ ...this.annotations, description }, this.options);\n }\n\n /** Render this whole group under a named section heading. */\n section(label: string, opts: { collapsed?: boolean } = {}): GroupNode<S> {\n return this.with(this.annotations, { ...this.options, section: { label, ...opts } });\n }\n\n /** Show this group only while the predicate holds. Presentational — every\n * value beneath it stays in config and the instrument still reads it. */\n showIf(predicate: (config: Record<string, unknown>) => boolean): GroupNode<S> {\n return this.with(this.annotations, { ...this.options, showIf: predicate });\n }\n}\n\n/** Every default in a shape, nested the way the shape is. */\nfunction shapeDefaults(shape: ConfigShape): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(shape)) {\n out[key] = isConfigBranch(entry) ? shapeDefaults(entry.children) : entry.default;\n }\n return out;\n}\n\nconst expand = <T extends string>(\n options: readonly T[] | readonly ConfigOption[],\n): readonly ConfigOption[] =>\n options.map((o) => (typeof o === 'string' ? { value: o, label: o } : o));\n\n/**\n * Builds an instrument's config: the values, their types, and how each is\n * edited, in one declaration.\n *\n * ```ts\n * const config = f.schema({\n * showGrid: f.boolean(true),\n * cellSize: f.number(20).range(5, 80).step(5).label('Grid spacing'),\n * // Nested: read and written at `grid.color`.\n * grid: f.group({ color: f.color('#ffffff') }),\n * })\n * ```\n */\nexport const f = {\n number: (def: number): NumberNode => new NumberNode(def),\n boolean: (def: boolean): BooleanNode => new BooleanNode(def),\n string: (def: string): StringNode => new StringNode(def),\n color: (def: string): ColorNode => new ColorNode(def),\n\n /** A fixed set of choices. The default's literal type flows into the config\n * type, so `f.enum('fast', ['fast', 'accurate'])` gives\n * `'fast' | 'accurate'` with no `as const`. */\n enum: <const T extends string>(\n def: T,\n options: readonly T[] | readonly ConfigOption[],\n ): EnumNode<T> => new EnumNode<T>(def, { options: expand(options) }),\n\n /** A leaf with no declared kind: the rule chain decides, which is how a lab\n * states a convention like \"every `*Color` key is a color picker\". */\n value: <T>(def: T): ValueNode<T> => new ValueNode(def),\n\n /** A branch: its children nest under this key, so `grid: f.group({ size })`\n * puts the value at `config.grid.size` and addresses it as `'grid.size'`.\n * Groups nest as deeply as the schema wants. */\n group: <const S extends ConfigShape>(children: S): GroupNode<S> => new GroupNode(children),\n\n /** A leaf of a kind a lab supplies the control for, through `controls`. */\n custom: <T>(kind: string, def: T, validate?: (leaf: PrefLeaf) => string[]): CustomNode<T> =>\n new CustomNode(kind, def, {}, validate ? { validate } : {}),\n\n /** Collect leaves and groups into an instrument's config. */\n schema<S extends ConfigShape>(nodes: S): ConfigSchema<InferConfig<S>> {\n return { nodes, defaults: () => shapeDefaults(nodes) as InferConfig<S> };\n },\n};\n","import type { ConfigRule, ConfigRuleContext, LeafPatch } from './types';\n\n/** `cellSize` -> `Cell size`. Splits camelCase without shattering acronyms. */\nexport function titleCase(key: string): string {\n const words = key\n .replace(/[_-]+/g, ' ')\n .split(/(?<=[a-z0-9])(?=[A-Z])/)\n .join(' ')\n .trim()\n .toLowerCase();\n return words.length === 0 ? words : words[0].toUpperCase() + words.slice(1);\n}\n\n/** An `f.value` leaf takes its kind from the shape of its default. */\nconst kindFromValue: ConfigRule = (ctx) => {\n const t = typeof ctx.default;\n if (t === 'boolean' || t === 'number' || t === 'string') return { kind: t };\n return null;\n};\n\nconst labelFromKey: ConfigRule = (ctx) => ({ name: titleCase(ctx.key) });\n\n/** A number bounded on both sides is a slider; one bound or none is an input. */\nconst sliderWhenBounded: ConfigRule = (ctx) => {\n if (ctx.leaf.kind !== 'number') return null;\n const bounded = ctx.leaf.min !== undefined && ctx.leaf.max !== undefined;\n return bounded ? { control: 'slider' } : null;\n};\n\n/** `PrefBase.description` is required, so every leaf must end up with one. */\nconst descriptionDefault: ConfigRule = () => ({ description: '' });\n\n/**\n * labkit's own inference, expressed in the same vocabulary a consumer\n * extends. Runs after the consumer's rules, so a lab always wins.\n *\n * If one of these ever needs something a `ConfigRule` cannot express, the\n * seam is too weak — that is the point of writing them this way.\n */\nexport const builtinRules: readonly ConfigRule[] = [\n kindFromValue,\n labelFromKey,\n sliderWhenBounded,\n descriptionDefault,\n];\n\n/**\n * Fold a rule chain into one leaf patch. Gap-filling: a property already\n * settled is never overwritten, so the accumulator seeded with the author's\n * annotations beats every rule, and earlier rules beat later ones.\n */\nexport function applyRules(\n seed: LeafPatch,\n ctx: Omit<ConfigRuleContext, 'leaf'>,\n rules: readonly ConfigRule[],\n): LeafPatch {\n const acc: LeafPatch = { ...seed };\n for (const rule of rules) {\n const patch = rule({ ...ctx, leaf: acc });\n if (patch === null) continue;\n for (const [k, v] of Object.entries(patch)) {\n if (v !== undefined && acc[k as keyof LeafPatch] === undefined) {\n (acc as Record<string, unknown>)[k] = v;\n }\n }\n }\n return acc;\n}\n","import type { PrefGroup, PrefLeaf } from '@weasel-js/ui';\nimport { isConfigBranch } from './builder';\nimport { applyRules, builtinRules, titleCase } from './rules';\nimport type {\n ConfigEntry,\n ConfigRule,\n ConfigSchema,\n ConfigShape,\n ControlRenderer,\n LeafPatch,\n ResolvedConfig,\n SectionSpec,\n} from './types';\n\n/** Drop keys whose value is undefined, so an unset annotation stays a gap the\n * rule chain can fill rather than a settled `undefined`. */\nfunction defined(annotations: Record<string, unknown>): LeafPatch {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(annotations)) if (v !== undefined) out[k] = v;\n return out as LeafPatch;\n}\n\n/** What the walk collects on the side of the `PrefGroup` tree. */\ninterface Sink {\n sections: SectionSpec[];\n showIf: Map<string, (config: Record<string, unknown>) => boolean>;\n renderers: Record<string, ControlRenderer>;\n chain: readonly ConfigRule[];\n}\n\n/**\n * Resolve a schema into the vocabulary weasel-ui renders, running each leaf\n * through the consumer's rules and then labkit's own.\n *\n * The group mirrors the schema's own nesting: an `f.group` becomes a nested\n * `PrefGroup`, so a leaf's dotted path within the tree is the path its value\n * is written at, and both `ControlPanel` and `PrefsForm` address it\n * identically.\n */\nexport function resolveConfigSchema<TC>(\n schema: ConfigSchema<TC>,\n rules: readonly ConfigRule[] = [],\n): ResolvedConfig {\n const sink: Sink = {\n sections: [],\n showIf: new Map(),\n renderers: {},\n chain: [...rules, ...builtinRules],\n };\n const group = resolveShape(schema.nodes, '', '', sink);\n return { group, sections: sink.sections, showIf: sink.showIf, renderers: sink.renderers };\n}\n\n/** A section while it is still being filled. */\ntype OpenSection = Omit<SectionSpec, 'paths'> & { paths: string[] };\n\nfunction resolveShape(shape: ConfigShape, at: string, name: string, sink: Sink): PrefGroup {\n const children: Record<string, PrefLeaf | PrefGroup> = {};\n const sections = new Map<string, OpenSection>();\n\n for (const [key, entry] of Object.entries(shape)) {\n const path = at === '' ? key : `${at}.${key}`;\n children[key] = resolveEntry(entry, key, path, sink);\n\n const { section, showIf: predicate } = entry.options;\n if (section !== undefined) {\n let spec = sections.get(section.label);\n if (!spec) {\n spec = { at, label: section.label, paths: [] };\n sections.set(section.label, spec);\n sink.sections.push(spec);\n }\n spec.paths.push(path);\n // One node saying `collapsed` settles the section, so a schema does not\n // have to repeat it on every node under the heading.\n if (section.collapsed !== undefined) {\n spec.collapsed = (spec.collapsed ?? false) || section.collapsed;\n }\n }\n if (predicate) sink.showIf.set(path, predicate);\n if (!isConfigBranch(entry) && entry.options.render) sink.renderers[path] = entry.options.render;\n }\n\n return { name, children };\n}\n\nfunction resolveEntry(\n entry: ConfigEntry,\n key: string,\n path: string,\n sink: Sink,\n): PrefLeaf | PrefGroup {\n if (isConfigBranch(entry)) {\n const group = resolveShape(\n entry.children,\n path,\n entry.annotations.name ?? titleCase(key),\n sink,\n );\n return entry.annotations.description === undefined\n ? group\n : { ...group, description: entry.annotations.description };\n }\n const seed: LeafPatch = defined({\n ...entry.annotations,\n ...(entry.kind === null ? {} : { kind: entry.kind }),\n });\n const patch = applyRules(seed, { key, path, default: entry.default }, sink.chain);\n return { ...patch, default: entry.default } as PrefLeaf;\n}\n","import { createContext, useContext } from 'react';\nimport type { ConfigRule, ControlRenderer } from '../config/types';\nimport type { InstrumentList } from '../instrument/types';\nimport type { LabMode, SavedSnapshot, TrialRecord } from '../state/types';\nimport type { AddTrialOptions } from '../trial/trialOps';\n\n/** Lab-wide state and commands: the available instruments, the open\n * trials and the operations over them, saved snapshots, and the color\n * mode. */\nexport interface LabContextValue {\n instruments: InstrumentList;\n trials: TrialRecord[];\n /** Open a trial running `instrumentName`. `options.config` is written over\n * that instrument's defaults, which is where a trial opened on a subject\n * says which subject. */\n addTrial: (instrumentName: string, options?: AddTrialOptions) => void;\n cloneTrial: (id: string) => void;\n closeTrial: (id: string) => void;\n resetTrial: (id: string) => void;\n reorderTrials: (ids: readonly string[]) => void;\n savedSnapshots: SavedSnapshot[];\n saveSnapshot: (trialId: string, name?: string) => void;\n loadSnapshot: (trialId: string, snapshotId: string) => void;\n deleteSnapshot: (snapshotId: string) => void;\n mode: LabMode;\n setMode: (m: LabMode) => void;\n /** Lab-wide rules run over every instrument's config leaves, before\n * labkit's own inference. */\n configRules?: readonly ConfigRule[];\n /** Lab-wide control overrides, keyed by config path or by leaf kind. */\n controls?: Record<string, ControlRenderer>;\n}\n\n/** Context carrying the surrounding lab. Prefer `useLabContext`. */\nexport const LabContext = createContext<LabContextValue | null>(null);\n\n/** The surrounding lab. Throws outside a `<Lab>`. */\nexport function useLabContext(): LabContextValue {\n const ctx = useContext(LabContext);\n if (ctx === null) {\n throw new Error('useLabContext must be used inside <Lab>');\n }\n return ctx;\n}\n","import { useContext, useMemo } from 'react';\nimport type { Instrument } from '../instrument/types';\nimport { LabContext } from '../lab/LabContext';\nimport { fromConfigFields } from './fromConfigField';\nimport { resolveConfigSchema } from './resolve';\nimport type { ResolvedConfig } from './types';\n\nconst NO_RULES: readonly [] = [];\n\n/**\n * An instrument's controls, resolved against the surrounding lab's rules.\n *\n * Resolution cannot happen in `defineInstrument` — rules are lab-scoped and\n * that runs at module load — so it happens here, at render. Both instrument\n * paths land in the same shape, so callers never branch on which was used.\n */\nexport function useConfigSchema(\n // biome-ignore lint/suspicious/noExplicitAny: instruments are stored contravariantly; see InstrumentList\n instrument: Instrument<any, any, any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n): ResolvedConfig {\n const lab = useContext(LabContext);\n const rules = lab?.configRules ?? NO_RULES;\n return useMemo(\n () =>\n instrument.config\n ? resolveConfigSchema(instrument.config, rules)\n : fromConfigFields(instrument.configSchema?.() ?? []),\n [instrument, rules],\n );\n}\n","import type { ConfigSchema } from '../config/types';\nimport type { Instrument } from './types';\n\n/** An instrument as it is written: either the legacy `defaultConfig` (plus an\n * optional `configSchema`), or a `config` schema that supplies both. */\nexport type InstrumentSpec<TS, TC, TItem = unknown> =\n | Instrument<TS, TC, TItem>\n | (Omit<Instrument<TS, TC, TItem>, 'defaultConfig'> & { config: ConfigSchema<TC> });\n\n/**\n * Normalizes an instrument spec, and infers its state and config types from\n * the literal rather than making them be written out.\n *\n * A spec declaring `config` gets its `defaultConfig` synthesized from the\n * schema, so nothing downstream branches on which way the config was\n * declared. A spec written the legacy way is returned unchanged, by\n * reference.\n *\n * Resolving the schema into controls does not happen here: rules are\n * lab-scoped and this runs at module load. `useConfigSchema` does that.\n *\n * TypeScript infers all three type arguments or none, so a call that names\n * `TS` and `TC` leaves `TItem` at `unknown` and a job's `onItem` needs a cast.\n * Name the item type too, or pass no type arguments at all.\n */\nexport function defineInstrument<TS, TC, TItem = unknown>(\n spec: InstrumentSpec<TS, TC, TItem>,\n): Instrument<TS, TC, TItem> {\n if (spec.config && !('defaultConfig' in spec && spec.defaultConfig)) {\n const schema = spec.config;\n return { ...spec, defaultConfig: () => schema.defaults() } as Instrument<TS, TC, TItem>;\n }\n return spec as Instrument<TS, TC, TItem>;\n}\n","import type { ConfigField } from '../controls/types';\n\n/** Whether a config schema is usable, and every problem found rather than\n * just the first. */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/** Check a config schema for the mistakes that would otherwise surface as a\n * silently broken control: empty or duplicate keys, and fields whose own\n * constraints do not hold.\n *\n * An unrecognized type is not an error — a lab supplies controls for its own\n * kinds through `ControlPanel`'s `renderers`, and this cannot see them. Such\n * a field simply has no constraints to check here. */\nexport function validateConfigSchema(fields: ConfigField[]): ValidationResult {\n const errors: string[] = [];\n const seenKeys = new Set<string>();\n\n for (const field of fields) {\n if (field.key === '') {\n errors.push('Field has empty key');\n } else if (seenKeys.has(field.key)) {\n errors.push(`Duplicate config key: \"${field.key}\"`);\n } else {\n seenKeys.add(field.key);\n }\n\n if (field.label === '') {\n errors.push(`Field \"${field.key}\" has empty label`);\n }\n\n if (field.type === 'slider') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n if (field.min >= field.max) {\n errors.push(`Slider \"${field.key}\": min must be < max`);\n } else if (field.default < field.min || field.default > field.max) {\n errors.push(`Slider \"${field.key}\": default ${field.default} is outside [min, max]`);\n }\n } else if (field.type === 'number') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n } else if (field.type === 'select') {\n if (field.options.length === 0) {\n errors.push(`Select \"${field.key}\": options array must not be empty`);\n } else {\n const seenValues = new Set<string>();\n for (const opt of field.options) {\n if (seenValues.has(opt.value)) {\n errors.push(`Select \"${field.key}\": duplicate option value \"${opt.value}\"`);\n } else {\n seenValues.add(opt.value);\n }\n }\n if (!seenValues.has(field.default)) {\n errors.push(`Select \"${field.key}\": default \"${field.default}\" is not among options`);\n }\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","// GENERATED by packages/theme/scripts/build-tokens.ts — do not edit.\n\nimport type { RawToken } from '../dtcg/types';\n\n/** Every design token the built-in themes declare, spelled as the CSS\n * custom property it becomes. */\nexport type TokenName =\n | '--wzl-accent'\n | '--wzl-accent-base'\n | '--wzl-accent-fg'\n | '--wzl-accent-hover'\n | '--wzl-accent-soft'\n | '--wzl-accent-strong'\n | '--wzl-backdrop'\n | '--wzl-border'\n | '--wzl-border-raised'\n | '--wzl-border-strong'\n | '--wzl-border-w'\n | '--wzl-control-h'\n | '--wzl-curve-color'\n | '--wzl-curve-width'\n | '--wzl-danger'\n | '--wzl-danger-base'\n | '--wzl-ease-in-cubic'\n | '--wzl-ease-in-out-cubic'\n | '--wzl-ease-out-back'\n | '--wzl-ease-out-cubic'\n | '--wzl-fg'\n | '--wzl-fg-inverse'\n | '--wzl-fg-muted'\n | '--wzl-fg-on-accent'\n | '--wzl-fg-subtle'\n | '--wzl-field-pad-x'\n | '--wzl-focus-ring'\n | '--wzl-font-body'\n | '--wzl-font-display'\n | '--wzl-font-mono'\n | '--wzl-font-size'\n | '--wzl-font-size-2xs'\n | '--wzl-font-size-lg'\n | '--wzl-font-size-sm'\n | '--wzl-font-size-xl'\n | '--wzl-font-size-xs'\n | '--wzl-font-ui'\n | '--wzl-font-weight-bold'\n | '--wzl-font-weight-light'\n | '--wzl-font-weight-medium'\n | '--wzl-font-weight-normal'\n | '--wzl-glass-blur'\n | '--wzl-glass-tint'\n | '--wzl-gray-100'\n | '--wzl-gray-200'\n | '--wzl-gray-300'\n | '--wzl-gray-400'\n | '--wzl-gray-50'\n | '--wzl-gray-500'\n | '--wzl-gray-600'\n | '--wzl-gray-700'\n | '--wzl-gray-800'\n | '--wzl-gray-900'\n | '--wzl-leading'\n | '--wzl-leading-snug'\n | '--wzl-leading-tight'\n | '--wzl-line'\n | '--wzl-line-strong'\n | '--wzl-line-subtle'\n | '--wzl-line-width'\n | '--wzl-motion-fast'\n | '--wzl-motion-medium'\n | '--wzl-radius-lg'\n | '--wzl-radius-md'\n | '--wzl-radius-pill'\n | '--wzl-radius-sm'\n | '--wzl-shadow'\n | '--wzl-slider-thumb-size'\n | '--wzl-slider-thumb-tint'\n | '--wzl-slider-track-h'\n | '--wzl-slider-track-tint'\n | '--wzl-space-lg'\n | '--wzl-space-md'\n | '--wzl-space-sm'\n | '--wzl-space-xs'\n | '--wzl-success'\n | '--wzl-success-base'\n | '--wzl-surface'\n | '--wzl-surface-hover'\n | '--wzl-surface-pressed'\n | '--wzl-surface-raised'\n | '--wzl-surface-sunken'\n | '--wzl-swatch-amber'\n | '--wzl-swatch-cyan'\n | '--wzl-swatch-gold'\n | '--wzl-swatch-green'\n | '--wzl-swatch-magenta'\n | '--wzl-swatch-mint'\n | '--wzl-swatch-orange'\n | '--wzl-swatch-pink'\n | '--wzl-swatch-sky'\n | '--wzl-swatch-violet'\n | '--wzl-tb-height'\n | '--wzl-tracking-none'\n | '--wzl-tracking-wide'\n | '--wzl-tracking-wider'\n | '--wzl-warning'\n | '--wzl-warning-base'\n | '--wzl-z-modal'\n | '--wzl-z-overlay'\n | '--wzl-z-toolbar';\n\n/** A built-in theme with its aliases already collapsed: every mode maps\n * every token name to a final CSS value. */\nexport interface GeneratedTheme {\n readonly name: string;\n readonly defaultMode: string;\n readonly modes: Readonly<Record<string, Readonly<Record<TokenName, string>>>>;\n}\n\n/** The built-in themes, resolved, keyed by theme name. Read this to list\n * or preview themes without resolving a token graph yourself. */\nexport const THEMES = {\n \"weasel\": {\n name: \"weasel\",\n defaultMode: \"dark\",\n modes: {\n \"dark\": {\n '--wzl-gray-50': \"#f5f5f6\",\n '--wzl-gray-100': \"#e6e7e9\",\n '--wzl-gray-200': \"#c9cbcf\",\n '--wzl-gray-300': \"#9ea1a8\",\n '--wzl-gray-400': \"#6f737b\",\n '--wzl-gray-500': \"#4d5058\",\n '--wzl-gray-600': \"#383b42\",\n '--wzl-gray-700': \"#25272c\",\n '--wzl-gray-800': \"#181a1e\",\n '--wzl-gray-900': \"#0e0f12\",\n '--wzl-accent-soft': \"#1d1454\",\n '--wzl-accent-base': \"#2e1f7a\",\n '--wzl-accent-strong': \"#5841b8\",\n '--wzl-danger-base': \"#d94a3f\",\n '--wzl-warning-base': \"#d99a3f\",\n '--wzl-success-base': \"#2ec27e\",\n '--wzl-fg-on-accent': \"#f5f5f6\",\n '--wzl-fg': \"#e6e7e9\",\n '--wzl-line-subtle': \"rgba(230, 231, 233, 0.1)\",\n '--wzl-line': \"rgba(230, 231, 233, 0.2)\",\n '--wzl-line-strong': \"rgba(230, 231, 233, 0.4)\",\n '--wzl-curve-color': \"#5841b8\",\n '--wzl-accent': \"#2e1f7a\",\n '--wzl-accent-hover': \"#5841b8\",\n '--wzl-danger': \"#d94a3f\",\n '--wzl-warning': \"#d99a3f\",\n '--wzl-success': \"#2ec27e\",\n '--wzl-focus-ring': \"#5841b8\",\n '--wzl-glass-tint': \"#2e1f7a\",\n '--wzl-surface-hover': \"rgba(230, 231, 233, 0.1)\",\n '--wzl-surface-pressed': \"rgba(230, 231, 233, 0.18)\",\n '--wzl-swatch-green': \"#2fdd18\",\n '--wzl-swatch-pink': \"#ff5885\",\n '--wzl-swatch-cyan': \"#00dfff\",\n '--wzl-swatch-gold': \"#dcb700\",\n '--wzl-swatch-amber': \"#ff8c00\",\n '--wzl-swatch-violet': \"#a497ff\",\n '--wzl-swatch-mint': \"#00e7af\",\n '--wzl-swatch-sky': \"#00b8ff\",\n '--wzl-swatch-orange': \"#ff6b00\",\n '--wzl-swatch-magenta': \"#ff6eff\",\n '--wzl-radius-sm': \"3px\",\n '--wzl-radius-md': \"5px\",\n '--wzl-radius-lg': \"14px\",\n '--wzl-radius-pill': \"999px\",\n '--wzl-border-w': \"1px\",\n '--wzl-line-width': \"2px\",\n '--wzl-curve-width': \"3px\",\n '--wzl-tb-height': \"28px\",\n '--wzl-control-h': \"24px\",\n '--wzl-slider-track-h': \"4px\",\n '--wzl-slider-thumb-size': \"8px\",\n '--wzl-slider-track-tint': \"18%\",\n '--wzl-slider-thumb-tint': \"70%\",\n '--wzl-field-pad-x': \"8px\",\n '--wzl-glass-blur': \"3px\",\n '--wzl-font-size-2xs': \"9px\",\n '--wzl-font-size-xs': \"10px\",\n '--wzl-font-size-sm': \"11px\",\n '--wzl-font-size': \"13px\",\n '--wzl-font-size-lg': \"16px\",\n '--wzl-font-size-xl': \"20px\",\n '--wzl-space-xs': \"4px\",\n '--wzl-space-sm': \"8px\",\n '--wzl-space-md': \"12px\",\n '--wzl-space-lg': \"16px\",\n '--wzl-tracking-none': \"0\",\n '--wzl-tracking-wide': \"0.06em\",\n '--wzl-tracking-wider': \"0.08em\",\n '--wzl-z-toolbar': \"10\",\n '--wzl-z-overlay': \"20\",\n '--wzl-z-modal': \"30\",\n '--wzl-leading-tight': \"1\",\n '--wzl-leading-snug': \"1.2\",\n '--wzl-leading': \"1.4\",\n '--wzl-backdrop': \"none\",\n '--wzl-motion-fast': \"120ms\",\n '--wzl-motion-medium': \"240ms\",\n '--wzl-ease-in-cubic': \"cubic-bezier(0.32, 0, 0.67, 0)\",\n '--wzl-ease-out-cubic': \"cubic-bezier(0.33, 1, 0.68, 1)\",\n '--wzl-ease-in-out-cubic': \"cubic-bezier(0.65, 0, 0.35, 1)\",\n '--wzl-ease-out-back': \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\n '--wzl-font-ui': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-display': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-body': \"Inter, system-ui, -apple-system, 'Segoe UI', sans-serif\",\n '--wzl-font-mono': \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n '--wzl-font-weight-light': \"200\",\n '--wzl-font-weight-normal': \"300\",\n '--wzl-font-weight-medium': \"350\",\n '--wzl-font-weight-bold': \"400\",\n '--wzl-surface': \"#181a1e\",\n '--wzl-surface-raised': \"#25272c\",\n '--wzl-surface-sunken': \"#0e0f12\",\n '--wzl-fg-muted': \"#9ea1a8\",\n '--wzl-fg-subtle': \"#6f737b\",\n '--wzl-border': \"#25272c\",\n '--wzl-border-strong': \"#383b42\",\n '--wzl-accent-fg': \"#5841b8\",\n '--wzl-fg-inverse': \"#0e0f12\",\n '--wzl-shadow': \"rgba(0, 0, 0, 0.6)\",\n '--wzl-border-raised': \"#6f737b\",\n },\n \"light\": {\n '--wzl-gray-50': \"#f5f5f6\",\n '--wzl-gray-100': \"#e6e7e9\",\n '--wzl-gray-200': \"#c9cbcf\",\n '--wzl-gray-300': \"#9ea1a8\",\n '--wzl-gray-400': \"#6f737b\",\n '--wzl-gray-500': \"#4d5058\",\n '--wzl-gray-600': \"#383b42\",\n '--wzl-gray-700': \"#25272c\",\n '--wzl-gray-800': \"#181a1e\",\n '--wzl-gray-900': \"#0e0f12\",\n '--wzl-accent-soft': \"#1d1454\",\n '--wzl-accent-base': \"#2e1f7a\",\n '--wzl-accent-strong': \"#5841b8\",\n '--wzl-danger-base': \"#d94a3f\",\n '--wzl-warning-base': \"#d99a3f\",\n '--wzl-success-base': \"#2ec27e\",\n '--wzl-fg-on-accent': \"#f5f5f6\",\n '--wzl-fg': \"#0e0f12\",\n '--wzl-line-subtle': \"rgba(14, 15, 18, 0.1)\",\n '--wzl-line': \"rgba(14, 15, 18, 0.2)\",\n '--wzl-line-strong': \"rgba(14, 15, 18, 0.4)\",\n '--wzl-curve-color': \"#5841b8\",\n '--wzl-accent': \"#2e1f7a\",\n '--wzl-accent-hover': \"#5841b8\",\n '--wzl-danger': \"#d94a3f\",\n '--wzl-warning': \"#d99a3f\",\n '--wzl-success': \"#2ec27e\",\n '--wzl-focus-ring': \"#5841b8\",\n '--wzl-glass-tint': \"#2e1f7a\",\n '--wzl-surface-hover': \"rgba(14, 15, 18, 0.1)\",\n '--wzl-surface-pressed': \"rgba(14, 15, 18, 0.18)\",\n '--wzl-swatch-green': \"#2fdd18\",\n '--wzl-swatch-pink': \"#ff5885\",\n '--wzl-swatch-cyan': \"#00dfff\",\n '--wzl-swatch-gold': \"#dcb700\",\n '--wzl-swatch-amber': \"#ff8c00\",\n '--wzl-swatch-violet': \"#a497ff\",\n '--wzl-swatch-mint': \"#00e7af\",\n '--wzl-swatch-sky': \"#00b8ff\",\n '--wzl-swatch-orange': \"#ff6b00\",\n '--wzl-swatch-magenta': \"#ff6eff\",\n '--wzl-radius-sm': \"3px\",\n '--wzl-radius-md': \"5px\",\n '--wzl-radius-lg': \"14px\",\n '--wzl-radius-pill': \"999px\",\n '--wzl-border-w': \"1px\",\n '--wzl-line-width': \"2px\",\n '--wzl-curve-width': \"3px\",\n '--wzl-tb-height': \"28px\",\n '--wzl-control-h': \"24px\",\n '--wzl-slider-track-h': \"4px\",\n '--wzl-slider-thumb-size': \"8px\",\n '--wzl-slider-track-tint': \"18%\",\n '--wzl-slider-thumb-tint': \"70%\",\n '--wzl-field-pad-x': \"8px\",\n '--wzl-glass-blur': \"3px\",\n '--wzl-font-size-2xs': \"9px\",\n '--wzl-font-size-xs': \"10px\",\n '--wzl-font-size-sm': \"11px\",\n '--wzl-font-size': \"13px\",\n '--wzl-font-size-lg': \"16px\",\n '--wzl-font-size-xl': \"20px\",\n '--wzl-space-xs': \"4px\",\n '--wzl-space-sm': \"8px\",\n '--wzl-space-md': \"12px\",\n '--wzl-space-lg': \"16px\",\n '--wzl-tracking-none': \"0\",\n '--wzl-tracking-wide': \"0.06em\",\n '--wzl-tracking-wider': \"0.08em\",\n '--wzl-z-toolbar': \"10\",\n '--wzl-z-overlay': \"20\",\n '--wzl-z-modal': \"30\",\n '--wzl-leading-tight': \"1\",\n '--wzl-leading-snug': \"1.2\",\n '--wzl-leading': \"1.4\",\n '--wzl-backdrop': \"none\",\n '--wzl-motion-fast': \"120ms\",\n '--wzl-motion-medium': \"240ms\",\n '--wzl-ease-in-cubic': \"cubic-bezier(0.32, 0, 0.67, 0)\",\n '--wzl-ease-out-cubic': \"cubic-bezier(0.33, 1, 0.68, 1)\",\n '--wzl-ease-in-out-cubic': \"cubic-bezier(0.65, 0, 0.35, 1)\",\n '--wzl-ease-out-back': \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\n '--wzl-font-ui': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-display': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-body': \"Inter, system-ui, -apple-system, 'Segoe UI', sans-serif\",\n '--wzl-font-mono': \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n '--wzl-font-weight-light': \"200\",\n '--wzl-font-weight-normal': \"300\",\n '--wzl-font-weight-medium': \"350\",\n '--wzl-font-weight-bold': \"400\",\n '--wzl-surface': \"#f5f5f6\",\n '--wzl-surface-raised': \"#e6e7e9\",\n '--wzl-surface-sunken': \"#c9cbcf\",\n '--wzl-fg-muted': \"#383b42\",\n '--wzl-fg-subtle': \"#4d5058\",\n '--wzl-border': \"#c9cbcf\",\n '--wzl-border-strong': \"#9ea1a8\",\n '--wzl-accent-fg': \"#2e1f7a\",\n '--wzl-fg-inverse': \"#f5f5f6\",\n '--wzl-shadow': \"rgba(0, 0, 0, 0.18)\",\n '--wzl-border-raised': \"#6f737b\",\n },\n },\n },\n} as const satisfies Record<string, GeneratedTheme>;\n\n/** Unresolved token graph. `extends` needs the aliases intact so an override\n * of a base primitive still reaches everything referencing it. */\nexport interface ThemeSource {\n readonly primitives: Readonly<Record<string, RawToken>>;\n readonly modes: Readonly<Record<string, Readonly<Record<string, RawToken>>>>;\n}\n\n/** The same built-in themes as `THEMES`, unresolved. This is what\n * `defineTheme` layers onto. */\nexport const THEME_SOURCES: Readonly<Record<string, ThemeSource>> = {\n \"weasel\": {\n \"primitives\": {\n \"gray-50\": {\n \"type\": \"color\",\n \"value\": \"#f5f5f6\"\n },\n \"gray-100\": {\n \"type\": \"color\",\n \"value\": \"#e6e7e9\"\n },\n \"gray-200\": {\n \"type\": \"color\",\n \"value\": \"#c9cbcf\"\n },\n \"gray-300\": {\n \"type\": \"color\",\n \"value\": \"#9ea1a8\"\n },\n \"gray-400\": {\n \"type\": \"color\",\n \"value\": \"#6f737b\"\n },\n \"gray-500\": {\n \"type\": \"color\",\n \"value\": \"#4d5058\"\n },\n \"gray-600\": {\n \"type\": \"color\",\n \"value\": \"#383b42\"\n },\n \"gray-700\": {\n \"type\": \"color\",\n \"value\": \"#25272c\"\n },\n \"gray-800\": {\n \"type\": \"color\",\n \"value\": \"#181a1e\"\n },\n \"gray-900\": {\n \"type\": \"color\",\n \"value\": \"#0e0f12\"\n },\n \"accent-soft\": {\n \"type\": \"color\",\n \"value\": \"#1d1454\"\n },\n \"accent-base\": {\n \"type\": \"color\",\n \"value\": \"#2e1f7a\",\n \"description\": \"Midnight blue-violet. Deep and saturated; anchors primary actions on light and dark surfaces alike.\"\n },\n \"accent-strong\": {\n \"type\": \"color\",\n \"value\": \"#5841b8\"\n },\n \"danger-base\": {\n \"type\": \"color\",\n \"value\": \"#d94a3f\"\n },\n \"warning-base\": {\n \"type\": \"color\",\n \"value\": \"#d99a3f\"\n },\n \"success-base\": {\n \"type\": \"color\",\n \"value\": \"#2ec27e\"\n },\n \"fg-on-accent\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\"\n },\n \"line-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.1,\n \"description\": \"Barely-there separators (table rows).\"\n },\n \"line\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.2,\n \"description\": \"Primary gridlines on sunken surfaces.\"\n },\n \"line-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.4,\n \"description\": \"Axes and emphasized dividers.\"\n },\n \"curve-color\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\",\n \"description\": \"Drawn data curves. Routes through the bright accent because accent-base is too dim on sunken surfaces.\"\n },\n \"accent\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-base}\"\n },\n \"accent-hover\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\"\n },\n \"danger\": {\n \"type\": \"color\",\n \"value\": \"{color.danger-base}\"\n },\n \"warning\": {\n \"type\": \"color\",\n \"value\": \"{color.warning-base}\"\n },\n \"success\": {\n \"type\": \"color\",\n \"value\": \"{color.success-base}\"\n },\n \"focus-ring\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\"\n },\n \"glass-tint\": {\n \"type\": \"color\",\n \"value\": \"{color.accent}\",\n \"description\": \"Frosted-glass tint. Components compose it as color-mix(in srgb, var(--wzl-glass-tint) 78%, transparent) with backdrop-filter: blur(3px).\"\n },\n \"surface-hover\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.1,\n \"description\": \"Hover wash over a raised surface. Same formula as line-subtle, different job — do not collapse them.\"\n },\n \"surface-pressed\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.18,\n \"description\": \"Pressed wash over a raised surface.\"\n },\n \"swatch-green\": {\n \"type\": \"color\",\n \"value\": \"#2fdd18\",\n \"description\": \"First of ten categorical spot colors for plotting, status and data viz. Ordered — take them in sequence. Mode-invariant on purpose: a series keeps its color when the mode flips.\"\n },\n \"swatch-pink\": {\n \"type\": \"color\",\n \"value\": \"#ff5885\"\n },\n \"swatch-cyan\": {\n \"type\": \"color\",\n \"value\": \"#00dfff\"\n },\n \"swatch-gold\": {\n \"type\": \"color\",\n \"value\": \"#dcb700\"\n },\n \"swatch-amber\": {\n \"type\": \"color\",\n \"value\": \"#ff8c00\"\n },\n \"swatch-violet\": {\n \"type\": \"color\",\n \"value\": \"#a497ff\"\n },\n \"swatch-mint\": {\n \"type\": \"color\",\n \"value\": \"#00e7af\"\n },\n \"swatch-sky\": {\n \"type\": \"color\",\n \"value\": \"#00b8ff\"\n },\n \"swatch-orange\": {\n \"type\": \"color\",\n \"value\": \"#ff6b00\"\n },\n \"swatch-magenta\": {\n \"type\": \"color\",\n \"value\": \"#ff6eff\"\n },\n \"radius-sm\": {\n \"type\": \"dimension\",\n \"value\": \"3px\"\n },\n \"radius-md\": {\n \"type\": \"dimension\",\n \"value\": \"5px\"\n },\n \"radius-lg\": {\n \"type\": \"dimension\",\n \"value\": \"14px\"\n },\n \"radius-pill\": {\n \"type\": \"dimension\",\n \"value\": \"999px\",\n \"description\": \"Fully rounded ends — segmented controls, progress tracks.\"\n },\n \"border-w\": {\n \"type\": \"dimension\",\n \"value\": \"1px\"\n },\n \"line-width\": {\n \"type\": \"dimension\",\n \"value\": \"2px\",\n \"description\": \"Structural lines — gridlines, dividers, axes.\"\n },\n \"curve-width\": {\n \"type\": \"dimension\",\n \"value\": \"3px\",\n \"description\": \"Drawn data curves. Heavier than structural lines so data reads as primary content.\"\n },\n \"tb-height\": {\n \"type\": \"dimension\",\n \"value\": \"28px\",\n \"description\": \"Height of a horizontal toolbar strip (ActionsBar, OptionsBar, ToolOptionsBar). Taller than control-h so the controls inside a strip are not flush with its edges.\"\n },\n \"control-h\": {\n \"type\": \"dimension\",\n \"value\": \"24px\",\n \"description\": \"Height of an interactive control — button, input, select, segmented control. Distinct from tb-height, which sizes the strip a row of them sits in.\"\n },\n \"slider-track-h\": {\n \"type\": \"dimension\",\n \"value\": \"4px\",\n \"description\": \"Height of a linear range track. The kit's single-thumb ranges all wear this; Slider's default 24px canvas track does not.\"\n },\n \"slider-thumb-size\": {\n \"type\": \"dimension\",\n \"value\": \"8px\",\n \"description\": \"Diameter of a linear range thumb.\"\n },\n \"slider-track-tint\": {\n \"type\": \"dimension\",\n \"value\": \"18%\",\n \"description\": \"Accent proportion in a range track. Mixed into a real property, never into another custom property.\"\n },\n \"slider-thumb-tint\": {\n \"type\": \"dimension\",\n \"value\": \"70%\",\n \"description\": \"Accent proportion in a range thumb.\"\n },\n \"field-pad-x\": {\n \"type\": \"dimension\",\n \"value\": \"8px\",\n \"description\": \"Horizontal padding inside a boxed field. Pairs with --wzl-field-h, which is a container override and has no :root default.\"\n },\n \"glass-blur\": {\n \"type\": \"dimension\",\n \"value\": \"3px\",\n \"description\": \"Backdrop blur radius for frosted surfaces. Pairs with glass-tint.\"\n },\n \"font-size-2xs\": {\n \"type\": \"dimension\",\n \"value\": \"9px\",\n \"description\": \"Shortcut keys and index badges. The floor for chrome text.\"\n },\n \"font-size-xs\": {\n \"type\": \"dimension\",\n \"value\": \"10px\",\n \"description\": \"Tool-button labels under an icon.\"\n },\n \"font-size-sm\": {\n \"type\": \"dimension\",\n \"value\": \"11px\",\n \"description\": \"Chrome labels, status readouts, section headings.\"\n },\n \"font-size\": {\n \"type\": \"dimension\",\n \"value\": \"13px\",\n \"description\": \"Controls and body text.\"\n },\n \"font-size-lg\": {\n \"type\": \"dimension\",\n \"value\": \"16px\",\n \"description\": \"Panel and dialog titles.\"\n },\n \"font-size-xl\": {\n \"type\": \"dimension\",\n \"value\": \"20px\",\n \"description\": \"The largest chrome text — a lab or app title.\"\n },\n \"space-xs\": {\n \"type\": \"dimension\",\n \"value\": \"4px\"\n },\n \"space-sm\": {\n \"type\": \"dimension\",\n \"value\": \"8px\"\n },\n \"space-md\": {\n \"type\": \"dimension\",\n \"value\": \"12px\"\n },\n \"space-lg\": {\n \"type\": \"dimension\",\n \"value\": \"16px\"\n },\n \"tracking-none\": {\n \"type\": \"dimension\",\n \"value\": \"0\"\n },\n \"tracking-wide\": {\n \"type\": \"dimension\",\n \"value\": \"0.06em\",\n \"description\": \"Uppercase section headings.\"\n },\n \"tracking-wider\": {\n \"type\": \"dimension\",\n \"value\": \"0.08em\",\n \"description\": \"Uppercase at 11px and below.\"\n },\n \"z-toolbar\": {\n \"type\": \"number\",\n \"value\": 10\n },\n \"z-overlay\": {\n \"type\": \"number\",\n \"value\": 20\n },\n \"z-modal\": {\n \"type\": \"number\",\n \"value\": 30\n },\n \"leading-tight\": {\n \"type\": \"number\",\n \"value\": 1,\n \"description\": \"Single-line controls; the box sets the height.\"\n },\n \"leading-snug\": {\n \"type\": \"number\",\n \"value\": 1.2,\n \"description\": \"Headings and two-line labels.\"\n },\n \"leading\": {\n \"type\": \"number\",\n \"value\": 1.4,\n \"description\": \"Body and anything that wraps.\"\n },\n \"backdrop\": {\n \"type\": \"gradient\",\n \"value\": \"none\",\n \"description\": \"Layered backdrop fill for a page or lab root. `none` here; a theme with a signature background sets it.\"\n },\n \"motion-fast\": {\n \"type\": \"duration\",\n \"value\": \"120ms\",\n \"description\": \"Micro-interactions — hover, focus, pressed.\"\n },\n \"motion-medium\": {\n \"type\": \"duration\",\n \"value\": \"240ms\",\n \"description\": \"Entrances and exits — toasts, popovers, panels.\"\n },\n \"ease-in-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.32,\n 0,\n 0.67,\n 0\n ]\n },\n \"ease-out-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.33,\n 1,\n 0.68,\n 1\n ]\n },\n \"ease-in-out-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.65,\n 0,\n 0.35,\n 1\n ]\n },\n \"ease-out-back\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.34,\n 1.56,\n 0.64,\n 1\n ]\n },\n \"font-ui\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Oswald\",\n \"Helvetica Neue Condensed\",\n \"Arial Narrow\",\n \"system-ui\",\n \"sans-serif\"\n ],\n \"description\": \"Condensed UI/display face. The heavier cuts get blocky at any size, so the weight tokens stay in the 200-400 range.\"\n },\n \"font-display\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Oswald\",\n \"Helvetica Neue Condensed\",\n \"Arial Narrow\",\n \"system-ui\",\n \"sans-serif\"\n ]\n },\n \"font-body\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Inter\",\n \"system-ui\",\n \"-apple-system\",\n \"Segoe UI\",\n \"sans-serif\"\n ]\n },\n \"font-mono\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"ui-monospace\",\n \"SFMono-Regular\",\n \"Menlo\",\n \"Consolas\",\n \"monospace\"\n ]\n },\n \"font-weight-light\": {\n \"type\": \"fontWeight\",\n \"value\": 200\n },\n \"font-weight-normal\": {\n \"type\": \"fontWeight\",\n \"value\": 300\n },\n \"font-weight-medium\": {\n \"type\": \"fontWeight\",\n \"value\": 350\n },\n \"font-weight-bold\": {\n \"type\": \"fontWeight\",\n \"value\": 400\n }\n },\n \"modes\": {\n \"dark\": {\n \"surface\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-800}\"\n },\n \"surface-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-700}\"\n },\n \"surface-sunken\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\"\n },\n \"fg\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-100}\"\n },\n \"fg-muted\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-300}\"\n },\n \"fg-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-400}\"\n },\n \"border\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-700}\"\n },\n \"border-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-600}\"\n },\n \"accent-fg\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\",\n \"description\": \"Accent for foreground use — text, icons, selected labels drawn on a surface. accent is a fill; the midnight base is too dim to read as text on dark surfaces.\"\n },\n \"fg-inverse\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\",\n \"description\": \"Text drawn on a filled foreground-colored element (e.g. a slider thumb). Flips with the mode, so it is a semantic, not an alias to a primitive.\"\n },\n \"shadow\": {\n \"type\": \"color\",\n \"value\": \"rgba(0, 0, 0, 0.6)\",\n \"description\": \"Elevation. Always darker than any surface — never derived from fg, which is near-white on dark.\"\n },\n \"border-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-400}\",\n \"description\": \"The line around a raised surface. Clears 3:1 against surface and surface-raised in either mode, which the general-purpose border does not; over surface-sunken it does not, so a panel on a sunken field needs its own answer.\"\n }\n },\n \"light\": {\n \"surface\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\"\n },\n \"surface-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-100}\"\n },\n \"surface-sunken\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-200}\"\n },\n \"fg\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\"\n },\n \"fg-muted\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-600}\"\n },\n \"fg-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-500}\"\n },\n \"border\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-200}\"\n },\n \"border-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-300}\"\n },\n \"accent-fg\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-base}\",\n \"description\": \"Flips to the deep base in light mode, where it is the legible one.\"\n },\n \"fg-inverse\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\",\n \"description\": \"Flips with the mode — see the dark layer.\"\n },\n \"shadow\": {\n \"type\": \"color\",\n \"value\": \"rgba(0, 0, 0, 0.18)\"\n },\n \"border-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-400}\"\n }\n }\n }\n }\n};\n","import type { FlatTokens, RawToken } from './dtcg/types';\nimport { THEME_SOURCES } from './generated/themes';\n\n/** Authoring shorthand: a bare string is a literal or a `{ref}`. */\nexport type TokenInput = string | number | RawToken;\n\n/** What `defineTheme` accepts: a name, the base theme to layer onto, and the\n * token overrides, split into mode-invariant and per-mode. */\nexport interface ThemeInput {\n readonly name: string;\n /** Base to layer onto. Defaults to `weaselTheme`; `null` opts out. */\n readonly extends?: Theme | null;\n readonly defaultMode?: string;\n /** Mode-invariant overrides. */\n readonly tokens?: Readonly<Record<string, TokenInput>>;\n readonly modes: Readonly<Record<string, Readonly<Record<string, TokenInput>>>>;\n}\n\n/**\n * A theme: a named set of design tokens, organized into a mode-invariant layer\n * plus one layer per mode (light, dark, …), optionally extending another theme.\n * Tokens are held unresolved — aliases between them are collapsed later by\n * `resolveTheme`, so an override of a base primitive still reaches everything\n * that references it.\n */\nexport interface Theme {\n readonly name: string;\n readonly extends: Theme | null;\n readonly defaultMode: string;\n readonly tokens: FlatTokens;\n readonly modes: Readonly<Record<string, FlatTokens>>;\n}\n\nfunction normalize(input: Readonly<Record<string, TokenInput>>): FlatTokens {\n const out: FlatTokens = {};\n for (const [name, v] of Object.entries(input)) {\n out[name] =\n typeof v === 'object'\n ? v\n : { type: 'unknown', value: v, alpha: undefined, description: undefined };\n }\n return out;\n}\n\n/** The built-in theme, materialized from the generated source. */\nexport const weaselTheme: Theme = {\n name: 'weasel',\n extends: null,\n defaultMode: 'dark',\n tokens: THEME_SOURCES.weasel.primitives as FlatTokens,\n modes: THEME_SOURCES.weasel.modes as Record<string, FlatTokens>,\n};\n\n/** Build a theme from authoring shorthand. Unless `extends` says otherwise the\n * result layers onto `weaselTheme`, so a theme only needs to name what it\n * changes. */\nexport function defineTheme(input: ThemeInput): Theme {\n const base = input.extends === undefined ? weaselTheme : input.extends;\n const modes: Record<string, FlatTokens> = {};\n for (const [mode, tokens] of Object.entries(input.modes)) modes[mode] = normalize(tokens);\n return {\n name: input.name,\n extends: base,\n defaultMode: input.defaultMode ?? base?.defaultMode ?? 'dark',\n tokens: normalize(input.tokens ?? {}),\n modes,\n };\n}\n","/**\n * Hex → `rgba()`. The JS side of the alpha extension; the CSS side emits\n * `color-mix()` instead so DOM chrome keeps tracking a downstream override of\n * the referenced token.\n */\nexport function hexToRgba(hex: string, alpha: number): string {\n const m = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) throw new Error(`Expected a hex color, got \"${hex}\"`);\n\n const body = m[1];\n const full = body.length === 3 ? body.replace(/./g, (c) => c + c) : body;\n const r = Number.parseInt(full.slice(0, 2), 16);\n const g = Number.parseInt(full.slice(2, 4), 16);\n const b = Number.parseInt(full.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n","import { hexToRgba } from './color';\nimport type { FlatTokens, ResolvedTokenMap, TokenValue } from './types';\n\n/** `{color.gray-100}` → `gray-100`. The type group is dropped, per the naming rule. */\nconst REF = /^\\{([^}]+)\\}$/;\n\nfunction refTarget(value: TokenValue): string | null {\n if (typeof value !== 'string') return null;\n const m = REF.exec(value.trim());\n if (!m) return null;\n const path = m[1];\n const dot = path.indexOf('.');\n return dot === -1 ? path : path.slice(dot + 1);\n}\n\n/**\n * Quote family names containing whitespace; leave everything else bare.\n * Generic keywords (`sans-serif`) and hyphen-prefixed identifiers\n * (`-apple-system`) break if quoted, and neither contains a space.\n */\nfunction fontStack(value: readonly (string | number)[]): string {\n return value.map((f) => (typeof f === 'string' && /\\s/.test(f) ? `'${f}'` : String(f))).join(', ');\n}\n\nfunction serialize(type: string, value: TokenValue): string {\n if (Array.isArray(value)) {\n if (type === 'cubicBezier') return `cubic-bezier(${value.join(', ')})`;\n if (type === 'fontFamily') return fontStack(value);\n return value.join(', ');\n }\n return String(value);\n}\n\n/**\n * Resolve flat tokens to final CSS-ready strings.\n *\n * Merge modes before calling: this function has no notion of modes, only of a\n * complete token set.\n */\nexport function resolveTokens(tokens: FlatTokens): ResolvedTokenMap {\n const out: ResolvedTokenMap = {};\n const inProgress = new Set<string>();\n\n const resolveOne = (name: string): string => {\n const cached = out[name];\n if (cached !== undefined) return cached;\n\n const token = tokens[name];\n if (!token) throw new Error(`Unknown token \"${name}\"`);\n\n if (inProgress.has(name)) {\n throw new Error(`Reference cycle at token \"${name}\" (${[...inProgress].join(' → ')})`);\n }\n inProgress.add(name);\n\n const target = refTarget(token.value);\n let value: string;\n if (target === null) {\n value = serialize(token.type, token.value);\n } else if (!tokens[target]) {\n throw new Error(`Token \"${name}\" references \"${target}\", which is not defined`);\n } else {\n value = resolveOne(target);\n }\n\n if (token.alpha !== undefined) value = hexToRgba(value, token.alpha);\n\n inProgress.delete(name);\n out[name] = value;\n return value;\n };\n\n for (const name of Object.keys(tokens)) resolveOne(name);\n return out;\n}\n\n/** Merge a mode's tokens over the mode-invariant set. Later wins. */\nexport function mergeTokens(base: FlatTokens, mode: FlatTokens): FlatTokens {\n return { ...base, ...mode };\n}\n","import { resolveTokens } from './dtcg/resolve';\nimport type { FlatTokens } from './dtcg/types';\nimport type { Theme } from './theme';\nimport type { TokenName } from './generated/themes';\n\n/** The output of `resolveTheme`: every token of a theme, for one mode, keyed\n * by CSS custom-property name and flattened to a final CSS value. */\nexport type ResolvedTheme = Readonly<Record<TokenName, string>>;\n\n/** Root-first so the leaf theme's overrides land last. */\nfunction chain(theme: Theme): Theme[] {\n const out: Theme[] = [];\n for (let t: Theme | null = theme; t; t = t.extends) out.unshift(t);\n return out;\n}\n\n/**\n * Merge the extends chain, layer the mode over it, resolve every alias, and\n * key the result by CSS custom-property name.\n *\n * Pure — no DOM. An unresolvable reference throws rather than falling back.\n */\nexport function resolveTheme(theme: Theme, mode: string): ResolvedTheme {\n const themes = chain(theme);\n const effectiveMode = themes.some((t) => mode in t.modes) ? mode : theme.defaultMode;\n\n // Each theme contributes its mode-invariant tokens and then its mode layer,\n // before the next theme down the chain gets a turn. Collecting all `tokens`\n // first and all mode layers second would let the *base's* mode layer outrank\n // a derived theme's deliberate mode-invariant override.\n let merged: FlatTokens = {};\n for (const t of themes) {\n merged = { ...merged, ...t.tokens, ...(t.modes[effectiveMode] ?? {}) };\n }\n\n const resolved = resolveTokens(merged);\n const out: Record<string, string> = {};\n for (const [name, value] of Object.entries(resolved)) out[`--wzl-${name}`] = value;\n return out as ResolvedTheme;\n}\n","import { resolveTheme } from './resolveTheme';\nimport type { Theme } from './theme';\n\nconst STYLE_ID = 'wzl-themes';\n/** `theme.name::mode` → the rule text currently published for it. Keyed by\n * name because that is what the rule's selector matches on, and holding the\n * text is what lets a redefinition under the same name replace its rule\n * rather than be swallowed as a cache hit. */\nconst emitted = new Map<string, string>();\nlet sheet: CSSStyleSheet | null = null;\nlet styleEl: HTMLStyleElement | null = null;\n\n/** Test seam — drops the module-level cache so each case starts clean. */\nexport function __resetThemeSheet(): void {\n emitted.clear();\n sheet = null;\n styleEl = null;\n}\n\nfunction canAdopt(): boolean {\n return (\n typeof CSSStyleSheet !== 'undefined' &&\n 'replaceSync' in CSSStyleSheet.prototype &&\n Array.isArray(document.adoptedStyleSheets)\n );\n}\n\n/** Republish every rule from `emitted`. Rewriting the whole sheet rather than\n * appending keeps it the size of the theme set: a theme redefined under a\n * name it already used replaces its rule instead of stacking another one. */\nfunction flushRules(): void {\n const css = [...emitted.values()].join('\\n');\n if (canAdopt()) {\n if (!sheet) {\n sheet = new CSSStyleSheet();\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n }\n sheet.replaceSync(css);\n return;\n }\n if (!styleEl) {\n styleEl = document.createElement('style');\n styleEl.id = STYLE_ID;\n document.head.appendChild(styleEl);\n }\n styleEl.textContent = css;\n}\n\n/**\n * Apply `theme` at `mode` to `el`'s subtree.\n *\n * Stamps two data attributes and ensures a matching rule block exists in a\n * module-owned stylesheet. Deliberately not inline properties: the cascade\n * then does the work, per-subtree overrides are just a different theme name,\n * and no `!important` is ever needed. No-op outside a DOM.\n */\nexport function applyTheme(el: HTMLElement, theme: Theme, mode: string): void {\n if (typeof document === 'undefined') return;\n\n const key = `${theme.name}::${mode}`;\n const resolved = resolveTheme(theme, mode);\n const body = Object.entries(resolved)\n .map(([name, value]) => `${name}: ${value};`)\n .join(' ');\n const rule = `[data-wzl-theme='${theme.name}'][data-wzl-mode='${mode}'] { ${body} }`;\n if (emitted.get(key) !== rule) {\n emitted.set(key, rule);\n flushRules();\n }\n\n el.setAttribute('data-wzl-theme', theme.name);\n el.setAttribute('data-wzl-mode', mode);\n}\n","import React, { createContext, useContext, useMemo, useRef, useLayoutEffect } from 'react';\nimport { applyTheme } from './applyTheme';\nimport { resolveTheme, type ResolvedTheme } from './resolveTheme';\nimport { weaselTheme, type Theme } from './theme';\n\n/** What `<ThemeProvider>` publishes: the theme, the mode in force, and the\n * fully resolved token record for that pair. */\nexport interface ThemeContextValue {\n readonly theme: Theme;\n readonly mode: string;\n readonly resolved: ResolvedTheme;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\n/** Props for `<ThemeProvider>`. */\nexport interface ThemeProviderProps {\n readonly theme?: Theme;\n readonly mode?: string;\n /** Applied to the wrapper element, so it can be the layout element too. */\n readonly className?: string;\n readonly style?: React.CSSProperties;\n readonly children: React.ReactNode;\n}\n\n/**\n * Applies a theme to a wrapper element and publishes the resolved record.\n *\n * Consumers that draw outside the DOM (the WebGL HUD) read `resolved` and\n * never touch `getComputedStyle`.\n *\n * The wrapper is a real element in the layout. Pass `className` rather than\n * nesting your own div inside — an anonymous div between a flex parent and\n * its child breaks percentage heights.\n */\nexport function ThemeProvider({\n theme = weaselTheme,\n mode,\n className,\n style,\n children,\n}: ThemeProviderProps): React.ReactElement {\n const ref = useRef<HTMLDivElement>(null);\n const effectiveMode = mode ?? theme.defaultMode;\n\n const value = useMemo<ThemeContextValue>(\n () => ({ theme, mode: effectiveMode, resolved: resolveTheme(theme, effectiveMode) }),\n [theme, effectiveMode],\n );\n\n useLayoutEffect(() => {\n if (ref.current) applyTheme(ref.current, theme, effectiveMode);\n }, [theme, effectiveMode]);\n\n return (\n <ThemeContext.Provider value={value}>\n <div\n ref={ref}\n className={className}\n style={style}\n data-wzl-theme={theme.name}\n data-wzl-mode={effectiveMode}\n >\n {children}\n </div>\n </ThemeContext.Provider>\n );\n}\n\n/** The theme in force. Throws outside a `<ThemeProvider>`; use\n * `useThemeOptional` where the provider is not guaranteed. */\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error('useTheme must be used inside a <ThemeProvider>');\n return ctx;\n}\n\n/**\n * The theme if one is provided, `null` otherwise.\n *\n * For kit internals that should follow a theme when the app supplies one but\n * must still work in an app that never mounted a provider — `useHud` is the\n * motivating case.\n */\nexport function useThemeOptional(): ThemeContextValue | null {\n return useContext(ThemeContext);\n}\n","import type { InstrumentSerializers } from '../state/types';\nimport type { InstrumentList } from './types';\n\n/**\n * Each instrument's default config, keyed by name — what `createLabStore`\n * fills a stored config's gaps from, so one saved before its schema grew a\n * branch still loads.\n */\nexport function configDefaultsOf(instruments: InstrumentList): Record<string, () => unknown> {\n const out: Record<string, () => unknown> = {};\n for (const instrument of instruments) out[instrument.name] = () => instrument.defaultConfig();\n return out;\n}\n\n/**\n * The `serialize` / `deserialize` an instrument list declares, keyed by\n * instrument name — what `createLabStore` needs to rebuild a trial's state\n * from storage.\n *\n * An instrument declaring neither gets no entry, which is what leaves a\n * JSON-safe state to pass through untouched.\n */\nexport function serializersOf(instruments: InstrumentList): InstrumentSerializers {\n const out: InstrumentSerializers = {};\n for (const instrument of instruments) {\n const { name, serialize, deserialize } = instrument;\n if (!serialize && !deserialize) continue;\n out[name] = {\n ...(serialize ? { serialize: (state: unknown) => serialize(state) } : {}),\n ...(deserialize\n ? { deserialize: (data: unknown, config: unknown) => deserialize(data, config) }\n : {}),\n };\n }\n return out;\n}\n","/** The one `$extensions` key this kit defines. */\nexport const ALPHA_EXT = 'com.weasel.alpha';\n\nexport type TokenValue = string | number | readonly (string | number)[];\n\n/**\n * A single design token as authored, before aliases are resolved: a DTCG-shaped\n * `{ type, value }` pair where `value` may still be a `{ref}` to another token.\n */\nexport interface RawToken {\n readonly type: string;\n readonly value: TokenValue;\n /** Render the referenced color at this alpha, 0–1. */\n readonly alpha?: number | undefined;\n readonly description?: string | undefined;\n}\n\n/** A token graph flattened to one level, keyed by token name (no `--wzl-`\n * prefix). Still unresolved — see `ResolvedTokenMap` for the output side. */\nexport type FlatTokens = Record<string, RawToken>;\n\n/** A resolved theme: every token name mapped to its final CSS-ready string.\n * Named ...Map, not ...Tokens, to stay distinct from hud's public `ResolvedTokens`. */\nexport type ResolvedTokenMap = Record<string, string>;\n","import { ALPHA_EXT, type FlatTokens, type RawToken, type TokenValue } from './types';\n\ninterface DtcgToken {\n $value: TokenValue;\n $type?: string;\n $description?: string;\n $extensions?: Record<string, unknown>;\n}\n\nconst isToken = (v: unknown): v is DtcgToken =>\n typeof v === 'object' && v !== null && '$value' in v;\n\n/**\n * Collapse a DTCG document into flat token names.\n *\n * Groups exist only to carry `$type`; they contribute nothing to the name, so\n * `color.fg-muted` becomes `fg-muted` and in turn `--wzl-fg-muted`. This shape\n * is forced by the token set: `--wzl-accent` and `--wzl-accent-base` are both\n * real tokens, and DTCG forbids a token that is also a group.\n */\nexport function flattenTokens(doc: Record<string, unknown>): FlatTokens {\n const out: FlatTokens = {};\n\n for (const [groupName, group] of Object.entries(doc)) {\n if (groupName.startsWith('$')) continue;\n if (typeof group !== 'object' || group === null) continue;\n\n const g = group as Record<string, unknown> & { $type?: string };\n const groupType = g.$type;\n\n for (const [leaf, node] of Object.entries(g)) {\n if (leaf.startsWith('$')) continue;\n if (!isToken(node)) continue;\n\n const type = node.$type ?? groupType;\n if (!type) {\n throw new Error(`Token \"${leaf}\" has no $type and its group \"${groupName}\" declares none`);\n }\n if (leaf in out) {\n throw new Error(`Duplicate token name \"${leaf}\" — leaf keys must be unique across type groups`);\n }\n\n const alphaRaw = node.$extensions?.[ALPHA_EXT];\n const token: RawToken = {\n type,\n value: node.$value,\n alpha: typeof alphaRaw === 'number' ? alphaRaw : undefined,\n description: node.$description,\n };\n out[leaf] = token;\n }\n }\n\n return out;\n}\n","import { flattenTokens } from './dtcg/flatten';\nimport type { FlatTokens } from './dtcg/types';\nimport { weaselTheme, type Theme } from './theme';\n\ninterface DtcgDocument {\n name?: unknown;\n defaultMode?: unknown;\n extends?: Theme | null;\n primitives?: Record<string, unknown>;\n modes?: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Build a `Theme` from a DTCG document — the interchange path, for tokens\n * exported by a design tool rather than authored in TS.\n */\nexport function loadDTCG(doc: DtcgDocument): Theme {\n if (typeof doc.name !== 'string' || doc.name === '') {\n throw new Error('DTCG document needs a string \"name\"');\n }\n const modes: Record<string, FlatTokens> = {};\n for (const [mode, body] of Object.entries(doc.modes ?? {})) {\n modes[mode] = flattenTokens(body);\n }\n const base = doc.extends === undefined ? weaselTheme : doc.extends;\n return {\n name: doc.name,\n extends: base,\n defaultMode:\n typeof doc.defaultMode === 'string' ? doc.defaultMode : (base?.defaultMode ?? 'dark'),\n tokens: flattenTokens(doc.primitives ?? {}),\n modes,\n };\n}\n","{\n \"name\": \"interstellar\",\n \"defaultMode\": \"dark\",\n \"primitives\": {\n \"dimension\": {\n \"$type\": \"dimension\",\n \"radius-md\": { \"$value\": \"6px\" },\n \"glass-blur\": { \"$value\": \"12px\" }\n },\n \"fontWeight\": {\n \"$type\": \"fontWeight\",\n \"font-weight-light\": { \"$value\": 300 },\n \"font-weight-medium\": { \"$value\": 500 },\n \"font-weight-bold\": { \"$value\": 700 }\n }\n },\n \"modes\": {\n \"dark\": {\n \"color\": {\n \"$type\": \"color\",\n \"surface\": { \"$value\": \"#0a0a14\" },\n \"surface-raised\": { \"$value\": \"rgba(20, 20, 36, 0.55)\" },\n \"surface-sunken\": { \"$value\": \"#02020a\" },\n \"border\": { \"$value\": \"rgba(255, 255, 255, 0.14)\" },\n \"line-subtle\": { \"$value\": \"rgba(255, 255, 255, 0.08)\" },\n \"fg\": { \"$value\": \"#e8e8f0\" },\n \"fg-muted\": { \"$value\": \"#a8a8c0\" },\n \"fg-subtle\": { \"$value\": \"#5a5a78\" },\n \"accent\": { \"$value\": \"#b08adb\" },\n \"accent-hover\": { \"$value\": \"#c6a3ee\" },\n \"focus-ring\": { \"$value\": \"rgba(176, 138, 219, 0.45)\" },\n \"shadow\": { \"$value\": \"rgba(0, 0, 0, 0.7)\" },\n \"border-raised\": { \"$value\": \"rgba(255, 255, 255, 0.36)\" }\n },\n \"gradient\": {\n \"$type\": \"gradient\",\n \"backdrop\": {\n \"$value\": \"radial-gradient(ellipse 60% 80% at 18% 30%, rgba(150, 80, 200, 0.22), transparent 70%), radial-gradient(ellipse 55% 90% at 78% 70%, rgba(220, 100, 140, 0.18), transparent 65%), radial-gradient(ellipse 50% 70% at 50% 50%, rgba(60, 110, 200, 0.18), transparent 75%), radial-gradient(ellipse at center, #0a0a18 0%, #02020a 100%)\"\n }\n }\n },\n \"light\": {\n \"color\": {\n \"$type\": \"color\",\n \"surface\": { \"$value\": \"#fafaf7\" },\n \"surface-raised\": { \"$value\": \"#ffffff\" },\n \"surface-sunken\": { \"$value\": \"#f0ebe2\" },\n \"border\": { \"$value\": \"#c9bba5\" },\n \"line-subtle\": { \"$value\": \"rgba(0, 0, 0, 0.08)\" },\n \"fg\": { \"$value\": \"#2a2018\" },\n \"fg-muted\": { \"$value\": \"#6b5c4a\" },\n \"fg-subtle\": { \"$value\": \"#a89b85\" },\n \"accent\": { \"$value\": \"#a86f3c\" },\n \"accent-hover\": { \"$value\": \"#c2854f\" },\n \"focus-ring\": { \"$value\": \"rgba(168, 111, 60, 0.35)\" },\n \"shadow\": { \"$value\": \"rgba(80, 60, 40, 0.18)\" },\n \"border-raised\": { \"$value\": \"#9e8b71\" }\n }\n }\n }\n}\n","import { loadDTCG, type Theme } from '@weasel-js/theme';\nimport doc from './interstellar.tokens.json' with { type: 'json' };\n\n/**\n * labkit's theme: a cosmic dark and a warm parchment light, extending the\n * built-in weasel theme. Authored as DTCG and loaded at import time — the\n * interchange path a theme exported from a design tool would take.\n */\nexport const interstellarTheme: Theme = loadDTCG(doc);\n","import type { ViewTransform } from '../instrument/types';\n\n/** The 2D view labkit has always shipped, and what a trial gets when it names no\n * other. Re-exported under its own name so a consumer can say which it means. */\nexport type ViewTransform2D = ViewTransform;\n\nexport const DEFAULT_VIEW: ViewTransform2D = { zoom: 1, pan: { x: 0, y: 0 } };\n\n/** A trial's view is opaque to labkit, so anything that needs the 2D shape — the\n * zoom chrome, `CanvasStack` — asks for it and handles not getting it. */\nexport function as2DView(view: unknown): ViewTransform2D | null {\n if (typeof view !== 'object' || view === null) return null;\n const v = view as Partial<ViewTransform2D>;\n if (typeof v.zoom !== 'number') return null;\n if (typeof v.pan !== 'object' || v.pan === null) return null;\n if (typeof v.pan.x !== 'number' || typeof v.pan.y !== 'number') return null;\n return { zoom: v.zoom, pan: { x: v.pan.x, y: v.pan.y } };\n}\n","import { type ReactNode, useEffect, useMemo, useRef } from 'react';\nimport { asNodeId, createNode, Store, stripStrategy } from 'windease';\nimport { type ChromeMap, Container, Provider, StrategyRegistryProvider } from 'windease/react';\n\nconst ZONE_ID = asNodeId('lk-trial-body');\nconst SIDEBAR_ID = asNodeId('lk-trial-sidebar');\nconst CONTENT_ID = asNodeId('lk-trial-content');\nconst STRATEGIES = { strip: stripStrategy as never };\n\n/** Props for `<TrialBody>`. */\nexport interface TrialBodyProps {\n /** The sidebar region's sections. */\n sidebar: ReactNode;\n /** The instrument's own output. */\n children: ReactNode;\n /** Extra class on the content pane — `Trial` marks a canvas instrument's\n * well flush. */\n contentClassName?: string;\n /** The sidebar's current extent in pixels. Omit for an unpersisted lab: the\n * seam still works, its result just does not outlive the mount. */\n width?: number;\n /** Where the sidebar starts before anyone drags it. */\n defaultWidth?: number;\n minWidth?: number;\n maxWidth?: number;\n /** How little the instrument may be squeezed to. Reported as the seam's\n * reachable maximum, so the drag stops there rather than clamping silently. */\n contentMinWidth?: number;\n /** Fires through the drag, not on release: the pane is already there. */\n onWidthChange?: (width: number) => void;\n /**\n * Fixed extent. Omit in an app — the strip measures its own box. Supply it\n * where nothing measures, notably jsdom, or both panes lay out at zero.\n */\n viewport?: { w: number; h: number };\n}\n\n/**\n * A trial's sidebar and content as a two-pane strip with a draggable seam.\n *\n * The seam is `stripStrategy`'s own resize affordance, so it arrives as a\n * `role=\"separator\"` carrying the reachable range, operable by pointer and by\n * arrows / Home / End, and clamped against the content pane's floor rather\n * than against the sidebar's alone.\n */\nexport function TrialBody({\n sidebar,\n children,\n contentClassName,\n width,\n defaultWidth = 320,\n minWidth = 140,\n maxWidth = 720,\n contentMinWidth = 160,\n onWidthChange,\n viewport,\n}: TrialBodyProps) {\n // The cross-axis half of every size hint below is inert: a horizontal strip\n // stretches its panes to the container's height and never reads `h`.\n const storeRef = useRef<Store | null>(null);\n if (storeRef.current === null) {\n const store = new Store();\n store.registerNode(\n createNode({\n kind: 'zone',\n id: ZONE_ID,\n container: { strategyId: 'strip', config: { axis: 'x', resizable: true } },\n }),\n );\n store.registerNode(\n createNode({\n kind: 'sidebar',\n id: SIDEBAR_ID,\n parentId: ZONE_ID,\n meta: { title: 'Sidebar' },\n placement: { size: { w: width ?? defaultWidth } },\n hints: { minSize: { w: minWidth, h: 0 }, maxSize: { w: maxWidth, h: 0 } },\n }),\n );\n store.registerNode(\n createNode({\n kind: 'content',\n id: CONTENT_ID,\n parentId: ZONE_ID,\n meta: { title: 'Content' },\n hints: { minSize: { w: contentMinWidth, h: 0 } },\n }),\n );\n store.showNode(SIDEBAR_ID);\n store.showNode(CONTENT_ID);\n storeRef.current = store;\n }\n const store = storeRef.current;\n\n // What the store last held, so the placement event can tell a drag from the\n // echo of our own write and a controlled `width` does not fight the seam.\n const widthRef = useRef(width ?? defaultWidth);\n\n useEffect(() => {\n store.setHints(SIDEBAR_ID, {\n minSize: { w: minWidth, h: 0 },\n maxSize: { w: maxWidth, h: 0 },\n });\n store.setHints(CONTENT_ID, { minSize: { w: contentMinWidth, h: 0 } });\n }, [store, minWidth, maxWidth, contentMinWidth]);\n\n useEffect(() => {\n if (width === undefined || width === widthRef.current) return;\n widthRef.current = width;\n store.patchPlacement(SIDEBAR_ID, { size: { w: width } });\n }, [store, width]);\n\n const onWidthChangeRef = useRef(onWidthChange);\n onWidthChangeRef.current = onWidthChange;\n useEffect(\n () =>\n store.events.on('node.placementChanged', () => {\n const next = (store.getPlacement(SIDEBAR_ID)?.size as { w?: number } | undefined)?.w;\n if (typeof next !== 'number' || next === widthRef.current) return;\n widthRef.current = next;\n onWidthChangeRef.current?.(next);\n }),\n [store],\n );\n\n const chrome = useMemo<ChromeMap>(\n () => ({\n sidebar: () => <div className=\"lk-trial__sidebar\">{sidebar}</div>,\n content: () => (\n <div\n className={\n contentClassName ? `lk-trial__content ${contentClassName}` : 'lk-trial__content'\n }\n >\n {children}\n </div>\n ),\n }),\n [sidebar, children, contentClassName],\n );\n\n return (\n <Provider store={store}>\n <StrategyRegistryProvider strategies={STRATEGIES}>\n <Container\n parentId={ZONE_ID}\n chrome={chrome}\n className=\"lk-trial__panes windease-zone\"\n affordances\n viewport={viewport}\n />\n </StrategyRegistryProvider>\n </Provider>\n );\n}\n","import { createContext, useContext } from 'react';\nimport type { NodeId } from 'windease';\n\n/** Supplied by `<Workspace>` when trials are reorderable, so a trial's title\n * bar can be the drag surface. Null when reordering is off. */\nexport const TrialDragContext = createContext<{ nodeId: NodeId } | null>(null);\n\nexport function useTrialDrag(): { nodeId: NodeId } | null {\n return useContext(TrialDragContext);\n}\n","import type { ReactNode } from 'react';\nimport type { NodeId } from 'windease';\nimport { useDragHandle } from 'windease/react';\nimport { useTrialDrag } from './TrialDragContext';\n\n/** Props for `<TrialTitleBar>`. */\nexport interface TrialTitleBarProps {\n title: string;\n /** Rendered at the leading edge, before the title. */\n lead?: ReactNode;\n children?: ReactNode;\n}\n\n// `useDragHandle` needs a node id and windease's DragProvider, so the draggable\n// form is a separate component rather than a conditional hook.\nfunction Draggable({ nodeId, title, lead, children }: TrialTitleBarProps & { nodeId: NodeId }) {\n const handlers = useDragHandle(nodeId);\n return (\n <div className=\"lk-trial__titlebar lk-trial__titlebar--draggable\" {...handlers}>\n {lead}\n <span className=\"lk-trial__title\">{title}</span>\n {children}\n </div>\n );\n}\n\n/** A trial's title bar. When the workspace allows reordering the whole bar is\n * the drag surface — there is no separate grip, because a window's title bar\n * is already the thing you expect to drag. */\nexport function TrialTitleBar({ title, lead, children }: TrialTitleBarProps) {\n const drag = useTrialDrag();\n if (drag)\n return (\n <Draggable nodeId={drag.nodeId} title={title} lead={lead}>\n {children}\n </Draggable>\n );\n return (\n <div className=\"lk-trial__titlebar\">\n {lead}\n <span className=\"lk-trial__title\">{title}</span>\n {children}\n </div>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Where an undocked panel's DOM lives. The panel's *content* stays owned by\n * its trial — it is React-portalled into the host — so a torn-out section\n * keeps the trial's context, state and subscriptions instead of being rebuilt\n * as a sibling of the trial it came from. */\nexport interface PanelHostRegistry {\n set: (key: string, el: HTMLElement | null) => void;\n get: (key: string) => HTMLElement | null;\n subscribe: (fn: () => void) => () => void;\n}\n\nexport function createPanelHostRegistry(): PanelHostRegistry {\n const hosts = new Map<string, HTMLElement>();\n const listeners = new Set<() => void>();\n const notify = () => {\n for (const fn of listeners) fn();\n };\n return {\n set: (key, el) => {\n if (el) hosts.set(key, el);\n else hosts.delete(key);\n notify();\n },\n get: (key) => hosts.get(key) ?? null,\n subscribe: (fn) => {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n };\n}\n\nexport const PanelHostContext = createContext<PanelHostRegistry | null>(null);\n\nexport function usePanelHosts(): PanelHostRegistry | null {\n return useContext(PanelHostContext);\n}\n","import { useSyncExternalStore } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { SidebarSection, TrialContribution } from '../chrome/types';\nimport { usePanelHosts } from '../lab/panelHost';\nimport { panelKey } from '../state/undock';\n\n/** Props for `<UndockedSections>`. */\nexport interface UndockedSectionsProps {\n trialId: string;\n /** The trial's sidebar contributions that are currently torn out. */\n sections: readonly TrialContribution[];\n onDock: (sectionId: string) => void;\n}\n\nfunction Portalled({\n trialId,\n contribution,\n onDock,\n}: {\n trialId: string;\n contribution: TrialContribution;\n onDock: (sectionId: string) => void;\n}) {\n const hosts = usePanelHosts();\n const key = panelKey(trialId, contribution.id);\n const host = useSyncExternalStore(\n (fn) => hosts?.subscribe(fn) ?? (() => {}),\n () => hosts?.get(key) ?? null,\n () => null,\n );\n if (!host || !contribution.item) return null;\n const item = contribution.item as SidebarSection;\n return createPortal(\n <>\n <div className=\"lk-panel-tile__titlebar\">\n <span className=\"lk-panel-tile__title\">{item.title}</span>\n <button\n type=\"button\"\n className=\"lk-panel-tile__dock\"\n aria-label={`Dock ${item.title}`}\n title={`Dock ${item.title}`}\n onClick={() => onDock(contribution.id)}\n >\n ⇤\n </button>\n </div>\n {item.body}\n </>,\n host,\n );\n}\n\n/** Renders a torn-out section's body into the workspace panel holding it. The\n * body stays mounted in the trial's React tree — only its DOM moves — so it\n * keeps the trial's context and its own state across an undock. */\nexport function UndockedSections({ trialId, sections, onDock }: UndockedSectionsProps) {\n if (sections.length === 0) return null;\n return (\n <>\n {sections.map((c) => (\n <Portalled key={c.id} trialId={trialId} contribution={c} onDock={onDock} />\n ))}\n </>\n );\n}\n","import { type KeyboardEvent, type ReactNode, useContext, useMemo } from 'react';\nimport { useStore } from 'zustand/react';\nimport { builtinContributions } from '../chrome/builtins';\nimport { mergeContributions, suppressContributions } from '../chrome/merge';\nimport { PaletteRegion } from '../chrome/regions/PaletteRegion';\nimport { SidebarRegion } from '../chrome/regions/SidebarRegion';\nimport { StatusRegion } from '../chrome/regions/StatusRegion';\nimport { TitleBarRegion } from '../chrome/regions/TitleBarRegion';\nimport { ToolbarRegion } from '../chrome/regions/ToolbarRegion';\nimport { ViewportRegion } from '../chrome/regions/ViewportRegion';\nimport type { TrialChromeContext, TrialContribution, TrialRegion } from '../chrome/types';\nimport { hasConfigPath, schemaNodeAtPath, withValueAtPath } from '../config/path';\nimport { useConfigSchema } from '../config/useConfigSchema';\nimport type { Instrument } from '../instrument/types';\nimport type { JobHandle } from '../job/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { JobProgress } from '../primitives/JobProgress';\nimport { LabStoreContext } from '../state/context';\nimport type { TrialRecord } from '../state/types';\nimport { as2DView } from '../state/view';\nimport { TrialBody } from './TrialBody';\nimport { TrialTitleBar } from './TrialTitleBar';\nimport { UndockedSections } from './UndockedSections';\n\n/** The trial's loupe as its chrome sees it: a switch and its position. */\nexport interface LoupeBindings {\n on: boolean;\n toggle: () => void;\n}\n\nexport interface UndoBindings {\n canUndo: boolean;\n canRedo: boolean;\n undo: () => void;\n redo: () => void;\n}\n\n/** Props for `<TrialChrome>`. */\nexport interface TrialChromeProps {\n trialId: string;\n record: TrialRecord;\n instrument: Instrument;\n isLastTrial: boolean;\n undoBindings?: UndoBindings;\n /** Supplied when the instrument declares a `job`. */\n job?: JobHandle;\n /** Supplied when the instrument declares a `loupe`. The lens itself is the\n * trial's to mount; the chrome only offers the switch. */\n loupe?: LoupeBindings;\n /** Contributions the trial runtime itself adds — the drag palette and the\n * layer list, which depend on runtime state the instrument cannot reach. */\n trialChrome?: readonly TrialContribution[];\n /** Contributions from the lab, merged last. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n /** The trial's resolved tool slot, and the setter that writes whichever\n * slot it resolved to. `Trial` owns the resolution. */\n activeToolId?: string | null;\n setActiveTool?: (id: string) => void;\n children: ReactNode;\n}\n\nconst NO_OP = (): void => {};\n\n/** One frozen empty map, so a trial that has folded nothing keeps a stable\n * context identity across renders. */\nconst NO_SECTIONS: Readonly<Record<string, boolean>> = Object.freeze({});\n\n/** The frame around a running instrument. Builds one chrome context, assembles\n * the contributions the instrument, the runtime and the lab declare, and hands\n * each region its slice. */\nexport function TrialChrome({\n trialId,\n record,\n instrument,\n isLastTrial,\n undoBindings,\n job,\n loupe,\n trialChrome,\n chrome,\n suppress,\n activeToolId = null,\n setActiveTool = NO_OP,\n children,\n}: TrialChromeProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] TrialChrome requires <LabStoreProvider>');\n const updateTrialView = useStore(storeCtx.store, (s) => s.updateTrialView);\n const updateTrialSidebarWidth = useStore(storeCtx.store, (s) => s.updateTrialSidebarWidth);\n const setTrialTitle = useStore(storeCtx.store, (s) => s.setTrialTitle);\n const setTrialSectionCollapsed = useStore(storeCtx.store, (s) => s.setTrialSectionCollapsed);\n const updateTrialConfig = useStore(storeCtx.store, (s) => s.updateTrialConfig);\n const updateTrialState = useStore(storeCtx.store, (s) => s.updateTrialState);\n const undockPanelAction = useStore(storeCtx.store, (s) => s.undockPanel);\n const dockPanelAction = useStore(storeCtx.store, (s) => s.dockPanel);\n const undockedPanels = useStore(storeCtx.store, (s) => s.undockedPanels);\n const undockedIds = useMemo(\n () =>\n Object.values(undockedPanels)\n .filter((p) => p.trialId === trialId)\n .map((p) => p.sectionId),\n [undockedPanels, trialId],\n );\n\n // The trial view is opaque to labkit, so the zoom chrome asks for the 2D shape\n // and goes inert when the trial holds something else — an orbit, say.\n const view2d = as2DView(record.view);\n\n const configSchema = useConfigSchema(instrument);\n\n const title = record.title ?? record.instrumentName;\n const collapsedSections = record.collapsedSections ?? NO_SECTIONS;\n\n const ctx = useMemo<TrialChromeContext>(() => {\n const setZoom = (z: number): void => {\n if (!view2d) return;\n updateTrialView(trialId, { ...view2d, zoom: z });\n };\n return {\n trialId,\n instrumentName: record.instrumentName,\n title,\n setTitle: (next) => setTrialTitle(trialId, next),\n isLastTrial,\n zoom: view2d ? view2d.zoom : null,\n setZoom,\n canUndo: undoBindings?.canUndo ?? false,\n canRedo: undoBindings?.canRedo ?? false,\n undo: undoBindings?.undo ?? NO_OP,\n redo: undoBindings?.redo ?? NO_OP,\n loupeOn: loupe?.on ?? false,\n toggleLoupe: loupe?.toggle ?? NO_OP,\n configSchema,\n configFields: instrument.config ? [] : (instrument.configSchema?.() ?? []),\n config: record.config,\n setConfig: (path, value) => {\n const prevConfig = record.config as Record<string, unknown>;\n if (\n process.env.NODE_ENV !== 'production' &&\n !hasConfigPath(prevConfig, path) &&\n schemaNodeAtPath(configSchema.group, path) === undefined\n ) {\n console.warn(\n `[labkit] setConfig: unknown path \"${path}\" for instrument \"${record.instrumentName}\"`,\n );\n }\n updateTrialConfig(trialId, path, value);\n if (instrument.onConfigChange) {\n const nextConfig = withValueAtPath(prevConfig, path, value);\n const nextState = instrument.onConfigChange(nextConfig, prevConfig, record.state);\n updateTrialState(trialId, nextState as never);\n }\n },\n collapsedSections,\n setSectionCollapsed: (key, collapsed) => setTrialSectionCollapsed(trialId, key, collapsed),\n undockedPanels: undockedIds,\n undockPanel: (sectionId, as) => undockPanelAction(trialId, sectionId, as),\n dockPanel: (sectionId) => dockPanelAction(trialId, sectionId),\n savedSnapshots: lab.savedSnapshots.filter((s) => s.trialId === trialId),\n saveSnapshot: (name) => lab.saveSnapshot(trialId, name),\n loadSnapshot: (snapshotId) => lab.loadSnapshot(trialId, snapshotId),\n clone: () => lab.cloneTrial(trialId),\n reset: () => lab.resetTrial(trialId),\n close: () => lab.closeTrial(trialId),\n activeToolId,\n setActiveTool,\n };\n }, [\n trialId,\n record,\n instrument,\n lab,\n title,\n isLastTrial,\n updateTrialView,\n updateTrialConfig,\n updateTrialState,\n undoBindings,\n loupe,\n view2d,\n activeToolId,\n setActiveTool,\n configSchema,\n undockedIds,\n undockPanelAction,\n dockPanelAction,\n setTrialTitle,\n setTrialSectionCollapsed,\n collapsedSections,\n ]);\n\n const contributions = useMemo(\n () =>\n suppressContributions(\n mergeContributions(\n builtinContributions(instrument, ctx, lab.controls),\n [...(instrument.chrome ?? [])],\n [...(trialChrome ?? [])],\n [...(chrome ?? [])],\n ),\n suppress ?? [],\n ),\n [instrument, ctx, trialChrome, chrome, suppress, lab.controls],\n );\n\n const inRegion = (region: TrialRegion): TrialContribution[] =>\n contributions.filter((c) => c.region === region);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLElement>): void => {\n const mod = e.metaKey || e.ctrlKey;\n if (!mod) return;\n if (e.key === 'z' || e.key === 'Z') {\n e.preventDefault();\n if (e.shiftKey) ctx.redo();\n else ctx.undo();\n } else if (e.key === 's' || e.key === 'S') {\n e.preventDefault();\n ctx.saveSnapshot();\n }\n };\n\n return (\n <section\n className=\"lk-trial\"\n aria-label={`Trial ${title}`}\n tabIndex={-1}\n onKeyDown={handleKeyDown}\n >\n <TrialTitleBar\n title={title}\n lead={<TitleBarRegion placement=\"lead\" contributions={inRegion('titlebar')} ctx={ctx} />}\n >\n <TitleBarRegion contributions={inRegion('titlebar')} ctx={ctx} />\n </TrialTitleBar>\n <div className=\"lk-trial__toolbar\">\n <ToolbarRegion contributions={inRegion('toolbar')} ctx={ctx} />\n </div>\n <div className=\"lk-trial__body\">\n <PaletteRegion contributions={inRegion('palette')} ctx={ctx} />\n <TrialBody\n width={record.sidebarWidth}\n onWidthChange={(w) => updateTrialSidebarWidth(trialId, w)}\n contentClassName={instrument.canvas ? 'lk-trial__content--flush' : undefined}\n sidebar={\n <>\n <SidebarRegion contributions={inRegion('sidebar')} ctx={ctx} />\n <UndockedSections\n trialId={trialId}\n sections={inRegion('sidebar').filter((c) => undockedIds.includes(c.id))}\n onDock={ctx.dockPanel}\n />\n </>\n }\n >\n {children}\n <ViewportRegion contributions={inRegion('viewport')} ctx={ctx} />\n </TrialBody>\n </div>\n <div className=\"lk-trial__status\">\n {job ? <JobProgress job={job} /> : null}\n <StatusRegion contributions={inRegion('status')} ctx={ctx} />\n </div>\n </section>\n );\n}\n","import { type ReactNode, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from 'zustand/react';\nimport { AnnotationsContext } from '../annotations/AnnotationsContext';\nimport { AnnotationTargets } from '../annotations/AnnotationTargets';\nimport { annotationsFromJSON } from '../annotations/store';\nimport type { AnnotationTargetInfo } from '../annotations/types';\nimport { CanvasStack } from '../canvas/CanvasStack';\nimport type { CanvasLayerDescriptor } from '../canvas/useLayerScheduler';\nimport { applyCamera, type ViewportSize } from '../canvas/worldSpec';\nimport type { TrialContribution } from '../chrome/types';\nimport { DragOverlay, useDragDrop } from '../dragdrop/DragDropRuntime';\nimport { Palette } from '../dragdrop/Palette';\nimport type { Instrument, LayerDescriptor, PaletteItem, RenderContext } from '../instrument/types';\nimport { useJob } from '../job/useJob';\nimport { useLabContext } from '../lab/LabContext';\nimport { LayerList } from '../layers/LayerList';\nimport { TrialLoupe } from '../loupe/TrialLoupe';\nimport { resolveLoupe } from '../loupe/types';\nimport { LabStoreContext, TrialIdProvider } from '../state/context';\nimport type { LabStore } from '../state/store';\nimport type { TrialRecord } from '../state/types';\nimport { as2DView, DEFAULT_VIEW } from '../state/view';\nimport { createEventBus, type EventBus } from '../undo/eventBus';\nimport { pushSnapshot, redo as undoRedo, undo as undoUndo } from '../undo/undoStack';\nimport type { LoupeBindings, UndoBindings } from './TrialChrome';\nimport { TrialChrome } from './TrialChrome';\n\n/** Props for `<Trial>`. */\nexport interface TrialProps {\n id: string;\n /** Contributions the lab adds to this trial's chrome, merged after the\n * instrument's own. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n}\n\n/** Renders one trial from the lab store: looks up its record and\n * instrument, and mounts the instrument inside the trial chrome. */\nexport function Trial({ id, chrome, suppress }: TrialProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] <Trial> requires <LabStoreProvider>');\n const record = useStore(storeCtx.store, (s) => s.trials.find((w) => w.id === id));\n if (!record) {\n return <div className=\"lk-trial lk-trial--unknown\">Trial not found: {id}</div>;\n }\n const instrument = lab.instruments.find((i) => i.name === record.instrumentName);\n if (!instrument) {\n return (\n <div className=\"lk-trial lk-trial--unknown\">Unknown instrument: {record.instrumentName}</div>\n );\n }\n return (\n <TrialRuntime\n record={record}\n instrument={instrument}\n store={storeCtx.store}\n isLast={lab.trials.length <= 1}\n chrome={chrome}\n suppress={suppress}\n />\n );\n}\n\ninterface TrialRuntimeProps {\n record: TrialRecord;\n instrument: Instrument;\n store: LabStore;\n isLast: boolean;\n chrome?: readonly TrialContribution[];\n suppress?: readonly string[];\n}\n\nfunction TrialRuntime({ record, instrument, store, isLast, chrome, suppress }: TrialRuntimeProps) {\n const canvasContainerRef = useRef<HTMLDivElement | null>(null);\n const loupeHostRef = useRef<HTMLDivElement | null>(null);\n const updateTrialState = useStore(store, (s) => s.updateTrialState);\n const updateTrialConfig = useStore(store, (s) => s.updateTrialConfig);\n const updateTrialView = useStore(store, (s) => s.updateTrialView);\n const updateTrialUndoStack = useStore(store, (s) => s.updateTrialUndoStack);\n const updateTrialAnnotations = useStore(store, (s) => s.updateTrialAnnotations);\n const labToolId = useStore(store, (s) => s.activeToolId);\n const setLabTool = useStore(store, (s) => s.setLabTool);\n const setTrialTool = useStore(store, (s) => s.setTrialTool);\n\n const busRef = useRef<EventBus | null>(null);\n if (busRef.current === null) busRef.current = createEventBus();\n const bus = busRef.current;\n\n const [layerVisibility, setLayerVisibility] = useState<Record<string, boolean>>({});\n const [layerOrder, setLayerOrder] = useState<string[] | null>(null);\n const [loupeOn, setLoupeOn] = useState(false);\n\n const visibleLayers = useMemo(\n () =>\n (instrument.canvas?.layers ?? [])\n .filter((l) => layerVisibility[l.id] !== false)\n .map((l) => l.id),\n [instrument.canvas, layerVisibility],\n );\n\n const undoCap = instrument.undo;\n const undoEvents = useMemo(() => new Set(undoCap?.snapshotOn ?? ['state.change']), [undoCap]);\n const maxDepth = undoCap?.maxDepth ?? 50;\n\n const snapshotIfNeeded = (event: string): void => {\n if (!undoCap || !undoEvents.has(event)) return;\n const current = store.getState().trials.find((w) => w.id === record.id);\n if (!current) return;\n const snap = structuredClone(current.state);\n updateTrialUndoStack(record.id, (prev) => pushSnapshot(prev, snap, maxDepth));\n };\n\n const setView = (v: unknown): void => updateTrialView(record.id, v);\n\n // A function `initialView` needs the canvas size, so `trialOps` leaves the\n // view null and the first measurement resolves it. Reset nulls it again,\n // which re-frames — so the guard is the null itself, not a \"have I run\" flag.\n const placeView = (size: ViewportSize): void => {\n const declared = instrument.canvas?.initialView;\n if (typeof declared !== 'function') return;\n if (record.view != null) return;\n setView(declared(size));\n };\n\n // The capability's own `targets` thunk, re-read on every call: a target\n // resizing or gaining a dependency must not need the store rebuilt. Held in\n // a ref because the store is built once and closes over it.\n const annotationsCap = instrument.annotations;\n const targetsRef = useRef<() => readonly AnnotationTargetInfo[]>(() => []);\n targetsRef.current = () =>\n annotationsCap\n ? annotationsCap.targets(record.state, record.config, { id: record.id, view: record.view })\n : [];\n\n // One store for the trial's lifetime. Marks do not survive a reload yet —\n // the storage slot is 3d.\n const annotationsRef = useRef<ReturnType<typeof annotationsFromJSON> | null>(null);\n // Read through refs for the same reason `targets` is: the store is built\n // once, and an export must draw against the config the trial holds now.\n const configRef = useRef<unknown>(record.config);\n configRef.current = record.config;\n if (annotationsRef.current === null) {\n // Seeded from wherever the marks were kept: the instrument's own store if\n // it declared one, else this trial's slot.\n const kept = annotationsCap?.storage ? annotationsCap.storage.load() : record.annotations;\n annotationsRef.current = annotationsFromJSON(kept, () => targetsRef.current(), {\n meaning: annotationsCap?.meaning,\n config: () => configRef.current,\n onCapture: (result) => annotationsCap?.onCapture?.(result),\n });\n }\n const annotations = annotationsRef.current;\n\n // Written on a trailing debounce rather than per notification: a scene\n // mutates every frame of a drag, and a zustand write per frame re-renders\n // every trial in the lab. The unmount flush is not an optimization — the\n // last mark before a trial closes is otherwise lost.\n const saveCap = annotationsCap?.storage;\n const saveRef = useRef<(doc: unknown) => void>(() => {});\n saveRef.current = (doc) => {\n if (saveCap) saveCap.save(doc as never);\n else updateTrialAnnotations(record.id, doc);\n };\n // Only when the pair flips, which is rare: bumping React state on every\n // scene notification would re-render the trial on every frame of a drag,\n // which is the thing the debounce below exists to avoid.\n const [markMoves, setMarkMoves] = useState({ undo: false, redo: false });\n useEffect(() => {\n if (!annotationsCap) return;\n const read = (): void => {\n const next = { undo: annotations.canUndo(), redo: annotations.canRedo() };\n setMarkMoves((prev) => (prev.undo === next.undo && prev.redo === next.redo ? prev : next));\n };\n read();\n return annotations.subscribe(read);\n }, [annotations, annotationsCap]);\n\n useEffect(() => {\n if (!annotationsCap) return;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let dirty = false;\n const flush = (): void => {\n if (!dirty) return;\n dirty = false;\n saveRef.current(annotations.toJSON());\n };\n const off = annotations.subscribe(() => {\n dirty = true;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n flush();\n }, 250);\n });\n return () => {\n off();\n if (timer) clearTimeout(timer);\n flush();\n };\n }, [annotations, annotationsCap]);\n\n // A trial gets its own slot when its instrument declares tools; otherwise it\n // reads the lab's. Which slot a change writes follows from the same thing.\n // Annotation tools are a trial's own for the same reason: two trials\n // annotating different pictures must not share one active tool.\n const declaresTools = instrument.tools != null || instrument.annotations != null;\n const resolvedToolId = declaresTools\n ? (record.activeToolId ??\n instrument.tools?.initial ??\n instrument.tools?.tools[0]?.id ??\n (instrument.annotations ? 'select' : null))\n : labToolId;\n const setActiveTool = (id: string): void => {\n if (declaresTools) setTrialTool(record.id, id);\n else setLabTool(id);\n };\n\n // `CanvasStack` and the zoom controls are 2D; a trial holding another view shape\n // gets the default here and simply never renders them.\n const view2d = as2DView(record.view);\n\n const jobCap = instrument.job;\n // Hooks cannot be conditional, so a trial without the capability still calls\n // this — with a runner that yields nothing and is never started.\n const job = useJob({\n capability: jobCap ?? { run: async function* () {}, onItem: (_i, st) => st },\n config: record.config,\n state: record.state,\n setState: (next) => updateTrialState(record.id, next as never),\n });\n\n const renderCtx: RenderContext<unknown, unknown> = {\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('state.change');\n updateTrialState(record.id, next);\n bus.emit('state.change');\n },\n setConfig: (path, value) => {\n const evt = `config.change:${path}`;\n snapshotIfNeeded('config.change');\n snapshotIfNeeded(evt);\n updateTrialConfig(record.id, path, value);\n bus.emit('config.change');\n bus.emit(evt);\n },\n trial: {\n id: record.id,\n view: record.view,\n setView,\n zoom: view2d?.zoom ?? 1,\n setZoom: (z) => {\n if (!view2d) return;\n updateTrialView(record.id, { ...view2d, zoom: z });\n },\n activeToolId: resolvedToolId,\n visibleLayers,\n },\n emit: (event) => {\n snapshotIfNeeded(event);\n bus.emit(event);\n },\n job: jobCap ? job : undefined,\n };\n\n // Marks are undone through weasel history, not through labkit's snapshot\n // stack — the spec's rule, and the reason a mark scene is the truth. A trial\n // declaring both takes the marks first: the most recent thing the user did\n // is what undo is for, and only a mark change moves the mark history.\n const undoState = () => {\n const result = undoUndo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateTrialState(record.id, result.snapshot as never);\n updateTrialUndoStack(record.id, result.stack);\n };\n const redoState = () => {\n const result = undoRedo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateTrialState(record.id, result.snapshot as never);\n updateTrialUndoStack(record.id, result.stack);\n };\n\n const undoBindings: UndoBindings | undefined =\n undoCap || annotationsCap\n ? {\n canUndo: markMoves.undo || (undoCap ? record.undoStack.past.length > 0 : false),\n canRedo: markMoves.redo || (undoCap ? record.undoStack.future.length > 0 : false),\n undo: () => {\n if (annotationsCap && annotations.undo()) return;\n if (undoCap) undoState();\n },\n redo: () => {\n if (annotationsCap && annotations.redo()) return;\n if (undoCap) redoState();\n },\n }\n : undefined;\n\n const loupeCap = useMemo(() => {\n const declared = instrument.loupe;\n if (declared == null) return null;\n return resolveLoupe(typeof declared === 'function' ? declared(record.config) : declared);\n }, [instrument.loupe, record.config]);\n const loupeBindings: LoupeBindings | undefined = loupeCap\n ? { on: loupeOn, toggle: () => setLoupeOn((v) => !v) }\n : undefined;\n\n const canvasLayers: CanvasLayerDescriptor[] = useMemo(() => {\n if (!instrument.canvas) return [];\n const baseLayers = instrument.canvas.layers;\n const ordered = layerOrder\n ? [...baseLayers].sort((a, b) => layerOrder.indexOf(a.id) - layerOrder.indexOf(b.id))\n : baseLayers;\n return ordered.map((layer) => ({\n id: layer.id,\n visible: layerVisibility[layer.id] !== false,\n render: (ctx, view, frame) => {\n // Camera applied here, so a layer draws in world coordinates. `zoom`\n // stays in the args for line widths, which must not scale with it.\n applyCamera(ctx, view, frame);\n layer.draw(ctx, { state: record.state, config: record.config, zoom: view.zoom });\n },\n }));\n }, [instrument.canvas, record.state, record.config, layerVisibility, layerOrder]);\n\n const layerDescriptors: LayerDescriptor[] = useMemo(() => {\n if (!instrument.layers) return [];\n return instrument.layers.ids.map((l) => (typeof l === 'string' ? { id: l, label: l } : l));\n }, [instrument.layers]);\n\n const dragDropResult = useDragDrop({\n capability: instrument.dragDrop ?? { palette: [], onDrop: (_p, _i, s) => s },\n canvasContainerRef,\n view: view2d ?? DEFAULT_VIEW,\n worldSpec: instrument.canvas?.worldSpec,\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('canvas.itemAdded');\n updateTrialState(record.id, next as never);\n },\n emit: (evt) => {\n snapshotIfNeeded(evt);\n bus.emit(evt);\n },\n });\n\n const paletteItems: PaletteItem[] = useMemo(() => {\n if (!instrument.dragDrop) return [];\n const p = instrument.dragDrop.palette;\n return typeof p === 'function' ? p(record.state, record.config) : p;\n }, [instrument.dragDrop, record.state, record.config]);\n\n const layersWithFeedback: CanvasLayerDescriptor[] = useMemo(() => {\n if (!dragDropResult.drag?.feedback) return canvasLayers;\n const fb = dragDropResult.drag.feedback;\n const screen = dragDropResult.drag.screenPos;\n return [\n ...canvasLayers,\n {\n id: '__lk_drag_feedback',\n visible: true,\n render: (ctx) => {\n const el = canvasContainerRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n ctx.save();\n ctx.strokeStyle = fb.ok ? '#3a7' : '#c44';\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.arc(screen.x - r.left, screen.y - r.top, 16, 0, Math.PI * 2);\n ctx.stroke();\n ctx.restore();\n },\n },\n ];\n }, [canvasLayers, dragDropResult.drag]);\n\n // The lens tracks the pointer over whatever box holds the content: the canvas\n // stack's own element, which it takes from context, or the wrapper below.\n const lens = loupeCap ? (\n <TrialLoupe\n capability={loupeCap}\n enabled={loupeOn}\n state={record.state}\n config={record.config}\n view={view2d ?? DEFAULT_VIEW}\n worldSpec={instrument.canvas?.worldSpec}\n hostRef={loupeHostRef}\n />\n ) : null;\n\n let body: ReactNode;\n if (instrument.canvas) {\n body = (\n <div ref={canvasContainerRef} className=\"lk-trial__canvas-host\">\n <CanvasStack\n layers={layersWithFeedback}\n view={view2d ?? DEFAULT_VIEW}\n onViewChange={setView}\n worldSpec={instrument.canvas.worldSpec}\n onResize={placeView}\n minZoom={instrument.canvas.minZoom}\n maxZoom={instrument.canvas.maxZoom}\n >\n {instrument.render(renderCtx)}\n {lens}\n </CanvasStack>\n <DragOverlay drag={dragDropResult.drag} />\n </div>\n );\n } else if (lens) {\n body = (\n <div ref={loupeHostRef} className=\"lk-trial__loupe-host\">\n {instrument.render(renderCtx)}\n {lens}\n </div>\n );\n } else {\n body = instrument.render(renderCtx);\n }\n\n const startDrag = dragDropResult.startDrag;\n const paletteNode = useMemo(\n () =>\n paletteItems.length > 0 ? <Palette items={paletteItems} onDragStart={startDrag} /> : null,\n [paletteItems, startDrag],\n );\n\n const layerListNode = useMemo(\n () =>\n instrument.layers && layerDescriptors.length > 0 ? (\n <LayerList\n layers={layerDescriptors}\n visibility={layerVisibility}\n onReorder={(next) => {\n setLayerOrder(next.map((l) => l.id));\n bus.emit('layers.reorder');\n }}\n onToggle={(lid, visible) => {\n setLayerVisibility((prev) => ({ ...prev, [lid]: visible }));\n bus.emit('layers.toggle');\n }}\n />\n ) : null,\n [instrument.layers, layerDescriptors, layerVisibility, bus],\n );\n\n const extraChrome = useMemo<TrialContribution[]>(() => {\n const out: TrialContribution[] = [];\n if (paletteNode) {\n out.push({\n id: 'dragdrop-palette',\n region: 'sidebar',\n item: { title: 'Parts', body: paletteNode },\n });\n }\n if (layerListNode) {\n out.push({\n id: 'layer-list',\n region: 'sidebar',\n item: { title: 'Layers', body: layerListNode },\n });\n }\n return out;\n }, [paletteNode, layerListNode]);\n\n // Rendered beside the body rather than inside it: an overlay portals itself\n // into the surface container, so where it sits in this tree decides only\n // when its effects run — after the instrument's refs have attached.\n const annotationOverlays = annotationsCap ? (\n <AnnotationTargets\n capability={annotationsCap}\n state={record.state}\n config={record.config}\n trial={{ id: record.id, view: record.view }}\n annotations={annotations}\n activeToolId={resolvedToolId}\n />\n ) : null;\n\n return (\n <TrialIdProvider trialId={record.id}>\n <AnnotationsContext.Provider value={annotationsCap ? annotations : null}>\n <TrialChrome\n job={jobCap ? job : undefined}\n loupe={loupeBindings}\n trialId={record.id}\n record={record}\n instrument={instrument}\n isLastTrial={isLast}\n undoBindings={undoBindings}\n trialChrome={extraChrome}\n chrome={chrome}\n suppress={suppress}\n activeToolId={resolvedToolId}\n setActiveTool={setActiveTool}\n >\n {body}\n {annotationOverlays}\n </TrialChrome>\n </AnnotationsContext.Provider>\n </TrialIdProvider>\n );\n}\n","import { fillConfigDefaults } from '../config/path';\nimport type { Instrument, InstrumentList } from '../instrument/types';\nimport type { TrialRecord } from '../state/types';\n\nconst DEFAULT_VIEW = { zoom: 1, pan: { x: 0, y: 0 } } as const;\n\nfunction findInstrument(instruments: InstrumentList, name: string): Instrument {\n const found = instruments.find((i) => i.name === name);\n if (!found) {\n throw new Error(`[labkit] Unknown instrument: \"${name}\"`);\n }\n return found;\n}\n\nfunction initialView(instrument: Instrument): TrialRecord['view'] {\n const declared = instrument.canvas?.initialView;\n // A function needs the canvas size, which no trial has at creation. `null`\n // is the unplaced marker; `Trial` resolves it on the first non-empty size.\n if (typeof declared === 'function') return null;\n return declared ? structuredClone(declared) : { ...DEFAULT_VIEW, pan: { ...DEFAULT_VIEW.pan } };\n}\n\n/** What a trial opens on beyond its instrument's own defaults. */\nexport interface AddTrialOptions<TC = Record<string, unknown>> {\n /** Overlaid on `defaultConfig()` before `initialState` reads it, so a trial\n * opened on a subject is running that subject from its first frame. Keys\n * whose value is `undefined` are left to the default. */\n config?: Partial<TC>;\n}\n\n/** `defaultConfig()` with `seed` written over it, down the tree: a seed naming\n * one leaf of a group leaves that group's other leaves at their defaults. */\nfunction seedConfig<TC>(defaults: TC, seed: Partial<TC> | undefined): TC {\n return seed ? fillConfigDefaults(seed, defaults) : defaults;\n}\n\n/** Append a new trial running `instrumentName`, at that instrument's default\n * config — with `options.config` written over it — and the initial state\n * that config produces. */\nexport function addTrial(\n trials: TrialRecord[],\n instruments: InstrumentList,\n instrumentName: string,\n options: AddTrialOptions = {},\n): TrialRecord[] {\n const instrument = findInstrument(instruments, instrumentName);\n const config = seedConfig(instrument.defaultConfig(), options.config);\n const state = instrument.initialState(config);\n const record: TrialRecord = {\n id: crypto.randomUUID(),\n instrumentName,\n config,\n state,\n view: initialView(instrument),\n undoStack: { past: [], future: [] },\n };\n if (options.config) record.configSeed = options.config;\n return [...trials, record];\n}\n\n/** Insert a deep copy of a trial directly after it. The copy starts with\n * an empty undo history — the original's is not shared. */\nexport function cloneTrial(trials: TrialRecord[], id: string): TrialRecord[] {\n const sourceIdx = trials.findIndex((w) => w.id === id);\n const source = trials[sourceIdx];\n if (!source) return trials;\n const clone: TrialRecord = {\n ...source,\n id: crypto.randomUUID(),\n config: structuredClone(source.config),\n state: structuredClone(source.state),\n view: structuredClone(source.view),\n undoStack: { past: [], future: [] },\n };\n return [...trials.slice(0, sourceIdx + 1), clone, ...trials.slice(sourceIdx + 1)];\n}\n\n/** Remove a trial, unless it is the last one — a lab always has at least\n * one. */\nexport function closeTrial(trials: TrialRecord[], id: string): TrialRecord[] {\n if (trials.length <= 1) return trials;\n const next = trials.filter((w) => w.id !== id);\n return next.length === trials.length ? trials : next;\n}\n\n/** Return a trial to what it opened on — its instrument's defaults under the\n * seed `addTrial` was given — keeping its id and its place in the list. */\nexport function resetTrial(\n trials: TrialRecord[],\n id: string,\n instruments: InstrumentList,\n): TrialRecord[] {\n const idx = trials.findIndex((w) => w.id === id);\n const current = trials[idx];\n if (!current) return trials;\n const instrument = findInstrument(instruments, current.instrumentName);\n const config = seedConfig(instrument.defaultConfig(), current.configSeed);\n const state = instrument.initialState(config);\n const reset: TrialRecord = {\n ...current,\n config,\n state,\n view: initialView(instrument),\n };\n return [...trials.slice(0, idx), reset, ...trials.slice(idx + 1)];\n}\n\n/**\n * Reorder to match `ids`. Ids the list doesn't mention keep their relative\n * order at the end, and ids it names that no longer exist are dropped — a\n * reorder that raced a close should not resurrect the closed trial.\n */\nexport function reorderTrials(trials: TrialRecord[], ids: readonly string[]): TrialRecord[] {\n const byId = new Map(trials.map((w) => [w.id, w]));\n const named = ids.map((id) => byId.get(id)).filter((w): w is TrialRecord => w !== undefined);\n const seen = new Set(named.map((w) => w.id));\n const rest = trials.filter((w) => !seen.has(w.id));\n return [...named, ...rest];\n}\n","import { AddIcon, ModeAutoIcon, ModeDarkIcon, ModeLightIcon } from '@weasel-js/ui';\nimport { Select, ToggleBar } from '../passthrough/weasel-ui';\nimport type { LabMode } from '../state/types';\nimport { useLabContext } from './LabContext';\n\n// The glyph is the segment's content and the word is its accessible name, so\n// the bar stays a three-way radiogroup announcing Auto / Light / Dark.\nconst MODES = [\n { value: 'auto' as LabMode, label: 'Auto', glyph: <ModeAutoIcon size={14} /> },\n { value: 'light' as LabMode, label: 'Light', glyph: <ModeLightIcon size={14} /> },\n { value: 'dark' as LabMode, label: 'Dark', glyph: <ModeDarkIcon size={14} /> },\n];\n\nconst MODE_ITEMS = MODES.map(({ value, label, glyph }) => ({\n value,\n label: glyph,\n ariaLabel: label,\n}));\n\n/** The controls `<Lab>` puts in its header: add a trial, and choose the color\n * mode. Both drive `LabContext`, which carried them with no UI at all — so\n * every consumer rebuilt these two. Rendered before a consumer's own header\n * content, which still lands beside them. */\nexport function LabHeader() {\n const lab = useLabContext();\n const only = lab.instruments.length === 1 ? lab.instruments[0] : null;\n\n return (\n <>\n {only ? (\n <button\n type=\"button\"\n className=\"lk-lab-header__add\"\n onClick={() => lab.addTrial(only.name)}\n >\n <AddIcon size={16} />\n <span>Add trial</span>\n </button>\n ) : (\n // Held at null so the control stays an \"add one\" action rather than\n // reading as the current instrument.\n <Select\n className=\"lk-lab-header__add-select\"\n aria-label=\"Add trial\"\n placeholder=\"Add trial…\"\n selectedKey={null}\n options={lab.instruments.map((i) => ({ value: i.name, label: i.name }))}\n onSelectionChange={(name) => {\n if (name != null) lab.addTrial(String(name));\n }}\n />\n )}\n\n <ToggleBar\n className=\"lk-lab-header__mode\"\n ariaLabel=\"Color mode\"\n size=\"sm\"\n variant=\"flat\"\n items={MODE_ITEMS}\n value={lab.mode}\n onChange={(next) => {\n if (next) lab.setMode(next);\n }}\n />\n </>\n );\n}\n","import { useContext } from 'react';\nimport { useStore } from 'zustand/react';\nimport { PaletteRegion } from '../chrome/regions/PaletteRegion';\nimport type { TrialChromeContext, TrialContribution } from '../chrome/types';\nimport { LabStoreContext } from '../state/context';\nimport type { TrialTool } from '../tools/types';\n\n/** Props for `<LabPalette>`. */\nexport interface LabPaletteProps {\n tools: readonly TrialTool[];\n}\n\n/** The lab's tool strip. Writes the lab's tool slot, which every trial whose\n * instrument declares no tools of its own resolves to. */\nexport function LabPalette({ tools }: LabPaletteProps) {\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] LabPalette requires <LabStoreProvider>');\n const activeToolId = useStore(storeCtx.store, (s) => s.activeToolId);\n const setLabTool = useStore(storeCtx.store, (s) => s.setLabTool);\n\n const contributions: TrialContribution[] = tools.map((t) => ({\n id: t.id,\n region: 'palette',\n group: t.group,\n item: { icon: t.icon, label: t.label, shortcut: t.shortcut },\n }));\n\n const ctx = {\n activeToolId,\n setActiveTool: setLabTool,\n } as unknown as TrialChromeContext;\n\n return <PaletteRegion contributions={contributions} ctx={ctx} />;\n}\n","import { useEffect, useState } from 'react';\nimport type { LabMode } from '../state/types';\n\nfunction query(): MediaQueryList | null {\n if (typeof window === 'undefined' || !window.matchMedia) return null;\n return window.matchMedia('(prefers-color-scheme: light)');\n}\n\n/**\n * Resolve a `LabMode` to the mode the theme resolver understands.\n *\n * `auto` is not a mode — it means \"read the OS\", live. An explicit choice\n * opts out of the subscription entirely.\n */\nexport function useResolvedMode(mode: LabMode): 'light' | 'dark' {\n const [system, setSystem] = useState<'light' | 'dark'>(() =>\n query()?.matches ? 'light' : 'dark',\n );\n\n useEffect(() => {\n if (mode !== 'auto') return;\n const mq = query();\n if (!mq) return;\n const onChange = (e: MediaQueryListEvent) => setSystem(e.matches ? 'light' : 'dark');\n mq.addEventListener('change', onChange);\n return () => mq.removeEventListener('change', onChange);\n }, [mode]);\n\n return mode === 'auto' ? system : mode;\n}\n","import { ThemeProvider, useThemeOptional } from '@weasel-js/theme/react';\nimport type { ReactNode } from 'react';\nimport type { LabMode } from '../state/types';\nimport { interstellarTheme } from '../theme/interstellar';\nimport { useResolvedMode } from './useSystemMode';\n\n/** Props for `<LabShell>`. */\nexport interface LabShellProps {\n title: string;\n children: ReactNode;\n /** Optional content rendered into the header (e.g., action buttons). */\n header?: ReactNode;\n /** Optional content rendered into the footer. */\n footer?: ReactNode;\n /** Color mode. \"auto\" (default) follows prefers-color-scheme. */\n mode?: LabMode;\n}\n\n/** Page frame for a lab: a titled header, a body, and an optional footer,\n * themed for the resolved color mode. Presentational only — use `<Lab>` when\n * the trial runtime is wanted too. */\nexport function LabShell({ title, children, header, footer, mode = 'auto' }: LabShellProps) {\n const resolved = useResolvedMode(mode);\n const outer = useThemeOptional();\n\n const shell = (\n // Overlays portal here rather than to the themed wrapper above: `.lk-root`\n // carries the element defaults a lab's bare markup is styled by.\n <div className=\"lk-root lk-shell\" data-wzl-portal-host=\"\">\n <header className=\"lk-shell-header\">\n <h1 className=\"lk-shell-title\">{title}</h1>\n {header && <div className=\"lk-shell-header-actions\">{header}</div>}\n </header>\n <main className=\"lk-shell-body\">{children}</main>\n {footer && <footer className=\"lk-shell-footer\">{footer}</footer>}\n </div>\n );\n\n // Inside <Lab> the theme is already applied on `.lk-lab`; wrapping again\n // would only add a div.\n return outer ? (\n shell\n ) : (\n <ThemeProvider theme={interstellarTheme} mode={resolved}>\n {shell}\n </ThemeProvider>\n );\n}\n","import {\n Children,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from 'react';\nimport { asNodeId, createNode, floatingStrategy, gridStrategy, type NodeId, Store } from 'windease';\nimport {\n type ChromeMap,\n Container,\n DragProvider,\n Provider,\n StrategyRegistryProvider,\n} from 'windease/react';\n\nimport { useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { TrialDragContext } from '../trial/TrialDragContext';\nimport { usePanelHosts } from './panelHost';\n\nconst ZONE_ID = asNodeId('lk-workspace');\nconst STRATEGIES = { grid: gridStrategy as never, floating: floatingStrategy as never };\nconst FLOAT_ZONE_ID = asNodeId('lk-workspace-floating');\nconst PANEL_KIND = 'panel';\nconst KIND = 'trial';\n\n/** A tile's persisted extent, keyed by the id its caller gave it. Grid resizes\n * write `span`; `size` is here because a strategy swap would write that. */\nexport type TrialLayout = Record<\n string,\n { size?: { w?: number; h?: number }; span?: { cols?: number; rows?: number } }\n>;\n\nexport interface WorkspaceProps {\n children: ReactNode;\n /**\n * Stable id per child, positionally matched. Supply these whenever a tile\n * can be closed from the middle: without them a tile is identified by its\n * position, so closing one shifts every id after it and the panes inherit\n * each other's dragged extents. `layout` and `reorderable` both key off\n * these, so neither means much without them.\n */\n ids?: readonly string[];\n /** Draggable seams between tiles. Off by default — an even tiling is the\n * behavior every existing caller has. */\n resizable?: boolean;\n /** Let a tile be dragged to a new position. Off by default. The grid never\n * reorders `children` itself: it reports the order a drop would produce and\n * the caller commits it. */\n reorderable?: boolean;\n /** The full id list a drop would produce, in its new order. */\n onReorder?: (ids: string[]) => void;\n /** Extents from a previous session, applied to tiles as they register. */\n layout?: TrialLayout;\n /** Fires when a tile's extent changes. Persist it and hand it back as\n * `layout` to make a resize survive a reload. */\n onLayoutChange?: (layout: TrialLayout) => void;\n gap?: number;\n padding?: number;\n /** Undocked sidebar panels to render alongside the trials. A `'tile'` panel\n * joins the grid as a peer of the trials; a `'floating'` one goes into the\n * floating zone above it. The body is portalled in by the trial that owns\n * it, so all this renders is the frame and the host. */\n panels?: readonly PanelDescriptor[];\n /**\n * Fixed tiling extent. Omit in an app — the grid measures its own box. Supply\n * it where nothing measures, notably jsdom: at a zero measurement the grid\n * renders no tiles at all.\n */\n viewport?: { w: number; h: number };\n}\n\nfunction extentOf(store: Store, id: NodeId): TrialLayout[string] | null {\n const p = store.getNode(id)?.membership?.placement as TrialLayout[string] | undefined;\n if (!p) return null;\n const out: TrialLayout[string] = {};\n if (p.size) out.size = p.size;\n if (p.span) out.span = p.span;\n return Object.keys(out).length > 0 ? out : null;\n}\n\n/**\n * Auto-balanced tiling of trials, `ceil(sqrt(n))` columns wide.\n *\n * Tiles are absolutely positioned at the rects `gridStrategy` computes, not\n * laid out by CSS — `windease/styles.css` (folded into\n * `@weasel-js/labkit/styles.css`) carries the rules that positioning depends on.\n *\n * `panels` are undocked sidebar sections. A `'tile'` panel is registered as a\n * peer of the trials under `PANEL_KIND`, so the grid places and resizes it like\n * one; a `'floating'` panel goes in the overlay above. Either way this renders\n * only the frame and an empty host: the section's content is portalled in by\n * the trial that owns it, which is what keeps a torn-out section inside its\n * trial's React tree instead of rebuilding it as a sibling.\n */\n\n/** The frame an undocked panel gets: a box, and the host element its trial\n * portals into. The title and the dock control come through the portal with\n * the body — the workspace knows a panel's key, not what is in it. */\nfunction PanelFrame({ panel, floating = false }: { panel: PanelDescriptor; floating?: boolean }) {\n const hosts = usePanelHosts();\n return (\n <div className={floating ? 'lk-panel-tile lk-panel-tile--floating' : 'lk-panel-tile'}>\n <div className=\"lk-panel-tile__body\" ref={(el) => hosts?.set(panel.key, el)} />\n </div>\n );\n}\n\n/** One undocked panel, as the workspace needs to know it. */\nexport interface PanelDescriptor {\n /** Stable key; also the portal host key the owning trial writes into. */\n key: string;\n title: string;\n as: 'tile' | 'floating';\n}\n\nexport function Workspace({\n children,\n ids,\n panels,\n resizable = false,\n reorderable = false,\n onReorder,\n layout,\n onLayoutChange,\n gap = 12,\n padding = 0,\n viewport,\n}: WorkspaceProps) {\n const items = Children.toArray(children);\n const tilePanels = useMemo(() => (panels ?? []).filter((p) => p.as === 'tile'), [panels]);\n const floatPanels = useMemo(() => (panels ?? []).filter((p) => p.as === 'floating'), [panels]);\n // Identity has to be stable while the id *contents* are unchanged: the sync\n // effect below keys off it, and a fresh array every render would re-register\n // every tile forever. A ref keyed on the joined ids says that directly, where\n // a `useMemo` on the same key can only say it by suppressing both linters.\n const wantedIds = [\n ...items.map((_, i) => ids?.[i] ?? `lk-ws-${i}`),\n ...tilePanels.map((p) => `lk-panel-${p.key}`),\n ];\n const idKey = wantedIds.join(',');\n const idKeyRef = useRef<string | null>(null);\n const nodeIdsRef = useRef<NodeId[]>([]);\n if (idKeyRef.current !== idKey) {\n idKeyRef.current = idKey;\n nodeIdsRef.current = wantedIds.map(asNodeId);\n }\n const nodeIds = nodeIdsRef.current;\n\n // Held in refs rather than depended on: a fresh object each render would\n // re-run the sync effect, and only a newly registered tile reads `layout`.\n const layoutRef = useRef(layout);\n layoutRef.current = layout;\n const onLayoutChangeRef = useRef(onLayoutChange);\n onLayoutChangeRef.current = onLayoutChange;\n\n // One store for the component's lifetime: a tile's dragged extent lives in\n // its node, so rebuilding the store on every add or close would silently\n // reset every pane.\n const storeRef = useRef<Store | null>(null);\n if (storeRef.current === null) {\n const store = new Store();\n store.registerNode(\n createNode({\n kind: 'zone',\n id: ZONE_ID,\n container: { strategyId: 'grid', config: { resizable, gap, padding } },\n }),\n );\n store.registerNode(\n createNode({\n kind: 'zone',\n id: FLOAT_ZONE_ID,\n container: { strategyId: 'floating', config: {} },\n }),\n );\n storeRef.current = store;\n }\n const store = storeRef.current;\n\n // A tile that only moves reports nothing to a ResizeObserver, and only this\n // component knows the grid moved one. Optional: a lab may own no surface.\n const surface = useSurfaceOptional();\n\n useLayoutEffect(() => {\n store.updateContainerConfig(ZONE_ID, { resizable, gap, padding });\n }, [store, resizable, gap, padding]);\n\n useLayoutEffect(() => {\n const present = new Set(store.getContainerView(ZONE_ID)?.childOrder ?? []);\n const wanted = new Set(nodeIds);\n for (const id of present) {\n if (!wanted.has(id)) store.unregisterNode(id);\n }\n for (const id of nodeIds) {\n if (present.has(id)) continue;\n const kind = String(id).startsWith('lk-panel-') ? PANEL_KIND : KIND;\n store.registerNode(createNode({ kind, id, parentId: ZONE_ID, focus: true }));\n store.showNode(id);\n const saved = layoutRef.current?.[id];\n if (saved) store.patchPlacement(id, saved);\n }\n store.setChildOrder(ZONE_ID, [...nodeIds]);\n }, [store, nodeIds]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: nodeIds is the signal that the tile set changed — a re-tile moves tiles without resizing any — not a value this reads\n useEffect(() => {\n if (!surface) return;\n surface.invalidateRects();\n return store.events.on('node.placementChanged', () => surface.invalidateRects());\n }, [store, surface, nodeIds]);\n\n useEffect(() => {\n if (!onLayoutChange) return;\n return store.events.on('node.placementChanged', () => {\n const next: TrialLayout = {};\n for (const child of store.getChildren(ZONE_ID)) {\n const extent = extentOf(store, child.id);\n if (extent) next[child.id] = extent;\n }\n onLayoutChangeRef.current?.(next);\n });\n }, [store, onLayoutChange]);\n\n const commitOrder = useCallback(\n (nextIds: NodeId[]) => onReorder?.(nextIds.map(String)),\n [onReorder],\n );\n\n const chrome = useMemo<ChromeMap>(() => {\n const byId = new Map<string, ReactNode>(nodeIds.map((id, i) => [id, items[i]]));\n const panelByNode = new Map<string, PanelDescriptor>(\n tilePanels.map((p) => [`lk-panel-${p.key}`, p]),\n );\n return {\n [PANEL_KIND]: ({ node }) => {\n const panel = panelByNode.get(String(node.id));\n if (!panel) return null;\n return <PanelFrame panel={panel} />;\n },\n [KIND]: ({ node }) => {\n const content = byId.get(node.id) ?? null;\n if (!reorderable) return content;\n return (\n // No grip strip: the trial's own title bar is the drag surface.\n <TrialDragContext.Provider value={{ nodeId: node.id }}>\n <div className=\"lk-trial-tile\">{content}</div>\n </TrialDragContext.Provider>\n );\n },\n };\n }, [nodeIds, items, reorderable, tilePanels]);\n\n const floatingLayer =\n floatPanels.length === 0 ? null : (\n <div className=\"lk-workspace__floating\">\n {floatPanels.map((p) => (\n <PanelFrame key={p.key} panel={p} floating />\n ))}\n </div>\n );\n\n const grid = (\n <Container\n parentId={ZONE_ID}\n chrome={chrome}\n className=\"lk-workspace windease-zone\"\n affordances={resizable}\n viewport={viewport}\n onChildOrderChange={reorderable ? commitOrder : undefined}\n />\n );\n\n return (\n <Provider store={store}>\n <StrategyRegistryProvider strategies={STRATEGIES}>\n {floatingLayer ? (\n // The floating layer insets against the workspace, so it needs a\n // positioned box around both. Without one it insets against the page\n // and lands over the lab header.\n <div className=\"lk-workspace-host\">\n {reorderable ? <DragProvider>{grid}</DragProvider> : grid}\n {floatingLayer}\n </div>\n ) : reorderable ? (\n <DragProvider>{grid}</DragProvider>\n ) : (\n grid\n )}\n </StrategyRegistryProvider>\n </Provider>\n );\n}\n","import { ThemeProvider } from '@weasel-js/theme/react';\nimport {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useStore } from 'zustand/react';\nimport type { TrialContribution } from '../chrome/types';\nimport type { ConfigRule, ControlRenderer } from '../config/types';\nimport { configDefaultsOf, serializersOf } from '../instrument/serializers';\nimport type { InstrumentList } from '../instrument/types';\nimport { noneAdapter } from '../state/adapters';\nimport { LabStoreContext } from '../state/context';\nimport { createLabStore, type LabStore } from '../state/store';\nimport type { LabMode, StorageAdapter, TrialRecord } from '../state/types';\nimport { SurfaceCanvasContext, SurfaceContext } from '../surface/SurfaceContext';\nimport { useSurfaceCanvas, useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { useTiledSurface } from '../surface/useTiledSurface';\nimport { interstellarTheme } from '../theme/interstellar';\nimport type { TrialTool } from '../tools/types';\nimport { Trial } from '../trial/Trial';\nimport {\n addTrial as addTrialOp,\n cloneTrial as cloneTrialOp,\n closeTrial as closeTrialOp,\n reorderTrials as reorderTrialsOp,\n resetTrial as resetTrialOp,\n} from '../trial/trialOps';\nimport { LabContext, type LabContextValue } from './LabContext';\nimport { LabHeader } from './LabHeader';\nimport { LabPalette } from './LabPalette';\nimport { LabShell } from './LabShell';\nimport { createPanelHostRegistry, PanelHostContext } from './panelHost';\nimport { useResolvedMode } from './useSystemMode';\nimport { type PanelDescriptor, type TrialLayout, Workspace } from './Workspace';\n\n/** Props for `<Lab>`. */\nexport interface LabProps {\n instruments: InstrumentList;\n defaultInstrument: string;\n storage?: StorageAdapter | null;\n storageKey?: string;\n mode?: LabMode;\n /**\n * Optional list of CSS colors used to compose the interstellar theme's\n * cosmic backdrop. Each color becomes one radial-gradient blob on the\n * dark void base. Order maps to a fixed spread of positions; extras wrap\n * around. Ignored unless the resolved mode is dark.\n */\n nebula?: readonly string[];\n title?: string;\n /** Rendered in the shell's footer, below the workspace. */\n footer?: ReactNode;\n /** Contributions added to every trial's chrome, after the instrument's own. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n /** Tools offered lab-wide. A trial whose instrument declares none of its own\n * reflects and writes this slot. */\n tools?: readonly TrialTool[];\n /** Rules run over every instrument's config leaves, before labkit's own\n * inference — where a lab states a convention once instead of annotating\n * each field. Memoize or hoist. */\n configRules?: readonly ConfigRule[];\n /** Control overrides and app-defined kinds for every trial's settings panel.\n * Keys are config paths (checked first) or leaf kinds. Memoize or hoist. */\n controls?: Record<string, ControlRenderer>;\n children?: ReactNode;\n}\n\nfunction buildStore(\n instruments: InstrumentList,\n defaultInstrument: string,\n storage: StorageAdapter,\n storageKey: string,\n initialMode: LabMode,\n): LabStore {\n // Hydration reads the serializers, so they go in with the store rather than\n // being registered onto it afterwards.\n const store = createLabStore({\n storageKey,\n storage,\n initialMode,\n serializers: serializersOf(instruments),\n configDefaults: configDefaultsOf(instruments),\n });\n if (store.getState().trials.length === 0) {\n const seeded = addTrialOp([], instruments, defaultInstrument);\n const record = seeded[0];\n if (record) {\n const { undoStack: _undoStack, ...rest } = record;\n store.getState().addTrial(rest);\n }\n }\n return store;\n}\n\n// Fixed spread of nebula blob positions / sizes / fall-off stops. Colors\n// supplied via the `nebula` prop are slotted into these slots in order;\n// callers passing more than 5 wrap around (intentional — keeps the look\n// readable and bounded).\nconst NEBULA_SLOTS = [\n { cx: '18%', cy: '30%', sx: '60%', sy: '80%', stop: '70%' },\n { cx: '78%', cy: '70%', sx: '55%', sy: '90%', stop: '65%' },\n { cx: '50%', cy: '50%', sx: '50%', sy: '70%', stop: '75%' },\n { cx: '12%', cy: '82%', sx: '50%', sy: '70%', stop: '70%' },\n { cx: '85%', cy: '18%', sx: '55%', sy: '80%', stop: '70%' },\n] as const;\n\nfunction buildNebula(colors: readonly string[]): string {\n const blobs = colors.map((c, i) => {\n const p = NEBULA_SLOTS[i % NEBULA_SLOTS.length];\n return `radial-gradient(ellipse ${p.sx} ${p.sy} at ${p.cx} ${p.cy}, color-mix(in srgb, ${c} 22%, transparent), transparent ${p.stop})`;\n });\n blobs.push('radial-gradient(ellipse at center, #0a0a18 0%, #02020a 100%)');\n return blobs.join(', ');\n}\n\n/** The lab runtime: creates the store, provides it, and renders one trial\n * per record in a grid. Each trial runs one of `instruments`. */\nexport function Lab({\n instruments,\n defaultInstrument,\n storage,\n storageKey,\n mode,\n nebula,\n title,\n footer,\n chrome,\n suppress,\n tools,\n configRules,\n controls,\n children,\n}: LabProps) {\n if (process.env.NODE_ENV !== 'production' && instruments.length === 0) {\n throw new Error('[labkit] <Lab> requires a non-empty `instruments` array');\n }\n\n const storeRef = useRef<LabStore | null>(null);\n if (storeRef.current === null) {\n storeRef.current = buildStore(\n instruments,\n defaultInstrument,\n storage ?? noneAdapter,\n storageKey ?? 'labkit',\n mode ?? 'auto',\n );\n }\n const store = storeRef.current;\n\n const trials = useStore(store, (s) => s.trials);\n const savedSnapshots = useStore(store, (s) => s.savedSnapshots);\n const modeValue = useStore(store, (s) => s.mode);\n const layout = useStore(store, (s) => s.layout);\n const undockedPanels = useStore(store, (s) => s.undockedPanels);\n\n // One registry for the lab's lifetime: a panel host is a DOM node the\n // workspace owns and the trial portals into, so it must outlive both ends of\n // a dock/undock without being rebuilt.\n const panelHostsRef = useRef<ReturnType<typeof createPanelHostRegistry> | null>(null);\n if (panelHostsRef.current === null) panelHostsRef.current = createPanelHostRegistry();\n\n // One shared drawing surface for the whole lab, anchored to the body — tile\n // rects compose against it, and every tile paints into the one buffer.\n // `Workspace` invalidates rects when the grid moves something a\n // ResizeObserver cannot see. A host that already owns a surface keeps it: a\n // lab embedded in a larger shared-surface app must not open a second GL\n // tenancy, and mounts no buffer of its own.\n const outerSurface = useSurfaceOptional();\n const outerCanvas = useSurfaceCanvas();\n const [ownCanvas, setOwnCanvas] = useState<HTMLCanvasElement | null>(null);\n const ownCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const bufferRef = useRef({ w: 0, h: 0 });\n const surfaceRef = useRef<ReturnType<typeof useTiledSurface> | null>(null);\n\n // Sizing the buffer clears all of it, so every tile has to repaint — not\n // only the one whose move triggered the measurement.\n const onFrame = useCallback((frame: { size: { width: number; height: number }; dpr: number }) => {\n const c = ownCanvasRef.current;\n if (!c) return;\n const w = Math.round(frame.size.width * frame.dpr);\n const h = Math.round(frame.size.height * frame.dpr);\n if (bufferRef.current.w === w && bufferRef.current.h === h) return;\n bufferRef.current = { w, h };\n c.width = w;\n c.height = h;\n c.style.width = `${frame.size.width}px`;\n c.style.height = `${frame.size.height}px`;\n surfaceRef.current?.invalidateAll();\n }, []);\n\n const ownSurface = useTiledSurface({ onFrame });\n surfaceRef.current = ownSurface;\n const surface = outerSurface ?? ownSurface;\n const surfaceCanvas = outerSurface ? outerCanvas : ownCanvas;\n\n const workspacePanels = useMemo<PanelDescriptor[]>(\n () =>\n Object.entries(undockedPanels).map(([key, panel]) => ({\n key,\n title: panel.sectionId,\n as: panel.as,\n })),\n [undockedPanels],\n );\n const resolvedMode = useResolvedMode(modeValue);\n\n useEffect(() => {\n if (mode && mode !== store.getState().mode) {\n store.getState().setMode(mode);\n }\n }, [mode, store]);\n\n const contextValue = useMemo<LabContextValue>(() => {\n const replaceTrials = (next: TrialRecord[]): void => {\n const currentById = new Map(store.getState().trials.map((w) => [w.id, w]));\n const merged = next.map((w) => currentById.get(w.id) ?? w);\n store.setState({ trials: merged });\n // Trigger persistence flush via a tracked action.\n store.getState().setMode(store.getState().mode);\n };\n\n return {\n instruments,\n trials,\n addTrial: (instrumentName, options) => {\n const next = addTrialOp(store.getState().trials, instruments, instrumentName, options);\n replaceTrials(next);\n },\n cloneTrial: (id) => {\n const next = cloneTrialOp(store.getState().trials, id);\n replaceTrials(next);\n },\n closeTrial: (id) => {\n const next = closeTrialOp(store.getState().trials, id);\n replaceTrials(next);\n },\n reorderTrials: (ids) => {\n replaceTrials(reorderTrialsOp(store.getState().trials, ids));\n },\n resetTrial: (id) => {\n const next = resetTrialOp(store.getState().trials, id, instruments);\n const record = next.find((w) => w.id === id);\n if (!record) return;\n store.setState((s) => ({\n trials: s.trials.map((w) =>\n w.id === id\n ? { ...w, config: record.config, state: record.state, view: record.view }\n : w,\n ),\n }));\n store.getState().updateTrialView(id, record.view);\n },\n savedSnapshots,\n saveSnapshot: (trialId, name) => {\n const taken = store.getState().savedSnapshots.filter((s) => s.trialId === trialId).length;\n store.getState().saveSnapshot(trialId, name ?? `Snapshot ${taken + 1}`);\n },\n loadSnapshot: (trialId, snapshotId) => {\n store.getState().loadSnapshot(snapshotId, trialId);\n },\n deleteSnapshot: (snapshotId) => {\n store.getState().deleteSnapshot(snapshotId);\n },\n mode: modeValue,\n setMode: (m) => {\n store.getState().setMode(m);\n },\n configRules,\n controls,\n };\n }, [instruments, trials, savedSnapshots, modeValue, store, configRules, controls]);\n\n // Only override the backdrop in dark, where there is one to override.\n // Setting a CSS custom property is the sanctioned use of inline style.\n const backdropStyle =\n resolvedMode === 'dark' && nebula && nebula.length > 0\n ? ({ ['--wzl-backdrop' as string]: buildNebula(nebula) } as CSSProperties)\n : undefined;\n\n return (\n <LabStoreContext.Provider value={{ store }}>\n <LabContext.Provider value={contextValue}>\n <ThemeProvider\n theme={interstellarTheme}\n mode={resolvedMode}\n className=\"lk-lab\"\n style={backdropStyle}\n >\n <LabShell\n title={title ?? 'Labkit'}\n mode={modeValue}\n footer={footer}\n header={\n <>\n <LabHeader />\n {children}\n </>\n }\n >\n <PanelHostContext.Provider value={panelHostsRef.current}>\n <SurfaceContext.Provider value={surface}>\n <SurfaceCanvasContext.Provider value={surfaceCanvas}>\n <div\n className=\"lk-lab__body\"\n ref={outerSurface ? undefined : ownSurface.containerRef}\n >\n {outerSurface ? null : (\n // Above the trials and inert: the marks a tile paints have\n // to sit over the instrument's own DOM, and nothing on this\n // buffer takes input — each tile has its own input box.\n <canvas\n className=\"lk-lab__surface\"\n ref={(el) => {\n ownCanvasRef.current = el;\n setOwnCanvas(el);\n }}\n />\n )}\n {tools ? <LabPalette tools={tools} /> : null}\n <Workspace\n panels={workspacePanels}\n ids={trials.map((w) => w.id)}\n resizable\n reorderable\n onReorder={(ids) => contextValue.reorderTrials(ids)}\n layout={layout as TrialLayout}\n onLayoutChange={(next) => store.getState().setLayout(next)}\n >\n {trials.map((w) => (\n <Trial key={w.id} id={w.id} chrome={chrome} suppress={suppress} />\n ))}\n </Workspace>\n </div>\n </SurfaceCanvasContext.Provider>\n </SurfaceContext.Provider>\n </PanelHostContext.Provider>\n </LabShell>\n </ThemeProvider>\n </LabContext.Provider>\n </LabStoreContext.Provider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../svg/src/types.ts","../../svg/src/transform.ts","../../svg/src/textAnchor.ts","../../svg/src/patterns.ts","../../svg/src/path-serializer.ts","../../svg/src/gradients.ts","../../svg/src/serialize.ts","../src/annotations/paint.ts","../src/annotations/staleness.ts","../src/annotations/drawOne.ts","../src/annotations/svgNodes.ts","../src/annotations/capture.ts","../src/annotations/frac.ts","../src/annotations/history.ts","../src/annotations/store.ts","../src/annotations/toolMap.ts","../src/annotations/view.ts","../src/annotations/AnnotationOverlay.tsx","../src/annotations/AnnotationTargets.tsx","../src/instrument/defineInstrument.ts","../src/instrument/validateConfigSchema.ts","../../theme/src/generated/themes.ts","../../theme/src/theme.ts","../../theme/src/dtcg/color.ts","../../theme/src/dtcg/resolve.ts","../../theme/src/resolveTheme.ts","../../theme/src/applyTheme.ts","../../theme/src/react.tsx","../src/annotations/preload.ts","../../theme/src/dtcg/types.ts","../../theme/src/dtcg/flatten.ts","../../theme/src/loadDTCG.ts","../src/theme/interstellar.tokens.json","../src/theme/interstellar.ts","../src/trial/TrialBody.tsx","../src/trial/TrialDragContext.ts","../src/trial/TrialTitleBar.tsx","../src/lab/panelHost.ts","../src/trial/UndockedSections.tsx","../src/trial/TrialChrome.tsx","../src/trial/Trial.tsx","../src/trial/trialOps.ts","../src/lab/fitCheck.ts","../src/lab/LabHeader.tsx","../src/lab/LabPalette.tsx","../src/lab/LabSwitcher.tsx","../src/lab/useSystemMode.ts","../src/lab/LabShell.tsx","../src/lab/Workspace.tsx","../src/lab/Lab.tsx"],"names":["a","b","n","r","c","PATH_M","PATH_L","PATH_C","PATH_Q","PATH_Z","escapeAttr","boundsOfPath","p","PathBuilder","w","h","asNodeId","f","jsx","Fragment","useRef","useContext","createContext","jsxs","createPortal","useMemo","z","useStore","useState","useEffect","l","DEFAULT_VIEW","bound","hit","addTrial","useCallback","store","useLayoutEffect"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDO,IAAM,kBAA0B,CAAC,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AC7CjD,SAAS,QAAA,CAASA,IAAWC,EAAAA,EAAmB;AAGrD,EAAA,OAAO;IACLD,EAAAA,CAAE,CAAC,IAAIC,EAAAA,CAAE,CAAC,IAAID,EAAAA,CAAE,CAAC,CAAA,GAAIC,EAAAA,CAAE,CAAC,CAAA;IACxBD,EAAAA,CAAE,CAAC,IAAIC,EAAAA,CAAE,CAAC,IAAID,EAAAA,CAAE,CAAC,CAAA,GAAIC,EAAAA,CAAE,CAAC,CAAA;IACxBD,EAAAA,CAAE,CAAC,IAAIC,EAAAA,CAAE,CAAC,IAAID,EAAAA,CAAE,CAAC,CAAA,GAAIC,EAAAA,CAAE,CAAC,CAAA;IACxBD,EAAAA,CAAE,CAAC,IAAIC,EAAAA,CAAE,CAAC,IAAID,EAAAA,CAAE,CAAC,CAAA,GAAIC,EAAAA,CAAE,CAAC,CAAA;AACxBD,IAAAA,EAAAA,CAAE,CAAC,CAAA,GAAIC,EAAAA,CAAE,CAAC,CAAA,GAAID,EAAAA,CAAE,CAAC,CAAA,GAAIC,EAAAA,CAAE,CAAC,CAAA,GAAID,EAAAA,CAAE,CAAC,CAAA;AAC/BA,IAAAA,EAAAA,CAAE,CAAC,CAAA,GAAIC,EAAAA,CAAE,CAAC,CAAA,GAAID,EAAAA,CAAE,CAAC,CAAA,GAAIC,EAAAA,CAAE,CAAC,CAAA,GAAID,EAAAA,CAAE,CAAC;AAAA,GAAA;AAEnC;AAQO,SAAS,UAAA,CAAW,CAAA,EAAW,GAAA,GAAM,IAAA,EAAe;AACzD,EAAA,OACE,KAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAC,IAAI,GAAA,IACrB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,GAAA,IACjB,KAAK,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,GAAA,IACjB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAC,IAAI,CAAC,CAAA,GAAI,OACrB,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAC,IAAI,GAAA,IACjB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,GAAA;AAErB;AA8IO,SAAS,aAAa,CAAA,EAA0B;AACrD,EAAA,IAAI,UAAA,CAAW,CAAC,CAAA,EAAG,OAAO,IAAA;AAC1B,EAAA,OAAO,CAAA,OAAA,EAAU,CAAA,CAAE,GAAA,CAAI,CAACE,EAAAA,KAAM,UAAA,CAAWA,EAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AACxD;AAGO,SAAS,WAAWA,EAAAA,EAAmB;AAC5C,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAASA,EAAC,GAAG,OAAO,GAAA;AAEhC,EAAA,MAAMC,EAAAA,GAAI,IAAA,CAAK,KAAA,CAAMD,EAAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAChC,EAAA,IAAI,OAAO,SAAA,CAAUC,EAAC,CAAA,EAAG,OAAO,OAAOA,EAAC,CAAA;AACxC,EAAA,OAAO,OAAOA,EAAC,CAAA;AACjB;AC3LO,SAAS,YAAA,CAAa,OAA8B,KAAA,EAAuB;AAChF,EAAA,MAAM,OAAO,YAAA,CAAa,KAAA,EAAO,SAAS,MAAA,EAAQ,KAAA,EAAO,aAAa,KAAK,CAAA;AAC3E,EAAA,OAAO,SAAS,QAAA,GAAW,KAAA,GAAQ,CAAA,GAAI,IAAA,KAAS,UAAU,KAAA,GAAQ,CAAA;AACpE;ACkBO,SAAS,cAAc,KAAA,EAA4C;AACxE,EAAA,OAAO,MAAA,IAAU,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,OAAA,GAAU,IAAA;AACnD;AAEO,SAAS,UAAA,CAAW,EAAA,EAAY,KAAA,EAAoB,MAAA,EAAsC;AAC/F,EAAA,MAAM,IAAA,GAAO,cAAc,KAAK,CAAA;AAChC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAA,GAAS,2FAAsF,CAAA;AAC/F,IAAA,OAAO,EAAA;AACT,EAAA;AACA,EAAA,MAAM,QAAA,GAAW,aAAa,IAAI,CAAA;AAClC,EAAA,MAAM,OAAO,QAAA,CAAS,MAAA,CAAO,IAAI,QAAQ,CAAA,CAAE,KAAK,EAAE,CAAA;AAClD,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA,IAAU,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ;AACZ,IAAA,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA,CAAA;AACT,IAAA,+BAAA;IACA,CAAA,OAAA,EAAU,UAAA,CAAW,QAAA,CAAS,IAAI,CAAC,CAAA,CAAA,CAAA;IACnC,CAAA,QAAA,EAAW,UAAA,CAAW,QAAA,CAAS,IAAI,CAAC,CAAA,CAAA;AAAA,GAAA;AAEtC,EAAA,IAAI,MAAA,CAAO,CAAA,KAAM,CAAA,IAAK,MAAA,CAAO,MAAM,CAAA,EAAG;AACpC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,CAAA,EAAK,CAAA,GAAA,EAAM,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AACzE,EAAA;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,qBAAqB,UAAA,CAAW,IAAA,CAAK,UAAU,IAAI,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AACnE,EAAA,OAAO,YAAY,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,IAAI,IAAI,CAAA,UAAA,CAAA;AAC5C;AAuBA,SAAS,SAAS,KAAA,EAA0B;AAC1C,EAAA,QAAQ,MAAM,IAAA;IACZ,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,UAAA,EAAa,UAAA,CAAW,KAAA,CAAM,EAAE,CAAC,CAAA,MAAA,EAAS,UAAA,CAAW,KAAA,CAAM,EAAE,CAAC,CAAA,MAAA,EAC1D,UAAA,CAAW,KAAA,CAAM,EAAE,CAAC,CAAA,MAAA,EAAS,UAAA,CAAW,KAAA,CAAM,EAAE,CAAC,CAAA,UAAA,EAC7C,KAAA,CAAM,KAAK,CAAA,gBAAA,EAAmB,UAAA,CAAW,KAAA,CAAM,KAAK,CAAC,CAAA,GAAA,CAAA;IACtE,KAAK,QAAA;AACH,MAAA,OAAO,eAAe,UAAA,CAAW,KAAA,CAAM,EAAE,CAAC,SAAS,UAAA,CAAW,KAAA,CAAM,EAAE,CAAC,QAC7D,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA,QAAA,EAAW,MAAM,KAAK,CAAA,GAAA,CAAA;AACrD,IAAA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,GAAA,GAAO,KAAA,CAAM,QAAA,GAAW,GAAA,GAAO,IAAA,CAAK,EAAA;AAC1C,MAAA,MAAM,YAAY,GAAA,KAAQ,CAAA,GACtB,EAAA,GACA,CAAA,mBAAA,EAAsB,WAAW,GAAG,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,MAAM,EAAE,CAAC,IAAI,UAAA,CAAW,KAAA,CAAM,EAAE,CAAC,CAAA,EAAA,CAAA;AACzF,MAAA,OAAO,CAAA,aAAA,EAAgB,UAAA,CAAW,KAAA,CAAM,EAAE,CAAC,SAAS,UAAA,CAAW,KAAA,CAAM,EAAE,CAAC,CAAA,MAAA,EAC7D,UAAA,CAAW,MAAM,EAAE,CAAC,CAAA,MAAA,EAAS,UAAA,CAAW,KAAA,CAAM,EAAE,CAAC,CAAA,QAAA,EAC/C,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,CAAA;AACvC,IAAA;IACA,KAAK,MAAA;AACH,MAAA,OAAO,CAAA,SAAA,EAAY,WAAW,KAAA,CAAM,CAAC,CAAC,CAAA,KAAA,EAAQ,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA,SAAA,EACnD,WAAW,KAAA,CAAM,KAAK,CAAC,CAAA,UAAA,EAAa,UAAA,CAAW,MAAM,MAAM,CAAC,CAAA,QAAA,EAC7D,KAAA,CAAM,KAAK,CAAA,GAAA,CAAA;AAC1B,IAAA;AACE,MAAA,OAAO,EAAA;AAAA;AAEb;AA0CA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,EACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAC3B;ACnIO,SAAS,eAAe,IAAA,EAAoB;AACjD,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,QAAA,GAAW,IAAA;AAChC,IAAA,OAAO,CAAA,CAAA,EAAI,WAAW,CAAC,CAAC,IAAI,UAAA,CAAW,CAAC,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,KAAK,CAAC,CAAA,CAAA,EAAI,WAAW,MAAM,CAAC,IAAI,UAAA,CAAW,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA;AAC5G,EAAA;AACA,EAAA,MAAM,OAAO,IAAA,CAAK,QAAA;AAClB,EAAA,MAAM,KAAK,IAAA,CAAK,MAAA;AAChB,EAAA,MAAM,MAAgB,EAAA;AACtB,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAMC,EAAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,IAAIA,OAAMC,MAAAA,EAAQ;AAChB,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,CAAA,EAAI,UAAA,CAAW,EAAA,CAAG,EAAE,CAAC,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,EAAA,CAAG,EAAA,GAAK,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AAC3D,MAAA,EAAA,IAAM,CAAA;AACR,IAAA,CAAA,MAAA,IAAWD,OAAME,MAAAA,EAAQ;AACvB,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,CAAA,EAAI,UAAA,CAAW,EAAA,CAAG,EAAE,CAAC,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,EAAA,CAAG,EAAA,GAAK,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA;AAC3D,MAAA,EAAA,IAAM,CAAA;AACR,IAAA,CAAA,MAAA,IAAWF,OAAMG,MAAAA,EAAQ;AACvB,MAAA,GAAA,CAAI,IAAA;AACF,QAAA,CAAA,CAAA,EAAI,WAAW,EAAA,CAAG,EAAE,CAAC,CAAC,IAAI,UAAA,CAAW,EAAA,CAAG,EAAA,GAAK,CAAC,CAAC,CAAC,CAAA,CAAA,EAC7C,WAAW,EAAA,CAAG,EAAA,GAAK,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,GAAG,EAAA,GAAK,CAAC,CAAC,CAAC,CAAA,CAAA,EAChD,WAAW,EAAA,CAAG,EAAA,GAAK,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,GAAG,EAAA,GAAK,CAAC,CAAC,CAAC,CAAA;AAAA,OAAA;AAErD,MAAA,EAAA,IAAM,CAAA;AACR,IAAA,CAAA,MAAA,IAAWH,OAAMI,MAAAA,EAAQ;AACvB,MAAA,GAAA,CAAI,IAAA;QACF,CAAA,CAAA,EAAI,UAAA,CAAW,EAAA,CAAG,EAAE,CAAC,CAAC,IAAI,UAAA,CAAW,EAAA,CAAG,EAAA,GAAK,CAAC,CAAC,CAAC,IAC7C,UAAA,CAAW,EAAA,CAAG,EAAA,GAAK,CAAC,CAAC,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,EAAA,CAAG,EAAA,GAAK,CAAC,CAAC,CAAC,CAAA;AAAA,OAAA;AAErD,MAAA,EAAA,IAAM,CAAA;AACR,IAAA,CAAA,MAAA,IAAWJ,OAAMK,MAAAA,EAAQ;AACvB,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACd,IAAA;AACF,EAAA;AACA,EAAA,OAAO,GAAA,CAAI,KAAK,EAAE,CAAA;AACpB;AC+IO,IAAM,sBAAN,MAA0B;AACvB,EAAA,OAAA,uBAAc,GAAA,EAAA;AACd,EAAA,KAAA,GAAqB,EAAA;EACrB,OAAA,GAAU,CAAA;;;;;;AAOV,EAAA,UAAA,GAAuB,EAAA;AACvB,EAAA,YAAA,uBAAmB,GAAA,EAAA;AAE3B,EAAA,QAAA,CAAS,KAAA,EAA0B;AACjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AACvC,IAAA,IAAI,UAAU,OAAO,QAAA;AACrB,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,IAAA,KAAS,SAAA,GAAY,CAAA,GAAA,EAAM,KAAK,OAAA,EAAS,CAAA,CAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,OAAA,EAAS,CAAA,CAAA;AACpF,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,KAAK,CAAA;AACrB,IAAA,OAAO,EAAA;AACT,EAAA;;;;;AAMA,EAAA,QAAA,CAAS,GAAA,EAAiC;AACxC,IAAA,IAAI,SAAA,CAAU,GAAG,CAAA,KAAM,MAAA,EAAW,OAAO,MAAA;AACzC,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,YAAA,CAAa,IAAI,GAAG,CAAA;AACzB,MAAA,IAAA,CAAK,UAAA,CAAW,KAAK,GAAG,CAAA;AAC1B,IAAA;AACA,IAAA,OAAO,GAAA;AACT,EAAA;;AAGA,EAAA,SAAA,CAAU,MAAA,EAAsC;AAC9C,IAAA,IAAI,IAAA,CAAK,MAAM,MAAA,KAAW,CAAA,IAAK,KAAK,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,EAAA;AACpE,IAAA,MAAM,KAAA,GAAkB,CAAC,QAAQ,CAAA;AACjC,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,KAAA,EAAO;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,eAAe,IAAA,CAAK,OAAA,CAAQ,IAAI,KAAK,CAAA,EAAI,KAAA,EAAO,MAAM,CAAC,CAAA;AACpE,IAAA;AACA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,UAAA,EAAY;AACjC,MAAA,MAAM,KAAA,GAAQ,UAAU,GAAG,CAAA;AAC3B,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,EAAK,KAAK,CAAA,GAAI,gBAAA,CAAiB,GAAA,EAAK,KAAK,CAAC,CAAA;AACjF,IAAA;AACA,IAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AACpB,IAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AACtB,EAAA;AACF,CAAA;AAGA,SAAS,gBAAA,CAAiB,IAAY,KAAA,EAA4B;AAChE,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,GAAG,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,MAAA,EAAA,IAAY,CAAA;AACxF,EAAA,MAAM,CAAA,GAAI,eAAe,IAAI,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,KAAS,MAAA,GAAS,MAAA,GAAS,gBAAA;AAC9C,EAAA,MAAM,UAAU,KAAA,CAAM,OAAA,GAClB,0CAA0C,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,gDAAA,CAAA,GAC7D,EAAA;AAGJ,EAAA,OACE,eAAe,EAAE,CAAA,yHAAA,EAEL,CAAC,CAAA,QAAA,EAAW,IAAI,IAAI,OAAO,CAAA,WAAA,CAAA;AAE3C;AAMA,SAAS,cAAA,CAAe,EAAA,EAAY,KAAA,EAAkB,MAAA,EAAsC;AAC1F,EAAA,IAAI,MAAM,IAAA,KAAS,SAAA,SAAkB,UAAA,CAAW,EAAA,EAAI,OAAO,MAAM,CAAA;AACjE,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,EAAA,EAAI,KAAK,CAAA;AACrC,EAAA,IAAI,SAAS,OAAO,OAAA;AACpB,EAAA,MAAM,SAAS,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA,EAAG,KAAA,GAAQ,IAAI,KAAK,CAAA;AAC1D,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,mDAAA,CAAgD,CAAA;AACtE,EAAA,OAAO,EAAA;AACT;AAKA,SAAS,kBAAkB,KAAA,EAA0C;AACnE,EAAA,OAAO,KAAA,KAAU,WAAW,mBAAA,GAAsB,gBAAA;AACpD;AAEA,SAAS,WAAA,CAAY,IAAY,KAAA,EAA0B;AACzD,EAAA,IAAI,KAAA,CAAM,SAAS,iBAAA,EAAmB;AACpC,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,OAAO,CAAA,CAAE,KAAK,EAAE,CAAA;AAC9C,IAAA,OACE,CAAA,oBAAA,EAAuB,EAAE,CAAA,iBAAA,EAAoB,iBAAA,CAAkB,MAAM,KAAK,CAAC,CAAA,MAAA,EACpE,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,CAAC,CAAC,SAAS,UAAA,CAAW,KAAA,CAAM,IAAA,CAAK,CAAC,CAAC,CAAA,MAAA,EACzD,UAAA,CAAW,KAAA,CAAM,GAAG,CAAC,CAAC,CAAA,MAAA,EAAS,UAAA,CAAW,KAAA,CAAM,EAAA,CAAG,CAAC,CAAC,KAAK,KAAK,CAAA,iBAAA,CAAA;AAE1E,EAAA;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,iBAAA,EAAmB;AACpC,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,OAAO,CAAA,CAAE,KAAK,EAAE,CAAA;AAC9C,IAAA,OACE,CAAA,oBAAA,EAAuB,EAAE,CAAA,iBAAA,EAAoB,iBAAA,CAAkB,KAAA,CAAM,KAAK,CAAC,CAAA,MAAA,EACpE,UAAA,CAAW,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA,MAAA,EAAS,UAAA,CAAW,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA,KAAA,EAC9D,UAAA,CAAW,KAAA,CAAM,MAAM,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,iBAAA,CAAA;AAE5C,EAAA;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,QAAQ,CAAA,EAAqB;AAEpC,EAAA,MAAM,CAAA,GAAI,gCAAA,CAAiC,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA;AACvD,EAAA,IAAI,CAAA,EAAG;AACL,IAAA,MAAM,QAAQ,QAAA,CAAS,CAAA,CAAE,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AACnC,IAAA,OAAO,CAAA,cAAA,EAAiB,UAAA,CAAW,CAAA,CAAE,MAAM,CAAC,CAAA,eAAA,EAAkB,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,gBAAA,EAAmB,UAAA,CAAW,KAAK,CAAC,CAAA,GAAA,CAAA;AACtH,EAAA;AACA,EAAA,OAAO,iBAAiB,UAAA,CAAW,CAAA,CAAE,MAAM,CAAC,CAAA,cAAA,EAAiB,EAAE,KAAK,CAAA,GAAA,CAAA;AACtE;ACjSO,SAAS,YAAA,CAAa,KAAA,EAAkB,IAAA,GAAyB,EAAA,EAAY;AAClF,EAAA,MAAM,QAAA,GAAW,IAAI,mBAAA,EAAA;AACrB,EAAA,oBAAA,CAAqB,OAAO,QAAQ,CAAA;AAEpC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,IAAW,aAAA,CAAc,KAAK,CAAA;AAClD,EAAA,MAAM,EAAA,GAAK,GAAG,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,EAAI,WAAW,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,OAAO,KAAK,CAAC,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAC,CAAA,CAAA;AACnH,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,IAAc,EAAA;AAEtC,EAAA,MAAM,SAAA,GAAsB,CAAC,CAAA,kCAAA,CAAoC,CAAA;AACjE,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACtD,IAAA,SAAA,CAAU,KAAK,CAAA,MAAA,EAAS,MAAM,KAAKC,WAAAA,CAAW,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AACvD,EAAA;AACA,EAAA,SAAA,CAAU,IAAA,CAAK,CAAA,SAAA,EAAY,EAAE,CAAA,CAAA,CAAG,CAAA;AAChC,EAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,UAAU,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAC1E,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,WAAW,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,CAAG,CAAA;AAE7E,EAAA,IAAI,KAAK,YAAA,EAAc;AACrB,IAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG;AAC5C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACvC,MAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AACpB,MAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AACxD,QAAA,SAAA,CAAU,IAAA,CAAK,GAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAKA,WAAAA,CAAW,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAC3D,MAAA;AACF,IAAA;AACF,EAAA;AAGA,EAAA,IAAI,UAAA,GAAa,EAAA;AACjB,EAAA,IAAI,KAAK,YAAA,EAAc;AACrB,IAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG;AAC5C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACvC,MAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACvB,MAAA,KAAA,MAAW,CAAC,WAAW,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC/D,QAAA,KAAA,MAAW,MAAM,IAAA,EAAM,UAAA,IAAc,oBAAA,CAAqB,MAAA,EAAQ,WAAW,EAAE,CAAA;AACjF,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,MAAM,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,CAACR,EAAAA,KAAM,OAAA,CAAQA,EAAAA,EAAG,QAAA,EAAU,UAAU,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAK1E,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,GAC/C,CAAA,OAAA,EAAU,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,QAAA,CAAA,GAChC,EAAA;AAEJ,EAAA,OAAO,CAAA,KAAA,EAAQ,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAG,OAAO,CAAA,EAAG,UAAU,CAAA,EAAG,OAAO,CAAA,MAAA,CAAA;AACjF;AAEA,SAAS,oBAAA,CAAqB,MAAA,EAAgB,SAAA,EAAmB,EAAA,EAA+B;AAC9F,EAAA,MAAM,QAAkB,EAAA;AACxB,EAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,EAAA,CAAG,KAAK,CAAA,EAAG;AACpD,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,IAAI,KAAKQ,WAAAA,CAAW,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAC7C,EAAA;AACA,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,GAAG,CAAC,MAAM,CAAA,CAAA,EAAI,MAAM,IAAI,SAAS,CAAA,CAAA,CAAA;AACvG,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,IAAI,GAAG,QAAA,EAAU;AACf,IAAA,KAAA,MAAW,CAAC,WAAW,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,EAAA,CAAG,QAAQ,CAAA,EAAG;AAC3D,MAAA,KAAA,MAAW,SAAS,IAAA,EAAM,IAAA,IAAQ,oBAAA,CAAqB,MAAA,EAAQ,WAAW,KAAK,CAAA;AACjF,IAAA;EACF,CAAA,MAAA,IAAW,EAAA,CAAG,QAAQ,IAAA,EAAM;AAC1B,IAAA,IAAA,GAAO,UAAA,CAAW,GAAG,IAAI,CAAA;AAC3B,EAAA;AACA,EAAA,OAAO,GAAG,IAAI,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,MAAM,IAAI,SAAS,CAAA,CAAA,CAAA;AAC/C;AAEA,SAAS,YAAA,CAAa,MAAiC,UAAA,EAA4C;AACjG,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,EAAA,MAAM,QAAkB,EAAA;AACxB,EAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG;AAC5C,IAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAC1B,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AACpB,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AACxD,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAKA,WAAAA,CAAW,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AACvD,IAAA;AACF,EAAA;AACA,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,GAAI,CAAA,CAAA,EAAI,MAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,GAAK,EAAA;AACpD;AAEA,SAAS,eAAA,CAAgB,MAAiC,UAAA,EAA4C;AACpG,EAAA,IAAI,CAAC,MAAM,OAAO,EAAA;AAClB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG;AAC5C,IAAA,MAAM,MAAA,GAAS,KAAK,MAAM,CAAA;AAC1B,IAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACvB,IAAA,KAAA,MAAW,CAAC,WAAW,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC/D,MAAA,KAAA,MAAW,MAAM,IAAA,EAAM,GAAA,IAAO,oBAAA,CAAqB,MAAA,EAAQ,WAAW,EAAE,CAAA;AAC1E,IAAA;AACF,EAAA;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,oBAAA,CAAqB,OAAkB,QAAA,EAAqC;AACnF,EAAA,KAAA,MAAWR,MAAK,KAAA,EAAO;AACrB,IAAA,IAAIA,EAAAA,CAAE,SAAS,OAAA,EAAS;AACtB,MAAA,oBAAA,CAAqBA,EAAAA,CAAE,UAAU,QAAQ,CAAA;IAC3C,CAAA,MAAA,IAAWA,EAAAA,CAAE,SAAS,MAAA,EAAQ;AAC5B,MAAA,IAAIA,EAAAA,CAAE,KAAK,IAAA,KAAS,UAAA,WAAqB,QAAA,CAASA,EAAAA,CAAE,KAAK,KAAK,CAAA;AAC9D,MAAA,IAAIA,EAAAA,CAAE,MAAA,IAAUA,EAAAA,CAAE,MAAA,CAAO,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY,QAAA,CAAS,QAAA,CAASA,EAAAA,CAAE,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAC1F,MAAA,eAAA,CAAgBA,EAAAA,CAAE,QAAQ,QAAQ,CAAA;IACpC,CAAA,MAAA,IAAWA,EAAAA,CAAE,SAAS,MAAA,EAAQ;AAM5B,MAAA,iBAAA,CAAkBA,EAAAA,CAAE,MAAM,QAAQ,CAAA;AAClC,MAAA,iBAAA,CAAkBA,EAAAA,CAAE,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAA;AAC3C,MAAA,eAAA,CAAgBA,EAAAA,CAAE,QAAQ,QAAQ,CAAA;AAClC,MAAA,KAAA,MAAW,GAAA,IAAOA,EAAAA,CAAE,IAAA,IAAQ,EAAA,EAAI;AAC9B,QAAA,iBAAA,CAAkB,GAAA,CAAI,MAAM,QAAQ,CAAA;AACpC,QAAA,iBAAA,CAAkB,GAAA,CAAI,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAA;AAC/C,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAGA,SAAS,iBAAA,CACP,OACA,QAAA,EACM;AACN,EAAA,IAAI,SAAS,EAAE,OAAA,IAAW,KAAA,CAAA,EAAQ,QAAA,CAAS,SAAS,KAAK,CAAA;AAC3D;AAIA,SAAS,eAAe,GAAA,EAAkC;AACxD,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,GAAA;AACpC,EAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,SAAS,GAAA,EAAK,OAAO,MAAA,CAAQ,GAAA,CAAwB,GAAG,CAAA;AAC9F,EAAA,OAAO,MAAA;AACT;AAIA,SAAS,eAAA,CACP,QACA,QAAA,EACM;AACN,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,KAAA,MAAW,GAAA,IAAO,CAAC,MAAA,CAAO,WAAA,EAAa,OAAO,SAAA,EAAW,MAAA,CAAO,SAAS,CAAA,EAAG;AAC1E,IAAA,MAAM,GAAA,GAAM,eAAe,GAAG,CAAA;AAC9B,IAAA,IAAI,GAAA,EAAK,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA;AAChC,EAAA;AACF;AAEA,SAAS,OAAA,CAAQ,IAAA,EAAe,QAAA,EAA+B,UAAA,EAA4C;AACzG,EAAA,IAAI,KAAK,IAAA,KAAS,OAAA,SAAgB,QAAA,CAAS,IAAA,EAAM,UAAU,UAAU,CAAA;AACrE,EAAA,IAAI,KAAK,IAAA,KAAS,MAAA,SAAe,OAAA,CAAQ,IAAA,EAAM,UAAU,UAAU,CAAA;AACnE,EAAA,IAAI,KAAK,IAAA,KAAS,OAAA,EAAS,OAAO,QAAA,CAAS,MAAM,UAAU,CAAA;AAC3D,EAAA,OAAO,OAAA,CAAQ,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA;AAC3C;AAOA,SAAS,QAAA,CAAS,MAAoB,UAAA,EAA4C;AAChF,EAAA,MAAM,KAAA,GAAkB;IACtB,CAAA,MAAA,EAASQ,WAAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;IAC9B,CAAA,GAAA,EAAM,UAAA,CAAW,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,CAAA;IACxB,CAAA,GAAA,EAAM,UAAA,CAAW,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,CAAA;IACxB,CAAA,OAAA,EAAU,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAAA;IAChC,CAAA,QAAA,EAAW,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA,CAAA;AAClC,IAAA,CAAA,0BAAA;AAAA,GAAA;AAEF,EAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,IAAQ,IAAA,CAAK,YAAY,CAAA,EAAG;AAC9C,IAAA,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AACpD,EAAA;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,IAAQ,IAAA,CAAK,aAAa,CAAA,EAAG;AAChD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAClC,IAAA,MAAM,GAAA,GAAO,IAAA,CAAK,QAAA,GAAW,GAAA,GAAO,IAAA,CAAK,EAAA;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,UAAA,CAAW,GAAG,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,EAAE,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AACzF,EAAA;AACA,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,UAAU,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,UAAU,CAAA;AACrD,EAAA,IAAI,OAAA,EAAS,OAAO,CAAA,OAAA,EAAU,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,OAAO,CAAA,QAAA,CAAA;AACpE,EAAA,OAAO,UAAU,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,GAAG,SAAS,CAAA,EAAA,CAAA;AAC9C;AAEA,SAAS,QAAA,CAAS,IAAA,EAAoB,QAAA,EAA+B,UAAA,EAA4C;AAC/G,EAAA,MAAM,QAAkB,EAAA;AACxB,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,IAAA,CAAK,SAAS,CAAA;AACrC,IAAA,IAAI,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,CAAC,CAAA,CAAA,CAAG,CAAA;AACtC,EAAA;AACA,EAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,IAAQ,IAAA,CAAK,YAAY,CAAA,EAAG;AAC9C,IAAA,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AACpD,EAAA;AACA,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,UAAU,CAAA;AAGpD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GACxB,CAAA,GAAA,EAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG,SAAS,CAAA,CAAA,CAAA,GACjC,KAAK,SAAS,CAAA,CAAA,CAAA;AAClB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAACN,EAAAA,KAAM,OAAA,CAAQA,EAAAA,EAAG,QAAA,EAAU,UAAU,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAC/E,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,IAAI,GAAG,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,UAAU,CAAC,CAAA,IAAA,CAAA;AAChE;AAEA,SAAS,OAAA,CAAQ,IAAA,EAAmB,QAAA,EAA+B,UAAA,EAA4C;AAC7G,EAAA,MAAM,QAAkB,CAAC,CAAA,GAAA,EAAM,eAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAC3D,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,QAAQ,QAAQ,CAAA;AACxD,EAAA,KAAA,MAAWJ,EAAAA,IAAK,SAAA,EAAW,KAAA,CAAM,IAAA,CAAKA,EAAC,CAAA;AAGvC,EAAA,IAAI,KAAK,IAAA,CAAK,IAAA,KAAS,aAAa,IAAA,CAAK,IAAA,CAAK,aAAa,SAAA,EAAW;AACpE,IAAA,KAAA,CAAM,KAAK,CAAA,mBAAA,CAAqB,CAAA;AAClC,EAAA;AACA,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA;AACxD,IAAA,KAAA,MAAWA,EAAAA,IAAK,WAAA,EAAa,KAAA,CAAM,IAAA,CAAKA,EAAC,CAAA;EAC3C,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC5B,EAAA;AACA,EAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,IAAQ,IAAA,CAAK,YAAY,CAAA,EAAG;AAC9C,IAAA,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AACpD,EAAA;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,IAAQ,IAAA,CAAK,aAAa,CAAA,EAAG;AAChD,IAAA,MAAMC,EAAAA,GAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAC9B,IAAA,MAAM,KAAKA,EAAAA,CAAE,IAAA,GAAA,CAAQA,EAAAA,CAAE,IAAA,GAAOA,GAAE,IAAA,IAAQ,CAAA;AACxC,IAAA,MAAM,KAAKA,EAAAA,CAAE,IAAA,GAAA,CAAQA,EAAAA,CAAE,IAAA,GAAOA,GAAE,IAAA,IAAQ,CAAA;AACxC,IAAA,MAAM,GAAA,GAAO,IAAA,CAAK,QAAA,GAAW,GAAA,GAAO,IAAA,CAAK,EAAA;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,UAAA,CAAW,GAAG,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,EAAE,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AACzF,EAAA;AACA,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,UAAU,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,UAAU,CAAA;AACrD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,CAAA,MAAA,EAAS,MAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG,SAAS,IAAI,OAAO,CAAA,OAAA,CAAA;AACxD,EAAA;AACA,EAAA,OAAO,SAAS,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,GAAG,SAAS,CAAA,EAAA,CAAA;AAC7C;AAEA,SAAS,UAAA,CACP,KAAA,EACA,IAAA,EACA,QAAA,EACA,iBAAiB,IAAA,EACP;AACV,EAAA,IAAI,MAAM,IAAA,KAAS,MAAA,SAAe,CAAC,CAAA,EAAG,IAAI,CAAA,OAAA,CAAS,CAAA;AACnD,EAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,IAAA,MAAM,MAAM,CAAC,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACvC,IAAA,IAAI,kBAAkB,KAAA,CAAM,OAAA,IAAW,IAAA,IAAQ,KAAA,CAAM,YAAY,CAAA,EAAG;AAClE,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,IAAI,CAAA,UAAA,EAAa,WAAW,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AAC3D,IAAA;AACA,IAAA,OAAO,GAAA;AACT,EAAA;AAEA,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA;AACxC,EAAA,OAAO,CAAC,CAAA,EAAG,IAAI,CAAA,OAAA,EAAU,EAAE,CAAA,EAAA,CAAI,CAAA;AACjC;AAqBA,SAAS,iBAAiB,KAAA,EAA0C;AAClE,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU,OAAO,CAAC,CAAA,cAAA,EAAiB,UAAA,CAAW,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AAC5E,EAAA,OAAO,CAAC,CAAA,cAAA,EAAiB,UAAA,CAAW,MAAM,EAAE,CAAC,KAAK,oCAAoC,CAAA;AACxF;AAEA,SAAS,eAAA,CAAgB,QAA4B,QAAA,EAAyC;AAC5F,EAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,KAAA,SAAc,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,CAAA;AAC9B,EAAA,IAAI,EAAA,CAAG,OAAO,KAAA,KAAU,QAAA,GAAW,MAAM,EAAA,GAAK,KAAA,IAAS,CAAA,CAAA,EAAI,OAAO,EAAA;AAClE,EAAA,MAAM,QAAkB,EAAA;AACxB,EAAA,IAAI,WAAW,KAAA,EAAO;AACpB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,KAAA,CAAM,KAAK,CAAA,CAAA,CAAG,CAAA;AACpC,IAAA,IAAI,KAAA,CAAM,OAAA,IAAW,IAAA,IAAQ,KAAA,CAAM,YAAY,CAAA,EAAG;AAChD,MAAA,KAAA,CAAM,KAAK,CAAA,gBAAA,EAAmB,UAAA,CAAW,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AAC5D,IAAA;EACF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,QAAA,CAAS,QAAA,CAAS,KAAK,CAAC,CAAA,EAAA,CAAI,CAAA;AACzD,EAAA;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,GAAG,gBAAA,CAAiB,KAAK,CAAC,CAAA;AACrC,EAAA,IAAI,OAAO,GAAA,EAAK,KAAA,CAAM,KAAK,CAAA,gBAAA,EAAmB,MAAA,CAAO,GAAG,CAAA,CAAA,CAAG,CAAA;AAC3D,EAAA,IAAI,OAAO,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA,iBAAA,EAAoB,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA;AAC9D,EAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAC1E,EAAA;AACA,EAAA,IAAI,MAAA,CAAO,UAAA,IAAc,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,sBAAsB,UAAA,CAAW,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA,CAAG,CAAA;AAChG,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,IAAI,CAAA,IAAK;AAC1B,IAAA,CAAC,eAAe,cAAc,CAAA;AAC9B,IAAA,CAAC,aAAa,YAAY,CAAA;AAC1B,IAAA,CAAC,aAAa,YAAY;GAAA,EAChB;AACV,IAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,IAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,IAAA,MAAM,GAAA,GAAM,OAAO,GAAA,KAAQ,QAAA,GAAW,MAAM,GAAA,CAAI,GAAA;AAChD,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA;AAChC,IAAA,IAAI,OAAO,MAAA,EAAW;AACtB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,OAAA,EAAU,EAAE,CAAA,EAAA,CAAI,CAAA;AACpC,EAAA;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAA,CAAe,QAAmB,QAAA,EAAyC;AAIlF,EAAA,MAAM,QAAQ,UAAA,CAAW,MAAA,CAAO,KAAA,EAAO,QAAA,EAAU,UAAU,KAAK,CAAA;AAChE,EAAA,KAAA,CAAM,IAAA,CAAK,GAAG,gBAAA,CAAiB,MAAA,CAAO,KAAK,CAAC,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,KACjB,MAAA,CAAO,MAAM,IAAA,KAAS,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,MAAA,CAAA;AAC7D,EAAA,IAAI,OAAA,IAAW,IAAA,IAAQ,OAAA,KAAY,CAAA,EAAG;AACpC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,UAAA,CAAW,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AACtD,EAAA;AACA,EAAA,IAAI,OAAO,GAAA,EAAK;AACd,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,MAAA,CAAO,GAAG,CAAA,CAAA,CAAG,CAAA;AAC7C,EAAA;AACA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,CAAA;AAC/C,EAAA;AACA,EAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAC1E,EAAA;AACA,EAAA,IAAI,MAAA,CAAO,cAAc,IAAA,EAAM;AAC7B,IAAA,KAAA,CAAM,KAAK,CAAA,mBAAA,EAAsB,UAAA,CAAW,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA,CAAG,CAAA;AACnE,EAAA;AACA,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,IAAI,CAAA,IAAK;AAC1B,IAAA,CAAC,eAAe,cAAc,CAAA;AAC9B,IAAA,CAAC,aAAa,YAAY,CAAA;AAC1B,IAAA,CAAC,aAAa,YAAY;GAAA,EAChB;AACV,IAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,IAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA;AAChC,IAAA,IAAI,OAAO,MAAA,EAAW;AACtB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,OAAA,EAAU,EAAE,CAAA,EAAA,CAAI,CAAA;AACpC,EAAA;AACA,EAAA,OAAO,KAAA;AACT;AAQA,SAAS,cAAc,KAAA,EAA2E;AAChG,EAAA,IAAI,OAAO,QAAA,EAAU,IAAA,GAAO,QAAA,EAAU,IAAA,GAAO,WAAW,IAAA,GAAO,CAAA,QAAA;AAC/D,EAAA,MAAM,KAAA,GAAQ,CAACC,EAAAA,EAAY,GAAA,KAAsB;AAC/C,IAAA,IAAIA,EAAAA,CAAE,SAAS,OAAA,EAAS;AACtB,MAAA,MAAM,WAAWA,EAAAA,CAAE,SAAA,GAAY,SAAS,GAAA,EAAKA,EAAAA,CAAE,SAAS,CAAA,GAAI,GAAA;AAC5D,MAAAA,EAAAA,CAAE,SAAS,OAAA,CAAQ,CAACE,OAAM,KAAA,CAAMA,EAAAA,EAAG,QAAQ,CAAC,CAAA;AAC5C,MAAA;AACF,IAAA;AACA,IAAA,MAAMH,EAAAA,GAAIC,EAAAA,CAAE,IAAA,KAAS,MAAA,IAAUA,EAAAA,CAAE,IAAA,KAAS,OAAA,GACtC,EAAE,IAAA,EAAMA,EAAAA,CAAE,CAAA,EAAG,IAAA,EAAMA,EAAAA,CAAE,CAAA,EAAG,IAAA,EAAMA,EAAAA,CAAE,CAAA,GAAIA,EAAAA,CAAE,KAAA,EAAO,IAAA,EAAMA,EAAAA,CAAE,CAAA,GAAIA,EAAAA,CAAE,MAAA,EAAA,GAC3D,UAAA,CAAWA,EAAAA,CAAE,IAAI,CAAA;AACrB,IAAA,MAAM,KAAA,GAAQA,GAAE,QAAA,GAAW,iBAAA,CAAkB,KAAKD,EAAAA,EAAGC,EAAAA,CAAE,QAAQ,CAAA,GAAI,GAAA;AACnE,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,OAAA,CAAQD,EAAC,CAAA,EAAG;AAC/B,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,MAAM,CAAC,CAAA,GAAI,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA;AAChD,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,MAAM,CAAC,CAAA,GAAI,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA;AAChD,MAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,MAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,MAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACtB,MAAA,IAAI,EAAA,GAAK,MAAM,IAAA,GAAO,EAAA;AACxB,IAAA;AACF,EAAA,CAAA;AACA,EAAA,KAAA,CAAM,QAAQ,CAACC,EAAAA,KAAM,KAAA,CAAMA,EAAAA,EAAG,eAAe,CAAC,CAAA;AAC9C,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,EAAA;AACzC,EAAA;AACA,EAAA,OAAO,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,OAAO,IAAA,GAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,GAAO,IAAA,EAAA;AAChE;AAEA,SAAS,QAAQD,EAAAA,EAAmF;AAClG,EAAA,OAAO,CAAC,CAACA,EAAAA,CAAE,IAAA,EAAMA,EAAAA,CAAE,IAAI,CAAA,EAAG,CAACA,EAAAA,CAAE,IAAA,EAAMA,EAAAA,CAAE,IAAI,GAAG,CAACA,EAAAA,CAAE,IAAA,EAAMA,EAAAA,CAAE,IAAI,CAAA,EAAG,CAACA,EAAAA,CAAE,IAAA,EAAMA,EAAAA,CAAE,IAAI,CAAC,CAAA;AAChF;AAGA,SAAS,iBAAA,CACP,GAAA,EACAA,EAAAA,EACA,KAAA,EACQ;AACR,EAAA,MAAM,EAAA,GAAA,CAAMA,EAAAA,CAAE,IAAA,GAAOA,EAAAA,CAAE,IAAA,IAAQ,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAA,CAAMA,EAAAA,CAAE,IAAA,GAAOA,EAAAA,CAAE,IAAA,IAAQ,CAAA;AAC/B,EAAA,MAAMG,EAAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACxB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACxB,EAAA,OAAO,SAAS,GAAA,EAAK,CAACA,IAAG,CAAA,EAAG,CAAC,GAAGA,EAAAA,EAAG,EAAA,GAAK,EAAA,GAAKA,EAAAA,GAAI,KAAK,CAAA,EAAG,EAAA,GAAK,KAAK,CAAA,GAAI,EAAA,GAAKA,EAAC,CAAC,CAAA;AAChF;AAUA,SAAS,OAAA,CAAQ,IAAA,EAAmB,QAAA,EAA+B,UAAA,EAA4C;AAC7G,EAAA,MAAM,KAAA,GAAkB;IACtB,CAAA,GAAA,EAAM,UAAA,CAAW,KAAK,CAAA,GAAI,YAAA,CAAa,KAAK,KAAA,EAAO,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA,CAAA,CAAA;IAC/D,CAAA,GAAA,EAAM,UAAA,CAAW,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,CAAA;AACxB,IAAA,CAAA,oCAAA,CAAA;;;AAGA,IAAA,CAAA,oBAAA,CAAA;IACA,CAAA,mBAAA,EAAsB,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,CAAA;IAC5C,CAAA,oBAAA,EAAuB,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AAAA,GAAA;AAGhD,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,EAAA,IAAI,KAAA,EAAO,QAAA,IAAY,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,cAAc,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA;AACnF,EAAA,IAAI,KAAA,EAAO,YAAY,KAAA,CAAM,IAAA,CAAK,gBAAgBM,WAAAA,CAAW,KAAA,CAAM,UAAU,CAAC,CAAA,CAAA,CAAG,CAAA;AACjF,EAAA,IAAI,KAAA,EAAO,UAAA,IAAc,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,gBAAgB,MAAA,CAAO,KAAA,CAAM,UAAU,CAAC,CAAA,CAAA,CAAG,CAAA;AACrF,EAAA,IAAI,KAAA,EAAO,SAAA,IAAa,KAAA,CAAM,SAAA,KAAc,QAAA,QAAgB,IAAA,CAAK,CAAA,YAAA,EAAe,KAAA,CAAM,SAAS,CAAA,CAAA,CAAG,CAAA;AAClG,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,KAAA;AACtC,EAAA,IAAI,SAAA,KAAc,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,iBAAiB,CAAA;AACrD,EAAA,IAAI,KAAA,EAAO,KAAA,IAAS,IAAA,IAAQ,SAAA,KAAc,KAAA,EAAO;AAK/C,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,MAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,KAAA,KAAU,QAAA,GAAW,QAAA,GAChC,UAAU,OAAA,GAAU,OAAA,GACpB,KAAA,KAAU,KAAA,GAAQ,KAAA,GACjB,KAAA,KAAU,MAAA,MAAa,SAAA,KAAc,SAAS,OAAA,GAAU,KAAA;AAC7D,IAAA,IAAI,WAAW,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,MAAM,CAAA,CAAA,CAAG,CAAA;AAC9D,EAAA;AACA,EAAA,IAAI,KAAA,EAAO,aAAA,IAAiB,IAAA,IAAQ,KAAA,CAAM,kBAAkB,CAAA,EAAG;AAC7D,IAAA,KAAA,CAAM,KAAK,CAAA,gBAAA,EAAmB,UAAA,CAAW,KAAA,CAAM,aAAa,CAAC,CAAA,CAAA,CAAG,CAAA;AAClE,EAAA;AACA,EAAA,MAAM,aAAa,mBAAA,CAAoB,KAAA,EAAO,WAAW,KAAA,EAAO,aAAA,EAAe,OAAO,QAAQ,CAAA;AAC9F,EAAA,IAAI,UAAA,EAAY,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,UAAU,CAAA,CAAA,CAAG,CAAA;AAG5D,EAAA,IAAI,KAAA,EAAO,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,yBAAyB,CAAA;AAMrD,EAAA,IAAI,IAAA,CAAK,SAAS,IAAA,EAAM;AACtB,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AAC1B,EAAA,CAAA,MAAA,IAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,OAAA,IAAW,KAAK,IAAA,EAAM;AACxB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AACtC,MAAA,IAAI,KAAK,IAAA,CAAK,OAAA,IAAW,QAAQ,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA,EAAG;AACxD,QAAA,KAAA,CAAM,KAAK,CAAA,cAAA,EAAiB,UAAA,CAAW,KAAK,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AAC9D,MAAA;IACF,CAAA,MAAO;AACL,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,EAAE,CAAA,EAAA,CAAI,CAAA;AACjC,IAAA;AACF,EAAA;AACA,EAAA,KAAA,MAAWV,EAAAA,IAAK,gBAAgB,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA,EAAG,KAAA,CAAM,KAAKA,EAAC,CAAA;AACpE,EAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,IAAQ,IAAA,CAAK,YAAY,CAAA,EAAG;AAC9C,IAAA,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,UAAA,CAAW,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AACpD,EAAA;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,IAAQ,IAAA,CAAK,aAAa,CAAA,EAAG;AAChD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAClC,IAAA,MAAM,GAAA,GAAO,IAAA,CAAK,QAAA,GAAW,GAAA,GAAO,IAAA,CAAK,EAAA;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,UAAA,CAAW,GAAG,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,EAAE,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,EAAE,CAAC,CAAA,EAAA,CAAI,CAAA;AACzF,EAAA;AAEA,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,IAAA,CAAK,KAAK,MAAA,GAAS,CAAA,GACzC,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAACG,OAAM,MAAA,CAAOA,EAAAA,EAAG,QAAQ,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA,GACjD,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACxB,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,UAAU,CAAA;AACpD,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,UAAU,CAAA;AACrD,EAAA,OAAO,CAAA,MAAA,EAAS,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,GAAG,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,EAAG,OAAO,CAAA,OAAA,CAAA;AAC/D;AAEA,SAAS,MAAA,CAAO,KAA0C,QAAA,EAAuC;AAC/F,EAAA,MAAM,QAAkB,EAAA;AACxB,EAAA,IAAI,GAAA,CAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,CAAmB,CAAA;AAC5C,EAAA,IAAI,GAAA,CAAI,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,CAAqB,CAAA;AAChD,EAAA,IAAI,GAAA,CAAI,YAAY,KAAA,CAAM,IAAA,CAAK,gBAAgBO,WAAAA,CAAW,GAAA,CAAI,UAAU,CAAC,CAAA,CAAA,CAAG,CAAA;AAS5E,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,MAAA,IAAU,IAAA,IAAQ,GAAA,CAAI,aAAA,IAAiB,IAAA,GAC3D,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA,CAAE,IAAA,GAC3B,MAAA;AACJ,EAAA,MAAM,KAAA,GAAQ,IAAI,SAAA,IAAa,WAAA;AAC/B,EAAA,IAAI,GAAA,CAAI,QAAA,IAAY,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,cAAc,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA;WACrE,KAAA,IAAS,IAAA,QAAY,IAAA,CAAK,CAAA,WAAA,EAAc,WAAW,KAAA,GAAQ,GAAG,CAAC,CAAA,EAAA,CAAI,CAAA;AAG5E,EAAA,IAAI,GAAA,CAAI,iBAAiB,IAAA,EAAM;AAC7B,IAAA,KAAA,CAAM,KAAK,CAAA,gBAAA,EAAmB,UAAA,CAAW,IAAI,aAAA,GAAgB,GAAG,CAAC,CAAA,EAAA,CAAI,CAAA;AACvE,EAAA,CAAA,MAAA,IAAW,IAAI,MAAA,EAAQ;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,GAAA,CAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AAC7C,EAAA;AAIA,EAAA,IAAI,GAAA,CAAI,iBAAiB,IAAA,EAAM;AAC7B,IAAA,KAAA,CAAM,KAAK,CAAA,gBAAA,EAAmB,UAAA,CAAW,GAAA,CAAI,aAAa,CAAC,CAAA,CAAA,CAAG,CAAA;AAChE,EAAA;AACA,EAAA,MAAM,gBAAgB,mBAAA,CAAoB,GAAA,CAAI,WAAW,GAAA,CAAI,aAAA,EAAe,IAAI,QAAQ,CAAA;AACxF,EAAA,IAAI,aAAA,EAAe,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,aAAa,CAAA,CAAA,CAAG,CAAA;AAClE,EAAA,IAAI,IAAI,IAAA,EAAM;AACZ,IAAA,IAAI,OAAA,IAAW,IAAI,IAAA,EAAM;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,CAAA,CAAG,CAAA;IACvC,CAAA,MAAO;AACL,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AACrC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,EAAE,CAAA,EAAA,CAAI,CAAA;AACjC,IAAA;AACF,EAAA;AACA,EAAA,KAAA,MAAWV,EAAAA,IAAK,gBAAgB,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA,EAAG,KAAA,CAAM,KAAKA,EAAC,CAAA;AACnE,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,GAAS,CAAA,GAAI,UAAU,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,SAAA;AAC/D,EAAA,OAAO,GAAG,IAAI,CAAA,EAAG,UAAA,CAAW,GAAA,CAAI,IAAI,CAAC,CAAA,QAAA,CAAA;AACvC;AAOA,SAAS,mBAAA,CACP,SAAA,EACA,aAAA,EACA,QAAA,EACe;AACf,EAAA,MAAM,SAAmB,EAAA;AACzB,EAAA,IAAI,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AACtC,EAAA,IAAI,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA;AAC7C,EAAA,IAAI,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA;AACpC,EAAA,OAAO,OAAO,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAChD;AAEA,SAASU,YAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AAC9E;AAEA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA;AAC5E;AAEA,SAAS,WAAW,IAAA,EAAwE;AAC1F,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,OAAO;AACL,MAAA,IAAA,EAAM,IAAA,CAAK,CAAA;AAAG,MAAA,IAAA,EAAM,IAAA,CAAK,CAAA;MACzB,IAAA,EAAM,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA;MAAO,IAAA,EAAM,IAAA,CAAK,IAAI,IAAA,CAAK;AAAA,KAAA;AAEnD,EAAA;AACA,EAAA,MAAMT,EAAAA,GAAIU,aAAa,IAAI,CAAA;AAC3B,EAAA,OAAO,EAAE,IAAA,EAAMV,EAAAA,CAAE,CAAA,EAAG,IAAA,EAAMA,GAAE,CAAA,EAAG,IAAA,EAAMA,EAAAA,CAAE,CAAA,GAAIA,GAAE,KAAA,EAAO,IAAA,EAAMA,EAAAA,CAAE,CAAA,GAAIA,GAAE,MAAA,EAAA;AACpE;AClkBA,IAAM,UAAA,GAAa,SAAA;AAGnB,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,SAAA,GAAY,EAAA;AAmBlB,IAAM,OAAA,GAAU,CAACW,EAAAA,EAAc,OAAA,MAAuC;AAAA,EACpE,CAAA,EAAGA,EAAAA,CAAE,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,EACjB,CAAA,EAAGA,EAAAA,CAAE,CAAA,GAAI,OAAA,CAAQ;AACnB,CAAA,CAAA;AAIA,SAAS,QAAA,CAAS,GAAkB,OAAA,EAA+D;AACjG,EAAA,MAAM,MAAA,GAAS,EAAE,IAAA,CAAK,MAAA;AACtB,EAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,IAAU,CAAA,EAAG,OAAO,MAAA,CAAO,GAAA,CAAI,CAACA,EAAAA,KAAM,OAAA,CAAQA,EAAAA,EAAG,OAAO,CAAC,CAAA;AAC9E,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAA,KAAW,CAAA,CAAE,IAAA;AAClC,EAAA,OAAO;AAAA,IACL,EAAE,GAAG,CAAA,EAAE;AAAA,IACP,EAAE,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAG,IAAI,MAAA;AAAO,GAChC;AACF;AAEA,SAAS,SAAS,MAAA,EAA0C;AAC1D,EAAA,MAAMX,EAAAA,GAAI,IAAIY,WAAAA,EAAY;AAC1B,EAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,SAAS,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACtC,EAAAZ,EAAAA,CAAE,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AACzB,EAAA,KAAA,MAAWW,EAAAA,IAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAGX,EAAAA,CAAE,MAAA,CAAOW,EAAAA,CAAE,CAAA,EAAGA,EAAAA,CAAE,CAAC,CAAA;AAClD,EAAA,OAAOX,GAAE,KAAA,EAAM;AACjB;AASO,SAAS,YAAA,CACd,CAAA,EACA,OAAA,EACA,KAAA,GAAmB,EAAC,EACL;AACf,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,UAAA;AAC7B,EAAA,MAAM,MAAA,GAAiB;AAAA,IACrB,KAAA,EAAO,EAAE,KAAA,EAAM;AAAA,IACf,KAAA,EAAO,UAAA;AAAA,IACP,GAAA,EAAK,OAAA;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,GAAI,KAAA,CAAM,KAAA,GAAQ,EAAE,IAAA,EAAM,CAAC,CAAA,EAAG,CAAC,CAAA,EAAE,GAAI;AAAC,GACxC;AAEA,EAAA,QAAQ,CAAA,CAAE,KAAK,IAAA;AAAM,IACnB,KAAK,MAAA;AACH,MAAA,OAAO;AAAA,QACL,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,CAAA,EAAG,EAAE,IAAA,CAAK,KAAA,EAAO,EAAE,IAAA,CAAK,MAAM,GAAG,MAAA;AAAO,OAC1F;AAAA,IACF,KAAK,SAAA;AACH,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,YAAY,CAAA,CAAE,IAAI,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAA,IAC7D,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,CAACD,EAAAA,EAAGC,EAAC,CAAA,GAAI,QAAA,CAAS,GAAG,OAAO,CAAA;AAClC,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAASD,EAAAA,EAAGC,EAAC,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAA,IACxD;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,CAACD,EAAAA,EAAGC,EAAC,CAAA,GAAI,QAAA,CAAS,GAAG,OAAO,CAAA;AAKlC,MAAA,MAAM,MAAA,GAAiB,EAAE,GAAG,MAAA,EAAQ,WAAW,OAAA,EAAQ;AACvD,MAAA,MAAM,IAAA,GAAO,QAAA,CAASD,EAAAA,EAAGC,EAAC,CAAA;AAC1B,MAAA,OAAO;AAAA,QACL,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ,MAAA,EAAO;AAAA,QACrC,GAAG,kBAAA,CAAmB,IAAA,EAAM,MAAA,EAAQ,YAAY,MAAS;AAAA,OAC3D;AAAA,IACF;AAAA,IACA,KAAK,QAAA;AACH,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAA,CAAS,QAAA,CAAS,CAAA,EAAG,OAAO,CAAC,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAA,IACxE,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,EAAE,IAAA,CAAK,KAAA;AACpB,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,MAAA,OAAO;AAAA,QACL,WAAA;AAAA,UACE,EAAE,IAAA,CAAK,CAAA;AAAA,UACP,EAAE,IAAA,CAAK,CAAA;AAAA,UACP,IAAA;AAAA,UACA,EAAE,UAAU,SAAA,EAAU;AAAA,UACtB,MAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,YACE,IAAA,EAAM,EAAE,KAAA;AAAM;AAChB;AACF,OACF;AAAA,IACF;AAAA;AAEJ;;;ACxHO,SAAS,QAAA,CAAS,QAAiB,IAAA,EAAkD;AAC1F,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,OAAO,MAAA,KAAW,UAAU,OAAO,GAAA;AAC1D,EAAA,MAAM,GAAA,GAAM,MAAA;AACZ,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,KAAK,GAAA,EAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,GAAA;AACT;AAUO,SAAS,OAAA,CACd,IAAA,EACA,MAAA,EACA,IAAA,EACS;AACT,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,GAAG,OAAO,KAAA;AACvC,EAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,OAAO,MAAA,KAAW,UAAU,OAAO,KAAA;AAC1D,EAAA,MAAM,GAAA,GAAM,MAAA;AACZ,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,EAAE,KAAK,IAAA,CAAA,EAAO;AAClB,IAAA,IAAI,CAAC,MAAA,CAAO,EAAA,CAAG,IAAA,CAAK,CAAC,GAAG,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,OAAO,IAAA;AAAA,EAC1C;AACA,EAAA,OAAO,KAAA;AACT;;;ACfO,SAAS,kBACd,IAAA,EAKiB;AACjB,EAAA,OAAO,CAAC,IAAA,EAAM,IAAA,KACZ,YAAA,CAAa,EAAE,MAAM,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,EAAG,KAAK,OAAA,EAAS,gBAAA,CAAiB,IAAA,CAAK,IAAA,EAAM,IAAI,CAAC,CAAA;AAC3F;AAKO,SAAS,gBAAA,CAAiB,MAAsB,IAAA,EAAkC;AACvF,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,MAAM,CAAA,EAAG,KAAA;AAAA;AAAA;AAAA,IAGlE,KAAA,EAAO,QAAQ,IAAA,CAAK,IAAA,EAAM,KAAK,MAAA,EAAQ,IAAA,CAAK,iBAAA,IAAqB,EAAE;AAAA,GACrE;AACF;;;AC1CA,IAAM,QAAA,GAAqB,EAAE,IAAA,EAAM,MAAA,EAAO;AAE1C,SAAS,WAAW,KAAA,EAAwC;AAC1D,EAAA,IAAI,CAAC,OAAO,OAAO,QAAA;AACnB,EAAA,IAAI,OAAA,IAAW,KAAA,IAAS,OAAO,KAAA,CAAM,UAAU,QAAA,EAAU;AACvD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,GAAI,MAAM,OAAA,IAAW,IAAA,GAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAQ,GAAI;AAAC,KAC5D;AAAA,EACF;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAM;AACnC;AAKA,SAAS,YAAY,MAAA,EAA2B;AAC9C,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA;AAAA,IAC9B,KAAA,EAAO,OAAO,KAAA,IAAS,CAAA;AAAA,IACvB,GAAI,OAAO,GAAA,GAAM,EAAE,KAAK,MAAA,CAAO,GAAA,KAAQ,EAAC;AAAA,IACxC,GAAI,OAAO,IAAA,GAAO,EAAE,MAAM,MAAA,CAAO,IAAA,KAAS,EAAC;AAAA,IAC3C,GAAI,MAAA,CAAO,IAAA,GAAO,EAAE,IAAA,EAAM,CAAC,GAAG,MAAA,CAAO,IAAI,CAAA,EAAE,GAAI,EAAC;AAAA,IAChD,GAAI,OAAO,UAAA,IAAc,IAAA,GAAO,EAAE,UAAA,EAAY,MAAA,CAAO,UAAA,EAAW,GAAI;AAAC,GACvE;AACF;AAEA,SAAS,SAAA,CAAU,KAAkB,CAAA,EAA2B;AAC9D,EAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,IAAA,EAAM,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAAA,MACzB,GAAI,GAAA,CAAI,MAAA,GAAS,EAAE,MAAA,EAAQ,YAAY,GAAA,CAAI,MAAM,CAAA,EAAE,GAAI;AAAC,KAC1D;AAAA,EACF;AACA,EAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,GAAG,GAAA,CAAI,CAAA;AAAA,MACP,GAAG,GAAA,CAAI,CAAA;AAAA,MACP,KAAA,EAAO,EAAE,IAAA,CAAK,KAAA;AAAA,MACd,MAAA,EAAQ,EAAE,IAAA,CAAK,MAAA;AAAA,MACf,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAC,QAAQ,GAAA,CAAI,IAAI,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAAA,MAC7C,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,GAAI,GAAA,CAAI,IAAA,CAAK,CAAC,GAAG,IAAA,GAAO,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,KAAS;AAAC,KACxD;AAAA,EACF;AAIA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAA,CAAI,IAAI,CAAA,mCAAA,CAAqC,CAAA;AAC1F;AASO,SAAS,YAAA,CACd,CAAA,EACA,OAAA,EACA,KAAA,GAAmB,EAAC,EACT;AACX,EAAA,OAAO,YAAA,CAAa,CAAA,EAAG,OAAA,EAAS,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,KAAQ,SAAA,CAAU,GAAA,EAAK,CAAC,CAAC,CAAA;AACvE;;;ACjEA,IAAM,MAAA,GAAS,4BAAA;AAcR,SAAS,WAAA,CAAY,MAAiC,MAAA,EAAoC;AAC/F,EAAA,IAAI,MAAA,KAAW,OAAO,OAAO,cAAA;AAC7B,EAAA,OAAO,IAAA,EAAM,IAAA,KAAS,KAAA,GAAQ,cAAA,GAAiB,cAAA;AACjD;AAKA,SAAS,WAAA,CAAY,MAAA,EAAgBa,EAAAA,EAAWC,EAAAA,EAAmB;AACjE,EAAA,MAAM,MAAM,IAAI,SAAA,EAAU,CAAE,eAAA,CAAgB,QAAQ,eAAe,CAAA;AACnE,EAAA,MAAM,OAAO,GAAA,CAAI,eAAA;AACjB,EAAA,IAAI,GAAA,CAAI,qBAAqB,aAAa,CAAA,CAAE,SAAS,CAAA,IAAK,IAAA,CAAK,cAAc,KAAA,EAAO;AAClF,IAAA,MAAM,IAAI,MAAM,4EAA4E,CAAA;AAAA,EAC9F;AACA,EAAA,IAAA,CAAK,YAAA,CAAa,KAAK,GAAG,CAAA;AAC1B,EAAA,IAAA,CAAK,YAAA,CAAa,KAAK,GAAG,CAAA;AAC1B,EAAA,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,MAAA,CAAOD,EAAC,CAAC,CAAA;AACpC,EAAA,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,MAAA,CAAOC,EAAC,CAAC,CAAA;AACrC,EAAA,OAAO,IAAI,aAAA,EAAc,CAAE,iBAAA,CAAkB,IAAI,CAAA;AACnD;AAKA,SAAS,eAAA,CACP,IAAA,EACAD,EAAAA,EACAC,EAAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,IAAA,GACJ,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,SAAA,EAAU,GAAI,IAAA,CAAK,IAAA,KAAS,OAAA,GAAU,IAAA,CAAK,GAAA,GAAM,EAAA;AACxF,EAAA,IAAI,KAAK,IAAA,KAAS,OAAA,IAAW,CAAC,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG;AACtD,IAAA,MAAA,GAAS,CAAA,YAAA,EAAe,IAAI,CAAA,mDAAA,CAAqD,CAAA;AAAA,EACnF;AACA,EAAA,OAAO,YAAA,CAAa,CAAC,EAAE,IAAA,EAAM,SAAS,IAAA,EAAM,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,KAAA,EAAOD,EAAAA,EAAG,MAAA,EAAQC,EAAAA,EAAG,CAAA,EAAG;AAAA,IAC9E,OAAA,EAAS,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,KAAA,EAAOD,EAAAA,EAAG,MAAA,EAAQC,EAAAA;AAAE,GAC5C,CAAA;AACH;AAGA,SAAS,WAAA,CAAY,OAAkB,IAAA,EAAuB;AAC5D,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,WAAA,EAAa,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,KAAO;AAC9C,IAAA,MAAM,OAAO,KAAA,CAAM,GAAA,CAAIC,WAAS,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AAC3C,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AACnB,IAAA,OAAO,YAAA;AAAA,MACL,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,KAAK,IAAA,EAAuB;AAAA,MACrD,IAAA,CAAK,OAAA;AAAA,MACL,gBAAA,CAAiB,IAAA,CAAK,IAAA,EAAwB,IAAI;AAAA,KACpD;AAAA,EACF,CAAC,CAAA;AACH;AAkBO,SAAS,kBAAkB,IAAA,EAA8B;AAC9D,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,QAAO,GAAI,IAAA;AAC7C,EAAA,MAAM,EAAE,CAAA,EAAAF,EAAAA,EAAG,CAAA,EAAAC,EAAAA,KAAM,IAAA,CAAK,OAAA;AACtB,EAAA,MAAM,UACJ,IAAA,KAAS,MAAA,GACL,EAAA,GACA,IAAA,CAAK,SAAS,KAAA,GACZ,WAAA,CAAY,IAAA,CAAK,MAAA,EAAQD,IAAGC,EAAC,CAAA,GAC7B,gBAAgB,IAAA,EAAMD,EAAAA,EAAGC,IAAG,MAAM,CAAA;AAG1C,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,WAAA,CAAY,KAAA,EAAO,IAAI,CAAA,EAAG;AAAA,IACtD,OAAA,EAAS,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,KAAA,EAAOD,EAAAA,EAAG,MAAA,EAAQC,EAAAA,EAAE;AAAA,IAC3C;AAAA,GACD,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAMD,EAAAA,GAAI,KAAK,CAAC,CAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAMC,EAAAA,GAAI,KAAK,CAAC,CAAA;AAC9C,EAAA,OAAO,CAAA,YAAA,EAAe,MAAM,CAAA,SAAA,EAAY,IAAI,CAAA,UAAA,EAAa,IAAI,CAAA,eAAA,EAAkBD,EAAC,CAAA,CAAA,EAAIC,EAAC,CAAA,EAAA,EAAK,OAAO,GAAG,QAAQ,CAAA,MAAA,CAAA;AAC9G;AAEA,SAAS,SAAA,CAAU,OAAe,MAAA,EAA0C;AAC1E,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,mEAAmE,CAAA;AAC7F,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,UAAU,MAAA,EAA0C;AAC3D,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,CAAC,IAAA,KACN,IAAA,GAAO,OAAA,CAAQ,IAAI,IAAI,MAAA,CAAO,IAAI,KAAA,CAAM,sCAAsC,CAAC,CAAA;AACjF,MAAA,MAAA,CAAO,MAAA,CAAO,MAAM,WAAW,CAAA;AAAA,IACjC,SAAS,GAAA,EAAK;AAIZ,MAAA,MAAA;AAAA,QACE,IAAI,KAAA;AAAA,UACF,sJAAA;AAAA,UACA,EAAE,OAAO,GAAA;AAAI;AACf,OACF;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,UAAU,GAAA,EAAwC;AACzD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,IAAA,GAAA,CAAI,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,GAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAO,IAAI,MAAM,CAAA,wCAAA,EAA2C,GAAG,EAAE,CAAC,CAAA;AACtF,IAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AAAA,EACZ,CAAC,CAAA;AACH;AAIA,eAAe,YAAA,CAAa,GAAA,EAAa,KAAA,EAAe,MAAA,EAA+B;AACrF,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,IAAA,CAAK,CAAC,GAAG,CAAA,EAAG,EAAE,IAAA,EAAM,6BAAA,EAA+B,CAAC,CAAA;AACxF,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAAU,GAAG,CAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AACnC,IAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AACtC,IAAA,OAAO,MAAM,SAAA,CAAU,GAAA,CAAI,MAAM,CAAA;AAAA,EACnC,CAAA,SAAE;AACA,IAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,EACzB;AACF;AAKA,eAAe,YACb,IAAA,EACe;AACf,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,MAAM,KAAA,EAAO,KAAA,EAAO,QAAO,GAAI,IAAA;AACpD,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AACnC,EAAA,IAAI,IAAA,EAAM,IAAA,KAAS,OAAA,EAAS,GAAA,CAAI,SAAA,CAAU,MAAM,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AAAA,OAAA,IAC/E,IAAA,EAAM,IAAA,KAAS,QAAA,EAAU,GAAA,CAAI,SAAA,CAAU,KAAK,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AAEhF,EAAA,MAAM,SAAS,mBAAA,CAAoB;AAAA,IACjC,KAAA;AAAA,IACA,UAAA,EAAY,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA,EAAE;AAAA,IACxE,KAAA,EAAO,EAAE,CAAA,EAAG,KAAA,EAAO,GAAG,KAAA,EAAM;AAAA,IAC5B,OAAA,EAAS,kBAAkB,IAAI;AAAA,GAChC,CAAA;AAGD,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACnD,EAAA,KAAA,CAAM,YAAA;AAAA,IACJ,IAAI,SAAA,CAAU,iBAAA,CAAkB,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AAAA,IAC9E,CAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,GAAA,CAAI,UAAU,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAG,CAAA,EAAG,OAAO,MAAM,CAAA;AAC/C,EAAA,OAAO,SAAA,CAAU,IAAI,MAAM,CAAA;AAC7B;AAYA,eAAsB,aAAA,CACpB,IAAA,EACA,IAAA,GAAuB,EAAC,EACA;AACxB,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,KAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,CAAA;AAC5B,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,IAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,OAAA,CAAQ,CAAA,GAAI,KAAK,CAAC,CAAA;AACvD,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,OAAA,CAAQ,CAAA,GAAI,KAAK,CAAC,CAAA;AACxD,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,IAAO;AAC/B,EAAA,MAAM,OAAA,GAA0B;AAAA,IAC9B,IAAA;AAAA,IACA,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,KAAA;AAAA,IACA,QAAQ,IAAA,CAAK;AAAA,GACf;AAEA,EAAA,IAAI,WAAA,CAAY,IAAA,EAAM,MAAM,CAAA,KAAM,cAAA,EAAgB;AAChD,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,IAAA,EAAM,MAAM,WAAA,CAAY,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,QAAQ,CAAA;AAAA,MACrD,MAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,kBAAkB,OAAO,CAAA;AACrC,EAAA,MAAM,OACJ,MAAA,KAAW,KAAA,GACP,IAAI,IAAA,CAAK,CAAC,GAAG,CAAA,EAAG,EAAE,IAAA,EAAM,+BAA+B,CAAA,GACvD,MAAM,YAAA,CAAa,GAAA,EAAK,OAAO,MAAM,CAAA;AAC3C,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,IAAA,EAAM,MAAA,EAAQ,OAAO,MAAA,EAAO;AAC5D;;;AChOO,SAAS,WAAA,CAAYE,IAAa,OAAA,EAA8C;AACrF,EAAA,OAAO;AAAA,IACL,CAAA,EAAGA,EAAAA,CAAE,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,IACjB,CAAA,EAAGA,EAAAA,CAAE,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,IACjB,KAAA,EAAOA,EAAAA,CAAE,CAAA,GAAI,OAAA,CAAQ,CAAA;AAAA,IACrB,MAAA,EAAQA,EAAAA,CAAE,CAAA,GAAI,OAAA,CAAQ;AAAA,GACxB;AACF;AAOO,SAAS,WAAA,CAAYd,IAAc,OAAA,EAA6C;AACrF,EAAA,MAAM,KAAK,OAAA,CAAQ,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,IAAI,OAAA,CAAQ,CAAA;AAC7C,EAAA,MAAM,KAAK,OAAA,CAAQ,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,IAAI,OAAA,CAAQ,CAAA;AAC7C,EAAA,OAAO,EAAE,CAAA,EAAGA,EAAAA,CAAE,CAAA,GAAI,EAAA,EAAI,GAAGA,EAAAA,CAAE,CAAA,GAAI,EAAA,EAAI,CAAA,EAAGA,GAAE,KAAA,GAAQ,EAAA,EAAI,CAAA,EAAGA,EAAAA,CAAE,SAAS,EAAA,EAAG;AACvE;AAEA,IAAM,EAAA,GAAK,GAAA;AAIJ,SAAS,UAAUc,EAAAA,EAAuB;AAC/C,EAAA,OAAO;AAAA,IACL,GAAG,IAAA,CAAK,KAAA,CAAMA,EAAAA,CAAE,CAAA,GAAI,EAAE,CAAA,GAAI,EAAA;AAAA,IAC1B,GAAG,IAAA,CAAK,KAAA,CAAMA,EAAAA,CAAE,CAAA,GAAI,EAAE,CAAA,GAAI,EAAA;AAAA,IAC1B,GAAG,IAAA,CAAK,KAAA,CAAMA,EAAAA,CAAE,CAAA,GAAI,EAAE,CAAA,GAAI,EAAA;AAAA,IAC1B,GAAG,IAAA,CAAK,KAAA,CAAMA,EAAAA,CAAE,CAAA,GAAI,EAAE,CAAA,GAAI;AAAA,GAC5B;AACF;AAIO,SAAS,YAAA,CAAa,GAAA,EAAe,EAAA,EAAe,GAAA,GAAM,CAAA,EAAY;AAC3E,EAAA,OACE,EAAA,CAAG,KAAK,GAAA,CAAI,CAAA,GAAI,OAChB,EAAA,CAAG,CAAA,IAAK,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,CAAA,GAAI,OACxB,EAAA,CAAG,CAAA,IAAK,IAAI,CAAA,GAAI,GAAA,IAChB,GAAG,CAAA,IAAK,GAAA,CAAI,CAAA,GAAI,GAAA,CAAI,CAAA,GAAI,GAAA;AAE5B;AAKO,SAAS,YAAA,CAAa,OAAiB,KAAA,EAA0B;AACtE,EAAA,OACE,KAAA,CAAM,KAAK,KAAA,CAAM,CAAA,IACjB,MAAM,CAAA,IAAK,KAAA,CAAM,CAAA,IACjB,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,KAAK,KAAA,CAAM,CAAA,GAAI,MAAM,CAAA,IACrC,KAAA,CAAM,IAAI,KAAA,CAAM,CAAA,IAAK,KAAA,CAAM,CAAA,GAAI,KAAA,CAAM,CAAA;AAEzC;;;AC3CO,IAAM,cAAN,MAAkB;AAAA,EACN,KAAA,uBAAY,GAAA,EAAoB;AAAA,EACzC,WAAqB,EAAC;AAAA,EACtB,WAAqB,EAAC;AAAA;AAAA,EAEtB,SAAA,GAAoC,IAAA;AAAA;AAAA,EAG5C,KAAA,CAAM,QAAgB,KAAA,EAA2B;AAC/C,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,EAAG;AAC5B,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,KAAA,CAAM,cAAc,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,OAAA,CAAQ,QAAgB,KAAA,EAA2B;AACjD,IAAA,MAAM,GAAA,GAAM,MAAM,YAAA,EAAa;AAC/B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,IAAK,CAAA;AACzC,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,GAAG,CAAA;AAC1B,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAQ;AAC7B,QAAA,IAAA,CAAK,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,MAC5B,CAAA,MAAO;AAGL,QAAA,IAAA,CAAK,WAAW,EAAC;AAAA,MACnB;AACA,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,IAAA,CAAK,UAAU,MAAM,CAAA;AAC1B,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA,EAIQ,IAAA,CACN,KAAA,EACA,GAAA,EACA,EAAA,EACe;AACf,IAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,MAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,MAAA,IAAI,WAAW,MAAA,EAAW;AAC1B,MAAA,MAAM,KAAA,GAAQ,GAAG,MAAM,CAAA;AACvB,MAAA,IAAI,KAAA,IAAS,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,MAAA;AAAA,IAClC;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAQ,EAAA,EAAsD;AAC5D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAC,MAAM,CAAA,CAAE,OAAA,EAAQ,EAAG,EAAE,CAAA,KAAM,IAAA;AAAA,EAC9D;AAAA,EAEA,QAAQ,EAAA,EAAsD;AAC5D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAC,MAAM,CAAA,CAAE,OAAA,EAAQ,EAAG,EAAE,CAAA,KAAM,IAAA;AAAA,EAC9D;AAAA,EAEA,KAAK,EAAA,EAAsD;AACzD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,EAAQ,EAAG,EAAE,CAAA;AAC9D,IAAA,MAAM,KAAA,GAAQ,MAAA,KAAW,IAAA,GAAO,MAAA,GAAY,GAAG,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,EAAK;AAAA,IACpB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,KAAK,EAAA,EAAsD;AACzD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,EAAQ,EAAG,EAAE,CAAA;AAC9D,IAAA,MAAM,KAAA,GAAQ,MAAA,KAAW,IAAA,GAAO,MAAA,GAAY,GAAG,MAAM,CAAA;AACrD,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,EAAK;AAAA,IACpB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAAA,EACF;AACF,CAAA;AAGA,SAAS,IAAA,CAAK,OAAiB,KAAA,EAAqB;AAClD,EAAA,KAAA,IAAS,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,KAAA,EAAO;AACtB,MAAA,KAAA,CAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AACjB,MAAA;AAAA,IACF;AAAA,EACF;AACF;AC9EO,SAAS,qBAAA,GAAmC;AACjD,EAAA,OAAO,WAAA,CAA+C,EAAE,YAAA,EAAc,CAAC,EAAE,EAAA,EAAI,OAAA,EAAS,CAAA,EAAG,CAAA;AAC3F;AA4BA,IAAM,UAAA,GAAa,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAIhC,SAAS,QAAQ,EAAA,EAA0D;AACzE,EAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,GAAG,CAAA;AAC7B,EAAA,OAAO,EAAA,IAAM,CAAA,GAAI,MAAA,GAAY,EAAE,QAAQ,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,EAAE,GAAG,IAAA,EAAM,EAAA,CAAG,KAAA,CAAM,EAAA,GAAK,CAAC,CAAA,EAAE;AACjF;AAYO,SAAS,sBAAsB,IAAA,EAA8C;AAClF,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,IAAA;AAC7B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAuB;AAC1C,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAgB;AACjC,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,KAAA,MAAW,EAAA,IAAM,MAAM,EAAA,EAAG;AAAA,EAC5B,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,MAAA,KAA8B;AAC9C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAC/B,IAAA,IAAI,OAAO,OAAO,KAAA;AAClB,IAAA,MAAM,GAAA,GAAM,UAAU,MAAM,CAAA;AAC5B,IAAA,MAAM,QAAQ,GAAA,GACV,aAAA;AAAA,MACE,GAAA;AAAA,MACA;AAAC,QAEH,qBAAA,EAAsB;AAC1B,IAAA,MAAA,CAAO,GAAA,CAAI,QAAQ,KAAK,CAAA;AACxB,IAAA,OAAA,CAAQ,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC3B,IAAA,KAAA,CAAM,UAAU,MAAM;AACpB,MAAA,OAAA,CAAQ,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAC7B,MAAA,MAAA,EAAO;AAAA,IACT,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAIA,EAAA,MAAM,cAAA,GAAiB,CAAC,MAAA,KAAmB,MAAA,CAAO,IAAI,MAAM,CAAA;AAK5D,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA,WAAY,MAAM,CAAA;AAEhE,EAAA,MAAM,QAAA,GAAW,CAAC,EAAA,KAChB,OAAA,EAAQ,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA;AAEnC,EAAA,MAAM,YAAY,CAAC,EAAA,KAAe,QAAA,CAAS,EAAE,GAAG,OAAA,IAAW,UAAA;AAE3D,EAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAgB,IAAA,KAAyC;AACxE,IAAA,MAAM,KAAA,GAAQ,OAAO,GAAA,CAAI,MAAM,GAAG,GAAA,CAAID,UAAAA,CAAS,IAAI,CAAC,CAAA;AACpD,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,IAAA,OAAO;AAAA,MACL,GAAG,KAAA,CAAM,IAAA;AAAA,MACT,MAAA;AAAA,MACA,EAAA,EAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,MACrB,IAAA,EAAM,UAAU,WAAA,CAAY,KAAA,CAAM,MAAkB,SAAA,CAAU,MAAM,CAAC,CAAC;AAAA,KACxE;AAAA,EACF,CAAA;AAIA,EAAA,MAAM,cAAc,MAAgB;AAClC,IAAA,MAAM,WAAW,OAAA,EAAQ,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAC1C,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,MAAA,CAAO,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,EAAA,KAAO,CAAC,QAAA,CAAS,QAAA,CAAS,EAAE,CAAC,CAAA;AACrE,IAAA,OAAO,CAAC,GAAG,QAAA,EAAU,GAAG,IAAI,CAAA;AAAA,EAC9B,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,MAAA,KAAiC;AAChD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAC/B,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,IAAA,MAAM,MAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,WAAA,EAAY,EAAG;AACpC,MAAA,MAAMhB,EAAAA,GAAI,OAAA,CAAQ,MAAA,EAAQ,MAAA,CAAO,EAAE,CAAC,CAAA;AACpC,MAAA,IAAIA,EAAAA,EAAG,GAAA,CAAI,IAAA,CAAKA,EAAC,CAAA;AAAA,IACnB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,MAAoB,WAAA,EAAY,CAAE,QAAQ,OAAO,CAAA;AAE7D,EAAA,MAAM,OAAA,GAAU,CAACA,EAAAA,EAAe,CAAA,KAAgC;AAC9D,IAAA,IAAI,EAAE,MAAA,KAAW,MAAA,IAAaA,GAAE,MAAA,KAAW,CAAA,CAAE,QAAQ,OAAO,KAAA;AAC5D,IAAA,IAAI,EAAE,IAAA,KAAS,MAAA,IAAaA,GAAE,IAAA,KAAS,CAAA,CAAE,MAAM,OAAO,KAAA;AACtD,IAAA,IAAI,EAAE,MAAA,KAAW,MAAA,IAAaA,GAAE,MAAA,KAAW,CAAA,CAAE,QAAQ,OAAO,KAAA;AAC5D,IAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAW;AACxB,MAAA,MAAM,IAAA,GAAOA,EAAAA,CAAE,IAAA,IAAQ,EAAC;AACxB,MAAA,KAAA,MAAW,CAAA,IAAK,EAAE,IAAA,EAAM,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG,OAAO,KAAA;AAAA,IACxD;AACA,IAAA,IAAI,EAAE,KAAA,IAAS,CAAC,EAAE,KAAA,CAAMA,EAAC,GAAG,OAAO,KAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAGA,EAAA,MAAM,MAAA,GAAS,CAAC,EAAA,KAAe;AAC7B,IAAA,MAAM,KAAA,GAAQ,QAAQ,EAAE,CAAA;AACxB,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACrC,IAAA,MAAM,OAAO,KAAA,EAAO,GAAA,CAAIgB,UAAAA,CAAS,KAAA,CAAM,IAAI,CAAC,CAAA;AAC5C,IAAA,OAAO,QAAQ,KAAA,GAAQ,EAAE,GAAG,KAAA,EAAO,KAAA,EAAO,MAAK,GAAI,MAAA;AAAA,EACrD,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IAEA,OAAA;AAAA,IAEA,IAAI,EAAA,EAAI;AACN,MAAA,MAAM,KAAA,GAAQ,QAAQ,EAAE,CAAA;AACxB,MAAA,OAAO,QAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,IAAI,CAAA,GAAI,MAAA;AAAA,IACrD,CAAA;AAAA,IAEA,MAAM,CAAA,EAAG;AACP,MAAA,OAAO,CAAA,GAAI,GAAA,EAAI,CAAE,MAAA,CAAO,CAAChB,EAAAA,KAAM,OAAA,CAAQA,EAAAA,EAAG,CAAC,CAAC,CAAA,GAAI,GAAA,EAAI;AAAA,IACtD,CAAA;AAAA,IAEA,OAAA,CAAQ,MAAA,EAAQ,EAAA,EAAe,GAAA,GAAM,CAAA,EAAG;AACtC,MAAA,OAAO,OAAA,CAAQ,MAAM,CAAA,CAClB,MAAA,CAAO,CAACA,EAAAA,KAAM,YAAA,CAAaA,EAAAA,CAAE,IAAA,EAAM,EAAA,EAAI,GAAG,CAAC,EAC3C,OAAA,EAAQ;AAAA,IACb,CAAA;AAAA,IAEA,MAAA,CAAO,QAAQ,GAAA,EAAe;AAC5B,MAAA,OAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,MAAA,CAAO,CAACA,OAAM,YAAA,CAAa,GAAA,EAAKA,EAAAA,CAAE,IAAI,CAAC,CAAA;AAAA,IAChE,CAAA;AAAA,IAEA,OAAA,CAAQA,IAAG,MAAA,EAAQ;AACjB,MAAA,MAAM,OAAO,QAAA,CAASA,EAAAA,CAAE,MAAM,CAAA,EAAG,qBAAqB,EAAC;AACvD,MAAA,OAAO,OAAA,CAAeA,EAAAA,CAAE,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC5C,CAAA;AAAA,IAEA,OAAA,GAAU;AACR,MAAA,OAAO,OAAA,CAAQ,QAAQ,cAAc,CAAA;AAAA,IACvC,CAAA;AAAA,IAEA,OAAA,GAAU;AACR,MAAA,OAAO,OAAA,CAAQ,QAAQ,cAAc,CAAA;AAAA,IACvC,CAAA;AAAA,IAEA,IAAA,GAAO;AACL,MAAA,OAAO,OAAA,CAAQ,KAAK,cAAc,CAAA;AAAA,IACpC,CAAA;AAAA,IAEA,IAAA,GAAO;AACL,MAAA,OAAO,OAAA,CAAQ,KAAK,cAAc,CAAA;AAAA,IACpC,CAAA;AAAA,IAEA,SAAA,GAAY;AACV,MAAA,MAAM,MAAgB,EAAC;AACvB,MAAA,KAAA,MAAW,MAAA,IAAU,aAAY,EAAG;AAClC,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAC/B,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,YAAA,EAAa,EAAG;AACvC,UAAA,IAAI,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,QAC3D;AAAA,MACF;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IAEA,aAAa,GAAA,EAAK;AAChB,MAAA,MAAM,MAAA,uBAAa,GAAA,EAAsB;AACzC,MAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,QAAA,MAAM,KAAA,GAAQ,OAAO,EAAE,CAAA;AACvB,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AACjC,QAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAClC,QAAA,IAAI,CAAC,IAAI,MAAA,CAAO,GAAA,CAAI,MAAM,MAAA,EAAQ,CAAC,IAAI,CAAC,CAAA;AAAA,aAAA,IAC/B,CAAC,EAAA,CAAG,QAAA,CAAS,IAAI,CAAA,EAAG,EAAA,CAAG,KAAK,IAAI,CAAA;AAAA,MAC3C;AACA,MAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,CAAA,IAAK,MAAA,EAAQ;AACpC,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,MAAM,KAAK,EAAC;AACpC,QAAA,MAAM,GAAA,GAAM,MAAM,YAAA,EAAa;AAC/B,QAAA,IAAI,GAAA,CAAI,MAAA,KAAW,IAAA,CAAK,MAAA,IAAU,KAAK,KAAA,CAAM,CAACE,EAAAA,EAAG,CAAA,KAAM,OAAO,GAAA,CAAI,CAAC,CAAC,CAAA,KAAMA,EAAC,CAAA,EAAG;AAC9E,QAAA,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,GAAA,CAAIc,UAAQ,CAAC,CAAA;AAAA,MACvC;AAAA,IACF,CAAA;AAAA,IAEA,UAAU,EAAA,EAAI;AACZ,MAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,MAAA,OAAO,MAAM;AACX,QAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,MAChB,CAAA;AAAA,IACF,CAAA;AAAA,IAEA,GAAA,CAAI,MAAsB,MAAA,EAAkB;AAC1C,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AACnC,MAAA,MAAM,IAAA,GAAuB;AAAA,QAC3B,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,GAAI,KAAK,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,MAAA,KAAW,EAAC;AAAA,QAC7C,GAAI,KAAK,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM,GAAI,EAAC;AAAA,QACxD,GAAI,KAAK,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,GAAI,EAAC;AAAA,QAC3D,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC;AAAA,QACrD,GAAI,KAAK,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAK,GAAI,EAAC;AAAA,QACrD,MAAM,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAQ,iBAAA,IAAqB,EAAE;AAAA,OACxD;AACA,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,MAAM,EAAE,GAAA,CAAI;AAAA,QACrC,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,IAAA,EAAM,YAAY,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,EAAQ,WAAW,UAAU,CAAA;AAAA,QACrE;AAAA,OACD,CAAA;AACD,MAAA,OAAO,GAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAAA,IACvC,CAAA;AAAA,IAEA,MAAA,CAAO,IAAI,KAAA,EAAwB;AACjC,MAAA,MAAM,KAAA,GAAQ,OAAO,EAAE,CAAA;AACvB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,EAAE,IAAA,EAAM,GAAG,OAAA,EAAQ,GAAI,KAAA;AAC7B,MAAA,MAAM,GAAA,GAAMA,UAAAA,CAAS,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA;AAClC,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AACnC,QAAA,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,GAAA,EAAK,EAAE,IAAA,EAAM,EAAE,GAAG,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,GAAG,OAAA,IAAW,CAAA;AAAA,MACtE;AACA,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,WAAA,CAAY,SAAA,CAAU,IAAI,CAAA,EAAG,SAAA,CAAU,KAAA,CAAM,MAAM,CAAC,CAAC,CAAA;AAAA,MAChF;AAAA,IACF,CAAA;AAAA,IAEA,OAAA,CAAQ,IAAI,IAAA,EAAM;AAChB,MAAA,MAAM,KAAA,GAAQ,OAAO,EAAE,CAAA;AACvB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,KAAA,CAAM,MAAM,MAAA,CAAOA,UAAAA,CAAS,KAAA,CAAM,IAAA,CAAK,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,EAAE,GAAG,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,IAAA,IAAQ,CAAA;AAAA,IACpF,CAAA;AAAA,IAEA,OAAO,EAAA,EAAI;AACT,MAAA,MAAM,KAAA,GAAQ,OAAO,EAAE,CAAA;AACvB,MAAA,IAAI,KAAA,QAAa,KAAA,CAAM,MAAA,CAAOA,WAAS,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IACvD,CAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,MAAA,EAAgB,WAAA,EAA8B;AAC1D,MAAA,MAAM,IAAA,GAAO,SAAS,MAAM,CAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,MAAM,CAAA,CAAA,CAAG,CAAA;AAC7E,MAAA,MAAM,SAAS,MAAM,aAAA;AAAA,QACnB;AAAA,UACE,MAAA;AAAA,UACA,KAAA,EAAO,SAAS,MAAM,CAAA;AAAA,UACtB,IAAA,EAAM;AAAA,YACJ,SAAS,IAAA,CAAK,OAAA;AAAA,YACd,mBAAmB,IAAA,CAAK,iBAAA;AAAA,YACxB,MAAA,EAAQ,KAAK,MAAA,IAAS;AAAA,YACtB,OAAA,EAAS,OAAO,IAAA,CAAK,OAAA,KAAY,aAAa,IAAA,CAAK,OAAA,KAAY,IAAA,CAAK;AAAA,WACtE;AAAA,UACA,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,QAAQ,CAAC,OAAA,KAAY,QAAQ,IAAA,CAAK,CAAA,kBAAA,EAAqB,OAAO,CAAA,CAAE;AAAA,SAClE;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AACvB,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAA,GAAgC;AAC9B,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,KAAA,MAAW,CAAC,QAAQ,KAAK,CAAA,IAAK,QAAQ,GAAA,CAAI,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,EAAO;AACjE,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,MAAA,EAAQ,GAAA,EAAI;AAAA,IACnC;AAAA,GACF;AACF;AAKO,SAAS,mBAAA,CACd,GAAA,EACA,OAAA,EACA,IAAA,GAA4D,EAAC,EAC7C;AAChB,EAAA,MAAM,GAAA,GAAM,GAAA;AACZ,EAAA,IAAI,GAAA,EAAK,OAAA,KAAY,CAAA,IAAK,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,qBAAA,CAAsB,EAAE,OAAA,EAAS,GAAG,IAAA,EAAM,CAAA;AACxF,EAAA,OAAO,qBAAA,CAAsB,EAAE,OAAA,EAAS,OAAA,EAAS,IAAI,MAAA,EAAQ,GAAG,MAAM,CAAA;AACxE;;;ACrUA,IAAM,KAAA,GAA4C;AAAA,EAChD,MAAA,EAAQ,EAAE,UAAA,EAAY,QAAA,EAAS;AAAA,EAC/B,MAAA,EAAQ,EAAE,UAAA,EAAY,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,EAC/C,IAAA,EAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,EACzC,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAM,OAAA,EAAQ;AAAA,EAC3C,IAAA,EAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,EACzC,OAAA,EAAS,EAAE,UAAA,EAAY,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,EAClD,IAAA,EAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,MAAM,MAAA;AACpC,CAAA;AAKO,IAAM,gBAAA,GAAyC;AAAA,EACpD,EAAE,IAAI,QAAA,EAAU,KAAA,EAAO,UAAU,IAAA,EAAM,CAAA,EAAY,OAAO,UAAA,EAAW;AAAA,EACrE,EAAE,IAAI,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAM,CAAA,EAAY,OAAO,UAAA,EAAW;AAAA,EACvE,EAAE,IAAI,MAAA,EAAQ,KAAA,EAAO,QAAQ,IAAA,EAAM,CAAA,EAAU,OAAO,UAAA,EAAW;AAAA,EAC/D,EAAE,IAAI,OAAA,EAAS,KAAA,EAAO,SAAS,IAAA,EAAM,CAAA,EAAW,OAAO,UAAA,EAAW;AAAA,EAClE,EAAE,IAAI,MAAA,EAAQ,KAAA,EAAO,aAAa,IAAA,EAAM,CAAA,EAAU,OAAO,UAAA,EAAW;AAAA,EACpE,EAAE,IAAI,SAAA,EAAW,KAAA,EAAO,WAAW,IAAA,EAAMb,EAAA,EAAa,OAAO,UAAA,EAAW;AAAA,EACxE,EAAE,IAAI,MAAA,EAAQ,KAAA,EAAO,QAAQ,IAAA,EAAM,CAAA,EAAU,OAAO,UAAA;AACtD;AAGO,SAAS,mBAAmB,EAAA,EAAmD;AACpF,EAAA,OAAO,EAAA,KAAO,IAAA,GAAO,MAAA,GAAY,KAAA,CAAM,EAAE,CAAA;AAC3C;AAGO,IAAM,uBAAA,GAAoD;AAAA,EAC/D,GAAG,IAAI,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC;AAC1D;;;ACpCO,SAAS,aAAa,CAAA,EAAwB;AACnD,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,KAAA,EAAO,EAAE,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,EAAG,CAAA,CAAE,MAAK,EAAE;AACnE;AAIO,SAAS,eAAe,CAAA,EAAwB;AACrD,EAAA,OAAO,EAAE,IAAA,EAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,GAAE,EAAE;AACpD;AAUO,SAAS,OAAA,CAAQ,SAAsB,IAAA,EAA+B;AAC3E,EAAA,MAAM,OACJ,OAAA,CAAQ,CAAA,GAAI,CAAA,IAAK,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,OAAA,CAAQ,CAAA,EAAG,KAAK,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA;AACtF,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,QAAA,CAAS,IAAI,KAAK,IAAA,GAAO,CAAA,GAAI,IAAA,GAAO,CAAA,EAAG,KAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAE,EAAE;AACnF;ACEA,IAAM,QAAA,GAAW,CAACH,EAAAA,EAAgBC,EAAAA,KAChCD,OAAM,IAAA,IAAQA,EAAAA,CAAE,MAAMC,EAAAA,CAAE,CAAA,IAAKD,GAAE,CAAA,KAAMC,EAAAA,CAAE,KAAKD,EAAAA,CAAE,CAAA,KAAMC,GAAE,CAAA,IAAKD,EAAAA,CAAE,MAAMC,EAAAA,CAAE,CAAA;AAIvE,SAAS,UAAA,CAAW,EAAE,MAAA,EAAO,EAAuB;AAClD,EAAA,MAAM,QAAQ,oBAAA,EAAqB;AACnC,EAAA,MAAM,YAAY,KAAA,CAAM,SAAA;AACxB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAA,CAAU,MAAM,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,MAAA,EAAQ,SAAS,CAAC,CAAA;AACtB,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,QAAA,CACP,QACA,OAAA,EACkC;AAClC,EAAA,MAAM,MAAA,GAAS,CAACW,EAAAA,MAA4C;AAAA,IAC1D,GAAG,OAAA,CAAQ,CAAA,KAAM,IAAI,CAAA,GAAIA,EAAAA,CAAE,IAAI,OAAA,CAAQ,CAAA;AAAA,IACvC,GAAG,OAAA,CAAQ,CAAA,KAAM,IAAI,CAAA,GAAIA,EAAAA,CAAE,IAAI,OAAA,CAAQ;AAAA,GACzC,CAAA;AACA,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ;AAC1B,IAAA,OAAO,CAAC,OAAO,MAAA,CAAO,CAAc,GAAG,MAAA,CAAO,MAAA,CAAO,CAAc,CAAC,CAAA;AAAA,EACtE;AACA,EAAA,IAAI,MAAA,CAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,OAAQ,MAAA,CAAO,OAAA,CAAuC,GAAA,CAAI,MAAM,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,iBAAA,CAAkB;AAAA,EAChC,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,UAAU,kBAAA,EAAmB;AACnC,EAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAsB,IAAI,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAgC,IAAI,CAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,OAA8B,IAAI,CAAA;AAKtD,EAAA,MAAM,OAAA,GAAU,OAAO,YAAY,CAAA;AACnC,EAAA,OAAA,CAAQ,OAAA,GAAU,YAAA;AAClB,EAAA,MAAM,SAAA,GAAY,OAAO,MAAM,CAAA;AAC/B,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAEpB,EAAA,MAAM,KAAK,MAAA,CAAO,EAAA;AAIlB,EAAA,MAAM,MAAA,GAAS,UAAU,EAAE,CAAA;AAC3B,EAAA,MAAM,QAAA,GAAW,OAA2B,IAAI,CAAA;AAChD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,OAAA,IAAW,IAAA;AACjC,IAAA,IAAI,EAAA,KAAO,SAAS,OAAA,EAAS;AAC7B,IAAA,QAAA,CAAS,OAAA,GAAU,EAAA;AACnB,IAAA,OAAA,EAAS,YAAA,CAAa,QAAQ,EAAE,CAAA;AAAA,EAClC,CAAC,CAAA;AACD,EAAA,SAAA;AAAA,IACE,MAAM,MAAM;AAIV,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,MAAA,OAAA,EAAS,YAAA,CAAa,QAAQ,IAAI,CAAA;AAAA,IACpC,CAAA;AAAA,IACA,CAAC,SAAS,MAAM;AAAA,GAClB;AASA,EAAA,MAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC5B,EAAA,MAAM,SAAA,GAAY,OAAO,MAAM,CAAA;AAC/B,EAAA,IAAI,SAAA,CAAU,OAAA,KAAY,MAAA,EAAQ,OAAA,CAAQ,OAAA,GAAU,KAAA;AACpD,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,EAAA,MAAM,gBAAA,GAAmB,OAA4B,IAAI,CAAA;AACzD,EAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAAC,GAAA,KAA+B;AACpE,IAAA,WAAA,CAAY,OAAA,GAAU,GAAA;AACtB,IAAA,gBAAA,CAAiB,OAAA,IAAU;AAC3B,IAAA,gBAAA,CAAiB,OAAA,GAAU,GAAA,GACvB,GAAA,CAAI,cAAA,CAAe,MAAM;AACvB,MAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,IACpB,CAAC,CAAA,GACD,IAAA;AAAA,EACN,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,OAAO,OAAA,CAAQ,aAAA,CAAc,MAAA,EAAQ,CAAC,MAAM,GAAA,KAAQ;AAClD,MAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACtB,MAAA,MAAM,EAAA,GAAK,SAAA,CAAU,OAAA,EAAS,UAAA,CAAW,QAAQ,CAAA;AACjD,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,EAAA,CAAG,OAAA,CAAQ,GAAG,YAAY,CAAA;AAC1B,MAAA,EAAA,CAAG,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,MAAM,IAAA,CAAK,KAAA,GAAQ,GAAG,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,GAAG,CAAC,CAAA;AAC7E,MAAA,EAAA,CAAG,UAAA,CAAW,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACxB,MAAA,EAAA,CAAG,KAAA,CAAM,EAAA,CAAG,gBAAA,GAAmB,EAAA,CAAG,kBAAkB,CAAA;AAAA,IACtD,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,MAAM,CAAC,CAAA;AAIpB,EAAA,MAAM,SAAA,GAAY,WAAW,kBAAkB,CAAA;AAC/C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,SAAA,EAAW;AAC1B,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAwB,SAAA,CAAU,UAAU,CAAC,CAAA;AAC5D,IAAA,KAAA,CAAM,iBAAiB,OAAA,EAAS,KAAA,EAAO,EAAE,OAAA,EAAS,OAAO,CAAA;AACzD,IAAA,OAAO,MAAM,KAAA,CAAM,mBAAA,CAAoB,OAAA,EAAS,KAAK,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,KAAA,EAAO,SAAS,CAAC,CAAA;AAErB,EAAA,SAAA;AAAA,IACE,MACE,OAAA,EAAS,eAAA,CAAgB,MAAA,EAAQ,CAAC,IAAA,KAAS;AAIzC,MAAA,SAAA,CAAU,MAAM,OAAA,CAAQ,CAAC,IAAA,KAAU,QAAA,CAAS,MAAM,IAAI,CAAA,GAAI,IAAA,GAAO,IAAK,CAAC,CAAA;AAGvE,MAAA,WAAA,CAAY,SAAS,aAAA,EAAc;AAAA,IACrC,CAAC,CAAA;AAAA,IACH,CAAC,SAAS,MAAM;AAAA,GAClB;AAEA,EAAA,MAAM,SAAA,GAAY,OAAA,EAAS,YAAA,EAAa,IAAK,IAAA;AAC7C,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,IAAA,EAAM,OAAO,IAAA;AAEhC,EAAA,MAAM,IAAA,GAAa,YAAA,CAAa,MAAA,CAAO,IAAA,IAAQ,QAAQ,MAAA,CAAO,OAAA,EAAS,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,CAAC,CAAA;AAEhG,EAAA,MAAM,UAAU,iBAAA,CAAkB;AAAA,IAChC,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,mBAAmB,MAAA,CAAO,iBAAA;AAAA,IAC1B,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,YAA+C,EAAC;AACtD,EAAA,KAAA,MAAW,cAAc,uBAAA,EAAyB;AAChD,IAAA,SAAA,CAAU,UAAU,CAAA,GAAI,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,OAAA,CAAQ,OAAO,CAAA;AAC/C,MAAA,MAAM,OAAmC,IAAA,EAAM,IAAA;AAC/C,MAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,EAA8C,MAAA,CAAO,OAAO,CAAA;AACpF,MAAA,MAAM,IAAA,GAAuB;AAAA,QAC3B,MAAA,EAAQ,EAAA;AAAA,QACR,IAAA;AAAA,QACA,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,QAC3B,MAAM,QAAA,CAAS,SAAA,CAAU,SAAS,MAAA,CAAO,iBAAA,IAAqB,EAAE;AAAA,OAClE;AACA,MAAA,OAAO,EAAE,IAAA,EAAK;AAAA,IAChB,CAAA;AAAA,EACF;AAIA,EAAA,MAAM,GAAA,GAAM;AAAA,IACV,CAAC,aAAuB,GAAG,CAAA,EAAG,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,IACpC,CAAC,aAAuB,GAAG,CAAA,EAAG,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,IACpC,CAAC,aAAuB,GAAG,CAAA,EAAG,KAAK,CAAC,CAAA,EAAA,CAAA;AAAA,IACpC,CAAC,aAAuB,GAAG,CAAA,EAAG,KAAK,CAAC,CAAA,EAAA;AAAA,GACtC;AAEA,EAAA,OAAO,YAAA;AAAA,oBACL,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,oBAAA;AAAA,UACV,wBAAA,EAAwB,EAAA;AAAA,UACxB,IAAA,EAAK,aAAA;AAAA,UACL,YAAA,EAAY,kBAAkB,EAAE,CAAA,CAAA;AAAA,UAEhC,QAAA,EAAU,CAAA;AAAA,UACV,KAAA,EAAO;AAAA;AAAA,OACT;AAAA,MACC,MAAA,IAAU,KAAA;AAAA;AAAA;AAAA,wBAGT,IAAA,CAAC,cAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACrB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,cAAW,MAAA,EAAQ,kBAAA,CAAmB,YAAY,CAAA,EAAG,cAAc,QAAA,EAAU,CAAA;AAAA,0BAC9E,GAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,iBAAA;AAAA,cACL,KAAA;AAAA,cACA,OAAO,IAAA,CAAK,CAAA;AAAA,cACZ,QAAQ,IAAA,CAAK,CAAA;AAAA,cACb,IAAA;AAAA,cACA,SAAA,EAAW,EAAE,MAAA,EAAQ,CAAA,EAAG,KAAK,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,EAAE;AAAA,cAC1C,YAAA,EAAc,KAAA;AAAA,cACd,YAAA,EAAc,uBAAA;AAAA,cACd,mBAAA,EAAqB,SAAA;AAAA,cACrB,MAAA,EAAQ,EAAE,KAAA,EAAO,EAAE,SAAQ;AAAE;AAAA;AAC/B,SAAA,EACF;AAAA,UACE;AAAA,KAAA,EACN,CAAA;AAAA,IACA;AAAA,GACF;AACF;AC/OO,SAAS,iBAAA,CAAkB;AAAA,EAChC,UAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,KAAA,EAAO,QAAQ,KAAK,CAAA;AAEvD,EAAA,uBACEM,IAAAC,QAAAA,EAAA,EACG,kBAAQ,GAAA,CAAI,CAAC,sBACZD,GAAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MAEC,MAAA,EAAQ,CAAA;AAAA,MACR,KAAA,EAAO,WAAA,CAAY,QAAA,CAAS,CAAA,CAAE,EAAE,CAAA;AAAA,MAChC,SAAS,UAAA,CAAW,OAAA;AAAA,MACpB,MAAA;AAAA,MACA;AAAA,KAAA;AAAA,IALK,CAAA,CAAE;AAAA,GAOV,CAAA,EACH,CAAA;AAEJ;;;AChBO,SAAS,iBACd,IAAA,EAC2B;AAC3B,EAAA,IAAI,KAAK,MAAA,IAAU,EAAE,eAAA,IAAmB,IAAA,IAAQ,KAAK,aAAA,CAAA,EAAgB;AACnE,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,eAAe,MAAM,MAAA,CAAO,UAAS,EAAE;AAAA,EAC3D;AACA,EAAA,OAAO,IAAA;AACT;;;ACjBO,SAAS,qBAAqB,MAAA,EAAyC;AAC5E,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAEjC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,KAAA,CAAM,QAAQ,EAAA,EAAI;AACpB,MAAA,MAAA,CAAO,KAAK,qBAAqB,CAAA;AAAA,IACnC,CAAA,MAAA,IAAW,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,EAAG;AAClC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,uBAAA,EAA0B,KAAA,CAAM,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,IAAI,KAAA,CAAM,UAAU,EAAA,EAAI;AACtB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,KAAA,CAAM,GAAG,CAAA,iBAAA,CAAmB,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,EAAG;AACnC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,KAAA,CAAM,GAAG,CAAA,kCAAA,CAAoC,CAAA;AAAA,MACrE;AACA,MAAA,IAAI,KAAA,CAAM,GAAA,IAAO,KAAA,CAAM,GAAA,EAAK;AAC1B,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,QAAA,EAAW,KAAA,CAAM,GAAG,CAAA,oBAAA,CAAsB,CAAA;AAAA,MACxD,CAAA,MAAA,IAAW,MAAM,OAAA,GAAU,KAAA,CAAM,OAAO,KAAA,CAAM,OAAA,GAAU,MAAM,GAAA,EAAK;AACjE,QAAA,MAAA,CAAO,KAAK,CAAA,QAAA,EAAW,KAAA,CAAM,GAAG,CAAA,WAAA,EAAc,KAAA,CAAM,OAAO,CAAA,sBAAA,CAAwB,CAAA;AAAA,MACrF;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,OAAO,CAAA,EAAG;AACnC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,OAAA,EAAU,KAAA,CAAM,GAAG,CAAA,kCAAA,CAAoC,CAAA;AAAA,MACrE;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAClC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC9B,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,QAAA,EAAW,KAAA,CAAM,GAAG,CAAA,kCAAA,CAAoC,CAAA;AAAA,MACtE,CAAA,MAAO;AACL,QAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,QAAA,KAAA,MAAW,GAAA,IAAO,MAAM,OAAA,EAAS;AAC/B,UAAA,IAAI,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,EAAG;AAC7B,YAAA,MAAA,CAAO,KAAK,CAAA,QAAA,EAAW,KAAA,CAAM,GAAG,CAAA,2BAAA,EAA8B,GAAA,CAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,UAC5E,CAAA,MAAO;AACL,YAAA,UAAA,CAAW,GAAA,CAAI,IAAI,KAAK,CAAA;AAAA,UAC1B;AAAA,QACF;AACA,QAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AAClC,UAAA,MAAA,CAAO,KAAK,CAAA,QAAA,EAAW,KAAA,CAAM,GAAG,CAAA,YAAA,EAAe,KAAA,CAAM,OAAO,CAAA,sBAAA,CAAwB,CAAA;AAAA,QACtF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,CAAO,MAAA,KAAW,GAAG,MAAA,EAAO;AAC9C;;;ACkRO,IAAM,aAAA,GAAuD;EAClE,QAAA,EAAU;IACR,YAAA,EAAc;MACZ,SAAA,EAAW;QACT,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,UAAA,EAAY;QACV,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,UAAA,EAAY;QACV,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,UAAA,EAAY;QACV,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,UAAA,EAAY;QACV,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,UAAA,EAAY;QACV,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,UAAA,EAAY;QACV,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,UAAA,EAAY;QACV,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,UAAA,EAAY;QACV,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,UAAA,EAAY;QACV,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,aAAA,EAAe;QACb,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,aAAA,EAAe;QACb,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS,SAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,eAAA,EAAiB;QACf,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,aAAA,EAAe;QACb,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,cAAA,EAAgB;QACd,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,cAAA,EAAgB;QACd,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,cAAA,EAAgB;QACd,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,aAAA,EAAe;QACb,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS,YAAA;QACT,OAAA,EAAS,GAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,MAAA,EAAQ;QACN,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS,YAAA;QACT,OAAA,EAAS,GAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,aAAA,EAAe;QACb,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS,YAAA;QACT,OAAA,EAAS,GAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,aAAA,EAAe;QACb,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS,uBAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,QAAA,EAAU;QACR,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,cAAA,EAAgB;QACd,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,QAAA,EAAU;QACR,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,SAAA,EAAW;QACT,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,SAAA,EAAW;QACT,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,YAAA,EAAc;QACZ,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,YAAA,EAAc;QACZ,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS,gBAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,eAAA,EAAiB;QACf,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS,YAAA;QACT,OAAA,EAAS,GAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,iBAAA,EAAmB;QACjB,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS,YAAA;QACT,OAAA,EAAS,IAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,gBAAA,EAAkB;QAChB,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS,SAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,cAAA,EAAgB;QACd,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,YAAA,EAAc;QACZ,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,cAAA,EAAgB;QACd,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,aAAA,EAAe;QACb,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,YAAA,EAAc;QACZ,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,aAAA,EAAe;QACb,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,eAAA,EAAiB;QACf,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,aAAA,EAAe;QACb,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,eAAA,EAAiB;QACf,MAAA,EAAQ,OAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,WAAA,EAAa;QACX,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,WAAA,EAAa;QACX,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,WAAA,EAAa;QACX,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,aAAA,EAAe;QACb,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,OAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,UAAA,EAAY;QACV,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,YAAA,EAAc;QACZ,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,KAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,aAAA,EAAe;QACb,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,KAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,WAAA,EAAa;QACX,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,MAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,WAAA,EAAa;QACX,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,MAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,gBAAA,EAAkB;QAChB,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,KAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,mBAAA,EAAqB;QACnB,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,KAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,kBAAA,EAAoB;QAClB,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,KAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,kBAAA,EAAoB;QAClB,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,KAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,aAAA,EAAe;QACb,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,KAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,YAAA,EAAc;QACZ,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,KAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,eAAA,EAAiB;QACf,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,KAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,cAAA,EAAgB;QACd,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,MAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,cAAA,EAAgB;QACd,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,MAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,WAAA,EAAa;QACX,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,MAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,cAAA,EAAgB;QACd,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,MAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,cAAA,EAAgB;QACd,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,MAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,UAAA,EAAY;QACV,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,UAAA,EAAY;QACV,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,UAAA,EAAY;QACV,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,UAAA,EAAY;QACV,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,eAAA,EAAiB;QACf,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,eAAA,EAAiB;QACf,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,QAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,gBAAA,EAAkB;QAChB,MAAA,EAAQ,WAAA;QACR,OAAA,EAAS,QAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,WAAA,EAAa;QACX,MAAA,EAAQ,QAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,WAAA,EAAa;QACX,MAAA,EAAQ,QAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,SAAA,EAAW;QACT,MAAA,EAAQ,QAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,eAAA,EAAiB;QACf,MAAA,EAAQ,QAAA;QACR,OAAA,EAAS,CAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,cAAA,EAAgB;QACd,MAAA,EAAQ,QAAA;QACR,OAAA,EAAS,GAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,SAAA,EAAW;QACT,MAAA,EAAQ,QAAA;QACR,OAAA,EAAS,GAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,UAAA,EAAY;QACV,MAAA,EAAQ,UAAA;QACR,OAAA,EAAS,MAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,aAAA,EAAe;QACb,MAAA,EAAQ,UAAA;QACR,OAAA,EAAS,OAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,eAAA,EAAiB;QACf,MAAA,EAAQ,UAAA;QACR,OAAA,EAAS,OAAA;QACT,aAAA,EAAe;AAAA,OAAA;MAEjB,eAAA,EAAiB;QACf,MAAA,EAAQ,aAAA;QACR,OAAA,EAAS;AACP,UAAA,IAAA;AACA,UAAA,CAAA;AACA,UAAA,IAAA;AACA,UAAA;AAAA;AACF,OAAA;MAEF,gBAAA,EAAkB;QAChB,MAAA,EAAQ,aAAA;QACR,OAAA,EAAS;AACP,UAAA,IAAA;AACA,UAAA,CAAA;AACA,UAAA,IAAA;AACA,UAAA;AAAA;AACF,OAAA;MAEF,mBAAA,EAAqB;QACnB,MAAA,EAAQ,aAAA;QACR,OAAA,EAAS;AACP,UAAA,IAAA;AACA,UAAA,CAAA;AACA,UAAA,IAAA;AACA,UAAA;AAAA;AACF,OAAA;MAEF,eAAA,EAAiB;QACf,MAAA,EAAQ,aAAA;QACR,OAAA,EAAS;AACP,UAAA,IAAA;AACA,UAAA,IAAA;AACA,UAAA,IAAA;AACA,UAAA;AAAA;AACF,OAAA;MAEF,SAAA,EAAW;QACT,MAAA,EAAQ,YAAA;QACR,OAAA,EAAS;AACP,UAAA,QAAA;AACA,UAAA,0BAAA;AACA,UAAA,cAAA;AACA,UAAA,WAAA;AACA,UAAA;AAAA,SAAA;QAEF,aAAA,EAAe;AAAA,OAAA;MAEjB,cAAA,EAAgB;QACd,MAAA,EAAQ,YAAA;QACR,OAAA,EAAS;AACP,UAAA,QAAA;AACA,UAAA,0BAAA;AACA,UAAA,cAAA;AACA,UAAA,WAAA;AACA,UAAA;AAAA;AACF,OAAA;MAEF,WAAA,EAAa;QACX,MAAA,EAAQ,YAAA;QACR,OAAA,EAAS;AACP,UAAA,OAAA;AACA,UAAA,WAAA;AACA,UAAA,eAAA;AACA,UAAA,UAAA;AACA,UAAA;AAAA;AACF,OAAA;MAEF,WAAA,EAAa;QACX,MAAA,EAAQ,YAAA;QACR,OAAA,EAAS;AACP,UAAA,cAAA;AACA,UAAA,gBAAA;AACA,UAAA,OAAA;AACA,UAAA,UAAA;AACA,UAAA;AAAA;AACF,OAAA;MAEF,mBAAA,EAAqB;QACnB,MAAA,EAAQ,YAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,oBAAA,EAAsB;QACpB,MAAA,EAAQ,YAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,oBAAA,EAAsB;QACpB,MAAA,EAAQ,YAAA;QACR,OAAA,EAAS;AAAA,OAAA;MAEX,kBAAA,EAAoB;QAClB,MAAA,EAAQ,YAAA;QACR,OAAA,EAAS;AAAA;AACX,KAAA;IAEF,OAAA,EAAS;MACP,MAAA,EAAQ;QACN,SAAA,EAAW;UACT,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,gBAAA,EAAkB;UAChB,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,gBAAA,EAAkB;UAChB,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,IAAA,EAAM;UACJ,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,UAAA,EAAY;UACV,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,WAAA,EAAa;UACX,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,QAAA,EAAU;UACR,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,eAAA,EAAiB;UACf,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS,kBAAA;UACT,aAAA,EAAe;AAAA,SAAA;QAEjB,WAAA,EAAa;UACX,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS,uBAAA;UACT,aAAA,EAAe;AAAA,SAAA;QAEjB,YAAA,EAAc;UACZ,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS,kBAAA;UACT,aAAA,EAAe;AAAA,SAAA;QAEjB,QAAA,EAAU;UACR,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS,oBAAA;UACT,aAAA,EAAe;AAAA;AACjB,OAAA;MAEF,OAAA,EAAS;QACP,SAAA,EAAW;UACT,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,gBAAA,EAAkB;UAChB,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,gBAAA,EAAkB;UAChB,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,IAAA,EAAM;UACJ,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,UAAA,EAAY;UACV,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,WAAA,EAAa;UACX,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,QAAA,EAAU;UACR,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,eAAA,EAAiB;UACf,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA,SAAA;QAEX,WAAA,EAAa;UACX,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS,qBAAA;UACT,aAAA,EAAe;AAAA,SAAA;QAEjB,YAAA,EAAc;UACZ,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS,iBAAA;UACT,aAAA,EAAe;AAAA,SAAA;QAEjB,QAAA,EAAU;UACR,MAAA,EAAQ,OAAA;UACR,OAAA,EAAS;AAAA;AACX;AACF;AACF;AAEJ,CAAA;ACx0BO,IAAM,WAAA,GAAqB;EAChC,IAAA,EAAM,QAAA;EACN,OAAA,EAAS,IAAA;EACT,WAAA,EAAa,MAAA;AACb,EAAA,MAAA,EAAQ,cAAc,MAAA,CAAO,UAAA;AAC7B,EAAA,KAAA,EAAO,cAAc,MAAA,CAAO;AAC9B,CAAA;AC9CO,SAAS,SAAA,CAAU,KAAa,KAAA,EAAuB;AAC5D,EAAA,MAAM,CAAA,GAAI,+BAAA,CAAgC,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AACzD,EAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,GAAG,CAAA,CAAA,CAAG,CAAA;AAE5D,EAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,KAAW,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAACd,EAAAA,KAAMA,EAAAA,GAAIA,EAAC,CAAA,GAAI,IAAA;AACpE,EAAA,MAAMD,EAAAA,GAAI,OAAO,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAC9C,EAAA,MAAM,CAAA,GAAI,OAAO,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAC9C,EAAA,MAAMF,EAAAA,GAAI,OAAO,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAC9C,EAAA,OAAO,QAAQE,EAAC,CAAA,EAAA,EAAK,CAAC,CAAA,EAAA,EAAKF,EAAC,KAAK,KAAK,CAAA,CAAA,CAAA;AACxC;ACXA,IAAM,GAAA,GAAM,eAAA;AAEZ,SAAS,UAAU,KAAA,EAAkC;AACnD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,IAAA;AACtC,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC/B,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,MAAM,IAAA,GAAO,EAAE,CAAC,CAAA;AAChB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC5B,EAAA,OAAO,QAAQ,EAAA,GAAK,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAC/C;AAOA,SAAS,UAAU,KAAA,EAA6C;AAC9D,EAAA,OAAO,MAAM,GAAA,CAAI,CAACgB,OAAO,OAAOA,EAAAA,KAAM,YAAY,IAAA,CAAK,IAAA,CAAKA,EAAC,CAAA,GAAI,CAAA,CAAA,EAAIA,EAAC,CAAA,CAAA,CAAA,GAAM,MAAA,CAAOA,EAAC,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACnG;AAEA,SAAS,SAAA,CAAU,MAAc,KAAA,EAA2B;AAC1D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,IAAI,SAAS,aAAA,EAAe,OAAO,gBAAgB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AACnE,IAAA,IAAI,IAAA,KAAS,YAAA,EAAc,OAAO,SAAA,CAAU,KAAK,CAAA;AACjD,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB,EAAA;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAQO,SAAS,cAAc,MAAA,EAAsC;AAClE,EAAA,MAAM,MAAwB,EAAA;AAC9B,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAA;AAEvB,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAyB;AAC3C,IAAA,MAAM,MAAA,GAAS,IAAI,IAAI,CAAA;AACvB,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAEjC,IAAA,MAAM,KAAA,GAAQ,OAAO,IAAI,CAAA;AACzB,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAA,CAAG,CAAA;AAErD,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,IAAI,CAAA,GAAA,EAAM,CAAC,GAAG,UAAU,CAAA,CAAE,IAAA,CAAK,UAAK,CAAC,CAAA,CAAA,CAAG,CAAA;AACvF,IAAA;AACA,IAAA,UAAA,CAAW,IAAI,IAAI,CAAA;AAEnB,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA;AACpC,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA;IAC3C,CAAA,MAAA,IAAW,CAAC,MAAA,CAAO,MAAM,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAI,CAAA,cAAA,EAAiB,MAAM,CAAA,uBAAA,CAAyB,CAAA;IAChF,CAAA,MAAO;AACL,MAAA,KAAA,GAAQ,WAAW,MAAM,CAAA;AAC3B,IAAA;AAEA,IAAA,IAAI,MAAM,KAAA,KAAU,MAAA,UAAmB,SAAA,CAAU,KAAA,EAAO,MAAM,KAAK,CAAA;AAEnE,IAAA,UAAA,CAAW,OAAO,IAAI,CAAA;AACtB,IAAA,GAAA,CAAI,IAAI,CAAA,GAAI,KAAA;AACZ,IAAA,OAAO,KAAA;AACT,EAAA,CAAA;AAEA,EAAA,KAAA,MAAW,QAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,aAAc,IAAI,CAAA;AACvD,EAAA,OAAO,GAAA;AACT;AChEA,SAAS,MAAM,KAAA,EAAuB;AACpC,EAAA,MAAM,MAAe,EAAA;AACrB,EAAA,KAAA,IAAS,CAAA,GAAkB,OAAO,CAAA,EAAG,CAAA,GAAI,EAAE,OAAA,EAAS,GAAA,CAAI,QAAQ,CAAC,CAAA;AACjE,EAAA,OAAO,GAAA;AACT;AAQO,SAAS,YAAA,CAAa,OAAc,IAAA,EAA6B;AACtE,EAAA,MAAM,MAAA,GAAS,MAAM,KAAK,CAAA;AAC1B,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,QAAQ,CAAA,CAAE,KAAK,CAAA,GAAI,IAAA,GAAO,KAAA,CAAM,WAAA;AAMzE,EAAA,IAAI,SAAqB,EAAA;AACzB,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAA,GAAS,EAAE,GAAG,MAAA,EAAQ,GAAG,CAAA,CAAE,MAAA,EAAQ,GAAI,CAAA,CAAE,KAAA,CAAM,aAAa,CAAA,IAAK,EAAA,EAAC;AACpE,EAAA;AAEA,EAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,EAAA,MAAM,MAA8B,EAAA;AACpC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG,GAAA,CAAI,CAAA,MAAA,EAAS,IAAI,CAAA,CAAE,CAAA,GAAI,KAAA;AAC7E,EAAA,OAAO,GAAA;AACT;ACpCA,IAAM,QAAA,GAAW,YAAA;AAKjB,IAAM,OAAA,uBAAc,GAAA,EAAA;AACpB,IAAI,KAAA,GAA8B,IAAA;AAClC,IAAI,OAAA,GAAmC,IAAA;AASvC,SAAS,QAAA,GAAoB;AAC3B,EAAA,OACE,OAAO,kBAAkB,WAAA,IACzB,aAAA,IAAiB,cAAc,SAAA,IAC/B,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,kBAAkB,CAAA;AAE7C;AAKA,SAAS,UAAA,GAAmB;AAC1B,EAAA,MAAM,GAAA,GAAM,CAAC,GAAG,OAAA,CAAQ,QAAQ,CAAA,CAAE,KAAK,IAAI,CAAA;AAC3C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAQ,IAAI,aAAA,EAAA;AACZ,MAAA,QAAA,CAAS,kBAAA,GAAqB,CAAC,GAAG,QAAA,CAAS,oBAAoB,KAAK,CAAA;AACtE,IAAA;AACA,IAAA,KAAA,CAAM,YAAY,GAAG,CAAA;AACrB,IAAA;AACF,EAAA;AACA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAA,GAAU,QAAA,CAAS,cAAc,OAAO,CAAA;AACxC,IAAA,OAAA,CAAQ,EAAA,GAAK,QAAA;AACb,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AACnC,EAAA;AACA,EAAA,OAAA,CAAQ,WAAA,GAAc,GAAA;AACxB;AAUO,SAAS,UAAA,CAAW,EAAA,EAAiB,KAAA,EAAc,IAAA,EAAoB;AAC5E,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,IAAI,KAAK,IAAI,CAAA,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,KAAA,EAAO,IAAI,CAAA;AACzC,EAAA,MAAM,OAAO,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,CACjC,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,KAAM,GAAG,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA,CAC3C,KAAK,GAAG,CAAA;AACX,EAAA,MAAM,OAAO,CAAA,iBAAA,EAAoB,KAAA,CAAM,IAAI,CAAA,kBAAA,EAAqB,IAAI,QAAQ,IAAI,CAAA,EAAA,CAAA;AAChF,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,KAAM,IAAA,EAAM;AAC7B,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AACrB,IAAA,UAAA,EAAA;AACF,EAAA;AAEA,EAAA,EAAA,CAAG,YAAA,CAAa,gBAAA,EAAkB,KAAA,CAAM,IAAI,CAAA;AAC5C,EAAA,EAAA,CAAG,YAAA,CAAa,iBAAiB,IAAI,CAAA;AACvC;AC3DA,IAAM,YAAA,GAAe,cAAwC,IAAI,CAAA;AAsB1D,SAAS,aAAA,CAAc;EAC5B,KAAA,GAAQ,WAAA;AACR,EAAA,IAAA;AACA,EAAA,SAAA;AACA,EAAA,KAAA;AACA,EAAA;AACF,CAAA,EAA2C;AACzC,EAAA,MAAM,GAAA,GAAMG,OAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,aAAA,GAAgB,QAAQ,KAAA,CAAM,WAAA;AAEpC,EAAA,MAAM,KAAA,GAAQ,OAAA;IACZ,OAAO,EAAE,OAAO,IAAA,EAAM,aAAA,EAAe,UAAU,YAAA,CAAa,KAAA,EAAO,aAAa,CAAA,EAAA,CAAA;AAChF,IAAA,CAAC,OAAO,aAAa;AAAA,GAAA;AAGvB,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,IAAI,IAAI,OAAA,EAAS,UAAA,CAAW,GAAA,CAAI,OAAA,EAAS,OAAO,aAAa,CAAA;EAC/D,CAAA,EAAG,CAAC,KAAA,EAAO,aAAa,CAAC,CAAA;AAEzB,EAAA,uBACEF,GAAAA,CAAC,YAAA,CAAa,UAAb,EAAsB,KAAA,EACrB,0BAAAA,GAAAA;AAAC,IAAA,KAAA;AAAA,IAAA;AACC,MAAA,GAAA;AACA,MAAA,SAAA;AACA,MAAA,KAAA;AACA,MAAA,gBAAA,EAAgB,KAAA,CAAM,IAAA;MACtB,eAAA,EAAe,aAAA;AAEd,MAAA;AAAA;AAAA,GAAA,EAEL,CAAA;AAEJ;AAiBO,SAAS,gBAAA,GAA6C;AAC3D,EAAA,OAAOG,WAAW,YAAY,CAAA;AAChC;ACjFO,IAAM,wBAAA,GAA2BC,cAAmD,IAAI,CAAA;;;ACJxF,IAAM,SAAA,GAAY,kBAAA;ACQzB,IAAM,OAAA,GAAU,CAAC,CAAA,KACf,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,QAAA,IAAY,CAAA;AAU9C,SAAS,cAAc,GAAA,EAA0C;AACtE,EAAA,MAAM,MAAkB,EAAA;AAExB,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACpD,IAAA,IAAI,SAAA,CAAU,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/B,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAEjD,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,MAAM,YAAY,CAAA,CAAE,KAAA;AAEpB,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG;AAC5C,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAC1B,MAAA,IAAI,CAAC,OAAA,CAAQ,IAAI,CAAA,EAAG;AAEpB,MAAA,MAAM,IAAA,GAAO,KAAK,KAAA,IAAS,SAAA;AAC3B,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,IAAI,CAAA,8BAAA,EAAiC,SAAS,CAAA,eAAA,CAAiB,CAAA;AAC3F,MAAA;AACA,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAI,CAAA,oDAAA,CAAiD,CAAA;AAChG,MAAA;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,GAAc,SAAS,CAAA;AAC7C,MAAA,MAAM,KAAA,GAAkB;AACtB,QAAA,IAAA;AACA,QAAA,KAAA,EAAO,IAAA,CAAK,MAAA;QACZ,KAAA,EAAO,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,MAAA;AACjD,QAAA,WAAA,EAAa,IAAA,CAAK;AAAA,OAAA;AAEpB,MAAA,GAAA,CAAI,IAAI,CAAA,GAAI,KAAA;AACd,IAAA;AACF,EAAA;AAEA,EAAA,OAAO,GAAA;AACT;ACtCO,SAAS,SAAS,GAAA,EAA0B;AACjD,EAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,SAAS,EAAA,EAAI;AACnD,IAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AACvD,EAAA;AACA,EAAA,MAAM,QAAoC,EAAA;AAC1C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,CAAA,IAAK,MAAA,CAAO,QAAQ,GAAA,CAAI,KAAA,IAAS,EAAE,CAAA,EAAG;AAC1D,IAAA,KAAA,CAAM,IAAI,CAAA,GAAI,aAAA,CAAc,IAAI,CAAA;AAClC,EAAA;AACA,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,KAAY,MAAA,GAAY,cAAc,GAAA,CAAI,OAAA;AAC3D,EAAA,OAAO;AACL,IAAA,IAAA,EAAM,GAAA,CAAI,IAAA;IACV,OAAA,EAAS,IAAA;AACT,IAAA,WAAA,EACE,OAAO,GAAA,CAAI,WAAA,KAAgB,WAAW,GAAA,CAAI,WAAA,GAAe,MAAM,WAAA,IAAe,MAAA;AAChF,IAAA,MAAA,EAAQ,aAAA,CAAc,GAAA,CAAI,UAAA,IAAc,EAAE,CAAA;AAC1C,IAAA;AAAA,GAAA;AAEJ;;;ACjCA,IAAA,2BAAA,GAAA;AAAA,EACE,IAAA,EAAQ,cAAA;AAAA,EACR,WAAA,EAAe,MAAA;AAAA,EACf,UAAA,EAAc;AAAA,IACZ,SAAA,EAAa;AAAA,MACX,KAAA,EAAS,WAAA;AAAA,MACT,WAAA,EAAa,EAAE,MAAA,EAAU,KAAA,EAAM;AAAA,MAC/B,YAAA,EAAc,EAAE,MAAA,EAAU,MAAA;AAAO,KACnC;AAAA,IACA,UAAA,EAAc;AAAA,MACZ,KAAA,EAAS,YAAA;AAAA,MACT,mBAAA,EAAqB,EAAE,MAAA,EAAU,GAAA,EAAI;AAAA,MACrC,oBAAA,EAAsB,EAAE,MAAA,EAAU,GAAA,EAAI;AAAA,MACtC,kBAAA,EAAoB,EAAE,MAAA,EAAU,GAAA;AAAI;AACtC,GACF;AAAA,EACA,KAAA,EAAS;AAAA,IACP,IAAA,EAAQ;AAAA,MACN,KAAA,EAAS;AAAA,QACP,KAAA,EAAS,OAAA;AAAA,QACT,OAAA,EAAW,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QACjC,gBAAA,EAAkB,EAAE,MAAA,EAAU,wBAAA,EAAyB;AAAA,QACvD,gBAAA,EAAkB,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QACxC,MAAA,EAAU,EAAE,MAAA,EAAU,2BAAA,EAA4B;AAAA,QAClD,aAAA,EAAe,EAAE,MAAA,EAAU,2BAAA,EAA4B;AAAA,QACvD,EAAA,EAAM,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QAC5B,UAAA,EAAY,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QAClC,WAAA,EAAa,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QACnC,MAAA,EAAU,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QAChC,cAAA,EAAgB,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QACtC,YAAA,EAAc,EAAE,MAAA,EAAU,2BAAA,EAA4B;AAAA,QACtD,MAAA,EAAU,EAAE,MAAA,EAAU,oBAAA,EAAqB;AAAA,QAC3C,eAAA,EAAiB,EAAE,MAAA,EAAU,2BAAA;AAA4B,OAC3D;AAAA,MACA,QAAA,EAAY;AAAA,QACV,KAAA,EAAS,UAAA;AAAA,QACT,QAAA,EAAY;AAAA,UACV,MAAA,EAAU;AAAA;AACZ;AACF,KACF;AAAA,IACA,KAAA,EAAS;AAAA,MACP,KAAA,EAAS;AAAA,QACP,KAAA,EAAS,OAAA;AAAA,QACT,OAAA,EAAW,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QACjC,gBAAA,EAAkB,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QACxC,gBAAA,EAAkB,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QACxC,MAAA,EAAU,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QAChC,aAAA,EAAe,EAAE,MAAA,EAAU,qBAAA,EAAsB;AAAA,QACjD,EAAA,EAAM,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QAC5B,UAAA,EAAY,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QAClC,WAAA,EAAa,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QACnC,MAAA,EAAU,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QAChC,cAAA,EAAgB,EAAE,MAAA,EAAU,SAAA,EAAU;AAAA,QACtC,YAAA,EAAc,EAAE,MAAA,EAAU,0BAAA,EAA2B;AAAA,QACrD,MAAA,EAAU,EAAE,MAAA,EAAU,wBAAA,EAAyB;AAAA,QAC/C,eAAA,EAAiB,EAAE,MAAA,EAAU,SAAA;AAAU;AACzC;AACF;AAEJ,CAAA;;;ACpDO,IAAM,iBAAA,GAA2B,SAAS,2BAAG;ACQ7C,SAAS,UAAU,EAAE,OAAA,EAAS,UAAU,gBAAA,EAAkB,GAAG,MAAK,EAAmB;AAC1F,EAAA,uBACEJ,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,OAAA;AAAA,MACA,SAAA,EAAU,iBAAA;AAAA,MACV,gBAAA,EAAiB,mBAAA;AAAA,MACjB,gBAAA,EACE,gBAAA,GAAmB,CAAA,kBAAA,EAAqB,gBAAgB,CAAA,CAAA,GAAK,mBAAA;AAAA,MAG9D;AAAA;AAAA,GACH;AAEJ;ACzBO,IAAM,gBAAA,GAAmBI,cAAyC,IAAI,CAAA;AAEtE,SAAS,YAAA,GAA0C;AACxD,EAAA,OAAOD,WAAW,gBAAgB,CAAA;AACpC;ACMA,SAAS,UAAU,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,UAAS,EAA4C;AAC7F,EAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EAAoD,GAAG,QAAA,EACnE,QAAA,EAAA;AAAA,IAAA,IAAA;AAAA,oBACDL,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAmB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACxC;AAAA,GAAA,EACH,CAAA;AAEJ;AAKO,SAAS,aAAA,CAAc,EAAE,KAAA,EAAO,IAAA,EAAM,UAAS,EAAuB;AAC3E,EAAA,MAAM,OAAO,YAAA,EAAa;AAC1B,EAAA,IAAI,IAAA;AACF,IAAA,uBACEA,IAAC,SAAA,EAAA,EAAU,MAAA,EAAQ,KAAK,MAAA,EAAQ,KAAA,EAAc,MAC3C,QAAA,EACH,CAAA;AAEJ,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,IAAA;AAAA,oBACDL,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAmB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACxC;AAAA,GAAA,EACH,CAAA;AAEJ;AChCO,SAAS,uBAAA,GAA6C;AAC3D,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAyB;AAC3C,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAgB;AACtC,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,KAAA,MAAW,EAAA,IAAM,WAAW,EAAA,EAAG;AAAA,EACjC,CAAA;AACA,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,CAAC,GAAA,EAAK,EAAA,KAAO;AAChB,MAAA,IAAI,EAAA,EAAI,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AAAA,WACpB,KAAA,CAAM,OAAO,GAAG,CAAA;AACrB,MAAA,MAAA,EAAO;AAAA,IACT,CAAA;AAAA,IACA,KAAK,CAAC,GAAA,KAAQ,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA;AAAA,IAChC,SAAA,EAAW,CAAC,EAAA,KAAO;AACjB,MAAA,SAAA,CAAU,IAAI,EAAE,CAAA;AAChB,MAAA,OAAO,MAAM,SAAA,CAAU,MAAA,CAAO,EAAE,CAAA;AAAA,IAClC;AAAA,GACF;AACF;AAEO,IAAM,gBAAA,GAAmBI,cAAwC,IAAI,CAAA;AAErE,SAAS,aAAA,GAA0C;AACxD,EAAA,OAAOD,WAAW,gBAAgB,CAAA;AACpC;ACtBA,SAAS,SAAA,CAAU;AAAA,EACjB,OAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,MAAM,QAAQ,aAAA,EAAc;AAC5B,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,EAAE,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,oBAAA;AAAA,IACX,CAAC,EAAA,KAAO,KAAA,EAAO,SAAA,CAAU,EAAE,MAAM,MAAM;AAAA,IAAC,CAAA,CAAA;AAAA,IACxC,MAAM,KAAA,EAAO,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA;AAAA,IACzB,MAAM;AAAA,GACR;AACA,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,YAAA,CAAa,MAAM,OAAO,IAAA;AACxC,EAAA,MAAM,OAAO,YAAA,CAAa,IAAA;AAC1B,EAAA,OAAOG,YAAAA;AAAA,oBACLD,IAAAA,CAAAJ,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAI,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EAAwB,eAAK,KAAA,EAAM,CAAA;AAAA,wBACnDA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,qBAAA;AAAA,YACV,YAAA,EAAY,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,YAC9B,KAAA,EAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,YACzB,OAAA,EAAS,MAAM,MAAA,CAAO,YAAA,CAAa,EAAE,CAAA;AAAA,YACtC,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF,CAAA;AAAA,MACC,IAAA,CAAK;AAAA,KAAA,EACR,CAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,gBAAA,CAAiB,EAAE,OAAA,EAAS,QAAA,EAAU,QAAO,EAA0B;AACrF,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAClC,EAAA,uBACEA,GAAAA,CAAAC,QAAAA,EAAA,EACG,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAACf,EAAAA,qBACbc,GAAAA,CAAC,SAAA,EAAA,EAAqB,SAAkB,YAAA,EAAcd,EAAAA,EAAG,UAAzCA,EAAAA,CAAE,EAAuD,CAC1E,CAAA,EACH,CAAA;AAEJ;ACDA,IAAM,QAAQ,MAAY;AAAC,CAAA;AAI3B,IAAM,WAAA,GAAiD,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAKhE,SAAS,WAAA,CAAY;AAAA,EAC1B,OAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA,GAAe,IAAA;AAAA,EACf,aAAA,GAAgB,KAAA;AAAA,EAChB;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,MAAM,aAAA,EAAc;AAC1B,EAAA,MAAM,QAAA,GAAWiB,WAAW,eAAe,CAAA;AAC3C,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,kDAAkD,CAAA;AACjF,EAAA,MAAM,kBAAkB,QAAA,CAAS,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,EAAE,eAAe,CAAA;AACzE,EAAA,MAAM,0BAA0B,QAAA,CAAS,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,EAAE,uBAAuB,CAAA;AACzF,EAAA,MAAM,gBAAgB,QAAA,CAAS,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AACrE,EAAA,MAAM,2BAA2B,QAAA,CAAS,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,EAAE,wBAAwB,CAAA;AAC3F,EAAA,MAAM,oBAAoB,QAAA,CAAS,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,EAAE,iBAAiB,CAAA;AAC7E,EAAA,MAAM,mBAAmB,QAAA,CAAS,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,EAAE,gBAAgB,CAAA;AAC3E,EAAA,MAAM,oBAAoB,QAAA,CAAS,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AACvE,EAAA,MAAM,kBAAkB,QAAA,CAAS,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACnE,EAAA,MAAM,iBAAiB,QAAA,CAAS,QAAA,CAAS,OAAO,CAAC,CAAA,KAAM,EAAE,cAAc,CAAA;AACvE,EAAA,MAAM,WAAA,GAAcI,OAAAA;AAAA,IAClB,MACE,MAAA,CAAO,MAAA,CAAO,cAAc,CAAA,CACzB,OAAO,CAACb,EAAAA,KAAMA,EAAAA,CAAE,OAAA,KAAY,OAAO,CAAA,CACnC,GAAA,CAAI,CAACA,EAAAA,KAAMA,GAAE,SAAS,CAAA;AAAA,IAC3B,CAAC,gBAAgB,OAAO;AAAA,GAC1B;AAIA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AAEnC,EAAA,MAAM,YAAA,GAAe,gBAAgB,UAAU,CAAA;AAE/C,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,UAAA,CAAW,SAAS,UAAA,CAAW,IAAA;AAC7D,EAAA,MAAM,iBAAA,GAAoB,OAAO,iBAAA,IAAqB,WAAA;AAEtD,EAAA,MAAM,GAAA,GAAMa,QAA4B,MAAM;AAC5C,IAAA,MAAM,OAAA,GAAU,CAACC,EAAAA,KAAoB;AACnC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,eAAA,CAAgB,OAAA,EAAS,QAAA,CAAS,MAAA,EAAQA,EAAC,CAAC,CAAA;AAAA,IAC9C,CAAA;AACA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,KAAA;AAAA,MACA,QAAA,EAAU,CAAC,IAAA,KAAS,aAAA,CAAc,SAAS,IAAI,CAAA;AAAA,MAC/C,WAAA;AAAA,MACA,IAAA,EAAM,MAAA,GAAS,MAAA,CAAO,IAAA,GAAO,IAAA;AAAA,MAC7B,OAAA;AAAA,MACA,OAAA,EAAS,cAAc,OAAA,IAAW,KAAA;AAAA,MAClC,OAAA,EAAS,cAAc,OAAA,IAAW,KAAA;AAAA,MAClC,IAAA,EAAM,cAAc,IAAA,IAAQ,KAAA;AAAA,MAC5B,IAAA,EAAM,cAAc,IAAA,IAAQ,KAAA;AAAA,MAC5B,OAAA,EAAS,OAAO,EAAA,IAAM,KAAA;AAAA,MACtB,WAAA,EAAa,OAAO,MAAA,IAAU,KAAA;AAAA,MAC9B,YAAA;AAAA,MACA,YAAA,EAAc,WAAW,MAAA,GAAS,KAAM,UAAA,CAAW,YAAA,QAAoB,EAAC;AAAA,MACxE,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,SAAA,EAAW,CAAC,IAAA,EAAM,KAAA,KAAU;AAC1B,QAAA,MAAM,aAAa,MAAA,CAAO,MAAA;AAC1B,QAAA,IACE,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,IACzB,CAAC,aAAA,CAAc,UAAA,EAAY,IAAI,CAAA,IAC/B,gBAAA,CAAiB,YAAA,CAAa,KAAA,EAAO,IAAI,MAAM,MAAA,EAC/C;AACA,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,CAAA,kCAAA,EAAqC,IAAI,CAAA,kBAAA,EAAqB,MAAA,CAAO,cAAc,CAAA,CAAA;AAAA,WACrF;AAAA,QACF;AACA,QAAA,iBAAA,CAAkB,OAAA,EAAS,MAAM,KAAK,CAAA;AACtC,QAAA,IAAI,WAAW,cAAA,EAAgB;AAC7B,UAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,UAAA,EAAY,IAAA,EAAM,KAAK,CAAA;AAC1D,UAAA,MAAM,YAAY,UAAA,CAAW,cAAA,CAAe,UAAA,EAAY,UAAA,EAAY,OAAO,KAAK,CAAA;AAChF,UAAA,gBAAA,CAAiB,SAAS,SAAkB,CAAA;AAAA,QAC9C;AAAA,MACF,CAAA;AAAA,MACA,iBAAA;AAAA,MACA,qBAAqB,CAAC,GAAA,EAAK,cAAc,wBAAA,CAAyB,OAAA,EAAS,KAAK,SAAS,CAAA;AAAA,MACzF,cAAA,EAAgB,WAAA;AAAA,MAChB,aAAa,CAAC,SAAA,EAAW,OAAO,iBAAA,CAAkB,OAAA,EAAS,WAAW,EAAE,CAAA;AAAA,MACxE,SAAA,EAAW,CAAC,SAAA,KAAc,eAAA,CAAgB,SAAS,SAAS,CAAA;AAAA,MAC5D,cAAA,EAAgB,IAAI,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,OAAO,CAAA;AAAA,MACtE,cAAc,CAAC,IAAA,KAAS,GAAA,CAAI,YAAA,CAAa,SAAS,IAAI,CAAA;AAAA,MACtD,cAAc,CAAC,UAAA,KAAe,GAAA,CAAI,YAAA,CAAa,SAAS,UAAU,CAAA;AAAA,MAClE,KAAA,EAAO,MAAM,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA;AAAA,MACnC,KAAA,EAAO,MAAM,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA;AAAA,MACnC,KAAA,EAAO,MAAM,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA;AAAA,MACnC,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG;AAAA,IACD,OAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,GAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,wBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,aAAA,GAAgBD,OAAAA;AAAA,IACpB,MACE,qBAAA;AAAA,MACE,kBAAA;AAAA,QACE,oBAAA,CAAqB,UAAA,EAAY,GAAA,EAAK,GAAA,CAAI,QAAQ,CAAA;AAAA,QAClD,CAAC,GAAI,UAAA,CAAW,MAAA,IAAU,EAAG,CAAA;AAAA,QAC7B,CAAC,GAAI,WAAA,IAAe,EAAG,CAAA;AAAA,QACvB,CAAC,GAAI,MAAA,IAAU,EAAG;AAAA,OACpB;AAAA,MACA,YAAY;AAAC,KACf;AAAA,IACF,CAAC,UAAA,EAAY,GAAA,EAAK,aAAa,MAAA,EAAQ,QAAA,EAAU,IAAI,QAAQ;AAAA,GAC/D;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,MAAA,KAChB,aAAA,CAAc,OAAO,CAACrB,EAAAA,KAAMA,EAAAA,CAAE,MAAA,KAAW,MAAM,CAAA;AAEjD,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAwC;AAC7D,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA;AAC3B,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,EAAK;AAClC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAI,CAAA,CAAE,QAAA,EAAU,GAAA,CAAI,IAAA,EAAK;AAAA,eAChB,IAAA,EAAK;AAAA,IAChB,WAAW,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,EAAK;AACzC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,GAAA,CAAI,YAAA,EAAa;AAAA,IACnB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEmB,IAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,UAAA;AAAA,MACV,eAAA,EAAe,OAAA;AAAA,MACf,YAAA,EAAY,SAAS,KAAK,CAAA,CAAA;AAAA,MAC1B,QAAA,EAAU,EAAA;AAAA,MACV,SAAA,EAAW,aAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAL,GAAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,IAAA,kBAAMA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,QAAO,aAAA,EAAe,QAAA,CAAS,UAAU,CAAA,EAAG,GAAA,EAAU,CAAA;AAAA,YAEtF,0BAAAA,GAAAA,CAAC,cAAA,EAAA,EAAe,eAAe,QAAA,CAAS,UAAU,GAAG,GAAA,EAAU;AAAA;AAAA,SACjE;AAAA,wBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,aAAA,EAAe,QAAA,CAAS,SAAS,CAAA,EAAG,KAAU,CAAA,EAC/D,CAAA;AAAA,wBACAK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAL,IAAC,aAAA,EAAA,EAAc,aAAA,EAAe,QAAA,CAAS,SAAS,GAAG,GAAA,EAAU,CAAA;AAAA,0BAC7DK,IAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,OAAO,MAAA,CAAO,YAAA;AAAA,cACd,aAAA,EAAe,CAACT,EAAAA,KAAM,uBAAA,CAAwB,SAASA,EAAC,CAAA;AAAA,cACxD,gBAAA,EACE,UAAA,CAAW,MAAA,IAAU,UAAA,CAAW,QAAQ,0BAAA,GAA6B,MAAA;AAAA,cAEvE,OAAA,kBACES,IAAAA,CAAAJ,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,gCAAAD,IAAC,aAAA,EAAA,EAAc,aAAA,EAAe,QAAA,CAAS,SAAS,GAAG,GAAA,EAAU,CAAA;AAAA,gCAC7DA,GAAAA;AAAA,kBAAC,gBAAA;AAAA,kBAAA;AAAA,oBACC,OAAA;AAAA,oBACA,QAAA,EAAU,QAAA,CAAS,SAAS,CAAA,CAAE,MAAA,CAAO,CAACd,EAAAA,KAAM,WAAA,CAAY,QAAA,CAASA,EAAAA,CAAE,EAAE,CAAC,CAAA;AAAA,oBACtE,QAAQ,GAAA,CAAI;AAAA;AAAA;AACd,eAAA,EACF,CAAA;AAAA,cAGD,QAAA,EAAA;AAAA,gBAAA,QAAA;AAAA,gCACDc,GAAAA,CAAC,cAAA,EAAA,EAAe,eAAe,QAAA,CAAS,UAAU,GAAG,GAAA,EAAU;AAAA;AAAA;AAAA;AACjE,SAAA,EACF,CAAA;AAAA,wBACAK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACZ,QAAA,EAAA;AAAA,UAAA,GAAA,mBAAML,GAAAA,CAAC,WAAA,EAAA,EAAY,GAAA,EAAU,CAAA,GAAK,IAAA;AAAA,0BACnCA,GAAAA,CAAC,YAAA,EAAA,EAAa,eAAe,QAAA,CAAS,QAAQ,GAAG,GAAA,EAAU;AAAA,SAAA,EAC7D;AAAA;AAAA;AAAA,GACF;AAEJ;AC7NO,SAAS,KAAA,CAAM,EAAE,EAAA,EAAI,MAAA,EAAQ,UAAS,EAAe;AAC1D,EAAA,MAAM,MAAM,aAAA,EAAc;AAC1B,EAAA,MAAM,QAAA,GAAWG,WAAW,eAAe,CAAA;AAC3C,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAC7E,EAAA,MAAM,WAAA,GAAcM,SAAS,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,CAAA,IAAK,GAAA,CAAI,WAAA;AAC1E,EAAA,MAAM,MAAA,GAASA,QAAAA,CAAS,QAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,CAAO,IAAA,CAAK,CAACb,EAAAA,KAAMA,EAAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AAChF,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,WAAA,CAAY,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAA,CAAO,cAAc,CAAA,GAAI,MAAA;AACxF,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,UAAA,EAAY,WAAA,EAAa,SAAS,EAAE,CAAA;AAC9D,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,uBAAOS,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA;AAAA,MAAA,mBAAA;AAAA,MAAkB;AAAA,KAAA,EAAG,CAAA;AAAA,EAC1E;AACA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,uBACEA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA;AAAA,MAAA,sBAAA;AAAA,MAAqB,MAAA,CAAO;AAAA,KAAA,EAAe,CAAA;AAAA,EAE3F;AACA,EAAA,IAAI,CAAC,KAAK,KAAA,EAAO,uBAAOL,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4BAAA,EAA6B,CAAA;AACpE,EAAA,uBACEA,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,WAAW,IAAA,CAAK,KAAA;AAAA,MAChB,MAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,MAAA,EAAQ,GAAA,CAAI,MAAA,CAAO,MAAA,IAAU,CAAA;AAAA,MAC7B,MAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AAIA,SAAS,YAAA,CACP,SACA,OAAA,EACoC;AACpC,EAAA,MAAM,OAAA,GAAUG,WAAW,wBAAwB,CAAA;AACnD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIO,QAAAA;AAAA,IAAoC,MAC9D,OAAA,IAAW,OAAA,EAAS,GAAA,CAAI,OAAO,CAAA,GAAI,EAAE,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAE,GAAI;AAAA,GACvE;AACA,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACxB,IAAA,IAAI,IAAA,GAAO,IAAA;AACX,IAAA,OAAA,CAAQ,MAAK,CAAE,IAAA;AAAA,MACb,CAAC,KAAA,KAAU;AACT,QAAA,IAAI,IAAA,EAAM,SAAA,CAAU,EAAE,KAAA,EAAO,CAAA;AAAA,MAC/B,CAAA;AAAA,MACA,CAAC,KAAA,KAAU;AACT,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,4CAAA,EAA+C,OAAO,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC7E,QAAA,IAAI,IAAA,EAAM,SAAA,CAAU,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,MACrC;AAAA,KACF;AACA,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,GAAO,KAAA;AAAA,IACT,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAC,CAAA;AAC7B,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,OAAO,MAAA,EAAU;AACrD,EAAA,OAAO,MAAA,GAAS,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM,GAAI,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAA,EAAU;AAC1F;AAeA,SAAS,YAAA,CAAa;AAAA,EACpB,SAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,SAAA,GAAYT,OAAmC,IAAI,CAAA;AACzD,EAAA,MAAM,kBAAA,GAAqBA,OAA8B,IAAI,CAAA;AAC7D,EAAA,MAAM,YAAA,GAAeA,OAA8B,IAAI,CAAA;AACvD,EAAA,MAAM,mBAAmBO,QAAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,gBAAgB,CAAA;AAClE,EAAA,MAAM,oBAAoBA,QAAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,iBAAiB,CAAA;AACpE,EAAA,MAAM,kBAAkBA,QAAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,eAAe,CAAA;AAChE,EAAA,MAAM,uBAAuBA,QAAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,oBAAoB,CAAA;AAC1E,EAAA,MAAM,yBAAyBA,QAAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,sBAAsB,CAAA;AAC9E,EAAA,MAAM,YAAYA,QAAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACvD,EAAA,MAAM,aAAaA,QAAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACtD,EAAA,MAAM,eAAeA,QAAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAE1D,EAAA,MAAM,MAAA,GAASP,OAAwB,IAAI,CAAA;AAC3C,EAAA,IAAI,MAAA,CAAO,OAAA,KAAY,IAAA,EAAM,MAAA,CAAO,UAAU,cAAA,EAAe;AAC7D,EAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AAEnB,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIQ,QAAAA,CAAkC,EAAE,CAAA;AAClF,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAA0B,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE5C,EAAA,MAAM,aAAA,GAAgBH,OAAAA;AAAA,IACpB,OACG,UAAA,CAAW,MAAA,EAAQ,UAAU,EAAC,EAC5B,OAAO,CAACK,EAAAA,KAAM,gBAAgBA,EAAAA,CAAE,EAAE,MAAM,KAAK,CAAA,CAC7C,IAAI,CAACA,EAAAA,KAAMA,GAAE,EAAE,CAAA;AAAA,IACpB,CAAC,UAAA,CAAW,MAAA,EAAQ,eAAe;AAAA,GACrC;AAEA,EAAA,MAAM,UAAU,UAAA,CAAW,IAAA;AAC3B,EAAA,MAAM,UAAA,GAAaL,OAAAA,CAAQ,MAAM,IAAI,GAAA,CAAI,OAAA,EAAS,UAAA,IAAc,CAAC,cAAc,CAAC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAC5F,EAAA,MAAM,QAAA,GAAW,SAAS,QAAA,IAAY,EAAA;AAEtC,EAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAAwB;AAChD,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA,EAAG;AACxC,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,EAAS,CAAE,MAAA,CAAO,IAAA,CAAK,CAACX,EAAAA,KAAMA,EAAAA,CAAE,EAAA,KAAO,MAAA,CAAO,EAAE,CAAA;AACtE,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,OAAA,CAAQ,KAAK,CAAA;AAC1C,IAAA,oBAAA,CAAqB,MAAA,CAAO,IAAI,CAAC,IAAA,KAAS,aAAa,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,EAC9E,CAAA;AAEA,EAAA,MAAM,UAAU,CAAC,CAAA,KAAqB,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAC,CAAA;AAKlE,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAA,GAAS,MAAA,GAAY,UAAA,CAAW,KAAA;AACzD,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KAA6B;AAC9C,IAAA,MAAM,QAAA,GACJ,UAAA,CAAW,MAAA,EAAQ,WAAA,KAClB,KAAA,GAAS,KAAA,CAAM,WAAA,KAAgB,CAAC,EAAA,KAAqB,QAAA,CAAS,KAAA,CAAM,IAAA,EAAM,EAAE,CAAA,CAAA,GAAM,MAAA,CAAA;AACrF,IAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AACpC,IAAA,IAAI,MAAA,CAAO,QAAQ,IAAA,EAAM;AACzB,IAAA,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,EACxB,CAAA;AAKA,EAAA,MAAM,iBAAiB,UAAA,CAAW,WAAA;AAClC,EAAA,MAAM,UAAA,GAAaM,MAAAA,CAA8C,MAAM,EAAE,CAAA;AACzE,EAAA,UAAA,CAAW,UAAU,MACnB,cAAA,GACI,eAAe,OAAA,CAAQ,MAAA,CAAO,OAAO,MAAA,CAAO,MAAA,EAAQ,EAAE,EAAA,EAAI,OAAO,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA,EAAM,IACxF,EAAC;AAGP,EAAA,MAAM,cAAA,GAAiBA,OAAsD,IAAI,CAAA;AAGjF,EAAA,MAAM,SAAA,GAAYA,MAAAA,CAAgB,MAAA,CAAO,MAAM,CAAA;AAC/C,EAAA,SAAA,CAAU,UAAU,MAAA,CAAO,MAAA;AAE3B,EAAA,MAAM,MAAA,GAASA,OAAO,cAAc,CAAA;AACpC,EAAA,MAAA,CAAO,OAAA,GAAU,cAAA;AACjB,EAAA,IAAI,cAAA,CAAe,YAAY,IAAA,EAAM;AAGnC,IAAA,MAAM,IAAA,GAAO,cAAA,EAAgB,OAAA,GAAU,SAAA,GAAY,MAAA,CAAO,WAAA;AAC1D,IAAA,cAAA,CAAe,UAAU,mBAAA,CAAoB,IAAA,EAAM,MAAM,UAAA,CAAW,SAAQ,EAAG;AAAA,MAC7E,OAAA,EAAS,MAAM,MAAA,CAAO,OAAA,EAAS,OAAA;AAAA,MAC/B,MAAA,EAAQ,MAAM,SAAA,CAAU,OAAA;AAAA,MACxB,WAAW,CAAC,MAAA,KAAW,MAAA,CAAO,OAAA,EAAS,YAAY,MAAM;AAAA,KAC1D,CAAA;AAAA,EACH;AACA,EAAA,MAAM,cAAc,cAAA,CAAe,OAAA;AAMnC,EAAA,MAAM,UAAU,cAAA,EAAgB,OAAA;AAChC,EAAA,MAAM,OAAA,GAAUA,OAA+B,MAAM;AAAA,EAAC,CAAC,CAAA;AACvD,EAAA,OAAA,CAAQ,OAAA,GAAU,CAAC,GAAA,KAAQ;AACzB,IAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,GAAY,CAAA;AAAA,SACjC,sBAAA,CAAuB,MAAA,CAAO,EAAA,EAAI,GAAG,CAAA;AAAA,EAC5C,CAAA;AAIA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIQ,QAAAA,CAAS,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,CAAA;AACvE,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,IAAA,MAAM,OAAO,MAAY;AACvB,MAAA,MAAM,IAAA,GAAO,EAAE,IAAA,EAAM,WAAA,CAAY,SAAQ,EAAG,IAAA,EAAM,WAAA,CAAY,OAAA,EAAQ,EAAE;AACxE,MAAA,YAAA,CAAa,CAAC,IAAA,KAAU,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,IAAA,GAAO,IAAA,GAAO,IAAK,CAAA;AAAA,IAC3F,CAAA;AACA,IAAA,IAAA,EAAK;AACL,IAAA,OAAO,WAAA,CAAY,UAAU,IAAI,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,WAAA,EAAa,cAAc,CAAC,CAAA;AAEhC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,IAAA,IAAI,KAAA,GAA8C,IAAA;AAClD,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,MAAM,QAAQ,MAAY;AACxB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,KAAA,GAAQ,KAAA;AACR,MAAA,OAAA,CAAQ,OAAA,CAAQ,WAAA,CAAY,MAAA,EAAQ,CAAA;AAAA,IACtC,CAAA;AACA,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,SAAA,CAAU,MAAM;AACtC,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAC7B,MAAA,KAAA,GAAQ,WAAW,MAAM;AACvB,QAAA,KAAA,GAAQ,IAAA;AACR,QAAA,KAAA,EAAM;AAAA,MACR,GAAG,GAAG,CAAA;AAAA,IACR,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,GAAA,EAAI;AACJ,MAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAC7B,MAAA,KAAA,EAAM;AAAA,IACR,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,cAAc,CAAC,CAAA;AAOhC,EAAA,MAAM,aAAA,GAAgB,WAAW,KAAA,IAAS,IAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,SAAA,EAAW,WAAW,CAAA;AACrD,EAAA,MAAM,cAAA,GAAiB,aAAA,GAClB,MAAA,CAAO,YAAA,IAAgB,UAAA,CAAW,KAAA,EAAO,OAAA,IAAW,UAAA,CAAW,KAAA,EAAO,KAAA,CAAM,CAAC,CAAA,EAAG,MAAM,IAAA,GACvF,OAAA;AACJ,EAAA,MAAM,aAAA,GAAgB,CAAC,EAAA,KAAqB;AAC1C,IAAA,IAAI,aAAA,EAAe,YAAA,CAAa,MAAA,CAAO,EAAA,EAAI,EAAE,CAAA;AAAA,oBAC7B,EAAE,CAAA;AAAA,EACpB,CAAA;AAIA,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,IAAI,CAAA;AAEnC,EAAA,MAAM,SAAS,UAAA,CAAW,GAAA;AAG1B,EAAA,MAAM,MAAM,MAAA,CAAO;AAAA,IACjB,UAAA,EAAY,MAAA,IAAU,EAAE,GAAA,EAAK,mBAAmB;AAAA,IAAC,CAAA,EAAG,MAAA,EAAQ,CAAC,EAAA,EAAI,OAAO,EAAA,EAAG;AAAA,IAC3E,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,UAAU,CAAC,IAAA,KAAS,gBAAA,CAAiB,MAAA,CAAO,IAAI,IAAa;AAAA,GAC9D,CAAA;AAED,EAAA,MAAM,SAAA,GAA6C;AAAA,IACjD,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,MAAA,gBAAA,CAAiB,cAAc,CAAA;AAC/B,MAAA,gBAAA,CAAiB,MAAA,CAAO,IAAI,IAAI,CAAA;AAChC,MAAA,GAAA,CAAI,KAAK,cAAc,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,IAAA,EAAM,KAAA,KAAU;AAC1B,MAAA,MAAM,GAAA,GAAM,iBAAiB,IAAI,CAAA,CAAA;AACjC,MAAA,gBAAA,CAAiB,eAAe,CAAA;AAChC,MAAA,gBAAA,CAAiB,GAAG,CAAA;AACpB,MAAA,iBAAA,CAAkB,MAAA,CAAO,EAAA,EAAI,IAAA,EAAM,KAAK,CAAA;AACxC,MAAA,GAAA,CAAI,KAAK,eAAe,CAAA;AACxB,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IACd,CAAA;AAAA,IACA,KAAA,EAAO;AAAA,MACL,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAA;AAAA,MACA,IAAA,EAAM,QAAQ,IAAA,IAAQ,CAAA;AAAA,MACtB,OAAA,EAAS,CAACH,EAAAA,KAAM;AACd,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,eAAA,CAAgB,MAAA,CAAO,EAAA,EAAI,QAAA,CAAS,MAAA,EAAQA,EAAC,CAAC,CAAA;AAAA,MAChD,CAAA;AAAA,MACA,YAAA,EAAc,cAAA;AAAA,MACd;AAAA,KACF;AAAA,IACA,IAAA,EAAM,CAAC,KAAA,KAAU;AACf,MAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,MAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IAChB,CAAA;AAAA,IACA,GAAA,EAAK,SAAS,GAAA,GAAM;AAAA,GACtB;AAMA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,MAAM,SAAS,IAAA,CAAS,MAAA,CAAO,WAAW,eAAA,CAAgB,MAAA,CAAO,KAAK,CAAC,CAAA;AACvE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,gBAAA,CAAiB,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,QAAiB,CAAA;AACpD,IAAA,oBAAA,CAAqB,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,KAAK,CAAA;AAAA,EAC9C,CAAA;AACA,EAAA,MAAM,YAAY,MAAM;AACtB,IAAA,MAAM,SAAS,IAAA,CAAS,MAAA,CAAO,WAAW,eAAA,CAAgB,MAAA,CAAO,KAAK,CAAC,CAAA;AACvE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,gBAAA,CAAiB,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,QAAiB,CAAA;AACpD,IAAA,oBAAA,CAAqB,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,KAAK,CAAA;AAAA,EAC9C,CAAA;AAEA,EAAA,MAAM,YAAA,GACJ,WAAW,cAAA,GACP;AAAA,IACE,OAAA,EAAS,UAAU,IAAA,KAAS,OAAA,GAAU,OAAO,SAAA,CAAU,IAAA,CAAK,SAAS,CAAA,GAAI,KAAA,CAAA;AAAA,IACzE,OAAA,EAAS,UAAU,IAAA,KAAS,OAAA,GAAU,OAAO,SAAA,CAAU,MAAA,CAAO,SAAS,CAAA,GAAI,KAAA,CAAA;AAAA,IAC3E,MAAM,MAAM;AACV,MAAA,IAAI,cAAA,IAAkB,WAAA,CAAY,IAAA,EAAK,EAAG;AAC1C,MAAA,IAAI,SAAS,SAAA,EAAU;AAAA,IACzB,CAAA;AAAA,IACA,MAAM,MAAM;AACV,MAAA,IAAI,cAAA,IAAkB,WAAA,CAAY,IAAA,EAAK,EAAG;AAC1C,MAAA,IAAI,SAAS,SAAA,EAAU;AAAA,IACzB;AAAA,GACF,GACA,MAAA;AAEN,EAAA,MAAM,QAAA,GAAWD,QAAQ,MAAM;AAC7B,IAAA,MAAM,WAAW,UAAA,CAAW,KAAA;AAC5B,IAAA,IAAI,QAAA,IAAY,MAAM,OAAO,IAAA;AAC7B,IAAA,OAAO,YAAA,CAAa,OAAO,QAAA,KAAa,UAAA,GAAa,SAAS,MAAA,CAAO,MAAM,IAAI,QAAQ,CAAA;AAAA,EACzF,GAAG,CAAC,UAAA,CAAW,KAAA,EAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AACpC,EAAA,MAAM,aAAA,GAA2C,QAAA,GAC7C,EAAE,EAAA,EAAI,OAAA,EAAS,MAAA,EAAQ,MAAM,UAAA,CAAW,CAAC,CAAA,KAAM,CAAC,CAAC,GAAE,GACnD,MAAA;AAEJ,EAAA,MAAM,YAAA,GAAwCA,QAAQ,MAAM;AAC1D,IAAA,IAAI,CAAC,UAAA,CAAW,MAAA,EAAQ,OAAO,EAAC;AAChC,IAAA,MAAM,UAAA,GAAa,WAAW,MAAA,CAAO,MAAA;AACrC,IAAA,MAAM,OAAA,GAAU,aACZ,CAAC,GAAG,UAAU,CAAA,CAAE,IAAA,CAAK,CAACzB,EAAAA,EAAGC,EAAAA,KAAM,WAAW,OAAA,CAAQD,EAAAA,CAAE,EAAE,CAAA,GAAI,UAAA,CAAW,QAAQC,EAAAA,CAAE,EAAE,CAAC,CAAA,GAClF,UAAA;AACJ,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MAC7B,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,OAAA,EAAS,eAAA,CAAgB,KAAA,CAAM,EAAE,CAAA,KAAM,KAAA;AAAA,MACvC,MAAA,EAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,KAAA,KAAU;AAG5B,QAAA,WAAA,CAAY,GAAA,EAAK,MAAM,KAAK,CAAA;AAC5B,QAAA,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,MACjF;AAAA,KACF,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,UAAA,CAAW,MAAA,EAAQ,MAAA,CAAO,OAAO,MAAA,CAAO,MAAA,EAAQ,eAAA,EAAiB,UAAU,CAAC,CAAA;AAEhF,EAAA,MAAM,gBAAA,GAAsCwB,QAAQ,MAAM;AACxD,IAAA,IAAI,CAAC,UAAA,CAAW,MAAA,EAAQ,OAAO,EAAC;AAChC,IAAA,OAAO,UAAA,CAAW,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,CAACK,EAAAA,KAAO,OAAOA,EAAAA,KAAM,QAAA,GAAW,EAAE,EAAA,EAAIA,EAAAA,EAAG,KAAA,EAAOA,EAAAA,KAAMA,EAAE,CAAA;AAAA,EAC3F,CAAA,EAAG,CAAC,UAAA,CAAW,MAAM,CAAC,CAAA;AAEtB,EAAA,MAAM,iBAAiB,WAAA,CAAY;AAAA,IACjC,UAAA,EAAY,UAAA,CAAW,QAAA,IAAY,EAAE,OAAA,EAAS,EAAC,EAAG,MAAA,EAAQ,CAAC,EAAA,EAAI,EAAA,EAAI,CAAA,KAAM,CAAA,EAAE;AAAA,IAC3E,kBAAA;AAAA,IACA,MAAM,MAAA,IAAU,YAAA;AAAA,IAChB,SAAA,EAAW,WAAW,MAAA,EAAQ,SAAA;AAAA,IAC9B,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,MAAA,gBAAA,CAAiB,kBAAkB,CAAA;AACnC,MAAA,gBAAA,CAAiB,MAAA,CAAO,IAAI,IAAa,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,IAAA,EAAM,CAAC,GAAA,KAAQ;AACb,MAAA,gBAAA,CAAiB,GAAG,CAAA;AACpB,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,IACd;AAAA,GACD,CAAA;AAED,EAAA,MAAM,YAAA,GAA8BL,QAAQ,MAAM;AAChD,IAAA,IAAI,CAAC,UAAA,CAAW,QAAA,EAAU,OAAO,EAAC;AAClC,IAAA,MAAMb,EAAAA,GAAI,WAAW,QAAA,CAAS,OAAA;AAC9B,IAAA,OAAO,OAAOA,OAAM,UAAA,GAAaA,EAAAA,CAAE,OAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA,GAAIA,EAAAA;AAAA,EACpE,CAAA,EAAG,CAAC,UAAA,CAAW,QAAA,EAAU,OAAO,KAAA,EAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAErD,EAAA,MAAM,kBAAA,GAA8Ca,QAAQ,MAAM;AAChE,IAAA,IAAI,CAAC,cAAA,CAAe,IAAA,EAAM,QAAA,EAAU,OAAO,YAAA;AAC3C,IAAA,MAAM,EAAA,GAAK,eAAe,IAAA,CAAK,QAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,eAAe,IAAA,CAAK,SAAA;AACnC,IAAA,OAAO;AAAA,MACL,GAAG,YAAA;AAAA,MACH;AAAA,QACE,EAAA,EAAI,oBAAA;AAAA,QACJ,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,CAAC,GAAA,KAAQ;AACf,UAAA,MAAM,KAAK,kBAAA,CAAmB,OAAA;AAC9B,UAAA,IAAI,CAAC,EAAA,EAAI;AACT,UAAA,MAAMtB,EAAAA,GAAI,GAAG,qBAAA,EAAsB;AACnC,UAAA,GAAA,CAAI,IAAA,EAAK;AACT,UAAA,GAAA,CAAI,WAAA,GAAc,EAAA,CAAG,EAAA,GAAK,MAAA,GAAS,MAAA;AACnC,UAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,UAAA,GAAA,CAAI,SAAA,EAAU;AACd,UAAA,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,CAAA,GAAIA,EAAAA,CAAE,IAAA,EAAM,MAAA,CAAO,CAAA,GAAIA,EAAAA,CAAE,GAAA,EAAK,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAC/D,UAAA,GAAA,CAAI,MAAA,EAAO;AACX,UAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,QACd;AAAA;AACF,KACF;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,cAAA,CAAe,IAAI,CAAC,CAAA;AAItC,EAAA,MAAM,IAAA,GAAO,2BACXe,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAY,QAAA;AAAA,MACZ,OAAA,EAAS,OAAA;AAAA,MACT,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAM,MAAA,IAAU,YAAA;AAAA,MAChB,SAAA,EAAW,WAAW,MAAA,EAAQ,SAAA;AAAA,MAC9B,OAAA,EAAS;AAAA;AAAA,GACX,GACE,IAAA;AAEJ,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,IAAA,mBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,kBAAA,EAAoB,WAAU,uBAAA,EACtC,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,MAAA,EAAQ,kBAAA;AAAA,UACR,MAAM,MAAA,IAAU,YAAA;AAAA,UAChB,YAAA,EAAc,OAAA;AAAA,UACd,SAAA,EAAW,WAAW,MAAA,CAAO,SAAA;AAAA,UAC7B,QAAA,EAAU,SAAA;AAAA,UACV,OAAA,EAAS,WAAW,MAAA,CAAO,OAAA;AAAA,UAC3B,OAAA,EAAS,WAAW,MAAA,CAAO,OAAA;AAAA,UAE1B,QAAA,EAAA;AAAA,YAAA,UAAA,CAAW,OAAO,SAAS,CAAA;AAAA,YAC3B;AAAA;AAAA;AAAA,OACH;AAAA,sBACAL,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,eAAe,IAAA,EAAM;AAAA,KAAA,EAC1C,CAAA;AAAA,EAEJ,WAAW,KAAA,EAAO;AAChB,IAAA,IAAA,mBACEA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,MAAM,MAAA,IAAU,YAAA;AAAA,QAChB,YAAA,EAAc,OAAA;AAAA,QACd,QAAA,EAAU,SAAA;AAAA,QACV,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,OAAA,EAAS,YAAA;AAAA,QACT,OAAA,EAAS,IAAA;AAAA,QAER,QAAA,EAAA,UAAA,CAAW,OAAO,SAAS;AAAA;AAAA,KAC9B;AAAA,EAEJ,WAAW,IAAA,EAAM;AACf,IAAA,IAAA,mBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,YAAA,EAAc,WAAU,sBAAA,EAC/B,QAAA,EAAA;AAAA,MAAA,UAAA,CAAW,OAAO,SAAS,CAAA;AAAA,MAC3B;AAAA,KAAA,EACH,CAAA;AAAA,EAEJ,CAAA,MAAO;AACL,IAAA,IAAA,GAAO,UAAA,CAAW,OAAO,SAAS,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,YAAY,cAAA,CAAe,SAAA;AACjC,EAAA,MAAM,WAAA,GAAcE,OAAAA;AAAA,IAClB,MACE,YAAA,CAAa,MAAA,GAAS,CAAA,mBAAIP,GAAAA,CAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,WAAA,EAAa,SAAA,EAAW,CAAA,GAAK,IAAA;AAAA,IACvF,CAAC,cAAc,SAAS;AAAA,GAC1B;AAEA,EAAA,MAAM,aAAA,GAAgBO,OAAAA;AAAA,IACpB,MACE,UAAA,CAAW,MAAA,IAAU,gBAAA,CAAiB,MAAA,GAAS,oBAC7CP,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,gBAAA;AAAA,QACR,UAAA,EAAY,eAAA;AAAA,QACZ,SAAA,EAAW,CAAC,IAAA,KAAS;AACnB,UAAA,aAAA,CAAc,KAAK,GAAA,CAAI,CAACY,EAAAA,KAAMA,EAAAA,CAAE,EAAE,CAAC,CAAA;AACnC,UAAA,GAAA,CAAI,KAAK,gBAAgB,CAAA;AAAA,QAC3B,CAAA;AAAA,QACA,QAAA,EAAU,CAAC,GAAA,EAAK,OAAA,KAAY;AAC1B,UAAA,kBAAA,CAAmB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,OAAA,EAAQ,CAAE,CAAA;AAC1D,UAAA,GAAA,CAAI,KAAK,eAAe,CAAA;AAAA,QAC1B;AAAA;AAAA,KACF,GACE,IAAA;AAAA,IACN,CAAC,UAAA,CAAW,MAAA,EAAQ,gBAAA,EAAkB,iBAAiB,GAAG;AAAA,GAC5D;AAEA,EAAA,MAAM,WAAA,GAAcL,QAA6B,MAAM;AACrD,IAAA,MAAM,MAA2B,EAAC;AAClC,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,EAAA,EAAI,kBAAA;AAAA,QACJ,MAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,EAAS,MAAM,WAAA;AAAY,OAC3C,CAAA;AAAA,IACH;AACA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,EAAA,EAAI,YAAA;AAAA,QACJ,MAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAM,EAAE,KAAA,EAAO,QAAA,EAAU,MAAM,aAAA;AAAc,OAC9C,CAAA;AAAA,IACH;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAA,EAAa,aAAa,CAAC,CAAA;AAK/B,EAAA,MAAM,kBAAA,GAAqB,iCACzBP,GAAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAY,cAAA;AAAA,MACZ,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAO,EAAE,EAAA,EAAI,OAAO,EAAA,EAAI,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,MAC1C,WAAA;AAAA,MACA,YAAA,EAAc;AAAA;AAAA,GAChB,GACE,IAAA;AAEJ,EAAA,uBACEA,IAAC,eAAA,EAAA,EAAgB,OAAA,EAAS,OAAO,EAAA,EAC/B,QAAA,kBAAAA,GAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,OAAO,cAAA,GAAiB,WAAA,GAAc,MACjE,QAAA,kBAAAA,GAAAA,CAAC,mBAAmB,QAAA,EAAnB,EAA4B,KAAA,EAAO,SAAA,EAClC,QAAA,kBAAAK,IAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,SAAS,GAAA,GAAM,MAAA;AAAA,MACpB,KAAA,EAAO,aAAA;AAAA,MACP,SAAS,MAAA,CAAO,EAAA;AAAA,MAChB,MAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA,EAAa,MAAA;AAAA,MACb,YAAA;AAAA,MACA,WAAA,EAAa,WAAA;AAAA,MACb,MAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA,EAAc,cAAA;AAAA,MACd,aAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QACA;AAAA;AAAA;AAAA,GACH,EACF,GACF,CAAA,EACF,CAAA;AAEJ;;;ACtkBA,IAAMQ,aAAAA,GAAe,EAAE,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE,EAAE;AAEpD,SAAS,cAAA,CAAe,aAA6B,IAAA,EAA0B;AAC7E,EAAA,MAAM,QAAQ,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACrD,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EAC1D;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,YAAY,UAAA,EAA6C;AAChE,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAA,GAAS,MAAA,GAAY,UAAA,CAAW,KAAA;AACzD,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,MAAA,EAAQ,WAAA,IAAe,KAAA,EAAO,WAAA;AAI1D,EAAA,IAAI,OAAO,QAAA,KAAa,UAAA,IAAe,KAAA,IAAS,QAAA,KAAa,QAAY,OAAO,IAAA;AAChF,EAAA,OAAO,QAAA,GAAW,eAAA,CAAgB,QAAQ,CAAA,GAAI,EAAE,GAAGA,aAAAA,EAAc,GAAA,EAAK,EAAE,GAAGA,aAAAA,CAAa,GAAA,EAAI,EAAE;AAChG;AAYA,SAAS,UAAA,CAAe,UAAc,IAAA,EAAmC;AACvE,EAAA,OAAO,IAAA,GAAO,kBAAA,CAAmB,IAAA,EAAM,QAAQ,CAAA,GAAI,QAAA;AACrD;AAKO,SAAS,SACd,MAAA,EACA,WAAA,EACA,cAAA,EACA,OAAA,GAA2B,EAAC,EACb;AACf,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,WAAA,EAAa,cAAc,CAAA;AAC7D,EAAA,MAAM,SAAS,UAAA,CAAW,UAAA,CAAW,aAAA,EAAc,EAAG,QAAQ,MAAM,CAAA;AACpE,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AAC5C,EAAA,MAAM,MAAA,GAAsB;AAAA,IAC1B,IAAI,KAAA,EAAM;AAAA,IACV,cAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,EAAM,YAAY,UAAU,CAAA;AAAA,IAC5B,WAAW,EAAE,IAAA,EAAM,EAAC,EAAG,MAAA,EAAQ,EAAC;AAAE,GACpC;AACA,EAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,MAAA,CAAO,UAAA,GAAa,OAAA,CAAQ,MAAA;AAChD,EAAA,OAAO,CAAC,GAAG,MAAA,EAAQ,MAAM,CAAA;AAC3B;AAIO,SAAS,UAAA,CAAW,QAAuB,EAAA,EAA2B;AAC3E,EAAA,MAAM,YAAY,MAAA,CAAO,SAAA,CAAU,CAACjB,EAAAA,KAAMA,EAAAA,CAAE,OAAO,EAAE,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,OAAO,SAAS,CAAA;AAC/B,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,MAAM,KAAA,GAAqB;AAAA,IACzB,GAAG,MAAA;AAAA,IACH,IAAI,KAAA,EAAM;AAAA,IACV,MAAA,EAAQ,eAAA,CAAgB,MAAA,CAAO,MAAM,CAAA;AAAA,IACrC,KAAA,EAAO,eAAA,CAAgB,MAAA,CAAO,KAAK,CAAA;AAAA,IACnC,IAAA,EAAM,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAA;AAAA,IACjC,WAAW,EAAE,IAAA,EAAM,EAAC,EAAG,MAAA,EAAQ,EAAC;AAAE,GACpC;AACA,EAAA,OAAO,CAAC,GAAG,MAAA,CAAO,KAAA,CAAM,GAAG,SAAA,GAAY,CAAC,CAAA,EAAG,KAAA,EAAO,GAAG,MAAA,CAAO,KAAA,CAAM,SAAA,GAAY,CAAC,CAAC,CAAA;AAClF;AAIO,SAAS,UAAA,CAAW,QAAuB,EAAA,EAA2B;AAC3E,EAAA,IAAI,MAAA,CAAO,MAAA,IAAU,CAAA,EAAG,OAAO,MAAA;AAC/B,EAAA,MAAM,OAAO,MAAA,CAAO,MAAA,CAAO,CAACA,EAAAA,KAAMA,EAAAA,CAAE,OAAO,EAAE,CAAA;AAC7C,EAAA,OAAO,IAAA,CAAK,MAAA,KAAW,MAAA,CAAO,MAAA,GAAS,MAAA,GAAS,IAAA;AAClD;AAIO,SAAS,UAAA,CACd,MAAA,EACA,EAAA,EACA,WAAA,EACe;AACf,EAAA,MAAM,MAAM,MAAA,CAAO,SAAA,CAAU,CAACA,EAAAA,KAAMA,EAAAA,CAAE,OAAO,EAAE,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,OAAO,GAAG,CAAA;AAC1B,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,WAAA,EAAa,OAAA,CAAQ,cAAc,CAAA;AACrE,EAAA,MAAM,SAAS,UAAA,CAAW,UAAA,CAAW,aAAA,EAAc,EAAG,QAAQ,UAAU,CAAA;AACxE,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAqB;AAAA,IACzB,GAAG,OAAA;AAAA,IACH,MAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,EAAM,YAAY,UAAU;AAAA,GAC9B;AACA,EAAA,OAAO,CAAC,GAAG,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,KAAA,EAAO,GAAG,MAAA,CAAO,KAAA,CAAM,GAAA,GAAM,CAAC,CAAC,CAAA;AAClE;AAOO,SAAS,aAAA,CAAc,QAAuB,GAAA,EAAuC;AAC1F,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAACA,EAAAA,KAAM,CAACA,EAAAA,CAAE,EAAA,EAAIA,EAAC,CAAC,CAAC,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,GAAA,CAAI,EAAE,CAAC,CAAA,CAAE,MAAA,CAAO,CAACA,EAAAA,KAAwBA,OAAM,MAAS,CAAA;AAC3F,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAACA,EAAAA,KAAMA,EAAAA,CAAE,EAAE,CAAC,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,CAACA,EAAAA,KAAM,CAAC,IAAA,CAAK,GAAA,CAAIA,EAAAA,CAAE,EAAE,CAAC,CAAA;AACjD,EAAA,OAAO,CAAC,GAAG,KAAA,EAAO,GAAG,IAAI,CAAA;AAC3B;ACtGO,SAAS,aAAA,CACd,KAAA,EACA,KAAA,EACA,SAAA,GAAY,CAAA,EACS;AACrB,EAAA,IAAI,KAAA,GAA6B,IAAA;AACjC,EAAA,KAAA,MAAW,EAAE,IAAA,EAAM,KAAA,EAAM,IAAK,KAAA,EAAO;AACnC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA;AAC/B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,KAAA;AAC9B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AACxB,IAAA,IAAI,MAAM,SAAA,EAAW;AACrB,IAAA,IAAI,CAAC,KAAA,IAAS,EAAA,GAAK,KAAA,CAAM,EAAA,EAAI,KAAA,GAAQ,EAAE,IAAA,EAAM,EAAA,EAAI,IAAA,EAAM,CAAA,IAAK,CAAA,GAAI,MAAM,GAAA,EAAI;AAAA,EAC5E;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAc,EAAA,EAAqB;AAC1C,EAAA,OAAO,GAAG,OAAA,CAAQ,WAAA,EAAY,GAAI,CAAC,GAAG,EAAA,CAAG,SAAS,CAAA,CAAE,GAAA,CAAI,CAACV,EAAAA,KAAM,CAAA,CAAA,EAAIA,EAAC,CAAA,CAAE,CAAA,CAAE,KAAK,EAAE,CAAA;AACjF;AAIO,SAAS,gBAAgB,EAAA,EAAqB;AACnD,EAAA,IAAI,GAAG,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG,OAAO,cAAc,EAAE,CAAA;AACpD,EAAA,IAAI,KAAK,EAAA,CAAG,aAAA;AACZ,EAAA,OAAO,MAAM,EAAA,CAAG,SAAA,CAAU,MAAA,KAAW,CAAA,OAAQ,EAAA,CAAG,aAAA;AAChD,EAAA,OAAO,EAAA,GAAK,CAAA,EAAG,aAAA,CAAc,EAAE,CAAC,CAAA,IAAA,EAAO,aAAA,CAAc,EAAE,CAAC,CAAA,CAAA,GAAK,aAAA,CAAc,EAAE,CAAA;AAC/E;AAEA,SAAS,QAAQ,EAAA,EAAoB;AACnC,EAAA,MAAMD,EAAAA,GAAI,GAAG,qBAAA,EAAsB;AACnC,EAAA,OAAO,EAAE,GAAA,EAAKA,EAAAA,CAAE,GAAA,EAAK,IAAA,EAAMA,EAAAA,CAAE,IAAA,EAAM,MAAA,EAAQA,EAAAA,CAAE,MAAA,EAAQ,KAAA,EAAOA,EAAAA,CAAE,KAAA,EAAM;AACtE;AAEA,UAAU,WAAW,IAAA,EAA0D;AAC7E,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,OAAA,CAAQ,IAAI,CAAA,EAAE;AACzC,EAAA,KAAA,MAAW,EAAA,IAAM,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA,EAAG,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,KAAA,EAAO,OAAA,CAAQ,EAAE,CAAA,EAAE;AACpF;AAEA,SAAS,UAAU,EAAA,EAAsB;AACvC,EAAA,OAAO,EAAA,CAAG,eAAe,EAAA,CAAG,YAAA,GAAe,KAAK,EAAA,CAAG,WAAA,GAAc,GAAG,WAAA,GAAc,CAAA;AACpF;AAKO,SAAS,gBAAA,CAAiB,KAAc,SAAA,EAAmC;AAChF,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,MAAMA,EAAAA,GAAI,UAAU,qBAAA,EAAsB;AAC1C,IAAA,MAAM6B,MAAAA,GAAQ;AAAA,MACZ,KAAK7B,EAAAA,CAAE,GAAA;AAAA,MACP,MAAMA,EAAAA,CAAE,IAAA;AAAA,MACR,MAAA,EAAQA,EAAAA,CAAE,GAAA,GAAM,SAAA,CAAU,YAAA;AAAA,MAC1B,KAAA,EAAOA,EAAAA,CAAE,IAAA,GAAO,SAAA,CAAU;AAAA,KAC5B;AACA,IAAA,MAAM8B,IAAAA,GAAM,aAAA,CAAcD,MAAAA,EAAO,UAAA,CAAW,SAAS,CAAC,CAAA;AACtD,IAAA,OAAOC,IAAAA,GACH,CAAA,wBAAA,EAA2B,eAAA,CAAgBA,IAAAA,CAAI,IAAI,CAAC,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,CAAMA,KAAI,EAAE,CAAC,CAAA,YAAA,EAAeA,IAAAA,CAAI,IAAI,CAAA,CAAA,CAAA,GACzG,wBAAA;AAAA,EACN;AAEA,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,gBAAA,IAAoB,QAAA,CAAS,eAAA;AAClD,EAAA,IAAI,CAAC,SAAA,CAAU,GAAG,CAAA,EAAG,OAAO,IAAA;AAC5B,EAAA,MAAM9B,EAAAA,GAAI,IAAI,qBAAA,EAAsB;AACpC,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,KAAKA,EAAAA,CAAE,GAAA;AAAA,IACP,MAAMA,EAAAA,CAAE,IAAA;AAAA,IACR,MAAA,EAAQA,GAAE,GAAA,GAAM,IAAA,CAAK,IAAIA,EAAAA,CAAE,MAAA,EAAQ,IAAI,YAAY,CAAA;AAAA,IACnD,KAAA,EAAOA,GAAE,IAAA,GAAO,IAAA,CAAK,IAAIA,EAAAA,CAAE,KAAA,EAAO,IAAI,WAAW;AAAA,GACnD;AACA,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,KAAA,EAAO,UAAA,CAAW,GAAG,CAAC,CAAA;AAChD,EAAA,OAAO,GAAA,GACH,CAAA,kBAAA,EAAqB,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAC,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,CAAM,IAAI,EAAE,CAAC,CAAA,uBAAA,EAA0B,GAAA,CAAI,IAAI,CAAA,CAAA,CAAA,GAC9G,IAAA;AACN;AAEA,IAAM,SAAA,GAAY,GAAA;AAGX,SAAS,iBAAiB,OAAA,EAA+B;AAC9D,EAAA0B,UAAU,MAAM;AACd,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AAC3C,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,cAAA,KAAmB,WAAA,EAAa;AACvD,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AACrC,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAA;AAClD,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,SAAA,EAAW;AAIxB,IAAA,IAAI,KAAA;AACJ,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,MAAM;AACxC,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,KAAA,GAAQ,WAAW,MAAM;AACvB,QAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,GAAA,EAAK,SAAS,CAAA;AAC3C,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,QAAA,CAAS,UAAA,EAAW;AACpB,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+DAAA,EAAkE,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,MACvF,GAAG,SAAS,CAAA;AAAA,IACd,CAAC,CAAA;AACD,IAAA,KAAA,MAAW,EAAA,IAAM,CAAC,QAAA,CAAS,eAAA,EAAiB,GAAA,EAAK,WAAW,OAAO,CAAA,EAAG,QAAA,CAAS,OAAA,CAAQ,EAAE,CAAA;AACzF,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,QAAA,CAAS,UAAA,EAAW;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACd;ACrHA,IAAM,KAAA,GAAQ;AAAA,EACZ,EAAE,KAAA,EAAO,MAAA,EAAmB,KAAA,EAAO,MAAA,EAAQ,KAAA,kBAAOX,GAAAA,CAAC,CAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI,CAAA,EAAG;AAAA,EAC7E,EAAE,KAAA,EAAO,OAAA,EAAoB,KAAA,EAAO,OAAA,EAAS,KAAA,kBAAOA,GAAAA,CAAC,CAAA,EAAA,EAAc,IAAA,EAAM,EAAA,EAAI,CAAA,EAAG;AAAA,EAChF,EAAE,KAAA,EAAO,MAAA,EAAmB,KAAA,EAAO,MAAA,EAAQ,KAAA,kBAAOA,GAAAA,CAAC,CAAA,EAAA,EAAa,IAAA,EAAM,EAAA,EAAI,CAAA;AAC5E,CAAA;AAEA,IAAM,UAAA,GAAa,MAAM,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,KAAA,EAAO,OAAM,MAAO;AAAA,EACzD,KAAA;AAAA,EACA,KAAA,EAAO,KAAA;AAAA,EACP,SAAA,EAAW;AACb,CAAA,CAAE,CAAA;AAMK,SAAS,SAAA,CAAU,EAAE,QAAA,EAAAgB,SAAAA,GAAW,MAAK,EAA2B;AACrE,EAAA,MAAM,MAAM,aAAA,EAAc;AAC1B,EAAA,MAAM,IAAA,GAAO,IAAI,WAAA,CAAY,MAAA,KAAW,IAAI,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,GAAI,IAAA;AAEjE,EAAA,uBACEX,IAAAA,CAAAJ,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,CAACe,SAAAA,GAAW,IAAA,GAAO,IAAA,mBAClBX,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,oBAAA;AAAA,QACV,OAAA,EAAS,MAAM,GAAA,CAAI,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,QAErC,QAAA,EAAA;AAAA,0BAAAL,GAAAA,CAAC,CAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,CAAA;AAAA,0BACnBA,GAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,WAAA,EAAS;AAAA;AAAA;AAAA,wBAGjBA,GAAAA;AAAA,MAACY,EAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAW,WAAA;AAAA,QACX,KAAA,EAAM,iBAAA;AAAA,QACN,KAAA,EAAO,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,CAAE,MAAM,KAAA,EAAO,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,MAAK,CAAE,CAAA;AAAA,QAC/E,QAAA,EAAU,CAAC,IAAA,KAAS,GAAA,CAAI,SAAS,IAAI;AAAA;AAAA,KACvC;AAAA,oBAGFZ,GAAAA;AAAA,MAACf,EAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,qBAAA;AAAA,QACV,SAAA,EAAU,YAAA;AAAA,QACV,IAAA,EAAK,IAAA;AAAA,QACL,OAAA,EAAQ,MAAA;AAAA,QACR,KAAA,EAAO,UAAA;AAAA,QACP,OAAO,GAAA,CAAI,IAAA;AAAA,QACX,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,UAAA,IAAI,IAAA,EAAM,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC5B;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AC5CO,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,aAAA,EAAc,EAAoB;AACpE,EAAA,MAAM,MAAM,mBAAA,EAAoB;AAChC,EAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,KAAA,EAAO,aAAa,CAAA;AACjD,EAAA,uBAAOe,GAAAA,CAAC,aAAA,EAAA,EAAc,aAAA,EAAe,GAAA,CAAI,MAAA,CAAO,CAACd,EAAAA,KAAMA,EAAAA,CAAE,MAAA,KAAW,SAAS,CAAA,EAAG,GAAA,EAAU,CAAA;AAC5F;ACMO,SAAS,WAAA,CAAY,MAAc,KAAA,EAAmC;AAC3E,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EAC1C,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AAC3C,EAAA,OAAO,KAAA,CAAM,SAAA,CAAU,CAACQ,EAAAA,KAAM,IAAA,CAAK,QAAA,CAASA,EAAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAC,CAAC,CAAA;AAC5E;AAYO,SAAS,YAAY,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,WAAU,EAAqB;AAC/E,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIgB,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,IAAA,GAAOR,OAAuB,IAAI,CAAA;AACxC,EAAA,MAAM,SAAS,KAAA,EAAM;AACrB,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,KAAS,OAAO,MAAA,KAAW,cAChD,EAAA,GAAK,MAAA,CAAO,QAAA,CAAS,QAAA,CAAA,EAAW,KAAK,CAAA;AAEzC,EAAA,MAAM,QAAQe,WAAAA,CAAY,MAAM,QAAQ,KAAK,CAAA,EAAG,EAAE,CAAA;AAElD,EAAAN,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,KAAA,EAAM;AACN,QAAA,IAAA,CAAK,OAAA,EAAS,aAAA,CAAc,QAAQ,CAAA,EAAG,KAAA,EAAM;AAAA,MAC/C;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAoB;AAClC,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,SAAS,CAAA,CAAE,MAAc,GAAG,KAAA,EAAM;AAAA,IACvD,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,QAAA,CAAS,gBAAA,CAAiB,eAAe,MAAM,CAAA;AAC/C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAC7C,MAAA,QAAA,CAAS,mBAAA,CAAoB,eAAe,MAAM,CAAA;AAAA,IACpD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAIhB,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,uBAAOX,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,CAAA,iBAAA,EAAoB,SAAA,GAAY,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAK,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,EACvF;AAEA,EAAA,uBACEK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,WAAA,EAAc,SAAA,GAAY,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI,GAAA,EAAK,IAAA,EACrE,QAAA,EAAA;AAAA,oBAAAL,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mBAAA,EACZ,QAAA,kBAAAK,IAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAU,qBAAA;AAAA,QACV,eAAA,EAAe,IAAA;AAAA,QACf,eAAA,EAAc,MAAA;AAAA,QACd,eAAA,EAAe,OAAO,MAAA,GAAS,MAAA;AAAA,QAC/B,SAAS,MAAM,OAAA,CAAQ,CAAC,GAAA,KAAQ,CAAC,GAAG,CAAA;AAAA,QAEnC,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,0BACDL,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAoB,eAAY,MAAA,EAAO;AAAA;AAAA;AAAA,KACzD,EACF,CAAA;AAAA,IACC,IAAA,oBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EAAmB,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAK,QAChD,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,sBAChBA,GAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QAEC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,IAAA,EAAK,UAAA;AAAA,QACL,SAAA,EAAU,kBAAA;AAAA,QACV,cAAA,EAAc,CAAA,KAAM,IAAA,GAAO,MAAA,GAAS,MAAA;AAAA,QACpC,OAAA,EAAS,KAAA;AAAA,QAER,QAAA,EAAA,IAAA,CAAK;AAAA,OAAA;AAAA,MAPD,IAAA,CAAK;AAAA,KASb,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AC5GA,SAAS,KAAA,GAA+B;AACtC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,MAAA,CAAO,YAAY,OAAO,IAAA;AAChE,EAAA,OAAO,MAAA,CAAO,WAAW,+BAA+B,CAAA;AAC1D;AAQO,SAAS,gBAAgB,IAAA,EAAiC;AAC/D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIU,QAAAA;AAAA,IAA2B,MACrD,KAAA,EAAM,EAAG,OAAA,GAAU,OAAA,GAAU;AAAA,GAC/B;AAEA,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,SAAS,MAAA,EAAQ;AACrB,IAAA,MAAM,KAAK,KAAA,EAAM;AACjB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,WAAW,CAAC,CAAA,KAA2B,UAAU,CAAA,CAAE,OAAA,GAAU,UAAU,MAAM,CAAA;AACnF,IAAA,EAAA,CAAG,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AACtC,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AAAA,EACxD,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,OAAO,IAAA,KAAS,SAAS,MAAA,GAAS,IAAA;AACpC;ACAO,SAAS,QAAA,CAAS;AAAA,EAAE,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,IAAA,GAAO,MAAA;AAAA,EACzC,KAAA;AAAA,EAAO;AAAK,CAAA,EAAkB;AACtD,EAAA,MAAM,QAAA,GAAW,gBAAgB,IAAI,CAAA;AACrC,EAAA,MAAM,QAAQ,gBAAA,EAAiB;AAE/B,EAAA,MAAM,KAAA;AAAA;AAAA;AAAA,oBAGJN,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,wBAAqB,EAAA,EACrD,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,iBAAA,EACf,QAAA,EAAA;AAAA,QAAA,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,mBACrBL,GAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YAAY,KAAA;AAAA,YAAc,KAAA;AAAA,YAAc,IAAA;AAAA,YAC5B,SAAA,EAAU;AAAA;AAAA,4BACvBA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kBAAkB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACzC,0BAAUA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAA2B,QAAA,EAAA,MAAA,EAAO;AAAA,OAAA,EAC9D,CAAA;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAiB,QAAA,EAAS,CAAA;AAAA,MACzC,0BAAUA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,mBAAmB,QAAA,EAAA,MAAA,EAAO;AAAA,KAAA,EACzD;AAAA,GAAA;AAKF,EAAA,OAAO,KAAA,GACL,wBAEAA,GAAAA,CAAC,iBAAc,KAAA,EAAO,iBAAA,EAAmB,IAAA,EAAM,QAAA,EAC5C,QAAA,EAAA,KAAA,EACH,CAAA;AAEJ;ACrCA,IAAM,OAAA,GAAUF,SAAS,cAAc,CAAA;AACvC,IAAM,UAAA,GAAa,EAAE,IAAA,EAAM,YAAA,EAAuB,UAAU,gBAAA,EAA0B;AACtF,IAAM,aAAA,GAAgBA,SAAS,uBAAuB,CAAA;AACtD,IAAM,UAAA,GAAa,OAAA;AACnB,IAAM,IAAA,GAAO,OAAA;AAgDb,SAAS,QAAA,CAAS,OAAc,EAAA,EAAwC;AACtE,EAAA,MAAMJ,EAAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,EAAE,GAAG,UAAA,EAAY,SAAA;AACzC,EAAA,IAAI,CAACA,IAAG,OAAO,IAAA;AACf,EAAA,MAAM,MAA2B,EAAC;AAClC,EAAA,IAAIA,EAAAA,CAAE,IAAA,EAAM,GAAA,CAAI,IAAA,GAAOA,EAAAA,CAAE,IAAA;AACzB,EAAA,IAAIA,EAAAA,CAAE,IAAA,EAAM,GAAA,CAAI,IAAA,GAAOA,EAAAA,CAAE,IAAA;AACzB,EAAA,OAAO,OAAO,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA,GAAS,IAAI,GAAA,GAAM,IAAA;AAC7C;AAoBA,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,QAAA,GAAW,OAAM,EAAmD;AAC/F,EAAA,MAAM,QAAQ,aAAA,EAAc;AAC5B,EAAA,uBACEM,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,WAAW,uCAAA,GAA0C,eAAA,EACnE,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EAAsB,GAAA,EAAK,CAAC,EAAA,KAAO,KAAA,EAAO,IAAI,KAAA,CAAM,GAAA,EAAK,EAAE,CAAA,EAAG,CAAA,EAC/E,CAAA;AAEJ;AAUO,SAAS,SAAA,CAAU;AAAA,EACxB,QAAA;AAAA,EACA,GAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,WAAA,GAAc,KAAA;AAAA,EACd,SAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA;AAAA,EACA,GAAA,GAAM,EAAA;AAAA,EACN,OAAA,GAAU,CAAA;AAAA,EACV;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AACvC,EAAA,MAAM,UAAA,GAAaO,OAAAA,CAAQ,MAAA,CAAO,MAAA,IAAU,EAAC,EAAG,MAAA,CAAO,CAACb,EAAAA,KAAMA,GAAE,EAAA,KAAO,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACxF,EAAA,MAAM,WAAA,GAAca,OAAAA,CAAQ,MAAA,CAAO,MAAA,IAAU,EAAC,EAAG,MAAA,CAAO,CAACb,EAAAA,KAAMA,GAAE,EAAA,KAAO,UAAU,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAK7F,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,GAAA,GAAM,CAAC,CAAA,IAAK,CAAA,MAAA,EAAS,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/C,GAAG,WAAW,GAAA,CAAI,CAACA,OAAM,CAAA,SAAA,EAAYA,EAAAA,CAAE,GAAG,CAAA,CAAE;AAAA,GAC9C;AACA,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA;AAChC,EAAA,MAAM,QAAA,GAAWQ,OAAsB,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAaA,MAAAA,CAAiB,EAAE,CAAA;AACtC,EAAA,IAAI,QAAA,CAAS,YAAY,KAAA,EAAO;AAC9B,IAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,IAAA,UAAA,CAAW,OAAA,GAAU,SAAA,CAAU,GAAA,CAAIJ,QAAQ,CAAA;AAAA,EAC7C;AACA,EAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAI3B,EAAA,MAAM,SAAA,GAAYI,OAAO,MAAM,CAAA;AAC/B,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,EAAA,MAAM,iBAAA,GAAoBA,OAAO,cAAc,CAAA;AAC/C,EAAA,iBAAA,CAAkB,OAAA,GAAU,cAAA;AAK5B,EAAA,MAAM,QAAA,GAAWA,OAAqB,IAAI,CAAA;AAC1C,EAAA,IAAI,QAAA,CAAS,YAAY,IAAA,EAAM;AAC7B,IAAA,MAAMgB,MAAAA,GAAQ,IAAI,KAAA,EAAM;AACxB,IAAAA,MAAAA,CAAM,YAAA;AAAA,MACJ,UAAA,CAAW;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,EAAA,EAAI,OAAA;AAAA,QACJ,SAAA,EAAW,EAAE,UAAA,EAAY,MAAA,EAAQ,QAAQ,EAAE,SAAA,EAAW,GAAA,EAAK,OAAA,EAAQ;AAAE,OACtE;AAAA,KACH;AACA,IAAAA,MAAAA,CAAM,YAAA;AAAA,MACJ,UAAA,CAAW;AAAA,QACT,IAAA,EAAM,MAAA;AAAA,QACN,EAAA,EAAI,aAAA;AAAA,QACJ,WAAW,EAAE,UAAA,EAAY,UAAA,EAAY,MAAA,EAAQ,EAAC;AAAE,OACjD;AAAA,KACH;AACA,IAAA,QAAA,CAAS,OAAA,GAAUA,MAAAA;AAAA,EACrB;AACA,EAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AAIvB,EAAA,MAAM,UAAU,kBAAA,EAAmB;AAEnC,EAAAC,gBAAgB,MAAM;AACpB,IAAA,KAAA,CAAM,sBAAsB,OAAA,EAAS,EAAE,SAAA,EAAW,GAAA,EAAK,SAAS,CAAA;AAAA,EAClE,GAAG,CAAC,KAAA,EAAO,SAAA,EAAW,GAAA,EAAK,OAAO,CAAC,CAAA;AAEnC,EAAAA,gBAAgB,MAAM;AACpB,IAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,KAAA,CAAM,iBAAiB,OAAO,CAAA,EAAG,UAAA,IAAc,EAAE,CAAA;AACzE,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,OAAO,CAAA;AAC9B,IAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,MAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG,KAAA,CAAM,eAAe,EAAE,CAAA;AAAA,IAC9C;AACA,IAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG;AACrB,MAAA,MAAM,OAAO,MAAA,CAAO,EAAE,EAAE,UAAA,CAAW,WAAW,IAAI,UAAA,GAAa,IAAA;AAC/D,MAAA,KAAA,CAAM,YAAA,CAAa,UAAA,CAAW,EAAE,IAAA,EAAM,EAAA,EAAI,UAAU,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AAC3E,MAAA,KAAA,CAAM,SAAS,EAAE,CAAA;AACjB,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,GAAU,EAAE,CAAA;AACpC,MAAA,IAAI,KAAA,EAAO,KAAA,CAAM,cAAA,CAAe,EAAA,EAAI,KAAK,CAAA;AAAA,IAC3C;AACA,IAAA,KAAA,CAAM,aAAA,CAAc,OAAA,EAAS,CAAC,GAAG,OAAO,CAAC,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA;AAGnB,EAAAR,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,OAAA,CAAQ,eAAA,EAAgB;AACxB,IAAA,OAAO,MAAM,MAAA,CAAO,EAAA,CAAG,yBAAyB,MAAM,OAAA,CAAQ,iBAAiB,CAAA;AAAA,EACjF,CAAA,EAAG,CAAC,KAAA,EAAO,OAAA,EAAS,OAAO,CAAC,CAAA;AAE5B,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,cAAA,EAAgB;AACrB,IAAA,OAAO,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,uBAAA,EAAyB,MAAM;AACpD,MAAA,MAAM,OAAoB,EAAC;AAC3B,MAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,WAAA,CAAY,OAAO,CAAA,EAAG;AAC9C,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,EAAO,KAAA,CAAM,EAAE,CAAA;AACvC,QAAA,IAAI,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,GAAI,MAAA;AAAA,MAC/B;AACA,MAAA,iBAAA,CAAkB,UAAU,IAAI,CAAA;AAAA,IAClC,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,KAAA,EAAO,cAAc,CAAC,CAAA;AAE1B,EAAA,MAAM,WAAA,GAAcM,WAAAA;AAAA,IAClB,CAAC,OAAA,KAAsB,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,IACtD,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,MAAM,MAAA,GAASV,QAAmB,MAAM;AACtC,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAuB,OAAA,CAAQ,IAAI,CAAC,EAAA,EAAI,CAAA,KAAM,CAAC,EAAA,EAAI,KAAA,CAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAC9E,IAAA,MAAM,cAAc,IAAI,GAAA;AAAA,MACtB,UAAA,CAAW,GAAA,CAAI,CAACb,EAAAA,KAAM,CAAC,YAAYA,EAAAA,CAAE,GAAG,CAAA,CAAA,EAAIA,EAAC,CAAC;AAAA,KAChD;AACA,IAAA,OAAO;AAAA,MACL,CAAC,UAAU,GAAG,CAAC,EAAE,MAAK,KAAM;AAC1B,QAAA,MAAM,QAAQ,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AAC7C,QAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,QAAA,uBAAOM,GAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAc,CAAA;AAAA,MACnC,CAAA;AAAA,MACA,CAAC,IAAI,GAAG,CAAC,EAAE,MAAK,KAAM;AACpB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,IAAA;AACrC,QAAA,IAAI,CAAC,aAAa,OAAO,OAAA;AACzB,QAAA;AAAA;AAAA,0BAEEA,GAAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,EAAA,IAC/C,QAAA,kBAAAA,GAAAA,CAAC,SAAI,SAAA,EAAU,eAAA,EAAiB,mBAAQ,CAAA,EAC1C;AAAA;AAAA,MAEJ;AAAA,KACF;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,KAAA,EAAO,WAAA,EAAa,UAAU,CAAC,CAAA;AAE5C,EAAA,MAAM,aAAA,GACJ,WAAA,CAAY,MAAA,KAAW,CAAA,GAAI,IAAA,mBACzBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAACN,EAAAA,qBAChBM,GAAAA,CAAC,UAAA,EAAA,EAAuB,KAAA,EAAON,EAAAA,EAAG,UAAQ,IAAA,EAAA,EAAzBA,EAAAA,CAAE,GAAwB,CAC5C,CAAA,EACH,CAAA;AAGJ,EAAA,MAAM,uBACJM,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAU,OAAA;AAAA,MACV,MAAA;AAAA,MACA,SAAA,EAAU,4BAAA;AAAA,MACV,WAAA,EAAa,SAAA;AAAA,MACb,QAAA;AAAA,MACA,kBAAA,EAAoB,cAAc,WAAA,GAAc;AAAA;AAAA,GAClD;AAGF,EAAA,uBACEA,IAAC,QAAA,EAAA,EAAS,KAAA,EACR,0BAAAA,GAAAA,CAAC,wBAAA,EAAA,EAAyB,YAAY,UAAA,EACnC,QAAA,EAAA,aAAA;AAAA;AAAA;AAAA;AAAA,oBAICK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,WAAA,mBAAcL,GAAAA,CAAC,YAAA,EAAA,EAAc,QAAA,EAAA,IAAA,EAAK,CAAA,GAAkB,IAAA;AAAA,MACpD;AAAA,KAAA,EACH;AAAA,MACE,8BACFA,GAAAA,CAAC,gBAAc,QAAA,EAAA,IAAA,EAAK,CAAA,GAEpB,MAEJ,CAAA,EACF,CAAA;AAEJ;AC7KA,SAAS,gBAAA,CACP,KAAA,EACA,WAAA,EACA,iBAAA,EACM;AACN,EAAA,IAAI,KAAA,CAAM,QAAA,EAAS,CAAE,MAAA,CAAO,SAAS,CAAA,EAAG;AACxC,EAAA,MAAM,SAAS,QAAA,CAAW,IAAI,WAAA,EAAa,iBAAiB,EAAE,CAAC,CAAA;AAC/D,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,MAAM,EAAE,SAAA,EAAW,UAAA,EAAY,GAAG,MAAK,GAAI,MAAA;AAC3C,EAAA,KAAA,CAAM,QAAA,EAAS,CAAE,QAAA,CAAS,IAAI,CAAA;AAChC;AAIA,SAAS,eAAA,CAAgB,EAAE,WAAA,EAAa,iBAAA,EAAmB,MAAK,EAAwB;AACtF,EAAA,MAAM,QAAQ,cAAA,CAAe,EAAE,aAAa,IAAA,IAAQ,MAAA,EAAQ,aAAa,CAAA;AACzE,EAAA,gBAAA,CAAiB,KAAA,EAAO,aAAa,iBAAiB,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,kBAAkB,EAAE,OAAA,EAAS,aAAa,MAAA,EAAQ,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,CAAA;AACvF,EAAA,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,MAAM,OAAA,CAAQ,KAAA,EAAM,EAAG,KAAA,kBAAO,IAAI,GAAA,EAAI,EAAE;AAC1E;AAEA,eAAe,cACb,EAAE,WAAA,EAAa,mBAAmB,IAAA,EAAK,EACvC,YACA,OAAA,EACoB;AAGpB,EAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa;AAAA,IAChC,UAAA;AAAA,IACA,OAAA,EAAS,OAAA,IAAY,MAAM,cAAA,EAAe;AAAA,IAC1C,aAAa,IAAA,IAAQ,MAAA;AAAA,IACrB;AAAA,GACD,CAAA;AACD,EAAA,gBAAA,CAAiB,MAAA,CAAO,KAAA,EAAO,WAAA,EAAa,iBAAiB,CAAA;AAC7D,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAqB;AACvC,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,OAAO,KAAA,CAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,OAAO,KAAA,KAAU;AAClD,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,KAAA,CAAM,cAAc,CAAA,EAAG,WAAA,EAAa,OAAA;AACpF,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,IAAI,KAAA,CAAM,EAAA,EAAI,MAAM,IAAA,CAAK,MAAM,CAAA;AAAA,MACvC,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,4CAAA,EAA+C,KAAA,CAAM,EAAE,KAAK,KAAK,CAAA;AAC9E,QAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,IAAI,CAAA;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,GACH;AACA,EAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAM;AAC5B;AAEA,SAAS,WAAA,CAAY;AAAA,EACnB,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAA4D;AAC1D,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,IAAA,IAAQ,MAAM,CAAA;AACnD,EAAA,uBACEA,IAAC,aAAA,EAAA,EAAc,KAAA,EAAO,mBAAmB,IAAA,EAAM,YAAA,EAAc,SAAA,EAAU,QAAA,EACrE,QAAA,kBAAAA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAO,KAAA,IAAS,QAAA;AAAA,MAChB,IAAA;AAAA,MACC,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,MACzB,GAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,KAAS,EAAC;AAAA,MAErC,QAAA,EAAA;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;AAMA,IAAM,YAAA,GAAe;AAAA,EACnB,EAAE,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,IAAI,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,KAAA,EAAM;AAAA,EAC1D,EAAE,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,IAAI,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,KAAA,EAAM;AAAA,EAC1D,EAAE,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,IAAI,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,KAAA,EAAM;AAAA,EAC1D,EAAE,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,IAAI,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,KAAA,EAAM;AAAA,EAC1D,EAAE,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,IAAI,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,KAAA;AACtD,CAAA;AAEA,SAAS,YAAY,MAAA,EAAmC;AACtD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,CAACd,IAAG,CAAA,KAAM;AACjC,IAAA,MAAMQ,EAAAA,GAAI,YAAA,CAAa,CAAA,GAAI,YAAA,CAAa,MAAM,CAAA;AAC9C,IAAA,OAAO,2BAA2BA,EAAAA,CAAE,EAAE,CAAA,CAAA,EAAIA,EAAAA,CAAE,EAAE,CAAA,IAAA,EAAOA,EAAAA,CAAE,EAAE,CAAA,CAAA,EAAIA,GAAE,EAAE,CAAA,qBAAA,EAAwBR,EAAC,CAAA,gCAAA,EAAmCQ,GAAE,IAAI,CAAA,CAAA,CAAA;AAAA,EACrI,CAAC,CAAA;AACD,EAAA,KAAA,CAAM,KAAK,8DAA8D,CAAA;AACzE,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,QAAA,CAAS;AAAA,EAChB,aAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,UAAU,kBAAA,EAAmB;AACnC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,iBAAA;AAAA,IACtC,sBAAA;AAAA,IACA,MAAA;AAAA,IACA,EAAE,OAAO,KAAA;AAAM,GACjB;AACA,EAAA,uBACEM,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,eAAA;AAAA,MACV,gBAAA,EAAiB,iBAAA;AAAA,MACjB,gBAAA,EAAiB,cAAA;AAAA,MACjB,KAAA,EAAM,aAAA;AAAA,MACN,YAAA,EAAc,GAAA;AAAA,MACd,KAAA,EAAO,YAAA;AAAA,MACP,aAAA,EAAe,CAACJ,EAAAA,KAAM;AACpB,QAAA,eAAA,CAAgBA,EAAC,CAAA;AACjB,QAAA,OAAA,EAAS,eAAA,EAAgB;AAAA,MAC3B,CAAA;AAAA,MACA,OAAA,kBAASI,GAAAA,CAAC,gBAAA,EAAA,EAAiB,aAAA,EAA8B,CAAA;AAAA,MAExD;AAAA;AAAA,GACH;AAEJ;AAIO,SAAS,IAAI,KAAA,EAAiB;AACnC,EAAA,IAAI,QAAQ,GAAA,CAAI,QAAA,KAAa,gBAAgB,KAAA,CAAM,WAAA,CAAY,WAAW,CAAA,EAAG;AAC3E,IAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,EAC3E;AACA,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAQ,GAAI,KAAA;AAChC,EAAA,oBAAA,CAAqB,OAAA,EAAS,EAAE,UAAA,EAAY,OAAA,EAAS,CAAA;AACrD,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IAAuB,MACpC,eAAe,MAAA,GAAY,eAAA,CAAgB,KAAK,CAAA,GAAI,aAAA,CAAc,KAAA,EAAO,UAAA,EAAY,OAAO;AAAA,GAC9F;AACA,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,KAAA,CAAM,QAAA,KAAa,MAAA,mBACxBA,GAAAA,CAAAC,UAAA,EAAG,QAAA,EAAA,KAAA,CAAM,QAAA,EAAS,CAAA,mBAElBD,GAAAA,CAAC,eAAY,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,OAAO,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,EAE7F;AACA,EAAA,uBAAOA,GAAAA,CAAC,UAAA,EAAA,EAAY,GAAG,OAAO,MAAA,EAAgB,CAAA;AAChD;AAEA,SAAS,UAAA,CAAW;AAAA,EAClB,WAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,EAAAgB,SAAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAqC;AACnC,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAIlB,EAAAG,gBAAgB,MAAM;AACpB,IAAA,KAAA,CAAM,QAAA,EAAS,CAAE,cAAA,CAAe,WAAW,CAAA;AAAA,EAC7C,CAAA,EAAG,CAAC,WAAA,EAAa,KAAK,CAAC,CAAA;AAEvB,EAAA,MAAM,SAASV,QAAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAC9C,EAAA,MAAM,iBAAiBA,QAAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,cAAc,CAAA;AAC9D,EAAA,MAAM,YAAYA,QAAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC/C,EAAA,MAAM,SAASA,QAAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAC9C,EAAA,MAAM,iBAAiBA,QAAAA,CAAS,KAAA,EAAO,CAAC,CAAA,KAAM,EAAE,cAAc,CAAA;AAK9D,EAAA,MAAM,aAAA,GAAgBP,OAA0D,IAAI,CAAA;AACpF,EAAA,IAAI,aAAA,CAAc,OAAA,KAAY,IAAA,EAAM,aAAA,CAAc,UAAU,uBAAA,EAAwB;AAQpF,EAAA,MAAM,eAAe,kBAAA,EAAmB;AACxC,EAAA,MAAM,SAAA,GAAY,iBAAiB,MAAM,CAAA;AACzC,EAAA,MAAM,UAAA,GAAa,iBAAiB,OAAO,CAAA;AAC3C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIQ,SAAmC,IAAI,CAAA;AACrE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAmC,IAAI,CAAA;AACvE,EAAA,MAAM,UAAA,GAAaR,OAAiC,IAAI,CAAA;AACxD,EAAA,MAAM,WAAA,GAAcA,OAAiC,IAAI,CAAA;AACzD,EAAA,MAAM,YAAYA,MAAAA,CAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AACvC,EAAA,MAAM,UAAA,GAAaA,OAAkD,IAAI,CAAA;AAMzE,EAAA,MAAM,OAAA,GAAUe,WAAAA,CAAY,CAAC,KAAA,KAAwB;AACnD,IAAA,MAAM,QAAA,GAAW,CAAC,WAAA,CAAY,OAAA,EAAS,UAAA,CAAW,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC/B,EAAAA,KAAMA,EAAAA,KAAM,IAAI,CAAA;AACnF,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAMU,KAAI,IAAA,CAAK,KAAA,CAAM,MAAM,IAAA,CAAK,KAAA,GAAQ,MAAM,GAAG,CAAA;AACjD,IAAA,MAAMC,KAAI,IAAA,CAAK,KAAA,CAAM,MAAM,IAAA,CAAK,MAAA,GAAS,MAAM,GAAG,CAAA;AAClD,IAAA,IAAI,UAAU,OAAA,CAAQ,CAAA,KAAMD,MAAK,SAAA,CAAU,OAAA,CAAQ,MAAMC,EAAAA,EAAG;AAC1D,MAAA,SAAA,CAAU,OAAA,GAAU,EAAE,CAAA,EAAAD,EAAAA,EAAG,GAAAC,EAAAA,EAAE;AAC3B,MAAA,KAAA,MAAWX,MAAK,QAAA,EAAU;AACxB,QAAAA,GAAE,KAAA,GAAQU,EAAAA;AACV,QAAAV,GAAE,MAAA,GAASW,EAAAA;AACX,QAAAX,GAAE,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAA,CAAM,KAAK,KAAK,CAAA,EAAA,CAAA;AACnC,QAAAA,GAAE,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,KAAK,MAAM,CAAA,EAAA,CAAA;AAAA,MACvC;AACA,MAAA,UAAA,CAAW,SAAS,aAAA,EAAc;AAClC,MAAA;AAAA,IACF;AAAA,EAIF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,EAAE,OAAA,EAAS,CAAA;AAC9C,EAAA,UAAA,CAAW,OAAA,GAAU,UAAA;AACrB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIwB,SAAgC,IAAI,CAAA;AAClE,EAAA,MAAM,mBAAmB,UAAA,CAAW,YAAA;AACpC,EAAA,MAAM,UAAA,GAAaO,WAAAA;AAAA,IACjB,CAAC,EAAA,KAA8B;AAC7B,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA,IAAI,CAAC,YAAA,EAAc,gBAAA,CAAiB,EAAE,CAAA;AAAA,IACxC,CAAA;AAAA,IACA,CAAC,cAAc,gBAAgB;AAAA,GACjC;AACA,EAAA,gBAAA,CAAiB,OAAO,CAAA;AACxB,EAAA,MAAM,UAAU,YAAA,IAAgB,UAAA;AAChC,EAAA,MAAM,eAAA,GAAkBV,OAAAA;AAAA,IACtB,MACE,YAAA,GAAe,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,UAAA,EAAW,GAAI,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,QAAA,EAAS;AAAA,IAC3F,CAAC,YAAA,EAAc,SAAA,EAAW,UAAA,EAAY,SAAS,QAAQ;AAAA,GACzD;AAEA,EAAA,MAAM,eAAA,GAAkBA,OAAAA;AAAA,IACtB,MACE,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO;AAAA,MACpD,GAAA;AAAA,MACA,OAAO,KAAA,CAAM,SAAA;AAAA,MACb,IAAI,KAAA,CAAM;AAAA,KACZ,CAAE,CAAA;AAAA,IACJ,CAAC,cAAc;AAAA,GACjB;AACA,EAAA,MAAM,YAAA,GAAe,gBAAgB,SAAS,CAAA;AAO9C,EAAA,MAAM,YAAY,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,IAAI,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAeA,OAAAA;AAAA,IACnB,MAAM,gBAAA,CAAiB,CAAC,GAAI,SAAA,GAAY,gBAAA,GAAmB,EAAC,EAAI,GAAI,KAAA,IAAS,EAAG,GAAG,SAAS,CAAA;AAAA,IAC5F,CAAC,SAAA,EAAW,KAAA,EAAO,SAAS;AAAA,GAC9B;AACA,EAAA,MAAM,kBAAkB,YAAA,CAAa,IAAA,CAAK,CAACrB,EAAAA,KAAMA,EAAAA,CAAE,WAAW,QAAQ,CAAA;AACtE,EAAA,MAAM,mBAAmB,YAAA,CAAa,IAAA,CAAK,CAACA,EAAAA,KAAMA,EAAAA,CAAE,WAAW,SAAS,CAAA;AAExE,EAAAyB,UAAU,MAAM;AACd,IAAA,IAAI,IAAA,IAAQ,IAAA,KAAS,KAAA,CAAM,QAAA,GAAW,IAAA,EAAM;AAC1C,MAAA,KAAA,CAAM,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAI,CAAA;AAAA,IAC/B;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAEhB,EAAA,MAAM,YAAA,GAAeJ,QAAyB,MAAM;AAClD,IAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,KAA8B;AACnD,MAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,KAAA,CAAM,UAAS,CAAE,MAAA,CAAO,GAAA,CAAI,CAACX,OAAM,CAACA,EAAAA,CAAE,EAAA,EAAIA,EAAC,CAAC,CAAC,CAAA;AACzE,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAACA,EAAAA,KAAM,YAAY,GAAA,CAAIA,EAAAA,CAAE,EAAE,CAAA,IAAKA,EAAC,CAAA;AACzD,MAAA,KAAA,CAAM,QAAA,CAAS,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,IACnC,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA,EAAU,CAAC,cAAA,EAAgB,OAAA,KAAY;AACrC,QAAA,MAAM,IAAA,GAAO,SAAW,KAAA,CAAM,QAAA,GAAW,MAAA,EAAQ,WAAA,EAAa,gBAAgB,OAAO,CAAA;AACrF,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB,CAAA;AAAA,MACA,UAAA,EAAY,CAAC,EAAA,KAAO;AAClB,QAAA,MAAM,OAAO,UAAA,CAAa,KAAA,CAAM,QAAA,EAAS,CAAE,QAAQ,EAAE,CAAA;AACrD,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB,CAAA;AAAA,MACA,UAAA,EAAY,CAAC,EAAA,KAAO;AAClB,QAAA,MAAM,OAAO,UAAA,CAAa,KAAA,CAAM,QAAA,EAAS,CAAE,QAAQ,EAAE,CAAA;AACrD,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB,CAAA;AAAA,MACA,aAAA,EAAe,CAAC,GAAA,KAAQ;AACtB,QAAA,aAAA,CAAc,cAAgB,KAAA,CAAM,QAAA,EAAS,CAAE,MAAA,EAAQ,GAAG,CAAC,CAAA;AAAA,MAC7D,CAAA;AAAA,MACA,UAAA,EAAY,CAAC,EAAA,KAAO;AAClB,QAAA,MAAM,OAAO,UAAA,CAAa,KAAA,CAAM,UAAS,CAAE,MAAA,EAAQ,IAAI,WAAW,CAAA;AAClE,QAAA,MAAM,SAAS,IAAA,CAAK,IAAA,CAAK,CAACA,EAAAA,KAAMA,EAAAA,CAAE,OAAO,EAAE,CAAA;AAC3C,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,MAAO;AAAA,UACrB,MAAA,EAAQ,EAAE,MAAA,CAAO,GAAA;AAAA,YAAI,CAACA,EAAAA,KACpBA,EAAAA,CAAE,EAAA,KAAO,EAAA,GACL,EAAE,GAAGA,EAAAA,EAAG,MAAA,EAAQ,MAAA,CAAO,QAAQ,KAAA,EAAO,MAAA,CAAO,OAAO,IAAA,EAAM,MAAA,CAAO,MAAK,GACtEA;AAAA;AACN,SACF,CAAE,CAAA;AAAA,MACJ,CAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA,EAAc,CAAC,OAAA,EAAS,IAAA,KAAS;AAC/B,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,EAAS,CAAE,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,KAAY,OAAO,CAAA,CAAE,MAAA;AACnF,QAAA,KAAA,CAAM,QAAA,GAAW,YAAA,CAAa,OAAA,EAAS,QAAQ,CAAA,SAAA,EAAY,KAAA,GAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,MACxE,CAAA;AAAA,MACA,YAAA,EAAc,CAAC,OAAA,EAAS,UAAA,KAAe;AACrC,QAAA,KAAA,CAAM,QAAA,EAAS,CAAE,YAAA,CAAa,UAAA,EAAY,OAAO,CAAA;AAAA,MACnD,CAAA;AAAA,MACA,cAAA,EAAgB,CAAC,UAAA,KAAe;AAC9B,QAAA,KAAA,CAAM,QAAA,EAAS,CAAE,cAAA,CAAe,UAAU,CAAA;AAAA,MAC5C,CAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,QAAA,KAAA,CAAM,QAAA,EAAS,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA,MAC5B,CAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,MAAA,EAAQ,gBAAgB,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,QAAQ,CAAC,CAAA;AAIjF,EAAA,MAAM,aAAA,GACJ,YAAA,KAAiB,MAAA,IAAU,MAAA,IAAU,OAAO,MAAA,GAAS,CAAA,GAChD,EAAE,CAAC,gBAA0B,GAAG,WAAA,CAAY,MAAM,GAAE,GACrD,MAAA;AAEN,EAAA,MAAM,4BACJI,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ,eAAA;AAAA,MACR,KAAK,MAAA,CAAO,GAAA,CAAI,CAACJ,EAAAA,KAAMA,GAAE,EAAE,CAAA;AAAA,MAC3B,SAAA,EAAS,IAAA;AAAA,MACT,WAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,CAAC,GAAA,KAAQ,YAAA,CAAa,cAAc,GAAG,CAAA;AAAA,MAClD,MAAA;AAAA,MACA,gBAAgB,CAAC,IAAA,KAAS,MAAM,QAAA,EAAS,CAAE,UAAU,IAAI,CAAA;AAAA,MAExD,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAACA,EAAAA,qBACXI,GAAAA,CAAC,KAAA,EAAA,EAAiB,EAAA,EAAIJ,EAAAA,CAAE,EAAA,EAAI,MAAA,EAAgB,QAAA,EAAA,EAAhCA,EAAAA,CAAE,EAAkD,CACjE;AAAA;AAAA,GACH;AAGF,EAAA,uBACEI,GAAAA,CAAC,eAAA,CAAgB,QAAA,EAAhB,EAAyB,KAAA,EAAO,EAAE,KAAA,EAAM,EACvC,QAAA,kBAAAA,GAAAA,CAAC,kBAAA,CAAmB,QAAA,EAAnB,EAA4B,KAAA,EAAO,MAAA,CAAO,OAAA,EACzC,QAAA,kBAAAA,GAAAA,CAAC,wBAAA,CAAyB,QAAA,EAAzB,EAAkC,OAAO,MAAA,CAAO,KAAA,EAC/C,QAAA,kBAAAA,GAAAA,CAAC,UAAA,CAAW,QAAA,EAAX,EAAoB,KAAA,EAAO,cAC1B,QAAA,kBAAAA,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,iBAAA;AAAA,MACP,IAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAU,QAAA;AAAA,MACV,KAAA,EAAO,aAAA;AAAA,MAEP,QAAA,kBAAAA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAO,KAAA,IAAS,QAAA;AAAA,UAChB,IAAA,EAAM,SAAA;AAAA,UACL,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU,EAAC;AAAA,UACzB,GAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,KAAS,EAAC;AAAA,UACtC,MAAA,EACE,eAAA,mBACEK,IAAAA,CAAAJ,UAAA,EACG,QAAA,EAAA;AAAA,YAAA,MAAA;AAAA,4BACDD,GAAAA,CAAC,eAAA,EAAA,EAAgB,aAAA,EAAe,YAAA,EAAc;AAAA,WAAA,EAChD,CAAA,GAEA,MAAA;AAAA,UAGJ,MAAA,kBACEK,IAAAA,CAAAJ,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAD,GAAAA,CAAC,SAAA,EAAA,EAAW,GAAIgB,SAAAA,KAAa,MAAA,GAAY,EAAE,QAAA,EAAAA,SAAAA,EAAS,GAAI,EAAC,EAAI,CAAA;AAAA,YAC5D,QAAA;AAAA,4BACDhB,GAAAA,CAAC,eAAA,EAAA,EAAgB,aAAA,EAAe,YAAA,EAAc;AAAA,WAAA,EAChD,CAAA;AAAA,UAGF,QAAA,kBAAAA,GAAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,aAAA,CAAc,OAAA,EAC9C,QAAA,kBAAAA,GAAAA,CAAC,cAAA,CAAe,QAAA,EAAf,EAAwB,KAAA,EAAO,OAAA,EAC9B,QAAA,kBAAAA,GAAAA,CAAC,oBAAA,CAAqB,QAAA,EAArB,EAA8B,KAAA,EAAO,eAAA,EACpC,QAAA,kBAAAK,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EAAe,GAAA,EAAK,UAAA,EAChC,QAAA,EAAA;AAAA,YAAA,YAAA,GAAe,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAMdA,IAAAA,CAAAJ,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,gCAAAD,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,wCAAA;AAAA,oBACV,GAAA,EAAK,CAAC,EAAA,KAAO;AACX,sBAAA,WAAA,CAAY,OAAA,GAAU,EAAA;AACtB,sBAAA,WAAA,CAAY,EAAE,CAAA;AAAA,oBAChB;AAAA;AAAA,iBACF;AAAA,gCACAA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,uCAAA;AAAA,oBACV,GAAA,EAAK,CAAC,EAAA,KAAO;AACX,sBAAA,UAAA,CAAW,OAAA,GAAU,EAAA;AACrB,sBAAA,UAAA,CAAW,EAAE,CAAA;AAAA,oBACf;AAAA;AAAA;AACF,eAAA,EACF;AAAA,aAAA;AAAA,YAED,gBAAA,mBACCK,IAAAA,CAAC,QAAA,EAAA,EAAS,eAAe,YAAA,EACvB,QAAA,EAAA;AAAA,8BAAAL,GAAAA,CAAC,UAAA,EAAA,EAAW,aAAA,EAAe,YAAA,EAAc,CAAA;AAAA,cACxC;AAAA,aAAA,EACH,CAAA,mBAEAK,IAAAA,CAAAJ,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAD,GAAAA,CAAC,UAAA,EAAA,EAAW,aAAA,EAAe,YAAA,EAAc,CAAA;AAAA,cACxC;AAAA,aAAA,EACH;AAAA,WAAA,EAEJ,CAAA,EACF,GACF,CAAA,EACF;AAAA;AAAA;AACF;AAAA,GACF,EACF,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA;AAEJ","file":"index.js","sourcesContent":["/**\n * Public types for `@weasel-js/svg`. The package exposes a flat,\n * discriminated-union node model (`SvgNode`) that mirrors the SVG element\n * tree but uses weasel-native leaf data (`Path`, `FillStyle`) for geometry and\n * paint.\n *\n * Parsing collapses every `transform=\"...\"` onto its descendants' geometry,\n * so the `SvgNode` tree returned from `parseSvg` never has a non-identity\n * group transform. Consumers may still construct groups with explicit\n * transforms before serializing, in which case the serializer emits a\n * single `matrix(a b c d e f)` on the `<g>`.\n */\n\nimport type { Path, FillStyle, Stroke, StyledRun, TextStyle } from '@weasel-js/core';\n\n/**\n * Opaque pass-through bag for namespaced XML content.\n *\n * weasel-svg does not interpret the contents — it only ensures that any\n * attributes or child elements in a *declared* XML namespace round-trip\n * losslessly through parse → serialize. Consumers (e.g. an app-specific\n * bridge layer) hang their domain semantics off this structure.\n *\n * Keyed by namespace prefix (the prefix is a write-time choice; the URI\n * is the canonical identifier and is supplied via `ParseOptions.namespaces`\n * / `SerializeOptions.namespaces`).\n */\nexport interface NamespaceMeta {\n [prefix: string]: {\n /** Local-name → string-value map for attributes in this namespace. */\n attrs?: Record<string, string>;\n /**\n * Child elements in this namespace, keyed by local name. Each entry\n * is an array because a namespace can host multiple sibling elements\n * with the same tag (e.g. `<wd:layer/><wd:layer/>`).\n */\n elements?: Record<string, NamespacedElement[]>;\n };\n}\n\n/** Opaque structured representation of a namespaced element. */\nexport interface NamespacedElement {\n /** Attribute local-name → string-value. */\n attrs: Record<string, string>;\n /** Text content, when the element contains only text (no child elements). */\n text?: string;\n /** Nested namespaced children, keyed by local name (recursive). */\n children?: Record<string, NamespacedElement[]>;\n}\n\n/**\n * 2x3 affine matrix in column-major form (SVG's `matrix(a b c d e f)`\n * order). Maps `[x', y'] = [a*x + c*y + e, b*x + d*y + f]`.\n */\nexport type Matrix = readonly [number, number, number, number, number, number];\n\n/** Identity matrix — useful as a default in tests / constructors. */\nexport const IDENTITY_MATRIX: Matrix = [1, 0, 0, 1, 0, 0];\n\n/**\n * FillStyle description in the SVG sense — either explicit `none`, a solid\n * color, or a reference to a weasel-native gradient `FillStyle`. Solid colors\n * are normalized to `#rrggbb` strings; opacity is carried separately so\n * `fill-opacity` and `stroke-opacity` round-trip cleanly.\n */\nexport type SvgPaint =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; opacity?: number }\n | { kind: 'gradient'; paint: FillStyle };\n\n/** Stroke description: a paint plus structural line parameters. */\nexport interface SvgStroke {\n paint: SvgPaint;\n /** World units, or `{ px }` for a width that holds its rendered thickness\n * however the document is scaled — SVG's `vector-effect=\"non-scaling-stroke\"`,\n * and the same unit system as the kit's `Stroke.width`. */\n width: number | { px: number };\n opacity?: number;\n /** `stroke-linecap`. Default per SVG spec is `'butt'`. */\n cap?: 'butt' | 'round' | 'square';\n /** `stroke-linejoin`. Default per SVG spec is `'miter'`. SVG's `arcs` / `miter-clip` map to `'miter'` with a warning. */\n join?: 'miter' | 'round' | 'bevel';\n /** `stroke-dasharray` as a flat number array. Odd-length inputs are doubled per SVG spec. */\n dash?: number[];\n /**\n * `stroke-miterlimit`. SVG's default is 4. Weasel's renderer defaults to\n * 10 (Canvas2D) when unset, so parsed strokes without an explicit\n * attribute may render with longer miters than the source SVG intended.\n */\n miterLimit?: number;\n /** `marker-start` / `marker-mid` / `marker-end`, as the bare `url(#id)` key. */\n markerStart?: string;\n markerMid?: string;\n markerEnd?: string;\n}\n\n/**\n * Leaf node: a path geometry plus fill/stroke. All other v1 shapes\n * (`<rect>`, `<ellipse>`, etc.) are lowered to this representation on\n * parse — `<rect>` uses weasel's `RectPath` fast-path subtype when\n * possible, everything else becomes a `PolygonPath`.\n */\nexport interface SvgPathNode {\n kind: 'path';\n path: Path;\n fill: SvgPaint;\n stroke?: SvgStroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the AABB\n * center of the underlying `path` geometry. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Group node: an SVG `<g>`. On parse, `transform` is always omitted (any\n * `transform` attribute is collapsed onto descendants' geometry). On\n * serialize, a non-identity `transform` is emitted as\n * `matrix(a b c d e f)`.\n */\nexport interface SvgGroupNode {\n kind: 'group';\n children: SvgNode[];\n transform?: Matrix;\n opacity?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Text leaf node. Mirrors the kit's `TextPose` shape — a bounding box plus\n * text content, optional rich-text `runs` (per-range styling), and an\n * optional `TextStyle` for the node-wide defaults.\n *\n * Note on SVG text geometry: native `<text>` flows from a baseline; it\n * doesn't have width/height attributes. The serializer emits\n * `dominant-baseline=\"text-before-edge\"` so `y` is the top of the text\n * box, plus `data-weasel-width` / `data-weasel-height` so weasel's\n * explicit box dimensions round-trip losslessly. External SVG text\n * (lacking the data-* attrs) imports with the width the kit's text layout\n * measures — an em-based estimate when no registered font can — and\n * `height = fontSize * lineHeight * (lineCount || 1)`.\n *\n * `x` here is always the box's left edge. In the SVG it is the\n * `text-anchor` point, and the parser and serializer convert between them.\n */\nexport interface SvgTextNode {\n kind: 'text';\n x: number;\n y: number;\n width: number;\n height: number;\n /** Plain text. When `runs` is set, `runsToPlainText(runs)` must equal `text`. */\n text: string;\n /** Optional per-range styling — same shape as `TextPose.runs`. */\n runs?: StyledRun[];\n /** Node-wide typography. Defaults applied at render time via `resolveTextStyle`. */\n style?: TextStyle;\n /**\n * Node-wide glyph paint, the `FillStyle` / `Stroke` a kit text node holds\n * in `data.fill` / `data.stroke`. Not `SvgPaint`, which is the path\n * nodes' shape — a text paint reaches the renderer through the runs, and\n * `StyledRun.fill` / `.stroke` override these per range.\n *\n * `null` is SVG's `fill=\"none\"`: outline-only text, painted by its stroke\n * alone. Absent takes the default black.\n */\n fill?: FillStyle | null;\n stroke?: Stroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Raster-image leaf — an SVG `<image>`. `href` is the element's `href` (or\n * legacy `xlink:href`) verbatim: an external URL or a `data:` URI. The\n * package neither fetches nor decodes it, so an external URL round-trips as\n * a reference and only resolves when something downstream loads it.\n *\n * SVG's `preserveAspectRatio` is not modeled; the box is taken literally.\n */\nexport interface SvgImageNode {\n kind: 'image';\n href: string;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/** Discriminated-union node — the leaf of the public tree. */\nexport type SvgNode = SvgPathNode | SvgGroupNode | SvgTextNode | SvgImageNode;\n\n/** Options for {@link parseSvg}. */\nexport interface ParseOptions {\n /**\n * Map of prefix → URI for XML namespaces the caller wants surfaced.\n * Attributes / child elements in any declared namespace are collected\n * into `SvgNode.meta` (per element) or `ParseResult.documentMeta` (root).\n * Undeclared namespaces are preserved in the DOM but not promoted into\n * the structured `meta` bag; they are silently dropped at serialize time.\n */\n namespaces?: Record<string, string>;\n}\n\n/** Output of {@link parseSvg}. */\nexport interface ParseResult {\n nodes: SvgNode[];\n /** Non-fatal notices (unsupported elements, unrecognized attributes). */\n warnings: string[];\n /**\n * Opaque per-document bag for declared namespaces. Holds root-level\n * namespaced attributes (`documentMeta.<prefix>.attrs`) and namespaced\n * root children (`documentMeta.<prefix>.elements`).\n */\n documentMeta?: NamespaceMeta;\n /** Root `viewBox` attribute, parsed from `\"x y width height\"`. */\n viewBox?: { x: number; y: number; width: number; height: number };\n /** Root `width` attribute, parsed as a unitless number when present. */\n width?: number;\n /** Root `height` attribute, parsed as a unitless number when present. */\n height?: number;\n /** Text content of the first `<title>` child of `<svg>`, when present. */\n title?: string;\n}\n\n/** Options for {@link serializeSvg}. */\nexport interface SerializeOptions {\n /**\n * Override the root `viewBox`. When omitted, the serializer computes\n * a tight bounding box from the supplied nodes.\n */\n viewBox?: { x: number; y: number; width: number; height: number };\n /**\n * Called for paint that can't be expressed in SVG and is dropped — a\n * conic gradient, or a pattern carrying a `TextureHandle` instead of a\n * `TilePatternSpec`. Without this the loss is silent.\n */\n onWarn?: (message: string) => void;\n /** Emit `width=\"...\"` on the root `<svg>`. */\n width?: number;\n /** Emit `height=\"...\"` on the root `<svg>`. */\n height?: number;\n /**\n * Emit `<title>...</title>` as the first child of the root `<svg>`. The\n * value is XML-escaped on output. Empty strings are skipped.\n */\n title?: string;\n /**\n * Map of prefix → URI for XML namespaces to declare on the root\n * `<svg>`. The serializer reads `documentMeta[prefix]` and\n * `node.meta[prefix]` to write the actual attributes and elements.\n */\n namespaces?: Record<string, string>;\n /**\n * Opaque per-document namespaced extras. Each `<prefix>.attrs` becomes\n * `<prefix>:<name>=\"...\"` attributes on the root `<svg>`. Each\n * `<prefix>.elements[localName]` becomes `<prefix>:<localName>...>`\n * children placed immediately before any geometry.\n */\n documentMeta?: NamespaceMeta;\n /** Pretty-print with newlines + indentation. Default `false`. */\n pretty?: boolean;\n}\n","/**\n * SVG transform attribute helpers. Parses the four primitive transform\n * functions weasel-svg supports (`matrix`, `translate`, `scale`, `rotate`)\n * into a single 2x3 affine matrix, and exposes the point/path mappers we\n * need to collapse `transform=` onto leaf geometry at parse time.\n */\n\nimport { invert } from '@weasel-js/geom';\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\n\n/** Multiply two 2x3 affine matrices (a then b applied to a column vector). */\nexport function multiply(a: Matrix, b: Matrix): Matrix {\n // [a0 a2 a4] [b0 b2 b4]\n // [a1 a3 a5] [b1 b3 b5]\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n a[0] * b[4] + a[2] * b[5] + a[4],\n a[1] * b[4] + a[3] * b[5] + a[5],\n ];\n}\n\n/** Apply a 2x3 affine to a 2D point. */\nexport function applyMatrix(m: Matrix, x: number, y: number): { x: number; y: number } {\n return { x: m[0] * x + m[2] * y + m[4], y: m[1] * x + m[3] * y + m[5] };\n}\n\n/** True if `m` is the identity within a small epsilon. */\nexport function isIdentity(m: Matrix, eps = 1e-9): boolean {\n return (\n Math.abs(m[0] - 1) < eps &&\n Math.abs(m[1]) < eps &&\n Math.abs(m[2]) < eps &&\n Math.abs(m[3] - 1) < eps &&\n Math.abs(m[4]) < eps &&\n Math.abs(m[5]) < eps\n );\n}\n\nconst NUM_RE = /[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g;\n\nfunction readNumbers(s: string): number[] {\n const out: number[] = [];\n const matches = s.match(NUM_RE);\n if (!matches) return out;\n for (const m of matches) {\n const n = Number(m);\n if (Number.isFinite(n)) out.push(n);\n }\n return out;\n}\n\n/**\n * Parse an SVG `transform=\"...\"` string into a single 2x3 matrix.\n * Functions compose right-to-left in SVG's coordinate model: in\n * `transform=\"A B\"`, the rightmost function is applied first to a point's\n * local coordinates. We accumulate accordingly: `result = result * fn`.\n *\n * Unrecognized functions emit a warning via the optional callback and are\n * skipped (the rest of the transform list still applies).\n */\nexport function parseTransform(\n attr: string | null | undefined,\n onWarn?: (message: string) => void,\n): Matrix {\n if (!attr) return IDENTITY_MATRIX;\n let result: Matrix = IDENTITY_MATRIX;\n // Split into \"name(args)\" chunks.\n const fnRe = /([A-Za-z]+)\\s*\\(([^)]*)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = fnRe.exec(attr)) !== null) {\n const name = match[1].toLowerCase();\n const nums = readNumbers(match[2]);\n let local: Matrix | null = null;\n if (name === 'matrix' && nums.length >= 6) {\n local = [nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]];\n } else if (name === 'translate') {\n const tx = nums[0] ?? 0;\n const ty = nums[1] ?? 0;\n local = [1, 0, 0, 1, tx, ty];\n } else if (name === 'scale') {\n const sx = nums[0] ?? 1;\n const sy = nums.length >= 2 ? nums[1] : sx;\n local = [sx, 0, 0, sy, 0, 0];\n } else if (name === 'rotate') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n const rot: Matrix = [c, s, -s, c, 0, 0];\n if (nums.length >= 3) {\n // rotate(angle, cx, cy) = translate(cx,cy) * rotate * translate(-cx,-cy)\n const cx = nums[1];\n const cy = nums[2];\n local = multiply(multiply([1, 0, 0, 1, cx, cy], rot), [1, 0, 0, 1, -cx, -cy]);\n } else {\n local = rot;\n }\n } else if (name === 'skewx' || name === 'skewy') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const t = Math.tan(ang);\n local = name === 'skewx' ? [1, 0, t, 1, 0, 0] : [1, t, 0, 1, 0, 0];\n } else {\n onWarn?.(`unsupported transform function: ${name}`);\n continue;\n }\n result = multiply(result, local);\n }\n return result;\n}\n\n/**\n * Re-express an element's own `transform` in the frame its inherited `ctm`\n * maps into: `ctm * local * ctm⁻¹`.\n *\n * A leaf's geometry is baked through `ctm` at parse time, so its own\n * transform has to move with it. Decomposing the raw local matrix against\n * bounds that have already been through `ctm` compares two different\n * coordinate spaces, and a rotation inside a translated `<g>` fails to\n * decompose for no reason but the offset.\n *\n * `null` when `@weasel-js/geom`'s `invert` finds `ctm` singular: the geometry\n * has collapsed through it, and the local transform has no frame to live in.\n */\nexport function rebaseTransform(ctm: Matrix, local: Matrix): Matrix | null {\n const inv = invert([...ctm]);\n if (!inv) return null;\n const [a, b, c, d, e, f] = inv;\n return multiply(multiply(ctm, local), [a, b, c, d, e, f]);\n}\n\n/** Try to factor `m` as \"rotation by theta about (cx, cy)\". Returns the\n * angle in radians when `m` is (within `eps`) a pure rotation about the\n * given pivot. Returns `null` otherwise.\n *\n * Pure rotation about (cx, cy) has the matrix form:\n * [ cos -sin cx - cx*cos + cy*sin ]\n * [ sin cos cy - cx*sin - cy*cos ]\n * i.e. m[0] = m[3] = cos, m[1] = -m[2] = sin, with a translation that\n * equals the pivot's \"rotate-then-translate-back\" residue. We reconstruct\n * theta from atan2(m[1], m[0]) and verify the rest.\n */\nexport function decomposeRotation(\n m: Matrix,\n cx: number,\n cy: number,\n eps = 1e-4,\n): number | null {\n const [a, b, c, d, e, f] = m;\n // Pure rotation requires a == d and b == -c.\n if (Math.abs(a - d) > eps) return null;\n if (Math.abs(b + c) > eps) return null;\n // Determinant must be 1 (no scale, no flip).\n const det = a * d - b * c;\n if (Math.abs(det - 1) > eps) return null;\n const theta = Math.atan2(b, a);\n // Verify translation = (cx - cx*cos + cy*sin, cy - cx*sin - cy*cos).\n const expectedE = cx - cx * a + cy * b;\n const expectedF = cy - cx * b - cy * a;\n if (Math.abs(e - expectedE) > eps) return null;\n if (Math.abs(f - expectedF) > eps) return null;\n return theta;\n}\n\n/** Best-effort rotational-component extraction for a general matrix (any\n * scale + rotation, ignoring translation). Used for parse-time warnings\n * on un-decomposable matrices: we can detect \"there is a rotation here\"\n * even if we won't preserve it as `node.rotation`. For a non-uniform\n * matrix the \"rotation\" is ambiguous; we report atan2(b, a) which\n * corresponds to where the +x basis vector points.\n */\nexport function rotationComponent(m: Matrix): number {\n return Math.atan2(m[1], m[0]);\n}\n\n/**\n * Format a matrix as an SVG `matrix(a b c d e f)` value. Returns `null`\n * when `m` is (effectively) the identity, so the caller can omit the\n * attribute entirely.\n */\nexport function formatMatrix(m: Matrix): string | null {\n if (isIdentity(m)) return null;\n return `matrix(${m.map((n) => trimNumber(n)).join(' ')})`;\n}\n\n/** Trim trailing zeros from a numeric value for compact SVG output. */\nexport function trimNumber(n: number): string {\n if (!Number.isFinite(n)) return '0';\n // Round to ~6 decimal places to avoid floating-point cruft.\n const r = Math.round(n * 1e6) / 1e6;\n if (Number.isInteger(r)) return String(r);\n return String(r);\n}\n","import { resolveAlign, type TextStyle } from '@weasel-js/core';\n\n/**\n * Distance from a text box's left edge to its SVG anchor point: `x` on a\n * `<text>` is where `text-anchor` lands, which is the box's left edge, center\n * or right edge once `align` and `direction` resolve to an absolute edge.\n */\nexport function anchorOffset(style: TextStyle | undefined, width: number): number {\n const edge = resolveAlign(style?.align ?? 'left', style?.direction ?? 'ltr');\n return edge === 'center' ? width / 2 : edge === 'right' ? width : 0;\n}\n","/**\n * Map between SVG `<pattern>` elements and weasel's `pattern` `FillStyle`.\n * The counterpart to `gradients.ts` for the other paint-server kind.\n *\n * The tile's shapes come from `tileGeometry` in core, so the vector form a\n * viewer sees is generated from the same description that rasterizes the GL\n * texture. Alongside them we write the spec itself onto a `data-weasel-tile`\n * attribute: any SVG consumer renders the shapes, and weasel reads the\n * attribute back to recover the exact spec rather than reverse-engineering\n * it from geometry.\n *\n * A pattern whose payload is a `TextureHandle` has no vector form — the\n * handle is a session-scoped registry key with no tile description behind\n * it — and exports as nothing, with a warning. Same treatment conic\n * gradients get.\n */\n\nimport { tileGeometry, type TileShape } from '@weasel-js/core/patterns-builtin';\nimport type { FillStyle, TilePatternSpec } from '@weasel-js/core';\nimport { collectElementsByTag } from './elements';\nimport { trimNumber } from './transform';\n\ntype PatternFill = Extract<FillStyle, { fill: 'pattern' }>;\n\n/** Collected pattern definitions, keyed by element id. */\nexport type PatternTable = Map<string, FillStyle>;\n\n/** Whether a pattern paint carries a serializable spec. */\nexport function patternSpecOf(paint: PatternFill): TilePatternSpec | null {\n return 'tile' in paint.pattern ? paint.pattern : null;\n}\n\nexport function patternXml(id: string, paint: PatternFill, onWarn?: (m: string) => void): string {\n const spec = patternSpecOf(paint);\n if (!spec) {\n onWarn?.('pattern fill carries a TextureHandle, which has no vector form — omitted from <defs>');\n return '';\n }\n const geometry = tileGeometry(spec);\n const body = geometry.shapes.map(shapeXml).join('');\n const origin = paint.origin ?? { x: 0, y: 0 };\n const attrs = [\n `id=\"${id}\"`,\n 'patternUnits=\"userSpaceOnUse\"',\n `width=\"${trimNumber(geometry.size)}\"`,\n `height=\"${trimNumber(geometry.size)}\"`,\n ];\n if (origin.x !== 0 || origin.y !== 0) {\n attrs.push(`x=\"${trimNumber(origin.x)}\"`, `y=\"${trimNumber(origin.y)}\"`);\n }\n attrs.push(`data-weasel-tile=\"${escapeAttr(JSON.stringify(spec))}\"`);\n return `<pattern ${attrs.join(' ')}>${body}</pattern>`;\n}\n\n/**\n * A single tile as a standalone `<svg>` document, sized to its own extent.\n * For UI that needs to show a tile outside a document — a picker swatch,\n * set as a repeating CSS `background-image` via a data URI. Shares the shape\n * mapper with `patternXml`, so a preview can't drift from what paints.\n */\nexport function tilePreviewSvg(spec: TilePatternSpec, background?: string): string {\n const geometry = tileGeometry(spec);\n const s = trimNumber(geometry.size);\n const bg = background\n ? `<rect width=\"${s}\" height=\"${s}\" fill=\"${background}\"/>`\n : '';\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${s}\" height=\"${s}\" `\n + `viewBox=\"0 0 ${s} ${s}\">${bg}${geometry.shapes.map(shapeXml).join('')}</svg>`;\n}\n\n/** `tilePreviewSvg` packed as a `url(...)` value for CSS `background-image`. */\nexport function tilePreviewCssUrl(spec: TilePatternSpec, background?: string): string {\n return `url(\"data:image/svg+xml,${encodeURIComponent(tilePreviewSvg(spec, background))}\")`;\n}\n\nfunction shapeXml(shape: TileShape): string {\n switch (shape.kind) {\n case 'line':\n return `<line x1=\"${trimNumber(shape.x1)}\" y1=\"${trimNumber(shape.y1)}\" `\n + `x2=\"${trimNumber(shape.x2)}\" y2=\"${trimNumber(shape.y2)}\" `\n + `stroke=\"${shape.color}\" stroke-width=\"${trimNumber(shape.width)}\"/>`;\n case 'circle':\n return `<circle cx=\"${trimNumber(shape.cx)}\" cy=\"${trimNumber(shape.cy)}\" `\n + `r=\"${trimNumber(shape.r)}\" fill=\"${shape.color}\"/>`;\n case 'ellipse': {\n const deg = (shape.rotation * 180) / Math.PI;\n const transform = deg === 0\n ? ''\n : ` transform=\"rotate(${trimNumber(deg)} ${trimNumber(shape.cx)} ${trimNumber(shape.cy)})\"`;\n return `<ellipse cx=\"${trimNumber(shape.cx)}\" cy=\"${trimNumber(shape.cy)}\" `\n + `rx=\"${trimNumber(shape.rx)}\" ry=\"${trimNumber(shape.ry)}\" `\n + `fill=\"${shape.color}\"${transform}/>`;\n }\n case 'rect':\n return `<rect x=\"${trimNumber(shape.x)}\" y=\"${trimNumber(shape.y)}\" `\n + `width=\"${trimNumber(shape.width)}\" height=\"${trimNumber(shape.height)}\" `\n + `fill=\"${shape.color}\"/>`;\n default:\n return '';\n }\n}\n\n/** Read every `<pattern>` in the document back into pattern paints. */\nexport function collectPatterns(svg: Element, onWarn?: (m: string) => void): PatternTable {\n const out: PatternTable = new Map();\n for (const [id, el] of collectElementsByTag(svg, PATTERN_TAGS)) {\n const paint = readPattern(el, onWarn);\n if (paint) out.set(id, paint);\n }\n return out;\n}\n\nconst PATTERN_TAGS = new Set(['pattern']);\n\nfunction readPattern(el: Element, onWarn?: (m: string) => void): FillStyle | null {\n const raw = el.getAttribute('data-weasel-tile');\n if (!raw) {\n // A hand-authored pattern (Illustrator, Inkscape) holds arbitrary\n // geometry no `TilePatternSpec` can express. Recognizing it would mean\n // reverse-engineering a tile from its children; dropping it with a\n // warning is honest, and the element survives in the source file.\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> has no data-weasel-tile — unsupported pattern, dropped`);\n return null;\n }\n let spec: TilePatternSpec;\n try {\n spec = JSON.parse(raw) as TilePatternSpec;\n } catch {\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> has malformed data-weasel-tile — dropped`);\n return null;\n }\n if (typeof spec?.tile !== 'string' || typeof spec?.color !== 'string') {\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> data-weasel-tile is not a tile spec — dropped`);\n return null;\n }\n const x = parseFloat(el.getAttribute('x') ?? '0');\n const y = parseFloat(el.getAttribute('y') ?? '0');\n const paint: PatternFill = { fill: 'pattern', pattern: spec };\n if (x !== 0 || y !== 0) paint.origin = { x, y };\n return paint;\n}\n\nfunction escapeAttr(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n","/**\n * Serialize a weasel `Path` to an SVG `d=` attribute string. `RectPath`\n * lowers to `M h v h Z`; `PolygonPath` walks the (commands, coords)\n * arrays, emitting one SVG command per kit command.\n *\n * Output uses absolute commands only and a small amount of whitespace\n * compression (no leading zeros stripped beyond what `Number.toString`\n * already does). Numbers are rounded to ~6 decimals via `trimNumber`.\n */\n\nimport {\n PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z,\n type Path,\n} from '@weasel-js/core';\nimport { trimNumber } from './transform';\n\n/** Serialize a weasel `Path` to an SVG `d=` attribute string. */\nexport function serializePathD(path: Path): string {\n if (path.kind === 'rect') {\n const { x, y, width, height } = path;\n return `M${trimNumber(x)} ${trimNumber(y)}h${trimNumber(width)}v${trimNumber(height)}h${trimNumber(-width)}Z`;\n }\n const cmds = path.commands;\n const xs = path.coords;\n const out: string[] = [];\n let ci = 0;\n for (let i = 0; i < cmds.length; i++) {\n const c = cmds[i];\n if (c === PATH_M) {\n out.push(`M${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])}`);\n ci += 2;\n } else if (c === PATH_L) {\n out.push(`L${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])}`);\n ci += 2;\n } else if (c === PATH_C) {\n out.push(\n `C${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])} ` +\n `${trimNumber(xs[ci + 2])} ${trimNumber(xs[ci + 3])} ` +\n `${trimNumber(xs[ci + 4])} ${trimNumber(xs[ci + 5])}`,\n );\n ci += 6;\n } else if (c === PATH_Q) {\n out.push(\n `Q${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])} ` +\n `${trimNumber(xs[ci + 2])} ${trimNumber(xs[ci + 3])}`,\n );\n ci += 4;\n } else if (c === PATH_Z) {\n out.push('Z');\n }\n }\n return out.join('');\n}\n","/**\n * Map between SVG `<linearGradient>` / `<radialGradient>` elements and\n * weasel's `FillStyle` gradient variants. Definitions are indexed by id\n * wherever in the document they appear, and looked up when a `fill` /\n * `stroke` attribute references one as `url(#id)`. On serialize, we\n * emit a fresh `<defs>` block with stable generated ids.\n */\n\nimport { getPaintKind, getMarker } from '@weasel-js/core';\nimport type { FillStyle, GradStop, GradientUnits, MarkerEntry } from '@weasel-js/core';\nimport { parsePaintAttr } from './color';\nimport { trimNumber } from './transform';\nimport { patternXml } from './patterns';\nimport { collectElementsByTag, type ElementTable } from './elements';\nimport { serializePathD } from './path-serializer';\n\n/** Collected gradient definitions, keyed by element id. */\nexport type GradientTable = Map<string, FillStyle>;\n\nconst GRADIENT_TAGS = new Set(['lineargradient', 'radialgradient']);\n\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\n/** Read every gradient definition in the document, keyed by element id. */\nexport function collectGradients(svg: Element, onWarn?: (m: string) => void): GradientTable {\n const out: GradientTable = new Map();\n const elements = collectElementsByTag(svg, GRADIENT_TAGS);\n for (const [id, el] of elements) {\n const paint = el.tagName.toLowerCase() === 'lineargradient'\n ? readLinearGradient(el, elements, onWarn)\n : readRadialGradient(el, elements, onWarn);\n if (paint) out.set(id, paint);\n }\n warnUnsupportedDefsChildren(svg, onWarn);\n return out;\n}\n\n/** Paint servers and `<marker>` aside, a `<defs>` child is something this\n * package does not model (`<clipPath>`, a `<use>` template). Say so once here. */\nfunction warnUnsupportedDefsChildren(svg: Element, onWarn?: (m: string) => void): void {\n if (!onWarn) return;\n const defs = svg.getElementsByTagName('defs');\n for (let d = 0; d < defs.length; d++) {\n const root = defs[d];\n for (let i = 0; i < root.children.length; i++) {\n const child = root.children[i];\n const tag = child.tagName.toLowerCase();\n if (GRADIENT_TAGS.has(tag) || tag === 'pattern' || tag === 'marker') continue;\n onWarn(`unsupported <defs> child: <${child.tagName}>`);\n }\n }\n}\n\n/**\n * The gradient a `href` / `xlink:href` attribute points at, or null. SVG lets\n * one gradient inherit another's stops and attributes this way, and authoring\n * tools lean on it heavily — a chain that isn't followed resolves to a\n * gradient with no stops, which paints nothing.\n */\nfunction hrefTarget(el: Element, elements: ElementTable): Element | null {\n const raw = el.getAttribute('href')\n ?? el.getAttributeNS(XLINK_NS, 'href')\n ?? el.getAttribute('xlink:href');\n if (!raw || !raw.startsWith('#')) return null;\n return elements.get(raw.slice(1)) ?? null;\n}\n\n/** An attribute's value on `el` or, when absent, on the gradient it inherits\n * from. `seen` breaks a reference cycle. */\nfunction inheritedAttr(\n el: Element, elements: ElementTable, name: string, seen: Set<Element> = new Set(),\n): string | null {\n if (el.hasAttribute(name)) return el.getAttribute(name);\n seen.add(el);\n const ref = hrefTarget(el, elements);\n if (!ref || seen.has(ref)) return null;\n return inheritedAttr(ref, elements, name, seen);\n}\n\n/** `el`'s own stops or, when it declares none, the stops it inherits. */\nfunction inheritedStops(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n seen: Set<Element> = new Set(),\n): GradStop[] {\n const own = readStops(el, onWarn);\n if (own.length > 0) return own;\n seen.add(el);\n const ref = hrefTarget(el, elements);\n if (!ref || seen.has(ref)) return own;\n return inheritedStops(ref, elements, onWarn, seen);\n}\n\n/** Parse a `stop-opacity` / offset value that may carry a `%` suffix. */\nfunction parseRatio(raw: string): number {\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return NaN;\n return raw.trimEnd().endsWith('%') ? n / 100 : n;\n}\n\nfunction readStops(el: Element, onWarn?: (m: string) => void): GradStop[] {\n const stops: GradStop[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (c.tagName.toLowerCase() !== 'stop') continue;\n const offsetRaw = parseRatio(c.getAttribute('offset') ?? '0');\n const offset = Number.isFinite(offsetRaw) ? offsetRaw : 0;\n const colorAttr = c.getAttribute('stop-color') ?? '#000000';\n const parsed = parsePaintAttr(colorAttr);\n if (parsed && parsed.kind === 'solid') {\n const opacityAttr = c.getAttribute('stop-opacity');\n const own = opacityAttr != null ? parseRatio(opacityAttr) : NaN;\n const alpha = Number.isFinite(own) ? own : parsed.alpha;\n stops.push({ offset, color: alpha < 1 ? applyAlpha(parsed.color, alpha) : parsed.color });\n } else {\n onWarn?.(`gradient stop has unrecognized stop-color: ${colorAttr}`);\n stops.push({ offset, color: '#000000' });\n }\n }\n return stops;\n}\n\nfunction applyAlpha(hex: string, alpha: number): string {\n // Pack alpha into an 8-digit hex so it round-trips through weasel's\n // string-color storage. This is non-standard CSS hex but parses cleanly\n // back via our color.ts parser.\n const a = Math.max(0, Math.min(255, Math.round(alpha * 255)));\n return `${hex}${a.toString(16).padStart(2, '0')}`;\n}\n\n/** SVG `gradientUnits` → the kit's `GradientUnits`. SVG's default is\n * `objectBoundingBox`, which is what the attribute defaults above assume\n * (`x2=\"1\"`, `r=\"0.5\"`), so the two have to be read together. */\nfunction readGradientUnits(el: Element, elements: ElementTable): 'bounds' | 'world' {\n return inheritedAttr(el, elements, 'gradientUnits') === 'userSpaceOnUse' ? 'world' : 'bounds';\n}\n\n/** `gradientTransform` has no slot in the kit's gradient model, so a gradient\n * carrying one paints in the wrong place rather than not at all. */\nfunction warnGradientTransform(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): void {\n const t = inheritedAttr(el, elements, 'gradientTransform');\n if (t != null && t.trim() !== '') {\n onWarn?.(`gradientTransform=\"${t}\" is not modeled; the gradient paints untransformed`);\n }\n}\n\nfunction num(raw: string | null, fallback: number): number {\n if (raw == null) return fallback;\n const n = parseRatio(raw);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction readLinearGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'linear-gradient',\n from: {\n x: num(inheritedAttr(el, elements, 'x1'), 0),\n y: num(inheritedAttr(el, elements, 'y1'), 0),\n },\n to: {\n x: num(inheritedAttr(el, elements, 'x2'), 1),\n y: num(inheritedAttr(el, elements, 'y2'), 0),\n },\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n };\n}\n\nfunction readRadialGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'radial-gradient',\n center: {\n x: num(inheritedAttr(el, elements, 'cx'), 0.5),\n y: num(inheritedAttr(el, elements, 'cy'), 0.5),\n },\n radius: num(inheritedAttr(el, elements, 'r'), 0.5),\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n };\n}\n\n/**\n * Pre-pass that assigns stable serialization ids to the paint servers —\n * gradients and patterns — used by any leaf in the tree. We key on object\n * identity so two leaves sharing the exact same `FillStyle` reference reuse\n * one `<defs>` entry; structurally equal but distinct objects get separate\n * ids.\n */\nexport class PaintServerRegistry {\n private byPaint = new Map<FillStyle, string>();\n private order: FillStyle[] = [];\n private counter = 0;\n\n // Marker keys referenced by any stroke, in first-use order. The `<defs>`\n // id is the marker key itself, not a minted counter id: `parseSvg` reads a\n // `marker-end=\"url(#id)\"` fragment back as the marker key directly (it\n // never inspects the `<marker>` element), so a synthetic id would come\n // back unresolvable and warn on round-trip.\n private markerKeys: string[] = [];\n private markerKeySet = new Set<string>();\n\n register(paint: FillStyle): string {\n const existing = this.byPaint.get(paint);\n if (existing) return existing;\n const id = paint.fill === 'pattern' ? `pat${this.counter++}` : `grad${this.counter++}`;\n this.byPaint.set(paint, id);\n this.order.push(paint);\n return id;\n }\n\n /** The `<defs>` id for a marker key — the key itself, minting nothing.\n * `undefined` when nothing is registered under `key`, so a caller emits no\n * attribute at all rather than a `url(#…)` pointing at a def that will\n * never be written. */\n markerId(key: string): string | undefined {\n if (getMarker(key) === undefined) return undefined;\n if (!this.markerKeySet.has(key)) {\n this.markerKeySet.add(key);\n this.markerKeys.push(key);\n }\n return key;\n }\n\n /** Emit `<defs>...</defs>` XML for every registered paint server and marker. */\n toDefsXml(onWarn?: (m: string) => void): string {\n if (this.order.length === 0 && this.markerKeys.length === 0) return '';\n const parts: string[] = ['<defs>'];\n for (const paint of this.order) {\n parts.push(paintServerXml(this.byPaint.get(paint)!, paint, onWarn));\n }\n for (const key of this.markerKeys) {\n const entry = getMarker(key);\n if (!entry) continue;\n parts.push(entry.toSvg ? entry.toSvg(key, entry) : defaultMarkerXml(key, entry));\n }\n parts.push('</defs>');\n return parts.join('');\n }\n}\n\n/** The `<marker>` def for an entry with no `toSvg` of its own. */\nfunction defaultMarkerXml(id: string, entry: MarkerEntry): string {\n const path = entry.path({ size: 1, stroke: { paint: { fill: 'solid', color: '#000' } } });\n const d = serializePathD(path);\n const fill = entry.fill === 'none' ? 'none' : 'context-stroke';\n const outline = entry.outline\n ? ` stroke=\"context-stroke\" stroke-width=\"${entry.outline.width}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"`\n : '';\n // `overflow=\"visible\"` overrides the UA default of `hidden`, which would\n // otherwise clip the arrowhead to the marker's viewport.\n return (\n `<marker id=\"${id}\" markerUnits=\"strokeWidth\" markerWidth=\"8\" markerHeight=\"8\"` +\n ` refX=\"0\" refY=\"0\" orient=\"auto\" overflow=\"visible\">` +\n `<path d=\"${d}\" fill=\"${fill}\"${outline}/></marker>`\n );\n}\n\n/** One paint server's `<defs>` entry: the built-in mapping, else the kind's\n * own `toSvg`, else nothing plus a warning. The referencing element already\n * carries `fill=\"url(#id)\"`, so a silent omission is a dangling reference and\n * the shape vanishes in a viewer. */\nfunction paintServerXml(id: string, paint: FillStyle, onWarn?: (m: string) => void): string {\n if (paint.fill === 'pattern') return patternXml(id, paint, onWarn);\n const builtin = gradientXml(id, paint);\n if (builtin) return builtin;\n const custom = getPaintKind(paint.fill)?.toSvg?.(id, paint);\n if (custom) return custom;\n onWarn?.(`${paint.fill} fill has no vector form — omitted from <defs>`);\n return '';\n}\n\n/** `GradientUnits` → SVG `gradientUnits`. `'screen'` (the kit's default, and\n * a viewport-fixed wash) has no SVG analog at all; it lowers to user space,\n * which at least puts the paint somewhere the geometry is. */\nfunction gradientUnitsAttr(units: GradientUnits | undefined): string {\n return units === 'bounds' ? 'objectBoundingBox' : 'userSpaceOnUse';\n}\n\nfunction gradientXml(id: string, paint: FillStyle): string {\n if (paint.fill === 'linear-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<linearGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `x1=\"${trimNumber(paint.from.x)}\" y1=\"${trimNumber(paint.from.y)}\" ` +\n `x2=\"${trimNumber(paint.to.x)}\" y2=\"${trimNumber(paint.to.y)}\">${stops}</linearGradient>`\n );\n }\n if (paint.fill === 'radial-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<radialGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `r=\"${trimNumber(paint.radius)}\">${stops}</radialGradient>`\n );\n }\n return '';\n}\n\nfunction stopXml(s: GradStop): string {\n // Detect packed-alpha hex (#rrggbbaa) and split out stop-opacity.\n const m = /^#([0-9a-f]{6})([0-9a-f]{2})$/i.exec(s.color);\n if (m) {\n const alpha = parseInt(m[2], 16) / 255;\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"#${m[1].toLowerCase()}\" stop-opacity=\"${trimNumber(alpha)}\"/>`;\n }\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"${s.color}\"/>`;\n}\n","/**\n * Serialize a `SvgNode[]` tree to an SVG document string. Every leaf is\n * emitted as a `<path>` (even shapes that started as `<rect>` etc.) —\n * lossless geometry round-trip beats round-tripping the element-kind\n * label. Gradient paints are gathered into a single `<defs>` block.\n */\n\nimport type { Path, Stroke } from '@weasel-js/core';\nimport { boundsOfPath, SCRIPT_METRICS } from '@weasel-js/core';\nimport type {\n Matrix, NamespaceMeta, NamespacedElement, SerializeOptions, SvgGroupNode,\n SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode, SvgImageNode,\n} from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { serializePathD } from './path-serializer';\nimport { formatMatrix, multiply, trimNumber } from './transform';\nimport { PaintServerRegistry } from './gradients';\nimport { anchorOffset } from './textAnchor';\n\n/**\n * Walk the tree and produce an SVG document string. The root `<svg>`'s\n * `viewBox` is taken from `opts.viewBox` if supplied, otherwise computed\n * as a tight bounding box around every leaf.\n */\nexport function serializeSvg(nodes: SvgNode[], opts: SerializeOptions = {}): string {\n const registry = new PaintServerRegistry();\n registerPaintServers(nodes, registry);\n\n const bounds = opts.viewBox ?? computeBounds(nodes);\n const vb = `${trimNumber(bounds.x)} ${trimNumber(bounds.y)} ${trimNumber(bounds.width)} ${trimNumber(bounds.height)}`;\n const namespaces = opts.namespaces ?? {};\n\n const rootAttrs: string[] = [`xmlns=\"http://www.w3.org/2000/svg\"`];\n for (const [prefix, uri] of Object.entries(namespaces)) {\n rootAttrs.push(`xmlns:${prefix}=\"${escapeAttr(uri)}\"`);\n }\n rootAttrs.push(`viewBox=\"${vb}\"`);\n if (opts.width != null) rootAttrs.push(`width=\"${trimNumber(opts.width)}\"`);\n if (opts.height != null) rootAttrs.push(`height=\"${trimNumber(opts.height)}\"`);\n // documentMeta attrs onto the root, in declared-namespace order.\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n rootAttrs.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n }\n\n // documentMeta elements after <defs>, before geometry body.\n let docMetaXml = '';\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) docMetaXml += namespacedElementXml(prefix, localName, el);\n }\n }\n }\n\n const defsXml = registry.toDefsXml(opts.onWarn);\n const bodyXml = nodes.map((n) => nodeXml(n, registry, namespaces)).join('');\n\n // `<title>` goes immediately inside `<svg>` per SVG-spec convention; it's\n // an accessibility hook and (for our purposes) a stable place to round-trip\n // the user-visible document title.\n const titleXml = opts.title && opts.title.length > 0\n ? `<title>${escapeText(opts.title)}</title>`\n : '';\n\n return `<svg ${rootAttrs.join(' ')}>${titleXml}${defsXml}${docMetaXml}${bodyXml}</svg>`;\n}\n\nfunction namespacedElementXml(prefix: string, localName: string, el: NamespacedElement): string {\n const attrs: string[] = [];\n for (const [name, value] of Object.entries(el.attrs)) {\n attrs.push(`${name}=\"${escapeAttr(value)}\"`);\n }\n const head = attrs.length > 0 ? `<${prefix}:${localName} ${attrs.join(' ')}>` : `<${prefix}:${localName}>`;\n let body = '';\n if (el.children) {\n for (const [childName, list] of Object.entries(el.children)) {\n for (const child of list) body += namespacedElementXml(prefix, childName, child);\n }\n } else if (el.text != null) {\n body = escapeText(el.text);\n }\n return `${head}${body}</${prefix}:${localName}>`;\n}\n\nfunction metaAttrsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n const parts: string[] = [];\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n parts.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n return parts.length > 0 ? ` ${parts.join(' ')}` : '';\n}\n\nfunction metaElementsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n let out = '';\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) out += namespacedElementXml(prefix, localName, el);\n }\n }\n return out;\n}\n\nfunction registerPaintServers(nodes: SvgNode[], registry: PaintServerRegistry): void {\n for (const n of nodes) {\n if (n.kind === 'group') {\n registerPaintServers(n.children, registry);\n } else if (n.kind === 'path') {\n if (n.fill.kind === 'gradient') registry.register(n.fill.paint);\n if (n.stroke && n.stroke.paint.kind === 'gradient') registry.register(n.stroke.paint.paint);\n registerMarkers(n.stroke, registry);\n } else if (n.kind === 'text') {\n // Text paints flow through `style` / `runs` rather than a top-level\n // SvgPaint, so register direct FillStyle references when present. This\n // pre-pass is load-bearing: `<defs>` is emitted before the body, so a\n // paint first seen while writing an element would be referenced by an\n // id that no definition backs.\n registerTextPaint(n.fill, registry);\n registerTextPaint(n.stroke?.paint, registry);\n registerMarkers(n.stroke, registry);\n for (const run of n.runs ?? []) {\n registerTextPaint(run.fill, registry);\n registerTextPaint(run.stroke?.paint, registry);\n }\n }\n }\n}\n\n/** Register one text paint if it is a paint server rather than a colour. */\nfunction registerTextPaint(\n paint: import('@weasel-js/core').FillStyle | null | undefined,\n registry: PaintServerRegistry,\n): void {\n if (paint && !('color' in paint)) registry.register(paint);\n}\n\n/** A marker reference in either shape — `SvgStroke` stores a bare key, the kit\n * `Stroke` stores a `MarkerRef`. */\nfunction markerKeyOfRef(ref: unknown): string | undefined {\n if (typeof ref === 'string') return ref;\n if (ref && typeof ref === 'object' && 'key' in ref) return String((ref as { key: string }).key);\n return undefined;\n}\n\n/** Mint a `<defs>` id for every marker a stroke names, before the body is\n * written — same reason as the paint pre-pass above. */\nfunction registerMarkers(\n stroke: { markerStart?: unknown; markerMid?: unknown; markerEnd?: unknown } | undefined,\n registry: PaintServerRegistry,\n): void {\n if (!stroke) return;\n for (const ref of [stroke.markerStart, stroke.markerMid, stroke.markerEnd]) {\n const key = markerKeyOfRef(ref);\n if (key) registry.markerId(key);\n }\n}\n\nfunction nodeXml(node: SvgNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n if (node.kind === 'group') return groupXml(node, registry, namespaces);\n if (node.kind === 'text') return textXml(node, registry, namespaces);\n if (node.kind === 'image') return imageXml(node, namespaces);\n return pathXml(node, registry, namespaces);\n}\n\n/**\n * Emit an `<image>`. `preserveAspectRatio=\"none\"` is unconditional: the node\n * carries a literal box and nothing else, so letting a viewer letterbox it\n * would place the pixels somewhere the model never said.\n */\nfunction imageXml(node: SvgImageNode, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `href=\"${escapeAttr(node.href)}\"`,\n `x=\"${trimNumber(node.x)}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `width=\"${trimNumber(node.width)}\"`,\n `height=\"${trimNumber(node.height)}\"`,\n `preserveAspectRatio=\"none\"`,\n ];\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) return `<image ${attrs.join(' ')}${metaAttrs}>${metaEls}</image>`;\n return `<image ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction groupXml(node: SvgGroupNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [];\n if (node.transform) {\n const m = formatMatrix(node.transform);\n if (m) attrs.push(`transform=\"${m}\"`);\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n // `metaAttrs` already starts with a leading space (or is empty), so we\n // can splice it after the existing attr list without extra logic.\n const head = attrs.length > 0\n ? `<g ${attrs.join(' ')}${metaAttrs}>`\n : `<g${metaAttrs}>`;\n const body = node.children.map((c) => nodeXml(c, registry, namespaces)).join('');\n return `${head}${body}${metaElementsXml(node.meta, namespaces)}</g>`;\n}\n\nfunction pathXml(node: SvgPathNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [`d=\"${serializePathD(node.path)}\"`];\n const fillAttrs = paintAttrs(node.fill, 'fill', registry);\n for (const a of fillAttrs) attrs.push(a);\n // Emit fill-rule only when it diverges from SVG's default ('nonzero').\n // RectPath has no fillRule field — only PolygonPath carries one.\n if (node.path.kind === 'polygon' && node.path.fillRule === 'evenodd') {\n attrs.push(`fill-rule=\"evenodd\"`);\n }\n if (node.stroke) {\n const strokeAttrs = strokeAttrsFor(node.stroke, registry);\n for (const a of strokeAttrs) attrs.push(a);\n } else {\n attrs.push('stroke=\"none\"');\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const b = pathBounds(node.path);\n const cx = b.minX + (b.maxX - b.minX) / 2;\n const cy = b.minY + (b.maxY - b.minY) / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) {\n return `<path ${attrs.join(' ')}${metaAttrs}>${metaEls}</path>`;\n }\n return `<path ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction paintAttrs(\n paint: SvgPaint,\n name: 'fill' | 'stroke',\n registry: PaintServerRegistry,\n includeOpacity = true,\n): string[] {\n if (paint.kind === 'none') return [`${name}=\"none\"`];\n if (paint.kind === 'solid') {\n const out = [`${name}=\"${paint.color}\"`];\n if (includeOpacity && paint.opacity != null && paint.opacity !== 1) {\n out.push(`${name}-opacity=\"${trimNumber(paint.opacity)}\"`);\n }\n return out;\n }\n // gradient\n const id = registry.register(paint.paint);\n return [`${name}=\"url(#${id})\"`];\n}\n\n/**\n * Attributes for a kit `Stroke` — the shape text carries, whose `paint` is a\n * `FillStyle` rather than an `SvgPaint`. Text strokes ride inside\n * `TextStyle` / `StyledRun` rather than as a node-level `SvgStroke`, because\n * that is where the kit's text model puts them.\n *\n * Absent, unpainted, or zero-width emits nothing at all: unstroked text should\n * not carry a `stroke` attribute, and SVG's own default (`none`) already says\n * so.\n */\n/**\n * `stroke-width`, plus `vector-effect` when the width is in screen pixels.\n *\n * A `{ px }` width means \"this thickness once rendered, whatever the view is\n * doing\", which is exactly what `non-scaling-stroke` says — so the number goes\n * out unresolved and the attribute carries the unit. There is no accumulated\n * transform scale here to resolve it against, and picking one would bake a\n * single zoom level into the document.\n */\nfunction strokeWidthAttrs(width: number | { px: number }): string[] {\n if (typeof width === 'number') return [`stroke-width=\"${trimNumber(width)}\"`];\n return [`stroke-width=\"${trimNumber(width.px)}\"`, 'vector-effect=\"non-scaling-stroke\"'];\n}\n\nfunction coreStrokeAttrs(stroke: Stroke | undefined, registry: PaintServerRegistry): string[] {\n const paint = stroke?.paint;\n if (!stroke || !paint) return [];\n const width = stroke.width ?? 1;\n if (!((typeof width === 'object' ? width.px : width) > 0)) return [];\n const attrs: string[] = [];\n if ('color' in paint) {\n attrs.push(`stroke=\"${paint.color}\"`);\n if (paint.opacity != null && paint.opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(paint.opacity)}\"`);\n }\n } else {\n attrs.push(`stroke=\"url(#${registry.register(paint)})\"`);\n }\n attrs.push(...strokeWidthAttrs(width));\n if (stroke.cap) attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n if (stroke.join) attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const key = typeof ref === 'string' ? ref : ref.key;\n const id = registry.markerId(key);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\nfunction strokeAttrsFor(stroke: SvgStroke, registry: PaintServerRegistry): string[] {\n // `SvgStroke.opacity` and the paint's own `opacity` are two models of one\n // SVG attribute, and parse fills in both. Emitting each would write\n // `stroke-opacity` twice, which is not well-formed XML at all.\n const attrs = paintAttrs(stroke.paint, 'stroke', registry, false);\n attrs.push(...strokeWidthAttrs(stroke.width));\n const opacity = stroke.opacity\n ?? (stroke.paint.kind === 'solid' ? stroke.paint.opacity : undefined);\n if (opacity != null && opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(opacity)}\"`);\n }\n if (stroke.cap) {\n attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n }\n if (stroke.join) {\n attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n }\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) {\n attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n }\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const id = registry.markerId(ref);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\n/**\n * Tight bounding box around everything the tree draws, in the root's\n * coordinates — the fallback `viewBox` when the caller supplies none. A\n * node's `rotation` and a group's `transform` both move ink, so both are\n * applied here; a box taken from unrotated geometry crops the document.\n */\nfunction computeBounds(nodes: SvgNode[]): { x: number; y: number; width: number; height: number } {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n const visit = (n: SvgNode, ctm: Matrix): void => {\n if (n.kind === 'group') {\n const childCtm = n.transform ? multiply(ctm, n.transform) : ctm;\n n.children.forEach((c) => visit(c, childCtm));\n return;\n }\n const b = n.kind === 'text' || n.kind === 'image'\n ? { minX: n.x, minY: n.y, maxX: n.x + n.width, maxY: n.y + n.height }\n : pathBounds(n.path);\n const local = n.rotation ? rotateAboutCenter(ctm, b, n.rotation) : ctm;\n for (const [x, y] of corners(b)) {\n const px = local[0] * x + local[2] * y + local[4];\n const py = local[1] * x + local[3] * y + local[5];\n if (px < minX) minX = px;\n if (py < minY) minY = py;\n if (px > maxX) maxX = px;\n if (py > maxY) maxY = py;\n }\n };\n nodes.forEach((n) => visit(n, IDENTITY_MATRIX));\n if (!Number.isFinite(minX)) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction corners(b: { minX: number; minY: number; maxX: number; maxY: number }): [number, number][] {\n return [[b.minX, b.minY], [b.maxX, b.minY], [b.maxX, b.maxY], [b.minX, b.maxY]];\n}\n\n/** `ctm` composed with the same `rotate(angle cx cy)` the element emits. */\nfunction rotateAboutCenter(\n ctm: Matrix,\n b: { minX: number; minY: number; maxX: number; maxY: number },\n angle: number,\n): Matrix {\n const cx = (b.minX + b.maxX) / 2;\n const cy = (b.minY + b.maxY) / 2;\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return multiply(ctm, [c, s, -s, c, cx - cx * c + cy * s, cy - cx * s - cy * c]);\n}\n\n/**\n * Emit a `<text>` element. `x` is the `text-anchor` point, per the SVG spec:\n * the box's left edge, center or right edge as its alignment resolves. Uses\n * `dominant-baseline=\"text-before-edge\"` so `y` matches weasel's top-of-box\n * pose; stashes the explicit width/height (which native SVG text doesn't\n * model) in `data-weasel-*` attributes so they round-trip through the parser\n * losslessly.\n */\nfunction textXml(node: SvgTextNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `x=\"${trimNumber(node.x + anchorOffset(node.style, node.width))}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `dominant-baseline=\"text-before-edge\"`,\n // The runs model stores real line breaks; SVG's default whitespace\n // handling would collapse them (and any indentation) away on re-import.\n `xml:space=\"preserve\"`,\n `data-weasel-width=\"${trimNumber(node.width)}\"`,\n `data-weasel-height=\"${trimNumber(node.height)}\"`,\n ];\n\n const style = node.style;\n if (style?.fontSize != null) attrs.push(`font-size=\"${trimNumber(style.fontSize)}\"`);\n if (style?.fontFamily) attrs.push(`font-family=\"${escapeAttr(style.fontFamily)}\"`);\n if (style?.fontWeight != null) attrs.push(`font-weight=\"${String(style.fontWeight)}\"`);\n if (style?.fontStyle && style.fontStyle !== 'normal') attrs.push(`font-style=\"${style.fontStyle}\"`);\n const direction = style?.direction ?? 'ltr';\n if (direction === 'rtl') attrs.push('direction=\"rtl\"');\n if (style?.align != null || direction === 'rtl') {\n // `text-anchor` is reading-order relative in SVG exactly as `start` / `end`\n // are here, so the two relative values pass straight through and only the\n // absolute pair has to be turned into an edge the reader resolves the same\n // way. Under `ltr` this collapses to what it always wrote.\n const align = style?.align ?? 'left';\n const anchor = align === 'center' ? 'middle'\n : align === 'start' ? 'start'\n : align === 'end' ? 'end'\n : (align === 'left') === (direction === 'ltr') ? 'start' : 'end';\n if (anchor !== 'start') attrs.push(`text-anchor=\"${anchor}\"`);\n }\n if (style?.letterSpacing != null && style.letterSpacing !== 0) {\n attrs.push(`letter-spacing=\"${trimNumber(style.letterSpacing)}\"`);\n }\n const decoration = textDecorationValue(style?.underline, style?.strikethrough, style?.overline);\n if (decoration) attrs.push(`text-decoration=\"${decoration}\"`);\n // SVG text never wraps, so this is for weasel's own reader, beside the box\n // width it wraps at.\n if (style?.wrap) attrs.push('data-weasel-wrap=\"true\"');\n // Note: `lineHeight` is NOT emitted here. The bridge layer (svgInterop)\n // lifts it into `meta.wd.attrs['line-height']`, which `metaAttrsXml`\n // below emits as `wd:line-height=\"...\"`. There is no compat write of\n // `data-weasel-line-height` — per the SVG-native plan's Migration section,\n // no installed base exists to compat against.\n if (node.fill === null) {\n attrs.push('fill=\"none\"');\n } else if (node.fill) {\n if ('color' in node.fill) {\n attrs.push(`fill=\"${node.fill.color}\"`);\n if (node.fill.opacity != null && node.fill.opacity !== 1) {\n attrs.push(`fill-opacity=\"${trimNumber(node.fill.opacity)}\"`);\n }\n } else {\n const id = registry.register(node.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(node.stroke, registry)) attrs.push(a);\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n\n const body = node.runs && node.runs.length > 0\n ? node.runs.map((r) => runXml(r, registry)).join('')\n : escapeText(node.text);\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n return `<text ${attrs.join(' ')}${metaAttrs}>${body}${metaEls}</text>`;\n}\n\nfunction runXml(run: import('@weasel-js/core').StyledRun, registry: PaintServerRegistry): string {\n const attrs: string[] = [];\n if (run.bold) attrs.push(`font-weight=\"700\"`);\n if (run.italic) attrs.push(`font-style=\"italic\"`);\n if (run.fontFamily) attrs.push(`font-family=\"${escapeAttr(run.fontFamily)}\"`);\n // A percentage `font-size` is relative to the parent's, which is what\n // `fontScale` means; an absolute `fontSize` wins over it here as it does in\n // the runs model.\n //\n // `baseline-shift=\"super\"` carries the preset's *size* as well as its rise,\n // so a run that overrode only the rise has no keyword left to say the size\n // with and must spell it out — without this the superscript comes back\n // full-size at a raised baseline.\n const presetScale = run.script != null && run.baselineShift != null\n ? SCRIPT_METRICS[run.script].size\n : undefined;\n const scale = run.fontScale ?? presetScale;\n if (run.fontSize != null) attrs.push(`font-size=\"${trimNumber(run.fontSize)}\"`);\n else if (scale != null) attrs.push(`font-size=\"${trimNumber(scale * 100)}%\"`);\n // Same story for `baseline-shift`: an SVG percentage resolves against the\n // parent's font size, which is the unit `baselineShift` is already in.\n if (run.baselineShift != null) {\n attrs.push(`baseline-shift=\"${trimNumber(run.baselineShift * 100)}%\"`);\n } else if (run.script) {\n attrs.push(`baseline-shift=\"${run.script}\"`);\n }\n // Unlike the node-level style guard above, a run-level `0` is a meaningful\n // *override* (distinct from \"inherit the node's letterSpacing\") per the\n // runs model's additive-flags contract — emit it whenever it's set.\n if (run.letterSpacing != null) {\n attrs.push(`letter-spacing=\"${trimNumber(run.letterSpacing)}\"`);\n }\n const runDecoration = textDecorationValue(run.underline, run.strikethrough, run.overline);\n if (runDecoration) attrs.push(`text-decoration=\"${runDecoration}\"`);\n if (run.fill) {\n if ('color' in run.fill) {\n attrs.push(`fill=\"${run.fill.color}\"`);\n } else {\n const id = registry.register(run.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(run.stroke, registry)) attrs.push(a);\n const head = attrs.length > 0 ? `<tspan ${attrs.join(' ')}>` : '<tspan>';\n return `${head}${escapeText(run.text)}</tspan>`;\n}\n\n/**\n * Combine the decoration flags into an SVG `text-decoration` value —\n * `\"underline line-through\"` when both are set, a single token when only\n * one is, or `null` (omit the attribute) when none is set.\n */\nfunction textDecorationValue(\n underline: boolean | undefined,\n strikethrough: boolean | undefined,\n overline: boolean | undefined,\n): string | null {\n const tokens: string[] = [];\n if (underline) tokens.push('underline');\n if (strikethrough) tokens.push('line-through');\n if (overline) tokens.push('overline');\n return tokens.length > 0 ? tokens.join(' ') : null;\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<');\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nfunction pathBounds(path: Path): { minX: number; minY: number; maxX: number; maxY: number } {\n if (path.kind === 'rect') {\n return {\n minX: path.x, minY: path.y,\n maxX: path.x + path.width, maxY: path.y + path.height,\n };\n }\n const b = boundsOfPath(path);\n return { minX: b.x, minY: b.y, maxX: b.x + b.width, maxY: b.y + b.height };\n}\n\n","import type { DrawCommand, Path, Stroke } from '@weasel-js/core';\nimport {\n ellipsePath,\n linePath,\n markerDrawCommands,\n PathBuilder,\n rectPath,\n textCommand,\n} from '@weasel-js/core';\nimport type { WorldRect } from './frac';\nimport type { AnnotationData, FracPoint } from './types';\n\n/** One loud color, not a themed one: a mark sits over the instrument's own\n * picture and has to be legible against whatever that picture is. */\nconst MARK_COLOR = '#e5484d';\n/** World units, so a mark thickens with the picture it annotates — and so the\n * marker geometry can be resolved here, which needs a resolved width. */\nconst MARK_WIDTH = 2;\nconst TEXT_SIZE = 14;\n\n/** The subset of a mark's scene node this needs: where it is, and what it is. */\nexport interface PaintableMark {\n pose: WorldRect;\n data: AnnotationData;\n}\n\n/** How a mark is drawn, as opposed to where. Resolved by the overlay from the\n * instrument's vocabulary and the mark's own staleness. */\nexport interface MarkStyle {\n /** The status's color, or the default. */\n color?: string;\n /** A mark whose stored position no longer describes the picture. Drawn\n * dashed rather than hidden: it still describes *something*, and dropping\n * it would lose it. */\n stale?: boolean;\n}\n\nconst toWorld = (p: FracPoint, content: { w: number; h: number }) => ({\n x: p.x * content.w,\n y: p.y * content.h,\n});\n\n/** A mark's stored vertices in world units, or the pose's diagonal — a stored\n * mark whose `points` did not survive still has to draw somewhere. */\nfunction vertices(m: PaintableMark, content: { w: number; h: number }): { x: number; y: number }[] {\n const stored = m.data.points;\n if (stored && stored.length >= 2) return stored.map((p) => toWorld(p, content));\n const { x, y, width, height } = m.pose;\n return [\n { x, y },\n { x: x + width, y: y + height },\n ];\n}\n\nfunction polyline(points: { x: number; y: number }[]): Path {\n const b = new PathBuilder();\n const first = points[0];\n if (!first) return rectPath(0, 0, 0, 0);\n b.moveTo(first.x, first.y);\n for (const p of points.slice(1)) b.lineTo(p.x, p.y);\n return b.build();\n}\n\n/**\n * What one mark draws, in its target's world.\n *\n * Pure: a node and the target's content box in, draw commands out. Geometry\n * that a bounding box cannot describe — a line's ends, a stroke's path — comes\n * from `data.points`, which is in fractions like the bounds.\n */\nexport function markCommands(\n m: PaintableMark,\n content: { w: number; h: number },\n style: MarkStyle = {},\n): DrawCommand[] {\n const color = style.color ?? MARK_COLOR;\n const stroke: Stroke = {\n paint: { color },\n width: MARK_WIDTH,\n cap: 'round',\n join: 'round',\n ...(style.stale ? { dash: [6, 4] } : {}),\n };\n\n switch (m.data.kind) {\n case 'rect':\n return [\n { kind: 'path', path: rectPath(m.pose.x, m.pose.y, m.pose.width, m.pose.height), stroke },\n ];\n case 'ellipse':\n return [{ kind: 'path', path: ellipsePath(m.pose), stroke }];\n case 'line': {\n const [a, b] = vertices(m, content);\n return [{ kind: 'path', path: linePath(a, b), stroke }];\n }\n case 'arrow': {\n const [a, b] = vertices(m, content);\n // The spec's arrow: a line carrying an end marker, not its own geometry.\n // Markers are separate commands — a stroke's `markerEnd` is inert unless\n // something turns it into geometry, and only the kit's own node painter\n // does that, for the nodes it owns.\n const marked: Stroke = { ...stroke, markerEnd: 'arrow' };\n const path = linePath(a, b);\n return [\n { kind: 'path', path, stroke: marked },\n ...markerDrawCommands(path, marked, MARK_WIDTH, undefined),\n ];\n }\n case 'stroke':\n return [{ kind: 'path', path: polyline(vertices(m, content)), stroke }];\n case 'text': {\n const text = m.data.title;\n if (!text) return [];\n return [\n textCommand(\n m.pose.x,\n m.pose.y,\n text,\n { fontSize: TEXT_SIZE },\n undefined,\n undefined,\n undefined,\n {\n fill: { color },\n },\n ),\n ];\n }\n }\n}\n","/**\n * Whether a stored mark still describes the picture the current config\n * produces. A target names the config keys its positions depend on; labkit\n * snapshots and compares them without knowing what any of them mean.\n */\n\n/** The values of `keys` in `config`, for storing beside a new mark. Keys the\n * config does not carry are omitted rather than stored as undefined, so the\n * snapshot says what was known rather than what was asked. */\nexport function seenFrom(config: unknown, keys: readonly string[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (config === null || typeof config !== 'object') return out;\n const src = config as Record<string, unknown>;\n for (const k of keys) {\n if (k in src) out[k] = src[k];\n }\n return out;\n}\n\n/**\n * Whether the picture moved under the mark.\n *\n * Only keys present in `seen` are compared. A mark filed before its target\n * declared a new dependency must not go stale retroactively: nothing can know\n * what that key was at the time, and guessing would grey out every old mark\n * the first time a target grows a key.\n */\nexport function isStale(\n seen: Readonly<Record<string, unknown>> | undefined,\n config: unknown,\n keys: readonly string[],\n): boolean {\n if (!seen || keys.length === 0) return false;\n if (config === null || typeof config !== 'object') return false;\n const src = config as Record<string, unknown>;\n for (const k of keys) {\n if (!(k in seen)) continue;\n if (!Object.is(seen[k], src[k])) return true;\n }\n return false;\n}\n","import type { DrawCommand, SceneNode, View } from '@weasel-js/core';\nimport type { WorldRect } from './frac';\nimport { type MarkStyle, markCommands } from './paint';\nimport { isStale } from './staleness';\nimport type { AnnotationData, AnnotationMeaning } from './types';\n\n/** What resolving a mark's appearance needs beyond the mark itself. */\nexport interface MarkDrawOptions {\n /** The target's content box — the world a mark's geometry is in. */\n content: { w: number; h: number };\n /** The target's `positionDependsOn`, for staleness. */\n positionDependsOn?: readonly string[];\n /** The trial's config at the time of the draw. */\n config: unknown;\n /** The instrument's vocabulary, for a status's color. */\n meaning?: AnnotationMeaning;\n}\n\n/**\n * How one mark is drawn — shared by the pane on screen and by an export.\n *\n * One function rather than two call sites building their own, because an\n * export that resolves a status color or a stale dash differently from the\n * screen produces a picture nobody was looking at.\n */\nexport function createMarkDrawOne(\n opts: MarkDrawOptions,\n): (\n node: SceneNode<AnnotationData, 'marks', WorldRect>,\n pose: WorldRect,\n view: View,\n) => DrawCommand[] {\n return (node, pose) =>\n markCommands({ pose, data: node.data }, opts.content, resolveMarkStyle(node.data, opts));\n}\n\n/** How a mark looks, as opposed to where it is. Separate from the callback\n * above because an SVG export resolves the same appearance without ever\n * building a draw command. */\nexport function resolveMarkStyle(data: AnnotationData, opts: MarkDrawOptions): MarkStyle {\n return {\n color: opts.meaning?.statuses?.find((s) => s.id === data.status)?.color,\n // Read off the node rather than through the store's `isStale`, which\n // wants a projected Annotation this path does not have.\n stale: isStale(data.seen, opts.config, opts.positionDependsOn ?? []),\n };\n}\n","import type { DrawCommand, FillStyle, Stroke } from '@weasel-js/core';\nimport type { SvgNode, SvgPaint, SvgStroke } from '@weasel-js/svg';\nimport { type MarkStyle, markCommands, type PaintableMark } from './paint';\n\nconst NO_PAINT: SvgPaint = { kind: 'none' };\n\nfunction toSvgPaint(paint: FillStyle | undefined): SvgPaint {\n if (!paint) return NO_PAINT;\n if ('color' in paint && typeof paint.color === 'string') {\n return {\n kind: 'solid',\n color: paint.color,\n ...(paint.opacity != null ? { opacity: paint.opacity } : {}),\n };\n }\n return { kind: 'gradient', paint };\n}\n\n/** Marker references are deliberately dropped: `markCommands` already resolves\n * a marker into its own path command, and keeping the reference would make\n * the serializer emit a `<marker>` def that draws the head a second time. */\nfunction toSvgStroke(stroke: Stroke): SvgStroke {\n return {\n paint: toSvgPaint(stroke.paint),\n width: stroke.width ?? 1,\n ...(stroke.cap ? { cap: stroke.cap } : {}),\n ...(stroke.join ? { join: stroke.join } : {}),\n ...(stroke.dash ? { dash: [...stroke.dash] } : {}),\n ...(stroke.miterLimit != null ? { miterLimit: stroke.miterLimit } : {}),\n };\n}\n\nfunction toSvgNode(cmd: DrawCommand, m: PaintableMark): SvgNode {\n if (cmd.kind === 'path') {\n return {\n kind: 'path',\n path: cmd.path,\n fill: toSvgPaint(cmd.fill),\n ...(cmd.stroke ? { stroke: toSvgStroke(cmd.stroke) } : {}),\n };\n }\n if (cmd.kind === 'text') {\n return {\n kind: 'text',\n x: cmd.x,\n y: cmd.y,\n width: m.pose.width,\n height: m.pose.height,\n text: cmd.runs.map((run) => run.text).join(''),\n style: cmd.style,\n ...(cmd.runs[0]?.fill ? { fill: cmd.runs[0].fill } : {}),\n };\n }\n // Unreachable while `markCommands` emits only paths and text. A throw rather\n // than a skip: a new mark kind silently vanishing from every export is a\n // worse afternoon than a loud one.\n throw new Error(`[labkit] a mark drew a '${cmd.kind}' command, which has no vector form`);\n}\n\n/**\n * One mark as SVG nodes, converted from the very commands the pane paints.\n *\n * Deliberately not a second switch over `data.kind`: geometry has one source,\n * and this is a translation of it. `serializeSvg` turns the result into a\n * document.\n */\nexport function markSvgNodes(\n m: PaintableMark,\n content: { w: number; h: number },\n style: MarkStyle = {},\n): SvgNode[] {\n return markCommands(m, content, style).map((cmd) => toSvgNode(cmd, m));\n}\n","import { asNodeId, renderSceneToPixels } from '@weasel-js/core';\nimport { serializeSvg } from '@weasel-js/svg';\nimport { createMarkDrawOne, type MarkDrawOptions, resolveMarkStyle } from './drawOne';\nimport type { MarkScene } from './store';\nimport { markSvgNodes } from './svgNodes';\nimport type { AnnotationData, CaptureOptions, CaptureResult, CaptureSource } from './types';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/** Which of the two composition routes an export takes. */\nexport type CapturePlan = 'svg-document' | 'raster-stack';\n\n/**\n * Vector all the way through, or both sides rasterized and stacked.\n *\n * An SVG base is the only one that nests: the marks serialize beside the\n * artifact's own markup and the whole document rasterizes once at the end. A\n * raster base, or none at all, takes the renderer's own path instead — which\n * is also what draws marks onto transparency for a target that declares no\n * base.\n */\nexport function capturePlan(base: CaptureSource | undefined, format: 'png' | 'svg'): CapturePlan {\n if (format === 'svg') return 'svg-document';\n return base?.kind === 'svg' ? 'svg-document' : 'raster-stack';\n}\n\n/** Re-frame a base's own `<svg>` onto the content box, keeping its `viewBox`.\n * Parsed rather than string-spliced: a base whose declared width disagrees\n * with its viewBox would otherwise land at the wrong scale. */\nfunction nestBaseSvg(markup: string, w: number, h: number): string {\n const doc = new DOMParser().parseFromString(markup, 'image/svg+xml');\n const root = doc.documentElement;\n if (doc.getElementsByTagName('parsererror').length > 0 || root.localName !== 'svg') {\n throw new Error(\"[labkit] a target's `base()` returned markup that is not an <svg> document\");\n }\n root.setAttribute('x', '0');\n root.setAttribute('y', '0');\n root.setAttribute('width', String(w));\n root.setAttribute('height', String(h));\n return new XMLSerializer().serializeToString(root);\n}\n\n/** A raster base as an `<image>` filling the content box. An external `src`\n * round-trips as a reference, so the export is only self-contained when it\n * is already a `data:` URI. */\nfunction embedRasterBase(\n base: CaptureSource,\n w: number,\n h: number,\n onWarn?: (m: string) => void,\n): string {\n const href =\n base.kind === 'canvas' ? base.canvas.toDataURL() : base.kind === 'image' ? base.src : '';\n if (base.kind === 'image' && !href.startsWith('data:')) {\n onWarn?.(`base image '${href}' is a reference, so this SVG is not self-contained`);\n }\n return serializeSvg([{ kind: 'image', href, x: 0, y: 0, width: w, height: h }], {\n viewBox: { x: 0, y: 0, width: w, height: h },\n });\n}\n\n/** Every mark on a scene, as SVG nodes, styled the way the pane styles them. */\nfunction markNodesOf(scene: MarkScene, draw: MarkDrawOptions) {\n return [...scene.renderOrder()].flatMap((id) => {\n const node = scene.get(asNodeId(String(id)));\n if (!node) return [];\n return markSvgNodes(\n { pose: node.pose, data: node.data as AnnotationData },\n draw.content,\n resolveMarkStyle(node.data as AnnotationData, draw),\n );\n });\n}\n\nexport interface ComposeSvgArgs {\n base?: CaptureSource;\n scene: MarkScene;\n draw: MarkDrawOptions;\n scale: number;\n onWarn?: (message: string) => void;\n}\n\n/**\n * The base and the marks in one SVG document.\n *\n * The outer `viewBox` is the content box, so marks — which are already in it —\n * need no transform, and `width`/`height` carry the export scale. Both halves\n * nest as child `<svg>` elements, which each establish their own viewport and\n * so keep their own `viewBox` maths out of this function.\n */\nexport function composeCaptureSvg(args: ComposeSvgArgs): string {\n const { base, scene, draw, scale, onWarn } = args;\n const { w, h } = draw.content;\n const baseXml =\n base === undefined\n ? ''\n : base.kind === 'svg'\n ? nestBaseSvg(base.markup, w, h)\n : embedRasterBase(base, w, h, onWarn);\n // No width/height on the marks document: a nested <svg> without them fills\n // the outer viewport exactly, which is the alignment this relies on.\n const marksXml = serializeSvg(markNodesOf(scene, draw), {\n viewBox: { x: 0, y: 0, width: w, height: h },\n onWarn,\n });\n const outW = Math.max(1, Math.round(w * scale));\n const outH = Math.max(1, Math.round(h * scale));\n return `<svg xmlns=\"${SVG_NS}\" width=\"${outW}\" height=\"${outH}\" viewBox=\"0 0 ${w} ${h}\">${baseXml}${marksXml}</svg>`;\n}\n\nfunction context2d(width: number, height: number): CanvasRenderingContext2D {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('[labkit] capture needs a 2D canvas context, and this one has none');\n return ctx;\n}\n\nfunction toPngBlob(canvas: HTMLCanvasElement): Promise<Blob> {\n return new Promise((resolve, reject) => {\n let done: (b: Blob | null) => void;\n try {\n done = (blob) =>\n blob ? resolve(blob) : reject(new Error('[labkit] the browser produced no PNG'));\n canvas.toBlob(done, 'image/png');\n } catch (err) {\n // A base referencing an image from another origin taints the canvas and\n // `toBlob` throws SecurityError. Name the cause: the DOM exception on\n // its own sends people looking at labkit.\n reject(\n new Error(\n '[labkit] the capture canvas is tainted, so it cannot be read back — a base referencing a cross-origin image does this. Embed it as a data: URI.',\n { cause: err },\n ),\n );\n }\n });\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(`[labkit] a capture base failed to load: ${src}`));\n img.src = src;\n });\n}\n\n/** Rasterize a composed document by handing it to the browser's own SVG\n * renderer — one pass over base and marks together. */\nasync function rasterizeSvg(svg: string, width: number, height: number): Promise<Blob> {\n const url = URL.createObjectURL(new Blob([svg], { type: 'image/svg+xml;charset=utf-8' }));\n try {\n const img = await loadImage(url);\n const ctx = context2d(width, height);\n ctx.drawImage(img, 0, 0, width, height);\n return await toPngBlob(ctx.canvas);\n } finally {\n URL.revokeObjectURL(url);\n }\n}\n\n/** Base pixels, then mark pixels over them. The marks come from\n * `renderSceneToPixels` rather than a readback of the live surface, so a\n * capture neither depends on nor disturbs what is on screen. */\nasync function stackRaster(\n args: ComposeSvgArgs & { width: number; height: number },\n): Promise<Blob> {\n const { base, scene, draw, scale, width, height } = args;\n const ctx = context2d(width, height);\n if (base?.kind === 'image') ctx.drawImage(await loadImage(base.src), 0, 0, width, height);\n else if (base?.kind === 'canvas') ctx.drawImage(base.canvas, 0, 0, width, height);\n\n const raster = renderSceneToPixels({\n scene,\n sourceRect: { x: 0, y: 0, width: draw.content.w, height: draw.content.h },\n scale: { x: scale, y: scale },\n drawOne: createMarkDrawOne(draw),\n });\n // Through a second canvas rather than `putImageData` on this one, which\n // replaces pixels instead of compositing and would erase the base.\n const marks = context2d(raster.width, raster.height);\n marks.putImageData(\n new ImageData(Uint8ClampedArray.from(raster.data), raster.width, raster.height),\n 0,\n 0,\n );\n ctx.drawImage(marks.canvas, 0, 0, width, height);\n return toPngBlob(ctx.canvas);\n}\n\n/** What a capture needs about the target it is exporting. */\nexport interface CaptureArgs {\n target: string;\n scene: MarkScene;\n draw: MarkDrawOptions;\n base?: () => CaptureSource | Promise<CaptureSource>;\n onWarn?: (message: string) => void;\n}\n\n/** Export one target's picture with its marks on it. */\nexport async function captureTarget(\n args: CaptureArgs,\n opts: CaptureOptions = {},\n): Promise<CaptureResult> {\n const format = opts.format ?? 'png';\n const scale = opts.scale ?? 2;\n const { content } = args.draw;\n const width = Math.max(1, Math.round(content.w * scale));\n const height = Math.max(1, Math.round(content.h * scale));\n const base = await args.base?.();\n const compose: ComposeSvgArgs = {\n base,\n scene: args.scene,\n draw: args.draw,\n scale,\n onWarn: args.onWarn,\n };\n\n if (capturePlan(base, format) === 'raster-stack') {\n return {\n target: args.target,\n blob: await stackRaster({ ...compose, width, height }),\n format,\n width,\n height,\n };\n }\n\n const svg = composeCaptureSvg(compose);\n const blob =\n format === 'svg'\n ? new Blob([svg], { type: 'image/svg+xml;charset=utf-8' })\n : await rasterizeSvg(svg, width, height);\n return { target: args.target, blob, format, width, height };\n}\n","import type { FracPoint, FracRect } from './types';\n\n/** A mark's box in its target's world: CSS pixels at zoom 1. Matches weasel's\n * default `RectPose`, which is what the scene stores. */\nexport interface WorldRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** Where a fraction lands on a content box of this size. */\nexport function fracToWorld(f: FracRect, content: { w: number; h: number }): WorldRect {\n return {\n x: f.x * content.w,\n y: f.y * content.h,\n width: f.w * content.w,\n height: f.h * content.h,\n };\n}\n\n/** What fraction of the content box a world rect covers.\n *\n * A pane measured before layout is 0×0, and dividing by that would seed every\n * stored position with `NaN` — which compares false against everything and so\n * fails silently rather than loudly. Zero sides give zeros. */\nexport function worldToFrac(r: WorldRect, content: { w: number; h: number }): FracRect {\n const sx = content.w === 0 ? 0 : 1 / content.w;\n const sy = content.h === 0 ? 0 : 1 / content.h;\n return { x: r.x * sx, y: r.y * sy, w: r.width * sx, h: r.height * sy };\n}\n\nconst DP = 10_000;\n\n/** Snap to 4dp. Positions are diffed by humans in stored documents, so the\n * last digits of a float are noise that hides the change that matters. */\nexport function roundFrac(f: FracRect): FracRect {\n return {\n x: Math.round(f.x * DP) / DP,\n y: Math.round(f.y * DP) / DP,\n w: Math.round(f.w * DP) / DP,\n h: Math.round(f.h * DP) / DP,\n };\n}\n\n/** Whether `pt` falls in `box`, widened by `tol` on every side so a hairline\n * mark stays reachable. */\nexport function fracContains(box: FracRect, pt: FracPoint, tol = 0): boolean {\n return (\n pt.x >= box.x - tol &&\n pt.x <= box.x + box.w + tol &&\n pt.y >= box.y - tol &&\n pt.y <= box.y + box.h + tol\n );\n}\n\n/** Whether `outer` wholly encloses `inner`. A marquee takes what it encloses,\n * not what it grazes — brushing selection is a different gesture, and this\n * answers false for two rects that merely overlap. */\nexport function fracEncloses(outer: FracRect, inner: FracRect): boolean {\n return (\n inner.x >= outer.x &&\n inner.y >= outer.y &&\n inner.x + inner.w <= outer.x + outer.w &&\n inner.y + inner.h <= outer.y + outer.h\n );\n}\n","import type { Scene } from '@weasel-js/core';\n\n/** What the ordering needs of a scene: its history depth, and the two moves. */\nexport interface HistoryScene {\n historyIndex(): number;\n undo(): boolean;\n redo(): boolean;\n canUndo(): boolean;\n canRedo(): boolean;\n}\n\n/**\n * One undo ordering over several scenes.\n *\n * Each target's marks live in their own scene and each scene owns its own undo\n * stack, so \"take back the last thing I did\" is a question no single scene can\n * answer. This keeps the order changes arrived in.\n *\n * The order is maintained from each scene's `historyIndex()`, not from its\n * subscribe callback: a scene notifies on ephemeral changes that are not\n * history at all, and an undo driven from inside a pane's own keymap has to\n * *move* this ordering rather than append to it.\n */\nexport class MarkHistory {\n private readonly depth = new Map<string, number>();\n private undoable: string[] = [];\n private redoable: string[] = [];\n /** Set while this class is driving, so a redo is not read as a new change. */\n private replaying: 'undo' | 'redo' | null = null;\n\n /** Start following `scene` under `target`. Idempotent per target. */\n track(target: string, scene: HistoryScene): void {\n if (this.depth.has(target)) return;\n this.depth.set(target, scene.historyIndex());\n }\n\n /** Call on every notification from `target`'s scene. */\n observe(target: string, scene: HistoryScene): void {\n const now = scene.historyIndex();\n const before = this.depth.get(target) ?? 0;\n this.depth.set(target, now);\n if (now > before) {\n if (this.replaying === 'redo') {\n drop(this.redoable, target);\n } else {\n // A change dropped whatever was redoable — weasel's own scene did the\n // same to its stack.\n this.redoable = [];\n }\n this.undoable.push(target);\n } else if (now < before) {\n drop(this.undoable, target);\n this.redoable.push(target);\n }\n }\n\n /** The target `undo` would act on, skipping any whose scene has nothing\n * left — a scene can drop entries this ordering still lists. */\n private next(\n stack: string[],\n can: (s: HistoryScene) => boolean,\n at: (t: string) => HistoryScene | undefined,\n ): string | null {\n for (let i = stack.length - 1; i >= 0; i--) {\n const target = stack[i];\n if (target === undefined) continue;\n const scene = at(target);\n if (scene && can(scene)) return target;\n }\n return null;\n }\n\n canUndo(at: (t: string) => HistoryScene | undefined): boolean {\n return this.next(this.undoable, (s) => s.canUndo(), at) !== null;\n }\n\n canRedo(at: (t: string) => HistoryScene | undefined): boolean {\n return this.next(this.redoable, (s) => s.canRedo(), at) !== null;\n }\n\n undo(at: (t: string) => HistoryScene | undefined): boolean {\n const target = this.next(this.undoable, (s) => s.canUndo(), at);\n const scene = target === null ? undefined : at(target);\n if (!scene) return false;\n this.replaying = 'undo';\n try {\n return scene.undo();\n } finally {\n this.replaying = null;\n }\n }\n\n redo(at: (t: string) => HistoryScene | undefined): boolean {\n const target = this.next(this.redoable, (s) => s.canRedo(), at);\n const scene = target === null ? undefined : at(target);\n if (!scene) return false;\n this.replaying = 'redo';\n try {\n return scene.redo();\n } finally {\n this.replaying = null;\n }\n }\n}\n\n/** Remove the last occurrence of `value`, in place. */\nfunction drop(stack: string[], value: string): void {\n for (let i = stack.length - 1; i >= 0; i--) {\n if (stack[i] === value) {\n stack.splice(i, 1);\n return;\n }\n }\n}\n\n/** A `Scene` satisfies `HistoryScene`; this names the narrowing once. */\nexport const asHistoryScene = (scene: Scene<never, never, never> | HistoryScene): HistoryScene =>\n scene as HistoryScene;\n","import {\n asNodeId,\n createScene,\n type Scene,\n type SerializedScene,\n sceneFromJSON,\n} from '@weasel-js/core';\nimport { captureTarget } from './capture';\nimport type { WorldRect } from './frac';\nimport { fracContains, fracEncloses, fracToWorld, roundFrac, worldToFrac } from './frac';\nimport { MarkHistory } from './history';\nimport { isStale as isStaleAgainst, seenFrom } from './staleness';\nimport type {\n Annotation,\n AnnotationData,\n AnnotationInit,\n AnnotationMeaning,\n AnnotationPatch,\n AnnotationQuery,\n AnnotationsApi,\n AnnotationTargetInfo,\n CaptureOptions,\n CaptureResult,\n FracPoint,\n FracRect,\n SerializedAnnotations,\n} from './types';\n\n/** A mark's box in its target's world. Matches weasel's default `RectPose`. */\ntype MarkPose = WorldRect;\n\n/** The scene one target's marks live in. */\nexport type MarkScene = Scene<AnnotationData, 'marks', MarkPose>;\n\n/** A mark scene: one layer, because marks do not stack in tiers. */\nexport function createAnnotationScene(): MarkScene {\n return createScene<AnnotationData, 'marks', MarkPose>({ systemLayers: [{ id: 'marks' }] });\n}\n\nexport interface AnnotationStoreOptions {\n /** Re-read on every call, so a target resizing or gaining a dependency takes\n * effect without rebuilding the store. */\n targets: () => readonly AnnotationTargetInfo[];\n /** Serialized scenes from a previous `toJSON`, keyed by target. */\n restore?: Readonly<Record<string, unknown>>;\n /** The instrument's vocabulary, so an export draws a mark in the color its\n * status gives it. A thunk is read at each capture, for a vocabulary that\n * changes under a store built once. */\n meaning?: AnnotationMeaning | (() => AnnotationMeaning | undefined);\n /** The trial's live config. A getter for the same reason `targets` is: the\n * store is built once and the config changes under it. */\n config?: () => unknown;\n /** Notified after every finished export. */\n onCapture?: (result: CaptureResult) => void;\n}\n\n/** Everything a capture needs that is not the store's own state. Split out so\n * `capture.ts` takes data rather than reaching back into the store. */\nexport interface CaptureDeps {\n scene: MarkScene;\n target: AnnotationTargetInfo;\n meaning?: AnnotationMeaning;\n config: unknown;\n}\n\nconst NO_CONTENT = { w: 0, h: 0 };\n\n/** A mark's id is its target and its node. One scene per target, so a node id\n * is only unique within one — and an annotation is addressed by both. */\nfunction splitId(id: string): { target: string; node: string } | undefined {\n const at = id.lastIndexOf('/');\n return at <= 0 ? undefined : { target: id.slice(0, at), node: id.slice(at + 1) };\n}\n\n/**\n * A facade over one weasel scene per target: the scenes are the truth, this\n * answers questions about them. Everything crossing this boundary is in\n * fractions of a target's content box; the scenes hold world units.\n *\n * A scene per target rather than one scene with a `target` field, because a\n * pane's hit-test, marquee and paint all walk the whole scene it is given and\n * take no filter — one shared scene puts every other pane's marks under the\n * pointer.\n */\nexport function createAnnotationStore(opts: AnnotationStoreOptions): AnnotationsApi {\n const { targets, restore } = opts;\n const scenes = new Map<string, MarkScene>();\n const subs = new Set<() => void>();\n const history = new MarkHistory();\n const notify = (): void => {\n for (const fn of subs) fn();\n };\n\n const sceneFor = (target: string): MarkScene => {\n const known = scenes.get(target);\n if (known) return known;\n const raw = restore?.[target];\n const scene = raw\n ? sceneFromJSON<AnnotationData, 'marks', MarkPose>(\n raw as SerializedScene<AnnotationData, 'marks', MarkPose>,\n {},\n )\n : createAnnotationScene();\n scenes.set(target, scene);\n history.track(target, scene);\n scene.subscribe(() => {\n history.observe(target, scene);\n notify();\n });\n return scene;\n };\n\n /** Only for scenes that exist: asking for one would create it, and the\n * ordering never names a target it has not seen. */\n const historySceneAt = (target: string) => scenes.get(target);\n\n // Restored scenes are materialized up front: everything below reads\n // `scenes`, and a mark that only appears once its pane asks for its scene is\n // a mark a sidebar cannot list.\n for (const target of Object.keys(restore ?? {})) sceneFor(target);\n\n const targetOf = (id: string): AnnotationTargetInfo | undefined =>\n targets().find((t) => t.id === id);\n\n const contentOf = (id: string) => targetOf(id)?.content ?? NO_CONTENT;\n\n const project = (target: string, node: string): Annotation | undefined => {\n const found = scenes.get(target)?.get(asNodeId(node));\n if (!found) return undefined;\n return {\n ...found.data,\n target,\n id: `${target}/${node}`,\n frac: roundFrac(worldToFrac(found.pose as MarkPose, contentOf(target))),\n };\n };\n\n /** Every target with a scene, in declaration order — then any whose target\n * the instrument has since stopped declaring, so its marks are not lost. */\n const liveTargets = (): string[] => {\n const declared = targets().map((t) => t.id);\n const rest = [...scenes.keys()].filter((id) => !declared.includes(id));\n return [...declared, ...rest];\n };\n\n const marksOn = (target: string): Annotation[] => {\n const scene = scenes.get(target);\n if (!scene) return [];\n const out: Annotation[] = [];\n for (const id of scene.renderOrder()) {\n const a = project(target, String(id));\n if (a) out.push(a);\n }\n return out;\n };\n\n const all = (): Annotation[] => liveTargets().flatMap(marksOn);\n\n const matches = (a: Annotation, q: AnnotationQuery): boolean => {\n if (q.target !== undefined && a.target !== q.target) return false;\n if (q.kind !== undefined && a.kind !== q.kind) return false;\n if (q.status !== undefined && a.status !== q.status) return false;\n if (q.tags !== undefined) {\n const have = a.tags ?? [];\n for (const t of q.tags) if (!have.includes(t)) return false;\n }\n if (q.where && !q.where(a)) return false;\n return true;\n };\n\n /** The node behind a public id, or undefined. */\n const nodeOf = (id: string) => {\n const parts = splitId(id);\n if (!parts) return undefined;\n const scene = scenes.get(parts.target);\n const node = scene?.get(asNodeId(parts.node));\n return node && scene ? { ...parts, scene, node } : undefined;\n };\n\n return {\n sceneFor,\n\n targets,\n\n get(id) {\n const parts = splitId(id);\n return parts ? project(parts.target, parts.node) : undefined;\n },\n\n query(q) {\n return q ? all().filter((a) => matches(a, q)) : all();\n },\n\n hitTest(target, pt: FracPoint, tol = 0) {\n return marksOn(target)\n .filter((a) => fracContains(a.frac, pt, tol))\n .reverse();\n },\n\n within(target, box: FracRect) {\n return marksOn(target).filter((a) => fracEncloses(box, a.frac));\n },\n\n isStale(a, config) {\n const keys = targetOf(a.target)?.positionDependsOn ?? [];\n return isStaleAgainst(a.seen, config, keys);\n },\n\n canUndo() {\n return history.canUndo(historySceneAt);\n },\n\n canRedo() {\n return history.canRedo(historySceneAt);\n },\n\n undo() {\n return history.undo(historySceneAt);\n },\n\n redo() {\n return history.redo(historySceneAt);\n },\n\n selection() {\n const out: string[] = [];\n for (const target of liveTargets()) {\n const scene = scenes.get(target);\n if (!scene) continue;\n for (const node of scene.getSelection()) {\n if (scene.get(node)) out.push(`${target}/${String(node)}`);\n }\n }\n return out;\n },\n\n setSelection(ids) {\n const wanted = new Map<string, string[]>();\n for (const id of ids) {\n const found = nodeOf(id);\n if (!found) continue;\n const node = String(found.node.id);\n const on = wanted.get(found.target);\n if (!on) wanted.set(found.target, [node]);\n else if (!on.includes(node)) on.push(node);\n }\n for (const [target, scene] of scenes) {\n const next = wanted.get(target) ?? [];\n const now = scene.getSelection();\n if (now.length === next.length && next.every((n, i) => String(now[i]) === n)) continue;\n scene.setSelection(next.map(asNodeId));\n }\n },\n\n subscribe(fn) {\n subs.add(fn);\n return () => {\n subs.delete(fn);\n };\n },\n\n add(init: AnnotationInit, config?: unknown) {\n const target = targetOf(init.target);\n const data: AnnotationData = {\n target: init.target,\n kind: init.kind,\n ...(init.points ? { points: init.points } : {}),\n ...(init.title !== undefined ? { title: init.title } : {}),\n ...(init.status !== undefined ? { status: init.status } : {}),\n ...(init.tags !== undefined ? { tags: init.tags } : {}),\n ...(init.meta !== undefined ? { meta: init.meta } : {}),\n seen: seenFrom(config, target?.positionDependsOn ?? []),\n };\n const node = sceneFor(init.target).add({\n kind: 'leaf',\n layer: 'marks',\n pose: fracToWorld(roundFrac(init.frac), target?.content ?? NO_CONTENT),\n data,\n });\n return `${init.target}/${String(node)}`;\n },\n\n update(id, patch: AnnotationPatch) {\n const found = nodeOf(id);\n if (!found) return;\n const { frac, ...meaning } = patch;\n const nid = asNodeId(found.node.id);\n if (Object.keys(meaning).length > 0) {\n found.scene.update(nid, { data: { ...found.node.data, ...meaning } });\n }\n if (frac) {\n found.scene.setPose(nid, fracToWorld(roundFrac(frac), contentOf(found.target)));\n }\n },\n\n setMeta(id, meta) {\n const found = nodeOf(id);\n if (!found) return;\n found.scene.update(asNodeId(found.node.id), { data: { ...found.node.data, meta } });\n },\n\n remove(id) {\n const found = nodeOf(id);\n if (found) found.scene.remove(asNodeId(found.node.id));\n },\n\n async capture(target: string, captureOpts?: CaptureOptions) {\n const info = targetOf(target);\n if (!info) throw new Error(`[labkit] no annotation target called '${target}'`);\n const result = await captureTarget(\n {\n target,\n scene: sceneFor(target),\n draw: {\n content: info.content,\n positionDependsOn: info.positionDependsOn,\n config: opts.config?.(),\n meaning: typeof opts.meaning === 'function' ? opts.meaning() : opts.meaning,\n },\n base: info.base,\n onWarn: (message) => console.warn(`[labkit] capture: ${message}`),\n },\n captureOpts,\n );\n opts.onCapture?.(result);\n return result;\n },\n\n toJSON(): SerializedAnnotations {\n const out: Record<string, unknown> = {};\n for (const [target, scene] of scenes) out[target] = scene.toJSON();\n return { version: 1, scenes: out };\n },\n };\n}\n\n/** Rebuild a store from what `toJSON` wrote. Unknown or future versions give\n * an empty store rather than throwing: a lab that cannot read its marks\n * should still open. */\nexport function annotationsFromJSON(\n raw: unknown,\n targets: () => readonly AnnotationTargetInfo[],\n rest: Omit<AnnotationStoreOptions, 'targets' | 'restore'> = {},\n): AnnotationsApi {\n const doc = raw as Partial<SerializedAnnotations> | null;\n if (doc?.version !== 1 || !doc.scenes) return createAnnotationStore({ targets, ...rest });\n return createAnnotationStore({ targets, restore: doc.scenes, ...rest });\n}\n","import type { BuiltinToolId } from '@weasel-js/core';\nimport {\n ArrowIcon,\n EllipseIcon,\n LineIcon,\n PencilIcon,\n RectIcon,\n SelectIcon,\n TextIcon,\n} from '@weasel-js/ui';\nimport type { TrialTool } from '../tools/types';\nimport type { AnnotationKind } from './types';\n\n/** Which weasel tool an annotation tool drives, and what kind of mark that\n * makes. `select` makes none. */\nexport interface AnnotationToolInfo {\n weaselTool: BuiltinToolId;\n kind?: AnnotationKind;\n}\n\n// `arrow` and `stroke` have no weasel tool of their own, so the kind cannot be\n// read back from the insert — the overlay takes it from the tool id it holds.\nconst TOOLS: Record<string, AnnotationToolInfo> = {\n select: { weaselTool: 'select' },\n stroke: { weaselTool: 'pencil', kind: 'stroke' },\n line: { weaselTool: 'line', kind: 'line' },\n arrow: { weaselTool: 'line', kind: 'arrow' },\n rect: { weaselTool: 'rect', kind: 'rect' },\n ellipse: { weaselTool: 'ellipse', kind: 'ellipse' },\n text: { weaselTool: 'text', kind: 'text' },\n};\n\n/** The tools a lab's rail gets when any instrument declares `annotations`.\n * Ids share the lab's contribution namespace with its own `tools`, and the\n * lab's tool slot holds whichever is active. */\nexport const ANNOTATION_TOOLS: readonly TrialTool[] = [\n { id: 'select', label: 'Select', icon: SelectIcon, group: 'annotate' },\n { id: 'stroke', label: 'Freehand', icon: PencilIcon, group: 'annotate' },\n { id: 'line', label: 'Line', icon: LineIcon, group: 'annotate' },\n { id: 'arrow', label: 'Arrow', icon: ArrowIcon, group: 'annotate' },\n { id: 'rect', label: 'Rectangle', icon: RectIcon, group: 'annotate' },\n { id: 'ellipse', label: 'Ellipse', icon: EllipseIcon, group: 'annotate' },\n { id: 'text', label: 'Text', icon: TextIcon, group: 'annotate' },\n];\n\n/** What `id` drives, or undefined for a tool that is not one of these. */\nexport function annotationToolInfo(id: string | null): AnnotationToolInfo | undefined {\n return id === null ? undefined : TOOLS[id];\n}\n\n/** Every weasel tool the overlay has to mount for this palette to work. */\nexport const ANNOTATION_WEASEL_TOOLS: readonly BuiltinToolId[] = [\n ...new Set(Object.values(TOOLS).map((t) => t.weaselTool)),\n];\n","import type { View } from '@weasel-js/core';\nimport type { ViewTransform } from '../instrument/types';\n\n/** A target's world in CSS pixels: the box its fractions are fractions of. */\nexport interface ContentSize {\n w: number;\n h: number;\n}\n\n/** A target's drawn box on the surface, in CSS pixels. */\nexport interface PaneSize {\n w: number;\n h: number;\n}\n\n/** labkit's camera in weasel's shape. Zoom is uniform, so it lands on both\n * scale axes; pan is weasel's translation unchanged. */\nexport function toWeaselView(v: ViewTransform): View {\n return { x: v.pan.x, y: v.pan.y, scale: { x: v.zoom, y: v.zoom } };\n}\n\n/** The inverse. A weasel view with unequal axis scales collapses to its x —\n * labkit's camera has one zoom and cannot hold the other. */\nexport function fromWeaselView(v: View): ViewTransform {\n return { zoom: v.scale.x, pan: { x: v.x, y: v.y } };\n}\n\n/**\n * The camera a target with none of its own draws through: its content box\n * scaled to fit the box it is drawn in, anchored at the origin.\n *\n * The spec calls the camera \"a plain scale\" at zoom 1; zoom 1 is only right\n * when the pane happens to be the content's size, and a mark drawn on a\n * scaled-down pane otherwise lands outside it.\n */\nexport function fitView(content: ContentSize, pane: PaneSize): ViewTransform {\n const zoom =\n content.w > 0 && content.h > 0 ? Math.min(pane.w / content.w, pane.h / content.h) : 1;\n return { zoom: Number.isFinite(zoom) && zoom > 0 ? zoom : 1, pan: { x: 0, y: 0 } };\n}\n","import {\n type InsertNodeFactory,\n SceneCanvas,\n type SceneCanvasApi,\n useActiveToolContext,\n type View,\n WeaselProvider,\n} from '@weasel-js/core';\nimport { type CSSProperties, useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport { createPortal, flushSync } from 'react-dom';\nimport { CameraWheelContext } from '../canvas/CameraWheelContext';\nimport type { Rect } from '../surface/rect';\nimport { useSurfaceCanvas, useSurfaceOptional, useTileId } from '../surface/useSurfaceTile';\nimport { createMarkDrawOne } from './drawOne';\nimport type { WorldRect } from './frac';\nimport { seenFrom } from './staleness';\nimport type { MarkScene } from './store';\nimport { ANNOTATION_WEASEL_TOOLS, annotationToolInfo } from './toolMap';\nimport type {\n AnnotationData,\n AnnotationKind,\n AnnotationMeaning,\n AnnotationTarget,\n FracPoint,\n} from './types';\nimport { fitView, toWeaselView } from './view';\n\n/** Props for `<AnnotationOverlay>`. */\nexport interface AnnotationOverlayProps {\n target: AnnotationTarget;\n /** The trial's mark scene — shared by every target; a mark's own `target`\n * field is what separates them. */\n scene: MarkScene;\n /** Snapshotted onto each new mark, so staleness can be answered later. */\n config: unknown;\n /** The trial's resolved tool slot. */\n activeToolId: string | null;\n /** The instrument's vocabulary, for a status's color. */\n meaning?: AnnotationMeaning;\n}\n\nconst sameRect = (a: Rect | null, b: Rect): boolean =>\n a !== null && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;\n\n/** Pushes the trial's tool into the weasel scope this pane owns. Its own\n * component because the context only exists below `<WeaselProvider>`. */\nfunction ToolBridge({ toolId }: { toolId: string }) {\n const tools = useActiveToolContext();\n const setActive = tools.setActive;\n useEffect(() => {\n setActive(toolId);\n }, [toolId, setActive]);\n return null;\n}\n\n/** Every vertex the insert carried, in fractions of the content box. */\nfunction pointsOf(\n extras: Record<string, unknown>,\n content: { w: number; h: number },\n): readonly FracPoint[] | undefined {\n const toFrac = (p: { x: number; y: number }): FracPoint => ({\n x: content.w === 0 ? 0 : p.x / content.w,\n y: content.h === 0 ? 0 : p.y / content.h,\n });\n if (extras.kind === 'line') {\n return [toFrac(extras.a as FracPoint), toFrac(extras.b as FracPoint)];\n }\n if (extras.kind === 'pencil') {\n return (extras.samples as { x: number; y: number }[]).map(toFrac);\n }\n return undefined;\n}\n\n/**\n * One target's drawing surface: a transparent box over the target's element\n * taking the input, and a `<SceneCanvas>` painting into the lab's shared\n * buffer at that box's rect.\n *\n * The box is portalled into the surface container because that is what tile\n * rects are measured against; positioning it among the instrument's own DOM\n * would put it in whatever positioning context happened to be there.\n */\nexport function AnnotationOverlay({\n target,\n scene,\n config,\n activeToolId,\n meaning,\n}: AnnotationOverlayProps) {\n const surface = useSurfaceOptional();\n const canvas = useSurfaceCanvas();\n const [rect, setRect] = useState<Rect | null>(null);\n const [input, setInput] = useState<HTMLDivElement | null>(null);\n const sceneCanvas = useRef<SceneCanvasApi | null>(null);\n\n // Read in the insert factory, which is built once and must see the tool the\n // pane is holding now — `arrow` and `stroke` are indistinguishable from\n // `line` and `pencil` at the weasel end.\n const toolRef = useRef(activeToolId);\n toolRef.current = activeToolId;\n const configRef = useRef(config);\n configRef.current = config;\n\n const id = target.id;\n // The surface's tile namespace is the whole lab's, and every trial of an\n // instrument declares the same target ids — so the tile is registered under\n // the trial-scoped key, not under `id`.\n const tileId = useTileId(id);\n const lastTile = useRef<HTMLElement | null>(null);\n useEffect(() => {\n const el = target.ref.current ?? null;\n if (el === lastTile.current) return;\n lastTile.current = el;\n surface?.registerTile(tileId, el);\n });\n useEffect(\n () => () => {\n // Clearing this is what lets the effect above re-register on the next\n // commit. StrictMode's mount / unmount / mount would otherwise take the\n // tile out and never put it back, and the surface would measure nothing.\n lastTile.current = null;\n surface?.registerTile(tileId, null);\n },\n [surface, tileId],\n );\n\n // Erases the whole shared buffer when the tiles move: a tile that moved took\n // its scissor with it, and what it painted last frame stays where it was.\n // Each renderer on the context re-applies its viewport and scissor per frame,\n // so resetting them here is safe.\n // Only once this pane has painted: a bare `getContext` on a buffer no\n // renderer has opened creates the context without the stencil buffer marks\n // need, and every later request gets that context back.\n const painted = useRef(false);\n const canvasRef = useRef(canvas);\n if (canvasRef.current !== canvas) painted.current = false;\n canvasRef.current = canvas;\n const unsubscribeFrame = useRef<(() => void) | null>(null);\n const attachSceneCanvas = useCallback((api: SceneCanvasApi | null) => {\n sceneCanvas.current = api;\n unsubscribeFrame.current?.();\n unsubscribeFrame.current = api\n ? api.subscribeFrame(() => {\n painted.current = true;\n })\n : null;\n }, []);\n useEffect(() => {\n if (!surface) return;\n return surface.registerClear(tileId, (size, dpr) => {\n if (!painted.current) return;\n const gl = canvasRef.current?.getContext('webgl2');\n if (!gl) return;\n gl.disable(gl.SCISSOR_TEST);\n gl.viewport(0, 0, Math.round(size.width * dpr), Math.round(size.height * dpr));\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);\n });\n }, [surface, tileId]);\n\n // The box is portalled out of whatever the picture sits in, so a wheel over\n // a mark would never reach the trial's camera without being handed to it.\n const wheelSlot = useContext(CameraWheelContext);\n useEffect(() => {\n if (!input || !wheelSlot) return;\n const wheel = (e: WheelEvent): void => wheelSlot.current?.(e);\n input.addEventListener('wheel', wheel, { passive: false });\n return () => input.removeEventListener('wheel', wheel);\n }, [input, wheelSlot]);\n\n useEffect(\n () =>\n surface?.registerPainter(tileId, (next) => {\n // Committed before the redraw is asked for: the renderer reads its\n // position from the last render, so a redraw landing first repaints the\n // tile where it was — after this frame's clear, which leaves a ghost.\n flushSync(() => setRect((prev) => (sameRect(prev, next) ? prev : next)));\n // The shared buffer was cleared if it resized this frame; this pane's\n // own loop has no way to know that.\n sceneCanvas.current?.requestRedraw();\n }),\n [surface, tileId],\n );\n\n const container = surface?.getContainer() ?? null;\n if (!container || !rect) return null;\n\n const view: View = toWeaselView(target.view ?? fitView(target.content, { w: rect.w, h: rect.h }));\n\n const drawOne = createMarkDrawOne({\n content: target.content,\n positionDependsOn: target.positionDependsOn,\n config,\n meaning,\n });\n\n const factories: Record<string, InsertNodeFactory> = {};\n for (const weaselTool of ANNOTATION_WEASEL_TOOLS) {\n factories[weaselTool] = (_bounds, extras) => {\n const info = annotationToolInfo(toolRef.current);\n const kind: AnnotationKind | undefined = info?.kind;\n if (!kind) return null;\n const points = pointsOf(extras as unknown as Record<string, unknown>, target.content);\n const data: AnnotationData = {\n target: id,\n kind,\n ...(points ? { points } : {}),\n seen: seenFrom(configRef.current, target.positionDependsOn ?? []),\n };\n return { data };\n };\n }\n\n // A measured rect has nowhere to live but the element's own style. Set as\n // custom properties, which the stylesheet reads — the sanctioned use.\n const box = {\n ['--lk-anno-x' as string]: `${rect.x}px`,\n ['--lk-anno-y' as string]: `${rect.y}px`,\n ['--lk-anno-w' as string]: `${rect.w}px`,\n ['--lk-anno-h' as string]: `${rect.h}px`,\n } as CSSProperties;\n\n return createPortal(\n <>\n <div\n ref={setInput}\n className=\"lk-annotate__input\"\n data-annotation-target={id}\n role=\"application\"\n aria-label={`Annotations on ${id}`}\n // biome-ignore lint/a11y/noNoninteractiveTabindex: role=\"application\" IS the interactive case — a region with its own keymap. The rule's allowed-role list stops at the native widget roles and does not include it, and the gesture dispatcher listens on this element, so without focus no tool's keyboard binding ever fires.\n tabIndex={0}\n style={box}\n />\n {canvas && input ? (\n // One scope per pane: a shared <ActionsProvider> lets only the newest\n // canvas under it respond to input, and the rest go silently dead.\n <WeaselProvider isolate>\n <ToolBridge toolId={annotationToolInfo(activeToolId)?.weaselTool ?? 'select'} />\n <SceneCanvas<AnnotationData, 'marks', WorldRect>\n ref={attachSceneCanvas}\n scene={scene}\n width={rect.w}\n height={rect.h}\n view={view}\n paintInto={{ canvas, x: rect.x, y: rect.y }}\n inputElement={input}\n defaultTools={ANNOTATION_WEASEL_TOOLS}\n insertNodeFactories={factories}\n layers={{ scene: { drawOne } }}\n />\n </WeaselProvider>\n ) : null}\n </>,\n container,\n );\n}\n","import type { TrialInfo } from '../state/types';\nimport { AnnotationOverlay } from './AnnotationOverlay';\nimport type { AnnotationsApi, AnnotationsCapability } from './types';\n\n/** Props for `<AnnotationTargets>`. */\nexport interface AnnotationTargetsProps {\n capability: AnnotationsCapability;\n state: unknown;\n config: unknown;\n /** The trial these targets belong to. `capability.targets` is told it, so a\n * consumer holding per-trial refs can hand back this trial's. */\n trial: TrialInfo;\n annotations: AnnotationsApi;\n activeToolId: string | null;\n}\n\n/** One overlay per region the instrument said accepts marks. */\nexport function AnnotationTargets({\n capability,\n state,\n config,\n trial,\n annotations,\n activeToolId,\n}: AnnotationTargetsProps) {\n const targets = capability.targets(state, config, trial);\n\n return (\n <>\n {targets.map((t) => (\n <AnnotationOverlay\n key={t.id}\n target={t}\n scene={annotations.sceneFor(t.id)}\n meaning={capability.meaning}\n config={config}\n activeToolId={activeToolId}\n />\n ))}\n </>\n );\n}\n","import type { ConfigSchema } from '../config/types';\nimport type { Instrument } from './types';\n\n/** An instrument as it is written: either the legacy `defaultConfig` (plus an\n * optional `configSchema`), or a `config` schema that supplies both. */\nexport type InstrumentSpec<TS, TC, TItem = unknown> =\n | Instrument<TS, TC, TItem>\n | (Omit<Instrument<TS, TC, TItem>, 'defaultConfig'> & { config: ConfigSchema<TC> });\n\n/**\n * Normalizes an instrument spec, and infers its state and config types from\n * the literal rather than making them be written out.\n *\n * A spec declaring `config` gets its `defaultConfig` synthesized from the\n * schema, so nothing downstream branches on which way the config was\n * declared. A spec written the legacy way is returned unchanged, by\n * reference.\n *\n * Resolving the schema into controls does not happen here: rules are\n * lab-scoped and this runs at module load. `useConfigSchema` does that.\n *\n * TypeScript infers all three type arguments or none, so a call that names\n * `TS` and `TC` leaves `TItem` at `unknown` and a job's `onItem` needs a cast.\n * Name the item type too, or pass no type arguments at all.\n */\nexport function defineInstrument<TS, TC, TItem = unknown>(\n spec: InstrumentSpec<TS, TC, TItem>,\n): Instrument<TS, TC, TItem> {\n if (spec.config && !('defaultConfig' in spec && spec.defaultConfig)) {\n const schema = spec.config;\n return { ...spec, defaultConfig: () => schema.defaults() } as Instrument<TS, TC, TItem>;\n }\n return spec as Instrument<TS, TC, TItem>;\n}\n","import type { ConfigField } from '../controls/types';\n\n/** Whether a config schema is usable, and every problem found rather than\n * just the first. */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/** Check a config schema for the mistakes that would otherwise surface as a\n * silently broken control: empty or duplicate keys, and fields whose own\n * constraints do not hold.\n *\n * An unrecognized type is not an error — a lab supplies controls for its own\n * kinds through `ControlPanel`'s `renderers`, and this cannot see them. Such\n * a field simply has no constraints to check here. */\nexport function validateConfigSchema(fields: ConfigField[]): ValidationResult {\n const errors: string[] = [];\n const seenKeys = new Set<string>();\n\n for (const field of fields) {\n if (field.key === '') {\n errors.push('Field has empty key');\n } else if (seenKeys.has(field.key)) {\n errors.push(`Duplicate config key: \"${field.key}\"`);\n } else {\n seenKeys.add(field.key);\n }\n\n if (field.label === '') {\n errors.push(`Field \"${field.key}\" has empty label`);\n }\n\n if (field.type === 'slider') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n if (field.min >= field.max) {\n errors.push(`Slider \"${field.key}\": min must be < max`);\n } else if (field.default < field.min || field.default > field.max) {\n errors.push(`Slider \"${field.key}\": default ${field.default} is outside [min, max]`);\n }\n } else if (field.type === 'number') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n } else if (field.type === 'select') {\n if (field.options.length === 0) {\n errors.push(`Select \"${field.key}\": options array must not be empty`);\n } else {\n const seenValues = new Set<string>();\n for (const opt of field.options) {\n if (seenValues.has(opt.value)) {\n errors.push(`Select \"${field.key}\": duplicate option value \"${opt.value}\"`);\n } else {\n seenValues.add(opt.value);\n }\n }\n if (!seenValues.has(field.default)) {\n errors.push(`Select \"${field.key}\": default \"${field.default}\" is not among options`);\n }\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","// GENERATED by packages/theme/scripts/build-tokens.ts — do not edit.\n\nimport type { RawToken } from '../dtcg/types';\n\n/** Every design token the built-in themes declare, spelled as the CSS\n * custom property it becomes. */\nexport type TokenName =\n | '--wzl-accent'\n | '--wzl-accent-base'\n | '--wzl-accent-fg'\n | '--wzl-accent-hover'\n | '--wzl-accent-soft'\n | '--wzl-accent-strong'\n | '--wzl-backdrop'\n | '--wzl-border'\n | '--wzl-border-strong'\n | '--wzl-border-w'\n | '--wzl-control-h'\n | '--wzl-curve-color'\n | '--wzl-curve-width'\n | '--wzl-danger'\n | '--wzl-danger-base'\n | '--wzl-ease-in-cubic'\n | '--wzl-ease-in-out-cubic'\n | '--wzl-ease-out-back'\n | '--wzl-ease-out-cubic'\n | '--wzl-fg'\n | '--wzl-fg-inverse'\n | '--wzl-fg-muted'\n | '--wzl-fg-on-accent'\n | '--wzl-fg-subtle'\n | '--wzl-field-pad-x'\n | '--wzl-focus-ring'\n | '--wzl-font-body'\n | '--wzl-font-display'\n | '--wzl-font-mono'\n | '--wzl-font-size'\n | '--wzl-font-size-2xs'\n | '--wzl-font-size-lg'\n | '--wzl-font-size-sm'\n | '--wzl-font-size-xl'\n | '--wzl-font-size-xs'\n | '--wzl-font-ui'\n | '--wzl-font-weight-bold'\n | '--wzl-font-weight-light'\n | '--wzl-font-weight-medium'\n | '--wzl-font-weight-normal'\n | '--wzl-glass-blur'\n | '--wzl-glass-tint'\n | '--wzl-gray-100'\n | '--wzl-gray-200'\n | '--wzl-gray-300'\n | '--wzl-gray-400'\n | '--wzl-gray-50'\n | '--wzl-gray-500'\n | '--wzl-gray-600'\n | '--wzl-gray-700'\n | '--wzl-gray-800'\n | '--wzl-gray-900'\n | '--wzl-leading'\n | '--wzl-leading-snug'\n | '--wzl-leading-tight'\n | '--wzl-line'\n | '--wzl-line-strong'\n | '--wzl-line-subtle'\n | '--wzl-line-width'\n | '--wzl-motion-fast'\n | '--wzl-motion-medium'\n | '--wzl-radius-lg'\n | '--wzl-radius-md'\n | '--wzl-radius-pill'\n | '--wzl-radius-sm'\n | '--wzl-shadow'\n | '--wzl-slider-thumb-mix'\n | '--wzl-slider-thumb-size'\n | '--wzl-slider-track-h'\n | '--wzl-slider-track-mix'\n | '--wzl-space-lg'\n | '--wzl-space-md'\n | '--wzl-space-sm'\n | '--wzl-space-xs'\n | '--wzl-success'\n | '--wzl-success-base'\n | '--wzl-surface'\n | '--wzl-surface-hover'\n | '--wzl-surface-pressed'\n | '--wzl-surface-raised'\n | '--wzl-surface-sunken'\n | '--wzl-swatch-amber'\n | '--wzl-swatch-blue'\n | '--wzl-swatch-citron'\n | '--wzl-swatch-fuchsia'\n | '--wzl-swatch-green'\n | '--wzl-swatch-red'\n | '--wzl-swatch-rose'\n | '--wzl-swatch-sky'\n | '--wzl-swatch-teal'\n | '--wzl-swatch-violet'\n | '--wzl-tb-height'\n | '--wzl-tracking-none'\n | '--wzl-tracking-wide'\n | '--wzl-tracking-wider'\n | '--wzl-warning'\n | '--wzl-warning-base'\n | '--wzl-z-modal'\n | '--wzl-z-overlay'\n | '--wzl-z-toolbar';\n\n/** A built-in theme with its aliases already collapsed: every mode maps\n * every token name to a final CSS value. */\nexport interface GeneratedTheme {\n readonly name: string;\n readonly defaultMode: string;\n readonly modes: Readonly<Record<string, Readonly<Record<TokenName, string>>>>;\n}\n\n/** The built-in themes, resolved, keyed by theme name. Read this to list\n * or preview themes without resolving a token graph yourself. */\nexport const THEMES = {\n \"weasel\": {\n name: \"weasel\",\n defaultMode: \"dark\",\n modes: {\n \"dark\": {\n '--wzl-gray-50': \"#f5f5f6\",\n '--wzl-gray-100': \"#e6e7e9\",\n '--wzl-gray-200': \"#c9cbcf\",\n '--wzl-gray-300': \"#9ea1a8\",\n '--wzl-gray-400': \"#6f737b\",\n '--wzl-gray-500': \"#4d5058\",\n '--wzl-gray-600': \"#383b42\",\n '--wzl-gray-700': \"#25272c\",\n '--wzl-gray-800': \"#181a1e\",\n '--wzl-gray-900': \"#0e0f12\",\n '--wzl-accent-soft': \"#1d1454\",\n '--wzl-accent-base': \"#2e1f7a\",\n '--wzl-accent-strong': \"#5841b8\",\n '--wzl-danger-base': \"#d94a3f\",\n '--wzl-warning-base': \"#d99a3f\",\n '--wzl-success-base': \"#2ec27e\",\n '--wzl-fg-on-accent': \"#f5f5f6\",\n '--wzl-fg': \"#e6e7e9\",\n '--wzl-line-subtle': \"rgba(230, 231, 233, 0.1)\",\n '--wzl-line': \"rgba(230, 231, 233, 0.2)\",\n '--wzl-line-strong': \"rgba(230, 231, 233, 0.4)\",\n '--wzl-curve-color': \"#5841b8\",\n '--wzl-accent': \"#2e1f7a\",\n '--wzl-accent-hover': \"#5841b8\",\n '--wzl-danger': \"#d94a3f\",\n '--wzl-warning': \"#d99a3f\",\n '--wzl-success': \"#2ec27e\",\n '--wzl-focus-ring': \"#5841b8\",\n '--wzl-glass-tint': \"#2e1f7a\",\n '--wzl-surface-hover': \"rgba(230, 231, 233, 0.1)\",\n '--wzl-surface-pressed': \"rgba(230, 231, 233, 0.18)\",\n '--wzl-swatch-fuchsia': \"#f641f7\",\n '--wzl-swatch-green': \"#48e628\",\n '--wzl-swatch-sky': \"#36bff2\",\n '--wzl-swatch-amber': \"#e69628\",\n '--wzl-swatch-teal': \"#3ee1cb\",\n '--wzl-swatch-red': \"#f75034\",\n '--wzl-swatch-blue': \"#407ef7\",\n '--wzl-swatch-citron': \"#d5d23a\",\n '--wzl-swatch-rose': \"#fa4590\",\n '--wzl-swatch-violet': \"#955cf9\",\n '--wzl-radius-sm': \"3px\",\n '--wzl-radius-md': \"5px\",\n '--wzl-radius-lg': \"14px\",\n '--wzl-radius-pill': \"999px\",\n '--wzl-border-w': \"1px\",\n '--wzl-line-width': \"2px\",\n '--wzl-curve-width': \"3px\",\n '--wzl-tb-height': \"28px\",\n '--wzl-control-h': \"24px\",\n '--wzl-slider-track-h': \"4px\",\n '--wzl-slider-thumb-size': \"8px\",\n '--wzl-slider-track-mix': \"18%\",\n '--wzl-slider-thumb-mix': \"70%\",\n '--wzl-field-pad-x': \"8px\",\n '--wzl-glass-blur': \"3px\",\n '--wzl-font-size-2xs': \"9px\",\n '--wzl-font-size-xs': \"10px\",\n '--wzl-font-size-sm': \"11px\",\n '--wzl-font-size': \"13px\",\n '--wzl-font-size-lg': \"16px\",\n '--wzl-font-size-xl': \"20px\",\n '--wzl-space-xs': \"4px\",\n '--wzl-space-sm': \"8px\",\n '--wzl-space-md': \"12px\",\n '--wzl-space-lg': \"16px\",\n '--wzl-tracking-none': \"0\",\n '--wzl-tracking-wide': \"0.06em\",\n '--wzl-tracking-wider': \"0.08em\",\n '--wzl-z-toolbar': \"10\",\n '--wzl-z-overlay': \"20\",\n '--wzl-z-modal': \"30\",\n '--wzl-leading-tight': \"1\",\n '--wzl-leading-snug': \"1.2\",\n '--wzl-leading': \"1.4\",\n '--wzl-backdrop': \"none\",\n '--wzl-motion-fast': \"120ms\",\n '--wzl-motion-medium': \"240ms\",\n '--wzl-ease-in-cubic': \"cubic-bezier(0.32, 0, 0.67, 0)\",\n '--wzl-ease-out-cubic': \"cubic-bezier(0.33, 1, 0.68, 1)\",\n '--wzl-ease-in-out-cubic': \"cubic-bezier(0.65, 0, 0.35, 1)\",\n '--wzl-ease-out-back': \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\n '--wzl-font-ui': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-display': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-body': \"Inter, system-ui, -apple-system, 'Segoe UI', sans-serif\",\n '--wzl-font-mono': \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n '--wzl-font-weight-light': \"200\",\n '--wzl-font-weight-normal': \"300\",\n '--wzl-font-weight-medium': \"350\",\n '--wzl-font-weight-bold': \"400\",\n '--wzl-surface': \"#181a1e\",\n '--wzl-surface-raised': \"#25272c\",\n '--wzl-surface-sunken': \"#0e0f12\",\n '--wzl-fg-muted': \"#9ea1a8\",\n '--wzl-fg-subtle': \"#6f737b\",\n '--wzl-border': \"#25272c\",\n '--wzl-border-strong': \"#6f737b\",\n '--wzl-accent-fg': \"#5841b8\",\n '--wzl-fg-inverse': \"#0e0f12\",\n '--wzl-shadow': \"rgba(0, 0, 0, 0.6)\",\n },\n \"light\": {\n '--wzl-gray-50': \"#f5f5f6\",\n '--wzl-gray-100': \"#e6e7e9\",\n '--wzl-gray-200': \"#c9cbcf\",\n '--wzl-gray-300': \"#9ea1a8\",\n '--wzl-gray-400': \"#6f737b\",\n '--wzl-gray-500': \"#4d5058\",\n '--wzl-gray-600': \"#383b42\",\n '--wzl-gray-700': \"#25272c\",\n '--wzl-gray-800': \"#181a1e\",\n '--wzl-gray-900': \"#0e0f12\",\n '--wzl-accent-soft': \"#1d1454\",\n '--wzl-accent-base': \"#2e1f7a\",\n '--wzl-accent-strong': \"#5841b8\",\n '--wzl-danger-base': \"#d94a3f\",\n '--wzl-warning-base': \"#d99a3f\",\n '--wzl-success-base': \"#2ec27e\",\n '--wzl-fg-on-accent': \"#f5f5f6\",\n '--wzl-fg': \"#0e0f12\",\n '--wzl-line-subtle': \"rgba(14, 15, 18, 0.1)\",\n '--wzl-line': \"rgba(14, 15, 18, 0.2)\",\n '--wzl-line-strong': \"rgba(14, 15, 18, 0.4)\",\n '--wzl-curve-color': \"#5841b8\",\n '--wzl-accent': \"#2e1f7a\",\n '--wzl-accent-hover': \"#5841b8\",\n '--wzl-danger': \"#d94a3f\",\n '--wzl-warning': \"#d99a3f\",\n '--wzl-success': \"#2ec27e\",\n '--wzl-focus-ring': \"#5841b8\",\n '--wzl-glass-tint': \"#2e1f7a\",\n '--wzl-surface-hover': \"rgba(14, 15, 18, 0.1)\",\n '--wzl-surface-pressed': \"rgba(14, 15, 18, 0.18)\",\n '--wzl-swatch-fuchsia': \"#f641f7\",\n '--wzl-swatch-green': \"#48e628\",\n '--wzl-swatch-sky': \"#36bff2\",\n '--wzl-swatch-amber': \"#e69628\",\n '--wzl-swatch-teal': \"#3ee1cb\",\n '--wzl-swatch-red': \"#f75034\",\n '--wzl-swatch-blue': \"#407ef7\",\n '--wzl-swatch-citron': \"#d5d23a\",\n '--wzl-swatch-rose': \"#fa4590\",\n '--wzl-swatch-violet': \"#955cf9\",\n '--wzl-radius-sm': \"3px\",\n '--wzl-radius-md': \"5px\",\n '--wzl-radius-lg': \"14px\",\n '--wzl-radius-pill': \"999px\",\n '--wzl-border-w': \"1px\",\n '--wzl-line-width': \"2px\",\n '--wzl-curve-width': \"3px\",\n '--wzl-tb-height': \"28px\",\n '--wzl-control-h': \"24px\",\n '--wzl-slider-track-h': \"4px\",\n '--wzl-slider-thumb-size': \"8px\",\n '--wzl-slider-track-mix': \"18%\",\n '--wzl-slider-thumb-mix': \"70%\",\n '--wzl-field-pad-x': \"8px\",\n '--wzl-glass-blur': \"3px\",\n '--wzl-font-size-2xs': \"9px\",\n '--wzl-font-size-xs': \"10px\",\n '--wzl-font-size-sm': \"11px\",\n '--wzl-font-size': \"13px\",\n '--wzl-font-size-lg': \"16px\",\n '--wzl-font-size-xl': \"20px\",\n '--wzl-space-xs': \"4px\",\n '--wzl-space-sm': \"8px\",\n '--wzl-space-md': \"12px\",\n '--wzl-space-lg': \"16px\",\n '--wzl-tracking-none': \"0\",\n '--wzl-tracking-wide': \"0.06em\",\n '--wzl-tracking-wider': \"0.08em\",\n '--wzl-z-toolbar': \"10\",\n '--wzl-z-overlay': \"20\",\n '--wzl-z-modal': \"30\",\n '--wzl-leading-tight': \"1\",\n '--wzl-leading-snug': \"1.2\",\n '--wzl-leading': \"1.4\",\n '--wzl-backdrop': \"none\",\n '--wzl-motion-fast': \"120ms\",\n '--wzl-motion-medium': \"240ms\",\n '--wzl-ease-in-cubic': \"cubic-bezier(0.32, 0, 0.67, 0)\",\n '--wzl-ease-out-cubic': \"cubic-bezier(0.33, 1, 0.68, 1)\",\n '--wzl-ease-in-out-cubic': \"cubic-bezier(0.65, 0, 0.35, 1)\",\n '--wzl-ease-out-back': \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\n '--wzl-font-ui': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-display': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-body': \"Inter, system-ui, -apple-system, 'Segoe UI', sans-serif\",\n '--wzl-font-mono': \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n '--wzl-font-weight-light': \"200\",\n '--wzl-font-weight-normal': \"300\",\n '--wzl-font-weight-medium': \"350\",\n '--wzl-font-weight-bold': \"400\",\n '--wzl-surface': \"#f5f5f6\",\n '--wzl-surface-raised': \"#e6e7e9\",\n '--wzl-surface-sunken': \"#c9cbcf\",\n '--wzl-fg-muted': \"#383b42\",\n '--wzl-fg-subtle': \"#4d5058\",\n '--wzl-border': \"#c9cbcf\",\n '--wzl-border-strong': \"#4d5058\",\n '--wzl-accent-fg': \"#2e1f7a\",\n '--wzl-fg-inverse': \"#f5f5f6\",\n '--wzl-shadow': \"rgba(0, 0, 0, 0.18)\",\n },\n },\n },\n} as const satisfies Record<string, GeneratedTheme>;\n\n/** Unresolved token graph. `extends` needs the aliases intact so an override\n * of a base primitive still reaches everything referencing it. */\nexport interface ThemeSource {\n readonly primitives: Readonly<Record<string, RawToken>>;\n readonly modes: Readonly<Record<string, Readonly<Record<string, RawToken>>>>;\n}\n\n/** The same built-in themes as `THEMES`, unresolved. This is what\n * `defineTheme` layers onto. */\nexport const THEME_SOURCES: Readonly<Record<string, ThemeSource>> = {\n \"weasel\": {\n \"primitives\": {\n \"gray-50\": {\n \"type\": \"color\",\n \"value\": \"#f5f5f6\"\n },\n \"gray-100\": {\n \"type\": \"color\",\n \"value\": \"#e6e7e9\"\n },\n \"gray-200\": {\n \"type\": \"color\",\n \"value\": \"#c9cbcf\"\n },\n \"gray-300\": {\n \"type\": \"color\",\n \"value\": \"#9ea1a8\"\n },\n \"gray-400\": {\n \"type\": \"color\",\n \"value\": \"#6f737b\"\n },\n \"gray-500\": {\n \"type\": \"color\",\n \"value\": \"#4d5058\"\n },\n \"gray-600\": {\n \"type\": \"color\",\n \"value\": \"#383b42\"\n },\n \"gray-700\": {\n \"type\": \"color\",\n \"value\": \"#25272c\"\n },\n \"gray-800\": {\n \"type\": \"color\",\n \"value\": \"#181a1e\"\n },\n \"gray-900\": {\n \"type\": \"color\",\n \"value\": \"#0e0f12\"\n },\n \"accent-soft\": {\n \"type\": \"color\",\n \"value\": \"#1d1454\"\n },\n \"accent-base\": {\n \"type\": \"color\",\n \"value\": \"#2e1f7a\",\n \"description\": \"Midnight blue-violet. Deep and saturated; anchors primary actions on light and dark surfaces alike.\"\n },\n \"accent-strong\": {\n \"type\": \"color\",\n \"value\": \"#5841b8\"\n },\n \"danger-base\": {\n \"type\": \"color\",\n \"value\": \"#d94a3f\"\n },\n \"warning-base\": {\n \"type\": \"color\",\n \"value\": \"#d99a3f\"\n },\n \"success-base\": {\n \"type\": \"color\",\n \"value\": \"#2ec27e\"\n },\n \"fg-on-accent\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\"\n },\n \"line-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.1,\n \"description\": \"Barely-there separators (table rows).\"\n },\n \"line\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.2,\n \"description\": \"Primary gridlines on sunken surfaces.\"\n },\n \"line-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.4,\n \"description\": \"Axes and emphasized dividers.\"\n },\n \"curve-color\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\",\n \"description\": \"Drawn data curves. Routes through the bright accent because accent-base is too dim on sunken surfaces.\"\n },\n \"accent\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-base}\"\n },\n \"accent-hover\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\"\n },\n \"danger\": {\n \"type\": \"color\",\n \"value\": \"{color.danger-base}\"\n },\n \"warning\": {\n \"type\": \"color\",\n \"value\": \"{color.warning-base}\"\n },\n \"success\": {\n \"type\": \"color\",\n \"value\": \"{color.success-base}\"\n },\n \"focus-ring\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\"\n },\n \"glass-tint\": {\n \"type\": \"color\",\n \"value\": \"{color.accent}\",\n \"description\": \"Frosted-glass tint. Components compose it as color-mix(in srgb, var(--wzl-glass-tint) 78%, transparent) with backdrop-filter: blur(3px).\"\n },\n \"surface-hover\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.1,\n \"description\": \"Hover wash over a raised surface. Same formula as line-subtle, different job — do not collapse them.\"\n },\n \"surface-pressed\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.18,\n \"description\": \"Pressed wash over a raised surface.\"\n },\n \"swatch-fuchsia\": {\n \"type\": \"color\",\n \"value\": \"#f641f7\",\n \"description\": \"First of ten categorical spot colors for plotting, status and data viz. Take them in sequence: the order is farthest-point over hue, so the first N are as separated as N colors can be (first three 87° apart, all ten 32°). Mode-invariant on purpose — a series keeps its color when the mode flips, which is why they are tuned for a dark surface and clear only 1.5:1 on a light one.\"\n },\n \"swatch-green\": {\n \"type\": \"color\",\n \"value\": \"#48e628\"\n },\n \"swatch-sky\": {\n \"type\": \"color\",\n \"value\": \"#36bff2\"\n },\n \"swatch-amber\": {\n \"type\": \"color\",\n \"value\": \"#e69628\"\n },\n \"swatch-teal\": {\n \"type\": \"color\",\n \"value\": \"#3ee1cb\"\n },\n \"swatch-red\": {\n \"type\": \"color\",\n \"value\": \"#f75034\"\n },\n \"swatch-blue\": {\n \"type\": \"color\",\n \"value\": \"#407ef7\"\n },\n \"swatch-citron\": {\n \"type\": \"color\",\n \"value\": \"#d5d23a\"\n },\n \"swatch-rose\": {\n \"type\": \"color\",\n \"value\": \"#fa4590\"\n },\n \"swatch-violet\": {\n \"type\": \"color\",\n \"value\": \"#955cf9\"\n },\n \"radius-sm\": {\n \"type\": \"dimension\",\n \"value\": \"3px\"\n },\n \"radius-md\": {\n \"type\": \"dimension\",\n \"value\": \"5px\"\n },\n \"radius-lg\": {\n \"type\": \"dimension\",\n \"value\": \"14px\"\n },\n \"radius-pill\": {\n \"type\": \"dimension\",\n \"value\": \"999px\",\n \"description\": \"Fully rounded ends — segmented controls, progress tracks.\"\n },\n \"border-w\": {\n \"type\": \"dimension\",\n \"value\": \"1px\"\n },\n \"line-width\": {\n \"type\": \"dimension\",\n \"value\": \"2px\",\n \"description\": \"Structural lines — gridlines, dividers, axes.\"\n },\n \"curve-width\": {\n \"type\": \"dimension\",\n \"value\": \"3px\",\n \"description\": \"Drawn data curves. Heavier than structural lines so data reads as primary content.\"\n },\n \"tb-height\": {\n \"type\": \"dimension\",\n \"value\": \"28px\",\n \"description\": \"Height of a horizontal toolbar strip (ActionsBar, OptionsBar, ToolOptionsBar). Taller than control-h so the controls inside a strip are not flush with its edges.\"\n },\n \"control-h\": {\n \"type\": \"dimension\",\n \"value\": \"24px\",\n \"description\": \"Height of an interactive control — button, input, select, segmented control. Distinct from tb-height, which sizes the strip a row of them sits in.\"\n },\n \"slider-track-h\": {\n \"type\": \"dimension\",\n \"value\": \"4px\",\n \"description\": \"Height of a linear range track. The kit's single-thumb ranges all wear this; Slider's default 24px canvas track does not.\"\n },\n \"slider-thumb-size\": {\n \"type\": \"dimension\",\n \"value\": \"8px\",\n \"description\": \"Diameter of a linear range thumb.\"\n },\n \"slider-track-mix\": {\n \"type\": \"dimension\",\n \"value\": \"18%\",\n \"description\": \"Accent proportion in a range track, as a color-mix percentage — not a color. Mixed into a real property, never into another custom property.\"\n },\n \"slider-thumb-mix\": {\n \"type\": \"dimension\",\n \"value\": \"70%\",\n \"description\": \"Accent proportion in a range thumb, as a color-mix percentage — not a color.\"\n },\n \"field-pad-x\": {\n \"type\": \"dimension\",\n \"value\": \"8px\",\n \"description\": \"Horizontal padding inside a boxed field. Pairs with --wzl-field-h, which is a container override and has no :root default.\"\n },\n \"glass-blur\": {\n \"type\": \"dimension\",\n \"value\": \"3px\",\n \"description\": \"Backdrop blur radius for frosted surfaces. Pairs with glass-tint.\"\n },\n \"font-size-2xs\": {\n \"type\": \"dimension\",\n \"value\": \"9px\",\n \"description\": \"Shortcut keys and index badges. The floor for chrome text.\"\n },\n \"font-size-xs\": {\n \"type\": \"dimension\",\n \"value\": \"10px\",\n \"description\": \"Tool-button labels under an icon.\"\n },\n \"font-size-sm\": {\n \"type\": \"dimension\",\n \"value\": \"11px\",\n \"description\": \"Chrome labels, status readouts, section headings.\"\n },\n \"font-size\": {\n \"type\": \"dimension\",\n \"value\": \"13px\",\n \"description\": \"Controls and body text.\"\n },\n \"font-size-lg\": {\n \"type\": \"dimension\",\n \"value\": \"16px\",\n \"description\": \"Panel and dialog titles.\"\n },\n \"font-size-xl\": {\n \"type\": \"dimension\",\n \"value\": \"20px\",\n \"description\": \"The largest chrome text — a lab or app title.\"\n },\n \"space-xs\": {\n \"type\": \"dimension\",\n \"value\": \"4px\"\n },\n \"space-sm\": {\n \"type\": \"dimension\",\n \"value\": \"8px\"\n },\n \"space-md\": {\n \"type\": \"dimension\",\n \"value\": \"12px\"\n },\n \"space-lg\": {\n \"type\": \"dimension\",\n \"value\": \"16px\"\n },\n \"tracking-none\": {\n \"type\": \"dimension\",\n \"value\": \"0\"\n },\n \"tracking-wide\": {\n \"type\": \"dimension\",\n \"value\": \"0.06em\",\n \"description\": \"Uppercase section headings.\"\n },\n \"tracking-wider\": {\n \"type\": \"dimension\",\n \"value\": \"0.08em\",\n \"description\": \"Uppercase at 11px and below.\"\n },\n \"z-toolbar\": {\n \"type\": \"number\",\n \"value\": 10\n },\n \"z-overlay\": {\n \"type\": \"number\",\n \"value\": 20\n },\n \"z-modal\": {\n \"type\": \"number\",\n \"value\": 30\n },\n \"leading-tight\": {\n \"type\": \"number\",\n \"value\": 1,\n \"description\": \"Single-line controls; the box sets the height.\"\n },\n \"leading-snug\": {\n \"type\": \"number\",\n \"value\": 1.2,\n \"description\": \"Headings and two-line labels.\"\n },\n \"leading\": {\n \"type\": \"number\",\n \"value\": 1.4,\n \"description\": \"Body and anything that wraps.\"\n },\n \"backdrop\": {\n \"type\": \"gradient\",\n \"value\": \"none\",\n \"description\": \"Layered backdrop fill for a page or lab root. `none` here; a theme with a signature background sets it.\"\n },\n \"motion-fast\": {\n \"type\": \"duration\",\n \"value\": \"120ms\",\n \"description\": \"Micro-interactions — hover, focus, pressed.\"\n },\n \"motion-medium\": {\n \"type\": \"duration\",\n \"value\": \"240ms\",\n \"description\": \"Entrances and exits — toasts, popovers, panels.\"\n },\n \"ease-in-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.32,\n 0,\n 0.67,\n 0\n ]\n },\n \"ease-out-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.33,\n 1,\n 0.68,\n 1\n ]\n },\n \"ease-in-out-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.65,\n 0,\n 0.35,\n 1\n ]\n },\n \"ease-out-back\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.34,\n 1.56,\n 0.64,\n 1\n ]\n },\n \"font-ui\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Oswald\",\n \"Helvetica Neue Condensed\",\n \"Arial Narrow\",\n \"system-ui\",\n \"sans-serif\"\n ],\n \"description\": \"Condensed UI/display face. The heavier cuts get blocky at any size, so the weight tokens stay in the 200-400 range.\"\n },\n \"font-display\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Oswald\",\n \"Helvetica Neue Condensed\",\n \"Arial Narrow\",\n \"system-ui\",\n \"sans-serif\"\n ]\n },\n \"font-body\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Inter\",\n \"system-ui\",\n \"-apple-system\",\n \"Segoe UI\",\n \"sans-serif\"\n ]\n },\n \"font-mono\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"ui-monospace\",\n \"SFMono-Regular\",\n \"Menlo\",\n \"Consolas\",\n \"monospace\"\n ]\n },\n \"font-weight-light\": {\n \"type\": \"fontWeight\",\n \"value\": 200\n },\n \"font-weight-normal\": {\n \"type\": \"fontWeight\",\n \"value\": 300\n },\n \"font-weight-medium\": {\n \"type\": \"fontWeight\",\n \"value\": 350\n },\n \"font-weight-bold\": {\n \"type\": \"fontWeight\",\n \"value\": 400\n }\n },\n \"modes\": {\n \"dark\": {\n \"surface\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-800}\"\n },\n \"surface-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-700}\"\n },\n \"surface-sunken\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\"\n },\n \"fg\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-100}\"\n },\n \"fg-muted\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-300}\"\n },\n \"fg-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-400}\"\n },\n \"border\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-700}\"\n },\n \"border-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-400}\",\n \"description\": \"The line that has to be seen: a control's edge, a raised surface's outline. Clears WCAG 1.4.11's 3:1 against every surface in both modes.\"\n },\n \"accent-fg\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\",\n \"description\": \"Accent for foreground use — text, icons, selected labels drawn on a surface. accent is a fill; the midnight base is too dim to read as text on dark surfaces.\"\n },\n \"fg-inverse\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\",\n \"description\": \"Text drawn on a filled foreground-colored element (e.g. a slider thumb). Flips with the mode, so it is a semantic, not an alias to a primitive.\"\n },\n \"shadow\": {\n \"type\": \"color\",\n \"value\": \"rgba(0, 0, 0, 0.6)\",\n \"description\": \"Elevation. Always darker than any surface — never derived from fg, which is near-white on dark.\"\n }\n },\n \"light\": {\n \"surface\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\"\n },\n \"surface-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-100}\"\n },\n \"surface-sunken\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-200}\"\n },\n \"fg\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\"\n },\n \"fg-muted\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-600}\"\n },\n \"fg-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-500}\"\n },\n \"border\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-200}\"\n },\n \"border-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-500}\"\n },\n \"accent-fg\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-base}\",\n \"description\": \"Flips to the deep base in light mode, where it is the legible one.\"\n },\n \"fg-inverse\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\",\n \"description\": \"Flips with the mode — see the dark layer.\"\n },\n \"shadow\": {\n \"type\": \"color\",\n \"value\": \"rgba(0, 0, 0, 0.18)\"\n }\n }\n }\n }\n};\n","import type { FlatTokens, RawToken } from './dtcg/types';\nimport { THEME_SOURCES } from './generated/themes';\n\n/** Authoring shorthand: a bare string is a literal or a `{ref}`. */\nexport type TokenInput = string | number | RawToken;\n\n/** What `defineTheme` accepts: a name, the base theme to layer onto, and the\n * token overrides, split into mode-invariant and per-mode. */\nexport interface ThemeInput {\n readonly name: string;\n /** Base to layer onto. Defaults to `weaselTheme`; `null` opts out. */\n readonly extends?: Theme | null;\n readonly defaultMode?: string;\n /** Mode-invariant overrides. */\n readonly tokens?: Readonly<Record<string, TokenInput>>;\n readonly modes: Readonly<Record<string, Readonly<Record<string, TokenInput>>>>;\n}\n\n/**\n * A theme: a named set of design tokens, organized into a mode-invariant layer\n * plus one layer per mode (light, dark, …), optionally extending another theme.\n * Tokens are held unresolved — aliases between them are collapsed later by\n * `resolveTheme`, so an override of a base primitive still reaches everything\n * that references it.\n */\nexport interface Theme {\n readonly name: string;\n readonly extends: Theme | null;\n readonly defaultMode: string;\n readonly tokens: FlatTokens;\n readonly modes: Readonly<Record<string, FlatTokens>>;\n}\n\nfunction normalize(input: Readonly<Record<string, TokenInput>>): FlatTokens {\n const out: FlatTokens = {};\n for (const [name, v] of Object.entries(input)) {\n out[name] =\n typeof v === 'object'\n ? v\n : { type: 'unknown', value: v, alpha: undefined, description: undefined };\n }\n return out;\n}\n\n/** The built-in theme, materialized from the generated source. */\nexport const weaselTheme: Theme = {\n name: 'weasel',\n extends: null,\n defaultMode: 'dark',\n tokens: THEME_SOURCES.weasel.primitives as FlatTokens,\n modes: THEME_SOURCES.weasel.modes as Record<string, FlatTokens>,\n};\n\n/** Build a theme from authoring shorthand. Unless `extends` says otherwise the\n * result layers onto `weaselTheme`, so a theme only needs to name what it\n * changes. */\nexport function defineTheme(input: ThemeInput): Theme {\n const base = input.extends === undefined ? weaselTheme : input.extends;\n const modes: Record<string, FlatTokens> = {};\n for (const [mode, tokens] of Object.entries(input.modes)) modes[mode] = normalize(tokens);\n return {\n name: input.name,\n extends: base,\n defaultMode: input.defaultMode ?? base?.defaultMode ?? 'dark',\n tokens: normalize(input.tokens ?? {}),\n modes,\n };\n}\n","/**\n * Hex → `rgba()`. The JS side of the alpha extension; the CSS side emits\n * `color-mix()` instead so DOM chrome keeps tracking a downstream override of\n * the referenced token.\n */\nexport function hexToRgba(hex: string, alpha: number): string {\n const m = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) throw new Error(`Expected a hex color, got \"${hex}\"`);\n\n const body = m[1];\n const full = body.length === 3 ? body.replace(/./g, (c) => c + c) : body;\n const r = Number.parseInt(full.slice(0, 2), 16);\n const g = Number.parseInt(full.slice(2, 4), 16);\n const b = Number.parseInt(full.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n","import { hexToRgba } from './color';\nimport type { FlatTokens, ResolvedTokenMap, TokenValue } from './types';\n\n/** `{color.gray-100}` → `gray-100`. The type group is dropped, per the naming rule. */\nconst REF = /^\\{([^}]+)\\}$/;\n\nfunction refTarget(value: TokenValue): string | null {\n if (typeof value !== 'string') return null;\n const m = REF.exec(value.trim());\n if (!m) return null;\n const path = m[1];\n const dot = path.indexOf('.');\n return dot === -1 ? path : path.slice(dot + 1);\n}\n\n/**\n * Quote family names containing whitespace; leave everything else bare.\n * Generic keywords (`sans-serif`) and hyphen-prefixed identifiers\n * (`-apple-system`) break if quoted, and neither contains a space.\n */\nfunction fontStack(value: readonly (string | number)[]): string {\n return value.map((f) => (typeof f === 'string' && /\\s/.test(f) ? `'${f}'` : String(f))).join(', ');\n}\n\nfunction serialize(type: string, value: TokenValue): string {\n if (Array.isArray(value)) {\n if (type === 'cubicBezier') return `cubic-bezier(${value.join(', ')})`;\n if (type === 'fontFamily') return fontStack(value);\n return value.join(', ');\n }\n return String(value);\n}\n\n/**\n * Resolve flat tokens to final CSS-ready strings.\n *\n * Merge modes before calling: this function has no notion of modes, only of a\n * complete token set.\n */\nexport function resolveTokens(tokens: FlatTokens): ResolvedTokenMap {\n const out: ResolvedTokenMap = {};\n const inProgress = new Set<string>();\n\n const resolveOne = (name: string): string => {\n const cached = out[name];\n if (cached !== undefined) return cached;\n\n const token = tokens[name];\n if (!token) throw new Error(`Unknown token \"${name}\"`);\n\n if (inProgress.has(name)) {\n throw new Error(`Reference cycle at token \"${name}\" (${[...inProgress].join(' → ')})`);\n }\n inProgress.add(name);\n\n const target = refTarget(token.value);\n let value: string;\n if (target === null) {\n value = serialize(token.type, token.value);\n } else if (!tokens[target]) {\n throw new Error(`Token \"${name}\" references \"${target}\", which is not defined`);\n } else {\n value = resolveOne(target);\n }\n\n if (token.alpha !== undefined) value = hexToRgba(value, token.alpha);\n\n inProgress.delete(name);\n out[name] = value;\n return value;\n };\n\n for (const name of Object.keys(tokens)) resolveOne(name);\n return out;\n}\n\n/** Merge a mode's tokens over the mode-invariant set. Later wins. */\nexport function mergeTokens(base: FlatTokens, mode: FlatTokens): FlatTokens {\n return { ...base, ...mode };\n}\n","import { resolveTokens } from './dtcg/resolve';\nimport type { FlatTokens } from './dtcg/types';\nimport type { Theme } from './theme';\nimport type { TokenName } from './generated/themes';\n\n/** The output of `resolveTheme`: every token of a theme, for one mode, keyed\n * by CSS custom-property name and flattened to a final CSS value. */\nexport type ResolvedTheme = Readonly<Record<TokenName, string>>;\n\n/** Root-first so the leaf theme's overrides land last. */\nfunction chain(theme: Theme): Theme[] {\n const out: Theme[] = [];\n for (let t: Theme | null = theme; t; t = t.extends) out.unshift(t);\n return out;\n}\n\n/**\n * Merge the extends chain, layer the mode over it, resolve every alias, and\n * key the result by CSS custom-property name.\n *\n * Pure — no DOM. An unresolvable reference throws rather than falling back.\n */\nexport function resolveTheme(theme: Theme, mode: string): ResolvedTheme {\n const themes = chain(theme);\n const effectiveMode = themes.some((t) => mode in t.modes) ? mode : theme.defaultMode;\n\n // Each theme contributes its mode-invariant tokens and then its mode layer,\n // before the next theme down the chain gets a turn. Collecting all `tokens`\n // first and all mode layers second would let the *base's* mode layer outrank\n // a derived theme's deliberate mode-invariant override.\n let merged: FlatTokens = {};\n for (const t of themes) {\n merged = { ...merged, ...t.tokens, ...(t.modes[effectiveMode] ?? {}) };\n }\n\n const resolved = resolveTokens(merged);\n const out: Record<string, string> = {};\n for (const [name, value] of Object.entries(resolved)) out[`--wzl-${name}`] = value;\n return out as ResolvedTheme;\n}\n","import { resolveTheme } from './resolveTheme';\nimport type { Theme } from './theme';\n\nconst STYLE_ID = 'wzl-themes';\n/** `theme.name::mode` → the rule text currently published for it. Keyed by\n * name because that is what the rule's selector matches on, and holding the\n * text is what lets a redefinition under the same name replace its rule\n * rather than be swallowed as a cache hit. */\nconst emitted = new Map<string, string>();\nlet sheet: CSSStyleSheet | null = null;\nlet styleEl: HTMLStyleElement | null = null;\n\n/** Test seam — drops the module-level cache so each case starts clean. */\nexport function __resetThemeSheet(): void {\n emitted.clear();\n sheet = null;\n styleEl = null;\n}\n\nfunction canAdopt(): boolean {\n return (\n typeof CSSStyleSheet !== 'undefined' &&\n 'replaceSync' in CSSStyleSheet.prototype &&\n Array.isArray(document.adoptedStyleSheets)\n );\n}\n\n/** Republish every rule from `emitted`. Rewriting the whole sheet rather than\n * appending keeps it the size of the theme set: a theme redefined under a\n * name it already used replaces its rule instead of stacking another one. */\nfunction flushRules(): void {\n const css = [...emitted.values()].join('\\n');\n if (canAdopt()) {\n if (!sheet) {\n sheet = new CSSStyleSheet();\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n }\n sheet.replaceSync(css);\n return;\n }\n if (!styleEl) {\n styleEl = document.createElement('style');\n styleEl.id = STYLE_ID;\n document.head.appendChild(styleEl);\n }\n styleEl.textContent = css;\n}\n\n/**\n * Apply `theme` at `mode` to `el`'s subtree.\n *\n * Stamps two data attributes and ensures a matching rule block exists in a\n * module-owned stylesheet. Deliberately not inline properties: the cascade\n * then does the work, per-subtree overrides are just a different theme name,\n * and no `!important` is ever needed. No-op outside a DOM.\n */\nexport function applyTheme(el: HTMLElement, theme: Theme, mode: string): void {\n if (typeof document === 'undefined') return;\n\n const key = `${theme.name}::${mode}`;\n const resolved = resolveTheme(theme, mode);\n const body = Object.entries(resolved)\n .map(([name, value]) => `${name}: ${value};`)\n .join(' ');\n const rule = `[data-wzl-theme='${theme.name}'][data-wzl-mode='${mode}'] { ${body} }`;\n if (emitted.get(key) !== rule) {\n emitted.set(key, rule);\n flushRules();\n }\n\n el.setAttribute('data-wzl-theme', theme.name);\n el.setAttribute('data-wzl-mode', mode);\n}\n","import React, { createContext, useContext, useMemo, useRef, useLayoutEffect } from 'react';\nimport { applyTheme } from './applyTheme';\nimport { resolveTheme, type ResolvedTheme } from './resolveTheme';\nimport { weaselTheme, type Theme } from './theme';\n\n/** What `<ThemeProvider>` publishes: the theme, the mode in force, and the\n * fully resolved token record for that pair. */\nexport interface ThemeContextValue {\n readonly theme: Theme;\n readonly mode: string;\n readonly resolved: ResolvedTheme;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\n/** Props for `<ThemeProvider>`. */\nexport interface ThemeProviderProps {\n readonly theme?: Theme;\n readonly mode?: string;\n /** Applied to the wrapper element, so it can be the layout element too. */\n readonly className?: string;\n readonly style?: React.CSSProperties;\n readonly children: React.ReactNode;\n}\n\n/**\n * Applies a theme to a wrapper element and publishes the resolved record.\n *\n * Consumers that draw outside the DOM (the WebGL HUD) read `resolved` and\n * never touch `getComputedStyle`.\n *\n * The wrapper is a real element in the layout. Pass `className` rather than\n * nesting your own div inside — an anonymous div between a flex parent and\n * its child breaks percentage heights.\n */\nexport function ThemeProvider({\n theme = weaselTheme,\n mode,\n className,\n style,\n children,\n}: ThemeProviderProps): React.ReactElement {\n const ref = useRef<HTMLDivElement>(null);\n const effectiveMode = mode ?? theme.defaultMode;\n\n const value = useMemo<ThemeContextValue>(\n () => ({ theme, mode: effectiveMode, resolved: resolveTheme(theme, effectiveMode) }),\n [theme, effectiveMode],\n );\n\n useLayoutEffect(() => {\n if (ref.current) applyTheme(ref.current, theme, effectiveMode);\n }, [theme, effectiveMode]);\n\n return (\n <ThemeContext.Provider value={value}>\n <div\n ref={ref}\n className={className}\n style={style}\n data-wzl-theme={theme.name}\n data-wzl-mode={effectiveMode}\n >\n {children}\n </div>\n </ThemeContext.Provider>\n );\n}\n\n/** The theme in force. Throws outside a `<ThemeProvider>`; use\n * `useThemeOptional` where the provider is not guaranteed. */\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error('useTheme must be used inside a <ThemeProvider>');\n return ctx;\n}\n\n/**\n * The theme if one is provided, `null` otherwise.\n *\n * For kit internals that should follow a theme when the app supplies one but\n * must still work in an app that never mounted a provider — `useHud` is the\n * motivating case.\n */\nexport function useThemeOptional(): ThemeContextValue | null {\n return useContext(ThemeContext);\n}\n","import { createContext } from 'react';\n\n/** Marks an instrument keeps in its own `AnnotationStorage`, already loaded by\n * `<Lab>` for the trials present when it opened, keyed by trial id. A trial\n * missing from it loads its own. */\nexport const AnnotationPreloadContext = createContext<ReadonlyMap<string, unknown> | null>(null);\n","/** The one `$extensions` key this kit defines. */\nexport const ALPHA_EXT = 'com.weasel.alpha';\n\nexport type TokenValue = string | number | readonly (string | number)[];\n\n/**\n * A single design token as authored, before aliases are resolved: a DTCG-shaped\n * `{ type, value }` pair where `value` may still be a `{ref}` to another token.\n */\nexport interface RawToken {\n readonly type: string;\n readonly value: TokenValue;\n /** Render the referenced color at this alpha, 0–1. */\n readonly alpha?: number | undefined;\n readonly description?: string | undefined;\n}\n\n/** A token graph flattened to one level, keyed by token name (no `--wzl-`\n * prefix). Still unresolved — see `ResolvedTokenMap` for the output side. */\nexport type FlatTokens = Record<string, RawToken>;\n\n/** A resolved theme: every token name mapped to its final CSS-ready string.\n * Named ...Map, not ...Tokens, to stay distinct from hud's public `ResolvedTokens`. */\nexport type ResolvedTokenMap = Record<string, string>;\n","import { ALPHA_EXT, type FlatTokens, type RawToken, type TokenValue } from './types';\n\ninterface DtcgToken {\n $value: TokenValue;\n $type?: string;\n $description?: string;\n $extensions?: Record<string, unknown>;\n}\n\nconst isToken = (v: unknown): v is DtcgToken =>\n typeof v === 'object' && v !== null && '$value' in v;\n\n/**\n * Collapse a DTCG document into flat token names.\n *\n * Groups exist only to carry `$type`; they contribute nothing to the name, so\n * `color.fg-muted` becomes `fg-muted` and in turn `--wzl-fg-muted`. This shape\n * is forced by the token set: `--wzl-accent` and `--wzl-accent-base` are both\n * real tokens, and DTCG forbids a token that is also a group.\n */\nexport function flattenTokens(doc: Record<string, unknown>): FlatTokens {\n const out: FlatTokens = {};\n\n for (const [groupName, group] of Object.entries(doc)) {\n if (groupName.startsWith('$')) continue;\n if (typeof group !== 'object' || group === null) continue;\n\n const g = group as Record<string, unknown> & { $type?: string };\n const groupType = g.$type;\n\n for (const [leaf, node] of Object.entries(g)) {\n if (leaf.startsWith('$')) continue;\n if (!isToken(node)) continue;\n\n const type = node.$type ?? groupType;\n if (!type) {\n throw new Error(`Token \"${leaf}\" has no $type and its group \"${groupName}\" declares none`);\n }\n if (leaf in out) {\n throw new Error(`Duplicate token name \"${leaf}\" — leaf keys must be unique across type groups`);\n }\n\n const alphaRaw = node.$extensions?.[ALPHA_EXT];\n const token: RawToken = {\n type,\n value: node.$value,\n alpha: typeof alphaRaw === 'number' ? alphaRaw : undefined,\n description: node.$description,\n };\n out[leaf] = token;\n }\n }\n\n return out;\n}\n","import { flattenTokens } from './dtcg/flatten';\nimport type { FlatTokens } from './dtcg/types';\nimport { weaselTheme, type Theme } from './theme';\n\ninterface DtcgDocument {\n name?: unknown;\n defaultMode?: unknown;\n extends?: Theme | null;\n primitives?: Record<string, unknown>;\n modes?: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Build a `Theme` from a DTCG document — the interchange path, for tokens\n * exported by a design tool rather than authored in TS.\n */\nexport function loadDTCG(doc: DtcgDocument): Theme {\n if (typeof doc.name !== 'string' || doc.name === '') {\n throw new Error('DTCG document needs a string \"name\"');\n }\n const modes: Record<string, FlatTokens> = {};\n for (const [mode, body] of Object.entries(doc.modes ?? {})) {\n modes[mode] = flattenTokens(body);\n }\n const base = doc.extends === undefined ? weaselTheme : doc.extends;\n return {\n name: doc.name,\n extends: base,\n defaultMode:\n typeof doc.defaultMode === 'string' ? doc.defaultMode : (base?.defaultMode ?? 'dark'),\n tokens: flattenTokens(doc.primitives ?? {}),\n modes,\n };\n}\n","{\n \"name\": \"interstellar\",\n \"defaultMode\": \"dark\",\n \"primitives\": {\n \"dimension\": {\n \"$type\": \"dimension\",\n \"radius-md\": { \"$value\": \"6px\" },\n \"glass-blur\": { \"$value\": \"12px\" }\n },\n \"fontWeight\": {\n \"$type\": \"fontWeight\",\n \"font-weight-light\": { \"$value\": 300 },\n \"font-weight-medium\": { \"$value\": 500 },\n \"font-weight-bold\": { \"$value\": 700 }\n }\n },\n \"modes\": {\n \"dark\": {\n \"color\": {\n \"$type\": \"color\",\n \"surface\": { \"$value\": \"#0a0a14\" },\n \"surface-raised\": { \"$value\": \"rgba(20, 20, 36, 0.55)\" },\n \"surface-sunken\": { \"$value\": \"#02020a\" },\n \"border\": { \"$value\": \"rgba(255, 255, 255, 0.14)\" },\n \"line-subtle\": { \"$value\": \"rgba(255, 255, 255, 0.08)\" },\n \"fg\": { \"$value\": \"#e8e8f0\" },\n \"fg-muted\": { \"$value\": \"#a8a8c0\" },\n \"fg-subtle\": { \"$value\": \"#5a5a78\" },\n \"accent\": { \"$value\": \"#b08adb\" },\n \"accent-hover\": { \"$value\": \"#c6a3ee\" },\n \"focus-ring\": { \"$value\": \"rgba(176, 138, 219, 0.45)\" },\n \"shadow\": { \"$value\": \"rgba(0, 0, 0, 0.7)\" },\n \"border-strong\": { \"$value\": \"rgba(255, 255, 255, 0.36)\" }\n },\n \"gradient\": {\n \"$type\": \"gradient\",\n \"backdrop\": {\n \"$value\": \"radial-gradient(ellipse 60% 80% at 18% 30%, rgba(150, 80, 200, 0.22), transparent 70%), radial-gradient(ellipse 55% 90% at 78% 70%, rgba(220, 100, 140, 0.18), transparent 65%), radial-gradient(ellipse 50% 70% at 50% 50%, rgba(60, 110, 200, 0.18), transparent 75%), radial-gradient(ellipse at center, #0a0a18 0%, #02020a 100%)\"\n }\n }\n },\n \"light\": {\n \"color\": {\n \"$type\": \"color\",\n \"surface\": { \"$value\": \"#fafaf7\" },\n \"surface-raised\": { \"$value\": \"#ffffff\" },\n \"surface-sunken\": { \"$value\": \"#f0ebe2\" },\n \"border\": { \"$value\": \"#c9bba5\" },\n \"line-subtle\": { \"$value\": \"rgba(0, 0, 0, 0.08)\" },\n \"fg\": { \"$value\": \"#2a2018\" },\n \"fg-muted\": { \"$value\": \"#6b5c4a\" },\n \"fg-subtle\": { \"$value\": \"#a89b85\" },\n \"accent\": { \"$value\": \"#a86f3c\" },\n \"accent-hover\": { \"$value\": \"#c2854f\" },\n \"focus-ring\": { \"$value\": \"rgba(168, 111, 60, 0.35)\" },\n \"shadow\": { \"$value\": \"rgba(80, 60, 40, 0.18)\" },\n \"border-strong\": { \"$value\": \"#9e8b71\" }\n }\n }\n }\n}\n","import { loadDTCG, type Theme } from '@weasel-js/theme';\nimport doc from './interstellar.tokens.json' with { type: 'json' };\n\n/**\n * labkit's theme: a cosmic dark and a warm parchment light, extending the\n * built-in weasel theme. Authored as DTCG and loaded at import time — the\n * interchange path a theme exported from a design tool would take.\n */\nexport const interstellarTheme: Theme = loadDTCG(doc);\n","import type { ReactNode } from 'react';\nimport { Split, type SplitProps } from '../primitives/Split';\n\n/** Props for `<TrialBody>`. */\nexport interface TrialBodyProps\n extends Omit<SplitProps, 'sidebar' | 'children' | 'className' | 'sidebarClassName' | 'label'> {\n /** The sidebar region's sections. */\n sidebar: ReactNode;\n /** The instrument's own output. */\n children: ReactNode;\n /** Extra class on the content pane — `Trial` marks a canvas instrument's\n * well flush. */\n contentClassName?: string;\n}\n\n/** A trial's sidebar and content as a `Split`, wearing the trial's classes. */\nexport function TrialBody({ sidebar, children, contentClassName, ...rest }: TrialBodyProps) {\n return (\n <Split\n {...rest}\n sidebar={sidebar}\n className=\"lk-trial__panes\"\n sidebarClassName=\"lk-trial__sidebar\"\n contentClassName={\n contentClassName ? `lk-trial__content ${contentClassName}` : 'lk-trial__content'\n }\n >\n {children}\n </Split>\n );\n}\n","import { createContext, useContext } from 'react';\nimport type { NodeId } from 'windease';\n\n/** Supplied by `<Workspace>` when trials are reorderable, so a trial's title\n * bar can be the drag surface. Null when reordering is off. */\nexport const TrialDragContext = createContext<{ nodeId: NodeId } | null>(null);\n\nexport function useTrialDrag(): { nodeId: NodeId } | null {\n return useContext(TrialDragContext);\n}\n","import type { ReactNode } from 'react';\nimport type { NodeId } from 'windease';\nimport { useDragHandle } from 'windease/react';\nimport { useTrialDrag } from './TrialDragContext';\n\n/** Props for `<TrialTitleBar>`. */\nexport interface TrialTitleBarProps {\n title: string;\n /** Rendered at the leading edge, before the title. */\n lead?: ReactNode;\n children?: ReactNode;\n}\n\n// `useDragHandle` needs a node id and windease's DragProvider, so the draggable\n// form is a separate component rather than a conditional hook.\nfunction Draggable({ nodeId, title, lead, children }: TrialTitleBarProps & { nodeId: NodeId }) {\n const handlers = useDragHandle(nodeId);\n return (\n <div className=\"lk-trial__titlebar lk-trial__titlebar--draggable\" {...handlers}>\n {lead}\n <span className=\"lk-trial__title\">{title}</span>\n {children}\n </div>\n );\n}\n\n/** A trial's title bar. When the workspace allows reordering the whole bar is\n * the drag surface — there is no separate grip, because a window's title bar\n * is already the thing you expect to drag. */\nexport function TrialTitleBar({ title, lead, children }: TrialTitleBarProps) {\n const drag = useTrialDrag();\n if (drag)\n return (\n <Draggable nodeId={drag.nodeId} title={title} lead={lead}>\n {children}\n </Draggable>\n );\n return (\n <div className=\"lk-trial__titlebar\">\n {lead}\n <span className=\"lk-trial__title\">{title}</span>\n {children}\n </div>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Where an undocked panel's DOM lives. The panel's *content* stays owned by\n * its trial — it is React-portalled into the host — so a torn-out section\n * keeps the trial's context, state and subscriptions instead of being rebuilt\n * as a sibling of the trial it came from. */\nexport interface PanelHostRegistry {\n set: (key: string, el: HTMLElement | null) => void;\n get: (key: string) => HTMLElement | null;\n subscribe: (fn: () => void) => () => void;\n}\n\nexport function createPanelHostRegistry(): PanelHostRegistry {\n const hosts = new Map<string, HTMLElement>();\n const listeners = new Set<() => void>();\n const notify = () => {\n for (const fn of listeners) fn();\n };\n return {\n set: (key, el) => {\n if (el) hosts.set(key, el);\n else hosts.delete(key);\n notify();\n },\n get: (key) => hosts.get(key) ?? null,\n subscribe: (fn) => {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n };\n}\n\nexport const PanelHostContext = createContext<PanelHostRegistry | null>(null);\n\nexport function usePanelHosts(): PanelHostRegistry | null {\n return useContext(PanelHostContext);\n}\n","import { useSyncExternalStore } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { SidebarSection, TrialContribution } from '../chrome/types';\nimport { usePanelHosts } from '../lab/panelHost';\nimport { panelKey } from '../state/undock';\n\n/** Props for `<UndockedSections>`. */\nexport interface UndockedSectionsProps {\n trialId: string;\n /** The trial's sidebar contributions that are currently torn out. */\n sections: readonly TrialContribution[];\n onDock: (sectionId: string) => void;\n}\n\nfunction Portalled({\n trialId,\n contribution,\n onDock,\n}: {\n trialId: string;\n contribution: TrialContribution;\n onDock: (sectionId: string) => void;\n}) {\n const hosts = usePanelHosts();\n const key = panelKey(trialId, contribution.id);\n const host = useSyncExternalStore(\n (fn) => hosts?.subscribe(fn) ?? (() => {}),\n () => hosts?.get(key) ?? null,\n () => null,\n );\n if (!host || !contribution.item) return null;\n const item = contribution.item as SidebarSection;\n return createPortal(\n <>\n <div className=\"lk-panel-tile__titlebar\">\n <span className=\"lk-panel-tile__title\">{item.title}</span>\n <button\n type=\"button\"\n className=\"lk-panel-tile__dock\"\n aria-label={`Dock ${item.title}`}\n title={`Dock ${item.title}`}\n onClick={() => onDock(contribution.id)}\n >\n ⇤\n </button>\n </div>\n {item.body}\n </>,\n host,\n );\n}\n\n/** Renders a torn-out section's body into the workspace panel holding it. The\n * body stays mounted in the trial's React tree — only its DOM moves — so it\n * keeps the trial's context and its own state across an undock. */\nexport function UndockedSections({ trialId, sections, onDock }: UndockedSectionsProps) {\n if (sections.length === 0) return null;\n return (\n <>\n {sections.map((c) => (\n <Portalled key={c.id} trialId={trialId} contribution={c} onDock={onDock} />\n ))}\n </>\n );\n}\n","import { type KeyboardEvent, type ReactNode, useContext, useMemo } from 'react';\nimport { useStore } from 'zustand/react';\nimport { builtinContributions } from '../chrome/builtins';\nimport { mergeContributions, suppressContributions } from '../chrome/merge';\nimport { PaletteRegion } from '../chrome/regions/PaletteRegion';\nimport { SidebarRegion } from '../chrome/regions/SidebarRegion';\nimport { StatusRegion } from '../chrome/regions/StatusRegion';\nimport { TitleBarRegion } from '../chrome/regions/TitleBarRegion';\nimport { ToolbarRegion } from '../chrome/regions/ToolbarRegion';\nimport { ViewportRegion } from '../chrome/regions/ViewportRegion';\nimport type { TrialChromeContext, TrialContribution, TrialRegion } from '../chrome/types';\nimport { hasConfigPath, schemaNodeAtPath, withValueAtPath } from '../config/path';\nimport { useConfigSchema } from '../config/useConfigSchema';\nimport type { Instrument } from '../instrument/types';\nimport type { JobHandle } from '../job/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { JobProgress } from '../primitives/JobProgress';\nimport { LabStoreContext } from '../state/context';\nimport type { TrialRecord } from '../state/types';\nimport { as2DView, withZoom } from '../state/view';\nimport { TrialBody } from './TrialBody';\nimport { TrialTitleBar } from './TrialTitleBar';\nimport { UndockedSections } from './UndockedSections';\n\n/** The trial's loupe as its chrome sees it: a switch and its position. */\nexport interface LoupeBindings {\n on: boolean;\n toggle: () => void;\n}\n\nexport interface UndoBindings {\n canUndo: boolean;\n canRedo: boolean;\n undo: () => void;\n redo: () => void;\n}\n\n/** Props for `<TrialChrome>`. */\nexport interface TrialChromeProps {\n trialId: string;\n record: TrialRecord;\n instrument: Instrument;\n isLastTrial: boolean;\n undoBindings?: UndoBindings;\n /** Supplied when the instrument declares a `job`. */\n job?: JobHandle;\n /** Supplied when the instrument declares a `loupe`. The lens itself is the\n * trial's to mount; the chrome only offers the switch. */\n loupe?: LoupeBindings;\n /** Contributions the trial runtime itself adds — the drag palette and the\n * layer list, which depend on runtime state the instrument cannot reach. */\n trialChrome?: readonly TrialContribution[];\n /** Contributions from the lab, merged last. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n /** The trial's resolved tool slot, and the setter that writes whichever\n * slot it resolved to. `Trial` owns the resolution. */\n activeToolId?: string | null;\n setActiveTool?: (id: string) => void;\n children: ReactNode;\n}\n\nconst NO_OP = (): void => {};\n\n/** One frozen empty map, so a trial that has folded nothing keeps a stable\n * context identity across renders. */\nconst NO_SECTIONS: Readonly<Record<string, boolean>> = Object.freeze({});\n\n/** The frame around a running instrument. Builds one chrome context, assembles\n * the contributions the instrument, the runtime and the lab declare, and hands\n * each region its slice. */\nexport function TrialChrome({\n trialId,\n record,\n instrument,\n isLastTrial,\n undoBindings,\n job,\n loupe,\n trialChrome,\n chrome,\n suppress,\n activeToolId = null,\n setActiveTool = NO_OP,\n children,\n}: TrialChromeProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] TrialChrome requires <LabStoreProvider>');\n const updateTrialView = useStore(storeCtx.store, (s) => s.updateTrialView);\n const updateTrialSidebarWidth = useStore(storeCtx.store, (s) => s.updateTrialSidebarWidth);\n const setTrialTitle = useStore(storeCtx.store, (s) => s.setTrialTitle);\n const setTrialSectionCollapsed = useStore(storeCtx.store, (s) => s.setTrialSectionCollapsed);\n const updateTrialConfig = useStore(storeCtx.store, (s) => s.updateTrialConfig);\n const updateTrialState = useStore(storeCtx.store, (s) => s.updateTrialState);\n const undockPanelAction = useStore(storeCtx.store, (s) => s.undockPanel);\n const dockPanelAction = useStore(storeCtx.store, (s) => s.dockPanel);\n const undockedPanels = useStore(storeCtx.store, (s) => s.undockedPanels);\n const undockedIds = useMemo(\n () =>\n Object.values(undockedPanels)\n .filter((p) => p.trialId === trialId)\n .map((p) => p.sectionId),\n [undockedPanels, trialId],\n );\n\n // The trial view is opaque to labkit, so the zoom chrome asks for the 2D shape\n // and goes inert when the trial holds something else — an orbit, say.\n const view2d = as2DView(record.view);\n\n const configSchema = useConfigSchema(instrument);\n\n const title = record.title ?? instrument.title ?? instrument.name;\n const collapsedSections = record.collapsedSections ?? NO_SECTIONS;\n\n const ctx = useMemo<TrialChromeContext>(() => {\n const setZoom = (z: number): void => {\n if (!view2d) return;\n updateTrialView(trialId, withZoom(view2d, z));\n };\n return {\n trialId,\n instrumentName: record.instrumentName,\n title,\n setTitle: (next) => setTrialTitle(trialId, next),\n isLastTrial,\n zoom: view2d ? view2d.zoom : null,\n setZoom,\n canUndo: undoBindings?.canUndo ?? false,\n canRedo: undoBindings?.canRedo ?? false,\n undo: undoBindings?.undo ?? NO_OP,\n redo: undoBindings?.redo ?? NO_OP,\n loupeOn: loupe?.on ?? false,\n toggleLoupe: loupe?.toggle ?? NO_OP,\n configSchema,\n configFields: instrument.config ? [] : (instrument.configSchema?.() ?? []),\n config: record.config,\n setConfig: (path, value) => {\n const prevConfig = record.config as Record<string, unknown>;\n if (\n process.env.NODE_ENV !== 'production' &&\n !hasConfigPath(prevConfig, path) &&\n schemaNodeAtPath(configSchema.group, path) === undefined\n ) {\n console.warn(\n `[labkit] setConfig: unknown path \"${path}\" for instrument \"${record.instrumentName}\"`,\n );\n }\n updateTrialConfig(trialId, path, value);\n if (instrument.onConfigChange) {\n const nextConfig = withValueAtPath(prevConfig, path, value);\n const nextState = instrument.onConfigChange(nextConfig, prevConfig, record.state);\n updateTrialState(trialId, nextState as never);\n }\n },\n collapsedSections,\n setSectionCollapsed: (key, collapsed) => setTrialSectionCollapsed(trialId, key, collapsed),\n undockedPanels: undockedIds,\n undockPanel: (sectionId, as) => undockPanelAction(trialId, sectionId, as),\n dockPanel: (sectionId) => dockPanelAction(trialId, sectionId),\n savedSnapshots: lab.savedSnapshots.filter((s) => s.trialId === trialId),\n saveSnapshot: (name) => lab.saveSnapshot(trialId, name),\n loadSnapshot: (snapshotId) => lab.loadSnapshot(trialId, snapshotId),\n clone: () => lab.cloneTrial(trialId),\n reset: () => lab.resetTrial(trialId),\n close: () => lab.closeTrial(trialId),\n activeToolId,\n setActiveTool,\n };\n }, [\n trialId,\n record,\n instrument,\n lab,\n title,\n isLastTrial,\n updateTrialView,\n updateTrialConfig,\n updateTrialState,\n undoBindings,\n loupe,\n view2d,\n activeToolId,\n setActiveTool,\n configSchema,\n undockedIds,\n undockPanelAction,\n dockPanelAction,\n setTrialTitle,\n setTrialSectionCollapsed,\n collapsedSections,\n ]);\n\n const contributions = useMemo(\n () =>\n suppressContributions(\n mergeContributions(\n builtinContributions(instrument, ctx, lab.controls),\n [...(instrument.chrome ?? [])],\n [...(trialChrome ?? [])],\n [...(chrome ?? [])],\n ),\n suppress ?? [],\n ),\n [instrument, ctx, trialChrome, chrome, suppress, lab.controls],\n );\n\n const inRegion = (region: TrialRegion): TrialContribution[] =>\n contributions.filter((c) => c.region === region);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLElement>): void => {\n const mod = e.metaKey || e.ctrlKey;\n if (!mod) return;\n if (e.key === 'z' || e.key === 'Z') {\n e.preventDefault();\n if (e.shiftKey) ctx.redo();\n else ctx.undo();\n } else if (e.key === 's' || e.key === 'S') {\n e.preventDefault();\n ctx.saveSnapshot();\n }\n };\n\n return (\n <section\n className=\"lk-trial\"\n data-trial-id={trialId}\n aria-label={`Trial ${title}`}\n tabIndex={-1}\n onKeyDown={handleKeyDown}\n >\n <TrialTitleBar\n title={title}\n lead={<TitleBarRegion placement=\"lead\" contributions={inRegion('titlebar')} ctx={ctx} />}\n >\n <TitleBarRegion contributions={inRegion('titlebar')} ctx={ctx} />\n </TrialTitleBar>\n <div className=\"lk-trial__toolbar\">\n <ToolbarRegion contributions={inRegion('toolbar')} ctx={ctx} />\n </div>\n <div className=\"lk-trial__body\">\n <PaletteRegion contributions={inRegion('palette')} ctx={ctx} />\n <TrialBody\n width={record.sidebarWidth}\n onWidthChange={(w) => updateTrialSidebarWidth(trialId, w)}\n contentClassName={\n instrument.canvas || instrument.stage ? 'lk-trial__content--flush' : undefined\n }\n sidebar={\n <>\n <SidebarRegion contributions={inRegion('sidebar')} ctx={ctx} />\n <UndockedSections\n trialId={trialId}\n sections={inRegion('sidebar').filter((c) => undockedIds.includes(c.id))}\n onDock={ctx.dockPanel}\n />\n </>\n }\n >\n {children}\n <ViewportRegion contributions={inRegion('viewport')} ctx={ctx} />\n </TrialBody>\n </div>\n <div className=\"lk-trial__status\">\n {job ? <JobProgress job={job} /> : null}\n <StatusRegion contributions={inRegion('status')} ctx={ctx} />\n </div>\n </section>\n );\n}\n","import { type ReactNode, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from 'zustand/react';\nimport { AnnotationsContext } from '../annotations/AnnotationsContext';\nimport { AnnotationTargets } from '../annotations/AnnotationTargets';\nimport { AnnotationPreloadContext } from '../annotations/preload';\nimport { annotationsFromJSON } from '../annotations/store';\nimport type { AnnotationStorage, AnnotationTargetInfo } from '../annotations/types';\nimport { CameraWheelContext, type CameraWheelSlot } from '../canvas/CameraWheelContext';\nimport { CanvasStack } from '../canvas/CanvasStack';\nimport { fitStage, Stage } from '../canvas/Stage';\nimport type { CanvasLayerDescriptor } from '../canvas/useLayerScheduler';\nimport { applyCamera, type ViewportSize } from '../canvas/worldSpec';\nimport type { TrialContribution } from '../chrome/types';\nimport { DragOverlay, useDragDrop } from '../dragdrop/DragDropRuntime';\nimport { Palette } from '../dragdrop/Palette';\nimport type {\n Instrument,\n InstrumentList,\n LayerDescriptor,\n PaletteItem,\n RenderContext,\n} from '../instrument/types';\nimport { useJob } from '../job/useJob';\nimport { useLabContext } from '../lab/LabContext';\nimport { LayerList } from '../layers/LayerList';\nimport { TrialLoupe } from '../loupe/TrialLoupe';\nimport { resolveLoupe } from '../loupe/types';\nimport { LabStoreContext, TrialIdProvider } from '../state/context';\nimport type { LabStore } from '../state/store';\nimport type { TrialRecord } from '../state/types';\nimport { as2DView, DEFAULT_VIEW, withZoom } from '../state/view';\nimport { resolveLabTool } from '../tools/labTool';\nimport { createEventBus, type EventBus } from '../undo/eventBus';\nimport { pushSnapshot, redo as undoRedo, undo as undoUndo } from '../undo/undoStack';\nimport type { LoupeBindings, UndoBindings } from './TrialChrome';\nimport { TrialChrome } from './TrialChrome';\n\n/** Props for `<Trial>`. */\nexport interface TrialProps {\n id: string;\n /** Contributions the lab adds to this trial's chrome, merged after the\n * instrument's own. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n}\n\n/** Renders one trial from the lab store: looks up its record and\n * instrument, and mounts the instrument inside the trial chrome. */\nexport function Trial({ id, chrome, suppress }: TrialProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] <Trial> requires <LabStoreProvider>');\n const instruments = useStore(storeCtx.store, (s) => s.instruments) ?? lab.instruments;\n const record = useStore(storeCtx.store, (s) => s.trials.find((w) => w.id === id));\n const instrument = record ? instruments.find((i) => i.name === record.instrumentName) : undefined;\n const kept = useKeptMarks(instrument?.annotations?.storage, id);\n if (!record) {\n return <div className=\"lk-trial lk-trial--unknown\">Trial not found: {id}</div>;\n }\n if (!instrument) {\n return (\n <div className=\"lk-trial lk-trial--unknown\">Unknown instrument: {record.instrumentName}</div>\n );\n }\n if (!kept.ready) return <div className=\"lk-trial lk-trial--loading\" />;\n return (\n <TrialRuntime\n keptMarks={kept.value}\n record={record}\n instrument={instrument}\n instruments={instruments}\n store={storeCtx.store}\n isLast={lab.trials.length <= 1}\n chrome={chrome}\n suppress={suppress}\n />\n );\n}\n\n/** The marks an instrument keeps in its own storage: preloaded by the lab for\n * the trials it opened with, loaded here for any added since. */\nfunction useKeptMarks(\n storage: AnnotationStorage | undefined,\n trialId: string,\n): { ready: boolean; value: unknown } {\n const preload = useContext(AnnotationPreloadContext);\n const [loaded, setLoaded] = useState<{ value: unknown } | null>(() =>\n storage && preload?.has(trialId) ? { value: preload.get(trialId) } : null,\n );\n useEffect(() => {\n if (!storage || loaded) return;\n let live = true;\n storage.load().then(\n (value) => {\n if (live) setLoaded({ value });\n },\n (error) => {\n console.warn(`[labkit] could not load the marks of trial \"${trialId}\"`, error);\n if (live) setLoaded({ value: null });\n },\n );\n return () => {\n live = false;\n };\n }, [storage, loaded, trialId]);\n if (!storage) return { ready: true, value: undefined };\n return loaded ? { ready: true, value: loaded.value } : { ready: false, value: undefined };\n}\n\ninterface TrialRuntimeProps {\n /** The marks an instrument's own `AnnotationStorage` loaded. */\n keptMarks: unknown;\n record: TrialRecord;\n instrument: Instrument;\n /** The lab's instruments as the store holds them now. */\n instruments: InstrumentList;\n store: LabStore;\n isLast: boolean;\n chrome?: readonly TrialContribution[];\n suppress?: readonly string[];\n}\n\nfunction TrialRuntime({\n keptMarks,\n record,\n instrument,\n instruments,\n store,\n isLast,\n chrome,\n suppress,\n}: TrialRuntimeProps) {\n const wheelSlot = useRef<CameraWheelSlot['current']>(null);\n const canvasContainerRef = useRef<HTMLDivElement | null>(null);\n const loupeHostRef = useRef<HTMLDivElement | null>(null);\n const updateTrialState = useStore(store, (s) => s.updateTrialState);\n const updateTrialConfig = useStore(store, (s) => s.updateTrialConfig);\n const updateTrialView = useStore(store, (s) => s.updateTrialView);\n const updateTrialUndoStack = useStore(store, (s) => s.updateTrialUndoStack);\n const updateTrialAnnotations = useStore(store, (s) => s.updateTrialAnnotations);\n const labToolId = useStore(store, (s) => s.activeToolId);\n const setLabTool = useStore(store, (s) => s.setLabTool);\n const setTrialTool = useStore(store, (s) => s.setTrialTool);\n\n const busRef = useRef<EventBus | null>(null);\n if (busRef.current === null) busRef.current = createEventBus();\n const bus = busRef.current;\n\n const [layerVisibility, setLayerVisibility] = useState<Record<string, boolean>>({});\n const [layerOrder, setLayerOrder] = useState<string[] | null>(null);\n const [loupeOn, setLoupeOn] = useState(false);\n\n const visibleLayers = useMemo(\n () =>\n (instrument.canvas?.layers ?? [])\n .filter((l) => layerVisibility[l.id] !== false)\n .map((l) => l.id),\n [instrument.canvas, layerVisibility],\n );\n\n const undoCap = instrument.undo;\n const undoEvents = useMemo(() => new Set(undoCap?.snapshotOn ?? ['state.change']), [undoCap]);\n const maxDepth = undoCap?.maxDepth ?? 50;\n\n const snapshotIfNeeded = (event: string): void => {\n if (!undoCap || !undoEvents.has(event)) return;\n const current = store.getState().trials.find((w) => w.id === record.id);\n if (!current) return;\n const snap = structuredClone(current.state);\n updateTrialUndoStack(record.id, (prev) => pushSnapshot(prev, snap, maxDepth));\n };\n\n const setView = (v: unknown): void => updateTrialView(record.id, v);\n\n // A function `initialView` needs the canvas size, so `trialOps` leaves the\n // view null and the first measurement resolves it. Reset nulls it again,\n // which re-frames — so the guard is the null itself, not a \"have I run\" flag.\n const stage = instrument.canvas ? undefined : instrument.stage;\n const placeView = (size: ViewportSize): void => {\n const declared =\n instrument.canvas?.initialView ??\n (stage ? (stage.initialView ?? ((vp: ViewportSize) => fitStage(stage.size, vp))) : undefined);\n if (typeof declared !== 'function') return;\n if (record.view != null) return;\n setView(declared(size));\n };\n\n // The capability's own `targets` thunk, re-read on every call: a target\n // resizing or gaining a dependency must not need the store rebuilt. Held in\n // a ref because the store is built once and closes over it.\n const annotationsCap = instrument.annotations;\n const targetsRef = useRef<() => readonly AnnotationTargetInfo[]>(() => []);\n targetsRef.current = () =>\n annotationsCap\n ? annotationsCap.targets(record.state, record.config, { id: record.id, view: record.view })\n : [];\n\n // One store for the trial's lifetime.\n const annotationsRef = useRef<ReturnType<typeof annotationsFromJSON> | null>(null);\n // Read through refs for the same reason `targets` is: the store is built\n // once, and an export must draw against the config the trial holds now.\n const configRef = useRef<unknown>(record.config);\n configRef.current = record.config;\n // The instrument can be swapped under a live trial, so the capability is read at use too.\n const capRef = useRef(annotationsCap);\n capRef.current = annotationsCap;\n if (annotationsRef.current === null) {\n // Seeded from wherever the marks were kept: the instrument's own store if\n // it declared one, else this trial's slot.\n const kept = annotationsCap?.storage ? keptMarks : record.annotations;\n annotationsRef.current = annotationsFromJSON(kept, () => targetsRef.current(), {\n meaning: () => capRef.current?.meaning,\n config: () => configRef.current,\n onCapture: (result) => capRef.current?.onCapture?.(result),\n });\n }\n const annotations = annotationsRef.current;\n\n // Written on a trailing debounce rather than per notification: a scene\n // mutates every frame of a drag, and a zustand write per frame re-renders\n // every trial in the lab. The unmount flush is not an optimization — the\n // last mark before a trial closes is otherwise lost.\n const saveCap = annotationsCap?.storage;\n const saveRef = useRef<(doc: unknown) => void>(() => {});\n saveRef.current = (doc) => {\n if (saveCap) saveCap.save(doc as never);\n else updateTrialAnnotations(record.id, doc);\n };\n // Only when the pair flips, which is rare: bumping React state on every\n // scene notification would re-render the trial on every frame of a drag,\n // which is the thing the debounce below exists to avoid.\n const [markMoves, setMarkMoves] = useState({ undo: false, redo: false });\n useEffect(() => {\n if (!annotationsCap) return;\n const read = (): void => {\n const next = { undo: annotations.canUndo(), redo: annotations.canRedo() };\n setMarkMoves((prev) => (prev.undo === next.undo && prev.redo === next.redo ? prev : next));\n };\n read();\n return annotations.subscribe(read);\n }, [annotations, annotationsCap]);\n\n useEffect(() => {\n if (!annotationsCap) return;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let dirty = false;\n const flush = (): void => {\n if (!dirty) return;\n dirty = false;\n saveRef.current(annotations.toJSON());\n };\n const off = annotations.subscribe(() => {\n dirty = true;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n flush();\n }, 250);\n });\n return () => {\n off();\n if (timer) clearTimeout(timer);\n flush();\n };\n }, [annotations, annotationsCap]);\n\n // A trial gets its own slot when its instrument declares tools; otherwise it\n // reads the lab's. Which slot a change writes follows from the same thing.\n // Annotation tools always read the lab's: a tool is what the hand holds, so\n // picking one arms it in every trial, the way artboards share a tool. They\n // were once per trial, back when one trial compared several pictures.\n const declaresTools = instrument.tools != null;\n const labTool = resolveLabTool(labToolId, instruments);\n const resolvedToolId = declaresTools\n ? (record.activeToolId ?? instrument.tools?.initial ?? instrument.tools?.tools[0]?.id ?? null)\n : labTool;\n const setActiveTool = (id: string): void => {\n if (declaresTools) setTrialTool(record.id, id);\n else setLabTool(id);\n };\n\n // `CanvasStack` and the zoom controls are 2D; a trial holding another view shape\n // gets the default here and simply never renders them.\n const view2d = as2DView(record.view);\n\n const jobCap = instrument.job;\n // Hooks cannot be conditional, so a trial without the capability still calls\n // this — with a runner that yields nothing and is never started.\n const job = useJob({\n capability: jobCap ?? { run: async function* () {}, onItem: (_i, st) => st },\n config: record.config,\n state: record.state,\n setState: (next) => updateTrialState(record.id, next as never),\n });\n\n const renderCtx: RenderContext<unknown, unknown> = {\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('state.change');\n updateTrialState(record.id, next);\n bus.emit('state.change');\n },\n setConfig: (path, value) => {\n const evt = `config.change:${path}`;\n snapshotIfNeeded('config.change');\n snapshotIfNeeded(evt);\n updateTrialConfig(record.id, path, value);\n bus.emit('config.change');\n bus.emit(evt);\n },\n trial: {\n id: record.id,\n view: record.view,\n setView,\n zoom: view2d?.zoom ?? 1,\n setZoom: (z) => {\n if (!view2d) return;\n updateTrialView(record.id, withZoom(view2d, z));\n },\n activeToolId: resolvedToolId,\n visibleLayers,\n },\n emit: (event) => {\n snapshotIfNeeded(event);\n bus.emit(event);\n },\n job: jobCap ? job : undefined,\n };\n\n // Marks are undone through weasel history, not through labkit's snapshot\n // stack — the spec's rule, and the reason a mark scene is the truth. A trial\n // declaring both takes the marks first: the most recent thing the user did\n // is what undo is for, and only a mark change moves the mark history.\n const undoState = () => {\n const result = undoUndo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateTrialState(record.id, result.snapshot as never);\n updateTrialUndoStack(record.id, result.stack);\n };\n const redoState = () => {\n const result = undoRedo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateTrialState(record.id, result.snapshot as never);\n updateTrialUndoStack(record.id, result.stack);\n };\n\n const undoBindings: UndoBindings | undefined =\n undoCap || annotationsCap\n ? {\n canUndo: markMoves.undo || (undoCap ? record.undoStack.past.length > 0 : false),\n canRedo: markMoves.redo || (undoCap ? record.undoStack.future.length > 0 : false),\n undo: () => {\n if (annotationsCap && annotations.undo()) return;\n if (undoCap) undoState();\n },\n redo: () => {\n if (annotationsCap && annotations.redo()) return;\n if (undoCap) redoState();\n },\n }\n : undefined;\n\n const loupeCap = useMemo(() => {\n const declared = instrument.loupe;\n if (declared == null) return null;\n return resolveLoupe(typeof declared === 'function' ? declared(record.config) : declared);\n }, [instrument.loupe, record.config]);\n const loupeBindings: LoupeBindings | undefined = loupeCap\n ? { on: loupeOn, toggle: () => setLoupeOn((v) => !v) }\n : undefined;\n\n const canvasLayers: CanvasLayerDescriptor[] = useMemo(() => {\n if (!instrument.canvas) return [];\n const baseLayers = instrument.canvas.layers;\n const ordered = layerOrder\n ? [...baseLayers].sort((a, b) => layerOrder.indexOf(a.id) - layerOrder.indexOf(b.id))\n : baseLayers;\n return ordered.map((layer) => ({\n id: layer.id,\n visible: layerVisibility[layer.id] !== false,\n render: (ctx, view, frame) => {\n // Camera applied here, so a layer draws in world coordinates. `zoom`\n // stays in the args for line widths, which must not scale with it.\n applyCamera(ctx, view, frame);\n layer.draw(ctx, { state: record.state, config: record.config, zoom: view.zoom });\n },\n }));\n }, [instrument.canvas, record.state, record.config, layerVisibility, layerOrder]);\n\n const layerDescriptors: LayerDescriptor[] = useMemo(() => {\n if (!instrument.layers) return [];\n return instrument.layers.ids.map((l) => (typeof l === 'string' ? { id: l, label: l } : l));\n }, [instrument.layers]);\n\n const dragDropResult = useDragDrop({\n capability: instrument.dragDrop ?? { palette: [], onDrop: (_p, _i, s) => s },\n canvasContainerRef,\n view: view2d ?? DEFAULT_VIEW,\n worldSpec: instrument.canvas?.worldSpec,\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('canvas.itemAdded');\n updateTrialState(record.id, next as never);\n },\n emit: (evt) => {\n snapshotIfNeeded(evt);\n bus.emit(evt);\n },\n });\n\n const paletteItems: PaletteItem[] = useMemo(() => {\n if (!instrument.dragDrop) return [];\n const p = instrument.dragDrop.palette;\n return typeof p === 'function' ? p(record.state, record.config) : p;\n }, [instrument.dragDrop, record.state, record.config]);\n\n const layersWithFeedback: CanvasLayerDescriptor[] = useMemo(() => {\n if (!dragDropResult.drag?.feedback) return canvasLayers;\n const fb = dragDropResult.drag.feedback;\n const screen = dragDropResult.drag.screenPos;\n return [\n ...canvasLayers,\n {\n id: '__lk_drag_feedback',\n visible: true,\n render: (ctx) => {\n const el = canvasContainerRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n ctx.save();\n ctx.strokeStyle = fb.ok ? '#3a7' : '#c44';\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.arc(screen.x - r.left, screen.y - r.top, 16, 0, Math.PI * 2);\n ctx.stroke();\n ctx.restore();\n },\n },\n ];\n }, [canvasLayers, dragDropResult.drag]);\n\n // The lens tracks the pointer over whatever box holds the content: the canvas\n // stack's own element, which it takes from context, or the wrapper below.\n const lens = loupeCap ? (\n <TrialLoupe\n capability={loupeCap}\n enabled={loupeOn}\n state={record.state}\n config={record.config}\n view={view2d ?? DEFAULT_VIEW}\n worldSpec={instrument.canvas?.worldSpec}\n hostRef={loupeHostRef}\n />\n ) : null;\n\n let body: ReactNode;\n if (instrument.canvas) {\n body = (\n <div ref={canvasContainerRef} className=\"lk-trial__canvas-host\">\n <CanvasStack\n layers={layersWithFeedback}\n view={view2d ?? DEFAULT_VIEW}\n onViewChange={setView}\n worldSpec={instrument.canvas.worldSpec}\n onResize={placeView}\n minZoom={instrument.canvas.minZoom}\n maxZoom={instrument.canvas.maxZoom}\n >\n {instrument.render(renderCtx)}\n {lens}\n </CanvasStack>\n <DragOverlay drag={dragDropResult.drag} />\n </div>\n );\n } else if (stage) {\n body = (\n <Stage\n size={stage.size}\n view={view2d ?? DEFAULT_VIEW}\n onViewChange={setView}\n onResize={placeView}\n minZoom={stage.minZoom}\n maxZoom={stage.maxZoom}\n hostRef={loupeHostRef}\n overlay={lens}\n >\n {instrument.render(renderCtx)}\n </Stage>\n );\n } else if (lens) {\n body = (\n <div ref={loupeHostRef} className=\"lk-trial__loupe-host\">\n {instrument.render(renderCtx)}\n {lens}\n </div>\n );\n } else {\n body = instrument.render(renderCtx);\n }\n\n const startDrag = dragDropResult.startDrag;\n const paletteNode = useMemo(\n () =>\n paletteItems.length > 0 ? <Palette items={paletteItems} onDragStart={startDrag} /> : null,\n [paletteItems, startDrag],\n );\n\n const layerListNode = useMemo(\n () =>\n instrument.layers && layerDescriptors.length > 0 ? (\n <LayerList\n layers={layerDescriptors}\n visibility={layerVisibility}\n onReorder={(next) => {\n setLayerOrder(next.map((l) => l.id));\n bus.emit('layers.reorder');\n }}\n onToggle={(lid, visible) => {\n setLayerVisibility((prev) => ({ ...prev, [lid]: visible }));\n bus.emit('layers.toggle');\n }}\n />\n ) : null,\n [instrument.layers, layerDescriptors, layerVisibility, bus],\n );\n\n const extraChrome = useMemo<TrialContribution[]>(() => {\n const out: TrialContribution[] = [];\n if (paletteNode) {\n out.push({\n id: 'dragdrop-palette',\n region: 'sidebar',\n item: { title: 'Parts', body: paletteNode },\n });\n }\n if (layerListNode) {\n out.push({\n id: 'layer-list',\n region: 'sidebar',\n item: { title: 'Layers', body: layerListNode },\n });\n }\n return out;\n }, [paletteNode, layerListNode]);\n\n // Rendered beside the body rather than inside it: an overlay portals itself\n // into the surface container, so where it sits in this tree decides only\n // when its effects run — after the instrument's refs have attached.\n const annotationOverlays = annotationsCap ? (\n <AnnotationTargets\n capability={annotationsCap}\n state={record.state}\n config={record.config}\n trial={{ id: record.id, view: record.view }}\n annotations={annotations}\n activeToolId={labTool}\n />\n ) : null;\n\n return (\n <TrialIdProvider trialId={record.id}>\n <AnnotationsContext.Provider value={annotationsCap ? annotations : null}>\n <CameraWheelContext.Provider value={wheelSlot}>\n <TrialChrome\n job={jobCap ? job : undefined}\n loupe={loupeBindings}\n trialId={record.id}\n record={record}\n instrument={instrument}\n isLastTrial={isLast}\n undoBindings={undoBindings}\n trialChrome={extraChrome}\n chrome={chrome}\n suppress={suppress}\n activeToolId={resolvedToolId}\n setActiveTool={setActiveTool}\n >\n {body}\n {annotationOverlays}\n </TrialChrome>\n </CameraWheelContext.Provider>\n </AnnotationsContext.Provider>\n </TrialIdProvider>\n );\n}\n","import { fillConfigDefaults } from '../config/path';\nimport type { Instrument, InstrumentList } from '../instrument/types';\nimport { newId } from '../state/helpers';\nimport type { TrialRecord } from '../state/types';\n\nconst DEFAULT_VIEW = { zoom: 1, pan: { x: 0, y: 0 } } as const;\n\nfunction findInstrument(instruments: InstrumentList, name: string): Instrument {\n const found = instruments.find((i) => i.name === name);\n if (!found) {\n throw new Error(`[labkit] Unknown instrument: \"${name}\"`);\n }\n return found;\n}\n\nfunction initialView(instrument: Instrument): TrialRecord['view'] {\n const stage = instrument.canvas ? undefined : instrument.stage;\n const declared = instrument.canvas?.initialView ?? stage?.initialView;\n // A function needs the canvas size, which no trial has at creation. `null`\n // is the unplaced marker; `Trial` resolves it on the first non-empty size.\n // A stage that names no view is fitted, which needs that size too.\n if (typeof declared === 'function' || (stage && declared === undefined)) return null;\n return declared ? structuredClone(declared) : { ...DEFAULT_VIEW, pan: { ...DEFAULT_VIEW.pan } };\n}\n\n/** What a trial opens on beyond its instrument's own defaults. */\nexport interface AddTrialOptions<TC = Record<string, unknown>> {\n /** Overlaid on `defaultConfig()` before `initialState` reads it, so a trial\n * opened on a subject is running that subject from its first frame. Keys\n * whose value is `undefined` are left to the default. */\n config?: Partial<TC>;\n}\n\n/** `defaultConfig()` with `seed` written over it, down the tree: a seed naming\n * one leaf of a group leaves that group's other leaves at their defaults. */\nfunction seedConfig<TC>(defaults: TC, seed: Partial<TC> | undefined): TC {\n return seed ? fillConfigDefaults(seed, defaults) : defaults;\n}\n\n/** Append a new trial running `instrumentName`, at that instrument's default\n * config — with `options.config` written over it — and the initial state\n * that config produces. */\nexport function addTrial(\n trials: TrialRecord[],\n instruments: InstrumentList,\n instrumentName: string,\n options: AddTrialOptions = {},\n): TrialRecord[] {\n const instrument = findInstrument(instruments, instrumentName);\n const config = seedConfig(instrument.defaultConfig(), options.config);\n const state = instrument.initialState(config);\n const record: TrialRecord = {\n id: newId(),\n instrumentName,\n config,\n state,\n view: initialView(instrument),\n undoStack: { past: [], future: [] },\n };\n if (options.config) record.configSeed = options.config;\n return [...trials, record];\n}\n\n/** Insert a deep copy of a trial directly after it. The copy starts with\n * an empty undo history — the original's is not shared. */\nexport function cloneTrial(trials: TrialRecord[], id: string): TrialRecord[] {\n const sourceIdx = trials.findIndex((w) => w.id === id);\n const source = trials[sourceIdx];\n if (!source) return trials;\n const clone: TrialRecord = {\n ...source,\n id: newId(),\n config: structuredClone(source.config),\n state: structuredClone(source.state),\n view: structuredClone(source.view),\n undoStack: { past: [], future: [] },\n };\n return [...trials.slice(0, sourceIdx + 1), clone, ...trials.slice(sourceIdx + 1)];\n}\n\n/** Remove a trial, unless it is the last one — a lab always has at least\n * one. */\nexport function closeTrial(trials: TrialRecord[], id: string): TrialRecord[] {\n if (trials.length <= 1) return trials;\n const next = trials.filter((w) => w.id !== id);\n return next.length === trials.length ? trials : next;\n}\n\n/** Return a trial to what it opened on — its instrument's defaults under the\n * seed `addTrial` was given — keeping its id and its place in the list. */\nexport function resetTrial(\n trials: TrialRecord[],\n id: string,\n instruments: InstrumentList,\n): TrialRecord[] {\n const idx = trials.findIndex((w) => w.id === id);\n const current = trials[idx];\n if (!current) return trials;\n const instrument = findInstrument(instruments, current.instrumentName);\n const config = seedConfig(instrument.defaultConfig(), current.configSeed);\n const state = instrument.initialState(config);\n const reset: TrialRecord = {\n ...current,\n config,\n state,\n view: initialView(instrument),\n };\n return [...trials.slice(0, idx), reset, ...trials.slice(idx + 1)];\n}\n\n/**\n * Reorder to match `ids`. Ids the list doesn't mention keep their relative\n * order at the end, and ids it names that no longer exist are dropped — a\n * reorder that raced a close should not resurrect the closed trial.\n */\nexport function reorderTrials(trials: TrialRecord[], ids: readonly string[]): TrialRecord[] {\n const byId = new Map(trials.map((w) => [w.id, w]));\n const named = ids.map((id) => byId.get(id)).filter((w): w is TrialRecord => w !== undefined);\n const seen = new Set(named.map((w) => w.id));\n const rest = trials.filter((w) => !seen.has(w.id));\n return [...named, ...rest];\n}\n","import { useEffect } from 'react';\n\n/** An element's edges, in the same coordinate space as the bound it is tested against. */\nexport interface Edges {\n top: number;\n left: number;\n bottom: number;\n right: number;\n}\n\nexport interface Overshoot<T> {\n item: T;\n /** How far past the bound the item reaches, in px, on whichever axis is worse. */\n by: number;\n axis: 'x' | 'y';\n}\n\n/** The item reaching furthest past the bottom or right of `bound`. On a tie the\n * first item wins, so given document order it names the outermost box. */\nexport function findOvershoot<T>(\n bound: Edges,\n items: Iterable<{ item: T; edges: Edges }>,\n tolerance = 1,\n): Overshoot<T> | null {\n let worst: Overshoot<T> | null = null;\n for (const { item, edges } of items) {\n const y = edges.bottom - bound.bottom;\n const x = edges.right - bound.right;\n const by = Math.max(x, y);\n if (by <= tolerance) continue;\n if (!worst || by > worst.by) worst = { item, by, axis: y >= x ? 'y' : 'x' };\n }\n return worst;\n}\n\nfunction tagAndClasses(el: Element): string {\n return el.tagName.toLowerCase() + [...el.classList].map((c) => `.${c}`).join('');\n}\n\n/** `div.lk-shell-body` — the tag and classes, which is what a reader greps for.\n * A classless element is placed by its nearest classed ancestor. */\nexport function describeElement(el: Element): string {\n if (el.classList.length > 0) return tagAndClasses(el);\n let up = el.parentElement;\n while (up && up.classList.length === 0) up = up.parentElement;\n return up ? `${tagAndClasses(el)} in ${tagAndClasses(up)}` : tagAndClasses(el);\n}\n\nfunction edgesOf(el: Element): Edges {\n const r = el.getBoundingClientRect();\n return { top: r.top, left: r.left, bottom: r.bottom, right: r.right };\n}\n\nfunction* candidates(root: Element): Iterable<{ item: Element; edges: Edges }> {\n yield { item: root, edges: edgesOf(root) };\n for (const el of root.querySelectorAll('*')) yield { item: el, edges: edgesOf(el) };\n}\n\nfunction overflows(el: Element): boolean {\n return el.scrollHeight > el.clientHeight + 1 || el.scrollWidth > el.clientWidth + 1;\n}\n\n/** Why a mounted lab scrolls, or null when it fits. The document only counts\n * when the lab is what reaches past the viewport, so a lab embedded in a long\n * page does not report the page's own scroll. */\nexport function explainLabScroll(lab: Element, shellBody: Element): string | null {\n if (overflows(shellBody)) {\n const r = shellBody.getBoundingClientRect();\n const bound = {\n top: r.top,\n left: r.left,\n bottom: r.top + shellBody.clientHeight,\n right: r.left + shellBody.clientWidth,\n };\n const hit = findOvershoot(bound, candidates(shellBody));\n return hit\n ? `.lk-shell-body scrolls: ${describeElement(hit.item)} reaches ${Math.round(hit.by)}px past it (${hit.axis})`\n : '.lk-shell-body scrolls';\n }\n\n const doc = document.scrollingElement ?? document.documentElement;\n if (!overflows(doc)) return null;\n const r = lab.getBoundingClientRect();\n const bound = {\n top: r.top,\n left: r.left,\n bottom: r.top + Math.min(r.height, doc.clientHeight),\n right: r.left + Math.min(r.width, doc.clientWidth),\n };\n const hit = findOvershoot(bound, candidates(lab));\n return hit\n ? `the page scrolls: ${describeElement(hit.item)} reaches ${Math.round(hit.by)}px past the lab's box (${hit.axis})`\n : null;\n}\n\nconst SETTLE_MS = 300;\n\n/** Dev only: warns once, naming the culprit, when a mounted lab scrolls. */\nexport function useLabFitWarning(labBody: Element | null): void {\n useEffect(() => {\n if (process.env.NODE_ENV === 'production') return;\n if (!labBody || typeof ResizeObserver === 'undefined') return;\n const lab = labBody.closest('.lk-lab');\n const shellBody = labBody.closest('.lk-shell-body');\n if (!lab || !shellBody) return;\n\n // A shrinking window overflows for a frame or two before the workspace\n // re-lays out, so only overflow that outlasts the resize is reported.\n let timer: ReturnType<typeof setTimeout> | undefined;\n const observer = new ResizeObserver(() => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n const why = explainLabScroll(lab, shellBody);\n if (!why) return;\n observer.disconnect();\n console.warn(`[labkit] <Lab> should fit its container without scrolling, but ${why}.`);\n }, SETTLE_MS);\n });\n for (const el of [document.documentElement, lab, shellBody, labBody]) observer.observe(el);\n return () => {\n clearTimeout(timer);\n observer.disconnect();\n };\n }, [labBody]);\n}\n","import { AddIcon, ModeAutoIcon, ModeDarkIcon, ModeLightIcon } from '@weasel-js/ui';\nimport { MenuButton, ToggleBar } from '../passthrough/weasel-ui';\nimport type { LabMode } from '../state/types';\nimport { useLabContext } from './LabContext';\n\n// The glyph is the segment's content and the word is its accessible name, so\n// the bar stays a three-way radiogroup announcing Auto / Light / Dark.\nconst MODES = [\n { value: 'auto' as LabMode, label: 'Auto', glyph: <ModeAutoIcon size={14} /> },\n { value: 'light' as LabMode, label: 'Light', glyph: <ModeLightIcon size={14} /> },\n { value: 'dark' as LabMode, label: 'Dark', glyph: <ModeDarkIcon size={14} /> },\n];\n\nconst MODE_ITEMS = MODES.map(({ value, label, glyph }) => ({\n value,\n label: glyph,\n ariaLabel: label,\n}));\n\n/** The controls `<Lab>` puts in its header: add a trial, and choose the color\n * mode. Both drive `LabContext`, which carried them with no UI at all — so\n * every consumer rebuilt these two. Rendered before a consumer's own header\n * content, which still lands beside them. */\nexport function LabHeader({ addTrial = true }: { addTrial?: boolean }) {\n const lab = useLabContext();\n const only = lab.instruments.length === 1 ? lab.instruments[0] : null;\n\n return (\n <>\n {!addTrial ? null : only ? (\n <button\n type=\"button\"\n className=\"lk-lab-header__add\"\n onClick={() => lab.addTrial(only.name)}\n >\n <AddIcon size={16} />\n <span>Add trial</span>\n </button>\n ) : (\n <MenuButton\n aria-label=\"Add trial\"\n label=\"Add trial…\"\n items={lab.instruments.map((i) => ({ value: i.name, label: i.title ?? i.name }))}\n onAction={(name) => lab.addTrial(name)}\n />\n )}\n\n <ToggleBar\n className=\"lk-lab-header__mode\"\n ariaLabel=\"Color mode\"\n size=\"sm\"\n variant=\"flat\"\n items={MODE_ITEMS}\n value={lab.mode}\n onChange={(next) => {\n if (next) lab.setMode(next);\n }}\n />\n </>\n );\n}\n","import { labContributions, useLabChromeContext } from '../chrome/LabChrome';\nimport type { LabContribution } from '../chrome/labTypes';\nimport { PaletteRegion } from '../chrome/regions/PaletteRegion';\nimport type { TrialTool } from '../tools/types';\n\n/** Props for `<LabPalette>`. */\nexport interface LabPaletteProps {\n /** Tools offered lab-wide. Shorthand for one `palette` contribution each. */\n tools?: readonly TrialTool[];\n /** The lab's contributions; the `palette` ones are laid out here. */\n contributions?: readonly LabContribution[];\n}\n\n/** The lab's tool rail. Writes the lab's tool slot, which every trial whose\n * instrument declares no tools of its own resolves to. Renders nothing when\n * the lab contributes no tool rail. */\nexport function LabPalette({ tools, contributions }: LabPaletteProps) {\n const ctx = useLabChromeContext();\n const all = labContributions(tools, contributions);\n return <PaletteRegion contributions={all.filter((c) => c.region === 'palette')} ctx={ctx} />;\n}\n","import { useCallback, useEffect, useId, useRef, useState } from 'react';\n\n/** One page in a project's set of labs. */\nexport interface LabPage {\n /** The page's own URL, and how the switcher knows which page is open. */\n href: string;\n label: string;\n}\n\n/** Props for `<LabSwitcher>`. */\nexport interface LabSwitcherProps {\n /** The open page's title, shown as the control's own label. */\n title: string;\n pages: readonly LabPage[];\n /** Defaults to the current location. Pass it in tests, or to render a\n * switcher for a page other than the one being viewed. */\n path?: string;\n className?: string;\n}\n\n/** Which of `pages` a path is on, or -1.\n *\n * Matched on the end of the path so a query string, a trailing slash or a\n * leftover `.html` cannot lose it: a project whose dev server maps `/stats`\n * to `stats.html` serves both spellings, and a bookmark from before the URLs\n * lost their extension still resolves to the same page. */\nexport function currentPage(path: string, pages: readonly LabPage[]): number {\n const here = path.split('?')[0]!.split('#')[0]!\n .replace(/\\/$/, '').replace(/\\.html$/, '');\n return pages.findIndex((p) => here.endsWith(p.href.replace(/\\.html$/, '')));\n}\n\n/** A project's lab title, doubling as the way to reach its other labs.\n *\n * The menu holds real anchors, not a `<select>` and not buttons. These are\n * separate documents, so an `href` is what gets middle-click, cmd-click and\n * the back button for free; a select fires a change event and can do none of\n * the three. The trigger is a button because it opens something rather than\n * going anywhere.\n *\n * Pages accumulate -- a project grows a wall, a dashboard, an ingest page, a\n * bench -- and a tab strip is the layout that stops working first. */\nexport function LabSwitcher({ title, pages, path, className }: LabSwitcherProps) {\n const [open, setOpen] = useState(false);\n const root = useRef<HTMLDivElement>(null);\n const menuId = useId();\n const here = currentPage(path ?? (typeof window === 'undefined'\n ? '' : window.location.pathname), pages);\n\n const close = useCallback(() => setOpen(false), []);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n root.current?.querySelector('button')?.focus();\n }\n };\n // Pointer, not click: a press that starts outside should dismiss before\n // whatever it lands on reacts, the way every other menu on the page does.\n const onDown = (e: PointerEvent) => {\n if (!root.current?.contains(e.target as Node)) close();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onDown);\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onDown);\n };\n }, [open, close]);\n\n // One lab is not a set to choose from, and a disclosure arrow promising a\n // menu of itself is worse than no control.\n if (pages.length < 2) {\n return <h1 className={`lk-switcher-title${className ? ` ${className}` : ''}`}>{title}</h1>;\n }\n\n return (\n <div className={`lk-switcher${className ? ` ${className}` : ''}`} ref={root}>\n <h1 className=\"lk-switcher-title\">\n <button\n type=\"button\"\n className=\"lk-switcher-trigger\"\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-controls={open ? menuId : undefined}\n onClick={() => setOpen((was) => !was)}\n >\n {title}\n <span className=\"lk-switcher-caret\" aria-hidden=\"true\" />\n </button>\n </h1>\n {open && (\n <div className=\"lk-switcher-menu\" id={menuId} role=\"menu\">\n {pages.map((page, i) => (\n <a\n key={page.href}\n href={page.href}\n role=\"menuitem\"\n className=\"lk-switcher-item\"\n aria-current={i === here ? 'page' : undefined}\n onClick={close}\n >\n {page.label}\n </a>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { LabMode } from '../state/types';\n\nfunction query(): MediaQueryList | null {\n if (typeof window === 'undefined' || !window.matchMedia) return null;\n return window.matchMedia('(prefers-color-scheme: light)');\n}\n\n/**\n * Resolve a `LabMode` to the mode the theme resolver understands.\n *\n * `auto` is not a mode — it means \"read the OS\", live. An explicit choice\n * opts out of the subscription entirely.\n */\nexport function useResolvedMode(mode: LabMode): 'light' | 'dark' {\n const [system, setSystem] = useState<'light' | 'dark'>(() =>\n query()?.matches ? 'light' : 'dark',\n );\n\n useEffect(() => {\n if (mode !== 'auto') return;\n const mq = query();\n if (!mq) return;\n const onChange = (e: MediaQueryListEvent) => setSystem(e.matches ? 'light' : 'dark');\n mq.addEventListener('change', onChange);\n return () => mq.removeEventListener('change', onChange);\n }, [mode]);\n\n return mode === 'auto' ? system : mode;\n}\n","import { ThemeProvider, useThemeOptional } from '@weasel-js/theme/react';\nimport type { ReactNode } from 'react';\nimport type { LabMode } from '../state/types';\nimport { interstellarTheme } from '../theme/interstellar';\nimport type { LabPage } from './LabSwitcher';\nimport { LabSwitcher } from './LabSwitcher';\nimport { useResolvedMode } from './useSystemMode';\n\n/** Props for `<LabShell>`. */\nexport interface LabShellProps {\n title: string;\n children: ReactNode;\n /** Optional content rendered into the header (e.g., action buttons). */\n header?: ReactNode;\n /** Optional content rendered into the footer. */\n footer?: ReactNode;\n /** Color mode. \"auto\" (default) follows prefers-color-scheme. */\n mode?: LabMode;\n /** The project's other labs. Given two or more, the title becomes the way\n * to reach them; given none, it stays a plain heading. */\n pages?: readonly LabPage[];\n /** The path the switcher reads to mark the open page. Defaults to the\n * current location. */\n path?: string;\n}\n\n/** Page frame for a lab: a titled header, a body, and an optional footer,\n * themed for the resolved color mode. Presentational only — use `<Lab>` when\n * the trial runtime is wanted too. */\nexport function LabShell({ title, children, header, footer, mode = 'auto',\n pages, path }: LabShellProps) {\n const resolved = useResolvedMode(mode);\n const outer = useThemeOptional();\n\n const shell = (\n // Overlays portal here rather than to the themed wrapper above: `.lk-root`\n // carries the element defaults a lab's bare markup is styled by.\n <div className=\"lk-root lk-shell\" data-wzl-portal-host=\"\">\n <header className=\"lk-shell-header\">\n {pages && pages.length > 0\n ? <LabSwitcher title={title} pages={pages} path={path}\n className=\"lk-shell-title\" />\n : <h1 className=\"lk-shell-title\">{title}</h1>}\n {header && <div className=\"lk-shell-header-actions\">{header}</div>}\n </header>\n <main className=\"lk-shell-body\">{children}</main>\n {footer && <footer className=\"lk-shell-footer\">{footer}</footer>}\n </div>\n );\n\n // Inside <Lab> the theme is already applied on `.lk-lab`; wrapping again\n // would only add a div.\n return outer ? (\n shell\n ) : (\n <ThemeProvider theme={interstellarTheme} mode={resolved}>\n {shell}\n </ThemeProvider>\n );\n}\n","import {\n Children,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from 'react';\nimport { asNodeId, createNode, floatingStrategy, gridStrategy, type NodeId, Store } from 'windease';\nimport {\n type ChromeMap,\n Container,\n DragProvider,\n Provider,\n StrategyRegistryProvider,\n} from 'windease/react';\n\nimport { useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { TrialDragContext } from '../trial/TrialDragContext';\nimport { usePanelHosts } from './panelHost';\n\nconst ZONE_ID = asNodeId('lk-workspace');\nconst STRATEGIES = { grid: gridStrategy as never, floating: floatingStrategy as never };\nconst FLOAT_ZONE_ID = asNodeId('lk-workspace-floating');\nconst PANEL_KIND = 'panel';\nconst KIND = 'trial';\n\n/** A tile's persisted extent, keyed by the id its caller gave it. Grid resizes\n * write `span`; `size` is here because a strategy swap would write that. */\nexport type TrialLayout = Record<\n string,\n { size?: { w?: number; h?: number }; span?: { cols?: number; rows?: number } }\n>;\n\nexport interface WorkspaceProps {\n children: ReactNode;\n /**\n * Stable id per child, positionally matched. Supply these whenever a tile\n * can be closed from the middle: without them a tile is identified by its\n * position, so closing one shifts every id after it and the panes inherit\n * each other's dragged extents. `layout` and `reorderable` both key off\n * these, so neither means much without them.\n */\n ids?: readonly string[];\n /** Draggable seams between tiles. Off by default — an even tiling is the\n * behavior every existing caller has. */\n resizable?: boolean;\n /** Let a tile be dragged to a new position. Off by default. The grid never\n * reorders `children` itself: it reports the order a drop would produce and\n * the caller commits it. */\n reorderable?: boolean;\n /** The full id list a drop would produce, in its new order. */\n onReorder?: (ids: string[]) => void;\n /** Extents from a previous session, applied to tiles as they register. */\n layout?: TrialLayout;\n /** Fires when a tile's extent changes. Persist it and hand it back as\n * `layout` to make a resize survive a reload. */\n onLayoutChange?: (layout: TrialLayout) => void;\n gap?: number;\n padding?: number;\n /** Undocked sidebar panels to render alongside the trials. A `'tile'` panel\n * joins the grid as a peer of the trials; a `'floating'` one goes into the\n * floating zone above it. The body is portalled in by the trial that owns\n * it, so all this renders is the frame and the host. */\n panels?: readonly PanelDescriptor[];\n /**\n * Fixed tiling extent. Omit in an app — the grid measures its own box. Supply\n * it where nothing measures, notably jsdom: at a zero measurement the grid\n * renders no tiles at all.\n */\n viewport?: { w: number; h: number };\n}\n\nfunction extentOf(store: Store, id: NodeId): TrialLayout[string] | null {\n const p = store.getNode(id)?.membership?.placement as TrialLayout[string] | undefined;\n if (!p) return null;\n const out: TrialLayout[string] = {};\n if (p.size) out.size = p.size;\n if (p.span) out.span = p.span;\n return Object.keys(out).length > 0 ? out : null;\n}\n\n/**\n * Auto-balanced tiling of trials, `ceil(sqrt(n))` columns wide.\n *\n * Tiles are absolutely positioned at the rects `gridStrategy` computes, not\n * laid out by CSS — `windease/styles.css` (folded into\n * `@weasel-js/labkit/styles.css`) carries the rules that positioning depends on.\n *\n * `panels` are undocked sidebar sections. A `'tile'` panel is registered as a\n * peer of the trials under `PANEL_KIND`, so the grid places and resizes it like\n * one; a `'floating'` panel goes in the overlay above. Either way this renders\n * only the frame and an empty host: the section's content is portalled in by\n * the trial that owns it, which is what keeps a torn-out section inside its\n * trial's React tree instead of rebuilding it as a sibling.\n */\n\n/** The frame an undocked panel gets: a box, and the host element its trial\n * portals into. The title and the dock control come through the portal with\n * the body — the workspace knows a panel's key, not what is in it. */\nfunction PanelFrame({ panel, floating = false }: { panel: PanelDescriptor; floating?: boolean }) {\n const hosts = usePanelHosts();\n return (\n <div className={floating ? 'lk-panel-tile lk-panel-tile--floating' : 'lk-panel-tile'}>\n <div className=\"lk-panel-tile__body\" ref={(el) => hosts?.set(panel.key, el)} />\n </div>\n );\n}\n\n/** One undocked panel, as the workspace needs to know it. */\nexport interface PanelDescriptor {\n /** Stable key; also the portal host key the owning trial writes into. */\n key: string;\n title: string;\n as: 'tile' | 'floating';\n}\n\nexport function Workspace({\n children,\n ids,\n panels,\n resizable = false,\n reorderable = false,\n onReorder,\n layout,\n onLayoutChange,\n gap = 12,\n padding = 0,\n viewport,\n}: WorkspaceProps) {\n const items = Children.toArray(children);\n const tilePanels = useMemo(() => (panels ?? []).filter((p) => p.as === 'tile'), [panels]);\n const floatPanels = useMemo(() => (panels ?? []).filter((p) => p.as === 'floating'), [panels]);\n // Identity has to be stable while the id *contents* are unchanged: the sync\n // effect below keys off it, and a fresh array every render would re-register\n // every tile forever. A ref keyed on the joined ids says that directly, where\n // a `useMemo` on the same key can only say it by suppressing both linters.\n const wantedIds = [\n ...items.map((_, i) => ids?.[i] ?? `lk-ws-${i}`),\n ...tilePanels.map((p) => `lk-panel-${p.key}`),\n ];\n const idKey = wantedIds.join(',');\n const idKeyRef = useRef<string | null>(null);\n const nodeIdsRef = useRef<NodeId[]>([]);\n if (idKeyRef.current !== idKey) {\n idKeyRef.current = idKey;\n nodeIdsRef.current = wantedIds.map(asNodeId);\n }\n const nodeIds = nodeIdsRef.current;\n\n // Held in refs rather than depended on: a fresh object each render would\n // re-run the sync effect, and only a newly registered tile reads `layout`.\n const layoutRef = useRef(layout);\n layoutRef.current = layout;\n const onLayoutChangeRef = useRef(onLayoutChange);\n onLayoutChangeRef.current = onLayoutChange;\n\n // One store for the component's lifetime: a tile's dragged extent lives in\n // its node, so rebuilding the store on every add or close would silently\n // reset every pane.\n const storeRef = useRef<Store | null>(null);\n if (storeRef.current === null) {\n const store = new Store();\n store.registerNode(\n createNode({\n kind: 'zone',\n id: ZONE_ID,\n container: { strategyId: 'grid', config: { resizable, gap, padding } },\n }),\n );\n store.registerNode(\n createNode({\n kind: 'zone',\n id: FLOAT_ZONE_ID,\n container: { strategyId: 'floating', config: {} },\n }),\n );\n storeRef.current = store;\n }\n const store = storeRef.current;\n\n // A tile that only moves reports nothing to a ResizeObserver, and only this\n // component knows the grid moved one. Optional: a lab may own no surface.\n const surface = useSurfaceOptional();\n\n useLayoutEffect(() => {\n store.updateContainerConfig(ZONE_ID, { resizable, gap, padding });\n }, [store, resizable, gap, padding]);\n\n useLayoutEffect(() => {\n const present = new Set(store.getContainerView(ZONE_ID)?.childOrder ?? []);\n const wanted = new Set(nodeIds);\n for (const id of present) {\n if (!wanted.has(id)) store.unregisterNode(id);\n }\n for (const id of nodeIds) {\n if (present.has(id)) continue;\n const kind = String(id).startsWith('lk-panel-') ? PANEL_KIND : KIND;\n store.registerNode(createNode({ kind, id, parentId: ZONE_ID, focus: true }));\n store.showNode(id);\n const saved = layoutRef.current?.[id];\n if (saved) store.patchPlacement(id, saved);\n }\n store.setChildOrder(ZONE_ID, [...nodeIds]);\n }, [store, nodeIds]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: nodeIds is the signal that the tile set changed — a re-tile moves tiles without resizing any — not a value this reads\n useEffect(() => {\n if (!surface) return;\n surface.invalidateRects();\n return store.events.on('node.placementChanged', () => surface.invalidateRects());\n }, [store, surface, nodeIds]);\n\n useEffect(() => {\n if (!onLayoutChange) return;\n return store.events.on('node.placementChanged', () => {\n const next: TrialLayout = {};\n for (const child of store.getChildren(ZONE_ID)) {\n const extent = extentOf(store, child.id);\n if (extent) next[child.id] = extent;\n }\n onLayoutChangeRef.current?.(next);\n });\n }, [store, onLayoutChange]);\n\n const commitOrder = useCallback(\n (nextIds: NodeId[]) => onReorder?.(nextIds.map(String)),\n [onReorder],\n );\n\n const chrome = useMemo<ChromeMap>(() => {\n const byId = new Map<string, ReactNode>(nodeIds.map((id, i) => [id, items[i]]));\n const panelByNode = new Map<string, PanelDescriptor>(\n tilePanels.map((p) => [`lk-panel-${p.key}`, p]),\n );\n return {\n [PANEL_KIND]: ({ node }) => {\n const panel = panelByNode.get(String(node.id));\n if (!panel) return null;\n return <PanelFrame panel={panel} />;\n },\n [KIND]: ({ node }) => {\n const content = byId.get(node.id) ?? null;\n if (!reorderable) return content;\n return (\n // No grip strip: the trial's own title bar is the drag surface.\n <TrialDragContext.Provider value={{ nodeId: node.id }}>\n <div className=\"lk-trial-tile\">{content}</div>\n </TrialDragContext.Provider>\n );\n },\n };\n }, [nodeIds, items, reorderable, tilePanels]);\n\n const floatingLayer =\n floatPanels.length === 0 ? null : (\n <div className=\"lk-workspace__floating\">\n {floatPanels.map((p) => (\n <PanelFrame key={p.key} panel={p} floating />\n ))}\n </div>\n );\n\n const grid = (\n <Container\n parentId={ZONE_ID}\n chrome={chrome}\n className=\"lk-workspace windease-zone\"\n affordances={resizable}\n viewport={viewport}\n onChildOrderChange={reorderable ? commitOrder : undefined}\n />\n );\n\n return (\n <Provider store={store}>\n <StrategyRegistryProvider strategies={STRATEGIES}>\n {floatingLayer ? (\n // The floating layer insets against the workspace, so it needs a\n // positioned box around both. Without one it insets against the page\n // and lands over the lab header.\n <div className=\"lk-workspace-host\">\n {reorderable ? <DragProvider>{grid}</DragProvider> : grid}\n {floatingLayer}\n </div>\n ) : reorderable ? (\n <DragProvider>{grid}</DragProvider>\n ) : (\n grid\n )}\n </StrategyRegistryProvider>\n </Provider>\n );\n}\n","import { ThemeProvider } from '@weasel-js/theme/react';\nimport {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useStore } from 'zustand/react';\nimport { AnnotationPreloadContext } from '../annotations/preload';\nimport { ANNOTATION_TOOLS } from '../annotations/toolMap';\nimport {\n LabFooterRegion,\n LabHeaderRegion,\n LabSidebarRegion,\n labContributions,\n} from '../chrome/LabChrome';\nimport type { LabContribution } from '../chrome/labTypes';\nimport type { TrialContribution } from '../chrome/types';\nimport type { ConfigRule, ControlRenderer } from '../config/types';\nimport type { InstrumentList } from '../instrument/types';\nimport { Split } from '../primitives/Split';\nimport { defaultStorage, noneAdapter } from '../state/adapters';\nimport { LabStoreContext } from '../state/context';\nimport { type OpenedLabStore, openLabStore } from '../state/openLabStore';\nimport { PersistenceContext } from '../state/Persistence';\nimport { createRecordCache } from '../state/records';\nimport { createLabStore, type LabStore } from '../state/store';\nimport type { LabMode, StorageAdapter, TrialRecord } from '../state/types';\nimport { useOpenOnce, useWarnIgnoredChange } from '../state/useOpenOnce';\nimport { usePersistedState } from '../state/usePersistedState';\nimport { SurfaceCanvasContext, SurfaceContext } from '../surface/SurfaceContext';\nimport { useSurfaceCanvas, useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { type SurfaceFrame, useTiledSurface } from '../surface/useTiledSurface';\nimport { interstellarTheme } from '../theme/interstellar';\nimport type { TrialTool } from '../tools/types';\nimport { Trial } from '../trial/Trial';\nimport {\n addTrial as addTrialOp,\n cloneTrial as cloneTrialOp,\n closeTrial as closeTrialOp,\n reorderTrials as reorderTrialsOp,\n resetTrial as resetTrialOp,\n} from '../trial/trialOps';\nimport { useLabFitWarning } from './fitCheck';\nimport { LabContext, type LabContextValue } from './LabContext';\nimport { LabHeader } from './LabHeader';\nimport { LabPalette } from './LabPalette';\nimport { LabShell } from './LabShell';\nimport type { LabPage } from './LabSwitcher';\nimport { createPanelHostRegistry, PanelHostContext } from './panelHost';\nimport { useResolvedMode } from './useSystemMode';\nimport { type PanelDescriptor, type TrialLayout, Workspace } from './Workspace';\n\ninterface LabBaseProps {\n /** May change while mounted. An instrument that is a different object from\n * the last render counts as replaced and its open trials' configs are\n * refilled, so hoist or memoize the list. */\n instruments: InstrumentList;\n defaultInstrument: string;\n mode?: LabMode;\n /** Rendered while a stored lab loads. Default: the lab's empty shell. */\n fallback?: ReactNode;\n /**\n * Optional list of CSS colors used to compose the interstellar theme's\n * cosmic backdrop. Each color becomes one radial-gradient blob on the\n * dark void base. Order maps to a fixed spread of positions; extras wrap\n * around. Ignored unless the resolved mode is dark.\n */\n nebula?: readonly string[];\n title?: string;\n /** The project's other labs. Given two or more, the title becomes the way to\n * reach them — the same switcher `<LabShell>` renders, so a lab reached from\n * one is not a dead end. */\n pages?: readonly LabPage[];\n /** The path the switcher marks as open. Defaults to the current location. */\n path?: string;\n /** Rendered in the shell's footer, below the workspace. */\n footer?: ReactNode;\n /** Contributions added to every trial's chrome, after the instrument's own. */\n chrome?: readonly TrialContribution[];\n /** Contributions to the lab's own chrome — its header bar, its sidebar, its\n * tool rail and its footer — rather than to every trial's. Rendered after\n * `children` and `footer`, which stay the way a lab drops arbitrary content\n * into those same two boxes. Going from no sidebar contributions to some\n * remounts the workspace and every trial, dropping unpersisted trial state. */\n labChrome?: readonly LabContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n /** Offer the header's add-trial control. Default `true`; a lab that opens\n * trials some other way passes `false`. */\n addTrial?: boolean;\n /** Tools offered lab-wide. A trial whose instrument declares none of its own\n * reflects and writes this slot. */\n tools?: readonly TrialTool[];\n /** Rules run over every instrument's config leaves, before labkit's own\n * inference — where a lab states a convention once instead of annotating\n * each field. Memoize or hoist. */\n configRules?: readonly ConfigRule[];\n /** Control overrides and app-defined kinds for every trial's settings panel.\n * Keys are config paths (checked first) or leaf kinds. Memoize or hoist. */\n controls?: Record<string, ControlRenderer>;\n children?: ReactNode;\n}\n\n/** Props for `<Lab>`. With a `storageKey` the lab persists — to IndexedDB\n * unless `storage` names another substrate — and both are read once, at\n * mount. Without one, nothing persists. */\nexport type LabProps = LabBaseProps &\n (\n | { storageKey?: undefined; storage?: undefined }\n | { storageKey: string; storage?: StorageAdapter }\n );\n\ninterface OpenedLab extends OpenedLabStore {\n marks: ReadonlyMap<string, unknown>;\n}\n\nfunction seedDefaultTrial(\n store: LabStore,\n instruments: InstrumentList,\n defaultInstrument: string,\n): void {\n if (store.getState().trials.length > 0) return;\n const record = addTrialOp([], instruments, defaultInstrument)[0];\n if (!record) return;\n const { undoStack: _undoStack, ...rest } = record;\n store.getState().addTrial(rest);\n}\n\n/** A lab with nothing to load renders at once. Its records hold\n * `usePersistedState` values for the session and write nothing. */\nfunction openUnstoredLab({ instruments, defaultInstrument, mode }: LabProps): OpenedLab {\n const store = createLabStore({ initialMode: mode ?? 'auto', instruments });\n seedDefaultTrial(store, instruments, defaultInstrument);\n const records = createRecordCache({ storage: noneAdapter, prefix: '', writable: false });\n return { store, records, close: () => records.close(), marks: new Map() };\n}\n\nasync function openStoredLab(\n { instruments, defaultInstrument, mode }: LabProps,\n storageKey: string,\n storage: StorageAdapter | undefined,\n): Promise<OpenedLab> {\n // The store reads the instruments' serializers and defaults while it is being\n // built, so they go in with it rather than being pushed onto it afterwards.\n const opened = await openLabStore({\n storageKey,\n storage: storage ?? (await defaultStorage()),\n initialMode: mode ?? 'auto',\n instruments,\n });\n seedDefaultTrial(opened.store, instruments, defaultInstrument);\n const marks = new Map<string, unknown>();\n await Promise.all(\n opened.store.getState().trials.map(async (trial) => {\n const kept = instruments.find((i) => i.name === trial.instrumentName)?.annotations?.storage;\n if (!kept) return;\n try {\n marks.set(trial.id, await kept.load());\n } catch (error) {\n console.warn(`[labkit] could not load the marks of trial \"${trial.id}\"`, error);\n marks.set(trial.id, null);\n }\n }),\n );\n return { ...opened, marks };\n}\n\nfunction LabFallback({\n title,\n mode,\n pages,\n path,\n}: Pick<LabBaseProps, 'title' | 'mode' | 'pages' | 'path'>) {\n const resolvedMode = useResolvedMode(mode ?? 'auto');\n return (\n <ThemeProvider theme={interstellarTheme} mode={resolvedMode} className=\"lk-lab\">\n <LabShell\n title={title ?? 'Labkit'}\n mode={mode}\n {...(pages ? { pages } : {})}\n {...(path !== undefined ? { path } : {})}\n >\n {null}\n </LabShell>\n </ThemeProvider>\n );\n}\n\n// Fixed spread of nebula blob positions / sizes / fall-off stops. Colors\n// supplied via the `nebula` prop are slotted into these slots in order;\n// callers passing more than 5 wrap around (intentional — keeps the look\n// readable and bounded).\nconst NEBULA_SLOTS = [\n { cx: '18%', cy: '30%', sx: '60%', sy: '80%', stop: '70%' },\n { cx: '78%', cy: '70%', sx: '55%', sy: '90%', stop: '65%' },\n { cx: '50%', cy: '50%', sx: '50%', sy: '70%', stop: '75%' },\n { cx: '12%', cy: '82%', sx: '50%', sy: '70%', stop: '70%' },\n { cx: '85%', cy: '18%', sx: '55%', sy: '80%', stop: '70%' },\n] as const;\n\nfunction buildNebula(colors: readonly string[]): string {\n const blobs = colors.map((c, i) => {\n const p = NEBULA_SLOTS[i % NEBULA_SLOTS.length];\n return `radial-gradient(ellipse ${p.sx} ${p.sy} at ${p.cx} ${p.cy}, color-mix(in srgb, ${c} 22%, transparent), transparent ${p.stop})`;\n });\n blobs.push('radial-gradient(ellipse at center, #0a0a18 0%, #02020a 100%)');\n return blobs.join(', ');\n}\n\n/** The strip holding the sidebar beside the tool rail and workspace. Its own component\n * because the width is a persisted value, and `LabRuntime` renders the\n * persistence provider it reads from. */\nfunction LabPanes({\n contributions,\n children,\n}: {\n contributions: readonly LabContribution[];\n children: ReactNode;\n}) {\n const surface = useSurfaceOptional();\n const [sidebarWidth, setSidebarWidth] = usePersistedState<number | undefined>(\n 'lk-lab-sidebar-width',\n undefined,\n { scope: 'lab' },\n );\n return (\n <Split\n className=\"lk-lab__panes\"\n sidebarClassName=\"lk-lab__sidebar\"\n contentClassName=\"lk-lab__main\"\n label=\"Lab sidebar\"\n defaultWidth={260}\n width={sidebarWidth}\n onWidthChange={(w) => {\n setSidebarWidth(w);\n surface?.invalidateRects();\n }}\n sidebar={<LabSidebarRegion contributions={contributions} />}\n >\n {children}\n </Split>\n );\n}\n\n/** The lab runtime: opens the store, provides it, and renders one trial\n * per record in a grid. Each trial runs one of `instruments`. */\nexport function Lab(props: LabProps) {\n if (process.env.NODE_ENV !== 'production' && props.instruments.length === 0) {\n throw new Error('[labkit] <Lab> requires a non-empty `instruments` array');\n }\n const { storageKey, storage } = props;\n useWarnIgnoredChange('<Lab>', { storageKey, storage });\n const opened = useOpenOnce<OpenedLab>(() =>\n storageKey === undefined ? openUnstoredLab(props) : openStoredLab(props, storageKey, storage),\n );\n if (!opened) {\n return props.fallback !== undefined ? (\n <>{props.fallback}</>\n ) : (\n <LabFallback title={props.title} mode={props.mode} pages={props.pages} path={props.path} />\n );\n }\n return <LabRuntime {...props} opened={opened} />;\n}\n\nfunction LabRuntime({\n instruments,\n mode,\n nebula,\n title,\n pages,\n path,\n footer,\n chrome,\n labChrome,\n suppress,\n addTrial,\n tools,\n configRules,\n controls,\n children,\n opened,\n}: LabProps & { opened: OpenedLab }) {\n const { store } = opened;\n\n // The store opened against the list <Lab> mounted with; a later list reaches\n // it here, before paint.\n useLayoutEffect(() => {\n store.getState().setInstruments(instruments);\n }, [instruments, store]);\n\n const trials = useStore(store, (s) => s.trials);\n const savedSnapshots = useStore(store, (s) => s.savedSnapshots);\n const modeValue = useStore(store, (s) => s.mode);\n const layout = useStore(store, (s) => s.layout);\n const undockedPanels = useStore(store, (s) => s.undockedPanels);\n\n // One registry for the lab's lifetime: a panel host is a DOM node the\n // workspace owns and the trial portals into, so it must outlive both ends of\n // a dock/undock without being rebuilt.\n const panelHostsRef = useRef<ReturnType<typeof createPanelHostRegistry> | null>(null);\n if (panelHostsRef.current === null) panelHostsRef.current = createPanelHostRegistry();\n\n // One shared drawing surface for the whole lab, anchored to the body — tile\n // rects compose against it, and both buffers compose against the same rects.\n // `Workspace` invalidates rects when the grid moves something a\n // ResizeObserver cannot see. A host that already owns a surface keeps it: a\n // lab embedded in a larger shared-surface app must not open a second GL\n // tenancy, and mounts no buffer of its own.\n const outerSurface = useSurfaceOptional();\n const outerOver = useSurfaceCanvas('over');\n const outerUnder = useSurfaceCanvas('under');\n const [ownOver, setOwnOver] = useState<HTMLCanvasElement | null>(null);\n const [ownUnder, setOwnUnder] = useState<HTMLCanvasElement | null>(null);\n const ownOverRef = useRef<HTMLCanvasElement | null>(null);\n const ownUnderRef = useRef<HTMLCanvasElement | null>(null);\n const bufferRef = useRef({ w: 0, h: 0 });\n const surfaceRef = useRef<ReturnType<typeof useTiledSurface> | null>(null);\n\n // Sizing the buffer clears all of it, so every tile has to repaint — not\n // only the one whose move triggered the measurement. Both buffers are sized\n // together off one comparison: they are the same box, so a tenant of either\n // is looking at the same rects, and one invalidateAll covers both.\n const onFrame = useCallback((frame: SurfaceFrame) => {\n const canvases = [ownUnderRef.current, ownOverRef.current].filter((c) => c !== null);\n if (canvases.length === 0) return;\n const w = Math.round(frame.size.width * frame.dpr);\n const h = Math.round(frame.size.height * frame.dpr);\n if (bufferRef.current.w !== w || bufferRef.current.h !== h) {\n bufferRef.current = { w, h };\n for (const c of canvases) {\n c.width = w;\n c.height = h;\n c.style.width = `${frame.size.width}px`;\n c.style.height = `${frame.size.height}px`;\n }\n surfaceRef.current?.invalidateAll();\n return;\n }\n // A same-size re-tile does not go through here: assigning `width` its own\n // value resizes nothing, so it clears nothing. The tenants clear, through\n // `registerClear`.\n }, []);\n\n const ownSurface = useTiledSurface({ onFrame });\n surfaceRef.current = ownSurface;\n const [labBody, setLabBody] = useState<HTMLDivElement | null>(null);\n const attachOwnSurface = ownSurface.containerRef;\n const labBodyRef = useCallback(\n (el: HTMLDivElement | null) => {\n setLabBody(el);\n if (!outerSurface) attachOwnSurface(el);\n },\n [outerSurface, attachOwnSurface],\n );\n useLabFitWarning(labBody);\n const surface = outerSurface ?? ownSurface;\n const surfaceCanvases = useMemo(\n () =>\n outerSurface ? { over: outerOver, under: outerUnder } : { over: ownOver, under: ownUnder },\n [outerSurface, outerOver, outerUnder, ownOver, ownUnder],\n );\n\n const workspacePanels = useMemo<PanelDescriptor[]>(\n () =>\n Object.entries(undockedPanels).map(([key, panel]) => ({\n key,\n title: panel.sectionId,\n as: panel.as,\n })),\n [undockedPanels],\n );\n const resolvedMode = useResolvedMode(modeValue);\n\n // Tools and lab contributions share one id namespace, so they merge once\n // here — before any region renders — and a collision throws rather than one\n // of them silently losing.\n // Declaring `annotations` on any instrument puts the drawing tools here, in\n // the lab's rail: one tool is armed across every trial.\n const annotates = instruments.some((i) => i.annotations != null);\n const labChromeAll = useMemo(\n () => labContributions([...(annotates ? ANNOTATION_TOOLS : []), ...(tools ?? [])], labChrome),\n [annotates, tools, labChrome],\n );\n const hasFooterChrome = labChromeAll.some((c) => c.region === 'footer');\n const hasSidebarChrome = labChromeAll.some((c) => c.region === 'sidebar');\n\n useEffect(() => {\n if (mode && mode !== store.getState().mode) {\n store.getState().setMode(mode);\n }\n }, [mode, store]);\n\n const contextValue = useMemo<LabContextValue>(() => {\n const replaceTrials = (next: TrialRecord[]): void => {\n const currentById = new Map(store.getState().trials.map((w) => [w.id, w]));\n const merged = next.map((w) => currentById.get(w.id) ?? w);\n store.setState({ trials: merged });\n };\n\n return {\n instruments,\n trials,\n addTrial: (instrumentName, options) => {\n const next = addTrialOp(store.getState().trials, instruments, instrumentName, options);\n replaceTrials(next);\n },\n cloneTrial: (id) => {\n const next = cloneTrialOp(store.getState().trials, id);\n replaceTrials(next);\n },\n closeTrial: (id) => {\n const next = closeTrialOp(store.getState().trials, id);\n replaceTrials(next);\n },\n reorderTrials: (ids) => {\n replaceTrials(reorderTrialsOp(store.getState().trials, ids));\n },\n resetTrial: (id) => {\n const next = resetTrialOp(store.getState().trials, id, instruments);\n const record = next.find((w) => w.id === id);\n if (!record) return;\n store.setState((s) => ({\n trials: s.trials.map((w) =>\n w.id === id\n ? { ...w, config: record.config, state: record.state, view: record.view }\n : w,\n ),\n }));\n },\n savedSnapshots,\n saveSnapshot: (trialId, name) => {\n const taken = store.getState().savedSnapshots.filter((s) => s.trialId === trialId).length;\n store.getState().saveSnapshot(trialId, name ?? `Snapshot ${taken + 1}`);\n },\n loadSnapshot: (trialId, snapshotId) => {\n store.getState().loadSnapshot(snapshotId, trialId);\n },\n deleteSnapshot: (snapshotId) => {\n store.getState().deleteSnapshot(snapshotId);\n },\n mode: modeValue,\n setMode: (m) => {\n store.getState().setMode(m);\n },\n configRules,\n controls,\n };\n }, [instruments, trials, savedSnapshots, modeValue, store, configRules, controls]);\n\n // Only override the backdrop in dark, where there is one to override.\n // Setting a CSS custom property is the sanctioned use of inline style.\n const backdropStyle =\n resolvedMode === 'dark' && nebula && nebula.length > 0\n ? ({ ['--wzl-backdrop' as string]: buildNebula(nebula) } as CSSProperties)\n : undefined;\n\n const workspace = (\n <Workspace\n panels={workspacePanels}\n ids={trials.map((w) => w.id)}\n resizable\n reorderable\n onReorder={(ids) => contextValue.reorderTrials(ids)}\n layout={layout as TrialLayout}\n onLayoutChange={(next) => store.getState().setLayout(next)}\n >\n {trials.map((w) => (\n <Trial key={w.id} id={w.id} chrome={chrome} suppress={suppress} />\n ))}\n </Workspace>\n );\n\n return (\n <LabStoreContext.Provider value={{ store }}>\n <PersistenceContext.Provider value={opened.records}>\n <AnnotationPreloadContext.Provider value={opened.marks}>\n <LabContext.Provider value={contextValue}>\n <ThemeProvider\n theme={interstellarTheme}\n mode={resolvedMode}\n className=\"lk-lab\"\n style={backdropStyle}\n >\n <LabShell\n title={title ?? 'Labkit'}\n mode={modeValue}\n {...(pages ? { pages } : {})}\n {...(path !== undefined ? { path } : {})}\n footer={\n hasFooterChrome ? (\n <>\n {footer}\n <LabFooterRegion contributions={labChromeAll} />\n </>\n ) : (\n footer\n )\n }\n header={\n <>\n <LabHeader {...(addTrial !== undefined ? { addTrial } : {})} />\n {children}\n <LabHeaderRegion contributions={labChromeAll} />\n </>\n }\n >\n <PanelHostContext.Provider value={panelHostsRef.current}>\n <SurfaceContext.Provider value={surface}>\n <SurfaceCanvasContext.Provider value={surfaceCanvases}>\n <div className=\"lk-lab__body\" ref={labBodyRef}>\n {outerSurface ? null : (\n // Two buffers stacked around the trials, both inert —\n // each tile takes input from its own box. A tile's marks\n // annotate the instrument's DOM from over it; an opaque\n // renderer sits under it, so the pane can still hold a\n // label. The under one is first so it paints first.\n <>\n <canvas\n className=\"lk-lab__surface lk-lab__surface--under\"\n ref={(el) => {\n ownUnderRef.current = el;\n setOwnUnder(el);\n }}\n />\n <canvas\n className=\"lk-lab__surface lk-lab__surface--over\"\n ref={(el) => {\n ownOverRef.current = el;\n setOwnOver(el);\n }}\n />\n </>\n )}\n {hasSidebarChrome ? (\n <LabPanes contributions={labChromeAll}>\n <LabPalette contributions={labChromeAll} />\n {workspace}\n </LabPanes>\n ) : (\n <>\n <LabPalette contributions={labChromeAll} />\n {workspace}\n </>\n )}\n </div>\n </SurfaceCanvasContext.Provider>\n </SurfaceContext.Provider>\n </PanelHostContext.Provider>\n </LabShell>\n </ThemeProvider>\n </LabContext.Provider>\n </AnnotationPreloadContext.Provider>\n </PersistenceContext.Provider>\n </LabStoreContext.Provider>\n );\n}\n"]}
|