@weasel-js/labkit 1.6.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_dts/{CanvasStackContext-DQgcH1ny.d.ts → CanvasStackContext-Wo6OwIVM.d.ts} +1 -1
- package/dist/_dts/FloatingPanel-7j0IcXwz.d.ts +30 -0
- package/dist/_dts/{LayerList.d-2c9yup5Y.d.ts → LayerList.d-BoELAMsM.d.ts} +2 -2
- package/dist/_dts/{index-DINmCuLA.d.ts → PropertyField.d-D0ndfIIt.d.ts} +34 -83
- package/dist/_dts/{Select.d-BchGMC2Y.d.ts → Select.d-Cr8-zoup.d.ts} +4 -5
- package/dist/_dts/{usePanZoom-Bq73pwFe.d.ts → Stage-DWBBi8IU.d.ts} +80 -35
- package/dist/_dts/{index-B0--8PEM.d.ts → index-CKyX0ME_.d.ts} +12 -13
- package/dist/_dts/{frac-DTRq7Xpb.d.ts → types-B7yBTTF9.d.ts} +699 -649
- package/dist/_dts/{types-B7y8hX1D.d.ts → types-DTuViBvc.d.ts} +20 -1
- package/dist/_dts/{useTrialState-CP4jfuKl.d.ts → useTrialState-CMaV6UD4.d.ts} +2 -3
- package/dist/canvas/index.d.ts +39 -7
- package/dist/canvas/index.js +5 -3
- package/dist/chrome/index.d.ts +4 -5
- package/dist/chrome/index.js +8 -6
- package/dist/chunk-24W5VEJW.js +18 -0
- package/dist/chunk-24W5VEJW.js.map +1 -0
- package/dist/chunk-3RY6WL5T.js +38 -0
- package/dist/chunk-3RY6WL5T.js.map +1 -0
- package/dist/{chunk-H5VIV7MQ.js → chunk-4TT3PNPR.js} +60 -51
- package/dist/chunk-4TT3PNPR.js.map +1 -0
- package/dist/{chunk-ZORVNOKX.js → chunk-6FLXL3I7.js} +9 -145
- package/dist/chunk-6FLXL3I7.js.map +1 -0
- package/dist/{chunk-HFRE4QQV.js → chunk-ASOK76ZH.js} +53 -22
- package/dist/chunk-ASOK76ZH.js.map +1 -0
- package/dist/chunk-AWQG7FCC.js +19 -0
- package/dist/chunk-AWQG7FCC.js.map +1 -0
- package/dist/chunk-CGHF6RZV.js +300 -0
- package/dist/chunk-CGHF6RZV.js.map +1 -0
- package/dist/chunk-DWMSB4CA.js +228 -0
- package/dist/chunk-DWMSB4CA.js.map +1 -0
- package/dist/{chunk-USO6TERP.js → chunk-GHGO52SO.js} +11 -9
- package/dist/chunk-GHGO52SO.js.map +1 -0
- package/dist/{chunk-MOLIUNVH.js → chunk-HKV7LRHY.js} +4 -4
- package/dist/{chunk-MOLIUNVH.js.map → chunk-HKV7LRHY.js.map} +1 -1
- package/dist/{chunk-VQ47KWD5.js → chunk-IRTGUQ5O.js} +5 -4
- package/dist/chunk-IRTGUQ5O.js.map +1 -0
- package/dist/{chunk-H6ZAOWNE.js → chunk-JVBYV6TL.js} +3 -3
- package/dist/{chunk-H6ZAOWNE.js.map → chunk-JVBYV6TL.js.map} +1 -1
- package/dist/chunk-KHK5FGER.js +145 -0
- package/dist/chunk-KHK5FGER.js.map +1 -0
- package/dist/chunk-NEXR37YJ.js +144 -0
- package/dist/chunk-NEXR37YJ.js.map +1 -0
- package/dist/{chunk-BVL7Y574.js → chunk-O6FFFOHS.js} +14 -6
- package/dist/chunk-O6FFFOHS.js.map +1 -0
- package/dist/chunk-QGMOA2YE.js +731 -0
- package/dist/chunk-QGMOA2YE.js.map +1 -0
- package/dist/{chunk-ERFMC6WU.js → chunk-S4NCI32V.js} +19 -10
- package/dist/chunk-S4NCI32V.js.map +1 -0
- package/dist/{chunk-3FI7Y4R4.js → chunk-SLAQPUI4.js} +4 -4
- package/dist/{chunk-3FI7Y4R4.js.map → chunk-SLAQPUI4.js.map} +1 -1
- package/dist/{chunk-AWH3SRPW.js → chunk-TJ77A4A3.js} +3 -31
- package/dist/chunk-TJ77A4A3.js.map +1 -0
- package/dist/{chunk-WUJXJC5O.js → chunk-TYN6MLXX.js} +691 -1395
- package/dist/chunk-TYN6MLXX.js.map +1 -0
- package/dist/{chunk-RS3HRQWU.js → chunk-WPLAANH4.js} +4 -3
- package/dist/chunk-WPLAANH4.js.map +1 -0
- package/dist/config/index.d.ts +36 -35
- package/dist/config/index.js +4 -5
- package/dist/controls/index.d.ts +91 -7
- package/dist/controls/index.js +5 -4
- package/dist/dragdrop/index.d.ts +8 -6
- package/dist/dragdrop/index.js +3 -2
- package/dist/index.d.ts +50 -77
- package/dist/index.js +138 -254
- package/dist/index.js.map +1 -1
- package/dist/layers/index.d.ts +3 -4
- package/dist/layers/index.js +2 -1
- package/dist/loupe/index.d.ts +19 -16
- package/dist/loupe/index.js +5 -3
- package/dist/overview/index.d.ts +56 -0
- package/dist/overview/index.js +288 -0
- package/dist/overview/index.js.map +1 -0
- package/dist/passthrough/weasel-ui.d.ts +38 -38
- package/dist/passthrough/weasel-ui.js +2 -1
- package/dist/primitives/index.d.ts +19 -43
- package/dist/primitives/index.js +5 -3
- package/dist/state/index.d.ts +7 -7
- package/dist/state/index.js +4 -5
- package/dist/state/index.js.map +1 -1
- package/dist/styles.css +63 -1
- package/dist/undo/index.d.ts +3 -3
- package/package.json +13 -9
- package/src/annotations/index.ts +1 -0
- package/src/annotations/store.test.ts +26 -0
- package/src/annotations/store.ts +25 -6
- package/src/annotations/toolMap.test.ts +37 -2
- package/src/annotations/toolMap.ts +13 -0
- package/src/annotations/types.ts +27 -0
- package/src/canvas/AGENTS.md +8 -10
- package/src/canvas/CameraInput.test.tsx +136 -0
- package/src/canvas/CameraInput.tsx +311 -0
- package/src/canvas/CanvasStack.tsx +42 -58
- package/src/canvas/LinkedCursor.less +16 -0
- package/src/canvas/LinkedCursor.tsx +54 -0
- package/src/canvas/Stage.tsx +42 -37
- package/src/canvas/cameraView.test.ts +60 -0
- package/src/canvas/cameraView.ts +61 -0
- package/src/canvas/index.ts +11 -2
- package/src/chrome/regions/SidebarRegion.test.tsx +9 -2
- package/src/config/builder.ts +3 -3
- package/src/config/entry.test.ts +3 -1
- package/src/config/fromConfigField.ts +1 -0
- package/src/config/index.ts +4 -1
- package/src/config/resolve.ts +11 -1
- package/src/config/sectionTree.test.ts +12 -6
- package/src/config/sectionTree.ts +15 -5
- package/src/config/types.ts +21 -0
- package/src/controls/ControlPanel.test.tsx +12 -2
- package/src/controls/ControlPanel.tsx +28 -9
- package/src/controls/inDialog.test.tsx +18 -0
- package/src/controls/inDialog.tsx +2 -10
- package/src/index.test.ts +1 -1
- package/src/index.ts +8 -4
- package/src/instrument/SineWave.smoke.test.tsx +2 -0
- package/src/instrument/types.ts +10 -1
- package/src/lab/Lab.nebula.test.tsx +11 -2
- package/src/lab/Lab.test.tsx +3 -1
- package/src/lab/Lab.tsx +4 -4
- package/src/loupe/AGENTS.md +7 -6
- package/src/loupe/LoupeGestures.tsx +14 -9
- package/src/loupe/TrialLoupe.tsx +5 -5
- package/src/loupe/index.ts +1 -0
- package/src/loupe/loupeActions.ts +6 -2
- package/src/overview/AGENTS.md +38 -0
- package/src/overview/OverviewMarks.test.tsx +100 -0
- package/src/overview/OverviewMarks.tsx +93 -0
- package/src/overview/TrialOverview.less +53 -0
- package/src/overview/TrialOverview.stories.tsx +50 -0
- package/src/overview/TrialOverview.test.tsx +116 -0
- package/src/overview/TrialOverview.tsx +374 -0
- package/src/overview/index.ts +2 -0
- package/src/passthrough/weasel-ui.ts +7 -0
- package/src/specimen/Specimen.tsx +19 -2
- package/src/state/labRecords.test.ts +4 -1
- package/src/state/store.test.ts +4 -4
- package/src/state/useTrialState.test.tsx +1 -1
- package/src/styles.less +2 -0
- package/src/theme/Interstellar.stories.tsx +1 -5
- package/src/tools/labTool.ts +6 -2
- package/src/trial/Trial.annotations.test.tsx +16 -0
- package/src/trial/Trial.loupe.test.tsx +73 -1
- package/src/trial/Trial.stories.tsx +2 -0
- package/src/trial/Trial.tsx +17 -1
- package/src/trial/trialOps.test.ts +4 -4
- package/dist/_dts/inDialog-D5ZKGjiD.d.ts +0 -23
- package/dist/_dts/number.d-OeQYQoUO.d.ts +0 -28
- package/dist/chunk-2AYGEN57.js +0 -32
- package/dist/chunk-2AYGEN57.js.map +0 -1
- package/dist/chunk-AWH3SRPW.js.map +0 -1
- package/dist/chunk-BVL7Y574.js.map +0 -1
- package/dist/chunk-ERFMC6WU.js.map +0 -1
- package/dist/chunk-H5VIV7MQ.js.map +0 -1
- package/dist/chunk-HFRE4QQV.js.map +0 -1
- package/dist/chunk-RS3HRQWU.js.map +0 -1
- package/dist/chunk-TT5C5S6R.js +0 -368
- package/dist/chunk-TT5C5S6R.js.map +0 -1
- package/dist/chunk-USO6TERP.js.map +0 -1
- package/dist/chunk-VQ47KWD5.js.map +0 -1
- package/dist/chunk-WUJXJC5O.js.map +0 -1
- package/dist/chunk-ZORVNOKX.js.map +0 -1
- package/src/canvas/usePanZoom.test.ts +0 -244
- package/src/canvas/usePanZoom.ts +0 -147
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../ui/src/dlog.ts","../../ui/src/icons/paths.ts","../../ui/src/icons/Icon.tsx","../../ui/src/icons/index.tsx","../../ui/src/components/Keycaps/keyGlyph.ts","../../ui/src/components/ToolPalette/formatShortcut.ts","../../ui/src/overlays/portalHost.tsx","../../ui/src/components/Tooltip/Tooltip.tsx","../../ui/src/components/ActionBar/ActionBar.tsx","../../ui/src/components/stance.ts","../../ui/src/components/Badge/shapes/Pill.tsx","../../ui/src/components/Badge/shapes/Plain.tsx","../../ui/src/components/Badge/shapes/Square.tsx","../../ui/src/components/Badge/shapes/Notched.tsx","../../ui/src/components/Badge/useSvgBox.ts","../../ui/src/components/Badge/shapes/Perforated.tsx","../../ui/src/components/Badge/shapes/Hexagon.tsx","../../ui/src/components/Badge/shapes/Starburst.tsx","../../ui/src/components/Badge/shapes/Scalloped.tsx","../../ui/src/components/Badge/shapes/Shield.tsx","../../ui/src/components/Badge/shapes/Ribbon.tsx","../../ui/src/components/Badge/shapes/Beavis.tsx","../../ui/src/components/Badge/shapes/Sparkler.tsx","../../ui/src/components/Badge/shapes/Postage.tsx","../../ui/src/components/Badge/shapes/Cloud.tsx","../../ui/src/components/Badge/shapes/House.tsx","../../ui/src/components/Badge/shapes/Plaque.tsx","../../ui/src/components/Badge/shapes/Crest.tsx","../../ui/src/components/Badge/shapes/Urn.tsx","../../ui/src/components/Badge/shapes/Coffin.tsx","../../ui/src/components/Badge/shapes/Receipt.tsx","../../ui/src/components/Badge/shapes/Wood.tsx","../../ui/src/components/Badge/shapes/Quatrefoil.tsx","../../ui/src/components/Badge/shapes/index.ts","../../ui/src/components/Badge/bases/ChamferedRect.tsx","../../ui/src/components/Badge/bases/RoundedRect.tsx","../../ui/src/components/Badge/bases/polygonSampler.ts","../../ui/src/components/Badge/bases/Polygon.tsx","../../ui/src/components/Badge/bases/Puzzle.tsx","../../ui/src/components/Badge/bases/Quatrefoil.tsx","../../ui/src/components/Badge/bases/OctantSpline.tsx","../../ui/src/components/Badge/bases/OctantBSpline.tsx","../../ui/src/components/Badge/bases/Ribbon.tsx","../../ui/src/components/Badge/bases/edgeProfiles.ts","../../ui/src/components/Badge/bases/Powerline.tsx","../../ui/src/components/Badge/bases/index.ts","../../ui/src/components/Badge/effects/rangeMask.ts","../../ui/src/components/Badge/effects/Spikes.tsx","../../ui/src/components/Badge/effects/Puffs.tsx","../../ui/src/components/Badge/effects/Bites.tsx","../../ui/src/components/Badge/effects/Scallops.tsx","../../ui/src/components/Badge/effects/Bevel.tsx","../../ui/src/components/Badge/effects/Sheen.tsx","../../ui/src/components/Badge/effects/Rivets.tsx","../../ui/src/components/Badge/effects/Shadow.tsx","../../ui/src/components/Badge/effects/Woodgrain.tsx","../../ui/src/components/Badge/effects/Perforations.tsx","../../ui/src/components/Badge/effects/Bevel2.tsx","../../ui/src/components/Badge/effects/Outline.tsx","../../ui/src/components/Badge/effects/Sunbeams.tsx","../../ui/src/components/Badge/effects/Aqua.tsx","../../ui/src/components/Badge/effects/Metal.tsx","../../ui/src/components/Badge/effects/index.ts","../../ui/src/components/Badge/Badge.tsx","../../ui/src/components/segmentTooltip.tsx","../../ui/src/components/Button/Button.tsx","../../ui/src/interactiveTarget.ts","../../ui/src/useReorderDragList.ts","../../ui/src/components/Disclosure/Disclosure.tsx","../../ui/src/components/DataGrid/DataGrid.tsx","../../ui/src/components/DragGhost/DragGhost.tsx","../../ui/src/components/DragHandleGlyph/DragHandleGlyph.tsx","../../ui/src/components/Keycaps/keySpecsFromMods.ts","../../ui/src/components/Keycaps/Keycap.tsx","../../ui/src/components/Keycaps/Keycaps.tsx","../../ui/src/components/Keycaps/keySpecsFromShortcut.ts","../../ui/src/components/Plot2D/geometry.ts","../../ui/src/components/Plot2D/ticks.ts","../../ui/src/components/Plot2D/Plot2D.tsx","../../ui/src/snap.ts","../../ui/src/components/CurveEditor/hitTest.ts","../../ui/src/handles.ts","../../ui/src/components/CurveEditor/LayeredCurveEditor.tsx","../../ui/src/components/CurveEditor/createKeyframeLayer.tsx","../../ui/src/components/CurveEditor/catmullRom.ts","../../ui/src/components/CurveEditor/monotone.ts","../../ui/src/components/CurveEditor/interpolation.ts","../../ui/src/components/CurveEditor/createFunctionLayer.tsx","../../ui/src/components/CurveEditor/CurveEditor.tsx","../../ui/src/components/Dialog/Dialog.tsx","../../ui/src/format/number.ts","../../ui/src/components/Checkbox/Checkbox.tsx","../../ui/src/components/Field/Field.tsx","../../ui/src/components/Select/Select.tsx","../../ui/src/components/Input/Input.tsx","../../ui/src/components/NumberField/NumberField.tsx","../../ui/src/components/NumberField/UnitField.tsx","../../ui/src/useRovingTabIndex.ts","../../ui/src/components/ToggleBar/ToggleBar.tsx","../../ui/src/components/Slider/Slider.tsx","../../ui/src/components/InlineRange/InlineRange.tsx","../../ui/src/components/ColorField/ColorField.tsx","../../ui/src/paintGradientTrack.tsx","../../ui/src/components/GradientEditor/GradientEditor.tsx","../../ui/src/components/RadioGroup/RadioGroup.tsx","../../ui/src/components/Switch/Switch.tsx","../../font/src/glyphReady.ts","../../font/src/fallback.ts","../../font/src/dynamic/shelfPack.ts","../../font/src/dynamic/distanceTransform.ts","../../font/src/dynamic/glyphRasterizer.ts","../../font/src/dynamic/dynamicAtlas.ts","../../font/src/outline/outlineRegistry.ts","../../font/src/registerFont.ts","../../ui/src/components/FontFamilySelect/FontFamilySelect.tsx","../../ui/src/paintPreview.ts","../../ui/src/components/MeshEditor/MeshEditor.tsx","../../ui/src/components/PatternPicker/PatternPicker.tsx","../../ui/src/components/PaintInput/PaintInput.tsx","../../ui/src/components/PaintField/PaintField.tsx","../../ui/src/components/Properties/PropertyPanel.tsx","../../ui/src/components/Properties/PropertyField.tsx","../../ui/src/components/Properties/CurveField.tsx","../../ui/src/components/Properties/DialogRow.tsx","../../ui/src/components/Properties/PropertyGroup.tsx","../../ui/src/components/Properties/Subpanel.tsx","../../ui/dist/chunks/ItemList.module-BSpCSxan.js","../../ui/src/components/LayerList/LayerList.tsx","../../ui/src/components/ListEditor/ListEditor.tsx","../../ui/src/components/ColorModeControl/ColorModeControl.tsx","../../ui/dist/chunks/segmentedControl.module-Bv7DEg8f.js","../../ui/src/components/OptionsBar/OptionsBar.tsx","../../ui/src/components/ButtonBar/ButtonBar.tsx","../../ui/src/components/paintValue.ts","../../ui/src/components/Prefs/schema.ts","../../ui/src/components/Prefs/prefField.tsx","../../ui/src/components/Powerline/Powerline.tsx","../../ui/src/useScrollSpy.ts","../../ui/src/components/Prefs/PrefsRow.tsx","../../ui/src/components/Prefs/PrefsPane.tsx","../../ui/src/components/Prefs/PrefsRail.tsx","../../ui/src/components/Prefs/PrefsForm.tsx","../../ui/src/components/Prefs/PrefsDialog.tsx","../../ui/src/components/Sidebar/Sidebar.tsx","../../ui/src/components/SidebarPanel/SidebarPanel.tsx","../../ui/src/components/ToolButton/ToolButton.tsx","../../ui/src/components/ToolGroup/ToolGroup.tsx","../../modes/src/capabilities.ts","../../modes/src/modeDefinition.ts","../../modes/src/eligibility.ts","../../ui/src/components/ToolPalette/ToolPalette.tsx","../../ui/src/components/Tabs/Tabs.tsx","../../ui/src/components/MenuButton/MenuButton.tsx","../../ui/src/components/ComboBox/ComboBox.tsx","../../ui/src/components/RangeSlider/RangeSlider.tsx","../../ui/src/components/Callout/Callout.tsx","../../ui/src/components/PointPlotter/PointPlotter.tsx","../../ui/src/components/TokenPanel/color.ts","../../ui/src/components/TokenPanel/tokenTypes.ts","../../ui/src/components/TokenPanel/TokenPanel.tsx","../../ui/src/components/Jog/Jog.tsx","../../ui/src/components/ItemList/ItemList.tsx","../../ui/src/components/SelectionPanel/renderLeaf.tsx","../../ui/src/components/SelectionPanel/model.ts","../../ui/src/components/ToolOptionsBar/ToolOptionsBar.tsx","../../ui/src/components/ResizeHandle/ResizeHandle.tsx","../../ui/src/components/StatusBar/StatusBar.tsx","../../ui/src/components/DetentSlider/DetentSlider.tsx","../../ui/src/components/Toast/queue.ts","../../ui/src/components/Toast/Toast.tsx","../../ui/src/components/BandEditor/scale.ts","../../ui/src/components/BandEditor/bands.ts","../../ui/src/components/BandEditor/BandEditor.tsx","../../ui/src/components/Timeline/easingSpec.ts","../../ui/src/components/Timeline/EasingPicker.tsx","../../ui/src/components/Timeline/timeScale.ts","../../ui/src/components/Timeline/LaneGraph.tsx","../../ui/src/components/Timeline/Lane.tsx","../../ui/src/components/Timeline/Ruler.tsx","../../ui/src/components/Timeline/Transport.tsx","../../ui/src/components/Timeline/lanes.ts","../../ui/src/components/Timeline/keys.ts","../../ui/src/components/Timeline/Timeline.tsx","../../ui/src/color/oklch.ts","../../ui/src/useAsyncOptions.ts"],"names":["KEYS","cached","read","empty","k","v","get","isDebugEnabled","e","c","namespace","dlog","args","ICON_PATHS","ACTION_GLYPHS","ICON_FILLS","isFillable","name","SVG_BASE","markup","markupFor","m","html","t","Icon","i","s","l","u","d","shade","filled","size","fillOpacity","label","CloneIcon","R","p","ResetIcon","CloseIcon","ExportIcon","ZoomInIcon","AddIcon","ModeLightIcon","ModeDarkIcon","ModeAutoIcon","ZoomOutIcon","FitIcon","SnapshotIcon","PlayIcon","PauseIcon","StopIcon","StepBackIcon","StepForwardIcon","LoupeIcon","LockIcon","CollapseIcon","ExpandIcon","WarningIcon","ErrorIcon","keyGlyph","rawKey","formatShortcutParts","b","parts","formatShortcut","HOST_SELECTOR","nearestPortalHost","from","OverlayPortalContext","createContext","useOverlayPortal","anchorEl","setAnchorEl","useState","fromProvider","useContext","resolved","explicit","TooltipTrigger","r","rest","props","n","RACTooltipTrigger","Tooltip","f","h","portalContainer","_Fragment","anchor","RACTooltip","className","portalProps","OverlayArrow","children","EMPTY_LIST","noopSubscribe","resolveIcon","override","item","resolveTitle","shortcut","actionShortcuts","ActionBar","y","x","registry","useActionsRegistry","depReg","useOptionalDepRegistry","items","useSyncExternalStore","a","group","actionItems","cls","orientation","labels","icon","icons","deps","buildDepsFromRequires","evaluateEnabled","disabled","enabled","title","Focusable","useStance","ctx","useTones","stance","tone","color","colorCssAt","Pill","Plain","DEFAULTS","Square","params","notchedPath","rx","ecc","ry","Notched","cfg","variant","o","focused","useSvgBox","box","setBox","useLayoutEffect","el","when","ref","svg","update","ro","PerforatedComponent","maskId","useId","useRef","nH","nV","notches","Perforated","hexVerts","tip","trunc","truncation","ratio","xL","xR","Hexagon","starburstPath","total","points","step","start","rotationDeg","rnd","erosion","pts","outerR","innerR","prev","curr","next","enterX","enterY","exitX","exitY","Starburst","dFocus","Scalloped","ShieldComponent","pd","sh","cpY","cornerCss","rxC","ryC","Shield","Ribbon","Beavis","sparklerPath","rotation","Sparkler","Postage","Cloud","House","ey","peakY","ov","Plaque","crestPath","ti","topInset","pointDepth","Crest","Urn","z","Coffin","hX","sX","fX","hH","sDelta","sH","fH","receiptPath","N","teeth","baseDepth","depth","depthAt","yMid","yEnd","yStart","BASE_TOP","Receipt","top","side","body","Wood","SHAPES","Quatrefoil","ChamferedRect","sx","boxW","sy","boxH","cx","cy","verts","cssLens","cumulative","dx","dy","len","totalCss","sm","segStart","ex","RoundedRect","topCss","sideCss","denom","arcCss","segments","cum","perimeterAt","segIdx","local","seg","ang","pinch","pinchY","bodyPath","perimeterAtFinal","C","samplePts","pt","acc","w","eps","ax","ay","bx","by","tx","ty","tl","polygonSampler","DEFAULT_VERTS","Polygon","OFFSET_RATIO","edgeVertices","type","end","sign","mx","my","outwardX","tabR","outwardY","half","p1","p2","apex","θ1","θ2","θApex","TAU","apexFromStart","endFromStart","sweep","out","arcSamples","θ","Puzzle","TL","TR","BR","BL","smoothMax","g","curveSegment","expA","curvature","bend","expB","quatrefoilVertices","spike","lobe","valley","vAt","sCurv","sBend","sErode","lCurv","lBend","lErode","smooth","rot","t1","t2","extractAnchorPairs","count","sKeys","rKeys","wKeys","pairs","solveCubicSpline","anchors","M","compileSpline","evalCompiled","spline","p0","A","B","liftA","liftB","OctantSpline","HALF_PI","θRel","buildExtendedControls","phantomLeft1","phantomLeft2","phantomRight1","phantomRight2","buildKnots","numCtrl","degree","knots","interior","findSpan","low","high","mid","basisFns","left","right","j","span","saved","temp","compileNurbs","extended","evalNurbsAtU","nurbs","uClamped","sNum","rNum","wSum","ctrl","wn","evalNurbsAtS","lo","hi","iter","sMid","OctantBSpline","sidePoints","mode","xBaseVb","signVb","taperVb","sideInsetCss","taperCss","EDGE_PROFILES","resolveEdge","cap","EDGE_SAMPLES","BASES","\"polygon\"","\"puzzle\"","\"quatrefoil\"","\"ribbon\"","\"powerline\"","xCss","dxCss","dyCss","last","first","closeLen","segLen","lastIdx","leftCap","rightCap","avgLeft","avgRight","maxLeftInward","maxRightInward","shift","leftPad","rangeMask","range","Spikes","mask","halfBase","phaseOffset","phase","sc","ds","pCenter","dirX","dirY","nxAbs","nyAbs","scale","irrMult","kappa","sA","sB","pA","pB","baseLen","comp","lenCss","Puffs","irr","disp","Bites","br","bs","localR","inward","Scallops","sr","ss","sideForNormal","ny","nx","bevelClasses","isTop","lightFrom","isLeft","SAMPLES","Bevel","clipId","sampler","outer","inner","runs","cur","_","pathFor","outerPts","run","innerPts","FACE_COORDS","Sheen","gradId","peak","Rivets","ix","iy","litDx","litDy","positions","Shadow","dxVb","dyVb","osc","seed","Woodgrain","lines","dy1","dy2","knotPositions","Perforations","holes","sCss","SHADE_CLASSES","lightDirFor","rad","angleDeg","Bevel2","lx","ly","bucket","expandedIdxs","Outline","widthVb","Sunbeams","widthMult","opacityMult","angleJitter","nominalWidthVb","gapVb","offsetVb","cursorX","beams","beamWidthVb","x1","x2","halfShear","px","py","ga","cosA","sinA","x1g","y1g","x2g","y2g","gs","ge","stops","BEZEL_SAMPLES","Aqua","bodyGradId","glossGradId","glossClipId","firstSample","lastSample","head","bezelPaths","widthScale","bezelWidthVb","rimWidthVb","equatorLo","equatorHi","equatorBrightColor","baseColor","EFFECTS","spec","equatorWhiteMix","equatorColor","topDarkColor","baseDarkColor","upperBrightMix","lowerBrightMix","upperBrightColor","lowerBrightColor","glossAlpha","bezelAlpha","rimAlpha","chooseElement","Badge","forwardRef","T","E","D","O","styleOverride","P","ee","te","F","_as","ariaLabelProp","ie","ae","domProps","element","tooltipOnPlainBadge","tooltip","ariaLabel","setFocused","setPhase","shapeModule","shape","resolvedShape","ShapeBody","shapeParams","lastCrawlRef","crawlLoop","useVisibleRaf","speed","crawl","now","fe","stanced","shapeComposeSpec","base","resolvedBaseKey","composeBase","resolvedBaseParams","baseParams","resolvedEffects","effects","composeBaseParams","decoRef","insets","style","padding","breakStyle","commonProps","Se","status","onFocus","onBlur","composedSampler","offsetMods","mod","eff","effParams","bloatCss","bloat","warpedXY","I","wA","wB","nxC","nyC","decoEffects","backgroundDecorations","foregroundDecorations","maskDecorations","bodyMaskId","renderDecoration","EffComponent","decoSvg","ue","he","onRemove","removeLabel","badge","segmentTooltipContent","SegmentTooltip","content","TriggerTooltip","Spinner","Button","S","fullWidth","pressed","iconOnly","loading","showLeading","leadingIcon","trailingIcon","CONTROL_SELECTOR","isInControlWithin","target","control","host","IDLE","unlockedSegment","sourceIndex","draggedIdsFor","index","selectedIds","id","it","isNoopDrop","indices","draggedIds","contiguous","targetIndex","useReorderDragList","optsRef","opts","containerRef","dragRef","state","setState","computeTargetIndex","useCallback","sel","rows","raw","row","clientY","refCb","reset","onPointerDownRow","container","mods","child","grab","ghostAt","ev","startThresholdDrag","drop","onPress","swallowNextClick","ids","at","delta","onReorder","swallow","DisclosureMark","open","Disclosure","controls","onToggle","DisclosureRow","twisty","INTERACTIVE","fromControl","hit","DataGrid","sort","setSort","defaultSort","ownExpanded","setOwnExpanded","defaultExpandedIds","expanded","expandedIds","detailIdBase","toggleExpanded","onExpandedChange","sortedRows","useMemo","col","columns","dir","av","bv","cycleSort","columnId","drag","dragEnabled","detailEnabled","renderDetail","colCount","sortable","active","indicator","isDragging","expandable","rowExpandable","isExpanded","detail","detailId","rowCls","onRowClick","rowClassName","Fragment","containsFixed","cs","DragGhost","origin","createPortal","DragHandleGlyph","MOD_BY_PLATFORM","MODIFIER_LABELS","byPlatform","byLegend","detectPlatform","keySpecsFromMods","platform","legend","NAMED_KEY","keySpecFromKey","entry","WIDE_GLYPHS","inferKeycapKind","KeyCap","resolvedStyle","font","inverted","KeySequence","keys","ordered","sepIdx","showSep","separator","keySpecsFromShortcut","key","modelToPlot","xFrac","yFrac","plot","plotToModel","MAX_DECIMALS","niceStep","mag","rough","norm","stepDecimals","tickDecimals","most","values","niceTicks","none","options","pixels","minSpacing","unitsPerPx","decimals","inset","to","formatTick","text","value","TICK_SPACING_PX","TICK_INSET_PX","LABEL_GAP_PX","resolveTicks","settings","gaps","even","set","axis","format","toPlot","Plot2D","svgRef","modelRange","xRange","yRange","plotSize","width","height","clientToPlot","rect","useEffect","useImperativeHandle","handlePointerDown","onPointerDown","model","xTickList","xTicks","yTickList","yTicks","yInside","yLabelsRef","yLabelWidth","setYLabelWidth","yLabelKey","measure","widest","H","live","renderTickLines","list","renderTickLabels","placement","outside","gap","place","grid","divisions","stroke","fractions","axes","snapToNearest","best","bestDist","tolerance","candidates","hitTestAnchor","r2","radius","pointer","d2","hitTestCurve","samples","abx","aby","apx","apy","ab2","handleSize","tokenPx","token","handleHalf","NO_MODIFIERS","readModifiers","LayeredCurveEditor","historyEnabled","layersRef","layers","modelRangeRef","plotSizeRef","plotRef","makeCtx","mr","ps","activeRef","activeLayerId","setActiveLayerId","pastRef","futureRef","snapshot","restore","current","snap","onLayerChange","undo","past","redo","future","onGestureMoveRef","onGestureEndRef","onGestureCancelRef","sessionRef","cleanupGesture","X","findLayerState","q","J","Z","finalState","onLayerCommit","Y","restored","installGesture","startStates","startSelfState","layerId","openPointerSession","down","onSvgPointerDown","modifiers","ls","nativeEvent","coords","preEventSnapshot","prevState","committed","gesture","$","pendingCommit","onSvgKeyDown","renderCtxBase","SAMPLES_PER_SEGMENT","KEY_HIT_PX","HANDLE_HIT_PX","CURVE_HIT_PX","KEY_HALF","HANDLE_RADIUS","SHIFT_MULTIPLIER","HANDLE_STEP","clampTo","bezierOf","moveKeyTo","moved","selectedKey","applyKeyframeDrag","createKeyframeLayer","formatX","snapRadiusPx","easingInto","cubicBezierEasing","resolveEasing","segmentSamples","ease","activeBezier","handlePoints","xf","yf","bezier","path","render","shown","curve","dragIndex","x0","h1","h2","hitTest","keyGesture","perPx","handleGesture","segment","handle","extra","onKeyDown","activate","mult","keyEl","stepX","stepY","segEl","handleEl","knot","alpha","segmentSampleAt","t3","p3","a1x","a1y","a2x","a2y","a3x","a3y","b1x","b1y","b2x","b2y","sampleCatmullRom","reflectStart","reflectEnd","tStart","samplesPerSegment","tangents","ys","avg","hermite","m0","m1","sampleMonotone","xs","startStep","sampleLinear","sampleByInterpolation","ENDPOINT_HALF","LOCKED_HALF","ANCHOR_SNAP_PX","KEY_STEP_FRACTION","formatCoord","clampToModelRange","xLo","xHi","yLo","yHi","isPinnedEndpointAt","endpoints","projectAnchors","all","interpolation","slice","resolveInterpolation","createFunctionLayer","domain","constrain","addPointMode","interactive","curveVisible","plotAnchors","pathD","fillD","closingY","fillParts","pinned","locked","activeIndex","isEndpoint","a11y","node","anchorCls","segs","moveAnchor","xMin","xMax","epsilon","clamped","makeDragGesture","insertIndex","modelPt","nextPoints","onEmptyPointerDown","xSpan","CurveEditor","layer","minPoints","maxPoints","fill","hideNonInteractive","renderAnchor","layerState","setLayerState","layerStateRef","handleLayerChange","nextUnknown","prevPoints","onInput","handleLayerCommit","onChange","prevUnknown","onContextMenu","idxAttr","idx","V","decorations","Dialog","showClose","showCloseButton","onOpenChange","ModalOverlay","RACModal","RACDialog","Heading","close","bodyClassName","footer","MINUS_SIGN","formatNumber","EXPONENTS","formatCompact","parseNumber","units","trimmed","unitSuffixOf","terms","compoundTermsOf","compoundValue","scaleOf","scaled","factor","offset","exponent","names","before","digits","lower","Checkbox","RACCheckbox","isIndeterminate","Field","fieldClasses","isGroup","Select","L","U","G","K","triggerRef","pressRef","nudge","setNudge","NO_NUDGE","RACSelect","onSelectionChange","Label","RACButton","triggerId","SelectValue","isPlaceholder","placeholder","defaultChildren","optionLabels","CheckMark","description","Text","FieldError","errorMessage","RACPopover","popup","AlignOverTrigger","RACListBox","SelectSection","renderOption","CLICK_MS","CLICK_SLOP","EDGE","BELOW","markerRef","passes","trigger","popover","applied","onMeasure","align","toEnd","seat","over","lowest","doc","onUp","press","SelectItem","Children","isValidElement","RACListBoxSection","Header","textValueOf","RACListBoxItem","textValue","Input","textFieldProps","TextField","leadingAdornment","RACInput","trailingAdornment","NumberField","RACNumberField","Group","ghost","hideSteppers","UnitField","draft","setDraft","canceled","clamp","maxValue","minValue","commit","accepts","typed","firstEnabledIndex","lastEnabledIndex","nextEnabledIndex","prevEnabledIndex","useRovingTabIndex","rootRef","tabStopIndex","focusItem","root","itemClassName","nextIndex","onActivate","onNavigate","ToggleBar","isSelected","isMixed","mixed","handleClick","selectedIndex","roving","rootCls","selected","quantize","min","STOP_SNAP_PX","NO_CAPTURE","usableStops","byValue","stop","max","seen","attract","toFraction","bestGap","stepStops","direction","defaultStep","clampOrdered","thumbs","resolveBounds","thumb","fallbackMin","fallbackMax","tuple","defaultReadout","Slider","stopList","strict","trackRef","dragBufferRef","valueToFraction","fractionToValue","valueAt","trackWidth","beginThumbDrag","buf","droppedOff","track","buffer","bLo","bHi","constraint","bandHeight","beginShiftAllDrag","startValues","dxFraction","anchorX","starts","df","dValue","allowedNeg","allowedPos","onThumbPointerDown","onThumbContextMenu","onTrackPointerDown","wantsMove","created","onThumbKeyDown","stepSize","stopDelta","snapTo","renderReadout","slim","density","rootVars","trackHeight","labelMode","lastStop","labeledStops","stopLabelRow","rootClass","isNotched","customRender","InlineRange","shared","ColorField","hex8","toHex8","rgb6","alpha01","getAlpha01","alphaPct","colorDraft","setColorDraft","alphaDraft","setAlphaDraft","visibleRgb","visibleAlphaPct","compose","withAlpha01","rgb","a01","alphaLocked","pct","DEFAULT_HATCH","paintGradientTrack","gradient","baseGradient","activeRange","lowPct","highPct","hatch","stripe","dimColor","dimOverlay","wR","KINDS","SPACES","MIN_STOPS","GradientEditor","space","withStops","applyThumbs","setStopColor","kindSwitch","kind","withGradientKind","sampleGradientStops","spaceSwitch","hex","RadioGroup","RACRadioGroup","Radio","RACRadio","Switch","RACSwitch","unregisteredLabel","resolveFontVariant","family","weight","substituted","FontFamilySelect","baked","listFonts","canvas","listCanvasFonts","available","fontStyle","meshPreview","colors","paint","fade","pos","sampledStops","DEG","paintPreviewCss","MeshEditor","withCorner","asPaint","patchIndex","patch","corner","previewOf","isMeshPaint","isMeshGradientFill","TILES","TILE_SIZES","DEFAULT_TILE_SIZE","PREVIEW_SIZE","specOf","seedPattern","tile","PatternPicker","pick","resize","nextSize","preview","tilePreviewCssUrl","FALLBACK_COLOR","NONE","GRADIENT_KINDS","isGradient","isPattern","kindOf","PaintInput","remembered","entries","listPaintKinds","kinds","allowNone","currentColor","getPaintKind","switchKind","unset","renderBody","Editor","kindLabel","PaintField","DialogTrigger","DENSITY_CLASS","ALIGN_CLASS","propertyMetricClass","PanelNesting","PropertyPanel","nested","attrs","heading","selectable","actions","PropertyList","pack","PropertySpan","PropertyNote","PropertyRow","variantClass","intrinsic","layout","layoutClass","auto","chrome","trailing","readout","onAutoChange","AutoToggle","PropertyRowHelp","tail","toggle","PropertyField","field","nameOf","controlClassName","framed","rowShape","boxedReadout","SliderReadout","SliderTrack","ControlBody","PropertyControl","BooleanControl","NumberInput","StringControl","EnumControl","ColorControl","PaintControl","_exhaustive","Dimmed","on","useCommitListener","latest","onCommit","unitSuffix","unit","known","input","sliderBounds","EditableReadout","formatted","displayValue","fit","useTextEdit","drafting","edit","opt","radio","bare","splitAlpha","eight","inValue","split","colorOut","write","alphaOut","own","alphaChange","alphaInput","withAlpha","BareColor","liveColor","onColorInput","onColorChange","liveAlpha","onAlphaInput","onAlphaChange","alphaRange","CurveField","handleChange","flat","ySnap","handleFlip","flipped","handleFlipVertical","marks","defaults","DialogRow","setOpen","summary","DialogBody","PropertyGroup","bodyId","setOwn","defaultCollapsed","hidden","folds","collapsible","collapsed","onCollapsedChange","folded","titled","leading","Subpanel","moveLayers","move","reorder","moving","kept","siblings","collectCollapsed","isCollapsed","into","anyNested","hasBody","LayerList","toggled","setToggled","collapsedIds","onSelect","lockedIds","bodies","collectBodies","visible","walk","level","rowEls","focusId","setFocusId","pendingFocus","nudgers","tabStop","focusRow","selectRange","go","branch","parentId","palette","onAdd","addKinds","Level","W","setEl","bind","cards","kids","childId","ghosted","Controls","Handle","Grip","Remove","onNudge","onVisibilityChange","ListEditor","inputs","focus","setFocus","insert","remove","addLabel","glyph","ITEMS","ColorModeControl","OptionsBar","ButtonBar","fire","isPaint","prefDisplayBounds","toDisplay","prefUnitAccepts","isPrefLeaf","prefValueAtPath","visiblePrefSubtree","showHidden","countPrefLeaves","prefRailItems","loose","subKey","sub","prefLeafMatches","pref","query","filterPrefSubtree","prefFieldProps","leaf","setValue","isBuiltinToolPref","glyphOf","stored","bounds","encoding","option","Powerline","leftEdge","startCap","rightEdge","pickActiveSection","offsets","slack","SETTLE_MS","useScrollSpy","setActive","heldRef","timerRef","releaseRef","rootTop","scrollTo","release","prefersReducedMotion","PrefRow","renderCtx","custom","renderBuiltin","ObjectLeaf","held","objectRows","PrefsPane","leaves","groups","childPath","scrollRef","PaneSection","PrefsRail","onOpen","onScrollTo","section","header","inView","showCounts","PrefsForm","setQuery","schema","filterable","RailLayout","NoMatches","GroupBody","uncontrolled","setUncontrolled","requested","spy","paneGroup","filterField","onClearFilter","rootName","cursor","onClear","PrefsDialog","form","rail","dialogClassName","headerExtra","Sidebar","SidebarPanel","headerInteractive","onToggleCollapse","onHide","ToolButton","resolvedTitle","tabbable","ariaDisabled","ToolGroup","groupKey","DEFAULT_GROUP_ORDER","MISC","partitionByGroup","tool","orderedGroupKeys","groupOrder","rawIcon","UnknownIcon","ToolPalette","tools","groupKeys","eligibility","eligibleContribution","modeRegistry","lookupShortcut","modeName","Tabs","RACTabs","TabList","RACTabList","Tab","RACTab","TabPanel","RACTabPanel","MenuButton","MenuTrigger","isDisabled","RACMenu","onAction","RACMenuItem","admitEverything","ComboBox","RACComboBox","filter","ComboBoxFrame","loadError","emptyLabel","errorLabel","ComboBoxItem","ComboBoxStateContext","isLoading","onCommitText","RangeSlider","wantOutput","showOutput","RACSlider","SliderOutput","formatOutput","fillStart","fillEnd","SliderThumb","Callout","ariaLabelledby","anchorRef","portalAnchor","modal","onDismissRef","onDismiss","escapeListener","listeningTo","dialogRef","titleId","hasAnchorRect","anchorRect","popoverAriaLabelledby","popoverAriaLabel","shouldCloseOnInteractOutside","PointPlotter","curveProps","HEX","RGB","COLOR_FUNCTION","KEYWORDS","browserSupports","parsesAsColor","supports","hexOf","serialized","onBlack","toHex","direct","browser","round2","refitScale","amounts","spans","TOKEN_CATEGORIES","TYPE_SCALE","tokenCategory","AMOUNT","DIMENSION","DURATION","NUMBER","LENGTH","BEZIER","GRADIENT","LAYERS","PARTS","isShadow","lengths","part","inferTokenType","splitUnit","match","bezierPoints","y1","y2","WEIGHTS","NUMBER_FORMAT","SCALAR","familyKindOf","itemsOf","counts","tokens","families","familySize","stepLabels","Curve","bottom","TokenControl","amount","event","TokenRow","memo","Family","picked","setPicked","ScaleStep","showUnit","onFactorChange","RULES","ScaleRuleControls","param","rule","onScaleChange","Scale","overridden","generator","Section","scales","TokenPanel","ownCollapsed","setOwnCollapsed","closed","byCategory","sections","category","categorize","inSection","Jog","spoken","onStep","playing","onPlay","jsx","onScrub","pad","caption","ROLES","ItemList","selection","setContainer","setRefs","targets","extending","stopId","containerProps","ranges","onSelectRange","moveTo","extend","onTarget","controlCell","modsOf","onClick","targetRef","roles","overlay","tabIndex","dropSide","dropIndex","isFlagCell","cell","renderers","renderCells","cells","FlagBar","settledOnly","selectionKey","allGrouped","rowsOf","isRow","pending","flush","block","labeled","indent","childCtx","_dropped","rendered","pairRows","pair","ToolOptionsBar","barRows","BarRow","collect","prefix","barCell","panelLeaf","needsLabel","settle","snapped","ResizeHandle","session","finish","vertical","axisOf","grow","shrink","invert","settled","StatusBar","StatusBarItem","muted","StatusBarSpacer","normalize","resolveIndex","exact","plainText","fallback","DetentSlider","lastIndex","labelOf","formatLabel","liveRef","changedRef","handleInput","handleCommit","DEFAULT_TTL_MS","activeToastTransitions","viewTransitionWrapUpdate","reduceMotion","vt","flushSync","fn","RAC_QUEUES","ToastQueue","UNSTABLE_ToastQueue","rac","existing","racOptions","ttlMs","createToastQueue","racQueueOf","queue","defaultToastQueue","tonedAdd","placementClass","toneClass","ToastRegion","RACToastRegion","RACToast","RACToastContent","clamp01","linearScale","logScale","warnedNonPositiveMin","isDev","resolveScale","normalizeBands","bands","bandBounds","seamBounds","clampSeamTo","setSeam","unitEdges","edges","clampBandShift","isFirst","isLast","moveBandEdges","splitBands","makeData","mergeBand","KEY_STEP","keepData","isTextEntry","tag","BandEditor","splitBand","labelId","toUnit","fromUnit","unitAt","clientX","altKey","ticks","tick","onEnd","onSeamPointerDown","onSeamKeyDown","onBandPointerDown","startUnit","onBandFocus","renderBand","band","easingBezier","easingLabel","EASINGS","sampleEasing","EASING_NAMES","PREVIEW_SAMPLES","BEZIER_OF","DEFAULT_BEZIER","EasingPicker","named","selectValue","MIN_SPAN_MS","createTimeScale","window","perMs","widthPx","ms","toPercent","spanFraction","spanPercent","clampWindow","zoomWindow","maxSpan","nextSpan","frac","atMs","panWindow","byMs","tickTimes","minSpacingPx","V_INSET_PCT","KEY_STEP_MS","valueRange","LaneGraph","win","hostRef","setSize","snapTimes","selectedSegment","setLive","stateRef","onSelectSegment","onKeysInput","rawPrev","onKeysCommit","entryTimes","Lane","setDrag","msAt","snapPxToMs","graph","sampledKeys","onKeyPointerDown","times","onKeyInput","onKeyCommit","onToggleExpand","onInsert","ZOOM_STEP","formatMs","Ruler","setWidth","widthOf","onWheel","playhead","RATES","seconds","Transport","looping","loop","rates","rate","paused","onPause","onLoopChange","onRateChange","duration","isNumeric","buildLanes","nextPath","tracks","trackAtPath","found","samePath","withKeys","withEvents","replaceAtPath","parent","tt","moveKey","toMs","st","keyIndex","et","events","insertKey","trackPath","sampleTrack","deleteKey","setKeyEasing","_drop","easing","setKeys","setKeyValue","Timeline","setExpanded","ownWindow","setOwnWindow","ownSelection","setOwnSelection","segmentSelection","setSegmentSelection","setWindow","setSelection","onRootKeyDown","selectedTrack","segmentTrack","segmentKey","renderKeyEditor","oklchToHex","oklchDegToHex","chromaAt","useAsyncOptions","inputValue","setInputValue","setOptions","setIsLoading","setLoadError","loadRef","load","issued","inFlight","minLength","timer","mine","controller","error","debounceMs"],"mappings":";;;;;;;;;;;;AA4BA,IAAMA,CAAAA,GAAO,CAAC,cAAA,EAAgB,kBAAkB,CAAA;AAAhD,IAOIC,CAAAA,GAAwB,IAAA;AAE5B,SAASC,CAAAA,GAAe;AACtB,EAAA,IAAMC,GAAAA,GAAgB;IAAE,GAAA,EAAK,KAAA;AAAO,IAAA,GAAA,sBAAS,GAAA;AAAM,GAAA;AACnD,EAAA,IAAI,OAAO,YAAA,GAAiB,GAAA,EAAa,OAAOA,GAAAA;AAChD,EAAA,IAAI;AACF,IAAA,KAAA,IAAWC,OAAKJ,CAAAA,EAAM;AACpB,MAAA,IAAMK,GAAAA,GAAI,YAAA,CAAa,OAAA,CAAQD,GAAC,CAAA;AAChC,MAAA,IAAIC,GAAAA,IAAK,IAAA,IAAQA,GAAAA,KAAM,EAAA,EAEvB,OADIA,QAAM,GAAA,IAAOA,GAAAA,KAAM,MAAA,IAAUA,GAAAA,KAAM,GAAA,GAAY;QAAE,GAAA,EAAK,IAAA;AAAM,QAAA,GAAA,sBAAS,GAAA;OAAM,GACxE;QAAE,GAAA,EAAK,KAAA;QAAO,GAAA,EAAK,IAAI,IAAIA,GAAAA,CAAE,KAAA,CAAM,QAAQ,CAAA,CAAE,MAAA,CAAO,OAAO,CAAC;AAAE,OAAA;AACvE,IAAA;AACA,IAAA,OAAOF,GAAAA;EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAOA,GAAAA;AACT,EAAA;AACF;AAEA,SAASG,CAAAA,GAAc;AAErB,EAAA,OADIL,CAAAA,KAAW,IAAA,KAAM,CAAA,GAASC,CAAAA,EAAK,CAAA,EAC5BD,CAAAA;AACT;AAGA,SAAgBM,EAAeC,GAAAA,EAA4B;AACzD,EAAA,IAAMC,MAAIH,CAAAA,EAAI;AACd,EAAA,OAAOG,GAAAA,CAAE,GAAA,IAAOA,GAAAA,CAAE,GAAA,CAAI,IAAIC,GAAS,CAAA;AACrC;AAIA,SAAgBC,CAAAA,CAAKH,QAAsBI,GAAAA,EAAuB;AAC3DL,EAAAA,CAAAA,CAAeG,GAAS,KAE7B,OAAA,CAAQ,KAAA,CAAM,IAAIA,GAAAA,CAAAA,CAAAA,CAAAA,EAAc,GAAGE,GAAI,CAAA;AACzC;ACjEA,IAAaC,EAAAA,GAAa;EAGxB,KAAA,EAAO,kOAAA;EACP,KAAA,EAAO,8FAAA;EACP,KAAA,EAAO,sEAAA;EACP,MAAA,EAAQ,mLAAA;EACR,MAAA,EAAQ,mGAAA;EACR,OAAA,EAAS,yFAAA;EACT,GAAA,EAAK,uPAAA;EACL,GAAA,EAAK,iOAAA;EAGL,MAAA,EAAQ,oDAAA;EACR,GAAA,EAAK,sCAAA;EACL,MAAA,EAAQ,0BAAA;AACR,EAAA,MAAA,EAAQC,aAAAA,CAAc,MAAA;EACtB,IAAA,EAAM,uHAAA;AACN,EAAA,IAAA,EAAMA,aAAAA,CAAc,IAAA;AACpB,EAAA,IAAA,EAAMA,aAAAA,CAAc,IAAA;EACpB,QAAA,EAAU,kLAAA;EAGV,IAAA,EAAM,mGAAA;EACN,MAAA,EAAQ,iDAAA;EACR,SAAA,EAAW,kEAAA;EACX,aAAA,EAAe,sMAAA;EACf,QAAA,EAAU,uEAAA;EACV,WAAA,EAAa,qHAAA;EACb,SAAA,EAAW,sHAAA;EACX,IAAA,EAAM,uFAAA;EAGN,IAAA,EAAM,wCAAA;EACN,KAAA,EAAO,uCAAA;EACP,IAAA,EAAM,2DAAA;EACN,QAAA,EAAU,+DAAA;EACV,WAAA,EAAa,+DAAA;EAGb,IAAA,EAAM,oGAAA;EACN,MAAA,EAAQ,kGAAA;EACR,OAAA,EAAS,0HAAA;EACT,MAAA,EAAQ,wJAAA;EACR,GAAA,EAAK,6FAAA;EACL,IAAA,EAAM,6EAAA;EACN,OAAA,EAAS,+EAAA;EACT,KAAA,EAAO,iFAAA;EACP,IAAA,EAAM,0CAAA;EACN,KAAA,EAAO,+CAAA;EACP,SAAA,EAAW,mMAAA;EACX,QAAA,EAAU,2EAAA;EACV,QAAA,EAAU,4EAAA;EAGV,SAAA,EAAW,6FAAA;EACX,UAAA,EAAY,iGAAA;EACZ,OAAA,EAAS,2OAAA;EACT,MAAA,EAAQ,mEAAA;EACR,KAAA,EAAO,iKAAA;EACP,MAAA,EAAQ,2JAAA;EACR,IAAA,EAAM,4EAAA;EACN,IAAA,EAAM,kKAAA;EACN,QAAA,EAAU,yEAAA;EACV,MAAA,EAAQ,yEAAA;EACR,OAAA,EAAS,yCAAA;EACT,IAAA,EAAM,uKAAA;EACN,IAAA,EAAM,gJAAA;EACN,IAAA,EAAM,6IAAA;EACN,OAAA,EAAS,0HAAA;EACT,SAAA,EAAW,oQAAA;EACX,OAAA,EAAS,4LAAA;EAGT,WAAA,EAAa,kIAAA;EACb,SAAA,EAAW,mFAAA;EACX,UAAA,EAAY,sFAAA;EACZ,WAAA,EAAa,mCAAA;EACb,OAAA,EAAS,oHAAA;EACT,QAAA,EAAU,yMAAA;EACV,SAAA,EAAW,iMAAA;EACX,SAAA,EAAW,sEAAA;EACX,SAAA,EAAW,sFAAA;EACX,SAAA,EAAW,yEAAA;EACX,UAAA,EAAY,mGAAA;EACZ,WAAA,EAAa,0KAAA;EACb,UAAA,EAAY,oIAAA;EACZ,SAAA,EAAW,6DAAA;EACX,UAAA,EAAY,oFAAA;EACZ,UAAA,EAAY,sFAAA;EACZ,UAAA,EAAY,wFAAA;EACZ,UAAA,EAAY,wFAAA;EACZ,WAAA,EAAa,+VAAA;EACb,WAAA,EAAa,6gBAAA;EACb,UAAA,EAAY,0WAAA;EACZ,SAAA,EAAW,2jBAAA;EACX,YAAA,EAAc,g0BAAA;EACd,SAAA,EAAW,gJAAA;EAGX,UAAA,EAAY,iRAAA;EACZ,aAAA,EAAe,iRAAA;EACf,UAAA,EAAY,yyBAAA;EAGZ,WAAA,EAAa,0BAAA;EACb,WAAA,EAAa,mCAAA;EACb,SAAA,EAAW,2CAAA;EACX,OAAA,EAAS,6HAAA;EACT,OAAA,EAAS,iIAAA;EACT,UAAA,EAAY,4EAAA;EACZ,OAAA,EAAS,0MAAA;EACT,UAAA,EAAY,0CAAA;EACZ,MAAA,EAAQ,iDAAA;EACR,OAAA,EAAS,iDAAA;EACT,WAAA,EAAa,2CAAA;EACb,SAAA,EAAW,sDAAA;EACX,WAAA,EAAa,wCAAA;EACb,QAAA,EAAU,+FAAA;EACV,SAAA,EAAW,mEAAA;EACX,SAAA,EAAW,0OAAA;EACX,MAAA,EAAQ,uDAAA;EACR,OAAA,EAAS,uDAAA;EAGT,SAAA,EAAW,6BAAA;EACX,aAAA,EAAe,4CAAA;EACf,WAAA,EAAa,iDAAA;EACb,YAAA,EAAc,gDAAA;EACd,cAAA,EAAgB,uNAAA;EAChB,kBAAA,EAAoB,iaAAA;EACpB,UAAA,EAAY,qNAAA;EACZ,YAAA,EAAc,0RAAA;EACd,SAAA,EAAW,qNAAA;EACX,eAAA,EAAiB,uRAAA;EACjB,QAAA,EAAU,0CAAA;EACV,SAAA,EAAW,kEAAA;EACX,gBAAA,EAAkB,iOAAA;EAClB,cAAA,EAAgB,yRAAA;EAChB,UAAA,EAAY,8NAAA;EACZ,YAAA,EAAc,uNAAA;EACd,aAAA,EAAe,0NAAA;EACf,SAAA,EAAW,2CAAA;EACX,SAAA,EAAW,mDAAA;EACX,aAAA,EAAe,mRAAA;EACf,aAAA,EAAe,sNAAA;EACf,YAAA,EAAc,+RAAA;EACd,gBAAA,EAAkB,iOAAA;EAClB,SAAA,EAAW,sJAAA;EACX,WAAA,EAAa,qJAAA;EACb,WAAA,EAAa,yRAAA;EACb,iBAAA,EAAmB,uDAAA;EACnB,eAAA,EAAiB,wEAAA;EACjB,aAAA,EAAe,oDAAA;EACf,UAAA,EAAY,6HAAA;EACZ,eAAA,EAAiB,mKAAA;EACjB,WAAA,EAAa,oeAAA;EACb,UAAA,EAAY,6pBAAA;EACZ,SAAA,EAAW,2yBAAA;EACX,aAAA,EAAe,4RAAA;EACf,YAAA,EAAc,sdAAA;EACd,WAAA,EAAa,yVAAA;EACb,eAAA,EAAiB,iWAAA;EACjB,UAAA,EAAY,yNAAA;EACZ,YAAA,EAAc,uFAAA;EACd,SAAA,EAAW,8hBAAA;EACX,YAAA,EAAc,gEAAA;EACd,WAAA,EAAa,6NAAA;EACb,YAAA,EAAc,iNAAA;EACd,cAAA,EAAgB,qRAAA;EAChB,cAAA,EAAgB,2QAAA;EAChB,WAAA,EAAa,oJAAA;EACb,YAAA,EAAc,0gBAAA;EACd,eAAA,EAAiB,0lBAAA;EACjB,aAAA,EAAe,s3BAAA;EACf,YAAA,EAAc,qpBAAA;EACd,SAAA,EAAW,4iDAAA;EACX,WAAA,EAAa,qmBAAA;EACb,cAAA,EAAgB,06BAAA;EAChB,YAAA,EAAc,8ZAAA;EACd,iBAAA,EAAmB,yxCAAA;EACnB,YAAA,EAAc,0zBAAA;EACd,cAAA,EAAgB,6iBAAA;EAChB,WAAA,EAAa,m6BAAA;EACb,aAAA,EAAe,ymBAAA;EACf,YAAA,EAAc,+VAAA;EACd,cAAA,EAAgB,0mBAAA;EAGhB,aAAA,EAAe,oEAAA;EACf,kBAAA,EAAoB,kEAAA;EACpB,WAAA,EAAa,2EAAA;EACb,cAAA,EAAgB,+EAAA;EAChB,YAAA,EAAc,qEAAA;EACd,kBAAA,EAAoB,iFAAA;EACpB,cAAA,EAAgB,iFAAA;EAChB,SAAA,EAAW,2EAAA;EACX,aAAA,EAAe,yFAAA;EACf,YAAA,EAAc,8FAAA;EACd,gBAAA,EAAkB,8FAAA;EAClB,aAAA,EAAe,gHAAA;EACf,YAAA,EAAc,uHAAA;EACd,YAAA,EAAc,8IAAA;EACd,cAAA,EAAgB,qJAAA;EAChB,UAAA,EAAY,mKAAA;EACZ,WAAA,EAAa,iGAAA;EACb,YAAA,EAAc,+FAAA;EACd,SAAA,EAAW,0IAAA;EACX,UAAA,EAAY,iHAAA;EACZ,UAAA,EAAY,2JAAA;EACZ,UAAA,EAAY,yMAAA;EACZ,cAAA,EAAgB,yFAAA;EAChB,WAAA,EAAa,iEAAA;EACb,YAAA,EAAc,mEAAA;EACd,eAAA,EAAiB,gDAAA;EACjB,YAAA,EAAc,sDAAA;EACd,YAAA,EAAc,0FAAA;EACd,kBAAA,EAAoB,mHAAA;EACpB,SAAA,EAAW,2HAAA;EACX,aAAA,EAAe,sEAAA;EACf,SAAA,EAAW,qEAAA;EACX,WAAA,EAAa,2DAAA;EACb,YAAA,EAAc,oDAAA;EACd,SAAA,EAAW,sDAAA;EACX,aAAA,EAAe,2DAAA;EACf,QAAA,EAAU,gJAAA;EACV,UAAA,EAAY,qsBAAA;EACZ,UAAA,EAAY,kFAAA;EAGZ,EAAA,EAAI,8IAAA;EACJ,EAAA,EAAI,2LAAA;EACJ,EAAA,EAAI,yMAAA;EACJ,GAAA,EAAK,uYAAA;EACL,GAAA,EAAK;AACP;AA3OA,IAoPaC,EAAAA,GAAa;EACxB,WAAA,EAAa,qGAAA;EACb,WAAA,EAAa,oHAAA;EACb,SAAA,EAAW,4HAAA;EACX,OAAA,EAAS,6MAAA;EACT,OAAA,EAAS,kNAAA;EACT,UAAA,EAAY,yJAAA;EACZ,OAAA,EAAS,2RAAA;EACT,UAAA,EAAY,2HAAA;EACZ,MAAA,EAAQ,gIAAA;EACR,OAAA,EAAS,gIAAA;EACT,WAAA,EAAa,yHAAA;EACb,SAAA,EAAW,kIAAA;EACX,WAAA,EAAa,wHAAA;EACb,QAAA,EAAU,0KAAA;EACV,SAAA,EAAW,iJAAA;EACX,SAAA,EAAW,0TAAA;EACX,MAAA,EAAQ,qLAAA;EACR,OAAA,EAAS,wIAAA;EACT,SAAA,EAAW,8GAAA;EACX,aAAA,EAAe,6HAAA;EACf,WAAA,EAAa,kIAAA;EACb,YAAA,EAAc,iIAAA;EACd,cAAA,EAAgB,sSAAA;EAChB,UAAA,EAAY,qSAAA;EACZ,YAAA,EAAc,2WAAA;EACd,SAAA,EAAW,qSAAA;EACX,eAAA,EAAiB,uWAAA;EACjB,QAAA,EAAU,yHAAA;EACV,SAAA,EAAW,mJAAA;EACX,gBAAA,EAAkB,iTAAA;EAClB,cAAA,EAAgB,yWAAA;EAChB,UAAA,EAAY,8SAAA;EACZ,YAAA,EAAc,sSAAA;EACd,aAAA,EAAe,ySAAA;EACf,SAAA,EAAW,2HAAA;EACX,SAAA,EAAW,mIAAA;EACX,aAAA,EAAe,mWAAA;EACf,aAAA,EAAe,qSAAA;EACf,YAAA,EAAc,8WAAA;EACd,gBAAA,EAAkB,iTAAA;EAClB,SAAA,EAAW,sOAAA;EACX,WAAA,EAAa,oOAAA;EACb,WAAA,EAAa,yWAAA;EACb,iBAAA,EAAmB,wIAAA;EACnB,eAAA,EAAiB,oJAAA;EACjB,aAAA,EAAe,oIAAA;EACf,UAAA,EAAY,8MAAA;EACZ,eAAA,EAAiB,oPAAA;EACjB,WAAA,EAAa,ojBAAA;EACb,aAAA,EAAe,6WAAA;EACf,YAAA,EAAc,uiBAAA;EACd,WAAA,EAAa,yaAAA;EACb,eAAA,EAAiB,kbAAA;EACjB,UAAA,EAAY,ySAAA;EACZ,YAAA,EAAc,oKAAA;EACd,SAAA,EAAW,+mBAAA;EACX,YAAA,EAAc,iJAAA;EACd,WAAA,EAAa,6SAAA;EACb,YAAA,EAAc,gSAAA;EACd,cAAA,EAAgB,qWAAA;EAChB,cAAA,EAAgB,2VAAA;EAChB,WAAA,EAAa,oXAAA;EACb,YAAA,EAAc,0lBAAA;EACd,eAAA,EAAiB,4nBAAA;EACjB,aAAA,EAAe,w5BAAA;EACf,YAAA,EAAc,urBAAA;EACd,SAAA,EAAW,kmDAAA;EACX,cAAA,EAAgB,g+BAAA;EAChB,YAAA,EAAc,+eAAA;EACd,iBAAA,EAAmB,2zCAAA;EACnB,YAAA,EAAc,+aAAA;EACd,aAAA,EAAe,8EAAA;EACf,kBAAA,EAAoB,4EAAA;EACpB,WAAA,EAAa,qFAAA;EACb,cAAA,EAAgB,yFAAA;EAChB,YAAA,EAAc,+EAAA;EACd,kBAAA,EAAoB,2FAAA;EACpB,cAAA,EAAgB,2FAAA;EAChB,SAAA,EAAW,qFAAA;EACX,aAAA,EAAe,mGAAA;EACf,YAAA,EAAc,wGAAA;EACd,gBAAA,EAAkB,wGAAA;EAClB,aAAA,EAAe,0HAAA;EACf,YAAA,EAAc,iIAAA;EACd,YAAA,EAAc,wJAAA;EACd,cAAA,EAAgB,+JAAA;EAChB,UAAA,EAAY,6KAAA;EACZ,WAAA,EAAa,2GAAA;EACb,YAAA,EAAc,yGAAA;EACd,SAAA,EAAW,oJAAA;EACX,UAAA,EAAY,2HAAA;EACZ,UAAA,EAAY,qKAAA;EACZ,UAAA,EAAY,mNAAA;EACZ,cAAA,EAAgB,uHAAA;EAChB,WAAA,EAAa,mGAAA;EACb,YAAA,EAAc,qGAAA;EACd,eAAA,EAAiB,kFAAA;EACjB,YAAA,EAAc,wFAAA;EACd,YAAA,EAAc,4HAAA;EACd,kBAAA,EAAoB,qJAAA;EACpB,SAAA,EAAW,iLAAA;EACX,aAAA,EAAe,wGAAA;EACf,SAAA,EAAW,uGAAA;EACX,WAAA,EAAa,6FAAA;EACb,YAAA,EAAc,sFAAA;EACd,SAAA,EAAW,wFAAA;EACX,aAAA,EAAe,6FAAA;EACf,QAAA,EAAU,kLAAA;EACV,UAAA,EAAY,uuBAAA;EACZ,UAAA,EAAY,gFAAA;EACZ,EAAA,EAAI,uFAAA;EACJ,EAAA,EAAI,wGAAA;EACJ,EAAA,EAAI,oFAAA;EACJ,GAAA,EAAK,wJAAA;EACL,GAAA,EAAK;AACP,CAAA;AAxWA,ICgBaC,EAAAA,GAAAA,CAAcR,GAAAA,KAA6CS,GAAAA,IAAQF,EAAAA;ADhBhF,ICkBMG,CAAAA,GAAoC;EACxC,OAAA,EAAS,WAAA;EACT,IAAA,EAAM,MAAA;EACN,MAAA,EAAQ,cAAA;EACR,WAAA,EAAa,GAAA;EACb,aAAA,EAAe,OAAA;EACf,cAAA,EAAgB;AAClB,CAAA;ADzBA,IC6BMC,CAAAA,uBAAa,GAAA,EAAgC;AD7BnD,IC8BMC,CAAAA,GAAAA,CAAaZ,GAAAA,KAAiB;AAClC,EAAA,IAAIa,GAAAA,GAAIF,CAAAA,CAAO,GAAA,CAAIG,GAAI,CAAA;AAEvB,EAAA,OADKD,GAAAA,IAAGF,EAAO,GAAA,CAAIG,GAAAA,EAAOC,MAAI,EAAE,MAAA,EAAQD,GAAAA,EAAO,CAAA,EACxCD,GAAAA;AACT,CAAA;AAIA,SAAgBG,EAAK,EACnB,IAAA,EAAAhB,GAAAA,EACA,SAAA,EAAAiB,KACA,IAAA,EAAAC,GAAAA,GAAO,EAAA,EACP,KAAA,EAAAC,KACA,MAAA,EAAAC,GAAAA,GAAS,OACT,WAAA,EAAAC,GAAAA,GAAc,MAAA,EACmB;AACjC,EAAA,IAAMC,MAAQC,GAAAA,IAAUf,EAAAA,CAAWC,GAAI,CAAA,GAAIF,EAAAA,CAAWE,GAAAA,CAAAA,GAAQ,EAAA;AAC9D,EAAA,uBACEM,IAAC,KAAA,EAAD;IACE,GAAIL,CAAAA;IACO,SAAA,EAAAO,GAAAA;IACX,KAAA,EAAOO,GAAAA;IACP,MAAA,EAAQA,GAAAA;AAIR,IAAA,WAAA,EAAaF,MAAQG,GAAAA,GAAc,MAAA;AACnC,IAAA,IAAA,EAAMC,MAAQ,KAAA,GAAQ,MAAA;IACtB,YAAA,EAAYA,GAAAA;AACZ,IAAA,aAAA,EAAa,CAAAP,GAAAA,IAAQ,MAAA;AAGrB,IAAA,uBAAA,EAAyBP,CAAAA,CAAUU,GAAAA,GAAQjB,EAAAA,CAAWI,GAAAA,CAAK;GAC5D,CAAA;AAEL;AC3CA,IAAakB,CAAAA,GAAAA,CAAaZ,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,OAAA;EAAQ,GAAIa;AAAI,CAAA;AAAtE,IACaC,CAAAA,GAAAA,CAAaf,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,OAAA;EAAQ,GAAIa;AAAI,CAAA;AADtE,IAEaE,CAAAA,GAAAA,CAAahB,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,OAAA;EAAQ,GAAIa;AAAI,CAAA;AAFtE,IAGaG,CAAAA,GAAAA,CAAcjB,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,QAAA;EAAS,GAAIa;AAAI,CAAA;AAHxE,IAIaI,CAAAA,GAAAA,CAAclB,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,QAAA;EAAS,GAAIa;AAAI,CAAA;AAJxE,IAMaK,CAAAA,GAAAA,CAAWnB,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,KAAA;EAAM,GAAIa;AAAI,CAAA;AANlE,IAOaM,CAAAA,GAAAA,CAAiBpB,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,WAAA;EAAY,GAAIa;AAAI,CAAA,CAAA;AAP9E,IAQaO,CAAAA,GAAAA,CAAgBrB,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,UAAA;EAAW,GAAIa;AAAI,CAAA,CAAA;AAR5E,IASaQ,EAAAA,GAAAA,CAAgBtB,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,UAAA;EAAW,GAAIa;AAAI,CAAA,CAAA;AAT5E,IAYaS,CAAAA,GAAAA,CAAevB,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,SAAA;EAAU,GAAIa;AAAI,CAAA;AAZ1E,IAaaU,CAAAA,GAAAA,CAAWxB,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,KAAA;EAAM,GAAIa;AAAI,CAAA;AAblE,IAcaW,CAAAA,GAAAA,CAAgBzB,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,UAAA;EAAW,GAAIa;AAAI,CAAA;AAd5E,IAeaY,EAAAA,GAAAA,CAAY1B,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,MAAA;EAAO,GAAIa;AAAI,CAAA;AAfpE,IAgBaa,EAAAA,GAAAA,CAAa3B,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,OAAA;EAAQ,GAAIa;AAAI,CAAA;AAhBtE,IAiBac,EAAAA,GAAAA,CAAY5B,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,MAAA;EAAO,GAAIa;AAAI,CAAA;AAjBpE,IAkBae,EAAAA,GAAAA,CAAgB7B,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,UAAA;EAAW,GAAIa;AAAI,CAAA;AAlB5E,IAmBagB,CAAAA,GAAAA,CAAmB9B,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,aAAA;EAAc,GAAIa;AAAI,CAAA;AAnBlF,IA2BaiB,EAAAA,GAAAA,CAAa/B,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,OAAA;EAAQ,GAAIa;AAAI,CAAA;AA3BtE,IA8BakB,EAAAA,GAAAA,CAAYhC,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,MAAA;EAAO,GAAIa;AAAI,CAAA,CAAA;AA9BpE,IAoCamB,EAAAA,GAAAA,CAAgBjC,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,UAAA;EAAW,GAAIa;AAAI,CAAA;AApC5E,IAqCaoB,EAAAA,GAAAA,CAAclC,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,QAAA;EAAS,GAAIa;AAAI,CAAA;AArCxE,IA8CaqB,EAAAA,GAAAA,CAAenC,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,SAAA;EAAU,GAAIa;AAAI,CAAA;AA9C1E,IA+CasB,EAAAA,GAAAA,CAAapC,GAAAA,qBAAiBa,GAAA,CAACZ,CAAAA,EAAD;EAAM,IAAA,EAAK,OAAA;EAAQ,GAAIa;AAAI,CAAA;;;ACrEtE,SAAgBuB,GAASpD,GAAAA,EAAwB;AAC/C,EAAA,QAAQqD,GAAAA;IACN,KAAK,QAAA;AAAU,MAAA,OAAO,QAAA;IACtB,KAAK,WAAA;AAAa,MAAA,OAAO,QAAA;IACzB,KAAK,QAAA;AAAU,MAAA,OAAO,QAAA;IACtB,KAAK,SAAA;AAAW,MAAA,OAAO,QAAA;IACvB,KAAK,WAAA;AAAa,MAAA,OAAO,QAAA;IACzB,KAAK,WAAA;AAAa,MAAA,OAAO,QAAA;IACzB,KAAK,YAAA;AAAc,MAAA,OAAO,QAAA;IAC1B,KAAK,OAAA;IACL,KAAK,QAAA;AAAU,MAAA,OAAO,QAAA;IACtB,KAAK,KAAA;AAAO,MAAA,OAAO,QAAA;IACnB,KAAK,GAAA;IACL,KAAK,OAAA;AAAS,MAAA,OAAO,QAAA;AACrB,IAAA;AAAS,MAAA,OAAOA,IAAO,WAAA,EAAY;AACrC;AACF;;;ACRA,SAAgBC,GAAoBvC,GAAAA,EAA6D;AAC/F,EAAA,IAAI,CAACwC,GAAAA,EAAG;AACR,EAAA,IAAMF,GAAAA,GAAS,KAAA,CAAM,OAAA,CAAQE,GAAAA,CAAE,GAAG,CAAA,GAAIA,GAAAA,CAAE,GAAA,CAAI,CAAA,CAAA,GAAMA,GAAAA,CAAE,GAAA,EAC9CC,MAAkB,EAAC;AAKzB,EAAA,OAJID,GAAAA,CAAE,GAAA,IAAKC,GAAAA,CAAM,IAAA,CAAK,QAAG,GACrBD,GAAAA,CAAE,KAAA,KAAU,IAAA,IAAMC,GAAAA,CAAM,IAAA,CAAK,QAAG,GAChCD,GAAAA,CAAE,GAAA,IAAKC,GAAAA,CAAM,IAAA,CAAK,QAAG,CAAA,EACzBA,IAAM,IAAA,CAAKJ,EAAAA,CAASC,GAAM,CAAC,CAAA,EACpBG,GAAAA;AACT;AAMA,SAAgBC,GAAezD,GAAAA,EAAkD;AAC/E,EAAA,IAAMwD,GAAAA,GAAQF,GAAoBC,GAAC,CAAA;AACnC,EAAA,OAAOC,GAAAA,GAAQA,GAAAA,CAAM,IAAA,CAAK,EAAE,CAAA,GAAI,MAAA;AAClC;ACtBA,IAAME,EAAAA,GAAgB,yDAAA;AAMtB,SAAgBC,GAAkB3D,GAAAA,EAAsD;AACtF,EAAA,OAAQ4D,GAAAA,EAAM,OAAA,CAAQF,EAAa,CAAA,IAA4B,IAAA;AACjE;AAGA,IAAMG,EAAAA,GAAuBC,cAA0C,MAAS,CAAA;AAuDhF,SAAgBC,GAAiBhD,GAAAA,EAG/B;AACA,EAAA,IAAM,CAACiD,GAAAA,EAAUC,GAAAA,IAAeC,QAAAA,CAA6B,IAAI,GAC3DC,GAAAA,GAAeC,UAAAA,CAAWP,EAAoB,CAAA,EAE9CQ,GAAAA,GACJC,QAAa,MAAA,GAETH,GAAAA,KAAiB,SAEfR,EAAAA,CAAkBK,GAAQ,IAD1BG,GAAAA,GAFFG,GAAAA;AAKN,EAAA,OAAO;IACL,MAAA,kBAAQtE,IAAC,MAAA,EAAD;MAAM,MAAA,EAAA,IAAA;MAAO,GAAA,EAAKiE;KAAc,CAAA;IACxC,WAAA,EAAa,EAAE,wBAAA,EAA0BI,GAAAA,IAAY,MAAA;AACvD,GAAA;AACF;;;;;AC7DA,SAAgBE,GAAevE,GAAAA,EAA4B;AACzD,EAAA,IAAM,EAAE,OAAAe,GAAAA,GAAQ,GAAA,EAAK,YAAAyD,GAAAA,GAAa,CAAA,EAAG,GAAGC,GAAAA,EAAAA,GAASC,GAAAA;AACjD,EAAA,uBAAOC,IAACC,cAAAA,EAAD;IAA0B,KAAA,EAAA7D,GAAAA;IAAmB,UAAA,EAAAyD,GAAAA;IAAY,GAAIC;GAAO,CAAA;AAC7E;AAaA,SAAgBI,GAAQ5D,GAAAA,EAAqB;AAC3C,EAAA,IAAM,EAAE,QAAA,EAAAC,GAAAA,EAAU,SAAA,EAAAC,GAAAA,EAAW,WAAAC,GAAAA,GAAY,KAAA,EAAO,MAAA,EAAAC,GAAAA,GAAS,CAAA,EAAG,eAAA,EAAAyD,KAAiB,GAAGL,GAAAA,EAAAA,GAASC,GAAAA,EACnF,EAAE,MAAA,EAAA7D,KAAQ,WAAA,EAAAkE,GAAAA,EAAA,GAAgBhB,EAAAA,CAAiBiB,GAAe,CAAA;AAChE,EAAA,uBACER,KAAAS,QAAAA,EAAA,EAAA,UAAA,CACGC,GAAAA,kBACDV,IAAAA,CAACW,OAAAA,EAAD;IACE,GAAIV,GAAAA;IACO,SAAA,EAAArD,GAAAA;IACH,MAAA,EAAAC,GAAAA;IACR,SAAA,EAAW,CAACH,GAAE,OAAA,EAASkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAC1D,qBAAA,EAAoB,EAAA;IACpB,GAAIC,GAAAA;IANN,QAAA,EAAA,iBAQEV,GAAAA,CAACW,YAAAA,EAAD;AAAc,MAAA,SAAA,EAAWpE,EAAAA,CAAE,KAAA;MACzB,QAAA,kBAAAyD,IAAC,KAAA,EAAD;QAAK,KAAA,EAAO,CAAA;QAAG,MAAA,EAAQ,CAAA;QAAG,OAAA,EAAQ,SAAA;QAAU,aAAA,EAAY,MAAA;AACtD,QAAA,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAD,EAAM,CAAA,EAAE,kBAAkB;OACvB;AACO,KAAA,GACbY,GACS;GACZ,CAAA,GAAA,CAAA;AAEN;;;;;;ICvDMC,EAAAA,GAAgC,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAChDC,IAAAA,EAAAA,GAAAA,MAAAA,MAA0C;AAAC,CAAA;AAyBjD,SAASC,EAAAA,CAAY1F,KAAkBe,GAAAA,EAA4C;AACjF,EAAA,IAAI4E,GAAAA,KAAa,QAAW,OAAOA,GAAAA;AACnC,EAAA,IAAM1E,MAAI2E,GAAAA,CAAK,IAAA;AAEf,EAAA,OADI,OAAO3E,GAAAA,IAAM,UAAA,GAAmBA,GAAAA,EAAE,GAC/BA,GAAAA;AACT;AAEA,SAAS4E,EAAAA,CAAa7F,KAAee,GAAAA,EAA0B;AAC7D,EAAA,IAAM+E,GAAAA,GAAWF,GAAAA,CAAK,MAAA,CAAO,QAAA,IAAYnC,EAAAA,CAAesC,eAAAA,CAAgBH,GAAAA,CAAK,MAAA,EAAQA,GAAAA,CAAK,MAAM,CAAA,CAAE,CAAA,CAAE,CAAA;AACpG,EAAA,OAAOE,GAAAA,GAAW,CAAA,EAAGpE,GAAAA,CAAAA,EAAAA,EAAUoE,GAAAA,CAAAA,CAAAA,CAAAA,GAAcpE,GAAAA;AAC/C;AAgBA,SAAgBsE,GAAUrB,GAAAA,EAAuB;AAC/C,EAAA,IAAM,EAAE,OAAA1D,GAAAA,EAAO,WAAA,EAAApB,MAAc,YAAA,EAAc,KAAA,EAAAoG,KAAO,MAAA,EAAA1C,GAAAA,EAAQ,WAAA2C,GAAAA,EAAA,GAAcxB,KAClEyB,GAAAA,GAAWC,kBAAAA,IACXC,GAAAA,GAASC,sBAAAA,EAAuB,EAMhCC,GAAAA,GALMC,oBAAAA,CACVL,GAAAA,GAAWA,IAAS,SAAA,GAAYV,EAAAA,EAChCU,MAAWA,GAAAA,CAAS,IAAA,GAAA,MAAaX,EAAAA,EACjCW,GAAAA,GAAWA,GAAAA,CAAS,IAAA,GAAA,MAAaX,EAErB,EAAI,MAAA,CAAA,CAAQxF,QAAMyG,GAAAA,CAAE,KAAA,KAAUC,GAAK,CAAA,CAAE,OAAA,CAAQC,WAAW,CAAA,EAEhEC,GAAAA,GAAM;IAAC1F,EAAAA,CAAE,GAAA;AAAK2F,IAAAA,GAAAA,KAAgB,cAAc3F,EAAAA,CAAE,QAAA;AAAUkE,IAAAA;AAAS,GAAA,CACpE,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;AAEX,EAAA,uBACEjE,IAAC,KAAA,EAAD;IAAK,SAAA,EAAWyF,GAAAA;IAAK,IAAA,EAAK,SAAA;AAAU,IAAA,YAAA,EAAY,GAAGF,GAAAA,CAAAA,QAAAA,CAAAA;IAChD,QAAA,EAAAH,GAAAA,CAAM,GAAA,CAAA,CAAK5B,GAAAA,KAAS;AACnB,MAAA,IAAMjD,MAAQoF,GAAAA,GAASlB,GAAAA,CAAK,GAAA,CAAA,IAAQA,IAAK,KAAA,EACnCmB,GAAAA,GAAOrB,EAAAA,CAAYE,GAAAA,EAAMoB,MAAQpB,GAAAA,CAAK,GAAA,CAAI,CAAA,EAG1CqB,GAAAA,GAAOZ,MAASa,qBAAAA,CAAsBtB,GAAAA,CAAK,MAAA,EAAQS,GAAM,IAAI,MAAA,EAC7D,EAAE,OAAA,EAAApG,GAAAA,KAAYkH,eAAAA,CAAgBvB,GAAAA,CAAK,MAAA,EAAQqB,GAAI,GAC/CG,GAAAA,GAAW,CAACC,KACZC,GAAAA,GAAQzB,EAAAA,CAAanE,KAAOkE,GAAI,CAAA;AACtC,MAAA,uBACExE,KAACmD,EAAAA,EAAD;QAA+B,UAAA,EAAY6C,GAAAA;QAA3C,QAAA,EAAA,iBACEjG,GAAAA,CAACoG,SAAAA,EAAD;UAAW,UAAA,EAAYH,GAAAA;UACrB,QAAA,kBAAAjG,IAAC,QAAA,EAAD;YACE,IAAA,EAAK,QAAA;YACL,aAAA,EAAa,CAAA,gBAAA,EAAmByE,IAAK,GAAA,CAAA,CAAA;YACrC,YAAA,EAAYlE,GAAAA;AACZ,YAAA,eAAA,EAAe0F,GAAAA,IAAY,MAAA;YACjB,QAAA,EAAA/F,GAAAA;AACV,YAAA,SAAA,EAAWH,EAAAA,CAAE,MAAA;AACb,YAAA,OAAA,EAAA,MAAe;AACTkG,cAAAA,OAIJjB,GAAAA,EAAU,OAAA,CAAQP,IAAK,MAAA,CAAO,EAAA,EAAIA,IAAK,MAAM,CAAA;AAC/C,YAAA,CAAA;YAEC,QAAA,EAAAmB;WACK;SACC,CAAA,kBACX5F,GAAAA,CAAC0D,EAAAA,EAAD,EAAA,QAAA,EAAUyC,GAAAA,EAAe,CACX;AArBK,OAAA,EAAA1B,IAAK,GAqBV,CAAA;IAEpB,CAAC;GACE,CAAA;AAET;ACxFA,SAAgB4B,GAAU,EAAE,MAAA,EAAA7C,GAAAA,EAAQ,IAAA,EAAAH,KAAA,EAAkC;AACpE,EAAA,IAAMiD,MAAMC,QAAAA,EAAS;AACrB,EAAA,IAAIC,GAAAA,KAAW,MAAA,IAAaC,GAAAA,KAAS,MAAA,SAAkB,EAAC;AACxD,EAAA,IAAMC,GAAAA,GAAQD,GAAAA,KAAS,MAAA,GAAY,MAAA,GAAY,OAAOA,GAAAA,IAAS,QAAA,GAAWE,UAAAA,CAAWL,GAAAA,CAAI,KAAA,EAAOG,GAAAA,EAAMH,GAAG,CAAA,GAAIG,GAAAA;AAC7G,EAAA,OAAO;IACL,aAAA,EAAeD,GAAAA;AACf,IAAA,WAAA,EAAaC,GAAAA,KAAS,MAAA,GAAY,MAAA,GAAY,MAAA,CAAOA,GAAI,CAAA;AACzD,IAAA,KAAA,EAAOC,GAAAA,KAAU,MAAA,GAAY,MAAA,GAAa,EAAE,cAAcA,GAAAA;AAC5D,GAAA;AACF;;;;;;;ICxCME,EAAAA,GAAoB;AACxB,EAAA,SAAA,EAAA,MAAiB,IAAA;EACjB,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAC/C,SAAA,EAAW,IAAA;EACX,UAAA,EAAY;AACd,CAAA;ICLMC,EAAAA,GAAqB;AACzB,EAAA,SAAA,EAAA,MAAiB,IAAA;EACjB,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAC/C,SAAA,EAAW,IAAA;EACX,UAAA,EAAY;AACd,CAAA;ICAMC,EAAAA,GAAmC,EAAE,SAAS,IAAA,EAAK;IAEnDC,EAAAA,GAAoC;AACxC,EAAA,OAAA,EAAA,CAAUlI,GAAAA,MAED;IAAE,IAAA,EAAM,cAAA;AAAgB,IAAA,UAAA,EAAY,EAAE,OAAA,EAAS;MADxC,GAAGiI,EAAAA;MAAU,GAAGE;AACwB,KAAA,CAAI,OAAA;AAAU,GAAA,CAAA;EAEtE,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAC/C,SAAA,EAAW,IAAA;EACX,QAAA,EAAUF;AACZ,CAAA;ICRMA,EAAAA,GAAoC;EAAE,OAAA,EAAS,IAAA;EAAM,YAAA,EAAc;AAAE,CAAA;AAE3E,SAASG,EAAAA,CAAYpI,KAAWe,GAAAA,EAAa;AAC3C,EAAA,IACMsH,GAAAA,GAAK7D,GAAAA,GAAI8D,GAAAA,EACTC,GAAAA,GAAK/D,GAAAA,GAAI8D,GAAAA;AACf,EAAA,OAAO;AACL,IAAA,CAAA,EAAA,EAAKD,GAAAA,CAAAA,EAAAA,CAAAA;AACL,IAAA,CAAA,EAAA,EAAK,MAAIA,GAAAA,CAAAA,EAAAA,CAAAA;AACT,IAAA,CAAA,EAAA,EAAKA,GAAAA,CAAAA,CAAAA,EAAME,GAAAA,CAAAA,WAAAA,EAAiBA,GAAAA,CAAAA,CAAAA;AAC5B,IAAA,CAAA,MAAA,EAAU,MAAIA,GAAAA,CAAAA,CAAAA;AACd,IAAA,CAAA,EAAA,EAAKF,GAAAA,CAAAA,CAAAA,EAAME,GAAAA,CAAAA,OAAAA,EAAY,MAAIF,GAAAA,CAAAA,IAAAA,CAAAA;AAC3B,IAAA,CAAA,EAAA,EAAKA,GAAAA,CAAAA,IAAAA,CAAAA;AACL,IAAA,CAAA,EAAA,EAAKA,GAAAA,CAAAA,CAAAA,EAAME,GAAAA,CAAAA,SAAAA,EAAc,MAAIA,GAAAA,CAAAA,CAAAA;AAC7B,IAAA,CAAA,IAAA,EAAOA,GAAAA,CAAAA,CAAAA;AACP,IAAA,CAAA,EAAA,EAAKF,GAAAA,CAAAA,CAAAA,EAAME,GAAAA,CAAAA,OAAAA,EAAYF,GAAAA,CAAAA,EAAAA,CAAAA;AACvB,IAAA;AACF,GAAA,CAAE,KAAK,GAAG,CAAA;AACZ;AAEA,IAAMG,EAAAA,GAAsC;EAC1C,SAAA,EAAA,CAAY,EAAE,OAAA,EAAAxI,GAAAA,EAAS,SAAAe,GAAAA,EAAS,MAAA,EAAA4D,KAAA,KAAa;AAC3C,IAAA,IAAM8D,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;KAAO,EAI/B9G,GAAAA,GAAI+G,GAHA,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAIK,GAAAA,CAAI,OAAA,EAAS,CAAC,CACnC,IAAI,EAAA,EACF,IAAA,CAAK,IAAI,GAAA,EAAK,IAAA,CAAK,IAAIA,GAAAA,CAAI,YAAA,EAAc,CAAC,CAC7B,CAAG,CAAA;AAC5B,IAAA,uBACEvH,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA;AACIyD,MAAAA,CAAAA,GAAAA,KAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,qBACnCC,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,YAAA;QAAgB,CAAA,EAAA1H;OAAI,CAAA;AAEpCyH,MAAAA,CAAAA,GAAAA,KAAY,SAAA,IAAaA,GAAAA,KAAY,OAAA,qBACrCC,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,cAAA;QAAkB,CAAA,EAAA1H;OAAI,CAAA;MAEvC2H,GAAAA,oBAAWD,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,aAAA;QAAiB,CAAA,EAAA1H,GAAAA;QAAG,SAAA,EAAU;OAAmD;AAC7G,KAAA,EAAA,CAAA;AAEN,EAAA,CAAA;EACA,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAC/C,SAAA,EAAW,IAAA;EACX,QAAA,EAAUgH;AACZ,CAAA;AC7CA,SAAgBY,EAAAA,CAAU7I,GAAAA,EAAmCe,GAAAA,GAAgB,IAAA,EAAgC;AAC3G,EAAA,IAAM,CAAC+H,GAAAA,EAAKC,GAAAA,CAAAA,GAAU7E,QAAAA,CAAS;IAAE,CAAA,EAAG,GAAA;IAAK,CAAA,EAAG;GAAK,CAAA;AAiBjD,EAAA,OAfA8E,gBAAAA,MAAsB;AACpB,IAAA,IAAMC,MAAKC,GAAAA,GAAOC,GAAAA,CAAI,UAAU,IAAA,EAC1BC,GAAAA,GAAMH,KAAI,eAAA,IAAmBA,GAAAA;AACnC,IAAA,IAAI,CAACG,GAAAA,EAAK;AACV,IAAA,IAAMC,MAAAA,MAAe;AACnB,MAAA,IAAM7E,GAAAA,GAAI4E,IAAI,qBAAA,EAAsB;AAChC5E,MAAAA,IAAE,KAAA,GAAQ,CAAA,IAAKA,GAAAA,CAAE,MAAA,GAAS,KAAGuE,GAAAA,CAAO;AAAE,QAAA,CAAA,EAAGvE,GAAAA,CAAE,KAAA;AAAO,QAAA,CAAA,EAAGA,GAAAA,CAAE;OAAQ,CAAA;AACrE,IAAA,CAAA;AAEA,IAAA,IADA6E,GAAAA,EAAO,EACH,OAAO,cAAA,GAAmB,GAAA,EAAa;AAC3C,IAAA,IAAMC,GAAAA,GAAK,IAAI,cAAA,CAAeD,GAAM,CAAA;AAEpC,IAAA,OADAC,IAAG,OAAA,CAAQF,GAAG,CAAA,EAAA,MACDE,IAAG,UAAA,EAAW;AAC7B,EAAA,CAAA,EAAG,CAACH,GAAAA,EAAKD,GAAI,CAAC,CAAA,EAEPJ,GAAAA;AACT;AChBA,IAAMb,EAAAA,GAAuC;EAAE,UAAA,EAAY,GAAA;EAAK,SAAA,EAAW;AAAG,CAAA;AAE9E,SAASsB,EAAAA,CAAoB,EAAE,OAAA,EAAAvJ,GAAAA,EAAS,SAAAe,GAAAA,EAAS,MAAA,EAAA4D,KAAA,EAI9C;AACD,EAAA,IAAM8D,GAAAA,GAAM;IAAE,GAAGR,EAAAA;IAAU,GAAGE;GAAO,EAC/BqB,GAAAA,GAASC,OAAM,EACfN,GAAAA,GAAMO,OAAoB,IAAI,CAAA,EAC9BZ,GAAAA,GAAMD,EAAAA,CAAUM,GAAG,CAAA,EAGnBd,MAAMI,GAAAA,CAAI,UAAA,GAAaK,IAAI,CAAA,GAAK,GAAA,EAChCP,MAAME,GAAAA,CAAI,UAAA,GAAaK,GAAAA,CAAI,CAAA,GAAK,GAAA,EAChCa,GAAAA,GAAK,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAMb,GAAAA,CAAI,IAAIL,GAAAA,CAAI,SAAS,CAAC,CAAA,EAClDmB,GAAAA,GAAK,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,MAAMd,GAAAA,CAAI,CAAA,GAAIL,IAAI,SAAS,CAAC,CAAA,EAElDoB,GAAAA,GAAwC,EAAC;AAC/C,EAAA,KAAA,IAAS5I,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI0I,GAAAA,EAAI3J,GAAAA,EAAAA,EAAK;AAC3B,IAAA,IAAMe,GAAAA,GAAAA,CAAKE,MAAI,GAAA,IAAO0I,GAAAA;AACtBE,IAAAA,IAAQ,IAAA,CAAK;AAAE,MAAA,EAAA,EAAI9I,GAAAA,GAAI,GAAA;MAAK,EAAA,EAAI;KAAG,CAAA,EACnC8I,IAAQ,IAAA,CAAK;AAAE,MAAA,EAAA,EAAI9I,GAAAA,GAAI,GAAA;MAAK,EAAA,EAAI;KAAK,CAAA;AACvC,EAAA;AACA,EAAA,KAAA,IAASE,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI2I,GAAAA,EAAI5J,GAAAA,EAAAA,EAAK;AAC3B,IAAA,IAAMe,GAAAA,GAAAA,CAAKE,MAAI,GAAA,IAAO2I,GAAAA;AACtBC,IAAAA,IAAQ,IAAA,CAAK;MAAE,EAAA,EAAI,CAAA;AAAG,MAAA,EAAA,EAAI9I,GAAAA,GAAI;KAAK,CAAA,EACnC8I,IAAQ,IAAA,CAAK;MAAE,EAAA,EAAI,GAAA;AAAK,MAAA,EAAA,EAAI9I,GAAAA,GAAI;KAAK,CAAA;AACvC,EAAA;AAEA,EAAA,uBACEG,KAAC,GAAA,EAAD;IAAQ,GAAA,EAAAuF,GAAAA;IAAR,QAAA,EAAA;AACE,sBAAAkC,IAAC,MAAA,EAAD,EAAA,QAAA,kBACEzH,KAAC,MAAA,EAAD;QAAM,EAAA,EAAIsI,GAAAA;QAAQ,SAAA,EAAU,gBAAA;QAAiB,CAAA,EAAE,IAAA;QAAK,CAAA,EAAE,IAAA;QAAK,KAAA,EAAM,KAAA;QAAM,MAAA,EAAO,KAAA;QAA9E,QAAA,EAAA,iBACEb,GAAAA,CAAC,MAAA,EAAD;UAAM,CAAA,EAAE,GAAA;UAAI,CAAA,EAAE,GAAA;UAAI,KAAA,EAAM,KAAA;UAAM,MAAA,EAAO,KAAA;UAAM,IAAA,EAAK;SAAS,CAAA,EACxDkB,IAAQ,GAAA,CAAA,CAAK7J,KAAGe,GAAAA,qBACf4H,IAAC,SAAA,EAAD;AAAiB,UAAA,EAAA,EAAIhE,GAAAA,CAAE,EAAA;AAAI,UAAA,EAAA,EAAIA,GAAAA,CAAE,EAAA;UAAQ,EAAA,EAAAxD,GAAAA;UAAQ,EAAA,EAAAE,GAAAA;UAAI,IAAA,EAAK;SAAS,EAArDJ,GAAqD,CACpE,CACG;AACF,OAAA,GAAA,CAAA;AACJyH,MAAAA,CAAAA,GAAAA,KAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,qBACnCC,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,YAAA;QAAa,CAAA,EAAE,GAAA;QAAI,CAAA,EAAE,GAAA;QAAI,KAAA,EAAM,KAAA;QAAM,MAAA,EAAO,KAAA;AAAM,QAAA,IAAA,EAAM,QAAQa,GAAAA,CAAAA,CAAAA;OAAY,CAAA;AAE5Fd,MAAAA,CAAAA,GAAAA,KAAY,SAAA,IAAaA,GAAAA,KAAY,OAAA,qBACrCC,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,cAAA;QAAe,CAAA,EAAE,GAAA;QAAI,CAAA,EAAE,GAAA;QAAI,KAAA,EAAM,KAAA;QAAM,MAAA,EAAO,KAAA;AAAM,QAAA,IAAA,EAAM,QAAQa,GAAAA,CAAAA,CAAAA;OAAY,CAAA;MAE/FZ,GAAAA,oBACCD,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,aAAA;QAAc,CAAA,EAAE,IAAA;QAAK,CAAA,EAAE,IAAA;QAAK,KAAA,EAAM,KAAA;QAAM,MAAA,EAAO,KAAA;AAAM,QAAA,IAAA,EAAM,QAAQa,GAAAA,CAAAA,CAAAA;OAAY;AAEhG;;AAEP;AAKA,IAAMM,EAAAA,GAA4C;EAChD,SAAA,EAAWP,EAAAA;EACX,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAC/C,SAAA,EAAW,IAAA;EACX,QAAA,EAAUtB;AACZ,CAAA;AALA,ICxDMA,EAAAA,GAAoC;EAAE,SAAA,EAAW,EAAA;EAAI,aAAA,EAAe;AAAE,CAAA;AAE5E,SAAS8B,EAAAA,CAAS/J,KAAae,GAAAA,EAAwC;AACrE,EAAA,IAAMA,MAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAIiJ,KAAK,EAAE,CAAC,CAAA,EACjCC,GAAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAIC,GAAAA,EAAYnJ,GAAC,CAAC,CAAA;AACjD,EAAA,IAAIkJ,GAAAA,IAAS,GACX,OAAO;AAAC,IAAA,CAAC,IAAI,CAAC,CAAA;AAAG,IAAA,CAAC,KAAKlJ,GAAC,CAAA;IAAG,CAAC,GAAA,EAAK,MAAMA,GAAC,CAAA;AAAG,IAAA,CAAC,IAAI,GAAG,CAAA;IAAG,CAAC,CAAA,EAAG,MAAMA,GAAC,CAAA;AAAG,IAAA,CAAC,GAAGA,GAAC;AAAC,GAAA;AAE5E,EAAA,IAAMoJ,GAAAA,GAAQF,MAAQlJ,GAAAA,EAChBqJ,GAAAA,GAAK,KAAK,EAAA,GAAKD,GAAAA,EACfE,GAAAA,GAAK,EAAA,GAAK,EAAA,GAAKF,GAAAA;AACrB,EAAA,OAAO;AACL,IAAA,CAACC,KAAIH,GAAK,CAAA;AAAG,IAAA,CAACI,KAAIJ,GAAK,CAAA;AACvB,IAAA,CAAC,KAAKlJ,GAAC,CAAA;IAAG,CAAC,GAAA,EAAK,MAAMA,GAAC,CAAA;IACvB,CAACsJ,GAAAA,EAAI,MAAMJ,GAAK,CAAA;IAAG,CAACG,GAAAA,EAAI,MAAMH,GAAK,CAAA;IACnC,CAAC,CAAA,EAAG,MAAMlJ,GAAC,CAAA;AAAG,IAAA,CAAC,GAAGA,GAAC;AACrB,GAAA;AACF;AAEA,IAAMuJ,EAAAA,GAAsC;AAC1C,EAAA,OAAA,EAAA,CAAUtK,GAAAA,KAA6B;AACrC,IAAA,IAAMyI,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA;AACrC,IAAA,OAAO;MAAE,IAAA,EAAM,SAAA;AAAW,MAAA,UAAA,EAAY,EAAE,QAAA,EAAU4B,EAAAA,CAAStB,IAAI,SAAA,EAAWA,GAAAA,CAAI,aAAa,CAAA;AAAI,KAAA;AACjG,EAAA,CAAA;EACA,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAC/C,SAAA,EAAW,IAAA;EACX,QAAA,EAAUR;AACZ,CAAA;AARA,IClBMA,EAAAA,GAAsC;EAC1C,MAAA,EAAQ,EAAA;EACR,MAAA,EAAQ,EAAA;EACR,MAAA,EAAQ,EAAA;EACR,QAAA,EAAU,EAAA;EACV,OAAA,EAAS;AACX,CAAA;AAEA,SAASsC,EAAAA,CAAcvK,GAAAA,EAAgBe,GAAAA,EAAgB4D,GAAAA,EAAgBH,KAAqBvD,GAAAA,EAAiB;AAC3G,EAAA,IACMuJ,GAAAA,GAAQC,GAAAA,GAAS,CAAA,EACjBC,GAAAA,GAAQ,IAAA,CAAK,KAAK,CAAA,GAAKF,GAAAA,EACvBG,GAAAA,GAASC,GAAAA,GAAc,IAAA,CAAK,EAAA,GAAM,KAClCC,GAAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAIC,KAAS,CAAC,CAAC,CAAA,EACtCC,GAAAA,GAA0B,EAAC;AACjC,EAAA,KAAA,IAAS9J,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIuJ,GAAAA,EAAOxK,GAAAA,EAAAA,EAAK;AAC9B,IAAA,IAAMwE,GAAAA,GAAIvD,MAAI,CAAA,IAAM,CAAA,GAAI+J,MAASC,GAAAA,EAC3BxE,GAAAA,GAAIkE,MAAQ1J,GAAAA,GAAIyJ,GAAAA;AACtB,IAAAvJ,GAAAA,CAAI,IAAA,CAAK,CAAC,EAAA,GAAK,KAAK,GAAA,CAAIsF,GAAC,CAAA,GAAIjC,GAAAA,EAAG,KAAK,IAAA,CAAK,GAAA,CAAIiC,GAAC,CAAA,GAAIjC,GAAC,CAAC,CAAA;AACvD,EAAA;AACA,EAAA,IAAIqG,OAAO,CAAA,EAAG;AACZ,IAAA,IAAIxJ,GAAAA,GAAI,EAAA;AACR,IAAA,KAAA,IAASJ,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI8J,GAAAA,CAAI,MAAA,EAAQhK,GAAAA,EAAAA,EAC9Bf,GAAAA,IAAAA,CAAMiB,GAAAA,KAAM,CAAA,GAAI,IAAA,GAAO,KAAA,IAAS8J,GAAAA,CAAI9J,GAAAA,CAAAA,CAAG,CAAA,CAAA,CAAG,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA,GAAM8J,GAAAA,CAAI9J,GAAAA,CAAAA,CAAG,CAAA,CAAA,CAAG,OAAA,CAAQ,CAAC,CAAA;AAElF,IAAA,OAAOI,GAAAA,GAAI,IAAA;AACb,EAAA;AACA,EAAA,IAAIA,GAAAA,GAAI,EAAA;AACR,EAAA,KAAA,IAASJ,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI8J,GAAAA,CAAI,QAAQ/K,GAAAA,EAAAA,EAAK;AACnC,IAAA,IAAMkL,GAAAA,GAAOH,GAAAA,CAAAA,CAAK9J,GAAAA,GAAI8J,GAAAA,CAAI,MAAA,GAAS,CAAA,IAAKA,GAAAA,CAAI,MAAA,CAAA,EACtCI,GAAAA,GAAOJ,GAAAA,CAAI9J,GAAAA,GACXmK,GAAAA,GAAOL,GAAAA,CAAAA,CAAK9J,GAAAA,GAAI,CAAA,IAAK8J,GAAAA,CAAI,MAAA,CAAA,EACzBhK,GAAAA,GAAI8J,GAAAA,GAAM,IAAA,EACVQ,GAAAA,GAASF,GAAAA,CAAK,CAAA,CAAA,GAAA,CAAMD,GAAAA,CAAK,CAAA,IAAKC,GAAAA,CAAK,CAAA,CAAA,IAAMpK,GAAAA,EACzCuK,GAAAA,GAASH,GAAAA,CAAK,CAAA,CAAA,GAAA,CAAMD,GAAAA,CAAK,CAAA,CAAA,GAAKC,GAAAA,CAAK,CAAA,CAAA,IAAMpK,GAAAA,EACzCwK,GAAAA,GAAQJ,IAAK,CAAA,CAAA,GAAA,CAAMC,GAAAA,CAAK,CAAA,CAAA,GAAKD,GAAAA,CAAK,CAAA,CAAA,IAAMpK,KACxCyK,GAAAA,GAAQL,GAAAA,CAAK,CAAA,CAAA,GAAA,CAAMC,GAAAA,CAAK,CAAA,CAAA,GAAKD,GAAAA,CAAK,CAAA,CAAA,IAAMpK,GAAAA;AAEzCM,IAAAA,GAAAA,IADDJ,QAAM,CAAA,GAAQ,CAAA,EAAA,EAAKoK,IAAO,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKC,GAAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,GAClD,MAAMD,GAAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKC,GAAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,IACrDlK,GAAAA,IAAK,CAAA,GAAA,EAAM+J,IAAK,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,EAAKA,GAAAA,CAAK,CAAA,CAAA,CAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,EAAKI,GAAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKC,GAAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA;AAC5F,EAAA;AACA,EAAA,OAAOnK,GAAAA,GAAI,IAAA;AACb;AAEA,IAAMoK,EAAAA,GAA0C;EAC9C,SAAA,EAAA,CAAY,EAAE,OAAA,EAAAzL,GAAAA,EAAS,SAAAe,GAAAA,EAAS,MAAA,EAAA4D,KAAA,KAAa;AAC3C,IAAA,IAAM8D,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;KAAO,EAC/B9G,GAAAA,GAAIkJ,EAAAA,CAAc9B,GAAAA,CAAI,MAAA,EAAQA,GAAAA,CAAI,MAAA,EAAQA,GAAAA,CAAI,MAAA,EAAQA,GAAAA,CAAI,QAAA,EAAUA,GAAAA,CAAI,OAAO,CAAA,EAC/EiD,MAASnB,EAAAA,CAAc9B,GAAAA,CAAI,MAAA,EAAQA,GAAAA,CAAI,MAAA,GAAS,CAAA,EAAGA,GAAAA,CAAI,MAAA,GAAS,CAAA,EAAGA,GAAAA,CAAI,QAAA,EAAUA,GAAAA,CAAI,OAAO,CAAA;AAClG,IAAA,uBACEvH,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA;AACIyD,MAAAA,CAAAA,GAAAA,KAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,qBAAaC,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,YAAA;QAAgB,CAAA,EAAA1H;OAAI,CAAA;AACpFyH,MAAAA,CAAAA,GAAAA,KAAY,SAAA,IAAaA,GAAAA,KAAY,OAAA,qBAAYC,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,cAAA;QAAkB,CAAA,EAAA1H;OAAI,CAAA;MACxF2H,GAAAA,oBAAWD,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,aAAA;QAAc,CAAA,EAAG+C;OAAS;AACtD,KAAA,EAAA,CAAA;AAEN,EAAA,CAAA;EACA,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAC/C,SAAA,EAAW,IAAA;EACX,QAAA,EAAUzD;AACZ,CAAA;AAhBA,IC9CMA,EAAAA,GAAsC;EAAE,aAAA,EAAe,CAAA;EAAG,cAAA,EAAgB,EAAA;EAAI,YAAA,EAAc;AAAE,CAAA;AD8CpG,IC5CM0D,EAAAA,GAA0C;AAC9C,EAAA,OAAA,EAAA,CAAU3L,GAAAA,KAA6B;AACrC,IAAA,IAAMyI,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA;AACrC,IAAA,OAAO;MACL,IAAA,EAAM,cAAA;MACN,UAAA,EAAY,EAAE,SAAS,CAAA,EAAE;AACzB,MAAA,OAAA,EAAS,CACP;QACE,IAAA,EAAM,UAAA;QACN,MAAA,EAAQ;AAAE,UAAA,aAAA,EAAeM,GAAAA,CAAI,aAAA;AAAe,UAAA,cAAA,EAAgBA,GAAAA,CAAI,cAAA;AAAgB,UAAA,YAAA,EAAcA,GAAAA,CAAI;AAAa;OAEnH;AACF,KAAA;AACF,EAAA,CAAA;EACA,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAC/C,SAAA,EAAW,IAAA;EACX,QAAA,EAAUR;AACZ,CAAA;AD2BA,IE1CMA,EAAAA,GAAmC;EACvC,UAAA,EAAY,GAAA;EACZ,SAAA,EAAW,EAAA;EACX,cAAA,EAAgB,GAAA;EAChB,OAAA,EAAS;AACX,CAAA;AAEA,SAAS2D,GAAAA,CAAgB,EAAE,OAAA,EAAA5L,GAAAA,EAAS,SAAAe,GAAAA,EAAS,MAAA,EAAA4D,KAAA,EAI1C;AACD,EAAA,IAAM8D,GAAAA,GAAM;IAAE,GAAGR,EAAAA;IAAU,GAAGE;AAAO,GAAA,EAC/BgB,GAAAA,GAAMO,MAAAA,CAAoB,IAAI,CAAA,EAC9BZ,GAAAA,GAAMD,EAAAA,CAAUM,GAAG,CAAA,EAEnB0C,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAIpD,GAAAA,CAAI,UAAA,EAAY,GAAG,CAAC,CAAA,EAC/CqD,GAAAA,GAAK,IAAA,CAAK,IAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAIrD,GAAAA,CAAI,SAAA,EAAWoD,GAAAA,GAAK,CAAC,CAAC,GACjDE,GAAAA,GAAMD,GAAAA,GAAAA,CAAMD,GAAAA,GAAKC,GAAAA,IAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAIrD,GAAAA,CAAI,cAAA,EAAgB,CAAC,CAAC,CAAA,EAEpEuD,GAAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAIvD,GAAAA,CAAI,OAAA,EAAS,CAAC,CAAC,CAAA,GAAI,EAAA,EACpDwD,MAAOD,GAAAA,GAAYlD,GAAAA,CAAI,CAAA,GAAK,GAAA,EAC5BoD,GAAAA,GAAOF,GAAAA,GAAYlD,GAAAA,CAAI,CAAA,GAAK,KAC5BzH,GAAAA,GAAI;IACR,CAAA,EAAA,EAAK4K,GAAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAA,EAAA,CAAA;AAClB,IAAA,CAAA,EAAA,EAAA,CAAM,GAAA,GAAMA,GAAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAAA,EAAA,CAAA;AAC1B,IAAA,CAAA,EAAA,EAAKA,GAAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKC,GAAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAA,WAAA,EAAeA,GAAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA;AAChE,IAAA,CAAA,MAAA,EAASJ,GAAAA,CAAAA,CAAAA;IACT,CAAA,MAAA,EAASC,GAAAA,OAAUF,GAAAA,CAAAA,CAAAA;IACnB,CAAA,IAAA,EAAOE,GAAAA,MAASD,GAAAA,CAAAA,CAAAA;IAChB,CAAA,IAAA,EAAOI,GAAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA;AACpB,IAAA,CAAA,EAAA,EAAKD,GAAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKC,GAAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAA,OAAA,EAAWD,GAAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,CAAA,EAAA,CAAA;AAC5D,IAAA;AACF,GAAA,CAAE,KAAK,GAAG,CAAA;AACV,EAAA,uBACE/K,KAAC,GAAA,EAAD;IAAQ,GAAA,EAAAD,GAAAA;IAAR,QAAA,EAAA;AACIyH,MAAAA,CAAAA,GAAAA,KAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,qBAAaC,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,YAAA;QAAgB,CAAA,EAAA5D;OAAI,CAAA;AACpF2D,MAAAA,CAAAA,GAAAA,KAAY,SAAA,IAAaA,GAAAA,KAAY,OAAA,qBAAYC,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,cAAA;QAAkB,CAAA,EAAA5D;OAAI,CAAA;MACxF6D,GAAAA,oBACCD,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,aAAA;QAAiB,CAAA,EAAA5D,GAAAA;QAAG,SAAA,EAAU;OAAmD;AAElG;;AAEP;AAEA,IAAMoH,GAAAA,GAAoC;EACxC,SAAA,EAAWP,GAAAA;EACX,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,EAAA;IAAI,IAAA,EAAM;AAAE,GAAA;EAChD,SAAA,EAAW,IAAA;EACX,QAAA,EAAU3D;AACZ,CAAA;AALA,IC5CMA,EAAAA,GAAmC;EAAE,IAAA,EAAM,QAAA;EAAU,KAAA,EAAO,SAAA;EAAW,UAAA,EAAY;AAAE,CAAA;AD4C3F,IC1CMmE,GAAAA,GAAoC;AACxC,EAAA,OAAA,EAAA,CAAUpM,GAAAA,MAED;IAAE,IAAA,EAAM,QAAA;IAAU,UAAA,EAAY;MADvB,GAAGiI,EAAAA;MAAU,GAAGE;AACO;AAAI,GAAA,CAAA;EAI3C,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAC/C,SAAA,EAAW,IAAA;EACX,QAAA,EAAUF;AACZ,CAAA;ADgCA,IE/CMA,GAAAA,GAAmC;EACvC,MAAA,EAAQ,EAAA;EACR,YAAA,EAAc,CAAA;EACd,QAAA,EAAU,EAAA;EACV,cAAA,EAAgB,CAAA;EAChB,YAAA,EAAc;AAChB,CAAA;AFyCA,IEvCMoE,GAAAA,GAAoC;AACxC,EAAA,OAAA,EAAA,CAAUrM,GAAAA,KAA6B;AACrC,IAAA,IAAMyI,GAAAA,GAAM;MAAE,GAAGR,GAAAA;MAAU,GAAGE;AAAO,KAAA;AAIrC,IAAA,OAAO;MACL,IAAA,EAAM,cAAA;AACN,MAAA,UAAA,EAAY,EAAE,OAAA,EAHA,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGM,GAAAA,CAAI,YAAA,GAAe,EAAE,CAG7C,CAAA,EAAQ;AACtB,MAAA,OAAA,EAAS,CACP;QACE,IAAA,EAAM,QAAA;QACN,MAAA,EAAQ;AACN,UAAA,KAAA,EAAOA,GAAAA,CAAI,MAAA;AACX,UAAA,MAAA,EAAQA,GAAAA,CAAI,QAAA;AACZ,UAAA,SAAA,EAAWA,GAAAA,CAAI,cAAA;UACf,SAAA,EAAW,CAAA;UACX,SAAA,EAAW,CAAA;UACX,aAAA,EAAe,CAAA;AACf,UAAA,YAAA,EAAcA,GAAAA,CAAI;AACpB;OAEJ;AACF,KAAA;AACF,EAAA,CAAA;EACA,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAC/C,SAAA,EAAW,IAAA;EACX,QAAA,EAAUR;AACZ,CAAA;AFWA,IGhDMA,GAAAA,GAAqC;EACzC,MAAA,EAAQ,EAAA;EACR,MAAA,EAAQ,EAAA;EACR,MAAA,EAAQ,EAAA;EACR,QAAA,EAAU;AACZ,CAAA;AAEA,SAASqE,EAAAA,CAAatM,GAAAA,EAAgBe,GAAAA,EAAgB4D,GAAAA,EAAgBH,GAAAA,EAAkB;AACtF,EAAA,IACMgG,GAAAA,GAAQC,GAAAA,GAAS,CAAA,EACjBC,GAAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAA,GAAKF,GAAAA,EACvBG,GAAAA,GAAS4B,GAAAA,GAAW,IAAA,CAAK,EAAA,GAAM,KACjClL,GAAAA,GAAI,EAAA;AACR,EAAA,KAAA,IAASJ,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIuJ,GAAAA,EAAOxK,GAAAA,EAAAA,EAAK;AAC9B,IAAA,IAAMwE,GAAAA,GAAIvD,MAAI,CAAA,IAAM,CAAA,GAAI+J,MAASC,GAAAA,EAC3BxE,GAAAA,GAAIkE,GAAAA,GAAQ1J,GAAAA,GAAIyJ,GAAAA,EAChBxE,GAAAA,GAAI,KAAK,IAAA,CAAK,GAAA,CAAIO,GAAC,CAAA,GAAIjC,GAAAA,EACvByB,MAAI,EAAA,GAAK,IAAA,CAAK,GAAA,CAAIQ,GAAC,CAAA,GAAIjC,GAAAA;AAC7B,IAAAtD,GAAAA,IAAAA,CAAMD,GAAAA,KAAM,CAAA,GAAI,IAAA,GAAO,KAAA,IAASiF,GAAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA,GAAMD,GAAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AAClE,EAAA;AACA,EAAA,OAAO5E,GAAAA,GAAI,IAAA;AACb;AAEA,IAAMmL,EAAAA,GAAwC;EAC5C,SAAA,EAAA,CAAY,EAAE,OAAA,EAAAxM,GAAAA,EAAS,SAAAe,GAAAA,EAAS,MAAA,EAAA4D,KAAA,KAAa;AAC3C,IAAA,IAAM,EAAE,QAAAH,GAAAA,EAAQ,MAAA,EAAAvD,KAAQ,MAAA,EAAAhB,GAAAA,EAAQ,QAAA,EAAAkB,GAAAA,EAAA,GAAa;MAAE,GAAG8G,GAAAA;MAAU,GAAGE;AAAO,KAAA,EAChE9G,GAAAA,GAAIiL,EAAAA,CAAa7B,GAAAA,EAAQO,GAAAA,EAAQC,KAAQsB,GAAQ,CAAA,EACjDb,GAAAA,GAASY,EAAAA,CAAa7B,GAAAA,EAAQO,GAAAA,GAAS,CAAA,EAAGC,GAAAA,GAAS,GAAGsB,GAAQ,CAAA;AACpE,IAAA,uBACErL,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA;AACIyD,MAAAA,CAAAA,GAAAA,KAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,qBAAaC,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,YAAA;QAAgB,CAAA,EAAAvH;OAAI,CAAA;AACpFsH,MAAAA,CAAAA,GAAAA,KAAY,SAAA,IAAaA,GAAAA,KAAY,OAAA,qBAAYC,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,cAAA;QAAkB,CAAA,EAAAvH;OAAI,CAAA;MACxFwH,GAAAA,oBAAWD,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,aAAA;QAAiB+C,CAAAA,EAAAA;OAAS;AACtD,KAAA,EAAA,CAAA;AAEN,EAAA,CAAA;EACA,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAC/C,SAAA,EAAW,IAAA;EACX,QAAA,EAAUzD;AACZ,CAAA;AAhBA,ICxBMA,EAAAA,GAAoC;EAAE,UAAA,EAAY,CAAA;EAAG,WAAA,EAAa,CAAA;EAAG,YAAA,EAAc;AAAE,CAAA;ADwB3F,ICtBMwE,EAAAA,GAAsC;AAC1C,EAAA,OAAA,EAAA,CAAUzM,GAAAA,KAA6B;AACrC,IAAA,IAAMyI,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA;AACrC,IAAA,OAAO;MACL,IAAA,EAAM,cAAA;MACN,UAAA,EAAY,EAAE,SAAS,CAAA,EAAE;AACzB,MAAA,OAAA,EAAS,CACP;QACE,IAAA,EAAM,OAAA;QACN,MAAA,EAAQ;AAAE,UAAA,UAAA,EAAYM,GAAAA,CAAI,UAAA;AAAY,UAAA,WAAA,EAAaA,GAAAA,CAAI,WAAA;AAAa,UAAA,YAAA,EAAcA,GAAAA,CAAI;AAAa;OAEvG;AACF,KAAA;AACF,EAAA,CAAA;EACA,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAC/C,SAAA,EAAW,IAAA;EACX,QAAA,EAAUR;AACZ,CAAA;ADKA,IEtBMA,EAAAA,GAAkC;EACtC,SAAA,EAAW,EAAA;EACX,SAAA,EAAW,EAAA;EACX,OAAA,EAAS,GAAA;EACT,YAAA,EAAc;AAChB,CAAA;AFiBA,IEfMyE,EAAAA,GAAkC;AACtC,EAAA,OAAA,EAAA,CAAU1M,GAAAA,KAA6B;AACrC,IAAA,IAAMyI,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA;AACrC,IAAA,OAAO;MACL,IAAA,EAAM,cAAA;MACN,UAAA,EAAY,EAAE,OAAA,EAASM,GAAAA,CAAI,OAAA,EAAQ;AACnC,MAAA,OAAA,EAAS,CACP;QACE,IAAA,EAAM,OAAA;QACN,MAAA,EAAQ;AAAE,UAAA,SAAA,EAAWA,GAAAA,CAAI,SAAA;AAAW,UAAA,SAAA,EAAWA,GAAAA,CAAI,SAAA;AAAW,UAAA,YAAA,EAAcA,GAAAA,CAAI;AAAa;OAEjG;AACF,KAAA;AACF,EAAA,CAAA;EACA,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAC/C,SAAA,EAAW,IAAA;EACX,QAAA,EAAUR;AACZ,CAAA;AFFA,IGxBMA,EAAAA,GAAkC;EAAE,KAAA,EAAO,EAAA;EAAI,UAAA,EAAY,EAAA;EAAI,YAAA,EAAc;AAAE,CAAA;AHwBrF,IGtBM0E,GAAAA,GAAkC;AACtC,EAAA,OAAA,EAAA,CAAU3M,GAAAA,KAA6B;AACrC,IAAA,IAAMyI,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/ByE,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAInE,GAAAA,CAAI,KAAA,EAAO,EAAE,CAAC,CAAA,EACxCoE,GAAAA,GAAQD,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGnE,GAAAA,CAAI,UAAU,CAAA,EACvCqE,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAIrE,GAAAA,CAAI,YAAA,EAAc,EAAE,CAAC,CAAA;AACrD,IAAA,OAAO;MACL,IAAA,EAAM,SAAA;AACN,MAAA,UAAA,EAAY,EACV,QAAA,EAAU;AACR,QAAA,CAAC,IAAIoE,GAAK,CAAA;QACV,CAAC,GAAA,GAAMC,KAAIF,GAAE,CAAA;AACb,QAAA,CAAC,KAAKA,GAAE,CAAA;AACR,QAAA,CAAC,KAAK,GAAG,CAAA;AACT,QAAA,CAAC,GAAG,GAAG,CAAA;AACP,QAAA,CAAC,GAAGA,GAAE,CAAA;QACN,CAAC,CAACE,KAAIF,GAAE;OACV;AAEJ,KAAA;AACF,EAAA,CAAA;EACA,MAAA,EAAQ;IAAE,GAAA,EAAK,EAAA;IAAI,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAChD,SAAA,EAAW,IAAA;EACX,QAAA,EAAU3E;AACZ,CAAA;AHFA,IIpBMA,EAAAA,GAAmC;EACvC,UAAA,EAAY,CAAA;EACZ,SAAA,EAAW,IAAA;EACX,WAAA,EAAa,GAAA;EACb,UAAA,EAAY,CAAA;EACZ,cAAA,EAAgB;AAClB,CAAA;AJcA,IIZM8E,EAAAA,GAAoC;AACxC,EAAA,OAAA,EAAA,CAAU/M,GAAAA,KAA6B;AACrC,IAAA,IAAMyI,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA;AACrC,IAAA,OAAO;MACL,IAAA,EAAM,cAAA;MACN,UAAA,EAAY,EAAE,SAAS,CAAA,EAAE;MACzB,OAAA,EAAS;AACP,QAAA;UAAE,IAAA,EAAM,OAAA;UAAU,MAAA,EAAQ;AAAE,YAAA,UAAA,EAAYM,GAAAA,CAAI,UAAA;AAAY,YAAA,SAAA,EAAWA,GAAAA,CAAI;AAAU;AAAE,SAAA;AACnF,QAAA;UAAE,IAAA,EAAM,OAAA;UAAU,MAAA,EAAQ;AAAE,YAAA,SAAA,EAAWA,GAAAA,CAAI,SAAA;AAAW,YAAA,SAAA,EAAWA,GAAAA,CAAI;AAAe;AAAE,SAAA;AACtF,QAAA;UAAE,IAAA,EAAM,QAAA;UAAU,MAAA,EAAQ;AAAE,YAAA,MAAA,EAAQA,GAAAA,CAAI,WAAA;AAAa,YAAA,KAAA,EAAOA,GAAAA,CAAI,UAAA;AAAY,YAAA,SAAA,EAAWA,GAAAA,CAAI;AAAU;AAAE;AACzG;AACF,KAAA;AACF,EAAA,CAAA;EACA,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE,GAAA;EAC/C,SAAA,EAAW,IAAA;EACX,QAAA,EAAUR;AACZ,CAAA;AJJA,IKzBMA,EAAAA,GAAkC;EAAE,QAAA,EAAU,EAAA;EAAI,UAAA,EAAY;AAAI,CAAA;AAExE,SAAS+E,GAAAA,CAAUhN,KAAkBe,GAAAA,EAAoB;AACvD,EAAA,IAAMkM,MAAK,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAIC,KAAU,EAAE,CAAC,CAAA,EACvCrB,GAAAA,GAAK,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAIsB,GAAAA,EAAY,GAAG,CAAC,CAAA;AAEjD,EAAA,OAAO;AACL,IAAA,CAAA,EAAA,EAAKF,GAAAA,CAAAA,EAAAA,CAAAA;AACL,IAAA,CAAA,EAAA,EAAKA,GAAAA,GAAK,CAAA,CAAA,GAAA,EAAOA,GAAAA,GAAK,CAAA,CAAA,EAAA,CAAA;IACtB,CAAA,EAAA,EAAK,GAAA,GAAMA,MAAK,CAAA,CAAA,EAAA,CAAA;AAChB,IAAA,CAAA,EAAA,EAAK,GAAA,GAAMA,GAAAA,GAAK,CAAA,CAAA,GAAA,EAAO,MAAMA,GAAAA,CAAAA,EAAAA,CAAAA;AAC7B,IAAA,CAAA,EAAA,EAAK,GAAA,GAAMA,GAAAA,GAAK,GAAA,CAAA,CAAA,EAAOpB,MAAK,IAAA,CAAA,CAAA;AAC5B,IAAA,CAAA,EAAA,EAAK,MAAMoB,GAAAA,CAAAA,CAAAA,EAAMpB,GAAAA,GAAK,GAAA,OAAUA,GAAAA,CAAAA,CAAAA;IAChC,CAAA,EAAA,EAAKoB,GAAAA,IAAMpB,GAAAA,GAAK,GAAA,IAAOoB,GAAAA,GAAK,GAAA,CAAA,CAAA,EAAOpB,GAAAA,GAAK,IAAA,CAAA,CAAA;AACxC,IAAA;AACF,GAAA,CAAE,KAAK,GAAG,CAAA;AACZ;AAEA,IAAMuB,EAAAA,GAAkC;EACtC,SAAA,EAAA,CAAY,EAAE,OAAA,EAAApN,GAAAA,EAAS,SAAAe,GAAAA,EAAS,MAAA,EAAA4D,KAAA,KAAa;AAC3C,IAAA,IAAM8D,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/B9G,GAAAA,GAAI2L,GAAAA,CAAUvE,GAAAA,CAAI,QAAA,EAAUA,IAAI,UAAU,CAAA;AAChD,IAAA,uBACEvH,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA;AACIyD,MAAAA,CAAAA,GAAAA,KAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,qBAAaC,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,YAAA;QAAgB,CAAA,EAAA1H;OAAI,CAAA;AACpFyH,MAAAA,CAAAA,GAAAA,KAAY,SAAA,IAAaA,GAAAA,KAAY,OAAA,qBAAYC,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,cAAA;QAAkB,CAAA,EAAA1H;OAAI,CAAA;MACxF2H,GAAAA,oBACCD,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,aAAA;QAAiB,CAAA,EAAA1H,GAAAA;QAAG,SAAA,EAAU;OAAmD;AAEnG,KAAA,EAAA,CAAA;AAEN,EAAA,CAAA;EACA,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,EAAA;IAAI,MAAA,EAAQ,EAAA;IAAI,IAAA,EAAM;AAAG,GAAA;EAClD,SAAA,EAAW,IAAA;EACX,QAAA,EAAUgH;AACZ,CAAA;AAjBA,ICvBM5G,EAAAA,GAAI,2GAAA;ADuBV,ICrBMgM,EAAAA,GAAmB;EACvB,SAAA,EAAA,CAAY,EAAE,OAAA,EAAArN,GAAAA,EAAS,OAAA,EAAAe,GAAAA,EAAA,qBACrBG,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA;AACIyD,IAAAA,CAAAA,GAAAA,KAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,qBAAaC,IAAC,MAAA,EAAD;MAAM,SAAA,EAAU,YAAA;MAAgB,CAAA,EAAA2E;KAAI,CAAA;AACpF5E,IAAAA,CAAAA,GAAAA,KAAY,SAAA,IAAaA,GAAAA,KAAY,OAAA,qBAAYC,IAAC,MAAA,EAAD;MAAM,SAAA,EAAU,cAAA;MAAkB,CAAA,EAAA2E;KAAI,CAAA;IACxF1E,GAAAA,oBACCD,IAAC,MAAA,EAAD;MAAM,SAAA,EAAU,aAAA;MAAiB,CAAA,EAAA2E,EAAAA;MAAG,SAAA,EAAU;KAAmD;AAEnG,GAAA,EAAA,CAAA;EAEJ,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,EAAA;IAAI,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAG,GAAA;EACjD,SAAA,EAAW;AACb,CAAA;ADSA,IEdMrF,EAAAA,GAAmC;EACvC,KAAA,EAAO,CAAA;EACP,cAAA,EAAgB,EAAA;EAChB,SAAA,EAAW,EAAA;EACX,kBAAA,EAAoB,EAAA;EACpB,KAAA,EAAO,GAAA;EACP,cAAA,EAAgB;AAClB,CAAA;AFOA,IELMsF,EAAAA,GAAoC;AACxC,EAAA,OAAA,EAAA,CAAUvN,GAAAA,KAA6B;AACrC,IAAA,IAAMyI,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/BqF,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI/E,GAAAA,CAAI,KAAA,EAAO,EAAE,CAAC,CAAA,EACxCgF,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAID,MAAK,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI/E,GAAAA,CAAI,SAAA,EAAW,EAAE,CAAC,CAAA,EACjDiF,MAAK,IAAA,CAAK,GAAA,CAAID,GAAAA,GAAK,CAAA,EAAG,KAAK,GAAA,CAAIhF,GAAAA,CAAI,KAAA,EAAO,GAAG,CAAC,CAAA,EAC9CkF,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAIlF,GAAAA,CAAI,gBAAgB,EAAE,CAAC,CAAA,EACjDmF,GAAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAInF,IAAI,kBAAA,EAAoB,EAAE,CAAC,CAAA,EACzDoF,MAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAIF,GAAAA,GAAKC,GAAM,CAAA,EAC7BE,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAIrF,GAAAA,CAAI,cAAA,EAAgB,EAAE,CAAC,CAAA;AACvD,IAAA,OAAO;MACL,IAAA,EAAM,SAAA;AACN,MAAA,UAAA,EAAY,EACV,QAAA,EAAU;QACR,CAAC+E,GAAAA,EAAI,KAAKG,GAAE,CAAA;QACZ,CAACF,GAAAA,EAAI,KAAKI,GAAE,CAAA;QACZ,CAACH,GAAAA,EAAI,KAAKI,GAAE,CAAA;QACZ,CAACJ,GAAAA,EAAI,KAAKI,GAAE,CAAA;QACZ,CAACL,GAAAA,EAAI,KAAKI,GAAE,CAAA;QACZ,CAACL,GAAAA,EAAI,KAAKG,GAAE;OACd;AAEJ,KAAA;AACF,EAAA,CAAA;EACA,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAG,GAAA;EAChD,SAAA,EAAW,IAAA;EACX,QAAA,EAAU1F;AACZ,CAAA;AFtBA,IGjBMA,EAAAA,GAAoC;EAAE,KAAA,EAAO,EAAA;EAAI,SAAA,EAAW,CAAA;EAAG,cAAA,EAAgB;AAAE,CAAA;AAEvF,SAAS8F,EAAAA,CAAY/N,KAAee,GAAAA,EAAe;AACjD,EAAA,IAAMiN,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAMC,GAAK,CAAC,CAAA,EACjCC,GAAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAGC,GAAK,CAAA,EAC7BC,GAAAA,GAAAA,CAAWpO,GAAAA,KAAckO,GAAAA,IAAa,IAAA,GAAO,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAIjN,GAAAA,GAAI,IAAA,GAAO,GAAG,CAAC,IACvFI,GAAAA,GAAI,eAAA;AACR,EAAA,KAAA,IAASJ,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI+M,GAAAA,EAAGhO,GAAAA,EAAAA,EAAK;AAC1B,IAAA,IAAMqO,GAAAA,GAAAA,CAASpN,MAAI,GAAA,IAAO+M,GAAAA,GAAK,KACzBM,GAAAA,GAAAA,CAASrN,GAAAA,GAAI,KAAK+M,GAAAA,GAAK,GAAA;AAC7B,IAAAvH,OAAK,CAAA,GAAA,EAAA,CAAO,GAAA,GAAM2H,IAAQnN,GAAC,CAAA,EAAG,QAAQ,CAAC,CAAA,CAAA,CAAA,EAAKoN,GAAAA,CAAK,QAAQ,CAAC,CAAA,UAAWC,GAAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA;AACrF,EAAA;AACA,EAAA7H,GAAAA,IAAK,UAAA;AACL,EAAA,KAAA,IAASxF,GAAAA,GAAI+M,GAAAA,GAAI,CAAA,EAAG/M,GAAAA,IAAK,GAAGjB,GAAAA,EAAAA,EAAK;AAC/B,IAAA,IAAMqO,OAASpN,GAAAA,GAAI,GAAA,IAAO+M,MAAK,GAAA,EACzBO,GAAAA,GAAUtN,MAAI+M,GAAAA,GAAK,GAAA;AACzB,IAAAvH,OAAK,CAAA,GAAA,EAAM2H,GAAAA,CAAQnN,MAAI+M,GAAC,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAA,CAAA,EAAKK,GAAAA,CAAK,QAAQ,CAAC,CAAA,QAASE,GAAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA;AACjF,EAAA;AACA,EAAA,OAAOlN,GAAAA,GAAI,IAAA;AACb;AAEA,IAAMmN,EAAAA,GAAW,CAAA;AAAjB,IAEMC,EAAAA,GAAsC;EAC1C,SAAA,EAAA,CAAY,EAAE,OAAA,EAAAzO,GAAAA,EAAS,SAAAe,GAAAA,EAAS,MAAA,EAAA4D,KAAA,KAAa;AAC3C,IAAA,IAAM8D,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/B9G,GAAAA,GAAI0M,EAAAA,CAAYtF,GAAAA,CAAI,KAAA,EAAOA,IAAI,SAAS,CAAA;AAC9C,IAAA,uBACEvH,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA;AACIyD,MAAAA,CAAAA,GAAAA,KAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,qBAAaC,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,YAAA;QAAgB,CAAA,EAAA1H;OAAI,CAAA;AACpFyH,MAAAA,CAAAA,GAAAA,KAAY,SAAA,IAAaA,GAAAA,KAAY,OAAA,qBAAYC,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,cAAA;QAAkB,CAAA,EAAA1H;OAAI,CAAA;MACxF2H,GAAAA,oBACCD,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,aAAA;QAAiB,CAAA,EAAA1H,GAAAA;QAAG,SAAA,EAAU;OAAmD;AAEnG,KAAA,EAAA,CAAA;AAEN,EAAA,CAAA;AACA,EAAA,MAAA,EAAA,CAASjB,GAAAA,KAAW;AAClB,IAAA,IAAMmK,MAAQ,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,GAAA,CAAIhC,IAAO,cAAA,IAAkBF,EAAAA,CAAS,gBAAgB,EAAE,CAAC,GACpFyG,GAAAA,GAAMF,EAAAA,EACNG,MAAO,IAAA,CAAK,KAAA,CAAMD,MAAMvE,GAAK,CAAA;AACnC,IAAA,OAAO;MAAE,GAAA,EAAAxF,GAAAA;MAAK,KAAA,EAAOgK,GAAAA;MAAM,MAAA,EAAQD,GAAAA;MAAK,IAAA,EAAMC;AAAK,KAAA;AACrD,EAAA,CAAA;EACA,SAAA,EAAW,IAAA;EACX,QAAA,EAAU1G;AACZ,CAAA;AAxBA,IC3BM2G,EAAAA,GAAO,6CAAA;AD2Bb,ICzBMC,EAAAA,GAAoB;EACxB,SAAA,EAAA,CAAY,EAAE,OAAA,EAAA7O,GAAAA,EAAS,OAAA,EAAAe,GAAAA,EAAA,qBACrBG,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA;AACIyD,IAAAA,CAAAA,GAAAA,KAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,qBAAaC,IAAC,MAAA,EAAD;MAAM,SAAA,EAAU,YAAA;MAAa,CAAA,EAAGiG;KAAO,CAAA;AACvFlG,IAAAA,CAAAA,GAAAA,KAAY,SAAA,IAAaA,GAAAA,KAAY,OAAA,qBAAYC,IAAC,MAAA,EAAD;MAAM,SAAA,EAAU,cAAA;MAAe,CAAA,EAAGiG;KAAO,CAAA;AAC1FlG,IAAAA,CAAAA,GAAAA,KAAY,aAAaA,GAAAA,KAAY,OAAA,qBACrCxH,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA;AAEE,sBAAA0D,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,cAAA;QAAe,CAAA,EAAE,+BAAA;QAAgC,OAAA,EAAS,GAAA;QAAK,IAAA,EAAK;OAAQ,CAAA;AAC5F,sBAAAA,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,cAAA;QAAe,CAAA,EAAE,+BAAA;QAAgC,OAAA,EAAS,GAAA;QAAK,IAAA,EAAK;OAAQ,CAAA;AAC5F,sBAAAA,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,cAAA;QAAe,CAAA,EAAE,+BAAA;QAAgC,OAAA,EAAS,IAAA;QAAM,IAAA,EAAK;OAAQ,CAAA;AAC7F,sBAAAA,IAAC,MAAA,EAAD;QAAM,SAAA,EAAU,cAAA;QAAe,CAAA,EAAE,+BAAA;QAAgC,OAAA,EAAS,GAAA;QAAK,IAAA,EAAK;OAAQ,CAAA;AAE5F,sBAAAA,IAAC,SAAA,EAAD;QAAS,SAAA,EAAU,cAAA;QAAe,EAAA,EAAG,IAAA;QAAK,EAAA,EAAG,IAAA;QAAK,EAAA,EAAG,KAAA;QAAM,EAAA,EAAG,KAAA;QAAM,OAAA,EAAS,GAAA;QAAK,IAAA,EAAK;OAAQ,CAAA;AAC/F,sBAAAA,IAAC,SAAA,EAAD;QAAS,SAAA,EAAU,cAAA;QAAe,EAAA,EAAG,IAAA;QAAK,EAAA,EAAG,IAAA;QAAK,EAAA,EAAG,KAAA;QAAM,EAAA,EAAG,KAAA;QAAM,OAAA,EAAS,IAAA;QAAM,IAAA,EAAK;OAAQ,CAAA;AAChG,sBAAAA,IAAC,SAAA,EAAD;QAAS,SAAA,EAAU,cAAA;QAAe,EAAA,EAAG,IAAA;QAAK,EAAA,EAAG,IAAA;QAAK,EAAA,EAAG,KAAA;QAAM,EAAA,EAAG,GAAA;QAAI,OAAA,EAAS,GAAA;QAAK,IAAA,EAAK;OAAQ;AAC7F,KAAA,EAAA,CAAA;IAEHC,GAAAA,oBACCD,IAAC,MAAA,EAAD;MAAM,SAAA,EAAU,aAAA;MAAc,CAAA,EAAGiG,EAAAA;MAAM,SAAA,EAAU;KAAmD;AAEtG,GAAA,EAAA,CAAA;EAEJ,MAAA,EAAQ;IAAE,GAAA,EAAK,EAAA;IAAI,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,EAAA;IAAI,IAAA,EAAM;AAAE,GAAA;EACjD,SAAA,EAAW;AACb,CAAA;ADAA,IEXM3G,CAAAA,GAAuC;EAC3C,MAAA,EAAQ,EAAA;EACR,KAAA,EAAO,EAAA;EACP,OAAA,EAAS,EAAA;EACT,QAAA,EAAU,GAAA;EACV,cAAA,EAAgB,CAAA;EAChB,SAAA,EAAW,CAAA;EACX,eAAA,EAAiB,CAAA;EACjB,aAAA,EAAe,CAAA;EACf,QAAA,EAAU,CAAA;EACV,cAAA,EAAgB,CAAA;EAChB,YAAA,EAAc,CAAA;EACd,QAAA,EAAU,CAAA;EACV,OAAA,EAAS;AACX,CAAA;AFHA,IGqBa6G,GAAAA,GAA+C;EAC1D,IAAA,EAAM/G,EAAAA;EACN,KAAA,EAAOC,EAAAA;EACP,MAAA,EAAQE,EAAAA;EACR,OAAA,EAASM,EAAAA;EACT,UAAA,EAAYsB,EAAAA;EACZ,OAAA,EAASQ,EAAAA;EACT,SAAA,EAAWmB,EAAAA;EACX,SAAA,EAAWE,EAAAA;EACX,MAAA,EAAQQ,GAAAA;EACR,MAAA,EAAQC,GAAAA;EACR,MAAA,EAAQC,GAAAA;EACR,QAAA,EAAUG,EAAAA;EACV,OAAA,EAASC,EAAAA;EACT,KAAA,EAAOC,EAAAA;EACP,KAAA,EAAOC,GAAAA;EACP,MAAA,EAAQI,EAAAA;EACR,KAAA,EAAOK,EAAAA;EACP,GAAA,EAAKC,EAAAA;EACL,MAAA,EAAQE,EAAAA;EACR,OAAA,EAASkB,EAAAA;EACT,IAAA,EAAMI,EAAAA;EACN,UAAA,EAAYE;ADrCZ,IAAA,OAAA,EAAA,CAAU/O,GAAAA,MAED;MAAE,IAAA,EAAM,YAAA;MAAc,UAAA,EAAY;QAD3B,GAAGiI,CAAAA;QAAU,GAAGE;AACW;AAAI,KAAA,CAAA;IAE/C,MAAA,EAAQ;MAAE,GAAA,EAAK,EAAA;MAAI,KAAA,EAAO,EAAA;MAAI,MAAA,EAAQ,EAAA;MAAI,IAAA,EAAM;AAAG,KAAA;IACnD,SAAA,EAAW,IAAA;IACX,QAAA,EAAUF;AC+BE8G;AACd,CAAA;AH5CA,IItBM9G,EAAAA,GAA0C,EAAE,OAAA,EAAS,CAAA,EAAE;AJsB7D,IIpBM+G,EAAAA,GAAiD;EACrD,KAAA,EAAA,CAAQhP,GAAAA,EAAQe,GAAAA,EAAM4D,GAAAA,KAAS;AAC7B,IAAA,IAAM8D,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/B8G,GAAAA,GAAK,GAAA,GAAMC,GAAAA,EACXC,GAAAA,GAAK,MAAMC,GAAAA,EAEXC,GAAAA,GAAK5G,GAAAA,CAAI,OAAA,GAAUwG,GAAAA,EACnBK,GAAAA,GAAK7G,GAAAA,CAAI,OAAA,GAAU0G,KAEnBI,GAAAA,GAA4B;AAChC,MAAA,CAACF,KAAI,CAAC,CAAA;MACN,CAAC,GAAA,GAAMA,KAAI,CAAC,CAAA;AACZ,MAAA,CAAC,KAAKC,GAAE,CAAA;MACR,CAAC,GAAA,EAAK,MAAMA,GAAE,CAAA;MACd,CAAC,GAAA,GAAMD,KAAI,GAAG,CAAA;AACd,MAAA,CAACA,KAAI,GAAG,CAAA;MACR,CAAC,CAAA,EAAG,MAAMC,GAAE,CAAA;AACZ,MAAA,CAAC,GAAGA,GAAE;AACR,KAAA,EAEME,GAAAA,GAAoB,EAAC,EACrBC,GAAAA,GAAuB,CAAC,CAAC,CAAA;AAC/B,IAAA,KAAA,IAASxO,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIsO,GAAAA,CAAM,QAAQvP,GAAAA,EAAAA,EAAK;AACrC,MAAA,IAAMyG,GAAAA,GAAI8I,GAAAA,CAAMtO,GAAAA,CAAAA,EACVsC,GAAAA,GAAIgM,GAAAA,CAAAA,CAAOtO,GAAAA,GAAI,CAAA,IAAKsO,GAAAA,CAAM,MAAA,CAAA,EAC1BG,GAAAA,GAAAA,CAAMnM,IAAE,CAAA,CAAA,GAAKkD,GAAAA,CAAE,CAAA,CAAA,IAAMwI,GAAAA,EACrBU,GAAAA,GAAAA,CAAMpM,GAAAA,CAAE,CAAA,CAAA,GAAKkD,GAAAA,CAAE,CAAA,CAAA,IAAM0I,GAAAA,EACrBS,GAAAA,GAAM,IAAA,CAAK,KAAA,CAAMF,KAAIC,GAAE,CAAA;AAC7BH,MAAAA,GAAAA,CAAQ,IAAA,CAAKI,GAAG,CAAA,EAChBH,GAAAA,CAAW,IAAA,CAAKA,GAAAA,CAAWA,GAAAA,CAAW,MAAA,GAAS,CAAA,CAAA,GAAKG,GAAG,CAAA;AACzD,IAAA;AACA,IAAA,IAAMC,GAAAA,GAAWJ,GAAAA,CAAWA,GAAAA,CAAW,MAAA,GAAS,CAAA,CAAA;AAgChD,IAAA,OAAO;AADwB,MAAA,QAAA,EA7Bd,CAAA,EAAA,EAAKF,GAAAA,CAAM,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,EAAMA,GAAAA,CAAM,CAAA,CAAA,CAAG,CAAA,CAAA,MAC5CA,GAAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA,CAAA,CAAK,CAACrJ,GAAAA,EAAGD,GAAAA,CAAAA,KAAO,CAAA,EAAA,EAAKC,GAAAA,CAAAA,CAAAA,EAAKD,GAAAA,CAAAA,CAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AA4BnB,MAAA,WAAA,EAAA,CA1BpBjG,GAAAA,KAA8B;AACjD,QAAA,IAAM8P,GAAAA,GAAAA,CAAO5O,GAAAA,GAAI2O,GAAAA,GAAYA,GAAAA,IAAYA,GAAAA;AACzC,QAAA,KAAA,IAAS5O,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIuO,GAAAA,CAAQ,QAAQxP,GAAAA,EAAAA,EAAK;AACvC,UAAA,IAAM+P,GAAAA,GAAWN,IAAWxO,GAAAA,CAAAA;AAE5B,UAAA,IAAI6O,GAAAA,IADWL,GAAAA,CAAWxO,GAAAA,GAAI,CAAA,IACX,IAAA,EAAM;AACvB,YAAA,IAAMF,GAAAA,GAAIyO,GAAAA,CAAQvO,GAAAA,CAAAA,GAAK,CAAA,GAAA,CAAK6O,GAAAA,GAAKC,GAAAA,IAAYP,GAAAA,CAAQvO,GAAAA,CAAAA,GAAK,CAAA,EACpDwF,GAAAA,GAAI8I,IAAMtO,GAAAA,CAAAA,EACVsC,GAAAA,GAAIgM,GAAAA,CAAAA,CAAOtO,GAAAA,GAAI,CAAA,IAAKsO,GAAAA,CAAM,MAAA,CAAA,EAC1BrJ,GAAAA,GAAIO,GAAAA,CAAE,CAAA,CAAA,GAAA,CAAMlD,GAAAA,CAAE,CAAA,CAAA,GAAKkD,IAAE,CAAA,CAAA,IAAM1F,GAAAA,EAC3BkF,GAAAA,GAAIQ,GAAAA,CAAE,CAAA,CAAA,GAAA,CAAMlD,GAAAA,CAAE,CAAA,CAAA,GAAKkD,GAAAA,CAAE,CAAA,CAAA,IAAM1F,GAAAA,EAE3BiP,GAAAA,GAAAA,CAAMzM,GAAAA,CAAE,CAAA,CAAA,GAAKkD,GAAAA,CAAE,CAAA,CAAA,IAAMwI,GAAAA,EACrBrC,GAAAA,GAAAA,CAAMrJ,GAAAA,CAAE,CAAA,IAAKkD,GAAAA,CAAE,CAAA,CAAA,IAAM0I,GAAAA,EACrBlG,GAAAA,GAAK,IAAA,CAAK,KAAA,CAAM+G,GAAAA,EAAIpD,GAAE,CAAA,IAAK,CAAA;AAMjC,YAAA,OAAO;cAAE,CAAA,EAAAxL,GAAAA;cAAG,CAAA,EAAAC,GAAAA;AAAG,cAAA,EAAA,EAFJuL,GAAAA,GAAK3D,GAAAA;AAEG,cAAA,EAAA,EADR,CAAC+G,GAAAA,GAAK/G;AACK,aAAA;AACxB,UAAA;AACF,QAAA;AACA,QAAA,OAAO;UAAE,CAAA,EAAGsG,GAAAA,CAAM,CAAA,CAAA,CAAG,CAAA,CAAA;UAAI,CAAA,EAAGA,GAAAA,CAAM,CAAA,CAAA,CAAG,CAAA,CAAA;UAAI,EAAA,EAAI,CAAA;UAAG,EAAA,EAAI;AAAG,SAAA;AACzD,MAAA,CAAA;MAEsD,QAAA,EAAAlO;AAC/C,KAAA;AACT,EAAA,CAAA;EACA,QAAA,EAAU4G,EAAAA;EACV,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE;AACjD,CAAA;AJ/CA,IKhBMA,GAAAA,GAAwC;EAAE,OAAA,EAAS,IAAA;EAAM,YAAA,EAAc,CAAA;EAAG,KAAA,EAAO;AAAE,CAAA;ALgBzF,IKdMgI,EAAAA,GAA6C;EACjD,KAAA,EAAA,CAAQjQ,GAAAA,EAAQe,GAAAA,EAAM4D,GAAAA,KAAS;AAC7B,IAAA,IAAM8D,GAAAA,GAAM;MAAE,GAAGR,GAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/B8G,MAAK,GAAA,GAAMC,GAAAA,EACXC,MAAK,GAAA,GAAMC,GAAAA,EACXtE,MAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAIrC,GAAAA,CAAI,OAAA,EAAS,CAAC,CAAC,CAAA,EAC9CH,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAIG,GAAAA,CAAI,YAAA,EAAc,EAAE,CAAC,CAAA,EAElDuD,MAAuB,IAAA,CAAK,GAAA,CAAIkD,GAAAA,EAAME,GAAI,IAAI,CAAA,GAAlCtE,GAAAA,EACZmB,MAAMD,GAAAA,GAAYiD,GAAAA,GAAK3G,KACvB4D,GAAAA,GAAMF,GAAAA,GAAYmD,GAAAA,GAAK7G,GAAAA,EACvBD,MAAK,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI4D,KAAK,EAAE,CAAC,CAAA,EAClC1D,GAAAA,GAAK,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI2D,GAAAA,EAAK,EAAE,CAAC,CAAA,EAElCgE,GAAAA,GAAAA,CAAU,GAAA,GAAM,IAAI7H,GAAAA,IAAM4G,GAAAA,EAC1BkB,OAAW,GAAA,GAAM,CAAA,GAAI5H,OAAM4G,GAAAA,EAC3BiB,GAAAA,GAAQpE,GAAAA,GAAYA,GAAAA,IAAa,GAEjCqE,GAAAA,GAAU,IAAA,CAAK,KAAKD,GAAAA,GAAS,CAAA,GAA8C,GAE3EE,GAAAA,GAAW;AACf,MAAA;QAAE,IAAA,EAAM,QAAA;QAAY,MAAA,EAAQJ;AAAO,OAAA;AACnC,MAAA;QAAE,IAAA,EAAM,QAAA;QAAY,MAAA,EAAQG;AAAO,OAAA;AACnC,MAAA;QAAE,IAAA,EAAM,QAAA;QAAY,MAAA,EAAQF;AAAQ,OAAA;AACpC,MAAA;QAAE,IAAA,EAAM,QAAA;QAAY,MAAA,EAAQE;AAAO,OAAA;AACnC,MAAA;QAAE,IAAA,EAAM,UAAA;QAAY,MAAA,EAAQH;AAAO,OAAA;AACnC,MAAA;QAAE,IAAA,EAAM,QAAA;QAAY,MAAA,EAAQG;AAAO,OAAA;AACnC,MAAA;QAAE,IAAA,EAAM,UAAA;QAAY,MAAA,EAAQF;AAAQ,OAAA;AACpC,MAAA;QAAE,IAAA,EAAM,QAAA;QAAY,MAAA,EAAQE;AAAO;KACrC,EACME,GAAAA,GAAgB,CAAC,CAAC,CAAA;AACxB,IAAA,KAAA,IAAWrP,GAAAA,IAAKoP,GAAAA,EAAUzQ,GAAAA,CAAI,IAAA,CAAK0Q,GAAAA,CAAIA,GAAAA,CAAI,MAAA,GAAS,CAAA,CAAA,GAAKrP,GAAAA,CAAE,MAAM,CAAA;AACjE,IAAA,IAAM2O,GAAAA,GAAWU,IAAIA,GAAAA,CAAI,MAAA,GAAS,CAAA,CAAA,EAE5BC,GAAAA,GAAAA,CAAexQ,GAAAA,KAA8B;AACjD,MAAA,IAAM8P,GAAAA,GAAAA,CAAO5O,GAAAA,GAAI2O,GAAAA,GAAYA,GAAAA,IAAYA,KACrCY,GAAAA,GAAS,CAAA;AACb,MAAA,OAAOA,GAAAA,GAASH,IAAS,MAAA,GAAS,CAAA,IAAKR,MAAKS,GAAAA,CAAIE,GAAAA,GAAS,CAAA,CAAA,IAAI9L,GAAAA,EAAAA;AAC7D,MAAA,IAAM+L,GAAAA,GAAQZ,GAAAA,GAAKS,GAAAA,CAAIE,GAAAA,GACjBE,GAAAA,GAAML,GAAAA,CAASG,GAAAA,CAAAA,EACf1P,MAAI4P,GAAAA,CAAI,MAAA,GAAS,CAAA,GAAID,GAAAA,GAAQC,IAAI,MAAA,GAAS,CAAA;AAChD,MAAA,QAAQA,IAAI,IAAA;QACV,KAAK,QAAA;AACH,UAAA,OAAO;YAAE,CAAA,EAAGtI,GAAAA,GAAAA,CAAM,GAAA,GAAM,CAAA,GAAIA,GAAAA,IAAMtH,GAAAA;YAAG,CAAA,EAAG,CAAA;YAAG,EAAA,EAAI,CAAA;YAAG,EAAA,EAAI;AAAG,WAAA;AAC3D,QAAA,KAAK,QAAA,EAAU;AACb,UAAA,IAAM6P,MAAM,CAAC,IAAA,CAAK,KAAK,CAAA,GAAS,IAAA,CAAK,KAAK,CAAA,GAAf7P,GAAAA;AAC3B,UAAA,OAAO;AACL,YAAA,CAAA,EAAI,GAAA,GAAMsH,GAAAA,GAAMA,GAAAA,GAAK,IAAA,CAAK,IAAIuI,GAAG,CAAA;AACjC,YAAA,CAAA,EAAGrI,GAAAA,GAAKA,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAIqI,GAAG,CAAA;YACzB,EAAA,EAAI,IAAA,CAAK,IAAIA,GAAG,CAAA;YAChB,EAAA,EAAI,IAAA,CAAK,IAAIA,GAAG;AAClB,WAAA;AACF,QAAA;QACA,KAAK,QAAA;AACH,UAAA,OAAO;YAAE,CAAA,EAAG,GAAA;YAAK,CAAA,EAAGrI,GAAAA,GAAAA,CAAM,GAAA,GAAM,CAAA,GAAIA,GAAAA,IAAMxH,GAAAA;YAAG,EAAA,EAAI,CAAA;YAAG,EAAA,EAAI;AAAE,WAAA;AAC5D,QAAA,KAAK,QAAA,EAAU;AACb,UAAA,IAAM6P,GAAAA,GAAW,IAAA,CAAK,EAAA,GAAK,CAAA,GAAf7P,GAAAA;AACZ,UAAA,OAAO;AACL,YAAA,CAAA,EAAI,GAAA,GAAMsH,GAAAA,GAAMA,GAAAA,GAAK,IAAA,CAAK,IAAIuI,GAAG,CAAA;AACjC,YAAA,CAAA,EAAI,GAAA,GAAMrI,GAAAA,GAAMA,GAAAA,GAAK,IAAA,CAAK,IAAIqI,GAAG,CAAA;YACjC,EAAA,EAAI,IAAA,CAAK,IAAIA,GAAG,CAAA;YAChB,EAAA,EAAI,IAAA,CAAK,IAAIA,GAAG;AAClB,WAAA;AACF,QAAA;QACA,KAAK,UAAA;AACH,UAAA,OAAO;AAAE,YAAA,CAAA,EAAI,GAAA,GAAMvI,GAAAA,GAAAA,CAAO,GAAA,GAAM,CAAA,GAAIA,GAAAA,IAAMtH,GAAAA;YAAG,CAAA,EAAG,GAAA;YAAK,EAAA,EAAI,CAAA;YAAG,EAAA,EAAI;AAAE,WAAA;AACpE,QAAA,KAAK,QAAA,EAAU;AACb,UAAA,IAAM6P,MAAM,IAAA,CAAK,EAAA,GAAK,CAAA,GAAS,IAAA,CAAK,KAAK,CAAA,GAAf7P,GAAAA;AAC1B,UAAA,OAAO;AACL,YAAA,CAAA,EAAGsH,GAAAA,GAAKA,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAIuI,GAAG,CAAA;AACzB,YAAA,CAAA,EAAI,GAAA,GAAMrI,GAAAA,GAAMA,GAAAA,GAAK,IAAA,CAAK,IAAIqI,GAAG,CAAA;YACjC,EAAA,EAAI,IAAA,CAAK,IAAIA,GAAG,CAAA;YAChB,EAAA,EAAI,IAAA,CAAK,IAAIA,GAAG;AAClB,WAAA;AACF,QAAA;QACA,KAAK,UAAA;AACH,UAAA,OAAO;YAAE,CAAA,EAAG,CAAA;AAAG,YAAA,CAAA,EAAI,GAAA,GAAMrI,GAAAA,GAAAA,CAAO,GAAA,GAAM,CAAA,GAAIA,GAAAA,IAAMxH,GAAAA;YAAG,EAAA,EAAI,EAAA;YAAI,EAAA,EAAI;AAAE,WAAA;AACnE,QAAA,KAAK,QAAA,EAAU;AACb,UAAA,IAAM6P,GAAAA,GAAM,IAAA,CAAK,EAAA,GAAU,IAAA,CAAK,KAAK,CAAA,GAAf7P,GAAAA;AACtB,UAAA,OAAO;AACL,YAAA,CAAA,EAAGsH,GAAAA,GAAKA,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAIuI,GAAG,CAAA;AACzB,YAAA,CAAA,EAAGrI,GAAAA,GAAKA,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAIqI,GAAG,CAAA;YACzB,EAAA,EAAI,IAAA,CAAK,IAAIA,GAAG,CAAA;YAChB,EAAA,EAAI,IAAA,CAAK,IAAIA,GAAG;AAClB,WAAA;AACF,QAAA;AACF;AACA,MAAA,OAAO;QAAE,CAAA,EAAG,CAAA;QAAG,CAAA,EAAG,CAAA;QAAG,EAAA,EAAI,CAAA;QAAG,EAAA,EAAI;AAAG,OAAA;AACrC,IAAA,CAAA,EAOMC,MAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAIpI,GAAAA,CAAI,KAAA,EAAO,CAAC,CAAC,KAAK,CAAA,GAAIqC,GAAAA,CAAAA,EACnDgG,GAAAA,GAAAA,CAAU9Q,KAAWe,GAAAA,KAAsB;AAC/C,MAAA,IAAI8P,GAAAA,KAAU,GAAG,OAAO5K,GAAAA;AACxB,MAAA,IAAM5E,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAI6E,GAAAA,GAAI,EAAE,CAAA,GAAI,EAAA;AAC7B,MAAA,OAAO,EAAA,GAAA,CAAMD,GAAAA,GAAI,EAAA,KAAO,CAAA,GAAI5E,GAAAA,GAAIwP,GAAAA,CAAAA;AAClC,IAAA,CAAA,EAEIE,KACAC,GAAAA,GAAmBR,GAAAA;AACvB,IAAA,IAAIK,GAAAA,KAAU,CAAA,EACZI,GAAAA,GAAW;AACT,MAAA,CAAA,EAAA,EAAK5I,GAAAA,CAAAA,EAAAA,CAAAA;AACL,MAAA,CAAA,EAAA,EAAK,MAAMA,GAAAA,CAAAA,EAAAA,CAAAA;AACX,MAAA,CAAA,EAAA,EAAKA,GAAAA,CAAAA,CAAAA,EAAME,GAAAA,CAAAA,WAAAA,EAAgBA,GAAAA,CAAAA,CAAAA;AAC3B,MAAA,CAAA,MAAA,EAAS,MAAMA,GAAAA,CAAAA,CAAAA;AACf,MAAA,CAAA,EAAA,EAAKF,GAAAA,CAAAA,CAAAA,EAAME,GAAAA,CAAAA,OAAAA,EAAY,MAAMF,GAAAA,CAAAA,IAAAA,CAAAA;AAC7B,MAAA,CAAA,EAAA,EAAKA,GAAAA,CAAAA,IAAAA,CAAAA;AACL,MAAA,CAAA,EAAA,EAAKA,GAAAA,CAAAA,CAAAA,EAAME,GAAAA,CAAAA,SAAAA,EAAc,MAAMA,GAAAA,CAAAA,CAAAA;AAC/B,MAAA,CAAA,IAAA,EAAOA,GAAAA,CAAAA,CAAAA;AACP,MAAA,CAAA,EAAA,EAAKF,GAAAA,CAAAA,CAAAA,EAAME,GAAAA,CAAAA,OAAAA,EAAYF,GAAAA,CAAAA,EAAAA,CAAAA;AACvB,MAAA;AACF,KAAA,CAAE,KAAK,GAAG,CAAA;AACL,SAAA;AAEL,MAAA,IACM6I,MAAwC,EAAC;AAC/C,MAAA,KAAA,IAASjQ,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI,GAAA,EAAGF,GAAAA,EAAAA,EAAK;AAE1B,QAAA,IAAMoQ,GAAAA,GAAKX,GAAAA,CADGvP,GAAAA,GAAI,GAAA,GAAK4O,GACI,CAAA;AAC3B,QAAA7P,IAAU,IAAA,CAAK;AAAE,UAAA,CAAA,EAAGmR,GAAAA,CAAG,CAAA;AAAG,UAAA,CAAA,EAAGL,GAAAA,CAAOK,GAAAA,CAAG,CAAA,EAAGA,GAAAA,CAAG,CAAC;SAAG,CAAA;AACnD,MAAA;AACA,MAAAF,MAAWC,GAAAA,CAAU,MAAA,CAAA,CAAQlR,GAAAA,EAAKe,GAAAA,EAAG4D,QACnCyM,GAAAA,IAAOnQ,GAAAA,KAAM,CAAA,GAAI,CAAA,EAAA,EAAKY,IAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKA,IAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,GAAA,EAAMA,GAAAA,CAAE,EAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKA,GAAAA,CAAE,EAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,EAChG,EAAE,IAAI,IAAA,EAGRwP,GAAAA,GAAA,CAAoBrR,GAAAA,KAAc;AAChC,QAAA,IAAM8P,GAAAA,GAAAA,CAAO5O,GAAAA,GAAI2O,GAAAA,GAAYA,GAAAA,IAAYA,GAAAA,EACnCsB,GAAAA,GAAKX,GAAAA,CAAYV,GAAE,CAAA,EACnB5J,GAAAA,GAAIiL,GAAAA,CAAG,CAAA,EACPlL,MAAI6K,GAAAA,CAAOK,GAAAA,CAAG,CAAA,EAAGA,GAAAA,CAAG,CAAC,CAAA,EACrBG,GAAAA,GAAMzB,GAAAA,GAAW,GAAA,EACjBpJ,GAAAA,GAAI+J,GAAAA,CAAYV,GAAAA,GAAKwB,GAAG,CAAA,EACxB/N,GAAAA,GAAIiN,GAAAA,CAAYV,MAAKwB,GAAG,CAAA,EACxBC,GAAAA,GAAK9K,GAAAA,CAAE,CAAA,EAAG+K,GAAAA,GAAKV,GAAAA,CAAOrK,GAAAA,CAAE,CAAA,EAAGA,GAAAA,CAAE,CAAC,CAAA,EAC9BgL,GAAAA,GAAKlO,GAAAA,CAAE,CAAA,EAAGmO,GAAAA,GAAKZ,IAAOvN,GAAAA,CAAE,CAAA,EAAGA,GAAAA,CAAE,CAAC,CAAA,EAC9BoO,GAAAA,GAAAA,CAAMF,GAAAA,GAAKF,GAAAA,IAAMtC,KACjB2C,GAAAA,GAAAA,CAAMF,GAAAA,GAAKF,GAAAA,IAAMrC,GAAAA,EACjB0C,GAAAA,GAAK,IAAA,CAAK,KAAA,CAAMF,GAAAA,EAAIC,GAAE,CAAA,IAAK,CAAA;AACjC,QAAA,OAAO;UAAE,CAAA,EAAApN,GAAAA;UAAG,CAAA,EAAAmE,GAAAA;AAAG,UAAA,EAAA,EAAIiJ,GAAAA,GAAKC,GAAAA;AAAI,UAAA,EAAA,EAAI,CAACF,GAAAA,GAAKE;AAAG,SAAA;AAC3C,MAAA,CAAA;AACF,IAAA;AAGA,IAAA,OAAO;MADwB,QAAA,EAAAZ,GAAAA;MAAU,WAAA,EAAaD,GAAAA;MAAkB,QAAA,EAAA/K;AACjE,KAAA;AACT,EAAA,CAAA;EACA,QAAA,EAAUgC,GAAAA;EACV,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE;AACjD,CAAA;ACrKA,SAAgB6J,EAAAA,CAAe9R,GAAAA,EAA2Be,GAAAA,EAAc4D,GAAAA,EAA2B;AACjG,EAAA,IAAMsK,GAAAA,GAAK,GAAA,GAAMC,GAAAA,EACXC,GAAAA,GAAK,GAAA,GAAMC,GAAAA,EACXI,GAAAA,GAAoB,EAAC,EACrBC,GAAAA,GAAuB,CAAC,CAAC,CAAA;AAC/B,EAAA,KAAA,IAASxO,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIsO,GAAAA,CAAM,QAAQxO,GAAAA,EAAAA,EAAK;AACrC,IAAA,IAAM0F,GAAAA,GAAI8I,GAAAA,CAAMtO,GAAAA,CAAAA,EACVsC,GAAAA,GAAIgM,GAAAA,CAAAA,CAAOtO,GAAAA,GAAI,CAAA,IAAKsO,GAAAA,CAAM,MAAA,CAAA,EAC1BG,GAAAA,GAAAA,CAAMnM,IAAE,CAAA,CAAA,GAAKkD,GAAAA,CAAE,CAAA,CAAA,IAAMwI,GAAAA,EACrBU,GAAAA,GAAAA,CAAMpM,GAAAA,CAAE,CAAA,CAAA,GAAKkD,GAAAA,CAAE,CAAA,CAAA,IAAM0I,GAAAA,EACrBS,GAAAA,GAAM,IAAA,CAAK,KAAA,CAAMF,KAAIC,GAAE,CAAA;AAC7BH,IAAAA,GAAAA,CAAQ,IAAA,CAAKI,GAAG,CAAA,EAChBH,GAAAA,CAAW,IAAA,CAAKA,GAAAA,CAAWA,GAAAA,CAAW,MAAA,GAAS,CAAA,CAAA,GAAKG,GAAG,CAAA;AACzD,EAAA;AACA,EAAA,IAAMC,GAAAA,GAAWJ,GAAAA,CAAWA,GAAAA,CAAW,MAAA,GAAS,CAAA,CAAA;AAwBhD,EAAA,OAAO;AAAE,IAAA,QAAA,EAvBQ,CAAA,EAAA,EAAKF,GAAAA,CAAM,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAAA,EAAMA,GAAAA,CAAM,CAAA,CAAA,CAAG,CAAA,CAAA,MAC5CA,GAAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA,CAAA,CAAK,CAACrJ,GAAAA,EAAGD,GAAAA,CAAAA,KAAO,CAAA,EAAA,EAAKC,GAAAA,CAAAA,CAAAA,EAAKD,GAAAA,CAAAA,CAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAsBzC,IAAA,WAAA,EAAA,CArBElF,GAAAA,KAA8B;AACjD,MAAA,IAAM+O,GAAAA,GAAAA,CAAO5O,GAAAA,GAAI2O,GAAAA,GAAYA,GAAAA,IAAYA,GAAAA;AACzC,MAAA,KAAA,IAAS5O,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIuO,GAAAA,CAAQ,QAAQzO,GAAAA,EAAAA,EAAK;AACvC,QAAA,IAAMgP,GAAAA,GAAWN,IAAWxO,GAAAA,CAAAA;AAE5B,QAAA,IAAI6O,GAAAA,IADWL,GAAAA,CAAWxO,GAAAA,GAAI,CAAA,IACX,IAAA,EAAM;AACvB,UAAA,IAAMF,GAAAA,GAAIyO,GAAAA,CAAQvO,GAAAA,CAAAA,GAAK,CAAA,GAAA,CAAK6O,GAAAA,GAAKC,GAAAA,IAAYP,GAAAA,CAAQvO,GAAAA,CAAAA,GAAK,CAAA,EACpDwF,GAAAA,GAAI8I,IAAMtO,GAAAA,CAAAA,EACVsC,GAAAA,GAAIgM,GAAAA,CAAAA,CAAOtO,GAAAA,GAAI,CAAA,IAAKsO,GAAAA,CAAM,MAAA,CAAA,EAC1BrJ,GAAAA,GAAIO,GAAAA,CAAE,CAAA,CAAA,GAAA,CAAMlD,GAAAA,CAAE,CAAA,CAAA,GAAKkD,IAAE,CAAA,CAAA,IAAM1F,GAAAA,EAC3BkF,GAAAA,GAAIQ,GAAAA,CAAE,CAAA,CAAA,GAAA,CAAMlD,GAAAA,CAAE,CAAA,CAAA,GAAKkD,GAAAA,CAAE,CAAA,CAAA,IAAM1F,GAAAA,EAC3BiP,GAAAA,GAAAA,CAAMzM,GAAAA,CAAE,CAAA,CAAA,GAAKkD,GAAAA,CAAE,CAAA,CAAA,IAAMwI,GAAAA,EACrBrC,GAAAA,GAAAA,CAAMrJ,GAAAA,CAAE,CAAA,IAAKkD,GAAAA,CAAE,CAAA,CAAA,IAAM0I,GAAAA,EACrBlG,GAAAA,GAAK,IAAA,CAAK,KAAA,CAAM+G,GAAAA,EAAIpD,GAAE,CAAA,IAAK,CAAA;AAGjC,UAAA,OAAO;YAAE,CAAA,EAAAxL,GAAAA;YAAG,CAAA,EAAAC,GAAAA;AAAG,YAAA,EAAA,EAFJuL,GAAAA,GAAK3D,GAAAA;AAEG,YAAA,EAAA,EADR,CAAC+G,GAAAA,GAAK/G;AACK,WAAA;AACxB,QAAA;AACF,MAAA;AACA,MAAA,OAAO;QAAE,CAAA,EAAGsG,GAAAA,CAAM,CAAA,CAAA,CAAG,CAAA,CAAA;QAAI,CAAA,EAAGA,GAAAA,CAAM,CAAA,CAAA,CAAG,CAAA,CAAA;QAAI,EAAA,EAAI,CAAA;QAAG,EAAA,EAAI;AAAG,OAAA;AACzD,IAAA,CAAA;IACgC,QAAA,EAAArO;AAAS,GAAA;AAC3C;AClCA,IAAM6Q,CAAAA,GAAoC;AACxC,EAAA,CAAC,GAAG,CAAC,CAAA;AAAG,EAAA,CAAC,KAAK,CAAC,CAAA;AAAG,EAAA,CAAC,KAAK,GAAG,CAAA;AAAG,EAAA,CAAC,GAAG,GAAG;AACvC,CAAA;AAFA,IAIMC,EAAAA,GAAqC;AACzC,EAAA,KAAA,EAAA,CAAQhS,GAAAA,EAAQe,GAAAA,EAAM4D,GAAAA,KAEbmN,GADQ3J,GAAAA,EAAQ,QAAA,IAAYA,GAAAA,CAAO,QAAA,CAAS,UAAU,CAAA,GAAKA,GAAAA,CAAO,QAAA,GAAW4J,CAAAA,EACvD7C,KAAME,GAAI,CAAA;EAEzC,QAAA,EAAU,EAAE,UAAU2C,CAAAA,EAAc;EACpC,MAAA,EAAQ;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;AAAE;AACjD,CAAA;AAXA,ICQM9J,EAAAA,GAAmC;EACvC,GAAA,EAAK,KAAA;EACL,KAAA,EAAO,IAAA;EACP,MAAA,EAAQ,KAAA;EACR,IAAA,EAAM,IAAA;EACN,OAAA,EAAS,EAAA;EACT,UAAA,EAAY;AACd,CAAA;ADfA,ICoBMgK,CAAAA,GAAe,IAAA;AAKrB,SAASC,GACPlS,GAAAA,EACAe,GAAAA,EACA4D,KACAH,GAAAA,EACAvD,GAAAA,EACAwF,KACAkC,GAAAA,EACoB;AACpB,EAAA,IAAIwJ,GAAAA,KAAS,MAAA,EAAQ,OAAO,CAACC,GAAG,CAAA;AAChC,EAAA,IAAMC,MAAOF,GAAAA,KAAS,KAAA,GAAQ,IAAI,EAAA,EAC5BzC,GAAAA,GAAK0C,IAAI,CAAA,CAAA,GAAKzH,GAAAA,CAAM,CAAA,GACpBgF,GAAAA,GAAKyC,GAAAA,CAAI,CAAA,CAAA,GAAKzH,GAAAA,CAAM,CAAA,CAAA,EACpBiF,GAAAA,GAAM,IAAA,CAAK,KAAA,CAAMF,KAAIC,GAAE,CAAA,IAAK,GAC5BgC,GAAAA,GAAKjC,GAAAA,GAAKE,KACVgC,GAAAA,GAAKjC,GAAAA,GAAKC,KACV0C,GAAAA,GAAAA,CAAM3H,GAAAA,CAAM,CAAA,CAAA,GAAKyH,GAAAA,CAAI,CAAA,CAAA,IAAM,CAAA,EAC3BG,OAAM5H,GAAAA,CAAM,CAAA,CAAA,GAAKyH,GAAAA,CAAI,CAAA,CAAA,IAAM,CAAA,EAC3B/C,MAAKiD,GAAAA,GAAKE,GAAAA,GAAWH,MAAOI,GAAAA,GAAOR,CAAAA,EACnC3C,GAAAA,GAAKiD,GAAAA,GAAKG,MAAWL,GAAAA,GAAOI,GAAAA,GAAOR,GACnCU,GAAAA,GAAOF,GAAAA,GAAO,KAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAIR,CAAAA,GAAeA,CAAY,CAAC,CAAA,EACpEW,GAAAA,GAAuB,CAACN,GAAAA,GAAKX,GAAAA,GAAKgB,KAAMJ,GAAAA,GAAKX,GAAAA,GAAKe,GAAI,CAAA,EACtDE,GAAAA,GAAuB,CAACP,GAAAA,GAAKX,GAAAA,GAAKgB,KAAMJ,GAAAA,GAAKX,GAAAA,GAAKe,GAAI,CAAA,EACtDG,MAAyB,CAC7BR,GAAAA,GAAKE,MAAWH,GAAAA,IAAQI,GAAAA,GAAOA,MAAQ,IAAA,CAAA,EACvCF,GAAAA,GAAKG,GAAAA,GAAWL,GAAAA,IAAQI,MAAOA,GAAAA,GAAQ,IAAA,CACzC,GACMjO,GAAAA,GAAI,IAAA,CAAK,MAAMoO,GAAAA,CAAG,CAAA,CAAA,GAAKvD,GAAAA,EAAIuD,IAAG,CAAA,CAAA,GAAKtD,GAAE,CAAA,EACrCyD,GAAAA,GAAK,KAAK,KAAA,CAAMH,GAAAA,CAAG,CAAA,CAAA,GAAKtD,GAAAA,EAAIsD,IAAG,CAAA,CAAA,GAAKvD,GAAE,CAAA,EACtC2D,GAAAA,GAAK,KAAK,KAAA,CAAMH,GAAAA,CAAG,CAAA,CAAA,GAAKvD,KAAIuD,GAAAA,CAAG,CAAA,IAAKxD,GAAE,CAAA,EACtC4D,MAAQ,IAAA,CAAK,KAAA,CAAMH,GAAAA,CAAK,CAAA,IAAKxD,GAAAA,EAAIwD,GAAAA,CAAK,CAAA,CAAA,GAAKzD,GAAE,GAE7C6D,GAAAA,GAAM,IAAA,CAAK,EAAA,GAAK,CAAA,EAChBC,QAAkBF,GAAAA,GAAQF,GAAAA,IAAMG,MAAMA,GAAAA,IAAOA,GAAAA,EAC7CE,QAAiBJ,GAAAA,GAAKD,GAAAA,IAAMG,MAAMA,GAAAA,IAAOA,GAAAA,EAEzCG,MAAQF,GAAAA,GAAgBC,GAAAA,GAAeA,MAAeA,GAAAA,GAAeF,GAAAA,EAErEI,MAA0B,EAAC;AACjC,EAAA1T,GAAAA,CAAI,KAAKgT,GAAE,CAAA;AACX,EAAA,KAAA,IAAS3R,GAAAA,GAAI,CAAA,EAAGA,GAAAA,IAAKsS,GAAAA,EAAYvT,GAAAA,EAAAA,EAAK;AAEpC,IAAA,IAAMwT,GAAAA,GAAIT,GAAAA,GADA9R,GAAAA,GAAIsS,GAAAA,GACCF,GAAAA;AACf,IAAAzT,GAAAA,CAAI,IAAA,CAAK,CAACyP,GAAAA,GAAK7K,MAAI,IAAA,CAAK,GAAA,CAAIgP,GAAC,CAAA,EAAGlE,MAAK9K,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAIgP,GAAC,CAAC,CAAC,CAAA;AACvD,EAAA;AAEA,EAAA,OADAF,GAAAA,CAAI,IAAA,CAAKlB,GAAG,CAAA,EACLkB,GAAAA;AACT;AAEA,IAAMG,EAAAA,GAAmC;EACvC,KAAA,EAAA,CAAQzT,GAAAA,EAAQe,GAAAA,EAAM4D,GAAAA,KAAS;AAC7B,IAAA,IAAM8D,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/B3D,MAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAIiE,IAAI,OAAA,EAAS,EAAE,CAAC,CAAA,EACzCuF,GAAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAMvF,GAAAA,CAAI,UAAU,CAAC,CAAA,EAE1CiL,MAAuB,CAAC,CAAA,EAAG,CAAC,CAAA,EAC5BC,GAAAA,GAAuB,CAAC,GAAA,EAAK,CAAC,GAC9BC,GAAAA,GAAuB,CAAC,KAAK,GAAG,CAAA,EAChCC,MAAuB,CAAC,CAAA,EAAG,GAAG,CAAA,EAC9BtE,GAAAA,GAA4B,CAACmE,GAAE,CAAA;AASrC,IAAA,OARAnE,IAAM,IAAA,CAAK,GAAG2C,GAAawB,GAAAA,EAAIC,GAAAA,EAAK,GAAG,EAAA,EAAIlL,GAAAA,CAAI,GAAA,EAAQjE,GAAAA,EAAGwJ,GAAC,CAAC,CAAA,EAC5DuB,IAAM,IAAA,CAAK,GAAG2C,GAAayB,GAAAA,EAAIC,GAAAA,EAAK,CAAA,EAAI,CAAA,EAAGnL,IAAI,KAAA,EAAQjE,GAAAA,EAAGwJ,GAAC,CAAC,CAAA,EAC5DuB,IAAM,IAAA,CAAK,GAAG2C,EAAAA,CAAa0B,GAAAA,EAAIC,KAAK,CAAA,EAAI,CAAA,EAAGpL,IAAI,MAAA,EAAQjE,GAAAA,EAAGwJ,GAAC,CAAC,CAAA,EAC5DuB,GAAAA,CAAM,IAAA,CAAK,GAAG2C,EAAAA,CAAa2B,GAAAA,EAAIH,KAAI,EAAA,EAAK,CAAA,EAAGjL,IAAI,IAAA,EAAQjE,GAAAA,EAAGwJ,GAAC,CAAC,GAExDuB,GAAAA,CAAM,MAAA,GAAS,KAAKA,GAAAA,CAAMA,GAAAA,CAAM,SAAS,CAAA,CAAA,CAAG,CAAA,CAAA,KAAOmE,IAAG,CAAA,CAAA,IAAMnE,IAAMA,GAAAA,CAAM,MAAA,GAAS,CAAA,CAAA,CAAG,CAAA,MAAOmE,GAAAA,CAAG,CAAA,KAChGnE,GAAAA,CAAM,GAAA,IAEDuC,EAAAA,CAAevC,GAAAA,EAAOL,KAAME,GAAI,CAAA;AACzC,EAAA,CAAA;EACA,QAAA,EAAUnH,EAAAA;EACV,MAAA,EAAQ;IAAE,GAAA,EAAK,EAAA;IAAI,KAAA,EAAO,EAAA;IAAI,MAAA,EAAQ,EAAA;IAAI,IAAA,EAAM;AAAG;AACrD,CAAA;AAvBA,ICrCMA,EAAAA,GAAuC;EAC3C,MAAA,EAAQ,EAAA;EACR,KAAA,EAAO,EAAA;EACP,OAAA,EAAS,EAAA;EACT,QAAA,EAAU,GAAA;EACV,cAAA,EAAgB,CAAA;EAChB,SAAA,EAAW,CAAA;EACX,eAAA,EAAiB,CAAA;EACjB,aAAA,EAAe,CAAA;EACf,QAAA,EAAU,CAAA;EACV,cAAA,EAAgB,CAAA;EAChB,YAAA,EAAc,CAAA;EACd,QAAA,EAAU,CAAA;EACV,OAAA,EAAS;AACX,CAAA;AAEA,SAAS6L,EAAAA,CAAU9T,GAAAA,EAAWe,GAAAA,EAAW4D,GAAAA,EAAmB;AAC1D,EAAA,IAAMtD,MAAIoF,GAAAA,GAAIlD,GAAAA;AACd,EAAA,OAAA,CAAQkD,GAAAA,GAAIlD,MAAI,IAAA,CAAK,IAAA,CAAKlC,MAAIA,GAAAA,GAAI0S,GAAAA,GAAIA,GAAC,CAAA,IAAK,CAAA;AAC9C;AAIA,SAASC,EAAAA,CAAahU,GAAAA,EAAWe,GAAAA,EAAmB4D,GAAAA,EAAcH,GAAAA,EAAyB;AACzF,EAAA,IAAIzD,GAAAA,IAAK,GAAG,OAAO,CAAA;AACnB,EAAA,IAAIA,GAAAA,IAAK,CAAA,EAAG,OAAO,CAAA,GAAI+J,GAAAA;AACvB,EAAA,IAAMmJ,GAAAA,GAAO,KAAK,GAAA,CAAI,GAAA,EAAKC,OAAa,CAAA,GAAIC,GAAAA,CAAK,GAC3CC,GAAAA,GAAO,IAAA,CAAK,IAAI,GAAA,EAAKF,GAAAA,IAAa,IAAIC,GAAAA,CAAK,CAAA,EAC3CtU,OAAa,CAAA,GAAA,CAAa,CAAA,GAAIkB,GAAAA,KAAGkT,GAAAA,MAAO,CAAA,GAAIG,GAAAA,CAAAA;AAClD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAIvU,GAAAA,EAAG,CAAA,GAAIiL,GAAO,CAAA;AAChC;AAEA,SAAgBuJ,EAAAA,CAAmBrU,GAAAA,GAA2B,EAAC,EAAuB;AACpF,EAAA,IAAMyI,GAAAA,GAAM;IAAE,GAAGR,EAAAA;IAAU,GAAGE;AAAO,GAAA,EAC/BmM,GAAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI7L,GAAAA,CAAI,MAAA,EAAQ,EAAE,CAAC,CAAA,EAC5C8L,GAAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI9L,GAAAA,CAAI,KAAA,EAAO,EAAA,GAAK,IAAA,CAAK,KAAK,CAAC,CAAA,EACvD+L,GAAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI/L,GAAAA,CAAI,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI6L,GAAAA,EAAOC,GAAI,CAAC,CAAC,CAAA,EACjEE,GAAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,GAAA,CAAIhM,GAAAA,CAAI,UAAU,IAAI,CAAC,CAAA,EACjDiM,GAAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,EAAKjM,GAAAA,CAAI,cAAc,CAAA,EACxCkM,GAAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,GAAA,CAAIlM,IAAI,SAAA,EAAW,IAAI,CAAC,CAAA,EACrDmM,GAAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAInM,GAAAA,CAAI,eAAA,EAAiB,CAAC,CAAC,CAAA,EACrDoM,GAAAA,GAAQ,KAAK,GAAA,CAAI,GAAA,EAAKpM,GAAAA,CAAI,aAAa,CAAA,EACvCqM,GAAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,GAAA,CAAIrM,GAAAA,CAAI,QAAA,EAAU,IAAI,CAAC,CAAA,EACpDsM,MAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAItM,GAAAA,CAAI,cAAA,EAAgB,CAAC,CAAC,CAAA,EACpDuM,GAAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGvM,GAAAA,CAAI,YAAY,GACrCwM,GAAAA,GAAOxM,GAAAA,CAAI,QAAA,GAAW,IAAA,CAAK,EAAA,GAAM,GAAA,EACjCuF,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,KAAA,CAAMvF,GAAAA,CAAI,OAAO,CAAC,CAAA,EAExC8G,MAA4B,EAAC;AACnC,EAAA,KAAA,IAAStO,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI+M,GAAAA,EAAGhO,GAAAA,EAAAA,EAAK;AAC1B,IAAA,IAAMwT,GAAAA,GAAKvS,GAAAA,GAAI+M,GAAAA,GAAK,CAAA,GAAI,IAAA,CAAK,IACvB9M,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,IAAKsS,MAAIyB,GAAAA,CAAI,CAAC,CAAA,EAEpCC,GAAAA,GAAAA,CAAMT,GAAAA,GAAMvT,GAAAA,IAAKuT,KAEjBU,GAAAA,GAAAA,CAAMjU,GAAAA,GAAIuT,GAAAA,KAAQ,CAAA,GAAIA,GAAAA,CAAAA,EAMtBjQ,GAAAA,GAAIsP,GALKU,GAAAA,GAAAA,CAAUF,GAAAA,GAAQE,GAAAA,IAAUR,EAAAA,CAAa,IAAA,CAAK,GAAA,CAAI,GAAGkB,GAAE,CAAA,EAAGR,GAAAA,EAAOC,GAAAA,EAAOC,GAAM,CAAA,EAC9EJ,OAAUD,GAAAA,GAAQC,GAAAA,IAAUR,EAAAA,CAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGmB,GAAE,CAAA,EAAGN,GAAAA,EAAOC,GAAAA,EAAOC,GAAM,CAAA,EAI1DC,GAAM,CAAA;AACzC,IAAAjQ,GAAAA,CAAM,IAAA,CAAK,CAAC,EAAA,GAAKP,MAAI,IAAA,CAAK,GAAA,CAAIgP,GAAC,CAAA,EAAG,KAAKhP,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAIgP,GAAC,CAAC,CAAC,CAAA;AACzD,EAAA;AACA,EAAA,OAAOjE,GAAAA;AACT;AAEA,IAAMR,GAAAA,GAA2C;EAC/C,KAAA,EAAA,CAAQ/O,KAAQe,GAAAA,EAAM4D,GAAAA,KAASmN,GAAeuC,EAAAA,CAAmBlM,GAAM,CAAA,EAAG+G,GAAAA,EAAME,GAAI,CAAA;EACpF,QAAA,EAAUnH,EAAAA;EACV,MAAA,EAAQ;IAAE,GAAA,EAAK,EAAA;IAAI,KAAA,EAAO,EAAA;IAAI,MAAA,EAAQ,EAAA;IAAI,IAAA,EAAM;AAAG;AACrD,CAAA;AAJA,IC1EMA,GAAAA,GAAyC;EAC7C,IAAA,EAAM,QAAA;EACN,KAAA,EAAO,CAAA;EACP,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,IAAA;EAAM,EAAA,EAAI,GAAA;EAAM,EAAA,EAAI,IAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EACtD,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,GAAA,EAAK,CAAA;EAAK,GAAA,EAAK,CAAA;EACvD,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EACtD,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EAAM,GAAA,EAAK,EAAA;EAAK,GAAA,EAAK,EAAA;EACvD,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EACtD,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,GAAA,EAAK,CAAA;EAAK,GAAA,EAAK,CAAA;EACvD,QAAA,EAAU,CAAA;EACV,OAAA,EAAS;AACX,CAAA;AAIA,SAAgBmN,EAAAA,CAAmBpV,GAAAA,GAA6B,EAAC,EAAa;AAC5E,EAAA,IAAMyI,GAAAA,GAAM;IAAE,GAAGR,GAAAA;IAAU,GAAGE;AAAO,GAAA,EAC/BkN,GAAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM5M,GAAAA,CAAI,KAAK,CAAA,EAAA,EAA4B,CAAC,GAC9E6M,GAAAA,GAAgD;AAAC,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,KAAA;AAAM,IAAA;AAAK,GAAA,EAC9GC,GAAAA,GAAgD;AAAC,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,KAAA;AAAM,IAAA;AAAK,GAAA,EAC9GC,GAAAA,GAAgD;AAAC,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,KAAA;AAAM,IAAA;AAAK,GAAA,EAC9GC,MAAkB,EAAC;AACzB,EAAA,KAAA,IAASxU,MAAI,CAAA,EAAGA,GAAAA,GAAIoU,KAAOrV,GAAAA,EAAAA,EACzB2I,IAAM,IAAA,CAAK;AACT,IAAA,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAOF,GAAAA,CAAI6M,GAAAA,CAAMrU,GAAAA,CAAAA,CAAG,CAAC,CAAC,CAAA;IACjD,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,CAAOwH,IAAI8M,GAAAA,CAAMtU,GAAAA,CAAAA,CAAG,CAAC,CAAA;IACpC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAOwH,GAAAA,CAAI+M,IAAMvU,GAAAA,CAAAA,CAAAA,IAAO,CAAC,CAAC;GAC1C,CAAA;AASH,EAAA,OAPAwU,IAAM,IAAA,CAAA,CAAMzV,KAAGe,GAAAA,KAAM0F,GAAAA,CAAE,IAAIlD,GAAAA,CAAE,CAAC,CAAA,EAC9BoF,GAAAA,CAAM,CAAA,CAAA,CAAG,CAAA,GAAI,GACbA,GAAAA,CAAM0M,GAAAA,GAAQ,CAAA,CAAA,CAAG,CAAA,GAAI,CAAA,EACjB5M,GAAAA,CAAI,SAAS,UAAA,KACfE,GAAAA,CAAM0M,MAAQ,CAAA,CAAA,CAAG,IAAII,GAAAA,CAAM,CAAA,EAAG,CAAA,EAC9B9M,GAAAA,CAAM0M,MAAQ,CAAA,CAAA,CAAG,IAAII,GAAAA,CAAM,CAAA,EAAG,CAAA,CAAA,EAEzBA,GAAAA;AACT;AAOA,SAASC,GAAiB1V,GAAAA,EAA6B;AACrD,EAAA,IAAM2E,MAAIgR,GAAAA,CAAQ,MAAA,GAAS,CAAA,EACrB5Q,GAAAA,GAAkB,MAAMJ,GAAC,CAAA;AAC/B,EAAA,KAAA,IAAS1D,GAAAA,GAAI,GAAGA,GAAAA,GAAI0D,GAAAA,EAAGH,OAAKG,GAAAA,CAAE1D,GAAAA,CAAAA,GAAK,IAAA,CAAK,IAAI,IAAA,EAAM0U,GAAAA,CAAQ1U,MAAI,CAAA,CAAA,CAAG,IAAI0U,GAAAA,CAAQ1U,GAAAA,EAAG,CAAC,CAAA;AAMjF,EAAA,IAAMwF,MAAkB,KAAA,CAAM9B,GAAAA,GAAI,CAAC,CAAA,EAC7BpB,GAAAA,GAAkB,MAAMoB,GAAAA,GAAI,CAAC,CAAA,EAC7B1E,GAAAA,GAAkB,MAAM0E,GAAAA,GAAI,CAAC,GAC7BtD,GAAAA,GAAkB,KAAA,CAAMsD,MAAI,CAAC,CAAA;AACnC,EAAAH,GAAAA,CAAE,CAAA,CAAA,GAAK,CAAA,EACPvD,GAAAA,CAAE,CAAA,CAAA,GAAK8D,GAAAA,CAAE,CAAA,CAAA,GAAK,CAAA,EACd0B,GAAAA,CAAE,CAAA,CAAA,GAAK1B,GAAAA,CAAE,CAAA,CAAA,GAAK,CAAA,EACd4D,GAAAA,CAAE,CAAA,CAAA,GAAA,CAAMgN,GAAAA,CAAQ,CAAA,CAAA,CAAG,CAAA,GAAIA,GAAAA,CAAQ,CAAA,CAAA,CAAG,CAAA,IAAK5Q,IAAE,CAAA,CAAA;AACzC,EAAA,KAAA,IAAS9D,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI0D,GAAAA,EAAGzD,GAAAA,EAAAA,EACrBsD,GAAAA,CAAEvD,GAAAA,CAAAA,GAAK8D,GAAAA,CAAE9D,GAAAA,GAAI,CAAA,CAAA,GAAK,CAAA,EAClBA,GAAAA,CAAEA,GAAAA,CAAAA,GAAAA,CAAM8D,GAAAA,CAAE9D,GAAAA,GAAI,CAAA,CAAA,GAAK8D,GAAAA,CAAE9D,GAAAA,CAAAA,IAAM,CAAA,EAC3BwF,GAAAA,CAAExF,GAAAA,CAAAA,GAAK8D,GAAAA,CAAE9D,GAAAA,CAAAA,GAAK,CAAA,EACd0H,GAAAA,CAAE1H,GAAAA,CAAAA,GAAAA,CAAM0U,GAAAA,CAAQ1U,GAAAA,GAAI,CAAA,CAAA,CAAG,CAAA,GAAI0U,GAAAA,CAAQ1U,GAAAA,CAAAA,CAAG,CAAA,IAAK8D,GAAAA,CAAE9D,GAAAA,CAAAA,GAAAA,CAAM0U,GAAAA,CAAQ1U,GAAAA,CAAAA,CAAG,CAAA,GAAI0U,GAAAA,CAAQ1U,GAAAA,GAAI,CAAA,CAAA,CAAG,CAAA,IAAK8D,GAAAA,CAAE9D,GAAAA,GAAI,CAAA,CAAA;AAE9F,EAAAuD,GAAAA,CAAEG,GAAAA,CAAAA,GAAKI,GAAAA,CAAEJ,MAAI,CAAA,CAAA,GAAK,CAAA,EAClB1D,GAAAA,CAAE0D,GAAAA,CAAAA,GAAKI,GAAAA,CAAEJ,GAAAA,GAAI,CAAA,IAAK,CAAA,EAClB8B,GAAAA,CAAE9B,GAAAA,CAAAA,GAAK,GACPgE,GAAAA,CAAEhE,GAAAA,CAAAA,GAAK,EAAEgR,IAAQhR,GAAAA,CAAAA,CAAG,CAAA,GAAIgR,GAAAA,CAAQhR,MAAI,CAAA,CAAA,CAAG,CAAA,CAAA,GAAKI,GAAAA,CAAEJ,MAAI,CAAA,CAAA;AAElD,EAAA,KAAA,IAAS1D,GAAAA,GAAI,CAAA,EAAGA,GAAAA,IAAK0D,GAAAA,EAAG3E,GAAAA,EAAAA,EAAK;AAC3B,IAAA,IAAMqR,MAAI5K,GAAAA,CAAExF,GAAAA,CAAAA,GAAKsC,GAAAA,CAAEtC,MAAI,CAAA,CAAA;AACvB,IAAAA,GAAAA,CAAEA,GAAAA,CAAAA,IAAMoQ,GAAAA,GAAIpR,IAAEgB,GAAAA,GAAI,CAAA,CAAA,EAClB0H,GAAAA,CAAE1H,GAAAA,CAAAA,IAAMoQ,GAAAA,GAAIhQ,GAAAA,CAAEJ,MAAI,CAAA,CAAA;AACpB,EAAA;AACA,EAAA,IAAM2U,GAAAA,GAAkB,KAAA,CAAMjR,GAAAA,GAAI,CAAC,CAAA;AACnC,EAAAzD,IAAEyD,GAAAA,CAAAA,GAAKtD,IAAEsD,GAAAA,CAAAA,GAAKpB,IAAEoB,GAAAA,CAAAA;AAChB,EAAA,KAAA,IAAS1D,GAAAA,GAAI0D,MAAI,CAAA,EAAG1D,GAAAA,IAAK,GAAGjB,GAAAA,EAAAA,EAAKkB,IAAED,GAAAA,CAAAA,GAAAA,CAAMI,IAAEJ,GAAAA,CAAAA,GAAKhB,IAAEgB,GAAAA,CAAAA,GAAK2U,IAAE3U,GAAAA,GAAI,CAAA,CAAA,IAAMsC,GAAAA,CAAEtC,GAAAA,CAAAA;AACrE,EAAA,OAAO2U,GAAAA;AACT;AAOA,SAAgBC,GAAc7V,GAAAA,EAAmC;AAC/D,EAAA,OAAO;IAAE,OAAA,EAAAA,GAAAA;AAAS,IAAA,CAAA,EAAG0V,GAAiBC,GAAO;AAAE,GAAA;AACjD;AAEA,SAAgBG,EAAAA,CAAa9V,KAAWe,GAAAA,EAAgC;AACtE,EAAA,IAAM,EAAE,SAAA4D,GAAAA,EAAS,CAAA,EAAAH,KAAA,GAAMuR,GAAAA,EACjB/H,MAAI2H,GAAAA,CAAQ,MAAA;AAClB,EAAA,IAAI3H,GAAAA,KAAM,GAAG,OAAO,CAAA;AAEpB,EAAA,IADIA,GAAAA,KAAM,CAAA,IACN9M,GAAAA,IAAKyU,GAAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,OAAOA,GAAAA,CAAQ,CAAA,CAAA,CAAG,CAAA;AACzC,EAAA,IAAIzU,GAAAA,IAAKyU,GAAAA,CAAQ3H,GAAAA,GAAI,CAAA,CAAA,CAAG,GAAG,OAAO2H,GAAAA,CAAQ3H,GAAAA,GAAI,CAAA,CAAA,CAAG,CAAA;AACjD,EAAA,IAAI/M,GAAAA,GAAI,CAAA;AACR,EAAA,OAAOA,GAAAA,GAAI+M,MAAI,CAAA,IAAK2H,GAAAA,CAAQ1U,MAAI,CAAA,CAAA,CAAG,CAAA,IAAKC,GAAAA,IAAGuF,GAAAA,EAAAA;AAC3C,EAAA,IAAMuP,GAAAA,GAAKL,GAAAA,CAAQ1U,GAAAA,CAAAA,EACb2R,GAAAA,GAAK+C,GAAAA,CAAQ1U,GAAAA,GAAI,CAAA,CAAA,EACjB8D,GAAAA,GAAI6N,GAAAA,CAAG,CAAA,GAAIoD,GAAAA,CAAG,CAAA;AACpB,EAAA,IAAIjR,GAAAA,IAAK,CAAA,EAAG,OAAOiR,GAAAA,CAAG,CAAA;AACtB,EAAA,IAAMC,GAAAA,GAAAA,CAAKrD,GAAAA,CAAG,CAAA,GAAI1R,GAAAA,IAAK6D,GAAAA,EACjBmR,OAAKhV,GAAAA,GAAI8U,GAAAA,CAAG,CAAA,IAAKjR,GAAAA,EAKjBoR,GAAAA,GAAAA,CAAUF,GAAAA,GAAIA,MAAIA,GAAAA,GAAIA,GAAAA,IAAKlR,GAAAA,GAAIA,GAAAA,GAAK,CAAA,EACpCqR,GAAAA,GAAAA,CAAUF,MAAIA,GAAAA,GAAIA,GAAAA,GAAIA,GAAAA,IAAKnR,GAAAA,GAAIA,GAAAA,GAAK,CAAA;AAG1C,EAAA,OAFiBkR,MAAID,GAAAA,CAAG,CAAA,GAAIE,GAAAA,GAAItD,GAAAA,CAAG,KACbuD,GAAAA,GAAQP,GAAAA,CAAE3U,GAAAA,CAAAA,GAAK+U,IAAG,CAAA,GAAII,GAAAA,GAAQR,IAAE3U,GAAAA,GAAI,CAAA,IAAK2R,GAAAA,CAAG,CAAA,CAAA;AAEpE;AAEA,IAAMyD,EAAAA,GAA+C;EACnD,KAAA,EAAA,CAAQrW,GAAAA,EAAQe,GAAAA,EAAM4D,GAAAA,KAAS;AAC7B,IAAA,IAAM8D,GAAAA,GAAM;MAAE,GAAGR,GAAAA;MAAU,GAAGE;KAAO,EAE/B4N,GAAAA,GAASF,EAAAA,CADCT,EAAAA,CAAmB3M,GACN,CAAO,CAAA,EAC9BwM,GAAAA,GAAOxM,GAAAA,CAAI,QAAA,GAAW,IAAA,CAAK,EAAA,GAAM,GAAA,EACjCuF,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,KAAA,CAAMvF,GAAAA,CAAI,OAAO,CAAC,CAAA,EAExC8G,GAAAA,GAA4B,EAAC,EAC7B+G,GAAAA,GAAU,IAAA,CAAK,EAAA,GAAK,CAAA;AAC1B,IAAA,KAAA,IAASrV,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI+M,GAAAA,EAAGhO,GAAAA,EAAAA,EAAK;AAC1B,MAAA,IAAMwT,GAAAA,GAAKvS,MAAI+M,GAAAA,GAAK,CAAA,GAAI,KAAK,EAAA,EACvBuI,GAAAA,GAAO/C,MAAIyB,GAAAA,EACb/T,GAAAA;AAKFA,MAAAA,GAAAA,GAJEuH,GAAAA,CAAI,IAAA,KAAS,UAAA,GAAA,CACF8N,MAAOD,GAAAA,GAAWA,GAAAA,IAAWA,GAAAA,GACjCA,GAAAA,GAEL,KAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAIC,GAAI,CAAC,CAAA;AAEjC,MAAA,IAAM/R,GAAAA,GAAIsR,EAAAA,CAAa5U,GAAAA,EAAG6U,GAAM,CAAA;AAChC,MAAA7U,GAAAA,CAAM,IAAA,CAAK,CAAC,EAAA,GAAKsD,MAAI,IAAA,CAAK,GAAA,CAAIgP,GAAC,CAAA,EAAG,KAAKhP,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAIgP,GAAC,CAAC,CAAC,CAAA;AACzD,IAAA;AACA,IAAA,OAAO1B,EAAAA,CAAevC,GAAAA,EAAOL,GAAAA,EAAME,GAAI,CAAA;AACzC,EAAA,CAAA;EACA,QAAA,EAAUnH,GAAAA;EACV,MAAA,EAAQ;IAAE,GAAA,EAAK,EAAA;IAAI,KAAA,EAAO,EAAA;IAAI,MAAA,EAAQ,EAAA;IAAI,IAAA,EAAM;AAAG;AACrD,CAAA;AA3BA,ICjIMA,EAAAA,GAA0C;EAC9C,IAAA,EAAM,QAAA;EACN,KAAA,EAAO,CAAA;EACP,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,IAAA;EAAM,EAAA,EAAI,GAAA;EAAM,EAAA,EAAI,IAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EACtD,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,GAAA,EAAK,CAAA;EAAK,GAAA,EAAK,CAAA;EACvD,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EACtD,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EAAM,EAAA,EAAI,EAAA;EAAM,GAAA,EAAK,EAAA;EAAK,GAAA,EAAK,EAAA;EACvD,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EACtD,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,EAAA,EAAI,CAAA;EAAM,GAAA,EAAK,CAAA;EAAK,GAAA,EAAK,CAAA;EACvD,QAAA,EAAU,CAAA;EACV,OAAA,EAAS;AACX,CAAA;AAIA,SAAgBmN,EAAAA,CAAmBpV,GAAAA,GAA8B,EAAC,EAAa;AAC7E,EAAA,IAAMyI,GAAAA,GAAM;IAAE,GAAGR,EAAAA;IAAU,GAAGE;AAAO,GAAA,EAC/BkN,GAAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM5M,GAAAA,CAAI,KAAK,CAAA,EAAA,EAA6B,CAAC,GAC/E6M,GAAAA,GAAiD;AAAC,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,KAAA;AAAM,IAAA;AAAK,GAAA,EAC/GC,GAAAA,GAAiD;AAAC,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,KAAA;AAAM,IAAA;AAAK,GAAA,EAC/GC,GAAAA,GAAiD;AAAC,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,IAAA;AAAK,IAAA,KAAA;AAAM,IAAA;AAAK,GAAA,EAC/GC,MAAkB,EAAC;AACzB,EAAA,KAAA,IAASxU,MAAI,CAAA,EAAGA,GAAAA,GAAIoU,KAAOrV,GAAAA,EAAAA,EACzB2I,IAAM,IAAA,CAAK;AACT,IAAA,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAOF,GAAAA,CAAI6M,GAAAA,CAAMrU,GAAAA,CAAAA,CAAG,CAAC,CAAC,CAAA;IACjD,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,CAAOwH,IAAI8M,GAAAA,CAAMtU,GAAAA,CAAAA,CAAG,CAAC,CAAA;IACpC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,MAAA,CAAOwH,GAAAA,CAAI+M,IAAMvU,GAAAA,CAAAA,CAAAA,IAAO,CAAC,CAAC;GAC7C,CAAA;AASH,EAAA,OAPAwU,IAAM,IAAA,CAAA,CAAMzV,KAAGe,GAAAA,KAAM0F,GAAAA,CAAE,IAAIlD,GAAAA,CAAE,CAAC,CAAA,EAC9BoF,GAAAA,CAAM,CAAA,CAAA,CAAG,CAAA,GAAI,GACbA,GAAAA,CAAM0M,GAAAA,GAAQ,CAAA,CAAA,CAAG,CAAA,GAAI,CAAA,EACjB5M,GAAAA,CAAI,SAAS,UAAA,KACfE,GAAAA,CAAM0M,MAAQ,CAAA,CAAA,CAAG,IAAII,GAAAA,CAAM,CAAA,EAAG,CAAA,EAC9B9M,GAAAA,CAAM0M,MAAQ,CAAA,CAAA,CAAG,IAAII,GAAAA,CAAM,CAAA,EAAG,CAAA,CAAA,EAEzBA,GAAAA;AACT;AAgBA,SAASe,GAAsBxW,GAAAA,EAA6B;AAC1D,EAAA,IAAMgO,GAAAA,GAAI2H,GAAAA,CAAQ,MAAA,EAGZc,GAAAA,GAAuB;IAAE,CAAA,EAAG,CAACd,GAAAA,CAAQ,CAAA,CAAA,CAAG,CAAA;IAAG,CAAA,EAAGA,GAAAA,CAAQ,CAAA,CAAA,CAAG,CAAA;IAAG,CAAA,EAAGA,GAAAA,CAAQ,CAAA,CAAA,CAAG;AAAE,GAAA,EAC5Ee,GAAAA,GAAuB;IAAE,CAAA,EAAG,CAACf,IAAQ,IAAA,CAAK,GAAA,CAAI,GAAG3H,GAAAA,GAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAG,IAAA,CAAA,EAAG2H,IAAQ,IAAA,CAAK,GAAA,CAAI,GAAG3H,GAAAA,GAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAG,IAAA,CAAA,EAAG2H,IAAQ,IAAA,CAAK,GAAA,CAAI,GAAG3H,GAAAA,GAAI,CAAC,CAAA,CAAA,CAAG;AAAE,GAAA,EAC/H2I,GAAAA,GAAwB;AAAE,IAAA,CAAA,EAAG,CAAA,GAAIhB,GAAAA,CAAQ3H,GAAAA,GAAI,CAAA,CAAA,CAAG,CAAA;IAAG,CAAA,EAAG2H,GAAAA,CAAQ3H,GAAAA,GAAI,CAAA,CAAA,CAAG,CAAA;IAAG,CAAA,EAAG2H,GAAAA,CAAQ3H,GAAAA,GAAI,CAAA,CAAA,CAAG;AAAE,GAAA,EAC5F4I,GAAAA,GAAwB;IAAE,CAAA,EAAG,CAAA,GAAIjB,IAAQ,IAAA,CAAK,GAAA,CAAI3H,MAAI,CAAA,EAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAAG,IAAA,CAAA,EAAG2H,IAAQ,IAAA,CAAK,GAAA,CAAI3H,MAAI,CAAA,EAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAAG,IAAA,CAAA,EAAG2H,IAAQ,IAAA,CAAK,GAAA,CAAI3H,MAAI,CAAA,EAAG,CAAC,CAAA,CAAA,CAAG;AAAE,GAAA;AACzI,EAAA,OAAO;AAAC0I,IAAAA,GAAAA;AAAcD,IAAAA,GAAAA;IAAc,GAAGd,GAAAA;AAASgB,IAAAA,GAAAA;AAAeC,IAAAA;AAAa,GAAA;AAC9E;AAEA,SAASC,EAAAA,CAAW7W,KAAiBe,GAAAA,EAA0B;AAE7D,EAAA,IAAMF,MAAIiW,GAAAA,GAAUC,GAAAA,GAAS,CAAA,EACvBC,GAAAA,GAAsB,MAAMnW,GAAC,CAAA;AACnC,EAAA,KAAA,IAASI,GAAAA,GAAI,GAAGA,GAAAA,IAAK8V,GAAAA,EAAQ/W,OAAKwE,GAAAA,CAAMvD,GAAAA,CAAAA,GAAK,CAAA;AAC7C,EAAA,IAAMgW,GAAAA,GAAWH,MAAUC,GAAAA,GAAS,CAAA;AACpC,EAAA,KAAA,IAAS9V,GAAAA,GAAI,CAAA,EAAGA,GAAAA,IAAKgW,GAAAA,EAAUjX,GAAAA,EAAAA,EAAKwE,GAAAA,CAAMuS,GAAAA,GAAS9V,GAAAA,CAAAA,GAAKA,GAAAA,IAAKgW,GAAAA,GAAW,CAAA,CAAA;AACxE,EAAA,KAAA,IAAShW,GAAAA,GAAIJ,GAAAA,GAAIkW,GAAAA,GAAS,CAAA,EAAG9V,GAAAA,GAAIJ,KAAGb,GAAAA,EAAAA,EAAKwE,GAAAA,CAAMvD,GAAAA,CAAAA,GAAK,CAAA;AACpD,EAAA,OAAO+V,GAAAA;AACT;AAEA,SAASE,EAAAA,CAASlX,GAAAA,EAAWe,GAAAA,EAAiB4D,GAAAA,EAAgBH,GAAAA,EAAyB;AACrF,EAAA,IAAIpD,GAAAA,IAAK4V,GAAAA,CAAMF,GAAAA,CAAAA,SAAiBA,GAAAA,GAAU,CAAA;AAC1C,EAAA,IAAI1V,GAAAA,IAAK4V,GAAAA,CAAMD,GAAAA,CAAAA,EAAS,OAAOA,GAAAA;AAC/B,EAAA,IAAII,MAAMJ,GAAAA,EACNK,GAAAA,GAAON,GAAAA,EACPO,GAAAA,GAAOF,MAAMC,GAAAA,KAAU,CAAA;AAC3B,EAAA,OAAOhW,GAAAA,GAAI4V,IAAMK,GAAAA,CAAAA,IAAQjW,OAAK4V,GAAAA,CAAMK,GAAAA,GAAM,CAAA,CAAA,IACpCjW,MAAI4V,GAAAA,CAAMK,GAAAA,IAAM5Q,GAAAA,GAAO4Q,GAAAA,GACtBpW,MAAMoW,GAAAA,EACX1O,GAAAA,GAAOwO,MAAMC,GAAAA,KAAU,CAAA;AAEzB,EAAA,OAAOC,GAAAA;AACT;AAEA,SAASC,EAAAA,CAAStX,GAAAA,EAAce,GAAAA,EAAW4D,GAAAA,EAAiBH,GAAAA,EAA0B;AACpF,EAAA,IAAMwJ,MAAkB,KAAA,CAAM+I,GAAAA,GAAS,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA,EAC1CQ,GAAAA,GAAqB,KAAA,CAAMR,MAAS,CAAC,CAAA,EACrCS,GAAAA,GAAsB,KAAA,CAAMT,MAAS,CAAC,CAAA;AAC5C,EAAA9V,GAAAA,CAAE,CAAA,CAAA,GAAK,CAAA;AACP,EAAA,KAAA,IAASwW,GAAAA,GAAI,CAAA,EAAGA,GAAAA,IAAKV,GAAAA,EAAQ7V,GAAAA,EAAAA,EAAK;AAChC,IAAAuF,GAAAA,CAAKgR,GAAAA,CAAAA,GAAKrW,GAAAA,GAAI4V,IAAMU,GAAAA,GAAO,CAAA,GAAID,GAAAA,CAAAA,EAC/B9O,IAAM8O,GAAAA,CAAAA,GAAKT,GAAAA,CAAMU,GAAAA,GAAOD,GAAAA,CAAAA,GAAKrW,GAAAA;AAC7B,IAAA,IAAIuW,GAAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,IAASnT,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIiT,GAAAA,EAAGzX,GAAAA,EAAAA,EAAK;AAC1B,MAAA,IAAMoQ,GAAAA,GAAQoH,GAAAA,CAAMhT,GAAAA,GAAI,CAAA,IAAK+S,GAAAA,CAAKE,GAAAA,GAAIjT,GAAAA,CAAAA,EAChCoT,MAAOxH,GAAAA,KAAU,CAAA,GAAI,CAAA,GAAIpC,GAAAA,CAAExJ,GAAAA,CAAAA,GAAK4L,GAAAA;AACtC,MAAAnP,GAAAA,CAAEuD,GAAAA,CAAAA,GAAKmT,GAAAA,GAAQH,GAAAA,CAAMhT,GAAAA,GAAI,CAAA,CAAA,GAAKoT,GAAAA,EAC9BpT,GAAAA,GAAQ+S,GAAAA,CAAKE,GAAAA,GAAIjT,GAAAA,CAAAA,GAAKoT,GAAAA;AACxB,IAAA;AACA,IAAA3W,GAAAA,CAAEwW,GAAAA,CAAAA,GAAKE,GAAAA;AACT,EAAA;AACA,EAAA,OAAO3J,GAAAA;AACT;AAQA,SAAgB6J,GAAa7X,GAAAA,EAAkC;AAC7D,EAAA,IAAM8X,GAAAA,GAAWtB,GAAsBb,GAAO,CAAA;AAG9C,EAAA,OAAO;IAAE,QAAA,EAAA5U,GAAAA;IAAU,KAAA,EADL8V,EAAAA,CAAWiB,GAAAA,CAAS,MAAA,EAAQ,CACvB,CAAA;IAAO,MAAA,EAAA;AAAO,GAAA;AACnC;AAEA,SAASC,EAAAA,CAAa/X,KAAWe,GAAAA,EAAgD;AAC/E,EAAA,IAAM,EAAE,QAAA,EAAA4D,GAAAA,EAAU,OAAAH,GAAAA,EAAO,MAAA,EAAAvD,KAAA,GAAW+W,GAAAA,EAC9BlB,GAAAA,GAAUgB,GAAAA,CAAS,QACnBG,GAAAA,GAAW,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG7W,GAAC,CAAC,CAAA,EACrCsW,MAAOR,EAAAA,CAASe,GAAAA,EAAUjB,KAAOD,GAAAA,EAAQD,GAAO,GAChD9I,GAAAA,GAAIsJ,EAAAA,CAASI,GAAAA,EAAMO,GAAAA,EAAUjB,KAAOD,GAAM,CAAA,EAC5CmB,MAAO,CAAA,EACPC,GAAAA,GAAO,GACPC,GAAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAASnX,GAAAA,GAAI,CAAA,EAAGA,GAAAA,IAAK8V,GAAAA,EAAQ/W,GAAAA,EAAAA,EAAK;AAChC,IAAA,IAAMqY,GAAAA,GAAOP,GAAAA,CAASJ,GAAAA,GAAOX,GAAAA,GAAS9V,GAAAA,GAChCqX,GAAAA,GAAKD,GAAAA,CAAK,CAAA,GAAIrK,GAAAA,CAAE/M,GAAAA,CAAAA;AACtB,IAAAE,GAAAA,IAAQmX,MAAKD,GAAAA,CAAK,CAAA,EAClBjX,OAAQkX,GAAAA,GAAKD,GAAAA,CAAK,GAClBhX,GAAAA,IAAQiX,GAAAA;AACV,EAAA;AACA,EAAA,OAAOF,MAAO,CAAA,GAAI;AAAE,IAAA,CAAA,EAAGF,GAAAA,GAAOE,GAAAA;AAAM,IAAA,CAAA,EAAGD,GAAAA,GAAOC;GAAK,GAAI;IAAE,CAAA,EAAG,CAAA;IAAG,CAAA,EAAG;AAAE,GAAA;AACtE;AAIA,SAAgBG,EAAAA,CAAavY,KAAWe,GAAAA,EAA8B;AACpE,EAAA,IAAIG,OAAK,CAAA,EAAG,OAAO6W,EAAAA,CAAa,CAAA,EAAGC,GAAK,CAAA,CAAE,CAAA;AAC1C,EAAA,IAAI9W,OAAK,CAAA,EAAG,OAAO6W,EAAAA,CAAa,CAAA,EAAGC,GAAK,CAAA,CAAE,CAAA;AAC1C,EAAA,IAAIQ,GAAAA,GAAK,GAAGC,GAAAA,GAAK,CAAA;AACjB,EAAA,KAAA,IAASC,GAAAA,GAAO,CAAA,EAAGA,GAAAA,GAAO,EAAA,EAAIzX,GAAAA,EAAAA,EAAQ;AACpC,IAAA,IAAMoW,GAAAA,GAAAA,CAAOmB,GAAAA,GAAKC,GAAAA,IAAM,GAAA,EAClB,EAAE,GAAGE,GAAAA,EAAAA,GAASZ,EAAAA,CAAaV,GAAAA,EAAKW,GAAK,CAAA;AAE3C,IAAA,IADIW,GAAAA,GAAOzX,MAAGyD,GAAAA,GAAK0S,GAAAA,GAAU7S,MAAK6S,GAAAA,EAC9BoB,GAAAA,GAAKD,MAAK,IAAA,EAAM;AACtB,EAAA;AACA,EAAA,OAAOT,EAAAA,CAAAA,CAAcS,GAAAA,GAAKC,GAAAA,IAAM,GAAA,EAAKT,GAAK,CAAA,CAAE,CAAA;AAC9C;AAEA,IAAMY,EAAAA,GAAiD;EACrD,KAAA,EAAA,CAAQ5Y,GAAAA,EAAQe,GAAAA,EAAM4D,GAAAA,KAAS;AAC7B,IAAA,IAAM8D,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;KAAO,EAE/B6P,GAAAA,GAAQH,EAAAA,CADEzC,EAAAA,CAAmB3M,GACR,CAAO,CAAA,EAC5BwM,GAAAA,GAAOxM,GAAAA,CAAI,QAAA,GAAW,IAAA,CAAK,EAAA,GAAM,GAAA,EACjCuF,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,KAAA,CAAMvF,GAAAA,CAAI,OAAO,CAAC,CAAA,EAExC8G,GAAAA,GAA4B,EAAC,EAC7B+G,GAAAA,GAAU,IAAA,CAAK,EAAA,GAAK,CAAA;AAC1B,IAAA,KAAA,IAASrV,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI+M,GAAAA,EAAGhO,GAAAA,EAAAA,EAAK;AAC1B,MAAA,IAAMwT,GAAAA,GAAKvS,MAAI+M,GAAAA,GAAK,CAAA,GAAI,KAAK,EAAA,EACvBuI,GAAAA,GAAO/C,MAAIyB,GAAAA,EACb/T,GAAAA;AAKFA,MAAAA,GAAAA,GAJEuH,GAAAA,CAAI,IAAA,KAAS,UAAA,GAAA,CACF8N,MAAOD,GAAAA,GAAWA,GAAAA,IAAWA,GAAAA,GACjCA,GAAAA,GAEL,KAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAIC,GAAI,CAAC,CAAA;AAEjC,MAAA,IAAM/R,GAAAA,GAAI+T,EAAAA,CAAarX,GAAAA,EAAG8W,GAAK,CAAA;AAC/B,MAAA9W,GAAAA,CAAM,IAAA,CAAK,CAAC,EAAA,GAAKsD,MAAI,IAAA,CAAK,GAAA,CAAIgP,GAAC,CAAA,EAAG,KAAKhP,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAIgP,GAAC,CAAC,CAAC,CAAA;AACzD,IAAA;AACA,IAAA,OAAO1B,EAAAA,CAAevC,GAAAA,EAAOL,GAAAA,EAAME,GAAI,CAAA;AACzC,EAAA,CAAA;EACA,QAAA,EAAUnH,EAAAA;EACV,MAAA,EAAQ;IAAE,GAAA,EAAK,EAAA;IAAI,KAAA,EAAO,EAAA;IAAI,MAAA,EAAQ,EAAA;IAAI,IAAA,EAAM;AAAG;AACrD,CAAA;AA3BA,IC1KMA,EAAAA,GAAmC;EAAE,IAAA,EAAM,QAAA;EAAU,KAAA,EAAO,SAAA;EAAW,UAAA,EAAY;AAAE,CAAA;AAQ3F,SAAS4Q,EAAAA,CAAW7Y,GAAAA,EAAiBe,GAAAA,EAAiB4D,GAAAA,EAAgBH,GAAAA,EAA6B;AACjG,EAAA,QAAQsU,GAAAA;IACN,KAAK,MAAA;AACH,MAAA,OAAO;QAAE,GAAA,EAAK,CAACC,KAAS,CAAC,CAAA;QAAG,GAAA,EAAK,IAAA;QAAM,MAAA,EAAQ,CAACA,KAAS,GAAG;AAAE,OAAA;IAChE,KAAK,SAAA;AACH,MAAA,OAAO;AACL,QAAA,GAAA,EAAK,CAACA,GAAAA,GAAUC,GAAAA,GAASC,GAAAA,EAAS,CAAC,CAAA;QACnC,GAAA,EAAK,CAACF,KAAS,EAAE,CAAA;AACjB,QAAA,MAAA,EAAQ,CAACA,GAAAA,GAAUC,GAAAA,GAASC,GAAAA,EAAS,GAAG;AAC1C,OAAA;IACF,KAAK,QAAA;AACH,MAAA,OAAO;QACL,GAAA,EAAK,CAACF,KAAS,CAAC,CAAA;AAChB,QAAA,GAAA,EAAK,CAACA,GAAAA,GAAUC,GAAAA,GAASC,GAAAA,EAAS,EAAE,CAAA;QACpC,MAAA,EAAQ,CAACF,KAAS,GAAG;AACvB,OAAA;AACJ;AACF;AAEA,SAASG,EAAAA,CAAalZ,KAAiBe,GAAAA,EAA0B;AAC/D,EAAA,IAAMA,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGoY,GAAQ,CAAA;AAC9B,EAAA,QAAQL,GAAAA;IACN,KAAK,MAAA;AAAW,MAAA,OAAO,CAAA;IACvB,KAAK,SAAA;AAAW,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM/X,GAAAA,GAAI,GAAG,CAAA;IACzC,KAAK,QAAA;AAAW,MAAA,OAAO,IAAA,CAAK,KAAA,CAAMA,GAAAA,GAAI,GAAG,CAAA;AAC3C;AACF;AAEA,IAAMqL,EAAAA,GAAmC;EACvC,KAAA,EAAA,CAAQpM,GAAAA,EAAQe,GAAAA,EAAM4D,GAAAA,KAAS;AAC7B,IAAA,IAAM8D,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/BgR,GAAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG1Q,IAAI,UAAU,CAAA,EAGrCwQ,GAAAA,GAAU/J,GAAAA,GAAO,CAAA,GAAKiK,GAAAA,GAAWjK,GAAAA,GAAQ,GAAA,GAAM,GAC/C/N,GAAAA,GAAI0X,EAAAA,CAAWpQ,GAAAA,CAAI,IAAA,EAAM,CAAA,EAAG,CAAA,EAAGwQ,GAAO,CAAA,EACtCzU,MAAIqU,EAAAA,CAAWpQ,GAAAA,CAAI,KAAA,EAAO,GAAA,EAAK,IAAIwQ,GAAO,CAAA,EAC1C1J,GAAAA,GAA4B,CAACpO,IAAE,GAAG,CAAA;AAMxC,IAAA,OALAoO,GAAAA,CAAM,IAAA,CAAK/K,GAAAA,CAAE,GAAG,GACZA,GAAAA,CAAE,GAAA,IAAK+K,GAAAA,CAAM,IAAA,CAAK/K,GAAAA,CAAE,GAAG,CAAA,EAC3B+K,GAAAA,CAAM,KAAK/K,GAAAA,CAAE,MAAM,CAAA,EACnB+K,GAAAA,CAAM,IAAA,CAAKpO,GAAAA,CAAE,MAAM,CAAA,EACfA,IAAE,GAAA,IAAKoO,GAAAA,CAAM,IAAA,CAAKpO,GAAAA,CAAE,GAAG,CAAA,EACpB2Q,EAAAA,CAAevC,GAAAA,EAAOL,KAAME,GAAI,CAAA;AACzC,EAAA,CAAA;AACA,EAAA,MAAA,EAAA,CAASpP,GAAAA,KAAW;AAClB,IAAA,IAAMyI,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA;AACrC,IAAA,OAAO;MACL,GAAA,EAAK,CAAA;AACL,MAAA,KAAA,EAAO+Q,EAAAA,CAAazQ,GAAAA,CAAI,KAAA,EAAOA,GAAAA,CAAI,UAAU,CAAA;MAC7C,MAAA,EAAQ,CAAA;AACR,MAAA,IAAA,EAAMyQ,EAAAA,CAAazQ,GAAAA,CAAI,IAAA,EAAMA,GAAAA,CAAI,UAAU;AAC7C,KAAA;AACF,EAAA,CAAA;EACA,QAAA,EAAUR;AACZ,CAAA;AA3BA,IC5BamR,EAAAA,GAAsD;EACjE,IAAA,EAAA,CAAoBpZ,KAAIe,GAAAA,KAAO,CAAA;EAC/B,OAAA,EAAA,CAAoBf,KAAGe,GAAAA,KAAAA,CAAS,CAAA,GAAI,KAAK,GAAA,CAAIA,GAAAA,GAAI,GAAG,CAAA,GAAI,CAAA,IAAKM,GAAAA;EAC7D,KAAA,EAAA,CAAoBrB,GAAAA,EAAGe,GAAAA,KAAQA,GAAAA,GAAIM,GAAAA;AACnC,EAAA,UAAA,EAAA,CAAoBrB,GAAAA,EAAGe,GAAAA,KAAAA,CAAS,CAAA,GAAIA,GAAAA,IAAKM,GAAAA;EACzC,KAAA,EAAA,CAAoBrB,KAAGe,GAAAA,KAAQ,IAAA,CAAK,IAAIA,GAAAA,GAAI,IAAA,CAAK,EAAE,CAAA,GAAIM,GAAAA;EACvD,OAAA,EAAA,CAAoBrB,GAAAA,EAAGe,GAAAA,KAAQ,IAAA,CAAK,GAAA,CAAIA,MAAI,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA,GAAI,GAAA,GAAMM,GAAAA;EACjE,iBAAA,EAAA,CAAoBrB,GAAAA,EAAGe,GAAAA,KAAQ,EAAE,CAAA,GAAI,KAAK,GAAA,CAAIA,GAAAA,GAAI,GAAG,CAAA,GAAI,CAAA,CAAA,GAAKM;AAChE;AAEA,SAAgBgY,GAAYrZ,GAAAA,EAA2B;AAErD,EAAA,OADI,OAAOsZ,GAAAA,IAAQ,UAAA,GAAmBA,MAC/BF,EAAAA,CAAcE,GAAAA,KAAQF,EAAAA,CAAc,IAAA;AAC7C;ACtBA,IAAMnR,EAAAA,GAAsC;EAC1C,QAAA,EAAU,MAAA;EACV,SAAA,EAAW,MAAA;EACX,KAAA,EAAO;AACT,CAAA;AAJA,IAQMsR,EAAAA,GAAe,EAAA;AARrB,ICuBaC,EAAAA,GAA4C;EACvD,gBAAA,EAAkBxK,EAAAA;EAClB,cAAA,EAAgBiB,EAAAA;EAChBwJ,OAAAA,EAAWzH,EAAAA;EACX0H,MAAAA,EAAUjG,EAAAA;EACVkG,UAAAA,EAAc5K,GAAAA;EACd,eAAA,EAAiBsH,EAAAA;EACjB,gBAAA,EAAkBuC,EAAAA;EAClBgB,MAAAA,EAAUxN,EAAAA;EACVyN,SAAAA,EAAa;IDrBb,KAAA,EAAA,CAAQ7Z,GAAAA,EAAQe,GAAAA,EAAM4D,GAAAA,KAAS;AAC7B,MAAA,IAAM8D,GAAAA,GAAM;QAAE,GAAGR,EAAAA;QAAU,GAAGE;OAAO,EAC/BoP,GAAAA,GAAO8B,GAAY5Q,GAAAA,CAAI,QAAQ,GAC/B+O,GAAAA,GAAQ6B,EAAAA,CAAY5Q,IAAI,SAAS,CAAA,EACjC0F,MAAQ1F,GAAAA,CAAI,KAAA,EACZwG,MAAK,GAAA,GAAMC,GAAAA,EACXC,MAAK,GAAA,GAAMC,GAAAA,EAEXrE,MAA0D,EAAC;AAKjEA,MAAAA,IAAI,IAAA,CAAK;QAAE,CAAA,EAAGwM,GAAAA,CAAK,CAAA,EAAGpJ,GAAK,CAAA,GAAIc,GAAAA;QAAI,CAAA,EAAG,CAAA;QAAG,EAAA,EAAI,CAAA;QAAG,EAAA,EAAI;OAAI,CAAA,EACxDlE,IAAI,IAAA,CAAK;AAAE,QAAA,CAAA,EAAA,CAAImE,GAAAA,GAAOsI,GAAAA,CAAM,CAAA,EAAGrJ,GAAK,CAAA,IAAKc,GAAAA;QAAI,CAAA,EAAG,CAAA;QAAG,EAAA,EAAI,CAAA;QAAG,EAAA,EAAI;OAAI,CAAA;AAElE,MAAA,KAAA,IAAShO,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIsY,EAAAA,EAAcvZ,GAAAA,EAAAA,EAAK;AACrC,QAAA,IAAMe,MAAIE,GAAAA,GAAIsY,EAAAA,EACRO,MAAO5K,GAAAA,GAAOsI,GAAAA,CAAMzW,KAAGoN,GAAK,CAAA;AAClC,QAAAhN,IAAI,IAAA,CAAK;AAAE,UAAA,CAAA,EAAG2Y,GAAAA,GAAO7K,GAAAA;AAAI,UAAA,CAAA,EAAGlO,GAAAA,GAAI,GAAA;UAAK,EAAA,EAAI,CAAA;UAAG,EAAA,EAAI;SAAG,CAAA;AACrD,MAAA;AAEAgK,MAAAA,IAAI,IAAA,CAAK;AAAE,QAAA,CAAA,EAAA,CAAImE,GAAAA,GAAOsI,GAAAA,CAAM,CAAA,EAAGrJ,GAAK,CAAA,IAAKc,GAAAA;QAAI,CAAA,EAAG,GAAA;QAAK,EAAA,EAAI,CAAA;QAAG,EAAA,EAAI;OAAG,CAAA,EACnElE,IAAI,IAAA,CAAK;AAAE,QAAA,CAAA,EAAA,CAAI,CAAA,GAAIwM,GAAAA,CAAK,CAAA,EAAGpJ,GAAK,CAAA,IAAKc,GAAAA;QAAI,CAAA,EAAG,GAAA;QAAK,EAAA,EAAI,CAAA;QAAG,EAAA,EAAI;OAAG,CAAA;AAE/D,MAAA,KAAA,IAAShO,GAAAA,GAAI,EAAA,EAAkBA,GAAAA,IAAK,CAAA,EAAGjB,GAAAA,EAAAA,EAAK;AAC1C,QAAA,IAAMe,MAAIE,GAAAA,GAAIsY,EAAAA,EACRO,MAAO,CAAA,GAAIvC,GAAAA,CAAKxW,KAAGoN,GAAK,CAAA;AAC9B,QAAAhN,IAAI,IAAA,CAAK;AAAE,UAAA,CAAA,EAAG2Y,GAAAA,GAAO7K,GAAAA;AAAI,UAAA,CAAA,EAAGlO,GAAAA,GAAI,GAAA;UAAK,EAAA,EAAI,EAAA;UAAI,EAAA,EAAI;SAAG,CAAA;AACtD,MAAA;AAEA,MAAA,IAAMwP,GAAAA,GAAgB,CAAC,CAAC,CAAA;AACxB,MAAA,KAAA,IAAStP,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI8J,GAAAA,CAAI,QAAQ/K,GAAAA,EAAAA,EAAK;AACnC,QAAA,IAAMyG,MAAIsE,GAAAA,CAAI9J,GAAAA,GAAI,CAAA,CAAA,EACZsC,GAAAA,GAAIwH,IAAI9J,GAAAA,CAAAA,EACR8Y,OAASxW,GAAAA,CAAE,CAAA,GAAIkD,IAAE,CAAA,IAAKwI,GAAAA,EACtB+K,OAASzW,GAAAA,CAAE,CAAA,GAAIkD,IAAE,CAAA,IAAK0I,GAAAA;AAC5B,QAAA/N,GAAAA,CAAI,IAAA,CAAKmP,GAAAA,CAAItP,GAAAA,GAAI,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM8Y,GAAAA,EAAOC,GAAK,CAAC,CAAA;AAChD,MAAA;AACA,MAAA,IAAMC,GAAAA,GAAOlP,GAAAA,CAAIA,GAAAA,CAAI,MAAA,GAAS,CAAA,CAAA,EACxBmP,GAAAA,GAAQnP,GAAAA,CAAI,CAAA,CAAA,EACZoP,GAAAA,GAAW,IAAA,CAAK,KAAA,CAAA,CAAOD,GAAAA,CAAM,CAAA,GAAID,GAAAA,CAAK,CAAA,IAAKhL,GAAAA,EAAAA,CAAKiL,GAAAA,CAAM,CAAA,GAAID,GAAAA,CAAK,CAAA,IAAK9K,GAAE,CAAA,EACtEU,GAAAA,GAAWU,GAAAA,CAAIA,GAAAA,CAAI,MAAA,GAAS,CAAA,CAAA,GAAK4J,GAAAA;AAsCvC,MAAA,OAAO;AADwB,QAAA,QAAA,EARdpP,IAAI,MAAA,CAAA,CAClB/K,GAAAA,EAAKe,GAAAA,EAAG4D,QACPyM,GAAAA,IAAOnQ,GAAAA,KAAM,CAAA,GACT,CAAA,EAAA,EAAKY,IAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAKA,GAAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,GACpC,CAAA,GAAA,EAAMA,GAAAA,CAAE,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAA,CAAA,EAAKA,GAAAA,CAAE,EAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA,EAC3C,EACF,CAAA,GAAI,IAAA;AAEqC,QAAA,WAAA,EAAA,CAnCpB7B,GAAAA,KAA8B;AACjD,UAAA,IAAM8P,GAAAA,GAAAA,CAAO5O,GAAAA,GAAI2O,GAAAA,GAAYA,GAAAA,IAAYA,GAAAA;AACzC,UAAA,KAAA,IAAS5O,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI8J,GAAAA,CAAI,MAAA,EAAQ/K,OAC9B,IAAI8P,GAAAA,IAAMS,GAAAA,CAAItP,GAAAA,CAAAA,EAAI;AAChB,YAAA,IAAMmZ,GAAAA,GAAS7J,GAAAA,CAAItP,GAAAA,CAAAA,GAAKsP,GAAAA,CAAItP,MAAI,CAAA,CAAA,EAC1BF,GAAAA,GAAIqZ,GAAAA,GAAS,CAAA,GAAA,CAAKtK,GAAAA,GAAKS,IAAItP,GAAAA,GAAI,CAAA,CAAA,IAAMmZ,GAAAA,GAAS,CAAA,EAC9C3T,GAAAA,GAAIsE,GAAAA,CAAI9J,GAAAA,GAAI,CAAA,CAAA,EACZsC,GAAAA,GAAIwH,GAAAA,CAAI9J,GAAAA,CAAAA;AACd,YAAA,OAAO;AACL,cAAA,CAAA,EAAGwF,GAAAA,CAAE,CAAA,GAAA,CAAKlD,GAAAA,CAAE,CAAA,GAAIkD,IAAE,CAAA,IAAK1F,GAAAA;AACvB,cAAA,CAAA,EAAG0F,GAAAA,CAAE,CAAA,GAAA,CAAKlD,GAAAA,CAAE,CAAA,GAAIkD,IAAE,CAAA,IAAK1F,GAAAA;AACvB,cAAA,EAAA,EAAIwC,GAAAA,CAAE,EAAA;AACN,cAAA,EAAA,EAAIA,GAAAA,CAAE;AACR,aAAA;AACF,UAAA;AAEF,UAAA,IAAM8W,GAAAA,GAAUtP,GAAAA,CAAI,MAAA,GAAS,CAAA,EACvBqP,GAAAA,GAASD,GAAAA,EACTpZ,GAAAA,GAAIqZ,GAAAA,GAAS,CAAA,GAAA,CAAKtK,GAAAA,GAAKS,GAAAA,CAAI8J,GAAAA,KAAYD,GAAAA,GAAS,CAAA;AACtD,UAAA,OAAO;YACL,CAAA,EAAGrP,GAAAA,CAAIsP,GAAAA,CAAAA,CAAS,CAAA,GAAA,CAAKH,IAAM,CAAA,GAAInP,GAAAA,CAAIsP,GAAAA,CAAAA,CAAS,CAAA,IAAKtZ,GAAAA;YACjD,CAAA,EAAGgK,GAAAA,CAAIsP,GAAAA,CAAAA,CAAS,CAAA,GAAA,CAAKH,IAAM,CAAA,GAAInP,GAAAA,CAAIsP,GAAAA,CAAAA,CAAS,CAAA,IAAKtZ,GAAAA;YACjD,EAAA,EAAI,CAAA;YACJ,EAAA,EAAI;AACN,WAAA;AACF,QAAA,CAAA;QAUsD,QAAA,EAAAF;AAC/C,OAAA;AACT,IAAA,CAAA;IACA,QAAA,EAAUoH,EAAAA;AACV,IAAA,MAAA,EAAA,CAASjI,GAAAA,KAAW;AAClB,MAAA,IAAMmO,GAAAA,GAAQhG,GAAAA,EAAQ,KAAA,IAASF,EAAAA,CAAS,KAAA,EAClCqS,GAAAA,GAAUnS,GAAAA,EAAQ,QAAA,IAAYF,EAAAA,CAAS,QAAA,EACvCsS,GAAAA,GAAWpS,GAAAA,EAAQ,SAAA,IAAaF,EAAAA,CAAS,SAAA,EACzCsP,GAAAA,GAAO8B,EAAAA,CAAYiB,GAAO,CAAA,EAC1B9C,GAAAA,GAAQ6B,EAAAA,CAAYkB,GAAQ,CAAA,EAQ9BC,GAAAA,GAAU,CAAA,EACVC,GAAAA,GAAW,CAAA,EACXC,GAAAA,GAAgB,GAChBC,GAAAA,GAAiB,CAAA;AACrB,MAAA,KAAA,IAAS1Z,GAAAA,GAAI,CAAA,EAAGA,GAAAA,IAAK,EAAA,EAAGjB,GAAAA,EAAAA,EAAK;AAC3B,QAAA,IAAMe,MAAIE,GAAAA,GAAI,EAAA,EACRE,MAAIoW,GAAAA,CAAKxW,GAAAA,EAAGoN,GAAK,CAAA,EACjB3J,GAAAA,GAAIgT,GAAAA,CAAMzW,GAAAA,EAAGoN,GAAK,CAAA,EAClBkD,GAAAA,GAAIpQ,QAAM,CAAA,IAAKA,GAAAA,KAAM,KAAI,GAAA,GAAM,CAAA;AACrC,QAAA0H,OAAY0I,GAAAA,GAAIlQ,GAAAA,GAAK,EAAA,EACrBD,GAAAA,IAAamQ,MAAI7M,GAAAA,GAAK,EAAA,EAClBrD,GAAAA,GAAIuZ,GAAAA,KAAeza,MAAgBkB,GAAAA,CAAAA,EACnC,CAACqD,GAAAA,GAAImW,GAAAA,KAAgBxZ,MAAiB,CAACqD,GAAAA,CAAAA;AAC7C,MAAA;AAGA,MAAA,IAAMoW,GAAAA,GAAAA,CAASJ,MAAUC,GAAAA,IAAY,CAAA,EAC/BI,MAAU,IAAA,CAAK,GAAA,CAAIH,GAAAA,EAAevM,GAAAA,GAAQyM,GAAK,CAAA;AAErD,MAAA,OAAO;QAAE,GAAA,EAAK,CAAA;AAAG,QAAA,KAAA,EADA,IAAA,CAAK,GAAA,CAAID,GAAAA,EAAgBxM,GAAAA,GAAQyM,GAC1B,CAAA;QAAU,MAAA,EAAQ,CAAA;QAAG,IAAA,EAAMC;AAAQ,OAAA;AAC7D,IAAA;AC/Fa;AACf,CAAA;ACvCA,SAAgBC,EAAAA,CAAU9a,GAAAA,EAAWe,GAAAA,EAAkB4D,GAAAA,EAAkC;AACvF,EAAA,IAAI,CAACoW,KAAO,OAAO,CAAA;AACnB,EAAA,IAAM,CAACtU,GAAAA,EAAGlD,GAAAA,CAAAA,GAAKwX,GAAAA;AACf,EAAA,IAAItU,GAAAA,KAAMlD,KAAG,OAAO,CAAA;AACpB,EAAA,IAAMnC,GAAAA,GAAAA,CAAOF,GAAAA,GAAI2O,GAAAA,GAAYA,GAAAA,IAAYA,GAAAA,GAAYA,GAAAA;AAGrD,EAAA,OAFIpJ,GAAAA,GAAIlD,GAAAA,GAAU,EAAAkD,GAAAA,IAAKA,GAAAA,IAAKrF,OAAKmC,GAAAA,CAAAA,GAE1B,EAAAkD,GAAAA,IAAKA,GAAAA,IAAKrF,GAAAA,IAAKmC,GAAAA,CAAAA;AACxB;ACKA,IAAM0E,EAAAA,GAAwD;EAC5D,KAAA,EAAO,EAAA;EACP,MAAA,EAAQ,CAAA;EACR,SAAA,EAAW,CAAA;EACX,SAAA,EAAW,GAAA;EACX,SAAA,EAAW,CAAA;EACX,aAAA,EAAe,GAAA;EACf,YAAA,EAAc,CAAA;EACd,kBAAA,EAAoB;AACtB,CAAA;AATA,IAWM+S,EAAAA,GAA2C;EAC/C,QAAA,EAAA,CAAWhb,GAAAA,EAAG,EAAE,MAAA,EAAAe,GAAAA,EAAQ,KAAA,EAAA4D,GAAAA,EAAO,QAAA,EAAAH,GAAAA,EAAU,WAAA,EAAAvD,GAAAA,EAAA,KAAkB;AACzD,IAAA,IAAMwH,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/B8S,GAAAA,GAAOH,EAAAA,CAAU5Z,GAAAA,EAAG2O,GAAAA,EAAUpH,IAAI,KAAK,CAAA;AAC7C,IAAA,IAAIwS,GAAAA,KAAS,GAAG,OAAO;MAAE,EAAA,EAAI,CAAA;MAAG,EAAA,EAAI;AAAE,KAAA;AAEtC,IAAA,IAAMvQ,GAAAA,GAAOmF,MADH,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAMpH,GAAAA,CAAI,KAAK,CAClB,CAAA,EAClByS,MAAW,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,GAAA,CAAIxQ,MAAO,CAAA,GAAI,IAAA,EAAMjC,GAAAA,CAAI,SAAA,GAAY,CAAC,CAAC,GACrE0S,GAAAA,GAAcC,GAAAA,GAAQ1Q,KAEtBoF,GAAAA,GAAAA,CAAO5O,GAAAA,GAAI2O,MAAYA,GAAAA,IAAYA,GAAAA,EACnC5O,GAAAA,GAAI,IAAA,CAAK,KAAA,CAAA,CAAO6O,GAAAA,GAAKqL,OAAezQ,GAAI,CAAA,EACxC2Q,QAAOpa,GAAAA,GAAIyJ,GAAAA,GAAOyQ,OAAetL,GAAAA,GAAWA,GAAAA,IAAYA,GAAAA,EAE1DyL,GAAAA,GAAKxL,GAAAA,GAAKuL,GAAAA;AAGd,IAAA,IAFIC,MAAKzL,GAAAA,GAAW,CAAA,KAAGhO,GAAAA,IAAMgO,GAAAA,CAAAA,EACzByL,MAAK,CAACzL,GAAAA,GAAW,CAAA,KAAGhO,GAAAA,IAAMgO,MAC1B,IAAA,CAAK,GAAA,CAAIyL,GAAE,CAAA,GAAIJ,KAAU,OAAO;MAAE,EAAA,EAAI,CAAA;MAAG,EAAA,EAAI;AAAE,KAAA;AAEnD,IAAA,IAAMna,GAAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAIua,GAAE,CAAA,GAAIJ,GAAAA,EACvBK,GAAAA,GAAU/K,GAAAA,CAAY6K,GAAE,CAAA,EAGxBG,GAAAA,GAAOD,IAAQ,EAAA,EACfE,GAAAA,GAAOF,GAAAA,CAAQ,EAAA,EAGfG,GAAAA,GAAQ,IAAA,CAAK,GAAA,CAAIH,GAAAA,CAAQ,EAAE,CAAA,EAC3BI,GAAAA,GAAQ,IAAA,CAAK,GAAA,CAAIJ,GAAAA,CAAQ,EAAE,CAAA,EAC3Bla,GAAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAIqa,GAAAA,GAAQC,GAAK,CAAA,EAEjCC,GAAAA,GAAAA,CADYD,GAAAA,GAAQD,MAAQjT,GAAAA,CAAI,SAAA,GAAYA,GAAAA,CAAI,SAAA,KAC3B,CAAA,GAAIpH,GAAAA,CAAAA,GAAKoH,GAAAA,CAAI,aAAA,GAAgBpH,KAClDwa,GAAAA,GAAU,CAAA,GAAIpT,GAAAA,CAAI,YAAA,GAAe,GAAA,GAAM,IAAA,CAAK,GAAA,CAAIxH,GAAAA,GAAI,OAAO,GAAG,CAAA,EAI9DqQ,GAAAA,GAAM,IAAA,CAAK,GAAA,CAAI5G,GAAAA,GAAO,GAAA,EAAKwQ,GAAQ,GAErCY,GAAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,IAASlc,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI,CAAA,EAASI,GAAAA,EAAAA,EAAK;AAChC,MAAA,IAAMoB,GAAAA,GAAAA,CAAKxB,GAAAA,GAAI,GAAA,IAAO,CAAA,EAChBmc,GAAAA,GAAKV,GAAAA,GAAK/J,GAAAA,GAAMlQ,GAAAA,GAAI,CAAA,GAAIkQ,GAAAA,GAAMA,GAAAA,GAAM,CAAA,EACpC0K,GAAAA,GAAKX,MAAK/J,GAAAA,GAAMlQ,GAAAA,GAAI,CAAA,GAAIkQ,GAAAA,GAAMA,GAAAA,GAAM,CAAA,EACpC2K,GAAAA,GAAKzL,GAAAA,CAAYuL,GAAE,CAAA,EACnBG,GAAAA,GAAK1L,GAAAA,CAAYwL,GAAE,CAAA;AACzB,MAAA3K,GAAAA,IAAS,IAAA,CAAK,KAAA,CAAM6K,GAAAA,CAAG,EAAA,GAAKD,GAAAA,CAAG,EAAA,EAAIC,GAAAA,CAAG,EAAA,GAAKD,GAAAA,CAAG,EAAE,CAAA,IAAKD,GAAAA,GAAKD,GAAAA,CAAAA;AAC5D,IAAA;AACA,IAAA1K,GAAAA,IAAS,CAAA;AACT,IAAA,IAAM8K,GAAAA,GAAU1T,GAAAA,CAAI,MAAA,GAASmT,GAAAA,GAAQC,GAAAA,GAAU9a,GAAAA,EACzCqb,GAAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI3T,GAAAA,CAAI,oBAAoB,CAAC,CAAC,CAAA,EACtD4T,GAAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGF,GAAAA,IAAW,CAAA,GAAIC,GAAAA,GAAON,GAAAA,GAAQK,GAAAA,CAAQ,CAAA,GAAIlB,GAAAA;AACrE,IAAA,OAAO;AAAE,MAAA,EAAA,EAAIO,GAAAA,GAAOa,GAAAA;AAAQ,MAAA,EAAA,EAAIZ,GAAAA,GAAOY;AAAO,KAAA;AAChD,EAAA,CAAA;EACA,QAAA,EAAUpU;AACZ,CAAA;AAjEA,ICVMA,EAAAA,GAAuD;EAC3D,SAAA,EAAW,EAAA;EACX,SAAA,EAAW,EAAA;EACX,YAAA,EAAc;AAChB,CAAA;ADMA,ICJMqU,EAAAA,GAAyC;EAC7C,QAAA,EAAA,CAAWtc,GAAAA,EAAG,EAAE,MAAA,EAAAe,GAAAA,EAAQ,KAAA,EAAA4D,GAAAA,EAAO,QAAA,EAAAH,GAAAA,EAAU,WAAA,EAAAvD,GAAAA,EAAA,KAAkB;AACzD,IAAA,IAAMwH,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/B8S,GAAAA,GAAOH,EAAAA,CAAU5Z,GAAAA,EAAG2O,GAAAA,EAAUpH,IAAI,KAAK,CAAA;AAC7C,IAAA,IAAIwS,GAAAA,KAAS,GAAG,OAAO;MAAE,EAAA,EAAI,CAAA;MAAG,EAAA,EAAI;AAAE,KAAA;AAEtC,IAAA,IAAMvQ,GAAAA,GAAOmF,GAAAA,GADH,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAMA,GAAAA,GAAW,IAAA,CAAK,IAAI,CAAA,EAAGpH,GAAAA,CAAI,SAAS,CAAC,CAC9C,CAAA,EAClB0S,GAAAA,GAAcC,GAAAA,GAAQ1Q,GAAAA,EACtBoF,OAAO5O,GAAAA,GAAI2O,GAAAA,GAAYA,GAAAA,IAAYA,GAAAA,EACnC5O,MAAI,IAAA,CAAK,KAAA,CAAA,CAAO6O,GAAAA,GAAKqL,GAAAA,IAAezQ,GAAI,CAAA,EAE1C3J,GAAAA,GAAAA,CAAK+O,GAAAA,IADS7O,GAAAA,GAAIyJ,MAAOyQ,GAAAA,CAAAA,IACFzQ,GAAAA;AACvB3J,IAAAA,MAAI,CAAA,KAAGM,GAAAA,IAAK,CAAA,CAAA,EACZN,GAAAA,GAAI,KAAG,EAAAM,GAAAA;AACX,IAAA,IAAMkb,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI9T,GAAAA,CAAI,YAAA,EAAc,CAAC,CAAC,GAE/C+T,GAAAA,GADU,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK/T,IAAI,SAAS,CAAA,IAAK,CAAA,GAAI8T,GAAAA,GAAM,OAAO,IAAA,CAAK,GAAA,CAAItb,GAAAA,GAAI,IAAA,GAAO,GAAG,CAAA,CAAA,GACjE,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAKF,GAAC,CAAA,GAAIka,GAAAA,EACzC9J,GAAAA,GAAKX,IAAYtP,GAAC,CAAA;AACxB,IAAA,OAAO;AAAE,MAAA,EAAA,EAAIiQ,IAAG,EAAA,GAAKqL,GAAAA;AAAM,MAAA,EAAA,EAAIrL,IAAG,EAAA,GAAKqL;AAAK,KAAA;AAC9C,EAAA,CAAA;EACA,QAAA,EAAUvU;AACZ,CAAA;ADjBA,IEVMA,EAAAA,GAAuD;EAC3D,UAAA,EAAY,CAAA;EACZ,WAAA,EAAa,CAAA;EACb,YAAA,EAAc;AAChB,CAAA;AFMA,IEJMwU,EAAAA,GAAyC;EAC7C,QAAA,EAAA,CAAWzc,GAAAA,EAAG,EAAE,MAAA,EAAAe,GAAAA,EAAQ,KAAA,EAAA4D,GAAAA,EAAO,QAAA,EAAAH,GAAAA,EAAU,WAAA,EAAAvD,GAAAA,EAAA,KAAkB;AACzD,IAAA,IAAMwH,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/B8S,GAAAA,GAAOH,EAAAA,CAAU5Z,GAAAA,EAAG2O,GAAAA,EAAUpH,IAAI,KAAK,CAAA;AAC7C,IAAA,IAAIwS,GAAAA,KAAS,GAAG,OAAO;MAAE,EAAA,EAAI,CAAA;MAAG,EAAA,EAAI;AAAE,KAAA;AACtC,IAAA,IAAMyB,GAAAA,GAAK,KAAK,GAAA,CAAI,GAAA,EAAKjU,IAAI,UAAU,CAAA,EACjCkU,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAID,MAAK,GAAA,EAAKjU,GAAAA,CAAI,WAAW,CAAA,EAE3CiC,GAAAA,GAAOmF,MADH,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAMA,GAAAA,GAAW8M,GAAE,CACtB,CAAA,EAClBxB,MAAcC,GAAAA,GAAQ1Q,GAAAA,EACtBoF,OAAO5O,GAAAA,GAAI2O,GAAAA,GAAYA,GAAAA,IAAYA,GAAAA,EACnC5O,GAAAA,GAAI,IAAA,CAAK,OAAO6O,GAAAA,GAAKqL,GAAAA,IAAezQ,GAAI,CAAA,EAE1C4Q,GAAAA,GAAKxL,QADI7O,GAAAA,GAAIyJ,GAAAA,GAAOyQ,GAAAA,IAAetL,GAAAA,GAAWA,GAAAA,IAAYA,GAAAA;AAE1DyL,IAAAA,GAAAA,GAAKzL,MAAW,CAAA,KAAGhO,GAAAA,IAAMgO,MACzByL,GAAAA,GAAK,CAACzL,GAAAA,GAAW,CAAA,KAAGhO,GAAAA,IAAMgO,GAAAA,CAAAA;AAE9B,IAAA,IAAM+M,MAASF,GAAAA,IAAM,CAAA,GADT,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAIjU,GAAAA,CAAI,YAAA,EAAc,CAAC,CAC3B,CAAA,GAAM,IAAA,GAAO,KAAK,GAAA,CAAIxH,GAAAA,GAAI,OAAO,GAAG,CAAA,CAAA;AAC7D,IAAA,IAAI,IAAA,CAAK,GAAA,CAAIqa,GAAE,CAAA,GAAIsB,KAAQ,OAAO;MAAE,EAAA,EAAI,CAAA;MAAG,EAAA,EAAI;AAAE,KAAA;AAEjD,IAAA,IAAM7b,GAAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAIua,GAAE,CAAA,GAAIsB,GAAAA,EACvBC,GAAAA,GAAS,CAACD,GAAAA,GAAS7b,GAAAA,EACnBoQ,GAAAA,GAAKX,IAAYtP,GAAC,CAAA;AACxB,IAAA,OAAO;MAAE,EAAA,EAAIiQ,GAAAA,CAAG,KAAK0L,GAAAA,GAAS5B,GAAAA;MAAM,EAAA,EAAI9J,GAAAA,CAAG,KAAK0L,GAAAA,GAAS5B;AAAK,KAAA;AAChE,EAAA,CAAA;EACA,QAAA,EAAUhT;AACZ,CAAA;AFtBA,IGVMA,EAAAA,GAA0D;EAC9D,aAAA,EAAe,CAAA;EACf,cAAA,EAAgB,EAAA;EAChB,YAAA,EAAc;AAChB,CAAA;AHMA,IGJM6U,EAAAA,GAA+C;EACnD,QAAA,EAAA,CAAW9c,GAAAA,EAAG,EAAE,MAAA,EAAAe,GAAAA,EAAQ,KAAA,EAAA4D,GAAAA,EAAO,QAAA,EAAAH,GAAAA,EAAU,WAAA,EAAAvD,GAAAA,EAAA,KAAkB;AACzD,IAAA,IAAMwH,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/B8S,GAAAA,GAAOH,EAAAA,CAAU5Z,GAAAA,EAAG2O,GAAAA,EAAUpH,IAAI,KAAK,CAAA;AAC7C,IAAA,IAAIwS,GAAAA,KAAS,GAAG,OAAO;MAAE,EAAA,EAAI,CAAA;MAAG,EAAA,EAAI;AAAE,KAAA;AACtC,IAAA,IAAM8B,GAAAA,GAAK,KAAK,GAAA,CAAI,GAAA,EAAKtU,IAAI,aAAa,CAAA,EACpCuU,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAID,MAAK,GAAA,EAAKtU,GAAAA,CAAI,cAAc,CAAA,EAE9CiC,GAAAA,GAAOmF,MADH,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAMA,GAAAA,GAAWmN,GAAE,CACtB,CAAA,EAClB7B,MAAcC,GAAAA,GAAQ1Q,GAAAA,EACtBoF,OAAO5O,GAAAA,GAAI2O,GAAAA,GAAYA,GAAAA,IAAYA,GAAAA,EACnC5O,GAAAA,GAAI,IAAA,CAAK,OAAO6O,GAAAA,GAAKqL,GAAAA,IAAezQ,GAAI,CAAA,EAE1C4Q,GAAAA,GAAKxL,QADI7O,GAAAA,GAAIyJ,GAAAA,GAAOyQ,GAAAA,IAAetL,GAAAA,GAAWA,GAAAA,IAAYA,GAAAA;AAE1DyL,IAAAA,GAAAA,GAAKzL,MAAW,CAAA,KAAGhO,GAAAA,IAAMgO,MACzByL,GAAAA,GAAK,CAACzL,GAAAA,GAAW,CAAA,KAAGhO,GAAAA,IAAMgO,GAAAA,CAAAA;AAE9B,IAAA,IAAM+M,MAASG,GAAAA,IAAM,CAAA,GADT,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAItU,GAAAA,CAAI,YAAA,EAAc,CAAC,CAC3B,CAAA,GAAM,IAAA,GAAO,KAAK,GAAA,CAAIxH,GAAAA,GAAI,OAAO,GAAG,CAAA,CAAA;AAC7D,IAAA,IAAI,IAAA,CAAK,GAAA,CAAIqa,GAAE,CAAA,GAAIsB,KAAQ,OAAO;MAAE,EAAA,EAAI,CAAA;MAAG,EAAA,EAAI;AAAE,KAAA;AAEjD,IAAA,IAAM7b,OAAKua,GAAAA,GAAKsB,GAAAA,KAAW,CAAA,GAAIA,GAAAA,CAAAA,EACzBJ,MAAOI,GAAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAK7b,GAAC,CAAA,GAAIka,GAAAA,EACxC9J,GAAAA,GAAKX,IAAYtP,GAAC,CAAA;AACxB,IAAA,OAAO;AAAE,MAAA,EAAA,EAAIiQ,IAAG,EAAA,GAAKqL,GAAAA;AAAM,MAAA,EAAA,EAAIrL,IAAG,EAAA,GAAKqL;AAAK,KAAA;AAC9C,EAAA,CAAA;EACA,QAAA,EAAUvU;AACZ,CAAA;AHtBA,IIPMA,EAAAA,GAAwC;EAAE,UAAA,EAAY,CAAA;EAAG,SAAA,EAAW;AAAK,CAAA;AAI/E,SAASgV,EAAAA,CAAcjd,KAAYe,GAAAA,EAAkB;AACnD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAImc,GAAE,CAAA,GAAI,KAAK,GAAA,CAAIC,GAAE,CAAA,GAC5BD,GAAAA,GAAK,CAAA,GAAI,KAAA,GAAQ,QAAA,GACjBC,GAAAA,GAAK,IAAI,MAAA,GAAS,OAAA;AACzB;AAEA,SAASC,GAAapd,GAAAA,EAAyC;AAC7D,EAAA,IAAMqd,GAAAA,GAAQC,IAAU,CAAA,CAAA,KAAO,KACzBC,GAAAA,GAASD,GAAAA,CAAU,CAAA,CAAA,KAAO,GAAA;AAChC,EAAA,OAAO;AACL,IAAA,GAAA,EAAQD,MAAS,mBAAA,GAA6B,kBAAA;AAC9C,IAAA,MAAA,EAAQA,MAAS,kBAAA,GAA6B,mBAAA;AAC9C,IAAA,IAAA,EAAQE,MAAS,0BAAA,GAA6B,yBAAA;AAC9C,IAAA,KAAA,EAAQA,MAAS,yBAAA,GAA6B;AAChD,GAAA;AACF;AAEA,IAAMC,EAAAA,GAAU,GAAA;AAAhB,IAEMC,EAAAA,GAAyC;AAC7C,EAAA,SAAA,EAAA,CAAY,EAAE,OAAA,EAAAzd,GAAAA,EAAS,IAAA,EAAAe,GAAAA,EAAM,IAAA,EAAA4D,GAAAA,EAAM,OAAA,EAAAH,GAAAA,EAAS,MAAA,EAAAvD,GAAAA,EAAA,KAAa;AACvD,IAAA,IAAMyc,MAASjU,KAAAA,EAAM;AACrB,IAAA,IAAIf,GAAAA,KAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,EAAU,OAAO,IAAA;AACxD,IAAA,IAAMD,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/B8G,MAAK,GAAA,GAAMC,GAAAA,EACXC,MAAK,GAAA,GAAMC,GAAAA,EACXxI,MAAMwW,EAAAA,CAAa3U,GAAAA,CAAI,SAAS,CAAA,EAChC+B,MAAQmT,GAAAA,CAAQ,QAAA,EAGhBC,MAAgD,EAAC,EACjDC,MAAoC,EAAC;AAC3C,IAAA,KAAA,IAAS5c,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIuc,EAAAA,EAASzc,GAAAA,EAAAA,EAAK;AAChC,MAAA,IAAMoQ,GAAAA,GAAKwM,GAAAA,CAAQ,WAAA,CAAa1c,GAAAA,GAAIuc,KAAWhT,GAAK,CAAA;AACpDoT,MAAAA,IAAM,IAAA,CAAK;AAAE,QAAA,CAAA,EAAGzM,GAAAA,CAAG,CAAA;AAAG,QAAA,CAAA,EAAGA,GAAAA,CAAG,CAAA;AAAG,QAAA,IAAA,EAAM8L,EAAAA,CAAc9L,GAAAA,CAAG,EAAA,EAAIA,GAAAA,CAAG,EAAE;OAAG,CAAA,EAClE0M,IAAM,IAAA,CAAK;AACT,QAAA,CAAA,EAAG1M,GAAAA,CAAG,CAAA,GAAIA,GAAAA,CAAG,EAAA,GAAK1I,IAAI,UAAA,GAAawG,GAAAA;AACnC,QAAA,CAAA,EAAGkC,GAAAA,CAAG,CAAA,GAAIA,GAAAA,CAAG,EAAA,GAAK1I,IAAI,UAAA,GAAa0G;OACpC,CAAA;AACH,IAAA;AAIA,IAAA,IAAM2O,GAAAA,GAAc,EAAC,EACjBC,GAAAA,GAAkB,IAAA;AACtB,IAAA,KAAA,IAAS9c,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIuc,EAAAA,EAASxd,GAAAA,EAAAA,EAAK;AAChC,MAAA,IAAM2O,GAAAA,GAAOiP,GAAAA,CAAM3c,GAAAA,CAAAA,CAAG,IAAA;AAClB,MAAA,CAAC8c,GAAAA,IAAOA,GAAAA,CAAI,IAAA,KAASpP,GAAAA,IACvB9O,GAAAA,GAAM;QAAE,IAAA,EAAAkB,GAAAA;AAAM,QAAA,IAAA,EAAM,CAACE,GAAC;AAAE,OAAA,EACxB6c,IAAK,IAAA,CAAKC,GAAG,KAEbA,GAAAA,CAAI,IAAA,CAAK,KAAK9c,GAAC,CAAA;AAEnB,IAAA;AAEI6c,IAAAA,GAAAA,CAAK,MAAA,GAAS,CAAA,IAAKA,GAAAA,CAAK,CAAA,CAAA,CAAG,IAAA,KAASA,GAAAA,CAAKA,GAAAA,CAAK,MAAA,GAAS,CAAA,CAAA,CAAG,IAAA,KAC5DE,IAAKF,GAAAA,CAAK,MAAA,GAAS,CAAA,CAAA,CAAG,IAAA,GAAOA,GAAAA,CAAKA,GAAAA,CAAK,MAAA,GAAS,CAAA,CAAA,CAAG,IAAA,CAAK,MAAA,CAAOA,GAAAA,CAAK,CAAA,CAAA,CAAG,IAAI,CAAA,EAC3EA,IAAK,KAAA,EAAM,CAAA;AAGb,IAAA,IAAMG,GAAAA,GAAAA,CAAWje,GAAAA,KAAqB;AACpC,MAAA,IAAMke,GAAAA,GAAWC,GAAAA,CAAI,IAAA,CAAK,GAAA,CAAA,CAAKne,GAAAA,KAAM4d,GAAAA,CAAM3c,GAAAA,CAAE,CAAA,EACvCmd,GAAAA,GAAWD,GAAAA,CAAI,IAAA,CAAK,GAAA,CAAA,CAAKne,GAAAA,KAAM6d,GAAAA,CAAM5c,GAAAA,CAAE,CAAA,CAAE,OAAA,EAAQ,EACjD8J,GAAAA,GAAM,CAAC,GAAGmT,GAAAA,EAAU,GAAGE,GAAQ,CAAA;AACrC,MAAA,IAAIrT,GAAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC7B,MAAA,IAAI1J,MAAI,CAAA,EAAA,EAAK0J,GAAAA,CAAI,CAAA,CAAA,CAAG,EAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKA,IAAI,CAAA,CAAA,CAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA;AACtD,MAAA,KAAA,IAAS9J,GAAAA,GAAI,GAAGA,GAAAA,GAAI8J,GAAAA,CAAI,QAAQ/K,GAAAA,EAAAA,EAC9BiB,GAAAA,IAAK,CAAA,GAAA,EAAM8J,GAAAA,CAAI9J,GAAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAK8J,GAAAA,CAAI9J,GAAAA,CAAAA,CAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA;AAEtD,MAAA,OAAOI,GAAAA,GAAI,IAAA;AACb,IAAA,CAAA;AAEA,IAAA,uBACEH,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA,iBACE0D,GAAAA,CAAC,MAAA,EAAD,EAAA,QAAA,kBACEA,IAAC,UAAA,EAAD;MAAU,EAAA,EAAI+U,GAAAA;AACZ,MAAA,QAAA,kBAAA/U,GAAAA,CAAC,MAAA,EAAD,EAAM,CAAA,EAAGgV,GAAAA,CAAQ,UAAW;AACpB,KAAA,CAAA,EACN,CAAA,kBACNhV,IAAC,GAAA,EAAD;AAAG,MAAA,QAAA,EAAU,QAAQ+U,GAAAA,CAAAA,CAAAA,CAAAA;AAClB,MAAA,QAAA,EAAAI,IAAK,GAAA,CAAA,CAAK9d,KAAKe,GAAAA,qBACd4H,IAAC,MAAA,EAAD;QAAc,SAAA,EAAW/B,GAAAA,CAAIuX,IAAI,IAAA,CAAA;AAAO,QAAA,CAAA,EAAGF,IAAQE,GAAG;AAAI,OAAA,EAA/Cld,GAA+C,CAC3D;KACA,CACH,GAAA,CAAA;AAEN,EAAA,CAAA;EACA,IAAA,EAAM,YAAA;EACN,QAAA,EAAUgH;AACZ,CAAA;AAxEA,ICtBMA,EAAAA,GAAwC;EAAE,SAAA,EAAW,IAAA;EAAM,SAAA,EAAW;AAAK,CAAA;ADsBjF,ICnBMoW,EAAAA,GAAkF;EACtF,EAAA,EAAI;IAAE,EAAA,EAAI,MAAA;IAAQ,EAAA,EAAI,MAAA;IAAQ,EAAA,EAAI,IAAA;IAAM,EAAA,EAAI;AAAK,GAAA;EACjD,EAAA,EAAI;IAAE,EAAA,EAAI,IAAA;IAAM,EAAA,EAAI,MAAA;IAAQ,EAAA,EAAI,MAAA;IAAQ,EAAA,EAAI;AAAK,GAAA;EACjD,EAAA,EAAI;IAAE,EAAA,EAAI,MAAA;IAAQ,EAAA,EAAI,IAAA;IAAM,EAAA,EAAI,IAAA;IAAM,EAAA,EAAI;AAAO,GAAA;EACjD,EAAA,EAAI;IAAE,EAAA,EAAI,IAAA;IAAM,EAAA,EAAI,IAAA;IAAM,EAAA,EAAI,MAAA;IAAQ,EAAA,EAAI;AAAO;AACnD,CAAA;ADcA,ICZMC,EAAAA,GAAyC;EAC7C,SAAA,EAAA,CAAY,EAAE,OAAA,EAAAte,GAAAA,EAAS,SAAAe,GAAAA,EAAS,MAAA,EAAA4D,KAAA,KAAa;AAC3C,IAAA,IAAM4Z,GAAAA,GAAS9U,KAAAA,EAAM,EACfiU,GAAAA,GAASjU,KAAAA,EAAM;AACrB,IAAA,IAAIf,GAAAA,KAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,EAAU,OAAO,IAAA;AACxD,IAAA,IAAMD,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;KAAO,EAC/BqW,GAAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI/V,GAAAA,CAAI,SAAA,EAAW,CAAC,CAAC,CAAA;AACnD,IAAA,uBACEvH,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,UAAA,iBACE/D,IAAAA,CAAC,MAAA,EAAD,EAAA,QAAA,EAAA,iBACEyH,IAAC,UAAA,EAAD;MAAU,EAAA,EAAI+U,GAAAA;AACZ,MAAA,QAAA,kBAAA/U,GAAAA,CAAC,MAAA,EAAD,EAAM,CAAA,EAAGgV,GAAAA,CAAQ,UAAW;KACpB,CAAA,kBACVzc,IAAAA,CAAC,gBAAA,EAAD;MAAgB,EAAA,EAAIqd,GAAAA;MAAQ,GAAIF,EAAAA,CAAY5V,IAAI,SAAA,CAAA;MAAhD,QAAA,EAAA;AACE,wBAAAE,IAAC,MAAA,EAAD;UAAM,MAAA,EAAO,IAAA;UAAO,SAAA,EAAU,OAAA;UAAQ,WAAA,EAAa6V;SAAO,CAAA;AAC1D,wBAAA7V,IAAC,MAAA,EAAD;UAAM,MAAA,EAAO,KAAA;UAAO,SAAA,EAAU,OAAA;UAAQ,WAAA,EAAY;SAAQ,CAAA;AAC1D,wBAAAA,IAAC,MAAA,EAAD;UAAM,MAAA,EAAO,KAAA;UAAO,SAAA,EAAU,OAAA;UAAQ,WAAA,EAAY;SAAQ,CAAA;AAC1D,wBAAAA,IAAC,MAAA,EAAD;UAAM,MAAA,EAAO,MAAA;UAAO,SAAA,EAAU,OAAA;UAAQ,WAAA,EAAa6V;SAAO;AAC5C;AACZ,KAAA,CAAA,CAAA,EAAA,CAAA,kBACN7V,IAAC,MAAA,EAAD;AAAM,MAAA,QAAA,EAAU,QAAQ+U,GAAAA,CAAAA,CAAAA,CAAAA;MAAW,CAAA,EAAE,GAAA;MAAI,CAAA,EAAE,GAAA;MAAI,KAAA,EAAM,KAAA;MAAM,MAAA,EAAO,KAAA;AAAM,MAAA,IAAA,EAAM,QAAQa,GAAAA,CAAAA,CAAAA,CAAAA;MAAW,KAAA,EAAO,EAAE,eAAe,MAAA;KAAW,CACpI,GAAA,CAAA;AAEN,EAAA,CAAA;EACA,IAAA,EAAM,YAAA;EACN,QAAA,EAAUtW;AACZ,CAAA;ADdA,IEpBMA,EAAAA,GAAyC;EAAE,MAAA,EAAQ,GAAA;EAAK,KAAA,EAAO,CAAA;EAAG,SAAA,EAAW;AAAK,CAAA;AFoBxF,IElBMwW,EAAAA,GAA2C;EAC/C,SAAA,EAAA,CAAY,EAAE,IAAA,EAAAze,GAAAA,EAAM,IAAA,EAAAe,KAAM,OAAA,EAAA4D,GAAAA,EAAS,MAAA,EAAAH,GAAAA,EAAA,KAAa;AAC9C,IAAA,IAAIkE,GAAAA,KAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,EAAU,OAAO,IAAA;AACxD,IAAA,IAAMD,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;KAAO,EAC/B8G,GAAAA,GAAK,MAAMC,GAAAA,EAAMC,GAAAA,GAAK,MAAMC,GAAAA,EAC5B/G,GAAAA,GAAKI,GAAAA,CAAI,MAAA,GAASwG,GAAAA,EAClB1G,GAAAA,GAAKE,IAAI,MAAA,GAAS0G,GAAAA,EAClBuP,MAAKjW,GAAAA,CAAI,KAAA,GAAQwG,KACjB0P,GAAAA,GAAKlW,GAAAA,CAAI,KAAA,GAAQ0G,GAAAA,EACjByP,GAAAA,GAAQnW,GAAAA,CAAI,UAAU,CAAA,CAAA,KAAO,MAAM,CAACA,GAAAA,CAAI,SAAS,IAAA,GAAOA,GAAAA,CAAI,MAAA,GAAS,IAAA,EACrEoW,GAAAA,GAAQpW,GAAAA,CAAI,UAAU,CAAA,CAAA,KAAO,MAAM,CAACA,GAAAA,CAAI,SAAS,IAAA,GAAOA,GAAAA,CAAI,MAAA,GAAS,IAAA,EACrEqW,GAAAA,GAAgC;AACpC,MAAA,CAACJ,KAAIC,GAAE,CAAA;MACP,CAAC,GAAA,GAAMD,KAAIC,GAAE,CAAA;MACb,CAACD,GAAAA,EAAI,MAAMC,GAAE,CAAA;MACb,CAAC,GAAA,GAAMD,GAAAA,EAAI,GAAA,GAAMC,GAAE;AACrB,KAAA;AACA,IAAA,uBACEhW,GAAAA,CAAA1D,QAAAA,EAAA,EAAA,QAAA,EACG6Z,IAAU,GAAA,CAAA,CAAK,CAACzP,GAAAA,EAAIC,GAAAA,CAAAA,EAAK3K,GAAAA,qBACxBzD,IAAAA,CAAC,GAAA,EAAD,EAAA,QAAA,EAAA;AACE,sBAAAyH,IAAC,SAAA,EAAD;QAAS,SAAA,EAAU,kBAAA;QAA8B,EAAA,EAAA3I,GAAAA;QAAQ,EAAA,EAAAe,GAAAA;QAAQ,EAAA,EAAAK,GAAAA;QAAQ,EAAA,EAAAC;OAAK,CAAA;AAC9E,sBAAAsH,IAAC,SAAA,EAAD;QAAS,SAAA,EAAU,yBAAA;QAA0B,EAAA,EAAI0G,GAAAA,GAAKuP,MAAQ,GAAA,GAAM3P,GAAAA;QAAI,EAAA,EAAIK,GAAAA,GAAKuP,MAAQ,GAAA,GAAM1P,GAAAA;AAAI,QAAA,EAAA,EAAI9G,GAAAA,GAAK,IAAA;AAAM,QAAA,EAAA,EAAIE,GAAAA,GAAK;OAAO,CAAA;AAClI,sBAAAI,IAAC,SAAA,EAAD;QAAS,SAAA,EAAU,mBAAA;AAA0B,QAAA,EAAA,EAAI0G,MAAKuP,GAAAA,GAAQ3P,GAAAA;AAAI,QAAA,EAAA,EAAIK,MAAKuP,GAAAA,GAAQ1P,GAAAA;AAAI,QAAA,EAAA,EAAI9G,GAAAA,GAAK,IAAA;AAAM,QAAA,EAAA,EAAIE,GAAAA,GAAK;OAAO;AACrH,KAAA,EAAA,EAJKtH,GAIL,CACJ,CAAA,EACD,CAAA;AAEN,EAAA,CAAA;EACA,IAAA,EAAM,YAAA;EACN,QAAA,EAAUgH;AACZ,CAAA;AFbA,IGvBMA,EAAAA,GAAyC;EAAE,EAAA,EAAI,CAAA;EAAG,EAAA,EAAI,CAAA;EAAG,OAAA,EAAS;AAAK,CAAA;AHuB7E,IGrBM8W,EAAAA,GAA2C;EAC/C,SAAA,EAAA,CAAY,EAAE,OAAA,EAAA/e,GAAAA,EAAS,IAAA,EAAAe,KAAM,IAAA,EAAA4D,GAAAA,EAAM,MAAA,EAAAH,GAAAA,EAAA,KAAa;AAC9C,IAAA,IAAMiE,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/B8G,GAAAA,GAAK,GAAA,GAAMC,GAAAA,EAAMC,GAAAA,GAAK,GAAA,GAAMC,GAAAA,EAC5B4P,GAAAA,GAAOvW,GAAAA,CAAI,EAAA,GAAKwG,GAAAA,EAChBgQ,GAAAA,GAAOxW,GAAAA,CAAI,EAAA,GAAK0G,GAAAA;AACtB,IAAA,uBACExG,IAAC,MAAA,EAAD;AACE,MAAA,CAAA,EAAGgV,GAAAA,CAAQ,QAAA;MACX,SAAA,EAAW,CAAA,UAAA,EAAaqB,IAAK,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKC,GAAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA;MACzD,IAAA,EAAM,CAAA,cAAA,EAAiB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAIxW,GAAAA,CAAI,OAAA,EAAS,CAAC,CAAC,CAAA,CAAA,CAAA,CAAA;MAC3D,MAAA,EAAO,MAAA;MACP,KAAA,EAAO,EAAE,eAAe,MAAA;KACzB,CAAA;AAEL,EAAA,CAAA;EACA,IAAA,EAAM,YAAA;EACN,QAAA,EAAUR;AACZ,CAAA;AHGA,IIrBMA,EAAAA,GAA4C;EAAE,KAAA,EAAO,CAAA;EAAG,KAAA,EAAO,CAAA;EAAG,SAAA,EAAW;AAAK,CAAA;AAGxF,SAASiX,GAAIlf,GAAAA,EAAc;AACzB,EAAA,OAAO,IAAA,CAAK,GAAA,CAAImf,GAAAA,GAAO,IAAA,GAAO,GAAG,CAAA;AACnC;AAEA,IAAMC,EAAAA,GAAiD;EACrD,SAAA,EAAA,CAAY,EAAE,OAAA,EAAApf,GAAAA,EAAS,SAAAe,GAAAA,EAAS,MAAA,EAAA4D,KAAA,KAAa;AAC3C,IAAA,IAAM+Y,MAASjU,KAAAA,EAAM;AACrB,IAAA,IAAIf,GAAAA,KAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,EAAU,OAAO,IAAA;AACxD,IAAA,IAAMD,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/BkX,MAAkB,EAAC;AACzB,IAAA,KAAA,IAASpe,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIwH,GAAAA,CAAI,OAAOzI,GAAAA,EAAAA,EAAK;AAClC,MAAA,IAAMiG,OAAMhF,GAAAA,GAAI,CAAA,KAAMwH,IAAI,KAAA,GAAQ,CAAA,CAAA,GAAM,KAElC6W,GAAAA,GAAMJ,EAAAA,CAAIje,MAAI,CAAA,GAAI,CAAC,IAAI,CAAA,EACvBse,GAAAA,GAAML,GAAIje,GAAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AAC7B,MAAAhB,GAAAA,CAAM,IAAA,CAAK,CAAA,KAAA,EAAQgG,GAAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,MAAA,EAAA,CAAWA,GAAAA,GAAIqZ,GAAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAAA,IAAA,EAAQrZ,GAAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,OAAA,EAAA,CAAYA,MAAIsZ,GAAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAG,CAAA;AACjH,IAAA;AACA,IAAA,IAAMC,MAAoC,EAAC;AAC3C,IAAA,KAAA,IAASve,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIwH,GAAAA,CAAI,OAAOzI,GAAAA,EAAAA,EAAK;AAClC,MAAA,IAAMqP,GAAAA,GAAK,EAAA,GAAK6P,EAAAA,CAAIje,GAAAA,GAAI,IAAI,GAAG,CAAA,GAAI,EAAA,GAAK,EAAA,EAClCqO,MAAK,EAAA,GAAK4P,EAAAA,CAAIje,GAAAA,GAAI,CAAA,GAAI,GAAG,CAAA,GAAI,EAAA;AACnC,MAAAE,GAAAA,CAAc,IAAA,CAAK,CAACkO,GAAAA,EAAIC,GAAE,CAAC,CAAA;AAC7B,IAAA;AACA,IAAA,uBACEpO,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA,iBACE0D,GAAAA,CAAC,MAAA,EAAD,EAAA,QAAA,kBACEA,IAAC,UAAA,EAAD;MAAU,EAAA,EAAI+U,GAAAA;AACZ,MAAA,QAAA,kBAAA/U,GAAAA,CAAC,MAAA,EAAD,EAAM,CAAA,EAAGgV,GAAAA,CAAQ,UAAW;AACpB,KAAA,CAAA,EACN,CAAA,kBACNzc,KAAC,GAAA,EAAD;AAAG,MAAA,QAAA,EAAU,QAAQwc,GAAAA,CAAAA,CAAAA,CAAAA;MAAW,OAAA,EAAS,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAIjV,GAAAA,CAAI,SAAA,EAAW,CAAC,CAAC,CAAA;MAAG,KAAA,EAAO,EAAE,eAAe,MAAA,EAAO;MAAjH,QAAA,EAAA,CACG4W,IAAM,GAAA,CAAA,CAAKrf,KAAGe,GAAAA,qBACb4H,IAAC,MAAA,EAAD;QAAoB,SAAA,EAAU,cAAA;QAAkB,CAAA,EAAA3I,GAAAA;QAAG,IAAA,EAAK;OAAQ,EAArD,CAAA,CAAA,EAAIiB,GAAAA,CAAAA,CAAiD,CACjE,GACAue,GAAAA,CAAc,GAAA,CAAA,CAAK,CAACnQ,GAAAA,EAAIC,GAAAA,CAAAA,EAAK3K,GAAAA,qBAC5BzD,IAAAA,CAAC,GAAA,EAAD,EAAA,QAAA,EAAA,iBACEyH,GAAAA,CAAC,SAAA,EAAD;QAAS,SAAA,EAAU,cAAA;QAAmB,EAAA,EAAA3I,GAAAA;QAAQ,EAAA,EAAAe,GAAAA;QAAI,EAAA,EAAI,CAAA;QAAG,EAAA,EAAI,GAAA;QAAK,IAAA,EAAK;OAAQ,CAAA,kBAC/E4H,GAAAA,CAAC,SAAA,EAAD;QAAS,SAAA,EAAU,cAAA;QAAmB,EAAA,EAAA3I,GAAAA;QAAQ,EAAA,EAAAe,GAAAA;QAAI,EAAA,EAAI,GAAA;QAAK,EAAA,EAAI,CAAA;QAAG,IAAA,EAAK;AAAQ,OAAA,CAC9E,CAAA,EAAA,EAHK,IAAIE,GAAAA,CAAAA,CAGT,CACJ,CACA;KACH,CAAA,GAAA,CAAA;AAEN,EAAA,CAAA;EACA,IAAA,EAAM,YAAA;EACN,QAAA,EAAUgH;AACZ,CAAA;AA1CA,ICTMA,EAAAA,GAA8D;EAClE,UAAA,EAAY,CAAA;EACZ,WAAA,EAAa;AACf,CAAA;ADMA,ICJMwX,EAAAA,GAAuD;EAC3D,SAAA,EAAA,CAAY,EAAE,OAAA,EAAAzf,GAAAA,EAAS,IAAA,EAAAe,KAAM,IAAA,EAAA4D,GAAAA,EAAM,MAAA,EAAAH,GAAAA,EAAA,KAAa;AAC9C,IAAA,IAAMiE,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/B8G,GAAAA,GAAK,GAAA,GAAMC,GAAAA,EACXC,GAAAA,GAAK,GAAA,GAAMC,GAAAA,EACX5E,GAAAA,GAAQmT,GAAAA,CAAQ,QAAA,EAChB3P,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAMxD,GAAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI/B,GAAAA,CAAI,UAAA,EAAYA,GAAAA,CAAI,WAAW,CAAC,CAAC,CAAA,EACjFiC,GAAAA,GAAOF,GAAAA,GAAQwD,GAAAA,EACf0R,MAAsC,EAAC;AAC7C,IAAA,KAAA,IAASze,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI+M,GAAAA,EAAGjN,GAAAA,EAAAA,EAAK;AAC1B,MAAA,IAAM4e,GAAAA,GAAAA,CAAQ1e,MAAI,GAAA,IAAOyJ,GAAAA;AACzB,MAAA,IAAIoQ,GAAU6E,GAAAA,EAAMnV,GAAAA,EAAOrC,GAAAA,EAAQ,KAAK,MAAM,CAAA,EAAG;AACjD,MAAA,IAAMgJ,GAAAA,GAAKwM,GAAAA,CAAQ,WAAA,CAAYgC,GAAI,CAAA;AACnC,MAAA7a,IAAM,IAAA,CAAK;AAAE,QAAA,EAAA,EAAIqM,GAAAA,CAAG,CAAA;AAAG,QAAA,EAAA,EAAIA,GAAAA,CAAG;OAAG,CAAA;AACnC,IAAA;AACA,IAAA,IAAM9I,MAAKI,GAAAA,CAAI,UAAA,GAAawG,GAAAA,EACtB1G,GAAAA,GAAKE,IAAI,UAAA,GAAa0G,GAAAA;AAC5B,IAAA,uBACExG,GAAAA,CAAA1D,QAAAA,EAAA,EAAA,QAAA,EACGya,GAAAA,CAAM,GAAA,CAAA,CAAK1f,GAAAA,EAAGe,GAAAA,qBACb4H,GAAAA,CAAC,SAAA,EAAD;AAAiB,MAAA,EAAA,EAAI5D,GAAAA,CAAE,EAAA;AAAI,MAAA,EAAA,EAAIA,GAAAA,CAAE,EAAA;MAAQ,EAAA,EAAAlD,GAAAA;MAAQ,EAAA,EAAAhB,GAAAA;MAAI,IAAA,EAAK;KAAS,EAArDI,GAAqD,CACpE,CAAA,EACD,CAAA;AAEN,EAAA,CAAA;EACA,IAAA,EAAM,MAAA;EACN,QAAA,EAAUgH;AACZ,CAAA;ADvBA,IERMA,EAAAA,GAAyC;EAAE,UAAA,EAAY,CAAA;EAAG,SAAA,EAAW;AAAI,CAAA;AFQ/E,IENMuV,EAAAA,GAAU,GAAA;AFMhB,IEHMoC,EAAAA,GAAgB;AACpB,EAAA,mBAAA;AACA,EAAA,0BAAA;AACA,EAAA,0BAAA;AACA,EAAA,yBAAA;AACA,EAAA,yBAAA;AACA,EAAA;AACF,CAAA;AAEA,SAASC,GAAY7f,GAAAA,EAA8C;AAGjE,EAAA,IAAM8f,GAAAA,GAAOC,GAAAA,GAAW,IAAA,CAAK,EAAA,GAAM,GAAA;AACnC,EAAA,OAAO;IAAE,EAAA,EAAI,IAAA,CAAK,IAAID,GAAG,CAAA;IAAG,EAAA,EAAI,CAAC,IAAA,CAAK,GAAA,CAAIA,GAAG;AAAE,GAAA;AACjD;AAEA,IAAME,EAAAA,GAA2C;AAC/C,EAAA,SAAA,EAAA,CAAY,EAAE,OAAA,EAAAhgB,GAAAA,EAAS,IAAA,EAAAe,GAAAA,EAAM,IAAA,EAAA4D,GAAAA,EAAM,OAAA,EAAAH,GAAAA,EAAS,MAAA,EAAAvD,GAAAA,EAAA,KAAa;AACvD,IAAA,IAAMyc,MAASjU,KAAAA,EAAM;AACrB,IAAA,IAAIf,GAAAA,KAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,EAAU,OAAO,IAAA;AACxD,IAAA,IAAMD,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;KAAO,EAC/B8G,GAAAA,GAAK,MAAMC,GAAAA,EACXC,GAAAA,GAAK,MAAMC,GAAAA,EACX5E,GAAAA,GAAQmT,GAAAA,CAAQ,QAAA,EAChB,EAAE,EAAA,EAAA9c,KAAI,EAAA,EAAAkE,GAAAA,EAAA,GAAO8a,EAAAA,CAAYpX,GAAAA,CAAI,SAAS,GAEtCmV,GAAAA,GAAoD,EAAC,EACrDC,GAAAA,GAAoC,EAAC;AAC3C,IAAA,KAAA,IAAS5c,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIuc,EAAAA,EAASzc,GAAAA,EAAAA,EAAK;AAChC,MAAA,IAAMoQ,GAAAA,GAAKwM,GAAAA,CAAQ,WAAA,CAAa1c,GAAAA,GAAIuc,KAAWhT,GAAK,CAAA,EAG9CnJ,GAAAA,GAAI,EAAE8P,GAAAA,CAAG,EAAA,GAAK8O,GAAAA,GAAK9O,GAAAA,CAAG,KAAK+O,GAAAA,CAAAA,EAE3Bnf,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAA,CAAKM,GAAAA,GAAI,KAAK,CAAA,EAAG,MAAM,CAAC,CAAA,EAC7C8e,GAAAA,GAAS,IAAA,CAAK,KAAA,CAAMpf,GAAAA,GAAI6e,GAAc,MAAM,CAAA;AAClDhC,MAAAA,IAAM,IAAA,CAAK;AAAE,QAAA,CAAA,EAAGzM,GAAAA,CAAG,CAAA;AAAG,QAAA,CAAA,EAAGA,GAAAA,CAAG,CAAA;QAAG,MAAA,EAAA1K;OAAQ,CAAA,EACvCoX,IAAM,IAAA,CAAK;AACT,QAAA,CAAA,EAAG1M,GAAAA,CAAG,CAAA,GAAIA,GAAAA,CAAG,EAAA,GAAK1I,IAAI,UAAA,GAAawG,GAAAA;AACnC,QAAA,CAAA,EAAGkC,GAAAA,CAAG,CAAA,GAAIA,GAAAA,CAAG,EAAA,GAAK1I,IAAI,UAAA,GAAa0G;OACpC,CAAA;AACH,IAAA;AAGA,IAAA,IAAM2O,GAAAA,GAAc,EAAC,EACjBC,GAAAA,GAAkB,IAAA;AACtB,IAAA,KAAA,IAAS9c,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIuc,EAAAA,EAASxd,GAAAA,EAAAA,EAAK;AAChC,MAAA,IAAMmgB,GAAAA,GAASvC,GAAAA,CAAM3c,GAAAA,CAAAA,CAAG,MAAA;AACpB,MAAA,CAAC8c,GAAAA,IAAOA,GAAAA,CAAI,MAAA,KAAWoC,GAAAA,IACzBla,GAAAA,GAAM;QAAE,MAAA,EAAAlF,GAAAA;AAAQ,QAAA,IAAA,EAAM,CAACE,GAAC;AAAE,OAAA,EAC1B6c,IAAK,IAAA,CAAKC,GAAG,KAEbA,GAAAA,CAAI,IAAA,CAAK,KAAK9c,GAAC,CAAA;AAEnB,IAAA;AACI6c,IAAAA,GAAAA,CAAK,MAAA,GAAS,CAAA,IAAKA,GAAAA,CAAK,CAAA,CAAA,CAAG,MAAA,KAAWA,GAAAA,CAAKA,GAAAA,CAAK,MAAA,GAAS,CAAA,CAAA,CAAG,MAAA,KAC9Dje,IAAKie,GAAAA,CAAK,MAAA,GAAS,CAAA,CAAA,CAAG,IAAA,GAAOA,GAAAA,CAAKA,GAAAA,CAAK,MAAA,GAAS,CAAA,CAAA,CAAG,IAAA,CAAK,MAAA,CAAOA,GAAAA,CAAK,CAAA,CAAA,CAAG,IAAI,CAAA,EAC3EA,IAAK,KAAA,EAAM,CAAA;AAGb,IAAA,IAAMG,GAAAA,GAAAA,CAAWje,GAAAA,KAAqB;AAGpC,MAAA,IAAMka,GAAAA,GAAQiE,IAAI,IAAA,CAAK,CAAA,GACjBlE,GAAAA,GAAOkE,GAAAA,CAAI,IAAA,CAAKA,GAAAA,CAAI,IAAA,CAAK,MAAA,GAAS,CAAA,CAAA,EAClCjT,GAAAA,GAAAA,CAAQgP,MAAQ,CAAA,GAAIsD,EAAAA,IAAWA,IAC/BpS,GAAAA,GAAAA,CAAQ6O,GAAAA,GAAO,CAAA,IAAKuD,EAAAA,EACpB4C,GAAAA,GAAe;AAAClV,QAAAA,GAAAA;AAAM,QAAA,GAAGiT,GAAAA,CAAI,IAAA;AAAM/S,QAAAA;AAAI,OAAA,EACvC8S,MAAWkC,GAAAA,CAAa,GAAA,CAAA,CAAKpgB,GAAAA,KAAM4d,GAAAA,CAAM3c,GAAAA,CAAE,CAAA,EAC3Cmd,MAAWgC,GAAAA,CAAa,GAAA,CAAA,CAAKpgB,GAAAA,KAAM6d,GAAAA,CAAM5c,GAAAA,CAAE,CAAA,CAAE,SAAQ,EACrD8J,GAAAA,GAAM,CAAC,GAAGmT,GAAAA,EAAU,GAAGE,GAAQ,CAAA,EACjC/c,MAAI,CAAA,EAAA,EAAK0J,GAAAA,CAAI,CAAA,CAAA,CAAG,CAAA,CAAE,QAAQ,CAAC,CAAA,IAAKA,GAAAA,CAAI,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA;AACtD,MAAA,KAAA,IAAS9J,GAAAA,GAAI,GAAGA,GAAAA,GAAI8J,GAAAA,CAAI,QAAQ/K,GAAAA,EAAAA,EAC9BmB,GAAAA,IAAK,CAAA,GAAA,EAAM4J,GAAAA,CAAI9J,GAAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAK8J,GAAAA,CAAI9J,GAAAA,CAAAA,CAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA;AAEtD,MAAA,OAAOI,GAAAA,GAAI,IAAA;AACb,IAAA,CAAA;AAEA,IAAA,uBACEH,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA,iBACE0D,GAAAA,CAAC,MAAA,EAAD,EAAA,QAAA,kBACEA,IAAC,UAAA,EAAD;MAAU,EAAA,EAAI+U,GAAAA;AACZ,MAAA,QAAA,kBAAA/U,GAAAA,CAAC,MAAA,EAAD,EAAM,CAAA,EAAGgV,GAAAA,CAAQ,UAAW;AACpB,KAAA,CAAA,EACN,CAAA,kBACNhV,IAAC,GAAA,EAAD;AAAG,MAAA,QAAA,EAAU,QAAQ+U,GAAAA,CAAAA,CAAAA,CAAAA;AAClB,MAAA,QAAA,EAAAI,IAAK,GAAA,CAAA,CAAK9d,KAAKe,GAAAA,qBACd4H,IAAC,MAAA,EAAD;QAAc,SAAA,EAAWiX,EAAAA,CAAczB,IAAI,MAAA,CAAA;AAAS,QAAA,CAAA,EAAGF,IAAQE,GAAG;AAAI,OAAA,EAA3Dld,GAA2D,CACvE;KACA,CACH,GAAA,CAAA;AAEN,EAAA,CAAA;EACA,IAAA,EAAM,YAAA;EACN,QAAA,EAAUgH;AACZ,CAAA;AA/EA,IChBMA,EAAAA,GAA0C;EAC9C,KAAA,EAAO,CAAA;EACP,KAAA,EAAO,mBAAA;EACP,IAAA,EAAM,EAAA;EACN,SAAA,EAAW,QAAA;EACX,OAAA,EAAS;AACX,CAAA;ADUA,ICRMoY,EAAAA,GAA6C;EACjD,SAAA,EAAA,CAAY,EAAE,OAAA,EAAArgB,GAAAA,EAAS,IAAA,EAAAe,KAAM,IAAA,EAAA4D,GAAAA,EAAM,MAAA,EAAAH,GAAAA,EAAA,KAAa;AAC9C,IAAA,IAAMiE,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/B8G,GAAAA,GAAK,GAAA,GAAMC,GAAAA,EACXC,GAAAA,GAAK,GAAA,GAAMC,GAAAA,EACXkR,GAAAA,GAAU7X,GAAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAIwG,GAAAA,EAAIE,GAAE,CAAA;AAC3C,IAAA,uBACExG,IAAC,MAAA,EAAD;AACE,MAAA,CAAA,EAAGgV,GAAAA,CAAQ,QAAA;MACX,IAAA,EAAK,MAAA;AACL,MAAA,MAAA,EAAQlV,GAAAA,CAAI,KAAA;MACZ,WAAA,EAAa6X,GAAAA;AACb,MAAA,eAAA,EAAiB7X,IAAI,IAAA,IAAQ,MAAA;AAC7B,MAAA,aAAA,EAAeA,GAAAA,CAAI,OAAA;MACnB,YAAA,EAAa,oBAAA;MACb,KAAA,EAAO,EAAE,YAAA,EAAcA,GAAAA,CAAI,SAAA;KAC5B,CAAA;AAEL,EAAA,CAAA;EACA,IAAA,EAAM,YAAA;EACN,QAAA,EAAUR;AACZ,CAAA;ADbA,IEHMA,EAAAA,GAA2C;EAC/C,KAAA,EAAO,CAAA;EACP,KAAA,EAAO,EAAA;EACP,GAAA,EAAK,CAAA;EACL,KAAA,EAAO,EAAA;EACP,OAAA,EAAS,IAAA;EACT,KAAA,EAAO,SAAA;EACP,MAAA,EAAQ,CAAA;EACR,YAAA,EAAc,CAAA;EACd,aAAA,EAAe,EAAA;EACf,aAAA,EAAe,CAAA;EACf,WAAA,EAAa;AACf,CAAA;AFTA,IEWMsY,EAAAA,GAA+C;EACnD,SAAA,EAAA,CAAY,EAAE,OAAA,EAAAvgB,GAAAA,EAAS,IAAA,EAAAe,KAAM,IAAA,EAAA4D,GAAAA,EAAM,MAAA,EAAAH,GAAAA,EAAA,KAAa;AAC9C,IAAA,IAAMiE,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAC/BuV,MAASjU,KAAAA,EAAM,EACfD,MAASC,KAAAA,EAAM,EACf8U,MAAS9U,KAAAA,EAAM,EACfwF,GAAAA,GAAK,GAAA,GAAMC,KACXC,GAAAA,GAAK,GAAA,GAAMC,KACXmN,GAAAA,GAAM,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI9T,GAAAA,CAAI,cAAc,CAAC,CAAC,GAG/C+X,GAAAA,GAAAA,CAAaxgB,QAAc,CAAA,GAAIuc,GAAAA,GAAM,IAAA,GAAO,IAAA,CAAK,IAAItb,GAAAA,GAAI,IAAA,GAAO,GAAG,CAAA,EACnEwf,GAAAA,GAAAA,CAAezgB,GAAAA,KAAc,CAAA,GAAIuc,GAAAA,GAAM,GAAA,GAAM,KAAK,GAAA,CAAItb,GAAAA,GAAI,OAAO,GAAG,CAAA,EACpEyf,MAAAA,CAAe1gB,GAAAA,KAAcuc,GAAAA,GAAM,CAAA,GAAI,KAAK,GAAA,CAAItb,GAAAA,GAAI,OAAO,GAAG,CAAA,EAI9D0f,MAAiBlY,GAAAA,CAAI,KAAA,GAAQwG,GAAAA,EAC7B2R,GAAAA,GAAQnY,IAAI,GAAA,GAAMwG,GAAAA,EAClB4R,MAAWpY,GAAAA,CAAI,MAAA,GAASwG,KAE1B6R,GAAAA,GAAU,EAAA,GAAA,CADKrY,IAAI,KAAA,GAAQkY,GAAAA,GAAAA,CAAkBlY,IAAI,KAAA,GAAQ,CAAA,IAAKmY,OAClC,CAAA,GAAIC,GAAAA,EAI9BE,MAA+C,EAAC;AACtD,IAAA,KAAA,IAAS9f,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIwH,GAAAA,CAAI,OAAOzI,GAAAA,EAAAA,EAAK;AAClC,MAAA,IAAMghB,GAAAA,GAAcL,GAAAA,GAAiBH,GAAAA,CAAUvf,GAAC,CAAA,EAC1CggB,GAAAA,GAAKH,GAAAA,EACLI,GAAAA,GAAKJ,GAAAA,GAAUE,GAAAA,EAGfG,GAAAA,GAFM,IAAA,CAAK,GAAA,CAAA,CAAM1Y,IAAI,KAAA,GAAQiY,GAAAA,CAAYzf,GAAC,CAAA,IAAK,IAAA,CAAK,EAAA,GAAM,GAC7C,CAAA,IAAOgO,GAAAA,GAAKE,GAAAA,CAAAA,GACC,GAAA,GAAe,CAAA,EACzCpE,GAAAA,GAAM;QACV,CAACkW,GAAAA,GAAKE,KAAW,GAAI,CAAA;QACrB,CAACD,GAAAA,GAAKC,KAAW,GAAI,CAAA;QACrB,CAACD,GAAAA,GAAKC,KAAW,GAAI,CAAA;QACrB,CAACF,GAAAA,GAAKE,KAAW,GAAI;AACvB,OAAA;AACAJ,MAAAA,IAAM,IAAA,CAAK;QACT,MAAA,EAAQhW,GAAAA,CAAI,IAAA,CAAK,CAACqW,KAAIC,GAAAA,CAAAA,KAAQ,GAAGD,GAAAA,CAAG,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKC,IAAG,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,KAAK,GAAG,CAAA;QAC3E,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI5Y,GAAAA,CAAI,OAAA,GAAUgY,GAAAA,CAAYxf,GAAC,CAAA,EAAG,CAAC,CAAC;OAC/D,CAAA,EACDiF,OAAWya,GAAAA,GAAiBC,GAAAA;AAC9B,IAAA;AAIA,IAAA,IAAMU,GAAAA,GAAM7Y,GAAAA,CAAI,aAAA,GAAgB,IAAA,CAAK,EAAA,GAAM,GAAA,EACrC8Y,GAAAA,GAAO,IAAA,CAAK,GAAA,CAAID,GAAE,CAAA,EAAGE,GAAAA,GAAO,IAAA,CAAK,GAAA,CAAIF,GAAE,CAAA,EAIvCG,GAAAA,GAAM,EAAA,GAAKF,GAAAA,GAAO,GAAA,GAAO,CAAA,EACzBG,GAAAA,GAAM,EAAA,GAAKF,GAAAA,GAAO,GAAA,GAAO,CAAA,EACzBG,GAAAA,GAAM,EAAA,GAAKJ,GAAAA,GAAO,GAAA,GAAO,CAAA,EACzBK,GAAAA,GAAM,EAAA,GAAKJ,GAAAA,GAAO,GAAA,GAAO,CAAA,EAEzBK,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAIpZ,GAAAA,CAAI,aAAA,EAAe,CAAC,CAAC,CAAA,EAC/CqZ,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAIrZ,GAAAA,CAAI,WAAA,EAAa,CAAC,CAAC,CAAA,EAG7CsZ,GAAAA,GAAQF,GAAAA,IAAMC,GAAAA,GAChB;AACE,MAAA;QAAE,MAAA,EAAQ,CAAA;QAAG,KAAA,EAAO;AAAO,OAAA;AAC3B,MAAA;QAAE,MAAA,EAAQD,GAAAA;QAAI,KAAA,EAAO;AAAO,OAAA;AAC5B,MAAA;QAAE,MAAA,EAAQC,GAAAA;QAAI,KAAA,EAAO;AAAO,OAAA;AAC5B,MAAA;QAAE,MAAA,EAAQ,CAAA;QAAG,KAAA,EAAO;AAAO;KAC7B,GACA;AACE,MAAA;QAAE,MAAA,EAAQ,CAAA;QAAG,KAAA,EAAO;AAAO,OAAA;AAC3B,MAAA;QAAE,MAAA,EAAQA,GAAAA;QAAI,KAAA,EAAO;AAAO,OAAA;AAC5B,MAAA;QAAE,MAAA,EAAQD,GAAAA;QAAI,KAAA,EAAO;AAAO,OAAA;AAC5B,MAAA;QAAE,MAAA,EAAQ,CAAA;QAAG,KAAA,EAAO;AAAO;AAC7B,KAAA;AAEJ,IAAA,uBACE3gB,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA,iBACE/D,IAAAA,CAAC,MAAA,EAAD,EAAA,QAAA,EAAA;AACE,sBAAAyH,IAAC,UAAA,EAAD;QAAU,EAAA,EAAI+U,GAAAA;AACZ,QAAA,QAAA,kBAAA/U,GAAAA,CAAC,MAAA,EAAD,EAAM,CAAA,EAAGgV,GAAAA,CAAQ,UAAW;OACpB,CAAA;AACV,sBAAAhV,IAAC,gBAAA,EAAD;QAAgB,EAAA,EAAI4V,GAAAA;QAAQ,EAAA,EAAIkD,GAAAA;QAAK,EAAA,EAAIC,GAAAA;QAAK,EAAA,EAAIC,GAAAA;QAAK,EAAA,EAAIC,GAAAA;QAAK,aAAA,EAAc,gBAAA;AAC3E,QAAA,QAAA,EAAAG,IAAM,GAAA,CAAA,CAAK/hB,KAAGe,GAAAA,qBAAM4H,IAAC,MAAA,EAAD;AAAc,UAAA,MAAA,EAAQzH,GAAAA,CAAE,MAAA;AAAQ,UAAA,SAAA,EAAWA,GAAAA,CAAE;AAAQ,SAAA,EAA1CD,GAA0C,CAAC;OAC7D,CAAA;AAChB,sBAAA0H,IAAC,MAAA,EAAD;QAAM,EAAA,EAAIa,GAAAA;QAAQ,SAAA,EAAU,gBAAA;QAAiB,CAAA,EAAE,GAAA;QAAI,CAAA,EAAE,GAAA;QAAI,KAAA,EAAM,KAAA;QAAM,MAAA,EAAO,KAAA;QAC1E,QAAA,kBAAAb,IAAC,MAAA,EAAD;UAAM,CAAA,EAAE,GAAA;UAAI,CAAA,EAAE,GAAA;UAAI,KAAA,EAAM,KAAA;UAAM,MAAA,EAAO,KAAA;AAAM,UAAA,IAAA,EAAM,QAAQ4V,GAAAA,CAAAA,CAAAA;SAAY;OACjE;AACF,KAAA,EAAA,CAAA,kBACN5V,GAAAA,CAAC,GAAA,EAAD;AAAG,MAAA,QAAA,EAAU,QAAQ+U,GAAAA,CAAAA,CAAAA,CAAAA;AAAW,MAAA,IAAA,EAAM,QAAQlU,GAAAA,CAAAA,CAAAA,CAAAA;AAC3C,MAAA,QAAA,EAAAuX,IAAM,GAAA,CAAA,CAAK/gB,KAAGe,GAAAA,qBACb4H,IAAC,SAAA,EAAD;AAAiB,QAAA,MAAA,EAAQpF,GAAAA,CAAE,MAAA;AAAQ,QAAA,IAAA,EAAMkF,GAAAA,CAAI,KAAA;AAAO,QAAA,OAAA,EAASlF,GAAAA,CAAE;AAAU,OAAA,EAA3DtC,GAA2D,CAC1E;KACA,CACH,GAAA,CAAA;AAEN,EAAA,CAAA;EACA,IAAA,EAAM,YAAA;EACN,QAAA,EAAUgH;AACZ,CAAA;AF9GA,IGiBMA,EAAAA,GAAuC;EAC3C,MAAA,EAAQ,mBAAA;EACR,QAAA,EAAU,IAAA;EACV,UAAA,EAAY,GAAA;EACZ,OAAA,EAAS,EAAA;EACT,aAAA,EAAe,EAAA;EACf,WAAA,EAAa,EAAA;EACb,QAAA,EAAU,EAAA;EACV,aAAA,EAAe,GAAA;EACf,aAAA,EAAe,IAAA;EACf,WAAA,EAAa,EAAA;EACb,UAAA,EAAY,GAAA;EACZ,UAAA,EAAY,CAAA;EACZ,QAAA,EAAU,IAAA;EACV,QAAA,EAAU;AACZ,CAAA;AHhCA,IGkCM+Z,EAAAA,GAAgB,GAAA;AHlCtB,IGoCMC,EAAAA,GAAuC;AAC3C,EAAA,SAAA,EAAA,CAAY,EAAE,OAAA,EAAAjiB,GAAAA,EAAS,IAAA,EAAAe,GAAAA,EAAM,IAAA,EAAA4D,GAAAA,EAAM,OAAA,EAAAH,GAAAA,EAAS,MAAA,EAAAvD,GAAAA,EAAA,KAAa;AACvD,IAAA,IAAMihB,MAAazY,KAAAA,EAAM,EACnB0Y,MAAc1Y,KAAAA,EAAM,EACpB2Y,MAAc3Y,KAAAA,EAAM;AAC1B,IAAA,IAAIf,QAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,IAAYA,GAAAA,KAAY,WAAW,OAAO,IAAA;AACjF,IAAA,IAAMD,GAAAA,GAAM;MAAE,GAAGR,EAAAA;MAAU,GAAGE;AAAO,KAAA,EAI/BqC,MAAQmT,GAAAA,CAAQ,QAAA,EAEhBG,GAAAA,GAAe,IACjBC,GAAAA,GAAmB,IAAA;AACvB,IAAA,KAAA,IAAS9c,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI+gB,EAAAA,EAAejhB,GAAAA,EAAAA,EAAK;AACtC,MAAA,IAAMG,MAAKD,GAAAA,GAAI+gB,EAAAA,GAAiBxX,KAC1B2G,GAAAA,GAAKwM,GAAAA,CAAQ,YAAYzc,GAAC,CAAA;AAC5BiQ,MAAAA,GAAAA,CAAG,EAAA,GAAK,CAAA,IACL4M,GAAAA,KACHhZ,GAAAA,GAAM,EAAC,EACP+Y,GAAAA,CAAK,IAAA,CAAKC,GAAG,CAAA,CAAA,EAEfA,GAAAA,CAAI,IAAA,CAAK;AAAE,QAAA,CAAA,EAAG5M,GAAAA,CAAG,CAAA;AAAG,QAAA,CAAA,EAAGA,GAAAA,CAAG;AAAE,OAAC,KAE7BpM,GAAAA,GAAM,IAAA;AAEV,IAAA;AAGA,IAAA,IAAI+Y,GAAAA,CAAK,SAAS,CAAA,EAAG;AACnB,MAAA,IAAMuE,GAAAA,GAAc1E,GAAAA,CAAQ,WAAA,CAAY,CAAC,CAAA,EACnC2E,MAAa3E,GAAAA,CAAQ,WAAA,CAAc,GAAA,GAAqBqE,EAAAA,GAAiBxX,GAAK,CAAA;AACpF,MAAA,IAAI6X,GAAAA,CAAY,EAAA,GAAK,CAAA,IAAKC,GAAAA,CAAW,KAAK,CAAA,EAAG;AAC3C,QAAA,IAAMC,GAAAA,GAAOzE,IAAK,KAAA,EAAM;AACxB,QAAAjd,IAAKid,GAAAA,CAAK,MAAA,GAAS,CAAA,CAAA,CAAG,IAAA,CAAK,GAAGyE,GAAI,CAAA;AACpC,MAAA;AACF,IAAA;AACA,IAAA,IAAMC,MAAuB,EAAC;AAC9B,IAAA,KAAA,IAAWrE,OAAOL,GAAAA,EAAM;AACtB,MAAA,IAAIK,GAAAA,CAAI,SAAS,CAAA,EAAG;AACpB,MAAA,IAAI9c,MAAI,CAAA,EAAA,EAAK8c,GAAAA,CAAI,CAAA,CAAA,CAAG,EAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKA,IAAI,CAAA,CAAA,CAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA;AACtD,MAAA,KAAA,IAASld,GAAAA,GAAI,GAAGA,GAAAA,GAAIkd,GAAAA,CAAI,QAAQxZ,GAAAA,EAAAA,EAC9B5D,GAAAA,IAAK,CAAA,GAAA,EAAMod,GAAAA,CAAIld,GAAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKkd,GAAAA,CAAIld,GAAAA,CAAAA,CAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA;AAEtD,MAAA8S,GAAAA,CAAW,KAAK1S,GAAC,CAAA;AACnB,IAAA;AAKA,IAAA,IAAM4N,GAAAA,GAAK,GAAA,GAAMC,GAAAA,EACXC,GAAAA,GAAK,GAAA,GAAMC,KACXqT,GAAAA,GAAa,IAAA,CAAK,GAAA,CAAIxT,GAAAA,EAAIE,GAAE,CAAA,EAC5BuT,MAAeja,GAAAA,CAAI,UAAA,GAAaga,GAAAA,EAChCE,GAAAA,GAAala,GAAAA,CAAI,QAAA,GAAWga,KAE5BG,GAAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGna,GAAAA,CAAI,OAAA,GAAUA,IAAI,aAAa,CAAA,EACvDoa,GAAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAA,EAAKpa,IAAI,OAAA,GAAUA,GAAAA,CAAI,aAAA,GAAgB,GAAG,CAAA,EAC/Dqa,GAAAA,GAAqB,sBAAsBra,GAAAA,CAAI,MAAA,CAAA,CAAA,EAAUA,GAAAA,CAAI,WAAA,CAAA,SAAA,CAAA,EAC7Dsa,GAAAA,GAAY,CAAA,mBAAA,EAAsBta,GAAAA,CAAI,MAAA,CAAA,CAAA,EAAUA,GAAAA,CAAI,QAAA,CAAA,SAAA,CAAA;AAE1D,IAAA,uBACEvH,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA;sBACE/D,IAAAA,CAAC,MAAA,EAAD,EAAA,QAAA,EAAA;AACE,wBAAAA,KAAC,gBAAA,EAAD;UAAgB,EAAA,EAAIghB,GAAAA;UAAY,EAAA,EAAG,IAAA;UAAK,EAAA,EAAG,IAAA;UAAK,EAAA,EAAG,IAAA;UAAK,EAAA,EAAG,MAAA;UAA3D,QAAA,EAAA;AACE,4BAAAvZ,IAAC,MAAA,EAAD;cAAM,MAAA,EAAO,IAAA;cAAK,KAAA,EAAO;AAAE,gBAAA,SAAA,EAAWF,GAAAA,CAAI,MAAA;AAAQ,gBAAA,WAAA,EAAaA,GAAAA,CAAI;AAAS;aAAI,CAAA;AAChF,4BAAAE,IAAC,MAAA,EAAD;AAAM,cAAA,MAAA,EAAQ,GAAGia,GAAAA,CAAAA,CAAAA,CAAAA;cAAc,KAAA,EAAO;AAAE,gBAAA,SAAA,EAAWna,GAAAA,CAAI,MAAA;AAAQ,gBAAA,WAAA,EAAaA,GAAAA,CAAI;AAAW;aAAI,CAAA;AAC/F,4BAAAE,IAAC,MAAA,EAAD;cAAM,MAAA,EAAQ,CAAA,EAAGF,IAAI,OAAA,CAAA,CAAA,CAAA;cAAY,KAAA,EAAO;gBAAE,SAAA,EAAWqa,GAAAA;gBAAoB,WAAA,EAAa;AAAE;aAAI,CAAA;AAC5F,4BAAAna,IAAC,MAAA,EAAD;AAAM,cAAA,MAAA,EAAQ,GAAGka,GAAAA,CAAAA,CAAAA,CAAAA;cAAc,KAAA,EAAO;AAAE,gBAAA,SAAA,EAAWpa,GAAAA,CAAI,MAAA;gBAAQ,WAAA,EAAa;AAAE;aAAI,CAAA;AAClF,4BAAAE,IAAC,MAAA,EAAD;cAAM,MAAA,EAAO,MAAA;cAAO,KAAA,EAAO;gBAAE,SAAA,EAAWoa,GAAAA;gBAAW,WAAA,EAAa;AAAE;aAAI;AACxD;;AAChB,wBAAA7hB,KAAC,gBAAA,EAAD;UAAgB,EAAA,EAAIihB,GAAAA;UAAa,EAAA,EAAG,IAAA;UAAK,EAAA,EAAG,IAAA;UAAK,EAAA,EAAG,IAAA;UAAK,EAAA,EAAI,CAAA,EAAG1Z,IAAI,WAAA,CAAA,CAAA,CAAA;UAApE,QAAA,EAAA;AACE,4BAAAE,IAAC,MAAA,EAAD;cAAM,MAAA,EAAO,IAAA;cAAK,KAAA,EAAO;gBAAE,SAAA,EAAW,OAAA;AAAS,gBAAA,WAAA,EAAaF,GAAAA,CAAI;AAAc;aAAI,CAAA;AAClF,4BAAAE,IAAC,MAAA,EAAD;cAAM,MAAA,EAAO,KAAA;cAAM,KAAA,EAAO;gBAAE,SAAA,EAAW,OAAA;AAAS,gBAAA,WAAA,EAAaF,GAAAA,CAAI;AAAc;aAAI,CAAA;AACnF,4BAAAE,IAAC,MAAA,EAAD;cAAM,MAAA,EAAO,MAAA;cAAO,KAAA,EAAO;gBAAE,SAAA,EAAW,OAAA;gBAAS,WAAA,EAAa;AAAE;aAAI;AACtD;;AAChB,wBAAAA,IAAC,UAAA,EAAD;UAAU,EAAA,EAAIyZ,GAAAA;AACZ,UAAA,QAAA,kBAAAzZ,GAAAA,CAAC,MAAA,EAAD,EAAM,CAAA,EAAGgV,GAAAA,CAAQ,UAAW;SACpB;AACN,OAAA,EAAA,CAAA;AAGN,sBAAAhV,IAAC,MAAA,EAAD;AAAM,QAAA,CAAA,EAAGgV,GAAAA,CAAQ,QAAA;AAAU,QAAA,IAAA,EAAM,QAAQuE,GAAAA,CAAAA,CAAAA,CAAAA;QAAe,KAAA,EAAO,EAAE,eAAe,MAAA;OAAW,CAAA;AAG3F,sBAAAvZ,IAAC,MAAA,EAAD;QACE,CAAA,EAAE,GAAA;QACF,CAAA,EAAE,GAAA;QACF,KAAA,EAAM,KAAA;AACN,QAAA,MAAA,EAAQF,GAAAA,CAAI,WAAA;AACZ,QAAA,IAAA,EAAM,QAAQ0Z,GAAAA,CAAAA,CAAAA,CAAAA;AACd,QAAA,QAAA,EAAU,QAAQC,GAAAA,CAAAA,CAAAA,CAAAA;QAClB,KAAA,EAAO,EAAE,eAAe,MAAA;OACzB,CAAA;AAGAI,MAAAA,GAAAA,CAAW,IAAA,CAAKxiB,GAAAA,EAAGe,GAAAA,qBAClB4H,IAAC,MAAA,EAAD;QAEK,CAAA,EAAA3I,GAAAA;QACH,IAAA,EAAK,MAAA;QACL,MAAA,EAAO,OAAA;AACP,QAAA,aAAA,EAAeyI,GAAAA,CAAI,UAAA;QACnB,WAAA,EAAaia,GAAAA;QACb,aAAA,EAAc,OAAA;QACd,YAAA,EAAa,oBAAA;QACb,KAAA,EAAO,EAAE,eAAe,MAAA;OACzB,EATM,CAAA,GAAA,EAAMzhB,GAAAA,CAAAA,CASZ,CACF,CAAA;AAGD,sBAAA0H,IAAC,MAAA,EAAD;AACE,QAAA,CAAA,EAAGgV,GAAAA,CAAQ,QAAA;QACX,IAAA,EAAK,MAAA;QACL,MAAA,EAAO,OAAA;AACP,QAAA,aAAA,EAAelV,GAAAA,CAAI,QAAA;QACnB,WAAA,EAAaka,GAAAA;QACb,YAAA,EAAa,oBAAA;QACb,KAAA,EAAO,EAAE,eAAe,MAAA;OACzB;AACD,KAAA,EAAA,CAAA;AAEN,EAAA,CAAA;EACA,IAAA,EAAM,YAAA;EACN,QAAA,EAAU1a;AACZ,CAAA;AHjKA,IISMA,EAAAA,GAAwC;EAC5C,MAAA,EAAQ,SAAA;EACR,WAAA,EAAa,GAAA;EACb,OAAA,EAAS,EAAA;EACT,aAAA,EAAe,CAAA;EACf,WAAA,EAAa,EAAA;EACb,YAAA,EAAc,EAAA;EACd,WAAA,EAAa,EAAA;EACb,aAAA,EAAe,IAAA;EACf,UAAA,EAAY,IAAA;EACZ,UAAA,EAAY,CAAA;EACZ,QAAA,EAAU,IAAA;EACV,QAAA,EAAU;AACZ,CAAA;AJtBA,IIwBM+Z,EAAAA,GAAgB,GAAA;AJxBtB,IKSagB,EAAAA,GAAkD;EAC7D,MAAA,EAAQhI,EAAAA;EACR,KAAA,EAAOsB,EAAAA;EACP,KAAA,EAAOG,EAAAA;EACP,QAAA,EAAUK,EAAAA;EACV,KAAA,EAAOW,EAAAA;EACP,MAAA,EAAQuC,EAAAA;EACR,KAAA,EAAO1B,EAAAA;EACP,MAAA,EAAQG,EAAAA;EACR,MAAA,EAAQM,EAAAA;EACR,SAAA,EAAWK,EAAAA;EACX,YAAA,EAAcK,EAAAA;EACd,OAAA,EAASY,EAAAA;EACT,QAAA,EAAUE,EAAAA;EACV,IAAA,EAAM0B,EAAAA;EACN,KAAA,EAAO;ADGP,IAAA,SAAA,EAAA,CAAY,EAAE,OAAA,EAAAjiB,GAAAA,EAAS,IAAA,EAAAe,GAAAA,EAAM,IAAA,EAAA4D,GAAAA,EAAM,OAAA,EAAAH,GAAAA,EAAS,MAAA,EAAAvD,GAAAA,EAAA,KAAa;AACvD,MAAA,IAAMihB,MAAazY,KAAAA,EAAM,EACnB0Y,MAAc1Y,KAAAA,EAAM,EACpB2Y,MAAc3Y,KAAAA,EAAM;AAC1B,MAAA,IAAIf,QAAY,OAAA,IAAWA,GAAAA,KAAY,QAAA,IAAYA,GAAAA,KAAY,WAAW,OAAO,IAAA;AACjF,MAAA,IAAMD,GAAAA,GAAM;QAAE,GAAGR,EAAAA;QAAU,GAAGE;AAAO,OAAA,EAC/B8a,MAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAIxa,GAAAA,CAAI,WAAA,EAAa,CAAC,CAAC,GAG/C+B,GAAAA,GAAQmT,GAAAA,CAAQ,UAEhBG,GAAAA,GAAe,IACjBC,GAAAA,GAAmB,IAAA;AACvB,MAAA,KAAA,IAAS9c,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI+gB,EAAAA,EAAejhB,GAAAA,EAAAA,EAAK;AACtC,QAAA,IAAMG,MAAKD,GAAAA,GAAI+gB,EAAAA,GAAiBxX,KAC1B2G,GAAAA,GAAKwM,GAAAA,CAAQ,YAAYzc,GAAC,CAAA;AAC5BiQ,QAAAA,GAAAA,CAAG,EAAA,GAAK,CAAA,IACL4M,GAAAA,KACHhK,GAAAA,GAAM,EAAC,EACP+J,GAAAA,CAAK,IAAA,CAAKC,GAAG,CAAA,CAAA,EAEfA,GAAAA,CAAI,IAAA,CAAK;AAAE,UAAA,CAAA,EAAG5M,GAAAA,CAAG,CAAA;AAAG,UAAA,CAAA,EAAGA,GAAAA,CAAG;AAAE,SAAC,KAE7B4C,GAAAA,GAAM,IAAA;AAEV,MAAA;AACA,MAAA,IAAI+J,GAAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,IAAMuE,GAAAA,GAAc1E,GAAAA,CAAQ,WAAA,CAAY,CAAC,CAAA,EACnC2E,MAAa3E,GAAAA,CAAQ,WAAA,CAAc,GAAA,GAAqBqE,EAAAA,GAAiBxX,GAAK,CAAA;AACpF,QAAA,IAAI6X,GAAAA,CAAY,EAAA,GAAK,CAAA,IAAKC,GAAAA,CAAW,KAAK,CAAA,EAAG;AAC3C,UAAA,IAAMC,GAAAA,GAAOzE,IAAK,KAAA,EAAM;AACxB,UAAA/Y,IAAK+Y,GAAAA,CAAK,MAAA,GAAS,CAAA,CAAA,CAAG,IAAA,CAAK,GAAGyE,GAAI,CAAA;AACpC,QAAA;AACF,MAAA;AACA,MAAA,IAAMC,MAAuB,EAAC;AAC9B,MAAA,KAAA,IAAWrE,OAAOL,GAAAA,EAAM;AACtB,QAAA,IAAIK,GAAAA,CAAI,SAAS,CAAA,EAAG;AACpB,QAAA,IAAI9c,MAAI,CAAA,EAAA,EAAK8c,GAAAA,CAAI,CAAA,CAAA,CAAG,EAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKA,IAAI,CAAA,CAAA,CAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA;AACtD,QAAA,KAAA,IAASld,GAAAA,GAAI,GAAGA,GAAAA,GAAIkd,GAAAA,CAAI,QAAQxZ,GAAAA,EAAAA,EAC9B5D,GAAAA,IAAK,CAAA,GAAA,EAAMod,GAAAA,CAAIld,GAAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKkd,GAAAA,CAAIld,GAAAA,CAAAA,CAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA;AAEtD,QAAA+c,GAAAA,CAAW,KAAK3c,GAAC,CAAA;AACnB,MAAA;AAEA,MAAA,IAAM4N,GAAAA,GAAK,GAAA,GAAMC,GAAAA,EACXC,GAAAA,GAAK,GAAA,GAAMC,KACXqT,GAAAA,GAAa,IAAA,CAAK,GAAA,CAAIxT,GAAAA,EAAIE,GAAE,CAAA,EAC5BuT,MAAeja,GAAAA,CAAI,UAAA,GAAaga,GAAAA,EAChCE,GAAAA,GAAala,GAAAA,CAAI,QAAA,GAAWga,KAM5BG,GAAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGna,GAAAA,CAAI,OAAA,GAAUA,IAAI,aAAa,CAAA,EACvDoa,GAAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAA,EAAKpa,IAAI,OAAA,GAAUA,GAAAA,CAAI,aAAa,CAAA,EAEzDya,GAAAA,GAAkB,GAAA,GAAM,KAAK,KAAA,CAAMD,GAAAA,GAAO,EAAE,CAAA,EAC5CE,GAAAA,GAAe,CAAA,mBAAA,EAAsB1a,GAAAA,CAAI,MAAA,CAAA,CAAA,EAAUya,GAAAA,CAAAA,SAAAA,CAAAA,EACnDE,GAAAA,GAAe,CAAA,mBAAA,EAAsB3a,GAAAA,CAAI,MAAA,CAAA,CAAA,EAAUA,GAAAA,CAAI,WAAA,CAAA,SAAA,CAAA,EACvD4a,GAAAA,GAAgB,CAAA,mBAAA,EAAsB5a,IAAI,MAAA,CAAA,CAAA,EAAUA,GAAAA,CAAI,YAAA,CAAA,SAAA,CAAA,EAGxD6a,GAAAA,GAAiB,MAAM,IAAA,CAAK,KAAA,CAAML,GAAAA,GAAO,EAAE,CAAA,EAC3CM,GAAAA,GAAiB,MAAM,IAAA,CAAK,KAAA,CAAMN,GAAAA,GAAO,EAAE,CAAA,EAC3CO,GAAAA,GAAmB,sBAAsB/a,GAAAA,CAAI,MAAA,CAAA,CAAA,EAAU6a,GAAAA,CAAAA,SAAAA,CAAAA,EACvDG,GAAAA,GAAmB,sBAAsBhb,GAAAA,CAAI,MAAA,CAAA,CAAA,EAAU8a,GAAAA,CAAAA,SAAAA,CAAAA,EAEvDG,GAAAA,GAAajb,IAAI,aAAA,GAAgBwa,GAAAA,EACjCU,GAAAA,GAAalb,GAAAA,CAAI,UAAA,IAAc,GAAA,GAAM,GAAA,GAAMwa,GAAAA,CAAAA,EAC3CW,GAAAA,GAAWnb,GAAAA,CAAI,QAAA,IAAY,GAAA,GAAM,GAAA,GAAMwa,GAAAA,CAAAA;AAE7C,MAAA,uBACE/hB,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA;wBACE/D,IAAAA,CAAC,MAAA,EAAD,EAAA,QAAA,EAAA;AACE,0BAAAA,KAAC,gBAAA,EAAD;YAAgB,EAAA,EAAIghB,GAAAA;YAAY,EAAA,EAAG,IAAA;YAAK,EAAA,EAAG,IAAA;YAAK,EAAA,EAAG,IAAA;YAAK,EAAA,EAAG,MAAA;YAA3D,QAAA,EAAA;AACE,8BAAAvZ,IAAC,MAAA,EAAD;gBAAM,MAAA,EAAO,IAAA;gBAAK,KAAA,EAAO,EAAE,WAAWya,GAAAA;eAAiB,CAAA;AACvD,8BAAAza,IAAC,MAAA,EAAD;AAAM,gBAAA,MAAA,EAAQ,GAAGia,GAAAA,CAAAA,CAAAA,CAAAA;gBAAc,KAAA,EAAO,EAAE,WAAWY,GAAAA;eAAqB,CAAA;AACxE,8BAAA7a,IAAC,MAAA,EAAD;gBAAM,MAAA,EAAQ,CAAA,EAAGF,IAAI,OAAA,CAAA,CAAA,CAAA;gBAAY,KAAA,EAAO,EAAE,WAAW0a,GAAAA;eAAiB,CAAA;AACtE,8BAAAxa,IAAC,MAAA,EAAD;AAAM,gBAAA,MAAA,EAAQ,GAAGka,GAAAA,CAAAA,CAAAA,CAAAA;gBAAc,KAAA,EAAO,EAAE,WAAWY,GAAAA;eAAqB,CAAA;AACxE,8BAAA9a,IAAC,MAAA,EAAD;gBAAM,MAAA,EAAO,MAAA;gBAAO,KAAA,EAAO,EAAE,WAAW0a,GAAAA;eAAkB;AAC5C;;AAChB,0BAAAniB,KAAC,gBAAA,EAAD;YAAgB,EAAA,EAAIihB,GAAAA;YAAa,EAAA,EAAG,IAAA;YAAK,EAAA,EAAG,IAAA;YAAK,EAAA,EAAG,IAAA;YAAK,EAAA,EAAI,CAAA,EAAG1Z,IAAI,WAAA,CAAA,CAAA,CAAA;YAApE,QAAA,EAAA,iBACEE,GAAAA,CAAC,MAAA,EAAD;cAAM,MAAA,EAAO,IAAA;cAAK,KAAA,EAAO;gBAAE,SAAA,EAAW,OAAA;gBAAS,WAAA,EAAa+a;AAAW;aAAI,CAAA,kBAC3E/a,GAAAA,CAAC,MAAA,EAAD;cAAM,MAAA,EAAO,MAAA;cAAO,KAAA,EAAO;gBAAE,SAAA,EAAW,OAAA;gBAAS,WAAA,EAAa;AAAE;AAAI,aAAA,CACtD;;AAChB,0BAAAA,IAAC,UAAA,EAAD;YAAU,EAAA,EAAIyZ,GAAAA;AACZ,YAAA,QAAA,kBAAAzZ,GAAAA,CAAC,MAAA,EAAD,EAAM,CAAA,EAAGgV,GAAAA,CAAQ,UAAW;WACpB;AACN,SAAA,EAAA,CAAA;AAEN,wBAAAhV,IAAC,MAAA,EAAD;AAAM,UAAA,CAAA,EAAGgV,GAAAA,CAAQ,QAAA;AAAU,UAAA,IAAA,EAAM,QAAQuE,GAAAA,CAAAA,CAAAA,CAAAA;UAAe,KAAA,EAAO,EAAE,eAAe,MAAA;SAAW,CAAA;QAE1FwB,GAAAA,GAAa,CAAA,oBACZ/a,GAAAA,CAAC,MAAA,EAAD;UACE,CAAA,EAAE,GAAA;UACF,CAAA,EAAE,GAAA;UACF,KAAA,EAAM,KAAA;AACN,UAAA,MAAA,EAAQF,GAAAA,CAAI,WAAA;AACZ,UAAA,IAAA,EAAM,QAAQ0Z,GAAAA,CAAAA,CAAAA,CAAAA;AACd,UAAA,QAAA,EAAU,QAAQC,GAAAA,CAAAA,CAAAA,CAAAA;UAClB,KAAA,EAAO,EAAE,eAAe,MAAA;SACzB,CAAA;AAGFI,QAAAA,GAAAA,CAAW,IAAA,CAAKxiB,GAAAA,EAAGe,GAAAA,qBAClB4H,IAAC,MAAA,EAAD;UAEK,CAAA,EAAA3I,GAAAA;UACH,IAAA,EAAK,MAAA;UACL,MAAA,EAAO,OAAA;UACP,aAAA,EAAe2jB,GAAAA;UACf,WAAA,EAAajB,GAAAA;UACb,aAAA,EAAc,OAAA;UACd,YAAA,EAAa,oBAAA;UACb,KAAA,EAAO,EAAE,eAAe,MAAA;SACzB,EATM,CAAA,GAAA,EAAMzhB,GAAAA,CAAAA,CASZ,CACF,CAAA;AAED,wBAAA0H,IAAC,MAAA,EAAD;AACE,UAAA,CAAA,EAAGgV,GAAAA,CAAQ,QAAA;UACX,IAAA,EAAK,MAAA;UACL,MAAA,EAAO,OAAA;UACP,aAAA,EAAeiG,GAAAA;UACf,WAAA,EAAajB,GAAAA;UACb,YAAA,EAAa,oBAAA;UACb,KAAA,EAAO,EAAE,eAAe,MAAA;SACzB;AACD,OAAA,EAAA,CAAA;AAEN,IAAA,CAAA;IACA,IAAA,EAAM,YAAA;IACN,QAAA,EAAU1a;ACvIH;AACT,CAAA;ACkBA,SAAS4b,GAAc7jB,GAAAA,EAA4C;AAIjE,EAAA,OAHI0E,GAAAA,CAAM,KAAWA,GAAAA,CAAM,EAAA,GACvBA,IAAM,IAAA,GAAa,GAAA,GACnBA,GAAAA,CAAM,OAAA,GAAgB,QAAA,GACnB,MAAA;AACT;AAcA,IAAaof,EAAAA,GAAQC,UAAAA,CAAW,SAAe9jB,GAAAA,EAAmBoB,GAAAA,EAAuB;AACvF,EAAA,IAAM,EACJ,KAAA,EAAA0D,GAAAA,GAAQ,MAAA,EACR,MAAA,EAAAgP,MAAS,SAAA,EACT,MAAA,EAAAiK,GAAAA,EACA,IAAA,EAAAne,GAAAA,EACA,OAAA,EAAAoG,MAAU,SAAA,EACV,IAAA,EAAA1C,GAAAA,GAAO,IAAA,EACP,OAAA,EAAA2C,GAAAA,EACA,QAAA,EAAA+K,GAAAA,EACA,WAAA,EAAAI,GAAAA,EACA,IAAA,EAAA2S,GAAAA,EACA,QAAA,EAAAC,GAAAA,EACA,WAAAC,GAAAA,EACA,WAAA,EAAAC,GAAAA,EACA,KAAA,EAAAvkB,GAAAA,EACA,OAAA,EAAAqW,KACA,KAAA,EAAOmO,GAAAA,EACP,UAAA,EAAAxO,GAAAA,EACA,KAAA,EAAA5H,GAAAA,EACA,MAAAqW,GAAAA,EACA,UAAA,EAAAC,GAAAA,EACA,OAAA,EAAAC,GAAAA,EACA,OAAA,EAAAC,GAAAA,EACA,EAAA,EAAIC,GAAAA,EACJ,YAAA,EAAcC,GAAAA,EACd,OAAA,EAAAC,GAAAA,EACA,MAAA,EAAAC,KACA,GAAGC,GAAAA,EAAAA,GACDngB,GAAAA,EACEogB,GAAAA,GAAUjB,EAAAA,CAAcnf,GAAK,CAAA,EAC7BqgB,GAAAA,GAAsBC,GAAAA,IAAW,IAAA,IAAQF,GAAAA,KAAY,MAAA,EACrDG,MAAYP,GAAAA,KACZK,GAAAA,KAAwB,OAAOxf,GAAAA,IAAa,QAAA,IAAY,OAAOA,GAAAA,IAAa,QAAA,CAAA,GAAY,MAAA,CAAOA,GAAQ,CAAA,GAAI,MAAA,CAAA,EAC3G,CAACqD,GAAAA,EAASsc,GAAAA,CAAAA,GAAchhB,QAAAA,CAAS,KAAK,CAAA,EACtC,CAACkX,EAAAA,EAAO+J,GAAAA,CAAAA,GAAYjhB,QAAAA,CAAS,CAAC,CAAA,EAC9BkhB,EAAAA,GAActW,GAAAA,CAAOuW,GAAAA,CAAAA,IAAUvW,GAAAA,CAAO,IAAA,EACtCwW,GAAAA,GAAgBxW,GAAAA,CAAOuW,GAAAA,CAAAA,GAASA,GAAAA,GAAQ,MAAA,EACxCE,GAAAA,GAAYH,EAAAA,CAAY,SAAA,EACxBjd,GAAAA,GAAS;IAAE,GAAIid,EAAAA,CAAY,YAAY,EAAC;AAAI,IAAA,GAAII,OAAe;AAAI,GAAA,EAEnEC,KAAe/b,MAAAA,CAAsB,IAAI,GACzCgc,EAAAA,GAAYC,aAAAA,CAAAA,CACf3lB,GAAAA,KAAQ;AACP,IAAA,IAAM4lB,MAAQ,OAAOC,GAAAA,IAAU,WAAWA,GAAAA,GAAQ,GAAA,EAC5C5L,MAAOwL,EAAAA,CAAa,OAAA;AAC1B,IAAA7jB,GAAa,OAAA,GAAUkkB,GAAAA,EACnB7L,GAAAA,KAAS,IAAA,IAAMkL,IAAAA,CAAU3gB,GAAAA,KAAAA,CAAO3C,GAAAA,GAAK+jB,GAAAA,IAASE,MAAM7L,GAAAA,CAAAA,GAAS,GAAA,IAAQ,CAAC,CAAA,EAC1EyL,GAAU,OAAA,EAAQ;EACpB,CAAA,EAGA,EAAE,UAAA,MAAgB;AAAE,IAAA9jB,GAAa,OAAA,GAAU,IAAA;AAAM,EAAA,CAAA,EACnD,CAAA;AAEA,EAAAT,UAAA,MAAgB;AACd,IAAA,IAAI,CAAC0kB,GAAAA,EAAO;AACV,MAAAE,IAAS,CAAC,CAAA;AACV,MAAA;AACF,IAAA;AAGA,IAAA,OAFAnkB,EAAAA,CAAa,UAAU,IAAA,EACvB8jB,EAAAA,CAAU,SAAQ,EAAA,MACLA,GAAU,MAAA,EAAO;EAChC,CAAA,EAAG,CAACG,GAAAA,EAAOH,EAAS,CAAC,CAAA;AACrB,EAAA,IAAM9e,GAAAA,GAAM,CAAC1F,EAAAA,CAAE,KAAA,EAAOkE,GAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EACnD4gB,KAAUxe,EAAAA,CAAU;IAAE,MAAA,EAAAwW,GAAAA;IAAQ,IAAA,EAAAne;AAAK,GAAC,CAAA,EAIpComB,GAAAA,GAAmB,CAACC,GAAAA,IAAQd,GAAY,OAAA,GAAUA,EAAAA,CAAY,OAAA,CAAQjd,GAAM,CAAA,GAAI,IAAA,EAChFge,EAAAA,GAAkBD,GAAAA,IAASD,KAAkB,IAAA,EAC7CG,EAAAA,GAAcD,EAAAA,GAAkB3M,EAAAA,CAAM2M,EAAAA,CAAAA,GAAmB,IAAA,EACzDE,GAAAA,GAAqBH,MACvBI,GAAAA,GACCL,GAAAA,EAAkB,UAAA,EACjBM,GAAAA,GAA4CL,MAC9CM,GAAAA,GACCP,GAAAA,EAAkB,OAAA,IAAwCO,GAAAA,EACzDC,KAAoBL,EAAAA,GAAc;IAAE,GAAIA,EAAAA,CAAY,YAAY,EAAC;AAAI,IAAA,GAAIC,OAAsB;AAAI,GAAA,GAAI,IAAA,EACvGK,GAAAA,GAAUhd,MAAAA,CAAsB,IAAI,GACpCZ,EAAAA,GAAMD,EAAAA,CAAU6d,GAAAA,EAASN,EAAW,CAAA,EAEpCzI,EAAAA,GAAUyI,EAAAA,GAAcA,EAAAA,CAAY,MAAMK,EAAAA,EAAmB3d,EAAAA,CAAI,CAAA,EAAGA,EAAAA,CAAI,CAAC,CAAA,GAAI,IAAA,EAK7E6d,EAAAA,GAHeP,MAChB,OAAOA,EAAAA,CAAY,MAAA,IAAW,UAAA,GAAaA,EAAAA,CAAY,MAAA,CAAOK,EAAiB,CAAA,GAAIL,GAAY,MAAA,KAAW;IAAE,GAAA,EAAK,CAAA;IAAG,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ,CAAA;IAAG,IAAA,EAAM;GAAE,GACjJ,OAAOhB,EAAAA,CAAY,MAAA,IAAW,UAAA,GAAaA,EAAAA,CAAY,OAAOjd,GAAM,CAAA,GAAIid,EAAAA,CAAY,MAAA,EAEnFwB,GAAAA,GAAuB;AAC3B,IAAA,GAAGZ,EAAAA,CAAQ,KAAA;IACV,mBAAA,EAA+B,CAAA,EAAGW,GAAO,GAAA,CAAA,EAAA,CAAA;IACzC,qBAAA,EAAiC,CAAA,EAAGA,GAAO,KAAA,CAAA,EAAA,CAAA;IAC3C,sBAAA,EAAkC,CAAA,EAAGA,GAAO,MAAA,CAAA,EAAA,CAAA;IAC5C,oBAAA,EAAgC,CAAA,EAAGA,GAAO,IAAA,CAAA,EAAA,CAAA;IAC3C,GAAIE,GAAAA,KAAY,MAAA,IAAa,EAAE,OAAA,EAAS,OAAOA,OAAY,QAAA,GAAW,CAAA,EAAGA,GAAAA,CAAAA,EAAAA,CAAAA,GAAcA,GAAAA,EAAQ;AAC/F,IAAA,GAAIC,QAAe,MAAA,IAAa;MAC9B,kBAAA,EAAoBA,GAAAA;MACpB,wBAAA,EAA0BA;AAC5B,KAAA;IACA,GAAG1C;AACL,GAAA,EAEM2C,GAAAA,GAAc;IAClB,GAAGlC,GAAAA;AACH,IAAA,GAAIE,OAAuBF,GAAAA,CAAS,IAAA,KAAS,MAAA,IAAa,EAAE,MAAM,KAAA,EAAM;IACxE,SAAA,EAAWje,GAAAA;IACX,KAAA,EAAAogB,GAAAA;AACA,IAAA,YAAA,EAAcZ,KAAc,SAAA,GAAYd,GAAAA;IACxC,aAAA,EAAe2B,GAAAA;AACf,IAAA,aAAA,EAAejB,GAAQ,aAAA,CAAA;AACvB,IAAA,WAAA,EAAaA,GAAQ,WAAA,CAAA;IACrB,cAAA,EAAgBtd,GAAAA;IAChB,WAAA,EAAalH,GAAAA;AACb,IAAA,cAAA,EAAgBoH,MAAU,MAAA,GAAS,MAAA;AACnC,IAAA,OAAA,EAAA,CAAU5I,GAAAA,KAA+B;AAAEklB,MAAAA,GAAAA,CAAW,IAAI,CAAA,EAAGgC,GAAAA,GAAUlnB,GAAC,CAAA;AAAG,IAAA,CAAA;AAC3E,IAAA,MAAA,EAAA,CAASA,GAAAA,KAA+B;AAAEklB,MAAAA,GAAAA,CAAW,KAAK,CAAA,EAAGiC,GAAAA,GAASnnB,GAAC,CAAA;AAAG,IAAA,CAAA;IAC1E,YAAA,EAAcilB;AAChB,GAAA,EAOMmC,MAAAA,MAAyB;AAC7B,IAAA,IAAI,CAAChB,EAAAA,IAAe,CAACzI,EAAAA,EAAS,OAAO,IAAA;AACrC,IAAA,IAAM0J,OAAcd,GAAAA,IAAmB,EAAC,EACrC,GAAA,CAAA,CAAKvmB,GAAAA,KAAQ;AACZ,MAAA,IAAMsnB,GAAAA,GAAMtE,EAAAA,CAAQuE,GAAAA,CAAI,IAAA,CAAA;AACxB,MAAA,IAAI,CAACD,GAAAA,EAAK,QAAA,EAAU,OAAO,IAAA;AAC3B,MAAA,IAAME,GAAAA,GAAY;QAAE,GAAIF,GAAAA,CAAI,YAAY,EAAC;QAAI,GAAIC,GAAAA,CAAI,UAAU;AAAI,OAAA;AACnE,MAAA,OAAO;AAAE,QAAA,QAAA,EAAUD,GAAAA,CAAI,QAAA;QAAU,MAAA,EAAQE;AAAU,OAAA;AACrD,IAAA,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA,EACXC,MAAWC,GAAAA,IAAS,CAAA;AAC1B,IAAA,IAAIL,GAAAA,CAAW,MAAA,KAAW,CAAA,IAAKI,GAAAA,KAAa,GAAG,OAAO9J,EAAAA;AACtD,IAAA,IAAM1O,GAAAA,GAAK,GAAA,GAAMnG,EAAAA,CAAI,CAAA,EACfqG,GAAAA,GAAK,GAAA,GAAMrG,EAAAA,CAAI,CAAA,EACf+G,GAAAA,GAAW8N,EAAAA,CAAQ,QAAA,EAInBgK,GAAAA,GAAAA,CAAYlhB,GAAAA,KAAiB;AACjC,MAAA,IAAMqJ,OAAO6P,GAAAA,GAAO9P,GAAAA,GAAYA,GAAAA,IAAYA,GAAAA,EACtCsB,MAAKwM,EAAAA,CAAQ,WAAA,CAAY7N,GAAE,CAAA,EAC7BJ,MAAKyB,GAAAA,CAAG,EAAA,GAAKsW,GAAAA,EACb9X,GAAAA,GAAKwB,IAAG,EAAA,GAAKsW,GAAAA;AACjB,MAAA,KAAA,IAAW5mB,OAAKwmB,GAAAA,EAAY;AAC1B,QAAA,IAAM1e,GAAAA,GAAI9H,GAAAA,CAAE,QAAA,CAASiP,GAAAA,EAAI;AACvB,UAAA,MAAA,EAAQjP,GAAAA,CAAE,MAAA;UACV,KAAA,EAAA+mB,EAAAA;UACA,QAAA,EAAA3mB,GAAAA;AACA,UAAA,WAAA,EAAa0c,EAAAA,CAAQ;SACtB,CAAA;AACD,QAAA1d,GAAAA,IAAM0I,GAAAA,CAAE,EAAA,EACRxH,GAAAA,IAAMwH,GAAAA,CAAE,EAAA;AACV,MAAA;AACA,MAAA,OAAO;QAAE,CAAA,EAAGwI,GAAAA,CAAG,IAAIzB,GAAAA,GAAKT,GAAAA;QAAI,CAAA,EAAGkC,GAAAA,CAAG,IAAIxB,GAAAA,GAAKR;AAAG,OAAA;AAChD,IAAA,CAAA,EACI9N,GAAAA,GAAI,EAAA;AACR,IAAA,KAAA,IAASJ,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI,GAAA,EAAiBjB,GAAAA,EAAAA,EAAK;AAExC,MAAA,IAAMqR,GAAAA,GAAIsW,GAAAA,CADI1mB,GAAAA,GAAI,GAAA,GAAmB4O,GACd,CAAA;AACvB,MAAAlH,GAAAA,IAAM1H,GAAAA,KAAM,CAAA,GAAI,CAAA,EAAA,EAAKoQ,GAAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKA,GAAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,GAAM,CAAA,GAAA,EAAMA,GAAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKA,GAAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA;AACjG,IAAA;AAwBA,IAAA,OAvBA1I,OAAK,IAAA,EAuBE;MAAE,QAAA,EAAUtH,GAAAA;AAAG,MAAA,WAAA,EAAA,CAnBKrB,GAAAA,KAAc;AACvC,QAAA,IAAM8P,GAAAA,GAAAA,CAAO5O,MAAI2O,GAAAA,GAAYA,GAAAA,IAAYA,KACnCsB,GAAAA,GAAKwW,GAAAA,CAAS7X,GAAE,CAAA,EAChBwB,GAAAA,GAAMzB,MAAY,IAAA,EAClBgY,GAAAA,GAAKF,IAAS7X,GAAAA,GAAKwB,GAAG,GACtBwW,GAAAA,GAAKH,GAAAA,CAAS7X,GAAAA,GAAKwB,GAAG,CAAA,EAEtBK,GAAAA,GAAAA,CAAMmW,IAAG,CAAA,GAAID,GAAAA,CAAG,KAAK5Y,GAAAA,EACrB2C,GAAAA,GAAAA,CAAMkW,IAAG,CAAA,GAAID,GAAAA,CAAG,KAAK1Y,GAAAA,EACrB0C,GAAAA,GAAK,KAAK,KAAA,CAAMF,GAAAA,EAAIC,GAAE,CAAA,IAAK,CAAA,EAG3BmW,MAAMnW,GAAAA,GAAKC,GAAAA,EACXmW,GAAAA,GAAM,CAACrW,GAAAA,GAAKE,GAAAA;AAIlB,QAAA,OAAO;AAAE,UAAA,CAAA,EAAGV,GAAAA,CAAG,CAAA;AAAG,UAAA,CAAA,EAAGA,GAAAA,CAAG,CAAA;UAAG,EAAA,EAAI4W,GAAAA;UAAK,EAAA,EAAIC;AAAI,SAAA;AAC9C,MAAA,CAAA;MACsD,QAAA,EAAA/mB;AAAS,KAAA;AACjE,EAAA,CAAA,GAAG,EAEGgnB,EAAAA,GAAAA,CAAe1B,GAAAA,IAAmB,EAAC,EAAG,MAAA,CAAA,CAAQvmB,GAAAA,KAAQgjB,EAAAA,CAAQuE,GAAAA,CAAI,IAAA,CAAA,EAA+B,SAAS,CAAA,EAC1GW,GAAAA,GAAwBD,EAAAA,CAAY,MAAA,CAAA,CAAQjoB,GAAAA,KAAAA,CAASgjB,EAAAA,CAAQuE,GAAAA,CAAI,IAAA,CAAA,CAA8B,IAAA,IAAQ,YAAA,MAAkB,YAAY,CAAA,EACrIY,GAAAA,GAAwBF,EAAAA,CAAY,OAAA,CAAQjoB,GAAAA,KAAAA,CAASgjB,EAAAA,CAAQuE,GAAAA,CAAI,IAAA,CAAA,CAA8B,IAAA,IAAQ,YAAA,MAAkB,YAAY,CAAA,EACrIa,EAAAA,GAAkBH,EAAAA,CAAY,MAAA,CAAA,CAAQjoB,GAAAA,KAAQgjB,EAAAA,CAAQuE,IAAI,IAAA,CAAA,CAA8B,IAAA,KAAS,MAAM,CAAA,EACvGc,EAAAA,GAAa,CAAA,WAAA,EAAc5e,KAAAA,EAAM,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAA,CAAA,EAEnD6e,GAAAA,GAAAA,CAAoBtoB,KAAiBe,GAAAA,KAAc;AACvD,IAAA,IAAMumB,MAAMtE,EAAAA,CAAQuE,GAAAA,CAAI,IAAA,CAAA,EAClBgB,MAAejB,GAAAA,EAAK,SAAA;AAC1B,IAAA,IAAI,CAACiB,GAAAA,IAAgB,CAACnB,EAAAA,EAAiB,OAAO,IAAA;AAC9C,IAAA,IAAMI,GAAAA,GAAY;MAAE,GAAIF,GAAAA,CAAI,YAAY,EAAC;MAAI,GAAIC,GAAAA,CAAI,UAAU;AAAI,KAAA;AACnE,IAAA,uBAAO5e,IAAC4f,GAAAA,EAAD;MAAiD,OAAA,EAASnB,EAAAA;AAAiB,MAAA,IAAA,EAAMte,EAAAA,CAAI,CAAA;AAAG,MAAA,IAAA,EAAMA,EAAAA,CAAI,CAAA;MAAY,OAAA,EAAA7C,GAAAA;MAAS,MAAA,EAAQuhB,GAAAA;MAAkB,KAAA,EAAAI;AAAQ,KAAA,EAAtI,CAAA,EAAGL,GAAAA,CAAI,IAAA,CAAA,CAAA,EAAkBtmB,GAAAA,CAAAA,CAA6G,CAAA;AAClK,EAAA,CAAA,EAEMunB,GAAAA,GAAUpC,EAAAA,IAAegB,EAAAA,mBAC7BlmB,KAAC,KAAA,EAAD;IAAK,GAAA,EAAKwlB,GAAAA;AAAS,IAAA,SAAA,EAAWxlB,EAAAA,CAAE,IAAA;IAAM,OAAA,EAAQ,aAAA;IAAc,mBAAA,EAAoB,MAAA;IAAO,aAAA,EAAY,MAAA;IAAnG,QAAA,EAAA;MACGknB,EAAAA,CAAgB,MAAA,GAAS,qBACxBzf,GAAAA,CAAC,QAAD,EAAA,QAAA,kBACEzH,IAAAA,CAAC,MAAA,EAAD;QAAM,EAAA,EAAImnB,EAAAA;QAAY,SAAA,EAAU,gBAAA;QAAiB,CAAA,EAAE,KAAA;QAAM,CAAA,EAAE,KAAA;QAAM,KAAA,EAAM,KAAA;QAAM,MAAA,EAAO,KAAA;QAApF,QAAA,EAAA,iBACE1f,GAAAA,CAAC,MAAA,EAAD;UAAM,CAAA,EAAE,KAAA;UAAM,CAAA,EAAE,KAAA;UAAM,KAAA,EAAM,KAAA;UAAM,MAAA,EAAO,KAAA;UAAM,IAAA,EAAK;AAAS,SAAA,CAAA,EAC5Dyf,EAAAA,CAAgB,GAAA,CAAIE,GAAgB,CACjC;AACF,OAAA,GAAA,CAAA;AAEPJ,MAAAA,GAAAA,CAAsB,IAAII,GAAgB,CAAA;AAC3C,sBAAApnB,KAAC,GAAA,EAAD;QAAG,GAAKknB,EAAAA,CAAgB,SAAS,CAAA,GAAI,EAAE,MAAM,CAAA,KAAA,EAAQC,EAAAA,CAAAA,CAAAA,CAAAA,EAAc,GAAI,EAAC;AAAxE,QAAA,QAAA,EAAA,EACI3f,GAAAA,KAAY,OAAA,IAAWA,QAAY,QAAA,qBAAaC,IAAC,MAAA,EAAD;UAAM,SAAA,EAAU,YAAA;AAAa,UAAA,CAAA,EAAGye,EAAAA,CAAgB;AAAW,SAAA,IAC3G1e,GAAAA,KAAY,SAAA,IAAaA,QAAY,OAAA,qBAAYC,IAAC,MAAA,EAAD;UAAM,SAAA,EAAU,cAAA;AAAe,UAAA,CAAA,EAAGye,EAAAA,CAAgB;AAAW,SAAA,CAC/G;;AACFe,MAAAA,GAAAA,CAAsB,IAAIG,GAAgB;AACxC;AACH,GAAA,IAAAlD,EAAAA,CAAY,UAAA,KAAe,SAASG,GAAAA,mBACtC5c,IAAC,KAAA,EAAD;AACE,IAAA,SAAA,EAAWzH,EAAAA,CAAE,IAAA;IACb,OAAA,EAAQ,aAAA;IACR,mBAAA,EAAqBkkB,EAAAA,CAAY,SAAA,KAAc,KAAA,GAAQ,eAAA,GAAkB,MAAA;IACzE,aAAA,EAAY,MAAA;IAEZ,QAAA,kBAAAzc,IAAC4c,GAAAA,EAAD;MAAoB,OAAA,EAAAtf,GAAAA;MAAkB,OAAA,EAAAwiB,GAAAA;MAAiB,MAAA,EAAAC,GAAAA;MAAe,KAAA,EAAAd;KAAQ;AAC3E,GAAA,CAAA,GACH,IAAA,EAEE/J,GAAAA,mBACJ3c,IAAAA,CAAA+D,QAAAA,EAAA,EAAA,QAAA,EAAA,CACGujB,GAAAA,kBACDtnB,IAAAA,CAAC,MAAA,EAAD;AAAM,IAAA,SAAA,EAAWA,EAAAA,CAAE,OAAA;AAAnB,IAAA,QAAA,EAAA,iBACEyH,GAAAA,CAAC,MAAA,EAAD,EAAO,QAAA,EAAAsb,GAAAA,EAAe,CAAA,EACrB0E,GAAAA,oBACChgB,GAAAA,CAAC,QAAA,EAAD;MACE,IAAA,EAAK,QAAA;AACL,MAAA,SAAA,EAAWzH,EAAAA,CAAE,MAAA;AACb,MAAA,YAAA,EAAY0nB,GAAAA,IAAe,QAAA;AAC3B,MAAA,OAAA,EAAA,CAAU5oB,GAAAA,KAAM;AACd,QAAAA,GAAAA,CAAE,eAAA,EAAgB,EAClB2oB,GAAAA,EAAS;AACX,MAAA,CAAA;MAEA,QAAA,kBAAAhgB,IAAC,KAAA,EAAD;QAAK,OAAA,EAAQ,WAAA;QAAY,KAAA,EAAM,IAAA;QAAK,MAAA,EAAO,IAAA;QAAK,aAAA,EAAY,MAAA;QAAO,SAAA,EAAU,OAAA;QAC3E,QAAA,kBAAAA,IAAC,MAAA,EAAD;UAAM,CAAA,EAAE,yBAAA;UAA0B,MAAA,EAAO,cAAA;UAAe,WAAA,EAAY,KAAA;UAAM,aAAA,EAAc,OAAA;UAAQ,IAAA,EAAK;SAAQ;OAC1G;AACC,KAAA,CAEN;GACN,CAAA,CAAA,EAAA,CAAA,EAGAkgB,GAAAA;AAiBJ,EAAA,OAHEA,GAAAA,GAbE/D,GAAAA,KAAY,QAAA,mBAEZnc,IAAC,QAAA,EAAD;IAAQ,IAAA,EAAK,QAAA;IAAS,GAAIoe,GAAAA;IAAkB,GAAA,EAAA1lB,GAAAA;IAAwC,OAAA,EAAA6E,GAAAA;IACjF,QAAA,EAAA2X;AACK,GAAA,CAAA,GAEDiH,GAAAA,KAAY,GAAA,mBAEnBnc,IAAC,GAAA,EAAD;IAAS,IAAA,EAAAqb,GAAAA;IAAM,GAAI+C,GAAAA;IAAkB,GAAA,EAAA1lB,GAAAA;IAAwC,OAAA,EAAA6E,GAAAA;IAC1E,QAAA,EAAA2X;GACA,CAAA,mBAGGlV,GAAAA,CAAC,MAAA,EAAD;IAAM,GAAIoe,GAAAA;IAAkB,GAAA,EAAA1lB,GAAAA;IAAM,QAAA,EAAAwc;GAAY,CAAA,EAEpDmH,GAAAA,IAAW,IAAA,GAAa6D,GAAAA,mBAE1B3nB,IAAAA,CAACqD,EAAAA,EAAD,EAAA,QAAA,EAAA,iBACEoE,GAAAA,CAACpB,SAAAA,EAAD,EAAA,QAAA,EAAYshB,GAAAA,EAAiB,CAAA,kBAC7BlgB,GAAAA,CAAC9D,EAAAA,EAAD,EAAA,QAAA,EAAUmgB,GAAAA,EAAiB,CACb,CAAA,EAAA,CAAA;AAEpB,CAAC;ACvWD,SAAgB8D,GACd9oB,GAAAA,EACuB;AACvB,EAAA,IAAI4F,GAAAA,CAAK,OAAA,KAAY,MAAA,EAAW,OAAOA,GAAAA,CAAK,OAAA;AAC5C,EAAA,IAAI,CAACA,IAAK,QAAA,EAAU;AACpB,EAAA,IAAMnF,GAAAA,GAAOmF,IAAK,SAAA,KAAc,OAAOA,IAAK,KAAA,IAAU,QAAA,GAAWA,IAAK,KAAA,GAAQ,MAAA,CAAA;AAC9E,EAAA,OAAOnF,MAAO,CAAA,EAAGA,GAAAA,KAASmF,GAAAA,CAAK,QAAA,MAAcA,GAAAA,CAAK,QAAA;AACpD;AAGA,SAAgBmjB,EAAAA,CAAe,EAAE,OAAA,EAAAtiB,GAAAA,EAAS,UAAAkC,GAAAA,EAAU,QAAA,EAAAzH,KAAA,EAInC;AAEf,EAAA,OADI8nB,OAAqC,IAAA,IAAQA,GAAAA,KAAY,QAAczjB,GAAAA,mBAEzEf,KAACD,EAAAA,EAAD;IAAgB,UAAA,EAAY6C,GAAAA;IAA5B,QAAA,EAAA,iBACEzC,GAAAA,CAAC4C,SAAAA,EAAD;MAAW,UAAA,EAAYH,GAAAA;MAAW,QAAA,EAAAlG;KAAoB,CAAA,kBACtDyD,GAAAA,CAACE,EAAAA,EAAD,EAAA,QAAA,EAAUmkB,GAAAA,EAAiB,CACb;;AAEpB;AAKA,SAAgBC,EAAAA,CAAe,EAAE,OAAA,EAAAhoB,GAAAA,EAAS,UAAAwF,GAAAA,EAAU,QAAA,EAAAkC,KAAA,EAInC;AAEf,EAAA,OADIqgB,OAAqC,IAAA,IAAQA,GAAAA,KAAY,QAAczjB,GAAAA,mBAEzEf,KAACD,EAAAA,EAAD;IAAgB,UAAA,EAAY6C,GAAAA;IAA5B,QAAA,EAAA,CACG7B,qBACDZ,GAAAA,CAACE,IAAD,EAAA,QAAA,EAAUmkB,GAAAA,EAAiB,CACb;;AAEpB;;;;;;;;;;;;;;;;;;ACAA,SAASE,EAAAA,GAAqB;AAC5B,EAAA,uBACE1kB,IAAC,MAAA,EAAD;AAAM,IAAA,SAAA,EAAWtD,EAAAA,CAAE,OAAA;IAAS,aAAA,EAAY,MAAA;IACtC,QAAA,kBAAAD,KAAC,KAAA,EAAD;MAAK,OAAA,EAAQ,WAAA;MAAY,KAAA,EAAM,IAAA;MAAK,MAAA,EAAO,IAAA;MAA3C,QAAA,EAAA,iBACEuD,GAAAA,CAAC,QAAA,EAAD;QACE,EAAA,EAAG,GAAA;QACH,EAAA,EAAG,GAAA;QACH,CAAA,EAAE,GAAA;QACF,IAAA,EAAK,MAAA;QACL,MAAA,EAAO,cAAA;QACP,WAAA,EAAY,GAAA;QACZ,aAAA,EAAc;OACf,CAAA,kBACDA,GAAAA,CAAC,MAAA,EAAD;QACE,CAAA,EAAE,wBAAA;QACF,IAAA,EAAK,MAAA;QACL,MAAA,EAAO,cAAA;QACP,WAAA,EAAY,GAAA;QACZ,aAAA,EAAc;AACf,OAAA,CACE;;GACD,CAAA;AAEV;AAaA,IAAa2kB,EAAAA,GAASpF,UAAAA,CAAW,SAC/Btd,GAAAA,EACAxG,GAAAA,EACA;AACA,EAAA,IAAM,EACJ,SAAAkB,GAAAA,GAAU,WAAA,EACV,MAAAC,GAAAA,GAAO,IAAA,EACP,QAAAC,GAAAA,EACA,MAAA,EAAAyD,KACA,IAAA,EAAAjD,GAAAA,EACA,SAAAhB,GAAAA,EACA,QAAA,EAAAkE,KACA,OAAA,EAAAgP,GAAAA,EACA,WAAA,EAAAiK,GAAAA,EACA,YAAA,EAAAne,GAAAA,EACA,WAAAoG,GAAAA,EACA,QAAA,EAAA1C,KACA,SAAA,EAAA2C,GAAAA,EACA,MAAAkjB,GAAAA,GAAO,QAAA,EACP,WAAAnY,GAAAA,EACA,KAAA,EAAAI,KACA,QAAA,EAAA2S,GAAAA,EACA,SAAAC,GAAAA,EACA,QAAA,EAAAC,KACA,OAAA,EAAAC,GAAAA,EAAA,GACEzf,GAAAA,EAEEkC,GAAAA,GAAM;IACV1F,EAAAA,CAAE,MAAA;IACFA,EAAAA,CAAE,CAAA,QAAA,EAAWwH,GAAAA,CAAAA,CAAAA,CAAAA;IACbxH,EAAAA,CAAE,CAAA,KAAA,EAAQM,GAAAA,CAAAA,CAAAA,CAAAA;AACV6nB,IAAAA,GAAAA,IAAanoB,EAAAA,CAAE,SAAA;AACfooB,IAAAA,GAAAA,IAAWpoB,EAAAA,CAAE,OAAA;AACbqoB,IAAAA,GAAAA,IAAYroB,EAAAA,CAAE,QAAA;AACdsoB,IAAAA,GAAAA,IAAWtoB,EAAAA,CAAE,OAAA;AACbkE,IAAAA;AACF,GAAA,CACG,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,EAELqkB,GAAAA,GAAc,CAACF,GAAAA,KAAaC,GAAAA,IAAWE,GAAAA,CAAAA,EACvC1D,GAAAA,GAAUxe,EAAAA,CAAU;IAAE,MAAA,EAAA1C,GAAAA;IAAQ,IAAA,EAAAjD;GAAM,CAAA;AAE1C,EAAA,uBACE2C,IAACukB,EAAAA,EAAD;AACE,IAAA,OAAA,EAASD,EAAAA,CAAsB;MAAE,OAAA,EAAA3E,GAAAA;MAAS,QAAA,EAAAD,GAAAA;MAAU,SAAA,EAAAhe,GAAAA;MAAW,KAAA,EAAOX;KAAU,CAAA;IACtE,QAAA,EAAAR,GAAAA;IAEV,QAAA,kBAAA9D,KAAC,QAAA,EAAD;MACO,GAAA,EAAAhB,GAAAA;MACC,IAAA,EAAAmpB,GAAAA;MACN,SAAA,EAAWxiB,GAAAA;AACX,MAAA,aAAA,EAAaof,IAAQ,aAAA,CAAA;AACrB,MAAA,WAAA,EAAWA,IAAQ,WAAA,CAAA;MACnB,KAAA,EAAOA,GAAAA,CAAQ,SAASY,GAAAA,GAAQ;AAAE,QAAA,GAAGZ,GAAAA,CAAQ,KAAA;QAAO,GAAGY;OAAM,GAAI,MAAA;MACvD,QAAA,EAAA7hB,GAAAA;AACV,MAAA,WAAA,EAAWykB,MAAU,IAAA,GAAO,MAAA;MAC5B,cAAA,EAAcF,GAAAA;MACd,aAAA,EAAarC,GAAAA;MACb,YAAA,EAAYhC,GAAAA;MACH,OAAA,EAAAhB,GAAAA;MAZX,QAAA,EAAA;QAcGwF,GAAAA,oBACCjlB,IAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAWtD,EAAAA,CAAE,QAAA;AAAW,UAAA,QAAA,EAAAsoB,sBAAUhlB,GAAAA,CAAC0kB,EAAAA,EAAD,EAAU,CAAA,GAAIQ;SAAkB,CAAA;QAEzEH,GAAAA,GACCC,GAAAA,mBAAUhlB,GAAAA,CAAC0kB,EAAAA,EAAD,EAAU,CAAA,mBAAI1kB,GAAAA,CAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAWtD,EAAAA,CAAE,QAAA;UAAW,QAAA,EAAA8iB;AAAe,SAAA,CAAA,GAErEze,GAAAA,KAAa,MAAA,oBAAaf,IAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAWtD,EAAAA,CAAE,KAAA;UAAQ,QAAA,EAAA8iB;SAAe,CAAA;AAErE,QAAA,CAACuF,GAAAA,IAAYI,GAAAA,oBACZnlB,GAAAA,CAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAWtD,EAAAA,CAAE,QAAA;UAAW,QAAA,EAAAyoB;SAAmB;AAE7C;;GACM,CAAA;AAEpB,CAAC;;;ACrKD,IAAaC,EAAAA,GAAmB;AAC9B,EAAA,QAAA;AAAU,EAAA,OAAA;AAAS,EAAA,QAAA;AAAU,EAAA,UAAA;AAAY,EAAA,SAAA;AAAW,EAAA,sBAAA;AAAwB,EAAA,0BAAA;AAC5E,EAAA,iBAAA;AAAmB,EAAA,mBAAA;AAAqB,EAAA,iBAAA;AAAmB,EAAA,mBAAA;AAAqB,EAAA;AAClF,CAAA,CAAE,KAAK,GAAG,CAAA;AAOV,SAAgBC,EAAAA,CAAkB9oB,KAA4B4D,GAAAA,EAAwB;AACpF,EAAA,IAAI,EAAEmlB,GAAAA,YAAkB,OAAA,CAAA,EAAU,OAAO,KAAA;AACzC,EAAA,IAAMC,GAAAA,GAAUD,GAAAA,CAAO,OAAA,CAAQF,EAAgB,CAAA;AAC/C,EAAA,OAAOG,QAAY,IAAA,IAAQA,GAAAA,KAAYC,GAAAA,IAAQA,GAAAA,CAAK,SAASD,GAAO,CAAA;AACtE;ACqDA,IAAME,EAAAA,GAAyB;EAAE,UAAA,EAAY,IAAA;EAAM,WAAA,EAAa,IAAA;EAAM,KAAA,EAAO;AAAK,CAAA;AA4BlF,SAASC,EAAAA,CAAgBlqB,KAA+Be,GAAAA,EAAuC;AAC7F,EAAA,IAAIyX,GAAAA,GAAK,CAAA;AACT,EAAA,KAAA,IAASvX,GAAAA,GAAIkpB,GAAAA,GAAc,CAAA,EAAGlpB,GAAAA,IAAK,CAAA,EAAGuD,OACpC,IAAI+B,GAAAA,CAAMtF,GAAAA,CAAAA,EAAI,MAAA,EAAQ;AAAE,IAAA0D,MAAK1D,GAAAA,GAAI,CAAA;AAAG,IAAA;AAAO,EAAA;AAE7C,EAAA,IAAIwX,MAAKlS,GAAAA,CAAM,MAAA;AACf,EAAA,KAAA,IAAStF,GAAAA,GAAIkpB,GAAAA,GAAc,CAAA,EAAGlpB,GAAAA,GAAIsF,GAAAA,CAAM,MAAA,EAAQ5B,GAAAA,EAAAA,EAC9C,IAAI4B,GAAAA,CAAMtF,GAAAA,CAAAA,EAAI,MAAA,EAAQ;AAAE,IAAAuD,GAAAA,GAAKvD,GAAAA;AAAG,IAAA;AAAO,EAAA;AAEzC,EAAA,OAAO,CAACuX,KAAIC,GAAE,CAAA;AAChB;AAGA,SAAS2R,EAAAA,CACPpqB,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACAH,GAAAA,EACU;AACV,EAAA,IAAM,CAACgU,GAAAA,EAAIC,GAAAA,CAAAA,GAAMyR,EAAAA,CAAgB3jB,KAAO8jB,GAAK,CAAA;AAC7C,EAAA,OAAA,CAAQC,GAAAA,CAAY,QAAA,CAASC,GAAE,CAAA,GAAI,CAAC,GAAGD,GAAW,CAAA,GAAI,CAACC,GAAE,CAAA,EAAG,MAAA,CAAA,CAAQxpB,GAAAA,KAAM;AACxE,IAAA,IAAME,MAAIsF,GAAAA,CAAM,SAAA,CAAA,CAAWvG,GAAAA,KAAOwqB,GAAAA,CAAG,OAAOtkB,GAAC,CAAA;AAC7C,IAAA,OAAOjF,GAAAA,IAAKuX,OAAMvX,GAAAA,GAAIwX,GAAAA;EACxB,CAAC,CAAA;AACH;AAGA,SAASgS,EAAAA,CAAWzqB,GAAAA,EAA+Be,GAAAA,EAA+B4D,GAAAA,EAA8B;AAC9G,EAAA,IAAM+lB,GAAAA,GAAUC,GAAAA,CACb,GAAA,CAAA,CAAK5pB,QAAOwF,GAAAA,CAAM,SAAA,CAAA,CAAWvG,GAAAA,KAAOwqB,IAAG,EAAA,KAAOD,GAAE,CAAC,CAAA,CACjD,OAAA,CAAQvqB,GAAAA,KAAMiB,GAAAA,IAAK,CAAC,EACpB,IAAA,CAAA,CAAMjB,GAAAA,EAAGe,GAAAA,KAAM0F,MAAIlD,GAAC,CAAA,EACjBqnB,GAAAA,GACJF,GAAAA,CAAQ,SAAS,CAAA,IACjBA,GAAAA,CAAQ,KAAA,CAAA,CAAO1qB,KAAGe,GAAAA,KAAM;AACtB,IAAA,IAAIE,GAAAA,KAAM,GAAG,OAAO,IAAA;AACpB,IAAA,IAAMiK,GAAAA,GAAOwf,GAAAA,CAAQzpB,GAAAA,GAAI,CAAA,CAAA;AACzB,IAAA,OAAOiK,GAAAA,KAAS,MAAA,IAAarL,GAAAA,KAAMqL,GAAAA,GAAO,CAAA;EAC5C,CAAC,CAAA,EACGgP,MAAQwQ,GAAAA,CAAQ,CAAA,GAChBzQ,GAAAA,GAAOyQ,GAAAA,CAAQA,GAAAA,CAAQ,MAAA,GAAS,CAAA,CAAA;AACtC,EAAA,OAAOE,GAAAA,IACF1Q,QAAU,MAAA,IACVD,GAAAA,KAAS,UACT4Q,GAAAA,IAAe3Q,GAAAA,IACf2Q,OAAe5Q,GAAAA,GAAO,CAAA;AAC7B;AAmBA,SAAgB6Q,GAAmB1pB,GAAAA,EAAsD;AACvF,EAAA,IAAM2pB,GAAAA,GAAUrhB,OAAOshB,GAAI,CAAA;AAC3B,EAAAlmB,IAAQ,OAAA,GAAUkmB,GAAAA;AAClB,EAAA,IAAMC,GAAAA,GAAevhB,MAAAA,CAA2B,IAAI,CAAA,EAC9CwhB,GAAAA,GAAUxhB,MAAAA,CAAmC,IAAI,CAAA,EACjD,CAACyhB,GAAAA,EAAOC,GAAAA,CAAAA,GAAYlnB,SAA2B+lB,EAAI,CAAA;AAEzD,EAAAzlB,SAAAA,CAAA,MAAA,MAAsB;AAAE,IAAA3D,GAAAA,CAAQ,SAAS,MAAA,EAAO;AAAG,EAAA,CAAA,EAAG,EAAE,CAAA;AAExD,EAAA,IAAMwqB,GAAAA,GAAqBC,WAAAA,CAAAA,CAAatrB,GAAAA,EAAiBe,GAAAA,KAAgC;AACvF,IAAA,IAAM,CAACyX,GAAAA,EAAIC,GAAAA,CAAAA,GAAMyR,EAAAA,CAAgBa,GAAAA,CAAQ,OAAA,CAAQ,KAAA,EAAOZ,GAAW,CAAA,EAC7DlqB,GAAAA,GAAIgrB,GAAAA,CAAa,OAAA;AACvB,IAAA,IAAI,CAAChrB,KAAG,OAAOuY,GAAAA;AACf,IAAA,IAAM+S,GAAAA,GAAMR,GAAAA,CAAQ,OAAA,CAAQ,WAAA,EACtBS,GAAAA,GAAQD,MAAM,KAAA,CAAM,IAAA,CAAKtrB,GAAAA,CAAE,QAAQ,CAAA,CAAE,MAAA,CAAA,CAAQD,GAAAA,KAAOiJ,GAAAA,CAAG,OAAA,CAAQsiB,GAAG,CAAC,CAAA,GAAI,KAAA,CAAM,IAAA,CAAKtrB,GAAAA,CAAE,QAAQ,CAAA,EAC9FwrB,GAAAA,GAAMD,GAAAA,CAAK,MAAA;AACf,IAAA,KAAA,IAASvqB,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIuqB,GAAAA,CAAK,QAAQzqB,GAAAA,EAAAA,EAAK;AACpC,MAAA,IAAM2qB,GAAAA,GAAMF,IAAKvqB,GAAAA,CAAAA;AACjB,MAAA,IAAKyqB,GAAAA,IAEDC,GAAAA,GADMD,GAAAA,CAAI,qBAAA,GACE,MAAA,EAAQ;AAAE,QAAAzrB,GAAAA,GAAMgB,GAAAA;AAAG,QAAA;AAAO,MAAA;AAC5C,IAAA;AACA,IAAA,OAAO,KAAK,GAAA,CAAIuX,GAAAA,EAAI,KAAK,GAAA,CAAIiT,GAAAA,EAAKhT,GAAE,CAAC,CAAA;AACvC,EAAA,CAAA,EAAG,EAAE,CAAA,EAECmT,GAAAA,GAAQN,WAAAA,CAAAA,CAAuCtrB,GAAAA,KAAO;AAC1D,IAAA6B,IAAa,OAAA,GAAUoH,GAAAA;AACzB,EAAA,CAAA,EAAG,EAAE,CAAA,EAEC4iB,GAAAA,GAAQP,YAAAA,MAAkB;AAC9B,IAAAzqB,GAAAA,CAAQ,OAAA,GAAU,IAAA,EAClBuqB,GAAAA,CAASnB,EAAI,CAAA;EACf,CAAA,EAAG,EAAE,CAAA,EAEC6B,GAAAA,GAAmBR,YAAAA,CAAa3mB,GAAAA,EAAYH,KAAevD,GAAAA,KAAyB;AACxF,IAAA,IAAM8qB,MAAYd,GAAAA,CAAa,OAAA;AAE/B,IAAA,IADI,CAACc,OAAab,GAAAA,CAAQ,OAAA,IACtBrB,GAAkB7pB,GAAAA,CAAE,MAAA,EAAQA,GAAAA,CAAE,aAAwB,CAAA,EAAG;AAE7D,IAAA,IAAMgsB,GAAAA,GAAuB;AAC3B,MAAA,QAAA,EAAUhsB,GAAAA,CAAE,QAAA;AAAU,MAAA,OAAA,EAASA,GAAAA,CAAE,OAAA;AAAS,MAAA,OAAA,EAASA,GAAAA,CAAE,OAAA;AAAS,MAAA,MAAA,EAAQA,GAAAA,CAAE;KAC1E,EACI2qB,GAAAA,GAAuB,EAAC,EACxBE,GAAAA,GAAc,CAAA,EAGZvB,MAAUtpB,GAAAA,CAAE,aAAA,EAEZ0rB,GAAAA,GAAAA,CADQ,KAAA,CAAM,IAAA,CAAKK,GAAAA,CAAU,QAAQ,CAAA,CAAE,IAAA,CAAA,CAAM/rB,GAAAA,KAAUisB,GAAAA,CAAM,QAAA,CAAS3C,GAAO,CAAC,CAAA,IAAKA,GAAAA,EACvE,qBAAA,EAAsB,EAClC4C,GAAAA,GAAO;MAAE,CAAA,EAAGlsB,GAAAA,CAAE,UAAU0rB,GAAAA,CAAI,IAAA;MAAM,CAAA,EAAG1rB,GAAAA,CAAE,UAAU0rB,GAAAA,CAAI;KAAI,EACzDS,GAAAA,GAAAA,CAAWnsB,GAAAA,MAA4D;MAC3E,GAAA,EAAK2qB,GAAAA;MACL,IAAA,EAAMyB,GAAAA,CAAG,UAAUF,GAAAA,CAAK,CAAA;MACxB,GAAA,EAAKE,GAAAA,CAAG,UAAUF,GAAAA,CAAK,CAAA;AACvB,MAAA,KAAA,EAAOR,GAAAA,CAAI;AACb,KAAA,CAAA;AAEA,IAAA7qB,GAAAA,CAAQ,OAAA,GAAUwrB,kBAAAA,CAAmBrsB,GAAAA,EAAG;MACtC,MAAA,EAAQ+rB,GAAAA;MAGR,SAAA,EAAWhB,GAAAA,CAAQ,QAAQ,KAAA,CAAMV,GAAAA,GAAQ,MAAA,GACrC,QAAA,GACCU,GAAAA,CAAQ,OAAA,CAAQ,SAAA,IAAa,CAAA;AAClC,MAAA,UAAA,EAAA,CAAa/qB,GAAAA,KAAO;AAClB,QAAAkB,MAAakpB,EAAAA,CAAcW,GAAAA,CAAQ,OAAA,CAAQ,KAAA,EAAOA,IAAQ,OAAA,CAAQ,WAAA,EAAaR,GAAAA,EAAIF,GAAK,GACxFjpB,GAAAA,GAAciqB,GAAAA,CAAmBe,IAAG,OAAA,EAAS/B,GAAK,GAClDe,GAAAA,CAAS;UAAE,UAAA,EAAAlqB,GAAAA;UAAY,WAAA,EAAAE,GAAAA;AAAa,UAAA,KAAA,EAAO+qB,IAAQC,GAAE;SAAG,CAAA;AAC1D,MAAA,CAAA;AACA,MAAA,MAAA,EAAA,CAASpsB,GAAAA,KAAO;AACd,QAAAoB,MAAciqB,GAAAA,CAAmBe,GAAAA,CAAG,OAAA,EAAS/B,GAAK,GAClDe,GAAAA,CAAS;UAAE,UAAA,EAAAlqB,GAAAA;UAAY,WAAA,EAAAE,GAAAA;AAAa,UAAA,KAAA,EAAO+qB,IAAQC,GAAE;SAAG,CAAA;AAC1D,MAAA,CAAA;AACA,MAAA,QAAA,EAAA,CAAWpsB,GAAAA,KAAO;AAChB,QAAA,IAAMssB,GAAAA,GAAOjB,GAAAA,CAAmBe,GAAAA,CAAG,OAAA,EAAS/B,GAAK,CAAA;AAC5CI,QAAAA,EAAAA,CAAWM,GAAAA,CAAQ,OAAA,CAAQ,KAAA,EAAOJ,GAAAA,EAAY2B,GAAI,CAAA,IACrDvB,GAAAA,CAAQ,OAAA,CAAQ,SAAA,CAAUJ,GAAAA,EAAY2B,GAAI,GAE5CT,GAAAA,EAAM;AACR,MAAA,CAAA;AACA,MAAA,OAAA,EAAA,MAAe;AACb,QAAA,IAAM,EAAE,OAAA,EAAA7rB,GAAAA,EAAA,GAAY+qB,GAAAA,CAAQ,OAAA;AACxBwB,QAAAA,GAAAA,KACFA,IAAQhC,GAAAA,EAAIyB,GAAI,GAChBQ,EAAAA,CAAiBT,GAAS,IAE5BF,GAAAA,EAAM;AACR,MAAA,CAAA;MAIA,QAAA,EAAUA;KACX,CAAA;EACH,CAAA,EAAG,CAACR,GAAAA,EAAoBQ,GAAK,CAAC,CAAA;AAiB9B,EAAA,OAAO;AACL,IAAA,KAAA,EAhBYP,WAAAA,CAAAA,CAAatrB,GAAAA,EAAYe,GAAAA,EAAe4D,GAAAA,KAA2B;AAC/E,MAAA,IAAM,EAAE,OAAAH,GAAAA,EAAO,WAAA,EAAAvD,KAAa,SAAA,EAAAwF,GAAAA,KAAcskB,GAAAA,CAAQ,OAAA;AAClD,MAAA,IAAIxkB,GAAAA,CAAM8jB,GAAAA,CAAAA,EAAQ,MAAA,EAAQ,OAAO,KAAA;AACjC,MAAA,IAAMoC,MAAMrC,EAAAA,CAAc7jB,GAAAA,EAAO+jB,GAAAA,EAAaC,GAAAA,EAAIF,GAAK,CAAA,EACjDqC,GAAAA,GAAKD,GAAAA,CAAI,GAAA,CAAA,CAAKzsB,GAAAA,KAAMuG,GAAAA,CAAM,SAAA,CAAA,CAAWxF,QAAOypB,GAAAA,CAAG,EAAA,KAAOtkB,GAAC,CAAC,EAAE,IAAA,CAAA,CAAMlG,GAAAA,EAAGe,GAAAA,KAAM0F,MAAIlD,GAAC,CAAA,EAC9E2W,GAAAA,GAAQwS,GAAAA,CAAG,CAAA,CAAA,EACXzS,GAAAA,GAAOyS,GAAAA,CAAGA,GAAAA,CAAG,SAAS,CAAA,CAAA;AAC5B,MAAA,IAAIxS,GAAAA,KAAU,MAAA,IAAaD,GAAAA,KAAS,MAAA,EAAW,OAAO,KAAA;AACtD,MAAA,IAAM,CAACzB,GAAAA,EAAIC,GAAAA,CAAAA,GAAMyR,EAAAA,CAAgB3jB,GAAAA,EAAO8jB,GAAK,CAAA,EACvCP,GAAAA,GAAS6C,GAAAA,GAAQ,CAAA,GAAIzS,GAAAA,GAAQ,IAAID,GAAAA,GAAO,CAAA;AAG9C,MAAA,OAFI6P,GAAAA,GAAStR,GAAAA,IAAMsR,GAAAA,GAASrR,GAAAA,IAAMgS,EAAAA,CAAWlkB,GAAAA,EAAOkmB,GAAAA,EAAK3C,GAAM,CAAA,GAAU,KAAA,IACzE8C,GAAAA,CAAUH,GAAAA,EAAK3C,GAAM,CAAA,EACd,IAAA,CAAA;AACT,IAAA,CAAA,EAAG,EAGD,CAAA;IACA,QAAA,EAAA,CAAW9pB,GAAAA,EAAIe,GAAAA,MAAW,EACxB,aAAA,EAAA,CAAgB4D,GAAAA,KAAMmnB,GAAAA,CAAiBvB,GAAAA,EAAIF,GAAAA,EAAOrqB,GAAC,CAAA,EACrD,CAAA;IACA,cAAA,EAAgB,EACd,KAAK4rB,GAAAA,EACP;IACA,KAAA,EAAA7mB;AACF,GAAA;AACF;AAQA,SAASynB,GAAiBxsB,GAAAA,EAA8B;AACtD,EAAA,IAAM6sB,GAAAA,GAAAA,CAAW7sB,GAAAA,KAAa;AAAE,IAAAA,IAAE,eAAA,EAAgB;AAAG,EAAA,CAAA;AACrD+rB,EAAAA,IAAU,gBAAA,CAAiB,OAAA,EAASc,KAAS,IAAI,CAAA,EACjD,WAAA,MAAiB;AAAE,IAAA7sB,GAAAA,CAAU,mBAAA,CAAoB,OAAA,EAAS6sB,GAAAA,EAAS,IAAI,CAAA;AAAG,EAAA,CAAA,EAAG,CAAC,CAAA;AAChF;;;;;;;;;AC/QA,SAAgBC,GAAAA,CAAe,EAAE,IAAA,EAAAtoB,GAAAA,EAAM,MAAAvD,GAAAA,GAAO,EAAA,EAAI,SAAA,EAAAwF,GAAAA,EAAA,EAAkC;AAClF,EAAA,uBACE1F,KAAC,KAAA,EAAD;AACE,IAAA,SAAA,EAAWqE,MAAY,CAAA,EAAGlE,GAAAA,CAAE,IAAA,CAAA,CAAA,EAAQkE,GAAAA,KAAclE,GAAAA,CAAE,IAAA;IACpD,OAAA,EAAQ,WAAA;IACR,KAAA,EAAOM,GAAAA;IACP,MAAA,EAAQA,GAAAA;IACR,aAAA,EAAY,MAAA;IACZ,SAAA,EAAU,OAAA;IANZ,QAAA,EAAA,iBAQExB,GAAAA,CAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWkB,GAAAA,CAAE,OAAA;MAAS,KAAA,EAAM,IAAA;MAAK,MAAA,EAAO,IAAA;MAAK,EAAA,EAAG;KAAK,CAAA,kBAG3DlB,GAAAA,CAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWkB,GAAAA,CAAE,IAAA;AAAM,MAAA,CAAA,EAAG6rB,MAAO,YAAA,GAAe;AAA0B,KAAA,CACzE;;AAET;AAsCA,SAAgBC,IAAW,EAAE,IAAA,EAAAjsB,GAAAA,EAAM,QAAA,EAAAE,KAAU,KAAA,EAAAwF,GAAAA,EAAO,QAAA,EAAAkC,GAAAA,EAAU,MAAAzH,GAAAA,GAAO,EAAA,EAAI,UAAAjB,GAAAA,EAAU,SAAA,EAAAkB,KAAA,EAA8B;AAC/G,EAAA,uBACEnB,IAAC,QAAA,EAAD;IACE,IAAA,EAAK,QAAA;AACL,IAAA,SAAA,EAAWoF,MAAY,CAAA,EAAGlE,GAAAA,CAAE,MAAA,CAAA,CAAA,EAAUkE,GAAAA,KAAclE,GAAAA,CAAE,MAAA;IACtD,eAAA,EAAe6rB,GAAAA;IACf,eAAA,EAAeE,GAAAA;IACf,YAAA,EAAYvrB,GAAAA;IACF,QAAA,EAAAzB,GAAAA;IACV,OAAA,EAASitB,GAAAA;IAET,QAAA,kBAAAltB,IAAC8sB,GAAAA,EAAD;MAAsB,IAAA,EAAA/rB,GAAAA;MAAY,IAAA,EAAAG;KAAO;GACnC,CAAA;AAEZ;AAiBA,SAAgBisB,GAAAA,CAAc,EAAE,QAAA,EAAA3oB,GAAAA,EAAU,WAAAiC,GAAAA,EAAW,GAAG2mB,KAAAA,EAA8B;AACpF,EAAA,uBACErsB,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWqE,MAAY,CAAA,EAAGlE,GAAAA,CAAE,GAAA,CAAA,CAAA,EAAOkE,GAAAA,KAAclE,GAAAA,CAAE,GAAA;IAAxD,QAAA,EAAA,iBACElB,GAAAA,CAACgtB,GAAAA,EAAD,EAAY,GAAII,GAAAA,EAAS,CAAA,kBACzBptB,GAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWkB,GAAAA,CAAE,OAAA;MAAU,QAAA,EAAAsD;AAAc,KAAA,CACvC;;AAET;;;;;;;;;;;;;;;;;ICzCM6oB,EAAAA,GAAc,qGAAA;AAGpB,SAASC,GAAYttB,GAAAA,EAAwC;AAE3D,EAAA,IAAMutB,GAAAA,GADSvtB,GAAAA,CAAE,MAAA,EACG,OAAA,GAAUqtB,EAAW,CAAA;AACzC,EAAA,OAAO,CAAC,CAACE,GAAAA,IAAOvtB,GAAAA,CAAE,aAAA,CAAc,SAASutB,GAAG,CAAA;AAC9C;AASA,SAAgBC,GAAqCpsB,GAAAA,EAA2B;AAC9E,EAAA,IAAM,EACJ,IAAA,EAAA0D,GAAAA,EAAM,OAAA,EAAAjD,GAAAA,EAAS,WAAA,EAAAhB,GAAAA,EAAa,SAAA,EAAAkE,GAAAA,EAAW,KAAA,EAAAgP,GAAAA,GAAQ,QAAA,EAAK,SAAA,EAAAiK,KACpD,YAAA,EAAAne,GAAAA,EAAc,UAAA,EAAAoG,GAAAA,EAAY,YAAA,EAAA1C,GAAAA,EAAc,aAAA,EAAA2C,GAAAA,EAAe,WAAA,EAAAkjB,GAAAA,EAAa,kBAAA,EAAAnY,GAAAA,EAAoB,gBAAA,EAAAI,GAAAA,KACtF3M,GAAAA,EACE,CAAC+oB,GAAAA,EAAMC,GAAAA,CAAAA,GAAWxpB,QAAAA,CAAoBypB,GAAAA,IAAe,IAAI,CAAA,EACzD,CAACC,GAAAA,EAAaC,GAAAA,CAAAA,GAAkB3pB,QAAAA,CAAAA,MAAoC,IAAI,GAAA,CAAI4pB,GAAkB,CAAC,CAAA,EAC/FC,GAAAA,GAAWC,GAAAA,IAAeJ,GAAAA,EAC1BK,GAAAA,GAAexkB,KAAAA,EAAM,EAErBykB,GAAAA,GAAAA,CAAkBluB,GAAAA,KAAe;AACrC,IAAA,IAAMoL,GAAAA,GAAO,IAAI,GAAA,CAAI2iB,GAAQ,CAAA;AACzB3iB,IAAAA,IAAK,GAAA,CAAImf,GAAE,CAAA,GAAGnf,GAAAA,CAAK,OAAOmf,GAAE,CAAA,GAC3Bnf,GAAAA,CAAK,GAAA,CAAImf,GAAE,CAAA,EACXyD,GAAAA,IAAaH,IAAeziB,GAAI,CAAA,EACrC+iB,MAAmB/iB,GAAI,CAAA;EACzB,CAAA,EAEMgjB,GAAAA,GAAaC,QAAAA,MAAc;AAC/B,IAAA,IAAI,CAACZ,GAAAA,EAAM,OAAO,CAAC,GAAGjC,GAAI,CAAA;AAC1B,IAAA,IAAM8C,GAAAA,GAAMC,IAAQ,IAAA,CAAA,CAAMvuB,QAAMC,GAAAA,CAAE,EAAA,KAAOwtB,IAAK,QAAQ,CAAA;AACtD,IAAA,IAAI,CAACa,GAAAA,EAAK,OAAO,CAAC,GAAG9C,GAAI,CAAA;AACzB,IAAA,IAAM1rB,GAAAA,GAAMwuB,GAAAA,CAAI,QAAA,KAAA,CAAcvtB,GAAAA,KAAc2qB,GAAAA,CAA2C4C,GAAAA,CAAI,EAAA,CAAA,CAAA,EACrFE,GAAAA,GAAMf,GAAAA,CAAK,SAAA,KAAc,QAAQ,CAAA,GAAI,EAAA;AAC3C,IAAA,OAAO,CAAC,GAAGjC,GAAI,EAAE,IAAA,CAAA,CAAMxrB,KAAGwE,GAAAA,KAAM;AAC9B,MAAA,IAAMiqB,MAAK3uB,GAAAA,CAAI2G,GAAC,CAAA,EACVioB,GAAAA,GAAK5uB,IAAIyD,GAAC,CAAA;AAMhB,MAAA,OALIkrB,OAAM,IAAA,IAAQC,GAAAA,IAAM,OAAa,CAAA,GACjCD,GAAAA,IAAM,OAAa,CAAA,GACnBC,GAAAA,IAAM,IAAA,GAAa,EAAA,GACnBD,MAAKC,GAAAA,GAAW,EAAA,GAAKF,MACrBC,GAAAA,GAAKC,GAAAA,GAAW,IAAIF,GAAAA,GACjB,CAAA;IACT,CAAC,CAAA;EACH,CAAA,EAAG;AAAChD,IAAAA,GAAAA;AAAM+C,IAAAA,GAAAA;AAASd,IAAAA;GAAK,CAAA,EAElBkB,GAAAA,GAAAA,CAAa3uB,GAAAA,KAAqB;AACtC,IAAAikB,IAAA,CAASljB,GAAAA,KACH,CAACgd,GAAAA,IAAOA,GAAAA,CAAI,aAAa6Q,GAAAA,GAAiB;MAAE,QAAA,EAAA5uB,GAAAA;MAAU,SAAA,EAAW;KAAM,GACvE+d,GAAAA,CAAI,cAAc,KAAA,GAAc;MAAE,QAAA,EAAA/d,GAAAA;MAAU,SAAA,EAAW;AAAO,KAAA,GAC3D,IACR,CAAA;AACH,EAAA,CAAA,EAKM6uB,MAAO/D,EAAAA,CAAmB;IAC9B,KAAA,EAAOsD,GAAAA,CAAW,GAAA,CAAA,CAAKpuB,GAAAA,MAAO;AAAE,MAAA,EAAA,EAAIwE,GAAAA,CAAE,EAAA;MAAI,KAAA,EAAO;KAAG,CAAE,CAAA;AACtD,IAAA,WAAA,EAAa,EAAC;AACd,IAAA,SAAA,EAAWooB,QAAAA,MAAoB;AAAC,IAAA,CAAA,CAAA;IAChC,WAAA,EAAa;AACf,GAAC,CAAA,EACKkC,GAAAA,GAAc,CAAC,CAAClC,GAAAA,EAChBmC,EAAAA,GAAgB,CAAC,CAACC,GAAAA,EAClBC,EAAAA,GAAWV,GAAAA,CAAQ,MAAA,GAAU,CAAA,CAAA,CAAA/J,GAAAA,GAAwB,CAAA,CAAA,CAAAoD,EAAAA,EAErDhhB,EAAAA,GAAM,CAAC1F,EAAAA,CAAE,IAAA,EAAMkE,GAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAExD,EAAA,uBACEZ,IAAC,KAAA,EAAD;IACE,SAAA,EAAWoC,EAAAA;IAEX,QAAA,kBAAA3F,KAAC,OAAA,EAAD;AAAO,MAAA,SAAA,EAAWC,EAAAA,CAAE,KAAA;MAApB,QAAA,EAAA,iBACEsD,GAAAA,CAAC,OAAA,EAAD,EAAA,0BACEvD,IAAAA,CAAC,IAAA,EAAD,EAAA,QAAA,EAAA;QACG6tB,GAAAA,oBAAetqB,IAAC,IAAA,EAAD;AAAI,UAAA,SAAA,EAAWtD,EAAAA,CAAE,SAAA;UAAW,YAAA,EAAW;SAAQ,CAAA;QAC9D6tB,EAAAA,oBAAiBvqB,IAAC,IAAA,EAAD;AAAI,UAAA,SAAA,EAAWtD,EAAAA,CAAE,SAAA;UAAW,YAAA,EAAW;SAAW,CAAA;QACnEqtB,GAAAA,CAAQ,GAAA,CAAA,CAAKvuB,GAAAA,KAAQ;AACpB,UAAA,IAAMkvB,GAAAA,GAAWZ,GAAAA,CAAI,QAAA,KAAa,KAAA,EAC5Ba,MAAS1B,GAAAA,EAAM,QAAA,KAAaa,GAAAA,CAAI,EAAA,EAChCc,MAAYD,GAAAA,GAAU1B,GAAAA,CAAK,SAAA,KAAc,KAAA,GAAQ,YAAO,SAAA,GAAQ,EAAA;AACtE,UAAA,uBACEjpB,IAAC,IAAA,EAAD;AAEE,YAAA,SAAA,EAAW,CAAC8pB,GAAAA,CAAI,SAAA,EAAWa,GAAAA,GAASjuB,EAAAA,CAAE,UAAA,GAAa,EAAE,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC/E,YAAA,WAAA,EAAWguB,MAAYC,GAAAA,GAAU1B,GAAAA,CAAK,cAAc,KAAA,GAAQ,WAAA,GAAc,eAAgB,MAAA,GAAU,MAAA;YAEnG,QAAA,EAAAyB,GAAAA,mBACCjuB,IAAAA,CAAC,QAAA,EAAD;cAAQ,IAAA,EAAK,QAAA;AAAS,cAAA,SAAA,EAAWC,EAAAA,CAAE,UAAA;cAAY,OAAA,EAAA,MAAeytB,GAAAA,CAAUL,GAAAA,CAAI,EAAE,CAAA;cAA9E,QAAA,EAAA,CACGA,GAAAA,CAAI,MAAA,EAAQc,GACP;aAER,CAAA,mBAAAnuB,IAAAA,CAAAgE,QAAAA,EAAA,EAAA,QAAA,EAAA,CAAGqpB,GAAAA,CAAI,MAAA,EAAQc,GAAY,CAAA,EAAA;AAE3B,WAAA,EAXGd,IAAI,EAWP,CAAA;QAER,CAAC;AACC,OAAA,EAAA,CAAA,EACC,CAAA,kBACPrtB,KAAC,OAAA,EAAD;QAAO,GAAA,EAAK6tB,GAAAA,GAAeD,GAAAA,CAAK,cAAA,CAAe,GAAA,GAAqD,MAAA;QAApG,QAAA,EAAA,CACGT,GAAAA,CAAW,MAAA,KAAW,CAAA,oBACrB5pB,GAAAA,CAAC,IAAA,EAAD,EAAA,QAAA,kBACEA,GAAAA,CAAC,IAAA,EAAD;UAAI,OAAA,EAASyqB,EAAAA;AAAU,UAAA,SAAA,EAAW/tB,EAAAA,CAAE,KAAA;UACjC,QAAA,EAAAvB;AACC,SAAA,GACF,CAAA,EAELyuB,IAAW,GAAA,CAAA,CAAKpuB,KAAK2E,GAAAA,KAAM;AAC1B,UAAA,IAAM0qB,MAAaR,GAAAA,CAAK,KAAA,CAAM,UAAA,EAAY,QAAA,CAASnD,IAAI,EAAE,CAAA,IAAK,KAAA,EACxD5B,GAAAA,GAAS+E,IAAK,KAAA,CAAM,WAAA,EACpBS,MAAaP,EAAAA,KAAkBQ,GAAAA,GAAgB7D,GAAG,CAAA,IAAK,IAAA,CAAA,EACvD8D,GAAAA,GAAaF,GAAAA,IAAcvB,IAAS,GAAA,CAAIrC,GAAAA,CAAI,EAAE,CAAA,EAC9C+D,GAAAA,GAASD,MAAaR,GAAAA,CAActD,GAAG,CAAA,GAAI,IAAA,EAC3CgE,MAAW,CAAA,EAAGzB,GAAAA,WAAuBvC,GAAAA,CAAI,EAAA,IACzCiE,GAAAA,GAAS;AACbC,YAAAA,GAAAA,IAAc1uB,EAAAA,CAAE,SAAA;AAChBmuB,YAAAA,GAAAA,IAAcnuB,EAAAA,CAAE,QAAA;AAChB4oB,YAAAA,GAAAA,KAAW7oB,OAAKC,EAAAA,CAAE,UAAA;AAClB4oB,YAAAA,GAAAA,KAAWsE,IAAW,MAAA,IAAUntB,GAAAA,KAAMmtB,GAAAA,CAAW,MAAA,GAAS,KAAKltB,EAAAA,CAAE,SAAA;AACjE2uB,YAAAA,GAAAA,GAAenE,GAAG;AACpB,WAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC1B,UAAA,uBACEzqB,KAAC6uB,UAAAA,EAAD,EAAA,UAAA,iBACE7uB,KAAC,IAAA,EAAD;AACE,YAAA,SAAA,EAAW0uB,GAAAA,IAAU,MAAA;AACrB,YAAA,eAAA,EAAeH,GAAAA,IAAc,MAAA;AAC7B,YAAA,QAAA,EAAUI,MAAa,CAAA,GAAI,MAAA;YAC3B,OAAA,EAASA,GAAAA,GAAAA,CAAc7uB,GAAAA,KAAM;AAAOusB,cAAAA,EAAAA,CAAYttB,GAAC,CAAA,IAAG4vB,GAAAA,CAAWlE,GAAG,CAAA;YAAG,CAAA,GAAI,MAAA;YACzE,SAAA,EAAWkE,GAAAA,GAAAA,CAAc7uB,GAAAA,KAAM;AACzBf,cAAAA,GAAAA,CAAE,MAAA,KAAWA,GAAAA,CAAE,aAAA,IAAkBA,IAAE,GAAA,KAAQ,OAAA,IAAWA,GAAAA,CAAE,GAAA,KAAQ,GAAA,KACpEA,GAAAA,CAAE,cAAA,EAAe,EACjB4vB,IAAWlE,GAAG,CAAA,CAAA;YAChB,CAAA,GAAI,MAAA;YATN,QAAA,EAAA;cAWGoD,GAAAA,oBACCtqB,IAAC,IAAA,EAAD;AACE,gBAAA,SAAA,EAAWtD,EAAAA,CAAE,UAAA;gBACb,aAAA,EAAA,CAAgBH,QAAM8tB,GAAAA,CAAK,QAAA,CAASnD,IAAI,EAAA,EAAIzqB,GAAC,CAAA,CAAE,aAAA,CAAcjB,GAAC,CAAA;gBAE9D,QAAA,kBAAAwE,IAAC,MAAA,EAAD;kBAAM,aAAA,EAAY,MAAA;kBAAO,QAAA,EAAA;iBAAQ;eAC/B,CAAA;cAELuqB,EAAAA,oBACCvqB,IAAC,IAAA,EAAD;AAAI,gBAAA,SAAA,EAAWtD,EAAAA,CAAE,UAAA;gBACd,QAAA,EAAAouB,GAAAA,oBACC9qB,GAAAA,CAACwoB,GAAAA,EAAD;kBACE,IAAA,EAAMwC,GAAAA;kBACN,QAAA,EAAA,MAAgBtB,GAAAA,CAAexC,GAAAA,CAAI,EAAE,CAAA;AACrC,kBAAA,KAAA,EAAO8D,MAAa,cAAA,GAAiB,cAAA;kBACrC,QAAA,EAAUC,GAAAA,IAAU,OAAkB,MAAA,GAAXC;iBAC5B;eAED,CAAA;cAELnB,GAAAA,CAAQ,GAAA,CAAA,CAAKxtB,GAAAA,KAAQ;AACpB,gBAAA,IAAMjB,GAAAA,GAAMwuB,IAAI,QAAA,KAAA,CAActuB,QAAYwE,GAAAA,CAAyC8pB,GAAAA,CAAI,EAAA,CAAA,CAAA,EACjFtF,GAAAA,GAAUsF,IAAI,MAAA,GAASA,GAAAA,CAAI,OAAO5C,GAAG,CAAA,GAAI,OAAO5rB,GAAAA,CAAI4rB,GAAG,KAAK,EAAE,CAAA;AACpE,gBAAA,uBACElnB,IAAC,IAAA,EAAD;AAAiB,kBAAA,SAAA,EAAW8pB,GAAAA,CAAI,SAAA;kBAC7B,QAAA,EAAAtF;AACC,iBAAA,EAFKsF,IAAI,EAET,CAAA;cAER,CAAC;AACC;AACH,WAAA,CAAA,EAAAmB,GAAAA,IAAU,IAAA,oBACTjrB,IAAC,IAAA,EAAD;YAAI,EAAA,EAAIkrB,GAAAA;AAAU,YAAA,SAAA,EAAWxuB,EAAAA,CAAE,SAAA;AAAW,YAAA,gBAAA,EAAgBwqB,GAAAA,CAAI,EAAA;YAC5D,QAAA,kBAAAlnB,IAAC,IAAA,EAAD;cAAI,OAAA,EAASyqB,EAAAA;cAAW,QAAA,EAAAQ;aAAW;AACjC,WAAA,CAEE,CAAA,EAAA,EA/CK/D,GAAAA,CAAI,EA+CT,CAAA;AAEd,QAAA,CAAC,CACI;AACF,OAAA,CAAA;;GACJ,CAAA;AAET;;AC/OA,SAASqE,IAAc/vB,GAAAA,EAAsB;AAC3C,EAAA,IAAMgwB,GAAAA,GAAK,iBAAiB/mB,GAAE,CAAA;AAC9B,EAAA,OACE+mB,GAAAA,CAAG,SAAA,KAAc,MAAA,IACjBA,GAAAA,CAAG,WAAW,MAAA,IACdA,GAAAA,CAAG,cAAA,KAAmB,MAAA,IACtBA,IAAG,WAAA,KAAgB,MAAA,IACnB,6BAAA,CAA8B,IAAA,CAAKA,IAAG,OAAO,CAAA;AAEjD;AAMA,SAAgBC,GAAAA,CAAU,EAAE,EAAA,EAAAxpB,GAAAA,EAAI,MAAAkC,GAAAA,EAAM,QAAA,EAAAzH,KAAA,EAA4B;AAChE,EAAA,IAAM8oB,GAAAA,GAAOrmB,EAAAA,CAAkBC,GAAI,CAAA,IAAK,SAAS,IAAA,EAC3CssB,GAAAA,GAASlG,GAAAA,KAAS,QAAA,CAAS,QAAQ+F,GAAAA,CAAc/F,GAAI,CAAA,GAAIA,GAAAA,CAAK,uBAAsB,GAAI;IAAE,IAAA,EAAM,CAAA;IAAG,GAAA,EAAK;AAAE,GAAA,EAE1GpD,GAAAA,GAAuB;IAAE,IAAA,EAAM8F,GAAAA,CAAG,OAAOwD,GAAAA,CAAO,IAAA;IAAM,GAAA,EAAKxD,GAAAA,CAAG,MAAMwD,GAAAA,CAAO,GAAA;AAAK,IAAA,KAAA,EAAOxD,GAAAA,CAAG;AAAM,GAAA;AACtG,EAAA,OAAOyD,YAAAA,iBACLpvB,GAAAA,CAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWG,GAAAA,CAAE,KAAA;IAAc,KAAA,EAAAE,GAAAA;IAAO,aAAA,EAAY,MAAA;IAChD,QAAA,EAAAF;AACE,GAAA,GACL8oB,GACF,CAAA;AACF;AChCA,SAAgBoG,GAAAA,CAAgB,EAAE,IAAA,EAAAzrB,GAAAA,GAAO,IAAA,EAA4B;AACnE,EAAA,uBACE5D,KAAC,KAAA,EAAD;AACE,IAAA,KAAA,EAAQS,MAAO,CAAA,GAAK,EAAA;IACpB,MAAA,EAAQA,GAAAA;IACR,OAAA,EAAQ,UAAA;IACR,IAAA,EAAK,cAAA;IACL,aAAA,EAAY,MAAA;IALd,QAAA,EAAA;AAOE,sBAAAxB,IAAC,QAAA,EAAD;QAAQ,EAAA,EAAG,GAAA;QAAI,EAAA,EAAG,GAAA;QAAI,CAAA,EAAE;OAAO,CAAA;AAC/B,sBAAAA,IAAC,QAAA,EAAD;QAAQ,EAAA,EAAG,GAAA;QAAI,EAAA,EAAG,GAAA;QAAI,CAAA,EAAE;OAAO,CAAA;AAC/B,sBAAAA,IAAC,QAAA,EAAD;QAAQ,EAAA,EAAG,GAAA;QAAI,EAAA,EAAG,GAAA;QAAI,CAAA,EAAE;OAAO,CAAA;AAC/B,sBAAAA,IAAC,QAAA,EAAD;QAAQ,EAAA,EAAG,GAAA;QAAI,EAAA,EAAG,GAAA;QAAI,CAAA,EAAE;OAAO,CAAA;AAC/B,sBAAAA,IAAC,QAAA,EAAD;QAAQ,EAAA,EAAG,GAAA;QAAI,EAAA,EAAG,IAAA;QAAK,CAAA,EAAE;OAAO,CAAA;AAChC,sBAAAA,IAAC,QAAA,EAAD;QAAQ,EAAA,EAAG,GAAA;QAAI,EAAA,EAAG,IAAA;QAAK,CAAA,EAAE;OAAO;AAC7B;;AAET;;;;;;;ICeMqwB,GAAAA,GAAqF;EACzF,GAAA,EAAK;IACH,KAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAQ,MAAA,EAAQ,QAAA;MAAQ,IAAA,EAAM;AAAM,KAAA;IACrD,OAAA,EAAS;MAAE,IAAA,EAAM,MAAA;MAAQ,MAAA,EAAQ,MAAA;MAAQ,IAAA,EAAM;AAAO,KAAA;IACtD,KAAA,EAAS;MAAE,IAAA,EAAM,MAAA;MAAQ,MAAA,EAAQ,MAAA;MAAQ,IAAA,EAAM;AAAO;AACxD,GAAA;EACA,KAAA,EAAO;IACL,KAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAK,MAAA,EAAQ,QAAA;MAAK,IAAA,EAAM;AAAQ,KAAA;IACjD,OAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAK,MAAA,EAAQ,QAAA;MAAK,IAAA,EAAM;AAAQ,KAAA;IACjD,KAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAK,MAAA,EAAQ,QAAA;MAAK,IAAA,EAAM;AAAQ;AACnD,GAAA;EACA,GAAA,EAAK;IACH,KAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAO,MAAA,EAAQ,QAAA;MAAO,IAAA,EAAM;AAAS,KAAA;IACtD,OAAA,EAAS;MAAE,IAAA,EAAM,KAAA;MAAO,MAAA,EAAQ,KAAA;MAAO,IAAA,EAAM;AAAM,KAAA;IACnD,KAAA,EAAS;MAAE,IAAA,EAAM,KAAA;MAAO,MAAA,EAAQ,KAAA;MAAO,IAAA,EAAM;AAAM;AACrD,GAAA;EACA,IAAA,EAAM;IACJ,KAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAQ,MAAA,EAAQ,QAAA;MAAQ,IAAA,EAAM;AAAU,KAAA;IACzD,OAAA,EAAS;MAAE,IAAA,EAAM,MAAA;MAAQ,MAAA,EAAQ,MAAA;MAAQ,IAAA,EAAM;AAAO,KAAA;IACtD,KAAA,EAAS;MAAE,IAAA,EAAM,MAAA;MAAQ,MAAA,EAAQ,MAAA;MAAQ,IAAA,EAAM;AAAO;AACxD,GAAA;EAGA,IAAA,EAAM;IACJ,KAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAK,MAAA,EAAQ,QAAA;MAAK,IAAA,EAAM;AAAM,KAAA;IAC/C,OAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAK,MAAA,EAAQ,QAAA;MAAK,IAAA,EAAM;AAAM,KAAA;IAC/C,KAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAK,MAAA,EAAQ,QAAA;MAAK,IAAA,EAAM;AAAQ;AACnD;AACF,CAAA;IAGaC,GAAAA,GAAuC,IAAI,IACtD,MAAA,CAAO,MAAA,CAAOD,GAAe,CAAA,CAAE,OAAA,CAAA,CAASrwB,GAAAA,KACtC,MAAA,CAAO,OAAOuwB,GAAU,CAAA,CAAE,QAAA,CAASvwB,GAAAA,KAAa,OAAO,MAAA,CAAOwwB,GAAQ,CAAC,CACzE,CACF,CAAA;AAMA,SAAgBC,GAAAA,GAA2B;AACzC,EAAA,IAAI,OAAO,SAAA,GAAc,GAAA,EAAa,OAAO,OAAA;AAG7C,EAAA,IAAMhF,OADU,SAAA,CAAoE,aAAA,EAC/D,YAAY,SAAA,CAAU,SAAA,IAAa,IAAI,WAAA,EAAY;AAIxE,EAAA,OAHIA,GAAAA,CAAI,QAAA,CAAS,KAAK,CAAA,IAAKA,GAAAA,CAAI,QAAA,CAAS,QAAQ,CAAA,IAAKA,GAAAA,CAAI,QAAA,CAAS,QAAQ,CAAA,IAAKA,IAAI,QAAA,CAAS,MAAM,CAAA,GAAU,OAAA,GACxGA,GAAAA,CAAI,QAAA,CAAS,KAAK,CAAA,GAAU,SAAA,GAC5BA,GAAAA,CAAI,QAAA,CAAS,OAAO,CAAA,IAAKA,GAAAA,CAAI,QAAA,CAAS,KAAK,IAAU,OAAA,GAClD,OAAA;AACT;AAsBA,SAAgBiF,GAAAA,CACd1wB,GAAAA,EACAe,GAAAA,GAAgC,EAAC,EACb;AACpB,EAAA,IAAM4vB,MAAW3F,GAAAA,CAAK,QAAA,IAAYyF,KAAe,EAC3CG,GAAAA,GAAS5F,IAAK,MAAA,IAAU,MAAA;AAC9B,EAAA,OAAOgB,GAAAA,CAAK,GAAA,CAAA,CAAKhsB,GAAAA,KAAM;AACrB,IAAA,IAAM0B,MAAQ2uB,GAAAA,CAAgBxvB,GAAAA,CAAE,IAAA,CAAA,CAAM8vB,GAAAA,EAAUC,GAAAA,CAAAA;AAChD,IAAA,OAAO/vB,IAAE,QAAA,GAAW;MAAE,KAAA,EAAAE,GAAAA;MAAO,QAAA,EAAU;KAAK,GAAI,EAAE,OAAAA,GAAAA,EAAM;EAC1D,CAAC,CAAA;AACH;AAKA,IAAM8vB,GAAAA,GAA2E;EAC/E,MAAA,EAAa;IAAE,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAQ,MAAA,EAAQ,QAAA;MAAY,IAAA,EAAM;AAAM,KAAA;IAAS,OAAA,EAAS;MAAE,IAAA,EAAM,KAAA;MAAa,MAAA,EAAQ,KAAA;MAAa,IAAA,EAAM;AAAM,KAAA;IAAS,KAAA,EAAO;MAAE,IAAA,EAAM,KAAA;MAAa,MAAA,EAAQ,KAAA;MAAa,IAAA,EAAM;AAAM;AAAE,GAAA;EACtN,KAAA,EAAa;IAAE,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAQ,MAAA,EAAQ,QAAA;MAAY,IAAA,EAAM;AAAS,KAAA;IAAM,OAAA,EAAS;MAAE,IAAA,EAAM,OAAA;MAAa,MAAA,EAAQ,OAAA;MAAa,IAAA,EAAM;AAAQ,KAAA;IAAO,KAAA,EAAO;MAAE,IAAA,EAAM,OAAA;MAAa,MAAA,EAAQ,OAAA;MAAa,IAAA,EAAM;AAAQ;AAAE,GAAA;EACxN,MAAA,EAAa;IAAE,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAQ,MAAA,EAAQ,QAAA;MAAY,IAAA,EAAM;AAAS,KAAA;IAAM,OAAA,EAAS;MAAE,IAAA,EAAM,OAAA;MAAa,MAAA,EAAQ,OAAA;MAAa,IAAA,EAAM;AAAQ,KAAA;IAAO,KAAA,EAAO;MAAE,IAAA,EAAM,OAAA;MAAa,MAAA,EAAQ,OAAA;MAAa,IAAA,EAAM;AAAQ;AAAE,GAAA;EACxN,GAAA,EAAa;IAAE,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAQ,MAAA,EAAQ,QAAA;MAAY,IAAA,EAAM;AAAM,KAAA;IAAS,OAAA,EAAS;MAAE,IAAA,EAAM,KAAA;MAAa,MAAA,EAAQ,KAAA;MAAa,IAAA,EAAM;AAAM,KAAA;IAAS,KAAA,EAAO;MAAE,IAAA,EAAM,KAAA;MAAa,MAAA,EAAQ,KAAA;MAAa,IAAA,EAAM;AAAM;AAAE,GAAA;EACtN,KAAA,EAAa;IAAE,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAQ,MAAA,EAAQ,QAAA;MAAY,IAAA,EAAM;AAAQ,KAAA;IAAO,OAAA,EAAS;MAAE,IAAA,EAAM,OAAA;MAAa,MAAA,EAAQ,OAAA;MAAa,IAAA,EAAM;AAAQ,KAAA;IAAO,KAAA,EAAO;MAAE,IAAA,EAAM,OAAA;MAAa,MAAA,EAAQ,OAAA;MAAa,IAAA,EAAM;AAAQ;AAAE,GAAA;EACxN,GAAA,EAAa;IAAE,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAQ,MAAA,EAAQ,QAAA;MAAY,IAAA,EAAM;AAAQ,KAAA;IAAO,OAAA,EAAS;MAAE,IAAA,EAAM,OAAA;MAAa,MAAA,EAAQ,OAAA;MAAa,IAAA,EAAM;AAAQ,KAAA;IAAO,KAAA,EAAO;MAAE,IAAA,EAAM,OAAA;MAAa,MAAA,EAAQ,OAAA;MAAa,IAAA,EAAM;AAAQ;AAAE,GAAA;EACxN,SAAA,EAAa;IAAE,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAQ,MAAA,EAAQ,QAAA;MAAY,IAAA,EAAM;AAAY,KAAA;IAAG,OAAA,EAAS;MAAE,IAAA,EAAM,WAAA;MAAa,MAAA,EAAQ,WAAA;MAAa,IAAA,EAAM;AAAY,KAAA;IAAG,KAAA,EAAO;MAAE,IAAA,EAAM,WAAA;MAAa,MAAA,EAAQ,WAAA;MAAa,IAAA,EAAM;AAAY;AAAE,GAAA;EAC5N,MAAA,EAAa;IAAE,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAQ,MAAA,EAAQ,QAAA;MAAY,IAAA,EAAM;AAAS,KAAA;IAAM,OAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAa,MAAA,EAAQ,QAAA;MAAa,IAAA,EAAM;AAAS,KAAA;IAAM,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAa,MAAA,EAAQ,QAAA;MAAa,IAAA,EAAM;AAAS;AAAE,GAAA;EAGzN,WAAA,EAAa;IAAE,KAAA,EAAO;MAAE,IAAA,EAAM,MAAA;MAAQ,MAAA,EAAQ,MAAA;MAAY,IAAA,EAAM;AAAO,KAAA;IAAQ,OAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAa,MAAA,EAAQ,QAAA;MAAa,IAAA,EAAM;AAAO,KAAA;IAAQ,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAa,MAAA,EAAQ,QAAA;MAAa,IAAA,EAAM;AAAO;AAAE,GAAA;EACvN,OAAA,EAAa;IAAE,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAQ,MAAA,EAAQ,QAAA;MAAY,IAAA,EAAM;AAAI,KAAA;IAAW,OAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAa,MAAA,EAAQ,QAAA;MAAa,IAAA,EAAM;AAAI,KAAA;IAAW,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAa,MAAA,EAAQ,QAAA;MAAa,IAAA,EAAM;AAAI;AAAE,GAAA;EACpN,SAAA,EAAa;IAAE,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAQ,MAAA,EAAQ,QAAA;MAAY,IAAA,EAAM;AAAI,KAAA;IAAW,OAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAa,MAAA,EAAQ,QAAA;MAAa,IAAA,EAAM;AAAI,KAAA;IAAW,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAa,MAAA,EAAQ,QAAA;MAAa,IAAA,EAAM;AAAI;AAAE,GAAA;EACpN,SAAA,EAAa;IAAE,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAQ,MAAA,EAAQ,QAAA;MAAY,IAAA,EAAM;AAAI,KAAA;IAAW,OAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAa,MAAA,EAAQ,QAAA;MAAa,IAAA,EAAM;AAAI,KAAA;IAAW,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAa,MAAA,EAAQ,QAAA;MAAa,IAAA,EAAM;AAAI;AAAE,GAAA;EACpN,UAAA,EAAa;IAAE,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAQ,MAAA,EAAQ,QAAA;MAAY,IAAA,EAAM;AAAI,KAAA;IAAW,OAAA,EAAS;MAAE,IAAA,EAAM,QAAA;MAAa,MAAA,EAAQ,QAAA;MAAa,IAAA,EAAM;AAAI,KAAA;IAAW,KAAA,EAAO;MAAE,IAAA,EAAM,QAAA;MAAa,MAAA,EAAQ,QAAA;MAAa,IAAA,EAAM;AAAI;AAAE;AACtN,CAAA;AAkBA,SAAgBC,EAAAA,CACd9wB,GAAAA,EACAe,GAAAA,GAAyD,EAAC,EACjD;AACT,EAAA,IAAM4vB,GAAAA,GAAW3F,GAAAA,CAAK,QAAA,IAAYyF,GAAAA,EAAe,EAC3CG,MAAS5F,GAAAA,CAAK,MAAA,IAAU,MAAA,EACxB+F,GAAAA,GAAQF,GAAAA,CAAUpF,GAAAA,GAClB/pB,GAAAA,GAAQqvB,GAAAA,GAAQA,GAAAA,CAAMJ,GAAAA,CAAAA,CAAUC,GAAAA,CAAAA,GAAUnF,GAAAA,CAAI,MAAA,KAAW,CAAA,GAAIA,GAAAA,CAAI,WAAA,EAAY,GAAIA,GAAAA;AACvF,EAAA,OAAOT,IAAK,QAAA,GAAW;IAAE,KAAA,EAAAvkB,GAAAA;IAAO,QAAA,EAAU;GAAK,GAAI,EAAE,OAAAA,GAAAA,EAAM;AAC7D;ACzKA,IAAMuqB,EAAAA,uBAAkB,GAAA,CAAI;AAAC,EAAA,QAAA;AAAK,EAAA,QAAA;AAAK,EAAA;AAAG,CAAC,CAAA;AAY3C,SAAgBC,GAAgBjxB,GAAAA,EAA2B;AAIzD,EAAA,OAHI0B,GAAAA,KAAU,QAAA,IAAO4uB,GAAAA,CAAgB,GAAA,CAAI5uB,GAAK,CAAA,GAAU,UAAA,GACpDsvB,EAAAA,CAAY,GAAA,CAAItvB,GAAK,CAAA,IACrBA,GAAAA,CAAM,MAAA,GAAS,IAAU,MAAA,GACtB,QAAA;AACT;AAmCA,SAAgBwvB,GAAO,EAAE,KAAA,EAAAnwB,GAAAA,EAAO,QAAA,EAAA4D,MAAW,KAAA,EAAO,OAAA,EAAA1D,GAAAA,GAAU,SAAA,EAAW,WAAAwF,GAAAA,EAAW,KAAA,EAAAkC,GAAAA,EAAO,IAAA,EAAAzH,KAAA,EAAqB;AAC5G,EAAA,IAAMiwB,MAAgBC,GAAAA,GAAO;IAAE,GAAGxK,GAAAA;IAAO,UAAA,EAAYwK;GAAK,GAAIxK,GAAAA;AAC9D,EAAA,uBACE5mB,IAAC,KAAA,EAAD;IACE,SAAA,EAAW,CAACkB,IAAE,GAAA,EAAKkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACtD,IAAA,WAAA,EAAW6rB,GAAgBvvB,GAAK,CAAA;IAChC,cAAA,EAAcgH,GAAAA,KAAY,YAAY,MAAA,GAAYA,GAAAA;AAClD,IAAA,eAAA,EAAe2oB,GAAAA,IAAY,MAAA;IAC3B,KAAA,EAAOF,GAAAA;IAEN,QAAA,EAAAzvB;GACE,CAAA;AAET;ACnCA,SAAgB4vB,EAAAA,CAAY,EAAE,IAAA,EAAArwB,GAAAA,EAAM,WAAAwF,GAAAA,GAAY,GAAA,EAAK,OAAA,EAAAkC,GAAAA,GAAU,SAAA,EAAW,IAAA,EAAAzH,GAAAA,EAAM,SAAA,EAAAjB,KAAA,EAA+B;AAC7G,EAAA,IAAI,CAACsxB,OAAQA,GAAAA,CAAK,MAAA,KAAW,GAC3B,uBAAOvxB,IAAC,MAAA,EAAD;IAAM,SAAA,EAAW,CAACkB,IAAE,SAAA,EAAWkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAAG,QAAA,EAAA;GAAO,CAAA;AAErF,EAAA,IAAMosB,GAAAA,GAAUD,GAAAA,CACb,GAAA,CAAA,CAAKvxB,KAAGe,GAAAA,MAAO;IAAE,CAAA,EAAAf,GAAAA;IAAG,CAAA,EAAAe;GAAE,CAAE,CAAA,CACxB,IAAA,CAAA,CAAMf,GAAAA,EAAGe,GAAAA,KAAAA,CACGkwB,GAAgBxqB,GAAAA,CAAE,CAAA,CAAE,KAAK,CAAA,KAAM,UAAA,GAAa,CAAA,GAAI,MAChDwqB,EAAAA,CAAgB1tB,GAAAA,CAAE,CAAA,CAAE,KAAK,CAAA,KAAM,UAAA,GAAa,IAAI,CAAA,CAAA,IACzCkD,GAAAA,CAAE,CAAA,GAAIlD,GAAAA,CAAE,CAC3B,CAAA,CACA,IAAA,CAAK,EAAE,CAAA,EAAAvD,GAAAA,EAAA,KAAQJ,GAAC,GACb6xB,GAAAA,GAASD,GAAAA,CAAQ,SAAA,CAAA,CAAWxxB,GAAAA,KAAMixB,EAAAA,CAAgBrxB,IAAE,KAAK,CAAA,KAAM,UAAU,CAAA,EACzE8xB,GAAAA,GAAU,CAAC,CAACC,GAAAA,IAAaF,GAAAA,GAAS,CAAA,IAAKA,GAAAA,GAASD,GAAAA,CAAQ,MAAA;AAC9D,EAAA,uBACExxB,IAAC,MAAA,EAAD;IAAM,SAAA,EAAW,CAACkB,IAAE,IAAA,EAAMkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC1D,IAAA,QAAA,EAAAosB,IAAQ,GAAA,CAAA,CAAKvwB,GAAAA,EAAGhB,GAAAA,qBACfc,IAAAA,CAAC+uB,UAAAA,EAAD,EAAA,QAAA,EAAA,CACG4B,GAAAA,IAAWzwB,GAAAA,KAAMwwB,GAAAA,mBAASzxB,IAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWkB,GAAAA,CAAE,GAAA;MAAM,QAAA,EAAAywB;AAAgB,KAAA,CAAA,GAAI,IAAA,kBACxE3xB,GAAAA,CAACkxB,EAAAA,EAAD;AAAQ,MAAA,KAAA,EAAOtxB,GAAAA,CAAE,KAAA;AAAO,MAAA,QAAA,EAAUA,IAAE,QAAA,IAAY,KAAA;MAAgB,OAAA,EAAA+I,GAAAA;MAAe,IAAA,EAAAzH;AAAO,KAAA,CAC9E,CAAA,EAAA,EAHKD,GAGL,CACX;GACG,CAAA;AAEV;AC3CA,SAAgB2wB,EAAAA,CACd5xB,GAAAA,EACAe,GAAAA,GAAgC,EAAC,EACD;AAChC,EAAA,IAAI,CAAC+E,GAAAA,EAAU;AACf,EAAA,IAAMkmB,MAAyB,EAAC;AAC5BlmB,EAAAA,GAAAA,CAAS,GAAA,IAAKkmB,GAAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA,EACvClmB,IAAS,KAAA,IAAOkmB,GAAAA,CAAK,IAAA,CAAKlmB,GAAAA,CAAS,UAAU,UAAA,GAAa;IAAE,IAAA,EAAM,OAAA;IAAS,QAAA,EAAU;AAAK,GAAA,GAAI,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA,EAC/GA,GAAAA,CAAS,GAAA,IAAKkmB,GAAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAC3C,EAAA,IAAM6F,GAAAA,GAAM,OAAO/rB,GAAAA,CAAS,GAAA,IAAQ,WAAWA,GAAAA,CAAS,GAAA,GAAMA,GAAAA,CAAS,GAAA,CAAI,CAAA,CAAA,EACrEyrB,GAAAA,GAAOb,GAAAA,CAAiB1E,KAAMhB,GAAI,CAAA;AACxC,EAAA,OAAO6G,GAAAA,KAAQ,SAAYN,GAAAA,GAAO,CAAC,GAAGA,GAAAA,EAAMT,EAAAA,CAAee,GAAAA,EAAK7G,GAAI,CAAC,CAAA;AACvE;ACOA,SAAgB8G,EAAAA,CAAY9xB,GAAAA,EAAUe,GAAAA,EAAe4D,GAAAA,EAAuB;AAC1E,EAAA,IAAMotB,OAASlwB,GAAAA,CAAE,CAAA,GAAIhB,GAAAA,CAAE,IAAA,KAASA,IAAE,IAAA,GAAOA,GAAAA,CAAE,IAAA,CAAA,EACrCmxB,GAAAA,GAAAA,CAASnwB,IAAE,CAAA,GAAIhB,GAAAA,CAAE,IAAA,KAASA,GAAAA,CAAE,OAAOA,GAAAA,CAAE,IAAA,CAAA;AAC3C,EAAA,OAAO;AACL,IAAA,CAAA,EAAGkxB,MAAQE,GAAAA,CAAK,KAAA;IAEhB,CAAA,EAAA,CAAI,CAAA,GAAID,OAASC,GAAAA,CAAK;AACxB,GAAA;AACF;AAGA,SAAgBC,EAAAA,CAAYlyB,GAAAA,EAAUe,GAAAA,EAAe4D,GAAAA,EAAuB;AAC1E,EAAA,IAAMotB,GAAAA,GAAQlwB,IAAE,CAAA,GAAIowB,GAAAA,CAAK,OACnBD,GAAAA,GAAQ,CAAA,GAAInwB,GAAAA,CAAE,CAAA,GAAIowB,GAAAA,CAAK,MAAA;AAC7B,EAAA,OAAO;AACL,IAAA,CAAA,EAAGpxB,GAAAA,CAAE,IAAA,GAAOkxB,GAAAA,IAASlxB,GAAAA,CAAE,OAAOA,GAAAA,CAAE,IAAA,CAAA;AAChC,IAAA,CAAA,EAAGA,GAAAA,CAAE,IAAA,GAAOmxB,GAAAA,IAASnxB,GAAAA,CAAE,OAAOA,GAAAA,CAAE,IAAA;AAClC,GAAA;AACF;ACpBA,IAAMsxB,EAAAA,GAAe,EAAA;AAGrB,SAAgBC,GAASpyB,GAAAA,EAAuB;AAC9C,EAAA,IAAMqyB,GAAAA,GAAe,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAMC,GAAK,CAAC,CAAA,EAC/CC,GAAAA,GAAOD,GAAAA,GAAQD,GAAAA;AAErB,EAAA,OAAA,CADaE,GAAAA,IAAQ,IAAI,CAAA,GAAIA,GAAAA,IAAQ,IAAI,CAAA,GAAIA,GAAAA,IAAQ,CAAA,GAAI,CAAA,GAAI,EAAA,IAC/CF,GAAAA;AAChB;AAGA,SAAgBG,GAAaxyB,GAAAA,EAAsB;AAEjD,EAAA,OADI,EAAE0K,GAAAA,GAAO,CAAA,CAAA,IAAM,CAAC,MAAA,CAAO,SAASA,GAAI,CAAA,GAAU,CAAA,GAC3C,IAAA,CAAK,GAAA,CAAIynB,EAAAA,EAAc,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAMznB,GAAI,CAAA,GAAI,IAAI,CAAC,CAAC,CAAA;AACjF;AAGA,SAAgB+nB,GAAazyB,GAAAA,EAAmC;AAC9D,EAAA,IAAI0yB,GAAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAW7yB,OAAK8yB,GAAAA,EAAQ;AACtB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS9yB,GAAC,CAAA,EAAG;AACzB,IAAA,IAAIwB,GAAAA,GAAI,CAAA;AACR,IAAA,OAAOA,GAAAA,GAAI8wB,MAAgB,IAAA,CAAK,GAAA,CAAI,OAAOtyB,GAAAA,CAAE,OAAA,CAAQwB,GAAC,CAAC,CAAA,GAAIxB,GAAC,CAAA,GAAI,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAIA,GAAC,CAAC,CAAA,IAAGG,GAAAA,EAAAA;AACjG,IAAAe,GAAAA,GAAO,IAAA,CAAK,GAAA,CAAI2xB,GAAAA,EAAMrxB,GAAC,CAAA;AACzB,EAAA;AACA,EAAA,OAAOqxB,GAAAA;AACT;AAOA,SAAgBE,EAAAA,CACd5yB,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACS;AACT,EAAA,IAAMkuB,GAAAA,GAAgB;AAAE,IAAA,MAAA,EAAQ,EAAC;IAAG,IAAA,EAAM,CAAA;IAAG,QAAA,EAAU;AAAE,GAAA,EACnDra,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAIuC,GAAAA,CAAM,CAAA,CAAA,EAAIA,GAAAA,CAAM,CAAA,CAAE,CAAA,EAChCtC,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAIsC,GAAAA,CAAM,CAAA,CAAA,EAAIA,GAAAA,CAAM,CAAA,CAAE,CAAA,EAChCrD,GAAAA,GAAOe,GAAAA,GAAKD,GAAAA,EACZ,EAAE,UAAA,EAAAtX,GAAAA,EAAY,KAAA,EAAAjB,GAAAA,GAAQ,GAAA,GAAM6yB,GAAAA;AAClC,EAAA,IAAI,EAAEpb,GAAAA,GAAO,CAAA,CAAA,IAAM,CAAC,OAAO,QAAA,CAASA,GAAI,CAAA,IAAK,EAAEqb,GAAAA,GAAS,CAAA,CAAA,IAAM,EAAEC,GAAAA,GAAa,IAAI,OAAOH,GAAAA;AAExF,EAAA,IAAMI,GAAAA,GAAavb,GAAAA,GAAOqb,GAAAA,EACpBroB,GAAAA,GAAO0nB,GAASY,GAAAA,GAAaC,GAAU,CAAA,EACvCC,GAAAA,GAAWV,GAAa9nB,GAAI,CAAA,EAC5B9G,GAAAA,GAAO4U,GAAAA,GAAK2a,MAAQF,GAAAA,EACpBG,GAAAA,GAAK3a,GAAAA,GAAK0a,GAAAA,GAAQF,KAGlB/Y,GAAAA,GAAQ,IAAA,CAAK,IAAA,CAAKtW,GAAAA,GAAO8G,MAAO,IAAI,CAAA,EACpCuP,GAAAA,GAAO,IAAA,CAAK,MAAMmZ,GAAAA,GAAK1oB,GAAAA,GAAO,IAAI,CAAA,EAClCioB,MAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS1xB,GAAAA,GAAIiZ,GAAAA,EAAOjZ,GAAAA,IAAKgZ,GAAAA,EAAMja,OAAKH,GAAAA,CAAO,IAAA,CAAK,MAAA,CAAA,CAAQoB,MAAIyJ,GAAAA,EAAM,OAAA,CAAQwoB,GAAQ,CAAC,IAAI,CAAC,CAAA;AACxF,EAAA,OAAO;IAAE,MAAA,EAAArzB,GAAAA;IAAQ,IAAA,EAAAuB,GAAAA;IAAM,QAAA,EAAAC;AAAS,GAAA;AAClC;AAIA,SAAgBgyB,EAAAA,CAAWrzB,KAAee,GAAAA,EAA4B;AACpE,EAAA,IAAMuyB,GAAAA,GAAOC,GAAAA,CAAM,OAAA,CAAQ9rB,GAAAA,CAAI,QAAQ,CAAA;AACvC,EAAA,OAAO,cAAc,IAAA,CAAK6rB,GAAI,IAAIA,GAAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAIA,GAAAA;AACpD;;;;;;;;;ICwBME,EAAAA,GAAwC;EAAE,CAAA,EAAG,EAAA;EAAI,CAAA,EAAG;AAAG,CAAA;IACvDC,EAAAA,GAAsC;EAAE,CAAA,EAAG,EAAA;EAAI,CAAA,EAAG;AAAE,CAAA;IACpDC,EAAAA,GAAe,CAAA;AASrB,SAASC,EAAAA,CACP3zB,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACAH,KACAvD,GAAAA,EACgB;AAChB,EAAA,IAAI0xB,GAAAA,EACAlrB,GAAAA;AACJ,EAAA,IAAImsB,IAAS,MAAA,EAAQ;AACnB,IAAA,IAAMpb,GAAAA,GAAK,KAAK,GAAA,CAAIuC,GAAAA,CAAM,CAAA,CAAA,EAAIA,GAAAA,CAAM,CAAA,CAAE,CAAA,EAChCtC,GAAAA,GAAK,KAAK,GAAA,CAAIsC,GAAAA,CAAM,CAAA,CAAA,EAAIA,GAAAA,CAAM,CAAA,CAAE,CAAA,EAChCzJ,GAAAA,GAAAA,CAAOmH,GAAAA,GAAKD,GAAAA,IAAM,IAAA;AACxB,IAAA/R,GAAAA,GAASmtB,GAAAA,CAAS,MAAA,CAAO,MAAA,CAAA,CAAQ5zB,GAAAA,KAAMH,GAAAA,IAAK2Y,GAAAA,GAAKlH,GAAAA,IAAOzR,GAAAA,IAAK4Y,GAAAA,GAAKnH,GAAG,CAAA;AACrE,IAAA,IAAMuiB,GAAAA,GAAOlB,GAAAA,CAAO,KAAA,CAAM,CAAC,EAAE,GAAA,CAAA,CAAK3yB,GAAAA,EAAGe,GAAAA,KAAMlB,MAAI8yB,GAAAA,CAAO1xB,GAAAA,CAAE,CAAA,EAClD6yB,MAAOD,GAAAA,CAAK,MAAA,GAAS,CAAA,IAAKA,GAAAA,CAAK,MAAA,CAAO7zB,GAAAA,KAAM,IAAA,CAAK,GAAA,CAAI+T,MAAI8f,GAAAA,CAAK,CAAA,CAAE,CAAA,IAAK,KAAK,GAAA,CAAIA,GAAAA,CAAK,CAAA,CAAE,IAAI,IAAI,CAAA;AACnG,IAAAlrB,GAAAA,GAAM;AAAE,MAAA,QAAA,EAAU8pB,GAAaE,GAAM,CAAA;MAAG,IAAA,EAAMmB,GAAAA,GAAOD,GAAAA,CAAK,CAAA,CAAA,GAAK;AAAE,KAAA;EACnE,CAAA,MAAO;AACL,IAAA,IAAME,GAAAA,GAAMnB,EAAAA,CAAU7X,GAAAA,EAAOgY,GAAAA,EAAQ;MACnC,UAAA,EAAYa,GAAAA,CAAS,UAAA,IAAcJ,EAAAA,CAAgBQ,GAAAA,CAAAA;MACnD,KAAA,EAAOJ,GAAAA,CAAS,KAAA,IAASH,EAAAA,CAAcO,GAAAA;KACxC,CAAA;AACD,IAAAvtB,GAAAA,GAASstB,GAAAA,CAAI,MAAA,EACbprB,GAAAA,GAAM;AAAE,MAAA,QAAA,EAAUorB,GAAAA,CAAI,QAAA;AAAU,MAAA,IAAA,EAAMA,GAAAA,CAAI;AAAK,KAAA;AACjD,EAAA;AACA,EAAA,IAAME,GAAAA,GAASL,IAAS,MAAA,IAAUP,EAAAA;AAClC,EAAA,OAAOV,GAAAA,CAAO,GAAA,CAAA,CAAK3yB,GAAAA,MAAW;IAAE,KAAA,EAAAA,GAAAA;AAAO,IAAA,EAAA,EAAIk0B,IAAOX,GAAK,CAAA;IAAG,KAAA,EAAOU,GAAAA,CAAOV,KAAO9rB,GAAG;GAAE,CAAE,CAAA;AACxF;AAOA,IAAa0sB,EAAAA,GAASpQ,UAAAA,CAAsC,SAAgBvf,GAAAA,EAAO3C,GAAAA,EAAK;AACtF,EAAA,IAAM,EACJ,OAAAhB,GAAAA,EAAO,MAAA,EAAAkE,KACP,MAAA,EAAAgP,GAAAA,GAAS,CAAC,CAAA,EAAG,CAAC,CAAA,EACd,QAAAiK,GAAAA,GAAS,CAAC,GAAG,CAAC,CAAA,EACd,MAAAne,GAAAA,EACA,IAAA,EAAA0D,GAAAA,EACA,MAAA,EAAA2C,GAAAA,EACA,MAAA,EAAAmL,KACA,QAAA,EAAA2S,GAAAA,EACA,MAAAC,GAAAA,GAAO,KAAA,EACP,WAAAC,GAAAA,EACA,KAAA,EAAAC,GAAAA,EACA,aAAA,EAAAvkB,GAAAA,EACA,SAAA,EAAAqW,KACA,QAAA,EAAAwB,GAAAA,KACE/S,GAAAA,EAEE0vB,GAAAA,GAAS1qB,OAA6B,IAAI,CAAA,EAE1C2qB,GAAAA,GAAyBhG,OAAAA,CAAAA,OACtB;AAAE,IAAA,IAAA,EAAMiG,IAAO,CAAA,CAAA;AAAI,IAAA,IAAA,EAAMA,IAAO,CAAA,CAAA;AAAI,IAAA,IAAA,EAAMC,IAAO,CAAA,CAAA;AAAI,IAAA,IAAA,EAAMA,IAAO,CAAA;AAAG,GAAA,CAAA,EAC5E,CAACD,GAAAA,EAAQC,GAAM,CACjB,CAAA,EAEMC,GAAAA,GAAWnG,QAAAA,OAAe;IAAE,KAAA,EAAAxtB,GAAAA;IAAO,MAAA,EAAAkE;GAAO,CAAA,EAAI,CAAC0vB,KAAOC,GAAM,CAAC,GAE7DC,GAAAA,GAAerJ,WAAAA,CAAAA,CAAatrB,GAAAA,KAAmD;AACnF,IAAA,IAAM40B,GAAAA,GAAOR,GAAAA,CAAO,OAAA,EAAS,qBAAA,EAAsB,EAC7C7c,GAAAA,GAAOqd,GAAAA,EAAM,IAAA,IAAQ,CAAA,EACrBlmB,GAAAA,GAAMkmB,GAAAA,EAAM,GAAA,IAAO,CAAA;AACzB,IAAA,OAAO;AAAE,MAAA,CAAA,EAAG50B,IAAE,OAAA,GAAUuX,GAAAA;AAAM,MAAA,CAAA,EAAGvX,IAAE,OAAA,GAAU0O;AAAI,KAAA;AACnD,EAAA,CAAA,EAAG,EAAE,CAAA;AAELmmB,EAAAA,SAAAA,CAAAA,OACE10B,CAAAA,CAAK,QAAA,EAAU,OAAA,EAAS;IAAE,KAAA,EAAAU,GAAAA;IAAO,MAAA,EAAAkE;GAAQ,CAAA,EAAA,MAC5B5E,CAAAA,CAAK,QAAA,EAAU,SAAS,CAAA,CAAA,EAGpC,EAAE,CAAA,EACL20B,mBAAAA,CAAoB3rB,GAAAA,EAAAA,OAAY;AAC9B,IAAA,IAAI,GAAA,GAAM;AAAE,MAAA,OAAOirB,GAAAA,CAAO,OAAA;AAAS,IAAA,CAAA;AACnC,IAAA,WAAA,EAAA,CAAcp0B,GAAAA,KAAckyB,EAAAA,CAAY/gB,GAAAA,EAAIkjB,KAAYG,GAAQ,CAAA;AAChE,IAAA,WAAA,EAAA,CAAcx0B,GAAAA,KAAc8xB,EAAAA,CAAY3gB,GAAAA,EAAIkjB,KAAYG,GAAQ,CAAA;IAChE,YAAA,EAAAhQ,GAAAA;AACA,IAAA,aAAA,EAAA,CAAgBxkB,GAAAA,KAAMkyB,EAAAA,CAAYyC,IAAa30B,GAAC,CAAA,EAAGq0B,KAAYG,GAAQ,CAAA;AACvE,IAAA,IAAI,KAAA,GAAQ;AAAE,MAAA,OAAOA,GAAAA,CAAS,KAAA;AAAO,IAAA,CAAA;AACrC,IAAA,IAAI,MAAA,GAAS;AAAE,MAAA,OAAOA,GAAAA,CAAS,MAAA;AAAQ,IAAA;GACzC,CAAA,EAAI;AAACH,IAAAA,GAAAA;AAAYG,IAAAA,GAAAA;AAAUG,IAAAA;GAAa,CAAA;AAExC,EAAA,IAAMI,EAAAA,GAAoBzJ,WAAAA,CAAAA,CAAatrB,GAAAA,KAAwC;AAC7E,IAAA,IAAI,CAACg1B,GAAAA,EAAe;AACpB,IAAA,IAAM/C,GAAAA,GAAO0C,IAAa30B,GAAC,CAAA,EACrBi1B,MAAQ/C,EAAAA,CAAYD,GAAAA,EAAMoC,KAAYG,GAAQ,CAAA;AACpD,IAAA50B,IAAcI,GAAAA,EAAG;MAAE,IAAA,EAAAe,GAAAA;MAAM,KAAA,EAAA4D;KAAO,CAAA;EAClC,CAAA,EAAG;AAACqwB,IAAAA,GAAAA;AAAeL,IAAAA,GAAAA;AAAcN,IAAAA,GAAAA;AAAYG,IAAAA;GAAS,CAAA,EAEhDU,EAAAA,GAAYC,GAAAA,GACdxB,EAAAA,CAAawB,GAAAA,EAAQ,KAAKb,GAAAA,EAAQG,GAAAA,EAAAA,CAAQz0B,GAAAA,KAAM8xB,EAAAA,CAAY;IAAE,CAAA,EAAGjyB,GAAAA;AAAG,IAAA,CAAA,EAAG00B,IAAO,CAAA;AAAG,GAAA,EAAGF,KAAYG,GAAQ,CAAA,CAAE,CAAC,CAAA,GAC3G,EAAC,EACCY,EAAAA,GAAYC,GAAAA,GACd1B,EAAAA,CAAa0B,KAAQ,GAAA,EAAKd,GAAAA,EAAQG,GAAAA,EAAAA,CAAS10B,QAAM8xB,EAAAA,CAAY;AAAE,IAAA,CAAA,EAAGwC,IAAO,CAAA,CAAA;IAAI,CAAA,EAAGz0B;AAAE,GAAA,EAAGw0B,KAAYG,GAAQ,CAAA,CAAE,CAAC,CAAA,GAC5G,EAAC,EAICc,EAAAA,GAAU,CAAC,CAACD,QAAWA,GAAAA,CAAO,MAAA,IAAU,QAAA,MAAc,QAAA,EACtDE,KAAa7rB,MAAAA,CAA2B,IAAI,CAAA,EAC5C,CAAC8rB,IAAaC,EAAAA,CAAAA,GAAkBvxB,QAAAA,CAAS,CAAC,GAC1CwxB,EAAAA,GAAYJ,EAAAA,GAAUF,EAAAA,CAAU,GAAA,CAAA,CAAKp1B,GAAAA,KAAMe,GAAAA,CAAE,KAAK,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GAAI,EAAA;AACvE,EAAAG,gBAAA,MAAsB;AACpB,IAAA,IAAI,CAACo0B,EAAAA,EAAS;AACd,IAAA,IAAMK,MAAAA,MAAsB;AAC1B,MAAA,IAAIC,GAAAA,GAAS,CAAA;AACb,MAAA,KAAA,IAAW3sB,OAAMssB,EAAAA,CAAW,OAAA,EAAS,iBAAiB,MAAM,CAAA,IAAK,EAAC,EAC5D,OAAOtsB,GAAAA,CAAG,qBAAA,IAA0B,eAAYjJ,GAAAA,GAAS,IAAA,CAAK,IAAI41B,GAAAA,EAAQ3sB,GAAAA,CAAG,uBAAuB,CAAA,CAAA;AAE1G,MAAA4sB,GAAA,CAAgB90B,GAAAA,KAAUmK,GAAAA,KAAS0qB,GAAAA,GAAS1qB,MAAO0qB,GAAO,CAAA;AAC5D,IAAA,CAAA;AACA,IAAA51B,GAAAA,EAAQ;AACR,IAAA,IAAI81B,GAAAA,GAAO,IAAA;AAGX,IAAA,OADA,QAAA,CAAS,KAAA,EAAO,KAAA,CAAM,IAAA,CAAA,MAAW;AAAMA,MAAAA,OAAMH,GAAAA,EAAQ;AAAG,IAAA,CAAC,GAAA,MAC5C;AAAE,MAAA50B,GAAAA,GAAO,KAAA;AAAO,IAAA,CAAA;EAC/B,CAAA,EAAG,CAACu0B,EAAAA,EAASI,EAAS,CAAC,CAAA;AAEvB,EAAA,IAAM9uB,KAAM,CAAC1F,EAAAA,CAAE,IAAA,EAAMkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAElD2wB,EAAAA,GAAAA,CAAmB/1B,GAAAA,EAAY2E,KAAsBH,GAAAA,KACrD,CAACovB,GAAAA,IAAYA,GAAAA,CAAS,UAAU,KAAA,IAASoC,GAAAA,CAAK,MAAA,KAAW,CAAA,GAAU,uBAErEj1B,GAAAA,CAAC,GAAA,EAAD,EAAA,UACGi1B,GAAAA,CAAK,GAAA,CAAA,CAAKrxB,GAAAA,qBACT5D,IAAC,MAAA,EAAD;IAEE,mBAAA,EAAkB,MAAA;IAClB,WAAA,EAAWizB,GAAAA;AACX,IAAA,SAAA,EAAW9yB,EAAAA,CAAE,IAAA;AACb,IAAA,GAAK8yB,QAAS,GAAA,GACV;AAAE,MAAA,EAAA,EAAIjzB,GAAAA,CAAE,EAAA;AAAI,MAAA,EAAA,EAAIA,GAAAA,CAAE,EAAA;MAAI,EAAA,EAAI,CAAA;MAAG,EAAA,EAAI2zB;KAAO,GACxC;MAAE,EAAA,EAAI,CAAA;MAAG,EAAA,EAAID,GAAAA;AAAO,MAAA,EAAA,EAAI1zB,GAAAA,CAAE,EAAA;AAAI,MAAA,EAAA,EAAIA,GAAAA,CAAE;AAAG;AAC5C,GAAA,EAPM,CAAA,CAAA,EAAIizB,GAAAA,CAAAA,CAAAA,EAAQjzB,GAAAA,CAAE,KAAA,CAAA,CAOpB,CACF,CAAA,EACA,CAAA,EAIDk1B,EAAAA,GAAAA,CAAoBj2B,GAAAA,EAAY2E,KAAsBH,GAAAA,KAAsD;AAChH,IAAA,IAAI,CAACovB,GAAAA,IAAYoC,GAAAA,CAAK,MAAA,KAAW,GAAG,OAAO,IAAA;AAC3C,IAAA,IAAME,GAAAA,GAAYtC,IAAS,MAAA,IAAU,QAAA;AACrC,IAAA,IAAIsC,GAAAA,KAAc,OAAO,OAAO,IAAA;AAChC,IAAA,IAAMC,MAAUD,GAAAA,KAAc,SAAA,EACxBE,GAAAA,GAAMxC,GAAAA,CAAS,OAAOF,EAAAA,EACxB2C,GAAAA;AAYJ,IAAA,OAJEA,GAAAA,GAPErC,GAAAA,KAAS,GAAA,GACHmC,GAAAA,GACJ;AAAE,MAAA,CAAA,EAAG,CAACC,GAAAA;MAAK,UAAA,EAAY,KAAA;MAAO,gBAAA,EAAkB;AAAU,KAAA,GAC1DZ,KAAc,CAAA,GACZ;AAAE,MAAA,CAAA,EAAGY,GAAAA,GAAMZ,EAAAA;MAAa,UAAA,EAAY,KAAA;MAAO,gBAAA,EAAkB;KAAU,GACvE;MAAE,CAAA,EAAGY,GAAAA;MAAK,UAAA,EAAY,OAAA;MAAS,gBAAA,EAAkB;AAAU,KAAA,GAEzDD,GAAAA,GACJ;AAAE,MAAA,CAAA,EAAGzB,GAAAA,GAAS0B,GAAAA;MAAK,UAAA,EAAY,QAAA;MAAU,gBAAA,EAAkB;KAAU,GACrE;AAAE,MAAA,CAAA,EAAG1B,GAAAA,GAAS0B,GAAAA;MAAK,UAAA,EAAY;KAAS,kBAG5Cr1B,IAAC,GAAA,EAAD;MAAG,GAAA,EAAKizB,GAAAA,KAAS,MAAMuB,EAAAA,GAAa,MAAA;AAAW,MAAA,SAAA,EAAWr0B,EAAAA,CAAE,UAAA;MAAY,aAAA,EAAY,MAAA;AACjF,MAAA,QAAA,EAAA80B,IAAK,GAAA,CAAA,CAAKrxB,GAAAA,qBACT5D,IAAC,MAAA,EAAD;QAEE,mBAAA,EAAkB,YAAA;QAClB,WAAA,EAAWizB,GAAAA;QACX,gBAAA,EAAgBkC,GAAAA;AAChB,QAAA,SAAA,EAAWh1B,EAAAA,CAAE,SAAA;AACb,QAAA,CAAA,EAAG8yB,GAAAA,KAAS,GAAA,GAAMjzB,GAAAA,CAAE,EAAA,GAAKs1B,GAAAA,CAAM,CAAA;AAC/B,QAAA,CAAA,EAAGrC,GAAAA,KAAS,GAAA,GAAMjzB,GAAAA,CAAE,EAAA,GAAKs1B,GAAAA,CAAM,CAAA;AAC/B,QAAA,UAAA,EAAYA,GAAAA,CAAM,UAAA;AAClB,QAAA,gBAAA,EAAkBA,GAAAA,CAAM,gBAAA;AAEvB,QAAA,QAAA,EAAAt1B,GAAAA,CAAE;AACC,OAAA,EAXC,IAAIizB,GAAAA,CAAAA,CAAAA,EAAQjzB,GAAAA,CAAE,KAAA,EAWf,CACP;KACA,CAAA;AAEP,EAAA,CAAA;AAEA,EAAA,uBACE4D,KAAC,KAAA,EAAD;IACE,GAAA,EAAKyvB,GAAAA;IACL,SAAA,EAAWxtB,EAAAA;IACJ,KAAA,EAAAud,GAAAA;IACA,KAAA,EAAAtjB,GAAAA;IACC,MAAA,EAAAkE,GAAAA;IACR,OAAA,EAAS,CAAA,IAAA,EAAO0vB,GAAAA,CAAAA,CAAAA,EAASC,GAAAA,CAAAA,CAAAA;IACnB,IAAA,EAAAzQ,GAAAA;AACN,IAAA,YAAA,EAAYvf,IAAM,YAAA,CAAA;IACR,QAAA,EAAAsf,GAAAA;AACV,IAAA,aAAA,EAAegR,MAAgBD,EAAAA,GAAoB,MAAA;IACxC,SAAA,EAAA9e,GAAAA;IAXb,QAAA,EAAA;AAaGqgB,MAAAA,GAAAA,IAAAA,CAAAA,MAAe;AACd,QAAA,IAAMC,GAAAA,GAAYD,IAAK,SAAA,IAAa,CAAA,EAC9BE,MAASF,GAAAA,CAAK,KAAA,EAGdG,MAAsB,EAAC;AAC7B,QAAA,KAAA,IAASx1B,GAAAA,GAAI,CAAA,EAAGA,GAAAA,IAAKs1B,GAAAA,EAAWx1B,GAAAA,EAAAA,EAAKE,GAAAA,CAAU,IAAA,CAAKA,GAAAA,IAAKs1B,GAAAA,GAAY,CAAA,CAAE,CAAA;AACvE,QAAA,uBACE5xB,IAAAA,CAAC,GAAA,EAAD,EAAA,QAAA,EAAA,CACG8xB,GAAAA,CAAU,GAAA,CAAA,CAAKz2B,GAAAA,qBACde,GAAAA,CAAC,MAAA,EAAD;UAEE,mBAAA,EAAkB,MAAA;AAClB,UAAA,SAAA,EAAWG,EAAAA,CAAE,IAAA;UACL,MAAA,EAAAsD,GAAAA;AACR,UAAA,EAAA,EAAIM,GAAAA,GAAI2vB,GAAAA;AAAO,UAAA,EAAA,EAAI3vB,GAAAA,GAAI2vB,GAAAA;UACvB,EAAA,EAAI,CAAA;UAAG,EAAA,EAAIC;SACZ,EANM,CAAA,GAAA,EAAM5vB,GAAAA,CAAAA,CAMZ,CACF,CAAA,EACA2xB,GAAAA,CAAU,GAAA,CAAA,CAAKz2B,GAAAA,qBACde,GAAAA,CAAC,MAAA,EAAD;UAEE,mBAAA,EAAkB,MAAA;AAClB,UAAA,SAAA,EAAWG,EAAAA,CAAE,IAAA;UACL,MAAA,EAAAsD,GAAAA;UACR,EAAA,EAAI,CAAA;UAAG,EAAA,EAAIiwB,GAAAA;AACX,UAAA,EAAA,EAAI3vB,GAAAA,GAAI4vB,GAAAA;AAAQ,UAAA,EAAA,EAAI5vB,GAAAA,GAAI4vB;AACzB,SAAA,EANM,MAAM5vB,GAAAA,CAAAA,CAMZ,CACF,CACA,GAAA,CAAA;MAEP,CAAA,GAAG;MACFixB,EAAAA,CAAgB,GAAA,EAAKb,IAAWC,GAAM,CAAA;MACtCY,EAAAA,CAAgB,GAAA,EAAKX,IAAWC,GAAM,CAAA;MACtCqB,GAAAA,KAAS,KAAA,IAASA,GAAAA,KAAS,IAAA,IAAA,CAAA,MAAe;AACzC,QAAA,IAAMF,MAASE,GAAAA,EAAM,KAAA;AACrB,QAAA,uBACE/xB,KAAC,GAAA,EAAD,EAAA,UAAA,iBACE5D,IAAC,MAAA,EAAD;UACE,mBAAA,EAAkB,MAAA;AAClB,UAAA,SAAA,EAAWG,EAAAA,CAAE,IAAA;UACL,MAAA,EAAAlB,GAAAA;UACR,EAAA,EAAI,CAAA;UAAG,EAAA,EAAIy0B,GAAAA;UACX,EAAA,EAAIC,GAAAA;UAAQ,EAAA,EAAIA;SACjB,CAAA,kBACD3zB,GAAAA,CAAC,MAAA,EAAD;UACE,mBAAA,EAAkB,MAAA;AAClB,UAAA,SAAA,EAAWG,EAAAA,CAAE,IAAA;UACL,MAAA,EAAAlB,GAAAA;UACR,EAAA,EAAI,CAAA;UAAG,EAAA,EAAI,CAAA;UACX,EAAA,EAAI,CAAA;UAAG,EAAA,EAAI00B;SACZ,CACA,GAAA,CAAA;MAEP,CAAA,GAAG;MACFuB,EAAAA,CAAiB,GAAA,EAAKf,IAAWC,GAAM,CAAA;MACvCc,EAAAA,CAAiB,GAAA,EAAKb,IAAWC,GAAM,CAAA;AACvC9vB,MAAAA;AACE;;AAET,CAAC;;;AC7XD,SAAgBoxB,GAAAA,CAAc32B,GAAAA,EAAee,GAAAA,EAA+B4D,GAAAA,EAA2B;AACrG,EAAA,IAAIiyB,GAAAA,GAAOrD,KACPsD,GAAAA,GAAWC,GAAAA;AACf,EAAA,KAAA,IAAW72B,OAAK82B,GAAAA,EAAY;AAC1B,IAAA,IAAM11B,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAIpB,GAAAA,GAAIszB,GAAK,CAAA;AACxBlyB,IAAAA,GAAAA,IAAKw1B,GAAAA,KACPryB,GAAAA,GAAOvE,GAAAA,EACPgB,GAAAA,GAAWI,GAAAA,CAAAA;AAEf,EAAA;AACA,EAAA,OAAOu1B,GAAAA;AACT;ACHA,SAAgBI,EAAAA,CACdh3B,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EAC0B;AAC1B,EAAA,IAAMsyB,GAAAA,GAAKC,GAAAA,GAASA,GAAAA,EAChBN,GAAAA,GAA6C,IAAA;AACjD,EAAA,KAAA,IAAS31B,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI0U,GAAAA,CAAQ,QAAQhR,GAAAA,EAAAA,EAAK;AACvC,IAAA,IAAM8B,MAAIkP,GAAAA,CAAQ1U,GAAAA,CAAAA,EACZyO,GAAAA,GAAKjJ,IAAE,CAAA,GAAI0wB,GAAAA,CAAQ,CAAA,EACnBxnB,GAAAA,GAAKlJ,IAAE,CAAA,GAAI0wB,GAAAA,CAAQ,GACnBC,GAAAA,GAAK1nB,GAAAA,GAAKA,MAAKC,GAAAA,GAAKA,GAAAA;AACtBynB,IAAAA,MAAKH,GAAAA,IAAAA,CACLL,GAAAA,KAAS,QAAQQ,GAAAA,GAAKR,GAAAA,CAAK,QAAI31B,GAAAA,GAAO;MAAE,KAAA,EAAOA,GAAAA;MAAG,EAAA,EAAAhB;AAAG,KAAA,CAAA;AAC3D,EAAA;AACA,EAAA,OAAO22B,GAAAA,GAAO,EAAE,KAAA,EAAOA,GAAAA,CAAK,OAAM,GAAI,IAAA;AACxC;AAYA,SAAgBS,EAAAA,CACdr3B,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACsC;AACtC,EAAA,IAAMsyB,GAAAA,GAAKC,GAAAA,GAASA,GAAAA,EAChBN,GAAAA,GAAyD,IAAA;AAC7D,EAAA,KAAA,IAASnmB,GAAAA,GAAS,CAAA,EAAGA,GAAAA,GAASH,GAAAA,CAAS,QAAQ3L,GAAAA,EAAAA,EAAU;AACvD,IAAA,IAAM2yB,GAAAA,GAAUhnB,IAASG,GAAAA,CAAAA;AACzB,IAAA,IAAI6mB,GAAAA,CAAQ,SAAS,CAAA,EAAG;AACxB,IAAA,IAAMrd,GAAAA,GAAOqd,IAAQ,MAAA,GAAS,CAAA;AAC9B,IAAA,KAAA,IAASr2B,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIgZ,GAAAA,EAAMja,GAAAA,EAAAA,EAAK;AAC7B,MAAA,IAAMyG,MAAI6wB,GAAAA,CAAQr2B,GAAAA,GACZsC,GAAAA,GAAI+zB,GAAAA,CAAQr2B,MAAI,CAAA,CAAA,EAChBs2B,GAAAA,GAAMh0B,GAAAA,CAAE,IAAIkD,GAAAA,CAAE,CAAA,EACd+wB,MAAMj0B,GAAAA,CAAE,CAAA,GAAIkD,IAAE,CAAA,EACdgxB,GAAAA,GAAMN,GAAAA,CAAQ,CAAA,GAAI1wB,IAAE,CAAA,EACpBixB,GAAAA,GAAMP,IAAQ,CAAA,GAAI1wB,GAAAA,CAAE,GACpBkxB,GAAAA,GAAMJ,GAAAA,GAAMA,MAAMC,GAAAA,GAAMA,GAAAA,EAC1Bp2B,MAAIu2B,GAAAA,GAAM,CAAA,GAAA,CAAKF,MAAMF,GAAAA,GAAMG,GAAAA,GAAMF,OAAOG,GAAAA,GAAM,CAAA;AAC9Cv2B,MAAAA,MAAI,CAAA,GAAGP,GAAAA,GAAI,CAAA,GACNO,GAAAA,GAAI,MAAGP,GAAAA,GAAI,CAAA,CAAA;AACpB,MAAA,IAAMwO,GAAAA,GAAK5I,IAAE,CAAA,GAAIrF,GAAAA,GAAIm2B,KACfjoB,GAAAA,GAAK7I,GAAAA,CAAE,IAAIrF,GAAAA,GAAIo2B,GAAAA,EACf9nB,MAAKL,GAAAA,GAAK8nB,GAAAA,CAAQ,GAClBxnB,GAAAA,GAAKL,GAAAA,GAAK6nB,IAAQ,CAAA,EAClBC,GAAAA,GAAK1nB,GAAAA,GAAKA,GAAAA,GAAKC,GAAAA,GAAKA,GAAAA;AAC1B,MAAA,IAAIynB,MAAKH,GAAAA,EAAI;AACb,MAAA,IAAMl2B,GAAAA,GAAAA,CAAKE,MAAIG,GAAAA,IAAK6Y,GAAAA;AACpB,MAAA,CAAI2c,GAAAA,KAAS,IAAA,IAAQQ,GAAAA,GAAKR,GAAAA,CAAK,QAAI31B,GAAAA,GAAO;QAAE,MAAA,EAAA0D,GAAAA;QAAQ,CAAA,EAAApB,GAAAA;QAAG,EAAA,EAAA0C;AAAG,OAAA,CAAA;AAC5D,IAAA;AACF,EAAA;AACA,EAAA,OAAO2wB,GAAAA,GAAO;AAAE,IAAA,MAAA,EAAQA,GAAAA,CAAK,MAAA;AAAQ,IAAA,CAAA,EAAGA,GAAAA,CAAK;GAAE,GAAI,IAAA;AACrD;ACnDA,SAAgBgB,EAAAA,CAAW53B,KAAwBe,GAAAA,EAAkC;AACnF,EAAA,OAAO82B,OAAAA,CAAQC,KAAOzzB,GAAQ,CAAA;AAChC;AAGA,SAAgB0zB,EAAAA,CAAW/3B,KAAwBe,GAAAA,EAAkC;AACnF,EAAA,OAAO62B,EAAAA,CAAWE,GAAAA,EAAOzzB,GAAQ,CAAA,GAAI,CAAA;AACvC;;;;;;;;;;;;;;;;;IC2DM2zB,EAAAA,GAA+B;EAAE,KAAA,EAAO,KAAA;EAAO,GAAA,EAAK,KAAA;EAAO,IAAA,EAAM,KAAA;EAAO,IAAA,EAAM;AAAM,CAAA;AAE1F,SAASC,GAAcj4B,GAAAA,EAA0F;AAC/G,EAAA,OAAO;AACL,IAAA,KAAA,EAAOA,GAAAA,CAAE,QAAA;AACT,IAAA,GAAA,EAAKA,GAAAA,CAAE,MAAA;AACP,IAAA,IAAA,EAAMA,GAAAA,CAAE,OAAA;AACR,IAAA,IAAA,EAAMA,GAAAA,CAAE;AACV,GAAA;AACF;AAYA,SAAgBk4B,GAAmBj3B,GAAAA,EAAgC;AACjE,EAAA,IAAM,EACJ,QAAAwF,GAAAA,EAAQ,aAAA,EAAAvF,KAAe,aAAA,EAAAjB,GAAAA,EACvB,OAAA8T,GAAAA,EAAO,MAAA,EAAAiK,KACP,MAAA,EAAAne,GAAAA,GAAS,CAAC,CAAA,EAAG,CAAC,GAAG,MAAA,EAAAoG,GAAAA,GAAS,CAAC,CAAA,EAAG,CAAC,GAC/B,IAAA,EAAA1C,GAAAA,EAAM,MAAA2C,GAAAA,EAAM,MAAA,EAAA8d,KAAQ,MAAA,EAAAC,GAAAA,EACpB,WAAAC,GAAAA,EAAW,KAAA,EAAAC,KAAO,QAAA,EAAAvkB,GAAAA,KAChB8E,GAAAA,EAEEyzB,GAAAA,GAAiBzzB,IAAM,OAAA,KAAY,KAAA,EAEnC2vB,GAAAA,GAAyBhG,OAAAA,CAAAA,OACtB;AAAE,IAAA,IAAA,EAAMiG,IAAO,CAAA,CAAA;AAAI,IAAA,IAAA,EAAMA,IAAO,CAAA,CAAA;AAAI,IAAA,IAAA,EAAMC,IAAO,CAAA,CAAA;AAAI,IAAA,IAAA,EAAMA,IAAO,CAAA;AAAG,GAAA,CAAA,EAC5E,CAACD,GAAAA,EAAQC,GAAM,CACjB,CAAA,EACMC,GAAAA,GAAWnG,QAAAA,OAAe;IAAE,KAAA,EAAAta,GAAAA;IAAO,MAAA,EAAAiK;AAAO,GAAA,CAAA,EAAI,CAACyW,GAAAA,EAAOC,GAAM,CAAC,CAAA,EAM7D0D,GAAAA,GAAY1uB,OAAO2uB,GAAM,CAAA;AAC/B,EAAArqB,IAAU,OAAA,GAAUqqB,GAAAA;AACpB,EAAA,IAAMC,GAAAA,GAAgB5uB,OAAO2qB,GAAU,CAAA;AACvC,EAAAhQ,IAAc,OAAA,GAAUgQ,GAAAA;AACxB,EAAA,IAAMkE,GAAAA,GAAc7uB,OAAO8qB,GAAQ,CAAA;AACnC,EAAAhQ,IAAY,OAAA,GAAUgQ,GAAAA;AAEtB,EAAA,IAAMgE,KAAU9uB,MAAAA,CAA4B,IAAI,GAG1C+uB,EAAAA,GAAUnN,WAAAA,CAAAA,CAAatrB,GAAAA,KAAwC;AACnE,IAAA,IAAM04B,GAAAA,GAAKJ,GAAAA,CAAc,OAAA,EACnBK,GAAAA,GAAKJ,GAAAA,CAAY,OAAA;AACvB,IAAA,OAAO;MACL,UAAA,EAAYG,GAAAA;MACZ,QAAA,EAAUC,GAAAA;AACV,MAAA,MAAA,EAAA,CAAS34B,GAAAA,KAAM8xB,EAAAA,CAAYjwB,GAAAA,EAAG62B,KAAIC,GAAE,CAAA;AACpC,MAAA,OAAA,EAAA,CAAU34B,GAAAA,KAAMkyB,EAAAA,CAAYrwB,GAAAA,EAAG62B,KAAIC,GAAE,CAAA;MACrC,SAAA,EAAA34B;AACF,KAAA;EACF,CAAA,EAAG,EAAE,CAAA,EAGC44B,EAAAA,GAAYlvB,MAAAA,CAAO,IAA4B,CAAA,EAC/C,CAACmvB,EAAAA,EAAeC,EAAAA,CAAAA,GAAoB50B,QAAAA,CAAwB,IAAI,GAGhE60B,EAAAA,GAAUrvB,MAAAA,CAA+B,EAAE,CAAA,EAC3CsvB,EAAAA,GAAYtvB,MAAAA,CAA+B,EAAE,CAAA,EAE7CuvB,EAAAA,GAAW3N,WAAAA,CAAAA,MAAwC;AACvD,IAAA,IAAMzqB,GAAAA,uBAAQ,GAAA,EAAqB;AACnC,IAAA,KAAA,IAAW0C,GAAAA,IAAK60B,GAAAA,CAAU,OAAA,EAASp4B,GAAAA,CAAE,IAAIuD,GAAAA,CAAE,KAAA,CAAM,EAAA,EAAIA,GAAAA,CAAE,KAAK,CAAA;AAC5D,IAAA,OAAO1C,GAAAA;AACT,EAAA,CAAA,EAAG,EAAE,CAAA,EAECq4B,EAAAA,GAAU5N,WAAAA,CAAAA,CAAatrB,GAAAA,KAA+B;AAC1D,IAAA,IAAMm5B,MAAUf,GAAAA,CAAU,OAAA;AAC1B,IAAA,KAAA,IAAW70B,OAAK41B,GAAAA,EAAS;AACvB,MAAA,IAAMjuB,GAAAA,GAAOkuB,GAAAA,CAAK,GAAA,CAAI71B,GAAAA,CAAE,MAAM,EAAE,CAAA;AAC5B2H,MAAAA,GAAAA,KAAS,UAAaA,GAAAA,KAAS3H,GAAAA,CAAE,SACnC81B,GAAAA,CAAc91B,GAAAA,CAAE,KAAA,CAAM,EAAA,EAAI2H,GAAI,CAAA;AAElC,IAAA;AACF,EAAA,CAAA,EAAG,CAACmuB,GAAa,CAAC,CAAA,EAEZC,EAAAA,GAAOhO,YAAAA,MAAkB;AAC7B,IAAA,IAAI,CAAC6M,GAAAA,EAAgB;AACrB,IAAA,IAAMoB,MAAOR,EAAAA,CAAQ,OAAA;AACrB,IAAA,IAAIQ,GAAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,IAAMruB,GAAAA,GAAOquB,IAAK,GAAA,EAAI;AACtBP,IAAAA,GAAU,OAAA,CAAQ,IAAA,CAAKC,IAAU,CAAA,EACjCC,GAAQhuB,GAAI,CAAA;EACd,CAAA,EAAG;AAACitB,IAAAA,GAAAA;AAAgBc,IAAAA,EAAAA;AAAUC,IAAAA;GAAQ,CAAA,EAEhCM,EAAAA,GAAOlO,WAAAA,CAAAA,MAAkB;AAC7B,IAAA,IAAI,CAAC6M,GAAAA,EAAgB;AACrB,IAAA,IAAMsB,MAAST,EAAAA,CAAU,OAAA;AACzB,IAAA,IAAIS,GAAAA,CAAO,WAAW,CAAA,EAAG;AACzB,IAAA,IAAMruB,GAAAA,GAAOquB,IAAO,GAAA,EAAI;AACxBV,IAAAA,GAAQ,OAAA,CAAQ,IAAA,CAAKE,IAAU,CAAA,EAC/BC,GAAQ9tB,GAAI,CAAA;EACd,CAAA,EAAG;AAAC+sB,IAAAA,GAAAA;AAAgBc,IAAAA,EAAAA;AAAUC,IAAAA;GAAQ,CAAA,EAMhCQ,EAAAA,GAAmBhwB,MAAAA,CAAAA,MAAwC;EAAC,CAAC,CAAA,EAC7DiwB,EAAAA,GAAkBjwB,MAAAA,CAAAA,MAAwC;EAAC,CAAC,CAAA,EAC5DkwB,EAAAA,GAAqBlwB,MAAAA,CAAAA,MAAyB;AAAC,EAAA,CAAC,GAEhDmwB,EAAAA,GAAanwB,MAAAA,CAA8B,IAAI,CAAA,EAE/CowB,EAAAA,GAAiBxO,YAAAA,MAAkB;AACvC,IAAAyO,GAAW,OAAA,GAAU,IAAA,EACrBn4B,GAAU,OAAA,GAAU,IAAA,EACpBk3B,GAAiB,IAAI,CAAA;AACvB,EAAA,CAAA,EAAG,EAAE,CAAA,EAECkB,EAAAA,GAAiB1O,WAAAA,CAAAA,CAAatrB,GAAAA,KAAoC;AACtE,IAAA,KAAA,IAAWuD,GAAAA,IAAK60B,IAAU,OAAA,EAAS,IAAI70B,IAAE,KAAA,CAAM,EAAA,KAAOgnB,GAAAA,EAAI,OAAOhnB,GAAAA,CAAE,KAAA;AAErE,EAAA,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA02B,EAAAA,CAAiB,OAAA,GAAA,CAAWj6B,GAAAA,KAAoB;AAC9C,IAAA,IAAMyG,MAAImyB,EAAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAACnyB,GAAAA,EAAG;AACR,IAAA,IAAM1B,MAAIyzB,EAAAA,CAAQ,OAAA;AAClB,IAAA,IAAI,CAACzzB,GAAAA,EAAG;AACR,IAAA,IAAMkwB,GAAAA,GAAQlwB,IAAE,aAAA,CAAc/E,GAAC,GACzBm5B,GAAAA,GAAUa,EAAAA,CAAevzB,IAAE,OAAO,CAAA;AACxC,IAAA,IAAI0yB,QAAY,MAAA,EAAW;AAC3B,IAAA,IAAM1xB,GAAAA,GAAMgxB,EAAAA,CAAQR,EAAAA,CAAcj4B,GAAC,CAAC,CAAA,EAC9BoL,GAAAA,GAAO3E,GAAAA,CAAE,OAAA,CAAQ,MAAA,CAAO0yB,GAAAA,EAASlE,GAAAA,EAAOj1B,KAAGyH,GAAG,CAAA;AAChD2D,IAAAA,GAAAA,KAAS+tB,GAAAA,IAASE,GAAAA,CAAc5yB,GAAAA,CAAE,SAAS2E,GAAI,CAAA;EACrD,CAAA,EAEA8uB,EAAAA,CAAgB,OAAA,GAAA,CAAWl6B,GAAAA,KAAoB;AAC7C,IAAA,IAAMyG,MAAImyB,EAAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAACnyB,GAAAA,EAAG;AACR,IAAA,IAAM0yB,GAAAA,GAAUa,EAAAA,CAAevzB,GAAAA,CAAE,OAAO,CAAA;AACxC,IAAA,IAAI0yB,QAAY,MAAA,EAAW;AAAE,MAAAgB,EAAAA,EAAe;AAAG,MAAA;AAAQ,IAAA;AACvD,IAAA,IAAM1yB,GAAAA,GAAMgxB,EAAAA,CAAQR,EAAAA,CAAcj4B,GAAC,CAAC,CAAA,EAC9Bo6B,GAAAA,GAAa3zB,GAAAA,CAAE,OAAA,CAAQ,WAAWA,GAAAA,CAAE,OAAA,CAAQ,QAAA,CAAS0yB,GAAAA,EAAS1xB,GAAG,CAAA,GAAI0xB,GAAAA;AACvEiB,IAAAA,GAAAA,KAAejB,GAAAA,IAASE,GAAAA,CAAc5yB,GAAAA,CAAE,OAAA,EAAS2zB,GAAU,CAAA,EAC3DjC,GAAAA,KACFY,EAAAA,CAAQ,OAAA,CAAQ,IAAA,CAAKtyB,GAAAA,CAAE,WAAW,GAClCovB,EAAAA,CAAU,OAAA,GAAU,EAAC,CAAA,EAEnBwE,GAAAA,IAAeA,GAAAA,CAAc5zB,GAAAA,CAAE,OAAA,EAAS2zB,GAAAA,EAAY3zB,GAAAA,CAAE,cAAc,CAAA,EACxEqzB,EAAAA,EAAe;EACjB,CAAA,EAEAQ,EAAAA,CAAmB,UAAA,MAAgB;AACjC,IAAA,IAAM7zB,MAAImyB,EAAAA,CAAU,OAAA;AACpB,IAAA,IAAI,CAACnyB,GAAAA,EAAG;AACR,IAAA,IAAM0yB,GAAAA,GAAUa,EAAAA,CAAevzB,GAAAA,CAAE,OAAO,CAAA;AACxC,IAAA,IAAI0yB,QAAY,MAAA,EAAW;AAAE,MAAAgB,EAAAA,EAAe;AAAG,MAAA;AAAQ,IAAA;AACvD,IAAA,IAAM1yB,GAAAA,GAAMgxB,EAAAA,CAAQT,EAAY,CAAA,EAC1BuC,MAAW9zB,GAAAA,CAAE,OAAA,CAAQ,QAAA,GAAWA,GAAAA,CAAE,OAAA,CAAQ,QAAA,CAAS0yB,GAAAA,EAAS1xB,GAAG,IAAIhB,GAAAA,CAAE,cAAA;AACvE8zB,IAAAA,QAAapB,GAAAA,IAASE,GAAAA,CAAc5yB,IAAE,OAAA,EAAS8zB,GAAQ,GAC3DT,EAAAA,EAAe;AACjB,EAAA,CAAA;AAIA,EAAA,IAAMU,EAAAA,GAAiBlP,WAAAA,CAAAA,CACrBtrB,GAAAA,EACAe,KACA4D,GAAAA,KACG;AACH,IAAA,IAAM81B,MAAcxB,EAAAA,EAAS,EACvByB,GAAAA,GAAiBD,GAAAA,CAAY,IAAIE,GAAO,CAAA;AAC9C,IAAA/4B,GAAU,OAAA,GAAU;MAClB,OAAA,EAAA5B,GAAAA;MAAS,OAAA,EAAA2E,GAAAA;MACT,WAAA,EAAAH,GAAAA;MACA,cAAA,EAAAvD;KACF,EACA63B,EAAAA,CAAiB6B,GAAO,CAAA,EACxBZ,EAAAA,CAAW,UAAUa,kBAAAA,CAAmBC,GAAAA,CAAK,eAAeA,GAAAA,EAAM;AAChE,MAAA,MAAA,EAAA,CAAS76B,GAAAA,KAAM05B,EAAAA,CAAiB,OAAA,CAAQ15B,GAAC,CAAA;AACzC,MAAA,KAAA,EAAA,CAAQA,GAAAA,KAAM25B,EAAAA,CAAgB,OAAA,CAAQ35B,GAAC,CAAA;MACvC,QAAA,EAAA,MAAgB45B,GAAmB,OAAA;KACrC,EAAG,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;EACvB,CAAA,EAAG,CAACX,EAAQ,CAAC,CAAA,EAGP6B,MAAmBxP,WAAAA,CAAAA,CACvBvqB,KACA4D,GAAAA,KACG;AACH,IAAA,IAAIi0B,GAAU,OAAA,EAAS;AACvB,IAAA,IAAMmC,GAAAA,GAAY9C,EAAAA,CAAcj4B,GAAC,CAAA,EAC3ByH,GAAAA,GAAMgxB,EAAAA,CAAQsC,GAAS,CAAA,EACvBC,GAAAA,GAAK5C,GAAAA,CAAU,OAAA,EACf6C,GAAAA,GAAcj7B,GAAAA,CAAE,WAAA;AAEtB,IAAA,CAAA,CAAK,wBAAwB,aAAA,EAAe;AAAE,MAAA,IAAA,EAAMk7B,GAAAA,CAAO,IAAA;AAAM,MAAA,KAAA,EAAOA,GAAAA,CAAO,KAAA;AAAO,MAAA,MAAA,EAAQF,GAAAA,CAAG;KAAQ,CAAA;AAIzG,IAAA,IAAMG,MAAmBlC,EAAAA,EAAS;AAGlC,IAAA,KAAA,IAASh4B,MAAI+5B,GAAAA,CAAG,MAAA,GAAS,CAAA,EAAG/5B,GAAAA,IAAK,GAAGjB,GAAAA,EAAAA,EAAK;AACvC,MAAA,IAAMuD,GAAAA,GAAIy3B,GAAAA,CAAG/5B,GAAAA,CAAAA,EACPssB,GAAAA,GAAMhqB,GAAAA,CAAE,KAAA,CAAM,OAAA,GAAUA,GAAAA,CAAE,KAAA,EAAO23B,GAAAA,CAAO,IAAA,EAAMzzB,GAAG,CAAA;AACvD,MAAA,IAAI,CAAC8lB,GAAAA,EAAK;AAGV,MAAA,IAAM6N,GAAAA,GAAY73B,GAAAA,CAAE,KAAA,EAChB83B,GAAAA,EACEC,GAAAA,GAAU/3B,GAAAA,CAAE,KAAA,CAAM,aAAA,GACtB63B,GAAAA,EAAW7N,GAAAA,EAAK0N,GAAAA,EAAaxzB,GAAAA,EAC7B;AACE,QAAA,IAAA,EAAMyzB,GAAAA,CAAO,IAAA;AACb,QAAA,KAAA,EAAOA,GAAAA,CAAO,KAAA;AACd,QAAA,MAAA,CAAOl7B,GAAAA,EAAM;AAAE,UAAA8E,MAAYsG,GAAAA,EAAMiuB,GAAAA,CAAc91B,GAAAA,CAAE,KAAA,CAAM,IAAI6H,GAAI,CAAA;AAAG,QAAA;OAEtE,CAAA;AAEA,MAAA,IADApL,GAAAA,CAAE,eAAA,EAAgB,EACds7B,GAAAA,EAAS;AACX,QAAAC,EAAAA,CAAeh4B,GAAAA,CAAE,KAAA,CAAM,EAAA,EAAIvD,KAAGs7B,GAAO,CAAA;AACrC,QAAA;AACF,MAAA;AACID,MAAAA,QAAc,MAAA,KACZlD,GAAAA,KACFY,EAAAA,CAAQ,OAAA,CAAQ,KAAKoC,GAAgB,CAAA,EACrCtF,EAAAA,CAAU,OAAA,GAAU,EAAC,CAAA,EAEvBwE,GAAAA,GAAgB92B,IAAE,KAAA,CAAM,EAAA,EAAI83B,KAAWD,GAAS,CAAA,CAAA;AAElD,MAAA;AACF,IAAA;AAGA,IAAA,IAAII,GAAAA,GAAqE,IAAA;AACzE,IAAA,KAAA,IAASv6B,MAAI+5B,GAAAA,CAAG,MAAA,GAAS,CAAA,EAAG/5B,GAAAA,IAAK,GAAGjB,GAAAA,EAAAA,EAAK;AACvC,MAAA,IAAMuD,GAAAA,GAAIy3B,IAAG/5B,GAAAA,CAAAA;AACb,MAAA,IAAI,CAACsC,GAAAA,CAAE,KAAA,CAAM,kBAAA,EAAoB;AACjC,MAAA,IAAM63B,GAAAA,GAAY73B,GAAAA,CAAE,KAAA,EAChB83B,GAAAA,EACEC,GAAAA,GAAU/3B,GAAAA,CAAE,KAAA,CAAM,kBAAA,CACtB63B,GAAAA,EAAWF,GAAAA,CAAO,KAAA,EAAOD,GAAAA,EAAaxzB,GAAAA,EACtC;AACE,QAAA,IAAA,EAAMyzB,GAAAA,CAAO,IAAA;AACb,QAAA,KAAA,EAAOA,GAAAA,CAAO,KAAA;AACd,QAAA,MAAA,CAAOl7B,GAAAA,EAAM;AACX,UAAAqB,MAAY+J,GAAAA,EACZiuB,GAAAA,CAAc91B,GAAAA,CAAE,KAAA,CAAM,IAAI6H,GAAI,CAAA;AAChC,QAAA;OAEJ,CAAA;AACA,MAAA,IAAIkwB,GAAAA,EAAS;AAOXd,QAAAA,EAAAA,CAAej3B,IAAE,KAAA,CAAM,EAAA,EAAIvD,KAAGs7B,GAAO,CAAA,EACjCD,GAAAA,KAAc,MAAA,IAAazC,EAAAA,CAAU,OAAA,KAAY,SACnDh3B,EAAAA,CAAW,OAAA,CAA0B,WAAA,GAAcu5B,GAAAA,EACnDv5B,EAAAA,CAAW,OAAA,CAA0B,iBAAiBu5B,GAAAA,CAAiB,GAAA,CAAI53B,GAAAA,CAAE,KAAA,CAAM,EAAE,CAAA,CAAA;AAEvF,QAAA;AACF,MAAA;AACA,MAAA,IAAI83B,QAAc,MAAA,EAAW;AAC3B,QAAAj6B,GAAAA,GAAgB;AAAE,UAAA,EAAA,EAAImC,IAAE,KAAA,CAAM,EAAA;UAAI,IAAA,EAAM83B,GAAAA;UAAW,IAAA,EAAMD;AAAU,SAAA;AACnE,QAAA;AACF,MAAA;AACF,IAAA;AACII,IAAAA,QACErD,GAAAA,KACFY,EAAAA,CAAQ,OAAA,CAAQ,IAAA,CAAKoC,GAAgB,CAAA,EACrCtF,EAAAA,CAAU,OAAA,GAAU,KAEtBwE,GAAAA,GAAgBmB,GAAAA,CAAc,IAAIA,GAAAA,CAAc,IAAA,EAAMA,IAAc,IAAI,CAAA,CAAA;EAE5E,CAAA,EAAG;AAAC/C,IAAAA,EAAAA;AAAS+B,IAAAA,EAAAA;AAAgBnB,IAAAA,GAAAA;AAAegB,IAAAA,GAAAA;AAAelC,IAAAA,GAAAA;AAAgBc,IAAAA;AAAQ,GAAC,CAAA,EAG9EwC,GAAAA,GAAenQ,WAAAA,CAAAA,CAAatrB,GAAAA,KAAyC;AACzE,IAAA,IAAM+6B,GAAAA,GAAY9C,GAAcj4B,GAAC,CAAA,EAC3ByH,MAAMgxB,EAAAA,CAAQsC,GAAS,CAAA,EACvBC,GAAAA,GAAK5C,GAAAA,CAAU,OAAA;AAErB,IAAA,IAAID,GAAAA,KAAmBn4B,GAAAA,CAAE,OAAA,IAAWA,GAAAA,CAAE,OAAA,CAAA,EAAU;AAC9C,MAAA,IAAMJ,GAAAA,GAAII,GAAAA,CAAE,GAAA,CAAI,WAAA,EAAY;AAC5B,MAAA,IAAIJ,QAAM,GAAA,EAAK;AACT,QAAAI,IAAE,QAAA,GAAUw5B,EAAAA,KACXF,EAAAA,EAAK,EACVt5B,IAAE,cAAA,EAAe;AACjB,QAAA;AACF,MAAA;AACA,MAAA,IAAIJ,QAAM,GAAA,EAAK;AAAE45B,QAAAA,EAAAA,EAAK,EAAGx5B,GAAAA,CAAE,cAAA,EAAe;AAAG,QAAA;AAAQ,MAAA;AACvD,IAAA;AAEA,IAAA,KAAA,IAASiB,MAAI+5B,GAAAA,CAAG,MAAA,GAAS,CAAA,EAAG/5B,GAAAA,IAAK,GAAGF,GAAAA,EAAAA,EAAK;AACvC,MAAA,IAAMwC,GAAAA,GAAIy3B,IAAG/5B,GAAAA,CAAAA;AACb,MAAA,IAAI,CAACsC,GAAAA,CAAE,KAAA,CAAM,SAAA,EAAW;AACxB,MAAA,IAAM43B,GAAAA,GAAmBlC,IAAS,EAC9BoC,GAAAA;AAaJ,MAAA,IAZA93B,GAAAA,CAAE,KAAA,CAAM,SAAA,CAAUA,GAAAA,CAAE,KAAA,EAAOvD,IAAE,WAAA,EAAayH,GAAAA,EAAK,EAC7C,MAAA,CAAOzH,GAAAA,EAAM;AAAE,QAAA2I,MAAYyC,GAAAA,EAAMiuB,GAAAA,CAAc91B,GAAAA,CAAE,KAAA,CAAM,IAAI6H,GAAI,CAAA;MAAG,CAAA,EACnE,CAAA,EACGiwB,GAAAA,KAAc,MAAA,KACZlD,GAAAA,KACFY,GAAQ,OAAA,CAAQ,IAAA,CAAKoC,GAAgB,CAAA,EACrCtF,EAAAA,CAAU,OAAA,GAAU,EAAC,CAAA,EAEvBwE,GAAAA,GAAgB92B,GAAAA,CAAE,KAAA,CAAM,EAAA,EAAI83B,GAAAA,EAAW93B,IAAE,KAAK,CAAA,CAAA,EAI5CvD,GAAAA,CAAE,WAAA,CAAY,gBAAA,EAAkB;AACtC,IAAA;EACF,CAAA,EAAG;AAACm4B,IAAAA,GAAAA;AAAgBmB,IAAAA,EAAAA;AAAME,IAAAA,EAAAA;AAAMf,IAAAA,EAAAA;AAASQ,IAAAA,EAAAA;AAAUI,IAAAA,GAAAA;AAAegB,IAAAA;GAAc,CAAA;AAEhF,EAAAv1B,SAAAA,CAAA,MAAA,MAAsB;AAAE,IAAAi1B,EAAAA,CAAW,SAAS,MAAA,EAAO;AAAG,EAAA,CAAA,EAAG,EAAE,CAAA;AAG3D,EAAA,IAAM2B,GAAAA,GAA6CrN,QAAAA,OAAe;IAChE,UAAA,EAAA5W,GAAAA;IACA,QAAA,EAAA7B,GAAAA;AACA,IAAA,MAAA,EAAA,CAAS5V,GAAAA,KAAM8xB,EAAAA,CAAYjwB,GAAAA,EAAGwyB,KAAYG,GAAQ,CAAA;AAClD,IAAA,OAAA,EAAA,CAAUx0B,GAAAA,KAAMkyB,EAAAA,CAAYrwB,GAAAA,EAAGwyB,KAAYG,GAAQ;AACrD,GAAA,CAAA,EAAI,CAACH,GAAAA,EAAYG,GAAQ,CAAC,GAEpB5tB,GAAAA,GAAM,CAAC1F,EAAAA,CAAE,IAAA,EAAMkE,GAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAExD,EAAA,uBACEhE,KAAC+yB,EAAAA,EAAD;IACE,GAAA,EAAKqE,EAAAA;IACL,SAAA,EAAW5xB,GAAAA;IACJ,KAAA,EAAAud,GAAAA;IACA,KAAA,EAAApQ,GAAAA;IACC,MAAA,EAAAiK,GAAAA;IACA,MAAA,EAAAne,GAAAA;IACA,MAAA,EAAAoG,GAAAA;IACF,IAAA,EAAA1C,GAAAA;IACA,IAAA,EAAA2C,GAAAA;IACE,MAAA,EAAA8d,GAAAA;IACA,MAAA,EAAAC,GAAAA;AACR,IAAA,QAAA,EAAUkU,MAAiB,CAAA,GAAI,MAAA;IAC/B,IAAA,EAAK,OAAA;AACL,IAAA,YAAA,EAAYzzB,IAAM,YAAA,CAAA;IAClB,aAAA,EAAeo2B,GAAAA;IACf,SAAA,EAAWW,GAAAA;AAhBb,IAAA,QAAA,EAAA,CAkBGl2B,GAAAA,EACA8yB,GAAAA,CAAO,GAAA,CAAA,CAAKr4B,GAAAA,KAAM;AACjB,MAAA,IAAMyH,GAAAA,GAAM;QACV,GAAGi0B,GAAAA;QACH,SAAA,EAAW;UAAE,KAAA,EAAO,KAAA;UAAO,GAAA,EAAK,KAAA;UAAO,IAAA,EAAM,KAAA;UAAO,IAAA,EAAM;AAAM,SAAA;QAChE,QAAA,EAAU7C,EAAAA,KAAkBt1B,IAAE,KAAA,CAAM;AACtC,OAAA;AACA,MAAA,uBACEpC,IAAC,GAAA,EAAD;AAAoB,QAAA,eAAA,EAAeoC,IAAE,KAAA,CAAM,EAAA;AACxC,QAAA,QAAA,EAAAA,GAAAA,CAAE,KAAA,CAAM,MAAA,CAAOA,GAAAA,CAAE,OAAOkE,GAAG;OAC3B,EAFKlE,GAAAA,CAAE,MAAM,EAEb,CAAA;AAEP,IAAA,CAAC,CACK;;AAEZ;AC5YA,IAAMo4B,EAAAA,GAAsB,EAAA;AAA5B,IACMC,EAAAA,GAAa,CAAA;AADnB,IAEMC,EAAAA,GAAgB,CAAA;AAFtB,IAGMC,EAAAA,GAAe,CAAA;AAHrB,IAIMC,EAAAA,GAAWhE,GAAW,mBAAmB,CAAA;AAJ/C,IAKMiE,EAAAA,GAAgB,GAAA;AALtB,IAMMC,EAAAA,GAAmB,EAAA;AANzB,IAOMC,EAAAA,GAAc,IAAA;AAOpB,SAASC,EAAAA,CAAQn8B,KAAWe,GAAAA,EAA2C;AACrE,EAAA,OAAOga,GAAAA,GAAQ,IAAA,CAAK,GAAA,CAAIA,GAAAA,CAAM,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAIA,GAAAA,CAAM,CAAA,CAAA,EAAIlb,GAAC,CAAC,CAAA,GAAIA,GAAAA;AAC7D;AAEA,SAASu8B,GAASp8B,GAAAA,EAAkD;AAClE,EAAA,IAAMA,MAAI6xB,GAAAA,EAAK,MAAA;AACf,EAAA,OAAO,OAAO7xB,GAAAA,IAAM,QAAA,IAAYA,OAAc,QAAA,IAAYA,GAAAA,GAAIA,IAAE,MAAA,GAAS,IAAA;AAC3E;AAEA,SAASq8B,EAAAA,CACPr8B,GAAAA,EAAmCe,GAAAA,EAAe4D,GAAAA,EAAWH,GAAAA,EACV;AACnD,EAAA,IAAM83B,GAAAA,GAAQ;AAAE,IAAA,GAAG/K,IAAKlH,GAAAA,CAAAA;IAAQ,CAAA,EAAA1lB,GAAAA;IAAG,KAAA,EAAAH;GAAM,EACnCC,GAAAA,GAAO8sB,IAAK,MAAA,CAAA,CAAQvxB,KAAG2E,GAAAA,KAAM1D,GAAAA,KAAMopB,GAAK,CAAA,EACxCqC,GAAAA,GAAKjoB,GAAAA,CAAK,UAAA,CAAWzE,GAAAA,KAAMJ,IAAE,CAAA,GAAImB,GAAC,GAClCw7B,GAAAA,GAAc7P,GAAAA,KAAO,EAAA,GAAKjoB,GAAAA,CAAK,MAAA,GAASioB,GAAAA;AAE9C,EAAA,OADAjoB,GAAAA,CAAK,MAAA,CAAO83B,GAAAA,EAAa,CAAA,EAAGD,GAAK,CAAA,EAC1B;IAAE,IAAA,EAAM73B,GAAAA;IAAM,WAAA,EAAAvD;AAAY,GAAA;AACnC;AAQA,SAAgBs7B,GACdx8B,GAAAA,EACmE;AACnE,EAAA,IAAM,EAAE,IAAA,EAAAe,GAAAA,EAAM,IAAA,EAAA4D,KAAA,GAASwmB,GAAAA;AACvB,EAAA,IAAI,CAAC0D,KAAM,OAAO;IAAE,IAAA,EAAAlqB,GAAAA;AAAM,IAAA,WAAA,EAAawmB,GAAAA,CAAM;AAAY,GAAA;AACzD,EAAA,IAAI0D,GAAAA,CAAK,SAAS,KAAA,EAAO;AACvB,IAAA,IAAMjvB,GAAAA,GAAI2xB,GAAAA,CAAK1C,GAAAA,CAAK,KAAA,CAAA;AAEpB,IAAA,OADIjvB,GAAAA,IAAKA,IAAE,CAAA,KAAMivB,GAAAA,CAAK,KAAKjvB,GAAAA,CAAE,KAAA,KAAUivB,IAAK,KAAA,GAAc;MAAE,IAAA,EAAAlqB,GAAAA;AAAM,MAAA,WAAA,EAAakqB,GAAAA,CAAK;AAAM,KAAA,GACnFwN,GAAU9K,GAAAA,EAAM1C,GAAAA,CAAK,OAAOA,GAAAA,CAAK,CAAA,EAAGA,IAAK,KAAK,CAAA;AACvD,EAAA;AACA,EAAA,IAAMzjB,GAAAA,GAAOmmB,IAAK,KAAA,EAAM;AAExB,EAAA,OADA/sB,GAAAA,CAAKqqB,GAAAA,CAAK,OAAA,CAAA,GAAW;IAAE,GAAG0C,GAAAA,CAAK1C,IAAK,OAAA,CAAA;IAAU,MAAA,EAAQ,EAAE,MAAA,EAAQA,GAAAA,CAAK,MAAA;GAAS,EACvE;IAAE,IAAA,EAAMzjB,GAAAA;AAAM,IAAA,WAAA,EAAa+f,GAAAA,CAAM;AAAY,GAAA;AACtD;AAQA,SAAgBsR,EAAAA,CAAoBz8B,GAAAA,GAA2B,EAAC,EAAmC;AACjG,EAAA,IAAMuqB,GAAAA,GAAK9hB,IAAI,EAAA,IAAM,WAAA,EACf/G,MAAQ+G,GAAAA,CAAI,KAAA,IAAS,SACrBi0B,GAAAA,GAAUj0B,GAAAA,CAAI,YAAA,CAAazI,GAAAA,KAAc,OAAO,IAAA,CAAK,KAAA,CAAMkG,GAAC,CAAC,CAAA,CAAA,EAC7Dy2B,GAAAA,GAAel0B,GAAAA,CAAI,YAAA,IAAA,CAAA;AAKzB,EAAA,SAASm0B,GAAAA,CAAW58B,GAAAA,EAA2Be,GAAAA,EAAmC4D,GAAAA,EAAuB;AACvG,IAAA,IAAMtD,MAAI8pB,GAAAA,CAAM,IAAA;AAEhB,IAAA,OADI9pB,GAAAA,EAAG,IAAA,KAAS,QAAA,IAAYA,GAAAA,CAAE,YAAYsP,GAAAA,GAAYksB,iBAAAA,CAAkB,GAAGx7B,GAAAA,CAAE,MAAM,CAAA,GAC5Ey7B,aAAAA,CAAcvL,GAAAA,CAAK5gB,GAAAA,EAAK,MAAM,CAAA;AACvC,EAAA;AAEA,EAAA,SAASosB,GAAAA,CAAe/8B,GAAAA,EAA2Be,GAAAA,EAAmC4D,GAAAA,EAA8B;AAClH,IAAA,IAAM2O,MAAqB,EAAC;AAC5B,IAAA,KAAA,IAASrS,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIswB,GAAAA,CAAK,QAAQtwB,GAAAA,EAAAA,EAAK;AACpC,MAAA,IAAMwF,MAAI8qB,GAAAA,CAAKtwB,GAAAA,GAAI,CAAA,CAAA,EACbsC,MAAIguB,GAAAA,CAAKtwB,GAAA,CAAA,EACT+7B,GAAAA,GAAOJ,IAAWzR,GAAAA,EAAOoG,GAAAA,EAAMtwB,GAAC,CAAA,EAChC8J,MAAmB,EAAC;AAC1B,MAAA,KAAA,IAAS0M,GAAAA,GAAI,CAAA,EAAGA,GAAAA,IAAKkkB,EAAAA,EAAqB37B,GAAAA,EAAAA,EAAK;AAC7C,QAAA,IAAMoB,MAAIqW,GAAAA,GAAIkkB,EAAAA;AACd,QAAA17B,GAAAA,CAAI,IAAA,CAAKwH,GAAAA,CAAI,MAAA,CAAO;AAAE,UAAA,CAAA,EAAGhB,GAAAA,CAAE,CAAA,GAAA,CAAKlD,GAAAA,CAAE,CAAA,GAAIkD,IAAE,CAAA,IAAKrF,GAAAA;AAAG,UAAA,CAAA,EAAGqF,IAAE,KAAA,GAAA,CAASlD,GAAAA,CAAE,QAAQkD,GAAAA,CAAE,KAAA,IAASu2B,IAAK57B,GAAC;AAAE,SAAC,CAAC,CAAA;AAC/F,MAAA;AACA,MAAAoD,GAAAA,CAAI,KAAKuG,GAAG,CAAA;AACd,IAAA;AACA,IAAA,OAAOuI,GAAAA;AACT,EAAA;AAEA,EAAA,SAAS2pB,IAAaj9B,GAAAA,EAA0C;AAC9D,IAAA,IAAM2Q,MAAMwa,GAAAA,CAAM,eAAA;AAClB,IAAA,IAAIxa,GAAAA,KAAQ,QAAQA,GAAAA,GAAM,CAAA,IAAKA,OAAOwa,GAAAA,CAAM,IAAA,CAAK,QAAQ,OAAO,IAAA;AAChE,IAAA,IAAM9pB,MAAI8pB,GAAAA,CAAM,IAAA;AAEhB,IAAA,OADI9pB,GAAAA,EAAG,IAAA,KAAS,QAAA,IAAYA,GAAAA,CAAE,OAAA,KAAYsP,GAAAA,GAAYtP,GAAAA,CAAE,MAAA,GACjD+6B,EAAAA,CAASjR,GAAAA,CAAM,IAAA,CAAKxa,GAAAA,CAAI,CAAA;AACjC,EAAA;AAEA,EAAA,SAASusB,GAAAA,CAAal9B,GAAAA,EAA2Be,GAAAA,EAAgB4D,GAAAA,EAAuC;AACtG,IAAA,IAAM8B,MAAI0kB,GAAAA,CAAM,IAAA,CAAKA,IAAM,eAAA,GAAmB,CAAA,GACxC5nB,GAAAA,GAAI4nB,GAAAA,CAAM,IAAA,CAAKA,GAAAA,CAAM,eAAA,CAAA,EACrBuB,GAAAA,GAAAA,CAAM1sB,GAAAA,EAAYe,GAAAA,KACtB0G,IAAI,MAAA,CAAO;AAAE,MAAA,CAAA,EAAGhB,GAAAA,CAAE,CAAA,GAAI02B,GAAAA,IAAM55B,GAAAA,CAAE,IAAIkD,GAAAA,CAAE,CAAA,CAAA;AAAI,MAAA,CAAA,EAAGA,GAAAA,CAAE,KAAA,GAAQ22B,GAAAA,IAAM75B,GAAAA,CAAE,QAAQkD,GAAAA,CAAE,KAAA;KAAQ,CAAA;AACjF,IAAA,OAAO,CAACimB,GAAAA,CAAG2Q,GAAAA,CAAO,CAAA,CAAA,EAAIA,IAAO,CAAA,CAAE,CAAA,EAAG3Q,GAAAA,CAAG2Q,IAAO,CAAA,CAAA,EAAIA,GAAAA,CAAO,CAAA,CAAE,CAAC,CAAA;AAC5D,EAAA;AAEA,EAAA,IAAMC,GAAAA,GAAAA,CAAQt9B,GAAAA,KACZ+K,GAAAA,CAAI,GAAA,CAAA,CAAK/K,GAAAA,EAAGe,GAAAA,KAAM,CAAA,EAAGE,GAAAA,KAAM,CAAA,GAAI,GAAA,GAAM,GAAA,CAAA,EAAMY,GAAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKA,GAAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAGxF,EAAA,SAAS07B,GAAAA,CAAOv9B,KAA2Be,GAAAA,EAAgC;AACzE,IAAA,IAAMy8B,GAAAA,GAAQrS,IAAM,IAAA,EAAM,IAAA,KAAS,QAAQqR,EAAAA,CAAkBrR,GAAK,EAAE,IAAA,GAAOA,GAAAA,CAAM,MAC3E7a,GAAAA,GAAWysB,GAAAA,CAAe5R,KAAOqS,GAAAA,EAAO/1B,GAAG,GAC3Cg2B,GAAAA,GAAQntB,GAAAA,CAAS,QAAA,CAAStQ,GAAAA,EAAKe,QAAOE,GAAAA,KAAM,CAAA,GAAI8J,MAAMA,GAAAA,CAAI,KAAA,CAAM,CAAC,CAAE,CAAA,EACnE4F,MAAMwa,GAAAA,CAAM,eAAA,EACZkS,MAASJ,GAAAA,CAAa9R,GAAK,GAC3BuS,GAAAA,GAAYvS,GAAAA,CAAM,MAAM,IAAA,KAAS,KAAA,GAAQA,GAAAA,CAAM,IAAA,CAAK,KAAA,GAAQ,IAAA;AAElE,IAAA,uBACE/pB,IAAAA,CAAA6D,QAAAA,EAAA,EAAA,QAAA,EAAA;AACG0L,MAAAA,GAAAA,KAAQ,QAAQA,GAAAA,IAAO,CAAA,IAAKA,GAAAA,GAAM6sB,GAAAA,CAAM,UAAA,MAAgB;AACvD,QAAA,IAAMG,GAAAA,GAAKl2B,IAAI,MAAA,CAAO;UAAE,CAAA,EAAG+1B,GAAAA,CAAM7sB,GAAAA,GAAM,CAAA,CAAA,CAAG,CAAA;UAAG,CAAA,EAAG;AAAE,SAAC,CAAA,CAAE,CAAA,EAC/CsQ,GAAAA,GAAKxZ,GAAAA,CAAI,MAAA,CAAO;UAAE,CAAA,EAAG+1B,GAAAA,CAAM7sB,GAAAA,CAAAA,CAAK,CAAA;UAAG,CAAA,EAAG;AAAE,SAAC,CAAA,CAAE,CAAA;AACjD,QAAA,uBACExP,IAAC,MAAA,EAAD;AACE,UAAA,SAAA,EAAWD,EAAAA,CAAE,WAAA;UACb,CAAA,EAAG,IAAA,CAAK,GAAA,CAAIy8B,GAAAA,EAAI1c,GAAE,CAAA;UAClB,CAAA,EAAG,CAAA;UACH,KAAA,EAAO,IAAA,CAAK,GAAA,CAAIA,GAAAA,GAAK0c,GAAE,CAAA;AACvB,UAAA,MAAA,EAAQl2B,IAAI,QAAA,CAAS;SACtB,CAAA;AAEL,MAAA,CAAA,GAAG,GAAI,IAAA;AACNg2B,MAAAA,GAAAA,CAAM,MAAA,GAAS,CAAA,mBAAIt8B,GAAAA,CAAC,MAAA,EAAD;QAAM,oBAAA,EAAmB,OAAA;AAAQ,QAAA,SAAA,EAAWD,EAAAA,CAAE,KAAA;AAAO,QAAA,CAAA,EAAGo8B,IAAKG,GAAK;AAAI,OAAA,CAAA,GAAI,IAAA;AAC7FntB,MAAAA,GAAAA,CAAS,IAAA,CAAKtQ,GAAAA,EAAKe,GAAAA,qBAClBI,IAAC,MAAA,EAAD;AAEE,QAAA,SAAA,EAAWD,EAAAA,CAAE,aAAA;AACb,QAAA,CAAA,EAAGo8B,IAAKvyB,GAAG,CAAA;QACX,IAAA,EAAK,QAAA;QACL,QAAA,EAAU,CAAA;QACV,YAAA,EAAY,CAAA,EAAGrJ,GAAAA,CAAAA,cAAAA,EAAsBg7B,GAAAA,CAAQc,IAAMv8B,GAAAA,GAAI,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,CAAA;QAC3D,cAAA,EAAc0P,GAAAA,KAAQ1P,GAAAA,GAAI,CAAA,GAAI,MAAA,GAAS,MAAA;AACvC,QAAA,oBAAA,EAAoBA,GAAAA,GAAI;AACzB,OAAA,EARM,CAAA,IAAA,EAAOA,GAAAA,GAAI,CAAA,CAAA,CAQjB,CACF,CAAA;AACAo8B,MAAAA,GAAAA,GAAAA,CAAAA,MAAgB;AACf,QAAA,IAAM,CAACO,GAAAA,EAAIC,GAAAA,CAAAA,GAAMX,GAAAA,CAAa/R,GAAAA,EAAOkS,GAAAA,EAAQ51B,GAAG,CAAA,EAC1ChB,GAAAA,GAAIgB,GAAAA,CAAI,MAAA,CAAO;AAAE,UAAA,CAAA,EAAG0jB,GAAAA,CAAM,IAAA,CAAKxa,GAAAA,GAAO,CAAA,CAAA,CAAG,CAAA;AAAG,UAAA,CAAA,EAAGwa,GAAAA,CAAM,IAAA,CAAKxa,GAAAA,GAAO,CAAA,CAAA,CAAG;SAAO,CAAA,EAC3EpN,GAAAA,GAAIkE,GAAAA,CAAI,MAAA,CAAO;UAAE,CAAA,EAAG0jB,GAAAA,CAAM,IAAA,CAAKxa,GAAAA,CAAAA,CAAM,CAAA;UAAG,CAAA,EAAGwa,GAAAA,CAAM,IAAA,CAAKxa,GAAAA,CAAAA,CAAM;SAAO,CAAA;AACzE,QAAA,uBACEvP,IAAAA,CAAA6D,QAAAA,EAAA,EAAA,QAAA,EAAA;AACE,0BAAA9D,IAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAWD,EAAAA,CAAE,UAAA;AAAY,YAAA,EAAA,EAAIuF,GAAAA,CAAE,CAAA;AAAG,YAAA,EAAA,EAAIA,GAAAA,CAAE,CAAA;AAAG,YAAA,EAAA,EAAIm3B,GAAAA,CAAG,CAAA;AAAG,YAAA,EAAA,EAAIA,GAAAA,CAAG;WAAI,CAAA;AACtE,0BAAAz8B,IAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAWD,EAAAA,CAAE,UAAA;AAAY,YAAA,EAAA,EAAIqC,GAAAA,CAAE,CAAA;AAAG,YAAA,EAAA,EAAIA,GAAAA,CAAE,CAAA;AAAG,YAAA,EAAA,EAAIs6B,GAAAA,CAAG,CAAA;AAAG,YAAA,EAAA,EAAIA,GAAAA,CAAG;WAAI,CAAA;UACrE,CAACD,GAAAA,EAAIC,GAAE,CAAA,CAAE,GAAA,CAAA,CAAK79B,GAAAA,EAAGe,GAAAA,qBAChBI,GAAAA,CAAC,QAAA,EAAD;AAEE,YAAA,SAAA,EAAWD,EAAAA,CAAE,MAAA;AACb,YAAA,EAAA,EAAI6D,GAAAA,CAAE,CAAA;AACN,YAAA,EAAA,EAAIA,GAAAA,CAAE,CAAA;YACN,CAAA,EAAGi3B,EAAAA;YACH,IAAA,EAAK,QAAA;YACL,QAAA,EAAU,CAAA;AACV,YAAA,YAAA,EAAY,CAAA,EAAGt6B,GAAAA,CAAAA,eAAAA,EAAuBT,GAAAA,GAAI,CAAA,CAAA,CAAA;YAC1C,mBAAA,EAAmBA;WACpB,EATM,CAAA,OAAA,EAAUA,GAAAA,CAAAA,CAShB,CACF;AACD,SAAA,EAAA,CAAA;AAEN,MAAA,CAAA,GAAG,GAAI,IAAA;AACNkqB,MAAAA,GAAAA,CAAM,IAAA,CAAK,GAAA,CAAA,CAAKlqB,GAAAA,EAAGwF,GAAAA,KAAM;AACxB,QAAA,IAAM5E,GAAAA,GAAI4F,IAAI,MAAA,CAAO;AAAE,UAAA,CAAA,EAAG7H,GAAAA,CAAE,CAAA;AAAG,UAAA,CAAA,EAAGA,GAAAA,CAAE;SAAO,CAAA;AAC3C,QAAA,uBACEuB,IAAC,MAAA,EAAD;AAEE,UAAA,SAAA,EAAWD,EAAAA,CAAE,QAAA;AACb,UAAA,CAAA,EAAGW,IAAE,CAAA,GAAIk6B,EAAAA;AACT,UAAA,CAAA,EAAGl6B,IAAE,CAAA,GAAIk6B,EAAAA;AACT,UAAA,KAAA,EAAOA,EAAAA,GAAW,CAAA;AAClB,UAAA,MAAA,EAAQA,EAAAA,GAAW,CAAA;AACnB,UAAA,SAAA,EAAW,CAAA,UAAA,EAAal6B,GAAAA,CAAE,CAAA,CAAA,CAAA,EAAKA,IAAE,CAAA,CAAA,CAAA,CAAA;UACjC,IAAA,EAAK,QAAA;UACL,QAAA,EAAU,CAAA;AACV,UAAA,YAAA,EAAY,GAAGH,GAAAA,CAAAA,QAAAA,EAAgBg7B,GAAAA,CAAQ98B,GAAAA,CAAE,CAAC,CAAA,CAAA,CAAA;UAC1C,cAAA,EAAcurB,GAAAA,CAAM,WAAA,KAAgBlqB,GAAAA,GAAI,MAAA,GAAS,MAAA;UACjD,qBAAA,EAAqBA,GAAAA;UACrB,eAAA,EAAey8B,GAAAA,KAAcz8B,MAAI,MAAA,GAAS;SAC3C,EAbM,CAAA,IAAA,EAAOA,GAAAA,CAAAA,CAab,CAAA;MAEL,CAAC,CAAA;MACAkqB,GAAAA,CAAM,IAAA,EAAM,IAAA,KAAS,KAAA,GAAA,CAAA,MAAe;AACnC,QAAA,IAAMtpB,GAAAA,GAAI4F,IAAI,MAAA,CAAO;AAAE,UAAA,CAAA,EAAG0jB,IAAM,IAAA,CAAK,CAAA;AAAG,UAAA,CAAA,EAAGA,IAAM,IAAA,CAAK;SAAO,CAAA;AAC7D,QAAA,uBACEhqB,IAAC,MAAA,EAAD;UACE,aAAA,EAAY,MAAA;AACZ,UAAA,SAAA,EAAWD,EAAAA,CAAE,aAAA;AACb,UAAA,CAAA,EAAGW,IAAE,CAAA,GAAIk6B,EAAAA;AACT,UAAA,CAAA,EAAGl6B,IAAE,CAAA,GAAIk6B,EAAAA;AACT,UAAA,KAAA,EAAOA,EAAAA,GAAW,CAAA;AAClB,UAAA,MAAA,EAAQA,EAAAA,GAAW,CAAA;AACnB,UAAA,SAAA,EAAW,CAAA,UAAA,EAAal6B,GAAAA,CAAE,CAAA,CAAA,CAAA,EAAKA,IAAE,CAAA,CAAA,CAAA,CAAA;UACjC,qBAAA,EAAoB;SACrB,CAAA;AAEL,MAAA,CAAA,GAAG,GAAI;AACP,KAAA,EAAA,CAAA;AAEN,EAAA;AAGA,EAAA,SAASi8B,GAAAA,CAAQ99B,GAAAA,EAA2Be,GAAAA,EAAiB4D,GAAAA,EAAgC;AAC3F,IAAA,IAAM04B,GAAAA,GAASJ,IAAa9R,GAAK,CAAA;AACjC,IAAA,IAAIkS,GAAAA,EAAQ;AACV,MAAA,IAAMt4B,GAAAA,GAAIiyB,GAAckG,GAAAA,CAAa/R,GAAAA,EAAOkS,KAAQ51B,GAAG,CAAA,EAAGwqB,KAAM4J,EAAa,CAAA;AAC7E,MAAA,IAAI92B,KAAG,OAAO;QAAE,IAAA,EAAM,QAAA;QAAU,OAAA,EAAS,EAAE,MAAA,EAAQA,GAAAA,CAAE,KAAA;AAAQ,OAAA;AAC/D,IAAA;AACA,IAAA,IAAMnF,GAAAA,GAAIo3B,GAAc7L,GAAAA,CAAM,IAAA,CAAK,IAAA,CAAKnrB,GAAAA,KAAQyH,IAAI,MAAA,CAAO;AAAE,MAAA,CAAA,EAAGoqB,GAAAA,CAAI,CAAA;AAAG,MAAA,CAAA,EAAGA,GAAAA,CAAI;KAAO,CAAC,CAAA,EAAGI,GAAAA,EAAM2J,EAAU,CAAA;AACzG,IAAA,IAAIh8B,KAAG,OAAO;MAAE,IAAA,EAAM,KAAA;MAAO,OAAA,EAAS,EAAE,KAAA,EAAOA,GAAAA,CAAE,KAAA;AAAQ,KAAA;AACzD,IAAA,IAAMK,GAAAA,GAAIo3B,GAAa0F,GAAAA,CAAe5R,GAAAA,EAAOA,IAAM,IAAA,EAAM1jB,GAAG,CAAA,EAAGwqB,GAAAA,EAAM6J,EAAY,CAAA;AAEjF,IAAA,OADI77B,GAAAA,GAAU;MAAE,IAAA,EAAM,SAAA;AAAW,MAAA,OAAA,EAAS,EAAE,OAAA,EAASA,GAAAA,CAAE,MAAA,GAAS,CAAA;KAAI,GAC7D,IAAA;AACT,EAAA;AAGA,EAAA,SAAS89B,IAAWh9B,GAAAA,EAAiD;AACnE,IAAA,OAAO;MACL,MAAA,CAAO4D,GAAAA,EAAOH,GAAAA,EAAOiC,GAAAA,EAAGvF,GAAAA,EAAK;AAC3B,QAAA,IAAIH,GAAAA,GAAIo7B,EAAAA,CAAQlH,GAAAA,CAAM,CAAA,EAAGxsB,IAAI,MAAM,CAAA;AACnC,QAAA,IAAIA,GAAAA,CAAI,KAAA,IAAS,CAACzI,GAAAA,CAAE,MAAA,EAAQ;AAC1B,UAAA,IAAMg+B,GAAAA,GAAAA,CAASv2B,IAAI,UAAA,CAAW,IAAA,GAAOA,IAAI,UAAA,CAAW,IAAA,IAAQA,IAAI,QAAA,CAAS,KAAA;AACzE,UAAAxH,GAAAA,GAAIk8B,EAAAA,CAAQxF,GAAAA,CAAc51B,GAAAA,EAAG0H,GAAAA,CAAI,KAAA,EAAO,IAAA,CAAK,GAAA,CAAIu1B,GAAK,CAAA,GAAIrB,GAAY,CAAA,EAAGl0B,IAAI,MAAM,CAAA;AACrF,QAAA;AACA,QAAA,OAAO;UAAE,GAAG0iB,GAAAA;UAAO,IAAA,EAAM;YAAE,IAAA,EAAM,KAAA;YAAO,KAAA,EAAApqB,GAAAA;YAAO,CAAA,EAAAd,GAAAA;AAAG,YAAA,KAAA,EAAOk8B,EAAAA,CAAQlH,GAAAA,CAAM,CAAA,EAAGxsB,GAAAA,CAAI,MAAM;AAAE;AAAE,SAAA;AAC1F,MAAA,CAAA;AACA,MAAA,QAAA,CAASzI,GAAAA,EAAO;AAAE,QAAA,OAAO;UAAE,GAAGmrB,GAAAA;AAAO,UAAA,GAAGqR,GAAkBrR,GAAK,CAAA;UAAG,IAAA,EAAM;AAAK,SAAA;AAAG,MAAA,CAAA;AAChF,MAAA,QAAA,CAASnrB,GAAAA,EAAO;AAAE,QAAA,OAAO;UAAE,GAAGmrB,GAAAA;UAAO,IAAA,EAAM;AAAK,SAAA;AAAG,MAAA;AACrD,KAAA;AACF,EAAA;AAEA,EAAA,SAAS8S,GAAAA,CAAcj+B,KAAiBe,GAAAA,EAAiD;AACvF,IAAA,OAAO;AACL,MAAA,MAAA,CAAO4D,KAAOH,GAAAA,EAAO;AACnB,QAAA,IAAMiC,GAAAA,GAAI0kB,GAAAA,CAAM,IAAA,CAAK+S,GAAAA,GAAU,CAAA,CAAA,EACzB36B,GAAAA,GAAI4nB,GAAAA,CAAM,IAAA,CAAK+S,GAAAA,CAAAA,EACf78B,GAAAA,GAAI8pB,GAAAA,CAAM,IAAA;AAChB,QAAA,IAAI,CAAC1kB,GAAAA,IAAK,CAAClD,OAAKlC,GAAAA,EAAG,IAAA,KAAS,UAAU,OAAO8pB,GAAAA;AAC7C,QAAA,IAAMgS,MAAK55B,GAAAA,CAAE,CAAA,KAAMkD,IAAE,CAAA,GAAI,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAIwuB,GAAAA,CAAM,CAAA,GAAIxuB,IAAE,CAAA,KAAMlD,GAAAA,CAAE,IAAIkD,GAAAA,CAAE,CAAA,CAAE,CAAC,CAAA,EAC7E22B,MAAK75B,GAAAA,CAAE,KAAA,KAAUkD,IAAE,KAAA,GAAQ,CAAA,GAAA,CAAKwuB,IAAM,CAAA,GAAIxuB,GAAAA,CAAE,KAAA,KAAUlD,GAAAA,CAAE,QAAQkD,GAAAA,CAAE,KAAA,CAAA,EAClE42B,MAAS,CAAC,GAAGh8B,IAAE,MAAM,CAAA;AAG3B,QAAA,OAFAF,GAAAA,CAAOg9B,GAAAA,GAAS,CAAA,CAAA,GAAKhB,GAAAA,EACrBh8B,IAAOg9B,GAAAA,GAAS,CAAA,GAAI,CAAA,CAAA,GAAKf,GAAAA,EAClB;UAAE,GAAGjS,GAAAA;UAAO,IAAA,EAAM;YAAE,IAAA,EAAM,QAAA;YAAU,OAAA,EAAAnrB,GAAAA;YAAS,MAAA,EAAAmB;AAAO;AAAE,SAAA;AAC/D,MAAA,CAAA;AACA,MAAA,QAAA,CAASnB,GAAAA,EAAO;AAAE,QAAA,OAAO;UAAE,GAAGmrB,GAAAA;AAAO,UAAA,GAAGqR,GAAkBrR,GAAK,CAAA;UAAG,IAAA,EAAM;AAAK,SAAA;AAAG,MAAA,CAAA;AAChF,MAAA,QAAA,CAASnrB,GAAAA,EAAO;AAAE,QAAA,OAAO;UAAE,GAAGmrB,GAAAA;UAAO,IAAA,EAAM;AAAK,SAAA;AAAG,MAAA;AACrD,KAAA;AACF,EAAA;AAEA,EAAA,SAAS6J,GAAAA,CACPh1B,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACAH,KACAvD,GAAAA,EACyC;AACzC,IAAA,IAAIjB,GAAAA,CAAE,WAAW,CAAA,EACjB;AAAIutB,MAAAA,IAAAA,GAAAA,CAAI,SAAS,QAAA,EAAU;AACzB,QAAA,IAAM8P,GAAAA,GAASJ,GAAAA,CAAa9R,GAAK,CAAA,EAC3B+S,MAAU/S,GAAAA,CAAM,eAAA;AACtB,QAAA,IAAI,CAACkS,GAAAA,IAAUa,GAAAA,KAAY,IAAA,EAAM;AACjC,QAAA,IAAM,EAAE,MAAA,EAAAz3B,GAAAA,EAAA,GAAW8mB,GAAAA,CAAI,OAAA;AAEvB,QAAA,OADA6Q,IAAM,MAAA,CAAO;UAAE,GAAGjT,GAAAA;UAAO,IAAA,EAAM;YAAE,IAAA,EAAM,QAAA;YAAU,OAAA,EAAA3mB,GAAAA;YAAS,MAAA,EAAAG;AAAO;SAAG,CAAA,EAC7Ds5B,GAAAA,CAAcC,GAAAA,EAASC,GAAM,CAAA;AACtC,MAAA;AACA,MAAA,IAAI5Q,GAAAA,CAAI,SAAS,KAAA,EAAO;AACtB,QAAA,IAAM,EAAE,OAAA5oB,GAAAA,EAAA,GAAU4oB,IAAI,OAAA,EAChB3tB,GAAAA,GAAIurB,GAAAA,CAAM,IAAA,CAAKd,GAAAA,CAAAA;AAErB,QAAA,OADA+T,IAAM,MAAA,CAAO;UAAE,GAAGjT,GAAAA;UAAO,WAAA,EAAad,GAAAA;UAAO,IAAA,EAAM;YAAE,IAAA,EAAM,KAAA;YAAO,KAAA,EAAA1lB,GAAAA;AAAO,YAAA,CAAA,EAAG/E,GAAAA,CAAE,CAAA;AAAG,YAAA,KAAA,EAAOA,GAAAA,CAAE;AAAM;SAAG,CAAA,EAC5Fm+B,IAAW1T,GAAK,CAAA;AACzB,MAAA;AACA,MAAA,IAAIkD,GAAAA,CAAI,SAAS,SAAA,EAAW;AAC1B,QAAA,IAAM,EAAE,OAAA,EAAA5oB,GAAAA,EAAA,GAAY4oB,GAAAA,CAAI,OAAA;AACxB,QAAAtsB,IAAM,MAAA,CAAO;UAAE,GAAGkqB,GAAAA;UAAO,eAAA,EAAiB+S;SAAS,CAAA;AACrD,MAAA;AAVA,IAAA;AAWF,EAAA;AAGA,EAAA,SAASG,GAAAA,CACP15B,GAAAA,EACAH,GAAAA,EACAvD,GAAAA,EACAwF,GAAAA,EACM;AACN,IAAA,IAAMqjB,MAAS9pB,GAAAA,CAAE,MAAA;AACjB,IAAA,IAAI8pB,KAAQ,OAAA,GAAU,iBAAiB,GAAG,YAAA,CAAa,eAAe,MAAMS,GAAAA,EAAI;AAChF,IAAA,IAAM+T,GAAAA,GAAWt+B,GAAAA,CAAE,GAAA,KAAQ,OAAA,IAAWA,IAAE,GAAA,KAAQ,GAAA,EAC1C0P,GAAAA,GAAK1P,GAAAA,CAAE,QAAQ,YAAA,GAAe,CAAA,GAAIA,GAAAA,CAAE,GAAA,KAAQ,cAAc,EAAA,GAAK,CAAA,EAC/D2P,GAAAA,GAAK3P,GAAAA,CAAE,QAAQ,SAAA,GAAY,CAAA,GAAIA,GAAAA,CAAE,GAAA,KAAQ,cAAc,EAAA,GAAK,CAAA,EAC5Du+B,GAAAA,GAAOv+B,GAAAA,CAAE,WAAWi8B,EAAAA,GAAmB,CAAA,EAEvCuC,GAAAA,GAAQ1U,GAAAA,CAAO,QAAQ,uBAAuB,CAAA;AACpD,IAAA,IAAI0U,GAAAA,EAAO;AACT,MAAA,IAAMnU,GAAAA,GAAQ,MAAA,CAAOmU,GAAAA,CAAM,YAAA,CAAa,qBAAqB,CAAC,CAAA,EACxD5+B,GAAAA,GAAIurB,GAAAA,CAAM,IAAA,CAAKd,GAAAA,CAAAA;AACrB,MAAA,IAAI,CAACzqB,GAAAA,EAAG;AACR,MAAA,IAAI0+B,GAAAA,EAAU;AACZt+B,QAAAA,GAAAA,CAAE,cAAA,EAAe,EACjBo+B,GAAAA,CAAM,MAAA,CAAO;UAAE,GAAGjT,GAAAA;UAAO,WAAA,EAAad;SAAO,CAAA;AAC7C,QAAA;AACF,MAAA;AACA,MAAA,IAAI3a,GAAAA,KAAO,CAAA,IAAKC,GAAAA,KAAO,CAAA,EAAG;AAC1B,MAAAnL,IAAE,cAAA,EAAe;AACjB,MAAA,IAAM3D,GAAAA,GAAI4G,IAAI,UAAA,EACRg3B,GAAAA,GAAAA,CAASh2B,IAAI,IAAA,EAAM,CAAA,IAAK,KAAK,GAAA,CAAI5H,GAAAA,CAAE,OAAOA,GAAAA,CAAE,IAAI,IAAI,GAAA,IAAO09B,GAAAA,EAC3DG,OAASj2B,GAAAA,CAAI,IAAA,EAAM,KAAK,IAAA,CAAK,GAAA,CAAI5H,IAAE,IAAA,GAAOA,GAAAA,CAAE,IAAI,CAAA,GAAI,GAAA,IAAO09B,KAC3Dx9B,GAAAA,GAAIo7B,EAAAA,CAAQv8B,IAAE,CAAA,GAAI8P,GAAAA,GAAK+uB,KAAOh2B,GAAAA,CAAI,MAAM,GACxC8qB,GAAAA,GAAQ4I,EAAAA,CAAQv8B,IAAE,KAAA,GAAQ+P,GAAAA,GAAK+uB,GAAAA,EAAOj2B,GAAAA,CAAI,MAAM,CAAA;AACtD,MAAA,IAAI1H,GAAAA,KAAMnB,GAAAA,CAAE,CAAA,IAAK2zB,GAAAA,KAAU3zB,IAAE,KAAA,EAAO;AACpC,MAAA6G,IAAM,MAAA,CAAO;QAAE,GAAG0kB,GAAAA;AAAO,QAAA,GAAGkR,EAAAA,CAAUlR,GAAAA,CAAM,IAAA,EAAMd,GAAAA,EAAOtpB,KAAGwyB,GAAK,CAAA;QAAG,IAAA,EAAM;OAAM,CAAA;AAChF,MAAA;AACF,IAAA;AAEA,IAAA,IAAMoL,GAAAA,GAAQ7U,GAAAA,CAAO,OAAA,CAAQ,sBAAsB,CAAA;AACnD,IAAA,IAAI6U,OAASL,GAAAA,EAAU;AACrBt+B,MAAAA,GAAAA,CAAE,cAAA,EAAe,EACjBo+B,GAAAA,CAAM,MAAA,CAAO;QAAE,GAAGjT,GAAAA;AAAO,QAAA,eAAA,EAAiB,MAAA,CAAOwT,GAAAA,CAAM,YAAA,CAAa,oBAAoB,CAAC;OAAG,CAAA;AAC5F,MAAA;AACF,IAAA;AAEA,IAAA,IAAMC,MAAW9U,GAAAA,CAAO,OAAA,CAAQ,qBAAqB,CAAA,EAC/CuT,GAAAA,GAASJ,IAAa9R,GAAK,CAAA;AACjC,IAAA,IAAIyT,GAAAA,IAAYvB,OAAUlS,GAAAA,CAAM,eAAA,KAAoB,SAASzb,GAAAA,KAAO,CAAA,IAAKC,QAAO,CAAA,CAAA,EAAI;AAClF,MAAAnL,IAAE,cAAA,EAAe;AACjB,MAAA,IAAMO,GAAAA,GAAI,MAAA,CAAO65B,GAAAA,CAAS,YAAA,CAAa,mBAAmB,CAAC,CAAA,EACrDxzB,GAAAA,GAAO,CAAC,GAAGiyB,GAAM,CAAA;AACvB,MAAAt8B,GAAAA,CAAKgE,GAAAA,GAAI,CAAA,CAAA,GAAK,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGqG,GAAAA,CAAKrG,GAAAA,GAAI,CAAA,CAAA,GAAK2K,GAAAA,GAAKwsB,EAAAA,GAAcqC,GAAI,CAAC,CAAA,EAC5Ex9B,GAAAA,CAAKgE,GAAAA,GAAI,CAAA,GAAI,CAAA,CAAA,IAAM4K,GAAAA,GAAKusB,EAAAA,GAAcqC,GAAAA;AACtC,MAAA,IAAM1P,GAAAA,GAAqB;QAAE,IAAA,EAAM,QAAA;AAAU,QAAA,OAAA,EAAS1D,GAAAA,CAAM,eAAA;QAAiB,MAAA,EAAQ/f;AAAK,OAAA;AAC1F,MAAA3E,IAAM,MAAA,CAAO;QAAE,GAAG0kB,GAAAA;AAAO,QAAA,GAAGqR,EAAAA,CAAkB;UAAE,GAAGrR,GAAAA;UAAO,IAAA,EAAAlqB;SAAM,CAAA;QAAG,IAAA,EAAM;OAAM,CAAA;AACjF,IAAA;AACF,EAAA;AAEA,EAAA,OAAO;IAAE,EAAA,EAAAF,GAAAA;IAAI,MAAA,EAAAgT,GAAAA;IAAQ,OAAA,EAAA9N,GAAAA;IAAS,aAAA,EAAAgL,GAAAA;IAAe,SAAA,EAAAI;AAAU,GAAA;AACzD;ACpYA,SAASwtB,EAAAA,CAAK7+B,GAAAA,EAAUe,GAAAA,EAAU4D,GAAAA,EAAuB;AACvD,EAAA,IAAM+K,GAAAA,GAAKnM,IAAE,CAAA,GAAIkD,GAAAA,CAAE,GACbkJ,GAAAA,GAAKpM,GAAAA,CAAE,IAAIkD,GAAAA,CAAE,CAAA;AACnB,EAAA,OAAgB,KAAK,IAAA,CAAKiJ,GAAAA,GAAKA,MAAKC,GAAAA,GAAKA,GAAE,KAAA,CAAGmvB,GAAAA;AAChD;AASA,SAAgBC,GACd/+B,GAAAA,EAAWe,GAAAA,EAAW4D,KAAWH,GAAAA,EAAWvD,GAAAA,EAC5CwF,MAAgB,GAAA,EACT;AACP,EAAA,IACMyO,MAAK,CAAA,GAAK2pB,EAAAA,CAAK7oB,KAAIpD,GAAAA,EAAIksB,GAAK,GAC5B3pB,GAAAA,GAAKD,GAAAA,GAAK2pB,GAAKjsB,GAAAA,EAAIC,GAAAA,EAAIisB,GAAK,CAAA,EAC5BE,GAAAA,GAAK7pB,MAAK0pB,EAAAA,CAAKhsB,GAAAA,EAAIosB,KAAIH,GAAK,CAAA;AAGlC,EAAA,IAAI3pB,GAAAA,GAAKD,GAAAA,KAAO,CAAA,EACd,OAAO;AAAE,IAAA,CAAA,EAAGtC,GAAAA,CAAG,CAAA,GAAA,CAAKC,GAAAA,CAAG,CAAA,GAAID,IAAG,CAAA,IAAK7R,GAAAA;AAAG,IAAA,CAAA,EAAG6R,GAAAA,CAAG,CAAA,GAAA,CAAKC,GAAAA,CAAG,CAAA,GAAID,IAAG,CAAA,IAAK7R;AAAE,GAAA;AAGpE,EAAA,IAAMK,GAAAA,GAAI8T,MAAKnU,GAAAA,IAAKoU,GAAAA,GAAKD,MAEnBgqB,GAAAA,GAAAA,CAAAA,CAAQhqB,GAAAA,GAAK9T,GAAAA,IAAK4U,GAAAA,CAAG,CAAA,GAAA,CAAK5U,GAAAA,GAAI,KAAMwR,GAAAA,CAAG,CAAA,KAAMsC,GAAAA,GAAK,CAAA,CAAA,EAClDiqB,GAAAA,GAAAA,CAAAA,CAAQjqB,GAAAA,GAAK9T,OAAK4U,GAAAA,CAAG,CAAA,GAAA,CAAK5U,GAAAA,GAAI,CAAA,IAAMwR,GAAAA,CAAG,CAAA,KAAMsC,MAAK,CAAA,CAAA,EAClDkqB,GAAAA,GAAAA,CAAAA,CAAQjqB,MAAK/T,GAAAA,IAAKwR,GAAAA,CAAG,KAAKxR,GAAAA,GAAI8T,GAAAA,IAAMrC,GAAAA,CAAG,CAAA,KAAMsC,GAAAA,GAAKD,GAAAA,CAAAA,EAClDmqB,QAAQlqB,GAAAA,GAAK/T,GAAAA,IAAKwR,GAAAA,CAAG,CAAA,GAAA,CAAKxR,GAAAA,GAAI8T,GAAAA,IAAMrC,IAAG,CAAA,KAAMsC,GAAAA,GAAKD,GAAAA,CAAAA,EAClDoqB,GAAAA,GAAAA,CAAAA,CAAQN,GAAAA,GAAK59B,GAAAA,IAAKyR,IAAG,CAAA,GAAA,CAAKzR,GAAAA,GAAI+T,OAAM8pB,GAAAA,CAAG,CAAA,KAAMD,MAAK7pB,GAAAA,CAAAA,EAClDoqB,GAAAA,GAAAA,CAAAA,CAAQP,GAAAA,GAAK59B,GAAAA,IAAKyR,GAAAA,CAAG,CAAA,GAAA,CAAKzR,MAAI+T,GAAAA,IAAM8pB,GAAAA,CAAG,CAAA,KAAMD,GAAAA,GAAK7pB,GAAAA,CAAAA,EAElDqqB,GAAAA,GAAAA,CAAAA,CAAQrqB,MAAK/T,GAAAA,IAAK89B,GAAAA,GAAAA,CAAO99B,GAAAA,GAAI,CAAA,IAAMg+B,GAAAA,KAAQjqB,GAAAA,GAAK,IAChDsqB,GAAAA,GAAAA,CAAAA,CAAQtqB,GAAAA,GAAK/T,GAAAA,IAAK+9B,GAAAA,GAAAA,CAAO/9B,GAAAA,GAAI,CAAA,IAAMi+B,QAAQlqB,GAAAA,GAAK,CAAA,CAAA,EAChDuqB,GAAAA,GAAAA,CAAAA,CAAQV,GAAAA,GAAK59B,GAAAA,IAAKg+B,GAAAA,GAAAA,CAAOh+B,MAAI8T,GAAAA,IAAMoqB,GAAAA,KAAQN,GAAAA,GAAK9pB,GAAAA,CAAAA,EAChDyqB,GAAAA,GAAAA,CAAAA,CAAQX,GAAAA,GAAK59B,OAAKi+B,GAAAA,GAAAA,CAAOj+B,GAAAA,GAAI8T,GAAAA,IAAMqqB,GAAAA,KAAQP,GAAAA,GAAK9pB,GAAAA,CAAAA;AAItD,EAAA,OAAO;AAAE,IAAA,CAAA,EAAA,CAAA,CAFIC,MAAK/T,GAAAA,IAAKo+B,GAAAA,GAAAA,CAAOp+B,GAAAA,GAAI8T,GAAAA,IAAMwqB,QAAQvqB,GAAAA,GAAKD,GAAAA,CAAAA;AAErC,IAAA,CAAA,EAAA,CAAA,CADHC,MAAK/T,GAAAA,IAAKq+B,GAAAA,GAAAA,CAAOr+B,GAAAA,GAAI8T,GAAAA,IAAMyqB,QAAQxqB,GAAAA,GAAKD,GAAAA;AAC/B,GAAA;AACxB;AASA,SAAgB0qB,EAAAA,CACd5/B,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,GAAgB,GAAA,EACP;AACT,EAAA,IAAIgR,GAAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAO,EAAC;AAGhC,EAAA,IAAMhR,MAAIgR,GAAAA,CAAQ,MAAA,EACZrC,GAAAA,GAAe,IAEfusB,GAAAA,GAAsB;AAC1B,IAAA,CAAA,EAAG,IAAIlqB,GAAAA,CAAQ,CAAA,EAAG,CAAA,GAAIA,GAAAA,CAAQ,CAAA,CAAA,CAAG,CAAA;AACjC,IAAA,CAAA,EAAG,IAAIA,GAAAA,CAAQ,CAAA,EAAG,CAAA,GAAIA,GAAAA,CAAQ,CAAA,CAAA,CAAG;AACnC,GAAA,EACMmqB,GAAAA,GAAoB;IACxB,CAAA,EAAG,CAAA,GAAInqB,IAAQhR,GAAAA,GAAI,CAAA,EAAG,CAAA,GAAIgR,GAAAA,CAAQhR,GAAAA,GAAI,CAAA,CAAA,CAAG,CAAA;IACzC,CAAA,EAAG,CAAA,GAAIgR,IAAQhR,GAAAA,GAAI,CAAA,EAAG,CAAA,GAAIgR,GAAAA,CAAQhR,GAAAA,GAAI,CAAA,CAAA,CAAG;AAC3C,GAAA;AAEA,EAAA,KAAA,IAAS1D,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI0D,GAAAA,GAAI,GAAGzD,GAAAA,EAAAA,EAAK;AAC9B,IAAA,IAAM8U,GAAAA,GAAK/U,GAAAA,KAAM,CAAA,GAAI4+B,GAAAA,GAAelqB,GAAAA,CAAQ1U,GAAAA,GAAI,CAAA,CAAA,EAC1C2R,GAAAA,GAAK+C,GAAAA,CAAQ1U,GAAAA,CAAAA,EACb4R,GAAAA,GAAK8C,GAAAA,CAAQ1U,GAAAA,GAAI,CAAA,CAAA,EACjBg+B,GAAAA,GAAKh+B,GAAAA,GAAI,CAAA,GAAI0D,GAAAA,GAAIgR,GAAAA,CAAQ1U,GAAAA,GAAI,CAAA,CAAA,GAAK6+B,GAAAA,EAClCC,GAAAA,GAAS9+B,GAAAA,KAAM,IAAI,CAAA,GAAI,CAAA;AAC7B,IAAA,KAAA,IAASC,GAAAA,GAAI6+B,GAAAA,EAAQ7+B,GAAAA,IAAK8+B,GAAAA,EAAmBhgC,GAAAA,EAAAA,EAAK;AAChD,MAAA,IAAIkB,QAAM,CAAA,EAAG;AACX,QAAAD,GAAAA,CAAI,KAAK2R,GAAE,CAAA;AACX,QAAA;AACF,MAAA;AACA,MAAA,IAAI1R,QAAM8+B,GAAAA,EAAmB;AAC3B,QAAA/+B,GAAAA,CAAI,KAAK4R,GAAE,CAAA;AACX,QAAA;AACF,MAAA;AACA,MAAA,IAAM9R,MAAIG,GAAAA,GAAI8+B,GAAAA;AACd,MAAA/+B,GAAAA,CAAI,KAAK89B,EAAAA,CAAgB/oB,GAAAA,EAAIpD,KAAIC,GAAAA,EAAIosB,GAAAA,EAAIl+B,GAAAA,EAAG+9B,GAAK,CAAC,CAAA;AACpD,IAAA;AACF,EAAA;AACA,EAAA,OAAOxrB,GAAAA;AACT;ACvFA,SAAS2sB,GAASjgC,GAAAA,EAAiC;AACjD,EAAA,IAAM2E,MAAIu7B,GAAAA,CAAG,MAAA;AACb,EAAA,IAAIv7B,GAAAA,KAAM,CAAA,EAAG,OAAO,EAAC;AACrB,EAAA,IAAIA,GAAAA,KAAM,CAAA,EAAG,OAAO,CAAC,CAAC,CAAA;AAGtB,EAAA,IAAM9D,GAAAA,GAAkB,KAAA,CAAM8D,GAAAA,GAAI,CAAC,CAAA;AACnC,EAAA,KAAA,IAAS1D,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI0D,GAAAA,GAAI,GAAGH,GAAAA,EAAAA,EAAKG,GAAAA,CAAE1D,GAAAA,IAAKi/B,GAAAA,CAAGj/B,GAAAA,GAAI,CAAA,CAAA,GAAKi/B,IAAGj/B,GAAAA,CAAAA;AAEtD,EAAA,IAAMF,GAAAA,GAAkB,MAAM4D,GAAC,CAAA;AAC/B,EAAAH,GAAAA,CAAE,CAAA,CAAA,GAAK3D,GAAAA,CAAE,CAAA,CAAA,EACT2D,GAAAA,CAAEG,GAAAA,GAAI,CAAA,CAAA,GAAK9D,GAAAA,CAAE8D,GAAAA,GAAI,CAAA,CAAA;AAEjB,EAAA,KAAA,IAAS1D,MAAI,CAAA,EAAGA,GAAAA,GAAI0D,MAAI,CAAA,EAAG3E,GAAAA,EAAAA,MACrBa,GAAAA,CAAEI,GAAAA,GAAI,CAAA,CAAA,GAAKJ,IAAEI,GAAAA,CAAAA,IAAM,GAGrBuD,GAAAA,CAAEvD,GAAAA,CAAAA,GAAK,CAAA;AACF,OAAA;AAIL,IAAA,IAAMk/B,GAAAA,GAAAA,CAAOt/B,GAAAA,CAAEI,GAAAA,GAAI,CAAA,CAAA,GAAKJ,GAAAA,CAAEI,GAAAA,CAAAA,IAAM,CAAA,EAC1BoxB,GAAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAIxxB,GAAAA,CAAEI,GAAAA,GAAI,CAAA,CAAE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAIJ,GAAAA,CAAEI,GAAAA,CAAE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAIk/B,GAAG,CAAC,CAAA;AACtE,IAAA37B,IAAEvD,GAAAA,CAAAA,GAAK,IAAA,CAAK,IAAA,CAAKk/B,GAAG,CAAA,GAAI9N,GAAAA;AAC1B,EAAA;AAEF,EAAA,OAAOtxB,GAAAA;AACT;AAIA,SAASq/B,EAAAA,CACPpgC,GAAAA,EAAYe,GAAAA,EAAY4D,GAAAA,EAAYH,KAAYvD,GAAAA,EACxC;AACR,EAAA,IAAMkU,GAAAA,GAAKpU,GAAAA,GAAIA,GAAAA,EACTi+B,GAAAA,GAAK7pB,GAAAA,GAAKpU,GAAAA;AAChB,EAAA,OAAA,CACG,IAAIi+B,GAAAA,GAAK,CAAA,GAAI7pB,GAAAA,GAAK,CAAA,IAAKa,OACvBgpB,GAAAA,GAAK,CAAA,GAAI7pB,GAAAA,GAAKpU,GAAAA,IAAKs/B,OACnB,EAAA,GAAKrB,GAAAA,GAAK,IAAI7pB,GAAAA,IAAMvC,GAAAA,GAAAA,CACpBosB,MAAK7pB,GAAAA,IAAMmrB,GAAAA;AAEhB;AAOA,SAAgBC,EAAAA,CACdvgC,KACAe,GAAAA,EACS;AACT,EAAA,IAAI4U,GAAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAO,EAAC;AAGhC,EAAA,IAAMhR,GAAAA,GAAIgR,GAAAA,CAAQ,MAAA,EACZ6qB,GAAAA,GAAK7qB,GAAAA,CAAQ,GAAA,CAAA,CAAK3V,GAAAA,KAAMyG,GAAAA,CAAE,CAAC,CAAA,EAC3By5B,GAAAA,GAAKvqB,GAAAA,CAAQ,GAAA,CAAA,CAAK3V,GAAAA,KAAMyG,GAAAA,CAAE,CAAC,CAAA,EAC3BkL,GAAAA,GAAKsuB,EAAAA,CAASO,GAAE,CAAA,EAChB5uB,GAAAA,GAAKquB,EAAAA,CAASC,GAAE,CAAA,EAEhB5sB,GAAAA,GAAe,EAAC;AACtB,EAAA,KAAA,IAASrS,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI0D,GAAAA,GAAI,GAAG1E,GAAAA,EAAAA,EAAK;AAC9B,IAAA,IAAMwgC,GAAAA,GAAYx/B,GAAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA;AAChC,IAAA,KAAA,IAASC,GAAAA,GAAIu/B,GAAAA,EAAWv/B,GAAAA,IAAK8+B,GAAAA,EAAmB7+B,GAAAA,EAAAA,EAAK;AACnD,MAAA,IAAID,QAAM,CAAA,EAAG;AAAE,QAAAA,GAAAA,CAAI,IAAA,CAAKyU,GAAAA,CAAQ1U,GAAAA,CAAE,CAAA;AAAG,QAAA;AAAU,MAAA;AAC/C,MAAA,IAAIC,QAAM8+B,GAAAA,EAAmB;AAAE,QAAA9+B,GAAAA,CAAI,IAAA,CAAKyU,GAAAA,CAAQ1U,GAAAA,GAAI,CAAA,CAAE,CAAA;AAAG,QAAA;AAAU,MAAA;AACnE,MAAA,IAAMF,MAAIG,GAAAA,GAAI8+B,GAAAA;AACd,MAAA9+B,IAAI,IAAA,CAAK;AACP,QAAA,CAAA,EAAGk/B,EAAAA,CAAQI,GAAAA,CAAGv/B,GAAAA,CAAAA,EAAIu/B,IAAGv/B,GAAAA,GAAI,CAAA,CAAA,EAAI0Q,GAAAA,CAAG1Q,GAAAA,CAAAA,EAAI0Q,GAAAA,CAAG1Q,GAAAA,GAAI,CAAA,GAAIF,GAAC,CAAA;AAChD,QAAA,CAAA,EAAGq/B,EAAAA,CAAQF,GAAAA,CAAGj/B,GAAAA,CAAAA,EAAIi/B,IAAGj/B,GAAAA,GAAI,CAAA,CAAA,EAAI2Q,GAAAA,CAAG3Q,GAAAA,CAAAA,EAAI2Q,GAAAA,CAAG3Q,GAAAA,GAAI,CAAA,GAAIF,GAAC;OACjD,CAAA;AACH,IAAA;AACF,EAAA;AACA,EAAA,OAAOuS,GAAAA;AACT;AC5EA,SAASotB,EAAAA,CACP1gC,KACAe,GAAAA,EACS;AACT,EAAA,IAAI4U,GAAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAO,EAAC;AAGhC,EAAA,IAAMrC,MAAe,EAAC;AACtB,EAAA,KAAA,IAASrS,MAAI,CAAA,EAAGA,GAAAA,GAAI0U,GAAAA,CAAQ,MAAA,GAAS,GAAGnR,GAAAA,EAAAA,EAAK;AAC3C,IAAA,IAAMiC,GAAAA,GAAIkP,GAAAA,CAAQ1U,GAAAA,CAAAA,EACZsC,GAAAA,GAAIoS,GAAAA,CAAQ1U,GAAAA,GAAI,CAAA,CAAA,EAChBw/B,GAAAA,GAAYx/B,GAAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA;AAChC,IAAA,KAAA,IAASC,GAAAA,GAAIu/B,GAAAA,EAAWv/B,GAAAA,IAAK8+B,GAAAA,EAAmBhgC,GAAAA,EAAAA,EAAK;AACnD,MAAA,IAAIkB,QAAM,CAAA,EAAG;AAAE,QAAAyD,GAAAA,CAAI,KAAK8B,GAAC,CAAA;AAAG,QAAA;AAAU,MAAA;AACtC,MAAA,IAAIvF,QAAM8+B,GAAAA,EAAmB;AAAE,QAAAr7B,GAAAA,CAAI,KAAKpB,GAAC,CAAA;AAAG,QAAA;AAAU,MAAA;AACtD,MAAA,IAAMxC,MAAIG,GAAAA,GAAI8+B,GAAAA;AACd,MAAAr7B,IAAI,IAAA,CAAK;AAAE,QAAA,CAAA,EAAG8B,GAAAA,CAAE,CAAA,GAAA,CAAKlD,GAAAA,CAAE,CAAA,GAAIkD,IAAE,CAAA,IAAK1F,GAAAA;AAAG,QAAA,CAAA,EAAG0F,GAAAA,CAAE,CAAA,GAAA,CAAKlD,GAAAA,CAAE,CAAA,GAAIkD,IAAE,CAAA,IAAK1F;OAAG,CAAA;AACjE,IAAA;AACF,EAAA;AACA,EAAA,OAAOuS,GAAAA;AACT;AAGA,SAAgBqtB,EAAAA,CACd3gC,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACS;AACT,EAAA,QAAQmU,GAAAA;IACN,KAAK,QAAA;AACH,MAAA,OAAO4nB,EAAAA,CAAa/qB,KAASqqB,GAAiB,CAAA;IAChD,KAAK,qBAAA;AACH,MAAA,OAAOJ,EAAAA,CAAiBjqB,GAAAA,EAASqqB,GAAAA,EAAmB,CAAC,CAAA;IACvD,KAAK,qBAAA;AACH,MAAA,OAAOJ,EAAAA,CAAiBjqB,GAAAA,EAASqqB,GAAAA,EAAmB,CAAC,CAAA;IACvD,KAAK,UAAA;AACH,MAAA,OAAOO,EAAAA,CAAe5qB,KAASqqB,GAAiB,CAAA;AAElD,IAAA;AACE,MAAA,OAAOJ,EAAAA,CAAiBjqB,GAAAA,EAASqqB,GAAAA,EAAmB,GAAG,CAAA;AAC3D;AACF;ACmDA,IAAMrE,EAAAA,GAAsB,EAAA;AAA5B,IACMiF,EAAAA,GAAgB7I,GAAW,sBAAsB,CAAA;AADvD,IAEM8I,EAAAA,GAAc9I,GAAW,sBAAsB,CAAA;AAFrD,IAGM+I,EAAAA,GAAiB,EAAA;AAHvB,IAIMhF,EAAAA,GAAe,CAAA;AAJrB,IAMMiF,EAAAA,GAAoB,IAAA;AAN1B,IAOM9E,EAAAA,GAAmB,EAAA;AAPzB,IASM+E,EAAAA,GAAAA,CAAehhC,GAAAA,KAAsB,MAAA,CAAO,OAAO2E,GAAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA;AAItE,SAASs8B,EAAAA,CAAkBjhC,KAAee,GAAAA,EAA2B;AACnE,EAAA,IAAMF,GAAAA,GAAI4G,GAAAA,CAAI,UAAA,EACRy5B,GAAAA,GAAM,KAAK,GAAA,CAAIrgC,GAAAA,CAAE,IAAA,EAAMA,GAAAA,CAAE,IAAI,CAAA,EAC7BsgC,GAAAA,GAAM,IAAA,CAAK,IAAItgC,GAAAA,CAAE,IAAA,EAAMA,GAAAA,CAAE,IAAI,CAAA,EAC7BugC,GAAAA,GAAM,IAAA,CAAK,GAAA,CAAIvgC,IAAE,IAAA,EAAMA,GAAAA,CAAE,IAAI,CAAA,EAC7BwgC,MAAM,IAAA,CAAK,GAAA,CAAIxgC,GAAAA,CAAE,IAAA,EAAMA,IAAE,IAAI,CAAA;AACnC,EAAA,OAAO;IACL,CAAA,EAAG,IAAA,CAAK,IAAIqgC,GAAAA,EAAK,IAAA,CAAK,IAAIC,GAAAA,EAAKt/B,GAAAA,CAAE,CAAC,CAAC,CAAA;IACnC,CAAA,EAAG,IAAA,CAAK,IAAIu/B,GAAAA,EAAK,IAAA,CAAK,IAAIC,GAAAA,EAAKx/B,GAAAA,CAAE,CAAC,CAAC;AACrC,GAAA;AACF;AAEA,SAASy/B,EAAAA,CAAmBthC,GAAAA,EAAee,GAAAA,EAAe4D,GAAAA,EAAkC;AAE1F,EAAA,OADI48B,QAAc,MAAA,GAAe,KAAA,GAC1BlX,GAAAA,KAAU,CAAA,IAAKA,QAAUhV,GAAAA,GAAQ,CAAA;AAC1C;AAEA,SAASmsB,EAAAA,CAAexhC,KAAiCe,GAAAA,EAA4B;AACnF,EAAA,OAAO0J,IAAO,GAAA,CAAA,CAAKzK,QAAMyH,GAAAA,CAAI,MAAA,CAAO5F,GAAC,CAAC,CAAA;AACxC;AAEA,SAASk7B,EAAAA,CACP/8B,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACe;AACf,EAAA,IAAI8F,GAAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,EAAC;AAC/B,EAAA,IAAMg3B,MAAMd,EAAAA,CAAsBl2B,GAAAA,EAAQkxB,IAAqB+F,GAAa,CAAA,EACtEpuB,MAAqB,EAAC;AAC5B,EAAA,KAAA,IAASrS,MAAI,CAAA,EAAGA,GAAAA,GAAIwJ,GAAAA,CAAO,MAAA,GAAS,GAAG1J,GAAAA,EAAAA,EAAK;AAC1C,IAAA,IAAM4J,GAAAA,GAAQ1J,GAAAA,GAAI06B,EAAAA,EACZvpB,GAAAA,GAAMzH,GAAAA,GAAQgxB,EAAAA,EACdgG,GAAAA,GAAQF,GAAAA,CAAI,KAAA,CAAM92B,GAAAA,EAAOyH,GAAAA,GAAM,CAAC,CAAA;AACtC,IAAAnR,GAAAA,CAAI,IAAA,CAAK0gC,GAAAA,CAAM,GAAA,CAAA,CAAK3hC,QAAMyH,GAAAA,CAAI,MAAA,CAAO5F,GAAC,CAAC,CAAC,CAAA;AAC1C,EAAA;AACA,EAAA,OAAOyR,GAAAA;AACT;AAEA,SAASsuB,GAAqB5hC,GAAAA,EAA6C;AACzE,EAAA,OAAA,CAAQyI,IAAI,SAAA,IAAa,MAAA,MAAY,UAAA,GACjC,UAAA,GACCA,IAAI,aAAA,IAAiB,aAAA;AAC5B;AAaA,SAAgBo5B,EAAAA,CAAoBl9B,GAAAA,GAA2B,EAAC,EAAmC;AACjG,EAAA,IAAM4lB,GAAAA,GAAK9hB,GAAAA,CAAI,EAAA,IAAM,UAAA,EACfq5B,MAASr5B,GAAAA,CAAI,MAAA,IAAU,IAAA,EACvB84B,GAAAA,GAAY94B,GAAAA,CAAI,SAAA,IAAa,MAAA,EAC7Bs5B,GAAAA,GAAYt5B,IAAI,SAAA,IAAa,MAAA,EAC7Bu5B,GAAAA,GAAev5B,GAAAA,CAAI,YAAA,IAAgB,aAAA,EACnCi5B,GAAAA,GAAgBE,EAAAA,CAAqBn5B,GAAG,CAAA,EACxCw5B,GAAAA,GAAcx5B,GAAAA,CAAI,WAAA,KAAgB,OAClCy5B,GAAAA,GAAez5B,GAAAA,CAAI,KAAA,KAAU,KAAA,IAASA,IAAI,KAAA,KAAU,IAAA;AAG1D,EAAA,SAAS80B,GAAAA,CAAOv9B,KAA2BwE,GAAAA,EAAgC;AACzE,IAAA,IAAM,EAAE,MAAA,EAAAvD,GAAAA,EAAQ,WAAA,EAAAwF,KAAA,GAAgB0kB,GAAAA,EAC1BgX,GAAAA,GAAcX,EAAAA,CAAe/2B,GAAAA,EAAQhD,GAAG,CAAA,EAE1C26B,GAAAA,GAAQ,IACRC,GAAAA,GAAuB,IAAA;AAC3B,IAAA,IAAI53B,GAAAA,CAAO,UAAU,CAAA,EAAG;AACtB,MAAA,IAAM6sB,GAAAA,GAAUqJ,EAAAA,CAAsBl2B,GAAAA,EAAQkxB,EAAAA,EAAqB+F,GAAa,CAAA,CAC7E,GAAA,CAAA,CAAK1hC,GAAAA,KAAMyH,GAAAA,CAAI,MAAA,CAAO5F,GAAC,CAAC,GACrB2B,GAAAA,GAAkB,CAAC,CAAA,CAAA,EAAI8zB,GAAAA,CAAQ,CAAA,CAAA,CAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKA,GAAAA,CAAQ,CAAA,CAAA,CAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAG,CAAA;AACjF,MAAA,KAAA,IAASr2B,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIq2B,GAAAA,CAAQ,MAAA,EAAQ3yB,OAClC5D,GAAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAIu2B,GAAAA,CAAQr2B,GAAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,EAAKq2B,GAAAA,CAAQr2B,GAAAA,CAAAA,CAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAG,CAAA;AAIrE,MAAA,IAFAI,MAAQmC,GAAAA,CAAM,IAAA,CAAK,EAAE,CAAA,EAEjBiF,IAAI,IAAA,EAAM;AACZ,QAAA,IAAM65B,GAAAA,GAAW75B,IAAI,IAAA,CAAK,IAAA,KAAS,UAAUhB,GAAAA,CAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAC7DyS,GAAAA,GAAQod,GAAAA,CAAQ,CAAA,CAAA,EAChBrd,GAAAA,GAAOqd,IAAQA,GAAAA,CAAQ,MAAA,GAAS,CAAA,CAAA,EAChCiL,GAAAA,GAAY,CAAC,GAAG/+B,GAAK,CAAA;AAC3B++B,QAAAA,IAAU,IAAA,CAAK,CAAA,CAAA,EAAItoB,GAAAA,CAAK,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAA,CAAA,EAAKqoB,GAAAA,CAAS,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA,EAC7DC,IAAU,IAAA,CAAK,CAAA,CAAA,EAAIroB,GAAAA,CAAM,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAA,CAAA,EAAKooB,GAAAA,CAAS,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA,EAC9DC,IAAU,IAAA,CAAK,GAAG,GAClBz9B,GAAAA,GAAQy9B,GAAAA,CAAU,KAAK,EAAE,CAAA;AAC3B,MAAA;AACF,IAAA;AAEA,IAAA,uBACEtiC,IAAAA,CAAAgF,QAAAA,EAAA,EAAA,QAAA,EAAA;MACGo9B,GAAAA,oBACCnhC,IAAC,MAAA,EAAD;QACE,oBAAA,EAAmB,MAAA;AACnB,QAAA,SAAA,EAAWA,EAAAA,CAAE,IAAA;QACb,CAAA,EAAGmhC,GAAAA;AACH,QAAA,IAAA,EAAM55B,GAAAA,CAAI,IAAA,GAAOA,GAAAA,CAAI,IAAA,CAAK,KAAA,GAAQ;OACnC,CAAA;MAEF25B,GAAAA,IAASF,GAAAA,oBACRhhC,GAAAA,CAAC,MAAA,EAAD;AACE,QAAA,SAAA,EAAWA,EAAAA,CAAE,KAAA;QACVkhC,CAAAA,EAAAA,GAAAA;QACH,IAAA,EAAK;OACN,CAAA;AAEFH,MAAAA,GAAAA,IAAeE,GAAAA,CAAY,GAAA,CAAA,CAAKniC,GAAAA,EAAGwE,GAAAA,KAAM;AACxC,QAAA,IAAMg+B,GAAAA,GAASlB,EAAAA,CAAmBrgC,GAAAA,EAAGwJ,GAAAA,CAAO,MAAA,EAAQ82B,GAAS,CAAA,EACvDkB,GAAAA,GAASh4B,GAAAA,CAAOxJ,GAAAA,CAAAA,EAAI,MAAA,KAAW,IAAA;AACrC,QAAA,IAAA,CAAKwhC,GAAAA,IAAUD,GAAAA,KAAW/5B,GAAAA,CAAI,kBAAA,EAAoB,OAAO,IAAA;AACzD,QAAA,IAAM0mB,GAAAA,GAASuT,GAAAA,KAAgBzhC,GAAAA,EACzB0hC,GAAAA,GAAaT,GAAAA,KAAiBjhC,GAAAA,KAAM,CAAA,IAAKA,GAAAA,KAAMwJ,GAAAA,CAAO,MAAA,GAAS,CAAA,CAAA,EAI/Dm4B,GAAAA,GAAO;UACX,GAJY,CAACH,GAAAA,IAAU,EAAElB,GAAAA,KAAc,aAAA,IAAiBiB,OACtD,EAAE,QAAA,EAAU,CAAA,EAAE,GACd,EAAC;UAGH,IAAA,EAAM,QAAA;UACN,YAAA,EAAc,CAAA,EAAG/5B,IAAI,KAAA,IAAS,OAAA,IAAWxH,GAAAA,GAAI,CAAA,OAAQ+/B,EAAAA,CAAYv2B,GAAAA,CAAOxJ,GAAAA,CAAAA,CAAG,CAAC,CAAA,CAAA,EAAA,EAAM+/B,EAAAA,CAAYv2B,IAAOxJ,GAAAA,CAAAA,CAAG,CAAC,CAAA,CAAA;AAC3G,SAAA;AACA,QAAA,IAAIwH,IAAI,YAAA,EAAc;AACpB,UAAA,IAAMo6B,GAAAA,GAAOp6B,IAAI,YAAA,CAAa;AAC5B,YAAA,KAAA,EAAOgC,IAAOxJ,GAAAA,CAAAA;YAAI,KAAA,EAAOA,GAAAA;AACzB,YAAA,EAAA,EAAIwF,GAAAA,CAAE,CAAA;AAAG,YAAA,EAAA,EAAIA,GAAAA,CAAE,CAAA;YACf,QAAA,EAAU0oB,GAAAA;YAAQ,QAAA,EAAUsT,GAAAA;YAC5B,gBAAA,EAAkBD,GAAAA;YAAQ,UAAA,EAAAnhC;WAC3B,CAAA;AACD,UAAA,IAAIwhC,GAAAA,IAAS,IAAA,EACX,uBAAO3hC,IAAC,GAAA,EAAD;YAAW,mBAAA,EAAmBD,GAAAA;YAAG,GAAI2hC,GAAAA;YAAO,QAAA,EAAAC;AAAQ,WAAA,EAA5C5hC,GAA4C,CAAA;AAE/D,QAAA;AACA,QAAA,IAAM6hC,GAAAA,GAAY;UAChB5hC,EAAAA,CAAE,MAAA;AACFyhC,UAAAA,GAAAA,IAAczhC,EAAAA,CAAE,QAAA;AACfshC,UAAAA,CAAAA,GAAAA,IAAUC,QAAWvhC,EAAAA,CAAE,MAAA;AACxBuhC,UAAAA,GAAAA,IAAUvhC,EAAAA,CAAE,MAAA;AACZiuB,UAAAA,GAAAA,IAAUjuB,EAAAA,CAAE;AACd,SAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAE1B,QAAA,IADwByhC,OAAcF,GAAAA,EACjB;AACnB,UAAA,IAAM9vB,GAAAA,GAAO8vB,MAAS5B,EAAAA,GAAcD,EAAAA;AACpC,UAAA,uBACE1/B,IAAC,MAAA,EAAD;YAEE,SAAA,EAAW4hC,GAAAA;AACX,YAAA,CAAA,EAAGr8B,IAAE,CAAA,GAAIkM,GAAAA;AACT,YAAA,CAAA,EAAGlM,IAAE,CAAA,GAAIkM,GAAAA;AACT,YAAA,KAAA,EAAOA,GAAAA,GAAO,CAAA;AACd,YAAA,MAAA,EAAQA,GAAAA,GAAO,CAAA;AACf,YAAA,SAAA,EAAW,CAAA,UAAA,EAAalM,GAAAA,CAAE,CAAA,CAAA,CAAA,EAAKA,IAAE,CAAA,CAAA,CAAA,CAAA;YACjC,mBAAA,EAAmBxF,GAAAA;YACnB,GAAI2hC;AACL,WAAA,EATM3hC,GASN,CAAA;AAEL,QAAA;AACA,QAAA,uBACEC,IAAC,QAAA,EAAD;UAEE,SAAA,EAAW4hC,GAAAA;AACX,UAAA,EAAA,EAAIr8B,GAAAA,CAAE,CAAA;AACN,UAAA,EAAA,EAAIA,GAAAA,CAAE,CAAA;UACN,CAAA,EAAG,CAAA;UACH,mBAAA,EAAmBxF,GAAAA;UACnB,GAAI2hC;AACL,SAAA,EAPM3hC,GAON,CAAA;MAEL,CAAC;AACD,KAAA,EAAA,CAAA;AAEN,EAAA;AAGA,EAAA,SAAS68B,GAAAA,CAAQ99B,GAAAA,EAA2Be,GAAAA,EAAiB4D,GAAAA,EAAe;AAC1E,IAAA,IAAI,CAACs9B,KAAa,OAAO,IAAA;AACzB,IAAA,IAAME,GAAAA,GAAcX,EAAAA,CAAerW,GAAAA,CAAM,MAAA,EAAQ1jB,GAAG,GAC9ChB,GAAAA,GAAIuwB,EAAAA,CAAcmL,GAAAA,EAAalQ,GAAAA,EAAM6O,EAAc,CAAA;AACzD,IAAA,IAAIr6B,KAAG,OAAO;MAAE,IAAA,EAAM,QAAA;MAAmB,OAAA,EAAS,EAAE,KAAA,EAAOA,GAAAA,CAAE,KAAA;AAAQ,KAAA;AACrE,IAAA,IAAIu7B,GAAAA,KAAiB,iBAAiBE,GAAAA,EAAc;AAClD,MAAA,IAAMa,GAAAA,GAAOhG,EAAAA,CAAe5R,GAAAA,CAAM,MAAA,EAAQuW,GAAAA,EAAej6B,GAAG,CAAA,EACtDxH,GAAAA,GAAIo3B,EAAAA,CAAa0L,GAAAA,EAAM9Q,GAAAA,EAAM6J,EAAY,CAAA;AAC/C,MAAA,IAAI77B,KAAG,OAAO;QAAE,IAAA,EAAM,OAAA;QAAkB,OAAA,EAAS;AAAE,UAAA,MAAA,EAAQA,GAAAA,CAAE,MAAA;AAAQ,UAAA,CAAA,EAAGA,GAAAA,CAAE;AAAE;AAAE,OAAA;AAChF,IAAA;AACA,IAAA,OAAO,IAAA;AACT,EAAA;AAGA,EAAA,SAAS+iC,GAAAA,CAAWhjC,GAAAA,EAA2Be,GAAAA,EAAeyD,GAAAA,EAAmBvD,GAAAA,EAAmC;AAClH,IAAA,IAAMwJ,MAAS0gB,GAAAA,CAAM,MAAA;AACrB,IAAA,IAAId,GAAAA,GAAQ,CAAA,IAAKA,GAAAA,IAAS5f,GAAAA,CAAO,QAAQ,OAAO0gB,GAAAA;AAChD,IAAA,IAAMuN,GAAAA,GAAKjxB,GAAAA,CAAI,UAAA,EACTw7B,GAAAA,GAAOx6B,IAAI,MAAA,GAASA,GAAAA,CAAI,MAAA,CAAO,CAAA,CAAA,GAAKiwB,GAAAA,CAAG,IAAA,EACvCwK,GAAAA,GAAOz6B,IAAI,MAAA,GAASA,GAAAA,CAAI,MAAA,CAAO,CAAA,CAAA,GAAKiwB,GAAAA,CAAG,IAAA,EACzCvb,GAAAA,GAAK8X,IAAM,CAAA,EACX/X,GAAAA,GAAK+X,GAAAA,CAAM,CAAA,EACT0N,GAAAA,GAAatY,GAAAA,KAAU,CAAA,IAAKA,GAAAA,KAAU5f,IAAO,MAAA,GAAS,CAAA;AAE5D,IAAA,IAAI82B,GAAAA,KAAc,aAAA,IAAiBoB,GAAAA,EACjC79B,GAAAA,GAAK2F,GAAAA,CAAO4f,GAAAA,CAAAA,CAAO,CAAA,EACnBxoB,GAAAA,GAAK4I,GAAAA,CAAO4f,GAAAA,CAAAA,CAAO,CAAA;AACVkX,SAAAA,IAAAA,GAAAA,KAAc,cAAcoB,GAAAA,EACrC79B,GAAAA,GAAKulB,GAAAA,KAAU,IAAI4Y,GAAAA,GAAOC,GAAAA;aACjBnB,GAAAA,KAAc,UAAA,IAAcD,QAAW,IAAA,EAAM;AACtD,MAAA,IAAMqB,GAAAA,GAAUpB,GAAAA,KAAc,UAAA,GAAA,CACzBmB,GAAAA,GAAOD,GAAAA,IAAQ,GAAA,GAChB,CAAA,EACE1rB,GAAAA,GAAO8S,GAAAA,GAAQ,CAAA,GAAI5f,GAAAA,CAAO4f,GAAAA,GAAQ,CAAA,CAAA,CAAG,CAAA,GAAI8Y,GAAAA,GAAUF,GAAAA,EACnDzrB,GAAAA,GAAQ6S,GAAAA,GAAQ5f,GAAAA,CAAO,MAAA,GAAS,CAAA,GAAIA,GAAAA,CAAO4f,GAAAA,GAAQ,CAAA,CAAA,CAAG,CAAA,GAAI8Y,GAAAA,GAAUD,GAAAA;AAC1E,MAAAp+B,GAAAA,GAAK,KAAK,GAAA,CAAIyS,GAAAA,EAAM,KAAK,GAAA,CAAIC,GAAAA,EAAO2F,GAAE,CAAC,CAAA;AACzC,IAAA;AAQE,IAAArY,MAAK,IAAA,CAAK,GAAA,CAFC,IAAA,CAAK,GAAA,CAAIm+B,KAAMC,GAEZ,CAAA,EAAI,IAAA,CAAK,GAAA,CADZ,KAAK,GAAA,CAAID,GAAAA,EAAMC,GACC,CAAA,EAAI/lB,GAAE,CAAC,CAAA;AAEpC,IAAA,IAAMimB,MAAUnC,EAAAA,CAAkB;MAAE,CAAA,EAAG9jB,GAAAA;MAAI,CAAA,EAAGD;AAAG,KAAA,EAAGzV,GAAG,CAAA,EACjD2D,GAAAA,GAAOX,GAAAA,CAAO,KAAA,EAAM;AAE1B,IAAA,OADAsJ,GAAAA,CAAKsW,GAAAA,CAAAA,GAAS;AAAE,MAAA,GAAG5f,IAAO4f,GAAAA,CAAAA;AAAQ,MAAA,CAAA,EAAG+Y,GAAAA,CAAQ,CAAA;AAAG,MAAA,CAAA,EAAGA,GAAAA,CAAQ;KAAE,EACtD;MAAE,GAAGjY,GAAAA;MAAO,MAAA,EAAQ/f,GAAAA;MAAM,WAAA,EAAaif;AAAM,KAAA;AACtD,EAAA;AAGA,EAAA,SAASgZ,IAAgBrjC,GAAAA,EAAiD;AACxE,IAAA,OAAO;MACL,MAAA,CAAOe,GAAAA,EAAO4D,GAAAA,EAAOH,GAAAA,EAAIvD,GAAAA,EAAK;AAAE,QAAA,OAAO+hC,GAAAA,CAAW7X,GAAAA,EAAOd,GAAAA,EAAO4K,GAAAA,EAAOxtB,GAAG,CAAA;AAAG,MAAA,CAAA;AAC7E,MAAA,QAAA,CAASzH,GAAAA,EAAO;AAAE,QAAA,OAAO;UAAE,GAAGmrB,GAAAA;UAAO,WAAA,EAAa;AAAK,SAAA;AAAG,MAAA,CAAA;AAC1D,MAAA,QAAA,CAASnrB,GAAAA,EAAO;AAAE,QAAA,OAAO;UAAE,GAAGmrB,GAAAA;UAAO,WAAA,EAAa;AAAK,SAAA;AAAG,MAAA;AAC5D,KAAA;AACF,EAAA;AAGA,EAAA,SAAS6J,GAAAA,CACPj0B,GAAAA,EACAyD,GAAAA,EACAiC,GAAAA,EACAkC,KACAzH,GAAAA,EACyC;AACzC,IAAA,IAAIqsB,GAAAA,CAAI,SAAS,QAAA,EAAU;AACzB,MAAA,IAAM,EAAE,KAAA,EAAAttB,GAAAA,EAAA,GAAUstB,GAAAA,CAAI,OAAA;AAEtB,MAAA,IADAptB,CAAAA,CAAK,kBAAkB,aAAA,EAAe;QAAE,EAAA,EAAAc,GAAAA;QAAI,KAAA,EAAAhB,GAAAA;AAAO,QAAA,KAAA,EAAOwH,IAAI,SAAA,CAAU,KAAA;AAAO,QAAA,MAAA,EAAQzH,GAAAA,CAAE;AAAO,OAAC,CAAA,EAC7FmrB,GAAAA,CAAM,MAAA,CAAOd,GAAAA,GAAQ,MAAA,EAAQ;AACjC,MAAA,IAAI5iB,GAAAA,CAAI,UAAU,KAAA,EAAO;AAEvB,QAAA,IADI65B,EAAAA,CAAmBjX,GAAAA,EAAOc,GAAAA,CAAM,MAAA,CAAO,QAAQoW,GAAS,CAAA,IACxD94B,GAAAA,CAAI,SAAA,KAAc,MAAA,IAAa0iB,GAAAA,CAAM,MAAA,CAAO,MAAA,IAAU1iB,IAAI,SAAA,EAAW;AACzE,QAAAvH,IAAM,MAAA,CAAO;UACX,GAAGiqB,GAAAA;AACH,UAAA,MAAA,EAAQA,IAAM,MAAA,CAAO,MAAA,CAAA,CAAQnrB,GAAAA,EAAGe,GAAAA,KAAME,QAAMopB,GAAK,CAAA;UACjD,WAAA,EAAa;SACd,CAAA;AACD,QAAA;AACF,MAAA;AAGA,MAAA,OAFIrqB,GAAAA,CAAE,MAAA,KAAW,CAAA,GAAG,MAAA,IACpBo+B,IAAM,MAAA,CAAO;QAAE,GAAGjT,GAAAA;QAAO,WAAA,EAAad;OAAO,CAAA,EACtCgZ,IAAgBhZ,GAAK,CAAA,CAAA;AAC9B,IAAA;AACA,IAAA,IAAIkD,GAAAA,CAAI,SAAS,OAAA,EAAS;AACxB,MAAA,IAAM,EAAE,MAAA,EAAAvtB,GAAAA,EAAA,GAAWutB,GAAAA,CAAI,OAAA;AACvB,MAAA,IAAI9kB,IAAI,SAAA,KAAc,MAAA,IAAa0iB,IAAM,MAAA,CAAO,MAAA,IAAU1iB,IAAI,SAAA,EAAW;AACzE,MAAA,IAAM66B,MAAc7yB,GAAAA,GAAS,CAAA,EACvB8yB,MAAUtC,EAAAA,CAAkB7C,GAAAA,CAAM,OAAO32B,GAAG,CAAA;AAMlD,MAAA,IAAIs6B,GAAAA,KAAc,UAAA,IAAcD,GAAAA,KAAW,IAAA,EAAM;AAC/C,QAAA,IAAMqB,GAAAA,GAAUpB,GAAAA,KAAc,UAAA,GAAA,CACzBt6B,GAAAA,CAAI,UAAA,CAAW,IAAA,GAAOA,GAAAA,CAAI,UAAA,CAAW,IAAA,IAAQ,GAAA,GAC9C,CAAA,EACE8P,GAAAA,GAAO+rB,GAAAA,GAAc,CAAA,GAAInY,GAAAA,CAAM,MAAA,CAAOmY,GAAAA,GAAc,CAAA,CAAA,GAAK,IAAA,EACzD9rB,GAAAA,GAAQ8rB,GAAAA,GAAcnY,GAAAA,CAAM,MAAA,CAAO,MAAA,GAASA,GAAAA,CAAM,MAAA,CAAOmY,GAAAA,CAAAA,GAAe,IAAA;AAC9E,QAAA,IAAI/rB,GAAAA,IAAQ,IAAA,CAAK,GAAA,CAAIgsB,GAAAA,CAAQ,CAAA,GAAIhsB,GAAAA,CAAK,CAAC,CAAA,GAAI4rB,GAAAA,GAAU,CAAA,EAEnD,OADA/E,GAAAA,CAAM,MAAA,CAAO;UAAE,GAAGjT,GAAAA;AAAO,UAAA,WAAA,EAAamY,GAAAA,GAAc;SAAG,CAAA,EAChDD,GAAAA,CAAgBC,GAAAA,GAAc,CAAC,CAAA;AAExC,QAAA,IAAI9rB,GAAAA,IAAS,IAAA,CAAK,GAAA,CAAI+rB,GAAAA,CAAQ,CAAA,GAAI/rB,GAAAA,CAAM,CAAC,CAAA,GAAI2rB,GAAAA,GAAU,CAAA,EAErD,OADA/E,GAAAA,CAAM,MAAA,CAAO;UAAE,GAAGjT,GAAAA;UAAO,WAAA,EAAamY;SAAa,CAAA,EAC5CD,IAAgBC,GAAW,CAAA;AAEtC,MAAA;AAEA,MAAA,IAAME,GAAAA,GAAa;AAAC,QAAA,GAAGrY,GAAAA,CAAM,MAAA,CAAO,KAAA,CAAM,CAAA,EAAGmY,GAAW,CAAA;AAAGC,QAAAA,GAAAA;QAAS,GAAGpY,GAAAA,CAAM,MAAA,CAAO,KAAA,CAAMmY,GAAW;AAAC,OAAA;AAEtG,MAAA,OADAlF,IAAM,MAAA,CAAO;QAAE,GAAGjT,GAAAA;QAAO,MAAA,EAAQqY,GAAAA;QAAY,WAAA,EAAaF;OAAa,CAAA,EAChED,IAAgBC,GAAW,CAAA;AACpC,IAAA;AACF,EAAA;AAGA,EAAA,SAASG,GAAAA,CACPzjC,GAAAA,EACAe,GAAAA,EACAyD,GAAAA,EACAvD,KACAwF,GAAAA,EACyC;AAGzC,IAAA,IAFI,CAACw7B,GAAAA,IACDD,GAAAA,KAAiB,aAAA,IACjBv5B,GAAAA,CAAI,SAAA,KAAc,MAAA,IAAa0iB,GAAAA,CAAM,MAAA,CAAO,MAAA,IAAU1iB,GAAAA,CAAI,SAAA,EAAW;AAEzE,IAAA,IAAM26B,MAAUnC,EAAAA,CAAkBhM,GAAAA,EAAOxtB,GAAG,CAAA,EACxC67B,GAAAA,GAAcnY,IAAM,MAAA,CAAO,MAAA;AAC/B,IAAA,IAAI2W,QAAW,IAAA,EACR;AAAI7gC,MAAAA,KAAAA,IAAAA,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIkqB,GAAAA,CAAM,MAAA,CAAO,MAAA,EAAQpqB,GAAAA,EAAAA,EACvC,IAAIoqB,GAAAA,CAAM,MAAA,CAAOlqB,GAAAA,CAAAA,CAAG,CAAA,GAAImiC,IAAQ,CAAA,EAAG;AAAE,QAAAliC,GAAAA,GAAcD,GAAAA;AAAG,QAAA;AAAO,MAAA;;AAGjE,IAAA,IAAMuiC,GAAAA,GAAa;AAAC,MAAA,GAAGrY,GAAAA,CAAM,MAAA,CAAO,KAAA,CAAM,CAAA,EAAGmY,GAAW,CAAA;AAAGF,MAAAA,GAAAA;MAAS,GAAGjY,GAAAA,CAAM,MAAA,CAAO,KAAA,CAAMmY,GAAW;AAAC,KAAA;AACtG,IAAA78B,IAAM,MAAA,CAAO;MAAE,GAAG0kB,GAAAA;MAAO,MAAA,EAAQqY,GAAAA;MAAY,WAAA,EAAa;KAAM,CAAA;AAElE,EAAA;AAGA,EAAA,SAASnF,EAAAA,CACPr+B,GAAAA,EACAe,GAAAA,EACAyD,GAAAA,EACAiC,GAAAA,EACM;AACN,IAAA,IAAI,CAACw7B,GAAAA,EAAa;AAClB,IAAA,IAAMnY,MAAS9pB,GAAAA,CAAE,MAAA;AACjB,IAAA,IAAI8pB,KAAQ,OAAA,GAAU,iBAAiB,GAAG,YAAA,CAAa,eAAe,MAAMS,GAAAA,EAAI;AAChF,IAAA,IAAMthB,GAAAA,GAAK6gB,GAAAA,CAAO,OAAA,CAAQ,qBAAqB,CAAA;AAC/C,IAAA,IAAI,CAAC7gB,GAAAA,EAAI;AACT,IAAA,IAAMyG,MAAK1P,GAAAA,CAAE,GAAA,KAAQ,eAAe,CAAA,GAAIA,GAAAA,CAAE,QAAQ,WAAA,GAAc,EAAA,GAAK,CAAA,EAC/D2P,GAAAA,GAAK3P,IAAE,GAAA,KAAQ,SAAA,GAAY,IAAIA,GAAAA,CAAE,GAAA,KAAQ,cAAc,EAAA,GAAK,CAAA;AAClE,IAAA,IAAI0P,GAAAA,KAAO,CAAA,IAAKC,GAAAA,KAAO,CAAA,EAAG;AAC1B,IAAA5O,IAAE,cAAA,EAAe;AACjB,IAAA,IAAMspB,GAAAA,GAAQ,MAAA,CAAOphB,GAAAA,CAAG,YAAA,CAAa,mBAAmB,CAAC,CAAA,EACnDpH,GAAAA,GAAIspB,GAAAA,CAAM,MAAA,CAAOd,GAAAA,CAAAA;AACvB,IAAA,IAAI,CAACxoB,GAAAA,IAAKA,GAAAA,CAAE,MAAA,EAAQ;AACpB,IAAA,IAAMhB,GAAAA,GAAI4G,GAAAA,CAAI,UAAA,EACR82B,GAAAA,GAAOv+B,GAAAA,CAAE,QAAA,GAAWi8B,EAAAA,GAAmB,CAAA,EACvCyH,GAAAA,GAAQj7B,GAAAA,CAAI,MAAA,GAASA,GAAAA,CAAI,MAAA,CAAO,CAAA,CAAA,GAAKA,GAAAA,CAAI,MAAA,CAAO,CAAA,CAAA,GAAK5H,GAAAA,CAAE,IAAA,GAAOA,GAAAA,CAAE,IAAA,EAChEuK,GAAAA,GAAO43B,GAAAA,CAAW7X,GAAAA,EAAOd,GAAAA,EAAO;AACpC,MAAA,CAAA,EAAGxoB,IAAE,CAAA,GAAI6N,GAAAA,GAAK,KAAK,GAAA,CAAIg0B,GAAK,IAAI3C,EAAAA,GAAoBxC,GAAAA;MACpD,CAAA,EAAG18B,GAAAA,CAAE,CAAA,GAAI8N,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAI9O,IAAE,IAAA,GAAOA,GAAAA,CAAE,IAAI,CAAA,GAAIkgC,EAAAA,GAAoBxC;AAChE,KAAA,EAAG92B,GAAG,CAAA,EACA60B,GAAAA,GAAQlxB,GAAAA,CAAK,OAAOif,GAAAA,CAAAA;AAC1B,IAAA,CAAIiS,GAAAA,CAAM,MAAMz6B,GAAAA,CAAE,CAAA,IAAKy6B,IAAM,CAAA,KAAMz6B,GAAAA,CAAE,CAAA,KACrCu8B,GAAAA,CAAM,MAAA,CAAO;MAAE,GAAGhzB,GAAAA;MAAM,WAAA,EAAa;KAAM,CAAA;AAC7C,EAAA;AAEA,EAAA,OAAO;IACL,EAAA,EAAAnK,GAAAA;IACA,MAAA,EAAA8S,GAAAA;IACA,OAAA,EAAAiK,GAAAA;IACA,aAAA,EAAAza,GAAAA;IACA,kBAAA,EAAAihB,GAAAA;IACA,SAAA,EAAAoD;AACF,GAAA;AACF;ACxZA,SAAgB+b,GAAY3jC,GAAAA,EAAyB;AACnD,EAAA,IAAM,EACJ,KAAA,EAAAe,GAAAA,EAAO,OAAA,EAAAyD,GAAAA,EAAS,QAAA,EAAAvD,GAAAA,EAChB,MAAA,EAAAwF,GAAAA,EAAQ,SAAA,EAAAkC,GAAAA,EAAW,aAAA,EAAA1I,GAAAA,EAAe,SAAA,EAAAY,GAAAA,EAAW,YAAA,EAAAkE,GAAAA,EAC7C,SAAA,EAAAgP,GAAAA,EAAW,SAAA,EAAAiK,GAAAA,EAAW,KAAA,EAAAne,GAAAA,EAAO,IAAA,EAAAoG,GAAAA,EAAM,kBAAA,EAAA1C,GAAAA,EAAoB,YAAA,EAAA2C,GAAAA,EACvD,OAAAkjB,GAAAA,EAAO,MAAA,EAAAnY,GAAAA,EAAQ,MAAA,EAAAI,GAAAA,EAAQ,MAAA,EAAA2S,GAAAA,EAAQ,IAAA,EAAAC,GAAAA,EAAM,IAAA,EAAAC,GAAAA,EAAM,MAAA,EAAAC,GAAAA,EAAQ,MAAA,EAAAvkB,GAAAA,EAAQ,OAAA,EAAAqW,GAAAA,EAC3D,SAAA,EAAAwB,GAAAA,EAAW,KAAA,EAAA7B,GAAAA,EAAO,WAAA,EAAA5H,GAAAA,EAAA,GAChBtJ,GAAAA,EAGEk/B,GAAAA,GAAQvV,OAAAA,CAAAA,MAAcwT,EAAAA,CAAoB;IAC9C,EAAA,EAAI,UAAA;IACJ,MAAA,EAAAp7B,GAAAA;IAAQ,SAAA,EAAAkC,GAAAA;IAAW,aAAA,EAAA1I,GAAAA;IAAe,SAAA,EAAAY,GAAAA;IAAW,YAAA,EAAAkE,GAAAA;IAC7C,SAAA,EAAAgP,GAAAA;IAAW,SAAA,EAAAiK,GAAAA;IAAW,KAAA,EAAAne,GAAAA;IAAO,IAAA,EAAAoG,GAAAA;IAAM,kBAAA,EAAA1C,GAAAA;IAAoB,YAAA,EAAA2C;AACzD,GAAC,CAAA,EAAG;AACF47B,IAAAA,GAAAA;AAAQP,IAAAA,GAAAA;AAAWG,IAAAA,GAAAA;AAAeK,IAAAA,GAAAA;AAAWC,IAAAA,GAAAA;AAC7C6B,IAAAA,GAAAA;AAAWC,IAAAA,GAAAA;AAAWrG,IAAAA,GAAAA;AAAOsG,IAAAA,GAAAA;AAAMC,IAAAA,GAAAA;AAAoBC,IAAAA;AACzD,GAAC,GAOK,CAACC,EAAAA,EAAYC,EAAAA,CAAAA,GAAiBjgC,SAAAA,OAC3B;IAAE,MAAA,EAAQqvB,GAAAA;IAAO,WAAA,EAAa;GAAK,CAC5C,CAAA,EAGM6Q,EAAAA,GAAgB16B,MAAAA,CAAOw6B,EAAU,CAAA;AACvC,EAAAtiC,EAAAA,CAAc,OAAA,GAAUsiC,EAAAA,EAKxBrP,SAAAA,CAAAA,MAAgB;AACVuP,IAAAA,EAAAA,CAAc,QAAQ,WAAA,KAAgB,IAAA,IACtCA,GAAc,OAAA,CAAQ,MAAA,KAAW7Q,OACrC4Q,EAAAA,CAAc;MAAE,MAAA,EAAQ5Q,GAAAA;MAAO,WAAA,EAAa;KAAM,CAAA;EACpD,CAAA,EAAG,CAACA,GAAK,CAAC,CAAA;AAEV,EAAA,IAAM8Q,EAAAA,GAAoB/Y,WAAAA,CAAAA,CAAatrB,GAAAA,EAAae,GAAAA,KAAyB;AAC3E,IAAA,IAAMqK,GAAAA,GAAOk5B,GAAAA,EACPC,GAAAA,GAAaH,EAAAA,CAAc,OAAA,CAAQ,MAAA;AACzCD,IAAAA,EAAAA,CAAc/4B,GAAI,CAAA,EACdA,GAAAA,CAAK,WAAWm5B,GAAAA,IAClBC,GAAAA,CAAQp5B,IAAK,MAAwB,CAAA;EAEzC,CAAA,EAAG,CAACo5B,GAAO,CAAC,CAAA,EAENC,KAAoBnZ,WAAAA,CAAAA,CAAatrB,GAAAA,EAAae,GAAAA,EAAsB4D,GAAAA,KAAyB;AACjG,IAAA,IAAI,CAAC+/B,GAAAA,EAAU;AACf,IAAA,IAAMt5B,GAAAA,GAAOk5B,KACPp5B,GAAAA,GAAOy5B,GAAAA;AACTv5B,IAAAA,GAAAA,CAAK,WAAWF,GAAAA,CAAK,MAAA,IACvBw5B,MAAWt5B,GAAAA,CAAK,MAAA,EAA0BF,IAAK,MAAM,CAAA;AAEzD,EAAA,CAAA,EAAG,CAACw5B,GAAQ,CAAC,GAMPE,EAAAA,GAAgBtZ,WAAAA,CAAAA,CAAatrB,GAAAA,KAAuC;AAExE,IAAA,IAAM6iC,GAAAA,GADS7iC,GAAAA,CAAE,MAAA,EACI,OAAA,GAAU,qBAAqB,CAAA;AACpD,IAAA,IAAI,CAAC6iC,GAAAA,EAAM;AACX,IAAA7iC,GAAAA,CAAE,cAAA,EAAe,EACjBA,GAAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,IAAM6kC,GAAAA,GAAUhC,GAAAA,CAAK,YAAA,CAAa,mBAAmB,CAAA;AACrD,IAAA,IAAIgC,QAAY,IAAA,EAAM;AACtB,IAAA,IAAMC,MAAM,MAAA,CAAOD,GAAO,CAAA,EACpBp6B,GAAAA,GAAS25B,GAAc,OAAA,CAAQ,MAAA;AAIrC,IAAA,IAHI,CAAC,MAAA,CAAO,SAAA,CAAUU,GAAG,CAAA,IAAKA,GAAAA,GAAM,CAAA,IAAKA,GAAAA,IAAOr6B,GAAAA,CAAO,MAAA,IACnDA,GAAAA,CAAOq6B,GAAAA,CAAAA,EAAM,MAAA,IACbvD,GAAAA,KAAc,MAAA,IAAaA,GAAAA,KAAc,MAAA,KAAWuD,GAAAA,KAAQ,CAAA,IAAKA,GAAAA,KAAQr6B,GAAAA,CAAO,MAAA,GAAS,CAAA,CAAA,IACzFo5B,GAAAA,KAAc,MAAA,IAAap5B,GAAAA,CAAO,MAAA,IAAUo5B,GAAAA,EAAW;AAC3D,IAAA,IAAMz4B,MAAOX,GAAAA,CAAO,MAAA,CAAA,CAAQzK,GAAAA,EAAGe,GAAAA,KAAME,QAAM6jC,GAAG,CAAA;AAC9CX,IAAAA,EAAAA,CAAc;MAAE,MAAA,EAAQ/4B,GAAAA;MAAM,WAAA,EAAa;AAAK,KAAC,GACjDo5B,GAAAA,CAAQp5B,GAAsB,CAAA,EAC9Bs5B,GAAAA,GAAWt5B,KAAwBX,GAAM,CAAA;EAC3C,CAAA,EAAG;AAAC82B,IAAAA,GAAAA;AAAWsC,IAAAA,GAAAA;AAAWW,IAAAA,GAAAA;AAASE,IAAAA;AAAQ,GAAC,CAAA,EAEtCrM,EAAAA,GAAShK,OAAAA,CAAAA,MAAc,CAAC;IAAE,KAAA,EAAAhK,GAAAA;IAAO,KAAA,EAAO6f;AAAW,GAAC,CAAA,EAAG,CAACN,GAAAA,EAAOM,EAAU,CAAC,CAAA;AAEhF,EAAA,uBACEhjC,IAAC,KAAA,EAAD;IACiB,aAAA,EAAA6jC,EAAAA;IACf,KAAA,EAAO,EAAE,SAAS,UAAA,EAAW;IAE7B,QAAA,kBAAA7jC,IAACg3B,EAAAA,EAAD;MACU,MAAA,EAAArC,EAAAA;MACR,aAAA,EAAewO,EAAAA;MACf,aAAA,EAAeI,EAAAA;MACR,KAAA,EAAArb,GAAAA;MACC,MAAA,EAAAnY,GAAAA;MACA,MAAA,EAAAI,GAAAA;MACA,MAAA,EAAA2S,GAAAA;MACF,IAAA,EAAAC,GAAAA;MACA,IAAA,EAAAC,GAAAA;MACE,MAAA,EAAAC,GAAAA;MACA,MAAA,EAAAvkB,GAAAA;MACC,OAAA,EAAAqW,GAAAA;MACE,SAAA,EAAAwB,GAAAA;MACJ,KAAA,EAAA7B,GAAAA;MAEN,QAAA,EAAAovB;KACiB;GACjB,CAAA;AAET;;;;;;;;;;;AC3IA,SAAgBC,IAAO7jC,GAAAA,EAAoB;AACzC,EAAA,IAAM,EACJ,KAAA,EAAAC,GAAAA,EACA,eAAA,EAAAyD,GAAAA,EACA,QAAA,EAAAjD,GAAAA,EACA,MAAA,EAAAhB,GAAAA,EACA,IAAA,EAAAkE,GAAAA,GAAO,QAAA,EACP,WAAAgP,GAAAA,EACA,aAAA,EAAAiK,GAAAA,EACA,MAAA,EAAAne,GAAAA,EACA,YAAA,EAAAoG,GAAAA,EACA,eAAA,EAAA1C,KACA,MAAA,EAAA2C,GAAAA,EACA,IAAA,EAAAkjB,GAAAA,EACA,GAAG3kB,GAAAA,EAAAA,GACDC,GAAAA,EACEshB,MAAUxe,EAAAA,CAAU;IAAE,MAAA,EAAAtB,GAAAA;IAAQ,IAAA,EAAAkjB;AAAK,GAAC,CAAA,EAEpC8b,GAAAA,GAAYC,GAAAA,IAAmB,CAAA,CAAQC,GAAAA,EACvC,EAAE,MAAA,EAAAnhB,GAAAA,EAAQ,WAAA,EAAAC,GAAAA,EAAA,GAAgBngB,GAAiBiB,GAAe,CAAA;AAEhE,EAAA,uBACE/D,KAAAgE,QAAAA,EAAA,EAAA,UAAA,CACGC,GAAAA,kBACDV,GAAAA,CAAC6gC,YAAAA,EAAD;IACE,GAAI5gC,GAAAA;IACI,MAAA,EAAA5E,GAAAA;IACM,YAAA,EAAAoG,GAAAA;AACd,IAAA,SAAA,EAAW/E,GAAAA,CAAE,OAAA;IACb,qBAAA,EAAoB,EAAA;IACpB,GAAImE,GAAAA;IAEJ,QAAA,kBAAAb,IAAC8gC,KAAAA,EAAD;MAAU,SAAA,EAAW,CAACpkC,IAAE,KAAA,EAAOkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;MAAG,GAAI4gB,GAAAA;MACvE,QAAA,kBAAAxhB,IAAC+gC,MAAAA,EAAD;QAAiB,IAAA,EAAAxgC,GAAAA;AAAM,QAAA,SAAA,EAAW7D,GAAAA,CAAE,MAAA;QAChC,QAAA,EAAA,CAAA,EAAE,KAAA,EAAAlB,GAAAA,uBACFiB,IAAAA,CAAAgE,QAAAA,EAAA,EAAA,QAAA,EAAA;AACIqC,UAAAA,CAAAA,GAAAA,KAAU,MAAA,IAAa49B,GAAAA,qBACvBjkC,IAAAA,CAAC,QAAA,EAAD;AAAQ,YAAA,SAAA,EAAWC,GAAAA,CAAE,MAAA;AAArB,YAAA,QAAA,EAAA,CACGoG,GAAAA,KAAU,MAAA,oBACT9C,IAACghC,OAAAA,EAAD;cAAS,IAAA,EAAK,OAAA;AAAQ,cAAA,SAAA,EAAWtkC,GAAAA,CAAE,KAAA;cAAQ,QAAA,EAAAoG;AAAe,aAAA,CAAA,EAE3D49B,GAAAA,oBACC1gC,GAAAA,CAAC,QAAA,EAAD;cACE,IAAA,EAAK,QAAA;AACL,cAAA,SAAA,EAAWtD,GAAAA,CAAE,KAAA;cACb,OAAA,EAASukC,GAAAA;cACT,YAAA,EAAW,cAAA;cACZ,QAAA,EAAA;AAEO,aAAA,CAEJ;;AAEV,0BAAAjhC,IAAC,KAAA,EAAD;YAAK,SAAA,EAAW,CAACtD,IAAE,IAAA,EAAMwkC,GAAa,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;YAAI,QAAA,EAAA7jC;WAAc,CAAA;UACjF8jC,GAAAA,KAAW,MAAA,oBAAanhC,GAAAA,CAAC,QAAA,EAAD;AAAQ,YAAA,SAAA,EAAWtD,GAAAA,CAAE,MAAA;YAAS,QAAA,EAAAykC;WAAe;AACtE,SAAA,EAAA;OAEK;KACH;GACE,CACd,GAAA,CAAA;AAEN;;;ACtGA,IAAaC,GAAAA,GAAa;AAM1B,SAAgBC,GAAAA,CAAa7lC,KAAee,GAAAA,EAA4C;AAItF,EAAA,OAAA,CAHkB,MAAA,CAAO,QAAA,CAASwyB,GAAK,CAAA,GACnCA,IAAM,cAAA,CAAe,MAAA,EAAWT,GAAO,CAAA,GACvC,MAAA,CAAOS,GAAK,CAAA,EACC,OAAA,CAAQ,MAAA,QAAgB,CAAA;AAC3C;AAYA,IAAMuS,GAAAA,GAAoC;EAAE,CAAA,EAAG,CAAA;EAAG,CAAA,EAAG,CAAA;EAAG,CAAA,EAAG,CAAA;EAAG,CAAA,EAAG;AAAG,CAAA;AAQpE,SAAgBC,GAAAA,CAAc/lC,GAAAA,EAAe2E,GAAAA,GAAW,CAAA,EAAW;AACjE,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS4uB,GAAK,CAAA,EAAG,OAAOsS,IAAatS,GAAK,CAAA;AACtD,EAAA,IAAMT,GAAAA,GACJ,IAAA,CAAK,GAAA,CAAIS,GAAK,IAAI,GAAA,GACd;IAAE,WAAA,EAAa,KAAA;IAAO,qBAAA,EAAuBL,GAAAA;IAAU,qBAAA,EAAuBA;GAAS,GACvF;IAAE,QAAA,EAAU,SAAA;IAAW,wBAAA,EAA0B,CAAA;IAAG,wBAAA,EAA0B;AAAE,GAAA;AACtF,EAAA,OAAOK,IAAM,cAAA,CAAe,OAAA,EAAST,GAAO,CAAA,CAAE,OAAA,CAAQ,MAAA,QAAgB,CAAA;AACxE;AAWA,SAAgBkT,GAAAA,CAAYhmC,KAAce,GAAAA,EAAqC;AAC7E,EAAA,IAAIklC,GAAAA,EAAO;AACT,IAAA,IAAMC,MAAU5S,GAAAA,CAAK,IAAA,IACf7yB,GAAAA,GAAO0lC,GAAAA,CAAaD,KAASD,GAAK,CAAA;AACxC,IAAA,IAAIxlC,QAAS,MAAA,EAAW;AACtB,MAAA,IAAM2lC,GAAAA,GAAQC,GAAAA,CAAgBH,GAAAA,EAASD,GAAK,CAAA;AAC5C,MAAA,IAAIG,GAAAA,KAAU,UAAaA,GAAAA,CAAM,MAAA,GAAS,GAAG,OAAOE,GAAAA,CAAcF,GAAAA,EAAOF,GAAAA,EAASD,GAAK,CAAA;AACvF,MAAA,IAAM,EAAE,QAAAhlC,GAAAA,EAAQ,MAAA,EAAAG,KAAA,GAAWmlC,GAAAA,CAAQN,GAAAA,CAAMxlC,GAAAA,CAAM,CAAA;AAC/C,MAAA,OAAO+lC,GAAAA,CAAOR,GAAAA,CAAYE,GAAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAACzlC,GAAAA,CAAK,MAAM,CAAC,CAAA,EAAGgmC,GAAM,CAAA,GAAIC,GAAAA;AACvE,IAAA;AACF,EAAA;AACA,EAAA,IAAI3lC,GAAAA,GAAIuyB,GAAAA,CAAK,IAAA,EAAK,CAAE,QAAA,QAAA,EAAoB,GAAG,CAAA,EACrCqT,GAAAA,GAAWb,IAAU/kC,GAAAA,CAAE,KAAA,CAAM,EAAE,CAAA,CAAE,aAAY,CAAA;AAKnD,EAAA,OAJI4lC,GAAAA,KAAa,MAAA,KAAWhiC,GAAAA,GAAI5D,GAAAA,CAAE,MAAM,CAAA,EAAG,EAAE,CAAA,CAAE,OAAA,EAAQ,CAAA,EACnD,iCAAA,CAAkC,IAAA,CAAKA,GAAC,MAAG4D,GAAAA,GAAI5D,GAAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,CAAA,EAChE,IAAA,CAAK,IAAA,CAAKA,GAAC,CAAA,GAET,MAAA,CAAO4lC,GAAAA,KAAa,MAAA,GAAY5lC,MAAI,CAAA,EAAGA,GAAAA,CAAAA,CAAAA,EAAK4lC,GAAAA,EAAU,CAAA,GAFnC,GAAA;AAG5B;AAUA,SAASH,GAAAA,CAAOxmC,KAAWe,GAAAA,EAAwB;AACjD,EAAA,OAAO0lC,GAAAA,GAAS,CAAA,GAAI9hC,GAAAA,IAAK,CAAA,GAAI8hC,OAAU9hC,GAAAA,GAAI8hC,GAAAA;AAC7C;AAGA,SAASF,IAAQvmC,GAAAA,EAA2D;AAC1E,EAAA,OAAO,OAAO+wB,OAAU,QAAA,GACpB;IAAE,MAAA,EAAQA,GAAAA;IAAO,MAAA,EAAQ;GAAE,GAC3B;AAAE,IAAA,MAAA,EAAQA,GAAAA,CAAM,MAAA;AAAQ,IAAA,MAAA,EAAQA,IAAM,MAAA,IAAU;AAAE,GAAA;AACxD;AAOA,SAASsV,GAAAA,CAAgBrmC,KAAce,GAAAA,EAAkD;AACvF,EAAA,IAAM6lC,GAAAA,GAAkB,EAAC,EACrBniC,GAAAA,GAAO6uB,IAAK,OAAA,EAAQ;AACxB,EAAA,OAAO7uB,QAAS,EAAA,IAAI;AAClB,IAAA,IAAMhE,GAAAA,GAAO0lC,GAAAA,CAAa1hC,GAAAA,EAAMwhC,GAAK,CAAA;AACrC,IAAA,IAAIxlC,QAAS,MAAA,EAAW;AACxB,IAAAkE,GAAAA,CAAM,KAAKlE,GAAI,CAAA;AACf,IAAA,IAAMomC,GAAAA,GAASpiC,GAAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAChE,GAAAA,CAAK,MAAM,CAAA,EACnCI,GAAAA,GAAI,2BAAA,CAA4B,IAAA,CAAKgmC,GAAM,CAAA;AACjD,IAAA,IAAI,CAAChmC,GAAAA,EAAG;AACR,IAAA2D,GAAAA,GAAOqiC,GAAAA,CAAO,KAAA,CAAM,CAAA,EAAGhmC,IAAE,KAAK,CAAA,CAAE,OAAA,EAAQ,EAAA,CAEpC4D,QAAS,GAAA,IAAOA,GAAAA,KAAS,GAAA,IAAOA,GAAAA,KAAA,cAAqBD,GAAAA,GAAO,EAAA,CAAA;AAClE,EAAA;AACA,EAAA,OAAOoiC,GAAAA,CAAM,MAAA,KAAW,CAAA,GAAI,MAAA,GAAYA,IAAM,OAAA,EAAQ;AACxD;AAQA,SAASN,GAAAA,CAActmC,GAAAA,EAAiBe,GAAAA,EAAc4D,GAAAA,EAAoC;AACxF,EAAA,IAAMmiC,GAAAA,GAASxT,GAAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA;AAChD,EAAA,IAAI,CAACwT,GAAAA,IAAUA,GAAAA,CAAO,MAAA,KAAWF,GAAAA,CAAM,QAAQ,OAAO,GAAA;AACtD,EAAA,IAAMv0B,MAAO,eAAA,CAAgB,IAAA,CAAKihB,GAAI,CAAA,GAAI,EAAA,GAAK,GAC3C9oB,GAAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAW,CAACvJ,GAAAA,EAAGR,GAAAA,CAAAA,IAASmmC,GAAAA,CAAM,SAAQ,EAAG;AACvC,IAAA,IAAM,EAAE,QAAA5mC,GAAAA,EAAQ,MAAA,EAAAC,KAAA,GAAWsmC,GAAAA,CAAQN,GAAAA,CAAMxlC,GAAAA,CAAM,CAAA;AAC/C,IAAA,IAAIimC,GAAAA,KAAW,GAAG,OAAO,GAAA;AACzB,IAAAjgC,OAAS+/B,GAAAA,CAAO,MAAA,CAAOM,IAAO7lC,GAAAA,CAAE,GAAGwlC,GAAM,CAAA;AAC3C,EAAA;AACA,EAAA,OAAOp0B,GAAAA,GAAO7H,GAAAA;AAChB;AAGA,SAAS27B,GAAAA,CAAanmC,KAAce,GAAAA,EAAgD;AAClF,EAAA,IAAM6lC,GAAAA,GAAQ,OAAO,IAAA,CAAKX,GAAK,EAAE,MAAA,CAAA,CAAQjmC,GAAAA,KAAM2E,GAAAA,KAAM,EAAE,CAAA,CAAE,KAAA,CAAM3E,GAAAA,EAAGe,QAAMwC,GAAAA,CAAE,MAAA,GAASkD,IAAE,MAAM,CAAA,EACrFsgC,GAAAA,GAAQzT,GAAAA,CAAK,WAAA,EAAY;AAC/B,EAAA,OAAOsT,IAAM,IAAA,CAAA,CAAM7lC,QAAMuyB,GAAAA,CAAK,QAAA,CAAS3uB,GAAC,CAAC,CAAA,IAAKiiC,GAAAA,CAAM,IAAA,CAAA,CAAM5mC,GAAAA,KAAM+mC,GAAAA,CAAM,SAASpiC,GAAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AACjG;;;;;;;IC5HaqiC,GAAAA,GAAWjjB,UAAAA,CAAW,SACjCvf,GAAAA,EACAmE,GAAAA,EACA;AACA,EAAA,IAAM,EAAE,QAAA,EAAAzH,GAAAA,EAAU,WAAAjB,GAAAA,EAAW,GAAGwE,KAAAA,GAASC,GAAAA;AACzC,EAAA,uBACE3D,IAACkmC,QAAAA,EAAD;IACE,GAAIxiC,GAAAA;IACC,GAAA,EAAAkE,GAAAA;IACL,SAAA,EAAW,CAACzH,IAAE,QAAA,EAAUkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAEzD,IAAA,QAAA,EAAA,CAAA,EAAE,eAAA,EAAAZ,GAAAA,EAAA,qBACFG,IAAAA,CAAAM,QAAAA,EAAA,EAAA,QAAA,EAAA,iBACElE,IAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWG,GAAAA,CAAE,GAAA;MACjB,QAAA,kBAAAH,IAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAWG,GAAAA,CAAE,SAAA;QAAW,OAAA,EAAQ,WAAA;QAAY,aAAA,EAAY,MAAA;QAC1D,QAAA,EAAAgmC,GAAAA,mBACCnmC,GAAAA,CAAC,MAAA,EAAD;UAAM,EAAA,EAAG,GAAA;UAAI,EAAA,EAAG,GAAA;UAAI,EAAA,EAAG,IAAA;UAAK,EAAA,EAAG,GAAA;UAAI,MAAA,EAAO,cAAA;UAAe,WAAA,EAAY,GAAA;UAAI,aAAA,EAAc;SAAS,CAAA,mBAEhGA,GAAAA,CAAC,UAAA,EAAD;UACE,MAAA,EAAO,qBAAA;UACP,IAAA,EAAK,MAAA;UACL,MAAA,EAAO,cAAA;UACP,WAAA,EAAY,GAAA;UACZ,aAAA,EAAc,OAAA;UACd,cAAA,EAAe;SAChB;OAEA;AACD,KAAA,CAAA,EACLwE,GAAAA,KAAa,MAAA,oBAAaxE,IAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWG,GAAAA,CAAE,KAAA;MAAQ,QAAA,EAAAA;KAAe,CACrE,GAAA;GAEO,CAAA;AAEjB,CAAC;;;;;;;;AC7BD,SAAgBimC,GAAAA,CAAM,EAAE,WAAA,EAAAxiC,GAAAA,GAAc,WAAW,SAAA,EAAAH,GAAAA,EAAW,QAAA,EAAAvD,GAAAA,EAAA,EAAwB;AAClF,EAAA,IAAM2F,GAAAA,GAAM;IAAC1F,GAAAA,CAAE,KAAA;AAAO2F,IAAAA,GAAAA,KAAgB,SAAS3F,GAAAA,CAAE,GAAA;AAAKkE,IAAAA;AAAS,GAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACzF,EAAA,uBAAOpF,IAAC,KAAA,EAAD;IAAK,SAAA,EAAW4G,GAAAA;IAAM,QAAA,EAAA3F;GAAc,CAAA;AAC7C;AAMA,IAAammC,GAAAA,GAAe;AAC1B,EAAA,IAAA,EAAMlmC,GAAAA,CAAE,KAAA;AACR,EAAA,GAAA,EAAKA,GAAAA,CAAE,GAAA;AACP,EAAA,KAAA,EAAOA,GAAAA,CAAE,KAAA;AACT,EAAA,IAAA,EAAMA,GAAAA,CAAE,IAAA;AACR,EAAA,KAAA,EAAOA,GAAAA,CAAE;AACX;;;;;;;;;;;;;;;;;;;;;;ACaA,SAASmmC,GACPrnC,GAAAA,EAC+B;AAC/B,EAAA,OAAO,SAAA,IAAa+wB,GAAAA;AACtB;AA4EA,SAAgBuW,GAA+B3+B,GAAAA,EAAuB;AACpE,EAAA,IAAM,EACJ,KAAA,EAAAzH,GAAAA,EACA,WAAA,EAAAjB,MAAc,SAAA,EACd,WAAA,EAAAkB,GAAAA,EACA,YAAA,EAAAN,KACA,WAAA,EAAAmd,GAAAA,EACA,OAAA,EAAAne,GAAAA,EACA,UAAAmkB,GAAAA,EACA,WAAA,EAAAC,GAAAA,EACA,kBAAA,EAAAC,GAAAA,EACA,iBAAA,EAAAtkB,GAAAA,EACA,KAAA,EAAAqW,MAAQ,MAAA,EACR,OAAA,EAAA2R,EAAAA,GAAU,OAAA,EACV,WAAA2f,EAAAA,GAAY7+B,EAAAA,KAAY,MAAA,GAAS,WAAA,GAAc,WAC/C,KAAA,EAAA9G,EAAAA,GAAQ,MAAA,EACR,SAAA,EAAA0L,EAAAA,EACA,SAAA,EAAA4I,EAAAA,EACA,eAAA,EAAA6uB,IACA,QAAA,EAAAlP,EAAAA,EACA,OAAA,EAAA2R,EAAAA,EACA,GAAG/iC,EAAAA,EAAAA,GACDC,GAAAA,EAEE,EAAE,QAAA+iC,EAAAA,EAAQ,WAAA,EAAAC,EAAAA,EAAA,GAAgB3jC,GAAiBiB,EAAe,CAAA,EAC1D2iC,EAAAA,GAAaj+B,MAAAA,CAA0B,IAAI,CAAA,EAC3Ck+B,EAAAA,GAAWl+B,MAAAA,CAAqB,IAAI,GACpC,CAACm+B,EAAAA,EAAOC,EAAAA,CAAAA,GAAY5jC,SAAS6jC,EAAQ,CAAA;AAE3C,EAAA,uBACEthC,KAACuhC,MAAAA,EAAD;IACE,GAAIvjC,EAAAA;IACS,WAAA,EAAAwf,GAAAA;IACO,kBAAA,EAAAC,GAAAA;AACpB,IAAA,iBAAA,EAAmB+jB,GAAAA,GAAAA,CAAqBjoC,GAAAA,KAAMioC,GAAAA,CAAkBroC,GAAM,CAAA,GAAI,MAAA;IAC1E,SAAA,EAAW;MACTsB,EAAAA,CAAE,KAAA;AACFuzB,MAAAA,GAAAA,KAAU,SAASvzB,EAAAA,CAAE,GAAA;AACrBwH,MAAAA,EAAAA,KAAY,UAAUxH,EAAAA,CAAE,IAAA;AACxBkuB,MAAAA,EAAAA,KAAc,eAAeluB,EAAAA,CAAE,UAAA;AAC/BkuB,MAAAA,EAAAA,KAAc,UAAUluB,EAAAA,CAAE,KAAA;MAC1BkmC,GAAAA,CAAa,IAAA;AACbvgC,MAAAA,GAAAA,KAAgB,SAASugC,GAAAA,CAAa,GAAA;AACtCvgC,MAAAA,GAAAA,KAAgB,SAAS3F,EAAAA,CAAE,GAAA;AAC3BkE,MAAAA;AACF,KAAA,CACG,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;IAjBb,QAAA,EAAA;AAmBGF,MAAAA,EAAAA;MACAxD,GAAAA,KAAU,MAAA,oBAAaT,GAAAA,CAACinC,KAAAA,EAAD;AAAO,QAAA,SAAA,EAAW,CAAA,EAAGd,GAAAA,CAAa,KAAA,CAAA,CAAA,EAASlmC,GAAE,KAAA,CAAA,CAAA;QAAU,QAAA,EAAAQ;OAAa,CAAA;AAC5F,sBAAAT,IAACgoB,EAAAA,EAAD;AACE,QAAA,OAAA,EAASH,EAAAA,CAAsB;UAAE,OAAA,EAAA0e,EAAAA;UAAS,QAAA,EAAA3R,EAAAA;AAAU,UAAA,SAAA,EAAWpxB,GAAK,YAAA,CAAA;UAAe,KAAA,EAAAvD;SAAO,CAAA;AAC1F,QAAA,QAAA,EAAUuD,EAAAA,CAAK,UAAA;QAEf,QAAA,kBAAAgC,KAAC0hC,MAAAA,EAAD;UACE,EAAA,EAAIC,EAAAA;UACJ,GAAA,EAAKT,EAAAA;AACL,UAAA,SAAA,EAAWzmC,EAAAA,CAAE,OAAA;AACb,UAAA,aAAA,EAAA,CAAgBlB,GAAAA,KAAM;AACpB,YAAAk6B,GAAS,OAAA,GAAU;AAAE,cAAA,CAAA,EAAGl6B,GAAAA,CAAE,OAAA;AAAS,cAAA,CAAA,EAAGA,GAAAA,CAAE,OAAA;AAAS,cAAA,EAAA,EAAI,YAAY,GAAA;AAAM,aAAA;AACzE,UAAA,CAAA;UANF,QAAA,EAAA;AAQE,4BAAAiB,IAAConC,WAAAA,EAAD;AAAa,cAAA,SAAA,EAAWnnC,EAAAA,CAAE,KAAA;cACtB,QAAA,EAAA,CAAA,EAAE,eAAA,EAAAlB,GAAAA,EAAiB,eAAAe,GAAAA,EAAA,KACnBunC,GAAAA,GAAiBC,GAAAA,IAAeC,GAAAA,GAAmBA;aAE1C,CAAA;YACZ/T,GAAAA,KAAU,KAAA,oBACThuB,IAAAA,CAAC,MAAA,EAAD;AAAM,cAAA,SAAA,EAAWvF,EAAAA,CAAE,KAAA;cAAO,aAAA,EAAY,MAAA;AAAtC,cAAA,QAAA,EAAA,CACGqnC,GAAAA,KAAgB,MAAA,oBAAatnC,GAAAA,CAAC,QAAD,EAAA,QAAA,EAAOsnC,GAAAA,EAAkB,GACtDE,EAAAA,CAAa3V,GAAAA,EAASvtB,GAAQ,CAAA,CAAE,IAAA,CAAKvF,GAAAA,EAAGe,GAAAA,qBACvC0F,KAAC,MAAA,EAAD,EAAA,QAAA,EAAA,iBACExF,GAAAA,CAACynC,EAAAA,EAAD,EAAY,GACXvnC,GACG,CAAA,EAAA,EAHKF,GAGL,CACP,CACG;;YAEPmuB,EAAAA,KAAc,SAAA,oBACbnuB,GAAAA,CAAC,KAAA,EAAD;AAAK,cAAA,SAAA,EAAWC,EAAAA,CAAE,OAAA;cAAS,OAAA,EAAQ,WAAA;cAAY,aAAA,EAAY,MAAA;cACzD,QAAA,kBAAAD,IAAC,MAAA,EAAD;gBAAM,CAAA,EAAE,gBAAA;gBAAiB,IAAA,EAAK,MAAA;gBAAO,MAAA,EAAO,cAAA;gBAAe,WAAA,EAAY,KAAA;gBAAM,aAAA,EAAc,OAAA;gBAAQ,cAAA,EAAe;eAAS;aACxH;AAEE;;OACG,CAAA;MACf0nC,GAAAA,KAAgB,MAAA,oBACf1nC,GAAAA,CAAC2nC,IAAAA,EAAD;QAAM,IAAA,EAAK,aAAA;AAAc,QAAA,SAAA,EAAW,CAAA,EAAGxB,GAAAA,CAAa,IAAA,CAAA,CAAA,EAAQlmC,GAAE,KAAA,CAAA,CAAA;QAC3D,QAAA,EAAAynC;OACG,CAAA;AAER,sBAAA1nC,IAAC4nC,UAAAA,EAAD;AAAY,QAAA,SAAA,EAAW,CAAA,EAAGzB,GAAAA,CAAa,KAAA,CAAA,CAAA,EAASlmC,GAAE,KAAA,CAAA,CAAA;QAAU,QAAA,EAAA4nC;OAAyB,CAAA;AAOrF,sBAAAriC,KAACsiC,OAAAA,EAAD;AACE,QAAA,SAAA,EAAW7nC,EAAAA,CAAE,OAAA;QACb,qBAAA,EAAoB,EAAA;QACpB,SAAA,EAAU,cAAA;QACV,MAAA,EAAQ8nC,EAAAA,KAAU,MAAA,GAASnB,EAAAA,CAAM,MAAA,GAAS,MAAA;QAC1C,WAAA,EAAamB,EAAAA,KAAU,MAAA,GAASnB,EAAAA,CAAM,WAAA,GAAc,MAAA;AACpD,QAAA,UAAA,EAAYmB,EAAAA,KAAU,MAAA;QACtB,GAAI3jC,EAAAA;AAPN,QAAA,QAAA,EAAA,CASG2jC,EAAAA,KAAU,MAAA,oBACT/nC,IAACgoC,EAAAA,EAAD;UACc,UAAA,EAAAhP,EAAAA;UACF,QAAA,EAAAC,EAAAA;UACV,OAAA,EAAS2N,EAAAA;UACT,SAAA,EAAWC;SACZ,CAAA,kBAEH7mC,GAAAA,CAACioC,OAAAA,EAAD;AAAY,UAAA,SAAA,EAAWhoC,EAAAA,CAAE,OAAA;AACtB,UAAA,QAAA,EAAA4xB,GAAAA,KAAY,MAAA,GAUTvtB,GAAAA,GATAutB,GAAAA,CAAQ,GAAA,CAAA,CAAK9yB,GAAAA,EAAOe,GAAAA,KAClBsmC,EAAAA,CAAQtW,GAAK,CAAA,mBACX9vB,IAACkoC,EAAAA,EAAD;AAAoC,YAAA,KAAA,EAAOpY,GAAAA,CAAM,KAAA;YAC9C,QAAA,EAAAA,GAAAA,CAAM,OAAA,CAAQ,GAAA,CAAIqY,EAAY;AAClB,WAAA,EAFK,WAAWnoC,GAAAA,CAAAA,CAEhB,CAAA,GAEfmoC,EAAAA,CAAarY,GAAK,CAEtB;AAEM,SAAA,CACF;;AACH;;AAEf;AAQA,IAAMsY,EAAAA,GAAW,GAAA;AAAjB,IACMC,EAAAA,GAAa,CAAA;AADnB,IAGMvB,EAAAA,GAAkB;EAAE,MAAA,EAAQ,CAAA;EAAG,WAAA,EAAa;AAAE,CAAA;AAHpD,IAOMwB,EAAAA,GAAO,EAAA;AAPb,IAUMC,EAAAA,GAAe;EAAE,MAAA,EAAQ,CAAA;EAAG,WAAA,EAAa;AAAE,CAAA;AAYjD,SAASP,EAAAA,CAAiB,EACxB,UAAA,EAAAjpC,GAAAA,EACA,QAAA,EAAAe,KACA,OAAA,EAAA4D,GAAAA,EACA,SAAA,EAAAH,GAAAA,EAAA,EAMC;AAGD,EAAA,IAAMilC,MAAY//B,MAAAA,CAAwB,IAAI,CAAA,EAIxCggC,GAAAA,GAAShgC,OAAO,CAAC,CAAA;AAwEvB,EAAA,OAvEAV,gBAAAA,MAAsB;AACpB,IAAA,IAAM2gC,MAAUhC,GAAAA,CAAW,OAAA,EACrBiC,MAAUH,GAAAA,CAAU,OAAA,EAAS,QAAqB,uBAAuB,CAAA;AAC/E,IAAA,IAAI,CAACE,GAAAA,IAAW,CAACC,GAAAA,IAAWF,GAAAA,CAAO,UAAU,CAAA,EAAG;AAChD,IAAA,IAAMnW,GAAAA,GAAQoW,GAAAA,CAAQ,aAAA,CAAc,CAAA,CAAA,EAAIzoC,GAAE,KAAA,CAAA,CAAO,CAAA,EAI3CQ,GAAAA,GAAQkoC,GAAAA,CAAQ,aAAA,CAAc,CAAA,iBAAA,EAAoB1oC,EAAAA,CAAE,WAAA,CAAA,CAAa,CAAA;AACvE,IAAA,IAAI,CAACqyB,GAAAA,IAAS,CAAC7xB,GAAAA,EAAO;AACpB,MAAA,CAAImoC,GAAAA,CAAQ,WAAWL,EAAAA,CAAM,MAAA,IAAUK,IAAQ,WAAA,KAAgBL,EAAAA,CAAM,WAAA,KACnEM,GAAAA,CAAUN,EAAK,CAAA;AACjB,MAAA;AACF,IAAA;AAKA,IAAA,IAAMO,GAAAA,GAAQ,gBAAA,CAAiBJ,GAAO,CAAA,CAAE,gBAAA,CAAiB,oBAAoB,CAAA,CAAE,IAAA,EAAK,EAC9EK,GAAAA,GAAQD,GAAAA,KAAU,OAAA,IAAWA,GAAAA,KAAU,KAAA;AAC7C,IAAA9oC,GAAAA,CAAQ,OAAA,CAAQ,KAAA,GAAQ+oC,GAAAA,GAAQ,KAAA,GAAQ,OAAA;AAQxC,IAAA,IAAMlhC,MAAM8gC,GAAAA,CAAQ,qBAAA,IACdK,GAAAA,GAAON,GAAAA,CAAQ,uBAAsB,EACrCje,GAAAA,GAAMhqB,IAAM,qBAAA,EAAsB,EAClC87B,MAAQjK,GAAAA,CAAM,qBAAA,IAId2W,GAAAA,GAAO1M,GAAAA,CAAM,MAAMA,GAAAA,CAAM,MAAA,GAAS,IAAIyM,GAAAA,CAAK,GAAA,IAAOve,IAAI,GAAA,GAAMA,GAAAA,CAAI,SAAS,CAAA,GAAI5iB,GAAAA,CAAI,OAAOmhC,GAAAA,CAAK,MAAA,EAE7FE,MADaR,GAAAA,CAAQ,aAAA,CAAc,gBAAgB,YAAA,GAC7BJ,EAAAA,GAAOzgC,IAAI,MAAA,GAASmhC,GAAAA,CAAK,QAC/C7+B,GAAAA,GAAO;MACX,MAAA,EAAQ,IAAA,CAAK,IAAIm+B,EAAAA,GAAOU,GAAAA,CAAK,QAAQ,IAAA,CAAK,GAAA,CAAIC,GAAAA,EAAMC,GAAM,CAAC,CAAA;AAC3D,MAAA,WAAA,EAAaH,GAAAA,GACTxM,GAAAA,CAAM,KAAA,GAAQyM,GAAAA,CAAK,QAAQve,GAAAA,CAAI,KAAA,GAAQ5iB,GAAAA,CAAI,IAAA,CAAA,GAC3C00B,IAAM,IAAA,GAAOyM,GAAAA,CAAK,IAAA,IAAQve,GAAAA,CAAI,OAAO5iB,GAAAA,CAAI,IAAA;AAC/C,KAAA;AACI,IAAA,IAAA,CAAK,IAAIsC,GAAAA,CAAK,MAAA,GAASy+B,IAAQ,MAAM,CAAA,GAAI,OAAO,IAAA,CAAK,GAAA,CAAIz+B,IAAK,WAAA,GAAcy+B,GAAAA,CAAQ,WAAW,CAAA,GAAI,GAAA,KAEvGlhC,IAAO,OAAA,IAAW,CAAA,EAClBmhC,IAAU1+B,GAAI,CAAA,CAAA;EAChB,CAAC,CAAA,EAQDypB,UAAAA,MAAgB;AACd,IAAA,IAAMuV,GAAAA,GAAMzC,IAAW,OAAA,EAAS,aAAA;AAChC,IAAA,IAAI,CAACyC,GAAAA,EAAK;AACV,IAAA,IAAMC,GAAAA,GAAAA,CAAQrqC,GAAAA,KAAoB;AAChC,MAAA2E,GAAAA,CAAI,mBAAA,CAAoB,WAAA,EAAa0lC,GAAAA,EAAM,IAAI,CAAA;AAC/C,MAAA,IAAMC,MAAQ1C,GAAAA,CAAS,OAAA;AACnB,MAAA,CAAC0C,GAAAA,IAAS,YAAY,GAAA,EAAI,GAAIA,IAAM,EAAA,GAAKjB,EAAAA,IACzC,IAAA,CAAK,KAAA,CAAMrpC,GAAAA,CAAE,OAAA,GAAUsqC,IAAM,CAAA,EAAGtqC,GAAAA,CAAE,OAAA,GAAUsqC,GAAAA,CAAM,CAAC,CAAA,GAAIhB,OAC3DtpC,GAAAA,CAAE,cAAA,EAAe,EACjBA,GAAAA,CAAE,eAAA,EAAgB,CAAA;AACpB,IAAA,CAAA;AAEA,IAAA,OADAoqC,GAAAA,CAAI,gBAAA,CAAiB,WAAA,EAAaC,GAAAA,EAAM,IAAI,CAAA,EAAA,MAC/BD,GAAAA,CAAI,mBAAA,CAAoB,WAAA,EAAaC,GAAAA,EAAM,IAAI,CAAA;AAC9D,EAAA,CAAA,EAAG,CAAC1C,GAAAA,EAAYC,GAAQ,CAAC,CAAA,kBAElB3mC,IAAC,MAAA,EAAD;IAAM,GAAA,EAAKwoC,GAAAA;IAAW,MAAA,EAAA;GAAQ,CAAA;AACvC;AAIA,SAASf,EAAAA,GAAY;AACnB,EAAA,uBACEznC,IAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWC,EAAAA,CAAE,KAAA;IAAO,OAAA,EAAQ,WAAA;IAAY,aAAA,EAAY,MAAA;IACvD,QAAA,kBAAAD,IAAC,UAAA,EAAD;MAAU,MAAA,EAAO,mBAAA;MAAoB,IAAA,EAAK,MAAA;MAAO,MAAA,EAAO,cAAA;MAAe,WAAA,EAAY,KAAA;MAAM,aAAA,EAAc,OAAA;MAAQ,cAAA,EAAe;KAAS;GACpI,CAAA;AAET;AAEA,SAASmoC,GAA4BppC,GAAAA,EAAgC;AACnE,EAAA,uBACEiB,IAACspC,EAAAA,EAAD;AAAkC,IAAA,EAAA,EAAI5hC,GAAAA,CAAE,KAAA;AAAO,IAAA,UAAA,EAAYA,GAAAA,CAAE,UAAA;AAAY,IAAA,SAAA,EAAWA,GAAAA,CAAE,SAAA;AACnF,IAAA,QAAA,EAAAA,GAAAA,CAAE;GACO,EAFK,MAAA,CAAOA,GAAAA,CAAE,KAAK,CAEnB,CAAA;AAEhB;AAOA,SAAS8/B,EAAAA,CACPzoC,KACAe,GAAAA,EACa;AAGb,EAAA,OAFI+xB,GAAAA,KAAY,SAET0X,QAAAA,CAAS,OAAA,CAAQjlC,GAAQ,CAAA,CAAE,OAAA,CAAA,CAASvF,GAAAA,KACpCyqC,cAAAA,CAAyCxqC,GAAC,CAAA,GACxCA,GAAAA,CAAE,SAASkpC,EAAAA,GAAgBV,EAAAA,CAAa,QAAWxoC,GAAAA,CAAE,KAAA,CAAM,QAAQ,CAAA,GAAI,CAACA,GAAAA,CAAE,MAAM,QAAQ,CAAA,GADtC,CAACA,GAAC,CAE5D,IAJQ6yB,GAAAA,CAAQ,OAAA,CAAA,CAAS9yB,GAAAA,KAAO,SAAA,IAAa2I,GAAAA,GAAIA,IAAE,OAAA,CAAQ,GAAA,CAAA,CAAK3I,GAAAA,KAAM+T,GAAAA,CAAE,KAAK,CAAA,GAAI,CAACpL,GAAAA,CAAE,KAAK,CAAE,CAAA;AAK9F;AAYA,SAAgBwgC,EAAAA,CAAc,EAAE,KAAA,EAAAnpC,GAAAA,EAAO,UAAAe,GAAAA,EAAU,SAAA,EAAA4D,KAAA,EAAiC;AAChF,EAAA,uBACE8B,KAACikC,cAAAA,EAAD;IAAmB,SAAA,EAAW,CAACxpC,GAAE,OAAA,EAASkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAA7E,IAAA,QAAA,EAAA,CACGkC,GAAAA,KAAU,MAAA,oBAAarG,IAAC0pC,MAAAA,EAAD;AAAQ,MAAA,SAAA,EAAWzpC,EAAAA,CAAE,aAAA;MAAgB,QAAA,EAAAoG;AAAc,KAAA,GAC1E/B,GACgB;;AAEvB;AAeA,SAASqlC,EAAAA,CAAY5qC,KAAqBe,GAAAA,EAAkD;AAE1F,EAAA,OADIuD,GAAAA,KAAa,MAAA,GACV,OAAOiB,GAAAA,IAAa,QAAA,IAAY,OAAOA,GAAAA,IAAa,QAAA,GACvD,MAAA,CAAOA,GAAQ,CAAA,GACf,MAAA,GAH+BjB,GAAAA;AAIrC;AAOA,SAAgBimC,EAAAA,CAAW,EAAE,QAAA,EAAAvqC,GAAAA,EAAU,SAAA,EAAAe,KAAW,SAAA,EAAA4D,GAAAA,EAAW,GAAGF,GAAAA,EAAAA,EAAyB;AACvF,EAAA,uBACEgC,KAACokC,WAAAA,EAAD;IACE,GAAIpmC,GAAAA;IACJ,SAAA,EAAWmmC,EAAAA,CAAYrlC,KAAUulC,GAAS,CAAA;IAC1C,SAAA,EAAW,CAAC5pC,GAAE,MAAA,EAAQkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAH3D,QAAA,EAAA,iBAKEnE,GAAAA,CAACynC,EAAAA,EAAD,EAAY,CAAA,kBAGZznC,GAAAA,CAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWC,EAAAA,CAAE,WAAA;MAAc,QAAA,EAAAlB;AAAe,KAAA,CAClC;;AAEpB;;;;;;;;;ICzba+qC,GAAAA,GAAQhnB,UAAAA,CAAW,SAC9Bvf,GAAAA,EACApD,GAAAA,EACA;AACA,EAAA,IAAM,EACJ,OAAAC,GAAAA,EACA,WAAA,EAAAyD,MAAc,SAAA,EACd,WAAA,EAAAjD,KACA,YAAA,EAAAhB,GAAAA,EACA,aAAAkE,GAAAA,EACA,gBAAA,EAAAgP,KACA,iBAAA,EAAAiK,GAAAA,EACA,WAAAne,GAAAA,EACA,GAAGmrC,KAAAA,GACDtmC,GAAAA;AAEJ,EAAA,uBACEC,KAACsmC,SAAAA,EAAD;IACE,GAAID,GAAAA;IACJ,SAAA,EAAW;MACT9pC,GAAAA,CAAE,KAAA;MACFkmC,GAAAA,CAAa,IAAA;AACbvgC,MAAAA,GAAAA,KAAgB,SAASugC,GAAAA,CAAa,GAAA;AACtCvgC,MAAAA,GAAAA,KAAgB,SAAS3F,GAAAA,CAAE,GAAA;AAC3BkE,MAAAA;AACF,KAAA,CACG,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;IAVb,QAAA,EAAA;MAYG1D,GAAAA,KAAU,MAAA,oBAAaX,GAAAA,CAACmnC,KAAAA,EAAD;AAAO,QAAA,SAAA,EAAW,CAAA,EAAGd,GAAAA,CAAa,KAAA,CAAA,CAAA,EAASlmC,IAAE,KAAA,CAAA,CAAA;QAAU,QAAA,EAAAQ;OAAa,CAAA;AAC5F,sBAAAiD,KAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAWzD,GAAAA,CAAE,KAAA;QAAlB,QAAA,EAAA;UACGgqC,GAAAA,KAAqB,MAAA,oBAAanqC,GAAAA,CAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAWG,GAAAA,CAAE,SAAA;YAAY,QAAA,EAAAgqC;WAAuB,CAAA;AACzF,0BAAAnqC,IAACoqC,KAAAA,EAAD;YAAe,GAAA,EAAA/pC,GAAAA;YAAkB,WAAA,EAAA2D;WAAc,CAAA;UAC9CqmC,GAAAA,KAAsB,MAAA,oBAAarqC,GAAAA,CAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAWG,GAAAA,CAAE,SAAA;YAAY,QAAA,EAAAkqC;WAAwB;AACxF;;MACJzC,GAAAA,KAAgB,MAAA,oBACf5nC,GAAAA,CAAC6nC,IAAAA,EAAD;QAAM,IAAA,EAAK,aAAA;AAAc,QAAA,SAAA,EAAW,CAAA,EAAGxB,GAAAA,CAAa,IAAA,CAAA,CAAA,EAAQlmC,IAAE,KAAA,CAAA,CAAA;QAC3D,QAAA,EAAAynC;OACG,CAAA;AAER,sBAAA5nC,IAAC8nC,UAAAA,EAAD;AAAY,QAAA,SAAA,EAAW,CAAA,EAAGzB,GAAAA,CAAa,KAAA,CAAA,CAAA,EAASlmC,IAAE,KAAA,CAAA,CAAA;QAAU,QAAA,EAAA4nC;OAAyB;AAC5E;;AAEf,CAAC;;;;;;;;;;;;IC7BYuC,EAAAA,GAActnB,UAAAA,CAAW,SACpC/jB,GAAAA,EACAe,GAAAA,EACA;AACA,EAAA,IAAM,EACJ,OAAA0F,GAAAA,EACA,WAAA,EAAAkC,MAAc,SAAA,EACd,WAAA,EAAAzH,GAAAA,EACA,YAAA,EAAA6S,GAAAA,EACA,YAAA,EAAAiK,KACA,KAAA,EAAAne,GAAAA,EACA,WAAA,EAAAoG,GAAAA,EACA,KAAA,EAAA1C,GAAAA,GAAQ,QACR,SAAA,EAAA2C,GAAAA,EACA,GAAGzB,GAAAA,EAAAA,GACDC,GAAAA;AACJ,EAAA,uBACEzD,KAACqqC,WAAAA,EAAD;IACE,GAAI7mC,GAAAA;IACJ,SAAA,EAAW;MACTvD,EAAAA,CAAE,KAAA;AACFuzB,MAAAA,GAAAA,KAAU,SAASvzB,EAAAA,CAAE,GAAA;MACrBkmC,GAAAA,CAAa,IAAA;AACbvgC,MAAAA,GAAAA,KAAgB,SAASugC,GAAAA,CAAa,GAAA;AACtCvgC,MAAAA,GAAAA,KAAgB,SAAS3F,EAAAA,CAAE,GAAA;AAC3BkE,MAAAA;AACF,KAAA,CACG,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;IAXb,QAAA,EAAA;MAaG1D,GAAAA,KAAU,MAAA,oBAAa8C,GAAAA,CAAC0jC,KAAAA,EAAD;AAAO,QAAA,SAAA,EAAW,CAAA,EAAGd,GAAAA,CAAa,KAAA,CAAA,CAAA,EAASlmC,GAAE,KAAA,CAAA,CAAA;QAAU,QAAA,EAAAQ;OAAa,CAAA;AAC5F,sBAAAT,KAACsqC,KAAAA,EAAD;QAAO,SAAA,EAAWC,GAAAA,GAAQ,GAAGtqC,EAAAA,CAAE,KAAA,IAASA,EAAAA,CAAE,KAAA,KAAUA,EAAAA,CAAE,KAAA;QAAtD,QAAA,EAAA,iBACEsD,GAAAA,CAAC2mC,KAAAA,EAAD;UAAe,GAAA,EAAApqC,GAAAA;UAAkB,WAAA,EAAAkF;AAAc,SAAA,CAAA,EAC9C,CAACwlC,GAAAA,oBACAxqC,KAAC,KAAA,EAAD;AAAK,UAAA,SAAA,EAAWC,EAAAA,CAAE,QAAA;UAAlB,QAAA,EAAA,iBACEsD,GAAAA,CAAC2jC,MAAAA,EAAD;YAAW,IAAA,EAAK,WAAA;AAAY,YAAA,SAAA,EAAWjnC,EAAAA,CAAE,OAAA;YAAS,YAAA,EAAW,WAAA;YAAY,QAAA,EAAA;WAAY,CAAA,kBACrFsD,GAAAA,CAAC2jC,MAAAA,EAAD;YAAW,IAAA,EAAK,WAAA;AAAY,YAAA,SAAA,EAAWjnC,EAAAA,CAAE,OAAA;YAAS,YAAA,EAAW,WAAA;YAAY,QAAA,EAAA;AAAY,WAAA,CAClF;AAEF,SAAA,CAAA;;MACNynC,GAAAA,KAAgB,MAAA,oBACfnkC,GAAAA,CAACokC,IAAAA,EAAD;QAAM,IAAA,EAAK,aAAA;AAAc,QAAA,SAAA,EAAW,CAAA,EAAGxB,GAAAA,CAAa,IAAA,CAAA,CAAA,EAAQlmC,GAAE,KAAA,CAAA,CAAA;QAC3D,QAAA,EAAAynC;OACG,CAAA;AAER,sBAAAnkC,IAACqkC,UAAAA,EAAD;AAAY,QAAA,SAAA,EAAW,CAAA,EAAGzB,GAAAA,CAAa,KAAA,CAAA,CAAA,EAASlmC,GAAE,KAAA,CAAA,CAAA;QAAU,QAAA,EAAA4nC;OAAyB;AACvE;;AAEpB,CAAC;ACjED,SAAgB4C,EAAAA,CAAU,EACxB,KAAA,EAAAzqC,GAAAA,EACA,QAAA,EAAAwF,GAAAA,EACA,QAAA,EAAAxG,GAAAA,EACA,QAAA,EAAAkB,GAAAA,EACA,IAAA,EAAAC,GAAAA,GAAO,CAAA,EACP,SAAAC,GAAAA,EACA,WAAA,EAAAyD,GAAAA,EACA,KAAA,EAAAjD,GAAAA,EACA,KAAA,EAAAhB,GAAAA,GAAQ,MAAA,EACR,SAAA,EAAAkT,GAAAA,EACA,YAAA,EAAckR,GAAAA,EAAAA,EACG;AACjB,EAAA,IAAM,CAAC0mB,GAAAA,EAAOC,GAAAA,CAAAA,GAAY1nC,QAAAA,CAAwB,IAAI,CAAA,EAChD2nC,GAAAA,GAAWniC,MAAAA,CAAO,KAAK,GACvB4pB,GAAAA,GAAO,MAAA,CAAO,SAASC,GAAK,CAAA,GAC9BsS,IAAatS,GAAAA,EAAO;IAAE,WAAA,EAAa,KAAA;IAAO,qBAAA,EAAuB;AAAG,GAAC,IACrE,EAAA,EACEuY,GAAAA,GAAAA,CAAS9rC,GAAAA,KACb,IAAA,CAAK,IAAI+rC,GAAAA,IAAY,QAAA,EAAU,IAAA,CAAK,GAAA,CAAIC,OAAY,CAAA,QAAA,EAAWrnC,GAAC,CAAC,CAAA,EAC7DsnC,GAAAA,GAAAA,CAAUjsC,GAAAA,KAAc;AAC5B,IAAA,IAAMoL,GAAAA,GAAO0gC,IAAMnnC,GAAC,CAAA;AAChByG,IAAAA,GAAAA,KAASmoB,GAAAA,IAAOmR,GAAAA,CAASt5B,GAAI,CAAA;AACnC,EAAA,CAAA;AAEA,EAAA,uBACE5G,IAAC,KAAA,EAAD;IACE,SAAA,EAAW;MAACtD,EAAAA,CAAE,KAAA;AAAOuzB,MAAAA,GAAAA,KAAU,SAASvzB,EAAAA,CAAE,GAAA;MAAKkmC,GAAAA,CAAa,IAAA;AAAMhiC,MAAAA;AAAS,KAAA,CACxE,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;IAEX,QAAA,kBAAAZ,IAAC,KAAA,EAAD;MAAK,SAAA,EAAWgnC,GAAAA,GAAQ,GAAGtqC,EAAAA,CAAE,KAAA,IAASA,EAAAA,CAAE,KAAA,KAAUA,EAAAA,CAAE,KAAA;MAClD,QAAA,kBAAAsD,IAAC,OAAA,EAAD;QACE,IAAA,EAAK,MAAA;QACL,SAAA,EAAU,SAAA;QACV,YAAA,EAAYygB,GAAAA;QACC,WAAA,EAAAngB,GAAAA;AACb,QAAA,KAAA,EAAO6mC,GAAAA,IAASrY,GAAAA;AAChB,QAAA,QAAA,EAAA,CAAWtzB,GAAAA,KAAM4rC,GAAAA,CAAS5rC,GAAAA,CAAE,OAAO,KAAK,CAAA;AACxC,QAAA,OAAA,EAAA,MAAe;AACb,UAAAuD,IAAS,OAAA,GAAU,KAAA;AACrB,QAAA,CAAA;AACA,QAAA,MAAA,EAAA,MAAc;AACZ,UAAA,IAAIooC,GAAAA,KAAU,IAAA,IAAQ,CAACE,GAAAA,CAAS,OAAA,EAAS;AACvC,YAAA,IAAMlnC,GAAAA,GAAIqhC,GAAAA,CAAY2F,GAAAA,EAAOO,GAAO,CAAA;AAChC,YAAA,MAAA,CAAO,QAAA,CAASvnC,GAAC,CAAA,IAAGsnC,GAAAA,CAAOtnC,GAAC,CAAA;AAClC,UAAA;AACA,UAAAsB,IAAS,IAAI,CAAA;AACf,QAAA,CAAA;AACA,QAAA,SAAA,EAAA,CAAYlF,GAAAA,KAAM;AAChB,UAAA,IAAIf,IAAE,GAAA,KAAQ,OAAA,EACZe,GAAAA,CAAE,cAAc,IAAA,EAAK;mBACZf,GAAAA,CAAE,GAAA,KAAQ,UACnBuD,GAAAA,CAAS,UAAU,IAAA,EACnBvD,GAAAA,CAAE,cAAc,IAAA,EAAK;AACZA,eAAAA,IAAAA,GAAAA,CAAE,GAAA,KAAQ,SAAA,IAAaA,GAAAA,CAAE,GAAA,KAAQ,WAAA,EAAa;AACvD,YAAAe,IAAE,cAAA,EAAe;AACjB,YAAA,IAAMorC,GAAAA,GAAQR,QAAU,IAAA,GAAOpY,GAAAA,GAAQyS,IAAY2F,GAAAA,EAAOO,GAAO,GAE3D9gC,GAAAA,GAAO0gC,GAAAA,CAAAA,CADA,OAAO,QAAA,CAASK,GAAK,IAAIA,GAAAA,GAAQ,CAAA,KACnBnsC,IAAE,GAAA,KAAQ,SAAA,GAAY0K,GAAAA,GAAO,CAACA,GAAAA,CAAK,CAAA;AAC9DkhC,YAAAA,IAAS,IAAI,CAAA,EACTxgC,GAAAA,KAASmoB,GAAAA,IAAOmR,IAASt5B,GAAI,CAAA;AACnC,UAAA;AACF,QAAA;OACD;KACE;GACF,CAAA;AAET;AChEA,SAASghC,IAAkBpsC,GAAAA,EAAsC;AAC/D,EAAA,KAAA,IAASiB,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIsF,GAAAA,CAAM,MAAA,EAAQxF,GAAAA,EAAAA,EAAK,IAAI,CAACwF,GAAAA,CAAMtF,GAAAA,CAAAA,CAAG,QAAA,EAAU,OAAOA,GAAAA;AACtE,EAAA,OAAO,EAAA;AACT;AAEA,SAASorC,IAAiBrsC,GAAAA,EAAsC;AAC9D,EAAA,KAAA,IAASiB,GAAAA,GAAIsF,GAAAA,CAAM,MAAA,GAAS,CAAA,EAAGtF,GAAAA,IAAK,CAAA,EAAGF,GAAAA,EAAAA,EAAK,IAAI,CAACwF,GAAAA,CAAMtF,GAAAA,CAAAA,CAAG,UAAU,OAAOA,GAAAA;AAC3E,EAAA,OAAO,EAAA;AACT;AAEA,SAASqrC,GAAAA,CAAiBtsC,KAA8Be,GAAAA,EAAsB;AAC5E,EAAA,IAAM4D,MAAI4B,GAAAA,CAAM,MAAA;AAChB,EAAA,KAAA,IAAS3G,GAAAA,GAAI,CAAA,EAAGA,GAAAA,IAAK+E,GAAAA,EAAGH,GAAAA,EAAAA,EAAK;AAC3B,IAAA,IAAMvD,GAAAA,GAAAA,CAAK2C,GAAAA,GAAOhE,GAAAA,GAAI+E,GAAAA,IAAKA,GAAAA;AAC3B,IAAA,IAAI,CAAC4B,GAAAA,CAAMtF,GAAA,CAAA,CAAG,UAAU,OAAOA,GAAAA;AACjC,EAAA;AACA,EAAA,OAAO2C,GAAAA;AACT;AAEA,SAAS2oC,GAAAA,CAAiBvsC,KAA8Be,GAAAA,EAAsB;AAC5E,EAAA,IAAM4D,MAAI4B,GAAAA,CAAM,MAAA;AAChB,EAAA,KAAA,IAAS3G,GAAAA,GAAI,CAAA,EAAGA,GAAAA,IAAK+E,GAAAA,EAAGH,GAAAA,EAAAA,EAAK;AAC3B,IAAA,IAAMvD,GAAAA,GAAAA,CAAK2C,GAAAA,GAAOhE,GAAAA,GAAI+E,GAAAA,IAAKA,GAAAA;AAC3B,IAAA,IAAI,CAAC4B,GAAAA,CAAMtF,GAAA,CAAA,CAAG,UAAU,OAAOA,GAAAA;AACjC,EAAA;AACA,EAAA,OAAO2C,GAAAA;AACT;AAuBA,SAAgB4oC,IACd/lC,GAAAA,EACmB;AACnB,EAAA,IAAM,EAAE,OAAAkC,GAAAA,EAAO,aAAA,EAAAzH,KAAe,UAAA,EAAAjB,GAAAA,EAAY,UAAA,EAAAkB,GAAAA,EAAA,GAAe2xB,GAAAA,EACnD2Z,MAAU/iC,MAAAA,CAAiB,IAAI,CAAA,EAE/BgjC,GAAAA,GAAe5Z,GAAAA,CAAQ,YAAA,IAAgBsZ,IAAkB7lC,GAAK,CAAA,EAE9DomC,GAAAA,GAAAA,CAAa3sC,GAAAA,KAAwB;AACzC,IAAA,IAAM4sC,MAAOH,GAAAA,CAAQ,OAAA;AAChBG,IAAAA,GAAAA,IAELA,IADsB,gBAAA,CAA8B,CAAA,CAAA,EAAIC,GAAAA,CAAAA,CACxD,CAAA,CAASxiB,GAAAA,CAAAA,EAAQ,KAAA,EAAM;AACzB,EAAA,CAAA;AAmCA,EAAA,OAAO;IACL,OAAA,EAAAjpB,GAAAA;AACA,IAAA,WAAA,EAAA,CAAcpB,GAAAA,KAAmBqqB,GAAAA,KAAUqiB,GAAAA,GAAe,CAAA,GAAI,EAAA;IAC9D,SAAA,EAAA,CApCiB1sC,GAAAA,KAAA,CAAmByG,GAAAA,KAA6C;AACjF,MAAA,IAAIqmC,GAAAA,GAAY,EAAA;AAChB,MAAA,QAAQ9sC,IAAE,GAAA;QACR,KAAK,WAAA;QACL,KAAK,SAAA;AACH,UAAAkB,GAAAA,GAAYqrC,GAAAA,CAAiBhmC,GAAAA,EAAO8jB,GAAK,CAAA;AACzC,UAAA;QACF,KAAK,YAAA;QACL,KAAK,WAAA;AACH,UAAAnpB,GAAAA,GAAYorC,GAAAA,CAAiB/lC,GAAAA,EAAO8jB,GAAK,CAAA;AACzC,UAAA;QACF,KAAK,MAAA;AACH,UAAAnpB,GAAAA,GAAYkrC,IAAkB7lC,GAAK,CAAA;AACnC,UAAA;QACF,KAAK,KAAA;AACH,UAAArF,GAAAA,GAAYmrC,IAAiB9lC,GAAK,CAAA;AAClC,UAAA;QACF,KAAK,GAAA;QACL,KAAK,OAAA;AACCwmC,UAAAA,GAAAA,KACF/sC,GAAAA,CAAE,cAAA,EAAe,EACjB+sC,IAAW1iB,GAAK,CAAA,CAAA;AAElB,UAAA;AACF,QAAA;AACE,UAAA;AACJ;AACIyiB,MAAAA,GAAAA,GAAY,CAAA,IAAKA,GAAAA,KAAcziB,GAAAA,KACnCrqB,GAAAA,CAAE,cAAA,EAAe,EACjBgtC,GAAAA,GAAaF,GAAS,CAAA,EACtBH,GAAAA,CAAUG,GAAS,CAAA,CAAA;AACrB,IAAA;AAMA,GAAA;AACF;;;;;;;;;;ACjEA,SAAgBG,IAA8CxmC,GAAAA,EAAwC;AACpG,EAAA,IAAM,EAAE,KAAA,EAAAkC,GAAAA,EAAO,SAAA,EAAAzH,KAAW,SAAA,EAAAjB,GAAAA,EAAW,MAAA,EAAAkB,GAAAA,EAAQ,MAAAC,GAAAA,EAAM,OAAA,EAAAC,GAAAA,EAAA,GAAYqD,KACzDoU,GAAAA,GAAOpU,GAAAA,CAAM,IAAA,IAAQ,QAAA,EAErBwoC,GAAAA,GAAAA,CAAcltC,GAAAA,KACd8Y,GAAAA,KAAS,aAAoBpU,GAAAA,CAAM,KAAA,CAAuB,QAAA,CAAS6uB,GAAK,IACpE7uB,GAAAA,CAAM,KAAA,KAAuB6uB,GAAAA,EAMjC4Z,GAAAA,GAAAA,CAAWntC,GAAAA,KAAsB;AACrC,IAAA,IAAI8Y,GAAAA,KAAS,YAAY,OAAO,KAAA;AAChC,IAAA,IAAMs0B,MAAS1oC,GAAAA,CAAyC,WAAA;AACxD,IAAA,OAAO0oC,GAAAA,KAAU,UAAaA,GAAAA,CAAM,QAAA,CAAS7Z,GAAK,CAAA,IAAK,CAAC2Z,IAAW3Z,GAAK,CAAA;EAC1E,CAAA,EAEM8Z,GAAAA,GAAAA,CAAertC,GAAAA,KAAA,MAAwB;AAC3C,IAAA,IAAM4F,GAAAA,GAAOW,IAAM8jB,GAAAA,CAAAA;AACnB,IAAA,IAAI,CAAAtpB,IAAK,QAAA,EACT;AAAI+X,MAAAA,IAAAA,GAAAA,KAAS,UAAA,EAAY;AACvB,QAAA,IAAMqgB,GAAAA,GAAUz0B,IAAM,KAAA,EAChB0G,GAAAA,GAAO+tB,IAAQ,QAAA,CAASvzB,GAAAA,CAAK,KAAK,CAAA,GACpCuzB,GAAAA,CAAQ,OAAA,CAAOn5B,GAAAA,KAAKH,QAAM+F,GAAAA,CAAK,KAAK,IACpC,CAAC,GAAGuzB,GAAAA,EAASvzB,GAAAA,CAAK,KAAK,CAAA;AAC3B,QAAAa,GAAAA,CAAO,SAA8B2E,GAAI,CAAA;MAC3C,CAAA,MAAO;AAEL,QAAA,IADgB1G,GAAAA,CAAM,KAAA,KACNkB,GAAAA,CAAK,KAAA,EAAO;AACrBlB,UAAAA,GAAAA,CAAsC,aAAA,IACzCA,GAAAA,CAAO,QAAA,CAAmC,IAAI,CAAA;AAEhD,UAAA;AACF,QAAA;AACA,QAAA+B,GAAAA,CAAO,QAAA,CAAmCb,GAAAA,CAAK,KAAK,CAAA;AACtD,MAAA;;AACF,EAAA,CAAA,EAEM0nC,GAAAA,GAAgBx0B,GAAAA,KAAS,QAAA,GAC3BvS,GAAAA,CAAM,UAAA,CAAUvG,GAAAA,KAAMwqB,GAAAA,CAAG,KAAA,KAAW9lB,GAAAA,CAAM,KAAkB,CAAA,GAC5D,EAAA,EAEE6oC,MAASf,GAAAA,CAAkB;IAC/B,KAAA,EAAA7jC,GAAAA;AACA,IAAA,aAAA,EAAezH,GAAAA,CAAE,OAAA;AAIjB,IAAA,YAAA,EAAcosC,OAAiB,CAAA,IAAK,CAAC/mC,IAAM+mC,GAAAA,CAAAA,CAAe,WAAWA,GAAAA,GAAgB,MAAA;IACrF,UAAA,EAAYx0B,GAAAA,KAAS,QAAA,GAAA,CAChB9Y,GAAAA,KAAW0E,GAAAA,CAAM,SAAmC6B,GAAAA,CAAM8jB,GAAAA,CAAAA,CAAO,KAAK,CAAA,GACvE,MAAA;AACJ,IAAA,UAAA,EAAYvR,QAAS,UAAA,GAAA,CAAc9Y,QAAUqtC,GAAAA,CAAYhjB,GAAK,GAAE,GAAI;GACrE,CAAA,EAEKzD,GAAAA,GAAmC8N,GAAAA,KAAW,MAAA,GAEhD,MAAA,GADC,EAAG,QAAA,EAAqB,CAAA,EAAGA,GAAAA,CAAAA,EAAAA,CAAAA,EAAW,EAGrC8Y,GAAAA,GAAU;IACdtsC,GAAAA,CAAE,IAAA;IACFM,GAAAA,IAAQN,GAAAA,CAAE,CAAA,KAAA,EAAQM,GAAAA,CAAAA,CAAAA,CAAAA;IAClBkH,GAAAA,IAAWxH,GAAAA,CAAE,CAAA,QAAA,EAAWwH,GAAAA,CAAAA,CAAAA,CAAAA;AACxBtD,IAAAA;AACF,GAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAE1B,EAAA,uBACEZ,IAAC,KAAA,EAAD;AACE,IAAA,GAAA,EAAK+oC,GAAAA,CAAO,OAAA;IACZ,SAAA,EAAWC,GAAAA;IACX,IAAA,EAAM10B,GAAAA,KAAS,aAAa,OAAA,GAAU,YAAA;IACtC,YAAA,EAAYmM,GAAAA;IACL,KAAA,EAAAplB,GAAAA;AAEN,IAAA,QAAA,EAAA0G,GAAAA,CAAM,GAAA,CAAA,CAAK5B,GAAAA,EAAM8B,GAAAA,KAAM;AACtB,MAAA,IAAMgnC,GAAAA,GAAWP,GAAAA,CAAWtnC,GAAAA,CAAK,KAAK,CAAA,EAChCwnC,MAAQD,GAAAA,CAAQvnC,GAAAA,CAAK,KAAK,CAAA,EAC1BgB,GAAAA,GAAM;QAAC1F,GAAAA,CAAE,OAAA;AAASusC,QAAAA,GAAAA,IAAYvsC,GAAAA,CAAE,eAAA;AAAiBksC,QAAAA,GAAAA,IAASlsC,GAAAA,CAAE;AAAY,OAAA,CAC3E,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;AACX,MAAA,uBACEsD,IAACukB,EAAAA,EAAD;AAAiC,QAAA,OAAA,EAASD,GAAsBljB,GAAI,CAAA;AAAG,QAAA,QAAA,EAAUA,GAAAA,CAAK,QAAA;QACpF,QAAA,kBAAApB,IAAC,QAAA,EAAD;UACE,IAAA,EAAK,QAAA;UACL,IAAA,EAAMsU,GAAAA,KAAS,aAAa,MAAA,GAAY,OAAA;UACxC,cAAA,EAAcA,GAAAA,KAAS,aAAa,MAAA,GAAY20B,GAAAA;AAChD,UAAA,cAAA,EAAc30B,GAAAA,KAAS,UAAA,GAAcs0B,GAAAA,GAAQ,OAAA,GAAUK,GAAAA,GAAY,MAAA;AACnE,UAAA,YAAA,EAAY7nC,GAAAA,CAAK,SAAA;AACjB,UAAA,QAAA,EAAUA,GAAAA,CAAK,QAAA;UACf,QAAA,EAAU2nC,GAAAA,CAAO,YAAYtsC,GAAC,CAAA;UAC9B,SAAA,EAAW2F,GAAAA;AACX,UAAA,OAAA,EAASymC,IAAYpsC,GAAC,CAAA;UACtB,SAAA,EAAWssC,GAAAA,CAAO,UAAUtsC,GAAC,CAAA;AAE5B,UAAA,QAAA,EAAA2E,GAAAA,CAAK;SACA;AACM,OAAA,EAfKA,IAAK,KAeV,CAAA;IAEpB,CAAC;GACE,CAAA;AAET;;;;;;;;;;;;;;;;;;ACjDA,SAAS8nC,GAAAA,CAAS1tC,GAAAA,EAAWe,GAAAA,EAA0B4D,GAAAA,EAAqB;AAE1E,EAAA,OADI+F,GAAAA,KAAS,MAAA,IAAaA,GAAAA,IAAQ,CAAA,GAAU7K,GAAAA,GACrC,IAAA,CAAK,KAAA,CAAA,CAAOA,GAAAA,GAAI8tC,GAAAA,IAAOjjC,GAAI,CAAA,GAAIA,GAAAA,GAAOijC,GAAAA;AAC/C;AAEA,SAAS7B,GAAAA,CAAM9rC,GAAAA,EAAWe,GAAAA,EAAY4D,GAAAA,EAAoB;AACxD,EAAA,OAAO,KAAK,GAAA,CAAI6T,GAAAA,EAAI,KAAK,GAAA,CAAIC,GAAAA,EAAI5Y,GAAC,CAAC,CAAA;AACrC;AAGA,IAAM+tC,GAAAA,GAAe,CAAA;AAArB,IAIMC,GAAAA,GAAa,EAAE,OAAA,EAAS,KAAA,EAAM;AAIpC,SAASC,GAAAA,CAAY9tC,GAAAA,EAA6Be,GAAAA,EAAa4D,GAAAA,EAA2B;AACxF,EAAA,IAAI,CAACod,GAAAA,IAASA,GAAAA,CAAM,MAAA,KAAW,CAAA,SAAU,EAAC;AAC1C,EAAA,IAAMgsB,GAAAA,uBAAc,GAAA,EAAwB;AAC5C,EAAA,KAAA,IAAWC,OAAQjsB,GAAAA,EAAO;AACxB,IAAA,IAAM7gB,MAAI,OAAO8sC,GAAAA,IAAS,WAAW,EAAE,KAAA,EAAOA,KAAK,GAAIA,GAAAA;AACvD,IAAA,IAAI9sC,GAAAA,CAAE,KAAA,GAAQysC,GAAAA,IAAOzsC,GAAAA,CAAE,QAAQ+sC,GAAAA,EAAK;AACpC,IAAA,IAAMC,GAAAA,GAAOH,GAAAA,CAAQ,GAAA,CAAI7sC,GAAAA,CAAE,KAAK,CAAA;AAChC,IAAA,CAAI,CAACgtC,GAAAA,IAASA,GAAAA,CAAK,KAAA,KAAU,MAAA,IAAahtC,GAAAA,CAAE,KAAA,KAAU,MAAA,KAAY6sC,GAAAA,CAAQ,GAAA,CAAI7sC,GAAAA,CAAE,KAAA,EAAOA,GAAC,CAAA;AAC1F,EAAA;AACA,EAAA,OAAO,CAAC,GAAG6sC,GAAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAA,CAAM/tC,GAAAA,EAAGe,GAAAA,KAAM0F,GAAAA,CAAE,KAAA,GAAQlD,IAAE,KAAK,CAAA;AAC/D;AAKA,SAAS4qC,GAAAA,CAAQnuC,GAAAA,EAAWe,GAAAA,EAAiB4D,GAAAA,EAAmBH,GAAAA,EAA2C;AACzG,EAAA,IAAMM,MAAIspC,GAAAA,CAAWvuC,GAAC,CAAA,EAClB+2B,GAAAA,GAAO/2B,KACPwuC,GAAAA,GAAUvX,GAAAA;AACd,EAAA,KAAA,IAAWkX,OAAQjsB,GAAAA,EAAO;AACxB,IAAA,IAAMqU,MAAM,IAAA,CAAK,GAAA,CAAIgY,GAAAA,CAAWJ,GAAI,IAAIlpC,GAAC,CAAA;AACrCsxB,IAAAA,GAAAA,IAAOiY,GAAAA,KACT5nC,GAAAA,GAAOunC,GAAAA,EACPrlC,GAAAA,GAAUytB,GAAAA,CAAAA;AAEd,EAAA;AACA,EAAA,OAAOQ,GAAAA;AACT;AAGA,SAAS0X,EAAAA,CAAUtuC,GAAAA,EAAiBe,GAAAA,EAAW4D,GAAAA,EAAmBH,GAAAA,EAAuB;AACvF,EAAA,IAAI+pC,MAAY,CAAA,EAAG;AACjB,IAAA,IAAMr0B,MAAQ6H,GAAAA,CAAM,SAAA,CAAA,CAAU/hB,GAAAA,KAAQguC,MAAOnuC,GAAC,CAAA;AAE9C,IAAA,OADIqa,QAAU,EAAA,GAAW6H,GAAAA,CAAMA,GAAAA,CAAM,MAAA,GAAS,CAAA,CAAA,GACvCA,GAAAA,CAAM,IAAA,CAAK,GAAA,CAAIA,IAAM,MAAA,GAAS,CAAA,EAAG7H,GAAAA,GAAQ7E,GAAAA,GAAQ,CAAC,CAAA,CAAA;AAC3D,EAAA;AACA,EAAA,IAAI6E,GAAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,IAASjZ,GAAAA,GAAI8gB,GAAAA,CAAM,MAAA,GAAS,CAAA,EAAG9gB,GAAAA,IAAK,CAAA,EAAG0D,GAAAA,EAAAA,EACrC,IAAIod,GAAAA,CAAM9gB,GAAAA,CAAAA,GAAKpB,GAAAA,EAAG;AAChB,IAAAoB,GAAAA,GAAQA,GAAAA;AACR,IAAA;AACF,EAAA;AAGF,EAAA,OADIiZ,GAAAA,KAAU,EAAA,GAAW6H,GAAAA,CAAM,CAAA,CAAA,GACxBA,GAAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG7H,GAAAA,IAAS7E,GAAAA,GAAQ,CAAA,CAAE,CAAA,CAAA;AAC9C;AAEA,SAASm5B,GAAAA,CAAYxuC,GAAAA,EAA0Be,GAAAA,EAAa4D,GAAAA,EAAqB;AAE/E,EAAA,OADI+F,QAAS,MAAA,IAAaA,GAAAA,GAAO,CAAA,GAAUA,GAAAA,GAAAA,CACnCujC,MAAMN,GAAAA,IAAO,GAAA;AACvB;AAGA,SAASc,GACPzuC,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACAH,GAAAA,EACAvD,KACAwF,GAAAA,EACQ;AACR,EAAA,IAAM2vB,MAAM1rB,GAAAA,KAAS,MAAA,IAAaA,MAAO,CAAA,GAAIA,GAAAA,GAAAA,CAAQujC,MAAMN,GAAAA,IAAO,GAAA;AAGlE,EAAA,OAAO7B,GAAAA,CAAMjsC,KAFCwqB,GAAAA,GAAQ,CAAA,GAAIqkB,IAAOrkB,GAAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ+L,GAAAA,GAAMuX,KAC5CtjB,GAAAA,GAAQqkB,GAAAA,CAAO,SAAS,CAAA,GAAIA,GAAAA,CAAOrkB,MAAQ,CAAA,CAAA,CAAG,KAAA,GAAQ+L,GAAAA,GAAM6X,GAC9C,CAAA;AAC9B;AAEA,SAASU,EAAAA,CAAc3uC,GAAAA,EAAce,GAAAA,EAAgB4D,GAAAA,EAAqBH,GAAAA,EAAuC;AAC/G,EAAA,IAAI,CAACoqC,GAAAA,CAAM,MAAA,EAAQ,OAAO,CAACC,KAAaC,GAAW,CAAA;AACnD,EAAA,IAAMC,GAAAA,GAAQ,OAAOH,GAAAA,CAAM,MAAA,IAAW,aAAaA,GAAAA,CAAM,MAAA,CAAOnnC,GAAG,CAAA,GAAImnC,GAAAA,CAAM,MAAA;AAC7E,EAAA,OAAO,CAACG,GAAAA,CAAM,CAAA,CAAA,EAAIA,GAAAA,CAAM,CAAA,CAAE,CAAA;AAC5B;AAEA,SAASC,GAAejuC,GAAAA,EAAsB;AAC5C,EAAA,OAAO8kC,GAAAA,CAAa+I,IAAM,KAAA,EAAO;IAAE,qBAAA,EAAuB,CAAA;IAAG,qBAAA,EAAuB;GAAG,CAAA;AACzF;AAUA,SAAgBK,GAAgCjvC,GAAAA,EAAqC;AACnF,EAAA,IAAM,EAAE,MAAA,EAAAiG,GAAAA,EAAQ,OAAA,EAAA1C,GAAAA,EAAS,QAAA,EAAA2C,GAAAA,EAAU,IAAA,EAAAkjB,GAAAA,EAAM,UAAA,EAAAnY,GAAAA,EAAY,WAAA,EAAAI,KAAa,OAAA,EAAA2S,GAAAA,EAAS,SAAA,EAAAC,GAAAA,EAAW,SAAA,EAAAC,GAAAA,EAAA,GAAcxf,GAAAA,EAE9FwqC,MAAW7gB,OAAAA,CAAAA,MAAcyf,GAAAA,CAAYppC,GAAAA,CAAM,KAAA,EAAOA,GAAAA,CAAM,GAAA,EAAKA,GAAAA,CAAM,GAAG,CAAA,EAAG;IAACA,GAAAA,CAAM,KAAA;IAAOA,GAAAA,CAAM,GAAA;IAAKA,GAAAA,CAAM;GAAI,CAAA,EAC5Gqd,GAAAA,GAAQsM,OAAAA,CAAAA,MAAc6gB,GAAAA,CAAS,IAAA,CAAIlvC,GAAAA,KAAQguC,GAAAA,CAAK,KAAK,CAAA,EAAG,CAACkB,GAAQ,CAAC,CAAA,EAClEpb,GAAAA,GAAOpvB,GAAAA,CAAM,OAAA,KAAY,MAAA,IAAUqd,GAAAA,CAAM,MAAA,IAAU,CAAA,EACnDotB,GAAAA,GAASzqC,GAAAA,CAAM,IAAA,KAAS,QAAA,IAAYqd,GAAAA,CAAM,SAAS,CAAA,EACnD4rB,GAAAA,GAAM7Z,GAAAA,GAAO/R,GAAAA,CAAM,CAAA,CAAA,GAAKrd,GAAAA,CAAM,GAAA,EAC9BupC,GAAAA,GAAMna,GAAAA,GAAO/R,GAAAA,CAAMA,GAAAA,CAAM,MAAA,GAAS,CAAA,IAAKrd,GAAAA,CAAM,GAAA,EAE7C0qC,GAAAA,GAAW1lC,MAAAA,CAA8B,IAAI,CAAA,EAE7C2lC,GAAAA,GAAgB3lC,MAAAA,CAAmB,IAAI,CAAA,EACvCmwB,EAAAA,GAAanwB,MAAAA,CAA8B,IAAI,CAAA;AAErD,EAAAjD,SAAAA,CAAA,MAAA,MAAsB;AAAE,IAAAmhB,EAAAA,CAAW,SAAS,MAAA,EAAO;AAAG,EAAA,CAAA,EAAG,EAAE,CAAA;AAE3D,EAAA,IAAM0nB,EAAAA,GAAkBhkB,WAAAA,CAAAA,CACrBtrB,GAAAA,KAAsB;AACrB,IAAA,IAAIiuC,GAAAA,KAAQN,KAAK,OAAO,CAAA;AACxB,IAAA,IAAI,CAAC7Z,KAAM,OAAOgY,GAAAA,CAAAA,CAAOjsC,MAAI8tC,GAAAA,KAAQM,GAAAA,GAAMN,GAAAA,CAAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AACrD,IAAA,IAAM9Z,GAAAA,GAAO9R,GAAAA,CAAM,MAAA,GAAS,CAAA,EACtB7b,GAAAA,GAAI4lC,IAAMjsC,GAAAA,EAAG8tC,GAAAA,EAAKM,GAAG,CAAA,EACvBhtC,GAAAA,GAAI,CAAA;AACR,IAAA,OAAOA,GAAAA,GAAI4yB,MAAO,CAAA,IAAK3tB,GAAAA,GAAI6b,IAAM9gB,GAAAA,GAAI,CAAA,KAAIuD,GAAAA,EAAAA;AACzC,IAAA,OAAA,CAAQvD,GAAAA,GAAAA,CAAKiF,GAAAA,GAAI6b,GAAAA,CAAM9gB,GAAAA,CAAAA,KAAO8gB,GAAAA,CAAM9gB,GAAAA,GAAI,CAAA,CAAA,GAAK8gB,GAAAA,CAAM9gB,GAAAA,CAAAA,CAAAA,IAAO4yB,GAAAA;EAC5D,CAAA,EACA;AAAC8Z,IAAAA,GAAAA;AAAKM,IAAAA,GAAAA;AAAKna,IAAAA,GAAAA;AAAM/R,IAAAA;AAAK,GACxB,CAAA,EAEMwtB,EAAAA,GAAkBjkB,WAAAA,CAAAA,CACrBtrB,GAAAA,KAAsB;AACrB,IAAA,IAAMC,GAAAA,GAAI6rC,GAAAA,CAAMhnC,GAAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACvB,IAAA,IAAI,CAACgvB,GAAAA,EAAM,OAAO6Z,GAAAA,GAAM1tC,OAAKguC,GAAAA,GAAMN,GAAAA,CAAAA;AACnC,IAAA,IAAM9Z,GAAAA,GAAO9R,GAAAA,CAAM,MAAA,GAAS,CAAA,EACtB9gB,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAI4yB,GAAAA,GAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM5zB,GAAAA,GAAI4zB,GAAI,CAAC,CAAA;AACjD,IAAA,OAAO9R,GAAAA,CAAM9gB,GAAAA,CAAAA,GAAAA,CAAMhB,GAAAA,GAAI4zB,GAAAA,GAAO5yB,GAAAA,KAAM8gB,GAAAA,CAAM9gB,GAAAA,GAAI,CAAA,CAAA,GAAK8gB,GAAAA,CAAM9gB,GAAAA,CAAAA,CAAAA;EAC3D,CAAA,EACA;AAAC0sC,IAAAA,GAAAA;AAAKM,IAAAA,GAAAA;AAAKna,IAAAA,GAAAA;AAAM/R,IAAAA;AAAK,GACxB,CAAA,EAGMytB,EAAAA,GAAUlkB,WAAAA,CAAAA,CACbtrB,KAAWe,GAAAA,KAA+B;AACzC,IAAA,IAAMlB,GAAAA,GAAI0vC,GAAgBzqC,GAAC,CAAA;AAC3B,IAAA,IAAIqqC,KAAQ,OAAOhB,GAAAA,CAAQtuC,GAAAA,EAAGkiB,GAAAA,EAAO,UAAUutB,EAAe,CAAA;AAC9D,IAAA,IAAMrV,GAAAA,GAAI6R,IAAM4B,GAAAA,CAAS7tC,GAAAA,EAAG6K,KAAMijC,GAAG,CAAA,EAAGA,KAAKM,GAAG,CAAA;AAChD,IAAA,OAAOlsB,GAAAA,CAAM,SAAS,CAAA,GAAIosB,GAAAA,CAAQlU,KAAGlY,GAAAA,EAAO6rB,GAAAA,GAAe6B,GAAAA,EAAYH,EAAe,CAAA,GAAIrV,GAAAA;EAC5F,CAAA,EACA;AAACsV,IAAAA,EAAAA;AAAiBD,IAAAA,EAAAA;AAAiBH,IAAAA,GAAAA;AAAQptB,IAAAA,GAAAA;AAAOrX,IAAAA,GAAAA;AAAMijC,IAAAA,GAAAA;AAAKM,IAAAA;AAAG,GAClE,GAKMyB,EAAAA,GAAiBpkB,WAAAA,CAAAA,CACpB3mB,GAAAA,EAAiBH,GAAAA,EAAyBvD,KAAewF,GAAAA,KAAwB;AAChF,IAAAmhB,EAAAA,CAAW,SAAS,MAAA,EAAO;AAC3B,IAAA,IAAM+nB,GAAAA,GAAAA,CAAYxwB,OAAQuvB,GAAAA,EAAQ,GAAA,CAAA,CAAI1uC,GAAAA,MAAM,EAAE,GAAGe,GAAAA,EAAE,CAAE,CAAA;AACrD,IAAAyjB,IAAc,OAAA,GAAUmrB,GAAAA;AACxB,IAAA,IAAIC,GAAAA,GAAa,KAAA;AAsDjB,IAAAhoB,EAAAA,CAAW,OAAA,GAAUgT,kBAAAA,CAAmB1K,GAAAA,EAAQ2K,GAAAA,EAAM;AAAE,MAAA,MAAA,EAAA,CApDxC95B,GAAAA,KAAqB;AACnC,QAAA,IAAM8uC,GAAAA,GAAQT,GAAAA,CAAS,OAAA,EACjBU,GAAAA,GAAST,GAAAA,CAAc,OAAA;AAC7B,QAAA,IAAI,CAACQ,GAAAA,IAAS,CAACC,GAAAA,EAAQ;AACvB,QAAA,IAAMlb,GAAAA,GAAOib,IAAM,qBAAA,EAAsB,EACrChwC,MAAI2vC,EAAAA,CAAAA,CAASpjB,GAAAA,CAAG,OAAA,GAAUwI,GAAAA,CAAK,IAAA,IAAQA,GAAAA,CAAK,OAAOA,GAAAA,CAAK,KAAK,GAE3D,CAACmb,GAAAA,EAAKC,GAAAA,CAAAA,GAAOrB,EAAAA,CAAcmB,GAAAA,CAAOzlB,GAAAA,CAAAA,EAAQ;UAAE,MAAA,EAAQylB,GAAAA;UAAQ,KAAA,EAAA7uC;AAAM,SAAA,EAAG0sC,KAAKM,GAAG,CAAA;AACnF,QAAAtlC,GAAAA,GAAImjC,GAAAA,CAAMjsC,GAAAA,EAAGkwC,GAAAA,EAAKC,GAAG,CAAA,EAEjBC,GAAAA,KAAe,SAAA,KAAWtnC,GAAAA,GAAI8lC,GAAa5uC,GAAAA,EAAGiwC,GAAAA,EAAQzlB,GAAAA,EAAOsjB,GAAAA,EAAKM,KAAKvjC,GAAI,CAAA,CAAA;AAG/E,QAAA,IAAMwlC,MAAatb,GAAAA,CAAK,MAAA;AACpBlwB,QAAAA,GAAAA,CAAM,aAAA,KAINkrC,GAAAA,GAHExjB,GAAAA,CAAG,UAAUwI,GAAAA,CAAK,GAAA,GAAMsb,GAAAA,IAAc9jB,GAAAA,CAAG,UAAUwI,GAAAA,CAAK,MAAA,GAASsb,GAAAA,CAAAA,EAOvE1rC,GAAAA,CAAO6lB,GAAAA,CAAAA,GAAS;AAAE,UAAA,GAAGylB,IAAOzlB,GAAAA,CAAAA;UAAQ,KAAA,EAAOxqB;SAAE,EAC7C2kC,GAAAA,CAAQsL,IAAO,GAAA,CAAA,CAAI9vC,SAAM,EAAE,GAAGe,GAAAA,EAAE,CAAE,CAAC,CAAA;AACrC,MAAA,CAAA;AA4BgE,MAAA,KAAA,EAAA,MAnB5C;AAClB,QAAA6mB,GAAW,OAAA,GAAU,IAAA;AACrB,QAAA,IAAMkoB,MAAST,GAAAA,CAAc,OAAA;AAE7B,QAAA,IADA7qB,GAAAA,CAAc,OAAA,GAAU,IAAA,EACnBsrB,GAAAA,EAEL;AAAIF,UAAAA,IAAAA,GAAAA,IAAclrC,GAAAA,CAAM,aAAA,IACLA,GAAAA,CAAM,aAAA,CAAc2lB,GACjC,CAAA,EAAU;AACZ,YAAA,IAAMjf,GAAAA,GAAO0kC,GAAAA,CAAO,MAAA,CAAA,CAAQ9vC,KAAGe,GAAAA,KAAME,GAAAA,KAAMopB,GAAK,CAAA,CAAE,IAAA,CAAIrqB,GAAAA,MAAM,EAAE,GAAGe,KAAE,CAAE,CAAA;AACrEyjC,YAAAA,GAAAA,CAAQp5B,GAAI,CAAA,EACZs5B,GAAAA,GAAWt5B,GAAI,CAAA;AACf,YAAA;AACF,UAAA;AAGF,UAAAlF,GAAAA,GAAW4pC,IAAO,GAAA,CAAA,CAAI9vC,SAAM,EAAE,GAAGe,GAAAA,EAAE,CAAE,CAAC,CAAA;;AACxC,MAAA,CAAA;AAEuE,MAAA,QAAA,EAAA,MAxBhD;AACrB,QAAA6mB,EAAAA,CAAW,OAAA,GAAU,IAAA,EACrBpD,GAAAA,CAAc,OAAA,GAAU,IAAA;AAC1B,MAAA;AAqBgF,KAAA,EAAGqpB,GAAU,CAAA;EAC/F,CAAA,EACA;AAACa,IAAAA,GAAAA;AAAQlK,IAAAA,GAAAA;AAASE,IAAAA,GAAAA;AAAU8K,IAAAA,EAAAA;AAAS7B,IAAAA,GAAAA;AAAKM,IAAAA,GAAAA;AAAKvjC,IAAAA,GAAAA;AAAMulC,IAAAA,GAAAA;AAAYvrC,IAAAA;AAAK,GACxE,GAEMyrC,EAAAA,GAAoB7kB,WAAAA,CAAAA,CACvBtrB,GAAAA,EAAiB2E,KAAyBH,GAAAA,KAAoB;AAC7D,IAAAojB,EAAAA,CAAW,SAAS,MAAA,EAAO;AAC3B,IAAA,IAAM+nB,MAAWjB,GAAAA,CAAO,GAAA,CAAA,CAAI1uC,GAAAA,MAAM,EAAE,GAAGe,GAAAA,EAAE,CAAE,CAAA,EACrCqvC,MAAcT,GAAAA,CAAI,GAAA,CAAA,CAAI3vC,GAAAA,KAAKe,IAAE,KAAK,CAAA;AACxC,IAAAyjB,IAAc,OAAA,GAAUmrB,GAAAA,EAkDxB/nB,GAAW,OAAA,GAAUgT,kBAAAA,CAAmB1K,KAAQ2K,GAAAA,EAAM;AAAE,MAAA,MAAA,EAAA,CAhDxC76B,GAAAA,KAAqB;AACnC,QAAA,IAAM6vC,GAAAA,GAAQT,GAAAA,CAAS,OAAA,EACjBU,GAAAA,GAAST,GAAAA,CAAc,OAAA;AAC7B,QAAA,IAAI,CAACQ,GAAAA,IAAS,CAACC,GAAAA,EAAQ;AACvB,QAAA,IAAMlb,GAAAA,GAAOib,IAAM,qBAAA,EAAsB,EACnCQ,OAAcjkB,GAAAA,CAAG,OAAA,GAAUkkB,OAAW1b,GAAAA,CAAK,KAAA;AAGjD,QAAA,IAAId,GAAAA,EAAM;AACR,UAAA,IAAMyc,MAASH,GAAAA,CAAY,GAAA,CAAId,EAAe,CAAA,EACxCkB,GAAAA,GAAK1E,IAAMuE,GAAAA,EAAY,CAAC,KAAK,GAAA,CAAI,GAAGE,GAAM,CAAA,EAAG,CAAA,GAAI,KAAK,GAAA,CAAI,GAAGA,GAAM,CAAC,CAAA;AAC1E,UAAA,KAAA,IAAStvC,GAAAA,GAAI,GAAGA,GAAAA,GAAI6uC,GAAAA,CAAO,QAAQtrC,GAAAA,EAAAA,EACjCG,GAAAA,CAAO1D,GAAAA,CAAAA,GAAK;AAAE,YAAA,GAAG6uC,IAAO7uC,GAAAA,CAAAA;AAAI,YAAA,KAAA,EAAOsuC,EAAAA,CAAgBgB,GAAAA,CAAOtvC,GAAAA,CAAAA,GAAKuvC,GAAE;AAAE,WAAA;AAErE,UAAAjtC,GAAAA,CAAQusC,IAAO,GAAA,CAAA,CAAI9vC,SAAM,EAAE,GAAGe,GAAAA,EAAE,CAAE,CAAC,CAAA;AACnC,UAAA;AACF,QAAA;AACA,QAAA,IAAI0vC,GAAAA,GAASJ,OAAcpC,GAAAA,GAAMN,GAAAA,CAAAA;AACjC,QAAAzsC,GAAAA,GAASwsC,GAAAA,CAAS+C,GAAAA,EAAQ/lC,GAAAA,EAAM,CAAC,CAAA;AAIjC,QAAA,IAAIgmC,GAAAA,GAAa,WACbC,GAAAA,GAAa,QAAA;AACjB,QAAA,KAAA,IAAS1vC,GAAAA,GAAI,GAAGA,GAAAA,GAAImvC,GAAAA,CAAY,QAAQpwC,GAAAA,EAAAA,EACtCC,GAAAA,GAAa,IAAA,CAAK,GAAA,CAAIywC,GAAAA,EAAY/C,MAAMyC,GAAAA,CAAYnvC,GAAAA,CAAE,CAAA,EACtDI,GAAAA,GAAa,IAAA,CAAK,IAAIsvC,GAAAA,EAAY1C,GAAAA,GAAMmC,GAAAA,CAAYnvC,GAAAA,CAAE,CAAA;AAExD,QAAAC,GAAAA,GAAS4qC,GAAAA,CAAM2E,GAAAA,EAAQC,GAAAA,EAAYC,GAAU,CAAA;AAE7C,QAAA,KAAA,IAAS1vC,GAAAA,GAAI,GAAGA,GAAAA,GAAI6uC,GAAAA,CAAO,QAAQ9vC,GAAAA,EAAAA,EACjC2E,GAAAA,CAAO1D,GAAAA,CAAAA,GAAK;AAAE,UAAA,GAAG6uC,IAAO7uC,GAAAA,CAAAA;AAAI,UAAA,KAAA,EAAO6qC,IAAMsE,GAAAA,CAAYnvC,GAAAA,CAAAA,GAAKwvC,GAAAA,EAAQ9C,KAAKM,GAAG;AAAE,SAAA;AAE9E,QAAA1qC,GAAAA,CAAQusC,IAAO,GAAA,CAAA,CAAI9vC,SAAM,EAAE,GAAGe,GAAAA,EAAE,CAAE,CAAC,CAAA;AACrC,MAAA,CAAA;AAcgE,MAAA,KAAA,EAAA,MAP5C;AAClB,QAAA6mB,GAAW,OAAA,GAAU,IAAA;AACrB,QAAA,IAAMkoB,MAAST,GAAAA,CAAc,OAAA;AAC7B,QAAA7qB,GAAAA,CAAc,OAAA,GAAU,IAAA,EACpBsrB,GAAAA,IAAQpL,GAAAA,GAAWoL,GAAAA,CAAO,GAAA,CAAA,CAAI9vC,GAAAA,MAAM,EAAE,GAAGe,GAAAA,GAAI,CAAC,CAAA;AACpD,MAAA,CAAA;AAEuE,MAAA,QAAA,EAAA,MAZhD;AACrB,QAAA6mB,EAAAA,CAAW,OAAA,GAAU,IAAA,EACrBpD,GAAAA,CAAc,OAAA,GAAU,IAAA;AAC1B,MAAA;AASgF,KAAA,EAAGqpB,GAAU,CAAA;EAC/F,CAAA,EACA;AAACa,IAAAA,GAAAA;AAAQlK,IAAAA,GAAAA;AAASE,IAAAA,GAAAA;AAAUiJ,IAAAA,GAAAA;AAAKM,IAAAA,GAAAA;AAAKvjC,IAAAA,GAAAA;AAAMopB,IAAAA,GAAAA;AAAMwb,IAAAA,EAAAA;AAAiBC,IAAAA;AAAe,GACpF,CAAA,EAEMqB,EAAAA,GAAAA,CAAsB7vC,GAAAA,KAAA,CAAmB4D,GAAAA,KAAyB;AAGtE,IAAA,IAAI,OAAO3E,GAAAA,CAAE,MAAA,IAAW,QAAA,IAAYA,GAAAA,CAAE,SAAS,CAAA,EAAG;AAGlDA,IAAAA,GAAAA,CAAG,cAA8B,KAAA,IAAQ,EACzCA,IAAE,cAAA,EAAe,EACjBA,IAAE,eAAA,EAAgB;AAClB,IAAA,IAAMkwB,MAASlwB,GAAAA,CAAE,aAAA;AACbA,IAAAA,GAAAA,CAAE,QAAA,IAAY0E,GAAAA,CAAM,aAAA,GACtByrC,EAAAA,CAAkBjgB,GAAAA,EAAQlwB,GAAAA,EAAGA,GAAAA,CAAE,OAAO,CAAA,GAEtC0vC,EAAAA,CAAexf,GAAAA,EAAQlwB,KAAGqqB,GAAK,CAAA;AAEnC,EAAA,CAAA,EAEMwmB,EAAAA,GAAAA,CAAsB9vC,GAAAA,KAAA,CAAmB4D,GAAAA,KAAuB;AAIpE,IAAA,IAHI,CAACD,GAAAA,CAAM,aAAA,KACX1E,GAAAA,CAAE,cAAA,IAEE,CADa0E,GAAAA,CAAM,aAAA,CAAc2lB,GAChC,CAAA,CAAA,EAAU;AACf,IAAA,IAAMjf,GAAAA,GAAOsjC,GAAAA,CAAO,MAAA,CAAA,CAAQ1uC,KAAG2E,GAAAA,KAAM1D,GAAAA,KAAMopB,GAAK,CAAA,CAAE,IAAA,CAAIrqB,GAAAA,MAAM,EAAE,GAAGe,KAAE,CAAE,CAAA;AACrEyjC,IAAAA,GAAAA,CAAQp5B,GAAI,CAAA,EACZs5B,GAAAA,GAAWt5B,GAAI,CAAA;EACjB,CAAA,EAEM0lC,EAAAA,GAAAA,CAAsB/vC,GAAAA,KAAyC;AACnE,IAAA,IAAI,OAAOf,GAAAA,CAAE,MAAA,IAAW,QAAA,IAAYA,GAAAA,CAAE,SAAS,CAAA,EAAG;AAElD,IAAA,IAAM+wC,GAAAA,GAAAA,CADarsC,GAAAA,CAAM,UAAA,KAAegqC,GAAAA,CAAO,MAAA,KAAW,IAAI,cAAA,GAAiB,MAAA,CAAA,MAC9C,cAAA,IAAkBA,GAAAA,CAAO,MAAA,GAAS,CAAA;AAGnE,IAAA,IAFI,CAAChqC,GAAAA,CAAM,UAAA,IAAc,CAACqsC,GAAAA,IAErB/wC,GAAAA,CAAE,MAAA,CAAuB,OAAA,CAAQ,CAAA,CAAA,EAAIkB,GAAAA,CAAE,KAAA,CAAA,CAAO,CAAA,EAAG;AACtD,IAAAH,IAAE,cAAA,EAAe;AACjB,IAAA,IAAM8uC,MAAQT,GAAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAACS,GAAAA,EAAO;AACZ,IAAA,IAAMjb,GAAAA,GAAOib,GAAAA,CAAM,qBAAA,EAAsB,EACnChwC,GAAAA,GAAI2vC,EAAAA,CAAAA,CAASxvC,GAAAA,CAAE,OAAA,GAAU40B,GAAAA,CAAK,IAAA,IAAQA,GAAAA,CAAK,KAAA,EAAOA,IAAK,KAAK,CAAA;AAElE,IAAA,IAAIlwB,IAAM,UAAA,EAAY;AACpB,MAAA,IAAMssC,GAAAA,GAAUtsC,GAAAA,CAAM,UAAA,CAAW7E,GAAC,CAAA;AAClC,MAAA,IAAI,CAACmxC,GAAAA,EAAS;AACd,MAAA,IAAM5lC,GAAAA,GAAO,CAAC,GAAGsjC,GAAAA,CAAO,GAAA,CAAA,CAAI1uC,GAAAA,MAAM,EAAE,GAAGe,GAAAA,EAAE,CAAE,CAAA,EAAGiwC,GAAO,CAAA;AACrDxM,MAAAA,GAAAA,CAAQp5B,GAAI,CAAA,EACZs5B,GAAAA,GAAWt5B,GAAI,CAAA;AACf,MAAA;AACF,IAAA;AAEA,IAAA,IAAIif,GAAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,IAASppB,GAAAA,GAAI,GAAGA,GAAAA,GAAIytC,GAAAA,CAAO,QAAQ1uC,GAAAA,EAAAA,EAC7B,IAAA,CAAK,GAAA,CAAI0uC,GAAAA,CAAOztC,GAAAA,CAAAA,CAAG,QAAQpB,GAAC,CAAA,GAAI,KAAK,GAAA,CAAI6uC,GAAAA,CAAOrkB,GAAAA,CAAAA,CAAO,KAAA,GAAQxqB,GAAC,CAAA,KAAG8I,GAAAA,GAAQ1H,GAAAA,CAAAA;AAEjF,IAAA,IAAMmK,MAAOsjC,GAAAA,CAAO,GAAA,CAAA,CAAI1uC,GAAAA,MAAM,EAAE,GAAGe,GAAAA,EAAE,CAAE,CAAA,EACjC,CAACgvC,GAAAA,EAAKC,GAAAA,IAAOrB,EAAAA,CAAcvjC,GAAAA,CAAKif,GAAAA,CAAAA,EAAQ;MAAE,MAAA,EAAQjf,GAAAA;MAAM,KAAA,EAAAzC;AAAM,KAAA,EAAGglC,KAAKM,GAAG,CAAA,EAC3E3R,MAAQwP,GAAAA,CAAMjsC,GAAAA,EAAGkwC,KAAKC,GAAG,CAAA;AACzBC,IAAAA,GAAAA,KAAe,SAAA,KAAWnrC,GAAAA,GAAQ2pC,EAAAA,CAAanS,GAAAA,EAAOlxB,GAAAA,EAAMif,GAAAA,EAAOsjB,GAAAA,EAAKM,GAAAA,EAAKvjC,GAAI,CAAA,CAAA,EACrFxJ,GAAAA,CAAKmpB,GAAAA,CAAAA,GAAS;AAAE,MAAA,GAAGjf,IAAKif,GAAAA,CAAAA;MAAQ,KAAA,EAAOiS;AAAM,KAAA,EAC7CkI,IAAQp5B,GAAI,CAAA,EAEZykC,IAAM,gBAAA,CAA8B,CAAA,CAAA,EAAI3uC,IAAE,KAAA,CAAA,CAAO,CAAA,CAAEmpB,GAAAA,GAAQ,KAAA,EAAM,EACjEqlB,GAAeG,GAAAA,EAAO7vC,GAAAA,EAAGqqB,KAAOjf,GAAI,CAAA;AACtC,EAAA,CAAA,EAEM6lC,EAAAA,GAAAA,CAAkBjxC,GAAAA,KAAA,CAAmBe,GAAAA,KAA0B;AACnE,IAAA,IAAMmwC,GAAAA,GAAW1C,GAAAA,CAAY9jC,GAAAA,EAAMijC,GAAAA,EAAKM,GAAG,GACvCthB,GAAAA,GAAQ,CAAA,EAERwkB,GAAAA,GAAY,CAAA,EACZC,GAAAA,GAAgC,IAAA;AAEpC,IAAA,QAAQpxC,IAAE,GAAA;MACR,KAAK,YAAA;MACL,KAAK,SAAA;AACH,QAAAwE,GAAAA,GAAQxE,IAAE,QAAA,GAAWkxC,GAAAA,GAAW,KAAKA,GAAAA,EACrCjwC,GAAAA,GAAYjB,GAAAA,CAAE,QAAA,GAAW,EAAA,GAAK,CAAA;AAC9B,QAAA;MACF,KAAK,WAAA;MACL,KAAK,WAAA;AACH,QAAAwE,GAAAA,GAAQxE,GAAAA,CAAE,QAAA,GAAW,CAACkxC,GAAAA,GAAW,EAAA,GAAK,CAACA,GAAAA,EACvCjwC,GAAAA,GAAYjB,GAAAA,CAAE,QAAA,GAAW,GAAA,GAAM,EAAA;AAC/B,QAAA;MACF,KAAK,QAAA;AACH,QAAAwE,GAAAA,GAAQ0sC,GAAAA,GAAW,EAAA,EACnBjwC,GAAAA,GAAY,EAAA;AACZ,QAAA;MACF,KAAK,UAAA;AACH,QAAAuD,GAAAA,GAAQ,CAAC0sC,GAAAA,GAAW,EAAA,EACpBjwC,GAAAA,GAAY,GAAA;AACZ,QAAA;MACF,KAAK,MAAA;AACH,QAAAwF,GAAAA,GAAS,MAAA;AACT,QAAA;MACF,KAAK,KAAA;AACH,QAAAA,GAAAA,GAAS,KAAA;AACT,QAAA;AACF,MAAA;AACE,QAAA;AACJ;AAEA,IAAA1F,IAAE,cAAA,EAAe;AACjB,IAAA,IAAMqK,MAAOsjC,GAAAA,CAAO,GAAA,CAAA,CAAI1uC,GAAAA,MAAM,EAAE,GAAGe,GAAAA,EAAE,CAAE,CAAA,EACjC,CAACgvC,GAAAA,EAAKC,GAAAA,IAAOrB,EAAAA,CAAcvjC,GAAAA,CAAKif,GAAAA,CAAAA,EAAQ;MAAE,MAAA,EAAQjf,GAAAA;MAAM,KAAA,EAAApL;AAAM,KAAA,EAAG2tC,GAAAA,EAAKM,GAAG,CAAA,EACzEz1B,GAAAA,GAAK,KAAK,GAAA,CAAIm1B,GAAAA,EAAKoC,GAAG,CAAA,EACtBt3B,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAIw1B,GAAAA,EAAK+B,GAAG,CAAA,EACxBnwC,GAAAA;AAMFA,IAAAA,GAAAA,GALEuxC,GAAAA,KAAW,MAAA,GAAY54B,GAAAA,GAClB44B,GAAAA,KAAW,QAAW34B,GAAAA,GACtBsJ,GAAAA,CAAM,MAAA,GAAS,CAAA,GAClBusB,EAAAA,CAAUvsB,GAAAA,EAAO3W,IAAKif,GAAAA,CAAAA,CAAO,KAAA,EAAO8mB,GAAAA,GAAY,CAAA,GAAI,CAAA,GAAI,IAAI,IAAA,CAAK,GAAA,CAAIA,GAAS,CAAC,CAAA,GAE/EzD,GAAAA,CAAStiC,IAAKif,GAAAA,CAAAA,CAAO,KAAA,GAAQsC,GAAAA,EAAOjiB,GAAAA,EAAMijC,GAAG,GAEnD9rC,GAAAA,GAAIiqC,GAAAA,CAAMjsC,GAAAA,EAAG2Y,GAAAA,EAAIC,GAAE,CAAA,EACfw3B,QAAe,SAAA,KAAWpuC,GAAAA,GAAI4sC,EAAAA,CAAa5uC,GAAAA,EAAGuL,GAAAA,EAAMif,GAAAA,EAAO7R,GAAAA,EAAIC,GAAAA,EAAI/N,GAAI,CAAA,CAAA,EAC3E/B,GAAAA,CAAK0hB,GAAAA,CAAAA,GAAS;AAAE,MAAA,GAAGjf,IAAKif,GAAAA,CAAAA;MAAQ,KAAA,EAAOxqB;AAAE,KAAA,EACzC2kC,GAAAA,CAAQp5B,GAAI,CAAA,EACZs5B,GAAAA,GAAWt5B,GAAI,CAAA;EACjB,CAAA,EAEM8qB,EAAAA,GAAYxxB,GAAAA,CAAM,gBAAA,IAAoB,MAAA,EACtC2sC,EAAAA,GAAgB3sC,GAAAA,CAAM,aAAA,EAEtB4sC,EAAAA,GAAOC,GAAAA,KAAY,MAAA,EACnBC,EAAAA,GAAmC,EAAC;AACtCF,EAAAA,EAAAA,KACFhX,EAAAA,CAAS,mBAAA,CAAA,GAAuB,6BAChCA,EAAAA,CAAS,iBAAA,CAAA,GAAqB,8BAAA,CAAA,EAG5BmX,QAAgB,MAAA,KAAWnX,EAAAA,CAAS,mBAAA,CAAA,GAAuB,GAAGmX,GAAAA,CAAAA,EAAAA,CAAAA,CAAAA;AAElE,EAAA,IAAMC,KAAYhtC,GAAAA,CAAM,UAAA,IAAc,KAAA,EAChCitC,EAAAA,GAAWzC,IAAS,MAAA,GAAS,CAAA,EAC7B0C,EAAAA,GAAeF,EAAAA,KAAc,SAC/B,EAAC,GACDxC,IACG,GAAA,CAAA,CAAKlvC,KAAMe,GAAAA,MAAO;IAAE,IAAA,EAAAf,GAAAA;IAAM,CAAA,EAAAe;GAAE,CAAE,CAAA,CAC9B,MAAA,CAAA,CAAQ,EAAE,IAAA,EAAAf,KAAM,CAAA,EAAAe,GAAAA,EAAA,KAAQitC,GAAAA,CAAK,KAAA,KAAU,MAAA,KAAc0D,OAAc,KAAA,IAASzwC,GAAAA,KAAM,CAAA,IAAKA,GAAAA,KAAM0wC,EAAAA,CAAS,CAAA,EAGvGE,EAAAA,GAAeD,EAAAA,CAAa,MAAA,GAAS,CAAA,oBACzCjtC,GAAAA,CAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWzD,GAAAA,CAAE,UAAA;IAAY,yBAAA,EAAA,IAAA;IAAwB,aAAA,EAAY,MAAA;IAC/D,QAAA,EAAA0wC,EAAAA,CAAa,GAAA,CAAA,CAAK,EAAE,IAAA,EAAA5xC,GAAAA,EAAM,CAAA,EAAAe,GAAAA,EAAA,qBACzB4D,GAAAA,CAAC,MAAA,EAAD;AAEE,MAAA,SAAA,EAAWzD,GAAAA,CAAE,SAAA;MACb,wBAAA,EAAA,IAAA;MACA,eAAA,EAAewtC,GAAAA,CAAO,KAAA,CAAK3tC,GAAAA,KAAKA,IAAE,KAAA,KAAUitC,GAAAA,CAAK,KAAK,CAAA,GAAI,MAAA,GAAS,MAAA;AACnE,MAAA,WAAA,EAAW/sC,GAAAA,KAAM,CAAA,GAAI,OAAA,GAAUA,GAAAA,KAAM0wC,KAAW,KAAA,GAAQ,MAAA;MACxD,KAAA,EAAO,EAAE,MAAM,CAAA,EAAGrC,EAAAA,CAAgBtB,IAAK,KAAK,CAAA,GAAI,GAAA,CAAA,CAAA,CAAA,EAAO;AAEtD,MAAA,QAAA,EAAAA,GAAAA,CAAK;KACF,EARCA,GAAAA,CAAK,KAQN,CACP;AACE,GAAA,GAED8D,GAAAA,GAAY;IAAC5wC,GAAAA,CAAE,IAAA;AAAMowC,IAAAA,EAAAA,IAAQpwC,GAAAA,CAAE,IAAA;AAAM2wC,IAAAA,EAAAA,IAAgB3wC,GAAAA,CAAE,cAAA;AAAgBkE,IAAAA;AAAS,GAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAEhH,EAAA,uBACEZ,KAAC,KAAA,EAAD;IACE,SAAA,EAAWstC,GAAAA;AACX,IAAA,KAAA,EAAO,OAAO,IAAA,CAAKN,EAAQ,CAAA,CAAE,MAAA,GAAS,IAAKA,EAAAA,GAA6B,MAAA;IAF1E,QAAA,EAAA,iBAIEhtC,IAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWtD,GAAAA,CAAE,GAAA;MAAlB,QAAA,EAAA,iBACAsD,IAAAA,CAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAWtD,GAAAA,CAAE,KAAA;QAAO,GAAA,EAAKkuC,GAAAA;QAAU,aAAA,EAAe0B,EAAAA;QAAvD,QAAA,EAAA;UACGpsC,GAAAA,CAAM,WAAA,oBACLC,GAAAA,CAAC,KAAA,EAAD;AAAK,YAAA,SAAA,EAAWzD,GAAAA,CAAE,UAAA;AACf,YAAA,QAAA,EAAAwD,IAAM,WAAA,CAAY;AACjB,cAAA,UAAA,EAAY0qC,GAAAA,CAAS,OAAA,EAAS,qBAAA,EAAsB,CAAE,KAAA,IAAS,CAAA;cAC/D,eAAA,EAAA7H;aACD;WACE,CAAA;AAEL7iC,UAAAA,CAAAA,GAAAA,CAAM,aAAa,IAAA,KAASqd,GAAAA,CAAM,SAAS,CAAA,oBAC3Cpd,IAAC,KAAA,EAAD;AAAK,YAAA,SAAA,EAAWzD,GAAAA,CAAE,KAAA;YAAO,mBAAA,EAAA,IAAA;YAAkB,aAAA,EAAY,MAAA;YACpD,QAAA,EAAA6gB,GAAAA,CAAM,GAAA,CAAA,CAAI/hB,GAAAA,KAAK;AACd,cAAA,IAAM8E,GAAAA,GAAIwqC,GAAgBzvC,GAAC,CAAA;AAC3B,cAAA,uBACE8E,IAAC,MAAA,EAAD;AAEE,gBAAA,SAAA,EAAWzD,GAAAA,CAAE,IAAA;gBACb,kBAAA,EAAA,IAAA;AACA,gBAAA,eAAA,EAAe,OAAO4D,GAAC,CAAA;AACvB,gBAAA,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAGA,GAAAA,GAAI,GAAA,CAAA,CAAA,CAAA;AACvB,eAAA,EALMjF,GAKN,CAAA;YAEL,CAAC;WACE,CAAA;AAENgyC,UAAAA,EAAAA;UACAnD,GAAAA,CAAO,GAAA,CAAA,CAAK1uC,GAAAA,EAAOe,GAAAA,KAAM;AACxB,YAAA,IAAMgxC,GAAAA,GAAYnD,GAAAA,CAAM,KAAA,KAAU,SAAA,EAC5BoD,GAAAA,GAAe,OAAOpD,GAAAA,CAAM,KAAA,IAAU,QAAA,IAAYA,GAAAA,CAAM,KAAA,KAAU,IAAA,GAAOA,GAAAA,CAAM,MAAM,MAAA,GAAS,IAAA,EAC9FhoC,GAAAA,GAAM,CAAA,EAAG1F,GAAAA,CAAE,KAAA,CAAA,EAAQ6wC,GAAAA,GAAY,CAAA,CAAA,EAAI7wC,GAAAA,CAAE,OAAA,CAAA,CAAA,GAAY,EAAA,CAAA,CAAA;AACvD,YAAA,uBACEyD,IAAC,KAAA,EAAD;cAEE,IAAA,EAAK,QAAA;cACL,QAAA,EAAU,CAAA;cACV,kBAAA,EAAiB,YAAA;cACjB,eAAA,EAAegpC,GAAAA;cACf,eAAA,EAAeM,GAAAA;AACf,cAAA,eAAA,EAAeW,GAAAA,CAAM,KAAA;AACrB,cAAA,gBAAA,EAAgBA,GAAAA,CAAM,SAAA;cACtB,YAAA,EAAY,CAAC3pB,GAAAA,EAAW2pB,GAAAA,CAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;cAClE,SAAA,EAAWhoC,GAAAA;cACX,KAAA,EAAO,EAAE,MAAM,CAAA,EAAG0oC,EAAAA,CAAgBV,IAAM,KAAK,CAAA,GAAI,GAAA,CAAA,CAAA,CAAA,EAAO;AACxD,cAAA,aAAA,EAAegC,GAAmB3vC,GAAC,CAAA;AACnC,cAAA,SAAA,EAAWgwC,GAAehwC,GAAC,CAAA;AAC3B,cAAA,aAAA,EAAe4vC,GAAmB5vC,GAAC,CAAA;AAElC,cAAA,QAAA,EAAA+wC,MAAeA,GAAAA,CAAa;gBAAE,KAAA,EAAO,EAAA;gBAAI,MAAA,EAAQ,EAAA;gBAAI,QAAA,EAAU;eAAO,CAAA,GAAKpD,IAAM,KAAA,IAAS;AACxF,aAAA,EAhBE3tC,GAgBF,CAAA;UAET,CAAC;AACE;AACJ,OAAA,CAAA,EAAAi1B,EAAAA,KAAc,cAAA,oBACbvxB,IAAC,MAAA,EAAD;QAAM,cAAA,EAAa,QAAA;AAAS,QAAA,SAAA,EAAWzD,GAAAA,CAAE,aAAA;QACtC,QAAA,EAAAwtC,GAAAA,CAAO,GAAA,CAAA,CAAK1uC,GAAAA,EAAGe,GAAAA,qBACdyD,IAAAA,CAAC,MAAA,EAAD,EAAA,QAAA,EAAA,CAAevD,GAAAA,GAAI,CAAA,GAAI,QAAQ,EAAA,EAAIowC,EAAAA,GAAgBA,EAAAA,CAActwC,GAAAA,EAAGE,GAAC,CAAA,GAAI+tC,EAAAA,CAAejuC,GAAC,CAAQ,CAAA,EAAA,EAAtFE,GAAsF,CAClG;AACG,OAAA,CAEH;AACJ,KAAA,CAAA,EAAAi1B,EAAAA,KAAc,aAAA,oBACbvxB,IAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWzD,GAAAA,CAAE,aAAA;AACf,MAAA,QAAA,EAAAwtC,IAAO,GAAA,CAAA,CAAK1uC,KAAGe,GAAAA,qBACd4D,IAAC,MAAA,EAAD;QAEE,cAAA,EAAa,OAAA;AACb,QAAA,SAAA,EAAWzD,GAAAA,CAAE,YAAA;QACb,KAAA,EAAO,EAAE,MAAM,CAAA,EAAGouC,EAAAA,CAAgBvuC,IAAE,KAAK,CAAA,GAAI,GAAA,CAAA,CAAA,CAAA,EAAO;AAEnD,QAAA,QAAA,EAAAswC,KAAgBA,EAAAA,CAActwC,GAAAA,EAAGE,GAAC,CAAA,GAAI+tC,GAAejuC,GAAC;AACnD,OAAA,EANCE,GAMD,CACP;AACE,KAAA,CAEJ;;AAET;;;;;;ICrnBagxC,GAAAA,GAAcluB,UAAAA,CAAW,SACpChjB,GAAAA,EACAE,GAAAA,EACA;AACA,EAAA,IAAM,EAAE,KAAA,EAAAwF,GAAAA,EAAO,GAAA,EAAAkC,MAAM,CAAA,EAAG,GAAA,EAAAzH,GAAAA,GAAM,GAAA,EAAK,WAAAjB,GAAAA,EAAW,KAAA,EAAAkB,GAAAA,EAAO,GAAGsD,KAAAA,GAASC,GAAAA,EAC3DgT,GAAAA,GAAOu2B,GAAAA,GAAMN,GAAAA,EACbpsC,GAAAA,GAASmW,GAAAA,GAAO,CAAA,GAAA,CAAM,KAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI6b,GAAAA,EAAOoa,GAAG,CAAA,EAAGM,GAAG,CAAA,GAAIN,GAAAA,IAAOj2B,MAAQ,GAAA,GAAM,CAAA;AACvF,EAAA,uBACE1X,IAAC,OAAA,EAAD;IACE,GAAIyE,GAAAA;IACC,GAAA,EAAAxD,GAAAA;IACL,IAAA,EAAK,OAAA;IACE,KAAA,EAAAwF,GAAAA;IACF,GAAA,EAAAkC,GAAAA;IACA,GAAA,EAAAzH,GAAAA;IACL,SAAA,EAAW;MAACgxC,GAAAA,CAAO,KAAA;MAAOhxC,GAAAA,CAAE,KAAA;AAAOkE,MAAAA;AAAS,KAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IACtE,KAAA,EAAO;AAAG,MAAA,eAAA,EAA4B,GAAG7D,GAAAA,CAAAA,CAAAA,CAAAA;MAAW,GAAGqlB;AAAM;GAC9D,CAAA;AAEL,CAAC;;;;;;;;ACLD,SAAgBurB,IAAWhxC,GAAAA,EAAwB;AACjD,EAAA,IAAM,EAAE,KAAA,EAAAC,GAAAA,EAAO,KAAA,EAAAC,MAAQ,KAAA,EAAO,KAAA,EAAAyD,GAAAA,GAAQ,KAAA,EAAO,SAAAjD,GAAAA,EAAS,QAAA,EAAAhB,GAAAA,EAAU,SAAA,EAAAkE,KAAA,GAAcL,GAAAA,EACxE0tC,GAAAA,GAAOC,MAAAA,CAAO9e,OAAS,SAAS,CAAA,EAChC+e,GAAAA,GAAOF,GAAAA,CAAK,MAAM,CAAA,EAAG,CAAC,CAAA,EACtBG,GAAAA,GAAUC,WAAWJ,GAAI,CAAA,EACzBK,GAAAA,GAAW,IAAA,CAAK,MAAMF,GAAAA,GAAU,GAAG,CAAA,EAInC,CAACG,KAAYC,GAAAA,CAAAA,GAAiBzuC,QAAAA,CAAwB,IAAI,GAC1D,CAAC0uC,GAAAA,EAAYC,GAAAA,CAAAA,GAAiB3uC,SAAwB,IAAI,CAAA,EAC1D4uC,GAAAA,GAAaJ,GAAAA,IAAcJ,KAC3BS,GAAAA,GAAkBH,GAAAA,IAAcH,GAAAA,EAEhCO,GAAAA,GAAAA,CAAWhzC,GAAAA,EAAae,GAAAA,KAC5B+9B,GAAAA,GAAQmU,WAAAA,CAAYC,KAAKC,GAAG,CAAA,GAAID,GAAAA,EAK5BE,GAAAA,GAAchG,OAASsF,GAAAA,KAAe,IAAA,EAItCzG,GAAAA,GAAAA,CAAUjsC,KAAae,GAAAA,KAAsB;AACjD,IAAA,CAAI2xC,GAAAA,KAAe,IAAA,IAAQE,GAAAA,KAAe,IAAA,MAC1ClO,IAASsO,GAAAA,CAAQE,GAAAA,EAAKC,GAAG,CAAC,CAAA,EAC1BR,GAAAA,CAAc,IAAI,CAAA,EAClBE,IAAc,IAAI,CAAA,CAAA;AACpB,EAAA,CAAA;AAEA,EAAA,uBACElqC,KAAC,MAAA,EAAD;IACE,SAAA,EAAW,CAACzH,IAAE,IAAA,EAAMkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACvD,IAAA,GAAKgoC,OAASsF,GAAAA,KAAe,IAAA,GAAO,EAAE,YAAA,EAAc,EAAA,KAAO,EAAC;IAF9D,QAAA,EAAA,iBAIEjsC,GAAAA,CAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWvF,GAAAA,CAAE,IAAA;MACjB,QAAA,kBAAAuF,IAAC,OAAA,EAAD;AACE,QAAA,SAAA,EAAWvF,GAAAA,CAAE,KAAA;QACb,IAAA,EAAK,OAAA;QACL,KAAA,EAAO4xC,GAAAA;QACP,YAAA,EAAYpuC,GAAAA,CAAM,YAAA,CAAA,IAAiB,OAAA;AACnC,QAAA,OAAA,EAAA,CAAU1E,GAAAA,KAAM;AACd,UAAA,IAAMkzC,GAAAA,GAAOlzC,IAAE,MAAA,CAA4B,KAAA;AAC3C2yC,UAAAA,GAAAA,CAAcO,GAAG,CAAA,EACjB1O,GAAAA,GAAUwO,IAAQE,GAAAA,EAAKH,GAAAA,GAAkB,GAAG,CAAC,CAAA;AAC/C,QAAA,CAAA;AACA,QAAA,MAAA,EAAA,MAAc9G,GAAAA,CAAO6G,GAAAA,EAAYC,GAAAA,GAAkB,GAAG;OACvD;KACG,CAAA,EACLjU,GAAAA,oBACCn2B,IAAAA,CAAA1D,QAAAA,EAAA,EAAA,QAAA,EAAA,iBACEwB,GAAAA,CAACwrC,GAAAA,EAAD;AACE,MAAA,SAAA,EAAW/wC,GAAAA,CAAE,UAAA;MACb,GAAA,EAAK,CAAA;MACL,GAAA,EAAK,GAAA;MACL,IAAA,EAAM,CAAA;MACN,KAAA,EAAO6xC,GAAAA;MACP,QAAA,EAAUK,GAAAA;AACV,MAAA,YAAA,EAAY1uC,IAAM,YAAA,CAAA,GAAgB,GAAGA,GAAAA,CAAM,YAAA,CAAA,CAAA,QAAA,CAAA,GAA0B,SAAA;AACrE,MAAA,OAAA,EAAA,CAAU1E,GAAAA,KAAM;AACd,QAAA,IAAMqzC,GAAAA,GAAM,MAAA,CAAQrzC,GAAAA,CAAE,MAAA,CAA4B,KAAK,CAAA;AACvD6yC,QAAAA,GAAAA,CAAcQ,GAAG,CAAA,EACjB7O,GAAAA,GAAUwO,IAAQF,GAAAA,EAAYO,GAAAA,GAAM,GAAG,CAAC,CAAA;AAC1C,MAAA,CAAA;AACA,MAAA,WAAA,EAAA,MAAmBpH,GAAAA,CAAO6G,GAAAA,EAAYC,GAAAA,GAAkB,GAAG,CAAA;AAC3D,MAAA,eAAA,EAAA,MAAuB9G,GAAAA,CAAO6G,GAAAA,EAAYC,GAAAA,GAAkB,GAAG,CAAA;AAC/D,MAAA,OAAA,EAAA,MAAe9G,GAAAA,CAAO6G,GAAAA,EAAYC,GAAAA,GAAkB,GAAG,CAAA;AACvD,MAAA,MAAA,EAAA,MAAc9G,GAAAA,CAAO6G,GAAAA,EAAYC,GAAAA,GAAkB,GAAG;KACvD,CAAA,kBACDpqC,IAAAA,CAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWzH,GAAAA,CAAE,YAAA;MAAc,aAAA,EAAY,MAAA;MAA7C,QAAA,EAAA,CAAqD6xC,KAAgB,GAAO;KAC5E,CAAA,CAAA,EAAA,CAEA;;AAEV;ACxFA,IAAMO,GAAAA,GAAgB;EAAE,QAAA,EAAU,GAAA;EAAK,MAAA,EAAQ,CAAA;EAAG,GAAA,EAAK,CAAA;EAAG,GAAA,EAAK;AAAG,CAAA;AAOlE,SAAgBC,GAAmBvzC,GAAAA,EAAuD;AACxF,EAAA,IAAM,EAAE,QAAA,EAAAe,GAAAA,EAAU,OAAA,EAAA4D,GAAAA,GAAU,IAAI,WAAA,EAAAH,GAAAA,EAAa,KAAA,EAAAvD,GAAAA,EAAA,GAAU+pB,GAAAA;AAEvD,EAAA,OAAA,CAAQhrB,GAAAA,KAAkB;AACxB,IAAA,IAAM+hB,MAAkB,EAAC;AACzB,IAAA,KAAA,IAAS9gB,GAAAA,GAAI,CAAA,EAAGA,GAAAA,IAAKq2B,GAAAA,EAASt3B,GAAAA,EAAAA,EAAK;AACjC,MAAA,IAAMe,MAAIE,GAAAA,GAAIq2B,GAAAA;AACd,MAAA7wB,GAAAA,CAAM,IAAA,CAAK,CAAA,EAAG+sC,GAAAA,CAASzyC,GAAC,CAAA,CAAA,CAAA,EAAA,CAAMA,GAAAA,GAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAA;AACtD,IAAA;AACA,IAAA,IAAM0yC,GAAAA,GAAe,6BAA6B1xB,GAAAA,CAAM,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,CAAA,EAE3DsW,MAAmB,EAAC;AAC1B,IAAA,IAAIqb,GAAAA,EAAa;AACf,MAAA,IAAMC,MAASlsC,GAAAA,CAAI,eAAA,CAAgBisC,GAAAA,CAAY,CAAA,CAAE,CAAA,GAAI,GAAA,EAC/CE,GAAAA,GAAUnsC,GAAAA,CAAI,gBAAgBisC,GAAAA,CAAY,CAAA,CAAE,CAAA,GAAI,KAChD3uC,GAAAA,GAAI;QAAE,GAAGuuC,GAAAA;QAAe,GAAGO;OAAM,EACjCC,GAAAA,GAAS,CAAA,0BAAA,EAA6B/uC,GAAAA,CAAE,QAAA,CAAA,mBAAA,EAA8BA,IAAE,MAAA,CAAA,uBAAA,EAAgCA,GAAAA,CAAE,MAAA,CAAA,GAAA,EAAYA,GAAAA,CAAE,SAASA,GAAAA,CAAE,GAAA,CAAA,GAAA,CAAA,EACnIgvC,GAAAA,GAAW,CAAA,sCAAA,EAAyChvC,GAAAA,CAAE,GAAA,CAAA,eAAA,CAAA,EACtDivC,GAAAA,GAAa,CAAA,gBAAA,EAAmBD,GAAAA,CAAAA,EAAAA,EAAaA,GAAAA,CAAAA,CAAAA,CAAAA;AAMnD,MAAA,IAJIJ,GAAAA,GAAS,CAAA,KACXtb,GAAAA,CAAO,IAAA,CAAK,CAAA,EAAG2b,GAAAA,CAAAA,UAAAA,EAAuBL,GAAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAA,gBAAA,CAAmB,GACzEtb,GAAAA,CAAO,IAAA,CAAK,CAAA,EAAGyb,GAAAA,CAAAA,UAAAA,EAAmBH,GAAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAA,gBAAA,CAAmB,CAAA,CAAA,EAEnEC,GAAAA,GAAU,GAAA,EAAK;AACjB,QAAA,IAAMK,GAAAA,GAAAA,CAAM,GAAA,GAAML,GAAAA,EAAS,OAAA,CAAQ,CAAC,CAAA;AACpCvb,QAAAA,GAAAA,CAAO,IAAA,CAAK,CAAA,EAAG2b,GAAAA,cAAwBC,GAAAA,CAAAA,gBAAAA,CAAoB,CAAA,EAC3D5b,GAAAA,CAAO,IAAA,CAAK,CAAA,EAAGyb,GAAAA,CAAAA,WAAAA,EAAoBG,GAAAA,CAAAA,gBAAAA,CAAoB,CAAA;AACzD,MAAA;AACF,IAAA;AACA,IAAA/yC,GAAAA,CAAO,KAAKuyC,GAAY,CAAA;AAExB,IAAA,IAAM7sB,GAAAA,GAAuB;MAC3B,QAAA,EAAU,UAAA;MACV,KAAA,EAAO,CAAA;MACP,UAAA,EAAYyR,GAAAA,CAAO,KAAK,IAAI;AAC9B,KAAA;AACA,IAAA,uBAAOx2B,GAAAA,CAAC,KAAA,EAAD,EAAY,KAAA,EAAA5B,KAAQ,CAAA;AAC7B,EAAA,CAAA;AACF;;;;;;ICtDMi0C,EAAAA,GAAgD;AACpD,EAAA;IAAE,KAAA,EAAO,iBAAA;IAAmB,KAAA,EAAO;AAAS,GAAA;AAC5C,EAAA;IAAE,KAAA,EAAO,iBAAA;IAAmB,KAAA,EAAO;AAAS,GAAA;AAC5C,EAAA;IAAE,KAAA,EAAO,gBAAA;IAAkB,KAAA,EAAO;AAAQ;AAC5C,CAAA;IAEMC,EAAAA,GAA+C;AACnD,EAAA;IAAE,KAAA,EAAO,KAAA;IAAO,KAAA,EAAO;AAAO,GAAA;AAC9B,EAAA;IAAE,KAAA,EAAO,OAAA;IAAS,KAAA,EAAO;AAAQ,GAAA;AACjC,EAAA;IAAE,KAAA,EAAO,OAAA;IAAS,KAAA,EAAO;AAAQ;AACnC,CAAA;IAGMC,EAAAA,GAAY,CAAA;AA0ClB,SAAgBC,GAAe7vC,GAAAA,EAA0C;AACvE,EAAA,IAAM,EAAE,KAAA,EAAAvD,GAAAA,EAAO,OAAA,EAAAwF,GAAAA,EAAS,QAAA,EAAAkC,GAAAA,EAAU,UAAA,EAAA1I,GAAAA,GAAa,IAAA,EAAM,WAAA,EAAAkB,GAAAA,GAAc,IAAA,EAAM,SAAA,EAAAC,GAAAA,EAAA,GAAcsD,GAAAA,EACjFqd,GAAAA,GAAQwR,GAAAA,CAAM,KAAA,EACd+gB,GAAAA,GAAQ/gB,GAAAA,CAAM,WAAA,IAAe,KAAA,EAE7BghB,GAAAA,GAAYjpB,WAAAA,CAAAA,CACftrB,GAAAA,MAAoC;IAAE,GAAGuzB,GAAAA;IAAO,KAAA,EAAOnoB;GAAK,CAAA,EAC7D,CAACmoB,GAAK,CACR,CAAA,EAEMmb,MAAsB3sB,GAAAA,CAAM,GAAA,CAAA,CAAK/hB,GAAAA,MAAU;AAAE,IAAA,KAAA,EAAOguC,GAAAA,CAAK,MAAA;AAAQ,IAAA,KAAA,EAAOA,GAAAA,CAAK;AAAM,GAAA,CAAE,GAErFwG,GAAAA,GAAAA,CAAex0C,QACnBoL,GAAAA,CAAK,GAAA,CAAA,CAAKpL,GAAAA,MAAO;AAAE,IAAA,MAAA,EAAQe,GAAAA,CAAE,KAAA;AAAO,IAAA,KAAA,EAAOA,GAAAA,CAAE;GAAM,CAAE,CAAA,EAEjD0zC,GAAAA,GAAAA,CAAgBz0C,GAAAA,EAAee,GAAAA,KACnCghB,GAAAA,CAAM,GAAA,CAAA,CAAKpd,GAAAA,EAAMH,GAAAA,KAAOvD,GAAAA,KAAMopB,GAAAA,GAAQ;IAAE,GAAG2jB,GAAAA;IAAM,KAAA,EAAAjtC;AAAM,GAAA,GAAIitC,GAAK,CAAA,EAI5Dxc,GAAAA,GAAUzP,IACb,GAAA,CAAA,CAAK/hB,KAAMe,GAAAA,MAAW;IAAE,IAAA,EAAAf,GAAAA;IAAM,KAAA,EAAAe;GAAM,CAAE,CAAA,CACtC,IAAA,CAAA,CAAMf,GAAAA,EAAGe,GAAAA,KAAM0F,IAAE,IAAA,CAAK,MAAA,GAASlD,GAAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAE/C,EAAA,uBACE1C,KAAC,KAAA,EAAD;IAAK,SAAA,EAAW,CAACK,GAAE,IAAA,EAAMkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAA5D,QAAA,EAAA;MACGsvC,GAAAA,oBACC7yC,IAACorC,GAAAA,EAAD;QACE,KAAA,EAAOiH,EAAAA;AACP,QAAA,KAAA,EAAO3gB,GAAAA,CAAM,IAAA;QACb,IAAA,EAAK,IAAA;QACL,SAAA,EAAU,eAAA;AACV,QAAA,QAAA,EAAA,CAAWvzB,GAAAA,KAAS20C,GAAAA,IAAQjQ,IAASkQ,gBAAAA,CAAiBrhB,GAAAA,EAAOohB,GAAI,CAAC;OACnE,CAAA;AAGH,sBAAA9yC,IAACotC,EAAAA,EAAD;QACE,GAAA,EAAK,CAAA;QACL,GAAA,EAAK,CAAA;QACL,IAAA,EAAM,IAAA;QACN,UAAA,EAAW,MAAA;QACH,MAAA,EAAAh+B,GAAAA;QACR,SAAA,EAAU,gBAAA;QACV,gBAAA,EAAiB,MAAA;AACjB,QAAA,OAAA,EAAA,CAAUjR,GAAAA,KAASwkC,GAAAA,GAAU+P,IAAUC,GAAAA,CAAYppC,GAAI,CAAC,CAAC,CAAA;AACzD,QAAA,QAAA,EAAA,CAAWpL,GAAAA,KAAS0kC,GAAAA,CAAS6P,IAAUC,GAAAA,CAAYppC,GAAI,CAAC,CAAC,CAAA;AACzD,QAAA,UAAA,EAAA,CAAapL,GAAAA,MAAQ;UAAE,KAAA,EAAO0sB,GAAAA;UAAI,KAAA,EAAOmoB,mBAAAA,CAAoB9yB,GAAAA,EAAO2K,GAAAA,EAAI4nB,GAAK;AAAE,SAAA,CAAA;QAC/E,aAAA,EAAA,MAAqBvyB,IAAM,MAAA,GAASqyB,EAAAA;AACpC,QAAA,WAAA,EAAab,EAAAA,CAAmB;AAC9B,UAAA,QAAA,EAAA,CAAWvzC,GAAAA,KAAM60C,mBAAAA,CAAoB9yB,GAAAA,EAAOhhB,KAAGuzC,GAAK,CAAA;UAGpD,OAAA,EAASA,GAAAA,KAAU,QAAQ,EAAA,GAAK;SACjC;OACF,CAAA;MAEAQ,GAAAA,oBACCjzC,IAACorC,GAAAA,EAAD;QACE,KAAA,EAAOkH,EAAAA;QACP,KAAA,EAAOG,GAAAA;QACP,IAAA,EAAK,IAAA;QACL,SAAA,EAAU,aAAA;QACV,QAAA,EAAA,CAAWt0C,GAAAA,KAASoL,GAAAA,IAAQs5B,GAAAA,CAAS;UAAE,GAAGnR,GAAAA;UAAO,WAAA,EAAanoB;SAAM;OACrE,CAAA;AAGH,sBAAAvJ,IAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAWX,EAAAA,CAAE,QAAA;QACf,QAAA,EAAAswB,GAAAA,CAAQ,GAAA,CAAA,CAAK,EAAE,IAAA,EAAAzwB,GAAAA,EAAM,KAAA,EAAA4D,GAAAA,EAAA,qBACpB9C,GAAAA,CAACswC,GAAAA,EAAD;AAEE,UAAA,KAAA,EAAOnE,GAAAA,CAAK,KAAA;UACZ,KAAA,EAAA,IAAA;UACA,YAAA,EAAY,CAAA,KAAA,EAAQ3jB,MAAQ,CAAA,CAAA,IAAA,EAAQ,KAAK,KAAA,CAAM2jB,GAAAA,CAAK,MAAA,GAAS,GAAG,CAAA,CAAA,CAAA,CAAA;AAChE,UAAA,SAAA,EAAW9sC,EAAAA,CAAE,MAAA;UACb,OAAA,EAAA,CAAUlB,QAAQwkC,GAAAA,GAAU+P,GAAAA,CAAUE,IAAapqB,GAAAA,EAAO0qB,GAAG,CAAC,CAAC,CAAA;UAC/D,QAAA,EAAA,CAAW/0C,QAAQ0kC,GAAAA,CAAS6P,GAAAA,CAAUE,IAAapqB,GAAAA,EAAO0qB,GAAG,CAAC,CAAC;AAChE,SAAA,EAPM1qB,GAON,CACF;OACE;AACF;;AAET;;;;;;;AC3HA,SAAgB2qB,IAAWvuC,GAAAA,EAAwB;AACjD,EAAA,IAAM,EAAE,KAAA,EAAAtF,GAAAA,EAAO,WAAA,EAAAC,GAAAA,EAAa,YAAA,EAAAC,GAAAA,EAAc,QAAA,EAAAyD,GAAAA,EAAU,SAAA,EAAAjD,GAAAA,EAAW,GAAG4C,KAAAA,GAASC,GAAAA;AAC3E,EAAA,uBACEC,KAACswC,UAAAA,EAAD;IACE,GAAIxwC,GAAAA;IACJ,SAAA,EAAW;MAACvD,GAAAA,CAAE,KAAA;MAAOkmC,GAAAA,CAAa,IAAA;AAAMhiC,MAAAA;AAAS,KAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAF7E,QAAA,EAAA;MAIG1D,GAAAA,KAAU,MAAA,oBAAaX,GAAAA,CAACmnC,KAAAA,EAAD;AAAO,QAAA,SAAA,EAAWhnC,GAAAA,CAAE,MAAA;QAAS,QAAA,EAAAQ;OAAa,CAAA;AACjE6D,MAAAA,GAAAA;MACAojC,GAAAA,KAAgB,MAAA,oBACf5nC,GAAAA,CAAC6nC,IAAAA,EAAD;QAAM,IAAA,EAAK,aAAA;AAAc,QAAA,SAAA,EAAWxB,GAAAA,CAAa,IAAA;QAC9C,QAAA,EAAAuB;OACG,CAAA;AAER,sBAAA5nC,IAAC8nC,UAAAA,EAAD;AAAY,QAAA,SAAA,EAAWzB,GAAAA,CAAa,KAAA;QAAQ,QAAA,EAAA0B;OAAyB;AACxD;;AAEnB;AASA,SAAgBoM,GAAAA,CAAM,EAAE,QAAA,EAAAl1C,GAAAA,EAAU,WAAAwE,GAAAA,EAAW,GAAGC,KAAAA,EAAoB;AAClE,EAAA,uBACEE,KAACwwC,KAAAA,EAAD;IAAU,GAAI1wC,GAAAA;IAAM,SAAA,EAAW,CAACvD,IAAE,KAAA,EAAOkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAA5E,IAAA,QAAA,EAAA,iBACErE,GAAAA,CAAC,QAAD,EAAM,SAAA,EAAWG,IAAE,GAAA,EAAM,GACxBqE,GAAAA,KAAa,MAAA,oBAAaxE,GAAAA,CAAC,MAAA,EAAD,EAAO,QAAA,EAAAf,GAAAA,EAAe,CACzC;;AAEd;;;;;;;ICtCao1C,GAAAA,GAASrxB,UAAAA,CAAW,SAC/Bpf,GAAAA,EACA8B,GAAAA,EACA;AACA,EAAA,IAAM,EAAE,QAAA,EAAAkC,GAAAA,EAAU,WAAAzH,GAAAA,EAAW,GAAGuD,KAAAA,GAASC,GAAAA;AACzC,EAAA,uBACE3D,KAACs0C,MAAAA,EAAD;IACE,GAAI5wC,GAAAA;IACC,GAAA,EAAAgC,GAAAA;IACL,SAAA,EAAW,CAACvF,IAAE,MAAA,EAAQkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAH3D,QAAA,EAAA,iBAKEpF,GAAAA,CAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWkB,GAAAA,CAAE,KAAA;AACjB,MAAA,QAAA,kBAAAlB,GAAAA,CAAC,MAAA,EAAD,EAAM,SAAA,EAAWkB,GAAAA,CAAE,OAAQ;AACvB,KAAA,CAAA,EACLqE,GAAAA,KAAa,MAAA,oBAAavF,IAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWkB,GAAAA,CAAE,KAAA;MAAQ,QAAA,EAAAyH;AAAe,KAAA,CAC5D;;AAEf,CAAC;;;ACxBD,IAAM,WAAA,uBAAkB,GAAA,EAAA;AAwCjB,SAAS,gBAAA,GAAyB;AAEvC,EAAA,KAAA,MAAW,EAAA,IAAM,aAAa,EAAA,EAAA;AAChC;ACxCA,IAAI,MAAA,GAA6B,YAAA;AACjC,IAAI,aAAA,GAA+B,IAAA;AAS5B,SAAS,qBAAA,GAA4C;AAC1D,EAAA,OAAO,MAAA;AACT;AAWO,SAAS,oBAAA,GAAsC;AACpD,EAAA,OAAO,aAAA;AACT;AAUA,IAAM,eAAA,uBAAsB,GAAA,EAAA;AAGrB,SAAS,qBAAqB,GAAA,EAAsB;AACzD,EAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,KAAA;AACrC,EAAA,eAAA,CAAgB,IAAI,GAAG,CAAA;AACvB,EAAA,OAAO,IAAA;AACT;AC9CO,IAAM,cAAN,MAAkB;AAIvB,EAAA,WAAA,CACmB,UACA,QAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAChB,EAAA;AAFgB,EAAA,QAAA;AACA,EAAA,QAAA;AALX,EAAA,KAAA,GAAgB,EAAA;EAChB,MAAA,GAAS,KAAA;AAOjB,EAAA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,KAAK,KAAA,CAAM,MAAA;AACpB,EAAA;;AAGA,EAAA,KAAA,CAAM0I,KAAWtM,GAAAA,EAA8B;AAC7C,IAAA,IAAIsM,GAAAA,GAAI,KAAK,QAAA,IAAYtM,GAAAA,GAAI,KAAK,QAAA,EAAU,OAAO,KAAK,IAAA,EAAA;AACxD,IAAA,KAAA,IAASlD,MAAI,CAAA,EAAGA,GAAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAQA,GAAAA,EAAAA,EAAK;AAC1C,MAAA,MAAM,IAAA,GAAO,KAAK,WAAA,CAAY,IAAA,CAAK,MAAMA,GAAC,CAAA,EAAGwP,KAAGtM,GAAC,CAAA;AACjD,MAAA,IAAI,MAAM,OAAO,EAAE,IAAA,EAAMlD,GAAAA,EAAG,GAAG,IAAA,EAAA;AACjC,IAAA;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,QAAA,EAAU;AACrC,MAAA,MAAM,OAAa,EAAE,OAAA,EAAS,EAAA,EAAI,OAAO,CAAA,EAAA;AACzC,MAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AACpB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,IAAA,EAAMwP,KAAGtM,GAAC,CAAA;AACxC,MAAA,IAAI,IAAA,SAAa,EAAE,IAAA,EAAM,KAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,GAAG,IAAA,EAAA;AACrD,IAAA;AACA,IAAA,OAAO,KAAK,IAAA,EAAA;AACd,EAAA;EAEQ,WAAA,CAAY,IAAA,EAAYsM,KAAWtM,GAAAA,EAA4C;AACrF,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,OAAA,EAAS;AAChC,MAAA,IAAIA,OAAK,KAAA,CAAM,MAAA,IAAU,MAAM,CAAA,GAAIsM,GAAAA,IAAK,KAAK,QAAA,EAAU;AACrD,QAAA,MAAMnL,MAAI,KAAA,CAAM,CAAA;AAChB,QAAA,KAAA,CAAM,CAAA,IAAKmL,GAAAA;AACX,QAAA,OAAO,EAAE,CAAA,EAAAnL,GAAAA,EAAG,CAAA,EAAG,MAAM,CAAA,EAAA;AACvB,MAAA;AACF,IAAA;AACA,IAAA,IAAI,IAAA,CAAK,KAAA,GAAQnB,GAAAA,IAAK,IAAA,CAAK,QAAA,EAAU;AACnC,MAAA,MAAM,KAAA,GAAe,EAAE,CAAA,EAAG,IAAA,CAAK,OAAO,MAAA,EAAQA,GAAAA,EAAG,GAAGsM,GAAAA,EAAA;AACpD,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AACvB,MAAA,IAAA,CAAK,KAAA,IAAStM,GAAAA;AACd,MAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,MAAM,CAAA,EAAA;AAC1B,IAAA;AACA,IAAA,OAAO,IAAA;AACT,EAAA;EAEQ,IAAA,GAAa;AACnB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,OAAA,CAAQ,IAAA;AACN,QAAA,CAAA,4CAAA,EAA+C,IAAA,CAAK,QAAQ,CAAA,MAAA,EAAM,IAAA,CAAK,QAAQ,CAAA,8CAAA;AAAA,OAAA;AAGnF,IAAA;AACA,IAAA,OAAO,IAAA;AACT,EAAA;AACF,CAAA;AC9DA,IAAM,GAAA,GAAM,IAAA;AAGZ,SAAS,KAAA,CACPD,GAAAA,EAAiBzD,GAAAA,EAAiBxB,GAAAA,EAAeyN,IAAiB3I,GAAAA,EAC5D;AACN,EAAA9E,GAAAA,CAAE,CAAC,CAAA,GAAI,CAAA;AACP,EAAAyN,EAAAA,CAAE,CAAC,CAAA,GAAI,CAAC,GAAA;AACR,EAAAA,EAAAA,CAAE,CAAC,CAAA,GAAI,GAAA;AACP,EAAA,IAAI1N,GAAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAASq6B,EAAAA,GAAI,CAAA,EAAGA,EAAAA,GAAIt1B,GAAAA,EAAGs1B,EAAAA,EAAAA,EAAK;AAC1B,IAAA,IAAI/4B,GAAAA,GAAAA,CAAK4D,IAAEm1B,EAAC,CAAA,GAAIA,KAAIA,EAAAA,IAAKn1B,GAAAA,CAAEjF,IAAED,GAAC,CAAC,IAAIC,GAAAA,CAAED,GAAC,IAAIC,GAAAA,CAAED,GAAC,OAAO,CAAA,GAAIq6B,EAAAA,GAAI,CAAA,GAAIp6B,GAAAA,CAAED,GAAC,CAAA,CAAA;AACnE,IAAA,OAAOsB,GAAAA,IAAKoM,EAAAA,CAAE1N,GAAC,CAAA,EAAG;AAChB,MAAAA,GAAAA,EAAAA;AACA,MAAAsB,GAAAA,GAAAA,CAAK4D,IAAEm1B,EAAC,CAAA,GAAIA,KAAIA,EAAAA,IAAKn1B,GAAAA,CAAEjF,IAAED,GAAC,CAAC,IAAIC,GAAAA,CAAED,GAAC,IAAIC,GAAAA,CAAED,GAAC,OAAO,CAAA,GAAIq6B,EAAAA,GAAI,CAAA,GAAIp6B,GAAAA,CAAED,GAAC,CAAA,CAAA;AACjE,IAAA;AACA,IAAAA,GAAAA,EAAAA;AACA,IAAAC,GAAAA,CAAED,GAAC,CAAA,GAAIq6B,EAAAA;AACP,IAAA3sB,EAAAA,CAAE1N,GAAC,CAAA,GAAIsB,GAAAA;AACP,IAAAoM,EAAAA,CAAE1N,GAAAA,GAAI,CAAC,CAAA,GAAI,GAAA;AACb,EAAA;AACA,EAAAA,GAAAA,GAAI,CAAA;AACJ,EAAA,KAAA,IAASq6B,EAAAA,GAAI,CAAA,EAAGA,EAAAA,GAAIt1B,GAAAA,EAAGs1B,EAAAA,EAAAA,EAAK;AAC1B,IAAA,OAAO3sB,EAAAA,CAAE1N,GAAAA,GAAI,CAAC,CAAA,GAAIq6B,IAAGr6B,GAAAA,EAAAA;AACrB,IAAAyB,GAAAA,CAAE44B,EAAC,CAAA,GAAA,CAAKA,EAAAA,GAAIp6B,IAAED,GAAC,CAAA,KAAMq6B,EAAAA,GAAIp6B,GAAAA,CAAED,GAAC,CAAA,CAAA,GAAKkF,GAAAA,CAAEjF,GAAAA,CAAED,GAAC,CAAC,CAAA;AACzC,EAAA;AACF;AAGA,SAAS,MACP,IAAA,EAAoB,KAAA,EAAe,QACnCkF,GAAAA,EAAiBzD,GAAAA,EAAiBxB,KAAeyN,EAAAA,EAC3C;AACN,EAAA,KAAA,IAASpH,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI,KAAA,EAAOA,GAAAA,EAAAA,EAAK;AAC9B,IAAA,KAAA,IAASD,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI,MAAA,EAAQA,GAAAA,EAAAA,EAAKnB,GAAAA,CAAEmB,GAAC,CAAA,GAAI,IAAA,CAAKA,GAAAA,GAAI,KAAA,GAAQC,GAAC,CAAA;AAC1D,IAAA,KAAA,CAAMpB,GAAAA,EAAGzD,GAAAA,EAAGxB,GAAAA,EAAGyN,EAAAA,EAAG,MAAM,CAAA;AACxB,IAAA,KAAA,IAASrH,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI,MAAA,EAAQA,GAAAA,EAAAA,EAAK,IAAA,CAAKA,GAAAA,GAAI,KAAA,GAAQC,GAAC,CAAA,GAAI7E,GAAAA,CAAE4E,GAAC,CAAA;AAC5D,EAAA;AACA,EAAA,KAAA,IAASA,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI,MAAA,EAAQA,GAAAA,EAAAA,EAAK;AAC/B,IAAA,KAAA,IAASC,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI,KAAA,EAAOA,GAAAA,EAAAA,EAAKpB,GAAAA,CAAEoB,GAAC,CAAA,GAAI,IAAA,CAAKD,GAAAA,GAAI,KAAA,GAAQC,GAAC,CAAA;AACzD,IAAA,KAAA,CAAMpB,GAAAA,EAAGzD,GAAAA,EAAGxB,GAAAA,EAAGyN,EAAAA,EAAG,KAAK,CAAA;AACvB,IAAA,KAAA,IAASpH,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI,KAAA,EAAOA,GAAAA,EAAAA,EAAK,IAAA,CAAKD,GAAAA,GAAI,KAAA,GAAQC,GAAC,CAAA,GAAI7E,GAAAA,CAAE6E,GAAC,CAAA;AAC3D,EAAA;AACF;AAQO,SAAS,UAAA,CACd,KAAA,EACA,KAAA,EACA,MAAA,EACA,QACA,MAAA,EACY;AACZ,EAAA,MAAMvB,MAAI,KAAA,GAAQ,MAAA;AAClB,EAAA,MAAM,SAAA,GAAY,IAAI,YAAA,CAAaA,GAAC,CAAA;AACpC,EAAA,MAAM,SAAA,GAAY,IAAI,YAAA,CAAaA,GAAC,CAAA;AACpC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AACnC,EAAA,MAAMG,GAAAA,GAAI,IAAI,YAAA,CAAa,IAAI,CAAA;AAC/B,EAAA,MAAMzD,GAAAA,GAAI,IAAI,YAAA,CAAa,IAAI,CAAA;AAC/B,EAAA,MAAMxB,GAAAA,GAAI,IAAI,UAAA,CAAW,IAAI,CAAA;AAC7B,EAAA,MAAMyN,EAAAA,GAAI,IAAI,YAAA,CAAa,IAAA,GAAO,CAAC,CAAA;AAEnC,EAAA,KAAA,IAASrM,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI0D,GAAAA,EAAG1D,GAAAA,EAAAA,EAAK;AAC1B,IAAA,MAAMwF,GAAAA,GAAI,KAAA,CAAMxF,GAAC,CAAA,GAAI,GAAA;AACrB,IAAA,SAAA,CAAUA,GAAC,CAAA,GAAIwF,GAAAA,KAAM,CAAA,GAAI,CAAA,GAAIA,GAAAA,KAAM,CAAA,GAAI,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAMA,GAAC,CAAA,IAAK,CAAA;AACrE,IAAA,SAAA,CAAUxF,GAAC,CAAA,GAAIwF,GAAAA,KAAM,CAAA,GAAI,GAAA,GAAMA,GAAAA,KAAM,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,GAAAA,GAAI,GAAG,CAAA,IAAK,CAAA;AACvE,EAAA;AACA,EAAA,KAAA,CAAM,WAAW,KAAA,EAAO,MAAA,EAAQ3B,GAAAA,EAAGzD,GAAAA,EAAGxB,KAAGyN,EAAC,CAAA;AAC1C,EAAA,KAAA,CAAM,WAAW,KAAA,EAAO,MAAA,EAAQxI,GAAAA,EAAGzD,GAAAA,EAAGxB,KAAGyN,EAAC,CAAA;AAE1C,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW3I,GAAC,CAAA;AAC5B,EAAA,KAAA,IAAS1D,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI0D,GAAAA,EAAG1D,GAAAA,EAAAA,EAAK;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAUA,GAAC,CAAC,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,SAAA,CAAUA,GAAC,CAAC,CAAA;AAC7D,IAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,MAAM,GAAA,IAAO,IAAA,GAAO,SAAS,MAAA,CAAO,CAAA;AAC5D,IAAA,GAAA,CAAIA,GAAC,CAAA,GAAI,IAAA,GAAO,IAAI,CAAA,GAAI,IAAA,GAAO,MAAM,GAAA,GAAM,IAAA;AAC7C,EAAA;AACA,EAAA,OAAO,GAAA;AACT;ACrDO,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,GAAA,GAAM,CAAA;AAyBnB,SAAS,aAAA,CAAc,MAAA,EAAgB,KAAA,EAAkB,MAAA,EAAwB;AAC/E,EAAA,OAAO,CAAA,EAAG,KAAA,KAAU,QAAA,GAAW,SAAA,GAAY,EAAE,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,GAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,CAAA;AACjG;AAEO,SAAS,sBAAA,GAA0C;AACxD,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,OAAO,oBAAoB,WAAA,EAAa;AAC1C,IAAA,MAAA,GAAS,IAAI,eAAA,CAAgB,SAAA,GAAY,CAAA,EAAG,YAAY,CAAC,CAAA;EAC3D,CAAA,MAAA,IAAW,OAAO,aAAa,WAAA,EAAa;AAC1C,IAAA,MAAA,GAAS,QAAA,CAAS,cAAc,QAAQ,CAAA;AACxC,IAAA,MAAA,CAAO,QAAQ,SAAA,GAAY,CAAA;AAC3B,IAAA,MAAA,CAAO,SAAS,SAAA,GAAY,CAAA;EAC9B,CAAA,MAAO;AACL,IAAA,MAAM,IAAI,MAAM,uEAAuE,CAAA;AACzF,EAAA;AACA,EAAA,MAAM,MAAM,MAAA,CAAO,UAAA,CAAW,MAAM,EAAE,kBAAA,EAAoB,MAAM,CAAA;AAChE,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAE5E,EAAA,SAAS,OAAA,CAAQ,MAAA,EAAgB,MAAA,EAAgB,KAAA,EAAwB;AACvE,IAAA,GAAA,CAAK,IAAA,GAAO,aAAA,CAAc,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA;AAC/C,IAAA,GAAA,CAAK,YAAA,GAAe,YAAA;AACpB,IAAA,GAAA,CAAK,SAAA,GAAY,MAAA;AACnB,EAAA;AAEA,EAAA,OAAO;IACL,WAAA,CAAY,MAAA,EAAQ,QAAQ,KAAA,EAAO;AACjC,MAAA,OAAA,CAAQ,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAC7B,MAAA,MAAMJ,GAAAA,GAAI,GAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAC/B,MAAA,OAAO;QACL,MAAA,EAAQA,GAAAA,CAAE,yBAAyB,SAAA,GAAY,GAAA;QAC/C,OAAA,EAASA,GAAAA,CAAE,0BAA0B,SAAA,GAAY;AAAA,OAAA;AAErD,IAAA,CAAA;IAEA,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW;AAC1C,MAAA,OAAA,CAAQ,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAC7B,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,aAAA,CAAc,SAAS,CAAA;AAC5C,MAAA,MAAMA,GAAAA,GAAI,GAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AAChC,MAAA,MAAM,UAAUA,GAAAA,CAAE,KAAA;AAClB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAKA,GAAAA,CAAE,yBAAyB,CAAC,CAAA;AACtD,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAKA,GAAAA,CAAE,0BAA0B,OAAO,CAAA;AAC9D,MAAA,MAAM,YAAY,IAAA,CAAK,IAAA,CAAKA,GAAAA,CAAE,uBAAA,IAA2B,YAAY,GAAG,CAAA;AACxE,MAAA,MAAM,aAAa,IAAA,CAAK,IAAA,CAAKA,GAAAA,CAAE,wBAAA,IAA4B,YAAY,GAAG,CAAA;AAC1E,MAAA,MAAM,OAAO,OAAA,GAAU,QAAA;AACvB,MAAA,MAAM,OAAO,SAAA,GAAY,UAAA;AACzB,MAAA,IAAI,IAAA,IAAQ,CAAA,IAAK,IAAA,IAAQ,CAAA,EAAG;AAC1B,QAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,GAAG,KAAA,EAAO,IAAI,iBAAA,CAAkB,CAAC,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,GAAG,OAAA,EAAA;AAClF,MAAA;AACA,MAAA,MAAMwQ,GAAAA,GAAI,OAAO,CAAA,GAAI,GAAA;AACrB,MAAA,MAAMtM,GAAAA,GAAI,OAAO,CAAA,GAAI,GAAA;AACrB,MAAA,IAAI,MAAA,CAAO,KAAA,GAAQsM,GAAAA,IAAK,MAAA,CAAO,SAAStM,GAAAA,EAAG;AACzC,QAAA,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,OAAOsM,GAAC,CAAA;AACvC,QAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAQtM,GAAC,CAAA;AACzC,QAAA,OAAA,CAAQ,MAAA,EAAQ,QAAQ,KAAK,CAAA;AAC/B,MAAA;AACA,MAAA,GAAA,CAAK,SAAA,CAAU,CAAA,EAAG,CAAA,EAAGsM,GAAAA,EAAGtM,GAAC,CAAA;AACzB,MAAA,GAAA,CAAK,SAAA,GAAY,MAAA;AACjB,MAAA,GAAA,CAAK,QAAA,CAAS,KAAA,EAAO,GAAA,GAAM,OAAA,EAAS,MAAM,SAAS,CAAA;AACnD,MAAA,MAAM,MAAM,GAAA,CAAK,YAAA,CAAa,CAAA,EAAG,CAAA,EAAGsM,KAAGtM,GAAC,CAAA;AACxC,MAAA,MAAM,KAAA,GAAQ,IAAI,iBAAA,CAAkBsM,GAAAA,GAAItM,GAAC,CAAA;AACzC,MAAA,KAAA,IAAS9D,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI,KAAA,CAAM,MAAA,EAAQA,GAAAA,EAAAA,EAAK,KAAA,CAAMA,GAAC,CAAA,GAAI,GAAA,CAAI,IAAA,CAAKA,GAAAA,GAAI,IAAI,CAAC,CAAA;AACpE,MAAA,OAAO;QACL,KAAA,EAAOoQ,GAAAA;QACP,MAAA,EAAQtM,GAAAA;AACR,QAAA,KAAA;AACA,QAAA,IAAA,EAAM,EAAE,OAAA,GAAU,GAAA,CAAA;AAClB,QAAA,GAAA,EAAK,SAAA,GAAY,GAAA;AACjB,QAAA;AAAA,OAAA;AAEJ,IAAA;AAAA,GAAA;AAEJ;AC1GO,IAAM,SAAA,GAAY,IAAA;AAClB,IAAM,SAAA,GAAY,CAAA;AAClB,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,UAAA,GAAa,GAAA;AAKnB,IAAM,mBAAA,GAAsB,EAAA;AA+BnC,IAAM,cAAA,uBAAqB,GAAA,EAAA;AAM3B,IAAM,oBAAA,uBAA2B,GAAA,EAAA;AACjC,IAAI,KAAA,uBAAY,GAAA,EAAA;AAChB,IAAI,QAAuB,EAAA;AAC3B,IAAI,MAAA,GAAS,IAAI,WAAA,CAAY,SAAA,EAAW,SAAS,CAAA;AACjD,IAAI,UAAyB,EAAA;AAC7B,IAAI,cAAA,GAAiB,KAAA;AACrB,IAAI,MAAA,GAAS,mBAAA;AACb,IAAI,UAAA,GAAqC,IAAA;AAEzC,SAAS,aAAA,GAAiC;AACxC,EAAA,IAAI,CAAC,UAAA,EAAY,UAAA,GAAa,sBAAA,EAAA;AAC9B,EAAA,OAAO,UAAA;AACT;AA6BO,SAAS,aAAa,MAAA,EAAyB;AACpD,EAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,MAAM,GAAG,OAAO,KAAA;AACxC,EAAA,OAAO,CAAC,oBAAA,CAAqB,GAAA,CAAI,MAAM,CAAA,IAAK,uBAAA,KAA4B,QAAA;AAC1E;AAkBO,SAAS,eAAA,GAA8C;AAC5D,EAAA,MAAM,MAAyB,EAAA;AAC/B,EAAA,KAAA,MAAW,UAAU,cAAA,EAAgB;AACnC,IAAA,IAAI,CAAC,YAAA,CAAa,MAAM,CAAA,EAAG;AAC3B,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,MAAA,EAAQ,UAAA,EAAY,oBAAA,CAAqB,IAAI,MAAM,CAAA,GAAI,MAAA,GAAS,UAAA,EAAY,CAAA;AACzF,EAAA;AACA,EAAA,OAAO,GAAA,CAAI,IAAA,CAAK,CAAC0B,GAAAA,EAAGlD,GAAAA,KAAMkD,IAAE,MAAA,CAAO,aAAA,CAAclD,GAAAA,CAAE,MAAM,CAAC,CAAA;AAC5D;AAmBO,SAAS,qBAAqB,MAAA,EAAyB;AAC5D,EAAA,OAAO,eAAe,GAAA,CAAI,MAAM,KAAK,CAAC,oBAAA,CAAqB,IAAI,MAAM,CAAA;AACvE;AAgBO,SAAS,cAAA,CACd,MAAA,EAAgB,MAAA,EAAgB,KAAA,EACnB;AACb,EAAA,MAAM,MAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,IAAI,KAAK,CAAA,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC9B,EAAA,IAAI,UAAU,OAAO,QAAA;AAErB,EAAA,MAAMiB,MAAI,aAAA,EAAA;AACV,EAAA,MAAM,OAAA,GAAUA,GAAAA,CAAE,WAAA,CAAY,MAAA,EAAQ,QAAQ,KAAK,CAAA;AACnD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACtC,EAAA,MAAM,IAAA,GAAe;AACnB,IAAA,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAA;IAC5B,MAAA,EAAQ;AACN,MAAA,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,QAAQ,OAAO,CAAA;AACvD,MAAA,IAAA;MACA,MAAA,EAAQ,SAAA;MACR,MAAA,EAAQ;AAAA,KAAA;AAEV,IAAA,KAAA,EAAO,EAAA;AACP,IAAA,QAAA,EAAU,EAAA;;AACV,IAAA,OAAA,sBAAa,GAAA,EAAA;AACb,IAAA,UAAA,sBAAgB,GAAA;AAAI,GAAA;AAGtB,EAAA,MAAM,IAAA,GAAoB;AACxB,IAAA,MAAA;AAAQ,IAAA,MAAA;AAAQ,IAAA,KAAA;AAAO,IAAA,IAAA;AACvB,IAAA,YAAA,CAAa,EAAA,EAAwB;AACnC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAClC,MAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,MAAA,MAAM,SAASA,GAAAA,CAAE,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,OAAO,EAAE,CAAA;AACpD,MAAA,MAAM,IAAA,GAAmB;QACvB,EAAA,EAAI,EAAA;QAAI,CAAA,EAAG,CAAA;QAAG,CAAA,EAAG,CAAA;QAAG,KAAA,EAAO,CAAA;QAAG,MAAA,EAAQ,CAAA;AACtC,QAAA,OAAA,EAAS,MAAA,CAAO,IAAA;AAChB,QAAA,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA;AACvB,QAAA,QAAA,EAAU,MAAA,CAAO,OAAA;QACjB,IAAA,EAAM;AAAA,OAAA;AAER,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,IAAI,CAAA;AACzB,MAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AACpB,MAAA,IAAI,MAAA,CAAO,KAAA,KAAU,CAAA,IAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AAC7C,QAAA,IAAA,CAAK,IAAA,GAAO,CAAA;AACZ,QAAA,OAAO,IAAA;AACT,MAAA;AACA,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,MAAA,EAAA;AACA,QAAA,IAAA,CAAK,MAAM,MAAM,CAAA;MACnB,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AAC7B,QAAA,aAAA,EAAA;AACF,MAAA;AACA,MAAA,OAAO,IAAA;AACT,IAAA;AAAA,GAAA;AAEF,EAAA,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI,CAAA;AACnB,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,IAAA,CAAK,MAAkB,MAAA,EAA+B;AAC7D,EAAA,MAAM,OAAO,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AACrD,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,MAAM,GAAA,GAAM,WAAW,MAAA,CAAO,KAAA,EAAO,OAAO,KAAA,EAAO,MAAA,CAAO,MAAA,EAAQ,UAAA,EAAY,UAAU,CAAA;AACxF,EAAA,OAAO,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,IAAA,EAAM;AAChC,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,IAAI,UAAA,CAAW,SAAA,GAAY,SAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,IAAI,CAAA;AACrF,EAAA;AACA,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC5B,EAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,MAAA,CAAO,QAAQ,GAAA,EAAA,EAAO;AAC5C,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA;AACR,MAAA,GAAA,CAAI,SAAS,GAAA,GAAM,MAAA,CAAO,QAAQ,GAAA,GAAM,CAAA,IAAK,OAAO,KAAK,CAAA;OACxD,IAAA,CAAK,CAAA,GAAI,GAAA,IAAO,SAAA,GAAY,IAAA,CAAK;AAAA,KAAA;AAEtC,EAAA;AACA,EAAA,IAAA,CAAK,OAAA,EAAA;AACL,EAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,EAAE,KAAK,IAAA,CAAK,OAAA,EAAS,GAAG,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA;AAChG,EAAA,IAAA,CAAK,IAAI,IAAA,CAAK,CAAA;AACd,EAAA,IAAA,CAAK,IAAI,IAAA,CAAK,CAAA;AACd,EAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,EAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,EAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AACnB;AAEA,SAAS,aAAA,GAAsB;AAC7B,EAAA,IAAI,cAAA,EAAgB;AACpB,EAAA,cAAA,GAAiB,IAAA;AACjB,EAAA,UAAA,CAAW,cAAc,CAAC,CAAA;AAC5B;AAEA,SAAS,YAAA,GAAqB;AAC5B,EAAA,cAAA,GAAiB,KAAA;AACjB,EAAA,IAAIG,GAAAA,GAAI,CAAA;AACR,EAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,IAAKA,GAAAA,GAAI,mBAAA,EAAqB;AACpD,IAAA,MAAM,GAAA,GAAM,QAAQ,KAAA,EAAA;AACpB,IAAA,IAAI,GAAA,CAAI,IAAA,CAAK,IAAA,KAAS,EAAA,EAAI;AAC1B,IAAA,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AACzB,IAAAA,GAAAA,EAAAA;AACF,EAAA;AACA,EAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,aAAA,EAAA;AACxB,EAAA,gBAAA,EAAA;AACF;ACjLA,IAAI,KAAA,uBAAY,GAAA,EAAA;AAEhB,SAAS,OAAA,CAAQ,MAAA,EAAgB,MAAA,EAAgB,KAAA,EAA0B;AACzE,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,IAAI,KAAK,CAAA,CAAA;AACrC;AAkLO,SAAS,cAAA,CACd,MAAA,EACA,MAAA,EACA,KAAA,EACoB;AACpB,EAAA,MAAM,OAAO,KAAA,CAAM,GAAA,CAAI,QAAQ,MAAA,EAAQ,MAAA,EAAQ,KAAK,CAAC,CAAA;AACrD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAQ;AAC1B,IAAA,KAAK,UAAU,IAAI,CAAA;AACnB,IAAA,OAAO,IAAA;AACT,EAAA;AACA,EAAA,OAAO,IAAA,CAAK,MAAA,KAAW,OAAA,GAAU,IAAA,CAAK,IAAA,GAAQ,IAAA;AAChD;AAEA,eAAe,UAAU,IAAA,EAA+B;AACtD,EAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,EAAA,IAAI;AACF,IAAA,IAAA,CAAK,IAAA,GAAO,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA;AAC3D,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AAId,IAAA,gBAAA,EAAA;AACF,EAAA,CAAA,CAAA,OAAS,GAAA,EAAK;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,IAAA,QAAA;AAAS,MAAA,CAAA,KAAA,EAAQ,QAAQ,IAAA,CAAK,MAAA,EAAQ,KAAK,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAC5D,MAAA,CAAA,6BAAA,EAAgC,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,GAAA,EACtE,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,4DAAA;AAAA,KAAA;AAEvD,EAAA;AACF;AAEA,eAAe,WAAW,MAAA,EAA6C;AACrE,EAAA,MAAM,WAAW,OAAO,MAAA,KAAW,UAAA,GAAa,MAAM,QAAA,GAAW,MAAA;AACjE,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,QAAQ,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,UAAA,EAAa,QAAQ,CAAA,CAAE,CAAA;AACtE,IAAA,OAAO,IAAI,WAAA,EAAA;AACb,EAAA;AACA,EAAA,IAAI,QAAA,YAAoB,aAAa,OAAO,QAAA;AAC5C,EAAA,OAAO,SAAS,WAAA,EAAA;AAClB;AAIA,IAAM,MAAA,uBAAa,GAAA,EAAA;AAEnB,SAAS,QAAA,CAAS,KAAa,OAAA,EAAuB;AACpD,EAAA,IAAI,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAG;AACrB,EAAA,MAAA,CAAO,IAAI,GAAG,CAAA;AACd,EAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AACtB;ACxSA,IAAI,QAAA,uBAAe,GAAA,EAAA;AAEnB,SAAS,UAAA,CAAW,QAAgB,KAAA,EAA0B;AAC5D,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAC3B;AAoCO,SAAS,SAAA,GAAuC;AACrD,EAAA,MAAM,MAAwB,EAAA;AAC9B,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,UAAU,CAAA,IAAK,QAAA,EAAU;AAC3C,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,UAAA,CAAW,MAAM,CAAA,CACnC,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,MAAA,MAAM,CAAC0M,GAAAA,EAAGnQ,GAAC,CAAA,GAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAC5B,MAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,CAAOmQ,GAAC,CAAA,EAAG,OAAOnQ,GAAAA,EAAA;AACrC,IAAA,CAAC,CAAA,CACA,IAAA,CAAK,CAACuF,GAAAA,EAAGlD,QAAMkD,GAAAA,CAAE,MAAA,GAASlD,GAAAA,CAAE,MAAA,IAAUkD,GAAAA,CAAE,KAAA,CAAM,aAAA,CAAclD,GAAAA,CAAE,KAAK,CAAC,CAAA;AACvE,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAA;AAC/B,EAAA;AACA,EAAA,OAAO,GAAA;AACT;AAiIA,SAAS,iBAAA,CACP,MAAA,EAAgB,MAAA,EAAgB,KAAA,EAAkB,eAAe,KAAA,EAClD;AASf,EAAA,IAAI,oBAAA,CAAqB,MAAM,CAAA,EAAG;AAChC,IAAA,OAAO;MACL,KAAA,EAAO,IAAA;MACP,WAAA,EAAa,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,KAAK,CAAA;MACjD,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAA;AAC5B,MAAA,SAAA,EAAW,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAA;MAClC,MAAA,EAAQ;AAAA,KAAA;AAEZ,EAAA;AAOA,EAAA,MAAM,OAAO,cAAA,CAAe,MAAA,EAAQ,QAAQ,KAAA,KAAU,QAAA,GAAW,WAAW,QAAQ,CAAA;AACpF,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,OAAO;MACL,KAAA,EAAO,IAAA;MACP,WAAA,EAAa,IAAA;MACb,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAA;AAC5B,MAAA,SAAA,EAAW,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAA;MAClC,MAAA,EAAQ;AAAA,KAAA;AAEZ,EAAA;AAiBA,EAA6B;AAC3B,IAAA,MAAM,QAAA,GAAqC,qBAAA,EAAA;AAO3C,IAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,MAAA,EAAQ;AAC5C,MAAA,IAAI,SAAS,GAAA,CAAI,QAAQ,CAAA,IAAK,YAAA,CAAa,QAAQ,CAAA,EAAG;AAOpD,QAAA,MAAM,MAAA,GAAS,0BAAA,CAA2B,QAAA,EAAU,MAAA,EAAQ,OAAO,IAAI,CAAA;AAGvE,QAAA,IAAI,MAAA,CAAO,KAAA,KAAU,IAAA,IAAQ,MAAA,CAAO,gBAAgB,MAAA,EAAW;AAC7D,UAAA,IAAI,CAAC,YAAA,EAAc,qBAAA,CAAsB,MAAA,EAAQ,MAAA,EAAQ,OAAO,QAAQ,CAAA;AACxE,UAAA,OAAO,EAAE,GAAG,MAAA,EAAQ,WAAA,EAAa,EAAE,SAAA,EAAW,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAA,EAAS;AAC3E,QAAA;AACF,MAAA;AAIA,MAAA,IAAI,CAAC,YAAA,EAAc,uBAAA,CAAwB,MAAA,EAAQ,MAAA,EAAQ,OAAO,QAAQ,CAAA;IAC5E,CAAA,MAAA,IAAW,QAAA,KAAa,MAAA,IAAU,CAAC,YAAA,EAAc;AAW/C,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AACxB,QAAA,2BAAA,CAA4B,MAAA,EAAQ,QAAQ,KAAK,CAAA;MACnD,CAAA,MAAO;AAQL,QAAA,2BAAA,CAA4B,MAAA,EAAQ,QAAQ,KAAK,CAAA;AACnD,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA,OAAO;IACL,KAAA,EAAO,IAAA;IACP,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAA;AAC5B,IAAA,SAAA,EAAW,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAA;IAClC,MAAA,EAAQ;AAAA,GAAA;AAEZ;AAGA,SAAS,qBAAA,GAAuC;AAC9C,EAAA,KAAA,MAAW,MAAA,IAAU,QAAA,CAAS,IAAA,EAAA,EAAQ,OAAO,MAAA;AAC7C,EAAA,OAAO,IAAA;AACT;AAMA,SAAS,qBAAA,CACP,MAAA,EAAgB,MAAA,EAAgB,KAAA,EAAkB,QAAA,EAC5C;AACN,EAAA,IAAI,CAAC,qBAAqB,CAAA,YAAA,EAAe,MAAM,IAAI,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA,EAAG;AAKvE,EAAA,MAAM,KAAA,GAAQ,SAAS,GAAA,CAAI,MAAM,IAC7B,CAAA,wBAAA,EAA2B,MAAM,IAAI,KAAK,CAAA,wHAAA,EAEvB,QAAQ,CAAA,gDAAA,EACV,MAAM,gBAAgB,MAAM,CAAA,UAAA,EAAa,KAAK,CAAA,YAAA,CAAA,GAC/D,CAAA,yCAAA,EAAuC,QAAQ,CAAA,8BAAA,EACzB,MAAM,CAAA,UAAA,CAAA;AAChC,EAAA,OAAA,CAAQ,IAAA;AACN,IAAA,CAAA,qBAAA,EAAwB,MAAM,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA,EAAI,KAAK,KAAK,KAAK,CAAA,yHAAA;AAAA,GAAA;AAIjE;AAQA,SAAS,uBAAA,CACP,MAAA,EAAgB,MAAA,EAAgB,KAAA,EAAkB,QAAA,EAC5C;AACN,EAAA,IAAI,CAAC,qBAAqB,CAAA,iBAAA,EAAoB,MAAM,IAAI,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA,EAAG;AAC5E,EAAA,MAAM,MAAA,GAAS,oBAAA,EAAA,KAA2B,QAAA,GACtC,8BAAA,GACA,0EAAA;AAKJ,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,IAAK,YAAA,CAAa,QAAQ,CAAA,GACvD,CAAA,8BAAA,EAAiC,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAChD,0BAAA;AACJ,EAAA,OAAA,CAAQ,IAAA;AACN,IAAA,CAAA,qBAAA,EAAwB,MAAM,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA,EAAI,KAAK,gDAC3B,QAAQ,CAAA,GAAA,EAAM,MAAM,CAAA,EAAA,EAAK,GAAG,CAAA,+EAAA,EACG,QAAQ,CAAA,aAAA,EAClD,MAAM,aAAa,KAAK,CAAA,yEAAA;AAAA,GAAA;AAGzC;AAWA,SAAS,2BAAA,CACP,MAAA,EAAgB,MAAA,EAAgB,KAAA,EAC1B;AACN,EAAA,IAAI,CAAC,qBAAqB,CAAA,sBAAA,EAAyB,MAAM,IAAI,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA,EAAG;AACjF,EAAA,MAAM,MAAA,GAAS,oBAAA,EAAA,KAA2B,MAAA,GACtC,8BAAA,GACA,0EAAA;AACJ,EAAA,OAAA,CAAQ,IAAA;AACN,IAAA,CAAA,qBAAA,EAAwB,MAAM,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,mDAAA,EACvB,MAAM,CAAA,+BAAA,EAAkC,MAAM,CAAA,0HAAA,EAElC,MAAM,CAAA,aAAA,EAAgB,MAAM,aACzD,KAAK,CAAA,oEAAA;AAAA,GAAA;AAEpB;AAWA,SAAS,2BAAA,CACP,MAAA,EAAgB,MAAA,EAAgB,KAAA,EAC1B;AACN,EAAA,IAAI,CAAC,qBAAqB,CAAA,qBAAA,EAAwB,MAAM,IAAI,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA,EAAG;AAChF,EAAA,OAAA,CAAQ,IAAA;AACN,IAAA,CAAA,qBAAA,EAAwB,MAAM,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,wFAAA,EACO,MAAM,CAAA,wJAAA,EAEI,MAAM,CAAA,aAAA,EAC7D,MAAM,CAAA,UAAA,EAAa,KAAK,CAAA,8EAAA;AAAA,GAAA;AAGzC;AAEA,SAAS,aAAa8N,GAAAA,EAA+B;AACnD,EAAA,OAAOA,GAAAA,IAAK,MAAM,MAAA,GAAS,SAAA;AAC7B;AAQO,SAAS,kBAAA,CACd,MAAA,EACA,MAAA,EACA,KAAA,EACe;AACf,EAAA,OAAO,0BAAA,CAA2B,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAA;AAChE;AAsDA,SAAS,0BAAA,CACP,MAAA,EACA,MAAA,EACA,KAAA,EACA,YAAA,EACe;AACf,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACrC,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,IAAA,KAAS,CAAA,EAAG;AACtC,IAAA,OAAO,iBAAA,CAAkB,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,YAAY,CAAA;AAC9D,EAAA;AAGA,EAAA,MAAM,QAAQ,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAC,CAAA;AACrD,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO;MACL,KAAA,EAAO,KAAA;MACP,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAA;AAC5B,MAAA,SAAA,EAAW,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAA;MAClC,MAAA,EAAQ;AAAA,KAAA;AAEZ,EAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,aAAa,MAAM,CAAA;AAC3C,EAAA,IAAI,aAAA,GAA+E,IAAA;AACnF,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,SAAA,EAAW;AACpC,IAAA,MAAM,CAAC,IAAA,EAAMnQ,GAAC,CAAA,GAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAC/B,IAAA,MAAMmQ,GAAAA,GAAI,OAAO,IAAI,CAAA;AACrB,IAAA,IAAInQ,QAAM,KAAA,EAAO;AACjB,IAAA,IAAI,YAAA,CAAamQ,GAAC,CAAA,KAAM,eAAA,EAAiB;AACzC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAIA,GAAAA,GAAI,MAAM,CAAA;AACpC,IAAA,IACE,aAAA,KAAkB,IAAA,IAClB,QAAA,GAAW,aAAA,CAAc,QAAA,IACxB,aAAa,aAAA,CAAc,QAAA,IAAYA,GAAAA,GAAI,aAAA,CAAc,MAAA,EAC1D;AACA,MAAA,aAAA,GAAgB,EAAE,KAAA,EAAO,MAAA,EAAQA,GAAAA,EAAG,QAAA,EAAA;AACtC,IAAA;AACF,EAAA;AACA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAO;AACL,MAAA,KAAA,EAAO,aAAA,CAAc,KAAA;AACrB,MAAA,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,aAAA,CAAc,QAAQ,KAAA,EAAA;AAClD,MAAA,SAAA,EAAW,EAAE,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAA;MAClC,MAAA,EAAQ;AAAA,KAAA;AAEZ,EAAA;AAGA,EAAA,MAAM,mBAAmB,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,GAAA,EAAK,KAAK,CAAC,CAAA;AAC7D,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,OAAO;MACL,KAAA,EAAO,gBAAA;AACP,MAAA,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAA;MACjC,SAAA,EAAW;AACT,QAAA,IAAA,EAAM,MAAA,IAAU,GAAA;QAChB,MAAA,EAAQ;AAAA,OAAA;MAEV,MAAA,EAAQ;AAAA,KAAA;AAEZ,EAAA;AAGA,EAAA,MAAM,mBAAmB,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,QAAQ,CAAC,CAAA;AACnE,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,OAAO;MACL,KAAA,EAAO,gBAAA;AACP,MAAA,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAA;MACnC,SAAA,EAAW;QACT,IAAA,EAAM,KAAA;AACN,QAAA,MAAA,EAAQ,KAAA,KAAU;AAAA,OAAA;MAEpB,MAAA,EAAQ;AAAA,KAAA;AAEZ,EAAA;AAGA,EAAA,IAAI,UAAA,GAA4E,IAAA;AAChF,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,SAAA,EAAW;AACpC,IAAA,MAAM,CAAC,IAAA,EAAMnQ,GAAC,CAAA,GAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAC/B,IAAA,MAAMmQ,GAAAA,GAAI,OAAO,IAAI,CAAA;AACrB,IAAA,IAAInQ,QAAM,QAAA,EAAU;AACpB,IAAA,IAAI,YAAA,CAAamQ,GAAC,CAAA,KAAM,eAAA,EAAiB;AACzC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAIA,GAAAA,GAAI,MAAM,CAAA;AACpC,IAAA,IACE,UAAA,KAAe,IAAA,IACf,QAAA,GAAW,UAAA,CAAW,QAAA,IACrB,aAAa,UAAA,CAAW,QAAA,IAAYA,GAAAA,GAAI,UAAA,CAAW,MAAA,EACpD;AACA,MAAA,UAAA,GAAa,EAAE,KAAA,EAAO,MAAA,EAAQA,GAAAA,EAAG,QAAA,EAAA;AACnC,IAAA;AACF,EAAA;AACA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO;AACL,MAAA,KAAA,EAAO,UAAA,CAAW,KAAA;AAClB,MAAA,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAA,CAAW,MAAA,EAAQ,OAAO,QAAA,EAAA;MACtD,SAAA,EAAW;QACT,IAAA,EAAM,KAAA;AACN,QAAA,MAAA,EAAQ,KAAA,KAAU;AAAA,OAAA;MAEpB,MAAA,EAAQ;AAAA,KAAA;AAEZ,EAAA;AAGA,EAAA,MAAM,UAAU,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,GAAA,EAAK,QAAQ,CAAC,CAAA;AACvD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO;MACL,KAAA,EAAO,OAAA;AACP,MAAA,QAAA,EAAU,EAAE,MAAA,EAAQ,MAAA,EAAQ,GAAA,EAAK,OAAO,QAAA,EAAA;MACxC,SAAA,EAAW;AACT,QAAA,IAAA,EAAM,MAAA,IAAU,GAAA;AAChB,QAAA,MAAA,EAAQ,KAAA,KAAU;AAAA,OAAA;MAEpB,MAAA,EAAQ;AAAA,KAAA;AAEZ,EAAA;AAEA,EAAA,OAAO,iBAAA,CAAkB,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,YAAY,CAAA;AAC9D;;;AChlBA,SAASikC,GAAAA,CAAkBt1C,GAAAA,EAAgBe,GAAAA,EAAgB4D,GAAAA,EAAoC;AAC7F,EAAA,IAAM,EAAE,WAAA,EAAAH,GAAAA,KAAgB+wC,kBAAAA,CAAmBC,GAAAA,EAAQC,KAAQ7uB,GAAK,CAAA;AAChE,EAAA,OAAO8uB,GAAAA,GACH,GAAGF,GAAAA,CAAAA,4BAAAA,EAAgCE,IAAY,QAAA,CAAA,CAAA,GAC/C,GAAGF,GAAAA,CAAAA,kBAAAA,CAAAA;AACT;AAEA,SAAgBG,IAAiB10C,GAAAA,EAA8B;AAC7D,EAAA,IAAM,EAAE,KAAA,EAAA0H,GAAAA,EAAO,KAAA,EAAAzH,GAAAA,GAAQ,KAAA,EAAO,QAAA,EAAAjB,GAAAA,EAAU,MAAA,EAAAkB,GAAAA,GAAS,GAAA,EAAK,SAAA,EAAAC,GAAAA,GAAY,QAAA,EAAU,SAAA,EAAAC,GAAAA,EAAA,GAAcqD,GAAAA,EAKpFkxC,GAAAA,GAAQC,SAAAA,EAAU,EAClBC,GAAAA,GAASC,eAAAA,EAAgB,CAAE,MAAA,CAAA,CAAQ/1C,GAAAA,KAAM,CAAC41C,GAAAA,CAAM,IAAA,CAAA,CAAM70C,GAAAA,KAAM+D,GAAAA,CAAE,MAAA,KAAW7E,GAAAA,CAAE,MAAM,CAAC,CAAA,EAClF+1C,GAAAA,GAAY,CAAC,GAAGJ,GAAAA,CAAM,GAAA,CAAA,CAAK51C,GAAAA,KAAM8E,GAAAA,CAAE,MAAM,CAAA,EAAG,GAAGgxC,GAAAA,CAAO,GAAA,CAAA,CAAK91C,GAAAA,KAAMC,GAAAA,CAAE,MAAM,CAAC,CAAA,EAC1E6yB,GAAAA,GAAUkjB,GAAAA,CAAU,GAAA,CAAA,CAAKh2C,GAAAA,MAAY;IAAE,KAAA,EAAOw1C,GAAAA;IAAQ,KAAA,EAAOA;GAAO,CAAE,CAAA;AAI5E,EAAA,OAHIjiB,GAAAA,KAAU,UAAa,CAACyiB,GAAAA,CAAU,SAASziB,GAAK,CAAA,IAClDT,IAAQ,IAAA,CAAK;IAAE,KAAA,EAAAnqB,GAAAA;IAAO,KAAA,EAAO2sC,GAAAA,CAAkB/hB,GAAAA,EAAOkiB,GAAAA,EAAQQ,GAAS;GAAG,CAAA,kBAG1El1C,GAAAA,CAACumC,EAAAA,EAAD;IACa,SAAA,EAAAjmC,GAAAA;IACF,OAAA,EAAA0D,GAAAA;IACT,WAAA,EAAaqoC,GAAAA,GAAQ,OAAQ7Z,GAAAA,IAAS,IAAA;AACtC,IAAA,WAAA,EAAa6Z,MAAQ,OAAA,GAAU,MAAA;IAC/B,iBAAA,EAAmB1I,GAAAA;IACnB,YAAA,EAAYhgC,GAAAA,CAAM,YAAA,CAAA,IAAiB;GACpC,CAAA;AAEL;ACvDA,IAAM8Y,GAAAA,GAAU,EAAA;AAYhB,SAAS04B,IAAYl2C,GAAAA,EAAiE;AACpF,EAAA,IAAMm2C,GAAAA,GAASC,GAAAA,CAAM,OAAA,GAAU,CAAA,CAAA,EAAI,MAAA;AACnC,EAAA,IAAI,CAACD,GAAAA,IAAUA,GAAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAClC,EAAA,IAAME,MAAAA,CAAQr2C,GAAAA,KAAsB,CAAA,mBAAA,EAAsBC,GAAAA,qBAKpDo4B,GAAAA,GAAS;IAHb,CAAC,OAAA,EAAS8d,GAAAA,CAAO,CAAA,CAAE,CAAA;IAAG,CAAC,SAAA,EAAWA,GAAAA,CAAO,CAAA,CAAE,CAAA;IAC3C,CAAC,WAAA,EAAaA,GAAAA,CAAO,CAAA,CAAE,CAAA;IAAG,CAAC,SAAA,EAAWA,GAAAA,CAAO,CAAA,CAAE;AAElC,GAAA,CAAG,GAAA,CAAA,CAAK,CAACG,GAAAA,EAAKr2C,GAAAA,CAAAA,KAC3B,CAAA,mCAAA,EAAsCq2C,GAAAA,CAAAA,EAAAA,EAAQr2C,GAAAA,CAAAA,EAAAA,EAAMo2C,GAAAA,CAAKp2C,GAAC,CAAA,CAAA,CAAA,CAAI,CAAA;AAGhE,EAAA,OADAo4B,GAAAA,CAAO,IAAA,CAAK,CAAA,2BAAA,EAA8B8d,GAAAA,CAAO,CAAA,CAAA,CAAA,EAAA,EAAOA,GAAAA,CAAO,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,EAC7D9d,GAAAA,CAAO,KAAK,IAAI,CAAA;AACzB;AAGA,SAASke,IAAa5xC,GAAAA,EAAuD;AAC3E,EAAA,IAAM2vC,GAAAA,GAAQ8B,GAAAA,CAAM,WAAA,IAAe,KAAA,EAC7B9iC,MAAgB,EAAC;AACvB,EAAA,KAAA,IAASrS,GAAAA,GAAI,CAAA,EAAGA,GAAAA,IAAKuc,GAAAA,EAAS/W,GAAAA,EAAAA,EAAK;AACjC,IAAA,IAAM1F,MAAIE,GAAAA,GAAIuc,GAAAA;AACd,IAAAvc,GAAAA,CAAI,IAAA,CAAK,CAAA,EAAG4zC,mBAAAA,CAAoBuB,IAAM,KAAA,EAAOr1C,GAAAA,EAAGuzC,GAAK,CAAA,KAAMvzC,GAAAA,GAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAI,CAAA;AACnF,EAAA;AACA,EAAA,OAAOuS,GAAAA,CAAI,KAAK,IAAI,CAAA;AACtB;AAEA,IAAMkjC,GAAAA,GAAM,MAAM,IAAA,CAAK,EAAA;AAIvB,SAASnD,IAAIrzC,GAAAA,EAAmB;AAC9B,EAAA,OAAO,CAAA,EAAA,CAAIH,GAAAA,GAAI,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA;AAC/B;AAYA,SAAgB42C,IAAgBz2C,GAAAA,EAAyD;AACvF,EAAA,IAAIo2C,OAAS,IAAA,EAEb;AADaA,IAAAA,IAAAA,CAAAA,GAAAA,CAAM,IAAA,IAAQ,OAAA,MACd,OAAA,EAAS,OAAQA,GAAAA,CAA4B,KAAA;AAE1D,IAAA,IAAIA,GAAAA,CAAM,SAAS,iBAAA,EAAmB;AACpC,MAAA,IAAM1mC,GAAAA,GAAK0mC,GAAAA,CAAM,EAAA,CAAG,CAAA,GAAIA,GAAAA,CAAM,IAAA,CAAK,CAAA,EAC7BzmC,GAAAA,GAAKymC,GAAAA,CAAM,EAAA,CAAG,CAAA,GAAIA,GAAAA,CAAM,IAAA,CAAK,CAAA;AAInC,MAAA,OAAO,oBADO1mC,GAAAA,KAAO,CAAA,IAAKC,QAAO,CAAA,GAAI,EAAA,GAAK,KAAK,KAAA,CAAMD,GAAAA,EAAI,CAACC,GAAE,CAAA,GAAI6mC,KAChC,OAAA,CAAQ,CAAC,CAAA,CAAA,KAAA,EAASD,GAAAA,CAAaH,GAAK,CAAA,CAAA,CAAA,CAAA;AACtE,IAAA;AACA,IAAA,IAAIA,GAAAA,CAAM,SAAS,iBAAA,EAEjB,OAAO,0BAA0B,CAAA,GAAA,EADhB/C,GAAAA,CAAI+C,IAAM,MAAA,CAAO,CAAC,CAAA,CAAA,CAAA,EAAK/C,GAAAA,CAAI+C,IAAM,MAAA,CAAO,CAAC,CAAA,CAAA,CAAA,CAAA,EAAA,EAClBG,GAAAA,CAAaH,GAAK,CAAA,CAAA,CAAA,CAAA;AAE5D,IAAA,IAAKA,GAAAA,CAAM,IAAA,KAAoB,eAAA,EAC7B,OAAOF,IAAYE,GAAwD,CAAA;AAE7E,IAAA,IAAIA,GAAAA,CAAM,IAAA,KAAS,gBAAA,EAGjB,OAAO,CAAA,oBAAA,EAAA,CADOA,GAAAA,CAAM,KAAA,GAAQI,GAAAA,GAAM,EAAA,EAAI,OAAA,CAAQ,CAChB,CAAA,CAAA,OAAA,EAAcnD,GAAAA,CAAI+C,GAAAA,CAAM,MAAA,CAAO,CAAC,CAAA,CAAA,CAAA,EAAK/C,GAAAA,CAAI+C,GAAAA,CAAM,MAAA,CAAO,CAAC,CAAA,CAAA,EAAA,EAAMG,GAAAA,CAAaH,GAAK,CAAA,CAAA,CAAA,CAAA;AApBrD,EAAA;AAuB5D;;;;;;;;IClFMjC,GAAAA,GAA+C;AACnD,EAAA;IAAE,KAAA,EAAO,KAAA;IAAO,KAAA,EAAO;AAAO,GAAA;AAC9B,EAAA;IAAE,KAAA,EAAO,OAAA;IAAS,KAAA,EAAO;AAAQ,GAAA;AACjC,EAAA;IAAE,KAAA,EAAO,OAAA;IAAS,KAAA,EAAO;AAAQ;AACnC,CAAA;AA2BA,SAAgBuC,IAAW31C,GAAAA,EAAsC;AAC/D,EAAA,IAAM,EAAE,OAAAE,GAAAA,EAAO,OAAA,EAAAE,KAAS,QAAA,EAAAE,GAAAA,EAAU,WAAA,EAAAyD,GAAAA,GAAc,IAAA,EAAM,SAAA,EAAAjD,KAAA,GAAc6C,GAAAA,EAC9D4vC,GAAAA,GAAQ/gB,GAAAA,CAAM,WAAA,IAAe,KAAA,EAE7BojB,MAAAA,CAAc32C,GAAAA,EAAoBe,GAAAA,EAAgB4D,GAAAA,KAA6BiyC,OAAAA,CAAQ;IAC3F,GAAGrjB,GAAAA;AACH,IAAA,OAAA,EAASA,GAAAA,CAAM,OAAA,CAAQ,GAAA,CAAA,CAAK/uB,KAAOvD,GAAAA,KAAM;AACvC,MAAA,IAAIA,GAAAA,KAAM41C,KAAY,OAAOC,GAAAA;AAC7B,MAAA,IAAM,CAACrwC,KAAGlD,GAAAA,EAAGtD,GAAAA,EAAGoB,GAAAA,CAAAA,GAAKy1C,GAAAA,CAAM,QACrB1rC,GAAAA,GAAyC;AAAC3E,QAAAA,GAAAA;AAAGlD,QAAAA,GAAAA;AAAGtD,QAAAA,GAAAA;AAAGoB,QAAAA;AAAC,OAAA;AAE1D,MAAA,OADAF,GAAAA,CAAK41C,GAAAA,CAAAA,GAAUlvC,GAAAA,EACR;QAAE,GAAGivC,GAAAA;QAAO,MAAA,EAAQ1rC;AAAK,OAAA;IAClC,CAAC;GACF,CAAA;AAED,EAAA,uBACEzC,KAAC,KAAA,EAAD;IAAK,SAAA,EAAW,CAACzH,IAAE,IAAA,EAAMkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAA5D,QAAA,EAAA,CACGmuB,IAAM,OAAA,CAAQ,GAAA,CAAA,CAAKxyB,GAAAA,EAAO4D,GAAAA,qBAGzBgE,IAAAA,CAAC,KAAA,EAAD;AAAsB,MAAA,SAAA,EAAWzH,GAAAA,CAAE,KAAA;MAAnC,QAAA,EAAA,iBACEuF,GAAAA,CAAC,MAAA,EAAD;AACE,QAAA,SAAA,EAAWvF,GAAAA,CAAE,OAAA;QACb,aAAA,EAAY,MAAA;AACZ,QAAA,KAAA,EAAO,EAAE,UAAA,EAAY81C,GAAAA,CAAUzjB,GAAAA,EAAOsjB,GAAU,CAAA;OACjD,CAAA,kBACDpwC,GAAAA,CAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAWvF,GAAAA,CAAE,OAAA;QACf,QAAA,EAAA41C,GAAAA,CAAM,OAAO,GAAA,CAAA,CAAK/1C,KAAOyD,GAAAA,qBACxBiC,IAAC0rC,GAAAA,EAAD;UAEE,KAAA,EAAOtqC,GAAAA;UACP,KAAA,EAAA,IAAA;AACA,UAAA,YAAA,EAAY,CAAA,MAAA,EAASgvC,GAAAA,GAAa,CAAA,CAAA,QAAA,EAAYE,MAAS,CAAA,CAAA,CAAA;AACvD,UAAA,SAAA,EAAW71C,GAAAA,CAAE,MAAA;AACb,UAAA,OAAA,EAAA,CAAUlB,GAAAA,KAASwkC,GAAAA,GAAUmS,IAAWE,GAAAA,EAAYE,GAAAA,EAAQ3rC,GAAI,CAAC,CAAA;AACjE,UAAA,QAAA,EAAA,CAAWpL,GAAAA,KAAS0kC,GAAAA,CAASiS,IAAWE,GAAAA,EAAYE,GAAAA,EAAQ3rC,GAAI,CAAC;AAClE,SAAA,EAPM2rC,GAON,CACF;AACE,OAAA,CACF;AAnBK,KAAA,EAAAF,GAmBL,CACN,CAAA,EAEA/B,GAAAA,oBACCruC,IAACwmC,GAAAA,EAAD;MACE,KAAA,EAAOkH,GAAAA;MACP,KAAA,EAAOG,GAAAA;MACP,IAAA,EAAK,IAAA;MACL,SAAA,EAAU,aAAA;AACV,MAAA,QAAA,EAAA,CAAWt0C,GAAAA,KAASoL,GAAAA,IAAQs5B,GAAAA,CAASkS,OAAAA,CAAQ;QAAE,GAAGrjB,GAAAA;QAAO,WAAA,EAAanoB;AAAK,OAAC,CAAC;AAC9E,KAAA,CAEA;;AAET;AAIA,SAAS4rC,GAAAA,CAAUh3C,KAAyB2E,GAAAA,EAAwC;AAClF,EAAA,OAAO8xC,GAAAA,CACL;IAAE,GAAGljB,GAAAA;AAAO,IAAA,OAAA,EAAS,CAACA,GAAAA,CAAM,OAAA,CAAQsjB,GAAAA,CAAW;GACjD,CAAA;AACF;AAGA,SAAgBI,IAAYj3C,GAAAA,EAA0E;AACpG,EAAA,OAAOk3C,mBAAmBnT,GAAI,CAAA;AAChC;;;;;;;ICpGMoT,GAAAA,GAA4C;AAAC,EAAA,OAAA;AAAS,EAAA,YAAA;AAAc,EAAA,MAAA;AAAQ,EAAA;AAAQ,CAAA;IAIpFC,GAAAA,GAA0D;AAC9D,EAAA;IAAE,KAAA,EAAO,CAAA;IAAG,KAAA,EAAO;AAAI,GAAA;AACvB,EAAA;IAAE,KAAA,EAAO,CAAA;IAAG,KAAA,EAAO;AAAI,GAAA;AACvB,EAAA;IAAE,KAAA,EAAO,EAAA;IAAI,KAAA,EAAO;AAAI,GAAA;AACxB,EAAA;IAAE,KAAA,EAAO,EAAA;IAAI,KAAA,EAAO;AAAK;AAC3B,CAAA;IAEMC,GAAAA,GAAoB,CAAA;IAGpBC,GAAAA,GAAe,EAAA;AAKrB,SAASC,IAAOv3C,GAAAA,EAA2C;AACzD,EAAA,OAAO,MAAA,IAAU+jC,GAAAA,CAAK,OAAA,GAAUA,GAAAA,CAAK,OAAA,GAAU,IAAA;AACjD;AAMA,SAAgByT,GAAAA,CACdx3C,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,GAAe0yC,GAAAA,EACF;AACb,EAAA,IAAMp0B,GAAAA,GAAwB;IAAE,IAAA,EAAAjjB,GAAAA;IAAM,KAAA,EAAO4D,GAAAA;IAAM,IAAA,EAAAe;AAAK,GAAA;AAIxD,EAAA,OADI8yC,GAAAA,KAAS,QAAA,KAAUjzC,GAAAA,CAAK,EAAA,GAAK,WAAA,CAAA,EAC1B;IAAE,IAAA,EAAM,SAAA;IAAW,OAAA,EAASye,GAAAA;IAAM,KAAA,EAAO;AAAS,GAAA;AAC3D;AAqBA,SAAgBy0B,IAAcr2C,GAAAA,EAAyC;AACrE,EAAA,IAAM,EAAE,OAAAyD,GAAAA,EAAO,KAAA,EAAAjD,KAAO,QAAA,EAAAhB,GAAAA,EAAU,WAAAkE,GAAAA,EAAA,GAAcL,KACxCue,GAAAA,GAAOs0B,GAAAA,CAAOhkB,GAAK,CAAA,EACnB/xB,GAAAA,GAAOyhB,KAAM,IAAA,IAAQo0B,GAAAA,EAErBM,GAAAA,GAAAA,CAAQ33C,GAAAA,KAAwC;AACpD,IAAAa,GAAAA,CAAS22C,GAAAA,CAAYC,GAAAA,EAAM5vC,GAAAA,EAAOrG,GAAI,CAAC,CAAA;EACzC,CAAA,EAEMo2C,GAAAA,GAAAA,CAAU53C,GAAAA,KAA2B;AACpCijB,IAAAA,OACLyhB,GAAAA,CAAS;MAAE,GAAGnR,GAAAA;MAAO,OAAA,EAAS;QAAE,GAAGtQ,GAAAA;QAAM,IAAA,EAAM40B;AAAS;KAAG,CAAA;AAC7D,EAAA,CAAA;AAEA,EAAA,uBACElzC,KAAC,KAAA,EAAD;IAAK,SAAA,EAAW,CAACzD,IAAE,IAAA,EAAMkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAA5D,QAAA,EAAA,iBACErE,GAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWG,GAAAA,CAAE,IAAA;MACf,QAAA,EAAAi2C,GAAAA,CAAM,GAAA,CAAA,CAAKn3C,GAAAA,KAAS;AACnB,QAAA,IAAM83C,GAAAA,GAA2B;UAAE,IAAA,EAAA93C,GAAAA;UAAM,KAAA,EAAA6B,GAAAA;UAAO,IAAA,EAAMy1C;AAAa,SAAA;AAC/DG,QAAAA,GAAAA,KAAS,QAAA,KAAU9yC,GAAAA,CAAQ,EAAA,GAAK,WAAA,CAAA;AACpC,QAAA,IAAM8oC,GAAAA,GAAWxqB,KAAM,IAAA,KAASw0B,GAAAA;AAChC,QAAA,uBACE12C,IAAC,QAAA,EAAD;UAEE,IAAA,EAAK,QAAA;UACL,SAAA,EAAW,CAACG,GAAAA,CAAE,MAAA,EAAQusC,GAAAA,IAAYvsC,GAAAA,CAAE,YAAY,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC1E,UAAA,KAAA,EAAO,EAAG,gBAAA,EAA6B62C,iBAAAA,CAAkBD,GAAO,CAAA,EAAE;UAClE,KAAA,EAAOL,GAAAA;UACP,YAAA,EAAYA,GAAAA;UACZ,cAAA,EAAchK,GAAAA;UACd,OAAA,EAAA,MAAekK,IAAKF,GAAI;AACzB,SAAA,EARMA,GAQN,CAAA;MAEL,CAAC;KACE,CAAA,kBACL12C,GAAAA,CAACksC,GAAAA,EAAD;MACE,KAAA,EAAOmK,GAAAA;MACP,KAAA,EAAO51C,GAAAA;MACP,IAAA,EAAK,IAAA;MACL,SAAA,EAAU,WAAA;AACV,MAAA,QAAA,EAAA,CAAWxB,GAAAA,KAAMH,GAAAA,IAAK,IAAA,IAAQ+3C,IAAO/3C,GAAC;AACvC,KAAA,CACE;;AAET;;;;;;IC5FMm4C,GAAAA,GAAiB,WAAA;IAKjBC,GAAAA,GAAO,MAAA;IAEPC,GAAAA,GAAoC;AACxC,EAAA,iBAAA;AACA,EAAA,iBAAA;AACA,EAAA;AACF,CAAA;AAEA,SAASC,GAAWn4C,GAAAA,EAAqD;AACvE,EAAA,OAAOo2C,QAAU,MAAA,IAAa8B,GAAAA,CAAe,QAAA,CAAS9B,GAAAA,CAAM,QAAQ,EAAE,CAAA;AACxE;AAEA,SAASgC,GAAUp4C,GAAAA,EAAoD;AACrE,EAAA,OAAOo2C,KAAO,IAAA,KAAS,SAAA;AACzB;AAIA,SAASiC,GAAOr4C,GAAAA,EAAuD;AAGrE,EAAA,OAFIo2C,QAAU,IAAA,GAAa6B,GAAAA,GACvB7B,QAAU,MAAA,GAAkB,IAAA,GACzBA,IAAM,IAAA,IAAQ,OAAA;AACvB;AAuCA,SAAgBkC,GAAWlvB,GAAAA,EAAsC;AAC/D,EAAA,IAAM,EACJ,KAAA,EAAAnY,GAAAA,EAAO,KAAA,EAAAI,GAAAA,GAAQ,OAAO,KAAA,EAAA2S,GAAAA,GAAQ,KAAA,EAAO,KAAA,EAAAC,KAAO,SAAA,EAAAC,GAAAA,GAAY,IAAA,EACxD,OAAA,EAAAC,KAAS,QAAA,EAAAvkB,GAAAA,EAAU,SAAA,EAAAqW,GAAAA,KACjBvR,GAAAA,EACEugB,GAAAA,GAAYvgB,GAAAA,CAAM,YAAA,GAKlB6zC,GAAAA,GAAa7uC,MAAAA,iBAAO,IAAI,GAAA,EAA2B,CAAA,EAEnDylB,GAAAA,GAASie,GAAAA,GAAQ,IAAA,GAAOiL,GAAO9kB,GAAK,CAAA;AACtCA,EAAAA,GAAAA,IAAS,QAAQpE,GAAAA,KAAW,IAAA,IAAMopB,IAAW,OAAA,CAAQ,GAAA,CAAIppB,KAAQoE,GAAK,CAAA;AAE1E,EAAA,IAAMilB,GAAAA,GAAUC,gBAAe,CAAE,MAAA,CAAA,CAC9Bz4C,GAAAA,KAAU04C,GAAAA,KAAU,UAAaA,GAAAA,CAAM,QAAA,CAAS3nB,IAAM,EAAE,CAC3D,GACMmN,GAAAA,GAAAA,CAAWv5B,KAAYH,GAAAA,EAAevD,GAAAA,KAC1C8F,GAAAA,IAAQA,GAAAA,IAAQ1G,EAAAA,GAKZ;IAAE,KAAA,EAAOkqB,GAAAA;IAAI,KAAA,kBAAOlpB,IAACL,CAAAA,EAAD;MAAM,IAAA,EAAM+F,GAAAA;MAAkB,IAAA,EAAM;KAAK,CAAA;IAAG,SAAA,EAAWrF;GAAM,GACjF;IAAE,KAAA,EAAO6oB,GAAAA;IAAI,KAAA,EAAA/lB;GAAM,EAEnB+B,EAAAA,GAA6C,CACjD,GAAIoyC,GAAAA,GAAY,CAACza,GAAAA,CAAQ+Z,GAAAA,EAAM,MAAA,EAAQ,WAAW,CAAC,CAAA,GAAI,EAAC,EACxD,GAAGO,GAAAA,CAAQ,GAAA,CAAA,CAAKx4C,GAAAA,KAAUk+B,IAAQnN,GAAAA,CAAM,EAAA,EAAIA,GAAAA,CAAM,KAAA,EAAOA,GAAAA,CAAM,IAAI,CAAC,CACtE,CAAA,EAGM6nB,KAAettB,WAAAA,CAAAA,MACfiI,OAAS,IAAA,GAAaykB,GAAAA,GACnBa,YAAAA,CAAaR,EAAAA,CAAO9kB,GAAK,CAAA,IAAK,OAAO,CAAA,EAAG,OAAA,CAAQA,GAAK,CAAA,IAAKykB,GAAAA,EAChE,CAACzkB,GAAK,CAAC,CAAA,EAEJulB,EAAAA,GAAAA,CAAc94C,GAAAA,KAA0B;AAC5C,IAAA,IAAI20C,QAASxlB,GAAAA,EAAQ;AACrB,IAAA,IAAIwlB,QAASsD,GAAAA,EAAM;AACjB,MAAAr4C,IAAS,IAAI,CAAA;AACb,MAAA;AACF,IAAA;AACA,IAAA,IAAMsuC,GAAAA,GAAOqK,GAAAA,CAAW,OAAA,CAAQ,GAAA,CAAI5D,GAAI,CAAA;AACxC,IAAA,IAAIzG,QAAS,MAAA,EAAW;AACtB,MAAAtuC,IAASsuC,GAAI,CAAA;AACb,MAAA;AACF,IAAA;AACA,IAAA,IAAI3a,GAAAA,IAAS,QAAQ4kB,EAAAA,CAAW5kB,GAAK,KAAK2kB,GAAAA,CAAe,QAAA,CAASvD,GAAI,CAAA,EAAG;AACvE,MAAA/0C,GAAAA,CAASg1C,gBAAAA,CAAiBrhB,GAAAA,EAAOohB,GAAoB,CAAC,CAAA;AACtD,MAAA;AACF,IAAA;AACA,IAAA,IAAM5jB,GAAAA,GAAQ8nB,aAAalE,GAAI,CAAA;AAC3B5jB,IAAAA,OAAO2T,GAAAA,CAAS3T,GAAAA,CAAM,IAAA,CAAK6nB,EAAAA,EAAc,CAAC,CAAA;AAChD,EAAA,CAAA;AAEA,EAAA,uBACE9zC,KAAC,KAAA,EAAD;IACE,SAAA,EAAW;MAAC5D,GAAAA,CAAE,IAAA;AAAM63C,MAAAA,GAAAA,IAAS73C,GAAAA,CAAE,KAAA;AAAOkE,MAAAA;AAAS,KAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACzE,IAAA,KAAA,EAAO2zC,MAAQ,SAAA,GAAY,MAAA;IAF7B,QAAA,EAAA,iBAIE13C,GAAAA,CAAC4rC,GAAAA,EAAD;MACS,KAAA,EAAArlB,EAAAA;MACP,KAAA,EAAOuH,GAAAA;MACP,IAAA,EAAK,IAAA;MACL,SAAA,EAAU,YAAA;AACV,MAAA,QAAA,EAAA,CAAWnvB,GAAAA,KAAS20C,GAAAA,IAAQmE,EAAAA,CAAWnE,GAAI;KAC5C,CAAA,EACAqE,IACE;;AAGP,EAAA,SAASA,EAAAA,GAAkC;AACzC,IAAA,IAAI5L,OAAS7Z,GAAAA,KAAU,MAAA,EACrB,uBACElyB,IAAC8wC,GAAAA,EAAD;MACE,KAAA,EAAA,IAAA;MACA,YAAA,EAAYltB,GAAAA;MACZ,QAAA,EAAA,CAAWjlB,QAAU0kC,GAAAA,CAAS;QAAE,IAAA,EAAM,OAAA;QAAS,KAAA,EAAA1kC;OAAO;KACvD,CAAA;AAIL,IAAA,IAAIuzB,GAAAA,KAAU,MAAM,OAAO,IAAA;AAI3B,IAAA,IAAMxC,GAAAA,GAAQ8nB,YAAAA,CAAaR,EAAAA,CAAO9kB,GAAK,KAAK,OAAO,CAAA;AACnD,IAAA,IAAIxC,KAAO,MAAA,EAAQ;AACjB,MAAA,IAAMkoB,MAASloB,GAAAA,CAAM,MAAA;AACrB,MAAA,uBAAO1vB,IAAC43C,GAAAA,EAAD;QAAe,KAAA,EAAAhoC,GAAAA;QAAgB,OAAA,EAAAkT,GAAAA;QAAmB,QAAA,EAAAvkB;OAAW,CAAA;AACtE,IAAA;AACA,IAAA,IAAIu4C,GAAW5kB,GAAK,CAAA,EAClB,uBACElyB,IAACgzC,EAAAA,EAAD;MACS,KAAA,EAAApjC,GAAAA;MACP,UAAA,EAAY,KAAA;MACH,OAAA,EAAAkT,GAAAA;MACC,QAAA,EAAAvkB;KACX,CAAA;AAGL,IAAA,IAAIw4C,GAAU7kB,GAAK,CAAA,EACjB,uBAAOlyB,IAACq2C,GAAAA,EAAD;MAAsB,KAAA,EAAAzmC,GAAAA;AAAO,MAAA,KAAA,EAAO2nC,EAAAA,EAAa;MAAa,QAAA,EAAAh5C;KAAW,CAAA;AAElF,IAAA,IAAIq3C,IAAY1jB,GAAK,CAAA,EACnB,uBAAOlyB,IAACq1C,GAAAA,EAAD;MAAmB,KAAA,EAAAzlC,GAAAA;MAAgB,OAAA,EAAAkT,GAAAA;MAAmB,QAAA,EAAAvkB;KAAW,CAAA;AAE1E,IAAA,IAAM+0C,GAAAA,GAAO0D,GAAO9kB,GAAK,CAAA;AAMzB,IAAA,OALIohB,GAAAA,KAAS,OAAA,mBAMXtzC,GAAAA,CAAC8wC,GAAAA,EAAD;AACE,MAAA,KAAA,EAAOyG,EAAAA,EAAa;MACpB,KAAA,EAAA,IAAA;MACA,YAAA,EAAY3zB,GAAAA;MACZ,OAAA,EAAA,CAAUjlB,QAAUwkC,GAAAA,GAAU;QAAE,IAAA,EAAM,OAAA;QAAS,KAAA,EAAAxkC;OAAO,CAAA;MACtD,QAAA,EAAA,CAAWA,QAAU0kC,GAAAA,CAAS;QAAE,IAAA,EAAM,OAAA;QAAS,KAAA,EAAA1kC;OAAO;KACvD,CAAA,mBATM8E,IAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAW5D,GAAAA,CAAE,QAAA;AAAlB,MAAA,QAAA,EAAA,CAA6B6vB,GAAAA,EAAO,KAAA,IAAS4jB,GAAAA,EAAK,aAAgB;;AAW7E,EAAA;AACF;;;;;;;;AC/KA,SAASuE,GAAAA,CAAUl5C,KAAqCe,GAAAA,EAAwB;AAI9E,EAAA,OAHIqsC,GAAAA,GAAc,OAAA,GACdgJ,GAAAA,KAAU,IAAA,GAAa,SACvBA,GAAAA,KAAU,MAAA,GAAkB,QAAA,GACzByC,YAAAA,CAAazC,IAAM,IAAA,IAAQ,OAAO,CAAA,EAAG,KAAA,IAAUA,IAAM,IAAA,IAAQ,OAAA;AACtE;AAYA,SAAgB+C,IAAW30C,GAAAA,EAAsC;AAC/D,EAAA,IAAM,EACJ,KAAA,EAAAM,GAAAA,EAAO,OAAAjD,GAAAA,GAAQ,KAAA,EAAO,OAAAhB,GAAAA,GAAQ,KAAA,EAAO,KAAA,EAAAkE,GAAAA,EAAO,WAAAgP,GAAAA,GAAY,IAAA,EACxD,SAAAiK,GAAAA,EAAS,QAAA,EAAAne,KAAU,SAAA,EAAAoG,GAAAA,EAAW,eAAA,EAAA1C,GAAAA,KAC5BmB,GAAAA,EACEugB,GAAAA,GAAYvgB,IAAM,YAAA,CAAA,EAClB,EAAE,MAAA,EAAA0kB,GAAAA,EAAQ,aAAAnY,GAAAA,EAAA,GAAgBlN,GAAiBiB,GAAe,CAAA,EAC1D8yC,MAAU1K,GAAAA,GAAQ,MAAA,GAAYqJ,IAAgBljB,GAAK,CAAA;AAEzD,EAAA,uBACE9sB,IAAAA,CAAC2yC,aAAAA,EAAD,EAAA,QAAA,EAAA;AACGl0C,IAAAA,GAAAA;AACD,oBAAAuB,KAAC0hC,MAAAA,EAAD;MACE,SAAA,EAAW,CAACjnC,IAAE,OAAA,EAASkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;MAC1D,YAAA,EAAY6f,GAAAA;AACZ,MAAA,GAAK8zB,GAAAA,GAAQ,EAAE,YAAA,EAAc,EAAA,KAAO,EAAC;AACrC,MAAA,GAAK3L,GAAAA,GAAQ,EAAE,YAAA,EAAc,EAAA,KAAO,EAAC;MAJvC,QAAA,EAAA,iBAMEnsC,GAAAA,CAAC,MAAA,EAAD;AACE,QAAA,SAAA,EAAWC,GAAAA,CAAE,MAAA;QACb,aAAA,EAAY,MAAA;QACZ,GAAK42C,GAAAA,GAAU,EAAE,KAAA,EAAO,EAAE,UAAA,EAAYA,KAAQ,EAAE,GAAI,EAAE,YAAA,EAAc,EAAA;OACrE,CAAA,kBACD72C,GAAAA,CAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWC,GAAAA,CAAE,KAAA;QAAQ,QAAA,EAAAg4C,GAAAA,CAAU3lB,KAAO6Z,GAAK;AAAQ,OAAA,CAChD;;AAGX,oBAAAnsC,IAAC8nC,OAAAA,EAAD;AAAY,MAAA,SAAA,EAAW7nC,GAAAA,CAAE,OAAA;MAAS,qBAAA,EAAoB,EAAA;MAAG,GAAImE,GAAAA;MAC3D,QAAA,kBAAApE,IAACskC,MAAAA,EAAD;AAAW,QAAA,SAAA,EAAWrkC,GAAAA,CAAE,IAAA;QAAM,YAAA,EAAY+jB,GAAAA,GAAY,CAAA,EAAGA,GAAAA,CAAAA,OAAAA,CAAAA,GAAqB,cAAA;QAC5E,QAAA,kBAAAhkB,IAACq3C,EAAAA,EAAD;UACS,KAAA,EAAAxzC,GAAAA;UACA,KAAA,EAAAjD,GAAAA;UACA,KAAA,EAAAhB,GAAAA;UACA,KAAA,EAAAkE,GAAAA;UACI,SAAA,EAAAgP,GAAAA;UACF,OAAA,EAAAiK,GAAAA;UACC,QAAA,EAAAne,GAAAA;UACV,YAAA,EAAYolB;SACb;OACQ;KACD;AACC,GAAA,EAAA,CAAA;AAEnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IC9DMo0B,GAAAA,GAAiD;AACrD,EAAA,KAAA,EAAOn4C,EAAAA,CAAE,YAAA;AACT,EAAA,MAAA,EAAQA,EAAAA,CAAE,aAAA;AACV,EAAA,KAAA,EAAOA,EAAAA,CAAE;AACX,CAAA;IAEMo4C,GAAAA,GAA6C;AACjD,EAAA,KAAA,EAAOp4C,EAAAA,CAAE,UAAA;AACT,EAAA,MAAA,EAAQA,EAAAA,CAAE,WAAA;AACV,EAAA,GAAA,EAAKA,EAAAA,CAAE,QAAA;AACP,EAAA,QAAA,EAAUA,EAAAA,CAAE;AACd,CAAA;AAIA,SAAgBq4C,EAAAA,CACdv5C,KACA,EAAE,OAAA,EAAAe,KAAS,KAAA,EAAA4D,GAAAA,IACXH,GAAAA,EACQ;AACR,EAAA,OAAO;AAAC0hB,IAAAA,GAAAA;AAAMqrB,IAAAA,GAAAA,IAAW8H,IAAc9H,GAAAA,CAAAA;AAAUxH,IAAAA,GAAAA,IAASuP,IAAYvP,GAAAA,CAAAA;AAAQ3kC,IAAAA;AAAS,GAAA,CACpF,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;AACb;AAoBA,IAAMo0C,EAAAA,GAAe11C,cAAc,KAAK,CAAA;AAUxC,SAAgB21C,GAAAA,CAAc,EAC5B,KAAA,EAAAz5C,GAAAA,EACA,SAAAe,GAAAA,EACA,UAAA,EAAA4D,KACA,QAAA,EAAA1D,GAAAA,EACA,WAAAwF,GAAAA,EACA,OAAA,EAAAkC,KACA,KAAA,EAAAzH,GAAAA,EACA,QAAAjB,GAAAA,EACA,IAAA,EAAAkB,KAAA,EACqB;AACrB,EAAA,IAAMu4C,GAAAA,GAASt1C,UAAAA,CAAWo1C,EAAY,CAAA,EAChCG,MAAQnyC,EAAAA,CAAU;IAAE,MAAA,EAAAvH,GAAAA;IAAQ,IAAA,EAAAkB;AAAK,GAAC,GAClCy4C,GAAAA,GAAUtyC,GAAAA,IAAS,IAAA,oBAAQ0c,IAAC,IAAA,EAAD;AAAI,IAAA,SAAA,EAAW9iB,EAAAA,CAAE,UAAA;IAAa,QAAA,EAAAoG;GAAU,CAAA;AACzE,EAAA,uBACE2c,KAAC,KAAA,EAAD;IACE,SAAA,EAAWs1B,EAAAA,CAAoBr4C,GAAE,KAAA,EAAO;MAAE,OAAA,EAAAyH,GAAAA;MAAS,KAAA,EAAAzH;AAAM,KAAA,EAAGkE,GAAS,CAAA;IACrE,GAAIu0C,GAAAA;AACJ,IAAA,aAAA,EAAaD,GAAAA,IAAU,MAAA;IACvB,iBAAA,EAAA,CAAkBG,GAAAA,IAAclyC,QAAW,OAAA,KAAY,MAAA;AAJzD,IAAA,QAAA,EAAA,CAMGmyC,GAAAA,IAAW,IAAA,GAKRF,GAAAA,mBAJF31B,KAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAW/iB,EAAAA,CAAE,WAAA;AAAlB,MAAA,QAAA,EAAA,CACG04C,GAAAA,kBACD51B,GAAAA,CAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAW9iB,EAAAA,CAAE,YAAA;QAAe,QAAA,EAAA44C;AAAa,OAAA,CAC3C;AACH,KAAA,CAAA,kBACJ91B,GAAAA,CAACw1B,EAAAA,CAAa,QAAA,EAAd;MAAuB,KAAA,EAAA,IAAA;MAAO,QAAA,EAAAv4C;AAAgC,KAAA,CAC3D;;AAET;AA0BA,IAAa84C,MAAeh2B,UAAAA,CAAW,SACrC,EAAE,QAAA,EAAA/jB,KAAU,SAAA,EAAAe,GAAAA,EAAW,IAAA,EAAA4D,GAAAA,GAAO,cAAc,OAAA,EAAAH,GAAAA,EAAS,KAAA,EAAAvD,GAAAA,IACrDwF,GAAAA,EACA;AACA,EAAA,IAAMyf,MAAO,CAAA,EAAGhlB,EAAAA,CAAE,IAAA,CAAA,EAAO84C,QAAS,OAAA,GAAU,CAAA,CAAA,EAAI94C,EAAAA,CAAE,SAAA,KAAc84C,GAAAA,KAAS,QAAA,GAAW,IAAI94C,EAAAA,CAAE,SAAA,KAAc,EAAA,CAAA,CAAA;AACxG,EAAA,uBACE8iB,IAAC,KAAA,EAAD;IAAU,GAAA,EAAAvd,GAAAA;AAAK,IAAA,SAAA,EAAW8yC,GAAoBrzB,GAAAA,EAAM;MAAE,OAAA,EAAA1hB,GAAAA;MAAS,KAAA,EAAAvD;AAAM,KAAA,EAAGmE,GAAS,CAAA;IAC9E,QAAA,EAAApF;GACE,CAAA;AAET,CAAC;AAcD,SAAgBi6C,IAAa,EAAE,QAAA,EAAAj6C,GAAAA,EAAU,SAAA,EAAAe,KAAA,EAAgC;AACvE,EAAA,uBAAOijB,IAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAW5e,MAAY,CAAA,EAAGlE,EAAAA,CAAE,IAAA,CAAA,CAAA,EAAQkE,GAAAA,KAAclE,EAAAA,CAAE,IAAA;IAAO,QAAA,EAAAlB;GAAc,CAAA;AACvF;AAaA,SAAgBk6C,GAAa,EAAE,QAAA,EAAAl6C,GAAAA,EAAU,SAAA,EAAAe,KAAA,EAAgC;AACvE,EAAA,uBAAOijB,IAAC,GAAA,EAAD;AAAG,IAAA,SAAA,EAAW5e,MAAY,CAAA,EAAGlE,EAAAA,CAAE,IAAA,CAAA,CAAA,EAAQkE,GAAAA,KAAclE,EAAAA,CAAE,IAAA;IAAO,QAAA,EAAAlB;GAAY,CAAA;AACnF;AA0DA,SAAgBm6C,EAAAA,CAAY,EAC1B,KAAA,EAAAn6C,GAAAA,EACA,SAAAe,GAAAA,EACA,WAAA,EAAA4D,GAAAA,EACA,OAAA,EAAAH,GAAAA,GAAU,SAAA,EACV,MAAA,EAAAvD,GAAAA,EACA,MAAAwF,GAAAA,EACA,QAAA,EAAAkC,GAAAA,EACA,OAAA,EAAAzH,GAAAA,EACA,KAAA,EAAAjB,GAAAA,EACA,SAAA,EAAAkB,KACA,OAAA,EAAAC,GAAAA,EACA,KAAA,EAAAC,GAAAA,EACA,MAAAyD,GAAAA,EACA,YAAA,EAAAjD,GAAAA,EACA,MAAA,EAAAhB,KAAA,EACmB;AACnB,EAAA,IAAMu5C,GAAAA,GAAe1xC,GAAAA,KAAY,OAAA,GAAUxH,EAAAA,CAAE,QAAA,GAAWwH,GAAAA,KAAY,UAAA,GAAaxH,EAAAA,CAAE,WAAA,GAAc,EAAA,EAI3Fm5C,GAAAA,GAA+B3xC,GAAAA,KAAY,SAAA,GAAY,OAAA,GAAU,QAAA,EACjErE,GAAAA,GAAWi2C,GAAAA,IAAUD,GAAAA,EACrBE,GAAAA,GACJl2C,GAAAA,KAAag2C,GAAAA,GAAY,EAAA,GAAKh2C,GAAAA,KAAa,QAAA,GAAWnD,EAAAA,CAAE,SAAA,GAAYA,EAAAA,CAAE,QAAA,EAClE0F,MAAM2yC,EAAAA,CACV;IAACr4C,EAAAA,CAAE,GAAA;AAAKk5C,IAAAA,GAAAA;AAAcG,IAAAA,GAAAA;AAAa7iC,IAAAA,GAAAA,IAAQxW,EAAAA,CAAE,IAAA;AAAMs5C,IAAAA,GAAAA,IAAQt5C,EAAAA,CAAE,OAAA;AAASu5C,IAAAA,GAAAA,KAAW,YAAYv5C,EAAAA,CAAE;AAAS,GAAA,CACrG,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,EACX;IAAE,OAAA,EAAAE,GAAAA;IAAS,KAAA,EAAAC;GAAM,EACjB+D,GACF,CAAA,EAIMs1C,GAAAA,GAAWr2C,GAAAA,KAAa,QAAA,IAAYs2C,OAAW,IAAA,EAC/Cp4B,GAAAA,mBACJ0B,IAAAA,CAAC,MAAA,EAAD;AAAM,IAAA,SAAA,EAAW/iB,EAAAA,CAAE,QAAA;IAAnB,QAAA,EAAA;MACG05C,GAAAA,mBACC52B,IAAC62B,EAAAA,EAAD;AAAY,QAAA,IAAA,EAAML,GAAAA,IAAQ,KAAA;QAAc,KAAA,EAAAx6C,GAAAA;QAAO,QAAA,EAAU46C;AAAe,OAAA,CAAA,GAExEl5C,GAAAA;MAEDinC,GAAAA,mBAAc3kB,IAAC82B,EAAAA,EAAD;QAAwB,KAAA,EAAA96C,GAAAA;QAAoB,WAAA,EAAA2E;AAAc,OAAA,CAAA,GAAI,IAAA;AAC5Eg2C,MAAAA,GAAAA,IAAW,IAAA,IAAQ,CAACD,GAAAA,oBAAY12B,IAAC,IAAA,EAAD;AAAI,QAAA,SAAA,EAAW9iB,EAAAA,CAAE,OAAA;QAAU,QAAA,EAAAy5C;OAAY;AACpE;MAEFI,GAAAA,GAAOL,GAAAA,mBAAW12B,GAAAA,CAAC,IAAA,EAAD;AAAI,IAAA,SAAA,EAAW,CAAA,EAAG9iB,EAAAA,CAAE,OAAA,CAAA,CAAA,EAAWA,GAAE,YAAA,CAAA,CAAA;IAAiB,QAAA,EAAAy5C;AAAY,GAAA,CAAA,GAAI,IAAA;AAC1F,EAAA,OAAOj0C,GAAAA,mBACLud,IAAAA,CAAC,KAAA,EAAD;IAAK,SAAA,EAAWrd,GAAAA;IAAhB,QAAA,EAAA;AACG2b,MAAAA,GAAAA;AACAhd,MAAAA,GAAAA;AACAw1C,MAAAA;AACE;GAEL,CAAA,mBAAA92B,IAAAA,CAAC,OAAA,EAAD;IAAO,SAAA,EAAWrd,GAAAA;IAAc,OAAA,EAAA1F,GAAAA;IAAhC,QAAA,EAAA;AACGqhB,MAAAA,GAAAA;AACAhd,MAAAA,GAAAA;AACAw1C,MAAAA;AACI;;AAEX;AAQA,SAASF,EAAAA,CAAW,EAClB,IAAA,EAAA76C,GAAAA,EACA,OAAAe,GAAAA,EACA,QAAA,EAAA4D,KAAA,EAKC;AACD,EAAA,IAAMlE,GAAAA,GAAO,OAAOiB,GAAAA,IAAU,QAAA,GAAWA,MAAQ,cAAA,EAC3Cs5C,GAAAA,GAAAA,CAAUj6C,GAAAA,KAAmE;AAEjFf,IAAAA,GAAAA,CAAE,gBAAe,EACjBA,GAAAA,CAAE,iBAAgB,EAClB0kC,GAAAA,CAAS,CAAC8V,GAAI,CAAA;AAChB,EAAA,CAAA;AACA,EAAA,uBAGEx2B,IAAC,MAAA,EAAD;IACE,IAAA,EAAK,QAAA;IACL,QAAA,EAAU,CAAA;AACV,IAAA,SAAA,EAAW9iB,EAAAA,CAAE,UAAA;AACb,IAAA,cAAA,EAAc,CAACs5C,GAAAA;AACf,IAAA,YAAA,EAAY,OAAO/5C,GAAAA,CAAAA,CAAAA;IACnB,OAAA,EAASu6C,GAAAA;AACT,IAAA,SAAA,EAAA,CAAYh7C,GAAAA,KAAM;AAGhB,MAAA,CAAIA,IAAE,GAAA,KAAQ,OAAA,IAAWA,IAAE,GAAA,KAAQ,GAAA,KAAKg7C,IAAOh7C,GAAC,CAAA;AAClD,IAAA,CAAA;IACA,WAAA,EAAA,CAAcA,GAAAA,KAAMA,GAAAA,CAAE,eAAA,EAAgB;IAErC,QAAA,EAAA0B;GACG,CAAA;AAEV;AAIA,SAASo5C,GAAgB,EAAE,KAAA,EAAA96C,GAAAA,EAAO,WAAA,EAAAwE,KAAA,EAA0D;AAC1F,EAAA,IAAM/D,GAAAA,GAAO,OAAOiB,GAAAA,IAAU,QAAA,GAAWA,GAAAA,GAAQ,cAAA;AACjD,EAAA,uBACEuiB,IAAAA,CAAC1f,EAAAA,EAAD,EAAA,QAAA,EAAA,iBACEyf,GAAAA,CAACzc,SAAAA,EAAD,EAAA,QAAA,kBACEyc,IAAC,QAAA,EAAD;IACE,IAAA,EAAK,QAAA;AACL,IAAA,SAAA,EAAW9iB,EAAAA,CAAE,IAAA;AACb,IAAA,YAAA,EAAY,SAAST,GAAAA,CAAAA,CAAAA;AACrB,IAAA,OAAA,EAAA,CAAUT,GAAAA,KAAM;AAEd,MAAAA,GAAAA,CAAE,cAAA,EAAe,EACjBA,GAAAA,CAAE,eAAA,EAAgB;AACpB,IAAA,CAAA;IACA,WAAA,EAAA,CAAcA,GAAAA,KAAMA,GAAAA,CAAE,eAAA,EAAgB;IACvC,QAAA,EAAA;AAEO,GAAA,CAAA,EACC,CAAA,kBACXgkB,GAAAA,CAACnf,EAAAA,EAAD,EAAA,QAAA,EAAU8jC,GAAAA,EAAqB,CACjB,CAAA,EAAA,CAAA;AAEpB;AC/FA,SAAgBsS,GAAyCj7C,GAAAA,EAA8B;AACrF,EAAA,IAAM,EACJ,KAAA,EAAAe,GAAAA,EACA,OAAA,EAAA4D,GAAAA,EACA,WAAA,EAAAH,GAAAA,EACA,MAAA,EAAAvD,GAAAA,EACA,IAAA,EAAAwF,GAAAA,EACA,OAAA,EAAAkC,KACA,KAAA,EAAAzH,GAAAA,EACA,IAAA,EAAAjB,GAAAA,EACA,YAAA,EAAAkB,GAAAA,EACA,YAAA,EAAAC,GAAAA,EACA,gBAAA,EAAAC,GAAAA,EACA,GAAG65C,GAAAA,EAAAA,GACDx2C,GAAAA,EACE6lB,GAAAA,GAAK9gB,KAAAA,IAGLsgB,GAAAA,GAAU;IACd,GAAGmxB,GAAAA;IACH,IAAA,EAAMA,GAAAA,CAAM,IAAA,IAAQC,EAAAA,CAAOz5C,GAAK,CAAA;IAChC,SAAA,EAAW05C,GAAAA;IACX,EAAA,EAAAv5C;GACF,EACMw5C,GAAAA,GAAStxB,IAAQ,MAAA,KAAW,QAAA,EAC5B1E,MAAQi2B,EAAAA,CAASvxB,GAAO,GAExB2B,GAAAA,GAAM;IACV,KAAA,EAAA3qB,GAAAA;IACA,WAAA,EAAAyD,GAAAA;IACA,MAAA,EAAAvD,GAAAA;IACA,IAAA,EAAAwF,GAAAA;IACA,OAAA,EAAAkC,GAAAA;IACA,KAAA,EAAAzH,GAAAA;IACA,IAAA,EAAAjB,GAAAA;IACA,YAAA,EAAAkB,GAAAA;IACA,SAAA,EAAW0uB,GAAAA;AACX,IAAA,MAAA,EAAQ9F,GAAAA,CAAQ,MAAA;AAChB,IAAA,OAAA,EAAS1E,GAAAA,CAAM,OAAA;AACf,IAAA,KAAA,EAAOA,GAAAA,CAAM,KAAA;AAGb,IAAA,OAAA,EAASA,IAAM,KAAA,IAASg2B,GAAAA,IAAUtxB,GAAAA,CAAQ,IAAA,KAAS,gBAAgB,MAAA,GAAYQ;AACjF,GAAA;AASA,EAAA,OAPIR,GAAAA,CAAQ,SAAS,QAAA,IAAYA,GAAAA,CAAQ,YAAY,QAAA,mBAEjD/F,IAACm2B,EAAAA,EAAD;IAAa,GAAIzuB,GAAAA;IAAK,OAAA,EAAS6vB,EAAAA,CAAaZ,GAAO,CAAA,oBAAK32B,IAACw3B,EAAAA,EAAD,EAAe,GAAIzxB,GAAAA,EAAU,CAAA;AACnF,IAAA,QAAA,kBAAA/F,GAAAA,CAACy3B,EAAAA,EAAD,EAAa,GAAI1xB,KAAU;GAChB,CAAA,mBAIf/F,GAAAA,CAACm2B,EAAAA,EAAD;IAAa,GAAIzuB,GAAAA;IAAc,OAAA,EAAA/mB,GAAAA;AAC7B,IAAA,QAAA,kBAAAqf,GAAAA,CAAC03B,EAAAA,EAAD,EAAa,GAAI3xB,KAAU;GAChB,CAAA;AAEjB;AAUA,SAAgB4xB,GAA2C37C,GAAAA,EAAgC;AACzF,EAAA,IAAM0E,GAAAA,GAAQynC,GAAAA;AAWd,EAAA,OAVIznC,GAAAA,CAAM,SAAS,QAAA,IAAYA,GAAAA,CAAM,YAAY,QAAA,mBAE7Cuf,IAAAA,CAAAhf,QAAAA,EAAA,EAAA,QAAA,EAAA,iBACE+e,GAAAA,CAACy3B,IAAD,EAAa,GAAI/2C,KAAQ,CAAA,kBACzBsf,GAAAA,CAAC,MAAA,EAAD;AAAM,IAAA,SAAA,EAAW9iB,EAAAA,CAAE,WAAA;AACjB,IAAA,QAAA,kBAAA8iB,GAAAA,CAACw3B,EAAAA,EAAD,EAAe,GAAI92C,KAAQ;GACvB,CACN,CAAA,EAAA,CAAA,mBAGCsf,IAAC03B,EAAAA,EAAD,EAAa,GAAIh3C,GAAAA,EAAQ,CAAA;AAClC;AAGA,SAAS42C,GAASt7C,GAAAA,EAAkF;AAClG,EAAA,QAAQ6B,IAAE,IAAA;IACR,KAAK,SAAA;AAGH,MAAA,OAAO;QAAE,OAAA,EAAS,UAAA;AAAY,QAAA,KAAA,EAAOA,GAAAA,CAAE,OAAA,KAAY,QAAA,IAAYA,GAAAA,CAAE,OAAA,KAAY;AAAS,OAAA;IACxF,KAAK,MAAA;AAGH,MAAA,OAAO;QAAE,OAAA,EAAS,SAAA;AAAW,QAAA,KAAA,EAAOA,GAAAA,CAAE,OAAA,KAAY,OAAA,IAAWA,GAAAA,CAAE,OAAA,KAAY;AAAS,OAAA;IACtF,KAAK,OAAA;AACH,MAAA,OAAO;QAAE,OAAA,EAAS,OAAA;QAAS,KAAA,EAAO;AAAM,OAAA;IAC1C,KAAK,OAAA;AACH,MAAA,OAAO;QAAE,OAAA,EAAS,SAAA;QAAW,KAAA,EAAO;AAAK,OAAA;AAC3C,IAAA;AACE,MAAA,OAAO;QAAE,OAAA,EAAS,SAAA;QAAW,KAAA,EAAO;AAAM,OAAA;AAC9C;AACF;AAEA,SAAS65C,GAAY17C,GAAAA,EAA6B;AAChD,EAAA,QAAQ0E,IAAM,IAAA;IACZ,KAAK,SAAA;AACH,MAAA,uBAAOsf,GAAAA,CAAC43B,EAAAA,EAAD,EAAgB,GAAIl3C,KAAQ,CAAA;IACrC,KAAK,QAAA;AACH,MAAA,uBAAOsf,GAAAA,CAAC63B,GAAAA,EAAD,EAAa,GAAIn3C,KAAQ,CAAA;IAClC,KAAK,QAAA;AACH,MAAA,uBAAOsf,GAAAA,CAAC83B,GAAAA,EAAD,EAAe,GAAIp3C,KAAQ,CAAA;IACpC,KAAK,MAAA;AACH,MAAA,uBAAOsf,GAAAA,CAAC+3B,GAAAA,EAAD,EAAa,GAAIr3C,KAAQ,CAAA;IAClC,KAAK,OAAA;AACH,MAAA,uBAAOsf,GAAAA,CAACg4B,GAAAA,EAAD,EAAc,GAAIt3C,KAAQ,CAAA;IACnC,KAAK,OAAA;AACH,MAAA,uBAAOsf,GAAAA,CAACi4B,GAAAA,EAAD,EAAc,GAAIv3C,KAAQ,CAAA;IACnC,KAAK,aAAA;AACH,MAAA,uBACEsf,IAAC2xB,GAAAA,EAAD;AACE,QAAA,SAAA,EAAWjxC,GAAAA,CAAM,SAAA;QACjB,KAAA,EAAOA,GAAAA,CAAM,KAAA,GAAQ,MAAA,GAAYA,GAAAA,CAAM,KAAA;AACvC,QAAA,KAAA,EAAOA,GAAAA,CAAM,KAAA;AACb,QAAA,QAAA,EAAUA,GAAAA,CAAM,QAAA;AAChB,QAAA,MAAA,EAAQA,GAAAA,CAAM,MAAA;AACd,QAAA,SAAA,EAAWA,GAAAA,CAAM,SAAA;AACjB,QAAA,YAAA,EAAYA,GAAAA,CAAM;OACnB,CAAA;AAEL,IAAA;AAIE,MAAA,MAAU,KAAA,CAAM,CAAA,sCAAA,EAA0Cw3C,GAAAA,CAAiC,IAAA,CAAA,CAAA,CAAO,CAAA;AAEtG;AACF;AAMA,SAASC,EAAAA,CAAO,EAAE,KAAA,EAAAn8C,GAAAA,EAAO,OAAAe,GAAAA,EAAO,QAAA,EAAA4D,KAAA,EAAuE;AAErG,EAAA,OADI,CAACyoC,GAAAA,IAAS,CAAC2L,GAAAA,mBAAc/0B,GAAAA,CAAA/e,QAAAA,EAAA,EAAG,QAAA,EAAAN,GAAAA,EAAW,CAAA,mBAEzCqf,IAAC,MAAA,EAAD;AAAM,IAAA,SAAA,EAAW9iB,EAAAA,CAAE,MAAA;AAAQ,IAAA,KAAA,EAAOksC,MAAQ,OAAA,GAAU,SAAA;IACjD,QAAA,EAAAzoC;GACG,CAAA;AAEV;AAEA,SAASi3C,GAAe57C,GAAAA,EAA8B;AACpD,EAAA,IAAMo8C,GAAAA,GAAK,CAACv6C,GAAAA,CAAE,KAAA,IAASA,IAAE,KAAA,KAAU,IAAA,EAC7BiH,GAAAA,GAAMY,MAAAA,CAAyB,IAAI,CAAA;AAIzC,EAAA,IAHAmrB,UAAAA,MAAgB;AACV/rB,IAAAA,IAAI,OAAA,KAASnE,GAAAA,CAAI,OAAA,CAAQ,aAAA,GAAgB9C,IAAE,KAAA,KAAU,IAAA,CAAA;AAC3D,EAAA,CAAC,GACGA,GAAAA,CAAE,OAAA,KAAY,UAIhB,uBACEmiB,IAACipB,GAAAA,EAAD;IACE,IAAA,EAAK,UAAA;IACL,IAAA,EAAK,IAAA;IACL,OAAA,EAAQ,MAAA;AACR,IAAA,SAAA,EAAWprC,GAAAA,CAAE,SAAA;AACb,IAAA,SAAA,EAAWA,GAAAA,CAAE,IAAA;AACb,IAAA,KAAA,EAAO,CAAC;MAAE,KAAA,EAAO,IAAA;AAAK,MAAA,KAAA,EAAOA,IAAE,KAAA,IAASA,GAAAA,CAAE,IAAA,EAAM,KAAA,CAAM,GAAG,CAAC,CAAA;AAAG,MAAA,SAAA,EAAWA,GAAAA,CAAE;KAAM,CAAA;AAChF,IAAA,KAAA,EAAOu6C,GAAAA,GAAK,CAAC,IAAG,CAAA,GAAI,EAAC;AACrB,IAAA,WAAA,EAAav6C,GAAAA,CAAE,KAAA,GAAQ,CAAC,IAAG,IAAI,EAAC;AAChC,IAAA,QAAA,EAAA,CAAWd,GAAAA,KAASc,GAAAA,CAAE,SAASuJ,GAAAA,CAAK,QAAA,CAAS,IAAG,CAAC;GAClD,CAAA;AAGL,EAAA,IAAIvJ,IAAE,OAAA,KAAY,QAAA,EAChB,uBACEmiB,IAACm4B,EAAAA,EAAD;AAAQ,IAAA,KAAA,EAAOt6C,GAAAA,CAAE,KAAA;AAAO,IAAA,KAAA,EAAOA,GAAAA,CAAE,KAAA;IAC/B,QAAA,kBAAAmiB,IAACoxB,GAAAA,EAAD;AAAQ,MAAA,SAAA,EAAWvzC,GAAAA,CAAE,SAAA;MAAW,UAAA,EAAYu6C,GAAAA;AAAI,MAAA,QAAA,EAAUv6C,GAAAA,CAAE,QAAA;AAAU,MAAA,YAAA,EAAYA,GAAAA,CAAE;KAAO;GACrF,CAAA;AAGZ,EAAA,IAAMkoB,MACJloB,GAAAA,CAAE,MAAA,KAAW,QAAA,mBACXmiB,IAACgjB,GAAAA,EAAD;AACE,IAAA,SAAA,EAAWnlC,GAAAA,CAAE,SAAA;IACb,UAAA,EAAYu6C,GAAAA;AACZ,IAAA,eAAA,EAAiBv6C,GAAAA,CAAE,KAAA;AACnB,IAAA,QAAA,EAAUA,GAAAA,CAAE,QAAA;AACZ,IAAA,YAAA,EAAYA,GAAAA,CAAE;GACf,CAAA,mBAEDmiB,GAAAA,CAAC,OAAA,EAAD;IACE,GAAA,EAAKlb,GAAAA;AACL,IAAA,EAAA,EAAIjH,GAAAA,CAAE,EAAA;IACN,IAAA,EAAK,UAAA;AACL,IAAA,SAAA,EAAWA,GAAAA,CAAE,SAAA;AACb,IAAA,YAAA,EAAYA,GAAAA,CAAE,IAAA;IACd,OAAA,EAASu6C,GAAAA;AACT,IAAA,QAAA,EAAA,CAAWr7C,GAAAA,KAAMc,GAAAA,CAAE,QAAA,CAAS7B,GAAAA,CAAE,OAAO,OAAO;GAC7C,CAAA;AAEL,EAAA,uBAAOgkB,IAACm4B,EAAAA,EAAD;AAAQ,IAAA,KAAA,EAAOt6C,GAAAA,CAAE,KAAA;IAAQ,QAAA,EAAAkoB;GAAgB,CAAA;AAClD;AAYA,SAASsyB,GACPr8C,GAAAA,EACoC;AACpC,EAAA,IAAMmJ,MAAMO,MAAAA,CAAyB,IAAI,CAAA,EACnC4yC,GAAAA,GAAS5yC,OAAOuiC,GAAM,CAAA;AAW5B,EAAA,OAVApX,UAAAA,MAAgB;AACd,IAAAlwB,IAAO,OAAA,GAAUsnC,GAAAA;EACnB,CAAC,CAAA,EACDpX,UAAAA,MAAgB;AACd,IAAA,IAAM5rB,MAAKE,GAAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAACF,GAAAA,EAAI;AACT,IAAA,IAAMszC,GAAAA,GAAAA,MAAiBD,GAAAA,CAAO,OAAA,GAAUrzC,IAAG,KAAK,CAAA;AAEhD,IAAA,OADAA,GAAAA,CAAG,iBAAiB,QAAA,EAAUszC,GAAQ,GAAA,MACzBtzC,GAAAA,CAAG,mBAAA,CAAoB,QAAA,EAAUszC,GAAQ,CAAA;EACxD,CAAA,EAAG,EAAE,CAAA,EACEpzC,GAAAA;AACT;AAEA,SAASqzC,EAAAA,CAAWx8C,KAAiBe,GAAAA,EAA8B;AAEjE,EAAA,OADI07C,GAAAA,IAAQ,OAAa,IAAA,GAClB,OAAOA,OAAS,QAAA,mBAAWz4B,IAAC,MAAA,EAAD;IAAiB,SAAA,EAAAjjB,GAAAA;IAAY,QAAA,EAAA07C;AAAW,GAAA,CAAA,GAAIA,GAAAA;AAChF;AAEA,SAASZ,IAAY77C,GAAAA,EAA6B;AAChD,EAAA,IAAM81B,GAAAA,GAAOj0B,GAAAA,CAAE,OAAA,IAAWA,GAAAA,CAAE,QAAA,EACtBq5C,MAAQmB,EAAAA,CACZx6C,GAAAA,CAAE,OAAA,KAAA,CACEd,GAAAA,KAAQ;AACR,IAAA,IAAI0qB,QAAQ,EAAA,EAAI;AAChB,IAAA,IAAM9mB,GAAAA,GAAI,OAAO8mB,GAAG,CAAA;AAChB,IAAA,MAAA,CAAO,QAAA,CAAS9mB,GAAC,CAAA,IAAG9C,GAAAA,CAAE,SAAS8C,GAAC,CAAA;AACtC,EAAA,CAAA,CACJ,GACM+3C,GAAAA,GAAQ,CAAC76C,IAAE,KAAA,IAAS,OAAOA,IAAE,KAAA,IAAU,QAAA,IAAY,MAAA,CAAO,QAAA,CAASA,IAAE,KAAK,CAAA,EAC1E0mC,MAAc1mC,GAAAA,CAAE,KAAA,GAAQ,UAAUA,GAAAA,CAAE,WAAA;AAE1C,EAAA,IAAIA,GAAAA,CAAE,WAAW,QAAA,EAAU;AACzB,IAAA,IAAMoqC,GAAAA,GAAAA,CAAUlrC,GAAAA,KAAc;AAEvB,MAAA,MAAA,CAAO,KAAA,CAAM4D,GAAC,CAAA,IAAG9C,GAAAA,CAAE,SAAS8C,GAAC,CAAA;IACpC,CAAA,EACM4uB,GAAAA,GAAQmpB,GAAAA,GAAS76C,GAAAA,CAAE,KAAA,GAAmB,GAAA,EACtC86C,MAAQ96C,GAAAA,CAAE,OAAA,mBACdmiB,GAAAA,CAAC0nB,EAAAA,EAAD;AACE,MAAA,SAAA,EAAW7pC,GAAAA,CAAE,SAAA;MACN,KAAA,EAAA8C,GAAAA;MACM,WAAA,EAAA1D,GAAAA;AACb,MAAA,QAAA,EAAUY,GAAAA,CAAE,GAAA;AACZ,MAAA,QAAA,EAAUA,GAAAA,CAAE,GAAA;AACZ,MAAA,IAAA,EAAMA,GAAAA,CAAE,IAAA;AACR,MAAA,OAAA,EAASA,GAAAA,CAAE,OAAA;AACX,MAAA,YAAA,EAAYA,GAAAA,CAAE,IAAA;MACd,QAAA,EAAUoqC;KACX,CAAA,mBAEDjoB,GAAAA,CAACqnB,EAAAA,EAAD;AACE,MAAA,SAAA,EAAWxpC,GAAAA,CAAE,SAAA;MACN,KAAA,EAAA8C,GAAAA;MACM,WAAA,EAAA1D,GAAAA;AACb,MAAA,QAAA,EAAUY,GAAAA,CAAE,GAAA;AACZ,MAAA,QAAA,EAAUA,GAAAA,CAAE,GAAA;AACZ,MAAA,IAAA,EAAMA,GAAAA,CAAE,IAAA;AACR,MAAA,YAAA,EAAcA,IAAE,QAAA,KAAa,KAAA;AAC7B,MAAA,YAAA,EAAYA,GAAAA,CAAE,IAAA;MACd,QAAA,EAAUoqC;KACX,CAAA;AAGH,IAAA,OADIpqC,GAAAA,CAAE,IAAA,IAAQ,IAAA,GAAa86C,GAAAA,mBAEzB14B,IAAAA,CAAAhf,QAAAA,EAAA,EAAA,QAAA,EAAA,CACG03C,GAAAA,kBACD34B,IAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAW9iB,EAAAA,CAAE,UAAA;MAAY,aAAA,EAAY,MAAA;AACxC,MAAA,QAAA,EAAAW,GAAAA,CAAE;KACC,CACN,GAAA,CAAA;AAEN,EAAA;AAEA,EAAA,IAAM86C,GAAAA,mBACJ34B,GAAAA,CAAC,OAAA,EAAD;IACE,GAAA,EAAKk3B,GAAAA;AACL,IAAA,EAAA,EAAIr5C,GAAAA,CAAE,EAAA;IACN,IAAA,EAAK,QAAA;AACL,IAAA,SAAA,EAAWA,GAAAA,CAAE,SAAA;AACb,IAAA,YAAA,EAAYA,GAAAA,CAAE,IAAA;IACd,KAAA,EAAO66C,GAAAA,GAAS76C,IAAE,KAAA,GAAmB,EAAA;AACrC,IAAA,GAAA,EAAKA,GAAAA,CAAE,GAAA;AACP,IAAA,GAAA,EAAKA,GAAAA,CAAE,GAAA;AACP,IAAA,IAAA,EAAMA,GAAAA,CAAE,IAAA;IACK,WAAA,EAAAZ,GAAAA;AACb,IAAA,QAAA,EAAA,CAAWjB,GAAAA,KAAM;AACf,MAAA,IAAMyrB,GAAAA,GAAMzrB,IAAE,MAAA,CAAO,KAAA;AACrB,MAAA,IAAIyrB,QAAQ,EAAA,EAAI;AAChB,MAAA,IAAM9mB,GAAAA,GAAI,OAAO8mB,GAAG,CAAA;AAChB,MAAA,MAAA,CAAO,QAAA,CAAS9mB,GAAC,CAAA,IAAGmxB,GAAAA,CAAKnxB,GAAC,CAAA;AAChC,IAAA;GACD,CAAA;AAGH,EAAA,OADI9C,IAAE,IAAA,IAAQ,IAAA,GAAa86C,GAAAA,mBAEzB14B,KAAC,MAAA,EAAD;AAAM,IAAA,SAAA,EAAW/iB,EAAAA,CAAE,cAAA;AAAnB,IAAA,QAAA,EAAA,CACGy7C,GAAAA,EACAH,EAAAA,CAAW36C,IAAE,IAAA,EAAMX,EAAAA,CAAE,WAAW,CAC7B;;AAEV;AAGA,SAAS07C,GAAa58C,GAAAA,EAAyE;AAC7F,EAAA,OAAO;AAAE,IAAA,GAAA,EAAK6B,IAAE,GAAA,IAAO,CAAA;AAAG,IAAA,GAAA,EAAKA,IAAE,GAAA,IAAO,GAAA;AAAK,IAAA,IAAA,EAAMA,IAAE,IAAA,IAAQ;AAAE,GAAA;AACjE;AAEA,SAAS45C,GAAY16C,GAAAA,EAA6B;AAChD,EAAA,IAAM,EAAE,GAAA,EAAA4D,GAAAA,EAAK,GAAA,EAAAH,GAAAA,EAAK,IAAA,EAAAvD,GAAAA,EAAA,GAAS27C,EAAAA,CAAa/6C,GAAC,CAAA,EACnCi0B,GAAAA,GAAOj0B,GAAAA,CAAE,OAAA,IAAWA,GAAAA,CAAE,QAAA,EACtBoqC,GAAAA,GAASpqC,GAAAA,CAAE,OAAA,GAAUA,GAAAA,CAAE,QAAA,GAAW,MAAA,EAClCkZ,GAAAA,GAAQshC,EAAAA,CAAkBpQ,GAAAA,KAAAA,CAAYjsC,GAAAA,KAAQisC,GAAAA,CAAO,MAAA,CAAOxgB,GAAG,CAAC,CAAA,CAAE,CAAA,EAIlE8H,GAAAA,GAHQ,CAAC1xB,GAAAA,CAAE,KAAA,IAAS,OAAOA,GAAAA,CAAE,KAAA,IAAU,QAAA,IAAY,MAAA,CAAO,QAAA,CAASA,GAAAA,CAAE,KAAK,CAAA,GAG1D,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAIA,GAAAA,CAAE,KAAA,EAAiB8rC,GAAG,CAAA,EAAGM,GAAG,CAAA,GAAIN,GAAAA,EAClEjJ,GAAAA,GAAAA,CAAY//B,GAAAA,KAAgB;AAChC,IAAA,IAAM9E,GAAAA,GAAI,OAAO4rB,GAAG,CAAA;AACpBtrB,IAAAA,CAAAA,CAAK,kBAAkB,QAAA,EAAU;AAAE,MAAA,IAAA,EAAM0B,GAAAA,CAAE,IAAA;MAAM,KAAA,EAAOhC;KAAG,CAAA,EAC3Di2B,IAAKj2B,GAAC,CAAA;AACR,EAAA,CAAA;AAgBA,EAAA,OAfIgC,GAAAA,CAAE,MAAA,KAAW,QAAA,mBAEbmiB,IAACiuB,GAAAA,EAAD;IACE,GAAA,EAAKl3B,GAAAA;AACL,IAAA,SAAA,EAAWlZ,GAAAA,CAAE,SAAA;AACb,IAAA,YAAA,EAAYA,GAAAA,CAAE,IAAA;IACT,GAAA,EAAA8C,GAAAA;IACA,GAAA,EAAAH,GAAAA;IACC,IAAA,EAAAvD,GAAAA;IACC,KAAA,EAAAG,GAAAA;AACP,IAAA,QAAA,EAAUS,GAAAA,CAAE,KAAA;AACZ,IAAA,QAAA,EAAA,CAAW7B,GAAAA,KAAM0kC,GAAAA,CAAS1kC,GAAAA,CAAE,OAAO,KAAK;GACzC,CAAA,mBAIHgkB,GAAAA,CAAC,OAAA,EAAD;IACE,GAAA,EAAKjJ,GAAAA;AACL,IAAA,EAAA,EAAIlZ,GAAAA,CAAE,EAAA;IACN,IAAA,EAAK,OAAA;AACL,IAAA,YAAA,EAAYA,GAAAA,CAAE,IAAA;IACd,SAAA,EAAWA,GAAAA,CAAE,YAAY,CAAA,EAAGqwC,GAAAA,CAAO,KAAA,CAAA,CAAA,EAASrwC,GAAAA,CAAE,SAAA,CAAA,CAAA,GAAcqwC,GAAAA,CAAO,KAAA;IAGnE,QAAA,EAAU,EAAA;IACL,GAAA,EAAAvtC,GAAAA;IACA,GAAA,EAAAH,GAAAA;IACC,IAAA,EAAAvD,GAAAA;IACC,KAAA,EAAAG,GAAAA;AACP,IAAA,QAAA,EAAUS,GAAAA,CAAE,KAAA;AACZ,IAAA,QAAA,EAAA,CAAW7B,GAAAA,KAAM0kC,GAAAA,CAAS1kC,GAAAA,CAAE,OAAO,KAAK;GACzC,CAAA;AAEL;AAEA,SAASw7C,GAAcx7C,GAAAA,EAA6B;AAClD,EAAA,IAAM,EAAE,KAAAe,GAAAA,EAAK,GAAA,EAAA4D,KAAK,IAAA,EAAAH,GAAAA,EAAA,GAASo4C,EAAAA,CAAa/6C,GAAC,CAAA;AAEzC,EAAA,IADeA,GAAAA,CAAE,SAAS,OAAOA,GAAAA,CAAE,SAAU,QAAA,IAAY,CAAA,OAAO,QAAA,CAASA,GAAAA,CAAE,KAAK,CAAA,EACpE,uBAAOmiB,GAAAA,CAAA/e,QAAAA,EAAA,EAAA,QAAA,EAAGs2C,EAAAA,CAAa,QAAG,CAAA,EAAI,CAAA;AAE1C,EAAA,IAAMroB,GAAAA,GAAWxoB,GAAAA,IAAQ,CAAA,GAAI,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,IAAA,CAAK,CAAC,IAAA,CAAK,MAAMA,GAAI,CAAC,CAAC,CAAC,GAChFupB,GAAAA,GACJpyB,GAAAA,CAAE,MAAA,KACDA,GAAAA,CAAE,aAAa,SAAA,GAAA,CACX7B,GAAAA,KAAc+lC,GAAAA,CAAcphC,KAAGuuB,GAAQ,CAAA,GAAA,CACvClzB,GAAAA,KACC6lC,IAAalhC,GAAAA,EAAG;IACd,WAAA,EAAa,KAAA;IACb,qBAAA,EAAuBuuB,GAAAA;IACvB,qBAAA,EAAuBA;GACxB,CAAA,CAAA;AACT,EAAA,uBACElP,IAAC64B,GAAAA,EAAD;AACE,IAAA,IAAA,EAAMh7C,GAAAA,CAAE,IAAA;AACR,IAAA,KAAA,EAAOA,GAAAA,CAAE,KAAA;IACJ,GAAA,EAAAd,GAAAA;IACA,GAAA,EAAA4D,GAAAA;IACG,MAAA,EAAAzD,GAAAA;AACR,IAAA,IAAA,EAAMW,GAAAA,CAAE,IAAA;AACR,IAAA,QAAA,EAAA,CAAWd,GAAAA,KAAS;AAClBc,MAAAA,IAAE,OAAA,GAAUuJ,GAAI,CAAA,EAChBvJ,GAAAA,CAAE,SAASuJ,GAAI,CAAA;AACjB,IAAA;GACD,CAAA;AAEL;AAYA,SAASmwC,GAAav7C,GAAAA,EAA+B;AAEnD,EAAA,OADI,OAAO26C,OAAY,QAAA,IAAY,OAAOA,OAAY,QAAA,GAAiBA,GAAAA,mBAErE32B,GAAAA,CAAC,MAAA,EAAD;AAAM,IAAA,SAAA,EAAW9iB,EAAAA,CAAE,YAAA;IACjB,QAAA,kBAAA8iB,IAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAW9iB,EAAAA,CAAE,WAAA;MAAc,QAAA,EAAAy5C;KAAc;GAC3C,CAAA;AAEV;AAiBA,SAASkC,IAAgB,EAAE,IAAA,EAAA78C,GAAAA,EAAM,KAAA,EAAAe,KAAO,GAAA,EAAA4D,GAAAA,EAAK,GAAA,EAAAH,GAAAA,EAAK,QAAAiC,GAAAA,EAAQ,IAAA,EAAAkC,GAAAA,EAAM,QAAA,EAAAzH,KAAA,EAAkC;AAGhG,EAAA,IAAM,CAACyqC,KAAOC,GAAAA,CAAAA,GAAY1nC,SAAwB,IAAI,CAAA,EAChDovB,GAAAA,GAAAA,CAAQtzB,GAAAA,KAAc;AAC1B,IAAA,IAAM88C,GAAAA,GAAY7oB,IAAOtvB,GAAC,CAAA;AAC1B,IAAA,OAAO,OAAOm4C,GAAAA,IAAc,QAAA,GAAWA,GAAAA,GAAY,OAAOA,GAAS,CAAA;EACrE,CAAA,EACMC,GAAAA,GAAepR,GAAAA,KAAU,IAAA,GAAerY,GAAAA,CAAKC,GAAK,IAAlBoY,GAAAA,EAEhCqR,GAAAA,GAAM,EAAE,4BAAA,EAA8B,CAAA,EAAG,IAAA,CAAK,IAAI1pB,GAAAA,CAAKqa,GAAG,CAAA,CAAE,MAAA,EAAQra,GAAAA,CAAK2a,GAAG,CAAA,CAAE,MAAM,CAAA,CAAA,EAAA,CAAA,EAAM,EAE1FhC,GAAAA,GAAAA,MAAe;AACnB,IAAA,IAAIN,QAAU,IAAA,EAAM;AAClB,MAAA,IAAMhnC,GAAAA,GAAIqhC,IAAY2F,GAAK,CAAA;AACvB,MAAA,MAAA,CAAO,QAAA,CAAShnC,GAAC,CAAA,IAAG43C,GAAAA,CAAS,IAAA,CAAK,GAAA,CAAItO,GAAAA,EAAK,IAAA,CAAK,GAAA,CAAIN,GAAAA,EAAKhpC,GAAC,CAAC,CAAC,CAAA;AAClE,IAAA;AACA,IAAAxD,IAAS,IAAI,CAAA;AACf,EAAA,CAAA;AAEA,EAAA,uBACE8iB,KAAC,MAAA,EAAD;AAAM,IAAA,SAAA,EAAW/iB,EAAAA,CAAE,YAAA;IAAnB,QAAA,EAAA,iBACE8iB,GAAAA,CAAC,OAAA,EAAD;MACE,IAAA,EAAK,MAAA;MACL,YAAA,EAAYvjB,GAAAA;MACZ,SAAA,EAAU,SAAA;AACV,MAAA,SAAA,EAAWS,EAAAA,CAAE,YAAA;MACb,KAAA,EAAO87C,GAAAA;MACP,KAAA,EAAOD,GAAAA;AACP,MAAA,OAAA,EAAA,CAAU/8C,GAAAA,KAAM;AACd4rC,QAAAA,IAAStY,GAAAA,CAAKC,GAAK,CAAC,CAAA,EACpBvzB,GAAAA,CAAE,cAAc,MAAA,EAAO;AACzB,MAAA,CAAA;MACA,QAAA,EAAA,CAAWA,QAAM4rC,GAAAA,CAAS5rC,GAAAA,CAAE,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,QAAG,CAAC,CAAA;MAC3D,MAAA,EAAQisC,GAAAA;AACR,MAAA,OAAA,EAAA,CAAUjsC,GAAAA,KAAM;AACd,QAAAA,GAAAA,CAAE,gBAAe,EACjBA,GAAAA,CAAE,iBAAgB,EAClBA,GAAAA,CAAE,cAAc,KAAA,EAAM;AACxB,MAAA,CAAA;MACA,WAAA,EAAA,CAAcA,GAAAA,KAAMA,GAAAA,CAAE,eAAA,EAAgB;AACtC,MAAA,SAAA,EAAA,CAAYA,GAAAA,KAAM;AACZ,QAAAA,IAAE,GAAA,KAAQ,OAAA,IACZisC,GAAAA,EAAO,EACPjsC,IAAE,aAAA,CAAc,IAAA,EAAK,IACZA,GAAAA,CAAE,QAAQ,QAAA,KACnB4rC,GAAAA,CAAS,IAAI,CAAA,EACb5rC,GAAAA,CAAE,cAAc,IAAA,EAAK,CAAA;AAEzB,MAAA;AACD,KAAA,CAAA,EACAw8C,EAAAA,CAAWC,GAAAA,EAAMv7C,EAAAA,CAAE,WAAW,CAC3B;;AAEV;AAQA,SAAS+7C,IAAYj9C,GAAAA,EAA6B;AAChD,EAAA,IAAM,CAAC2rC,GAAAA,EAAOC,GAAAA,CAAAA,GAAY1nC,QAAAA,CAAwB,IAAI,CAAA,EAChDqvB,GAAAA,GAAQ1xB,GAAAA,CAAE,KAAA,GAAQ,KAAMA,GAAAA,CAAE,KAAA,IAAS,EAAA,EACnCq7C,GAAAA,GAAWr7C,IAAE,OAAA,KAAY,MAAA;AAC/B,EAAA,OAAO;AACL,IAAA,KAAA,EAAO8pC,GAAAA,IAASpY,GAAAA;AAChB,IAAA,IAAA,EAAA,CAAOxyB,GAAAA,KAAiB;AACtB,MAAA,IAAI,CAACm8C,GAAAA,EAAU;AACb,QAAAl9C,GAAAA,CAAE,SAASoL,GAAI,CAAA;AACf,QAAA;AACF,MAAA;AACAwgC,MAAAA,GAAAA,CAASxgC,GAAI,CAAA,EACbvJ,GAAAA,CAAE,UAAUuJ,GAAI,CAAA;AAClB,IAAA,CAAA;AACA,IAAA,MAAA,EAAA,MAAc;AACRugC,MAAAA,GAAAA,KAAU,QAAQA,GAAAA,KAAUpY,GAAAA,IAAO1xB,IAAE,QAAA,CAAS8pC,GAAK,CAAA,EACvDC,GAAAA,CAAS,IAAI,CAAA;AACf,IAAA;AACF,GAAA;AACF;AAEA,SAASkQ,IAAc97C,GAAAA,EAA6B;AAClD,EAAA,IAAMm9C,GAAAA,GAAOF,GAAAA,CAAYp7C,GAAC,CAAA,EACpB0mC,GAAAA,GAAc1mC,GAAAA,CAAE,KAAA,GAAQ,OAAA,GAAUA,GAAAA,CAAE,WAAA,EACpCw8B,GAAAA,GAAAA,CAAat9B,GAAAA,KAAmD;AAChEf,IAAAA,GAAAA,CAAE,QAAQ,OAAA,IAAW6B,GAAAA,CAAE,YAAY,UAAA,IAAY7B,GAAAA,CAAE,cAAc,IAAA,EAAK;AAC1E,EAAA,CAAA;AA8BA,EAAA,OA7BI6B,GAAAA,CAAE,OAAA,KAAY,UAAA,mBAEdmiB,IAAC,UAAA,EAAD;AACE,IAAA,EAAA,EAAIniB,GAAAA,CAAE,EAAA;AACN,IAAA,SAAA,EAAW,CAACA,GAAAA,CAAE,MAAA,KAAW,QAAA,IAAYX,GAAE,QAAA,EAAUW,GAAAA,CAAE,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAC3F,IAAA,YAAA,EAAYA,GAAAA,CAAE,IAAA;AACd,IAAA,KAAA,EAAOs7C,GAAAA,CAAK,KAAA;IACC,WAAA,EAAAx4C,GAAAA;AACb,IAAA,SAAA,EAAW9C,GAAAA,CAAE,SAAA;IACb,IAAA,EAAM,CAAA;AACN,IAAA,QAAA,EAAA,CAAW7B,GAAAA,KAAMm9C,GAAAA,CAAK,IAAA,CAAKn9C,GAAAA,CAAE,OAAO,KAAK,CAAA;AACzC,IAAA,MAAA,EAAQm9C,GAAAA,CAAK;AACd,GAAA,IAGDt7C,GAAAA,CAAE,MAAA,KAAW,QAAA,mBAEbmiB,IAAC+mB,GAAAA,EAAD;AACE,IAAA,SAAA,EAAWlpC,GAAAA,CAAE,SAAA;AACb,IAAA,KAAA,EAAOs7C,GAAAA,CAAK,KAAA;IACC,WAAA,EAAAx4C,GAAAA;AACb,IAAA,SAAA,EAAW9C,GAAAA,CAAE,SAAA;AACb,IAAA,YAAA,EAAYA,GAAAA,CAAE,IAAA;AACd,IAAA,QAAA,EAAUs7C,GAAAA,CAAK,IAAA;AACf,IAAA,MAAA,EAAQA,GAAAA,CAAK,MAAA;IACF,SAAA,EAAA34C;GACZ,CAAA,mBAIHwf,GAAAA,CAAC,OAAA,EAAD;AACE,IAAA,EAAA,EAAIniB,GAAAA,CAAE,EAAA;IACN,IAAA,EAAK,MAAA;AACL,IAAA,SAAA,EAAWA,GAAAA,CAAE,SAAA;AACb,IAAA,YAAA,EAAYA,GAAAA,CAAE,IAAA;AACd,IAAA,KAAA,EAAOs7C,GAAAA,CAAK,KAAA;IACC,WAAA,EAAAx4C,GAAAA;AACb,IAAA,SAAA,EAAW9C,GAAAA,CAAE,SAAA;AACb,IAAA,QAAA,EAAA,CAAW7B,GAAAA,KAAMm9C,GAAAA,CAAK,IAAA,CAAKn9C,GAAAA,CAAE,OAAO,KAAK,CAAA;AACzC,IAAA,MAAA,EAAQm9C,GAAAA,CAAK,MAAA;IACF,SAAA,EAAA34C;GACZ,CAAA;AAEL;AAKA,SAAS22C,GAAOn7C,GAAAA,EAAsC;AACpD,EAAA,OAAO,OAAO0B,GAAAA,IAAU,QAAA,GAAWA,GAAAA,GAAQ,MAAA;AAC7C;AAEA,SAASq6C,IAAYh7C,GAAAA,EAA2B;AAE9C,EAAA,IAAMo4B,GAAAA,GADS,CAACt3B,GAAAA,CAAE,KAAA,IAASA,IAAE,OAAA,CAAQ,IAAA,CAAA,CAAM7B,GAAAA,KAAQo9C,IAAI,KAAA,KAAUv7C,GAAAA,CAAE,KAAK,CAAA,GAC9CA,IAAE,KAAA,GAAmB,IAAA;AAE/C,EAAA,IAAIA,GAAAA,CAAE,OAAA,KAAY,OAAA,IAAWA,GAAAA,CAAE,YAAY,QAAA,EAAU;AACnD,IAAA,IAAIA,GAAAA,CAAE,WAAW,QAAA,EAiBf,OAhBIA,IAAE,OAAA,KAAY,OAAA,mBAEdmiB,GAAAA,CAACgxB,GAAAA,EAAD;AACE,MAAA,SAAA,EAAWnzC,GAAAA,CAAE,SAAA;MACb,KAAA,EAAOs3B,GAAAA;AACP,MAAA,QAAA,EAAUt3B,GAAAA,CAAE,QAAA;AACZ,MAAA,YAAA,EAAYA,GAAAA,CAAE,IAAA;AAEb,MAAA,QAAA,EAAAA,IAAE,OAAA,CAAQ,GAAA,CAAA,CAAK7B,GAAAA,qBACdgkB,IAACkxB,GAAAA,EAAD;AAAqB,QAAA,KAAA,EAAOvsC,GAAAA,CAAE,KAAA;AAAO,QAAA,UAAA,EAAYA,GAAAA,CAAE,QAAA;AAChD,QAAA,QAAA,EAAAA,GAAAA,CAAE;OACE,EAFKA,GAAAA,CAAE,KAEP,CACR;KACS,CAAA,mBAIdqb,GAAAA,CAACipB,GAAAA,EAAD;MACE,IAAA,EAAK,IAAA;MACL,OAAA,EAAQ,MAAA;AACR,MAAA,SAAA,EAAWprC,GAAAA,CAAE,SAAA;AACb,MAAA,SAAA,EAAWA,GAAAA,CAAE,IAAA;AACb,MAAA,KAAA,EAAOA,GAAAA,CAAE,OAAA,CAAQ,GAAA,CAAA,CAAK7B,GAAAA,MAAO;AAC3B,QAAA,KAAA,EAAO2I,GAAAA,CAAE,KAAA;QACT,KAAA,EAAOA,GAAAA,CAAE,SAASA,GAAAA,CAAE,KAAA;QACpB,SAAA,EAAWwyC,EAAAA,CAAOxyC,IAAE,KAAK,CAAA;AACzB,QAAA,QAAA,EAAUA,GAAAA,CAAE;OACd,CAAE,CAAA;MACF,KAAA,EAAOwwB,GAAAA;AACP,MAAA,QAAA,EAAA,CAAWn5B,GAAAA,KAAS;AACdoL,QAAAA,GAAAA,KAAS,IAAA,IAAMvJ,GAAAA,CAAE,QAAA,CAASuJ,GAAI,CAAA;AACpC,MAAA;KACD,CAAA;AAKL,IAAA,IAAMiyC,GAAAA,GAAQx7C,IAAE,OAAA,KAAY,OAAA;AAC5B,IAAA,uBACEmiB,IAAC,KAAA,EAAD;MACE,SAAA,EAAWniB,GAAAA,CAAE,YAAY,CAAA,EAAGX,EAAAA,CAAE,MAAA,CAAA,CAAA,EAAUW,GAAAA,CAAE,SAAA,CAAA,CAAA,GAAcX,EAAAA,CAAE,MAAA;AAC1D,MAAA,IAAA,EAAMm8C,MAAQ,YAAA,GAAe,OAAA;AAC7B,MAAA,YAAA,EAAYx7C,GAAAA,CAAE,IAAA;AAEb,MAAA,QAAA,EAAAA,GAAAA,CAAE,OAAA,CAAQ,GAAA,CAAA,CAAK2C,GAAAA,KAAQ;AACtB,QAAA,IAAMipC,GAAAA,GAAW2P,IAAI,KAAA,KAAUjkB,GAAAA;AAC/B,QAAA,uBACEnV,IAAC,QAAA,EAAD;UAEE,IAAA,EAAK,QAAA;AACL,UAAA,IAAA,EAAMq5B,MAAQ,OAAA,GAAU,MAAA;AACxB,UAAA,cAAA,EAAcA,MAAQ5P,GAAAA,GAAW,MAAA;AACjC,UAAA,cAAA,EAAc4P,MAAQ,MAAA,GAAY5P,GAAAA;UAClC,YAAA,EAAY0N,EAAAA,CAAOiC,IAAI,KAAK,CAAA;AAC5B,UAAA,QAAA,EAAUA,GAAAA,CAAI,QAAA;UACd,SAAA,EAAW3P,GAAAA,GAAW,GAAGvsC,EAAAA,CAAE,YAAA,IAAgBA,EAAAA,CAAE,oBAAA,KAAyBA,EAAAA,CAAE,YAAA;AACxE,UAAA,OAAA,EAAA,MAAeW,GAAAA,CAAE,QAAA,CAASu7C,GAAAA,CAAI,KAAK,CAAA;UAElC,QAAA,EAAAA,GAAAA,CAAI,SAASA,GAAAA,CAAI;AACZ,SAAA,EAXDA,IAAI,KAWH,CAAA;MAEZ,CAAC;KACE,CAAA;AAET,EAAA;AAEA,EAAA,IAAME,GAAAA,GAAOz7C,IAAE,MAAA,KAAW,QAAA;AAC1B,EAAA,uBACEmiB,IAACsjB,EAAAA,EAAD;AACE,IAAA,SAAA,EAAWgW,GAAAA,GAAQz7C,GAAAA,CAAE,SAAA,GAAY,CAAA,EAAGX,EAAAA,CAAE,MAAA,CAAA,CAAA,EAAUW,GAAAA,CAAE,SAAA,CAAA,CAAA,GAAcX,EAAAA,CAAE,MAAA,GAAUW,GAAAA,CAAE,SAAA;AAC9E,IAAA,OAAA,EAASy7C,MAAO,MAAA,GAAS,MAAA;IACzB,SAAA,EAAWA,GAAAA,GAAOz7C,IAAE,EAAA,GAAK,MAAA;AACzB,IAAA,YAAA,EAAYA,GAAAA,CAAE,IAAA;AACd,IAAA,WAAA,EAAaA,IAAE,KAAA,GAAQ,OAAA,GAAWA,IAAE,WAAA,KAAgBA,GAAAA,CAAE,QAAQ,QAAA,GAAM,qBAAA,CAAA;IACpE,WAAA,EAAas3B,GAAAA;AACb,IAAA,OAAA,EAASt3B,GAAAA,CAAE,OAAA,CAAQ,GAAA,CAAA,CAAK7B,GAAAA,MAAO;AAAE,MAAA,KAAA,EAAO2I,GAAAA,CAAE,KAAA;AAAO,MAAA,KAAA,EAAOA,GAAAA,CAAE,KAAA;AAAO,MAAA,UAAA,EAAYA,GAAAA,CAAE;KAAS,CAAE,CAAA;AAC1F,IAAA,iBAAA,EAAA,CAAoBhE,GAAAA,KAAM;AACxBxE,MAAAA,CAAAA,CAAK,kBAAkB,QAAA,EAAU;AAAE,QAAA,IAAA,EAAM0B,GAAAA,CAAE,IAAA;QAAM,KAAA,EAAOhC;OAAG,CAAA,EAC3DgC,GAAAA,CAAE,QAAA,CAAShC,GAAC,CAAA;AACd,IAAA;GACD,CAAA;AAEL;AAKA,SAAS09C,GAAWv9C,GAAAA,EAA2D;AAC7E,EAAA,IAAMw9C,GAAAA,GAAQnL,MAAAA,CAAO9e,GAAAA,EAAO,IAAA,MAAU,EAAE,CAAA;AAExC,EAAA,OADK,iBAAA,CAAkB,IAAA,CAAKiqB,GAAK,CAAA,GAC1B;AAAE,IAAA,GAAA,EAAKA,GAAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,EAAE,WAAA,EAAY;AAAG,IAAA,KAAA,EAAOhL,WAAWgL,GAAK;GAAE,GAD7B;IAAE,GAAA,EAAK,SAAA;IAAW,KAAA,EAAO;AAAE,GAAA;AAExE;AAEA,SAASxB,IAAah8C,GAAAA,EAA4B;AAChD,EAAA,IAAMy9C,GAAAA,GAAU57C,GAAAA,CAAE,KAAA,KAAU,IAAA,EACtB67C,GAAAA,GAAQH,EAAAA,CAAW17C,GAAAA,CAAE,KAAK,CAAA,EAC1Bi9B,GAAAA,GAAQ,OAAOj9B,GAAAA,CAAE,SAAU,QAAA,GAAWA,GAAAA,CAAE,KAAA,GAAQ67C,GAAAA,CAAM,KAAA,EAGtD71C,GAAAA,GAAAA,CAAS7H,GAAAA,EAAa2E,QAAe84C,GAAAA,GAAUxK,WAAAA,CAAYC,GAAAA,EAAKzsC,GAAC,CAAA,GAAIysC,GAAAA,EACrEyK,GAAAA,GAAAA,CAAY39C,QAAA,CAAkCe,GAAAA,KAAgB68C,GAAAA,CAAM/1C,GAAAA,CAAMqrC,GAAAA,EAAKpU,GAAK,CAAC,CAAA,EACrF+e,MAAAA,CAAY79C,GAAAA,EAA4CwE,GAAAA,KAC5Di5C,GAAAA,GAAUG,GAAAA,KAAAA,CAAW78C,GAAAA,KAAc68C,GAAAA,CAAM3K,YAAYyK,GAAAA,CAAM,GAAA,EAAKj3C,GAAC,CAAC,CAAA,CAAA,GAAKq3C,GAAAA,EACnEC,GAAAA,GAAcF,GAAAA,CAASh8C,IAAE,QAAA,EAAUA,GAAAA,CAAE,aAAa,CAAA,EAClDm8C,GAAAA,GAAaH,GAAAA,CAASh8C,GAAAA,CAAE,OAAA,EAASA,IAAE,YAAY,CAAA;AAErD,EAAA,IAAIA,GAAAA,CAAE,WAAW,QAAA,EAAU;AACzB,IAAA,IAAMo8C,GAAAA,GAAYp8C,GAAAA,CAAE,KAAA,KAAU,MAAA,IAAaA,GAAAA,CAAE,KAAA,KAAU,KAAA,EAGjDyR,GAAAA,GAAAA,CAAOvS,GAAAA,EAA4CE,GAAAA,KACvD28C,GAAAA,KAAAA,CACEn3C,GAAAA,KAAgB;AAChB,MAAA,IAAI,OAAO5E,GAAAA,CAAE,KAAA,IAAU,QAAA,EAAU;AAC/B,QAAAd,IAAMg0C,GAAG,CAAA;AACT,QAAA;AACF,MAAA;AACA,MAAA,IAAM3pC,GAAAA,GAAOmyC,GAAWxI,GAAG,CAAA;AAE3B,MAAA,CADI3pC,GAAAA,CAAK,GAAA,KAAQsyC,GAAAA,CAAM,GAAA,IAAO,CAACI,GAAAA,KAAKF,GAAAA,CAAMxyC,GAAAA,CAAK,GAAG,GAC9CA,GAAAA,CAAK,KAAA,KAAU0zB,GAAAA,IAAOgf,GAAAA,GAAM1yC,IAAK,KAAK,CAAA;AAC5C,IAAA,CAAA,CAAA;AACF,IAAA,uBACE4Y,IAACmuB,GAAAA,EAAD;AACE,MAAA,SAAA,EAAWtwC,GAAAA,CAAE,SAAA;MACb,KAAA,EAAOA,GAAAA,CAAE,KAAA,GAAQ,MAAA,GAAYo8C,GAAAA,GAAYhL,WAAAA,CAAYyK,IAAM,GAAA,EAAK5e,GAAK,CAAA,GAAKj9B,GAAAA,CAAE,KAAA,IAAS,SAAA;AACrF,MAAA,KAAA,EAAOA,GAAAA,CAAE,KAAA;MACT,KAAA,EAAOo8C,GAAAA;AACP,MAAA,QAAA,EAAU3qC,IAAIzR,GAAAA,CAAE,QAAA,EAAUA,GAAAA,CAAE,aAAa,KAAKA,GAAAA,CAAE,QAAA;AAChD,MAAA,OAAA,EAASyR,GAAAA,CAAIzR,GAAAA,CAAE,OAAA,EAASA,GAAAA,CAAE,YAAY,CAAA;AACtC,MAAA,YAAA,EAAYA,GAAAA,CAAE;KACf,CAAA;AAEL,EAAA;AAEA,EAAA,uBACEmiB,IAACk6B,GAAAA,EAAD;IACK,CAAA,EAAAl+C,GAAAA;AACH,IAAA,GAAA,EAAK09C,GAAAA,CAAM,GAAA;AACX,IAAA,KAAA,EAAO77C,IAAE,KAAA,KAAU,MAAA,IAAaA,GAAAA,CAAE,KAAA,KAAU,QAAQ,MAAA,GAAYi9B,GAAAA;IAChE,aAAA,EAAe6e,GAAAA,CAAS97C,IAAE,QAAQ,CAAA;AAClC,IAAA,YAAA,EAAcA,GAAAA,CAAE,OAAA,IAAW87C,GAAAA,CAAS97C,GAAAA,CAAE,OAAO,CAAA;IAC7C,aAAA,EAAek8C,GAAAA;IACf,YAAA,EAAcC;GACf,CAAA;AAEL;AAEA,SAASE,IAAU,EACjB,CAAA,EAAAl+C,GAAAA,EACA,GAAA,EAAAe,KACA,KAAA,EAAA4D,GAAAA,EACA,aAAA,EAAAH,GAAAA,EACA,cAAAvD,GAAAA,EACA,aAAA,EAAAwF,GAAAA,EACA,YAAA,EAAAkC,KAAA,EASC;AACD,EAAA,IAAMw1C,GAAAA,GAAYC,GAAAA,IAAgBC,GAAAA,EAC5Bx2C,GAAAA,GAAQw0C,EAAAA,CAAkB+B,QAAAA,CAAkBp+C,GAAAA,KAAQq+C,GAAAA,CAAc5yB,GAAG,CAAA,CAAE,CAAA,EACvE6yB,MAAYC,GAAAA,IAAgBC,GAAAA,EAC5BC,GAAAA,GAAapC,EAAAA,CACjBkC,GAAAA,IAAgBC,GAAAA,KAAAA,CAAmBx+C,GAAAA,KAAQw+C,GAAAA,CAAc,MAAA,CAAO/yB,GAAG,CAAC,CAAA,CACtE,CAAA;AACA,EAAA,uBACExH,KAAAhf,QAAAA,EAAA,EAAA,UAAA,iBACE+e,IAAC,OAAA,EAAD;IACE,GAAA,EAAKnc,GAAAA;AACL,IAAA,EAAA,EAAIhG,GAAAA,CAAE,EAAA;IACN,IAAA,EAAK,OAAA;AACL,IAAA,SAAA,EAAWA,GAAAA,CAAE,SAAA;AACb,IAAA,YAAA,EAAYA,GAAAA,CAAE,IAAA;IACd,KAAA,EAAOqxC,GAAAA;AACP,IAAA,YAAA,EAAYrxC,IAAE,KAAA,IAAS,MAAA;AACvB,IAAA,QAAA,EAAA,CAAW7B,GAAAA,KAAMm+C,GAAAA,CAAUn+C,GAAAA,CAAE,OAAO,KAAK;AAC1C,GAAA,CAAA,EACA8+B,GAAAA,KAAU,MAAA,oBACT9a,IAAC,OAAA,EAAD;IACE,GAAA,EAAKy6B,GAAAA;IACL,IAAA,EAAK,OAAA;AACL,IAAA,YAAA,EAAY58C,GAAAA,CAAE,IAAA,GAAO,CAAA,EAAGA,GAAAA,CAAE,IAAA,CAAA,QAAA,CAAA,GAAiB,MAAA;IAC3C,SAAA,EAAW,CAAA,EAAGqwC,IAAO,KAAA,CAAA,CAAA,EAASA,IAAO,KAAA,CAAA,CAAA,EAAShxC,GAAE,KAAA,CAAA,CAAA;IAChD,GAAA,EAAK,CAAA;IACL,GAAA,EAAK,CAAA;IACL,IAAA,EAAM,IAAA;IACN,KAAA,EAAO49B,GAAAA;AACP,IAAA,QAAA,EAAUj9B,GAAAA,CAAE,aAAA;AACZ,IAAA,QAAA,EAAA,CAAW7B,GAAAA,KAAMs+C,GAAAA,GAAY,OAAOt+C,GAAAA,CAAE,MAAA,CAAO,KAAK,CAAC;GACpD,CAEH,GAAA,CAAA;AAEN;AAEA,SAASi8C,IAAaj8C,GAAAA,EAA4B;AAChD,EAAA,IAAMi5C,GAAAA,GAASp3C,GAAAA,CAAE,OAAA,KAAY,QAAA,GAAWy2C,EAAAA,GAAaa,GAAAA;AACrD,EAAA,uBACEn1B,IAACi1B,GAAAA,EAAD;AACE,IAAA,SAAA,EAAWp3C,GAAAA,CAAE,SAAA;AACb,IAAA,KAAA,EAAOA,GAAAA,CAAE,KAAA;AACT,IAAA,KAAA,EAAOA,GAAAA,CAAE,KAAA;AACT,IAAA,KAAA,EAAOA,GAAAA,CAAE,KAAA;AACT,IAAA,KAAA,EAAOA,GAAAA,CAAE,KAAA;AACT,IAAA,SAAA,EAAWA,GAAAA,CAAE,SAAA;AACb,IAAA,QAAA,EAAUA,GAAAA,CAAE,QAAA;AACZ,IAAA,OAAA,EAASA,GAAAA,CAAE,OAAA;AACX,IAAA,YAAA,EAAYA,GAAAA,CAAE;GACf,CAAA;AAEL;;;;;;;;ACrhCA,SAAgB68C,GAAAA,CAAW,EACzB,MAAA,EAAA39C,GAAAA,EACA,KAAA4D,GAAAA,EACA,GAAA,EAAAH,KACA,IAAA,EAAAiC,GAAAA,EACA,OAAAkC,GAAAA,EACA,MAAA,EAAAzH,MAAS,GAAA,EACT,QAAA,EAAAjB,KACA,QAAA,EAAAkB,GAAAA,EACA,KAAA,EAAAU,GAAAA,EAAA,EACkB;AAClB,EAAA,IAAM4I,GAAAA,GAAyB4jB,QAAAA,MAAc;AAC3C,IAAA,IAAM/a,MAAsB,EAAC;AAC7B,IAAA,KAAA,IAASrS,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI,CAAA,GAAI0xB,GAAAA,CAAO,QAAQhuB,GAAAA,IAAK,CAAA,EAAG3E,GAAAA,CAAI,IAAA,CAAK;AAAE,MAAA,CAAA,EAAG2yB,IAAO1xB,GAAAA,CAAAA;MAAI,CAAA,EAAG0xB,GAAAA,CAAO1xB,MAAI,CAAA;KAAI,CAAA;AAC1F,IAAA,OAAOqS,GAAAA;AACT,EAAA,CAAA,EAAG,CAACqf,GAAM,CAAC,GAELgsB,GAAAA,GAAerzB,WAAAA,CAAAA,CAClBvqB,GAAAA,KAAyB;AACxB,IAAA,IAAM69C,GAAAA,GAAqB,KAAA,CAAMxzC,GAAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAChD,IAAA,KAAA,IAASnK,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAImK,GAAAA,CAAK,QAAQpL,GAAAA,EAAAA,EAAK;AACpC,MAAA,IAAM6+C,MAAQ,IAAA,CAAK,KAAA,CAAMzzC,IAAKnK,GAAAA,CAAAA,CAAG,IAAIyJ,GAAI,CAAA,GAAIA,GAAAA,EACvCzE,GAAAA,GAAI,KAAK,GAAA,CAAI0nC,GAAAA,EAAK,KAAK,GAAA,CAAIM,GAAAA,EAAK4Q,GAAK,CAAC,CAAA;AAC5C,MAAA59C,GAAAA,CAAKA,GAAAA,GAAI,CAAA,CAAA,GAAKmK,GAAAA,CAAKnK,GAAAA,CAAAA,CAAG,CAAA,EACtBA,GAAAA,CAAKA,GAAAA,GAAI,CAAA,GAAI,CAAA,CAAA,GAAKgF,GAAAA;AACpB,IAAA;AACA9F,IAAAA,CAAAA,CAAK,eAAe,cAAA,EAAgB;AAClC,MAAA,IAAA,EAAMiL,GAAAA,CAAK,MAAA;AACX,MAAA,OAAA,EAASwzC,GAAAA,CAAK,MAAA;MACd,MAAA,EAAQA,GAAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC;KACxB,CAAA,EACDla,IAASka,GAAI,CAAA;EACf,CAAA,EACA;AAACla,IAAAA,GAAAA;AAAUiJ,IAAAA,GAAAA;AAAKM,IAAAA,GAAAA;AAAKvjC,IAAAA;GACvB,CAAA,EAEMo0C,GAAAA,GAAaxzB,WAAAA,CAAAA,MAAkB;AACnC,IAAA,IAAMyzB,MAA2C,EAAC;AAClD,IAAA,KAAA,IAAS99C,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI,CAAA,GAAI0xB,GAAAA,CAAO,QAAQhuB,GAAAA,IAAK,CAAA,EAC1C3E,GAAAA,CAAQ,IAAA,CAAK;MAAE,CAAA,EAAG,CAAA,GAAI2yB,IAAO1xB,GAAAA,CAAAA;MAAI,CAAA,EAAG0xB,GAAAA,CAAO1xB,MAAI,CAAA;KAAI,CAAA;AAErD,IAAAjB,GAAAA,CAAQ,KAAA,CAAMA,GAAAA,EAAGe,QAAM0F,GAAAA,CAAE,CAAA,GAAIlD,IAAE,CAAC,CAAA;AAChC,IAAA,IAAM+P,MAAgB,EAAC;AACvB,IAAA,KAAA,IAAWzR,GAAAA,IAAKk9C,KAASp6C,GAAAA,CAAI,KAAK9C,GAAAA,CAAE,CAAA,EAAGA,IAAE,CAAC,CAAA;AAC1C,IAAAV,IAASmS,GAAG,CAAA;AACd,EAAA,CAAA,EAAG,CAACqf,GAAAA,EAAQ+R,GAAQ,CAAC,CAAA,EAEfsa,GAAAA,GAAqB1zB,YAAAA,MAAkB;AAC3C,IAAA,IAAMjU,OAAOs2B,GAAAA,GAAMM,GAAAA,IAAO,GACpB8Q,GAAAA,GAAwB,KAAA,CAAMpsB,IAAO,MAAM,CAAA;AACjD,IAAA,KAAA,IAAS1xB,GAAAA,GAAI,GAAGA,GAAAA,GAAI,CAAA,GAAI0xB,IAAO,MAAA,EAAQhuB,GAAAA,IAAK,CAAA,EAC1C1D,GAAAA,CAAQA,GAAAA,IAAK0xB,GAAAA,CAAO1xB,GAAAA,CAAAA,EACpBA,GAAAA,CAAQA,GAAAA,GAAI,CAAA,IAAK,CAAA,GAAIoW,GAAAA,GAAMsb,GAAAA,CAAO1xB,GAAAA,GAAI,CAAA,CAAA;AAExC,IAAAE,IAAS49C,GAAO,CAAA;EAClB,CAAA,EAAG;AAACpsB,IAAAA,GAAAA;AAAQgb,IAAAA,GAAAA;AAAKM,IAAAA,GAAAA;AAAKvJ,IAAAA;GAAS,CAAA;AAE/B,EAAA,uBACErjC,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWH,GAAAA,CAAE,KAAA;IAAlB,QAAA,EAAA,iBACEG,IAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWH,GAAAA,CAAE,IAAA;MAAlB,QAAA,EAAA,iBACEE,GAAAA,CAACuiC,EAAAA,EAAD;QACE,KAAA,EAAOl5B,GAAAA;QACP,OAAA,EAASk0C,GAAAA;QACT,MAAA,EAAO,IAAA;QACP,SAAA,EAAU,UAAA;QACV,MAAA,EAAQ,CAAC,GAAG,CAAC,CAAA;QACb,MAAA,EAAQ,CAAChR,KAAKM,GAAG,CAAA;QACV,KAAA,EAAAtlC,GAAAA;QACC,MAAA,EAAAzH,GAAAA;QACR,SAAA,EAAU,UAAA;QACV,YAAA,EAAa,aAAA;QACb,SAAA,EAAW,CAAA;AACX,QAAA,IAAA,EAAM,EAAC;QACP,OAAA,EAAS;AACV,OAAA,GACA+9C,GAAAA,IAASA,GAAAA,CAAM,SAAS,CAAA,oBACvB79C,IAAC,KAAA,EAAD;AACE,QAAA,SAAA,EAAWF,GAAAA,CAAE,KAAA;QACN,KAAA,EAAAyH,GAAAA;QACC,MAAA,EAAAzH,GAAAA;QACR,OAAA,EAAS,CAAA,IAAA,EAAOuzB,GAAAA,CAAAA,CAAAA,EAASC,GAAAA,CAAAA,CAAAA;QACzB,aAAA,EAAY,MAAA;QAEX,QAAA,EAAAuqB,GAAAA,CAAM,GAAA,CAAA,CAAKj/C,GAAAA,KAAM;AAChB,UAAA,IAAM6H,GAAAA,GAAQhH,IAAE,KAAA,IAAS,SAAA;AACzB,UAAA,IAAIA,GAAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,YAAA,IAAM88B,MAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG98B,GAAAA,CAAE,CAAA,CAAE,CAAA,CAAE,CAAC,CAAA,GAAI4zB,KACxCxT,GAAAA,GAAK,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGpgB,IAAE,CAAA,CAAE,CAAA,CAAE,CAAC,IAAI4zB,GAAAA,EACxCld,GAAAA,GAAO,IAAA,CAAK,GAAA,CAAIomB,KAAI1c,GAAE,CAAA,EACtB5P,MAAI,IAAA,CAAK,GAAA,CAAI4P,MAAK0c,GAAE,CAAA;AAC1B,YAAA,uBACEt8B,IAAAA,CAAC,GAAA,EAAD,EAAA,QAAA,EAAA;AACE,8BAAAD,IAAC,MAAA,EAAD;gBAAM,CAAA,EAAGmW,GAAAA;gBAAM,CAAA,EAAG,CAAA;gBAAG,KAAA,EAAOlG,GAAAA;gBAAW,MAAA,EAAAnQ,GAAAA;gBAAQ,IAAA,EAAM2G,GAAAA;gBAAO,WAAA,EAAa;eAAM,CAAA;AAC/E,8BAAAzG,IAAC,MAAA,EAAD;gBACE,EAAA,EAAImW,GAAAA;gBACJ,EAAA,EAAI,CAAA;gBACJ,EAAA,EAAIA,GAAAA;gBACJ,EAAA,EAAImd,GAAAA;gBACJ,MAAA,EAAQ7sB,GAAAA;gBACR,aAAA,EAAe,IAAA;gBACf,WAAA,EAAa;eACd,CAAA;AACD,8BAAAzG,IAAC,MAAA,EAAD;AACE,gBAAA,EAAA,EAAImW,GAAAA,GAAOlG,GAAAA;gBACX,EAAA,EAAI,CAAA;AACJ,gBAAA,EAAA,EAAIkG,GAAAA,GAAOlG,GAAAA;gBACX,EAAA,EAAIqjB,GAAAA;gBACJ,MAAA,EAAQ7sB,GAAAA;gBACR,aAAA,EAAe,IAAA;gBACf,WAAA,EAAa;eACd;AACA,aAAA,EAAA,EApBK,CAAA,KAAA,EAAQhH,GAAAA,CAAE,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,EAAMA,GAAAA,CAAE,CAAA,CAAE,CAAA,CAAA,CAAA,CAAA,EAAMgH,GAAAA,CAAAA,CAoBjC,CAAA;AAEP,UAAA;AACA,UAAA,IAAM3B,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAGrF,GAAAA,CAAE,CAAC,CAAC,CAAA,GAAI4zB,GAAAA;AAC1C,UAAA,uBACErzB,IAAC,MAAA,EAAD;YAEE,EAAA,EAAI8E,GAAAA;YACJ,EAAA,EAAI,CAAA;YACJ,EAAA,EAAIA,GAAAA;YACJ,EAAA,EAAIwuB,GAAAA;YACJ,MAAA,EAAQ7sB,GAAAA;YACR,WAAA,EAAa;AACd,WAAA,EAPM,CAAA,KAAA,EAAQhH,GAAAA,CAAE,CAAA,CAAA,CAAA,EAAKgH,GAAAA,CAAAA,CAOrB,CAAA;QAEL,CAAC;AACE,OAAA,CAEJ;KACL,CAAA,kBAAAxG,IAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWH,GAAAA,CAAE,OAAA;MAAlB,QAAA,EAAA;AACE,wBAAAE,IAAC,QAAA,EAAD;UAAQ,IAAA,EAAK,QAAA;AAAS,UAAA,SAAA,EAAWF,GAAAA,CAAE,MAAA;UAAQ,OAAA,EAAS49C,GAAAA;UAAY,QAAA,EAAA;SAExD,CAAA;AACR,wBAAA19C,IAAC,QAAA,EAAD;UAAQ,IAAA,EAAK,QAAA;AAAS,UAAA,SAAA,EAAWF,GAAAA,CAAE,MAAA;UAAQ,OAAA,EAAS89C,GAAAA;UAAoB,QAAA,EAAA;SAEhE,CAAA;QACPE,GAAAA,oBACC99C,IAAC,QAAA,EAAD;UACE,IAAA,EAAK,QAAA;AACL,UAAA,SAAA,EAAWF,GAAAA,CAAE,MAAA;AACb,UAAA,OAAA,EAAA,MAAewjC,GAAAA,CAAS,CAAC,GAAGwa,GAAQ,CAAC,CAAA;UACtC,QAAA,EAAA;SAEO;AAEP;AACF,KAAA,CAAA;;AAET;ACrJA,SAAgBC,GAAAA,CAAU,EACxB,KAAA,EAAAn/C,GAAAA,EACA,OAAA,EAAAe,GAAAA,EACA,QAAA,EAAAyD,GAAAA,EACA,KAAA,EAAAvD,GAAAA,EACA,MAAA,EAAA0H,GAAAA,EACA,MAAA,EAAAzH,GAAAA,EACA,WAAA,EAAA4D,GAAAA,EACA,OAAA,EAAAjD,GAAAA,EACA,IAAA,EAAAhB,GAAAA,EACA,OAAA,EAAAkT,GAAAA,EACA,KAAA,EAAAiK,GAAAA,EACA,IAAA,EAAAne,GAAAA,EACA,YAAA,EAAA0D,GAAAA,EAAA,EACiB;AACjB,EAAA,IAAM,CAACwpB,GAAAA,EAAMqyB,GAAAA,CAAAA,GAAWl7C,QAAAA,CAAS,KAAK,CAAA,EAChCuhC,GAAAA,GAAAA,MAAoB2Z,GAAAA,CAAQ,KAAK,CAAA,EACjC3+C,GAAAA,GAAO,OAAOiB,GAAAA,IAAU,WAAWA,GAAAA,GAAQ,MAAA;AACjD,EAAA,uBACEL,KAAC84C,EAAAA,EAAD;IACS,KAAA,EAAAn6C,GAAAA;IACE,OAAA,EAAA6B,GAAAA;IACD,MAAA,EAAAX,GAAAA;IACK,WAAA,EAAA4D,GAAAA;IACP,IAAA,EAAAjE,GAAAA;IACG,OAAA,EAAAkT,GAAAA;IACF,KAAA,EAAAiK,GAAAA;IACD,IAAA,EAAAne,GAAAA;IACQ,YAAA,EAAA0D,GAAAA;IAGd,KAAA,EAAA,IAAA;IAZF,QAAA,EAAA,iBAcElC,IAAAA,CAAC,QAAA,EAAD;MACE,IAAA,EAAK,QAAA;AACL,MAAA,SAAA,EAAWH,EAAAA,CAAE,aAAA;MACb,eAAA,EAAc,QAAA;AACd,MAAA,YAAA,EAAYT,GAAAA,KAAS,MAAA,GAAY,MAAA,GAAY,CAAA,KAAA,EAAQA,GAAAA,CAAAA,CAAAA;MACrD,OAAA,EAAA,MAAe2+C,IAAQ,IAAI,CAAA;MAL7B,QAAA,EAAA,iBAOEh+C,GAAAA,CAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWF,EAAAA,CAAE,aAAA;QAAgB,QAAA,EAAAm+C;OAAc,CAAA,kBACjDj+C,GAAAA,CAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWF,EAAAA,CAAE,WAAA;QAAa,aAAA,EAAY,MAAA;QAAO,QAAA,EAAA;AAE7C,OAAA,CACA;KACR,CAAA,kBAAAE,GAAAA,CAAC6jC,GAAAA,EAAD;MACE,MAAA,EAAQlY,GAAAA;MACR,YAAA,EAAcqyB,GAAAA;AACd,MAAA,KAAA,EAAO93C,GAAAA,IAAS5F,GAAAA;AAChB,MAAA,MAAA,EACEikC,GAAAA,KAAW,MAAA,mBACTvkC,GAAAA,CAAC+nB,EAAAA,EAAD;QAAQ,OAAA,EAAQ,SAAA;QAAU,OAAA,EAASsc,GAAAA;QAAO,QAAA,EAAA;AAElC,OAAA,IAEPE,GAAAA,IAAU,MAAA;AAId,MAAA,QAAA,EAAA,OAAOpgC,GAAAA,IAAa,UAAA,mBAAanE,IAACk+C,EAAAA,EAAD;QAAY,MAAA,EAAQ/5C,GAAAA;QAAiB,KAAA,EAAA0L;AAAQ,OAAA,CAAA,GAAI1L;AAC7E,KAAA,CACG;;AAEjB;AAIA,SAAS+5C,GAAW,EAClB,MAAA,EAAAt/C,GAAAA,EACA,KAAA,EAAAe,KAAA,EAIC;AACD,EAAA,OAAOw8B,IAAOkI,GAAK,CAAA;AACrB;ACnDA,SAAgB8Z,GAAc,EAC5B,KAAA,EAAAv/C,GAAAA,EACA,OAAA,EAAA2E,KACA,OAAA,EAAA1D,GAAAA,EACA,WAAA,EAAAwF,GAAAA,EACA,QAAAtF,GAAAA,EACA,WAAA,EAAA2D,GAAAA,EACA,gBAAA,EAAAjE,KACA,SAAA,EAAAkT,GAAAA,EACA,iBAAA,EAAAiK,GAAAA,EACA,UAAAne,GAAAA,EACA,SAAA,EAAAoG,GAAAA,EACA,IAAA,EAAA1C,KACA,IAAA,EAAA2C,GAAAA,GAAO,YAAA,EACP,OAAA,EAAAkjB,KACA,KAAA,EAAAnY,GAAAA,EACA,QAAAI,GAAAA,EACA,IAAA,EAAA2S,KAAA,EACqB;AACrB,EAAA,IAAMw7B,GAAAA,GAAS/1C,KAAAA,EAAM,EACf,CAACq0C,GAAAA,EAAK2B,GAAAA,CAAAA,GAAUv7C,QAAAA,CAASw7C,GAAAA,IAAoB,KAAK,CAAA,EAClD15B,GAAAA,GAAUxe,EAAAA,CAAU;IAAE,MAAA,EAAA6J,GAAAA;IAAQ,IAAA,EAAA2S;GAAM,CAAA;AAC1C,EAAA,IAAI27B,KAAQ,OAAO,IAAA;AAEnB,EAAA,IAAMC,GAAAA,GACJC,GAAAA,KACCH,GAAAA,KAAqB,MAAA,IAAaI,GAAAA,KAAc,MAAA,IAAaC,GAAAA,KAAsB,MAAA,CAAA,EAChFC,GAAAA,GAASJ,GAAAA,KAAUE,GAAAA,IAAahC,GAAAA,CAAAA,EAChC9C,MAAAA,MAAe;AACf8E,IAAAA,GAAAA,KAAc,UAAWL,GAAAA,CAAO,CAACO,GAAM,CAAA,EAC3CD,GAAAA,GAAoB,CAACC,GAAM,CAAA;AAC7B,EAAA,CAAA,EAEM95B,GAAAA,GAAO,CAAA,EAAGhlB,EAAAA,CAAE,KAAA,CAAA,EAAQ84C,GAAAA,KAAS,OAAA,GAAU,CAAA,CAAA,EAAI94C,EAAAA,CAAE,UAAA,CAAA,CAAA,GAAe84C,GAAAA,KAAS,QAAA,GAAW,CAAA,CAAA,EAAI94C,EAAAA,CAAE,UAAA,CAAA,CAAA,GAAe,EAAA,CAAA,CAAA,EACrG0F,GAAAA,GAAM2yC,EAAAA,CAAoB7hC,GAAAA,GAAO,CAAA,EAAGwO,GAAAA,CAAAA,CAAAA,EAAQhlB,EAAAA,CAAE,IAAA,CAAA,CAAA,GAASglB,GAAAA,EAAM;IAAE,OAAA,EAAAkD,GAAAA;IAAS,KAAA,EAAAnY;AAAM,GAAA,EAAG7L,GAAS,CAAA,EAC1F66C,GAAAA,mBACJ5+C,KAAC,IAAA,EAAD;AAAI,IAAA,SAAA,EAAWH,EAAAA,CAAE,UAAA;IAAjB,QAAA,EAAA;sBACEE,GAAAA,CAAC,IAAA,EAAD,EAAK,CAAA;AACL,sBAAAA,GAAAA,CAAC,MAAA,EAAD,EAAA,QAAA,EAAOkG,KAAY,CAAA;sBACnBlG,GAAAA,CAAC,IAAA,EAAD,EAAK;AACH;AAEAw4C,GAAAA,CAAAA,EAAAA,EAAAA,GACJsG,QAAY,MAAA,IAAapG,GAAAA,KAAY,SACnCmG,GAAAA,mBAEA5+C,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWH,EAAAA,CAAE,YAAA;IAAlB,QAAA,EAAA;AACGg/C,MAAAA,GAAAA,KAAY,MAAA,GAAY,IAAA,mBAAO9+C,GAAAA,CAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWF,EAAAA,CAAE,YAAA;QAAe,QAAA,EAAAg/C;OAAc,CAAA;AAC/ED,MAAAA,GAAAA;AACAnG,MAAAA,GAAAA,KAAY,MAAA,GAAY,IAAA,mBAAO14C,GAAAA,CAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWF,EAAAA,CAAE,YAAA;QAAe,QAAA,EAAA44C;OAAc;AAC7E;;AAET,EAAA,uBACEz4C,KAAC,KAAA,EAAD;IAAK,SAAA,EAAWuF,GAAAA;IAAK,GAAIof,GAAAA;IAAzB,QAAA,EAAA;MACG45B,GAAAA,mBACCx+C,IAAC+rB,GAAAA,EAAD;AACE,QAAA,SAAA,EAAWjsB,EAAAA,CAAE,SAAA;AACb,QAAA,IAAA,EAAM,CAAC8+C,GAAAA;QACP,QAAA,EAAUhF,GAAAA;QACV,KAAA,EAAO,OAAO1zC,GAAAA,IAAU,QAAA,GAAWA,GAAAA,GAAQ,cAAA;QAC3C,QAAA,EAAUk4C,GAAAA;QAET,QAAA,EAAA5F;AACY,OAAA,CAAA,GAEfA,EAAAA;MAEDjR,GAAAA,KAAgB,MAAA,IAAaA,QAAgB,EAAA,oBAAMvnC,IAAC84C,EAAAA,EAAD,EAAA,QAAA,EAAevR,GAAAA,EAA0B,CAAA;AAC7F,sBAAAvnC,IAAC,KAAA,EAAD;QAAK,EAAA,EAAIo+C,GAAAA;AAAQ,QAAA,SAAA,EAAWt+C,EAAAA,CAAE,SAAA;QAAW,MAAA,EAAQ8+C,GAAAA;QAC9C,QAAA,EAAAngD;OACE;AACF;;AAET;ACtHA,SAAgBsgD,GAAS,EAAE,KAAA,EAAAngD,GAAAA,EAAO,QAAA,EAAA2E,KAAU,SAAA,EAAAH,GAAAA,EAAW,OAAA,EAAAvD,GAAAA,EAAS,OAAAwF,GAAAA,EAAO,MAAA,EAAAvF,GAAAA,EAAQ,IAAA,EAAAC,KAAA,EAAuB;AACpG,EAAA,IAAMyF,GAAAA,GAAM2yC,EAAAA,CAAoBr4C,EAAAA,CAAE,QAAA,EAAU;IAAE,OAAA,EAAAD,GAAAA;IAAS,KAAA,EAAAwF;AAAM,GAAA,EAAGrB,GAAS,CAAA;AACzE,EAAA,uBACE/D,KAAC,KAAA,EAAD;IAAK,SAAA,EAAWuF,GAAAA;AAAK,IAAA,GAAIY,EAAAA,CAAU;MAAE,MAAA,EAAAtG,GAAAA;MAAQ,IAAA,EAAAC;KAAM,CAAA;IAAnD,QAAA,EAAA,iBACEE,IAAAA,CAAC,IAAA,EAAD;AAAI,MAAA,SAAA,EAAWH,EAAAA,CAAE,aAAA;AAAjB,MAAA,QAAA,EAAA,iBACEE,GAAAA,CAAC,MAAA,EAAD,EAAA,QAAA,EAAOkG,GAAAA,EAAY,CAAA,kBACnBlG,GAAAA,CAAC,IAAA,EAAD,EAAK,CACH;AACH,KAAA,GAAAmE,GACE;;AAET;;;AC1BA,IAAIvF,GAAAA,GAAI;AAAA,EACP,IAAA,EAAM,eAAA;AAAA,EACN,GAAA,EAAK,eAAA;AAAA,EACL,IAAA,EAAM,gBAAA;AAAA,EACN,QAAA,EAAU,oBAAA;AAAA,EACV,KAAA,EAAO,iBAAA;AAAA,EACP,QAAA,EAAU,oBAAA;AAAA,EACV,KAAA,EAAO,iBAAA;AAAA,EACP,KAAA,EAAO;AACR,CAAA;;;;;;;;;;;;;;;;;;;;;;;ACmFA,SAAgBogD,GAAAA,CAAWpgD,KAAwBe,GAAAA,EAAkC;AAEnF,EAAA,OADIs/C,GAAAA,CAAK,QAAA,KAAa,IAAA,GAAaC,EAAAA,CAAQ/5C,KAAO85C,GAAI,CAAA,GAC/C95C,GAAAA,CAAM,GAAA,CAAA,CAAKvG,GAAAA,KACZ4F,GAAAA,CAAK,EAAA,KAAOy6C,IAAK,QAAA,GAAiB;IAAE,GAAGz6C,GAAAA;AAAM,IAAA,QAAA,EAAU06C,EAAAA,CAAQ16C,GAAAA,CAAK,QAAA,IAAY,IAAIy6C,GAAI;AAAE,GAAA,GACvFz6C,IAAK,QAAA,GAAW;IAAE,GAAGA,GAAAA;IAAM,QAAA,EAAUw6C,GAAAA,CAAWx6C,GAAAA,CAAK,QAAA,EAAUy6C,GAAI;AAAE,GAAA,GAAIz6C,GACjF,CAAA;AACH;AAEA,SAAS06C,GAAQtgD,GAAAA,EAA2B,EAAE,KAAAe,GAAAA,EAAK,KAAA,EAAA4D,KAAA,EAAqC;AACtF,EAAA,IAAM47C,MAAS,IAAI,GAAA,CAAI9zB,GAAG,CAAA,EACpB+zB,MAAOC,GAAAA,CAAS,MAAA,CAAA,CAAQzgD,GAAAA,KAAO,CAACugD,GAAAA,CAAO,GAAA,CAAI/1B,GAAAA,CAAG,EAAE,CAAC,CAAA,EACjD8R,GAAAA,GAAQmkB,GAAAA,CAAS,MAAA,CAAA,CAAQzgD,GAAAA,KAAOugD,GAAAA,CAAO,GAAA,CAAI/1B,GAAAA,CAAG,EAAE,CAAC,CAAA,EACjDkC,GAAAA,GAAK,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI8zB,GAAAA,CAAK,MAAA,EAAQn2B,GAAK,CAAC,CAAA;AACnD,EAAA,OAAO;IAAC,GAAGm2B,GAAAA,CAAK,KAAA,CAAM,CAAA,EAAG9zB,GAAE,CAAA;IAAG,GAAG4P,GAAAA;IAAO,GAAGkkB,GAAAA,CAAK,MAAM9zB,GAAE;AAAC,GAAA;AAC3D;AAEA,SAASg0B,GACP1gD,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,mBAAO,IAAI,KAAY,EACV;AACb,EAAA,KAAA,IAAWiB,OAAQW,GAAAA,EACbo6C,GAAAA,CAAY/6C,GAAI,KAAGg7C,GAAAA,CAAK,GAAA,CAAIh7C,GAAAA,CAAK,EAAE,GACnCA,GAAAA,CAAK,QAAA,IAAU86C,GAAiB96C,GAAAA,CAAK,QAAA,EAAU+6C,KAAaC,GAAI,CAAA;AAEtE,EAAA,OAAOA,GAAAA;AACT;AAEA,SAASC,GAAU7gD,GAAAA,EAAiC;AAClD,EAAA,OAAOuG,GAAAA,CAAM,KAAA,CAAMvG,GAAAA,KAAAA,CAAQwqB,IAAG,QAAA,EAAU,MAAA,IAAU,KAAK,CAAC,CAAA;AAC1D;AAgCA,SAASs2B,GAAQ9gD,GAAAA,EAA0B;AACzC,EAAA,OAAO4O,GAAAA,IAAS,QAA8BA,GAAAA,KAAS,KAAA;AACzD;AAQA,SAAgBmyC,GAAUhgD,GAAAA,EAAuB;AAC/C,EAAA,IAAM,EAAE,OAAA4D,GAAAA,EAAO,YAAA,EAAAH,KAAc,iBAAA,EAAAvD,GAAAA,EAAmB,KAAA,EAAAwF,GAAAA,EAAO,QAAA,EAAAkC,GAAAA,EAAU,OAAAzH,GAAAA,EAAO,KAAA,EAAAC,KAAO,SAAA,EAAAC,GAAAA,KAAcsD,GAAAA,EAGvF,CAACs8C,GAAAA,EAASC,GAAAA,CAAAA,GAAc/8C,QAAAA,qBAA2C,GAAA,EAAK,GACxE47C,GAAAA,GAAYoB,GAAAA,GACd,IAAI,GAAA,CAAIA,GAAY,CAAA,GACpBR,EAAAA,CAAiBn6C,GAAAA,EAAAA,CAAQvG,QAASghD,GAAAA,CAAQ,GAAA,CAAIp7C,GAAAA,CAAK,EAAE,CAAA,IAAKA,GAAAA,CAAK,qBAAqB,IAAI,CAAA,EACtFo1C,GAAAA,GAAAA,CAAUh7C,GAAAA,KAAe;AAC7B,IAAA,IAAMoL,GAAAA,GAAO,IAAI,GAAA,CAAI00C,GAAS,CAAA;AAC1B10C,IAAAA,GAAAA,CAAK,GAAA,CAAImf,GAAE,CAAA,GAAGnf,IAAK,MAAA,CAAOmf,GAAE,CAAA,GAC3Bnf,GAAAA,CAAK,GAAA,CAAImf,GAAE,CAAA,EACX22B,GAAAA,IAAcD,IAAAA,CAAYt8C,GAAAA,KAAS,IAAI,GAAA,CAAIuG,GAAI,CAAA,CAAE,GAAA,CAAIqf,GAAAA,EAAInf,IAAK,GAAA,CAAImf,GAAE,CAAC,CAAC,CAAA,EAC3Ew1B,GAAAA,GAAoB,CAAC,GAAG30C,GAAI,CAAC,CAAA;EAC/B,CAAA,EAIM0qB,GAAAA,GAAOpsB,OAAOhF,GAAK,CAAA;AACzB,EAAA0kB,IAAK,OAAA,GAAU1kB,GAAAA;AACf,EAAA,IAAM4lC,GAAAA,GAAAA,CAAStqC,GAAAA,EAAqBe,GAAAA,KAAyB;AAC3D,IAAA,IAAM,EAAE,aAAA4D,GAAAA,GAAc,IAAI,QAAA,EAAAH,GAAAA,KAAasxB,GAAAA,CAAK,OAAA;AAC5C,IAAA,IAAI,CAACqrB,GAAAA,EAAU;AAEf,IAAA,IADA5Z,EAAAA,CAAO,UAAU3hC,GAAAA,CAAK,EAAA,EAClBA,IAAK,MAAA,IAAU,CAAComB,IAAK,QAAA,EAAU;AACjC,MAAAxnB,GAAAA,CAAS,CAACoB,GAAAA,CAAK,EAAE,CAAC,CAAA;AAClB,MAAA;AACF,IAAA;AAEA,IAAA,IAAM68B,MAAS,IAAI,GAAA,CAAI2e,GAAUtrB,GAAAA,CAAK,OAAA,CAAQ,KAAK,CAAC,CAAA,EAC9C0qB,GAAAA,GAAOl2B,GAAAA,CAAY,OAAA,CAAQtqB,GAAAA,KAAO,CAACyiC,GAAAA,CAAO,GAAA,CAAIlY,GAAE,CAAC,CAAA;AACvD,IAAA/lB,IAASg8C,GAAAA,CAAK,QAAA,CAAS56C,IAAK,EAAE,CAAA,GAAI46C,IAAK,MAAA,CAAA,CAAQz/C,QAAOwpB,GAAAA,KAAO3kB,GAAAA,CAAK,EAAE,CAAA,GAAI,CAAC,GAAG46C,GAAAA,EAAM56C,GAAAA,CAAK,EAAE,CAAC,CAAA;AAC5F,EAAA,CAAA,EAEMy7C,sBAAS,IAAI,GAAA,EAAuB,EACpCC,GAAAA,GAAAA,CAAiBthD,GAAAA,KAA0B;AAC/C,IAAA,KAAA,IAAWwqB,OAAMwL,GAAAA,EACfqrB,IAAO,GAAA,CAAI72B,GAAAA,CAAG,IAAI9lB,GAAAA,CAAM,UAAA,GAAaA,IAAM,UAAA,CAAW8lB,GAAE,IAAI,IAAI,CAAA,EAC5DA,IAAG,QAAA,IAAU82B,GAAAA,CAAc92B,IAAG,QAAQ,CAAA;AAE9C,EAAA,CAAA;AACA,EAAAvU,IAAc1P,GAAK,CAAA;AAInB,EAAA,IAAMg7C,MAAwB,EAAC,EACzBC,MAAAA,CAAQxhD,GAAAA,EAAuBe,KAAyB4D,GAAAA,KAAkB;AAC9E,IAAA,KAAA,IAAWiB,GAAAA,IAAQowB,GAAAA,EACZ8qB,EAAAA,CAAQO,GAAAA,CAAO,GAAA,CAAIz7C,GAAAA,CAAK,EAAE,CAAC,CAAA,IAAG27C,GAAAA,CAAQ,IAAA,CAAK;MAAE,IAAA,EAAA/8C,GAAAA;MAAM,QAAA,EAAAzD,GAAAA;MAAU,KAAA,EAAA4D;AAAM,KAAC,GACrEiB,GAAAA,CAAK,QAAA,EAAU,MAAA,IAAU,CAACk6C,IAAU,GAAA,CAAIl6C,GAAAA,CAAK,EAAE,CAAA,IAAG47C,IAAK57C,GAAAA,CAAK,QAAA,EAAUA,GAAAA,CAAK,EAAA,EAAI67C,MAAQ,CAAC,CAAA;AAEhG,EAAA,CAAA;AACA,EAAA7rC,GAAAA,CAAKrP,GAAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AAEnB,EAAA,IAAMm7C,GAAAA,GAASh4C,MAAAA,iBAAO,IAAI,GAAA,EAA0B,CAAA,EAC9C,CAACi4C,GAAAA,EAASC,GAAAA,CAAAA,GAAc19C,QAAAA,CAAwB,IAAI,CAAA,EACpD29C,KAAen4C,MAAAA,CAAsB,IAAI,CAAA,EACzCxE,EAAAA,GAASwE,MAAAA,CAAsB,IAAI,CAAA,EACnCo4C,EAAAA,GAAUp4C,MAAAA,iBAAO,IAAI,GAAA,EAA4D,CAAA,CAAE,OAAA;AACzF,EAAA7J,gBAAA,MAAsB;AACpB,IAAA,IAAM0qB,MAAKs3B,EAAAA,CAAa,OAAA;AACxB,IAAA,IAAIt3B,QAAO,IAAA,EAAM;AACjB,IAAA3C,GAAa,OAAA,GAAU,IAAA;AACvB,IAAA,IAAM3e,GAAAA,GAAKy4C,GAAAA,CAAO,OAAA,CAAQ,GAAA,CAAIn3B,GAAE,CAAA;AAC5BthB,IAAAA,GAAAA,IAAM,QAAA,CAAS,aAAA,KAAkBA,GAAAA,IAAIA,IAAG,KAAA,EAAM;EACpD,CAAC,CAAA;AAED,EAAA,IAAMqhB,EAAAA,GAAc5lB,GAAAA,CAAM,WAAA,IAAe,IACnCq9C,EAAAA,GAAUR,GAAAA,CAAQ,IAAA,CAAA,CAAMvhD,QAAMH,GAAAA,CAAE,IAAA,CAAK,EAAA,KAAO8hD,GAAO,IACpDA,GAAAA,IAAW,MAAA,GAAA,CACXJ,GAAAA,CAAQ,IAAA,CAAA,CAAMvhD,GAAAA,KAAMsqB,EAAAA,CAAY,QAAA,CAASzqB,GAAAA,CAAE,KAAK,EAAE,CAAC,CAAA,IAAK0hD,GAAAA,CAAQ,CAAA,CAAA,GAAK,IAAA,CAAK,EAAA,EAEzES,EAAAA,GAAAA,CAAYhiD,GAAAA,KAAe;AAC/B,IAAA4nB,EAAAA,CAAa,OAAA,GAAU2C,GAAAA,EACvBq3B,GAAAA,CAAWr3B,GAAE,CAAA;EACf,CAAA,EAEM03B,EAAAA,GAAAA,CAAejiD,GAAAA,KAAe;AAClC,IAAA,IAAM4D,GAAAA,GAAOsB,GAAO,OAAA,IAAWkuB,GAAAA,EACzB3sB,MAAI86C,GAAAA,CAAQ,SAAA,CAAA,CAAWvhD,GAAAA,KAAMH,GAAAA,CAAE,IAAA,CAAK,OAAO+D,GAAI,CAAA,EAC/CL,MAAIg+C,GAAAA,CAAQ,SAAA,CAAA,CAAWxgD,GAAAA,KAAMlB,GAAAA,CAAE,IAAA,CAAK,EAAA,KAAOuzB,GAAE,CAAA;AACnD,IAAA,IAAI3sB,GAAAA,GAAI,CAAA,IAAKlD,GAAAA,GAAI,CAAA,EAAG;AACpB,IAAA,IAAMwX,GAAAA,GAAQwmC,GAAAA,CACX,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI96C,GAAAA,EAAGlD,GAAC,CAAA,EAAG,IAAA,CAAK,GAAA,CAAIkD,GAAAA,EAAGlD,GAAC,CAAA,GAAI,CAAC,CAAA,CACxC,MAAA,CAAA,CAAQvD,GAAAA,KAAM,CAACH,GAAAA,CAAE,IAAA,CAAK,MAAM,CAAA,CAC5B,GAAA,CAAA,CAAKG,GAAAA,KAAMH,GAAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACnBkb,IAAAA,IAAM,MAAA,GAAS,CAAA,IAAG+a,GAAAA,CAAK,OAAA,CAAQ,WAAW/a,GAAK,CAAA;AACrD,EAAA,CAAA,EAEMwW,EAAAA,GAAgB;IACpB,OAAA,EAAArb,EAAAA;IACA,QAAA,EAAA,CAAWlW,GAAAA,KAAA,CAAQe,GAAAA,KAAO;AACpBkI,MAAAA,GAAAA,GAAIy4C,GAAAA,CAAO,OAAA,CAAQ,GAAA,CAAIn3B,GAAAA,EAAIthB,GAAE,CAAA,GAC5By4C,GAAAA,CAAO,OAAA,CAAQ,MAAA,CAAOn3B,GAAE,CAAA;AAC/B,IAAA,CAAA;AACA,IAAA,OAAA,EAAA,CAAUvqB,GAAAA,KAAO;AACf4hD,MAAAA,GAAAA,CAAWr3B,GAAE,CAAA,EACbgd,EAAAA,CAAO,OAAA,KAAYhd,GAAAA;AACrB,IAAA,CAAA;AACA,IAAA,SAAA,EAAA,CAAYvqB,GAAAA,EAAM2E,GAAAA,KAAA,CAAcH,GAAAA,KAAM;AAEpC,MAAA,IAAIxE,GAAAA,CAAE,MAAA,KAAWA,GAAAA,CAAE,aAAA,EAAe;AAClC,MAAA,IAAM0sB,GAAAA,GAAK60B,GAAAA,CAAQ,SAAA,CAAA,CAAWxgD,GAAAA,KAAMlB,GAAAA,CAAE,IAAA,CAAK,EAAA,KAAO+F,GAAAA,CAAK,EAAE,CAAA,EACnDs8C,GAAAA,GAAAA,CAAMliD,GAAAA,KAAkB;AAC5B,QAAA,IAAMoL,GAAAA,GAAOm2C,GAAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAIA,GAAAA,CAAQ,MAAA,GAAS,CAAA,EAAGl3B,GAAK,CAAC,CAAA,CAAA;AAC/Djf,QAAAA,QACL42C,EAAAA,CAAS52C,GAAAA,CAAK,KAAK,EAAE,CAAA,EACjBpL,IAAE,QAAA,IAAY0E,GAAAA,CAAM,QAAA,GAAUu9C,EAAAA,CAAY72C,IAAK,IAAA,CAAK,EAAE,IACrDm8B,EAAAA,CAAO,OAAA,GAAUn8B,IAAK,IAAA,CAAK,EAAA,CAAA;AAClC,MAAA,CAAA,EACM+2C,GAAAA,GAAAA,CAAUv8C,GAAAA,CAAK,QAAA,EAAU,MAAA,IAAU,CAAA,IAAK,CAAA,EACxCmnB,GAAAA,GAAOo1B,GAAAA,IAAU,CAACrC,GAAAA,CAAU,GAAA,CAAIl6C,GAAAA,CAAK,EAAE,CAAA;AAC7C,MAAA,QAAQ5F,IAAE,GAAA;QACR,KAAK,WAAA;AACL,QAAA,KAAK,SAAA,EAAW;AACd,UAAA,IAAM2sB,GAAAA,GAAQ3sB,GAAAA,CAAE,GAAA,KAAQ,WAAA,GAAc,CAAA,GAAI,EAAA;AACtCA,UAAAA,IAAE,MAAA,GACA8hD,EAAAA,CAAQ,GAAA,CAAIM,GAAQ,IAAIx8C,GAAAA,CAAK,EAAA,EAAI+mB,GAAK,CAAA,KAAG/E,GAAa,OAAA,GAAUhiB,GAAAA,CAAK,EAAA,CAAA,GAEzEs8C,GAAAA,CAAGx1B,MAAKC,GAAK,CAAA;AAEf,UAAA;AACF,QAAA;QACA,KAAK,MAAA;AACH,UAAAlmB,IAAG,CAAC,CAAA;AACJ,UAAA;QACF,KAAK,KAAA;AACH,UAAAA,GAAAA,CAAG86C,GAAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AACrB,UAAA;QACF,KAAK,YAAA;AACH,UAAA,IAAIY,OAAU,CAACp1B,GAAAA,EAAMlsB,GAAAA,CAAO+E,IAAK,EAAE,CAAA;mBAC1BmnB,GAAAA,EAAMtmB,GAAAA,CAAGimB,GAAAA,GAAK,CAAC,CAAA;AACnB,eAAA;AACL,UAAA;QACF,KAAK,WAAA;AACH,UAAA,IAAIK,GAAAA,EAAMlsB,GAAAA,CAAO+E,GAAAA,CAAK,EAAE,CAAA;mBACfw8C,GAAAA,KAAa,IAAA,EAAM37C,GAAAA,CAAG86C,GAAAA,CAAQ,SAAA,CAAA,CAAWvhD,GAAAA,KAAMH,GAAAA,CAAE,IAAA,CAAK,EAAA,KAAOuiD,GAAQ,CAAC,CAAA;AAC1E,eAAA;AACL,UAAA;QACF,KAAK,OAAA;QACL,KAAK,GAAA;AACH,UAAAnxC,IAAMrL,GAAAA,EAAM;AAAE,YAAA,QAAA,EAAU5F,GAAAA,CAAE,QAAA;AAAU,YAAA,OAAA,EAASA,GAAAA,CAAE,OAAA;AAAS,YAAA,OAAA,EAASA,GAAAA,CAAE,OAAA;AAAS,YAAA,MAAA,EAAQA,GAAAA,CAAE;WAAQ,CAAA;AAC9F,UAAA;AACF,QAAA;AACE,UAAA;AACJ;AACA,MAAAwE,IAAE,cAAA,EAAe;AACnB,IAAA;AACF,GAAA,EAGM0tC,EAAAA,GAAiB;IAAE,KAAA,EAAAnxC,GAAAA;IAAO,SAAA,EAAAc,GAAAA;IAAW,MAAA,EAAAhB,GAAAA;IAAQ,KAAA,EAAAoQ,GAAAA;AAAO,IAAA,GAAA,EAD9CxH,KAAAA,EAC8C;AAAK,IAAA,MAAA,EAAQo3C,GAAUt6C,GAAK,CAAA;IAAG,MAAA,EAAA2d,GAAAA;IAAQ,OAAA,EAAAtiB,EAAAA;IAAS,IAAA,EAAA4lC;AAAK,GAAA,EACzG6a,EAAAA,GAAUC,GAAAA,GAASC,GAAAA,IAAY,KAAM,EAAC,EACtC37C,EAAAA,GAAMxB,GAAAA,GAAY,GAAGlE,GAAAA,CAAE,IAAA,CAAA,CAAA,EAAQkE,GAAAA,KAAclE,GAAAA,CAAE,IAAA;AAErD,EAAA,uBACE6S,KAAC,KAAA,EAAD;IAAK,SAAA,EAAWnN,EAAAA;IAAhB,QAAA,EAAA,CAAA,CACIU,QAAU,MAAA,IAAa+6C,EAAAA,CAAQ,SAAS,CAAA,qBACxCtuC,KAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAW7S,GAAAA,CAAE,IAAA;AAAlB,MAAA,QAAA,EAAA,CACGoG,GAAAA,KAAU,MAAA,oBAAavC,IAAC,IAAA,EAAD;AAAI,QAAA,SAAA,EAAW7D,GAAAA,CAAE,KAAA;QAAQ,QAAA,EAAAoG;OAAU,CAAA,kBAC3DvC,GAAAA,CAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAW7D,GAAAA,CAAE,OAAA;AACf,QAAA,QAAA,EAAAmhD,GAAQ,GAAA,CAAA,CAAKthD,GAAAA,qBACZgE,IAAC,QAAA,EAAD;UAEE,IAAA,EAAK,QAAA;AACL,UAAA,SAAA,EAAW7D,GAAAA,CAAE,GAAA;AACb,UAAA,YAAA,EAAY,OAAOyzC,GAAAA,CAAAA,CAAAA;AACnB,UAAA,OAAA,EAAA,MAAe;AACbx0C,YAAAA,CAAAA,CAAK,YAAA,EAAc,SAAS,EAAE,IAAA,EAAAY,KAAM,CAAA,EACpCuhD,MAAQ3N,GAAI,CAAA;AACd,UAAA,CAAA;UAEC,QAAA,EAAAA;AACK,SAAA,EAVDA,GAUC,CACT;AACE,OAAA,CACF;AAEN,KAAA,GAAApuC,GAAAA,CAAM,MAAA,KAAW,CAAA,mBAChBxB,IAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWymB,GAAAA,CAAK,KAAA;AAClB,MAAA,QAAA,EAAA7rB,GAAAA,KAAU0iD,EAAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,iCAAA,GAA+B,YAAA;KAC5D,CAAA,mBAELt9C,GAAAA,CAACy9C,EAAAA,EAAD;MAAc,KAAA,EAAA79C,GAAAA;MAAO,QAAA,EAAU,IAAA;MAAc,MAAA,EAAA89C,EAAAA;MAAQ,IAAA,EAAK,EAAA;MAAG,KAAA,EAAO;AAAI,KAAA,CAEvE;;AAET;AAEA,SAASrB,GAAUphD,GAAAA,EAAkC;AACnD,EAAA,IAAMsT,MAAgB,EAAC;AACvB,EAAA,KAAA,IAAWkX,OAAMjkB,GAAAA,EACXikB,IAAG,MAAA,IAAQlX,GAAAA,CAAI,KAAKkX,GAAAA,CAAG,EAAE,CAAA,EACzBA,GAAAA,CAAG,YAAUlX,GAAAA,CAAI,IAAA,CAAK,GAAG8tC,EAAAA,CAAU52B,GAAAA,CAAG,QAAQ,CAAC,CAAA;AAErD,EAAA,OAAOlX,GAAAA;AACT;AAWA,SAASkvC,EAAAA,CAAM,EAAE,KAAA,EAAAzhD,GAAAA,EAAO,QAAA,EAAA4D,GAAAA,EAAU,MAAA,EAAAH,GAAAA,EAAQ,IAAA,EAAAtD,GAAAA,EAAM,KAAA,EAAAG,GAAAA,EAAA,EAAqB;AACnE,EAAA,IAAM,EAAE,KAAA,EAAAyD,GAAAA,EAAA,GAAUotC,GAAAA,EACZzE,GAAAA,GAAW/oC,GAAAA,CAAM,WAAA,IAAe,EAAC,EACjCmqB,GAAAA,GAAO/D,EAAAA,CAAmB;IAG9B,KAAA,EAAOvkB,GAAAA,CAAM,GAAA,CAAA,CAAKvG,GAAAA,MAAQ;AAAE,MAAA,EAAA,EAAIwqB,GAAAA,CAAG,EAAA;AAAI,MAAA,KAAA,EAAOA,GAAAA,CAAG,KAAA;MAAO,MAAA,EAAQA,GAAAA,CAAG,MAAA,IAAU,CAAC9lB,GAAAA,CAAM;KAAU,CAAE,CAAA;AAChG,IAAA,WAAA,EAAa6B,GAAAA,CAAM,MAAA,CAAA,CAAQvG,GAAAA,KAAOytC,IAAS,QAAA,CAASjjB,GAAAA,CAAG,EAAE,CAAC,CAAA,CAAE,GAAA,CAAA,CAAKxqB,GAAAA,KAAOwqB,IAAG,EAAE,CAAA;IAC7E,SAAA,EAAA,CAAYhmB,KAAKvD,GAAAA,KAAW;AAC1B,MAAA,IAAMs/C,GAAAA,GAAS,IAAI,GAAA,CAAI9zB,GAAG,GAIpB4zB,GAAAA,GAAO;AAAE,QAAA,GAAA,EAHC95C,GAAAA,CAAM,MAAA,CAAA,CAAQvG,GAAAA,KAAOugD,IAAO,GAAA,CAAI/1B,GAAAA,CAAG,EAAE,CAAC,CAAA,CAAE,GAAA,CAAA,CAAKxqB,GAAAA,KAAOwqB,IAAG,EAGnD,CAAA;QAAS,QAAA,EAAA7lB,GAAAA;AAAU,QAAA,KAAA,EAAOmlB,GAAAA,GAD/BvjB,GAAAA,CAAM,KAAA,CAAM,CAAA,EAAGujB,GAAM,CAAA,CAAE,MAAA,CAAA,CAAQ9pB,GAAAA,KAAOugD,GAAAA,CAAO,GAAA,CAAI/1B,GAAAA,CAAG,EAAE,CAAC,CAAA,CAAE;AACV,OAAA;AAC9DrqB,MAAAA,CAAAA,CAAK,cAAc,WAAA,EAAakgD,GAAI,CAAA,EACpC37C,GAAAA,CAAM,YAAY27C,GAAI,CAAA;AACxB,IAAA,CAAA;IACA,OAAA,EAAA,CAAUrgD,KAAI2E,GAAAA,KAAS;AACrB,MAAA,IAAMiB,MAAOW,GAAAA,CAAM,IAAA,CAAA,CAAMxF,GAAAA,KAAOypB,GAAAA,CAAG,OAAOD,GAAE,CAAA;AACxC3kB,MAAAA,GAAAA,IAAMssC,GAAAA,CAAO,KAAA,CAAMtsC,GAAAA,EAAMomB,GAAI,CAAA;AACnC,IAAA;GACD,CAAA;AACD,EAAAxnB,IAAO,OAAA,CAAQ,GAAA,CAAI49C,KAAAA,CAAWpiD,GAAAA,EAAI2E,QAChCkqB,GAAAA,CAAK,KAAA,CAAMtE,KAAIhkB,GAAAA,CAAM,SAAA,CAAA,CAAWxF,GAAAA,KAAOypB,GAAAA,CAAG,OAAOD,GAAE,CAAA,EAAGoC,GAAK,CAC7D,CAAA;AACA,EAAA,IAAM,CAAC1jB,KAAIy5C,GAAAA,CAAAA,GAASx+C,SAAgC,IAAI,CAAA,EAClDy+C,GAAAA,GAAAA,CAAQ3iD,GAAAA,KAAgC;AAC5C0iD,IAAAA,IAAM7f,GAAI,CAAA,EACVhU,GAAAA,CAAM,cAAA,CAAe,IAAoCgU,GAAI,CAAA;AAC/D,EAAA,CAAA,EAEMwe,GAAAA,GAAS96C,GAAAA,CAAM,GAAA,CAAA,CAAKvG,GAAAA,KAAOkyC,GAAAA,CAAO,MAAA,CAAO,GAAA,CAAI1nB,GAAAA,CAAG,EAAE,CAAC,CAAA,EACnDo4B,MAAQvB,GAAAA,CAAO,IAAA,CAAKP,EAAO,CAAA,EAC3B,EAAE,UAAA,EAAA98B,GAAAA,EAAY,WAAA,EAAAE,KAAa,KAAA,EAAAC,GAAAA,EAAA,GAAU0K,GAAAA,CAAK,KAAA,EAE1CkC,GAAAA,GAAAA,CAAS/wB,GAAAA,EAAqBiB,KAAW0H,GAAAA,KAAqB;AAClE,IAAA,IAAMiG,GAAAA,GAAOyyC,IAAOpgD,GAAA,CAAA,EACd4hD,MAAOj9C,GAAAA,CAAK,QAAA,IAAY,EAAC,EACzBmnB,GAAAA,GAAO,CAACmlB,GAAAA,CAAO,SAAA,CAAU,IAAItsC,GAAAA,CAAK,EAAE,GACpCk9C,GAAAA,GAAU,CAAA,EAAG5Q,IAAO,GAAA,CAAA,EAAM5U,GAAAA,CAAAA,CAAAA,EAAQr8B,GAAA,IAClC+zB,GAAAA,GAAgB+tB,GAAAA,GAAU,SAAYl0B,GAAAA,CAAK,QAAA,CAASjpB,IAAK,EAAA,EAAI3E,GAAC,EAAE,aAAA,EAChEisC,GAAAA,GAAaO,IAAS,QAAA,CAAS7nC,GAAAA,CAAK,EAAE,CAAA,EACtCgB,GAAAA,GAAM,CAAC1F,GAAAA,CAAE,KAAK,CAAA;AACf6hD,IAAAA,GAAAA,KACCp4B,GAAAA,EAAY,QAAA,CAAS/kB,GAAAA,CAAK,EAAE,CAAA,IAAGgB,GAAAA,CAAI,IAAA,CAAK1F,GAAAA,CAAE,QAAQ,CAAA,EAClD2pB,GAAAA,KAAgB5pB,GAAAA,IAAK,CAAC0pB,KAAY,QAAA,CAAS/kB,GAAAA,CAAK,EAAE,CAAA,IAAGgB,GAAAA,CAAI,IAAA,CAAK1F,GAAAA,CAAE,UAAU,GAC1E2pB,GAAAA,KAAgBtkB,GAAAA,CAAM,MAAA,IAAUtF,GAAAA,KAAMsF,IAAM,MAAA,GAAS,CAAA,IAAGK,GAAAA,CAAI,IAAA,CAAK1F,IAAE,SAAS,CAAA,CAAA;AAElF,IAAA,IAAM+rB,GAAAA,mBAAWloB,GAAAA,CAACi+C,EAAAA,EAAD;MAAgB,IAAA,EAAAhjD,GAAAA;MAAc,MAAA,EAAAwE;AAAS,KAAA,GAClD+d,GAAAA,GACJu+B,EAAAA,CAAQlyC,GAAI,CAAA,mBACV7J,IAACw6C,EAAAA,EAAD;AACE,MAAA,SAAA,EAAWr+C,GAAAA,CAAE,IAAA;MACb,KAAA,EAAO0E,GAAAA,CAAK,SAASA,GAAAA,CAAK,KAAA;MAC1B,GAAKA,GAAAA,CAAK,SAAS,MAAA,GAAY,KAAK,EAAE,IAAA,EAAMA,IAAK,IAAA,EAAK;AACtD,MAAA,SAAA,EAAWm9C,OAAW,CAACh2B,GAAAA;AACvB,MAAA,iBAAA,EAAA,MAAyBmlB,GAAAA,CAAO,MAAA,CAAOtsC,GAAAA,CAAK,EAAE,CAAA;MAC9C,OAAA,kBACEb,IAACk+C,EAAAA,EAAD;QACQ,IAAA,EAAAjjD,GAAAA;AACN,QAAA,OAAA,EAAS0E,IAAM,SAAA,KAAc,MAAA;QACd,aAAA,EAAAnB,GAAAA;QACf,OAAA,EAAA,CAAUxC,QAAUmxC,GAAAA,CAAO,OAAA,CAAQ,IAAIkQ,GAAQ,CAAA,GAAIx8C,GAAAA,CAAK,EAAA,EAAI+mB,GAAK;OAClE,CAAA;AAEH,MAAA,OAAA,EAASo2B,MAAU,MAAA,GAAY91B,GAAAA;AAE9B,MAAA,QAAA,EAAA81B,MAAU,IAAA,GAAOn0C;KACL,CAAA,mBAEfmF,IAAAA,CAAC,KAAA,EAAD;MACE,SAAA,EAAW;QAACyX,GAAAA,CAAK,GAAA;QAAKtqB,GAAAA,CAAE,GAAA;AAAKgsC,QAAAA,GAAAA,GAAa1hB,IAAK,QAAA,GAAW;AAAE,OAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACtF,MAAA,eAAA,EAAe0hB,MAAa,MAAA,GAAS,MAAA;MACrC,aAAA,EAAatnC,GAAAA,CAAK,SAAS,MAAA,GAAS,MAAA;MACrB,aAAA,EAAArC,GAAAA;MACf,GAAKw/C,GAAAA,GACD,EAAC,GACD;QACE,IAAA,EAAM,KAAA;QACN,YAAA,EAActB,GAAAA;AACd,QAAA,GAAIoB,IAAK,MAAA,GAAS,CAAA,GAAI,EAAE,eAAA,EAAiB91B,GAAAA,KAAS,EAAC;AACnD,QAAA,GAAIroB,IAAM,QAAA,GAAW,EAAE,eAAA,EAAiBwoC,GAAAA,KAAe,EAAC;AACxD,QAAA,QAAA,EAAUgF,GAAAA,CAAO,IAAA,CAAK,OAAA,KAAYtsC,GAAAA,CAAK,KAAK,CAAA,GAAI,EAAA;AAChD,QAAA,GAAA,EAAKssC,GAAAA,CAAO,IAAA,CAAK,QAAA,CAAStsC,GAAAA,CAAK,EAAE,CAAA;AACjC,QAAA,SAAA,EAAWssC,GAAAA,CAAO,IAAA,CAAK,SAAA,CAAUtsC,GAAAA,EAAMw8C,GAAQ,CAAA;AAC/C,QAAA,OAAA,EAAA,MAAelQ,GAAAA,CAAO,IAAA,CAAK,OAAA,CAAQtsC,IAAK,EAAE;AAC5C,OAAA;MAhBN,QAAA,EAAA;AAkBGssC,QAAAA,GAAAA,CAAO,WACL2Q,GAAAA,CAAK,MAAA,GAAS,CAAA,mBACb99C,IAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAW7D,GAAAA,CAAE,IAAA;UAAM,aAAA,EAAe8sC,EAAAA;UACtC,QAAA,kBAAAjpC,IAACioB,GAAAA,EAAD;YACQ,IAAA,EAAAntB,GAAAA;AACN,YAAA,QAAA,EAAA,MAAgBqyC,GAAAA,CAAO,MAAA,CAAOtsC,GAAAA,CAAK,EAAE,CAAA;YACrC,KAAA,EAAO,CAAA,EAAGA,IAAK,KAAA,CAAA,UAAA,CAAA;YACf,QAAA,EAAUk9C;WACX;SACG,CAAA,mBAEN/9C,GAAAA,CAAC,MAAA,EAAD,EAAM,SAAA,EAAW7D,GAAAA,CAAE,WAAY,CAAA,CAAA;AAEnC,wBAAA6D,IAACm+C,EAAAA,EAAD;UAAY,IAAA,EAAAljD,GAAAA;AAAM,UAAA,OAAA,EAAS0E,IAAM,SAAA,KAAc;SAAY,CAAA;AAC1DA,QAAAA,GAAAA,CAAM,kBAAA,KACJkB,GAAAA,CAAK,MAAA,mBACJb,IAAC,MAAA,EAAD,EAAM,SAAA,EAAW7D,GAAAA,CAAE,KAAA,EAAQ,CAAA,mBAE3B6D,IAAC,OAAA,EAAD;AACE,UAAA,SAAA,EAAW7D,GAAAA,CAAE,KAAA;UACb,IAAA,EAAK,UAAA;AACL,UAAA,OAAA,EAAS0E,IAAK,OAAA,KAAY,KAAA;UAC1B,aAAA,EAAeooC,EAAAA;UACf,QAAA,EAAA,CAAWjtC,QAAM2D,GAAAA,CAAM,kBAAA,GAAqBkB,IAAK,EAAA,EAAI5F,GAAAA,CAAE,OAAO,OAAO,CAAA;UACrE,YAAA,EAAY,CAAA,KAAA,EAAQ4F,IAAK,KAAA,CAAA;SAC1B,CAAA,CAAA;QAEJA,GAAAA,CAAK,OAAA;AACN,wBAAAb,IAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAWymB,GAAAA,CAAK,KAAA;UAAQ,QAAA,EAAA5lB,GAAAA,CAAK,SAASA,GAAAA,CAAK;SAAY,CAAA;QAC5Dm9C,GAAAA,GAAU,IAAA,mBAAOh+C,GAAAA,CAACo+C,EAAAA,EAAD;UAAc,IAAA,EAAAnjD,GAAAA;UAAc,MAAA,EAAAwE;SAAS;AACpD;;AAET,IAAA,uBACEuP,KAAC,KAAA,EAAD;MAAmB,IAAA,EAAK,MAAA;MAAO,SAAA,EAAWnN,GAAAA,CAAI,KAAK,GAAG,CAAA;AAAG,MAAA,eAAA,EAAesmC,MAAa,MAAA,GAAS,MAAA;MAA9F,QAAA,EAAA,CACG3qB,GAAAA,EACA,CAACwgC,GAAAA,IAAWF,GAAAA,CAAK,SAAS,CAAA,IAAK91B,GAAAA,oBAC9BhoB,GAAAA,CAAC,KAAA,EAAD;QAAK,EAAA,EAAI+9C,GAAAA;QAAS,IAAA,EAAK,UAAA;AAAW,QAAA,SAAA,EAAW5hD,GAAAA,CAAE,QAAA;QAC7C,QAAA,kBAAA6D,IAACy9C,EAAAA,EAAD;UAAO,KAAA,EAAOK,GAAAA;AAAM,UAAA,QAAA,EAAUj9C,GAAAA,CAAK,EAAA;UAAY,MAAA,EAAApB,GAAAA;UAAQ,IAAA,EAAM,CAAA,EAAG84B,GAAAA,CAAAA,CAAAA,EAAQr8B,GAAA,CAAA,CAAA;AAAK,UAAA,KAAA,EAAOwgD,GAAAA,GAAQ;SAAI;AAC7F,OAAA,CAEJ;AAPK,KAAA,EAAA77C,IAAK,EAOV,CAAA;AAET,EAAA,CAAA;AAEA,EAAA,uBACEmO,KAAA9O,QAAAA,EAAA,EAAA,UAAA,CACG29C,GAAAA,mBACC79C,GAAAA,CAACg1C,GAAAA,EAAD;IAAc,GAAA,EAAK4I,GAAAA;AAAM,IAAA,SAAA,EAAW,CAAA,EAAGzhD,GAAAA,CAAE,KAAA,CAAA,CAAA,EAASA,IAAE,KAAA,CAAA,CAAA;IACjD,QAAA,EAAAqF,GAAAA,CAAM,IAAA,CAAKvG,GAAAA,EAAIe,QAAMgwB,GAAAA,CAAMvG,GAAAA,EAAIvpB,GAAAA,EAAG,KAAK,CAAC;GAC7B,CAAA,mBAEd8D,GAAAA,CAAC,KAAA,EAAD;IACE,GAAA,EAAK49C,GAAAA;AACL,IAAA,SAAA,EAAWzhD,GAAAA,CAAE,KAAA;AACb,IAAA,GAAKkhD,QAAa,IAAA,GACd;MACE,IAAA,EAAM,UAAA;MACN,YAAA,EAAc19C,GAAAA,CAAM,KAAA,IAASA,GAAAA,CAAM,KAAA,IAAS,QAAA;AAC5C,MAAA,GAAIA,IAAM,QAAA,GAAW,EAAE,sBAAA,EAAwB,IAAA,KAAS;KAC1D,GACA,EAAE,MAAM,MAAA,EAAO;IAElB,QAAA,EAAA6B,GAAAA,CAAM,IAAA,CAAKvG,GAAAA,EAAIe,QAAMgwB,GAAAA,CAAMvG,GAAAA,EAAIvpB,GAAAA,EAAG,KAAK,CAAC;AACtC,GAAA,CAAA,EAENuqC,GAAAA,IAASviC,GAAAA,mBACRlE,IAACkrB,GAAAA,EAAD;IAAW,EAAA,EAAIub,GAAAA;IAAO,IAAA,EAAMviC,GAAAA;AACzB,IAAA,QAAA,EAAA1C,IAAM,GAAA,CAAA,CAAKvG,GAAAA,EAAIe,GAAAA,KAAOyqC,IAAM,GAAA,CAAI,QAAA,CAAShhB,GAAAA,CAAG,EAAE,IAAIuG,GAAAA,CAAMvG,GAAAA,EAAIvpB,GAAAA,EAAG,IAAI,IAAI,IAAK;GACpE,CAAA,GACT,IACJ,CAAA,EAAA,CAAA;AAEN;AAGA,IAAM+sC,EAAAA,GAAAA,CAAQhuC,GAAAA,KAAmCA,GAAAA,CAAE,eAAA,EAAgB;AAGnE,SAASkjD,GAAK,EAAE,IAAA,EAAAljD,GAAAA,EAAM,OAAA,EAAA2E,KAAA,EAAsD;AAS1E,EAAA,OARIiB,GAAAA,CAAK,MAAA,mBAELb,GAAAA,CAAC,MAAA,EAAD;AAAM,IAAA,SAAA,EAAW7D,GAAAA,CAAE,IAAA;IAAM,IAAA,EAAK,KAAA;IAAM,YAAA,EAAW,QAAA;AAC7C,IAAA,QAAA,kBAAA6D,GAAAA,CAAChC,EAAAA,EAAD,EAAU,IAAA,EAAM,IAAK;GACjB,CAAA,GAGN,CAACu9C,GAAAA,IAAW16C,GAAAA,CAAK,UAAU,MAAA,GAAkB,IAAA,mBAE/Cb,GAAAA,CAAC,MAAA,EAAD;AAAM,IAAA,SAAA,EAAW7D,GAAAA,CAAE,IAAA;IAAM,aAAA,EAAY,MAAA;IAClC,QAAA,EAAA0E,GAAAA,CAAK,yBAASb,GAAAA,CAACqrB,KAAD,EAAiB,IAAA,EAAM,IAAK;GACvC,CAAA;AAEV;AAIA,SAAS6yB,EAAAA,CAAO,EACd,IAAA,EAAAjjD,GAAAA,EACA,OAAA,EAAAe,KACA,aAAA,EAAA4D,GAAAA,EACA,OAAA,EAAAH,GAAAA,EAAA,EAMC;AACD,EAAA,IAAIoB,GAAAA,CAAK,MAAA,EAAQ,uBAAOb,IAACm+C,EAAAA,EAAD;IAAY,IAAA,EAAAljD,GAAAA;IAAe,OAAA,EAAAe;GAAU,CAAA;AAC7D,EAAA,IAAKu/C,OAAW16C,GAAAA,CAAK,KAAA,KAAU,QAC/B,uBACEb,IAAC,QAAA,EAAD;IACE,IAAA,EAAK,QAAA;AACL,IAAA,SAAA,EAAW7D,GAAAA,CAAE,MAAA;IACb,YAAA,EAAY,CAAA,gBAAA,EAAmB0E,IAAK,KAAA,CAAA,CAAA;IACpC,mBAAA,EAAkB,2BAAA;IACH,aAAA,EAAAjB,GAAAA;AACf,IAAA,SAAA,EAAA,CAAY3E,GAAAA,KAAM;AACZ,MAAA,CAACA,IAAE,MAAA,IAAWA,GAAAA,CAAE,GAAA,KAAQ,SAAA,IAAaA,IAAE,GAAA,KAAQ,WAAA,KACnDA,GAAAA,CAAE,cAAA,IACFojD,GAAAA,CAAQpjD,GAAAA,CAAE,GAAA,KAAQ,SAAA,GAAY,KAAK,CAAC,CAAA,CAAA;AACtC,IAAA,CAAA;AAEC,IAAA,QAAA,EAAA4F,IAAK,KAAA,oBAASb,GAAAA,CAACqrB,GAAAA,EAAD,EAAkB;GAC3B,CAAA;AAEZ;AAEA,SAAS4yB,GAAS,EAAE,IAAA,EAAAhjD,GAAAA,EAAM,MAAA,EAAAe,KAAA,EAAmD;AAC3E,EAAA,IAAM,EAAE,kBAAA,EAAA4D,GAAAA,EAAA,GAAuButC,GAAAA,CAAO,KAAA;AACtC,EAAA,uBACEn+B,IAAAA,CAAA9O,QAAAA,EAAA,EAAA,QAAA,EAAA,CACGo+C,GAAAA,IAAsB,CAACz9C,GAAAA,CAAK,MAAA,oBAC3Bb,GAAAA,CAAC,OAAA,EAAD;AACE,IAAA,SAAA,EAAW7D,GAAAA,CAAE,KAAA;IACb,IAAA,EAAK,UAAA;AACL,IAAA,OAAA,EAAS0E,IAAK,OAAA,KAAY,KAAA;IAC1B,OAAA,EAASooC,EAAAA;AACT,IAAA,QAAA,EAAA,CAAWjtC,GAAAA,KAAMsiD,GAAAA,CAAmBz9C,IAAK,EAAA,EAAI5F,GAAAA,CAAE,OAAO,OAAO,CAAA;IAC7D,YAAA,EAAY,CAAA,KAAA,EAAQ4F,IAAK,KAAA,CAAA;GAC1B,CAAA,kBAEHb,GAAAA,CAACo+C,EAAAA,EAAD;IAAc,IAAA,EAAAnjD,GAAAA;IAAc,MAAA,EAAAe;GAAS,CACrC,GAAA,CAAA;AAEN;AAEA,SAASoiD,GAAO,EAAE,IAAA,EAAAnjD,GAAAA,EAAM,MAAA,EAAAe,KAAA,EAAmD;AACzE,EAAA,IAAM,EAAE,QAAA,EAAAE,GAAAA,EAAA,GAAaixC,GAAAA,CAAO,KAAA;AAE5B,EAAA,OADI,CAACvpB,GAAAA,IAAY/iB,GAAAA,CAAK,SAAe,IAAA,mBAEnCb,IAAC,MAAA,EAAD;AAAM,IAAA,SAAA,EAAW7D,GAAAA,CAAE,IAAA;IAAM,aAAA,EAAe8sC,EAAAA;IACtC,QAAA,kBAAAjpC,IAACokB,EAAAA,EAAD;MAAQ,OAAA,EAAQ,OAAA;MAAQ,IAAA,EAAK,IAAA;MAAK,QAAA,EAAA,IAAA;MAAS,SAAA,EAAW,CAAA,OAAA,EAAUvjB,IAAK,KAAA,CAAA,CAAA;MAAS,OAAA,EAAA,MAAe+iB,GAAAA,CAAS/iB,GAAAA,CAAK,EAAE,CAAA;AAC3G,MAAA,QAAA,kBAAAb,GAAAA,CAAChD,CAAAA,EAAD,EAAW,IAAA,EAAM,IAAK;KAChB;GACJ,CAAA;AAEV;;;;;;;;;AC7kBA,SAAgBuhD,IAAW,EACzB,KAAA,EAAApiD,KACA,QAAA,EAAAjB,GAAAA,EACA,aAAAkB,GAAAA,EACA,KAAA,EAAAC,GAAAA,GAAQ,MAAA,EACR,UAAAC,GAAAA,GAAW,KAAA,EACX,cAAc4jB,GAAAA,EACd,SAAA,EAAApjB,KAAA,EACkB;AAClB,EAAA,IAAM0hD,GAAAA,GAAS75C,MAAAA,CAAoC,EAAE,CAAA,EAC/C,CAAC85C,GAAAA,EAAOC,GAAAA,CAAAA,GAAYv/C,QAAAA,CAAwB,IAAI,CAAA;AAEtD,EAAAM,UAAA,MAAgB;AACVg/C,IAAAA,GAAAA,KAAU,SACdD,GAAAA,CAAO,OAAA,CAAQC,GAAAA,CAAAA,EAAQ,KAAA,EAAM,EAC7BC,GAAAA,CAAS,IAAI,CAAA,CAAA;EACf,CAAA,EAAG,CAACD,GAAK,CAAC,CAAA;AAEV,EAAA,IAAME,GAAAA,GAAAA,CAAU1jD,GAAAA,KAAqB;AACnC0kC,IAAAA,GAAAA,CAAS;MAAC,GAAGnR,GAAAA,CAAM,KAAA,CAAM,CAAA,EAAG7G,GAAE,CAAA;AAAG,MAAA,EAAA;MAAI,GAAG6G,GAAAA,CAAM,MAAM7G,GAAE;KAAE,CAAA,EACxD+2B,IAAS/2B,GAAE,CAAA;EACb,CAAA,EACMi3B,GAAAA,GAAAA,CAAU3jD,GAAAA,KAAqB;AACnC0kC,IAAAA,IAASnR,GAAAA,CAAM,MAAA,CAAA,CAAQxyB,GAAAA,EAAG4D,GAAAA,KAAM1D,QAAMyrB,GAAE,CAAC,GACrC6G,GAAAA,CAAM,MAAA,GAAS,KAAGkwB,GAAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG/2B,GAAAA,GAAK,CAAC,CAAC,CAAA;EACpD,CAAA,EACM2R,GAAAA,GAAAA,CAAar+B,GAAAA,EAAoCe,GAAAA,KAAqB;AACtE,IAAAf,GAAAA,CAAE,QAAQ,OAAA,IACZA,GAAAA,CAAE,gBAAe,EACjB0jD,GAAAA,CAAOh3B,MAAK,CAAC,CAAA,IACJ1sB,IAAE,GAAA,KAAQ,WAAA,IAAeuzB,IAAM7G,GAAAA,CAAAA,KAAQ,OAChD1sB,GAAAA,CAAE,cAAA,EAAe,EACjB2jD,GAAAA,CAAOj3B,GAAE,CAAA,CAAA;EAEb,CAAA,EACMjsB,GAAAA,GAAAA,CAAQT,GAAAA,KAAsB,CAAA,EAAGilB,OAAa,OAAA,CAAA,CAAA,EAAWhkB,MAAI,CAAA,CAAA,CAAA;AAEnE,EAAA,uBACE0D,KAAC,KAAA,EAAD;IAAK,SAAA,EAAW,CAACzD,IAAE,MAAA,EAAQkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAAG,IAAA,EAAK,OAAA;IAAQ,YAAA,EAAY6f,GAAAA;AAA1F,IAAA,QAAA,EAAA,CACGsO,GAAAA,CAAM,MAAA,KAAW,CAAA,mBAChBxyB,IAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWG,GAAAA,CAAE,KAAA;MAAQ,QAAA,EAAAvB;KAAW,CAAA,mBAErCoB,GAAAA,CAAC,IAAA,EAAD;AAAI,MAAA,SAAA,EAAWG,GAAAA,CAAE,IAAA;AACd,MAAA,QAAA,EAAAqyB,IAAM,GAAA,CAAA,CAAK/uB,KAAOvD,GAAAA,qBAEjB0D,KAAC,IAAA,EAAD;AAAY,QAAA,SAAA,EAAWzD,GAAAA,CAAE,KAAA;QAAzB,QAAA,EAAA,iBACEH,GAAAA,CAAC,OAAA,EAAD;AACE,UAAA,GAAA,EAAA,CAAMf,GAAAA,KAAO;AACX,YAAAa,GAAAA,CAAO,OAAA,CAAQI,GAAA,CAAA,GAAKgI,GAAAA;AACtB,UAAA,CAAA;UACA,IAAA,EAAK,MAAA;AACL,UAAA,SAAA,EAAW/H,GAAAA,CAAE,KAAA;AACb,UAAA,YAAA,EAAYT,IAAKQ,GAAC,CAAA;UAClB,KAAA,EAAO8vB,GAAAA;UACM,WAAA,EAAA5vB,GAAAA;AACb,UAAA,QAAA,EAAA,CAAWnB,GAAAA,KAAM0kC,GAAAA,CAASnR,GAAAA,CAAM,IAAA,CAAKxyB,GAAAA,EAAG4D,GAAAA,KAAO8S,GAAAA,KAAMxW,GAAAA,GAAIjB,GAAAA,CAAE,MAAA,CAAO,KAAA,GAAQH,GAAE,CAAC,CAAA;AAC7E,UAAA,SAAA,EAAA,CAAYG,GAAAA,KAAMq+B,GAAAA,CAAUr+B,GAAAA,EAAGiB,GAAC;SACjC,CAAA,kBACDF,GAAAA,CAACooB,EAAAA,EAAD;UACE,OAAA,EAAQ,OAAA;UACR,IAAA,EAAK,IAAA;UACL,QAAA,EAAA,IAAA;UACA,SAAA,EAAW,CAAA,OAAA,EAAU1oB,GAAAA,CAAKQ,GAAC,CAAA,CAAA,CAAA;UAC3B,OAAA,EAAA,MAAe0iD,IAAO1iD,GAAC,CAAA;UACxB,QAAA,EAAA;AAEO,SAAA,CACN;AAtBK,OAAA,EAAAA,GAsBL,CACL;KACC,CAAA,kBAENF,GAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWG,GAAAA,CAAE,OAAA;MAChB,QAAA,kBAAAH,IAACooB,EAAAA,EAAD;QAAQ,IAAA,EAAK,IAAA;QAAK,OAAA,EAAA,MAAeu6B,GAAAA,CAAOnwB,GAAAA,CAAM,MAAM,CAAA;QACjD,QAAA,EAAAqwB;OACK;AACL,KAAA,CACF;;AAET;ACxFA,SAASr9C,IAAM/B,GAAAA,EAAqD;AAClE,EAAA,OAAO;AACL,IAAA;MAAE,KAAA,EAAO,MAAA;AAAQ,MAAA,KAAA,kBAAOvD,GAAAA,CAACoB,EAAAA,EAAD,EAAc,IAAA,EAAMwhD,KAAQ,CAAA;MAAG,SAAA,EAAW,MAAA;MAAQ,OAAA,EAAS;AAA2B,KAAA;AAC9G,IAAA;MAAE,KAAA,EAAO,OAAA;AAAS,MAAA,KAAA,kBAAO5iD,GAAAA,CAACkB,CAAAA,EAAD,EAAe,IAAA,EAAM0hD,KAAQ,CAAA;MAAG,SAAA,EAAW,OAAA;MAAS,OAAA,EAAS;AAAQ,KAAA;AAC9F,IAAA;MAAE,KAAA,EAAO,MAAA;AAAQ,MAAA,KAAA,kBAAO5iD,GAAAA,CAACmB,CAAAA,EAAD,EAAc,IAAA,EAAMyhD,KAAQ,CAAA;MAAG,SAAA,EAAW,MAAA;MAAQ,OAAA,EAAS;AAAO;AAC5F,GAAA;AACF;AAEA,IAAMC,GAAAA,GAAQ;AAAE,EAAA,EAAA,EAAIv9C,IAAM,EAAE,CAAA;AAAG,EAAA,EAAA,EAAIA,IAAM,EAAE;AAAE,CAAA;AAQ7C,SAAgBw9C,GAAAA,CAAiB,EAC/B,KAAA,EAAA/jD,GAAAA,EACA,UAAAe,GAAAA,EACA,SAAA,EAAA4D,GAAAA,GAAY,YAAA,EACZ,MAAA8B,GAAAA,EACA,OAAA,EAAAvF,GAAAA,EACA,SAAA,EAAAjB,KAAA,EACsC;AACtC,EAAA,uBACEgB,IAACgsC,GAAAA,EAAD;IACE,KAAA,EAAO6W,GAAAA,CAAMtiD,OAAQ,IAAA,CAAA;IACd,KAAA,EAAAxB,GAAAA;AACP,IAAA,QAAA,EAAA,CAAWA,GAAAA,KAAS;AACdoL,MAAAA,GAAAA,IAAMs5B,IAASt5B,GAAI,CAAA;AACzB,IAAA,CAAA;IACW,SAAA,EAAAzG,GAAAA;IACL,IAAA,EAAA8B,GAAAA;IACG,OAAA,EAAAvF,GAAAA;IACE,SAAA,EAAAjB;GACZ,CAAA;AAEL;;;ACrDA,IAAID,GAAAA,GAAI;AAAA,EACP,IAAA,EAAM,gBAAA;AAAA,EACN,OAAA,EAAS,mBAAA;AAAA,EACT,eAAA,EAAiB,2BAAA;AAAA,EACjB,OAAA,EAAS,oBAAA;AAAA,EACT,eAAA,EAAiB;AAClB,CAAA;ACmCA,SAAgBgkD,IAA+Cx/C,GAAAA,EAAyC;AACtG,EAAA,IAAM,EAAE,KAAA,EAAAvD,GAAAA,EAAO,SAAA,EAAAwF,GAAAA,EAAW,WAAAkC,GAAAA,EAAW,MAAA,EAAAzH,GAAAA,EAAQ,IAAA,EAAAjB,KAAM,OAAA,EAAAkB,GAAAA,KAAYuD,GAAAA,EAEzDs2C,GAAAA,GAAAA,CAAUh7C,GAAAA,KAAkB;AAChC,IAAA,IAAM4F,GAAAA,GAAOW,IAAM8jB,GAAAA,CAAAA;AACfzkB,IAAAA,IAAK,QAAA,IACTA,GAAAA,CAAK,QAAA,CAAS,CAACA,IAAK,QAAQ,CAAA;AAC9B,EAAA,CAAA,EAEM2nC,MAASf,GAAAA,CAAkB;IAAE,KAAA,EAAAvrC,GAAAA;AAAO,IAAA,aAAA,EAAeC,GAAAA,CAAE,OAAA;IAAS,UAAA,EAAY85C;GAAQ,CAAA,EAElFp0B,GAAAA,GAAmC8N,GAAAA,KAAW,MAAA,GAEhD,MAAA,GADC,EAAG,iBAAA,EAA8B,CAAA,EAAGA,GAAAA,CAAAA,EAAAA,CAAAA,EAAW,EAG9C8Y,GAAAA,GAAU;IACdtsC,GAAAA,CAAE,IAAA;IACFM,GAAAA,IAAQN,GAAAA,CAAE,CAAA,KAAA,EAAQM,GAAAA,CAAAA,CAAAA,CAAAA;IAClBkH,GAAAA,IAAWxH,GAAAA,CAAE,CAAA,QAAA,EAAWwH,GAAAA,CAAAA,CAAAA,CAAAA;AACxBtD,IAAAA;AACF,GAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAE1B,EAAA,uBACET,IAAC,KAAA,EAAD;AACE,IAAA,GAAA,EAAK4oC,GAAAA,CAAO,OAAA;IACZ,SAAA,EAAWC,GAAAA;IACX,IAAA,EAAK,OAAA;IACL,YAAA,EAAYvoB,GAAAA;IACL,KAAA,EAAAngB,GAAAA;AAEN,IAAA,QAAA,EAAAyB,GAAAA,CAAM,GAAA,CAAA,CAAKvG,GAAAA,EAAMwE,GAAAA,KAAM;AACtB,MAAA,IAAMoC,GAAAA,GAAM,CAAA,EAAG1F,GAAAA,CAAE,OAAA,CAAA,EAAU0E,GAAAA,CAAK,QAAA,GAAW,CAAA,CAAA,EAAI1E,GAAAA,CAAE,eAAA,CAAA,CAAA,GAAoB,EAAA,CAAA,CAAA;AACrE,MAAA,uBACEyD,IAAC,QAAA,EAAD;QAEE,IAAA,EAAK,QAAA;AACL,QAAA,cAAA,EAAciB,GAAAA,CAAK,QAAA;AACnB,QAAA,YAAA,EAAYA,GAAAA,CAAK,SAAA;AACjB,QAAA,QAAA,EAAUA,GAAAA,CAAK,QAAA;QACf,QAAA,EAAU2nC,GAAAA,CAAO,YAAYtsC,GAAC,CAAA;QAC9B,SAAA,EAAW2F,GAAAA;QACX,OAAA,EAAA,MAAeo0C,IAAO/5C,GAAC,CAAA;QACvB,SAAA,EAAWssC,GAAAA,CAAO,UAAUtsC,GAAC,CAAA;AAE5B,QAAA,QAAA,EAAA2E,GAAAA,CAAK;AACA,OAAA,EAXDA,IAAK,KAWJ,CAAA;IAEZ,CAAC;GACE,CAAA;AAET;ACnDA,SAAgBq+C,IAA8Cx9C,GAAAA,EAAwC;AACpG,EAAA,IAAM,EAAE,KAAA,EAAAkC,GAAAA,EAAO,SAAA,EAAAzH,GAAAA,EAAW,WAAAjB,GAAAA,EAAW,MAAA,EAAAkB,GAAAA,EAAQ,IAAA,EAAAC,KAAM,OAAA,EAAAC,GAAAA,KAAYqD,GAAAA,EAEzDw/C,GAAAA,GAAAA,CAAQlkD,GAAAA,KAAkB;AAC9B,IAAA,IAAM4F,GAAAA,GAAOW,IAAM8jB,GAAAA,CAAAA;AACfzkB,IAAAA,GAAAA,CAAK,QAAA,IACTA,GAAAA,CAAK,QAAA,EAAS;AAChB,EAAA,CAAA,EAEM2nC,MAASf,GAAAA,CAAkB;IAAE,KAAA,EAAA7jC,GAAAA;AAAO,IAAA,aAAA,EAAezH,GAAAA,CAAE,OAAA;IAAS,UAAA,EAAYgjD;GAAM,CAAA,EAEhFt9B,GAAAA,GAAmC8N,GAAAA,KAAW,MAAA,GAEhD,MAAA,GADC,EAAG,iBAAA,EAA8B,CAAA,EAAGA,GAAAA,CAAAA,EAAAA,CAAAA,EAAW,EAG9C8Y,GAAAA,GAAU;IACdtsC,GAAAA,CAAE,IAAA;IACFM,GAAAA,IAAQN,GAAAA,CAAE,CAAA,KAAA,EAAQM,GAAAA,CAAAA,CAAAA,CAAAA;IAClBkH,GAAAA,IAAWxH,GAAAA,CAAE,CAAA,QAAA,EAAWwH,GAAAA,CAAAA,CAAAA,CAAAA;AACxBtD,IAAAA;AACF,GAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAE1B,EAAA,uBACEnE,IAAC,KAAA,EAAD;AACE,IAAA,GAAA,EAAKssC,GAAAA,CAAO,OAAA;IACZ,SAAA,EAAWC,GAAAA;IACX,IAAA,EAAK,SAAA;IACL,YAAA,EAAYvoB,GAAAA;IACL,KAAA,EAAApkB,GAAAA;AAEN,IAAA,QAAA,EAAA0F,IAAM,GAAA,CAAA,CAAK5B,KAAM8B,GAAAA,qBAChBxF,IAAC8nB,EAAAA,EAAD;AAAiC,MAAA,OAAA,EAASD,GAAsBljB,GAAI,CAAA;AAAG,MAAA,QAAA,EAAUA,GAAAA,CAAK,QAAA;MACpF,QAAA,kBAAA3E,IAAC,QAAA,EAAD;QACE,IAAA,EAAK,QAAA;AACL,QAAA,YAAA,EAAY2E,GAAAA,CAAK,SAAA;AACjB,QAAA,QAAA,EAAUA,GAAAA,CAAK,QAAA;QACf,QAAA,EAAU2nC,GAAAA,CAAO,YAAYtsC,GAAC,CAAA;AAC9B,QAAA,SAAA,EAAWC,GAAAA,CAAE,OAAA;QACb,OAAA,EAAA,MAAegjD,IAAKjjD,GAAC,CAAA;QACrB,SAAA,EAAWssC,GAAAA,CAAO,UAAUtsC,GAAC,CAAA;AAE5B,QAAA,QAAA,EAAA2E,GAAAA,CAAK;OACA;KACM,EAZKA,GAAAA,CAAK,KAYV,CACjB;GACE,CAAA;AAET;;;AC5EA,SAAgBu+C,IAAQnkD,GAAAA,EAA4D;AAClF,EAAA,IAAI,OAAOuzB,GAAAA,IAAU,QAAA,IAAA,CAAYA,KAAgB,OAAO,KAAA;AACxD,EAAA,IAAM6iB,GAAAA,GAAQ7iB,GAAAA;AACd,EAAA,OAAO,OAAO6iB,GAAAA,CAAM,IAAA,IAAS,QAAA,IAAY,OAAOA,IAAM,KAAA,IAAU,QAAA;AAClE;AC0BA,SAAgBgO,IACdpkD,GAAAA,EAC8C;AAC9C,EAAA,IAAI,CAAC6B,GAAAA,CAAE,IAAA,EAAM,OAAO;AAAE,IAAA,GAAA,EAAKA,GAAAA,CAAE,GAAA;AAAK,IAAA,GAAA,EAAKA,GAAAA,CAAE,GAAA;AAAK,IAAA,IAAA,EAAMA,IAAE,IAAA,IAAQ;AAAE,GAAA;AAChE,EAAA,IAAM,EAAE,WAAAd,GAAAA,EAAA,GAAcc,IAAE,IAAA,EAClB2W,GAAAA,GAAK3W,IAAE,GAAA,KAAQ,MAAA,GAAY,SAAYwiD,GAAAA,CAAUxiD,GAAAA,CAAE,GAAG,CAAA,EACtD4W,GAAAA,GAAK5W,IAAE,GAAA,KAAQ,MAAA,GAAY,MAAA,GAAYwiD,GAAAA,CAAUxiD,GAAAA,CAAE,GAAG,GACtDk9C,GAAAA,GAAUvmC,GAAAA,KAAO,UAAaC,GAAAA,KAAO,MAAA,IAAaD,MAAKC,GAAAA,EACvD/N,GAAAA,GAAO7I,IAAE,IAAA,KAAS,MAAA,GACpB,IACA,IAAA,CAAK,GAAA,CAAIwiD,IAAUxiD,GAAAA,CAAE,IAAI,IAAIwiD,GAAAA,CAAU,CAAC,CAAC,CAAA,IAAKxiD,GAAAA,CAAE,IAAA;AACpD,EAAA,OAAO;AAAE,IAAA,GAAA,EAAKk9C,MAAUtmC,GAAAA,GAAKD,GAAAA;AAAI,IAAA,GAAA,EAAKumC,MAAUvmC,GAAAA,GAAKC,GAAAA;IAAI,IAAA,EAAAhS;AAAK,GAAA;AAChE;AAIA,SAAgB69C,IAAgBtkD,GAAAA,EAA+C;AAC7E,EAAA,OAAOy8C,IAAK,MAAA,KAAW,MAAA,GAAY,EAAE,GAAGA,GAAAA,CAAK,SAAQ,GAAI;AAAGA,IAAAA,CAAAA,GAAAA,CAAK,MAAA,GAAS,CAAA;AAAG,IAAA,GAAGA,GAAAA,CAAK;AAAQ,GAAA;AAC/F;AAGA,SAAgB8H,IAAWvkD,GAAAA,EAA0D;AACnF,EAAA,OAAO,MAAA,IAAU6iC,GAAAA;AACnB;AAIA,SAAgB2hB,GAAAA,CAAgBxkD,KAAiBe,GAAAA,EAAuB;AACtE,EAAA,IAAIgd,GAAAA,GAAe4U,GAAAA;AACnB,EAAA,KAAA,IAAWhiB,GAAAA,IAAO2sB,GAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,EAAG;AACjC,IAAA,IAAmB,OAAOvf,GAAAA,IAAQ,QAAA,IAAA,CAA9BA,GAAAA,EAAwC;AAC5C,IAAApZ,GAAAA,GAAOoZ,IAAgCpN,GAAAA,CAAAA;AACzC,EAAA;AACA,EAAA,OAAOoN,GAAAA;AACT;AAMA,SAAgB0mC,GAAAA,CACdzkD,KACAe,GAAAA,EACU;AACV,EAAA,IAAIwjD,GAAAA,CAAW1hB,GAAI,CAAA,EAAG,OAAOA,IAAK,MAAA,IAAU,CAAC6hB,MAAa,IAAA,GAAO7hB,GAAAA;AACjE,EAAA,IAAMn8B,GAAAA,GAAQm8B,GAAAA,EACRt9B,GAAAA,GAAyD,EAAC;AAChE,EAAA,KAAA,IAAW,CAACssB,KAAK5F,GAAAA,CAAAA,IAAU,OAAO,OAAA,CAAQvlB,GAAAA,CAAM,QAAQ,CAAA,EAAG;AACzD,IAAA,IAAM85C,GAAAA,GAAOiE,GAAAA,CAAmBx4B,GAAAA,EAAOy4B,GAAU,CAAA;AAC7ClE,IAAAA,GAAAA,KAAMh8C,GAAAA,CAASqtB,GAAAA,CAAAA,GAAO2uB,GAAAA,CAAAA;AAC5B,EAAA;AAEA,EAAA,OADI,OAAO,IAAA,CAAKj7C,GAAQ,CAAA,CAAE,MAAA,KAAW,IAAU,IAAA,GACxC;IAAE,GAAGs9B,GAAAA;IAAM,QAAA,EAAAr+B;AAAS,GAAA;AAC7B;AAgBA,SAASmgD,IAAgB3kD,GAAAA,EAA4C;AACnE,EAAA,IAAIukD,GAAAA,CAAW1hB,GAAI,CAAA,EAAG,OAAO,CAAA;AAC7B,EAAA,IAAIl+B,GAAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAWsnB,GAAAA,IAAS,OAAO,MAAA,CAAO4W,GAAAA,CAAK,QAAQ,CAAA,EAAG9hC,GAAAA,IAAK4jD,GAAAA,CAAgB14B,GAAK,CAAA;AAC5E,EAAA,OAAOtnB,GAAAA;AACT;AAUA,SAAgBigD,IAAc5kD,GAAAA,EAAqC;AACjE,EAAA,IAAMuG,GAAAA,GAAwB,EAAC,EACzBs+C,GAAAA,GAAQ,MAAA,CAAO,MAAA,CAAOjY,GAAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,CAAO2X,GAAU,CAAA,CAAE,MAAA;AAC1DM,EAAAA,GAAAA,GAAQ,CAAA,IACVt+C,GAAAA,CAAM,IAAA,CAAK;IAAE,IAAA,EAAM,EAAA;AAAI,IAAA,IAAA,EAAMqmC,GAAAA,CAAK,IAAA;IAAM,KAAA,EAAO,CAAA;IAAG,OAAA,EAAS,EAAA;IAAI,OAAA,EAASiY;GAAO,CAAA;AAEjF,EAAA,KAAA,IAAW,CAAChzB,GAAAA,EAAK5F,GAAAA,CAAAA,IAAU,MAAA,CAAO,OAAA,CAAQ2gB,GAAAA,CAAK,QAAQ,CAAA,EACrD,IAAI,CAAA1rC,GAAAA,CAAW+qB,GAAK,CAAA,EACpB;QAAM,IAAA,CAAK;MACT,IAAA,EAAM4F,GAAAA;AACN,MAAA,IAAA,EAAM5F,GAAAA,CAAM,IAAA;MACZ,KAAA,EAAO,CAAA;MACP,OAAA,EAAS4F,GAAAA;AACT,MAAA,OAAA,EAAS8yB,IAAgB14B,GAAK;KAC/B,CAAA;AACD,IAAA,KAAA,IAAW,CAAC64B,GAAAA,EAAQC,GAAAA,CAAAA,IAAQ,OAAO,OAAA,CAAQ94B,GAAAA,CAAM,QAAQ,CAAA,EACnDs4B,GAAAA,CAAWQ,GAAG,CAAA,IAClBx+C,IAAM,IAAA,CAAK;MACT,IAAA,EAAM,CAAA,EAAGsrB,GAAAA,CAAAA,CAAAA,EAAOizB,GAAAA,CAAAA,CAAAA;AAChB,MAAA,IAAA,EAAMC,GAAAA,CAAI,IAAA;MACV,KAAA,EAAO,CAAA;MACP,OAAA,EAASlzB,GAAAA;AACT,MAAA,OAAA,EAAS8yB,IAAgBI,GAAG;KAC7B,CAAA;AATF,EAAA;AAYH,EAAA,OAAOx+C,GAAAA;AACT;AAGA,SAASy+C,GAAAA,CAAgBhlD,GAAAA,EAAoBe,GAAAA,EAAc4D,GAAAA,EAAwB;AAGjF,EAAA,OAFIsgD,IAAK,IAAA,CAAK,WAAA,GAAc,QAAA,CAASC,GAAK,KACtCD,GAAAA,CAAK,WAAA,EAAa,aAAY,CAAE,QAAA,CAASC,GAAK,CAAA,GAAU,IAAA,GACrD5nB,IAAK,WAAA,EAAY,CAAE,SAAS4nB,GAAK,CAAA;AAC1C;AAUA,SAAgBC,GAAAA,CACdnlD,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,GAAO,EAAA,EACG;AACV,EAAA,IAAMs1B,GAAAA,GAAIirB,GAAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,EAAA,IAAIjrB,GAAAA,KAAM,IAAI,OAAO4I,GAAAA;AACrB,EAAA,IAAI0hB,GAAAA,CAAW1hB,GAAI,CAAA,EAAG,OAAOmiB,IAAgBniB,GAAAA,EAAMvF,GAAAA,EAAMrD,GAAC,CAAA,GAAI4I,GAAAA,GAAO,IAAA;AACrE,EAAA,IAAMn8B,GAAAA,GAAQm8B,GAAAA;AACd,EAAA,IAAIn8B,IAAM,IAAA,CAAK,WAAA,GAAc,QAAA,CAASuzB,GAAC,GAAG,OAAO4I,GAAAA;AACjD,EAAA,IAAMt9B,MAAyD,EAAC;AAChE,EAAA,KAAA,IAAW,CAACssB,KAAK5F,GAAAA,CAAAA,IAAU,OAAO,OAAA,CAAQvlB,GAAAA,CAAM,QAAQ,CAAA,EAAG;AACzD,IAAA,IAAM85C,GAAAA,GAAO2E,GAAAA,CAAkBl5B,GAAAA,EAAOgO,GAAAA,EAAGqD,GAAAA,KAAS,EAAA,GAAKzL,GAAAA,GAAM,CAAA,EAAGyL,GAAAA,CAAAA,CAAAA,EAAQzL,GAAAA,CAAAA,CAAK,CAAA;AACzE2uB,IAAAA,GAAAA,KAAM/5C,GAAAA,CAASorB,GAAAA,CAAAA,GAAO2uB,GAAAA,CAAAA;AAC5B,EAAA;AAEA,EAAA,OADI,OAAO,IAAA,CAAKj7C,GAAQ,CAAA,CAAE,MAAA,KAAW,IAAU,IAAA,GACxC;IAAE,GAAGs9B,GAAAA;IAAM,QAAA,EAAAp8B;AAAS,GAAA;AAC7B;ACpJA,SAAgB2+C,GAAAA,CAAeplD,KAAgBe,GAAAA,EAAoD;AACjG,EAAA,IAAM,EAAE,KAAA,EAAAE,GAAAA,EAAO,KAAA,EAAAC,GAAAA,GAAQ,KAAA,EAAO,KAAA,EAAAjB,GAAAA,GAAQ,KAAA,EAAO,QAAA,EAAAkB,GAAAA,EAAU,QAAA,EAAAC,KAAA,GAAa+pB,GAAAA;AACpE,EAAA,IAAIk6B,GAAAA,CAAK,SAAS,aAAA,EAAe;AAC/B,IAAA,IAAM5P,GAAAA,GAAStqB,GAAAA,CAAM,WAAA,GAAcA,GAAAA,CAAM,YAAY,MAAA,GAASs1B,GAAAA,EAAU,UAAA,EAClE75B,GAAAA,GAAQuE,GAAAA,CAAM,WAAA,GAAcA,GAAAA,CAAM,WAAA,CAAY,QAAQs1B,GAAAA,EAAU,SAAA;AACtE,IAAA,OAAO;MACL,IAAA,EAAM,aAAA;MACN,KAAA,EAAO,OAAOltB,GAAAA,IAAU,QAAA,GAAWA,GAAAA,GAAQ,MAAA;MAC3C,KAAA,EAAAryB,GAAAA;MACA,KAAA,EAAAjB,GAAAA;MACA,QAAA,EAAUqlD,GAAAA;MACV,MAAA,EAAQ,OAAO7P,GAAAA,IAAW,QAAA,GAAWA,GAAAA,GAAS,MAAA;MAC9C,SAAA,EAAW7uB,GAAAA,KAAU,WAAW,QAAA,GAAW;AAC7C,KAAA;AACF,EAAA;AACA,EAAA,IAAI,CAAC2+B,iBAAAA,CAAkBF,GAAI,CAAA,EAAG,OAAO,IAAA;AACrC,EAAA,QAAQA,IAAK,IAAA;IACX,KAAK,SAAA;AACH,MAAA,OAAO;QACL,IAAA,EAAM,SAAA;AACN,QAAA,OAAA,EAASA,GAAAA,CAAK,OAAA;QACd,KAAA,EAAO,OAAO9xB,GAAAA,IAAU,SAAA,GAAYA,GAAAA,GAAQ,MAAA;QAC5C,KAAA,EAAAryB,GAAAA;QACA,KAAA,EAAAjB,GAAAA;AACA,QAAA,KAAA,EAAOulD,GAAAA,CAAQH,GAAAA,CAAK,IAAI,CAAA,IAAKA,GAAAA,CAAK,KAAA;QAClC,QAAA,EAAUC;AACZ,OAAA;AACF,IAAA,KAAK,QAAA,EAAU;AACb,MAAA,IAAM7I,GAAAA,GAAO4I,GAAAA,CAAK,IAAA,EACZI,GAAAA,GAAS,OAAOlyB,GAAAA,IAAU,QAAA,IAAY,MAAA,CAAO,QAAA,CAASA,GAAK,CAAA,GAAIA,GAAAA,GAAQ,QAIvEmyB,GAAAA,GAAStB,GAAAA,CAAkBiB,GAAI,CAAA,EAC/BvZ,GAAAA,GAAAA,CAAS9rC,GAAAA,KACb,IAAA,CAAK,IAAI0lD,GAAAA,CAAO,GAAA,IAAO,QAAA,EAAU,IAAA,CAAK,GAAA,CAAIA,GAAAA,CAAO,GAAA,IAAO,CAAA,QAAA,EAAW/gD,GAAC,CAAC,CAAA;AAEvE,MAAA,OAAO;QACL,IAAA,EAAM,QAAA;AACN,QAAA,OAAA,EAAS0gD,GAAAA,CAAK,OAAA;AACd,QAAA,KAAA,EAAOI,QAAW,MAAA,GAAY,MAAA,GAAYhJ,MAAOA,GAAAA,CAAK,SAAA,CAAUgJ,GAAM,CAAA,GAAIA,GAAAA;QAC1E,KAAA,EAAAvkD,GAAAA;QACA,KAAA,EAAAjB,GAAAA;AACA,QAAA,GAAA,EAAKylD,GAAAA,CAAO,GAAA;AACZ,QAAA,GAAA,EAAKA,GAAAA,CAAO,GAAA;AACZ,QAAA,IAAA,EAAMA,GAAAA,CAAO,IAAA;AACb,QAAA,IAAA,EAAMjJ,GAAAA,EAAM,MAAA;QACZ,OAAA,EAASA,GAAAA,GAAO6H,GAAAA,CAAgB7H,GAAI,CAAA,GAAI,MAAA;AACxC,QAAA,QAAA,EAAU4I,GAAAA,CAAK,MAAA;AACf,QAAA,QAAA,EAAA,CAbarlD,GAAAA,KAAkBslD,GAAAA,CAAS7I,GAAAA,GAAOA,GAAAA,CAAK,WAAA,CAAY3Q,GAAAA,CAAMtO,GAAK,CAAC,CAAA,GAAIsO,GAAAA,CAAMtO,GAAK,CAAC;AAc9F,OAAA;AACF,IAAA;IACA,KAAK,QAAA;AACH,MAAA,OAAO;QACL,IAAA,EAAM,QAAA;AACN,QAAA,OAAA,EAAS6nB,GAAAA,CAAK,OAAA;QACd,KAAA,EAAO,OAAO9xB,GAAAA,IAAU,QAAA,GAAWA,GAAAA,GAAQ,EAAA;QAC3C,KAAA,EAAAryB,GAAAA;QACA,KAAA,EAAAjB,GAAAA;QACA,QAAA,EAAUqlD;AACZ,OAAA;AACF,IAAA,KAAK,MAAA,EAAQ;AACX,MAAA,IAAMK,MAAWN,GAAAA,CAAK,QAAA,EAKhBO,MAASD,GAAAA,GACXvY,GAAAA,GACE,SACAuY,GAAAA,CAAS,IAAA,CAAKpyB,KAAOktB,GAAQ,CAAA,GAC/BrT,OAAS2L,GAAAA,GACP,MAAA,GACA,OAAOxlB,GAAAA,IAAU,QAAA,GACfA,MACA8xB,GAAAA,CAAK,OAAA;AACb,MAAA,OAAO;QACL,IAAA,EAAM,MAAA;AACN,QAAA,OAAA,EAASA,GAAAA,CAAK,OAAA;QACd,KAAA,EAAOO,GAAAA;QACP,KAAA,EAAA1kD,GAAAA;QACA,KAAA,EAAAjB,GAAAA;AACA,QAAA,OAAA,EAASolD,GAAAA,CAAK,OAAA,CAAQ,GAAA,CAAA,CAAKrlD,GAAAA,MAAO;AAChC,UAAA,KAAA,EAAO2I,GAAAA,CAAE,KAAA;AACT,UAAA,KAAA,EAAOA,GAAAA,CAAE,KAAA;AACT,UAAA,KAAA,EAAO68C,GAAAA,CAAQ78C,GAAAA,CAAE,IAAI,CAAA,IAAKA,GAAAA,CAAE,KAAA;AAC5B,UAAA,QAAA,EAAUA,GAAAA,CAAE;SACd,CAAE,CAAA;QACF,QAAA,EAAA,CAAW3I,QAAiBslD,GAAAA,CAASK,GAAAA,GAAWA,IAAS,KAAA,CAAMv6C,GAAAA,EAAMq1C,GAAQ,CAAA,GAAIr1C,GAAI;AACvF,OAAA;AACF,IAAA;IACA,KAAK,OAAA;AACH,MAAA,OAAO;QACL,IAAA,EAAM,OAAA;AACN,QAAA,KAAA,EAAO,OAAOmoB,GAAAA,IAAU,QAAA,GAAWA,GAAAA,GAAQ8xB,GAAAA,CAAK,OAAA;QAChD,KAAA,EAAAnkD,GAAAA;QACA,KAAA,EAAAjB,GAAAA;QACA,KAAA,EAAOolD,GAAAA,CAAK,QAAQ,IAAA,GAAO,MAAA;QAC3B,QAAA,EAAUC;AACZ,OAAA;IACF,KAAK,OAAA;AAcH,MAAA,OAAO;QACL,IAAA,EAAM,OAAA;AACN,QAAA,KAAA,EAXA/xB,GAAAA,KAAU,IAAA,GACN,IAAA,GACA4wB,GAAAA,CAAQ5wB,GAAK,CAAA,GACXA,GAAAA,GACA6Z,GAAAA,GACE,MAAA,GACA+W,GAAAA,CAAQkB,GAAAA,CAAK,OAAO,CAAA,GAClBA,IAAK,OAAA,GACL,IAAA;QAIV,KAAA,EAAAnkD,GAAAA;QACA,KAAA,EAAAjB,GAAAA;QACA,QAAA,EAAUqlD;AACZ,OAAA;IAEF,KAAK,QAAA;AACH,MAAA,OAAO,IAAA;AACT,IAAA;AAIE,MAAA,MAAU,KAAA,CACR,CAAA,mDAAA,EAAuDpJ,GAAAA,CAAiC,IAAA,CAAA,CAAA,CAC1F,CAAA;AAEJ;AACF;AAGA,SAASsJ,IAAQ7gD,GAAAA,EAAqC;AACpD,EAAA,OAAOoC,GAAAA,IAAQA,GAAAA,IAAQ1G,EAAAA,mBAAaY,IAACD,CAAAA,EAAD;IAAM,IAAA,EAAM+F,GAAAA;IAAkB,IAAA,EAAM;AAAK,GAAA,CAAA,GAAI,MAAA;AACnF;;;;;AC/HA,SAAgB8+C,IAAU,EACxB,QAAA,EAAArhD,KACA,QAAA,EAAAvD,GAAAA,GAAW,QACX,IAAA,EAAAwF,GAAAA,EACA,SAAAkC,GAAAA,EACA,KAAA,EAAAzH,KACA,GAAA,EAAAjB,GAAAA,EACA,WAAAkB,GAAAA,EACA,GAAGsD,KAAAA,EACc;AACjB,EAAA,IAAMmC,GAAAA,GAAM,CAAC1F,GAAAA,CAAE,GAAA,EAAKkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EACjDwhB,MAAmCwP,GAAAA,KAAQ,MAAA,GAE7C,MAAA,GADA,EAAG,iBAAA,EAA6B,OAAOA,OAAQ,QAAA,GAAW,CAAA,EAAGA,GAAAA,CAAAA,EAAAA,CAAAA,GAAUA,GAAAA,EAAI;AAE/E,EAAA,uBACEr1B,IAAC,MAAA,EAAD;IAAM,SAAA,EAAW6F,GAAAA;IAAY,KAAA,EAAA9B,GAAAA;AAAO,IAAA,YAAA,EAAYL,IAAK,YAAA,CAAA;AAClD,IAAA,QAAA,EAAA6L,GAAAA,CAAS,GAAA,CAAA,CAAKrQ,GAAAA,EAAKkB,GAAAA,KAAM;AACxB,MAAA,IAAM2kD,GAAAA,GAAoB7kD,GAAAA,KAAM,CAAA,GAAI8kD,GAAAA,GAAYz1C,GAAAA,CAASrP,GAAAA,GAAI,CAAA,CAAA,CAAG,MAAA,IAAU,MAAA,EACpE+kD,GAAAA,GAAqBr1C,GAAAA,CAAI,MAAA,IAAU,MAAA;AACzC,MAAA,uBACE5P,IAAC+iB,EAAAA,EAAD;QAEE,IAAA,EAAK,WAAA;QACL,UAAA,EAAY;UAAE,QAAA,EAAA1iB,GAAAA;UAAU,SAAA,EAAAC,GAAAA;AAAW,UAAA,GAAI8M,GAAAA,KAAU,MAAA,IAAa,EAAE,KAAA,EAAAjN,GAAAA;AAAS,SAAA;AACzE,QAAA,MAAA,EAAQyP,GAAAA,CAAI,MAAA;AACZ,QAAA,MAAA,EAAQA,GAAAA,CAAI,MAAA;AACZ,QAAA,IAAA,EAAMA,GAAAA,CAAI,IAAA;AACV,QAAA,OAAA,EAASA,IAAI,OAAA,IAAWjI,GAAAA;AACxB,QAAA,IAAA,EAAMiI,IAAI,IAAA,IAAQnP,GAAAA;AAClB,QAAA,OAAA,EAASmP,GAAAA,CAAI,OAAA;AACb,QAAA,IAAA,EAAMA,GAAAA,CAAI,IAAA;AACV,QAAA,YAAA,EAAYA,IAAI,YAAA,CAAA;AAChB,QAAA,SAAA,EAAWzP,GAAAA,CAAE,OAAA;AAEZ,QAAA,QAAA,EAAAyP,GAAAA,CAAI;AACA,OAAA,EAdA1P,GAcA,CAAA;IAEX,CAAC;GACG,CAAA;AAEV;ACrEA,SAAgBglD,GAAAA,CACdjmD,GAAAA,EACAe,GAAAA,GAAQ,CAAA,EACO;AACf,EAAA,IAAIouB,GAAAA,GAAwB,IAAA;AAC5B,EAAA,KAAA,IAAW,EAAE,EAAA,EAAA3qB,GAAAA,EAAI,GAAA,EAAAvD,GAAAA,MAASilD,GAAAA,EAAS;AACjC,IAAA,IAAIx3C,GAAAA,GAAMy3C,MAAQ,CAAA,EAAG;AACrB,IAAAxhD,GAAAA,GAAS4lB,GAAAA;AACX,EAAA;AACA,EAAA,OAAO4E,GAAAA;AACT;AA4BA,IAAMi3B,GAAAA,GAAY,GAAA;AASlB,SAAgBC,IAAarmD,GAAAA,EAAyC;AACpE,EAAA,IAAM,EAAE,OAAA,EAAAe,GAAAA,EAAS,GAAA,EAAA4D,KAAK,KAAA,EAAAH,GAAAA,EAAA,GAAUsuB,GAAAA,EAC1B,CAAC3D,GAAAA,EAAQm3B,GAAAA,CAAAA,GAAapiD,QAAAA,CAAwB,IAAI,CAAA,EAGlDqiD,GAAAA,GAAU78C,MAAAA,CAAsB,IAAI,GACpC88C,GAAAA,GAAW98C,MAAAA,CAA6C,IAAI,CAAA,EAC5D+8C,MAAa/8C,MAAAA,CAA4B,IAAI,CAAA,EAC7CmoB,GAAAA,GAAMpF,IAAI,IAAA,CAAK,IAAQ,CAAA,EAEvBkJ,GAAAA,GAAUrK,YAAAA,MAAwB;AACtC,IAAA,IAAMshB,MAAOH,GAAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAACG,GAAAA,EAAM;AACX,IAAA,IAAI2Z,GAAAA,CAAQ,YAAY,IAAA,EAAM;AAC5B,MAAA9/C,GAAAA,CAAU8/C,IAAQ,OAAO,CAAA;AACzB,MAAA;AACF,IAAA;AACA,IAAA,IAAMG,MAAU9Z,GAAAA,CAAK,qBAAA,EAAsB,CAAE,GAAA,EACvCsZ,MAA2B,EAAC;AAClC,IAAA,KAAA,IAAW37B,OAAMkC,GAAAA,EAAK;AACpB,MAAA,IAAMxjB,GAAAA,GAAK2jC,IAAK,aAAA,CAA2B,CAAA,mBAAA,EAAsB,IAAI,MAAA,CAAOriB,GAAE,CAAA,CAAA,EAAA,CAAK,CAAA;AAC/EthB,MAAAA,GAAAA,IAAIi9C,IAAQ,IAAA,CAAK;QAAE,EAAA,EAAAnlD,GAAAA;QAAI,GAAA,EAAKkI,GAAAA,CAAG,qBAAA,EAAsB,CAAE,GAAA,GAAMy9C;OAAS,CAAA;AAC5E,IAAA;AACA,IAAAjgD,GAAAA,CAAUw/C,GAAAA,CAAkBC,GAAAA,EAASC,GAAK,CAAC,CAAA;EAI7C,CAAA,EAAG;AAAC1Z,IAAAA,GAAAA;AAAS5a,IAAAA,GAAAA;AAAKs0B,IAAAA;GAAM,CAAA;AAExB,EAAAphD,UAAA,MAAgB;AACd,IAAA,IAAM6nC,MAAOH,GAAAA,CAAQ,OAAA;AACrB,IAAA,IAAKG,KAGL,OAFAjX,GAAAA,EAAQ,EACRiX,GAAAA,CAAK,iBAAiB,QAAA,EAAUjX,GAAAA,EAAS,EAAE,OAAA,EAAS,MAAM,CAAA,EAAA,MAC7CiX,GAAAA,CAAK,mBAAA,CAAoB,UAAUjX,GAAO,CAAA;EACzD,CAAA,EAAG,CAAC8W,GAAAA,EAAS9W,GAAO,CAAC,CAAA;AAErB,EAAA,IAAMgxB,GAAAA,GAAWr7B,WAAAA,CAAAA,CAAatrB,GAAAA,KAAqB;AACjD,IAAA,IAAM4sC,MAAOH,GAAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAACG,GAAAA,EAAM;AACX,IAAA,IAAM3jC,GAAAA,GAAK2jC,IAAK,aAAA,CAA2B,CAAA,mBAAA,EAAsB,IAAI,MAAA,CAAOriB,GAAE,CAAA,CAAA,EAAA,CAAK,CAAA;AACnF,IAAA5hB,GAAAA,CAAQ,OAAA,GAAU4hB,GAAAA,EAClB+7B,GAAAA,CAAU/7B,GAAE,CAAA;AACZ,IAAA,IAAMq8B,MAAAA,MAAsB;AAC1B,MAAAj+C,GAAAA,CAAQ,UAAU,IAAA,EAClBikC,GAAAA,CAAK,oBAAoB,WAAA,EAAaga,GAAO,GAC7CjxB,GAAAA,EAAQ;AACV,IAAA,CAAA;AAQA,IAAA,IALA8wB,GAAAA,CAAW,OAAA,IAAU,EACjBD,GAAAA,CAAS,OAAA,KAAY,QAAM,YAAA,CAAaA,GAAAA,CAAS,OAAO,CAAA,EAC5DvmD,GAAAA,CAAW,OAAA,GAAU2mD,KACrB1lD,GAAAA,CAAS,OAAA,GAAU,UAAA,CAAW0lD,GAAAA,EAASR,GAAS,CAAA,EAChDxZ,GAAAA,CAAK,gBAAA,CAAiB,WAAA,EAAaga,GAAO,CAAA,EACtC,CAAC39C,GAAAA,EAAI;AACT,IAAA,IAAMyF,GAAAA,GAAMzF,IAAG,qBAAA,EAAsB,CAAE,MAAM2jC,GAAAA,CAAK,qBAAA,EAAsB,CAAE,GAAA,GAAMA,GAAAA,CAAK,SAAA;AACrF,IAAAjoC,IAAK,QAAA,GAAW;MAAE,GAAA,EAAAxD,GAAAA;MAAK,QAAA,EAAU0lD,GAAAA,KAAyB,MAAA,GAAS;KAAU,CAAA;EAC/E,CAAA,EAAG,CAACpa,GAAAA,EAAS9W,GAAO,CAAC,CAAA;AAOrB,EAAA,OALAd,SAAAA,CAAAA,MAAAA,MAAsB;AAChB2xB,IAAAA,GAAAA,CAAS,YAAY,IAAA,IAAM,YAAA,CAAaA,IAAS,OAAO,CAAA,EAC5DC,IAAW,OAAA,IAAU;EACvB,CAAA,EAAG,EAAE,CAAA,EAEE;IAAE,MAAA,EAAAxlD,GAAAA;IAAQ,QAAA,EAAAI;AAAS,GAAA;AAC5B;AAEA,SAASwlD,GAAAA,GAAgC;AACvC,EAAA,OAAO,OAAO,UAAA,IAAe,UAAA,IACxB,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AACtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClGA,SAAgBC,EAAAA,CAAQ,EAAE,GAAA,EAAA9mD,GAAAA,EAAK,MAAA2E,GAAAA,EAAM,IAAA,EAAAH,KAAA,EAAwD;AAC3F,EAAA,IAAMihD,MAASjB,GAAAA,CAAgB/8C,GAAAA,CAAI,MAAA,EAAQ61B,GAAI,GACzCypB,GAAAA,GAA+B;IACnC,IAAA,EAAApiD,GAAAA;IACA,IAAA,EAAAH,GAAAA;IACA,KAAA,EAAOihD,GAAAA,KAAW,MAAA,GAAqBR,GAAAA,CAAK,OAAA,GAAdQ,GAAAA;AAC9B,IAAA,QAAA,EAAA,CAAW1kD,GAAAA,KAAM0G,GAAAA,CAAI,QAAA,CAAS61B,KAAMz9B,GAAC,CAAA;IAErC,IAAA,EAAM,KAAA;AACN,IAAA,OAAA,EAAA,MAAe;AAAC,IAAA;AAClB,GAAA,EAEMmnD,GAAAA,GAASv/C,GAAAA,CAAI,SAAA,GAAYw9C,GAAAA,CAAK,IAAA,CAAA,EAC9Bl7B,GAAAA,GAAUi9B,GAAAA,GAASA,GAAAA,CAAOD,GAAS,CAAA,GAAIE,EAAAA,CAAcF,GAAS,CAAA;AAOpE,EAAA,OANIC,OAAUj9B,GAAAA,KAAY,IAAA,GAAa,IAAA,GAInCk7B,GAAAA,CAAK,wBAAcngD,GAAAA,CAAAG,QAAAA,EAAA,EAAA,UAAG8kB,GAAAA,EAAU,CAAA,mBAGlCjlB,IAACq1C,EAAAA,EAAD;AACE,IAAA,KAAA,EAAO8K,GAAAA,CAAK,IAAA;AACZ,IAAA,WAAA,EAAaA,GAAAA,CAAK,WAAA;IAClB,MAAA,EAAO,QAAA;IACP,MAAA,EAAO,QAAA;AACP,IAAA,SAAA,EAAW/jD,GAAAA,CAAE,GAAA;IAEb,QAAA,kBAAA4D,IAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAW5D,GAAAA,CAAE,UAAA;MAAa,QAAA,EAAA6oB;KAAc;GACnC,CAAA;AAEjB;AAEA,SAASk9B,EAAAA,CACPjnD,KAGAe,GAAAA,EACW;AACX,EAAA,IAAM,EAAE,IAAA,EAAAyD,GAAAA,EAAM,OAAAvD,GAAAA,EAAO,QAAA,EAAAwF,KAAA,GAAagB,GAAAA;AAClC,EAAA,IAAIw9C,GAAAA,CAAK,IAAA,KAAS,QAAA,EAAU,uBAAOngD,IAACoiD,EAAAA,EAAD,EAAiB,GAAA,EAAAlnD,GAAAA,EAAM,CAAA;AAC1D,EAAA,IAAMk7C,GAAAA,GAAQkK,IAAeH,GAAAA,EAAM;IAAE,KAAA,EAAAhkD,GAAAA;IAAO,QAAA,EAAAF,GAAAA;IAAU,QAAA,EAAA0F;GAAU,CAAA;AAMhE,EAAA,OALIy0C,GAAAA,KAAU,IAAA,mBAGLr5C,IAAAA,CAAC,MAAA,EAAD;AAAM,IAAA,SAAA,EAAWX,GAAAA,CAAE,YAAA;IAAnB,QAAA,EAAA;AAAiC,MAAA,GAAA;MAAE+jD,GAAAA,CAAK,IAAA;AAAK,MAAA;AAAoB;AAEnE,GAAA,CAAA,mBAAAngD,IAAC62C,EAAAA,EAAD;IAAiB,GAAIT,GAAAA;IAAO,MAAA,EAAO,QAAA;AAAS,IAAA,IAAA,EAAM+J,GAAAA,CAAK;GAAO,CAAA;AACvE;AAIA,SAASiC,EAAAA,CAAW,EAAE,GAAA,EAAAlnD,GAAAA,EAAA,EAAmC;AACvD,EAAA,IAAMilD,MAAOx9C,GAAAA,CAAI,IAAA,EACX,EAAE,KAAA,EAAAjD,GAAAA,EAAO,UAAAvD,GAAAA,EAAA,GAAawG,KACtB0/C,GAAAA,GAAO,OAAO5zB,OAAU,QAAA,IAAYA,GAAAA,GACrCA,MACD,MAAA,EACE6zB,GAAAA,GAAAA,CAAclmD,GAAAA,KAAgE;AAClF,IAAA,IAAMoS,MAAmB,EAAC;AAC1B,IAAA,KAAA,IAAW,CAACue,GAAAA,EAAK5F,GAAAA,KAAU,MAAA,CAAO,OAAA,CAAQ1mB,GAAQ,CAAA,EAAG;AACnD,MAAA,IAAI,CAACg/C,GAAAA,CAAWt4B,GAAK,CAAA,EAAG;AACtB,QAAA,IAAMpO,GAAAA,GAAQupC,GAAAA,CAAWn7B,GAAAA,CAAM,QAAQ,CAAA;AACvC,QAAA,IAAIpO,GAAAA,CAAM,WAAW,CAAA,EAAG;AACxB,QAAA1c,GAAAA,CAAI,IAAA,iBAAK2D,GAAAA,CAAC,IAAA,EAAD;AAAyB,UAAA,SAAA,EAAW5D,GAAAA,CAAE,WAAA;AAAc,UAAA,QAAA,EAAA+qB,GAAAA,CAAM;AAAS,SAAA,EAA1D,CAAA,MAAA,EAAS4F,GAAAA,CAAAA,CAAiD,CAAA,EAAG,GAAGhU,GAAK,CAAA;AACvF,QAAA;AACF,MAAA;AACA,MAAA1c,GAAAA,CAAI,IAAA,iBACF2D,GAAAA,CAACq1C,EAAAA,EAAD;AAEE,QAAA,KAAA,EAAOluB,GAAAA,CAAM,IAAA;QACb,MAAA,EAAO,QAAA;QACP,MAAA,EAAO,QAAA;AACP,QAAA,SAAA,EAAW/qB,GAAAA,CAAE,SAAA;QAEb,QAAA,kBAAA4D,IAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAW5D,GAAAA,CAAE,UAAA;AAChB,UAAA,QAAA,EAAA+lD,EAAAA,CAAc;AACb,YAAA,IAAA,EAAM,CAAA,EAAGx/C,GAAAA,CAAI,IAAA,CAAA,CAAA,EAAQoqB,GAAAA,CAAAA,CAAAA;YACrB,IAAA,EAAM5F,GAAAA;AACN,YAAA,KAAA,EAAOk7B,MAAOt1B,GAAAA,CAAAA;AACd,YAAA,QAAA,EAAA,CAAW7xB,GAAAA,KAAM;AACf,cAAA,IAAMkmB,MAAOihC,GAAAA,IAAQlC,GAAAA,CAAK,UAAA,GAAa1xB,GAAK,KAAK,EAAC;AAClD,cAAAtyB,GAAAA,CAAS;gBAAE,GAAGilB,GAAAA;AAAO2L,gBAAAA,CAAAA,GAAAA,GAAMhyB;eAAG,CAAA;AAChC,YAAA,CAAA;AAGA,YAAA,IAAA,EAAM4H,GAAAA,CAAI,IAAA;AACV,YAAA,OAAA,EAASA,GAAAA,CAAI;AACf,WAAA,EAAG0/C,GAAI;SACH;AACK,OAAA,EArBNt1B,GAqBM,CACf,CAAA;AACF,IAAA;AACA,IAAA,OAAOve,GAAAA;AACT,EAAA,CAAA;AACA,EAAA,uBAAOxO,IAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAW5D,GAAAA,CAAE,UAAA;IAAa,QAAA,EAAAkmD,GAAAA,CAAWnC,IAAK,QAAQ;GAAO,CAAA;AACvE;AC/GA,SAAgBoC,GAAUrnD,GAAAA,EAAuB;AAC/C,EAAA,IAAM,EAAE,GAAA,EAAAe,GAAAA,EAAK,KAAA,EAAA4D,GAAAA,EAAO,MAAAH,GAAAA,EAAM,SAAA,EAAAvD,GAAAA,EAAW,SAAA,EAAAwF,GAAAA,EAAA,GAAc/B,KAC7C4iD,GAAAA,GAAS,MAAA,CAAO,OAAA,CAAQ5gD,GAAAA,CAAM,QAAQ,CAAA,CAAE,OAAA,CAC3C1G,GAAAA,KAAuCukD,GAAAA,CAAWxzB,GAAAA,CAAM,CAAA,CAAE,CAC7D,CAAA,EACMw2B,GAAAA,GAAS,MAAA,CAAO,OAAA,CAAQ7gD,GAAAA,CAAM,QAAQ,EAAE,MAAA,CAAA,CAC3C1G,GAAAA,KAAwC,CAACukD,GAAAA,CAAWxzB,GAAAA,CAAM,CAAA,CAAE,CAC/D,CAAA,EACMy2B,GAAAA,GAAAA,CAAaxnD,GAAAA,KAAyBs9B,GAAAA,KAAS,EAAA,GAAKzL,GAAAA,GAAM,CAAA,EAAGyL,GAAAA,CAAAA,CAAAA,EAAQzL,GAAAA,CAAAA,CAAAA;AAE3E,EAAA,uBACEhwB,KAAC,KAAA,EAAD;IAAK,SAAA,EAAW,CAACX,IAAE,IAAA,EAAMkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAAG,GAAA,EAAKqiD,GAAAA;IAApE,QAAA,EAAA;AACE,sBAAA5lD,KAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAWX,GAAAA,CAAE,QAAA;QAAlB,QAAA,EAAA,iBACE4D,GAAAA,CAAC,IAAA,EAAD;AAAI,UAAA,SAAA,EAAW5D,GAAAA,CAAE,SAAA;AAAY,UAAA,QAAA,EAAAwF,GAAAA,CAAM;AAAS,SAAA,GAC3CA,GAAAA,CAAM,WAAA,KAAgB,MAAA,oBACrB5B,IAAC,GAAA,EAAD;AAAG,UAAA,SAAA,EAAW5D,GAAAA,CAAE,QAAA;AAAW,UAAA,QAAA,EAAAwF,GAAAA,CAAM;AAAe,SAAA,CAE/C;;AACJ4gD,MAAAA,GAAAA,CAAO,MAAA,GAAS,CAAA,oBACfxiD,GAAAA,CAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAW5D,GAAAA,CAAE,IAAA;QACf,QAAA,EAAAomD,GAAAA,CAAO,IAAA,CAAK,CAACz1B,KAAKwzB,GAAAA,CAAAA,qBACjBvgD,GAAAA,CAACgiD,EAAAA,EAAD;UAAwB,GAAA,EAAA/lD,GAAAA;AAAK,UAAA,IAAA,EAAMymD,IAAU31B,GAAG,CAAA;UAAG,IAAA,EAAMwzB;AAAO,SAAA,EAAlDxzB,GAAkD,CACjE;OACE,CAAA;MAEN01B,GAAAA,CAAO,GAAA,CAAA,CAAK,CAAC11B,GAAAA,EAAK5F,GAAAA,CAAAA,qBACjBnnB,IAAC4iD,EAAAA,EAAD;QAEO,GAAA,EAAA3mD,GAAAA;QACL,KAAA,EAAOkrB,GAAAA;AACP,QAAA,IAAA,EAAMu7B,IAAU31B,GAAG,CAAA;QACnB,KAAA,EAAO;AACR,OAAA,EALMA,GAKN,CACF;AACE;;AAET;AAQA,SAAS61B,EAAAA,CAAY,EAAE,GAAA,EAAA1nD,GAAAA,EAAK,KAAA,EAAAe,KAAO,IAAA,EAAA4D,GAAAA,EAAM,KAAA,EAAAH,GAAAA,EAAA,EAKtC;AACD,EAAA,IAAMghC,GAAAA,GAAUr3B,GAAAA,KAAU,CAAA,GAAI,IAAA,GAAO,IAAA;AACrC,EAAA,uBACEtM,KAAC,SAAA,EAAD;AACE,IAAA,SAAA,EAAWsM,GAAAA,KAAU,CAAA,GAAIjN,GAAAA,CAAE,WAAA,GAAcA,GAAAA,CAAE,cAAA;IAC3C,kBAAA,EAAkBiN,GAAAA,KAAU,IAAImvB,GAAAA,GAAO,MAAA;AACvC,IAAA,YAAA,EAAY52B,GAAAA,CAAM,IAAA;IAHpB,QAAA,EAAA;AAKE,sBAAA5B,IAAC0gC,GAAAA,EAAD;AAAS,QAAA,SAAA,EAAWr3B,GAAAA,KAAU,CAAA,GAAIjN,GAAAA,CAAE,YAAA,GAAeA,GAAAA,CAAE,eAAA;AAClD,QAAA,QAAA,EAAAwF,GAAAA,CAAM;OACA,CAAA;AACRA,MAAAA,GAAAA,CAAM,WAAA,KAAgB,MAAA,oBACrB5B,GAAAA,CAAC,GAAA,EAAD;AAAG,QAAA,SAAA,EAAW5D,GAAAA,CAAE,QAAA;AAAW,QAAA,QAAA,EAAAwF,GAAAA,CAAM;OAAe,CAAA;AAElD,sBAAA5B,IAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAW5D,GAAAA,CAAE,IAAA;QACf,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQwF,GAAAA,CAAM,QAAQ,CAAA,CAAE,IAAA,CAAK,CAACmrB,GAAAA,EAAK5F,GAAAA,CAAAA,KAAW;AACpD,UAAA,IAAMpqB,GAAAA,GAAI,CAAA,EAAGy7B,GAAAA,CAAAA,CAAAA,EAAQzL,GAAAA,CAAAA,CAAAA;AACrB,UAAA,OAAO0yB,GAAAA,CAAWt4B,GAAK,CAAA,mBACrBnnB,IAACgiD,EAAAA,EAAD;YAAwB,GAAA,EAAA9mD,GAAAA;YAAK,IAAA,EAAM6B,GAAAA;YAAG,IAAA,EAAMoqB;AAAQ,WAAA,EAAtC4F,GAAsC,CAAA,mBAEpD/sB,GAAAA,CAAC4iD,EAAAA,EAAD;YAA4B,GAAA,EAAA1nD,GAAAA;YAAK,KAAA,EAAOisB,GAAAA;YAAO,IAAA,EAAMpqB,GAAAA;AAAG,YAAA,KAAA,EAAOsM,GAAAA,GAAQ;AAAI,WAAA,EAAzD0jB,GAAyD,CAAA;QAE/E,CAAC;OACE;AACE;;AAEb;AClEA,SAAgB81B,GAAU3nD,GAAAA,EAAuB;AAC/C,EAAA,IAAM,EAAE,OAAAe,GAAAA,EAAO,OAAA,EAAA4D,KAAS,OAAA,EAAAH,GAAAA,EAAS,QAAAiC,GAAAA,EAAQ,UAAA,EAAAkC,KAAY,SAAA,EAAAzH,GAAAA,EAAW,QAAAjB,GAAAA,EAAQ,UAAA,EAAAkB,KAAA,GAAeuD,GAAAA,EACjF45B,GAAAA,GAAAA,CAAYt+B,GAAAA,KAAwB;AACxC,IAAA,IAAM4F,GAAAA,GAAOW,IAAM8jB,GAAAA,CAAAA;AACdzkB,IAAAA,GAAAA,KACDA,GAAAA,CAAK,KAAA,KAAU,CAAA,GAAGgiD,GAAAA,CAAOhiD,IAAK,IAAI,CAAA,GACjCiiD,GAAAA,CAAWjiD,GAAAA,CAAK,IAAI,CAAA,CAAA;AAC3B,EAAA,CAAA,EACM2nC,MAASf,GAAAA,CAAkC;AAC/C,IAAA,KAAA,EAAOjmC,GAAAA,CAAM,GAAA,CAAA,OAAW,EAAC,CAAE,CAAA;AAC3B,IAAA,aAAA,EAAerF,GAAAA,CAAE,QAAA;IACjB,YAAA,EAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGqF,GAAAA,CAAM,SAAA,CAAA,CAAWvG,GAAAA,KAAMiB,GAAAA,CAAE,IAAA,KAAS6mD,GAAO,CAAC;GACrE,CAAA;AAED,EAAA,uBACEjmD,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWX,GAAAA,CAAE,IAAA;IAAM,YAAA,EAAY+jB,GAAAA;AAApC,IAAA,QAAA,EAAA,CACG8iC,GAAAA,kBACDjjD,GAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAW5D,GAAAA,CAAE,QAAA;AAAU,MAAA,GAAA,EAAKqsC,GAAAA,CAAO,OAAA;AACrC,MAAA,QAAA,EAAAhnC,GAAAA,CAAM,GAAA,CAAA,CAAKvG,GAAAA,EAAMe,GAAAA,KAAU;AAC1B,QAAA,IAAMgsB,GAAAA,GAAOnnB,GAAAA,CAAK,KAAA,KAAU,CAAA,IAAKA,GAAAA,CAAK,IAAA,KAASkiD,GAAAA,EACzCE,GAAAA,GAASpiD,GAAAA,CAAK,KAAA,KAAU,CAAA,IAAKA,GAAAA,CAAK,IAAA,KAASuzB,GAAAA;AACjD,QAAA,uBACEt3B,KAAC,QAAA,EAAD;UAEE,IAAA,EAAK,QAAA;UACL,SAAA,EAAW;YAACX,GAAAA,CAAE,QAAA;YAAU0E,GAAAA,CAAK,KAAA,KAAU,KAAK1E,GAAAA,CAAE,OAAA;AAAS6rB,YAAAA,GAAAA,IAAQ7rB,GAAAA,CAAE,QAAA;AAAU8mD,YAAAA,GAAAA,IAAU9mD,GAAAA,CAAE;AAAU,WAAA,CAC9F,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;UACX,cAAA,EAAc6rB,GAAAA,GAAO,MAAA,GAASi7B,GAAAA,GAAS,UAAA,GAAa,MAAA;UACpD,QAAA,EAAUza,GAAAA,CAAO,YAAYljB,GAAK,CAAA;UAClC,SAAA,EAAWkjB,GAAAA,CAAO,UAAUljB,GAAK,CAAA;UACjC,OAAA,EAAA,MAAeiU,IAASjU,GAAK,CAAA;UAT/B,QAAA,EAAA,iBAWEvlB,GAAAA,CAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAW5D,GAAAA,CAAE,QAAA;AAAW,YAAA,QAAA,EAAA0E,GAAAA,CAAK;AAAW,WAAA,CAAA,EAC7CqiD,GAAAA,mBAAanjD,GAAAA,CAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAW5D,GAAAA,CAAE,SAAA;AAAY,YAAA,QAAA,EAAA0E,GAAAA,CAAK;AAAc,WAAA,IAAI,IAC9D;AAZD,SAAA,EAAAA,GAAAA,CAAK,IAAA,KAAS,EAAA,GAAK,QAAA,GAAeA,IAAK,IAYtC,CAAA;MAEZ,CAAC;AACE,KAAA,CACF;;AAET;ACRA,SAAgBsiD,GAAUloD,GAAAA,EAAuB;AAC/C,EAAA,IAAM,EACJ,MAAA,EAAAe,GAAAA,EACA,MAAA,EAAA4D,GAAAA,EACA,QAAA,EAAA1D,GAAAA,EACA,SAAA,EAAAwF,GAAAA,EACA,UAAA,EAAAvF,GAAAA,GAAa,KAAA,EACb,QAAAE,GAAAA,GAAS,SAAA,EACT,UAAA,EAAAC,GAAAA,GAAa,KAAA,EACb,SAAA,EAAAR,GAAAA,EAAA,GACE6D,KACE,CAACwgD,GAAAA,EAAOiD,GAAAA,CAAAA,GAAYjkD,QAAAA,CAAS,EAAE,CAAA,EAC/B0oC,GAAAA,GAAOve,QAAAA,MAAc;AACzB,IAAA,IAAMkzB,GAAAA,GAAUkD,GAAAA,CAAmB2D,GAAAA,EAAQ1D,GAAU,CAAA;AACrD,IAAA,OAAOnD,GAAAA,KAAY,IAAA,GAAO,IAAA,GAAO4D,GAAAA,CAAkB5D,KAAS2D,GAAK,CAAA;EACnE,CAAA,EAAG;AAACkD,IAAAA,GAAAA;AAAQ1D,IAAAA,GAAAA;AAAYQ,IAAAA;AAAK,GAAC,GAExBz9C,GAAAA,GAAe;IAAE,MAAA,EAAA9C,GAAAA;IAAQ,QAAA,EAAA1D,GAAAA;IAAU,SAAA,EAAAwF;AAAU,GAAA,EAC7Cy0C,GAAAA,GAAQmN,GAAAA,mBACZvjD,GAAAA,CAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAW5D,GAAAA,CAAE,MAAA;IAChB,QAAA,kBAAA4D,IAACimC,GAAAA,EAAD;MACE,KAAA,EAAOma,GAAAA;MACP,QAAA,EAAUiD,GAAAA;MACV,YAAA,EAAY,CAAA,OAAA,EAAUC,IAAO,IAAA,CAAA,CAAA;MAC7B,WAAA,EAAY;KACb;AACE,GAAA,CAAA,GACH,IAAA;AAeJ,EAAA,OAbI9N,GAAAA,KAAW,MAAA,mBAEXx1C,GAAAA,CAACwjD,EAAAA,EAAD;IACE,GAAI5jD,GAAAA;IACE,IAAA,EAAAuB,GAAAA;IACD,GAAA,EAAA1C,GAAAA;IACE,KAAA,EAAAwB,GAAAA;IACP,WAAA,EAAam2C,GAAAA;IACb,aAAA,EAAA,MAAqBiN,IAAS,EAAE;GACjC,CAAA,mBAKHtmD,IAAAA,CAAC,KAAA,EAAD;IAAK,SAAA,EAAW,CAACX,IAAE,aAAA,EAAekE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAArE,IAAA,QAAA,EAAA,CACG81C,GAAAA,EACAtO,GAAAA,KAAS,IAAA,mBACR9nC,IAACyjD,EAAAA,EAAD;MAAkB,KAAA,EAAAxjD,GAAAA;MAAO,OAAA,EAAA,MAAeojD,IAAS,EAAE;KAAI,CAAA,mBAEvDrjD,GAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAW5D,GAAAA,CAAE,OAAA;AACf,MAAA,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQ0rC,GAAAA,CAAK,QAAQ,CAAA,CAAE,GAAA,CAAA,CAAK,CAAC/a,GAAAA,EAAK5F,GAAAA,CAAAA,qBACxCnnB,IAAC,KAAA,EAAD;AAAe,QAAA,SAAA,EAAW5D,GAAAA,CAAE,MAAA;AACzB,QAAA,QAAA,EAAAqjD,GAAAA,CAAWt4B,GAAK,CAAA,mBAGfnnB,IAACgiD,EAAAA,EAAD;UAAc,GAAA,EAAAvjD,GAAAA;UAAK,IAAA,EAAMsuB,GAAAA;UAAK,IAAA,EAAM5F;SAAQ,CAAA,mBAE5CnnB,GAAAA,CAAC0jD,EAAAA,EAAD;UAAgB,GAAA,EAAAjlD,GAAAA;UAAK,KAAA,EAAO0oB,GAAAA;UAAO,IAAA,EAAM4F,GAAAA;UAAK,KAAA,EAAO;SAAI;AAExD,OAAA,EARKA,GAQL,CACN;AACE,KAAA,CAEJ;;AAET;AAIA,SAASy2B,GAAWtoD,GAAAA,EAMjB;AACD,EAAA,IAAM,EAAE,MAAA,EAAAe,GAAAA,EAAQ,IAAA,EAAA4D,KAAM,GAAA,EAAAH,GAAAA,EAAK,KAAA,EAAAvD,GAAAA,EAAO,aAAA0H,GAAAA,EAAa,aAAA,EAAAzH,GAAAA,EAAe,SAAA,EAAAjB,KAAA,GAAcyE,GAAAA,EACtE6B,GAAAA,GAAQ8nB,OAAAA,CAAAA,MAAeue,GAAAA,KAAS,IAAA,GAAO,KAAKgY,GAAAA,CAAchY,GAAI,CAAA,EAAI,CAACA,GAAI,CAAC,CAAA,EACxE,CAAC6b,GAAAA,EAAcC,GAAAA,CAAAA,GAAmBxkD,QAAAA,CAAAA,MAChCQ,GAAAA,CAAM,cAAA,IAAkB,EAChC,CAAA,EACMikD,GAAAA,GAAYjkD,IAAM,OAAA,IAAW+jD,GAAAA,EAI7B17B,GAAAA,GAAOxmB,GAAAA,CAAM,KAAA,CAAMvG,GAAAA,KAAMiB,GAAAA,CAAE,IAAA,KAAS0nD,OAAa1nD,GAAAA,CAAE,KAAA,KAAU,CAAC,CAAA,GAChE0nD,MACCpiD,GAAAA,CAAM,IAAA,CAAA,CAAMvG,GAAAA,KAAMiB,IAAE,KAAA,KAAU,CAAC,CAAA,EAAG,IAAA,IAAQ,IAEzCwmD,GAAAA,GAAY/9C,MAAAA,CAA8B,IAAI,CAAA,EAK9Ck/C,MAAMvC,GAAAA,CAAa;IAAE,OAAA,EAASoB,GAAAA;IAAW,GAAA,EAJ5Bp5B,OAAAA,CAAAA,MACX9nB,GAAAA,CAAM,MAAA,CAAA,CAAQvG,GAAAA,KAAMiB,GAAAA,CAAE,KAAA,KAAU,CAAA,IAAKA,GAAAA,CAAE,OAAA,KAAY8rB,GAAI,CAAA,CAAE,GAAA,CAAA,CAAK/sB,GAAAA,KAAMiB,GAAAA,CAAE,IAAI,CAAA,EAChF,CAACsF,GAAAA,EAAOwmB,GAAI,CAEsC;GAAY,CAAA,EAE1DqyB,GAAAA,GAAAA,CAAWr+C,GAAAA,KAAuB;AAClC2D,IAAAA,IAAM,OAAA,KAAY,MAAA,IAAWgkD,GAAAA,CAAgBprB,GAAI,GACrD54B,GAAAA,CAAM,eAAA,GAAkB44B,GAAI,CAAA,EAG5BmqB,IAAU,OAAA,EAAS,QAAA,GAAW,EAAE,GAAA,EAAK,GAAG,CAAA;EAC1C,CAAA,EAEM/gD,GAAAA,GAAQkmC,QAAS,IAAA,GAAO,IAAA,GAAOic,GAAUjc,GAAAA,EAAM7f,GAAAA,EAAMq7B,IAAO,IAAI,CAAA;AAEtE,EAAA,uBACEvmD,KAAC,KAAA,EAAD;IAAK,SAAA,EAAW,CAACX,IAAE,UAAA,EAAYkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAAlE,QAAA,EAAA,iBACEN,GAAAA,CAAC6iD,EAAAA,EAAD;MACS,KAAA,EAAAxmD,GAAAA;MACP,OAAA,EAAS4rB,GAAAA;AACT,MAAA,OAAA,EAAS67B,GAAAA,CAAI,MAAA;MACb,MAAA,EAAQxJ,GAAAA;AACR,MAAA,UAAA,EAAYwJ,GAAAA,CAAI,QAAA;AAChB,MAAA,SAAA,EAAWR,GAAAA,CAAO,IAAA;MAClB,MAAA,EAAQU,GAAAA;MACR,UAAA,EAAY5D,GAAAA,CAAM,MAAK,KAAM;AAC9B,KAAA,CAAA,EACAx+C,GAAAA,KAAU,IAAA,mBACT5B,IAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAW5D,GAAAA,CAAE,IAAA;MAChB,QAAA,kBAAA4D,IAACyjD,EAAAA,EAAD;QAAkB,KAAA,EAAAtnD,GAAAA;QAAO,OAAA,EAAS8nD;OAAgB;KAC/C,CAAA,mBAELjkD,GAAAA,CAACuiD,EAAAA,EAAD;MAAgB,GAAA,EAAA7iD,GAAAA;MAAY,KAAA,EAAA6M,GAAAA;MAAO,IAAA,EAAM0b,GAAAA;MAAiB,SAAA,EAAA9mB;AAAY,KAAA,CAErE;;AAET;AAOA,SAAS4iD,EAAAA,CAAU7oD,GAAAA,EAAiBe,GAAAA,EAAc4D,GAAAA,EAAoC;AACpF,EAAA,IAAI24B,QAAS,EAAA,EAAI;AACf,IAAA,IAAM/3B,MAAW,MAAA,CAAO,WAAA,CACtB,MAAA,CAAO,OAAA,CAAQqnC,IAAK,QAAQ,CAAA,CAAE,MAAA,CAAA,CAAQ,GAAG3gB,GAAAA,MAAWs4B,GAAAA,CAAWt4B,GAAK,CAAC,CACvE,CAAA;AACA,IAAA,OAAO,OAAO,IAAA,CAAK1mB,GAAQ,CAAA,CAAE,MAAA,KAAW,IACpC,IAAA,GACA;MAAE,GAAGqnC,GAAAA;MAAM,IAAA,EAAMoc,GAAAA;MAAU,QAAA,EAAAjoD;AAAS,KAAA;AAC1C,EAAA;AACA,EAAA,IAAI8hC,KACAomB,GAAAA,GAASrc,GAAAA;AACb,EAAA,KAAA,IAAWj8B,GAAAA,IAAO2sB,GAAAA,CAAK,KAAA,CAAM,GAAG,CAAA,EAAG;AACjC,IAAA,IAAMlyB,GAAAA,GAAO69C,GAAAA,CAAO,QAAA,CAASt4C,GAAAA,CAAAA;AAC7B,IAAA,IAAIvF,GAAAA,KAAS,MAAA,IAAam5C,GAAAA,CAAWn5C,GAAI,GAAG,OAAO,IAAA;AACnD,IAAA5G,GAAAA,GAAO4G,KACPnK,GAAAA,GAASmK,GAAAA;AACX,EAAA;AACA,EAAA,OAAOy3B,GAAAA,IAAQ,IAAA;AACjB;AAGA,SAAS0lB,GAAU,EAAE,KAAA,EAAAvoD,GAAAA,EAAO,OAAA,EAAAe,KAAA,EAAmD;AAC7E,EAAA,uBACEc,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWX,GAAAA,CAAE,SAAA;AAAlB,IAAA,QAAA,EAAA,iBACEW,IAAAA,CAAC,GAAA,EAAD,EAAA,QAAA,EAAA;AAAG,MAAA,0BAAA;AAAoBqjD,MAAAA,GAAAA,CAAM,IAAA,EAAK;AAAE,MAAA;AAAK,KAAA,EAAA,CAAA,kBACzCpgD,GAAAA,CAAC,QAAA,EAAD;MAAQ,IAAA,EAAK,QAAA;AAAS,MAAA,SAAA,EAAW5D,GAAAA,CAAE,WAAA;MAAa,OAAA,EAASgoD,GAAAA;MAAS,QAAA,EAAA;AAE1D,KAAA,CACL;;AAET;AAEA,SAASV,EAAAA,CAAU,EAAE,GAAA,EAAAxoD,GAAAA,EAAK,KAAA,EAAAe,KAAO,IAAA,EAAA4D,GAAAA,EAAM,KAAA,EAAAH,GAAAA,EAAA,EAKpC;AACD,EAAA,uBACE3C,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWsM,GAAAA,KAAU,CAAA,GAAIjN,GAAAA,CAAE,KAAA,GAAQA,GAAAA,CAAE,QAAA;IAA1C,QAAA,EAAA,iBACEW,IAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWX,GAAAA,CAAE,WAAA;MAAlB,QAAA,EAAA,iBACE4D,GAAAA,CAAC,IAAA,EAAD;AAAI,QAAA,SAAA,EAAW5D,GAAAA,CAAE,UAAA;AAAa,QAAA,QAAA,EAAAwF,GAAAA,CAAM;AAAS,OAAA,GAC5CA,GAAAA,CAAM,WAAA,KAAgB,MAAA,oBACrB5B,IAAC,GAAA,EAAD;AAAG,QAAA,SAAA,EAAW5D,GAAAA,CAAE,SAAA;AAAY,QAAA,QAAA,EAAAwF,GAAAA,CAAM;AAAe,OAAA,CAEhD;KACL,CAAA,kBAAA5B,GAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAW5D,GAAAA,CAAE,IAAA;MACf,QAAA,EAAA,MAAA,CAAO,OAAA,CAAQwF,GAAAA,CAAM,QAAQ,CAAA,CAAE,IAAA,CAAK,CAACmrB,GAAAA,EAAK5F,GAAAA,CAAAA,KAAW;AACpD,QAAA,IAAMu7B,GAAAA,GAAY,CAAA,EAAGlqB,GAAAA,CAAAA,CAAAA,EAAQzL,GAAAA,CAAAA,CAAAA;AAC7B,QAAA,OAAO0yB,GAAAA,CAAWt4B,GAAK,CAAA,mBACrBnnB,IAACgiD,EAAAA,EAAD;UAAwB,GAAA,EAAA9mD,GAAAA;UAAK,IAAA,EAAMwnD,GAAAA;UAAW,IAAA,EAAMv7B;AAAQ,SAAA,EAA9C4F,GAA8C,CAAA,mBAE5D/sB,GAAAA,CAAC0jD,EAAAA,EAAD;UAA0B,GAAA,EAAAxoD,GAAAA;UAAK,KAAA,EAAOisB,GAAAA;UAAO,IAAA,EAAMu7B,GAAAA;AAAW,UAAA,KAAA,EAAOr5C,GAAAA,GAAQ;AAAI,SAAA,EAAjE0jB,GAAiE,CAAA;MAErF,CAAC;AACE,KAAA,CACF;;AAET;AC/NA,SAAgBs3B,GAAYpoD,GAAAA,EAAyB;AACnD,EAAA,IAAM,EAAE,MAAA,EAAA4D,GAAAA,EAAQ,cAAAH,GAAAA,EAAc,KAAA,EAAAvD,KAAO,WAAA,EAAAwF,GAAAA,EAAa,QAAAkC,GAAAA,EAAQ,eAAA,EAAAzH,KAAiB,GAAGkoD,GAAAA,KAAS1kD,GAAAA,EACjF2kD,GAAAA,GAAOD,IAAK,MAAA,KAAW,MAAA;AAC7B,EAAA,uBACEtkD,IAACmgC,GAAAA,EAAD;IACU,MAAA,EAAAtgC,GAAAA;IACM,YAAA,EAAAH,GAAAA;AACd,IAAA,YAAA,EAAY,OAAO8C,GAAAA,IAAU,QAAA,GAAWA,GAAAA,GAAQ8hD,IAAK,MAAA,CAAO,IAAA;IAC5D,SAAA,EAAWE,GAAAA;IACH,MAAA,EAAA3gD,GAAAA;IACR,aAAA,EAAe0gD,GAAAA,GAAOnoD,IAAE,QAAA,GAAW,MAAA;IACnC,KAAA,EACEqoD,GAAAA,KAAgB,SAMdjiD,GAAAA,IAAS8hD,GAAAA,CAAK,OAAO,IAAA,mBALrBvnD,KAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWX,GAAAA,CAAE,QAAA;AAAnB,MAAA,QAAA,EAAA,iBACE4D,GAAAA,CAAC,MAAA,EAAD,EAAA,QAAA,EAAOwC,GAAAA,IAAS8hD,GAAAA,CAAK,MAAA,CAAO,IAAA,EAAW,CAAA,EACtCG,GACG;KAEN,CAAA;AAIJ,IAAA,QAAA,kBAAAzkD,GAAAA,CAACojD,EAAAA,EAAD,EAAW,GAAIkB,KAAO;GAChB,CAAA;AAEZ;;;;;;AC3BA,SAAgBI,IAAQ7kD,GAAAA,EAAqB;AAC3C,EAAA,IAAM,EAAE,IAAA,EAAAH,GAAAA,EAAM,SAAA,EAAAvD,GAAAA,EAAW,QAAA,EAAAwF,GAAAA,EAAU,SAAA,EAAAkC,GAAAA,EAAW,KAAA,EAAAzH,GAAAA,EAAA,GAAUwD,KAClDkC,GAAAA,GAAM;IAAC1F,GAAAA,CAAE,OAAA;AAASyN,IAAAA,GAAAA,KAAS,UAAUzN,GAAAA,CAAE,IAAA;AAAMyN,IAAAA,GAAAA,KAAS,WAAWzN,GAAAA,CAAE,KAAA;AAAOkE,IAAAA;AAAS,GAAA,CACtF,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC3B,EAAA,uBACEpF,IAAC,OAAA,EAAD;IAAO,SAAA,EAAW4G,GAAAA;IAAK,YAAA,EAAYqe,GAAAA;IAAkB,KAAA,EAAA/jB,GAAAA;IAClD,QAAA,EAAAuF;GACI,CAAA;AAEX;;;;;;;;;;;ACFA,SAAgBgjD,IAAavoD,GAAAA,EAA0B;AACrD,EAAA,IAAM,EAAE,KAAA,EAAAjB,GAAAA,EAAO,SAAA,EAAAkB,KAAW,gBAAA,EAAAC,GAAAA,EAAkB,MAAA,EAAAC,GAAAA,EAAQ,UAAAyD,GAAAA,EAAU,SAAA,EAAAjD,GAAAA,EAAA,GAAc6C,KACtEkC,GAAAA,GAAM;IAAC1F,GAAAA,CAAE,KAAA;AAAO4+C,IAAAA,GAAAA,IAAa5+C,GAAAA,CAAE,SAAA;AAAWkE,IAAAA;AAAS,GAAA,CAAE,OAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA,EAC7EskD,MAAoBC,GAAAA,KAAqB,MAAA;AAC/C,EAAA,uBACE1oD,KAAC,KAAA,EAAD;IAAK,SAAA,EAAW2F,GAAAA;AAAhB,IAAA,QAAA,EAAA,CACGU,GAAAA,KAAU,MAAA,oBACTrG,KAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWC,GAAAA,CAAE,QAAA;AAAlB,MAAA,QAAA,EAAA,CACGwoD,GAAAA,mBACCzoD,IAAAA,CAAC,QAAA,EAAD;QACE,IAAA,EAAK,QAAA;AACL,QAAA,SAAA,EAAW,CAAA,EAAGC,GAAAA,CAAE,WAAA,CAAA,CAAA,EAAeA,IAAE,QAAA,CAAA,CAAA;QACjC,OAAA,EAASyoD,GAAAA;AACT,QAAA,eAAA,EAAe,CAAC7J,GAAAA;AAJlB,QAAA,QAAA,EAAA,iBAMEt7C,GAAAA,CAACsoB,GAAAA,EAAD,EAAgB,IAAA,EAAM,CAACgzB,GAAAA,EAAY,CAAA,kBACnCt7C,GAAAA,CAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAWtD,GAAAA,CAAE,KAAA;UAAQ,QAAA,EAAAoG;AAAY,SAAA,CACjC;OAER,CAAA,mBAAA9C,GAAAA,CAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAW,CAAA,EAAGtD,GAAAA,CAAE,KAAA,CAAA,CAAA,EAASA,IAAE,QAAA,CAAA,CAAA;QAAa,QAAA,EAAAoG;AAAY,OAAA,GAE3DsiD,GAAAA,KAAW,MAAA,oBACV3oD,IAAAA,CAACsD,IAAD,EAAA,QAAA,EAAA,iBACEC,IAAC+C,SAAAA,EAAD,EAAA,QAAA,kBACE/C,IAAC,QAAA,EAAD;QACE,IAAA,EAAK,QAAA;AACL,QAAA,SAAA,EAAWtD,GAAAA,CAAE,UAAA;QACb,OAAA,EAAS0oD,GAAAA;QACT,YAAA,EAAW,YAAA;QACZ,QAAA,EAAA;AAEO,OAAA,CAAA,EACC,CAAA,kBACXplD,GAAAA,CAACK,EAAAA,EAAD,EAAA,QAAA,EAAS,YAAA,EAAmB,CACd,CAAA,EAAA,CAEf;AAEN,KAAA,CAAA,EAAA,CAACi7C,GAAAA,oBAAat7C,IAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWtD,GAAAA,CAAE,IAAA;MAAO,QAAA,EAAA4D;AAAc,KAAA,CACnD;;AAET;;;;;;;;ACjCA,SAAgB+kD,IAAWlhD,GAAAA,EAAwB;AACjD,EAAA,IAAM,EACJ,IAAA,EAAAzH,GAAAA,EAAM,KAAA,EAAAjB,KAAO,QAAA,EAAAkB,GAAAA,EAAU,MAAA,EAAAC,GAAAA,EAAQ,UAAAC,GAAAA,EAAU,YAAA,EAAAyD,GAAAA,EAAc,QAAA,EAAAjD,KACvD,OAAA,EAAAhB,GAAAA,EAAS,SAAA,EAAAkE,GAAAA,EAAW,KAAA,EAAAgP,GAAAA,EAAO,SAAA,EAAAiK,GAAAA,KACzBtZ,GAAAA,EACEolD,GAAAA,GAAgBxiD,GAAAA,KAAUxB,GAAAA,GAAW,GAAGpE,GAAAA,CAAAA,EAAAA,EAAUoE,GAAAA,CAAAA,CAAAA,CAAAA,GAAcpE,MAChEkF,GAAAA,GAAM;IAAC1F,GAAAA,CAAE,MAAA;AAAQiuB,IAAAA,GAAAA,IAAUjuB,GAAAA,CAAE,MAAA;AAAQkE,IAAAA;AAAS,GAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC9E,EAAA,uBACEZ,KAACD,EAAAA,EAAD;IAAgB,UAAA,EAAY6C,GAAAA;IAA5B,QAAA,EAAA,iBACEzC,GAAAA,CAAC4C,SAAAA,EAAD;MAAW,UAAA,EAAYH,GAAAA;MACrB,QAAA,kBAAA5C,KAAC,QAAA,EAAD;QACE,IAAA,EAAK,QAAA;AACL,QAAA,QAAA,EAAUulD,MAAW,CAAA,GAAI,EAAA;QACzB,SAAA,EAAWnjD,GAAAA;AACX,QAAA,cAAA,EAAcuoB,MAAS,MAAA,GAAS,MAAA;AAChC,QAAA,eAAA,EAAe66B,MAAe,MAAA,GAAS,MAAA;QAC7B,QAAA,EAAA3oD,GAAAA;QACD,OAAA,EAAAR,GAAAA;QACE,SAAA,EAAAkE,GAAAA;QARb,QAAA,EAAA;AAUE,0BAAAJ,IAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAWzD,GAAAA,CAAE,IAAA;YAAM,aAAA,EAAY,MAAA;YAAQ,QAAA,EAAA6F;WAAW,CAAA;AACxD,0BAAApC,IAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAWzD,GAAAA,CAAE,KAAA;YAAQ,QAAA,EAAAQ;WAAY,CAAA;UACtCoE,GAAAA,oBAAYnB,IAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAWzD,GAAAA,CAAE,QAAA;YAAW,QAAA,EAAA4E;WAAe;AACpD;;KACC,CAAA,kBACXnB,GAAAA,CAACE,EAAAA,EAAD,EAAA,QAAA,EAAUilD,GAAAA,EAAuB,CACnB;;AAEpB;;;;;ACjDA,SAAgBG,IAAUtlD,GAAAA,EAAuB;AAC/C,EAAA,IAAM,EAAE,QAAA,EAAAH,GAAAA,EAAU,WAAA,EAAAvD,MAAc,UAAA,EAAY,QAAA,EAAAwF,GAAAA,EAAU,SAAA,EAAAkC,GAAAA,EAAW,SAAA,EAAAzH,GAAAA,EAAA,GAAcwD,KACzEkC,GAAAA,GAAM;IAAC1F,GAAAA,CAAE,KAAA;AAAO2F,IAAAA,GAAAA,KAAgB,gBAAgB3F,GAAAA,CAAE,UAAA;AAAYkE,IAAAA;AAAS,GAAA,CAC1E,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC3B,EAAA,uBACEpF,IAAC,KAAA,EAAD;IAAK,SAAA,EAAW4G,GAAAA;IAAK,IAAA,EAAK,OAAA;IAAQ,YAAA,EAAYsjD,GAAAA;IAAU,YAAA,EAAYjlC,GAAAA;IACjE,QAAA,EAAAzgB;GACE,CAAA;AAET;;;ACZO,IAAM,aAAA,GAA0C,CAAC,YAAY,CAAA;ACqB7D,SAAS,eAAA,CAAgB,MAAsB,QAAA,EAA6C;AACjG,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,MAAM,OAAA,uBAAc,GAAA,CAAmB,CAAC,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,aAAa,CAAC,CAAA;AACzE,EAAA,KAAA,MAAWzD,OAAK,QAAA,EAAU;AACxB,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAIA,GAAC,CAAA,EAAG,OAAO,IAAA;AAC7B,EAAA;AACA,EAAA,OAAO,KAAA;AACT;AClCO,SAAS,oBAAA,CACd,KACA,KAAA,EACS;AACT,EAAA,OAAO,eAAA,CAAgB,IAAI,OAAA,EAAA,EAAW,MAAM,WAAA,EAAa,YAAA,IAAgB,EAAE,CAAA;AAC7E;;;;;;;;;;ICbMopD,GAAAA,GAAsB;AAAC,EAAA,QAAA;AAAU,EAAA,OAAA;AAAS,EAAA,MAAA;AAAQ,EAAA,MAAA;AAAQ,EAAA;AAAM,CAAA;IAChEC,GAAAA,GAAO,MAAA;AAEb,SAASC,IAAiBrqD,GAAAA,EAAyC;AACjE,EAAA,IAAMunD,GAAAA,uBAAa,GAAA,EAAuB;AAC1C,EAAA,KAAA,IAAW+C,OAAQt0B,GAAAA,EAAM;AACvB,IAAA,IAAMjiB,GAAAA,GAAIu2C,GAAAA,CAAK,YAAA,EAAc,KAAA,IAASF,GAAAA,EAChCjqC,MAASonC,GAAAA,CAAO,GAAA,CAAIxzC,GAAC,CAAA,IAAK,EAAC;AACjCoM,IAAAA,IAAO,IAAA,CAAKmqC,GAAI,GAChB/C,GAAAA,CAAO,GAAA,CAAIxzC,KAAGoM,GAAM,CAAA;AACtB,EAAA;AACA,EAAA,OAAOonC,GAAAA;AACT;AAEA,SAASgD,GAAAA,CACPvqD,KACAe,GAAAA,EACU;AACV,EAAA,IAAMmtC,GAAAA,GAAO,IAAI,GAAA,CAAIqZ,GAAAA,CAAO,MAAM,CAAA,EAC5B/1B,MAAoB,EAAC;AAC3B,EAAA,KAAA,IAAWkrB,GAAAA,IAAS8N,GAAAA,EACdtc,GAAAA,CAAK,GAAA,CAAIwO,GAAK,CAAA,KAChBlrB,GAAAA,CAAQ,IAAA,CAAKkrB,GAAK,CAAA,EAClBxO,GAAAA,CAAK,OAAOwO,GAAK,CAAA,CAAA;AAIrB,EAAA,KAAA,IAAW7qB,OAAO01B,GAAAA,CAAO,IAAA,EAAK,EACxBrZ,IAAK,GAAA,CAAIrc,GAAG,CAAA,IAAKA,GAAAA,KAAQu4B,QAC3B54B,GAAAA,CAAQ,IAAA,CAAKK,GAAG,CAAA,EAChBqc,GAAAA,CAAK,OAAOrc,GAAG,CAAA,CAAA;AAInB,EAAA,OADIqc,IAAK,GAAA,CAAIkc,GAAI,KAAG54B,GAAAA,CAAQ,IAAA,CAAK44B,GAAI,CAAA,EAC9B54B,GAAAA;AACT;AAEA,SAAS9rB,IAAY1F,GAAAA,EAA0B;AAC7C,EAAA,IAAMyqD,GAAAA,GAAUH,IAAK,YAAA,EAAc,IAAA;AAGnC,EAAA,OAFIG,GAAAA,IAAW,IAAA,mBAAahkD,GAAAA,CAACikD,WAAAA,EAAD,EAAc,CAAA,GACtC,OAAOD,GAAAA,IAAY,UAAA,GAAmBA,GAAAA,CAAQ,MAAS,CAAA,GACpDA,GAAAA;AACT;AAmCA,SAAgBE,IAAY1pD,GAAAA,EAAyB;AACnD,EAAA,IAAM,EACJ,KAAA,EAAAI,GAAAA,EAAO,WAAA,EAAA0D,GAAAA,GAAc,UAAA,EAAY,SAAA,EAAAgP,GAAAA,EAAW,cAAA,EAAAiK,GAAAA,EAAgB,YAAA,EAAAne,GAAAA,EAC5D,YAAAoG,GAAAA,GAAakkD,GAAAA,EAAAA,GACXzlD,GAAAA,EAEE6iD,GAAAA,GAAS8C,GAAAA,CADF,MAAA,CAAO,MAAA,CAAOO,GAAAA,CAAM,QACD,CAAI,CAAA,EAC9BC,GAAAA,GAAYN,GAAAA,CAAiBhD,GAAAA,EAAQiD,GAAU,GAC/C5jD,GAAAA,GAAM;IAAC1F,GAAAA,CAAE,OAAA;AAAS2F,IAAAA,GAAAA,KAAgB,gBAAgB3F,GAAAA,CAAE,UAAA;AAAYkE,IAAAA;AAAS,GAAA,CAC5E,OAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,GAGrBosB,GAAAA,GAAUq5B,GAAAA,CAAU,OAAA,CAAA,CAAS7qD,QAAMunD,GAAAA,CAAO,GAAA,CAAI3nD,GAAC,CAAE,CAAA,EACjDkrD,MAAct5B,GAAAA,CAAQ,GAAA,CAAA,CACzBxxB,GAAAA,KAAU,CAAAH,GAAAA,IAAekrD,oBAAAA,CAAqBC,KAAcV,GAAI,CACnE,GACM5nB,GAAAA,GAAclR,GAAAA,CAAQ,SAAA,CAAA,CAAWxxB,QAAMe,GAAAA,CAAE,EAAA,KAAO6pD,IAAM,MAAM,CAAA,EAC5Drd,MAASf,GAAAA,CAAkB;IAC/B,KAAA,EAAOse,GAAAA,CAAY,IAAA,CAAK9qD,GAAAA,MAAa,EAAE,QAAA,EAAU,CAACqH,KAAQ,CAAE,CAAA;AAC5D,IAAA,aAAA,EAAenG,GAAAA,CAAE,UAAA;IAGjB,GAAIwhC,GAAAA,IAAe,KAAKooB,GAAAA,CAAYpoB,GAAAA,IAAe,EAAE,YAAA,EAAcA,GAAAA,EAAY,GAAI;AACrF,GAAC,GACGrY,GAAAA,GAAQ,EAAA;AAEZ,EAAA,uBACE5jB,IAAC,KAAA,EAAD;AACE,IAAA,GAAA,EAAK8mC,GAAAA,CAAO,OAAA;IACZ,SAAA,EAAW3mC,GAAAA;IACX,IAAA,EAAK,SAAA;IACL,YAAA,EAAW,OAAA;AAEV,IAAA,QAAA,EAAAikD,GAAAA,CAAU,GAAA,CAAA,CAAK9pD,GAAAA,EAAKE,wBACnB0H,IAAAA,CAACmnB,UAAAA,EAAD,EAAA,UAAA,CACG7uB,GAAAA,GAAI,CAAA,oBACHwF,IAAC,KAAA,EAAD;AACE,MAAA,SAAA,EAAWvF,GAAAA,CAAE,SAAA;MACb,IAAA,EAAK,WAAA;MACL,kBAAA,EAAkB2F,GAAAA,KAAgB,eAAe,UAAA,GAAa;KAC/D,CAAA,kBAEHJ,GAAAA,CAACwjD,GAAAA,EAAD;MAAwB,WAAA,EAAAllD,GAAAA;MAAa,QAAA,EAAU8sB,GAAAA;AAC5C,MAAA,QAAA,EAAA01B,IAAO,GAAA,CAAI11B,GAAG,CAAA,CAAG,GAAA,CAAA,CAAK9wB,GAAAA,KAAS;AAC9B,QAAA,IAAME,GAAAA,GAAI,EAAEopB,GAAAA,EACN3oB,GAAAA,GAAQ4oD,IAAK,YAAA,EAAc,KAAA,IAASA,IAAK,EAAA,EACzCxkD,GAAAA,GAAWwkD,IAAK,YAAA,EAAc,QAAA,IAC/B7mD,GAAewnD,GAAAA,GAAiBA,GAAAA,CAAeX,IAAK,EAAE,CAAA,GAAIA,GAAAA,CAAK,UAAU,CAAA,EACxEjjD,GAAAA,GAAUyjD,IAAY7pD,GAAAA,CAAAA,EACtBiqD,MAAWF,GAAAA,GAAeA,GAAAA,CAAa,SAAQ,CAAE,EAAA,GAAK,MAAA,EACtDlB,GAAAA,GAAgB,CAACziD,GAAAA,IAAW6jD,MAC9B,CAAA,EAAGxpD,GAAAA,GAAQoE,GAAAA,GAAW,CAAA,EAAA,EAAKA,GAAAA,CAAAA,CAAAA,CAAAA,GAAc,EAAA,CAAA,oBAAA,EAAoBolD,GAAAA,CAAAA,KAAAA,CAAAA,GAC7D,MAAA;AACJ,QAAA,uBACEzkD,IAACojD,GAAAA,EAAD;AAEE,UAAA,IAAA,EAAMnkD,IAAY4kD,GAAI,CAAA;UACf,KAAA,EAAArpD,GAAAA;UACG,QAAA,EAAA0H,GAAAA;UACV,MAAA,EAAQiiD,GAAAA,CAAM,WAAWN,GAAAA,CAAK,EAAA;UAC9B,QAAA,EAAU/c,GAAAA,CAAO,WAAA,CAAYtsC,GAAC,CAAA,KAAM,CAAA;AACpC,UAAA,YAAA,EAAc,CAACoG,GAAAA;AACf,UAAA,SAAA,EAAW,CAACnG,GAAAA,CAAE,UAAA,EAAY,CAACmG,GAAAA,IAAWnG,GAAAA,CAAE,aAAa,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;UAC/E,KAAA,EAAO4oD,GAAAA;AACP,UAAA,OAAA,EAASziD,MAAAA,MAAgBujD,GAAAA,CAAM,UAAUN,GAAAA,CAAK,EAAE,IAAA,MAAU;AAAC,UAAA,CAAA;UAC3D,SAAA,EAAW/c,GAAAA,CAAO,UAAUtsC,GAAC;AAC9B,SAAA,EAXMqpD,IAAK,EAWX,CAAA;MAEL,CAAC;AACQ,KAAA,CACH,CAAA,EAAA,EApCKz4B,GAoCL,CACX;GACE,CAAA;AAET;;;;;;;AC1IA,SAAgBs5B,GAAAA,CAAK,EAAE,QAAA,EAAApqD,GAAAA,EAAU,WAAA4D,GAAAA,EAAW,GAAGF,KAAAA,EAAmB;AAChE,EAAA,uBACEzE,IAACorD,IAAAA,EAAD;IAAS,GAAI3mD,GAAAA;IAAM,SAAA,EAAW,CAACvD,IAAE,IAAA,EAAMkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IACvE,QAAA,EAAArE;GACM,CAAA;AAEb;AAQA,SAAgBsqD,IAA0B,EAAE,SAAA,EAAAtqD,GAAAA,EAAW,GAAG0D,KAAAA,EAAyB;AACjF,EAAA,uBAAOzE,IAACsrD,OAAAA,EAAD;IAAe,GAAI7mD,GAAAA;IAAM,SAAA,EAAW,CAACvD,IAAE,IAAA,EAAMkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG;GAAI,CAAA;AAC7F;AASA,SAAgBmmD,GAAAA,CAAI,EAAE,QAAA,EAAA5mD,GAAAA,EAAU,WAAAH,GAAAA,EAAW,GAAGC,KAAAA,EAAkB;AAC9D,EAAA,uBACEzE,IAACwrD,GAAAA,EAAD;IAAQ,GAAI/mD,GAAAA;IAAM,SAAA,EAAW,CAACvD,IAAE,GAAA,EAAKkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IACrE,QAAA,EAAAT;GACK,CAAA;AAEZ;AASA,SAAgB8mD,GAAAA,CAAS,EAAE,QAAA,EAAA1qD,GAAAA,EAAU,WAAA4D,GAAAA,EAAW,GAAGF,KAAAA,EAAuB;AACxE,EAAA,uBACEzE,IAAC0rD,QAAAA,EAAD;IAAa,GAAIjnD,GAAAA;IAAM,SAAA,EAAW,CAACvD,IAAE,KAAA,EAAOkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAC5E,QAAA,EAAArE;GACU,CAAA;AAEjB;;;;;;;;;AC3BA,SAAgB4qD,GAAAA,CAAsC,EACpD,KAAA,EAAAtqD,GAAAA,EACA,OAAAyD,GAAAA,EACA,QAAA,EAAAjD,KACA,UAAA,EAAAhB,GAAAA,EACA,WAAAkE,GAAAA,EACA,YAAA,EAAckgB,KACd,eAAA,EAAAjH,GAAAA,EACA,UAAAne,GAAAA,EACA,OAAA,EAAAoG,KAAA,EACqB;AACrB,EAAA,IAAM,EAAE,MAAA,EAAA1C,GAAAA,EAAQ,aAAA2C,GAAAA,EAAA,GAAgBnC,GAAiBiB,GAAe,CAAA;AAChE,EAAA,uBACE/D,IAAAA,CAAC2qD,WAAAA,EAAD,EAAA,QAAA,EAAA;AACG1mD,IAAAA,GAAAA;AACD,oBAAAV,IAACykB,EAAAA,EAAD;AACE,MAAA,OAAA,EAASH,EAAAA,CAAsB;QAAE,OAAA,EAAA7iB,GAAAA;QAAS,QAAA,EAAApG,GAAAA;QAAU,SAAA,EAAAkU,GAAAA;QAAW,KAAA,EAAA1S;OAAO,CAAA;MACtE,QAAA,EAAUwqD,GAAAA;MAEV,QAAA,kBAAA5qD,KAACknC,MAAAA,EAAD;QACE,SAAA,EAAW,CAACjnC,IAAE,OAAA,EAASkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;QAC9C,UAAA,EAAAvE,GAAAA;QACZ,YAAA,EAAYokB,GAAAA;QAHd,QAAA,EAAA,iBAKEzgB,GAAAA,CAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAWtD,GAAAA,CAAE,KAAA;UAAQ,QAAA,EAAAQ;SAAY,CAAA,kBACvC8C,GAAAA,CAAC,KAAA,EAAD;AAAK,UAAA,SAAA,EAAWtD,GAAAA,CAAE,OAAA;UAAS,OAAA,EAAQ,WAAA;UAAY,aAAA,EAAY,MAAA;UACzD,QAAA,kBAAAsD,IAAC,MAAA,EAAD;YAAM,CAAA,EAAE,gBAAA;YAAiB,IAAA,EAAK,MAAA;YAAO,MAAA,EAAO,cAAA;YAAe,WAAA,EAAY,KAAA;YAAM,aAAA,EAAc,OAAA;YAAQ,cAAA,EAAe;WAAS;AACxH,SAAA,CACI;;KACG,CAAA;AAGhB,oBAAAA,IAACukC,OAAAA,EAAD;AAAY,MAAA,SAAA,EAAW7nC,GAAAA,CAAE,OAAA;MAAS,qBAAA,EAAoB,EAAA;MAAG,GAAImE,GAAAA;MAC3D,QAAA,kBAAAb,IAACsnD,IAAAA,EAAD;AAAS,QAAA,SAAA,EAAW5qD,GAAAA,CAAE,IAAA;QAAM,QAAA,EAAA,CAAWlB,GAAAA,KAAQ+rD,GAAAA,CAASl6B,GAAQ,CAAA;AAC7D,QAAA,QAAA,EAAAtrB,IAAM,GAAA,CAAA,CAAKvG,GAAAA,qBACVwE,IAACwnD,QAAAA,EAAD;AAEE,UAAA,EAAA,EAAIpmD,GAAAA,CAAK,KAAA;AACT,UAAA,SAAA,EAAW1E,GAAAA,CAAE,IAAA;AACb,UAAA,UAAA,EAAY0E,GAAAA,CAAK,UAAA;AACjB,UAAA,SAAA,EAAWA,IAAK,SAAA,KAAc,OAAOA,IAAK,KAAA,IAAU,QAAA,GAAWA,IAAK,KAAA,GAAQ,MAAA,CAAA;AAE3E,UAAA,QAAA,EAAAA,GAAAA,CAAK;SACK,EAPNA,GAAAA,CAAK,KAOC,CACd;OACM;KACC;AACD,GAAA,EAAA,CAAA;AAEjB;;;;;;;;;;;;;AC1CMqmD,IAAAA,GAAAA,GAAAA,MAAwB,IAAA;AAkD9B,SAAgBC,IAAiCjrD,GAAAA,EAAyB;AACxE,EAAA,IAAM,EACJ,KAAA,EAAAwF,GAAAA,EACA,WAAA,EAAAkC,GAAAA,EACA,cAAAzH,GAAAA,EACA,WAAA,EAAAC,GAAAA,EACA,OAAA,EAAAE,GAAAA,EACA,QAAA,EAAAR,KACA,WAAA,EAAAoF,GAAAA,EACA,kBAAA,EAAAgL,GAAAA,EACA,iBAAA,EAAAI,GAAAA,EACA,YAAA2S,GAAAA,GAAa,YAAA,EACb,UAAA,EAAAC,GAAAA,GAAa,uBAAA,EACb,MAAA,EAAAC,MAAS,UAAA,EACT,SAAA,EAAAC,GAAAA,EACA,SAAA,EAAAvkB,GAAAA,GAAY,IAAA,EACZ,UAAAqW,GAAAA,EACA,KAAA,EAAAwB,GAAAA,GAAQ,MAAA,EACR,SAAA,EAAA7B,GAAAA,EACA,iBAAA5H,GAAAA,EACA,GAAGvJ,GAAAA,EAAAA,GACDC,GAAAA,EAEE,EAAE,MAAA,EAAA8f,GAAAA,EAAQ,WAAA,EAAAoD,EAAAA,EAAA,GAAgB7jB,EAAAA,CAAiBiB,GAAe,CAAA;AAEhE,EAAA,uBACER,KAAC2nD,QAAAA,EAAD;IACE,GAAI1nD,GAAAA;AAGJ,IAAA,aAAA,EAAe2nD,GAAAA,KAAW,MAAA,GAASH,GAAAA,GAAkBG,GAAAA,KAAW,aAAa,MAAA,GAAYA,GAAAA;IACzF,qBAAA,EAAuB3nD,GAAAA,CAAK,yBAAyB2nD,GAAAA,KAAW,MAAA;IACnD,WAAA,EAAAnmD,GAAAA;IACO,kBAAA,EAAAgL,GAAAA;AACpB,IAAA,iBAAA,EAAA,CAAoBjR,GAAAA,KAAM;AACxBioC,MAAAA,GAAAA,GAAoBroC,GAAa,CAAA,EAC7BA,GAAAA,KAAM,QAAM28C,GAAAA,GAAW;QAAE,MAAA,EAAQ,QAAA;QAAU,GAAA,EAAK38C;OAAQ,CAAA;AAC9D,IAAA,CAAA;IACA,SAAA,EAAW;MAACsB,GAAAA,CAAE,KAAA;AAAOuzB,MAAAA,GAAAA,KAAU,SAASvzB,GAAAA,CAAE,GAAA;MAAKkmC,GAAAA,CAAa,IAAA;AAAMhiC,MAAAA;AAAS,KAAA,CACxE,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;IAdb,QAAA,EAAA;AAgBGF,MAAAA,GAAAA;MACAxD,GAAAA,KAAU,MAAA,oBAAaiD,GAAAA,CAACujC,KAAAA,EAAD;AAAO,QAAA,SAAA,EAAWd,GAAAA,CAAa,KAAA;QAAQ,QAAA,EAAA1lC;OAAa,CAAA;AAC5E,sBAAAiD,IAAC0nD,GAAAA,EAAD;QACe,WAAA,EAAAlrD,GAAAA;QACF,SAAA,EAAAgjB,GAAAA;QACX,YAAA,EAAco4B,GAAAA,KAAAA,CAAcv8C,GAAAA,KAASu8C,GAAAA,CAAS;UAAE,MAAA,EAAQ,MAAA;UAAQ,IAAA,EAAAv8C;SAAM,CAAA,CAAA;AAErE,QAAA,QAAA,EAAAy0B,GAAAA,KAAU,KAAA,oBACTjwB,IAAAA,CAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAWtD,GAAAA,CAAE,KAAA;UAAO,aAAA,EAAY,MAAA;AAAtC,UAAA,QAAA,EAAA,CACGqnC,GAAAA,KAAgB,MAAA,oBAAa5jC,GAAAA,CAAC,MAAA,EAAD,EAAA,QAAA,EAAO4jC,GAAAA,EAAkB,CAAA,EACtDE,GAAAA,CAAa3V,GAAAA,EAASvtB,GAAQ,CAAA,CAAE,GAAA,CAAA,CAAKvF,GAAAA,EAAGe,GAAAA,qBACvC4D,GAAAA,CAAC,MAAA,EAAD,EAAA,QAAA,EAAexD,GAAAA,EAAQ,EAAZF,GAAY,CACxB,CACG;;OAEK,CAAA;MACd0nC,GAAAA,KAAgB,MAAA,oBACfhkC,GAAAA,CAACikC,IAAAA,EAAD;QAAM,IAAA,EAAK,aAAA;AAAc,QAAA,SAAA,EAAWxB,GAAAA,CAAa,IAAA;QAC9C,QAAA,EAAAuB;OACG,CAAA;AAER,sBAAAhkC,IAACkkC,UAAAA,EAAD;AAAY,QAAA,SAAA,EAAWzB,GAAAA,CAAa,KAAA;QAAQ,QAAA,EAAA0B;OAAyB,CAAA;AACrE,sBAAAnkC,IAACokC,OAAAA,EAAD;AAAY,QAAA,SAAA,EAAW7nC,GAAAA,CAAE,OAAA;QAAS,qBAAA,EAAoB,EAAA;QAAG,GAAImE,EAAAA;QAC3D,QAAA,kBAAAV,IAACukC,OAAAA,EAAD;AACE,UAAA,SAAA,EAAWhoC,GAAAA,CAAE,OAAA;AACb,UAAA,gBAAA,EAAA,MACEorD,GAAAA,KAAc,IAAA,mBAGZ3nD,IAAC,KAAA,EAAD;AAAK,YAAA,SAAA,EAAWzD,GAAAA,CAAE,KAAA;YAAQ,QAAA,EAAAqrD;WAAgB,CAAA,mBAF1C5nD,GAAAA,CAAC,KAAA,EAAD;AAAK,YAAA,SAAA,EAAWzD,GAAAA,CAAE,KAAA;YAAO,IAAA,EAAK,OAAA;YAAS,QAAA,EAAAsrD;WAAgB,CAAA;UAM1D,QAAA,EAAA15B,GAAAA,KAAY,SAMTvtB,GAAAA,GALAutB,GAAAA,CAAQ,IAAA,CAAK9yB,GAAAA,qBACX2E,GAAAA,CAAC8nD,GAAAA,EAAD;AAAoC,YAAA,EAAA,EAAI9jD,GAAAA,CAAE,KAAA;AAAO,YAAA,SAAA,EAAWA,GAAAA,CAAE,SAAA;AAAW,YAAA,UAAA,EAAYA,GAAAA,CAAE,UAAA;AACpF,YAAA,QAAA,EAAAA,GAAAA,CAAE;AACS,WAAA,EAFK,MAAA,CAAOA,GAAAA,CAAE,KAAK,CAEnB,CACf;SAEK;OACF;AACD;;AAEjB;AAMA,SAAS0jD,GAAAA,CAAc,EACrB,WAAA,EAAArsD,GAAAA,EACA,SAAA,EAAAe,KACA,YAAA,EAAAE,GAAAA,EACA,QAAA,EAAAwF,GAAAA,EAAA,EAMC;AACD,EAAA,IAAM0kB,GAAAA,GAAQ/mB,WAAWsoD,oBAAoB,CAAA;AAY7C,EAAA,uBACEloD,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWtD,GAAAA,CAAE,KAAA;IAAlB,QAAA,EAAA;AACE,sBAAAyD,IAACwmC,KAAAA,EAAD;QACe,WAAA,EAAAnrC,GAAAA;AACb,QAAA,WAAA,EAAW2sD,GAAAA,IAAa,MAAA;QACxB,gBAAA,EAAkBC,GAAAA,GAAAA,CAZE5sD,GAAAA,KAAuC;AAE/D,UAAA,IADIA,GAAAA,CAAE,GAAA,KAAQ,OAAA,IAAWA,GAAAA,CAAE,WAAA,CAAY,WAAA,IACnCmrB,GAAAA,EAAO,MAAA,IAAUA,GAAAA,CAAM,gBAAA,CAAiB,UAAA,IAAc,IAAA,EAAM;AAChE,UAAA,IAAMmI,GAAAA,GAAOtzB,IAAE,aAAA,CAAc,KAAA;AACzBszB,UAAAA,GAAAA,KAAS,EAAA,IAAIs5B,GAAAA,GAAet5B,GAAI,CAAA;QACtC,CAAA,GAO0D;OACrD,CAAA;AACA/tB,MAAAA,GAAAA;AACD,sBAAAZ,IAACwjC,MAAAA,EAAD;AAAW,QAAA,SAAA,EAAWjnC,GAAAA,CAAE,UAAA;QAAY,YAAA,EAAW,cAAA;QAC7C,QAAA,kBAAAyD,IAAC,KAAA,EAAD;UAAK,OAAA,EAAQ,WAAA;UAAY,aAAA,EAAY,MAAA;UACnC,QAAA,kBAAAA,IAAC,MAAA,EAAD;YAAM,CAAA,EAAE,gBAAA;YAAiB,IAAA,EAAK,MAAA;YAAO,MAAA,EAAO,cAAA;YAAe,WAAA,EAAY,KAAA;YAAM,aAAA,EAAc,OAAA;YAAQ,cAAA,EAAe;WAAS;SACxH;OACI;AACR;;AAET;AAMA,SAAS8jC,GAAAA,CACPzoC,KACAe,GAAAA,EACa;AAEb,EAAA,OADI+xB,GAAAA,KAAY,SACT0X,QAAAA,CAAS,OAAA,CAAQjlC,GAAQ,CAAA,CAAE,GAAA,CAAA,CAAKvF,GAAAA,KACrCyqC,cAAAA,CAAyCxqC,GAAC,IAAIA,GAAAA,CAAE,KAAA,CAAM,WAAWA,GACnE,CAAA,GAHkC6yB,IAAQ,GAAA,CAAA,CAAK9yB,GAAAA,KAAM2I,GAAAA,CAAE,KAAK,CAAA;AAI9D;AAQA,SAAgB8jD,IAAa,EAAE,SAAA,EAAAzsD,GAAAA,EAAW,GAAGyE,KAAAA,EAA2B;AACtE,EAAA,uBAAOE,IAACkmC,WAAAA,EAAD;IAAgB,GAAIpmC,GAAAA;IAAM,SAAA,EAAW,CAACvD,IAAE,MAAA,EAAQkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG;GAAI,CAAA;AAChG;;;;;;;;;;AC7NA,SAAgBynD,IAAY1rD,GAAAA,EAAyB;AACnD,EAAA,IAAM,EAAE,KAAA,EAAAC,GAAAA,EAAO,UAAA,EAAAC,KAAY,YAAA,EAAAyD,GAAAA,EAAc,SAAA,EAAAjD,GAAAA,EAAW,GAAG4C,GAAAA,EAAAA,GAASC,GAAAA,EAC1DooD,GAAAA,GAAaC,OAAcrrD,GAAAA,KAAU,MAAA;AAC3C,EAAA,uBACEiD,KAACqoD,MAAAA,EAAD;IAAW,GAAIvoD,GAAAA;IAAM,SAAA,EAAW,CAACvD,IAAE,MAAA,EAAQkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAA9E,IAAA,QAAA,EAAA,EACI1D,GAAAA,KAAU,MAAA,IAAaorD,GAAAA,qBACvBnoD,KAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWzD,GAAAA,CAAE,IAAA;AAAlB,MAAA,QAAA,EAAA,CACGQ,GAAAA,KAAU,MAAA,oBAAaX,IAACmnC,KAAAA,EAAD;AAAO,QAAA,SAAA,EAAWhnC,GAAAA,CAAE,KAAA;QAAQ,QAAA,EAAAQ;AAAa,OAAA,CAAA,EAChEorD,GAAAA,oBACC/rD,GAAAA,CAACksD,YAAAA,EAAD;AAAc,QAAA,SAAA,EAAW/rD,GAAAA,CAAE,MAAA;AACvB,QAAA,QAAA,EAAA,CAAA,EAAE,KAAA,EAAAlB,GAAAA,EAAA,KAAY;AACd,UAAA,IAAMH,GAAAA,GAAIsrB,IAAM,MAAA,CAAO,MAAA,KAAW,IAAIA,GAAAA,CAAM,MAAA,CAAO,CAAA,CAAA,GAAKA,GAAAA,CAAM,MAAA;AAC9D,UAAA,OAAO+hC,GAAAA,GAAeA,GAAAA,CAAartD,GAAC,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQA,GAAC,CAAA,GAAIA,GAAAA,CAAE,IAAA,CAAK,UAAK,CAAA,GAAI,OAAOA,GAAC,CAAA;AACrF,QAAA;AACY,OAAA,CAEb;KAEP,CAAA,kBAAAkB,GAAAA,CAAC06C,WAAAA,EAAD;AAAa,MAAA,SAAA,EAAWv6C,GAAAA,CAAE,KAAA;AACtB,MAAA,QAAA,EAAA,CAAA,EAAE,KAAA,EAAAsD,GAAAA,EAAA,KAAY;AAGd,QAAA,IAAM2oD,MAAYhiC,GAAAA,CAAM,MAAA,CAAO,SAAS,CAAA,GAAIA,GAAAA,CAAM,gBAAgB,CAAC,CAAA,GAAI,GAAA,GAAM,CAAA,EACvEiiC,MAAUjiC,GAAAA,CAAM,eAAA,CAAgBA,IAAM,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,GAAI,GAAA;AACjE,QAAA,uBACExmB,KAAAM,QAAAA,EAAA,EAAA,UAAA,iBACElE,IAAC,KAAA,EAAD;AACE,UAAA,SAAA,EAAWG,GAAAA,CAAE,IAAA;UACb,KAAA,EAAO;AAAE,YAAA,IAAA,EAAM,GAAGisD,GAAAA,CAAAA,CAAAA,CAAAA;YAAc,KAAA,EAAO,CAAA,EAAG,MAAMC,GAAAA,CAAAA,CAAAA;AAAW;SAC5D,CAAA,EACAjiC,IAAM,MAAA,CAAO,GAAA,CAAA,CAAKnrB,GAAAA,EAAG2E,GAAAA,qBACpB5D,GAAAA,CAACssD,WAAAA,EAAD;UAAqB,KAAA,EAAOpsD,GAAAA;AAAG,UAAA,SAAA,EAAWC,GAAAA,CAAE;AAAQ,SAAA,EAAlCD,GAAkC,CACrD,CACD,CAAA,EAAA,CAAA;AAEN,MAAA;AACW,KAAA,CACJ;;AAEf;;;;;;;;;;;;ACMA,SAAgBqsD,IAAQlsD,GAAAA,EAAqB;AAC3C,EAAA,IAAM,EACJ,QAAA,EAAA2S,GAAAA,EACA,SAAA,EAAAiK,GAAAA,EACA,OAAAne,GAAAA,EACA,MAAA,EAAAoG,GAAAA,EACA,MAAA,EAAA1C,GAAAA,GAAS,QAAA,EACT,MAAA2C,GAAAA,EACA,KAAA,EAAAkjB,GAAAA,GAAQ,KAAA,EACR,eAAA,EAAAnY,GAAAA,EACA,WAAAI,GAAAA,EACA,UAAA,EAAA2S,GAAAA,EACA,UAAA,EAAAC,GAAAA,EACA,SAAA,EAAAC,MAAY,KAAA,EACZ,MAAA,EAAAC,GAAAA,GAAS,EAAA,EACT,SAAA,EAAAvkB,GAAAA,GAAY,KACZ,YAAA,EAAAqW,GAAAA,EACA,4BAAA,EAAAwB,GAAAA,EACA,YAAA,EAAcwN,GAAAA,EACd,mBAAmBsoC,GAAAA,EACnB,eAAA,EAAAlpC,GAAAA,EACA,GAAG5f,GAAAA,EAAAA,GACDC,GAAAA,EACE8oD,EAAAA,GAAY9jD,MAAAA,CAAwB,IAAI,CAAA,EACxCsc,EAAAA,GAAUxe,EAAAA,CAAU;IAAE,MAAA,EAAAjE,GAAAA;IAAQ,IAAA,EAAA2C;AAAK,GAAC,GACpC,EAAE,MAAA,EAAQunD,EAAAA,EAAc,WAAA,EAAAngD,IAAA,GAAgBvJ,EAAAA,CAAiBiB,GAAe,CAAA,EACxEkgC,KAAYC,GAAAA,IAAmB,CAACuoB,GAAAA,EAKhCC,EAAAA,GAAejkD,OAAOkkD,GAAS,CAAA;AACrC,EAAA7oB,GAAa,OAAA,GAAU6oB,GAAAA;AACvB,EAAA,IAAMC,EAAAA,GAAiBnkD,MAAAA,CAAAA,CAAQ1J,GAAAA,KAAqB;AAC9C,IAAAA,GAAAA,CAAE,GAAA,KAAQ,QAAA,IAAU2tD,EAAAA,CAAa,OAAA,IAAU;EACjD,CAAC,CAAA,EACKG,KAAcpkD,MAAAA,CAA2B,IAAI,GAC7CqkD,EAAAA,GAAYziC,WAAAA,CAAAA,CAAatrB,GAAAA,KAA6B;AAC1D8tD,IAAAA,EAAAA,CAAY,OAAA,EAAS,mBAAA,CAAoB,SAAA,EAAWD,GAAe,OAAO,CAAA,EAC1ErmB,EAAAA,CAAY,OAAA,GAAU3E,GAAAA,EACtBA,GAAAA,EAAM,gBAAA,CAAiB,SAAA,EAAWgrB,GAAe,OAAO,CAAA;AAC1D,EAAA,CAAA,EAAG,EAAE,CAAA,EACCG,KAAUvkD,KAAAA,EAAM,EAOhBwkD,KAAgBC,GAAAA,KAAe,MAAA;AACrC,EAAAvlD,UAAA,MAAgB;AACTslD,IAAAA,EAAAA,IAAiB,OAAO,MAAA,GAAW,GAAA,IACxC,OAAO,aAAA,CAAc,IAAI,KAAA,CAAM,QAAQ,CAAC,CAAA;EAC1C,CAAA,EAAG;AAACA,IAAAA,EAAAA;IAAeC,GAAAA,EAAY,CAAA;IAAGA,GAAAA,EAAY,CAAA;IAAGA,GAAAA,EAAY,KAAA;IAAOA,GAAAA,EAAY;GAAO,CAAA;AAGvF,EAAA,IAAMC,EAAAA,GACJT,OAASpmD,GAAAA,KAAU,MAAA,GAAY0mD,KAAUT,GAAAA,EACrCa,EAAAA,GAAmBV,MAAQzoC,GAAAA,GAAY,MAAA;AAC7C,EAAA,uBACEhkB,IAAAA,CAAAgE,QAAAA,EAAA,EAAA,QAAA,EAAA;AACGwoD,IAAAA,EAAAA;AAEAS,IAAAA,GAAAA,KAAe,MAAA,IACd/9B,YAAAA,iBACE3rB,GAAAA,CAAC,MAAA,EAAD;MACE,GAAA,EAAKgpD,EAAAA;MACL,qBAAA,EAAoB,EAAA;AACpB,MAAA,SAAA,EAAWtsD,GAAAA,CAAE,MAAA;MACb,aAAA,EAAY,MAAA;MAEZ,KAAA,EAAO;AACL,QAAA,IAAA,EAAMgtD,GAAAA,CAAW,CAAA;AACjB,QAAA,GAAA,EAAKA,GAAAA,CAAW,CAAA;AAChB,QAAA,KAAA,EAAOA,GAAAA,CAAW,KAAA;AAClB,QAAA,MAAA,EAAQA,GAAAA,CAAW;AACrB;KACD,CAAA,EACD,SAAS,IACX,CAAA;AACF,oBAAAjtD,KAAC8nC,OAAAA,EAAD;MACE,GAAItkC,GAAAA;MACJ,UAAA,EAAYypD,GAAAA,KAAe,SAAwBvmB,GAAAA,GAAZ6lB,EAAAA;AACvC,MAAA,UAAA,EAAY,CAACE,GAAAA;MACF,SAAA,EAAAxpC,GAAAA;MACH,MAAA,EAAAC,GAAAA;MACG,SAAA,EAAAvkB,GAAAA;MACG,YAAA,EAAAqW,GAAAA;MACd,4BAAA,EACEo4C,GAAAA,KAAiCX,GAAAA,GAAAA,MAAc,KAAA,GAAQ,MAAA,CAAA;MAEzD,YAAA,EAAYU,EAAAA;MACZ,iBAAA,EAAiBD,EAAAA;MACjB,SAAA,EAAW,CAACjtD,IAAE,OAAA,EAASkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;MAC1D,GAAI4gB,EAAAA;MACJ,qBAAA,EAAoB,EAAA;MACpB,GAAI3gB,EAAAA;MAhBN,QAAA,EAAA,iBAkBEb,GAAAA,CAACc,YAAAA,EAAD;AAAc,QAAA,SAAA,EAAWpE,GAAAA,CAAE,KAAA;QACzB,QAAA,kBAAAsD,IAAC,KAAA,EAAD;UAAK,KAAA,EAAO,EAAA;UAAI,MAAA,EAAQ,EAAA;UAAI,OAAA,EAAQ,WAAA;UAAY,aAAA,EAAY,MAAA;AAC1D,UAAA,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAD,EAAM,CAAA,EAAE,mBAAmB;SACxB;OACO,CAAA,kBACdA,GAAAA,CAAC+gC,MAAAA,EAAD;AACE,QAAA,IAAA,EAAMmoB,MAAQ,aAAA,GAAgB,QAAA;AAC9B,QAAA,SAAA,EAAWxsD,GAAAA,CAAE,MAAA;QACb,YAAA,EAAY+jB,GAAAA;QACZ,iBAAA,EAAiBsoC,GAAAA;QACjB,GAAA,EAAKQ,EAAAA;QAEH,QAAA,EAAA,CAAA,EAAE,KAAA,EAAA/tD,GAAAA,uBACFiB,IAAAA,CAAAgE,QAAAA,EAAA,EAAA,QAAA,EAAA;AACIqC,UAAAA,CAAAA,GAAAA,KAAU,MAAA,IAAa49B,EAAAA,qBACvBjkC,IAAAA,CAAC,QAAA,EAAD;AAAQ,YAAA,SAAA,EAAWC,GAAAA,CAAE,MAAA;AAArB,YAAA,QAAA,EAAA,CACGoG,GAAAA,KAAU,MAAA,oBACT9C,IAACghC,OAAAA,EAAD;cAAS,EAAA,EAAIwoB,EAAAA;cAAS,IAAA,EAAK,OAAA;AAAQ,cAAA,SAAA,EAAW9sD,GAAAA,CAAE,KAAA;cAC7C,QAAA,EAAAoG;AACM,aAAA,CAAA,EAEV49B,EAAAA,oBACC1gC,GAAAA,CAAC,QAAA,EAAD;cACE,IAAA,EAAK,QAAA;AACL,cAAA,SAAA,EAAWtD,GAAAA,CAAE,KAAA;AACb,cAAA,OAAA,EAAA,MAAe;AAMbukC,gBAAAA,GAAAA,EAAM,EACNL,GAAAA,GAAe,KAAK,GACpBwoB,GAAAA,IAAY;AACd,cAAA,CAAA;cACA,YAAA,EAAW,eAAA;cACZ,QAAA,EAAA;AAEO,aAAA,CAEJ;;AAEV,0BAAAppD,IAAC,KAAA,EAAD;AAAK,YAAA,SAAA,EAAWtD,GAAAA,CAAE,IAAA;YAAO,QAAA,EAAA6S;WAAc,CAAA;UACtC4xB,GAAAA,KAAW,MAAA,oBAAanhC,GAAAA,CAAC,QAAA,EAAD;AAAQ,YAAA,SAAA,EAAWtD,GAAAA,CAAE,MAAA;YAAS,QAAA,EAAAykC;WAAe;AACtE,SAAA,EAAA;AAEK,OAAA,CACD;;AACZ,GAAA,EAAA,CAAA;AAEN;ACtKA,SAAgB2oB,IAAa3pD,GAAAA,EAA0B;AACrD,EAAA,IAAM4pD,GAAAA,GAA+B;IACnC,GAAG7pD,GAAAA;AACH,IAAA,YAAA,EAAcA,IAAM,YAAA,IAAgB,aAAA;IACpC,KAAA,EAAO,KAAA;IACP,IAAA,EAAM,KAAA;IACN,SAAA,EAAW;AACb,GAAA;AACA,EAAA,uBAAO3D,GAAAA,CAAC4iC,EAAAA,EAAD,EAAa,GAAI4qB,KAAa,CAAA;AACvC;ACpEA,IAAMC,GAAAA,GAAM,4CAAA;AAAZ,IACMC,GAAAA,GAAM,uDAAA;AADZ,IAEMC,GAAAA,GAAiB,kEAAA;AAFvB,IAGMC,GAAAA,uBAAe,GAAA,CAAI;AACvB,EAAA,aAAA;AACA,EAAA,cAAA;AACA,EAAA,OAAA;AACA,EAAA,OAAA;AACA,EAAA,MAAA;AACA,EAAA,QAAA;AACA,EAAA,KAAA;AACA,EAAA,QAAA;AACA,EAAA,QAAA;AACA,EAAA,MAAA;AACA,EAAA,MAAA;AACA,EAAA,OAAA;AACA,EAAA,MAAA;AACA,EAAA,MAAA;AACA,EAAA,MAAA;AACA,EAAA,MAAA;AACA,EAAA,QAAA;AACA,EAAA,SAAA;AACA,EAAA,MAAA;AACA,EAAA;AACF,CAAC,CAAA;AAID,SAASC,GAAAA,GAA4B;AACnC,EAAA,OAAO,OAAO,GAAA,GAAQ,GAAA,IAAe,OAAO,GAAA,CAAI,QAAA,IAAa,UAAA,GAAA,CACxD5uD,GAAAA,KAAU,GAAA,CAAI,QAAA,CAAS,OAAA,EAASuzB,GAAK,CAAA,GACtC,IAAA;AACN;AAGA,SAAgBs7B,GAAAA,CAAc7uD,GAAAA,EAAee,GAAAA,GAAqB6tD,GAAAA,EAAgB,EAAY;AAC5F,EAAA,IAAM/uD,GAAAA,GAAI0zB,IAAM,IAAA,EAAK;AAIrB,EAAA,OAFI,CAAC1zB,OAAKA,GAAAA,CAAE,QAAA,CAAS,MAAM,CAAA,GAAU,KAAA,GACjCivD,GAAAA,GAAiBA,GAAAA,CAASjvD,GAAC,CAAA,GACxB2uD,IAAI,IAAA,CAAK3uD,GAAC,CAAA,IAAK6uD,GAAAA,CAAe,IAAA,CAAK7uD,GAAC,KAAK8uD,GAAAA,CAAS,GAAA,CAAI9uD,GAAAA,CAAE,WAAA,EAAa,CAAA;AAC9E;AAEA,SAASkvD,IAAM/uD,GAAAA,EAA0B;AACvC,EAAA,IAAIwuD,GAAAA,CAAI,IAAA,CAAK3uD,GAAC,CAAA,EAAG;AACf,IAAA,IAAMinC,GAAAA,GAASjnC,GAAAA,CAAE,KAAA,CAAM,CAAC,EAAE,WAAA,EAAY;AACtC,IAAA,OAAO,CAAA,CAAA,EAAIinC,GAAAA,CAAO,MAAA,IAAU,CAAA,GAAI,CAAC,GAAGA,GAAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK9mC,GAAAA,KAAMqB,GAAAA,GAAIA,GAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GAAIylC,GAAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAA,CAAA;AACxG,EAAA;AACA,EAAA,IAAMoM,GAAAA,GAAMub,GAAAA,CAAI,IAAA,CAAK5uD,GAAC,CAAA;AACtB,EAAA,OAAOqzC,GAAAA,GACH,CAAA,CAAA,EAAIA,GAAAA,CACD,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CACV,GAAA,CAAA,CAAKlzC,GAAAA,KAAM,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO2E,GAAC,CAAC,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CACjE,IAAA,CAAK,EAAE,CAAA,CAAA,CAAA,GACV,IAAA;AACN;AAEA,IAAIyxC,GAAAA;AAGJ,SAAS4Y,IAAWhvD,GAAAA,EAA8B;AAChD,EAAA,IAAIo2C,GAAAA,KAAU,QACZ,IAAI;AACF,IAAAnlC,MAAQ,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAAE,WAAW,IAAI,CAAA;EAC1D,CAAA,CAAA,MAAQ;AACN,IAAAA,GAAAA,GAAQ,IAAA;AACV,EAAA;AAEF,EAAA,IAAI,CAACmlC,KAAO,OAAO,IAAA;AAEnB,EAAAnlC,GAAAA,CAAM,SAAA,GAAY,SAAA,EAClBA,GAAAA,CAAM,SAAA,GAAYsiB,GAAAA;AAClB,EAAA,IAAM07B,GAAAA,GAAU,MAAA,CAAO7Y,GAAAA,CAAM,SAAS,CAAA;AAGtC,EAAA,OAFAnlC,GAAAA,CAAM,SAAA,GAAY,SAAA,EAClBA,GAAAA,CAAM,SAAA,GAAYsiB,GAAAA,EACX07B,GAAAA,KAAY,MAAA,CAAO7Y,GAAAA,CAAM,SAAS,CAAA,GAAI6Y,GAAAA,GAAU,IAAA;AACzD;AAGA,SAAgBC,GAAMlvD,GAAAA,EAA8B;AAClD,EAAA,IAAMH,MAAI0zB,GAAAA,CAAM,IAAA,EAAK,EACf47B,GAAAA,GAASJ,IAAMlvD,GAAC,CAAA;AACtB,EAAA,IAAIsvD,KAAQ,OAAOA,GAAAA;AACnB,EAAA,IAAMC,MAAU,OAAO,QAAA,GAAa,GAAA,GAAc,IAAA,GAAOJ,IAAWnvD,GAAC,CAAA;AACrE,EAAA,OAAOuvD,GAAAA,IAAWA,GAAAA,KAAYvvD,GAAAA,GAAIkvD,GAAAA,CAAMK,GAAO,CAAA,GAAI,IAAA;AACrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvDMC,IAAAA,EAAAA,GAAAA,CAAUrvD,GAAAA,KAAc,IAAA,CAAK,KAAA,CAAM2E,GAAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAOpD,SAAgB2qD,EAAAA,CAAWtvD,GAAAA,EAAmBe,GAAAA,EAA8B4D,GAAAA,EAAwC;AAClH,EAAA,IAAMuV,MAAQq1C,GAAAA,CAAQ,CAAA,KAAM3zC,GAAAA,CAAM,IAAA,EAC5B3B,MAAOs1C,GAAAA,CAAQ,EAAA,CAAG,EAAE,CAAA,IAAKr1C,KACzBs1C,GAAAA,GAAQ,IAAA,CAAK,IAAI,CAAA,EAAGD,GAAAA,CAAQ,SAAS,CAAC,CAAA;AAC5C,EAAA,QAAQ5a,GAAAA;IACN,KAAK,SAAA;AACH,MAAA,OAAO;QAAE,GAAG/4B,GAAAA;QAAO,IAAA,EAAM;UAAE,IAAA,EAAA7a,GAAAA;UAAM,OAAA,EAASwuD,GAAAA,CAAQ,GAAA,CAAA,CAAKxuD,GAAAA,KAAO6a,GAAAA,CAAM,IAAA,GAAOyzC,EAAAA,CAAO5oD,GAAAA,GAAImV,GAAAA,CAAM,IAAI,CAAA,GAAI,CAAE;AAAE;AAAE,OAAA;IAC5G,KAAK,OAAA;AACH,MAAA,OAAO;QAAE,GAAGA,GAAAA;QAAO,IAAA,EAAM1B,GAAAA;QAAO,IAAA,EAAM;UAAE,IAAA,EAAAnZ,GAAAA;AAAM,UAAA,KAAA,EAAOmZ,MAAQ,CAAA,GAAIm1C,EAAAA,CAAAA,CAAQp1C,MAAOC,GAAAA,MAAW,CAAA,GAAIs1C,IAAM,CAAA,GAAI;AAAE;AAAE,OAAA;IAC/G,KAAK,MAAA;AACH,MAAA,OAAO;QAAE,GAAG5zC,GAAAA;QAAO,IAAA,EAAM1B,GAAAA;QAAO,IAAA,EAAM;UAAE,IAAA,EAAAnZ,GAAAA;UAAM,IAAA,EAAMsuD,EAAAA,CAAAA,CAAQp1C,GAAAA,GAAOC,GAAAA,IAASs1C,GAAK;AAAE;AAAE,OAAA;AACzF;AACF;AAKA,IAAaC,EAAAA,GAAoE;AAC/E,EAAA;IAAE,EAAA,EAAI,OAAA;IAAS,KAAA,EAAO;AAAQ,GAAA;AAC9B,EAAA;IAAE,EAAA,EAAI,MAAA;IAAQ,KAAA,EAAO;AAAO,GAAA;AAC5B,EAAA;IAAE,EAAA,EAAI,MAAA;IAAQ,KAAA,EAAO;AAAO,GAAA;AAC5B,EAAA;IAAE,EAAA,EAAI,QAAA;IAAU,KAAA,EAAO;AAAS,GAAA;AAChC,EAAA;IAAE,EAAA,EAAI,OAAA;IAAS,KAAA,EAAO;AAAQ,GAAA;AAC9B,EAAA;IAAE,EAAA,EAAI,OAAA;IAAS,KAAA,EAAO;AAAQ;AAChC,CAAA;AAPA,IASMC,EAAAA,GAAa,+CAAA;AAGnB,SAAgBC,GAAc3vD,GAAAA,EAAkC;AAC9D,EAAA,QAAQ83B,IAAM,IAAA;IACZ,KAAK,OAAA;AACH,MAAA,OAAO,OAAA;IACT,KAAK,YAAA;IACL,KAAK,YAAA;AACH,MAAA,OAAO,MAAA;IACT,KAAK,UAAA;IACL,KAAK,aAAA;AACH,MAAA,OAAO,QAAA;IACT,KAAK,QAAA;IACL,KAAK,UAAA;AACH,MAAA,OAAO,OAAA;IACT,KAAK,WAAA;IACL,KAAK,QAAA;AAGH,MAAA,OAFI43B,EAAAA,CAAW,IAAA,CAAK53B,GAAAA,CAAM,KAAK,IAAU,MAAA,GACrCA,GAAAA,CAAM,IAAA,KAAS,QAAA,KAAaA,IAAM,KAAA,KAAU,GAAA,IAAOA,GAAAA,CAAM,KAAA,KAAU,aAAmB,OAAA,GACnF,MAAA;AACT,IAAA;AACE,MAAA,OAAO,OAAA;AACX;AACF;AAEA,IAAM83B,KAAS,MAAA,CAAO,GAAA,CAAA,qBAAA,CAAA;AAAtB,IACMC,EAAAA,GAAgB,MAAA,CACpB,CAAA,CAAA,EAAID,EAAAA,sFACJ,GACF,CAAA;AAJA,IAKME,EAAAA,GAAe,MAAA,CAAO,CAAA,CAAA,EAAIF,EAAAA,CAAAA,IAAAA,CAAY,CAAA;AAL5C,IAMMG,EAAAA,GAAa,MAAA,CAAO,CAAA,CAAA,EAAIH,EAAAA,CAAAA,CAAAA,CAAS,CAAA;AANvC,IAOMI,EAAAA,GAAa,MAAA,CAAO,CAAA,CAAA,EAAIJ,EAAAA,CAAAA,eAAAA,CAAuB,CAAA;AAPrD,IAQMK,EAAAA,GAAa,MAAA,CAAO,CAAA,qBAAA,EAAwBL,EAAAA,CAAAA,WAAAA,EAAoBA,EAAAA,CAAAA,WAAAA,EAAoBA,EAAAA,CAAAA,WAAAA,EAAoBA,EAAAA,CAAAA,SAAAA,CAAAA,EAAmB,GAAG,CAAA;AARpI,IASMM,EAAAA,GAAW,qDAAA;AATjB,IAWMC,EAAAA,GAAS,cAAA;AAXf,IAYMC,EAAAA,GAAQ,wBAAA;AAEd,SAASC,GAASrwD,GAAAA,EAAwB;AACxC,EAAA,OAAOuzB,IAAM,KAAA,CAAM48B,EAAM,CAAA,CAAE,KAAA,CAAA,CAAOnwD,GAAAA,KAAU;AAC1C,IAAA,IAAMwD,GAAAA,GAAQogC,GAAAA,CAAM,IAAA,EAAK,CAAE,QAAQ,YAAA,EAAc,EAAE,CAAA,CAAE,KAAA,CAAMwsB,EAAK,CAAA,IAAK,EAAC,EAChEE,MAAU9sD,GAAAA,CAAM,MAAA,CAAA,CAAQxD,GAAAA,KAASgwD,EAAAA,CAAO,IAAA,CAAKO,GAAI,CAAC,GAClD9rD,GAAAA,GAAOjB,GAAAA,CAAM,MAAA,CAAA,CAAQxD,GAAAA,KAAS,CAACgwD,EAAAA,CAAO,IAAA,CAAKO,GAAI,CAAC,CAAA;AACtD,IAAA,OAAOD,GAAAA,CAAQ,MAAA,IAAU,CAAA,IAAKA,GAAAA,CAAQ,UAAU,CAAA,IAAK7rD,GAAAA,CAAK,MAAA,IAAU,CAAA,IAAKA,IAAK,KAAA,CAAA,CAAOzE,GAAAA,KAAS6uD,GAAAA,CAAc0B,GAAI,CAAC,CAAA;EACnH,CAAC,CAAA;AACH;AAGA,SAAgBC,GAAexwD,GAAAA,EAAuB;AACpD,EAAA,IAAMH,GAAAA,GAAI0zB,IAAM,IAAA,EAAK;AASrB,EAAA,OARK1zB,GAAAA,GACDiwD,EAAAA,CAAS,IAAA,CAAKjwD,GAAC,IAAU,UAAA,GACzBgwD,EAAAA,CAAU,IAAA,CAAKhwD,GAAC,IAAU,WAAA,GAC1BkwD,EAAAA,CAAO,IAAA,CAAKlwD,GAAC,IAAU,QAAA,GACvBowD,EAAAA,CAAO,IAAA,CAAKpwD,GAAC,CAAA,GAAU,aAAA,GACvBqwD,EAAAA,CAAS,IAAA,CAAKrwD,GAAC,CAAA,GAAU,UAAA,GACzBgvD,GAAAA,CAAchvD,GAAC,IAAU,OAAA,GACzBwwD,EAAAA,CAASxwD,GAAC,CAAA,GAAU,WACjB,QAAA,GARQ,QAAA;AASjB;AAGA,SAAgB4wD,GAAUzwD,GAAAA,EAAwD;AAChF,EAAA,IAAM0wD,GAAAA,GAAY,MAAA,CAAO,CAAA,EAAA,EAAKd,EAAAA,CAAAA,WAAAA,CAAAA,EAAqB,GAAG,CAAA,CAAE,IAAA,CAAKr8B,GAAAA,CAAM,IAAA,EAAM,CAAA;AACzE,EAAA,OAAOm9B,GAAAA,GAAQ;IAAE,MAAA,EAAQ,MAAA,CAAOA,GAAAA,CAAM,CAAA,CAAE,CAAA;IAAG,IAAA,EAAMA,GAAAA,CAAM,CAAA,CAAA,IAAM;GAAG,GAAI,IAAA;AACtE;AAGA,SAAgBC,GAAa3wD,GAAAA,EAAiE;AAC5F,EAAA,IAAM0wD,GAAAA,GAAQT,EAAAA,CAAO,IAAA,CAAK18B,GAAAA,CAAM,MAAM,CAAA;AACtC,EAAA,IAAI,CAACm9B,KAAO,OAAO,IAAA;AACnB,EAAA,IAAM,CAACzvC,GAAAA,EAAI2vC,GAAAA,EAAI1vC,GAAAA,EAAI2vC,GAAAA,CAAAA,GAAMH,GAAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AACrD,EAAA,OAAO;AAACzvC,IAAAA,GAAAA;AAAI2vC,IAAAA,GAAAA;AAAI1vC,IAAAA,GAAAA;AAAI2vC,IAAAA;AAAE,GAAA;AACxB;ACvFA,IAAMC,EAAAA,GAAU;AAAC,EAAA,KAAA;AAAO,EAAA,KAAA;AAAO,EAAA,KAAA;AAAO,EAAA,KAAA;AAAO,EAAA,KAAA;AAAO,EAAA,KAAA;AAAO,EAAA,KAAA;AAAO,EAAA,KAAA;AAAO,EAAA;AAAK,CAAA;AAA9E,IACMC,EAAAA,GAAgB;EAAE,qBAAA,EAAuB,CAAA;EAAG,WAAA,EAAa;AAAM,CAAA;AADrE,IAMMC,EAAAA,uBAAa,GAAA,CAAI;AAAC,EAAA,WAAA;AAAa,EAAA,UAAA;AAAY,EAAA;AAAQ,CAAC,CAAA;AAE1D,SAASC,GAAajxD,GAAAA,EAAsC;AAE1D,EAAA,OADI83B,GAAAA,CAAM,IAAA,KAAS,OAAA,GAAgB,QAAA,GAC5Bk5B,EAAAA,CAAO,GAAA,CAAIl5B,GAAAA,CAAM,IAAI,CAAA,IAAK24B,EAAAA,CAAU34B,GAAAA,CAAM,KAAK,IAAI,OAAA,GAAU,IAAA;AACtE;AAEA,SAASo5B,EAAAA,CAAQlxD,KAA+Be,GAAAA,EAA4B;AAC1E,EAAA,IAAMowD,GAAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,IAAWr5B,OAASs5B,GAAAA,EAAQ;AAC1B,IAAA,IAAMzc,GAAAA,GAAOsc,GAAan5B,GAAK,CAAA;AAC3B6c,IAAAA,OAAMwc,GAAAA,CAAO,GAAA,CAAI,GAAGxc,GAAAA,CAAAA,CAAAA,EAAQ7c,IAAM,KAAA,CAAA,CAAA,EAAA,CAAUq5B,IAAO,GAAA,CAAI,CAAA,EAAGxc,GAAAA,CAAAA,CAAAA,EAAQ7c,GAAAA,CAAM,KAAA,CAAA,CAAO,CAAA,IAAK,KAAK,CAAC,CAAA;AAChG,EAAA;AACA,EAAA,IAAMu5B,GAAAA,mBAAW,IAAI,GAAA,EAAiD,EAChE9qD,MAAgB,EAAC;AACvB,EAAA,KAAA,IAAWuxB,OAASs5B,GAAAA,EAAQ;AAC1B,IAAA,IAAMzc,GAAAA,GAAOsc,GAAan5B,GAAK,CAAA,EACzBjG,MAAM,CAAA,EAAG8iB,GAAAA,CAAAA,CAAAA,EAAQ7c,GAAAA,CAAM,KAAA,CAAA,CAAA;AAC7B,IAAA,IAAI,CAAC6c,GAAAA,IAAAA,CAASwc,GAAAA,CAAO,IAAIt/B,GAAG,CAAA,IAAK,KAAKy/B,GAAAA,EAAY;AAChD,MAAArwD,IAAM,IAAA,CAAK;QAAE,IAAA,EAAM,KAAA;QAAO,KAAA,EAAAwF;OAAO,CAAA;AACjC,MAAA;AACF,IAAA;AACA,IAAA,IAAI+uC,GAAAA,GAAS6b,GAAAA,CAAS,GAAA,CAAIx/B,GAAG,CAAA;AACxB2jB,IAAAA,QACHt0C,GAAAA,GAAS;MAAE,IAAA,EAAAlB,GAAAA;AAAM,MAAA,KAAA,EAAO83B,GAAAA,CAAM,KAAA;AAAO,MAAA,MAAA,EAAQ;AAAG,KAAA,EAChDu5B,GAAAA,CAAS,GAAA,CAAIx/B,GAAAA,EAAK2jB,GAAM,CAAA,EACxBjvC,GAAAA,CAAM,IAAA,CAAKivC,GAAM,CAAA,CAAA,EAEnBA,GAAAA,CAAO,MAAA,CAAO,IAAA,CAAK1d,GAAK,CAAA;AAC1B,EAAA;AACA,EAAA,OAAOvxB,GAAAA;AACT;AAGA,SAASgrD,GAAWvxD,GAAAA,EAAoC;AACtD,EAAA,IAAM09C,GAAAA,GAAQ9W,GAAAA,CAAM,GAAA,CAAA,CAAK5mC,QAASS,GAAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,GAChEyxC,GAAAA,GAAS,CAAA;AACb,EAAA,OAAOwL,IAAM,KAAA,CAAA,CAAO19C,GAAAA,KAAasQ,GAAAA,CAAS,SAAS4hC,GAAAA,IAAU5hC,GAAAA,CAAS4hC,GAAAA,CAAAA,KAAYwL,IAAM,CAAA,CAAA,GAAKxL,GAAAA,CAAO,KAAGvtC,GAAAA,EAAAA;AACvG,EAAA,OAAO+4C,GAAAA,CAAM,GAAA,CAAA,CAAK19C,GAAAA,KAAasQ,IAAS,KAAA,CAAM4hC,GAAM,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,KAAM5hC,GAAAA,CAAS,EAAA,CAAG,EAAE,KAAK,EAAA,CAAG,CAAA;AAC5F;AAEA,SAASkhD,GAAM,EAAE,MAAA,EAAAxxD,GAAAA,EAAQ,KAAA,EAAAe,KAAA,EAA+E;AACtG,EAAA,IAAM,CAACkgB,KAAI2vC,GAAAA,EAAI1vC,GAAAA,EAAI2vC,GAAAA,CAAAA,GAAMpmD,GAAAA,EAEnBiE,GAAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAIkiD,GAAAA,EAAI,CAAA,GAAIC,GAAE,CAAA,EAChCY,GAAAA,GAAS,IAAA,CAAK,IAAI,CAAA,EAAG,CAAA,GAAIb,GAAAA,EAAI,CAAA,GAAIC,GAAE,CAAA;AACzC,EAAA,uBACE1vD,IAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWD,EAAAA,CAAE,KAAA;AAAO,IAAA,OAAA,EAAS,QAAQwN,GAAAA,GAAM,GAAA,CAAA,KAAA,EAAW+iD,GAAAA,GAAS/iD,MAAM,GAAA,CAAA,CAAA;IAAO,IAAA,EAAK,KAAA;IAAM,YAAA,EAAYhN,GAAAA;IACtG,QAAA,kBAAAP,IAAC,MAAA,EAAD;MAAM,CAAA,EAAG,CAAA,MAAA,EAAS8f,GAAAA,CAAAA,CAAAA,EAAM,CAAA,GAAI2vC,GAAAA,CAAAA,CAAAA,EAAM1vC,GAAAA,CAAAA,CAAAA,EAAM,CAAA,GAAI2vC,GAAAA,CAAAA,IAAAA,CAAAA;MAAU,IAAA,EAAK,MAAA;MAAO,MAAA,EAAO,cAAA;MAAe,WAAA,EAAa;KAAO;GACzG,CAAA;AAET;AAEA,SAASa,GAAa,EAAE,KAAA,EAAA1xD,GAAAA,EAAO,GAAA,EAAAe,KAAA,EAA4D;AACzF,EAAA,IAAM,EAAE,IAAA,EAAA4D,GAAAA,EAAM,IAAA,EAAAH,GAAAA,EAAM,OAAAtD,GAAAA,EAAA,GAAU42B,GAAAA,EACxBp2B,GAAAA,GAAQ,CAAA,EAAGjB,GAAAA,UACXs0C,GAAAA,GAAM1mB,OAAAA,CAAAA,MAAelc,GAAAA,KAAS,OAAA,GAAU+8C,EAAAA,CAAM37B,GAAK,CAAA,GAAI,IAAA,EAAO,CAACphB,GAAAA,EAAMohB,GAAK,CAAC,CAAA;AAEjF,EAAA,IAAIphB,GAAAA,KAAS,WAAA,IAAeA,GAAAA,KAAS,UAAA,IAAcA,QAAS,QAAA,EAAU;AACpE,IAAA,IAAMurC,GAAAA,GAAQ+S,GAAUl9B,GAAK,CAAA;AAC7B,IAAA,IAAImqB,GAAAA,EACF,uBACEt8C,IAAAA,CAAA6D,QAAAA,EAAA,EAAA,QAAA,EAAA,iBACE9D,GAAAA,CAACkqC,EAAAA,EAAD;AACE,MAAA,SAAA,EAAWnqC,EAAAA,CAAE,MAAA;MACb,YAAA,EAAYQ,GAAAA;AACZ,MAAA,KAAA,EAAOg8C,GAAAA,CAAM,MAAA;MACb,YAAA,EAAA,IAAA;MACA,aAAA,EAAeqT,EAAAA;AACf,MAAA,QAAA,EAAA,CAAWpsD,GAAAA,KAAW;AAChB,QAAA,MAAA,CAAO,QAAA,CAASgtD,GAAM,CAAA,IAAG59B,GAAAA,CAAI,GAAG49B,GAAAA,CAAAA,EAASjU,GAAAA,CAAM,IAAA,CAAA,CAAM,CAAA;AAC3D,MAAA;AACD,KAAA,CAAA,EACAA,GAAAA,CAAM,IAAA,mBAAOv8C,IAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWD,EAAAA,CAAE,IAAA;AAAO,MAAA,QAAA,EAAAw8C,GAAAA,CAAM;KAAW,CAAA,GAAI,IAC7D,CAAA,EAAA,CAAA;AAGR,EAAA;AAEA,EAAA,IAAIvrC,QAAS,YAAA,EAAc;AACzB,IAAA,IAAM2gB,GAAAA,GAAAA,CAAWg+B,EAAAA,CAAQ,QAAA,CAASv9B,GAAK,CAAA,GAAIu9B,EAAAA,GAAU,CAAC,GAAGA,EAAAA,EAASv9B,GAAK,CAAA,EAAG,GAAA,CAAA,CAAKvzB,GAAAA,MAAY;MACzF,KAAA,EAAOy1C,GAAAA;MACP,KAAA,EAAOA;KACT,CAAE,CAAA;AACF,IAAA,uBAAOt0C,IAACmmC,EAAAA,EAAD;MAAQ,YAAA,EAAY7mC,GAAAA;MAAM,KAAA,EAAM,KAAA;MAAM,WAAA,EAAa8yB,GAAAA;MAAgB,OAAA,EAAAvzB,GAAAA;MAAS,iBAAA,EAAmB+zB;KAAM,CAAA;AAC9G,EAAA;AAEA,EAAA,IAAMtpB,GAAAA,GAAS0H,GAAAA,KAAS,aAAA,GAAgBw+C,EAAAA,CAAap9B,GAAK,CAAA,GAAI,IAAA;AAC9D,EAAA,uBACEnyB,KAAA6D,QAAAA,EAAA,EAAA,UAAA,CACGwF,GAAAA,mBAAStJ,GAAAA,CAACqwD,EAAAA,EAAD;IAAe,MAAA,EAAA3wD,GAAAA;AAAQ,IAAA,KAAA,EAAO,GAAGJ,GAAAA,CAAAA,MAAAA;AAAe,GAAA,CAAA,GAAI,IAAA,kBAC9DU,GAAAA,CAAC4pC,GAAAA,EAAD;AACE,IAAA,SAAA,EAAW7pC,EAAAA,CAAE,KAAA;IACb,YAAA,EAAYQ,GAAAA;IACL,KAAA,EAAAR,GAAAA;IACP,QAAA,EAAU6yB,GAAAA;AACV,IAAA,gBAAA,EACE5hB,GAAAA,KAAS,OAAA,GAAsB4iC,GAAAA,mBAC7B5zC,IAAC,OAAA,EAAD;MACE,IAAA,EAAK,OAAA;AACL,MAAA,SAAA,EAAWD,EAAAA,CAAE,WAAA;AACb,MAAA,YAAA,EAAY,GAAGT,GAAAA,CAAAA,MAAAA,CAAAA;MACf,KAAA,EAAOs0C,GAAAA;AACP,MAAA,QAAA,EAAA,CAAW/0C,GAAAA,KAAU+zB,GAAAA,CAAI69B,GAAAA,CAAM,OAAO,KAAK;KAC5C,CAAA,mBAEDzwD,GAAAA,CAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWD,EAAAA,CAAE,IAAA;MAAM,KAAA,EAAO,EAAE,iBAAiBqyB,GAAAA,EAAM;MAAoB,aAAA,EAAY;AAAQ,KAAA,CAAA,GAThF;GAYtB,CACD,GAAA,CAAA;AAEN;AAEA,IAAMs+B,EAAAA,GAAWC,KACf,SAAkB,EAAE,OAAA9xD,GAAAA,EAAO,QAAA,EAAAe,KAAA,EAAuD;AAChF,EAAA,IAAMgzB,GAAAA,GAAMzI,WAAAA,CAAAA,CAAa3mB,GAAAA,KAAkB+/B,GAAAA,CAAS5M,GAAAA,CAAM,IAAA,EAAMvE,GAAK,CAAA,EAAG,CAACmR,GAAAA,EAAU5M,GAAAA,CAAM,IAAI,CAAC,CAAA;AAC9F,EAAA,uBACE12B,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWF,EAAAA,CAAE,GAAA;IAAK,IAAA,EAAK,OAAA;AAAQ,IAAA,YAAA,EAAY42B,GAAAA,CAAM,IAAA;IAAtD,QAAA,EAAA,iBACE32B,GAAAA,CAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWD,EAAAA,CAAE,IAAA;MAAM,KAAA,EAAO42B,GAAAA,CAAM,eAAeA,GAAAA,CAAM,IAAA;AACxD,MAAA,QAAA,EAAAA,GAAAA,CAAM;KACH,CAAA,kBACN12B,IAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWF,EAAAA,CAAE,IAAA;MAAlB,QAAA,EAAA,iBACEC,GAAAA,CAACuwD,EAAAA,EAAD;QAAqB,KAAA,EAAA1xD,GAAAA;QAAY,GAAA,EAAAwE;AAAM,OAAA,CAAA,EACtCszB,GAAAA,CAAM,UAAA,mBACL32B,IAACgoB,EAAAA,EAAD;QAAQ,OAAA,EAAQ,OAAA;QAAQ,IAAA,EAAK,IAAA;QAAK,SAAA,EAAW,CAAA,MAAA,EAAS2O,IAAM,IAAA,CAAA,CAAA;AAAQ,QAAA,OAAA,EAAA,MAAe4M,GAAAA,CAAS5M,GAAAA,CAAM,IAAA,EAAM,IAAI,CAAA;QAAG,QAAA,EAAA;AAEvG,OAAA,IACN,IACD;AACF,KAAA,CAAA;;AAET,CAAA,EAAA,CAEC93B,GAAAA,EAAGe,GAAAA,KACF0F,GAAAA,CAAE,QAAA,KAAalD,IAAE,QAAA,IACjBkD,GAAAA,CAAE,KAAA,CAAM,IAAA,KAASlD,IAAE,KAAA,CAAM,IAAA,IACzBkD,GAAAA,CAAE,KAAA,CAAM,SAASlD,GAAAA,CAAE,KAAA,CAAM,IAAA,IACzBkD,GAAAA,CAAE,MAAM,KAAA,KAAUlD,GAAAA,CAAE,KAAA,CAAM,KAAA,IAC1BkD,IAAE,KAAA,CAAM,UAAA,KAAelD,GAAAA,CAAE,KAAA,CAAM,cAC/BkD,GAAAA,CAAE,KAAA,CAAM,WAAA,KAAgBlD,GAAAA,CAAE,MAAM,WACpC,CAAA;AAEA,SAASwuD,GAAAA,CAAO,EAAE,KAAA,EAAAptD,GAAAA,EAAO,QAAAH,GAAAA,EAAQ,QAAA,EAAAvD,KAAA,EAAkF;AACjH,EAAA,IAAM,CAAC+wD,GAAAA,EAAQC,GAAAA,CAAAA,GAAa/tD,SAAwB,IAAI,CAAA,EAClD4zB,GAAAA,GAAQs5B,GAAAA,CAAO,KAAA,CAAMpxD,GAAAA,KAAMe,GAAAA,CAAE,IAAA,KAASixD,GAAM,CAAA,IAAK,IAAA;AACvD,EAAA,uBACE5wD,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWF,EAAAA,CAAE,MAAA;IAAQ,IAAA,EAAK,OAAA;IAAQ,YAAA,EAAYwF,GAAAA;IAAnD,QAAA,EAAA;AACE,sBAAAvF,IAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWD,EAAAA,CAAE,IAAA;QAAO,QAAA,EAAAwF;OAAY,CAAA;AACtC,sBAAAvF,IAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAWD,EAAAA,CAAE,KAAA;AACf,QAAA,QAAA,EAAAkwD,IAAO,GAAA,CAAA,CAAKzsD,GAAAA,qBACXvD,KAACmD,EAAAA,EAAD;UAA6B,KAAA,EAAO,CAAA;UAApC,QAAA,EAAA,iBACEpD,GAAAA,CAACoG,SAAAA,EAAD,EAAA,QAAA,kBACEpG,IAAC,QAAA,EAAD;YACE,IAAA,EAAK,QAAA;AACL,YAAA,SAAA,EAAWD,EAAAA,CAAE,MAAA;YACb,KAAA,EAAO,EAAE,eAAA,EAAiBH,GAAAA,CAAE,KAAA,EAAM;AAClC,YAAA,YAAA,EAAYA,GAAAA,CAAE,IAAA;AACd,YAAA,cAAA,EAAcA,IAAE,IAAA,KAASixD,GAAAA;YACzB,iBAAA,EAAiBjxD,GAAAA,CAAE,aAAa,EAAA,GAAK,MAAA;YACrC,OAAA,EAAA,MAAekxD,IAAAA,CAAWjyD,GAAAA,KAAam5B,QAAYp4B,GAAAA,CAAE,IAAA,GAAO,IAAA,GAAOA,GAAAA,CAAE,IAAK;WAC3E,CAAA,EACQ,CAAA,kBACXI,GAAAA,CAAC0D,EAAAA,EAAD,EAAA,QAAA,EAAU9D,GAAAA,CAAE,IAAA,EAAc,CACZ;SAbK,EAAAA,GAAAA,CAAE,IAaP,CACjB;OACE,CAAA;MACJ+2B,GAAAA,mBAAQ32B,IAAC0wD,EAAAA,EAAD;QAAiB,KAAA,EAAA3wD,GAAAA;QAAiB,QAAA,EAAAD;AAAW,OAAA,CAAA,GAAI;AACvD;;AAET;AAEA,SAASixD,GAAAA,CAAU,EACjB,KAAA,EAAAlyD,GAAAA,EACA,OAAAe,GAAAA,EACA,QAAA,EAAA4D,GAAAA,EACA,MAAA,EAAAH,GAAAA,EACA,QAAA,EAAAvD,GAAAA,EACA,cAAA,EAAAwF,KAAA,EAQC;AACD,EAAA,IAAMi3C,GAAAA,GAAQ+S,EAAAA,CAAU34B,GAAAA,CAAM,KAAK,CAAA;AAEnC,EAAA,OADK4lB,GAAAA,mBAEHt8C,IAAAA,CAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWF,EAAAA,CAAE,IAAA;IAAM,KAAA,EAAO42B,GAAAA,CAAM,eAAeA,GAAAA,CAAM,IAAA;IAAM,iBAAA,EAAiBA,GAAAA,CAAM,aAAa,EAAA,GAAK,MAAA;IAAzG,QAAA,EAAA;AACE,sBAAA32B,IAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWD,EAAAA,CAAE,SAAA;QAAY,QAAA,EAAAQ;OAAY,CAAA;AAC3C,sBAAAN,KAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWF,EAAAA,CAAE,QAAA;QAAnB,QAAA,EAAA,iBACEC,GAAAA,CAACkqC,EAAAA,EAAD;AACE,UAAA,SAAA,EAAWnqC,EAAAA,CAAE,MAAA;UACb,YAAA,EAAY,CAAA,EAAG42B,IAAM,IAAA,CAAA,MAAA,CAAA;AACrB,UAAA,KAAA,EAAO4lB,GAAAA,CAAM,MAAA;UACb,YAAA,EAAA,IAAA;UACA,aAAA,EAAeqT,EAAAA;AACf,UAAA,QAAA,EAAA,CAAWhwD,GAAAA,KAAW;AAChB,YAAA,MAAA,CAAO,QAAA,CAAS4wD,GAAM,CAAA,IAAGjtB,GAAAA,CAAS5M,GAAAA,CAAM,IAAA,EAAM,CAAA,EAAG65B,GAAAA,CAAAA,EAASjU,GAAAA,CAAM,IAAA,CAAA,CAAM,CAAA;AAC5E,UAAA;AACD,SAAA,GACAyU,GAAAA,IAAYzU,GAAAA,CAAM,IAAA,mBAAOv8C,IAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAWD,EAAAA,CAAE,IAAA;AAAO,UAAA,QAAA,EAAAw8C,GAAAA,CAAM;AAAW,SAAA,IAAI,IACrE;;AACLjX,MAAAA,GAAAA,KAAW,MAAA,IAAa2rB,GAAAA,mBACvBhxD,IAAAA,CAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWF,EAAAA,CAAE,QAAA;QAAnB,QAAA,EAAA,iBACEC,GAAAA,CAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAWD,EAAAA,CAAE,IAAA;UAAM,QAAA,EAAA;SAAO,CAAA,kBAChCC,GAAAA,CAACkqC,EAAAA,EAAD;AACE,UAAA,SAAA,EAAWnqC,EAAAA,CAAE,MAAA;UACb,YAAA,EAAY,CAAA,EAAG42B,IAAM,IAAA,CAAA,OAAA,CAAA;UACrB,KAAA,EAAO2O,GAAAA;UACP,YAAA,EAAA,IAAA;UACA,aAAA,EAAesqB,EAAAA;AACf,UAAA,QAAA,EAAA,CAAW/wD,GAAAA,KAAS;AACd,YAAA,MAAA,CAAO,QAAA,CAASoL,GAAI,CAAA,IAAGgnD,GAAAA,CAAehnD,GAAI,CAAA;AAChD,UAAA;AACD,SAAA,CACG;AACJ,OAAA,CAAA,GAAA;AACD;AAhCY,GAAA,CAAA,GAAA,IAAA;AAkCrB;AAEA,IAAMinD,GAAAA,GAA0D;AAC9D,EAAA;IAAE,KAAA,EAAO,SAAA;IAAW,KAAA,EAAO,MAAA;IAAQ,SAAA,EAAW;AAAU,GAAA;AACxD,EAAA;IAAE,KAAA,EAAO,OAAA;IAAS,KAAA,EAAO;AAAQ,GAAA;AACjC,EAAA;IAAE,KAAA,EAAO,MAAA;IAAQ,KAAA,EAAO;AAAO;AACjC,CAAA;AAEA,SAASC,GAAAA,CAAkB,EACzB,KAAA,EAAAtyD,GAAAA,EACA,KAAA,EAAAe,GAAAA,EACA,IAAA,EAAA4D,GAAAA,EACA,OAAA,EAAAH,GAAAA,EACA,aAAA,EAAAvD,GAAAA,EAAA,EAOC;AACD,EAAA,IAAM,EAAE,MAAAwF,GAAAA,EAAA,GAASmV,KACX22C,GAAAA,GACJC,GAAAA,CAAK,SAAS,OAAA,GACV;IAAE,GAAA,EAAK,OAAA;AAAkB,IAAA,KAAA,EAAOA,GAAAA,CAAK;GAAM,GAC3CA,GAAAA,CAAK,SAAS,MAAA,GACZ;IAAE,GAAA,EAAK,MAAA;AAAiB,IAAA,KAAA,EAAOA,GAAAA,CAAK;GAAK,GACzC,IAAA;AACR,EAAA,uBACEpxD,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWF,EAAAA,CAAE,IAAA;IAAlB,QAAA,EAAA;AACE,sBAAAE,KAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWF,EAAAA,CAAE,QAAA;QAAnB,QAAA,EAAA;AACE,0BAAAC,IAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAWD,EAAAA,CAAE,SAAA;YAAW,QAAA,EAAA;WAAU,CAAA;AACxC,0BAAAC,IAACkqC,EAAAA,EAAD;AACE,YAAA,SAAA,EAAWnqC,EAAAA,CAAE,MAAA;AACb,YAAA,YAAA,EAAY,GAAGwF,GAAAA,CAAAA,KAAAA,CAAAA;AACf,YAAA,KAAA,EAAOkV,GAAAA,CAAM,IAAA;YACb,YAAA,EAAA,IAAA;YACA,aAAA,EAAem1C,EAAAA;AACf,YAAA,QAAA,EAAA,CAAW/wD,GAAAA,KAAS;AACd,cAAA,MAAA,CAAO,QAAA,CAASkmB,GAAI,CAAA,IAAGusC,GAAAA,CAAc;gBAAE,GAAG72C,GAAAA;gBAAO,IAAA,EAAA5b;eAAM,CAAA;AAC7D,YAAA;WACD,CAAA;UACAy8C,GAAAA,mBAAOt7C,IAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAWD,EAAAA,CAAE,IAAA;YAAO,QAAA,EAAAu7C;AAAW,WAAA,CAAA,GAAI;AAC7C;;AACN,sBAAAt7C,IAAC8rC,GAAAA,EAAD;AACE,QAAA,SAAA,EAAW,GAAGvmC,GAAAA,CAAAA,KAAAA,CAAAA;QACd,IAAA,EAAK,IAAA;QACL,KAAA,EAAO2rD,GAAAA;AACP,QAAA,KAAA,EAAOG,GAAAA,CAAK,IAAA;AACZ,QAAA,QAAA,EAAA,CAAWxyD,GAAAA,KAAS;AACd20C,UAAAA,GAAAA,IAAQA,QAAS6d,GAAAA,CAAK,IAAA,IAAMC,IAAcnD,EAAAA,CAAW1zC,GAAAA,EAAO+4B,GAAAA,EAAM4a,GAAO,CAAC,CAAA;AAChF,QAAA;OACD,CAAA;MACAgD,GAAAA,mBACCnxD,KAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWF,EAAAA,CAAE,QAAA;AAAnB,QAAA,QAAA,EAAA,CACGqxD,GAAAA,CAAM,GAAA,KAAQ,OAAA,mBAAUpxD,IAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAWD,EAAAA,CAAE,IAAA;UAAM,QAAA,EAAA;SAAO,CAAA,mBAAIC,GAAAA,CAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAWD,EAAAA,CAAE,IAAA;UAAM,QAAA,EAAA;SAAO,CAAA,kBAC7FC,GAAAA,CAACkqC,EAAAA,EAAD;AACE,UAAA,SAAA,EAAWnqC,EAAAA,CAAE,MAAA;AACb,UAAA,YAAA,EAAY,CAAA,EAAGwF,GAAAA,CAAAA,CAAAA,EAAS6rD,GAAAA,CAAM,GAAA,CAAA,CAAA;AAC9B,UAAA,KAAA,EAAOA,GAAAA,CAAM,KAAA;UACb,YAAA,EAAA,IAAA;UACA,aAAA,EAAexB,EAAAA;AACf,UAAA,QAAA,EAAA,CAAW/wD,GAAAA,KAAU;AACf,YAAA,MAAA,CAAO,QAAA,CAASuzB,GAAK,CAAA,IAAGk/B,GAAAA,CAAc;cAAE,GAAG72C,GAAAA;cAAO,IAAA,EAAM;AAAE,gBAAA,IAAA,EAAM22C,GAAAA,CAAM,GAAA;AAAMA,gBAAAA,CAAAA,GAAAA,CAAM,GAAA,GAAMh/B;AAAM;aAAqB,CAAA;AACzH,UAAA;AACD,SAAA,CACG;AACJ,OAAA,CAAA,GAAA;AACD;;AAET;AAEA,SAASm/B,GAAAA,CAAM,EACb,KAAA,EAAA1yD,GAAAA,EACA,MAAA,EAAAe,GAAAA,EACA,SAAA,EAAAyD,GAAAA,EACA,QAAA,EAAAvD,GAAAA,EACA,aAAA,EAAAwF,GAAAA,EAAA,EAOC;AACD,EAAA,IAAMK,GAAAA,GAASunB,QAAAA,MAAckjC,EAAAA,CAAWH,IAAO,GAAA,CAAA,CAAKpxD,GAAAA,KAAMe,GAAAA,CAAE,IAAI,CAAC,GAAG,CAACqwD,GAAM,CAAC,CAAA,EACtEnrB,GAAAA,GAAQ,IAAI,GAAA,CAAImrB,GAAAA,CAAO,GAAA,CAAA,CAAKpxD,GAAAA,KAAMywD,EAAAA,CAAU1vD,IAAE,KAAK,CAAA,EAAG,QAAQ,EAAE,CAAC,GACjE07C,GAAAA,GAAOxW,GAAAA,CAAM,IAAA,KAAS,CAAA,GAAI,CAAC,GAAGA,GAAK,CAAA,CAAE,CAAA,IAAK,IAAA,EAC1C0sB,GAAAA,GAAavB,IAAO,MAAA,CAAA,CAAQpxD,GAAAA,KAAMe,GAAAA,CAAE,UAAU,CAAA;AACpD,EAAA,uBACEK,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWF,EAAAA,CAAE,KAAA;IAAO,IAAA,EAAK,OAAA;IAAQ,YAAA,EAAYwF,GAAAA;IAAlD,QAAA,EAAA;AACE,sBAAAtF,KAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWF,EAAAA,CAAE,SAAA;QAAnB,QAAA,EAAA;AACE,0BAAAC,IAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAWD,EAAAA,CAAE,IAAA;YAAO,QAAA,EAAAwF;WAAY,CAAA;UACrC+1C,GAAAA,mBAAOt7C,IAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAWD,EAAAA,CAAE,IAAA;YAAO,QAAA,EAAAu7C;AAAW,WAAA,CAAA,GAAI,IAAA;AAChDkW,UAAAA,GAAAA,CAAW,MAAA,GAAS,CAAA,mBACnBxxD,GAAAA,CAACgoB,EAAAA,EAAD;YACE,OAAA,EAAQ,OAAA;YACR,IAAA,EAAK,IAAA;AACL,YAAA,SAAA,EAAW,SAASziB,GAAAA,CAAAA,CAAAA;AACpB,YAAA,OAAA,EAAA,MAAe;AACb,cAAA,KAAA,IAAW3F,OAAK4xD,GAAAA,EAAY1xD,GAAAA,CAASF,GAAAA,CAAE,MAAM,IAAI,CAAA;AACnD,YAAA,CAAA;YACD,QAAA,EAAA;AAEO,WAAA,CAAA,GACN;AACA;;MACL6xD,GAAAA,IAAaH,GAAAA,mBACZtxD,GAAAA,CAACmxD,GAAAA,EAAD;QACS,KAAA,EAAAtyD,GAAAA;QACP,KAAA,EAAO4yD,GAAAA;AACP,QAAA,IAAA,EAAMnW,GAAAA,IAAQ,EAAA;AACd,QAAA,OAAA,EAASmW,IAAU,MAAA,CAAO,GAAA,CAAA,CACvB5yD,GAAAA,KAASywD,EAAAA,CAAUW,IAAO,IAAA,CAAA,CAAMrwD,QAAMA,GAAAA,CAAE,IAAA,KAASN,GAAI,CAAA,EAAG,KAAA,IAAS,EAAE,CAAA,EAAG,MAAA,IAAUmyD,IAAU,IAC7F,CAAA;AACA,QAAA,aAAA,EAAA,CAAgB7xD,GAAAA,KAAS0xD,GAAAA,CAAc/rD,GAAAA,EAAO0E,GAAI;AACnD,OAAA,CAAA,GACC,IAAA;AACJ,sBAAAjK,IAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAWD,EAAAA,CAAE,KAAA;AACf,QAAA,QAAA,EAAAkwD,GAAAA,CAAO,GAAA,CAAA,CAAKrwD,GAAAA,EAAG4D,GAAAA,KAAM;AACpB,UAAA,IAAM6tD,GAAAA,GAAOI,KAAW,IAAA,EAClBlmC,GAAAA,GAAKkmC,MAAYA,GAAAA,CAAU,MAAA,CAAO,QAAQ7xD,GAAAA,CAAE,IAAI,IAAI,EAAA,EACpD0lC,GAAAA,GAAS+rB,KAAM,IAAA,KAAS,SAAA,IAAa9lC,OAAM,CAAA,GAAI8lC,GAAAA,CAAK,OAAA,CAAQ9lC,GAAAA,CAAAA,GAAM,MAAA;AACxE,UAAA,uBACEvrB,IAAC+wD,GAAAA,EAAD;YAEE,KAAA,EAAOnxD,GAAAA;YACP,KAAA,EAAO+F,GAAAA,CAAO7F,GAAAA,CAAAA,IAAMF,GAAAA,CAAE,IAAA;AACtB,YAAA,QAAA,EAAU07C,GAAAA,KAAS,IAAA;YACX,MAAA,EAAAp7C,GAAAA;YACE,QAAA,EAAAJ,GAAAA;YACV,cAAA,EACE2xD,GAAAA,IAAaH,OAAiBD,GAAAA,EAAM,IAAA,KAAS,YAAA,CACxCzxD,GAAAA,KACC0xD,IAAc/rD,GAAAA,EAAO;cACnB,GAAGksD,GAAAA;cACH,IAAA,EAAM;gBAAE,IAAA,EAAM,SAAA;gBAAW,OAAA,EAASJ,GAAAA,CAAK,QAAQ,GAAA,CAAA,CAAKxyD,KAAG2E,GAAAA,KAAO8S,GAAAA,KAAMiV,GAAAA,GAAKthB,GAAAA,GAAOtG,GAAE;AAAE;AACtF,aAAC,CAAA,GACH;AAEP,WAAA,EAfM/D,IAAE,IAeR,CAAA;QAEL,CAAC;OACE;AACF;;AAET;AAEA,SAAS8xD,IAAQ,EACf,KAAA,EAAA7yD,KACA,IAAA,EAAAe,GAAAA,EACA,UAAA4D,GAAAA,EACA,MAAA,EAAA1D,GAAAA,EACA,UAAA,EAAAwF,KACA,MAAA,EAAAkC,GAAAA,EACA,UAAAzH,GAAAA,EACA,aAAA,EAAAjB,KAAA,EAUC;AACD,EAAA,IAAMsG,GAAAA,GAAQ8nB,OAAAA,CAAAA,MAAc6iC,EAAAA,CAAQE,GAAAA,EAAQE,GAAU,CAAA,EAAG,CAACF,GAAAA,EAAQE,GAAU,CAAC,CAAA;AAC7E,EAAA,uBACElwD,KAAC,SAAA,EAAD;AAAS,IAAA,SAAA,EAAWF,EAAAA,CAAE,OAAA;IAAS,YAAA,EAAYoG,GAAAA;IAA3C,QAAA,EAAA,iBACEnG,GAAAA,CAACgsB,GAAAA,EAAD;AAAe,MAAA,SAAA,EAAWjsB,EAAAA,CAAE,WAAA;MAAmB,IAAA,EAAAH,GAAAA;MAAgB,QAAA,EAAA4D,GAAAA;MAAU,KAAA,EAAO2C,GAAAA;MAC9E,QAAA,kBAAAnG,IAAC,MAAA,EAAD;QAAM,aAAA,EAAY,MAAA;QAAQ,QAAA,EAAAmG;OAAY;AACzB,KAAA,CAAA,EACdylB,GAAAA,mBACC5rB,GAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWD,EAAAA,CAAE,WAAA;MACf,QAAA,EAAAqF,GAAAA,CAAM,IAAA,CAAKvG,GAAAA,KACV4F,IAAK,IAAA,KAAS,KAAA,mBACZzE,GAAAA,CAAC0wD,EAAAA,EAAD;AAAgC,QAAA,KAAA,EAAOjsD,GAAAA,CAAK,KAAA;QAAiB,QAAA,EAAA1E;OAAW,EAAzD0E,GAAAA,CAAK,MAAM,IAA8C,CAAA,GACtEA,IAAK,IAAA,KAAS,OAAA,mBAChBzE,GAAAA,CAACuxD,GAAAA,EAAD;AAEE,QAAA,KAAA,EAAO9sD,GAAAA,CAAK,KAAA;AACZ,QAAA,MAAA,EAAQA,GAAAA,CAAK,MAAA;QACb,SAAA,EAAWktD,GAAAA,GAASltD,IAAK,KAAA,CAAA;QACf,QAAA,EAAA1E,GAAAA;QACK,aAAA,EAAAjB;AAChB,OAAA,EANM,SAAS2F,GAAAA,CAAK,KAAA,EAMpB,CAAA,mBAEDzE,IAAC4wD,GAAAA,EAAD;AAAqC,QAAA,KAAA,EAAOnsD,GAAAA,CAAK,KAAA;AAAO,QAAA,MAAA,EAAQA,GAAAA,CAAK,MAAA;QAAkB,QAAA,EAAA1E;AAAW,OAAA,EAArF,CAAA,OAAA,EAAU0E,GAAAA,CAAK,KAAA,CAAA,CAAsE,CAEtG;AACG,KAAA,IACH,IACG;;AAEb;AAWA,SAAgBmtD,GAAAA,CAAW,EACzB,MAAA,EAAA/yD,GAAAA,EACA,QAAA,EAAAe,KACA,SAAA,EAAA4D,GAAAA,EACA,iBAAA,EAAAH,GAAAA,EACA,MAAA,EAAAvD,GAAAA,EACA,eAAAwF,GAAAA,EACA,UAAA,EAAAkC,GAAAA,GAAagnD,EAAAA,EACb,UAAA,EAAAzuD,GAAAA,GAAa,CAAA,EACb,OAAA,EAAAjB,GAAAA,GAAU,QAAA,EACV,SAAA,EAAAmB,GAAAA,EAAA,EACkB;AAClB,EAAA,IAAM,CAAC4xD,GAAAA,EAAcC,GAAAA,CAAAA,GAAmB/uD,QAAAA,CAAkD,EAAE,CAAA,EACtFgvD,GAAAA,GAASpT,GAAAA,IAAakT,GAAAA,EACtBG,GAAAA,GAAa9kC,QAAAA,MAAc;AAC/B,IAAA,IAAM+kC,GAAAA,uBAAe,GAAA,EAAiC;AACtD,IAAA,KAAA,IAAWt7B,OAASs5B,GAAAA,EAAQ;AAC1B,MAAA,IAAMiC,GAAAA,GAAWC,IAAWx7B,GAAK,CAAA;AACjC,MAAA/2B,GAAAA,CAAS,GAAA,CAAIsyD,GAAAA,EAAU,CAAC,GAAID,GAAAA,CAAS,GAAA,CAAIC,GAAQ,CAAA,IAAK,EAAC,EAAIv7B,GAAK,CAAC,CAAA;AACnE,IAAA;AACA,IAAA,OAAOs7B,GAAAA;EACT,CAAA,EAAG,CAAChC,GAAAA,EAAQkC,GAAU,CAAC,CAAA;AAEvB,EAAA,uBACEnyD,IAAC,KAAA,EAAD;IAAK,SAAA,EAAW;MAACD,EAAAA,CAAE,KAAA;AAAOqwC,MAAAA,GAAAA,KAAY,WAAWrwC,EAAAA,CAAE,KAAA;AAAOkE,MAAAA;AAAS,KAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAC1F,QAAA,EAAAqqD,EAAAA,CAAiB,IAAA,CAAK,EAAE,IAAAzvD,GAAAA,EAAI,KAAA,EAAA2I,KAAA,KAAY;AACvC,MAAA,IAAM4qD,GAAAA,GAAYJ,GAAAA,CAAW,GAAA,CAAI5oC,GAAE,CAAA;AACnC,MAAA,IAAI,CAACgpC,KAAW,OAAO,IAAA;AACvB,MAAA,IAAMxmC,GAAAA,GAAO,CAACmmC,GAAAA,CAAO3oC,GAAAA,CAAAA;AACrB,MAAA,uBACEppB,IAAC0xD,GAAAA,EAAD;QAES,KAAA,EAAAlqD,GAAAA;QACD,IAAA,EAAAvH,GAAAA;AACN,QAAA,QAAA,EAAA,MAAgB;AACV0+C,UAAAA,GAAAA,KAAc,MAAA,IAAWmT,GAAAA,CAAAA,CAAiBlyD,GAAAA,MAAU;YAAE,GAAGmK,GAAAA;AAAOqf,YAAAA,CAAAA,GAAAA,GAAKwC;WAAK,CAAE,CAAA,EAChFgzB,GAAAA,GAAoBx1B,GAAAA,EAAIwC,GAAI,CAAA;AAC9B,QAAA,CAAA;QACA,MAAA,EAAQwmC,GAAAA;QACI,UAAA,EAAAryD,GAAAA;QACJ,MAAA,EAAAD,GAAAA;QACE,QAAA,EAAAF,GAAAA;QACK,aAAA,EAAA0F;AAChB,OAAA,EAZM8jB,GAYN,CAAA;IAEL,CAAC;GACE,CAAA;AAET;;;;;;;ACrfA,SAAgBipC,IAAIryD,GAAAA,EAAiB;AACnC,EAAA,IAAM,EAAE,OAAAE,GAAAA,EAAO,KAAA,EAAAyD,KAAO,OAAA,EAAAjD,GAAAA,EAAS,QAAAhB,GAAAA,EAAQ,MAAA,EAAAkE,KAAQ,OAAA,EAAAgP,GAAAA,EAAS,MAAAiK,GAAAA,GAAO,MAAA,EAAQ,SAAAne,GAAAA,EAAS,SAAA,EAAAoG,GAAAA,EAAA,GAC9EvB,GAAAA,EAEIuV,GAAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG5E,MAAQ,CAAC,CAAA,EAC5BqX,MAAK,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAIrC,GAAAA,EAAO,CAAC,CAAA,EAAGpQ,GAAI,GACtCw5C,GAAAA,GAAS,CAAA,EAAGhX,GAAAA,CAAAA,CAAAA,EAAQ/vB,GAAAA,GAAK,CAAA,CAAA,IAAA,EAAQrX,GAAAA,CAAAA,CAAAA;AAEvC,EAAA,uBACEnU,KAAC,KAAA,EAAD;IAAK,SAAA,EAAW,CAACA,IAAE,GAAA,EAAKkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAA3D,QAAA,EAAA;AACE,sBAAAuD,IAACwgB,EAAAA,EAAD;QACE,QAAA,EAAA,IAAA;QACA,IAAA,EAAK,IAAA;QACL,OAAA,EAAQ,OAAA;QACR,SAAA,EAAW,CAAA,SAAA,EAAYszB,GAAAA,CAAK,WAAA,EAAY,CAAA,CAAA;AACxC,QAAA,QAAA,EAAU/vB,GAAAA,IAAM,CAAA;QAChB,OAAA,EAAA,MAAegnC,IAAO,EAAE,CAAA;AAExB,QAAA,QAAA,kBAAA/qD,GAAAA,CAAC/F,EAAAA,EAAD,EAAc,IAAA,EAAM,IAAK;OACnB,CAAA;AACR,sBAAA+F,IAACwgB,EAAAA,EAAD;QACE,QAAA,EAAA,IAAA;QACA,IAAA,EAAK,IAAA;QACL,OAAA,EAAQ,OAAA;AACR,QAAA,SAAA,EAAWwqC,MAAU,OAAA,GAAU,MAAA;AAC/B,QAAA,QAAA,EAAUt+C,GAAAA,GAAQ,CAAA;QAClB,OAAA,EAAA,MAAeu+C,GAAAA,CAAO,CAACD,GAAO,CAAA;AAE7B,QAAA,QAAA,EAAUE,IAAVF,GAAAA,GAAWjxD,EAAAA,GAA0BD,IAA3B,EAAW,IAAA,EAAM,IAA8B;OACpD,CAAA;AACR,sBAAAkG,IAACwgB,EAAAA,EAAD;QACE,QAAA,EAAA,IAAA;QACA,IAAA,EAAK,IAAA;QACL,OAAA,EAAQ,OAAA;QACR,SAAA,EAAW,CAAA,KAAA,EAAQszB,GAAAA,CAAK,WAAA,EAAY,CAAA,CAAA;AACpC,QAAA,QAAA,EAAU/vB,GAAAA,IAAMzS,GAAAA;QAChB,OAAA,EAAA,MAAey5C,IAAO,CAAC,CAAA;AAEvB,QAAA,QAAA,kBAAA/qD,GAAAA,CAAC9F,CAAAA,EAAD,EAAiB,IAAA,EAAM,IAAK;OACtB,CAAA;MAEPixD,GAAAA,oBACCnrD,IAACsmC,EAAAA,EAAD;AACE,QAAA,SAAA,EAAW/tC,GAAAA,CAAE,KAAA;QACb,GAAA,EAAK,CAAA;QACL,GAAA,EAAK+Y,GAAAA;QACL,IAAA,EAAM,CAAA;QACN,IAAA,EAAK,QAAA;QACL,OAAA,EAAQ,MAAA;QACR,SAAA,EAAWwiC,GAAAA;AACX,QAAA,MAAA,EAAQ,CAAC;UAAE,KAAA,EAAO/vB,GAAAA;UAAI,SAAA,EAAW+mC;SAAQ,CAAA;QACzC,OAAA,EAAA,CAAUzzD,GAAAA,KAAS8zD,GAAAA,CAAQ,IAAA,CAAK,KAAA,CAAM1oD,IAAK,CAAA,CAAA,EAAI,KAAA,IAAS,CAAC,CAAC;OAC3D,CAAA;AAGH,sBAAAlK,KAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWA,GAAAA,CAAE,OAAA;QAAS,aAAA,EAAY,aAAA;QAAxC,QAAA,EAAA;UACG6yD,GAAAA,CAAIrnC,GAAAA,GAAK,GAAGrX,GAAK,CAAA;AAAE,UAAA,GAAA;AAAEA,UAAAA;AAClB;;MACL2+C,GAAAA,mBAAUrrD,IAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWzH,GAAAA,CAAE,OAAA;QAAU,QAAA,EAAA8yD;AAAc,OAAA,CAAA,GAAI;AACvD;;AAET;AAOA,SAASD,GAAAA,CAAI/zD,KAAee,GAAAA,EAAuB;AACjD,EAAA,OAAO,MAAA,CAAOwyB,GAAK,CAAA,CAAE,QAAA,CAAS,OAAOle,GAAK,CAAA,CAAE,QAAQ,QAAG,CAAA;AACzD;ACqBA,IAAM4+C,GAAAA,GAA0D;EAC9D,IAAA,EAAM;IAAE,SAAA,EAAW,MAAA;IAAQ,GAAA,EAAK;AAAW,GAAA;EAC3C,OAAA,EAAS;IAAE,SAAA,EAAW,SAAA;IAAW,GAAA,EAAK;AAAS,GAAA;EAC/C,IAAA,EAAM;IAAE,SAAA,EAAW,MAAA;IAAQ,GAAA,EAAK;AAAM;AACxC,CAAA;AAJA,IAMaC,GAAAA,GAAWnwC,UAAAA,CAAW,SACjC,EACE,IAAA,EAAA7iB,GAAAA,EAAM,KAAA,EAAAW,GAAAA,EAAO,SAAA,EAAAkS,GAAAA,EAAW,SAAA,EAAAiK,GAAAA,EAAW,UAAA,EAAAne,GAAAA,EAAY,OAAA,EAAAoG,GAAAA,EAAS,aAAA,EAAA1C,GAAAA,EAAe,SAAA,EAAA2C,GAAAA,EAAW,OAAA,EAAAkjB,GAAAA,EAClF,cAAA,EAAAnY,GAAAA,EAAgB,KAAA,EAAAI,GAAAA,EAAA,EAElB2S,GAAAA,EACA;AAEA,EAAA,IAAMlL,GAAAA,GADc0S,GAAAA,CAAK,IAAA,CAAA,CAAMxrB,GAAAA,KAAMwE,GAAAA,CAAE,QAAA,IAAY,IAChC,CAAA,IAAgBuoC,GAAAA,IAAc,CAAConB,GAAAA,GAC9C,MAAA,GACAA,GAAAA,GAAY,SAAA,GAAY,MAAA,EACtBlyB,GAAAA,GAAcnpB,GAAAA,KAAS,MAAA,EAEvB,CAACiT,GAAAA,EAAWqoC,GAAAA,CAAAA,GAAgBlwD,QAAAA,CAAgC,IAAI,CAAA,EAChEmwD,GAAAA,GAAU/oC,WAAAA,CAAAA,CACbtrB,GAAAA,KAA8B;AAC7Bo0D,IAAAA,GAAAA,CAAanrD,GAAE,CAAA,EACX,OAAOE,GAAAA,IAAQ,UAAA,GAAYA,GAAAA,CAAIF,GAAE,CAAA,GAC5BE,GAAAA,KAAK6a,GAAAA,CAAI,OAAA,GAAU/a,GAAAA,CAAAA;EAC9B,CAAA,EACA,CAACE,GAAG,CACN,CAAA,EAGMmrD,MAAU5qD,MAAAA,iBAAO,IAAI,GAAA,EAA0B,CAAA,EAC/C,CAACi4C,KAASC,GAAAA,CAAAA,GAAc19C,SAAwB,IAAI,CAAA,EACpD29C,MAAen4C,MAAAA,CAAsB,IAAI,CAAA,EACzCxE,GAAAA,GAASwE,MAAAA,CAAsB,IAAI,GAEnC6qD,EAAAA,GAAY7qD,MAAAA,CAAsB,IAAI,CAAA,EAEtC8qD,EAAAA,GAAShpC,IAAK,IAAA,CAAA,CAAMxrB,GAAAA,KAAMwE,GAAAA,CAAE,EAAA,KAAOm9C,GAAO,IAC5CA,GAAAA,GAAAA,CACCn2B,GAAAA,CAAK,KAAA,CAAMxrB,GAAAA,KAAMwE,IAAE,QAAQ,CAAA,IAAKgnB,GAAAA,CAAK,CAAA,CAAA,GAAK,EAAA;AAE/CxiB,EAAAA,gBAAAA,MAAsB;AACpB,IAAA,IAAMuhB,MAAKs3B,GAAAA,CAAa,OAAA;AACxB,IAAA,IAAIt3B,OAAM,IAAA,EAAM;AAChB,IAAAlG,IAAa,OAAA,GAAU,IAAA;AACvB,IAAA,IAAMpb,GAAAA,GAAKqrD,GAAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI/pC,GAAE,CAAA;AAC7BthB,IAAAA,GAAAA,IAAM,QAAA,CAAS,aAAA,KAAkBA,GAAAA,IAAIA,IAAG,KAAA,EAAM;EACpD,CAAC,CAAA,EAEDD,gBAAAA,MAAsB;AACpB,IAAA,IAAI8P,GAAAA,KAAS,MAAA,EACb,KAAA,IAAWgR,GAAAA,IAAUwqC,GAAAA,CAAQ,OAAA,CAAQ,MAAA,EAAO,EAC7BxqC,GAAAA,CAAO,aAAA,EAAe,aAAA,CAAc,CAAA,CAAA,EAAI5oB,GAAAA,CAAE,QAAA,CAAA,CAAU,CAAA,EAC3D,gBAAA,CAAiB0oB,EAAgB,CAAA,CAAE,OAAA,CAAA,CAAS5pB,GAAAA,KAAMC,GAAAA,CAAE,YAAA,CAAa,UAAA,EAAY,IAAI,CAAC,CAAA;EAE5F,CAAC,CAAA;AAED,EAAA,IAAM2G,EAAAA,GAAM,CAAC1F,GAAAA,CAAE,IAAA,EAAMkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACxD,EAAA,IAAIomB,IAAK,MAAA,KAAW,CAAA,EAClB,uBACE/kB,IAAC,KAAA,EAAD;IAAK,SAAA,EAAWG,EAAAA;IAAK,GAAA,EAAKytD,GAAAA;IAAS,GAAII,GAAAA;IACrC,QAAA,kBAAAhuD,IAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWvF,GAAAA,CAAE,KAAA;AAAQ,MAAA,QAAA,EAAAvB,GAAAA,IAAS;KAAS;GACzC,CAAA;AAIT,EAAA,IAAMqiD,EAAAA,GAAAA,CAAYhiD,GAAAA,KAAkB;AAClC,IAAA,IAAM0rB,GAAAA,GAAMF,GAAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAIA,GAAAA,CAAK,MAAA,GAAS,CAAA,EAAGnB,GAAK,CAAC,CAAA,CAAA;AACzDqB,IAAAA,OAAK4oC,GAAAA,CAAQ,OAAA,CAAQ,IAAI5oC,GAAAA,CAAI,EAAE,GAAG,KAAA,EAAM;EAC9C,CAAA,EAEMgpC,EAAAA,GAASP,QAAc,OAAA,IAAWQ,GAAAA,KAAkB,QAGpDC,EAAAA,GAAAA,CAAU50D,GAAAA,EAAmBe,GAAAA,EAAe4D,GAAAA,KAAoB;AACpE,IAAA,IAAMyuB,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI5H,GAAAA,CAAK,MAAA,GAAS,CAAA,EAAGnB,GAAK,CAAC,CAAA;AACvD,IAAA,IAAI,CAACwqC,GAAAA,IAAU,CAACH,EAAAA,EAAQ;AACtB,MAAApnD,GAAS8lB,GAAE,CAAA;AACX,MAAA;AACF,IAAA;AACA,IAAA,IAAI1G,GAAAA,GAAKlB,IAAK,SAAA,CAAA,CAAWxrB,QAAMwE,GAAAA,CAAE,EAAA,KAAOU,IAAO,OAAO,CAAA;AAClDwnB,IAAAA,MAAK,CAAA,KACPlI,GAAAA,CAAO,UAAU5gB,GAAAA,CAAK,EAAA,EACtB3C,MAAKuqB,GAAAA,CAAK,OAAA,CAAQ5nB,GAAI,CAAA,CAAA,EAExBgkB,EAAAA,CAAU,UAAU4D,GAAAA,CAAK4H,GAAAA,EAAK,EAAA,EAC9B4uB,EAAAA,CAAS5uB,GAAE,CAAA,EACXxL,EAAAA,CAAU,UAAU,IAAA,EACpB+sC,GAAAA,CAAcnpC,IAAK,KAAA,CAAM,IAAA,CAAK,IAAIkB,GAAAA,EAAI0G,GAAE,GAAG,IAAA,CAAK,GAAA,CAAI1G,KAAI0G,GAAE,CAAA,GAAI,CAAC,CAAA,CAAE,GAAA,CAAA,CAAKpzB,GAAAA,KAAMwE,GAAAA,CAAE,EAAE,CAAC,CAAA;AACnF,EAAA,CAAA,EAEM65B,EAAAA,GAAAA,CAAar+B,GAAAA,EAAkB2E,GAAAA,KAAA,CAAe1D,GAAAA,KAAqC;AAEvF,IAAA,IADAyqB,IAAI,QAAA,EAAU,SAAA,GAAY1rB,GAAC,CAAA,EACvBA,IAAE,gBAAA,EAAkB;AACxB,IAAA,IAAM8pB,GAAAA,GAASwqC,GAAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI5oC,IAAI,EAAE,CAAA;AACzC,IAAA,IAAI,CAAC5B,GAAAA,EAAQ;AACb,IAAA,IAAMgrC,GAAAA,GAAW90D,GAAAA,CAAE,MAAA,KAAW8pB,GAAAA,EACxBirC,MAAcj8C,GAAAA,KAAS,MAAA,GACzB9Y,GAAAA,CAAE,aAAA,CAAc,aAAA,CAA2B,CAAA,CAAA,EAAIkB,GAAAA,CAAE,QAAA,EAAU,CAAA,GAC3D,IAAA;AACJ,IAAA,IAAK4zD,GAAAA,IAAaC,KAAa,QAAA,CAAS/0D,GAAAA,CAAE,MAAc,CAAA,EAExD,QAAQA,IAAE,GAAA;MACR,KAAK,WAAA;AACL,MAAA,KAAK,SAAA,EAAW;AACd,QAAAiB,IAAE,cAAA,EAAe;AACjB,QAAA,IAAM0rB,GAAAA,GAAQ3sB,GAAAA,CAAE,GAAA,KAAQ,WAAA,GAAc,CAAA,GAAI,EAAA;AACtCA,QAAAA,IAAE,MAAA,IAAUojD,GAAAA,IAAW0R,OACzBzwC,GAAAA,CAAa,OAAA,GAAUqH,IAAI,EAAA,EAC3B03B,GAAAA,CAAQ13B,IAAI,EAAA,EAAIzqB,GAAAA,EAAG0rB,GAAK,CAAA,IAExBioC,EAAAA,CAAOlpC,KAAKzqB,GAAAA,GAAI0rB,GAAAA,EAAO3sB,IAAE,QAAQ,CAAA;AAEnC,QAAA;AACF,MAAA;MACA,KAAK,MAAA;MACL,KAAK,KAAA;AACH,QAAA,IAAI,CAAC80D,GAAAA,EAAU;AACf90D,QAAAA,GAAAA,CAAE,cAAA,EAAe,EACjB40D,EAAAA,CAAOlpC,GAAAA,EAAK1rB,GAAAA,CAAE,GAAA,KAAQ,MAAA,GAAS,CAAA,GAAIwrB,GAAAA,CAAK,MAAA,GAAS,CAAA,EAAGxrB,IAAE,QAAQ,CAAA;AAC9D,QAAA;MACF,KAAK,OAAA;MACL,KAAK,GAAA;AACH,QAAA,IAAI,CAAC80D,GAAAA,EAAU;AACf90D,QAAAA,GAAAA,CAAE,cAAA,EAAe,EACjBwkB,GAAAA,CAAO,OAAA,GAAUkH,GAAAA,CAAI,EAAA,EACrBqhB,GAAAA,GAAarhB,GAAAA,CAAI,EAAA,EAAIzqB,GAAAA,EAAG+zD,GAAAA,CAAOh1D,GAAC,CAAC,CAAA;AACjC,QAAA;MACF,KAAK,YAAA;MACL,KAAK,WAAA;AACL,MAAA,KAAK,QAAA,EAAU;AACb,QAAA,IAAI,CAAC+0D,GAAAA,EAAa;AAClB,QAAA,IAAM9nC,GAAAA,GAAW,KAAA,CAAM,IAAA,CAAK8nC,GAAAA,CAAY,iBAA8BnrC,EAAgB,CAAC,CAAA,CACpF,MAAA,CAAA,CAAQ5pB,GAAAA,KAAM,CAACC,GAAAA,CAAE,OAAA,CAAQ,WAAW,CAAC,CAAA;AACxC,QAAA,IAAI60D,GAAAA,EAAU;AACZ,UAAA,IAAI90D,IAAE,GAAA,KAAQ,YAAA,IAAgB,CAACitB,GAAAA,CAAS,CAAA,CAAA,EAAI;AAC5CjtB,UAAAA,IAAE,cAAA,EAAe,EACjBitB,GAAAA,CAAS,CAAA,EAAG,KAAA,EAAM;AAClB,UAAA;AACF,QAAA;AACA,QAAAhsB,IAAE,cAAA,EAAe;AACjB,QAAA,IAAMyrB,GAAAA,GAAKO,IAAS,SAAA,CAAA,CAAWjtB,QAAMC,GAAAA,CAAE,QAAA,CAASD,GAAAA,CAAE,MAAc,CAAC,CAAA;AAC7DA,QAAAA,GAAAA,CAAE,QAAQ,YAAA,GAAcitB,GAAAA,CAASP,MAAK,CAAA,CAAA,EAAI,OAAM,GAC3C1sB,GAAAA,CAAE,QAAQ,WAAA,IAAe0sB,GAAAA,GAAK,IAAGO,GAAAA,CAASP,GAAAA,GAAK,CAAA,CAAA,EAAI,KAAA,EAAM,GAC7D5C,GAAAA,CAAO,KAAA,EAAM;AAClB,QAAA;AACF,MAAA;AAEF;AACF,EAAA,CAAA,EAEMmrC,EAAAA,GAAAA,CAAWl0D,GAAAA,EAAkB4D,GAAAA,KAAA,CAAeH,GAAAA,KAAkC;AAClFknB,IAAAA,GAAAA,CAAI,QAAA,EAAU,OAAA,GAAU1rB,GAAC,CAAA,EACrB,EAAAwE,GAAAA,CAAE,gBAAA,IAAoBqlB,EAAAA,CAAkB7pB,GAAAA,CAAE,MAAA,EAAQA,GAAAA,CAAE,aAAa,CAAA,CAAA,KACrEwkB,GAAAA,CAAO,OAAA,GAAUkH,GAAAA,CAAI,EAAA,EACrBqhB,GAAAA,GAAarhB,IAAI,EAAA,EAAIzqB,GAAAA,EAAG+zD,GAAAA,CAAOh1D,GAAC,CAAC,CAAA,CAAA;AACnC,EAAA,CAAA,EAEMknB,EAAAA,GAAAA,CAAWlnB,GAAAA,KAAA,CAAsBe,GAAAA,KAAkC;AACvE2qB,IAAAA,GAAAA,CAAI,UAAU,OAAA,GAAU1rB,GAAC,GACrBA,GAAAA,CAAE,MAAA,KAAWs0D,GAAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI5oC,GAAAA,CAAI,EAAE,CAAA,KAC3Ck2B,GAAAA,CAAWl2B,GAAAA,CAAI,EAAE,CAAA,EACb6oC,EAAAA,CAAU,YAAY7oC,GAAAA,CAAI,EAAA,KAAIlH,GAAAA,CAAO,OAAA,GAAUkH,GAAAA,CAAI,EAAA,CAAA,CAAA;AACzD,EAAA,CAAA,EAEMwpC,EAAAA,GAAAA,CAAal1D,GAAAA,KAAA,CAAgBe,GAAAA,KAA2B;AACxDkI,IAAAA,GAAAA,GAAIqrD,GAAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI/pC,GAAAA,EAAIthB,GAAE,CAAA,GAC7BqrD,GAAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO/pC,GAAE,CAAA;EAChC,CAAA,EAEM4qC,EAAAA,GAAQlB,IAAMn7C,GAAAA,CAAAA;AACpB,EAAA,uBACEnQ,KAAC,KAAA,EAAD;IACE,SAAA,EAAW/B,EAAAA;IACX,GAAA,EAAKytD,GAAAA;IACL,GAAII,GAAAA;AACJ,IAAA,IAAA,EAAMU,EAAAA,CAAM,SAAA;IACZ,sBAAA,EAAsBhB,GAAAA,KAAc,OAAA,IAAWr7C,GAAAA,KAAS,MAAA,IAAgB,MAAA;IAL1E,QAAA,EAAA;AAOGs8C,MAAAA,GAAAA;MACA5pB,GAAAA,IAASzf,GAAAA,mBACRtlB,GAAAA,CAACwpB,GAAAA,EAAD;QAAW,EAAA,EAAIub,GAAAA;QAAO,IAAA,EAAMzf,GAAAA;AACzB,QAAA,QAAA,EAAAP,IACE,MAAA,CAAA,CAAQxrB,GAAAA,KAAQwrC,GAAAA,CAAM,IAAI,QAAA,CAAS9f,GAAAA,CAAI,EAAE,CAAC,EAC1C,GAAA,CAAA,CAAK1rB,GAAAA,qBACJ2I,KAAC,KAAA,EAAD;AAAkB,UAAA,SAAA,EAAW,CAACzH,GAAAA,CAAE,GAAA,EAAKwqB,GAAAA,CAAI,QAAA,IAAYxqB,GAAAA,CAAE,QAAQ,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAzF,UAAA,QAAA,EAAA,CACGwqB,GAAAA,CAAI,OAAA,kBACLjlB,IAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAWvF,GAAAA,CAAE,KAAA;AAAQ,YAAA,QAAA,EAAAwqB,GAAAA,CAAI;AAAY,WAAA,CACxC;SAHK,EAAAA,GAAAA,CAAI,EAGT,CACN;AACM,OAAA,CAAA,GACT,IAAA;MACHF,GAAAA,CAAK,GAAA,CAAA,CAAKxrB,GAAAA,EAAKe,GAAAA,KAAM;AACpB,QAAA,IAAMs0D,MAAWpzB,GAAAA,GAAevW,GAAAA,CAAI,OAAO8oC,EAAAA,GAAS,CAAA,GAAI,KAAM,MAAA,EACxDxrC,GAAAA,mBACJrgB,IAAAA,CAAA1D,QAAAA,EAAA,EAAA,QAAA,EAAA,CACGymB,IAAI,OAAA,kBACLjlB,IAAC,MAAA,EAAD;AAAM,UAAA,SAAA,EAAWvF,GAAAA,CAAE,KAAA;AAAQ,UAAA,QAAA,EAAAwqB,GAAAA,CAAI;SAAY,CAC3C,GAAA,CAAA;AAEJ,QAAA,uBACEjlB,IAAC,KAAA,EAAD;UAEE,SAAA,EAAW;YACTvF,GAAAA,CAAE,GAAA;AACFwqB,YAAAA,GAAAA,CAAI,YAAYxqB,GAAAA,CAAE,QAAA;AAClBwqB,YAAAA,GAAAA,CAAI,SAASxqB,GAAAA,CAAE,KAAA;YACfwqB,GAAAA,CAAI;AACN,WAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC1B,UAAA,GAAIA,GAAAA,CAAI,QAAA;AACR,UAAA,IAAA,EAAMypC,EAAAA,CAAM,GAAA;AACZ,UAAA,eAAA,EAAehB,OAAar7C,GAAAA,KAAS,MAAA,GAAS,CAAC,CAAC4S,IAAI,QAAA,GAAW,MAAA;AAC/D,UAAA,GAAA,EAAK5S,GAAAA,KAAS,SAAA,GAAYo8C,EAAAA,CAAUxpC,GAAAA,CAAI,EAAE,CAAA,GAAI,MAAA;AAC9C,UAAA,QAAA,EAAU5S,GAAAA,KAAS,SAAA,GAAYu8C,GAAAA,GAAW3pC,GAAAA,CAAI,QAAA,EAAU,QAAA;AACxD,UAAA,SAAA,EAAWuW,MAAc5D,EAAAA,CAAU3S,GAAAA,EAAKzqB,GAAC,CAAA,GAAIyqB,IAAI,QAAA,EAAU,SAAA;AAC3D,UAAA,OAAA,EAASuW,MAAcgzB,EAAAA,CAAQvpC,GAAAA,EAAKzqB,GAAC,CAAA,GAAIyqB,IAAI,QAAA,EAAU,OAAA;AACvD,UAAA,OAAA,EAASuW,GAAAA,GAAc/a,EAAAA,CAAQwE,GAAG,CAAA,GAAIA,IAAI,QAAA,EAAU,OAAA;AACpD,UAAA,WAAA,EAAW4pC,GAAAA,CAASC,GAAAA,EAAWt0D,GAAAA,EAAGuqB,GAAAA,CAAK,MAAM,CAAA;UAC7C,eAAA,EAAeE,GAAAA,CAAI,WAAW,MAAA,GAAS,MAAA;UAEtC,QAAA,EAAA5S,GAAAA,KAAS,MAAA,mBACRnQ,IAAAA,CAAA1D,QAAAA,EAAA,EAAA,QAAA,EAAA,iBACEwB,GAAAA,CAAC,KAAA,EAAD;YAAK,IAAA,EAAK,UAAA;AAAW,YAAA,SAAA,EAAWvF,GAAAA,CAAE,IAAA;YAAM,GAAA,EAAKg0D,EAAAA,CAAUxpC,IAAI,EAAE,CAAA;YAAa,QAAA,EAAA/mB,GAAAA;YACvE,QAAA,EAAAqkB;AACE,WAAA,GACJ0C,GAAAA,CAAI,QAAA,IAAY,IAAA,oBACfjlB,IAAC,KAAA,EAAD;YAAK,IAAA,EAAK,UAAA;AAAW,YAAA,SAAA,EAAWvF,GAAAA,CAAE,QAAA;AAAW,YAAA,QAAA,EAAAwqB,GAAAA,CAAI;WAAc,CAEjE,CAAA,EAAA,CAAA,GACA1C;AACD,SAAA,EA5BE0C,IAAI,EA4BN,CAAA;MAET,CAAC;AACE;;AAET,CAAC;AAED,SAASspC,IAAOh1D,GAAAA,EAA+F;AAC7G,EAAA,OAAO;AAAE,IAAA,QAAA,EAAUA,GAAAA,CAAE,QAAA;AAAU,IAAA,OAAA,EAASA,GAAAA,CAAE,OAAA;AAAS,IAAA,OAAA,EAASA,GAAAA,CAAE,OAAA;AAAS,IAAA,MAAA,EAAQA,GAAAA,CAAE;AAAO,GAAA;AAC1F;AAGA,SAASs1D,GAAAA,CACPt1D,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACgC;AAChC,EAAA,IAAI4wD,OAAa,IAAA,EACjB;AAAIA,IAAAA,IAAAA,GAAAA,KAAct0D,KAAG,OAAO,QAAA;AAC5B,IAAA,IAAIs0D,GAAAA,IAAalgD,GAAAA,IAASpU,GAAAA,KAAMoU,GAAAA,GAAQ,GAAG,OAAO,OAAA;AADtB,EAAA;AAG9B;;;;;;;;;;;;;;;;;ACvQA,SAAgBmgD,GAAAA,CAAWx1D,KAAgBe,GAAAA,EAAuD;AAChG,EAAA,IAAM,EAAE,IAAA,EAAA4D,GAAAA,EAAA,GAAS8wD,GAAAA;AACjB,EAAA,OACEpQ,IAAK,IAAA,KAAS,SAAA,IACbA,IAAyB,OAAA,KAAY,QAAA,IACtCA,IAAK,IAAA,KAAS,MAAA,IACdqQ,GAAAA,GAAYD,GAAAA,CAAK,IAAI,IAAA,CAAA,KAAU,UAC/BC,GAAAA,GAAYrQ,GAAAA,CAAK,IAAA,CAAA,KAAU,MAAA;AAE/B;AAOA,SAAgBsQ,GAAAA,CACd31D,KACAe,GAAAA,EACgB;AAChB,EAAA,IAAMuS,MAAsB,EAAC;AAC7B,EAAA,KAAA,IAASrS,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAI20D,GAAAA,CAAM,MAAA,IAAU;AAClC,IAAA,IAAMH,GAAAA,GAAOG,IAAM30D,GAAAA,CAAAA;AACnB,IAAA,IAAI,CAACu0D,GAAAA,CAAWC,GAAAA,EAAMC,GAAS,CAAA,EAAG;AAChC,MAAA,IAAM1sC,GAAAA,GAAUysC,IAAK,MAAA,EAAO;AACxBzsC,MAAAA,GAAAA,IAAW,IAAA,IACb1V,GAAAA,CAAI,IAAA,CAAK;AAAE,QAAA,GAAA,EAAKmiD,GAAAA,CAAK,GAAA;AAAK,QAAA,IAAA,EAAMA,GAAAA,CAAK,IAAA;QAAM,KAAA,EAAOA,GAAAA,CAAK,KAAK,KAAA,KAAU,IAAA;QAAM,OAAA,EAAAz1D;AAAQ,OAAC,GAEvFwE,GAAAA,IAAK,CAAA;AACL,MAAA;AACF,IAAA;AACA,IAAA,IAAIiT,MAAIxW,GAAAA,GAAI,CAAA;AACZ,IAAA,OACEwW,MAAIm+C,GAAAA,CAAM,MAAA,IACVJ,IAAWI,GAAAA,CAAMn+C,GAAAA,GAAIi+C,GAAS,CAAA,IAC9BE,GAAAA,CAAMn+C,GAAAA,EAAG,IAAA,CAAK,IAAA,KAASg+C,IAAK,IAAA,CAAK,IAAA,IAEjChvD,GAAAA,IAAK,CAAA;AAEP,IAAA,IAAM0X,GAAAA,GAAMy3C,GAAAA,CAAM,KAAA,CAAM30D,GAAAA,EAAGwW,GAAC,CAAA;AAC5BnE,IAAAA,IAAI,IAAA,CAAK;AACP,MAAA,GAAA,EAAKmiD,GAAAA,CAAK,GAAA;AACV,MAAA,IAAA,EAAMA,GAAAA,CAAK,IAAA;AACX,MAAA,KAAA,EAAOt3C,IAAI,KAAA,CAAA,CAAOne,QAAMC,GAAAA,CAAE,IAAA,CAAK,UAAU,IAAI,CAAA;MAC7C,OAAA,kBAAS0I,IAACktD,GAAAA,EAAD;QAAc,GAAA,EAAA30D,GAAAA;AAAK,QAAA,SAAA,EAAWu0D,IAAK,IAAA,CAAK;OAAiB;AACpE,KAAC,GACDjxD,GAAAA,GAAIiT,GAAAA;AACN,EAAA;AACA,EAAA,OAAOnE,GAAAA;AACT;AAMA,SAASuiD,IAAQ,EAAE,GAAA,EAAAlxD,GAAAA,EAAK,SAAA,EAAA1D,KAAA,EAAyE;AAC/F,EAAA,IAAMm7C,GAAAA,GAAKj+B,GAAAA,CAAI,MAAA,CAAA,CAAQne,QAAMC,GAAAA,CAAE,GAAA,CAAI,KAAA,KAAU,IAAI,CAAA,CAAE,GAAA,CAAA,CAAKD,GAAAA,KAAMC,IAAE,GAAG,CAAA;AACnE,EAAA,uBACE0I,IAACskC,GAAAA,EAAD;IACE,IAAA,EAAK,UAAA;IACL,IAAA,EAAK,IAAA;IACL,OAAA,EAAQ,MAAA;AACR,IAAA,SAAA,EAAW/rC,GAAAA,CAAE,UAAA;IACF,SAAA,EAAAD,GAAAA;IACX,KAAA,EAAOkd,GAAAA,CAAI,GAAA,CAAA,CAAKxZ,GAAAA,KAAM;AACpB,MAAA,IAAM9C,MAAI5B,GAAAA,CAAE,IAAA;AACZ,MAAA,OAAO;AACL,QAAA,KAAA,EAAOA,GAAAA,CAAE,GAAA;AACT,QAAA,KAAA,EACE4B,IAAE,IAAA,IAAQA,GAAAA,CAAE,QAAQxB,EAAAA,mBAClBsI,IAAC3H,CAAAA,EAAD;AAAM,UAAA,IAAA,EAAMa,GAAAA,CAAE,IAAA;UAAkB,IAAA,EAAM;AAAK,SAAA,IAE1CA,GAAAA,CAAE,KAAA,IAASA,IAAE,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAEjC,QAAA,SAAA,EAAW5B,GAAAA,CAAE;AACf,OAAA;IACF,CAAC,CAAA;IACD,KAAA,EAAOm8C,GAAAA;AAIP,IAAA,WAAA,EAAaj+B,GAAAA,CAAI,MAAA,CAAA,CAAQne,GAAAA,KAAMC,GAAAA,CAAE,GAAA,CAAI,KAAK,CAAA,CAAE,GAAA,CAAA,CAAKD,GAAAA,KAAMC,GAAAA,CAAE,GAAG,CAAA;AAC5D,IAAA,QAAA,EAAA,CAAWD,GAAAA,KAAS;AAClB,MAAA,KAAA,IAAWC,OAAKke,GAAAA,EAAK;AACnB,QAAA,IAAM2H,GAAAA,GAAM1a,GAAAA,CAAK,QAAA,CAASnL,GAAAA,CAAE,GAAG,CAAA;AAC3B6lB,QAAAA,GAAAA,KAAQs2B,IAAG,QAAA,CAASn8C,GAAAA,CAAE,GAAG,CAAA,IAAGA,GAAAA,CAAE,GAAA,CAAI,QAAA,CAAS6lB,GAAG,CAAA;AACpD,MAAA;AACF,IAAA;GACD,CAAA;AAEL;AAEA,SAAgBmhC,IACdjnD,GAAAA,EACAe,GAAAA,EACAyD,KAGAiC,GAAAA,GAAe,EAAA,EAIfxG,MAAS,KAAA,EACE;AACX,EAAA,IAAM,EAAE,IAAA,EAAAoB,GAAAA,EAAM,KAAA,EAAAyD,GAAAA,EAAO,KAAA,EAAAjD,GAAAA,EAAO,KAAA,EAAAhB,GAAAA,EAAO,QAAA,EAAAhB,GAAAA,EAAA,GAAa4H,GAAAA;AAChD,EAAA,IAAIw9C,IAAK,IAAA,KAAS,QAAA,EAGhB,uBAAOt8C,IAACu+C,GAAAA,EAAD;IAAiB,GAAA,EAAAlnD,GAAAA;IAAgB,SAAA,EAAAwE,GAAAA;IAAyB,YAAA,EAAAiC;GAAe,CAAA;AAElF,EAAA,IAAMy0C,GAAAA,GAAQkK,IAAeH,GAAAA,EAAM;IACjC,KAAA,EAAAngD,GAAAA;IACA,KAAA,EAAAjD,GAAAA;IACA,KAAA,EAAAhB,GAAAA;AACA,IAAA,QAAA,EAAU4G,GAAAA,CAAI,QAAA;IACd,QAAA,EAAA5H,GAAAA;IAIA,WAAA,EAAa;MACX,MAAA,EAAQ4H,GAAAA,CAAI,OAAA,CAAQ,uBAAuB,CAAA,CAAE,KAAA;MAC7C,KAAA,EAAOA,GAAAA,CAAI,OAAA,CAAQ,sBAAsB,CAAA,CAAE;AAC7C;GACD,CAAA;AACD,EAAA,IAAIyzC,GAAAA,KAAU,IAAA,EACZ,uBAAOh6C,KAAC,MAAA,EAAD;AAAM,IAAA,SAAA,EAAWA,GAAAA,CAAE,YAAA;IAAnB,QAAA,EAAA;AAAiC,MAAA,GAAA;MAAE+jD,GAAAA,CAAK,IAAA;AAAK,MAAA;AAAoB;;AAE1E,EAAA,QAAQ/J,IAAM,IAAA;IACZ,KAAK,SAAA;AAEH,MAAA,uBACEvyC,IAACgzC,EAAAA,EAAD;QACE,GAAIT,GAAAA;AACJ,QAAA,GAAIG,IAAOp2B,GAAS,CAAA;AACpB,QAAA,OAAA,EAASi2B,IAAM,OAAA,IAAW,QAAA;AAC1B,QAAA,SAAA,EAAWA,GAAAA,CAAM,OAAA,KAAY,QAAA,GAAWh6C,GAAAA,CAAE,UAAA,GAAa;OACxD,CAAA;IAEL,KAAK,QAAA;AACH,MAAA,uBACEyH,IAACgzC,EAAAA,EAAD;QACE,GAAIT,GAAAA;AACJ,QAAA,GAAIG,IAAOp2B,GAAS,CAAA;AACpB,QAAA,SAAA,EAAWi2B,GAAAA,CAAM,OAAA,KAAY,QAAA,GAAWh6C,GAAAA,CAAE,SAASA,GAAAA,CAAE,MAAA;QACrD,QAAA,EAAU;OACX,CAAA;IAEL,KAAK,QAAA;AAGH,MAAA,uBAAOyH,IAACgzC,EAAAA,EAAD;QAAiB,GAAIT,GAAAA;AAAO,QAAA,GAAIG,IAAOp2B,GAAS,CAAA;QAAG,OAAA,EAAS6wC;OAAc,CAAA;IACnF,KAAK,MAAA;AACH,MAAA,uBACEntD,IAACgzC,EAAAA,EAAD;QACE,GAAIT,GAAAA;AACJ,QAAA,GAAIG,IAAOp2B,GAAS,CAAA;QACpB,SAAA,EAAWi2B,GAAAA,CAAM,YAAY,QAAA,GAAWh6C,GAAAA,CAAE,SAASg6C,GAAAA,CAAM,OAAA,KAAY,OAAA,GAAU,MAAA,GAAYh6C,GAAAA,CAAE;OAC9F,CAAA;IAEL,KAAK,aAAA;AACH,MAAA,uBAAOyH,IAACgzC,EAAAA,EAAD;QAAiB,GAAIT,GAAAA;AAAO,QAAA,GAAIG,IAAOp2B,GAAS,CAAA;AAAG,QAAA,SAAA,EAAW/jB,GAAAA,CAAE;OAAS,CAAA;IAClF,KAAK,OAAA;AACH,MAAA,uBACEC,cAACw6C,EAAAA,EAAD;QACE,GAAIT,GAAAA;AACJ,QAAA,GAAIG,IAAOp2B,GAAS,CAAA;QAGpB,GAAA,EAAK8wC,GAAAA;QACL,OAAA,EAAQ,QAAA;AAKR,QAAA,SAAA,EAAW,CAACrc;OACb,CAAA;AAEL,IAAA;AACE,MAAA,uBAAO/wC,IAACgzC,EAAAA,EAAD;QAAiB,GAAIT,GAAAA;AAAO,QAAA,GAAIG,IAAOp2B,GAAS;OAAI,CAAA;AAC/D;AACF;AAEA,IAAMo2B,GAAAA,GAAAA,CAAUr7C,GAAAA,MAAkB;EAAE,MAAA,EAAQ,QAAA;EAAmB,IAAA,EAAAA;AAAK,CAAA,CAAA;AAApE,IAEM81D,MAAAA,MAA0B;AAAC,CAAA;AA0BjC,SAAS5O,GAAAA,CAAW,EAClB,GAAA,EAAAviD,GAAAA,EACA,WAAAH,GAAAA,EACA,YAAA,EAAAvD,GAAAA,GAAe,EAAA,EAAA,EAKH;AACZ,EAAA,IAAMgkD,GAAAA,GAAOx9C,GAAAA,CAAI,IAAA,EACX0/C,GAAAA,GAAO,OAAO1/C,GAAAA,CAAI,KAAA,IAAU,QAAA,IAAYA,GAAAA,CAAI,KAAA,KAAU,IAAA,GACvDA,GAAAA,CAAI,QACL,MAAA,EAIEuuD,GAAAA,GAAa,MAAA,CAAO,MAAA,CAAO/Q,GAAAA,CAAK,QAAQ,CAAA,CAAE,KAAA,CAAA,CAAOjlD,GAAAA,KAAU,EAAE,MAAA,IAAUisB,GAAAA,CAAM,CAAA,EAI7EgqC,GAAAA,GAAAA,CACJ50D,KACA0D,GAAAA,KACgB;AAChB,IAAA,IAAMuO,MAAiC,EAAC,EAClC4iD,MAAAA,CAASl2D,GAAAA,KACb,OAAOH,GAAAA,IAAM,QAAA,IAAA,CAAA,CAAYA,OAAc,UAAA,IAAcA,GAAAA,EAKnDs2D,MAAsB,EAAC,EACrBC,MAAAA,MAAoB;AACxB,MAAA,KAAA,IAAW,EAAE,GAAA,EAAAp2D,GAAAA,EAAK,IAAA,EAAAe,GAAAA,EAAM,KAAA,EAAA4D,GAAAA,EAAO,OAAA,EAAA1D,GAAAA,EAAA,IAAa00D,GAAAA,CAAYQ,GAAAA,EAAST,GAAS,CAAA,EAAG;AAC3E,QAAA,IAAMxqD,GAAAA,GAAOoI,GAAAA,CAAIA,GAAAA,CAAI,MAAA,GAAS,CAAA,CAAA;AAC9B,QAAA,IAAI+xC,GAAAA,CAAK,SAAS,MAAA,IAAa6Q,GAAAA,CAAMhrD,GAAI,CAAA,IAAKA,GAAAA,CAAK,IAAA,KAASm6C,GAAAA,CAAK,IAAA,EAAM;AACrEn6C,UAAAA,GAAAA,CAAK,QAAA,CAAS,IAAA,iBAAKvC,IAACmnB,UAAAA,EAAD,EAAA,QAAA,EAAqB9G,GAAAA,EAAkB,EAAxB6I,GAAwB,CAAC,CAAA,EAC3DrtB,IAAK,KAAA,KAAU6xD,GAAAA;AACf,UAAA;AACF,QAAA;AACA,QAAAtiD,IAAI,IAAA,CAAK;UACP,GAAA,EAAA/T,GAAAA;AACA,UAAA,IAAA,EAAMqlD,GAAAA,CAAK,IAAA;UACX,KAAA,EAAOA,GAAAA,CAAK,QAAQA,GAAAA,CAAK,IAAA;AACzB,UAAA,KAAA,EAAOA,GAAAA,CAAK,WAAA;UACZ,KAAA,EAAA1gD,GAAAA;UACA,QAAA,EAAU,iBAACgE,GAAAA,CAACmnB,UAAAA,EAAD,EAAA,QAAA,EAAqB9G,GAAAA,EAAkB,EAAxB6I,GAAwB,CAAC;SACpD,CAAA;AACH,MAAA;AACA,MAAAhyB,MAAU,EAAC;AACb,IAAA,CAAA;AAEA,IAAA,KAAA,IAAW,CAACgyB,GAAAA,EAAK5F,GAAAA,KAAU,MAAA,CAAO,OAAA,CAAQ1mB,GAAQ,CAAA,EAAG;AAInD,MAAA,IAAI,EAAE,UAAU0mB,GAAAA,CAAAA,EAAQ;AACtB,QAAA,IAAMqqC,GAAAA,GAAUrqC,IAAM,IAAA,KAAS,EAAA,EACzBpO,MAAQo4C,GAAAA,CAAOhqC,GAAAA,CAAM,UAAUqqC,GAAO,CAAA;AAC5C,QAAA,IAAIz4C,GAAAA,CAAM,WAAW,CAAA,EAAG;AACxBu4C,QAAAA,KAAM,EACN9iD,GAAAA,CAAI,IAAA,iBACFpS,KAAC,KAAA,EAAD;UAA0B,SAAA,EAAWo1D,GAAAA,IAAWC,GAAAA,GAASr1D,GAAAA,CAAE,WAAA,GAAc,MAAA;AAAzE,UAAA,QAAA,EAAA,CACGo1D,GAAAA,oBAAW3tD,GAAAA,CAAC,IAAA,EAAD;AAAI,YAAA,SAAA,EAAWzH,GAAAA,CAAE,YAAA;AAAe,YAAA,QAAA,EAAA+qB,GAAAA,CAAM;AAAS,WAAA,GAC1DpO,GACE;SAHK,EAAA,CAAA,MAAA,EAASgU,GAAAA,CAAAA,CAGd,CACP,CAAA;AACA,QAAA;AACF,MAAA;AACA,MAAA,IAAM21B,MAAY,CAAA,EAAG//C,GAAAA,CAAI,IAAA,CAAA,CAAA,EAAQoqB,GAAAA,IAC3B2kC,GAAAA,GAAkC;QACtC,IAAA,EAAMhP,GAAAA;QACN,IAAA,EAAMv7B,GAAAA;AACN,QAAA,KAAA,EAAOk7B,MAAOt1B,GAAAA,CAAAA;AACd,QAAA,KAAA,EAAOpqB,GAAAA,CAAI,KAAA;AAIX,QAAA,KAAA,EAAO,CAACA,GAAAA,CAAI,KAAA,IAAS0/C,GAAAA,GAAOt1B,GAAAA,CAAAA,KAAS,MAAA;QACrC,QAAA,EAAUs1B,GAAAA;AACV,QAAA,OAAA,EAAS1/C,GAAAA,CAAI,OAAA;AACb,QAAA,YAAA,EAAcA,GAAAA,CAAI,YAAA;AAClB,QAAA,QAAA,EAAA,CAAWzH,GAAAA,KAAM;AAOf,UAAA,IAAMkmB,MAAOihC,GAAAA,IACRlC,GAAAA,CAAK,aAAax9C,GAAAA,CAAI,KAAK,MAC1B,OAAOw9C,GAAAA,CAAK,WAAY,QAAA,IAAYA,GAAAA,CAAK,YAAY,IAAA,GACrD,EAAE,GAAIA,GAAAA,CAAK,OAAA,KACX,EAAC,CAAA;AACP,UAAA,IAAIplD,QAAM,MAAA,EAAW;AAGnB,YAAA,IAAM,EAAA,CAAGgyB,GAAAA,GAAM4kC,GAAAA,EAAU,GAAGhyD,KAAAA,GAASyhB,GAAAA;AACrC,YAAAvhB,GAAAA,CAAI,SAASF,GAAI,CAAA;AACjB,YAAA;AACF,UAAA;AACA,UAAAE,IAAI,QAAA,CAAS;YAAE,GAAGuhB,GAAAA;AAAO2L,YAAAA,CAAAA,GAAAA,GAAMhyB;WAAG,CAAA;AACpC,QAAA;AACF,OAAA;AACA,MAAAA,IAAQ,IAAA,CAAK;QACX,GAAA,EAAK2nD,GAAAA;QACL,IAAA,EAAMv7B,GAAAA;QACN,GAAA,EAAKuqC,GAAAA;AACL,QAAA,SAAA,EAAWvqC,GAAAA,CAAM,IAAA;AACjB,QAAA,MAAA,EAAA,MAAc;AACZ,UAAA,IAAM+6B,MAAS0O,GAAAA,GAAYlO,GAAAA,KAAckO,GAAAA,GAAYzpC,GAAAA,CAAM,IAAA,CAAA,EACrDyqC,GAAAA,GAAW1P,MACbA,GAAAA,CAAOwP,GAAQ,IACfvP,GAAAA,CAAcuP,GAAAA,EAAUvqC,IAAM,IAAA,EAAMypC,GAAAA,EAAWK,KAAc,IAAI,CAAA;AASrE,UAAA,OARIW,OAAY,IAAA,GAAa,IAAA,GAAA,CAKXzqC,GAAAA,CAAM,IAAA,KAAS,UAAaA,GAAAA,CAAM,KAAA,KAAU,IAAA,KACnCA,GAAAA,CAAM,QAAQA,GAAAA,CAAM,IAAA,IAAQ5rB,EAAAA,mBAGrDa,KAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAWA,GAAAA,CAAE,UAAA;YAAnB,QAAA,EAAA,iBACEyH,GAAAA,CAAC3H,CAAAA,EAAD;AAAM,cAAA,IAAA,EAAMirB,GAAAA,CAAM,IAAA;cAAkB,IAAA,EAAM;AAAK,aAAA,GAC9CyqC,GACG;AALWA,WAAAA,CAAAA,GAAAA,GAAAA;AAOrB,QAAA;OACD,CAAA;AACH,IAAA;AAEA,IAAA,OADAN,KAAM,EACC9iD,GAAAA,CAAI,GAAA,CAAA,CAAKtT,QACd,OAAO+wB,GAAAA,IAAU,QAAA,IAAYA,GAAAA,IAAkB,cAAcA,GAAAA,GAC3DA,GAAAA,CAAM,KAAA,mBACJpoB,IAAC,KAAA,EAAD;AAAqB,MAAA,SAAA,EAAW,CAAA,EAAGzH,GAAAA,CAAE,WAAA,CAAA,CAAA,EAAeA,IAAE,QAAA,CAAA,CAAA;AAAY,MAAA,KAAA,EAAO6vB,GAAAA,CAAM,KAAA;AAC5E,MAAA,QAAA,EAAAA,GAAAA,CAAM;AACJ,KAAA,EAFKA,GAAAA,CAAM,GAEX,CAAA,mBAEL7vB,KAAC,KAAA,EAAD;AAAqB,MAAA,SAAA,EAAWA,GAAAA,CAAE,GAAA;MAAlC,QAAA,EAAA,iBACEyH,GAAAA,CAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWzH,GAAAA,CAAE,QAAA;AAAU,QAAA,KAAA,EAAO6vB,GAAAA,CAAM,KAAA;AAAQ,QAAA,QAAA,EAAAA,GAAAA,CAAM;OAAY,CAAA,kBACpEpoB,GAAAA,CAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAWzH,GAAAA,CAAE,WAAA;AAAc,QAAA,QAAA,EAAA6vB,GAAAA,CAAM;AAAe,OAAA,CACnD;KAHK,EAAAA,GAAAA,CAAM,GAGX,CAAA,GAGPA,GAEJ,CAAA;AACF,EAAA,CAAA,EAEMvF,GAAAA,GAAOyqC,GAAAA,CAAOhR,GAAAA,CAAK,QAAA,EAAU,CAAC+Q,GAAU,CAAA;AAE9C,EAAA,OADIxqC,IAAK,MAAA,KAAW,CAAA,GAAU,IAAA,mBAE5BtqB,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWA,GAAAA,CAAE,UAAA;AAAlB,IAAA,QAAA,EAAA,CACG,CAAC80D,GAAAA,oBAAcrtD,IAAC,IAAA,EAAD;AAAI,MAAA,SAAA,EAAWzH,GAAAA,CAAE,YAAA;AAAe,MAAA,QAAA,EAAA+jD,GAAAA,CAAK;AAAS,KAAA,GAC7Dz5B,GACE;;AAET;AC1ZA,SAAgB6b,IAAQrnC,GAAAA,EAAqD;AAC3E,EAAA,OAAO,EAAE,MAAA,IAAU2E,GAAAA,CAAAA;AACrB;AA+BA,SAAgBgyD,IAAS32D,GAAAA,EAA0C;AACjE,EAAA,IAAMwrB,MAAmB,EAAC;AAC1B,EAAA,KAAA,IAAW5lB,OAAQ0hD,GAAAA,EAAQ;AACzB,IAAA,IAAMsP,GAAAA,GAAOhxD,IAAK,IAAA,CAAK,IAAA,EACjBsF,MAAOsgB,GAAAA,CAAKA,GAAAA,CAAK,SAAS,CAAA,CAAA;AAC5BorC,IAAAA,GAAAA,KAAS,MAAA,IAAa1rD,GAAAA,KAAS,MAAA,IAAaA,GAAAA,CAAK,KAAA,KAAU0rD,GAAAA,GAC7D1rD,GAAAA,CAAK,MAAA,CAAO,IAAA,CAAKtF,GAAI,CAAA,GAErB4lB,IAAK,IAAA,CAAK;MAAE,KAAA,EAAOorC,GAAAA,IAAQhxD,IAAK,IAAA,CAAK,IAAA;AAAM,MAAA,MAAA,EAAQ,CAACA,GAAI;KAAG,CAAA;AAE/D,EAAA;AACA,EAAA,OAAO4lB,GAAAA;AACT;;;;;;;;AClDA,SAAgBqrC,IAAe72D,GAAAA,EAA4B;AACzD,EAAA,IAAM,EAAE,KAAA,EAAAe,GAAAA,EAAO,MAAA,EAAA4D,GAAAA,EAAQ,MAAA,EAAAH,GAAAA,EAAQ,QAAA,EAAAvD,GAAAA,EAAU,KAAA,EAAAhB,GAAAA,EAAO,SAAA,EAAAoB,GAAAA,EAAW,QAAA,EAAAyD,GAAAA,EAAU,SAAA,EAAAjD,GAAAA,EAAA,GAAc6C,GAAAA,EAC7EkC,GAAAA,GAAM,CAAC1F,GAAAA,CAAE,IAAA,EAAMkE,GAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACxD,EAAA,uBACEuD,KAAC,KAAA,EAAD;IAAK,SAAA,EAAW/B,GAAAA;IAAK,IAAA,EAAK,SAAA;IAAU,YAAA,EAAYlF,GAAAA;AAAhD,IAAA,QAAA,EAAA,CACGA,GAAAA,KAAU,MAAA,oBAAa+E,IAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWvF,GAAAA,CAAE,KAAA;MAAQ,QAAA,EAAAQ;KAAY,CAAA,kBAC/DiH,IAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAWzH,GAAAA,CAAE,QAAA;MAAlB,QAAA,EAAA,CACGknD,GAAAA,KAAW,MAAA,IACV0O,GAAAA,CAAQ1O,GAAM,CAAA,CAAE,GAAA,CAAA,CAAKpoD,GAAAA,qBACnByG,GAAAA,CAACswD,GAAAA,EAAD;QAEO,GAAA,EAAA/2D,GAAAA;QACG,MAAA,EAAAwE,GAAAA;QACD,KAAA,EAAAvE,GAAAA;QACI,SAAA,EAAAoB,GAAAA;QACD,QAAA,EAAAJ;AACX,OAAA,EANMyqB,IAAI,MAAA,CAAO,CAAA,EAAI,IAMrB,CACF,GACFnmB,GACE;AACF,KAAA,CAAA;;AAET;AAQA,SAASuxD,IAAQnyD,GAAAA,EAAmC;AAClD,EAAA,IAAM2iD,MAAsB,EAAC,EACvB0P,GAAAA,GAAAA,CAAWj2D,KAAsB4D,GAAAA,KAAyB;AAC9D,IAAA,KAAA,IAAW,CAACktB,KAAK5F,GAAAA,CAAAA,IAAU,OAAO,OAAA,CAAQvlB,GAAAA,CAAM,QAAQ,CAAA,EAAG;AACzD,MAAA,IAAM42B,MAAO25B,GAAAA,KAAW,EAAA,GAAKplC,MAAM,CAAA,EAAGolC,GAAAA,IAAUplC,GAAAA,CAAAA,CAAAA;AAC5CwV,MAAAA,GAAAA,CAAQpb,GAAK,CAAA,GAAG+qC,GAAAA,CAAQ/qC,GAAAA,EAAOqR,GAAI,CAAA,GAC9BrR,GAAAA,CAAM,MAAA,KAAW,IAAA,IAAMq7B,GAAAA,CAAO,IAAA,CAAK;QAAE,IAAA,EAAAvmD,GAAAA;QAAM,IAAA,EAAMkrB;OAAO,CAAA;AACnE,IAAA;AACF,EAAA,CAAA;AAEA,EAAA,OADA+qC,GAAAA,CAAQ5O,GAAAA,EAAQ,EAAE,CAAA,EACXuO,IAASrP,GAAM,CAAA;AACxB;AAGA,SAASyP,GAAAA,CAAO,EACd,GAAA,EAAA/2D,GAAAA,EACA,MAAA,EAAAe,GAAAA,EACA,KAAA,EAAAyD,GAAAA,EACA,SAAA,EAAAvE,GAAAA,EACA,QAAA,EAAAkB,GAAAA,EAAA,EAOC;AAGD,EAAA,IAAMy0D,GAAAA,GAAQlqC,GAAAA,CAAI,MAAA,CAAO,GAAA,CAAA,CAAK1rB,GAAAA,KAC5Bk3D,GAAAA,CAAQC,GAAAA,EAAWA,GAAAA,CAAU,KAAK,IAAA,EAAMxkC,GAAAA,EAAQya,GAAAA,EAAOsoB,GAAAA,EAAWhxB,GAAQ,CAC5E,CAAA;AACA,EAAA,uBACEj+B,GAAAA,CAAAxB,QAAAA,EAAA,EAAA,UACG0wD,GAAAA,CAAYC,GAAAA,EAAOF,GAAS,CAAA,CAAE,GAAA,CAAA,CAAK11D,GAAAA,qBAClC2I,KAAC,MAAA,EAAD;AAAqB,IAAA,SAAA,EAAWzH,GAAAA,CAAE,IAAA;AAAlC,IAAA,QAAA,EAAA,CACGk2D,GAAAA,CAAW3B,GAAAA,CAAK,IAAI,CAAA,oBACnBhvD,IAAC,MAAA,EAAD;AAAM,MAAA,SAAA,EAAWvF,GAAAA,CAAE,SAAA;MAAW,aAAA,EAAY,MAAA;AACvC,MAAA,QAAA,EAAAu0D,GAAAA,CAAK,IAAA,CAAK,KAAA,IAASA,GAAAA,CAAK,IAAA,CAAK;KAC1B,CAAA,EAEPA,IAAK,OACF;AAPK,GAAA,EAAAA,GAAAA,CAAK,GAOV,CACP,CAAA,EACD,CAAA;AAEN;AAYA,SAAS2B,IAAWp3D,GAAAA,EAA6B;AAC/C,EAAA,OAAOqlD,GAAAA,CAAK,IAAA,KAAS,QAAA,IAAYA,GAAAA,CAAK,IAAA,KAAS,QAAA;AACjD;AAEA,SAAS6R,IACPl3D,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACA1D,GAAAA,EACAwF,KACAkC,GAAAA,EACU;AACV,EAAA,IAAM,EAAE,IAAA,EAAAzH,GAAAA,EAAM,IAAA,EAAAjB,GAAAA,EAAA,GAASk3D,GAAAA,EACjBhqB,GAAAA,GAAUC,GAAAA,EAAO,GAAA,CAAI9P,GAAI,CAAA,KAAM,MAC/B71B,GAAAA,GAA6B;IACjC,IAAA,EAAAvG,GAAAA;IACA,IAAA,EAAMmkD,GAAAA;IACN,KAAA,EAAOlY,GAAAA,GAAU,MAAA,GAAYxa,GAAAA,GAAS2K,GAAAA,CAAAA;IACtC,KAAA,EAAO6P,GAAAA;AACP,IAAA,KAAA,EAAO,CAACA,GAAAA,IAAWxa,GAAAA,GAAS2K,GAAAA,CAAAA,KAAU,MAAA;AACtC,IAAA,QAAA,EAAA,CAAWt9B,GAAAA,KAAM0kC,GAAAA,GAAWpH,GAAAA,EAAMz9B,GAAC,CAAA;AACnC,IAAA,OAAA,EAAA,CAAUG,GAAAA,MAAO;AAAE,MAAA,KAAA,EAAO2yB,MAAS9wB,GAAAA,CAAAA;MAAI,KAAA,EAAOurC,GAAAA,EAAO,GAAA,CAAIvrC,GAAC,CAAA,KAAM;AAAK,KAAA;AACvE,GAAA;AACA,EAAA,OAAO;IACL,GAAA,EAAKy7B,GAAAA;IACC,IAAA,EAAAr9B,GAAAA;IACN,GAAA,EAAAmB,GAAAA;IACA,SAAA,EAAAL,GAAAA;AACA,IAAA,MAAA,EAAA,MAAc;AACZ,MAAA,IAAMimD,MAAS0O,GAAAA,GAAYp4B,GAAAA,CAAAA,IAASo4B,GAAAA,GAAYrQ,IAAK,IAAA,CAAA;AACrD,MAAA,OAAO2B,GAAAA,GAASA,IAAOv/C,GAAG,CAAA,GAAIw/C,IAAcx/C,GAAAA,EAAKwd,GAAAA,EAAWywC,KAAWp4B,GAAI,CAAA;AAC7E,IAAA;AACF,GAAA;AACF;;;;;ICxIMwO,GAAAA,GAAAA,CAAS9rC,GAAAA,EAAWe,GAAAA,EAAa4D,GAAAA,KAAwB,IAAA,CAAK,GAAA,CAAIspC,GAAAA,EAAK,IAAA,CAAK,GAAA,CAAIN,GAAAA,EAAKhpC,GAAC,CAAC,CAAA;AAO7F,SAAS0yD,GAAAA,CAAOr3D,GAAAA,EAAWe,GAAAA,EAAa4D,GAAAA,EAAaH,GAAAA,EAAsB;AACzE,EAAA,IAAM8yD,GAAAA,GAAU5sD,MAAO,CAAA,GAAI,IAAA,CAAK,MAAM/F,GAAAA,GAAI+F,GAAI,IAAIA,GAAAA,GAAO/F,GAAAA;AAGzD,EAAA,OAAOmnC,GAAAA,CADS,MAAA,CAAO,SAAA,CAAUphC,GAAI,CAAA,GAAI4sD,GAAAA,GAAU,MAAA,CAAOA,GAAAA,CAAQ,OAAA,CAAQ,EAAE,CAAC,CAAA,EACvD3pB,KAAKM,GAAG,CAAA;AAChC;AAYA,SAAgBspB,IAAa5uD,GAAAA,EAA0B;AACrD,EAAA,IAAM,EACJ,WAAA,EAAA1I,GAAAA,GAAc,UAAA,EAAY,KAAA,EAAAkB,GAAAA,EAAO,GAAA,EAAAC,GAAAA,EAAK,GAAA,EAAAC,GAAAA,EAAK,MAAA,EAAAyD,GAAAA,EAAQ,OAAA,EAAAjD,GAAAA,EAAS,QAAA,EAAAhB,GAAAA,EAC5D,IAAA,EAAAkE,GAAAA,GAAO,CAAA,EAAG,SAAA,EAAAgP,GAAAA,EAAW,SAAA,EAAAiK,GAAAA,EAAA,GACnBtZ,GAAAA,EAIE43C,GAAAA,GAAS5yC,MAAAA,CAAOhF,GAAK,CAAA;AAC3B,EAAA7E,IAAO,OAAA,GAAU6E,GAAAA;AAKjB,EAAA,IAAMmqB,MAAOnlB,MAAAA,CAAoE,IAAI,CAAA,EAC/E8tD,GAAAA,GAAU9tD,OAA8B,IAAI,CAAA;AAClD,EAAAlF,SAAAA,CAAA,MAAA,MAAsB;AAAE,IAAAjB,GAAAA,CAAQ,SAAS,MAAA,EAAO;AAAG,EAAA,CAAA,EAAG,EAAE,CAAA;AAExD,EAAA,IAAMisC,GAAAA,GAAAA,CAAWxvC,GAAAA,KAAyB;AACxC,IAAA,IAAMqB,GAAAA,GAAIwtB,IAAK,OAAA,EACThtB,GAAAA,GAAIy6C,IAAO,OAAA,EACX3vB,GAAAA,GAAQqH,MAAO3yB,GAAAA,CAAE,MAAA;AACvB,IAAA,OAAOg2D,GAAAA,CAAOh2D,GAAAA,CAAE,UAAA,IAAcQ,GAAAA,CAAE,SAAS,CAAC8qB,GAAAA,GAAQA,GAAAA,CAAAA,EAAQ9qB,GAAAA,CAAE,GAAA,EAAKA,GAAAA,CAAE,GAAA,EAAKA,GAAAA,CAAE,QAAQ,CAAC,CAAA;EACrF,CAAA,EAEM41D,GAAAA,GAAAA,CAAUz3D,GAAAA,KAAiB;AAC/B,IAAAiG,GAAAA,CAAK,UAAU,IAAA,EACf1C,GAAAA,CAAQ,UAAU,IAAA,EAClB+4C,GAAAA,CAAO,OAAA,CAAQ,QAAA,GAAWlxC,GAAI,CAAA;EAChC,CAAA,EAEM4pB,GAAAA,GAAgB1J,WAAAA,CAAAA,CAAavqB,GAAAA,KAAoC;AACrE,IAAA,IAAIf,GAAAA,CAAE,MAAA,KAAW,CAAA,IAAKw3D,GAAAA,CAAQ,OAAA,EAAS;AACvC,IAAA,IAAM31D,GAAAA,GAAIy6C,GAAAA,CAAO,OAAA,EACXob,GAAAA,GAAAA,CAAY71D,IAAE,WAAA,IAAe,UAAA,MAAgB,UAAA,EAC7C81D,GAAAA,GAAAA,CAAU33D,GAAAA,KAA8C03D,GAAAA,GAAWtrC,GAAAA,CAAG,UAAUA,GAAAA,CAAG,OAAA;AACzF,IAAAnmB,IAAK,OAAA,GAAU;AACb,MAAA,MAAA,EAAQ0xD,IAAO33D,GAAC,CAAA;AAChB,MAAA,UAAA,EAAY6B,GAAAA,CAAE,KAAA;MACd,IAAA,EAAMw1D,GAAAA,CAAOx1D,IAAE,KAAA,EAAOA,GAAAA,CAAE,KAAKA,GAAAA,CAAE,GAAA,EAAKA,GAAAA,CAAE,IAAA,IAAQ,CAAC;AACjD,KAAA,EACA0B,GAAAA,CAAQ,OAAA,GAAUq3B,kBAAAA,CAAmB56B,GAAAA,CAAE,eAAeA,GAAAA,EAAG;AACvD,MAAA,MAAA,EAAA,CAASA,GAAAA,KAAO;AACd,QAAA,IAAMoL,GAAAA,GAAOokC,GAAAA,CAAQmoB,GAAAA,CAAOvrC,GAAE,CAAC,CAAA;AAC/B,QAAAnmB,IAAK,OAAA,CAAS,IAAA,GAAOmF,KACrBkxC,GAAAA,CAAO,OAAA,CAAQ,QAAQlxC,GAAI,CAAA;AAC7B,MAAA,CAAA;AACA,MAAA,KAAA,EAAA,CAAQpL,GAAAA,KAAO;AAAE,QAAAopB,GAAAA,CAAOomB,GAAAA,CAAQmoB,GAAAA,CAAOvrC,GAAE,CAAC,CAAC,CAAA;AAAG,MAAA,CAAA;AAI9C,MAAA,QAAA,EAAA,MAAgB;AAAE,QAAAhD,GAAAA,CAAOyF,GAAAA,CAAK,OAAA,CAAS,IAAI,CAAA;AAAG,MAAA;KAC/C,CAAA,EACD7uB,IAAE,cAAA,EAAe;AACnB,EAAA,CAAA,EAAG,EAAE,CAAA,EAECq+B,GAAAA,GAAY/S,WAAAA,CAAAA,CAAatrB,GAAAA,KAAqC;AAClE,IAAA,IAAM43D,MAAO/wD,GAAAA,KAAgB,UAAA,GAAa,eAAe,WAAA,EACnDgxD,GAAAA,GAAShxD,QAAgB,UAAA,GAAa,WAAA,GAAc,SAAA,EACpD8qD,GAAAA,GAASjnD,OAAQ1K,GAAAA,CAAE,QAAA,GAAW,IAAI,CAAA,CAAA,IAAM83D,GAAAA,GAAS,KAAK,CAAA,CAAA,EACxD1sD,GAAAA;AAKJ,IAAA,IAJIpL,GAAAA,CAAE,GAAA,KAAQ43D,GAAAA,GAAM32D,GAAAA,GAAOsyB,GAAAA,GAAQo+B,GAAAA,GAC1B3xD,GAAAA,CAAE,GAAA,KAAQ63D,GAAAA,GAAQ52D,GAAAA,GAAOsyB,GAAAA,GAAQo+B,GAAAA,GACjC3xD,GAAAA,CAAE,GAAA,KAAQ,MAAA,GAAQiB,GAAAA,GAAO62D,GAAAA,GAAS7pB,GAAAA,GAAMN,GAAAA,GACxC3tC,GAAAA,CAAE,GAAA,KAAQ,KAAA,KAAOiB,GAAAA,GAAO62D,GAAAA,GAASnqB,GAAAA,GAAMM,GAAAA,CAAAA,EAC5C7iC,GAAAA,KAAS,MAAA,EAAW;AACxB,IAAApL,IAAE,cAAA,EAAe;AACjB,IAAA,IAAM+3D,GAAAA,GAAUV,GAAAA,CAAOjsD,GAAAA,EAAMuiC,GAAAA,EAAKM,KAAKvjC,GAAI,CAAA;AAC3C85B,IAAAA,GAAAA,CAAQuzB,GAAO,CAAA,EACfrzB,GAAAA,GAAWqzB,GAAO,CAAA;EACpB,CAAA,EAAG;AAACD,IAAAA,GAAAA;AAAQ7pB,IAAAA,GAAAA;AAAKN,IAAAA,GAAAA;AAAKnJ,IAAAA,GAAAA;AAASE,IAAAA,GAAAA;AAAU79B,IAAAA,GAAAA;AAAa6D,IAAAA,GAAAA;AAAM6oB,IAAAA;AAAK,GAAC,GAE5D3sB,GAAAA,GAAM;IAAC1F,GAAAA,CAAE,MAAA;AAAQ2F,IAAAA,GAAAA,KAAgB,gBAAgB3F,GAAAA,CAAE,UAAA;AAAYkE,IAAAA;AAAS,GAAA,CAC3E,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAE3B,EAAA,uBACErE,IAAC,KAAA,EAAD;IACE,SAAA,EAAW6F,GAAAA;IACX,IAAA,EAAK,WAAA;IACL,QAAA,EAAU,CAAA;IACV,YAAA,EAAYqe,GAAAA;IACZ,kBAAA,EAAkBpe,GAAAA;IAClB,eAAA,EAAe0sB,GAAAA;IACf,eAAA,EAAeoa,GAAAA;IACf,eAAA,EAAeM,GAAAA;IACA,aAAA,EAAAh9B,GAAAA;IACJ,SAAA,EAAAI;GACZ,CAAA;AAEL;;;;;;;;ACzIA,SAAgB2mD,IAAUrzD,GAAAA,EAAuB;AAC/C,EAAA,IAAM,EAAE,SAAA,EAAAH,GAAAA,EAAW,UAAAvD,GAAAA,EAAU,SAAA,EAAAwF,KAAA,GAAc/B,GAAAA;AAC3C,EAAA,uBACE1E,IAAC,QAAA,EAAD;IAAQ,SAAA,EAAW,CAACkB,IAAE,GAAA,EAAKkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IAAG,YAAA,EAAY6f,GAAAA;IAC1E,QAAA,EAAAhkB;GACK,CAAA;AAEZ;AAmBA,SAAgBg3D,IAActzD,GAAAA,EAA2B;AACvD,EAAA,IAAM,EAAE,KAAA,EAAAH,GAAAA,EAAO,KAAA,EAAAvD,GAAAA,EAAO,QAAA,EAAAwF,GAAAA,EAAU,SAAA,EAAAkC,GAAAA,EAAA,GAAcjE,GAAAA,EACxCkC,GAAAA,GAAM;IAAC1F,GAAAA,CAAE,IAAA;AAAMg3D,IAAAA,GAAAA,IAASh3D,GAAAA,CAAE,KAAA;AAAOoG,IAAAA,GAAAA,KAAU,UAAapG,GAAAA,CAAE,QAAA;AAAUkE,IAAAA;AAAS,GAAA,CAChF,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC3B,EAAA,uBAAOpF,IAAC,MAAA,EAAD;IAAM,SAAA,EAAW4G,GAAAA;IAAY,KAAA,EAAApC,GAAAA;IAAQ,QAAA,EAAAiC;GAAe,CAAA;AAC7D;AAOA,SAAgB0xD,GAAAA,GAAkB;AAChC,EAAA,uBAAOn4D,IAAC,MAAA,EAAD;AAAM,IAAA,SAAA,EAAWkB,GAAAA,CAAE,MAAA;IAAQ,aAAA,EAAY;GAAQ,CAAA;AACxD;;;;;ACzBA,SAASk3D,IAAiCp4D,GAAAA,EAAwD;AAChG,EAAA,OAAOuG,GAAAA,CAAM,GAAA,CAAA,CAAIvG,GAAAA,KAAO,OAAOwqB,GAAAA,IAAO,QAAA,IAAYA,GAAAA,GAAcA,GAAAA,GAAM,EAAE,KAAA,EAAOA,GAAAA,EAAuB,CAAA;AACxG;AAQA,SAAS6tC,GAAAA,CAAoCr4D,KAAiCe,GAAAA,EAAkB;AAC9F,EAAA,IAAMu3D,MAAQ/xD,GAAAA,CAAM,SAAA,CAAA,CAAUvG,GAAAA,KAAMwqB,GAAAA,CAAG,UAAU+I,GAAK,CAAA;AACtD,EAAA,IAAI+kC,GAAAA,KAAU,IAAI,OAAOA,GAAAA;AACzB,EAAA,IAAI,OAAO/kC,GAAAA,IAAU,QAAA,EAAU,OAAO,CAAA;AACtC,EAAA,IAAIqD,GAAAA,GAAO,GACPyX,GAAAA,GAAU,QAAA;AACd,EAAA,KAAA,IAASptC,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIsF,GAAAA,CAAM,QAAQ5B,GAAAA,EAAAA,EAAK;AACrC,IAAA,IAAM9E,GAAAA,GAAI0G,GAAAA,CAAMtF,GAAAA,CAAAA,CAAG,KAAA;AACnB,IAAA,IAAI,OAAOpB,OAAM,QAAA,EAAU;AAC3B,IAAA,IAAMu2B,GAAAA,GAAM,IAAA,CAAK,GAAA,CAAIv2B,GAAAA,GAAI0zB,GAAK,CAAA;AAC1B6C,IAAAA,GAAAA,GAAMiY,GAAAA,KACRptC,GAAAA,GAAUm1B,GAAAA,EACV5xB,GAAAA,GAAOvD,GAAAA,CAAAA;AAEX,EAAA;AACA,EAAA,OAAO21B,GAAAA;AACT;AAEA,SAAS2hC,GAAAA,CAAUv4D,KAAkBe,GAAAA,EAA+B;AAClE,EAAA,OAAgE,MAAA,CAAzD,OAAOW,GAAAA,IAAU,QAAA,IAAY,OAAOA,GAAAA,IAAU,QAAA,GAAkBA,MAAgB82D,GAAQ,CAAA;AACjG;AAiBA,SAAgBC,IAA6Cx4D,GAAAA,EAA2C;AACtG,EAAA,IAAM,EAAE,KAAA,EAAAkB,GAAAA,EAAO,QAAA,EAAAC,GAAAA,EAAU,UAAAC,GAAAA,EAAU,WAAA,EAAAyD,GAAAA,EAAa,SAAA,EAAAjD,GAAAA,EAAW,SAAA,EAAAhB,KAAA,GAAc6D,GAAAA,EACnE6B,GAAAA,GAAQ6xD,GAAAA,CAAU1zD,GAAAA,CAAM,KAAK,CAAA,EAC7B2lB,GAAAA,GAAQguC,GAAAA,CAAa9xD,GAAAA,EAAOgtB,GAAK,CAAA,EACjCmlC,GAAAA,GAAY,IAAA,CAAK,IAAI,CAAA,EAAGnyD,GAAAA,CAAM,MAAA,GAAS,CAAC,CAAA,EAExCoyD,GAAAA,GAAAA,CAAW34D,GAAAA,EAAqBe,GAAAA,KACpC6E,GAAAA,CAAK,KAAA,IAASgzD,GAAAA,GAAchzD,GAAAA,CAAK,OAAO3E,GAAC,CAAA,IAAK,MAAA,CAAO2E,GAAAA,CAAK,KAAK,CAAA,EAK3DizD,GAAAA,GAAUnvD,MAAAA,CAAO2gB,GAAK,CAAA,EACtByuC,GAAAA,GAAapvD,MAAAA,CAAO,KAAK,CAAA;AAC/B,EAAA/E,UAAA,MAAgB;AACd,IAAAsB,IAAQ,OAAA,GAAUokB,GAAAA;EACpB,CAAA,EAAG,CAACA,GAAK,CAAC,CAAA;AAEV,EAAA,IAAM0uC,GAAAA,GAAAA,CAAe/4D,GAAAA,KAAkB;AACrC,IAAA,IAAMiB,GAAAA,GAAImK,GAAAA,CAAK,CAAA,CAAA,CAAG,KAAA;AACdnK,IAAAA,GAAAA,KAAM43D,GAAAA,CAAQ,OAAA,KAClB5yD,GAAAA,CAAQ,UAAUhF,GAAAA,EAClBsC,GAAAA,CAAW,OAAA,GAAU,IAAA,EACrBmhC,GAAAA,CAASn+B,GAAAA,CAAMtF,GAAAA,CAAAA,CAAG,OAAOA,GAAC,CAAA,CAAA;EAC5B,CAAA,EAEM+3D,GAAAA,GAAAA,CAAgBh5D,GAAAA,KAAkB;AACtC,IAAA,IAAI,CAAC84D,IAAW,OAAA,EAAS;AACzB,IAAAv1D,IAAW,OAAA,GAAU,KAAA;AACrB,IAAA,IAAMtC,GAAAA,GAAImK,GAAAA,CAAK,CAAA,CAAA,CAAG,KAAA;AAClB,IAAA/J,GAAAA,GAAWkF,GAAAA,CAAMtF,GAAAA,CAAAA,CAAG,OAAOA,GAAC,CAAA;EAC9B,CAAA,EAEMk4B,GAAAA,GAAU5yB,IAAM8jB,GAAAA,CAAAA;AACtB,EAAA,IAAI,CAAC8O,GAAAA,EAAS,uBAAOp4B,GAAAA,CAAC,OAAD,EAAK,SAAA,EAAWqE,GAAAA,GAAY,CAAA,EAAGlE,IAAE,IAAA,CAAA,CAAA,EAAQkE,GAAAA,CAAAA,CAAAA,GAAclE,GAAAA,CAAE,MAAO,CAAA;AAErF,EAAA,IAAMwtC,MAAkB,CACtB;IAAE,KAAA,EAAOrkB,GAAAA;IAAO,SAAA,EAAW8O,GAAAA,CAAQ,aAAao/B,GAAAA,CAAUI,GAAAA,CAAQx/B,KAAS9O,GAAK,CAAA,EAAG8O,IAAQ,KAAK;AAAE,GACpG,GAEMpX,GAAAA,GAAsBxb,GAAAA,CAAM,GAAA,CAAA,CAAKvG,KAAMe,GAAAA,MAAO;IAAE,KAAA,EAAOE,GAAAA;IAAG,KAAA,EAAO03D,GAAAA,CAAQ/yD,KAAM3E,GAAC;GAAE,CAAE,CAAA;AAE1F,EAAA,uBACEF,IAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAWqE,MAAY,CAAA,EAAGlE,GAAAA,CAAE,IAAA,CAAA,CAAA,EAAQkE,GAAAA,KAAclE,GAAAA,CAAE,IAAA;IACvD,QAAA,kBAAAH,IAACkuC,EAAAA,EAAD;AACE,MAAA,SAAA,EAAW/tC,GAAAA,CAAE,MAAA;MACb,GAAA,EAAK,CAAA;MACL,GAAA,EAAKw3D,GAAAA;MACE,KAAA,EAAA10C,GAAAA;MACP,IAAA,EAAK,QAAA;AACL,MAAA,UAAA,EAAYtf,IAAM,MAAA,IAAU,KAAA;MAC5B,UAAA,EAAW,cAAA;AACX,MAAA,WAAA,EAAaA,IAAM,WAAA,IAAe,CAAA;MACvB,SAAA,EAAA7C,GAAAA;MACH,MAAA,EAAAwP,GAAAA;MACR,OAAA,EAAS0nD,GAAAA;MACT,QAAA,EAAUC;KACX;GACE,CAAA;AAET;AC1HA,IAAMC,GAAAA,GAAiB,GAAA;AAAvB,IAIIC,GAAAA,GAAyB,CAAA;AAU7B,SAASC,IAAyBn5D,GAAAA,EAAsB;AACtD,EAAA,IAAMo5D,MACJ,OAAO,UAAA,IAAe,UAAA,IAAc,UAAA,CAAW,kCAAkC,CAAA,CAAE,OAAA;AACrF,EAAA,IAAI,OAAO,QAAA,GAAa,GAAA,IAAe,EAAE,qBAAA,IAAyB,aAAaA,GAAAA,EAAc;AAC3F,IAAAp5D,GAAAA,EAAG;AACH,IAAA;AACF,EAAA;AAIA,EAAA,IAAM4sC,MAAO,QAAA,CAAS,eAAA;AACtB,EAAAxrC,GAAAA,EAAAA,EACAwrC,GAAAA,CAAK,SAAA,CAAU,GAAA,CAAI,cAAc,CAAA;AAGjC,EAAA,IAAMysB,MAAK,QAAA,CAAS,mBAAA,CAAA,MAA0BC,SAAAA,CAAUC,GAAE,CAAC,CAAA;AAM3DF,EAAAA,GAAAA,CAAG,KAAA,CAAM,KAAA,CAAA,MAAY;AAAC,EAAA,CAAC,CAAA,EACvBA,GAAAA,CAAQ,QAAA,CAAS,OAAA,CAAA,MAAc;AACzB,IAAA,EAAEH,GAAAA,KAA2B,CAAA,IAAGtsB,GAAAA,CAAK,SAAA,CAAU,OAAO,cAAc,CAAA;EAC1E,CAAC,CAAA;AACH;AAKA,IAAM4sB,GAAAA,uBAAiB,OAAA,EAAuD;AAA9E,IAWaC,MAAb,MAAwB;AACtB,EAAA,QAAA,uBAAuB,GAAA,EAAoB;EAE3C,WAAA,GAAc;AACZ,IAAA30D,GAAAA,CAAW,GAAA,CACT,IAAA,EACA,IAAI40D,mBAAAA,CAAkC;MACpC,gBAAA,EAAkB,CAAA;MAClB,UAAA,EAAYP;AACd,KAAC,CACH,CAAA;AACF,EAAA;AAEA,EAAA,GAAA,CAAIn5D,GAAAA,EAAiBe,GAAAA,EAAe4D,GAAAA,GAAwB,EAAC,EAAS;AACpE,IAAA,IAAM,EAAE,WAAA,EAAAH,GAAAA,EAAa,KAAA,EAAAvD,GAAAA,GAAQg4D,GAAAA,EAAgB,EAAA,EAAAxyD,GAAAA,EAAA,GAAOqsB,GAAAA,EAC9C6mC,GAAAA,GAAMH,GAAAA,CAAW,IAAI,IAAI,CAAA;AAC/B,IAAA,IAAIjvC,QAAO,MAAA,EAAW;AACpB,MAAA,IAAMqvC,GAAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAIrvC,GAAE,CAAA;AACjCqvC,MAAAA,GAAAA,KAAa,MAAA,IAAWD,GAAAA,CAAI,KAAA,CAAMC,GAAQ,CAAA;AAChD,IAAA;AACA,IAAA,IAAI/nC,GAAAA,EACEgoC,MACJC,GAAAA,KAAU,IAAA,GAAO,EAAC,GAAI,EAAE,SAASA,GAAAA,EAAM;AACrCvvC,IAAAA,GAAAA,KAAO,MAAA,KACTtqB,GAAAA,CAAW,OAAA,GAAA,MAAgB;AACrB,MAAA,IAAA,CAAK,QAAA,CAAS,IAAIsqB,GAAE,CAAA,KAAMsH,OAAK,IAAA,CAAK,QAAA,CAAS,OAAOtH,GAAE,CAAA;IAC5D,CAAA,CAAA,EAEFrpB,GAAAA,GAAMy4D,IAAI,GAAA,CAAI;MAAE,KAAA,EAAA54D,GAAAA;MAAO,WAAA,EAAAyD,GAAAA;MAAa,IAAA,EAAAxE;KAAK,EAAG65D,GAAU,GAClDtvC,GAAAA,KAAO,MAAA,IAAW,KAAK,QAAA,CAAS,GAAA,CAAIA,KAAIsH,GAAG,CAAA;AACjD,EAAA;AAGA,EAAA,OAAA,CAAQ7xB,GAAAA,EAAkB;AACxB,IAAA,IAAM6xB,GAAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAItH,GAAE,CAAA;AAC5BsH,IAAAA,QAAQ,MAAA,IAAW2nC,GAAAA,CAAW,IAAI,IAAI,CAAA,CAAG,MAAM3nC,GAAG,CAAA;AACxD,EAAA;EAGA,KAAA,GAAc;AACZ2nC,IAAAA,GAAAA,CAAW,IAAI,IAAI,CAAA,CAAG,OAAM,EAC5B,IAAA,CAAK,SAAS,KAAA,EAAM;AACtB,EAAA;AACF,CAAA;AAOA,SAAgBO,GAAAA,GAA+B;AAC7C,EAAA,OAAO,IAAIN,GAAAA,EAAW;AACxB;AAOA,SAAgBO,IAAWh6D,GAAAA,EAAsD;AAC/E,EAAA,OAAOw5D,GAAAA,CAAW,IAAIS,GAAK,CAAA;AAC7B;AAGA,IAAaC,MAAoBH,GAAAA,EAAiB;AAUlD,SAASI,IAASn6D,GAAAA,EAAiB;AACjC,EAAA,OAAA,CAAQe,GAAAA,EAAe4D,GAAAA,KAA2Bu1D,IAAkB,GAAA,CAAItyD,GAAAA,EAAMN,KAAOwrB,GAAO,CAAA;AAC9F;AAG8B,MAAA,CAAO,MAAA,CAAOqnC,GAAAA,CAAS,MAAM,CAAA,EAAG;AAC5D,EAAA,IAAA,EAAMA,IAAS,MAAM,CAAA;AACrB,EAAA,OAAA,EAASA,IAAS,SAAS,CAAA;AAC3B,EAAA,OAAA,EAASA,IAAS,SAAS,CAAA;AAC3B,EAAA,KAAA,EAAOA,IAAS,OAAO;AACzB,CAAC;AALD,IAKCl0D,GAAAA,GAAA;;;;;;;;;;;;;;;;AALD,ICxIMm0D,GAAAA,GAAiD;AACrD,EAAA,cAAA,EAAgBl5D,GAAAA,CAAE,WAAA;AAClB,EAAA,aAAA,EAAeA,GAAAA,CAAE,UAAA;AACjB,EAAA,WAAA,EAAaA,GAAAA,CAAE,QAAA;AACf,EAAA,UAAA,EAAYA,GAAAA,CAAE;AAChB,CAAA;ADmIA,ICjIMm5D,GAAAA,GAAuC;AAC3C,EAAA,IAAA,EAAMn5D,GAAAA,CAAE,QAAA;AACR,EAAA,OAAA,EAASA,GAAAA,CAAE,WAAA;AACX,EAAA,OAAA,EAASA,GAAAA,CAAE,WAAA;AACX,EAAA,KAAA,EAAOA,GAAAA,CAAE;AACX,CAAA;AAQA,SAAgBo5D,IAAY3xD,GAAAA,EAAyB;AACnD,EAAA,IAAM,EAAE,OAAA1I,GAAAA,GAAQi6D,GAAAA,EAAmB,WAAA/4D,GAAAA,GAAY,cAAA,EAAgB,SAAA,EAAAC,GAAAA,EAAA,GAAcsD,GAAAA;AAC7E,EAAA,uBACE1E,IAACu6D,oBAAAA,EAAD;AACE,IAAA,KAAA,EAAOP,IAAWC,GAAK,CAAA;IACvB,YAAA,EAAW,eAAA;IACX,SAAA,EAAW;MAAC/4D,GAAAA,CAAE,MAAA;AAAQk5D,MAAAA,GAAAA,CAAelkC,GAAAA,CAAAA;AAAY9wB,MAAAA;AAAS,KAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAElF,IAAA,QAAA,EAAA,CAAA,EAAE,KAAA,EAAOrE,KAAAA,qBACTA,KAACy5D,cAAAA,EAAD;MACE,KAAA,EAAOz5D,GAAAA;AACP,MAAA,SAAA,EAAW,CAACG,GAAAA,CAAE,KAAA,EAAOm5D,GAAAA,CAAUt5D,GAAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;MAKxE,KAAA,EAAO,EAAE,oBAAoB,CAAA,UAAA,EAAaA,GAAAA,CAAE,IAAI,OAAA,CAAQ,iBAAA,EAAmB,GAAG,CAAA,CAAA,CAAA,EAAI;MAPpF,QAAA,EAAA,iBASEA,IAAAA,CAAC05D,qBAAAA,EAAD;AAAiB,QAAA,SAAA,EAAWv5D,GAAAA,CAAE,OAAA;QAA9B,QAAA,EAAA,iBACElB,GAAAA,CAAC4oC,IAAAA,EAAD;UAAM,IAAA,EAAK,OAAA;AAAQ,UAAA,SAAA,EAAW1nC,GAAAA,CAAE,KAAA;AAAQ,UAAA,QAAA,EAAAH,IAAE,OAAA,CAAQ;AAAY,SAAA,GAC7DA,GAAAA,CAAE,OAAA,CAAQ,gBAAgB,MAAA,oBACzBf,IAAC4oC,IAAAA,EAAD;UAAM,IAAA,EAAK,aAAA;AAAc,UAAA,SAAA,EAAW1nC,GAAAA,CAAE,WAAA;AAAc,UAAA,QAAA,EAAAH,IAAE,OAAA,CAAQ;AAAkB,SAAA,CAEnE;OACjB,CAAA,kBAAAf,GAAAA,CAACmpB,MAAAA,EAAD;QAAQ,IAAA,EAAK,OAAA;AAAQ,QAAA,SAAA,EAAWjoB,GAAAA,CAAE,KAAA;QAAO,YAAA,EAAW,sBAAA;QAAuB,QAAA,EAAA;AAEnE,OAAA,CACA;;GAEE,CAAA;AAEpB;;;;;;;;;;;;;AClEA,SAAgBw5D,IAAQ16D,GAAAA,EAAmB;AACzC,EAAA,OAAOoB,GAAAA,GAAI,CAAA,GAAI,CAAA,GAAIA,GAAAA,GAAI,IAAI,CAAA,GAAIA,GAAAA;AACjC;AAGA,IAAau5D,GAAAA,GAAyB;EACpC,MAAA,EAAA,CAAS36D,KAAOe,GAAAA,EAAK4D,GAAAA,KAASspC,QAAQN,GAAAA,GAAM,CAAA,GAAA,CAAKpa,GAAAA,GAAQoa,GAAAA,KAAQM,GAAAA,GAAMN,GAAAA,CAAAA;AACvE,EAAA,QAAA,EAAA,CAAW3tC,GAAAA,EAAMe,GAAAA,EAAK4D,GAAAA,KAAQgpC,GAAAA,GAAM8O,OAAQxO,GAAAA,GAAMN,GAAAA;AACpD,CAAA;AAHA,IAMaitB,GAAAA,GAAsB;EACjC,MAAA,EAAA,CAAS56D,GAAAA,EAAOe,GAAAA,EAAK4D,GAAAA,KAAQ;AAC3B,IAAA,IAAM6T,GAAAA,GAAK,KAAK,GAAA,CAAIm1B,GAAG,GACjBl1B,GAAAA,GAAK,IAAA,CAAK,IAAIw1B,GAAG,CAAA;AACvB,IAAA,OAAOx1B,GAAAA,KAAOD,MAAK,CAAA,GAAA,CAAK,IAAA,CAAK,IAAI+a,GAAK,CAAA,GAAI/a,QAAOC,GAAAA,GAAKD,GAAAA,CAAAA;AACxD,EAAA,CAAA;EACA,QAAA,EAAA,CAAWxY,GAAAA,EAAMe,GAAAA,EAAK4D,GAAAA,KAAQ;AAC5B,IAAA,IAAM6T,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAIm1B,GAAG,CAAA;AACvB,IAAA,OAAO,IAAA,CAAK,IAAIn1B,GAAAA,GAAKikC,GAAAA,IAAQ,KAAK,GAAA,CAAIxO,GAAG,IAAIz1B,GAAAA,CAAG,CAAA;AAClD,EAAA;AACF,CAAA;AAhBA,IAkBIqiD,GAAAA,GAAuB,KAAA;AAE3B,SAASC,GAAAA,GAAiB;AACxB,EAAA,OAAO,OAAO,OAAA,GAAY,GAAA,GAAA,OAAA,CAAA,GAAA,CAAA,aAAuC,YAAA,GAAe,IAAA;AAClF;AAMA,SAAgBC,GAAAA,CACd/6D,KACAe,GAAAA,EACW;AACX,EAAA,IAAM4nD,GAAAA,GACJ/sC,QAAU,MAAA,IAAaA,GAAAA,KAAU,QAC7Bg/C,GAAAA,GACAh/C,GAAAA,KAAU,WACR++C,GAAAA,GACA/+C,GAAAA;AAWR,EAAA,OATI+sC,QAAciS,GAAAA,IAAYjtB,GAAAA,GAAM,CAAA,GAAUgb,GAAAA,IAE1CmS,KAAM,IAAK,CAACD,GAAAA,KACd/1D,GAAAA,GAAuB,MACvB,OAAA,CAAQ,IAAA,CACN,CAAA,kDAAA,EAAqD6oC,GAAAA,wEAEvD,CAAA,CAAA,EAEKgtB,GAAAA,CAAAA;AACT;AC3CA,SAAgBK,GAAAA,CAAkBh7D,KAA2Be,GAAAA,EAAwB;AACnF,EAAA,IAAMk6D,GAAAA,GAAQ1nC,IAAM,GAAA,CAAA,CAAKvzB,SAAO,EAAE,GAAGuD,KAAE,CAAE,CAAA;AAEzC,EAAA,OADI03D,IAAM,MAAA,GAAS,CAAA,KAAGt2D,IAAM,CAAA,CAAA,CAAG,OAAOgpC,GAAAA,CAAAA,EAC/BstB,GAAAA;AACT;AAGA,SAAgBC,GAAAA,CACdl7D,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACAH,GAAAA,EACkB;AAGlB,EAAA,OAAO,CAFM6lB,GAAAA,KAAU,CAAA,GAAIsjB,GAAAA,GAAMstB,GAAAA,CAAM5wC,GAAAA,CAAAA,CAAO,IAAA,EACnCA,GAAAA,KAAU4wC,GAAAA,CAAM,SAAS,CAAA,GAAIhtB,GAAAA,GAAMgtB,IAAM5wC,GAAAA,GAAQ,CAAA,EAAG,IAC/C,CAAA;AAClB;AAGA,SAAgB8wC,GAAAA,CACdn7D,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACAH,GAAAA,EACkB;AAGlB,EAAA,OAAO,CAFI6lB,GAAAA,KAAU,CAAA,GAAIsjB,MAAMstB,GAAAA,CAAM5wC,GAAAA,EAAO,IAAA,EACjCA,GAAAA,GAAQ,CAAA,IAAK4wC,GAAAA,CAAM,SAAS,CAAA,GAAIA,GAAAA,CAAM5wC,MAAQ,CAAA,CAAA,CAAG,OAAO4jB,GACrD,CAAA;AAChB;AAGA,SAAgBmtB,GAAAA,CACdp7D,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACAH,KACAvD,GAAAA,EACQ;AACR,EAAA,IAAM,CAACuX,KAAIC,GAAAA,CAAAA,GAAM0iD,IAAWF,GAAAA,EAAO5wC,GAAAA,EAAOsjB,KAAKM,GAAG,CAAA;AAClD,EAAA,OAAO,KAAK,GAAA,CAAIz1B,GAAAA,EAAI,KAAK,GAAA,CAAIC,GAAAA,EAAI2a,GAAE,CAAC,CAAA;AACtC;AAEA,SAAgBioC,GAAAA,CAAWr7D,GAAAA,EAA2Be,GAAAA,EAAe4D,GAAAA,EAAuB;AAC1F,EAAA,IAAIs2D,GAAAA,CAAM5wC,GAAAA,GAAQ,CAAA,CAAA,KAAO,MAAA,IAAa4wC,GAAAA,CAAM5wC,GAAAA,GAAQ,CAAA,CAAA,CAAG,IAAA,KAAS+I,GAAAA,EAAI,OAAO6nC,GAAAA;AAC3E,EAAA,IAAM7vD,GAAAA,GAAO6vD,IAAM,GAAA,CAAA,CAAKj7D,SAAO,EAAE,GAAGuD,KAAE,CAAE,CAAA;AAExC,EAAA,OADAiB,GAAAA,CAAK6lB,GAAAA,GAAQ,CAAA,CAAA,CAAG,OAAO+I,GAAAA,EAChBhoB,GAAAA;AACT;AAGA,SAAgBkwD,GAAAA,CACdt7D,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACAH,GAAAA,EACU;AACV,EAAA,IAAM+2D,MAAQN,GAAAA,CAAM,GAAA,CAAA,CAAKj7D,GAAAA,EAAGiB,QAAOA,GAAAA,KAAM,CAAA,GAAI,CAAA,GAAIy5D,GAAAA,CAAQ9+C,IAAM,MAAA,CAAOrY,GAAAA,CAAE,MAAMoqC,GAAAA,EAAKM,GAAG,CAAC,CAAE,CAAA;AAEzF,EAAA,OADAstB,GAAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EACLA,GAAAA;AACT;AAOA,SAAgBC,GAAAA,CAAex7D,GAAAA,EAA0Be,GAAAA,EAAe4D,GAAAA,EAAuB;AAC7F,EAAA,IAAM82D,MAAUpxC,GAAAA,KAAU,CAAA,EACpBqxC,GAAAA,GAASrxC,GAAAA,KAAUkxC,IAAM,MAAA,GAAS,CAAA;AACxC,EAAA,IAAIE,GAAAA,IAAWC,KAAQ,OAAO,CAAA;AAC9B,EAAA,IAAMljD,GAAAA,GAAK+iD,GAAAA,CAAMlxC,GAAAA,GAAQ,CAAA,IAAKkxC,GAAAA,CAAMlxC,GAAAA,CAAAA,EAC9B5R,GAAAA,GAAK8iD,IAAMlxC,GAAAA,GAAQ,CAAA,CAAA,GAAKkxC,GAAAA,CAAMlxC,MAAQ,CAAA,CAAA;AAC5C,EAAA,OAAO,KAAK,GAAA,CAAI7R,GAAAA,EAAI,KAAK,GAAA,CAAIC,GAAAA,EAAImC,GAAK,CAAC,CAAA;AACzC;AAGA,SAAgB+gD,GAAAA,CACd37D,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACAH,GAAAA,EACW;AACX,EAAA,IAAM4G,GAAAA,GAAO6vD,IAAM,GAAA,CAAA,CAAKj7D,SAAO,EAAE,GAAGuD,KAAE,CAAE,CAAA;AAGxC,EAAA,OAFAtC,GAAAA,CAAKopB,GAAAA,CAAAA,CAAO,IAAA,GAAOzmB,KACfwH,GAAAA,CAAKif,GAAAA,GAAQ,CAAA,CAAA,KAAO,WAAWppB,GAAAA,CAAKopB,GAAAA,GAAQ,CAAA,CAAA,CAAG,OAAO+I,GAAAA,CAAAA,EACnDhoB,GAAAA;AACT;AAMA,SAAgBwwD,GAAAA,CACd57D,GAAAA,EACAe,GAAAA,EACA4D,GAAAA,EACAH,KACAvD,GAAAA,EACW;AACX,EAAA,IAAIg6D,IAAM,MAAA,KAAW,CAAA,IAAKvuC,OAAMihB,GAAAA,IAAOjhB,GAAAA,IAAMuhB,KAAK,OAAOgtB,GAAAA;AACzD,EAAA,IAAI5wC,GAAAA,GAAQ,EAAA;AACZ,EAAA,KAAA,IAASppB,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIg6D,GAAAA,CAAM,QAAQh6D,GAAAA,EAAAA,EAAK;AACrC,IAAA,IAAM,CAAC2C,KAAMwvB,GAAAA,CAAAA,GAAM8nC,IAAWD,GAAAA,EAAOh6D,GAAAA,EAAG0sC,KAAKM,GAAG,CAAA;AAChD,IAAA,IAAIvhB,GAAAA,GAAK9oB,GAAAA,IAAQ8oB,GAAAA,GAAK0G,GAAAA,EAAI;AACxB,MAAA3sB,GAAAA,GAAQxF,GAAAA;AACR,MAAA;AACF,IAAA;AACF,EAAA;AACA,EAAA,IAAIopB,GAAAA,GAAQ,GAAG,OAAO4wC,GAAAA;AACtB,EAAA,IAAM7vD,GAAAA,GAAO6vD,IAAM,GAAA,CAAA,CAAKj7D,SAAO,EAAE,GAAGuD,KAAE,CAAE,CAAA;AAExC,EAAA,OADA6H,GAAAA,CAAK,MAAA,CAAOif,GAAAA,GAAQ,CAAA,EAAG,CAAA,EAAG;IAAE,IAAA,EAAMqC,GAAAA;AAAI,IAAA,IAAA,EAAMmvC,GAAAA,CAASnvC,GAAAA,EAAIuuC,GAAAA,CAAM5wC,GAAAA,EAAO,IAAI;AAAE,GAAC,CAAA,EACtEjf,GAAAA;AACT;AAOA,SAAgB0wD,GAAAA,CAAa97D,KAA2Be,GAAAA,EAA0B;AAEhF,EAAA,OADIspB,GAAAA,IAAS,KAAKA,GAAAA,IAAS4wC,GAAAA,CAAM,SAAeA,GAAAA,GACzCA,GAAAA,CAAM,OAAA,CAAQj7D,GAAAA,EAAG2E,QAAM1D,GAAAA,KAAMopB,GAAK,EAAE,GAAA,CAAA,CAAKrqB,SAAO,EAAE,GAAGuD,KAAE,CAAE,CAAA;AAClE;ACtFA,IAAMw4D,GAAAA,GAAW,IAAA;AAEjB,SAAS1oB,IAAIrzC,GAAAA,EAAsB;AACjC,EAAA,OAAO,CAAA,EAAG06D,GAAAA,CAAQje,GAAI,CAAA,GAAI,GAAA,CAAA,CAAA,CAAA;AAC5B;AAEA,SAASuf,GAAAA,CAAYh8D,KAAae,GAAAA,EAAY;AAC5C,EAAA,OAAO6C,GAAAA;AACT;AAEA,SAASq4D,IAAYj8D,GAAAA,EAAqC;AACxD,EAAA,IAAI,EAAE8pB,GAAAA,YAAkB,WAAA,CAAA,EAAc,OAAO,KAAA;AAC7C,EAAA,IAAIA,GAAAA,CAAO,mBAAmB,OAAO,IAAA;AACrC,EAAA,IAAMoyC,MAAMpyC,GAAAA,CAAO,OAAA;AACnB,EAAA,OAAOoyC,GAAAA,KAAQ,OAAA,IAAWA,GAAAA,KAAQ,UAAA,IAAcA,GAAAA,KAAQ,QAAA;AAC1D;AA2BA,SAAgBC,IAAc/6D,GAAAA,EAAyC;AACrE,EAAA,IAAM,EACJ,KAAA,EAAAC,GAAAA,EACA,SAAAyD,GAAAA,EACA,QAAA,EAAAjD,KACA,GAAA,EAAAjC,GAAAA,EACA,GAAA,EAAAqW,GAAAA,EACA,OAAAwB,GAAAA,EACA,KAAA,EAAA7B,KACA,UAAA,EAAA5H,GAAAA,EACA,eAAAqW,GAAAA,EACA,QAAA,EAAAG,GAAAA,EACA,KAAA,EAAAoD,IACA,SAAA,EAAA2f,EAAAA,KACE7iC,GAAAA,EACE00B,EAAAA,GAAO10B,IAAM,IAAA,IAAQ,IAAA,EACrB03D,KAAY13D,GAAAA,CAAM,SAAA,IAAas3D,KAE/B5sB,EAAAA,GAAW1lC,MAAAA,CAA8B,IAAI,CAAA,EAC7CmwB,EAAAA,GAAanwB,OAA8B,IAAI,CAAA;AACrD,EAAAjD,SAAAA,CAAA,MAAA,MAAsB;AAAE,IAAAs+B,EAAAA,CAAW,SAAS,MAAA,EAAO;AAAG,EAAA,CAAA,EAAG,EAAE,CAAA;AAC3D,EAAA,IAAMs3B,EAAAA,GAAU5yD,OAAM,EAChBwxD,EAAAA,GAAQD,IAAeznC,GAAAA,EAAOoa,GAAG,GACjCtyB,EAAAA,GAAK0/C,GAAAA,CAAan/C,KAAO+xB,GAAG,CAAA,EAC5B2uB,KAAAA,CAAUt8D,GAAAA,KAAsB06D,IAAQr/C,EAAAA,CAAG,MAAA,CAAOxb,KAAG8tC,GAAAA,EAAKM,GAAG,CAAC,CAAA,EAC9DsuB,EAAAA,GAAAA,CAAYv8D,GAAAA,KAAsBqb,EAAAA,CAAG,SAASq/C,GAAAA,CAAQt5D,GAAC,GAAGusC,GAAAA,EAAKM,GAAG,GAElEwB,EAAAA,GAAAA,MAA2BL,GAAS,OAAA,EAAS,qBAAA,GAAwB,KAAA,IAAS,CAAA,EAE9EotB,EAAAA,GAAAA,CAAUx8D,GAAAA,KAA4B;AAC1C,IAAA,IAAM40B,GAAAA,GAAOwa,EAAAA,CAAS,OAAA,EAAS,qBAAA,EAAsB;AAErD,IAAA,OADI,CAACxa,GAAAA,IAAQA,GAAAA,CAAK,KAAA,KAAU,CAAA,GAAU,CAAA,GAC/B8lC,GAAAA,CAAAA,CAAS+B,GAAAA,GAAU7nC,GAAAA,CAAK,IAAA,IAAQA,GAAAA,CAAK,KAAK,CAAA;EACnD,CAAA,EAEM0iC,EAAAA,GAAAA,CAAWv2D,GAAAA,EAAc4D,GAAAA,KAA4B;AACzD,IAAA,IAAI,CAACy0B,MAAQsjC,GAAAA,IAAU,CAACC,OAASA,GAAAA,CAAM,MAAA,KAAW,GAAG,OAAOlgB,GAAAA;AAC5D,IAAA,IAAMhoB,MAAQgb,EAAAA,EAAW;AAEzB,IAAA,OADIhb,GAAAA,KAAU,CAAA,GAAUgoB,GAAAA,GACjB9lB,GAAAA,CAAc8lB,KAAMkgB,GAAAA,CAAM,GAAA,CAAA,CAAK38D,GAAAA,KAASs8D,GAAOM,GAAAA,CAAK,EAAE,CAAC,CAAA,EAAA,IAAoBnoC,GAAK,CAAA;AACzF,EAAA,CAAA,EAKM5F,EAAAA,GAAAA,CACJ7uB,GAAAA,EACA2E,GAAAA,EACAH,GAAAA,KACS;AACTq1B,IAAAA,EAAAA,CAAW,SAAS,MAAA,EAAO,EAC3BkL,GAAW,OAAA,GAAUnK,kBAAAA,CAAmBC,GAAAA,CAAK,aAAA,EAAeA,GAAAA,EAAM;MAChE,MAAA,EAAAl2B,GAAAA;AACA,MAAA,KAAA,EAAA,MAAa;AAAE,QAAAogC,EAAAA,CAAW,OAAA,GAAU,IAAA,EAAM83B,GAAAA,EAAM;AAAG,MAAA,CAAA;AACnD,MAAA,QAAA,EAAA,MAAgB;AAAE,QAAA93B,GAAW,OAAA,GAAU,IAAA;AAAM,MAAA;KAC/C,EAAG,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AACvB,EAAA,CAAA,EAEM+3B,EAAAA,GAAAA,CAAqB98D,GAAAA,KAAA,CAAmBe,GAAAA,KAA+C;AAC3F,IAAA,IAAI,OAAOf,GAAAA,CAAE,MAAA,IAAW,QAAA,IAAYA,GAAAA,CAAE,SAAS,CAAA,EAAG;AAClDA,IAAAA,GAAAA,CAAE,cAAA,EAAe,EACjBA,GAAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,IAAMkmB,GAAAA,GAAO+0C,IACT3e,GAAAA,GAA2B,IAAA;AAC/B,IAAAviB,EAAAA,CACE/5B,GAAAA,EAAAA,CACCe,GAAAA,KAAO;AACN,MAAA,IAAMqyB,GAAAA,GAAKgoC,GAAAA,CAAYl1C,GAAAA,EAAMmE,GAAAA,EAAOkyC,GAASjF,EAAAA,CAAQkF,EAAAA,CAAOpwC,GAAAA,CAAG,OAAO,GAAGA,GAAAA,CAAG,MAAM,CAAC,CAAA,EAAGuhB,KAAKM,GAAG,CAAA;AAC9F,MAAAzpC,MAAS62D,GAAAA,CAAQn1C,GAAAA,EAAMmE,KAAO+I,GAAE,CAAA,EAChCoR,MAAU8X,GAAM,CAAA;AAClB,IAAA,CAAA,EAAA,MACM;AACAA,MAAAA,GAAAA,IAAQ5X,IAAS4X,GAAM,CAAA;IAC7B,CACF,CAAA;AACF,EAAA,CAAA,EAEMygB,EAAAA,GAAAA,CAAiB/8D,GAAAA,KAAA,CAAmBe,GAAAA,KAAgD;AACxF,IAAA,IAAM,CAACyX,KAAIC,GAAAA,CAAAA,GAAM0iD,IAAWF,EAAAA,EAAO5wC,GAAAA,EAAOsjB,GAAAA,EAAKM,GAAG,CAAA,EAC9CnkB,GAAAA;AACJ,IAAA,IAAI9pB,GAAAA,CAAE,GAAA,KAAQ,MAAA,EAAQiB,GAAAA,GAASuX,GAAAA;aACtBxY,GAAAA,CAAE,GAAA,KAAQ,KAAA,EAAOiB,GAAAA,GAASwX,GAAAA;AAC9B,SAAA;AACH,MAAA,IAAIkU,GAAAA,GAAQ,CAAA;AACZ,MAAA,IAAI3sB,GAAAA,CAAE,GAAA,KAAQ,YAAA,IAAgBA,GAAAA,CAAE,GAAA,KAAQ,SAAA,EAAW2E,GAAAA,GAAQ3E,GAAAA,CAAE,QAAA,GAAW+7D,GAAAA,GAAW,EAAA,GAAKA,GAAAA;eAC/E/7D,GAAAA,CAAE,GAAA,KAAQ,eAAeA,GAAAA,CAAE,GAAA,KAAQ,aAAa2E,GAAAA,GAAQ3E,GAAAA,CAAE,QAAA,GAAW,IAAA,GAAiB,KAAA;AAC1F,WAAA;AACL,MAAAiB,GAAAA,GAASs7D,GAASD,EAAAA,CAAOrB,EAAAA,CAAM5wC,MAAQ,CAAA,CAAA,CAAG,IAAI,CAAA,GAAIsC,GAAK,CAAA;AACzD,IAAA;AACA,IAAA5rB,IAAE,cAAA,EAAe;AACjB,IAAA,IAAMqK,GAAAA,GAAOiwD,GAAAA,CAAQJ,EAAAA,EAAO5wC,GAAAA,EAAO+wC,GAAAA,CAAYH,IAAO5wC,GAAAA,EAAOP,GAAAA,EAAQ6jB,GAAAA,EAAKM,GAAG,CAAC,CAAA;AAC1E7iC,IAAAA,GAAAA,KAAS6vD,EAAAA,IAAOv2B,GAAAA,CAASt5B,GAAI,CAAA;AACnC,EAAA,CAAA,EAEM4xD,EAAAA,GAAAA,CAAqBh9D,GAAAA,KAAA,CAAmBe,GAAAA,KAAkD;AAK9F,IAAA,IAJI,OAAOf,GAAAA,CAAE,MAAA,IAAW,QAAA,IAAYA,GAAAA,CAAE,SAAS,CAAA,KAC3CqqB,GAAAA,KAAUijB,GAAAA,IAAe6T,GAAAA,GAAW92B,GAAK,CAAA,EAGzCA,GAAAA,KAAU,KAAKA,GAAAA,KAAU4wC,EAAAA,CAAM,SAAS,CAAA,CAAA,EAAG;AAC/C,IAAA,IAAM/0C,GAAAA,GAAO+0C,EAAAA,EACPM,GAAAA,GAAQD,GAAAA,CAAUp1C,KAAM7K,EAAAA,EAAIsyB,GAAAA,EAAKM,GAAG,CAAA,EACpCgvB,GAAAA,GAAYT,EAAAA,CAAOx8D,GAAAA,CAAE,OAAO,GAC9Bs8C,GAAAA,GAA2B,IAAA;AAC/B,IAAAviB,EAAAA,CACE/5B,GAAAA,EAAAA,CACCe,GAAAA,KAAO;AACN,MAAA,IAAM6Z,GAAAA,GAAQ4gD,IAAeD,GAAAA,EAAOlxC,GAAAA,EAAOmyC,GAAOpwC,GAAAA,CAAG,OAAO,IAAI6wC,GAAS,CAAA;AACzE,MAAAx2D,MAASk1D,GAAAA,CACPz1C,GAAAA,EACAmE,KACAkyC,EAAAA,CAAShB,GAAAA,CAAMlxC,GAAAA,CAAAA,GAASzP,GAAK,GAC7B2hD,EAAAA,CAAShB,GAAAA,CAAMlxC,MAAQ,CAAA,CAAA,GAAKzP,GAAK,CACnC,CAAA,EACA4pB,MAAU8X,GAAM,CAAA;AAClB,IAAA,CAAA,EAAA,MACM;AACAA,MAAAA,GAAAA,IAAQ5X,IAAS4X,GAAM,CAAA;IAC7B,CACF,CAAA;EACF,CAAA,EAEM4gB,GAAAA,GAAAA,CAAel9D,GAAAA,KAAA,MAA8B;AAC7CqqB,IAAAA,GAAAA,KAAUijB,GAAAA,IAAe6T,GAAAA,GAAW92B,GAAK,CAAA;AAC/C,EAAA,CAAA;AAuBA,EAAA,uBACE7lB,KAAC,KAAA,EAAD;IACE,SAAA,EAAW,CAACtD,IAAE,IAAA,EAAMkE,EAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IACvD,IAAA,EAAK,OAAA;IACL,YAAA,EAAY,OAAO1D,EAAAA,IAAU,QAAA,GAAWA,EAAAA,GAAQ,MAAA;AAChD,IAAA,iBAAA,EAAiBA,EAAAA,KAAU,MAAA,IAAa,OAAOA,EAAAA,IAAU,WAAW26D,EAAAA,GAAU,MAAA;AAC9E,IAAA,SAAA,EAAA,CApBmBr8D,GAAAA,KAAgD;AAMrE,MAAA,IALIA,IAAE,GAAA,KAAQ,GAAA,IAAOA,GAAAA,CAAE,GAAA,KAAQ,YAG3BA,GAAAA,CAAE,OAAA,IAAWA,GAAAA,CAAE,OAAA,IAAWA,IAAE,MAAA,IAC5Bi8D,GAAAA,CAAYj8D,IAAE,MAAM,CAAA,IACpBstC,OAAkB,IAAA,EAAqC;AAC3D,MAAA,IAAMliC,GAAAA,GAAO0wD,GAAAA,CAAUb,EAAAA,EAAO3tB,GAAa,CAAA;AACvCliC,MAAAA,GAAAA,KAAS6vD,EAAAA,KACbj7D,GAAAA,CAAE,cAAA,EAAe,EACjB0kC,IAASt5B,GAAI,CAAA,EACb+1C,GAAAA,GAAW7T,GAAAA,GAAgB,CAAC,CAAA,CAAA;AAC9B,IAAA,CAAA;IAGE,QAAA,EAAA;MAOG5rC,EAAAA,KAAU,MAAA,oBAAaiD,GAAAA,CAAC,KAAA,EAAD;QAAK,EAAA,EAAI03D,EAAAA;AAAS,QAAA,SAAA,EAAWn7D,GAAAA,CAAE,KAAA;QAAQ,QAAA,EAAAQ;OAAW,CAAA;AAC1E,sBAAAiD,IAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAWzD,GAAAA,CAAE,KAAA;QAAO,GAAA,EAAKkuC,EAAAA;QAAU,iBAAA,EAAgB,EAAA;AAAG,QAAA,aAAA,EAAA,CA9BnCpvC,GAAAA,KAA+C;AACzE,UAAA,IAAI,OAAOA,GAAAA,CAAE,MAAA,IAAW,QAAA,IAAYA,GAAAA,CAAE,SAAS,CAAA,EAAG;AAClD,UAAAA,IAAE,cAAA,EAAe;AACjB,UAAA,IAAMoL,GAAAA,GAAOwwD,GAAAA,CAAWX,EAAAA,EAAOsB,EAAAA,CAASC,EAAAA,CAAOx8D,GAAAA,CAAE,OAAO,CAAC,CAAA,EAAG2tC,GAAAA,EAAKM,GAAAA,EAAKmuB,EAAS,CAAA;AAC3EhxD,UAAAA,GAAAA,KAAS6vD,EAAAA,IAAOv2B,GAAAA,CAASt5B,GAAI,CAAA;AACnC,QAAA,CAAA;AA0BO,QAAA,QAAA,EAAAuxD,KAAO,GAAA,CAAA,CAAK38D,KAAMe,GAAAA,qBACjB4D,IAAC,MAAA,EAAD;AAEE,UAAA,SAAA,EAAWzD,GAAAA,CAAE,IAAA;AACb,UAAA,cAAA,EAAc07D,GAAAA,CAAK,EAAA;AACnB,UAAA,KAAA,EAAO,EAAE,SAAA,EAAWvpB,GAAAA,CAAIipB,GAAOM,GAAAA,CAAK,EAAE,CAAC,CAAA,EAAE;AAExC,UAAA,QAAA,EAAAA,GAAAA,CAAK,KAAA,KAAU,MAAA,oBAAaj4D,IAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAWzD,GAAAA,CAAE,SAAA;AAAY,YAAA,QAAA,EAAA07D,GAAAA,CAAK;WAAY;AACzE,SAAA,EANC37D,GAMD,CACP;OACE,CAAA;AACL,sBAAA0D,IAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAWzD,GAAAA,CAAE,KAAA;AACf,QAAA,QAAA,EAAA+5D,EAAAA,CAAM,GAAA,CAAA,CAAKj7D,GAAAA,EAAMe,GAAAA,KAAM;AACtB,UAAA,IAAM,CAAC6C,GAAAA,EAAMwvB,GAAAA,CAAAA,GAAM8nC,GAAAA,CAAWD,EAAAA,EAAOh6D,GAAAA,EAAG0sC,GAAAA,EAAKM,GAAG,CAAA,EAC1Cf,GAAAA,GAAaI,GAAAA,KAAkBrsC,GAAAA;AACrC,UAAA,uBACEuD,KAACsrB,UAAAA,EAAD,EAAA,UAAA,iBACEnrB,IAAC,QAAA,EAAD;YACE,IAAA,EAAK,QAAA;AACL,YAAA,SAAA,EAAW,CAACzD,GAAAA,CAAE,IAAA,EAAMgsC,GAAAA,GAAahsC,GAAAA,CAAE,QAAA,GAAW,IAAI,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;YAC5E,KAAA,EAAO;cAAE,WAAA,EAAamyC,GAAAA,CAAIipB,EAAAA,CAAO14D,GAAI,CAAC,CAAA;cAAG,SAAA,EAAWyvC,GAAAA,CAAIipB,EAAAA,CAAOlpC,GAAE,CAAC;AAAE,aAAA;YACpE,YAAA,EAAY,CAAA,KAAA,EAAQnyB,MAAI,CAAA,CAAA,CAAA;YACxB,cAAA,EAAcisC,GAAAA;YACd,iBAAA,EAAiBjsC,GAAAA;AACjB,YAAA,aAAA,EAAe+7D,GAAkB/7D,GAAC,CAAA;AAClC,YAAA,OAAA,EAASi8D,IAAYj8D,GAAC,CAAA;YAEtB,QAAA,kBAAA0D,IAAC,MAAA,EAAD;AAAM,cAAA,SAAA,EAAWzD,GAAAA,CAAE,WAAA;cAAc,QAAA,EAAAi8D,GAAAA,GAAaC,KAAMn8D,GAAC;aAAQ;AACvD,WAAA,GACPA,GAAAA,GAAIg6D,EAAAA,CAAM,SAAS,CAAA,oBAClBt2D,IAAC,KAAA,EAAD;YACE,IAAA,EAAK,QAAA;YACL,QAAA,EAAU,CAAA;AACV,YAAA,SAAA,EAAWzD,GAAAA,CAAE,IAAA;YACb,KAAA,EAAO,EAAE,SAAA,EAAWmyC,GAAAA,CAAIipB,EAAAA,CAAOrB,EAAAA,CAAMh6D,MAAI,CAAA,CAAA,CAAG,IAAI,CAAC,CAAA,EAAE;YACnD,YAAA,EAAY,CAAA,KAAA,EAAQA,MAAI,CAAA,CAAA,CAAA;YACxB,kBAAA,EAAiB,YAAA;AACjB,YAAA,eAAA,EAAek6D,IAAWF,EAAAA,EAAOh6D,GAAAA,EAAG0sC,GAAAA,EAAKM,GAAG,EAAE,CAAA,CAAA;AAC9C,YAAA,eAAA,EAAektB,IAAWF,EAAAA,EAAOh6D,GAAAA,EAAG0sC,GAAAA,EAAKM,GAAG,EAAE,CAAA,CAAA;YAC9C,eAAA,EAAegtB,EAAAA,CAAMh6D,GAAAA,GAAI,CAAA,CAAA,CAAG,IAAA;YAC5B,iBAAA,EAAiBA,GAAAA;AACjB,YAAA,aAAA,EAAe67D,GAAkB77D,GAAC,CAAA;AAClC,YAAA,SAAA,EAAW87D,GAAc97D,GAAC;WAC3B,CAEK,CAAA,EAAA,EA7BKA,GA6BL,CAAA;QAEd,CAAC;OACE;AACF;;AAET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/SA,SAASm7B,IAASp8B,GAAAA,EAAoE;AAEpF,EAAA,OADI,OAAOijB,GAAAA,IAAS,QAAA,IAAYA,OAAiB,QAAA,IAAYA,GAAAA,GAAaA,IAAK,MAAA,GACxE,IAAA;AACT;AAIA,SAAgBo6C,IAAar9D,GAAAA,EAAqE;AAEhG,EAAA,OADIijB,GAAAA,KAAS,MAAA,GAAkB,IAAA,GACxBmZ,GAAAA,CAASnZ,GAAI,CAAA;AACtB;AAQA,SAAgBq6C,IAAYt9D,GAAAA,EAA2B;AACrD,EAAA,IAAIijB,GAAAA,KAAS,QAAW,OAAO,QAAA;AAC/B,EAAA,IAAI,OAAOA,GAAAA,IAAS,QAAA,EAAU,OAAOA,GAAAA;AACrC,EAAA,IAAM1f,GAAAA,GAAI64B,IAASnZ,GAAI,CAAA;AACvB,EAAA,IAAI1f,KAAG,OAAO,CAAA,aAAA,EAAgBA,GAAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,CAAA;AACzC,EAAA,KAAA,IAAW,CAAC9C,GAAAA,EAAM84D,GAAAA,CAAAA,IAAO,MAAA,CAAO,OAAA,CAAQgE,OAAO,CAAA,EAC7C,IAAIhE,GAAAA,KAAOt2C,GAAAA,EAAM,OAAOxiB,GAAAA;AAE1B,EAAA,OAAO,QAAA;AACT;AAGA,SAAgB+8D,GAAAA,CAAax9D,KAA8Be,GAAAA,EAAyB;AAClF,EAAA,IAAMw4D,GAAAA,GAAKz8B,cAAc7Z,GAAI,CAAA,EACvB3P,MAAU,KAAA,CAAc+B,GAAK,CAAA,EAC7B4E,GAAAA,GAAO5E,GAAAA,GAAQ,CAAA;AACrB,EAAA,KAAA,IAASpU,GAAAA,GAAI,CAAA,EAAGA,GAAAA,GAAIoU,GAAAA,EAAOrV,OAAKwE,GAAAA,CAAIvD,GAAAA,CAAAA,GAAKs4D,GAAAA,CAAoBt4D,MAAIgZ,GAAI,CAAA;AACrE,EAAA,OAAO3G,GAAAA;AACT;AAGA,IAAamqD,GAAAA,GAAe,MAAA,CAAO,IAAA,CAAKF,OAAO,CAAA;AAA/C,ICnCMG,GAAAA,GAAkB,EAAA;ADmCxB,IC/BMC,GAAAA,GAAgF;EACpF,MAAA,EAAQ;AAAC,IAAA,CAAA;AAAG,IAAA,CAAA;AAAG,IAAA,CAAA;AAAG,IAAA;AAAC,GAAA;EACnB,UAAA,EAAY;AAAC,IAAA,IAAA;AAAM,IAAA,CAAA;AAAG,IAAA,GAAA;AAAK,IAAA;AAAC,GAAA;EAC5B,WAAA,EAAa;AAAC,IAAA,GAAA;AAAK,IAAA,CAAA;AAAG,IAAA,IAAA;AAAM,IAAA;AAAC,GAAA;EAC7B,aAAA,EAAe;AAAC,IAAA,IAAA;AAAM,IAAA,CAAA;AAAG,IAAA,IAAA;AAAM,IAAA;AAAC,GAAA;EAChC,WAAA,EAAa;AAAC,IAAA,IAAA;AAAM,IAAA,CAAA;AAAG,IAAA,IAAA;AAAM,IAAA;AAAC,GAAA;EAC9B,YAAA,EAAc;AAAC,IAAA,IAAA;AAAM,IAAA,CAAA;AAAG,IAAA,IAAA;AAAM,IAAA;AAAC,GAAA;EAC/B,cAAA,EAAgB;AAAC,IAAA,IAAA;AAAM,IAAA,CAAA;AAAG,IAAA,IAAA;AAAM,IAAA;AAAC,GAAA;EACjC,UAAA,EAAY;AAAC,IAAA,IAAA;AAAM,IAAA,CAAA;AAAG,IAAA,IAAA;AAAM,IAAA;AAAC,GAAA;EAC7B,WAAA,EAAa;AAAC,IAAA,IAAA;AAAM,IAAA,CAAA;AAAG,IAAA,IAAA;AAAM,IAAA;AAAC,GAAA;EAC9B,aAAA,EAAe;AAAC,IAAA,IAAA;AAAM,IAAA,CAAA;AAAG,IAAA,IAAA;AAAM,IAAA;AAAC;AAClC,CAAA;ADoBA,IClBMC,GAAAA,GAA4D;AAAC,EAAA,IAAA;AAAM,EAAA,GAAA;AAAK,EAAA,IAAA;AAAM,EAAA;AAAC,CAAA;AAOrF,SAAgBC,IAAa79D,GAAAA,EAAwC;AACnE,EAAA,IAAM,EAAE,OAAAe,GAAAA,EAAO,QAAA,EAAA4D,KAAA,GAAaD,GAAAA,EACtB24B,GAAAA,GAASggC,GAAAA,CAAa9pC,GAAK,CAAA,EAC3B7xB,MAAQ47D,GAAAA,CAAY/pC,GAAK,GACzBuqC,GAAAA,GAAQzgC,GAAAA,KAAW,QAASogC,GAAAA,CAA0B,QAAA,CAAS/7D,GAAK,CAAA,EACpEq8D,GAAAA,GAAc1gC,GAAAA,KAAW,OAAkBygC,GAAAA,GAAQp8D,GAAAA,GAAQ,WAA3B,QAAA,EAEhC+I,GAAAA,GAAS+yD,IAAajqC,GAAAA,EAAOmqC,GAAe,CAAA,CAC/C,GAAA,CAAA,CAAK19D,GAAAA,EAAGe,QAAM,CAAA,EAAIE,GAAAA,GAAK,EAAA,GAAwB,GAAA,CAAA,CAAA,EAAO,GAAA,GAAMpB,MAAI,GAAA,CAAA,CAAK,CAAA,CACrE,IAAA,CAAK,GAAG,CAAA;AAEX,EAAA,uBACEkU,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAW7S,GAAAA,CAAE,YAAA;IAAlB,QAAA,EAAA;sBACE6S,IAAAA,CAAC,SAAD,EAAA,QAAA,EAAA,CAAO,QAAA,kBAELA,KAAC,QAAA,EAAD;QACE,KAAA,EAAOgqD,GAAAA;QACP,QAAA,EAAA,CAAW/9D,GAAAA,KAAM0kC,GAAAA,CAAS1kC,GAAAA,CAAE,MAAA,CAAO,UAAU,QAAA,GAAW,MAAA,GAAYA,GAAAA,CAAE,MAAA,CAAO,KAAmB,CAAA;QAFlG,QAAA,EAAA;AAIE,0BAAA+E,IAAC,QAAA,EAAD;YAAQ,KAAA,EAAM,QAAA;YAAS,QAAA,EAAA;WAAc,CAAA;UACpC04D,GAAAA,CAAa,MAAA,CAAA,CAAQz9D,GAAAA,KAAM2E,GAAAA,KAAM,QAAQ,CAAA,CAAE,GAAA,CAAA,CAAK3E,GAAAA,qBAAM+E,GAAAA,CAAC,QAAA,EAAD;YAAgB,KAAA,EAAOJ,GAAAA;YAAI,QAAA,EAAAA;AAAU,WAAA,EAAxBA,GAAwB,CAAC,CAAA;AAC5F04B,UAAAA,GAAAA,KAAW,IAAA,GAAgD,IAAA,mBAAzCt4B,GAAAA,CAAC,QAAA,EAAD;YAAQ,KAAA,EAAM,QAAA;YAAS,QAAA,EAAA;WAAc;AAClD;OACH,CAAA,GAAA,CAAA;MAENs4B,GAAAA,KAAW,IAAA,mBACVt4B,GAAAA,CAAC,QAAA,EAAD;QACE,IAAA,EAAK,QAAA;AACL,QAAA,SAAA,EAAW7D,GAAAA,CAAE,eAAA;QACb,OAAA,EAAA,MAAewjC,IAAS,EAAE,MAAA,EAAQi5B,IAAUI,GAAAA,CAAAA,IAAgBH,KAAgB,CAAA;QAC7E,QAAA,EAAA;OAEO,CAAA,mBAPS74D,GAAAA,CAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAW7D,GAAAA,CAAE,WAAA;QAAc,QAAA,EAAAQ;OAAY,CAAA;AAUhE,sBAAAqD,IAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAW7D,GAAAA,CAAE,aAAA;QAAe,aAAA,EAAY,gBAAA;QAAiB,OAAA,EAAQ,aAAA;QAAc,mBAAA,EAAoB,MAAA;QACtG,QAAA,kBAAA6D,IAAC,UAAA,EAAD;UAAkB,MAAA,EAAA7D,GAAAA;UAAQ,YAAA,EAAa;SAAsB;OAC1D;AACF;;AAET;ACrDA,IAAM88D,EAAAA,GAAc,CAAA;AAEpB,SAAgBC,EAAAA,CAAgBj+D,KAAoBe,GAAAA,EAA4B;AAC9E,EAAA,IAAM2W,GAAAA,GAAOwmD,GAAAA,CAAO,EAAA,GAAKA,GAAAA,CAAO,MAC1BC,GAAAA,GAAQzmD,GAAAA,KAAS,CAAA,GAAI,CAAA,GAAI0mD,MAAU1mD,GAAAA,EACnCsmB,GAAAA,GAAQogC,GAAAA,KAAY,CAAA,GAAI,IAAI1mD,GAAAA,GAAO0mD,GAAAA;AACzC,EAAA,OAAO;IACL,MAAA,EAAAp+D,GAAAA;IACA,OAAA,EAAAe,GAAAA;AACA,IAAA,IAAA,EAAA,CAAOA,GAAAA,KAAAA,CAAQs9D,GAAAA,GAAKH,GAAAA,CAAO,IAAA,IAAQC,GAAAA;AACnC,IAAA,IAAA,EAAA,CAAOp9D,GAAAA,KAAOm9D,GAAAA,CAAO,IAAA,GAAO98C,GAAAA,GAAK4c;AACnC,GAAA;AACF;AAKA,SAAgBoQ,EAAAA,CAAWpuC,KAAoBe,GAAAA,EAAoB;AACjE,EAAA,IAAM2W,GAAAA,GAAOwmD,GAAAA,CAAO,EAAA,GAAKA,GAAAA,CAAO,IAAA;AAChC,EAAA,OAAOxmD,GAAAA,KAAS,CAAA,GAAI,CAAA,GAAA,CAAK2mD,GAAAA,GAAKH,IAAO,IAAA,IAAQxmD,GAAAA;AAC/C;AAGA,SAAgB4mD,EAAAA,CAAUt+D,KAAoBe,GAAAA,EAAoB;AAChE,EAAA,OAAO,CAAA,EAAGqtC,EAAAA,CAAW8vB,GAAAA,EAAQG,GAAE,IAAI,GAAA,CAAA,CAAA,CAAA;AACrC;AAIA,SAAgBE,EAAAA,CAAav+D,KAAoBe,GAAAA,EAAoB;AACnE,EAAA,IAAM2W,GAAAA,GAAOwmD,GAAAA,CAAO,EAAA,GAAKA,GAAAA,CAAO,IAAA;AAChC,EAAA,OAAOxmD,GAAAA,KAAS,CAAA,GAAI,CAAA,GAAI2mD,GAAAA,GAAK3mD,GAAAA;AAC/B;AAGA,SAAgB8mD,EAAAA,CAAYx+D,KAAoBe,GAAAA,EAAoB;AAClE,EAAA,OAAO,CAAA,EAAGw9D,EAAAA,CAAaL,GAAAA,EAAQG,GAAE,IAAI,GAAA,CAAA,CAAA,CAAA;AACvC;AAEA,SAASI,EAAAA,CAAYz+D,KAAee,GAAAA,EAAgC;AAClE,EAAA,IAAM2W,GAAAA,GAAO,IAAA,CAAK,GAAA,CAAIrG,GAAAA,CAAE,EAAA,GAAKA,GAAAA,CAAE,IAAA,EAAMq0C,GAAAA,CAAO,EAAA,GAAKA,GAAAA,CAAO,IAAI,CAAA,EACxD9hD,MAAOyN,GAAAA,CAAE,IAAA;AAGb,EAAA,OAFIzN,GAAAA,GAAO8hD,GAAAA,CAAO,IAAA,KAAMlhD,GAAAA,GAAOkhD,GAAAA,CAAO,IAAA,CAAA,EAClC9hD,GAAAA,GAAO8T,GAAAA,GAAOguC,GAAAA,CAAO,EAAA,KAAIlhD,GAAAA,GAAOkhD,GAAAA,CAAO,KAAKhuC,GAAAA,CAAAA,EACzC;IAAE,IAAA,EAAAlT,GAAAA;AAAM,IAAA,EAAA,EAAIZ,GAAAA,GAAO8T;AAAK,GAAA;AACjC;AAIA,SAAgBgnD,EAAAA,CACd1+D,GAAAA,EAAee,GAAAA,EAAc4D,GAAAA,EAAgBH,GAAAA,EACjC;AACZ,EAAA,IAAMkT,GAAAA,GAAOrG,GAAAA,CAAE,EAAA,GAAKA,GAAAA,CAAE,IAAA,EAChBstD,GAAAA,GAAUjZ,GAAAA,CAAO,EAAA,GAAKA,GAAAA,CAAO,IAAA,EAC7BkZ,GAAAA,GAAW,IAAA,CAAK,GAAA,CAAID,GAAAA,EAAS,IAAA,CAAK,GAAA,CAAIX,EAAAA,EAAatmD,GAAAA,GAAO+uB,GAAM,CAAC,CAAA,EACjEo4B,GAAAA,GAAOnnD,GAAAA,KAAS,CAAA,GAAI,GAAA,GAAA,CAAOonD,GAAAA,GAAOztD,GAAAA,CAAE,IAAA,IAAQqG,GAAAA;AAClD,EAAA,OAAO+mD,EAAAA,CAAY;AAAE,IAAA,IAAA,EAAMK,MAAOD,GAAAA,GAAOD,GAAAA;IAAU,EAAA,EAAIE,GAAAA,GAAAA,CAAQ,IAAID,GAAAA,IAAQD;AAAS,GAAA,EAAGlZ,GAAM,CAAA;AAC/F;AAGA,SAAgBqZ,GAAAA,CAAU/+D,GAAAA,EAAee,GAAAA,EAAc4D,GAAAA,EAAgC;AACrF,EAAA,OAAO85D,EAAAA,CAAY;AAAE,IAAA,IAAA,EAAMptD,IAAE,IAAA,GAAO2tD,GAAAA;AAAM,IAAA,EAAA,EAAI3tD,IAAE,EAAA,GAAK2tD;AAAK,GAAA,EAAGtZ,GAAM,CAAA;AACrE;AAMA,SAAgBuZ,EAAAA,CAAUj/D,GAAAA,EAAee,GAAAA,EAAiB4D,GAAAA,EAAgC;AACxF,EAAA,IAAM+S,GAAAA,GAAOrG,GAAAA,CAAE,EAAA,GAAKA,GAAAA,CAAE,IAAA;AACtB,EAAA,IAAI+sD,GAAAA,IAAW,CAAA,IAAK1mD,GAAAA,IAAQ,CAAA,SAAU,EAAC;AACvC,EAAA,IAAMhN,MAAO0nB,EAAAA,CAAU8sC,GAAAA,GAAed,MAAW1mD,GAAI,CAAA,EAC/CpE,MAAgB,EAAC;AACvB,EAAA,KAAA,IAASvS,GAAAA,GAAI,KAAK,IAAA,CAAKsQ,GAAAA,CAAE,OAAO3G,GAAI,CAAA,GAAIA,GAAAA,EAAM3J,GAAAA,IAAKsQ,GAAAA,CAAE,EAAA,GAAK,MAAMtQ,GAAAA,IAAK2J,GAAAA,EACnE/B,GAAAA,CAAI,IAAA,CAAK,KAAK,KAAA,CAAM5H,GAAAA,GAAI2J,GAAI,CAAA,GAAIA,GAAI,CAAA;AAEtC,EAAA,OAAO4I,GAAAA;AACT;AClFA,IAAM6rD,GAAAA,GAAc,CAAA;AAApB,IAGMC,GAAAA,GAAc,EAAA;AAsBpB,SAASC,IAAWr/D,GAAAA,EAAqD;AACvE,EAAA,IAAM2yB,GAAAA,GAASpB,GAAAA,CAAK,GAAA,CAAA,CAAKvxB,GAAAA,KAAMJ,IAAE,KAAK,CAAA,EAChC4Y,GAAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAGma,GAAM,CAAA,EAEvBjb,GAAAA,GADK,IAAA,CAAK,GAAA,CAAI,GAAGib,GACV,IAAKna,GAAAA,IAAM,CAAA,EAClBu7C,GAAAA,GAAOr8C,GAAAA,GAAOynD,GAAAA,GAAgB,EAAA;AACpC,EAAA,OAAO,CAAC3mD,GAAAA,GAAKu7C,GAAAA,EAAKv7C,GAAAA,GAAKd,MAAOq8C,GAAG,CAAA;AACnC;AAIA,SAAgBuL,IAAUt/D,GAAAA,EAAqC;AAC7D,EAAA,IAAM,EACJ,IAAA,EAAAe,GAAAA,EAAM,KAAA,EAAA4D,KAAO,MAAA,EAAQ46D,GAAAA,EAAK,MAAA,EAAAr+D,GAAAA,EAAQ,SAAA,EAAAjB,GAAAA,EAAW,SAAA,EAAAkB,GAAAA,EAAW,iBAAAC,GAAAA,EACxD,QAAA,EAAAC,GAAAA,EAAU,eAAA,EAAAyD,GAAAA,EAAiB,WAAA,EAAAjD,GAAAA,EAAa,YAAA,EAAAhB,KAAA,GACtC6D,GAAAA,EAEE86D,GAAAA,GAAU91D,MAAAA,CAA8B,IAAI,CAAA,EAC5C,CAAClI,GAAAA,EAAMi+D,GAAAA,IAAWv7D,QAAAA,CAAS;IAAE,KAAA,EAAO,CAAA;IAAG,MAAA,EAAQ;GAAG,CAAA;AACxD,EAAA+B,gBAAA,MAAsB;AACpB,IAAA,IAAMgD,MAAKu2D,GAAAA,CAAQ,OAAA;AACnB,IAAA,IAAI,CAACv2D,GAAAA,EAAI;AACT,IAAA,IAAMI,MAAAA,MAAqB;AACzB,MAAA,IAAM7E,GAAAA,GAAIyE,IAAG,qBAAA,EAAsB;AACnC,MAAApJ,GAAAA,CAAA,CAASG,GAAAA,KAAUkL,GAAAA,CAAK,KAAA,KAAU1G,GAAAA,CAAE,KAAA,IAAS0G,GAAAA,CAAK,MAAA,KAAW1G,GAAAA,CAAE,MAAA,GAAS0G,GAAAA,GAAO;AAAE,QAAA,KAAA,EAAO1G,GAAAA,CAAE,KAAA;AAAO,QAAA,MAAA,EAAQA,GAAAA,CAAE;OAAS,CAAA;AACtH,IAAA,CAAA;AAEA,IAAA,IADA6E,GAAAA,EAAO,EACH,OAAO,cAAA,GAAmB,GAAA,EAAa;AAC3C,IAAA,IAAMC,GAAAA,GAAK,IAAI,cAAA,CAAeD,GAAM,CAAA;AAEpC,IAAA,OADAC,IAAG,OAAA,CAAQL,GAAE,CAAA,EAAA,MACAK,IAAG,UAAA,EAAW;AAC7B,EAAA,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAMs6B,GAAAA,GAAQvV,OAAAA,CAAAA,MAAcoO,EAAAA,CAAoB;IAC9C,EAAA,EAAI,MAAA;IACJ,KAAA,EAAA93B,GAAAA;AACA,IAAA,OAAA,EAAA,CAAU3E,GAAAA,KAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAMe,GAAC,CAAA,CAAA,GAAA,CAAA;AAE/B,IAAA,KAAA,EAAO2+D,GAAAA,CAAU,GAAA,CAAA,CAAK1/D,GAAAA,KAAMe,MAAI2lC,GAAM,CAAA;IACtC,MAAA,EAAQ,CAAC,GAAG,QAAQ,CAAA;IACpB,IAAA,EAAM,EAAE,GAAG04B,GAAAA;AACb,GAAC,CAAA,EAAG;AAAC19D,IAAAA,GAAAA;AAAOg+D,IAAAA,GAAAA;AAAWh5B,IAAAA;GAAO,CAAA,EAExBrL,GAAAA,GAAYhN,OAAAA,CAAAA,OACT;IAAE,IAAA,EAAAttB,GAAAA;IAAM,WAAA,EAAaozD,GAAAA;IAAW,eAAA,EAAA/yD,GAAAA;IAAiB,IAAA,EAAM;GAAK,CAAA,EACnE;AAACmwB,IAAAA,GAAAA;AAAM4iC,IAAAA,GAAAA;AAAWwL,IAAAA;AAAe,GACnC,CAAA,EAGM,CAAC7pC,GAAAA,EAAM8pC,GAAAA,CAAAA,GAAW17D,QAAAA,CAAoC,IAAI,CAAA,EAC1DinB,GAAAA,GAAQ2K,GAAAA,IAAQuF,GAAAA,EAChBwkC,GAAAA,GAAWn2D,OAAOyhB,GAAK,CAAA;AAC7B,EAAAvrB,IAAS,OAAA,GAAUurB,GAAAA;AAEnB,EAAA,IAAMkN,GAAAA,GAAShK,OAAAA,CAAAA,MAAc,CAAC;IAAE,KAAA,EAAAnoB,GAAAA;IAAc,KAAA,EAAAie;GAAkB,CAAA,EAAG,CAACyf,GAAAA,EAAOzY,GAAK,CAAC,CAAA,EAE3EkO,GAAAA,GAAAA,CAAiBr5B,GAAAA,EAAae,GAAAA,KAAuB;AACzD,IAAA,IAAMqK,GAAAA,GAAOqgB,GAAAA,EACPvgB,GAAAA,GAAO20D,GAAAA,CAAS,OAAA;AAGtB,IAAA,IAFIz0D,GAAAA,CAAK,WAAA,KAAgB,IAAA,IAAQA,GAAAA,CAAK,WAAA,KAAgBF,IAAK,WAAA,IAAai2C,GAAAA,CAAS/1C,GAAAA,CAAK,WAAW,CAAA,EAC7FA,GAAAA,CAAK,oBAAoB,IAAA,IAAQA,GAAAA,CAAK,eAAA,KAAoBF,GAAAA,CAAK,eAAA,IAAiB40D,GAAAA,GAAkB10D,IAAK,eAAe,CAAA,EACtH,CAACA,GAAAA,CAAK,IAAA,EAAM;AAAE,MAAA8Y,IAAQ,IAAI,CAAA;AAAG,MAAA;AAAQ,IAAA;AAIzC,IAAA,IAHA07C,IAAQx0D,GAAI,CAAA,EAGRA,GAAAA,CAAK,IAAA,CAAK,SAAS,KAAA,EAAO;AAC9B,IAAA,IAAMy+B,GAAAA,GAAUrN,EAAAA,CAAkBpxB,GAAI,CAAA,CAAE,IAAA;AACpCy+B,IAAAA,GAAAA,KAAYz+B,GAAAA,CAAK,IAAA,IAAM20D,GAAAA,GAAcl2B,GAAO,CAAA;AAClD,EAAA,CAAA,EAEMxP,GAAAA,GAAAA,CAAiBr6B,GAAAA,EAAae,GAAAA,EAAc4D,GAAAA,KAA2B;AAC3E,IAAAuf,IAAQ,IAAI,CAAA;AACZ,IAAA,IAAM9Y,GAAAA,GAAOqgB,GAAAA;AACTrgB,IAAAA,IAAK,IAAA,KAAU40D,GAAAA,CAA+B,IAAA,IAAMC,GAAAA,CAAa70D,IAAK,IAAI,CAAA;AAChF,EAAA,CAAA,EAEM,CAACg2B,GAAAA,EAAKC,GAAAA,IAAOg+B,GAAAA,CAAWl0C,GAAAA,CAAM,IAAI,CAAA,EAClCwxC,GAAAA,GAAQn7D,GAAAA,CAAK,KAAA,GAAQ,IAAIy9D,EAAAA,CAAUM,GAAAA,EAAK/9D,IAAK,KAAA,EAAA,EAAsB,IAAI,EAAC;AAE9E,EAAA,uBACEuD,IAAC,KAAA,EAAD;IAAK,GAAA,EAAKy6D,GAAAA;AAAS,IAAA,SAAA,EAAWt+D,GAAAA,CAAE,SAAA;IAC7B,QAAA,EAAAM,GAAAA,CAAK,QAAQ,CAAA,IAAKA,GAAAA,CAAK,SAAS,CAAA,mBAC/BuD,IAACmzB,EAAAA,EAAD;AACE,MAAA,SAAA,EAAWh3B,GAAAA,CAAE,KAAA;AACb,MAAA,YAAA,EAAY,GAAGQ,GAAAA,CAAAA,MAAAA,CAAAA;MACP,MAAA,EAAAuU,GAAAA;MACO,aAAA,EAAAwB,GAAAA;MACA,aAAA,EAAA7B,GAAAA;AACf,MAAA,KAAA,EAAOpU,GAAAA,CAAK,KAAA;AACZ,MAAA,MAAA,EAAQA,GAAAA,CAAK,MAAA;AACb,MAAA,MAAA,EAAQ,CAAC+9D,GAAAA,CAAI,IAAA,GAAO74B,GAAAA,EAAQ64B,GAAAA,CAAI,KAAK74B,GAAM,CAAA;MAC3C,MAAA,EAAQ,CAACtF,KAAKC,GAAG,CAAA;MACjB,IAAA,EAAM,KAAA;MACN,IAAA,EAAM,KAAA;MAEN,MAAA,EAAQ;AAAE,QAAA,MAAA,EAAQs7B,GAAAA,CAAM,GAAA,CAAA,CAAK38D,GAAAA,KAAMe,MAAI2lC,GAAM,CAAA;QAAG,MAAA,EAAQ;AAAM,OAAA;MAE9D,MAAA,EAAQ;QAAE,MAAA,EAAQ,SAAA;QAAW,GAAA,EAAK;AAAG,OAAA;MACrC,OAAA,EAAS;AACV,KAAA,CAAA,GACC;GACD,CAAA;AAET;AClIA,IAAM04B,GAAAA,GAAc,EAAA;AA2BpB,SAASc,IAAWlgE,GAAAA,EAAwB;AAG1C,EAAA,OAFI0rB,GAAAA,CAAI,IAAA,KAAS,SAAA,GAAmBA,GAAAA,CAAI,KAAA,CAAgC,KAAK,GAAA,CAAA,CAAK1rB,GAAAA,KAAMJ,GAAAA,CAAE,CAAC,CAAA,GACvF8rB,IAAI,IAAA,KAAS,OAAA,GAAiBA,GAAAA,CAAI,KAAA,CAAqB,MAAA,CAAO,GAAA,CAAA,CAAK1rB,GAAAA,KAAMA,GAAAA,CAAE,CAAC,CAAA,GACzE,EAAC;AACV;AAEA,SAAgBmgE,IAAKngE,GAAAA,EAAgC;AACnD,EAAA,IAAM,EACJ,GAAA,EAAAe,GAAAA,EAAK,QAAQw+D,GAAAA,EAAK,IAAA,EAAAt+D,KAAM,SAAA,EAAAwF,GAAAA,EAAW,QAAA,EAAAkC,GAAAA,EAAU,YAAA1I,GAAAA,EAAY,WAAA,EAAAkB,KAAa,QAAA,EAAAE,GAAAA,EAAU,gBAAAyD,GAAAA,EAAgB,QAAA,EAAAjD,GAAAA,EAAU,SAAA,EAAAmc,KAC1G,eAAA,EAAA/X,GAAAA,GAAkB,MAAM,eAAA,EAAA1C,GAAAA,EAAiB,aAAA2C,GAAAA,EAAa,YAAA,EAAA8d,GAAAA,EAAA,GACpDtf,KACE0qC,GAAAA,GAAW1lC,MAAAA,CAA8B,IAAI,CAAA,EAC7CmwB,GAAAA,GAAanwB,OAA8B,IAAI,CAAA;AACrD,EAAA7J,SAAAA,CAAA,MAAA,MAAsB;AAAE,IAAAqkB,GAAAA,CAAW,SAAS,MAAA,EAAO;AAAG,EAAA,CAAA,EAAG,EAAE,CAAA;AAK3D,EAAA,IAAM,CAAC2K,GAAAA,EAAMuxC,GAAAA,IAAWl8D,QAAAA,CAAiD,IAAI,GAEvEmvC,GAAAA,GAAAA,CAAOrzC,GAAAA,KAAuBs+D,EAAAA,CAAUiB,KAAKlB,GAAAA,GAAK3yC,GAAAA,CAAI,MAAM,CAAA,EAE5D20C,GAAAA,GAAAA,CAAQrgE,GAAAA,KAA4B;AACxC,IAAA,IAAM40B,GAAAA,GAAOwa,GAAAA,CAAS,OAAA,EAAS,qBAAA,EAAsB;AAErD,IAAA,OADKxa,GAAAA,GACEqpC,EAAAA,CAAgBsB,GAAAA,EAAK3qC,GAAAA,CAAK,KAAK,CAAA,CAAE,IAAA,CAAK6nC,GAAAA,GAAU7nC,GAAAA,CAAK,IAAI,CAAA,GAAIlJ,GAAAA,CAAI,SADtD6zC,GAAAA,CAAI,IAAA;AAExB,EAAA,CAAA,EAEMe,MAAAA,MAA2B;AAC/B,IAAA,IAAM7rC,GAAAA,GAAQ2a,GAAAA,CAAS,OAAA,EAAS,qBAAA,EAAsB,CAAE,SAAS,CAAA,EAC3DxzB,GAAAA,GAAQqiD,EAAAA,CAAgBsB,GAAAA,EAAK9qC,GAAK,CAAA;AACxC,IAAA,OAAO7Y,IAAM,IAAA,CAAA,CAAmB,CAAA,GAAIA,GAAAA,CAAM,KAAK,CAAC,CAAA;AAClD,EAAA,CAAA,EAGM2kD,MAAQznD,GAAAA,KAAS,OAAA,IAAW4S,IAAI,OAAA,EAChC80C,GAAAA,GAAc90C,IAAI,IAAA,KAAS,SAAA,GAAaA,GAAAA,CAAI,KAAA,CAA+B,OAAO,EAAC,EAEnF+0C,KAAAA,CAAoBzgE,GAAAA,KAAA,CAAe2E,GAAAA,KAA+C;AACtF,IAAA,IAAI3E,GAAAA,CAAE,WAAW,CAAA,EAAG;AACpBA,IAAAA,GAAAA,CAAE,eAAA,EAAgB,EAClBmhD,GAAAA,CAASlgD,GAAC,CAAA;AAIV,IAAA,IAAMyrB,GAAAA,GAAAA,CAAM1sB,GAAAA,KAAqD;AAC/D,MAAA,IAAMyrB,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG40C,GAAAA,CAAKj0C,GAAAA,CAAG,OAAO,CAAC,CAAA;AACxC,MAAA,OAAOA,GAAAA,CAAG,MAAA,GAASX,GAAAA,GAAMkL,GAAAA,CAAclL,GAAAA,GAAMC,GAAAA,CAAI,MAAA,EAAQg0C,GAAAA,EAAWY,GAAAA,EAAY,CAAA,GAAI50C,GAAAA,CAAI,MAAA;AAC1F,IAAA,CAAA;AAEA,IAAA9rB,GAAAA,CAAQ;MAAE,QAAA,EAAUqB,GAAAA;AAAG,MAAA,CAAA,EAAGy/D,GAAMz/D,GAAAA;KAAI,CAAA;AAEpC,IAAA,IAAMmR,MAAAA,MAAkB;AACtBguD,MAAAA,GAAAA,CAAQ,IAAI,CAAA,EACZl8C,GAAAA,CAAW,OAAA,GAAU,IAAA;AACvB,IAAA,CAAA;AAEA2V,IAAAA,GAAAA,CAAW,SAAS,MAAA,EAAO,EAC3B3V,IAAW,OAAA,GAAU0W,kBAAAA,CAAmB56B,GAAAA,CAAE,aAAA,EAAeA,GAAAA,EAAG;AAC1D,MAAA,MAAA,EAAA,CAASe,GAAAA,KAAO;AACdq/D,QAAAA,GAAAA,CAAQ;UAAE,QAAA,EAAUn/D,GAAAA;AAAG,UAAA,CAAA,EAAGyrB,IAAGN,GAAE;AAAE,SAAC,CAAA,EAClCu0C,GAAAA,CAAW1/D,GAAAA,EAAGyrB,GAAAA,CAAGN,GAAE,CAAC,CAAA;AACtB,MAAA,CAAA;AACA,MAAA,KAAA,EAAA,CAAQrrB,GAAAA,KAAO;AACb6/D,QAAAA,IAAY3/D,GAAAA,EAAGyrB,GAAAA,CAAGN,GAAE,CAAC,GACrBha,GAAAA,EAAI;AACN,MAAA,CAAA;MACA,QAAA,EAAUA;KACZ,EAAG,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;AACvB,EAAA,CAAA,EAEMisB,EAAAA,GAAAA,CAAar+B,GAAAA,EAAWe,GAAAA,KAAA,CAAe4D,GAAAA,KAAgD;AAC3F,IAAA,IAAM+F,GAAAA,GAAO00D,GAAAA,IAAep/D,GAAAA,CAAE,QAAA,GAAW,EAAA,GAAK,CAAA,CAAA;AAC1CA,IAAAA,GAAAA,CAAE,GAAA,KAAQ,YAAA,KAAgBA,GAAAA,CAAE,cAAA,IAAkB4gE,GAAAA,CAAY3/D,GAAAA,EAAGF,GAAAA,GAAI2J,GAAI,CAAA,CAAA,EACrE1K,GAAAA,CAAE,QAAQ,WAAA,KAAeA,GAAAA,CAAE,cAAA,EAAe,EAAG4gE,GAAAA,CAAY3/D,GAAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAGF,GAAAA,GAAI2J,GAAI,CAAC,CAAA,CAAA;EACvF,CAAA,EAEMg2D,EAAAA,GAAQR,IAAWx0C,GAAG,CAAA;AAE5B,EAAA,uBACE3X,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAW7S,GAAAA,CAAE,IAAA;AAAM,IAAA,YAAA,EAAYwqB,GAAAA,CAAI,KAAA;IAAO,WAAA,EAAW5S,GAAAA;AAAM,IAAA,YAAA,EAAYynD,MAAQ,MAAA,GAAS,MAAA;IAA7F,QAAA,EAAA,iBACExsD,IAAAA,CAAC,KAAA,EAAD;AAAK,MAAA,SAAA,EAAW7S,GAAAA,CAAE,SAAA;AAAlB,MAAA,QAAA,EAAA,CACGwqB,GAAAA,CAAI,IAAA,KAAS,UAAA,mBACZ3mB,IAAC,MAAA,EAAD;QACE,IAAA,EAAK,QAAA;QACL,QAAA,EAAU,CAAA;QACV,eAAA,EAAegpB,GAAAA;QACf,aAAA,EAAY,qBAAA;AACZ,QAAA,SAAA,EAAW7sB,GAAAA,CAAE,UAAA;QACb,OAAA,EAAS2/D,GAAAA;AACT,QAAA,SAAA,EAAA,CAAY7gE,GAAAA,KAAM;AAAE,UAAA,CAAIA,GAAAA,CAAE,QAAQ,OAAA,IAAWA,GAAAA,CAAE,QAAQ,GAAA,MAAOA,GAAAA,CAAE,cAAA,EAAe,EAAG6gE,GAAAA,EAAe,CAAA;AAAK,QAAA,CAAA;AAEtG,QAAA,QAAA,kBAAA97D,GAAAA,CAAC+nB,GAAAA,EAAD,EAAgB,IAAA,EAAMiB,KAAW;OAC7B,CAAA,GACJ,IAAA,EACHrC,GAAAA,CAAI,KACF;KACL,CAAA,kBAAA3mB,GAAAA,CAAC,KAAA,EAAD;AACE,MAAA,SAAA,EAAW7D,GAAAA,CAAE,SAAA;MACb,GAAA,EAAKkuC,GAAAA;MACL,aAAA,EAAY,qBAAA;AACZ,MAAA,aAAA,EAAA,CAAgBpvC,GAAAA,KAAM;AAAM0rB,QAAAA,GAAAA,CAAI,IAAA,KAAS,SAAA,IAAWo1C,GAAAA,CAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGT,GAAAA,CAAKrgE,GAAAA,CAAE,OAAO,CAAC,CAAC,CAAA;AAAG,MAAA,CAAA;MAE3F,QAAA,EAAAugE,GAAAA,mBACCx7D,GAAAA,CAACu6D,GAAAA,EAAD;QACE,IAAA,EAAMkB,GAAAA;AACN,QAAA,KAAA,EAAO90C,GAAAA,CAAI,KAAA;QACX,MAAA,EAAQ6zC,GAAAA;AACR,QAAA,MAAA,EAAQ7zC,GAAAA,CAAI,MAAA;QACD,SAAA,EAAA1N,GAAAA;QACA,SAAA,EAAAvX,GAAAA;QACM,eAAA,EAAAR,GAAAA;QACP,QAAA,EAAA0C,GAAAA;QACO,eAAA,EAAApF,GAAAA;QACJ,WAAA,EAAA2C,GAAAA;QACb,YAAA,EAAA,CAAelG,GAAAA,KAASigE,GAAAA,GAAe1uC,GAAI;AAC5C,OAAA,CAAA,mBAEDxd,IAAAA,CAAA9O,QAAAA,EAAA,EAAA,QAAA,EAAA;AACGymB,QAAAA,GAAAA,CAAI,IAAA,KAAS,UAAA,mBACZ3mB,GAAAA,CAAC,KAAA,EAAD;AACE,UAAA,SAAA,EAAW7D,GAAAA,CAAE,SAAA;UACb,aAAA,EAAY,iBAAA;UACZ,KAAA,EAAO;AAAE,YAAA,IAAA,EAAMmyC,IAAI,CAAC,CAAA;AAAG,YAAA,KAAA,EAAOmrB,GAAYe,GAAAA,EAAM7zC,GAAAA,CAAI,KAAA,CAAwB,QAAA,CAAS,YAAY,CAAC;AAAE;AACrG,SAAA,CAAA,GACC,IAAA;QACHA,GAAAA,CAAI,IAAA,KAAS,YAAY80C,GAAAA,CAAY,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA,CAAA,CAAKxgE,GAAAA,EAAG2E,GAAAA,KAAQ;AAC7D,UAAA,IAAM1D,MAAI6jC,GAAAA,GAAM,CAAA;AAChB,UAAA,uBACE//B,IAAC,KAAA,EAAD;YAEE,IAAA,EAAK,QAAA;YACL,QAAA,EAAU,CAAA;YACV,YAAA,EAAY,CAAA,EAAG2mB,IAAI,KAAA,CAAA,cAAA,EAAsB,KAAK,KAAA,CAAM9rB,GAAAA,CAAE,CAAC,CAAA,CAAA,GAAA,CAAA;YACvD,cAAA,EAAc+/D,GAAAA,KAAoB1+D,MAAI,MAAA,GAAS,MAAA;YAC/C,aAAA,EAAY,kBAAA;AACZ,YAAA,SAAA,EAAWC,GAAAA,CAAE,OAAA;YACb,KAAA,EAAO;AAAE,cAAA,IAAA,EAAMmyC,GAAAA,CAAImtB,GAAAA,CAAYv/D,GAAAA,GAAI,CAAA,EAAG,CAAC,CAAA;cAAG,KAAA,EAAOu9D,EAAAA,CAAYe,KAAK3/D,GAAAA,CAAE,CAAA,GAAI4gE,IAAYv/D,GAAAA,GAAI,CAAA,EAAG,CAAC;AAAE,aAAA;YAC9F,OAAA,EAAA,MAAe6+D,MAAkB7+D,GAAC,CAAA;AAClC,YAAA,SAAA,EAAA,CAAYjB,GAAAA,KAAM;AAAE,cAAA,CAAIA,GAAAA,CAAE,GAAA,KAAQ,OAAA,IAAWA,GAAAA,CAAE,GAAA,KAAQ,SAAOA,GAAAA,CAAE,cAAA,EAAe,EAAG8/D,GAAAA,GAAkB7+D,GAAC,CAAA,CAAA;AAAK,YAAA;WAC3G,EAVM,CAAA,IAAA,EAAOA,GAAA,CAAA,CAUb,CAAA;AAEL,QAAA,CAAC,CAAA,GAAI,IAAA;AACJy/D,QAAAA,EAAAA,CAAM,IAAA,CAAK1gE,GAAAA,EAAG2E,GAAAA,qBACbI,IAAC,KAAA,EAAD;UAEE,IAAA,EAAK,QAAA;UACL,QAAA,EAAU,CAAA;AACV,UAAA,YAAA,EAAY,GAAG2mB,GAAAA,CAAI,KAAA,WAAgB,IAAA,CAAK,KAAA,CAAM3qB,GAAC,CAAA,CAAA,GAAA,CAAA;UAC/C,cAAA,EAAcozD,GAAAA,KAAclzD,MAAI,MAAA,GAAS,MAAA;UACzC,aAAA,EAAayqB,GAAAA,CAAI,IAAA,KAAS,OAAA,GAAU,gBAAA,GAAmB,cAAA;UACvD,eAAA,EAAemD,GAAAA,EAAM,QAAA,KAAa5tB,GAAAA,GAAI,MAAA,GAAS,MAAA;AAC/C,UAAA,SAAA,EAAWyqB,GAAAA,CAAI,IAAA,KAAS,OAAA,GAAUxqB,GAAAA,CAAE,YAAYA,GAAAA,CAAE,GAAA;AAClD,UAAA,KAAA,EAAO,EAAE,IAAA,EAAMmyC,GAAAA,CAAItyC,GAAC,CAAA,EAAE;AACtB,UAAA,aAAA,EAAe0/D,GAAiBx/D,GAAC,CAAA;UACjC,SAAA,EAAWo9B,EAAAA,CAAUp9B,KAAGF,GAAC;AAC1B,SAAA,EAXME,GAWN,CACF,CAAA;QACA4tB,GAAAA,mBACC9pB,IAAC,KAAA,EAAD;UACE,aAAA,EAAY,MAAA;UACZ,aAAA,EAAY,oBAAA;AACZ,UAAA,SAAA,EAAW2mB,GAAAA,CAAI,IAAA,KAAS,OAAA,GAAUxqB,GAAAA,CAAE,aAAaA,GAAAA,CAAE,QAAA;AACnD,UAAA,KAAA,EAAO,EAAE,IAAA,EAAMmyC,GAAAA,CAAIxkB,GAAAA,CAAK,CAAC,CAAA;AAC1B,SAAA,CAAA,GACC;AACJ,OAAA,EAAA;AAED,KAAA,CACF;;AAET;AC1MA,IAAMkyC,GAAAA,GAAY,KAAA;AAWlB,SAASC,IAAShhE,GAAAA,EAAoB;AAEpC,EAAA,OADIq+D,OAAM,GAAA,GAAa,CAAA,EAAA,CAAIA,GAAAA,GAAK,GAAA,EAAM,QAAQA,GAAAA,GAAK,GAAA,IAAS,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,CAAA,CAAA,CAAA,GAC9D,GAAG,IAAA,CAAK,KAAA,CAAMA,GAAE,CAAA,CAAA,EAAA,CAAA;AACzB;AAEA,SAAgB4C,IAAMjhE,GAAAA,EAAiC;AACrD,EAAA,IAAM,EAAE,MAAA,EAAQu/D,GAAAA,EAAK,QAAA56D,GAAAA,EAAQ,QAAA,EAAAH,KAAU,OAAA,EAAAvD,GAAAA,EAAS,gBAAAwF,GAAAA,EAAA,GAAmB/B,KAC7D0qC,GAAAA,GAAW1lC,MAAAA,CAA8B,IAAI,CAAA,EAC7CmwB,GAAAA,GAAanwB,OAA8B,IAAI,CAAA;AACrD,EAAA7J,SAAAA,CAAA,MAAA,MAAsB;AAAE,IAAAqB,GAAAA,CAAW,SAAS,MAAA,EAAO;AAAG,EAAA,CAAA,EAAG,EAAE,CAAA;AAI3D,EAAA,IAAM,CAACuzB,GAAAA,EAAOysC,GAAAA,CAAAA,GAAYh9D,SAAS,CAAC,CAAA;AACpC,EAAA+B,gBAAA,MAAsB;AACpB,IAAA,IAAMgD,MAAKmmC,GAAAA,CAAS,OAAA;AACpB,IAAA,IAAI,CAACnmC,GAAAA,EAAI;AACT,IAAA,IAAMI,MAAAA,MAAqB63D,GAAAA,CAASj4D,GAAAA,CAAG,qBAAA,GAAwB,KAAK,CAAA;AAEpE,IAAA,IADAI,GAAAA,EAAO,EACH,OAAO,cAAA,GAAmB,GAAA,EAAa;AAC3C,IAAA,IAAMC,GAAAA,GAAK,IAAI,cAAA,CAAeD,GAAM,CAAA;AAEpC,IAAA,OADAC,IAAG,OAAA,CAAQL,GAAE,CAAA,EAAA,MACAK,IAAG,UAAA,EAAW;AAC7B,EAAA,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,IAAM63D,GAAAA,GAAAA,MAAwB/xB,GAAAA,CAAS,OAAA,EAAS,qBAAA,GAAwB,KAAA,IAAS,CAAA,EAC3EixB,GAAAA,GAAAA,CAAQrgE,GAAAA,KAA4B;AACxC,IAAA,IAAM40B,GAAAA,GAAOwa,GAAAA,CAAS,OAAA,EAAS,qBAAA,EAAsB;AACrD,IAAA,IAAI,CAACxa,GAAAA,EAAM,OAAO2qC,GAAAA,CAAI,IAAA;AAEtB,IAAA,IAAM9zC,GAAAA,GADQwyC,GAAgBsB,GAAAA,EAAK3qC,GAAAA,CAAK,KAC5B,CAAA,CAAM,IAAA,CAAK6nC,GAAAA,GAAU7nC,GAAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,OAAO,IAAA,CAAK,IAAI2qC,GAAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAIA,GAAAA,CAAI,IAAA,EAAM9zC,GAAG,CAAC,CAAA;EACjD,CAAA,EAKMuJ,GAAAA,GAAAA,CAAiBh1B,GAAAA,KAA+C;AACpE,IAAA,IAAIA,GAAAA,CAAE,WAAW,CAAA,EAAG;AACpB8zD,IAAAA,GAAAA,CAAQuM,IAAKrgE,GAAAA,CAAE,OAAO,CAAC,CAAA,EAEvB65B,GAAAA,CAAW,SAAS,MAAA,EAAO;AAC3B,IAAA,IAAMznB,MAAAA,MAAkB;AAAE,MAAAlR,IAAW,OAAA,GAAU,IAAA;AAAM,IAAA,CAAA;AACrD,IAAAA,GAAAA,CAAW,OAAA,GAAU05B,kBAAAA,CAAmB56B,GAAAA,CAAE,eAAeA,GAAAA,EAAG;AAC1D,MAAA,MAAA,EAAA,CAASA,GAAAA,KAAO;AAAE,QAAAiB,GAAAA,CAAQo/D,GAAAA,CAAKj0C,GAAAA,CAAG,OAAO,CAAC,CAAA;AAAG,MAAA,CAAA;MAC7C,KAAA,EAAOha,GAAAA;MACP,QAAA,EAAUA;KACZ,EAAG,EAAE,OAAA,EAAS,KAAA,EAAO,CAAA;EACvB,CAAA,EAEMgvD,GAAAA,GAAAA,CAAWphE,GAAAA,KAA6C;AAC5D,IAAA,IAAIA,IAAE,OAAA,EACJyG,GAAAA,CAAei4D,EAAAA,CAAWa,KAAKc,GAAAA,CAAKrgE,GAAAA,CAAE,OAAO,CAAA,EAAG,KAAK,GAAA,CAAIA,GAAAA,CAAE,SAAS+gE,GAAS,CAAA,EAAGrb,GAAM,CAAC,CAAA;AAClF,SAAA;AACL,MAAA,IAAMjxB,GAAAA,GAAQ0sC,GAAAA,EAAQ,EAChBnjC,GAAAA,GAAQvJ,GAAAA,KAAU,IAAI,CAAA,GAAA,CAAK8qC,GAAAA,CAAI,EAAA,GAAKA,GAAAA,CAAI,IAAA,IAAQ9qC,GAAAA;AACtD,MAAAhuB,IAAes4D,GAAAA,CAAUQ,GAAAA,EAAKv/D,IAAE,MAAA,GAASg+B,GAAAA,EAAO0nB,GAAM,CAAC,CAAA;AACzD,IAAA;EACF,CAAA,EAEMiX,GAAAA,GAAQsC,EAAAA,CAAUM,GAAAA,EAAK9qC,GAAAA,EAAA,EAAsB,CAAA,EAC7C4e,GAAAA,GAAAA,CAAOrzC,GAAAA,KAAuBs+D,EAAAA,CAAUiB,GAAAA,EAAKlB,GAAE,CAAA;AAErD,EAAA,uBACEtqD,KAAC,KAAA,EAAD;AACE,IAAA,SAAA,EAAW7S,GAAAA,CAAE,KAAA;IACb,GAAA,EAAKkuC,GAAAA;IACL,aAAA,EAAY,gBAAA;IACG,aAAA,EAAAvtC,GAAAA;IACN,OAAA,EAAAhB,GAAAA;AALX,IAAA,QAAA,EAAA,CAOG87D,GAAAA,CAAM,GAAA,CAAA,CAAK38D,GAAAA,qBACV+E,IAAC,MAAA,EAAD;AAEE,MAAA,SAAA,EAAW7D,GAAAA,CAAE,IAAA;MACb,aAAA,EAAY,eAAA;AACZ,MAAA,KAAA,EAAO,EAAE,IAAA,EAAMmyC,GAAAA,CAAItyC,GAAC,CAAA,EAAE;AAErB,MAAA,QAAA,EAAAigE,IAASjgE,GAAC;AACP,KAAA,EANCA,GAMD,CACP,CAAA,kBACDgE,IAAC,KAAA,EAAD;AACE,MAAA,SAAA,EAAW7D,GAAAA,CAAE,QAAA;MACb,aAAA,EAAY,mBAAA;AACZ,MAAA,KAAA,EAAO,EAAE,IAAA,EAAMmyC,GAAAA,CAAIguB,GAAQ,CAAA;AAC5B,KAAA,CACE;;AAET;ACnGA,IAAMC,EAAAA,GAAQ;AAAC,EAAA,IAAA;AAAM,EAAA,GAAA;AAAK,EAAA,CAAA;AAAG,EAAA,CAAA;AAAG,EAAA;AAAC,CAAA;AAAjC,IAcMC,EAAAA,GAAAA,CAAWvhE,GAAAA,KAAuB,CAAA,EAAA,CAAIq+D,MAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAA,CAAA,CAAA,CAAA;AAEhE,SAAgBmD,GAAU78D,GAAAA,EAAqC;AAC7D,EAAA,IAAM,EAAE,MAAA,EAAAH,GAAAA,EAAQ,MAAAvD,GAAAA,EAAM,IAAA,EAAAwF,KAAM,QAAA,EAAAkC,GAAAA,EAAU,UAAAzH,GAAAA,EAAU,MAAA,EAAAC,KAAQ,OAAA,EAAAC,GAAAA,EAAS,cAAAC,GAAAA,EAAc,YAAA,EAAAyD,KAAA,GAAiBJ,GAAAA,EAC1F+8D,GAAAA,GAAUC,GAAAA,KAAS,SAASA,GAAAA,KAAS,CAAA,EAIrCC,MAAQL,EAAAA,CAAM,QAAA,CAASM,GAA4B,CAAA,GACpDN,EAAAA,GACD,CAAC,GAAGA,EAAAA,EAAOM,GAAI,CAAA,CAAE,IAAA,CAAA,CAAM5hE,GAAAA,EAAGe,GAAAA,KAAM0F,MAAIlD,GAAC,CAAA;AAEzC,EAAA,uBACEwQ,KAAC,KAAA,EAAD;AAAK,IAAA,SAAA,EAAW7S,GAAAA,CAAE,SAAA;IAAlB,QAAA,EAAA;AACE,sBAAA6D,IAAC,QAAA,EAAD;QACE,IAAA,EAAK,QAAA;AACL,QAAA,SAAA,EAAW7D,GAAAA,CAAE,eAAA;AACb,QAAA,YAAA,EAAY2gE,MAAS,MAAA,GAAS,OAAA;AAC9B,QAAA,OAAA,EAASA,MAASjO,GAAAA,GAASkO,GAAAA;AAE1B,QAAA,QAAA,EAASjO,IAATgO,GAAAA,GAAUp/D,EAAAA,GAAyBC,IAA1B,EAAU,IAAA,EAAM,IAA+B;OACnD,CAAA;AAER,sBAAAqC,IAAC,QAAA,EAAD;QACE,IAAA,EAAK,QAAA;QACL,IAAA,EAAK,QAAA;QACL,cAAA,EAAc08D,GAAAA;QACd,YAAA,EAAW,MAAA;AACX,QAAA,SAAA,EAAWvgE,GAAAA,CAAE,eAAA;QACb,OAAA,EAAA,MAAe6gE,GAAAA,CAAa,CAACN,GAAO,CAAA;QACrC,QAAA,EAAA;OAEO,CAAA;AAER,sBAAA1tD,KAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAW7S,GAAAA,CAAE,IAAA;QAAlB,QAAA,EAAA;AAAwB,UAAA,MAAA;AAEtB,0BAAA6D,IAAC0zD,GAAAA,EAAD;YACE,SAAA,EAAU,MAAA;YACV,KAAA,EAAOkJ,GAAAA;YACP,KAAA,EAAOC,GAAAA;YACP,QAAA,EAAUI,GAAAA;YACV,WAAA,EAAA,CAAchiE,GAAAA,KAAM,CAAA,EAAGwE,GAAAA,CAAAA,CAAAA,CAAAA;YACvB,MAAA,EAAO,MAAA;AACP,YAAA,SAAA,EAAWtD,GAAAA,CAAE;WACd,CAAA;AACD,0BAAA6S,KAAC,MAAA,EAAD;AAAM,YAAA,SAAA,EAAW7S,GAAAA,CAAE,WAAA;YAAnB,QAAA,EAAA,CAAiC0gE,KAAK,GAAO;;AAC1C;;AAEL,sBAAA7tD,KAAC,MAAA,EAAD;AAAM,QAAA,SAAA,EAAW7S,GAAAA,CAAE,IAAA;QAAM,aAAA,EAAY,eAAA;QAArC,QAAA,EAAA;AACGqgE,UAAAA,EAAAA,CAAQF,GAAQ,CAAA;AAAE,UAAA,KAAA;AAAIE,UAAAA,EAAAA,CAAQU,GAAQ;AACnC;;AACH;;AAET;ACrDA,SAASC,IAAUliE,GAAAA,EAAuB;AACxC,EAAA,IAAI6vC,GAAAA,CAAM,IAAA,KAAS,SAAA,EAAW,OAAO,KAAA;AACrC,EAAA,IAAMte,MAAQse,GAAAA,CAAgC,IAAA;AAC9C,EAAA,OAAOte,GAAAA,CAAK,MAAA,GAAS,CAAA,IAAKA,GAAAA,CAAK,KAAA,CAAA,CAAOvxB,GAAAA,KAAM,OAAOJ,GAAAA,CAAE,KAAA,IAAU,QAAQ,CAAA;AACzE;AAIA,SAAgBuiE,GAAAA,CACdniE,KACAe,GAAAA,EACW;AACX,EAAA,IAAMuS,GAAAA,GAAiB,EAAC,EAClBkuC,GAAAA,GAAAA,CAAQxhD,GAAAA,EAAwBiB,GAAAA,EAAgBwF,KAAekC,GAAAA,KAAyB;AAC5F,IAAA3I,GAAAA,CAAK,OAAA,CAAA,CAASA,GAAAA,EAAOkB,GAAAA,KAAM;AACzB,MAAA,IAAMkhE,GAAAA,GAAW,CAAC,GAAG9kC,GAAAA,EAAMr8B,GAAC,CAAA,EACtB4wB,GAAAA,GAAMuwC,GAAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAC7B9uD,MAAAA,IAAI,IAAA,CAAK;QACP,GAAA,EAAAnS,GAAAA;QACA,IAAA,EAAMihE,GAAAA;QACN,KAAA,EAAApiE,GAAAA;AACA,QAAA,KAAA,EAAO6vC,IAAM,KAAA,IAAS,CAAA,EAAGA,GAAAA,CAAM,IAAA,IAAQ5uC,GAAAA,CAAAA,CAAAA;QACvC,KAAA,EAAAwF,GAAAA;QACA,MAAA,EAAAkC,GAAAA;AACA,QAAA,IAAA,EAAMknC,GAAAA,CAAM,IAAA;AACZ,QAAA,OAAA,EAASqyB,IAAUryB,GAAK;AAC1B,OAAC,GACGA,GAAAA,CAAM,IAAA,KAAS,UAAA,IAAc9hB,GAAAA,CAAS,IAAI8D,GAAG,CAAA,IAC/C2vB,GAAAA,CAAK3R,GAAAA,CAAM,SAAS,MAAA,EAAQuyB,GAAAA,EAAUj0D,MAAQ,CAAA,EAAGu4B,GAAAA,GAASmJ,IAAM,EAAE,CAAA;IAEtE,CAAC,CAAA;AACH,EAAA,CAAA;AAEA,EAAA,OADA2R,IAAK6gB,GAAAA,EAAQ,EAAC,EAAG,CAAA,EAAG,CAAC,CAAA,EACd/uD,GAAAA;AACT;AAGA,SAAgBgvD,EAAAA,CAAYtiE,KAA0Be,GAAAA,EAA4C;AAChG,EAAA,IAAIi1B,MAAyBqsC,GAAAA,EACzBE,GAAAA;AACJ,EAAA,KAAA,IAAWthE,OAAKq8B,GAAAA,EAAM;AAEpB,IAAA,IADA94B,GAAAA,GAAQwxB,GAAAA,CAAK/0B,GAAAA,CAAAA,EACT,CAACshE,GAAAA,EAAO;AACZ,IAAA59D,MAAO49D,GAAAA,CAAM,IAAA,KAAS,aAAaA,GAAAA,CAAM,QAAA,CAAS,SAAS,EAAC;AAC9D,EAAA;AACA,EAAA,OAAOA,GAAAA;AACT;ACjDA,SAAgBC,EAAAA,CAASxiE,KAAsBe,GAAAA,EAA+B;AAC5E,EAAA,OAAO0F,GAAAA,CAAE,MAAA,KAAWlD,GAAAA,CAAE,MAAA,IAAUkD,GAAAA,CAAE,KAAA,CAAA,CAAOzG,GAAAA,EAAG2E,GAAAA,KAAMA,GAAAA,KAAMpB,GAAAA,CAAEtC,GAAAA,CAAE,CAAA;AAC9D;AAKA,SAASwhE,EAAAA,CAASziE,KAAce,GAAAA,EAAkC;AAChE,EAAA,OAAO;IAAE,GAAI8uC,GAAAA;IAAiC,IAAA,EAAA9uC;AAAK,GAAA;AACrD;AAEA,SAAS2hE,GAAAA,CAAW1iE,KAAce,GAAAA,EAAqC;AACrE,EAAA,OAAO;IAAE,GAAI8uC,GAAAA;IAAsB,MAAA,EAAA9uC;AAAO,GAAA;AAC5C;AAIA,SAAS4hE,EAAAA,CAAc3iE,GAAAA,EAA0Be,GAAAA,EAAyB4D,GAAAA,EAAsB;AAC9F,EAAA,IAAM2O,GAAAA,GAAM+uD,IAAO,KAAA,EAAM,EACnB,CAACphE,GAAAA,EAAG,GAAGwD,GAAAA,CAAAA,GAAQ64B,GAAAA;AACrB,EAAA,IAAI74B,IAAK,MAAA,KAAW,CAAA,SAClBD,GAAAA,CAAIvD,GAAA,IAAKmK,GAAAA,EACFkI,GAAAA;AAET,EAAA,IAAMsvD,GAAAA,GAAStvD,IAAIrS,GAAA,CAAA;AACnB,EAAA,IAAI2hE,GAAAA,EAAQ,IAAA,KAAS,UAAA,EAAY,OAAOtvD,GAAAA;AACxC,EAAA,IAAMuvD,GAAAA,GAAKD,GAAAA;AAKX,EAAA,OAJAp+D,GAAAA,CAAIvD,GAAA,CAAA,GAAK;IACP,GAAG4hE,GAAAA;IACH,QAAA,EAAU;AAAE,MAAA,GAAGA,GAAAA,CAAG,QAAA;AAAU,MAAA,MAAA,EAAQF,EAAAA,CAAcE,GAAAA,CAAG,QAAA,CAAS,MAAA,EAAQp+D,KAAM2G,GAAI;AAAE;GACpF,EACOkI,GAAAA;AACT;AASA,SAAgBwvD,EAAAA,CACd9iE,GAAAA,EAA0Be,GAAAA,EAAmB4D,GAAAA,EACpC;AACT,EAAA,IAAMkrC,GAAAA,GAAQyyB,EAAAA,CAAYD,GAAAA,EAAQ92C,GAAAA,CAAI,SAAS,GACzCxqB,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGgiE,GAAI,CAAA;AAE1B,EAAA,IAAIlzB,GAAAA,EAAO,SAAS,SAAA,EAAW;AAC7B,IAAA,IAAMmzB,GAAAA,GAAKnzB,KACLvT,GAAAA,GAAQ;MAAE,GAAG0mC,GAAAA,CAAG,IAAA,CAAKz3C,GAAAA,CAAI,QAAA,CAAA;MAAW,CAAA,EAAAtqB;KAAE,EACtCswB,GAAAA,GAAOyxC,GAAAA,CAAG,IAAA,CAAK,MAAA,CAAA,CAAQhjE,KAAG2E,GAAAA,KAAM1D,GAAAA,KAAMsqB,GAAAA,CAAI,QAAQ,CAAA,EAClDmB,GAAAA,GAAK6E,IAAK,SAAA,CAAA,CAAWvxB,GAAAA,KAAMJ,GAAAA,CAAE,CAAA,GAAImB,GAAC,GAClCkiE,GAAAA,GAAWv2C,GAAAA,KAAO,EAAA,GAAK6E,GAAAA,CAAK,MAAA,GAAS7E,GAAAA;AAE3C,IAAA,OADA6E,GAAAA,CAAK,MAAA,CAAO0xC,GAAAA,EAAU,CAAA,EAAG3mC,GAAK,CAAA,EACvB;AACL,MAAA,MAAA,EAAQqmC,GAAcN,GAAAA,EAAQ92C,GAAAA,CAAI,WAAWk3C,EAAAA,CAAS5yB,GAAAA,EAAOte,GAAI,CAAC,CAAA;MAClE,SAAA,EAAW;AAAE,QAAA,SAAA,EAAWhG,GAAAA,CAAI,SAAA;QAAW,QAAA,EAAAtrB;AAAS;AAClD,KAAA;AACF,EAAA;AAEA,EAAA,IAAI4vC,GAAAA,EAAO,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAMqzB,GAAAA,GAAKrzB,KACLvT,GAAAA,GAAQ;MAAE,GAAG4mC,GAAAA,CAAG,MAAA,CAAO33C,GAAAA,CAAI,QAAA,CAAA;MAAW,CAAA,EAAAtqB;KAAE,EACxCkiE,GAAAA,GAASD,GAAAA,CAAG,MAAA,CAAO,MAAA,CAAA,CAAQljE,KAAG2E,GAAAA,KAAM1D,GAAAA,KAAMsqB,GAAAA,CAAI,QAAQ,CAAA,EACtDmB,GAAAA,GAAKy2C,IAAO,SAAA,CAAA,CAAWnjE,GAAAA,KAAMA,GAAAA,CAAE,CAAA,GAAIe,GAAC,GACpCkiE,GAAAA,GAAWv2C,GAAAA,KAAO,EAAA,GAAKy2C,GAAAA,CAAO,MAAA,GAASz2C,GAAAA;AAE7C,IAAA,OADAy2C,GAAAA,CAAO,MAAA,CAAOF,GAAAA,EAAU,CAAA,EAAG3mC,GAAK,CAAA,EACzB;AACL,MAAA,MAAA,EAAQqmC,GAAcN,GAAAA,EAAQ92C,GAAAA,CAAI,WAAWm3C,GAAAA,CAAW7yB,GAAAA,EAAOszB,GAAM,CAAC,CAAA;MACtE,SAAA,EAAW;AAAE,QAAA,SAAA,EAAW53C,GAAAA,CAAI,SAAA;QAAW,QAAA,EAAAtrB;AAAS;AAClD,KAAA;AACF,EAAA;AAEA,EAAA,OAAO;AAAE,IAAA,MAAA,EAAQoiE,IAAO,KAAA,EAAM;IAAG,SAAA,EAAW92C;AAAI,GAAA;AAClD;AAIA,SAAgB63C,GAAAA,CACdpjE,GAAAA,EAA0Be,GAAAA,EAA8B4D,GAAAA,EAC/C;AACT,EAAA,IAAMkrC,GAAAA,GAAQyyB,EAAAA,CAAYD,GAAAA,EAAQgB,GAAS,CAAA;AAC3C,EAAA,IAAIxzB,GAAAA,EAAO,IAAA,KAAS,SAAA,EAAW,OAAO;AAAE,IAAA,MAAA,EAAQwyB,IAAO,KAAA,EAAM;IAAG,SAAA,EAAW;AAAK,GAAA;AAEhF,EAAA,IAAMW,MAAKnzB,GAAAA,EACL9uC,GAAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG+9D,GAAI,CAAA,EACpBvrC,GAAAA,GAAQyvC,GAAAA,CAAG,KAAK,MAAA,KAAW,CAAA,GAAI,CAAA,GAAIM,WAAAA,CAAYN,KAAIjiE,GAAC,CAAA,EACpDwwB,GAAAA,GAAOyxC,GAAAA,CAAG,KAAK,KAAA,EAAM,EACrBt2C,GAAAA,GAAK6E,GAAAA,CAAK,UAAA,CAAWvxB,GAAAA,KAAMJ,GAAAA,CAAE,CAAA,GAAImB,GAAC,CAAA,EAClCkiE,GAAAA,GAAWv2C,GAAAA,KAAO,EAAA,GAAK6E,IAAK,MAAA,GAAS7E,GAAAA;AAE3C,EAAA,OADA6E,GAAAA,CAAK,MAAA,CAAO0xC,GAAAA,EAAU,CAAA,EAAG;IAAE,CAAA,EAAAx8D,GAAAA;IAAG,KAAA,EAAAkC;AAAM,GAAC,CAAA,EAC9B;AACL,IAAA,MAAA,EAAQg6D,GAAcN,GAAAA,EAAQgB,GAAAA,EAAWZ,EAAAA,CAAS5yB,GAAAA,EAAOte,GAAI,CAAC,CAAA;IAC9D,SAAA,EAAW;MAAE,SAAA,EAAAxwB,GAAAA;MAAW,QAAA,EAAAI;AAAS;AACnC,GAAA;AACF;AAGA,SAAgBoiE,GAAAA,CAAUvjE,KAA0Be,GAAAA,EAA4B;AAC9E,EAAA,IAAM8uC,GAAAA,GAAQyyB,EAAAA,CAAYD,GAAAA,EAAQ92C,GAAAA,CAAI,SAAS,CAAA;AAC/C,EAAA,IAAIskB,GAAAA,EAAO,IAAA,KAAS,SAAA,EAAW,OAAO;AAAE,IAAA,MAAA,EAAQwyB,IAAO,KAAA,EAAM;IAAG,SAAA,EAAW92C;AAAI,GAAA;AAG/E,EAAA,IAAMgG,GAAAA,GAAOyxC,IAAG,IAAA,CAAK,MAAA,CAAA,CAAQhjE,GAAAA,EAAG2E,GAAAA,KAAM1D,GAAAA,KAAMsqB,GAAAA,CAAI,QAAQ,CAAA;AACxD,EAAA,OAAO;AACL,IAAA,MAAA,EAAQo3C,GAAcN,GAAAA,EAAQ92C,GAAAA,CAAI,WAAWk3C,EAAAA,CAAS5yB,GAAAA,EAAOte,GAAI,CAAC,CAAA;IAClE,SAAA,EAAWA,GAAAA,CAAK,MAAA,KAAW,CAAA,GACvB,IAAA,GACA;AAAE,MAAA,SAAA,EAAWhG,GAAAA,CAAI,SAAA;AAAW,MAAA,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAGA,GAAAA,CAAI,WAAW,CAAC;AAAE;AAC1E,GAAA;AACF;AAGA,SAAgBi4C,EAAAA,CACdxjE,GAAAA,EAA0Be,GAAAA,EAAmB4D,GAAAA,EACpC;AACT,EAAA,IAAMkrC,GAAAA,GAAQyyB,EAAAA,CAAYD,GAAAA,EAAQ92C,GAAAA,CAAI,SAAS,CAAA;AAC/C,EAAA,IAAIskB,GAAAA,EAAO,IAAA,KAAS,SAAA,EAAW,OAAOwyB,IAAO,KAAA,EAAM;AAGnD,EAAA,IAAM9wC,GAAAA,GAAOyxC,GAAAA,CAAG,IAAA,CAAK,KAAA,EAAM,EACrB,EAAE,MAAA,EAAQS,GAAAA,EAAO,GAAGh/D,GAAAA,EAAAA,GAAS8sB,GAAAA,CAAKhG,IAAI,QAAA,CAAA;AAE5C,EAAA,OADAtqB,IAAKsqB,GAAAA,CAAI,QAAA,CAAA,GAAYm4C,GAAAA,KAAW,SAAYj/D,GAAAA,GAAO;IAAE,GAAGA,GAAAA;IAAM,MAAA,EAAAE;AAAO,GAAA,EAC9Dg+D,GAAcN,GAAAA,EAAQ92C,GAAAA,CAAI,WAAWk3C,EAAAA,CAAS5yB,GAAAA,EAAOte,GAAI,CAAC,CAAA;AACnE;AAGA,SAAgBoyC,EAAAA,CACd3jE,GAAAA,EAA0Be,GAAAA,EAA8B4D,GAAAA,EAC/C;AACT,EAAA,IAAMkrC,GAAAA,GAAQyyB,EAAAA,CAAYD,GAAAA,EAAQgB,GAAS,CAAA;AAE3C,EAAA,OADIxzB,GAAAA,EAAO,IAAA,KAAS,SAAA,GACb8yB,EAAAA,CAAcN,KAAQgB,GAAAA,EAAWZ,EAAAA,CAAS5yB,GAAAA,EAAOte,GAAAA,CAAK,KAAA,EAAO,CAAC,CAAA,GAD/B8wC,IAAO,KAAA,EAAM;AAErD;AAGA,SAAgBuB,GAAAA,CACd5jE,GAAAA,EAA0Be,GAAAA,EAAmB4D,GAAAA,EACpC;AACT,EAAA,IAAMkrC,GAAAA,GAAQyyB,EAAAA,CAAYD,GAAAA,EAAQ92C,GAAAA,CAAI,SAAS,CAAA;AAC/C,EAAA,IAAIskB,GAAAA,EAAO,IAAA,KAAS,SAAA,EAAW,OAAOwyB,IAAO,KAAA,EAAM;AAGnD,EAAA,IAAM9wC,GAAAA,GAAOyxC,GAAAA,CAAG,IAAA,CAAK,KAAA,EAAM;AAE3B,EAAA,OADA/hE,GAAAA,CAAKsqB,GAAAA,CAAI,QAAA,CAAA,GAAY;IAAE,GAAGgG,GAAAA,CAAKhG,IAAI,QAAA,CAAA;IAAW,KAAA,EAAA5mB;AAAM,GAAA,EAC7Cg+D,GAAcN,GAAAA,EAAQ92C,GAAAA,CAAI,WAAWk3C,EAAAA,CAAS5yB,GAAAA,EAAOte,GAAI,CAAC,CAAA;AACnE;AChHA,SAAgBsyC,GAAS7jE,GAAAA,EAAoC;AAC3D,EAAA,IAAM,EACJ,MAAA,EAAAe,GAAAA,EAAQ,QAAA,EAAA4D,KAAU,QAAA,EAAAH,GAAAA,EAClB,OAAA,EAAAvD,GAAAA,EAAS,UAAAwF,GAAAA,EAAU,OAAA,EAAAkC,GAAAA,EACnB,eAAA,EAAAzH,KAAiB,KAAA,EAAAjB,GAAAA,EAAO,SAAA,EAAAkB,GAAAA,KACtBuD,GAAAA,EAEE,CAACqpB,GAAAA,EAAU+1C,GAAAA,IAAe5/D,QAAAA,CAAAA,sBAAoC,IAAI,GAAA,EAAK,CAAA,EACvE,CAAC6/D,GAAAA,EAAWC,GAAAA,IAAgB9/D,QAAAA,CAAqB;IAAE,IAAA,EAAM,CAAA;IAAG,EAAA,EAAI+9D;AAAS,GAAC,CAAA,EAC1E,CAACgC,GAAAA,EAAcC,GAAAA,IAAmBhgE,QAAAA,CAA8B,IAAI,CAAA,EACpE,CAACigE,KAAkBC,GAAAA,CAAAA,GAAuBlgE,QAAAA,CAA8B,IAAI,GAE5Eq7D,GAAAA,GAAM76D,GAAAA,CAAM,MAAA,IAAUq/D,GAAAA,EACtBM,GAAAA,GAAY3/D,GAAAA,CAAM,cAAA,IAAkBs/D,GAAAA,EACpC7P,MAAYzvD,GAAAA,CAAM,SAAA,KAAc,MAAA,GAA8Bu/D,GAAAA,GAAlBv/D,IAAM,SAAA,EAClD4/D,GAAAA,GAAe5/D,GAAAA,CAAM,QAAA,IAAYw/D,KAEjCxe,GAAAA,GAAqB;IAAE,IAAA,EAAM,CAAA;IAAG,EAAA,EAAIuc;AAAS,GAAA,EAC7Cz2C,GAAAA,GAAO6C,OAAAA,CAAAA,MAAc8zC,GAAAA,CAAWE,KAAQt0C,GAAQ,CAAA,EAAG,CAACs0C,GAAAA,EAAQt0C,GAAQ,CAAC,CAAA,EAGrE2xC,GAAAA,GAAYrxC,QAAAA,MAAc;AAC9B,IAAA,IAAM/a,sBAAM,IAAI,GAAA,CAAY,CAAC,CAAA,EAAG2uD,GAAQ,CAAC,CAAA;AACzC,IAAA,KAAA,IAAWv2C,OAAOF,GAAAA,EAChB,IAAIE,GAAAA,CAAI,IAAA,KAAS,WAAW,KAAA,IAAW9rB,GAAAA,IAAM8rB,GAAAA,CAAI,KAAA,CAAgC,MAAM1rB,GAAAA,CAAI,IAAIJ,GAAAA,CAAE,CAAA,GAAI8rB,IAAI,MAAM,CAAA;AAEjH,IAAA,OAAO,CAAC,GAAGpY,GAAG,CAAA;AAChB,EAAA,CAAA,EAAG,CAACkY,GAAAA,EAAMy2C,GAAQ,CAAC,CAAA,EAEbjnB,GAAAA,GAAAA,CAAUh7C,GAAAA,KAAsB;AACpC,IAAAqB,GAAAA,CAAA,CAAaN,GAAAA,KAAS;AACpB,MAAA,IAAMqK,GAAAA,GAAO,IAAI,GAAA,CAAIF,GAAI,CAAA;AAEzB,MAAA,OADIE,GAAAA,CAAK,GAAA,CAAIymB,GAAG,CAAA,GAAGzmB,GAAAA,CAAK,MAAA,CAAOymB,GAAG,CAAA,GAAQzmB,GAAAA,CAAK,GAAA,CAAIymB,GAAG,CAAA,EAC/CzmB,GAAAA;IACT,CAAC,CAAA;EACH,CAAA,EAEMm5D,GAAAA,GAAAA,CAAiBvkE,GAAAA,KAAgD;AACrE,IAAA,IAAA,CAAKA,IAAE,GAAA,KAAQ,QAAA,IAAYA,GAAAA,CAAE,GAAA,KAAQ,gBAAgBm0D,GAAAA,EAAW;AAC9D,MAAAn0D,IAAE,cAAA,EAAe;AACjB,MAAA,IAAMwE,GAAAA,GAAI++D,GAAAA,CAAUlB,GAAAA,EAAQlO,GAAS,CAAA;AACrCzvB,MAAAA,IAASlgC,GAAAA,CAAE,MAAM,CAAA,EACjB8/D,GAAAA,CAAa9/D,IAAE,SAAS,CAAA;AAC1B,IAAA;AACF,EAAA,CAAA,EAEMggE,GAAAA,GAAgBrQ,GAAAA,GAAYmO,EAAAA,CAAYD,GAAAA,EAAQlO,IAAU,SAAS,CAAA,GAAI,MAAA,EACvE53B,GAAAA,GAAcioC,KAAe,IAAA,KAAS,SAAA,GACvCA,GAAAA,CAAwC,IAAA,CAAKrQ,IAAW,QAAA,CAAA,GACzD,MAAA,EAEEsQ,GAAAA,GAAeN,GAAAA,GAAmB7B,EAAAA,CAAYD,GAAAA,EAAQ8B,GAAAA,CAAiB,SAAS,CAAA,GAAI,MAAA,EACpFO,EAAAA,GAAaD,GAAAA,EAAc,SAAS,SAAA,GACrCA,GAAAA,CAAuC,IAAA,CAAKN,GAAAA,CAAkB,QAAA,CAAA,GAC/D,MAAA;AAEJ,EAAA,uBACEpwD,KAAC,KAAA,EAAD;IACE,SAAA,EAAW,CAAC7S,IAAE,IAAA,EAAMkE,GAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;IACvD,aAAA,EAAY,eAAA;IACZ,QAAA,EAAU,EAAA;IACV,SAAA,EAAWm/D,GAAAA;IAJb,QAAA,EAAA;MAMG7iE,GAAAA,mBAAQqD,IAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAW7D,GAAAA,CAAE,KAAA;QAAQ,QAAA,EAAAQ;AAAW,OAAA,CAAA,GAAI,IAAA;AAEjDgD,MAAAA,GAAAA,CAAM,SAAA,KAAc,KAAA,GAAQ,IAAA,mBAC3BqP,KAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAW7S,GAAAA,CAAE,YAAA;QAAlB,QAAA,EAAA,iBACE6D,GAAAA,CAACy8D,EAAAA,EAAD;AACE,UAAA,GAAK98D,IAAM,SAAA,IAAa;YACtB,MAAA,EAAQ,IAAA;YAAM,IAAA,EAAM,KAAA;YAAO,IAAA,EAAM,CAAA;AACjC,YAAA,MAAA,EAAA,MAAc;AAAC,YAAA,CAAA;AAAG,YAAA,OAAA,EAAA,MAAe;AAAC,YAAA,CAAA;AAClC,YAAA,YAAA,EAAA,MAAoB;AAAC,YAAA,CAAA;AAAG,YAAA,YAAA,EAAA,MAAoB;AAAC,YAAA;AAC/C,WAAA;UACU,QAAA,EAAAF,GAAAA;UACA,QAAA,EAAAG;SACX,CAAA,kBACDI,GAAAA,CAAC,QAAA,EAAD;UACE,IAAA,EAAK,QAAA;UACL,IAAA,EAAK,QAAA;UACL,cAAA,EAAA,CAAeL,GAAAA,CAAM,QAAQ,MAAA,MAAY,OAAA;UACzC,YAAA,EAAW,YAAA;AACX,UAAA,SAAA,EAAWxD,GAAAA,CAAE,eAAA;UACb,OAAA,EAAA,MAAewD,IAAM,YAAA,GAAA,CAAgBA,GAAAA,CAAM,QAAQ,MAAA,MAAY,OAAA,GAAU,SAAS,OAAO,CAAA;UAC1F,QAAA,EAAA;AAEO,SAAA,CACL;;AAGP,sBAAAqP,KAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAW7S,GAAAA,CAAE,IAAA;AAAlB,QAAA,QAAA,EAAA,iBACE6D,GAAAA,CAAC,KAAA,EAAD,EAAK,SAAA,EAAW7D,GAAAA,CAAE,MAAA,EAAS,CAAA,kBAC3B6D,GAAAA,CAAC,KAAA,EAAD;AAAK,UAAA,SAAA,EAAW7D,GAAAA,CAAE,SAAA;UAChB,QAAA,kBAAA6D,IAACk8D,GAAAA,EAAD;YACE,MAAA,EAAQ1B,GAAAA;YACA,MAAA,EAAAr7C,GAAAA;YACE,QAAA,EAAA1f,GAAAA;YACD,OAAA,EAAAmE,GAAAA;YACT,cAAA,EAAgB07D;WACjB;AACE,SAAA,CACF;;AAEL,sBAAAt/D,IAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAW7D,GAAAA,CAAE,KAAA;QACf,QAAA,EAAAsqB,GAAAA,CAAK,GAAA,CAAA,CAAK7mB,GAAAA,KAAQ;AACjB,UAAA,IAAM0+D,MAAY33C,GAAAA,CAAI,IAAA;AACtB,UAAA,uBACE3mB,IAACo7D,GAAAA,EAAD;YAEO,GAAA,EAAAx7D,GAAAA;YACL,MAAA,EAAQ46D,GAAAA;AACR,YAAA,IAAA,EAAM76D,IAAM,IAAA,IAAQ,MAAA;AACpB,YAAA,SAAA,EAAWyvD,OAAaqO,EAAAA,CAASrO,GAAAA,CAAU,WAAWkP,GAAS,CAAA,GAAIlP,IAAU,QAAA,GAAW,IAAA;YACxF,QAAA,EAAUpmC,GAAAA,CAAS,GAAA,CAAIrC,GAAAA,CAAI,GAAG,CAAA;YACnB,SAAA,EAAA9rB,GAAAA;YACX,cAAA,EAAA,MAAsBo7C,GAAAA,CAAOtvB,GAAAA,CAAI,GAAG,CAAA;YACpC,QAAA,EAAA,CAAW1rB,QAAaskE,GAAAA,CAAa;cAAE,SAAA,EAAA9/D,GAAAA;cAAW,QAAA,EAAAxE;aAAU,CAAA;YAC5D,UAAA,EAAA,CAAaA,KAAU2E,GAAAA,KAAS;AAC9B,cAAA1D,GAAAA,GAAU6hE,GAAQT,GAAAA,EAAQ;gBAAE,SAAA,EAAA79D,GAAAA;gBAAW,QAAA,EAAAxE;eAAS,EAAG+iE,GAAI,EAAE,MAAM,CAAA;AACjE,YAAA,CAAA;YACA,WAAA,EAAA,CAAc/iE,KAAU2E,GAAAA,KAAS;AAC/B,cAAA,IAAMH,GAAAA,GAAIs+D,GAAQT,GAAAA,EAAQ;gBAAE,SAAA,EAAA79D,GAAAA;gBAAW,QAAA,EAAAxE;AAAS,eAAA,EAAG+iE,GAAI,CAAA;AACvDr+B,cAAAA,IAASlgC,GAAAA,CAAE,MAAM,CAAA,EACjB8/D,GAAAA,CAAa9/D,IAAE,SAAS,CAAA;AAC1B,YAAA,CAAA;AACA,YAAA,WAAA,EAAA,CAAcxE,GAAAA,KAASwkC,GAAAA,GAAUm/B,GAAQtB,GAAAA,EAAQgB,GAAAA,EAAW9xC,GAAI,CAAC,CAAA;AACjE,YAAA,YAAA,EAAA,CAAevxB,GAAAA,KAAS0kC,GAAAA,CAASi/B,GAAQtB,GAAAA,EAAQgB,GAAAA,EAAW9xC,GAAI,CAAC,CAAA;AACjE,YAAA,QAAA,EAAA,CAAWvxB,GAAAA,KAAS;AAClB,cAAA,IAAMwE,GAAAA,GAAI4+D,GAAAA,CAAUf,GAAAA,EAAQgB,GAAAA,EAAWvE,GAAI,CAAA;AAC3Cp6B,cAAAA,IAASlgC,GAAAA,CAAE,MAAM,CAAA,EACjB8/D,GAAAA,CAAa9/D,IAAE,SAAS,CAAA;AAC1B,YAAA,CAAA;AACA,YAAA,eAAA,EAAiB2/D,OAAoB3B,EAAAA,CAAS2B,GAAAA,CAAiB,WAAWd,GAAS,CAAA,GAAIc,IAAiB,QAAA,GAAW,IAAA;YACnH,eAAA,EAAA,CAAkBnkE,QAAaokE,GAAAA,CAAoB;cAAE,SAAA,EAAA5/D,GAAAA;cAAW,QAAA,EAAAxE;aAAU;AAC3E,WAAA,EA1BM0rB,IAAI,GA0BV,CAAA;QAEL,CAAC;OACE,CAAA;AAEJi5C,MAAAA,GAAAA,IAAmBxQ,OAAa53B,GAAAA,IAAeioC,GAAAA,EAAe,SAAS,SAAA,mBACtEz/D,IAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAW7D,GAAAA,CAAE,SAAA;AACf,QAAA,QAAA,EAAAyjE,GAAAA,CAAgB;UACf,GAAA,EAAKpoC,GAAAA;UACL,KAAA,EAAOioC,GAAAA;UACP,SAAA,EAAAxgD,GAAAA;UACA,MAAA,EAAA,CAAShkB,QAAS0kC,GAAAA,CAASk/B,GAAAA,CAAYvB,KAAQlO,GAAAA,EAAW/oD,GAAAA,CAAK,KAAK,CAAC,CAAA;AACrE,UAAA,SAAA,EAAA,CAAYpL,GAAAA,KAAW0kC,GAAAA,CAAS8+B,GAAanB,GAAAA,EAAQlO,GAAAA,EAAWuP,GAAM,CAAC;SACxE;AACE,OAAA,CAAA,GACH,IAAA;MAEHS,GAAAA,IAAoBO,EAAAA,mBACnB3/D,GAAAA,CAAC,KAAA,EAAD;AAAK,QAAA,SAAA,EAAW7D,GAAAA,CAAE,SAAA;QAChB,QAAA,kBAAA6D,IAAC84D,GAAAA,EAAD;AACE,UAAA,KAAA,EAAO6G,EAAAA,CAAW,MAAA;AAClB,UAAA,QAAA,EAAA,CAAW1kE,GAAAA,KAAS0kC,GAAAA,CAAS8+B,GAAanB,GAAAA,EAAQ8B,GAAAA,EAAkB/4D,GAAI,CAAC;SAC1E;AACE,OAAA,CAAA,GACH;AACD;;AAET;AC3LA,IAAaw5D,EAAAA,GAAaC;AAG1B,SAAgBC,EAAAA,CAAS9kE,KAAWe,GAAAA,EAA4B;AAC9D,EAAA,IAAM,CAACyX,GAAAA,EAAIC,GAAAA,CAAAA,GAAMglB,GAAAA,CAAM,MAAA;AAIvB,EAAA,OAHI8J,GAAAA,IAAK/uB,GAAAA,GAAWilB,GAAAA,CAAM,IAAA,GACtB8J,OAAK9uB,GAAAA,GAAWglB,GAAAA,CAAM,IAAA,GACtB8J,GAAAA,IAAK9J,GAAAA,CAAM,IAAA,GAAaA,GAAAA,CAAM,IAAA,GAAA,CAAQA,IAAM,KAAA,GAAQA,GAAAA,CAAM,IAAA,KAAA,CAAU8J,GAAAA,GAAI/uB,GAAAA,KAAOilB,GAAAA,CAAM,IAAA,GAAOjlB,GAAAA,CAAAA,CAAAA,GACzFilB,IAAM,KAAA,GAAA,CAASA,GAAAA,CAAM,IAAA,GAAOA,GAAAA,CAAM,KAAA,KAAA,CAAW8J,GAAAA,GAAI9J,GAAAA,CAAM,IAAA,KAAShlB,MAAKglB,GAAAA,CAAM,IAAA,CAAA,CAAA;AACpF;ACMA,SAAgBsnC,EAAAA,CAAwC,EACtD,IAAA,EAAA/kE,GAAAA,EACA,UAAA,EAAAe,MAAa,GAAA,EACb,SAAA,EAAA4D,GAAAA,GAAY,CAAA,EAAA,EACqC;AACjD,EAAA,IAAM,CAACqgE,GAAAA,EAAYC,GAAAA,CAAAA,GAAiB/gE,QAAAA,CAAS,EAAE,CAAA,EACzC,CAAC4uB,GAAAA,EAASoyC,GAAAA,CAAAA,GAAchhE,QAAAA,CAAwC,EAAE,CAAA,EAClE,CAACyoD,GAAAA,EAAWwY,GAAAA,CAAAA,GAAgBjhE,QAAAA,CAAS,KAAK,GAC1C,CAACooD,GAAAA,EAAW8Y,GAAAA,CAAAA,GAAgBlhE,QAAAA,CAAyB,IAAI,CAAA,EAIzDmhE,GAAAA,GAAU37D,OAAO47D,GAAI,CAAA;AAC3B,EAAAjkE,IAAQ,OAAA,GAAUikE,GAAAA;AAMlB,EAAA,IAAMC,GAAAA,GAAS77D,MAAAA,CAAO,CAAC,CAAA,EACjBmgC,GAAAA,GAAUngC,OAAO,CAAC,CAAA,EAClB87D,GAAAA,GAAW97D,MAAAA,CAA+B,IAAI,CAAA;AA4CpD,EAAA,OA1CAmrB,UAAAA,MAAgB;AACd,IAAA,IAAImwC,GAAAA,CAAW,SAASS,GAAAA,EAAW;AACjCD,MAAAA,IAAS,OAAA,EAAS,KAAA,IAClB3kE,GAAAA,CAAS,OAAA,GAAU,MACnBgB,GAAAA,CAAQ,OAAA,GAAU0jE,IAAO,OAAA,EACzBL,GAAAA,CAAW,EAAE,CAAA,EACbC,IAAa,KAAK,CAAA,EAClBC,IAAa,IAAI,CAAA;AACjB,MAAA;AACF,IAAA;AAEA,IAAA,IAAMM,GAAAA,GAAQ,WAAA,MAAiB;AAC7B,MAAA,IAAMC,MAAO,EAAEJ,GAAAA,CAAO,OAAA,EAChBK,GAAAA,GAAa,IAAI,eAAA,EAAgB;AACvCJ,MAAAA,IAAS,OAAA,EAAS,KAAA,IAClB3kE,GAAAA,CAAS,OAAA,GAAU+kE,KACnBT,GAAAA,CAAa,IAAI,CAAA,EAEjBE,GAAAA,CAAQ,QAAQL,GAAAA,EAAYY,GAAAA,CAAW,MAAM,CAAA,CAAE,IAAA,CAAA,CAC5C7kE,GAAAA,KAAS;AACJ4kE,QAAAA,GAAAA,IAAQ97B,GAAAA,CAAQ,OAAA,KACpBhoC,GAAAA,CAAQ,OAAA,GAAU8jE,GAAAA,EAClBT,GAAAA,CAAW95D,GAAI,CAAA,EACfg6D,GAAAA,CAAa,IAAI,CAAA,EACjBD,IAAa,KAAK,CAAA,CAAA;AACpB,MAAA,CAAA,EAAA,CACCxgE,GAAAA,KAAmB;AACdihE,QAAAA,GAAAA,CAAW,MAAA,CAAO,OAAA,IAAWD,GAAAA,IAAQ97B,GAAAA,CAAQ,OAAA,KACjDhoC,GAAAA,CAAQ,OAAA,GAAU8jE,GAAAA,EAClBP,GAAAA,CAAaS,GAAK,CAAA,EAClBV,IAAa,KAAK,CAAA,CAAA;MACpB,CACF,CAAA;AACF,IAAA,CAAA,EAAGW,GAAU,CAAA;AAEb,IAAA,OAAA,MAAa,aAAaJ,GAAK,CAAA;EACjC,CAAA,EAAG;AAACV,IAAAA,GAAAA;AAAYc,IAAAA,GAAAA;AAAYL,IAAAA;GAAU,CAAA,EAEtC5wC,SAAAA,CAAAA,MAAAA,MAAsB2wC,GAAAA,CAAS,SAAS,KAAA,EAAM,EAAG,EAAE,CAAA,EAI5C;IAAE,OAAA,EAAA/+D,GAAAA;IAAS,SAAA,EAAAvF,GAAAA;IAAW,SAAA,EAAAC,GAAAA;IAAW,UAAA,EAAAqD,GAAAA;AAAY,IAAA,aAAA,EAF9B8mB,YAAAA,CAAatrB,GAAAA,KAAiBilE,IAAc75D,GAAI,CAAA,EAAG,EAErB;AAAc,GAAA;AACpE","file":"chunk-TYN6MLXX.js","sourcesContent":["/**\n * Namespaced, opt-in console tracing. Off by default; production builds\n * may strip the calls entirely depending on the bundler.\n *\n * Enable in the browser:\n *\n * localStorage.setItem('weasel.debug', '*') // all namespaces\n * localStorage.setItem('weasel.debug', 'curve-editor') // just curve editor\n * localStorage.setItem('weasel.debug', 'curve-editor,layer-stack')\n *\n * Each component picks a stable namespace and calls `dlog(namespace, ...)`.\n * Useful for tracing pointer/event flows that are hard to capture\n * post-hoc (drag handlers, gesture sequences, selection mutations).\n *\n * The flag is read once and cached for the page session — reload to\n * pick up changes. Cheap hot-path checks (one nullish-coalesce + Set\n * lookup) so leaving calls in place is fine.\n *\n * Mirrors `src/debug/flag.ts` in the kit. Two impls live here because\n * weasel-ui doesn't depend on the kit, but both read the same\n * localStorage keys so behavior is uniform. See the kit copy for the\n * canonical list of kit-level namespaces.\n *\n * Known weasel-ui namespaces:\n * - plot2d — Plot2D mount / unmount\n * - curve-editor — CurveEditor pointer flow\n */\n\nconst KEYS = ['weasel.debug', 'weaseldraw.debug'] as const;\n\ninterface Cached {\n all: boolean;\n set: Set<string>;\n}\n\nlet cached: Cached | null = null;\n\nfunction read(): Cached {\n const empty: Cached = { all: false, set: new Set() };\n if (typeof localStorage === 'undefined') return empty;\n try {\n for (const k of KEYS) {\n const v = localStorage.getItem(k);\n if (v == null || v === '') continue;\n if (v === '1' || v === 'true' || v === '*') return { all: true, set: new Set() };\n return { all: false, set: new Set(v.split(/[\\s,]+/).filter(Boolean)) };\n }\n return empty;\n } catch {\n return empty;\n }\n}\n\nfunction get(): Cached {\n if (cached === null) cached = read();\n return cached;\n}\n\n/** True when `namespace` (or `*`) is enabled. */\nexport function isDebugEnabled(namespace: string): boolean {\n const c = get();\n return c.all || c.set.has(namespace);\n}\n\n/** Conditional `console.debug` — no-op unless `namespace` (or `*`) is enabled.\n * Each call is prefixed with `[namespace]` so the source is searchable. */\nexport function dlog(namespace: string, ...args: unknown[]): void {\n if (!isDebugEnabled(namespace)) return;\n // eslint-disable-next-line no-console\n console.debug(`[${namespace}]`, ...args);\n}\n","// GENERATED by scripts/gen-icons.mjs — do not edit by hand.\n// Every glyph is a 20x20 viewBox drawn in currentColor at stroke-width 1.5.\n\nimport { ACTION_GLYPHS } from '@weasel-js/core';\n\nexport const ICON_PATHS = {\n\n // View and lifecycle\n clone: `<path d=\"M7 7.4V4.6A1.6 1.6 0 0 1 8.6 3h6.8A1.6 1.6 0 0 1 17 4.6v6.8a1.6 1.6 0 0 1-1.6 1.6H12.6\" stroke-linecap=\"butt\"/><rect x=\"3\" y=\"7\" width=\"10\" height=\"10\" rx=\"1.6\"/><path d=\"M5.7 10.8h4.6M5.7 13.4h3\" stroke-width=\"1\"/>`,\n reset: `<path d=\"M7.28 4.88A5.8 5.8 0 1 0 12.72 4.88\"/><path d=\"M13.81 7.57 12.72 4.88 15.56 4.28\"/>`,\n close: `<path d=\"M4.5 4.5 15.5 15.5M15.5 4.5 4.5 15.5\" stroke-width=\"1.75\"/>`,\n export: `<path d=\"M4 12.6v2.9A1.5 1.5 0 0 0 5.5 17h9a1.5 1.5 0 0 0 1.5-1.5v-2.9\"/><path d=\"M10 3.2v8.5\"/><path d=\"M11.7 9.35 10 11.7 8.3 9.35\"/><path d=\"M6.8 14.7h6.4\" stroke-width=\"1\"/>`,\n zoomIn: `<circle cx=\"9\" cy=\"9\" r=\"5.4\"/><path d=\"M12.82 12.82 16.9 16.9\"/><path d=\"M9 6.7v4.6M6.7 9h4.6\"/>`,\n zoomOut: `<circle cx=\"9\" cy=\"9\" r=\"5.4\"/><path d=\"M12.82 12.82 16.9 16.9\"/><path d=\"M6.7 9h4.6\"/>`,\n fit: `<path d=\"M3.2 7.2V4.4A1.2 1.2 0 0 1 4.4 3.2h2.8M12.8 3.2h2.8A1.2 1.2 0 0 1 16.8 4.4v2.8M16.8 12.8v2.8a1.2 1.2 0 0 1-1.2 1.2h-2.8M7.2 16.8H4.4a1.2 1.2 0 0 1-1.2-1.2v-2.8\"/><rect x=\"7.4\" y=\"8.2\" width=\"5.2\" height=\"3.6\" rx=\"0.8\" stroke-width=\"1\"/>`,\n pan: `<path d=\"M10 8.1V3.2M10 11.9V16.8M8.1 10H3.2M11.9 10H16.8\"/><path d=\"M8.26 5.27 10 3.2 11.74 5.27M11.74 14.73 10 16.8 8.26 14.73M5.27 11.74 3.2 10 5.27 8.26M14.73 8.26 16.8 10 14.73 11.74\"/><circle cx=\"10\" cy=\"10\" r=\"1.9\"/>`,\n\n // Actions\n filter: `<path d=\"M3.4 4.6h13.2L11.8 11v5.4L8.2 14.8V11z\"/>`,\n add: `<path d=\"M10 4.9v10.2M4.9 10h10.2\"/>`,\n remove: `<path d=\"M4.9 10h10.2\"/>`,\n delete: ACTION_GLYPHS.delete,\n sort: `<path d=\"M3.6 5.6h7.2M3.6 10h8.8M3.6 14.4h5\"/><path d=\"M15.3 5.4v9.4\"/><path d=\"M16.97 12.81 15.3 14.8 13.63 12.81\"/>`,\n undo: ACTION_GLYPHS.undo,\n redo: ACTION_GLYPHS.redo,\n snapshot: `<path d=\"M3.8 8.3A1.4 1.4 0 0 1 5.2 6.9h1.9L8 5.1h4l.9 1.8h1.9A1.4 1.4 0 0 1 16.2 8.3v6A1.4 1.4 0 0 1 14.8 15.7H5.2A1.4 1.4 0 0 1 3.8 14.3z\"/><circle cx=\"10\" cy=\"11\" r=\"2.75\"/>`,\n\n // Character styling\n bold: `<path d=\"M6 3.5h4.6a3.1 3.1 0 0 1 0 6.2H6zM6 9.7h5.4a3.4 3.4 0 0 1 0 6.8H6z\" stroke-width=\"2.1\"/>`,\n italic: `<path d=\"M9 3.5h6M5 16.5h6M12.5 3.5 7.5 16.5\"/>`,\n underline: `<path d=\"M6 3.4v5.6a4 4 0 0 0 8 0V3.4\"/><path d=\"M4.6 17h10.8\"/>`,\n strikethrough: `<path d=\"M14.4 5.8c-.9-1.6-2.4-2.4-4.4-2.4-2.5 0-4.2 1.3-4.2 3.1 0 .9.4 1.6 1.2 2.2\"/><path d=\"M5.6 14.2c.9 1.6 2.4 2.4 4.4 2.4 2.5 0 4.2-1.3 4.2-3.1 0-.9-.4-1.6-1.2-2.2\"/><path d=\"M3.4 10h13.2\"/>`,\n overline: `<path d=\"M4.6 3h10.8\"/><ellipse cx=\"10\" cy=\"11.4\" rx=\"4.4\" ry=\"4.8\"/>`,\n superscript: `<path d=\"M3.6 8.6 10.4 16.4M10.4 8.6 3.6 16.4\"/><path d=\"M11.9 5.3a2.2 2.2 0 1 1 4.3.8c0 1.4-4.3 2.2-4.3 3.5h4.5\"/>`,\n subscript: `<path d=\"M3.6 3.6 10.4 11.4M10.4 3.6 3.6 11.4\"/><path d=\"M11.9 11.5a2.2 2.2 0 1 1 4.3.8c0 1.4-4.3 2.2-4.3 3.5h4.5\"/>`,\n code: `<path d=\"M7 6.2 3.2 10 7 13.8M13 6.2 16.8 10 13 13.8\"/><path d=\"M11.2 4.8 8.8 15.2\"/>`,\n\n // Playback\n play: `<path d=\"M7.6 5.2 15.6 10 7.6 14.8Z\"/>`,\n pause: `<path d=\"M7.8 5.2v9.6M12.2 5.2v9.6\"/>`,\n stop: `<rect x=\"5.6\" y=\"5.6\" width=\"8.8\" height=\"8.8\" rx=\"1.4\"/>`,\n stepBack: `<path d=\"M13.6 5.4 7 10 13.6 14.6Z\"/><path d=\"M4.8 5.4v9.2\"/>`,\n stepForward: `<path d=\"M6.4 5.4 13 10 6.4 14.6Z\"/><path d=\"M15.2 5.4v9.2\"/>`,\n\n // State\n lock: `<rect x=\"4.6\" y=\"9\" width=\"10.8\" height=\"8\" rx=\"1.6\"/><path d=\"M7.2 9V6.6a2.8 2.8 0 0 1 5.6 0V9\"/>`,\n unlock: `<rect x=\"4.6\" y=\"9\" width=\"10.8\" height=\"8\" rx=\"1.6\"/><path d=\"M7.2 9V6.6a2.8 2.8 0 0 1 5.6 0\"/>`,\n visible: `<path d=\"M2.6 10C4.6 6.6 7.1 5 10 5s5.4 1.6 7.4 5c-2 3.4-4.5 5-7.4 5s-5.4-1.6-7.4-5z\"/><circle cx=\"10\" cy=\"10\" r=\"2.2\"/>`,\n hidden: `<path d=\"M2.6 10C4.6 6.6 7.1 5 10 5s5.4 1.6 7.4 5c-2 3.4-4.5 5-7.4 5s-5.4-1.6-7.4-5z\"/><circle cx=\"10\" cy=\"10\" r=\"2.2\"/><path d=\"M4.2 15.8 15.8 4.2\"/>`,\n pin: `<path d=\"M8.2 3.4v5.2l-2 2.6h7.6l-2-2.6V3.4z\"/><path d=\"M7 3.4h6\"/><path d=\"M10 11.2v5.4\"/>`,\n info: `<circle cx=\"10\" cy=\"10\" r=\"7\"/><path d=\"M10 9.4v4.4\"/><path d=\"M10 6.5h0\"/>`,\n warning: `<path d=\"M10 3.4 17.4 16.2H2.6z\"/><path d=\"M10 8.4v3.4\"/><path d=\"M10 14h0\"/>`,\n error: `<circle cx=\"10\" cy=\"10\" r=\"7\"/><path d=\"M7.6 7.6 12.4 12.4M12.4 7.6 7.6 12.4\"/>`,\n busy: `<path d=\"M10 3.2A6.8 6.8 0 1 1 3.2 10\"/>`,\n check: `<path d=\"M4.35 10.56 8.03 14.24 15.66 5.77\"/>`,\n modeLight: `<circle cx=\"10\" cy=\"10\" r=\"3.5\"/><path d=\"M15.3 10L17.7 10M13.75 6.25L15.44 4.56M10 4.7L10 2.3M6.25 6.25L4.56 4.56M4.7 10L2.3 10M6.25 13.75L4.56 15.44M10 15.3L10 17.7M13.75 13.75L15.44 15.44\"/>`,\n modeDark: `<path d=\"M8.19 3.55A6.7 6.7 0 1 0 16.45 11.81A5.9 5.9 0 0 1 8.19 3.55Z\"/>`,\n modeAuto: `<path d=\"M10 2.6Q10 10 17.4 10Q10 10 10 17.4Q10 10 2.6 10Q10 10 10 2.6Z\"/>`,\n\n // Instrument\n crosshair: `<circle cx=\"10\" cy=\"10\" r=\"5.6\"/><path d=\"M10 2.8v4.4M10 12.8v4.4M2.8 10h4.4M12.8 10h4.4\"/>`,\n fullscreen: `<path d=\"M11.6 3.6h4.8v4.8M8.4 16.4H3.6v-4.8\"/><path d=\"M16.4 3.6 11.2 8.8M3.6 16.4 8.8 11.2\"/>`,\n compare: `<rect x=\"3.4\" y=\"4.6\" width=\"13.2\" height=\"10.8\" rx=\"1.6\"/><path d=\"M10 4.6v10.8\" stroke-width=\"1\"/><path d=\"M5.2 7.6h3.4M5.2 10h2.6M5.2 12.4h3.4\" stroke-width=\"1\"/><path d=\"M11.4 7.6h3.4M11.4 10h3.4M11.4 12.4h1.8\" stroke-width=\"1\"/>`,\n search: `<circle cx=\"9\" cy=\"9\" r=\"5.4\"/><path d=\"M12.82 12.82 16.9 16.9\"/>`,\n loupe: `<circle cx=\"9\" cy=\"9\" r=\"5.6\"/><path d=\"M12.96 12.96 17 17\"/><rect x=\"6\" y=\"6\" width=\"6\" height=\"6\" stroke-width=\"1\"/><path d=\"M9 6v6M6 9h6\" stroke-width=\"1\"/>`,\n layers: `<path d=\"M10 2.8 17.2 6.6 10 10.4 2.8 6.6z\"/><path d=\"M2.8 10 10 13.8 17.2 10\" stroke-width=\"1\"/><path d=\"M2.8 13.4 10 17.2 17.2 13.4\" stroke-width=\"1\"/>`,\n page: `<path d=\"M4.6 2.8H11.6L15.4 6.6V17.2H4.6z\"/><path d=\"M11.6 2.8V6.6H15.4\"/>`,\n link: `<path d=\"M8.6 11.4a3.4 3.4 0 0 1 0-4.8l2.2-2.2a3.4 3.4 0 0 1 4.8 4.8l-1.1 1.1\"/><path d=\"M11.4 8.6a3.4 3.4 0 0 1 0 4.8l-2.2 2.2a3.4 3.4 0 0 1-4.8-4.8l1.1-1.1\"/>`,\n collapse: `<path d=\"M14.16 4.05 10 7.8 5.84 4.05M5.84 15.95 10 12.2 14.16 15.95\"/>`,\n expand: `<path d=\"M5.84 8.15 10 4.4 14.16 8.15M14.16 11.85 10 15.6 5.84 11.85\"/>`,\n chevron: `<path d=\"M14.9 7.98 10 12.4 5.1 7.98\"/>`,\n tune: `<path d=\"M3.4 6h13.2M3.4 10h13.2M3.4 14h13.2\" stroke-width=\"1.25\"/><circle cx=\"7\" cy=\"6\" r=\"1.8\"/><circle cx=\"12.6\" cy=\"10\" r=\"1.8\"/><circle cx=\"9\" cy=\"14\" r=\"1.8\"/>`,\n grid: `<rect x=\"3.4\" y=\"3.4\" width=\"13.2\" height=\"13.2\" rx=\"1.4\"/><path d=\"M7.8 3.4v13.2M12.2 3.4v13.2M3.4 7.8h13.2M3.4 12.2h13.2\" stroke-width=\"1\"/>`,\n snap: `<path d=\"M5.4 15.6V9.4a4.6 4.6 0 0 1 9.2 0v6.2h-3.2V9.4a1.4 1.4 0 0 0-2.8 0v6.2z\"/><path d=\"M5.4 12.8h3.2M11.4 12.8h3.2\" stroke-width=\"1\"/>`,\n measure: `<rect x=\"2.6\" y=\"7.4\" width=\"14.8\" height=\"5.2\" rx=\"1.2\"/><path d=\"M6 7.4v2.2M9.4 7.4v3M12.8 7.4v2.2\" stroke-width=\"1\"/>`,\n randomize: `<rect x=\"3.6\" y=\"3.6\" width=\"12.8\" height=\"12.8\" rx=\"2\"/><circle cx=\"7.2\" cy=\"7.2\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"10\" cy=\"10\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12.8\" cy=\"12.8\" r=\"1\" fill=\"currentColor\" stroke=\"none\"/>`,\n refresh: `<path d=\"M4.27 12.09A6.1 6.1 0 0 1 14.67 6.08\"/><path d=\"M14.67 3.38 14.67 6.08 12.01 5.61\"/><path d=\"M15.73 7.91A6.1 6.1 0 0 1 5.33 13.92\"/><path d=\"M5.33 16.62 5.33 13.92 7.99 14.39\"/>`,\n\n // Stroke cap, join, align and dash\n strokeWidth: `<path d=\"M3.4 5.6h13.2\" stroke-width=\"1\"/><path d=\"M3.4 10h13.2\" stroke-width=\"2\"/><path d=\"M3.4 15.2h13.2\" stroke-width=\"3.4\"/>`,\n strokeCap: `<path d=\"M2.5 10H12\" stroke-linecap=\"butt\"/><path d=\"M12 6V14\" stroke-width=\"1\"/>`,\n strokeJoin: `<path d=\"M4.4 15.5 10 5.5 15.6 15.5\" stroke-linecap=\"butt\" stroke-linejoin=\"miter\"/>`,\n strokeAlign: `<circle cx=\"10\" cy=\"10\" r=\"6.2\"/>`,\n capButt: `<path d=\"M5.5 5.25H14.5V14.75H5.5Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"miter\"/>`,\n capRound: `<path d=\"M3.13 5.25H12.13V14.75H3.13Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"miter\"/><path d=\"M12.13 4.5A5.5 5.5 0 0 1 12.13 15.5Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n capSquare: `<path d=\"M3.13 5.25H12.13V14.75H3.13Z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"miter\"/><path d=\"M12.13 4.5H17.63V15.5H12.13Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n joinMiter: `<path d=\"M10 3.5 15.6 15.5H4.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n joinRound: `<path d=\"M4.4 15.5V12a5.6 5.6 0 0 1 11.2 0v3.5Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n joinBevel: `<path d=\"M6.8 8.2h6.4l2.4 7.3H4.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n alignInner: `<path d=\"M10 3.8A6.2 6.2 0 1 0 10 16.2A6.2 6.2 0 1 0 10 3.8Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n alignCenter: `<path d=\"M10 2.1A7.9 7.9 0 1 0 10 17.9A7.9 7.9 0 1 0 10 2.1ZM10 5.5A4.5 4.5 0 1 0 10 14.5A4.5 4.5 0 1 0 10 5.5Z\" fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\"/>`,\n alignOuter: `<path d=\"M0 0H20V20H0ZM10 3.8A6.2 6.2 0 1 0 10 16.2A6.2 6.2 0 1 0 10 3.8Z\" fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\"/>`,\n dashSolid: `<path d=\"M2 10h16\" stroke-width=\"3\" stroke-linecap=\"butt\"/>`,\n dashDashed: `<path d=\"M2 10h16\" stroke-width=\"3\" stroke-linecap=\"butt\" stroke-dasharray=\"6 4\"/>`,\n dashDotted: `<path d=\"M2 10h16\" stroke-width=\"3\" stroke-linecap=\"butt\" stroke-dasharray=\"2.5 2\"/>`,\n dashCustom: `<path d=\"M2 10h16\" stroke-width=\"3\" stroke-linecap=\"butt\" stroke-dasharray=\"5 2 2 2\"/>`,\n paintSolid: `<path d=\"M3.4 3.4H16.6V16.6H3.4Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"1\"/>`,\n paintLinear: `<path d=\"M3.4 3.4H6.7V16.6H3.4Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"1\"/><path d=\"M6.7 3.4H10V16.6H6.7Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.68\"/><path d=\"M10 3.4H13.3V16.6H10Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.42\"/><path d=\"M13.3 3.4H16.6V16.6H13.3Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.2\"/>`,\n paintRadial: `<path d=\"M3.4 3.4H16.6V16.6H3.4ZM4.95 4.95H15.05V15.05H4.95Z\" fill=\"currentColor\" fill-rule=\"evenodd\" stroke=\"none\" fill-opacity=\"0.7\"/><path d=\"M4.95 4.95H15.05V15.05H4.95ZM6.5 6.5H13.5V13.5H6.5Z\" fill=\"currentColor\" fill-rule=\"evenodd\" stroke=\"none\" fill-opacity=\"0.53\"/><path d=\"M6.5 6.5H13.5V13.5H6.5ZM8.05 8.05H11.95V11.95H8.05Z\" fill=\"currentColor\" fill-rule=\"evenodd\" stroke=\"none\" fill-opacity=\"0.37\"/><path d=\"M8.05 8.05H11.95V11.95H8.05Z\" fill=\"currentColor\" fill-rule=\"evenodd\" stroke=\"none\" fill-opacity=\"0.2\"/>`,\n paintConic: `<path d=\"M10 10L16.6 3.4L16.6 16.6Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"1\"/><path d=\"M10 10L16.6 16.6L3.4 16.6Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.68\"/><path d=\"M10 10L3.4 16.6L3.4 3.4Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.42\"/><path d=\"M10 10L3.4 3.4L16.6 3.4Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.2\"/>`,\n paintMesh: `<path d=\"M3.4 3.4L10 3.4C10 6.26 11.6 5.74 11.6 8.6C7.09 8.6 7.91 10 3.4 10L3.4 3.4Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"1\"/><path d=\"M10 3.4L16.6 3.4L16.6 10C13.85 10 14.35 8.6 11.6 8.6C11.6 5.74 10 6.26 10 3.4Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.68\"/><path d=\"M11.6 8.6C14.35 8.6 13.85 10 16.6 10L16.6 16.6L10 16.6C10 12.2 11.6 13 11.6 8.6Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.42\"/><path d=\"M11.6 8.6C11.6 13 10 12.2 10 16.6L3.4 16.6L3.4 10C7.91 10 7.09 8.6 11.6 8.6Z\" fill=\"currentColor\" stroke=\"none\" fill-opacity=\"0.2\"/>`,\n paintPattern: `<path d=\"M3.4 3.4L4.7 3.4L3.4 4.7Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M8.7 3.4L11.3 3.4L3.4 11.3L3.4 8.7Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M15.3 3.4L16.6 3.4L16.6 4.7L4.7 16.6L3.4 16.6L3.4 15.3Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M16.6 8.7L16.6 11.3L11.3 16.6L8.7 16.6Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M16.6 15.3L16.6 16.6L15.3 16.6Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M15.3 3.4L16.6 3.4L16.6 4.7Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M8.7 3.4L11.3 3.4L16.6 8.7L16.6 11.3Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M3.4 3.4L4.7 3.4L16.6 15.3L16.6 16.6L15.3 16.6L3.4 4.7Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M11.3 16.6L8.7 16.6L3.4 11.3L3.4 8.7Z\" fill=\"currentColor\" stroke=\"none\"/><path d=\"M4.7 16.6L3.4 16.6L3.4 15.3Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n paintNone: `<path d=\"M3.4 3.4H16.6V16.6H3.4Z\"/><path d=\"M3.4 16.6L16.6 3.4\" stroke=\"var(--wzl-danger, #d94a3f)\" stroke-width=\"1.8\" stroke-linecap=\"butt\"/>`,\n\n // Workspace layout\n layoutRows: `<rect x=\"3.4\" y=\"3.4\" width=\"13.2\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"3.4\" y=\"8.3\" width=\"13.2\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"3.4\" y=\"13.2\" width=\"13.2\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/>`,\n layoutColumns: `<rect x=\"3.4\" y=\"3.4\" width=\"3.4\" height=\"13.2\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"8.3\" y=\"3.4\" width=\"3.4\" height=\"13.2\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"13.2\" y=\"3.4\" width=\"3.4\" height=\"13.2\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/>`,\n layoutGrid: `<rect x=\"3.4\" y=\"3.4\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"8.3\" y=\"3.4\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"13.2\" y=\"3.4\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"3.4\" y=\"8.3\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"8.3\" y=\"8.3\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"13.2\" y=\"8.3\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"3.4\" y=\"13.2\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"8.3\" y=\"13.2\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/><rect x=\"13.2\" y=\"13.2\" width=\"3.4\" height=\"3.4\" rx=\"1\" fill=\"currentColor\" stroke=\"none\"/>`,\n\n // Arc profiles\n arcStraight: `<path d=\"M2.6 15H17.4\"/>`,\n arcParabola: `<path d=\"M2.6 15Q10 -5 17.4 15\"/>`,\n arcCircle: `<path d=\"M2.6 15A7.4 7.4 0 0 1 17.4 15\"/>`,\n arcSine: `<path d=\"M2.6 10C3.83 7.38 5.07 5 6.3 5C7.53 5 8.77 7.38 10 10C11.23 12.62 12.47 15 13.7 15C14.93 15 16.17 12.62 17.4 10\"/>`,\n arcBump: `<path d=\"M2.6 15C3.83 15 5.07 11.87 6.3 9.38C7.53 6.88 8.77 5 10 5C11.23 5 12.47 6.88 13.7 9.38C14.93 11.87 16.17 15 17.4 15\"/>`,\n arcPlateau: `<path d=\"M2.6 15V8.6A3.6 3.6 0 0 1 6.2 5H13.8A3.6 3.6 0 0 1 17.4 8.6V15\"/>`,\n arcBell: `<path d=\"M2.6 15C3.42 14.87 4.24 14.6 5.07 13.65C5.89 12.7 6.71 10.87 7.53 8.87C8.36 6.86 9.18 5 10 5C10.82 5 11.64 6.86 12.47 8.87C13.29 10.87 14.11 12.7 14.93 13.65C15.76 14.6 16.58 14.87 17.4 15\"/>`,\n arcEllipse: `<path d=\"M2.6 15A7.4 10 0 0 1 17.4 15\"/>`,\n arcLob: `<path d=\"M2.6 15C3.78 -0.6 10.74 4.2 17.4 15\"/>`,\n arcDive: `<path d=\"M2.6 15C9.26 4.2 16.22 -0.6 17.4 15\"/>`,\n arcTriangle: `<path d=\"M2.6 10L6.3 5L13.7 15L17.4 10\"/>`,\n arcSquare: `<path d=\"M2.6 10L2.6 5L10 5L10 15L17.4 15L17.4 10\"/>`,\n arcSawtooth: `<path d=\"M2.6 10L10 5L10 15L17.4 10\"/>`,\n arcStair: `<path d=\"M2.6 10L4.97 10L4.97 5L8.82 5L8.82 10L11.18 10L11.18 15L15.03 15L15.03 10L17.4 10\"/>`,\n arcZigzag: `<path d=\"M2.6 10L4.45 5L8.15 15L10 10L11.85 5L15.55 15L17.4 10\"/>`,\n arcRipple: `<path d=\"M2.6 10C3.22 7.38 3.83 5 4.45 5C5.07 5 5.68 7.38 6.3 10C6.92 12.62 7.53 15 8.15 15C8.77 15 9.38 12.62 10 10C10.62 7.38 11.23 5 11.85 5C12.47 5 13.08 7.38 13.7 10C14.32 12.62 14.93 15 15.55 15C16.17 15 16.78 12.62 17.4 10\"/>`,\n arcHop: `<path d=\"M2.6 15Q6.3 -5 10 15M10 15Q13.7 4 17.4 15\"/>`,\n arcCusp: `<path d=\"M2.6 15Q7.34 12.8 10 5Q12.66 12.8 17.4 15\"/>`,\n\n // Curves\n curveLine: `<path d=\"M2.6 10.72H17.4\"/>`,\n curveParabola: `<path d=\"M2.6 15.72Q10 -4.28 17.4 15.72\"/>`,\n curveCircle: `<path d=\"M2.6 15.72A7.4 7.4 0 0 1 17.4 15.72\"/>`,\n curveEllipse: `<path d=\"M2.6 15.72A7.4 10 0 0 1 17.4 15.72\"/>`,\n curveHyperbola: `<path d=\"M2.6 15.72C2.91 15.08 3.8 13.12 4.48 11.86C5.16 10.61 5.76 9.21 6.68 8.19C7.6 7.16 8.89 5.72 10 5.72C11.11 5.72 12.4 7.16 13.32 8.19C14.24 9.21 14.84 10.61 15.52 11.86C16.2 13.12 17.09 15.08 17.4 15.72\"/>`,\n curveHyperbolaPair: `<path d=\"M2.6 15.72C2.91 15.08 3.8 13.12 4.48 11.86C5.16 10.61 5.76 9.21 6.68 8.19C7.6 7.16 8.89 5.72 10 5.72C11.11 5.72 12.4 7.16 13.32 8.19C14.24 9.21 14.84 10.61 15.52 11.86C16.2 13.12 17.09 15.08 17.4 15.72M2.6 5.72C2.91 6.36 3.8 8.32 4.48 9.58C5.16 10.83 5.76 12.23 6.68 13.25C7.6 14.28 8.89 15.72 10 15.72C11.11 15.72 12.4 14.28 13.32 13.25C14.24 12.23 14.84 10.83 15.52 9.58C16.2 8.32 17.09 6.36 17.4 5.72\"/>`,\n curveCubic: `<path d=\"M2.6 15.72C2.88 15.27 3.59 13.78 4.3 13.01C5 12.24 5.89 11.49 6.84 11.11C7.79 10.73 8.95 10.85 10 10.72C11.05 10.59 12.21 10.71 13.16 10.33C14.11 9.95 15 9.2 15.7 8.43C16.41 7.66 17.12 6.17 17.4 5.72\"/>`,\n curveQuartic: `<path d=\"M2.6 15.28C2.98 15.06 4.27 14.67 4.88 13.94C5.49 13.22 5.8 11.93 6.27 10.92C6.74 9.92 7.08 8.79 7.7 7.93C8.32 7.06 9.23 5.72 10 5.72C10.77 5.72 11.68 7.06 12.3 7.93C12.92 8.79 13.26 9.92 13.73 10.92C14.2 11.93 14.51 13.22 15.12 13.94C15.73 14.67 17.02 15.06 17.4 15.28\"/>`,\n curveSqrt: `<path d=\"M2.6 15.72C2.8 15.25 3.19 13.72 3.77 12.91C4.36 12.1 5.27 11.46 6.1 10.86C6.93 10.25 7.86 9.75 8.77 9.26C9.69 8.77 10.63 8.35 11.58 7.93C12.53 7.51 13.5 7.13 14.47 6.76C15.44 6.4 16.91 5.89 17.4 5.72\"/>`,\n curveReciprocal: `<path d=\"M2.6 15.72C2.69 15.31 2.91 14.08 3.15 13.28C3.39 12.49 3.66 11.68 4.06 10.96C4.46 10.24 4.95 9.53 5.55 8.97C6.15 8.41 6.89 7.97 7.63 7.61C8.37 7.25 9.19 7.01 9.99 6.79C10.79 6.57 11.62 6.43 12.44 6.29C13.26 6.15 14.09 6.05 14.91 5.96C15.74 5.86 16.99 5.76 17.4 5.72\"/>`,\n curveAbs: `<path d=\"M2.6 5.72L10 15.72L17.4 5.72\"/>`,\n curveCusp: `<path d=\"M2.6 15.72Q7.34 13.52 10 5.72Q12.66 13.52 17.4 15.72\"/>`,\n curveExponential: `<path d=\"M2.6 15.72C3.12 15.64 4.69 15.47 5.72 15.26C6.74 15.04 7.78 14.79 8.76 14.42C9.73 14.05 10.7 13.59 11.57 13.01C12.44 12.44 13.26 11.74 13.98 10.99C14.7 10.23 15.32 9.37 15.89 8.49C16.46 7.61 17.15 6.18 17.4 5.72\"/>`,\n curveLogarithm: `<path d=\"M2.6 15.72C2.72 15.34 3.01 14.18 3.35 13.47C3.68 12.76 4.11 12.07 4.61 11.46C5.11 10.86 5.72 10.32 6.35 9.85C6.97 9.37 7.67 8.98 8.37 8.61C9.07 8.25 9.81 7.94 10.55 7.66C11.28 7.37 12.04 7.12 12.79 6.89C13.55 6.66 14.32 6.45 15.09 6.26C15.85 6.06 17.01 5.81 17.4 5.72\"/>`,\n curveDecay: `<path d=\"M2.6 5.72C2.84 6.19 3.5 7.64 4.06 8.53C4.61 9.43 5.22 10.31 5.94 11.08C6.65 11.85 7.47 12.56 8.34 13.13C9.22 13.71 10.2 14.16 11.19 14.52C12.17 14.88 13.22 15.11 14.26 15.31C15.29 15.51 16.88 15.65 17.4 15.72\"/>`,\n curveSigmoid: `<path d=\"M2.6 15.72C3.11 15.62 4.75 15.55 5.68 15.14C6.61 14.74 7.46 14.02 8.18 13.29C8.9 12.55 9.39 11.58 10 10.72C10.61 9.86 11.1 8.89 11.82 8.15C12.54 7.42 13.39 6.7 14.32 6.3C15.25 5.89 16.89 5.82 17.4 5.72\"/>`,\n curveSoftplus: `<path d=\"M2.6 15.72C3.13 15.7 4.74 15.73 5.79 15.62C6.85 15.5 7.95 15.42 8.92 15.03C9.89 14.65 10.79 14 11.59 13.32C12.38 12.63 13.03 11.75 13.7 10.93C14.37 10.1 14.97 9.22 15.59 8.35C16.2 7.48 17.1 6.16 17.4 5.72\"/>`,\n curveRelu: `<path d=\"M2.6 15.72L10 15.72L17.4 5.72\"/>`,\n curveStep: `<path d=\"M2.6 15.72L10 15.72L10 5.72L17.4 5.72\"/>`,\n curvePowerLaw: `<path d=\"M2.6 15.72C2.62 15.25 2.67 13.85 2.74 12.91C2.81 11.98 2.83 11.03 3.01 10.12C3.19 9.21 3.27 8.11 3.8 7.45C4.33 6.78 5.32 6.39 6.18 6.13C7.04 5.87 8.04 5.93 8.98 5.87C9.91 5.81 10.85 5.8 11.78 5.78C12.72 5.76 13.66 5.75 14.59 5.74C15.53 5.73 16.93 5.72 17.4 5.72\"/>`,\n curveCatenary: `<path d=\"M2.6 5.72C2.86 6.4 3.53 8.49 4.16 9.8C4.79 11.11 5.4 12.57 6.37 13.55C7.34 14.54 8.79 15.72 10 15.72C11.21 15.72 12.66 14.54 13.63 13.55C14.6 12.57 15.21 11.11 15.84 9.8C16.47 8.49 17.14 6.4 17.4 5.72\"/>`,\n curveBathtub: `<path d=\"M2.6 5.72C2.71 6.29 2.98 8.02 3.27 9.14C3.57 10.27 3.81 11.47 4.37 12.45C4.92 13.43 5.67 14.5 6.61 15.04C7.55 15.59 8.87 15.72 10 15.72C11.13 15.72 12.45 15.59 13.39 15.04C14.33 14.5 15.08 13.43 15.63 12.45C16.19 11.47 16.43 10.27 16.73 9.14C17.02 8.02 17.29 6.29 17.4 5.72\"/>`,\n curveHockeyStick: `<path d=\"M2.6 15.72C3.15 15.68 4.81 15.61 5.91 15.5C7.01 15.39 8.12 15.31 9.19 15.06C10.26 14.8 11.38 14.51 12.3 13.96C13.23 13.41 14.08 12.61 14.75 11.76C15.42 10.91 15.89 9.86 16.33 8.86C16.78 7.85 17.22 6.24 17.4 5.72\"/>`,\n curveSine: `<path d=\"M2.6 10.72C3.83 8.1 5.07 5.72 6.3 5.72C7.53 5.72 8.77 8.1 10 10.72C11.23 13.34 12.47 15.72 13.7 15.72C14.93 15.72 16.17 13.34 17.4 10.72\"/>`,\n curveCosine: `<path d=\"M2.6 5.72C3.83 5.72 5.07 8.1 6.3 10.72C7.53 13.34 8.77 15.72 10 15.72C11.23 15.72 12.47 13.34 13.7 10.72C14.93 8.1 16.17 5.72 17.4 5.72\"/>`,\n curveRipple: `<path d=\"M2.6 10.72C3.22 8.1 3.83 5.72 4.45 5.72C5.07 5.72 5.68 8.1 6.3 10.72C6.92 13.34 7.53 15.72 8.15 15.72C8.77 15.72 9.38 13.34 10 10.72C10.62 8.1 11.23 5.72 11.85 5.72C12.47 5.72 13.08 8.1 13.7 10.72C14.32 13.34 14.93 15.72 15.55 15.72C16.17 15.72 16.78 13.34 17.4 10.72\"/>`,\n curveTriangleWave: `<path d=\"M2.6 10.72L6.3 5.72L13.7 15.72L17.4 10.72\"/>`,\n curveSquareWave: `<path d=\"M2.6 10.72L2.6 5.72L10 5.72L10 15.72L17.4 15.72L17.4 10.72\"/>`,\n curveSawtooth: `<path d=\"M2.6 10.72L10 5.72L10 15.72L17.4 10.72\"/>`,\n curveStair: `<path d=\"M2.6 10.72L4.97 10.72L4.97 5.72L8.82 5.72L8.82 10.72L11.18 10.72L11.18 15.72L15.03 15.72L15.03 10.72L17.4 10.72\"/>`,\n curvePulseTrain: `<path d=\"M2.6 10.72L4.23 10.72L4.23 5.72L6.3 5.72L6.3 10.72L8.96 10.72L8.96 5.72L11.04 5.72L11.04 10.72L13.7 10.72L13.7 5.72L15.77 5.72L15.77 10.72L17.4 10.72\"/>`,\n curveDamped: `<path d=\"M2.6 5.72C2.95 6.01 3.3 6.7 3.66 7.55C4.01 8.39 4.36 9.37 4.71 10.24C5.07 11.11 5.42 11.86 5.77 12.37C6.12 12.87 6.48 13.13 6.83 13.15C7.18 13.17 7.53 12.96 7.89 12.63C8.24 12.3 8.59 11.86 8.94 11.42C9.3 10.99 9.65 10.57 10 10.25C10.35 9.94 10.7 9.72 11.06 9.63C11.41 9.54 11.76 9.56 12.11 9.67C12.47 9.77 12.82 9.96 13.17 10.16C13.52 10.36 13.88 10.57 14.23 10.75C14.58 10.93 14.93 11.08 15.29 11.16C15.64 11.25 15.99 11.28 16.34 11.26C16.7 11.24 17.05 11.17 17.4 11.09\"/>`,\n curveChirp: `<path d=\"M2.6 10.72C2.85 10.33 3.09 9.84 3.34 9.28C3.59 8.73 3.83 8.1 4.08 7.53C4.33 6.96 4.57 6.45 4.82 6.23C5.07 6.01 5.31 6.1 5.56 6.66C5.81 7.22 6.05 8.29 6.3 9.65C6.55 11 6.79 12.65 7.04 13.83C7.29 15.01 7.53 15.64 7.78 15.14C8.03 14.64 8.27 12.95 8.52 10.95C8.77 8.95 9.01 6.8 9.26 6.26C9.51 5.72 9.75 7.01 10 9.3C10.25 11.59 10.49 14.54 10.74 15.18C10.99 15.82 11.23 13.76 11.48 10.95C11.73 8.14 11.97 5.47 12.22 6.3C12.47 7.13 12.71 11.45 12.96 13.83C13.21 16.2 13.45 15.12 13.7 11.79C13.95 8.47 14.19 4.96 14.44 6.66C14.69 8.37 14.93 14.36 15.18 15.21C15.43 16.05 15.67 10.43 15.92 7.53C16.17 4.63 16.41 8.14 16.66 12.16C16.91 16.17 17.15 15.15 17.4 10.72\"/>`,\n curveBeat: `<path d=\"M2.6 10.72C2.81 10.72 3.01 10.48 3.22 10.2C3.42 9.92 3.63 9.65 3.83 9.69C4.04 9.73 4.24 10.11 4.45 10.72C4.66 11.33 4.86 12.16 5.07 12.71C5.27 13.26 5.48 13.5 5.68 13.15C5.89 12.79 6.09 11.86 6.3 10.72C6.51 9.58 6.71 8.3 6.92 7.56C7.12 6.82 7.33 6.66 7.53 7.27C7.74 7.88 7.94 9.24 8.15 10.72C8.36 12.2 8.56 13.75 8.77 14.57C8.97 15.39 9.18 15.44 9.38 14.67C9.59 13.9 9.79 12.33 10 10.72C10.21 9.11 10.41 7.54 10.62 6.77C10.82 6 11.03 6.05 11.23 6.87C11.44 7.69 11.64 9.24 11.85 10.72C12.06 12.2 12.26 13.56 12.47 14.17C12.67 14.78 12.88 14.62 13.08 13.88C13.29 13.14 13.49 11.86 13.7 10.72C13.91 9.58 14.11 8.65 14.32 8.29C14.52 7.94 14.73 8.18 14.93 8.73C15.14 9.28 15.34 10.11 15.55 10.72C15.76 11.33 15.96 11.71 16.17 11.75C16.37 11.79 16.58 11.52 16.78 11.24C16.99 10.96 17.19 10.72 17.4 10.72\"/>`,\n curveGaussian: `<path d=\"M2.6 15.72C3.13 15.57 4.98 15.47 5.78 14.83C6.57 14.18 6.92 12.87 7.35 11.84C7.79 10.8 7.97 9.62 8.41 8.6C8.85 7.58 9.47 5.72 10 5.72C10.53 5.72 11.15 7.58 11.59 8.6C12.03 9.62 12.21 10.8 12.65 11.84C13.08 12.87 13.43 14.18 14.22 14.83C15.02 15.47 16.87 15.57 17.4 15.72\"/>`,\n curveBimodal: `<path d=\"M2.6 15.72C2.95 15.39 4.21 14.57 4.67 13.73C5.14 12.89 5.17 11.7 5.39 10.68C5.62 9.66 5.69 8.28 6 7.6C6.31 6.92 6.93 6.26 7.24 6.61C7.56 6.96 7.69 8.66 7.9 9.68C8.12 10.7 8.19 11.81 8.54 12.75C8.89 13.7 9.51 15.36 10 15.36C10.49 15.36 11.11 13.7 11.46 12.75C11.81 11.81 11.88 10.7 12.1 9.68C12.31 8.66 12.44 6.96 12.76 6.61C13.07 6.26 13.69 6.92 14 7.6C14.31 8.28 14.38 9.66 14.61 10.68C14.83 11.7 14.86 12.89 15.33 13.73C15.79 14.57 17.05 15.39 17.4 15.72\"/>`,\n curveSkewed: `<path d=\"M2.6 15.72C2.76 15.32 3.35 14.19 3.58 13.35C3.82 12.5 3.87 11.55 4.02 10.65C4.17 9.75 4.22 8.78 4.5 7.96C4.79 7.14 5.26 5.74 5.71 5.75C6.15 5.76 6.71 7.24 7.15 8.03C7.6 8.82 7.92 9.69 8.38 10.47C8.85 11.25 9.32 12.06 9.94 12.71C10.56 13.36 11.3 13.96 12.09 14.37C12.88 14.78 13.8 15.01 14.69 15.2C15.57 15.39 16.95 15.46 17.4 15.52\"/>`,\n curveLorentzian: `<path d=\"M2.6 15.72C3.06 15.64 4.52 15.6 5.35 15.26C6.18 14.92 7.02 14.36 7.57 13.66C8.11 12.96 8.34 11.97 8.62 11.08C8.89 10.2 8.99 9.25 9.22 8.35C9.45 7.46 9.74 5.72 10 5.72C10.26 5.72 10.55 7.46 10.78 8.35C11.01 9.25 11.11 10.2 11.38 11.08C11.66 11.97 11.89 12.96 12.43 13.66C12.98 14.36 13.82 14.92 14.65 15.26C15.48 15.6 16.94 15.64 17.4 15.72\"/>`,\n curveOgive: `<path d=\"M2.6 15.72C3.13 15.66 4.83 15.71 5.79 15.34C6.75 14.97 7.64 14.25 8.35 13.48C9.05 12.71 9.45 11.64 10 10.72C10.55 9.8 10.95 8.73 11.65 7.96C12.36 7.19 13.25 6.47 14.21 6.1C15.17 5.73 16.87 5.78 17.4 5.72\"/>`,\n curveUniform: `<path d=\"M2.6 15.72V9.32A3.6 3.6 0 0 1 6.2 5.72H13.8A3.6 3.6 0 0 1 17.4 9.32V15.72\"/>`,\n curveSinc: `<path d=\"M2.6 15.72C2.83 15.6 3.61 15.35 4.01 15.02C4.4 14.69 4.68 14.18 4.96 13.72C5.25 13.27 5.49 12.78 5.73 12.3C5.97 11.82 6.19 11.33 6.42 10.84C6.65 10.35 6.86 9.86 7.1 9.37C7.33 8.89 7.55 8.39 7.82 7.93C8.08 7.46 8.32 6.93 8.69 6.57C9.05 6.2 9.56 5.72 10 5.72C10.44 5.72 10.95 6.2 11.31 6.57C11.68 6.93 11.92 7.46 12.18 7.93C12.45 8.39 12.67 8.89 12.9 9.37C13.14 9.86 13.35 10.35 13.58 10.84C13.81 11.33 14.03 11.82 14.27 12.3C14.51 12.78 14.75 13.27 15.04 13.72C15.32 14.18 15.6 14.69 15.99 15.02C16.39 15.35 17.17 15.6 17.4 15.72\"/>`,\n curveImpulse: `<path d=\"M2.6 15.72L9.7 15.72L10 5.72L10.3 15.72L17.4 15.72\"/>`,\n curveEaseIn: `<path d=\"M2.6 15.72C3.13 15.7 4.75 15.75 5.8 15.62C6.86 15.49 7.94 15.31 8.93 14.94C9.91 14.57 10.87 14.01 11.72 13.38C12.56 12.75 13.31 11.95 14 11.14C14.7 10.34 15.29 9.43 15.86 8.53C16.42 7.63 17.14 6.19 17.4 5.72\"/>`,\n curveEaseOut: `<path d=\"M2.6 15.72C2.86 15.25 3.58 13.81 4.14 12.91C4.71 12.01 5.3 11.1 6 10.3C6.69 9.49 7.44 8.69 8.28 8.06C9.13 7.43 10.09 6.87 11.07 6.5C12.06 6.13 13.14 5.95 14.2 5.82C15.25 5.69 16.87 5.74 17.4 5.72\"/>`,\n curveEaseInOut: `<path d=\"M2.6 15.72C3 15.69 4.23 15.75 4.99 15.55C5.75 15.36 6.53 15.01 7.16 14.55C7.79 14.09 8.32 13.43 8.79 12.8C9.26 12.16 9.6 11.41 10 10.72C10.4 10.03 10.74 9.28 11.21 8.64C11.68 8.01 12.21 7.35 12.84 6.89C13.47 6.43 14.25 6.08 15.01 5.89C15.77 5.69 17 5.75 17.4 5.72\"/>`,\n curveOvershoot: `<path d=\"M2.6 15.72C2.76 15.33 3.2 14.15 3.54 13.39C3.88 12.62 4.24 11.86 4.64 11.13C5.05 10.4 5.48 9.67 6 9.02C6.51 8.36 7.06 7.7 7.72 7.19C8.37 6.69 9.14 6.25 9.92 6.01C10.7 5.77 11.57 5.73 12.4 5.73C13.23 5.73 14.07 5.92 14.9 6C15.73 6.08 16.98 6.18 17.4 6.22\"/>`,\n curveBounce: `<path d=\"M2.6 15.72Q6 -4.28 9.41 15.72M9.41 15.72Q11.63 6.72 13.85 15.72M13.85 15.72Q15.18 12.12 16.51 15.72M16.51 15.72Q16.96 14.72 17.4 15.72\"/>`,\n curveElastic: `<path d=\"M2.6 15.72C2.91 15.01 3.22 13.44 3.53 11.66C3.83 9.87 4.14 7.89 4.45 6.23C4.76 4.58 5.07 3.25 5.38 2.45C5.68 1.65 5.99 1.37 6.3 1.5C6.61 1.63 6.92 2.17 7.23 2.85C7.53 3.53 7.84 4.35 8.15 5.07C8.46 5.79 8.77 6.41 9.07 6.82C9.38 7.24 9.69 7.44 10 7.46C10.31 7.47 10.62 7.31 10.93 7.06C11.23 6.81 11.54 6.48 11.85 6.18C12.16 5.87 12.47 5.59 12.77 5.39C13.08 5.18 13.39 5.06 13.7 5.02C14.01 4.99 14.32 5.03 14.62 5.11C14.93 5.2 15.24 5.33 15.55 5.45C15.86 5.58 16.17 5.71 16.47 5.8C16.78 5.9 17.09 5.96 17.4 5.99\"/>`,\n curveLemniscate: `<path d=\"M17.4 11.12C17.4 11.98 16.91 12.8 16.23 13.25C15.54 13.7 14.73 13.8 14.01 13.7C13.29 13.6 12.66 13.3 12.11 12.95C11.57 12.6 11.1 12.19 10.65 11.76C10.21 11.34 9.79 10.9 9.35 10.48C8.9 10.05 8.43 9.64 7.89 9.29C7.34 8.94 6.71 8.64 5.99 8.54C5.27 8.44 4.46 8.54 3.77 8.99C3.09 9.44 2.6 10.26 2.6 11.12C2.6 11.98 3.09 12.8 3.77 13.25C4.46 13.7 5.27 13.8 5.99 13.7C6.71 13.6 7.34 13.3 7.89 12.95C8.43 12.6 8.9 12.19 9.35 11.76C9.79 11.34 10.21 10.9 10.65 10.48C11.1 10.05 11.57 9.64 12.11 9.29C12.66 8.94 13.29 8.64 14.01 8.54C14.73 8.44 15.54 8.54 16.23 8.99C16.91 9.44 17.4 10.26 17.4 11.12\"/>`,\n curveCardioid: `<path d=\"M10 6.14C10 6.14 10 6.09 10.03 6C10.06 5.91 10.13 5.78 10.24 5.63C10.36 5.48 10.54 5.31 10.77 5.16C11.01 5.01 11.32 4.88 11.68 4.8C12.04 4.72 12.45 4.69 12.91 4.74C13.36 4.79 13.84 4.92 14.32 5.15C14.8 5.38 15.27 5.71 15.7 6.14C16.12 6.56 16.5 7.08 16.79 7.69C17.08 8.29 17.28 8.96 17.36 9.68C17.44 10.4 17.4 11.15 17.23 11.9C17.06 12.65 16.76 13.39 16.33 14.07C15.9 14.75 15.35 15.37 14.7 15.89C14.05 16.41 13.3 16.82 12.5 17.1C11.7 17.38 10.85 17.53 10 17.53C9.15 17.53 8.3 17.38 7.5 17.1C6.7 16.82 5.95 16.41 5.3 15.89C4.65 15.37 4.1 14.75 3.67 14.07C3.24 13.39 2.94 12.65 2.77 11.9C2.6 11.15 2.56 10.4 2.64 9.68C2.72 8.96 2.92 8.29 3.21 7.69C3.5 7.08 3.88 6.56 4.3 6.14C4.73 5.71 5.2 5.38 5.68 5.15C6.16 4.92 6.64 4.79 7.09 4.74C7.55 4.69 7.96 4.72 8.32 4.8C8.68 4.88 8.99 5.01 9.23 5.16C9.46 5.31 9.64 5.48 9.76 5.63C9.87 5.78 9.94 5.91 9.97 6C10 6.09 10 6.14 10 6.14\"/>`,\n curveAstroid: `<path d=\"M17.4 11.12C17.4 11.12 17.02 11.13 16.37 11.34C15.72 11.55 14.81 11.97 13.92 12.62C13.02 13.27 12.15 14.14 11.5 15.04C10.85 15.93 10.43 16.84 10.22 17.49C10.01 18.14 10 18.52 10 18.52C10 18.52 9.99 18.14 9.78 17.49C9.57 16.84 9.15 15.93 8.5 15.04C7.85 14.14 6.98 13.27 6.08 12.62C5.19 11.97 4.28 11.55 3.63 11.34C2.98 11.13 2.6 11.12 2.6 11.12C2.6 11.12 2.98 11.11 3.63 10.9C4.28 10.69 5.19 10.27 6.08 9.62C6.98 8.97 7.85 8.1 8.5 7.2C9.15 6.31 9.57 5.4 9.78 4.75C9.99 4.1 10 3.72 10 3.72C10 3.72 10.01 4.1 10.22 4.75C10.43 5.4 10.85 6.31 11.5 7.2C12.15 8.1 13.02 8.97 13.92 9.62C14.81 10.27 15.72 10.69 16.37 10.9C17.02 11.11 17.4 11.12 17.4 11.12\"/>`,\n curveRose: `<path d=\"M16.57 11.12C16.57 11.49 16.32 11.85 15.86 12.13C15.4 12.42 14.72 12.61 13.9 12.66C13.08 12.71 12.13 12.61 11.13 12.35C10.14 12.09 9.11 11.67 8.16 11.12C7.21 10.57 6.33 9.89 5.61 9.16C4.89 8.43 4.32 7.65 3.96 6.92C3.59 6.18 3.42 5.5 3.43 4.96C3.44 4.42 3.64 4.02 3.96 3.84C4.27 3.65 4.71 3.68 5.19 3.94C5.66 4.2 6.17 4.69 6.62 5.38C7.07 6.06 7.47 6.94 7.74 7.93C8.01 8.92 8.16 10.02 8.16 11.12C8.16 12.22 8.01 13.32 7.74 14.31C7.47 15.3 7.07 16.18 6.62 16.86C6.17 17.55 5.66 18.04 5.19 18.3C4.71 18.56 4.27 18.59 3.96 18.4C3.64 18.22 3.44 17.82 3.43 17.28C3.42 16.74 3.59 16.06 3.96 15.32C4.32 14.59 4.89 13.81 5.61 13.08C6.33 12.35 7.21 11.67 8.16 11.12C9.11 10.57 10.14 10.15 11.13 9.89C12.13 9.63 13.08 9.53 13.9 9.58C14.72 9.63 15.4 9.82 15.86 10.11C16.32 10.39 16.57 10.75 16.57 11.12C16.57 11.49 16.32 11.85 15.86 12.13C15.4 12.42 14.72 12.61 13.9 12.66C13.08 12.71 12.13 12.61 11.13 12.35C10.14 12.09 9.11 11.67 8.16 11.12C7.21 10.57 6.33 9.89 5.61 9.16C4.89 8.43 4.32 7.65 3.96 6.92C3.59 6.18 3.42 5.5 3.43 4.96C3.44 4.42 3.64 4.02 3.96 3.84C4.27 3.65 4.71 3.68 5.19 3.94C5.66 4.2 6.17 4.69 6.62 5.38C7.07 6.06 7.47 6.94 7.74 7.93C8.01 8.92 8.16 10.02 8.16 11.12C8.16 12.22 8.01 13.32 7.74 14.31C7.47 15.3 7.07 16.18 6.62 16.86C6.17 17.55 5.66 18.04 5.19 18.3C4.71 18.56 4.27 18.59 3.96 18.4C3.64 18.22 3.44 17.82 3.43 17.28C3.42 16.74 3.59 16.06 3.96 15.32C4.32 14.59 4.89 13.81 5.61 13.08C6.33 12.35 7.21 11.67 8.16 11.12C9.11 10.57 10.14 10.15 11.13 9.89C12.13 9.63 13.08 9.53 13.9 9.58C14.72 9.63 15.4 9.82 15.86 10.11C16.32 10.39 16.57 10.75 16.57 11.12\"/>`,\n curveSpiral: `<path d=\"M10.77 12.22C10.92 12.38 11.02 12.66 10.97 12.97C10.93 13.28 10.74 13.62 10.42 13.86C10.09 14.1 9.63 14.24 9.13 14.18C8.63 14.13 8.1 13.88 7.69 13.45C7.29 13.01 7 12.38 6.97 11.68C6.94 10.98 7.15 10.22 7.63 9.58C8.11 8.94 8.85 8.43 9.73 8.21C10.6 7.99 11.6 8.08 12.51 8.5C13.42 8.93 14.22 9.7 14.71 10.69C15.19 11.68 15.35 12.89 15.09 14.07C14.83 15.24 14.14 16.38 13.12 17.2C12.1 18.02 10.75 18.51 9.34 18.52C7.93 18.53 6.47 18.04 5.28 17.11C4.09 16.18 3.19 14.8 2.81 13.23C2.43 11.66 2.59 9.91 3.31 8.35C4.03 6.79 5.31 5.44 6.94 4.61C8.56 3.79 10.51 3.51 12.4 3.89C14.28 4.27 16.08 5.31 17.39 6.85\"/>`,\n curveLissajous: `<path d=\"M10 11.12C11.66 12.23 13.32 13.33 14.61 14.33C15.91 15.33 16.84 16.22 17.21 16.91C17.58 17.6 17.39 18.09 16.67 18.33C15.95 18.58 14.71 18.58 13.21 18.33C11.71 18.09 9.97 17.6 8.35 16.91C6.73 16.22 5.25 15.33 4.21 14.33C3.18 13.33 2.6 12.23 2.6 11.12C2.6 10.01 3.18 8.91 4.21 7.91C5.25 6.91 6.73 6.02 8.35 5.33C9.97 4.64 11.71 4.15 13.21 3.91C14.71 3.66 15.95 3.66 16.67 3.91C17.39 4.15 17.58 4.64 17.21 5.33C16.84 6.02 15.91 6.91 14.61 7.91C13.32 8.91 11.66 10.01 10 11.12C8.34 12.23 6.68 13.33 5.39 14.33C4.09 15.33 3.16 16.22 2.79 16.91C2.42 17.6 2.61 18.09 3.33 18.33C4.05 18.58 5.29 18.58 6.79 18.33C8.29 18.09 10.03 17.6 11.65 16.91C13.27 16.22 14.75 15.33 15.79 14.33C16.82 13.33 17.4 12.23 17.4 11.12C17.4 10.01 16.82 8.91 15.79 7.91C14.75 6.91 13.27 6.02 11.65 5.33C10.03 4.64 8.29 4.15 6.79 3.91C5.29 3.66 4.05 3.66 3.33 3.91C2.61 4.15 2.42 4.64 2.79 5.33C3.16 6.02 4.09 6.91 5.39 7.91C6.68 8.91 8.34 10.01 10 11.12\"/>`,\n curveCycloid: `<path d=\"M2.6 15.72C2.6 15.72 2.6 15.49 2.66 15.05C2.71 14.61 2.82 13.98 3.03 13.22C3.23 12.46 3.53 11.59 3.94 10.72C4.36 9.85 4.88 8.98 5.49 8.22C6.11 7.46 6.82 6.83 7.59 6.39C8.36 5.95 9.18 5.72 10 5.72C10.82 5.72 11.64 5.95 12.41 6.39C13.18 6.83 13.89 7.46 14.51 8.22C15.12 8.98 15.64 9.85 16.06 10.72C16.47 11.59 16.77 12.46 16.97 13.22C17.18 13.98 17.29 14.61 17.34 15.05C17.4 15.49 17.4 15.72 17.4 15.72\"/>`,\n curveSuperellipse: `<path d=\"M17.4 11.12C17.4 14.45 17.38 12.98 17.34 13.46C17.31 13.94 17.25 14.34 17.17 14.69C17.1 15.05 17 15.37 16.89 15.66C16.78 15.94 16.64 16.21 16.49 16.44C16.34 16.68 16.16 16.9 15.97 17.09C15.78 17.28 15.56 17.46 15.32 17.61C15.09 17.76 14.82 17.9 14.54 18.01C14.25 18.12 13.93 18.22 13.57 18.29C13.22 18.37 12.82 18.43 12.34 18.46C11.86 18.5 13.33 18.52 10 18.52C6.67 18.52 8.14 18.5 7.66 18.46C7.18 18.43 6.78 18.37 6.43 18.29C6.07 18.22 5.75 18.12 5.46 18.01C5.18 17.9 4.91 17.76 4.68 17.61C4.44 17.46 4.22 17.28 4.03 17.09C3.84 16.9 3.66 16.68 3.51 16.44C3.36 16.21 3.22 15.94 3.11 15.66C3 15.37 2.9 15.05 2.83 14.69C2.75 14.34 2.69 13.94 2.66 13.46C2.62 12.98 2.6 14.45 2.6 11.12C2.6 7.79 2.62 9.26 2.66 8.78C2.69 8.3 2.75 7.9 2.83 7.55C2.9 7.19 3 6.87 3.11 6.58C3.22 6.3 3.36 6.03 3.51 5.8C3.66 5.56 3.84 5.34 4.03 5.15C4.22 4.96 4.44 4.78 4.68 4.63C4.91 4.48 5.18 4.34 5.46 4.23C5.75 4.12 6.07 4.02 6.43 3.95C6.78 3.87 7.18 3.81 7.66 3.78C8.14 3.74 6.67 3.72 10 3.72C13.33 3.72 11.86 3.74 12.34 3.78C12.82 3.81 13.22 3.87 13.57 3.95C13.93 4.02 14.25 4.12 14.54 4.23C14.82 4.34 15.09 4.48 15.32 4.63C15.56 4.78 15.78 4.96 15.97 5.15C16.16 5.34 16.34 5.56 16.49 5.8C16.64 6.03 16.78 6.3 16.89 6.58C17 6.87 17.1 7.19 17.17 7.55C17.25 7.9 17.31 8.3 17.34 8.78C17.38 9.26 17.4 7.79 17.4 11.12\"/>`,\n curveTangent: `<path d=\"M2.6 10.72C2.66 10.67 2.82 10.51 2.93 10.4C3.04 10.29 3.16 10.18 3.27 10.06C3.38 9.94 3.49 9.82 3.6 9.69C3.71 9.56 3.82 9.43 3.93 9.28C4.04 9.13 4.15 8.97 4.26 8.78C4.38 8.59 4.49 8.4 4.6 8.14C4.71 7.89 4.82 7.64 4.93 7.26C5.04 6.88 5.21 6.12 5.26 5.89M7.34 15.55C7.45 15.17 7.78 13.86 8 13.3C8.22 12.73 8.45 12.48 8.67 12.16C8.89 11.84 9.11 11.62 9.33 11.38C9.56 11.14 9.78 10.94 10 10.72C10.22 10.5 10.44 10.3 10.67 10.06C10.89 9.82 11.11 9.6 11.33 9.28C11.55 8.96 11.78 8.71 12 8.14C12.22 7.58 12.55 6.27 12.66 5.89M14.74 15.55C14.79 15.32 14.96 14.56 15.07 14.18C15.18 13.8 15.29 13.55 15.4 13.3C15.51 13.04 15.62 12.85 15.73 12.66C15.85 12.47 15.96 12.31 16.07 12.16C16.18 12.01 16.29 11.88 16.4 11.75C16.51 11.62 16.62 11.5 16.73 11.38C16.85 11.26 16.96 11.15 17.07 11.04C17.18 10.93 17.34 10.77 17.4 10.72\"/>`,\n curveCotangent: `<path d=\"M3.64 5.89C3.75 6.27 4.08 7.58 4.3 8.14C4.52 8.71 4.75 8.96 4.97 9.28C5.19 9.6 5.41 9.82 5.63 10.06C5.86 10.3 6.08 10.5 6.3 10.72C6.52 10.94 6.74 11.14 6.97 11.38C7.19 11.62 7.41 11.84 7.63 12.16C7.85 12.48 8.08 12.73 8.3 13.3C8.52 13.86 8.85 15.17 8.96 15.55M11.04 5.89C11.15 6.27 11.48 7.58 11.7 8.14C11.92 8.71 12.15 8.96 12.37 9.28C12.59 9.6 12.81 9.82 13.03 10.06C13.26 10.3 13.48 10.5 13.7 10.72C13.92 10.94 14.14 11.14 14.37 11.38C14.59 11.62 14.81 11.84 15.03 12.16C15.25 12.48 15.48 12.73 15.7 13.3C15.92 13.86 16.25 15.17 16.36 15.55\"/>`,\n curveSecant: `<path d=\"M2.6 12.64C2.66 12.65 2.82 12.65 2.93 12.66C3.04 12.68 3.16 12.69 3.27 12.72C3.38 12.75 3.49 12.78 3.6 12.83C3.71 12.88 3.82 12.93 3.93 13C4.04 13.07 4.15 13.14 4.26 13.25C4.38 13.35 4.49 13.47 4.6 13.63C4.71 13.79 4.82 13.95 4.93 14.22C5.04 14.49 5.2 15.01 5.26 15.24C5.33 15.46 5.33 15.51 5.34 15.56M7.26 5.88C7.37 6.18 7.71 7.28 7.93 7.7C8.15 8.12 8.37 8.23 8.59 8.39C8.82 8.56 9.04 8.63 9.26 8.7C9.48 8.76 9.7 8.79 9.93 8.8C10.15 8.8 10.37 8.79 10.59 8.73C10.81 8.68 11.04 8.62 11.26 8.49C11.48 8.35 11.7 8.24 11.92 7.91C12.15 7.58 12.45 6.82 12.59 6.48C12.73 6.15 12.71 5.98 12.74 5.88M14.66 15.56C14.72 15.37 14.88 14.7 15 14.4C15.11 14.1 15.22 13.92 15.33 13.74C15.44 13.56 15.55 13.44 15.66 13.32C15.77 13.2 15.88 13.12 15.99 13.05C16.11 12.97 16.22 12.91 16.33 12.86C16.44 12.81 16.55 12.77 16.66 12.74C16.77 12.71 16.88 12.69 16.99 12.67C17.1 12.66 17.26 12.65 17.33 12.64C17.39 12.64 17.39 12.64 17.4 12.64\"/>`,\n curveCosecant: `<path d=\"M3.56 15.56C3.67 15.26 4.01 14.16 4.23 13.74C4.45 13.32 4.67 13.21 4.89 13.05C5.12 12.88 5.34 12.81 5.56 12.74C5.78 12.68 6 12.65 6.23 12.64C6.45 12.64 6.67 12.65 6.89 12.71C7.11 12.76 7.34 12.82 7.56 12.95C7.78 13.09 8 13.2 8.22 13.53C8.45 13.86 8.75 14.62 8.89 14.96C9.03 15.29 9.01 15.46 9.04 15.56M10.96 5.88C11.07 6.18 11.41 7.28 11.63 7.7C11.85 8.12 12.07 8.23 12.29 8.39C12.52 8.56 12.74 8.63 12.96 8.7C13.18 8.76 13.4 8.79 13.63 8.8C13.85 8.8 14.07 8.79 14.29 8.73C14.51 8.68 14.74 8.62 14.96 8.49C15.18 8.35 15.4 8.24 15.62 7.91C15.85 7.58 16.15 6.82 16.29 6.48C16.43 6.15 16.41 5.98 16.44 5.88\"/>`,\n curveArcsine: `<path d=\"M2.6 15.72C2.85 15.38 3.59 14.16 4.08 13.67C4.57 13.18 5.07 13.04 5.56 12.77C6.05 12.49 6.55 12.26 7.04 12.03C7.53 11.8 8.03 11.58 8.52 11.36C9.01 11.14 9.51 10.93 10 10.72C10.49 10.51 10.99 10.3 11.48 10.08C11.97 9.86 12.47 9.64 12.96 9.41C13.45 9.18 13.95 8.95 14.44 8.67C14.93 8.4 15.43 8.26 15.92 7.77C16.41 7.28 17.15 6.06 17.4 5.72\"/>`,\n curveAsymptote: `<path d=\"M2.6 12.61C2.69 12.64 2.97 12.71 3.16 12.77C3.34 12.82 3.53 12.88 3.71 12.95C3.9 13.01 4.08 13.08 4.26 13.16C4.45 13.24 4.64 13.33 4.82 13.43C5.01 13.52 5.19 13.63 5.38 13.75C5.56 13.87 5.75 14 5.93 14.16C6.11 14.32 6.3 14.49 6.49 14.71C6.67 14.92 6.92 15.29 7.04 15.45C7.16 15.62 7.16 15.66 7.19 15.7M12.81 5.74C12.9 5.87 13.18 6.32 13.37 6.56C13.55 6.79 13.74 6.97 13.92 7.15C14.11 7.32 14.29 7.46 14.48 7.59C14.66 7.72 14.85 7.83 15.03 7.93C15.22 8.04 15.4 8.13 15.59 8.21C15.77 8.3 15.96 8.37 16.14 8.44C16.33 8.51 16.51 8.57 16.7 8.63C16.88 8.69 17.13 8.75 17.25 8.79C17.37 8.82 17.38 8.82 17.4 8.83\"/>`,\n\n // Shapes\n shapeTriangle: `<path d=\"M10 3.59L17.4 16.41L2.6 16.41Z\" stroke-linejoin=\"miter\"/>`,\n shapeRightTriangle: `<path d=\"M2.6 17.4L2.6 2.6L17.4 17.4Z\" stroke-linejoin=\"miter\"/>`,\n shapeSquare: `<path d=\"M2.6 2.6L17.4 2.6L17.4 17.4L2.6 17.4Z\" stroke-linejoin=\"miter\"/>`,\n shapeRectangle: `<path d=\"M2.6 5.37L17.4 5.37L17.4 14.63L2.6 14.63Z\" stroke-linejoin=\"miter\"/>`,\n shapeDiamond: `<path d=\"M10 2.6L17.4 10L10 17.4L2.6 10Z\" stroke-linejoin=\"miter\"/>`,\n shapeParallelogram: `<path d=\"M5.35 4.71L17.4 4.71L14.65 15.29L2.6 15.29Z\" stroke-linejoin=\"miter\"/>`,\n shapeTrapezoid: `<path d=\"M5.35 4.71L14.65 4.71L17.4 15.29L2.6 15.29Z\" stroke-linejoin=\"miter\"/>`,\n shapeKite: `<path d=\"M10 2.6L16.43 7.75L10 17.4L3.57 7.75Z\" stroke-linejoin=\"miter\"/>`,\n shapePentagon: `<path d=\"M10 2.96L17.4 8.34L14.57 17.04L5.43 17.04L2.6 8.34Z\" stroke-linejoin=\"miter\"/>`,\n shapeHexagon: `<path d=\"M10 2.6L16.41 6.3L16.41 13.7L10 17.4L3.59 13.7L3.59 6.3Z\" stroke-linejoin=\"miter\"/>`,\n shapeHexagonFlat: `<path d=\"M17.4 10L13.7 16.41L6.3 16.41L2.6 10L6.3 3.59L13.7 3.59Z\" stroke-linejoin=\"miter\"/>`,\n shapeHeptagon: `<path d=\"M10 2.79L15.93 5.64L17.4 12.06L13.29 17.21L6.71 17.21L2.6 12.06L4.07 5.64Z\" stroke-linejoin=\"miter\"/>`,\n shapeOctagon: `<path d=\"M13.07 2.6L17.4 6.93L17.4 13.07L13.07 17.4L6.93 17.4L2.6 13.07L2.6 6.93L6.93 2.6Z\" stroke-linejoin=\"miter\"/>`,\n shapeDecagon: `<path d=\"M10 2.6L14.35 4.01L17.04 7.71L17.04 12.29L14.35 15.99L10 17.4L5.65 15.99L2.96 12.29L2.96 7.71L5.65 4.01Z\" stroke-linejoin=\"miter\"/>`,\n shapeDodecagon: `<path d=\"M10 2.6L13.7 3.59L16.41 6.3L17.4 10L16.41 13.7L13.7 16.41L10 17.4L6.3 16.41L3.59 13.7L2.6 10L3.59 6.3L6.3 3.59Z\" stroke-linejoin=\"miter\"/>`,\n shapeCross: `<path d=\"M7.63 2.6L12.37 2.6L12.37 7.63L17.4 7.63L17.4 12.37L12.37 12.37L12.37 17.4L7.63 17.4L7.63 12.37L2.6 12.37L2.6 7.63L7.63 7.63Z\" stroke-linejoin=\"miter\"/>`,\n shapeLShape: `<path d=\"M2.6 2.6L8.82 2.6L8.82 11.78L17.4 11.78L17.4 17.4L2.6 17.4Z\" stroke-linejoin=\"miter\"/>`,\n shapeChevron: `<path d=\"M2.6 4.38L10 10.59L17.4 4.38L17.4 9.41L10 15.62L2.6 9.41Z\" stroke-linejoin=\"miter\"/>`,\n shapeStar: `<path d=\"M10 2.96L12.2 7.72L17.4 8.34L13.55 11.9L14.57 17.04L10 14.48L5.43 17.04L6.45 11.9L2.6 8.34L7.8 7.72Z\" stroke-linejoin=\"miter\"/>`,\n shapeStar4: `<path d=\"M10 2.6L11.99 8.01L17.4 10L11.99 11.99L10 17.4L8.01 11.99L2.6 10L8.01 8.01Z\" stroke-linejoin=\"miter\"/>`,\n shapeStar6: `<path d=\"M10 2.6L12.07 6.41L16.41 6.3L14.14 10L16.41 13.7L12.07 13.59L10 17.4L7.93 13.59L3.59 13.7L5.86 10L3.59 6.3L7.93 6.41Z\" stroke-linejoin=\"miter\"/>`,\n shapeStar8: `<path d=\"M10 2.6L11.76 5.76L15.23 4.77L14.24 8.24L17.4 10L14.24 11.76L15.23 15.23L11.76 14.24L10 17.4L8.24 14.24L4.77 15.23L5.76 11.76L2.6 10L5.76 8.24L4.77 4.77L8.24 5.76Z\" stroke-linejoin=\"miter\"/>`,\n shapePentagram: `<path d=\"M10 2.96L14.57 17.04L2.6 8.34L17.4 8.34L5.43 17.04Z\" stroke-linejoin=\"miter\"/>`,\n shapeCircle: `<path d=\"M2.6 10A7.4 7.4 0 1 1 17.4 10A7.4 7.4 0 1 1 2.6 10Z\"/>`,\n shapeEllipse: `<path d=\"M2.6 10A7.4 4.74 0 1 1 17.4 10A7.4 4.74 0 1 1 2.6 10Z\"/>`,\n shapeSemicircle: `<path d=\"M2.6 13.7A7.4 7.4 0 0 1 17.4 13.7Z\"/>`,\n shapeQuarter: `<path d=\"M2.6 17.4V2.6A14.8 14.8 0 0 1 17.4 17.4Z\"/>`,\n shapeStadium: `<path d=\"M6.74 5.86H13.26A4.14 4.14 0 0 1 13.26 14.14H6.74A4.14 4.14 0 0 1 6.74 5.86Z\"/>`,\n shapeRoundedSquare: `<path d=\"M6 2.6H14A3.4 3.4 0 0 1 17.4 6V14A3.4 3.4 0 0 1 14 17.4H6A3.4 3.4 0 0 1 2.6 14V6A3.4 3.4 0 0 1 6 2.6Z\"/>`,\n shapeRing: `<path d=\"M2.6 10A7.4 7.4 0 1 1 17.4 10A7.4 7.4 0 1 1 2.6 10ZM6.15 10A3.85 3.85 0 1 0 13.85 10A3.85 3.85 0 1 0 6.15 10Z\"/>`,\n shapeCrescent: `<path d=\"M6.3 2.6A7.4 7.4 0 1 1 6.3 17.4A8.51 8.51 0 0 0 6.3 2.6Z\"/>`,\n shapeLens: `<path d=\"M10 2.6A9.99 9.99 0 0 1 10 17.4A9.99 9.99 0 0 1 10 2.6Z\"/>`,\n shapeSector: `<path d=\"M10 14.63L2.6 9.06A9.27 9.27 0 0 1 17.4 9.06Z\"/>`,\n shapeSegment: `<path d=\"M2.6 12.59A7.88 7.88 0 0 1 17.4 12.59Z\"/>`,\n shapeArch: `<path d=\"M2.6 17.4V10A7.4 7.4 0 0 1 17.4 10V17.4Z\"/>`,\n shapeTeardrop: `<path d=\"M10 2.6L5.9 10.75A4.59 4.59 0 1 0 14.1 10.75Z\"/>`,\n shapeEgg: `<path d=\"M10 2.6C14.59 2.6 16.07 9.26 16.07 12.22C16.07 15.77 13.26 17.4 10 17.4C6.74 17.4 3.93 15.77 3.93 12.22C3.93 9.26 5.41 2.6 10 2.6Z\"/>`,\n shapeHeart: `<path d=\"M10 6.51L10.01 6.42L10.05 6.16L10.18 5.76L10.41 5.26L10.78 4.72L11.27 4.2L11.89 3.76L12.62 3.45L13.42 3.31L14.25 3.36L15.08 3.61L15.84 4.03L16.48 4.62L16.98 5.33L17.29 6.12L17.4 6.97L17.29 7.84L16.98 8.7L16.48 9.54L15.84 10.34L15.08 11.12L14.25 11.86L13.42 12.57L12.62 13.27L11.89 13.93L11.27 14.56L10.78 15.14L10.41 15.66L10.18 16.09L10.05 16.41L10.01 16.62L10 16.69L9.99 16.62L9.95 16.41L9.82 16.09L9.59 15.66L9.22 15.14L8.73 14.56L8.11 13.93L7.38 13.27L6.58 12.57L5.75 11.86L4.92 11.12L4.16 10.34L3.52 9.54L3.02 8.7L2.71 7.84L2.6 6.97L2.71 6.12L3.02 5.33L3.52 4.62L4.16 4.03L4.92 3.61L5.75 3.36L6.58 3.31L7.38 3.45L8.11 3.76L8.73 4.2L9.22 4.72L9.59 5.26L9.82 5.76L9.95 6.16L9.99 6.42L10 6.51Z\"/>`,\n shapeAngle: `<path d=\"M17.4 16.34L2.6 16.34L14.8 3.66M6.12 16.34A3.52 3.52 0 0 0 5.04 13.8\"/>`,\n\n // Platonic solids\n d4: `<path d=\"M2.6 14.47L10 3.31L17.4 14.47L10 16.69Z\" stroke-linejoin=\"miter\" stroke-width=\"1\"/><path d=\"M10 16.69L10 3.31\" stroke-width=\"0.6\"/>`,\n d6: `<path d=\"M3.59 6.3L10 2.6L16.41 6.3L16.41 13.7L10 17.4L3.59 13.7Z\" stroke-linejoin=\"miter\" stroke-width=\"1\"/><path d=\"M10 10L16.41 6.3M10 17.4L10 10M10 10L3.59 6.3\" stroke-width=\"0.6\"/>`,\n d8: `<path d=\"M2.85 9.6L10 2.6L17.15 10.4L10 17.4Z\" stroke-linejoin=\"miter\" stroke-width=\"1\"/><path d=\"M7.68 11.24L2.85 9.6M10 2.6L7.68 11.24M7.68 11.24L10 17.4M17.15 10.4L7.68 11.24\" stroke-width=\"0.6\"/>`,\n d12: `<path d=\"M2.96 7.71L5.65 4.01L10 2.6L14.35 4.01L17.04 7.71L17.04 12.29L14.35 15.99L10 17.4L5.65 15.99L2.96 12.29Z\" stroke-linejoin=\"miter\" stroke-width=\"1\"/><path d=\"M10 5.43L10 2.6M14.35 8.59L10 5.43M17.04 7.71L14.35 8.59M14.35 8.59L12.69 13.7M5.65 8.59L10 5.43M7.31 13.7L5.65 8.59M12.69 13.7L7.31 13.7M5.65 8.59L2.96 7.71M14.35 15.99L12.69 13.7M5.65 15.99L7.31 13.7\" stroke-width=\"0.6\"/>`,\n d20: `<path d=\"M3.59 13.7L3.59 6.3L10 2.6L16.41 6.3L16.41 13.7L10 17.4Z\" stroke-linejoin=\"miter\" stroke-width=\"1\"/><path d=\"M10 5.43L13.96 12.29M6.04 12.29L10 5.43M13.96 12.29L6.04 12.29M3.59 6.3L10 5.43M6.04 12.29L3.59 6.3M10 5.43L10 2.6M16.41 6.3L10 5.43M16.41 6.3L13.96 12.29M6.04 12.29L10 17.4M3.59 13.7L6.04 12.29M13.96 12.29L10 17.4M16.41 13.7L13.96 12.29\" stroke-width=\"0.6\"/>`,\n} as const;\n\n/** Every glyph name in the set. */\nexport type IconName = keyof typeof ICON_PATHS;\n\n/** The region a glyph encloses, for `<Icon filled>`. A shape fills its own\n * outline; a plotted curve fills down to the frame's baseline, reaching the outer\n * edge of the stroke rather than stopping at the path's own endpoint. Only the\n * glyphs where an enclosed region means something have an entry. */\nexport const ICON_FILLS = {\n arcStraight: `<path d=\"M1.85 15L2.6 15H17.4L18.15 15L18.15 15.75L1.85 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcParabola: `<path d=\"M2.31 15.69L2.6 15Q10 -5 17.4 15L17.69 15.69L17.69 15.75L2.31 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcCircle: `<path d=\"M2.52 15.75L2.6 15A7.4 7.4 0 0 1 17.4 15L17.48 15.75L17.48 15.75L2.52 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcSine: `<path d=\"M2.28 10.68L2.6 10C3.83 7.38 5.07 5 6.3 5C7.53 5 8.77 7.38 10 10C11.23 12.62 12.47 15 13.7 15C14.93 15 16.17 12.62 17.4 10L17.72 9.32L17.72 15.75L2.28 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcBump: `<path d=\"M1.87 15.18L2.6 15C3.83 15 5.07 11.87 6.3 9.38C7.53 6.88 8.77 5 10 5C11.23 5 12.47 6.88 13.7 9.38C14.93 11.87 16.17 15 17.4 15L18.13 15.18L18.13 15.75L1.87 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcPlateau: `<path d=\"M2.6 15.75L2.6 15V8.6A3.6 3.6 0 0 1 6.2 5H13.8A3.6 3.6 0 0 1 17.4 8.6V15L17.4 15.75L17.4 15.75L2.6 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcBell: `<path d=\"M1.86 15.13L2.6 15C3.42 14.87 4.24 14.6 5.07 13.65C5.89 12.7 6.71 10.87 7.53 8.87C8.36 6.86 9.18 5 10 5C10.82 5 11.64 6.86 12.47 8.87C13.29 10.87 14.11 12.7 14.93 13.65C15.76 14.6 16.58 14.87 17.4 15L18.14 15.13L18.14 15.75L1.86 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcEllipse: `<path d=\"M2.54 15.75L2.6 15A7.4 10 0 0 1 17.4 15L17.46 15.75L17.46 15.75L2.54 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcLob: `<path d=\"M2.5 15.74L2.6 15C3.78 -0.6 10.74 4.2 17.4 15L17.81 15.63L17.81 15.75L2.5 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcDive: `<path d=\"M2.19 15.63L2.6 15C9.26 4.2 16.22 -0.6 17.4 15L17.5 15.74L17.5 15.75L2.19 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcTriangle: `<path d=\"M2.15 10.6L2.6 10L6.3 5L13.7 15L17.4 10L17.85 9.4L17.85 15.75L2.15 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcSquare: `<path d=\"M2.6 10.75L2.6 10L2.6 5L10 5L10 15L17.4 15L17.4 10L17.4 9.25L17.4 15.75L2.6 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcSawtooth: `<path d=\"M1.98 10.42L2.6 10L10 5L10 15L17.4 10L18.02 9.58L18.02 15.75L1.98 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcStair: `<path d=\"M1.85 10L2.6 10L4.97 10L4.97 5L8.82 5L8.82 10L11.18 10L11.18 15L15.03 15L15.03 10L17.4 10L18.15 10L18.15 15.75L1.85 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcZigzag: `<path d=\"M2.34 10.7L2.6 10L4.45 5L8.15 15L10 10L11.85 5L15.55 15L17.4 10L17.66 9.3L17.66 15.75L2.34 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcRipple: `<path d=\"M2.43 10.73L2.6 10C3.22 7.38 3.83 5 4.45 5C5.07 5 5.68 7.38 6.3 10C6.92 12.62 7.53 15 8.15 15C8.77 15 9.38 12.62 10 10C10.62 7.38 11.23 5 11.85 5C12.47 5 13.08 7.38 13.7 10C14.32 12.62 14.93 15 15.55 15C16.17 15 16.78 12.62 17.4 10L17.57 9.27L17.57 15.75L2.43 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcHop: `<path d=\"M2.45 15.73L2.6 15Q6.3 -5 10 15L10.15 15.73L10.15 15.75L2.45 15.75ZM9.74 15.7L10 15Q13.7 4 17.4 15L17.66 15.7L17.66 15.75L9.74 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n arcCusp: `<path d=\"M1.94 15.35L2.6 15Q7.34 12.8 10 5Q12.66 12.8 17.4 15L18.06 15.35L18.06 15.75L1.94 15.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveLine: `<path d=\"M1.85 10.72L2.6 10.72H17.4L18.15 10.72L18.15 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveParabola: `<path d=\"M2.31 16.41L2.6 15.72Q10 -4.28 17.4 15.72L17.69 16.41L17.69 16.47L2.31 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveCircle: `<path d=\"M2.52 16.47L2.6 15.72A7.4 7.4 0 0 1 17.4 15.72L17.48 16.47L17.48 16.47L2.52 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveEllipse: `<path d=\"M2.54 16.47L2.6 15.72A7.4 10 0 0 1 17.4 15.72L17.46 16.47L17.46 16.47L2.54 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveHyperbola: `<path d=\"M2.28 16.4L2.6 15.72C2.91 15.08 3.8 13.12 4.48 11.86C5.16 10.61 5.76 9.21 6.68 8.19C7.6 7.16 8.89 5.72 10 5.72C11.11 5.72 12.4 7.16 13.32 8.19C14.24 9.21 14.84 10.61 15.52 11.86C16.2 13.12 17.09 15.08 17.4 15.72L17.72 16.4L17.72 16.47L2.28 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveCubic: `<path d=\"M2.22 16.37L2.6 15.72C2.88 15.27 3.59 13.78 4.3 13.01C5 12.24 5.89 11.49 6.84 11.11C7.79 10.73 8.95 10.85 10 10.72C11.05 10.59 12.21 10.71 13.16 10.33C14.11 9.95 15 9.2 15.7 8.43C16.41 7.66 17.12 6.17 17.4 5.72L17.78 5.07L17.78 16.47L2.22 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveQuartic: `<path d=\"M1.93 15.62L2.6 15.28C2.98 15.06 4.27 14.67 4.88 13.94C5.49 13.22 5.8 11.93 6.27 10.92C6.74 9.92 7.08 8.79 7.7 7.93C8.32 7.06 9.23 5.72 10 5.72C10.77 5.72 11.68 7.06 12.3 7.93C12.92 8.79 13.26 9.92 13.73 10.92C14.2 11.93 14.51 13.22 15.12 13.94C15.73 14.67 17.02 15.06 17.4 15.28L18.07 15.62L18.07 16.47L1.93 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSqrt: `<path d=\"M2.33 16.42L2.6 15.72C2.8 15.25 3.19 13.72 3.77 12.91C4.36 12.1 5.27 11.46 6.1 10.86C6.93 10.25 7.86 9.75 8.77 9.26C9.69 8.77 10.63 8.35 11.58 7.93C12.53 7.51 13.5 7.13 14.47 6.76C15.44 6.4 16.91 5.89 17.4 5.72L18.11 5.47L18.11 16.47L2.33 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveReciprocal: `<path d=\"M2.45 16.45L2.6 15.72C2.69 15.31 2.91 14.08 3.15 13.28C3.39 12.49 3.66 11.68 4.06 10.96C4.46 10.24 4.95 9.53 5.55 8.97C6.15 8.41 6.89 7.97 7.63 7.61C8.37 7.25 9.19 7.01 9.99 6.79C10.79 6.57 11.62 6.43 12.44 6.29C13.26 6.15 14.09 6.05 14.91 5.96C15.74 5.86 16.99 5.76 17.4 5.72L18.15 5.65L18.15 16.47L2.45 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveAbs: `<path d=\"M2.15 5.12L2.6 5.72L10 15.72L17.4 5.72L17.85 5.12L17.85 16.47L2.15 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveCusp: `<path d=\"M1.94 16.07L2.6 15.72Q7.34 13.52 10 5.72Q12.66 13.52 17.4 15.72L18.06 16.07L18.06 16.47L1.94 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveExponential: `<path d=\"M1.86 15.83L2.6 15.72C3.12 15.64 4.69 15.47 5.72 15.26C6.74 15.04 7.78 14.79 8.76 14.42C9.73 14.05 10.7 13.59 11.57 13.01C12.44 12.44 13.26 11.74 13.98 10.99C14.7 10.23 15.32 9.37 15.89 8.49C16.46 7.61 17.15 6.18 17.4 5.72L17.75 5.06L17.75 16.47L1.86 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveLogarithm: `<path d=\"M2.38 16.44L2.6 15.72C2.72 15.34 3.01 14.18 3.35 13.47C3.68 12.76 4.11 12.07 4.61 11.46C5.11 10.86 5.72 10.32 6.35 9.85C6.97 9.37 7.67 8.98 8.37 8.61C9.07 8.25 9.81 7.94 10.55 7.66C11.28 7.37 12.04 7.12 12.79 6.89C13.55 6.66 14.32 6.45 15.09 6.26C15.85 6.06 17.01 5.81 17.4 5.72L18.13 5.55L18.13 16.47L2.38 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveDecay: `<path d=\"M2.27 5.05L2.6 5.72C2.84 6.19 3.5 7.64 4.06 8.53C4.61 9.43 5.22 10.31 5.94 11.08C6.65 11.85 7.47 12.56 8.34 13.13C9.22 13.71 10.2 14.16 11.19 14.52C12.17 14.88 13.22 15.11 14.26 15.31C15.29 15.51 16.88 15.65 17.4 15.72L18.14 15.81L18.14 16.47L2.27 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSigmoid: `<path d=\"M1.86 15.84L2.6 15.72C3.11 15.62 4.75 15.55 5.68 15.14C6.61 14.74 7.46 14.02 8.18 13.29C8.9 12.55 9.39 11.58 10 10.72C10.61 9.86 11.1 8.89 11.82 8.15C12.54 7.42 13.39 6.7 14.32 6.3C15.25 5.89 16.89 5.82 17.4 5.72L18.14 5.6L18.14 16.47L1.86 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSoftplus: `<path d=\"M1.85 15.74L2.6 15.72C3.13 15.7 4.74 15.73 5.79 15.62C6.85 15.5 7.95 15.42 8.92 15.03C9.89 14.65 10.79 14 11.59 13.32C12.38 12.63 13.03 11.75 13.7 10.93C14.37 10.1 14.97 9.22 15.59 8.35C16.2 7.48 17.1 6.16 17.4 5.72L17.82 5.1L17.82 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveRelu: `<path d=\"M1.85 15.72L2.6 15.72L10 15.72L17.4 5.72L17.85 5.12L17.85 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveStep: `<path d=\"M1.85 15.72L2.6 15.72L10 15.72L10 5.72L17.4 5.72L18.15 5.72L18.15 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curvePowerLaw: `<path d=\"M2.57 16.47L2.6 15.72C2.62 15.25 2.67 13.85 2.74 12.91C2.81 11.98 2.83 11.03 3.01 10.12C3.19 9.21 3.27 8.11 3.8 7.45C4.33 6.78 5.32 6.39 6.18 6.13C7.04 5.87 8.04 5.93 8.98 5.87C9.91 5.81 10.85 5.8 11.78 5.78C12.72 5.76 13.66 5.75 14.59 5.74C15.53 5.73 16.93 5.72 17.4 5.72L18.15 5.72L18.15 16.47L2.57 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveCatenary: `<path d=\"M2.34 5.02L2.6 5.72C2.86 6.4 3.53 8.49 4.16 9.8C4.79 11.11 5.4 12.57 6.37 13.55C7.34 14.54 8.79 15.72 10 15.72C11.21 15.72 12.66 14.54 13.63 13.55C14.6 12.57 15.21 11.11 15.84 9.8C16.47 8.49 17.14 6.4 17.4 5.72L17.66 5.02L17.66 16.47L2.34 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveBathtub: `<path d=\"M2.46 4.98L2.6 5.72C2.71 6.29 2.98 8.02 3.27 9.14C3.57 10.27 3.81 11.47 4.37 12.45C4.92 13.43 5.67 14.5 6.61 15.04C7.55 15.59 8.87 15.72 10 15.72C11.13 15.72 12.45 15.59 13.39 15.04C14.33 14.5 15.08 13.43 15.63 12.45C16.19 11.47 16.43 10.27 16.73 9.14C17.02 8.02 17.29 6.29 17.4 5.72L17.54 4.98L17.54 16.47L2.46 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveHockeyStick: `<path d=\"M1.85 15.77L2.6 15.72C3.15 15.68 4.81 15.61 5.91 15.5C7.01 15.39 8.12 15.31 9.19 15.06C10.26 14.8 11.38 14.51 12.3 13.96C13.23 13.41 14.08 12.61 14.75 11.76C15.42 10.91 15.89 9.86 16.33 8.86C16.78 7.85 17.22 6.24 17.4 5.72L17.63 5.01L17.63 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSine: `<path d=\"M2.28 11.4L2.6 10.72C3.83 8.1 5.07 5.72 6.3 5.72C7.53 5.72 8.77 8.1 10 10.72C11.23 13.34 12.47 15.72 13.7 15.72C14.93 15.72 16.17 13.34 17.4 10.72L17.72 10.04L17.72 16.47L2.28 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveCosine: `<path d=\"M1.86 5.58L2.6 5.72C3.83 5.72 5.07 8.1 6.3 10.72C7.53 13.34 8.77 15.72 10 15.72C11.23 15.72 12.47 13.34 13.7 10.72C14.93 8.1 16.17 5.72 17.4 5.72L18.14 5.58L18.14 16.47L1.86 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveRipple: `<path d=\"M2.43 11.45L2.6 10.72C3.22 8.1 3.83 5.72 4.45 5.72C5.07 5.72 5.68 8.1 6.3 10.72C6.92 13.34 7.53 15.72 8.15 15.72C8.77 15.72 9.38 13.34 10 10.72C10.62 8.1 11.23 5.72 11.85 5.72C12.47 5.72 13.08 8.1 13.7 10.72C14.32 13.34 14.93 15.72 15.55 15.72C16.17 15.72 16.78 13.34 17.4 10.72L17.57 9.99L17.57 16.47L2.43 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveTriangleWave: `<path d=\"M2.15 11.32L2.6 10.72L6.3 5.72L13.7 15.72L17.4 10.72L17.85 10.12L17.85 16.47L2.15 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSquareWave: `<path d=\"M2.6 11.47L2.6 10.72L2.6 5.72L10 5.72L10 15.72L17.4 15.72L17.4 10.72L17.4 9.97L17.4 16.47L2.6 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSawtooth: `<path d=\"M1.98 11.14L2.6 10.72L10 5.72L10 15.72L17.4 10.72L18.02 10.3L18.02 16.47L1.98 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveStair: `<path d=\"M1.85 10.72L2.6 10.72L4.97 10.72L4.97 5.72L8.82 5.72L8.82 10.72L11.18 10.72L11.18 15.72L15.03 15.72L15.03 10.72L17.4 10.72L18.15 10.72L18.15 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curvePulseTrain: `<path d=\"M1.85 10.72L2.6 10.72L4.23 10.72L4.23 5.72L6.3 5.72L6.3 10.72L8.96 10.72L8.96 5.72L11.04 5.72L11.04 10.72L13.7 10.72L13.7 5.72L15.77 5.72L15.77 10.72L17.4 10.72L18.15 10.72L18.15 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveDamped: `<path d=\"M2.05 5.21L2.6 5.72C2.95 6.01 3.3 6.7 3.66 7.55C4.01 8.39 4.36 9.37 4.71 10.24C5.07 11.11 5.42 11.86 5.77 12.37C6.12 12.87 6.48 13.13 6.83 13.15C7.18 13.17 7.53 12.96 7.89 12.63C8.24 12.3 8.59 11.86 8.94 11.42C9.3 10.99 9.65 10.57 10 10.25C10.35 9.94 10.7 9.72 11.06 9.63C11.41 9.54 11.76 9.56 12.11 9.67C12.47 9.77 12.82 9.96 13.17 10.16C13.52 10.36 13.88 10.57 14.23 10.75C14.58 10.93 14.93 11.08 15.29 11.16C15.64 11.25 15.99 11.28 16.34 11.26C16.7 11.24 17.05 11.17 17.4 11.09L18.13 10.93L18.13 16.47L2.05 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveGaussian: `<path d=\"M1.87 15.88L2.6 15.72C3.13 15.57 4.98 15.47 5.78 14.83C6.57 14.18 6.92 12.87 7.35 11.84C7.79 10.8 7.97 9.62 8.41 8.6C8.85 7.58 9.47 5.72 10 5.72C10.53 5.72 11.15 7.58 11.59 8.6C12.03 9.62 12.21 10.8 12.65 11.84C13.08 12.87 13.43 14.18 14.22 14.83C15.02 15.47 16.87 15.57 17.4 15.72L18.13 15.88L18.13 16.47L1.87 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveBimodal: `<path d=\"M2.03 16.21L2.6 15.72C2.95 15.39 4.21 14.57 4.67 13.73C5.14 12.89 5.17 11.7 5.39 10.68C5.62 9.66 5.69 8.28 6 7.6C6.31 6.92 6.93 6.26 7.24 6.61C7.56 6.96 7.69 8.66 7.9 9.68C8.12 10.7 8.19 11.81 8.54 12.75C8.89 13.7 9.51 15.36 10 15.36C10.49 15.36 11.11 13.7 11.46 12.75C11.81 11.81 11.88 10.7 12.1 9.68C12.31 8.66 12.44 6.96 12.76 6.61C13.07 6.26 13.69 6.92 14 7.6C14.31 8.28 14.38 9.66 14.61 10.68C14.83 11.7 14.86 12.89 15.33 13.73C15.79 14.57 17.05 15.39 17.4 15.72L17.97 16.21L17.97 16.47L2.03 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSkewed: `<path d=\"M2.31 16.41L2.6 15.72C2.76 15.32 3.35 14.19 3.58 13.35C3.82 12.5 3.87 11.55 4.02 10.65C4.17 9.75 4.22 8.78 4.5 7.96C4.79 7.14 5.26 5.74 5.71 5.75C6.15 5.76 6.71 7.24 7.15 8.03C7.6 8.82 7.92 9.69 8.38 10.47C8.85 11.25 9.32 12.06 9.94 12.71C10.56 13.36 11.3 13.96 12.09 14.37C12.88 14.78 13.8 15.01 14.69 15.2C15.57 15.39 16.95 15.46 17.4 15.52L18.15 15.6L18.15 16.47L2.31 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveLorentzian: `<path d=\"M1.86 15.82L2.6 15.72C3.06 15.64 4.52 15.6 5.35 15.26C6.18 14.92 7.02 14.36 7.57 13.66C8.11 12.96 8.34 11.97 8.62 11.08C8.89 10.2 8.99 9.25 9.22 8.35C9.45 7.46 9.74 5.72 10 5.72C10.26 5.72 10.55 7.46 10.78 8.35C11.01 9.25 11.11 10.2 11.38 11.08C11.66 11.97 11.89 12.96 12.43 13.66C12.98 14.36 13.82 14.92 14.65 15.26C15.48 15.6 16.94 15.64 17.4 15.72L18.14 15.82L18.14 16.47L1.86 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveOgive: `<path d=\"M1.85 15.78L2.6 15.72C3.13 15.66 4.83 15.71 5.79 15.34C6.75 14.97 7.64 14.25 8.35 13.48C9.05 12.71 9.45 11.64 10 10.72C10.55 9.8 10.95 8.73 11.65 7.96C12.36 7.19 13.25 6.47 14.21 6.1C15.17 5.73 16.87 5.78 17.4 5.72L18.15 5.66L18.15 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveUniform: `<path d=\"M2.6 16.47L2.6 15.72V9.32A3.6 3.6 0 0 1 6.2 5.72H13.8A3.6 3.6 0 0 1 17.4 9.32V15.72L17.4 16.47L17.4 16.47L2.6 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSinc: `<path d=\"M1.92 16.04L2.6 15.72C2.83 15.6 3.61 15.35 4.01 15.02C4.4 14.69 4.68 14.18 4.96 13.72C5.25 13.27 5.49 12.78 5.73 12.3C5.97 11.82 6.19 11.33 6.42 10.84C6.65 10.35 6.86 9.86 7.1 9.37C7.33 8.89 7.55 8.39 7.82 7.93C8.08 7.46 8.32 6.93 8.69 6.57C9.05 6.2 9.56 5.72 10 5.72C10.44 5.72 10.95 6.2 11.31 6.57C11.68 6.93 11.92 7.46 12.18 7.93C12.45 8.39 12.67 8.89 12.9 9.37C13.14 9.86 13.35 10.35 13.58 10.84C13.81 11.33 14.03 11.82 14.27 12.3C14.51 12.78 14.75 13.27 15.04 13.72C15.32 14.18 15.6 14.69 15.99 15.02C16.39 15.35 17.17 15.6 17.4 15.72L18.08 16.04L18.08 16.47L1.92 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveImpulse: `<path d=\"M1.85 15.72L2.6 15.72L9.7 15.72L10 5.72L10.3 15.72L17.4 15.72L18.15 15.72L18.15 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveEaseIn: `<path d=\"M1.85 15.74L2.6 15.72C3.13 15.7 4.75 15.75 5.8 15.62C6.86 15.49 7.94 15.31 8.93 14.94C9.91 14.57 10.87 14.01 11.72 13.38C12.56 12.75 13.31 11.95 14 11.14C14.7 10.34 15.29 9.43 15.86 8.53C16.42 7.63 17.14 6.19 17.4 5.72L17.76 5.06L17.76 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveEaseOut: `<path d=\"M2.24 16.38L2.6 15.72C2.86 15.25 3.58 13.81 4.14 12.91C4.71 12.01 5.3 11.1 6 10.3C6.69 9.49 7.44 8.69 8.28 8.06C9.13 7.43 10.09 6.87 11.07 6.5C12.06 6.13 13.14 5.95 14.2 5.82C15.25 5.69 16.87 5.74 17.4 5.72L18.15 5.7L18.15 16.47L2.24 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveEaseInOut: `<path d=\"M1.85 15.75L2.6 15.72C3 15.69 4.23 15.75 4.99 15.55C5.75 15.36 6.53 15.01 7.16 14.55C7.79 14.09 8.32 13.43 8.79 12.8C9.26 12.16 9.6 11.41 10 10.72C10.4 10.03 10.74 9.28 11.21 8.64C11.68 8.01 12.21 7.35 12.84 6.89C13.47 6.43 14.25 6.08 15.01 5.89C15.77 5.69 17 5.75 17.4 5.72L18.15 5.69L18.15 16.47L1.85 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveOvershoot: `<path d=\"M2.32 16.42L2.6 15.72C2.76 15.33 3.2 14.15 3.54 13.39C3.88 12.62 4.24 11.86 4.64 11.13C5.05 10.4 5.48 9.67 6 9.02C6.51 8.36 7.06 7.7 7.72 7.19C8.37 6.69 9.14 6.25 9.92 6.01C10.7 5.77 11.57 5.73 12.4 5.73C13.23 5.73 14.07 5.92 14.9 6C15.73 6.08 16.98 6.18 17.4 6.22L18.15 6.29L18.15 16.47L2.32 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveBounce: `<path d=\"M2.46 16.46L2.6 15.72Q6 -4.28 9.41 15.72L9.55 16.46L9.55 16.47L2.46 16.47ZM9.21 16.44L9.41 15.72Q11.63 6.72 13.85 15.72L14.05 16.44L14.05 16.47L9.21 16.47ZM13.57 16.41L13.85 15.72Q15.18 12.12 16.51 15.72L16.79 16.41L16.79 16.47L13.57 16.47ZM16.17 16.39L16.51 15.72Q16.96 14.72 17.4 15.72L17.73 16.39L17.73 16.47L16.17 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveElastic: `<path d=\"M2.33 16.42L2.6 15.72C2.91 15.01 3.22 13.44 3.53 11.66C3.83 9.87 4.14 7.89 4.45 6.23C4.76 4.58 5.07 3.25 5.38 2.45C5.68 1.65 5.99 1.37 6.3 1.5C6.61 1.63 6.92 2.17 7.23 2.85C7.53 3.53 7.84 4.35 8.15 5.07C8.46 5.79 8.77 6.41 9.07 6.82C9.38 7.24 9.69 7.44 10 7.46C10.31 7.47 10.62 7.31 10.93 7.06C11.23 6.81 11.54 6.48 11.85 6.18C12.16 5.87 12.47 5.59 12.77 5.39C13.08 5.18 13.39 5.06 13.7 5.02C14.01 4.99 14.32 5.03 14.62 5.11C14.93 5.2 15.24 5.33 15.55 5.45C15.86 5.58 16.17 5.71 16.47 5.8C16.78 5.9 17.09 5.96 17.4 5.99L18.15 6.07L18.15 16.47L2.33 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveLemniscate: `<path d=\"M17.4 11.12C17.4 11.98 16.91 12.8 16.23 13.25C15.54 13.7 14.73 13.8 14.01 13.7C13.29 13.6 12.66 13.3 12.11 12.95C11.57 12.6 11.1 12.19 10.65 11.76C10.21 11.34 9.79 10.9 9.35 10.48C8.9 10.05 8.43 9.64 7.89 9.29C7.34 8.94 6.71 8.64 5.99 8.54C5.27 8.44 4.46 8.54 3.77 8.99C3.09 9.44 2.6 10.26 2.6 11.12C2.6 11.98 3.09 12.8 3.77 13.25C4.46 13.7 5.27 13.8 5.99 13.7C6.71 13.6 7.34 13.3 7.89 12.95C8.43 12.6 8.9 12.19 9.35 11.76C9.79 11.34 10.21 10.9 10.65 10.48C11.1 10.05 11.57 9.64 12.11 9.29C12.66 8.94 13.29 8.64 14.01 8.54C14.73 8.44 15.54 8.54 16.23 8.99C16.91 9.44 17.4 10.26 17.4 11.12\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveCardioid: `<path d=\"M10 6.14C10 6.14 10 6.09 10.03 6C10.06 5.91 10.13 5.78 10.24 5.63C10.36 5.48 10.54 5.31 10.77 5.16C11.01 5.01 11.32 4.88 11.68 4.8C12.04 4.72 12.45 4.69 12.91 4.74C13.36 4.79 13.84 4.92 14.32 5.15C14.8 5.38 15.27 5.71 15.7 6.14C16.12 6.56 16.5 7.08 16.79 7.69C17.08 8.29 17.28 8.96 17.36 9.68C17.44 10.4 17.4 11.15 17.23 11.9C17.06 12.65 16.76 13.39 16.33 14.07C15.9 14.75 15.35 15.37 14.7 15.89C14.05 16.41 13.3 16.82 12.5 17.1C11.7 17.38 10.85 17.53 10 17.53C9.15 17.53 8.3 17.38 7.5 17.1C6.7 16.82 5.95 16.41 5.3 15.89C4.65 15.37 4.1 14.75 3.67 14.07C3.24 13.39 2.94 12.65 2.77 11.9C2.6 11.15 2.56 10.4 2.64 9.68C2.72 8.96 2.92 8.29 3.21 7.69C3.5 7.08 3.88 6.56 4.3 6.14C4.73 5.71 5.2 5.38 5.68 5.15C6.16 4.92 6.64 4.79 7.09 4.74C7.55 4.69 7.96 4.72 8.32 4.8C8.68 4.88 8.99 5.01 9.23 5.16C9.46 5.31 9.64 5.48 9.76 5.63C9.87 5.78 9.94 5.91 9.97 6C10 6.09 10 6.14 10 6.14\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveAstroid: `<path d=\"M17.4 11.12C17.4 11.12 17.02 11.13 16.37 11.34C15.72 11.55 14.81 11.97 13.92 12.62C13.02 13.27 12.15 14.14 11.5 15.04C10.85 15.93 10.43 16.84 10.22 17.49C10.01 18.14 10 18.52 10 18.52C10 18.52 9.99 18.14 9.78 17.49C9.57 16.84 9.15 15.93 8.5 15.04C7.85 14.14 6.98 13.27 6.08 12.62C5.19 11.97 4.28 11.55 3.63 11.34C2.98 11.13 2.6 11.12 2.6 11.12C2.6 11.12 2.98 11.11 3.63 10.9C4.28 10.69 5.19 10.27 6.08 9.62C6.98 8.97 7.85 8.1 8.5 7.2C9.15 6.31 9.57 5.4 9.78 4.75C9.99 4.1 10 3.72 10 3.72C10 3.72 10.01 4.1 10.22 4.75C10.43 5.4 10.85 6.31 11.5 7.2C12.15 8.1 13.02 8.97 13.92 9.62C14.81 10.27 15.72 10.69 16.37 10.9C17.02 11.11 17.4 11.12 17.4 11.12\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveRose: `<path d=\"M16.57 11.12C16.57 11.49 16.32 11.85 15.86 12.13C15.4 12.42 14.72 12.61 13.9 12.66C13.08 12.71 12.13 12.61 11.13 12.35C10.14 12.09 9.11 11.67 8.16 11.12C7.21 10.57 6.33 9.89 5.61 9.16C4.89 8.43 4.32 7.65 3.96 6.92C3.59 6.18 3.42 5.5 3.43 4.96C3.44 4.42 3.64 4.02 3.96 3.84C4.27 3.65 4.71 3.68 5.19 3.94C5.66 4.2 6.17 4.69 6.62 5.38C7.07 6.06 7.47 6.94 7.74 7.93C8.01 8.92 8.16 10.02 8.16 11.12C8.16 12.22 8.01 13.32 7.74 14.31C7.47 15.3 7.07 16.18 6.62 16.86C6.17 17.55 5.66 18.04 5.19 18.3C4.71 18.56 4.27 18.59 3.96 18.4C3.64 18.22 3.44 17.82 3.43 17.28C3.42 16.74 3.59 16.06 3.96 15.32C4.32 14.59 4.89 13.81 5.61 13.08C6.33 12.35 7.21 11.67 8.16 11.12C9.11 10.57 10.14 10.15 11.13 9.89C12.13 9.63 13.08 9.53 13.9 9.58C14.72 9.63 15.4 9.82 15.86 10.11C16.32 10.39 16.57 10.75 16.57 11.12C16.57 11.49 16.32 11.85 15.86 12.13C15.4 12.42 14.72 12.61 13.9 12.66C13.08 12.71 12.13 12.61 11.13 12.35C10.14 12.09 9.11 11.67 8.16 11.12C7.21 10.57 6.33 9.89 5.61 9.16C4.89 8.43 4.32 7.65 3.96 6.92C3.59 6.18 3.42 5.5 3.43 4.96C3.44 4.42 3.64 4.02 3.96 3.84C4.27 3.65 4.71 3.68 5.19 3.94C5.66 4.2 6.17 4.69 6.62 5.38C7.07 6.06 7.47 6.94 7.74 7.93C8.01 8.92 8.16 10.02 8.16 11.12C8.16 12.22 8.01 13.32 7.74 14.31C7.47 15.3 7.07 16.18 6.62 16.86C6.17 17.55 5.66 18.04 5.19 18.3C4.71 18.56 4.27 18.59 3.96 18.4C3.64 18.22 3.44 17.82 3.43 17.28C3.42 16.74 3.59 16.06 3.96 15.32C4.32 14.59 4.89 13.81 5.61 13.08C6.33 12.35 7.21 11.67 8.16 11.12C9.11 10.57 10.14 10.15 11.13 9.89C12.13 9.63 13.08 9.53 13.9 9.58C14.72 9.63 15.4 9.82 15.86 10.11C16.32 10.39 16.57 10.75 16.57 11.12\" fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\"/>`,\n curveLissajous: `<path d=\"M10 11.12C11.66 12.23 13.32 13.33 14.61 14.33C15.91 15.33 16.84 16.22 17.21 16.91C17.58 17.6 17.39 18.09 16.67 18.33C15.95 18.58 14.71 18.58 13.21 18.33C11.71 18.09 9.97 17.6 8.35 16.91C6.73 16.22 5.25 15.33 4.21 14.33C3.18 13.33 2.6 12.23 2.6 11.12C2.6 10.01 3.18 8.91 4.21 7.91C5.25 6.91 6.73 6.02 8.35 5.33C9.97 4.64 11.71 4.15 13.21 3.91C14.71 3.66 15.95 3.66 16.67 3.91C17.39 4.15 17.58 4.64 17.21 5.33C16.84 6.02 15.91 6.91 14.61 7.91C13.32 8.91 11.66 10.01 10 11.12C8.34 12.23 6.68 13.33 5.39 14.33C4.09 15.33 3.16 16.22 2.79 16.91C2.42 17.6 2.61 18.09 3.33 18.33C4.05 18.58 5.29 18.58 6.79 18.33C8.29 18.09 10.03 17.6 11.65 16.91C13.27 16.22 14.75 15.33 15.79 14.33C16.82 13.33 17.4 12.23 17.4 11.12C17.4 10.01 16.82 8.91 15.79 7.91C14.75 6.91 13.27 6.02 11.65 5.33C10.03 4.64 8.29 4.15 6.79 3.91C5.29 3.66 4.05 3.66 3.33 3.91C2.61 4.15 2.42 4.64 2.79 5.33C3.16 6.02 4.09 6.91 5.39 7.91C6.68 8.91 8.34 10.01 10 11.12\" fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\"/>`,\n curveCycloid: `<path d=\"M2.59 16.47L2.6 15.72C2.6 15.72 2.6 15.49 2.66 15.05C2.71 14.61 2.82 13.98 3.03 13.22C3.23 12.46 3.53 11.59 3.94 10.72C4.36 9.85 4.88 8.98 5.49 8.22C6.11 7.46 6.82 6.83 7.59 6.39C8.36 5.95 9.18 5.72 10 5.72C10.82 5.72 11.64 5.95 12.41 6.39C13.18 6.83 13.89 7.46 14.51 8.22C15.12 8.98 15.64 9.85 16.06 10.72C16.47 11.59 16.77 12.46 16.97 13.22C17.18 13.98 17.29 14.61 17.34 15.05C17.4 15.49 17.4 15.72 17.4 15.72L17.41 16.47L17.41 16.47L2.59 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveSuperellipse: `<path d=\"M17.4 11.12C17.4 14.45 17.38 12.98 17.34 13.46C17.31 13.94 17.25 14.34 17.17 14.69C17.1 15.05 17 15.37 16.89 15.66C16.78 15.94 16.64 16.21 16.49 16.44C16.34 16.68 16.16 16.9 15.97 17.09C15.78 17.28 15.56 17.46 15.32 17.61C15.09 17.76 14.82 17.9 14.54 18.01C14.25 18.12 13.93 18.22 13.57 18.29C13.22 18.37 12.82 18.43 12.34 18.46C11.86 18.5 13.33 18.52 10 18.52C6.67 18.52 8.14 18.5 7.66 18.46C7.18 18.43 6.78 18.37 6.43 18.29C6.07 18.22 5.75 18.12 5.46 18.01C5.18 17.9 4.91 17.76 4.68 17.61C4.44 17.46 4.22 17.28 4.03 17.09C3.84 16.9 3.66 16.68 3.51 16.44C3.36 16.21 3.22 15.94 3.11 15.66C3 15.37 2.9 15.05 2.83 14.69C2.75 14.34 2.69 13.94 2.66 13.46C2.62 12.98 2.6 14.45 2.6 11.12C2.6 7.79 2.62 9.26 2.66 8.78C2.69 8.3 2.75 7.9 2.83 7.55C2.9 7.19 3 6.87 3.11 6.58C3.22 6.3 3.36 6.03 3.51 5.8C3.66 5.56 3.84 5.34 4.03 5.15C4.22 4.96 4.44 4.78 4.68 4.63C4.91 4.48 5.18 4.34 5.46 4.23C5.75 4.12 6.07 4.02 6.43 3.95C6.78 3.87 7.18 3.81 7.66 3.78C8.14 3.74 6.67 3.72 10 3.72C13.33 3.72 11.86 3.74 12.34 3.78C12.82 3.81 13.22 3.87 13.57 3.95C13.93 4.02 14.25 4.12 14.54 4.23C14.82 4.34 15.09 4.48 15.32 4.63C15.56 4.78 15.78 4.96 15.97 5.15C16.16 5.34 16.34 5.56 16.49 5.8C16.64 6.03 16.78 6.3 16.89 6.58C17 6.87 17.1 7.19 17.17 7.55C17.25 7.9 17.31 8.3 17.34 8.78C17.38 9.26 17.4 7.79 17.4 11.12\" fill=\"currentColor\" stroke=\"none\"/>`,\n curveArcsine: `<path d=\"M2.17 16.33L2.6 15.72C2.85 15.38 3.59 14.16 4.08 13.67C4.57 13.18 5.07 13.04 5.56 12.77C6.05 12.49 6.55 12.26 7.04 12.03C7.53 11.8 8.03 11.58 8.52 11.36C9.01 11.14 9.51 10.93 10 10.72C10.49 10.51 10.99 10.3 11.48 10.08C11.97 9.86 12.47 9.64 12.96 9.41C13.45 9.18 13.95 8.95 14.44 8.67C14.93 8.4 15.43 8.26 15.92 7.77C16.41 7.28 17.15 6.06 17.4 5.72L17.83 5.11L17.83 16.47L2.17 16.47Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeTriangle: `<path d=\"M10 3.59L17.4 16.41L2.6 16.41Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeRightTriangle: `<path d=\"M2.6 17.4L2.6 2.6L17.4 17.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeSquare: `<path d=\"M2.6 2.6L17.4 2.6L17.4 17.4L2.6 17.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeRectangle: `<path d=\"M2.6 5.37L17.4 5.37L17.4 14.63L2.6 14.63Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeDiamond: `<path d=\"M10 2.6L17.4 10L10 17.4L2.6 10Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeParallelogram: `<path d=\"M5.35 4.71L17.4 4.71L14.65 15.29L2.6 15.29Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeTrapezoid: `<path d=\"M5.35 4.71L14.65 4.71L17.4 15.29L2.6 15.29Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeKite: `<path d=\"M10 2.6L16.43 7.75L10 17.4L3.57 7.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapePentagon: `<path d=\"M10 2.96L17.4 8.34L14.57 17.04L5.43 17.04L2.6 8.34Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeHexagon: `<path d=\"M10 2.6L16.41 6.3L16.41 13.7L10 17.4L3.59 13.7L3.59 6.3Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeHexagonFlat: `<path d=\"M17.4 10L13.7 16.41L6.3 16.41L2.6 10L6.3 3.59L13.7 3.59Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeHeptagon: `<path d=\"M10 2.79L15.93 5.64L17.4 12.06L13.29 17.21L6.71 17.21L2.6 12.06L4.07 5.64Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeOctagon: `<path d=\"M13.07 2.6L17.4 6.93L17.4 13.07L13.07 17.4L6.93 17.4L2.6 13.07L2.6 6.93L6.93 2.6Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeDecagon: `<path d=\"M10 2.6L14.35 4.01L17.04 7.71L17.04 12.29L14.35 15.99L10 17.4L5.65 15.99L2.96 12.29L2.96 7.71L5.65 4.01Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeDodecagon: `<path d=\"M10 2.6L13.7 3.59L16.41 6.3L17.4 10L16.41 13.7L13.7 16.41L10 17.4L6.3 16.41L3.59 13.7L2.6 10L3.59 6.3L6.3 3.59Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeCross: `<path d=\"M7.63 2.6L12.37 2.6L12.37 7.63L17.4 7.63L17.4 12.37L12.37 12.37L12.37 17.4L7.63 17.4L7.63 12.37L2.6 12.37L2.6 7.63L7.63 7.63Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeLShape: `<path d=\"M2.6 2.6L8.82 2.6L8.82 11.78L17.4 11.78L17.4 17.4L2.6 17.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeChevron: `<path d=\"M2.6 4.38L10 10.59L17.4 4.38L17.4 9.41L10 15.62L2.6 9.41Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeStar: `<path d=\"M10 2.96L12.2 7.72L17.4 8.34L13.55 11.9L14.57 17.04L10 14.48L5.43 17.04L6.45 11.9L2.6 8.34L7.8 7.72Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeStar4: `<path d=\"M10 2.6L11.99 8.01L17.4 10L11.99 11.99L10 17.4L8.01 11.99L2.6 10L8.01 8.01Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeStar6: `<path d=\"M10 2.6L12.07 6.41L16.41 6.3L14.14 10L16.41 13.7L12.07 13.59L10 17.4L7.93 13.59L3.59 13.7L5.86 10L3.59 6.3L7.93 6.41Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeStar8: `<path d=\"M10 2.6L11.76 5.76L15.23 4.77L14.24 8.24L17.4 10L14.24 11.76L15.23 15.23L11.76 14.24L10 17.4L8.24 14.24L4.77 15.23L5.76 11.76L2.6 10L5.76 8.24L4.77 4.77L8.24 5.76Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapePentagram: `<path d=\"M10 2.96L14.57 17.04L2.6 8.34L17.4 8.34L5.43 17.04Z\" fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\"/>`,\n shapeCircle: `<path d=\"M2.6 10A7.4 7.4 0 1 1 17.4 10A7.4 7.4 0 1 1 2.6 10Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeEllipse: `<path d=\"M2.6 10A7.4 4.74 0 1 1 17.4 10A7.4 4.74 0 1 1 2.6 10Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeSemicircle: `<path d=\"M2.6 13.7A7.4 7.4 0 0 1 17.4 13.7Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeQuarter: `<path d=\"M2.6 17.4V2.6A14.8 14.8 0 0 1 17.4 17.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeStadium: `<path d=\"M6.74 5.86H13.26A4.14 4.14 0 0 1 13.26 14.14H6.74A4.14 4.14 0 0 1 6.74 5.86Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeRoundedSquare: `<path d=\"M6 2.6H14A3.4 3.4 0 0 1 17.4 6V14A3.4 3.4 0 0 1 14 17.4H6A3.4 3.4 0 0 1 2.6 14V6A3.4 3.4 0 0 1 6 2.6Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeRing: `<path d=\"M2.6 10A7.4 7.4 0 1 1 17.4 10A7.4 7.4 0 1 1 2.6 10ZM6.15 10A3.85 3.85 0 1 0 13.85 10A3.85 3.85 0 1 0 6.15 10Z\" fill=\"currentColor\" stroke=\"none\" fill-rule=\"evenodd\"/>`,\n shapeCrescent: `<path d=\"M6.3 2.6A7.4 7.4 0 1 1 6.3 17.4A8.51 8.51 0 0 0 6.3 2.6Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeLens: `<path d=\"M10 2.6A9.99 9.99 0 0 1 10 17.4A9.99 9.99 0 0 1 10 2.6Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeSector: `<path d=\"M10 14.63L2.6 9.06A9.27 9.27 0 0 1 17.4 9.06Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeSegment: `<path d=\"M2.6 12.59A7.88 7.88 0 0 1 17.4 12.59Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeArch: `<path d=\"M2.6 17.4V10A7.4 7.4 0 0 1 17.4 10V17.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeTeardrop: `<path d=\"M10 2.6L5.9 10.75A4.59 4.59 0 1 0 14.1 10.75Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeEgg: `<path d=\"M10 2.6C14.59 2.6 16.07 9.26 16.07 12.22C16.07 15.77 13.26 17.4 10 17.4C6.74 17.4 3.93 15.77 3.93 12.22C3.93 9.26 5.41 2.6 10 2.6Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeHeart: `<path d=\"M10 6.51L10.01 6.42L10.05 6.16L10.18 5.76L10.41 5.26L10.78 4.72L11.27 4.2L11.89 3.76L12.62 3.45L13.42 3.31L14.25 3.36L15.08 3.61L15.84 4.03L16.48 4.62L16.98 5.33L17.29 6.12L17.4 6.97L17.29 7.84L16.98 8.7L16.48 9.54L15.84 10.34L15.08 11.12L14.25 11.86L13.42 12.57L12.62 13.27L11.89 13.93L11.27 14.56L10.78 15.14L10.41 15.66L10.18 16.09L10.05 16.41L10.01 16.62L10 16.69L9.99 16.62L9.95 16.41L9.82 16.09L9.59 15.66L9.22 15.14L8.73 14.56L8.11 13.93L7.38 13.27L6.58 12.57L5.75 11.86L4.92 11.12L4.16 10.34L3.52 9.54L3.02 8.7L2.71 7.84L2.6 6.97L2.71 6.12L3.02 5.33L3.52 4.62L4.16 4.03L4.92 3.61L5.75 3.36L6.58 3.31L7.38 3.45L8.11 3.76L8.73 4.2L9.22 4.72L9.59 5.26L9.82 5.76L9.95 6.16L9.99 6.42L10 6.51Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n shapeAngle: `<path d=\"M2.6 16.34L17.4 16.34L14.8 3.66Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n d4: `<path d=\"M2.6 14.47L10 3.31L17.4 14.47L10 16.69Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n d6: `<path d=\"M3.59 6.3L10 2.6L16.41 6.3L16.41 13.7L10 17.4L3.59 13.7Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n d8: `<path d=\"M2.85 9.6L10 2.6L17.15 10.4L10 17.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n d12: `<path d=\"M2.96 7.71L5.65 4.01L10 2.6L14.35 4.01L17.04 7.71L17.04 12.29L14.35 15.99L10 17.4L5.65 15.99L2.96 12.29Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n d20: `<path d=\"M3.59 13.7L3.59 6.3L10 2.6L16.41 6.3L16.41 13.7L10 17.4Z\" fill=\"currentColor\" stroke=\"none\"/>`,\n} as const;\n\n/** The glyphs `<Icon filled>` can shade. */\nexport type FillableIconName = keyof typeof ICON_FILLS;\n\n/** Every glyph in `ICON_PATHS`, once, sorted into the families it was drawn in. */\nexport const ICON_GROUPS: readonly { label: string; names: readonly IconName[] }[] = [\n {\n label: 'View and lifecycle',\n names: [\n 'clone',\n 'reset',\n 'close',\n 'export',\n 'zoomIn',\n 'zoomOut',\n 'fit',\n 'pan',\n ],\n },\n {\n label: 'Actions',\n names: [\n 'filter',\n 'add',\n 'remove',\n 'delete',\n 'sort',\n 'undo',\n 'redo',\n 'snapshot',\n ],\n },\n {\n label: 'Character styling',\n names: [\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'overline',\n 'superscript',\n 'subscript',\n 'code',\n ],\n },\n {\n label: 'Playback',\n names: [\n 'play',\n 'pause',\n 'stop',\n 'stepBack',\n 'stepForward',\n ],\n },\n {\n label: 'State',\n names: [\n 'lock',\n 'unlock',\n 'visible',\n 'hidden',\n 'pin',\n 'info',\n 'warning',\n 'error',\n 'busy',\n 'check',\n 'modeLight',\n 'modeDark',\n 'modeAuto',\n ],\n },\n {\n label: 'Instrument',\n names: [\n 'crosshair',\n 'fullscreen',\n 'compare',\n 'search',\n 'loupe',\n 'layers',\n 'page',\n 'link',\n 'collapse',\n 'expand',\n 'chevron',\n 'tune',\n 'grid',\n 'snap',\n 'measure',\n 'randomize',\n 'refresh',\n ],\n },\n {\n label: 'Stroke cap, join, align and dash',\n names: [\n 'strokeWidth',\n 'strokeCap',\n 'strokeJoin',\n 'strokeAlign',\n 'capButt',\n 'capRound',\n 'capSquare',\n 'joinMiter',\n 'joinRound',\n 'joinBevel',\n 'alignInner',\n 'alignCenter',\n 'alignOuter',\n 'dashSolid',\n 'dashDashed',\n 'dashDotted',\n 'dashCustom',\n 'paintSolid',\n 'paintLinear',\n 'paintRadial',\n 'paintConic',\n 'paintMesh',\n 'paintPattern',\n 'paintNone',\n ],\n },\n {\n label: 'Workspace layout',\n names: [\n 'layoutRows',\n 'layoutColumns',\n 'layoutGrid',\n ],\n },\n {\n label: 'Arc profiles',\n names: [\n 'arcStraight',\n 'arcParabola',\n 'arcCircle',\n 'arcSine',\n 'arcBump',\n 'arcPlateau',\n 'arcBell',\n 'arcEllipse',\n 'arcLob',\n 'arcDive',\n 'arcTriangle',\n 'arcSquare',\n 'arcSawtooth',\n 'arcStair',\n 'arcZigzag',\n 'arcRipple',\n 'arcHop',\n 'arcCusp',\n ],\n },\n {\n label: 'Curves',\n names: [\n 'curveLine',\n 'curveParabola',\n 'curveCircle',\n 'curveEllipse',\n 'curveHyperbola',\n 'curveHyperbolaPair',\n 'curveCubic',\n 'curveQuartic',\n 'curveSqrt',\n 'curveReciprocal',\n 'curveAbs',\n 'curveCusp',\n 'curveExponential',\n 'curveLogarithm',\n 'curveDecay',\n 'curveSigmoid',\n 'curveSoftplus',\n 'curveRelu',\n 'curveStep',\n 'curvePowerLaw',\n 'curveCatenary',\n 'curveBathtub',\n 'curveHockeyStick',\n 'curveSine',\n 'curveCosine',\n 'curveRipple',\n 'curveTriangleWave',\n 'curveSquareWave',\n 'curveSawtooth',\n 'curveStair',\n 'curvePulseTrain',\n 'curveDamped',\n 'curveChirp',\n 'curveBeat',\n 'curveGaussian',\n 'curveBimodal',\n 'curveSkewed',\n 'curveLorentzian',\n 'curveOgive',\n 'curveUniform',\n 'curveSinc',\n 'curveImpulse',\n 'curveEaseIn',\n 'curveEaseOut',\n 'curveEaseInOut',\n 'curveOvershoot',\n 'curveBounce',\n 'curveElastic',\n 'curveLemniscate',\n 'curveCardioid',\n 'curveAstroid',\n 'curveRose',\n 'curveSpiral',\n 'curveLissajous',\n 'curveCycloid',\n 'curveSuperellipse',\n 'curveTangent',\n 'curveCotangent',\n 'curveSecant',\n 'curveCosecant',\n 'curveArcsine',\n 'curveAsymptote',\n ],\n },\n {\n label: 'Shapes',\n names: [\n 'shapeTriangle',\n 'shapeRightTriangle',\n 'shapeSquare',\n 'shapeRectangle',\n 'shapeDiamond',\n 'shapeParallelogram',\n 'shapeTrapezoid',\n 'shapeKite',\n 'shapePentagon',\n 'shapeHexagon',\n 'shapeHexagonFlat',\n 'shapeHeptagon',\n 'shapeOctagon',\n 'shapeDecagon',\n 'shapeDodecagon',\n 'shapeCross',\n 'shapeLShape',\n 'shapeChevron',\n 'shapeStar',\n 'shapeStar4',\n 'shapeStar6',\n 'shapeStar8',\n 'shapePentagram',\n 'shapeCircle',\n 'shapeEllipse',\n 'shapeSemicircle',\n 'shapeQuarter',\n 'shapeStadium',\n 'shapeRoundedSquare',\n 'shapeRing',\n 'shapeCrescent',\n 'shapeLens',\n 'shapeSector',\n 'shapeSegment',\n 'shapeArch',\n 'shapeTeardrop',\n 'shapeEgg',\n 'shapeHeart',\n 'shapeAngle',\n ],\n },\n {\n label: 'Platonic solids',\n names: [\n 'd4',\n 'd6',\n 'd8',\n 'd12',\n 'd20',\n ],\n },\n];\n","import type { SVGProps } from 'react';\nimport { ICON_FILLS, ICON_PATHS, type FillableIconName, type IconName } from './paths';\n\n/** Shared prop shape for the icon set. Color comes from the surrounding\n * `color` CSS property — every glyph strokes in `currentColor`. */\nexport interface IconProps {\n className?: string;\n /** Rendered pixel size, applied to both width and height. Defaults to 20. */\n size?: number;\n /** Accessible name. Omit inside a button that already labels itself; the\n * glyph is then `aria-hidden`. */\n label?: string;\n /** Shade the region the glyph encloses, in the same `currentColor` at\n * `fillOpacity`. Ignored by a glyph with no enclosed region — a spiral, or a\n * function with poles — so a caller can set it across a set without checking. */\n filled?: boolean;\n /** Tint strength for `filled`. */\n fillOpacity?: number;\n}\n\n/** True when `filled` will shade this glyph. */\nexport const isFillable = (name: IconName): name is FillableIconName => name in ICON_FILLS;\n\nconst SVG_BASE: SVGProps<SVGSVGElement> = {\n viewBox: '0 0 20 20',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round',\n strokeLinejoin: 'round',\n};\n\n// React 19 rewrites innerHTML whenever this object's identity changes, and a\n// rewrite during a press removes the node pointerdown hit, so no click follows.\nconst markup = new Map<string, { __html: string }>();\nconst markupFor = (html: string) => {\n let m = markup.get(html);\n if (!m) markup.set(html, (m = { __html: html }));\n return m;\n};\n\n/** Renders one glyph by name. The named components below are the usual way\n * in; reach for this when the glyph is chosen at runtime. */\nexport function Icon({\n name,\n className,\n size = 20,\n label,\n filled = false,\n fillOpacity = 0.16,\n}: IconProps & { name: IconName }) {\n const shade = filled && isFillable(name) ? ICON_FILLS[name] : '';\n return (\n <svg\n {...SVG_BASE}\n className={className}\n width={size}\n height={size}\n // The shade is drawn first so the stroke sits on top of it, and the tint\n // rides on the root: the stroked paths inherit `fill=\"none\"`, so a fill\n // opacity here reaches only the shade.\n fillOpacity={shade ? fillOpacity : undefined}\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n // Glyph bodies are generated from scripts/icons/ and contain no\n // interpolated input.\n dangerouslySetInnerHTML={markupFor(shade + ICON_PATHS[name])}\n />\n );\n}\n","import { Icon, type IconProps } from './Icon';\n\nexport { Icon, isFillable } from './Icon';\nexport type { IconProps } from './Icon';\nexport { ICON_FILLS, ICON_GROUPS, ICON_PATHS } from './paths';\nexport { ShapeKindIcon } from './ShapeKindIcon';\nexport type { ShapeKindIconProps } from './ShapeKindIcon';\nexport type { FillableIconName, IconName } from './paths';\n\n// Tool glyphs live in @weasel-js/core because core needs them for\n// `Tool.presentation.icon` defaults and cannot depend on this package.\n// Re-exported here so consumers have one import site for the whole set.\nexport {\n SelectIcon, LassoIcon, RectIcon, EllipseIcon, ImageIcon, EyedropperIcon,\n LineIcon, ArrowIcon, PolygonIcon, StarIcon, PencilIcon, TextIcon, PenIcon, HandIcon,\n UnknownIcon,\n} from '@weasel-js/core';\n// The standard edit actions' glyphs live beside those actions in core, for the\n// same reason.\nexport {\n CutIcon, CopyIcon, PasteIcon, DuplicateIcon, GroupIcon, UngroupIcon,\n BringForwardIcon, BringToFrontIcon, SendBackwardIcon, SendToBackIcon, FlipXIcon, FlipYIcon,\n UndoIcon, RedoIcon, DeleteIcon,\n AlignLeftIcon, AlignCenterXIcon, AlignRightIcon, AlignTopIcon, AlignCenterYIcon, AlignBottomIcon,\n DistributeHorizontalIcon, DistributeVerticalIcon,\n} from '@weasel-js/core';\n\nexport const CloneIcon = (p: IconProps) => <Icon name=\"clone\" {...p} />;\nexport const ResetIcon = (p: IconProps) => <Icon name=\"reset\" {...p} />;\nexport const CloseIcon = (p: IconProps) => <Icon name=\"close\" {...p} />;\nexport const ExportIcon = (p: IconProps) => <Icon name=\"export\" {...p} />;\nexport const ZoomInIcon = (p: IconProps) => <Icon name=\"zoomIn\" {...p} />;\nexport const PanIcon = (p: IconProps) => <Icon name=\"pan\" {...p} />;\nexport const AddIcon = (p: IconProps) => <Icon name=\"add\" {...p} />;\nexport const ModeLightIcon = (p: IconProps) => <Icon name=\"modeLight\" {...p} />;\nexport const ModeDarkIcon = (p: IconProps) => <Icon name=\"modeDark\" {...p} />;\nexport const ModeAutoIcon = (p: IconProps) => <Icon name=\"modeAuto\" {...p} />;\nexport const RemoveIcon = (p: IconProps) => <Icon name=\"remove\" {...p} />;\nexport const SortIcon = (p: IconProps) => <Icon name=\"sort\" {...p} />;\nexport const ZoomOutIcon = (p: IconProps) => <Icon name=\"zoomOut\" {...p} />;\nexport const FitIcon = (p: IconProps) => <Icon name=\"fit\" {...p} />;\nexport const SnapshotIcon = (p: IconProps) => <Icon name=\"snapshot\" {...p} />;\nexport const PlayIcon = (p: IconProps) => <Icon name=\"play\" {...p} />;\nexport const PauseIcon = (p: IconProps) => <Icon name=\"pause\" {...p} />;\nexport const StopIcon = (p: IconProps) => <Icon name=\"stop\" {...p} />;\nexport const StepBackIcon = (p: IconProps) => <Icon name=\"stepBack\" {...p} />;\nexport const StepForwardIcon = (p: IconProps) => <Icon name=\"stepForward\" {...p} />;\n/** @deprecated Use {@link StepForwardIcon}; `step` alone stopped naming a direction. */\nexport const StepIcon = StepForwardIcon;\nexport const CrosshairIcon = (p: IconProps) => <Icon name=\"crosshair\" {...p} />;\nexport const FullscreenIcon = (p: IconProps) => <Icon name=\"fullscreen\" {...p} />;\nexport const CompareIcon = (p: IconProps) => <Icon name=\"compare\" {...p} />;\nexport const FilterIcon = (p: IconProps) => <Icon name=\"filter\" {...p} />;\nexport const SearchIcon = (p: IconProps) => <Icon name=\"search\" {...p} />;\nexport const LoupeIcon = (p: IconProps) => <Icon name=\"loupe\" {...p} />;\nexport const LayersIcon = (p: IconProps) => <Icon name=\"layers\" {...p} />;\nexport const PageIcon = (p: IconProps) => <Icon name=\"page\" {...p} />;\nexport const LockIcon = (p: IconProps) => <Icon name=\"lock\" {...p} />;\nexport const UnlockIcon = (p: IconProps) => <Icon name=\"unlock\" {...p} />;\nexport const VisibleIcon = (p: IconProps) => <Icon name=\"visible\" {...p} />;\nexport const HiddenIcon = (p: IconProps) => <Icon name=\"hidden\" {...p} />;\nexport const PinIcon = (p: IconProps) => <Icon name=\"pin\" {...p} />;\nexport const LinkIcon = (p: IconProps) => <Icon name=\"link\" {...p} />;\nexport const CollapseIcon = (p: IconProps) => <Icon name=\"collapse\" {...p} />;\nexport const ExpandIcon = (p: IconProps) => <Icon name=\"expand\" {...p} />;\nexport const ChevronIcon = (p: IconProps) => <Icon name=\"chevron\" {...p} />;\nexport const TuneIcon = (p: IconProps) => <Icon name=\"tune\" {...p} />;\nexport const GridIcon = (p: IconProps) => <Icon name=\"grid\" {...p} />;\nexport const SnapIcon = (p: IconProps) => <Icon name=\"snap\" {...p} />;\nexport const MeasureIcon = (p: IconProps) => <Icon name=\"measure\" {...p} />;\nexport const RandomizeIcon = (p: IconProps) => <Icon name=\"randomize\" {...p} />;\nexport const RefreshIcon = (p: IconProps) => <Icon name=\"refresh\" {...p} />;\nexport const InfoIcon = (p: IconProps) => <Icon name=\"info\" {...p} />;\nexport const WarningIcon = (p: IconProps) => <Icon name=\"warning\" {...p} />;\nexport const ErrorIcon = (p: IconProps) => <Icon name=\"error\" {...p} />;\nexport const BusyIcon = (p: IconProps) => <Icon name=\"busy\" {...p} />;\nexport const CheckIcon = (p: IconProps) => <Icon name=\"check\" {...p} />;\nexport const LayoutRowsIcon = (p: IconProps) => <Icon name=\"layoutRows\" {...p} />;\nexport const LayoutColumnsIcon = (p: IconProps) => <Icon name=\"layoutColumns\" {...p} />;\nexport const LayoutGridIcon = (p: IconProps) => <Icon name=\"layoutGrid\" {...p} />;\n","/** Apple-style glyph for a DOM `KeyboardEvent.key` value. Covers escape,\n * delete/backspace, arrows, enter/return, tab, space. Unknown keys are\n * upper-cased (so `'a'` reads as `A` on a keycap) and returned unchanged\n * otherwise — making this safe to apply uniformly without a `has-glyph`\n * check at the call site. */\nexport function keyGlyph(rawKey: string): string {\n switch (rawKey) {\n case 'Escape': return '⎋';\n case 'Backspace': return '⌫';\n case 'Delete': return '⌦';\n case 'ArrowUp': return '↑';\n case 'ArrowDown': return '↓';\n case 'ArrowLeft': return '←';\n case 'ArrowRight': return '→';\n case 'Enter':\n case 'Return': return '↵';\n case 'Tab': return '⇥';\n case ' ':\n case 'Space': return '␣';\n default: return rawKey.toUpperCase();\n }\n}\n","import { keyGlyph } from '../Keycaps/keyGlyph';\n\nexport interface ShortcutInput {\n key: string | readonly string[];\n mod?: boolean;\n alt?: boolean;\n shift?: boolean | 'optional';\n}\n\n/** Format a shortcut as an array of display chips, one per key — modifier\n * icons (⌘, ↑, ⌥) followed by the key glyph. UIs that want a boxed\n * per-key look render each chip in its own element. `shift: 'optional'` is\n * treated as falsy. */\nexport function formatShortcutParts(b: ShortcutInput | undefined): readonly string[] | undefined {\n if (!b) return undefined;\n const rawKey = Array.isArray(b.key) ? b.key[0] : (b.key as string);\n const parts: string[] = [];\n if (b.mod) parts.push('⌘');\n if (b.shift === true) parts.push('⇧');\n if (b.alt) parts.push('⌥');\n parts.push(keyGlyph(rawKey));\n return parts;\n}\n\n/** Format a shortcut as a single display string. Order: mod, shift, alt,\n * key. Returns `undefined` for `undefined` input so callers can `??` a\n * fallback. When `key` is an array, the first element is used. `shift: 'optional'`\n * is treated as falsy. */\nexport function formatShortcut(b: ShortcutInput | undefined): string | undefined {\n const parts = formatShortcutParts(b);\n return parts ? parts.join('') : undefined;\n}\n","import { createContext, useContext, useState, type ReactElement, type ReactNode } from 'react';\n\n/**\n * Elements an overlay may portal into: anything a theme has been stamped on\n * (`applyTheme` / `<ThemeProvider>` write both attributes), plus anything\n * opting in with `data-wzl-portal-host`. The opt-in exists for a styling root\n * that sits *below* the themed element — labkit's `.lk-root` carries element\n * defaults the themed wrapper does not.\n */\nconst HOST_SELECTOR = '[data-wzl-portal-host],[data-wzl-theme],[data-wzl-mode]';\n\n/**\n * The nearest element `from` sits inside that can host a portalled overlay,\n * or `null` when there is none and the body is the only answer.\n */\nexport function nearestPortalHost(from: Element | null | undefined): HTMLElement | null {\n return (from?.closest(HOST_SELECTOR) as HTMLElement | null) ?? null;\n}\n\n/** `undefined` distinguishes \"no provider\" from a provider saying `null`. */\nconst OverlayPortalContext = createContext<Element | null | undefined>(undefined);\n\n/** Props for {@link OverlayPortalProvider}. */\nexport interface OverlayPortalProviderProps {\n /** Where overlays in this subtree portal. `null` means `document.body`. */\n container: Element | null;\n children: ReactNode;\n}\n\n/**\n * Sets the portal container for every weasel overlay rendered below it,\n * overriding the nearest-themed-ancestor default. An individual overlay's\n * own `portalContainer` prop still wins.\n */\nexport function OverlayPortalProvider({ container, children }: OverlayPortalProviderProps) {\n return (\n <OverlayPortalContext.Provider value={container}>{children}</OverlayPortalContext.Provider>\n );\n}\n\n/** The `portalContainer` prop every weasel overlay accepts. */\nexport interface OverlayPortalProps {\n /**\n * Where the overlay's portal mounts. Defaults to the nearest ancestor of\n * the overlay's own position that carries a weasel theme, so the overlay\n * resolves the same `--wzl-*` tokens as the control it belongs to. Pass\n * `null` for `document.body`.\n */\n portalContainer?: Element | null;\n}\n\n/** React Aria props minus the portal key a weasel overlay owns. */\nexport type WithoutPortalTarget<T> = Omit<T, 'UNSTABLE_portalContainer'>;\n\n/** Spread onto the React Aria overlay. The unstable key is spelled here and\n * nowhere else in the package, so an upstream rename lands in one file. */\nexport interface OverlayPortalTarget {\n UNSTABLE_portalContainer: Element | undefined;\n}\n\n/**\n * Resolves where an overlay should portal, and the anchor that answers it.\n *\n * The result goes to React Aria as `UNSTABLE_portalContainer`. Its documented\n * replacement, `UNSAFE_PortalProvider`, is not re-exported by\n * react-aria-components 1.18, and reaching past it to `react-aria` for the\n * provider risks a second copy of that package whose context the overlays\n * never read — a failure that shows up as an unthemed overlay, not an error.\n *\n * Render `anchor` at the component's own position in the tree — outside the\n * portal — and spread `portalProps` onto the React Aria overlay. The anchor\n * is what \"nearest themed ancestor\" is measured from; the first render has\n * none yet, so an overlay that mounts already open lands in its host on the\n * following render, before paint.\n */\nexport function useOverlayPortal(explicit?: Element | null): {\n anchor: ReactElement;\n portalProps: OverlayPortalTarget;\n} {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const fromProvider = useContext(OverlayPortalContext);\n\n const resolved =\n explicit !== undefined\n ? explicit\n : fromProvider !== undefined\n ? fromProvider\n : nearestPortalHost(anchorEl);\n\n return {\n anchor: <span hidden ref={setAnchorEl} />,\n portalProps: { UNSTABLE_portalContainer: resolved ?? undefined },\n };\n}\n","import type { ReactNode } from 'react';\nimport {\n TooltipTrigger as RACTooltipTrigger,\n Tooltip as RACTooltip,\n OverlayArrow,\n type TooltipProps as RACTooltipProps,\n type TooltipTriggerComponentProps,\n} from 'react-aria-components';\nimport { useOverlayPortal, type OverlayPortalProps, type WithoutPortalTarget } from '../../overlays/portalHost';\nimport s from './Tooltip.module.css';\n\n/** Makes a non-RAC element a {@link TooltipTrigger} trigger: supplies\n * `tabIndex`, the hover/focus handlers and `aria-describedby`. The child must\n * forward its ref and DOM props, and carry an interactive role (or `img`). */\nexport { Focusable } from 'react-aria-components';\n\n/**\n * Props for {@link TooltipTrigger} — React Aria's `TooltipTrigger` props\n * unchanged.\n */\nexport type TooltipTriggerProps = TooltipTriggerComponentProps;\n\n/**\n * TooltipTrigger with kit defaults: ~600 ms open delay, instant close.\n * Wrap a focusable trigger plus a `<Tooltip>`. Non-RAC triggers (plain\n * `<button>`, a `Badge` etc.) must be wrapped in {@link Focusable} so\n * hover/focus props reach the DOM node.\n *\n * Caveat: while a tooltip is open, react-aria captures the first Escape\n * keydown (document-level, capture phase) to dismiss it — app-level\n * Escape handlers (deselect, cancel gesture) see only the second press.\n */\nexport function TooltipTrigger(props: TooltipTriggerProps) {\n const { delay = 600, closeDelay = 0, ...rest } = props;\n return <RACTooltipTrigger delay={delay} closeDelay={closeDelay} {...rest} />;\n}\n\n/** Props for {@link Tooltip}, on top of React Aria's `Tooltip` props. */\nexport type TooltipProps = Omit<WithoutPortalTarget<RACTooltipProps>, 'children' | 'className'> &\n OverlayPortalProps & {\n children?: ReactNode;\n className?: string;\n };\n\n/**\n * Tooltip bubble with an arrow pointing at the trigger. Non-interactive\n * content only (ARIA tooltip semantics). Use inside `<TooltipTrigger>`.\n */\nexport function Tooltip(props: TooltipProps) {\n const { children, className, placement = 'top', offset = 8, portalContainer, ...rest } = props;\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n return (\n <>\n {anchor}\n <RACTooltip\n {...rest}\n placement={placement}\n offset={offset}\n className={[s.tooltip, className].filter(Boolean).join(' ')}\n data-weasel-overlay=\"\"\n {...portalProps}\n >\n <OverlayArrow className={s.arrow}>\n <svg width={8} height={8} viewBox=\"0 0 8 8\" aria-hidden=\"true\">\n <path d=\"M0 0 L4 4 L8 0\" />\n </svg>\n </OverlayArrow>\n {children}\n </RACTooltip>\n </>\n );\n}\n","import { useSyncExternalStore, type ReactNode } from 'react';\nimport { Focusable } from 'react-aria-components';\nimport {\n useActionsRegistry,\n useOptionalDepRegistry,\n evaluateEnabled,\n buildDepsFromRequires,\n actionItems,\n actionShortcuts,\n type Action,\n type ActionItem,\n} from '@weasel-js/core';\nimport { Tooltip, TooltipTrigger } from '../Tooltip';\nimport { formatShortcut } from '../ToolPalette/formatShortcut';\nimport s from './ActionBar.module.css';\n\nconst EMPTY_LIST: readonly Action[] = Object.freeze([]);\nconst noopSubscribe = (): (() => void) => () => {};\n\n/** Props for {@link ActionBar}. */\nexport interface ActionBarProps {\n /** Group key — only actions with `action.group === group` are rendered. */\n group: string;\n /** Layout direction. Defaults to `'horizontal'`. */\n orientation?: 'horizontal' | 'vertical';\n /**\n * Per-entry icon overrides, keyed by `ActionItem.key` — the action id, or\n * `id:variant` for one variant of a parametric action. When an entry is provided\n * it replaces the action's own `icon` for this bar only. Mirrors\n * `PathfinderPanelProps.icons` so call sites that ship custom glyph sets\n * can swap them in without re-registering actions.\n */\n icons?: Record<string, ReactNode>;\n /**\n * Per-entry label overrides, keyed like `icons`. Drives both `aria-label`\n * and `title`. When omitted, the entry's own `label` is used.\n */\n labels?: Record<string, string>;\n /** Additional class for the toolbar root. */\n className?: string;\n}\n\nfunction resolveIcon(item: ActionItem, override: ReactNode | undefined): ReactNode {\n if (override !== undefined) return override;\n const i = item.icon;\n if (typeof i === 'function') return i();\n return i;\n}\n\nfunction resolveTitle(label: string, item: ActionItem): string {\n const shortcut = item.action.shortcut ?? formatShortcut(actionShortcuts(item.action, item.params)[0]);\n return shortcut ? `${label} (${shortcut})` : label;\n}\n\n/**\n * Generic group-keyed action toolbar. Reads the parent `ActionsRegistry`,\n * filters to actions whose `group` matches `props.group`, and renders one\n * icon button per match — or per variant, for an action that declares\n * `variants`. Disabled state is derived from each action's\n * `enabled` predicate via `evaluateEnabled` (so the button greys out and\n * swallows clicks while the keybinding — if any — still fires through the\n * registry's keydown listener; that's the registry's contract, not ours).\n *\n * Visual parity with the WeaselDraw `<PathfinderPanel>` is intentional;\n * this is the generic, registry-driven version. No keyboard navigation\n * (roving tabindex) yet — bar consumers today are short flat strips. Add\n * if/when a long bar lands.\n */\nexport function ActionBar(props: ActionBarProps) {\n const { group, orientation = 'horizontal', icons, labels, className } = props;\n const registry = useActionsRegistry();\n const depReg = useOptionalDepRegistry();\n const all = useSyncExternalStore(\n registry ? registry.subscribe : noopSubscribe,\n registry ? registry.list : () => EMPTY_LIST,\n registry ? registry.list : () => EMPTY_LIST,\n );\n const items = all.filter((a) => a.group === group).flatMap(actionItems);\n\n const cls = [s.bar, orientation === 'vertical' && s.vertical, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={cls} role=\"toolbar\" aria-label={`${group} actions`}>\n {items.map((item) => {\n const label = labels?.[item.key] ?? item.label;\n const icon = resolveIcon(item, icons?.[item.key]);\n // Read at render: `enabled` reflects whatever the deps hold now, so\n // the bar is current as long as its parent re-renders on changes.\n const deps = depReg ? buildDepsFromRequires(item.action, depReg) : undefined;\n const { enabled } = evaluateEnabled(item.action, deps);\n const disabled = !enabled;\n const title = resolveTitle(label, item);\n return (\n <TooltipTrigger key={item.key} isDisabled={disabled}>\n <Focusable isDisabled={disabled}>\n <button\n type=\"button\"\n data-testid={`action-bar-item-${item.key}`}\n aria-label={label}\n aria-disabled={disabled || undefined}\n disabled={disabled}\n className={s.button}\n onClick={() => {\n if (disabled) return;\n // Dispatch through the registry so the enabled() guard runs.\n // If no registry is in scope the click is a no-op — ActionBar\n // is expected to render under an `ActionsProvider`.\n registry?.trigger(item.action.id, item.params);\n }}\n >\n {icon}\n </button>\n </Focusable>\n <Tooltip>{title}</Tooltip>\n </TooltipTrigger>\n );\n })}\n </div>\n );\n}\n","import { colorCssAt, type Stance } from '@weasel-js/theme';\nimport { useTones } from '@weasel-js/theme/react';\nimport type { CSSProperties } from 'react';\n\nexport type { Stance } from '@weasel-js/theme';\n\n/**\n * What a surface holds, and which of its peers it is. Every surface that takes\n * these takes both, and the theme decides how each looks.\n */\nexport interface StanceProps {\n /** The class of content the surface holds. Omitted, it draws as it always has. */\n stance?: Stance;\n /**\n * Which of its peers this is: an index into the theme's tone list, wrapping,\n * or a color given directly. Independent of `stance`, and allowed without one.\n */\n tone?: number | string;\n}\n\n/** The attributes a stanced surface renders, and the style carrying its resolved tone. */\nexport interface StanceAttrs {\n 'data-stance'?: Stance;\n 'data-tone'?: string;\n style?: CSSProperties;\n}\n\n/**\n * Resolves `stance` and `tone` for a surface's root element. The tone is\n * written inline as `--wzl-tone`; a tone-list index resolves through the nearest\n * `<ThemeProvider>`'s tones, as a custom-property reference where the list is\n * a theme ramp, so it follows the mode without a re-render.\n */\nexport function useStance({ stance, tone }: StanceProps): StanceAttrs {\n const ctx = useTones();\n if (stance === undefined && tone === undefined) return {};\n const color = tone === undefined ? undefined : typeof tone === 'number' ? colorCssAt(ctx.tones, tone, ctx) : tone;\n return {\n 'data-stance': stance,\n 'data-tone': tone === undefined ? undefined : String(tone),\n style: color === undefined ? undefined : ({ '--wzl-tone': color } as CSSProperties),\n };\n}\n","import type { ShapeModule } from '../types';\n\nconst Pill: ShapeModule = {\n Component: () => null,\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n renderMode: 'css',\n};\n\nexport default Pill;\n","import type { ShapeModule } from '../types';\n\nconst Plain: ShapeModule = {\n Component: () => null,\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n renderMode: 'css',\n};\n\nexport default Plain;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface SquareParams {\n /** 0..1 fraction of the maximum corner rounding (1 = full pill). */\n erosion?: number;\n}\n\nconst DEFAULTS: Required<SquareParams> = { erosion: 0.16 };\n\nconst Square: ShapeModule<SquareParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'rounded-rect', baseParams: { erosion: cfg.erosion } };\n },\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Square;\n","import type { ShapeModule } from '../types';\n\nexport interface NotchedParams {\n /** 0..1 fraction of max corner radius. */\n erosion?: number;\n /** rx/ry eccentricity of the corner arcs. */\n eccentricity?: number;\n}\n\nconst DEFAULTS: Required<NotchedParams> = { erosion: 0.28, eccentricity: 1 };\n\nfunction notchedPath(r: number, ecc: number) {\n const W = 100, H = 100;\n const rx = r * ecc;\n const ry = r / ecc;\n return [\n `M ${rx} 0`,\n `L ${W - rx} 0`,\n `A ${rx} ${ry} 0 0 0 ${W} ${ry}`,\n `L ${W} ${H - ry}`,\n `A ${rx} ${ry} 0 0 0 ${W - rx} ${H}`,\n `L ${rx} ${H}`,\n `A ${rx} ${ry} 0 0 0 0 ${H - ry}`,\n `L 0 ${ry}`,\n `A ${rx} ${ry} 0 0 0 ${rx} 0`,\n 'Z',\n ].join(' ');\n}\n\nconst Notched: ShapeModule<NotchedParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const e = Math.max(0, Math.min(cfg.erosion, 1));\n const r = e * 49;\n const ecc = Math.max(0.2, Math.min(cfg.eccentricity, 5));\n const d = notchedPath(r, ecc);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && (\n <path className=\"badge-fill\" d={d} />\n )}\n {(variant === 'outline' || variant === 'solid') && (\n <path className=\"badge-stroke\" d={d} />\n )}\n {focused && <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.06) translate(-50 -50)\" />}\n </>\n );\n },\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Notched;\n","import { useLayoutEffect, useState, type RefObject } from 'react';\n\n/**\n * Live CSS-pixel size of the SVG `ref`'s element belongs to; an outermost `<svg>` is its own.\n * `when` both gates the measurement and re-measures whenever its identity changes.\n */\nexport function useSvgBox(ref: RefObject<SVGElement | null>, when: unknown = true): { w: number; h: number } {\n const [box, setBox] = useState({ w: 100, h: 100 });\n\n useLayoutEffect(() => {\n const el = when ? ref.current : null;\n const svg = el?.ownerSVGElement ?? el;\n if (!svg) return;\n const update = () => {\n const r = svg.getBoundingClientRect();\n if (r.width > 0 && r.height > 0) setBox({ w: r.width, h: r.height });\n };\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n ro.observe(svg);\n return () => ro.disconnect();\n }, [ref, when]);\n\n return box;\n}\n","import { useEffect, useId, useRef } from 'react';\nimport type { ShapeModule } from '../types';\nimport { useSvgBox } from '../useSvgBox';\n\nexport interface PerforatedParams {\n holeRadius?: number;\n holePitch?: number;\n}\n\nconst DEFAULTS: Required<PerforatedParams> = { holeRadius: 3.5, holePitch: 11 };\n\nfunction PerforatedComponent({ variant, focused, params }: {\n variant: 'outline' | 'solid' | 'subtle';\n focused: boolean;\n params: PerforatedParams;\n}) {\n const cfg = { ...DEFAULTS, ...params };\n const maskId = useId();\n const ref = useRef<SVGGElement>(null);\n const box = useSvgBox(ref);\n\n // Convert CSS-px hole sizing into viewBox units so holes look circular on either axis.\n const rx = (cfg.holeRadius / box.w) * 100;\n const ry = (cfg.holeRadius / box.h) * 100;\n const nH = Math.max(2, Math.round(box.w / cfg.holePitch));\n const nV = Math.max(2, Math.round(box.h / cfg.holePitch));\n\n const notches: { cx: number; cy: number }[] = [];\n for (let i = 0; i < nH; i++) {\n const t = (i + 0.5) / nH;\n notches.push({ cx: t * 100, cy: 0 });\n notches.push({ cx: t * 100, cy: 100 });\n }\n for (let i = 0; i < nV; i++) {\n const t = (i + 0.5) / nV;\n notches.push({ cx: 0, cy: t * 100 });\n notches.push({ cx: 100, cy: t * 100 });\n }\n\n return (\n <g ref={ref}>\n <defs>\n <mask id={maskId} maskUnits=\"userSpaceOnUse\" x=\"-5\" y=\"-5\" width=\"110\" height=\"110\">\n <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill=\"white\" />\n {notches.map((n, i) => (\n <ellipse key={i} cx={n.cx} cy={n.cy} rx={rx} ry={ry} fill=\"black\" />\n ))}\n </mask>\n </defs>\n {(variant === 'solid' || variant === 'subtle') && (\n <rect className=\"badge-fill\" x=\"0\" y=\"0\" width=\"100\" height=\"100\" mask={`url(#${maskId})`} />\n )}\n {(variant === 'outline' || variant === 'solid') && (\n <rect className=\"badge-stroke\" x=\"0\" y=\"0\" width=\"100\" height=\"100\" mask={`url(#${maskId})`} />\n )}\n {focused && (\n <rect className=\"badge-focus\" x=\"-4\" y=\"-4\" width=\"108\" height=\"108\" mask={`url(#${maskId})`} />\n )}\n </g>\n );\n}\n\n// Avoid unused warning while keeping useEffect imported elsewhere if needed in future.\nvoid useEffect;\n\nconst Perforated: ShapeModule<PerforatedParams> = {\n Component: PerforatedComponent,\n insets: { top: 2, right: 4, bottom: 2, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Perforated;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface HexagonParams {\n tipHeight?: number;\n /** Truncate the top and bottom tips, leaving a horizontal flat edge.\n * Measured as a distance from each tip vertically (0 = sharp point, tipHeight = fully flat). */\n tipTruncation?: number;\n}\n\nconst DEFAULTS: Required<HexagonParams> = { tipHeight: 25, tipTruncation: 0 };\n\nfunction hexVerts(tip: number, truncation: number): [number, number][] {\n const t = Math.max(0, Math.min(tip, 49));\n const trunc = Math.max(0, Math.min(truncation, t));\n if (trunc <= 0) {\n return [[50, 0], [100, t], [100, 100 - t], [50, 100], [0, 100 - t], [0, t]];\n }\n const ratio = trunc / t;\n const xL = 50 - 50 * ratio;\n const xR = 50 + 50 * ratio;\n return [\n [xL, trunc], [xR, trunc],\n [100, t], [100, 100 - t],\n [xR, 100 - trunc], [xL, 100 - trunc],\n [0, 100 - t], [0, t],\n ];\n}\n\nconst Hexagon: ShapeModule<HexagonParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'polygon', baseParams: { vertices: hexVerts(cfg.tipHeight, cfg.tipTruncation) } };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 6 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Hexagon;\n","import type { ShapeModule } from '../types';\n\nexport interface StarburstParams {\n points?: number;\n outerR?: number;\n innerR?: number;\n rotation?: number;\n erosion?: number;\n}\n\nconst DEFAULTS: Required<StarburstParams> = {\n points: 12,\n outerR: 48,\n innerR: 36,\n rotation: -7,\n erosion: 0,\n};\n\nfunction starburstPath(points: number, outerR: number, innerR: number, rotationDeg: number, erosion: number) {\n const cx = 50, cy = 50;\n const total = points * 2;\n const step = (Math.PI * 2) / total;\n const start = (rotationDeg * Math.PI) / 180;\n const rnd = Math.max(0, Math.min(erosion, 1));\n const pts: [number, number][] = [];\n for (let i = 0; i < total; i++) {\n const r = i % 2 === 0 ? outerR : innerR;\n const a = start + i * step;\n pts.push([cx + Math.cos(a) * r, cy + Math.sin(a) * r]);\n }\n if (rnd <= 0) {\n let d = '';\n for (let i = 0; i < pts.length; i++) {\n d += (i === 0 ? 'M ' : ' L ') + pts[i][0].toFixed(2) + ' ' + pts[i][1].toFixed(2);\n }\n return d + ' Z';\n }\n let d = '';\n for (let i = 0; i < pts.length; i++) {\n const prev = pts[(i + pts.length - 1) % pts.length];\n const curr = pts[i];\n const next = pts[(i + 1) % pts.length];\n const t = rnd * 0.45;\n const enterX = curr[0] + (prev[0] - curr[0]) * t;\n const enterY = curr[1] + (prev[1] - curr[1]) * t;\n const exitX = curr[0] + (next[0] - curr[0]) * t;\n const exitY = curr[1] + (next[1] - curr[1]) * t;\n if (i === 0) d += `M ${enterX.toFixed(2)} ${enterY.toFixed(2)}`;\n else d += ` L ${enterX.toFixed(2)} ${enterY.toFixed(2)}`;\n d += ` Q ${curr[0].toFixed(2)} ${curr[1].toFixed(2)} ${exitX.toFixed(2)} ${exitY.toFixed(2)}`;\n }\n return d + ' Z';\n}\n\nconst Starburst: ShapeModule<StarburstParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const d = starburstPath(cfg.points, cfg.outerR, cfg.innerR, cfg.rotation, cfg.erosion);\n const dFocus = starburstPath(cfg.points, cfg.outerR + 4, cfg.innerR + 3, cfg.rotation, cfg.erosion);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && <path className=\"badge-focus\" d={dFocus} />}\n </>\n );\n },\n insets: { top: 8, right: 8, bottom: 8, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Starburst;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface ScallopedParams {\n scallopRadius?: number;\n scallopSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<ScallopedParams> = { scallopRadius: 5, scallopSpacing: 12, irregularity: 0 };\n\nconst Scalloped: ShapeModule<ScallopedParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: 0 },\n effects: [\n {\n type: 'scallops',\n params: { scallopRadius: cfg.scallopRadius, scallopSpacing: cfg.scallopSpacing, irregularity: cfg.irregularity },\n },\n ],\n };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 6 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Scalloped;\n","import { useRef } from 'react';\nimport type { ShapeModule } from '../types';\nimport { useSvgBox } from '../useSvgBox';\n\nexport interface ShieldParams {\n pointDepth?: number;\n shoulderY?: number;\n curveTightness?: number;\n /** 0..1 fraction of max top-corner rounding. */\n erosion?: number;\n}\n\nconst DEFAULTS: Required<ShieldParams> = {\n pointDepth: 100,\n shoulderY: 55,\n curveTightness: 0.7,\n erosion: 0.33,\n};\n\nfunction ShieldComponent({ variant, focused, params }: {\n variant: 'outline' | 'solid' | 'subtle';\n focused: boolean;\n params: ShieldParams;\n}) {\n const cfg = { ...DEFAULTS, ...params };\n const ref = useRef<SVGGElement>(null);\n const box = useSvgBox(ref);\n\n const pd = Math.max(60, Math.min(cfg.pointDepth, 110));\n const sh = Math.max(20, Math.min(cfg.shoulderY, pd - 5));\n const cpY = sh + (pd - sh) * Math.max(0.1, Math.min(cfg.curveTightness, 1));\n // Aspect-aware top corner radii (so the rounded corners stay circular in CSS).\n const cornerCss = Math.max(0, Math.min(cfg.erosion, 1)) * 12;\n const rxC = (cornerCss / box.w) * 100;\n const ryC = (cornerCss / box.h) * 100;\n const d = [\n `M ${rxC.toFixed(3)} 0`,\n `L ${(100 - rxC).toFixed(3)} 0`,\n `A ${rxC.toFixed(3)} ${ryC.toFixed(3)} 0 0 1 100 ${ryC.toFixed(3)}`,\n `L 100 ${sh}`,\n `Q 100 ${cpY} 50 ${pd}`,\n `Q 0 ${cpY} 0 ${sh}`,\n `L 0 ${ryC.toFixed(3)}`,\n `A ${rxC.toFixed(3)} ${ryC.toFixed(3)} 0 0 1 ${rxC.toFixed(3)} 0`,\n 'Z',\n ].join(' ');\n return (\n <g ref={ref}>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.06) translate(-50 -50)\" />\n )}\n </g>\n );\n}\n\nconst Shield: ShapeModule<ShieldParams> = {\n Component: ShieldComponent,\n insets: { top: 2, right: 8, bottom: 14, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Shield;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport type RibbonEnd = 'inward' | 'outward' | 'flat';\n\nexport interface RibbonParams {\n left?: RibbonEnd;\n right?: RibbonEnd;\n /** Taper depth in CSS px. The actual pointer width stays fixed regardless\n * of badge width — the underlying base recomputes viewBox vertices at\n * build time using the rendered box dimensions. */\n taperWidth?: number;\n}\n\nconst DEFAULTS: Required<RibbonParams> = { left: 'inward', right: 'outward', taperWidth: 8 };\n\nconst Ribbon: ShapeModule<RibbonParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'ribbon', baseParams: cfg };\n },\n // Unused at render time when `compose` is set — the base's insets win — but\n // required by the ShapeModule contract.\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Ribbon;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface BeavisParams {\n points?: number;\n cornerRadius?: number;\n spikeLen?: number;\n spikeBaseWidth?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<BeavisParams> = {\n points: 44,\n cornerRadius: 6,\n spikeLen: 12,\n spikeBaseWidth: 3,\n irregularity: 0,\n};\n\nconst Beavis: ShapeModule<BeavisParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n // Nominal badge half-height for cornerRadius → erosion: real badges are ~22px tall\n // so half = 11. Clamp into [0,1].\n const erosion = Math.max(0, Math.min(1, cfg.cornerRadius / 11));\n return {\n base: 'rounded-rect',\n baseParams: { erosion },\n effects: [\n {\n type: 'spikes',\n params: {\n count: cfg.points,\n length: cfg.spikeLen,\n baseWidth: cfg.spikeBaseWidth,\n vertScale: 1,\n horzScale: 1,\n diagonalScale: 1,\n irregularity: cfg.irregularity,\n },\n },\n ],\n };\n },\n insets: { top: 6, right: 8, bottom: 6, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Beavis;\n","import type { ShapeModule } from '../types';\n\nexport interface SparklerParams {\n points?: number;\n outerR?: number;\n innerR?: number;\n rotation?: number;\n}\n\nconst DEFAULTS: Required<SparklerParams> = {\n points: 16,\n outerR: 58,\n innerR: 50,\n rotation: -5,\n};\n\nfunction sparklerPath(points: number, outerR: number, innerR: number, rotation: number) {\n const cx = 50, cy = 50;\n const total = points * 2;\n const step = (Math.PI * 2) / total;\n const start = (rotation * Math.PI) / 180;\n let d = '';\n for (let i = 0; i < total; i++) {\n const r = i % 2 === 0 ? outerR : innerR;\n const a = start + i * step;\n const x = cx + Math.cos(a) * r;\n const y = cy + Math.sin(a) * r;\n d += (i === 0 ? 'M ' : ' L ') + x.toFixed(2) + ' ' + y.toFixed(2);\n }\n return d + ' Z';\n}\n\nconst Sparkler: ShapeModule<SparklerParams> = {\n Component: ({ variant, focused, params }) => {\n const { points, outerR, innerR, rotation } = { ...DEFAULTS, ...params };\n const d = sparklerPath(points, outerR, innerR, rotation);\n const dFocus = sparklerPath(points, outerR + 4, innerR + 3, rotation);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && <path className=\"badge-focus\" d={dFocus} />}\n </>\n );\n },\n insets: { top: 4, right: 4, bottom: 4, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Sparkler;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface PostageParams {\n biteRadius?: number;\n biteSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<PostageParams> = { biteRadius: 3, biteSpacing: 8, irregularity: 0 };\n\nconst Postage: ShapeModule<PostageParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: 0 },\n effects: [\n {\n type: 'bites',\n params: { biteRadius: cfg.biteRadius, biteSpacing: cfg.biteSpacing, irregularity: cfg.irregularity },\n },\n ],\n };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 6 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Postage;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface CloudParams {\n bumpWidth?: number;\n puffiness?: number;\n /** 0..1 fraction of max body roundness. */\n erosion?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<CloudParams> = {\n bumpWidth: 24,\n puffiness: 14,\n erosion: 0.2,\n irregularity: 0,\n};\n\nconst Cloud: ShapeModule<CloudParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: cfg.erosion },\n effects: [\n {\n type: 'puffs',\n params: { bumpWidth: cfg.bumpWidth, puffiness: cfg.puffiness, irregularity: cfg.irregularity },\n },\n ],\n };\n },\n insets: { top: 6, right: 8, bottom: 6, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Cloud;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface HouseParams {\n eaveY?: number;\n peakHeight?: number;\n roofOverhang?: number;\n}\n\nconst DEFAULTS: Required<HouseParams> = { eaveY: 32, peakHeight: 32, roofOverhang: 0 };\n\nconst House: ShapeModule<HouseParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n const ey = Math.max(2, Math.min(cfg.eaveY, 95));\n const peakY = ey - Math.max(0, cfg.peakHeight);\n const ov = Math.max(0, Math.min(cfg.roofOverhang, 12));\n return {\n base: 'polygon',\n baseParams: {\n vertices: [\n [50, peakY],\n [100 + ov, ey],\n [100, ey],\n [100, 100],\n [0, 100],\n [0, ey],\n [-ov, ey],\n ],\n },\n };\n },\n insets: { top: 10, right: 4, bottom: 0, left: 4 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default House;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport type PlaqueCorner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface PlaqueParams {\n bevelWidth?: number;\n lightFrom?: PlaqueCorner;\n rivetRadius?: number;\n rivetInset?: number;\n sheenIntensity?: number;\n}\n\nconst DEFAULTS: Required<PlaqueParams> = {\n bevelWidth: 6,\n lightFrom: 'tl',\n rivetRadius: 2.4,\n rivetInset: 7,\n sheenIntensity: 0.22,\n};\n\nconst Plaque: ShapeModule<PlaqueParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n base: 'rounded-rect',\n baseParams: { erosion: 0 },\n effects: [\n { type: 'bevel', params: { bevelWidth: cfg.bevelWidth, lightFrom: cfg.lightFrom } },\n { type: 'sheen', params: { lightFrom: cfg.lightFrom, intensity: cfg.sheenIntensity } },\n { type: 'rivets', params: { radius: cfg.rivetRadius, inset: cfg.rivetInset, lightFrom: cfg.lightFrom } },\n ],\n };\n },\n insets: { top: 6, right: 8, bottom: 6, left: 8 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Plaque;\n","import type { ShapeModule } from '../types';\n\nexport interface CrestParams {\n topInset?: number;\n pointDepth?: number;\n}\n\nconst DEFAULTS: Required<CrestParams> = { topInset: 12, pointDepth: 100 };\n\nfunction crestPath(topInset: number, pointDepth: number) {\n const ti = Math.max(0, Math.min(topInset, 35));\n const pd = Math.max(60, Math.min(pointDepth, 110));\n // 5-sided shield silhouette with rounded shoulders and a bottom point.\n return [\n `M ${ti} 6`,\n `Q ${ti / 2} 0 ${ti + 4} 0`,\n `L ${100 - ti - 4} 0`,\n `Q ${100 - ti / 2} 0 ${100 - ti} 6`,\n `L ${100 - ti * 0.4} ${pd * 0.35}`,\n `Q ${100 - ti} ${pd * 0.7} 50 ${pd}`,\n `Q ${ti} ${pd * 0.7} ${ti * 0.4} ${pd * 0.35}`,\n 'Z',\n ].join(' ');\n}\n\nconst Crest: ShapeModule<CrestParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const d = crestPath(cfg.topInset, cfg.pointDepth);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.06) translate(-50 -50)\" />\n )}\n </>\n );\n },\n insets: { top: 4, right: 10, bottom: 14, left: 10 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Crest;\n","import type { ShapeModule } from '../types';\n\nconst d = 'M 35 0 L 30 12 Q 15 30 15 55 Q 15 75 30 90 L 30 100 L 70 100 L 70 90 Q 85 75 85 55 Q 85 30 70 12 L 65 0 Z';\n\nconst Urn: ShapeModule = {\n Component: ({ variant, focused }) => (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.05) translate(-50 -50)\" />\n )}\n </>\n ),\n insets: { top: 4, right: 12, bottom: 4, left: 12 },\n stretches: true,\n};\n\nexport default Urn;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface CoffinParams {\n headX?: number;\n headHalfHeight?: number;\n shoulderX?: number;\n shoulderHalfHeight?: number;\n footX?: number;\n footHalfHeight?: number;\n}\n\nconst DEFAULTS: Required<CoffinParams> = {\n headX: 6,\n headHalfHeight: 23,\n shoulderX: 33,\n shoulderHalfHeight: 36,\n footX: 100,\n footHalfHeight: 29,\n};\n\nconst Coffin: ShapeModule<CoffinParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n const hX = Math.max(0, Math.min(cfg.headX, 40));\n const sX = Math.max(hX + 1, Math.min(cfg.shoulderX, 70));\n const fX = Math.max(sX + 1, Math.min(cfg.footX, 100));\n const hH = Math.max(2, Math.min(cfg.headHalfHeight, 50));\n const sDelta = Math.max(0, Math.min(cfg.shoulderHalfHeight, 50));\n const sH = Math.min(50, hH + sDelta);\n const fH = Math.max(2, Math.min(cfg.footHalfHeight, 50));\n return {\n base: 'polygon',\n baseParams: {\n vertices: [\n [hX, 50 - hH],\n [sX, 50 - sH],\n [fX, 50 - fH],\n [fX, 50 + fH],\n [sX, 50 + sH],\n [hX, 50 + hH],\n ],\n },\n };\n },\n insets: { top: 4, right: 6, bottom: 4, left: 11 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Coffin;\n","import type { ShapeModule } from '../types';\n\nexport interface ReceiptParams {\n teeth?: number;\n tearDepth?: number;\n sideToTopRatio?: number;\n}\n\nconst DEFAULTS: Required<ReceiptParams> = { teeth: 11, tearDepth: 4, sideToTopRatio: 3 };\n\nfunction receiptPath(teeth: number, depth: number) {\n const N = Math.max(3, Math.floor(teeth));\n const baseDepth = Math.max(1, depth);\n const depthAt = (i: number) => baseDepth * (0.55 + 0.55 * Math.abs(Math.sin(i * 1.73 + 0.5)));\n let d = `M 0 0 L 100 0`;\n for (let i = 0; i < N; i++) {\n const yMid = ((i + 0.5) / N) * 100;\n const yEnd = ((i + 1) / N) * 100;\n d += ` L ${(100 - depthAt(i)).toFixed(3)} ${yMid.toFixed(3)} L 100 ${yEnd.toFixed(3)}`;\n }\n d += ` L 0 100`;\n for (let i = N - 1; i >= 0; i--) {\n const yMid = ((i + 0.5) / N) * 100;\n const yStart = (i / N) * 100;\n d += ` L ${depthAt(i + N).toFixed(3)} ${yMid.toFixed(3)} L 0 ${yStart.toFixed(3)}`;\n }\n return d + ' Z';\n}\n\nconst BASE_TOP = 2;\n\nconst Receipt: ShapeModule<ReceiptParams> = {\n Component: ({ variant, focused, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const d = receiptPath(cfg.teeth, cfg.tearDepth);\n return (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={d} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={d} />}\n {focused && (\n <path className=\"badge-focus\" d={d} transform=\"translate(50 50) scale(1.04) translate(-50 -50)\" />\n )}\n </>\n );\n },\n insets: (params) => {\n const ratio = Math.max(0.2, Math.min(params.sideToTopRatio ?? DEFAULTS.sideToTopRatio, 10));\n const top = BASE_TOP;\n const side = Math.round(top * ratio);\n return { top, right: side, bottom: top, left: side };\n },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Receipt;\n","import type { ShapeModule } from '../types';\n\nconst body = 'M 8 30 Q 0 50 8 70 L 92 70 Q 100 50 92 30 Z';\n\nconst Wood: ShapeModule = {\n Component: ({ variant, focused }) => (\n <>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={body} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={body} />}\n {(variant === 'outline' || variant === 'solid') && (\n <>\n {/* Long flowing grain curves */}\n <path className=\"badge-stroke\" d=\"M 12 38 Q 30 35 50 39 T 88 38\" opacity={0.5} fill=\"none\" />\n <path className=\"badge-stroke\" d=\"M 10 46 Q 36 49 54 45 T 90 47\" opacity={0.4} fill=\"none\" />\n <path className=\"badge-stroke\" d=\"M 12 54 Q 28 51 52 56 T 88 54\" opacity={0.55} fill=\"none\" />\n <path className=\"badge-stroke\" d=\"M 10 62 Q 40 65 58 61 T 90 62\" opacity={0.4} fill=\"none\" />\n {/* Knots (concentric ellipses around a darker core) */}\n <ellipse className=\"badge-stroke\" cx=\"32\" cy=\"50\" rx=\"3.4\" ry=\"2.8\" opacity={0.7} fill=\"none\" />\n <ellipse className=\"badge-stroke\" cx=\"32\" cy=\"50\" rx=\"1.4\" ry=\"1.1\" opacity={0.85} fill=\"none\" />\n <ellipse className=\"badge-stroke\" cx=\"70\" cy=\"42\" rx=\"2.4\" ry=\"2\" opacity={0.6} fill=\"none\" />\n </>\n )}\n {focused && (\n <path className=\"badge-focus\" d={body} transform=\"translate(50 50) scale(1.05) translate(-50 -50)\" />\n )}\n </>\n ),\n insets: { top: 10, right: 4, bottom: 10, left: 4 },\n stretches: true,\n};\n\nexport default Wood;\n","import type { ShapeModule, ShapeComposeSpec } from '../types';\n\nexport interface QuatrefoilParams {\n spikeR?: number;\n lobeR?: number;\n valleyR?: number;\n valleyAt?: number;\n spikeCurvature?: number;\n spikeBend?: number;\n spikeTipErosion?: number;\n lobeCurvature?: number;\n lobeBend?: number;\n lobeTipErosion?: number;\n valleySmooth?: number;\n rotation?: number;\n samples?: number;\n}\n\nconst DEFAULTS: Required<QuatrefoilParams> = {\n spikeR: 50,\n lobeR: 42,\n valleyR: 25,\n valleyAt: 0.5,\n spikeCurvature: 1,\n spikeBend: 0,\n spikeTipErosion: 0,\n lobeCurvature: 1,\n lobeBend: 0,\n lobeTipErosion: 0,\n valleySmooth: 3,\n rotation: 0,\n samples: 192,\n};\n\nconst Quatrefoil: ShapeModule<QuatrefoilParams> = {\n compose: (params): ShapeComposeSpec => {\n const cfg = { ...DEFAULTS, ...params };\n return { base: 'quatrefoil', baseParams: cfg };\n },\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n stretches: true,\n defaults: DEFAULTS,\n};\n\nexport default Quatrefoil;\n","import type { BadgeShape, ShapeModule } from '../types';\nimport Pill from './Pill';\nimport Plain from './Plain';\nimport Square, { type SquareParams } from './Square';\nimport Notched, { type NotchedParams } from './Notched';\nimport Perforated, { type PerforatedParams } from './Perforated';\nimport Hexagon, { type HexagonParams } from './Hexagon';\nimport Starburst, { type StarburstParams } from './Starburst';\nimport Scalloped, { type ScallopedParams } from './Scalloped';\nimport Shield, { type ShieldParams } from './Shield';\nimport Ribbon, { type RibbonParams } from './Ribbon';\nimport Beavis, { type BeavisParams } from './Beavis';\nimport Sparkler, { type SparklerParams } from './Sparkler';\nimport Postage, { type PostageParams } from './Postage';\nimport Cloud, { type CloudParams } from './Cloud';\nimport House, { type HouseParams } from './House';\nimport Plaque, { type PlaqueParams } from './Plaque';\nimport Crest, { type CrestParams } from './Crest';\nimport Urn from './Urn';\nimport Coffin, { type CoffinParams } from './Coffin';\nimport Receipt, { type ReceiptParams } from './Receipt';\nimport Wood from './Wood';\nimport Quatrefoil, { type QuatrefoilParams } from './Quatrefoil';\n\nexport interface BadgeShapeParams {\n pill: Record<string, never>;\n plain: Record<string, never>;\n square: SquareParams;\n notched: NotchedParams;\n perforated: PerforatedParams;\n hexagon: HexagonParams;\n starburst: StarburstParams;\n scalloped: ScallopedParams;\n shield: ShieldParams;\n ribbon: RibbonParams;\n beavis: BeavisParams;\n sparkler: SparklerParams;\n postage: PostageParams;\n cloud: CloudParams;\n house: HouseParams;\n plaque: PlaqueParams;\n crest: CrestParams;\n urn: Record<string, never>;\n coffin: CoffinParams;\n receipt: ReceiptParams;\n wood: Record<string, never>;\n quatrefoil: QuatrefoilParams;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- ShapeModule's P is contravariant (Component/compose/insets take it), and Badge.tsx indexes this registry by a runtime BadgeShape, so a per-key map type collapses to an unsatisfiable intersection.\nexport const SHAPES: Record<BadgeShape, ShapeModule<any>> = {\n pill: Pill,\n plain: Plain,\n square: Square,\n notched: Notched,\n perforated: Perforated,\n hexagon: Hexagon,\n starburst: Starburst,\n scalloped: Scalloped,\n shield: Shield,\n ribbon: Ribbon,\n beavis: Beavis,\n sparkler: Sparkler,\n postage: Postage,\n cloud: Cloud,\n house: House,\n plaque: Plaque,\n crest: Crest,\n urn: Urn,\n coffin: Coffin,\n receipt: Receipt,\n wood: Wood,\n quatrefoil: Quatrefoil,\n};\n\nexport const ALL_SHAPES: BadgeShape[] = [\n 'pill', 'plain', 'square', 'notched', 'perforated',\n 'hexagon',\n 'starburst', 'scalloped', 'shield', 'ribbon', 'beavis',\n 'sparkler', 'postage', 'cloud', 'house', 'plaque',\n 'crest', 'urn', 'coffin', 'receipt', 'wood', 'quatrefoil',\n];\n","import type { BaseModule, BaseSampler, PerimeterPoint } from './types';\n\nexport interface ChamferedRectParams {\n /** CSS px length of each 45° corner chamfer. */\n chamfer?: number;\n}\n\nconst DEFAULTS: Required<ChamferedRectParams> = { chamfer: 6 };\n\nconst ChamferedRect: BaseModule<ChamferedRectParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n // Chamfer per axis (CSS px → viewBox per-axis).\n const cx = cfg.chamfer * sx;\n const cy = cfg.chamfer * sy;\n // 8 vertices traced clockwise from top-left chamfer start.\n const verts: [number, number][] = [\n [cx, 0],\n [100 - cx, 0],\n [100, cy],\n [100, 100 - cy],\n [100 - cx, 100],\n [cx, 100],\n [0, 100 - cy],\n [0, cy],\n ];\n // Pre-compute CSS lengths of each segment and cumulative sums.\n const cssLens: number[] = [];\n const cumulative: number[] = [0];\n for (let i = 0; i < verts.length; i++) {\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const dx = (b[0] - a[0]) / sx;\n const dy = (b[1] - a[1]) / sy;\n const len = Math.hypot(dx, dy);\n cssLens.push(len);\n cumulative.push(cumulative[cumulative.length - 1] + len);\n }\n const totalCss = cumulative[cumulative.length - 1];\n\n const bodyPath = `M ${verts[0][0]} ${verts[0][1]} ` +\n verts.slice(1).map(([x, y]) => `L ${x} ${y}`).join(' ') + ' Z';\n\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n for (let i = 0; i < cssLens.length; i++) {\n const segStart = cumulative[i];\n const segEnd = cumulative[i + 1];\n if (sm <= segEnd + 1e-9) {\n const t = cssLens[i] > 0 ? (sm - segStart) / cssLens[i] : 0;\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const x = a[0] + (b[0] - a[0]) * t;\n const y = a[1] + (b[1] - a[1]) * t;\n // Outward normal: edge direction in CSS rotated 90° clockwise.\n const ex = (b[0] - a[0]) / sx;\n const ey = (b[1] - a[1]) / sy;\n const el = Math.hypot(ex, ey) || 1;\n // Going clockwise around the body, outward = (-tangent_y, tangent_x)... actually\n // for clockwise traversal in SVG (y-down), outward is to the LEFT of direction,\n // which is (ey, -ex) normalised.\n const nx = ey / el;\n const ny = -ex / el;\n return { x, y, nx, ny };\n }\n }\n return { x: verts[0][0], y: verts[0][1], nx: 0, ny: -1 };\n };\n\n const sampler: BaseSampler = { bodyPath, perimeterAt, totalCss };\n return sampler;\n },\n defaults: DEFAULTS,\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n};\n\nexport default ChamferedRect;\n","import type { BaseModule, BaseSampler, PerimeterPoint } from './types';\n\nexport interface RoundedRectParams {\n /** 0..1 fraction of the maximum corner rounding (1 = full pill / ellipse). */\n erosion?: number;\n /** Stretch the corner arcs horizontally vs vertically. 1 = circular at the badge's\n * native aspect; >1 wider corner arcs; <1 taller corner arcs. */\n eccentricity?: number;\n /** 0..1 vertical squeeze applied to the left and right ends, linearly tapering toward\n * the middle. 1 = ends fully collapsed to the centerline (lemon/lens silhouette). */\n pinch?: number;\n}\n\nconst DEFAULTS: Required<RoundedRectParams> = { erosion: 0.16, eccentricity: 1, pinch: 0 };\n\nconst RoundedRect: BaseModule<RoundedRectParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const erosion = Math.max(0, Math.min(cfg.erosion, 1));\n const ecc = Math.max(0.1, Math.min(cfg.eccentricity, 10));\n // Max corner radius in CSS = half of the shorter axis (so erosion=1 gives a full pill/ellipse).\n const cornerCss = erosion * (Math.min(boxW, boxH) / 2);\n const rxC = cornerCss * sx * ecc;\n const ryC = cornerCss * sy / ecc;\n const rx = Math.max(0, Math.min(rxC, 50));\n const ry = Math.max(0, Math.min(ryC, 50));\n\n const topCss = (100 - 2 * rx) / sx;\n const sideCss = (100 - 2 * ry) / sy;\n const denom = cornerCss + cornerCss || 1;\n const hh = 0;\n const arcCss = (Math.PI * denom * (1 + 3 * hh / (10 + Math.sqrt(4 - 3 * hh)))) / 4;\n\n const segments = [\n { kind: 'h-edge', cssLen: topCss },\n { kind: 'tr-arc', cssLen: arcCss },\n { kind: 'v-edge', cssLen: sideCss },\n { kind: 'br-arc', cssLen: arcCss },\n { kind: 'h-edge-b', cssLen: topCss },\n { kind: 'bl-arc', cssLen: arcCss },\n { kind: 'v-edge-l', cssLen: sideCss },\n { kind: 'tl-arc', cssLen: arcCss },\n ];\n const cum: number[] = [0];\n for (const s of segments) cum.push(cum[cum.length - 1] + s.cssLen);\n const totalCss = cum[cum.length - 1];\n\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n let segIdx = 0;\n while (segIdx < segments.length - 1 && sm > cum[segIdx + 1]) segIdx++;\n const local = sm - cum[segIdx];\n const seg = segments[segIdx];\n const t = seg.cssLen > 0 ? local / seg.cssLen : 0;\n switch (seg.kind) {\n case 'h-edge':\n return { x: rx + (100 - 2 * rx) * t, y: 0, nx: 0, ny: -1 };\n case 'tr-arc': {\n const ang = -Math.PI / 2 + t * (Math.PI / 2);\n return {\n x: (100 - rx) + rx * Math.cos(ang),\n y: ry + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n case 'v-edge':\n return { x: 100, y: ry + (100 - 2 * ry) * t, nx: 1, ny: 0 };\n case 'br-arc': {\n const ang = t * (Math.PI / 2);\n return {\n x: (100 - rx) + rx * Math.cos(ang),\n y: (100 - ry) + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n case 'h-edge-b':\n return { x: (100 - rx) - (100 - 2 * rx) * t, y: 100, nx: 0, ny: 1 };\n case 'bl-arc': {\n const ang = Math.PI / 2 + t * (Math.PI / 2);\n return {\n x: rx + rx * Math.cos(ang),\n y: (100 - ry) + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n case 'v-edge-l':\n return { x: 0, y: (100 - ry) - (100 - 2 * ry) * t, nx: -1, ny: 0 };\n case 'tl-arc': {\n const ang = Math.PI + t * (Math.PI / 2);\n return {\n x: rx + rx * Math.cos(ang),\n y: ry + ry * Math.sin(ang),\n nx: Math.cos(ang),\n ny: Math.sin(ang),\n };\n }\n }\n return { x: 0, y: 0, nx: 0, ny: -1 };\n };\n\n // Vertical pinch toward the centerline, parameterised by horizontal distance from x=50.\n // pinch=0 → identity; pinch=1 → collapses the left/right ends to y=50.\n // Erosion supersedes pinch: as the corners round into a full ellipse there's nothing\n // structurally left to pinch (the ends already taper to the centerline). Scale by\n // (1 - erosion) so a fully pilled badge ignores the slider.\n const pinch = Math.max(0, Math.min(cfg.pinch, 1)) * (1 - erosion);\n const pinchY = (x: number, y: number): number => {\n if (pinch === 0) return y;\n const d = Math.abs(x - 50) / 50;\n return 50 + (y - 50) * (1 - d * pinch);\n };\n\n let bodyPath: string;\n let perimeterAtFinal = perimeterAt;\n if (pinch === 0) {\n bodyPath = [\n `M ${rx} 0`,\n `L ${100 - rx} 0`,\n `A ${rx} ${ry} 0 0 1 100 ${ry}`,\n `L 100 ${100 - ry}`,\n `A ${rx} ${ry} 0 0 1 ${100 - rx} 100`,\n `L ${rx} 100`,\n `A ${rx} ${ry} 0 0 1 0 ${100 - ry}`,\n `L 0 ${ry}`,\n `A ${rx} ${ry} 0 0 1 ${rx} 0`,\n 'Z',\n ].join(' ');\n } else {\n // Sample the unpinched perimeter densely and apply the y-pinch to each point.\n const N = 240;\n const samplePts: { x: number; y: number }[] = [];\n for (let i = 0; i < N; i++) {\n const sCss = (i / N) * totalCss;\n const pt = perimeterAt(sCss);\n samplePts.push({ x: pt.x, y: pinchY(pt.x, pt.y) });\n }\n bodyPath = samplePts.reduce((acc, p, i) =>\n acc + (i === 0 ? `M ${p.x.toFixed(3)} ${p.y.toFixed(3)}` : ` L ${p.x.toFixed(3)} ${p.y.toFixed(3)}`),\n '') + ' Z';\n\n // Warped perimeterAt: pinched point + normal recomputed from local warped tangent.\n perimeterAtFinal = (s: number) => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const pt = perimeterAt(sm);\n const x = pt.x;\n const y = pinchY(pt.x, pt.y);\n const eps = totalCss / 480;\n const a = perimeterAt(sm - eps);\n const b = perimeterAt(sm + eps);\n const ax = a.x, ay = pinchY(a.x, a.y);\n const bx = b.x, by = pinchY(b.x, b.y);\n const tx = (bx - ax) / sx;\n const ty = (by - ay) / sy;\n const tl = Math.hypot(tx, ty) || 1;\n return { x, y, nx: ty / tl, ny: -tx / tl };\n };\n }\n\n const sampler: BaseSampler = { bodyPath, perimeterAt: perimeterAtFinal, totalCss };\n return sampler;\n },\n defaults: DEFAULTS,\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n};\n\nexport default RoundedRect;\n","import type { BaseSampler, PerimeterPoint } from './types';\n\n/** Build a BaseSampler from a clockwise polygon's vertex list (viewBox 0..100). */\nexport function polygonSampler(verts: [number, number][], boxW: number, boxH: number): BaseSampler {\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const cssLens: number[] = [];\n const cumulative: number[] = [0];\n for (let i = 0; i < verts.length; i++) {\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const dx = (b[0] - a[0]) / sx;\n const dy = (b[1] - a[1]) / sy;\n const len = Math.hypot(dx, dy);\n cssLens.push(len);\n cumulative.push(cumulative[cumulative.length - 1] + len);\n }\n const totalCss = cumulative[cumulative.length - 1];\n const bodyPath = `M ${verts[0][0]} ${verts[0][1]} ` +\n verts.slice(1).map(([x, y]) => `L ${x} ${y}`).join(' ') + ' Z';\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n for (let i = 0; i < cssLens.length; i++) {\n const segStart = cumulative[i];\n const segEnd = cumulative[i + 1];\n if (sm <= segEnd + 1e-9) {\n const t = cssLens[i] > 0 ? (sm - segStart) / cssLens[i] : 0;\n const a = verts[i];\n const b = verts[(i + 1) % verts.length];\n const x = a[0] + (b[0] - a[0]) * t;\n const y = a[1] + (b[1] - a[1]) * t;\n const ex = (b[0] - a[0]) / sx;\n const ey = (b[1] - a[1]) / sy;\n const el = Math.hypot(ex, ey) || 1;\n const nx = ey / el;\n const ny = -ex / el;\n return { x, y, nx, ny };\n }\n }\n return { x: verts[0][0], y: verts[0][1], nx: 0, ny: -1 };\n };\n return { bodyPath, perimeterAt, totalCss };\n}\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\nexport interface PolygonParams {\n /** Vertices in viewBox 0..100 coordinates, traced clockwise. */\n vertices?: [number, number][];\n}\n\nconst DEFAULT_VERTS: [number, number][] = [\n [0, 0], [100, 0], [100, 100], [0, 100],\n];\n\nconst Polygon: BaseModule<PolygonParams> = {\n build: (params, boxW, boxH) => {\n const verts = (params?.vertices && params.vertices.length >= 3) ? params.vertices : DEFAULT_VERTS;\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: { vertices: DEFAULT_VERTS },\n insets: { top: 0, right: 4, bottom: 0, left: 4 },\n};\n\nexport default Polygon;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\nexport type PuzzleEdge = 'flat' | 'out' | 'in';\n\nexport interface PuzzleParams {\n top?: PuzzleEdge;\n right?: PuzzleEdge;\n bottom?: PuzzleEdge;\n left?: PuzzleEdge;\n /** Tab radius in viewBox units (0..50). */\n tabSize?: number;\n /** Sample density per tab arc. */\n arcSamples?: number;\n}\n\nconst DEFAULTS: Required<PuzzleParams> = {\n top: 'out',\n right: 'in',\n bottom: 'out',\n left: 'in',\n tabSize: 12,\n arcSamples: 18,\n};\n\n// Fraction of the tab radius the tab center sits beyond the body edge. A center offset of\n// `OFFSET_RATIO * r` gives a tab whose chord (intersection with the edge) has half-length\n// √(1 − OFFSET_RATIO²) · r. Smaller offset → wider neck.\nconst OFFSET_RATIO = 0.62;\n\n/** Sample a side's vertices walking clockwise from `start` to `end` along the edge, possibly\n * detouring around a tab. The starting vertex `start` is NOT included; the ending vertex `end`\n * IS included so successive edge calls chain cleanly. */\nfunction edgeVertices(\n start: [number, number],\n end: [number, number],\n outwardX: number,\n outwardY: number,\n type: PuzzleEdge,\n tabR: number,\n arcSamples: number,\n): [number, number][] {\n if (type === 'flat') return [end];\n const sign = type === 'out' ? 1 : -1;\n const dx = end[0] - start[0];\n const dy = end[1] - start[1];\n const len = Math.hypot(dx, dy) || 1;\n const tx = dx / len;\n const ty = dy / len;\n const mx = (start[0] + end[0]) / 2;\n const my = (start[1] + end[1]) / 2;\n const cx = mx + outwardX * sign * tabR * OFFSET_RATIO;\n const cy = my + outwardY * sign * tabR * OFFSET_RATIO;\n const half = tabR * Math.sqrt(Math.max(0, 1 - OFFSET_RATIO * OFFSET_RATIO));\n const p1: [number, number] = [mx - tx * half, my - ty * half];\n const p2: [number, number] = [mx + tx * half, my + ty * half];\n const apex: [number, number] = [\n mx + outwardX * sign * (tabR + tabR * (1 - OFFSET_RATIO)),\n my + outwardY * sign * (tabR + tabR * (1 - OFFSET_RATIO)),\n ];\n const r = Math.hypot(p1[0] - cx, p1[1] - cy);\n const θ1 = Math.atan2(p1[1] - cy, p1[0] - cx);\n const θ2 = Math.atan2(p2[1] - cy, p2[0] - cx);\n const θApex = Math.atan2(apex[1] - cy, apex[0] - cx);\n // Choose the arc direction that sweeps through θApex.\n const TAU = Math.PI * 2;\n const apexFromStart = ((θApex - θ1) % TAU + TAU) % TAU;\n const endFromStart = ((θ2 - θ1) % TAU + TAU) % TAU;\n // If the CCW sweep covers apex before reaching θ2, use CCW; otherwise CW.\n const sweep = apexFromStart < endFromStart ? endFromStart : endFromStart - TAU;\n\n const out: [number, number][] = [];\n out.push(p1);\n for (let i = 1; i <= arcSamples; i++) {\n const t = i / arcSamples;\n const θ = θ1 + sweep * t;\n out.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n out.push(end);\n return out;\n}\n\nconst Puzzle: BaseModule<PuzzleParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const r = Math.max(2, Math.min(cfg.tabSize, 40));\n const N = Math.max(6, Math.floor(cfg.arcSamples));\n // Clockwise traversal of the unit rect: TL → TR → BR → BL → TL.\n const TL: [number, number] = [0, 0];\n const TR: [number, number] = [100, 0];\n const BR: [number, number] = [100, 100];\n const BL: [number, number] = [0, 100];\n const verts: [number, number][] = [TL];\n verts.push(...edgeVertices(TL, TR, 0, -1, cfg.top, r, N));\n verts.push(...edgeVertices(TR, BR, 1, 0, cfg.right, r, N));\n verts.push(...edgeVertices(BR, BL, 0, 1, cfg.bottom, r, N));\n verts.push(...edgeVertices(BL, TL, -1, 0, cfg.left, r, N));\n // Drop the trailing duplicate of TL.\n if (verts.length > 1 && verts[verts.length - 1][0] === TL[0] && verts[verts.length - 1][1] === TL[1]) {\n verts.pop();\n }\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: DEFAULTS,\n insets: { top: 12, right: 16, bottom: 12, left: 16 },\n};\n\nexport default Puzzle;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\n/**\n * 8-fold-symmetric polar shape. The whole silhouette is defined by a single curve r(s)\n * over s ∈ [0, 1], where s=0 is the cardinal direction and s=1 is the diagonal. The full\n * shape comes from reflecting that octant curve eight times around the center. The curve\n * itself is two superellipse segments meeting at a valley:\n *\n * s ∈ [0, valleyAt] → spike segment, from `spikeR` down to `valleyR`\n * s ∈ [valleyAt, 1] → lobe segment, from `valleyR` up to `lobeR`\n *\n * Each segment has its own curvature, bend bias, and tip-erosion controls.\n */\nexport interface QuatrefoilParams {\n /** Radius at s=0 (cardinal direction). */\n spikeR?: number;\n /** Radius at s=1 (diagonal direction). */\n lobeR?: number;\n /** Radius at the junction between spike and lobe segments. */\n valleyR?: number;\n /** Position of the junction in [0, 1]. 0.5 = symmetric octant; <0.5 narrows the spike side. */\n valleyAt?: number;\n /** Spike-segment curvature (superellipse exponent). 1 = flat diagonal sides; <1 caves\n * inward (concave/star); >1 bulges outward (convex/square-shouldered). */\n spikeCurvature?: number;\n /** Spike-segment bend bias. Positive shifts the curve's bend toward the tip; negative\n * toward the base. */\n spikeBend?: number;\n /** Flat-top truncation of the cardinal tip (0..1). */\n spikeTipErosion?: number;\n /** Lobe-segment curvature, same semantics as spike. */\n lobeCurvature?: number;\n /** Lobe-segment bend bias. */\n lobeBend?: number;\n /** Flat-top truncation of the diagonal lobe peak (0..1). */\n lobeTipErosion?: number;\n /** Smooth the corner at the valley junction. 0 = sharp, higher = puffier crossover. */\n valleySmooth?: number;\n /** Rotate the pattern in degrees. */\n rotation?: number;\n /** Polygon sample count. */\n samples?: number;\n}\n\nconst DEFAULTS: Required<QuatrefoilParams> = {\n spikeR: 50,\n lobeR: 42,\n valleyR: 25,\n valleyAt: 0.5,\n spikeCurvature: 1,\n spikeBend: 0,\n spikeTipErosion: 0,\n lobeCurvature: 1,\n lobeBend: 0,\n lobeTipErosion: 0,\n valleySmooth: 3,\n rotation: 0,\n samples: 192,\n};\n\nfunction smoothMax(a: number, b: number, g: number): number {\n const d = a - b;\n return (a + b + Math.sqrt(d * d + g * g)) / 2;\n}\n\n/** Generalised superellipse-style profile from (0, 0) to (1, 1) with asymmetric exponents\n * controlled by curvature and bend. erosion truncates the top of the curve. */\nfunction curveSegment(t: number, curvature: number, bend: number, erosion: number): number {\n if (t <= 0) return 0;\n if (t >= 1) return 1 - erosion;\n const expA = Math.max(0.1, curvature * (1 + bend));\n const expB = Math.max(0.1, curvature * (1 - bend));\n const v = Math.pow(1 - Math.pow(1 - t, expA), 1 / expB);\n return Math.min(v, 1 - erosion);\n}\n\nexport function quatrefoilVertices(params: QuatrefoilParams = {}): [number, number][] {\n const cfg = { ...DEFAULTS, ...params };\n const spike = Math.max(5, Math.min(cfg.spikeR, 50));\n const lobe = Math.max(5, Math.min(cfg.lobeR, 50 * Math.SQRT2));\n const valley = Math.max(0, Math.min(cfg.valleyR, Math.min(spike, lobe)));\n const vAt = Math.max(0.05, Math.min(cfg.valleyAt, 0.95));\n const sCurv = Math.max(0.2, cfg.spikeCurvature);\n const sBend = Math.max(-0.95, Math.min(cfg.spikeBend, 0.95));\n const sErode = Math.max(0, Math.min(cfg.spikeTipErosion, 1));\n const lCurv = Math.max(0.2, cfg.lobeCurvature);\n const lBend = Math.max(-0.95, Math.min(cfg.lobeBend, 0.95));\n const lErode = Math.max(0, Math.min(cfg.lobeTipErosion, 1));\n const smooth = Math.max(0, cfg.valleySmooth);\n const rot = (cfg.rotation * Math.PI) / 180;\n const N = Math.max(24, Math.floor(cfg.samples));\n const cx = 50, cy = 50;\n const verts: [number, number][] = [];\n for (let i = 0; i < N; i++) {\n const θ = (i / N) * 2 * Math.PI;\n const s = Math.abs(Math.sin(2 * (θ - rot))); // 0..1 across each octant\n // t1: spike-side parameter, 1 at cardinal (s=0), 0 at valley (s=vAt). Clamped to ≥ 0.\n const t1 = (vAt - s) / vAt;\n // t2: lobe-side parameter, 0 at valley (s=vAt), 1 at diagonal (s=1). Clamped to ≥ 0.\n const t2 = (s - vAt) / (1 - vAt);\n const rSpike = valley + (spike - valley) * curveSegment(Math.max(0, t1), sCurv, sBend, sErode);\n const rLobe = valley + (lobe - valley) * curveSegment(Math.max(0, t2), lCurv, lBend, lErode);\n // Smooth corner at the valley: outside the smoothing band both rSpike and rLobe equal\n // `valley` on the inactive side, so smoothMax just picks the active one. Near the join\n // both are close to valley and smoothMax lifts the corner.\n const r = smoothMax(rSpike, rLobe, smooth);\n verts.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n return verts;\n}\n\nconst Quatrefoil: BaseModule<QuatrefoilParams> = {\n build: (params, boxW, boxH) => polygonSampler(quatrefoilVertices(params), boxW, boxH),\n defaults: DEFAULTS,\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n};\n\nexport default Quatrefoil;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\n/**\n * Symmetric polar-spline base. The silhouette comes from a single curve r(s) over\n * s ∈ [0, 1] that gets reflected/rotated to fill the full circle:\n *\n * - `mode: 'octant'`: 1/8 of the perimeter (cardinal → diagonal), mirrored within each\n * quadrant and rotated to fill the rest. 8-fold symmetric.\n * - `mode: 'quadrant'`: 1/4 of the perimeter (cardinal → next cardinal), rotated 4 times\n * with no internal mirror. 4-fold rotational symmetry; endpoints share radius.\n *\n * The interpolant is a **clamped natural cubic spline** with zero slope at both endpoints\n * (so the reflected/rotated full curve has no kink crossing the symmetry axes). C² across\n * the whole octant — continuous curvature, not just slope — which removes the \"lumpy\" feel\n * that local Hermite splines have when anchors are uneven.\n */\nexport interface OctantSplineParams {\n mode?: 'octant' | 'quadrant';\n /** Number of active anchors (3..12). */\n count?: number;\n s0?: number; s1?: number; s2?: number; s3?: number; s4?: number; s5?: number;\n s6?: number; s7?: number; s8?: number; s9?: number; s10?: number; s11?: number;\n r0?: number; r1?: number; r2?: number; r3?: number; r4?: number; r5?: number;\n r6?: number; r7?: number; r8?: number; r9?: number; r10?: number; r11?: number;\n /** Per-anchor weight (0..3). The spline is constructed to pass through every anchor exactly;\n * the weight biases how strongly that anchor influences the rest of the curve. Implementation\n * detail: blends the C² interpolant with a polynomial fit weighted by w. Default 1 = pure\n * C² interpolation; <1 lets the curve sweep past the anchor (anchor still passed through);\n * >1 makes the curve hug the anchor more tightly (sharper local bend). */\n w0?: number; w1?: number; w2?: number; w3?: number; w4?: number; w5?: number;\n w6?: number; w7?: number; w8?: number; w9?: number; w10?: number; w11?: number;\n rotation?: number;\n samples?: number;\n}\n\nexport const OCTANT_SPLINE_MAX_ANCHORS = 12;\n\nconst DEFAULTS: Required<OctantSplineParams> = {\n mode: 'octant',\n count: 5,\n s0: 0, s1: 0.25, s2: 0.5, s3: 0.75, s4: 1, s5: 1,\n s6: 1, s7: 1, s8: 1, s9: 1, s10: 1, s11: 1,\n r0: 48, r1: 30, r2: 32, r3: 38, r4: 46, r5: 42,\n r6: 36, r7: 32, r8: 30, r9: 30, r10: 30, r11: 30,\n w0: 1, w1: 1, w2: 1, w3: 1, w4: 1, w5: 1,\n w6: 1, w7: 1, w8: 1, w9: 1, w10: 1, w11: 1,\n rotation: 0,\n samples: 192,\n};\n\ninterface Anchor { s: number; r: number; w: number }\n\nexport function extractAnchorPairs(params: OctantSplineParams = {}): Anchor[] {\n const cfg = { ...DEFAULTS, ...params };\n const count = Math.max(3, Math.min(Math.floor(cfg.count), OCTANT_SPLINE_MAX_ANCHORS));\n const sKeys: (keyof Required<OctantSplineParams>)[] = ['s0','s1','s2','s3','s4','s5','s6','s7','s8','s9','s10','s11'];\n const rKeys: (keyof Required<OctantSplineParams>)[] = ['r0','r1','r2','r3','r4','r5','r6','r7','r8','r9','r10','r11'];\n const wKeys: (keyof Required<OctantSplineParams>)[] = ['w0','w1','w2','w3','w4','w5','w6','w7','w8','w9','w10','w11'];\n const pairs: Anchor[] = [];\n for (let i = 0; i < count; i++) {\n pairs.push({\n s: Math.max(0, Math.min(1, Number(cfg[sKeys[i]]))),\n r: Math.max(0, Number(cfg[rKeys[i]])),\n w: Math.max(0, Number(cfg[wKeys[i]] ?? 1)),\n });\n }\n pairs.sort((a, b) => a.s - b.s);\n pairs[0].s = 0;\n pairs[count - 1].s = 1;\n if (cfg.mode === 'quadrant') {\n pairs[count - 1].r = pairs[0].r;\n pairs[count - 1].w = pairs[0].w;\n }\n return pairs;\n}\n\n/**\n * Solve the clamped natural cubic spline with zero end-slopes. Returns the second-derivative\n * vector M[0..n] which feeds the standard cubic-spline evaluation formula. Solves a\n * tridiagonal system in O(n).\n */\nfunction solveCubicSpline(anchors: Anchor[]): number[] {\n const n = anchors.length - 1;\n const h: number[] = new Array(n);\n for (let i = 0; i < n; i++) h[i] = Math.max(1e-9, anchors[i + 1].s - anchors[i].s);\n // Build tridiagonal system for M[0..n] with clamped zero-slope BCs.\n // row 0: (h0/3) M0 + (h0/6) M1 = (r1-r0)/h0\n // row i (1..n-1): (h_{i-1}/6) M_{i-1} + ((h_{i-1}+h_i)/3) M_i + (h_i/6) M_{i+1}\n // = (r_{i+1}-r_i)/h_i - (r_i-r_{i-1})/h_{i-1}\n // row n: (h_{n-1}/6) M_{n-1} + (h_{n-1}/3) M_n = -(r_n-r_{n-1})/h_{n-1}\n const a: number[] = new Array(n + 1); // subdiagonal\n const b: number[] = new Array(n + 1); // diagonal\n const c: number[] = new Array(n + 1); // superdiagonal\n const d: number[] = new Array(n + 1); // rhs\n a[0] = 0;\n b[0] = h[0] / 3;\n c[0] = h[0] / 6;\n d[0] = (anchors[1].r - anchors[0].r) / h[0];\n for (let i = 1; i < n; i++) {\n a[i] = h[i - 1] / 6;\n b[i] = (h[i - 1] + h[i]) / 3;\n c[i] = h[i] / 6;\n d[i] = (anchors[i + 1].r - anchors[i].r) / h[i] - (anchors[i].r - anchors[i - 1].r) / h[i - 1];\n }\n a[n] = h[n - 1] / 6;\n b[n] = h[n - 1] / 3;\n c[n] = 0;\n d[n] = -(anchors[n].r - anchors[n - 1].r) / h[n - 1];\n // Thomas algorithm: forward sweep, then back-substitution.\n for (let i = 1; i <= n; i++) {\n const w = a[i] / b[i - 1];\n b[i] -= w * c[i - 1];\n d[i] -= w * d[i - 1];\n }\n const M: number[] = new Array(n + 1);\n M[n] = d[n] / b[n];\n for (let i = n - 1; i >= 0; i--) M[i] = (d[i] - c[i] * M[i + 1]) / b[i];\n return M;\n}\n\ninterface CompiledSpline {\n anchors: Anchor[];\n M: number[];\n}\n\nexport function compileSpline(anchors: Anchor[]): CompiledSpline {\n return { anchors, M: solveCubicSpline(anchors) };\n}\n\nexport function evalCompiled(s: number, spline: CompiledSpline): number {\n const { anchors, M } = spline;\n const N = anchors.length;\n if (N === 0) return 0;\n if (N === 1) return anchors[0].r;\n if (s <= anchors[0].s) return anchors[0].r;\n if (s >= anchors[N - 1].s) return anchors[N - 1].r;\n let i = 0;\n while (i < N - 1 && anchors[i + 1].s <= s) i++;\n const p0 = anchors[i];\n const p1 = anchors[i + 1];\n const h = p1.s - p0.s;\n if (h <= 0) return p0.r;\n const A = (p1.s - s) / h;\n const B = (s - p0.s) / h;\n // Apply per-anchor weight as a local sharpening factor on the C² interpolant. With both\n // weights = 1 this is pure natural cubic spline. Weights > 1 add a centered \"lift\" toward\n // the anchor (sharpens), < 1 subtracts (smooths past). The lift kernel is the standard\n // cubic-spline second-derivative term, scaled per-side by (w - 1).\n const liftA = ((A * A * A - A) * h * h) / 6;\n const liftB = ((B * B * B - B) * h * h) / 6;\n const baseLine = A * p0.r + B * p1.r;\n const curvatureTerm = liftA * M[i] * p0.w + liftB * M[i + 1] * p1.w;\n return baseLine + curvatureTerm;\n}\n\nconst OctantSpline: BaseModule<OctantSplineParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const anchors = extractAnchorPairs(cfg);\n const spline = compileSpline(anchors);\n const rot = (cfg.rotation * Math.PI) / 180;\n const N = Math.max(48, Math.floor(cfg.samples));\n const cx = 50, cy = 50;\n const verts: [number, number][] = [];\n const HALF_PI = Math.PI / 2;\n for (let i = 0; i < N; i++) {\n const θ = (i / N) * 2 * Math.PI;\n const θRel = θ - rot;\n let s: number;\n if (cfg.mode === 'quadrant') {\n const θQ = ((θRel % HALF_PI) + HALF_PI) % HALF_PI;\n s = θQ / HALF_PI;\n } else {\n s = Math.abs(Math.sin(2 * θRel));\n }\n const r = evalCompiled(s, spline);\n verts.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: DEFAULTS,\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n};\n\nexport default OctantSpline;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\n/**\n * Symmetric polar NURBS base. Same anchor concept as `octant-spline` but the curve is an\n * **approximating** cubic NURBS — the control points pull the curve without sitting on it.\n * Each anchor's weight increases the local pull toward that control point.\n *\n * Endpoint behaviour: the curve uses mirror-phantom control points just outside [0, 1]\n * derived from the second-from-end anchors, which enforces zero slope at s=0 and s=1 so\n * the reflected/rotated full silhouette closes cleanly across the symmetry axes.\n */\nexport interface OctantBSplineParams {\n mode?: 'octant' | 'quadrant';\n count?: number;\n s0?: number; s1?: number; s2?: number; s3?: number; s4?: number; s5?: number;\n s6?: number; s7?: number; s8?: number; s9?: number; s10?: number; s11?: number;\n r0?: number; r1?: number; r2?: number; r3?: number; r4?: number; r5?: number;\n r6?: number; r7?: number; r8?: number; r9?: number; r10?: number; r11?: number;\n w0?: number; w1?: number; w2?: number; w3?: number; w4?: number; w5?: number;\n w6?: number; w7?: number; w8?: number; w9?: number; w10?: number; w11?: number;\n rotation?: number;\n samples?: number;\n}\n\nexport const OCTANT_BSPLINE_MAX_ANCHORS = 12;\n\nconst DEFAULTS: Required<OctantBSplineParams> = {\n mode: 'octant',\n count: 5,\n s0: 0, s1: 0.25, s2: 0.5, s3: 0.75, s4: 1, s5: 1,\n s6: 1, s7: 1, s8: 1, s9: 1, s10: 1, s11: 1,\n r0: 48, r1: 30, r2: 32, r3: 38, r4: 46, r5: 42,\n r6: 36, r7: 32, r8: 30, r9: 30, r10: 30, r11: 30,\n w0: 1, w1: 1, w2: 1, w3: 1, w4: 1, w5: 1,\n w6: 1, w7: 1, w8: 1, w9: 1, w10: 1, w11: 1,\n rotation: 0,\n samples: 192,\n};\n\ninterface Anchor { s: number; r: number; w: number }\n\nexport function extractAnchorPairs(params: OctantBSplineParams = {}): Anchor[] {\n const cfg = { ...DEFAULTS, ...params };\n const count = Math.max(3, Math.min(Math.floor(cfg.count), OCTANT_BSPLINE_MAX_ANCHORS));\n const sKeys: (keyof Required<OctantBSplineParams>)[] = ['s0','s1','s2','s3','s4','s5','s6','s7','s8','s9','s10','s11'];\n const rKeys: (keyof Required<OctantBSplineParams>)[] = ['r0','r1','r2','r3','r4','r5','r6','r7','r8','r9','r10','r11'];\n const wKeys: (keyof Required<OctantBSplineParams>)[] = ['w0','w1','w2','w3','w4','w5','w6','w7','w8','w9','w10','w11'];\n const pairs: Anchor[] = [];\n for (let i = 0; i < count; i++) {\n pairs.push({\n s: Math.max(0, Math.min(1, Number(cfg[sKeys[i]]))),\n r: Math.max(0, Number(cfg[rKeys[i]])),\n w: Math.max(0.01, Number(cfg[wKeys[i]] ?? 1)),\n });\n }\n pairs.sort((a, b) => a.s - b.s);\n pairs[0].s = 0;\n pairs[count - 1].s = 1;\n if (cfg.mode === 'quadrant') {\n pairs[count - 1].r = pairs[0].r;\n pairs[count - 1].w = pairs[0].w;\n }\n return pairs;\n}\n\n/**\n * Cubic NURBS evaluation. Returns r at parameter u ∈ [0, 1].\n *\n * Implementation uses (s_i, r_i, w_i) as control points and treats `u` as the underlying\n * curve parameter, with the knot vector clamped at both ends. Because the control points'\n * `s` coordinates are themselves part of the curve, we need a parametric formulation:\n * S(u) = Σ w_i N_i(u) s_i / Σ w_i N_i(u)\n * R(u) = Σ w_i N_i(u) r_i / Σ w_i N_i(u)\n * Then we invert S(u) = s to get u and read out R(u).\n *\n * Two phantom control points are inserted at each end (mirror reflections of the second-\n * from-end anchors across the cardinal/diagonal axes), forcing zero slope at the endpoints\n * for clean symmetric closure.\n */\nfunction buildExtendedControls(anchors: Anchor[]): Anchor[] {\n const N = anchors.length;\n // Phantom controls outside [0, 1]. They are mirrored versions of the second-from-end\n // visible anchors. Symmetric reflection gives zero slope at the cardinal/diagonal endpoints.\n const phantomLeft1: Anchor = { s: -anchors[1].s, r: anchors[1].r, w: anchors[1].w };\n const phantomLeft2: Anchor = { s: -anchors[Math.min(2, N - 1)].s, r: anchors[Math.min(2, N - 1)].r, w: anchors[Math.min(2, N - 1)].w };\n const phantomRight1: Anchor = { s: 2 - anchors[N - 2].s, r: anchors[N - 2].r, w: anchors[N - 2].w };\n const phantomRight2: Anchor = { s: 2 - anchors[Math.max(N - 3, 0)].s, r: anchors[Math.max(N - 3, 0)].r, w: anchors[Math.max(N - 3, 0)].w };\n return [phantomLeft2, phantomLeft1, ...anchors, phantomRight1, phantomRight2];\n}\n\nfunction buildKnots(numCtrl: number, degree: number): number[] {\n // Clamped uniform knot vector of length numCtrl + degree + 1.\n const m = numCtrl + degree + 1;\n const knots: number[] = new Array(m);\n for (let i = 0; i <= degree; i++) knots[i] = 0;\n const interior = numCtrl - degree - 1;\n for (let i = 1; i <= interior; i++) knots[degree + i] = i / (interior + 1);\n for (let i = m - degree - 1; i < m; i++) knots[i] = 1;\n return knots;\n}\n\nfunction findSpan(u: number, knots: number[], degree: number, numCtrl: number): number {\n if (u >= knots[numCtrl]) return numCtrl - 1;\n if (u <= knots[degree]) return degree;\n let low = degree;\n let high = numCtrl;\n let mid = (low + high) >>> 1;\n while (u < knots[mid] || u >= knots[mid + 1]) {\n if (u < knots[mid]) high = mid;\n else low = mid;\n mid = (low + high) >>> 1;\n }\n return mid;\n}\n\nfunction basisFns(span: number, u: number, knots: number[], degree: number): number[] {\n const N: number[] = new Array(degree + 1).fill(0);\n const left: number[] = new Array(degree + 1);\n const right: number[] = new Array(degree + 1);\n N[0] = 1;\n for (let j = 1; j <= degree; j++) {\n left[j] = u - knots[span + 1 - j];\n right[j] = knots[span + j] - u;\n let saved = 0;\n for (let r = 0; r < j; r++) {\n const denom = right[r + 1] + left[j - r];\n const temp = denom === 0 ? 0 : N[r] / denom;\n N[r] = saved + right[r + 1] * temp;\n saved = left[j - r] * temp;\n }\n N[j] = saved;\n }\n return N;\n}\n\ninterface CompiledNurbs {\n extended: Anchor[];\n knots: number[];\n degree: number;\n}\n\nexport function compileNurbs(anchors: Anchor[]): CompiledNurbs {\n const extended = buildExtendedControls(anchors);\n const degree = 3;\n const knots = buildKnots(extended.length, degree);\n return { extended, knots, degree };\n}\n\nfunction evalNurbsAtU(u: number, nurbs: CompiledNurbs): { s: number; r: number } {\n const { extended, knots, degree } = nurbs;\n const numCtrl = extended.length;\n const uClamped = Math.max(0, Math.min(1, u));\n const span = findSpan(uClamped, knots, degree, numCtrl);\n const N = basisFns(span, uClamped, knots, degree);\n let sNum = 0;\n let rNum = 0;\n let wSum = 0;\n for (let i = 0; i <= degree; i++) {\n const ctrl = extended[span - degree + i];\n const wn = ctrl.w * N[i];\n sNum += wn * ctrl.s;\n rNum += wn * ctrl.r;\n wSum += wn;\n }\n return wSum > 0 ? { s: sNum / wSum, r: rNum / wSum } : { s: 0, r: 0 };\n}\n\n/** Invert S(u) = s by bisection. The NURBS is monotonic in s because the underlying knot\n * vector and control sequence are monotonic, so bisection converges quickly. */\nexport function evalNurbsAtS(s: number, nurbs: CompiledNurbs): number {\n if (s <= 0) return evalNurbsAtU(0, nurbs).r;\n if (s >= 1) return evalNurbsAtU(1, nurbs).r;\n let lo = 0, hi = 1;\n for (let iter = 0; iter < 30; iter++) {\n const mid = (lo + hi) * 0.5;\n const { s: sMid } = evalNurbsAtU(mid, nurbs);\n if (sMid < s) lo = mid; else hi = mid;\n if (hi - lo < 1e-5) break;\n }\n return evalNurbsAtU((lo + hi) * 0.5, nurbs).r;\n}\n\nconst OctantBSpline: BaseModule<OctantBSplineParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const anchors = extractAnchorPairs(cfg);\n const nurbs = compileNurbs(anchors);\n const rot = (cfg.rotation * Math.PI) / 180;\n const N = Math.max(48, Math.floor(cfg.samples));\n const cx = 50, cy = 50;\n const verts: [number, number][] = [];\n const HALF_PI = Math.PI / 2;\n for (let i = 0; i < N; i++) {\n const θ = (i / N) * 2 * Math.PI;\n const θRel = θ - rot;\n let s: number;\n if (cfg.mode === 'quadrant') {\n const θQ = ((θRel % HALF_PI) + HALF_PI) % HALF_PI;\n s = θQ / HALF_PI;\n } else {\n s = Math.abs(Math.sin(2 * θRel));\n }\n const r = evalNurbsAtS(s, nurbs);\n verts.push([cx + r * Math.cos(θ), cy + r * Math.sin(θ)]);\n }\n return polygonSampler(verts, boxW, boxH);\n },\n defaults: DEFAULTS,\n insets: { top: 10, right: 14, bottom: 10, left: 14 },\n};\n\nexport default OctantBSpline;\n","import type { BaseModule } from './types';\nimport { polygonSampler } from './polygonSampler';\n\nexport type RibbonEnd = 'inward' | 'outward' | 'flat';\n\nexport interface RibbonParams {\n left?: RibbonEnd;\n right?: RibbonEnd;\n /** Taper depth in CSS px. Stays fixed regardless of badge width — viewBox\n * vertices are computed at build time using `boxW`. */\n taperWidth?: number;\n}\n\nconst DEFAULTS: Required<RibbonParams> = { left: 'inward', right: 'outward', taperWidth: 8 };\n\ninterface SidePoints {\n top: [number, number];\n mid: [number, number] | null;\n bottom: [number, number];\n}\n\nfunction sidePoints(mode: RibbonEnd, xBaseVb: number, signVb: number, taperVb: number): SidePoints {\n switch (mode) {\n case 'flat':\n return { top: [xBaseVb, 0], mid: null, bottom: [xBaseVb, 100] };\n case 'outward':\n return {\n top: [xBaseVb + signVb * taperVb, 0],\n mid: [xBaseVb, 50],\n bottom: [xBaseVb + signVb * taperVb, 100],\n };\n case 'inward':\n return {\n top: [xBaseVb, 0],\n mid: [xBaseVb + signVb * taperVb, 50],\n bottom: [xBaseVb, 100],\n };\n }\n}\n\nfunction sideInsetCss(mode: RibbonEnd, taperCss: number): number {\n const t = Math.max(0, taperCss);\n switch (mode) {\n case 'flat': return 4;\n case 'outward': return Math.round(t * 0.7);\n case 'inward': return Math.round(t * 0.8);\n }\n}\n\nconst Ribbon: BaseModule<RibbonParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const taperCss = Math.max(0, cfg.taperWidth);\n // Convert CSS px taper into viewBox-x units so the rendered pointer\n // is the same CSS-px depth regardless of badge width.\n const taperVb = boxW > 0 ? (taperCss / boxW) * 100 : 0;\n const l = sidePoints(cfg.left, 0, 1, taperVb);\n const r = sidePoints(cfg.right, 100, -1, taperVb);\n const verts: [number, number][] = [l.top];\n verts.push(r.top);\n if (r.mid) verts.push(r.mid);\n verts.push(r.bottom);\n verts.push(l.bottom);\n if (l.mid) verts.push(l.mid);\n return polygonSampler(verts, boxW, boxH);\n },\n insets: (params) => {\n const cfg = { ...DEFAULTS, ...params };\n return {\n top: 0,\n right: sideInsetCss(cfg.right, cfg.taperWidth),\n bottom: 0,\n left: sideInsetCss(cfg.left, cfg.taperWidth),\n };\n },\n defaults: DEFAULTS,\n};\n\nexport default Ribbon;\n","/**\n * Shapes one vertical edge of a badge base. Given a position down the edge\n * (`t`, 0 at the top to 1 at the bottom) and the configured depth in CSS px,\n * returns the horizontal displacement of that point, positive to the right.\n */\nexport type EdgeProfile = (t: number, depth: number) => number;\n\n/** The named edge profiles in {@link EDGE_PROFILES}. */\nexport type BuiltInEdgeName =\n | 'flat'\n | 'chevron'\n | 'slant'\n | 'slant-up'\n | 'round'\n | 'scallop'\n | 'concave-chevron';\n\n/** An edge profile, either by name or as a function. */\nexport type EdgeCap = BuiltInEdgeName | EdgeProfile;\n\n/** The built-in {@link EdgeProfile} implementations, by name. */\nexport const EDGE_PROFILES: Record<BuiltInEdgeName, EdgeProfile> = {\n flat: (_t, _d) => 0,\n chevron: (t, d) => (1 - Math.abs(t - 0.5) * 2) * d,\n slant: (t, d) => t * d,\n 'slant-up': (t, d) => (1 - t) * d,\n round: (t, d) => Math.sin(t * Math.PI) * d,\n scallop: (t, d) => Math.sin(t * Math.PI * 3) * 0.4 * d,\n 'concave-chevron': (t, d) => -(1 - Math.abs(t - 0.5) * 2) * d,\n};\n\nexport function resolveEdge(cap: EdgeCap): EdgeProfile {\n if (typeof cap === 'function') return cap;\n return EDGE_PROFILES[cap] ?? EDGE_PROFILES.flat;\n}\n","import { resolveEdge, type EdgeCap } from './edgeProfiles';\nimport type { BaseModule, BaseSampler, PerimeterPoint } from './types';\n\nexport interface PowerlineParams {\n /** Profile for the left edge (the cap segment N inherits from segment N-1). */\n leftEdge?: EdgeCap;\n /** Profile for the right edge (this segment's own end cap). */\n rightEdge?: EdgeCap;\n /** Protrusion depth in CSS px (positive values stick out beyond the rect). */\n depth?: number;\n}\n\nconst DEFAULTS: Required<PowerlineParams> = {\n leftEdge: 'flat',\n rightEdge: 'flat',\n depth: 6,\n};\n\n// Samples per vertical edge. 64 is smooth enough for chevron/round caps and\n// cheap to evaluate; the perimeter is sampled once per `build` call.\nconst EDGE_SAMPLES = 64;\n\nconst Powerline: BaseModule<PowerlineParams> = {\n build: (params, boxW, boxH) => {\n const cfg = { ...DEFAULTS, ...params };\n const left = resolveEdge(cfg.leftEdge);\n const right = resolveEdge(cfg.rightEdge);\n const depth = cfg.depth;\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n\n const pts: { x: number; y: number; nx: number; ny: number }[] = [];\n\n // Top corners follow the same edge profiles as the rest of the verticals,\n // so a profile that protrudes/cuts at t=0 (e.g. slant-up) doesn't introduce\n // a corner kink between the flat top and the first vertical sample.\n pts.push({ x: left(0, depth) * sx, y: 0, nx: 0, ny: -1 });\n pts.push({ x: (boxW + right(0, depth)) * sx, y: 0, nx: 0, ny: -1 });\n\n for (let i = 1; i < EDGE_SAMPLES; i++) {\n const t = i / EDGE_SAMPLES;\n const xCss = boxW + right(t, depth);\n pts.push({ x: xCss * sx, y: t * 100, nx: 1, ny: 0 });\n }\n\n pts.push({ x: (boxW + right(1, depth)) * sx, y: 100, nx: 0, ny: 1 });\n pts.push({ x: (0 + left(1, depth)) * sx, y: 100, nx: 0, ny: 1 });\n\n for (let i = EDGE_SAMPLES - 1; i >= 1; i--) {\n const t = i / EDGE_SAMPLES;\n const xCss = 0 + left(t, depth);\n pts.push({ x: xCss * sx, y: t * 100, nx: -1, ny: 0 });\n }\n\n const cum: number[] = [0];\n for (let i = 1; i < pts.length; i++) {\n const a = pts[i - 1];\n const b = pts[i];\n const dxCss = (b.x - a.x) / sx;\n const dyCss = (b.y - a.y) / sy;\n cum.push(cum[i - 1] + Math.hypot(dxCss, dyCss));\n }\n const last = pts[pts.length - 1];\n const first = pts[0];\n const closeLen = Math.hypot((first.x - last.x) / sx, (first.y - last.y) / sy);\n const totalCss = cum[cum.length - 1] + closeLen;\n\n const perimeterAt = (s: number): PerimeterPoint => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n for (let i = 1; i < pts.length; i++) {\n if (sm <= cum[i]) {\n const segLen = cum[i] - cum[i - 1];\n const t = segLen > 0 ? (sm - cum[i - 1]) / segLen : 0;\n const a = pts[i - 1];\n const b = pts[i];\n return {\n x: a.x + (b.x - a.x) * t,\n y: a.y + (b.y - a.y) * t,\n nx: b.nx,\n ny: b.ny,\n };\n }\n }\n const lastIdx = pts.length - 1;\n const segLen = closeLen;\n const t = segLen > 0 ? (sm - cum[lastIdx]) / segLen : 0;\n return {\n x: pts[lastIdx].x + (first.x - pts[lastIdx].x) * t,\n y: pts[lastIdx].y + (first.y - pts[lastIdx].y) * t,\n nx: 0,\n ny: 1,\n };\n };\n\n const bodyPath = pts.reduce(\n (acc, p, i) =>\n acc + (i === 0\n ? `M ${p.x.toFixed(3)} ${p.y.toFixed(3)}`\n : ` L ${p.x.toFixed(3)} ${p.y.toFixed(3)}`),\n ''\n ) + ' Z';\n\n const sampler: BaseSampler = { bodyPath, perimeterAt, totalCss };\n return sampler;\n },\n defaults: DEFAULTS,\n insets: (params) => {\n const depth = params?.depth ?? DEFAULTS.depth;\n const leftCap = params?.leftEdge ?? DEFAULTS.leftEdge;\n const rightCap = params?.rightEdge ?? DEFAULTS.rightEdge;\n const left = resolveEdge(leftCap);\n const right = resolveEdge(rightCap);\n // Sample the profiles to compute (a) each side's average offset, used to\n // shift padding so text reads centered in the visible silhouette (not the\n // bounding rect), and (b) each side's deepest inward cut, the floor below\n // which padding mustn't drop or text would crash into the cap.\n // Trapezoid integration over [0, 1] — exact for piecewise-linear profiles\n // (chevron, slant, slant-up) and accurate enough for the curved ones.\n const N = 32;\n let avgLeft = 0;\n let avgRight = 0;\n let maxLeftInward = 0;\n let maxRightInward = 0;\n for (let i = 0; i <= N; i++) {\n const t = i / N;\n const l = left(t, depth);\n const r = right(t, depth);\n const w = i === 0 || i === N ? 0.5 : 1;\n avgLeft += (w * l) / N;\n avgRight += (w * r) / N;\n if (l > maxLeftInward) maxLeftInward = l;\n if (-r > maxRightInward) maxRightInward = -r;\n }\n // Desired asymmetry: padLeft - padRight = avgLeft + avgRight (so the text\n // centroid sits at the silhouette's centroid). Hold padLeft + padRight = 2 * depth.\n const shift = (avgLeft + avgRight) / 2;\n const leftPad = Math.max(maxLeftInward, depth + shift);\n const rightPad = Math.max(maxRightInward, depth - shift);\n return { top: 0, right: rightPad, bottom: 0, left: leftPad };\n },\n};\n\nexport default Powerline;\n","import type { BaseModule } from './types';\nimport ChamferedRect, { type ChamferedRectParams } from './ChamferedRect';\nimport RoundedRect, { type RoundedRectParams } from './RoundedRect';\nimport Polygon, { type PolygonParams } from './Polygon';\nimport Puzzle, { type PuzzleParams } from './Puzzle';\nimport Quatrefoil, { type QuatrefoilParams } from './Quatrefoil';\nimport OctantSpline, { type OctantSplineParams } from './OctantSpline';\nimport OctantBSpline, { type OctantBSplineParams } from './OctantBSpline';\nimport Ribbon, { type RibbonParams } from './Ribbon';\nimport Powerline, { type PowerlineParams } from './Powerline';\n\nexport type BadgeBase =\n | 'chamfered-rect'\n | 'rounded-rect'\n | 'polygon'\n | 'puzzle'\n | 'quatrefoil'\n | 'octant-spline'\n | 'octant-bspline'\n | 'ribbon'\n | 'powerline';\n\nexport interface BadgeBaseParams {\n 'chamfered-rect': ChamferedRectParams;\n 'rounded-rect': RoundedRectParams;\n 'polygon': PolygonParams;\n 'puzzle': PuzzleParams;\n 'quatrefoil': QuatrefoilParams;\n 'octant-spline': OctantSplineParams;\n 'octant-bspline': OctantBSplineParams;\n 'ribbon': RibbonParams;\n 'powerline': PowerlineParams;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- BaseModule's P is contravariant (build/insets take it), and Badge.tsx indexes this registry by a runtime BadgeBase, so a per-key map type collapses to an unsatisfiable intersection.\nexport const BASES: Record<BadgeBase, BaseModule<any>> = {\n 'chamfered-rect': ChamferedRect,\n 'rounded-rect': RoundedRect,\n 'polygon': Polygon,\n 'puzzle': Puzzle,\n 'quatrefoil': Quatrefoil,\n 'octant-spline': OctantSpline,\n 'octant-bspline': OctantBSpline,\n 'ribbon': Ribbon,\n 'powerline': Powerline,\n};\n","/**\n * Common range filter used by offsetAt-style effects. `range` is `[start, end]` as\n * fractions of `totalCss` in `[0, 1]`, where `end > start` includes a single contiguous\n * segment and `end < start` wraps around the closing point of the perimeter. Returns\n * the multiplier 1 inside the range and 0 outside (no feather yet — kept simple).\n */\nexport function rangeMask(s: number, totalCss: number, range?: [number, number]): number {\n if (!range) return 1;\n const [a, b] = range;\n if (a === b) return 0;\n const u = (((s % totalCss) + totalCss) % totalCss) / totalCss;\n if (a < b) return u >= a && u <= b ? 1 : 0;\n // Wrapping range like [0.9, 0.1].\n return u >= a || u <= b ? 1 : 0;\n}\n\nexport interface RangeMaskParams {\n /** Optional `[start, end]` as fractions of totalCss (0..1). Restricts the effect to a\n * contiguous slice of the perimeter; `end < start` wraps around. */\n range?: [number, number];\n}\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface SpikesEffectParams extends RangeMaskParams {\n count?: number;\n length?: number;\n baseWidth?: number;\n vertScale?: number;\n horzScale?: number;\n diagonalScale?: number;\n irregularity?: number;\n /**\n * 0..1 strength of curvature-based shortening on corners. At 1 we fully cancel the tip-arc\n * expansion `(1 + κL)` so neighbouring spike tips stay roughly evenly spaced even on tight\n * corner arcs; at 0 spikes are constant length and visibly fan outward around corners.\n */\n cornerCompensation?: number;\n}\n\nconst DEFAULTS: Required<Omit<SpikesEffectParams, 'range'>> = {\n count: 44,\n length: 8,\n baseWidth: 3,\n vertScale: 1.4,\n horzScale: 1,\n diagonalScale: 0.5,\n irregularity: 0,\n cornerCompensation: 1,\n};\n\nconst Spikes: EffectModule<SpikesEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const N = Math.max(3, Math.floor(cfg.count));\n const step = totalCss / N;\n const halfBase = Math.max(0.1, Math.min(step / 2 - 0.05, cfg.baseWidth / 2));\n const phaseOffset = phase * step;\n // Find the nearest spike center on the unwrapped axis, then wrap.\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.round((sm - phaseOffset) / step);\n const sc = ((i * step + phaseOffset) % totalCss + totalCss) % totalCss;\n // Use shortest-distance metric on a closed perimeter.\n let ds = sm - sc;\n if (ds > totalCss / 2) ds -= totalCss;\n if (ds < -totalCss / 2) ds += totalCss;\n if (Math.abs(ds) > halfBase) return { dx: 0, dy: 0 };\n // Triangular: peak at ds=0, zero at the base edges.\n const t = 1 - Math.abs(ds) / halfBase;\n const pCenter = perimeterAt(sc);\n // Use the actual perimeter normal — no 45° quantization, so spike angles\n // sweep smoothly through corner arcs.\n const dirX = pCenter.nx;\n const dirY = pCenter.ny;\n // Smoothly blend axis (vert/horz) and diagonal scales by how diagonal the\n // normal points. d = |sin(2θ)| ∈ [0,1]: 0 on the cardinal axes, 1 at 45°.\n const nxAbs = Math.abs(pCenter.nx);\n const nyAbs = Math.abs(pCenter.ny);\n const d = Math.min(1, 2 * nxAbs * nyAbs);\n const axisScale = nyAbs > nxAbs ? cfg.vertScale : cfg.horzScale;\n const scale = axisScale * (1 - d) + cfg.diagonalScale * d;\n const irrMult = 1 + cfg.irregularity * 0.5 * Math.sin(i * 1.73 + 0.7);\n // Numerical curvature κ ≈ |dn/ds| in CSS units. We average over a window roughly the\n // size of a spike footprint so the corner's influence smoothly bleeds onto adjacent\n // flat-edge samples instead of switching off at the arc boundary.\n const eps = Math.max(step * 0.5, halfBase);\n const SAMPLES = 5;\n let kappa = 0;\n for (let k = 0; k < SAMPLES; k++) {\n const u = (k + 0.5) / SAMPLES; // 0..1 across the window\n const sA = sc - eps + u * 2 * eps - eps / SAMPLES;\n const sB = sc - eps + u * 2 * eps + eps / SAMPLES;\n const pA = perimeterAt(sA);\n const pB = perimeterAt(sB);\n kappa += Math.hypot(pB.nx - pA.nx, pB.ny - pA.ny) / (sB - sA);\n }\n kappa /= SAMPLES;\n const baseLen = cfg.length * scale * irrMult * t;\n const comp = Math.max(0, Math.min(cfg.cornerCompensation, 1));\n const lenCss = Math.max(0, baseLen / (1 + comp * kappa * baseLen)) * mask;\n return { dx: dirX * lenCss, dy: dirY * lenCss };\n },\n defaults: DEFAULTS,\n};\n\nexport default Spikes;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface PuffsEffectParams extends RangeMaskParams {\n bumpWidth?: number;\n puffiness?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<Omit<PuffsEffectParams, 'range'>> = {\n bumpWidth: 18,\n puffiness: 10,\n irregularity: 0,\n};\n\nconst Puffs: EffectModule<PuffsEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const N = Math.max(2, Math.round(totalCss / Math.max(6, cfg.bumpWidth)));\n const step = totalCss / N;\n const phaseOffset = phase * step;\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.floor((sm - phaseOffset) / step);\n const puffStart = i * step + phaseOffset;\n let t = (sm - puffStart) / step;\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n const localPy = Math.max(0.5, cfg.puffiness) * (1 + irr * 0.55 * Math.sin(i * 1.73 + 0.7));\n const disp = localPy * Math.sin(Math.PI * t) * mask;\n const pt = perimeterAt(s);\n return { dx: pt.nx * disp, dy: pt.ny * disp };\n },\n defaults: DEFAULTS,\n};\n\nexport default Puffs;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface BitesEffectParams extends RangeMaskParams {\n biteRadius?: number;\n biteSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<Omit<BitesEffectParams, 'range'>> = {\n biteRadius: 3,\n biteSpacing: 8,\n irregularity: 0,\n};\n\nconst Bites: EffectModule<BitesEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const br = Math.max(0.5, cfg.biteRadius);\n const bs = Math.max(2 * br + 0.5, cfg.biteSpacing);\n const N = Math.max(2, Math.floor(totalCss / bs));\n const step = totalCss / N;\n const phaseOffset = phase * step;\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.round((sm - phaseOffset) / step);\n const sc = ((i * step + phaseOffset) % totalCss + totalCss) % totalCss;\n let ds = sm - sc;\n if (ds > totalCss / 2) ds -= totalCss;\n if (ds < -totalCss / 2) ds += totalCss;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n const localR = br * (1 + irr * 0.55 * Math.sin(i * 1.73 + 0.7));\n if (Math.abs(ds) > localR) return { dx: 0, dy: 0 };\n // Triangular inward dent: deepest at ds=0 (peak −localR), zero at ds=±localR.\n const t = 1 - Math.abs(ds) / localR;\n const inward = -localR * t;\n const pt = perimeterAt(s);\n return { dx: pt.nx * inward * mask, dy: pt.ny * inward * mask };\n },\n defaults: DEFAULTS,\n};\n\nexport default Bites;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface ScallopsEffectParams extends RangeMaskParams {\n scallopRadius?: number;\n scallopSpacing?: number;\n irregularity?: number;\n}\n\nconst DEFAULTS: Required<Omit<ScallopsEffectParams, 'range'>> = {\n scallopRadius: 4,\n scallopSpacing: 10,\n irregularity: 0,\n};\n\nconst Scallops: EffectModule<ScallopsEffectParams> = {\n offsetAt: (s, { params, phase, totalCss, perimeterAt }) => {\n const cfg = { ...DEFAULTS, ...params };\n const mask = rangeMask(s, totalCss, cfg.range);\n if (mask === 0) return { dx: 0, dy: 0 };\n const sr = Math.max(0.5, cfg.scallopRadius);\n const ss = Math.max(2 * sr + 0.5, cfg.scallopSpacing);\n const N = Math.max(2, Math.floor(totalCss / ss));\n const step = totalCss / N;\n const phaseOffset = phase * step;\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const i = Math.round((sm - phaseOffset) / step);\n const sc = ((i * step + phaseOffset) % totalCss + totalCss) % totalCss;\n let ds = sm - sc;\n if (ds > totalCss / 2) ds -= totalCss;\n if (ds < -totalCss / 2) ds += totalCss;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n const localR = sr * (1 + irr * 0.55 * Math.sin(i * 1.73 + 0.7));\n if (Math.abs(ds) > localR) return { dx: 0, dy: 0 };\n // Half-circle outward: peak at ds=0 = localR; zero at ±localR.\n const t = (ds + localR) / (2 * localR);\n const disp = localR * Math.sin(Math.PI * t) * mask;\n const pt = perimeterAt(s);\n return { dx: pt.nx * disp, dy: pt.ny * disp };\n },\n defaults: DEFAULTS,\n};\n\nexport default Scallops;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport type Corner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface BevelEffectParams {\n /** Bevel band width in CSS px. */\n bevelWidth?: number;\n /** Which corner the light originates from (drives the highlight/shadow distribution across edges). */\n lightFrom?: Corner;\n}\n\nconst DEFAULTS: Required<BevelEffectParams> = { bevelWidth: 6, lightFrom: 'tl' };\n\ntype Side = 'top' | 'right' | 'bottom' | 'left';\n\nfunction sideForNormal(nx: number, ny: number): Side {\n return Math.abs(ny) > Math.abs(nx)\n ? (ny < 0 ? 'top' : 'bottom')\n : (nx < 0 ? 'left' : 'right');\n}\n\nfunction bevelClasses(lightFrom: Corner): Record<Side, string> {\n const isTop = lightFrom[0] === 't';\n const isLeft = lightFrom[1] === 'l';\n return {\n top: isTop ? 'badge-bevel-light' : 'badge-bevel-dark',\n bottom: isTop ? 'badge-bevel-dark' : 'badge-bevel-light',\n left: isLeft ? 'badge-bevel-medium-light' : 'badge-bevel-medium-dark',\n right: isLeft ? 'badge-bevel-medium-dark' : 'badge-bevel-medium-light',\n };\n}\n\nconst SAMPLES = 240;\n\nconst Bevel: EffectModule<BevelEffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n const clipId = useId();\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const cls = bevelClasses(cfg.lightFrom);\n const total = sampler.totalCss;\n\n // Sample outer + inset rings; tag each sample with the side it belongs to.\n const outer: { x: number; y: number; side: Side }[] = [];\n const inner: { x: number; y: number }[] = [];\n for (let i = 0; i < SAMPLES; i++) {\n const pt = sampler.perimeterAt((i / SAMPLES) * total);\n outer.push({ x: pt.x, y: pt.y, side: sideForNormal(pt.nx, pt.ny) });\n inner.push({\n x: pt.x - pt.nx * cfg.bevelWidth * sx,\n y: pt.y - pt.ny * cfg.bevelWidth * sy,\n });\n }\n\n // Group consecutive samples sharing a side into runs (wrap-aware).\n interface Run { side: Side; idxs: number[] }\n const runs: Run[] = [];\n let cur: Run | null = null;\n for (let i = 0; i < SAMPLES; i++) {\n const side = outer[i].side;\n if (!cur || cur.side !== side) {\n cur = { side, idxs: [i] };\n runs.push(cur);\n } else {\n cur.idxs.push(i);\n }\n }\n // Merge first and last runs if they wrap and share a side.\n if (runs.length > 1 && runs[0].side === runs[runs.length - 1].side) {\n runs[runs.length - 1].idxs = runs[runs.length - 1].idxs.concat(runs[0].idxs);\n runs.shift();\n }\n\n const pathFor = (run: Run): string => {\n const outerPts = run.idxs.map((i) => outer[i]);\n const innerPts = run.idxs.map((i) => inner[i]).reverse();\n const pts = [...outerPts, ...innerPts];\n if (pts.length === 0) return '';\n let d = `M ${pts[0].x.toFixed(3)} ${pts[0].y.toFixed(3)}`;\n for (let i = 1; i < pts.length; i++) {\n d += ` L ${pts[i].x.toFixed(3)} ${pts[i].y.toFixed(3)}`;\n }\n return d + ' Z';\n };\n\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n <g clipPath={`url(#${clipId})`}>\n {runs.map((run, i) => (\n <path key={i} className={cls[run.side]} d={pathFor(run)} />\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Bevel;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport type Corner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface SheenEffectParams {\n lightFrom?: Corner;\n /** Peak gradient opacity (0..1). */\n intensity?: number;\n}\n\nconst DEFAULTS: Required<SheenEffectParams> = { lightFrom: 'tl', intensity: 0.22 };\n\n// Gradient runs from the shadow corner (0%) to the lit corner (100%).\nconst FACE_COORDS: Record<Corner, { x1: string; y1: string; x2: string; y2: string }> = {\n tl: { x1: '100%', y1: '100%', x2: '0%', y2: '0%' },\n tr: { x1: '0%', y1: '100%', x2: '100%', y2: '0%' },\n bl: { x1: '100%', y1: '0%', x2: '0%', y2: '100%' },\n br: { x1: '0%', y1: '0%', x2: '100%', y2: '100%' },\n};\n\nconst Sheen: EffectModule<SheenEffectParams> = {\n Component: ({ sampler, variant, params }) => {\n const gradId = useId();\n const clipId = useId();\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const peak = Math.max(0, Math.min(cfg.intensity, 1));\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n <linearGradient id={gradId} {...FACE_COORDS[cfg.lightFrom]}>\n <stop offset=\"0%\" stopColor=\"black\" stopOpacity={peak} />\n <stop offset=\"45%\" stopColor=\"black\" stopOpacity=\"0.04\" />\n <stop offset=\"58%\" stopColor=\"white\" stopOpacity=\"0.04\" />\n <stop offset=\"100%\" stopColor=\"white\" stopOpacity={peak} />\n </linearGradient>\n </defs>\n <rect clipPath={`url(#${clipId})`} x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill={`url(#${gradId})`} style={{ pointerEvents: 'none' }} />\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Sheen;\n","import type { EffectModule } from '../bases/types';\n\nexport type Corner = 'tl' | 'tr' | 'bl' | 'br';\n\nexport interface RivetsEffectParams {\n /** Rivet radius in CSS px. */\n radius?: number;\n /** Inset from each corner in CSS px. */\n inset?: number;\n /** Light origin (drives which side of each rivet gets the highlight). */\n lightFrom?: Corner;\n}\n\nconst DEFAULTS: Required<RivetsEffectParams> = { radius: 2.4, inset: 7, lightFrom: 'tl' };\n\nconst Rivets: EffectModule<RivetsEffectParams> = {\n Component: ({ boxW, boxH, variant, params }) => {\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW, sy = 100 / boxH;\n const rx = cfg.radius * sx;\n const ry = cfg.radius * sy;\n const ix = cfg.inset * sx;\n const iy = cfg.inset * sy;\n const litDx = cfg.lightFrom[1] === 'l' ? -cfg.radius * 0.32 : cfg.radius * 0.32;\n const litDy = cfg.lightFrom[0] === 't' ? -cfg.radius * 0.32 : cfg.radius * 0.32;\n const positions: [number, number][] = [\n [ix, iy],\n [100 - ix, iy],\n [ix, 100 - iy],\n [100 - ix, 100 - iy],\n ];\n return (\n <>\n {positions.map(([cx, cy], i) => (\n <g key={i}>\n <ellipse className=\"badge-bevel-dark\" cx={cx} cy={cy} rx={rx} ry={ry} />\n <ellipse className=\"badge-bevel-medium-dark\" cx={cx - litDx * 0.6 * sx} cy={cy - litDy * 0.6 * sy} rx={rx * 0.75} ry={ry * 0.75} />\n <ellipse className=\"badge-bevel-light\" cx={cx + litDx * sx} cy={cy + litDy * sy} rx={rx * 0.45} ry={ry * 0.45} />\n </g>\n ))}\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Rivets;\n","import type { EffectModule } from '../bases/types';\n\nexport interface ShadowEffectParams {\n /** Offset in CSS px. */\n dx?: number;\n dy?: number;\n /** Alpha 0..1. */\n opacity?: number;\n}\n\nconst DEFAULTS: Required<ShadowEffectParams> = { dx: 1, dy: 2, opacity: 0.28 };\n\nconst Shadow: EffectModule<ShadowEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW, sy = 100 / boxH;\n const dxVb = cfg.dx * sx;\n const dyVb = cfg.dy * sy;\n return (\n <path\n d={sampler.bodyPath}\n transform={`translate(${dxVb.toFixed(3)} ${dyVb.toFixed(3)})`}\n fill={`rgba(0, 0, 0, ${Math.max(0, Math.min(cfg.opacity, 1))})`}\n stroke=\"none\"\n style={{ pointerEvents: 'none' }}\n />\n );\n },\n zone: 'background',\n defaults: DEFAULTS,\n};\n\nexport default Shadow;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport interface WoodgrainEffectParams {\n /** Number of grain curves. */\n lines?: number;\n /** Number of knot circles. */\n knots?: number;\n /** Overall grain opacity (0..1). */\n intensity?: number;\n}\n\nconst DEFAULTS: Required<WoodgrainEffectParams> = { lines: 4, knots: 2, intensity: 0.55 };\n\n// Deterministic per-line/knot wobble.\nfunction osc(seed: number) {\n return Math.sin(seed * 1.73 + 0.5);\n}\n\nconst Woodgrain: EffectModule<WoodgrainEffectParams> = {\n Component: ({ sampler, variant, params }) => {\n const clipId = useId();\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const lines: string[] = [];\n for (let i = 0; i < cfg.lines; i++) {\n const y = ((i + 1) / (cfg.lines + 1)) * 100;\n // Two control points, slight vertical wobble.\n const dy1 = osc(i * 2 + 1) * 4;\n const dy2 = osc(i * 2 + 2) * 4;\n lines.push(`M -5 ${y.toFixed(2)} Q 35 ${(y + dy1).toFixed(2)} 60 ${y.toFixed(2)} T 105 ${(y + dy2).toFixed(2)}`);\n }\n const knotPositions: [number, number][] = [];\n for (let i = 0; i < cfg.knots; i++) {\n const cx = 30 + osc(i * 3 + 0.7) * 30 + 20;\n const cy = 50 + osc(i * 3 + 1.3) * 30;\n knotPositions.push([cx, cy]);\n }\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n <g clipPath={`url(#${clipId})`} opacity={Math.max(0, Math.min(cfg.intensity, 1))} style={{ pointerEvents: 'none' }}>\n {lines.map((d, i) => (\n <path key={`l${i}`} className=\"badge-stroke\" d={d} fill=\"none\" />\n ))}\n {knotPositions.map(([cx, cy], i) => (\n <g key={`k${i}`}>\n <ellipse className=\"badge-stroke\" cx={cx} cy={cy} rx={3} ry={2.4} fill=\"none\" />\n <ellipse className=\"badge-stroke\" cx={cx} cy={cy} rx={1.2} ry={1} fill=\"none\" />\n </g>\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Woodgrain;\n","import type { EffectModule } from '../bases/types';\nimport { rangeMask, type RangeMaskParams } from './rangeMask';\n\nexport interface PerforationsEffectParams extends RangeMaskParams {\n /** Hole radius in CSS px. */\n holeRadius?: number;\n /** Spacing between hole centers along the perimeter, in CSS px. */\n holeSpacing?: number;\n}\n\nconst DEFAULTS: Required<Omit<PerforationsEffectParams, 'range'>> = {\n holeRadius: 3,\n holeSpacing: 11,\n};\n\nconst Perforations: EffectModule<PerforationsEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const total = sampler.totalCss;\n const N = Math.max(2, Math.round(total / Math.max(2 * cfg.holeRadius, cfg.holeSpacing)));\n const step = total / N;\n const holes: { cx: number; cy: number }[] = [];\n for (let i = 0; i < N; i++) {\n const sCss = (i + 0.5) * step;\n if (rangeMask(sCss, total, params?.range) === 0) continue;\n const pt = sampler.perimeterAt(sCss);\n holes.push({ cx: pt.x, cy: pt.y });\n }\n const rx = cfg.holeRadius * sx;\n const ry = cfg.holeRadius * sy;\n return (\n <>\n {holes.map((h, i) => (\n <ellipse key={i} cx={h.cx} cy={h.cy} rx={rx} ry={ry} fill=\"black\" />\n ))}\n </>\n );\n },\n zone: 'mask',\n defaults: DEFAULTS as PerforationsEffectParams,\n};\n\nexport default Perforations;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport interface Bevel2EffectParams {\n /** Bevel band width in CSS px. */\n bevelWidth?: number;\n /** Compass angle the light originates from, in degrees. 0° = top, 90° =\n * right, 180° = bottom, 270° = left (CSS `linear-gradient` convention). */\n lightFrom?: number;\n}\n\nconst DEFAULTS: Required<Bevel2EffectParams> = { bevelWidth: 6, lightFrom: 315 };\n\nconst SAMPLES = 240;\n\n// Six shade buckets from brightest to darkest. Each maps to a CSS class.\nconst SHADE_CLASSES = [\n 'badge-bevel-light', // brightest (normal points straight at light)\n 'badge-bevel-medium-light',\n 'badge-bevel-medium-light',\n 'badge-bevel-medium-dark',\n 'badge-bevel-medium-dark',\n 'badge-bevel-dark', // darkest (normal points away from light)\n];\n\nfunction lightDirFor(angleDeg: number): { lx: number; ly: number } {\n // Compass convention (0° = up, clockwise). Returns the unit vector pointing\n // outward from the badge toward the light source.\n const rad = (angleDeg * Math.PI) / 180;\n return { lx: Math.sin(rad), ly: -Math.cos(rad) };\n}\n\nconst Bevel2: EffectModule<Bevel2EffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n const clipId = useId();\n if (variant !== 'solid' && variant !== 'subtle') return null;\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const total = sampler.totalCss;\n const { lx, ly } = lightDirFor(cfg.lightFrom);\n\n const outer: { x: number; y: number; bucket: number }[] = [];\n const inner: { x: number; y: number }[] = [];\n for (let i = 0; i < SAMPLES; i++) {\n const pt = sampler.perimeterAt((i / SAMPLES) * total);\n // dot(n, lightDir) where light points FROM the corner OUTWARD: surfaces whose\n // outward normal aligns with -light (facing the light source) are brightest.\n const d = -(pt.nx * lx + pt.ny * ly);\n // d ∈ [-1, 1]. Map to [0, SHADE_CLASSES.length).\n const t = Math.max(0, Math.min((d + 1) / 2, 0.9999));\n const bucket = Math.floor(t * SHADE_CLASSES.length);\n outer.push({ x: pt.x, y: pt.y, bucket });\n inner.push({\n x: pt.x - pt.nx * cfg.bevelWidth * sx,\n y: pt.y - pt.ny * cfg.bevelWidth * sy,\n });\n }\n\n interface Run { bucket: number; idxs: number[] }\n const runs: Run[] = [];\n let cur: Run | null = null;\n for (let i = 0; i < SAMPLES; i++) {\n const bucket = outer[i].bucket;\n if (!cur || cur.bucket !== bucket) {\n cur = { bucket, idxs: [i] };\n runs.push(cur);\n } else {\n cur.idxs.push(i);\n }\n }\n if (runs.length > 1 && runs[0].bucket === runs[runs.length - 1].bucket) {\n runs[runs.length - 1].idxs = runs[runs.length - 1].idxs.concat(runs[0].idxs);\n runs.shift();\n }\n\n const pathFor = (run: Run): string => {\n // Each band overlaps its neighbours by one sample on each side so the seams between\n // shade buckets render without gaps.\n const first = run.idxs[0];\n const last = run.idxs[run.idxs.length - 1];\n const prev = (first - 1 + SAMPLES) % SAMPLES;\n const next = (last + 1) % SAMPLES;\n const expandedIdxs = [prev, ...run.idxs, next];\n const outerPts = expandedIdxs.map((i) => outer[i]);\n const innerPts = expandedIdxs.map((i) => inner[i]).reverse();\n const pts = [...outerPts, ...innerPts];\n let d = `M ${pts[0].x.toFixed(3)} ${pts[0].y.toFixed(3)}`;\n for (let i = 1; i < pts.length; i++) {\n d += ` L ${pts[i].x.toFixed(3)} ${pts[i].y.toFixed(3)}`;\n }\n return d + ' Z';\n };\n\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n <g clipPath={`url(#${clipId})`}>\n {runs.map((run, i) => (\n <path key={i} className={SHADE_CLASSES[run.bucket]} d={pathFor(run)} />\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Bevel2;\n","import type { EffectModule } from '../bases/types';\n\nexport interface OutlineEffectParams {\n /** Stroke width in CSS px. */\n width?: number;\n /** Stroke color. */\n color?: string;\n /** Optional SVG dasharray (e.g. \"4 2\"). */\n dash?: string;\n /** CSS mix-blend-mode: 'normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten',\n * 'difference', etc. Useful when the outline color should react to whatever's behind it. */\n blendMode?: string;\n /** 0..1 stroke opacity. */\n opacity?: number;\n}\n\nconst DEFAULTS: Required<OutlineEffectParams> = {\n width: 1,\n color: 'var(--badge-edge)',\n dash: '',\n blendMode: 'normal',\n opacity: 1,\n};\n\nconst Outline: EffectModule<OutlineEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const widthVb = cfg.width * Math.max(sx, sy);\n return (\n <path\n d={sampler.bodyPath}\n fill=\"none\"\n stroke={cfg.color}\n strokeWidth={widthVb}\n strokeDasharray={cfg.dash || undefined}\n strokeOpacity={cfg.opacity}\n vectorEffect=\"non-scaling-stroke\"\n style={{ mixBlendMode: cfg.blendMode as never }}\n />\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Outline;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\nexport interface SunbeamsEffectParams {\n /** Number of beams (parallelograms) cast across the body. */\n count?: number;\n /** Beam width in CSS px (measured horizontally before the skew). */\n width?: number;\n /** Gap between adjacent beams in CSS px. */\n gap?: number;\n /** Skew angle in degrees. 0 = vertical bars; positive = leaning right. */\n angle?: number;\n /** 0..1 lightness opacity. */\n opacity?: number;\n /** Beam color. Defaults to white. */\n color?: string;\n /** Drift the beam pattern left/right by N CSS px (lets you slide the \"window\" over the body). */\n offset?: number;\n /** 0..1 perturbs each beam's width, opacity, and angle slightly with a deterministic\n * per-beam noise; 0 = perfectly regular. */\n irregularity?: number;\n /** Gradient mask angle in degrees. 0 = left→right, 90 = top→bottom. */\n gradientAngle?: number;\n /** Position along the gradient axis (0..1) where the mask is fully opaque (beams visible). */\n gradientStart?: number;\n /** Position along the gradient axis (0..1) where the mask is fully transparent (beams faded out). */\n gradientEnd?: number;\n}\n\nconst DEFAULTS: Required<SunbeamsEffectParams> = {\n count: 3,\n width: 18,\n gap: 8,\n angle: 28,\n opacity: 0.18,\n color: '#ffffff',\n offset: 0,\n irregularity: 0,\n gradientAngle: 90,\n gradientStart: 0,\n gradientEnd: 1,\n};\n\nconst Sunbeams: EffectModule<SunbeamsEffectParams> = {\n Component: ({ sampler, boxW, boxH, params }) => {\n const cfg = { ...DEFAULTS, ...params };\n const clipId = useId();\n const maskId = useId();\n const gradId = useId();\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const irr = Math.max(0, Math.min(cfg.irregularity, 1));\n\n // Per-beam pseudo-random multipliers (deterministic by index).\n const widthMult = (i: number) => 1 + irr * 0.45 * Math.sin(i * 1.73 + 0.7);\n const opacityMult = (i: number) => 1 + irr * 0.5 * Math.sin(i * 2.31 + 1.3);\n const angleJitter = (i: number) => irr * 8 * Math.sin(i * 3.07 + 0.4); // degrees\n\n // Total horizontal span (centered on x=50). We compute using nominal widths so the\n // pattern's centering is stable as irregularity moves individual beam widths.\n const nominalWidthVb = cfg.width * sx;\n const gapVb = cfg.gap * sx;\n const offsetVb = cfg.offset * sx;\n const totalWidth = cfg.count * nominalWidthVb + (cfg.count - 1) * gapVb;\n let cursorX = 50 - totalWidth / 2 + offsetVb;\n const yTop = -50;\n const yBot = 150;\n\n const beams: { points: string; opacity: number }[] = [];\n for (let i = 0; i < cfg.count; i++) {\n const beamWidthVb = nominalWidthVb * widthMult(i);\n const x1 = cursorX;\n const x2 = cursorX + beamWidthVb;\n const tan = Math.tan(((cfg.angle + angleJitter(i)) * Math.PI) / 180);\n const horizPerVb = tan * (sx / sy);\n const halfShear = horizPerVb * (yBot - yTop) / 2;\n const pts = [\n [x1 + halfShear, yTop],\n [x2 + halfShear, yTop],\n [x2 - halfShear, yBot],\n [x1 - halfShear, yBot],\n ];\n beams.push({\n points: pts.map(([px, py]) => `${px.toFixed(3)},${py.toFixed(3)}`).join(' '),\n opacity: Math.max(0, Math.min(cfg.opacity * opacityMult(i), 1)),\n });\n cursorX += nominalWidthVb + gapVb;\n }\n\n // Gradient mask geometry: define a linear gradient from one edge of the viewBox to the\n // other along `gradientAngle`. Position the start/end stops along that 0..1 axis.\n const ga = (cfg.gradientAngle * Math.PI) / 180;\n const cosA = Math.cos(ga), sinA = Math.sin(ga);\n // Vector from centre to edge along the axis. Pick a long-enough span so 0..1 covers\n // the badge fully.\n const span = 100; // viewBox units along the axis from (50-50cos, 50-50sin) to (50+50cos, 50+50sin)\n const x1g = 50 - cosA * span / 2;\n const y1g = 50 - sinA * span / 2;\n const x2g = 50 + cosA * span / 2;\n const y2g = 50 + sinA * span / 2;\n\n const gs = Math.max(0, Math.min(cfg.gradientStart, 1));\n const ge = Math.max(0, Math.min(cfg.gradientEnd, 1));\n // Build stops so the gradient is white (opaque) at `gs` and black (transparent) at `ge`,\n // working whether gs < ge or vice versa.\n const stops = gs <= ge\n ? [\n { offset: 0, color: '#fff' },\n { offset: gs, color: '#fff' },\n { offset: ge, color: '#000' },\n { offset: 1, color: '#000' },\n ]\n : [\n { offset: 0, color: '#000' },\n { offset: ge, color: '#000' },\n { offset: gs, color: '#fff' },\n { offset: 1, color: '#fff' },\n ];\n\n return (\n <>\n <defs>\n <clipPath id={clipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n <linearGradient id={gradId} x1={x1g} y1={y1g} x2={x2g} y2={y2g} gradientUnits=\"userSpaceOnUse\">\n {stops.map((s, i) => <stop key={i} offset={s.offset} stopColor={s.color} />)}\n </linearGradient>\n <mask id={maskId} maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"100\" height=\"100\">\n <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" fill={`url(#${gradId})`} />\n </mask>\n </defs>\n <g clipPath={`url(#${clipId})`} mask={`url(#${maskId})`}>\n {beams.map((b, i) => (\n <polygon key={i} points={b.points} fill={cfg.color} opacity={b.opacity} />\n ))}\n </g>\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Sunbeams;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\n/**\n * Aqua-glass treatment — composes onto any badge silhouette by walking the\n * sampler's perimeter and painting four layered sub-effects in one pass:\n *\n * 1. Body gradient — vertical tint that runs translucent-top through a\n * bright equator band into a dark base.\n * 2. Specular gloss — upper-hemisphere white-fade clipped to the body.\n * 3. Bezel highlight — bright stroke along perimeter segments whose\n * outward normal points up (`ny < 0`). On a pill that's\n * the upper half; on a hex it's the three top edges;\n * on a starburst it's the upward tips. Normal-aware,\n * not bbox-aligned, which is what makes it work on\n * arbitrary silhouettes.\n * 4. Rim outline — faint dark stroke along the full perimeter.\n *\n * For the *truly* translucent look (with backdrop-filter blur reading the\n * surface behind the badge), use this with `variant=\"outline\"` so the badge's\n * own flat fill doesn't paint behind the gradient, and set\n * `backdrop-filter: blur(...)` on the host element via CSS.\n */\nexport interface AquaEffectParams {\n /** Body tint. Defaults to `var(--badge-edge)` so the badge's color drives it. */\n accent?: string;\n /** Stop opacities along the body gradient (0..1). */\n topAlpha?: number;\n upperAlpha?: number;\n /** Equator Y position in viewBox units (0..100). */\n equator?: number;\n /** Half-width of the transition band around the equator (viewBox units). */\n equatorSpread?: number;\n /** Mix ratios for the bright equator and dark base stops (0..100, % accent). */\n equatorTint?: number;\n baseTint?: number;\n /** Specular gloss params. */\n glossTopAlpha?: number;\n glossMidAlpha?: number;\n /** Y extent the gloss covers, in viewBox units. 50 = upper hemisphere. */\n glossExtent?: number;\n /** Normal-aware bezel highlight. */\n bezelAlpha?: number;\n bezelWidth?: number; // CSS px\n /** Full-perimeter rim. */\n rimAlpha?: number;\n rimWidth?: number; // CSS px\n}\n\nconst DEFAULTS: Required<AquaEffectParams> = {\n accent: 'var(--badge-edge)',\n topAlpha: 0.45,\n upperAlpha: 0.7,\n equator: 52,\n equatorSpread: 12,\n equatorTint: 95,\n baseTint: 70,\n glossTopAlpha: 0.7,\n glossMidAlpha: 0.18,\n glossExtent: 50,\n bezelAlpha: 0.7,\n bezelWidth: 1,\n rimAlpha: 0.22,\n rimWidth: 1,\n};\n\nconst BEZEL_SAMPLES = 240;\n\nconst Aqua: EffectModule<AquaEffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n const bodyGradId = useId();\n const glossGradId = useId();\n const glossClipId = useId();\n if (variant !== 'solid' && variant !== 'subtle' && variant !== 'outline') return null;\n const cfg = { ...DEFAULTS, ...params };\n\n // Walk the perimeter and collect contiguous runs where the outward normal\n // points up (ny < 0) — those segments will get the bezel highlight.\n const total = sampler.totalCss;\n type Pt = { x: number; y: number };\n const runs: Pt[][] = [];\n let cur: Pt[] | null = null;\n for (let i = 0; i < BEZEL_SAMPLES; i++) {\n const s = (i / BEZEL_SAMPLES) * total;\n const pt = sampler.perimeterAt(s);\n if (pt.ny < 0) {\n if (!cur) {\n cur = [];\n runs.push(cur);\n }\n cur.push({ x: pt.x, y: pt.y });\n } else {\n cur = null;\n }\n }\n // Wraparound: if first sample and last sample are both \"up\", merge the\n // tail into the head so the bezel renders as one stroke across s=0.\n if (runs.length > 1) {\n const firstSample = sampler.perimeterAt(0);\n const lastSample = sampler.perimeterAt(((BEZEL_SAMPLES - 1) / BEZEL_SAMPLES) * total);\n if (firstSample.ny < 0 && lastSample.ny < 0) {\n const head = runs.shift()!;\n runs[runs.length - 1].push(...head);\n }\n }\n const bezelPaths: string[] = [];\n for (const run of runs) {\n if (run.length < 2) continue;\n let d = `M ${run[0].x.toFixed(3)} ${run[0].y.toFixed(3)}`;\n for (let i = 1; i < run.length; i++) {\n d += ` L ${run[i].x.toFixed(3)} ${run[i].y.toFixed(3)}`;\n }\n bezelPaths.push(d);\n }\n\n // Stroke widths in CSS px → viewBox units. The badge SVG is 100×100 with\n // preserveAspectRatio=\"none\", so use the larger inverse-scale to keep\n // the stroke from getting too thin in either axis.\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const widthScale = Math.max(sx, sy);\n const bezelWidthVb = cfg.bezelWidth * widthScale;\n const rimWidthVb = cfg.rimWidth * widthScale;\n\n const equatorLo = Math.max(0, cfg.equator - cfg.equatorSpread);\n const equatorHi = Math.min(100, cfg.equator + cfg.equatorSpread * 1.6);\n const equatorBrightColor = `color-mix(in srgb, ${cfg.accent} ${cfg.equatorTint}%, white)`;\n const baseColor = `color-mix(in srgb, ${cfg.accent} ${cfg.baseTint}%, black)`;\n\n return (\n <>\n <defs>\n <linearGradient id={bodyGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" style={{ stopColor: cfg.accent, stopOpacity: cfg.topAlpha }} />\n <stop offset={`${equatorLo}%`} style={{ stopColor: cfg.accent, stopOpacity: cfg.upperAlpha }} />\n <stop offset={`${cfg.equator}%`} style={{ stopColor: equatorBrightColor, stopOpacity: 1 }} />\n <stop offset={`${equatorHi}%`} style={{ stopColor: cfg.accent, stopOpacity: 1 }} />\n <stop offset=\"100%\" style={{ stopColor: baseColor, stopOpacity: 1 }} />\n </linearGradient>\n <linearGradient id={glossGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2={`${cfg.glossExtent}%`}>\n <stop offset=\"0%\" style={{ stopColor: 'white', stopOpacity: cfg.glossTopAlpha }} />\n <stop offset=\"60%\" style={{ stopColor: 'white', stopOpacity: cfg.glossMidAlpha }} />\n <stop offset=\"100%\" style={{ stopColor: 'white', stopOpacity: 0 }} />\n </linearGradient>\n <clipPath id={glossClipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n\n {/* 1. Body — vertical gradient over the silhouette */}\n <path d={sampler.bodyPath} fill={`url(#${bodyGradId})`} style={{ pointerEvents: 'none' }} />\n\n {/* 2. Gloss — upper region, clipped to silhouette */}\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100\"\n height={cfg.glossExtent}\n fill={`url(#${glossGradId})`}\n clipPath={`url(#${glossClipId})`}\n style={{ pointerEvents: 'none' }}\n />\n\n {/* 3. Bezel — stroke segments where normal points up */}\n {bezelPaths.map((d, i) => (\n <path\n key={`bz-${i}`}\n d={d}\n fill=\"none\"\n stroke=\"white\"\n strokeOpacity={cfg.bezelAlpha}\n strokeWidth={bezelWidthVb}\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n ))}\n\n {/* 4. Rim — full perimeter at low opacity */}\n <path\n d={sampler.bodyPath}\n fill=\"none\"\n stroke=\"black\"\n strokeOpacity={cfg.rimAlpha}\n strokeWidth={rimWidthVb}\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Aqua;\n","import { useId } from 'react';\nimport type { EffectModule } from '../bases/types';\n\n/**\n * Metal — opaque cousin of the Aqua treatment. Same four sub-passes (body\n * gradient, specular gloss, normal-aware bezel, perimeter rim), but tuned\n * for an opaque metallic surface with a single tunable `specularity`\n * parameter that drives how sharp / contrasty the highlights read.\n *\n * Low specularity → matte aluminum / brushed pewter feel: muted contrast,\n * soft gloss, faint bezel.\n * High specularity → chrome / polished steel: sharp specular peak at the\n * equator, bright bezel and rim, hard transitions in the body gradient.\n *\n * The same `specularity` knob multiplies the equator brightness, gloss\n * alpha, bezel alpha, and rim alpha — so one slider moves the whole\n * surface along a coherent matte-to-mirror axis.\n */\nexport interface MetalEffectParams {\n /** Base metal color. Defaults to a neutral steel; pass e.g. `'#c8a657'` for brass. */\n accent?: string;\n /** 0 = matte, 1 = mirror. Multiplies the brightness of the equator, gloss,\n * bezel, and rim simultaneously. */\n specularity?: number;\n /** Equator Y position (viewBox units, 0..100). */\n equator?: number;\n /** Half-width of the bright equator band. Smaller = sharper specular. */\n equatorSpread?: number;\n /** How dark the upper and lower extremes are (% accent vs black, 0..100). */\n topDarkness?: number;\n baseDarkness?: number;\n /** Gloss params. */\n glossExtent?: number;\n /** Per-zone alpha *baselines* — scaled by `specularity`. */\n glossAlphaTop?: number;\n bezelAlpha?: number;\n bezelWidth?: number; // CSS px\n rimAlpha?: number;\n rimWidth?: number; // CSS px\n}\n\nconst DEFAULTS: Required<MetalEffectParams> = {\n accent: '#aab3bd', // neutral steel\n specularity: 0.6,\n equator: 50,\n equatorSpread: 8,\n topDarkness: 55,\n baseDarkness: 35,\n glossExtent: 50,\n glossAlphaTop: 0.55,\n bezelAlpha: 0.85,\n bezelWidth: 1,\n rimAlpha: 0.35,\n rimWidth: 1,\n};\n\nconst BEZEL_SAMPLES = 240;\n\nconst Metal: EffectModule<MetalEffectParams> = {\n Component: ({ sampler, boxW, boxH, variant, params }) => {\n const bodyGradId = useId();\n const glossGradId = useId();\n const glossClipId = useId();\n if (variant !== 'solid' && variant !== 'subtle' && variant !== 'outline') return null;\n const cfg = { ...DEFAULTS, ...params };\n const spec = Math.max(0, Math.min(cfg.specularity, 1));\n\n // --- Bezel sample walk (same as Aqua: runs where ny < 0). ---\n const total = sampler.totalCss;\n type Pt = { x: number; y: number };\n const runs: Pt[][] = [];\n let cur: Pt[] | null = null;\n for (let i = 0; i < BEZEL_SAMPLES; i++) {\n const s = (i / BEZEL_SAMPLES) * total;\n const pt = sampler.perimeterAt(s);\n if (pt.ny < 0) {\n if (!cur) {\n cur = [];\n runs.push(cur);\n }\n cur.push({ x: pt.x, y: pt.y });\n } else {\n cur = null;\n }\n }\n if (runs.length > 1) {\n const firstSample = sampler.perimeterAt(0);\n const lastSample = sampler.perimeterAt(((BEZEL_SAMPLES - 1) / BEZEL_SAMPLES) * total);\n if (firstSample.ny < 0 && lastSample.ny < 0) {\n const head = runs.shift()!;\n runs[runs.length - 1].push(...head);\n }\n }\n const bezelPaths: string[] = [];\n for (const run of runs) {\n if (run.length < 2) continue;\n let d = `M ${run[0].x.toFixed(3)} ${run[0].y.toFixed(3)}`;\n for (let i = 1; i < run.length; i++) {\n d += ` L ${run[i].x.toFixed(3)} ${run[i].y.toFixed(3)}`;\n }\n bezelPaths.push(d);\n }\n\n const sx = 100 / boxW;\n const sy = 100 / boxH;\n const widthScale = Math.max(sx, sy);\n const bezelWidthVb = cfg.bezelWidth * widthScale;\n const rimWidthVb = cfg.rimWidth * widthScale;\n\n // Gradient construction. Specularity sharpens by:\n // 1. Driving the equator peak from neutral accent toward pure white.\n // 2. Boosting gloss/bezel/rim alpha (applied below).\n // 3. Increasing the contrast between dark stops and the equator stop.\n const equatorLo = Math.max(0, cfg.equator - cfg.equatorSpread);\n const equatorHi = Math.min(100, cfg.equator + cfg.equatorSpread);\n // At spec=0 the equator is just the accent; at spec=1 it's almost white.\n const equatorWhiteMix = 100 - Math.round(spec * 85);\n const equatorColor = `color-mix(in srgb, ${cfg.accent} ${equatorWhiteMix}%, white)`;\n const topDarkColor = `color-mix(in srgb, ${cfg.accent} ${cfg.topDarkness}%, black)`;\n const baseDarkColor = `color-mix(in srgb, ${cfg.accent} ${cfg.baseDarkness}%, black)`;\n // Bright stops on either side of the peak collapse toward the peak as\n // specularity rises, sharpening the highlight.\n const upperBrightMix = 100 - Math.round(spec * 50);\n const lowerBrightMix = 100 - Math.round(spec * 30);\n const upperBrightColor = `color-mix(in srgb, ${cfg.accent} ${upperBrightMix}%, white)`;\n const lowerBrightColor = `color-mix(in srgb, ${cfg.accent} ${lowerBrightMix}%, white)`;\n\n const glossAlpha = cfg.glossAlphaTop * spec;\n const bezelAlpha = cfg.bezelAlpha * (0.4 + 0.6 * spec);\n const rimAlpha = cfg.rimAlpha * (0.6 + 0.4 * spec);\n\n return (\n <>\n <defs>\n <linearGradient id={bodyGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop offset=\"0%\" style={{ stopColor: topDarkColor }} />\n <stop offset={`${equatorLo}%`} style={{ stopColor: upperBrightColor }} />\n <stop offset={`${cfg.equator}%`} style={{ stopColor: equatorColor }} />\n <stop offset={`${equatorHi}%`} style={{ stopColor: lowerBrightColor }} />\n <stop offset=\"100%\" style={{ stopColor: baseDarkColor }} />\n </linearGradient>\n <linearGradient id={glossGradId} x1=\"0%\" y1=\"0%\" x2=\"0%\" y2={`${cfg.glossExtent}%`}>\n <stop offset=\"0%\" style={{ stopColor: 'white', stopOpacity: glossAlpha }} />\n <stop offset=\"100%\" style={{ stopColor: 'white', stopOpacity: 0 }} />\n </linearGradient>\n <clipPath id={glossClipId}>\n <path d={sampler.bodyPath} />\n </clipPath>\n </defs>\n\n <path d={sampler.bodyPath} fill={`url(#${bodyGradId})`} style={{ pointerEvents: 'none' }} />\n\n {glossAlpha > 0 && (\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100\"\n height={cfg.glossExtent}\n fill={`url(#${glossGradId})`}\n clipPath={`url(#${glossClipId})`}\n style={{ pointerEvents: 'none' }}\n />\n )}\n\n {bezelPaths.map((d, i) => (\n <path\n key={`bz-${i}`}\n d={d}\n fill=\"none\"\n stroke=\"white\"\n strokeOpacity={bezelAlpha}\n strokeWidth={bezelWidthVb}\n strokeLinecap=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n ))}\n\n <path\n d={sampler.bodyPath}\n fill=\"none\"\n stroke=\"black\"\n strokeOpacity={rimAlpha}\n strokeWidth={rimWidthVb}\n vectorEffect=\"non-scaling-stroke\"\n style={{ pointerEvents: 'none' }}\n />\n </>\n );\n },\n zone: 'foreground',\n defaults: DEFAULTS,\n};\n\nexport default Metal;\n","import type { EffectModule } from '../bases/types';\nimport Spikes, { type SpikesEffectParams } from './Spikes';\nimport Puffs, { type PuffsEffectParams } from './Puffs';\nimport Bites, { type BitesEffectParams } from './Bites';\nimport Scallops, { type ScallopsEffectParams } from './Scallops';\nimport Bevel, { type BevelEffectParams } from './Bevel';\nimport Sheen, { type SheenEffectParams } from './Sheen';\nimport Rivets, { type RivetsEffectParams } from './Rivets';\nimport Shadow, { type ShadowEffectParams } from './Shadow';\nimport Woodgrain, { type WoodgrainEffectParams } from './Woodgrain';\nimport Perforations, { type PerforationsEffectParams } from './Perforations';\nimport Bevel2, { type Bevel2EffectParams } from './Bevel2';\nimport Outline, { type OutlineEffectParams } from './Outline';\nimport Sunbeams, { type SunbeamsEffectParams } from './Sunbeams';\nimport Aqua, { type AquaEffectParams } from './Aqua';\nimport Metal, { type MetalEffectParams } from './Metal';\n\nexport type BadgeEffect =\n | 'spikes' | 'puffs' | 'bites' | 'scallops'\n | 'bevel' | 'bevel2' | 'sheen' | 'sunbeams' | 'rivets' | 'shadow' | 'woodgrain' | 'perforations' | 'outline'\n | 'aqua' | 'metal';\n\nexport interface BadgeEffectParams {\n spikes: SpikesEffectParams;\n puffs: PuffsEffectParams;\n bites: BitesEffectParams;\n scallops: ScallopsEffectParams;\n bevel: BevelEffectParams;\n bevel2: Bevel2EffectParams;\n sheen: SheenEffectParams;\n rivets: RivetsEffectParams;\n shadow: ShadowEffectParams;\n woodgrain: WoodgrainEffectParams;\n perforations: PerforationsEffectParams;\n outline: OutlineEffectParams;\n sunbeams: SunbeamsEffectParams;\n aqua: AquaEffectParams;\n metal: MetalEffectParams;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- EffectModule's P is contravariant (offsetAt/Component take it), and Badge.tsx indexes this registry by a runtime effect name, so a per-key map type collapses to an unsatisfiable intersection.\nexport const EFFECTS: Record<BadgeEffect, EffectModule<any>> = {\n spikes: Spikes,\n puffs: Puffs,\n bites: Bites,\n scallops: Scallops,\n bevel: Bevel,\n bevel2: Bevel2,\n sheen: Sheen,\n rivets: Rivets,\n shadow: Shadow,\n woodgrain: Woodgrain,\n perforations: Perforations,\n outline: Outline,\n sunbeams: Sunbeams,\n aqua: Aqua,\n metal: Metal,\n};\n\nexport interface EffectSpec<E extends BadgeEffect = BadgeEffect> {\n type: E;\n params?: BadgeEffectParams[E];\n}\n","import {\n forwardRef, useEffect, useId, useRef, useState,\n type CSSProperties, type FocusEvent, type HTMLAttributes, type ReactNode, type Ref,\n} from 'react';\nimport { useVisibleRaf } from '@weasel-js/core';\nimport s from './Badge.module.css';\nimport { SHAPES, type BadgeShapeParams } from './shapes';\nimport { BASES, type BadgeBase, type BadgeBaseParams } from './bases';\nimport { EFFECTS, type EffectSpec, type BadgeEffect } from './effects';\nimport type { BadgeShape, BadgeStatus, BadgeVariant, BadgeSize } from './types';\nimport { useSvgBox } from './useSvgBox';\nimport { Focusable, Tooltip, TooltipTrigger } from '../Tooltip';\nimport { type StanceProps, useStance } from '../stance';\n\ninterface BadgeBaseProps extends StanceProps {\n /** The status the badge reports. A peer `tone`, or a stance's accent, paints over it. */\n status?: BadgeStatus;\n variant?: BadgeVariant;\n size?: BadgeSize;\n /** \"Edge bloat\": offset every base perimeter sample outward by N CSS px along the normal\n * before any compose effects run. Negative values shrink the silhouette. Photoshop-style\n * expand-selection on the body. */\n bloat?: number;\n padding?: number | string;\n /**\n * For CSS-rendered shapes (pill, plain) that fragment across line wraps, controls how the\n * background/border behaves at each break.\n * - `'slice'` (default): decoration is severed at the break (looks like one continuous badge cut by the line).\n * - `'clone'`: each fragment paints its own complete decoration (looks like two separate badges).\n */\n breakStyle?: 'slice' | 'clone';\n /** When set, perimeter-pattern shapes (beavis, cloud, postage, scalloped) continuously shift their pattern. */\n crawl?: boolean | number;\n /** Compose-mode: base shape underneath the badge content. When set, overrides the `shape` prop. */\n base?: BadgeBase;\n baseParams?: BadgeBaseParams[BadgeBase];\n /** Compose-mode: layered effects applied around / over the base. */\n effects?: EffectSpec[];\n onClick?: () => void;\n onRemove?: () => void;\n removeLabel?: string;\n href?: string;\n as?: 'span' | 'button' | 'a';\n children: ReactNode;\n className?: string;\n /** Optional style overrides merged with the badge's own style. Useful for setting CSS\n * custom properties (e.g. `--badge-edge` to inject a `custom` status color). */\n style?: CSSProperties;\n 'aria-label'?: string;\n /**\n * Tooltip content. Wraps the badge in a kit tooltip trigger. A tooltip\n * trigger must be focusable and carry a role that announces its\n * description, so a badge that is neither a button nor a link joins the tab\n * order as `role=\"img\"`, named by `aria-label` or else by string content.\n */\n tooltip?: ReactNode;\n}\n\n/** DOM attributes a badge passes through to its root element, e.g. the ones\n * `Focusable` supplies when a badge sits under a `TooltipTrigger`. */\ntype BadgeDomProps = Omit<\n HTMLAttributes<HTMLElement>,\n keyof BadgeBaseProps | 'onClick' | 'children' | 'className' | 'style'\n>;\n\ntype BadgePropsByShape = {\n [S in BadgeShape]: BadgeBaseProps & BadgeDomProps & { shape?: S; shapeParams?: BadgeShapeParams[S] };\n}[BadgeShape];\n\n/**\n * Props for {@link Badge}. Discriminated on `shape` so `shapeParams` is typed\n * to the chosen shape's own parameters.\n */\nexport type BadgeProps = BadgePropsByShape;\n\nfunction chooseElement(props: BadgeProps): 'span' | 'button' | 'a' {\n if (props.as) return props.as;\n if (props.href) return 'a';\n if (props.onClick) return 'button';\n return 'span';\n}\n\n/**\n * A small labelled chip. Renders as a `<span>`, or as a `<button>`/`<a>` when\n * given `onClick`/`href` — override with `as`.\n *\n * Beyond the built-in {@link BadgeShape} silhouettes, a badge can be composed:\n * `base` picks the underlying outline and `effects` layer perimeter treatments\n * over it, which stack additively. `bloat` pushes the whole silhouette outward\n * along its normals before effects run, and `crawl` animates perimeter\n * patterns.\n *\n * `ref` and any other DOM attributes forward to the root element.\n */\nexport const Badge = forwardRef(function Badge(props: BadgeProps, ref: Ref<HTMLElement>) {\n const {\n shape = 'pill',\n status = 'neutral',\n stance,\n tone,\n variant = 'outline',\n size = 'sm',\n onClick,\n onRemove,\n removeLabel,\n href,\n children,\n className,\n shapeParams,\n bloat,\n padding,\n style: styleOverride,\n breakStyle,\n crawl,\n base,\n baseParams,\n effects,\n tooltip,\n as: _as,\n 'aria-label': ariaLabelProp,\n onFocus,\n onBlur,\n ...domProps\n } = props;\n const element = chooseElement(props);\n const tooltipOnPlainBadge = tooltip != null && element === 'span';\n const ariaLabel = ariaLabelProp\n ?? (tooltipOnPlainBadge && (typeof children === 'string' || typeof children === 'number') ? String(children) : undefined);\n const [focused, setFocused] = useState(false);\n const [phase, setPhase] = useState(0);\n const shapeModule = SHAPES[shape] ?? SHAPES.pill;\n const resolvedShape = SHAPES[shape] ? shape : 'pill';\n const ShapeBody = shapeModule.Component;\n const params = { ...(shapeModule.defaults ?? {}), ...(shapeParams ?? {}) };\n\n const lastCrawlRef = useRef<number | null>(null);\n const crawlLoop = useVisibleRaf(\n (now) => {\n const speed = typeof crawl === 'number' ? crawl : 0.2;\n const last = lastCrawlRef.current;\n lastCrawlRef.current = now;\n if (last !== null) setPhase((p) => (p + (speed * (now - last)) / 1000) % 1);\n crawlLoop.request();\n },\n // A crawl does not advance while nobody is watching it, so the frame that\n // resumes it must not apply the whole interval at once.\n { onResume: () => { lastCrawlRef.current = null; } },\n );\n\n useEffect(() => {\n if (!crawl) {\n setPhase(0);\n return;\n }\n lastCrawlRef.current = null;\n crawlLoop.request();\n return () => crawlLoop.cancel();\n }, [crawl, crawlLoop]);\n const cls = [s.badge, className].filter(Boolean).join(' ');\n const stanced = useStance({ stance, tone });\n\n // Compose-mode: explicit `base` prop wins; otherwise the shape may declare its own\n // `compose()` spec to migrate legacy shapes through the new pipeline.\n const shapeComposeSpec = !base && shapeModule.compose ? shapeModule.compose(params) : null;\n const resolvedBaseKey = base ?? (shapeComposeSpec?.base as BadgeBase | undefined);\n const composeBase = resolvedBaseKey ? BASES[resolvedBaseKey] : null;\n const resolvedBaseParams = base\n ? baseParams\n : (shapeComposeSpec?.baseParams as BadgeBaseParams[BadgeBase] | undefined);\n const resolvedEffects: EffectSpec[] | undefined = base\n ? effects\n : (shapeComposeSpec?.effects as EffectSpec[] | undefined) ?? effects;\n const composeBaseParams = composeBase ? { ...(composeBase.defaults ?? {}), ...(resolvedBaseParams ?? {}) } : null;\n const decoRef = useRef<SVGSVGElement>(null);\n const box = useSvgBox(decoRef, composeBase);\n\n const sampler = composeBase ? composeBase.build(composeBaseParams, box.w, box.h) : null;\n\n const insetsSource = composeBase\n ? (typeof composeBase.insets === 'function' ? composeBase.insets(composeBaseParams) : composeBase.insets) ?? { top: 0, right: 0, bottom: 0, left: 0 }\n : (typeof shapeModule.insets === 'function' ? shapeModule.insets(params) : shapeModule.insets);\n const insets = insetsSource;\n const style: CSSProperties = {\n ...stanced.style,\n ['--badge-inset-top' as never]: `${insets.top}px`,\n ['--badge-inset-right' as never]: `${insets.right}px`,\n ['--badge-inset-bottom' as never]: `${insets.bottom}px`,\n ['--badge-inset-left' as never]: `${insets.left}px`,\n ...(padding !== undefined && { padding: typeof padding === 'number' ? `${padding}px` : padding }),\n ...(breakStyle !== undefined && {\n boxDecorationBreak: breakStyle,\n WebkitBoxDecorationBreak: breakStyle,\n }),\n ...styleOverride,\n };\n\n const commonProps = {\n ...domProps,\n ...(tooltipOnPlainBadge && domProps.role === undefined && { role: 'img' }),\n className: cls,\n style,\n 'data-shape': composeBase ? 'compose' : resolvedShape,\n 'data-status': status,\n 'data-stance': stanced['data-stance'],\n 'data-tone': stanced['data-tone'],\n 'data-variant': variant,\n 'data-size': size,\n 'data-focused': focused ? 'true' : undefined,\n onFocus: (e: FocusEvent<HTMLElement>) => { setFocused(true); onFocus?.(e); },\n onBlur: (e: FocusEvent<HTMLElement>) => { setFocused(false); onBlur?.(e); },\n 'aria-label': ariaLabel,\n };\n\n // Honest chaining: sample the base perimeter at COMPOSE_SAMPLES points and sum every\n // offset-style effect's contribution at each sample. Stacked transforms therefore compose\n // additively — `[bites, spikes]` produces a bitten outline with spikes radiating from\n // wherever bites haven't dented inward.\n const COMPOSE_SAMPLES = 600;\n const composedSampler = (() => {\n if (!composeBase || !sampler) return null;\n const offsetMods = (resolvedEffects ?? [])\n .map((eff) => {\n const mod = EFFECTS[eff.type as keyof typeof EFFECTS];\n if (!mod?.offsetAt) return null;\n const effParams = { ...(mod.defaults ?? {}), ...(eff.params ?? {}) };\n return { offsetAt: mod.offsetAt, params: effParams };\n })\n .filter(Boolean) as { offsetAt: NonNullable<typeof EFFECTS[BadgeEffect]['offsetAt']>; params: Record<string, unknown> }[];\n const bloatCss = bloat ?? 0;\n if (offsetMods.length === 0 && bloatCss === 0) return sampler;\n const sx = 100 / box.w;\n const sy = 100 / box.h;\n const totalCss = sampler.totalCss;\n // Compute the warped sample point at any CSS arc length s — base perimeter sample\n // bloated outward by a constant CSS distance plus the sum of every offset effect's\n // contribution at that sample.\n const warpedXY = (sCss: number) => {\n const sm = ((sCss % totalCss) + totalCss) % totalCss;\n const pt = sampler.perimeterAt(sm);\n let dx = pt.nx * bloatCss;\n let dy = pt.ny * bloatCss;\n for (const m of offsetMods) {\n const o = m.offsetAt(sm, {\n params: m.params as never,\n phase,\n totalCss,\n perimeterAt: sampler.perimeterAt,\n });\n dx += o.dx;\n dy += o.dy;\n }\n return { x: pt.x + dx * sx, y: pt.y + dy * sy };\n };\n let d = '';\n for (let i = 0; i < COMPOSE_SAMPLES; i++) {\n const sCss = (i / COMPOSE_SAMPLES) * totalCss;\n const w = warpedXY(sCss);\n d += (i === 0 ? `M ${w.x.toFixed(3)} ${w.y.toFixed(3)}` : ` L ${w.x.toFixed(3)} ${w.y.toFixed(3)}`);\n }\n d += ' Z';\n // Replace perimeterAt with a warped version: warped point + normal recomputed from\n // the warped tangent (clockwise rotation of unit tangent). This is what decorations\n // like Bevel and Perforations need to follow the actual bumpy outline.\n const warpedPerimeterAt = (s: number) => {\n const sm = ((s % totalCss) + totalCss) % totalCss;\n const pt = warpedXY(sm);\n const eps = totalCss / (COMPOSE_SAMPLES * 2);\n const wA = warpedXY(sm - eps);\n const wB = warpedXY(sm + eps);\n // Convert finite-difference tangent back to \"CSS px\" by un-scaling per-axis.\n const tx = (wB.x - wA.x) / sx;\n const ty = (wB.y - wA.y) / sy;\n const tl = Math.hypot(tx, ty) || 1;\n // Outward normal: clockwise rotation of tangent (in CSS space), then renormalize\n // for unit length in viewBox terms when returned.\n const nxC = ty / tl;\n const nyC = -tx / tl;\n // Convert that CSS-space normal back to a viewBox-space unit-ish normal: the\n // existing PerimeterPoint contract has nx/ny used multiplicatively with sx/sy in\n // call sites, matching the convention base perimeters use.\n return { x: pt.x, y: pt.y, nx: nxC, ny: nyC };\n };\n return { bodyPath: d, perimeterAt: warpedPerimeterAt, totalCss };\n })();\n\n const decoEffects = (resolvedEffects ?? []).filter((eff) => EFFECTS[eff.type as keyof typeof EFFECTS]?.Component);\n const backgroundDecorations = decoEffects.filter((eff) => (EFFECTS[eff.type as keyof typeof EFFECTS].zone ?? 'foreground') === 'background');\n const foregroundDecorations = decoEffects.filter((eff) => (EFFECTS[eff.type as keyof typeof EFFECTS].zone ?? 'foreground') === 'foreground');\n const maskDecorations = decoEffects.filter((eff) => EFFECTS[eff.type as keyof typeof EFFECTS].zone === 'mask');\n const bodyMaskId = `badge-mask-${useId().replace(/:/g, '')}`;\n\n const renderDecoration = (eff: EffectSpec, i: number) => {\n const mod = EFFECTS[eff.type as keyof typeof EFFECTS];\n const EffComponent = mod?.Component;\n if (!EffComponent || !composedSampler) return null;\n const effParams = { ...(mod.defaults ?? {}), ...(eff.params ?? {}) };\n return <EffComponent key={`${eff.type as string}-${i}`} sampler={composedSampler} boxW={box.w} boxH={box.h} variant={variant} params={effParams} phase={phase} />;\n };\n\n const decoSvg = composeBase && composedSampler ? (\n <svg ref={decoRef} className={s.deco} viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\n {maskDecorations.length > 0 && (\n <defs>\n <mask id={bodyMaskId} maskUnits=\"userSpaceOnUse\" x=\"-10\" y=\"-10\" width=\"120\" height=\"120\">\n <rect x=\"-10\" y=\"-10\" width=\"120\" height=\"120\" fill=\"white\" />\n {maskDecorations.map(renderDecoration)}\n </mask>\n </defs>\n )}\n {backgroundDecorations.map(renderDecoration)}\n <g {...(maskDecorations.length > 0 ? { mask: `url(#${bodyMaskId})` } : {})}>\n {(variant === 'solid' || variant === 'subtle') && <path className=\"badge-fill\" d={composedSampler.bodyPath} />}\n {(variant === 'outline' || variant === 'solid') && <path className=\"badge-stroke\" d={composedSampler.bodyPath} />}\n </g>\n {foregroundDecorations.map(renderDecoration)}\n </svg>\n ) : shapeModule.renderMode !== 'css' && ShapeBody ? (\n <svg\n className={s.deco}\n viewBox=\"0 0 100 100\"\n preserveAspectRatio={shapeModule.stretches === false ? 'xMidYMid meet' : 'none'}\n aria-hidden=\"true\"\n >\n <ShapeBody variant={variant} focused={focused} params={params} phase={phase} />\n </svg>\n ) : null;\n\n const inner = (\n <>\n {decoSvg}\n <span className={s.content}>\n <span>{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n className={s.remove}\n aria-label={removeLabel ?? 'Remove'}\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n >\n <svg viewBox=\"0 0 10 10\" width=\"10\" height=\"10\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M 2 2 L 8 8 M 8 2 L 2 8\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" fill=\"none\" />\n </svg>\n </button>\n )}\n </span>\n </>\n );\n\n let badge;\n if (element === 'button') {\n badge = (\n <button type=\"button\" {...commonProps} ref={ref as Ref<HTMLButtonElement>} onClick={onClick}>\n {inner}\n </button>\n );\n } else if (element === 'a') {\n badge = (\n <a href={href} {...commonProps} ref={ref as Ref<HTMLAnchorElement>} onClick={onClick}>\n {inner}\n </a>\n );\n } else {\n badge = <span {...commonProps} ref={ref}>{inner}</span>;\n }\n if (tooltip == null) return badge;\n return (\n <TooltipTrigger>\n <Focusable>{badge}</Focusable>\n <Tooltip>{tooltip}</Tooltip>\n </TooltipTrigger>\n );\n});\n","import type { DOMAttributes, ReactElement, ReactNode } from 'react';\nimport { Focusable } from 'react-aria-components';\nimport { Tooltip, TooltipTrigger } from './Tooltip';\n\n/** The tooltip fields a segmented bar's item carries. */\nexport interface SegmentTooltipFields {\n /** Tooltip content. Overrides the name-plus-`shortcut` default. */\n tooltip?: ReactNode;\n /** Shortcut hint shown in the tooltip as `Name (⌘Z)`, the way `ToolButton`\n * and `ActionBar` show theirs. The name is `ariaLabel`, else a string\n * `label`. */\n shortcut?: string;\n}\n\n/** Tooltip content for an item, or `undefined` for none. */\nexport function segmentTooltipContent(\n item: SegmentTooltipFields & { label?: ReactNode; ariaLabel?: string },\n): ReactNode | undefined {\n if (item.tooltip !== undefined) return item.tooltip;\n if (!item.shortcut) return undefined;\n const name = item.ariaLabel ?? (typeof item.label === 'string' ? item.label : undefined);\n return name ? `${name} (${item.shortcut})` : item.shortcut;\n}\n\n/** Wraps a segment's `<button>` in a kit tooltip when there is content for one. */\nexport function SegmentTooltip({ content, disabled, children }: {\n content: ReactNode | undefined;\n disabled?: boolean;\n children: ReactElement<DOMAttributes<HTMLButtonElement>, 'button'>;\n}): ReactElement {\n if (content === undefined || content === null || content === false) return children;\n return (\n <TooltipTrigger isDisabled={disabled}>\n <Focusable isDisabled={disabled}>{children}</Focusable>\n <Tooltip>{content}</Tooltip>\n </TooltipTrigger>\n );\n}\n\n/** {@link SegmentTooltip} for a React Aria trigger (`Button` inside a\n * `MenuTrigger` or `Select`), which takes the tooltip's hover and focus props\n * itself and so needs no `Focusable` around it. */\nexport function TriggerTooltip({ content, disabled, children }: {\n content: ReactNode | undefined;\n disabled?: boolean;\n children: ReactElement;\n}): ReactElement {\n if (content === undefined || content === null || content === false) return children;\n return (\n <TooltipTrigger isDisabled={disabled}>\n {children}\n <Tooltip>{content}</Tooltip>\n </TooltipTrigger>\n );\n}\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode, type Ref } from 'react';\nimport s from './Button.module.css';\nimport { SegmentTooltip, segmentTooltipContent, type SegmentTooltipFields } from '../segmentTooltip';\nimport { type StanceProps, useStance } from '../stance';\n\n/** Visual weight of a button. Defaults to `secondary`. `link` drops the\n * control box entirely and reads as a hyperlink in running text -- for an\n * in-page navigation that is still a button, not an `<a href>`. */\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'link';\n/** Text color of a `link` button — the same set as `Code`'s statuses. */\nexport type ButtonStatus = 'neutral' | 'muted' | 'accent' | 'success' | 'warn' | 'danger';\n/** Button height and type scale. */\nexport type ButtonSize = 'sm' | 'md';\n\ntype ButtonBase = {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Text color of the `link` variant, which is `accent` unless told\n * otherwise. The boxed variants carry their weight in their fill and\n * ignore it. A peer `tone`, or a stance's accent, paints over it. */\n status?: ButtonStatus;\n /** A button that stays down: renders `aria-pressed` and holds the active\n * treatment while it is on. For a control that reports a state rather than\n * firing an action -- a panel toggle, a mode switch. Left off, the button\n * announces no pressed state at all, which is what an action button wants. */\n pressed?: boolean;\n disabled?: boolean;\n loading?: boolean;\n leadingIcon?: ReactNode;\n trailingIcon?: ReactNode;\n fullWidth?: boolean;\n type?: 'button' | 'submit' | 'reset';\n className?: string;\n style?: ButtonHTMLAttributes<HTMLButtonElement>['style'];\n children?: ReactNode;\n onClick?: ButtonHTMLAttributes<HTMLButtonElement>['onClick'];\n} & StanceProps & SegmentTooltipFields;\n\ntype ButtonRegular = ButtonBase & {\n iconOnly?: false;\n ariaLabel?: string;\n};\n\ntype ButtonIconOnly = ButtonBase & {\n iconOnly: true;\n ariaLabel: string;\n};\n\n/**\n * Props for {@link Button}. Setting `iconOnly` makes `ariaLabel` required,\n * since an icon-only button has no text for a screen reader to announce.\n */\nexport type ButtonProps = ButtonRegular | ButtonIconOnly;\n\nfunction Spinner(): ReactNode {\n return (\n <span className={s.spinner} aria-hidden=\"true\">\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\">\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeOpacity=\"0.25\"\n />\n <path\n d=\"M 8 2 A 6 6 0 0 1 14 8\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n </span>\n );\n}\n\n/**\n * Standard button. `loading` swaps the leading icon for a spinner, marks the\n * button `aria-busy`, and leaves the label in place; it does not disable the\n * button, so pass `disabled` too if the click should be blocked.\n *\n * `shortcut` adds a kit tooltip reading `Name (⌘S)`, named by `ariaLabel` or\n * string children, the way `ToolButton` and `ButtonBar` items show theirs;\n * `tooltip` replaces that text with any content.\n *\n * `ref` forwards to the underlying `<button>`.\n */\nexport const Button = forwardRef(function Button(\n props: ButtonProps,\n ref: Ref<HTMLButtonElement>,\n) {\n const {\n variant = 'secondary',\n size = 'md',\n status,\n stance,\n tone,\n pressed,\n disabled,\n loading,\n leadingIcon,\n trailingIcon,\n fullWidth,\n iconOnly,\n ariaLabel,\n type = 'button',\n className,\n style,\n children,\n onClick,\n shortcut,\n tooltip,\n } = props;\n\n const cls = [\n s.button,\n s[`variant_${variant}`],\n s[`size_${size}`],\n fullWidth && s.fullWidth,\n pressed && s.pressed,\n iconOnly && s.iconOnly,\n loading && s.loading,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const showLeading = !iconOnly && (loading || leadingIcon);\n const stanced = useStance({ stance, tone });\n\n return (\n <SegmentTooltip\n content={segmentTooltipContent({ tooltip, shortcut, ariaLabel, label: children })}\n disabled={disabled}\n >\n <button\n ref={ref}\n type={type}\n className={cls}\n data-stance={stanced['data-stance']}\n data-tone={stanced['data-tone']}\n style={stanced.style || style ? { ...stanced.style, ...style } : undefined}\n disabled={disabled}\n aria-busy={loading ? true : undefined}\n aria-pressed={pressed}\n data-status={status}\n aria-label={ariaLabel}\n onClick={onClick}\n >\n {showLeading && (\n <span className={s.iconSlot}>{loading ? <Spinner /> : leadingIcon}</span>\n )}\n {iconOnly ? (\n loading ? <Spinner /> : <span className={s.iconSlot}>{children}</span>\n ) : (\n children !== undefined && <span className={s.label}>{children}</span>\n )}\n {!iconOnly && trailingIcon && (\n <span className={s.iconSlot}>{trailingIcon}</span>\n )}\n </button>\n </SegmentTooltip>\n );\n});\n","/** Elements that handle their own press and keys. */\nexport const CONTROL_SELECTOR = [\n 'button', 'input', 'select', 'textarea', 'a[href]', '[contenteditable=\"\"]', '[contenteditable=\"true\"]',\n '[role=\"button\"]', '[role=\"checkbox\"]', '[role=\"switch\"]', '[role=\"menuitem\"]', '[role=\"link\"]',\n].join(',');\n\n/**\n * Whether `target` sits in a control of its own somewhere inside `host` — a\n * toggle in a list row. The host's handlers leave such an event to the\n * control, so a row's press, click and keys never swallow its controls'.\n */\nexport function isInControlWithin(target: EventTarget | null, host: Element): boolean {\n if (!(target instanceof Element)) return false;\n const control = target.closest(CONTROL_SELECTOR);\n return control !== null && control !== host && host.contains(control);\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ReactNode, PointerEvent as ReactPointerEvent, RefCallback } from 'react';\nimport { startThresholdDrag, type ThresholdDragHandle } from '@weasel-js/core';\nimport { isInControlWithin } from './interactiveTarget';\n\n/** One row in a reorderable list. */\nexport interface ReorderItem {\n id: string;\n label: ReactNode;\n /** Locked rows cannot be dragged, cannot be crossed by drops, and\n * never combine with other rows in a multi-selection. */\n locked?: boolean;\n}\n\n/**\n * Options for {@link useReorderDragList}. `onReorder` receives the dragged ids\n * and the index they were dropped at, measured against the pre-drag `items`.\n */\nexport interface UseReorderDragListOptions {\n items: ReorderItem[];\n selectedIds: string[];\n onReorder(ids: string[], targetIndex: number): void;\n /** A press that was released without ever engaging a drag — the click a\n * list row means by it. Fires for locked rows too, which can be selected\n * but not dragged. Modifiers are read at press, not at release. When this\n * is given, the DOM click that follows the press is dropped, so a row that\n * also handles `click` sees one press, not two. A press that starts on a\n * control inside the row (a toggle) is left to the control. */\n onPress?(id: string, mods: PressModifiers): void;\n /** Pointer-move distance (px) before pending drag engages. Default 4. */\n threshold?: number;\n /** Selector matching the container's children that are rows, for a list\n * that interleaves other elements (a table's detail rows). Default: every\n * child is a row. */\n rowSelector?: string;\n}\n\n/** Modifier keys held when a press began. */\nexport interface PressModifiers {\n shiftKey: boolean;\n ctrlKey: boolean;\n metaKey: boolean;\n altKey: boolean;\n}\n\n/**\n * Where a drag's ghost goes: the dragged rows, drawn again with their top-left\n * at a client-space point, so the row that was grabbed stays under the pointer\n * where it was picked up. `width` is the grabbed row's.\n */\nexport interface ReorderGhost {\n ids: readonly string[];\n left: number;\n top: number;\n width: number;\n}\n\n/**\n * Live drag state for rendering feedback: which ids are being dragged, the\n * insertion index the drop would use, and where their ghost goes. All `null`\n * when no drag is engaged.\n */\nexport interface ReorderDragState {\n draggedIds: string[] | null;\n targetIndex: number | null;\n ghost: ReorderGhost | null;\n}\n\nconst IDLE: ReorderDragState = { draggedIds: null, targetIndex: null, ghost: null };\n\n/**\n * A `ref` for the list container, an `onPointerDown` for each row, and the\n * live {@link ReorderDragState}. The container ref is required, not optional\n * decoration: it is what the drop index is measured against and what the\n * pointer session is opened on.\n */\nexport interface ReorderDragHandlers {\n rowProps(id: string, index: number): { onPointerDown(e: ReactPointerEvent): void };\n containerProps: {\n ref: RefCallback<HTMLElement>;\n };\n state: ReorderDragState;\n /**\n * Move the row at `index` one place up (`-1`) or down (`1`) — the keyboard\n * reorder. It moves what a drag of that row would: the whole selection if\n * the row is in it, else the row alone, never across a locked row. Calls\n * `onReorder` and returns `true`, or returns `false` when nothing can move.\n */\n nudge(id: string, index: number, delta: -1 | 1): boolean;\n}\n\n/**\n * The half-open run of indices a row at `sourceIndex` may be dropped into:\n * bounded by the nearest locked row above and below it, so a locked row is a\n * wall in both directions rather than a global ceiling.\n */\nfunction unlockedSegment(items: readonly ReorderItem[], sourceIndex: number): [number, number] {\n let lo = 0;\n for (let i = sourceIndex - 1; i >= 0; i--) {\n if (items[i]?.locked) { lo = i + 1; break; }\n }\n let hi = items.length;\n for (let i = sourceIndex + 1; i < items.length; i++) {\n if (items[i]?.locked) { hi = i; break; }\n }\n return [lo, hi];\n}\n\n/** What a drag of the row at `index` carries: the selection within its segment if the row is selected, else the row. */\nfunction draggedIdsFor(\n items: readonly ReorderItem[],\n selectedIds: readonly string[],\n id: string,\n index: number,\n): string[] {\n const [lo, hi] = unlockedSegment(items, index);\n return (selectedIds.includes(id) ? [...selectedIds] : [id]).filter((x) => {\n const i = items.findIndex((it) => it.id === x);\n return i >= lo && i < hi;\n });\n}\n\n/** Would dropping `draggedIds` at `targetIndex` leave a contiguous block where it already is? */\nfunction isNoopDrop(items: readonly ReorderItem[], draggedIds: readonly string[], targetIndex: number): boolean {\n const indices = draggedIds\n .map((id) => items.findIndex((it) => it.id === id))\n .filter((i) => i >= 0)\n .sort((a, b) => a - b);\n const contiguous =\n indices.length > 0 &&\n indices.every((v, i) => {\n if (i === 0) return true;\n const prev = indices[i - 1];\n return prev !== undefined && v === prev + 1;\n });\n const first = indices[0];\n const last = indices[indices.length - 1];\n return contiguous\n && first !== undefined\n && last !== undefined\n && targetIndex >= first\n && targetIndex <= last + 1;\n}\n\n/**\n * Drag-to-reorder for a vertical list of rows. Dragging a row that is part of\n * the current selection drags the whole selection; dragging any other row\n * drags just that row. Locked rows can neither be dragged nor crossed by a\n * drop. A drop that would leave a contiguous block where it already is does\n * not call `onReorder`.\n *\n * The rows are the container's children, whatever they are: `ItemList` rows,\n * or the `PropertyGroup`s of a `PropertyList`. A row's `onPointerDown` can go\n * on the whole row or on a handle inside it.\n *\n * A press opens a `startThresholdDrag` on the *container*, which owns the\n * rest of the gesture: a drag that leaves the list still tracks, a release\n * anywhere still drops, and a release the window never delivered still ends\n * the drag. The container is the origin rather than the row because rows come\n * and go as the list re-renders, and a drag must outlive the row it grabbed.\n */\nexport function useReorderDragList(opts: UseReorderDragListOptions): ReorderDragHandlers {\n const optsRef = useRef(opts);\n optsRef.current = opts;\n const containerRef = useRef<HTMLElement | null>(null);\n const dragRef = useRef<ThresholdDragHandle | null>(null);\n const [state, setState] = useState<ReorderDragState>(IDLE);\n\n useEffect(() => () => { dragRef.current?.cancel(); }, []);\n\n const computeTargetIndex = useCallback((clientY: number, sourceIndex: number): number => {\n const [lo, hi] = unlockedSegment(optsRef.current.items, sourceIndex);\n const c = containerRef.current;\n if (!c) return lo;\n const sel = optsRef.current.rowSelector;\n const rows = (sel ? Array.from(c.children).filter((el) => el.matches(sel)) : Array.from(c.children)) as HTMLElement[];\n let raw = rows.length;\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n if (!row) continue;\n const r = row.getBoundingClientRect();\n if (clientY < r.bottom) { raw = i; break; }\n }\n return Math.max(lo, Math.min(raw, hi));\n }, []);\n\n const refCb = useCallback<RefCallback<HTMLElement>>((el) => {\n containerRef.current = el;\n }, []);\n\n const reset = useCallback(() => {\n dragRef.current = null;\n setState(IDLE);\n }, []);\n\n const onPointerDownRow = useCallback((id: string, index: number, e: ReactPointerEvent) => {\n const container = containerRef.current;\n if (!container || dragRef.current) return;\n if (isInControlWithin(e.target, e.currentTarget as Element)) return;\n\n const mods: PressModifiers = {\n shiftKey: e.shiftKey, ctrlKey: e.ctrlKey, metaKey: e.metaKey, altKey: e.altKey,\n };\n let draggedIds: string[] = [];\n let targetIndex = 0;\n // Where in the grabbed row the pointer went down, so the ghost keeps that point under it. The handler may sit on\n // a handle inside the row rather than the row itself, so the row is the container's child holding it.\n const pressed = e.currentTarget as Element;\n const rowEl = Array.from(container.children).find((child) => child.contains(pressed)) ?? pressed;\n const row = rowEl.getBoundingClientRect();\n const grab = { x: e.clientX - row.left, y: e.clientY - row.top };\n const ghostAt = (ev: { clientX: number; clientY: number }): ReorderGhost => ({\n ids: draggedIds,\n left: ev.clientX - grab.x,\n top: ev.clientY - grab.y,\n width: row.width,\n });\n\n dragRef.current = startThresholdDrag(e, {\n origin: container,\n // A locked row still opens a drag so its release reaches `onPress`, and\n // a threshold nothing can cross is what keeps it from ever engaging.\n threshold: optsRef.current.items[index]?.locked\n ? Number.POSITIVE_INFINITY\n : (optsRef.current.threshold ?? 4),\n onActivate: (ev) => {\n draggedIds = draggedIdsFor(optsRef.current.items, optsRef.current.selectedIds, id, index);\n targetIndex = computeTargetIndex(ev.clientY, index);\n setState({ draggedIds, targetIndex, ghost: ghostAt(ev) });\n },\n onMove: (ev) => {\n targetIndex = computeTargetIndex(ev.clientY, index);\n setState({ draggedIds, targetIndex, ghost: ghostAt(ev) });\n },\n onCommit: (ev) => {\n const drop = computeTargetIndex(ev.clientY, index);\n if (!isNoopDrop(optsRef.current.items, draggedIds, drop)) {\n optsRef.current.onReorder(draggedIds, drop);\n }\n reset();\n },\n onClick: () => {\n const { onPress } = optsRef.current;\n if (onPress) {\n onPress(id, mods);\n swallowNextClick(container);\n }\n reset();\n },\n // Every cancel reason — the browser's, a lost capture, an unmount —\n // says the gesture was interrupted rather than aimed, so the rows stay\n // where they were.\n onCancel: reset,\n });\n }, [computeTargetIndex, reset]);\n\n const nudge = useCallback((id: string, index: number, delta: -1 | 1): boolean => {\n const { items, selectedIds, onReorder } = optsRef.current;\n if (items[index]?.locked) return false;\n const ids = draggedIdsFor(items, selectedIds, id, index);\n const at = ids.map((x) => items.findIndex((it) => it.id === x)).sort((a, b) => a - b);\n const first = at[0];\n const last = at[at.length - 1];\n if (first === undefined || last === undefined) return false;\n const [lo, hi] = unlockedSegment(items, index);\n const target = delta < 0 ? first - 1 : last + 2;\n if (target < lo || target > hi || isNoopDrop(items, ids, target)) return false;\n onReorder(ids, target);\n return true;\n }, []);\n\n return {\n nudge,\n rowProps: (id, index) => ({\n onPointerDown: (e) => onPointerDownRow(id, index, e),\n }),\n containerProps: {\n ref: refCb,\n },\n state,\n };\n}\n\n/**\n * The session captured the pointer on the container, so browsers disagree on\n * where the release's click lands; it may still reach the row. `onPress` has\n * already reported this press, so that click is dropped rather than read as a\n * second one. It is dispatched in the same task as the release.\n */\nfunction swallowNextClick(container: HTMLElement): void {\n const swallow = (e: Event) => { e.stopPropagation(); };\n container.addEventListener('click', swallow, true);\n setTimeout(() => { container.removeEventListener('click', swallow, true); }, 0);\n}\n","import type { ReactNode } from 'react';\nimport s from './Disclosure.module.css';\n\n/** Props for `<DisclosureMark>`. */\nexport interface DisclosureMarkProps {\n /** Whether the section it stands for is open: `−` when open, `+` when shut. */\n open: boolean;\n /** Mark size in px, square. Default 13. */\n size?: number;\n className?: string;\n}\n\n/**\n * The fold mark alone: a dark violet rounded square holding a `+` while its section is\n * shut and a `−` while it is open. Decorative — it carries no role or label —\n * for a row that is itself the control, such as a tree item or a header\n * button. Anywhere the mark has to be the control, use `<Disclosure>`.\n *\n * Deliberately not part of the icon register, on the same grounds as\n * `DragHandleGlyph`: that register is outline strokes at a fixed weight, and\n * this mark is filled.\n */\nexport function DisclosureMark({ open, size = 13, className }: DisclosureMarkProps) {\n return (\n <svg\n className={className ? `${s.mark} ${className}` : s.mark}\n viewBox=\"0 0 13 13\"\n width={size}\n height={size}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <rect className={s.lozenge} width=\"13\" height=\"13\" rx=\"3\" />\n {/* One-unit bars centered on 6.5 in an odd box, so at the default size\n both edges land on the pixel grid rather than blurring across it. */}\n <path className={s.sign} d={open ? 'M3 6.5 H10' : 'M3 6.5 H10 M6.5 3 V10'} />\n </svg>\n );\n}\n\n/** Props for `<Disclosure>`. */\nexport interface DisclosureProps {\n /** Whether the section it controls is open. The consumer owns this. */\n open: boolean;\n onToggle: () => void;\n /**\n * Names the section, for a screen reader. The control has no text of its\n * own, so without this it announces as an unlabeled button.\n */\n label: string;\n /**\n * `id` of the element this expands. Sets `aria-controls`, which lets a\n * screen reader move to the revealed content.\n */\n controls?: string;\n /** Mark size in px. The hit target is at least 20px and grows with it.\n * Default 13. */\n size?: number;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * The twisty on a collapsible section: a `<DisclosureMark>` in a button.\n *\n * Presentational — it holds no open/closed state and renders no children.\n * The consumer owns the state and the panel; this is the control that toggles\n * it, and `aria-expanded` is what ties the two together.\n *\n * Three things it settles that a hand-rolled twisty keeps getting wrong. The\n * mark is drawn rather than typed, because `--wzl-font-ui` carries no ▸/▾ and\n * a text glyph falls back to whatever the system offers at whatever size that\n * font renders it. The hit target is larger than the mark. And it is a sibling\n * of the row's label rather than a child, so clicking to expand does not\n * actuate the label's own control.\n */\nexport function Disclosure({ open, onToggle, label, controls, size = 13, disabled, className }: DisclosureProps) {\n return (\n <button\n type=\"button\"\n className={className ? `${s.twisty} ${className}` : s.twisty}\n aria-expanded={open}\n aria-controls={controls}\n aria-label={label}\n disabled={disabled}\n onClick={onToggle}\n >\n <DisclosureMark open={open} size={size} />\n </button>\n );\n}\n\n/** Props for `<DisclosureRow>`. */\nexport interface DisclosureRowProps extends Omit<DisclosureProps, 'className'> {\n /** The row's own content — a label, a checkbox, a count. */\n children: ReactNode;\n className?: string;\n}\n\n/**\n * A `<Disclosure>` and a row of content beside it, laid out so the twisty\n * leads and the content takes the rest.\n *\n * The layout is the point: the twisty sits *outside* whatever the row puts in\n * it, so a row whose content is a `<label>` wrapping a checkbox stays\n * clickable as a label without the twisty actuating it.\n */\nexport function DisclosureRow({ children, className, ...twisty }: DisclosureRowProps) {\n return (\n <div className={className ? `${s.row} ${className}` : s.row}>\n <Disclosure {...twisty} />\n <div className={s.rowBody}>{children}</div>\n </div>\n );\n}\n","/**\n * Lightweight sortable data grid. Use for inspector tables — action\n * registries, route maps, telemetry rows. Intentionally narrow:\n *\n * - Sortable columns (click header to cycle asc → desc → none)\n * - Custom cell render via per-column `render`\n * - Optional drag handles for row reordering (when `onReorder` is set)\n * - Per-row class, row activation, and expandable full-width detail rows\n *\n * Not: virtual scrolling, column resizing, multi-column sort, filtering,\n * inline editing. Reach for a real grid library when you need those.\n */\nimport { Fragment, useId, useMemo, useState } from 'react';\nimport type { KeyboardEvent, MouseEvent, ReactNode } from 'react';\nimport { useReorderDragList } from '../../useReorderDragList';\nimport { Disclosure } from '../Disclosure';\nimport s from './DataGrid.module.css';\n\n/**\n * One column of a {@link DataGrid}. `id` doubles as the default property name\n * read off each row when no `accessor` is given.\n */\nexport interface DataGridColumn<Row> {\n id: string;\n header: ReactNode;\n /** Pull a sortable value from the row. Defaults to `(row as any)[column.id]`. */\n accessor?: (row: Row) => string | number | null | undefined;\n /** Render the cell. Defaults to `String(accessor(row) ?? '')`. */\n render?: (row: Row) => ReactNode;\n /** Default true. Set false to suppress the sort affordance on this column. */\n sortable?: boolean;\n /** Optional CSS class on every <td> in this column. */\n className?: string;\n}\n\n/** Props for {@link DataGrid}. */\nexport interface DataGridProps<Row extends { id: string }> {\n rows: readonly Row[];\n columns: readonly DataGridColumn<Row>[];\n /** Initial sort. Omit for unsorted (rows render in input order). */\n defaultSort?: { columnId: string; direction: 'asc' | 'desc' };\n /** Enable drag handles in a leading column. Receives the reorder spec\n * (the existing `useReorderDragList` semantics — see weasel-ui). */\n onReorder?: (ids: string[], targetIndex: number) => void;\n /** Empty-state row text. Default `'—'`. */\n empty?: ReactNode;\n className?: string;\n /** Extra class on a row's `<tr>`, for row-level state such as a verdict. */\n rowClassName?: (row: Row) => string | undefined;\n /**\n * Activate a row. Makes each row focusable: a click anywhere in it, or\n * Enter/Space while it has focus, calls this. Clicks and keys landing on a\n * control inside a cell (button, link, input, …) are left to that control.\n */\n onRowClick?: (row: Row) => void;\n /**\n * Content for a full-width detail row under `row`, shown while the row is\n * expanded. Setting it adds a leading disclosure column. Return `null` for\n * no detail row.\n */\n renderDetail?: (row: Row) => ReactNode;\n /** Which rows offer the disclosure. Default: every row. */\n rowExpandable?: (row: Row) => boolean;\n /** Expanded row ids, controlled. Pair with `onExpandedChange`. */\n expandedIds?: ReadonlySet<string>;\n /** Initially expanded row ids when uncontrolled. */\n defaultExpandedIds?: Iterable<string>;\n /** Called with the next expanded set when a disclosure toggles. */\n onExpandedChange?: (ids: ReadonlySet<string>) => void;\n}\n\ntype SortState = { columnId: string; direction: 'asc' | 'desc' } | null;\n\nconst INTERACTIVE = 'a[href], button, input, select, textarea, label, summary, [role=\"button\"], [contenteditable=\"true\"]';\n\n/** Did this event start on a control inside the row rather than on the row itself? */\nfunction fromControl(e: MouseEvent | KeyboardEvent): boolean {\n const target = e.target as Element | null;\n const hit = target?.closest?.(INTERACTIVE);\n return !!hit && e.currentTarget.contains(hit);\n}\n\n/**\n * Sortable table for inspector-style data. Rows are keyed by `id`. Clicking a\n * sortable header cycles ascending, descending, unsorted; nullish values sort\n * last regardless of direction. Passing `onReorder` adds a leading drag-handle\n * column — note that the drag indices it reports are into the *sorted* row\n * order, not the input order.\n */\nexport function DataGrid<Row extends { id: string }>(props: DataGridProps<Row>) {\n const {\n rows, columns, defaultSort, onReorder, empty = '—', className,\n rowClassName, onRowClick, renderDetail, rowExpandable, expandedIds, defaultExpandedIds, onExpandedChange,\n } = props;\n const [sort, setSort] = useState<SortState>(defaultSort ?? null);\n const [ownExpanded, setOwnExpanded] = useState<ReadonlySet<string>>(() => new Set(defaultExpandedIds));\n const expanded = expandedIds ?? ownExpanded;\n const detailIdBase = useId();\n\n const toggleExpanded = (id: string) => {\n const next = new Set(expanded);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n if (!expandedIds) setOwnExpanded(next);\n onExpandedChange?.(next);\n };\n\n const sortedRows = useMemo(() => {\n if (!sort) return [...rows];\n const col = columns.find((c) => c.id === sort.columnId);\n if (!col) return [...rows];\n const get = col.accessor ?? ((row: Row) => (row as unknown as Record<string, unknown>)[col.id] as string | number | null | undefined);\n const dir = sort.direction === 'asc' ? 1 : -1;\n return [...rows].sort((a, b) => {\n const av = get(a);\n const bv = get(b);\n if (av == null && bv == null) return 0;\n if (av == null) return 1;\n if (bv == null) return -1;\n if (av < bv) return -1 * dir;\n if (av > bv) return 1 * dir;\n return 0;\n });\n }, [rows, columns, sort]);\n\n const cycleSort = (columnId: string) => {\n setSort((cur) => {\n if (!cur || cur.columnId !== columnId) return { columnId, direction: 'asc' };\n if (cur.direction === 'asc') return { columnId, direction: 'desc' };\n return null;\n });\n };\n\n // Drag handles via useReorderDragList. Adapter: the hook expects\n // `{ id, label }`-shaped items; we map our rows to that shape (label\n // unused — the hook only uses id and locked).\n const drag = useReorderDragList({\n items: sortedRows.map((r) => ({ id: r.id, label: '' })),\n selectedIds: [],\n onReorder: onReorder ?? (() => {}),\n rowSelector: ':not([data-detail-of])',\n });\n const dragEnabled = !!onReorder;\n const detailEnabled = !!renderDetail;\n const colCount = columns.length + (dragEnabled ? 1 : 0) + (detailEnabled ? 1 : 0);\n\n const cls = [s.grid, className].filter(Boolean).join(' ');\n\n return (\n <div\n className={cls}\n >\n <table className={s.table}>\n <thead>\n <tr>\n {dragEnabled && <th className={s.handleCol} aria-label=\"drag\" />}\n {detailEnabled && <th className={s.detailCol} aria-label=\"details\" />}\n {columns.map((col) => {\n const sortable = col.sortable !== false;\n const active = sort?.columnId === col.id;\n const indicator = active ? (sort.direction === 'asc' ? ' ↑' : ' ↓') : '';\n return (\n <th\n key={col.id}\n className={[col.className, active ? s.sortActive : ''].filter(Boolean).join(' ')}\n aria-sort={sortable ? (active ? (sort.direction === 'asc' ? 'ascending' : 'descending') : 'none') : undefined}\n >\n {sortable ? (\n <button type=\"button\" className={s.sortButton} onClick={() => cycleSort(col.id)}>\n {col.header}{indicator}\n </button>\n ) : (\n <>{col.header}{indicator}</>\n )}\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody ref={dragEnabled ? (drag.containerProps.ref as React.RefCallback<HTMLTableSectionElement>) : undefined}>\n {sortedRows.length === 0 && (\n <tr>\n <td colSpan={colCount} className={s.empty}>\n {empty}\n </td>\n </tr>\n )}\n {sortedRows.map((row, i) => {\n const isDragging = drag.state.draggedIds?.includes(row.id) ?? false;\n const target = drag.state.targetIndex;\n const expandable = detailEnabled && (rowExpandable?.(row) ?? true);\n const isExpanded = expandable && expanded.has(row.id);\n const detail = isExpanded ? renderDetail!(row) : null;\n const detailId = `${detailIdBase}-detail-${row.id}`;\n const rowCls = [\n onRowClick && s.clickable,\n isDragging && s.dragging,\n target === i && s.dropBefore,\n target === sortedRows.length && i === sortedRows.length - 1 && s.dropAfter,\n rowClassName?.(row),\n ].filter(Boolean).join(' ');\n return (\n <Fragment key={row.id}>\n <tr\n className={rowCls || undefined}\n data-expanded={isExpanded || undefined}\n tabIndex={onRowClick ? 0 : undefined}\n onClick={onRowClick ? (e) => { if (!fromControl(e)) onRowClick(row); } : undefined}\n onKeyDown={onRowClick ? (e) => {\n if (e.target !== e.currentTarget || (e.key !== 'Enter' && e.key !== ' ')) return;\n e.preventDefault();\n onRowClick(row);\n } : undefined}\n >\n {dragEnabled && (\n <td\n className={s.handleCell}\n onPointerDown={(e) => drag.rowProps(row.id, i).onPointerDown(e)}\n >\n <span aria-hidden=\"true\">⋮⋮</span>\n </td>\n )}\n {detailEnabled && (\n <td className={s.detailCell}>\n {expandable && (\n <Disclosure\n open={isExpanded}\n onToggle={() => toggleExpanded(row.id)}\n label={isExpanded ? 'Hide details' : 'Show details'}\n controls={detail != null ? detailId : undefined}\n />\n )}\n </td>\n )}\n {columns.map((col) => {\n const get = col.accessor ?? ((r: Row) => (r as unknown as Record<string, unknown>)[col.id] as string | number | null | undefined);\n const content = col.render ? col.render(row) : String(get(row) ?? '');\n return (\n <td key={col.id} className={col.className}>\n {content}\n </td>\n );\n })}\n </tr>\n {detail != null && (\n <tr id={detailId} className={s.detailRow} data-detail-of={row.id}>\n <td colSpan={colCount}>{detail}</td>\n </tr>\n )}\n </Fragment>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { nearestPortalHost } from '../../overlays/portalHost';\nimport s from './DragGhost.module.css';\n\n/** Props for `<DragGhost>`. */\nexport interface DragGhostProps {\n /** The ghost's top-left in client space, and its width — `useReorderDragList`'s `state.ghost` is one. */\n at: { left: number; top: number; width: number };\n /** An element inside the list being dragged from. The ghost portals to its nearest themed ancestor, so it resolves\n * the list's tokens without being clipped by the list's panel. */\n from: Element;\n /** What to draw: copies of the dragged items, or any stand-in for them. */\n children: ReactNode;\n}\n\n/** Whether `el` is the containing block of its fixed-position descendants rather than the viewport. */\nfunction containsFixed(el: Element): boolean {\n const cs = getComputedStyle(el);\n return (\n cs.transform !== 'none' ||\n cs.filter !== 'none' ||\n cs.backdropFilter !== 'none' ||\n cs.perspective !== 'none' ||\n /paint|layout|strict|content/.test(cs.contain)\n );\n}\n\n/**\n * What follows the pointer during a drag while the dragged items hold their place: `children` on a raised surface at\n * a client-space point. Hidden from assistive tech and from the pointer, so it never becomes the drop target.\n */\nexport function DragGhost({ at, from, children }: DragGhostProps) {\n const host = nearestPortalHost(from) ?? document.body;\n const origin = host !== document.body && containsFixed(host) ? host.getBoundingClientRect() : { left: 0, top: 0 };\n // Pixel positioning: the point is the pointer's, known only at runtime.\n const style: CSSProperties = { left: at.left - origin.left, top: at.top - origin.top, width: at.width };\n return createPortal(\n <div className={s.ghost} style={style} aria-hidden=\"true\">\n {children}\n </div>,\n host,\n );\n}\n","/** Props for `<DragHandleGlyph>`. */\nexport interface DragHandleGlyphProps {\n /** Height in px; width scales with it. Default 16. */\n size?: number;\n}\n\n/** The two-column dot grip used on anything draggable by a handle.\n *\n * Deliberately not part of the icon register: that register is outline strokes\n * at a fixed weight, and a grip is filled dots. Forcing it in would either\n * break the register's rule or produce a worse glyph. */\nexport function DragHandleGlyph({ size = 16 }: DragHandleGlyphProps) {\n return (\n <svg\n width={(size * 8) / 16}\n height={size}\n viewBox=\"0 0 8 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <circle cx=\"2\" cy=\"3\" r=\"1.1\" />\n <circle cx=\"6\" cy=\"3\" r=\"1.1\" />\n <circle cx=\"2\" cy=\"8\" r=\"1.1\" />\n <circle cx=\"6\" cy=\"8\" r=\"1.1\" />\n <circle cx=\"2\" cy=\"13\" r=\"1.1\" />\n <circle cx=\"6\" cy=\"13\" r=\"1.1\" />\n </svg>\n );\n}\n","import type { KeySpec } from './Keycaps';\n\n/** Logical modifier name. Matches the kit's `ModifierKey` in shape — kept as a\n * local type so `weasel-ui` stays independent of `@weasel-js/core`. */\nexport type LogicalMod = 'mod' | 'shift' | 'alt' | 'ctrl' | 'meta';\n\n/** Detected (or overridden) platform. `'mod'` resolves to ⌘ on macOS,\n * Ctrl on Windows / Linux. */\nexport type Platform = 'macos' | 'windows' | 'linux';\n\n/** Visual form of a modifier or named-key label.\n *\n * - `'auto'` (default): the per-entry, per-platform default — whatever\n * label is actually printed on the physical key. macOS keys show the\n * Apple glyphs (⌘ ⌥ ⌃ ⇧ ⎋ ↵ ⇥). Windows keys mostly show text\n * (Ctrl, Alt, Shift) BUT the Win key shows its logo (⊞) and the\n * context-menu key shows ▤. Linux mirrors Windows with Super (⊞).\n * - `'symbol'` forces the Apple-style glyph everywhere a symbolic form\n * exists. Entries without a widely-recognized symbol still fall\n * back to text.\n * - `'text'` always spells the label out (Cmd / Option / Esc / Enter). */\nexport type LegendStyle = 'auto' | 'symbol' | 'text';\n\n/** A modifier to render, named platform-independently. */\nexport interface LogicalModSpec {\n name: LogicalMod;\n /** Marks this modifier as optional (may be held but isn't required).\n * Forwarded as the resulting `KeySpec.optional`. */\n optional?: boolean;\n}\n\n/** Options for {@link keySpecsFromMods}. */\nexport interface KeySpecsFromModsOptions {\n /** Override OS detection. Defaults to the detected platform, or\n * `'macos'` when detection is unavailable (e.g. in tests, or when\n * `navigator` is missing). */\n platform?: Platform;\n /** Defaults to `'auto'` (symbol on macOS, text everywhere else). Pass\n * `'symbol'` or `'text'` to force a specific style regardless of\n * platform. */\n legend?: LegendStyle;\n}\n\nconst MOD_BY_PLATFORM: Record<LogicalMod, Record<Platform, Record<LegendStyle, string>>> = {\n mod: {\n macos: { auto: '⌘', symbol: '⌘', text: 'Cmd' },\n windows: { auto: 'Ctrl', symbol: 'Ctrl', text: 'Ctrl' },\n linux: { auto: 'Ctrl', symbol: 'Ctrl', text: 'Ctrl' },\n },\n shift: {\n macos: { auto: '⇧', symbol: '⇧', text: 'Shift' },\n windows: { auto: '⇧', symbol: '⇧', text: 'Shift' },\n linux: { auto: '⇧', symbol: '⇧', text: 'Shift' },\n },\n alt: {\n macos: { auto: '⌥', symbol: '⌥', text: 'Option' },\n windows: { auto: 'Alt', symbol: 'Alt', text: 'Alt' },\n linux: { auto: 'Alt', symbol: 'Alt', text: 'Alt' },\n },\n ctrl: {\n macos: { auto: '⌃', symbol: '⌃', text: 'Control' },\n windows: { auto: 'Ctrl', symbol: 'Ctrl', text: 'Ctrl' },\n linux: { auto: 'Ctrl', symbol: 'Ctrl', text: 'Ctrl' },\n },\n // Windows/Linux Meta has a recognized symbol on the physical key (⊞ Win\n // logo / Super logo), so `auto` shows it. Use `text` for Win / Super.\n meta: {\n macos: { auto: '⌘', symbol: '⌘', text: 'Cmd' },\n windows: { auto: '⊞', symbol: '⊞', text: 'Win' },\n linux: { auto: '⊞', symbol: '⊞', text: 'Super' },\n },\n};\n\n/** Every label {@link keySpecsFromMods} can produce, on any platform and legend. */\nexport const MODIFIER_LABELS: ReadonlySet<string> = new Set(\n Object.values(MOD_BY_PLATFORM).flatMap((byPlatform) =>\n Object.values(byPlatform).flatMap((byLegend) => Object.values(byLegend)),\n ),\n);\n\n/** Detect the user's OS from the browser environment. UA sniffing — not\n * 100% reliable, but adequate for picking a modifier-glyph convention.\n * Falls back to `'macos'` (matches the kit's docs convention) when\n * `navigator` is unavailable. */\nexport function detectPlatform(): Platform {\n if (typeof navigator === 'undefined') return 'macos';\n // Prefer the modern userAgentData when available (Chromium-only today).\n const uaData = (navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData;\n const raw = (uaData?.platform ?? navigator.userAgent ?? '').toLowerCase();\n if (raw.includes('mac') || raw.includes('darwin') || raw.includes('iphone') || raw.includes('ipad')) return 'macos';\n if (raw.includes('win')) return 'windows';\n if (raw.includes('linux') || raw.includes('x11')) return 'linux';\n return 'macos';\n}\n\n/**\n * Map a list of **logical** modifiers (`'mod'`, `'shift'`, …) to **visual**\n * `KeySpec`s appropriate for the current platform.\n *\n * The kit-side gesture grammar uses logical names so the same route reads\n * correctly on every OS — `'mod'` means \"Cmd on Mac, Ctrl on Win/Linux\".\n * `KeySequence` is purely visual and renders the labels you give it; this\n * helper is the bridge.\n *\n * ```ts\n * <KeySequence\n * keys={keySpecsFromMods([{ name: 'mod' }, { name: 'shift', optional: true }])}\n * />\n * ```\n *\n * On a Mac: renders `⌘ ⇧`. On Windows: renders `Ctrl Shift`. Pass an\n * explicit `platform` to override detection (e.g. for docs that always\n * show the macOS form). Pass `legend: 'text'` to force \"Cmd\" over \"⌘\"\n * even on macOS.\n */\nexport function keySpecsFromMods(\n mods: readonly LogicalModSpec[],\n opts: KeySpecsFromModsOptions = {},\n): readonly KeySpec[] {\n const platform = opts.platform ?? detectPlatform();\n const legend = opts.legend ?? 'auto';\n return mods.map((m) => {\n const label = MOD_BY_PLATFORM[m.name][platform][legend];\n return m.optional ? { label, optional: true } : { label };\n });\n}\n\n/** Per-platform × per-legend table for named, non-modifier keys. `auto`\n * is whatever's printed on the physical key for that platform. Arrows\n * are universal symbols on every platform. */\nconst NAMED_KEY: Record<string, Record<Platform, Record<LegendStyle, string>>> = {\n Escape: { macos: { auto: '⎋', symbol: '⎋', text: 'Esc' }, windows: { auto: 'Esc', symbol: 'Esc', text: 'Esc' }, linux: { auto: 'Esc', symbol: 'Esc', text: 'Esc' } },\n Enter: { macos: { auto: '↵', symbol: '↵', text: 'Return' }, windows: { auto: 'Enter', symbol: 'Enter', text: 'Enter' }, linux: { auto: 'Enter', symbol: 'Enter', text: 'Enter' } },\n Return: { macos: { auto: '↵', symbol: '↵', text: 'Return' }, windows: { auto: 'Enter', symbol: 'Enter', text: 'Enter' }, linux: { auto: 'Enter', symbol: 'Enter', text: 'Enter' } },\n Tab: { macos: { auto: '⇥', symbol: '⇥', text: 'Tab' }, windows: { auto: 'Tab', symbol: 'Tab', text: 'Tab' }, linux: { auto: 'Tab', symbol: 'Tab', text: 'Tab' } },\n Space: { macos: { auto: '␣', symbol: '␣', text: 'Space' }, windows: { auto: 'Space', symbol: 'Space', text: 'Space' }, linux: { auto: 'Space', symbol: 'Space', text: 'Space' } },\n ' ': { macos: { auto: '␣', symbol: '␣', text: 'Space' }, windows: { auto: 'Space', symbol: 'Space', text: 'Space' }, linux: { auto: 'Space', symbol: 'Space', text: 'Space' } },\n Backspace: { macos: { auto: '⌫', symbol: '⌫', text: 'Backspace' }, windows: { auto: 'Backspace', symbol: 'Backspace', text: 'Backspace' }, linux: { auto: 'Backspace', symbol: 'Backspace', text: 'Backspace' } },\n Delete: { macos: { auto: '⌦', symbol: '⌦', text: 'Delete' }, windows: { auto: 'Delete', symbol: 'Delete', text: 'Delete' }, linux: { auto: 'Delete', symbol: 'Delete', text: 'Delete' } },\n // Context-menu key (the right-Ctrl-area key on Windows / Linux keyboards\n // with a ▤ icon). Mac has no equivalent; falls back to text 'Menu'.\n ContextMenu: { macos: { auto: 'Menu', symbol: 'Menu', text: 'Menu' }, windows: { auto: '▤', symbol: '▤', text: 'Menu' }, linux: { auto: '▤', symbol: '▤', text: 'Menu' } },\n ArrowUp: { macos: { auto: '↑', symbol: '↑', text: '↑' }, windows: { auto: '↑', symbol: '↑', text: '↑' }, linux: { auto: '↑', symbol: '↑', text: '↑' } },\n ArrowDown: { macos: { auto: '↓', symbol: '↓', text: '↓' }, windows: { auto: '↓', symbol: '↓', text: '↓' }, linux: { auto: '↓', symbol: '↓', text: '↓' } },\n ArrowLeft: { macos: { auto: '←', symbol: '←', text: '←' }, windows: { auto: '←', symbol: '←', text: '←' }, linux: { auto: '←', symbol: '←', text: '←' } },\n ArrowRight: { macos: { auto: '→', symbol: '→', text: '→' }, windows: { auto: '→', symbol: '→', text: '→' }, linux: { auto: '→', symbol: '→', text: '→' } },\n};\n\n/**\n * Render a raw `KeyboardEvent.key` value as a platform-appropriate\n * `KeySpec`. Named non-modifier keys (Esc, Enter, Tab, Space, Backspace,\n * Delete, arrows) get the platform's conventional form. Letter / digit /\n * other keys pass through upper-cased.\n *\n * ```ts\n * keySpecFromKey('Escape', { platform: 'macos' }) // { label: '⎋' }\n * keySpecFromKey('Escape', { platform: 'windows' }) // { label: 'Esc' }\n * keySpecFromKey('p') // { label: 'P' }\n * ```\n *\n * Symbol mode is only meaningful on macOS — Windows / Linux keyboards\n * print the text form on the physical key, so symbol mode there falls\n * back to text.\n */\nexport function keySpecFromKey(\n raw: string,\n opts: KeySpecsFromModsOptions & { optional?: boolean } = {},\n): KeySpec {\n const platform = opts.platform ?? detectPlatform();\n const legend = opts.legend ?? 'auto';\n const entry = NAMED_KEY[raw];\n const label = entry ? entry[platform][legend] : raw.length === 1 ? raw.toUpperCase() : raw;\n return opts.optional ? { label, optional: true } : { label };\n}\n","import type { CSSProperties } from 'react';\nimport s from './Keycaps.module.css';\nimport { MODIFIER_LABELS } from './keySpecsFromMods';\n\nconst WIDE_GLYPHS = new Set(['⇥', '↵', '␣']);\n\n/**\n * Width class of a keycap: a modifier glyph, a multi-character legend that\n * needs a wider chip, or a single character in a square one.\n */\nexport type KeycapKind = 'modifier' | 'wide' | 'square';\n\n/**\n * Picks the chip width for a legend — modifier glyphs and anything longer\n * than one character get the wider forms.\n */\nexport function inferKeycapKind(label: string): KeycapKind {\n if (label === '⇪' || MODIFIER_LABELS.has(label)) return 'modifier';\n if (WIDE_GLYPHS.has(label)) return 'wide';\n if (label.length > 1) return 'wide';\n return 'square';\n}\n\n/** Visual style of a keycap chip. */\nexport type KeyCapVariant = 'default' | 'minimal';\n\n/** Props for {@link KeyCap}. */\nexport interface KeyCapProps {\n /** Glyph rendered in the chip (modifier or key). */\n label: string;\n /** Marks the chip as not required to trigger the action. In the default\n * variant the chip face inverts (dark face / light glyph) for\n * emphasis. In the `'minimal'` variant the chip's border becomes\n * dotted to read as \"may be held, but isn't required.\" */\n inverted?: boolean;\n /** Visual style. `'default'` (default) renders a filled chip; `'minimal'`\n * renders an unfilled chip whose border and legend are `currentColor`\n * — useful inline in colored prose / next to colored badges where the\n * chip should take the surrounding text color. */\n variant?: KeyCapVariant;\n className?: string;\n /** Optional inline style. Useful for one-off width overrides (e.g.\n * building a keyboard-layout where the space bar spans several\n * standard-key widths). The component sets no inline styles of its\n * own — everything else comes from the CSS module. */\n style?: CSSProperties;\n /** Override the chip's font-family. Accepts any CSS font-family\n * string. When omitted, the chip inherits from the design-system\n * UI font token (`--wzl-font-ui`). Useful for one-off cases where\n * a different face is desired — though the canonical move is to\n * override the CSS variable at the consumer's scope, not the prop. */\n font?: string;\n}\n\n/** Single bordered keycap chip for one glyph (modifier or key). Use\n * `KeySequence` to render a full shortcut. */\nexport function KeyCap({ label, inverted = false, variant = 'default', className, style, font }: KeyCapProps) {\n const resolvedStyle = font ? { ...style, fontFamily: font } : style;\n return (\n <kbd\n className={[s.key, className].filter(Boolean).join(' ')}\n data-kind={inferKeycapKind(label)}\n data-variant={variant === 'default' ? undefined : variant}\n data-inverted={inverted || undefined}\n style={resolvedStyle}\n >\n {label}\n </kbd>\n );\n}\n","import { Fragment } from 'react';\nimport s from './Keycaps.module.css';\nimport { KeyCap, inferKeycapKind, type KeyCapVariant } from './Keycap';\n\n/** One key in a shortcut. */\nexport interface KeySpec {\n /** Glyph rendered in the chip (modifier or key). */\n label: string;\n /** When true, the chip renders inverted to mark it as not required to\n * trigger the action (e.g. an optional modifier). Defaults to false. */\n optional?: boolean;\n}\n\n/** Props for {@link KeySequence}. */\nexport interface KeySequenceProps {\n /** Keys to render. `undefined` or empty renders a muted em-dash.\n * Modifiers are always rendered first regardless of input order; relative\n * order within each group is preserved. */\n keys: readonly KeySpec[] | undefined;\n /** Character inserted between the trailing modifier chip and the first\n * non-modifier chip (e.g. `'+'` renders `⌘ + K`). `null` or `''`\n * suppresses it. Defaults to `'+'`. */\n separator?: string | null;\n /** Forwarded to every `KeyCap` in the sequence. `'minimal'` renders\n * unfilled chips whose border + legend are `currentColor`. */\n variant?: KeyCapVariant;\n /** Forwarded to every `KeyCap` in the sequence. Overrides the design-\n * system UI font for that chip only. */\n font?: string;\n className?: string;\n}\n\n/** Renders a shortcut as a row of `KeyCap` chips, one per key. Optional\n * keys render inverted to distinguish them from required ones. */\nexport function KeySequence({ keys, separator = '+', variant = 'default', font, className }: KeySequenceProps) {\n if (!keys || keys.length === 0) {\n return <span className={[s.keysEmpty, className].filter(Boolean).join(' ')}>—</span>;\n }\n const ordered = keys\n .map((k, i) => ({ k, i }))\n .sort((a, b) => {\n const am = inferKeycapKind(a.k.label) === 'modifier' ? 0 : 1;\n const bm = inferKeycapKind(b.k.label) === 'modifier' ? 0 : 1;\n return am - bm || a.i - b.i;\n })\n .map(({ k }) => k);\n const sepIdx = ordered.findIndex((k) => inferKeycapKind(k.label) !== 'modifier');\n const showSep = !!separator && sepIdx > 0 && sepIdx < ordered.length;\n return (\n <span className={[s.keys, className].filter(Boolean).join(' ')}>\n {ordered.map((k, i) => (\n <Fragment key={i}>\n {showSep && i === sepIdx ? <span className={s.sep}>{separator}</span> : null}\n <KeyCap label={k.label} inverted={k.optional ?? false} variant={variant} font={font} />\n </Fragment>\n ))}\n </span>\n );\n}\n","import type { ShortcutInput } from '../ToolPalette/formatShortcut';\nimport type { KeySpec } from './Keycaps';\nimport { keySpecFromKey, keySpecsFromMods, type KeySpecsFromModsOptions, type LogicalModSpec } from './keySpecsFromMods';\n\n/**\n * A shortcut as `KeySequence` keys, one per key: mod, shift, alt, then the\n * key, each in the platform's own legend (`⌘` on macOS, `Ctrl` elsewhere).\n * The `KeySpec` counterpart of `formatShortcutParts`, which always prints\n * macOS glyphs. `shift: 'optional'` becomes an optional key; a key list\n * renders its first key. Returns `undefined` for no shortcut.\n *\n * ```tsx\n * <KeySequence keys={keySpecsFromShortcut({ key: 'z', mod: true, shift: true })} />\n * ```\n */\nexport function keySpecsFromShortcut(\n shortcut: ShortcutInput | undefined,\n opts: KeySpecsFromModsOptions = {},\n): readonly KeySpec[] | undefined {\n if (!shortcut) return undefined;\n const mods: LogicalModSpec[] = [];\n if (shortcut.mod) mods.push({ name: 'mod' });\n if (shortcut.shift) mods.push(shortcut.shift === 'optional' ? { name: 'shift', optional: true } : { name: 'shift' });\n if (shortcut.alt) mods.push({ name: 'alt' });\n const key = typeof shortcut.key === 'string' ? shortcut.key : shortcut.key[0];\n const keys = keySpecsFromMods(mods, opts);\n return key === undefined ? keys : [...keys, keySpecFromKey(key, opts)];\n}\n","/**\n * Coordinate transforms (model ↔ plot) for Plot2D. Pure / deterministic —\n * no DOM, no React, no state.\n *\n * Model space: caller-defined xRange × yRange. Y axis goes UP.\n * Plot space: 0..width × 0..height in CSS pixels. Y axis goes DOWN (SVG).\n */\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/**\n * The caller-defined extent of model space, the coordinate system a plot's\n * data lives in.\n */\nexport interface ModelRange {\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}\n\n/** The plot's drawing area in CSS pixels. */\nexport interface PlotSize {\n width: number;\n height: number;\n}\n\n/**\n * Maps a model-space point into plot space, flipping the y axis so model y\n * grows upward while SVG y grows downward.\n */\nexport function modelToPlot(p: Point, m: ModelRange, plot: PlotSize): Point {\n const xFrac = (p.x - m.xMin) / (m.xMax - m.xMin);\n const yFrac = (p.y - m.yMin) / (m.yMax - m.yMin);\n return {\n x: xFrac * plot.width,\n // Invert y so model y=0 sits at plot bottom (SVG y grows downward).\n y: (1 - yFrac) * plot.height,\n };\n}\n\n/** The inverse of {@link modelToPlot}. */\nexport function plotToModel(p: Point, m: ModelRange, plot: PlotSize): Point {\n const xFrac = p.x / plot.width;\n const yFrac = 1 - p.y / plot.height;\n return {\n x: m.xMin + xFrac * (m.xMax - m.xMin),\n y: m.yMin + yFrac * (m.yMax - m.yMin),\n };\n}\n","/**\n * Tick placement for a numeric axis. Pure — no DOM, no React.\n */\n\n/** What a tick label formatter knows about the column it is part of. */\nexport interface TickFormatCtx {\n /** Places after the point that every label in the column shares. */\n decimals: number;\n /** Distance between neighboring ticks, or 0 when the ticks were given\n * explicitly and are not evenly spaced. */\n step: number;\n}\n\n/** Turns a tick value into its label. */\nexport type TickFormatter = (value: number, ctx: TickFormatCtx) => string;\n\n/** A column of ticks and the facts its labels share. */\nexport interface TickSet {\n values: number[];\n step: number;\n decimals: number;\n}\n\n/** Options for {@link niceTicks}. */\nexport interface NiceTickOptions {\n /** Smallest gap between neighboring ticks, in px. */\n minSpacing: number;\n /** Ticks closer than this to either end of the axis are dropped, in px.\n * Default 0. */\n inset?: number;\n}\n\nconst MAX_DECIMALS = 20;\n\n/** The smallest of 1, 2 or 5 times a power of ten that is at least `rough`. */\nexport function niceStep(rough: number): number {\n const mag = Math.pow(10, Math.floor(Math.log10(rough)));\n const norm = rough / mag;\n const step = norm <= 1 ? 1 : norm <= 2 ? 2 : norm <= 5 ? 5 : 10;\n return step * mag;\n}\n\n/** Places after the point a multiple of `step` needs, for a 1/2/5 step. */\nexport function stepDecimals(step: number): number {\n if (!(step > 0) || !Number.isFinite(step)) return 0;\n return Math.min(MAX_DECIMALS, Math.max(0, -Math.floor(Math.log10(step) + 1e-9)));\n}\n\n/** The most places after the point any of `values` needs. */\nexport function tickDecimals(values: readonly number[]): number {\n let most = 0;\n for (const v of values) {\n if (!Number.isFinite(v)) continue;\n let d = 0;\n while (d < MAX_DECIMALS && Math.abs(Number(v.toFixed(d)) - v) > 1e-9 * Math.max(1, Math.abs(v))) d++;\n most = Math.max(most, d);\n }\n return most;\n}\n\n/**\n * Ticks at round values across `range`, drawn `pixels` long: the finest\n * 1/2/5 step that keeps neighbors `minSpacing` px apart, so a taller plot\n * gets more of them.\n */\nexport function niceTicks(\n range: readonly [number, number],\n pixels: number,\n options: NiceTickOptions,\n): TickSet {\n const none: TickSet = { values: [], step: 0, decimals: 0 };\n const lo = Math.min(range[0], range[1]);\n const hi = Math.max(range[0], range[1]);\n const span = hi - lo;\n const { minSpacing, inset = 0 } = options;\n if (!(span > 0) || !Number.isFinite(span) || !(pixels > 0) || !(minSpacing > 0)) return none;\n\n const unitsPerPx = span / pixels;\n const step = niceStep(minSpacing * unitsPerPx);\n const decimals = stepDecimals(step);\n const from = lo + inset * unitsPerPx;\n const to = hi - inset * unitsPerPx;\n // A tolerance in step units, so a tick sitting exactly on a bound survives\n // the float error in `from / step`.\n const first = Math.ceil(from / step - 1e-9);\n const last = Math.floor(to / step + 1e-9);\n const values: number[] = [];\n for (let i = first; i <= last; i++) values.push(Number((i * step).toFixed(decimals)) + 0);\n return { values, step, decimals };\n}\n\n/** The default label: `value` fixed to the column's shared decimals, with\n * no negative zero. */\nexport function formatTick(value: number, ctx: TickFormatCtx): string {\n const text = value.toFixed(ctx.decimals);\n return /^-0(\\.0*)?$/.test(text) ? text.slice(1) : text;\n}\n","import {\n forwardRef, useCallback, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react';\nimport {\n modelToPlot, plotToModel,\n type ModelRange, type Point,\n} from './geometry';\nimport {\n formatTick, niceTicks, tickDecimals,\n type TickFormatCtx, type TickFormatter,\n} from './ticks';\nimport s from './Plot2D.module.css';\nimport { dlog } from '../../dlog';\n\n/** Background grid configuration for a {@link Plot2D}. */\nexport interface GridSettings {\n /** Number of evenly-spaced internal grid lines per axis (excluding\n * the edges). Applied to both x and y. Default 3. */\n divisions?: number;\n /** Stroke color override. When omitted, uses `var(--plot-grid)`. */\n color?: string;\n}\n\n/** Axis-line configuration for a {@link Plot2D}. */\nexport interface AxesSettings {\n /** Stroke color override. When omitted, uses `var(--plot-axis)`. */\n color?: string;\n}\n\n/**\n * Ticks along one axis of a {@link Plot2D}: a line across the plot at each\n * tick value, and a label naming it. Every label in a column is formatted\n * to the same number of decimal places.\n */\nexport interface TickSettings {\n /** Tick values in model space; any outside the range are skipped.\n * Omitted = round 1/2/5 steps, as many as `minSpacing` allows at the\n * plot's current size. */\n values?: readonly number[];\n /** Smallest gap between generated ticks, in px. Default 24 on y, 64 on x. */\n minSpacing?: number;\n /** A generated tick nearer either end of the axis than this is dropped,\n * so its label stays on the plot, in px. Default 4 on y, 16 on x. */\n inset?: number;\n /** Draw a line across the plot at each tick. Default true. */\n lines?: boolean;\n /** Where labels sit: `'inside'` the plot along its left (y) or bottom (x)\n * edge, `'outside'` it past that edge in space the caller leaves free,\n * or `false` for none. Default `'inside'`. */\n labels?: 'inside' | 'outside' | false;\n /** Space between a label and the plot edge it sits against, in px.\n * Default 4. */\n gap?: number;\n /** Label text for a tick. Default {@link formatTick}. */\n format?: TickFormatter;\n}\n\n/** A pointer position given in both of the plot's coordinate systems. */\nexport interface Plot2DCoords {\n plot: Point;\n model: Point;\n}\n\n/** Props for {@link Plot2D}. */\nexport interface Plot2DProps {\n width: number;\n height: number;\n /** Model-space x range. Default [0, 1]. */\n xRange?: readonly [number, number];\n /** Model-space y range. Default [0, 1]. */\n yRange?: readonly [number, number];\n /** Background grid. `false` / `null` / omitted = no grid. Pass `{}`\n * for default (3 divisions per axis) or populated GridSettings. */\n grid?: GridSettings | false | null;\n /** Axis lines. `false` / `null` = no axes. Omitted = default-styled\n * axes (on). Pass AxesSettings to customize. */\n axes?: AxesSettings | false | null;\n /** Ticks at x values. `false` / `null` / omitted = none; `{}` = defaults. */\n xTicks?: TickSettings | false | null;\n /** Ticks at y values. `false` / `null` / omitted = none; `{}` = defaults. */\n yTicks?: TickSettings | false | null;\n /** Forwarded to the underlying svg. Consumer opts into focus this way. */\n tabIndex?: number;\n /** Default `'img'`. A plot holding focusable marks must not be an image,\n * whose children are presentational to assistive technology. */\n role?: string;\n 'aria-label'?: string;\n className?: string;\n style?: CSSProperties;\n /** Pointer down on the SVG. Receives both plot- and model-space coords\n * pre-computed so consumers don't repeat the rect/transform dance. */\n onPointerDown?: (e: ReactPointerEvent<SVGSVGElement>, coords: Plot2DCoords) => void;\n onKeyDown?: (e: ReactKeyboardEvent<SVGSVGElement>) => void;\n children?: ReactNode;\n}\n\n/**\n * Imperative handle on a {@link Plot2D}: the SVG element, its size, and the\n * coordinate conversions, including ones that start from a raw DOM event so a\n * drag tracked on `window` can still map back into the plot.\n */\nexport interface Plot2DHandle {\n readonly svg: SVGSVGElement | null;\n plotToModel(pt: Point): Point;\n modelToPlot(pt: Point): Point;\n /** Convert a DOM event's clientX/clientY (e.g. from a window-attached\n * pointermove during drag) to plot-space. */\n clientToPlot(e: { clientX: number; clientY: number }): Point;\n /** Convenience: clientToPlot → plotToModel. */\n clientToModel(e: { clientX: number; clientY: number }): Point;\n readonly width: number;\n readonly height: number;\n}\n\ntype Axis = 'x' | 'y';\n\nconst TICK_SPACING_PX: Record<Axis, number> = { x: 64, y: 24 };\nconst TICK_INSET_PX: Record<Axis, number> = { x: 16, y: 4 };\nconst LABEL_GAP_PX = 4;\n\ninterface ResolvedTick {\n value: number;\n /** Plot-space position along the axis. */\n at: number;\n label: string;\n}\n\nfunction resolveTicks(\n settings: TickSettings,\n axis: Axis,\n range: readonly [number, number],\n pixels: number,\n toPlot: (v: number) => number,\n): ResolvedTick[] {\n let values: number[];\n let ctx: TickFormatCtx;\n if (settings.values) {\n const lo = Math.min(range[0], range[1]);\n const hi = Math.max(range[0], range[1]);\n const eps = (hi - lo) * 1e-9;\n values = settings.values.filter((v) => v >= lo - eps && v <= hi + eps);\n const gaps = values.slice(1).map((v, i) => v - values[i]);\n const even = gaps.length > 0 && gaps.every((g) => Math.abs(g - gaps[0]) <= Math.abs(gaps[0]) * 1e-9);\n ctx = { decimals: tickDecimals(values), step: even ? gaps[0] : 0 };\n } else {\n const set = niceTicks(range, pixels, {\n minSpacing: settings.minSpacing ?? TICK_SPACING_PX[axis],\n inset: settings.inset ?? TICK_INSET_PX[axis],\n });\n values = set.values;\n ctx = { decimals: set.decimals, step: set.step };\n }\n const format = settings.format ?? formatTick;\n return values.map((value) => ({ value, at: toPlot(value), label: format(value, ctx) }));\n}\n\n/**\n * An SVG plotting surface with an optional grid, axes and ticks. It draws the\n * frame and owns the model-space to plot-space mapping; the plotted content is\n * whatever children are passed, positioned in plot space.\n */\nexport const Plot2D = forwardRef<Plot2DHandle, Plot2DProps>(function Plot2D(props, ref) {\n const {\n width, height,\n xRange = [0, 1],\n yRange = [0, 1],\n grid,\n axes,\n xTicks,\n yTicks,\n tabIndex,\n role = 'img',\n className,\n style,\n onPointerDown,\n onKeyDown,\n children,\n } = props;\n\n const svgRef = useRef<SVGSVGElement | null>(null);\n\n const modelRange: ModelRange = useMemo(\n () => ({ xMin: xRange[0], xMax: xRange[1], yMin: yRange[0], yMax: yRange[1] }),\n [xRange, yRange],\n );\n\n const plotSize = useMemo(() => ({ width, height }), [width, height]);\n\n const clientToPlot = useCallback((e: { clientX: number; clientY: number }): Point => {\n const rect = svgRef.current?.getBoundingClientRect();\n const left = rect?.left ?? 0;\n const top = rect?.top ?? 0;\n return { x: e.clientX - left, y: e.clientY - top };\n }, []);\n\n useEffect(() => {\n dlog('plot2d', 'mount', { width, height });\n return () => dlog('plot2d', 'unmount');\n // Mount/unmount trace: re-running on a resize would log a spurious mount.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n useImperativeHandle(ref, () => ({\n get svg() { return svgRef.current; },\n plotToModel: (pt: Point) => plotToModel(pt, modelRange, plotSize),\n modelToPlot: (pt: Point) => modelToPlot(pt, modelRange, plotSize),\n clientToPlot,\n clientToModel: (e) => plotToModel(clientToPlot(e), modelRange, plotSize),\n get width() { return plotSize.width; },\n get height() { return plotSize.height; },\n }), [modelRange, plotSize, clientToPlot]);\n\n const handlePointerDown = useCallback((e: ReactPointerEvent<SVGSVGElement>) => {\n if (!onPointerDown) return;\n const plot = clientToPlot(e);\n const model = plotToModel(plot, modelRange, plotSize);\n onPointerDown(e, { plot, model });\n }, [onPointerDown, clientToPlot, modelRange, plotSize]);\n\n const xTickList = xTicks\n ? resolveTicks(xTicks, 'x', xRange, width, (v) => modelToPlot({ x: v, y: yRange[0] }, modelRange, plotSize).x)\n : [];\n const yTickList = yTicks\n ? resolveTicks(yTicks, 'y', yRange, height, (v) => modelToPlot({ x: xRange[0], y: v }, modelRange, plotSize).y)\n : [];\n\n // An inside y column is right-aligned against its widest label, which only\n // the rendered text can say.\n const yInside = !!yTicks && (yTicks.labels ?? 'inside') === 'inside';\n const yLabelsRef = useRef<SVGGElement | null>(null);\n const [yLabelWidth, setYLabelWidth] = useState(0);\n const yLabelKey = yInside ? yTickList.map((t) => t.label).join('\\n') : '';\n useLayoutEffect(() => {\n if (!yInside) return;\n const measure = (): void => {\n let widest = 0;\n for (const el of yLabelsRef.current?.querySelectorAll('text') ?? []) {\n if (typeof el.getComputedTextLength === 'function') widest = Math.max(widest, el.getComputedTextLength());\n }\n setYLabelWidth((prev) => (prev === widest ? prev : widest));\n };\n measure();\n let live = true;\n // A web font landing after the first measure changes every width.\n document.fonts?.ready.then(() => { if (live) measure(); });\n return () => { live = false; };\n }, [yInside, yLabelKey]);\n\n const cls = [s.root, className].filter(Boolean).join(' ');\n\n const renderTickLines = (axis: Axis, list: ResolvedTick[], settings: TickSettings | false | null | undefined) => {\n if (!settings || settings.lines === false || list.length === 0) return null;\n return (\n <g>\n {list.map((t) => (\n <line\n key={`t${axis}-${t.value}`}\n data-plot-element=\"tick\"\n data-axis={axis}\n className={s.tick}\n {...(axis === 'x'\n ? { x1: t.at, x2: t.at, y1: 0, y2: height }\n : { x1: 0, x2: width, y1: t.at, y2: t.at })}\n />\n ))}\n </g>\n );\n };\n\n const renderTickLabels = (axis: Axis, list: ResolvedTick[], settings: TickSettings | false | null | undefined) => {\n if (!settings || list.length === 0) return null;\n const placement = settings.labels ?? 'inside';\n if (placement === false) return null;\n const outside = placement === 'outside';\n const gap = settings.gap ?? LABEL_GAP_PX;\n let place: { x?: number; y?: number; textAnchor: 'start' | 'middle' | 'end'; dominantBaseline?: 'central' | 'hanging' };\n if (axis === 'y') {\n place = outside\n ? { x: -gap, textAnchor: 'end', dominantBaseline: 'central' }\n : yLabelWidth > 0\n ? { x: gap + yLabelWidth, textAnchor: 'end', dominantBaseline: 'central' }\n : { x: gap, textAnchor: 'start', dominantBaseline: 'central' };\n } else {\n place = outside\n ? { y: height + gap, textAnchor: 'middle', dominantBaseline: 'hanging' }\n : { y: height - gap, textAnchor: 'middle' };\n }\n return (\n <g ref={axis === 'y' ? yLabelsRef : undefined} className={s.tickLabels} aria-hidden=\"true\">\n {list.map((t) => (\n <text\n key={`l${axis}-${t.value}`}\n data-plot-element=\"tick-label\"\n data-axis={axis}\n data-placement={placement}\n className={s.tickLabel}\n x={axis === 'x' ? t.at : place.x}\n y={axis === 'y' ? t.at : place.y}\n textAnchor={place.textAnchor}\n dominantBaseline={place.dominantBaseline}\n >\n {t.label}\n </text>\n ))}\n </g>\n );\n };\n\n return (\n <svg\n ref={svgRef}\n className={cls}\n style={style}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n role={role}\n aria-label={props['aria-label']}\n tabIndex={tabIndex}\n onPointerDown={onPointerDown ? handlePointerDown : undefined}\n onKeyDown={onKeyDown}\n >\n {grid && (() => {\n const divisions = grid.divisions ?? 3;\n const stroke = grid.color;\n // Evenly-spaced internal divisions, excluding the edges (which\n // belong to the axes). For divisions=3, fractions are 1/4, 2/4, 3/4.\n const fractions: number[] = [];\n for (let i = 1; i <= divisions; i++) fractions.push(i / (divisions + 1));\n return (\n <g>\n {fractions.map((f) => (\n <line\n key={`gx-${f}`}\n data-plot-element=\"grid\"\n className={s.grid}\n stroke={stroke}\n x1={f * width} x2={f * width}\n y1={0} y2={height}\n />\n ))}\n {fractions.map((f) => (\n <line\n key={`gy-${f}`}\n data-plot-element=\"grid\"\n className={s.grid}\n stroke={stroke}\n x1={0} x2={width}\n y1={f * height} y2={f * height}\n />\n ))}\n </g>\n );\n })()}\n {renderTickLines('x', xTickList, xTicks)}\n {renderTickLines('y', yTickList, yTicks)}\n {axes !== false && axes !== null && (() => {\n const stroke = axes?.color;\n return (\n <g>\n <line\n data-plot-element=\"axis\"\n className={s.axis}\n stroke={stroke}\n x1={0} x2={width}\n y1={height} y2={height}\n />\n <line\n data-plot-element=\"axis\"\n className={s.axis}\n stroke={stroke}\n x1={0} x2={0}\n y1={0} y2={height}\n />\n </g>\n );\n })()}\n {renderTickLabels('x', xTickList, xTicks)}\n {renderTickLabels('y', yTickList, yTicks)}\n {children}\n </svg>\n );\n});\n","/** How close, in screen pixels, a drag has to come to a candidate to snap to it. */\nexport const SNAP_RADIUS_PX = 6;\n\n/** Snap `value` to the nearest candidate within `tolerance`, else return it. */\nexport function snapToNearest(value: number, candidates: readonly number[], tolerance: number): number {\n let best = value;\n let bestDist = tolerance;\n for (const c of candidates) {\n const d = Math.abs(c - value);\n if (d <= bestDist) {\n best = c;\n bestDist = d;\n }\n }\n return best;\n}\n","/**\n * Curve-specific hit tests. Generic coord transforms live in\n * `../Plot2D/geometry`; what's here is curve-only (anchor / polyline\n * proximity).\n */\nimport type { Point } from '../Plot2D/geometry';\n\n/**\n * Nearest-anchor hit test. Anchors are already in plot/screen coords.\n * Returns the index of the nearest anchor whose squared distance to\n * the pointer is ≤ radius². Null if no anchor is within radius.\n */\nexport function hitTestAnchor(\n anchors: readonly Point[],\n pointer: Point,\n radius: number,\n): { index: number } | null {\n const r2 = radius * radius;\n let best: { index: number; d2: number } | null = null;\n for (let i = 0; i < anchors.length; i++) {\n const a = anchors[i];\n const dx = a.x - pointer.x;\n const dy = a.y - pointer.y;\n const d2 = dx * dx + dy * dy;\n if (d2 > r2) continue;\n if (best === null || d2 < best.d2) best = { index: i, d2 };\n }\n return best ? { index: best.index } : null;\n}\n\n/**\n * Hit test against a per-segment sampled polyline. Each entry in\n * `segments` is the sample list for one segment (inclusive of\n * endpoints). Returns segment index + t (∈ [0, 1]) of the closest\n * point on the polyline within radius. Null if nothing is in range.\n *\n * Distance is measured to the line-segment chords between adjacent\n * samples, not just to the samples themselves — so sparse sampling\n * still produces accurate hits along the chord.\n */\nexport function hitTestCurve(\n segments: readonly (readonly Point[])[],\n pointer: Point,\n radius: number,\n): { segIdx: number; t: number } | null {\n const r2 = radius * radius;\n let best: { segIdx: number; t: number; d2: number } | null = null;\n for (let segIdx = 0; segIdx < segments.length; segIdx++) {\n const samples = segments[segIdx];\n if (samples.length < 2) continue;\n const last = samples.length - 1;\n for (let i = 0; i < last; i++) {\n const a = samples[i];\n const b = samples[i + 1];\n const abx = b.x - a.x;\n const aby = b.y - a.y;\n const apx = pointer.x - a.x;\n const apy = pointer.y - a.y;\n const ab2 = abx * abx + aby * aby;\n let u = ab2 > 0 ? (apx * abx + apy * aby) / ab2 : 0;\n if (u < 0) u = 0;\n else if (u > 1) u = 1;\n const cx = a.x + u * abx;\n const cy = a.y + u * aby;\n const dx = cx - pointer.x;\n const dy = cy - pointer.y;\n const d2 = dx * dx + dy * dy;\n if (d2 > r2) continue;\n const t = (i + u) / last;\n if (best === null || d2 < best.d2) best = { segIdx, t, d2 };\n }\n }\n return best ? { segIdx: best.segIdx, t: best.t } : null;\n}\n","import { tokenPx } from '@weasel-js/theme';\nimport type { ResolvedTheme } from '@weasel-js/theme';\n\n/**\n * The handle sizes the theme publishes: the default rank, the inert one a\n * locked or pinned point wears, and the emphasized one for a handle that is\n * its own category.\n */\nexport const HANDLE_SIZE_TOKENS = [\n '--wzl-handle-size', '--wzl-handle-size-sm', '--wzl-handle-size-lg',\n] as const;\n\n/** One of {@link HANDLE_SIZE_TOKENS}. */\nexport type HandleSizeToken = (typeof HANDLE_SIZE_TOKENS)[number];\n\n/**\n * A handle's edge in px, for code that draws a handle instead of styling one.\n *\n * CSS reaches `--wzl-handle-*` directly; SVG geometry attributes and canvas\n * cannot, so they come through here and the number stays written once, in the\n * theme definition.\n */\nexport function handleSize(token: HandleSizeToken, resolved?: ResolvedTheme): number {\n return tokenPx(token, resolved);\n}\n\n/** Half a handle's edge — what an SVG rect centered on a point offsets by. */\nexport function handleHalf(token: HandleSizeToken, resolved?: ResolvedTheme): number {\n return handleSize(token, resolved) / 2;\n}\n","import {\n useCallback, useEffect, useMemo, useRef, useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from 'react';\nimport { openPointerSession, type PointerSession } from '@weasel-js/core';\nimport {\n Plot2D,\n type Plot2DHandle,\n type GridSettings,\n type AxesSettings,\n type TickSettings,\n} from '../Plot2D';\nimport {\n modelToPlot, plotToModel,\n type ModelRange,\n} from '../Plot2D/geometry';\nimport { dlog } from '../../dlog';\nimport s from './CurveEditor.module.css';\nimport type {\n CurveLayer, LayerCtx, LayerGesture, LayerModifiers, ModelPoint, PlotPoint,\n} from './layerTypes';\n\n/**\n * A layer paired with the state the consumer holds for it. The editor never\n * stores layer state itself.\n */\nexport interface LayerBinding<S = unknown> {\n layer: CurveLayer<S>;\n state: S;\n}\n\n/** Props for {@link LayeredCurveEditor}. */\nexport interface LayeredCurveEditorProps {\n /** Bottom-to-top render order: `layers[0]` paints first, `layers[N-1]`\n * paints on top. Hit-testing runs in reverse (topmost claim wins). */\n layers: ReadonlyArray<LayerBinding<unknown>>;\n\n /** Fires every frame during a gesture with the live in-flight state\n * for the layer that owns the gesture. */\n onLayerChange(id: string, next: unknown): void;\n\n /** Fires once per discrete user action (drag-end, one-shot insert,\n * delete) for the layer that produced the change. `prev` is the\n * layer's state at gesture start. */\n onLayerCommit?(id: string, next: unknown, prev: unknown): void;\n\n width: number;\n height: number;\n /** Model-space x range. Default [0, 1]. */\n xRange?: readonly [number, number];\n /** Model-space y range. Default [0, 1]. */\n yRange?: readonly [number, number];\n grid?: GridSettings | false | null;\n axes?: AxesSettings | false | null;\n /** Ticks at x values. See `Plot2D.xTicks`. */\n xTicks?: TickSettings | false | null;\n /** Ticks at y values. See `Plot2D.yTicks`. */\n yTicks?: TickSettings | false | null;\n\n /** Built-in undo/redo via Cmd/Ctrl+Z (Shift+Z or Y for redo) on the\n * focused SVG. Snapshots every layer's state on each commit; undo\n * fires `onLayerChange(id, prevState)` for each layer whose state\n * changed. Default `true`. */\n history?: boolean;\n\n /** Accessible name for the plot, which is exposed as a group so the\n * focusable marks layers render inside it stay reachable. */\n 'aria-label'?: string;\n className?: string;\n style?: CSSProperties;\n\n /** Extra SVG content rendered behind all layers (under the lowest\n * layer but above grid/axes). Use this for static chrome that isn't\n * worth modeling as a layer. */\n children?: ReactNode;\n}\n\ninterface ActiveGesture {\n layerId: string;\n gesture: LayerGesture<unknown>;\n startStates: Map<string, unknown>;\n startSelfState: unknown;\n}\n\n/** A cancel carries no event, so a layer's `onCancel` sees no modifiers held. */\nconst NO_MODIFIERS: LayerModifiers = { shift: false, alt: false, meta: false, ctrl: false };\n\nfunction readModifiers(e: PointerEvent | ReactPointerEvent | KeyboardEvent | ReactKeyboardEvent): LayerModifiers {\n return {\n shift: e.shiftKey,\n alt: e.altKey,\n meta: e.metaKey,\n ctrl: e.ctrlKey,\n };\n}\n\n/**\n * A `Plot2D` that hosts a stack of composable curve layers. It owns the\n * pointer gestures and the coordinate mapping; each layer supplies its own\n * drawing, hit testing and gesture behavior.\n *\n * Layer state stays with the consumer: the editor reports changes through\n * `onLayerChange` during a gesture and `onLayerCommit` at its end, and reads\n * the state back from props each frame. That is what lets one layer's drag\n * update another layer's state mid-gesture.\n */\nexport function LayeredCurveEditor(props: LayeredCurveEditorProps) {\n const {\n layers, onLayerChange, onLayerCommit,\n width, height,\n xRange = [0, 1], yRange = [0, 1],\n grid, axes, xTicks, yTicks,\n className, style, children,\n } = props;\n\n const historyEnabled = props.history !== false;\n\n const modelRange: ModelRange = useMemo(\n () => ({ xMin: xRange[0], xMax: xRange[1], yMin: yRange[0], yMax: yRange[1] }),\n [xRange, yRange],\n );\n const plotSize = useMemo(() => ({ width, height }), [width, height]);\n\n // Refs that always hold the latest props — gesture handlers and\n // window listeners close over these refs, never over render-time\n // values, so mid-drag re-renders (including cross-layer state\n // updates) are visible to the next pointermove tick.\n const layersRef = useRef(layers);\n layersRef.current = layers;\n const modelRangeRef = useRef(modelRange);\n modelRangeRef.current = modelRange;\n const plotSizeRef = useRef(plotSize);\n plotSizeRef.current = plotSize;\n\n const plotRef = useRef<Plot2DHandle | null>(null);\n\n // ── Coord helpers ──────────────────────────────────────────────────\n const makeCtx = useCallback((modifiers: LayerModifiers): LayerCtx => {\n const mr = modelRangeRef.current;\n const ps = plotSizeRef.current;\n return {\n modelRange: mr,\n plotSize: ps,\n toPlot: (p) => modelToPlot(p, mr, ps),\n toModel: (p) => plotToModel(p, mr, ps),\n modifiers,\n };\n }, []);\n\n // ── Gesture routing ────────────────────────────────────────────────\n const activeRef = useRef(null as ActiveGesture | null);\n const [activeLayerId, setActiveLayerId] = useState<string | null>(null);\n\n // ── History (whole-state snapshots) ────────────────────────────────\n const pastRef = useRef<Map<string, unknown>[]>([]);\n const futureRef = useRef<Map<string, unknown>[]>([]);\n\n const snapshot = useCallback((): Map<string, unknown> => {\n const m = new Map<string, unknown>();\n for (const b of layersRef.current) m.set(b.layer.id, b.state);\n return m;\n }, []);\n\n const restore = useCallback((snap: Map<string, unknown>) => {\n const current = layersRef.current;\n for (const b of current) {\n const prev = snap.get(b.layer.id);\n if (prev !== undefined && prev !== b.state) {\n onLayerChange(b.layer.id, prev);\n }\n }\n }, [onLayerChange]);\n\n const undo = useCallback(() => {\n if (!historyEnabled) return;\n const past = pastRef.current;\n if (past.length === 0) return;\n const prev = past.pop()!;\n futureRef.current.push(snapshot());\n restore(prev);\n }, [historyEnabled, snapshot, restore]);\n\n const redo = useCallback(() => {\n if (!historyEnabled) return;\n const future = futureRef.current;\n if (future.length === 0) return;\n const next = future.pop()!;\n pastRef.current.push(snapshot());\n restore(next);\n }, [historyEnabled, snapshot, restore]);\n\n // ── Pointer routing during an active gesture ───────────────────────\n // The session's callbacks are fixed at gesture start, so they delegate\n // through refs holding the latest per-render impl — a mid-drag re-render\n // must reach the next pointermove tick.\n const onGestureMoveRef = useRef<(e: PointerEvent) => void>(() => {});\n const onGestureEndRef = useRef<(e: PointerEvent) => void>(() => {});\n const onGestureCancelRef = useRef<() => void>(() => {});\n\n const sessionRef = useRef<PointerSession | null>(null);\n\n const cleanupGesture = useCallback(() => {\n sessionRef.current = null;\n activeRef.current = null;\n setActiveLayerId(null);\n }, []);\n\n const findLayerState = useCallback((id: string): unknown | undefined => {\n for (const b of layersRef.current) if (b.layer.id === id) return b.state;\n return undefined;\n }, []);\n\n onGestureMoveRef.current = (e: PointerEvent) => {\n const a = activeRef.current;\n if (!a) return;\n const h = plotRef.current;\n if (!h) return;\n const model = h.clientToModel(e);\n const current = findLayerState(a.layerId);\n if (current === undefined) return;\n const ctx = makeCtx(readModifiers(e));\n const next = a.gesture.onMove(current, model, e, ctx);\n if (next !== current) onLayerChange(a.layerId, next);\n };\n\n onGestureEndRef.current = (e: PointerEvent) => {\n const a = activeRef.current;\n if (!a) return;\n const current = findLayerState(a.layerId);\n if (current === undefined) { cleanupGesture(); return; }\n const ctx = makeCtx(readModifiers(e));\n const finalState = a.gesture.onCommit ? a.gesture.onCommit(current, ctx) : current;\n if (finalState !== current) onLayerChange(a.layerId, finalState);\n if (historyEnabled) {\n pastRef.current.push(a.startStates);\n futureRef.current = [];\n }\n if (onLayerCommit) onLayerCommit(a.layerId, finalState, a.startSelfState);\n cleanupGesture();\n };\n\n onGestureCancelRef.current = () => {\n const a = activeRef.current;\n if (!a) return;\n const current = findLayerState(a.layerId);\n if (current === undefined) { cleanupGesture(); return; }\n const ctx = makeCtx(NO_MODIFIERS);\n const restored = a.gesture.onCancel ? a.gesture.onCancel(current, ctx) : a.startSelfState;\n if (restored !== current) onLayerChange(a.layerId, restored);\n cleanupGesture();\n };\n\n // No pointer capture: consumers render their own SVG chrome into the plot\n // through `children`, and capture would retarget pointerup away from it.\n const installGesture = useCallback((\n layerId: string,\n down: ReactPointerEvent<SVGSVGElement>,\n gesture: LayerGesture<unknown>,\n ) => {\n const startStates = snapshot();\n const startSelfState = startStates.get(layerId);\n activeRef.current = {\n layerId, gesture,\n startStates,\n startSelfState,\n };\n setActiveLayerId(layerId);\n sessionRef.current = openPointerSession(down.currentTarget, down, {\n onMove: (e) => onGestureMoveRef.current(e),\n onEnd: (e) => onGestureEndRef.current(e),\n onCancel: () => onGestureCancelRef.current(),\n }, { capture: false });\n }, [snapshot]);\n\n // ── pointerdown dispatch ───────────────────────────────────────────\n const onSvgPointerDown = useCallback((\n e: ReactPointerEvent<SVGSVGElement>,\n coords: { plot: PlotPoint; model: ModelPoint },\n ) => {\n if (activeRef.current) return; // ignore secondary touches mid-gesture\n const modifiers = readModifiers(e);\n const ctx = makeCtx(modifiers);\n const ls = layersRef.current;\n const nativeEvent = e.nativeEvent;\n\n dlog('layered-curve-editor', 'pointerdown', { plot: coords.plot, model: coords.model, layers: ls.length });\n\n // Capture the pre-event snapshot once; reuse for history if any\n // path produces a commit (gesture-start commit or one-shot).\n const preEventSnapshot = snapshot();\n\n // Top-to-bottom hit test.\n for (let i = ls.length - 1; i >= 0; i--) {\n const b = ls[i];\n const hit = b.layer.hitTest?.(b.state, coords.plot, ctx);\n if (!hit) continue;\n // Found a claim. onPointerDown may start a gesture, absorb the\n // click, or commit a one-shot edit via extra.commit.\n const prevState = b.state;\n let committed: unknown = undefined;\n const gesture = b.layer.onPointerDown?.(\n prevState, hit, nativeEvent, ctx,\n {\n plot: coords.plot,\n model: coords.model,\n commit(next) { committed = next; onLayerChange(b.layer.id, next); },\n },\n );\n e.stopPropagation();\n if (gesture) {\n installGesture(b.layer.id, e, gesture);\n return;\n }\n if (committed !== undefined) {\n if (historyEnabled) {\n pastRef.current.push(preEventSnapshot);\n futureRef.current = [];\n }\n onLayerCommit?.(b.layer.id, committed, prevState);\n }\n return;\n }\n\n // No hit — empty space dispatch, top-to-bottom.\n let pendingCommit: { id: string; next: unknown; prev: unknown } | null = null;\n for (let i = ls.length - 1; i >= 0; i--) {\n const b = ls[i];\n if (!b.layer.onEmptyPointerDown) continue;\n const prevState = b.state;\n let committed: unknown = undefined;\n const gesture = b.layer.onEmptyPointerDown(\n prevState, coords.model, nativeEvent, ctx,\n {\n plot: coords.plot,\n model: coords.model,\n commit(next) {\n committed = next;\n onLayerChange(b.layer.id, next);\n },\n },\n );\n if (gesture) {\n // If onEmptyPointerDown also published a commit (e.g. click-curve\n // insert publishes the new point then drags it), the gesture's\n // startStates already capture the post-insert state; the commit\n // for history is the *pre*-event snapshot, written when the\n // gesture eventually finishes via the gesture-commit path. We\n // override the gesture's startStates so undo restores correctly.\n installGesture(b.layer.id, e, gesture);\n if (committed !== undefined && activeRef.current !== null) {\n (activeRef.current as ActiveGesture).startStates = preEventSnapshot;\n (activeRef.current as ActiveGesture).startSelfState = preEventSnapshot.get(b.layer.id);\n }\n return;\n }\n if (committed !== undefined) {\n pendingCommit = { id: b.layer.id, next: committed, prev: prevState };\n break;\n }\n }\n if (pendingCommit) {\n if (historyEnabled) {\n pastRef.current.push(preEventSnapshot);\n futureRef.current = [];\n }\n onLayerCommit?.(pendingCommit.id, pendingCommit.next, pendingCommit.prev);\n }\n }, [makeCtx, installGesture, onLayerChange, onLayerCommit, historyEnabled, snapshot]);\n\n // ── keyboard ───────────────────────────────────────────────────────\n const onSvgKeyDown = useCallback((e: ReactKeyboardEvent<SVGSVGElement>) => {\n const modifiers = readModifiers(e);\n const ctx = makeCtx(modifiers);\n const ls = layersRef.current;\n // History first.\n if (historyEnabled && (e.metaKey || e.ctrlKey)) {\n const k = e.key.toLowerCase();\n if (k === 'z') {\n if (e.shiftKey) redo();\n else undo();\n e.preventDefault();\n return;\n }\n if (k === 'y') { redo(); e.preventDefault(); return; }\n }\n // Then layers (top-to-bottom).\n for (let i = ls.length - 1; i >= 0; i--) {\n const b = ls[i];\n if (!b.layer.onKeyDown) continue;\n const preEventSnapshot = snapshot();\n let committed: unknown = undefined;\n b.layer.onKeyDown(b.state, e.nativeEvent, ctx, {\n commit(next) { committed = next; onLayerChange(b.layer.id, next); },\n });\n if (committed !== undefined) {\n if (historyEnabled) {\n pastRef.current.push(preEventSnapshot);\n futureRef.current = [];\n }\n onLayerCommit?.(b.layer.id, committed, b.state);\n }\n // The layer prevents default on the native event, which the synthetic\n // event's `isDefaultPrevented` does not observe.\n if (e.nativeEvent.defaultPrevented) return;\n }\n }, [historyEnabled, undo, redo, makeCtx, snapshot, onLayerChange, onLayerCommit]);\n\n useEffect(() => () => { sessionRef.current?.cancel(); }, []);\n\n // ── render ─────────────────────────────────────────────────────────\n const renderCtxBase: Omit<LayerCtx, 'modifiers'> = useMemo(() => ({\n modelRange,\n plotSize,\n toPlot: (p) => modelToPlot(p, modelRange, plotSize),\n toModel: (p) => plotToModel(p, modelRange, plotSize),\n }), [modelRange, plotSize]);\n\n const cls = [s.root, className].filter(Boolean).join(' ');\n\n return (\n <Plot2D\n ref={plotRef}\n className={cls}\n style={style}\n width={width}\n height={height}\n xRange={xRange}\n yRange={yRange}\n grid={grid}\n axes={axes}\n xTicks={xTicks}\n yTicks={yTicks}\n tabIndex={historyEnabled ? 0 : undefined}\n role=\"group\"\n aria-label={props['aria-label']}\n onPointerDown={onSvgPointerDown}\n onKeyDown={onSvgKeyDown}\n >\n {children}\n {layers.map((b) => {\n const ctx = {\n ...renderCtxBase,\n modifiers: { shift: false, alt: false, meta: false, ctrl: false },\n isActive: activeLayerId === b.layer.id,\n };\n return (\n <g key={b.layer.id} data-layer-id={b.layer.id}>\n {b.layer.render(b.state, ctx)}\n </g>\n );\n })}\n </Plot2D>\n );\n}\n","/**\n * Keyframe layer for LayeredCurveEditor: a value-over-time curve whose shape\n * between two keys is the easing on the later one, with draggable keys and\n * draggable cubic-bezier handles on the selected segment.\n *\n * Distinct from `createFunctionLayer`, which interpolates a spline through\n * its anchors. Here the keys are exact and the easing approximates between\n * them, so the two do not share curve maths.\n */\nimport type { ReactNode } from 'react';\nimport { cubicBezierEasing, resolveEasing, type EasingFn, type Keyframe } from '@weasel-js/core';\nimport { hitTestAnchor, hitTestCurve } from './hitTest';\nimport { handleHalf } from '../../handles';\nimport { SNAP_RADIUS_PX, snapToNearest } from '../../snap';\nimport s from './CurveEditor.module.css';\nimport type {\n CurveLayer, EmptyDownArgs, KeyDownArgs, LayerCtx, LayerGesture, LayerHit, LayerRenderCtx, PlotPoint,\n} from './layerTypes';\n\ntype Bezier = readonly [number, number, number, number];\n\n/** A gesture in flight. The committed keys hold still underneath it. */\nexport type KeyframeDrag =\n | { kind: 'key'; index: number; t: number; value: number }\n | { kind: 'handle'; segment: number; bezier: Bezier };\n\n/**\n * The state a keyframe layer owns, held by the consumer and round-tripped\n * through `LayeredCurveEditor`'s `onLayerChange`.\n */\nexport interface KeyframeLayerState {\n /** Sorted ascending by `t`. */\n keys: readonly Keyframe<number>[];\n selectedKey: number | null;\n /** Index of the key the selected segment runs into. Its bezier handles show. */\n selectedSegment: number | null;\n drag: KeyframeDrag | null;\n}\n\n/** Configuration for {@link createKeyframeLayer}. */\nexport interface KeyframeLayerConfig {\n /** Layer id; default `'keyframes'`. */\n id?: string;\n /** Names the curve in each mark's accessible name. Default `'Curve'`. */\n label?: string;\n /** Formats a key time for accessible names. Default: rounded number. */\n formatX?: (x: number) => string;\n /** Times a dragged key snaps to. Holding alt defeats the snap. */\n snapX?: readonly number[];\n /** Snap reach, in plot pixels. Default 6. */\n snapRadiusPx?: number;\n /** Bounds for a key's time. Default: unbounded. */\n xClamp?: readonly [number, number];\n /** Bounds for a key's value. Default: unbounded. */\n yClamp?: readonly [number, number];\n /** One arrow-key step in model units; shift takes ten. Default: 1% of the\n * plot's range on that axis. */\n step?: { x?: number; y?: number };\n}\n\nconst SAMPLES_PER_SEGMENT = 16;\nconst KEY_HIT_PX = 8;\nconst HANDLE_HIT_PX = 8;\nconst CURVE_HIT_PX = 6;\nconst KEY_HALF = handleHalf('--wzl-handle-size');\nconst HANDLE_RADIUS = 3.5;\nconst SHIFT_MULTIPLIER = 10;\nconst HANDLE_STEP = 0.01;\n\n/** A keyframe layer state with nothing selected and no gesture in flight. */\nexport function keyframeLayerState(keys: readonly Keyframe<number>[]): KeyframeLayerState {\n return { keys, selectedKey: null, selectedSegment: null, drag: null };\n}\n\nfunction clampTo(v: number, range?: readonly [number, number]): number {\n return range ? Math.min(range[1], Math.max(range[0], v)) : v;\n}\n\nfunction bezierOf(key: Keyframe<number> | undefined): Bezier | null {\n const e = key?.easing;\n return typeof e === 'object' && e !== null && 'bezier' in e ? e.bezier : null;\n}\n\nfunction moveKeyTo(\n keys: readonly Keyframe<number>[], index: number, t: number, value: number,\n): { keys: Keyframe<number>[]; selectedKey: number } {\n const moved = { ...keys[index], t, value };\n const rest = keys.filter((_, i) => i !== index);\n const at = rest.findIndex((k) => k.t > t);\n const selectedKey = at === -1 ? rest.length : at;\n rest.splice(selectedKey, 0, moved);\n return { keys: rest, selectedKey };\n}\n\n/**\n * The keys a state's drag would leave behind: a dragged key re-sorted into\n * place, or a dragged handle's control points written onto the key its\n * segment runs into. `selectedKey` follows a moved key to its new index; a\n * key dropped where it started returns the same `keys` array.\n */\nexport function applyKeyframeDrag(\n state: KeyframeLayerState,\n): { keys: readonly Keyframe<number>[]; selectedKey: number | null } {\n const { drag, keys } = state;\n if (!drag) return { keys, selectedKey: state.selectedKey };\n if (drag.kind === 'key') {\n const k = keys[drag.index];\n if (k && k.t === drag.t && k.value === drag.value) return { keys, selectedKey: drag.index };\n return moveKeyTo(keys, drag.index, drag.t, drag.value);\n }\n const next = keys.slice();\n next[drag.segment] = { ...keys[drag.segment], easing: { bezier: drag.bezier } };\n return { keys: next, selectedKey: state.selectedKey };\n}\n\n/**\n * Builds a keyframe layer for `LayeredCurveEditor`. Model x is time and model\n * y is value; each segment is drawn through the easing on the key it runs\n * into. Every key, segment and handle is focusable and named, and the arrow\n * keys move whichever one has focus.\n */\nexport function createKeyframeLayer(cfg: KeyframeLayerConfig = {}): CurveLayer<KeyframeLayerState> {\n const id = cfg.id ?? 'keyframes';\n const label = cfg.label ?? 'Curve';\n const formatX = cfg.formatX ?? ((x: number) => String(Math.round(x)));\n const snapRadiusPx = cfg.snapRadiusPx ?? SNAP_RADIUS_PX;\n\n // A live handle drag is previewed straight from its control points: a\n // fresh spec per pointermove through `resolveEasing` would leave one\n // permanent cache entry per pixel of drag.\n function easingInto(state: KeyframeLayerState, keys: readonly Keyframe<number>[], seg: number): EasingFn {\n const d = state.drag;\n if (d?.kind === 'handle' && d.segment === seg) return cubicBezierEasing(...d.bezier);\n return resolveEasing(keys[seg].easing);\n }\n\n function segmentSamples(state: KeyframeLayerState, keys: readonly Keyframe<number>[], ctx: LayerCtx): PlotPoint[][] {\n const out: PlotPoint[][] = [];\n for (let i = 1; i < keys.length; i++) {\n const a = keys[i - 1];\n const b = keys[i];\n const ease = easingInto(state, keys, i);\n const pts: PlotPoint[] = [];\n for (let j = 0; j <= SAMPLES_PER_SEGMENT; j++) {\n const u = j / SAMPLES_PER_SEGMENT;\n pts.push(ctx.toPlot({ x: a.t + (b.t - a.t) * u, y: a.value + (b.value - a.value) * ease(u) }));\n }\n out.push(pts);\n }\n return out;\n }\n\n function activeBezier(state: KeyframeLayerState): Bezier | null {\n const seg = state.selectedSegment;\n if (seg === null || seg < 1 || seg >= state.keys.length) return null;\n const d = state.drag;\n if (d?.kind === 'handle' && d.segment === seg) return d.bezier;\n return bezierOf(state.keys[seg]);\n }\n\n function handlePoints(state: KeyframeLayerState, bezier: Bezier, ctx: LayerCtx): [PlotPoint, PlotPoint] {\n const a = state.keys[state.selectedSegment! - 1];\n const b = state.keys[state.selectedSegment!];\n const at = (xf: number, yf: number) =>\n ctx.toPlot({ x: a.t + xf * (b.t - a.t), y: a.value + yf * (b.value - a.value) });\n return [at(bezier[0], bezier[1]), at(bezier[2], bezier[3])];\n }\n\n const path = (pts: readonly PlotPoint[]): string =>\n pts.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(2)},${p.y.toFixed(2)}`).join('');\n\n // ── render ──────────────────────────────────────────────────────────\n function render(state: KeyframeLayerState, ctx: LayerRenderCtx): ReactNode {\n const shown = state.drag?.kind === 'key' ? applyKeyframeDrag(state).keys : state.keys;\n const segments = segmentSamples(state, shown, ctx);\n const curve = segments.flatMap((pts, i) => (i === 0 ? pts : pts.slice(1)));\n const seg = state.selectedSegment;\n const bezier = activeBezier(state);\n const dragIndex = state.drag?.kind === 'key' ? state.drag.index : null;\n\n return (\n <>\n {seg !== null && seg >= 1 && seg < shown.length ? (() => {\n const x0 = ctx.toPlot({ x: shown[seg - 1].t, y: 0 }).x;\n const x1 = ctx.toPlot({ x: shown[seg].t, y: 0 }).x;\n return (\n <rect\n className={s.segmentBand}\n x={Math.min(x0, x1)}\n y={0}\n width={Math.abs(x1 - x0)}\n height={ctx.plotSize.height}\n />\n );\n })() : null}\n {curve.length > 1 ? <path data-curve-element=\"curve\" className={s.curve} d={path(curve)} /> : null}\n {segments.map((pts, i) => (\n <path\n key={`seg-${i + 1}`}\n className={s.segmentTarget}\n d={path(pts)}\n role=\"button\"\n tabIndex={0}\n aria-label={`${label} segment into ${formatX(shown[i + 1].t)}`}\n aria-current={seg === i + 1 ? 'true' : undefined}\n data-segment-index={i + 1}\n />\n ))}\n {bezier ? (() => {\n const [h1, h2] = handlePoints(state, bezier, ctx);\n const a = ctx.toPlot({ x: state.keys[seg! - 1].t, y: state.keys[seg! - 1].value });\n const b = ctx.toPlot({ x: state.keys[seg!].t, y: state.keys[seg!].value });\n return (\n <>\n <line className={s.handleStem} x1={a.x} y1={a.y} x2={h1.x} y2={h1.y} />\n <line className={s.handleStem} x1={b.x} y1={b.y} x2={h2.x} y2={h2.y} />\n {[h1, h2].map((h, i) => (\n <circle\n key={`handle-${i}`}\n className={s.handle}\n cx={h.x}\n cy={h.y}\n r={HANDLE_RADIUS}\n role=\"button\"\n tabIndex={0}\n aria-label={`${label} bezier handle ${i + 1}`}\n data-handle-index={i}\n />\n ))}\n </>\n );\n })() : null}\n {state.keys.map((k, i) => {\n const p = ctx.toPlot({ x: k.t, y: k.value });\n return (\n <rect\n key={`key-${i}`}\n className={s.keyframe}\n x={p.x - KEY_HALF}\n y={p.y - KEY_HALF}\n width={KEY_HALF * 2}\n height={KEY_HALF * 2}\n transform={`rotate(45 ${p.x} ${p.y})`}\n role=\"button\"\n tabIndex={0}\n aria-label={`${label} key at ${formatX(k.t)}`}\n aria-current={state.selectedKey === i ? 'true' : undefined}\n data-keyframe-index={i}\n data-dragging={dragIndex === i ? 'true' : undefined}\n />\n );\n })}\n {state.drag?.kind === 'key' ? (() => {\n const p = ctx.toPlot({ x: state.drag.t, y: state.drag.value });\n return (\n <rect\n aria-hidden=\"true\"\n className={s.keyframeGhost}\n x={p.x - KEY_HALF}\n y={p.y - KEY_HALF}\n width={KEY_HALF * 2}\n height={KEY_HALF * 2}\n transform={`rotate(45 ${p.x} ${p.y})`}\n data-keyframe-ghost=\"\"\n />\n );\n })() : null}\n </>\n );\n }\n\n // ── hit test ────────────────────────────────────────────────────────\n function hitTest(state: KeyframeLayerState, plot: PlotPoint, ctx: LayerCtx): LayerHit | null {\n const bezier = activeBezier(state);\n if (bezier) {\n const h = hitTestAnchor(handlePoints(state, bezier, ctx), plot, HANDLE_HIT_PX);\n if (h) return { kind: 'handle', payload: { handle: h.index } };\n }\n const k = hitTestAnchor(state.keys.map((key) => ctx.toPlot({ x: key.t, y: key.value })), plot, KEY_HIT_PX);\n if (k) return { kind: 'key', payload: { index: k.index } };\n const c = hitTestCurve(segmentSamples(state, state.keys, ctx), plot, CURVE_HIT_PX);\n if (c) return { kind: 'segment', payload: { segment: c.segIdx + 1 } };\n return null;\n }\n\n // ── gestures ────────────────────────────────────────────────────────\n function keyGesture(index: number): LayerGesture<KeyframeLayerState> {\n return {\n onMove(state, model, e, ctx) {\n let t = clampTo(model.x, cfg.xClamp);\n if (cfg.snapX && !e.altKey) {\n const perPx = (ctx.modelRange.xMax - ctx.modelRange.xMin) / ctx.plotSize.width;\n t = clampTo(snapToNearest(t, cfg.snapX, Math.abs(perPx) * snapRadiusPx), cfg.xClamp);\n }\n return { ...state, drag: { kind: 'key', index, t, value: clampTo(model.y, cfg.yClamp) } };\n },\n onCommit(state) { return { ...state, ...applyKeyframeDrag(state), drag: null }; },\n onCancel(state) { return { ...state, drag: null }; },\n };\n }\n\n function handleGesture(segment: number, handle: 0 | 1): LayerGesture<KeyframeLayerState> {\n return {\n onMove(state, model) {\n const a = state.keys[segment - 1];\n const b = state.keys[segment];\n const d = state.drag;\n if (!a || !b || d?.kind !== 'handle') return state;\n const xf = b.t === a.t ? 0 : Math.min(1, Math.max(0, (model.x - a.t) / (b.t - a.t)));\n const yf = b.value === a.value ? 0 : (model.y - a.value) / (b.value - a.value);\n const bezier = [...d.bezier] as [number, number, number, number];\n bezier[handle * 2] = xf;\n bezier[handle * 2 + 1] = yf;\n return { ...state, drag: { kind: 'handle', segment, bezier } };\n },\n onCommit(state) { return { ...state, ...applyKeyframeDrag(state), drag: null }; },\n onCancel(state) { return { ...state, drag: null }; },\n };\n }\n\n function onPointerDown(\n state: KeyframeLayerState,\n hit: LayerHit,\n e: PointerEvent,\n _ctx: LayerCtx,\n extra: EmptyDownArgs<KeyframeLayerState>,\n ): LayerGesture<KeyframeLayerState> | void {\n if (e.button !== 0) return;\n if (hit.kind === 'handle') {\n const bezier = activeBezier(state);\n const segment = state.selectedSegment;\n if (!bezier || segment === null) return;\n const { handle } = hit.payload as { handle: 0 | 1 };\n extra.commit({ ...state, drag: { kind: 'handle', segment, bezier } });\n return handleGesture(segment, handle);\n }\n if (hit.kind === 'key') {\n const { index } = hit.payload as { index: number };\n const k = state.keys[index];\n extra.commit({ ...state, selectedKey: index, drag: { kind: 'key', index, t: k.t, value: k.value } });\n return keyGesture(index);\n }\n if (hit.kind === 'segment') {\n const { segment } = hit.payload as { segment: number };\n extra.commit({ ...state, selectedSegment: segment });\n }\n }\n\n // ── keyboard ────────────────────────────────────────────────────────\n function onKeyDown(\n state: KeyframeLayerState,\n e: KeyboardEvent,\n ctx: LayerCtx,\n extra: KeyDownArgs<KeyframeLayerState>,\n ): void {\n const target = e.target as Element | null;\n if (target?.closest?.('[data-layer-id]')?.getAttribute('data-layer-id') !== id) return;\n const activate = e.key === 'Enter' || e.key === ' ';\n const dx = e.key === 'ArrowRight' ? 1 : e.key === 'ArrowLeft' ? -1 : 0;\n const dy = e.key === 'ArrowUp' ? 1 : e.key === 'ArrowDown' ? -1 : 0;\n const mult = e.shiftKey ? SHIFT_MULTIPLIER : 1;\n\n const keyEl = target.closest('[data-keyframe-index]');\n if (keyEl) {\n const index = Number(keyEl.getAttribute('data-keyframe-index'));\n const k = state.keys[index];\n if (!k) return;\n if (activate) {\n e.preventDefault();\n extra.commit({ ...state, selectedKey: index });\n return;\n }\n if (dx === 0 && dy === 0) return;\n e.preventDefault();\n const m = ctx.modelRange;\n const stepX = (cfg.step?.x ?? Math.abs(m.xMax - m.xMin) / 100) * mult;\n const stepY = (cfg.step?.y ?? Math.abs(m.yMax - m.yMin) / 100) * mult;\n const t = clampTo(k.t + dx * stepX, cfg.xClamp);\n const value = clampTo(k.value + dy * stepY, cfg.yClamp);\n if (t === k.t && value === k.value) return;\n extra.commit({ ...state, ...moveKeyTo(state.keys, index, t, value), drag: null });\n return;\n }\n\n const segEl = target.closest('[data-segment-index]');\n if (segEl && activate) {\n e.preventDefault();\n extra.commit({ ...state, selectedSegment: Number(segEl.getAttribute('data-segment-index')) });\n return;\n }\n\n const handleEl = target.closest('[data-handle-index]');\n const bezier = activeBezier(state);\n if (handleEl && bezier && state.selectedSegment !== null && (dx !== 0 || dy !== 0)) {\n e.preventDefault();\n const h = Number(handleEl.getAttribute('data-handle-index'));\n const next = [...bezier] as [number, number, number, number];\n next[h * 2] = Math.min(1, Math.max(0, next[h * 2] + dx * HANDLE_STEP * mult));\n next[h * 2 + 1] += dy * HANDLE_STEP * mult;\n const drag: KeyframeDrag = { kind: 'handle', segment: state.selectedSegment, bezier: next };\n extra.commit({ ...state, ...applyKeyframeDrag({ ...state, drag }), drag: null });\n }\n }\n\n return { id, render, hitTest, onPointerDown, onKeyDown };\n}\n","/**\n * Catmull-Rom spline sampling, parameterized by α.\n *\n * α = 0 → uniform parameterization (original Catmull-Rom). Fast, can\n * produce cusps and self-intersections at sharp 2D angles.\n * α = 0.5 → centripetal (Yuksel/Schneider 2011). No cusps, no\n * self-intersection. The \"safe default\" for 2D.\n * α = 1 → chordal. Smoother than uniform, different artifacts.\n *\n * `sampleCurve(...)` is the convenience alias for centripetal (α=0.5).\n */\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nfunction knot(a: Point, b: Point, alpha: number): number {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return Math.pow(Math.sqrt(dx * dx + dy * dy), alpha);\n}\n\n/**\n * Sample the Catmull-Rom segment between p1 and p2 at parameter\n * t ∈ [0, 1]. p0 and p3 are the surrounding control points (use phantom\n * reflection at endpoints — see sampleCatmullRom below).\n *\n * Returns p1 at t=0 and p2 at t=1. `alpha` controls parameterization.\n */\nexport function segmentSampleAt(\n p0: Point, p1: Point, p2: Point, p3: Point, t: number,\n alpha: number = 0.5,\n): Point {\n const t0 = 0;\n const t1 = t0 + knot(p0, p1, alpha);\n const t2 = t1 + knot(p1, p2, alpha);\n const t3 = t2 + knot(p2, p3, alpha);\n\n // Degenerate: coincident p1/p2 → linear interpolation fallback.\n if (t2 - t1 === 0) {\n return { x: p1.x + (p2.x - p1.x) * t, y: p1.y + (p2.y - p1.y) * t };\n }\n\n const u = t1 + t * (t2 - t1);\n\n const a1x = ((t1 - u) * p0.x + (u - t0) * p1.x) / (t1 - t0);\n const a1y = ((t1 - u) * p0.y + (u - t0) * p1.y) / (t1 - t0);\n const a2x = ((t2 - u) * p1.x + (u - t1) * p2.x) / (t2 - t1);\n const a2y = ((t2 - u) * p1.y + (u - t1) * p2.y) / (t2 - t1);\n const a3x = ((t3 - u) * p2.x + (u - t2) * p3.x) / (t3 - t2);\n const a3y = ((t3 - u) * p2.y + (u - t2) * p3.y) / (t3 - t2);\n\n const b1x = ((t2 - u) * a1x + (u - t0) * a2x) / (t2 - t0);\n const b1y = ((t2 - u) * a1y + (u - t0) * a2y) / (t2 - t0);\n const b2x = ((t3 - u) * a2x + (u - t1) * a3x) / (t3 - t1);\n const b2y = ((t3 - u) * a2y + (u - t1) * a3y) / (t3 - t1);\n\n const cx = ((t2 - u) * b1x + (u - t1) * b2x) / (t2 - t1);\n const cy = ((t2 - u) * b1y + (u - t1) * b2y) / (t2 - t1);\n return { x: cx, y: cy };\n}\n\n/**\n * Sample the whole curve through `anchors` using Catmull-Rom with the\n * given α. Returns `(n-1) * samplesPerSegment + 1` points. Phantom\n * endpoints by reflection so the first/last segments are tangent to\n * the chord into/out of the endpoints. Returns `[]` for fewer than 2\n * anchors.\n */\nexport function sampleCatmullRom(\n anchors: readonly Point[],\n samplesPerSegment: number,\n alpha: number = 0.5,\n): Point[] {\n if (anchors.length < 2) return [];\n if (samplesPerSegment < 1) samplesPerSegment = 1;\n\n const n = anchors.length;\n const out: Point[] = [];\n\n const reflectStart: Point = {\n x: 2 * anchors[0].x - anchors[1].x,\n y: 2 * anchors[0].y - anchors[1].y,\n };\n const reflectEnd: Point = {\n x: 2 * anchors[n - 1].x - anchors[n - 2].x,\n y: 2 * anchors[n - 1].y - anchors[n - 2].y,\n };\n\n for (let i = 0; i < n - 1; i++) {\n const p0 = i === 0 ? reflectStart : anchors[i - 1];\n const p1 = anchors[i];\n const p2 = anchors[i + 1];\n const p3 = i + 2 < n ? anchors[i + 2] : reflectEnd;\n const tStart = i === 0 ? 0 : 1;\n for (let s = tStart; s <= samplesPerSegment; s++) {\n if (s === 0) {\n out.push(p1);\n continue;\n }\n if (s === samplesPerSegment) {\n out.push(p2);\n continue;\n }\n const t = s / samplesPerSegment;\n out.push(segmentSampleAt(p0, p1, p2, p3, t, alpha));\n }\n }\n return out;\n}\n\n/** Convenience alias for centripetal Catmull-Rom (α=0.5). The most\n * common choice; safe default for 2D paths. */\nexport function sampleCurve(\n anchors: readonly Point[],\n samplesPerSegment: number,\n): Point[] {\n return sampleCatmullRom(anchors, samplesPerSegment, 0.5);\n}\n","/**\n * Monotone cubic interpolation (Fritsch-Carlson / Steffen variant).\n *\n * Passes through every anchor and guarantees the curve never\n * overshoots `min(neighbors)` / `max(neighbors)` along either axis.\n * The right choice for animation timing curves (no anticipation) or\n * audio envelopes (no out-of-range values).\n *\n * Parameterized by index — works for both 1D (function-shaped) and\n * 2D (parametric) anchor sequences. The x and y coordinates are\n * interpolated independently as functions of the anchor index.\n *\n * Reference: Fritsch & Carlson 1980, \"Monotone piecewise cubic\n * interpolation.\" Steffen's 1990 refinement is conceptually the same;\n * we use a min-clamp variant that's monotonicity-preserving by\n * construction.\n */\n\nimport type { Point } from './catmullRom';\n\n/** Per-axis tangent computation for a 1D series of y-values sampled at\n * unit intervals (index-parameterized). Returns one tangent per\n * anchor. */\nfunction tangents(ys: readonly number[]): number[] {\n const n = ys.length;\n if (n === 0) return [];\n if (n === 1) return [0];\n\n // Secant slopes (dx = 1 in index parameterization).\n const m: number[] = new Array(n - 1);\n for (let i = 0; i < n - 1; i++) m[i] = ys[i + 1] - ys[i];\n\n const t: number[] = new Array(n);\n t[0] = m[0];\n t[n - 1] = m[n - 2];\n\n for (let i = 1; i < n - 1; i++) {\n if (m[i - 1] * m[i] <= 0) {\n // Sign change or flat → local extremum; tangent is zero (forces\n // the curve to settle without overshoot).\n t[i] = 0;\n } else {\n // Weighted average of adjacent secants (with dx_i = dx_{i-1} = 1,\n // this is just the arithmetic mean). Clamped by Steffen's rule\n // so the cubic stays monotone within each segment.\n const avg = (m[i - 1] + m[i]) / 2;\n const mag = Math.min(Math.abs(m[i - 1]), Math.abs(m[i]), Math.abs(avg));\n t[i] = Math.sign(avg) * mag;\n }\n }\n return t;\n}\n\n/** Cubic Hermite basis at parameter t ∈ [0, 1] given endpoint values\n * p0, p1 and endpoint tangents m0, m1. */\nfunction hermite(\n p0: number, p1: number, m0: number, m1: number, t: number,\n): number {\n const t2 = t * t;\n const t3 = t2 * t;\n return (\n (2 * t3 - 3 * t2 + 1) * p0 +\n (t3 - 2 * t2 + t) * m0 +\n (-2 * t3 + 3 * t2) * p1 +\n (t3 - t2) * m1\n );\n}\n\n/**\n * Sample the monotone-cubic curve through `anchors`. Returns\n * `(n-1) * samplesPerSegment + 1` points (same shape as\n * `sampleCatmullRom`). `[]` for fewer than 2 anchors.\n */\nexport function sampleMonotone(\n anchors: readonly Point[],\n samplesPerSegment: number,\n): Point[] {\n if (anchors.length < 2) return [];\n if (samplesPerSegment < 1) samplesPerSegment = 1;\n\n const n = anchors.length;\n const xs = anchors.map((a) => a.x);\n const ys = anchors.map((a) => a.y);\n const tx = tangents(xs);\n const ty = tangents(ys);\n\n const out: Point[] = [];\n for (let i = 0; i < n - 1; i++) {\n const startStep = i === 0 ? 0 : 1; // skip duplicate boundary\n for (let s = startStep; s <= samplesPerSegment; s++) {\n if (s === 0) { out.push(anchors[i]); continue; }\n if (s === samplesPerSegment) { out.push(anchors[i + 1]); continue; }\n const t = s / samplesPerSegment;\n out.push({\n x: hermite(xs[i], xs[i + 1], tx[i], tx[i + 1], t),\n y: hermite(ys[i], ys[i + 1], ty[i], ty[i + 1], t),\n });\n }\n }\n return out;\n}\n","/**\n * Interpolation mode dispatcher for CurveEditor. The vocabulary of\n * supported algorithms and the unified `sample(...)` entry point that\n * picks the right one. All algorithms produce\n * `(n-1) * samplesPerSegment + 1` points and pass through every\n * anchor — CurveEditor is strictly interpolating, never approximating.\n */\n\nimport { sampleCatmullRom, type Point } from './catmullRom';\nimport { sampleMonotone } from './monotone';\n\n/** Supported interpolation modes. All are interpolating (pass through\n * every anchor); the differences are in tangent computation and\n * parameterization. */\nexport type InterpolationMode =\n | 'linear'\n | 'catmull-rom' // centripetal (α=0.5) — safe default\n | 'catmull-rom-uniform' // α=0; can cusp on sharp 2D angles\n | 'catmull-rom-chordal' // α=1; smoother than uniform\n | 'monotone'; // Fritsch-Carlson / Steffen; no overshoot\n\n/** Sample anchors as a polyline. Produces the same sample count shape\n * as the Catmull-Rom variants so downstream segment-slicing logic\n * (hit testing, fill path construction) works uniformly. */\nfunction sampleLinear(\n anchors: readonly Point[],\n samplesPerSegment: number,\n): Point[] {\n if (anchors.length < 2) return [];\n if (samplesPerSegment < 1) samplesPerSegment = 1;\n\n const out: Point[] = [];\n for (let i = 0; i < anchors.length - 1; i++) {\n const a = anchors[i];\n const b = anchors[i + 1];\n const startStep = i === 0 ? 0 : 1;\n for (let s = startStep; s <= samplesPerSegment; s++) {\n if (s === 0) { out.push(a); continue; }\n if (s === samplesPerSegment) { out.push(b); continue; }\n const t = s / samplesPerSegment;\n out.push({ x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t });\n }\n }\n return out;\n}\n\n/** Sample `anchors` using the chosen interpolation mode. */\nexport function sampleByInterpolation(\n anchors: readonly Point[],\n samplesPerSegment: number,\n mode: InterpolationMode,\n): Point[] {\n switch (mode) {\n case 'linear':\n return sampleLinear(anchors, samplesPerSegment);\n case 'catmull-rom-uniform':\n return sampleCatmullRom(anchors, samplesPerSegment, 0);\n case 'catmull-rom-chordal':\n return sampleCatmullRom(anchors, samplesPerSegment, 1);\n case 'monotone':\n return sampleMonotone(anchors, samplesPerSegment);\n case 'catmull-rom':\n default:\n return sampleCatmullRom(anchors, samplesPerSegment, 0.5);\n }\n}\n","/**\n * Built-in function/curve layer for LayeredCurveEditor. Bundles the\n * curve-render + anchor-render + drag/insert/delete gestures that were\n * the entirety of the original `CurveEditor`. Multiple instances coexist\n * by id; consumers can compose several to plot e.g. a primary function\n * and a derived (read-only) curve on the same chart.\n */\nimport type { ReactNode } from 'react';\nimport { sampleByInterpolation, type InterpolationMode } from './interpolation';\nimport { hitTestAnchor, hitTestCurve } from './hitTest';\nimport { handleHalf } from '../../handles';\nimport { dlog } from '../../dlog';\nimport s from './CurveEditor.module.css';\nimport type {\n CurveLayer, LayerCtx, LayerGesture, LayerRenderCtx, ModelPoint, PlotPoint,\n EmptyDownArgs, KeyDownArgs,\n} from './layerTypes';\n\n// ── Public types ─────────────────────────────────────────────────────\n\n/** One anchor of a curve, in model space. */\nexport interface ControlPoint {\n x: number;\n y: number;\n /** When true, this control point can't be moved or deleted by the\n * user. Render as a smaller diamond with locked styling. */\n locked?: boolean;\n}\n\n/**\n * Whether a curve's points keep their x order. In `'1d'` an anchor cannot be\n * dragged past its neighbors and a new point is inserted at its x position;\n * in `'2d'` points are free to move anywhere and keep their list order.\n */\nexport type CurveDomain = '1d' | '2d';\n/**\n * How much of a curve's first and last anchor the user may move: everything,\n * only their y, or nothing.\n */\nexport type EndpointMode = 'free' | 'pinned-x' | 'pinned-both';\n/**\n * Where a click adds a new anchor — on the curve itself, anywhere in the\n * plot, or nowhere.\n */\nexport type AddPointMode = 'click-curve' | 'click-empty' | 'never';\n\n/**\n * What a `renderAnchor` function is given for one anchor: the point, its\n * index, its position in plot space (`cx`/`cy`), and the states that change\n * how it should look.\n */\nexport interface AnchorRenderProps {\n point: ControlPoint;\n index: number;\n cx: number;\n cy: number;\n isActive: boolean;\n isLocked: boolean;\n isPinnedEndpoint: boolean;\n isEndpoint: boolean;\n}\n\n/**\n * Per-instance curve-rendering overrides. Currently empty — passing `{}`\n * means \"draw the curve\", and `false`/`null` means don't.\n */\nexport type CurveSettings = object;\n\n/** Shades the region between the curve and one edge of the plot. */\nexport interface FillSettings {\n side: 'below' | 'above';\n color?: string;\n}\n\n/** Configuration for {@link createFunctionLayer}. */\nexport interface FunctionLayerConfig {\n /** Layer id; default `'function'`. Two instances on the same editor\n * must have distinct ids. */\n id?: string;\n domain?: CurveDomain;\n endpoints?: EndpointMode;\n interpolation?: InterpolationMode;\n constrain?: 'none' | 'function';\n addPointMode?: AddPointMode;\n minPoints?: number;\n maxPoints?: number;\n curve?: CurveSettings | false | null;\n fill?: FillSettings | false | null;\n hideNonInteractive?: boolean;\n renderAnchor?: (info: AnchorRenderProps) => ReactNode;\n /** When false, the layer renders the curve+fill but doesn't render\n * anchors and doesn't accept pointer input. For derived read-only\n * curves (e.g. plotting f'(x) alongside f(x)). Default true. */\n interactive?: boolean;\n /** Override x clamp range for drags and pinned endpoints. Defaults\n * to the editor's modelRange x. Use this to constrain a layer to a\n * sub-range of the plot (e.g. a bevel curve occupying x ∈ [0, b]\n * while the editor's xRange is [0, halfWidth]). */\n xClamp?: readonly [number, number];\n /** Names the curve in each anchor's accessible name. Default `'Point'`. */\n label?: string;\n}\n\n/**\n * The state a function layer owns. Treat it as opaque and round-trip it\n * through `LayeredCurveEditor`'s `onLayerChange`; `points` is the part worth\n * reading.\n */\nexport interface FunctionLayerState {\n points: readonly ControlPoint[];\n /** Layer-internal: the index of the anchor currently being dragged.\n * Cleared between gestures. Consumers treat the whole state as\n * opaque and round-trip it via onLayerChange. */\n activeIndex: number | null;\n}\n\nconst SAMPLES_PER_SEGMENT = 16;\nconst ENDPOINT_HALF = handleHalf('--wzl-handle-size-lg');\nconst LOCKED_HALF = handleHalf('--wzl-handle-size-sm');\nconst ANCHOR_SNAP_PX = 12;\nconst CURVE_HIT_PX = 8;\n/** An arrow-key nudge, as a fraction of the range; shift takes ten. */\nconst KEY_STEP_FRACTION = 0.01;\nconst SHIFT_MULTIPLIER = 10;\n\nconst formatCoord = (n: number): string => String(Number(n.toFixed(3)));\n\n// ── Helpers ───────────────────────────────────────────────────────────\n\nfunction clampToModelRange(p: ModelPoint, ctx: LayerCtx): ModelPoint {\n const m = ctx.modelRange;\n const xLo = Math.min(m.xMin, m.xMax);\n const xHi = Math.max(m.xMin, m.xMax);\n const yLo = Math.min(m.yMin, m.yMax);\n const yHi = Math.max(m.yMin, m.yMax);\n return {\n x: Math.max(xLo, Math.min(xHi, p.x)),\n y: Math.max(yLo, Math.min(yHi, p.y)),\n };\n}\n\nfunction isPinnedEndpointAt(index: number, count: number, endpoints: EndpointMode): boolean {\n if (endpoints === 'free') return false;\n return index === 0 || index === count - 1;\n}\n\nfunction projectAnchors(points: readonly ControlPoint[], ctx: LayerCtx): PlotPoint[] {\n return points.map((p) => ctx.toPlot(p));\n}\n\nfunction segmentSamples(\n points: readonly ControlPoint[],\n interpolation: InterpolationMode,\n ctx: LayerCtx,\n): PlotPoint[][] {\n if (points.length < 2) return [];\n const all = sampleByInterpolation(points, SAMPLES_PER_SEGMENT, interpolation);\n const out: PlotPoint[][] = [];\n for (let i = 0; i < points.length - 1; i++) {\n const start = i * SAMPLES_PER_SEGMENT;\n const end = start + SAMPLES_PER_SEGMENT;\n const slice = all.slice(start, end + 1);\n out.push(slice.map((p) => ctx.toPlot(p)));\n }\n return out;\n}\n\nfunction resolveInterpolation(cfg: FunctionLayerConfig): InterpolationMode {\n return (cfg.constrain ?? 'none') === 'function'\n ? 'monotone'\n : (cfg.interpolation ?? 'catmull-rom');\n}\n\n// ── Factory ───────────────────────────────────────────────────────────\n\n/**\n * Builds the built-in curve layer for `LayeredCurveEditor`: it draws the\n * interpolated curve and its anchors, and handles dragging, inserting and\n * deleting them.\n *\n * Several can coexist on one editor as long as their ids differ — plotting a\n * derived read-only curve beside an editable one is the case it is shaped\n * for, via `interactive: false`.\n */\nexport function createFunctionLayer(cfg: FunctionLayerConfig = {}): CurveLayer<FunctionLayerState> {\n const id = cfg.id ?? 'function';\n const domain = cfg.domain ?? '2d';\n const endpoints = cfg.endpoints ?? 'free';\n const constrain = cfg.constrain ?? 'none';\n const addPointMode = cfg.addPointMode ?? 'click-curve';\n const interpolation = resolveInterpolation(cfg);\n const interactive = cfg.interactive !== false;\n const curveVisible = cfg.curve !== false && cfg.curve !== null;\n\n // ── render ──────────────────────────────────────────────────────────\n function render(state: FunctionLayerState, ctx: LayerRenderCtx): ReactNode {\n const { points, activeIndex } = state;\n const plotAnchors = projectAnchors(points, ctx);\n\n let pathD = '';\n let fillD: string | null = null;\n if (points.length >= 2) {\n const samples = sampleByInterpolation(points, SAMPLES_PER_SEGMENT, interpolation)\n .map((p) => ctx.toPlot(p));\n const parts: string[] = [`M${samples[0].x.toFixed(2)},${samples[0].y.toFixed(2)}`];\n for (let i = 1; i < samples.length; i++) {\n parts.push(`L${samples[i].x.toFixed(2)},${samples[i].y.toFixed(2)}`);\n }\n pathD = parts.join('');\n\n if (cfg.fill) {\n const closingY = cfg.fill.side === 'below' ? ctx.plotSize.height : 0;\n const first = samples[0];\n const last = samples[samples.length - 1];\n const fillParts = [...parts];\n fillParts.push(`L${last.x.toFixed(2)},${closingY.toFixed(2)}`);\n fillParts.push(`L${first.x.toFixed(2)},${closingY.toFixed(2)}`);\n fillParts.push('Z');\n fillD = fillParts.join('');\n }\n }\n\n return (\n <>\n {fillD && (\n <path\n data-curve-element=\"fill\"\n className={s.fill}\n d={fillD}\n fill={cfg.fill ? cfg.fill.color : undefined}\n />\n )}\n {pathD && curveVisible && (\n <path\n className={s.curve}\n d={pathD}\n fill=\"none\"\n />\n )}\n {interactive && plotAnchors.map((a, i) => {\n const pinned = isPinnedEndpointAt(i, points.length, endpoints);\n const locked = points[i]?.locked === true;\n if ((locked || pinned) && cfg.hideNonInteractive) return null;\n const active = activeIndex === i;\n const isEndpoint = curveVisible && (i === 0 || i === points.length - 1);\n const focus = !locked && !(endpoints === 'pinned-both' && pinned)\n ? { tabIndex: 0 }\n : {};\n const a11y = {\n ...focus,\n role: 'button',\n 'aria-label': `${cfg.label ?? 'Point'} ${i + 1} at ${formatCoord(points[i].x)}, ${formatCoord(points[i].y)}`,\n };\n if (cfg.renderAnchor) {\n const node = cfg.renderAnchor({\n point: points[i], index: i,\n cx: a.x, cy: a.y,\n isActive: active, isLocked: locked,\n isPinnedEndpoint: pinned, isEndpoint,\n });\n if (node !== null && node !== undefined) {\n return <g key={i} data-anchor-index={i} {...a11y}>{node}</g>;\n }\n }\n const anchorCls = [\n s.anchor,\n isEndpoint && s.endpoint,\n (pinned || locked) && s.pinned,\n locked && s.locked,\n active && s.active,\n ].filter(Boolean).join(' ');\n const renderAsDiamond = isEndpoint || locked;\n if (renderAsDiamond) {\n const half = locked ? LOCKED_HALF : ENDPOINT_HALF;\n return (\n <rect\n key={i}\n className={anchorCls}\n x={a.x - half}\n y={a.y - half}\n width={half * 2}\n height={half * 2}\n transform={`rotate(45 ${a.x} ${a.y})`}\n data-anchor-index={i}\n {...a11y}\n />\n );\n }\n return (\n <circle\n key={i}\n className={anchorCls}\n cx={a.x}\n cy={a.y}\n r={4}\n data-anchor-index={i}\n {...a11y}\n />\n );\n })}\n </>\n );\n }\n\n // ── hit test ────────────────────────────────────────────────────────\n function hitTest(state: FunctionLayerState, plot: PlotPoint, ctx: LayerCtx) {\n if (!interactive) return null;\n const plotAnchors = projectAnchors(state.points, ctx);\n const a = hitTestAnchor(plotAnchors, plot, ANCHOR_SNAP_PX);\n if (a) return { kind: 'anchor' as const, payload: { index: a.index } };\n if (addPointMode === 'click-curve' && curveVisible) {\n const segs = segmentSamples(state.points, interpolation, ctx);\n const c = hitTestCurve(segs, plot, CURVE_HIT_PX);\n if (c) return { kind: 'curve' as const, payload: { segIdx: c.segIdx, t: c.t } };\n }\n return null;\n }\n\n // ── move constraint, shared by drag and keyboard ────────────────────\n function moveAnchor(state: FunctionLayerState, index: number, model: ModelPoint, ctx: LayerCtx): FunctionLayerState {\n const points = state.points;\n if (index < 0 || index >= points.length) return state;\n const mr = ctx.modelRange;\n const xMin = cfg.xClamp ? cfg.xClamp[0] : mr.xMin;\n const xMax = cfg.xClamp ? cfg.xClamp[1] : mr.xMax;\n let nx = model.x;\n let ny = model.y;\n const isEndpoint = index === 0 || index === points.length - 1;\n\n if (endpoints === 'pinned-both' && isEndpoint) {\n nx = points[index].x;\n ny = points[index].y;\n } else if (endpoints === 'pinned-x' && isEndpoint) {\n nx = index === 0 ? xMin : xMax;\n } else if (constrain === 'function' || domain === '1d') {\n const epsilon = constrain === 'function'\n ? (xMax - xMin) / 1000\n : 0;\n const left = index > 0 ? points[index - 1].x + epsilon : xMin;\n const right = index < points.length - 1 ? points[index + 1].x - epsilon : xMax;\n nx = Math.max(left, Math.min(right, nx));\n }\n\n // Always clamp x to the layer's own range (so free-mode\n // interior anchors of a sub-range layer can't escape it).\n // Normalize bounds for inverted ranges.\n {\n const lo = Math.min(xMin, xMax);\n const hi = Math.max(xMin, xMax);\n nx = Math.max(lo, Math.min(hi, nx));\n }\n const clamped = clampToModelRange({ x: nx, y: ny }, ctx);\n const next = points.slice();\n next[index] = { ...points[index], x: clamped.x, y: clamped.y };\n return { ...state, points: next, activeIndex: index };\n }\n\n // ── drag gesture ────────────────────────────────────────────────────\n function makeDragGesture(index: number): LayerGesture<FunctionLayerState> {\n return {\n onMove(state, model, _e, ctx) { return moveAnchor(state, index, model, ctx); },\n onCommit(state) { return { ...state, activeIndex: null }; },\n onCancel(state) { return { ...state, activeIndex: null }; },\n };\n }\n\n // ── pointerdown on a positive hit ───────────────────────────────────\n function onPointerDown(\n state: FunctionLayerState,\n hit: { kind: string; payload?: unknown },\n e: PointerEvent,\n ctx: LayerCtx,\n extra: EmptyDownArgs<FunctionLayerState>,\n ): LayerGesture<FunctionLayerState> | void {\n if (hit.kind === 'anchor') {\n const { index } = hit.payload as { index: number };\n dlog('function-layer', 'anchor-down', { id, index, shift: ctx.modifiers.shift, button: e.button });\n if (state.points[index]?.locked) return;\n if (ctx.modifiers.shift) {\n if (isPinnedEndpointAt(index, state.points.length, endpoints)) return;\n if (cfg.minPoints !== undefined && state.points.length <= cfg.minPoints) return;\n extra.commit({\n ...state,\n points: state.points.filter((_, i) => i !== index),\n activeIndex: null,\n });\n return;\n }\n if (e.button === 2) return;\n extra.commit({ ...state, activeIndex: index });\n return makeDragGesture(index);\n }\n if (hit.kind === 'curve') {\n const { segIdx } = hit.payload as { segIdx: number; t: number };\n if (cfg.maxPoints !== undefined && state.points.length >= cfg.maxPoints) return;\n const insertIndex = segIdx + 1;\n const modelPt = clampToModelRange(extra.model, ctx);\n\n // function/1d: refuse insert that would be immediately clamped\n // against a neighbor (mouse jitter would otherwise drop a phantom\n // point directly above an existing anchor). Snap to dragging the\n // neighbor instead.\n if (constrain === 'function' || domain === '1d') {\n const epsilon = constrain === 'function'\n ? (ctx.modelRange.xMax - ctx.modelRange.xMin) / 1000\n : 0;\n const left = insertIndex > 0 ? state.points[insertIndex - 1] : null;\n const right = insertIndex < state.points.length ? state.points[insertIndex] : null;\n if (left && Math.abs(modelPt.x - left.x) < epsilon * 2) {\n extra.commit({ ...state, activeIndex: insertIndex - 1 });\n return makeDragGesture(insertIndex - 1);\n }\n if (right && Math.abs(modelPt.x - right.x) < epsilon * 2) {\n extra.commit({ ...state, activeIndex: insertIndex });\n return makeDragGesture(insertIndex);\n }\n }\n\n const nextPoints = [...state.points.slice(0, insertIndex), modelPt, ...state.points.slice(insertIndex)];\n extra.commit({ ...state, points: nextPoints, activeIndex: insertIndex });\n return makeDragGesture(insertIndex);\n }\n }\n\n // ── empty-space click ───────────────────────────────────────────────\n function onEmptyPointerDown(\n state: FunctionLayerState,\n model: ModelPoint,\n _e: PointerEvent,\n ctx: LayerCtx,\n extra: EmptyDownArgs<FunctionLayerState>,\n ): LayerGesture<FunctionLayerState> | void {\n if (!interactive) return;\n if (addPointMode !== 'click-empty') return;\n if (cfg.maxPoints !== undefined && state.points.length >= cfg.maxPoints) return;\n\n const clamped = clampToModelRange(model, ctx);\n let insertIndex = state.points.length;\n if (domain === '1d') {\n for (let i = 0; i < state.points.length; i++) {\n if (state.points[i].x > clamped.x) { insertIndex = i; break; }\n }\n }\n const nextPoints = [...state.points.slice(0, insertIndex), clamped, ...state.points.slice(insertIndex)];\n extra.commit({ ...state, points: nextPoints, activeIndex: null });\n return;\n }\n\n // ── keyboard ────────────────────────────────────────────────────────\n function onKeyDown(\n state: FunctionLayerState,\n e: KeyboardEvent,\n ctx: LayerCtx,\n extra: KeyDownArgs<FunctionLayerState>,\n ): void {\n if (!interactive) return;\n const target = e.target as Element | null;\n if (target?.closest?.('[data-layer-id]')?.getAttribute('data-layer-id') !== id) return;\n const el = target.closest('[data-anchor-index]');\n if (!el) return;\n const dx = e.key === 'ArrowRight' ? 1 : e.key === 'ArrowLeft' ? -1 : 0;\n const dy = e.key === 'ArrowUp' ? 1 : e.key === 'ArrowDown' ? -1 : 0;\n if (dx === 0 && dy === 0) return;\n e.preventDefault();\n const index = Number(el.getAttribute('data-anchor-index'));\n const p = state.points[index];\n if (!p || p.locked) return;\n const m = ctx.modelRange;\n const mult = e.shiftKey ? SHIFT_MULTIPLIER : 1;\n const xSpan = cfg.xClamp ? cfg.xClamp[1] - cfg.xClamp[0] : m.xMax - m.xMin;\n const next = moveAnchor(state, index, {\n x: p.x + dx * Math.abs(xSpan) * KEY_STEP_FRACTION * mult,\n y: p.y + dy * Math.abs(m.yMax - m.yMin) * KEY_STEP_FRACTION * mult,\n }, ctx);\n const moved = next.points[index];\n if (moved.x === p.x && moved.y === p.y) return;\n extra.commit({ ...next, activeIndex: null });\n }\n\n return {\n id,\n render,\n hitTest,\n onPointerDown,\n onEmptyPointerDown,\n onKeyDown,\n };\n}\n\n/** Convenience: build a function-layer state from a points array. */\nexport function functionLayerState(points: readonly ControlPoint[]): FunctionLayerState {\n return { points, activeIndex: null };\n}\n","/**\n * Back-compat wrapper around `LayeredCurveEditor` that preserves the\n * original single-curve API. New consumers wanting multi-layer\n * composition should reach for `LayeredCurveEditor` + `createFunctionLayer`\n * directly.\n */\nimport {\n useCallback, useEffect, useMemo, useRef, useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from 'react';\nimport {\n type GridSettings,\n type AxesSettings,\n type TickSettings,\n} from '../Plot2D';\nimport type { InterpolationMode } from './interpolation';\nimport {\n createFunctionLayer,\n type ControlPoint,\n type CurveDomain,\n type EndpointMode,\n type AddPointMode,\n type CurveSettings,\n type FillSettings,\n type AnchorRenderProps,\n type FunctionLayerState,\n} from './createFunctionLayer';\nimport { LayeredCurveEditor } from './LayeredCurveEditor';\n\nexport type { GridSettings, AxesSettings, TickSettings };\nexport type {\n ControlPoint, CurveDomain, EndpointMode, AddPointMode,\n CurveSettings, FillSettings, AnchorRenderProps,\n};\n\n/**\n * Props for {@link CurveEditor}. `onInput` fires throughout a gesture and\n * `onChange` once at its end, with the pre-gesture points as `prev`.\n */\nexport interface CurveEditorProps {\n value: readonly ControlPoint[];\n onInput: (next: ControlPoint[]) => void;\n onChange?: (next: ControlPoint[], prev: readonly ControlPoint[]) => void;\n domain?: CurveDomain;\n interpolation?: InterpolationMode;\n endpoints?: EndpointMode;\n xRange?: readonly [number, number];\n yRange?: readonly [number, number];\n width: number;\n height: number;\n grid?: GridSettings | false | null;\n axes?: AxesSettings | false | null;\n xTicks?: TickSettings | false | null;\n yTicks?: TickSettings | false | null;\n curve?: CurveSettings | false | null;\n fill?: FillSettings | false | null;\n hideNonInteractive?: boolean;\n constrain?: 'none' | 'function';\n history?: boolean;\n minPoints?: number;\n maxPoints?: number;\n addPointMode?: AddPointMode;\n renderAnchor?: (info: AnchorRenderProps) => ReactNode;\n /** Extra SVG content rendered behind the curve and anchors. */\n decorations?: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * Editable curve through a list of control points: drag anchors, click to\n * insert, right-click to delete, with optional built-in undo.\n *\n * This is the single-curve API, implemented as one `createFunctionLayer` on\n * a `LayeredCurveEditor`. Reach for those directly to stack several curves\n * on one plot.\n */\nexport function CurveEditor(props: CurveEditorProps) {\n const {\n value, onInput, onChange,\n domain, endpoints, interpolation, constrain, addPointMode,\n minPoints, maxPoints, curve, fill, hideNonInteractive, renderAnchor,\n width, height, xRange, yRange, grid, axes, xTicks, yTicks, history,\n className, style, decorations,\n } = props;\n\n // Layer is config-only; rebuild only when *config* changes.\n const layer = useMemo(() => createFunctionLayer({\n id: 'function',\n domain, endpoints, interpolation, constrain, addPointMode,\n minPoints, maxPoints, curve, fill, hideNonInteractive, renderAnchor,\n }), [\n domain, endpoints, interpolation, constrain, addPointMode,\n minPoints, maxPoints, curve, fill, hideNonInteractive, renderAnchor,\n ]);\n\n // Hybrid controlled-state: the wrapper holds the full FunctionLayerState\n // locally so that consumers using the original CurveEditor API don't\n // have to wire their `value` prop back through on every drag tick to\n // keep the in-flight gesture advancing. We adopt the consumer's\n // `value` prop when it changes externally (and no gesture is active).\n const [layerState, setLayerState] = useState<FunctionLayerState>(\n () => ({ points: value, activeIndex: null }),\n );\n // Ref mirror so the layerChange callback can compare against the\n // freshest state without re-binding on every render.\n const layerStateRef = useRef(layerState);\n layerStateRef.current = layerState;\n\n // Sync from controlled `value` when the consumer updates it externally\n // and we're idle. Skip the update during a gesture so drag-in-flight\n // points aren't clobbered by a stale `value`.\n useEffect(() => {\n if (layerStateRef.current.activeIndex !== null) return;\n if (layerStateRef.current.points === value) return;\n setLayerState({ points: value, activeIndex: null });\n }, [value]);\n\n const handleLayerChange = useCallback((_id: string, nextUnknown: unknown) => {\n const next = nextUnknown as FunctionLayerState;\n const prevPoints = layerStateRef.current.points;\n setLayerState(next);\n if (next.points !== prevPoints) {\n onInput(next.points as ControlPoint[]);\n }\n }, [onInput]);\n\n const handleLayerCommit = useCallback((_id: string, nextUnknown: unknown, prevUnknown: unknown) => {\n if (!onChange) return;\n const next = nextUnknown as FunctionLayerState;\n const prev = prevUnknown as FunctionLayerState;\n if (next.points !== prev.points) {\n onChange?.(next.points as ControlPoint[], prev.points);\n }\n }, [onChange]);\n\n // Right-click on an anchor → delete (preserves original CurveEditor\n // behavior). LayeredCurveEditor doesn't model contextmenu as a\n // gesture; we intercept at the wrapper level by walking the DOM\n // target for `data-anchor-index`.\n const onContextMenu = useCallback((e: ReactMouseEvent<HTMLDivElement>) => {\n const target = e.target as Element | null;\n const node = target?.closest?.('[data-anchor-index]') as Element | null;\n if (!node) return;\n e.preventDefault();\n e.stopPropagation();\n const idxAttr = node.getAttribute('data-anchor-index');\n if (idxAttr === null) return;\n const idx = Number(idxAttr);\n const points = layerStateRef.current.points;\n if (!Number.isInteger(idx) || idx < 0 || idx >= points.length) return;\n if (points[idx]?.locked) return;\n if (endpoints !== undefined && endpoints !== 'free' && (idx === 0 || idx === points.length - 1)) return;\n if (minPoints !== undefined && points.length <= minPoints) return;\n const next = points.filter((_, i) => i !== idx);\n setLayerState({ points: next, activeIndex: null });\n onInput(next as ControlPoint[]);\n onChange?.(next as ControlPoint[], points);\n }, [endpoints, minPoints, onInput, onChange]);\n\n const layers = useMemo(() => [{ layer, state: layerState }], [layer, layerState]);\n\n return (\n <div\n onContextMenu={onContextMenu}\n style={{ display: 'contents' }}\n >\n <LayeredCurveEditor\n layers={layers}\n onLayerChange={handleLayerChange}\n onLayerCommit={handleLayerCommit}\n width={width}\n height={height}\n xRange={xRange}\n yRange={yRange}\n grid={grid}\n axes={axes}\n xTicks={xTicks}\n yTicks={yTicks}\n history={history}\n className={className}\n style={style}\n >\n {decorations}\n </LayeredCurveEditor>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n Modal as RACModal,\n ModalOverlay,\n Dialog as RACDialog,\n Heading,\n type ModalOverlayProps,\n type DialogProps as RACDialogProps,\n} from 'react-aria-components';\nimport { useOverlayPortal, type OverlayPortalProps, type WithoutPortalTarget } from '../../overlays/portalHost';\nimport { type StanceProps, useStance } from '../stance';\nimport s from './Dialog.module.css';\n\n/** Props for {@link Dialog}, on top of React Aria's `ModalOverlay` props. */\nexport type DialogProps = Omit<\n WithoutPortalTarget<ModalOverlayProps>,\n 'children' | 'className'\n> &\n OverlayPortalProps &\n StanceProps & {\n /** Heading rendered in the dialog's default header. Omit when supplying\n * a custom `header` slot via children. */\n title?: ReactNode;\n /** Show the built-in close button. Defaults to true when `onOpenChange`\n * is wired so the user has an escape hatch. */\n showCloseButton?: boolean;\n /** Body content. */\n children?: ReactNode;\n /** Footer slot — typically action buttons. */\n footer?: ReactNode;\n /** ARIA role. Defaults to `dialog`. Use `alertdialog` for confirms. */\n role?: RACDialogProps['role'];\n /** Class applied to the modal box (inside the overlay). */\n className?: string;\n /** Class applied to the scrolling body. For content that owns its own\n * scrolling — a form with a fixed navigation rail beside a scrolling\n * pane — this is where the body's padding and overflow come off. */\n bodyClassName?: string;\n };\n\n/**\n * Modal dialog wrapping React Aria. Supplies a default header (title +\n * close), scrollable body, and footer slot. Pass `isOpen` + `onOpenChange`\n * for controlled visibility, or omit both and use a `<DialogTrigger>` from\n * `react-aria-components` upstream of this component.\n *\n * Escape, click-outside, focus trap, and scroll lock all come from the\n * underlying primitives. `stance` and `tone` work as on `<PropertyPanel>` —\n * a destructive confirm is `stance=\"danger\"`.\n */\nexport function Dialog(props: DialogProps) {\n const {\n title,\n showCloseButton,\n children,\n footer,\n role = 'dialog',\n className,\n bodyClassName,\n isOpen,\n onOpenChange,\n portalContainer,\n stance,\n tone,\n ...rest\n } = props;\n const stanced = useStance({ stance, tone });\n\n const showClose = showCloseButton ?? Boolean(onOpenChange);\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n\n return (\n <>\n {anchor}\n <ModalOverlay\n {...rest}\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n className={s.overlay}\n data-weasel-overlay=\"\"\n {...portalProps}\n >\n <RACModal className={[s.modal, className].filter(Boolean).join(' ')} {...stanced}>\n <RACDialog role={role} className={s.dialog}>\n {({ close }) => (\n <>\n {(title !== undefined || showClose) && (\n <header className={s.header}>\n {title !== undefined && (\n <Heading slot=\"title\" className={s.title}>{title}</Heading>\n )}\n {showClose && (\n <button\n type=\"button\"\n className={s.close}\n onClick={close}\n aria-label=\"Close dialog\"\n >\n ×\n </button>\n )}\n </header>\n )}\n <div className={[s.body, bodyClassName].filter(Boolean).join(' ')}>{children}</div>\n {footer !== undefined && <footer className={s.footer}>{footer}</footer>}\n </>\n )}\n </RACDialog>\n </RACModal>\n </ModalOverlay>\n </>\n );\n}\n","/**\n * Display-formatter for numbers. Use this anywhere a number is shown to\n * a user. The whole point: negative values get prefixed with the real\n * MINUS SIGN (U+2212) instead of the ASCII HYPHEN-MINUS (U+002D) that\n * `toLocaleString` and template literals produce by default.\n *\n * U+2212 is the same visual width as `+` and reads as a sign rather\n * than a hyphen — columns of signed numbers align cleanly and the\n * glyph doesn't get confused with a bullet or list dash.\n */\nexport const MINUS_SIGN = '−';\n\n/**\n * Formats a number for display, substituting {@link MINUS_SIGN} for the ASCII\n * hyphen `toLocaleString` emits. Non-finite values stringify as-is.\n */\nexport function formatNumber(value: number, options?: Intl.NumberFormatOptions): string {\n const formatted = Number.isFinite(value)\n ? value.toLocaleString(undefined, options)\n : String(value);\n return formatted.replace(/^-/, MINUS_SIGN);\n}\n\n/**\n * Parses a string that may carry {@link MINUS_SIGN} in place of the ASCII\n * hyphen. The inverse of {@link formatNumber} for any editing surface that\n * renders its value through it and reads the edited text back.\n */\nexport function parseSignedNumber(text: string): number {\n return Number(text.replace(MINUS_SIGN, '-'));\n}\n\n/** Powers of ten a typed magnitude suffix stands for. */\nconst EXPONENTS: Record<string, number> = { k: 3, m: 6, b: 9, t: 12 };\n\n/**\n * Formats a number the way a `compact` readout shows it: below 1,000 at\n * `decimals` places, from 1,000 up at three significant figures with a magnitude\n * suffix (`40.0K`, `294K`, `2.00M`), so the readout holds one width whatever the\n * value. Always `en-US`, so {@link parseNumber} reads it back.\n */\nexport function formatCompact(value: number, decimals = 0): string {\n if (!Number.isFinite(value)) return formatNumber(value);\n const options: Intl.NumberFormatOptions =\n Math.abs(value) < 1000\n ? { useGrouping: false, minimumFractionDigits: decimals, maximumFractionDigits: decimals }\n : { notation: 'compact', minimumSignificantDigits: 3, maximumSignificantDigits: 3 };\n return value.toLocaleString('en-US', options).replace(/^-/, MINUS_SIGN);\n}\n\n/**\n * Reads a typed number: anything {@link parseSignedNumber} reads, plus\n * thousands commas in the `40,000` shape and a `k`/`m`/`b`/`t` suffix in either\n * case (`2.5m` is 2,500,000). Empty text is NaN rather than zero.\n *\n * Given `units` — a suffix mapped to the factor it scales by — a trailing unit\n * name is read first: the longest match wins, exact case before any case, and\n * a unit beats a magnitude suffix, so with `m` accepted `2m` is `2 * units.m`.\n */\nexport function parseNumber(text: string, units?: Readonly<UnitTable>): number {\n if (units) {\n const trimmed = text.trim();\n const name = unitSuffixOf(trimmed, units);\n if (name !== undefined) {\n const terms = compoundTermsOf(trimmed, units);\n if (terms !== undefined && terms.length > 1) return compoundValue(terms, trimmed, units);\n const { factor, offset } = scaleOf(units[name]!);\n return scaled(parseNumber(trimmed.slice(0, -name.length)), factor) + offset;\n }\n }\n let t = text.trim().replace(MINUS_SIGN, '-');\n const exponent = EXPONENTS[t.slice(-1).toLowerCase()];\n if (exponent !== undefined) t = t.slice(0, -1).trimEnd();\n if (/^[-+]?\\d{1,3}(,\\d{3})+(\\.\\d*)?$/.test(t)) t = t.replace(/,/g, '');\n if (!/\\d/.test(t)) return Number.NaN;\n // Scaled through the exponent rather than by multiplying: 1.1 * 1000 is 1100.0000000000002.\n return Number(exponent === undefined ? t : `${t}e${exponent}`);\n}\n\n/** One unit's conversion into the shown unit: a bare factor, or a scale that\n * also moves zero. Structurally the kit's `UnitEntry`, kept local so this\n * formatting helper stays free of the scene vocabulary. */\nexport type UnitTableEntry = number | { factor: number; offset?: number };\n/** Suffixes a person may type, each mapped to its conversion. */\nexport type UnitTable = Record<string, UnitTableEntry>;\n\n/** Divided by the reciprocal below 1: 12 * 0.1 is 1.2000000000000002, 12 / 10 is 1.2. */\nfunction scaled(n: number, factor: number): number {\n return factor < 1 ? n / (1 / factor) : n * factor;\n}\n\n/** A unit table entry's scale, with the bare-factor shorthand widened. */\nfunction scaleOf(entry: UnitTableEntry): { factor: number; offset: number } {\n return typeof entry === 'number'\n ? { factor: entry, offset: 0 }\n : { factor: entry.factor, offset: entry.offset ?? 0 };\n}\n\n/**\n * The unit names in `text`, in reading order, when every one of them closes a\n * `<number><unit>` term — which is what tells `5ft 3in` from a malformed\n * `5ft 3`. Undefined when the text is not a run of whole terms.\n */\nfunction compoundTermsOf(text: string, units: Readonly<UnitTable>): string[] | undefined {\n const names: string[] = [];\n let rest = text.trimEnd();\n while (rest !== '') {\n const name = unitSuffixOf(rest, units);\n if (name === undefined) return undefined;\n names.push(name);\n const before = rest.slice(0, -name.length);\n const m = /(\\d+(?:\\.\\d+)?|\\.\\d+)\\s*$/.exec(before);\n if (!m) return undefined;\n rest = before.slice(0, m.index).trimEnd();\n // A sign leads the whole value, so it ends the walk rather than a term.\n if (rest === '-' || rest === '+' || rest === MINUS_SIGN) rest = '';\n }\n return names.length === 0 ? undefined : names.reverse();\n}\n\n/**\n * `5ft 3in` as one number in the shown unit. Every term scales and they sum;\n * a leading sign carries across all of them, so `-5ft 3in` is −63in and not\n * −57. Offsets have no meaning in a sum — 1K + 2degC is not a temperature —\n * so a term carrying one makes the whole value unreadable.\n */\nfunction compoundValue(names: string[], text: string, units: Readonly<UnitTable>): number {\n const digits = text.match(/\\d+(?:\\.\\d+)?|\\.\\d+/g);\n if (!digits || digits.length !== names.length) return Number.NaN;\n const sign = /^\\s*[-\\u2212]/.test(text) ? -1 : 1;\n let total = 0;\n for (const [i, name] of names.entries()) {\n const { factor, offset } = scaleOf(units[name]!);\n if (offset !== 0) return Number.NaN;\n total += scaled(Number(digits[i]), factor);\n }\n return sign * total;\n}\n\n/** The longest unit name `text` ends with — exact case first, then any case. */\nfunction unitSuffixOf(text: string, units: Readonly<UnitTable>): string | undefined {\n const names = Object.keys(units).filter((n) => n !== '').sort((a, b) => b.length - a.length);\n const lower = text.toLowerCase();\n return names.find((n) => text.endsWith(n)) ?? names.find((n) => lower.endsWith(n.toLowerCase()));\n}\n\n/** {@link String} with the leading ASCII hyphen swapped for {@link MINUS_SIGN}.\n * Locale-independent, unlike `toLocaleString`. */\nfunction signedString(value: number): string {\n return String(value).replace(/^-/, MINUS_SIGN);\n}\n\n/**\n * Formats a zoom factor for display. Below 2x a percentage reads naturally;\n * past it the numbers get long and a multiplier is what people say out loud,\n * so 250% shows as `2.5x`. Past 100x a tenth is noise, so the decimal is\n * dropped and thousands are grouped: `1009.74` reads as `1,010x`.\n */\nexport function formatZoom(zoom: number): string {\n if (!Number.isFinite(zoom)) return String(zoom);\n if (zoom <= 2) return `${signedString(Math.round(zoom * 100))}%`;\n if (zoom >= 100) return `${Math.round(zoom).toLocaleString('en-US')}x`;\n return `${signedString(Math.round(zoom * 10) / 10)}x`;\n}\n","import { forwardRef, type ReactNode, type Ref } from 'react';\nimport {\n Checkbox as RACCheckbox,\n type CheckboxProps as RACCheckboxProps,\n} from 'react-aria-components';\nimport s from './Checkbox.module.css';\n\n/**\n * Props for {@link Checkbox}, on top of React Aria's `Checkbox` props. The\n * label is passed as children.\n */\nexport type CheckboxProps = Omit<RACCheckboxProps, 'children' | 'className'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/**\n * Single checkbox wrapping React Aria's Checkbox. Supports indeterminate\n * via `isIndeterminate`. The label is supplied as children.\n */\nexport const Checkbox = forwardRef(function Checkbox(\n props: CheckboxProps,\n ref: Ref<HTMLLabelElement>,\n) {\n const { children, className, ...rest } = props;\n return (\n <RACCheckbox\n {...rest}\n ref={ref}\n className={[s.checkbox, className].filter(Boolean).join(' ')}\n >\n {({ isIndeterminate }) => (\n <>\n <span className={s.box}>\n <svg className={s.checkmark} viewBox=\"0 0 14 14\" aria-hidden=\"true\">\n {isIndeterminate ? (\n <line x1=\"3\" y1=\"7\" x2=\"11\" y2=\"7\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n ) : (\n <polyline\n points=\"3,7.5 6,10.5 11,4.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n )}\n </svg>\n </span>\n {children !== undefined && <span className={s.label}>{children}</span>}\n </>\n )}\n </RACCheckbox>\n );\n});\n","import type { ReactNode } from 'react';\nimport s from './Field.module.css';\n\n/**\n * Whether a {@link Field} stacks its label above the control or sits them\n * side by side.\n */\nexport type FieldOrientation = 'stacked' | 'row';\n\n/** Props for {@link Field}. */\nexport type FieldProps = {\n orientation?: FieldOrientation;\n className?: string;\n children?: ReactNode;\n};\n\n/**\n * Layout primitive that arranges a label, control, hint, and error in the\n * canonical weasel-ui form-row shape. The control itself owns its semantics\n * (RAC `TextField`, `Checkbox`, etc.); this just paints the layout.\n *\n * Most users will instead reach for `Input` / `Checkbox` / `Switch`, which\n * compose Field internally. Use Field directly when you need a custom\n * control to sit in the same visual rhythm.\n */\nexport function Field({ orientation = 'stacked', className, children }: FieldProps) {\n const cls = [s.field, orientation === 'row' && s.row, className].filter(Boolean).join(' ');\n return <div className={cls}>{children}</div>;\n}\n\n/**\n * The class names {@link Field} paints its slots with, so a control composing\n * its own layout can match the same form-row rhythm.\n */\nexport const fieldClasses = {\n root: s.field,\n row: s.row,\n label: s.label,\n hint: s.hint,\n error: s.error,\n};\n","import {\n Children,\n isValidElement,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport {\n Select as RACSelect,\n Label,\n Button as RACButton,\n SelectValue,\n Popover as RACPopover,\n ListBox as RACListBox,\n ListBoxItem as RACListBoxItem,\n ListBoxSection as RACListBoxSection,\n Header,\n Text,\n FieldError,\n type SelectProps as RACSelectProps,\n type ListBoxItemProps as RACListBoxItemProps,\n type ValidationResult,\n} from 'react-aria-components';\nimport { fieldClasses, type FieldOrientation } from '../Field/Field';\nimport { useOverlayPortal, type OverlayPortalProps } from '../../overlays/portalHost';\nimport s from './Select.module.css';\nimport { TriggerTooltip, segmentTooltipContent, type SegmentTooltipFields } from '../segmentTooltip';\n\n/** One option in a {@link Select}'s `options` list. */\nexport type SelectOption = {\n value: string;\n label: ReactNode;\n isDisabled?: boolean;\n /**\n * Plain-text form of `label`, for type-to-select and screen readers.\n * Only needed when `label` isn't a bare string — a label built from\n * elements has no text React Aria can read off it. A string label\n * supplies this itself.\n */\n textValue?: string;\n};\n\n/** A titled group of options in a {@link Select}'s `options` list. */\nexport type SelectOptionGroup<T extends Key = string> = {\n title: ReactNode;\n options: ReadonlyArray<SelectOption & { value: T }>;\n};\n\ntype Key = string | number;\n\nfunction isGroup<T extends Key>(\n entry: (SelectOption & { value: T }) | SelectOptionGroup<T>,\n): entry is SelectOptionGroup<T> {\n return 'options' in entry;\n}\n\n/** How a {@link Select} trigger signals that it opens a list. */\nexport type SelectIndicator = 'chevron' | 'underline' | 'none';\n\n/** Where a {@link Select}'s list opens relative to its trigger. */\nexport type SelectPopup = 'over' | 'below';\n\n/**\n * Props for {@link Select}, on top of React Aria's `Select` props, with the\n * selection key narrowed to the option value type.\n */\nexport type SelectProps<T extends Key = string> = Omit<RACSelectProps<object>, 'children' | 'className' | 'selectedKey' | 'defaultSelectedKey' | 'onSelectionChange'> & {\n label?: ReactNode;\n /**\n * `'stacked'` (the default) puts the label above the trigger; `'row'` sets it\n * beside the trigger at its own width, with any description or error on a\n * line below. Same vocabulary as {@link Field}'s `orientation`.\n */\n orientation?: FieldOrientation;\n description?: ReactNode;\n errorMessage?: ReactNode | ((v: ValidationResult) => ReactNode);\n placeholder?: string;\n /**\n * Either pass `options` for a quick render, or `children` for full control.\n * An entry with `title` and `options` of its own is a titled section.\n */\n options?: ReadonlyArray<(SelectOption & { value: T }) | SelectOptionGroup<T>>;\n children?: ReactNode;\n selectedKey?: T | null;\n defaultSelectedKey?: T;\n onSelectionChange?: (key: T) => void;\n /**\n * `'fill'` (the default) takes the width of whatever row the select sits in.\n * `'fit'` sizes the trigger to its widest option, so it neither swallows a\n * toolbar's slack nor changes width as the selection moves.\n */\n width?: 'fill' | 'fit';\n /** `'bare'` drops the box, for a select set in a row of other chrome such as a property row. */\n variant?: 'field' | 'bare';\n /**\n * How the trigger says it opens a list. `'chevron'` draws the caret beside\n * the value; `'underline'` marks the value itself, dotted at rest and solid\n * while it is pointed at or open; `'none'` says nothing. Unset takes the\n * variant's own: a boxed select shows the caret, a bare one — set in a row\n * where 10px of caret is a tenth of the value's width — underlines.\n */\n indicator?: SelectIndicator;\n /**\n * Where the list opens. `'over'` (the default) puts the selected row on the\n * trigger, its label in the trigger's own text column, so choosing what is\n * already chosen moves nothing; `'below'` hangs it under the trigger.\n */\n popup?: SelectPopup;\n /**\n * Id for the trigger button. React Aria puts a plain `id` on the wrapper,\n * which is not labelable, so an outer `<label for>` needs this to reach a\n * control the label can actually own.\n */\n triggerId?: string;\n className?: string;\n} & SegmentTooltipFields & OverlayPortalProps;\n\n/**\n * Form select wrapping React Aria's Select. Pass either `options` for a\n * quick declarative render or `children` of `<SelectItem>` for control over\n * each row; `<SelectSection>` (or an `options` entry with a `title`) groups\n * rows under a heading.\n *\n * The selection key type is parameterized so consumers with a string-literal\n * union for `value` (e.g. `'r' | 'g' | 'b'`) get a typed `onSelectionChange`.\n *\n * `shortcut` puts a kit tooltip on the trigger reading `Name (⌘K)`, named by\n * `aria-label` or a string `label`, as `Button` does; `tooltip` replaces that\n * text.\n */\nexport function Select<T extends Key = string>(props: SelectProps<T>) {\n const {\n label,\n orientation = 'stacked',\n description,\n errorMessage,\n placeholder,\n options,\n children,\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n width = 'fill',\n variant = 'field',\n indicator = variant === 'bare' ? 'underline' : 'chevron',\n popup = 'over',\n triggerId,\n className,\n portalContainer,\n shortcut,\n tooltip,\n ...rest\n } = props;\n\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const pressRef = useRef<Press | null>(null);\n const [nudge, setNudge] = useState(NO_NUDGE);\n\n return (\n <RACSelect\n {...rest}\n selectedKey={selectedKey}\n defaultSelectedKey={defaultSelectedKey}\n onSelectionChange={onSelectionChange ? (k) => onSelectionChange(k as T) : undefined}\n className={[\n s.field,\n width === 'fit' && s.fit,\n variant === 'bare' && s.bare,\n indicator === 'underline' && s.underlined,\n indicator === 'none' && s.plain,\n fieldClasses.root,\n orientation === 'row' && fieldClasses.row,\n orientation === 'row' && s.row,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {anchor}\n {label !== undefined && <Label className={`${fieldClasses.label} ${s.label}`}>{label}</Label>}\n <TriggerTooltip\n content={segmentTooltipContent({ tooltip, shortcut, ariaLabel: rest['aria-label'], label })}\n disabled={rest.isDisabled}\n >\n <RACButton\n id={triggerId}\n ref={triggerRef}\n className={s.trigger}\n onPointerDown={(e) => {\n pressRef.current = { x: e.clientX, y: e.clientY, at: performance.now() };\n }}\n >\n <SelectValue className={s.value}>\n {({ defaultChildren, isPlaceholder }) =>\n isPlaceholder ? (placeholder ?? defaultChildren) : defaultChildren\n }\n </SelectValue>\n {width === 'fit' && (\n <span className={s.sizer} aria-hidden=\"true\">\n {placeholder !== undefined && <span>{placeholder}</span>}\n {optionLabels(options, children).map((l, i) => (\n <span key={i}>\n <CheckMark />\n {l}\n </span>\n ))}\n </span>\n )}\n {indicator === 'chevron' && (\n <svg className={s.chevron} viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M2 4 L5 7 L8 4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </RACButton>\n </TriggerTooltip>\n {description !== undefined && (\n <Text slot=\"description\" className={`${fieldClasses.hint} ${s.below}`}>\n {description}\n </Text>\n )}\n <FieldError className={`${fieldClasses.error} ${s.below}`}>{errorMessage}</FieldError>\n {/* `data-weasel-overlay` marks DOM that belongs to this control but\n renders in a portal, outside the subtree the trigger sits in. Any\n consumer reasoning about \"did focus leave my component?\" via\n `closest()` gets the wrong answer without it — a text editor whose\n font menu lives here would end its session the moment the menu is\n clicked. */}\n <RACPopover\n className={s.popover}\n data-weasel-overlay=\"\"\n placement=\"bottom start\"\n offset={popup === 'over' ? nudge.offset : undefined}\n crossOffset={popup === 'over' ? nudge.crossOffset : undefined}\n shouldFlip={popup !== 'over'}\n {...portalProps}\n >\n {popup === 'over' && (\n <AlignOverTrigger\n triggerRef={triggerRef}\n pressRef={pressRef}\n applied={nudge}\n onMeasure={setNudge}\n />\n )}\n <RACListBox className={s.listbox}>\n {options !== undefined\n ? options.map((entry, i) =>\n isGroup(entry) ? (\n <SelectSection key={`section-${i}`} title={entry.title}>\n {entry.options.map(renderOption)}\n </SelectSection>\n ) : (\n renderOption(entry)\n ),\n )\n : children}\n </RACListBox>\n </RACPopover>\n </RACSelect>\n );\n}\n\ntype Nudge = { offset: number; crossOffset: number };\n\n/** Where and when the pointer went down on the trigger. */\ntype Press = { x: number; y: number; at: number };\n\n/** How long a press may last and how far it may travel and still be a click. */\nconst CLICK_MS = 500;\nconst CLICK_SLOP = 4;\n\nconst NO_NUDGE: Nudge = { offset: 0, crossOffset: 0 };\n\n/** The gap kept between a list and the viewport edge — React Aria's own\n * `containerPadding` default. */\nconst EDGE = 12;\n\n/** React Aria's own resting place for a popover: hanging under its trigger. */\nconst BELOW: Nudge = { offset: 8, crossOffset: 0 };\n\n/**\n * Lands the list so its selected row covers the trigger: same text column,\n * same line. The shift is handed back as the popover's own `offset` and\n * `crossOffset` rather than a transform, so React Aria keeps owning the\n * position and still holds the list inside the viewport.\n *\n * Measuring needs the list rendered, and the correction is applied by setting\n * state from a layout effect — React finishes that pass before the browser\n * paints, so the list is never seen at the uncorrected position.\n */\nfunction AlignOverTrigger({\n triggerRef,\n pressRef,\n applied,\n onMeasure,\n}: {\n triggerRef: RefObject<HTMLButtonElement | null>;\n pressRef: RefObject<Press | null>;\n applied: Nudge;\n onMeasure: (next: Nudge) => void;\n}) {\n // React Aria positions the popover but hands out no ref to it, so the\n // element is reached from inside: this marker's own parent.\n const markerRef = useRef<HTMLSpanElement>(null);\n // A measurement that settles takes two passes — one to place the list, one\n // to confirm. A cap is what keeps a list whose own placement changes its\n // measurement from renegotiating forever.\n const passes = useRef(0);\n useLayoutEffect(() => {\n const trigger = triggerRef.current;\n const popover = markerRef.current?.closest<HTMLElement>('[data-weasel-overlay]');\n if (!trigger || !popover || passes.current > 3) return;\n const value = trigger.querySelector(`.${s.value}`);\n // Nothing chosen yet, so there is no row that belongs over the trigger —\n // and putting an arbitrary one under the pointer arms it. A select showing\n // its placeholder hangs its list below, like any other dropdown.\n const label = popover.querySelector(`[data-selected] .${s.optionLabel}`);\n if (!value || !label) {\n if (applied.offset !== BELOW.offset || applied.crossOffset !== BELOW.crossOffset)\n onMeasure(BELOW);\n return;\n }\n\n // The trigger's own text alignment decides which edge the two labels are\n // matched on, and the list follows it so the selected row reads as the\n // trigger with the others unfolded around it.\n const align = getComputedStyle(trigger).getPropertyValue('--wzl-select-align').trim();\n const toEnd = align === 'right' || align === 'end';\n popover.dataset.align = toEnd ? 'end' : 'start';\n\n // Stated against each element's own box rather than measured as a gap to\n // close: React Aria repositions after this effect, so what is on screen\n // now is a frame behind, and a correction read off it would be applied to\n // a position that has already moved — the shift compounds every pass.\n // `bottom start` puts the list's top at the trigger's bottom and their\n // left edges together, so the two insets below are the whole story.\n const box = popover.getBoundingClientRect();\n const seat = trigger.getBoundingClientRect();\n const row = label.getBoundingClientRect();\n const shown = value.getBoundingClientRect();\n // React Aria holds the list inside the viewport across the trigger but not\n // along it, and `offset` moves it along: the selected row sits on the\n // trigger only as far as the rest of the list still fits on screen.\n const over = shown.top + shown.height / 2 - seat.top - (row.top + row.height / 2 - box.top) - seat.height;\n const viewHeight = trigger.ownerDocument.documentElement.clientHeight;\n const lowest = viewHeight - EDGE - box.height - seat.bottom;\n const next = {\n offset: Math.max(EDGE - seat.bottom, Math.min(over, lowest)),\n crossOffset: toEnd\n ? shown.right - seat.left - (row.right - box.left)\n : shown.left - seat.left - (row.left - box.left),\n };\n if (Math.abs(next.offset - applied.offset) < 0.5 && Math.abs(next.crossOffset - applied.crossOffset) < 0.5)\n return;\n passes.current += 1;\n onMeasure(next);\n });\n\n // The list covers the trigger, so the release that ends the click opening it\n // lands on a row — and a row selects on release, which shuts the list again\n // before it has been seen. A click is a press and a release in the same\n // place: that one is the opening gesture and belongs to the trigger, and the\n // list keeps every release after it. Press, hold, drag and release still\n // picks a row, which is the gesture a list over its trigger is for.\n useEffect(() => {\n const doc = triggerRef.current?.ownerDocument;\n if (!doc) return;\n const onUp = (e: PointerEvent) => {\n doc.removeEventListener('pointerup', onUp, true);\n const press = pressRef.current;\n if (!press || performance.now() - press.at > CLICK_MS) return;\n if (Math.hypot(e.clientX - press.x, e.clientY - press.y) > CLICK_SLOP) return;\n e.preventDefault();\n e.stopPropagation();\n };\n doc.addEventListener('pointerup', onUp, true);\n return () => doc.removeEventListener('pointerup', onUp, true);\n }, [triggerRef, pressRef]);\n\n return <span ref={markerRef} hidden />;\n}\n\n/* A selected row's mark travels into the trigger with its label, so a\n `width='fit'` sizer has to allow for it too. */\nfunction CheckMark() {\n return (\n <svg className={s.check} viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <polyline points=\"1.5,5 4,7.5 8.5,3\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n\nfunction renderOption<T extends Key>(o: SelectOption & { value: T }) {\n return (\n <SelectItem key={String(o.value)} id={o.value} isDisabled={o.isDisabled} textValue={o.textValue}>\n {o.label}\n </SelectItem>\n );\n}\n\n/**\n * The labels a `width='fit'` trigger measures itself against. In the children\n * form the label sits one element deep, inside a `SelectItem`, or two inside a\n * `SelectSection`.\n */\nfunction optionLabels(\n options: ReadonlyArray<SelectOption | SelectOptionGroup<Key>> | undefined,\n children: ReactNode,\n): ReactNode[] {\n if (options !== undefined)\n return options.flatMap((o) => ('options' in o ? o.options.map((g) => g.label) : [o.label]));\n return Children.toArray(children).flatMap((c) => {\n if (!isValidElement<{ children?: ReactNode }>(c)) return [c];\n return c.type === SelectSection ? optionLabels(undefined, c.props.children) : [c.props.children];\n });\n}\n\n/** Props for {@link SelectSection}. */\nexport type SelectSectionProps = {\n /** Heading shown above the section's rows; it also names the group for\n * screen readers. */\n title?: ReactNode;\n children?: ReactNode;\n className?: string;\n};\n\n/** A titled group of `SelectItem` rows in a {@link Select}'s list. */\nexport function SelectSection({ title, children, className }: SelectSectionProps) {\n return (\n <RACListBoxSection className={[s.section, className].filter(Boolean).join(' ')}>\n {title !== undefined && <Header className={s.sectionHeader}>{title}</Header>}\n {children}\n </RACListBoxSection>\n );\n}\n\n/** Props for {@link SelectItem}, on top of React Aria's `ListBoxItem` props. */\nexport type SelectItemProps = Omit<RACListBoxItemProps, 'className' | 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/**\n * Every row renders a check mark beside its label, so from React Aria's\n * side the children are never plain text and it can't derive the string\n * type-to-select and screen readers need — it warns once per row. A string\n * label already *is* that string, so derive it rather than making every\n * call site restate it; anything richer has to say what it reads as.\n */\nfunction textValueOf(children: ReactNode, explicit: string | undefined): string | undefined {\n if (explicit !== undefined) return explicit;\n return typeof children === 'string' || typeof children === 'number'\n ? String(children)\n : undefined;\n}\n\n/**\n * One row in a {@link Select}'s list, with a leading check mark when\n * selected. A string child supplies its own `textValue`; anything richer must\n * pass one so type-to-select and screen readers have something to read.\n */\nexport function SelectItem({ children, className, textValue, ...rest }: SelectItemProps) {\n return (\n <RACListBoxItem\n {...rest}\n textValue={textValueOf(children, textValue)}\n className={[s.option, className].filter(Boolean).join(' ')}\n >\n <CheckMark />\n {/* A box around the label, not just text: landing the list over its\n trigger means measuring where this row's label sits. */}\n <span className={s.optionLabel}>{children}</span>\n </RACListBoxItem>\n );\n}\n","import { forwardRef, type ReactNode, type Ref } from 'react';\nimport {\n TextField,\n Label,\n Input as RACInput,\n Text,\n FieldError,\n type TextFieldProps as RACTextFieldProps,\n type ValidationResult,\n} from 'react-aria-components';\nimport { fieldClasses, type FieldOrientation } from '../Field/Field';\nimport s from './Input.module.css';\n\n/** Props for {@link Input}, on top of React Aria's `TextField` props. */\nexport type InputProps = Omit<RACTextFieldProps, 'children' | 'className'> & {\n label?: ReactNode;\n /**\n * `'stacked'` (the default) puts the label above the field; `'row'` sets it\n * beside the field at its own width, with any description or error on a\n * line below. Same vocabulary as {@link Field}'s `orientation`.\n */\n orientation?: FieldOrientation;\n description?: ReactNode;\n errorMessage?: ReactNode | ((v: ValidationResult) => ReactNode);\n placeholder?: string;\n leadingAdornment?: ReactNode;\n trailingAdornment?: ReactNode;\n className?: string;\n};\n\n/**\n * Single-line text input wrapping React Aria's TextField. Supplies a\n * default skin against the `--wzl-*` token system, and exposes the\n * familiar label / description / errorMessage / adornment slot shape.\n *\n * `ref` forwards to the underlying `<input>`.\n */\nexport const Input = forwardRef(function Input(\n props: InputProps,\n ref: Ref<HTMLInputElement>,\n) {\n const {\n label,\n orientation = 'stacked',\n description,\n errorMessage,\n placeholder,\n leadingAdornment,\n trailingAdornment,\n className,\n ...textFieldProps\n } = props;\n\n return (\n <TextField\n {...textFieldProps}\n className={[\n s.field,\n fieldClasses.root,\n orientation === 'row' && fieldClasses.row,\n orientation === 'row' && s.row,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {label !== undefined && <Label className={`${fieldClasses.label} ${s.label}`}>{label}</Label>}\n <div className={s.frame}>\n {leadingAdornment !== undefined && <span className={s.adornment}>{leadingAdornment}</span>}\n <RACInput ref={ref} placeholder={placeholder} />\n {trailingAdornment !== undefined && <span className={s.adornment}>{trailingAdornment}</span>}\n </div>\n {description !== undefined && (\n <Text slot=\"description\" className={`${fieldClasses.hint} ${s.below}`}>\n {description}\n </Text>\n )}\n <FieldError className={`${fieldClasses.error} ${s.below}`}>{errorMessage}</FieldError>\n </TextField>\n );\n});\n","import { forwardRef, type ReactNode, type Ref } from 'react';\nimport {\n NumberField as RACNumberField,\n Label,\n Input as RACInput,\n Group,\n Button as RACButton,\n Text,\n FieldError,\n type NumberFieldProps as RACNumberFieldProps,\n type ValidationResult,\n} from 'react-aria-components';\nimport { fieldClasses, type FieldOrientation } from '../Field/Field';\nimport s from './NumberField.module.css';\n\n/** Props for {@link NumberField}, on top of React Aria's `NumberField` props. */\nexport type NumberFieldProps = Omit<RACNumberFieldProps, 'children' | 'className'> & {\n label?: ReactNode;\n /**\n * `'stacked'` (the default) puts the label above the field; `'row'` sets it\n * beside the field at its own width, with any description or error on a\n * line below. Same vocabulary as {@link Field}'s `orientation`.\n */\n orientation?: FieldOrientation;\n description?: ReactNode;\n errorMessage?: ReactNode | ((v: ValidationResult) => ReactNode);\n /** Hide the up/down stepper buttons. Defaults to false. */\n hideSteppers?: boolean;\n /** Render with no box until focused — the readout treatment the property\n * rows use, for a value that sits inside other chrome rather than in a form. */\n ghost?: boolean;\n /** Native input placeholder — e.g. `'Mixed'` for a multi-selection\n * editor with no shared value. */\n placeholder?: string;\n /**\n * `'fill'` (the default) takes the width of whatever row the field sits in.\n * `'fit'` sizes it to `--wzl-number-field-width` (`9ch` by default) plus its\n * own chrome, rather than to the input's 20-character intrinsic width.\n */\n width?: 'fill' | 'fit';\n className?: string;\n};\n\n/**\n * Numeric input with stepper buttons, wrapping React Aria's NumberField and\n * supplying the same label / description / errorMessage slots as `Input`.\n * Arrow keys and scroll step the value; parsing and formatting are React\n * Aria's.\n *\n * `ref` forwards to the underlying `<input>`.\n */\nexport const NumberField = forwardRef(function NumberField(\n props: NumberFieldProps,\n ref: Ref<HTMLInputElement>,\n) {\n const {\n label,\n orientation = 'stacked',\n description,\n errorMessage,\n hideSteppers,\n ghost,\n placeholder,\n width = 'fill',\n className,\n ...rest\n } = props;\n return (\n <RACNumberField\n {...rest}\n className={[\n s.field,\n width === 'fit' && s.fit,\n fieldClasses.root,\n orientation === 'row' && fieldClasses.row,\n orientation === 'row' && s.row,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {label !== undefined && <Label className={`${fieldClasses.label} ${s.label}`}>{label}</Label>}\n <Group className={ghost ? `${s.frame} ${s.ghost}` : s.frame}>\n <RACInput ref={ref} placeholder={placeholder} />\n {!hideSteppers && (\n <div className={s.steppers}>\n <RACButton slot=\"increment\" className={s.stepper} aria-label=\"Increment\">▲</RACButton>\n <RACButton slot=\"decrement\" className={s.stepper} aria-label=\"Decrement\">▼</RACButton>\n </div>\n )}\n </Group>\n {description !== undefined && (\n <Text slot=\"description\" className={`${fieldClasses.hint} ${s.below}`}>\n {description}\n </Text>\n )}\n <FieldError className={`${fieldClasses.error} ${s.below}`}>{errorMessage}</FieldError>\n </RACNumberField>\n );\n});\n","import { useRef, useState } from 'react';\nimport { formatNumber, parseNumber, type UnitTable } from '../../format/number';\nimport { fieldClasses } from '../Field/Field';\nimport s from './NumberField.module.css';\n\n/** Props for {@link UnitField}. */\nexport interface UnitFieldProps {\n /** The value in the unit the field shows. NaN shows an empty field. */\n value: number;\n /** Fired with a value the field read and clamped, in the unit it shows. */\n onChange: (value: number) => void;\n minValue?: number;\n maxValue?: number;\n /** What an arrow key adds or takes away. Defaults to 1. */\n step?: number;\n /** Units a person may type, each mapped to the factor that turns a number\n * in it into the unit the field shows: `{ mm: 0.1, cm: 1 }`. */\n accepts?: Readonly<UnitTable>;\n placeholder?: string;\n /** Render with no box until focused, as {@link NumberField}'s `ghost` does. */\n ghost?: boolean;\n /** As {@link NumberField}'s `width`. */\n width?: 'fill' | 'fit';\n className?: string;\n 'aria-label'?: string;\n}\n\n/**\n * A number typed as text, so it can carry a unit: `12mm` in a field showing\n * centimeters commits `1.2`. Commits on blur or Enter, reverts on Escape or on\n * text it cannot read, clamps to its bounds, and steps with the arrow keys.\n * React Aria's `NumberField` refuses letters as they are typed, which is why\n * this is not that.\n */\nexport function UnitField({\n value,\n onChange,\n minValue,\n maxValue,\n step = 1,\n accepts,\n placeholder,\n ghost,\n width = 'fill',\n className,\n 'aria-label': ariaLabel,\n}: UnitFieldProps) {\n const [draft, setDraft] = useState<string | null>(null);\n const canceled = useRef(false);\n const text = Number.isFinite(value)\n ? formatNumber(value, { useGrouping: false, maximumFractionDigits: 20 })\n : '';\n const clamp = (n: number) =>\n Math.min(maxValue ?? Infinity, Math.max(minValue ?? -Infinity, n));\n const commit = (n: number) => {\n const next = clamp(n);\n if (next !== value) onChange(next);\n };\n\n return (\n <div\n className={[s.field, width === 'fit' && s.fit, fieldClasses.root, className]\n .filter(Boolean)\n .join(' ')}\n >\n <div className={ghost ? `${s.frame} ${s.ghost}` : s.frame}>\n <input\n type=\"text\"\n inputMode=\"decimal\"\n aria-label={ariaLabel}\n placeholder={placeholder}\n value={draft ?? text}\n onChange={(e) => setDraft(e.target.value)}\n onFocus={() => {\n canceled.current = false;\n }}\n onBlur={() => {\n if (draft !== null && !canceled.current) {\n const n = parseNumber(draft, accepts);\n if (Number.isFinite(n)) commit(n);\n }\n setDraft(null);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.currentTarget.blur();\n } else if (e.key === 'Escape') {\n canceled.current = true;\n e.currentTarget.blur();\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const typed = draft === null ? value : parseNumber(draft, accepts);\n const from = Number.isFinite(typed) ? typed : 0;\n const next = clamp(from + (e.key === 'ArrowUp' ? step : -step));\n setDraft(null);\n if (next !== value) onChange(next);\n }\n }}\n />\n </div>\n </div>\n );\n}\n","import { useRef, type KeyboardEvent as ReactKeyboardEvent, type RefObject } from 'react';\n\n/** The only thing the hook needs to know about a bar's items: which are\n * skipped by arrow navigation. */\nexport type RovingItem = { disabled?: boolean };\n\n/** Options for {@link useRovingTabIndex}. */\nexport type UseRovingTabIndexOptions = {\n /** In the same order as the elements carrying `itemClassName`. */\n items: readonly RovingItem[];\n /** Class on the focusable element of each item, inside the container the\n * returned `rootRef` is attached to. Their DOM order must match `items`. */\n itemClassName: string;\n /** Index that carries `tabIndex=0`. Defaults to the first enabled item; a\n * radiogroup-style bar passes its selected index so Tab lands on the\n * current value. */\n tabStopIndex?: number;\n /** Called with the new index as arrow/Home/End focus moves, before focus\n * moves. This is where a selection-follows-focus bar commits the value. */\n onNavigate?: (index: number) => void;\n /** Space/Enter on the item at `index`. When omitted the keypress is left\n * alone, which on a native `<button>` produces an ordinary click. */\n onActivate?: (index: number) => void;\n};\n\n/**\n * What {@link useRovingTabIndex} returns: a container ref plus the per-item\n * `tabIndex` and `onKeyDown` values to spread onto each item.\n */\nexport type RovingTabIndex<T extends HTMLElement = HTMLDivElement> = {\n /** Attach to the container element that holds the items. */\n rootRef: RefObject<T | null>;\n /** `tabIndex` value for the item at `index`. */\n tabIndexFor: (index: number) => 0 | -1;\n /** `onKeyDown` for the item at `index`. */\n onKeyDown: (index: number) => (e: ReactKeyboardEvent<HTMLElement>) => void;\n};\n\nfunction firstEnabledIndex(items: readonly RovingItem[]): number {\n for (let i = 0; i < items.length; i++) if (!items[i].disabled) return i;\n return -1;\n}\n\nfunction lastEnabledIndex(items: readonly RovingItem[]): number {\n for (let i = items.length - 1; i >= 0; i--) if (!items[i].disabled) return i;\n return -1;\n}\n\nfunction nextEnabledIndex(items: readonly RovingItem[], from: number): number {\n const n = items.length;\n for (let k = 1; k <= n; k++) {\n const i = (from + k + n) % n;\n if (!items[i].disabled) return i;\n }\n return from;\n}\n\nfunction prevEnabledIndex(items: readonly RovingItem[], from: number): number {\n const n = items.length;\n for (let k = 1; k <= n; k++) {\n const i = (from - k + n) % n;\n if (!items[i].disabled) return i;\n }\n return from;\n}\n\n/**\n * Roving tabindex for a bar of items: one item is in the tab order, and the\n * arrow keys move focus among the rest, skipping disabled ones and wrapping\n * at both ends. Home and End go to the first and last enabled item. Both axes\n * navigate, so the same bar works laid out either way.\n *\n * Backs `ButtonBar`, `OptionsBar`, and `ToggleBar`.\n *\n * **When a bar should not use this.** What decides it is the items, not who\n * owns them. A container of compound controls — a number field, a select, a\n * color field — must leave the arrow keys alone, because those controls edit\n * their own value with them; taking the arrows over would break the control\n * to navigate between controls. `ToolOptionsBar` is that case: it draws its\n * own controls from a tool's schema now rather than taking arbitrary\n * children, and a schema-drawn number field eats arrows exactly as a\n * hand-placed one did, so it keeps plain DOM tab order. A bar whose items are\n * all simple buttons is the case this hook is for.\n *\n * With every item disabled there is no tab stop and the bar drops out of the\n * tab order entirely.\n */\nexport function useRovingTabIndex<T extends HTMLElement = HTMLDivElement>(\n options: UseRovingTabIndexOptions,\n): RovingTabIndex<T> {\n const { items, itemClassName, onNavigate, onActivate } = options;\n const rootRef = useRef<T | null>(null);\n\n const tabStopIndex = options.tabStopIndex ?? firstEnabledIndex(items);\n\n const focusItem = (index: number): void => {\n const root = rootRef.current;\n if (!root) return;\n const elements = root.querySelectorAll<HTMLElement>(`.${itemClassName}`);\n elements[index]?.focus();\n };\n\n const onKeyDown = (index: number) => (e: ReactKeyboardEvent<HTMLElement>): void => {\n let nextIndex = -1;\n switch (e.key) {\n case 'ArrowLeft':\n case 'ArrowUp':\n nextIndex = prevEnabledIndex(items, index);\n break;\n case 'ArrowRight':\n case 'ArrowDown':\n nextIndex = nextEnabledIndex(items, index);\n break;\n case 'Home':\n nextIndex = firstEnabledIndex(items);\n break;\n case 'End':\n nextIndex = lastEnabledIndex(items);\n break;\n case ' ':\n case 'Enter':\n if (onActivate) {\n e.preventDefault();\n onActivate(index);\n }\n return;\n default:\n return;\n }\n if (nextIndex < 0 || nextIndex === index) return;\n e.preventDefault();\n onNavigate?.(nextIndex);\n focusItem(nextIndex);\n };\n\n return {\n rootRef,\n tabIndexFor: (index: number) => (index === tabStopIndex ? 0 : -1),\n onKeyDown,\n };\n}\n","import { type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport s from './ToggleBar.module.css';\nimport { useRovingTabIndex } from '../../useRovingTabIndex';\nimport { SegmentTooltip, segmentTooltipContent, type SegmentTooltipFields } from '../segmentTooltip';\n\n/** One segment of a {@link ToggleBar}, identified by its `value`. */\nexport type ToggleBarItem<V extends string | number = string> = {\n value: V;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n} & SegmentTooltipFields;\n\n/** Segment height and type scale for a {@link ToggleBar}. */\nexport type ToggleBarSize = 'sm' | 'md';\n/** Visual treatment of a {@link ToggleBar}. */\nexport type ToggleBarVariant = 'default' | 'minimal' | 'flat';\n\ntype CommonProps = {\n ariaLabel?: string;\n className?: string;\n height?: number;\n /** Size variant. `sm` is ~60% of the default height with reduced padding\n * and font size — sized for dense surfaces like lab control panels. */\n size?: ToggleBarSize;\n /** Visual variant. `minimal` strips the pill track and glass treatment;\n * selection becomes a flat accent. For dense diagnostic surfaces. */\n variant?: ToggleBarVariant;\n};\n\n/**\n * Props for {@link ToggleBar}, discriminated on `mode`. Single mode is\n * controlled by one value or `null`; multiple mode by an array, and only it\n * accepts `mixedValues`.\n */\nexport type ToggleBarProps<V extends string | number = string> =\n | (CommonProps & {\n mode?: 'single';\n items: readonly ToggleBarItem<V>[];\n value: V | null;\n onChange: (next: V | null) => void;\n allowDeselect?: boolean;\n })\n | (CommonProps & {\n mode: 'multiple';\n items: readonly ToggleBarItem<V>[];\n value: readonly V[];\n /**\n * Values that are neither on nor off — the sources this bar\n * aggregates disagree (a text range that is bold in part of it, a\n * multi-selection whose nodes differ). Rendered `aria-pressed=\"mixed\"`,\n * the ARIA tri-state a toggle button actually has, rather than\n * `SelectionPanel`'s reduced-opacity-plus-`title` workaround for\n * `Switch`, which has no indeterminate state to render.\n *\n * `value` wins where the two lists overlap, so a caller that can't\n * cheaply keep them disjoint doesn't get an ambiguous segment.\n *\n * Clicking a mixed segment turns it fully **on**, matching the\n * everywhere-else convention (and `toggleFlagInRange`'s rule for a\n * partially-styled text range) that a mixed toggle resolves toward\n * the affirmative rather than clearing.\n */\n mixedValues?: readonly V[];\n onChange: (next: V[]) => void;\n });\n\n/**\n * Segmented control for choosing among a fixed set of values — one of them\n * (`mode: 'single'`, the default) or any number (`mode: 'multiple'`).\n *\n * Single mode ignores a click on the already-selected segment unless\n * `allowDeselect` is set. Arrow keys move focus without changing the value;\n * Space and Enter commit.\n */\nexport function ToggleBar<V extends string | number = string>(props: ToggleBarProps<V>): ReactElement {\n const { items, ariaLabel, className, height, size, variant } = props;\n const mode = props.mode ?? 'single';\n\n const isSelected = (value: V): boolean => {\n if (mode === 'multiple') return (props.value as readonly V[]).includes(value);\n return (props.value as V | null) === value;\n };\n\n /** Mixed only in multiple mode, and only where `value` doesn't already\n * claim the segment. Single mode has nothing to be mixed about — its\n * aggregate is one value or none. */\n const isMixed = (value: V): boolean => {\n if (mode !== 'multiple') return false;\n const mixed = (props as { mixedValues?: readonly V[] }).mixedValues;\n return mixed !== undefined && mixed.includes(value) && !isSelected(value);\n };\n\n const handleClick = (index: number) => () => {\n const item = items[index];\n if (item.disabled) return;\n if (mode === 'multiple') {\n const current = props.value as readonly V[];\n const next = current.includes(item.value)\n ? current.filter(v => v !== item.value)\n : [...current, item.value];\n (props.onChange as (n: V[]) => void)(next);\n } else {\n const current = props.value as V | null;\n if (current === item.value) {\n if ((props as { allowDeselect?: boolean }).allowDeselect) {\n (props.onChange as (n: V | null) => void)(null);\n }\n return;\n }\n (props.onChange as (n: V | null) => void)(item.value);\n }\n };\n\n const selectedIndex = mode === 'single'\n ? items.findIndex(it => it.value === (props.value as V | null))\n : -1;\n\n const roving = useRovingTabIndex({\n items,\n itemClassName: s.segment,\n // Single mode is a radiogroup: the tab stop is the current value, and\n // arrow keys move the selection with the focus. Multiple mode is a set of\n // independent toggles — focus alone moves, and Space/Enter flips.\n tabStopIndex: selectedIndex >= 0 && !items[selectedIndex].disabled ? selectedIndex : undefined,\n onNavigate: mode === 'single'\n ? (index) => (props.onChange as (n: V | null) => void)(items[index].value)\n : undefined,\n onActivate: mode === 'multiple' ? (index) => handleClick(index)() : undefined,\n });\n\n const style: CSSProperties | undefined = height !== undefined\n ? ({ ['--tb-h' as string]: `${height}px` } as CSSProperties)\n : undefined;\n\n const rootCls = [\n s.root,\n size && s[`size_${size}`],\n variant && s[`variant_${variant}`],\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <div\n ref={roving.rootRef}\n className={rootCls}\n role={mode === 'multiple' ? 'group' : 'radiogroup'}\n aria-label={ariaLabel}\n style={style}\n >\n {items.map((item, i) => {\n const selected = isSelected(item.value);\n const mixed = isMixed(item.value);\n const cls = [s.segment, selected && s.segmentSelected, mixed && s.segmentMixed]\n .filter(Boolean)\n .join(' ');\n return (\n <SegmentTooltip key={item.value} content={segmentTooltipContent(item)} disabled={item.disabled}>\n <button\n type=\"button\"\n role={mode === 'multiple' ? undefined : 'radio'}\n aria-checked={mode === 'multiple' ? undefined : selected}\n aria-pressed={mode === 'multiple' ? (mixed ? 'mixed' : selected) : undefined}\n aria-label={item.ariaLabel}\n disabled={item.disabled}\n tabIndex={roving.tabIndexFor(i)}\n className={cls}\n onClick={handleClick(i)}\n onKeyDown={roving.onKeyDown(i)}\n >\n {item.label}\n </button>\n </SegmentTooltip>\n );\n })}\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, type CSSProperties, type KeyboardEvent as ReactKeyboardEvent, type MouseEvent as ReactMouseEvent, type PointerEvent as ReactPointerEvent, type ReactElement, type ReactNode } from 'react';\nimport { openPointerSession, type PointerSession } from '@weasel-js/core';\nimport s from './Slider.module.css';\nimport { formatNumber } from '../../format/number';\n\n/**\n * Passed to a custom thumb renderer: the thumb box in CSS px, and whether\n * this thumb is the one being dragged.\n */\nexport type ThumbRenderCtx = {\n width: number;\n height: number;\n isActive: boolean;\n};\n\n/**\n * A thumb's appearance — one of the two built-in shapes, or a custom\n * renderer.\n */\nexport type ThumbShape =\n | 'round'\n | 'notched'\n | { render: (ctx: ThumbRenderCtx) => ReactNode };\n\n/**\n * One handle on a {@link Slider}. `bounds` narrows the range this particular\n * thumb may move within, either fixed or computed from the current thumb\n * list.\n */\nexport type Thumb = {\n value: number;\n label?: string;\n shape?: ThumbShape;\n bounds?: [number, number] | ((ctx: BoundsCtx) => [number, number]);\n /**\n * Spoken form of `value`, published as `aria-valuetext`. Required by ARIA\n * whenever `value` is not the quantity the user is choosing — an index into\n * a value list, a log-scaled position — since `aria-valuenow` alone then\n * announces a number that means nothing.\n */\n valueText?: string;\n};\n\n/**\n * Passed to a thumb's `bounds` function: the full thumb list and this thumb's\n * index in it, so a bound can be expressed relative to its neighbors.\n */\nexport type BoundsCtx = {\n thumbs: readonly Thumb[];\n index: number;\n};\n\n/**\n * Passed to `renderTrack`: the track's width in CSS px and a mapping from a\n * slider value to its 0..1 position along the track.\n */\nexport type TrackCtx = {\n trackWidth: number;\n valueToFraction: (v: number) => number;\n};\n\n/** A {@link Slider} stop that carries a label, drawn under the track at the stop. */\nexport type SliderStop = {\n value: number;\n label?: ReactNode;\n};\n\n/**\n * Props for {@link Slider}.\n *\n * `onInput` fires continuously through a drag; `onChange` fires once when it\n * ends and is the one to write to history.\n *\n * `stops` are attractors: a drag that passes within a few pixels of one lands\n * on it, and the arrow keys move stop to stop. `step` still quantizes the\n * values between them. Each one is drawn on the track as a mark; pass\n * `showStops: false` for a track whose own paint already reads as the stops.\n * A stop given as a {@link SliderStop} with a `label` gets that label drawn\n * under it; `stopLabels` narrows the row to the two ends or turns it off.\n *\n * `snap: 'strict'` makes every stop a detent the thumb must rest on: drags and\n * track presses land on the nearest one, and `step` no longer applies.\n * `spacing: 'even'` places the stops at equal intervals, runs the track from\n * the first stop to the last, and maps values linearly within each gap — so a\n * geometric list (0.25/0.5/1/2/4) gets usable room for every stop instead of\n * four crowded into the first fifth. Both need stops; with fewer than two,\n * `'even'` falls back to linear.\n *\n * `trackClick: 'move-nearest'` makes a press on bare track send the closest\n * thumb there, focus it, and continue as a drag. It is the default for a\n * single thumb. With several it defaults to `'none'`, because on a\n * multi-thumb editor a stray click would yank a stop the user was not aiming\n * at; `onAddThumb`, where it is set, keeps the track press.\n *\n * `constraint: 'ordered'` keeps thumbs from crossing each other. Supplying\n * `onAddThumb` makes a click on empty track create a thumb, and supplying\n * `onRemoveThumb` lets a right-click or a drag off the track remove one —\n * both callbacks can decline by returning `null`/`false`. `allowShiftAll`\n * makes shift-drag translate every thumb together.\n */\nexport type SliderProps<T extends Thumb = Thumb> = {\n thumbs: readonly T[];\n onInput: (next: T[]) => void;\n onChange?: (next: T[]) => void;\n min: number;\n max: number;\n step?: number;\n stops?: readonly (number | SliderStop)[];\n showStops?: boolean;\n stopLabels?: 'all' | 'ends' | 'none';\n snap?: 'magnetic' | 'strict';\n spacing?: 'linear' | 'even';\n trackClick?: 'none' | 'move-nearest';\n constraint?: 'free' | 'ordered';\n onAddThumb?: (atValue: number) => T | null;\n onRemoveThumb?: (index: number) => boolean;\n allowShiftAll?: boolean;\n renderTrack?: (ctx: TrackCtx) => ReactNode;\n trackHeight?: number;\n /** `'slim'` drives the track and thumb from the kit's slider tokens, so a\n * Slider matches the property rows. `trackHeight` still wins if given. */\n density?: 'default' | 'slim';\n renderReadout?: (thumb: T, index: number) => ReactNode;\n readoutPlacement?: 'none' | 'inline-after' | 'below-thumb';\n ariaLabel?: string;\n className?: string;\n};\n\nfunction quantize(v: number, step: number | undefined, min: number): number {\n if (step === undefined || step <= 0) return v;\n return Math.round((v - min) / step) * step + min;\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, v));\n}\n\n/** How close a drag has to come to a stop, in track pixels, to land on it. */\nconst STOP_SNAP_PX = 8;\n\n/** A custom `ThumbShape.render` may put interactive content inside the thumb,\n * and capture would retarget pointerup and kill the click on it. */\nconst NO_CAPTURE = { capture: false } as const;\n\n/** The stops that are actually reachable: inside the range, deduped, ascending.\n * A duplicate keeps the first label given for its value. */\nfunction usableStops(stops: SliderProps['stops'], min: number, max: number): SliderStop[] {\n if (!stops || stops.length === 0) return [];\n const byValue = new Map<number, SliderStop>();\n for (const stop of stops) {\n const s = typeof stop === 'number' ? { value: stop } : stop;\n if (s.value < min || s.value > max) continue;\n const seen = byValue.get(s.value);\n if (!seen || (seen.label === undefined && s.label !== undefined)) byValue.set(s.value, s);\n }\n return [...byValue.values()].sort((a, b) => a.value - b.value);\n}\n\n/** The stop nearest `v` along the track, or `v` itself when none lies within\n * `tolerance` (a track fraction). Measured on the track rather than in value\n * units so evenly spaced stops attract over the same distance. */\nfunction attract(v: number, stops: number[], tolerance: number, toFraction: (v: number) => number): number {\n const f = toFraction(v);\n let best = v;\n let bestGap = tolerance;\n for (const stop of stops) {\n const gap = Math.abs(toFraction(stop) - f);\n if (gap <= bestGap) {\n best = stop;\n bestGap = gap;\n }\n }\n return best;\n}\n\n/** The stop `count` places past `v` in `direction`, saturating at either end. */\nfunction stepStops(stops: number[], v: number, direction: 1 | -1, count: number): number {\n if (direction > 0) {\n const first = stops.findIndex(stop => stop > v);\n if (first === -1) return stops[stops.length - 1];\n return stops[Math.min(stops.length - 1, first + count - 1)];\n }\n let first = -1;\n for (let i = stops.length - 1; i >= 0; i--) {\n if (stops[i] < v) {\n first = i;\n break;\n }\n }\n if (first === -1) return stops[0];\n return stops[Math.max(0, first - (count - 1))];\n}\n\nfunction defaultStep(step: number | undefined, min: number, max: number): number {\n if (step !== undefined && step > 0) return step;\n return (max - min) / 100;\n}\n\n/** Keep a thumb inside its neighbors when `constraint` is `'ordered'`. */\nfunction clampOrdered(\n v: number,\n thumbs: readonly Thumb[],\n index: number,\n min: number,\n max: number,\n step: number | undefined,\n): number {\n const gap = step !== undefined && step > 0 ? step : (max - min) / 1000;\n const lower = index > 0 ? thumbs[index - 1].value + gap : min;\n const upper = index < thumbs.length - 1 ? thumbs[index + 1].value - gap : max;\n return clamp(v, lower, upper);\n}\n\nfunction resolveBounds(thumb: Thumb, ctx: BoundsCtx, fallbackMin: number, fallbackMax: number): [number, number] {\n if (!thumb.bounds) return [fallbackMin, fallbackMax];\n const tuple = typeof thumb.bounds === 'function' ? thumb.bounds(ctx) : thumb.bounds;\n return [tuple[0], tuple[1]];\n}\n\nfunction defaultReadout(thumb: Thumb): string {\n return formatNumber(thumb.value, { minimumFractionDigits: 3, maximumFractionDigits: 3 });\n}\n\n/**\n * Multi-thumb slider over a shared track. The thumb list is fully controlled:\n * every change, live or committed, arrives as a whole new array.\n *\n * Thumbs are draggable, and arrow/Home/End move the focused thumb — those\n * keystrokes fire `onInput` and `onChange` together, since there is no\n * in-flight state to buffer.\n */\nexport function Slider<T extends Thumb = Thumb>(props: SliderProps<T>): ReactElement {\n const { thumbs, onInput, onChange, step, constraint, trackHeight, density, ariaLabel, className } = props;\n\n const stopList = useMemo(() => usableStops(props.stops, props.min, props.max), [props.stops, props.min, props.max]);\n const stops = useMemo(() => stopList.map(stop => stop.value), [stopList]);\n const even = props.spacing === 'even' && stops.length >= 2;\n const strict = props.snap === 'strict' && stops.length > 0;\n const min = even ? stops[0] : props.min;\n const max = even ? stops[stops.length - 1] : props.max;\n\n const trackRef = useRef<HTMLDivElement | null>(null);\n // In-flight thumb buffer during a drag; null when not dragging.\n const dragBufferRef = useRef<T[] | null>(null);\n const sessionRef = useRef<PointerSession | null>(null);\n\n useEffect(() => () => { sessionRef.current?.cancel(); }, []);\n\n const valueToFraction = useCallback(\n (v: number): number => {\n if (max === min) return 0;\n if (!even) return clamp((v - min) / (max - min), 0, 1);\n const gaps = stops.length - 1;\n const x = clamp(v, min, max);\n let i = 0;\n while (i < gaps - 1 && x > stops[i + 1]) i++;\n return (i + (x - stops[i]) / (stops[i + 1] - stops[i])) / gaps;\n },\n [min, max, even, stops],\n );\n\n const fractionToValue = useCallback(\n (f: number): number => {\n const c = clamp(f, 0, 1);\n if (!even) return min + c * (max - min);\n const gaps = stops.length - 1;\n const i = Math.min(gaps - 1, Math.floor(c * gaps));\n return stops[i] + (c * gaps - i) * (stops[i + 1] - stops[i]);\n },\n [min, max, even, stops],\n );\n\n /** The value a pointer at track fraction `f` chooses, before bounds. */\n const valueAt = useCallback(\n (f: number, trackWidth: number): number => {\n const v = fractionToValue(f);\n if (strict) return attract(v, stops, Infinity, valueToFraction);\n const q = clamp(quantize(v, step, min), min, max);\n return stops.length > 0 ? attract(q, stops, STOP_SNAP_PX / trackWidth, valueToFraction) : q;\n },\n [fractionToValue, valueToFraction, strict, stops, step, min, max],\n );\n\n // `seed` replaces the thumb list the drag starts from. A track press moves a\n // thumb before the drag begins, and without seeding, a release with no\n // movement would commit the stale buffer and undo that move.\n const beginThumbDrag = useCallback(\n (origin: Element, down: ReactPointerEvent, index: number, seed?: readonly T[]) => {\n sessionRef.current?.cancel();\n const buf: T[] = (seed ?? thumbs).map(t => ({ ...t }));\n dragBufferRef.current = buf;\n let droppedOff = false;\n\n const onMove = (ev: PointerEvent) => {\n const track = trackRef.current;\n const buffer = dragBufferRef.current;\n if (!track || !buffer) return;\n const rect = track.getBoundingClientRect();\n let v = valueAt((ev.clientX - rect.left) / rect.width, rect.width);\n\n const [bLo, bHi] = resolveBounds(buffer[index], { thumbs: buffer, index }, min, max);\n v = clamp(v, bLo, bHi);\n\n if (constraint === 'ordered') v = clampOrdered(v, buffer, index, min, max, step);\n\n // Drop-off detection: pointer exits the track vertically by more than trackHeight.\n const bandHeight = rect.height;\n if (props.onRemoveThumb) {\n if (ev.clientY < rect.top - bandHeight || ev.clientY > rect.bottom + bandHeight) {\n droppedOff = true;\n } else {\n droppedOff = false;\n }\n }\n\n buffer[index] = { ...buffer[index], value: v };\n onInput(buffer.map(t => ({ ...t })));\n };\n\n // A drag that ends without a release — cancelled pointer, lost capture,\n // an unmount — drops the buffer without committing.\n const onCancel = () => {\n sessionRef.current = null;\n dragBufferRef.current = null;\n };\n\n const onEnd = () => {\n sessionRef.current = null;\n const buffer = dragBufferRef.current;\n dragBufferRef.current = null;\n if (!buffer) return;\n\n if (droppedOff && props.onRemoveThumb) {\n const accepted = props.onRemoveThumb(index);\n if (accepted) {\n const next = buffer.filter((_, i) => i !== index).map(t => ({ ...t })) as T[];\n onInput(next);\n onChange?.(next);\n return;\n }\n }\n\n onChange?.(buffer.map(t => ({ ...t })));\n };\n\n sessionRef.current = openPointerSession(origin, down, { onMove, onEnd, onCancel }, NO_CAPTURE);\n },\n [thumbs, onInput, onChange, valueAt, min, max, step, constraint, props],\n );\n\n const beginShiftAllDrag = useCallback(\n (origin: Element, down: ReactPointerEvent, anchorX: number) => {\n sessionRef.current?.cancel();\n const buf: T[] = thumbs.map(t => ({ ...t }));\n const startValues = buf.map(t => t.value);\n dragBufferRef.current = buf;\n\n const onMove = (ev: PointerEvent) => {\n const track = trackRef.current;\n const buffer = dragBufferRef.current;\n if (!track || !buffer) return;\n const rect = track.getBoundingClientRect();\n const dxFraction = (ev.clientX - anchorX) / rect.width;\n // Evenly spaced gaps span different amounts of value, so equal value\n // offsets would pull the thumbs apart; move them by track distance.\n if (even) {\n const starts = startValues.map(valueToFraction);\n const df = clamp(dxFraction, -Math.min(...starts), 1 - Math.max(...starts));\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] = { ...buffer[i], value: fractionToValue(starts[i] + df) };\n }\n onInput(buffer.map(t => ({ ...t })));\n return;\n }\n let dValue = dxFraction * (max - min);\n dValue = quantize(dValue, step, 0);\n\n // Clamp delta so no thumb leaves [min, max] (per-thumb bounds intentionally\n // not enforced — matches the experiment's hue-band shift-translate semantics).\n let allowedNeg = -Infinity;\n let allowedPos = Infinity;\n for (let i = 0; i < startValues.length; i++) {\n allowedNeg = Math.max(allowedNeg, min - startValues[i]);\n allowedPos = Math.min(allowedPos, max - startValues[i]);\n }\n dValue = clamp(dValue, allowedNeg, allowedPos);\n\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] = { ...buffer[i], value: clamp(startValues[i] + dValue, min, max) };\n }\n onInput(buffer.map(t => ({ ...t })));\n };\n\n const onCancel = () => {\n sessionRef.current = null;\n dragBufferRef.current = null;\n };\n\n const onEnd = () => {\n sessionRef.current = null;\n const buffer = dragBufferRef.current;\n dragBufferRef.current = null;\n if (buffer) onChange?.(buffer.map(t => ({ ...t })));\n };\n\n sessionRef.current = openPointerSession(origin, down, { onMove, onEnd, onCancel }, NO_CAPTURE);\n },\n [thumbs, onInput, onChange, min, max, step, even, valueToFraction, fractionToValue],\n );\n\n const onThumbPointerDown = (index: number) => (e: ReactPointerEvent) => {\n // Only bail on explicit non-primary buttons (button > 0). jsdom's PointerEvent\n // leaves `button` undefined; treat that as primary so tests can drive drags.\n if (typeof e.button === 'number' && e.button > 0) return;\n // preventDefault below suppresses the focus the press would otherwise\n // give the thumb, and the arrow keys are on the thumb.\n (e.currentTarget as HTMLElement).focus?.();\n e.preventDefault();\n e.stopPropagation();\n const origin = e.currentTarget as HTMLElement;\n if (e.shiftKey && props.allowShiftAll) {\n beginShiftAllDrag(origin, e, e.clientX);\n } else {\n beginThumbDrag(origin, e, index);\n }\n };\n\n const onThumbContextMenu = (index: number) => (e: ReactMouseEvent) => {\n if (!props.onRemoveThumb) return;\n e.preventDefault();\n const accepted = props.onRemoveThumb(index);\n if (!accepted) return;\n const next = thumbs.filter((_, i) => i !== index).map(t => ({ ...t })) as T[];\n onInput(next);\n onChange?.(next);\n };\n\n const onTrackPointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (typeof e.button === 'number' && e.button > 0) return;\n const trackClick = props.trackClick ?? (thumbs.length === 1 ? 'move-nearest' : 'none');\n const wantsMove = trackClick === 'move-nearest' && thumbs.length > 0;\n if (!props.onAddThumb && !wantsMove) return;\n // If the event originated on a thumb, the thumb's own handler ran first; this is a track click.\n if ((e.target as HTMLElement).closest(`.${s.thumb}`)) return;\n e.preventDefault();\n const track = trackRef.current;\n if (!track) return;\n const rect = track.getBoundingClientRect();\n const v = valueAt((e.clientX - rect.left) / rect.width, rect.width);\n\n if (props.onAddThumb) {\n const created = props.onAddThumb(v);\n if (!created) return;\n const next = [...thumbs.map(t => ({ ...t })), created] as T[];\n onInput(next);\n onChange?.(next);\n return;\n }\n\n let index = 0;\n for (let i = 1; i < thumbs.length; i++) {\n if (Math.abs(thumbs[i].value - v) < Math.abs(thumbs[index].value - v)) index = i;\n }\n const next = thumbs.map(t => ({ ...t })) as T[];\n const [bLo, bHi] = resolveBounds(next[index], { thumbs: next, index }, min, max);\n let moved = clamp(v, bLo, bHi);\n if (constraint === 'ordered') moved = clampOrdered(moved, next, index, min, max, step);\n next[index] = { ...next[index], value: moved };\n onInput(next);\n // preventDefault above suppresses the focus the press would give; the arrow keys are on the thumb.\n track.querySelectorAll<HTMLElement>(`.${s.thumb}`)[index]?.focus();\n beginThumbDrag(track, e, index, next);\n };\n\n const onThumbKeyDown = (index: number) => (e: ReactKeyboardEvent) => {\n const stepSize = defaultStep(step, min, max);\n let delta = 0;\n // With stops, a keystroke moves by whole stops rather than by value.\n let stopDelta = 0;\n let snapTo: 'home' | 'end' | null = null;\n\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n delta = e.shiftKey ? stepSize * 10 : stepSize;\n stopDelta = e.shiftKey ? 10 : 1;\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n delta = e.shiftKey ? -stepSize * 10 : -stepSize;\n stopDelta = e.shiftKey ? -10 : -1;\n break;\n case 'PageUp':\n delta = stepSize * 10;\n stopDelta = 10;\n break;\n case 'PageDown':\n delta = -stepSize * 10;\n stopDelta = -10;\n break;\n case 'Home':\n snapTo = 'home';\n break;\n case 'End':\n snapTo = 'end';\n break;\n default:\n return;\n }\n\n e.preventDefault();\n const next = thumbs.map(t => ({ ...t }));\n const [bLo, bHi] = resolveBounds(next[index], { thumbs: next, index }, min, max);\n const lo = Math.max(min, bLo);\n const hi = Math.min(max, bHi);\n let v: number;\n if (snapTo === 'home') v = lo;\n else if (snapTo === 'end') v = hi;\n else if (stops.length > 0) {\n v = stepStops(stops, next[index].value, stopDelta > 0 ? 1 : -1, Math.abs(stopDelta));\n } else {\n v = quantize(next[index].value + delta, step, min);\n }\n v = clamp(v, lo, hi);\n if (constraint === 'ordered') v = clampOrdered(v, next, index, lo, hi, step);\n next[index] = { ...next[index], value: v };\n onInput(next);\n onChange?.(next);\n };\n\n const placement = props.readoutPlacement ?? 'none';\n const renderReadout = props.renderReadout;\n\n const slim = density === 'slim';\n const rootVars: Record<string, string> = {};\n if (slim) {\n rootVars['--rp-track-height'] = 'var(--wzl-slider-track-h)';\n rootVars['--rp-thumb-size'] = 'var(--wzl-slider-thumb-size)';\n }\n // An explicit trackHeight wins: a caller who named a number meant it.\n if (trackHeight !== undefined) rootVars['--rp-track-height'] = `${trackHeight}px`;\n\n const labelMode = props.stopLabels ?? 'all';\n const lastStop = stopList.length - 1;\n const labeledStops = labelMode === 'none'\n ? []\n : stopList\n .map((stop, i) => ({ stop, i }))\n .filter(({ stop, i }) => stop.label !== undefined && (labelMode === 'all' || i === 0 || i === lastStop));\n // Inside the track so it shares the track's width, not the row's — an inline\n // readout beside the track would otherwise shift every label off its stop.\n const stopLabelRow = labeledStops.length > 0 && (\n <div className={s.stopLabels} data-slider-stop-labels aria-hidden=\"true\">\n {labeledStops.map(({ stop, i }) => (\n <span\n key={stop.value}\n className={s.stopLabel}\n data-slider-stop-label\n data-selected={thumbs.some(t => t.value === stop.value) ? 'true' : undefined}\n data-edge={i === 0 ? 'start' : i === lastStop ? 'end' : undefined}\n style={{ left: `${valueToFraction(stop.value) * 100}%` }}\n >\n {stop.label}\n </span>\n ))}\n </div>\n );\n const rootClass = [s.root, slim && s.slim, stopLabelRow && s.withStopLabels, className].filter(Boolean).join(' ');\n\n return (\n <div\n className={rootClass}\n style={Object.keys(rootVars).length > 0 ? (rootVars as CSSProperties) : undefined}\n >\n <div className={s.row}>\n <div className={s.track} ref={trackRef} onPointerDown={onTrackPointerDown}>\n {props.renderTrack && (\n <div className={s.trackInner}>\n {props.renderTrack({\n trackWidth: trackRef.current?.getBoundingClientRect().width ?? 0,\n valueToFraction,\n })}\n </div>\n )}\n {(props.showStops ?? true) && stops.length > 0 && (\n <div className={s.ticks} data-slider-ticks aria-hidden=\"true\">\n {stops.map(v => {\n const f = valueToFraction(v);\n return (\n <span\n key={v}\n className={s.tick}\n data-slider-tick\n data-fraction={String(f)}\n style={{ left: `${f * 100}%` }}\n />\n );\n })}\n </div>\n )}\n {stopLabelRow}\n {thumbs.map((thumb, i) => {\n const isNotched = thumb.shape === 'notched';\n const customRender = typeof thumb.shape === 'object' && thumb.shape !== null ? thumb.shape.render : null;\n const cls = `${s.thumb}${isNotched ? ` ${s.notched}` : ''}`;\n return (\n <div\n key={i}\n role=\"slider\"\n tabIndex={0}\n aria-orientation=\"horizontal\"\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={thumb.value}\n aria-valuetext={thumb.valueText}\n aria-label={[ariaLabel, thumb.label].filter(Boolean).join(' ') || undefined}\n className={cls}\n style={{ left: `${valueToFraction(thumb.value) * 100}%` }}\n onPointerDown={onThumbPointerDown(i)}\n onKeyDown={onThumbKeyDown(i)}\n onContextMenu={onThumbContextMenu(i)}\n >\n {customRender ? customRender({ width: 14, height: 24, isActive: false }) : (thumb.label ?? '')}\n </div>\n );\n })}\n </div>\n {placement === 'inline-after' && (\n <span data-readout=\"inline\" className={s.readoutInline}>\n {thumbs.map((t, i) => (\n <span key={i}>{i > 0 ? ' / ' : ''}{renderReadout ? renderReadout(t, i) : defaultReadout(t)}</span>\n ))}\n </span>\n )}\n </div>\n {placement === 'below-thumb' && (\n <div className={s.readoutsBelow}>\n {thumbs.map((t, i) => (\n <span\n key={i}\n data-readout=\"below\"\n className={s.readoutBelow}\n style={{ left: `${valueToFraction(t.value) * 100}%` }}\n >\n {renderReadout ? renderReadout(t, i) : defaultReadout(t)}\n </span>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { type CSSProperties, forwardRef, type InputHTMLAttributes, type Ref } from 'react';\nimport shared from '../range.module.css';\nimport s from './InlineRange.module.css';\n\n/** Props for {@link InlineRange} — a range input's, with `value` required. */\nexport type InlineRangeProps = Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'value' | 'min' | 'max'\n> & {\n value: number;\n min?: number;\n max?: number;\n};\n\n/**\n * Compact range input for a property row: one track, no label, no output.\n *\n * Distinct from the kit's other two — `Slider` is shaped for canvas scrubbing,\n * and `RangeSlider` is a full-width labelled form control on React Aria. This\n * one exists to sit inline beside a swatch or a readout, and to own the track\n * painting both of those surfaces need.\n */\nexport const InlineRange = forwardRef(function InlineRange(\n props: InlineRangeProps,\n ref: Ref<HTMLInputElement>,\n) {\n const { value, min = 0, max = 100, className, style, ...rest } = props;\n const span = max - min;\n const filled = span > 0 ? ((Math.min(Math.max(value, min), max) - min) / span) * 100 : 0;\n return (\n <input\n {...rest}\n ref={ref}\n type=\"range\"\n value={value}\n min={min}\n max={max}\n className={[shared.range, s.range, className].filter(Boolean).join(' ')}\n style={{ ['--slider-fill' as string]: `${filled}%`, ...style } as CSSProperties}\n />\n );\n});\n","import { useState } from 'react';\nimport { toHex8, getAlpha01, withAlpha01 } from '@weasel-js/core';\nimport { InlineRange } from '../InlineRange';\nimport s from './ColorField.module.css';\n\n/**\n * Props for {@link ColorField}. `onInput` fires throughout a gesture and\n * `onChange` once at its end.\n */\nexport interface ColorFieldProps {\n /** Current color, `#rrggbb` or `#rrggbbaa`. Omit when `mixed`. */\n value?: string;\n /** Indeterminate presentation (multi-selection with differing colors):\n * checkered chip, empty value. The first color edit produces a real\n * value; the opacity slider stays disabled until then (an alpha-only\n * edit would otherwise commit a value composed against the\n * placeholder black). */\n mixed?: boolean;\n /** Show the opacity slider; emitted values are `#rrggbbaa`. */\n alpha?: boolean;\n /** Live value during interaction (picker drag, slider drag). Optional —\n * wire it for live preview; omit it for commit-only consumers. */\n onInput?: (hex: string) => void;\n /** Committed value — picker close (blur) or slider release. One call\n * per user gesture; pair with an undoable write. */\n onChange: (hex: string) => void;\n 'aria-label'?: string;\n className?: string;\n}\n\n/**\n * Compact color editor: native color input + optional opacity slider.\n * Commit semantics are gesture-based (see `onChange`) because native\n * color/range inputs fire `change` continuously during interaction —\n * commit-on-change would emit one undo entry per tick.\n */\nexport function ColorField(props: ColorFieldProps) {\n const { value, mixed = false, alpha = false, onInput, onChange, className } = props;\n const hex8 = toHex8(value ?? '#000000');\n const rgb6 = hex8.slice(0, 7);\n const alpha01 = getAlpha01(hex8);\n const alphaPct = Math.round(alpha01 * 100);\n\n // Drafts track the control during a gesture (the committed prop only\n // updates after onChange), then reset to follow the prop again.\n const [colorDraft, setColorDraft] = useState<string | null>(null);\n const [alphaDraft, setAlphaDraft] = useState<number | null>(null);\n const visibleRgb = colorDraft ?? rgb6;\n const visibleAlphaPct = alphaDraft ?? alphaPct;\n\n const compose = (rgb: string, a01: number): string =>\n alpha ? withAlpha01(rgb, a01) : rgb;\n\n // Mixed with no color edit yet: the alpha slider has nothing real to\n // compose against (rgb6 is the placeholder black), so keep it disabled\n // until the first color edit lands.\n const alphaLocked = mixed && colorDraft === null;\n\n // Commit only when a gesture actually changed something — blur with no\n // preceding input must not emit (it would create a no-op undo entry).\n const commit = (rgb: string, a01: number): void => {\n if (colorDraft === null && alphaDraft === null) return;\n onChange(compose(rgb, a01));\n setColorDraft(null);\n setAlphaDraft(null);\n };\n\n return (\n <span\n className={[s.root, className].filter(Boolean).join(' ')}\n {...(mixed && colorDraft === null ? { 'data-mixed': '' } : {})}\n >\n <span className={s.chip}>\n <input\n className={s.color}\n type=\"color\"\n value={visibleRgb}\n aria-label={props['aria-label'] ?? 'Color'}\n onInput={(e) => {\n const rgb = (e.target as HTMLInputElement).value;\n setColorDraft(rgb);\n onInput?.(compose(rgb, visibleAlphaPct / 100));\n }}\n onBlur={() => commit(visibleRgb, visibleAlphaPct / 100)}\n />\n </span>\n {alpha && (\n <>\n <InlineRange\n className={s.alphaRange}\n min={0}\n max={100}\n step={1}\n value={visibleAlphaPct}\n disabled={alphaLocked}\n aria-label={props['aria-label'] ? `${props['aria-label']} opacity` : 'Opacity'}\n onInput={(e) => {\n const pct = Number((e.target as HTMLInputElement).value);\n setAlphaDraft(pct);\n onInput?.(compose(visibleRgb, pct / 100));\n }}\n onPointerUp={() => commit(visibleRgb, visibleAlphaPct / 100)}\n onPointerCancel={() => commit(visibleRgb, visibleAlphaPct / 100)}\n onKeyUp={() => commit(visibleRgb, visibleAlphaPct / 100)}\n onBlur={() => commit(visibleRgb, visibleAlphaPct / 100)}\n />\n <span className={s.alphaReadout} aria-hidden=\"true\">{visibleAlphaPct}%</span>\n </>\n )}\n </span>\n );\n}\n","import type { ReactNode, CSSProperties } from 'react';\nimport type { TrackCtx } from './components/Slider';\n\n/**\n * Options for {@link paintGradientTrack}.\n *\n * `gradient` maps a normalized position along the track (0 to 1) to a CSS\n * color; `samples` is how many stops the resulting linear-gradient uses.\n * `activeRange`, given in the slider's own value units, keeps that span at\n * full strength and dims + hatches the rest.\n */\nexport type GradientTrackOpts = {\n gradient: (t: number) => string;\n samples?: number;\n activeRange?: [number, number];\n hatch?: {\n angleDeg?: number;\n stripe?: number;\n gap?: number;\n dim?: number;\n };\n};\n\nconst DEFAULT_HATCH = { angleDeg: 135, stripe: 2, gap: 4, dim: 75 };\n\n/**\n * Builds a `Slider` `renderTrack` function that paints the track as a\n * sampled color gradient, optionally dimming and hatching the portions\n * outside an active range.\n */\nexport function paintGradientTrack(opts: GradientTrackOpts): (ctx: TrackCtx) => ReactNode {\n const { gradient, samples = 16, activeRange, hatch } = opts;\n\n return (ctx: TrackCtx) => {\n const stops: string[] = [];\n for (let i = 0; i <= samples; i++) {\n const t = i / samples;\n stops.push(`${gradient(t)} ${(t * 100).toFixed(1)}%`);\n }\n const baseGradient = `linear-gradient(to right, ${stops.join(', ')})`;\n\n const layers: string[] = [];\n if (activeRange) {\n const lowPct = ctx.valueToFraction(activeRange[0]) * 100;\n const highPct = ctx.valueToFraction(activeRange[1]) * 100;\n const h = { ...DEFAULT_HATCH, ...hatch };\n const stripe = `repeating-linear-gradient(${h.angleDeg}deg, transparent 0 ${h.stripe}px, var(--wzl-surface) ${h.stripe}px ${h.stripe + h.gap}px)`;\n const dimColor = `color-mix(in srgb, var(--wzl-surface) ${h.dim}%, transparent)`;\n const dimOverlay = `linear-gradient(${dimColor}, ${dimColor})`;\n\n if (lowPct > 0) {\n layers.push(`${dimOverlay} left 0 / ${lowPct.toFixed(2)}% 100% no-repeat`);\n layers.push(`${stripe} left 0 / ${lowPct.toFixed(2)}% 100% no-repeat`);\n }\n if (highPct < 100) {\n const wR = (100 - highPct).toFixed(2);\n layers.push(`${dimOverlay} right 0 / ${wR}% 100% no-repeat`);\n layers.push(`${stripe} right 0 / ${wR}% 100% no-repeat`);\n }\n }\n layers.push(baseGradient);\n\n const style: CSSProperties = {\n position: 'absolute',\n inset: 0,\n background: layers.join(', '),\n };\n return <div style={style} />;\n };\n}\n","import { useCallback, type ReactElement } from 'react';\nimport {\n sampleGradientStops,\n withGradientKind,\n type ColorSpace,\n type GradStop,\n type GradientFill,\n type GradientKind,\n} from '@weasel-js/core';\nimport { Slider, type Thumb } from '../Slider';\nimport { ColorField } from '../ColorField';\nimport { ToggleBar, type ToggleBarItem } from '../ToggleBar';\nimport { paintGradientTrack } from '../../paintGradientTrack';\nimport s from './GradientEditor.module.css';\n\nconst KINDS: readonly ToggleBarItem<GradientKind>[] = [\n { value: 'linear-gradient', label: 'Linear' },\n { value: 'radial-gradient', label: 'Radial' },\n { value: 'conic-gradient', label: 'Conic' },\n];\n\nconst SPACES: readonly ToggleBarItem<ColorSpace>[] = [\n { value: 'rgb', label: 'sRGB' },\n { value: 'oklab', label: 'OKLab' },\n { value: 'oklch', label: 'OKLCh' },\n];\n\n/** Fewer than two stops is not a gradient any renderer can ramp between. */\nconst MIN_STOPS = 2;\n\n/**\n * Props for {@link GradientEditor}. `onInput` fires throughout a gesture and\n * `onChange` once at its end.\n */\nexport interface GradientEditorProps {\n /** The gradient being edited. */\n value: GradientFill;\n /**\n * Live value during a gesture — a stop drag, a color-picker scrub. Wire\n * it for preview; it fires many times per gesture and must not be\n * written to history.\n */\n onInput?: (next: GradientFill) => void;\n /** Committed value: one call per completed gesture. Pair with an\n * undoable write. */\n onChange: (next: GradientFill) => void;\n /** Show the linear / radial / conic switch. Default true; turn it off\n * when the surrounding UI already owns the kind. */\n kindSwitch?: boolean;\n /** Show the sRGB / OKLab / OKLCh switch, which writes `interpolate`.\n * Default true. */\n spaceSwitch?: boolean;\n className?: string;\n}\n\ntype StopThumb = Thumb & { color: string };\n\n/**\n * Editor for a gradient's kind and stop list.\n *\n * Geometry (`from`/`to`, `center`, `radius`, `angle`) is deliberately not\n * edited here — on a canvas that belongs on the artwork, via\n * `<GradientHandles>`. This component owns the parts with no spatial\n * meaning, so it composes into a properties panel at any width.\n *\n * Stops are addressed by their position in `value.stops`, which is never\n * reordered — dragging one stop past another leaves both indices alone, so\n * a drag can cross a neighbour without the two swapping under the pointer.\n * Rendering sorts a copy.\n */\nexport function GradientEditor(props: GradientEditorProps): ReactElement {\n const { value, onInput, onChange, kindSwitch = true, spaceSwitch = true, className } = props;\n const stops = value.stops;\n const space = value.interpolate ?? 'rgb';\n\n const withStops = useCallback(\n (next: GradStop[]): GradientFill => ({ ...value, stops: next }),\n [value],\n );\n\n const thumbs: StopThumb[] = stops.map((stop) => ({ value: stop.offset, color: stop.color }));\n\n const applyThumbs = (next: StopThumb[]): GradStop[] =>\n next.map((t) => ({ offset: t.value, color: t.color }));\n\n const setStopColor = (index: number, color: string): GradStop[] =>\n stops.map((stop, i) => (i === index ? { ...stop, color } : stop));\n\n // Sorted view for the swatch row, carrying each stop's real index so a\n // recolor writes back to the right entry.\n const ordered = stops\n .map((stop, index) => ({ stop, index }))\n .sort((a, b) => a.stop.offset - b.stop.offset);\n\n return (\n <div className={[s.root, className].filter(Boolean).join(' ')}>\n {kindSwitch && (\n <ToggleBar<GradientKind>\n items={KINDS}\n value={value.fill}\n size=\"sm\"\n ariaLabel=\"Gradient kind\"\n onChange={(kind) => kind && onChange(withGradientKind(value, kind))}\n />\n )}\n\n <Slider<StopThumb>\n min={0}\n max={1}\n step={0.005}\n constraint=\"free\"\n thumbs={thumbs}\n ariaLabel=\"Gradient stops\"\n readoutPlacement=\"none\"\n onInput={(next) => onInput?.(withStops(applyThumbs(next)))}\n onChange={(next) => onChange(withStops(applyThumbs(next)))}\n onAddThumb={(at) => ({ value: at, color: sampleGradientStops(stops, at, space) })}\n onRemoveThumb={() => stops.length > MIN_STOPS}\n renderTrack={paintGradientTrack({\n gradient: (t) => sampleGradientStops(stops, t, space),\n // The track lerps between samples in sRGB whatever the gradient does,\n // so a hue arc needs more of them to not read as a straight line.\n samples: space === 'rgb' ? 32 : 64,\n })}\n />\n\n {spaceSwitch && (\n <ToggleBar<ColorSpace>\n items={SPACES}\n value={space}\n size=\"sm\"\n ariaLabel=\"Blend space\"\n onChange={(next) => next && onChange({ ...value, interpolate: next })}\n />\n )}\n\n <div className={s.swatches}>\n {ordered.map(({ stop, index }) => (\n <ColorField\n key={index}\n value={stop.color}\n alpha\n aria-label={`Stop ${index + 1} at ${Math.round(stop.offset * 100)}%`}\n className={s.swatch}\n onInput={(hex) => onInput?.(withStops(setStopColor(index, hex)))}\n onChange={(hex) => onChange(withStops(setStopColor(index, hex)))}\n />\n ))}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n RadioGroup as RACRadioGroup,\n Radio as RACRadio,\n Label,\n Text,\n FieldError,\n type RadioGroupProps as RACRadioGroupProps,\n type RadioProps as RACRadioProps,\n type ValidationResult,\n} from 'react-aria-components';\nimport { fieldClasses } from '../Field/Field';\nimport s from './RadioGroup.module.css';\n\n/** Props for {@link RadioGroup}, on top of React Aria's `RadioGroup` props. */\nexport type RadioGroupProps = Omit<RACRadioGroupProps, 'children' | 'className'> & {\n label?: ReactNode;\n description?: ReactNode;\n errorMessage?: ReactNode | ((v: ValidationResult) => ReactNode);\n children?: ReactNode;\n className?: string;\n};\n\n/**\n * A set of mutually exclusive choices, wrapping React Aria's RadioGroup and\n * supplying the same label / description / errorMessage slots as `Input`.\n * Holds {@link Radio} children.\n */\nexport function RadioGroup(props: RadioGroupProps) {\n const { label, description, errorMessage, children, className, ...rest } = props;\n return (\n <RACRadioGroup\n {...rest}\n className={[s.group, fieldClasses.root, className].filter(Boolean).join(' ')}\n >\n {label !== undefined && <Label className={s.legend}>{label}</Label>}\n {children}\n {description !== undefined && (\n <Text slot=\"description\" className={fieldClasses.hint}>\n {description}\n </Text>\n )}\n <FieldError className={fieldClasses.error}>{errorMessage}</FieldError>\n </RACRadioGroup>\n );\n}\n\n/** Props for {@link Radio}, on top of React Aria's `Radio` props. */\nexport type RadioProps = Omit<RACRadioProps, 'className' | 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/** One choice in a {@link RadioGroup}. The label is passed as children. */\nexport function Radio({ children, className, ...rest }: RadioProps) {\n return (\n <RACRadio {...rest} className={[s.radio, className].filter(Boolean).join(' ')}>\n <span className={s.dot} />\n {children !== undefined && <span>{children}</span>}\n </RACRadio>\n );\n}\n","import { forwardRef, type ReactNode, type Ref } from 'react';\nimport {\n Switch as RACSwitch,\n type SwitchProps as RACSwitchProps,\n} from 'react-aria-components';\nimport s from './Switch.module.css';\n\n/**\n * Props for {@link Switch}, on top of React Aria's `Switch` props. The label\n * is passed as children.\n */\nexport type SwitchProps = Omit<RACSwitchProps, 'children' | 'className'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/**\n * On/off toggle wrapping React Aria's Switch, skinned against the `--wzl-*`\n * tokens. Use for a setting that takes effect immediately; use `Checkbox`\n * for one that is submitted with a form.\n *\n * `ref` forwards to the underlying label element.\n */\nexport const Switch = forwardRef(function Switch(\n props: SwitchProps,\n ref: Ref<HTMLLabelElement>,\n) {\n const { children, className, ...rest } = props;\n return (\n <RACSwitch\n {...rest}\n ref={ref}\n className={[s.switch, className].filter(Boolean).join(' ')}\n >\n <span className={s.track}>\n <span className={s.thumb} />\n </span>\n {children !== undefined && <span className={s.label}>{children}</span>}\n </RACSwitch>\n );\n});\n","/**\n * \"A glyph the renderer asked for can now paint\" — the redraw signal shared\n * by every asynchronous glyph source.\n *\n * Both lazy tiers land their work *after* the frame that asked for it: the\n * dynamic canvas-SDF atlas defers bakes past a per-frame budget, and the\n * outline tier has to fetch and parse font bytes. Neither can paint anything\n * on the frame that first requests a glyph, so both have to tell the canvas\n * to draw again.\n *\n * One subscriber set, not one per tier: a consumer wiring \"redraw when text\n * becomes drawable\" should not have to know how many tiers exist, or grow a\n * second subscription every time one is added. `<SceneCanvas>` subscribes\n * once and both tiers reach it.\n */\n\nconst subscribers = new Set<() => void>();\n\n/** Advanced by every `notifyGlyphReady`, so state can be checked rather than\n * listened for. See {@link glyphGeneration}. */\nlet generation = 0;\n\n/**\n * How many times glyph availability has changed — the pull-based companion to\n * {@link subscribeGlyphReady}.\n *\n * For caches that cannot hold a subscription. Subscribing at module load is a\n * side effect that reaches across a package boundary: it makes importing the\n * module that holds the cache require this package's whole surface, so a\n * consumer partially mocking `@weasel-js/font` breaks at import rather than at\n * use, and import order starts to matter. Comparing a counter has neither\n * problem, and costs a field read on a path that was going to check a cache\n * key anyway.\n *\n * Callers keep the last value they saw and compare; any difference means\n * anything derived from font metrics is stale. The absolute value carries no\n * meaning and may wrap in principle — compare with `!==`, not `<`.\n */\nexport function glyphGeneration(): number {\n return generation;\n}\n\n/**\n * Subscribe to glyph availability. Fires after a batch of deferred SDF bakes\n * completes, and when an outline face finishes loading — in both cases, text\n * that painted nothing (or painted from a lower tier) can now paint. Returns\n * an unsubscribe.\n */\nexport function subscribeGlyphReady(cb: () => void): () => void {\n subscribers.add(cb);\n return () => {\n subscribers.delete(cb);\n };\n}\n\n/** @internal Fired by a glyph source once newly-available glyphs can paint. */\nexport function notifyGlyphReady(): void {\n generation++;\n for (const cb of subscribers) cb();\n}\n\n/** @internal Test seam — the subscriber set is module state. */\nexport function _clearGlyphReadySubscribers(): void {\n subscribers.clear();\n}\n","/**\n * Cross-family fallback policy. The per-family chain in `resolveFontVariant`\n * (weight → style → synthetic) has always been rich; what was missing is what\n * happens when the family itself was never registered. That case used to\n * render nothing at all, which is the single most common cause of \"my text is\n * invisible\".\n */\n\n/**\n * What happens when a requested family has no baked atlas:\n * - `'substitute'` — render with the default family (see\n * `setDefaultFontFamily`), reporting the swap on `ResolveResult.substituted`.\n * - `'canvas'` — auto-enroll the family with the dynamic canvas-SDF\n * rasterizer. The consumer gets the *real* typeface if the browser has it,\n * at canvas-SDF quality rather than baked-MSDF quality.\n * - `'none'` — hard miss; the run renders nothing.\n */\nexport type FontFallbackPolicy = 'substitute' | 'canvas' | 'none';\n\nlet policy: FontFallbackPolicy = 'substitute';\nlet defaultFamily: string | null = null;\n\n/** Set what happens when text asks for a family that was never registered.\n * Process-wide; defaults to `'substitute'`. */\nexport function setFontFallbackPolicy(next: FontFallbackPolicy): void {\n policy = next;\n}\n\n/** The cross-family fallback policy currently in force. */\nexport function getFontFallbackPolicy(): FontFallbackPolicy {\n return policy;\n}\n\n/** Explicit default family for `'substitute'`. When unset, the first\n * registered family wins — the right answer for the common case of an app\n * that registers exactly one. */\nexport function setDefaultFontFamily(family: string): void {\n defaultFamily = family;\n}\n\n/** The family `setDefaultFontFamily` named, or `null` if none was set — in\n * which case `'substitute'` falls back to the first registered family. */\nexport function getDefaultFontFamily(): string | null {\n return defaultFamily;\n}\n\n/**\n * Warn-once gate for the cross-family fallback warnings. The messages are\n * built in `registerFont.ts` (they read the registry to name the actual gap),\n * but the dedup state lives here so `_resetFallbackForTests` clears it —\n * warnings about a fallback are fallback state. While it sat in\n * `registerFont.ts`, only a registry reset cleared it, and a test that reset\n * just the policy silently swallowed its next warning.\n */\nconst warnedFallbacks = new Set<string>();\n\n/** @internal Claim `key` for a one-time warning; true the first time only. */\nexport function claimFallbackWarning(key: string): boolean {\n if (warnedFallbacks.has(key)) return false;\n warnedFallbacks.add(key);\n return true;\n}\n\n/** @internal Also called by `_resetFontRegistryForTests`: dropping the fonts\n * a warning was about has to drop the warning too. */\nexport function _clearFallbackWarnings(): void {\n warnedFallbacks.clear();\n}\n\n/** Test helper. Do not call from product code. */\nexport function _resetFallbackForTests(): void {\n policy = 'substitute';\n defaultFamily = null;\n warnedFallbacks.clear();\n}\n","/**\n * Shelf packer for the dynamic glyph atlas: fixed-size square pages, rows\n * (\"shelves\") of same-ish-height rects filled left to right. Simple and\n * good enough for glyph rects; no rotation, no eviction (v1).\n */\n\nexport interface ShelfAlloc {\n page: number;\n x: number;\n y: number;\n}\n\ninterface Shelf { y: number; height: number; x: number; }\ninterface Page { shelves: Shelf[]; nextY: number; }\n\nexport class ShelfPacker {\n private pages: Page[] = [];\n private warned = false;\n\n constructor(\n private readonly pageSize: number,\n private readonly maxPages: number,\n ) {}\n\n get pageCount(): number {\n return this.pages.length;\n }\n\n /** Allocate a w×h rect. Returns null (warning once) when capacity is out. */\n alloc(w: number, h: number): ShelfAlloc | null {\n if (w > this.pageSize || h > this.pageSize) return this.fail();\n for (let p = 0; p < this.pages.length; p++) {\n const spot = this.allocInPage(this.pages[p], w, h);\n if (spot) return { page: p, ...spot };\n }\n if (this.pages.length < this.maxPages) {\n const page: Page = { shelves: [], nextY: 0 };\n this.pages.push(page);\n const spot = this.allocInPage(page, w, h);\n if (spot) return { page: this.pages.length - 1, ...spot };\n }\n return this.fail();\n }\n\n private allocInPage(page: Page, w: number, h: number): { x: number; y: number } | null {\n for (const shelf of page.shelves) {\n if (h <= shelf.height && shelf.x + w <= this.pageSize) {\n const x = shelf.x;\n shelf.x += w;\n return { x, y: shelf.y };\n }\n }\n if (page.nextY + h <= this.pageSize) {\n const shelf: Shelf = { y: page.nextY, height: h, x: w };\n page.shelves.push(shelf);\n page.nextY += h;\n return { x: 0, y: shelf.y };\n }\n return null;\n }\n\n private fail(): null {\n if (!this.warned) {\n this.warned = true;\n console.warn(\n `weasel DynamicGlyphAtlas: glyph pages full (${this.maxPages} × ${this.pageSize}²); ` +\n 'further dynamic glyphs will not render.',\n );\n }\n return null;\n }\n}\n","/**\n * Euclidean distance transform for runtime SDF glyph baking (the TinySDF\n * technique): antialiased canvas coverage in → single-channel SDF bytes out.\n *\n * Uses Felzenszwalb & Huttenlocher's 1D squared-distance transform applied\n * along columns then rows. Pure JS, no dependencies, no allocation beyond\n * the work arrays sized to the input.\n */\n\nconst INF = 1e20;\n\n/** One 1D pass of the squared EDT (Felzenszwalb & Huttenlocher 2012, §2). */\nfunction edt1d(\n f: Float64Array, d: Float64Array, v: Int32Array, z: Float64Array, n: number,\n): void {\n v[0] = 0;\n z[0] = -INF;\n z[1] = INF;\n let k = 0;\n for (let q = 1; q < n; q++) {\n let s = (f[q] + q * q - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n while (s <= z[k]) {\n k--;\n s = (f[q] + q * q - (f[v[k]] + v[k] * v[k])) / (2 * q - 2 * v[k]);\n }\n k++;\n v[k] = q;\n z[k] = s;\n z[k + 1] = INF;\n }\n k = 0;\n for (let q = 0; q < n; q++) {\n while (z[k + 1] < q) k++;\n d[q] = (q - v[k]) * (q - v[k]) + f[v[k]];\n }\n}\n\n/** In-place 2D squared EDT over `grid` (width × height): columns, then rows. */\nfunction edt2d(\n grid: Float64Array, width: number, height: number,\n f: Float64Array, d: Float64Array, v: Int32Array, z: Float64Array,\n): void {\n for (let x = 0; x < width; x++) {\n for (let y = 0; y < height; y++) f[y] = grid[y * width + x];\n edt1d(f, d, v, z, height);\n for (let y = 0; y < height; y++) grid[y * width + x] = d[y];\n }\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) f[x] = grid[y * width + x];\n edt1d(f, d, v, z, width);\n for (let x = 0; x < width; x++) grid[y * width + x] = d[x];\n }\n}\n\n/**\n * Convert an alpha-coverage bitmap (0–255) to single-channel SDF bytes.\n * Signed distance is positive outside the shape; the output maps it as\n * `255 − 255·(dist/radius + cutoff)` clamped to [0,255], so with\n * cutoff 0.5 the shape edge lands at byte ~128 (shader threshold 0.5).\n */\nexport function alphaToSdf(\n alpha: Uint8ClampedArray | Uint8Array,\n width: number,\n height: number,\n radius: number,\n cutoff: number,\n): Uint8Array {\n const n = width * height;\n const gridOuter = new Float64Array(n);\n const gridInner = new Float64Array(n);\n const size = Math.max(width, height);\n const f = new Float64Array(size);\n const d = new Float64Array(size);\n const v = new Int32Array(size);\n const z = new Float64Array(size + 1);\n\n for (let i = 0; i < n; i++) {\n const a = alpha[i] / 255;\n gridOuter[i] = a === 1 ? 0 : a === 0 ? INF : Math.max(0, 0.5 - a) ** 2;\n gridInner[i] = a === 1 ? INF : a === 0 ? 0 : Math.max(0, a - 0.5) ** 2;\n }\n edt2d(gridOuter, width, height, f, d, v, z);\n edt2d(gridInner, width, height, f, d, v, z);\n\n const out = new Uint8Array(n);\n for (let i = 0; i < n; i++) {\n const dist = Math.sqrt(gridOuter[i]) - Math.sqrt(gridInner[i]);\n const byte = Math.round(255 - 255 * (dist / radius + cutoff));\n out[i] = byte < 0 ? 0 : byte > 255 ? 255 : byte;\n }\n return out;\n}\n","/**\n * Canvas-2D glyph rasterizer for the dynamic SDF atlas. `fillText` is the\n * only web-platform route to *installed* machine fonts (no outline access),\n * which is exactly why this tier exists.\n *\n * Coordinate contract (all values in bake-size px, i.e. at BAKE_SIZE):\n * bitmap left = penX + left (left is negative: pad + left bearing)\n * bitmap top = baseline − top (top is positive above the baseline)\n * pen advance = advance\n * The bitmap includes a PAD border on all four sides so the SDF field has\n * room to fall off. Blank glyphs (e.g. space) return width/height 0.\n *\n * On BAKE_SIZE — measured 2026-07-29, comparing the reconstructed field\n * against a direct `fillText` of the same glyph at each display size, with\n * sub-pixel registration searched out so it measures fidelity and not\n * alignment. Mean per-pixel coverage error, averaged over A/S/e/W/8:\n *\n * display px 12 16 24 32 48 64 96 128\n * error .096 .083 .059 .039 .024 .023 .037 .049\n *\n * Two things follow, both of them counterintuitive enough to be worth\n * writing down. The error is minimized *at* the bake size, so raising\n * BAKE_SIZE does not improve small text — it moves the sweet spot away from\n * the 12–32px range where UI text actually lives and makes it worse. And the\n * magnification side is the mild one: 128px costs about twice the floor,\n * which is the corner rounding the shader header already owns.\n *\n * The 12–16px end is the largest divergence, and it is not undersampling —\n * 3×3 supersampling the reconstruction roughly halves the error at 24–48px\n * but recovers almost nothing at 12–16px (.096 → .089, .083 → .068). What is\n * left there is a hinted rasterizer placing stems on the pixel grid, which no\n * size-independent field can encode. So there is nothing to buy with more\n * taps, a bigger bake, or mipmaps (which a packed atlas cannot have anyway —\n * mip levels blend across glyph rects).\n */\n\nimport type { FontStyle } from '../fontStyle';\n\nexport const BAKE_SIZE = 48;\nexport const PAD = 8;\n\nexport interface FaceMetrics {\n ascent: number;\n descent: number;\n}\n\nexport interface RasterizedGlyph {\n width: number;\n height: number;\n alpha: Uint8ClampedArray;\n left: number;\n top: number;\n advance: number;\n}\n\nexport interface GlyphRasterizer {\n faceMetrics(family: string, weight: number, style: FontStyle): FaceMetrics;\n rasterize(\n family: string, weight: number, style: FontStyle, codepoint: number,\n ): RasterizedGlyph;\n}\n\ntype Canvas2D = OffscreenCanvasRenderingContext2D | CanvasRenderingContext2D;\n\nfunction cssFontString(weight: number, style: FontStyle, family: string): string {\n return `${style === 'italic' ? 'italic ' : ''}${weight} ${BAKE_SIZE}px ${JSON.stringify(family)}`;\n}\n\nexport function createCanvasRasterizer(): GlyphRasterizer {\n let canvas: OffscreenCanvas | HTMLCanvasElement;\n if (typeof OffscreenCanvas !== 'undefined') {\n canvas = new OffscreenCanvas(BAKE_SIZE * 3, BAKE_SIZE * 3);\n } else if (typeof document !== 'undefined') {\n canvas = document.createElement('canvas');\n canvas.width = BAKE_SIZE * 3;\n canvas.height = BAKE_SIZE * 3;\n } else {\n throw new Error('weasel DynamicGlyphAtlas: no canvas available for glyph rasterization');\n }\n const ctx = canvas.getContext('2d', { willReadFrequently: true }) as Canvas2D | null;\n if (!ctx) throw new Error('weasel DynamicGlyphAtlas: 2D context unavailable');\n\n function setFont(family: string, weight: number, style: FontStyle): void {\n ctx!.font = cssFontString(weight, style, family);\n ctx!.textBaseline = 'alphabetic';\n ctx!.textAlign = 'left';\n }\n\n return {\n faceMetrics(family, weight, style) {\n setFont(family, weight, style);\n const m = ctx!.measureText('Hg');\n return {\n ascent: m.fontBoundingBoxAscent ?? BAKE_SIZE * 0.8,\n descent: m.fontBoundingBoxDescent ?? BAKE_SIZE * 0.2,\n };\n },\n\n rasterize(family, weight, style, codepoint) {\n setFont(family, weight, style);\n const chStr = String.fromCodePoint(codepoint);\n const m = ctx!.measureText(chStr);\n const advance = m.width;\n const inkLeft = Math.ceil(m.actualBoundingBoxLeft ?? 0);\n const inkRight = Math.ceil(m.actualBoundingBoxRight ?? advance);\n const inkAscent = Math.ceil(m.actualBoundingBoxAscent ?? BAKE_SIZE * 0.8);\n const inkDescent = Math.ceil(m.actualBoundingBoxDescent ?? BAKE_SIZE * 0.2);\n const inkW = inkLeft + inkRight;\n const inkH = inkAscent + inkDescent;\n if (inkW <= 0 || inkH <= 0) {\n return { width: 0, height: 0, alpha: new Uint8ClampedArray(0), left: 0, top: 0, advance };\n }\n const w = inkW + 2 * PAD;\n const h = inkH + 2 * PAD;\n if (canvas.width < w || canvas.height < h) {\n canvas.width = Math.max(canvas.width, w);\n canvas.height = Math.max(canvas.height, h);\n setFont(family, weight, style); // resizing resets 2D state\n }\n ctx!.clearRect(0, 0, w, h);\n ctx!.fillStyle = '#fff';\n ctx!.fillText(chStr, PAD + inkLeft, PAD + inkAscent);\n const img = ctx!.getImageData(0, 0, w, h);\n const alpha = new Uint8ClampedArray(w * h);\n for (let i = 0; i < alpha.length; i++) alpha[i] = img.data[i * 4 + 3];\n return {\n width: w,\n height: h,\n alpha,\n left: -(inkLeft + PAD),\n top: inkAscent + PAD,\n advance,\n };\n },\n };\n}\n","/**\n * DynamicGlyphAtlas — runtime single-channel SDF glyphs for canvas-sourced\n * (installed machine) fonts. TinySDF technique: canvas fillText at 48 px →\n * Euclidean distance transform → shelf-packed R8 pages (1024², max 4).\n *\n * Baked MSDF atlases always win: this tier only serves families registered\n * via `registerCanvasFont` that have no baked entry (see resolveFontVariant).\n *\n * Faces expose a BmFont-shaped `font` whose charMap grows as glyphs are\n * requested, so `layoutRuns` consumes them through the same code path as\n * baked atlases. A char's advance is valid immediately (measureText); its\n * atlas rect fills in when the bake lands (width 0 / page -1 until then, so\n * layout advances the pen but emits no quad).\n */\n\nimport type { FontStyle } from '../fontStyle';\nimport type { BmFont, BmFontChar } from '../FontAtlas';\nimport type { GlyphTextureSink } from '../textureSink';\n// `fallback.ts` imports nothing, so this edge cannot close a cycle; keep it\n// that way. (registerFont.ts imports both this module and fallback.ts.)\nimport { getFontFallbackPolicy } from '../fallback';\nimport { notifyGlyphReady, _clearGlyphReadySubscribers } from '../glyphReady';\nimport { ShelfPacker } from './shelfPack';\nimport { alphaToSdf } from './distanceTransform';\nimport {\n createCanvasRasterizer, BAKE_SIZE,\n type GlyphRasterizer, type RasterizedGlyph,\n} from './glyphRasterizer';\n\nexport const PAGE_SIZE = 1024;\nexport const MAX_PAGES = 4;\nexport const SDF_RADIUS = 8;\nexport const SDF_CUTOFF = 0.5;\n/** How many glyphs the dynamic atlas will rasterize synchronously before\n * deferring the rest to a later flush. Caps the frame cost of text that\n * suddenly needs many new glyphs; the leftovers arrive a tick later and\n * notify through `onGlyphReady`. */\nexport const DEFAULT_BAKE_BUDGET = 16;\n\nexport interface DynamicFace {\n family: string;\n weight: number;\n style: FontStyle;\n /** BmFont-shaped view consumed by layoutRuns; charMap grows lazily. */\n font: BmFont;\n /** Char record for `cp`, measured on first request (advance always valid\n * immediately; atlas rect fills in when the bake lands). */\n requestGlyph(cp: number): BmFontChar;\n}\n\ninterface DynamicPage {\n data: Uint8Array;\n /** Bumps on every glyph blit; each blit appends a patch with seq = version. */\n version: number;\n patches: { seq: number; x: number; y: number; w: number; h: number }[];\n}\n\ninterface PendingBake { char: BmFontChar; raster: RasterizedGlyph; }\n\n/** One family served by the dynamic canvas-SDF tier. See `listCanvasFonts`. */\nexport interface CanvasFontEntry {\n family: string;\n /** `'explicit'` — a `registerCanvasFont` call; `'auto'` — the `'canvas'`\n * fallback policy enrolled it on a miss, and the enrollment lapses if\n * that policy changes. */\n enrollment: 'explicit' | 'auto';\n}\n\nconst canvasFamilies = new Set<string>();\n// Enrollment provenance. A family the `'canvas'` fallback policy enrolled on\n// its own is only canvas-served while that policy is in force; one a consumer\n// named via registerCanvasFont outranks every policy. Tracked here rather\n// than in fallback.ts so the two sets can only ever be mutated together —\n// every register / unregister / reset path is in this file.\nconst autoEnrolledFamilies = new Set<string>();\nlet faces = new Map<string, DynamicFace>();\nlet pages: DynamicPage[] = [];\nlet packer = new ShelfPacker(PAGE_SIZE, MAX_PAGES);\nlet pending: PendingBake[] = [];\nlet flushScheduled = false;\nlet budget = DEFAULT_BAKE_BUDGET;\nlet rasterizer: GlyphRasterizer | null = null;\n\nfunction getRasterizer(): GlyphRasterizer {\n if (!rasterizer) rasterizer = createCanvasRasterizer();\n return rasterizer;\n}\n\n/** Mark `family` as canvas-sourced: when no baked atlas covers it,\n * resolveFontVariant serves it from this dynamic atlas. */\nexport function registerCanvasFont(family: string): void {\n canvasFamilies.add(family);\n // An explicit call promotes a previously auto-enrolled family for good.\n autoEnrolledFamilies.delete(family);\n}\n\n/**\n * Will `family` be served by the dynamic canvas-SDF tier *right now*?\n *\n * Service, not membership — the answer depends on the fallback policy in\n * force and can change without any enrollment call:\n * - explicitly enrolled via `registerCanvasFont` → `true` under every\n * policy; a consumer naming a family outranks the policy.\n * - auto-enrolled by the `'canvas'` policy → `true` only while that policy\n * is still in force. The enrollment lapses rather than being discarded,\n * so returning to `'canvas'` makes it `true` again.\n * - never enrolled → `false`, including under `'canvas'` (that policy\n * enrolls lazily, on the first miss).\n *\n * The membership reading would answer `true` for an auto-enrolled family\n * under `'substitute'` / `'none'`, where nothing routes to this tier — a\n * caller predicting what renders would be told the opposite of the truth.\n * Mirrors `listFonts`, which reports the baked registry alone for the same\n * reason: \"enrolled\" is not \"will render\".\n */\nexport function isCanvasFont(family: string): boolean {\n if (!canvasFamilies.has(family)) return false;\n return !autoEnrolledFamilies.has(family) || getFontFallbackPolicy() === 'canvas';\n}\n\n/**\n * Every family the dynamic canvas-SDF tier will serve *right now* — the\n * enumeration companion to `isCanvasFont`, which answers one family at a\n * time. Same \"service, not membership\" rule: an auto-enrolled family appears\n * only while the `'canvas'` policy is in force.\n *\n * Exists so a consumer can offer these families in a font picker.\n * `listFonts` reports the baked registry alone, so without this the only\n * ways to present canvas-served families were to hard-code a list beside the\n * `registerCanvasFont` calls or to omit them — a UI inventing its own answer\n * about what will render.\n *\n * `enrollment` distinguishes a consumer's explicit `registerCanvasFont` from\n * a lazy enrollment the policy made on a miss; both render identically, but\n * only the explicit one survives a policy change.\n */\nexport function listCanvasFonts(): readonly CanvasFontEntry[] {\n const out: CanvasFontEntry[] = [];\n for (const family of canvasFamilies) {\n if (!isCanvasFont(family)) continue;\n out.push({ family, enrollment: autoEnrolledFamilies.has(family) ? 'auto' : 'explicit' });\n }\n return out.sort((a, b) => a.family.localeCompare(b.family));\n}\n\n/**\n * @internal Enroll `family` on behalf of the `'canvas'` fallback policy.\n * Distinct from `registerCanvasFont` only in provenance: the enrollment\n * lapses (see `isExplicitCanvasFont`) if the policy later changes.\n */\nexport function autoEnrollCanvasFont(family: string): void {\n if (canvasFamilies.has(family) && !autoEnrolledFamilies.has(family)) return;\n canvasFamilies.add(family);\n autoEnrolledFamilies.add(family);\n}\n\n/**\n * @internal Enrolled by a consumer's own `registerCanvasFont` call rather than\n * by the `'canvas'` policy. Only these are served by the dynamic tier\n * regardless of the policy in force; an auto-enrolled family falls back to\n * whatever the current policy says once that policy is no longer `'canvas'`.\n */\nexport function isExplicitCanvasFont(family: string): boolean {\n return canvasFamilies.has(family) && !autoEnrolledFamilies.has(family);\n}\n\n/** Remove a canvas family. Its faces are dropped; already-baked glyph\n * pixels stay in their pages (no eviction in v1). */\nexport function unregisterCanvasFont(family: string): void {\n canvasFamilies.delete(family);\n autoEnrolledFamilies.delete(family);\n for (const key of [...faces.keys()]) {\n if (faces.get(key)!.family === family) faces.delete(key);\n }\n}\n\n/**\n * Internal resolver helper — not part of the public barrel; consumers go\n * through registerCanvasFont + resolveFontVariant.\n */\nexport function getDynamicFace(\n family: string, weight: number, style: FontStyle,\n): DynamicFace {\n const key = `${family}|${weight}|${style}`;\n const existing = faces.get(key);\n if (existing) return existing;\n\n const r = getRasterizer();\n const metrics = r.faceMetrics(family, weight, style);\n const base = Math.round(metrics.ascent);\n const font: BmFont = {\n info: { face: family, size: BAKE_SIZE },\n common: {\n lineHeight: Math.round(metrics.ascent + metrics.descent),\n base,\n scaleW: PAGE_SIZE,\n scaleH: PAGE_SIZE,\n },\n chars: [],\n kernings: [], // no kerning in v1 (measured-pair kerning is future work)\n charMap: new Map(),\n kerningMap: new Map(),\n };\n\n const face: DynamicFace = {\n family, weight, style, font,\n requestGlyph(cp: number): BmFontChar {\n const cached = font.charMap.get(cp);\n if (cached) return cached;\n const raster = r.rasterize(family, weight, style, cp);\n const char: BmFontChar = {\n id: cp, x: 0, y: 0, width: 0, height: 0,\n xoffset: raster.left,\n yoffset: base - raster.top,\n xadvance: raster.advance,\n page: -1,\n };\n font.charMap.set(cp, char);\n font.chars.push(char);\n if (raster.width === 0 || raster.height === 0) {\n char.page = 0; // blank glyph (space): nothing to bake\n return char;\n }\n if (budget > 0) {\n budget--;\n bake(char, raster);\n } else {\n pending.push({ char, raster });\n scheduleFlush();\n }\n return char;\n },\n };\n faces.set(key, face);\n return face;\n}\n\nfunction bake(char: BmFontChar, raster: RasterizedGlyph): void {\n const spot = packer.alloc(raster.width, raster.height);\n if (!spot) return; // pages full — packer warned once; glyph stays invisible\n const sdf = alphaToSdf(raster.alpha, raster.width, raster.height, SDF_RADIUS, SDF_CUTOFF);\n while (pages.length <= spot.page) {\n pages.push({ data: new Uint8Array(PAGE_SIZE * PAGE_SIZE), version: 0, patches: [] });\n }\n const page = pages[spot.page];\n for (let row = 0; row < raster.height; row++) {\n page.data.set(\n sdf.subarray(row * raster.width, (row + 1) * raster.width),\n (spot.y + row) * PAGE_SIZE + spot.x,\n );\n }\n page.version++;\n page.patches.push({ seq: page.version, x: spot.x, y: spot.y, w: raster.width, h: raster.height });\n char.x = spot.x;\n char.y = spot.y;\n char.width = raster.width;\n char.height = raster.height;\n char.page = spot.page;\n}\n\nfunction scheduleFlush(): void {\n if (flushScheduled) return;\n flushScheduled = true;\n setTimeout(flushPending, 0);\n}\n\nfunction flushPending(): void {\n flushScheduled = false;\n let n = 0;\n while (pending.length > 0 && n < DEFAULT_BAKE_BUDGET) {\n const job = pending.shift()!;\n if (job.char.page !== -1) continue; // already baked\n bake(job.char, job.raster);\n n++;\n }\n if (pending.length > 0) scheduleFlush();\n notifyGlyphReady();\n}\n\n/** Reset the per-frame synchronous bake budget. Called by\n * `WeaselRenderer.render()` at frame start; the headless\n * `renderSceneToPixels` path passes Infinity so print never defers. */\nexport function resetBakeBudget(n: number = DEFAULT_BAKE_BUDGET): void {\n budget = n;\n}\n\n/* ------------------------------------------------------------------ */\n/* GPU sync */\n/* ------------------------------------------------------------------ */\n\n/** Texture-cache key for a dynamic page (parallel to `textureCacheKey`). */\nexport function dynamicPageTextureId(page: number): string {\n return `weasel-dyn-sdf-page-${page}`;\n}\n\n// Per-GL-cache upload progress: last page version each cache has seen.\n// WeakMap-keyed so disposed renderers don't pin anything.\nconst uploadedVersions = new WeakMap<GlyphTextureSink, Map<number, number>>();\n\n/** Bring `cache`'s copy of page `pageIndex` up to date: full R8 upload the\n * first time, `texSubImage2D` patches after. Returns false if the page\n * doesn't exist yet. */\nexport function syncDynamicPageTexture(cache: GlyphTextureSink, pageIndex: number): boolean {\n const page = pages[pageIndex];\n if (!page) return false;\n const id = dynamicPageTextureId(pageIndex);\n let seen = uploadedVersions.get(cache);\n if (!seen) {\n seen = new Map();\n uploadedVersions.set(cache, seen);\n }\n if (!cache.has(id)) {\n cache.uploadR8(id, PAGE_SIZE, PAGE_SIZE, page.data);\n seen.set(pageIndex, page.version);\n return true;\n }\n const last = seen.get(pageIndex) ?? 0;\n if (last >= page.version) return true;\n for (const patch of page.patches) {\n if (patch.seq <= last) continue;\n const tight = new Uint8Array(patch.w * patch.h);\n for (let row = 0; row < patch.h; row++) {\n const src = (patch.y + row) * PAGE_SIZE + patch.x;\n tight.set(page.data.subarray(src, src + patch.w), row * patch.w);\n }\n cache.subImageR8(id, patch.x, patch.y, patch.w, patch.h, tight);\n }\n seen.set(pageIndex, page.version);\n return true;\n}\n\n/* ------------------------------------------------------------------ */\n/* Test seams */\n/* ------------------------------------------------------------------ */\n\n/** @internal test seam — inject a fake rasterizer (jsdom has no canvas\n * metrics). Pass null to restore the lazy default. */\nexport function __setGlyphRasterizerForTests(r: GlyphRasterizer | null): void {\n rasterizer = r;\n}\n\n/** @internal test seam — inspect CPU-side pages. */\nexport function _getPagesForTests(): readonly DynamicPage[] {\n return pages;\n}\n\n/** @internal test seam — clear all dynamic-font state. */\nexport function _resetDynamicFontsForTests(): void {\n canvasFamilies.clear();\n autoEnrolledFamilies.clear();\n faces = new Map();\n pages = [];\n packer = new ShelfPacker(PAGE_SIZE, MAX_PAGES);\n pending = [];\n flushScheduled = false;\n budget = DEFAULT_BAKE_BUDGET;\n _clearGlyphReadySubscribers();\n rasterizer = null;\n}\n","/**\n * The outline tier's registry: which faces have real font bytes behind them,\n * and what a given glyph looks like.\n *\n * ### What this tier is for\n *\n * A distance field is a *sampled* representation. The baked MSDF atlas is\n * generated from outlines and holds up well; the dynamic canvas-SDF tier\n * (`../dynamic/`) reconstructs its field from a 48px raster, so magnifying it\n * past a few times the bake size exposes the raster as contour wobble — bumps\n * one bake-texel apart, ±2–3px at 8×. No bake size fixes that, it only moves\n * the size at which it appears (`glyphRasterizer.ts` measures the tradeoff:\n * error is *minimized at* the bake size, so raising it spoils the 12–32px\n * range where most text lives).\n *\n * Above a size threshold the answer is to stop sampling: parse the font, take\n * the glyph's outline, and hand it to the path renderer the kit already has.\n * Exact at every zoom, and — because a glyph becomes an ordinary path — it\n * takes strokes and non-solid fills for free.\n *\n * Below the threshold the atlas still wins, and not narrowly: outlines carry\n * no hinting and no stem darkening, so body text at 12–16px rendered from\n * them looks *worse* than a platform rasterizer that puts stems on the pixel\n * grid. Two tiers with a size threshold is the standard hybrid, not a\n * compromise.\n *\n * ### Metric neutrality (the load-bearing invariant)\n *\n * This tier replaces how a glyph is *painted*, never where it sits. Advances,\n * kerning, line breaking and baselines all keep coming from whichever tier\n * resolved the run — the baked atlas or the canvas face. That is what lets\n * the threshold be a rendering decision: zooming past it swaps glyph geometry\n * with the layout untouched, so text cannot reflow under the user's cursor,\n * and `measureTextBounds` / `textLineBoxes` need to know nothing about\n * outlines at all.\n *\n * The cost is that a face whose real advances disagree with the atlas's\n * inherits the atlas's. For the bundled Inter that is exact (the subset ships\n * from the same source the atlas was baked from), and for a machine font the\n * outline bytes and the canvas metrics come from the same file.\n *\n * ### Availability\n *\n * Everything here degrades rather than blocks. Bytes arrive over `fetch` or\n * `queryLocalFonts` — asynchronous, and in the local case gated behind a\n * permission the user can refuse — so `glyphOutline` answers `null` until a\n * face is loaded and forever if it failed, and the caller falls back down the\n * ladder to SDF. A family must never render *nothing* because the outline\n * tier could not get bytes.\n */\n\nimport { notifyGlyphReady } from '../glyphReady';\nimport type { OutlineFace, OutlineParser } from './OutlineFace';\nimport type { FontStyle } from '../fontStyle';\nimport { openTypeParser } from './opentypeParser';\n\n/**\n * Where a face's bytes come from. A URL is fetched; a buffer or blob is used\n * as-is; a thunk is called at first use, which is what lets `queryLocalFonts`\n * results be registered eagerly and read lazily — the permission prompt and\n * the (potentially many megabytes of) blob only happen for a family the\n * document actually sets text in.\n */\nexport type OutlineSource =\n | string\n | ArrayBuffer\n | Blob\n | (() => ArrayBuffer | Blob | Promise<ArrayBuffer | Blob>);\n\n/** Which face within a family to register outlines for. Defaults to weight\n * 400, style `'normal'`. */\nexport interface OutlineVariant {\n weight?: number;\n style?: FontStyle;\n}\n\n/** Options for registering an outline font. */\nexport interface OutlineFontOptions {\n /** Override the default opentype.js parser. Mostly a test seam; also the\n * hook for a consumer who already has a font parser in their bundle. */\n parser?: OutlineParser;\n}\n\n/** Load state of one registered face. */\nexport type OutlineStatus = 'idle' | 'loading' | 'ready' | 'failed';\n\ninterface FaceSlot {\n family: string;\n weight: number;\n style: FontStyle;\n source: OutlineSource;\n parser: OutlineParser;\n status: OutlineStatus;\n face: OutlineFace | null;\n /** Memoized `glyphD` answers, including the `null` misses — a codepoint the\n * face lacks is asked for on every frame that draws it, and re-deriving\n * the miss means re-running the cmap lookup forever. */\n glyphs: Map<number, string | null>;\n}\n\nlet slots = new Map<string, FaceSlot>();\n\nfunction slotKey(family: string, weight: number, style: FontStyle): string {\n return `${family}|${weight}|${style}`;\n}\n\nfunction normalize(v: OutlineVariant): { weight: number; style: FontStyle } {\n return { weight: v.weight ?? 400, style: v.style ?? 'normal' };\n}\n\n/**\n * Register font file bytes for one face, so text set in it can render from\n * outlines above the size threshold.\n *\n * Registration is cheap and synchronous: nothing is fetched, and the parser\n * is not even imported, until a frame actually asks for a glyph from this\n * face. Registering a face that is never drawn large costs one map entry.\n *\n * The variant must match exactly what the layout tier resolved — this is\n * deliberately *not* a fallback chain. Painting 400-weight outlines at\n * 700-weight advances, or upright outlines where the shader was going to\n * fake an oblique, looks worse than the SDF it replaced; a miss here falls\n * back down the ladder instead, which is always safe.\n */\nexport function registerFontOutlines(\n family: string,\n variant: OutlineVariant,\n source: OutlineSource,\n opts: OutlineFontOptions = {},\n): void {\n const { weight, style } = normalize(variant);\n slots.set(slotKey(family, weight, style), {\n family, weight, style, source,\n parser: opts.parser ?? openTypeParser,\n status: 'idle',\n face: null,\n glyphs: new Map(),\n });\n // Layouts cache which tier each run resolved to and poll `glyphGeneration()`\n // to know when to drop it; a registration that leaves it still is invisible.\n notifyGlyphReady();\n}\n\n/** Drop a registration. Glyphs already handed out stay valid — they are\n * plain path data — but nothing further resolves from this face. */\nexport function unregisterFontOutlines(family: string, variant: OutlineVariant = {}): void {\n const { weight, style } = normalize(variant);\n // Only when something was actually dropped: `disableMachineFontOutlines`\n // sweeps every weight/style pair, and a miss must not invalidate any layout.\n if (slots.delete(slotKey(family, weight, style))) notifyGlyphReady();\n}\n\n/**\n * Is an outline face registered for this exact variant? Answers `true` while\n * the bytes are still loading — the question is \"could this face serve\n * outlines\", which is what a caller deciding whether to *ask* wants; use\n * `outlineStatus` for the narrower \"can it right now\".\n */\nexport function hasFontOutlines(\n family: string, weight = 400, style: FontStyle = 'normal',\n): boolean {\n return slots.has(slotKey(family, weight, style));\n}\n\n/** Load state of a registered face; `null` when nothing is registered. */\nexport function outlineStatus(\n family: string, weight = 400, style: FontStyle = 'normal',\n): OutlineStatus | null {\n return slots.get(slotKey(family, weight, style))?.status ?? null;\n}\n\n/** Every registered outline face and its load state — the enumeration a\n * debug overlay or font picker needs, mirroring `listFonts`. */\nexport function listFontOutlines(): readonly {\n family: string; weight: number; style: FontStyle; status: OutlineStatus;\n}[] {\n return [...slots.values()]\n .map(({ family, weight, style, status }) => ({ family, weight, style, status }))\n .sort((a, b) => a.family.localeCompare(b.family) || a.weight - b.weight\n || a.style.localeCompare(b.style));\n}\n\n/**\n * Em-space SVG path data for one glyph, or `null` when this tier cannot serve\n * it — no registration, bytes still loading, load failed, no such glyph, or a\n * glyph with no contours.\n *\n * Synchronous by construction: it is called from the per-frame glyph walk, so\n * it can only ever report what is already in hand. The first call for an\n * unloaded face starts the load and returns `null`; when the load lands,\n * `notifyGlyphReady` asks the canvas to draw again and the second frame gets\n * the outline. Same shape as the dynamic tier's deferred bakes.\n */\n/**\n * Close every contour of a glyph's path data.\n *\n * A glyph contour is closed by definition — neither TrueType nor CFF has any\n * other kind — but not every serializer writes the `Z` that says so, and the\n * omission is invisible until someone *strokes* the outline: a fill closes the\n * contour implicitly (earcut joins last point to first), while a stroke\n * follows exactly the path it is handed and leaves the closing edge unpainted,\n * with a cap at each loose end. That showed up as glyphs missing part of their\n * outline along long straight edges, which is where a contour's seam usually\n * falls.\n *\n * Normalized here rather than in one parser because the same hole is open to\n * every consumer-supplied `OutlineParser`, and a contract that says \"closed\"\n * is cheaper to guarantee than to document.\n */\nexport function closeContours(d: string): string {\n let out = '';\n let start = 0;\n for (let i = 1; i < d.length; i++) {\n const c = d[i];\n if (c !== 'M' && c !== 'm') continue;\n out += closeOne(d.slice(start, i));\n start = i;\n }\n return out + closeOne(d.slice(start));\n}\n\nfunction closeOne(contour: string): string {\n const trimmed = contour.trimEnd();\n if (trimmed.length === 0) return '';\n const last = trimmed[trimmed.length - 1];\n return last === 'Z' || last === 'z' ? trimmed : `${trimmed}Z`;\n}\n\n/**\n * Em-space SVG path data for one glyph of a registered outline face, or `null`\n * when there is nothing to draw.\n *\n * Synchronous and non-throwing by design: a face that has not been parsed yet\n * starts loading and answers `null` for now, so a renderer can call this every\n * frame and simply fall through to another text tier until the outline\n * arrives. Results are cached per codepoint.\n */\nexport function glyphOutline(\n family: string,\n weight: number,\n style: FontStyle,\n cp: number,\n): string | null {\n const slot = slots.get(slotKey(family, weight, style));\n if (!slot) return null;\n if (slot.status === 'idle') {\n void beginLoad(slot);\n return null;\n }\n if (slot.status !== 'ready') return null;\n\n const cached = slot.glyphs.get(cp);\n if (cached !== undefined) return cached;\n let d: string | null = null;\n try {\n const raw = slot.face!.glyphD(cp);\n d = raw === null ? null : closeContours(raw);\n } catch (err) {\n // A parser that throws on one glyph should cost that glyph, not the face.\n warnOnce(`glyph|${slotKey(family, weight, style)}`,\n `weasel: outline face \"${family}\" (${weight}/${style}) could not produce a glyph ` +\n `for U+${cp.toString(16).toUpperCase().padStart(4, '0')} — ` +\n `${err instanceof Error ? err.message : String(err)}. Falling back to the SDF tier.`);\n }\n slot.glyphs.set(cp, d);\n return d;\n}\n\n/**\n * Metrics for a registered outline face, or `null` when this tier cannot\n * supply them yet — nothing registered, bytes still loading, or a failed load.\n *\n * The face is the *only* metrics source for a family that has no atlas, which\n * is the case this exists for: without it such a family cannot lay out at all.\n * It does not disturb metric neutrality — a family that has an atlas resolves\n * to the atlas long before anything asks here, so registering outlines still\n * cannot move text that was already rendering.\n *\n * Starts the load on a first call and answers `null` for now, exactly like\n * `glyphOutline`, so a per-frame caller falls through and picks it up on the\n * frame after the bytes land.\n */\nexport function outlineMetrics(\n family: string,\n weight: number,\n style: FontStyle,\n): OutlineFace | null {\n const slot = slots.get(slotKey(family, weight, style));\n if (!slot) return null;\n if (slot.status === 'idle') {\n void beginLoad(slot);\n return null;\n }\n return slot.status === 'ready' ? slot.face! : null;\n}\n\nasync function beginLoad(slot: FaceSlot): Promise<void> {\n slot.status = 'loading';\n try {\n slot.face = await slot.parser(await readSource(slot.source));\n slot.status = 'ready';\n // The frame that asked for these glyphs has long since drawn. Without\n // this the outlines sit in memory until something else invalidates the\n // canvas, which on a static document is \"never\".\n notifyGlyphReady();\n } catch (err) {\n slot.status = 'failed';\n warnOnce(`load|${slotKey(slot.family, slot.weight, slot.style)}`,\n `weasel registerFontOutlines(\"${slot.family}\" ${slot.weight}/${slot.style}): ` +\n `${err instanceof Error ? err.message : String(err)}. Large text in this face ` +\n `keeps rendering from the SDF tier.`);\n }\n}\n\nasync function readSource(source: OutlineSource): Promise<ArrayBuffer> {\n const resolved = typeof source === 'function' ? await source() : source;\n if (typeof resolved === 'string') {\n const res = await fetch(resolved);\n if (!res.ok) throw new Error(`HTTP ${res.status} fetching ${resolved}`);\n return res.arrayBuffer();\n }\n if (resolved instanceof ArrayBuffer) return resolved;\n return resolved.arrayBuffer();\n}\n\n// Loading and glyph lookup both run off the render loop, so an unguarded warn\n// would repeat every frame.\nconst warned = new Set<string>();\n\nfunction warnOnce(key: string, message: string): void {\n if (warned.has(key)) return;\n warned.add(key);\n console.warn(message);\n}\n\n/** @internal Test seam — registry and warn-once keys are module state. */\nexport function _resetFontOutlinesForTests(): void {\n slots = new Map();\n warned.clear();\n}\n","/**\n * FontRegistry and registerFont() public API.\n *\n * Variants are keyed by (family, weight, style). registerFont() takes a\n * FontVariant alongside the family and the two URLs; the registry stores\n * entries in a two-level Map so resolveFontVariant() can iterate a family's\n * variants for the fallback chain.\n */\n\nimport type { FontStyle } from './fontStyle';\nimport { notifyGlyphReady } from './glyphReady';\nimport { parseBmFont, type BmFont } from './FontAtlas';\nimport type { GlyphTextureSink } from './textureSink';\nimport {\n isCanvasFont, isExplicitCanvasFont, autoEnrollCanvasFont, getDynamicFace,\n type DynamicFace,\n} from './dynamic/dynamicAtlas';\nimport {\n getFontFallbackPolicy, getDefaultFontFamily,\n claimFallbackWarning, _clearFallbackWarnings,\n} from './fallback';\nimport { outlineMetrics } from './outline/outlineRegistry';\nimport type { OutlineFace } from './outline/OutlineFace';\n\n/** A registered face: its parsed metrics and the atlas image to sample. */\nexport interface FontEntry {\n font: BmFont;\n bitmap: ImageBitmap;\n}\n\n/** Which face within a family. Defaults to weight 400, style `'normal'`. */\nexport interface FontVariant {\n weight?: number;\n style?: FontStyle;\n}\n\n\nlet registry = new Map<string, Map<string, FontEntry>>();\n\nfunction variantKey(weight: number, style: FontStyle): string {\n return `${weight}|${style}`;\n}\n\nfunction normalizeVariant(v: FontVariant): { weight: number; style: FontStyle } {\n return {\n weight: v.weight ?? 400,\n style: v.style ?? 'normal',\n };\n}\n\n/** Test helper. Do not call from product code. */\nexport function _resetFontRegistryForTests(): void {\n registry = new Map();\n _clearFallbackWarnings();\n}\n\n/** Exact lookup — does NOT walk the fallback chain. Use `resolveFontVariant` for that. */\nexport function getFont(\n family: string,\n weight: number = 400,\n style: FontStyle = 'normal',\n): FontEntry | null {\n return registry.get(family)?.get(variantKey(weight, style)) ?? null;\n}\n\n/** One family in the registry and the variants registered for it — what a\n * font picker can honestly offer. */\nexport interface RegisteredFont {\n family: string;\n variants: readonly { weight: number; style: FontStyle }[];\n}\n\n/**\n * Enumerate the registry — what a font picker can honestly offer. Families\n * come back in registration order; variants sorted by weight, then style, so\n * the output is stable enough to assert against.\n */\nexport function listFonts(): readonly RegisteredFont[] {\n const out: RegisteredFont[] = [];\n for (const [family, variantMap] of registry) {\n const variants = [...variantMap.keys()]\n .map((key) => {\n const [w, s] = key.split('|') as [string, FontStyle];\n return { weight: Number(w), style: s };\n })\n .sort((a, b) => a.weight - b.weight || a.style.localeCompare(b.style));\n out.push({ family, variants });\n }\n return out;\n}\n\n/**\n * Fetch a baked MSDF atlas and its metrics, and register them as one variant\n * of `family`. Resolves once the face is usable; re-registering a variant that\n * is already present is a no-op.\n */\nexport async function registerFont(\n family: string,\n variant: FontVariant,\n metricsUrl: string,\n atlasUrl: string,\n): Promise<void> {\n const { weight, style } = normalizeVariant(variant);\n const key = variantKey(weight, style);\n\n if (registry.get(family)?.has(key)) return;\n\n try {\n const [metricsRes, atlasRes] = await Promise.all([\n fetch(metricsUrl),\n fetch(atlasUrl),\n ]);\n\n if (!metricsRes.ok) {\n throw new Error(`HTTP ${metricsRes.status} fetching metrics from ${metricsUrl}`);\n }\n if (!atlasRes.ok) {\n throw new Error(`HTTP ${atlasRes.status} fetching atlas from ${atlasUrl}`);\n }\n\n const [rawJson, blob] = await Promise.all([\n metricsRes.json(),\n atlasRes.blob(),\n ]);\n\n const font = parseBmFont(rawJson);\n const bitmap = await createImageBitmap(blob);\n\n // Re-read the registry here (not the pre-await snapshot): concurrent\n // registerFont() calls for other variants of the same family (e.g. the\n // 400/700 weights registered together in Promise.all) may have created\n // the family's Map while this call was awaiting its fetch. Reusing a\n // stale local reference would recreate the Map and silently drop\n // whichever variant's registerFont() resolved first.\n let familyMap = registry.get(family);\n if (!familyMap) {\n familyMap = new Map();\n registry.set(family, familyMap);\n }\n familyMap.set(key, { font, bitmap });\n // Same meaning the lazy tiers give it: text that was painting from a\n // fallback face — or painting nothing — can now paint from this one. The\n // early return above covers the already-registered case, so this fires\n // once per variant that actually lands.\n notifyGlyphReady();\n } catch (err) {\n throw new Error(\n `weasel registerFont(\"${family}\" ${weight}/${style}): ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/**\n * Ensure the atlas for `(family, weight, style)` is uploaded to\n * `textureCache`. Cache key is `${family}|${weight}|${style}` so each\n * variant occupies its own texture slot.\n */\nexport function ensureFontTexture(\n family: string,\n weight: number,\n style: FontStyle,\n textureCache: GlyphTextureSink,\n): boolean {\n const entry = getFont(family, weight, style);\n if (!entry) return false;\n textureCache.upload(textureCacheKey(family, weight, style), entry.bitmap);\n return true;\n}\n\n/** The texture cache key used by `ensureFontTexture` for a given variant. */\nexport function textureCacheKey(family: string, weight: number, style: FontStyle): string {\n return `${family}|${weight}|${style}`;\n}\n\n/** Kept as a no-op for context-restore call sites; per-cache dedup handles it now. */\nexport function markAllFontsNotUploaded(): void {}\n\n/** What `resolveFontVariant` found: the atlas to draw with, the face it\n * actually landed on after walking the fallback chain, and what has to be\n * synthesized to cover the difference. */\nexport interface ResolveResult {\n entry: FontEntry | null;\n /**\n * The (family, weight, style) triple that was actually matched. May differ\n * from the requested values when the resolver walked the fallback chain —\n * including `family`, when the cross-family policy substituted a default.\n *\n * This is the atlas identity: pass all three to `getFont` /\n * `textureCacheKey` and the lookup hits. Describing only weight and style\n * here once let a caller key its draw on the *requested* family, which\n * resolves to no atlas at all and paints nothing.\n *\n * The synthetic flags describe the gap between requested and resolved for\n * shader-side compensation. When `entry` is null, these mirror the\n * requested values.\n */\n resolved: { family: string; weight: number; style: FontStyle };\n synthetic: { bold: boolean; italic: boolean };\n /** Which tier resolved: a baked MSDF atlas, the runtime canvas-SDF dynamic\n * atlas, or a parsed font face serving both geometry and metrics. Misses\n * report 'atlas' (the default tier). */\n source: 'atlas' | 'canvas' | 'outline';\n /** Set only when source === 'canvas': the dynamic face whose BmFont-shaped\n * `font` layoutRuns consumes in place of `entry.font`. */\n dynamicFace?: DynamicFace;\n /** Set only when source === 'outline': the parsed face supplying advances,\n * kerning and the baseline. There is no atlas behind this tier, so it is\n * the only metrics source the run has. */\n outlineFace?: OutlineFace;\n /**\n * Set when the requested family was not registered and the fallback policy\n * substituted a different one. Reported structurally so a UI can say\n * \"Inter — not loaded, showing Roboto\" instead of leaving the user to\n * wonder why the family control did nothing.\n */\n substituted?: { requested: string; resolved: string };\n}\n\nfunction missResolveResult(\n family: string, weight: number, style: FontStyle, suppressWarn = false,\n): ResolveResult {\n // Canvas-dynamic tier: reached only when the fallback chain selected no\n // baked variant, so any selected baked match always wins. Dynamic faces\n // rasterize the real weight/style — no synthetic flags.\n //\n // Explicit enrollment only. A family the `'canvas'` policy enrolled for\n // itself must not keep routing here after the policy changes, or `'none'`\n // could never restore the hard miss it documents once any family had been\n // auto-enrolled.\n if (isExplicitCanvasFont(family)) {\n return {\n entry: null,\n dynamicFace: getDynamicFace(family, weight, style),\n resolved: { family, weight, style },\n synthetic: { bold: false, italic: false },\n source: 'canvas',\n };\n }\n\n // Outline-only: a family with parsed font bytes and no atlas. Ranked above\n // every fallback below because it is the *real* face — exact geometry and\n // the font's own advances — where the alternatives are a resampled raster\n // or a different typeface. Below explicit canvas enrollment, which is a\n // consumer saying which tier it wants for this family.\n const face = outlineMetrics(family, weight, style === 'italic' ? 'italic' : 'normal');\n if (face) {\n return {\n entry: null,\n outlineFace: face,\n resolved: { family, weight, style },\n synthetic: { bold: false, italic: false },\n source: 'outline',\n };\n }\n\n const policy = getFontFallbackPolicy();\n\n if (policy === 'canvas') {\n // Auto-enroll: the browser probably has this family even though no atlas\n // was baked for it. Real typeface, canvas-SDF quality.\n autoEnrollCanvasFont(family);\n return {\n entry: null,\n dynamicFace: getDynamicFace(family, weight, style),\n resolved: { family, weight, style },\n synthetic: { bold: false, italic: false },\n source: 'canvas',\n };\n }\n\n if (policy === 'substitute') {\n const fallback = getDefaultFontFamily() ?? firstRegisteredFamily();\n // Guard against recursing when the default family is itself unknown.\n // Canvas families never enter `registry`, so membership there alone would\n // reject `setDefaultFontFamily` pointed at one. `isCanvasFont` answers\n // \"served by the dynamic tier right now\", which is the question here: a\n // family the `'canvas'` policy auto-enrolled is not served under this\n // policy, so substituting *to* it would report a swap that paints nothing.\n if (fallback !== null && fallback !== family) {\n if (registry.has(fallback) || isCanvasFont(fallback)) {\n // Probing whether the fallback family renders, not resolving a\n // top-level request for it — suppress so this recursion can't also\n // land in the `fallback === family` branch below (the fallback\n // family's own default is itself) and double-warn for one miss.\n // Whichever of `warnMissingFamilyOnce` / `warnUnusableDefaultOnce`\n // fires below, based on this probe's result, is the single warning.\n const result = resolveFontVariantInternal(fallback, weight, style, true);\n // Renderable, not baked: a fallback served by the dynamic tier reports\n // `entry: null` with a dynamicFace, and testing entry alone threw it away.\n if (result.entry !== null || result.dynamicFace !== undefined) {\n if (!suppressWarn) warnMissingFamilyOnce(family, weight, style, fallback);\n return { ...result, substituted: { requested: family, resolved: fallback } };\n }\n }\n // Substitution was supposed to happen and produced nothing. Falling\n // through silently here is the invisible-text failure this whole policy\n // exists to eliminate, so say which of the two families to fix.\n if (!suppressWarn) warnUnusableDefaultOnce(family, weight, style, fallback);\n } else if (fallback === family && !suppressWarn) {\n // `fallback === family` above exists to stop the request from\n // substituting for itself — recursion into the same miss forever. But\n // when the family that can't serve this variant *is* the effective\n // default, that guard also throws away the one case it was most likely\n // to hit: a default registered at the wrong variant. Nothing renders\n // and, without this branch, nothing is logged either.\n // `suppressWarn` keeps this from firing when a *different* top-level\n // request's substitution probe happens to recurse into the default\n // family and find it can't serve either — that miss is reported by the\n // top-level caller via `warnUnusableDefaultOnce`, not from in here.\n if (registry.has(family)) {\n warnSelfUnusableDefaultOnce(family, weight, style);\n } else {\n // Unregistered, yet still the effective default: the default can only\n // have been named explicitly, because the implicit one is the first\n // *registered* family (and with nothing registered at all, `fallback`\n // is null and never equals `family`). So this is a real\n // misconfiguration — someone pointed setDefaultFontFamily at a family\n // that does not exist — and not the deliberately-silent case of an app\n // that simply hasn't loaded any fonts yet.\n warnUnregisteredDefaultOnce(family, weight, style);\n }\n }\n }\n\n return {\n entry: null,\n resolved: { family, weight, style },\n synthetic: { bold: false, italic: false },\n source: 'atlas',\n };\n}\n\n/** Insertion order of the registry Map — the first family an app registered. */\nfunction firstRegisteredFamily(): string | null {\n for (const family of registry.keys()) return family;\n return null;\n}\n\n// Resolution runs per frame, so an unguarded warn would flood the console.\n// Keyed per (family, weight, style) variant, not per family: each variant is a\n// distinct thing the app asked for and failed to get. The claimed keys live in\n// fallback.ts so both reset seams clear them.\nfunction warnMissingFamilyOnce(\n family: string, weight: number, style: FontStyle, resolved: string,\n): void {\n if (!claimFallbackWarning(`substituted|${family}|${weight}|${style}`)) return;\n // Two distinct failures land here. Saying \"not registered\" for a family\n // that IS registered — just not in a variant the within-family chain can\n // reach — sends the reader hunting for a registerFont call that already\n // exists. Name the actual gap so the fix is the obvious one.\n const cause = registry.has(family)\n ? `has no variant matching ${weight}/${style}, and none of its registered ` +\n `variants are close enough for the within-family chain to substitute — ` +\n `rendering with \"${resolved}\" instead. Bake that variant with ` +\n `registerFont(\"${family}\", { weight: ${weight}, style: '${style}' }, …)`\n : `is not registered — rendering with \"${resolved}\" instead. ` +\n `Call registerFont(\"${family}\", …)`;\n console.warn(\n `weasel: font family \"${family}\" (${weight}/${style}) ${cause}. ` +\n `Advance widths will differ from the requested font. Use ` +\n `setFontFallbackPolicy('none') to make this a hard miss instead.`,\n );\n}\n\n/**\n * The substitute policy engaged and still came up empty. Distinct from\n * `warnMissingFamilyOnce`, which reports a *successful* swap: here nothing\n * renders, and the fix is almost always in the fallback family rather than\n * the requested one — so name it, and say which way it was chosen.\n */\nfunction warnUnusableDefaultOnce(\n family: string, weight: number, style: FontStyle, fallback: string,\n): void {\n if (!claimFallbackWarning(`unusable-default|${family}|${weight}|${style}`)) return;\n const origin = getDefaultFontFamily() === fallback\n ? 'set via setDefaultFontFamily'\n : 'the first registered family, since setDefaultFontFamily was never called';\n // Same policy-aware question as the substitution guard: a fallback the\n // `'canvas'` policy auto-enrolled has nothing serving it under this policy,\n // so \"has no variant\" would send the reader looking for a variant to bake\n // when the family has no atlas at all.\n const gap = registry.has(fallback) || isCanvasFont(fallback)\n ? `has no variant that can serve ${weight}/${style}`\n : 'is not registered either';\n console.warn(\n `weasel: font family \"${family}\" (${weight}/${style}) is not available, and ` +\n `the fallback family \"${fallback}\" (${origin}) ${gap} — this text will not ` +\n `render at all. Bake that variant with registerFont(\"${fallback}\", ` +\n `{ weight: ${weight}, style: '${style}' }, …), or point ` +\n `setDefaultFontFamily() at a family that covers it.`,\n );\n}\n\n/**\n * The requested family is also the effective default — there is nowhere left\n * to fall back to. Distinct from `warnUnusableDefaultOnce`, which names a\n * *different* fallback family to fix; here the requested and fallback\n * families are the same one, so repeating the name the way that message does\n * would read as nonsense (\"X is not available, and the fallback X … \").\n * Named once, with both facts — registered-but-wrong-variant, and also the\n * fallback — folded into a single sentence.\n */\nfunction warnSelfUnusableDefaultOnce(\n family: string, weight: number, style: FontStyle,\n): void {\n if (!claimFallbackWarning(`self-unusable-default|${family}|${weight}|${style}`)) return;\n const origin = getDefaultFontFamily() === family\n ? 'set via setDefaultFontFamily'\n : 'the first registered family, since setDefaultFontFamily was never called';\n console.warn(\n `weasel: font family \"${family}\" (${weight}/${style}) has no variant that can ` +\n `serve this request, and \"${family}\" is also the fallback family (${origin}) — ` +\n `there is nothing left to fall back to, so this text will not render at all. ` +\n `Bake that variant with registerFont(\"${family}\", { weight: ${weight}, ` +\n `style: '${style}' }, …), or point setDefaultFontFamily() at a different family.`,\n );\n}\n\n/**\n * The requested family is the explicitly set default, and that default names\n * a family that was never registered at all. Distinct from\n * `warnSelfUnusableDefaultOnce`, which reports a default that *is* registered\n * but not in a variant that can serve the request: there the fix is to bake a\n * variant, here the family has no atlas whatsoever, so pointing the reader at\n * a missing variant would send them looking for a `registerFont` call to\n * amend rather than one to write.\n */\nfunction warnUnregisteredDefaultOnce(\n family: string, weight: number, style: FontStyle,\n): void {\n if (!claimFallbackWarning(`unregistered-default|${family}|${weight}|${style}`)) return;\n console.warn(\n `weasel: font family \"${family}\" (${weight}/${style}) was never registered, and ` +\n `it is also the fallback family — setDefaultFontFamily(\"${family}\") names a ` +\n `family with no registered variants at all, so there is nothing left to fall ` +\n `back to and this text will not render at all. Call registerFont(\"${family}\", ` +\n `{ weight: ${weight}, style: '${style}' }, …), or point setDefaultFontFamily() ` +\n `at a family you have registered.`,\n );\n}\n\nfunction weightBucket(w: number): 'regular' | 'bold' {\n return w >= 600 ? 'bold' : 'regular';\n}\n\n/**\n * Resolve a `(family, weight, style)` request to a registered font entry,\n * walking the fallback chain when an exact match isn't available. Returns\n * synthetic flags describing the gap between requested and resolved so the\n * renderer can apply SDF-thicken / vertex-skew fakes.\n */\nexport function resolveFontVariant(\n family: string,\n weight: number,\n style: FontStyle,\n): ResolveResult {\n return resolveFontVariantInternal(family, weight, style, false);\n}\n\n/**\n * Escalate a *single codepoint* to the dynamic tier when the atlas that\n * resolved for the run has no glyph for it.\n *\n * `resolveFontVariant` answers at family granularity: it picks one tier for a\n * whole run. But a baked MSDF atlas covers a fixed charset, so a run served by\n * a perfectly good atlas can still contain a character that atlas never baked\n * — an em dash, a curly quote, anything outside the subset. The dynamic tier\n * rasterizes on demand from installed fonts and can serve exactly those.\n *\n * Returns a canvas-tier `ResolveResult` whose `dynamicFace` the caller drives\n * with `requestGlyph(cp)`, or `null` when escalation isn't available:\n *\n * - Policy `'none'` documents a miss as a *hard* miss. Quietly reaching for\n * another tier per codepoint would undo that, so it doesn't.\n * - No canvas to rasterize into (SSR, a jsdom test without one) makes the\n * dynamic tier constructible-but-broken; `getDynamicFace` throws and this\n * reports the miss instead of taking the caller down with it.\n *\n * Cheap to call per missing codepoint: faces are cached by variant and glyphs\n * by codepoint, so a repeat is two map lookups.\n */\nexport function resolveGlyphFallback(\n family: string,\n weight: number,\n style: FontStyle,\n): ResolveResult | null {\n if (getFontFallbackPolicy() === 'none') return null;\n try {\n return {\n entry: null,\n dynamicFace: getDynamicFace(family, weight, style),\n resolved: { family, weight, style },\n // The dynamic tier rasterizes the real weight and style, so there is\n // nothing for the shader to fake.\n synthetic: { bold: false, italic: false },\n source: 'canvas',\n };\n } catch {\n return null;\n }\n}\n\n/**\n * `suppressWarn` is set only by the recursive substitution probe in\n * `missResolveResult`, which resolves the fallback family purely to check\n * whether it renders. That probe is not itself a request anything asked\n * for, so it must not emit — or claim the warn-once key for — a message\n * about a resolution the caller never made; the caller's own top-level\n * `missResolveResult` call decides, from the probe's result, which single\n * warning (if any) describes the overall miss.\n */\nfunction resolveFontVariantInternal(\n family: string,\n weight: number,\n style: FontStyle,\n suppressWarn: boolean,\n): ResolveResult {\n const familyMap = registry.get(family);\n if (!familyMap || familyMap.size === 0) {\n return missResolveResult(family, weight, style, suppressWarn);\n }\n\n // 1. Exact match\n const exact = familyMap.get(variantKey(weight, style));\n if (exact) {\n return {\n entry: exact,\n resolved: { family, weight, style },\n synthetic: { bold: false, italic: false },\n source: 'atlas',\n };\n }\n\n // 2. Same style, nearest weight in same bucket (ties broken by higher weight)\n const requestedBucket = weightBucket(weight);\n let bestSameStyle: { entry: FontEntry; weight: number; distance: number } | null = null;\n for (const [key, entry] of familyMap) {\n const [wStr, s] = key.split('|') as [string, FontStyle];\n const w = Number(wStr);\n if (s !== style) continue;\n if (weightBucket(w) !== requestedBucket) continue;\n const distance = Math.abs(w - weight);\n if (\n bestSameStyle === null ||\n distance < bestSameStyle.distance ||\n (distance === bestSameStyle.distance && w > bestSameStyle.weight)\n ) {\n bestSameStyle = { entry, weight: w, distance };\n }\n }\n if (bestSameStyle) {\n return {\n entry: bestSameStyle.entry,\n resolved: { family, weight: bestSameStyle.weight, style },\n synthetic: { bold: false, italic: false },\n source: 'atlas',\n };\n }\n\n // 3. (family, 400, style)\n const sameStyleRegular = familyMap.get(variantKey(400, style));\n if (sameStyleRegular) {\n return {\n entry: sameStyleRegular,\n resolved: { family, weight: 400, style },\n synthetic: {\n bold: weight >= 600,\n italic: false,\n },\n source: 'atlas',\n };\n }\n\n // 4. (family, weight, 'normal') — same weight, no italic\n const sameWeightNormal = familyMap.get(variantKey(weight, 'normal'));\n if (sameWeightNormal) {\n return {\n entry: sameWeightNormal,\n resolved: { family, weight, style: 'normal' },\n synthetic: {\n bold: false,\n italic: style === 'italic',\n },\n source: 'atlas',\n };\n }\n\n // 4b. Nearest weight, normal style, same bucket\n let bestNormal: { entry: FontEntry; weight: number; distance: number } | null = null;\n for (const [key, entry] of familyMap) {\n const [wStr, s] = key.split('|') as [string, FontStyle];\n const w = Number(wStr);\n if (s !== 'normal') continue;\n if (weightBucket(w) !== requestedBucket) continue;\n const distance = Math.abs(w - weight);\n if (\n bestNormal === null ||\n distance < bestNormal.distance ||\n (distance === bestNormal.distance && w > bestNormal.weight)\n ) {\n bestNormal = { entry, weight: w, distance };\n }\n }\n if (bestNormal) {\n return {\n entry: bestNormal.entry,\n resolved: { family, weight: bestNormal.weight, style: 'normal' },\n synthetic: {\n bold: false,\n italic: style === 'italic',\n },\n source: 'atlas',\n };\n }\n\n // 5. (family, 400, 'normal') — last resort within family\n const regular = familyMap.get(variantKey(400, 'normal'));\n if (regular) {\n return {\n entry: regular,\n resolved: { family, weight: 400, style: 'normal' },\n synthetic: {\n bold: weight >= 600,\n italic: style === 'italic',\n },\n source: 'atlas',\n };\n }\n\n return missResolveResult(family, weight, style, suppressWarn);\n}\n","/**\n * Font-family picker driven by the live font registry.\n *\n * **What it offers.** Both tiers that can actually paint: `listFonts()` for\n * families with a baked atlas, and `listCanvasFonts()` for families the\n * dynamic canvas-SDF tier will serve. Offer what will render, invent\n * nothing — and `listCanvasFonts` reports service rather than membership,\n * so a family auto-enrolled under a policy that is no longer in force\n * doesn't appear.\n *\n * **What it does with a value it can't offer.** Nothing about the model\n * stops a node from naming a family that was never registered — a pasted\n * node, an imported SVG, a document from a session that loaded more fonts.\n * The control keeps that value visible as its own entry and names what is\n * actually painting instead, read structurally off\n * `resolveFontVariant().substituted`. Dropping the value would silently\n * rewrite the document on the next edit; showing it bare would claim a font\n * is in use that isn't.\n */\nimport { listCanvasFonts, listFonts, resolveFontVariant } from '@weasel-js/font';\nimport { Select } from '../Select';\n\nexport interface FontFamilySelectProps {\n /** Current family, or `undefined` when the sources disagree (`mixed`). */\n value?: string;\n /** Indeterminate presentation — the aggregated sources name different families. */\n mixed?: boolean;\n onChange: (family: string) => void;\n /** The weight / style the text actually renders at, so the substitution\n * probe reports the variant that paints rather than a nominal 400/normal. */\n weight?: number;\n fontStyle?: 'normal' | 'italic';\n 'aria-label'?: string;\n className?: string;\n}\n\n/** Label for a value that isn't in the registry: name the substitute when the\n * fallback chain found one, otherwise say only what is known. */\nfunction unregisteredLabel(family: string, weight: number, style: 'normal' | 'italic'): string {\n const { substituted } = resolveFontVariant(family, weight, style);\n return substituted\n ? `${family} — not loaded, showing ${substituted.resolved}`\n : `${family} — not loaded`;\n}\n\nexport function FontFamilySelect(props: FontFamilySelectProps) {\n const { value, mixed = false, onChange, weight = 400, fontStyle = 'normal', className } = props;\n // Both tiers that actually render: families with a baked atlas, and\n // families the dynamic canvas-SDF tier will serve. Neither list is a guess\n // — `listCanvasFonts` reports what the registry will really route, so a\n // family reaches this menu only if it can paint.\n const baked = listFonts();\n const canvas = listCanvasFonts().filter((c) => !baked.some((f) => f.family === c.family));\n const available = [...baked.map((f) => f.family), ...canvas.map((c) => c.family)];\n const options = available.map((family) => ({ value: family, label: family }));\n if (value !== undefined && !available.includes(value)) {\n options.push({ value, label: unregisteredLabel(value, weight, fontStyle) });\n }\n return (\n <Select<string>\n className={className}\n options={options}\n selectedKey={mixed ? null : (value ?? null)}\n placeholder={mixed ? 'Mixed' : undefined}\n onSelectionChange={onChange}\n aria-label={props['aria-label'] ?? 'Font'}\n />\n );\n}\n","// A `FillStyle` as one CSS background string, for the swatches and chips that\n// stand in for a paint in a panel.\n//\n// The gradient kinds are sampled rather than translated stop for stop: CSS\n// blends its own stops in sRGB, so an OKLCh gradient handed over as two stops\n// would preview as the sRGB blend of its ends. Sampling through\n// `sampleGradientStops` in the paint's own space puts the curve into the\n// stops themselves, and the browser only interpolates the short hops between.\n\nimport { sampleGradientStops, type FillStyle } from '@weasel-js/core';\n\n/** Sample count along a previewed gradient. Enough that a hue arc reads as a\n * curve at chip size; a straight sRGB ramp would need a fraction of it. */\nconst SAMPLES = 24;\n\n/**\n * A mesh patch as four corner radials over a flat base.\n *\n * This is an approximation and cannot be anything else — CSS has no mesh, and\n * the real surface only exists once the renderer has baked it. Each corner\n * fades out across the chip and they composite to something bilinear-ish,\n * which is enough for a swatch to say \"this one, not that one\". Zero alpha is\n * written as `color-mix` with `transparent` so a named or packed-alpha color\n * works without being parsed here.\n */\nfunction meshPreview(paint: { patches?: { colors: string[] }[] }): string | undefined {\n const colors = paint.patches?.[0]?.colors;\n if (!colors || colors.length < 4) return undefined;\n const fade = (c: string): string => `color-mix(in srgb, ${c} 0%, transparent)`;\n const at: [string, string][] = [\n ['0% 0%', colors[0]], ['100% 0%', colors[1]],\n ['100% 100%', colors[2]], ['0% 100%', colors[3]],\n ];\n const layers = at.map(([pos, c]) =>\n `radial-gradient(farthest-corner at ${pos}, ${c}, ${fade(c)})`);\n // The base keeps the middle opaque where the four fades have all thinned.\n layers.push(`linear-gradient(to bottom, ${colors[0]}, ${colors[2]})`);\n return layers.join(', ');\n}\n\n/** CSS color stops across the whole ramp, in the gradient's own blend space. */\nfunction sampledStops(paint: Extract<FillStyle, { stops: unknown }>): string {\n const space = paint.interpolate ?? 'rgb';\n const out: string[] = [];\n for (let i = 0; i <= SAMPLES; i++) {\n const t = i / SAMPLES;\n out.push(`${sampleGradientStops(paint.stops, t, space)} ${(t * 100).toFixed(1)}%`);\n }\n return out.join(', ');\n}\n\nconst DEG = 180 / Math.PI;\n\n/** A fraction of the box as a CSS percentage. A gradient in absolute units has\n * no box to be a fraction of, so its geometry only ever approximates here. */\nfunction pct(v: number): string {\n return `${(v * 100).toFixed(1)}%`;\n}\n\n/**\n * `paint` as a CSS `background` value, or `undefined` for a paint with no CSS\n * form — a pattern, a registered kind — which a caller shows as a checker or\n * a placeholder rather than as an invented color.\n *\n * Gradient geometry is honored as far as CSS can carry it: the angle of a\n * linear gradient, the center of a radial or conic one. A paint in `'world'`\n * or `'local'` units is measured in the scene rather than in the chip, so its\n * preview shows the ramp and not the placement.\n */\nexport function paintPreviewCss(paint: FillStyle | null | undefined): string | undefined {\n if (paint == null) return undefined;\n const kind = paint.fill ?? 'solid';\n if (kind === 'solid') return (paint as { color: string }).color;\n\n if (paint.fill === 'linear-gradient') {\n const dx = paint.to.x - paint.from.x;\n const dy = paint.to.y - paint.from.y;\n // CSS measures from \"to top\", clockwise; the paint measures in a\n // y-down plane from +x.\n const angle = dx === 0 && dy === 0 ? 90 : Math.atan2(dx, -dy) * DEG;\n return `linear-gradient(${angle.toFixed(1)}deg, ${sampledStops(paint)})`;\n }\n if (paint.fill === 'radial-gradient') {\n const at = `at ${pct(paint.center.x)} ${pct(paint.center.y)}`;\n return `radial-gradient(circle ${at}, ${sampledStops(paint)})`;\n }\n if ((paint.fill as string) === 'mesh-gradient') {\n return meshPreview(paint as unknown as { patches?: { colors: string[] }[] });\n }\n if (paint.fill === 'conic-gradient') {\n // CSS starts a conic gradient at \"to top\"; the paint starts at +x.\n const from = (paint.angle * DEG + 90).toFixed(1);\n return `conic-gradient(from ${from}deg at ${pct(paint.center.x)} ${pct(paint.center.y)}, ${sampledStops(paint)})`;\n }\n return undefined;\n}\n","import { type ReactElement } from 'react';\nimport {\n asPaint,\n isMeshGradientFill,\n type ColorSpace,\n type FillStyle,\n type MeshGradientFill,\n} from '@weasel-js/core';\nimport { ColorField } from '../ColorField';\nimport { ToggleBar, type ToggleBarItem } from '../ToggleBar';\nimport { paintPreviewCss } from '../../paintPreview';\nimport s from './MeshEditor.module.css';\n\nconst SPACES: readonly ToggleBarItem<ColorSpace>[] = [\n { value: 'rgb', label: 'sRGB' },\n { value: 'oklab', label: 'OKLab' },\n { value: 'oklch', label: 'OKLCh' },\n];\n\n/** Props for {@link MeshEditor}. `onInput` fires throughout a gesture and\n * `onChange` once at its end. */\nexport interface MeshEditorProps {\n value: MeshGradientFill;\n /** Emitted as a `FillStyle`, which is what every paint control passes\n * around — `FillStyle`'s discriminant stays closed over the built-in\n * members, so a registered kind's own shape only travels through it. */\n onInput?: (next: FillStyle) => void;\n onChange: (next: FillStyle) => void;\n /** Show the sRGB / OKLab / OKLCh switch. Default true. */\n spaceSwitch?: boolean;\n className?: string;\n}\n\n/**\n * Editor for a mesh gradient's colors.\n *\n * Geometry is absent for the same reason it is absent from `GradientEditor`:\n * a patch's twelve control points are a thing to drag on the artwork, not a\n * column of numbers in a panel. What is left is what a panel is good at — the\n * color at each corner, and the space the four of them blend through.\n *\n * Corners are numbered in the patch's own walk order, which is the order the\n * paint stores them in, so a corner's number is stable while it is dragged.\n */\nexport function MeshEditor(props: MeshEditorProps): ReactElement {\n const { value, onInput, onChange, spaceSwitch = true, className } = props;\n const space = value.interpolate ?? 'rgb';\n\n const withCorner = (patchIndex: number, corner: number, color: string): FillStyle => asPaint({\n ...value,\n patches: value.patches.map((patch, i) => {\n if (i !== patchIndex) return patch;\n const [a, b, c, d] = patch.colors;\n const next: [string, string, string, string] = [a, b, c, d];\n next[corner] = color;\n return { ...patch, colors: next };\n }),\n });\n\n return (\n <div className={[s.root, className].filter(Boolean).join(' ')}>\n {value.patches.map((patch, patchIndex) => (\n // A patch has no id; its position in the list is its identity, the way\n // a gradient stop's is.\n <div key={patchIndex} className={s.patch}>\n <span\n className={s.preview}\n aria-hidden=\"true\"\n style={{ background: previewOf(value, patchIndex) }}\n />\n <div className={s.corners}>\n {patch.colors.map((color, corner) => (\n <ColorField\n key={corner}\n value={color}\n alpha\n aria-label={`Patch ${patchIndex + 1} corner ${corner + 1}`}\n className={s.corner}\n onInput={(next) => onInput?.(withCorner(patchIndex, corner, next))}\n onChange={(next) => onChange(withCorner(patchIndex, corner, next))}\n />\n ))}\n </div>\n </div>\n ))}\n\n {spaceSwitch && (\n <ToggleBar<ColorSpace>\n items={SPACES}\n value={space}\n size=\"sm\"\n ariaLabel=\"Blend space\"\n onChange={(next) => next && onChange(asPaint({ ...value, interpolate: next }))}\n />\n )}\n </div>\n );\n}\n\n/** One patch as a swatch: the paint with the other patches taken out, so a\n * multi-patch mesh shows which row belongs to which part of it. */\nfunction previewOf(value: MeshGradientFill, patchIndex: number): string | undefined {\n return paintPreviewCss(\n { ...value, patches: [value.patches[patchIndex]] } as unknown as FillStyle,\n );\n}\n\n/** Narrowing for a consumer rendering this behind a kind switch. */\nexport function isMeshPaint(fill: FillStyle | null | undefined): fill is FillStyle & MeshGradientFill {\n return isMeshGradientFill(fill);\n}\n","import type { ReactElement } from 'react';\nimport type { CSSProperties } from 'react';\nimport type { FillStyle, TilePatternSpec } from '@weasel-js/core';\nimport { tilePreviewCssUrl } from '@weasel-js/svg';\nimport { ToggleBar } from '../ToggleBar';\nimport s from './PatternPicker.module.css';\n\n/** The `pattern` member of the paint union. */\nexport type PatternFill = Extract<FillStyle, { fill: 'pattern' }>;\n\nconst TILES: readonly TilePatternSpec['tile'][] = ['hatch', 'crosshatch', 'dots', 'chunks'];\n\n/** Tile sizes the picker offers, coarse enough that each reads as a\n * distinct texture rather than a nudge. */\nconst TILE_SIZES: readonly { value: number; label: string }[] = [\n { value: 4, label: 'S' },\n { value: 8, label: 'M' },\n { value: 16, label: 'L' },\n { value: 32, label: 'XL' },\n];\n\nconst DEFAULT_TILE_SIZE = 8;\n\n/** Every swatch previews at one size so the grid compares tiles, not scales. */\nconst PREVIEW_SIZE = 16;\n\n/** The spec a pattern paint carries, if it carries one. A consumer-built\n * `TextureHandle` has no spec, so the picker shows no tile selected and\n * replaces it wholesale on the next click. */\nfunction specOf(fill: PatternFill): TilePatternSpec | null {\n return 'tile' in fill.pattern ? fill.pattern : null;\n}\n\n/**\n * A pattern seeded from a color. `units: 'bounds'` anchors the tile to the\n * node's box, so the texture travels with the shape.\n */\nexport function seedPattern(\n tile: TilePatternSpec['tile'],\n from: string,\n size: number = DEFAULT_TILE_SIZE,\n): PatternFill {\n const spec: TilePatternSpec = { tile, color: from, size };\n // `chunks` is a scatter over a ground rather than a line texture; without a\n // background it reads as loose specks on whatever sits beneath.\n if (tile === 'chunks') spec.bg = '#00000000';\n return { fill: 'pattern', pattern: spec, units: 'bounds' };\n}\n\n/** Props for {@link PatternPicker}. */\nexport interface PatternPickerProps {\n /** The pattern paint being edited. */\n value: PatternFill;\n /** The color new tiles are seeded with — the paint's own, normally. */\n color: string;\n /** Committed value: one call per click. A tile pick and a size change are\n * each a complete gesture, so there is no `onInput`. */\n onChange: (next: PatternFill) => void;\n className?: string;\n}\n\n/**\n * Grid of tile swatches over a size switch, each swatch previewing the real\n * tile at the current color.\n *\n * The preview shares its shape mapper with what the renderer paints, so a\n * swatch cannot drift from the texture it selects.\n */\nexport function PatternPicker(props: PatternPickerProps): ReactElement {\n const { value, color, onChange, className } = props;\n const spec = specOf(value);\n const size = spec?.size ?? DEFAULT_TILE_SIZE;\n\n const pick = (tile: TilePatternSpec['tile']): void => {\n onChange(seedPattern(tile, color, size));\n };\n\n const resize = (nextSize: number): void => {\n if (!spec) return;\n onChange({ ...value, pattern: { ...spec, size: nextSize } });\n };\n\n return (\n <div className={[s.root, className].filter(Boolean).join(' ')}>\n <div className={s.grid}>\n {TILES.map((tile) => {\n const preview: TilePatternSpec = { tile, color, size: PREVIEW_SIZE };\n if (tile === 'chunks') preview.bg = '#00000000';\n const selected = spec?.tile === tile;\n return (\n <button\n key={tile}\n type=\"button\"\n className={[s.swatch, selected && s.swatchActive].filter(Boolean).join(' ')}\n style={{ ['--tile-preview' as string]: tilePreviewCssUrl(preview) } as CSSProperties}\n title={tile}\n aria-label={tile}\n aria-pressed={selected}\n onClick={() => pick(tile)}\n />\n );\n })}\n </div>\n <ToggleBar<number>\n items={TILE_SIZES}\n value={size}\n size=\"sm\"\n ariaLabel=\"Tile size\"\n onChange={(v) => v != null && resize(v)}\n />\n </div>\n );\n}\n","import { useCallback, useRef, type ReactElement } from 'react';\nimport {\n getPaintKind,\n listPaintKinds,\n withGradientKind,\n type FillStyle,\n type GradientFill,\n type GradientKind,\n type PaintKind,\n} from '@weasel-js/core';\nimport { Icon } from '../../icons/Icon';\nimport { ICON_PATHS, type IconName } from '../../icons/paths';\nimport { ColorField } from '../ColorField';\nimport { GradientEditor } from '../GradientEditor';\nimport { MeshEditor, isMeshPaint } from '../MeshEditor';\nimport { PatternPicker, type PatternFill } from '../PatternPicker';\nimport { ToggleBar, type ToggleBarItem } from '../ToggleBar';\nimport s from './PaintInput.module.css';\n\n/** What a kind with no color of its own seeds from. */\nconst FALLBACK_COLOR = '#000000ff';\n\n/** The bar's answer for \"no paint at all\". Not a registered kind — absence\n * has no seed, no color and nothing to render — so it is this control's own\n * segment rather than a registry entry. */\nconst NONE = 'none';\n\nconst GRADIENT_KINDS: readonly string[] = [\n 'linear-gradient',\n 'radial-gradient',\n 'conic-gradient',\n];\n\nfunction isGradient(paint: FillStyle | undefined): paint is GradientFill {\n return paint !== undefined && GRADIENT_KINDS.includes(paint.fill ?? '');\n}\n\nfunction isPattern(paint: FillStyle | undefined): paint is PatternFill {\n return paint?.fill === 'pattern';\n}\n\n/** A paint's own discriminant. The solid member leaves `fill` off, and an\n * explicit `null` is the absence of paint rather than an unknown one. */\nfunction kindOf(paint: FillStyle | null | undefined): PaintKind | null {\n if (paint === null) return NONE;\n if (paint === undefined) return null;\n return paint.fill ?? 'solid';\n}\n\n/** Props for {@link PaintInput}. `onInput` fires throughout a gesture and\n * `onChange` once at its end. */\nexport interface PaintInputProps {\n /** The paint being edited. `null` is an explicit \"no paint\"; `undefined`\n * is no value to show. */\n value: FillStyle | null | undefined;\n /** Indeterminate presentation: no kind lit, and the body withheld because\n * there is no single paint to show. */\n mixed?: boolean;\n /** Dim the control — a value is in effect but was never chosen. */\n unset?: boolean;\n /** Restrict the kind bar. Default: every registered kind. */\n kinds?: readonly PaintKind[];\n /** Offer \"None\". Default `true` — the bar answers \"what kind of paint is\n * this?\" and no-paint is one of the answers. Turn it off where the slot\n * cannot express absence. */\n allowNone?: boolean;\n onInput?: (next: FillStyle | null) => void;\n onChange: (next: FillStyle | null) => void;\n /** Names the paint this control edits — `Fill`, `Color`. Carried by the\n * solid body's swatch, which is the part with a value to announce. */\n 'aria-label'?: string;\n className?: string;\n}\n\n/**\n * Editor for a whole `FillStyle` — a kind bar over whichever body that kind\n * wants.\n *\n * The bar is driven by the paint-kind registry rather than a fixed list, so a\n * consumer's registered kind appears in it and renders that entry's `Editor`.\n * The five built-in kinds keep their branch here: their editors live in this\n * package and `@weasel-js/core`, which owns the registry, cannot import it.\n *\n * Geometry is deliberately absent — on a canvas it belongs on the artwork,\n * via `<SceneGradientHandles>`.\n */\nexport function PaintInput(props: PaintInputProps): ReactElement {\n const {\n value, mixed = false, unset = false, kinds, allowNone = true,\n onInput, onChange, className,\n } = props;\n const ariaLabel = props['aria-label'];\n\n // Per-kind memory, so linear → solid → linear comes back with its stops.\n // A ref, not state: it must not survive the control being pointed at a\n // different selection, and nothing renders off it directly.\n const remembered = useRef(new Map<PaintKind, FillStyle>());\n\n const active = mixed ? null : kindOf(value);\n if (value != null && active !== null) remembered.current.set(active, value);\n\n const entries = listPaintKinds().filter(\n (entry) => kinds === undefined || kinds.includes(entry.id),\n );\n const segment = (id: string, label: string, icon: string | undefined): ToggleBarItem<PaintKind> =>\n icon && icon in ICON_PATHS\n // Icon-only: six labelled segments do not fit a property row, and the\n // full label stays the accessible name.\n // 14 to match the panel's other glyph segments. A `sm` bar is 17px tall\n // over 1px of padding, so 15 fills the segment box edge to edge.\n ? { value: id, label: <Icon name={icon as IconName} size={14} />, ariaLabel: label }\n : { value: id, label };\n\n const items: readonly ToggleBarItem<PaintKind>[] = [\n ...(allowNone ? [segment(NONE, 'None', 'paintNone')] : []),\n ...entries.map((entry) => segment(entry.id, entry.label, entry.icon)),\n ];\n\n /** The color a switch seeds from: whatever the current paint shows. */\n const currentColor = useCallback((): string => {\n if (value == null) return FALLBACK_COLOR;\n return getPaintKind(kindOf(value) ?? 'solid')?.colorOf(value) ?? FALLBACK_COLOR;\n }, [value]);\n\n const switchKind = (kind: PaintKind): void => {\n if (kind === active) return;\n if (kind === NONE) {\n onChange(null);\n return;\n }\n const seen = remembered.current.get(kind);\n if (seen !== undefined) {\n onChange(seen);\n return;\n }\n if (value != null && isGradient(value) && GRADIENT_KINDS.includes(kind)) {\n onChange(withGradientKind(value, kind as GradientKind));\n return;\n }\n const entry = getPaintKind(kind);\n if (entry) onChange(entry.seed(currentColor()));\n };\n\n return (\n <div\n className={[s.root, unset && s.unset, className].filter(Boolean).join(' ')}\n title={unset ? 'Not set' : undefined}\n >\n <ToggleBar<PaintKind>\n items={items}\n value={active}\n size=\"sm\"\n ariaLabel=\"Paint kind\"\n onChange={(kind) => kind && switchKind(kind)}\n />\n {renderBody()}\n </div>\n );\n\n function renderBody(): ReactElement | null {\n if (mixed || value === undefined) {\n return (\n <ColorField\n mixed\n aria-label={ariaLabel}\n onChange={(color) => onChange({ fill: 'solid', color })}\n />\n );\n }\n // Absence has nothing to edit. The lit segment is the whole statement.\n if (value === null) return null;\n // A registered `Editor` wins even for a built-in id: re-registering one is\n // how a consumer replaces a kit control, and the built-in branches below\n // are the fallback for the ids that ship without an entry editor.\n const entry = getPaintKind(kindOf(value) ?? 'solid');\n if (entry?.Editor) {\n const Editor = entry.Editor;\n return <Editor value={value} onInput={onInput} onChange={onChange} />;\n }\n if (isGradient(value)) {\n return (\n <GradientEditor\n value={value}\n kindSwitch={false}\n onInput={onInput}\n onChange={onChange}\n />\n );\n }\n if (isPattern(value)) {\n return <PatternPicker value={value} color={currentColor()} onChange={onChange} />;\n }\n if (isMeshPaint(value)) {\n return <MeshEditor value={value} onInput={onInput} onChange={onChange} />;\n }\n const kind = kindOf(value);\n if (kind !== 'solid') {\n // Editing a paint this control cannot represent would overwrite it, so\n // a kind with no editor is shown and left alone.\n return <div className={s.noEditor}>{entry?.label ?? kind}: no editor</div>;\n }\n return (\n <ColorField\n value={currentColor()}\n alpha\n aria-label={ariaLabel}\n onInput={(color) => onInput?.({ fill: 'solid', color })}\n onChange={(color) => onChange({ fill: 'solid', color })}\n />\n );\n }\n}\n","import { type ReactElement } from 'react';\nimport {\n Button as RACButton,\n Dialog as RACDialog,\n DialogTrigger,\n Popover as RACPopover,\n} from 'react-aria-components';\nimport { getPaintKind, type FillStyle, type PaintKind } from '@weasel-js/core';\nimport { useOverlayPortal, type OverlayPortalProps } from '../../overlays/portalHost';\nimport { paintPreviewCss } from '../../paintPreview';\nimport { PaintInput } from '../PaintInput';\nimport s from './PaintField.module.css';\n\n/** Props for {@link PaintField}. `onInput` fires throughout a gesture inside\n * the popover and `onChange` once at its end. */\nexport interface PaintFieldProps extends OverlayPortalProps {\n /** The paint being edited. `null` is an explicit \"no paint\"; `undefined` is\n * no value to show. */\n value: FillStyle | null | undefined;\n /** Indeterminate presentation: the trigger says \"Mixed\" and the editor\n * lights no kind. */\n mixed?: boolean;\n /** Dim the trigger — a value is in effect but was never chosen. */\n unset?: boolean;\n /** Restrict the editor's kind bar. Default: every registered kind. */\n kinds?: readonly PaintKind[];\n /** Offer \"None\" in the editor. Default `true`. */\n allowNone?: boolean;\n onInput?: (next: FillStyle | null) => void;\n onChange: (next: FillStyle | null) => void;\n /** Names the paint this field edits — `Fill`, `Color`. */\n 'aria-label'?: string;\n className?: string;\n}\n\n/** What the trigger says it is holding. */\nfunction kindLabel(paint: FillStyle | null | undefined, mixed: boolean): string {\n if (mixed) return 'Mixed';\n if (paint === null) return 'None';\n if (paint === undefined) return '—';\n return getPaintKind(paint.fill ?? 'solid')?.label ?? (paint.fill ?? 'solid');\n}\n\n/**\n * A whole `FillStyle` in one control slot: a swatch that says which kind it\n * holds, and a popover holding {@link PaintInput}.\n *\n * `PaintInput` itself is a kind bar over a body — six segments and a stop\n * editor — which a property row's control column cannot hold. This is the\n * shape for a narrow slot, and the difference that matters is fidelity: a\n * `ColorField` in that slot reads a gradient's first stop and writes a solid\n * back, so touching the control loses the paint.\n */\nexport function PaintField(props: PaintFieldProps): ReactElement {\n const {\n value, mixed = false, unset = false, kinds, allowNone = true,\n onInput, onChange, className, portalContainer,\n } = props;\n const ariaLabel = props['aria-label'];\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n const preview = mixed ? undefined : paintPreviewCss(value);\n\n return (\n <DialogTrigger>\n {anchor}\n <RACButton\n className={[s.trigger, className].filter(Boolean).join(' ')}\n aria-label={ariaLabel}\n {...(unset ? { 'data-unset': '' } : {})}\n {...(mixed ? { 'data-mixed': '' } : {})}\n >\n <span\n className={s.swatch}\n aria-hidden=\"true\"\n {...(preview ? { style: { background: preview } } : { 'data-empty': '' })}\n />\n <span className={s.label}>{kindLabel(value, mixed)}</span>\n </RACButton>\n {/* `data-weasel-overlay`: see Select — the popover renders in a portal,\n outside the subtree the trigger sits in. */}\n <RACPopover className={s.popover} data-weasel-overlay=\"\" {...portalProps}>\n <RACDialog className={s.body} aria-label={ariaLabel ? `${ariaLabel} editor` : 'Paint editor'}>\n <PaintInput\n value={value}\n mixed={mixed}\n unset={unset}\n kinds={kinds}\n allowNone={allowNone}\n onInput={onInput}\n onChange={onChange}\n aria-label={ariaLabel}\n />\n </RACDialog>\n </RACPopover>\n </DialogTrigger>\n );\n}\n","import { createContext, forwardRef, type ReactNode, type Ref, useContext } from 'react';\nimport { Focusable } from 'react-aria-components';\nimport { type StanceProps, useStance } from '../stance';\nimport { Tooltip, TooltipTrigger } from '../Tooltip';\nimport type { PropertyFieldChrome } from './PropertyField';\nimport s from './Properties.module.css';\n\n/**\n * How much room a container gives its rows — gaps, padding, and field height,\n * moved together. Set on any container in the family; it reaches every\n * descendant, so an inner group can differ from the panel around it.\n */\nexport type PropertyDensity = 'tight' | 'normal' | 'roomy';\n\n/** Where an inline row's label and control sit on the row's cross axis. Set on\n * a container to line a whole column of them up. */\nexport type PropertyAlign = 'start' | 'center' | 'end' | 'baseline';\n\n/** Metric props every container in the family takes. Both reach descendants,\n * so the nearest container that states one wins. */\nexport interface PropertyMetricProps {\n /** Room the rows get. Unset inherits from an outer container, else `normal`. */\n density?: PropertyDensity;\n /**\n * Cross-axis alignment of an inline row's label and control. `baseline` sits\n * the control on the label's first-line baseline, which is what lines a\n * column of swatches up against labels of different heights. Unset keeps each\n * variant's own alignment — a color row centers its label and swatch and\n * sinks the pair to the row's bottom edge, which keeps a paired alpha track\n * level with its neighbour.\n */\n align?: PropertyAlign;\n}\n\nconst DENSITY_CLASS: Record<PropertyDensity, string> = {\n tight: s.densityTight,\n normal: s.densityNormal,\n roomy: s.densityRoomy,\n};\n\nconst ALIGN_CLASS: Record<PropertyAlign, string> = {\n start: s.alignStart,\n center: s.alignCenter,\n end: s.alignEnd,\n baseline: s.alignBaseline,\n};\n\n/** Joins a container's base class with its metric classes and the consumer's.\n * Exported for the family's other files, which share the same two props. */\nexport function propertyMetricClass(\n base: string,\n { density, align }: PropertyMetricProps,\n className?: string,\n): string {\n return [base, density && DENSITY_CLASS[density], align && ALIGN_CLASS[align], className]\n .filter(Boolean)\n .join(' ');\n}\n\n/** Props for `<PropertyPanel>`. */\nexport interface PropertyPanelProps extends PropertyMetricProps, StanceProps {\n title?: ReactNode;\n /** Controls on the trailing edge of the title row — a switch, a clear\n * button. They sit outside the heading, so they neither take its type nor\n * join its accessible name. */\n actions?: ReactNode;\n /**\n * Lets text inside the panel be selected and copied. A panel is chrome by\n * default, so a drag across it moves a slider rather than painting a\n * selection; a `debug` panel defaults to selectable, since what it shows —\n * ids, keys, traces — is there to be copied.\n */\n selectable?: boolean;\n children: ReactNode;\n className?: string;\n}\n\nconst PanelNesting = createContext(false);\n\n/**\n * A titled panel holding property rows — the sidebar container the rest of\n * this module's components fill.\n *\n * `stance` says what kind of content it holds and `tone` which of its peers it\n * is; the theme's `--wzl-panel-*` and `--wzl-stance-*` slots decide how each looks. A stanced\n * panel's title takes the row-label recipe rather than the display title.\n */\nexport function PropertyPanel({\n title,\n actions,\n selectable,\n children,\n className,\n density,\n align,\n stance,\n tone,\n}: PropertyPanelProps) {\n const nested = useContext(PanelNesting);\n const attrs = useStance({ stance, tone });\n const heading = title != null && <h2 className={s.panelTitle}>{title}</h2>;\n return (\n <div\n className={propertyMetricClass(s.panel, { density, align }, className)}\n {...attrs}\n data-nested={nested || undefined}\n data-selectable={(selectable ?? stance === 'debug') || undefined}\n >\n {actions != null ? (\n <div className={s.panelHeader}>\n {heading}\n <div className={s.panelActions}>{actions}</div>\n </div>\n ) : heading}\n <PanelNesting.Provider value>{children}</PanelNesting.Provider>\n </div>\n );\n}\n\n/** How a property list packs its rows into two columns. */\nexport type PropertyListPack = 'auto-color' | 'pairs' | 'one-up';\n\n/** Props for `<PropertyList>`. */\nexport interface PropertyListProps extends PropertyMetricProps {\n children: ReactNode;\n className?: string;\n /**\n * How rows pack into the 2-column grid.\n * - `'auto-color'` (default): only color rows pair side-by-side; everything\n * else spans the full width. Right for sparse top-level panels.\n * - `'pairs'`: every row auto-places into the 2-column grid two-per-row.\n * Headers and subpanels still span the full width; wrap any other\n * full-width child in `<PropertySpan>`. Right for dense effect bodies.\n * - `'one-up'`: every row spans the full width, color rows included. Right\n * for a palette — a column of swatches read as a group.\n */\n pack?: PropertyListPack;\n}\n\n/**\n * Grid container for PropertyRows. Use standalone for chrome-less layouts, or\n * nest inside <PropertyPanel/> for the standard glass card.\n */\nexport const PropertyList = forwardRef(function PropertyList(\n { children, className, pack = 'auto-color', density, align }: PropertyListProps,\n ref: Ref<HTMLDivElement>,\n) {\n const base = `${s.list}${pack === 'pairs' ? ` ${s.listPairs}` : pack === 'one-up' ? ` ${s.listOneUp}` : ''}`;\n return (\n <div ref={ref} className={propertyMetricClass(base, { density, align }, className)}>\n {children}\n </div>\n );\n});\n\n/** Props for `<PropertySpan>`. */\nexport interface PropertySpanProps {\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Wrapper that makes an arbitrary child span both columns of a\n * `<PropertyList pack=\"pairs\">`, a `<PropertyGroup pack=\"pairs\">` body, or a\n * `<Subpanel>`. `<PropertyRow span>` covers the row case; this covers\n * everything else a consumer puts in the grid.\n */\nexport function PropertySpan({ children, className }: PropertySpanProps) {\n return <div className={className ? `${s.span} ${className}` : s.span}>{children}</div>;\n}\n\n/** Props for `<PropertyNote>`. */\nexport interface PropertyNoteProps {\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Muted paragraph that spans both columns of the grid — a group's help text,\n * sitting above the rows it describes rather than beside one of them.\n * `<PropertyRow description>` covers the per-row case.\n */\nexport function PropertyNote({ children, className }: PropertyNoteProps) {\n return <p className={className ? `${s.note} ${className}` : s.note}>{children}</p>;\n}\n\n/** Which control shape a row holds, which decides its intrinsic layout. */\nexport type PropertyRowVariant = 'default' | 'color' | 'checkbox';\n/** Whether a row's label sits above its control or beside it. */\nexport type PropertyRowLayout = 'block' | 'inline';\n\n/** Props for `<PropertyRow>`. */\nexport interface PropertyRowProps extends PropertyMetricProps {\n label: ReactNode;\n /** Right-aligned readout shown next to the label (e.g. current value). */\n readout?: ReactNode;\n /**\n * Help text for the row, shown in a tooltip off an ⓘ affordance beside the\n * label. Empty or absent renders no affordance.\n */\n description?: string;\n variant?: PropertyRowVariant;\n /**\n * Label position relative to the control. Unset takes the variant's own\n * orientation: `block` — label above control — for the default variant, and\n * `inline` for the color and checkbox variants, which read as a row.\n */\n layout?: PropertyRowLayout;\n /**\n * Take the full width of the enclosing grid. Only has an effect inside a\n * `<PropertyList pack=\"pairs\">` or a `<Subpanel>`; elsewhere rows are already\n * full width.\n */\n span?: boolean;\n children: ReactNode;\n htmlFor?: string;\n /** The control is a group of several (a segmented toggle), not one element.\n * The row then renders as a `<div>`: a `<label>` hands a click on its text to\n * its first control, which in a group means selecting the first option. Each\n * member has to carry its own name. */\n group?: boolean;\n className?: string;\n /** The row is auto: its value is not pinned and the owner computes it. The\n * control is hidden — its box kept, so the row does not resize — and the\n * row reads out the word instead. */\n auto?: boolean;\n /** Given, the row's label toggles `auto` when it is clicked. Omitted, the row\n * can show an auto state but not change it.\n *\n * The label then names that toggle, so a control passed as `children` has to\n * carry its own accessible name — every `<PropertyField>` does. */\n onAutoChange?: (next: boolean) => void;\n /**\n * What draws the row's control. `bare` (the default) is a native input the\n * row's stylesheet dresses; `framed` is a kit field bringing its own frame,\n * which the row then leaves alone — see {@link PropertyFieldChrome}.\n */\n chrome?: PropertyFieldChrome;\n}\n\n/** The label-plus-control frame `<PropertyField>` draws its rows in. Use it\n * directly for a control no field kind covers. */\nexport function PropertyRow({\n label,\n readout,\n description,\n variant = 'default',\n layout,\n span,\n children,\n htmlFor,\n group,\n className,\n density,\n align,\n auto,\n onAutoChange,\n chrome,\n}: PropertyRowProps) {\n const variantClass = variant === 'color' ? s.rowColor : variant === 'checkbox' ? s.rowCheckbox : '';\n // Each variant already lays out one way; a class is only needed for the\n // other one. The default variant stacks, so it needs `.rowInline`; color and\n // checkbox read as a row, so they need `.rowBlock`.\n const intrinsic: PropertyRowLayout = variant === 'default' ? 'block' : 'inline';\n const resolved = layout ?? intrinsic;\n const layoutClass =\n resolved === intrinsic ? '' : resolved === 'inline' ? s.rowInline : s.rowBlock;\n const cls = propertyMetricClass(\n [s.row, variantClass, layoutClass, span && s.span, auto && s.rowAuto, chrome === 'framed' && s.rowFramed]\n .filter(Boolean)\n .join(' '),\n { density, align },\n className,\n );\n // A stacked row reads label, readout, control down the column, so its readout\n // belongs on the label line. An inline row would put a value of changing width\n // in front of the control, which then moves under the pointer as it changes.\n const trailing = resolved === 'inline' && readout != null;\n const head = (\n <span className={s.rowLabel}>\n {onAutoChange ? (\n <AutoToggle auto={auto ?? false} label={label} onChange={onAutoChange} />\n ) : (\n label\n )}\n {description ? <PropertyRowHelp label={label} description={description} /> : null}\n {readout != null && !trailing && <em className={s.readout}>{readout}</em>}\n </span>\n );\n const tail = trailing ? <em className={`${s.readout} ${s.readoutAfter}`}>{readout}</em> : null;\n return group ? (\n <div className={cls}>\n {head}\n {children}\n {tail}\n </div>\n ) : (\n <label className={cls} htmlFor={htmlFor}>\n {head}\n {children}\n {tail}\n </label>\n );\n}\n\n/**\n * A row's label, doubling as the control for whether the row is auto: clicking\n * it hands the value back to whoever computes it, or takes it back.\n *\n * Pressed means pinned, to match the name — an auto row is the unpressed one.\n */\nfunction AutoToggle({\n auto,\n label,\n onChange,\n}: {\n auto: boolean;\n label: ReactNode;\n onChange: (next: boolean) => void;\n}) {\n const name = typeof label === 'string' ? label : 'this setting';\n const toggle = (e: { preventDefault: () => void; stopPropagation: () => void }) => {\n // The wrapping <label> would otherwise actuate the row's control.\n e.preventDefault();\n e.stopPropagation();\n onChange(!auto);\n };\n return (\n // A span, not a button: a <button> is a labelable element, so inside the\n // row's <label> it would take the row's name off the actual control.\n <span\n role=\"button\"\n tabIndex={0}\n className={s.autoToggle}\n aria-pressed={!auto}\n aria-label={`Pin ${name}`}\n onClick={toggle}\n onKeyDown={(e) => {\n // A native button gives Enter and Space for free; a span gives neither,\n // and Space would scroll the panel.\n if (e.key === 'Enter' || e.key === ' ') toggle(e);\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n {label}\n </span>\n );\n}\n\n/** Tooltip trigger for a row's `description`. A tooltip trigger has to be\n * interactive to be keyboard-reachable, so this is a real button. */\nfunction PropertyRowHelp({ label, description }: { label: ReactNode; description: string }) {\n const name = typeof label === 'string' ? label : 'this setting';\n return (\n <TooltipTrigger>\n <Focusable>\n <button\n type=\"button\"\n className={s.help}\n aria-label={`About ${name}`}\n onClick={(e) => {\n // The wrapping <label> would otherwise actuate the row's control.\n e.preventDefault();\n e.stopPropagation();\n }}\n onMouseDown={(e) => e.stopPropagation()}\n >\n ⓘ\n </button>\n </Focusable>\n <Tooltip>{description}</Tooltip>\n </TooltipTrigger>\n );\n}\n","import {\n type CSSProperties,\n type ReactNode,\n type RefObject,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport { getAlpha01, toHex8, withAlpha01, type FillStyle, type PaintKind } from '@weasel-js/core';\nimport { dlog } from '../../dlog';\nimport { formatCompact, formatNumber, parseNumber, type UnitTable } from '../../format/number';\nimport { Checkbox } from '../Checkbox';\nimport { ColorField } from '../ColorField';\nimport { FontFamilySelect } from '../FontFamilySelect';\nimport { InlineRange } from '../InlineRange';\nimport { Input } from '../Input';\nimport { NumberField, UnitField } from '../NumberField';\nimport { PaintField } from '../PaintField';\nimport { PaintInput } from '../PaintInput';\nimport type { PrefNumberFormat } from '../Prefs/schema';\nimport { Radio, RadioGroup } from '../RadioGroup';\nimport { Select } from '../Select';\nimport { Switch } from '../Switch';\nimport { ToggleBar } from '../ToggleBar';\nimport shared from '../range.module.css';\nimport {\n type PropertyMetricProps,\n PropertyRow,\n type PropertyRowLayout,\n type PropertyRowVariant,\n} from './PropertyPanel';\nimport s from './Properties.module.css';\n\n/**\n * Which controls a field is drawn with.\n *\n * - `'bare'` (the default): native inputs the property row's own stylesheet\n * draws — the compact controls of an inspector sidebar or a lab panel.\n * - `'framed'`: the kit's field components, each bringing its own frame —\n * for a surface whose row does not style its controls (`SelectionPanel`,\n * `ToolOptionsBar`), or that needs what only they do, such as reading a\n * unit typed into a number (`accepts`).\n *\n * The two differ only where the kit still has two widgets for one job; a\n * slider, a switch, a font picker and a paint are the same in both.\n */\nexport type PropertyFieldChrome = 'bare' | 'framed';\n\n/** One choice of an enum field. */\nexport interface PropertyOption<T extends string> {\n value: T;\n /** The option's name. A string also names its segment for a screen reader. */\n label: ReactNode;\n /** What a segment shows in place of `label` when the full one would not fit\n * — a glyph or a letter. `label` stays the accessible name. */\n glyph?: ReactNode;\n /** Shown but not choosable: a value the control reports and cannot author. */\n disabled?: boolean;\n}\n\n/** Props every kind of field shares. */\ninterface FieldBase {\n /** The control's accessible name. A `<PropertyField>` takes it from a string\n * `label` when this is omitted. */\n name?: string;\n /** The sources the field reads disagree — a multi-selection whose nodes\n * differ. The control shows no value, in whatever form it has for that. */\n mixed?: boolean;\n /**\n * The sources agree on holding nothing: whatever is in effect comes from a\n * fallback further down. The control shows no chosen value rather than\n * inventing one, since the next edit would write the invention back.\n */\n unset?: boolean;\n chrome?: PropertyFieldChrome;\n /** Class on the control element itself. */\n className?: string;\n /** Id for the control element, for a `<label htmlFor>` outside it. */\n id?: string;\n}\n\n/** A boolean field. */\nexport interface PropertyBooleanFieldProps extends FieldBase {\n kind: 'boolean';\n /** `checkbox` (default), `switch`, or `toggle` — a one-segment pressable bar. */\n control?: 'checkbox' | 'switch' | 'toggle';\n /** Absent reads as off. */\n value: boolean | undefined;\n onChange: (next: boolean) => void;\n /** A `toggle`'s segment content. Defaults to the first letter of `name`. */\n glyph?: ReactNode;\n}\n\n/** A number field. */\nexport interface PropertyNumberFieldProps extends FieldBase {\n kind: 'number';\n /** `input` (default) for a typed number; `slider` for a track with an\n * editable readout, where the range matters more than the exact value. */\n control?: 'input' | 'slider';\n /** Absent reads as an empty field. */\n value: number | null | undefined;\n /**\n * The committed value. Given `onInput` as well, it fires once a drag ends,\n * or on blur or Enter in a typed field; on its own it fires on every move\n * and keystroke. A `framed` typed field commits only on blur or Enter,\n * whichever callbacks it has.\n */\n onChange: (next: number) => void;\n /** The live value, fired continuously. Pass it alongside `onChange` when the\n * write is expensive — cheap state here, the costly work there. */\n onInput?: (next: number) => void;\n /** A slider's track runs 0..100 where these are omitted. */\n min?: number;\n max?: number;\n step?: number;\n /**\n * Suffix after the value. A string becomes a dim word unit (`px`); pass JSX\n * like `<sup>°</sup>` for a symbol. Display only — the value stays a number.\n */\n unit?: ReactNode;\n /** Units a person may type into a `framed` field, each mapped to the factor\n * that turns it into the unit shown: `{ mm: 0.1, cm: 1 }`. */\n accepts?: Readonly<UnitTable>;\n /** A slider readout's display. Defaults to the value at `step`'s precision. */\n format?: (value: number) => ReactNode;\n /** A named display for the value: `compact` reads `2.00M`. `format` wins. */\n notation?: PrefNumberFormat;\n placeholder?: string;\n /** A `framed` unitless field's stepper buttons. Default `true`. */\n steppers?: boolean;\n}\n\n/** A text field. */\nexport interface PropertyStringFieldProps extends FieldBase {\n kind: 'string';\n control?: 'input' | 'textarea';\n /** Absent reads as an empty field. */\n value: string | null | undefined;\n /**\n * The committed text. On its own it fires on every keystroke. Given\n * `onInput` as well, the field drafts: `onInput` gets each keystroke and\n * this fires once, on blur or Enter, and only if the text changed.\n */\n onChange: (next: string) => void;\n onInput?: (next: string) => void;\n placeholder?: string;\n maxLength?: number;\n}\n\n/** A choice among fixed options. */\nexport interface PropertyEnumFieldProps<T extends string = string> extends FieldBase {\n kind: 'enum';\n /**\n * `select` (default) is a dropdown. `radio` and `toggle` show every option\n * at once — a radio group chooses, and a toggle is a row of pressable\n * segments. Drawn `bare`, both are segments.\n */\n control?: 'select' | 'radio' | 'toggle';\n /** Absent, or not one of `options`, chooses nothing. */\n value: T | undefined;\n options: ReadonlyArray<PropertyOption<T>>;\n onChange: (next: T) => void;\n /** Shown while no option is chosen. Defaults to \"Choose option…\". */\n placeholder?: string;\n}\n\n/** A single color. */\nexport interface PropertyColorFieldProps extends FieldBase {\n kind: 'color';\n /** `#rrggbb`, or `#rrggbbaa` when `alpha` is `true`. */\n value: string | undefined;\n /**\n * The committed color. `bare`: given `onInput` as well, it fires once the\n * picker closes; on its own it fires on every move. `framed`: it fires once\n * per gesture, whichever callbacks it has.\n */\n onChange: (next: string) => void;\n onInput?: (next: string) => void;\n /**\n * Offer an opacity track. `true` keeps the alpha in `value` as `#rrggbbaa`;\n * a number is the 0..1 alpha held apart from it, reported through\n * `onAlphaChange` / `onAlphaInput`.\n */\n alpha?: boolean | number;\n onAlphaChange?: (next: number) => void;\n onAlphaInput?: (next: number) => void;\n /** Draw the opacity track inert, for a consumer that drops alpha. */\n alphaDisabled?: boolean;\n}\n\n/** A whole paint: a solid, a gradient, a pattern, or none. */\nexport interface PropertyPaintFieldProps extends FieldBase {\n kind: 'paint';\n /** `swatch` (default) opens the editor in a popover, for a narrow slot;\n * `inline` draws the kind bar and its editor in place. */\n control?: 'swatch' | 'inline';\n /** `null` is an explicit \"no paint\"; `undefined` is nothing to show. */\n value: FillStyle | null | undefined;\n onChange: (next: FillStyle | null) => void;\n onInput?: (next: FillStyle | null) => void;\n /** Offer \"None\". Default `true`. */\n allowNone?: boolean;\n /** Restrict the kinds offered. Default: every registered kind. */\n kinds?: readonly PaintKind[];\n}\n\n/** A font family, picked from the live font registry. */\nexport interface PropertyFontFamilyFieldProps extends FieldBase {\n kind: 'font-family';\n value: string | undefined;\n onChange: (next: string) => void;\n /** The weight and slant the family is drawn at, so the picker names the\n * variant that will actually paint. */\n weight?: number;\n fontStyle?: 'normal' | 'italic';\n}\n\n/**\n * One field for {@link PropertyControl} and {@link PropertyField}, keyed by\n * `kind`.\n */\nexport type PropertyControlProps<T extends string = string> =\n | PropertyBooleanFieldProps\n | PropertyNumberFieldProps\n | PropertyStringFieldProps\n | PropertyEnumFieldProps<T>\n | PropertyColorFieldProps\n | PropertyPaintFieldProps\n | PropertyFontFamilyFieldProps;\n\n/** The kinds a {@link PropertyControl} draws. */\nexport type PropertyFieldKind = PropertyControlProps['kind'];\n\n/** Row props {@link PropertyField} adds to the field it draws. */\nexport interface PropertyFieldRowProps extends PropertyMetricProps {\n label: ReactNode;\n /**\n * Text beside the label. On a slider it replaces the editable readout —\n * use it when the row is not showing a number a caller could type back,\n * such as an auto row's `auto`.\n */\n readout?: ReactNode;\n description?: string;\n layout?: PropertyRowLayout;\n /** Take the full width of the enclosing grid — see `<PropertyRow span>`. */\n span?: boolean;\n /** The row is auto — see `<PropertyRow auto>`. */\n auto?: boolean;\n /** Toggles `auto` from the row's label — see `<PropertyRow onAutoChange>`. */\n onAutoChange?: (next: boolean) => void;\n /** Class on the row. `controlClassName` reaches the control. */\n rowClassName?: string;\n controlClassName?: string;\n}\n\n/** Props for {@link PropertyField}: one field, and the row around it. */\nexport type PropertyFieldProps<T extends string = string> = PropertyFieldRowProps &\n DistributiveOmit<PropertyControlProps<T>, 'className' | 'id'>;\n\ntype DistributiveOmit<U, K extends PropertyKey> = U extends unknown ? Omit<U, K> : never;\n\n/**\n * A labeled settings row for one field, its control chosen by `kind` (and\n * `control`): `<PropertyField kind=\"number\" control=\"slider\" label=\"Blur\" …>`.\n *\n * The row is a {@link PropertyRow}; the control is the one\n * {@link PropertyControl} draws for the same props. Every schema-driven\n * settings surface in the kit — `ControlPanel`, `PrefsForm`, `SelectionPanel`\n * — draws its built-in kinds through that one mapping, so a kind's control\n * is decided once.\n *\n * Callbacks follow the field's shape: a discrete control (a box, a choice)\n * reports each pick; a continuous or typed one reports every change through\n * `onChange` alone, or splits them into live `onInput` and settled\n * `onChange` when given both. `mixed` and `unset` show a field whose sources\n * disagree, or agree on holding nothing.\n */\nexport function PropertyField<T extends string = string>(props: PropertyFieldProps<T>) {\n const {\n label,\n readout,\n description,\n layout,\n span,\n density,\n align,\n auto,\n onAutoChange,\n rowClassName,\n controlClassName,\n ...field\n } = props;\n const id = useId();\n // Internally a field's option type is erased to `string`: nothing below\n // reads it, and the caller's `onChange` still receives its own `T`.\n const control = {\n ...field,\n name: field.name ?? nameOf(label),\n className: controlClassName,\n id,\n } as unknown as PropertyControlProps;\n const framed = control.chrome === 'framed';\n const shape = rowShape(control);\n\n const row = {\n label,\n description,\n layout,\n span,\n density,\n align,\n auto,\n onAutoChange,\n className: rowClassName,\n chrome: control.chrome,\n variant: shape.variant,\n group: shape.group,\n // A framed field brings its own label wiring, and the font picker takes no\n // id; any other bare one is named by the row's `<label>` through this one.\n htmlFor: shape.group || framed || control.kind === 'font-family' ? undefined : id,\n };\n\n if (control.kind === 'number' && control.control === 'slider') {\n return (\n <PropertyRow {...row} readout={boxedReadout(readout) ?? <SliderReadout {...control} />}>\n <SliderTrack {...control} />\n </PropertyRow>\n );\n }\n return (\n <PropertyRow {...row} readout={readout}>\n <ControlBody {...control} />\n </PropertyRow>\n );\n}\n\n/**\n * The control for one field, with no row around it — for a cell that shares\n * a row with others, or a surface that draws its own row. Keyed by `kind`\n * (and `control`), the same mapping {@link PropertyField} draws.\n *\n * A slider brings its readout beside the track. Several elements come back\n * as siblings rather than wrapped, so the surrounding row lays them out.\n */\nexport function PropertyControl<T extends string = string>(typed: PropertyControlProps<T>) {\n const props = typed as unknown as PropertyControlProps;\n if (props.kind === 'number' && props.control === 'slider') {\n return (\n <>\n <SliderTrack {...props} />\n <span className={s.cellReadout}>\n <SliderReadout {...props} />\n </span>\n </>\n );\n }\n return <ControlBody {...props} />;\n}\n\n/** How a row holds a field's control. */\nfunction rowShape(p: PropertyControlProps<string>): { variant: PropertyRowVariant; group: boolean } {\n switch (p.kind) {\n case 'boolean':\n // A switch renders its own <label>, and a segment is a button: neither\n // may sit inside the row's.\n return { variant: 'checkbox', group: p.control === 'switch' || p.control === 'toggle' };\n case 'enum':\n // A <label> hands a click on its text to its first control, which in a\n // group of options means choosing the first one.\n return { variant: 'default', group: p.control === 'radio' || p.control === 'toggle' };\n case 'color':\n return { variant: 'color', group: false };\n case 'paint':\n return { variant: 'default', group: true };\n default:\n return { variant: 'default', group: false };\n }\n}\n\nfunction ControlBody(props: PropertyControlProps) {\n switch (props.kind) {\n case 'boolean':\n return <BooleanControl {...props} />;\n case 'number':\n return <NumberInput {...props} />;\n case 'string':\n return <StringControl {...props} />;\n case 'enum':\n return <EnumControl {...props} />;\n case 'color':\n return <ColorControl {...props} />;\n case 'paint':\n return <PaintControl {...props} />;\n case 'font-family':\n return (\n <FontFamilySelect\n className={props.className}\n value={props.mixed ? undefined : props.value}\n mixed={props.mixed}\n onChange={props.onChange}\n weight={props.weight}\n fontStyle={props.fontStyle}\n aria-label={props.name}\n />\n );\n default: {\n // Unreachable while every kind has an arm; a new kind without one is a\n // compile error here rather than an empty cell.\n const _exhaustive: never = props;\n throw new Error(`PropertyControl: no control for kind \"${(_exhaustive as { kind: string }).kind}\"`);\n }\n }\n}\n\n// ── Kinds ────────────────────────────────────────────────────────────────\n\n/** A cue for a state the control itself cannot draw: a switch has no\n * indeterminate form, and nothing has an \"unset\" one. */\nfunction Dimmed({ mixed, unset, children }: { mixed?: boolean; unset?: boolean; children: ReactNode }) {\n if (!mixed && !unset) return <>{children}</>;\n return (\n <span className={s.dimmed} title={mixed ? 'Mixed' : 'Not set'}>\n {children}\n </span>\n );\n}\n\nfunction BooleanControl(p: PropertyBooleanFieldProps) {\n const on = !p.mixed && p.value === true;\n const box = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (box.current) box.current.indeterminate = p.mixed === true;\n });\n if (p.control === 'toggle') {\n // Unselected already is how a toggle button says \"not set\", and dimming it\n // would read as disabled; mixed has a real ARIA form on one.\n const key = 'on';\n return (\n <ToggleBar<string>\n mode=\"multiple\"\n size=\"sm\"\n variant=\"flat\"\n className={p.className}\n ariaLabel={p.name}\n items={[{ value: key, label: p.glyph ?? p.name?.slice(0, 1), ariaLabel: p.name }]}\n value={on ? [key] : []}\n mixedValues={p.mixed ? [key] : []}\n onChange={(next) => p.onChange(next.includes(key))}\n />\n );\n }\n if (p.control === 'switch') {\n return (\n <Dimmed mixed={p.mixed} unset={p.unset}>\n <Switch className={p.className} isSelected={on} onChange={p.onChange} aria-label={p.name} />\n </Dimmed>\n );\n }\n const control =\n p.chrome === 'framed' ? (\n <Checkbox\n className={p.className}\n isSelected={on}\n isIndeterminate={p.mixed}\n onChange={p.onChange}\n aria-label={p.name}\n />\n ) : (\n <input\n ref={box}\n id={p.id}\n type=\"checkbox\"\n className={p.className}\n aria-label={p.name}\n checked={on}\n onChange={(e) => p.onChange(e.target.checked)}\n />\n );\n return <Dimmed unset={p.unset}>{control}</Dimmed>;\n}\n\n/**\n * A ref for an input whose commit half has to come off a real listener.\n *\n * A native `range`, `color` or `number` input fires `input` through the\n * interaction and `change` once at the end, but React's synthetic `onChange`\n * sees only the first: its value tracker drops the unchanged second. So a\n * control offering the live/committed split reads the live half from React\n * and the committed half from here. `commit` is `undefined` when a control has\n * one callback, which then fires continuously.\n */\nfunction useCommitListener(\n commit: ((raw: string) => void) | undefined,\n): RefObject<HTMLInputElement | null> {\n const ref = useRef<HTMLInputElement>(null);\n const latest = useRef(commit);\n useEffect(() => {\n latest.current = commit;\n });\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const onCommit = () => latest.current?.(el.value);\n el.addEventListener('change', onCommit);\n return () => el.removeEventListener('change', onCommit);\n }, []);\n return ref;\n}\n\nfunction unitSuffix(unit: ReactNode, className: string): ReactNode {\n if (unit == null) return null;\n return typeof unit === 'string' ? <span className={className}>{unit}</span> : unit;\n}\n\nfunction NumberInput(p: PropertyNumberFieldProps) {\n const live = p.onInput ?? p.onChange;\n const field = useCommitListener(\n p.onInput &&\n ((raw) => {\n if (raw === '') return;\n const n = Number(raw);\n if (Number.isFinite(n)) p.onChange(n);\n }),\n );\n const known = !p.mixed && typeof p.value === 'number' && Number.isFinite(p.value);\n const placeholder = p.mixed ? 'Mixed' : p.placeholder;\n\n if (p.chrome === 'framed') {\n const commit = (n: number) => {\n // A cleared field reads as NaN, which is no value to write.\n if (!Number.isNaN(n)) p.onChange(n);\n };\n const value = known ? (p.value as number) : NaN;\n const input = p.accepts ? (\n <UnitField\n className={p.className}\n value={value}\n placeholder={placeholder}\n minValue={p.min}\n maxValue={p.max}\n step={p.step}\n accepts={p.accepts}\n aria-label={p.name}\n onChange={commit}\n />\n ) : (\n <NumberField\n className={p.className}\n value={value}\n placeholder={placeholder}\n minValue={p.min}\n maxValue={p.max}\n step={p.step}\n hideSteppers={p.steppers === false}\n aria-label={p.name}\n onChange={commit}\n />\n );\n if (p.unit == null) return input;\n return (\n <>\n {input}\n <span className={s.unitSuffix} aria-hidden=\"true\">\n {p.unit}\n </span>\n </>\n );\n }\n\n const input = (\n <input\n ref={field}\n id={p.id}\n type=\"number\"\n className={p.className}\n aria-label={p.name}\n value={known ? (p.value as number) : ''}\n min={p.min}\n max={p.max}\n step={p.step}\n placeholder={placeholder}\n onChange={(e) => {\n const raw = e.target.value;\n if (raw === '') return;\n const n = Number(raw);\n if (Number.isFinite(n)) live(n);\n }}\n />\n );\n if (p.unit == null) return input;\n return (\n <span className={s.fieldUnitGroup}>\n {input}\n {unitSuffix(p.unit, s.readoutUnit)}\n </span>\n );\n}\n\n/** A slider's bounds, with the 0..100 fallback for an unbounded track. */\nfunction sliderBounds(p: PropertyNumberFieldProps): { min: number; max: number; step: number } {\n return { min: p.min ?? 0, max: p.max ?? 100, step: p.step ?? 1 };\n}\n\nfunction SliderTrack(p: PropertyNumberFieldProps) {\n const { min, max, step } = sliderBounds(p);\n const live = p.onInput ?? p.onChange;\n const commit = p.onInput ? p.onChange : undefined;\n const range = useCommitListener(commit && ((raw) => commit(Number(raw))));\n const known = !p.mixed && typeof p.value === 'number' && Number.isFinite(p.value);\n // The thumb clamps to the track; the readout beside it does not, so a value\n // past `max` is still reported as what it is.\n const value = known ? Math.min(Math.max(p.value as number, min), max) : min;\n const onChange = (raw: string) => {\n const v = Number(raw);\n dlog('property-panel', 'slider', { name: p.name, value: v });\n live(v);\n };\n if (p.chrome === 'framed') {\n return (\n <InlineRange\n ref={range}\n className={p.className}\n aria-label={p.name}\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={p.mixed}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n return (\n <input\n ref={range}\n id={p.id}\n type=\"range\"\n aria-label={p.name}\n className={p.className ? `${shared.range} ${p.className}` : shared.range}\n // The readout is the keyboard's way in; a tab stop on the track too\n // would be two stops for one value.\n tabIndex={-1}\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={p.mixed}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n}\n\nfunction SliderReadout(p: PropertyNumberFieldProps) {\n const { min, max, step } = sliderBounds(p);\n const known = !p.mixed && typeof p.value === 'number' && Number.isFinite(p.value);\n if (!known) return <>{boxedReadout('—')}</>;\n // Precision tracks `step`: integer steps show none, 0.1 one, 0.05 two.\n const decimals = step >= 1 ? 0 : Math.min(6, Math.max(0, Math.ceil(-Math.log10(step))));\n const format =\n p.format ??\n (p.notation === 'compact'\n ? (n: number) => formatCompact(n, decimals)\n : (n: number) =>\n formatNumber(n, {\n useGrouping: false,\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }));\n return (\n <EditableReadout\n name={p.name}\n value={p.value as number}\n min={min}\n max={max}\n format={format}\n unit={p.unit}\n onCommit={(next) => {\n p.onInput?.(next);\n p.onChange(next);\n }}\n />\n );\n}\n\n/**\n * A replacement readout in the box `EditableReadout` would have occupied.\n *\n * A row that can go auto swaps its editable readout for a word, and the label\n * is a flex line: an input is taller than bare text — a text input's inner\n * editor will not shrink to a line-height below the font's own content area —\n * so the swap moved the label's baseline, and the whole row with it. Only the\n * slider owns an `EditableReadout`, so only it needs this; giving every text\n * readout the box moves the rows that never had an input.\n */\nfunction boxedReadout(readout: ReactNode): ReactNode {\n if (typeof readout !== 'string' && typeof readout !== 'number') return readout;\n return (\n <span className={s.readoutGroup}>\n <span className={s.readoutText}>{readout}</span>\n </span>\n );\n}\n\ninterface EditableReadoutProps {\n name: string | undefined;\n value: number;\n min: number;\n max: number;\n format: (value: number) => ReactNode;\n unit?: ReactNode;\n onCommit: (next: number) => void;\n}\n\n/**\n * Readout that swaps to a number input on click, commits on Enter/blur,\n * cancels on Escape. Clicks are stopped so a wrapping <label> doesn't forward\n * focus to the slider thumb.\n */\nfunction EditableReadout({ name, value, min, max, format, unit, onCommit }: EditableReadoutProps) {\n // Draft is non-null only while the input is focused; the live value mirrors\n // into the input otherwise.\n const [draft, setDraft] = useState<string | null>(null);\n const text = (n: number) => {\n const formatted = format(n);\n return typeof formatted === 'string' ? formatted : String(formatted);\n };\n const displayValue = draft !== null ? draft : text(value);\n // The widest value the range can show, which the stylesheet widens the box to fit.\n const fit = { '--wzl-property-readout-fit': `${Math.max(text(min).length, text(max).length)}ch` };\n\n const commit = () => {\n if (draft !== null) {\n const n = parseNumber(draft);\n if (Number.isFinite(n)) onCommit(Math.min(max, Math.max(min, n)));\n }\n setDraft(null);\n };\n\n return (\n <span className={s.readoutGroup}>\n <input\n type=\"text\"\n aria-label={name}\n inputMode=\"decimal\"\n className={s.readoutInput}\n style={fit as CSSProperties}\n value={displayValue}\n onFocus={(e) => {\n setDraft(text(value));\n e.currentTarget.select();\n }}\n onChange={(e) => setDraft(e.target.value.replace(/-/g, '−'))}\n onBlur={commit}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n e.currentTarget.focus();\n }}\n onMouseDown={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n commit();\n e.currentTarget.blur();\n } else if (e.key === 'Escape') {\n setDraft(null);\n e.currentTarget.blur();\n }\n }}\n />\n {unitSuffix(unit, s.readoutUnit)}\n </span>\n );\n}\n\n/**\n * The text a field shows and how an edit to it lands. With `onInput` the\n * field drafts: the draft shows while it differs from `value`, and settles\n * through `onChange` on blur or Enter. Without it, every keystroke is the\n * value.\n */\nfunction useTextEdit(p: PropertyStringFieldProps) {\n const [draft, setDraft] = useState<string | null>(null);\n const value = p.mixed ? '' : (p.value ?? '');\n const drafting = p.onInput !== undefined;\n return {\n shown: draft ?? value,\n type: (next: string) => {\n if (!drafting) {\n p.onChange(next);\n return;\n }\n setDraft(next);\n p.onInput?.(next);\n },\n settle: () => {\n if (draft !== null && draft !== value) p.onChange(draft);\n setDraft(null);\n },\n };\n}\n\nfunction StringControl(p: PropertyStringFieldProps) {\n const edit = useTextEdit(p);\n const placeholder = p.mixed ? 'Mixed' : p.placeholder;\n const onKeyDown = (e: { key: string; currentTarget: HTMLElement }) => {\n if (e.key === 'Enter' && p.control !== 'textarea') e.currentTarget.blur();\n };\n if (p.control === 'textarea') {\n return (\n <textarea\n id={p.id}\n className={[p.chrome === 'framed' && s.textarea, p.className].filter(Boolean).join(' ') || undefined}\n aria-label={p.name}\n value={edit.shown}\n placeholder={placeholder}\n maxLength={p.maxLength}\n rows={3}\n onChange={(e) => edit.type(e.target.value)}\n onBlur={edit.settle}\n />\n );\n }\n if (p.chrome === 'framed') {\n return (\n <Input\n className={p.className}\n value={edit.shown}\n placeholder={placeholder}\n maxLength={p.maxLength}\n aria-label={p.name}\n onChange={edit.type}\n onBlur={edit.settle}\n onKeyDown={onKeyDown}\n />\n );\n }\n return (\n <input\n id={p.id}\n type=\"text\"\n className={p.className}\n aria-label={p.name}\n value={edit.shown}\n placeholder={placeholder}\n maxLength={p.maxLength}\n onChange={(e) => edit.type(e.target.value)}\n onBlur={edit.settle}\n onKeyDown={onKeyDown}\n />\n );\n}\n\n// A row's <label> text also holds the help button's ⓘ and any readout, so a\n// control takes its name from the string label, not from the <label> that\n// `for` points at it.\nfunction nameOf(label: ReactNode): string | undefined {\n return typeof label === 'string' ? label : undefined;\n}\n\nfunction EnumControl(p: PropertyEnumFieldProps) {\n const chosen = !p.mixed && p.options.some((opt) => opt.value === p.value);\n const current = chosen ? (p.value as string) : null;\n\n if (p.control === 'radio' || p.control === 'toggle') {\n if (p.chrome === 'framed') {\n if (p.control === 'radio') {\n return (\n <RadioGroup\n className={p.className}\n value={current}\n onChange={p.onChange}\n aria-label={p.name}\n >\n {p.options.map((o) => (\n <Radio key={o.value} value={o.value} isDisabled={o.disabled}>\n {o.label}\n </Radio>\n ))}\n </RadioGroup>\n );\n }\n return (\n <ToggleBar<string>\n size=\"sm\"\n variant=\"flat\"\n className={p.className}\n ariaLabel={p.name}\n items={p.options.map((o) => ({\n value: o.value,\n label: o.glyph ?? o.label,\n ariaLabel: nameOf(o.label),\n disabled: o.disabled,\n }))}\n value={current}\n onChange={(next) => {\n if (next !== null) p.onChange(next);\n }}\n />\n );\n }\n // Bare, both are segments; a radio's say which one is chosen, a toggle's\n // which are pressed.\n const radio = p.control === 'radio';\n return (\n <div\n className={p.className ? `${s.toggle} ${p.className}` : s.toggle}\n role={radio ? 'radiogroup' : 'group'}\n aria-label={p.name}\n >\n {p.options.map((opt) => {\n const selected = opt.value === current;\n return (\n <button\n key={opt.value}\n type=\"button\"\n role={radio ? 'radio' : undefined}\n aria-checked={radio ? selected : undefined}\n aria-pressed={radio ? undefined : selected}\n aria-label={nameOf(opt.label)}\n disabled={opt.disabled}\n className={selected ? `${s.toggleButton} ${s.toggleButtonSelected}` : s.toggleButton}\n onClick={() => p.onChange(opt.value)}\n >\n {opt.glyph ?? opt.label}\n </button>\n );\n })}\n </div>\n );\n }\n\n const bare = p.chrome !== 'framed';\n return (\n <Select<string>\n className={bare ? (p.className ? `${s.select} ${p.className}` : s.select) : p.className}\n variant={bare ? 'bare' : undefined}\n triggerId={bare ? p.id : undefined}\n aria-label={p.name}\n placeholder={p.mixed ? 'Mixed' : (p.placeholder ?? (p.unset ? '—' : 'Choose option…'))}\n selectedKey={current}\n options={p.options.map((o) => ({ value: o.value, label: o.label, isDisabled: o.disabled }))}\n onSelectionChange={(v) => {\n dlog('property-panel', 'select', { name: p.name, value: v });\n p.onChange(v);\n }}\n />\n );\n}\n\n/** A hex color as the `#rrggbb` a color input can hold and the 0..1 alpha\n * beside it. Anything unreadable is opaque black, which is what the input\n * would show for it anyway. */\nfunction splitAlpha(value: string | undefined): { rgb: string; alpha: number } {\n const eight = toHex8(value?.trim() ?? '');\n if (!/^#[0-9a-f]{8}$/i.test(eight)) return { rgb: '#000000', alpha: 1 };\n return { rgb: eight.slice(0, 7).toLowerCase(), alpha: getAlpha01(eight) };\n}\n\nfunction ColorControl(p: PropertyColorFieldProps) {\n const inValue = p.alpha === true;\n const split = splitAlpha(p.value);\n const alpha = typeof p.alpha === 'number' ? p.alpha : split.alpha;\n\n // Where the alpha lives: in the color's own hex, or in a channel of its own.\n const color = (rgb: string, a: number) => (inValue ? withAlpha01(rgb, a) : rgb);\n const colorOut = (write: (hex: string) => void) => (rgb: string) => write(color(rgb, alpha));\n const alphaOut = (write: ((hex: string) => void) | undefined, own: ((a: number) => void) | undefined) =>\n inValue ? write && ((a: number) => write(withAlpha01(split.rgb, a))) : own;\n const alphaChange = alphaOut(p.onChange, p.onAlphaChange);\n const alphaInput = alphaOut(p.onInput, p.onAlphaInput);\n\n if (p.chrome === 'framed') {\n const withAlpha = p.alpha !== undefined && p.alpha !== false;\n // ColorField holds alpha in the hex; a separate channel goes in and comes\n // back out of it.\n const out = (write: ((hex: string) => void) | undefined, own: ((a: number) => void) | undefined) =>\n write &&\n ((hex: string) => {\n if (typeof p.alpha !== 'number') {\n write(hex);\n return;\n }\n const next = splitAlpha(hex);\n if (next.rgb !== split.rgb || !own) write(next.rgb);\n if (next.alpha !== alpha) own?.(next.alpha);\n });\n return (\n <ColorField\n className={p.className}\n value={p.mixed ? undefined : withAlpha ? withAlpha01(split.rgb, alpha) : (p.value ?? '#000000')}\n mixed={p.mixed}\n alpha={withAlpha}\n onChange={out(p.onChange, p.onAlphaChange) ?? p.onChange}\n onInput={out(p.onInput, p.onAlphaInput)}\n aria-label={p.name}\n />\n );\n }\n\n return (\n <BareColor\n p={p}\n rgb={split.rgb}\n alpha={p.alpha === undefined || p.alpha === false ? undefined : alpha}\n onColorChange={colorOut(p.onChange)}\n onColorInput={p.onInput && colorOut(p.onInput)}\n onAlphaChange={alphaChange}\n onAlphaInput={alphaInput}\n />\n );\n}\n\nfunction BareColor({\n p,\n rgb,\n alpha,\n onColorChange,\n onColorInput,\n onAlphaChange,\n onAlphaInput,\n}: {\n p: PropertyColorFieldProps;\n rgb: string;\n alpha: number | undefined;\n onColorChange: (rgb: string) => void;\n onColorInput?: (rgb: string) => void;\n onAlphaChange?: (a: number) => void;\n onAlphaInput?: (a: number) => void;\n}) {\n const liveColor = onColorInput ?? onColorChange;\n const color = useCommitListener(onColorInput && ((raw) => onColorChange(raw)));\n const liveAlpha = onAlphaInput ?? onAlphaChange;\n const alphaRange = useCommitListener(\n onAlphaInput && onAlphaChange && ((raw) => onAlphaChange(Number(raw))),\n );\n return (\n <>\n <input\n ref={color}\n id={p.id}\n type=\"color\"\n className={p.className}\n aria-label={p.name}\n value={rgb}\n data-mixed={p.mixed || undefined}\n onChange={(e) => liveColor(e.target.value)}\n />\n {alpha !== undefined && (\n <input\n ref={alphaRange}\n type=\"range\"\n aria-label={p.name ? `${p.name} opacity` : undefined}\n className={`${shared.range} ${shared.alpha} ${s.alpha}`}\n min={0}\n max={1}\n step={0.01}\n value={alpha}\n disabled={p.alphaDisabled}\n onChange={(e) => liveAlpha?.(Number(e.target.value))}\n />\n )}\n </>\n );\n}\n\nfunction PaintControl(p: PropertyPaintFieldProps) {\n const Editor = p.control === 'inline' ? PaintInput : PaintField;\n return (\n <Editor\n className={p.className}\n value={p.value}\n mixed={p.mixed}\n unset={p.unset}\n kinds={p.kinds}\n allowNone={p.allowNone}\n onChange={p.onChange}\n onInput={p.onInput}\n aria-label={p.name}\n />\n );\n}\n","import { useCallback, useMemo } from 'react';\nimport { dlog } from '../../dlog';\nimport { type ControlPoint, CurveEditor } from '../CurveEditor';\nimport s from './CurveField.module.css';\n\n/** An annotation drawn over a curve plot: a shaded band across a range of x,\n * or a vertical line at one x. */\nexport type CurveMark =\n | { kind: 'band'; x: [number, number]; color?: string }\n | { kind: 'line'; x: number; color?: string };\n\n/** Props for `<CurveField>`. */\nexport interface CurveFieldProps {\n /** Flat [x0, y0, x1, y1, …] — matches how curve-as-array configs\n * serialize in JSON snapshots. */\n values: number[];\n min: number;\n max: number;\n step: number;\n /** Plot width in CSS px. Caller sizes (typically uses a ResizeObserver). */\n width: number;\n /** Plot height in CSS px. Default 110. */\n height?: number;\n /** Flat default curve. When provided, a Reset button restores it. */\n defaults?: readonly number[];\n onChange: (next: number[]) => void;\n /** Optional vertical marks overlaid on the plot (e.g. landmarks). */\n marks?: readonly CurveMark[];\n}\n\n/**\n * A function-domain (y = f(x), x ∈ [0,1]) curve editor with per-stop\n * numeric readouts and flip buttons. Wraps weasel-ui's\n * `CurveEditor`; consumers wanting the raw editor (2D paths,\n * custom anchors) should import that instead.\n */\nexport function CurveField({\n values,\n min,\n max,\n step,\n width,\n height = 110,\n defaults,\n onChange,\n marks,\n}: CurveFieldProps) {\n const points: ControlPoint[] = useMemo(() => {\n const out: ControlPoint[] = [];\n for (let i = 0; i + 1 < values.length; i += 2) out.push({ x: values[i], y: values[i + 1] });\n return out;\n }, [values]);\n\n const handleChange = useCallback(\n (next: ControlPoint[]) => {\n const flat: number[] = new Array(next.length * 2);\n for (let i = 0; i < next.length; i++) {\n const ySnap = Math.round(next[i].y / step) * step;\n const y = Math.max(min, Math.min(max, ySnap));\n flat[i * 2] = next[i].x;\n flat[i * 2 + 1] = y;\n }\n dlog('curve-field', 'handleChange', {\n nLen: next.length,\n flatLen: flat.length,\n sample: flat.slice(0, 4),\n });\n onChange(flat);\n },\n [onChange, min, max, step],\n );\n\n const handleFlip = useCallback(() => {\n const flipped: Array<{ x: number; y: number }> = [];\n for (let i = 0; i + 1 < values.length; i += 2) {\n flipped.push({ x: 1 - values[i], y: values[i + 1] });\n }\n flipped.sort((a, b) => a.x - b.x);\n const out: number[] = [];\n for (const p of flipped) out.push(p.x, p.y);\n onChange(out);\n }, [values, onChange]);\n\n const handleFlipVertical = useCallback(() => {\n const mid = (min + max) / 2;\n const flipped: number[] = new Array(values.length);\n for (let i = 0; i + 1 < values.length; i += 2) {\n flipped[i] = values[i];\n flipped[i + 1] = 2 * mid - values[i + 1];\n }\n onChange(flipped);\n }, [values, min, max, onChange]);\n\n return (\n <div className={s.field}>\n <div className={s.plot}>\n <CurveEditor\n value={points}\n onInput={handleChange}\n domain=\"1d\"\n constrain=\"function\"\n xRange={[0, 1]}\n yRange={[min, max]}\n width={width}\n height={height}\n endpoints=\"pinned-x\"\n addPointMode=\"click-curve\"\n minPoints={2}\n grid={{}}\n history={false}\n />\n {marks && marks.length > 0 && (\n <svg\n className={s.marks}\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n aria-hidden=\"true\"\n >\n {marks.map((m) => {\n const color = m.color ?? '#ffcc00';\n if (m.kind === 'band') {\n const x0 = Math.max(0, Math.min(1, m.x[0])) * width;\n const x1 = Math.max(0, Math.min(1, m.x[1])) * width;\n const left = Math.min(x0, x1);\n const w = Math.abs(x1 - x0);\n return (\n <g key={`band-${m.x[0]}-${m.x[1]}-${color}`}>\n <rect x={left} y={0} width={w} height={height} fill={color} fillOpacity={0.4} />\n <line\n x1={left}\n y1={0}\n x2={left}\n y2={height}\n stroke={color}\n strokeOpacity={0.85}\n strokeWidth={1}\n />\n <line\n x1={left + w}\n y1={0}\n x2={left + w}\n y2={height}\n stroke={color}\n strokeOpacity={0.85}\n strokeWidth={1}\n />\n </g>\n );\n }\n const x = Math.max(0, Math.min(1, m.x)) * width;\n return (\n <line\n key={`mark-${m.x}-${color}`}\n x1={x}\n y1={0}\n x2={x}\n y2={height}\n stroke={color}\n strokeWidth={1}\n />\n );\n })}\n </svg>\n )}\n </div>\n <div className={s.actions}>\n <button type=\"button\" className={s.action} onClick={handleFlip}>\n Flip horizontally\n </button>\n <button type=\"button\" className={s.action} onClick={handleFlipVertical}>\n Flip vertically\n </button>\n {defaults && (\n <button\n type=\"button\"\n className={s.action}\n onClick={() => onChange([...defaults])}\n >\n Reset\n </button>\n )}\n </div>\n </div>\n );\n}\n","import { type ReactNode, useState } from 'react';\nimport { Button } from '../Button';\nimport { Dialog } from '../Dialog';\nimport { type PropertyMetricProps, type PropertyRowLayout, PropertyRow } from './PropertyPanel';\nimport s from './Properties.module.css';\n\n/** Props for `<DialogRow>`. */\nexport interface DialogRowProps extends PropertyMetricProps {\n label: ReactNode;\n /** What the row shows of the value, on the button that opens the dialog. One\n * line; a longer one is cut off with an ellipsis. */\n summary: ReactNode;\n /** The dialog's body. A function runs only while the dialog is open, as a\n * component — it may use hooks — and is handed `close`. */\n children: ReactNode | ((close: () => void) => ReactNode);\n /** The dialog's heading. Defaults to `label`. */\n title?: ReactNode;\n /** Dialog footer. Defaults to a Done button; `null` draws none. */\n footer?: ReactNode | null;\n layout?: PropertyRowLayout;\n description?: string;\n /** Right-aligned readout shown next to the label — see `<PropertyRow readout>`. */\n readout?: ReactNode;\n /** Take the full width of the enclosing grid — see `<PropertyRow span>`. */\n span?: boolean;\n /** The row is auto — see `<PropertyRow auto>`. */\n auto?: boolean;\n /** Toggles `auto` from the row's label — see `<PropertyRow onAutoChange>`. */\n onAutoChange?: (next: boolean) => void;\n}\n\n/**\n * A row for a value too big to edit in place: it shows a one-line summary on a\n * button, and the button opens a modal holding whatever editor the row is\n * given. The body edits live — the dialog is room, not a transaction.\n */\nexport function DialogRow({\n label,\n summary,\n children,\n title,\n footer,\n layout,\n description,\n readout,\n span,\n density,\n align,\n auto,\n onAutoChange,\n}: DialogRowProps) {\n const [open, setOpen] = useState(false);\n const close = (): void => setOpen(false);\n const name = typeof label === 'string' ? label : undefined;\n return (\n <PropertyRow\n label={label}\n readout={readout}\n layout={layout}\n description={description}\n span={span}\n density={density}\n align={align}\n auto={auto}\n onAutoChange={onAutoChange}\n // A `<label>` hands a click on its text to its button, which would open\n // the dialog from the label — and the label is the auto toggle.\n group\n >\n <button\n type=\"button\"\n className={s.dialogTrigger}\n aria-haspopup=\"dialog\"\n aria-label={name === undefined ? undefined : `Edit ${name}`}\n onClick={() => setOpen(true)}\n >\n <span className={s.dialogSummary}>{summary}</span>\n <span className={s.dialogGlyph} aria-hidden=\"true\">\n …\n </span>\n </button>\n <Dialog\n isOpen={open}\n onOpenChange={setOpen}\n title={title ?? label}\n footer={\n footer === undefined ? (\n <Button variant=\"primary\" onClick={close}>\n Done\n </Button>\n ) : (\n (footer ?? undefined)\n )\n }\n >\n {typeof children === 'function' ? <DialogBody render={children} close={close} /> : children}\n </Dialog>\n </PropertyRow>\n );\n}\n\n/** Calls a function body as a component, so it runs only while the dialog is\n * mounted and may use hooks of its own. */\nfunction DialogBody({\n render,\n close,\n}: {\n render: (close: () => void) => ReactNode;\n close: () => void;\n}) {\n return render(close);\n}\n","import { type ReactNode, useId, useState } from 'react';\nimport { DisclosureRow } from '../Disclosure';\nimport { type StanceProps, useStance } from '../stance';\nimport s from './Properties.module.css';\nimport {\n type PropertyListPack,\n type PropertyMetricProps,\n PropertyNote,\n propertyMetricClass,\n} from './PropertyPanel';\n\n/** Props for `<PropertyGroup>`. */\nexport interface PropertyGroupProps extends PropertyMetricProps, StanceProps {\n /** Title rendered between two rules at the top of the group. */\n title: ReactNode;\n /** Before the title: a drag handle, an ordinal. Clicks here do not fold the group. */\n leading?: ReactNode;\n /** After the title: a summary of the group's value, a remove button. Clicks here do not fold the group. */\n actions?: ReactNode;\n /** Help text for the whole group, drawn under the title and above the\n * rows. `<PropertyRow description>` covers the per-row case. */\n description?: ReactNode;\n /** When true the group renders nothing — useful for conditional sections. */\n hidden?: boolean;\n /**\n * Give the title a twisty that folds the rows away. Implied by any of the\n * three props below, so it is only needed for a group that starts open and\n * keeps its own state.\n */\n collapsible?: boolean;\n /** Start folded. Read once; the group owns the state from then on. */\n defaultCollapsed?: boolean;\n /**\n * Folded or not, as the consumer holds it. Given, the group keeps no state\n * of its own and every toggle arrives at `onCollapsedChange` instead — which\n * is what a panel that remembers its sections past a reload needs.\n */\n collapsed?: boolean;\n onCollapsedChange?: (next: boolean) => void;\n children: ReactNode;\n className?: string;\n /** Take the whole width of a packed grid, like `<PropertyRow span>`: a group\n * lays its own rows out, so half a column leaves them overlapping. */\n span?: boolean;\n /** How rows pack into the 2-column grid — see `<PropertyList pack>`. */\n pack?: PropertyListPack;\n}\n\n/**\n * Visually-bordered group inside a PropertyList. Use to scope a set of\n * related rows under a heading (e.g. \"Aqua\", \"Bevel\", \"Dome\" sections\n * inside a fill effect's controls).\n *\n * A collapsible group keeps its rows mounted and hides them, so a control's\n * local state survives being folded away. `stance` and `tone` work as on\n * `<PropertyPanel>`; a tone also draws the group's leading edge in it, which\n * is how a list of like groups — effects, tails — tells its members apart.\n * `leading` and `actions` put a handle and controls in the title row, and the\n * groups of a `<PropertyList>` reorder with `useReorderDragList`.\n */\nexport function PropertyGroup({\n title,\n leading,\n actions,\n description,\n hidden,\n collapsible,\n defaultCollapsed,\n collapsed,\n onCollapsedChange,\n children,\n className,\n span,\n pack = 'auto-color',\n density,\n align,\n stance,\n tone,\n}: PropertyGroupProps) {\n const bodyId = useId();\n const [own, setOwn] = useState(defaultCollapsed ?? false);\n const stanced = useStance({ stance, tone });\n if (hidden) return null;\n\n const folds =\n collapsible ??\n (defaultCollapsed !== undefined || collapsed !== undefined || onCollapsedChange !== undefined);\n const folded = folds && (collapsed ?? own);\n const toggle = () => {\n if (collapsed === undefined) setOwn(!folded);\n onCollapsedChange?.(!folded);\n };\n\n const base = `${s.group}${pack === 'pairs' ? ` ${s.groupPairs}` : pack === 'one-up' ? ` ${s.groupOneUp}` : ''}`;\n const cls = propertyMetricClass(span ? `${base} ${s.span}` : base, { density, align }, className);\n const titled = (\n <h3 className={s.groupTitle}>\n <hr />\n <span>{title}</span>\n <hr />\n </h3>\n );\n const heading =\n leading === undefined && actions === undefined ? (\n titled\n ) : (\n <div className={s.groupHeadRow}>\n {leading === undefined ? null : <span className={s.groupLeading}>{leading}</span>}\n {titled}\n {actions === undefined ? null : <span className={s.groupActions}>{actions}</span>}\n </div>\n );\n return (\n <div className={cls} {...stanced}>\n {folds ? (\n <DisclosureRow\n className={s.groupHead}\n open={!folded}\n onToggle={toggle}\n label={typeof title === 'string' ? title : 'this section'}\n controls={bodyId}\n >\n {heading}\n </DisclosureRow>\n ) : (\n heading\n )}\n {description !== undefined && description !== '' && <PropertyNote>{description}</PropertyNote>}\n <div id={bodyId} className={s.groupBody} hidden={folded}>\n {children}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { type StanceProps, useStance } from '../stance';\nimport s from './Properties.module.css';\nimport { type PropertyMetricProps, propertyMetricClass } from './PropertyPanel';\n\n/** Props for `<Subpanel>`. */\nexport interface SubpanelProps extends PropertyMetricProps, StanceProps {\n title: ReactNode;\n children: ReactNode;\n className?: string;\n}\n\n/** A typographic divider inside a property list: a small title flanked by a\n * rule. Purely a heading — use `<PropertyGroup>` for a bordered section. A\n * stance or tone colors the title and rule. */\nexport function Subpanel({ title, children, className, density, align, stance, tone }: SubpanelProps) {\n const cls = propertyMetricClass(s.subpanel, { density, align }, className);\n return (\n <div className={cls} {...useStance({ stance, tone })}>\n <h4 className={s.subpanelTitle}>\n <span>{title}</span>\n <hr />\n </h4>\n {children}\n </div>\n );\n}\n","var e = {\n\tlist: \"_list_1ugdl_4\",\n\trow: \"_row_1ugdl_14\",\n\tcell: \"_cell_1ugdl_34\",\n\ttrailing: \"_trailing_1ugdl_51\",\n\tlabel: \"_label_1ugdl_58\",\n\tselected: \"_selected_1ugdl_64\",\n\tmuted: \"_muted_1ugdl_78\",\n\tempty: \"_empty_1ugdl_82\"\n};\n//#endregion\nexport { e as t };\n\n//# sourceMappingURL=ItemList.module-BSpCSxan.js.map","import {\n type KeyboardEvent,\n type ReactNode,\n type RefCallback,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { dlog } from '../../dlog';\nimport { CloseIcon, LockIcon } from '../../icons';\nimport { type PressModifiers, useReorderDragList } from '../../useReorderDragList';\nimport { Button } from '../Button';\nimport { Disclosure } from '../Disclosure';\nimport { DragGhost } from '../DragGhost';\nimport { DragHandleGlyph } from '../DragHandleGlyph';\nimport rows from '../ItemList/ItemList.module.css';\nimport { PropertyGroup, PropertyList } from '../Properties';\nimport type { StanceProps } from '../stance';\nimport s from './LayerList.module.css';\n\n/** One layer. With a body (see `renderBody`) it draws as a card that folds its\n * body away; without one, as a one-line row. Either can hold child layers. */\nexport interface LayerListItem {\n id: string;\n /** The layer's name. Also what its controls are labeled by. */\n label: string;\n /** Shown in the header in place of `label` — a select that switches the\n * layer's kind, say. */\n title?: ReactNode;\n /** Fixed-size content before the label: a color swatch, a kind icon. */\n leading?: ReactNode;\n /** Drawn in the drag handle in place of the grip — an ordinal. */\n badge?: ReactNode;\n /** Which of its list this layer is: an index into the theme's tone list, or\n * a color. A card draws its edge and handle in it and recolors its controls. */\n tone?: StanceProps['tone'];\n /** Cannot be dragged, hidden or removed, walls off drops on either side, and\n * selects alone rather than joining a multi-selection. */\n locked?: boolean;\n /** Shown or not, when the list has `onVisibilityChange`. Default true. */\n visible?: boolean;\n children?: LayerListItem[];\n /** Folds the body and children away until the user opens them.\n * `collapsedIds` overrides it. */\n defaultCollapsed?: boolean;\n}\n\n/**\n * A reorder: `ids`, siblings under `parentId` (`null` at the top level), now\n * sit as one block in list order starting at `index` of the parent's children.\n * A drag never moves a layer to another parent.\n */\nexport interface LayerMove {\n ids: string[];\n parentId: string | null;\n index: number;\n}\n\n/** Props for `<LayerList>`. */\nexport interface LayerListProps {\n items: LayerListItem[];\n /** Omit for a list the user cannot reorder. */\n onReorder?: (move: LayerMove) => void;\n /** Giving both makes rows selectable: a click selects one, shift-click adds\n * or removes one, and dragging a selected row drags its selected siblings. */\n selectedIds?: readonly string[];\n onSelect?: (ids: string[]) => void;\n /** Adds a visibility checkbox to every unlocked layer. */\n onVisibilityChange?: (id: string, visible: boolean) => void;\n /** Adds a ✕ to every unlocked layer. */\n onRemove?: (id: string) => void;\n /** A layer's controls. Returning `null` leaves that layer a one-line row. */\n renderBody?: (item: LayerListItem) => ReactNode;\n /** Ids whose body and children are folded away. Giving it makes folding\n * controlled; `onCollapsedChange` fires either way. */\n collapsedIds?: readonly string[];\n onCollapsedChange?: (ids: string[]) => void;\n /** Heading above the list. */\n title?: string;\n /** Names the list for assistive tech when it has no `title`. */\n label?: string;\n /** Kinds the user can add, as buttons beside the title. Shown only with `onAdd`. */\n addKinds?: string[];\n onAdd?: (kind: string) => void;\n /** Shown in place of the list when `items` is empty. */\n empty?: ReactNode;\n /** Appended to the root's class list — the module's own names are hashed. */\n className?: string;\n}\n\n/** Returns `items` with `move` applied, for a consumer that holds the tree as state. */\nexport function moveLayers(items: LayerListItem[], move: LayerMove): LayerListItem[] {\n if (move.parentId === null) return reorder(items, move);\n return items.map((item) => {\n if (item.id === move.parentId) return { ...item, children: reorder(item.children ?? [], move) };\n return item.children ? { ...item, children: moveLayers(item.children, move) } : item;\n });\n}\n\nfunction reorder(siblings: LayerListItem[], { ids, index }: LayerMove): LayerListItem[] {\n const moving = new Set(ids);\n const kept = siblings.filter((it) => !moving.has(it.id));\n const moved = siblings.filter((it) => moving.has(it.id));\n const at = Math.max(0, Math.min(kept.length, index));\n return [...kept.slice(0, at), ...moved, ...kept.slice(at)];\n}\n\nfunction collectCollapsed(\n items: LayerListItem[],\n isCollapsed: (item: LayerListItem) => boolean,\n into = new Set<string>(),\n): Set<string> {\n for (const item of items) {\n if (isCollapsed(item)) into.add(item.id);\n if (item.children) collectCollapsed(item.children, isCollapsed, into);\n }\n return into;\n}\n\nfunction anyNested(items: LayerListItem[]): boolean {\n return items.some((it) => (it.children?.length ?? 0) > 0);\n}\n\n/** What every level of the tree reads from the list. */\ninterface Shared {\n props: LayerListProps;\n collapsed: ReadonlySet<string>;\n toggle: (id: string) => void;\n press: (item: LayerListItem, mods: PressModifiers) => void;\n uid: string;\n /** Some layer has children, so every row keeps a twisty column. */\n nested: boolean;\n /** Each layer's body, rendered once; a row where it is empty. */\n bodies: ReadonlyMap<string, ReactNode>;\n /** Per sibling group, keyed by parent: move a row one place, as its drag would. */\n nudgers: Map<string | null, (id: string, delta: -1 | 1) => boolean>;\n keys: RowKeys;\n}\n\n/** The roving focus over the rows: one row is in the tab order at a time. */\ninterface RowKeys {\n tabStop: string | undefined;\n register: (id: string) => (el: HTMLElement | null) => void;\n onKeyDown: (item: LayerListItem, parentId: string | null) => (e: KeyboardEvent<HTMLElement>) => void;\n onFocus: (id: string) => void;\n}\n\ninterface VisibleRow {\n item: LayerListItem;\n parentId: string | null;\n level: number;\n}\n\nfunction hasBody(body: ReactNode): boolean {\n return body !== null && body !== undefined && body !== false;\n}\n\n/**\n * An ordered, drag-reorderable list of layers — a document's objects, a lab's\n * canvases, a fill's effects. Each layer is a one-line row or, with a body, a\n * card whose controls fold away; either can nest child layers. Selection,\n * visibility, removal and an add palette are each on when their handler is given.\n */\nexport function LayerList(props: LayerListProps) {\n const { items, collapsedIds, onCollapsedChange, title, addKinds, onAdd, empty, className } = props;\n // Only the user's own toggles are state; everything else reads the layer's\n // `defaultCollapsed`, so a layer added later starts the way it asks to.\n const [toggled, setToggled] = useState<ReadonlyMap<string, boolean>>(new Map());\n const collapsed = collapsedIds\n ? new Set(collapsedIds)\n : collectCollapsed(items, (item) => toggled.get(item.id) ?? item.defaultCollapsed === true);\n const toggle = (id: string) => {\n const next = new Set(collapsed);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n if (!collapsedIds) setToggled((prev) => new Map(prev).set(id, next.has(id)));\n onCollapsedChange?.([...next]);\n };\n\n // The press arrives after the drag session ends, which can be after a render\n // the closure did not see, so it reads the selection from here.\n const live = useRef(props);\n live.current = props;\n const press = (item: LayerListItem, mods: PressModifiers) => {\n const { selectedIds = [], onSelect } = live.current;\n if (!onSelect) return;\n anchor.current = item.id;\n if (item.locked || !mods.shiftKey) {\n onSelect([item.id]);\n return;\n }\n // A leftover locked selection does not carry into a multi-selection.\n const locked = new Set(lockedIds(live.current.items));\n const kept = selectedIds.filter((id) => !locked.has(id));\n onSelect(kept.includes(item.id) ? kept.filter((id) => id !== item.id) : [...kept, item.id]);\n };\n\n const bodies = new Map<string, ReactNode>();\n const collectBodies = (list: LayerListItem[]) => {\n for (const it of list) {\n bodies.set(it.id, props.renderBody ? props.renderBody(it) : null);\n if (it.children) collectBodies(it.children);\n }\n };\n collectBodies(items);\n\n // The rows the arrow keys walk: open branches only, and not cards, whose\n // heads are their own controls.\n const visible: VisibleRow[] = [];\n const walk = (list: LayerListItem[], parentId: string | null, level: number) => {\n for (const item of list) {\n if (!hasBody(bodies.get(item.id))) visible.push({ item, parentId, level });\n if (item.children?.length && !collapsed.has(item.id)) walk(item.children, item.id, level + 1);\n }\n };\n walk(items, null, 1);\n\n const rowEls = useRef(new Map<string, HTMLElement>());\n const [focusId, setFocusId] = useState<string | null>(null);\n const pendingFocus = useRef<string | null>(null);\n const anchor = useRef<string | null>(null);\n const nudgers = useRef(new Map<string | null, (id: string, delta: -1 | 1) => boolean>()).current;\n useLayoutEffect(() => {\n const id = pendingFocus.current;\n if (id === null) return;\n pendingFocus.current = null;\n const el = rowEls.current.get(id);\n if (el && document.activeElement !== el) el.focus();\n });\n\n const selectedIds = props.selectedIds ?? [];\n const tabStop = visible.some((v) => v.item.id === focusId)\n ? (focusId ?? undefined)\n : (visible.find((v) => selectedIds.includes(v.item.id)) ?? visible[0])?.item.id;\n\n const focusRow = (id: string) => {\n pendingFocus.current = id;\n setFocusId(id);\n };\n // Locked rows never join a multi-selection, so a range passes over them.\n const selectRange = (to: string) => {\n const from = anchor.current ?? to;\n const a = visible.findIndex((v) => v.item.id === from);\n const b = visible.findIndex((v) => v.item.id === to);\n if (a < 0 || b < 0) return;\n const range = visible\n .slice(Math.min(a, b), Math.max(a, b) + 1)\n .filter((v) => !v.item.locked)\n .map((v) => v.item.id);\n if (range.length > 0) live.current.onSelect?.(range);\n };\n\n const keys: RowKeys = {\n tabStop,\n register: (id) => (el) => {\n if (el) rowEls.current.set(id, el);\n else rowEls.current.delete(id);\n },\n onFocus: (id) => {\n setFocusId(id);\n anchor.current ??= id;\n },\n onKeyDown: (item, parentId) => (e) => {\n // Keys on a control inside the row are the control's.\n if (e.target !== e.currentTarget) return;\n const at = visible.findIndex((v) => v.item.id === item.id);\n const go = (index: number) => {\n const next = visible[Math.max(0, Math.min(visible.length - 1, index))];\n if (!next) return;\n focusRow(next.item.id);\n if (e.shiftKey && props.onSelect) selectRange(next.item.id);\n else anchor.current = next.item.id;\n };\n const branch = (item.children?.length ?? 0) > 0;\n const open = branch && !collapsed.has(item.id);\n switch (e.key) {\n case 'ArrowDown':\n case 'ArrowUp': {\n const delta = e.key === 'ArrowDown' ? 1 : -1;\n if (e.altKey) {\n if (nudgers.get(parentId)?.(item.id, delta)) pendingFocus.current = item.id;\n } else {\n go(at + delta);\n }\n break;\n }\n case 'Home':\n go(0);\n break;\n case 'End':\n go(visible.length - 1);\n break;\n case 'ArrowRight':\n if (branch && !open) toggle(item.id);\n else if (open) go(at + 1);\n else return;\n break;\n case 'ArrowLeft':\n if (open) toggle(item.id);\n else if (parentId !== null) go(visible.findIndex((v) => v.item.id === parentId));\n else return;\n break;\n case 'Enter':\n case ' ':\n press(item, { shiftKey: e.shiftKey, ctrlKey: e.ctrlKey, metaKey: e.metaKey, altKey: e.altKey });\n break;\n default:\n return;\n }\n e.preventDefault();\n },\n };\n\n const uid = useId();\n const shared: Shared = { props, collapsed, toggle, press, uid, nested: anyNested(items), bodies, nudgers, keys };\n const palette = onAdd ? (addKinds ?? []) : [];\n const cls = className ? `${s.root} ${className}` : s.root;\n\n return (\n <div className={cls}>\n {(title !== undefined || palette.length > 0) && (\n <div className={s.head}>\n {title !== undefined && <h2 className={s.title}>{title}</h2>}\n <div className={s.palette}>\n {palette.map((kind) => (\n <button\n key={kind}\n type=\"button\"\n className={s.add}\n aria-label={`Add ${kind}`}\n onClick={() => {\n dlog('layer-list', 'onAdd', { kind });\n onAdd?.(kind);\n }}\n >\n {kind}\n </button>\n ))}\n </div>\n </div>\n )}\n {items.length === 0 ? (\n <div className={rows.empty}>\n {empty ?? (palette.length > 0 ? 'No layers — add one above.' : 'No layers.')}\n </div>\n ) : (\n <Level items={items} parentId={null} shared={shared} path=\"\" level={1} />\n )}\n </div>\n );\n}\n\nfunction lockedIds(items: LayerListItem[]): string[] {\n const out: string[] = [];\n for (const it of items) {\n if (it.locked) out.push(it.id);\n if (it.children) out.push(...lockedIds(it.children));\n }\n return out;\n}\n\ninterface LevelProps {\n items: LayerListItem[];\n parentId: string | null;\n shared: Shared;\n path: string;\n level: number;\n}\n\n/** One sibling group. Each has its own drag, so a drag stays under one parent. */\nfunction Level({ items, parentId, shared, path, level }: LevelProps) {\n const { props } = shared;\n const selected = props.selectedIds ?? [];\n const drag = useReorderDragList({\n // With no `onReorder` every row is a locked one to the drag, so a press\n // still reaches `onPress` and nothing ever engages.\n items: items.map((it) => ({ id: it.id, label: it.label, locked: it.locked || !props.onReorder })),\n selectedIds: items.filter((it) => selected.includes(it.id)).map((it) => it.id),\n onReorder: (ids, target) => {\n const moving = new Set(ids);\n const inOrder = items.filter((it) => moving.has(it.id)).map((it) => it.id);\n // The hook's index counts the dragged rows; a move's index does not.\n const before = items.slice(0, target).filter((it) => moving.has(it.id)).length;\n const move = { ids: inOrder, parentId, index: target - before };\n dlog('layer-list', 'onReorder', move);\n props.onReorder?.(move);\n },\n onPress: (id, mods) => {\n const item = items.find((it) => it.id === id);\n if (item) shared.press(item, mods);\n },\n });\n shared.nudgers.set(parentId, (id, delta) =>\n drag.nudge(id, items.findIndex((it) => it.id === id), delta),\n );\n const [el, setEl] = useState<HTMLDivElement | null>(null);\n const bind = (node: HTMLDivElement | null) => {\n setEl(node);\n (drag.containerProps.ref as RefCallback<HTMLDivElement>)(node);\n };\n\n const bodies = items.map((it) => shared.bodies.get(it.id));\n const cards = bodies.some(hasBody);\n const { draggedIds, targetIndex, ghost } = drag.state;\n\n const entry = (item: LayerListItem, i: number, ghosted: boolean) => {\n const body = bodies[i];\n const kids = item.children ?? [];\n const open = !shared.collapsed.has(item.id);\n const childId = `${shared.uid}${path}-${i}`;\n const onPointerDown = ghosted ? undefined : drag.rowProps(item.id, i).onPointerDown;\n const isSelected = selected.includes(item.id);\n const cls = [s.entry];\n if (!ghosted) {\n if (draggedIds?.includes(item.id)) cls.push(s.dragging);\n if (targetIndex === i && !draggedIds?.includes(item.id)) cls.push(s.dropBefore);\n if (targetIndex === items.length && i === items.length - 1) cls.push(s.dropAfter);\n }\n const controls = <Controls item={item} shared={shared} />;\n const head =\n hasBody(body) ? (\n <PropertyGroup\n className={s.card}\n title={item.title ?? item.label}\n {...(item.tone === undefined ? {} : { tone: item.tone })}\n collapsed={ghosted || !open}\n onCollapsedChange={() => shared.toggle(item.id)}\n leading={\n <Handle\n item={item}\n reorder={props.onReorder !== undefined}\n onPointerDown={onPointerDown}\n onNudge={(delta) => shared.nudgers.get(parentId)?.(item.id, delta)}\n />\n }\n actions={ghosted ? undefined : controls}\n >\n {ghosted ? null : body}\n </PropertyGroup>\n ) : (\n <div\n className={[rows.row, s.row, isSelected ? rows.selected : ''].filter(Boolean).join(' ')}\n data-selected={isSelected ? 'true' : undefined}\n data-locked={item.locked ? 'true' : undefined}\n onPointerDown={onPointerDown}\n {...(ghosted\n ? {}\n : {\n role: 'row',\n 'aria-level': level,\n ...(kids.length > 0 ? { 'aria-expanded': open } : {}),\n ...(props.onSelect ? { 'aria-selected': isSelected } : {}),\n tabIndex: shared.keys.tabStop === item.id ? 0 : -1,\n ref: shared.keys.register(item.id),\n onKeyDown: shared.keys.onKeyDown(item, parentId),\n onFocus: () => shared.keys.onFocus(item.id),\n })}\n >\n {shared.nested &&\n (kids.length > 0 ? (\n <span className={s.stop} onPointerDown={stop}>\n <Disclosure\n open={open}\n onToggle={() => shared.toggle(item.id)}\n label={`${item.label} sublayers`}\n controls={childId}\n />\n </span>\n ) : (\n <span className={s.twistyGap} />\n ))}\n <Grip item={item} reorder={props.onReorder !== undefined} />\n {props.onVisibilityChange &&\n (item.locked ? (\n <span className={s.check} />\n ) : (\n <input\n className={s.check}\n type=\"checkbox\"\n checked={item.visible !== false}\n onPointerDown={stop}\n onChange={(e) => props.onVisibilityChange?.(item.id, e.target.checked)}\n aria-label={`Show ${item.label}`}\n />\n ))}\n {item.leading}\n <span className={rows.label}>{item.title ?? item.label}</span>\n {ghosted ? null : <Remove item={item} shared={shared} />}\n </div>\n );\n return (\n <div key={item.id} role=\"none\" className={cls.join(' ')} data-selected={isSelected ? 'true' : undefined}>\n {head}\n {!ghosted && kids.length > 0 && open && (\n <div id={childId} role=\"rowgroup\" className={s.children}>\n <Level items={kids} parentId={item.id} shared={shared} path={`${path}-${i}`} level={level + 1} />\n </div>\n )}\n </div>\n );\n };\n\n return (\n <>\n {cards ? (\n <PropertyList ref={bind} className={`${s.level} ${s.cards}`}>\n {items.map((it, i) => entry(it, i, false))}\n </PropertyList>\n ) : (\n <div\n ref={bind}\n className={s.level}\n {...(parentId === null\n ? {\n role: 'treegrid',\n 'aria-label': props.label ?? props.title ?? 'Layers',\n ...(props.onSelect ? { 'aria-multiselectable': true } : {}),\n }\n : { role: 'none' })}\n >\n {items.map((it, i) => entry(it, i, false))}\n </div>\n )}\n {ghost && el ? (\n <DragGhost at={ghost} from={el}>\n {items.map((it, i) => (ghost.ids.includes(it.id) ? entry(it, i, true) : null))}\n </DragGhost>\n ) : null}\n </>\n );\n}\n\n// Keeps a press on a control inside a row from also starting the row's press.\nconst stop = (e: { stopPropagation(): void }) => e.stopPropagation();\n\n/** A row's grip: decoration, since the whole row takes the drag. */\nfunction Grip({ item, reorder }: { item: LayerListItem; reorder: boolean }) {\n if (item.locked) {\n return (\n <span className={s.lock} role=\"img\" aria-label=\"Locked\">\n <LockIcon size={12} />\n </span>\n );\n }\n if (!reorder && item.badge === undefined) return null;\n return (\n <span className={s.grip} aria-hidden=\"true\">\n {item.badge ?? <DragHandleGlyph size={13} />}\n </span>\n );\n}\n\n/** A card's handle: the drag target, since the rest of its head folds it, and\n * Alt+Up/Down on it moves the card. */\nfunction Handle({\n item,\n reorder,\n onPointerDown,\n onNudge,\n}: {\n item: LayerListItem;\n reorder: boolean;\n onPointerDown: ((e: React.PointerEvent) => void) | undefined;\n onNudge: (delta: -1 | 1) => void;\n}) {\n if (item.locked) return <Grip item={item} reorder={reorder} />;\n if (!reorder && item.badge === undefined) return undefined;\n return (\n <button\n type=\"button\"\n className={s.handle}\n aria-label={`Drag to reorder ${item.label}`}\n aria-keyshortcuts=\"Alt+ArrowUp Alt+ArrowDown\"\n onPointerDown={onPointerDown}\n onKeyDown={(e) => {\n if (!e.altKey || (e.key !== 'ArrowUp' && e.key !== 'ArrowDown')) return;\n e.preventDefault();\n onNudge(e.key === 'ArrowUp' ? -1 : 1);\n }}\n >\n {item.badge ?? <DragHandleGlyph />}\n </button>\n );\n}\n\nfunction Controls({ item, shared }: { item: LayerListItem; shared: Shared }) {\n const { onVisibilityChange } = shared.props;\n return (\n <>\n {onVisibilityChange && !item.locked && (\n <input\n className={s.check}\n type=\"checkbox\"\n checked={item.visible !== false}\n onClick={stop}\n onChange={(e) => onVisibilityChange(item.id, e.target.checked)}\n aria-label={`Show ${item.label}`}\n />\n )}\n <Remove item={item} shared={shared} />\n </>\n );\n}\n\nfunction Remove({ item, shared }: { item: LayerListItem; shared: Shared }) {\n const { onRemove } = shared.props;\n if (!onRemove || item.locked) return null;\n return (\n <span className={s.stop} onPointerDown={stop}>\n <Button variant=\"ghost\" size=\"sm\" iconOnly ariaLabel={`Remove ${item.label}`} onClick={() => onRemove(item.id)}>\n <CloseIcon size={14} />\n </Button>\n </span>\n );\n}\n","import { useEffect, useRef, useState, type KeyboardEvent } from 'react';\nimport { Button } from '../Button';\nimport s from './ListEditor.module.css';\n\n/** Props for {@link ListEditor}. */\nexport interface ListEditorProps {\n value: readonly string[];\n /** Every edit, add and removal, with the whole list. Entries are written as\n * typed — an empty one stays until it is removed. */\n onChange: (next: string[]) => void;\n /** Shown in an empty entry. */\n placeholder?: string;\n /** Shown in place of the entries when there are none. */\n empty?: string;\n /** Text of the add button. */\n addLabel?: string;\n /** Names the list for assistive tech; each entry is named from it. */\n 'aria-label'?: string;\n className?: string;\n}\n\n/**\n * An editable list of strings: one field per entry, a remove button beside\n * each, and an add button under them. Enter in an entry adds one after it;\n * Backspace in an empty one removes it.\n */\nexport function ListEditor({\n value,\n onChange,\n placeholder,\n empty = 'None',\n addLabel = 'Add',\n 'aria-label': ariaLabel,\n className,\n}: ListEditorProps) {\n const inputs = useRef<(HTMLInputElement | null)[]>([]);\n const [focus, setFocus] = useState<number | null>(null);\n\n useEffect(() => {\n if (focus === null) return;\n inputs.current[focus]?.focus();\n setFocus(null);\n }, [focus]);\n\n const insert = (at: number): void => {\n onChange([...value.slice(0, at), '', ...value.slice(at)]);\n setFocus(at);\n };\n const remove = (at: number): void => {\n onChange(value.filter((_, i) => i !== at));\n if (value.length > 1) setFocus(Math.max(0, at - 1));\n };\n const onKeyDown = (e: KeyboardEvent<HTMLInputElement>, at: number): void => {\n if (e.key === 'Enter') {\n e.preventDefault();\n insert(at + 1);\n } else if (e.key === 'Backspace' && value[at] === '') {\n e.preventDefault();\n remove(at);\n }\n };\n const name = (i: number): string => `${ariaLabel ?? 'Entry'} ${i + 1}`;\n\n return (\n <div className={[s.editor, className].filter(Boolean).join(' ')} role=\"group\" aria-label={ariaLabel}>\n {value.length === 0 ? (\n <div className={s.empty}>{empty}</div>\n ) : (\n <ul className={s.list}>\n {value.map((entry, i) => (\n // Entries have no identity beyond their position, and two may be equal.\n <li key={i} className={s.entry}>\n <input\n ref={(el) => {\n inputs.current[i] = el;\n }}\n type=\"text\"\n className={s.input}\n aria-label={name(i)}\n value={entry}\n placeholder={placeholder}\n onChange={(e) => onChange(value.map((v, j) => (j === i ? e.target.value : v)))}\n onKeyDown={(e) => onKeyDown(e, i)}\n />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n ariaLabel={`Remove ${name(i)}`}\n onClick={() => remove(i)}\n >\n ×\n </Button>\n </li>\n ))}\n </ul>\n )}\n <div className={s.actions}>\n <Button size=\"sm\" onClick={() => insert(value.length)}>\n {addLabel}\n </Button>\n </div>\n </div>\n );\n}\n","import type { ReactElement } from 'react';\nimport type { ColorModePreference } from '@weasel-js/theme';\nimport { ModeAutoIcon, ModeDarkIcon, ModeLightIcon } from '../../icons';\nimport { ToggleBar, type ToggleBarItem, type ToggleBarSize, type ToggleBarVariant } from '../ToggleBar/ToggleBar';\n\n/** Props for {@link ColorModeControl}. */\nexport interface ColorModeControlProps {\n value: ColorModePreference;\n onChange: (next: ColorModePreference) => void;\n /** Accessible name of the group. Defaults to `'Color mode'`. */\n ariaLabel?: string;\n size?: ToggleBarSize;\n variant?: ToggleBarVariant;\n className?: string;\n}\n\nfunction items(glyph: number): ToggleBarItem<ColorModePreference>[] {\n return [\n { value: 'auto', label: <ModeAutoIcon size={glyph} />, ariaLabel: 'Auto', tooltip: 'Auto — follow the system' },\n { value: 'light', label: <ModeLightIcon size={glyph} />, ariaLabel: 'Light', tooltip: 'Light' },\n { value: 'dark', label: <ModeDarkIcon size={glyph} />, ariaLabel: 'Dark', tooltip: 'Dark' },\n ];\n}\n\nconst ITEMS = { sm: items(12), md: items(14) };\n\n/**\n * The Auto / Light / Dark choice, as a three-way radiogroup of mode glyphs.\n * Controlled: pair it with `useColorModePreference` from\n * `@weasel-js/theme/react` and put the hook's resolved `mode` in the\n * `ThemeProvider` selection.\n */\nexport function ColorModeControl({\n value,\n onChange,\n ariaLabel = 'Color mode',\n size,\n variant,\n className,\n}: ColorModeControlProps): ReactElement {\n return (\n <ToggleBar\n items={ITEMS[size ?? 'md']}\n value={value}\n onChange={(next) => {\n if (next) onChange(next);\n }}\n ariaLabel={ariaLabel}\n size={size}\n variant={variant}\n className={className}\n />\n );\n}\n","var e = {\n\troot: \"_root_4jvk7_10\",\n\tsegment: \"_segment_4jvk7_32\",\n\tsegmentSelected: \"_segmentSelected_4jvk7_81\",\n\tsize_sm: \"_size_sm_4jvk7_139\",\n\tvariant_minimal: \"_variant_minimal_4jvk7_152\"\n};\n//#endregion\nexport { e as t };\n\n//# sourceMappingURL=segmentedControl.module-Bv7DEg8f.js.map","import { type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport s from '../segmentedControl.module.css';\nimport { useRovingTabIndex } from '../../useRovingTabIndex';\n\n/**\n * One segment of an {@link OptionsBar}. Unlike `ToggleBar`, each item carries\n * its own selected state and its own `onChange`.\n */\nexport type OptionsBarItem<V extends string | number = string> = {\n value: V;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n selected: boolean;\n onChange: (next: boolean) => void;\n};\n\n/** Segment height and type scale for an {@link OptionsBar}. */\nexport type OptionsBarSize = 'sm' | 'md';\n/** Visual treatment of an {@link OptionsBar}. */\nexport type OptionsBarVariant = 'default' | 'minimal';\n\n/** Props for {@link OptionsBar}. */\nexport type OptionsBarProps<V extends string | number = string> = {\n items: readonly OptionsBarItem<V>[];\n ariaLabel?: string;\n className?: string;\n height?: number;\n /** Size variant. `sm` is ~60% of the default height with reduced padding\n * and font size — sized for dense surfaces like lab control panels. */\n size?: OptionsBarSize;\n /** Visual variant. `minimal` strips the pill track and glass treatment;\n * selection becomes a flat accent. For dense diagnostic surfaces. */\n variant?: OptionsBarVariant;\n};\n\n/**\n * Segmented strip of independent on/off options, each owning its own state.\n * Use it when the segments are unrelated booleans; use `ToggleBar` when they\n * are values of one setting.\n */\nexport function OptionsBar<V extends string | number = string>(props: OptionsBarProps<V>): ReactElement {\n const { items, ariaLabel, className, height, size, variant } = props;\n\n const toggle = (index: number) => {\n const item = items[index];\n if (item.disabled) return;\n item.onChange(!item.selected);\n };\n\n const roving = useRovingTabIndex({ items, itemClassName: s.segment, onActivate: toggle });\n\n const style: CSSProperties | undefined = height !== undefined\n ? ({ ['--wzl-tb-height' as string]: `${height}px` } as CSSProperties)\n : undefined;\n\n const rootCls = [\n s.root,\n size && s[`size_${size}`],\n variant && s[`variant_${variant}`],\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <div\n ref={roving.rootRef}\n className={rootCls}\n role=\"group\"\n aria-label={ariaLabel}\n style={style}\n >\n {items.map((item, i) => {\n const cls = `${s.segment}${item.selected ? ` ${s.segmentSelected}` : ''}`;\n return (\n <button\n key={item.value}\n type=\"button\"\n aria-pressed={item.selected}\n aria-label={item.ariaLabel}\n disabled={item.disabled}\n tabIndex={roving.tabIndexFor(i)}\n className={cls}\n onClick={() => toggle(i)}\n onKeyDown={roving.onKeyDown(i)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n );\n}\n","import { type CSSProperties, type ReactElement, type ReactNode } from 'react';\nimport s from '../segmentedControl.module.css';\nimport { useRovingTabIndex } from '../../useRovingTabIndex';\nimport { SegmentTooltip, segmentTooltipContent, type SegmentTooltipFields } from '../segmentTooltip';\n\n/**\n * One button in an {@link ButtonBar}. `value` is only a React key; the item\n * carries no selected state.\n */\nexport type ButtonBarItem<V extends string | number = string> = {\n value: V;\n label?: ReactNode;\n ariaLabel?: string;\n disabled?: boolean;\n onAction: () => void;\n} & SegmentTooltipFields;\n\n/** Segment height and type scale for an {@link ButtonBar}. */\nexport type ButtonBarSize = 'sm' | 'md';\n/** Visual treatment of an {@link ButtonBar}. */\nexport type ButtonBarVariant = 'default' | 'minimal';\n\n/** Props for {@link ButtonBar}. */\nexport type ButtonBarProps<V extends string | number = string> = {\n items: readonly ButtonBarItem<V>[];\n ariaLabel?: string;\n className?: string;\n height?: number;\n size?: ButtonBarSize;\n variant?: ButtonBarVariant;\n};\n\n/**\n * Segmented strip of momentary buttons — each press fires and nothing stays\n * selected. Shares the look and the arrow-key navigation of `ToggleBar` and\n * `OptionsBar`.\n *\n * This is a plain callback bar. For buttons driven by the kit's actions\n * registry, use `ActionBar` instead.\n */\nexport function ButtonBar<V extends string | number = string>(props: ButtonBarProps<V>): ReactElement {\n const { items, ariaLabel, className, height, size, variant } = props;\n\n const fire = (index: number) => {\n const item = items[index];\n if (item.disabled) return;\n item.onAction();\n };\n\n const roving = useRovingTabIndex({ items, itemClassName: s.segment, onActivate: fire });\n\n const style: CSSProperties | undefined = height !== undefined\n ? ({ ['--wzl-tb-height' as string]: `${height}px` } as CSSProperties)\n : undefined;\n\n const rootCls = [\n s.root,\n size && s[`size_${size}`],\n variant && s[`variant_${variant}`],\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <div\n ref={roving.rootRef}\n className={rootCls}\n role=\"toolbar\"\n aria-label={ariaLabel}\n style={style}\n >\n {items.map((item, i) => (\n <SegmentTooltip key={item.value} content={segmentTooltipContent(item)} disabled={item.disabled}>\n <button\n type=\"button\"\n aria-label={item.ariaLabel}\n disabled={item.disabled}\n tabIndex={roving.tabIndexFor(i)}\n className={s.segment}\n onClick={() => fire(i)}\n onKeyDown={roving.onKeyDown(i)}\n >\n {item.label}\n </button>\n </SegmentTooltip>\n ))}\n </div>\n );\n}\n","// Reading and writing the paint objects a property control may be pointed at.\n//\n// `data.fill` is a `FillStyle` and `data.stroke` a `Stroke`, so a control that\n// assumes either is a hex string reads `undefined` off it and writes a bare\n// string back over it. These helpers are what keep a control honest about the\n// shape it is holding.\n\n/** Whether a value is a `FillStyle` at all: an object naming a kind, or one\n * carrying a color, which is the solid member with its optional tag left off.\n * A pref's stored value is `unknown`, so this is what stands between a paint\n * control and a string someone saved there. */\nexport function isPaint(value: unknown): value is { fill?: string; color?: string } {\n if (typeof value !== 'object' || value === null) return false;\n const paint = value as { fill?: unknown; color?: unknown };\n return typeof paint.fill === 'string' || typeof paint.color === 'string';\n}\n\n/** The color of a solid paint, or `undefined` for anything else — including a\n * value that isn't a paint at all. `fill` is optional on the solid member of\n * the union, so the tag alone can't decide it. */\nexport function solidColorOf(value: unknown): string | undefined {\n if (typeof value !== 'object' || value === null) return undefined;\n const paint = value as { fill?: string; color?: unknown };\n if (paint.fill !== undefined && paint.fill !== 'solid') return undefined;\n return typeof paint.color === 'string' ? paint.color : undefined;\n}\n\n/** The single color a stroke shows, or `undefined` when it has none to show —\n * a gradient or pattern stroke, or no stroke at all. */\nexport function strokeColorOf(value: unknown): string | undefined {\n if (typeof value !== 'object' || value === null || !('paint' in value)) return undefined;\n return solidColorOf((value as { paint: unknown }).paint);\n}\n","// Preference-schema vocabulary for PrefsForm / PrefsDialog / SelectionPanel:\n// core's `ToolPref*` family under this package's names. Never re-declare them\n// here — this was a hand-kept structural copy until it drifted, and the\n// independence from `@weasel-js/core` it bought is long gone anyway.\n\nexport type {\n ToolPref as BuiltinPref,\n ToolPrefBoolean as PrefBoolean,\n ToolPrefBooleanControl as PrefBooleanControl,\n ToolPrefColor as PrefColor,\n ToolPrefCustom as PrefCustom,\n ToolPrefEnum as PrefEnum,\n ToolPrefEnumControl as PrefEnumControl,\n ToolPrefEnumEncoding as PrefEnumEncoding,\n ToolPrefGroup as PrefGroup,\n ToolPrefKind as PrefKind,\n ToolPrefLeaf as PrefLeaf,\n ToolPrefNumber as PrefNumber,\n ToolPrefNumberControl as PrefNumberControl,\n ToolPrefNumberFormat as PrefNumberFormat,\n ToolPrefNumberUnit as PrefNumberUnit,\n ToolPrefObject as PrefObject,\n ToolPrefPaint as PrefPaint,\n ToolPrefString as PrefString,\n ToolPrefStringControl as PrefStringControl,\n} from '@weasel-js/core';\n\nimport type { UnitTable } from '../../format/number';\nimport type { ToolPrefGroup, ToolPrefLeaf, ToolPrefNumber, ToolPrefNumberUnit as PrefNumberUnitType } from '@weasel-js/core';\n\n/**\n * A number leaf's bounds in the unit it is displayed in.\n *\n * Only what the leaf declares converts: an omitted bound has no stored\n * counterpart to put through the conversion, and its fallback — 0..100 for a\n * slider's track, a step of 1 — is a display-space number already. `min` and\n * `max` are points, so they convert the way the value does; `step` is a\n * distance, and a unit with an offset maps zero somewhere else, so converting\n * it as a point would scale it wrong. A decreasing conversion swaps which end\n * is the lower one.\n */\nexport function prefDisplayBounds(\n p: ToolPrefNumber,\n): { min?: number; max?: number; step: number } {\n if (!p.unit) return { min: p.min, max: p.max, step: p.step ?? 1 };\n const { toDisplay } = p.unit;\n const lo = p.min === undefined ? undefined : toDisplay(p.min);\n const hi = p.max === undefined ? undefined : toDisplay(p.max);\n const flipped = lo !== undefined && hi !== undefined && lo > hi;\n const step = p.step === undefined\n ? 1\n : Math.abs(toDisplay(p.step) - toDisplay(0)) || p.step;\n return { min: flipped ? hi : lo, max: flipped ? lo : hi, step };\n}\n\n/** What a unit leaf's field reads as typed text: its `accepts` table, and its\n * `suffix` as the display unit itself. */\nexport function prefUnitAccepts(unit: PrefNumberUnitType): Readonly<UnitTable> {\n return unit.suffix === undefined ? { ...unit.accepts } : { [unit.suffix]: 1, ...unit.accepts };\n}\n\n/** Distinguishes a leaf from a group while walking a schema tree. */\nexport function isPrefLeaf(node: ToolPrefLeaf | ToolPrefGroup): node is ToolPrefLeaf {\n return 'kind' in node;\n}\n\n/** Get the value at a dotted path inside a nested value tree. Returns\n * `undefined` when a segment is missing or hits a non-object. */\nexport function prefValueAtPath(values: unknown, path: string): unknown {\n let cur: unknown = values;\n for (const seg of path.split('.')) {\n if (cur == null || typeof cur !== 'object') return undefined;\n cur = (cur as Record<string, unknown>)[seg];\n }\n return cur;\n}\n\n/**\n * Recursively drop `hidden` leaves (unless `showHidden`), pruning groups\n * that end up empty. Returns null when the entire subtree is hidden.\n */\nexport function visiblePrefSubtree<T extends ToolPrefLeaf | ToolPrefGroup>(\n node: T,\n showHidden: boolean,\n): T | null {\n if (isPrefLeaf(node)) return node.hidden && !showHidden ? null : node;\n const group = node as ToolPrefGroup;\n const children: Record<string, ToolPrefLeaf | ToolPrefGroup> = {};\n for (const [key, child] of Object.entries(group.children)) {\n const kept = visiblePrefSubtree(child, showHidden);\n if (kept) children[key] = kept;\n }\n if (Object.keys(children).length === 0) return null;\n return { ...node, children };\n}\n\n/** One entry in a {@link PrefsForm} rail: a group the reader can navigate to. */\nexport interface PrefRailItem {\n /** Dotted path of the group. Empty for the entry holding loose root leaves. */\n path: string;\n name: string;\n /** 0 opens a pane; 1 scrolls within the open one. The rail goes no deeper. */\n depth: 0 | 1;\n /** Path of the depth-0 ancestor — its own path when `depth` is 0. */\n section: string;\n /** Leaves surviving the active filter, counted over the whole subtree. */\n matches: number;\n}\n\n/** Leaves anywhere under `node`, counted. */\nfunction countPrefLeaves(node: ToolPrefLeaf | ToolPrefGroup): number {\n if (isPrefLeaf(node)) return 1;\n let n = 0;\n for (const child of Object.values(node.children)) n += countPrefLeaves(child);\n return n;\n}\n\n/**\n * The rail's model for a schema: depth-0 groups, each followed by its depth-1\n * children. Deeper groups render inside a pane and get no entry — a schema\n * that nests ten deep still navigates two levels.\n *\n * Loose leaves directly under the root lead the list under an entry named for\n * the root itself, since they belong to no group that could name them.\n */\nexport function prefRailItems(root: ToolPrefGroup): PrefRailItem[] {\n const items: PrefRailItem[] = [];\n const loose = Object.values(root.children).filter(isPrefLeaf).length;\n if (loose > 0) {\n items.push({ path: '', name: root.name, depth: 0, section: '', matches: loose });\n }\n for (const [key, child] of Object.entries(root.children)) {\n if (isPrefLeaf(child)) continue;\n items.push({\n path: key,\n name: child.name,\n depth: 0,\n section: key,\n matches: countPrefLeaves(child),\n });\n for (const [subKey, sub] of Object.entries(child.children)) {\n if (isPrefLeaf(sub)) continue;\n items.push({\n path: `${key}.${subKey}`,\n name: sub.name,\n depth: 1,\n section: key,\n matches: countPrefLeaves(sub),\n });\n }\n }\n return items;\n}\n\n/** Whether one leaf answers to a filter query, by name, description or path. */\nfunction prefLeafMatches(pref: ToolPrefLeaf, path: string, query: string): boolean {\n if (pref.name.toLowerCase().includes(query)) return true;\n if (pref.description?.toLowerCase().includes(query)) return true;\n return path.toLowerCase().includes(query);\n}\n\n/**\n * Drop every leaf that does not answer to `query`, pruning groups left empty.\n * A group whose own name matches keeps all of its leaves — a reader who typed\n * the group's name is asking for the group, not for leaves repeating it.\n *\n * An empty or whitespace query matches everything, so a cleared field restores\n * the tree rather than emptying it.\n */\nexport function filterPrefSubtree<T extends ToolPrefLeaf | ToolPrefGroup>(\n node: T,\n query: string,\n path = '',\n): T | null {\n const q = query.trim().toLowerCase();\n if (q === '') return node;\n if (isPrefLeaf(node)) return prefLeafMatches(node, path, q) ? node : null;\n const group = node as ToolPrefGroup;\n if (group.name.toLowerCase().includes(q)) return node;\n const children: Record<string, ToolPrefLeaf | ToolPrefGroup> = {};\n for (const [key, child] of Object.entries(group.children)) {\n const kept = filterPrefSubtree(child, q, path === '' ? key : `${path}.${key}`);\n if (kept) children[key] = kept;\n }\n if (Object.keys(children).length === 0) return null;\n return { ...node, children };\n}\n","import type { ReactNode } from 'react';\nimport { isBuiltinToolPref, type FillStyle } from '@weasel-js/core';\nimport { Icon } from '../../icons/Icon';\nimport { ICON_PATHS, type IconName } from '../../icons/paths';\nimport { isPaint } from '../paintValue';\nimport type { PropertyControlProps } from '../Properties/PropertyField';\nimport { prefDisplayBounds, prefUnitAccepts, type PrefLeaf } from './schema';\n\n/** What {@link prefFieldProps} is told about one leaf's value. */\nexport interface PrefFieldState {\n /** The value held at the leaf. `undefined` when `mixed` or `unset`. */\n value: unknown;\n mixed?: boolean;\n unset?: boolean;\n /** The object the leaf is a field of, for an enum `encoding` and a font's\n * weight and slant. `undefined` for a top-level leaf. */\n siblings?: Record<string, unknown>;\n /** Writes a value in the leaf's stored form. */\n setValue: (value: unknown) => void;\n /** A font family's weight and slant, where they are not `siblings`' own\n * `fontWeight` / `fontStyle`. */\n fontVariant?: { weight?: unknown; style?: unknown };\n}\n\n/**\n * A schema leaf as {@link PropertyControl} props: its value, bounds and\n * options in the form it is shown in, and a writer that stores what the\n * control reports in the form the leaf holds.\n *\n * The conversions every schema-driven surface needs live here once — a\n * number's display unit and its bounds, an enum's `encoding`, a color's\n * alpha, an icon resolved to a glyph. A leaf that is not a single control —\n * an `object`, whose fields each are, or an app-defined kind — returns\n * `null`, and the surface draws it.\n *\n * Spread the result and add what the surface decides: `chrome`, `name`, a\n * class, a different default `control`.\n */\nexport function prefFieldProps(leaf: PrefLeaf, state: PrefFieldState): PropertyControlProps | null {\n const { value, mixed = false, unset = false, siblings, setValue } = state;\n if (leaf.kind === 'font-family') {\n const weight = state.fontVariant ? state.fontVariant.weight : siblings?.fontWeight;\n const style = state.fontVariant ? state.fontVariant.style : siblings?.fontStyle;\n return {\n kind: 'font-family',\n value: typeof value === 'string' ? value : undefined,\n mixed,\n unset,\n onChange: setValue,\n weight: typeof weight === 'number' ? weight : undefined,\n fontStyle: style === 'italic' ? 'italic' : undefined,\n };\n }\n if (!isBuiltinToolPref(leaf)) return null;\n switch (leaf.kind) {\n case 'boolean':\n return {\n kind: 'boolean',\n control: leaf.control,\n value: typeof value === 'boolean' ? value : undefined,\n mixed,\n unset,\n glyph: glyphOf(leaf.icon) ?? leaf.short,\n onChange: setValue,\n };\n case 'number': {\n const unit = leaf.unit;\n const stored = typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n // `min`/`max`/`step` are declared in the stored unit, like the value, so\n // they convert with it — a leaf storing radians and showing degrees was\n // clamping typed degrees against 0..6.28.\n const bounds = prefDisplayBounds(leaf);\n const clamp = (n: number) =>\n Math.min(bounds.max ?? Infinity, Math.max(bounds.min ?? -Infinity, n));\n const store = (shown: number) => setValue(unit ? unit.fromDisplay(clamp(shown)) : clamp(shown));\n return {\n kind: 'number',\n control: leaf.control,\n value: stored === undefined ? undefined : unit ? unit.toDisplay(stored) : stored,\n mixed,\n unset,\n min: bounds.min,\n max: bounds.max,\n step: bounds.step,\n unit: unit?.suffix,\n accepts: unit ? prefUnitAccepts(unit) : undefined,\n notation: leaf.format,\n onChange: store,\n };\n }\n case 'string':\n return {\n kind: 'string',\n control: leaf.control,\n value: typeof value === 'string' ? value : '',\n mixed,\n unset,\n onChange: setValue,\n };\n case 'enum': {\n const encoding = leaf.encoding;\n // An encoded leaf stores something other than the option string (a dash\n // array), so the option comes from the encoding — and an absent field is\n // one of the things it reads (no dash is `solid`), which is why `unset`\n // does not blank it.\n const option = encoding\n ? mixed\n ? undefined\n : encoding.read(value, siblings)\n : mixed || unset\n ? undefined\n : typeof value === 'string'\n ? value\n : leaf.default;\n return {\n kind: 'enum',\n control: leaf.control,\n value: option,\n mixed,\n unset,\n options: leaf.options.map((o) => ({\n value: o.value,\n label: o.label,\n glyph: glyphOf(o.icon) ?? o.short,\n disabled: o.disabled,\n })),\n onChange: (next: string) => setValue(encoding ? encoding.write(next, siblings) : next),\n };\n }\n case 'color':\n return {\n kind: 'color',\n value: typeof value === 'string' ? value : leaf.default,\n mixed,\n unset,\n alpha: leaf.alpha ? true : undefined,\n onChange: setValue,\n };\n case 'paint': {\n // `??` would read an explicit `null` — \"no paint\" — as absent and show\n // the default over it. Unset shows the fallback actually in effect,\n // dimmed by the control: true, but not chosen.\n const paint =\n value === null\n ? null\n : isPaint(value)\n ? value\n : mixed\n ? undefined\n : isPaint(leaf.default)\n ? leaf.default\n : null;\n return {\n kind: 'paint',\n value: paint as FillStyle | null | undefined,\n mixed,\n unset,\n onChange: setValue,\n };\n }\n case 'object':\n return null;\n default: {\n // Not reachable while every built-in kind has an arm — and a new kind\n // that lacks one is a compile error here, never a blank row.\n const _exhaustive: never = leaf;\n throw new Error(\n `prefFieldProps: no control for built-in pref kind \"${(_exhaustive as { kind: string }).kind}\"`,\n );\n }\n }\n}\n\n/** A leaf's `icon` as a glyph, where the kit's icon set has it. */\nfunction glyphOf(icon: string | undefined): ReactNode {\n return icon && icon in ICON_PATHS ? <Icon name={icon as IconName} size={14} /> : undefined;\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { Badge } from '../Badge/Badge';\nimport type { BadgeSize, BadgeStatus, BadgeVariant } from '../Badge/types';\nimport type { StanceProps } from '../stance';\nimport type { EdgeCap } from '../Badge/bases/edgeProfiles';\nimport s from './Powerline.module.css';\n\n/**\n * One segment of a {@link Powerline}. Giving it `onClick` or `href` makes it\n * interactive, the same way it does on a `Badge`.\n */\nexport interface PowerlineSegment extends StanceProps {\n text: ReactNode;\n /** Cap on this segment's right edge. Next segment's left edge adopts the same profile. */\n endCap?: EdgeCap;\n status?: BadgeStatus;\n variant?: BadgeVariant;\n size?: BadgeSize;\n onClick?: () => void;\n href?: string;\n 'aria-label'?: string;\n}\n\n/** Props for {@link Powerline}. */\nexport interface PowerlineProps {\n segments: PowerlineSegment[];\n /** Left edge of the first segment. Defaults to 'flat'. */\n startCap?: EdgeCap;\n /** Default size for every segment (per-segment `size` wins). */\n size?: BadgeSize;\n /** Default variant for every segment (per-segment `variant` wins). */\n variant?: BadgeVariant;\n /** Protrusion depth in CSS px, passed through to every segment's base. */\n depth?: number;\n /** Visible gap between adjacent segments. Number → px; string → literal CSS length.\n * Default: `0.2em` (scales with the row's font size). Pass `0` for flush. */\n gap?: number | string;\n className?: string;\n 'aria-label'?: string;\n}\n\n/**\n * A row of chevron-linked badge segments, in the style of a shell powerline\n * prompt. Each segment's `endCap` shapes both its own right edge and the next\n * segment's left edge, so the run reads as one continuous chain.\n *\n * Built for showing a path through a sequence of steps — the inspector uses\n * it to display how input routes from tool to gesture to action to target.\n */\nexport function Powerline({\n segments,\n startCap = 'flat',\n size,\n variant,\n depth,\n gap,\n className,\n ...rest\n}: PowerlineProps) {\n const cls = [s.row, className].filter(Boolean).join(' ');\n const style: CSSProperties | undefined = gap !== undefined\n ? { ['--powerline-gap' as never]: typeof gap === 'number' ? `${gap}px` : gap }\n : undefined;\n return (\n <span className={cls} style={style} aria-label={rest['aria-label']}>\n {segments.map((seg, i) => {\n const leftEdge: EdgeCap = i === 0 ? startCap : (segments[i - 1].endCap ?? 'flat');\n const rightEdge: EdgeCap = seg.endCap ?? 'flat';\n return (\n <Badge\n key={i}\n base=\"powerline\"\n baseParams={{ leftEdge, rightEdge, ...(depth !== undefined && { depth }) }}\n status={seg.status}\n stance={seg.stance}\n tone={seg.tone}\n variant={seg.variant ?? variant}\n size={seg.size ?? size}\n onClick={seg.onClick}\n href={seg.href}\n aria-label={seg['aria-label']}\n className={s.segment}\n >\n {seg.text}\n </Badge>\n );\n })}\n </span>\n );\n}\n","import { useCallback, useEffect, useRef, useState, type RefObject } from 'react';\n\n/** One observed section: its id and its top edge, in the container's\n * coordinates (its `getBoundingClientRect().top` less the container's). */\nexport interface SectionOffset {\n id: string;\n top: number;\n}\n\n/**\n * The section a reader is looking at: the last one whose top edge has passed\n * the container's, within `slack` of it so a heading flush with the top counts\n * as arrived. Null until one has — the settings above the first section belong\n * to the group itself, and marking a section the reader has not reached yet\n * points them at the wrong place.\n *\n * Offsets arrive in document order and are not re-sorted — a caller reading\n * them off the DOM already has them that way, and sorting would hide a\n * measurement that came back wrong.\n */\nexport function pickActiveSection(\n offsets: readonly SectionOffset[],\n slack = 8,\n): string | null {\n let active: string | null = null;\n for (const { id, top } of offsets) {\n if (top - slack > 0) break;\n active = id;\n }\n return active;\n}\n\n/** Options for {@link useScrollSpy}. */\nexport interface UseScrollSpyOptions {\n /** The scrolling element holding the sections. */\n rootRef: RefObject<HTMLElement | null>;\n /** Section element ids, in document order. */\n ids: readonly string[];\n /** Pixels of tolerance at the container's top edge. */\n slack?: number;\n}\n\n/** What {@link useScrollSpy} returns. */\nexport interface ScrollSpy {\n /** Id of the section in view, or null before anything is measured. */\n active: string | null;\n /**\n * Scroll `id` to the container's top and hold that answer until the scroll\n * settles. Without the hold, the scroll the click causes is observed on its\n * way past every intervening section and the rail flickers through them.\n */\n scrollTo: (id: string) => void;\n}\n\n/** How long to keep a programmatic scroll's answer when `scrollend` never\n * arrives — Safari and Firefox have not shipped it. Comfortably longer than a\n * smooth scroll, short enough that a reader who then scrolls by hand is not\n * left looking at a stale highlight. */\nconst SETTLE_MS = 700;\n\n/**\n * Which of a scrolling container's sections is in view, for a navigation rail\n * that follows the reader. Positions are read on the container's own `scroll`\n * event — already throttled to the frame by the browser — rather than through\n * `IntersectionObserver`, so the decision stays a pure function of measured\n * offsets ({@link pickActiveSection}) and is testable apart from the DOM.\n */\nexport function useScrollSpy(options: UseScrollSpyOptions): ScrollSpy {\n const { rootRef, ids, slack } = options;\n const [active, setActive] = useState<string | null>(null);\n // Set while a programmatic scroll runs: what to report, instead of what the\n // moving container would say.\n const heldRef = useRef<string | null>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const releaseRef = useRef<(() => void) | null>(null);\n const key = ids.join('\\u0000');\n\n const measure = useCallback((): void => {\n const root = rootRef.current;\n if (!root) return;\n if (heldRef.current !== null) {\n setActive(heldRef.current);\n return;\n }\n const rootTop = root.getBoundingClientRect().top;\n const offsets: SectionOffset[] = [];\n for (const id of ids) {\n const el = root.querySelector<HTMLElement>(`[data-spy-section=\"${CSS.escape(id)}\"]`);\n if (el) offsets.push({ id, top: el.getBoundingClientRect().top - rootTop });\n }\n setActive(pickActiveSection(offsets, slack));\n // `ids` is compared by content through `key`: a caller deriving the array\n // each render would otherwise resubscribe on every one.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [rootRef, key, slack]);\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n measure();\n root.addEventListener('scroll', measure, { passive: true });\n return () => root.removeEventListener('scroll', measure);\n }, [rootRef, measure]);\n\n const scrollTo = useCallback((id: string): void => {\n const root = rootRef.current;\n if (!root) return;\n const el = root.querySelector<HTMLElement>(`[data-spy-section=\"${CSS.escape(id)}\"]`);\n heldRef.current = id;\n setActive(id);\n const release = (): void => {\n heldRef.current = null;\n root.removeEventListener('scrollend', release);\n measure();\n };\n // A scroll interrupted by the next one would otherwise leave its\n // `scrollend` listener behind to fire against a later scroll.\n releaseRef.current?.();\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n releaseRef.current = release;\n timerRef.current = setTimeout(release, SETTLE_MS);\n root.addEventListener('scrollend', release);\n if (!el) return;\n const top = el.getBoundingClientRect().top - root.getBoundingClientRect().top + root.scrollTop;\n root.scrollTo?.({ top, behavior: prefersReducedMotion() ? 'auto' : 'smooth' });\n }, [rootRef, measure]);\n\n useEffect(() => () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n releaseRef.current?.();\n }, []);\n\n return { active, scrollTo };\n}\n\nfunction prefersReducedMotion(): boolean {\n return typeof matchMedia === 'function'\n && matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n","import { type ReactNode } from 'react';\nimport { PropertyControl } from '../Properties/PropertyField';\nimport { PropertyRow } from '../Properties/PropertyPanel';\nimport { prefFieldProps } from './prefField';\nimport {\n isPrefLeaf,\n prefValueAtPath,\n type PrefGroup,\n type PrefLeaf,\n type PrefObject,\n} from './schema';\nimport s from './Prefs.module.css';\n\n/** What a {@link PrefRenderer} is given for the leaf it is rendering. */\nexport interface PrefRenderContext {\n /** Dotted path of the leaf within the schema root. */\n path: string;\n /** The schema node. App renderers narrow this to their own kind shape. */\n pref: PrefLeaf;\n /** Current value — `values` at `path`, falling back to `pref.default`. */\n value: unknown;\n setValue: (value: unknown) => void;\n /** Whether this leaf is currently auto — not pinned, computed by the owner. */\n auto: boolean;\n /** Toggle this leaf's auto state. */\n setAuto: (next: boolean) => void;\n}\n\n/**\n * Renders the control cell for one preference leaf. Returning `null`\n * collapses the row.\n */\nexport type PrefRenderer = (ctx: PrefRenderContext) => ReactNode;\n\nexport interface WalkCtx {\n values: unknown;\n onChange: (path: string, value: unknown) => void;\n renderers?: Record<string, PrefRenderer>;\n}\n\nexport function PrefRow({ ctx, path, pref }: { ctx: WalkCtx; path: string; pref: PrefLeaf }) {\n const stored = prefValueAtPath(ctx.values, path);\n const renderCtx: PrefRenderContext = {\n path,\n pref,\n value: stored !== undefined ? stored : pref.default,\n setValue: (v) => ctx.onChange(path, v),\n // A prefs form pins every leaf: it has no computed state to hand back.\n auto: false,\n setAuto: () => {},\n };\n\n const custom = ctx.renderers?.[pref.kind];\n const control = custom ? custom(renderCtx) : renderBuiltin(renderCtx);\n if (custom && control === null) return null;\n\n // `block` leaves own their chrome (embedded editors with their own\n // header) — no label/tooltip row.\n if (pref.block) return <>{control}</>;\n\n return (\n <PropertyRow\n label={pref.name}\n description={pref.description}\n layout=\"inline\"\n chrome=\"framed\"\n className={s.row}\n >\n <span className={s.rowControl}>{control}</span>\n </PropertyRow>\n );\n}\n\nfunction renderBuiltin(\n ctx: PrefRenderContext,\n // The object a nested leaf is a field of — what an enum `encoding` and a\n // font's weight and slant read against. Undefined for a top-level leaf.\n siblings?: Record<string, unknown>,\n): ReactNode {\n const { pref, value, setValue } = ctx;\n if (pref.kind === 'object') return <ObjectLeaf ctx={ctx} />;\n const field = prefFieldProps(pref, { value, siblings, setValue });\n if (field === null) {\n // App-defined kind with no `renderers` entry: labeled placeholder, not a\n // crash — a missing wiring should be visible and recoverable.\n return <span className={s.unrenderable}>({pref.kind}: no renderer)</span>;\n }\n return <PropertyControl {...field} chrome=\"framed\" name={pref.name} />;\n}\n\n/** One value with its fields hanging off it: each field renders its own\n * control and commits the parent object whole. */\nfunction ObjectLeaf({ ctx }: { ctx: PrefRenderContext }) {\n const pref = ctx.pref as PrefObject;\n const { value, setValue } = ctx;\n const held = typeof value === 'object' && value !== null\n ? (value as Record<string, unknown>)\n : undefined;\n const objectRows = (children: Record<string, PrefLeaf | PrefGroup>): ReactNode[] => {\n const out: ReactNode[] = [];\n for (const [key, child] of Object.entries(children)) {\n if (!isPrefLeaf(child)) {\n const inner = objectRows(child.children);\n if (inner.length === 0) continue;\n out.push(<h4 key={`group:${key}`} className={s.objectGroup}>{child.name}</h4>, ...inner);\n continue;\n }\n out.push(\n <PropertyRow\n key={key}\n label={child.name}\n layout=\"inline\"\n chrome=\"framed\"\n className={s.objectRow}\n >\n <span className={s.rowControl}>\n {renderBuiltin({\n path: `${ctx.path}.${key}`,\n pref: child,\n value: held?.[key],\n setValue: (v) => {\n const base = held ?? pref.fromScalar?.(value) ?? {};\n setValue({ ...base, [key]: v });\n },\n // A field is not pinned on its own — it shares the state of\n // the object leaf it hangs off.\n auto: ctx.auto,\n setAuto: ctx.setAuto,\n }, held)}\n </span>\n </PropertyRow>,\n );\n }\n return out;\n };\n return <div className={s.objectLeaf}>{objectRows(pref.children)}</div>;\n}\n","import { type RefObject } from 'react';\nimport { isPrefLeaf, type PrefGroup, type PrefLeaf } from './schema';\nimport { PrefRow, type WalkCtx } from './PrefsRow';\nimport s from './Prefs.module.css';\n\n/** Props for {@link PrefsPane}. */\nexport interface PrefsPaneProps {\n ctx: WalkCtx;\n /** The open group, or a synthetic one holding the root's loose leaves. */\n group: PrefGroup;\n /** Dotted path of `group`. Empty for the loose-leaf pane. */\n path: string;\n /** The pane's scroll container, for the rail's scroll spy. */\n scrollRef: RefObject<HTMLDivElement | null>;\n className?: string;\n}\n\n/**\n * One rail section's settings: the group's own leaves, then one headed\n * section per nested group.\n *\n * Nothing here draws a panel. The rail is the layout's structure, and a card\n * inside a dialog that already has a border only restates it — the columns\n * layout's sunken panels are what this is the alternative to.\n */\nexport function PrefsPane(props: PrefsPaneProps) {\n const { ctx, group, path, scrollRef, className } = props;\n const leaves = Object.entries(group.children).filter(\n (entry): entry is [string, PrefLeaf] => isPrefLeaf(entry[1]),\n );\n const groups = Object.entries(group.children).filter(\n (entry): entry is [string, PrefGroup] => !isPrefLeaf(entry[1]),\n );\n const childPath = (key: string): string => (path === '' ? key : `${path}.${key}`);\n\n return (\n <div className={[s.pane, className].filter(Boolean).join(' ')} ref={scrollRef}>\n <div className={s.paneHead}>\n <h3 className={s.paneTitle}>{group.name}</h3>\n {group.description !== undefined && (\n <p className={s.paneDesc}>{group.description}</p>\n )}\n </div>\n {leaves.length > 0 && (\n <div className={s.rows}>\n {leaves.map(([key, leaf]) => (\n <PrefRow key={key} ctx={ctx} path={childPath(key)} pref={leaf} />\n ))}\n </div>\n )}\n {groups.map(([key, child]) => (\n <PaneSection\n key={key}\n ctx={ctx}\n group={child}\n path={childPath(key)}\n depth={0}\n />\n ))}\n </div>\n );\n}\n\n/**\n * A nested group inside a pane. Depth 0 sections are the ones the rail links\n * to and carry `data-spy-section`; deeper ones indent and are reached only by\n * scrolling, which is what keeps the rail two levels deep whatever the schema\n * does.\n */\nfunction PaneSection({ ctx, group, path, depth }: {\n ctx: WalkCtx;\n group: PrefGroup;\n path: string;\n depth: number;\n}) {\n const Heading = depth === 0 ? 'h4' : 'h5';\n return (\n <section\n className={depth === 0 ? s.paneSection : s.paneSubsection}\n data-spy-section={depth === 0 ? path : undefined}\n aria-label={group.name}\n >\n <Heading className={depth === 0 ? s.sectionTitle : s.subsectionTitle}>\n {group.name}\n </Heading>\n {group.description !== undefined && (\n <p className={s.paneDesc}>{group.description}</p>\n )}\n <div className={s.rows}>\n {Object.entries(group.children).map(([key, child]) => {\n const p = `${path}.${key}`;\n return isPrefLeaf(child) ? (\n <PrefRow key={key} ctx={ctx} path={p} pref={child} />\n ) : (\n <PaneSection key={key} ctx={ctx} group={child} path={p} depth={depth + 1} />\n );\n })}\n </div>\n </section>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useRovingTabIndex } from '../../useRovingTabIndex';\nimport type { PrefRailItem } from './schema';\nimport s from './Prefs.module.css';\n\n/** Props for {@link PrefsRail}. */\nexport interface PrefsRailProps {\n items: readonly PrefRailItem[];\n /** Path of the open depth-0 group. */\n section: string;\n /** Path of the depth-1 group in view, from the pane's scroll spy. */\n current: string | null;\n /** A depth-0 entry was chosen: open its pane. */\n onOpen: (path: string) => void;\n /** A depth-1 entry was chosen: scroll the open pane to it. */\n onScrollTo: (path: string) => void;\n /** Accessible name for the rail's landmark. */\n ariaLabel: string;\n /** Rendered above the list — the filter field, when there is one. */\n header?: ReactNode;\n /** Show each entry's match count. Only meaningful while filtering. */\n showCounts?: boolean;\n}\n\n/**\n * The rail beside a `PrefsForm` pane: depth-0 groups, each followed by the\n * depth-1 groups that scroll within it.\n *\n * A list of buttons rather than a tablist, because only half of these entries\n * switch anything — the nested ones scroll the pane the selected entry already\n * opened, and a tab that does not own a panel has no honest role. The open\n * group is `aria-current=\"page\"`; the nested group in view is\n * `aria-current=\"location\"`.\n */\nexport function PrefsRail(props: PrefsRailProps) {\n const { items, section, current, onOpen, onScrollTo, ariaLabel, header, showCounts } = props;\n const activate = (index: number): void => {\n const item = items[index];\n if (!item) return;\n if (item.depth === 0) onOpen(item.path);\n else onScrollTo(item.path);\n };\n const roving = useRovingTabIndex<HTMLDivElement>({\n items: items.map(() => ({})),\n itemClassName: s.railItem,\n tabStopIndex: Math.max(0, items.findIndex((i) => i.path === section)),\n });\n\n return (\n <nav className={s.rail} aria-label={ariaLabel}>\n {header}\n <div className={s.railList} ref={roving.rootRef}>\n {items.map((item, index) => {\n const open = item.depth === 0 && item.path === section;\n const inView = item.depth === 1 && item.path === current;\n return (\n <button\n key={item.path === '' ? '\\u0000root' : item.path}\n type=\"button\"\n className={[s.railItem, item.depth === 1 && s.railSub, open && s.railOpen, inView && s.railInView]\n .filter(Boolean)\n .join(' ')}\n aria-current={open ? 'page' : inView ? 'location' : undefined}\n tabIndex={roving.tabIndexFor(index)}\n onKeyDown={roving.onKeyDown(index)}\n onClick={() => activate(index)}\n >\n <span className={s.railName}>{item.name}</span>\n {showCounts ? <span className={s.railCount}>{item.matches}</span> : null}\n </button>\n );\n })}\n </div>\n </nav>\n );\n}\n","import { useMemo, useRef, useState, type ReactNode } from 'react';\nimport { Input } from '../Input';\nimport { useScrollSpy } from '../../useScrollSpy';\nimport {\n filterPrefSubtree,\n isPrefLeaf,\n prefRailItems,\n visiblePrefSubtree,\n type PrefGroup,\n} from './schema';\nimport { PrefRow, type PrefRenderer, type WalkCtx } from './PrefsRow';\nimport { PrefsPane } from './PrefsPane';\nimport { PrefsRail } from './PrefsRail';\nimport s from './Prefs.module.css';\n\nexport type { PrefRenderer, PrefRenderContext } from './PrefsRow';\n\n/** How a {@link PrefsForm} lays its groups out. */\nexport type PrefsLayout = 'columns' | 'rail';\n\n/** Props for {@link PrefsForm}. */\nexport interface PrefsFormProps {\n /** Root of the schema tree. Core `ToolPrefGroup`s assign structurally. */\n schema: PrefGroup;\n /** Nested value tree (shape mirrors the schema). Sparse is fine —\n * missing leaves fall back to their schema `default`. */\n values?: unknown;\n /** Change callback with the leaf's dotted path. Values apply live;\n * there is no dirty/commit state. */\n onChange: (path: string, value: unknown) => void;\n /**\n * Per-kind renderers for app-defined kinds. Entries also override the\n * built-in kinds when keys collide. A renderer owns the control cell\n * (the label/tooltip row chrome stays with the form, unless the leaf\n * sets `block`); returning `null` collapses the row entirely. Unknown\n * kinds with no renderer show a labeled placeholder instead of\n * crashing.\n */\n renderers?: Record<string, PrefRenderer>;\n /** Reveal `hidden` leaves (dev tooling). Default false. */\n showHidden?: boolean;\n /**\n * `'columns'` (the default) wraps each top-level group into its own panel\n * column. `'rail'` puts a two-level navigation rail beside one group's\n * settings at a time — what a dialog-sized surface wants, since columns\n * overflow sideways once there are more than two.\n */\n layout?: PrefsLayout;\n /** Show a filter field that narrows the form to matching leaves. */\n filterable?: boolean;\n /** Rail layout: path of the open top-level group. Controlled. */\n section?: string;\n /** Rail layout: path of the group open before the reader picks one.\n * Defaults to the first in the schema. */\n defaultSection?: string;\n onSectionChange?: (path: string) => void;\n className?: string;\n}\n\n/**\n * Schema-driven preferences form. Leaves render as label + control rows;\n * how the groups around them are arranged is `layout`'s to say — columns of\n * panels, or a navigation rail beside one group at a time.\n *\n * Storage-agnostic: pair with `PrefsDialog` for the modal composition, and\n * persist however the app likes via `onChange`.\n */\nexport function PrefsForm(props: PrefsFormProps) {\n const {\n schema,\n values,\n onChange,\n renderers,\n showHidden = false,\n layout = 'columns',\n filterable = false,\n className,\n } = props;\n const [query, setQuery] = useState('');\n const root = useMemo(() => {\n const visible = visiblePrefSubtree(schema, showHidden);\n return visible === null ? null : filterPrefSubtree(visible, query);\n }, [schema, showHidden, query]);\n\n const ctx: WalkCtx = { values, onChange, renderers };\n const field = filterable ? (\n <div className={s.filter}>\n <Input\n value={query}\n onChange={setQuery}\n aria-label={`Filter ${schema.name}`}\n placeholder=\"Filter settings\"\n />\n </div>\n ) : null;\n\n if (layout === 'rail') {\n return (\n <RailLayout\n {...props}\n root={root}\n ctx={ctx}\n query={query}\n filterField={field}\n onClearFilter={() => setQuery('')}\n />\n );\n }\n\n return (\n <div className={[s.columnsLayout, className].filter(Boolean).join(' ')}>\n {field}\n {root === null ? (\n <NoMatches query={query} onClear={() => setQuery('')} />\n ) : (\n <div className={s.columns}>\n {Object.entries(root.children).map(([key, child]) => (\n <div key={key} className={s.column}>\n {isPrefLeaf(child) ? (\n // Top-level leaves are unusual but legal — give each its own\n // column for symmetry with grouped siblings.\n <PrefRow ctx={ctx} path={key} pref={child} />\n ) : (\n <GroupBody ctx={ctx} group={child} path={key} depth={0} />\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/** The rail layout's own state: which group is open, and where the pane is\n * scrolled to within it. Split out so the columns layout runs none of it. */\nfunction RailLayout(props: PrefsFormProps & {\n root: PrefGroup | null;\n ctx: WalkCtx;\n query: string;\n filterField: ReactNode;\n onClearFilter: () => void;\n}) {\n const { schema, root, ctx, query, filterField, onClearFilter, className } = props;\n const items = useMemo(() => (root === null ? [] : prefRailItems(root)), [root]);\n const [uncontrolled, setUncontrolled] = useState(\n () => props.defaultSection ?? '',\n );\n const requested = props.section ?? uncontrolled;\n // A filter can take the open group out of the rail entirely, and a section\n // the schema never had can arrive from a consumer's stale state. Either way\n // the first surviving entry is what the reader should be looking at.\n const open = items.some((i) => i.path === requested && i.depth === 0)\n ? requested\n : (items.find((i) => i.depth === 0)?.path ?? '');\n\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const sectionIds = useMemo(\n () => items.filter((i) => i.depth === 1 && i.section === open).map((i) => i.path),\n [items, open],\n );\n const spy = useScrollSpy({ rootRef: scrollRef, ids: sectionIds });\n\n const setOpen = (path: string): void => {\n if (props.section === undefined) setUncontrolled(path);\n props.onSectionChange?.(path);\n // Optional-called: jsdom's elements have no `scrollTo`, and neither does\n // a pane that is not the scrolling box in some consumer's layout.\n scrollRef.current?.scrollTo?.({ top: 0 });\n };\n\n const group = root === null ? null : paneGroup(root, open, schema.name);\n\n return (\n <div className={[s.railLayout, className].filter(Boolean).join(' ')}>\n <PrefsRail\n items={items}\n section={open}\n current={spy.active}\n onOpen={setOpen}\n onScrollTo={spy.scrollTo}\n ariaLabel={schema.name}\n header={filterField}\n showCounts={query.trim() !== ''}\n />\n {group === null ? (\n <div className={s.pane}>\n <NoMatches query={query} onClear={onClearFilter} />\n </div>\n ) : (\n <PrefsPane ctx={ctx} group={group} path={open} scrollRef={scrollRef} />\n )}\n </div>\n );\n}\n\n/**\n * The group a rail path opens. The empty path is the root's loose leaves,\n * which belong to no group of their own and are handed back as one named for\n * the schema — the rail lists them under the same name.\n */\nfunction paneGroup(root: PrefGroup, path: string, rootName: string): PrefGroup | null {\n if (path === '') {\n const children = Object.fromEntries(\n Object.entries(root.children).filter(([, child]) => isPrefLeaf(child)),\n );\n return Object.keys(children).length === 0\n ? null\n : { ...root, name: rootName, children };\n }\n let node: PrefGroup | undefined;\n let cursor = root;\n for (const seg of path.split('.')) {\n const next = cursor.children[seg];\n if (next === undefined || isPrefLeaf(next)) return null;\n node = next;\n cursor = next;\n }\n return node ?? null;\n}\n\n/** What a filter matching nothing leaves behind. */\nfunction NoMatches({ query, onClear }: { query: string; onClear: () => void }) {\n return (\n <div className={s.noMatches}>\n <p>No settings match “{query.trim()}”.</p>\n <button type=\"button\" className={s.clearFilter} onClick={onClear}>\n Clear filter\n </button>\n </div>\n );\n}\n\nfunction GroupBody({ ctx, group, path, depth }: {\n ctx: WalkCtx;\n group: PrefGroup;\n path: string;\n depth: number;\n}) {\n return (\n <div className={depth === 0 ? s.panel : s.subpanel}>\n <div className={s.groupHeader}>\n <h3 className={s.groupTitle}>{group.name}</h3>\n {group.description !== undefined && (\n <p className={s.groupDesc}>{group.description}</p>\n )}\n </div>\n <div className={s.rows}>\n {Object.entries(group.children).map(([key, child]) => {\n const childPath = `${path}.${key}`;\n return isPrefLeaf(child) ? (\n <PrefRow key={key} ctx={ctx} path={childPath} pref={child} />\n ) : (\n <GroupBody key={key} ctx={ctx} group={child} path={childPath} depth={depth + 1} />\n );\n })}\n </div>\n </div>\n );\n}\n\n","import type { ReactNode } from 'react';\nimport { Dialog } from '../Dialog';\nimport { PrefsForm, type PrefsFormProps } from './PrefsForm';\nimport s from './Prefs.module.css';\n\n/**\n * Props for {@link PrefsDialog} — everything {@link PrefsForm} takes, plus\n * the dialog's own open state and chrome.\n */\nexport interface PrefsDialogProps extends PrefsFormProps {\n isOpen: boolean;\n onOpenChange: (open: boolean) => void;\n /** Dialog heading. Defaults to the schema root's `name`. */\n title?: ReactNode;\n /** Extra chrome rendered at the end of the title row (e.g. a dev-mode\n * \"Show hidden\" switch). An action the reader acts on when they are done\n * — resetting, importing — belongs in `footer` instead, where a dialog's\n * actions live. */\n headerExtra?: ReactNode;\n /** Footer slot, passed through to `Dialog` — typically a reset or done\n * action. */\n footer?: ReactNode;\n /** Class applied to the dialog's modal box. */\n dialogClassName?: string;\n}\n\n/**\n * The kit's preferences dialog: `Dialog` + `PrefsForm`. Changes apply\n * live through `onChange` — there is no OK/Cancel staging. For custom\n * placement (sidebar, popover, inline page), compose `PrefsForm`\n * directly; this wrapper is intentionally thin.\n *\n * `layout=\"rail\"` is what a dialog usually wants: the default columns wrap\n * sideways past two groups, and this box is 900px at its widest.\n */\nexport function PrefsDialog(props: PrefsDialogProps) {\n const { isOpen, onOpenChange, title, headerExtra, footer, dialogClassName, ...form } = props;\n const rail = form.layout === 'rail';\n return (\n <Dialog\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n aria-label={typeof title === 'string' ? title : form.schema.name}\n className={dialogClassName}\n footer={footer}\n bodyClassName={rail ? s.railBody : undefined}\n title={\n headerExtra !== undefined ? (\n <span className={s.titleRow}>\n <span>{title ?? form.schema.name}</span>\n {headerExtra}\n </span>\n ) : (\n title ?? form.schema.name\n )\n }\n >\n <PrefsForm {...form} />\n </Dialog>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport s from './Sidebar.module.css';\n\n/** Props for {@link Sidebar}. */\nexport interface SidebarProps {\n /**\n * Edge the sidebar docks to. Adds a class hook (`s.left` / `s.right`)\n * so consumers can target either edge for borders, shadows, etc.\n * Purely cosmetic — layout is the parent's job.\n */\n side?: 'left' | 'right';\n /**\n * Accessible label — rendered onto the `<aside>`. Without it, screen\n * readers fall back to \"complementary landmark,\" which is fine for\n * apps with a single sidebar but ambiguous when there's both a left\n * and a right.\n */\n ariaLabel?: string;\n children?: ReactNode;\n className?: string;\n /** Inline style — useful for width-as-custom-property handles or any\n * other one-off CSS property the consumer wants to set dynamically. */\n style?: CSSProperties;\n}\n\n/**\n * Generic sidebar shell — `<aside>` with column layout and token-driven\n * surface treatment. Width, sticky positioning, and resize handles stay\n * the consumer's concern (every app has its own layout grid); the kit\n * just provides the chrome.\n *\n * Pair with `<SidebarPanel>` for collapsible sections.\n */\nexport function Sidebar(props: SidebarProps) {\n const { side, ariaLabel, children, className, style } = props;\n const cls = [s.sidebar, side === 'left' && s.left, side === 'right' && s.right, className]\n .filter(Boolean).join(' ');\n return (\n <aside className={cls} aria-label={ariaLabel} style={style}>\n {children}\n </aside>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Focusable } from 'react-aria-components';\nimport { DisclosureMark } from '../Disclosure';\nimport { Tooltip, TooltipTrigger } from '../Tooltip';\nimport s from './SidebarPanel.module.css';\n\n/** Props for {@link SidebarPanel}. */\nexport interface SidebarPanelProps {\n /** Title rendered in the panel's header row. */\n title?: ReactNode;\n /**\n * Collapsed state — when true, only the header paints; the body is\n * omitted. Caller owns the state (typically via prefs) and flips it\n * back via `onToggleCollapse`.\n */\n collapsed?: boolean;\n /**\n * Click handler for the title row. When provided, the header renders\n * as a button (fold mark + label) and acts as the collapse toggle.\n * When omitted, the title is static text and the panel can't collapse.\n */\n onToggleCollapse?(): void;\n /**\n * Optional close handler — when provided, the header gains a `×`\n * button on the trailing edge. Caller flips its \"hidden\" state and\n * conditionally unmounts the panel from the parent.\n */\n onHide?(): void;\n children?: ReactNode;\n className?: string;\n}\n\n/**\n * Generic collapsible panel section for sidebars. Pure presentation —\n * caller manages `collapsed`/`hidden` state externally (the pattern is\n * to drive it from app prefs so the Preferences modal and inline\n * fold marks toggle the same map).\n *\n * Pair with `<Sidebar>` for the docked column layout.\n */\nexport function SidebarPanel(props: SidebarPanelProps) {\n const { title, collapsed, onToggleCollapse, onHide, children, className } = props;\n const cls = [s.panel, collapsed && s.collapsed, className].filter(Boolean).join(' ');\n const headerInteractive = onToggleCollapse !== undefined;\n return (\n <div className={cls}>\n {title !== undefined && (\n <div className={s.titleRow}>\n {headerInteractive ? (\n <button\n type=\"button\"\n className={`${s.titleButton} ${s.titleBox}`}\n onClick={onToggleCollapse}\n aria-expanded={!collapsed}\n >\n <DisclosureMark open={!collapsed} />\n <span className={s.title}>{title}</span>\n </button>\n ) : (\n <span className={`${s.title} ${s.titleBox}`}>{title}</span>\n )}\n {onHide !== undefined && (\n <TooltipTrigger>\n <Focusable>\n <button\n type=\"button\"\n className={s.hideButton}\n onClick={onHide}\n aria-label=\"Hide panel\"\n >\n ×\n </button>\n </Focusable>\n <Tooltip>Hide panel</Tooltip>\n </TooltipTrigger>\n )}\n </div>\n )}\n {!collapsed && <div className={s.body}>{children}</div>}\n </div>\n );\n}\n","import type { KeyboardEvent, ReactNode } from 'react';\nimport { Focusable } from 'react-aria-components';\nimport { Tooltip, TooltipTrigger } from '../Tooltip';\nimport s from './ToolButton.module.css';\n\n/** Props for {@link ToolButton}. */\nexport interface ToolButtonProps {\n /** Icon node (typically an SVG component). */\n icon: ReactNode;\n /** Human-readable label shown under the icon. */\n label: string;\n /** Optional shortcut hint (e.g. \"V\" or \"⌘Z\"). */\n shortcut?: string;\n /** Selected/active state — toggles the active visual treatment. */\n active?: boolean;\n /** Disabled state — passes through to the underlying button. */\n disabled?: boolean;\n /**\n * When true, sets `aria-disabled=\"true\"` on the button without using the\n * native `disabled` attribute. This keeps the button focusable and reachable\n * by keyboard (roving-tabindex still applies) while marking it as ineligible\n * to screen readers. The caller is responsible for making `onClick` a no-op.\n */\n ariaDisabled?: boolean;\n /**\n * Whether this button is the currently tabbable member of its toolbar.\n * Toolbars use roving tabindex: exactly one button has `tabIndex=0` at\n * a time; the rest are `-1`. Caller manages which.\n */\n tabbable?: boolean;\n /** Click handler. */\n onClick(): void;\n /** Key handler for the underlying button — a toolbar's roving-tabindex\n * navigation attaches here. */\n onKeyDown?(e: KeyboardEvent<HTMLElement>): void;\n /**\n * Tooltip content. Defaults to `label` (plus `shortcut` if provided).\n */\n title?: string;\n /** Additional class for the root button. */\n className?: string;\n}\n\n/**\n * Generic icon-+-label toolbar button — building block for `ToolPalette`\n * and similar surfaces. Headless about layout direction (parent group\n * supplies flex direction via `ToolGroup`). Theme via `--wzl-*` tokens.\n */\nexport function ToolButton(props: ToolButtonProps) {\n const {\n icon, label, shortcut, active, disabled, ariaDisabled, tabbable,\n onClick, onKeyDown, title, className,\n } = props;\n const resolvedTitle = title ?? (shortcut ? `${label} (${shortcut})` : label);\n const cls = [s.button, active && s.active, className].filter(Boolean).join(' ');\n return (\n <TooltipTrigger isDisabled={disabled}>\n <Focusable isDisabled={disabled}>\n <button\n type=\"button\"\n tabIndex={tabbable ? 0 : -1}\n className={cls}\n aria-current={active ? 'true' : undefined}\n aria-disabled={ariaDisabled ? 'true' : undefined}\n disabled={disabled}\n onClick={onClick}\n onKeyDown={onKeyDown}\n >\n <span className={s.icon} aria-hidden=\"true\">{icon}</span>\n <span className={s.label}>{label}</span>\n {shortcut && <span className={s.shortcut}>{shortcut}</span>}\n </button>\n </Focusable>\n <Tooltip>{resolvedTitle}</Tooltip>\n </TooltipTrigger>\n );\n}\n","import type { ReactNode } from 'react';\nimport s from './ToolGroup.module.css';\n\n/** Props for {@link ToolGroup}. */\nexport interface ToolGroupProps {\n children: ReactNode;\n /**\n * Lays children along an axis. `'vertical'` (default) stacks them in\n * a column; `'horizontal'` lays them in a row. Independent of the\n * parent toolbar's own orientation.\n */\n orientation?: 'vertical' | 'horizontal';\n /**\n * Optional `data-group` attribute — useful for parents that want to\n * select the group from CSS or tests by name.\n */\n groupKey?: string;\n /** Accessible name for the group (rendered as `aria-label`). */\n ariaLabel?: string;\n className?: string;\n}\n\n/**\n * Generic toolbar group — a `role=\"group\"` flex container that arranges\n * `<ToolButton>`s (or any children) along a chosen axis. No visual chrome\n * beyond layout; theming lives on the buttons.\n */\nexport function ToolGroup(props: ToolGroupProps) {\n const { children, orientation = 'vertical', groupKey, ariaLabel, className } = props;\n const cls = [s.group, orientation === 'horizontal' && s.horizontal, className]\n .filter(Boolean).join(' ');\n return (\n <div className={cls} role=\"group\" data-group={groupKey} aria-label={ariaLabel}>\n {children}\n </div>\n );\n}\n","/** The full vocabulary of capability tags shipped in the default preset.\n * Apps and other consumers can add their own tags; this list is what\n * `weasel-modes` itself uses. */\nexport const ALL_TAGS = [\n 'navigation',\n 'creates-selection',\n 'creates-paths',\n 'creates-shapes',\n 'creates-text',\n 'edits-anchors',\n 'edits-text',\n 'transforms-selection',\n 'samples-color',\n 'applies-fill',\n 'edits-page',\n] as const;\n\n/** One capability a tool or contribution declares, and a mode allows. Any\n * string is accepted so apps can add tags of their own; `ALL_TAGS` is the\n * set this package ships. */\nexport type CapabilityTag = (typeof ALL_TAGS)[number] | (string & {});\n\n/** Tags that are implicitly allowed in every mode — never listed per-mode.\n * A tool tagged with any of these is always eligible. */\nexport const IMPLICIT_TAGS: readonly CapabilityTag[] = ['navigation'];\n\n/** Whether a string is one of the shipped `ALL_TAGS`. An app-defined tag is\n * still a valid `CapabilityTag` and will answer `false` here. */\nexport function isCapabilityTag(value: string): value is CapabilityTag {\n return (ALL_TAGS as readonly string[]).includes(value);\n}\n","import { IMPLICIT_TAGS, type CapabilityTag } from './capabilities';\n\n/** How a mode tints the workspace — the area around the page — so the user\n * can see at a glance which mode is active. */\nexport interface WorkspaceVisual {\n tint?: string;\n gradient?: 'top-down' | 'bottom-up';\n intensity?: number;\n}\n\n/**\n * A mode: an app-level editing context that narrows which tools are usable and\n * how the workspace looks. Tools live inside modes; a tool is never \"in\" one.\n *\n * `kind` picks the lifecycle. A `soft` mode (path-edit, isolation, text-edit)\n * is a scoped context with no commit ceremony — every edit inside it is\n * independently undoable and `exit` is non-destructive. A `strict` mode\n * (free-transform, crop) is a transaction: the whole session collapses to one\n * undoable step and leaving requires an explicit `commit` or `cancel`.\n */\nexport interface ModeDefinition {\n id: string;\n /** Human-readable name for chrome — a breadcrumb, a status bar. Falls back\n * to `id`; read it through {@link modeLabel}. */\n label?: string;\n /** One sentence on what the mode is for, for a tooltip or a hint line. */\n description?: string;\n kind: 'soft' | 'strict';\n /** Capability tags this mode allows beyond IMPLICIT_TAGS. */\n allows: CapabilityTag[];\n /** When true, out-of-target objects dim at the renderer layer. */\n scoping: boolean;\n workspace?: WorkspaceVisual;\n entry?: { shortcut?: string; trigger?: 'double-click-target' };\n exit?: { shortcut?: string };\n commit?: { shortcut?: string };\n cancel?: { shortcut?: string };\n}\n\n/** A mode's display name: its `label`, else its `id`. */\nexport function modeLabel(mode: ModeDefinition): string {\n return mode.label ?? mode.id;\n}\n\n/** True iff a tool carrying `toolTags` is eligible for `mode`. */\nexport function eligibleForMode(mode: ModeDefinition, toolTags: readonly CapabilityTag[]): boolean {\n if (toolTags.length === 0) return false;\n const allowed = new Set<CapabilityTag>([...mode.allows, ...IMPLICIT_TAGS]);\n for (const t of toolTags) {\n if (allowed.has(t)) return true;\n }\n return false;\n}\n","import type { ModeRegistry } from './registry';\nimport type { CapabilityTag } from './capabilities';\nimport { eligibleForMode } from './modeDefinition';\n\n/** The part of a tool this package needs in order to judge eligibility: its\n * id and the capabilities it claims. Structural, so a real `ToolDef`\n * satisfies it without this package depending on the kit. */\nexport interface ToolLike {\n id: string;\n capabilities?: readonly CapabilityTag[];\n}\n\n/** True iff `tool` is usable in the registry's currently active mode. */\nexport function eligibleTool(reg: ModeRegistry, tool: ToolLike): boolean {\n return eligibleForMode(reg.current(), tool.capabilities ?? []);\n}\n\n/** True iff a contribution is usable in the registry's active mode. */\nexport function eligibleContribution(\n reg: ModeRegistry,\n entry: { id: string; eligibility?: { capabilities?: readonly CapabilityTag[] } },\n): boolean {\n return eligibleForMode(reg.current(), entry.eligibility?.capabilities ?? []);\n}\n","import { Fragment, type ReactNode } from 'react';\nimport { UnknownIcon } from '@weasel-js/core';\nimport type { AnyTool, ToolsApi } from '@weasel-js/core';\nimport { eligibleContribution, type ModeRegistry } from '@weasel-js/modes';\nimport { ToolButton } from '../ToolButton';\nimport { ToolGroup } from '../ToolGroup';\nimport { useRovingTabIndex } from '../../useRovingTabIndex';\nimport s from './ToolPalette.module.css';\nimport { formatShortcut, type ShortcutInput } from './formatShortcut';\n\nconst DEFAULT_GROUP_ORDER = ['select', 'shape', 'draw', 'type', 'view'] as const;\nconst MISC = 'misc';\n\nfunction partitionByGroup(list: AnyTool[]): Map<string, AnyTool[]> {\n const groups = new Map<string, AnyTool[]>();\n for (const tool of list) {\n const g = tool.presentation?.group ?? MISC;\n const bucket = groups.get(g) ?? [];\n bucket.push(tool);\n groups.set(g, bucket);\n }\n return groups;\n}\n\nfunction orderedGroupKeys(\n groups: Map<string, AnyTool[]>,\n groupOrder: readonly string[],\n): string[] {\n const seen = new Set(groups.keys());\n const ordered: string[] = [];\n for (const known of groupOrder) {\n if (seen.has(known)) {\n ordered.push(known);\n seen.delete(known);\n }\n }\n // Unknown groups in insertion order (Map preserves it), misc last.\n for (const key of groups.keys()) {\n if (seen.has(key) && key !== MISC) {\n ordered.push(key);\n seen.delete(key);\n }\n }\n if (seen.has(MISC)) ordered.push(MISC);\n return ordered;\n}\n\nfunction resolveIcon(tool: AnyTool): ReactNode {\n const rawIcon = tool.presentation?.icon;\n if (rawIcon == null) return <UnknownIcon />;\n if (typeof rawIcon === 'function') return rawIcon(undefined);\n return rawIcon;\n}\n\n/** Props for {@link ToolPalette}. */\nexport interface ToolPaletteProps {\n tools: ToolsApi;\n orientation?: 'vertical' | 'horizontal';\n className?: string;\n /** Derive the keyboard shortcut for a tool button from the action registry.\n * Called with the tool's id; return `undefined` to suppress a chip. When\n * omitted, falls back to `tool.keybinding` (legacy path). */\n lookupShortcut?: (toolId: string) => ShortcutInput | undefined;\n /**\n * Optional mode registry. When provided, tools whose\n * `eligibility.capabilities` do not match the current mode are rendered\n * greyed-out, aria-disabled, and their onClick is suppressed. When omitted,\n * all tools are treated as eligible (preserves existing behavior in\n * consumers that haven't wired a registry).\n */\n modeRegistry?: ModeRegistry;\n /**\n * Presentation-group display order. Groups not listed keep their registry\n * insertion order after the listed ones; `misc` always renders last.\n * Defaults to `['select', 'shape', 'draw', 'type', 'view']`.\n */\n groupOrder?: readonly string[];\n}\n\n/**\n * Toolbar of the registered tools, split into separator-divided groups by\n * each tool's presentation group and navigable by arrow keys. Clicking a\n * button makes that tool active.\n *\n * Given a `modeRegistry`, tools whose capabilities the current mode does not\n * allow render greyed out and inert rather than disappearing.\n */\nexport function ToolPalette(props: ToolPaletteProps) {\n const {\n tools, orientation = 'vertical', className, lookupShortcut, modeRegistry,\n groupOrder = DEFAULT_GROUP_ORDER,\n } = props;\n const list = Object.values(tools.registry);\n const groups = partitionByGroup(list);\n const groupKeys = orderedGroupKeys(groups, groupOrder);\n const cls = [s.palette, orientation === 'horizontal' && s.horizontal, className]\n .filter(Boolean).join(' ');\n\n // Flat, in DOM order — the roving-tabindex hook indexes by this order.\n const ordered = groupKeys.flatMap((k) => groups.get(k)!);\n const eligibility = ordered.map(\n (tool) => (modeRegistry ? eligibleContribution(modeRegistry, tool) : true),\n );\n const activeIndex = ordered.findIndex((t) => t.id === tools.active);\n const roving = useRovingTabIndex({\n items: eligibility.map((enabled) => ({ disabled: !enabled })),\n itemClassName: s.paletteBtn,\n // An ineligible active tool can't hold the tab stop; fall back to the\n // hook's first-enabled default.\n ...(activeIndex >= 0 && eligibility[activeIndex] ? { tabStopIndex: activeIndex } : {}),\n });\n let index = -1;\n\n return (\n <div\n ref={roving.rootRef}\n className={cls}\n role=\"toolbar\"\n aria-label=\"Tools\"\n >\n {groupKeys.map((key, i) => (\n <Fragment key={key}>\n {i > 0 && (\n <div\n className={s.separator}\n role=\"separator\"\n aria-orientation={orientation === 'horizontal' ? 'vertical' : 'horizontal'}\n />\n )}\n <ToolGroup orientation={orientation} groupKey={key}>\n {groups.get(key)!.map((tool) => {\n const i = ++index;\n const label = tool.presentation?.label ?? tool.id;\n const shortcut = tool.presentation?.shortcut\n ?? formatShortcut(lookupShortcut ? lookupShortcut(tool.id) : tool.keybinding);\n const enabled = eligibility[i];\n const modeName = modeRegistry ? modeRegistry.current().id : undefined;\n const resolvedTitle = !enabled && modeName\n ? `${label}${shortcut ? ` (${shortcut})` : ''} — disabled in ${modeName} mode`\n : undefined;\n return (\n <ToolButton\n key={tool.id}\n icon={resolveIcon(tool)}\n label={label}\n shortcut={shortcut}\n active={tools.active === tool.id}\n tabbable={roving.tabIndexFor(i) === 0}\n ariaDisabled={!enabled}\n className={[s.paletteBtn, !enabled && s.ineligibleBtn].filter(Boolean).join(' ')}\n title={resolvedTitle}\n onClick={enabled ? () => tools.setActive(tool.id) : () => {}}\n onKeyDown={roving.onKeyDown(i)}\n />\n );\n })}\n </ToolGroup>\n </Fragment>\n ))}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n Tabs as RACTabs,\n TabList as RACTabList,\n Tab as RACTab,\n TabPanel as RACTabPanel,\n type TabsProps as RACTabsProps,\n type TabListProps as RACTabListProps,\n type TabProps as RACTabProps,\n type TabPanelProps as RACTabPanelProps,\n} from 'react-aria-components';\nimport s from './Tabs.module.css';\n\n/** Props for {@link Tabs}, on top of React Aria's `Tabs` props. */\nexport type TabsProps = Omit<RACTabsProps, 'className' | 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/**\n * Tab set wrapping React Aria's Tabs, skinned against the `--wzl-*` tokens.\n * Holds a {@link TabList} and one {@link TabPanel} per tab.\n */\nexport function Tabs({ children, className, ...rest }: TabsProps) {\n return (\n <RACTabs {...rest} className={[s.tabs, className].filter(Boolean).join(' ')}>\n {children}\n </RACTabs>\n );\n}\n\n/** Props for {@link TabList}, on top of React Aria's `TabList` props. */\nexport type TabListProps<T extends object> = Omit<RACTabListProps<T>, 'className'> & {\n className?: string;\n};\n\n/** The row of tab buttons inside a {@link Tabs}. */\nexport function TabList<T extends object>({ className, ...rest }: TabListProps<T>) {\n return <RACTabList<T> {...rest} className={[s.list, className].filter(Boolean).join(' ')} />;\n}\n\n/** Props for {@link Tab}, on top of React Aria's `Tab` props. */\nexport type TabProps = Omit<RACTabProps, 'className' | 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/** One tab button. Its `id` selects the {@link TabPanel} it reveals. */\nexport function Tab({ children, className, ...rest }: TabProps) {\n return (\n <RACTab {...rest} className={[s.tab, className].filter(Boolean).join(' ')}>\n {children}\n </RACTab>\n );\n}\n\n/** Props for {@link TabPanel}, on top of React Aria's `TabPanel` props. */\nexport type TabPanelProps = Omit<RACTabPanelProps, 'className' | 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/** The content shown for the {@link Tab} whose `id` matches this panel's. */\nexport function TabPanel({ children, className, ...rest }: TabPanelProps) {\n return (\n <RACTabPanel {...rest} className={[s.panel, className].filter(Boolean).join(' ')}>\n {children}\n </RACTabPanel>\n );\n}\n","import type { ReactNode } from 'react';\nimport {\n Button as RACButton,\n Menu as RACMenu,\n MenuItem as RACMenuItem,\n MenuTrigger,\n Popover as RACPopover,\n} from 'react-aria-components';\nimport { useOverlayPortal, type OverlayPortalProps } from '../../overlays/portalHost';\nimport s from './MenuButton.module.css';\nimport { TriggerTooltip, segmentTooltipContent, type SegmentTooltipFields } from '../segmentTooltip';\n\n/** One row in a {@link MenuButton}'s list. */\nexport type MenuButtonItem<T extends string = string> = {\n value: T;\n label: ReactNode;\n isDisabled?: boolean;\n /** Plain-text form of `label`, for type-to-select and screen readers. A\n * string label supplies this itself. */\n textValue?: string;\n};\n\n/** Props for {@link MenuButton}. */\nexport type MenuButtonProps<T extends string = string> = {\n /** What the button says. It never changes to show a chosen row. */\n label: ReactNode;\n items: ReadonlyArray<MenuButtonItem<T>>;\n /** Fired with the value of the row chosen. */\n onAction: (value: T) => void;\n isDisabled?: boolean;\n className?: string;\n 'aria-label'?: string;\n} & SegmentTooltipFields & OverlayPortalProps;\n\n/**\n * A button that opens a list and acts on the row chosen — \"Add trial…\",\n * \"Load…\". Unlike a {@link Select} it holds no value, so it sizes to its own\n * label rather than to its widest row.\n *\n * `shortcut` adds a kit tooltip reading `Name (⌘N)`, named by `aria-label` or\n * a string `label`, as `Button` does; `tooltip` replaces that text.\n */\nexport function MenuButton<T extends string = string>({\n label,\n items,\n onAction,\n isDisabled,\n className,\n 'aria-label': ariaLabel,\n portalContainer,\n shortcut,\n tooltip,\n}: MenuButtonProps<T>) {\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n return (\n <MenuTrigger>\n {anchor}\n <TriggerTooltip\n content={segmentTooltipContent({ tooltip, shortcut, ariaLabel, label })}\n disabled={isDisabled}\n >\n <RACButton\n className={[s.trigger, className].filter(Boolean).join(' ')}\n isDisabled={isDisabled}\n aria-label={ariaLabel}\n >\n <span className={s.label}>{label}</span>\n <svg className={s.chevron} viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M2 4 L5 7 L8 4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </RACButton>\n </TriggerTooltip>\n {/* `data-weasel-overlay`: see Select — the list renders in a portal,\n outside the subtree the trigger sits in. */}\n <RACPopover className={s.popover} data-weasel-overlay=\"\" {...portalProps}>\n <RACMenu className={s.menu} onAction={(key) => onAction(key as T)}>\n {items.map((item) => (\n <RACMenuItem\n key={item.value}\n id={item.value}\n className={s.item}\n isDisabled={item.isDisabled}\n textValue={item.textValue ?? (typeof item.label === 'string' ? item.label : undefined)}\n >\n {item.label}\n </RACMenuItem>\n ))}\n </RACMenu>\n </RACPopover>\n </MenuTrigger>\n );\n}\n","import { Children, isValidElement, useContext, type KeyboardEvent, type ReactNode } from 'react';\nimport {\n ComboBox as RACComboBox,\n ComboBoxStateContext,\n Label,\n Input as RACInput,\n Button as RACButton,\n Popover as RACPopover,\n ListBox as RACListBox,\n ListBoxItem as RACListBoxItem,\n Text,\n FieldError,\n type ComboBoxProps as RACComboBoxProps,\n type ListBoxItemProps as RACListBoxItemProps,\n type ValidationResult,\n} from 'react-aria-components';\nimport { fieldClasses } from '../Field/Field';\nimport { useOverlayPortal, type OverlayPortalProps } from '../../overlays/portalHost';\nimport s from './ComboBox.module.css';\n\n/**\n * One option in a {@link ComboBox}'s `options` list. `textValue` is the\n * plain-text form used for filtering and screen readers, needed only when\n * `label` isn't a bare string.\n */\nexport type ComboBoxOption = {\n value: string;\n label: ReactNode;\n textValue?: string;\n isDisabled?: boolean;\n};\n\ntype Key = string | number;\n\n/**\n * How the typed text narrows the options.\n *\n * `'contains'` is a locale-aware substring match over each option's text.\n * `'none'` shows every option given — what a list a server already filtered\n * and ranked needs, since a second pass would drop rows that do not contain\n * the query and reorder whatever survived.\n */\nexport type ComboBoxFilter = 'contains' | 'none' | ((textValue: string, inputValue: string) => boolean);\n\n/** What the user committed: an option they picked, or text they typed. */\nexport type ComboBoxCommit<T extends Key = string> =\n | { source: 'option'; key: T }\n | { source: 'text'; text: string };\n\nconst admitEverything = () => true;\n\n/**\n * Props for {@link ComboBox}, on top of React Aria's `ComboBox` props, with\n * the selection key narrowed to the option value type.\n */\nexport type ComboBoxProps<T extends Key = string> = Omit<RACComboBoxProps<object>, 'children' | 'className' | 'selectedKey' | 'defaultSelectedKey' | 'onSelectionChange'> & {\n label?: ReactNode;\n description?: ReactNode;\n errorMessage?: ReactNode | ((v: ValidationResult) => ReactNode);\n placeholder?: string;\n options?: ReadonlyArray<ComboBoxOption & { value: T }>;\n children?: ReactNode;\n selectedKey?: T | null;\n defaultSelectedKey?: T;\n onSelectionChange?: (key: T | null) => void;\n emptyLabel?: ReactNode;\n /** Shown in place of `emptyLabel` while `loadError` is set. */\n errorLabel?: ReactNode;\n /**\n * How typed text narrows `options`. Defaults to `'contains'`. `'none'` also\n * keeps the popover open on an empty collection: a list the kit does not\n * filter can arrive empty from a server mid-query, and without that the\n * popover closes and `emptyLabel` is never seen.\n */\n filter?: ComboBoxFilter;\n /** Marks the options as out of date while the next set is being fetched. */\n isLoading?: boolean;\n /** A failed load, shown as `errorLabel` rather than as an empty corpus. */\n loadError?: unknown | null;\n /**\n * Fires when the user commits — Enter on the active option, a click on one,\n * or Enter on text matching none of them when `allowsCustomValue` is set.\n * Empty text commits nothing.\n */\n onCommit?: (commit: ComboBoxCommit<T>) => void;\n /**\n * `'fill'` (the default) takes the width of whatever row the combo box sits\n * in. `'fit'` sizes the input to its widest option, so it neither swallows a\n * toolbar's slack nor cuts a selection off once one is made.\n */\n width?: 'fill' | 'fit';\n className?: string;\n} & OverlayPortalProps;\n\n/**\n * Filterable single-select wrapping React Aria's ComboBox. The user can\n * type to filter; selection commits to `onSelectionChange`. When no value\n * is in the input, selection clears (key becomes null).\n */\nexport function ComboBox<T extends Key = string>(props: ComboBoxProps<T>) {\n const {\n label,\n description,\n errorMessage,\n placeholder,\n options,\n children,\n selectedKey,\n defaultSelectedKey,\n onSelectionChange,\n emptyLabel = 'No matches',\n errorLabel = \"Couldn't load options\",\n filter = 'contains',\n isLoading,\n loadError = null,\n onCommit,\n width = 'fill',\n className,\n portalContainer,\n ...rest\n } = props;\n\n const { anchor, portalProps } = useOverlayPortal(portalContainer);\n\n return (\n <RACComboBox\n {...rest}\n // 'contains' leaves this unset so React Aria uses its own locale-aware\n // match rather than a reimplementation of it.\n defaultFilter={filter === 'none' ? admitEverything : filter === 'contains' ? undefined : filter}\n allowsEmptyCollection={rest.allowsEmptyCollection ?? filter === 'none'}\n selectedKey={selectedKey}\n defaultSelectedKey={defaultSelectedKey}\n onSelectionChange={(k) => {\n onSelectionChange?.(k as T | null);\n if (k !== null) onCommit?.({ source: 'option', key: k as T });\n }}\n className={[s.field, width === 'fit' && s.fit, fieldClasses.root, className]\n .filter(Boolean)\n .join(' ')}\n >\n {anchor}\n {label !== undefined && <Label className={fieldClasses.label}>{label}</Label>}\n <ComboBoxFrame\n placeholder={placeholder}\n isLoading={isLoading}\n onCommitText={onCommit && ((text) => onCommit({ source: 'text', text }))}\n >\n {width === 'fit' && (\n <span className={s.sizer} aria-hidden=\"true\">\n {placeholder !== undefined && <span>{placeholder}</span>}\n {optionLabels(options, children).map((l, i) => (\n <span key={i}>{l}</span>\n ))}\n </span>\n )}\n </ComboBoxFrame>\n {description !== undefined && (\n <Text slot=\"description\" className={fieldClasses.hint}>\n {description}\n </Text>\n )}\n <FieldError className={fieldClasses.error}>{errorMessage}</FieldError>\n <RACPopover className={s.popover} data-weasel-overlay=\"\" {...portalProps}>\n <RACListBox\n className={s.listbox}\n renderEmptyState={() =>\n loadError !== null ? (\n <div className={s.error} role=\"alert\">{errorLabel}</div>\n ) : (\n <div className={s.empty}>{emptyLabel}</div>\n )\n }\n >\n {options !== undefined\n ? options.map((o) => (\n <ComboBoxItem key={String(o.value)} id={o.value} textValue={o.textValue} isDisabled={o.isDisabled}>\n {o.label}\n </ComboBoxItem>\n ))\n : children}\n </RACListBox>\n </RACPopover>\n </RACComboBox>\n );\n}\n\n/**\n * The input and its trigger. Split out so it can read `ComboBoxStateContext`,\n * which only exists below `RACComboBox`.\n */\nfunction ComboBoxFrame({\n placeholder,\n isLoading,\n onCommitText,\n children,\n}: {\n placeholder?: string;\n isLoading?: boolean;\n onCommitText?: (text: string) => void;\n children?: ReactNode;\n}) {\n const state = useContext(ComboBoxStateContext);\n\n // Capture, not bubble: React Aria's own Enter handler runs on the way up and\n // clears the focused key, so by then there is no way to tell an option\n // commit from a text one.\n const onKeyDownCapture = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key !== 'Enter' || e.nativeEvent.isComposing) return;\n if (state?.isOpen && state.selectionManager.focusedKey != null) return;\n const text = e.currentTarget.value;\n if (text !== '') onCommitText?.(text);\n };\n\n return (\n <div className={s.frame}>\n <RACInput\n placeholder={placeholder}\n aria-busy={isLoading || undefined}\n onKeyDownCapture={onCommitText ? onKeyDownCapture : undefined}\n />\n {children}\n <RACButton className={s.openButton} aria-label=\"Show options\">\n <svg viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M2 4 L5 7 L8 4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </RACButton>\n </div>\n );\n}\n\n/**\n * The labels a `width='fit'` input measures itself against. In the children\n * form the label sits one element deep, inside a `ComboBoxItem`.\n */\nfunction optionLabels(\n options: ReadonlyArray<ComboBoxOption> | undefined,\n children: ReactNode,\n): ReactNode[] {\n if (options !== undefined) return options.map((o) => o.label);\n return Children.toArray(children).map((c) =>\n isValidElement<{ children?: ReactNode }>(c) ? c.props.children : c,\n );\n}\n\n/** Props for {@link ComboBoxItem}, on top of React Aria's `ListBoxItem` props. */\nexport type ComboBoxItemProps = Omit<RACListBoxItemProps, 'className'> & {\n className?: string;\n};\n\n/** One row in a {@link ComboBox}'s filtered list. */\nexport function ComboBoxItem({ className, ...rest }: ComboBoxItemProps) {\n return <RACListBoxItem {...rest} className={[s.option, className].filter(Boolean).join(' ')} />;\n}\n","import type { ReactNode } from 'react';\nimport {\n Slider as RACSlider,\n SliderOutput,\n SliderTrack,\n SliderThumb,\n Label,\n type SliderProps as RACSliderProps,\n} from 'react-aria-components';\nimport s from './RangeSlider.module.css';\n\n/** Props for {@link RangeSlider}, on top of React Aria's `Slider` props. */\nexport type RangeSliderProps = Omit<RACSliderProps, 'children' | 'className'> & {\n label?: ReactNode;\n /** Show the current value next to the label. Defaults to true when a\n * label is supplied. */\n showOutput?: boolean;\n /** Format the rendered value(s). Useful for units (`v => `${v}%``). */\n formatOutput?: (v: number | number[]) => ReactNode;\n className?: string;\n};\n\n/**\n * Linear range slider on React Aria. Single-value by default; pass an array\n * to `value` / `defaultValue` for multi-thumb. Distinct from `Slider`, which\n * is fully controlled and gives each thumb its own bounds and readout.\n *\n * The root is a column flex container and the track stretches to it, so\n * `align-items` on the root or on a wrapper that replaces it governs the\n * *horizontal* axis here and collapses the track to its content width. Style\n * the wrapper around one, not the root.\n */\nexport function RangeSlider(props: RangeSliderProps) {\n const { label, showOutput, formatOutput, className, ...rest } = props;\n const wantOutput = showOutput ?? label !== undefined;\n return (\n <RACSlider {...rest} className={[s.slider, className].filter(Boolean).join(' ')}>\n {(label !== undefined || wantOutput) && (\n <div className={s.head}>\n {label !== undefined && <Label className={s.label}>{label}</Label>}\n {wantOutput && (\n <SliderOutput className={s.output}>\n {({ state }) => {\n const v = state.values.length === 1 ? state.values[0] : state.values;\n return formatOutput ? formatOutput(v) : Array.isArray(v) ? v.join(' – ') : String(v);\n }}\n </SliderOutput>\n )}\n </div>\n )}\n <SliderTrack className={s.track}>\n {({ state }) => {\n // Single-thumb: fill from start to thumb. Multi-thumb: fill\n // between adjacent thumbs (simplest = between first and last).\n const fillStart = state.values.length > 1 ? state.getThumbPercent(0) * 100 : 0;\n const fillEnd = state.getThumbPercent(state.values.length - 1) * 100;\n return (\n <>\n <div\n className={s.fill}\n style={{ left: `${fillStart}%`, right: `${100 - fillEnd}%` }}\n />\n {state.values.map((_, i) => (\n <SliderThumb key={i} index={i} className={s.thumb} />\n ))}\n </>\n );\n }}\n </SliderTrack>\n </RACSlider>\n );\n}\n","import { useCallback, useEffect, useId, useRef, type ReactNode, type RefObject } from 'react';\nimport { createPortal } from 'react-dom';\nimport {\n DialogTrigger,\n Popover as RACPopover,\n OverlayArrow,\n Dialog as RACDialog,\n Heading,\n type PopoverProps as RACPopoverProps,\n} from 'react-aria-components';\nimport { useOverlayPortal, type OverlayPortalProps, type WithoutPortalTarget } from '../../overlays/portalHost';\nimport { type StanceProps, useStance } from '../stance';\nimport s from './Callout.module.css';\n\n/**\n * Composition wrapper for press-to-open callouts:\n * `<CalloutTrigger><Pressable>…</Pressable><Callout>…</Callout></CalloutTrigger>`.\n * Re-exported RAC DialogTrigger — non-RAC trigger elements must be wrapped\n * in `<Pressable>` from react-aria-components.\n * In composed mode, put `defaultOpen` on `CalloutTrigger`, not `Callout` —\n * RAC detaches to local open state on the trigger, not the popover.\n */\nexport { DialogTrigger as CalloutTrigger };\n\n/** Props for {@link Callout}, on top of React Aria's `Popover` props. */\nexport type CalloutProps = Omit<\n WithoutPortalTarget<RACPopoverProps>,\n 'children' | 'className' | 'isNonModal' | 'triggerRef'\n> &\n OverlayPortalProps &\n StanceProps & {\n children?: ReactNode;\n className?: string;\n /** Optional heading rendered above the body. */\n title?: ReactNode;\n /** Footer slot — typically action buttons. */\n footer?: ReactNode;\n /**\n * `true` — blocks interaction with the rest of the app until dismissed;\n * inner dialog is `role=\"alertdialog\"`. `false` (default) — non-blocking:\n * the app stays interactive; Esc / outside click / close button dismiss.\n */\n modal?: boolean;\n /**\n * Show the × button. Defaults to `!modal`. In programmatic\n * `triggerRef`/`anchorRect` modes the close button needs controlled open\n * (`isOpen` + `onOpenChange`); with only `defaultOpen` it has no open-state\n * setter to call and cannot close.\n */\n showCloseButton?: boolean;\n /**\n * The user asked for this callout to go away — the × button or Escape.\n *\n * Distinct from `onOpenChange`, which a non-modal popover *also* fires when\n * interaction or focus merely leaves it. On a canvas that's every click on\n * the artwork, so a consumer that pins `isOpen` and treats `onOpenChange`\n * as dismissal retires messages nobody read. Use this instead: it fires\n * only on a deliberate act, and never on incidental focus loss.\n */\n onDismiss?: () => void;\n /** Anchor to an arbitrary element (programmatic use, with `isOpen`). */\n triggerRef?: RefObject<Element | null>;\n /**\n * Anchor to a client-coordinate rect — e.g. a scene node's on-screen box.\n * The callout re-anchors whenever this rect changes, so a consumer that\n * recomputes it on pan, zoom, or scene edits keeps the arrow on its target.\n * Takes precedence over `triggerRef`.\n */\n anchorRect?: { x: number; y: number; width: number; height: number };\n };\n\n/**\n * Anchored callout with an arrow pointing at its source — a trigger\n * element, an arbitrary `triggerRef`, or a client-space `anchorRect`.\n * Wraps React Aria Popover + Dialog; positioning, collision flipping,\n * dismissal, and focus behavior come from the underlying primitives.\n */\nexport function Callout(props: CalloutProps) {\n const {\n children,\n className,\n title,\n footer,\n stance = 'notice',\n tone,\n modal = false,\n showCloseButton,\n onDismiss,\n triggerRef,\n anchorRect,\n placement = 'top',\n offset = 12,\n maxHeight = 400,\n onOpenChange,\n shouldCloseOnInteractOutside,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledby,\n portalContainer,\n ...rest\n } = props;\n const anchorRef = useRef<HTMLSpanElement>(null);\n const stanced = useStance({ stance, tone });\n const { anchor: portalAnchor, portalProps } = useOverlayPortal(portalContainer);\n const showClose = showCloseButton ?? !modal;\n // Escape is a dismissal like the × is. It can't ride on a React `onKeyDown`:\n // RAC's Dialog runs its props through filterDOMProps, which drops handlers\n // it doesn't know, so the listener goes on the section itself. RAC's own\n // Escape handling is untouched — this only adds the signal.\n const onDismissRef = useRef(onDismiss);\n onDismissRef.current = onDismiss;\n const escapeListener = useRef((e: KeyboardEvent) => {\n if (e.key === 'Escape') onDismissRef.current?.();\n });\n const listeningTo = useRef<HTMLElement | null>(null);\n const dialogRef = useCallback((node: HTMLElement | null) => {\n listeningTo.current?.removeEventListener('keydown', escapeListener.current);\n listeningTo.current = node;\n node?.addEventListener('keydown', escapeListener.current);\n }, []);\n const titleId = useId();\n // RAC positions on open and recomputes on scroll, resize, and a\n // ResizeObserver on the anchor — none of which fire when `anchorRect` is\n // merely *translated*, as it is when a consumer tracks a scene node across a\n // pan. (Zoom happens to work, since scaling also changes the anchor's size.)\n // Nudging RAC's own resize listener is the supported way to make it\n // recompute; there's no public updatePosition on Popover.\n const hasAnchorRect = anchorRect !== undefined;\n useEffect(() => {\n if (!hasAnchorRect || typeof window === 'undefined') return;\n window.dispatchEvent(new Event('resize'));\n }, [hasAnchorRect, anchorRect?.x, anchorRect?.y, anchorRect?.width, anchorRect?.height]);\n // RAC's popover role-heuristic misses alertdialog; label the outer role\n // it stamps. Upstream: react-spectrum Popover.mjs querySelector('[role=dialog]').\n const popoverAriaLabelledby =\n modal && title !== undefined ? titleId : ariaLabelledby;\n const popoverAriaLabel = modal ? ariaLabel : undefined;\n return (\n <>\n {portalAnchor}\n {/* Harmless while closed — RAC reads the ref only when the popover is open. */}\n {anchorRect !== undefined &&\n createPortal(\n <span\n ref={anchorRef}\n data-callout-anchor=\"\"\n className={s.anchor}\n aria-hidden=\"true\"\n // Dynamic geometry — inline style is the mechanism here, not styling.\n style={{\n left: anchorRect.x,\n top: anchorRect.y,\n width: anchorRect.width,\n height: anchorRect.height,\n }}\n />,\n document.body,\n )}\n <RACPopover\n {...rest}\n triggerRef={anchorRect !== undefined ? anchorRef : triggerRef}\n isNonModal={!modal}\n placement={placement}\n offset={offset}\n maxHeight={maxHeight}\n onOpenChange={onOpenChange}\n shouldCloseOnInteractOutside={\n shouldCloseOnInteractOutside ?? (modal ? () => false : undefined)\n }\n aria-label={popoverAriaLabel}\n aria-labelledby={popoverAriaLabelledby}\n className={[s.popover, className].filter(Boolean).join(' ')}\n {...stanced}\n data-weasel-overlay=\"\"\n {...portalProps}\n >\n <OverlayArrow className={s.arrow}>\n <svg width={12} height={12} viewBox=\"0 0 12 12\" aria-hidden=\"true\">\n <path d=\"M0 0 L6 6 L12 0\" />\n </svg>\n </OverlayArrow>\n <RACDialog\n role={modal ? 'alertdialog' : 'dialog'}\n className={s.dialog}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledby}\n ref={dialogRef}\n >\n {({ close }) => (\n <>\n {(title !== undefined || showClose) && (\n <header className={s.header}>\n {title !== undefined && (\n <Heading id={titleId} slot=\"title\" className={s.title}>\n {title}\n </Heading>\n )}\n {showClose && (\n <button\n type=\"button\"\n className={s.close}\n onClick={() => {\n // `close()` resolves OverlayTriggerStateContext, only\n // provided by DialogTrigger (composed mode). In\n // triggerRef/anchorRect modes there is no such\n // context, so `close()` is a no-op there — the\n // controlled-open fallback below does the work.\n close();\n onOpenChange?.(false);\n onDismiss?.();\n }}\n aria-label=\"Close callout\"\n >\n ×\n </button>\n )}\n </header>\n )}\n <div className={s.body}>{children}</div>\n {footer !== undefined && <footer className={s.footer}>{footer}</footer>}\n </>\n )}\n </RACDialog>\n </RACPopover>\n </>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport {\n CurveEditor,\n type AnchorRenderProps,\n type ControlPoint,\n type CurveEditorProps,\n} from '../CurveEditor';\nimport type { GridSettings, AxesSettings, TickSettings } from '../Plot2D';\n\n/** Props for {@link PointPlotter}. */\nexport interface PointPlotterProps {\n /** Plotted points; caller-owned. */\n value: readonly ControlPoint[];\n /** Fires every frame during drag with the live in-flight value. */\n onInput: (next: ControlPoint[]) => void;\n /** Fires once per discrete user action (drag-end, add, delete) with\n * the new value and the value at gesture start. Wire history here. */\n onChange?: (next: ControlPoint[], prev: readonly ControlPoint[]) => void;\n /** Model-space x range. Default [0, 1]. */\n xRange?: readonly [number, number];\n /** Model-space y range. Default [0, 1]. */\n yRange?: readonly [number, number];\n width: number;\n height: number;\n grid?: GridSettings | false | null;\n axes?: AxesSettings | false | null;\n xTicks?: TickSettings | false | null;\n yTicks?: TickSettings | false | null;\n /** Minimum allowed point count. User-initiated deletion is refused\n * while `value.length <= minPoints`. */\n minPoints?: number;\n /** Maximum allowed point count. User-initiated insertion is refused\n * while `value.length >= maxPoints`. */\n maxPoints?: number;\n /** How new points are added. Default `'click-empty'`. Set to `'never'`\n * to disable insertion entirely. */\n addPointMode?: 'click-empty' | 'never';\n /** Built-in undo/redo via keyboard when the component has focus.\n * Default `true`. See `CurveEditor.history` for details. */\n history?: boolean;\n /** Custom per-anchor renderer. See `CurveEditor.renderAnchor`. */\n renderAnchor?: (info: AnchorRenderProps) => ReactNode;\n /** Extra SVG content beneath the anchors. See `CurveEditor.decorations`. */\n decorations?: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * 2D point plotter — a CurveEditor with the curve hidden. Anchors,\n * drag, shift+click delete, right-click delete, and click-empty insert\n * are inherited from CurveEditor verbatim, so the two components share\n * gesture semantics and stay in sync as CurveEditor evolves.\n *\n * Differences from CurveEditor: no curve `<path>` drawn, no fill, no\n * endpoint pinning, no interpolation, default `addPointMode` is\n * `'click-empty'` (CurveEditor defaults to `'click-curve'`, which\n * doesn't make sense without a curve to hit-test against).\n */\nexport function PointPlotter(props: PointPlotterProps) {\n const curveProps: CurveEditorProps = {\n ...props,\n addPointMode: props.addPointMode ?? 'click-empty',\n curve: false,\n fill: false,\n endpoints: 'free',\n };\n return <CurveEditor {...curveProps} />;\n}\n","const HEX = /^#(?:[\\da-f]{3,4}|[\\da-f]{6}|[\\da-f]{8})$/i;\nconst RGB = /^rgba?\\(\\s*(\\d{1,3})[\\s,]+(\\d{1,3})[\\s,]+(\\d{1,3})\\b/i;\nconst COLOR_FUNCTION = /^(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch|color|color-mix)\\(.+\\)$/i;\nconst KEYWORDS = new Set([\n 'transparent',\n 'currentcolor',\n 'black',\n 'white',\n 'gray',\n 'silver',\n 'red',\n 'orange',\n 'yellow',\n 'gold',\n 'lime',\n 'green',\n 'teal',\n 'cyan',\n 'blue',\n 'navy',\n 'purple',\n 'magenta',\n 'pink',\n 'brown',\n]);\n\ntype Supports = ((value: string) => boolean) | null;\n\nfunction browserSupports(): Supports {\n return typeof CSS !== 'undefined' && typeof CSS.supports === 'function'\n ? (value) => CSS.supports('color', value)\n : null;\n}\n\n/** Whether `value` is a CSS color — the browser's answer where it has `CSS.supports`, a small parser's otherwise. */\nexport function parsesAsColor(value: string, supports: Supports = browserSupports()): boolean {\n const v = value.trim();\n // `CSS.supports` accepts any `var()` for any property.\n if (!v || v.includes('var(')) return false;\n if (supports) return supports(v);\n return HEX.test(v) || COLOR_FUNCTION.test(v) || KEYWORDS.has(v.toLowerCase());\n}\n\nfunction hexOf(v: string): string | null {\n if (HEX.test(v)) {\n const digits = v.slice(1).toLowerCase();\n return `#${digits.length <= 4 ? [...digits.slice(0, 3)].map((d) => d + d).join('') : digits.slice(0, 6)}`;\n }\n const rgb = RGB.exec(v);\n return rgb\n ? `#${rgb\n .slice(1, 4)\n .map((n) => Math.min(255, Number(n)).toString(16).padStart(2, '0'))\n .join('')}`\n : null;\n}\n\nlet paint: CanvasRenderingContext2D | null | undefined;\n\n/** The browser's serialization of a color, through a canvas fill style; null where it has none or rejects `value`. */\nfunction serialized(value: string): string | null {\n if (paint === undefined) {\n try {\n paint = document.createElement('canvas').getContext('2d');\n } catch {\n paint = null;\n }\n }\n if (!paint) return null;\n // A rejected value leaves the previous fill style, so two different ones tell a rejection apart.\n paint.fillStyle = '#000000';\n paint.fillStyle = value;\n const onBlack = String(paint.fillStyle);\n paint.fillStyle = '#ffffff';\n paint.fillStyle = value;\n return onBlack === String(paint.fillStyle) ? onBlack : null;\n}\n\n/** `value` as the `#rrggbb` a color input takes, alpha dropped; null when it cannot be converted. */\nexport function toHex(value: string): string | null {\n const v = value.trim();\n const direct = hexOf(v);\n if (direct) return direct;\n const browser = typeof document === 'undefined' ? null : serialized(v);\n return browser && browser !== v ? hexOf(browser) : null;\n}\n","import { parsesAsColor } from './color';\n\n/** A design token as `TokenPanel` edits it. */\nexport interface TokenEntry {\n /** The custom property, e.g. `--wzl-gray-50`. */\n name: string;\n /** A DTCG type name. A type the panel has no control for edits as text. */\n type: string;\n /** Tokens sharing a group sit together; a color group large enough draws as one row of swatches. */\n group: string;\n value: string;\n /** Whether `value` overrides the token's own, which offers Reset. */\n overridden?: boolean;\n description?: string;\n}\n\n/** How a scale's steps follow from its base: one multiplier per step, a constant ratio, or a constant step. */\nexport type TokenScaleRule =\n | { kind: 'factors'; factors: readonly number[] }\n | { kind: 'ratio'; ratio: number }\n | { kind: 'step'; step: number };\n\n/** A group whose steps are generated from a base, so the panel edits the base and the rule rather than each step. */\nexport interface TokenScale {\n /** The generated tokens, smallest first. Anything else in the group draws as an ordinary step. */\n tokens: readonly string[];\n base: number;\n rule: TokenScaleRule;\n}\n\nconst round2 = (n: number) => Math.round(n * 100) / 100;\n\n/**\n * The same scale under another rule, fitted to the amounts its steps have now.\n * A ratio or step counts from the first step, so switching to one moves the\n * base there.\n */\nexport function refitScale(scale: TokenScale, kind: TokenScaleRule['kind'], amounts: readonly number[]): TokenScale {\n const first = amounts[0] ?? scale.base;\n const last = amounts.at(-1) ?? first;\n const spans = Math.max(1, amounts.length - 1);\n switch (kind) {\n case 'factors':\n return { ...scale, rule: { kind, factors: amounts.map((a) => (scale.base ? round2(a / scale.base) : 1)) } };\n case 'ratio':\n return { ...scale, base: first, rule: { kind, ratio: first > 0 ? round2((last / first) ** (1 / spans)) : 1 } };\n case 'step':\n return { ...scale, base: first, rule: { kind, step: round2((last - first) / spans) } };\n }\n}\n\nexport type TokenCategory = 'color' | 'type' | 'size' | 'motion' | 'depth' | 'other';\n\n/** The panel's sections, in the order it draws them. */\nexport const TOKEN_CATEGORIES: readonly { id: TokenCategory; title: string }[] = [\n { id: 'color', title: 'Color' },\n { id: 'type', title: 'Type' },\n { id: 'size', title: 'Size' },\n { id: 'motion', title: 'Motion' },\n { id: 'depth', title: 'Depth' },\n { id: 'other', title: 'Other' },\n];\n\nconst TYPE_SCALE = /^(?:font|tracking|leading|letter|line-height)/;\n\n/** The section a token is filed under: by its type, and for a bare dimension or number by its group. */\nexport function tokenCategory(token: TokenEntry): TokenCategory {\n switch (token.type) {\n case 'color':\n return 'color';\n case 'fontFamily':\n case 'fontWeight':\n return 'type';\n case 'duration':\n case 'cubicBezier':\n return 'motion';\n case 'shadow':\n case 'gradient':\n return 'depth';\n case 'dimension':\n case 'number':\n if (TYPE_SCALE.test(token.group)) return 'type';\n if (token.type === 'number' && (token.group === 'z' || token.group === 'z-index')) return 'depth';\n return 'size';\n default:\n return 'other';\n }\n}\n\nconst AMOUNT = String.raw`-?(?:\\d+\\.?\\d*|\\.\\d+)`;\nconst DIMENSION = new RegExp(\n `^${AMOUNT}(?:px|rem|em|%|ch|ex|lh|rlh|vh|vw|vmin|vmax|svh|lvh|dvh|cqw|cqh|pt|pc|cm|mm|in|q)$`,\n 'i',\n);\nconst DURATION = new RegExp(`^${AMOUNT}m?s$`);\nconst NUMBER = new RegExp(`^${AMOUNT}$`);\nconst LENGTH = new RegExp(`^${AMOUNT}(?:px|rem|em)?$`);\nconst BEZIER = new RegExp(`^cubic-bezier\\\\(\\\\s*(${AMOUNT})\\\\s*,\\\\s*(${AMOUNT})\\\\s*,\\\\s*(${AMOUNT})\\\\s*,\\\\s*(${AMOUNT})\\\\s*\\\\)$`, 'i');\nconst GRADIENT = /^(?:repeating-)?(?:linear|radial|conic)-gradient\\(/i;\n/** Commas outside parentheses: a shadow's layers, not a color function's arguments. */\nconst LAYERS = /,(?![^(]*\\))/;\nconst PARTS = /[a-z-]+\\([^)]*\\)|\\S+/gi;\n\nfunction isShadow(value: string): boolean {\n return value.split(LAYERS).every((layer) => {\n const parts = layer.trim().replace(/^inset\\s+/i, '').match(PARTS) ?? [];\n const lengths = parts.filter((part) => LENGTH.test(part));\n const rest = parts.filter((part) => !LENGTH.test(part));\n return lengths.length >= 2 && lengths.length <= 4 && rest.length <= 1 && rest.every((part) => parsesAsColor(part));\n });\n}\n\n/** A DTCG type read off the shape of a value, for a token that arrives without one. `'string'` when nothing fits. */\nexport function inferTokenType(value: string): string {\n const v = value.trim();\n if (!v) return 'string';\n if (DURATION.test(v)) return 'duration';\n if (DIMENSION.test(v)) return 'dimension';\n if (NUMBER.test(v)) return 'number';\n if (BEZIER.test(v)) return 'cubicBezier';\n if (GRADIENT.test(v)) return 'gradient';\n if (parsesAsColor(v)) return 'color';\n if (isShadow(v)) return 'shadow';\n return 'string';\n}\n\n/** A number and its unit, or null for a value that is not one. */\nexport function splitUnit(value: string): { amount: number; unit: string } | null {\n const match = new RegExp(`^(${AMOUNT})([a-z%]*)$`, 'i').exec(value.trim());\n return match ? { amount: Number(match[1]), unit: match[2] ?? '' } : null;\n}\n\n/** The four control points of a `cubic-bezier()`, or null for any other easing. */\nexport function bezierPoints(value: string): readonly [number, number, number, number] | null {\n const match = BEZIER.exec(value.trim());\n if (!match) return null;\n const [x1, y1, x2, y2] = match.slice(1, 5).map(Number) as [number, number, number, number];\n return [x1, y1, x2, y2];\n}\n","import { type CSSProperties, memo, useCallback, useMemo, useState } from 'react';\nimport { Focusable } from 'react-aria-components';\nimport { Button } from '../Button';\nimport { DisclosureRow } from '../Disclosure';\nimport { Input } from '../Input';\nimport { NumberField } from '../NumberField';\nimport { Select } from '../Select';\nimport { ToggleBar, type ToggleBarItem } from '../ToggleBar';\nimport { Tooltip, TooltipTrigger } from '../Tooltip';\nimport { toHex } from './color';\nimport s from './TokenPanel.module.css';\nimport {\n bezierPoints,\n refitScale,\n splitUnit,\n TOKEN_CATEGORIES,\n type TokenCategory,\n type TokenEntry,\n type TokenScale,\n type TokenScaleRule,\n tokenCategory,\n} from './tokenTypes';\n\ntype OnChange = (name: string, value: string | null) => void;\n\n/** Props for `<TokenPanel>`. */\nexport interface TokenPanelProps {\n tokens: readonly TokenEntry[];\n /** A token's new value, or null to drop its override. Keep it stable: rows re-render only when it or their token changes. */\n onChange: OnChange;\n /** Sections held closed, by category. Omit to let the panel keep that state itself. */\n collapsed?: Readonly<Partial<Record<TokenCategory, boolean>>>;\n onCollapsedChange?: (category: TokenCategory, collapsed: boolean) => void;\n /** Groups generated from a base, by group name. Such a group edits its base and rule above its steps. */\n scales?: Readonly<Record<string, TokenScale>>;\n /** A scale's new base or rule. The panel does not regenerate the steps; the consumer does, through `onChange`. */\n onScaleChange?: (group: string, scale: TokenScale) => void;\n /** Files a token under a section. Defaults to `tokenCategory`. */\n categorize?: (token: TokenEntry) => TokenCategory;\n /** The fewest colors, or sizes, sharing a group that draw as one row of swatches or one grid of steps. Default 3. */\n familySize?: number;\n /**\n * Row layout. `tight` puts a token on one line — name, control, Reset — with the\n * names on a fixed rail so the values read down the panel as a column, and caps\n * the field rather than letting it span the panel. Default `normal` stacks the\n * control under its name.\n */\n density?: 'tight' | 'normal';\n className?: string;\n}\n\nconst WEIGHTS = ['100', '200', '300', '400', '500', '600', '700', '800', '900'];\nconst NUMBER_FORMAT = { maximumFractionDigits: 4, useGrouping: false } as const;\n\ntype FamilyKind = 'family' | 'scale';\ntype Item = { kind: 'row'; token: TokenEntry } | { kind: FamilyKind; group: string; tokens: TokenEntry[] };\n\nconst SCALAR = new Set(['dimension', 'duration', 'number']);\n\nfunction familyKindOf(token: TokenEntry): FamilyKind | null {\n if (token.type === 'color') return 'family';\n return SCALAR.has(token.type) && splitUnit(token.value) ? 'scale' : null;\n}\n\nfunction itemsOf(tokens: readonly TokenEntry[], familySize: number): Item[] {\n const counts = new Map<string, number>();\n for (const token of tokens) {\n const kind = familyKindOf(token);\n if (kind) counts.set(`${kind}:${token.group}`, (counts.get(`${kind}:${token.group}`) ?? 0) + 1);\n }\n const families = new Map<string, Extract<Item, { kind: FamilyKind }>>();\n const items: Item[] = [];\n for (const token of tokens) {\n const kind = familyKindOf(token);\n const key = `${kind}:${token.group}`;\n if (!kind || (counts.get(key) ?? 0) < familySize) {\n items.push({ kind: 'row', token });\n continue;\n }\n let family = families.get(key);\n if (!family) {\n family = { kind, group: token.group, tokens: [] };\n families.set(key, family);\n items.push(family);\n }\n family.tokens.push(token);\n }\n return items;\n}\n\n/** Each name's segments past those every name in the set shares; a name that is all shared keeps its last. */\nfunction stepLabels(names: readonly string[]): string[] {\n const split = names.map((name) => name.replace(/^--/, '').split('-'));\n let shared = 0;\n while (split.every((segments) => segments.length > shared && segments[shared] === split[0]?.[shared])) shared++;\n return split.map((segments) => segments.slice(shared).join('-') || (segments.at(-1) ?? ''));\n}\n\nfunction Curve({ points, label }: { points: readonly [number, number, number, number]; label: string }) {\n const [x1, y1, x2, y2] = points;\n // y is flipped so the curve rises, and the box grows to hold an overshoot.\n const top = Math.min(0, 1 - y1, 1 - y2);\n const bottom = Math.max(1, 1 - y1, 1 - y2);\n return (\n <svg className={s.curve} viewBox={`-0.1 ${top - 0.1} 1.2 ${bottom - top + 0.2}`} role=\"img\" aria-label={label}>\n <path d={`M0 1 C${x1} ${1 - y1} ${x2} ${1 - y2} 1 0`} fill=\"none\" stroke=\"currentColor\" strokeWidth={0.08} />\n </svg>\n );\n}\n\nfunction TokenControl({ token, set }: { token: TokenEntry; set: (value: string) => void }) {\n const { name, type, value } = token;\n const label = `${name} value`;\n const hex = useMemo(() => (type === 'color' ? toHex(value) : null), [type, value]);\n\n if (type === 'dimension' || type === 'duration' || type === 'number') {\n const split = splitUnit(value);\n if (split) {\n return (\n <>\n <NumberField\n className={s.number}\n aria-label={label}\n value={split.amount}\n hideSteppers\n formatOptions={NUMBER_FORMAT}\n onChange={(amount) => {\n if (Number.isFinite(amount)) set(`${amount}${split.unit}`);\n }}\n />\n {split.unit ? <span className={s.unit}>{split.unit}</span> : null}\n </>\n );\n }\n }\n\n if (type === 'fontWeight') {\n const options = (WEIGHTS.includes(value) ? WEIGHTS : [...WEIGHTS, value]).map((weight) => ({\n value: weight,\n label: weight,\n }));\n return <Select aria-label={name} width=\"fit\" selectedKey={value} options={options} onSelectionChange={set} />;\n }\n\n const points = type === 'cubicBezier' ? bezierPoints(value) : null;\n return (\n <>\n {points ? <Curve points={points} label={`${name} curve`} /> : null}\n <Input\n className={s.field}\n aria-label={label}\n value={value}\n onChange={set}\n leadingAdornment={\n type !== 'color' ? undefined : hex ? (\n <input\n type=\"color\"\n className={s.swatchInput}\n aria-label={`${name} color`}\n value={hex}\n onChange={(event) => set(event.target.value)}\n />\n ) : (\n <span className={s.chip} style={{ '--token-color': value } as CSSProperties} aria-hidden=\"true\" />\n )\n }\n />\n </>\n );\n}\n\nconst TokenRow = memo(\n function TokenRow({ token, onChange }: { token: TokenEntry; onChange: OnChange }) {\n const set = useCallback((value: string) => onChange(token.name, value), [onChange, token.name]);\n return (\n <div className={s.row} role=\"group\" aria-label={token.name}>\n <span className={s.name} title={token.description || token.name}>\n {token.name}\n </span>\n <div className={s.edit}>\n <TokenControl token={token} set={set} />\n {token.overridden ? (\n <Button variant=\"ghost\" size=\"sm\" ariaLabel={`Reset ${token.name}`} onClick={() => onChange(token.name, null)}>\n Reset\n </Button>\n ) : null}\n </div>\n </div>\n );\n },\n // Consumers rebuild their entries each render; a row only has to redraw when what it shows changed.\n (a, b) =>\n a.onChange === b.onChange &&\n a.token.name === b.token.name &&\n a.token.type === b.token.type &&\n a.token.value === b.token.value &&\n a.token.overridden === b.token.overridden &&\n a.token.description === b.token.description,\n);\n\nfunction Family({ group, tokens, onChange }: { group: string; tokens: readonly TokenEntry[]; onChange: OnChange }) {\n const [picked, setPicked] = useState<string | null>(null);\n const token = tokens.find((t) => t.name === picked) ?? null;\n return (\n <div className={s.family} role=\"group\" aria-label={group}>\n <span className={s.name}>{group}</span>\n <div className={s.strip}>\n {tokens.map((t) => (\n <TooltipTrigger key={t.name} delay={0}>\n <Focusable>\n <button\n type=\"button\"\n className={s.swatch}\n style={{ '--token-color': t.value } as CSSProperties}\n aria-label={t.name}\n aria-pressed={t.name === picked}\n data-overridden={t.overridden ? '' : undefined}\n onClick={() => setPicked((current) => (current === t.name ? null : t.name))}\n />\n </Focusable>\n <Tooltip>{t.name}</Tooltip>\n </TooltipTrigger>\n ))}\n </div>\n {token ? <TokenRow token={token} onChange={onChange} /> : null}\n </div>\n );\n}\n\nfunction ScaleStep({\n token,\n label,\n showUnit,\n factor,\n onChange,\n onFactorChange,\n}: {\n token: TokenEntry;\n label: string;\n showUnit: boolean;\n factor?: number;\n onChange: OnChange;\n onFactorChange?: (factor: number) => void;\n}) {\n const split = splitUnit(token.value);\n if (!split) return null;\n return (\n <div className={s.step} title={token.description || token.name} data-overridden={token.overridden ? '' : undefined}>\n <span className={s.stepLabel}>{label}</span>\n <span className={s.stepEdit}>\n <NumberField\n className={s.number}\n aria-label={`${token.name} value`}\n value={split.amount}\n hideSteppers\n formatOptions={NUMBER_FORMAT}\n onChange={(amount) => {\n if (Number.isFinite(amount)) onChange(token.name, `${amount}${split.unit}`);\n }}\n />\n {showUnit && split.unit ? <span className={s.unit}>{split.unit}</span> : null}\n </span>\n {factor !== undefined && onFactorChange ? (\n <span className={s.stepEdit}>\n <span className={s.unit}>×</span>\n <NumberField\n className={s.number}\n aria-label={`${token.name} factor`}\n value={factor}\n hideSteppers\n formatOptions={NUMBER_FORMAT}\n onChange={(next) => {\n if (Number.isFinite(next)) onFactorChange(next);\n }}\n />\n </span>\n ) : null}\n </div>\n );\n}\n\nconst RULES: readonly ToggleBarItem<TokenScaleRule['kind']>[] = [\n { value: 'factors', label: 'each', ariaLabel: 'factors' },\n { value: 'ratio', label: 'ratio' },\n { value: 'step', label: 'step' },\n];\n\nfunction ScaleRuleControls({\n group,\n scale,\n unit,\n amounts,\n onScaleChange,\n}: {\n group: string;\n scale: TokenScale;\n unit: string;\n amounts: readonly number[];\n onScaleChange: (scale: TokenScale) => void;\n}) {\n const { rule } = scale;\n const param =\n rule.kind === 'ratio'\n ? { key: 'ratio' as const, value: rule.ratio }\n : rule.kind === 'step'\n ? { key: 'step' as const, value: rule.step }\n : null;\n return (\n <div className={s.rule}>\n <span className={s.stepEdit}>\n <span className={s.ruleLabel}>base</span>\n <NumberField\n className={s.number}\n aria-label={`${group} base`}\n value={scale.base}\n hideSteppers\n formatOptions={NUMBER_FORMAT}\n onChange={(base) => {\n if (Number.isFinite(base)) onScaleChange({ ...scale, base });\n }}\n />\n {unit ? <span className={s.unit}>{unit}</span> : null}\n </span>\n <ToggleBar\n ariaLabel={`${group} rule`}\n size=\"sm\"\n items={RULES}\n value={rule.kind}\n onChange={(kind) => {\n if (kind && kind !== rule.kind) onScaleChange(refitScale(scale, kind, amounts));\n }}\n />\n {param ? (\n <span className={s.stepEdit}>\n {param.key === 'ratio' ? <span className={s.unit}>×</span> : <span className={s.unit}>+</span>}\n <NumberField\n className={s.number}\n aria-label={`${group} ${param.key}`}\n value={param.value}\n hideSteppers\n formatOptions={NUMBER_FORMAT}\n onChange={(value) => {\n if (Number.isFinite(value)) onScaleChange({ ...scale, rule: { kind: param.key, [param.key]: value } as TokenScaleRule });\n }}\n />\n </span>\n ) : null}\n </div>\n );\n}\n\nfunction Scale({\n group,\n tokens,\n generator,\n onChange,\n onScaleChange,\n}: {\n group: string;\n tokens: readonly TokenEntry[];\n generator?: TokenScale;\n onChange: OnChange;\n onScaleChange?: (group: string, scale: TokenScale) => void;\n}) {\n const labels = useMemo(() => stepLabels(tokens.map((t) => t.name)), [tokens]);\n const units = new Set(tokens.map((t) => splitUnit(t.value)?.unit ?? ''));\n const unit = units.size === 1 ? [...units][0] : null;\n const overridden = tokens.filter((t) => t.overridden);\n return (\n <div className={s.scale} role=\"group\" aria-label={group}>\n <span className={s.scaleHead}>\n <span className={s.name}>{group}</span>\n {unit ? <span className={s.unit}>{unit}</span> : null}\n {overridden.length > 0 ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n ariaLabel={`Reset ${group}`}\n onClick={() => {\n for (const t of overridden) onChange(t.name, null);\n }}\n >\n Reset\n </Button>\n ) : null}\n </span>\n {generator && onScaleChange ? (\n <ScaleRuleControls\n group={group}\n scale={generator}\n unit={unit ?? ''}\n amounts={generator.tokens.map(\n (name) => splitUnit(tokens.find((t) => t.name === name)?.value ?? '')?.amount ?? generator.base,\n )}\n onScaleChange={(next) => onScaleChange(group, next)}\n />\n ) : null}\n <div className={s.steps}>\n {tokens.map((t, i) => {\n const rule = generator?.rule;\n const at = generator ? generator.tokens.indexOf(t.name) : -1;\n const factor = rule?.kind === 'factors' && at >= 0 ? rule.factors[at] : undefined;\n return (\n <ScaleStep\n key={t.name}\n token={t}\n label={labels[i] ?? t.name}\n showUnit={unit === null}\n factor={factor}\n onChange={onChange}\n onFactorChange={\n generator && onScaleChange && rule?.kind === 'factors'\n ? (next) =>\n onScaleChange(group, {\n ...generator,\n rule: { kind: 'factors', factors: rule.factors.map((f, j) => (j === at ? next : f)) },\n })\n : undefined\n }\n />\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction Section({\n title,\n open,\n onToggle,\n tokens,\n familySize,\n scales,\n onChange,\n onScaleChange,\n}: {\n title: string;\n open: boolean;\n onToggle: () => void;\n tokens: readonly TokenEntry[];\n familySize: number;\n scales?: Readonly<Record<string, TokenScale>>;\n onChange: OnChange;\n onScaleChange?: (group: string, scale: TokenScale) => void;\n}) {\n const items = useMemo(() => itemsOf(tokens, familySize), [tokens, familySize]);\n return (\n <section className={s.section} aria-label={title}>\n <DisclosureRow className={s.sectionHead} open={open} onToggle={onToggle} label={title}>\n <span aria-hidden=\"true\">{title}</span>\n </DisclosureRow>\n {open ? (\n <div className={s.sectionBody}>\n {items.map((item) =>\n item.kind === 'row' ? (\n <TokenRow key={item.token.name} token={item.token} onChange={onChange} />\n ) : item.kind === 'scale' ? (\n <Scale\n key={`scale:${item.group}`}\n group={item.group}\n tokens={item.tokens}\n generator={scales?.[item.group]}\n onChange={onChange}\n onScaleChange={onScaleChange}\n />\n ) : (\n <Family key={`family:${item.group}`} group={item.group} tokens={item.tokens} onChange={onChange} />\n ),\n )}\n </div>\n ) : null}\n </section>\n );\n}\n\n/**\n * Edits a set of design tokens by type: collapsible sections by category, a\n * color group drawn as one row of swatches sized to fit, a group of sizes drawn\n * as one grid of numbers labeled by step — with its base and rule above it when\n * `scales` says how it is generated — and a control for each\n * type — a number with its unit for dimensions and durations, the nine weights\n * for a font weight, a curve beside a `cubic-bezier()`, a swatch beside a color,\n * and text for everything else.\n */\nexport function TokenPanel({\n tokens,\n onChange,\n collapsed,\n onCollapsedChange,\n scales,\n onScaleChange,\n categorize = tokenCategory,\n familySize = 3,\n density = 'normal',\n className,\n}: TokenPanelProps) {\n const [ownCollapsed, setOwnCollapsed] = useState<Partial<Record<TokenCategory, boolean>>>({});\n const closed = collapsed ?? ownCollapsed;\n const byCategory = useMemo(() => {\n const sections = new Map<TokenCategory, TokenEntry[]>();\n for (const token of tokens) {\n const category = categorize(token);\n sections.set(category, [...(sections.get(category) ?? []), token]);\n }\n return sections;\n }, [tokens, categorize]);\n\n return (\n <div className={[s.panel, density === 'tight' && s.tight, className].filter(Boolean).join(' ')}>\n {TOKEN_CATEGORIES.map(({ id, title }) => {\n const inSection = byCategory.get(id);\n if (!inSection) return null;\n const open = !closed[id];\n return (\n <Section\n key={id}\n title={title}\n open={open}\n onToggle={() => {\n if (collapsed === undefined) setOwnCollapsed((prev) => ({ ...prev, [id]: open }));\n onCollapsedChange?.(id, open);\n }}\n tokens={inSection}\n familySize={familySize}\n scales={scales}\n onChange={onChange}\n onScaleChange={onScaleChange}\n />\n );\n })}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { PauseIcon, PlayIcon, StepBackIcon, StepForwardIcon } from '../../icons';\nimport { Button } from '../Button';\nimport { Slider } from '../Slider/Slider';\nimport s from './Jog.module.css';\n\n/** Props for {@link Jog}. */\nexport interface JogProps {\n /** Which step is showing, 0-based. */\n index: number;\n /** How many steps there are. */\n count: number;\n playing: boolean;\n onPlay: (playing: boolean) => void;\n /** Move one step, back or forward. */\n onStep: (by: -1 | 1) => void;\n /** Jump to a step. Left out, no scrubber is drawn. */\n onScrub?: (index: number) => void;\n /** What one step is called, for the spoken labels. Defaults to `Step`. */\n unit?: string;\n /** Drawn after the readout — a beat's caption, a snapshot's date. */\n caption?: ReactNode;\n className?: string;\n}\n\n/**\n * Transport for something counted rather than timed: beat 3 of 24, not 4.20s of 12.00s.\n * `<Transport>` is the continuous-time one, and wants a playhead in milliseconds, a rate and\n * a loop, none of which a list of steps has.\n *\n * Named for the jog of jog/shuttle — moving one frame at a time, as against running at speed.\n */\nexport function Jog(props: JogProps) {\n const { index, count, playing, onPlay, onStep, onScrub, unit = 'Step', caption, className } =\n props;\n\n const last = Math.max(0, count - 1);\n const at = Math.min(Math.max(index, 0), last);\n const spoken = `${unit} ${at + 1} of ${count}`;\n\n return (\n <div className={[s.jog, className].filter(Boolean).join(' ')}>\n <Button\n iconOnly\n size=\"sm\"\n variant=\"ghost\"\n ariaLabel={`Previous ${unit.toLowerCase()}`}\n disabled={at <= 0}\n onClick={() => onStep(-1)}\n >\n <StepBackIcon size={14} />\n </Button>\n <Button\n iconOnly\n size=\"sm\"\n variant=\"ghost\"\n ariaLabel={playing ? 'Pause' : 'Play'}\n disabled={count < 2}\n onClick={() => onPlay(!playing)}\n >\n {playing ? <PauseIcon size={14} /> : <PlayIcon size={14} />}\n </Button>\n <Button\n iconOnly\n size=\"sm\"\n variant=\"ghost\"\n ariaLabel={`Next ${unit.toLowerCase()}`}\n disabled={at >= last}\n onClick={() => onStep(1)}\n >\n <StepForwardIcon size={14} />\n </Button>\n\n {onScrub && (\n <Slider\n className={s.scrub}\n min={0}\n max={last}\n step={1}\n snap=\"strict\"\n density=\"slim\"\n ariaLabel={unit}\n thumbs={[{ value: at, valueText: spoken }]}\n onInput={(next) => onScrub(Math.round(next[0]?.value ?? 0))}\n />\n )}\n\n <span className={s.readout} data-testid=\"jog-readout\">\n {pad(at + 1, count)}/{count}\n </span>\n {caption ? <span className={s.caption}>{caption}</span> : null}\n </div>\n );\n}\n\n/**\n * Figure spaces, not regular ones: the readout updates every beat, and a run from 9 to 10 that\n * widens by a digit shoves whatever follows it along the row. `tabular-nums` fixes the width of\n * a digit and not how many there are, so the padding is what holds the row still.\n */\nfunction pad(value: number, count: number): string {\n return String(value).padStart(String(count).length, ' ');\n}\n","/**\n * The row chrome behind a sidebar list — layers, history, anything that is a\n * flat column of selectable rows in a panel.\n *\n * It owns the container, the row box, the empty state, the list's semantics\n * and its keyboard; what a row *means* stays with the consumer. History dims\n * its redo entries and rules a line under the current one; a layer list drags\n * to reorder and leads each row with a swatch. Both reach that through\n * `className` and `rowProps` rather than through options here, so this does\n * not grow a flag per consumer.\n *\n * Rows are one height and one inset for every list, which is the point: two\n * panels stacked in the same sidebar have to agree, and they did not while\n * each owned a private copy of the same CSS.\n *\n * **Semantics.** The role follows what the list can do:\n * - nothing to select or activate → `list` / `listitem`, and no row is focusable;\n * - `selection` with no row controls → `listbox` / `option`, `aria-selected`;\n * - any row with `trailing` controls, or `onActivate` without `selection` →\n * `grid` / `row`, with the leading content and label in one `gridcell` and\n * the controls in a second. An option may not contain interactive content,\n * so a list whose rows host toggles cannot be a listbox.\n *\n * **Keyboard.** One row is in the tab order: the one last focused, else the\n * first selected, else the first. Up/Down and Home/End move between rows,\n * Enter/Space activate, carrying modifiers so Shift+Space is Shift+click, and\n * Alt+Up/Down call `onNudge`. In a multi-select list with `onSelectRange`,\n * Shift+Up/Down and Shift+Home/End move focus and report the rows from the\n * anchor — the row last focused or activated other than by a range — to it. In a grid, Right steps from the row into its\n * controls, Left and Escape step back; the controls leave the tab order.\n */\nimport {\n forwardRef,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type FocusEvent,\n type HTMLAttributes,\n type KeyboardEvent,\n type MouseEvent,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { CONTROL_SELECTOR, isInControlWithin } from '../../interactiveTarget';\nimport type { PressModifiers, ReorderGhost } from '../../useReorderDragList';\nimport { DragGhost } from '../DragGhost';\nimport s from './ItemList.module.css';\n\n/** One row. `id` is the React key. */\nexport interface ItemListRow {\n id: string;\n label: ReactNode;\n /** Fixed-size decoration before the label — a color swatch. Not a control:\n * those go in `trailing`. */\n leading?: ReactNode;\n /** Buttons and toggles after the label — visibility, lock. They keep their\n * own clicks and keys, and turn the list into a grid. A control that edits\n * with the arrow keys does not belong here. */\n trailing?: ReactNode;\n /** The row the list considers current. With `selection` set this is also\n * `aria-selected`. */\n selected?: boolean;\n /** Present but not in effect — history's redo entries. */\n muted?: boolean;\n /** Part of a drag in progress — `useReorderDragList`'s `state.draggedIds`. */\n dragging?: boolean;\n /** Consumer classes for states this component has no opinion about. */\n className?: string;\n /** Handlers and data attributes for this row's element. `data-*` is\n * spelled out because `HTMLAttributes` does not admit it, and every\n * consumer here marks its rows up with one. A handler here runs before the\n * list's own, and `preventDefault()` in it keeps the list out. */\n rowProps?: HTMLAttributes<HTMLDivElement> & Record<`data-${string}`, unknown>;\n}\n\nexport interface ItemListProps {\n rows: readonly ItemListRow[];\n /** Shown in place of the rows when there are none. */\n empty?: ReactNode;\n className?: string;\n /**\n * Whether rows are selectable, and how many at once. The list reports\n * `selected` to assistive tech; choosing what is selected stays with\n * `onActivate`.\n */\n selection?: 'single' | 'multi';\n /**\n * A row was clicked, or Enter/Space was pressed on it, with the modifiers\n * held. Clicks and keys on a row's `trailing` controls do not reach this.\n */\n onActivate?(id: string, index: number, mods: PressModifiers): void;\n /**\n * Alt+Up (`-1`) or Alt+Down (`1`) on a row: move it. Focus stays on the\n * row wherever it lands. `useReorderDragList`'s `nudge` fits as-is.\n */\n onNudge?(id: string, index: number, delta: -1 | 1): void;\n /**\n * With `selection=\"multi\"`: Shift+Up/Down or Shift+Home/End moved focus,\n * and `ids` is every row from the anchor to the newly focused one, in list\n * order. The anchor is the row last focused or activated other than by a\n * range move, so a click or a plain arrow move re-anchors. What the range does to\n * the selection stays with the consumer, as with `onActivate`. Without it,\n * Shift+Arrow only moves focus.\n */\n onSelectRange?(ids: string[]): void;\n /**\n * Where a drop would land, as an insertion index: `0` is above the first\n * row, `rows.length` below the last. The list draws the seam itself, from\n * the rows' own boxes, so it follows whatever height the density gives\n * them. `useReorderDragList`'s `state.targetIndex` goes here as-is.\n */\n dropIndex?: number | null;\n /** Rendered inside the container ahead of the rows. */\n overlay?: ReactNode;\n /** Spread onto the container: pointer handlers for a drag, `aria-label`. */\n containerProps?: HTMLAttributes<HTMLDivElement>;\n /** Rows to draw again under the pointer during a drag — `useReorderDragList`'s `state.ghost`. */\n ghost?: ReorderGhost | null;\n}\n\ntype Mode = 'list' | 'listbox' | 'grid';\n\nconst ROLES: Record<Mode, { container: string; row: string }> = {\n list: { container: 'list', row: 'listitem' },\n listbox: { container: 'listbox', row: 'option' },\n grid: { container: 'grid', row: 'row' },\n};\n\nexport const ItemList = forwardRef(function ItemList(\n {\n rows, empty, className, selection, onActivate, onNudge, onSelectRange, dropIndex, overlay,\n containerProps, ghost,\n }: ItemListProps,\n ref: Ref<HTMLDivElement>,\n) {\n const hasTrailing = rows.some((r) => r.trailing != null);\n const mode: Mode = hasTrailing || (onActivate && !selection)\n ? 'grid'\n : selection ? 'listbox' : 'list';\n const interactive = mode !== 'list';\n\n const [container, setContainer] = useState<HTMLDivElement | null>(null);\n const setRefs = useCallback(\n (el: HTMLDivElement | null) => {\n setContainer(el);\n if (typeof ref === 'function') ref(el);\n else if (ref) ref.current = el;\n },\n [ref],\n );\n\n /** The element of each row that takes focus: the row itself, or in a grid its label cell. */\n const targets = useRef(new Map<string, HTMLElement>());\n const [focusId, setFocusId] = useState<string | null>(null);\n const pendingFocus = useRef<string | null>(null);\n const anchor = useRef<string | null>(null);\n /** The row a range move is focusing, whose focus must not re-anchor. */\n const extending = useRef<string | null>(null);\n\n const stopId = rows.some((r) => r.id === focusId)\n ? focusId\n : (rows.find((r) => r.selected) ?? rows[0])?.id;\n\n useLayoutEffect(() => {\n const id = pendingFocus.current;\n if (id == null) return;\n pendingFocus.current = null;\n const el = targets.current.get(id);\n if (el && document.activeElement !== el) el.focus();\n });\n\n useLayoutEffect(() => {\n if (mode !== 'grid') return;\n for (const target of targets.current.values()) {\n const cell = target.parentElement?.querySelector(`.${s.trailing}`);\n cell?.querySelectorAll(CONTROL_SELECTOR).forEach((c) => c.setAttribute('tabindex', '-1'));\n }\n });\n\n const cls = [s.list, className].filter(Boolean).join(' ');\n if (rows.length === 0) {\n return (\n <div className={cls} ref={setRefs} {...containerProps}>\n <div className={s.empty}>{empty ?? '—'}</div>\n </div>\n );\n }\n\n const focusRow = (index: number) => {\n const row = rows[Math.max(0, Math.min(rows.length - 1, index))];\n if (row) targets.current.get(row.id)?.focus();\n };\n\n const ranges = selection === 'multi' && onSelectRange !== undefined;\n\n /** Moves focus to `index`: a range from the anchor when `extend`, else a plain move. */\n const moveTo = (from: ItemListRow, index: number, extend: boolean) => {\n const to = Math.max(0, Math.min(rows.length - 1, index));\n if (!extend || !ranges) {\n focusRow(to);\n return;\n }\n let at = rows.findIndex((r) => r.id === anchor.current);\n if (at < 0) {\n anchor.current = from.id;\n at = rows.indexOf(from);\n }\n extending.current = rows[to]!.id;\n focusRow(to);\n extending.current = null;\n onSelectRange(rows.slice(Math.min(at, to), Math.max(at, to) + 1).map((r) => r.id));\n };\n\n const onKeyDown = (row: ItemListRow, i: number) => (e: KeyboardEvent<HTMLDivElement>) => {\n row.rowProps?.onKeyDown?.(e);\n if (e.defaultPrevented) return;\n const target = targets.current.get(row.id);\n if (!target) return;\n const onTarget = e.target === target;\n const controlCell = mode === 'grid'\n ? e.currentTarget.querySelector<HTMLElement>(`.${s.trailing}`)\n : null;\n if (!onTarget && !controlCell?.contains(e.target as Node)) return;\n\n switch (e.key) {\n case 'ArrowDown':\n case 'ArrowUp': {\n e.preventDefault();\n const delta = e.key === 'ArrowDown' ? 1 : -1;\n if (e.altKey && onNudge && onTarget) {\n pendingFocus.current = row.id;\n onNudge(row.id, i, delta);\n } else {\n moveTo(row, i + delta, e.shiftKey);\n }\n return;\n }\n case 'Home':\n case 'End':\n if (!onTarget) return;\n e.preventDefault();\n moveTo(row, e.key === 'Home' ? 0 : rows.length - 1, e.shiftKey);\n return;\n case 'Enter':\n case ' ':\n if (!onTarget) return;\n e.preventDefault();\n anchor.current = row.id;\n onActivate?.(row.id, i, modsOf(e));\n return;\n case 'ArrowRight':\n case 'ArrowLeft':\n case 'Escape': {\n if (!controlCell) return;\n const controls = Array.from(controlCell.querySelectorAll<HTMLElement>(CONTROL_SELECTOR))\n .filter((c) => !c.matches(':disabled'));\n if (onTarget) {\n if (e.key !== 'ArrowRight' || !controls[0]) return;\n e.preventDefault();\n controls[0].focus();\n return;\n }\n e.preventDefault();\n const at = controls.findIndex((c) => c.contains(e.target as Node));\n if (e.key === 'ArrowRight') controls[at + 1]?.focus();\n else if (e.key === 'ArrowLeft' && at > 0) controls[at - 1]?.focus();\n else target.focus();\n return;\n }\n default:\n }\n };\n\n const onClick = (row: ItemListRow, i: number) => (e: MouseEvent<HTMLDivElement>) => {\n row.rowProps?.onClick?.(e);\n if (e.defaultPrevented || isInControlWithin(e.target, e.currentTarget)) return;\n anchor.current = row.id;\n onActivate?.(row.id, i, modsOf(e));\n };\n\n const onFocus = (row: ItemListRow) => (e: FocusEvent<HTMLDivElement>) => {\n row.rowProps?.onFocus?.(e);\n if (e.target !== targets.current.get(row.id)) return;\n setFocusId(row.id);\n if (extending.current !== row.id) anchor.current = row.id;\n };\n\n const targetRef = (id: string) => (el: HTMLElement | null) => {\n if (el) targets.current.set(id, el);\n else targets.current.delete(id);\n };\n\n const roles = ROLES[mode];\n return (\n <div\n className={cls}\n ref={setRefs}\n {...containerProps}\n role={roles.container}\n aria-multiselectable={selection === 'multi' && mode !== 'list' ? true : undefined}\n >\n {overlay}\n {ghost && container ? (\n <DragGhost at={ghost} from={container}>\n {rows\n .filter((row) => ghost.ids.includes(row.id))\n .map((row) => (\n <div key={row.id} className={[s.row, row.selected && s.selected].filter(Boolean).join(' ')}>\n {row.leading}\n <span className={s.label}>{row.label}</span>\n </div>\n ))}\n </DragGhost>\n ) : null}\n {rows.map((row, i) => {\n const tabIndex = interactive ? (row.id === stopId ? 0 : -1) : undefined;\n const content = (\n <>\n {row.leading}\n <span className={s.label}>{row.label}</span>\n </>\n );\n return (\n <div\n key={row.id}\n className={[\n s.row,\n row.selected && s.selected,\n row.muted && s.muted,\n row.className,\n ].filter(Boolean).join(' ')}\n {...row.rowProps}\n role={roles.row}\n aria-selected={selection && mode !== 'list' ? !!row.selected : undefined}\n ref={mode === 'listbox' ? targetRef(row.id) : undefined}\n tabIndex={mode === 'listbox' ? tabIndex : row.rowProps?.tabIndex}\n onKeyDown={interactive ? onKeyDown(row, i) : row.rowProps?.onKeyDown}\n onClick={interactive ? onClick(row, i) : row.rowProps?.onClick}\n onFocus={interactive ? onFocus(row) : row.rowProps?.onFocus}\n data-drop={dropSide(dropIndex, i, rows.length)}\n data-dragging={row.dragging ? 'true' : undefined}\n >\n {mode === 'grid' ? (\n <>\n <div role=\"gridcell\" className={s.cell} ref={targetRef(row.id)} tabIndex={tabIndex}>\n {content}\n </div>\n {row.trailing != null && (\n <div role=\"gridcell\" className={s.trailing}>{row.trailing}</div>\n )}\n </>\n ) : content}\n </div>\n );\n })}\n </div>\n );\n});\n\nfunction modsOf(e: { shiftKey: boolean; ctrlKey: boolean; metaKey: boolean; altKey: boolean }): PressModifiers {\n return { shiftKey: e.shiftKey, ctrlKey: e.ctrlKey, metaKey: e.metaKey, altKey: e.altKey };\n}\n\n/** Which edge of row `i` carries the seam for `dropIndex`, if any. */\nfunction dropSide(\n dropIndex: number | null | undefined,\n i: number,\n count: number,\n): 'before' | 'after' | undefined {\n if (dropIndex == null) return undefined;\n if (dropIndex === i) return 'before';\n if (dropIndex >= count && i === count - 1) return 'after';\n return undefined;\n}\n","/**\n * A selection's leaves as cells: one `ToolPrefLeaf` and its aggregated value\n * in, one rendered cell out, plus the run logic that turns a row of paired\n * toggles into a single segmented bar and the rows of an object leaf.\n *\n * The control itself is `PropertyControl`'s, through `prefFieldProps`; what\n * is decided here is how a selection surface sizes and composes it.\n * `ToolOptionsBar` renders a tool's options through the same functions.\n */\nimport { Fragment, type ReactNode } from 'react';\nimport type {\n ToolPrefBoolean,\n ToolPrefGroup,\n ToolPrefLeaf,\n ToolPrefObject,\n} from '@weasel-js/core';\nimport { prefFieldProps } from '../Prefs/prefField';\nimport { PropertyControl } from '../Properties/PropertyField';\nimport { ToggleBar } from '../ToggleBar';\nimport { Icon } from '../../icons/Icon';\nimport { ICON_PATHS, type IconName } from '../../icons/paths';\nimport s from './SelectionPanel.module.css';\n\n\n/** What a {@link PropertyRenderer} is given for the property it is rendering. */\nexport interface PropertyRenderContext {\n /** Dotted node path of the leaf (`pose.x`, `data.fill`). */\n path: string;\n /** The schema leaf. App renderers narrow it to their own kind shape. */\n pref: ToolPrefLeaf;\n /** Aggregated value across the selection; `undefined` when mixed or unset. */\n value: unknown;\n /** True when selected nodes disagree at this path. */\n mixed: boolean;\n /**\n * True when the nodes agree and what they agree on is nothing — the field\n * is absent, and whatever paints comes from a fallback further down.\n *\n * Distinct from `mixed`, and both leave `value` undefined. A control must\n * not substitute its schema default here: doing so shows a value the node\n * does not hold, and the next edit writes that invention back.\n */\n unset: boolean;\n /**\n * The fields of the object this leaf is a field of — `undefined` for a\n * top-level leaf, and for a field of an object the node does not hold.\n *\n * What a control needs when its own field doesn't carry the whole answer:\n * a stroke's dash lengths are multiples of the stroke's width, so reading\n * the array as a style takes both.\n */\n siblings?: Record<string, unknown>;\n /** Commit a value — fans out to every selected node in one undo step. */\n setValue: (value: unknown) => void;\n /**\n * The aggregated value at another node path — what `value` and `mixed` are\n * for this leaf's own path, for any path.\n *\n * A control whose subject spans more than one field needs it: a font picker\n * reporting which variant will actually paint has to read the node's weight\n * and style. Reading it off `value` is impossible — a leaf is handed one\n * field.\n */\n valueAt: (path: string) => { value: unknown; mixed: boolean };\n /**\n * The ids of the nodes the values were read from, joined. It changes exactly\n * when the selection does, so a control holding scratch that belongs to one\n * selection can key on it and be remounted rather than carry it to the next.\n * Absent where the values come from no selection, as in a tool options bar.\n */\n selectionKey?: string;\n}\n\n/**\n * Renders the control for one property across the whole selection.\n * Returning `null` collapses the leaf.\n */\nexport type PropertyRenderer = (ctx: PropertyRenderContext) => ReactNode;\n\n\n/**\n * One leaf with its context built but nothing rendered yet.\n *\n * Deferring the render is what lets a run of sibling flags become one bar:\n * whether a leaf joins its neighbors is a fact about the run, which no leaf\n * rendering itself can see.\n */\nexport interface LeafCell {\n key: string;\n leaf: ToolPrefLeaf;\n ctx: PropertyRenderContext;\n /** The accessible name this leaf's control carries — qualified by the row's\n * pair where the row holds more than one leaf. */\n ariaLabel: string;\n /** Renders the leaf on its own, chrome and all. */\n render: () => ReactNode;\n}\n\n/** A cell's content, once the run it belongs to has been decided. */\nexport interface RenderedCell {\n key: string;\n /** The leaf that names the cell — the run's first, for a flag bar. */\n leaf: ToolPrefLeaf;\n block: boolean;\n content: ReactNode;\n}\n\n/**\n * True for a leaf that can join a flag bar: a paired toggle boolean the\n * consumer has not claimed with a renderer of its own.\n */\nexport function isFlagCell(cell: LeafCell, renderers?: Record<string, PropertyRenderer>): boolean {\n const { leaf } = cell;\n return (\n leaf.kind === 'boolean' &&\n (leaf as ToolPrefBoolean).control === 'toggle' &&\n leaf.pair !== undefined &&\n renderers?.[cell.ctx.path] === undefined &&\n renderers?.[leaf.kind] === undefined\n );\n}\n\n/**\n * Renders a row's cells, collapsing each run of adjacent same-`pair` toggle\n * booleans into one segmented bar — the idiom the enum toggle a row away\n * already uses, rather than one detached pill per flag.\n */\nexport function renderCells(\n cells: readonly LeafCell[],\n renderers?: Record<string, PropertyRenderer>,\n): RenderedCell[] {\n const out: RenderedCell[] = [];\n for (let i = 0; i < cells.length; ) {\n const cell = cells[i];\n if (!isFlagCell(cell, renderers)) {\n const content = cell.render();\n if (content != null) {\n out.push({ key: cell.key, leaf: cell.leaf, block: cell.leaf.block === true, content });\n }\n i += 1;\n continue;\n }\n let j = i + 1;\n while (\n j < cells.length &&\n isFlagCell(cells[j], renderers) &&\n cells[j].leaf.pair === cell.leaf.pair\n ) {\n j += 1;\n }\n const run = cells.slice(i, j);\n out.push({\n key: cell.key,\n leaf: cell.leaf,\n block: run.every((c) => c.leaf.block === true),\n content: <FlagBar run={run} ariaLabel={cell.leaf.pair as string} />,\n });\n i = j;\n }\n return out;\n}\n\n/**\n * A run of paired boolean flags as one multi-select bar — U / S / O, the way\n * every text editor draws them.\n */\nfunction FlagBar({ run, ariaLabel }: { run: readonly LeafCell[]; ariaLabel: string }): ReactNode {\n const on = run.filter((c) => c.ctx.value === true).map((c) => c.key);\n return (\n <ToggleBar<string>\n mode=\"multiple\"\n size=\"sm\"\n variant=\"flat\"\n className={s.flagToggle}\n ariaLabel={ariaLabel}\n items={run.map((c) => {\n const p = c.leaf as ToolPrefBoolean;\n return {\n value: c.key,\n label:\n p.icon && p.icon in ICON_PATHS ? (\n <Icon name={p.icon as IconName} size={14} />\n ) : (\n (p.short ?? p.name.slice(0, 1))\n ),\n ariaLabel: c.ariaLabel,\n };\n })}\n value={on}\n // Each flag owns its own path, so only the segment that moved is\n // written — committing the run would write two fields nobody touched,\n // and inside an object leaf would fabricate values for the other two.\n mixedValues={run.filter((c) => c.ctx.mixed).map((c) => c.key)}\n onChange={(next) => {\n for (const c of run) {\n const now = next.includes(c.key);\n if (now !== on.includes(c.key)) c.ctx.setValue(now);\n }\n }}\n />\n );\n}\n\nexport function renderBuiltin(\n ctx: PropertyRenderContext,\n ariaLabel: string,\n renderers?: Record<string, PropertyRenderer>,\n /** Identifies the current selection, so a control holding per-selection\n * scratch (the paint kind memory) is remounted rather than carried over. */\n selectionKey = '',\n /** True for a field of an object leaf. Such a field writes itself into its\n * parent, so it can only hold values its parent's type permits — which is\n * what rules \"none\" out for a nested paint. */\n nested = false,\n): ReactNode {\n const { pref, value, mixed, unset, setValue } = ctx;\n if (pref.kind === 'object') {\n // One value with fields hanging off it. Each child writes the parent\n // whole, so a field is never set on a half-built object.\n return <ObjectLeaf ctx={ctx} renderers={renderers} selectionKey={selectionKey} />;\n }\n const field = prefFieldProps(pref, {\n value,\n mixed,\n unset,\n siblings: ctx.siblings,\n setValue,\n // The substitution probe runs at the node's own weight and style, so the\n // picker names the variant that will actually paint. A mixed selection\n // has no single one; the probe falls back to 400/normal there.\n fontVariant: {\n weight: ctx.valueAt('data.style.fontWeight').value,\n style: ctx.valueAt('data.style.fontStyle').value,\n },\n });\n if (field === null) {\n return <span className={s.unrenderable}>({pref.kind}: no renderer)</span>;\n }\n switch (field.kind) {\n case 'boolean':\n // A panel's flag is a switch unless it asks otherwise.\n return (\n <PropertyControl\n {...field}\n {...framed(ariaLabel)}\n control={field.control ?? 'switch'}\n className={field.control === 'toggle' ? s.flagToggle : undefined}\n />\n );\n case 'number':\n return (\n <PropertyControl\n {...field}\n {...framed(ariaLabel)}\n className={field.control === 'slider' ? s.slider : s.number}\n steppers={false}\n />\n );\n case 'string':\n // Settled values only: a live write per keystroke would be one undo\n // step per character.\n return <PropertyControl {...field} {...framed(ariaLabel)} onInput={settledOnly} />;\n case 'enum':\n return (\n <PropertyControl\n {...field}\n {...framed(ariaLabel)}\n className={field.control === 'toggle' ? s.toggle : field.control === 'radio' ? undefined : s.select}\n />\n );\n case 'font-family':\n return <PropertyControl {...field} {...framed(ariaLabel)} className={s.select} />;\n case 'paint':\n return (\n <PropertyControl\n {...field}\n {...framed(ariaLabel)}\n // Per-kind switch memory is scratch for one selection; carrying it\n // across would recall the previous node's gradient.\n key={selectionKey}\n control=\"inline\"\n // A nested paint writes one field of its parent, and no kit paint\n // field is optional — `Stroke.paint` is required. Removing the\n // whole parent is a different edit than repainting it, so the\n // control must not offer one as the other.\n allowNone={!nested}\n />\n );\n default:\n return <PropertyControl {...field} {...framed(ariaLabel)} />;\n }\n}\n\nconst framed = (name: string) => ({ chrome: 'framed' as const, name });\n\nconst settledOnly = (): void => {};\n\n/**\n * Renders an object leaf: a titled block whose rows are the object's own\n * fields. A child's edit commits the parent object, never the child's path —\n * writing into a path whose value is not an object yet would corrupt it.\n */\n/** One labeled row inside an object leaf; `pair` merges adjacent fields into\n * it, exactly as the section rows merge theirs. */\ninterface ObjectRow {\n key: string;\n pair?: string;\n label: string;\n title?: string;\n /** Every field in the row brought its own chrome, so the row drops the\n * label column and spans the block. One unlabeled field in an otherwise\n * labeled pair would leave the row named after half of itself. */\n block: boolean;\n controls: ReactNode[];\n}\n\n/**\n * Renders an object leaf: the object's own fields, as rows. A child's edit\n * commits the parent object, never the child's path — writing into a path\n * whose value is not an object yet would corrupt it.\n */\nfunction ObjectLeaf({\n ctx,\n renderers,\n selectionKey = '',\n}: {\n ctx: PropertyRenderContext;\n renderers?: Record<string, PropertyRenderer>;\n selectionKey?: string;\n}): ReactNode {\n const pref = ctx.pref as ToolPrefObject;\n const held = typeof ctx.value === 'object' && ctx.value !== null\n ? (ctx.value as Record<string, unknown>)\n : undefined;\n\n // A value whose fields are entirely grouped is titled by those groups — its\n // own heading would stack onto the first one and name nothing new.\n const allGrouped = Object.values(pref.children).every((child) => !('kind' in child));\n\n // `indent` is false when nothing visible sits above these rows: depth is\n // drawn only where a label marks it.\n const rowsOf = (\n children: Record<string, ToolPrefLeaf | ToolPrefGroup>,\n indent: boolean,\n ): ReactNode[] => {\n const out: (ReactNode | ObjectRow)[] = [];\n const isRow = (v: ReactNode | ObjectRow): v is ObjectRow =>\n typeof v === 'object' && v !== null && 'controls' in v;\n\n // Cells accumulate unrendered so a run of adjacent same-`pair` flags can\n // be seen as a run before any of them draws; a group heading between two\n // fields ends the run, exactly as it ends a paired row.\n let pending: LeafCell[] = [];\n const flush = (): void => {\n for (const { key, leaf, block, content } of renderCells(pending, renderers)) {\n const prev = out[out.length - 1];\n if (leaf.pair !== undefined && isRow(prev) && prev.pair === leaf.pair) {\n prev.controls.push(<Fragment key={key}>{content}</Fragment>);\n prev.block &&= block;\n continue;\n }\n out.push({\n key,\n pair: leaf.pair,\n label: leaf.pair ?? leaf.name,\n title: leaf.description,\n block,\n controls: [<Fragment key={key}>{content}</Fragment>],\n });\n }\n pending = [];\n };\n\n for (const [key, child] of Object.entries(children)) {\n // A group among the children organises the fields under a heading\n // without contributing to the path — the rule group keys follow at the\n // top level.\n if (!('kind' in child)) {\n const labeled = child.name !== '';\n const inner = rowsOf(child.children, labeled);\n if (inner.length === 0) continue;\n flush();\n out.push(\n <div key={`group:${key}`} className={labeled && indent ? s.objectGroup : undefined}>\n {labeled && <h5 className={s.sectionTitle}>{child.name}</h5>}\n {inner}\n </div>,\n );\n continue;\n }\n const childPath = `${ctx.path}.${key}`;\n const childCtx: PropertyRenderContext = {\n path: childPath,\n pref: child,\n value: held?.[key],\n mixed: ctx.mixed,\n // A field of an object the node does not hold is unset, and so is one\n // the object omits — `data.stroke` absent leaves every stroke field\n // with nothing behind it, not with the schema's defaults.\n unset: !ctx.mixed && held?.[key] === undefined,\n siblings: held,\n valueAt: ctx.valueAt,\n selectionKey: ctx.selectionKey,\n setValue: (v) => {\n // The node holds no object yet, so writing one field has to\n // materialize the rest: the leaf's `default` is what a complete\n // value looks like. Starting from `{}` instead committed the one\n // field on its own — a `data.stroke` of `{ width: 2 }` with no\n // `paint`, which the type forbids and the painter threw on, taking\n // the whole frame and the visible document with it.\n const base = held\n ?? pref.fromScalar?.(ctx.value)\n ?? (typeof pref.default === 'object' && pref.default !== null\n ? { ...(pref.default as Record<string, unknown>) }\n : {});\n if (v === undefined) {\n // A field written as absent is absent — leaving the key holding\n // `undefined` says the object has a dash of nothing.\n const { [key]: _dropped, ...rest } = base;\n ctx.setValue(rest);\n return;\n }\n ctx.setValue({ ...base, [key]: v });\n },\n };\n pending.push({\n key: childPath,\n leaf: child,\n ctx: childCtx,\n ariaLabel: child.name,\n render: () => {\n const custom = renderers?.[childPath] ?? renderers?.[child.kind];\n const rendered = custom\n ? custom(childCtx)\n : renderBuiltin(childCtx, child.name, renderers, selectionKey, true);\n if (rendered == null) return null;\n // Neither a paired row nor a block one gives a field its own label\n // column, so the glyph is all that names it on screen. The control\n // already carries `name` as its accessible name, which leaves the\n // glyph decorative.\n const unlabeled = child.pair !== undefined || child.block === true;\n const glyph = unlabeled && child.icon && child.icon in ICON_PATHS;\n if (!glyph) return rendered;\n return (\n <span className={s.namedField}>\n <Icon name={child.icon as IconName} size={14} />\n {rendered}\n </span>\n );\n },\n });\n }\n flush();\n return out.map((entry) =>\n typeof entry === 'object' && entry !== null && 'controls' in entry ? (\n entry.block ? (\n <div key={entry.key} className={`${s.rowControls} ${s.blockRow}`} title={entry.title}>\n {entry.controls}\n </div>\n ) : (\n <div key={entry.key} className={s.row}>\n <span className={s.rowLabel} title={entry.title}>{entry.label}</span>\n <span className={s.rowControls}>{entry.controls}</span>\n </div>\n )\n ) : (\n entry\n ),\n );\n };\n\n const rows = rowsOf(pref.children, !allGrouped);\n if (rows.length === 0) return null;\n return (\n <div className={s.objectLeaf}>\n {!allGrouped && <h4 className={s.sectionTitle}>{pref.name}</h4>}\n {rows}\n </div>\n );\n}\n","// Pure selection→panel derivations for SelectionPanel. Kept free of\n// React so intersection/aggregation semantics are unit-testable.\n//\n// Path convention (see core `NodePropertiesEntry`): a leaf's OWN KEY in\n// the schema is its node path — a dotted path of any depth rooted at\n// `pose` or `data` (`pose.x`, `data.fill`, `data.style.fontSize`). Group\n// keys are organizational only.\n\nimport {\n MIXED,\n type Mixed,\n type NodePropertiesEntry,\n type NodeRoutingEntry,\n type SceneNode,\n type ToolPrefGroup,\n type ToolPrefLeaf,\n} from '@weasel-js/core';\n\n// Re-exported under its existing public name here: the kit-wide \"these\n// values disagree\" sentinel (`@weasel-js/core`'s `MIXED`) also covers\n// multi-node aggregation, so this panel doesn't get its own symbol.\nexport { MIXED };\nexport type { Mixed };\n\nexport type AnyNode = SceneNode<unknown, string, unknown>;\n\n/**\n * One editable property in a {@link SelectionPanel}, paired with the dotted\n * node path it reads and writes.\n */\nexport interface PanelLeaf {\n /** Dotted node path — the leaf's key in the schema. */\n path: string;\n leaf: ToolPrefLeaf;\n}\n\n/**\n * One labeled row of a panel section. Holds several leaves when the schema\n * paired them.\n */\nexport interface PanelRow {\n label: string;\n leaves: PanelLeaf[];\n}\n\n/**\n * A titled block of rows, derived from one top-level group of a properties\n * schema. `key` is that group's schema key.\n */\nexport interface PanelSection {\n key: string;\n name: string;\n rows: PanelRow[];\n}\n\n/** Derive a node's kind: containers are `'group'`; leaves classify their\n * `data` through the routing entries (first match wins, `'unknown'`\n * otherwise) — same semantics as core's `NodeRouting.classify`. */\nexport function classifyKind(\n node: AnyNode,\n routing: readonly NodeRoutingEntry[],\n): string {\n if (node.kind === 'container') return 'group';\n for (const entry of routing) {\n if (entry.matches(node.data)) return entry.name;\n }\n return 'unknown';\n}\n\nexport function isGroup(n: ToolPrefLeaf | ToolPrefGroup): n is ToolPrefGroup {\n return !('kind' in n);\n}\n\n/** Flatten a schema to sections of leaves. Nested groups fold into their\n * top-level section; top-level leaves get an untitled leading section. */\nfunction flatten(schema: ToolPrefGroup): PanelSection[] {\n const sections: PanelSection[] = [];\n const untitled: PanelLeaf[] = [];\n\n const collect = (group: ToolPrefGroup, into: PanelLeaf[]): void => {\n for (const [key, child] of Object.entries(group.children)) {\n if (isGroup(child)) collect(child, into);\n else into.push({ path: key, leaf: child });\n }\n };\n\n for (const [key, child] of Object.entries(schema.children)) {\n if (isGroup(child)) {\n const leaves: PanelLeaf[] = [];\n collect(child, leaves);\n sections.push({ key, name: child.name, rows: pairRows(leaves) });\n } else {\n untitled.push({ path: key, leaf: child });\n }\n }\n if (untitled.length > 0) {\n sections.unshift({ key: '', name: '', rows: pairRows(untitled) });\n }\n return sections;\n}\n\n/** Merge consecutive leaves sharing a `pair` id into one labeled row. */\nexport function pairRows(leaves: readonly PanelLeaf[]): PanelRow[] {\n const rows: PanelRow[] = [];\n for (const item of leaves) {\n const pair = item.leaf.pair;\n const prev = rows[rows.length - 1];\n if (pair !== undefined && prev !== undefined && prev.label === pair) {\n prev.leaves.push(item);\n } else {\n rows.push({ label: pair ?? item.leaf.name, leaves: [item] });\n }\n }\n return rows;\n}\n\n/**\n * The schema the panel shows for a set of kinds: one kind → its full\n * schema; several → the intersection by (path, leaf kind), shaped by the\n * first kind's section/row layout. Kinds without a registered schema\n * contribute nothing, so their presence collapses the intersection.\n */\nexport function effectiveSections(\n kinds: readonly string[],\n entries: readonly NodePropertiesEntry[],\n): PanelSection[] {\n const uniq = [...new Set(kinds)];\n if (uniq.length === 0) return [];\n const byName = new Map(entries.map((e) => [e.name, e]));\n const schemas = uniq.map((k) => byName.get(k)?.schema);\n if (schemas.some((s) => s === undefined)) return [];\n const [first, ...rest] = schemas as ToolPrefGroup[];\n\n const flatFirst = flatten(first);\n if (rest.length === 0) return flatFirst;\n\n // '\\0' delimiter: path and kind strings are unconstrained, so a\n // printable separator could collide with real content.\n const leafKey = (l: PanelLeaf): string => `${l.path}\\0${l.leaf.kind}`;\n const restKeys = rest.map(\n (schema) =>\n new Set(\n flatten(schema)\n .flatMap((s) => s.rows)\n .flatMap((r) => r.leaves)\n .map(leafKey),\n ),\n );\n const keep = (l: PanelLeaf): boolean =>\n restKeys.every((set) => set.has(leafKey(l)));\n\n return flatFirst\n .map((section) => ({\n ...section,\n rows: section.rows\n .map((row) => ({ ...row, leaves: row.leaves.filter(keep) }))\n .filter((row) => row.leaves.length > 0),\n }))\n .filter((section) => section.rows.length > 0);\n}\n\n/** Read a node value at a dotted path of any depth (`pose.x`,\n * `data.style.fontSize`, `data.style.fill.color`). Returns `undefined` if\n * the path is dotless (mirrors `commit`'s no-op on a malformed schema\n * key) or if any intermediate segment is missing or not an object. */\nexport function nodeValueAt(node: AnyNode, path: string): unknown {\n const segments = path.split('.');\n if (segments.length < 2) return undefined;\n const head = segments[0];\n let cursor: unknown = head === 'pose' ? node.pose : head === 'data' ? node.data : undefined;\n for (let i = 1; i < segments.length; i++) {\n if (cursor == null || typeof cursor !== 'object') return undefined;\n cursor = (cursor as Record<string, unknown>)[segments[i]];\n }\n return cursor;\n}\n\n/** Immutably set `value` at a dotted path within `root`, cloning each level\n * on the way down so React sees new object identities. Arrays stay arrays\n * (an array intermediate is shallow-copied, not flattened into `{0: ...}`)\n * — this is the write-side twin of `nodeValueAt`, so a schema author who\n * gets a working read gets a working write. */\nexport function setAtPath(root: object, segments: readonly string[], value: unknown): object {\n const [head, ...rest] = segments;\n if (rest.length === 0) {\n return Array.isArray(root)\n ? Object.assign([...root], { [head]: value })\n : { ...root, [head]: value };\n }\n const child = (root as Record<string, unknown>)[head];\n const childObj = Array.isArray(child)\n ? [...child]\n : child != null && typeof child === 'object'\n ? { ...child }\n : {};\n const nested = setAtPath(childObj, rest, value);\n return Array.isArray(root)\n ? Object.assign([...root], { [head]: nested })\n : { ...root, [head]: nested };\n}\n\n/** Aggregate a path across nodes: the shared value, or `MIXED`. */\nexport function aggregateValue(\n nodes: readonly AnyNode[],\n path: string,\n): unknown | Mixed {\n let value: unknown;\n let first = true;\n for (const node of nodes) {\n const v = nodeValueAt(node, path);\n if (first) {\n value = v;\n first = false;\n } else if (!Object.is(v, value)) {\n return MIXED;\n }\n }\n return value;\n}\n\n/** `'rect ×2 · text'` — kinds in first-seen order with counts. */\nexport function kindBreakdown(kinds: readonly string[]): string {\n const counts = new Map<string, number>();\n for (const k of kinds) counts.set(k, (counts.get(k) ?? 0) + 1);\n return [...counts.entries()]\n .map(([k, n]) => (n > 1 ? `${k} ×${n}` : k))\n .join(' · ');\n}\n","import type { ReactNode } from 'react';\nimport type { ToolPrefGroup, ToolPrefLeaf } from '@weasel-js/core';\nimport {\n renderBuiltin,\n renderCells,\n type LeafCell,\n type PropertyRenderContext,\n type PropertyRenderer,\n} from '../SelectionPanel/renderLeaf';\nimport { isGroup, pairRows, type PanelLeaf, type PanelRow } from '../SelectionPanel/model';\nimport s from './ToolOptionsBar.module.css';\n\n/** Props for {@link ToolOptionsBar}. */\nexport interface ToolOptionsBarProps {\n /**\n * Context label for the row — e.g. the active tool's name. Rendered\n * before the children and doubles as the toolbar's `aria-label`. Omit\n * it and the row still renders (it's a permanently reserved slot), just\n * without an accessible name.\n *\n * Using `label` for both the visible text and `aria-label` means a\n * screen reader announces it twice when landing on the toolbar (\"Text,\n * toolbar\", then \"Text\" again when browsing into the visible span).\n * `aria-labelledby` would avoid the echo at the cost of id plumbing and\n * an awkward no-`id`-to-point-at case when `label` is omitted. The\n * double-announcement is common enough for labeled landmark regions\n * that it's left as-is — considered, not missed.\n */\n label?: string;\n /**\n * The active tool's options. Leaves draw through the same leaf → control\n * mapping `SelectionPanel` uses, so a kind gets its control decided in one\n * place; groups organize without drawing, since the bar is one line.\n */\n schema?: ToolPrefGroup;\n /** Each leaf's value, keyed by dotted path. A path with no entry is unset. */\n values?: Readonly<Record<string, unknown>>;\n /** A leaf edit, as the dotted path it was declared at and its new value. */\n onChange?: (path: string, value: unknown) => void;\n /** Paths whose sources disagree — drawn as the control's mixed state. */\n mixed?: ReadonlySet<string>;\n /** Control overrides, by dotted path or by leaf kind, as the panel takes. */\n renderers?: Record<string, PropertyRenderer>;\n children?: ReactNode;\n className?: string;\n}\n\n/**\n * Horizontal strip reserved above the workspace for contextual tool options.\n * Given a `schema` it draws the active tool's options itself; the children\n * slot stays open for a tenant that is not a tool's options at all, such as\n * loupe controls.\n *\n * The row always renders, even empty, because the app reserves its height\n * permanently rather than mounting it on demand — mounting mid-edit would\n * resize the workspace under a canvas that's sized to the page.\n *\n * `role=\"toolbar\"` without roving tabindex: the ARIA authoring practices\n * expect arrow-key roving focus across a toolbar's items, but a bar of\n * compound controls (`NumberField`, `Select`, `ColorField`) must leave the\n * arrow keys to them — they edit their own value with them. That is true of\n * schema-drawn controls as much as of arbitrary children, so the bar keeps\n * plain DOM tab order and `useRovingTabIndex` documents this as its opt-out.\n */\nexport function ToolOptionsBar(props: ToolOptionsBarProps) {\n const { label, schema, values, onChange, mixed, renderers, children, className } = props;\n const cls = [s.root, className].filter(Boolean).join(' ');\n return (\n <div className={cls} role=\"toolbar\" aria-label={label}>\n {label !== undefined && <span className={s.label}>{label}</span>}\n <div className={s.controls}>\n {schema !== undefined &&\n barRows(schema).map((row) => (\n <BarRow\n key={row.leaves[0]!.path}\n row={row}\n values={values}\n mixed={mixed}\n renderers={renderers}\n onChange={onChange}\n />\n ))}\n {children}\n </div>\n </div>\n );\n}\n\n/**\n * The schema's visible leaves as rows, addressed by dotted path. Groups are\n * organizational here — a bar is one line, so a nested group contributes its\n * leaves and no chrome — but its path segment still names them, so a leaf\n * reads back at the path the tool declared it at.\n */\nfunction barRows(schema: ToolPrefGroup): PanelRow[] {\n const leaves: PanelLeaf[] = [];\n const collect = (group: ToolPrefGroup, prefix: string): void => {\n for (const [key, child] of Object.entries(group.children)) {\n const path = prefix === '' ? key : `${prefix}.${key}`;\n if (isGroup(child)) collect(child, path);\n else if (child.hidden !== true) leaves.push({ path, leaf: child });\n }\n };\n collect(schema, '');\n return pairRows(leaves);\n}\n\n/** One row of the bar: a single control, or a run of flags as one bar. */\nfunction BarRow({\n row,\n values,\n mixed,\n renderers,\n onChange,\n}: {\n row: PanelRow;\n values: Readonly<Record<string, unknown>> | undefined;\n mixed: ReadonlySet<string> | undefined;\n renderers: Record<string, PropertyRenderer> | undefined;\n onChange: ((path: string, value: unknown) => void) | undefined;\n}) {\n // The bar draws no row label, so a control carries its own name rather than\n // the panel's qualified \"<pair> <leaf>\" — the run's bar carries the pair.\n const cells = row.leaves.map((panelLeaf) =>\n barCell(panelLeaf, panelLeaf.leaf.name, values, mixed, renderers, onChange),\n );\n return (\n <>\n {renderCells(cells, renderers).map((cell) => (\n <span key={cell.key} className={s.cell}>\n {needsLabel(cell.leaf) && (\n <span className={s.cellLabel} aria-hidden=\"true\">\n {cell.leaf.short ?? cell.leaf.name}\n </span>\n )}\n {cell.content}\n </span>\n ))}\n </>\n );\n}\n\n/**\n * Whether a control needs telling from its neighbours in words.\n *\n * Only a bare value box does: a number or a string is a box of characters,\n * and two of them side by side are indistinguishable. Everything else shows\n * what it is — a swatch is a color, a font picker names the family, a flag\n * run and a segmented control label their own segments — so a word in front\n * would repeat what the control already says. `name` stays the accessible\n * name either way, so this costs a screen reader nothing.\n */\nfunction needsLabel(leaf: ToolPrefLeaf): boolean {\n return leaf.kind === 'number' || leaf.kind === 'string';\n}\n\nfunction barCell(\n panelLeaf: PanelLeaf,\n ariaLabel: string,\n values: Readonly<Record<string, unknown>> | undefined,\n mixed: ReadonlySet<string> | undefined,\n renderers: Record<string, PropertyRenderer> | undefined,\n onChange: ((path: string, value: unknown) => void) | undefined,\n): LeafCell {\n const { path, leaf } = panelLeaf;\n const isMixed = mixed?.has(path) === true;\n const ctx: PropertyRenderContext = {\n path,\n pref: leaf,\n value: isMixed ? undefined : values?.[path],\n mixed: isMixed,\n unset: !isMixed && values?.[path] === undefined,\n setValue: (v) => onChange?.(path, v),\n valueAt: (p) => ({ value: values?.[p], mixed: mixed?.has(p) === true }),\n };\n return {\n key: path,\n leaf: leaf as ToolPrefLeaf,\n ctx,\n ariaLabel,\n render: () => {\n const custom = renderers?.[path] ?? renderers?.[leaf.kind];\n return custom ? custom(ctx) : renderBuiltin(ctx, ariaLabel, renderers, path);\n },\n };\n}\n","import { useCallback, useEffect, useRef, type KeyboardEvent, type PointerEvent } from 'react';\nimport { openPointerSession, type PointerSession } from '@weasel-js/core';\nimport s from './ResizeHandle.module.css';\n\n/**\n * Props for {@link ResizeHandle}. `onInput` fires throughout the drag and\n * `onChange` once at the end.\n */\nexport interface ResizeHandleProps {\n /**\n * Which way the handle *runs*, matching `aria-orientation` on the\n * separator role: a `vertical` handle is a vertical bar between two\n * side-by-side panes and drags horizontally. `horizontal` is the\n * stacked case (a bar between rows, dragged up and down).\n */\n orientation?: 'vertical' | 'horizontal';\n /** Current size of the pane being resized, in pixels. */\n value: number;\n min: number;\n max: number;\n /**\n * Flip the sign of the drag. Panes docked to the *trailing* edge (a\n * right sidebar, a bottom drawer) grow as the pointer moves toward the\n * start of the axis, so they want `invert`. Leading-edge panes don't.\n */\n invert?: boolean;\n /**\n * Fires continuously while dragging and on each keyboard step, always\n * clamped to [min, max]. Drive the live size from this.\n */\n onInput(next: number): void;\n /**\n * Fires once when a drag ends or a keyboard step settles, with the final\n * size. Persist here rather than in `onInput` — one write per gesture\n * instead of one per pointer sample.\n */\n onChange?(next: number): void;\n /**\n * The granularity of `value`. Arrow keys move by one step (Shift by\n * eight), and pointer drags snap to the same grid — a pointer reports\n * fractional coordinates on a scaled display, and nobody wants\n * `362.9453125` in their persisted layout. Set a fractional step for a\n * pane measured in something finer than whole pixels.\n */\n step?: number;\n ariaLabel?: string;\n className?: string;\n}\n\nconst clamp = (n: number, min: number, max: number): number => Math.min(max, Math.max(min, n));\n\n/**\n * Snap to the step grid, then clamp. Bounds win over the grid: `min`/`max`\n * are hard limits, so a range that isn't a whole number of steps clips to\n * the bound rather than overshooting it.\n */\nfunction settle(n: number, min: number, max: number, step: number): number {\n const snapped = step > 0 ? Math.round(n / step) * step : n;\n // Re-round to kill the float dust `x / 0.1 * 0.1` leaves behind.\n const precise = Number.isInteger(step) ? snapped : Number(snapped.toFixed(10));\n return clamp(precise, min, max);\n}\n\n/**\n * Draggable divider for resizing a pane — the \"window splitter\" pattern.\n * Owns no size of its own: the consumer holds `value` and applies it\n * (typically as a CSS custom property on the pane), which keeps the handle\n * usable for flex, grid, and absolutely-positioned layouts alike.\n *\n * Keyboard-operable as a matter of course: it's focusable, arrows step by\n * `step` (Shift for a coarse step), Home/End jump to the bounds. A splitter\n * that only responds to a pointer drag strands anyone who can't make one.\n */\nexport function ResizeHandle(props: ResizeHandleProps) {\n const {\n orientation = 'vertical', value, min, max, invert, onInput, onChange,\n step = 1, ariaLabel, className,\n } = props;\n\n // The session reads current props rather than the ones the pointerdown\n // closed over, so a bound or a step changed mid-drag takes effect.\n const latest = useRef(props);\n latest.current = props;\n\n // Drag origin. Measured on pointerdown so every move is measured against\n // the gesture's start rather than the previous sample — accumulating\n // per-sample deltas drifts once the pointer leaves the clamped range.\n const drag = useRef<{ origin: number; startValue: number; last: number } | null>(null);\n const session = useRef<PointerSession | null>(null);\n useEffect(() => () => { session.current?.cancel(); }, []);\n\n const valueAt = (axis: number): number => {\n const d = drag.current!;\n const p = latest.current;\n const delta = axis - d.origin;\n return settle(d.startValue + (p.invert ? -delta : delta), p.min, p.max, p.step ?? 1);\n };\n\n const finish = (next: number) => {\n drag.current = null;\n session.current = null;\n latest.current.onChange?.(next);\n };\n\n const onPointerDown = useCallback((e: PointerEvent<HTMLDivElement>) => {\n if (e.button !== 0 || session.current) return;\n const p = latest.current;\n const vertical = (p.orientation ?? 'vertical') === 'vertical';\n const axisOf = (ev: { clientX: number; clientY: number }) => (vertical ? ev.clientX : ev.clientY);\n drag.current = {\n origin: axisOf(e),\n startValue: p.value,\n last: settle(p.value, p.min, p.max, p.step ?? 1),\n };\n session.current = openPointerSession(e.currentTarget, e, {\n onMove: (ev) => {\n const next = valueAt(axisOf(ev));\n drag.current!.last = next;\n latest.current.onInput(next);\n },\n onEnd: (ev) => { finish(valueAt(axisOf(ev))); },\n // A cancelled resize settles where it was left: `onInput` has already\n // moved the pane there and the consumer owns the value, so abandoning\n // the commit would persist a size the user is no longer looking at.\n onCancel: () => { finish(drag.current!.last); },\n });\n e.preventDefault();\n }, []);\n\n const onKeyDown = useCallback((e: KeyboardEvent<HTMLDivElement>) => {\n const grow = orientation === 'vertical' ? 'ArrowRight' : 'ArrowDown';\n const shrink = orientation === 'vertical' ? 'ArrowLeft' : 'ArrowUp';\n const amount = step * (e.shiftKey ? 8 : 1) * (invert ? -1 : 1);\n let next: number | undefined;\n if (e.key === grow) next = value + amount;\n else if (e.key === shrink) next = value - amount;\n else if (e.key === 'Home') next = invert ? max : min;\n else if (e.key === 'End') next = invert ? min : max;\n if (next === undefined) return;\n e.preventDefault();\n const settled = settle(next, min, max, step);\n onInput(settled);\n onChange?.(settled);\n }, [invert, max, min, onInput, onChange, orientation, step, value]);\n\n const cls = [s.handle, orientation === 'horizontal' && s.horizontal, className]\n .filter(Boolean).join(' ');\n\n return (\n <div\n className={cls}\n role=\"separator\"\n tabIndex={0}\n aria-label={ariaLabel}\n aria-orientation={orientation}\n aria-valuenow={value}\n aria-valuemin={min}\n aria-valuemax={max}\n onPointerDown={onPointerDown}\n onKeyDown={onKeyDown}\n />\n );\n}\n","import type { ReactNode } from 'react';\nimport s from './StatusBar.module.css';\n\n/** Props for {@link StatusBar}. */\nexport interface StatusBarProps {\n /**\n * Accessible label for the bar. Deliberately not a live region — a status\n * bar's readouts change on every pointer move (zoom, cursor position,\n * selection count), and announcing each one would make a screen reader\n * unusable. Screen-reader users reach the same facts through the controls\n * that own them.\n */\n ariaLabel?: string;\n children?: ReactNode;\n className?: string;\n}\n\n/**\n * The thin readout strip along the bottom of an editor window: monospace,\n * one row, items separated by a fixed gap, with an optional spacer that\n * pushes everything after it to the trailing edge.\n *\n * Pure presentation — it holds whatever the app puts in it. Compose with\n * `<StatusBarItem>` and `<StatusBarSpacer>`.\n */\nexport function StatusBar(props: StatusBarProps) {\n const { ariaLabel, children, className } = props;\n return (\n <footer className={[s.bar, className].filter(Boolean).join(' ')} aria-label={ariaLabel}>\n {children}\n </footer>\n );\n}\n\n/** Props for {@link StatusBarItem}. */\nexport interface StatusBarItemProps {\n /**\n * Hover text. Items that carry one also get a `help` cursor, so the\n * affordance is discoverable rather than hidden behind a hover delay.\n */\n title?: string;\n /**\n * Dim the item and use tabular figures. For reference material that\n * shouldn't compete with live readouts — build stamps, hints, units.\n */\n muted?: boolean;\n children?: ReactNode;\n className?: string;\n}\n\n/** One readout in a `<StatusBar>`. */\nexport function StatusBarItem(props: StatusBarItemProps) {\n const { title, muted, children, className } = props;\n const cls = [s.item, muted && s.muted, title !== undefined && s.hasTitle, className]\n .filter(Boolean).join(' ');\n return <span className={cls} title={title}>{children}</span>;\n}\n\n/**\n * Splits a status bar into leading and trailing runs — everything after the\n * spacer is pushed to the trailing edge. Decorative, so it's hidden from the\n * accessibility tree.\n */\nexport function StatusBarSpacer() {\n return <span className={s.spacer} aria-hidden=\"true\" />;\n}\n","import { useEffect, useRef, type ReactElement, type ReactNode } from 'react';\nimport { Slider, type SliderStop, type Thumb } from '../Slider/Slider';\nimport s from './DetentSlider.module.css';\n\n/** What a detent can carry. Narrowed so identity comparison and React keys\n * both work without a keying callback. */\nexport type DetentValue = string | number;\n\n/** One detent on a {@link DetentSlider}. */\nexport type DetentItem<V extends DetentValue = number> = {\n value: V;\n /** Drawn under the detent. Defaults to `formatLabel(value)`, then `value`. */\n label?: ReactNode;\n /** Spoken form, when the drawn label is not the right thing to say. */\n ariaLabel?: string;\n};\n\n/**\n * Props for {@link DetentSlider}.\n *\n * `items` takes bare values or `DetentItem`s interchangeably — a bare value is\n * a detent with no label of its own.\n *\n * `onChange` fires on every detent the control passes through, including\n * mid-drag: each one is a complete, legal choice, so there is no in-flight\n * value to withhold. `onCommit` fires once the gesture that changed things\n * ends, and is the one to write to history.\n */\nexport type DetentSliderProps<V extends DetentValue = number> = {\n items: readonly (V | DetentItem<V>)[];\n value: V;\n onChange: (value: V, index: number) => void;\n onCommit?: (value: V, index: number) => void;\n formatLabel?: (value: V, index: number) => ReactNode;\n labels?: 'all' | 'ends' | 'none';\n trackHeight?: number;\n ariaLabel?: string;\n className?: string;\n};\n\nfunction normalize<V extends DetentValue>(items: readonly (V | DetentItem<V>)[]): DetentItem<V>[] {\n return items.map(it => (typeof it === 'object' && it !== null ? it : ({ value: it } as DetentItem<V>)));\n}\n\n/**\n * The detent `value` selects. An exact match wins; a number that matches none\n * lands on the nearest one, so a value arriving from a numeric field or an\n * older save renders where it belongs rather than silently reading as the\n * first detent.\n */\nfunction resolveIndex<V extends DetentValue>(items: readonly DetentItem<V>[], value: V): number {\n const exact = items.findIndex(it => it.value === value);\n if (exact !== -1) return exact;\n if (typeof value !== 'number') return 0;\n let best = 0;\n let bestGap = Infinity;\n for (let i = 0; i < items.length; i++) {\n const v = items[i].value;\n if (typeof v !== 'number') continue;\n const gap = Math.abs(v - value);\n if (gap < bestGap) {\n bestGap = gap;\n best = i;\n }\n }\n return best;\n}\n\nfunction plainText(label: ReactNode, fallback: DetentValue): string {\n return typeof label === 'string' || typeof label === 'number' ? String(label) : String(fallback);\n}\n\n/**\n * Slider over a fixed list of values: one detent per value, evenly spaced, the\n * thumb resting on one of them.\n *\n * This is the shape to reach for when an option has a small set of allowed\n * values along a line — playback rate, zoom step, quality — in place of a\n * dropdown, which hides the ordering and the extent of the range behind a\n * click. The values need only be ordered, not numeric.\n *\n * It is a strict {@link Slider} over the *index* of `items`, which keeps the\n * detents evenly spaced however the values are distributed. Since the index is\n * meaningless to a screen reader, the value is published as `aria-valuetext`.\n * For numbers that may also rest between the detents, use `Slider` directly\n * with `spacing=\"even\"` and magnetic stops.\n */\nexport function DetentSlider<V extends DetentValue = number>(props: DetentSliderProps<V>): ReactElement {\n const { value, onChange, onCommit, formatLabel, ariaLabel, className } = props;\n const items = normalize(props.items);\n const index = resolveIndex(items, value);\n const lastIndex = Math.max(0, items.length - 1);\n\n const labelOf = (item: DetentItem<V>, i: number): ReactNode =>\n item.label ?? formatLabel?.(item.value, i) ?? String(item.value);\n\n // Deduped separately: `live` suppresses the repeat reports a drag produces\n // while the pointer crosses one detent, `changed` keeps a press that chose\n // nothing from landing a no-op entry in the consumer's history.\n const liveRef = useRef(index);\n const changedRef = useRef(false);\n useEffect(() => {\n liveRef.current = index;\n }, [index]);\n\n const handleInput = (next: Thumb[]) => {\n const i = next[0].value;\n if (i === liveRef.current) return;\n liveRef.current = i;\n changedRef.current = true;\n onChange(items[i].value, i);\n };\n\n const handleCommit = (next: Thumb[]) => {\n if (!changedRef.current) return;\n changedRef.current = false;\n const i = next[0].value;\n onCommit?.(items[i].value, i);\n };\n\n const current = items[index];\n if (!current) return <div className={className ? `${s.root} ${className}` : s.root} />;\n\n const thumbs: Thumb[] = [\n { value: index, valueText: current.ariaLabel ?? plainText(labelOf(current, index), current.value) },\n ];\n\n const stops: SliderStop[] = items.map((item, i) => ({ value: i, label: labelOf(item, i) }));\n\n return (\n <div className={className ? `${s.root} ${className}` : s.root}>\n <Slider\n className={s.slider}\n min={0}\n max={lastIndex}\n stops={stops}\n snap=\"strict\"\n stopLabels={props.labels ?? 'all'}\n trackClick=\"move-nearest\"\n trackHeight={props.trackHeight ?? 8}\n ariaLabel={ariaLabel}\n thumbs={thumbs}\n onInput={handleInput}\n onChange={handleCommit}\n />\n </div>\n );\n}\n","import { UNSTABLE_ToastQueue } from 'react-aria-components';\nimport { flushSync } from 'react-dom';\n\n/** Severity of a toast, driving its accent color and icon. */\nexport type ToastTone = 'info' | 'success' | 'warning' | 'error';\n\n/** Kit-owned payload rendered inside each toast. */\nexport interface ToastContent {\n title: string;\n description?: string;\n tone: ToastTone;\n}\n\n/** Options for a single toast. */\nexport interface ToastOptions {\n description?: string;\n /**\n * Auto-dismiss delay in ms. Default 8000. `null` — sticky until dismissed.\n * Must be > 0; RAC treats 0 as no timer (sticky).\n */\n ttlMs?: number | null;\n /** Stable identity: re-adding with the same id replaces the earlier toast. */\n id?: string;\n}\n\nconst DEFAULT_TTL_MS = 8000;\n\n// Tracks overlapping toast-triggered view transitions so the `:root`\n// marker class survives until the *last* one settles.\nlet activeToastTransitions = 0;\n\n/**\n * RAC's sanctioned toast-animation hook: wrap every queue mutation in a\n * view transition so entry, exit, and the surviving stack's reflow all\n * animate (choreography lives in `toastViewTransitions.css`). Falls back\n * to a plain synchronous update when the browser lacks the API or the\n * user prefers reduced motion — i.e. exactly the pre-animation behavior.\n * The jsdom test environment always takes the fallback path.\n */\nfunction viewTransitionWrapUpdate(fn: () => void): void {\n const reduceMotion =\n typeof matchMedia === 'function' && matchMedia('(prefers-reduced-motion: reduce)').matches;\n if (typeof document === 'undefined' || !('startViewTransition' in document) || reduceMotion) {\n fn();\n return;\n }\n // The marker class scopes the CSS that un-names `:root` (keeps the rest\n // of the page live and interactive during the transition) to\n // toast-owned transitions only.\n const root = document.documentElement;\n activeToastTransitions++;\n root.classList.add('wzl-toast-vt');\n // flushSync: the DOM must reflect the queue change inside the\n // transition callback, before the browser snapshots the new state.\n const vt = document.startViewTransition(() => flushSync(fn));\n // `ready` rejects when the browser skips the transition — routine under\n // a rapid burst of toasts, where each new transition supersedes the\n // in-flight one. The DOM update has still applied by then, but an\n // untouched `ready` surfaces the rejection as a console error, so\n // consume it.\n vt.ready.catch(() => {});\n void vt.finished.finally(() => {\n if (--activeToastTransitions === 0) root.classList.remove('wzl-toast-vt');\n });\n}\n\n// The wrapped RAC queue lives in a module-scoped WeakMap so the public\n// class surface carries no RAC (UNSTABLE_) types — see the design spec's\n// containment rule. `racQueueOf` below is the folder-internal accessor.\nconst RAC_QUEUES = new WeakMap<ToastQueue, UNSTABLE_ToastQueue<ToastContent>>();\n\n/**\n * Kit-owned toast queue. Create isolated instances with\n * `createToastQueue()` (tests, secondary roots); most apps use the\n * module-level `defaultToastQueue` via `toast()`.\n *\n * At most 5 toasts are visible at once; adding a 6th shows immediately\n * and hides the oldest (it returns when a slot frees, with its ttl\n * restarted).\n */\nexport class ToastQueue {\n private keysById = new Map<string, string>();\n\n constructor() {\n RAC_QUEUES.set(\n this,\n new UNSTABLE_ToastQueue<ToastContent>({\n maxVisibleToasts: 5,\n wrapUpdate: viewTransitionWrapUpdate,\n }),\n );\n }\n\n add(tone: ToastTone, title: string, options: ToastOptions = {}): void {\n const { description, ttlMs = DEFAULT_TTL_MS, id } = options;\n const rac = RAC_QUEUES.get(this)!;\n if (id !== undefined) {\n const existing = this.keysById.get(id);\n if (existing !== undefined) rac.close(existing);\n }\n let key: string;\n const racOptions: { timeout?: number; onClose?: () => void } =\n ttlMs === null ? {} : { timeout: ttlMs };\n if (id !== undefined) {\n racOptions.onClose = () => {\n if (this.keysById.get(id) === key) this.keysById.delete(id);\n };\n }\n key = rac.add({ title, description, tone }, racOptions);\n if (id !== undefined) this.keysById.set(id, key);\n }\n\n /** Dismiss the toast previously added with this `id`. No-op if none is live. */\n dismiss(id: string): void {\n const key = this.keysById.get(id);\n if (key !== undefined) RAC_QUEUES.get(this)!.close(key);\n }\n\n /** Dismiss every queued toast. */\n clear(): void {\n RAC_QUEUES.get(this)!.clear();\n this.keysById.clear();\n }\n}\n\n/**\n * Creates an independent toast queue. Most apps use the module-level\n * `defaultToastQueue` that `toast()` writes to; make your own when a surface\n * needs its own stack, and pass it to `ToastRegion`.\n */\nexport function createToastQueue(): ToastQueue {\n return new ToastQueue();\n}\n\n/**\n * Folder-internal bridge to the wrapped RAC queue for `ToastRegion`.\n * Deliberately NOT exported from the Toast folder's `index.ts` — the\n * RAC toast surface is unstable and must not leak past this folder.\n */\nexport function racQueueOf(queue: ToastQueue): UNSTABLE_ToastQueue<ToastContent> {\n return RAC_QUEUES.get(queue)!;\n}\n\n/** Module-level default queue used by `toast()` and `<ToastRegion>`. */\nexport const defaultToastQueue = createToastQueue();\n\ntype ToastFn = {\n (title: string, options?: ToastOptions): void;\n info(title: string, options?: ToastOptions): void;\n success(title: string, options?: ToastOptions): void;\n warning(title: string, options?: ToastOptions): void;\n error(title: string, options?: ToastOptions): void;\n};\n\nfunction tonedAdd(tone: ToastTone) {\n return (title: string, options?: ToastOptions) => defaultToastQueue.add(tone, title, options);\n}\n\n/** Imperative convenience over `defaultToastQueue`. Bare `toast(...)` is `info`. */\nexport const toast: ToastFn = Object.assign(tonedAdd('info'), {\n info: tonedAdd('info'),\n success: tonedAdd('success'),\n warning: tonedAdd('warning'),\n error: tonedAdd('error'),\n});\n","import {\n UNSTABLE_ToastRegion as RACToastRegion,\n UNSTABLE_Toast as RACToast,\n UNSTABLE_ToastContent as RACToastContent,\n Text,\n Button,\n} from 'react-aria-components';\nimport { defaultToastQueue, racQueueOf, type ToastQueue, type ToastTone } from './queue';\nimport s from './Toast.module.css';\nimport './toastViewTransitions.css';\n\n/** Screen corner a toast stack anchors to. */\nexport type ToastPlacement = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n\n/** Props for {@link ToastRegion}. */\nexport interface ToastRegionProps {\n /** Queue to render. Defaults to the module-level `defaultToastQueue`. */\n queue?: ToastQueue;\n /** Screen corner for the stack. Default `bottom-right`. */\n placement?: ToastPlacement;\n className?: string;\n}\n\nconst placementClass: Record<ToastPlacement, string> = {\n 'bottom-right': s.bottomRight,\n 'bottom-left': s.bottomLeft,\n 'top-right': s.topRight,\n 'top-left': s.topLeft,\n};\n\nconst toneClass: Record<ToastTone, string> = {\n info: s.toneInfo,\n success: s.toneSuccess,\n warning: s.toneWarning,\n error: s.toneError,\n};\n\n/**\n * Renders the toast stack for a queue. Mount once, near the app root.\n * From the underlying React Aria region: landmark semantics (keyboard /\n * F6 reachable), screen-reader announcements, and hover pausing the\n * auto-dismiss timers.\n */\nexport function ToastRegion(props: ToastRegionProps) {\n const { queue = defaultToastQueue, placement = 'bottom-right', className } = props;\n return (\n <RACToastRegion\n queue={racQueueOf(queue)}\n aria-label=\"Notifications\"\n className={[s.region, placementClass[placement], className].filter(Boolean).join(' ')}\n >\n {({ toast: t }) => (\n <RACToast\n toast={t}\n className={[s.toast, toneClass[t.content.tone]].filter(Boolean).join(' ')}\n // Inline style is the one sanctioned exception here: each toast\n // needs a *unique* view-transition-name (so enter/exit/reflow\n // track per-toast), and a class can't mint unique idents. The\n // prefix keeps the ident valid (RAC keys can start with digits).\n style={{ viewTransitionName: `wzl-toast-${t.key.replace(/[^a-zA-Z0-9_-]/g, '_')}` }}\n >\n <RACToastContent className={s.content}>\n <Text slot=\"title\" className={s.title}>{t.content.title}</Text>\n {t.content.description !== undefined && (\n <Text slot=\"description\" className={s.description}>{t.content.description}</Text>\n )}\n </RACToastContent>\n <Button slot=\"close\" className={s.close} aria-label=\"Dismiss notification\">\n ×\n </Button>\n </RACToast>\n )}\n </RACToastRegion>\n );\n}\n","/** Maps a domain value onto its position along the track, and back. */\nexport interface BandScale {\n /** Domain → position in [0,1]. Must be monotonic increasing. */\n toUnit(value: number, min: number, max: number): number;\n /** Inverse of `toUnit`. */\n fromUnit(unit: number, min: number, max: number): number;\n}\n\nexport function clamp01(u: number): number {\n return u < 0 ? 0 : u > 1 ? 1 : u;\n}\n\n/** Even domain steps take even track steps. */\nexport const linearScale: BandScale = {\n toUnit: (value, min, max) => (max === min ? 0 : (value - min) / (max - min)),\n fromUnit: (unit, min, max) => min + unit * (max - min),\n};\n\n/** Even *ratios* take even track steps. Requires `min > 0`. */\nexport const logScale: BandScale = {\n toUnit: (value, min, max) => {\n const lo = Math.log(min);\n const hi = Math.log(max);\n return hi === lo ? 0 : (Math.log(value) - lo) / (hi - lo);\n },\n fromUnit: (unit, min, max) => {\n const lo = Math.log(min);\n return Math.exp(lo + unit * (Math.log(max) - lo));\n },\n};\n\nlet warnedNonPositiveMin = false;\n\nfunction isDev(): boolean {\n return typeof process !== 'undefined' ? process.env.NODE_ENV !== 'production' : true;\n}\n\n/**\n * Resolves the `scale` prop, substituting `linearScale` for a `logScale`\n * that `min` would send to `NaN`.\n */\nexport function resolveScale(\n scale: 'linear' | 'log' | BandScale | undefined,\n min: number,\n): BandScale {\n const requested =\n scale === undefined || scale === 'log'\n ? logScale\n : scale === 'linear'\n ? linearScale\n : scale;\n\n if (requested !== logScale || min > 0) return requested;\n\n if (isDev() && !warnedNonPositiveMin) {\n warnedNonPositiveMin = true;\n console.warn(\n `BandEditor: a log scale needs min > 0, but min is ${min}. Falling back to a linear scale. ` +\n `Pass scale=\"linear\" to silence this.`,\n );\n }\n return linearScale;\n}\n","import type { BandScale } from './scale';\nimport { clamp01 } from './scale';\n\nexport interface Band<T> {\n /** Domain value where this band starts. The first band's is normalized to `min`. */\n from: number;\n data: T;\n}\n\n/**\n * A band list covers `[min, max]` exactly: N bands, N−1 interior seams, no\n * gaps and no overlaps. Seam *k* is `bands[k + 1].from`, and lives between\n * `bands[k].from` and the start of the band after next (or `max`).\n *\n * Every function here preserves that. Each returns the array it was given\n * when the edit would be a no-op, so callers can skip a callback with `===`.\n */\n\n/** Pins the first band's start to `min`; leaves the rest alone. */\nexport function normalizeBands<T>(value: readonly Band<T>[], min: number): Band<T>[] {\n const bands = value.map((b) => ({ ...b }));\n if (bands.length > 0) bands[0].from = min;\n return bands;\n}\n\n/** `[from, to]` of band `index` in domain space. */\nexport function bandBounds<T>(\n bands: readonly Band<T>[],\n index: number,\n min: number,\n max: number,\n): [number, number] {\n const from = index === 0 ? min : bands[index].from;\n const to = index === bands.length - 1 ? max : bands[index + 1].from;\n return [from, to];\n}\n\n/** How far seam `index` can travel before it would cross a neighbour. */\nexport function seamBounds<T>(\n bands: readonly Band<T>[],\n index: number,\n min: number,\n max: number,\n): [number, number] {\n const lo = index === 0 ? min : bands[index].from;\n const hi = index + 2 <= bands.length - 1 ? bands[index + 2].from : max;\n return [lo, hi];\n}\n\n/** Clamps a target position for seam `index` to its neighbours, inclusive. */\nexport function clampSeamTo<T>(\n bands: readonly Band<T>[],\n index: number,\n to: number,\n min: number,\n max: number,\n): number {\n const [lo, hi] = seamBounds(bands, index, min, max);\n return Math.max(lo, Math.min(hi, to));\n}\n\nexport function setSeam<T>(bands: readonly Band<T>[], index: number, to: number): Band<T>[] {\n if (bands[index + 1] === undefined || bands[index + 1].from === to) return bands as Band<T>[];\n const next = bands.map((b) => ({ ...b }));\n next[index + 1].from = to;\n return next;\n}\n\n/** Band edges as track positions: `length + 1` values from 0 to 1. */\nexport function unitEdges<T>(\n bands: readonly Band<T>[],\n scale: BandScale,\n min: number,\n max: number,\n): number[] {\n const edges = bands.map((b, i) => (i === 0 ? 0 : clamp01(scale.toUnit(b.from, min, max))));\n edges.push(1);\n return edges;\n}\n\n/**\n * Largest part of `shift` band `index` can take without pushing a neighbour's\n * far edge past it. Zero for the first and last band, whose outer edges are\n * `min` and `max` and do not move.\n */\nexport function clampBandShift(edges: readonly number[], index: number, shift: number): number {\n const isFirst = index === 0;\n const isLast = index === edges.length - 2;\n if (isFirst || isLast) return 0;\n const lo = edges[index - 1] - edges[index];\n const hi = edges[index + 2] - edges[index + 1];\n return Math.max(lo, Math.min(hi, shift));\n}\n\n/** Moves both edges of band `index`, which is the same as moving two seams. */\nexport function moveBandEdges<T>(\n bands: readonly Band<T>[],\n index: number,\n from: number,\n to: number,\n): Band<T>[] {\n const next = bands.map((b) => ({ ...b }));\n next[index].from = from;\n if (next[index + 1] !== undefined) next[index + 1].from = to;\n return next;\n}\n\n/**\n * Splits the band containing `at` in two, the new band starting there.\n * A position already on a seam or on `min` / `max` splits nothing.\n */\nexport function splitBands<T>(\n bands: readonly Band<T>[],\n at: number,\n min: number,\n max: number,\n makeData: (at: number, from: T) => T,\n): Band<T>[] {\n if (bands.length === 0 || at <= min || at >= max) return bands as Band<T>[];\n let index = -1;\n for (let i = 0; i < bands.length; i++) {\n const [from, to] = bandBounds(bands, i, min, max);\n if (at > from && at < to) {\n index = i;\n break;\n }\n }\n if (index < 0) return bands as Band<T>[];\n const next = bands.map((b) => ({ ...b }));\n next.splice(index + 1, 0, { from: at, data: makeData(at, bands[index].data) });\n return next;\n}\n\n/**\n * Merges band `index` into its left neighbour, which keeps its payload and\n * absorbs the span. The first band has no left neighbour and cannot be\n * merged away — a partition always has at least one part.\n */\nexport function mergeBand<T>(bands: readonly Band<T>[], index: number): Band<T>[] {\n if (index <= 0 || index >= bands.length) return bands as Band<T>[];\n return bands.filter((_, i) => i !== index).map((b) => ({ ...b }));\n}\n","import {\n Fragment,\n useEffect,\n useId,\n useRef,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { openPointerSession, type PointerSession } from '@weasel-js/core';\nimport s from './BandEditor.module.css';\nimport { SNAP_RADIUS_PX, snapToNearest } from '../../snap';\nimport { clamp01, resolveScale, type BandScale } from './scale';\nimport {\n bandBounds,\n clampBandShift,\n clampSeamTo,\n mergeBand,\n moveBandEdges,\n normalizeBands,\n seamBounds,\n setSeam,\n splitBands,\n unitEdges,\n type Band,\n} from './bands';\n\nexport type { Band, BandScale };\n\nexport interface BandEditorProps<T> {\n /** Ascending by `from`. `value[0].from` is normalized to `min` on read. */\n value: Band<T>[];\n /** Live during a drag — wire for preview, do not write to history. */\n onInput?: (next: Band<T>[]) => void;\n /** Committed at gesture end: one call per gesture. */\n onChange: (next: Band<T>[]) => void;\n min: number;\n max: number;\n /** Default `'log'`. */\n scale?: 'linear' | 'log' | BandScale;\n ticks?: { at: number; label?: ReactNode }[];\n /** Snap a dragged seam to a tick within ~6px. Default true; `alt` defeats it per-drag. */\n snap?: boolean;\n renderBand?: (band: Band<T>, index: number) => ReactNode;\n selectedIndex?: number | null;\n onSelect?: (index: number) => void;\n /** Payload for a band split off an existing one. Default duplicates `from`. */\n splitBand?: (at: number, from: T) => T;\n label?: ReactNode;\n className?: string;\n}\n\n/** One arrow-key step, as a fraction of the track. */\nconst KEY_STEP = 0.01;\n\nfunction pct(unit: number): string {\n return `${clamp01(unit) * 100}%`;\n}\n\nfunction keepData<T>(_at: number, from: T): T {\n return from;\n}\n\nfunction isTextEntry(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (target.isContentEditable) return true;\n const tag = target.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n}\n\n/**\n * Divides a numeric axis into contiguous bands and lets you drag the seams\n * between them. Each band carries a payload the consumer supplies and\n * renders through `renderBand`; the control itself knows nothing about what\n * a band means.\n *\n * The axis is always fully covered — N bands, N−1 interior seams, no gaps and\n * no overlaps — so editing is editing a sorted list of seam positions. Seams\n * clamp at their neighbours rather than crossing, which means a drag can\n * never destroy a band: removal is only ever the explicit `x` / `Delete`\n * merge. The first band is doubly exceptional, its left edge pinned to `min`\n * and its body immovable, and it has no left neighbour to merge into.\n *\n * | Gesture | Effect |\n * |---|---|\n * | drag a seam | resize the two bands either side |\n * | drag a band body | move both its seams, preserving its span |\n * | click the ruler | split the band under the pointer |\n * | `x` / `Delete` | merge the selected band into its left neighbour |\n * | click a band | select it |\n * | `←` `→` on a focused seam | move it by one step; `shift` for ten |\n *\n * `scale` defaults to `'log'`, because the interesting part of a width axis\n * is usually its narrow end.\n */\nexport function BandEditor<T>(props: BandEditorProps<T>): ReactElement {\n const {\n value,\n onInput,\n onChange,\n min,\n max,\n scale,\n ticks,\n renderBand,\n selectedIndex,\n onSelect,\n label,\n className,\n } = props;\n const snap = props.snap ?? true;\n const splitBand = props.splitBand ?? keepData;\n\n const trackRef = useRef<HTMLDivElement | null>(null);\n const sessionRef = useRef<PointerSession | null>(null);\n useEffect(() => () => { sessionRef.current?.cancel(); }, []);\n const labelId = useId();\n const bands = normalizeBands(value, min);\n const sc = resolveScale(scale, min);\n const toUnit = (v: number): number => clamp01(sc.toUnit(v, min, max));\n const fromUnit = (u: number): number => sc.fromUnit(clamp01(u), min, max);\n\n const trackWidth = (): number => trackRef.current?.getBoundingClientRect().width ?? 0;\n\n const unitAt = (clientX: number): number => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect || rect.width === 0) return 0;\n return clamp01((clientX - rect.left) / rect.width);\n };\n\n const snapped = (unit: number, altKey: boolean): number => {\n if (!snap || altKey || !ticks || ticks.length === 0) return unit;\n const width = trackWidth();\n if (width === 0) return unit;\n return snapToNearest(unit, ticks.map((tick) => toUnit(tick.at)), SNAP_RADIUS_PX / width);\n };\n\n // No pointer capture: a band body is a `<button>` whose content the consumer\n // renders, and capture would retarget pointerup and kill the click on it.\n // A drag that ends without a release commits nothing.\n const drag = (\n down: ReactPointerEvent<HTMLElement>,\n onMove: (ev: PointerEvent) => void,\n onEnd: () => void,\n ): void => {\n sessionRef.current?.cancel();\n sessionRef.current = openPointerSession(down.currentTarget, down, {\n onMove,\n onEnd: () => { sessionRef.current = null; onEnd(); },\n onCancel: () => { sessionRef.current = null; },\n }, { capture: false });\n };\n\n const onSeamPointerDown = (index: number) => (e: ReactPointerEvent<HTMLDivElement>): void => {\n if (typeof e.button === 'number' && e.button > 0) return;\n e.preventDefault();\n e.stopPropagation();\n const base = bands;\n let latest: Band<T>[] | null = null;\n drag(\n e,\n (ev) => {\n const to = clampSeamTo(base, index, fromUnit(snapped(unitAt(ev.clientX), ev.altKey)), min, max);\n latest = setSeam(base, index, to);\n onInput?.(latest);\n },\n () => {\n if (latest) onChange(latest);\n },\n );\n };\n\n const onSeamKeyDown = (index: number) => (e: ReactKeyboardEvent<HTMLDivElement>): void => {\n const [lo, hi] = seamBounds(bands, index, min, max);\n let target: number;\n if (e.key === 'Home') target = lo;\n else if (e.key === 'End') target = hi;\n else {\n let delta = 0;\n if (e.key === 'ArrowRight' || e.key === 'ArrowUp') delta = e.shiftKey ? KEY_STEP * 10 : KEY_STEP;\n else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') delta = e.shiftKey ? -KEY_STEP * 10 : -KEY_STEP;\n else return;\n target = fromUnit(toUnit(bands[index + 1].from) + delta);\n }\n e.preventDefault();\n const next = setSeam(bands, index, clampSeamTo(bands, index, target, min, max));\n if (next !== bands) onChange(next);\n };\n\n const onBandPointerDown = (index: number) => (e: ReactPointerEvent<HTMLButtonElement>): void => {\n if (typeof e.button === 'number' && e.button > 0) return;\n if (index !== selectedIndex) onSelect?.(index);\n // The first and last bands' outer edges are `min` and `max`, which do not\n // move, so their bodies have nothing to translate.\n if (index === 0 || index === bands.length - 1) return;\n const base = bands;\n const edges = unitEdges(base, sc, min, max);\n const startUnit = unitAt(e.clientX);\n let latest: Band<T>[] | null = null;\n drag(\n e,\n (ev) => {\n const shift = clampBandShift(edges, index, unitAt(ev.clientX) - startUnit);\n latest = moveBandEdges(\n base,\n index,\n fromUnit(edges[index] + shift),\n fromUnit(edges[index + 1] + shift),\n );\n onInput?.(latest);\n },\n () => {\n if (latest) onChange(latest);\n },\n );\n };\n\n const onBandFocus = (index: number) => (): void => {\n if (index !== selectedIndex) onSelect?.(index);\n };\n\n const onTrackPointerDown = (e: ReactPointerEvent<HTMLDivElement>): void => {\n if (typeof e.button === 'number' && e.button > 0) return;\n e.preventDefault();\n const next = splitBands(bands, fromUnit(unitAt(e.clientX)), min, max, splitBand);\n if (next !== bands) onChange(next);\n };\n\n const onRootKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>): void => {\n if (e.key !== 'x' && e.key !== 'Delete') return;\n // `x` is a bare letter and Cmd/Ctrl+X is cut: neither may be swallowed\n // when the keystroke belongs to something a consumer put in a band.\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isTextEntry(e.target)) return;\n if (selectedIndex === null || selectedIndex === undefined) return;\n const next = mergeBand(bands, selectedIndex);\n if (next === bands) return;\n e.preventDefault();\n onChange(next);\n onSelect?.(selectedIndex - 1);\n };\n\n return (\n <div\n className={[s.root, className].filter(Boolean).join(' ')}\n role=\"group\"\n aria-label={typeof label === 'string' ? label : undefined}\n aria-labelledby={label !== undefined && typeof label !== 'string' ? labelId : undefined}\n onKeyDown={onRootKeyDown}\n >\n {label !== undefined && <div id={labelId} className={s.label}>{label}</div>}\n <div className={s.ruler} ref={trackRef} data-band-ruler=\"\" onPointerDown={onTrackPointerDown}>\n {ticks?.map((tick, i) => (\n <span\n key={i}\n className={s.tick}\n data-tick-at={tick.at}\n style={{ '--be-at': pct(toUnit(tick.at)) } as CSSProperties}\n >\n {tick.label !== undefined && <span className={s.tickLabel}>{tick.label}</span>}\n </span>\n ))}\n </div>\n <div className={s.bands}>\n {bands.map((band, i) => {\n const [from, to] = bandBounds(bands, i, min, max);\n const isSelected = selectedIndex === i;\n return (\n <Fragment key={i}>\n <button\n type=\"button\"\n className={[s.band, isSelected ? s.selected : null].filter(Boolean).join(' ')}\n style={{ '--be-from': pct(toUnit(from)), '--be-to': pct(toUnit(to)) } as CSSProperties}\n aria-label={`Band ${i + 1}`}\n aria-pressed={isSelected}\n data-band-index={i}\n onPointerDown={onBandPointerDown(i)}\n onFocus={onBandFocus(i)}\n >\n <span className={s.bandContent}>{renderBand?.(band, i)}</span>\n </button>\n {i < bands.length - 1 && (\n <div\n role=\"slider\"\n tabIndex={0}\n className={s.seam}\n style={{ '--be-at': pct(toUnit(bands[i + 1].from)) } as CSSProperties}\n aria-label={`Seam ${i + 1}`}\n aria-orientation=\"horizontal\"\n aria-valuemin={seamBounds(bands, i, min, max)[0]}\n aria-valuemax={seamBounds(bands, i, min, max)[1]}\n aria-valuenow={bands[i + 1].from}\n data-seam-index={i}\n onPointerDown={onSeamPointerDown(i)}\n onKeyDown={onSeamKeyDown(i)}\n />\n )}\n </Fragment>\n );\n })}\n </div>\n </div>\n );\n}\n","import { EASINGS, resolveEasing, type EasingName, type EasingSpec } from '@weasel-js/core';\n\nfunction bezierOf(spec: EasingSpec): readonly [number, number, number, number] | null {\n if (typeof spec === 'object' && spec !== null && 'bezier' in spec) return spec.bezier;\n return null;\n}\n\n/** Control points, for the graph view's draggable handles. `null` means this\n * spec has no handles to drag — the view offers to convert it to a bezier. */\nexport function easingBezier(spec?: EasingSpec): readonly [number, number, number, number] | null {\n if (spec === undefined) return null;\n return bezierOf(spec);\n}\n\n/** What the picker shows for a spec.\n *\n * A function is matched against the built-ins by reference so a consumer that\n * passed `easeOutBack` directly still reads back as `'easeOutBack'`. A wrapped\n * or hand-written function cannot be named and reads as `'custom'` — which is\n * why an editor writes names and control points rather than functions. */\nexport function easingLabel(spec?: EasingSpec): string {\n if (spec === undefined) return 'linear';\n if (typeof spec === 'string') return spec;\n const b = bezierOf(spec);\n if (b) return `cubic-bezier(${b.join(', ')})`;\n for (const [name, fn] of Object.entries(EASINGS)) {\n if (fn === spec) return name;\n }\n return 'custom';\n}\n\n/** `count` evenly spaced samples of the curve over 0..1, for drawing it. */\nexport function sampleEasing(spec: EasingSpec | undefined, count: number): number[] {\n const fn = resolveEasing(spec);\n const out = new Array<number>(count);\n const last = count - 1;\n for (let i = 0; i < count; i++) out[i] = fn(last === 0 ? 0 : i / last);\n return out;\n}\n\n/** Every built-in name, for the picker's list. */\nexport const EASING_NAMES = Object.keys(EASINGS) as EasingName[];\n","import type { ReactElement } from 'react';\nimport type { EasingSpec } from '@weasel-js/core';\nimport s from './Timeline.module.css';\nimport { EASING_NAMES, easingBezier, easingLabel, sampleEasing } from './easingSpec';\n\n/** Samples drawn in the inline curve preview. */\nconst PREVIEW_SAMPLES = 24;\n\n/** Control points for the named curves the picker can convert. A name the table\n * does not cover converts to the CSS default rather than refusing. */\nconst BEZIER_OF: Partial<Record<string, readonly [number, number, number, number]>> = {\n linear: [0, 0, 1, 1],\n easeInQuad: [0.11, 0, 0.5, 0],\n easeOutQuad: [0.5, 1, 0.89, 1],\n easeInOutQuad: [0.45, 0, 0.55, 1],\n easeInCubic: [0.32, 0, 0.67, 0],\n easeOutCubic: [0.33, 1, 0.68, 1],\n easeInOutCubic: [0.65, 0, 0.35, 1],\n easeInSine: [0.12, 0, 0.39, 0],\n easeOutSine: [0.61, 1, 0.88, 1],\n easeInOutSine: [0.37, 0, 0.63, 1],\n};\n\nconst DEFAULT_BEZIER: readonly [number, number, number, number] = [0.25, 0.1, 0.25, 1];\n\nexport interface EasingPickerProps {\n value: EasingSpec | undefined;\n onChange: (next: EasingSpec | undefined) => void;\n}\n\nexport function EasingPicker(props: EasingPickerProps): ReactElement {\n const { value, onChange } = props;\n const bezier = easingBezier(value);\n const label = easingLabel(value);\n const named = bezier === null && (EASING_NAMES as string[]).includes(label);\n const selectValue = bezier !== null ? 'custom' : named ? label : 'linear';\n\n const points = sampleEasing(value, PREVIEW_SAMPLES)\n .map((v, i) => `${(i / (PREVIEW_SAMPLES - 1)) * 100},${100 - v * 100}`)\n .join(' ');\n\n return (\n <div className={s.easingPicker}>\n <label>\n Easing\n <select\n value={selectValue}\n onChange={(e) => onChange(e.target.value === 'linear' ? undefined : e.target.value as EasingSpec)}\n >\n <option value=\"linear\">linear</option>\n {EASING_NAMES.filter((n) => n !== 'linear').map((n) => <option key={n} value={n}>{n}</option>)}\n {bezier !== null ? <option value=\"custom\">custom</option> : null}\n </select>\n </label>\n\n {bezier !== null ? <span className={s.easingLabel}>{label}</span> : (\n <button\n type=\"button\"\n className={s.transportButton}\n onClick={() => onChange({ bezier: BEZIER_OF[selectValue] ?? DEFAULT_BEZIER })}\n >\n Convert to bezier\n </button>\n )}\n\n <svg className={s.easingPreview} data-testid=\"easing-preview\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\">\n <polyline points={points} vectorEffect=\"non-scaling-stroke\" />\n </svg>\n </div>\n );\n}\n","import { niceStep } from '../Plot2D/ticks';\n\n/** A visible span of timeline time, in ms. */\nexport interface TimeWindow {\n from: number;\n to: number;\n}\n\nexport interface TimeScale {\n window: TimeWindow;\n widthPx: number;\n toPx(ms: number): number;\n toMs(px: number): number;\n}\n\n/** Narrowest window the user can zoom to, in ms. Below this the playhead and\n * the keys it sits between stop being separable at any sane track width. */\nconst MIN_SPAN_MS = 1;\n\nexport function createTimeScale(window: TimeWindow, widthPx: number): TimeScale {\n const span = window.to - window.from;\n const perMs = span === 0 ? 0 : widthPx / span;\n const perPx = widthPx === 0 ? 0 : span / widthPx;\n return {\n window,\n widthPx,\n toPx: (ms) => (ms - window.from) * perMs,\n toMs: (px) => window.from + px * perPx,\n };\n}\n\n/** Where `ms` sits in the window, as a fraction. The width-free half of\n * `createTimeScale` — a CSS `left: %` needs no pixel width, and asking for one\n * is what drove three copies of this arithmetic into the lane and the ruler. */\nexport function toFraction(window: TimeWindow, ms: number): number {\n const span = window.to - window.from;\n return span === 0 ? 0 : (ms - window.from) / span;\n}\n\n/** `toFraction` as a CSS percentage. */\nexport function toPercent(window: TimeWindow, ms: number): string {\n return `${toFraction(window, ms) * 100}%`;\n}\n\n/** A duration as a fraction of the window. Distinct from `toFraction`, which\n * measures a position and so subtracts `window.from`. */\nexport function spanFraction(window: TimeWindow, ms: number): number {\n const span = window.to - window.from;\n return span === 0 ? 0 : ms / span;\n}\n\n/** A duration as a CSS percentage, for a width. */\nexport function spanPercent(window: TimeWindow, ms: number): string {\n return `${spanFraction(window, ms) * 100}%`;\n}\n\nfunction clampWindow(w: TimeWindow, bounds: TimeWindow): TimeWindow {\n const span = Math.min(w.to - w.from, bounds.to - bounds.from);\n let from = w.from;\n if (from < bounds.from) from = bounds.from;\n if (from + span > bounds.to) from = bounds.to - span;\n return { from, to: from + span };\n}\n\n/** Scale the window by `factor` about `atMs`, which stays at the same fraction\n * of the track. `factor < 1` zooms in. */\nexport function zoomWindow(\n w: TimeWindow, atMs: number, factor: number, bounds: TimeWindow,\n): TimeWindow {\n const span = w.to - w.from;\n const maxSpan = bounds.to - bounds.from;\n const nextSpan = Math.min(maxSpan, Math.max(MIN_SPAN_MS, span * factor));\n const frac = span === 0 ? 0.5 : (atMs - w.from) / span;\n return clampWindow({ from: atMs - frac * nextSpan, to: atMs + (1 - frac) * nextSpan }, bounds);\n}\n\n/** Shift the window by `byMs`, preserving its span. */\nexport function panWindow(w: TimeWindow, byMs: number, bounds: TimeWindow): TimeWindow {\n return clampWindow({ from: w.from + byMs, to: w.to + byMs }, bounds);\n}\n\n/** Minimum gap between time ticks, in px — the ruler's and the graph grid's. */\nexport const TICK_SPACING_PX = 64;\n\n/** Ruler tick times inside `w`, spaced at least `minSpacingPx` apart. */\nexport function tickTimes(w: TimeWindow, widthPx: number, minSpacingPx: number): number[] {\n const span = w.to - w.from;\n if (widthPx <= 0 || span <= 0) return [];\n const step = niceStep((minSpacingPx / widthPx) * span);\n const out: number[] = [];\n for (let t = Math.ceil(w.from / step) * step; t <= w.to + 1e-9; t += step) {\n out.push(Math.round(t / step) * step);\n }\n return out;\n}\n","import { useLayoutEffect, useMemo, useRef, useState, type ReactElement } from 'react';\nimport type { Keyframe } from '@weasel-js/core';\nimport { LayeredCurveEditor } from '../CurveEditor/LayeredCurveEditor';\nimport {\n applyKeyframeDrag, createKeyframeLayer, type KeyframeLayerState,\n} from '../CurveEditor/createKeyframeLayer';\nimport s from './Timeline.module.css';\nimport { TICK_SPACING_PX, tickTimes, type TimeWindow } from './timeScale';\n\n/** Keeps the extreme keys inside the lane: at the very edge a key centers on\n * the lane's border and hangs half into its neighbor. As a percentage of\n * the lane's height, applied top and bottom. */\nconst V_INSET_PCT = 8;\n\n/** One arrow-key step, in ms; shift multiplies by ten. */\nconst KEY_STEP_MS = 10;\n\nexport interface LaneGraphProps {\n keys: readonly Keyframe<number>[];\n label: string;\n window: TimeWindow;\n /** Ruler time of this track's zero. */\n offset: number;\n /** Ruler times a dragged key snaps to. */\n snapTimes: readonly number[];\n selection: number | null;\n selectedSegment: number | null;\n onSelect: (keyIndex: number) => void;\n onSelectSegment?: (keyIndex: number) => void;\n /** Live during a key drag. */\n onKeysInput?: (keys: readonly Keyframe<number>[]) => void;\n /** Once per edit: a drag's end, a handle's release, a key press. */\n onKeysCommit: (keys: readonly Keyframe<number>[]) => void;\n}\n\n/** The value range a lane plots: its keys' extent, padded so no key sits on\n * the border. A flat track gets a unit span so it still has a middle. */\nfunction valueRange(keys: readonly Keyframe<number>[]): [number, number] {\n const values = keys.map((k) => k.value);\n const lo = Math.min(...values);\n const hi = Math.max(...values);\n const span = hi - lo || 1;\n const pad = (span * V_INSET_PCT) / (100 - 2 * V_INSET_PCT);\n return [lo - pad, lo + span + pad];\n}\n\n/** A numeric lane's graph: one keyframe layer on a curve editor, sized to the\n * lane and windowed to the ruler. */\nexport function LaneGraph(props: LaneGraphProps): ReactElement {\n const {\n keys, label, window: win, offset, snapTimes, selection, selectedSegment,\n onSelect, onSelectSegment, onKeysInput, onKeysCommit,\n } = props;\n\n const hostRef = useRef<HTMLDivElement | null>(null);\n const [size, setSize] = useState({ width: 0, height: 0 });\n useLayoutEffect(() => {\n const el = hostRef.current;\n if (!el) return;\n const update = (): void => {\n const r = el.getBoundingClientRect();\n setSize((prev) => (prev.width === r.width && prev.height === r.height ? prev : { width: r.width, height: r.height }));\n };\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const layer = useMemo(() => createKeyframeLayer({\n id: 'keys',\n label,\n formatX: (t) => `${Math.round(t)} ms`,\n // The layer works in track time; the snap candidates are ruler times.\n snapX: snapTimes.map((t) => t - offset),\n xClamp: [0, Infinity],\n step: { x: KEY_STEP_MS },\n }), [label, snapTimes, offset]);\n\n const committed = useMemo<KeyframeLayerState>(\n () => ({ keys, selectedKey: selection, selectedSegment, drag: null }),\n [keys, selection, selectedSegment],\n );\n // Held only while a gesture is in flight, so a consumer echoing live input\n // back through `keys` cannot move the keys out from under the drag.\n const [live, setLive] = useState<KeyframeLayerState | null>(null);\n const state = live ?? committed;\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const layers = useMemo(() => [{ layer, state: state as unknown }], [layer, state]);\n\n const onLayerChange = (_id: string, raw: unknown): void => {\n const next = raw as KeyframeLayerState;\n const prev = stateRef.current;\n if (next.selectedKey !== null && next.selectedKey !== prev.selectedKey) onSelect(next.selectedKey);\n if (next.selectedSegment !== null && next.selectedSegment !== prev.selectedSegment) onSelectSegment?.(next.selectedSegment);\n if (!next.drag) { setLive(null); return; }\n setLive(next);\n // A handle drag writes a fresh easing spec per move; publishing those\n // would grow the consumer's easing cache by one entry per pixel.\n if (next.drag.kind !== 'key') return;\n const applied = applyKeyframeDrag(next).keys;\n if (applied !== next.keys) onKeysInput?.(applied);\n };\n\n const onLayerCommit = (_id: string, raw: unknown, rawPrev: unknown): void => {\n setLive(null);\n const next = raw as KeyframeLayerState;\n if (next.keys !== (rawPrev as KeyframeLayerState).keys) onKeysCommit(next.keys);\n };\n\n const [yLo, yHi] = valueRange(state.keys);\n const ticks = size.width > 0 ? tickTimes(win, size.width, TICK_SPACING_PX) : [];\n\n return (\n <div ref={hostRef} className={s.graphHost}>\n {size.width > 0 && size.height > 0 ? (\n <LayeredCurveEditor\n className={s.graph}\n aria-label={`${label} graph`}\n layers={layers}\n onLayerChange={onLayerChange}\n onLayerCommit={onLayerCommit}\n width={size.width}\n height={size.height}\n xRange={[win.from - offset, win.to - offset]}\n yRange={[yLo, yHi]}\n grid={false}\n axes={false}\n // The ruler's ticks, carried into track time.\n xTicks={{ values: ticks.map((t) => t - offset), labels: false }}\n // Clears a key at the track's start edge, which hangs into the gutter.\n yTicks={{ labels: 'outside', gap: 10 }}\n history={false}\n />\n ) : null}\n </div>\n );\n}\n","import { useEffect, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type PointerEvent as ReactPointerEvent, type ReactElement } from 'react';\nimport { openPointerSession, type EventTrack, type Keyframe, type PointerSession, type SampledTrack, type TimelineTrack } from '@weasel-js/core';\nimport { DisclosureMark } from '../Disclosure';\nimport s from './Timeline.module.css';\nimport { createTimeScale, spanPercent, toPercent, type TimeWindow } from './timeScale';\nimport { SNAP_RADIUS_PX, snapToNearest } from '../../snap';\nimport { LaneGraph } from './LaneGraph';\nimport type { LaneRow } from './lanes';\n\n/** One arrow-key step, in ms; shift multiplies by ten. */\nconst KEY_STEP_MS = 10;\n\nexport interface LaneProps {\n row: LaneRow;\n window: TimeWindow;\n mode: 'dope' | 'graph';\n /** Index of the selected key on THIS row, or null. */\n selection: number | null;\n onSelect: (keyIndex: number) => void;\n /** Live during a dope-sheet drag. */\n onKeyInput: (keyIndex: number, toMs: number) => void;\n /** Once, at the end of a dope-sheet gesture. */\n onKeyCommit: (keyIndex: number, toMs: number) => void;\n /** Live during a graph-mode key drag: the row's whole key list. */\n onKeysInput?: (keys: readonly Keyframe<number>[]) => void;\n /** Once per graph-mode edit: the row's whole key list. */\n onKeysCommit?: (keys: readonly Keyframe<number>[]) => void;\n onInsert: (atMs: number) => void;\n onToggleExpand: () => void;\n expanded: boolean;\n /** Times a dragged key snaps to. */\n snapTimes: readonly number[];\n /** Index of the key a selected segment runs INTO, or null. */\n selectedSegment?: number | null;\n onSelectSegment?: (keyIndex: number) => void;\n}\n\nfunction entryTimes(row: LaneRow): number[] {\n if (row.kind === 'sampled') return (row.track as SampledTrack<unknown>).keys.map((k) => k.t);\n if (row.kind === 'event') return (row.track as EventTrack).events.map((e) => e.t);\n return [];\n}\n\nexport function Lane(props: LaneProps): ReactElement {\n const {\n row, window: win, mode, selection, onSelect, onKeyInput, onKeyCommit, onInsert, onToggleExpand, expanded, snapTimes,\n selectedSegment = null, onSelectSegment, onKeysInput, onKeysCommit,\n } = props;\n const trackRef = useRef<HTMLDivElement | null>(null);\n const sessionRef = useRef<PointerSession | null>(null);\n useEffect(() => () => { sessionRef.current?.cancel(); }, []);\n\n // Where the dragged key would land. Owned here rather than derived from the\n // tracks prop, so a drag previews whether or not the consumer wires\n // `onKeyInput` — the committed key stays put underneath as the origin.\n const [drag, setDrag] = useState<{ keyIndex: number; t: number } | null>(null);\n\n const pct = (ms: number): string => toPercent(win, ms + row.offset);\n\n const msAt = (clientX: number): number => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect) return win.from;\n return createTimeScale(win, rect.width).toMs(clientX - rect.left) - row.offset;\n };\n\n const snapPxToMs = (): number => {\n const width = trackRef.current?.getBoundingClientRect().width ?? 0;\n const scale = createTimeScale(win, width);\n return scale.toMs(SNAP_RADIUS_PX) - scale.toMs(0);\n };\n\n // Only a numeric sampled row has an honest value axis to graph.\n const graph = mode === 'graph' && row.numeric;\n const sampledKeys = row.kind === 'sampled' ? (row.track as SampledTrack<number>).keys : [];\n\n const onKeyPointerDown = (i: number) => (e: ReactPointerEvent<HTMLDivElement>): void => {\n if (e.button !== 0) return;\n e.stopPropagation();\n onSelect(i);\n\n // `snapTimes` are ruler times and `msAt` is track-local, so a nested row\n // has to cross into ruler space to snap and back out to commit.\n const at = (ev: { clientX: number; altKey: boolean }): number => {\n const raw = Math.max(0, msAt(ev.clientX));\n return ev.altKey ? raw : snapToNearest(raw + row.offset, snapTimes, snapPxToMs()) - row.offset;\n };\n\n setDrag({ keyIndex: i, t: times[i] });\n\n const end = (): void => {\n setDrag(null);\n sessionRef.current = null;\n };\n // No pointer capture — see `Ruler`, same idiom across the timeline.\n sessionRef.current?.cancel();\n sessionRef.current = openPointerSession(e.currentTarget, e, {\n onMove: (ev) => {\n setDrag({ keyIndex: i, t: at(ev) });\n onKeyInput(i, at(ev));\n },\n onEnd: (ev) => {\n onKeyCommit(i, at(ev));\n end();\n },\n onCancel: end,\n }, { capture: false });\n };\n\n const onKeyDown = (i: number, t: number) => (e: ReactKeyboardEvent<HTMLDivElement>): void => {\n const step = KEY_STEP_MS * (e.shiftKey ? 10 : 1);\n if (e.key === 'ArrowRight') { e.preventDefault(); onKeyCommit(i, t + step); }\n if (e.key === 'ArrowLeft') { e.preventDefault(); onKeyCommit(i, Math.max(0, t - step)); }\n };\n\n const times = entryTimes(row);\n\n return (\n <div className={s.lane} data-depth={row.depth} data-mode={mode} data-graph={graph ? 'true' : undefined}>\n <div className={s.laneLabel}>\n {row.kind === 'timeline' ? (\n <span\n role=\"button\"\n tabIndex={0}\n aria-expanded={expanded}\n data-testid=\"timeline-disclosure\"\n className={s.disclosure}\n onClick={onToggleExpand}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onToggleExpand(); } }}\n >\n <DisclosureMark open={expanded} />\n </span>\n ) : null}\n {row.label}\n </div>\n <div\n className={s.laneTrack}\n ref={trackRef}\n data-testid=\"timeline-lane-track\"\n onDoubleClick={(e) => { if (row.kind === 'sampled') onInsert(Math.max(0, msAt(e.clientX))); }}\n >\n {graph ? (\n <LaneGraph\n keys={sampledKeys}\n label={row.label}\n window={win}\n offset={row.offset}\n snapTimes={snapTimes}\n selection={selection}\n selectedSegment={selectedSegment}\n onSelect={onSelect}\n onSelectSegment={onSelectSegment}\n onKeysInput={onKeysInput}\n onKeysCommit={(keys) => onKeysCommit?.(keys)}\n />\n ) : (\n <>\n {row.kind === 'timeline' ? (\n <div\n className={s.nestedBar}\n data-testid=\"timeline-nested\"\n style={{ left: pct(0), width: spanPercent(win, (row.track as TimelineTrack).timeline.duration ?? 0) }}\n />\n ) : null}\n {row.kind === 'sampled' ? sampledKeys.slice(1).map((k, idx) => {\n const i = idx + 1;\n return (\n <div\n key={`seg-${i}`}\n role=\"button\"\n tabIndex={0}\n aria-label={`${row.label} segment into ${Math.round(k.t)} ms`}\n aria-current={selectedSegment === i ? 'true' : undefined}\n data-testid=\"timeline-segment\"\n className={s.segment}\n style={{ left: pct(sampledKeys[i - 1].t), width: spanPercent(win, k.t - sampledKeys[i - 1].t) }}\n onClick={() => onSelectSegment?.(i)}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onSelectSegment?.(i); } }}\n />\n );\n }) : null}\n {times.map((t, i) => (\n <div\n key={i}\n role=\"button\"\n tabIndex={0}\n aria-label={`${row.label} key at ${Math.round(t)} ms`}\n aria-current={selection === i ? 'true' : undefined}\n data-testid={row.kind === 'event' ? 'timeline-event' : 'timeline-key'}\n data-dragging={drag?.keyIndex === i ? 'true' : undefined}\n className={row.kind === 'event' ? s.eventMark : s.key}\n style={{ left: pct(t) }}\n onPointerDown={onKeyPointerDown(i)}\n onKeyDown={onKeyDown(i, t)}\n />\n ))}\n {drag ? (\n <div\n aria-hidden=\"true\"\n data-testid=\"timeline-key-ghost\"\n className={row.kind === 'event' ? s.eventGhost : s.keyGhost}\n style={{ left: pct(drag.t) }}\n />\n ) : null}\n </>\n )}\n </div>\n </div>\n );\n}\n","import { useEffect, useLayoutEffect, useRef, useState, type PointerEvent as ReactPointerEvent, type ReactElement, type WheelEvent as ReactWheelEvent } from 'react';\nimport { openPointerSession, type PointerSession } from '@weasel-js/core';\nimport s from './Timeline.module.css';\nimport { createTimeScale, panWindow, TICK_SPACING_PX, tickTimes, toPercent, zoomWindow, type TimeWindow } from './timeScale';\n\n/** One wheel notch's zoom factor. */\nconst ZOOM_STEP = 0.0015;\n\nexport interface RulerProps {\n window: TimeWindow;\n /** The full extent the window may cover — normally `{ from: 0, to: duration }`. */\n bounds: TimeWindow;\n playhead: number;\n onScrub: (t: number) => void;\n onWindowChange: (w: TimeWindow) => void;\n}\n\nfunction formatMs(ms: number): string {\n if (ms >= 1000) return `${(ms / 1000).toFixed(ms % 1000 === 0 ? 0 : 2)}s`;\n return `${Math.round(ms)}ms`;\n}\n\nexport function Ruler(props: RulerProps): ReactElement {\n const { window: win, bounds, playhead, onScrub, onWindowChange } = props;\n const trackRef = useRef<HTMLDivElement | null>(null);\n const sessionRef = useRef<PointerSession | null>(null);\n useEffect(() => () => { sessionRef.current?.cancel(); }, []);\n\n // Re-render once the track is mounted so ticks lay out against its real\n // width — `trackRef.current` is null on the render that first attaches it.\n const [width, setWidth] = useState(0);\n useLayoutEffect(() => {\n const el = trackRef.current;\n if (!el) return;\n const update = (): void => setWidth(el.getBoundingClientRect().width);\n update();\n if (typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const widthOf = (): number => trackRef.current?.getBoundingClientRect().width ?? 0;\n const msAt = (clientX: number): number => {\n const rect = trackRef.current?.getBoundingClientRect();\n if (!rect) return win.from;\n const scale = createTimeScale(win, rect.width);\n const raw = scale.toMs(clientX - rect.left);\n return Math.min(win.to, Math.max(win.from, raw));\n };\n\n // `capture: false`: the session tracks the pointer off the ruler on its own,\n // and capture would retarget pointerup and kill the click on non-native\n // children of the scrubbed track.\n const onPointerDown = (e: ReactPointerEvent<HTMLDivElement>): void => {\n if (e.button !== 0) return;\n onScrub(msAt(e.clientX));\n\n sessionRef.current?.cancel();\n const end = (): void => { sessionRef.current = null; };\n sessionRef.current = openPointerSession(e.currentTarget, e, {\n onMove: (ev) => { onScrub(msAt(ev.clientX)); },\n onEnd: end,\n onCancel: end,\n }, { capture: false });\n };\n\n const onWheel = (e: ReactWheelEvent<HTMLDivElement>): void => {\n if (e.ctrlKey) {\n onWindowChange(zoomWindow(win, msAt(e.clientX), Math.exp(e.deltaY * ZOOM_STEP), bounds));\n } else {\n const width = widthOf();\n const perPx = width === 0 ? 0 : (win.to - win.from) / width;\n onWindowChange(panWindow(win, e.deltaY * perPx, bounds));\n }\n };\n\n const ticks = tickTimes(win, width, TICK_SPACING_PX);\n const pct = (ms: number): string => toPercent(win, ms);\n\n return (\n <div\n className={s.ruler}\n ref={trackRef}\n data-testid=\"timeline-ruler\"\n onPointerDown={onPointerDown}\n onWheel={onWheel}\n >\n {ticks.map((t) => (\n <span\n key={t}\n className={s.tick}\n data-testid=\"timeline-tick\"\n style={{ left: pct(t) }}\n >\n {formatMs(t)}\n </span>\n ))}\n <div\n className={s.playhead}\n data-testid=\"timeline-playhead\"\n style={{ left: pct(playhead) }}\n />\n </div>\n );\n}\n","import type { ReactElement } from 'react';\nimport { DetentSlider } from '../DetentSlider';\nimport { PauseIcon, PlayIcon } from '../../icons';\nimport s from './Timeline.module.css';\n\n/** Playback rates the transport offers. */\nconst RATES = [0.25, 0.5, 1, 2, 4] as const;\n\nexport interface TransportProps {\n paused: boolean;\n loop: boolean | number;\n rate: number;\n playhead: number;\n duration: number;\n onPlay: () => void;\n onPause: () => void;\n onLoopChange: (loop: boolean | number) => void;\n onRateChange: (rate: number) => void;\n}\n\nconst seconds = (ms: number): string => `${(ms / 1000).toFixed(2)}s`;\n\nexport function Transport(props: TransportProps): ReactElement {\n const { paused, loop, rate, playhead, duration, onPlay, onPause, onLoopChange, onRateChange } = props;\n const looping = loop !== false && loop !== 0;\n // The handle's scale is whatever anything holding it set, so an off-list rate\n // gets its own detent — `DetentSlider` would otherwise round it to the\n // nearest and label the thumb with a rate the timeline is not running at.\n const rates = RATES.includes(rate as typeof RATES[number])\n ? (RATES as readonly number[])\n : [...RATES, rate].sort((a, b) => a - b);\n\n return (\n <div className={s.transport}>\n <button\n type=\"button\"\n className={s.transportButton}\n aria-label={paused ? 'Play' : 'Pause'}\n onClick={paused ? onPlay : onPause}\n >\n {paused ? <PlayIcon size={14} /> : <PauseIcon size={14} />}\n </button>\n\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={looping}\n aria-label=\"Loop\"\n className={s.transportButton}\n onClick={() => onLoopChange(!looping)}\n >\n ⟲\n </button>\n\n <div className={s.rate}>\n Rate\n <DetentSlider\n ariaLabel=\"Rate\"\n items={rates}\n value={rate}\n onChange={onRateChange}\n formatLabel={(r) => `${r}x`}\n labels=\"none\"\n className={s.rateSlider}\n />\n <span className={s.rateReadout}>{rate}x</span>\n </div>\n\n <span className={s.time} data-testid=\"timeline-time\">\n {seconds(playhead)} / {seconds(duration)}\n </span>\n </div>\n );\n}\n","import type { SampledTrack, Track } from '@weasel-js/core';\n\nexport interface LaneRow {\n /** Stable across re-renders and edits: the dotted index path. */\n key: string;\n /** Index path into the track tree, outermost first. */\n path: number[];\n track: Track;\n label: string;\n /** Nesting depth; 0 for a top-level track. */\n depth: number;\n /** Accumulated `at` from every nested parent, in ms. A key drawn on this row\n * sits at `offset + key.t` on the ruler. */\n offset: number;\n kind: Track['kind'];\n /** True only for a sampled track whose every key value is a number — the\n * sole case where a value axis has an honest meaning. */\n numeric: boolean;\n}\n\nfunction isNumeric(track: Track): boolean {\n if (track.kind !== 'sampled') return false;\n const keys = (track as SampledTrack<unknown>).keys;\n return keys.length > 0 && keys.every((k) => typeof k.value === 'number');\n}\n\n/** Flatten the track tree to rows, descending only into expanded nested\n * timelines. `expanded` holds the `key` of each open nested row. */\nexport function buildLanes(\n tracks: readonly Track[],\n expanded: ReadonlySet<string>,\n): LaneRow[] {\n const out: LaneRow[] = [];\n const walk = (list: readonly Track[], path: number[], depth: number, offset: number): void => {\n list.forEach((track, i) => {\n const nextPath = [...path, i];\n const key = nextPath.join('.');\n out.push({\n key,\n path: nextPath,\n track,\n label: track.label ?? `${track.kind} ${i}`,\n depth,\n offset,\n kind: track.kind,\n numeric: isNumeric(track),\n });\n if (track.kind === 'timeline' && expanded.has(key)) {\n walk(track.timeline.tracks, nextPath, depth + 1, offset + track.at);\n }\n });\n };\n walk(tracks, [], 0, 0);\n return out;\n}\n\n/** The track at an index path, or `undefined` when the path leaves the tree. */\nexport function trackAtPath(tracks: readonly Track[], path: readonly number[]): Track | undefined {\n let list: readonly Track[] = tracks;\n let found: Track | undefined;\n for (const i of path) {\n found = list[i];\n if (!found) return undefined;\n list = found.kind === 'timeline' ? found.timeline.tracks : [];\n }\n return found;\n}\n","import { sampleTrack, type EasingSpec, type EventTrack, type Keyframe, type SampledTrack, type TimelineTrack, type Track } from '@weasel-js/core';\nimport { trackAtPath } from './lanes';\n\nexport interface KeySelection {\n /** Index path into the track tree, outermost first — a `LaneRow.path`. A\n * top-level track is `[i]`; a track inside the nested timeline at `i` is\n * `[i, j]`. */\n trackPath: readonly number[];\n keyIndex: number;\n}\n\nexport interface KeyEdit {\n tracks: Track[];\n selection: KeySelection | null;\n}\n\n/** True when two index paths address the same track. */\nexport function samePath(a: readonly number[], b: readonly number[]): boolean {\n return a.length === b.length && a.every((n, i) => n === b[i]);\n}\n\n/** Shallow-clone one track, replacing only its key list. `onTick`, `fire`,\n * `interpolate` and `interpolator` survive as references, which is what lets a\n * running timeline take an edited track without rewiring. */\nfunction withKeys(track: Track, keys: Keyframe<unknown>[]): Track {\n return { ...(track as SampledTrack<unknown>), keys } as Track;\n}\n\nfunction withEvents(track: Track, events: EventTrack['events']): Track {\n return { ...(track as EventTrack), events } as Track;\n}\n\n/** Replace the track at `path`, cloning the timeline tracks along the way so\n * the caller's tree is untouched at every level, not just the top. */\nfunction replaceAtPath(tracks: readonly Track[], path: readonly number[], next: Track): Track[] {\n const out = tracks.slice();\n const [i, ...rest] = path;\n if (rest.length === 0) {\n out[i] = next;\n return out;\n }\n const parent = out[i];\n if (parent?.kind !== 'timeline') return out;\n const tt = parent as TimelineTrack;\n out[i] = {\n ...tt,\n timeline: { ...tt.timeline, tracks: replaceAtPath(tt.timeline.tracks, rest, next) },\n };\n return out;\n}\n\n/** Move a key or an event crossing to `toMs`, clamped at zero. `toMs` is in the\n * addressed track's own time, not the ruler's — a nested track's keys are\n * measured from its parent's `at`.\n *\n * Re-sorts, and reports the moved entry's new index. `sampleTrack` binary-\n * searches without sorting first, so a drag past a neighbour that left the list\n * unsorted would sample the wrong segment and raise nothing. */\nexport function moveKey(\n tracks: readonly Track[], sel: KeySelection, toMs: number,\n): KeyEdit {\n const track = trackAtPath(tracks, sel.trackPath);\n const t = Math.max(0, toMs);\n\n if (track?.kind === 'sampled') {\n const st = track as SampledTrack<unknown>;\n const moved = { ...st.keys[sel.keyIndex], t };\n const keys = st.keys.filter((_, i) => i !== sel.keyIndex);\n const at = keys.findIndex((k) => k.t > t);\n const keyIndex = at === -1 ? keys.length : at;\n keys.splice(keyIndex, 0, moved);\n return {\n tracks: replaceAtPath(tracks, sel.trackPath, withKeys(track, keys)),\n selection: { trackPath: sel.trackPath, keyIndex },\n };\n }\n\n if (track?.kind === 'event') {\n const et = track as EventTrack;\n const moved = { ...et.events[sel.keyIndex], t };\n const events = et.events.filter((_, i) => i !== sel.keyIndex);\n const at = events.findIndex((e) => e.t > t);\n const keyIndex = at === -1 ? events.length : at;\n events.splice(keyIndex, 0, moved);\n return {\n tracks: replaceAtPath(tracks, sel.trackPath, withEvents(track, events)),\n selection: { trackPath: sel.trackPath, keyIndex },\n };\n }\n\n return { tracks: tracks.slice(), selection: sel };\n}\n\n/** Insert a key at `atMs`, seeded with whatever the track already reads there\n * so inserting alone never changes the motion. */\nexport function insertKey(\n tracks: readonly Track[], trackPath: readonly number[], atMs: number,\n): KeyEdit {\n const track = trackAtPath(tracks, trackPath);\n if (track?.kind !== 'sampled') return { tracks: tracks.slice(), selection: null };\n\n const st = track as SampledTrack<unknown>;\n const t = Math.max(0, atMs);\n const value = st.keys.length === 0 ? 0 : sampleTrack(st, t);\n const keys = st.keys.slice();\n const at = keys.findIndex((k) => k.t > t);\n const keyIndex = at === -1 ? keys.length : at;\n keys.splice(keyIndex, 0, { t, value });\n return {\n tracks: replaceAtPath(tracks, trackPath, withKeys(track, keys)),\n selection: { trackPath, keyIndex },\n };\n}\n\n/** Remove a key, selecting the one before it. */\nexport function deleteKey(tracks: readonly Track[], sel: KeySelection): KeyEdit {\n const track = trackAtPath(tracks, sel.trackPath);\n if (track?.kind !== 'sampled') return { tracks: tracks.slice(), selection: sel };\n\n const st = track as SampledTrack<unknown>;\n const keys = st.keys.filter((_, i) => i !== sel.keyIndex);\n return {\n tracks: replaceAtPath(tracks, sel.trackPath, withKeys(track, keys)),\n selection: keys.length === 0\n ? null\n : { trackPath: sel.trackPath, keyIndex: Math.max(0, sel.keyIndex - 1) },\n };\n}\n\n/** Set the easing shaping the approach INTO the selected key. */\nexport function setKeyEasing(\n tracks: readonly Track[], sel: KeySelection, easing: EasingSpec | undefined,\n): Track[] {\n const track = trackAtPath(tracks, sel.trackPath);\n if (track?.kind !== 'sampled') return tracks.slice();\n\n const st = track as SampledTrack<unknown>;\n const keys = st.keys.slice();\n const { easing: _drop, ...rest } = keys[sel.keyIndex];\n keys[sel.keyIndex] = easing === undefined ? rest : { ...rest, easing };\n return replaceAtPath(tracks, sel.trackPath, withKeys(track, keys));\n}\n\n/** Replace a sampled track's whole key list, keeping its callbacks. */\nexport function setKeys(\n tracks: readonly Track[], trackPath: readonly number[], keys: readonly Keyframe<unknown>[],\n): Track[] {\n const track = trackAtPath(tracks, trackPath);\n if (track?.kind !== 'sampled') return tracks.slice();\n return replaceAtPath(tracks, trackPath, withKeys(track, keys.slice()));\n}\n\n/** Set the selected key's value, leaving its time alone. */\nexport function setKeyValue(\n tracks: readonly Track[], sel: KeySelection, value: unknown,\n): Track[] {\n const track = trackAtPath(tracks, sel.trackPath);\n if (track?.kind !== 'sampled') return tracks.slice();\n\n const st = track as SampledTrack<unknown>;\n const keys = st.keys.slice();\n keys[sel.keyIndex] = { ...keys[sel.keyIndex], value };\n return replaceAtPath(tracks, sel.trackPath, withKeys(track, keys));\n}\n\nexport { snapToNearest as snapTime } from '../../snap';\n","import { useMemo, useState, type KeyboardEvent as ReactKeyboardEvent, type ReactElement, type ReactNode } from 'react';\nimport type { EasingSpec, Keyframe, SampledTrack, Track } from '@weasel-js/core';\nimport s from './Timeline.module.css';\nimport { EasingPicker } from './EasingPicker';\nimport { Lane } from './Lane';\nimport { Ruler } from './Ruler';\nimport { Transport, type TransportProps } from './Transport';\nimport { buildLanes, trackAtPath } from './lanes';\nimport { deleteKey, insertKey, moveKey, samePath, setKeyEasing, setKeys, setKeyValue, type KeySelection } from './keys';\nimport type { TimeWindow } from './timeScale';\n\nexport type { KeySelection } from './keys';\nexport type { TimeWindow } from './timeScale';\n\nexport interface KeyEditorCtx<T = unknown> {\n key: Keyframe<T>;\n track: SampledTrack<T>;\n selection: KeySelection;\n /** Replace the selected key; routed through this component's `onChange`. */\n commit: (next: Keyframe<T>) => void;\n /** Set the easing shaping the approach into this key. */\n setEasing: (easing: EasingSpec | undefined) => void;\n}\n\nexport interface TimelineProps {\n tracks: readonly Track[];\n duration: number;\n playhead: number;\n\n mode?: 'dope' | 'graph';\n onModeChange?: (mode: 'dope' | 'graph') => void;\n\n /** Live during a drag — wire for preview, do not write to history. */\n onInput?: (next: Track[]) => void;\n /** Committed at gesture end: one call per gesture. */\n onChange: (next: Track[]) => void;\n onScrub: (t: number) => void;\n\n /** `false` hides the transport. */\n transport?: Omit<TransportProps, 'playhead' | 'duration'> | false;\n selection?: KeySelection | null;\n onSelect?: (sel: KeySelection | null) => void;\n renderKeyEditor?: (ctx: KeyEditorCtx) => ReactNode;\n\n window?: TimeWindow;\n onWindowChange?: (w: TimeWindow) => void;\n\n label?: ReactNode;\n className?: string;\n}\n\nexport function Timeline(props: TimelineProps): ReactElement {\n const {\n tracks, duration, playhead,\n onInput, onChange, onScrub,\n renderKeyEditor, label, className,\n } = props;\n\n const [expanded, setExpanded] = useState<ReadonlySet<string>>(() => new Set());\n const [ownWindow, setOwnWindow] = useState<TimeWindow>({ from: 0, to: duration });\n const [ownSelection, setOwnSelection] = useState<KeySelection | null>(null);\n const [segmentSelection, setSegmentSelection] = useState<KeySelection | null>(null);\n\n const win = props.window ?? ownWindow;\n const setWindow = props.onWindowChange ?? setOwnWindow;\n const selection = props.selection !== undefined ? props.selection : ownSelection;\n const setSelection = props.onSelect ?? setOwnSelection;\n\n const bounds: TimeWindow = { from: 0, to: duration };\n const rows = useMemo(() => buildLanes(tracks, expanded), [tracks, expanded]);\n\n /** Every key time on every row — what a dragged key snaps to. */\n const snapTimes = useMemo(() => {\n const out = new Set<number>([0, duration]);\n for (const row of rows) {\n if (row.kind === 'sampled') for (const k of (row.track as SampledTrack<unknown>).keys) out.add(k.t + row.offset);\n }\n return [...out];\n }, [rows, duration]);\n\n const toggle = (key: string): void => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key); else next.add(key);\n return next;\n });\n };\n\n const onRootKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>): void => {\n if ((e.key === 'Delete' || e.key === 'Backspace') && selection) {\n e.preventDefault();\n const r = deleteKey(tracks, selection);\n onChange(r.tracks);\n setSelection(r.selection);\n }\n };\n\n const selectedTrack = selection ? trackAtPath(tracks, selection.trackPath) : undefined;\n const selectedKey = selectedTrack?.kind === 'sampled'\n ? (selectedTrack as SampledTrack<unknown>).keys[selection!.keyIndex]\n : undefined;\n\n const segmentTrack = segmentSelection ? trackAtPath(tracks, segmentSelection.trackPath) : undefined;\n const segmentKey = segmentTrack?.kind === 'sampled'\n ? (segmentTrack as SampledTrack<unknown>).keys[segmentSelection!.keyIndex]\n : undefined;\n\n return (\n <div\n className={[s.root, className].filter(Boolean).join(' ')}\n data-testid=\"timeline-root\"\n tabIndex={-1}\n onKeyDown={onRootKeyDown}\n >\n {label ? <div className={s.label}>{label}</div> : null}\n\n {props.transport === false ? null : (\n <div className={s.transportRow}>\n <Transport\n {...(props.transport ?? {\n paused: true, loop: false, rate: 1,\n onPlay: () => {}, onPause: () => {},\n onLoopChange: () => {}, onRateChange: () => {},\n })}\n playhead={playhead}\n duration={duration}\n />\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={(props.mode ?? 'dope') === 'graph'}\n aria-label=\"Graph mode\"\n className={s.transportButton}\n onClick={() => props.onModeChange?.((props.mode ?? 'dope') === 'graph' ? 'dope' : 'graph')}\n >\n Graph\n </button>\n </div>\n )}\n\n <div className={s.body}>\n <div className={s.gutter} />\n <div className={s.rulerWrap}>\n <Ruler\n window={win}\n bounds={bounds}\n playhead={playhead}\n onScrub={onScrub}\n onWindowChange={setWindow}\n />\n </div>\n </div>\n\n <div className={s.lanes}>\n {rows.map((row) => {\n const trackPath = row.path;\n return (\n <Lane\n key={row.key}\n row={row}\n window={win}\n mode={props.mode ?? 'dope'}\n selection={selection && samePath(selection.trackPath, trackPath) ? selection.keyIndex : null}\n expanded={expanded.has(row.key)}\n snapTimes={snapTimes}\n onToggleExpand={() => toggle(row.key)}\n onSelect={(keyIndex) => setSelection({ trackPath, keyIndex })}\n onKeyInput={(keyIndex, toMs) => {\n onInput?.(moveKey(tracks, { trackPath, keyIndex }, toMs).tracks);\n }}\n onKeyCommit={(keyIndex, toMs) => {\n const r = moveKey(tracks, { trackPath, keyIndex }, toMs);\n onChange(r.tracks);\n setSelection(r.selection);\n }}\n onKeysInput={(keys) => onInput?.(setKeys(tracks, trackPath, keys))}\n onKeysCommit={(keys) => onChange(setKeys(tracks, trackPath, keys))}\n onInsert={(atMs) => {\n const r = insertKey(tracks, trackPath, atMs);\n onChange(r.tracks);\n setSelection(r.selection);\n }}\n selectedSegment={segmentSelection && samePath(segmentSelection.trackPath, trackPath) ? segmentSelection.keyIndex : null}\n onSelectSegment={(keyIndex) => setSegmentSelection({ trackPath, keyIndex })}\n />\n );\n })}\n </div>\n\n {renderKeyEditor && selection && selectedKey && selectedTrack?.kind === 'sampled' ? (\n <div className={s.inspector}>\n {renderKeyEditor({\n key: selectedKey,\n track: selectedTrack as SampledTrack<unknown>,\n selection,\n commit: (next) => onChange(setKeyValue(tracks, selection, next.value)),\n setEasing: (easing) => onChange(setKeyEasing(tracks, selection, easing)),\n })}\n </div>\n ) : null}\n\n {segmentSelection && segmentKey ? (\n <div className={s.inspector}>\n <EasingPicker\n value={segmentKey.easing}\n onChange={(next) => onChange(setKeyEasing(tracks, segmentSelection, next))}\n />\n </div>\n ) : null}\n </div>\n );\n}\n","// OKLCH math from Björn Ottosson: https://bottosson.github.io/posts/oklab/\nimport { oklchDegToHex } from '@weasel-js/core';\n\n/**\n * A chroma envelope over lightness, as three linear segments: flat at `cBot`\n * below `lRange[0]`, rising to `cPeak` at `midL`, falling to `cTop` at\n * `lRange[1]`, flat beyond. Keeps a color ramp inside gamut at the light and\n * dark ends while staying saturated through the middle.\n */\nexport type ChromaCurve = {\n lRange: [number, number];\n midL: number;\n cBot: number;\n cPeak: number;\n cTop: number;\n};\n\n/** A single lightness/chroma sample. */\nexport type ChromaCurvePoint = { L: number; C: number };\n\n/**\n * Converts an OKLCH color to a gamut-clipped `#rrggbb` string. Hue is in\n * degrees, unlike the kit's OKLab helpers which take radians.\n */\nexport const oklchToHex = oklchDegToHex;\n\n/** Evaluates a {@link ChromaCurve} at a lightness, clamping outside its range. */\nexport function chromaAt(L: number, curve: ChromaCurve): number {\n const [lo, hi] = curve.lRange;\n if (L <= lo) return curve.cBot;\n if (L >= hi) return curve.cTop;\n if (L <= curve.midL) return curve.cBot + (curve.cPeak - curve.cBot) * ((L - lo) / (curve.midL - lo));\n return curve.cPeak + (curve.cTop - curve.cPeak) * ((L - curve.midL) / (hi - curve.midL));\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ComboBoxOption } from './components/ComboBox/ComboBox';\n\ntype Key = string | number;\n\n/** An option list keyed to the value type its combo box commits. */\nexport type AsyncOption<T extends Key> = ComboBoxOption & { value: T };\n\n/** Options for {@link useAsyncOptions}. */\nexport type UseAsyncOptionsProps<T extends Key> = {\n /**\n * Fetches the options for a query. The signal aborts when a later keystroke\n * supersedes this call, so a `fetch` should forward it.\n */\n load: (query: string, signal: AbortSignal) => Promise<ReadonlyArray<AsyncOption<T>>>;\n /** Quiet period before a query is sent. */\n debounceMs?: number;\n /** Shorter queries are not sent, and empty the options. */\n minLength?: number;\n};\n\n/** What {@link useAsyncOptions} returns, shaped to spread into a `ComboBox`. */\nexport type AsyncOptionsResult<T extends Key> = {\n options: ReadonlyArray<AsyncOption<T>>;\n isLoading: boolean;\n loadError: unknown | null;\n inputValue: string;\n onInputChange: (next: string) => void;\n};\n\n/**\n * Drives a combo box whose options come from a server: debounces the query,\n * discards responses overtaken by a later one, and reports a failed load\n * separately from an empty result.\n *\n * `options` holds the last *resolved* list and is never emptied to mean\n * \"working\", so the previous results stay on screen — and stay arrowable —\n * while the next request is in flight.\n */\nexport function useAsyncOptions<T extends Key = string>({\n load,\n debounceMs = 150,\n minLength = 0,\n}: UseAsyncOptionsProps<T>): AsyncOptionsResult<T> {\n const [inputValue, setInputValue] = useState('');\n const [options, setOptions] = useState<ReadonlyArray<AsyncOption<T>>>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [loadError, setLoadError] = useState<unknown | null>(null);\n\n // Read through a ref: a consumer passing an inline arrow re-creates `load`\n // every render, and depending on it directly would refire the request.\n const loadRef = useRef(load);\n loadRef.current = load;\n\n // A monotonic id per request, and the highest one whose result has been\n // applied. A liveness flag cannot do this job: two requests from adjacent\n // keystrokes are both live, so the slower one overwrites the newer result\n // if it lands second.\n const issued = useRef(0);\n const applied = useRef(0);\n const inFlight = useRef<AbortController | null>(null);\n\n useEffect(() => {\n if (inputValue.length < minLength) {\n inFlight.current?.abort();\n inFlight.current = null;\n applied.current = issued.current;\n setOptions([]);\n setIsLoading(false);\n setLoadError(null);\n return;\n }\n\n const timer = setTimeout(() => {\n const mine = ++issued.current;\n const controller = new AbortController();\n inFlight.current?.abort();\n inFlight.current = controller;\n setIsLoading(true);\n\n loadRef.current(inputValue, controller.signal).then(\n (next) => {\n if (mine <= applied.current) return;\n applied.current = mine;\n setOptions(next);\n setLoadError(null);\n setIsLoading(false);\n },\n (error: unknown) => {\n if (controller.signal.aborted || mine <= applied.current) return;\n applied.current = mine;\n setLoadError(error);\n setIsLoading(false);\n },\n );\n }, debounceMs);\n\n return () => clearTimeout(timer);\n }, [inputValue, debounceMs, minLength]);\n\n useEffect(() => () => inFlight.current?.abort(), []);\n\n const onInputChange = useCallback((next: string) => setInputValue(next), []);\n\n return { options, isLoading, loadError, inputValue, onInputChange };\n}\n"]}
|