dialkit 1.2.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +653 -6
- package/dist/dropdown-position.d.ts +15 -0
- package/dist/dropdown-position.js +22 -0
- package/dist/dropdown-position.js.map +1 -0
- package/dist/icons.d.ts +4 -1
- package/dist/icons.js +13 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +3796 -768
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +315 -10
- package/dist/index.d.ts +315 -10
- package/dist/index.js +3733 -711
- package/dist/index.js.map +1 -1
- package/dist/panel-drag.d.ts +19 -0
- package/dist/panel-drag.js +72 -0
- package/dist/panel-drag.js.map +1 -0
- package/dist/solid/index.d.ts +264 -5
- package/dist/solid/index.js +5277 -1632
- package/dist/solid/index.js.map +1 -1
- package/dist/store/index.cjs +329 -57
- package/dist/store/index.cjs.map +1 -1
- package/dist/store/index.d.cts +43 -4
- package/dist/store/index.d.ts +43 -4
- package/dist/store/index.js +321 -56
- package/dist/store/index.js.map +1 -1
- package/dist/styles.css +809 -7
- package/dist/svelte/components/ControlRenderer.svelte +5 -2
- package/dist/svelte/components/ControlRenderer.svelte.d.ts +2 -0
- package/dist/svelte/components/ControlRenderer.svelte.d.ts.map +1 -1
- package/dist/svelte/components/DialRoot.svelte +218 -16
- package/dist/svelte/components/DialRoot.svelte.d.ts +1 -0
- package/dist/svelte/components/DialRoot.svelte.d.ts.map +1 -1
- package/dist/svelte/components/Folder.svelte +24 -13
- package/dist/svelte/components/Folder.svelte.d.ts +1 -0
- package/dist/svelte/components/Folder.svelte.d.ts.map +1 -1
- package/dist/svelte/components/Panel.svelte +104 -71
- package/dist/svelte/components/Panel.svelte.d.ts +4 -0
- package/dist/svelte/components/Panel.svelte.d.ts.map +1 -1
- package/dist/svelte/components/PresetManager.svelte +5 -5
- package/dist/svelte/components/PresetManager.svelte.d.ts.map +1 -1
- package/dist/svelte/components/SelectControl.svelte +6 -14
- package/dist/svelte/components/SelectControl.svelte.d.ts.map +1 -1
- package/dist/svelte/components/Timeline/ClipPopover.svelte +206 -0
- package/dist/svelte/components/Timeline/ClipPopover.svelte.d.ts +26 -0
- package/dist/svelte/components/Timeline/ClipPopover.svelte.d.ts.map +1 -0
- package/dist/svelte/components/Timeline/DialTimeline.svelte +76 -0
- package/dist/svelte/components/Timeline/DialTimeline.svelte.d.ts +13 -0
- package/dist/svelte/components/Timeline/DialTimeline.svelte.d.ts.map +1 -0
- package/dist/svelte/components/Timeline/TimelineClip.svelte +233 -0
- package/dist/svelte/components/Timeline/TimelineClip.svelte.d.ts +24 -0
- package/dist/svelte/components/Timeline/TimelineClip.svelte.d.ts.map +1 -0
- package/dist/svelte/components/Timeline/TimelineSection.svelte +756 -0
- package/dist/svelte/components/Timeline/TimelineSection.svelte.d.ts +12 -0
- package/dist/svelte/components/Timeline/TimelineSection.svelte.d.ts.map +1 -0
- package/dist/svelte/components/Timeline/TimelineToggleButton.svelte +25 -0
- package/dist/svelte/components/Timeline/TimelineToggleButton.svelte.d.ts +4 -0
- package/dist/svelte/components/Timeline/TimelineToggleButton.svelte.d.ts.map +1 -0
- package/dist/svelte/components/TransitionControl.svelte +26 -11
- package/dist/svelte/components/TransitionControl.svelte.d.ts +9 -0
- package/dist/svelte/components/TransitionControl.svelte.d.ts.map +1 -1
- package/dist/svelte/createDialKit.svelte.d.ts +11 -1
- package/dist/svelte/createDialKit.svelte.d.ts.map +1 -1
- package/dist/svelte/createDialKit.svelte.js +61 -34
- package/dist/svelte/createDialTimeline.svelte.d.ts +4 -0
- package/dist/svelte/createDialTimeline.svelte.d.ts.map +1 -0
- package/dist/svelte/createDialTimeline.svelte.js +73 -0
- package/dist/svelte/index.d.ts +7 -3
- package/dist/svelte/index.d.ts.map +1 -1
- package/dist/svelte/index.js +4 -1
- package/dist/svelte/theme-css.d.ts +1 -1
- package/dist/svelte/theme-css.d.ts.map +1 -1
- package/dist/svelte/theme-css.js +809 -7
- package/dist/timeline/index.cjs +1288 -0
- package/dist/timeline/index.cjs.map +1 -0
- package/dist/timeline/index.d.cts +443 -0
- package/dist/timeline/index.d.ts +443 -0
- package/dist/timeline/index.js +1233 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/vue/index.d.ts +325 -12
- package/dist/vue/index.js +3226 -280
- package/dist/vue/index.js.map +1 -1
- package/package.json +23 -13
- package/dist/solid/index.cjs +0 -3079
- package/dist/solid/index.cjs.map +0 -1
- package/dist/solid/index.d.cts +0 -258
- package/dist/vue/index.cjs +0 -3056
- package/dist/vue/index.cjs.map +0 -1
- package/dist/vue/index.d.cts +0 -675
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/store/TimelineStore.ts","../../src/timeline-core.ts","../../src/transition-math.ts","../../src/timeline/adapter.ts","../../src/store/TimelineUiStore.ts","../../src/copy-instruction.ts","../../src/env.ts"],"sourcesContent":["// Playback transport + registry for DialKit timelines.\n// Clip values (at/duration/from/to) live in DialStore under the timeline's\n// panel id — this store only owns time: the clock, play state, and the\n// track/clip structure the dock UI renders.\n\nexport type TimelineClipTrackMeta = {\n prop: string;\n /** Step folder keys when the track is a sequence. */\n stepKeys?: string[];\n};\n\nexport type TimelineClipMeta = {\n key: string; // config path; also the DialStore path prefix, e.g. \"cardEnter\" or \"circle.path\"\n label: string;\n color: string;\n /** Code-defined playback behavior; intentionally not exposed as a dial. */\n loop: 'off' | 'repeat';\n /** Group key when the clip lives inside a nested layer, e.g. \"circle\". */\n group?: string;\n /** Step folder keys for sequence clips, e.g. [\"step1\", \"step2\"]. */\n stepKeys?: string[];\n /** Independent property tracks of a props clip — full rows when expanded. */\n tracks?: TimelineClipTrackMeta[];\n};\n\nexport type TimelineMeta = {\n id: string; // same id as the DialStore panel\n name: string;\n duration: number; // seconds\n loop: boolean;\n /** Loop wraps back to this time, not 0 — clips before it play once\n * (intro-then-idle). 0 loops the whole timeline. */\n loopStart: number;\n clips: TimelineClipMeta[]; // one row each\n};\n\nexport type TimelineTransport = {\n time: number;\n playing: boolean;\n duration: number;\n /** Completed loop passes — keeps looping clips phase-continuous across\n * timeline wraps. Reset by seek/replay so scrubbing stays deterministic. */\n wraps: number;\n};\n\ntype Listener = () => void;\n\n/** Length of the repeating span — the whole timeline unless a loop region\n * narrows it. Degenerate regions (start ≥ duration) fall back to the whole\n * timeline so a bad `from` never stalls the clock. */\nexport function loopSpan(duration: number, loopStart: number): number {\n if (!Number.isFinite(duration) || duration <= 0) return 0;\n if (!Number.isFinite(loopStart)) loopStart = 0;\n const start = Math.min(Math.max(0, loopStart), duration);\n return duration - start > 0 ? duration - start : duration;\n}\n\n/** Folds an over-run playhead back into the loop region, reporting how many\n * spans were crossed so continuous time (wraps × span + time) never jumps. */\nexport function foldLoopTime(\n time: number,\n duration: number,\n loopStart = 0\n): { time: number; wraps: number } {\n if (!Number.isFinite(time) || !Number.isFinite(duration) || duration <= 0) {\n return { time: 0, wraps: 0 };\n }\n if (time < duration) return { time, wraps: 0 };\n const span = loopSpan(duration, loopStart);\n const base = duration - span;\n const over = time - base;\n return { time: base + (over % span), wraps: Math.floor(over / span) };\n}\n\nexport const TIMELINE_CLIP_COLORS = [\n '#E8E8E8', // neutral white — slightly off-white so the pure-white selection ring still reads\n];\n\nconst EMPTY_TRANSPORT: TimelineTransport = Object.freeze({ time: 0, playing: false, duration: 0, wraps: 0 });\n\nclass TimelineStoreClass {\n private timelines: Map<string, TimelineMeta> = new Map();\n private transports: Map<string, TimelineTransport> = new Map();\n private listeners: Map<string, Set<Listener>> = new Map();\n private globalListeners: Set<Listener> = new Set();\n private registrationCounts: Map<string, number> = new Map();\n private listCache: TimelineMeta[] | null = null;\n private rafId: number | null = null;\n private lastTick = 0;\n\n register(meta: TimelineMeta, options: { autoplay: boolean }): void {\n const existing = this.timelines.get(meta.id);\n if (existing && existing.name !== meta.name) {\n console.warn(\n `[dialkit] Timeline id \"${meta.id}\" is already registered by \"${existing.name}\"; ` +\n `\"${meta.name}\" will share and overwrite that transport.`\n );\n }\n this.registrationCounts.set(meta.id, (this.registrationCounts.get(meta.id) ?? 0) + 1);\n this.applyMeta(meta, options.autoplay);\n }\n\n update(meta: TimelineMeta): void {\n if (!this.timelines.has(meta.id)) return;\n this.applyMeta(meta, false);\n }\n\n unregister(id: string): void {\n const nextCount = (this.registrationCounts.get(id) ?? 1) - 1;\n if (nextCount > 0) {\n this.registrationCounts.set(id, nextCount);\n return;\n }\n\n this.registrationCounts.delete(id);\n this.timelines.delete(id);\n this.transports.delete(id);\n // Keep listener sets: subscribers (e.g. a mounted dock) may outlive the\n // registration — HMR tears down and re-registers the same id, and their\n // subscriptions must survive it. Cleanup happens via unsubscribe closures.\n if (this.listeners.get(id)?.size === 0) this.listeners.delete(id);\n this.listCache = null;\n this.notifyGlobal();\n }\n\n play(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || transport.duration <= 0 || transport.playing) return;\n // Play from the top when the playhead is parked at the end\n const restart = transport.time >= transport.duration;\n this.transports.set(id, {\n ...transport,\n time: restart ? 0 : transport.time,\n wraps: restart ? 0 : transport.wraps,\n playing: true,\n });\n this.notify(id);\n this.ensureLoop();\n }\n\n pause(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || !transport.playing) return;\n this.transports.set(id, { ...transport, playing: false });\n this.notify(id);\n }\n\n replay(id: string): void {\n const transport = this.transports.get(id);\n if (!transport || transport.duration <= 0) return;\n this.transports.set(id, { ...transport, time: 0, wraps: 0, playing: true });\n this.notify(id);\n this.ensureLoop();\n }\n\n seek(id: string, time: number): void {\n const transport = this.transports.get(id);\n if (!transport || !Number.isFinite(time)) return;\n const clamped = Math.min(transport.duration, Math.max(0, time));\n // Scrubbing pins the deterministic first-pass state\n this.transports.set(id, { ...transport, time: clamped, wraps: 0 });\n this.notify(id);\n }\n\n getTransport(id: string): TimelineTransport {\n return this.transports.get(id) ?? EMPTY_TRANSPORT;\n }\n\n getTimeline(id: string): TimelineMeta | undefined {\n return this.timelines.get(id);\n }\n\n getTimelines(): TimelineMeta[] {\n if (!this.listCache) {\n this.listCache = Array.from(this.timelines.values());\n }\n return this.listCache;\n }\n\n subscribe(id: string, listener: Listener): () => void {\n if (!this.listeners.has(id)) {\n this.listeners.set(id, new Set());\n }\n this.listeners.get(id)!.add(listener);\n return () => {\n const listeners = this.listeners.get(id);\n listeners?.delete(listener);\n if (listeners?.size === 0 && !this.timelines.has(id)) {\n this.listeners.delete(id);\n }\n };\n }\n\n subscribeGlobal(listener: Listener): () => void {\n this.globalListeners.add(listener);\n return () => {\n this.globalListeners.delete(listener);\n };\n }\n\n private applyMeta(meta: TimelineMeta, autoplay: boolean): void {\n const duration = Number.isFinite(meta.duration) ? Math.max(0, meta.duration) : 0;\n const loopStart = Number.isFinite(meta.loopStart)\n ? Math.min(duration, Math.max(0, meta.loopStart))\n : 0;\n const safeMeta = { ...meta, duration, loopStart };\n this.timelines.set(meta.id, safeMeta);\n\n const existing = this.transports.get(meta.id);\n if (existing) {\n // Structure changed or remounted — keep the playhead, clamp to the new length\n this.transports.set(meta.id, {\n time: Math.min(existing.time, duration),\n playing: duration > 0 && existing.playing,\n duration,\n wraps: existing.wraps,\n });\n } else {\n const playing = duration > 0 && autoplay;\n this.transports.set(meta.id, { time: 0, playing, duration, wraps: 0 });\n if (playing) this.ensureLoop();\n }\n\n this.listCache = null;\n this.notify(meta.id);\n this.notifyGlobal();\n }\n\n private ensureLoop(): void {\n if (this.rafId !== null || typeof window === 'undefined') return;\n this.lastTick = performance.now();\n this.rafId = window.requestAnimationFrame(this.tick);\n }\n\n private tick = (now: number): void => {\n // Advance by wall time. A backgrounded tab lands at the state it would\n // have reached, rather than silently slowing the animation on return.\n const dt = Math.max(0, (now - this.lastTick) / 1000);\n this.lastTick = now;\n\n let anyPlaying = false;\n for (const [id, transport] of this.transports) {\n if (!transport.playing) continue;\n\n const meta = this.timelines.get(id);\n const duration = meta?.duration ?? transport.duration;\n if (!Number.isFinite(duration) || duration <= 0) {\n this.transports.set(id, { time: 0, playing: false, duration: 0, wraps: 0 });\n this.notify(id);\n continue;\n }\n let time = transport.time + dt;\n let playing = true;\n let wraps = transport.wraps;\n\n if (time >= duration) {\n if (meta?.loop) {\n const folded = foldLoopTime(time, duration, meta.loopStart);\n time = folded.time;\n wraps += folded.wraps;\n } else {\n time = duration;\n playing = false;\n }\n }\n\n this.transports.set(id, { time, playing, duration, wraps });\n if (playing) anyPlaying = true;\n this.notify(id);\n }\n\n this.rafId = anyPlaying ? window.requestAnimationFrame(this.tick) : null;\n };\n\n private notify(id: string): void {\n this.listeners.get(id)?.forEach((fn) => fn());\n }\n\n private notifyGlobal(): void {\n this.globalListeners.forEach((fn) => fn());\n }\n}\n\n// PURE lets bundlers drop the timeline entirely for panel-only users.\nexport const TimelineStore = /* @__PURE__ */ new TimelineStoreClass();\n","// Framework-agnostic timeline logic: config parsing, value interpolation,\n// and per-frame clip-state derivation. The React hook (and future Solid/\n// Svelte/Vue adapters) stay thin wrappers over this module.\n//\n// The computation is split in two so the 60Hz clock stays cheap:\n// computeStaticClips — everything derivable from stored values alone\n// (runs only when a value is edited)\n// computeClipState — the time-dependent fields for one clip\n// (runs per frame, sampling cached curve params)\n//\n// Internally every animating clip is a sequence of steps: a from/to clip is\n// one implicit step, a `steps` clip is several chained ones, and a `props`\n// clip holds one step-list per property track (each with its own cycle and\n// phase offset). Untouched properties hold their prior value through a step.\n\nimport { formatLabel, inferStep, isHexColor, resolveDialValues } from './store/DialStore';\nimport type { DialConfig, DialValue, ResolvedValues, TransitionConfig } from './store/DialStore';\nimport {\n clamp,\n cubicBezierProgress,\n isPhysicsSpring,\n isTransitionConfig,\n resolveClipTransition,\n round2,\n springParams,\n springProgress,\n springSettleDuration,\n} from './transition-math';\nimport type { SpringParams } from './transition-math';\nimport { TIMELINE_CLIP_COLORS } from './store/TimelineStore';\nimport type { TimelineClipMeta, TimelineClipTrackMeta } from './store/TimelineStore';\n\n// ── Public config types ──\n\n// A clip is a named span on the timeline — one row each: when it starts, how\n// long it runs, and (optionally) the values it animates between plus the\n// curve it animates with. `from`/`to` accept any normal DialKit leaf values\n// (numbers, colors, etc.). Everything is editable by clicking the clip in\n// the dock. Clips with from/to get a default spring transition when none is\n// specified.\n//\n// A looping clip repeats its cycle from `at` until the timeline ends: the\n// bar is one cycle, so dragging it longer slows the loop. A loop that should\n// return to where it started (a bob, a pulse) is written as a sequence whose\n// last step lands back on the starting values — there is no mirror mode.\nexport type TimelineClipLoop = 'off' | 'repeat';\n\n// One leg of a sequence. Only the properties named in `to` animate; every\n// other property holds its value from the previous leg (or `from`).\n// The index allows `undefined` because TypeScript synthesizes `prop?:\n// undefined` union arms for legs that touch different property sets.\nexport type TimelineStepValues = {\n [key: string]: DialConfig[string] | undefined;\n};\n\nexport type TimelineStepConfig = {\n duration?: number;\n to?: TimelineStepValues;\n transition?: TransitionConfig;\n};\n\n// Independent per-property tracks. When one object's properties animate\n// with different timing, each property is a full track: its own values,\n// duration, curve, and a `delay` offset from the clip's `at` (a phase shift\n// for looping clips). The clip row becomes a read-only composite of its\n// tracks; editing happens on the tracks. Properties that share timing\n// belong in a plain from/to/steps clip instead.\nexport type TimelinePropStepConfig = {\n duration?: number;\n to?: number | string;\n transition?: TransitionConfig;\n};\n\nexport type TimelinePropConfig = {\n from?: number | string;\n to?: number | string;\n duration?: number;\n /** Offset from the clip's `at` in seconds. */\n delay?: number;\n transition?: TransitionConfig;\n steps?: TimelinePropStepConfig[];\n};\n\ntype TimelineClipBase = {\n at: number;\n duration?: number;\n transition?: TransitionConfig;\n loop?: boolean | TimelineClipLoop;\n};\n\n// The three clip shapes are mutually exclusive, encoded with optional-never\n// fields so TypeScript rejects ambiguous combinations (`steps` + `to`,\n// `props` + `from`, …) at the call site. Parse warns for untyped consumers.\nexport type TimelineClipConfig = TimelineClipBase &\n (\n | {\n from?: DialConfig;\n to?: DialConfig;\n steps?: never;\n props?: never;\n }\n | {\n from?: DialConfig;\n to?: never;\n /** Sequential legs on one row — a segmented bar; boundaries retime legs. */\n steps: TimelineStepConfig[];\n props?: never;\n }\n | {\n from?: never;\n to?: never;\n steps?: never;\n /** Independent per-property tracks — mutually exclusive with from/to/steps. */\n props: { [prop: string]: TimelinePropConfig };\n }\n );\n\n/** Nested keys group clips into a collapsible layer — purely presentational. */\nexport type TimelineGroupConfig = {\n [key: string]: TimelineClipConfig;\n};\n\nexport type TimelineConfig = {\n /** Total timeline length in seconds. Inferred from the last clip when omitted. */\n duration?: number;\n} & {\n [key: string]: TimelineClipConfig | TimelineGroupConfig | number | undefined;\n};\n\n/** CSS-friendly output for consumers not using Motion — spread into a style. */\nexport type TimelineClipCss = {\n transitionDuration: string;\n transitionTimingFunction: string;\n};\n\nexport type TimelineClipValues<C extends TimelineClipConfig = TimelineClipConfig> = {\n at: number;\n duration: number;\n /** Effective code-defined loop mode. */\n loop: TimelineClipLoop;\n /** Playhead is at or past the clip start. */\n started: boolean;\n /** Playhead is inside the clip — for looping clips, inside any cycle. */\n active: boolean;\n /** Playhead is past the clip end (for looping clips, past the timeline end). */\n done: boolean;\n /**\n * 0–1 position of the playhead within the clip — cycle progress (a\n * sawtooth) for looping clips, sequence progress for steps clips.\n */\n progress: number;\n /** Index of the leg under the playhead, for sequence clips. */\n step: C['steps'] extends TimelineStepConfig[] ? number : undefined;\n from: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : undefined;\n to: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string>\n : C['to'] extends DialConfig\n ? ResolvedValues<C['to']>\n : undefined;\n /** `to` once the clip has started, `from` before — hand it to Motion's animate.\n * For sequences this is the final merged state; for props clips, per-track\n * endpoint records. */\n animate: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string> | undefined\n : C['to'] extends DialConfig\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']> | ResolvedValues<C['to']>\n : ResolvedValues<C['to']> | undefined\n : undefined;\n /** The clip's editable curve — single-curve clips only. */\n transition: C['props'] extends Record<string, TimelinePropConfig>\n ? undefined\n : C['steps'] extends TimelineStepConfig[]\n ? undefined\n : C extends { transition: TransitionConfig } | { from: DialConfig } | { to: DialConfig }\n ? TransitionConfig\n : undefined;\n /** Duration + timing-function for native CSS transitions — single-curve clips only. */\n css: C['props'] extends Record<string, TimelinePropConfig>\n ? undefined\n : C['steps'] extends TimelineStepConfig[]\n ? undefined\n : C extends { transition: TransitionConfig } | { from: DialConfig } | { to: DialConfig }\n ? TimelineClipCss\n : undefined;\n /**\n * Values interpolated through the clip's curves at the current playhead —\n * bind to style for true scrubbing: the element is exactly at this point\n * in time whether playing, paused, or scrubbing. Sequence clips report the\n * merged state of all legs (declare every animated property in `from`);\n * props clips report every track's value.\n */\n current: C['props'] extends Record<string, TimelinePropConfig>\n ? { [K in keyof C['props']]: number | string }\n : C['steps'] extends TimelineStepConfig[]\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']>\n : Record<string, number | string>\n : C['to'] extends DialConfig\n ? C['from'] extends DialConfig\n ? ResolvedValues<C['from']> | ResolvedValues<C['to']>\n : undefined\n : undefined;\n};\n\nexport type TimelineGroupValues<G extends TimelineGroupConfig> = {\n [K in keyof G as G[K] extends TimelineClipConfig ? K : never]: TimelineClipValues<\n Extract<G[K], TimelineClipConfig>\n >;\n};\n\nexport type DialTimelineValues<T extends TimelineConfig> = {\n time: number;\n playing: boolean;\n duration: number;\n play: () => void;\n pause: () => void;\n replay: () => void;\n seek: (time: number) => void;\n} & {\n [K in keyof T as T[K] extends TimelineClipConfig ? K : never]: TimelineClipValues<\n Extract<T[K], TimelineClipConfig>\n >;\n} & {\n [K in keyof T as T[K] extends TimelineClipConfig\n ? never\n : T[K] extends TimelineGroupConfig\n ? K\n : never]: TimelineGroupValues<Extract<T[K], TimelineGroupConfig>>;\n};\n\nexport const CLIP_VALUE_STEP = 0.01;\nexport const TIMELINE_MIN_CLIP_DURATION = 0.05;\nconst DEFAULT_STEP_DURATION = 0.3;\nconst DEFAULT_CLIP_TRANSITION: TransitionConfig = { type: 'spring', bounce: 0.2 };\nconst RESERVED_KEYS = new Set(['time', 'playing', 'duration', 'play', 'pause', 'replay', 'seek']);\n\n// ── Config parsing ──\n\nexport type ParsedTimeline = {\n duration: number;\n dialConfig: DialConfig;\n clips: TimelineClipMeta[];\n};\n\nfunction isClipConfig(value: unknown): value is TimelineClipConfig {\n return isPlainObject(value) && Number.isFinite((value as TimelineClipConfig).at);\n}\n\n// A group is a plain object (no `at`) with at least one clip entry — nested\n// one level. Non-clip children are skipped individually (with a warning)\n// rather than invalidating the whole group.\nfunction isGroupConfig(value: unknown): value is TimelineGroupConfig {\n if (!isPlainObject(value) || 'at' in value) return false;\n const entries = Object.values(value);\n return entries.length > 0 && entries.some(isClipConfig);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction nonNegativeFinite(value: unknown, fallback = 0): number {\n return typeof value === 'number' && Number.isFinite(value)\n ? Math.max(0, value)\n : fallback;\n}\n\nfunction animatedDuration(value: unknown, fallback = DEFAULT_STEP_DURATION): number {\n return Math.max(TIMELINE_MIN_CLIP_DURATION, nonNegativeFinite(value, fallback));\n}\n\nfunction transitionDefaultDuration(transition: TransitionConfig): number {\n if (transition.type === 'easing') return animatedDuration(transition.duration);\n // Motion gives physics parameters precedence over time parameters when a\n // mixed config reaches it, so duration inference must make the same choice.\n if (isPhysicsSpring(transition)) {\n return animatedDuration(springSettleDuration(springParams(transition)));\n }\n if (transition.visualDuration !== undefined) return animatedDuration(transition.visualDuration);\n return animatedDuration(springSettleDuration(springParams(transition)));\n}\n\n// Bar length defaults: physics always owns its emergent duration. Time-based\n// curves use an explicit bar duration first, then their own duration, then the\n// standard step duration. `inheritedTransition` matters for physics because a\n// step/track can inherit an advanced spring from its parent.\nfunction defaultStepDuration(\n step: { duration?: number; transition?: TransitionConfig },\n inheritedTransition?: TransitionConfig\n): number {\n const curve = step.transition ?? inheritedTransition;\n if (curve && isPhysicsSpring(curve)) return transitionDefaultDuration(curve);\n if (step.duration !== undefined) return animatedDuration(step.duration);\n if (step.transition) return transitionDefaultDuration(step.transition);\n return DEFAULT_STEP_DURATION;\n}\n\nfunction defaultTrackDuration(\n track: TimelinePropConfig,\n inheritedTransition?: TransitionConfig\n): number {\n const curve = track.transition ?? inheritedTransition;\n if (track.steps?.length) {\n return track.steps.reduce((sum, step) => sum + defaultStepDuration(step, curve), 0);\n }\n if (curve && isPhysicsSpring(curve)) return transitionDefaultDuration(curve);\n if (track.duration !== undefined) return animatedDuration(track.duration);\n if (track.transition) return transitionDefaultDuration(track.transition);\n return DEFAULT_STEP_DURATION;\n}\n\nfunction defaultClipDuration(clip: TimelineClipConfig): number {\n const defaultCurve = isTransitionConfig(clip.transition)\n ? clip.transition\n : DEFAULT_CLIP_TRANSITION;\n if (clip.props) {\n return Object.values(clip.props).reduce(\n (max, track) => Math.max(\n max,\n nonNegativeFinite(track.delay) + defaultTrackDuration(track, defaultCurve)\n ),\n 0\n );\n }\n if (clip.steps?.length) {\n return clip.steps.reduce((sum, step) => sum + defaultStepDuration(step, defaultCurve), 0);\n }\n\n const animating = Boolean(clip.transition || clip.from || clip.to);\n // Marker windows are allowed to be zero-length; actual animations are not.\n if (!animating) return nonNegativeFinite(clip.duration);\n if (isPhysicsSpring(defaultCurve)) return transitionDefaultDuration(defaultCurve);\n if (clip.duration !== undefined) return animatedDuration(clip.duration);\n if (isTransitionConfig(clip.transition)) return transitionDefaultDuration(clip.transition);\n // A from/to clip with neither duration nor transition animates with the\n // default spring, so its bar defaults to that spring's settle time instead\n // of collapsing to the minimum bar length. Markers stay zero-length.\n return clip.from || clip.to ? transitionDefaultDuration(DEFAULT_CLIP_TRANSITION) : 0;\n}\n\nexport function normalizeLoopMode(value: unknown): TimelineClipLoop {\n // `mirror` no longer exists — sequences whose last step returns home\n // replaced it. Legacy values fold into `repeat`.\n if (value === true || value === 'mirror' || value === 'repeat') return 'repeat';\n return 'off';\n}\n\n// The bar owns the duration, so stored transitions carry only their shape:\n// bounce for time springs, physics params as-is, and easings keep their\n// (structural) duration field pinned to the clip length.\nfunction normalizeStoredTransition(transition: TransitionConfig, clipDuration: number): TransitionConfig {\n if (transition.type === 'easing') {\n return { ...transition, duration: clipDuration };\n }\n if (isPhysicsSpring(transition)) {\n return transition;\n }\n return { type: 'spring', bounce: transition.bounce ?? 0.2 };\n}\n\ntype ClipParseEntry = {\n path: string;\n childKey: string;\n group?: string;\n clip: TimelineClipConfig;\n};\n\nfunction collectClipEntries(config: TimelineConfig): ClipParseEntry[] {\n const entries: ClipParseEntry[] = [];\n for (const [key, value] of Object.entries(config)) {\n if (key === 'duration') continue;\n if (RESERVED_KEYS.has(key)) {\n console.warn(`[dialkit] Timeline key \"${key}\" collides with a reserved key and was skipped.`);\n continue;\n }\n if (isClipConfig(value)) {\n entries.push({ path: key, childKey: key, clip: value });\n } else if (isGroupConfig(value)) {\n for (const [childKey, childClip] of Object.entries(value)) {\n if (isClipConfig(childClip)) {\n entries.push({ path: `${key}.${childKey}`, childKey, group: key, clip: childClip });\n } else {\n console.warn(\n `[dialkit] Timeline clip \"${key}.${childKey}\" is missing a numeric \"at\" and was skipped.`\n );\n }\n }\n } else {\n console.warn(\n `[dialkit] Timeline entry \"${key}\" is neither a clip (needs a numeric \"at\") nor a group of clips and was skipped.`\n );\n }\n }\n return entries;\n}\n\n/** Strips explicit-undefined leaves so step targets are safe to merge/range. */\nfunction definedValues(values: TimelineStepValues | undefined): DialConfig | undefined {\n if (!values) return undefined;\n const result: DialConfig = {};\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) result[key] = value;\n }\n return result;\n}\n\nfunction setDialPath(dialConfig: DialConfig, path: string, value: DialConfig): void {\n const segments = path.split('.');\n let node = dialConfig;\n for (const segment of segments.slice(0, -1)) {\n node = (node[segment] ??= {}) as DialConfig;\n }\n node[segments[segments.length - 1]] = value;\n}\n\nexport function parseTimelineConfig(config: TimelineConfig): ParsedTimeline {\n const entries = collectClipEntries(config);\n\n let maxEnd = 0;\n for (const { clip } of entries) {\n maxEnd = Math.max(maxEnd, nonNegativeFinite(clip.at) + defaultClipDuration(clip));\n }\n\n // Exact fit: the window ends when the content does, so a looping timeline\n // plays one full pass and wraps with no dead tail. Ceil (never round) to\n // 2dp — undershooting the content end would clip loops and drift their\n // phase every wrap. Set `duration` in config for slack to drag clips later.\n const duration =\n typeof config.duration === 'number' && Number.isFinite(config.duration) && config.duration > 0\n ? config.duration\n : maxEnd > 0\n ? Math.ceil(maxEnd * 100 - 1e-4) / 100\n : 1;\n\n const dialConfig: DialConfig = {};\n const clips: TimelineClipMeta[] = [];\n\n entries.forEach(({ path, childKey, group, clip }, index) => {\n // These combinations are untypeable (optional-never fields) but reachable\n // from plain JS — warn and pick a deterministic winner.\n const raw = clip as TimelineClipBase & {\n from?: DialConfig;\n to?: DialConfig;\n steps?: TimelineStepConfig[];\n props?: Record<string, TimelinePropConfig>;\n };\n if (raw.props && (raw.steps?.length || raw.from || raw.to)) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": \"props\" is mutually exclusive with from/to/steps — using \"props\".`\n );\n } else if (raw.steps?.length && raw.to) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": \"to\" is ignored when \"steps\" is present — each leg's \"to\" defines its targets.`\n );\n }\n\n const hasSteps = Boolean(clip.steps?.length) && !clip.props;\n const hasProps = Boolean(clip.props);\n const single = isTransitionConfig(clip.transition) ? clip.transition : undefined;\n const total = defaultClipDuration(clip);\n const defaultCurve = single ?? DEFAULT_CLIP_TRANSITION;\n const clipAt = nonNegativeFinite(clip.at);\n\n const clipDial: DialConfig = {\n at: [clipAt, 0, duration, CLIP_VALUE_STEP],\n };\n // Sequence and props clips derive their length from their parts — no\n // duration dial.\n if (!hasSteps && !hasProps) {\n clipDial.duration = [total, 0, duration, CLIP_VALUE_STEP];\n }\n\n // Every animating single-curve clip gets an editable curve; the bar\n // drives its duration.\n if (!hasSteps && !hasProps && (clip.transition || clip.from || clip.to)) {\n clipDial.transition = normalizeStoredTransition(defaultCurve, total);\n }\n\n // Independent property tracks: each is a full mini-clip folder — delay\n // (bar position), from/to or steps, and its own curve. The parent row\n // is a read-only composite.\n let tracks: TimelineClipTrackMeta[] | undefined;\n if (clip.props) {\n tracks = [];\n for (const [prop, track] of Object.entries(clip.props)) {\n if (TRACK_RESERVED.has(prop) || /^step\\d+$/.test(prop)) {\n console.warn(`[dialkit] Timeline property \"${prop}\" collides with a clip field and was skipped.`);\n continue;\n }\n const trackDuration = defaultTrackDuration(track, defaultCurve);\n const trackCurve = track.transition ?? defaultCurve;\n const hasTrackSteps = Boolean(track.steps?.length);\n const trackDial: DialConfig = {\n delay: [nonNegativeFinite(track.delay), 0, duration, CLIP_VALUE_STEP],\n };\n if (!hasTrackSteps) {\n trackDial.duration = [trackDuration, 0, duration, CLIP_VALUE_STEP];\n trackDial.transition = normalizeStoredTransition(trackCurve, trackDuration);\n }\n const fromValue = track.from ?? (hasTrackSteps ? undefined : track.to);\n if (hasTrackSteps && fromValue === undefined) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": track \"${prop}\" has steps but no \"from\" — declare its starting value.`\n );\n }\n if (fromValue !== undefined) {\n trackDial.from = scalarDial(prop, fromValue, hasTrackSteps ? track.steps![0]?.to : track.to);\n }\n if (!hasTrackSteps && track.to !== undefined) {\n trackDial.to = scalarDial(prop, track.to, fromValue);\n }\n let trackStepKeys: string[] | undefined;\n if (hasTrackSteps) {\n trackStepKeys = [];\n let previous = fromValue;\n track.steps!.forEach((step, stepIndex) => {\n const stepKey = `step${stepIndex + 1}`;\n trackStepKeys!.push(stepKey);\n const stepDuration = defaultStepDuration(step, trackCurve);\n const stepDial: DialConfig = {\n duration: [stepDuration, 0, duration, CLIP_VALUE_STEP],\n transition: normalizeStoredTransition(step.transition ?? trackCurve, stepDuration),\n };\n if (step.to !== undefined) {\n stepDial.to = scalarDial(prop, step.to, previous);\n previous = step.to;\n }\n trackDial[stepKey] = stepDial;\n });\n }\n clipDial[prop] = trackDial;\n tracks.push({ prop, stepKeys: trackStepKeys });\n }\n }\n\n if (clip.from && !hasProps) {\n clipDial.from = withFromToRanges(\n clip.from,\n hasSteps ? definedValues(clip.steps![0]?.to) : clip.to\n );\n }\n if (!hasSteps && !hasProps && clip.to) {\n clipDial.to = withFromToRanges(clip.to, clip.from);\n }\n\n // One folder per leg: duration (the segment), target values, curve.\n // Untouched properties hold — the running state feeds slider ranges.\n let stepKeys: string[] | undefined;\n if (hasSteps) {\n stepKeys = [];\n let running: DialConfig | undefined = clip.from;\n clip.steps!.forEach((step, stepIndex) => {\n const stepKey = `step${stepIndex + 1}`;\n stepKeys!.push(stepKey);\n const stepDuration = defaultStepDuration(step, defaultCurve);\n const stepDial: DialConfig = {\n duration: [stepDuration, 0, duration, CLIP_VALUE_STEP],\n transition: normalizeStoredTransition(step.transition ?? defaultCurve, stepDuration),\n };\n const stepTo = definedValues(step.to);\n if (stepTo) {\n // The hold rule needs a starting value: a property first animated\n // mid-sequence has nothing to interpolate from and jumps instead.\n for (const prop of Object.keys(stepTo)) {\n if (!running || !(prop in running)) {\n console.warn(\n `[dialkit] Timeline clip \"${path}\": property \"${prop}\" first animates in step ${stepIndex + 1} with no starting value — declare it in \"from\".`\n );\n }\n }\n stepDial.to = withFromToRanges(stepTo, running);\n }\n clipDial[stepKey] = stepDial;\n running = { ...(running ?? {}), ...(stepTo ?? {}) };\n });\n }\n\n setDialPath(dialConfig, path, clipDial);\n\n clips.push({\n key: path,\n label: formatLabel(childKey),\n color: TIMELINE_CLIP_COLORS[index % TIMELINE_CLIP_COLORS.length],\n loop: normalizeLoopMode(clip.loop),\n group,\n stepKeys,\n tracks,\n });\n });\n\n return { duration, dialConfig, clips };\n}\n\nconst TRACK_RESERVED = new Set(['at', 'duration', 'loop', 'from', 'to', 'transition', 'delay']);\n\n// A scalar track value as a dial — wraps it in a single-key record so\n// tracks and clips share exactly one range-inference policy.\nfunction scalarDial(prop: string, value: number | string, counterpart: number | string | undefined): DialConfig[string] {\n const record = withFromToRanges(\n { [prop]: value } as DialConfig,\n counterpart === undefined ? undefined : ({ [prop]: counterpart } as DialConfig)\n );\n return record[prop];\n}\n\n// ── from/to slider ranges ──\n\n// Bare numbers in from/to get property-aware slider ranges (the generic\n// DialKit inference is value-based, which turns `y: 0` into a 0–1 slider).\n// Ranges expand to include the actual from/to endpoints when they fall outside.\nconst FROM_TO_RANGE_PRESETS: [RegExp, { min: number; max: number; step: number }][] = [\n [/^(x|y|z|tx|ty|offsetx|offsety|translatex|translatey)$/i, { min: -100, max: 100, step: 1 }],\n [/rotat|angle|skew/i, { min: -180, max: 180, step: 1 }],\n [/^scale/i, { min: 0, max: 2, step: 0.01 }],\n [/opacity|alpha/i, { min: 0, max: 1, step: 0.01 }],\n [/blur|radius|spread/i, { min: 0, max: 100, step: 1 }],\n];\n\nfunction inferFromToRange(key: string, value: number, counterpart: number | undefined): [number, number, number, number] {\n const lo = Math.min(value, counterpart ?? value);\n const hi = Math.max(value, counterpart ?? value);\n\n const preset = FROM_TO_RANGE_PRESETS.find(([pattern]) => pattern.test(key))?.[1];\n if (preset) {\n return [value, Math.min(preset.min, lo), Math.max(preset.max, hi), preset.step];\n }\n\n // Generic fallback: unit-ish values get 0–1, everything else a range\n // spanning both endpoints with room to overshoot.\n if (lo >= 0 && hi <= 1) {\n return [value, 0, 1, 0.01];\n }\n const extent = Math.max(Math.abs(lo), Math.abs(hi), 1);\n const min = lo < 0 ? -extent * 2 : 0;\n const max = Math.max(extent * 2, hi);\n return [value, min, max, inferStep(min, max)];\n}\n\n// Rewrites bare-number leaves in a from/to config as explicit range tuples,\n// using the matching key in the counterpart config to size the range.\nfunction withFromToRanges(config: DialConfig, counterpart: DialConfig | undefined): DialConfig {\n const result: DialConfig = {};\n for (const [key, value] of Object.entries(config)) {\n const other = counterpart?.[key];\n if (typeof value === 'number') {\n result[key] = inferFromToRange(key, value, typeof other === 'number' ? other : undefined);\n } else if (isPlainObject(value) && !('type' in value)) {\n result[key] = withFromToRanges(\n value as DialConfig,\n isPlainObject(other) && !('type' in other) ? (other as DialConfig) : undefined\n );\n } else {\n result[key] = value as DialConfig[string];\n }\n }\n return result;\n}\n\n// ── Static clip data (edit-time) ──\n\n// A curve ready to sample: cached spring params or bezier points, plus the\n// duration easings normalize against.\ntype CurveStatic = {\n duration: number;\n spring?: SpringParams;\n settle?: number;\n ease?: [number, number, number, number];\n};\n\nfunction curveStatic(transition: TransitionConfig | undefined, duration: number): CurveStatic {\n if (!transition) return { duration };\n if (transition.type === 'easing') return { duration, ease: transition.ease };\n const spring = springParams(transition);\n return { duration, spring, settle: springSettleDuration(spring) };\n}\n\nfunction sampleCurve(curve: CurveStatic, elapsed: number): number {\n if (elapsed <= 0) return 0;\n if (curve.spring) {\n // Snap to done once settled so late samples are exactly 1\n if (curve.settle !== undefined && elapsed >= curve.settle) return 1;\n return springProgress(elapsed, curve.spring);\n }\n if (curve.ease) {\n return cubicBezierProgress(clamp(curve.duration > 0 ? elapsed / curve.duration : 1, 0, 1), curve.ease);\n }\n return curve.duration > 0 ? Math.min(1, elapsed / curve.duration) : 1;\n}\n\nexport type TimelineStepStatic = {\n key: string | null; // null for the implicit single step of a from/to clip\n offset: number; // seconds from clip/track start\n duration: number; // effective — physics-resolved\n isPhysics: boolean;\n /** Full property state at step start — the hold rule made concrete. */\n start: Record<string, unknown>;\n /** Targets this step animates; untouched properties hold `start`. */\n to: Record<string, unknown>;\n curve: CurveStatic;\n};\n\n/**\n * One track: a step chain with its own cycle length and phase offset from\n * the clip's `at`. This is the unified runtime model — a shared-timing clip\n * is exactly one track (prop unset, delay 0) whose steps carry the full\n * property record; a props clip is one single-property track per entry.\n */\nexport type TimelineTrackStatic = {\n /** Set for a props clip's single-property tracks; unset for the shared track. */\n prop?: string;\n delay: number;\n duration: number;\n steps: TimelineStepStatic[];\n};\n\nexport type TimelineClipStatic = {\n key: string;\n childKey: string;\n group?: string;\n at: number;\n /** Effective total duration — the bar length (one cycle for looping clips;\n * the widest track extent for props clips). */\n duration: number;\n loop: TimelineClipLoop;\n /** Where the clip stops affecting values: at + duration, or the timeline end when looping. */\n end: number;\n isPhysics: boolean;\n /** Motion-ready transition, its duration injected from the bar — single-curve clips only. */\n transition?: TransitionConfig;\n css?: TimelineClipCss;\n from?: Record<string, unknown>;\n /** Final merged state (the last leg's landing values for sequences). */\n to?: Record<string, unknown>;\n /** Every animating clip is tracks; empty for markers. */\n tracks: TimelineTrackStatic[];\n explicitSteps: boolean;\n /** Union of every property the clip touches. */\n props?: string[];\n};\n\nfunction resolvedAtPath(resolved: Record<string, unknown>, path: string): Record<string, unknown> {\n let node: unknown = resolved;\n for (const segment of path.split('.')) {\n node = isPlainObject(node) ? node[segment] : undefined;\n }\n return isPlainObject(node) ? node : {};\n}\n\nexport function computeStaticClips(\n parsed: ParsedTimeline,\n flatValues: Record<string, DialValue>\n): TimelineClipStatic[] {\n const resolved = resolveDialValues(parsed.dialConfig, flatValues) as Record<string, unknown>;\n return parsed.clips.map((clip) =>\n buildClipStatic(resolvedAtPath(resolved, clip.key), clip, parsed.duration)\n );\n}\n\nexport type TimelineStaticState = {\n duration: number;\n clips: TimelineClipStatic[];\n};\n\n/**\n * Resolves the editable clip model and grows the timeline when a live value\n * creates content beyond its authored window. This is most important for\n * physics springs: changing stiffness/damping changes their emergent length.\n * The parsed duration remains the minimum, so shortening a clip never removes\n * the original editing room.\n */\nexport function computeStaticTimeline(\n parsed: ParsedTimeline,\n flatValues: Record<string, DialValue>\n): TimelineStaticState {\n let clips = computeStaticClips(parsed, flatValues);\n const maxEnd = clips.reduce(\n (end, clip) => Math.max(end, clip.at + clip.duration),\n parsed.duration\n );\n const duration = maxEnd > parsed.duration\n ? Math.ceil(maxEnd * 100 - 1e-4) / 100\n : parsed.duration;\n\n if (duration !== parsed.duration) {\n clips = clips.map((clip) =>\n clip.loop === 'repeat' ? { ...clip, end: duration } : clip\n );\n }\n\n return { duration, clips };\n}\n\n/** The dock's resolver: the same static model the hook animates with,\n * rebuilt from flat stored values — bars, popovers, and playback can never\n * disagree about geometry. */\nexport function computeClipStaticFromValues(\n values: Record<string, DialValue>,\n clip: TimelineClipMeta,\n timelineDuration: number\n): TimelineClipStatic {\n return buildClipStatic(unflattenClipValues(values, clip.key), clip, timelineDuration);\n}\n\nfunction buildClipStatic(\n clipResolved: Record<string, unknown>,\n clip: TimelineClipMeta,\n timelineDuration: number\n): TimelineClipStatic {\n {\n const at = typeof clipResolved.at === 'number' ? clipResolved.at : 0;\n const from = isPlainObject(clipResolved.from) ? clipResolved.from : undefined;\n const single = isTransitionConfig(clipResolved.transition) ? clipResolved.transition : undefined;\n\n const staticClip: TimelineClipStatic = {\n key: clip.key,\n childKey: clip.group ? clip.key.slice(clip.group.length + 1) : clip.key,\n group: clip.group,\n at,\n duration: 0,\n loop: 'off',\n end: 0,\n isPhysics: false,\n from,\n tracks: [],\n explicitSteps: Boolean(clip.stepKeys?.length),\n };\n\n if (clip.tracks?.length) {\n // Independent property tracks: each chains its own scalar steps and\n // carries its own cycle length and phase offset.\n const tracks: (TimelineTrackStatic & { prop: string })[] = clip.tracks.map(({ prop, stepKeys }) => {\n const trackResolved = isPlainObject(clipResolved[prop])\n ? (clipResolved[prop] as Record<string, unknown>)\n : {};\n const delay = typeof trackResolved.delay === 'number' ? trackResolved.delay : 0;\n const fromValue = trackResolved.from;\n let steps: TimelineStepStatic[];\n let trackDuration = 0;\n\n if (stepKeys?.length) {\n let running = fromValue;\n steps = stepKeys.map((stepKey) => {\n const stepResolved = isPlainObject(trackResolved[stepKey])\n ? (trackResolved[stepKey] as Record<string, unknown>)\n : {};\n const storedDuration =\n typeof stepResolved.duration === 'number' ? stepResolved.duration : 0;\n const raw = isTransitionConfig(stepResolved.transition) ? stepResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const toValue = stepResolved.to;\n const step: TimelineStepStatic = {\n key: stepKey,\n offset: trackDuration,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: running === undefined ? {} : { [prop]: running },\n to: toValue === undefined ? {} : { [prop]: toValue },\n curve: curveStatic(effective.transition, effective.duration),\n };\n if (toValue !== undefined) running = toValue;\n trackDuration += effective.duration;\n return step;\n });\n } else {\n const storedDuration =\n typeof trackResolved.duration === 'number' ? trackResolved.duration : 0;\n const raw = isTransitionConfig(trackResolved.transition) ? trackResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const toValue = trackResolved.to;\n trackDuration = effective.duration;\n steps = [\n {\n key: null,\n offset: 0,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: fromValue === undefined ? {} : { [prop]: fromValue },\n to: toValue === undefined ? {} : { [prop]: toValue },\n curve: curveStatic(effective.transition, effective.duration),\n },\n ];\n }\n\n return { prop, delay, duration: trackDuration, steps };\n });\n\n staticClip.tracks = tracks;\n staticClip.props = tracks.map((track) => track.prop);\n staticClip.duration = tracks.reduce((max, track) => Math.max(max, track.delay + track.duration), 0);\n staticClip.from = Object.fromEntries(\n tracks.map((track) => [track.prop, track.steps[0].start[track.prop]])\n );\n staticClip.to = Object.fromEntries(\n tracks.map((track) => {\n const last = track.steps[track.steps.length - 1];\n return [track.prop, last.to[track.prop] ?? last.start[track.prop]];\n })\n );\n\n staticClip.loop = staticClip.duration > 0 ? clip.loop : 'off';\n staticClip.end = staticClip.loop === 'off' ? staticClip.at + staticClip.duration : timelineDuration;\n return staticClip;\n }\n\n if (clip.stepKeys?.length) {\n // Sequence: chain the legs, threading the running state through so\n // untouched properties hold their prior value.\n let running: Record<string, unknown> = { ...(from ?? {}) };\n let offset = 0;\n const steps: TimelineStepStatic[] = clip.stepKeys.map((stepKey) => {\n const stepResolved = isPlainObject(clipResolved[stepKey])\n ? (clipResolved[stepKey] as Record<string, unknown>)\n : {};\n const storedDuration =\n typeof stepResolved.duration === 'number' ? stepResolved.duration : 0;\n const raw = isTransitionConfig(stepResolved.transition) ? stepResolved.transition : undefined;\n const effective = raw\n ? resolveClipTransition(raw, storedDuration)\n : { transition: undefined, duration: storedDuration, isPhysics: false };\n const to = isPlainObject(stepResolved.to) ? stepResolved.to : {};\n const step: TimelineStepStatic = {\n key: stepKey,\n offset,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: running,\n to,\n curve: curveStatic(effective.transition, effective.duration),\n };\n running = { ...running, ...to };\n offset += effective.duration;\n return step;\n });\n\n staticClip.tracks = [{ delay: 0, duration: offset, steps }];\n staticClip.duration = offset;\n staticClip.to = running;\n } else {\n const storedDuration = typeof clipResolved.duration === 'number' ? clipResolved.duration : 0;\n const to = isPlainObject(clipResolved.to) ? clipResolved.to : undefined;\n\n if (single) {\n const effective = resolveClipTransition(single, storedDuration);\n staticClip.duration = effective.duration;\n staticClip.isPhysics = effective.isPhysics;\n staticClip.transition = effective.transition;\n staticClip.css = transitionToCss(effective.transition);\n staticClip.to = to;\n if (from && to) {\n staticClip.tracks = [\n {\n delay: 0,\n duration: effective.duration,\n steps: [\n {\n key: null,\n offset: 0,\n duration: effective.duration,\n isPhysics: effective.isPhysics,\n start: from,\n to,\n curve: curveStatic(effective.transition, effective.duration),\n },\n ],\n },\n ];\n }\n } else {\n // Curveless clip (markers, or defensive fallback): the bar is the\n // stored duration; from/to animate with the default spring.\n staticClip.duration = storedDuration;\n staticClip.to = to;\n if (from && to) {\n const base = resolveClipTransition(DEFAULT_CLIP_TRANSITION, storedDuration);\n staticClip.duration = base.duration;\n staticClip.tracks = [\n {\n delay: 0,\n duration: base.duration,\n steps: [\n {\n key: null,\n offset: 0,\n duration: base.duration,\n isPhysics: false,\n start: from,\n to,\n curve: curveStatic(base.transition, base.duration),\n },\n ],\n },\n ];\n }\n }\n }\n\n if (staticClip.tracks.length) {\n const props = new Set<string>(Object.keys(from ?? {}));\n for (const track of staticClip.tracks) {\n for (const step of track.steps) {\n for (const prop of Object.keys(step.to)) props.add(prop);\n }\n }\n staticClip.props = Array.from(props);\n }\n\n staticClip.loop = staticClip.duration > 0 ? clip.loop : 'off';\n staticClip.end = staticClip.loop === 'off' ? staticClip.at + staticClip.duration : timelineDuration;\n\n return staticClip;\n }\n}\n\n// ── Per-frame clip state ──\n\nfunction stepAtPosition(steps: TimelineStepStatic[], pos: number): TimelineStepStatic {\n for (const step of steps) {\n if (pos < step.offset + step.duration) return step;\n }\n return steps[steps.length - 1];\n}\n\n/** One property's value at a cycle position — the hold rule in one place,\n * shared by the frame pass and the waveform sampler. */\nfunction evalPropAtPos(steps: TimelineStepStatic[], prop: string, pos: number): unknown {\n const step = stepAtPosition(steps, pos);\n const within = Math.max(0, pos - step.offset);\n if (prop in step.to) {\n const eased = sampleCurve(step.curve, within);\n return interpolateResolved(step.start[prop], step.to[prop], eased);\n }\n return step.start[prop];\n}\n\n/**\n * `time` is the playhead (what the dock shows); `cycleTime` is continuous\n * time across timeline wraps (wraps × duration + time). Looping clips fold\n * against `cycleTime`, so a looping timeline never snaps their phase — the\n * window is a viewport onto animations that repeat forever. Scrubbing seeks\n * with cycleTime === time, which is the deterministic first-pass state.\n */\nexport function computeClipState(\n clip: TimelineClipStatic,\n time: number,\n cycleTime = time\n): Record<string, unknown> {\n const total = clip.duration;\n const looping = clip.loop === 'repeat' && total > 0;\n // Once the timeline has wrapped, a looping clip is already running even\n // before its `at` — it has been repeating since the previous pass.\n const started = time >= clip.at || (looping && cycleTime > time);\n const done = time >= clip.end;\n const elapsed = time - clip.at;\n const phaseElapsed = looping ? cycleTime - clip.at : elapsed;\n\n const fold = (e: number): number => (looping ? e % total : e);\n\n const basePos = started ? fold(Math.max(0, phaseElapsed)) : 0;\n const progress = total > 0 ? clamp(basePos / total, 0, 1) : started ? 1 : 0;\n\n let current: Record<string, unknown> | undefined;\n let stepIndex = 0;\n\n if (clip.tracks.length && clip.props?.length) {\n // One loop for every clip kind: each track folds against its own cycle,\n // offset by its delay. The delay applies once, then cycles fold — with\n // equal periods that is a permanent phase shift (Motion's semantics). A\n // shared-timing clip is a single track whose steps carry every property.\n current = {};\n for (const track of clip.tracks) {\n const props = track.prop !== undefined ? [track.prop] : clip.props;\n for (const prop of props) {\n const startValue = track.steps[0]?.start[prop];\n if (!started) {\n if (startValue !== undefined) current[prop] = startValue;\n continue;\n }\n const phase = phaseElapsed - track.delay;\n if (phase <= 0) {\n if (startValue !== undefined) current[prop] = startValue;\n continue;\n }\n const pos = looping && track.duration > 0 ? phase % track.duration : phase;\n const value = evalPropAtPos(track.steps, prop, pos);\n if (value !== undefined) current[prop] = value;\n }\n }\n const shared = clip.tracks[0];\n if (started && clip.explicitSteps && shared.prop === undefined) {\n stepIndex = shared.steps.indexOf(stepAtPosition(shared.steps, basePos));\n }\n }\n\n return {\n at: clip.at,\n duration: clip.duration,\n loop: clip.loop,\n started,\n active: started && !done,\n done,\n progress,\n step: clip.explicitSteps ? stepIndex : undefined,\n from: clip.from,\n to: clip.to,\n animate: started ? clip.to : clip.from,\n transition: clip.transition,\n css: clip.css,\n current,\n };\n}\n\n// ── Value interpolation ──\n\n// Mixes two resolved from/to value trees at eased progress p.\n// Numbers lerp (and can overshoot), hex colors mix in clamped RGB,\n// anything else switches at the midpoint.\nexport function interpolateResolved(from: unknown, to: unknown, p: number): unknown {\n if (typeof from === 'number' && typeof to === 'number') {\n return from + (to - from) * p;\n }\n if (typeof from === 'string' && typeof to === 'string') {\n const mixed = mixHexColors(from, to, p);\n if (mixed) return mixed;\n }\n if (isPlainObject(from) && isPlainObject(to)) {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(from)) {\n result[key] = key in to ? interpolateResolved(from[key], to[key], p) : from[key];\n }\n for (const key of Object.keys(to)) {\n if (!(key in from)) result[key] = to[key];\n }\n return result;\n }\n return p < 0.5 ? from : to;\n}\n\nfunction parseHex(hex: string): [number, number, number, number] | null {\n if (!isHexColor(hex)) return null;\n let h = hex.slice(1);\n if (h.length === 3) h = h.split('').map((c) => c + c).join('');\n return [\n parseInt(h.slice(0, 2), 16),\n parseInt(h.slice(2, 4), 16),\n parseInt(h.slice(4, 6), 16),\n h.length === 8 ? parseInt(h.slice(6, 8), 16) : 255,\n ];\n}\n\nfunction mixHexColors(a: string, b: string, p: number): string | null {\n const ca = parseHex(a);\n const cb = parseHex(b);\n if (!ca || !cb) return null;\n const t = clamp(p, 0, 1);\n const mixed = ca.map((v, i) => Math.round(v + (cb[i] - v) * t));\n const hex = (n: number) => n.toString(16).padStart(2, '0');\n const rgb = `#${hex(mixed[0])}${hex(mixed[1])}${hex(mixed[2])}`;\n return mixed[3] === 255 ? rgb : `${rgb}${hex(mixed[3])}`;\n}\n\n// ── CSS output ──\n\n// Approximates the clip's transition as CSS transition properties so\n// non-Motion consumers can use native CSS. Easing configs map exactly;\n// springs are approximated with an overshoot bezier scaled by bounce.\nexport function transitionToCss(transition: TransitionConfig | undefined): TimelineClipCss | undefined {\n if (!transition) return undefined;\n\n if (transition.type === 'easing') {\n return {\n transitionDuration: `${round2(transition.duration)}s`,\n transitionTimingFunction: `cubic-bezier(${transition.ease.map((v) => round2(v)).join(', ')})`,\n };\n }\n\n const params = springParams(transition);\n const dampingRatio = params.damping / (2 * Math.sqrt(params.stiffness * params.mass));\n const duration = transition.visualDuration ?? springSettleDuration(params);\n const bounce = transition.bounce ?? Math.max(0, round2(1 - dampingRatio));\n\n return {\n transitionDuration: `${round2(duration)}s`,\n transitionTimingFunction:\n bounce > 0.05\n ? `cubic-bezier(0.34, ${round2(1.2 + bounce)}, 0.64, 1)`\n : 'cubic-bezier(0.25, 0.6, 0.35, 1)',\n };\n}\n\n// ── Dock helpers ──\n\n/** Popover display values: swap stored shape-only transitions for their\n * effective configs (duration injected from the bar/segment) so the curve\n * editor shows the transition as it actually runs. */\nexport function timelinePopoverDisplayValues(\n values: Record<string, DialValue>,\n clipKey: string,\n stepKeys?: string[],\n stepKey?: string\n): Record<string, DialValue> {\n const display = { ...values };\n const swap = (path: string, duration: number) => {\n const raw = display[path];\n if (isTransitionConfig(raw)) display[path] = resolveClipTransition(raw, duration).transition;\n };\n\n if (stepKey) {\n swap(`${clipKey}.${stepKey}.transition`, numberValue(values[`${clipKey}.${stepKey}.duration`]));\n return display;\n }\n\n const cycle = stepKeys?.length\n ? stepKeys.reduce((sum, sk) => sum + numberValue(values[`${clipKey}.${sk}.duration`]), 0)\n : numberValue(values[`${clipKey}.duration`]);\n\n swap(`${clipKey}.transition`, cycle);\n return display;\n}\n\nfunction numberValue(value: unknown): number {\n return typeof value === 'number' ? value : 0;\n}\n\n// ── Property lanes ──\n\n/** Rebuilds the nested resolved shape for one clip from flat stored values —\n * the dock's inverse of the panel's path flattening. */\nfunction unflattenClipValues(\n values: Record<string, DialValue>,\n clipKey: string\n): Record<string, unknown> {\n const prefix = `${clipKey}.`;\n const result: Record<string, unknown> = {};\n const entries = Object.entries(values)\n .filter(([path]) => path.startsWith(prefix))\n .map(([path, value]) => ({ segments: path.slice(prefix.length).split('.'), value }))\n .sort((a, b) => a.segments.length - b.segments.length);\n\n for (const { segments, value } of entries) {\n let node = result;\n for (let i = 0; i < segments.length - 1; i++) {\n const existing = node[segments[i]];\n node = (isPlainObject(existing) ? existing : (node[segments[i]] = {})) as Record<string, unknown>;\n }\n node[segments[segments.length - 1]] = cloneTimelineValue(value);\n }\n return result;\n}\n\nfunction cloneTimelineValue(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(cloneTimelineValue);\n if (!isPlainObject(value)) return value;\n return Object.fromEntries(\n Object.entries(value).map(([key, nested]) => [key, cloneTimelineValue(nested)])\n );\n}\n\n/** Dragging a track bar edits the property's phase offset. */\nexport function clampTrackDelay(\n delay: number,\n at: number,\n trackDuration: number,\n timelineDuration: number\n): number {\n return clamp(round2(delay), 0, Math.max(0, round2(timelineDuration - at - trackDuration)));\n}\n\n// Clip-edit clamp policy — one place, shared by every gesture/consumer.\nexport function clampClipMove(at: number, duration: number, timelineDuration: number): number {\n return clamp(round2(at), 0, Math.max(0, timelineDuration - duration));\n}\n\nexport function clampClipResizeEnd(duration: number, at: number, timelineDuration: number): number {\n return clamp(round2(duration), TIMELINE_MIN_CLIP_DURATION, timelineDuration - at);\n}\n\nexport function clampClipResizeStart(\n newAt: number,\n at: number,\n duration: number\n): { at: number; duration: number } {\n const clampedAt = clamp(round2(newAt), 0, at + duration - TIMELINE_MIN_CLIP_DURATION);\n return { at: clampedAt, duration: round2(at + duration - clampedAt) };\n}\n\n/** Resizing one leg of a sequence: the other legs keep their length, the\n * whole bar must still fit the timeline. */\nexport function clampStepResize(\n duration: number,\n at: number,\n otherStepsTotal: number,\n timelineDuration: number\n): number {\n const max = Math.max(TIMELINE_MIN_CLIP_DURATION, timelineDuration - at - otherStepsTotal);\n return clamp(round2(duration), TIMELINE_MIN_CLIP_DURATION, max);\n}\n\n/** Copy-for-agent export: strip editor-only state, normalize shape-only\n * transitions, resolve physics durations, and drop zero-value defaults. */\nexport function normalizeTimelineValuesForCopy(\n values: Record<string, DialValue>,\n clips: TimelineClipMeta[]\n): Record<string, DialValue> {\n const normalized: Record<string, DialValue> = { ...values };\n\n // Transition mode is editor UI state, not part of a DialKit config. It is\n // stored beside values so mode switches survive presets, but must never be\n // included in the tune → copy → remove payload.\n for (const path of Object.keys(normalized)) {\n if (path.endsWith('.__mode')) delete normalized[path];\n }\n\n const normalizeTransitionAt = (transitionPath: string, durationPath: string) => {\n const raw = normalized[transitionPath];\n if (!isTransitionConfig(raw)) return;\n if (isPhysicsSpring(raw)) {\n // A mode switch can leave the previous time-based bar duration stored.\n // Export the spring's actual derived length so the copied config exactly\n // matches the timeline the author just tuned.\n normalized[durationPath] = transitionDefaultDuration(raw);\n }\n normalized[transitionPath] = normalizeStoredTransition(\n raw,\n numberValue(normalized[durationPath])\n );\n };\n\n for (const clip of clips) {\n for (const stepKey of clip.stepKeys ?? []) {\n normalizeTransitionAt(\n `${clip.key}.${stepKey}.transition`,\n `${clip.key}.${stepKey}.duration`\n );\n }\n\n normalizeTransitionAt(`${clip.key}.transition`, `${clip.key}.duration`);\n\n // Property tracks: normalize each track's transitions against its own\n // durations, drop zero delays (the config default).\n for (const track of clip.tracks ?? []) {\n const trackKey = `${clip.key}.${track.prop}`;\n for (const stepKey of track.stepKeys ?? []) {\n normalizeTransitionAt(\n `${trackKey}.${stepKey}.transition`,\n `${trackKey}.${stepKey}.duration`\n );\n }\n normalizeTransitionAt(`${trackKey}.transition`, `${trackKey}.duration`);\n if (normalized[`${trackKey}.delay`] === 0) {\n delete normalized[`${trackKey}.delay`];\n }\n }\n\n delete normalized[`${clip.key}.loop`];\n }\n return normalized;\n}\n\n// ── Formatting ──\n\nexport function formatClock(time: number, tenths = false): string {\n const safe = Math.max(0, time);\n const minutes = Math.floor(safe / 60);\n const seconds = safe - minutes * 60;\n const secondsText = tenths\n ? seconds.toFixed(1).padStart(4, '0')\n : String(Math.floor(seconds)).padStart(2, '0');\n return `${String(minutes).padStart(2, '0')}:${secondsText}`;\n}\n\nexport function formatSeconds(value: number): string {\n return `${round2(value)}s`;\n}\n\nexport function formatStepLabel(stepKey: string): string {\n const match = /^step(\\d+)$/.exec(stepKey);\n return match ? `Step ${match[1]}` : formatLabel(stepKey);\n}\n","// Deterministic sampling of transition curves, used for timeline scrubbing.\n// Springs use the closed-form damped-harmonic-oscillator solution with\n// Motion's own visualDuration/bounce → stiffness/damping mapping, so a\n// scrubbed position matches what Motion plays.\n\nimport { isEasingConfigValue, isSpringConfigValue } from './store/DialStore';\nimport type { EasingConfig, SpringConfig, TransitionConfig } from './store/DialStore';\n\nexport type SpringParams = { stiffness: number; damping: number; mass: number };\n\nexport function round2(value: number): number {\n return Math.round(value * 100) / 100;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nexport function isTransitionConfig(value: unknown): value is TransitionConfig {\n return isSpringConfigValue(value) || isEasingConfigValue(value);\n}\n\nexport function isPhysicsSpring(transition: TransitionConfig): boolean {\n return (\n transition.type === 'spring' &&\n (transition.stiffness !== undefined || transition.damping !== undefined || transition.mass !== undefined)\n );\n}\n\nexport function springParams(spring: SpringConfig): SpringParams {\n if (isPhysicsSpring(spring)) {\n return { stiffness: spring.stiffness ?? 200, damping: spring.damping ?? 25, mass: spring.mass ?? 1 };\n }\n // Motion's mapping (motion-dom spring generator)\n const visualDuration = Math.max(0.05, spring.visualDuration ?? 0.3);\n const bounce = spring.bounce ?? 0.3;\n const root = (2 * Math.PI) / (visualDuration * 1.2);\n const stiffness = root * root;\n const damping = 2 * Math.min(1, Math.max(0.05, 1 - bounce)) * Math.sqrt(stiffness);\n return { stiffness, damping, mass: 1 };\n}\n\n/** Normalized spring position 0 → 1 (may overshoot), starting at rest. */\nexport function springProgress(t: number, { stiffness, damping, mass }: SpringParams): number {\n if (t <= 0) return 0;\n const w0 = Math.sqrt(stiffness / mass);\n const zeta = damping / (2 * Math.sqrt(stiffness * mass));\n\n if (zeta < 0.9999) {\n const wd = w0 * Math.sqrt(1 - zeta * zeta);\n return 1 - Math.exp(-zeta * w0 * t) * (Math.cos(wd * t) + ((zeta * w0) / wd) * Math.sin(wd * t));\n }\n if (zeta < 1.0001) {\n return 1 - Math.exp(-w0 * t) * (1 + w0 * t);\n }\n const wd = w0 * Math.sqrt(zeta * zeta - 1);\n const r1 = -zeta * w0 + wd;\n const r2 = -zeta * w0 - wd;\n return 1 + (r2 * Math.exp(r1 * t) - r1 * Math.exp(r2 * t)) / (r1 - r2);\n}\n\n/** Estimated time for a spring to visually settle (within 0.5% of target). */\nexport function springSettleDuration(params: SpringParams): number {\n const w0 = Math.sqrt(params.stiffness / params.mass);\n const zeta = params.damping / (2 * Math.sqrt(params.stiffness * params.mass));\n const decay =\n zeta >= 1\n ? zeta * w0 - w0 * Math.sqrt(Math.max(0, zeta * zeta - 1)) // slowest exponent\n : zeta * w0;\n const duration = Math.log(200) / Math.max(decay, 1e-6);\n return round2(clamp(duration, 0.05, 10));\n}\n\n/** Eased progress of a cubic-bezier easing at linear progress p (0–1). */\nexport function cubicBezierProgress(p: number, [x1, y1, x2, y2]: [number, number, number, number]): number {\n if (p <= 0) return 0;\n if (p >= 1) return 1;\n // Solve the bezier's parameter t for x = p (Newton-Raphson, bisection fallback)\n const sampleX = (t: number) => bezierAxis(t, x1, x2);\n const sampleY = (t: number) => bezierAxis(t, y1, y2);\n\n let t = p;\n for (let i = 0; i < 8; i++) {\n const x = sampleX(t) - p;\n if (Math.abs(x) < 1e-5) return sampleY(t);\n const dx = bezierAxisDerivative(t, x1, x2);\n if (Math.abs(dx) < 1e-6) break;\n t -= x / dx;\n }\n\n let lo = 0;\n let hi = 1;\n t = p;\n while (hi - lo > 1e-5) {\n if (sampleX(t) < p) lo = t;\n else hi = t;\n t = (lo + hi) / 2;\n }\n return sampleY(t);\n}\n\nfunction bezierAxis(t: number, a1: number, a2: number): number {\n return ((1 - 3 * a2 + 3 * a1) * t * t * t) + ((3 * a2 - 6 * a1) * t * t) + (3 * a1 * t);\n}\n\nfunction bezierAxisDerivative(t: number, a1: number, a2: number): number {\n return 3 * (1 - 3 * a2 + 3 * a1) * t * t + 2 * (3 * a2 - 6 * a1) * t + 3 * a1;\n}\n\nexport type ResolvedClipTransition = {\n /** Motion-ready transition with its duration driven by the clip length. */\n transition: TransitionConfig;\n /** Effective clip duration — the bar length. Derived for physics springs. */\n duration: number;\n /** Physics springs have emergent duration; the bar is derived, not resizable. */\n isPhysics: boolean;\n};\n\n// The bar IS the duration: time-mode springs get visualDuration from the\n// clip length, easings get duration from it, and physics springs derive\n// the clip length from their settle time.\nexport function resolveClipTransition(\n raw: TransitionConfig,\n clipDuration: number\n): ResolvedClipTransition {\n const safeDuration = Math.max(0.05, clipDuration);\n\n if (raw.type === 'easing') {\n return {\n transition: { ...raw, duration: safeDuration } as EasingConfig,\n duration: safeDuration,\n isPhysics: false,\n };\n }\n if (isPhysicsSpring(raw)) {\n return {\n transition: raw,\n duration: springSettleDuration(springParams(raw)),\n isPhysics: true,\n };\n }\n return {\n transition: { type: 'spring', bounce: raw.bounce ?? 0.2, visualDuration: safeDuration },\n duration: safeDuration,\n isPhysics: false,\n };\n}\n\n/**\n * Eased progress of a clip's transition at `elapsed` seconds after its start.\n * Springs keep evolving past the bar (bounce tail) and converge to 1;\n * easings clamp at 1. May overshoot 1 for bouncy curves.\n */\nexport function transitionProgress(\n elapsed: number,\n duration: number,\n transition: TransitionConfig | undefined\n): number {\n if (elapsed <= 0) return 0;\n if (!transition) {\n return duration > 0 ? Math.min(1, elapsed / duration) : 1;\n }\n if (transition.type === 'easing') {\n return cubicBezierProgress(Math.min(1, duration > 0 ? elapsed / duration : 1), transition.ease);\n }\n const params = springParams(transition);\n // Snap to done once settled so late samples are exactly 1\n if (elapsed >= springSettleDuration(params)) return 1;\n return springProgress(elapsed, params);\n}\n","import type { DialKitPersistOptions } from '../store/DialStore';\nimport type { TimelineMeta, TimelineTransport } from '../store/TimelineStore';\nimport { loopSpan } from '../store/TimelineStore';\nimport {\n computeClipState,\n type DialTimelineValues,\n type ParsedTimeline,\n type TimelineClipStatic,\n type TimelineConfig,\n} from '../timeline-core';\n\nexport interface DialTimelineOptions {\n id?: string;\n persist?: DialKitPersistOptions;\n /** Start playing on mount. Defaults to true. */\n autoplay?: boolean;\n /**\n * Loop when the playhead reaches the end. `true` restarts the whole\n * timeline; `{ from }` wraps back to that time instead, so clips before it\n * play once and looping clips keep cycling forever. Defaults to false.\n */\n loop?: boolean | { from: number };\n}\n\nexport type TimelineActions = {\n play: () => void;\n pause: () => void;\n replay: () => void;\n seek: (time: number) => void;\n};\n\n/** One resolution of the public loop option, shared by every adapter. */\nexport function resolveTimelineLoop(\n loop: DialTimelineOptions['loop']\n): { enabled: boolean; start: number } {\n if (typeof loop === 'object' && loop !== null) {\n return {\n enabled: true,\n start: Number.isFinite(loop.from) ? Math.max(0, loop.from) : 0,\n };\n }\n return { enabled: Boolean(loop), start: 0 };\n}\n\nexport function buildTimelineMeta(\n id: string,\n name: string,\n duration: number,\n parsed: ParsedTimeline,\n loop: DialTimelineOptions['loop']\n): TimelineMeta {\n const resolvedLoop = resolveTimelineLoop(loop);\n return {\n id,\n name,\n duration,\n loop: resolvedLoop.enabled,\n loopStart: resolvedLoop.start,\n clips: parsed.clips,\n };\n}\n\n/**\n * Framework-neutral frame pass. Adapters only own lifecycle and reactivity;\n * the value shape and loop-cycle math stay identical everywhere.\n */\nexport function buildTimelineValues<T extends TimelineConfig>(\n staticClips: TimelineClipStatic[],\n transport: TimelineTransport,\n timelineDuration: number,\n loopStart: number,\n actions: TimelineActions\n): DialTimelineValues<T> {\n const result: Record<string, unknown> = {\n time: transport.time,\n playing: transport.playing,\n duration: timelineDuration,\n ...actions,\n };\n\n const span = loopSpan(transport.duration, loopStart);\n const cycleTime = (span > 0 ? transport.wraps * span : 0) + transport.time;\n for (const clip of staticClips) {\n const state = computeClipState(clip, transport.time, cycleTime);\n if (clip.group) {\n const bucket = (result[clip.group] ??= {}) as Record<string, unknown>;\n bucket[clip.childKey] = state;\n } else {\n result[clip.key] = state;\n }\n }\n\n return result as DialTimelineValues<T>;\n}\n","type Listener = () => void;\n\ntype VisibilityController = {\n visible?: boolean;\n defaultVisible: boolean;\n onVisibilityChange?: (visible: boolean) => void;\n};\n\n/**\n * UI-only state shared by the toolkit root and the timeline portal.\n * Playback deliberately lives elsewhere: hiding the editor must never pause\n * or otherwise change the animation it is inspecting.\n */\nclass TimelineUiStoreClass {\n private visible = true;\n private initialized = false;\n private controllers = new Map<symbol, VisibilityController>();\n private listeners = new Set<Listener>();\n\n getVisible(): boolean {\n for (const controller of this.controllers.values()) {\n if (controller.visible !== undefined) return controller.visible;\n }\n return this.visible;\n }\n\n registerController(id: symbol, controller: VisibilityController): () => void {\n const previous = this.getVisible();\n if (!this.initialized) {\n this.visible = controller.defaultVisible;\n this.initialized = true;\n }\n this.controllers.set(id, controller);\n if (previous !== this.getVisible()) this.notify();\n\n return () => {\n const before = this.getVisible();\n this.controllers.delete(id);\n if (this.controllers.size === 0) this.initialized = false;\n if (before !== this.getVisible()) this.notify();\n };\n }\n\n updateController(id: symbol, controller: VisibilityController): void {\n if (!this.controllers.has(id)) return;\n const previous = this.getVisible();\n this.controllers.set(id, controller);\n if (previous !== this.getVisible()) this.notify();\n }\n\n requestVisible(visible: boolean): void {\n const current = this.getVisible();\n if (current === visible) return;\n\n const controlled = Array.from(this.controllers.values()).filter(\n (controller) => controller.visible !== undefined\n );\n if (controlled.length > 0) {\n controlled.forEach((controller) => controller.onVisibilityChange?.(visible));\n return;\n }\n\n this.visible = visible;\n this.controllers.forEach((controller) => controller.onVisibilityChange?.(visible));\n this.notify();\n }\n\n toggle(): void {\n this.requestVisible(!this.getVisible());\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify(): void {\n this.listeners.forEach((listener) => listener());\n }\n}\n\nexport const TimelineUiStore = /* @__PURE__ */ new TimelineUiStoreClass();\n","import type { DialValue } from './store/DialStore';\n\n// The copy-for-agent export shared by the panel toolbar and the timeline dock.\nexport function buildCopyInstruction(\n hookName: string,\n panelName: string,\n values: Record<string, DialValue>\n): string {\n const jsonStr = JSON.stringify(values, null, 2);\n\n if (hookName === 'useDialTimeline' || hookName === 'createDialTimeline') {\n return `Update the ${hookName} configuration for \"${panelName}\" with these values:\n\n\\`\\`\\`json\n${jsonStr}\n\\`\\`\\`\n\nApply these values as the new defaults in the ${hookName} call. Keep the existing \\`clip.current\\` bindings while this timeline is being authored; do not convert the animation or remove DialKit yet.\n\nAdd this comment immediately above the ${hookName} call as a production handoff note:\n\n\\`\\`\\`tsx\n// TODO(production): DialKit's clip.current values are the scrubbable authoring preview.\n// Replace them with equivalent real Motion animations using the tuned timeline\n// timings and transitions, then remove ${hookName} and <DialTimeline />.\n\\`\\`\\``;\n }\n\n return `Update the ${hookName} configuration for \"${panelName}\" with these values:\n\n\\`\\`\\`json\n${jsonStr}\n\\`\\`\\`\n\nApply these values as the new defaults in the ${hookName} call.`;\n}\n","// Shared environment detection for dev-only rendering.\n\ndeclare const process: { env?: { NODE_ENV?: string } } | undefined;\n\nexport const isDevDefault = typeof process !== 'undefined' && process?.env?.NODE_ENV\n ? process.env.NODE_ENV !== 'production'\n : typeof import.meta !== 'undefined' && (import.meta as any).env?.MODE\n ? (import.meta as any).env.MODE !== 'production'\n : true;\n"],"mappings":";AAkDO,SAAS,SAAS,UAAkB,WAA2B;AACpE,MAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,YAAY,EAAG,QAAO;AACxD,MAAI,CAAC,OAAO,SAAS,SAAS,EAAG,aAAY;AAC7C,QAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,SAAS,GAAG,QAAQ;AACvD,SAAO,WAAW,QAAQ,IAAI,WAAW,QAAQ;AACnD;AAIO,SAAS,aACd,MACA,UACA,YAAY,GACqB;AACjC,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,QAAQ,KAAK,YAAY,GAAG;AACzE,WAAO,EAAE,MAAM,GAAG,OAAO,EAAE;AAAA,EAC7B;AACA,MAAI,OAAO,SAAU,QAAO,EAAE,MAAM,OAAO,EAAE;AAC7C,QAAM,OAAO,SAAS,UAAU,SAAS;AACzC,QAAM,OAAO,WAAW;AACxB,QAAM,OAAO,OAAO;AACpB,SAAO,EAAE,MAAM,OAAQ,OAAO,MAAO,OAAO,KAAK,MAAM,OAAO,IAAI,EAAE;AACtE;AAEO,IAAM,uBAAuB;AAAA,EAClC;AAAA;AACF;AAEA,IAAM,kBAAqC,OAAO,OAAO,EAAE,MAAM,GAAG,SAAS,OAAO,UAAU,GAAG,OAAO,EAAE,CAAC;AAE3G,IAAM,qBAAN,MAAyB;AAAA,EAAzB;AACE,SAAQ,YAAuC,oBAAI,IAAI;AACvD,SAAQ,aAA6C,oBAAI,IAAI;AAC7D,SAAQ,YAAwC,oBAAI,IAAI;AACxD,SAAQ,kBAAiC,oBAAI,IAAI;AACjD,SAAQ,qBAA0C,oBAAI,IAAI;AAC1D,SAAQ,YAAmC;AAC3C,SAAQ,QAAuB;AAC/B,SAAQ,WAAW;AAkJnB,SAAQ,OAAO,CAAC,QAAsB;AAGpC,YAAM,KAAK,KAAK,IAAI,IAAI,MAAM,KAAK,YAAY,GAAI;AACnD,WAAK,WAAW;AAEhB,UAAI,aAAa;AACjB,iBAAW,CAAC,IAAI,SAAS,KAAK,KAAK,YAAY;AAC7C,YAAI,CAAC,UAAU,QAAS;AAExB,cAAM,OAAO,KAAK,UAAU,IAAI,EAAE;AAClC,cAAM,WAAW,MAAM,YAAY,UAAU;AAC7C,YAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,YAAY,GAAG;AAC/C,eAAK,WAAW,IAAI,IAAI,EAAE,MAAM,GAAG,SAAS,OAAO,UAAU,GAAG,OAAO,EAAE,CAAC;AAC1E,eAAK,OAAO,EAAE;AACd;AAAA,QACF;AACA,YAAI,OAAO,UAAU,OAAO;AAC5B,YAAI,UAAU;AACd,YAAI,QAAQ,UAAU;AAEtB,YAAI,QAAQ,UAAU;AACpB,cAAI,MAAM,MAAM;AACd,kBAAM,SAAS,aAAa,MAAM,UAAU,KAAK,SAAS;AAC1D,mBAAO,OAAO;AACd,qBAAS,OAAO;AAAA,UAClB,OAAO;AACL,mBAAO;AACP,sBAAU;AAAA,UACZ;AAAA,QACF;AAEA,aAAK,WAAW,IAAI,IAAI,EAAE,MAAM,SAAS,UAAU,MAAM,CAAC;AAC1D,YAAI,QAAS,cAAa;AAC1B,aAAK,OAAO,EAAE;AAAA,MAChB;AAEA,WAAK,QAAQ,aAAa,OAAO,sBAAsB,KAAK,IAAI,IAAI;AAAA,IACtE;AAAA;AAAA,EAtLA,SAAS,MAAoB,SAAsC;AACjE,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK,EAAE;AAC3C,QAAI,YAAY,SAAS,SAAS,KAAK,MAAM;AAC3C,cAAQ;AAAA,QACN,0BAA0B,KAAK,EAAE,+BAA+B,SAAS,IAAI,OACzE,KAAK,IAAI;AAAA,MACf;AAAA,IACF;AACA,SAAK,mBAAmB,IAAI,KAAK,KAAK,KAAK,mBAAmB,IAAI,KAAK,EAAE,KAAK,KAAK,CAAC;AACpF,SAAK,UAAU,MAAM,QAAQ,QAAQ;AAAA,EACvC;AAAA,EAEA,OAAO,MAA0B;AAC/B,QAAI,CAAC,KAAK,UAAU,IAAI,KAAK,EAAE,EAAG;AAClC,SAAK,UAAU,MAAM,KAAK;AAAA,EAC5B;AAAA,EAEA,WAAW,IAAkB;AAC3B,UAAM,aAAa,KAAK,mBAAmB,IAAI,EAAE,KAAK,KAAK;AAC3D,QAAI,YAAY,GAAG;AACjB,WAAK,mBAAmB,IAAI,IAAI,SAAS;AACzC;AAAA,IACF;AAEA,SAAK,mBAAmB,OAAO,EAAE;AACjC,SAAK,UAAU,OAAO,EAAE;AACxB,SAAK,WAAW,OAAO,EAAE;AAIzB,QAAI,KAAK,UAAU,IAAI,EAAE,GAAG,SAAS,EAAG,MAAK,UAAU,OAAO,EAAE;AAChE,SAAK,YAAY;AACjB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,KAAK,IAAkB;AACrB,UAAM,YAAY,KAAK,WAAW,IAAI,EAAE;AACxC,QAAI,CAAC,aAAa,UAAU,YAAY,KAAK,UAAU,QAAS;AAEhE,UAAM,UAAU,UAAU,QAAQ,UAAU;AAC5C,SAAK,WAAW,IAAI,IAAI;AAAA,MACtB,GAAG;AAAA,MACH,MAAM,UAAU,IAAI,UAAU;AAAA,MAC9B,OAAO,UAAU,IAAI,UAAU;AAAA,MAC/B,SAAS;AAAA,IACX,CAAC;AACD,SAAK,OAAO,EAAE;AACd,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,IAAkB;AACtB,UAAM,YAAY,KAAK,WAAW,IAAI,EAAE;AACxC,QAAI,CAAC,aAAa,CAAC,UAAU,QAAS;AACtC,SAAK,WAAW,IAAI,IAAI,EAAE,GAAG,WAAW,SAAS,MAAM,CAAC;AACxD,SAAK,OAAO,EAAE;AAAA,EAChB;AAAA,EAEA,OAAO,IAAkB;AACvB,UAAM,YAAY,KAAK,WAAW,IAAI,EAAE;AACxC,QAAI,CAAC,aAAa,UAAU,YAAY,EAAG;AAC3C,SAAK,WAAW,IAAI,IAAI,EAAE,GAAG,WAAW,MAAM,GAAG,OAAO,GAAG,SAAS,KAAK,CAAC;AAC1E,SAAK,OAAO,EAAE;AACd,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,KAAK,IAAY,MAAoB;AACnC,UAAM,YAAY,KAAK,WAAW,IAAI,EAAE;AACxC,QAAI,CAAC,aAAa,CAAC,OAAO,SAAS,IAAI,EAAG;AAC1C,UAAM,UAAU,KAAK,IAAI,UAAU,UAAU,KAAK,IAAI,GAAG,IAAI,CAAC;AAE9D,SAAK,WAAW,IAAI,IAAI,EAAE,GAAG,WAAW,MAAM,SAAS,OAAO,EAAE,CAAC;AACjE,SAAK,OAAO,EAAE;AAAA,EAChB;AAAA,EAEA,aAAa,IAA+B;AAC1C,WAAO,KAAK,WAAW,IAAI,EAAE,KAAK;AAAA,EACpC;AAAA,EAEA,YAAY,IAAsC;AAChD,WAAO,KAAK,UAAU,IAAI,EAAE;AAAA,EAC9B;AAAA,EAEA,eAA+B;AAC7B,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,YAAY,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,IACrD;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,UAAU,IAAY,UAAgC;AACpD,QAAI,CAAC,KAAK,UAAU,IAAI,EAAE,GAAG;AAC3B,WAAK,UAAU,IAAI,IAAI,oBAAI,IAAI,CAAC;AAAA,IAClC;AACA,SAAK,UAAU,IAAI,EAAE,EAAG,IAAI,QAAQ;AACpC,WAAO,MAAM;AACX,YAAM,YAAY,KAAK,UAAU,IAAI,EAAE;AACvC,iBAAW,OAAO,QAAQ;AAC1B,UAAI,WAAW,SAAS,KAAK,CAAC,KAAK,UAAU,IAAI,EAAE,GAAG;AACpD,aAAK,UAAU,OAAO,EAAE;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB,UAAgC;AAC9C,SAAK,gBAAgB,IAAI,QAAQ;AACjC,WAAO,MAAM;AACX,WAAK,gBAAgB,OAAO,QAAQ;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,UAAU,MAAoB,UAAyB;AAC7D,UAAM,WAAW,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,QAAQ,IAAI;AAC/E,UAAM,YAAY,OAAO,SAAS,KAAK,SAAS,IAC5C,KAAK,IAAI,UAAU,KAAK,IAAI,GAAG,KAAK,SAAS,CAAC,IAC9C;AACJ,UAAM,WAAW,EAAE,GAAG,MAAM,UAAU,UAAU;AAChD,SAAK,UAAU,IAAI,KAAK,IAAI,QAAQ;AAEpC,UAAM,WAAW,KAAK,WAAW,IAAI,KAAK,EAAE;AAC5C,QAAI,UAAU;AAEZ,WAAK,WAAW,IAAI,KAAK,IAAI;AAAA,QAC3B,MAAM,KAAK,IAAI,SAAS,MAAM,QAAQ;AAAA,QACtC,SAAS,WAAW,KAAK,SAAS;AAAA,QAClC;AAAA,QACA,OAAO,SAAS;AAAA,MAClB,CAAC;AAAA,IACH,OAAO;AACL,YAAM,UAAU,WAAW,KAAK;AAChC,WAAK,WAAW,IAAI,KAAK,IAAI,EAAE,MAAM,GAAG,SAAS,UAAU,OAAO,EAAE,CAAC;AACrE,UAAI,QAAS,MAAK,WAAW;AAAA,IAC/B;AAEA,SAAK,YAAY;AACjB,SAAK,OAAO,KAAK,EAAE;AACnB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,aAAmB;AACzB,QAAI,KAAK,UAAU,QAAQ,OAAO,WAAW,YAAa;AAC1D,SAAK,WAAW,YAAY,IAAI;AAChC,SAAK,QAAQ,OAAO,sBAAsB,KAAK,IAAI;AAAA,EACrD;AAAA,EA0CQ,OAAO,IAAkB;AAC/B,SAAK,UAAU,IAAI,EAAE,GAAG,QAAQ,CAAC,OAAO,GAAG,CAAC;AAAA,EAC9C;AAAA,EAEQ,eAAqB;AAC3B,SAAK,gBAAgB,QAAQ,CAAC,OAAO,GAAG,CAAC;AAAA,EAC3C;AACF;AAGO,IAAM,gBAAgC,oBAAI,mBAAmB;;;AC7QpE,SAAS,aAAa,WAAW,YAAY,yBAAyB;;;ACVtE,SAAS,qBAAqB,2BAA2B;AAKlD,SAAS,OAAO,OAAuB;AAC5C,SAAO,KAAK,MAAM,QAAQ,GAAG,IAAI;AACnC;AAEO,SAAS,MAAM,OAAe,KAAa,KAAqB;AACrE,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC;AAC3C;AAEO,SAAS,mBAAmB,OAA2C;AAC5E,SAAO,oBAAoB,KAAK,KAAK,oBAAoB,KAAK;AAChE;AAEO,SAAS,gBAAgB,YAAuC;AACrE,SACE,WAAW,SAAS,aACnB,WAAW,cAAc,UAAa,WAAW,YAAY,UAAa,WAAW,SAAS;AAEnG;AAEO,SAAS,aAAa,QAAoC;AAC/D,MAAI,gBAAgB,MAAM,GAAG;AAC3B,WAAO,EAAE,WAAW,OAAO,aAAa,KAAK,SAAS,OAAO,WAAW,IAAI,MAAM,OAAO,QAAQ,EAAE;AAAA,EACrG;AAEA,QAAM,iBAAiB,KAAK,IAAI,MAAM,OAAO,kBAAkB,GAAG;AAClE,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,OAAQ,IAAI,KAAK,MAAO,iBAAiB;AAC/C,QAAM,YAAY,OAAO;AACzB,QAAM,UAAU,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,SAAS;AACjF,SAAO,EAAE,WAAW,SAAS,MAAM,EAAE;AACvC;AAGO,SAAS,eAAe,GAAW,EAAE,WAAW,SAAS,KAAK,GAAyB;AAC5F,MAAI,KAAK,EAAG,QAAO;AACnB,QAAM,KAAK,KAAK,KAAK,YAAY,IAAI;AACrC,QAAM,OAAO,WAAW,IAAI,KAAK,KAAK,YAAY,IAAI;AAEtD,MAAI,OAAO,QAAQ;AACjB,UAAMA,MAAK,KAAK,KAAK,KAAK,IAAI,OAAO,IAAI;AACzC,WAAO,IAAI,KAAK,IAAI,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,IAAIA,MAAK,CAAC,IAAM,OAAO,KAAMA,MAAM,KAAK,IAAIA,MAAK,CAAC;AAAA,EAChG;AACA,MAAI,OAAO,QAAQ;AACjB,WAAO,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK;AAAA,EAC3C;AACA,QAAM,KAAK,KAAK,KAAK,KAAK,OAAO,OAAO,CAAC;AACzC,QAAM,KAAK,CAAC,OAAO,KAAK;AACxB,QAAM,KAAK,CAAC,OAAO,KAAK;AACxB,SAAO,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK;AACrE;AAGO,SAAS,qBAAqB,QAA8B;AACjE,QAAM,KAAK,KAAK,KAAK,OAAO,YAAY,OAAO,IAAI;AACnD,QAAM,OAAO,OAAO,WAAW,IAAI,KAAK,KAAK,OAAO,YAAY,OAAO,IAAI;AAC3E,QAAM,QACJ,QAAQ,IACJ,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,GAAG,OAAO,OAAO,CAAC,CAAC,IACvD,OAAO;AACb,QAAM,WAAW,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,IAAI;AACrD,SAAO,OAAO,MAAM,UAAU,MAAM,EAAE,CAAC;AACzC;AAGO,SAAS,oBAAoB,GAAW,CAAC,IAAI,IAAI,IAAI,EAAE,GAA6C;AACzG,MAAI,KAAK,EAAG,QAAO;AACnB,MAAI,KAAK,EAAG,QAAO;AAEnB,QAAM,UAAU,CAACC,OAAc,WAAWA,IAAG,IAAI,EAAE;AACnD,QAAM,UAAU,CAACA,OAAc,WAAWA,IAAG,IAAI,EAAE;AAEnD,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,IAAI,QAAQ,CAAC,IAAI;AACvB,QAAI,KAAK,IAAI,CAAC,IAAI,KAAM,QAAO,QAAQ,CAAC;AACxC,UAAM,KAAK,qBAAqB,GAAG,IAAI,EAAE;AACzC,QAAI,KAAK,IAAI,EAAE,IAAI,KAAM;AACzB,SAAK,IAAI;AAAA,EACX;AAEA,MAAI,KAAK;AACT,MAAI,KAAK;AACT,MAAI;AACJ,SAAO,KAAK,KAAK,MAAM;AACrB,QAAI,QAAQ,CAAC,IAAI,EAAG,MAAK;AAAA,QACpB,MAAK;AACV,SAAK,KAAK,MAAM;AAAA,EAClB;AACA,SAAO,QAAQ,CAAC;AAClB;AAEA,SAAS,WAAW,GAAW,IAAY,IAAoB;AAC7D,UAAS,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI,KAAO,IAAI,KAAK,IAAI,MAAM,IAAI,IAAM,IAAI,KAAK;AACvF;AAEA,SAAS,qBAAqB,GAAW,IAAY,IAAoB;AACvE,SAAO,KAAK,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI;AAC7E;AAcO,SAAS,sBACd,KACA,cACwB;AACxB,QAAM,eAAe,KAAK,IAAI,MAAM,YAAY;AAEhD,MAAI,IAAI,SAAS,UAAU;AACzB,WAAO;AAAA,MACL,YAAY,EAAE,GAAG,KAAK,UAAU,aAAa;AAAA,MAC7C,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,EACF;AACA,MAAI,gBAAgB,GAAG,GAAG;AACxB,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,UAAU,qBAAqB,aAAa,GAAG,CAAC;AAAA,MAChD,WAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO;AAAA,IACL,YAAY,EAAE,MAAM,UAAU,QAAQ,IAAI,UAAU,KAAK,gBAAgB,aAAa;AAAA,IACtF,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AACF;;;ADiGO,IAAM,kBAAkB;AACxB,IAAM,6BAA6B;AAC1C,IAAM,wBAAwB;AAC9B,IAAM,0BAA4C,EAAE,MAAM,UAAU,QAAQ,IAAI;AAChF,IAAM,gBAAgB,oBAAI,IAAI,CAAC,QAAQ,WAAW,YAAY,QAAQ,SAAS,UAAU,MAAM,CAAC;AAUhG,SAAS,aAAa,OAA6C;AACjE,SAAO,cAAc,KAAK,KAAK,OAAO,SAAU,MAA6B,EAAE;AACjF;AAKA,SAAS,cAAc,OAA8C;AACnE,MAAI,CAAC,cAAc,KAAK,KAAK,QAAQ,MAAO,QAAO;AACnD,QAAM,UAAU,OAAO,OAAO,KAAK;AACnC,SAAO,QAAQ,SAAS,KAAK,QAAQ,KAAK,YAAY;AACxD;AAEA,SAAS,cAAc,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,kBAAkB,OAAgB,WAAW,GAAW;AAC/D,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IACrD,KAAK,IAAI,GAAG,KAAK,IACjB;AACN;AAEA,SAAS,iBAAiB,OAAgB,WAAW,uBAA+B;AAClF,SAAO,KAAK,IAAI,4BAA4B,kBAAkB,OAAO,QAAQ,CAAC;AAChF;AAEA,SAAS,0BAA0B,YAAsC;AACvE,MAAI,WAAW,SAAS,SAAU,QAAO,iBAAiB,WAAW,QAAQ;AAG7E,MAAI,gBAAgB,UAAU,GAAG;AAC/B,WAAO,iBAAiB,qBAAqB,aAAa,UAAU,CAAC,CAAC;AAAA,EACxE;AACA,MAAI,WAAW,mBAAmB,OAAW,QAAO,iBAAiB,WAAW,cAAc;AAC9F,SAAO,iBAAiB,qBAAqB,aAAa,UAAU,CAAC,CAAC;AACxE;AAMA,SAAS,oBACP,MACA,qBACQ;AACR,QAAM,QAAQ,KAAK,cAAc;AACjC,MAAI,SAAS,gBAAgB,KAAK,EAAG,QAAO,0BAA0B,KAAK;AAC3E,MAAI,KAAK,aAAa,OAAW,QAAO,iBAAiB,KAAK,QAAQ;AACtE,MAAI,KAAK,WAAY,QAAO,0BAA0B,KAAK,UAAU;AACrE,SAAO;AACT;AAEA,SAAS,qBACP,OACA,qBACQ;AACR,QAAM,QAAQ,MAAM,cAAc;AAClC,MAAI,MAAM,OAAO,QAAQ;AACvB,WAAO,MAAM,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,oBAAoB,MAAM,KAAK,GAAG,CAAC;AAAA,EACpF;AACA,MAAI,SAAS,gBAAgB,KAAK,EAAG,QAAO,0BAA0B,KAAK;AAC3E,MAAI,MAAM,aAAa,OAAW,QAAO,iBAAiB,MAAM,QAAQ;AACxE,MAAI,MAAM,WAAY,QAAO,0BAA0B,MAAM,UAAU;AACvE,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAkC;AAC7D,QAAM,eAAe,mBAAmB,KAAK,UAAU,IACnD,KAAK,aACL;AACJ,MAAI,KAAK,OAAO;AACd,WAAO,OAAO,OAAO,KAAK,KAAK,EAAE;AAAA,MAC/B,CAAC,KAAK,UAAU,KAAK;AAAA,QACnB;AAAA,QACA,kBAAkB,MAAM,KAAK,IAAI,qBAAqB,OAAO,YAAY;AAAA,MAC3E;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,OAAO,QAAQ;AACtB,WAAO,KAAK,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,oBAAoB,MAAM,YAAY,GAAG,CAAC;AAAA,EAC1F;AAEA,QAAM,YAAY,QAAQ,KAAK,cAAc,KAAK,QAAQ,KAAK,EAAE;AAEjE,MAAI,CAAC,UAAW,QAAO,kBAAkB,KAAK,QAAQ;AACtD,MAAI,gBAAgB,YAAY,EAAG,QAAO,0BAA0B,YAAY;AAChF,MAAI,KAAK,aAAa,OAAW,QAAO,iBAAiB,KAAK,QAAQ;AACtE,MAAI,mBAAmB,KAAK,UAAU,EAAG,QAAO,0BAA0B,KAAK,UAAU;AAIzF,SAAO,KAAK,QAAQ,KAAK,KAAK,0BAA0B,uBAAuB,IAAI;AACrF;AAEO,SAAS,kBAAkB,OAAkC;AAGlE,MAAI,UAAU,QAAQ,UAAU,YAAY,UAAU,SAAU,QAAO;AACvE,SAAO;AACT;AAKA,SAAS,0BAA0B,YAA8B,cAAwC;AACvG,MAAI,WAAW,SAAS,UAAU;AAChC,WAAO,EAAE,GAAG,YAAY,UAAU,aAAa;AAAA,EACjD;AACA,MAAI,gBAAgB,UAAU,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,SAAO,EAAE,MAAM,UAAU,QAAQ,WAAW,UAAU,IAAI;AAC5D;AASA,SAAS,mBAAmB,QAA0C;AACpE,QAAM,UAA4B,CAAC;AACnC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,QAAQ,WAAY;AACxB,QAAI,cAAc,IAAI,GAAG,GAAG;AAC1B,cAAQ,KAAK,2BAA2B,GAAG,iDAAiD;AAC5F;AAAA,IACF;AACA,QAAI,aAAa,KAAK,GAAG;AACvB,cAAQ,KAAK,EAAE,MAAM,KAAK,UAAU,KAAK,MAAM,MAAM,CAAC;AAAA,IACxD,WAAW,cAAc,KAAK,GAAG;AAC/B,iBAAW,CAAC,UAAU,SAAS,KAAK,OAAO,QAAQ,KAAK,GAAG;AACzD,YAAI,aAAa,SAAS,GAAG;AAC3B,kBAAQ,KAAK,EAAE,MAAM,GAAG,GAAG,IAAI,QAAQ,IAAI,UAAU,OAAO,KAAK,MAAM,UAAU,CAAC;AAAA,QACpF,OAAO;AACL,kBAAQ;AAAA,YACN,4BAA4B,GAAG,IAAI,QAAQ;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,cAAQ;AAAA,QACN,6BAA6B,GAAG;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,cAAc,QAAgE;AACrF,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,SAAqB,CAAC;AAC5B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,UAAU,OAAW,QAAO,GAAG,IAAI;AAAA,EACzC;AACA,SAAO;AACT;AAEA,SAAS,YAAY,YAAwB,MAAc,OAAyB;AAClF,QAAM,WAAW,KAAK,MAAM,GAAG;AAC/B,MAAI,OAAO;AACX,aAAW,WAAW,SAAS,MAAM,GAAG,EAAE,GAAG;AAC3C,WAAQ,kCAAkB,CAAC;AAAA,EAC7B;AACA,OAAK,SAAS,SAAS,SAAS,CAAC,CAAC,IAAI;AACxC;AAEO,SAAS,oBAAoB,QAAwC;AAC1E,QAAM,UAAU,mBAAmB,MAAM;AAEzC,MAAI,SAAS;AACb,aAAW,EAAE,KAAK,KAAK,SAAS;AAC9B,aAAS,KAAK,IAAI,QAAQ,kBAAkB,KAAK,EAAE,IAAI,oBAAoB,IAAI,CAAC;AAAA,EAClF;AAMA,QAAM,WACJ,OAAO,OAAO,aAAa,YAAY,OAAO,SAAS,OAAO,QAAQ,KAAK,OAAO,WAAW,IACzF,OAAO,WACP,SAAS,IACP,KAAK,KAAK,SAAS,MAAM,IAAI,IAAI,MACjC;AAER,QAAM,aAAyB,CAAC;AAChC,QAAM,QAA4B,CAAC;AAEnC,UAAQ,QAAQ,CAAC,EAAE,MAAM,UAAU,OAAO,KAAK,GAAG,UAAU;AAG1D,UAAM,MAAM;AAMZ,QAAI,IAAI,UAAU,IAAI,OAAO,UAAU,IAAI,QAAQ,IAAI,KAAK;AAC1D,cAAQ;AAAA,QACN,4BAA4B,IAAI;AAAA,MAClC;AAAA,IACF,WAAW,IAAI,OAAO,UAAU,IAAI,IAAI;AACtC,cAAQ;AAAA,QACN,4BAA4B,IAAI;AAAA,MAClC;AAAA,IACF;AAEA,UAAM,WAAW,QAAQ,KAAK,OAAO,MAAM,KAAK,CAAC,KAAK;AACtD,UAAM,WAAW,QAAQ,KAAK,KAAK;AACnC,UAAM,SAAS,mBAAmB,KAAK,UAAU,IAAI,KAAK,aAAa;AACvE,UAAM,QAAQ,oBAAoB,IAAI;AACtC,UAAM,eAAe,UAAU;AAC/B,UAAM,SAAS,kBAAkB,KAAK,EAAE;AAExC,UAAM,WAAuB;AAAA,MAC3B,IAAI,CAAC,QAAQ,GAAG,UAAU,eAAe;AAAA,IAC3C;AAGA,QAAI,CAAC,YAAY,CAAC,UAAU;AAC1B,eAAS,WAAW,CAAC,OAAO,GAAG,UAAU,eAAe;AAAA,IAC1D;AAIA,QAAI,CAAC,YAAY,CAAC,aAAa,KAAK,cAAc,KAAK,QAAQ,KAAK,KAAK;AACvE,eAAS,aAAa,0BAA0B,cAAc,KAAK;AAAA,IACrE;AAKA,QAAI;AACJ,QAAI,KAAK,OAAO;AACd,eAAS,CAAC;AACV,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK,GAAG;AACtD,YAAI,eAAe,IAAI,IAAI,KAAK,YAAY,KAAK,IAAI,GAAG;AACtD,kBAAQ,KAAK,gCAAgC,IAAI,+CAA+C;AAChG;AAAA,QACF;AACA,cAAM,gBAAgB,qBAAqB,OAAO,YAAY;AAC9D,cAAM,aAAa,MAAM,cAAc;AACvC,cAAM,gBAAgB,QAAQ,MAAM,OAAO,MAAM;AACjD,cAAM,YAAwB;AAAA,UAC5B,OAAO,CAAC,kBAAkB,MAAM,KAAK,GAAG,GAAG,UAAU,eAAe;AAAA,QACtE;AACA,YAAI,CAAC,eAAe;AAClB,oBAAU,WAAW,CAAC,eAAe,GAAG,UAAU,eAAe;AACjE,oBAAU,aAAa,0BAA0B,YAAY,aAAa;AAAA,QAC5E;AACA,cAAM,YAAY,MAAM,SAAS,gBAAgB,SAAY,MAAM;AACnE,YAAI,iBAAiB,cAAc,QAAW;AAC5C,kBAAQ;AAAA,YACN,4BAA4B,IAAI,aAAa,IAAI;AAAA,UACnD;AAAA,QACF;AACA,YAAI,cAAc,QAAW;AAC3B,oBAAU,OAAO,WAAW,MAAM,WAAW,gBAAgB,MAAM,MAAO,CAAC,GAAG,KAAK,MAAM,EAAE;AAAA,QAC7F;AACA,YAAI,CAAC,iBAAiB,MAAM,OAAO,QAAW;AAC5C,oBAAU,KAAK,WAAW,MAAM,MAAM,IAAI,SAAS;AAAA,QACrD;AACA,YAAI;AACJ,YAAI,eAAe;AACjB,0BAAgB,CAAC;AACjB,cAAI,WAAW;AACf,gBAAM,MAAO,QAAQ,CAAC,MAAM,cAAc;AACxC,kBAAM,UAAU,OAAO,YAAY,CAAC;AACpC,0BAAe,KAAK,OAAO;AAC3B,kBAAM,eAAe,oBAAoB,MAAM,UAAU;AACzD,kBAAM,WAAuB;AAAA,cAC3B,UAAU,CAAC,cAAc,GAAG,UAAU,eAAe;AAAA,cACrD,YAAY,0BAA0B,KAAK,cAAc,YAAY,YAAY;AAAA,YACnF;AACA,gBAAI,KAAK,OAAO,QAAW;AACzB,uBAAS,KAAK,WAAW,MAAM,KAAK,IAAI,QAAQ;AAChD,yBAAW,KAAK;AAAA,YAClB;AACA,sBAAU,OAAO,IAAI;AAAA,UACvB,CAAC;AAAA,QACH;AACA,iBAAS,IAAI,IAAI;AACjB,eAAO,KAAK,EAAE,MAAM,UAAU,cAAc,CAAC;AAAA,MAC/C;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ,CAAC,UAAU;AAC1B,eAAS,OAAO;AAAA,QACd,KAAK;AAAA,QACL,WAAW,cAAc,KAAK,MAAO,CAAC,GAAG,EAAE,IAAI,KAAK;AAAA,MACtD;AAAA,IACF;AACA,QAAI,CAAC,YAAY,CAAC,YAAY,KAAK,IAAI;AACrC,eAAS,KAAK,iBAAiB,KAAK,IAAI,KAAK,IAAI;AAAA,IACnD;AAIA,QAAI;AACJ,QAAI,UAAU;AACZ,iBAAW,CAAC;AACZ,UAAI,UAAkC,KAAK;AAC3C,WAAK,MAAO,QAAQ,CAAC,MAAM,cAAc;AACvC,cAAM,UAAU,OAAO,YAAY,CAAC;AACpC,iBAAU,KAAK,OAAO;AACtB,cAAM,eAAe,oBAAoB,MAAM,YAAY;AAC3D,cAAM,WAAuB;AAAA,UAC3B,UAAU,CAAC,cAAc,GAAG,UAAU,eAAe;AAAA,UACrD,YAAY,0BAA0B,KAAK,cAAc,cAAc,YAAY;AAAA,QACrF;AACA,cAAM,SAAS,cAAc,KAAK,EAAE;AACpC,YAAI,QAAQ;AAGV,qBAAW,QAAQ,OAAO,KAAK,MAAM,GAAG;AACtC,gBAAI,CAAC,WAAW,EAAE,QAAQ,UAAU;AAClC,sBAAQ;AAAA,gBACN,4BAA4B,IAAI,gBAAgB,IAAI,4BAA4B,YAAY,CAAC;AAAA,cAC/F;AAAA,YACF;AAAA,UACF;AACA,mBAAS,KAAK,iBAAiB,QAAQ,OAAO;AAAA,QAChD;AACA,iBAAS,OAAO,IAAI;AACpB,kBAAU,EAAE,GAAI,WAAW,CAAC,GAAI,GAAI,UAAU,CAAC,EAAG;AAAA,MACpD,CAAC;AAAA,IACH;AAEA,gBAAY,YAAY,MAAM,QAAQ;AAEtC,UAAM,KAAK;AAAA,MACT,KAAK;AAAA,MACL,OAAO,YAAY,QAAQ;AAAA,MAC3B,OAAO,qBAAqB,QAAQ,qBAAqB,MAAM;AAAA,MAC/D,MAAM,kBAAkB,KAAK,IAAI;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO,EAAE,UAAU,YAAY,MAAM;AACvC;AAEA,IAAM,iBAAiB,oBAAI,IAAI,CAAC,MAAM,YAAY,QAAQ,QAAQ,MAAM,cAAc,OAAO,CAAC;AAI9F,SAAS,WAAW,MAAc,OAAwB,aAA8D;AACtH,QAAM,SAAS;AAAA,IACb,EAAE,CAAC,IAAI,GAAG,MAAM;AAAA,IAChB,gBAAgB,SAAY,SAAa,EAAE,CAAC,IAAI,GAAG,YAAY;AAAA,EACjE;AACA,SAAO,OAAO,IAAI;AACpB;AAOA,IAAM,wBAAgF;AAAA,EACpF,CAAC,0DAA0D,EAAE,KAAK,MAAM,KAAK,KAAK,MAAM,EAAE,CAAC;AAAA,EAC3F,CAAC,qBAAqB,EAAE,KAAK,MAAM,KAAK,KAAK,MAAM,EAAE,CAAC;AAAA,EACtD,CAAC,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK,CAAC;AAAA,EAC1C,CAAC,kBAAkB,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK,CAAC;AAAA,EACjD,CAAC,uBAAuB,EAAE,KAAK,GAAG,KAAK,KAAK,MAAM,EAAE,CAAC;AACvD;AAEA,SAAS,iBAAiB,KAAa,OAAe,aAAmE;AACvH,QAAM,KAAK,KAAK,IAAI,OAAO,eAAe,KAAK;AAC/C,QAAM,KAAK,KAAK,IAAI,OAAO,eAAe,KAAK;AAE/C,QAAM,SAAS,sBAAsB,KAAK,CAAC,CAAC,OAAO,MAAM,QAAQ,KAAK,GAAG,CAAC,IAAI,CAAC;AAC/E,MAAI,QAAQ;AACV,WAAO,CAAC,OAAO,KAAK,IAAI,OAAO,KAAK,EAAE,GAAG,KAAK,IAAI,OAAO,KAAK,EAAE,GAAG,OAAO,IAAI;AAAA,EAChF;AAIA,MAAI,MAAM,KAAK,MAAM,GAAG;AACtB,WAAO,CAAC,OAAO,GAAG,GAAG,IAAI;AAAA,EAC3B;AACA,QAAM,SAAS,KAAK,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,EAAE,GAAG,CAAC;AACrD,QAAM,MAAM,KAAK,IAAI,CAAC,SAAS,IAAI;AACnC,QAAM,MAAM,KAAK,IAAI,SAAS,GAAG,EAAE;AACnC,SAAO,CAAC,OAAO,KAAK,KAAK,UAAU,KAAK,GAAG,CAAC;AAC9C;AAIA,SAAS,iBAAiB,QAAoB,aAAiD;AAC7F,QAAM,SAAqB,CAAC;AAC5B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAM,QAAQ,cAAc,GAAG;AAC/B,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,GAAG,IAAI,iBAAiB,KAAK,OAAO,OAAO,UAAU,WAAW,QAAQ,MAAS;AAAA,IAC1F,WAAW,cAAc,KAAK,KAAK,EAAE,UAAU,QAAQ;AACrD,aAAO,GAAG,IAAI;AAAA,QACZ;AAAA,QACA,cAAc,KAAK,KAAK,EAAE,UAAU,SAAU,QAAuB;AAAA,MACvE;AAAA,IACF,OAAO;AACL,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAaA,SAAS,YAAY,YAA0C,UAA+B;AAC5F,MAAI,CAAC,WAAY,QAAO,EAAE,SAAS;AACnC,MAAI,WAAW,SAAS,SAAU,QAAO,EAAE,UAAU,MAAM,WAAW,KAAK;AAC3E,QAAM,SAAS,aAAa,UAAU;AACtC,SAAO,EAAE,UAAU,QAAQ,QAAQ,qBAAqB,MAAM,EAAE;AAClE;AAEA,SAAS,YAAY,OAAoB,SAAyB;AAChE,MAAI,WAAW,EAAG,QAAO;AACzB,MAAI,MAAM,QAAQ;AAEhB,QAAI,MAAM,WAAW,UAAa,WAAW,MAAM,OAAQ,QAAO;AAClE,WAAO,eAAe,SAAS,MAAM,MAAM;AAAA,EAC7C;AACA,MAAI,MAAM,MAAM;AACd,WAAO,oBAAoB,MAAM,MAAM,WAAW,IAAI,UAAU,MAAM,WAAW,GAAG,GAAG,CAAC,GAAG,MAAM,IAAI;AAAA,EACvG;AACA,SAAO,MAAM,WAAW,IAAI,KAAK,IAAI,GAAG,UAAU,MAAM,QAAQ,IAAI;AACtE;AAqDA,SAAS,eAAe,UAAmC,MAAuC;AAChG,MAAI,OAAgB;AACpB,aAAW,WAAW,KAAK,MAAM,GAAG,GAAG;AACrC,WAAO,cAAc,IAAI,IAAI,KAAK,OAAO,IAAI;AAAA,EAC/C;AACA,SAAO,cAAc,IAAI,IAAI,OAAO,CAAC;AACvC;AAEO,SAAS,mBACd,QACA,YACsB;AACtB,QAAM,WAAW,kBAAkB,OAAO,YAAY,UAAU;AAChE,SAAO,OAAO,MAAM;AAAA,IAAI,CAAC,SACvB,gBAAgB,eAAe,UAAU,KAAK,GAAG,GAAG,MAAM,OAAO,QAAQ;AAAA,EAC3E;AACF;AAcO,SAAS,sBACd,QACA,YACqB;AACrB,MAAI,QAAQ,mBAAmB,QAAQ,UAAU;AACjD,QAAM,SAAS,MAAM;AAAA,IACnB,CAAC,KAAK,SAAS,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,QAAQ;AAAA,IACpD,OAAO;AAAA,EACT;AACA,QAAM,WAAW,SAAS,OAAO,WAC7B,KAAK,KAAK,SAAS,MAAM,IAAI,IAAI,MACjC,OAAO;AAEX,MAAI,aAAa,OAAO,UAAU;AAChC,YAAQ,MAAM;AAAA,MAAI,CAAC,SACjB,KAAK,SAAS,WAAW,EAAE,GAAG,MAAM,KAAK,SAAS,IAAI;AAAA,IACxD;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,MAAM;AAC3B;AAKO,SAAS,4BACd,QACA,MACA,kBACoB;AACpB,SAAO,gBAAgB,oBAAoB,QAAQ,KAAK,GAAG,GAAG,MAAM,gBAAgB;AACtF;AAEA,SAAS,gBACP,cACA,MACA,kBACoB;AACpB;AACE,UAAM,KAAK,OAAO,aAAa,OAAO,WAAW,aAAa,KAAK;AACnE,UAAM,OAAO,cAAc,aAAa,IAAI,IAAI,aAAa,OAAO;AACpE,UAAM,SAAS,mBAAmB,aAAa,UAAU,IAAI,aAAa,aAAa;AAEvF,UAAM,aAAiC;AAAA,MACrC,KAAK,KAAK;AAAA,MACV,UAAU,KAAK,QAAQ,KAAK,IAAI,MAAM,KAAK,MAAM,SAAS,CAAC,IAAI,KAAK;AAAA,MACpE,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,UAAU;AAAA,MACV,MAAM;AAAA,MACN,KAAK;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA,QAAQ,CAAC;AAAA,MACT,eAAe,QAAQ,KAAK,UAAU,MAAM;AAAA,IAC9C;AAEA,QAAI,KAAK,QAAQ,QAAQ;AAGvB,YAAM,SAAqD,KAAK,OAAO,IAAI,CAAC,EAAE,MAAM,SAAS,MAAM;AACjG,cAAM,gBAAgB,cAAc,aAAa,IAAI,CAAC,IACjD,aAAa,IAAI,IAClB,CAAC;AACL,cAAM,QAAQ,OAAO,cAAc,UAAU,WAAW,cAAc,QAAQ;AAC9E,cAAM,YAAY,cAAc;AAChC,YAAI;AACJ,YAAI,gBAAgB;AAEpB,YAAI,UAAU,QAAQ;AACpB,cAAI,UAAU;AACd,kBAAQ,SAAS,IAAI,CAAC,YAAY;AAChC,kBAAM,eAAe,cAAc,cAAc,OAAO,CAAC,IACpD,cAAc,OAAO,IACtB,CAAC;AACL,kBAAM,iBACJ,OAAO,aAAa,aAAa,WAAW,aAAa,WAAW;AACtE,kBAAM,MAAM,mBAAmB,aAAa,UAAU,IAAI,aAAa,aAAa;AACpF,kBAAM,YAAY,MACd,sBAAsB,KAAK,cAAc,IACzC,EAAE,YAAY,QAAW,UAAU,gBAAgB,WAAW,MAAM;AACxE,kBAAM,UAAU,aAAa;AAC7B,kBAAM,OAA2B;AAAA,cAC/B,KAAK;AAAA,cACL,QAAQ;AAAA,cACR,UAAU,UAAU;AAAA,cACpB,WAAW,UAAU;AAAA,cACrB,OAAO,YAAY,SAAY,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,QAAQ;AAAA,cACtD,IAAI,YAAY,SAAY,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,QAAQ;AAAA,cACnD,OAAO,YAAY,UAAU,YAAY,UAAU,QAAQ;AAAA,YAC7D;AACA,gBAAI,YAAY,OAAW,WAAU;AACrC,6BAAiB,UAAU;AAC3B,mBAAO;AAAA,UACT,CAAC;AAAA,QACH,OAAO;AACL,gBAAM,iBACJ,OAAO,cAAc,aAAa,WAAW,cAAc,WAAW;AACxE,gBAAM,MAAM,mBAAmB,cAAc,UAAU,IAAI,cAAc,aAAa;AACtF,gBAAM,YAAY,MACd,sBAAsB,KAAK,cAAc,IACzC,EAAE,YAAY,QAAW,UAAU,gBAAgB,WAAW,MAAM;AACxE,gBAAM,UAAU,cAAc;AAC9B,0BAAgB,UAAU;AAC1B,kBAAQ;AAAA,YACN;AAAA,cACE,KAAK;AAAA,cACL,QAAQ;AAAA,cACR,UAAU,UAAU;AAAA,cACpB,WAAW,UAAU;AAAA,cACrB,OAAO,cAAc,SAAY,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,UAAU;AAAA,cAC1D,IAAI,YAAY,SAAY,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,QAAQ;AAAA,cACnD,OAAO,YAAY,UAAU,YAAY,UAAU,QAAQ;AAAA,YAC7D;AAAA,UACF;AAAA,QACF;AAEA,eAAO,EAAE,MAAM,OAAO,UAAU,eAAe,MAAM;AAAA,MACvD,CAAC;AAED,iBAAW,SAAS;AACpB,iBAAW,QAAQ,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AACnD,iBAAW,WAAW,OAAO,OAAO,CAAC,KAAK,UAAU,KAAK,IAAI,KAAK,MAAM,QAAQ,MAAM,QAAQ,GAAG,CAAC;AAClG,iBAAW,OAAO,OAAO;AAAA,QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,MAAM,MAAM,CAAC,EAAE,MAAM,MAAM,IAAI,CAAC,CAAC;AAAA,MACtE;AACA,iBAAW,KAAK,OAAO;AAAA,QACrB,OAAO,IAAI,CAAC,UAAU;AACpB,gBAAM,OAAO,MAAM,MAAM,MAAM,MAAM,SAAS,CAAC;AAC/C,iBAAO,CAAC,MAAM,MAAM,KAAK,GAAG,MAAM,IAAI,KAAK,KAAK,MAAM,MAAM,IAAI,CAAC;AAAA,QACnE,CAAC;AAAA,MACH;AAEA,iBAAW,OAAO,WAAW,WAAW,IAAI,KAAK,OAAO;AACxD,iBAAW,MAAM,WAAW,SAAS,QAAQ,WAAW,KAAK,WAAW,WAAW;AACnF,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,UAAU,QAAQ;AAGzB,UAAI,UAAmC,EAAE,GAAI,QAAQ,CAAC,EAAG;AACzD,UAAI,SAAS;AACb,YAAM,QAA8B,KAAK,SAAS,IAAI,CAAC,YAAY;AACjE,cAAM,eAAe,cAAc,aAAa,OAAO,CAAC,IACnD,aAAa,OAAO,IACrB,CAAC;AACL,cAAM,iBACJ,OAAO,aAAa,aAAa,WAAW,aAAa,WAAW;AACtE,cAAM,MAAM,mBAAmB,aAAa,UAAU,IAAI,aAAa,aAAa;AACpF,cAAM,YAAY,MACd,sBAAsB,KAAK,cAAc,IACzC,EAAE,YAAY,QAAW,UAAU,gBAAgB,WAAW,MAAM;AACxE,cAAM,KAAK,cAAc,aAAa,EAAE,IAAI,aAAa,KAAK,CAAC;AAC/D,cAAM,OAA2B;AAAA,UAC/B,KAAK;AAAA,UACL;AAAA,UACA,UAAU,UAAU;AAAA,UACpB,WAAW,UAAU;AAAA,UACrB,OAAO;AAAA,UACP;AAAA,UACA,OAAO,YAAY,UAAU,YAAY,UAAU,QAAQ;AAAA,QAC7D;AACA,kBAAU,EAAE,GAAG,SAAS,GAAG,GAAG;AAC9B,kBAAU,UAAU;AACpB,eAAO;AAAA,MACT,CAAC;AAED,iBAAW,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,QAAQ,MAAM,CAAC;AAC1D,iBAAW,WAAW;AACtB,iBAAW,KAAK;AAAA,IAClB,OAAO;AACL,YAAM,iBAAiB,OAAO,aAAa,aAAa,WAAW,aAAa,WAAW;AAC3F,YAAM,KAAK,cAAc,aAAa,EAAE,IAAI,aAAa,KAAK;AAE9D,UAAI,QAAQ;AACV,cAAM,YAAY,sBAAsB,QAAQ,cAAc;AAC9D,mBAAW,WAAW,UAAU;AAChC,mBAAW,YAAY,UAAU;AACjC,mBAAW,aAAa,UAAU;AAClC,mBAAW,MAAM,gBAAgB,UAAU,UAAU;AACrD,mBAAW,KAAK;AAChB,YAAI,QAAQ,IAAI;AACd,qBAAW,SAAS;AAAA,YAClB;AAAA,cACE,OAAO;AAAA,cACP,UAAU,UAAU;AAAA,cACpB,OAAO;AAAA,gBACL;AAAA,kBACE,KAAK;AAAA,kBACL,QAAQ;AAAA,kBACR,UAAU,UAAU;AAAA,kBACpB,WAAW,UAAU;AAAA,kBACrB,OAAO;AAAA,kBACP;AAAA,kBACA,OAAO,YAAY,UAAU,YAAY,UAAU,QAAQ;AAAA,gBAC7D;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AAGL,mBAAW,WAAW;AACtB,mBAAW,KAAK;AAChB,YAAI,QAAQ,IAAI;AACd,gBAAM,OAAO,sBAAsB,yBAAyB,cAAc;AAC1E,qBAAW,WAAW,KAAK;AAC3B,qBAAW,SAAS;AAAA,YAClB;AAAA,cACE,OAAO;AAAA,cACP,UAAU,KAAK;AAAA,cACf,OAAO;AAAA,gBACL;AAAA,kBACE,KAAK;AAAA,kBACL,QAAQ;AAAA,kBACR,UAAU,KAAK;AAAA,kBACf,WAAW;AAAA,kBACX,OAAO;AAAA,kBACP;AAAA,kBACA,OAAO,YAAY,KAAK,YAAY,KAAK,QAAQ;AAAA,gBACnD;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW,OAAO,QAAQ;AAC5B,YAAM,QAAQ,IAAI,IAAY,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC;AACrD,iBAAW,SAAS,WAAW,QAAQ;AACrC,mBAAW,QAAQ,MAAM,OAAO;AAC9B,qBAAW,QAAQ,OAAO,KAAK,KAAK,EAAE,EAAG,OAAM,IAAI,IAAI;AAAA,QACzD;AAAA,MACF;AACA,iBAAW,QAAQ,MAAM,KAAK,KAAK;AAAA,IACrC;AAEA,eAAW,OAAO,WAAW,WAAW,IAAI,KAAK,OAAO;AACxD,eAAW,MAAM,WAAW,SAAS,QAAQ,WAAW,KAAK,WAAW,WAAW;AAEnF,WAAO;AAAA,EACT;AACF;AAIA,SAAS,eAAe,OAA6B,KAAiC;AACpF,aAAW,QAAQ,OAAO;AACxB,QAAI,MAAM,KAAK,SAAS,KAAK,SAAU,QAAO;AAAA,EAChD;AACA,SAAO,MAAM,MAAM,SAAS,CAAC;AAC/B;AAIA,SAAS,cAAc,OAA6B,MAAc,KAAsB;AACtF,QAAM,OAAO,eAAe,OAAO,GAAG;AACtC,QAAM,SAAS,KAAK,IAAI,GAAG,MAAM,KAAK,MAAM;AAC5C,MAAI,QAAQ,KAAK,IAAI;AACnB,UAAM,QAAQ,YAAY,KAAK,OAAO,MAAM;AAC5C,WAAO,oBAAoB,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AAAA,EACnE;AACA,SAAO,KAAK,MAAM,IAAI;AACxB;AASO,SAAS,iBACd,MACA,MACA,YAAY,MACa;AACzB,QAAM,QAAQ,KAAK;AACnB,QAAM,UAAU,KAAK,SAAS,YAAY,QAAQ;AAGlD,QAAM,UAAU,QAAQ,KAAK,MAAO,WAAW,YAAY;AAC3D,QAAM,OAAO,QAAQ,KAAK;AAC1B,QAAM,UAAU,OAAO,KAAK;AAC5B,QAAM,eAAe,UAAU,YAAY,KAAK,KAAK;AAErD,QAAM,OAAO,CAAC,MAAuB,UAAU,IAAI,QAAQ;AAE3D,QAAM,UAAU,UAAU,KAAK,KAAK,IAAI,GAAG,YAAY,CAAC,IAAI;AAC5D,QAAM,WAAW,QAAQ,IAAI,MAAM,UAAU,OAAO,GAAG,CAAC,IAAI,UAAU,IAAI;AAE1E,MAAI;AACJ,MAAI,YAAY;AAEhB,MAAI,KAAK,OAAO,UAAU,KAAK,OAAO,QAAQ;AAK5C,cAAU,CAAC;AACX,eAAW,SAAS,KAAK,QAAQ;AAC/B,YAAM,QAAQ,MAAM,SAAS,SAAY,CAAC,MAAM,IAAI,IAAI,KAAK;AAC7D,iBAAW,QAAQ,OAAO;AACxB,cAAM,aAAa,MAAM,MAAM,CAAC,GAAG,MAAM,IAAI;AAC7C,YAAI,CAAC,SAAS;AACZ,cAAI,eAAe,OAAW,SAAQ,IAAI,IAAI;AAC9C;AAAA,QACF;AACA,cAAM,QAAQ,eAAe,MAAM;AACnC,YAAI,SAAS,GAAG;AACd,cAAI,eAAe,OAAW,SAAQ,IAAI,IAAI;AAC9C;AAAA,QACF;AACA,cAAM,MAAM,WAAW,MAAM,WAAW,IAAI,QAAQ,MAAM,WAAW;AACrE,cAAM,QAAQ,cAAc,MAAM,OAAO,MAAM,GAAG;AAClD,YAAI,UAAU,OAAW,SAAQ,IAAI,IAAI;AAAA,MAC3C;AAAA,IACF;AACA,UAAM,SAAS,KAAK,OAAO,CAAC;AAC5B,QAAI,WAAW,KAAK,iBAAiB,OAAO,SAAS,QAAW;AAC9D,kBAAY,OAAO,MAAM,QAAQ,eAAe,OAAO,OAAO,OAAO,CAAC;AAAA,IACxE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,UAAU,KAAK;AAAA,IACf,MAAM,KAAK;AAAA,IACX;AAAA,IACA,QAAQ,WAAW,CAAC;AAAA,IACpB;AAAA,IACA;AAAA,IACA,MAAM,KAAK,gBAAgB,YAAY;AAAA,IACvC,MAAM,KAAK;AAAA,IACX,IAAI,KAAK;AAAA,IACT,SAAS,UAAU,KAAK,KAAK,KAAK;AAAA,IAClC,YAAY,KAAK;AAAA,IACjB,KAAK,KAAK;AAAA,IACV;AAAA,EACF;AACF;AAOO,SAAS,oBAAoB,MAAe,IAAa,GAAoB;AAClF,MAAI,OAAO,SAAS,YAAY,OAAO,OAAO,UAAU;AACtD,WAAO,QAAQ,KAAK,QAAQ;AAAA,EAC9B;AACA,MAAI,OAAO,SAAS,YAAY,OAAO,OAAO,UAAU;AACtD,UAAM,QAAQ,aAAa,MAAM,IAAI,CAAC;AACtC,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,MAAI,cAAc,IAAI,KAAK,cAAc,EAAE,GAAG;AAC5C,UAAM,SAAkC,CAAC;AACzC,eAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,aAAO,GAAG,IAAI,OAAO,KAAK,oBAAoB,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG;AAAA,IACjF;AACA,eAAW,OAAO,OAAO,KAAK,EAAE,GAAG;AACjC,UAAI,EAAE,OAAO,MAAO,QAAO,GAAG,IAAI,GAAG,GAAG;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AACA,SAAO,IAAI,MAAM,OAAO;AAC1B;AAEA,SAAS,SAAS,KAAsD;AACtE,MAAI,CAAC,WAAW,GAAG,EAAG,QAAO;AAC7B,MAAI,IAAI,IAAI,MAAM,CAAC;AACnB,MAAI,EAAE,WAAW,EAAG,KAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE;AAC7D,SAAO;AAAA,IACL,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC1B,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC1B,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAC1B,EAAE,WAAW,IAAI,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,IAAI;AAAA,EACjD;AACF;AAEA,SAAS,aAAa,GAAW,GAAW,GAA0B;AACpE,QAAM,KAAK,SAAS,CAAC;AACrB,QAAM,KAAK,SAAS,CAAC;AACrB,MAAI,CAAC,MAAM,CAAC,GAAI,QAAO;AACvB,QAAM,IAAI,MAAM,GAAG,GAAG,CAAC;AACvB,QAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,MAAM,KAAK,MAAM,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC;AAC9D,QAAM,MAAM,CAAC,MAAc,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACzD,QAAM,MAAM,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;AAC7D,SAAO,MAAM,CAAC,MAAM,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;AACxD;AAOO,SAAS,gBAAgB,YAAuE;AACrG,MAAI,CAAC,WAAY,QAAO;AAExB,MAAI,WAAW,SAAS,UAAU;AAChC,WAAO;AAAA,MACL,oBAAoB,GAAG,OAAO,WAAW,QAAQ,CAAC;AAAA,MAClD,0BAA0B,gBAAgB,WAAW,KAAK,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,IAC5F;AAAA,EACF;AAEA,QAAM,SAAS,aAAa,UAAU;AACtC,QAAM,eAAe,OAAO,WAAW,IAAI,KAAK,KAAK,OAAO,YAAY,OAAO,IAAI;AACnF,QAAM,WAAW,WAAW,kBAAkB,qBAAqB,MAAM;AACzE,QAAM,SAAS,WAAW,UAAU,KAAK,IAAI,GAAG,OAAO,IAAI,YAAY,CAAC;AAExE,SAAO;AAAA,IACL,oBAAoB,GAAG,OAAO,QAAQ,CAAC;AAAA,IACvC,0BACE,SAAS,OACP,sBAAsB,OAAO,MAAM,MAAM,CAAC,eAC1C;AAAA,EACN;AACF;AAOO,SAAS,6BACd,QACA,SACA,UACA,SAC2B;AAC3B,QAAM,UAAU,EAAE,GAAG,OAAO;AAC5B,QAAM,OAAO,CAAC,MAAc,aAAqB;AAC/C,UAAM,MAAM,QAAQ,IAAI;AACxB,QAAI,mBAAmB,GAAG,EAAG,SAAQ,IAAI,IAAI,sBAAsB,KAAK,QAAQ,EAAE;AAAA,EACpF;AAEA,MAAI,SAAS;AACX,SAAK,GAAG,OAAO,IAAI,OAAO,eAAe,YAAY,OAAO,GAAG,OAAO,IAAI,OAAO,WAAW,CAAC,CAAC;AAC9F,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,UAAU,SACpB,SAAS,OAAO,CAAC,KAAK,OAAO,MAAM,YAAY,OAAO,GAAG,OAAO,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,IACtF,YAAY,OAAO,GAAG,OAAO,WAAW,CAAC;AAE7C,OAAK,GAAG,OAAO,eAAe,KAAK;AACnC,SAAO;AACT;AAEA,SAAS,YAAY,OAAwB;AAC3C,SAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAMA,SAAS,oBACP,QACA,SACyB;AACzB,QAAM,SAAS,GAAG,OAAO;AACzB,QAAM,SAAkC,CAAC;AACzC,QAAM,UAAU,OAAO,QAAQ,MAAM,EAClC,OAAO,CAAC,CAAC,IAAI,MAAM,KAAK,WAAW,MAAM,CAAC,EAC1C,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,UAAU,KAAK,MAAM,OAAO,MAAM,EAAE,MAAM,GAAG,GAAG,MAAM,EAAE,EAClF,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,SAAS,EAAE,SAAS,MAAM;AAEvD,aAAW,EAAE,UAAU,MAAM,KAAK,SAAS;AACzC,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK;AAC5C,YAAM,WAAW,KAAK,SAAS,CAAC,CAAC;AACjC,aAAQ,cAAc,QAAQ,IAAI,WAAY,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC;AAAA,IACrE;AACA,SAAK,SAAS,SAAS,SAAS,CAAC,CAAC,IAAI,mBAAmB,KAAK;AAAA,EAChE;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAyB;AACnD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,kBAAkB;AAC7D,MAAI,CAAC,cAAc,KAAK,EAAG,QAAO;AAClC,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,MAAM,CAAC,KAAK,mBAAmB,MAAM,CAAC,CAAC;AAAA,EAChF;AACF;AAGO,SAAS,gBACd,OACA,IACA,eACA,kBACQ;AACR,SAAO,MAAM,OAAO,KAAK,GAAG,GAAG,KAAK,IAAI,GAAG,OAAO,mBAAmB,KAAK,aAAa,CAAC,CAAC;AAC3F;AAGO,SAAS,cAAc,IAAY,UAAkB,kBAAkC;AAC5F,SAAO,MAAM,OAAO,EAAE,GAAG,GAAG,KAAK,IAAI,GAAG,mBAAmB,QAAQ,CAAC;AACtE;AAEO,SAAS,mBAAmB,UAAkB,IAAY,kBAAkC;AACjG,SAAO,MAAM,OAAO,QAAQ,GAAG,4BAA4B,mBAAmB,EAAE;AAClF;AAEO,SAAS,qBACd,OACA,IACA,UACkC;AAClC,QAAM,YAAY,MAAM,OAAO,KAAK,GAAG,GAAG,KAAK,WAAW,0BAA0B;AACpF,SAAO,EAAE,IAAI,WAAW,UAAU,OAAO,KAAK,WAAW,SAAS,EAAE;AACtE;AAIO,SAAS,gBACd,UACA,IACA,iBACA,kBACQ;AACR,QAAM,MAAM,KAAK,IAAI,4BAA4B,mBAAmB,KAAK,eAAe;AACxF,SAAO,MAAM,OAAO,QAAQ,GAAG,4BAA4B,GAAG;AAChE;AAIO,SAAS,+BACd,QACA,OAC2B;AAC3B,QAAM,aAAwC,EAAE,GAAG,OAAO;AAK1D,aAAW,QAAQ,OAAO,KAAK,UAAU,GAAG;AAC1C,QAAI,KAAK,SAAS,SAAS,EAAG,QAAO,WAAW,IAAI;AAAA,EACtD;AAEA,QAAM,wBAAwB,CAAC,gBAAwB,iBAAyB;AAC9E,UAAM,MAAM,WAAW,cAAc;AACrC,QAAI,CAAC,mBAAmB,GAAG,EAAG;AAC9B,QAAI,gBAAgB,GAAG,GAAG;AAIxB,iBAAW,YAAY,IAAI,0BAA0B,GAAG;AAAA,IAC1D;AACA,eAAW,cAAc,IAAI;AAAA,MAC3B;AAAA,MACA,YAAY,WAAW,YAAY,CAAC;AAAA,IACtC;AAAA,EACF;AAEA,aAAW,QAAQ,OAAO;AACxB,eAAW,WAAW,KAAK,YAAY,CAAC,GAAG;AACzC;AAAA,QACE,GAAG,KAAK,GAAG,IAAI,OAAO;AAAA,QACtB,GAAG,KAAK,GAAG,IAAI,OAAO;AAAA,MACxB;AAAA,IACF;AAEA,0BAAsB,GAAG,KAAK,GAAG,eAAe,GAAG,KAAK,GAAG,WAAW;AAItE,eAAW,SAAS,KAAK,UAAU,CAAC,GAAG;AACrC,YAAM,WAAW,GAAG,KAAK,GAAG,IAAI,MAAM,IAAI;AAC1C,iBAAW,WAAW,MAAM,YAAY,CAAC,GAAG;AAC1C;AAAA,UACE,GAAG,QAAQ,IAAI,OAAO;AAAA,UACtB,GAAG,QAAQ,IAAI,OAAO;AAAA,QACxB;AAAA,MACF;AACA,4BAAsB,GAAG,QAAQ,eAAe,GAAG,QAAQ,WAAW;AACtE,UAAI,WAAW,GAAG,QAAQ,QAAQ,MAAM,GAAG;AACzC,eAAO,WAAW,GAAG,QAAQ,QAAQ;AAAA,MACvC;AAAA,IACF;AAEA,WAAO,WAAW,GAAG,KAAK,GAAG,OAAO;AAAA,EACtC;AACA,SAAO;AACT;AAIO,SAAS,YAAY,MAAc,SAAS,OAAe;AAChE,QAAM,OAAO,KAAK,IAAI,GAAG,IAAI;AAC7B,QAAM,UAAU,KAAK,MAAM,OAAO,EAAE;AACpC,QAAM,UAAU,OAAO,UAAU;AACjC,QAAM,cAAc,SAChB,QAAQ,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,IAClC,OAAO,KAAK,MAAM,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAC/C,SAAO,GAAG,OAAO,OAAO,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,WAAW;AAC3D;AAEO,SAAS,cAAc,OAAuB;AACnD,SAAO,GAAG,OAAO,KAAK,CAAC;AACzB;AAEO,SAAS,gBAAgB,SAAyB;AACvD,QAAM,QAAQ,cAAc,KAAK,OAAO;AACxC,SAAO,QAAQ,QAAQ,MAAM,CAAC,CAAC,KAAK,YAAY,OAAO;AACzD;;;AEl1CO,SAAS,oBACd,MACqC;AACrC,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,OAAO,SAAS,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI;AAAA,IAC/D;AAAA,EACF;AACA,SAAO,EAAE,SAAS,QAAQ,IAAI,GAAG,OAAO,EAAE;AAC5C;AAEO,SAAS,kBACd,IACA,MACA,UACA,QACA,MACc;AACd,QAAM,eAAe,oBAAoB,IAAI;AAC7C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,aAAa;AAAA,IACnB,WAAW,aAAa;AAAA,IACxB,OAAO,OAAO;AAAA,EAChB;AACF;AAMO,SAAS,oBACd,aACA,WACA,kBACA,WACA,SACuB;AAxEzB;AAyEE,QAAM,SAAkC;AAAA,IACtC,MAAM,UAAU;AAAA,IAChB,SAAS,UAAU;AAAA,IACnB,UAAU;AAAA,IACV,GAAG;AAAA,EACL;AAEA,QAAM,OAAO,SAAS,UAAU,UAAU,SAAS;AACnD,QAAM,aAAa,OAAO,IAAI,UAAU,QAAQ,OAAO,KAAK,UAAU;AACtE,aAAW,QAAQ,aAAa;AAC9B,UAAM,QAAQ,iBAAiB,MAAM,UAAU,MAAM,SAAS;AAC9D,QAAI,KAAK,OAAO;AACd,YAAM,SAAU,YAAO,KAAK,WAAZ,aAAuB,CAAC;AACxC,aAAO,KAAK,QAAQ,IAAI;AAAA,IAC1B,OAAO;AACL,aAAO,KAAK,GAAG,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;;;AChFA,IAAM,uBAAN,MAA2B;AAAA,EAA3B;AACE,SAAQ,UAAU;AAClB,SAAQ,cAAc;AACtB,SAAQ,cAAc,oBAAI,IAAkC;AAC5D,SAAQ,YAAY,oBAAI,IAAc;AAAA;AAAA,EAEtC,aAAsB;AACpB,eAAW,cAAc,KAAK,YAAY,OAAO,GAAG;AAClD,UAAI,WAAW,YAAY,OAAW,QAAO,WAAW;AAAA,IAC1D;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,mBAAmB,IAAY,YAA8C;AAC3E,UAAM,WAAW,KAAK,WAAW;AACjC,QAAI,CAAC,KAAK,aAAa;AACrB,WAAK,UAAU,WAAW;AAC1B,WAAK,cAAc;AAAA,IACrB;AACA,SAAK,YAAY,IAAI,IAAI,UAAU;AACnC,QAAI,aAAa,KAAK,WAAW,EAAG,MAAK,OAAO;AAEhD,WAAO,MAAM;AACX,YAAM,SAAS,KAAK,WAAW;AAC/B,WAAK,YAAY,OAAO,EAAE;AAC1B,UAAI,KAAK,YAAY,SAAS,EAAG,MAAK,cAAc;AACpD,UAAI,WAAW,KAAK,WAAW,EAAG,MAAK,OAAO;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,iBAAiB,IAAY,YAAwC;AACnE,QAAI,CAAC,KAAK,YAAY,IAAI,EAAE,EAAG;AAC/B,UAAM,WAAW,KAAK,WAAW;AACjC,SAAK,YAAY,IAAI,IAAI,UAAU;AACnC,QAAI,aAAa,KAAK,WAAW,EAAG,MAAK,OAAO;AAAA,EAClD;AAAA,EAEA,eAAe,SAAwB;AACrC,UAAM,UAAU,KAAK,WAAW;AAChC,QAAI,YAAY,QAAS;AAEzB,UAAM,aAAa,MAAM,KAAK,KAAK,YAAY,OAAO,CAAC,EAAE;AAAA,MACvD,CAAC,eAAe,WAAW,YAAY;AAAA,IACzC;AACA,QAAI,WAAW,SAAS,GAAG;AACzB,iBAAW,QAAQ,CAAC,eAAe,WAAW,qBAAqB,OAAO,CAAC;AAC3E;AAAA,IACF;AAEA,SAAK,UAAU;AACf,SAAK,YAAY,QAAQ,CAAC,eAAe,WAAW,qBAAqB,OAAO,CAAC;AACjF,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,SAAe;AACb,SAAK,eAAe,CAAC,KAAK,WAAW,CAAC;AAAA,EACxC;AAAA,EAEA,UAAU,UAAgC;AACxC,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,EAC7C;AAAA,EAEQ,SAAe;AACrB,SAAK,UAAU,QAAQ,CAAC,aAAa,SAAS,CAAC;AAAA,EACjD;AACF;AAEO,IAAM,kBAAkC,oBAAI,qBAAqB;;;AC9EjE,SAAS,qBACd,UACA,WACA,QACQ;AACR,QAAM,UAAU,KAAK,UAAU,QAAQ,MAAM,CAAC;AAE9C,MAAI,aAAa,qBAAqB,aAAa,sBAAsB;AACvE,WAAO,cAAc,QAAQ,uBAAuB,SAAS;AAAA;AAAA;AAAA,EAG/D,OAAO;AAAA;AAAA;AAAA,gDAGuC,QAAQ;AAAA;AAAA,yCAEf,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,0CAKP,QAAQ;AAAA;AAAA,EAEhD;AAEA,SAAO,cAAc,QAAQ,uBAAuB,SAAS;AAAA;AAAA;AAAA,EAG7D,OAAO;AAAA;AAAA;AAAA,gDAGuC,QAAQ;AACxD;;;AC/BO,IAAM,eAAe,OAAO,YAAY,eAAe,SAAS,KAAK,WACxE,QAAQ,IAAI,aAAa,eACzB,OAAO,gBAAgB,eAAgB,YAAoB,KAAK,OAC7D,YAAoB,IAAI,SAAS,eAClC;","names":["wd","t"]}
|