@weasel-js/animator 1.13.0 → 1.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -24,7 +24,7 @@ animator.spring({ target, to: 40 }); // bends the motion; neither cancels the ot
24
24
 
25
25
  | Export | What it is |
26
26
  |---|---|
27
- | `useAnimator()` | The animator: `tween`, `spring`, `physics`, `decay`, `hold`, `loop`, `stagger`, `timeline`, `watch`, and `live`, with `pause`, `resume`, and `setTimeScale` over everything it runs. The frame loop stops while its host is unseen. |
27
+ | `useAnimator()` | The animator: `tween`, `spring`, `physics`, `decay`, `hold`, `loop`, `stagger`, `timeline`, `watch`, and `live`, with `pause`, `resume`, and `setTimeScale` over everything it runs. The frame loop stops while its host is unseen. Given a `clock` from `@weasel-js/clock`, it advances with that clock instead, so the clock pauses, seeks and gates it. |
28
28
  | `createTarget(opts)` | One value an animator moves. Animations on a target add, so a second one bends the first. `target.axisIndexes(['y'])` answers where the axes it names sit among the target's numbers. |
29
29
  | `createTargetTable(opts)` | Many like values as rows of flat arrays, shown in one pass. |
30
30
  | `sampleTrack`, the `Track` types | Keyframe tracks for `animator.timeline`. |
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { V as VertexColorChannel, A as Animator, a as AnimationHandle, S as SampledTrack, T as Target, I as Interpolate, b as TimelineEvent, N as NestedTimeline, c as TargetAxes } from './types-QKD4dhHF.js';
2
- export { d as AnimationInfo, e as AnimationKind, f as AnimatorEvent, g as AnimatorListener, h as AxisBuffer, i as AxisName, j as AxisRef, C as ColorOverride, k as ColorOverrideFn, l as ColorOverrideRegistry, D as DecayOptions, E as EventBooking, m as EventBookingHandle, n as EventTrack, H as HoldHandle, o as HoldOptions, p as HoldRowsOptions, q as InterpolatorFactory, K as Keyframe, L as LiveAnimation, r as LoopFactory, s as LoopOptions, t as Naming, P as PhysicsHandle, u as PhysicsOptions, R as RowsHoldHandle, v as ShownArray, w as SpringOptions, x as StaggerBuilder, y as StaggerDelay, z as StaggerFactory, B as StaggerItemSpringOptions, F as StaggerItemTweenOptions, G as StaggerOptions, J as StaggerPerItem, M as StaggerSpringOptions, O as StaggerTargetSpringOptions, Q as StaggerTargetTweenOptions, U as StaggerTweenOptions, W as TargetDecayOptions, X as TargetOptions, Y as TargetPhysicsOptions, Z as TargetSpringOptions, _ as TargetTable, $ as TargetTableOptions, a0 as TargetTweenOptions, a1 as TimelineClock, a2 as TimelineHandle, a3 as TimelineOptions, a4 as TimelineTrack, a5 as Track, a6 as TweenLoopOptions, a7 as TweenOptions, a8 as UseAnimatorOptions, a9 as createTarget, aa as createTargetTable } from './types-QKD4dhHF.js';
1
+ import { V as VertexColorChannel, A as Animator, a as AnimationHandle, S as SampledTrack, T as Target, I as Interpolate, b as TimelineEvent, N as NestedTimeline, c as TargetAxes } from './types-TZO301HJ.js';
2
+ export { d as AnimationInfo, e as AnimationKind, f as AnimatorEvent, g as AnimatorListener, h as AxisBuffer, i as AxisName, j as AxisRef, C as ColorOverride, k as ColorOverrideFn, l as ColorOverrideRegistry, D as DecayOptions, E as EventBooking, m as EventBookingHandle, n as EventTrack, H as HoldHandle, o as HoldOptions, p as HoldRowsOptions, q as InterpolatorFactory, K as Keyframe, L as LiveAnimation, r as LoopFactory, s as LoopOptions, t as Naming, P as PhysicsHandle, u as PhysicsOptions, R as RowsHoldHandle, v as ShownArray, w as SpringOptions, x as StaggerBuilder, y as StaggerDelay, z as StaggerFactory, B as StaggerItemSpringOptions, F as StaggerItemTweenOptions, G as StaggerOptions, J as StaggerPerItem, M as StaggerSpringOptions, O as StaggerTargetSpringOptions, Q as StaggerTargetTweenOptions, U as StaggerTweenOptions, W as TargetDecayOptions, X as TargetOptions, Y as TargetPhysicsOptions, Z as TargetSpringOptions, _ as TargetTable, $ as TargetTableOptions, a0 as TargetTweenOptions, a1 as TimelineClock, a2 as TimelineHandle, a3 as TimelineOptions, a4 as TimelineTrack, a5 as Track, a6 as TweenLoopOptions, a7 as TweenOptions, a8 as createTarget, a9 as createTargetTable } from './types-TZO301HJ.js';
3
3
  import { ColorSpace } from '@weasel-js/paint';
4
4
  import { SpringPresetName, EasingSpec, EasingName, BezierEasing, GlMat3, Path, PolygonPath } from '@weasel-js/geom';
5
5
  export { BezierEasing, EasingFn, EasingSpec, SpringPreset, SpringPresetName } from '@weasel-js/geom';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { axisIndexes } from './chunk-H7WENFPC.js';
2
2
  export { ColorOverrideRegistry, axesOf, createTarget, createTargetTable, sampleTrack } from './chunk-H7WENFPC.js';
3
- import { EASINGS, resolveEasing, mat3, PATH_M, PATH_L, PATH_Z, reviveTypedArrays, tagTypedArrays, linear } from '@weasel-js/geom';
3
+ import { EASINGS, resolveEasing, mat3, worldCoords, coordsFrom, PATH_M, PATH_L, PATH_Z, reviveTypedArrays, tagTypedArrays, linear } from '@weasel-js/geom';
4
4
  import { hslToSrgb, lerpColorArray } from '@weasel-js/paint';
5
5
 
6
6
  // src/slew.ts
@@ -563,7 +563,7 @@ function skinnable(path) {
563
563
  }
564
564
  function skinPath(path, skin, motions) {
565
565
  const rest = skinnable(path);
566
- const from = rest.coords;
566
+ const from = worldCoords(rest);
567
567
  const count = from.length >> 1;
568
568
  const sum = new Float64Array(from.length);
569
569
  const total = new Float64Array(count);
@@ -582,13 +582,13 @@ function skinPath(path, skin, motions) {
582
582
  total[i] += w;
583
583
  }
584
584
  }
585
- const coords = new Float32Array(from.length);
585
+ const moved = new Float64Array(from.length);
586
586
  for (let i = 0; i < count; i++) {
587
587
  const t = total[i];
588
- coords[2 * i] = t > 0 ? sum[2 * i] / t : from[2 * i];
589
- coords[2 * i + 1] = t > 0 ? sum[2 * i + 1] / t : from[2 * i + 1];
588
+ moved[2 * i] = t > 0 ? sum[2 * i] / t : from[2 * i];
589
+ moved[2 * i + 1] = t > 0 ? sum[2 * i + 1] / t : from[2 * i + 1];
590
590
  }
591
- return { ...rest, coords };
591
+ return { ...rest, coords: coordsFrom(rest.origin, moved) };
592
592
  }
593
593
  function distanceToSegment(px, py, ax, ay, bx, by) {
594
594
  const dx = bx - ax;
@@ -622,7 +622,7 @@ function autoSkin(path, skeleton, options = {}) {
622
622
  const power = options.power ?? 4;
623
623
  const max = Math.max(1, options.max ?? 2);
624
624
  const bones = bonesOf(skeleton);
625
- const coords = skinnable(path).coords;
625
+ const coords = worldCoords(skinnable(path));
626
626
  const count = coords.length >> 1;
627
627
  const out = /* @__PURE__ */ new Map();
628
628
  const distance = new Float64Array(bones.length);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/slew.ts","../src/colorInterpolate.ts","../src/colorHelpers.ts","../src/colorCycle.ts","../src/colorArrays.ts","../src/timeline/clip.ts","../src/rig/mirrorPose.ts","../src/rig/resolveSkeleton.ts","../src/rig/types.ts","../src/rig/skeletonAxes.ts","../src/rig/solveIk.ts","../src/rig/skin.ts","../src/rig/autoSkin.ts","../src/rig/skeletonEdits.ts","../src/rig/weightEdits.ts"],"names":["resolveEasing","mat3","iterations"],"mappings":";;;;;;AAQA,SAAS,SAAA,CAAU,MAAc,IAAA,EAAkC;AACjE,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,QAAA;AAC/B,EAAA,IAAI,EAAE,IAAA,IAAQ,CAAA,CAAA,EAAI,MAAM,IAAI,WAAW,CAAA,MAAA,EAAS,IAAI,CAAA,0BAAA,EAA6B,IAAI,CAAA,CAAE,CAAA;AACvF,EAAA,OAAO,IAAA;AACT;AAOO,SAAS,UAAA,CAAW,KAAA,EAAe,MAAA,EAAgB,EAAA,EAAY,KAAA,EAA0B;AAC9F,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,MAAA,EAAQ,KAAA,CAAM,IAAI,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,MAAA,EAAQ,KAAA,CAAM,IAAI,CAAA;AACzC,EAAA,IAAI,MAAA,GAAS,OAAO,OAAO,IAAA,CAAK,IAAI,MAAA,EAAQ,KAAA,GAAQ,OAAO,EAAE,CAAA;AAC7D,EAAA,IAAI,MAAA,GAAS,OAAO,OAAO,IAAA,CAAK,IAAI,MAAA,EAAQ,KAAA,GAAQ,OAAO,EAAE,CAAA;AAC7D,EAAA,OAAO,KAAA;AACT;AAcO,SAAS,UAAA,CAAW,OAAA,GAA2D,EAAC,EAAS;AAC9F,EAAA,MAAM,KAAA,GAAmB,EAAE,IAAA,EAAM,SAAA,CAAU,MAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,MAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA,EAAE;AACxG,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAa;AAAA,IACjB,KAAA;AAAA,IACA,MAAA,EAAQ,QAAQ,MAAA,IAAU,KAAA;AAAA,IAC1B,KAAK,EAAA,EAAI;AACP,MAAA,IAAA,CAAK,QAAQ,UAAA,CAAW,IAAA,CAAK,OAAO,IAAA,CAAK,MAAA,EAAQ,IAAI,KAAK,CAAA;AAC1D,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd;AAAA,GACF;AACA,EAAA,OAAO,IAAA;AACT;AClCO,SAAS,oBACd,IAAA,EACkB;AAClB,EAAA,IAAI,IAAA,CAAK,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA;AAClC,EAAA,MAAM,KAAA,GAAoB,KAAK,aAAA,IAAiB,KAAA;AAChD,EAAA,OAAO,CAAC,GAAG,CAAA,EAAG,CAAA,KAAM,eAAe,CAAA,EAAG,CAAA,EAAG,GAAG,KAAK,CAAA;AACnD;;;ACMA,SAAS,eAAA,CAAgB,MAAyB,EAAA,EAA6B;AAC7E,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,EAAA,CAAG,MAAA,EAAQ;AAC7B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qCAAA,EAAwC,IAAA,CAAK,MAAM,CAAA,KAAA,EAAQ,GAAG,MAAM,CAAA,CAAA;AAAA,KACtE;AAAA,EACF;AACA,EAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,MAAM,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,sBAAA,EAAyB,KAAK,MAAM,CAAA,iCAAA;AAAA,KACtC;AAAA,EACF;AACF;AAEA,IAAM,eAAe,CAAC,EAAA,EAAY,YAChC,CAAA,OAAA,EAAU,EAAE,IAAI,OAAO,CAAA,CAAA;AAGzB,IAAM,UAAA,GAAa,IAAA;AAGnB,SAAS,WAAA,CACP,QAAA,EACA,IAAA,EACA,EAAA,EACA,QACA,QAAA,EACiB;AACjB,EAAA,MAAM,EAAE,EAAA,EAAI,OAAA,EAAQ,GAAI,IAAA;AACxB,EAAA,MAAM,WAAW,QAAA,CAAS,cAAA;AAC1B,EAAA,OAAO,SAAS,KAAA,CAAgB;AAAA,IAC9B,QAAQ,QAAA,CAAS,MAAA,CAAO,IAAI,OAAA,EAAS,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,IACrD,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,KAAA,EAAM;AAAA,IACtB,EAAA,EAAI,IAAA,CAAK,EAAA,CAAG,KAAA,EAAM;AAAA,IAClB,EAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA,EAAW,YAAA,CAAa,EAAA,EAAI,OAAO,CAAA;AAAA,IACnC,SAAA,EAAW,KAAA;AAAA,IACX,aAAa,CAAC,KAAA,EAAO,GAAA,EAAK,CAAA,KAAM,SAAS,CAAC,CAAA;AAAA,IAC1C,QAAQ,MAAM;AACZ,MAAA,QAAA,CAAS,OAAA,CAAQ,IAAI,OAAO,CAAA;AAC5B,MAAA,IAAA,CAAK,MAAA,IAAS;AAAA,IAChB;AAAA,GACD,CAAA;AACH;AAYO,SAAS,iBAAA,CACd,UACA,IAAA,EACiB;AACjB,EAAA,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAE,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,oBAAoB,IAAI,CAAA;AACvC,EAAA,OAAO,WAAA,CAAY,QAAA,EAAU,IAAA,EAAM,IAAA,CAAK,IAAI,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA,KAAM,OAAO,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,CAAC,CAAC,CAAA;AAC/F;AAyBO,SAAS,kBAAA,CACd,UACA,IAAA,EACiB;AACjB,EAAA,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAE,CAAA;AAClC,EAAA,MAAM,EAAE,EAAA,EAAI,OAAA,EAAQ,GAAI,IAAA;AACxB,EAAA,MAAM,WAAW,QAAA,CAAS,cAAA;AAC1B,EAAA,OAAO,SAAS,MAAA,CAAiB;AAAA,IAC/B,QAAQ,QAAA,CAAS,MAAA,CAAO,IAAI,OAAA,EAAS,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,IACrD,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,KAAA,EAAM;AAAA,IACtB,EAAA,EAAI,IAAA,CAAK,EAAA,CAAG,KAAA,EAAM;AAAA,IAClB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,aAAA,EAAe,UAAA;AAAA,IACf,SAAA,EAAW,YAAA,CAAa,EAAA,EAAI,OAAO,CAAA;AAAA,IACnC,QAAQ,MAAM;AACZ,MAAA,QAAA,CAAS,OAAA,CAAQ,IAAI,OAAO,CAAA;AAC5B,MAAA,IAAA,CAAK,MAAA,IAAS;AAAA,IAChB;AAAA,GACD,CAAA;AACH;AAwBO,SAAS,mBAAA,CACd,UACA,IAAA,EACiB;AACjB,EAAA,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAE,CAAA;AAClC,EAAA,MAAM,MAAA,GAAS,oBAAoB,IAAI,CAAA;AACvC,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,QAAA,EAAU,gBAAe,GAAI,IAAA;AAC/C,EAAA,MAAM,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA;AACxB,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AAExC,EAAA,MAAM,WAAA,GACJ,KAAK,MAAA,KAAW,MAAA,GAAS,IAAI,CAAA,GAC7B,OAAO,KAAK,MAAA,KAAW,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,GAAI,GAAG,IAAA,CAAK,MAAM,CAAC,CAAA,GAC1E,CAAA;AAEF,EAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,IAAI,WAAW,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,cAAc,cAAA,GAAiB,QAAA;AAE/C,EAAA,MAAM,QAAA,GAAW,CAAC,SAAA,KAAgC;AAChD,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AACzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,WAAW,CAAA;AACzC,MAAA,MAAM,UAAU,QAAA,GAAW,cAAA;AAC3B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAA,CAAI,SAAA,GAAY,OAAA,IAAW,QAAQ,CAAC,CAAA;AACxE,MAAA,MAAM,KAAA,GAAQ,OAAO,MAAM,CAAA;AAC3B,MAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,MAAA,MAAM,SAAS,CAAC,IAAA,CAAK,CAAC,CAAA,EAAG,KAAK,CAAA,GAAI,CAAC,CAAA,EAAG,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,CAAC,CAAC,CAAA;AAC9D,MAAA,MAAM,SAAS,CAAC,EAAA,CAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,CAAG,IAAI,CAAC,CAAA,EAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AACtD,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,EAAQ,MAAA,EAAQ,KAAK,CAAA;AAC5C,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA;AAClB,MAAA,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO,WAAA,CAAY,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,GAAI,OAAO,CAAC,CAAA;AAClF;ACpKO,SAAS,iBAAA,CACd,UACA,IAAA,EACa;AACb,EAAA,MAAM,MAAA,GAAS,oBAAoB,IAAI,CAAA;AACvC,EAAA,MAAM,EAAE,EAAA,EAAI,OAAA,EAAQ,GAAI,IAAA;AACxB,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,CAAA;AACpC,EAAA,MAAM,MAAA,GAASA,aAAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AAExC,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,EAAyB,GAAA,KAA0B;AACnE,IAAA,MAAM,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA;AACxB,IAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,IAAA,CAAK,KAAA,EAAM;AAC/B,IAAA,MAAM,GAAA,GAAO,GAAA,GAAM,IAAA,CAAK,UAAA,GAAc,CAAA,GAAI,SAAA;AAC1C,IAAA,MAAM,SAAS,GAAA,GAAM,CAAA;AACrB,IAAA,MAAM,SAAA,GAAY,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,OAAO,SAAS,CAAA;AAClC,IAAA,MAAM,QAAA,GAAA,CAAY,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,SAAA,IAAa,CAAA;AACpD,IAAA,MAAM,KAAA,GAAA,CAAU,QAAA,GAAW,CAAA,GAAK,CAAA,IAAK,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AACjC,IAAA,MAAM,YAAY,KAAA,GAAQ,QAAA;AAE1B,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAc,IAAA,CAAK,MAAM,CAAA;AACzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,IAAA,GAAA,CAAS,CAAA,GAAI,QAAA,IAAY,CAAA,GAAK,CAAA;AACpC,MAAA,MAAM,IAAA,GAAA,CAAS,CAAA,GAAI,QAAA,GAAW,CAAA,IAAK,CAAA,GAAK,CAAA;AACxC,MAAA,MAAM,IAAI,CAAC,IAAA,CAAK,IAAI,CAAA,EAAG,KAAK,IAAA,GAAO,CAAC,CAAA,EAAG,IAAA,CAAK,OAAO,CAAC,CAAA,EAAG,IAAA,CAAK,IAAA,GAAO,CAAC,CAAC,CAAA;AACrE,MAAA,MAAM,IAAI,CAAC,IAAA,CAAK,IAAI,CAAA,EAAG,KAAK,IAAA,GAAO,CAAC,CAAA,EAAG,IAAA,CAAK,OAAO,CAAC,CAAA,EAAG,IAAA,CAAK,IAAA,GAAO,CAAC,CAAC,CAAA;AACrE,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,SAAS,CAAA;AACtC,MAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA;AAClB,MAAA,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,QAAA,CAAS,cAAA,CAAe,GAAA,CAAI,EAAA,EAAI,OAAA,EAAS,QAAQ,CAAA;AAMjD,EAAA,MAAM,gBAAA,GAAmB,SAAS,SAAA,EAAU;AAE5C,EAAA,OAAO;AAAA,IACL,MAAA,GAAe;AACb,MAAA,QAAA,CAAS,cAAA,CAAe,KAAA,CAAM,EAAA,EAAI,OAAO,CAAA;AACzC,MAAA,gBAAA,EAAiB;AAAA,IACnB;AAAA,GACF;AACF;AC9EO,SAAS,mBAAA,CACd,CAAA,EACA,IAAA,GAAoE,EAAC,EAC3D;AACV,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,GAAA;AACtC,EAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,GAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,CAAA;AAC5B,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,IAAK,CAAA,GAAI,GAAA,GAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AACnC,IAAA,MAAM,CAAC,GAAG,CAAA,EAAG,CAAC,IAAI,SAAA,CAAU,CAAA,EAAG,YAAY,SAAS,CAAA;AACpD,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,GAAA;AACT;AAKO,SAAS,kBACd,CAAA,EACA,CAAA,EACA,CAAA,EACA,CAAA,EACA,IAAI,CAAA,EACM;AACV,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,MAAS,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC/C,EAAA,OAAO,GAAA;AACT;AC+CA,IAAM,OAAA,GAAU,CAAmB,CAAA,KAAY;AAC7C,EAAA,KAAA,MAAW,CAAA,IAAK,GAAG,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,MAAA,EAAW,OAAO,CAAA,CAAE,CAAC,CAAA;AACrD,EAAA,OAAO,CAAA;AACT,CAAA;AAEA,SAAS,SAAA,CAAU,OAAkB,MAAA,EAA2B;AAC9D,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,IAAA,OAAO,QAAuB,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,MAAM,KAAA,EAAO,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,UAAU,YAAA,CAAa,KAAA,CAAM,QAAA,EAAU,MAAM,GAAG,CAAA;AAAA,EACtI;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,IAAA,OAAO,OAAA,CAAoB;AAAA,MACzB,IAAA,EAAM,OAAA;AAAA,MACN,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AAC9B,QAAA,MAAM,OAAO,MAAA,CAAO,KAAA,GAAQ,CAAA,CAAE,IAAA,EAAM,EAAE,IAAI,CAAA;AAC1C,QAAA,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,CAAA,yCAAA,EAA4C,CAAA,CAAE,IAAI,CAAA,EAAA,CAAI,CAAA;AACjF,QAAA,OAAO,QAAuB,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,MAAM,IAAA,EAAM,IAAA,CAAK,MAAM,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,MACxG,CAAC;AAAA,KACF,CAAA;AAAA,EACH;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,KAAW,MAAA,GAAY,SAAY,MAAA,CAAO,MAAA,GAAS,MAAM,MAAM,CAAA;AACpF,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,MAAA,IAAa,CAAC,MAAA,EAAQ,MAAM,IAAI,KAAA,CAAM,CAAA,0CAAA,EAA6C,KAAA,CAAM,MAAM,CAAA,EAAA,CAAI,CAAA;AACxH,EAAA,MAAM,WAAA,GAAc,MAAM,WAAA,KAAgB,MAAA,GAAY,SAAY,MAAA,CAAO,WAAA,GAAc,MAAM,WAAW,CAAA;AACxG,EAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,IAAa,CAAC,WAAA,EAAa;AACnD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iDAAA,EAAoD,KAAA,CAAM,WAAW,CAAA,EAAA,CAAI,CAAA;AAAA,EAC3F;AACA,EAAA,OAAO,OAAA,CAAiC;AAAA,IACtC,IAAA,EAAM,SAAA;AAAA,IACN,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,iBAAA,CAAkB,CAAA,CAAE,KAAK,GAAe,CAAE,CAAA;AAAA,IACtF,MAAA;AAAA,IACA,YAAY,KAAA,CAAM,MAAA;AAAA,IAClB,WAAA;AAAA,IACA,iBAAiB,KAAA,CAAM,WAAA;AAAA,IACvB,GAAG,UAAA,CAAW,KAAA,EAAO,MAAM,CAAA;AAAA,IAC3B,IAAA,EAAM,QAAA,CAAS,KAAA,EAAO,MAAM;AAAA,GAC7B,CAAA;AACH;AAEA,SAAS,UAAA,CAAW,OAAyB,MAAA,EAA4E;AACvH,EAAA,MAAM,EAAE,QAAO,GAAI,KAAA;AACnB,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,OAAO,EAAE,MAAA,EAAO;AAChD,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,GAAS,MAAM,CAAA;AACnC,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,CAAA,0CAAA,EAA6C,MAAM,CAAA,EAAA,CAAI,CAAA;AAClF,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,UAAA,EAAY,MAAA,EAAO;AAC5C;AAIA,SAAS,QAAA,CAAS,OAAyB,MAAA,EAAsE;AAC/G,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,CAAA,iBAAA,EAAoB,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA,CAAA,CAAA;AACnD,EAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,0BAAA,CAA4B,CAAA;AACjE,EAAA,WAAA,CAAY,MAAA,CAAO,MAAM,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,gBAAA,EAAmB,KAAA,CAAM,MAAM,CAAA,CAAA,CAAG,CAAA;AACzE,EAAA,OAAO,CAAC,GAAG,IAAI,CAAA;AACjB;AAEA,SAAS,YAAA,CAAa,UAAwB,MAAA,EAAoC;AAChF,EAAA,OAAO,QAAwB,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,EAAG,MAAM,CAAC,CAAA,EAAG,QAAA,EAAU,QAAA,CAAS,UAAU,CAAA;AAC1H;AAQO,SAAS,QAAA,CAAS,MAAY,MAAA,EAAoC;AACvE,EAAA,IAAI,IAAA,CAAK,OAAA,KAAY,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,MAAA,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA,sCAAA,CAAwC,CAAA;AACtI,EAAA,OAAO,YAAA,CAAa,MAAM,MAAM,CAAA;AAClC;AAEA,IAAM,eAAe,IAAI,GAAA;AAAA,EACtB,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAmB,GAAA,CAAI,CAAC,IAAA,KAAS,CAAC,OAAA,CAAQ,IAAI,CAAA,EAAG,IAAI,CAAC;AAC5E,CAAA;AAEA,SAAS,YAAY,CAAA,EAA4B;AAC/C,EAAA,IAAI,CAAA,KAAM,QAAQ,OAAO,CAAA,KAAM,YAAY,OAAO,CAAA,KAAM,WAAW,OAAO,IAAA;AAC1E,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,MAAA,CAAO,SAAS,CAAC,CAAA;AACnD,EAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,GAAG,OAAO,CAAA,CAAE,MAAM,WAAW,CAAA;AAChD,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,SAAA,CAAU,SAAS,IAAA,CAAK,CAAC,CAAA,KAAM,iBAAA,EAAmB,OAAO,KAAA;AAC7F,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAW,CAAA,CAAE,KAAA,CAAM,CAAC,MAAA,KAAW,MAAA,KAAW,MAAA,IAAa,WAAA,CAAY,MAAM,CAAC,CAAA;AACjG;AAEA,SAAS,QAAA,CAAS,MAA8B,KAAA,EAAsD;AACpG,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,OAAO,IAAA,KAAS,UAAU,OAAO,IAAA;AAC3D,EAAA,IAAI,OAAO,IAAA,KAAS,UAAA,EAAY,OAAO,EAAE,QAAQ,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA,EAA4B;AAC5F,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAK,CAAA,gFAAA,CAAkF,CAAA;AAC7H,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,aAAA,CAAc,OAA0B,KAAA,EAAiC;AAChF,EAAA,IAAI,MAAM,MAAA,EAAQ,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAK,CAAA,uEAAA,CAAyE,CAAA;AAC3H,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,UAAA,KAAe,MAAA,QAAiB,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAK,CAAA,gCAAA,CAAkC,CAAA;AACtH,EAAA,IAAI,MAAM,YAAA,EAAc,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAK,CAAA,+CAAA,CAAiD,CAAA;AACzG,EAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,eAAA,KAAoB,MAAA,QAAiB,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAK,CAAA,2CAAA,CAA6C,CAAA;AAC3I,EAAA,IAAI,OAAO,KAAA,CAAM,MAAA,KAAW,UAAA,IAAc,KAAA,CAAM,eAAe,MAAA,EAAW;AACxE,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAK,CAAA,iDAAA,CAAmD,CAAA;AAAA,EACrF;AACA,EAAA,OAAO,OAAA,CAA0B;AAAA,IAC/B,IAAA,EAAM,SAAA;AAAA,IACN,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,QAAQ,KAAA,CAAM,UAAA;AAAA,IACd,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AAC1B,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAA,CAAE,KAAK,CAAA;AACpC,MAAA,IAAI,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAK,CAAA,8CAAA,EAAiD,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AAChH,MAAA,OAAO,OAAA,CAAiB,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,KAAA,EAAO,MAAA,EAAQ,QAAA,CAAS,CAAA,CAAE,MAAA,EAAQ,KAAK,CAAA,EAAG,CAAA;AAAA,IAC9E,CAAC,CAAA;AAAA,IACD,aAAa,KAAA,CAAM,eAAA;AAAA,IACnB,QAAQ,OAAO,KAAA,CAAM,WAAW,UAAA,GAAa,KAAA,CAAM,aAAa,KAAA,CAAM,MAAA;AAAA,IACtE,MAAM,KAAA,CAAM,IAAA,IAAS,CAAC,GAAG,MAAM,IAAI;AAAA,GACpC,CAAA;AACH;AAEA,SAAS,WAAA,CAAY,OAAc,KAAA,EAA0B;AAC3D,EAAA,MAAM,KAAA,GAAQ,CAAA,OAAA,EAAU,KAAA,CAAM,KAAA,IAAS,KAAK,CAAA,CAAA,CAAA;AAC5C,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,IAAA,OAAO,OAAA,CAA2B,EAAE,IAAA,EAAM,UAAA,EAAY,OAAO,KAAA,CAAM,KAAA,EAAO,EAAA,EAAI,KAAA,CAAM,IAAI,QAAA,EAAU,cAAA,CAAe,KAAA,CAAM,QAAQ,GAAG,CAAA;AAAA,EACpI;AACA,EAAA,IAAI,MAAM,IAAA,KAAS,SAAA,EAAW,OAAO,aAAA,CAAc,OAAO,KAAK,CAAA;AAC/D,EAAA,OAAO,OAAA,CAAwB;AAAA,IAC7B,IAAA,EAAM,OAAA;AAAA,IACN,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AAC9B,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAW,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAK,CAAA,mCAAA,EAAsC,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AACtG,MAAA,IAAI,EAAE,IAAA,KAAS,MAAA,IAAa,CAAC,WAAA,CAAY,EAAE,IAAI,CAAA,EAAG,MAAM,IAAI,MAAM,CAAA,QAAA,EAAW,KAAK,CAAA,6CAAA,EAAgD,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AACxI,MAAA,OAAO,OAAA,CAAQ,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,IAAA,EAA+B,CAAA;AAAA,IAChF,CAAC;AAAA,GACF,CAAA;AACH;AAEA,SAAS,eAAe,QAAA,EAAwC;AAC9D,EAAA,OAAO,OAAA,CAAsB,EAAE,MAAA,EAAQ,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA,EAAG,QAAA,EAAU,QAAA,CAAS,QAAA,EAAU,CAAA;AACxG;AAUO,SAAS,OAAO,QAAA,EAAgC;AACrD,EAAA,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,GAAG,cAAA,CAAe,QAAQ,CAAA,EAAE;AACnD;;;AC9NO,SAAS,UAAA,CAAW,UAAoB,IAAA,EAAkB;AAC/D,EAAA,MAAM,MAAY,EAAC;AACnB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA4B;AAC9C,EAAA,KAAA,MAAW,KAAA,IAAS,SAAS,MAAA,EAAQ,KAAA,CAAM,IAAI,KAAA,CAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AACrE,EAAA,MAAM,KAAA,mBAAQ,IAAI,GAAA,CAAI,CAAC,GAAG,KAAA,CAAM,IAAA,EAAK,EAAG,GAAG,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AAC7D,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAC3B,IAAA,MAAM,CAAA,GAAI,KAAK,IAAI,CAAA;AACnB,IAAA,GAAA,CAAI,IAAI,CAAA,GAAI;AAAA,MACV,GAAG,CAAA;AAAA,MACH,GAAG,EAAA,IAAM,IAAA,EAAM,CAAA,IAAK,CAAA,CAAA,IAAM,GAAG,CAAA,IAAK,CAAA,CAAA;AAAA,MAClC,UAAU,EAAA,IAAM,IAAA,EAAM,QAAA,IAAY,CAAA,CAAA,IAAM,GAAG,QAAA,IAAY,CAAA;AAAA,KACzD;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;ACtBO,SAAS,OAAA,CAAQ,MAAsB,KAAA,EAA4D;AACxG,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,OAAO;AAAA,IACL,CAAA,EAAG,IAAA,CAAK,CAAA,IAAK,KAAA,CAAM,CAAA,IAAK,CAAA,CAAA;AAAA,IACxB,CAAA,EAAG,IAAA,CAAK,CAAA,IAAK,KAAA,CAAM,CAAA,IAAK,CAAA,CAAA;AAAA,IACxB,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,KAAA,CAAM,QAAA,IAAY,CAAA,CAAA;AAAA,IAC7C,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,KAAA,CAAM,MAAA,IAAU,CAAA,CAAA;AAAA,IACvC,MAAA,EAAQ,IAAA,CAAK,MAAA,IAAU,KAAA,CAAM,MAAA,IAAU,CAAA;AAAA,GACzC;AACF;AAGO,SAAS,OAAO,CAAA,EAA2B;AAChD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,QAAQ,CAAA;AAC7B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,QAAQ,CAAA;AAC7B,EAAA,MAAM,CAAA,GAAI,IAAI,YAAA,CAAa,CAAC,CAAA;AAC5B,EAAA,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,MAAA;AAAS,EAAA,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,MAAA;AAAS,EAAA,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA;AACnD,EAAA,CAAA,CAAE,CAAC,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,CAAE,MAAA;AAAQ,EAAA,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,MAAA;AAAS,EAAA,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA;AACnD,EAAA,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,CAAA;AAAa,EAAA,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,CAAA;AAAa,EAAA,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA;AACnD,EAAA,OAAO,CAAA;AACT;AAWO,SAAS,eAAA,CAAgB,UAAoB,IAAA,EAAiC;AACnF,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,KAAA,MAAW,KAAA,IAAS,SAAS,MAAA,EAAQ;AACnC,IAAA,MAAM,KAAA,GAAQ,OAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAC,CAAA;AAC1D,IAAA,IAAI,KAAA,CAAM,UAAU,IAAA,EAAM;AACxB,MAAA,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAA;AACzB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACnC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,wBAAA,EAA2B,KAAA,CAAM,IAAI,CAAA,gBAAA,EAAmB,MAAM,MAAM,CAAA,6EAAA;AAAA,OAEtE;AAAA,IACF;AACA,IAAA,GAAA,CAAI,IAAI,KAAA,CAAM,IAAA,EAAM,KAAK,QAAA,CAAS,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,EAClD;AACA,EAAA,OAAO,GAAA;AACT;;;ACtBO,IAAM,cAAA,GAAiC;AAAA,EAC5C,CAAA,EAAG,CAAA;AAAA,EAAG,CAAA,EAAG,CAAA;AAAA,EAAG,QAAA,EAAU,CAAA;AAAA,EAAG,MAAA,EAAQ,CAAA;AAAA,EAAG,MAAA,EAAQ;AAC9C;;;AC7BA,IAAM,SAAS,CAAC,GAAA,EAAK,GAAA,EAAK,UAAA,EAAY,UAAU,QAAQ,CAAA;AACxD,IAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AAG1C,SAAS,UAAU,QAAA,EAA8B;AAC/C,EAAA,OAAO,QAAA,CAAS,MAAA,CAAO,OAAA,CAAQ,CAAC,UAAU,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,GAAG,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,KAAK,EAAE,CAAC,CAAA;AAC3F;AAOO,SAAS,SAAA,CAAU,UAAoB,MAAA,EAAqC;AACjF,EAAA,MAAM,KAAA,GAAQ,UAAU,QAAQ,CAAA;AAChC,EAAA,OAAO,WAAA,CAAY,EAAE,KAAA,EAAO,KAAA,CAAM,QAAQ,KAAA,EAAM,EAAG,QAAQ,qBAAqB,CAAA;AAClF;AAUO,SAAS,aAAa,QAAA,EAAsC;AACjE,EAAA,MAAM,QAAQ,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC/C,EAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AACjB,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,MAAM,MAAA,GAAS,CAAA;AAAA,IACtB,MAAA,EAAQ,MAAM,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,IAAI,QAAQ,CAAA;AAAA,IAC5C,KAAA,EAAO,UAAU,QAAQ,CAAA;AAAA,IACzB,GAAG,IAAA,EAAM;AACP,MAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAc,KAAA,CAAM,SAAS,CAAC,CAAA;AAC9C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAE,CAAA;AAC5B,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK,GAAA,CAAI,IAAI,CAAA,GAAI,CAAC,CAAA,GAAI,KAAA,GAAQ,OAAO,CAAC,CAAE,KAAK,cAAA,CAAe,MAAA,CAAO,CAAC,CAAE,CAAA;AAAA,MAC/F;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IACA,GAAA,CAAI,MAAM,KAAA,EAAO;AACf,MAAA,MAAM,MAAY,EAAC;AACnB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAE,CAAA;AAC5B,QAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,QAAA,GAAA,CAAI,KAAA,CAAM,CAAC,CAAE,CAAA,GAAI;AAAA,UACf,IAAI,KAAA,EAAO,CAAA,IAAK,cAAA,CAAe,CAAA,IAAK,MAAM,EAAE,CAAA;AAAA,UAC5C,IAAI,KAAA,EAAO,CAAA,IAAK,eAAe,CAAA,IAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,UAChD,WAAW,KAAA,EAAO,QAAA,IAAY,eAAe,QAAA,IAAY,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,UACrE,SAAS,KAAA,EAAO,MAAA,IAAU,eAAe,MAAA,IAAU,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,UAC/D,SAAS,KAAA,EAAO,MAAA,IAAU,eAAe,MAAA,IAAU,KAAA,CAAM,KAAK,CAAC;AAAA,SACjE;AAAA,MACF;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IACA,KAAA,CAAM,IAAA,EAAM,GAAA,EAAK,EAAA,EAAI;AACnB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAE,CAAA;AAC5B,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,KAAA,GAAQ,OAAO,CAAC,CAAE,KAAK,cAAA,CAAe,MAAA,CAAO,CAAC,CAAE,CAAA;AAAA,MACpG;AAAA,IACF,CAAA;AAAA,IACA,KAAK,IAAA,EAAM;AACT,MAAA,MAAM,OAAa,EAAC;AACpB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,QAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,QAAA,IAAA,CAAK,KAAA,CAAM,CAAC,CAAE,CAAA,GAAI,EAAE,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,EAAI,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA,EAAI,QAAA,EAAU,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA,EAAI,MAAA,EAAQ,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA,EAAI,MAAA,EAAQ,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA,EAAG;AAAA,MAC5H;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,GACF;AACF;ACvEA,IAAM,GAAA,GAAM,KAAK,EAAA,GAAK,CAAA;AAmDtB,SAAS,KAAK,CAAA,EAAmB;AAC/B,EAAA,OAAO,CAAA,GAAI,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,IAAI,GAAG,CAAA;AACrC;AAGA,SAAS,UAAA,CAAW,GAAW,KAAA,EAAoC;AACjE,EAAA,IAAI,CAAC,OAAO,OAAO,CAAA;AACnB,EAAA,KAAA,MAAW,CAAA,IAAK,CAAC,CAAA,EAAG,CAAA,GAAI,KAAK,CAAA,GAAI,GAAG,CAAA,EAAG,IAAI,KAAK,KAAA,CAAM,GAAA,IAAO,CAAA,IAAK,KAAA,CAAM,KAAK,OAAO,CAAA;AACpF,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,CAAM,GAAG,CAAC,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,CAAM,GAAG,CAAC,CAAA,GAAI,KAAA,CAAM,MAAM,KAAA,CAAM,GAAA;AAC5F;AAEA,IAAM,KAAA,GAAQ,CAAC,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,KAAe,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA;AAe1E,SAAS,OAAA,CAAQ,QAAA,EAAoB,IAAA,EAAY,OAAA,EAAmC;AACzF,EAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,MAAA,EAAO,GAAI,OAAA;AAChC,EAAA,MAAM,aAAA,GAAgB,QAAQ,UAAA,IAAc,EAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,IAAA;AAEvC,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAmB;AACtC,EAAA,KAAA,MAAW,SAAS,QAAA,CAAS,MAAA,SAAe,GAAA,CAAI,KAAA,CAAM,MAAM,KAAK,CAAA;AACjE,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM;AAC5C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAC7B,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuC,IAAI,CAAA,EAAA,CAAI,CAAA;AAC3E,IAAA,IAAI,CAAA,GAAI,KAAK,KAAA,CAAM,MAAA,KAAW,QAAQ,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,EAAG;AACnD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,sBAAA,EAAyB,IAAI,CAAA,gBAAA,EAAmB,KAAA,CAAM,MAAM,WAAW,OAAA,CAAQ,MAAA,CAAO,CAAA,GAAI,CAAC,CAAC,CAAA,mDAAA;AAAA,OAE9F;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,MAAM,IAAI,KAAA,CAAM,MAAA;AAChB,EAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,EAAE,MAAM,EAAE,GAAG,IAAA,EAAK,EAAG,QAAA,EAAU,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,YAAY,CAAA,EAAE;AAE3F,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,UAAA,IAAc,IAAA,GAAOC,IAAAA,CAAK,QAAA,EAAS,GAAI,eAAA,CAAgB,QAAA,EAAU,IAAI,CAAA,CAAE,GAAA,CAAI,UAAU,CAAA;AAClG,EAAA,MAAM,MAAM,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,KAAU,UAAA,CAAW,KAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG,YAAY,CAAC,CAAA,EAAG,SAAS,KAAA,CAAM,IAAI,CAAC,CAAC,CAAA;AAExG,EAAA,IAAI,SAAmB,EAAC;AACxB,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,MAAA,GAAS,EAAC;AACV,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,EAAG;AAC7B,MAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,MAAA,MAAA,GAASA,KAAK,QAAA,CAAS,MAAA,EAAQ,OAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,EAAE,GAAG,KAAK,KAAA,CAAM,IAAI,GAAG,QAAA,EAAU,GAAA,CAAI,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACrG,MAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AACA,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAcA,IAAAA,CAAK,MAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACvD,EAAA,MAAM,QAAA,GAAW,MAAMA,IAAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA;AAE7D,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAe,CAAA,GAAI,CAAA,GAAI,IAAI,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,QAAA,EAAS;AAIjE,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,EAAW,QAAA,EAA4B,IAAA,KAA2B;AAC7E,IAAA,MAAM,GAAA,GAAMA,KAAK,MAAA,CAAO,CAAA,KAAM,IAAI,IAAA,GAAO,MAAA,CAAO,CAAA,GAAI,CAAC,CAAC,CAAA;AACtD,IAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAIA,IAAAA,CAAK,MAAM,GAAA,EAAK,GAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAC5C,IAAA,MAAM,CAAC,IAAI,EAAE,CAAA,GAAIA,KAAK,KAAA,CAAM,GAAA,EAAK,GAAG,QAAQ,CAAA;AAC5C,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAIA,IAAAA,CAAK,MAAM,GAAA,EAAK,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA;AAC/C,IAAA,IAAI,KAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA,GAAI,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA,GAAI,MAAM,OAAO,KAAA;AACvF,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAE,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAC,CAAA;AACtF,IAAA,GAAA,CAAI,CAAC,IAAI,UAAA,CAAW,IAAA,EAAM,SAAS,KAAA,CAAM,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA;AACjD,IAAA,OAAA,EAAQ;AACR,IAAA,OAAO,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA,GAAI,IAAA;AAAA,EACzC,CAAA;AAEA,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,QAAA,EAAS;AACxB,IAAA,OAAO,KAAK,KAAA,CAAM,CAAA,GAAI,OAAO,CAAA,EAAG,CAAA,GAAI,OAAO,CAAC,CAAA;AAAA,EAC9C,CAAA;AACA,EAAA,MAAM,MAAA,GAAS,CAACC,WAAAA,KAAiC;AAC/C,IAAA,MAAM,GAAA,GAAY,EAAE,GAAG,IAAA,EAAK;AAC5B,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,KAAA,EAAO,CAAA,KAAM;AAAE,MAAA,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,GAAI,EAAE,GAAG,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,EAAG,QAAA,EAAU,GAAA,CAAI,CAAC,CAAA,EAAE;AAAA,IAAG,CAAC,CAAA;AAC5F,IAAA,MAAM,IAAI,QAAA,EAAS;AACnB,IAAA,OAAO,EAAE,MAAM,GAAA,EAAK,QAAA,EAAU,GAAG,OAAA,EAAS,CAAA,IAAK,SAAA,EAAW,UAAA,EAAAA,WAAAA,EAAW;AAAA,EACvE,CAAA;AAEA,EAAA,OAAA,EAAQ;AACR,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,MAAM,CAAC,CAAA;AACxB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,CAAA,EAAG;AAC7B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,MAAM,CAAC,CAAA;AACxB,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,KAAK,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAAA,EACtC;AACA,EAAA,MAAM,QAAA,GAAW,KAAK,KAAA,CAAM,MAAA,CAAO,IAAI,EAAA,EAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AAExD,EAAA,IAAI,YAAY,KAAA,EAAO;AACrB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA;AACrD,IAAA,OAAO,OAAO,CAAC,CAAA;AAAA,EACjB;AAEA,EAAA,IAAI,CAAA,KAAM,CAAA,IAAK,QAAA,GAAW,IAAA,EAAM;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,EAAM;AACxB,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,MAAM,CAAC,CAAA;AACxB,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,QAAA,EAAS;AAC1B,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACrC,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACrC,IAAA,MAAM,EAAA,GAAK,OAAO,CAAA,GAAI,EAAA;AACtB,IAAA,MAAM,EAAA,GAAK,OAAO,CAAA,GAAI,EAAA;AACtB,IAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,GACrB,KAAA,CAAM,IAAI,EAAA,EAAI,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAA,EAAI,QAAQ,IAAA,CAAK,CAAA,GAAI,EAAE,CAAA,GACtD,KAAA,CAAM,IAAI,EAAA,EAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,QAAA,GAAW,CAAA,GAAI,EAAA,GAAK,CAAA;AACjC,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,CAAA,EAAA,CAAI,IAAI,CAAA,GAAI,QAAA,GAAW,WAAW,CAAA,GAAI,CAAA,KAAM,IAAI,CAAA,GAAI,QAAA,CAAS,CAAC,CAAC,CAAA;AAC7G,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAEjC,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAuB;AACnC,MAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,GAAG,KAAK,CAAA;AACzB,MAAA,OAAA,EAAQ;AACR,MAAA,MAAM,QAAQ,EAAE,CAAA,EAAG,KAAK,CAAA,GAAI,IAAA,CAAK,IAAI,OAAA,GAAU,CAAA,GAAI,KAAK,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,GAAI,IAAA,CAAK,IAAI,OAAA,GAAU,CAAA,GAAI,KAAK,CAAA,EAAE;AACrG,MAAA,MAAM,MAAM,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,CAAC,GAAG,KAAK,CAAA;AAClC,MAAA,OAAO,GAAA,CAAI,CAAA,EAAG,QAAA,EAAS,EAAG,MAAM,CAAA,IAAK,GAAA;AAAA,IACvC,CAAA;AACA,IAAA,IAAI,CAAC,KAAK,IAAI,CAAA,IAAK,CAAC,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG;AAC/B,MAAA,IAAI,QAAA,EAAS,IAAK,SAAA,EAAW,OAAO,OAAO,CAAC,CAAA;AAAA,IAC9C,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAI,CAAA;AAAA,IACX;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,OAAO,UAAA,GAAa,aAAA,IAAiB,QAAA,EAAS,GAAI,SAAA,EAAW;AAC3D,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,GAAA,CAAI,CAAA,EAAG,QAAA,EAAS,EAAG,MAAM,CAAA;AAC7D,IAAA,UAAA,IAAc,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,OAAO,UAAU,CAAA;AAC1B;ACpLO,SAAS,eAAA,CACd,UACA,KAAA,EACqB;AACrB,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,QAAA,EAAU,EAAE,CAAA;AACzC,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,CAAC,CAAA,IAAK,IAAA,EAAM;AAC5B,IAAA,MAAM,OAAA,GAAUD,IAAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAC7B,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAI,CAAA,+BAAA,CAAiC,CAAA;AAC9F,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACxB,IAAA,IAAI,CAAA,MAAO,GAAA,CAAI,IAAA,EAAMA,KAAK,QAAA,CAAS,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,aAAA,GAAgB,IAAI,UAAA,CAAW,CAAC,QAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAC,CAAA;AAGtE,SAAS,UAAU,IAAA,EAAyB;AACjD,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW,OAAO,IAAA;AACpC,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,QAAO,GAAI,IAAA;AAChC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,QAAA,EAAU,aAAA;AAAA,IACV,QAAQ,IAAI,YAAA,CAAa,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAG,CAAA,GAAI,OAAO,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAG,CAAA,GAAI,MAAM,CAAC,CAAA;AAAA,IACnF,QAAA,EAAU;AAAA,GACZ;AACF;AAOO,SAAS,QAAA,CAAS,IAAA,EAAY,IAAA,EAAY,OAAA,EAAmD;AAClG,EAAA,MAAM,IAAA,GAAO,UAAU,IAAI,CAAA;AAC3B,EAAA,MAAM,OAAO,IAAA,CAAK,MAAA;AAClB,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,IAAU,CAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,IAAI,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,IAAI,YAAA,CAAa,KAAK,CAAA;AACpC,EAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACxB,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAC3B,IAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,KAAK,CAAA,uBAAA,CAAyB,CAAA;AAC1F,IAAA,MAAM,OAAA,GAAU,KAAK,KAAK,CAAA;AAC1B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,QAAQ,MAAM,CAAA;AACxC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,MAAA,IAAI,EAAE,IAAI,CAAA,CAAA,EAAI;AACd,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACpB,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AACxB,MAAA,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAI,EAAE,CAAC,CAAA,CAAA;AAC5C,MAAA,GAAA,CAAI,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,IAAK,KAAK,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,GAAI,EAAE,CAAC,CAAA,CAAA;AAChD,MAAA,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,IAAA,CAAK,MAAM,CAAA;AAC3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACnD,IAAA,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,IAAI,CAAA,GAAI,GAAA,CAAI,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAO;AAC3B;AC3DA,SAAS,kBAAkB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACzG,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC5B,EAAA,MAAM,IAAI,IAAA,GAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,MAAM,EAAA,GAAA,CAAM,EAAA,GAAK,MAAM,EAAA,IAAM,IAAI,CAAC,CAAA,GAAI,CAAA;AAC1F,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC1D;AAIA,SAAS,QAAQ,QAAA,EAA4B;AAC3C,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,QAAA,EAAU,EAAE,CAAA;AAC1C,EAAA,MAAM,EAAA,uBAAS,GAAA,EAA8B;AAC7C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,CAAC,CAAA,IAAK,KAAA,EAAO,EAAA,CAAG,GAAA,CAAI,IAAA,EAAMA,IAAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAC/D,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAkB;AACpC,EAAA,KAAA,MAAW,KAAA,IAAS,SAAS,MAAA,EAAQ;AACnC,IAAA,IAAI,KAAA,CAAM,UAAU,IAAA,EAAM;AAC1B,IAAA,IAAI,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AACjC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,GAAO,EAAE,KAAA,EAAO,KAAA,CAAM,MAAA,EAAQ,QAAA,EAAU,EAAC,EAAE;AAC3C,MAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC9B;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,GAAG,EAAA,CAAG,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAI,GAAG,EAAA,CAAG,GAAA,CAAI,KAAA,CAAM,IAAI,CAAE,CAAA;AAAA,EACrE;AACA,EAAA,KAAA,MAAW,KAAA,IAAS,SAAS,MAAA,EAAQ;AACnC,IAAA,IAAI,MAAM,MAAA,IAAU,IAAA,IAAQ,MAAM,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AACnD,IAAA,MAAM,CAAC,CAAA,EAAG,CAAC,IAAI,EAAA,CAAG,GAAA,CAAI,MAAM,IAAI,CAAA;AAChC,IAAA,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,EAAE,OAAO,KAAA,CAAM,IAAA,EAAM,QAAA,EAAU,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,GAAG,CAAA;AAAA,EACrE;AAEA,EAAA,OAAO,QAAA,CAAS,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU,KAAA,CAAM,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,IAAK,EAAE,CAAA;AACvE;AAMO,SAAS,QAAA,CAAS,IAAA,EAAY,QAAA,EAAoB,OAAA,GAA2B,EAAC,EAAS;AAC5F,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,CAAA;AAC/B,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAC,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,QAAQ,QAAQ,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAI,CAAA,CAAE,MAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,IAAU,CAAA;AAC/B,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsB;AACtC,EAAA,MAAM,QAAA,GAAW,IAAI,YAAA,CAAa,KAAA,CAAM,MAAM,CAAA;AAC9C,EAAA,MAAM,QAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAC,CAAA;AAEnC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACvB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAC3B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA;AACnB,MAAA,IAAI,CAAA,GAAI,QAAA;AACR,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,IAAK,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,iBAAA,CAAkB,EAAA,EAAI,EAAA,EAAI,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAC,CAAC,CAAC,CAAA;AACnH,MAAA,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA;AAAA,IAChB;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,GAAI,CAAC,CAAA;AACvD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC/B,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,CAAC,CAAC,CAAA;AAChC,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AAC1B,MAAA,MAAM,CAAA,GAAI,OAAA,KAAY,CAAA,GAAK,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAA,CAAM,OAAA,GAAU,QAAA,CAAS,CAAC,CAAA,KAAM,KAAA;AACnF,MAAA,KAAA,IAAS,CAAA;AACT,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,MAAA,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG;AAClB,MAAA,IAAI,UAAU,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,CAAC,EAAE,KAAK,CAAA;AACpC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,GAAU,IAAI,KAAA,CAAc,KAAK,CAAA,CAAE,KAAK,CAAC,CAAA;AACzC,QAAA,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,MACjC;AACA,MAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA;AAAA,IACxB,CAAC,CAAA;AAAA,EACH;AACA,EAAA,OAAO,MAAA,CAAO,YAAY,GAAG,CAAA;AAC/B;AC1FO,SAAS,eAAe,QAAA,EAA2D;AACxF,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAsC;AACtD,EAAA,KAAA,MAAW,CAAC,MAAM,CAAC,CAAA,IAAK,gBAAgB,QAAA,EAAU,EAAE,CAAA,EAAG;AACrD,IAAA,MAAM,CAAC,GAAG,CAAC,CAAA,GAAIA,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AACjC,IAAA,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA,EAAG,GAAG,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,OAAA,CAAQ,QAAA,EAAoB,CAAA,EAAW,CAAA,EAAW,KAAA,EAA8B;AAC9F,EAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,CAAC,CAAA,IAAK,cAAA,CAAe,QAAQ,CAAA,EAAG;AAChD,IAAA,MAAM,CAAA,GAAI,KAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA;AACrC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,KAAA,GAAQ,CAAA;AAAA,IACV;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,QAAA,CAAS,QAAA,EAAoB,MAAA,EAAuB,CAAA,EAAW,CAAA,EAA6B;AACnG,EAAA,IAAI,MAAA,IAAU,IAAA,EAAM,OAAO,CAAC,GAAG,CAAC,CAAA;AAChC,EAAA,MAAM,QAAQ,eAAA,CAAgB,QAAA,EAAU,EAAE,CAAA,CAAE,IAAI,MAAM,CAAA;AACtD,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,MAAM,CAAA,EAAA,CAAI,CAAA;AACpE,EAAA,MAAM,OAAA,GAAUA,IAAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACjC,EAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,MAAM,CAAA,+BAAA,CAAiC,CAAA;AAC/E,EAAA,OAAOA,IAAAA,CAAK,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AACjC;AAIO,SAAS,SAAA,CAAU,QAAA,EAAoB,IAAA,EAAc,CAAA,EAAW,CAAA,EAAqB;AAC1F,EAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACzD,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,IAAI,CAAA,EAAA,CAAI,CAAA;AAC7E,EAAA,MAAM,CAAC,IAAI,EAAE,CAAA,GAAI,SAAS,QAAA,EAAU,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AACtD,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,SAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,KAAM,KAAA,GAAQ,EAAE,GAAG,CAAA,EAAG,MAAM,EAAE,GAAG,EAAE,IAAA,EAAM,CAAA,EAAG,IAAI,CAAA,EAAG,EAAA,EAAG,EAAE,GAAI,CAAE;AAAA,GACpG;AACF;AAIO,SAAS,QAAA,CACd,QAAA,EACA,MAAA,EACA,CAAA,EACA,GACA,IAAA,EACsC;AACtC,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACxD,EAAA,IAAI,MAAA,GAAS,IAAA;AACb,EAAA,IAAI,WAAW,MAAA,EAAW;AACxB,IAAA,MAAA,GAAS,OAAA;AACT,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,EAAG,CAAA,EAAA,EAAK,MAAA,GAAS,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAA;AAAA,EAC5D,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,EAAG;AAC5B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4CAAA,EAA+C,MAAM,CAAA,EAAA,CAAI,CAAA;AAAA,EAC3E;AACA,EAAA,MAAM,CAAC,IAAI,EAAE,CAAA,GAAI,SAAS,QAAA,EAAU,MAAA,EAAQ,GAAG,CAAC,CAAA;AAChD,EAAA,MAAM,KAAA,GAAe,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAG,cAAA,EAAgB,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,IAAG,EAAE;AACvF,EAAA,OAAO,EAAE,QAAA,EAAU,EAAE,MAAA,EAAQ,CAAC,GAAG,QAAA,CAAS,MAAA,EAAQ,KAAK,CAAA,EAAE,EAAG,IAAA,EAAM,MAAA,EAAO;AAC3E;AAGO,SAAS,WAAA,CAAY,UAAoB,IAAA,EAAyD;AACvG,EAAA,MAAM,IAAA,mBAAO,IAAI,GAAA,CAAI,CAAC,IAAI,CAAC,CAAA;AAE3B,EAAA,KAAA,MAAW,CAAA,IAAK,QAAA,CAAS,MAAA,EAAQ,IAAI,EAAE,MAAA,IAAU,IAAA,IAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,MAAM,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,EAAE,IAAI,CAAA;AAC5F,EAAA,MAAM,UAAU,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACjF,EAAA,OAAO,EAAE,QAAA,EAAU,EAAE,MAAA,EAAQ,QAAA,CAAS,OAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,KAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA,IAAK,OAAA,EAAQ;AAC3F;AAGO,SAAS,cAAA,CAAe,MAAY,MAAA,EAAiC;AAC1E,EAAA,IAAI,CAAC,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,IAAK,IAAI,GAAG,OAAO,IAAA;AAC3C,EAAA,MAAM,MAAyC,EAAC;AAChD,EAAA,KAAA,MAAW,CAAA,IAAK,IAAA,EAAM,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA;AAC9D,EAAA,OAAO,GAAA;AACT;;;AC9EO,SAAS,UAAA,CACd,IAAA,EACA,KAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,OAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,QAAQ,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,OAAM,EAAG,CAAC,GAAG,CAAA,KAAM,IAAA,CAAK,IAAI,CAAA,CAAE,CAAC,KAAK,CAAC,CAAA;AAChG,EAAA,MAAM,GAAA,GAAO,KAAK,KAAK,CAAA,KAAM,IAAI,KAAA,CAAc,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA;AAC5D,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,OAAA,EAAS;AAC9B,IAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,IAAK,KAAA,EAAO;AACzB,IAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AACtC,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,IAAI,IAAA,KAAS,OAAO,MAAA,IAAU,IAAA,CAAK,IAAI,CAAA,CAAE,CAAC,CAAA;AACnE,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,EAAM,IAAI,IAAA,KAAS,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA,CAAE,CAAC,CAAA,IAAA,CAAM,CAAA,GAAI,CAAA,IAAK,MAAA;AACxE,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,IACX,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,IACvB;AAAA,EACF;AACA,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,EAAM,IAAI,CAAC,KAAK,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,MAAM,CAAA,GAAI,CAAC,CAAA,EAAG,OAAO,KAAK,IAAI,CAAA;AAC7E,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,aACd,MAAA,EACA,CAAA,EACA,CAAA,EACA,MAAA,EACA,SACA,IAAA,EACqB;AACrB,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAoB;AACpC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAI,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC9C,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,CAAC,IAAI,CAAC,CAAA;AAC7D,IAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,IAAA,MAAM,GAAA,GAAM,OAAA,GAAU,CAAC,CAAA,IAAK,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,KAAS,KAAA,GAAQ,IAAA,CAAK,IAAI,GAAA,EAAK,CAAA,GAAI,CAAA,GAAI,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAI,MAAM,CAAA;AACtF,IAAA,IAAI,IAAA,KAAS,GAAA,EAAK,GAAA,CAAI,GAAA,CAAI,GAAG,IAAI,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,GAAA;AACT","file":"index.js","sourcesContent":["/** Most a slewed value may change per second, in its own units, in each\n * direction. A direction left out is unlimited: the value jumps to a target\n * on that side. `0` holds the value where it is. */\nexport interface SlewRates {\n rise?: number;\n fall?: number;\n}\n\nfunction checkRate(name: string, rate: number | undefined): number {\n if (rate === undefined) return Infinity;\n if (!(rate >= 0)) throw new RangeError(`slew: ${name} must be a rate >= 0, got ${rate}`);\n return rate;\n}\n\n/**\n * One step of a slew limiter: `value` moved toward `target` by at most the\n * rate for that direction times `dt` seconds, landing on `target` rather than\n * passing it. A fast `rise` with a slow `fall` is an attack/release envelope.\n */\nexport function slewToward(value: number, target: number, dt: number, rates: SlewRates): number {\n const rise = checkRate('rise', rates.rise);\n const fall = checkRate('fall', rates.fall);\n if (target > value) return Math.min(target, value + rise * dt);\n if (target < value) return Math.max(target, value - fall * dt);\n return value;\n}\n\n/** A value that follows `target` at limited rates. Both fields are writable:\n * set `target` to steer it, or write `value` to jump it and let it slew on\n * from there. Nothing moves until `step` is called. */\nexport interface Slew {\n value: number;\n target: number;\n /** Advance `dt` seconds and return the new value. */\n step(dt: number): number;\n}\n\n/** A stateful {@link slewToward}. `target` defaults to `value`, so a new slew\n * is at rest. */\nexport function createSlew(options: SlewRates & { value?: number; target?: number } = {}): Slew {\n const rates: SlewRates = { rise: checkRate('rise', options.rise), fall: checkRate('fall', options.fall) };\n const value = options.value ?? 0;\n const slew: Slew = {\n value,\n target: options.target ?? value,\n step(dt) {\n slew.value = slewToward(slew.value, slew.target, dt, rates);\n return slew.value;\n },\n };\n return slew;\n}\n","import { lerpColorArray, type ColorSpace } from '@weasel-js/paint';\n\n/**\n * Color interpolator: receives two flat RGBA float arrays (values in\n * 0..1, the renderer's color space — same shape as\n * `stroke.vertexColors`) and a normalized progress `t` in 0..1.\n * Returns the same-length blended array, also in 0..1 floats. Override\n * the default per-channel lerp via `TweenVertexColorsOptions.interpolate`\n * when a custom color-space or shaping is needed.\n */\nexport type ColorInterpolate = (\n from: readonly number[],\n to: readonly number[],\n t: number,\n) => number[];\n\n/** The interpolator the options ask for: `interpolate` itself, else a lerp in `interpolation`'s space. */\nexport function resolveInterpolator(\n opts: { interpolation?: ColorSpace; interpolate?: ColorInterpolate },\n): ColorInterpolate {\n if (opts.interpolate) return opts.interpolate;\n const space: ColorSpace = opts.interpolation ?? 'rgb';\n return (a, b, t) => lerpColorArray(a, b, t, space);\n}\n","import { linear, resolveEasing } from '@weasel-js/geom';\nimport type { ColorSpace } from '@weasel-js/paint';\nimport type {\n AnimationHandle,\n Animator,\n EasingSpec,\n SpringPresetName,\n} from './types';\nimport type { VertexColorChannel } from './colorRegistry';\nimport { resolveInterpolator, type ColorInterpolate } from './colorInterpolate';\n\n/** Options for `tweenVertexColors`. */\nexport interface TweenVertexColorsOptions {\n id: string;\n channel: VertexColorChannel;\n /** Per-anchor RGBA, flat, in 0..1 floats (matches the renderer's\n * `stroke.vertexColors` / `PathDrawCommand.vertexColors` color space).\n * Length must equal `from.length`. */\n to: readonly number[];\n /** Per-anchor RGBA, flat, in 0..1 floats. Length must equal `to.length`\n * and be a positive multiple of 4. */\n from: readonly number[];\n ms: number;\n easing?: EasingSpec;\n interpolation?: ColorSpace;\n interpolate?: ColorInterpolate;\n onDone?: () => void;\n}\n\nfunction validateLengths(from: readonly number[], to: readonly number[]): void {\n if (from.length !== to.length) {\n throw new Error(\n `vertex colors: length mismatch (from=${from.length}, to=${to.length})`,\n );\n }\n if (from.length === 0 || from.length % 4 !== 0) {\n throw new Error(\n `vertex colors: length ${from.length} must be a positive multiple of 4`,\n );\n }\n}\n\nconst cancelKeyFor = (id: string, channel: VertexColorChannel): string =>\n `colors:${id}:${channel}`;\n\n/** Under a thousandth of full scale from `to`, and slower than that a second, a color spring is done. */\nconst COLOR_REST = 0.001;\n\n/** What the from-to helpers share: the node's color target, moved by a path through `colorsAt`. */\nfunction tweenColors(\n animator: Animator,\n opts: { id: string; channel: VertexColorChannel; from: readonly number[]; to: readonly number[]; onDone?: () => void },\n ms: number,\n easing: EasingSpec | undefined,\n colorsAt: (t: number) => number[],\n): AnimationHandle {\n const { id, channel } = opts;\n const registry = animator.colorOverrides;\n return animator.tween<number[]>({\n target: registry.target(id, channel, opts.from.length),\n from: opts.from.slice(),\n to: opts.to.slice(),\n ms,\n easing,\n cancelKey: cancelKeyFor(id, channel),\n interrupt: false,\n interpolate: (_from, _to, t) => colorsAt(t),\n onDone: () => {\n registry.release(id, channel);\n opts.onDone?.();\n },\n });\n}\n\n/**\n * Animate one node's per-anchor colors from `from` to `to` over `ms`.\n *\n * It moves the node's color target (`animator.colorOverrides.target`) rather\n * than writing the scene, so nothing is recorded in history and the node's own\n * data is untouched. Another tween or stagger on the same node and channel adds\n * to this one; a spring interrupts it. What it painted is dropped when the last\n * animation on the node and channel finishes, and held where it was if canceled\n * until `animator.colorOverrides.clear`.\n */\nexport function tweenVertexColors(\n animator: Animator,\n opts: TweenVertexColorsOptions,\n): AnimationHandle {\n validateLengths(opts.from, opts.to);\n const interp = resolveInterpolator(opts);\n return tweenColors(animator, opts, opts.ms, opts.easing, (t) => interp(opts.from, opts.to, t));\n}\n\n/** Options for `springVertexColors`. */\nexport interface SpringVertexColorsOptions {\n id: string;\n channel: VertexColorChannel;\n /** Per-anchor RGBA in 0..1 floats. See `TweenVertexColorsOptions.to`. */\n to: readonly number[];\n /** Per-anchor RGBA in 0..1 floats. See `TweenVertexColorsOptions.from`. */\n from: readonly number[];\n preset?: SpringPresetName;\n stiffness?: number;\n damping?: number;\n mass?: number;\n onDone?: () => void;\n}\n\n/**\n * `tweenVertexColors` driven by a spring instead of a duration. Each number\n * springs on its own, so an underdamped spring overshoots `to` and the path is\n * a straight line in RGB.\n *\n * It interrupts whatever is animating the node and channel, and starts at the\n * velocity of the one it interrupts, so retargeting mid-flight does not stall.\n */\nexport function springVertexColors(\n animator: Animator,\n opts: SpringVertexColorsOptions,\n): AnimationHandle {\n validateLengths(opts.from, opts.to);\n const { id, channel } = opts;\n const registry = animator.colorOverrides;\n return animator.spring<number[]>({\n target: registry.target(id, channel, opts.from.length),\n from: opts.from.slice(),\n to: opts.to.slice(),\n preset: opts.preset,\n stiffness: opts.stiffness,\n damping: opts.damping,\n mass: opts.mass,\n restThreshold: COLOR_REST,\n cancelKey: cancelKeyFor(id, channel),\n onDone: () => {\n registry.release(id, channel);\n opts.onDone?.();\n },\n });\n}\n\n/** Options for `staggerVertexColors`. `origin` picks which anchor the wave\n * starts from and `perAnchorDelay` how far behind each successive anchor\n * runs. */\nexport interface StaggerVertexColorsOptions {\n id: string;\n channel: VertexColorChannel;\n /** Per-anchor RGBA in 0..1 floats. See `TweenVertexColorsOptions.to`. */\n to: readonly number[];\n /** Per-anchor RGBA in 0..1 floats. See `TweenVertexColorsOptions.from`. */\n from: readonly number[];\n anchorMs: number;\n perAnchorDelay: number;\n origin?: 'first' | 'last' | number;\n easing?: EasingSpec;\n interpolation?: ColorSpace;\n interpolate?: ColorInterpolate;\n onDone?: () => void;\n}\n\n/** Run the same color change across a node's anchors as a wave, each anchor\n * starting later than the one before it. It moves the same target as\n * `tweenVertexColors`, and adds to other animations the same way. */\nexport function staggerVertexColors(\n animator: Animator,\n opts: StaggerVertexColorsOptions,\n): AnimationHandle {\n validateLengths(opts.from, opts.to);\n const interp = resolveInterpolator(opts);\n const { from, to, anchorMs, perAnchorDelay } = opts;\n const n = from.length / 4;\n const easing = resolveEasing(opts.easing);\n\n const originIndex =\n opts.origin === 'last' ? n - 1 :\n typeof opts.origin === 'number' ? Math.max(0, Math.min(n - 1, opts.origin)) :\n 0;\n\n const maxDistance = Math.max(originIndex, n - 1 - originIndex);\n const totalMs = maxDistance * perAnchorDelay + anchorMs;\n\n const colorsAt = (elapsedMs: number): number[] => {\n const out = new Array<number>(from.length);\n for (let i = 0; i < n; i++) {\n const distance = Math.abs(i - originIndex);\n const startMs = distance * perAnchorDelay;\n const localT = Math.max(0, Math.min(1, (elapsedMs - startMs) / anchorMs));\n const eased = easing(localT);\n const k = i * 4;\n const fSlice = [from[k], from[k + 1], from[k + 2], from[k + 3]];\n const tSlice = [to[k], to[k + 1], to[k + 2], to[k + 3]];\n const blended = interp(fSlice, tSlice, eased);\n out[k] = blended[0];\n out[k + 1] = blended[1];\n out[k + 2] = blended[2];\n out[k + 3] = blended[3];\n }\n return out;\n };\n\n return tweenColors(animator, opts, totalMs, linear, (t) => colorsAt(t * totalMs));\n}\n","import { resolveEasing } from '@weasel-js/geom';\nimport type { ColorSpace } from '@weasel-js/paint';\nimport type { Animator, EasingSpec } from './types';\nimport type { VertexColorChannel } from './colorRegistry';\nimport { resolveInterpolator, type ColorInterpolate } from './colorInterpolate';\n\n/** Options for `cycleVertexColors`. */\nexport interface CycleVertexColorsOptions {\n id: string;\n channel: VertexColorChannel;\n msPerCycle: number;\n direction?: 1 | -1;\n easing?: EasingSpec;\n interpolation?: ColorSpace;\n /** Custom interpolator. Receives two RGBA arrays in 0..1 floats and a\n * progress `t` in 0..1; returns the blended array in 0..1 floats. */\n interpolate?: ColorInterpolate;\n}\n\n/** Removes an installed color cycle. Unlike the other color helpers this is\n * not an `AnimationHandle`, because a cycle has no progress to pause or\n * scale — it only ends. */\nexport interface CycleHandle {\n cancel(): void;\n}\n\n/** Register a function override that phase-rotates the base color array\n * along the path index. Returns a handle whose `cancel()` removes the\n * override.\n *\n * The override computes its value purely from `performance.now()`, so\n * there's no per-frame progress to register with the animator's tick\n * loop. To keep the loop alive (so `<SceneCanvas animator>`'s onTick\n * subscription continues firing redraws while the cycle is installed),\n * cycleVertexColors holds an `animator.keepAlive()` entry for the\n * lifetime of the cycle; `cancel()` releases it. */\nexport function cycleVertexColors(\n animator: Animator,\n opts: CycleVertexColorsOptions,\n): CycleHandle {\n const interp = resolveInterpolator(opts);\n const { id, channel } = opts;\n const direction = opts.direction ?? 1;\n const easing = resolveEasing(opts.easing);\n\n const override = (base: readonly number[], tMs: number): number[] => {\n const n = base.length / 4;\n if (n === 0) return base.slice();\n const raw = (tMs / opts.msPerCycle) * n * direction;\n const cycles = raw / n;\n const cycleFrac = cycles - Math.floor(cycles);\n const easedFrac = easing(cycleFrac);\n const easedRaw = (Math.floor(cycles) + easedFrac) * n;\n const phase = ((easedRaw % n) + n) % n;\n const phaseInt = Math.floor(phase);\n const phaseFrac = phase - phaseInt;\n\n const out = new Array<number>(base.length);\n for (let i = 0; i < n; i++) {\n const aIdx = ((i + phaseInt) % n) * 4;\n const bIdx = ((i + phaseInt + 1) % n) * 4;\n const a = [base[aIdx], base[aIdx + 1], base[aIdx + 2], base[aIdx + 3]];\n const b = [base[bIdx], base[bIdx + 1], base[bIdx + 2], base[bIdx + 3]];\n const blended = interp(a, b, phaseFrac);\n const k = i * 4;\n out[k] = blended[0];\n out[k + 1] = blended[1];\n out[k + 2] = blended[2];\n out[k + 3] = blended[3];\n }\n return out;\n };\n\n animator.colorOverrides.set(id, channel, override);\n // Cycle's \"value\" is a function of wall-clock time, not a tween-style\n // progress. We don't register a per-frame ticking animation, so without\n // an explicit keep-alive entry the animator's RAF loop would idle and\n // SceneCanvas's onTick redraw subscription would never fire. Keep the\n // loop running until cancel().\n const releaseKeepAlive = animator.keepAlive();\n\n return {\n cancel(): void {\n animator.colorOverrides.clear(id, channel);\n releaseKeepAlive();\n },\n };\n}\n","import { hslToSrgb } from '@weasel-js/paint';\n\n// Per-anchor RGBA arrays in the 0..1 range the renderer expects: bytes (0..255) clamp every\n// channel to 1.0 on the GPU and render white.\n\n/** Build an n-anchor rainbow RGBA array sweeping the hue wheel. The\n * output is suitable to pass directly into `stroke.vertexColors`,\n * `tweenVertexColors({ from: rainbowVertexColors(n) })`, or any\n * other API that wants per-anchor color floats. */\nexport function rainbowVertexColors(\n n: number,\n opts: { saturation?: number; lightness?: number; alpha?: number } = {},\n): number[] {\n const saturation = opts.saturation ?? 0.8;\n const lightness = opts.lightness ?? 0.6;\n const alpha = opts.alpha ?? 1;\n const out: number[] = [];\n for (let i = 0; i < n; i++) {\n const h = (i * 360) / Math.max(1, n);\n const [r, g, b] = hslToSrgb(h, saturation, lightness);\n out.push(r, g, b, alpha);\n }\n return out;\n}\n\n/** Build an n-anchor solid RGBA array. Shorthand for\n * `[r, g, b, a, r, g, b, a, …]` — the array a `tweenVertexColors`\n * `to`-target typically needs. */\nexport function solidVertexColors(\n n: number,\n r: number,\n g: number,\n b: number,\n a = 1,\n): number[] {\n const out: number[] = [];\n for (let i = 0; i < n; i++) out.push(r, g, b, a);\n return out;\n}\n","import {\n EASINGS, reviveTypedArrays, tagTypedArrays, type BezierEasing, type EasingName, type EasingSpec,\n} from '@weasel-js/geom';\nimport { axisIndexes } from '../axisNames';\nimport type { Target } from '../target';\nimport type { Interpolate } from '../types';\nimport type { EventTrack, NestedTimeline, SampledTrack, TimelineEvent, TimelineTrack, Track } from './types';\n\n/** A value a clip can hold: what `JSON.stringify` writes and `JSON.parse` reads back. The\n * object arm is any object, so a pose typed by an interface is one; `toClip` is what refuses\n * a member JSON cannot round-trip. An object's `undefined` members are left out, as JSON\n * leaves them. */\nexport type ClipValue = number | string | boolean | null | ClipValue[] | object;\n\n/** A keyframe as data. Its easing is a built-in's name or bezier control points. */\nexport interface ClipKey {\n t: number;\n /** A typed array in the live key's value, as a `Path` has, is held as a `TaggedTypedArray`\n * from `@weasel-js/geom`: `{ __ta: 'f32', data: [...] }`. `bindClip` makes it the array again. */\n value: ClipValue;\n easing?: EasingName | BezierEasing;\n}\n\n/** A `SampledTrack` as data: what it moves and how it interpolates are names. */\nexport interface ClipSampledTrack {\n kind: 'sampled';\n label?: string;\n /** Resolved by `ClipBinder.target`. A track with none is sampled and moves nothing. */\n target?: string;\n keys: ClipKey[];\n /** Resolved from `ClipBinder.interpolate`. Without one the track is sampled in its\n * target's axes, or field by field. */\n interpolate?: string;\n /** The track's share of its target: a number, or a name for `ClipBinder.weight` to resolve\n * into a function read each frame, as a crossfade's is. */\n weight?: number | string;\n /** The part of the target the track holds: the target's names for its axes, a rig's joints\n * among them, or positions in its axes where it has no names. */\n axes?: number[] | string[];\n}\n\n/** An `EventTrack` as data: each event is a name and what to carry with it. */\nexport interface ClipEventTrack {\n kind: 'event';\n label?: string;\n events: { t: number; name: string; data?: ClipValue }[];\n}\n\n/** A `TimelineTrack` as data. */\nexport interface ClipTimelineTrack {\n kind: 'timeline';\n label?: string;\n at: number;\n timeline: ClipTimeline;\n}\n\n/** Any track a clip can hold. */\nexport type ClipTrack = ClipSampledTrack | ClipEventTrack | ClipTimelineTrack;\n\n/** A `NestedTimeline` as data. */\nexport interface ClipTimeline {\n tracks: ClipTrack[];\n duration?: number;\n}\n\n/** A timeline as data: what `JSON.stringify` can write, `bindClip` can play, and `toClip`\n * can read back off a live timeline. */\nexport interface Clip extends ClipTimeline {\n version: 1;\n}\n\n/** What turns the names in a clip into the live things a timeline plays. */\nexport interface ClipBinder {\n /** The target a sampled track names. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n target?(name: string): Target<any> | undefined;\n /** Interpolations by name. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n interpolate?: Readonly<Record<string, Interpolate<any>>>;\n /** The function a track's named weight stands for. */\n weight?(name: string): (() => number) | undefined;\n /** What an event does: its `fire`, its `book`, or both. */\n event?(name: string, data: ClipValue | undefined): Pick<TimelineEvent, 'fire' | 'book'> | undefined;\n}\n\nconst defined = <T extends object>(o: T): T => {\n for (const k in o) if (o[k] === undefined) delete o[k];\n return o;\n};\n\nfunction bindTrack(track: ClipTrack, binder: ClipBinder): Track {\n if (track.kind === 'timeline') {\n return defined<TimelineTrack>({ kind: 'timeline', label: track.label, at: track.at, timeline: bindTimeline(track.timeline, binder) });\n }\n if (track.kind === 'event') {\n return defined<EventTrack>({\n kind: 'event',\n label: track.label,\n events: track.events.map((e) => {\n const does = binder.event?.(e.name, e.data);\n if (!does) throw new Error(`bindClip: the binder has no event named \"${e.name}\".`);\n return defined<TimelineEvent>({ t: e.t, name: e.name, data: e.data, fire: does.fire, book: does.book });\n }),\n });\n }\n const target = track.target === undefined ? undefined : binder.target?.(track.target);\n if (track.target !== undefined && !target) throw new Error(`bindClip: the binder has no target named \"${track.target}\".`);\n const interpolate = track.interpolate === undefined ? undefined : binder.interpolate?.[track.interpolate];\n if (track.interpolate !== undefined && !interpolate) {\n throw new Error(`bindClip: the binder has no interpolation named \"${track.interpolate}\".`);\n }\n return defined<SampledTrack<ClipValue>>({\n kind: 'sampled',\n label: track.label,\n keys: track.keys.map((k) => ({ ...k, value: reviveTypedArrays(k.value) as ClipValue })),\n target,\n targetName: track.target,\n interpolate,\n interpolateName: track.interpolate,\n ...bindWeight(track, binder),\n axes: bindAxes(track, target),\n });\n}\n\nfunction bindWeight(track: ClipSampledTrack, binder: ClipBinder): Pick<SampledTrack<ClipValue>, 'weight' | 'weightName'> {\n const { weight } = track;\n if (typeof weight !== 'string') return { weight };\n const read = binder.weight?.(weight);\n if (!read) throw new Error(`bindClip: the binder has no weight named \"${weight}\".`);\n return { weight: read, weightName: weight };\n}\n\n/** A clip track's axes for the live track, refused here where its target has no such axes\n * rather than when the playhead first reaches the track. */\nfunction bindAxes(track: ClipSampledTrack, target: Target<unknown> | undefined): SampledTrack<ClipValue>['axes'] {\n const { axes } = track;\n if (!axes) return undefined;\n const where = `bindClip: track \"${track.label ?? ''}\"`;\n if (!target) throw new Error(`${where} names axes and no target.`);\n axisIndexes(target.axes, axes, `${where} on the target \"${track.target}\"`);\n return [...axes] as SampledTrack<ClipValue>['axes'];\n}\n\nfunction bindTimeline(timeline: ClipTimeline, binder: ClipBinder): NestedTimeline {\n return defined<NestedTimeline>({ tracks: timeline.tracks.map((t) => bindTrack(t, binder)), duration: timeline.duration });\n}\n\n/**\n * The live timeline a clip describes, for `animator.timeline`: each sampled track given the\n * target and interpolation it names, each event what the binder says it does. The tracks\n * keep those names, so `toClip` can write them back after an editor has changed them.\n * Throws on a name the binder does not resolve.\n */\nexport function bindClip(clip: Clip, binder: ClipBinder): NestedTimeline {\n if (clip.version !== 1) throw new Error(`bindClip: this clip is version ${String(clip.version)}, and version 1 is the one understood.`);\n return bindTimeline(clip, binder);\n}\n\nconst EASING_NAMES = new Map<unknown, EasingName>(\n (Object.keys(EASINGS) as EasingName[]).map((name) => [EASINGS[name], name]),\n);\n\nfunction isClipValue(v: unknown): v is ClipValue {\n if (v === null || typeof v === 'string' || typeof v === 'boolean') return true;\n if (typeof v === 'number') return Number.isFinite(v);\n if (Array.isArray(v)) return v.every(isClipValue);\n if (typeof v !== 'object' || Object.prototype.toString.call(v) !== '[object Object]') return false;\n return Object.values(v as object).every((member) => member === undefined || isClipValue(member));\n}\n\nfunction easingOf(spec: EasingSpec | undefined, where: string): EasingName | BezierEasing | undefined {\n if (spec === undefined || typeof spec === 'string') return spec;\n if (typeof spec !== 'function') return { bezier: [...spec.bezier] as BezierEasing['bezier'] };\n const name = EASING_NAMES.get(spec);\n if (!name) throw new Error(`toClip: ${where} eases a key by a function that is not a built-in; name it or use bezier points.`);\n return name;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction sampledToClip(track: SampledTrack<any>, where: string): ClipSampledTrack {\n if (track.onTick) throw new Error(`toClip: ${where} has an onTick, which a clip cannot hold; move the value with a target.`);\n if (track.target && track.targetName === undefined) throw new Error(`toClip: ${where} has a target and no targetName.`);\n if (track.interpolator) throw new Error(`toClip: ${where} has an interpolator, which a clip cannot hold.`);\n if (track.interpolate && track.interpolateName === undefined) throw new Error(`toClip: ${where} has an interpolate and no interpolateName.`);\n if (typeof track.weight === 'function' && track.weightName === undefined) {\n throw new Error(`toClip: ${where} has a function for its weight and no weightName.`);\n }\n return defined<ClipSampledTrack>({\n kind: 'sampled',\n label: track.label,\n target: track.targetName,\n keys: track.keys.map((k) => {\n const value = tagTypedArrays(k.value);\n if (!isClipValue(value)) throw new Error(`toClip: ${where} holds a value JSON cannot round-trip, at t = ${k.t}.`);\n return defined<ClipKey>({ t: k.t, value, easing: easingOf(k.easing, where) });\n }),\n interpolate: track.interpolateName,\n weight: typeof track.weight === 'function' ? track.weightName : track.weight,\n axes: track.axes && ([...track.axes] as ClipSampledTrack['axes']),\n });\n}\n\nfunction trackToClip(track: Track, index: number): ClipTrack {\n const where = `track \"${track.label ?? index}\"`;\n if (track.kind === 'timeline') {\n return defined<ClipTimelineTrack>({ kind: 'timeline', label: track.label, at: track.at, timeline: timelineToClip(track.timeline) });\n }\n if (track.kind === 'sampled') return sampledToClip(track, where);\n return defined<ClipEventTrack>({\n kind: 'event',\n label: track.label,\n events: track.events.map((e) => {\n if (e.name === undefined) throw new Error(`toClip: ${where} has an event with no name, at t = ${e.t}.`);\n if (e.data !== undefined && !isClipValue(e.data)) throw new Error(`toClip: ${where} carries data JSON cannot round-trip, at t = ${e.t}.`);\n return defined({ t: e.t, name: e.name, data: e.data as ClipValue | undefined });\n }),\n });\n}\n\nfunction timelineToClip(timeline: NestedTimeline): ClipTimeline {\n return defined<ClipTimeline>({ tracks: timeline.tracks.map(trackToClip), duration: timeline.duration });\n}\n\n/**\n * A live timeline as a clip: `{ tracks, duration }` as `animator.timeline` takes them, or\n * `{ tracks: handle.tracks() }` off a running one. Each track is written by the names it\n * carries (`targetName`, `interpolateName`, an event's `name`), which `bindClip` sets and a\n * track written by hand can set too. A typed array in a key's value is written tagged.\n * Throws, naming the track, on anything a clip cannot hold: a function with no name, an\n * `onTick`, or a value JSON would not read back.\n */\nexport function toClip(timeline: NestedTimeline): Clip {\n return { version: 1, ...timelineToClip(timeline) };\n}\n","import type { JointTransform, Pose, Skeleton } from './types';\n\n/**\n * `pose` reflected across the rig's y axis, as deltas against the same\n * skeleton — so the mirrored pose still blends, samples, and resolves like any\n * other, and a rig faces the other way without a negative scale anywhere.\n *\n * Each joint's `x` and `rotation` are negated as bind plus delta, so the delta\n * for a joint the pose leaves at its bind is nonzero whenever the bind is.\n * Applying it twice gives the original pose back.\n */\nexport function mirrorPose(skeleton: Skeleton, pose: Pose): Pose {\n const out: Pose = {};\n const binds = new Map<string, JointTransform>();\n for (const joint of skeleton.joints) binds.set(joint.name, joint.bind);\n const names = new Set([...binds.keys(), ...Object.keys(pose)]);\n for (const name of names) {\n const bind = binds.get(name);\n const d = pose[name];\n out[name] = {\n ...d,\n x: -2 * (bind?.x ?? 0) - (d?.x ?? 0),\n rotation: -2 * (bind?.rotation ?? 0) - (d?.rotation ?? 0),\n };\n }\n return out;\n}\n","import { mat3, type GlMat3 } from '@weasel-js/geom';\nimport type { JointTransform, Pose, Skeleton } from './types';\n\n/** bind + delta, field by field. Scale is multiplicative, the rest additive. */\nexport function compose(bind: JointTransform, delta: Partial<JointTransform> | undefined): JointTransform {\n if (!delta) return bind;\n return {\n x: bind.x + (delta.x ?? 0),\n y: bind.y + (delta.y ?? 0),\n rotation: bind.rotation + (delta.rotation ?? 0),\n scaleX: bind.scaleX * (delta.scaleX ?? 1),\n scaleY: bind.scaleY * (delta.scaleY ?? 1),\n };\n}\n\n/** TRS as a GlMat3: translate * rotate * scale, applied to a column vector. */\nexport function toMat3(t: JointTransform): GlMat3 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const m = new Float32Array(9) as GlMat3;\n m[0] = c * t.scaleX; m[1] = s * t.scaleX; m[2] = 0;\n m[3] = -s * t.scaleY; m[4] = c * t.scaleY; m[5] = 0;\n m[6] = t.x; m[7] = t.y; m[8] = 1;\n return m;\n}\n\n/**\n * Resolve every joint's world transform by walking the skeleton once and\n * composing each joint onto its already-resolved parent.\n *\n * `skeleton.joints` must be in topological order — a joint whose parent has not\n * been resolved yet throws rather than silently resolving against identity,\n * because that failure is otherwise invisible until a limb renders in the wrong\n * place.\n */\nexport function resolveSkeleton(skeleton: Skeleton, pose: Pose): Map<string, GlMat3> {\n const out = new Map<string, GlMat3>();\n for (const joint of skeleton.joints) {\n const local = toMat3(compose(joint.bind, pose[joint.name]));\n if (joint.parent == null) {\n out.set(joint.name, local);\n continue;\n }\n const parent = out.get(joint.parent);\n if (!parent) {\n throw new Error(\n `resolveSkeleton: joint \"${joint.name}\" names parent \"${joint.parent}\", which has not ` +\n 'been resolved. Skeleton.joints must be in topological order.',\n );\n }\n out.set(joint.name, mat3.multiply(parent, local));\n }\n return out;\n}\n","/** A joint's local transform. Deliberately NOT the scene's generic `TPose`:\n * `TPose` is consumer-defined and may be a bare AABB with no rotation term,\n * which a joint chain cannot compose through. */\nexport interface JointTransform {\n x: number;\n y: number;\n /** Radians. */\n rotation: number;\n scaleX: number;\n scaleY: number;\n}\n\n/** One joint of a `Skeleton`. */\nexport interface Joint {\n name: string;\n /** Parent joint name, or null for a root. */\n parent: string | null;\n /** Local transform at rest. */\n bind: JointTransform;\n}\n\n/** Joints in topological order: every joint appears after its parent. */\nexport interface Skeleton {\n joints: Joint[];\n}\n\n/** Local deltas from the bind pose, keyed by joint name. Absent joints and\n * absent fields mean \"no change from bind\". */\nexport type Pose = Record<string, Partial<JointTransform>>;\n\n/** The transform that changes nothing: origin, no rotation, unit scale. */\nexport const IDENTITY_JOINT: JointTransform = {\n x: 0, y: 0, rotation: 0, scaleX: 1, scaleY: 1,\n};\n","import { axisIndexes } from '../axisNames';\nimport type { TargetAxes } from '../target';\nimport { IDENTITY_JOINT, type JointTransform, type Pose, type Skeleton } from './types';\n\nconst FIELDS = ['x', 'y', 'rotation', 'scaleX', 'scaleY'] as const satisfies readonly (keyof JointTransform)[];\nconst ROTATION = FIELDS.indexOf('rotation');\n\n/** A name for each axis of `skeletonAxes(skeleton)`: `<joint>.<field>`. */\nfunction axisNames(skeleton: Skeleton): string[] {\n return skeleton.joints.flatMap((joint) => FIELDS.map((field) => `${joint.name}.${field}`));\n}\n\n/**\n * The axes of `skeletonAxes(skeleton)` that belong to `joints`, as indexes, for a caller with\n * a skeleton and no target. A hold or a track on a rig's target takes the joints' names\n * themselves: `animator.hold({ target: rig.target, value: pose, axes: arm })`.\n */\nexport function jointAxes(skeleton: Skeleton, joints: readonly string[]): number[] {\n const names = axisNames(skeleton);\n return axisIndexes({ count: names.length, names }, joints, 'jointAxes: `joints`');\n}\n\n/**\n * How a {@link Pose} of `skeleton` maps to the numbers an animation moves: five per joint in\n * skeleton order (`x`, `y`, `rotation`, `scaleX`, `scaleY`), every rotation an angle, so a pose\n * blends the short way round. Each axis is named `<joint>.<field>`, so `axes: ['knee']` on a hold\n * reaches a joint's five and `['knee.rotation']` one of them. A joint or field the pose leaves out reads as its identity, and a\n * pose read back names every joint in full. Pass it as `axes` to `createTarget` for a pose target\n * of your own; a bound rig's is `Rig.target`.\n */\nexport function skeletonAxes(skeleton: Skeleton): TargetAxes<Pose> {\n const names = skeleton.joints.map((j) => j.name);\n const n = FIELDS.length;\n return {\n count: names.length * n,\n angles: names.map((_, j) => j * n + ROTATION),\n names: axisNames(skeleton),\n to(pose) {\n const out = new Array<number>(names.length * n);\n for (let j = 0; j < names.length; j++) {\n const joint = pose[names[j]!];\n for (let f = 0; f < n; f++) out[j * n + f] = joint?.[FIELDS[f]!] ?? IDENTITY_JOINT[FIELDS[f]!];\n }\n return out;\n },\n add(pose, delta) {\n const out: Pose = {};\n for (let j = 0; j < names.length; j++) {\n const joint = pose[names[j]!];\n const at = j * n;\n out[names[j]!] = {\n x: (joint?.x ?? IDENTITY_JOINT.x) + delta[at]!,\n y: (joint?.y ?? IDENTITY_JOINT.y) + delta[at + 1]!,\n rotation: (joint?.rotation ?? IDENTITY_JOINT.rotation) + delta[at + 2]!,\n scaleX: (joint?.scaleX ?? IDENTITY_JOINT.scaleX) + delta[at + 3]!,\n scaleY: (joint?.scaleY ?? IDENTITY_JOINT.scaleY) + delta[at + 4]!,\n };\n }\n return out;\n },\n write(pose, out, at) {\n for (let j = 0; j < names.length; j++) {\n const joint = pose[names[j]!];\n for (let f = 0; f < n; f++) out[at + j * n + f] = joint?.[FIELDS[f]!] ?? IDENTITY_JOINT[FIELDS[f]!];\n }\n },\n from(axes) {\n const pose: Pose = {};\n for (let j = 0; j < names.length; j++) {\n const at = j * n;\n pose[names[j]!] = { x: axes[at]!, y: axes[at + 1]!, rotation: axes[at + 2]!, scaleX: axes[at + 3]!, scaleY: axes[at + 4]! };\n }\n return pose;\n },\n };\n}\n","import { mat3, type GlMat3 } from '@weasel-js/geom';\nimport { compose, resolveSkeleton, toMat3 } from './resolveSkeleton';\nimport type { Joint, Pose, Skeleton } from './types';\n\nconst TAU = Math.PI * 2;\n\n/** A point in the skeleton's space — the space `resolveSkeleton` resolves into. */\nexport interface IkPoint {\n x: number;\n y: number;\n}\n\n/** Bounds on a joint's rotation delta from its bind, in radians, with\n * `-PI <= min <= max <= PI`. */\nexport interface IkLimit {\n min: number;\n max: number;\n}\n\n/** Options for {@link solveIk}. */\nexport interface SolveIkOptions {\n /** The joints the solver may rotate, root first, each the parent of the next. */\n joints: readonly string[];\n /** The end effector, in the last joint's local frame — the forearm's length\n * along its +x for an arm, or a hand joint's bind offset. */\n tip: IkPoint;\n /** Where the tip should go, in skeleton space. A rig posed with a `root`\n * wants the target carried back through that root's inverse first. */\n target: IkPoint;\n /** Per-joint limits, keyed by joint name. A joint without one turns freely. */\n limits?: Readonly<Record<string, IkLimit>>;\n /** Two-joint chains only: the middle joint bends toward this point, in\n * skeleton space. Without it the chain keeps the bend the input pose has. */\n pole?: IkPoint;\n /** Most CCD sweeps to run. Default 32. */\n iterations?: number;\n /** Tip-to-target distance that counts as reached, in skeleton units.\n * Default 0.01. */\n tolerance?: number;\n}\n\n/** What {@link solveIk} returns. */\nexport interface IkResult {\n /** The input pose with each chain joint's rotation replaced. */\n pose: Pose;\n /** Tip-to-target distance the solve ended at. */\n distance: number;\n /** Whether `distance` is within the tolerance. False for a target out of\n * reach, which leaves the chain pointing straight at it. */\n reached: boolean;\n /** CCD sweeps run; 0 when the two-joint solution or the straight-line\n * answer for an unreachable target settled it. */\n iterations: number;\n}\n\nfunction wrap(a: number): number {\n return a - TAU * Math.round(a / TAU);\n}\n\n/** `v` held to `limit`, where out of range means the nearer bound around the circle. */\nfunction clampAngle(v: number, limit: IkLimit | undefined): number {\n if (!limit) return v;\n for (const c of [v, v - TAU, v + TAU]) if (c >= limit.min && c <= limit.max) return c;\n return Math.abs(wrap(v - limit.min)) <= Math.abs(wrap(v - limit.max)) ? limit.min : limit.max;\n}\n\nconst cross = (ax: number, ay: number, bx: number, by: number) => ax * by - ay * bx;\n\n/**\n * Rotate a joint chain so its tip reaches `target`, returning the result as an\n * ordinary {@link Pose}. Weighting the IK against an animated pose is\n * `animator.hold({ target: rig.target, value: solved, weight: w })` beside the\n * clip at weight `1 - w`; with `axes: jointAxes(skeleton, joints)` on both, the\n * rest of the body is left to whatever else holds it.\n *\n * The solver is cyclic coordinate descent, and limits clamp the rotation the\n * pose stores. A two-joint chain is solved analytically first: of the two bends\n * that reach the target it takes the one on `pole`'s side, or the input pose's\n * side, and falls back to the other bend and then to CCD when limits refuse it.\n * A target beyond the chain's reach straightens the chain toward it.\n */\nexport function solveIk(skeleton: Skeleton, pose: Pose, options: SolveIkOptions): IkResult {\n const { tip, target, limits } = options;\n const maxIterations = options.iterations ?? 32;\n const tolerance = options.tolerance ?? 0.01;\n\n const byName = new Map<string, Joint>();\n for (const joint of skeleton.joints) byName.set(joint.name, joint);\n const chain = options.joints.map((name, i) => {\n const joint = byName.get(name);\n if (!joint) throw new Error(`solveIk: the skeleton has no joint \"${name}\".`);\n if (i > 0 && joint.parent !== options.joints[i - 1]) {\n throw new Error(\n `solveIk: chain joint \"${name}\" names parent \"${joint.parent}\", not \"${options.joints[i - 1]}\". ` +\n 'Each chain joint must be the parent of the next.',\n );\n }\n return joint;\n });\n const n = chain.length;\n if (n === 0) return { pose: { ...pose }, distance: Infinity, reached: false, iterations: 0 };\n\n const rootParent = chain[0].parent;\n const base = rootParent == null ? mat3.identity() : resolveSkeleton(skeleton, pose).get(rootParent)!;\n const rot = chain.map((joint) => clampAngle(wrap(pose[joint.name]?.rotation ?? 0), limits?.[joint.name]));\n\n let worlds: GlMat3[] = [];\n const resolve = () => {\n worlds = [];\n let parent = base;\n for (let i = 0; i < n; i += 1) {\n const joint = chain[i];\n parent = mat3.multiply(parent, toMat3(compose(joint.bind, { ...pose[joint.name], rotation: rot[i] })));\n worlds.push(parent);\n }\n };\n const pivot = (i: number) => mat3.apply(worlds[i], 0, 0);\n const tipWorld = () => mat3.apply(worlds[n - 1], tip.x, tip.y);\n /** The point joint `i` swings: the next joint's pivot, or the tip. */\n const next = (i: number) => (i + 1 < n ? pivot(i + 1) : tipWorld());\n\n /** Turn joint `i` so `effector` lies on the ray toward `goal`. True when a\n * limit cut the turn short. */\n const aim = (i: number, effector: [number, number], goal: IkPoint): boolean => {\n const inv = mat3.invert(i === 0 ? base : worlds[i - 1]);\n if (!inv) return false;\n const [ox, oy] = mat3.apply(inv, ...pivot(i));\n const [ex, ey] = mat3.apply(inv, ...effector);\n const [gx, gy] = mat3.apply(inv, goal.x, goal.y);\n if (Math.hypot(ex - ox, ey - oy) < 1e-9 || Math.hypot(gx - ox, gy - oy) < 1e-9) return false;\n const want = wrap(rot[i] + Math.atan2(gy - oy, gx - ox) - Math.atan2(ey - oy, ex - ox));\n rot[i] = clampAngle(want, limits?.[chain[i].name]);\n resolve();\n return Math.abs(wrap(rot[i] - want)) > 1e-9;\n };\n\n const distance = () => {\n const [x, y] = tipWorld();\n return Math.hypot(x - target.x, y - target.y);\n };\n const result = (iterations: number): IkResult => {\n const out: Pose = { ...pose };\n chain.forEach((joint, i) => { out[joint.name] = { ...pose[joint.name], rotation: rot[i] }; });\n const d = distance();\n return { pose: out, distance: d, reached: d <= tolerance, iterations };\n };\n\n resolve();\n const [rx, ry] = pivot(0);\n let reach = 0;\n for (let i = 0; i < n; i += 1) {\n const [ax, ay] = pivot(i);\n const [bx, by] = next(i);\n reach += Math.hypot(bx - ax, by - ay);\n }\n const toTarget = Math.hypot(target.x - rx, target.y - ry);\n\n if (toTarget >= reach) {\n for (let i = 0; i < n; i += 1) aim(i, next(i), target);\n return result(0);\n }\n\n if (n === 2 && toTarget > 1e-9) {\n const start = rot.slice();\n const [mx, my] = pivot(1);\n const [tx, ty] = tipWorld();\n const a = Math.hypot(mx - rx, my - ry);\n const b = Math.hypot(tx - mx, ty - my);\n const dx = target.x - rx;\n const dy = target.y - ry;\n const bendSide = options.pole\n ? cross(dx, dy, options.pole.x - rx, options.pole.y - ry)\n : cross(dx, dy, mx - rx, my - ry);\n const side = bendSide < 0 ? -1 : 1;\n const inner = Math.acos(Math.max(-1, Math.min(1, (a * a + toTarget * toTarget - b * b) / (2 * a * toTarget))));\n const heading = Math.atan2(dy, dx);\n\n const bend = (s: number): boolean => {\n rot.splice(0, 2, ...start);\n resolve();\n const elbow = { x: rx + a * Math.cos(heading + s * inner), y: ry + a * Math.sin(heading + s * inner) };\n const cut = aim(0, pivot(1), elbow);\n return aim(1, tipWorld(), target) || cut;\n };\n if (!bend(side) || !bend(-side)) {\n if (distance() <= tolerance) return result(0);\n } else {\n bend(side);\n }\n }\n\n let iterations = 0;\n while (iterations < maxIterations && distance() > tolerance) {\n for (let i = n - 1; i >= 0; i -= 1) aim(i, tipWorld(), target);\n iterations += 1;\n }\n return result(iterations);\n}\n","import { mat3, PATH_L, PATH_M, PATH_Z, type GlMat3, type Path, type PolygonPath } from '@weasel-js/geom';\nimport { resolveSkeleton } from './resolveSkeleton';\nimport type { Skeleton } from './types';\n\n/**\n * How much each point of a path follows each joint: one array per joint name, indexed by\n * point. Point `i` is the `i`-th coordinate pair of a polygon path's `coords`, so anchors and\n * curve handles are weighted alike; a rect's points are its corners, clockwise from the top\n * left. A joint left out, and an index past an array's end, weigh nothing. Weights need not\n * sum to 1: they are normalized per point as they are applied.\n */\nexport type Skin = Readonly<Record<string, readonly number[]>>;\n\n/**\n * Each joint's motion since the bind pose, in world space: `world * inverse(restWorld)`.\n * `world` is what `resolveSkeleton` or `Rig.world()` answers.\n */\nexport function motionsFromRest(\n skeleton: Skeleton,\n world: ReadonlyMap<string, GlMat3>,\n): Map<string, GlMat3> {\n const rest = resolveSkeleton(skeleton, {});\n const out = new Map<string, GlMat3>();\n for (const [name, r] of rest) {\n const inverse = mat3.invert(r);\n if (!inverse) throw new Error(`motionsFromRest: joint \"${name}\" is singular at the bind pose.`);\n const w = world.get(name);\n if (w) out.set(name, mat3.multiply(w, inverse));\n }\n return out;\n}\n\nconst RECT_COMMANDS = new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L, PATH_Z]);\n\n/** The path whose points a skin indexes: a rect as its four corners. */\nexport function skinnable(path: Path): PolygonPath {\n if (path.kind === 'polygon') return path;\n const { x, y, width, height } = path;\n return {\n kind: 'polygon',\n commands: RECT_COMMANDS,\n coords: new Float32Array([x, y, x + width, y, x + width, y + height, x, y + height]),\n fillRule: 'nonzero',\n };\n}\n\n/**\n * Bend `path` by linear blend skinning: each point goes where its joints' motions since the\n * bind pose would carry it, averaged by weight. `path` is the shape at the bind pose, in the\n * space `motions` are in; it is not modified. A point no joint weighs stays where it is.\n */\nexport function skinPath(path: Path, skin: Skin, motions: ReadonlyMap<string, GlMat3>): PolygonPath {\n const rest = skinnable(path);\n const from = rest.coords;\n const count = from.length >> 1;\n const sum = new Float64Array(from.length);\n const total = new Float64Array(count);\n for (const joint in skin) {\n const m = motions.get(joint);\n if (!m) throw new Error(`skinPath: the skin weighs joint \"${joint}\", which has no motion.`);\n const weights = skin[joint];\n const n = Math.min(count, weights.length);\n for (let i = 0; i < n; i++) {\n const w = weights[i];\n if (!(w > 0)) continue;\n const x = from[2 * i];\n const y = from[2 * i + 1];\n sum[2 * i] += w * (m[0] * x + m[3] * y + m[6]);\n sum[2 * i + 1] += w * (m[1] * x + m[4] * y + m[7]);\n total[i] += w;\n }\n }\n const coords = new Float32Array(from.length);\n for (let i = 0; i < count; i++) {\n const t = total[i];\n coords[2 * i] = t > 0 ? sum[2 * i] / t : from[2 * i];\n coords[2 * i + 1] = t > 0 ? sum[2 * i + 1] / t : from[2 * i + 1];\n }\n return { ...rest, coords };\n}\n","import { mat3, type Path } from '@weasel-js/geom';\nimport { resolveSkeleton } from './resolveSkeleton';\nimport { skinnable, type Skin } from './skin';\nimport type { Skeleton } from './types';\n\n/** Options for `autoSkin`. */\nexport interface AutoSkinOptions {\n /** How fast a bone's pull falls off with distance: a weight is `1 / distance ** power`.\n * Higher keeps the bend closer to the joint. Default 4. */\n power?: number;\n /** The most joints a point follows; the nearest are kept. Default 2. */\n max?: number;\n}\n\ninterface Bone {\n joint: string;\n /** Flat `x0, y0, x1, y1` per segment, from the joint to each of its children. */\n segments: number[];\n}\n\nfunction distanceToSegment(px: number, py: number, ax: number, ay: number, bx: number, by: number): number {\n const dx = bx - ax;\n const dy = by - ay;\n const len2 = dx * dx + dy * dy;\n const t = len2 > 0 ? Math.min(1, Math.max(0, ((px - ax) * dx + (py - ay) * dy) / len2)) : 0;\n return Math.hypot(px - (ax + t * dx), py - (ay + t * dy));\n}\n\n/** A joint's bones run to its children. A joint with no child has none, being where its\n * parent's bone ends, unless it has no parent either. */\nfunction bonesOf(skeleton: Skeleton): Bone[] {\n const world = resolveSkeleton(skeleton, {});\n const at = new Map<string, [number, number]>();\n for (const [name, m] of world) at.set(name, mat3.apply(m, 0, 0));\n const bones = new Map<string, Bone>();\n for (const joint of skeleton.joints) {\n if (joint.parent == null) continue;\n let bone = bones.get(joint.parent);\n if (!bone) {\n bone = { joint: joint.parent, segments: [] };\n bones.set(joint.parent, bone);\n }\n bone.segments.push(...at.get(joint.parent)!, ...at.get(joint.name)!);\n }\n for (const joint of skeleton.joints) {\n if (joint.parent != null || bones.has(joint.name)) continue;\n const [x, y] = at.get(joint.name)!;\n bones.set(joint.name, { joint: joint.name, segments: [x, y, x, y] });\n }\n // Skeleton order, so a tie between bones goes to the one nearer the root.\n return skeleton.joints.flatMap((joint) => bones.get(joint.name) ?? []);\n}\n\n/**\n * Weights for `path` from how far each of its points is from each bone of `skeleton` at the\n * bind pose. `path` is in the skeleton's space. A point on a bone follows that bone alone.\n */\nexport function autoSkin(path: Path, skeleton: Skeleton, options: AutoSkinOptions = {}): Skin {\n const power = options.power ?? 4;\n const max = Math.max(1, options.max ?? 2);\n const bones = bonesOf(skeleton);\n const coords = skinnable(path).coords;\n const count = coords.length >> 1;\n const out = new Map<string, number[]>();\n const distance = new Float64Array(bones.length);\n const order = bones.map((_, b) => b);\n\n for (let i = 0; i < count; i++) {\n const px = coords[2 * i];\n const py = coords[2 * i + 1];\n for (let b = 0; b < bones.length; b++) {\n const s = bones[b].segments;\n let d = Infinity;\n for (let k = 0; k < s.length; k += 4) d = Math.min(d, distanceToSegment(px, py, s[k], s[k + 1], s[k + 2], s[k + 3]));\n distance[b] = d;\n }\n order.sort((a, b) => distance[a] - distance[b] || a - b);\n const kept = order.slice(0, max);\n const nearest = distance[kept[0]];\n let total = 0;\n const raw = kept.map((b) => {\n const w = nearest === 0 ? (distance[b] === 0 ? 1 : 0) : (nearest / distance[b]) ** power;\n total += w;\n return w;\n });\n kept.forEach((b, k) => {\n if (raw[k] === 0) return;\n let weights = out.get(bones[b].joint);\n if (!weights) {\n weights = new Array<number>(count).fill(0);\n out.set(bones[b].joint, weights);\n }\n weights[i] = raw[k] / total;\n });\n }\n return Object.fromEntries(out);\n}\n","import { mat3 } from '@weasel-js/geom';\nimport { resolveSkeleton } from './resolveSkeleton';\nimport type { Skin } from './skin';\nimport { IDENTITY_JOINT, type Joint, type Skeleton } from './types';\n\n/** Where each joint rests, in the skeleton's space and in its order. */\nexport function jointPositions(skeleton: Skeleton): Map<string, { x: number; y: number }> {\n const out = new Map<string, { x: number; y: number }>();\n for (const [name, m] of resolveSkeleton(skeleton, {})) {\n const [x, y] = mat3.apply(m, 0, 0);\n out.set(name, { x, y });\n }\n return out;\n}\n\n/** The joint resting nearest `(x, y)` and no further than `reach` from it, or `null`. */\nexport function jointAt(skeleton: Skeleton, x: number, y: number, reach: number): string | null {\n let best: string | null = null;\n let bestD = reach;\n for (const [name, p] of jointPositions(skeleton)) {\n const d = Math.hypot(p.x - x, p.y - y);\n if (d <= bestD) {\n best = name;\n bestD = d;\n }\n }\n return best;\n}\n\n/** `(x, y)` in the frame `parent`'s children are placed in. */\nfunction inParent(skeleton: Skeleton, parent: string | null, x: number, y: number): [number, number] {\n if (parent == null) return [x, y];\n const world = resolveSkeleton(skeleton, {}).get(parent);\n if (!world) throw new Error(`The skeleton has no joint \"${parent}\".`);\n const inverse = mat3.invert(world);\n if (!inverse) throw new Error(`Joint \"${parent}\" is singular at the bind pose.`);\n return mat3.apply(inverse, x, y);\n}\n\n/** `skeleton` with `name` resting at `(x, y)`. The joints under it keep their offsets from it,\n * so they move along. */\nexport function moveJoint(skeleton: Skeleton, name: string, x: number, y: number): Skeleton {\n const joint = skeleton.joints.find((j) => j.name === name);\n if (!joint) throw new Error(`moveJoint: the skeleton has no joint \"${name}\".`);\n const [lx, ly] = inParent(skeleton, joint.parent, x, y);\n return {\n joints: skeleton.joints.map((j) => (j === joint ? { ...j, bind: { ...j.bind, x: lx, y: ly } } : j)),\n };\n}\n\n/** `skeleton` with a new joint resting at `(x, y)` under `parent`, or as a root for `null`.\n * Without a `name` it gets the first of `joint`, `joint2`, … not in use. */\nexport function addJoint(\n skeleton: Skeleton,\n parent: string | null,\n x: number,\n y: number,\n name?: string,\n): { skeleton: Skeleton; name: string } {\n const taken = new Set(skeleton.joints.map((j) => j.name));\n let picked = name;\n if (picked === undefined) {\n picked = 'joint';\n for (let n = 2; taken.has(picked); n++) picked = `joint${n}`;\n } else if (taken.has(picked)) {\n throw new Error(`addJoint: the skeleton already has a joint \"${picked}\".`);\n }\n const [lx, ly] = inParent(skeleton, parent, x, y);\n const joint: Joint = { name: picked, parent, bind: { ...IDENTITY_JOINT, x: lx, y: ly } };\n return { skeleton: { joints: [...skeleton.joints, joint] }, name: picked };\n}\n\n/** `skeleton` without `name` and the joints under it, and the names that went. */\nexport function removeJoint(skeleton: Skeleton, name: string): { skeleton: Skeleton; removed: string[] } {\n const gone = new Set([name]);\n // Topological order: a joint's parent is decided before it is reached.\n for (const j of skeleton.joints) if (j.parent != null && gone.has(j.parent)) gone.add(j.name);\n const removed = skeleton.joints.filter((j) => gone.has(j.name)).map((j) => j.name);\n return { skeleton: { joints: skeleton.joints.filter((j) => !gone.has(j.name)) }, removed };\n}\n\n/** `skin` without the weights of `joints`; the same object when it weighs none of them. */\nexport function dropSkinJoints(skin: Skin, joints: readonly string[]): Skin {\n if (!joints.some((j) => j in skin)) return skin;\n const out: Record<string, readonly number[]> = {};\n for (const j in skin) if (!joints.includes(j)) out[j] = skin[j];\n return out;\n}\n","import type { Skin } from './skin';\n\n/**\n * `skin` with `joint`'s weight set on some points: `weights` maps a point's index to the new\n * weight, clamped to 0..1. On each of those points the other joints are scaled to share what\n * is left, so the point still sums to 1; a point no other joint weighs goes wholly to `joint`,\n * as it would when the skin is applied. Every array comes back `count` long, and a joint left\n * weighing nothing is dropped.\n */\nexport function setWeights(\n skin: Skin,\n count: number,\n joint: string,\n weights: ReadonlyMap<number, number>,\n): Skin {\n const next: Record<string, number[]> = {};\n for (const name in skin) next[name] = Array.from({ length: count }, (_, i) => skin[name][i] ?? 0);\n const own = (next[joint] ??= new Array<number>(count).fill(0));\n for (const [i, raw] of weights) {\n if (i < 0 || i >= count) continue;\n const w = Math.min(1, Math.max(0, raw));\n let others = 0;\n for (const name in next) if (name !== joint) others += next[name][i];\n if (others > 0) {\n for (const name in next) if (name !== joint) next[name][i] *= (1 - w) / others;\n own[i] = w;\n } else {\n own[i] = w > 0 ? 1 : 0;\n }\n }\n for (const name in next) if (!next[name].some((w) => w > 0)) delete next[name];\n return next;\n}\n\n/**\n * What a round brush at `(x, y)` does to one joint's weights: for each point of `coords`\n * within `radius`, a weight falling off linearly from the center. `'add'` raises a point\n * toward 1 and `'remove'` lowers it toward 0; neither moves a point the other way. Answers\n * only the points that change, by index, for {@link setWeights}.\n */\nexport function brushWeights(\n coords: ArrayLike<number>,\n x: number,\n y: number,\n radius: number,\n current: readonly number[] | undefined,\n mode: 'add' | 'remove',\n): Map<number, number> {\n const out = new Map<number, number>();\n for (let i = 0; 2 * i + 1 < coords.length; i++) {\n const d = Math.hypot(coords[2 * i] - x, coords[2 * i + 1] - y);\n if (d >= radius) continue;\n const had = current?.[i] ?? 0;\n const want = mode === 'add' ? Math.max(had, 1 - d / radius) : Math.min(had, d / radius);\n if (want !== had) out.set(i, want);\n }\n return out;\n}\n"]}
1
+ {"version":3,"sources":["../src/slew.ts","../src/colorInterpolate.ts","../src/colorHelpers.ts","../src/colorCycle.ts","../src/colorArrays.ts","../src/timeline/clip.ts","../src/rig/mirrorPose.ts","../src/rig/resolveSkeleton.ts","../src/rig/types.ts","../src/rig/skeletonAxes.ts","../src/rig/solveIk.ts","../src/rig/skin.ts","../src/rig/autoSkin.ts","../src/rig/skeletonEdits.ts","../src/rig/weightEdits.ts"],"names":["resolveEasing","mat3","iterations","worldCoords"],"mappings":"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","file":"index.js","sourcesContent":["/** Most a slewed value may change per second, in its own units, in each\n * direction. A direction left out is unlimited: the value jumps to a target\n * on that side. `0` holds the value where it is. */\nexport interface SlewRates {\n rise?: number;\n fall?: number;\n}\n\nfunction checkRate(name: string, rate: number | undefined): number {\n if (rate === undefined) return Infinity;\n if (!(rate >= 0)) throw new RangeError(`slew: ${name} must be a rate >= 0, got ${rate}`);\n return rate;\n}\n\n/**\n * One step of a slew limiter: `value` moved toward `target` by at most the\n * rate for that direction times `dt` seconds, landing on `target` rather than\n * passing it. A fast `rise` with a slow `fall` is an attack/release envelope.\n */\nexport function slewToward(value: number, target: number, dt: number, rates: SlewRates): number {\n const rise = checkRate('rise', rates.rise);\n const fall = checkRate('fall', rates.fall);\n if (target > value) return Math.min(target, value + rise * dt);\n if (target < value) return Math.max(target, value - fall * dt);\n return value;\n}\n\n/** A value that follows `target` at limited rates. Both fields are writable:\n * set `target` to steer it, or write `value` to jump it and let it slew on\n * from there. Nothing moves until `step` is called. */\nexport interface Slew {\n value: number;\n target: number;\n /** Advance `dt` seconds and return the new value. */\n step(dt: number): number;\n}\n\n/** A stateful {@link slewToward}. `target` defaults to `value`, so a new slew\n * is at rest. */\nexport function createSlew(options: SlewRates & { value?: number; target?: number } = {}): Slew {\n const rates: SlewRates = { rise: checkRate('rise', options.rise), fall: checkRate('fall', options.fall) };\n const value = options.value ?? 0;\n const slew: Slew = {\n value,\n target: options.target ?? value,\n step(dt) {\n slew.value = slewToward(slew.value, slew.target, dt, rates);\n return slew.value;\n },\n };\n return slew;\n}\n","import { lerpColorArray, type ColorSpace } from '@weasel-js/paint';\n\n/**\n * Color interpolator: receives two flat RGBA float arrays (values in\n * 0..1, the renderer's color space — same shape as\n * `stroke.vertexColors`) and a normalized progress `t` in 0..1.\n * Returns the same-length blended array, also in 0..1 floats. Override\n * the default per-channel lerp via `TweenVertexColorsOptions.interpolate`\n * when a custom color-space or shaping is needed.\n */\nexport type ColorInterpolate = (\n from: readonly number[],\n to: readonly number[],\n t: number,\n) => number[];\n\n/** The interpolator the options ask for: `interpolate` itself, else a lerp in `interpolation`'s space. */\nexport function resolveInterpolator(\n opts: { interpolation?: ColorSpace; interpolate?: ColorInterpolate },\n): ColorInterpolate {\n if (opts.interpolate) return opts.interpolate;\n const space: ColorSpace = opts.interpolation ?? 'rgb';\n return (a, b, t) => lerpColorArray(a, b, t, space);\n}\n","import { linear, resolveEasing } from '@weasel-js/geom';\nimport type { ColorSpace } from '@weasel-js/paint';\nimport type {\n AnimationHandle,\n Animator,\n EasingSpec,\n SpringPresetName,\n} from './types';\nimport type { VertexColorChannel } from './colorRegistry';\nimport { resolveInterpolator, type ColorInterpolate } from './colorInterpolate';\n\n/** Options for `tweenVertexColors`. */\nexport interface TweenVertexColorsOptions {\n id: string;\n channel: VertexColorChannel;\n /** Per-anchor RGBA, flat, in 0..1 floats (matches the renderer's\n * `stroke.vertexColors` / `PathDrawCommand.vertexColors` color space).\n * Length must equal `from.length`. */\n to: readonly number[];\n /** Per-anchor RGBA, flat, in 0..1 floats. Length must equal `to.length`\n * and be a positive multiple of 4. */\n from: readonly number[];\n ms: number;\n easing?: EasingSpec;\n interpolation?: ColorSpace;\n interpolate?: ColorInterpolate;\n onDone?: () => void;\n}\n\nfunction validateLengths(from: readonly number[], to: readonly number[]): void {\n if (from.length !== to.length) {\n throw new Error(\n `vertex colors: length mismatch (from=${from.length}, to=${to.length})`,\n );\n }\n if (from.length === 0 || from.length % 4 !== 0) {\n throw new Error(\n `vertex colors: length ${from.length} must be a positive multiple of 4`,\n );\n }\n}\n\nconst cancelKeyFor = (id: string, channel: VertexColorChannel): string =>\n `colors:${id}:${channel}`;\n\n/** Under a thousandth of full scale from `to`, and slower than that a second, a color spring is done. */\nconst COLOR_REST = 0.001;\n\n/** What the from-to helpers share: the node's color target, moved by a path through `colorsAt`. */\nfunction tweenColors(\n animator: Animator,\n opts: { id: string; channel: VertexColorChannel; from: readonly number[]; to: readonly number[]; onDone?: () => void },\n ms: number,\n easing: EasingSpec | undefined,\n colorsAt: (t: number) => number[],\n): AnimationHandle {\n const { id, channel } = opts;\n const registry = animator.colorOverrides;\n return animator.tween<number[]>({\n target: registry.target(id, channel, opts.from.length),\n from: opts.from.slice(),\n to: opts.to.slice(),\n ms,\n easing,\n cancelKey: cancelKeyFor(id, channel),\n interrupt: false,\n interpolate: (_from, _to, t) => colorsAt(t),\n onDone: () => {\n registry.release(id, channel);\n opts.onDone?.();\n },\n });\n}\n\n/**\n * Animate one node's per-anchor colors from `from` to `to` over `ms`.\n *\n * It moves the node's color target (`animator.colorOverrides.target`) rather\n * than writing the scene, so nothing is recorded in history and the node's own\n * data is untouched. Another tween or stagger on the same node and channel adds\n * to this one; a spring interrupts it. What it painted is dropped when the last\n * animation on the node and channel finishes, and held where it was if canceled\n * until `animator.colorOverrides.clear`.\n */\nexport function tweenVertexColors(\n animator: Animator,\n opts: TweenVertexColorsOptions,\n): AnimationHandle {\n validateLengths(opts.from, opts.to);\n const interp = resolveInterpolator(opts);\n return tweenColors(animator, opts, opts.ms, opts.easing, (t) => interp(opts.from, opts.to, t));\n}\n\n/** Options for `springVertexColors`. */\nexport interface SpringVertexColorsOptions {\n id: string;\n channel: VertexColorChannel;\n /** Per-anchor RGBA in 0..1 floats. See `TweenVertexColorsOptions.to`. */\n to: readonly number[];\n /** Per-anchor RGBA in 0..1 floats. See `TweenVertexColorsOptions.from`. */\n from: readonly number[];\n preset?: SpringPresetName;\n stiffness?: number;\n damping?: number;\n mass?: number;\n onDone?: () => void;\n}\n\n/**\n * `tweenVertexColors` driven by a spring instead of a duration. Each number\n * springs on its own, so an underdamped spring overshoots `to` and the path is\n * a straight line in RGB.\n *\n * It interrupts whatever is animating the node and channel, and starts at the\n * velocity of the one it interrupts, so retargeting mid-flight does not stall.\n */\nexport function springVertexColors(\n animator: Animator,\n opts: SpringVertexColorsOptions,\n): AnimationHandle {\n validateLengths(opts.from, opts.to);\n const { id, channel } = opts;\n const registry = animator.colorOverrides;\n return animator.spring<number[]>({\n target: registry.target(id, channel, opts.from.length),\n from: opts.from.slice(),\n to: opts.to.slice(),\n preset: opts.preset,\n stiffness: opts.stiffness,\n damping: opts.damping,\n mass: opts.mass,\n restThreshold: COLOR_REST,\n cancelKey: cancelKeyFor(id, channel),\n onDone: () => {\n registry.release(id, channel);\n opts.onDone?.();\n },\n });\n}\n\n/** Options for `staggerVertexColors`. `origin` picks which anchor the wave\n * starts from and `perAnchorDelay` how far behind each successive anchor\n * runs. */\nexport interface StaggerVertexColorsOptions {\n id: string;\n channel: VertexColorChannel;\n /** Per-anchor RGBA in 0..1 floats. See `TweenVertexColorsOptions.to`. */\n to: readonly number[];\n /** Per-anchor RGBA in 0..1 floats. See `TweenVertexColorsOptions.from`. */\n from: readonly number[];\n anchorMs: number;\n perAnchorDelay: number;\n origin?: 'first' | 'last' | number;\n easing?: EasingSpec;\n interpolation?: ColorSpace;\n interpolate?: ColorInterpolate;\n onDone?: () => void;\n}\n\n/** Run the same color change across a node's anchors as a wave, each anchor\n * starting later than the one before it. It moves the same target as\n * `tweenVertexColors`, and adds to other animations the same way. */\nexport function staggerVertexColors(\n animator: Animator,\n opts: StaggerVertexColorsOptions,\n): AnimationHandle {\n validateLengths(opts.from, opts.to);\n const interp = resolveInterpolator(opts);\n const { from, to, anchorMs, perAnchorDelay } = opts;\n const n = from.length / 4;\n const easing = resolveEasing(opts.easing);\n\n const originIndex =\n opts.origin === 'last' ? n - 1 :\n typeof opts.origin === 'number' ? Math.max(0, Math.min(n - 1, opts.origin)) :\n 0;\n\n const maxDistance = Math.max(originIndex, n - 1 - originIndex);\n const totalMs = maxDistance * perAnchorDelay + anchorMs;\n\n const colorsAt = (elapsedMs: number): number[] => {\n const out = new Array<number>(from.length);\n for (let i = 0; i < n; i++) {\n const distance = Math.abs(i - originIndex);\n const startMs = distance * perAnchorDelay;\n const localT = Math.max(0, Math.min(1, (elapsedMs - startMs) / anchorMs));\n const eased = easing(localT);\n const k = i * 4;\n const fSlice = [from[k], from[k + 1], from[k + 2], from[k + 3]];\n const tSlice = [to[k], to[k + 1], to[k + 2], to[k + 3]];\n const blended = interp(fSlice, tSlice, eased);\n out[k] = blended[0];\n out[k + 1] = blended[1];\n out[k + 2] = blended[2];\n out[k + 3] = blended[3];\n }\n return out;\n };\n\n return tweenColors(animator, opts, totalMs, linear, (t) => colorsAt(t * totalMs));\n}\n","import { resolveEasing } from '@weasel-js/geom';\nimport type { ColorSpace } from '@weasel-js/paint';\nimport type { Animator, EasingSpec } from './types';\nimport type { VertexColorChannel } from './colorRegistry';\nimport { resolveInterpolator, type ColorInterpolate } from './colorInterpolate';\n\n/** Options for `cycleVertexColors`. */\nexport interface CycleVertexColorsOptions {\n id: string;\n channel: VertexColorChannel;\n msPerCycle: number;\n direction?: 1 | -1;\n easing?: EasingSpec;\n interpolation?: ColorSpace;\n /** Custom interpolator. Receives two RGBA arrays in 0..1 floats and a\n * progress `t` in 0..1; returns the blended array in 0..1 floats. */\n interpolate?: ColorInterpolate;\n}\n\n/** Removes an installed color cycle. Unlike the other color helpers this is\n * not an `AnimationHandle`, because a cycle has no progress to pause or\n * scale — it only ends. */\nexport interface CycleHandle {\n cancel(): void;\n}\n\n/** Register a function override that phase-rotates the base color array\n * along the path index. Returns a handle whose `cancel()` removes the\n * override.\n *\n * The override computes its value purely from `performance.now()`, so\n * there's no per-frame progress to register with the animator's tick\n * loop. To keep the loop alive (so `<SceneCanvas animator>`'s onTick\n * subscription continues firing redraws while the cycle is installed),\n * cycleVertexColors holds an `animator.keepAlive()` entry for the\n * lifetime of the cycle; `cancel()` releases it. */\nexport function cycleVertexColors(\n animator: Animator,\n opts: CycleVertexColorsOptions,\n): CycleHandle {\n const interp = resolveInterpolator(opts);\n const { id, channel } = opts;\n const direction = opts.direction ?? 1;\n const easing = resolveEasing(opts.easing);\n\n const override = (base: readonly number[], tMs: number): number[] => {\n const n = base.length / 4;\n if (n === 0) return base.slice();\n const raw = (tMs / opts.msPerCycle) * n * direction;\n const cycles = raw / n;\n const cycleFrac = cycles - Math.floor(cycles);\n const easedFrac = easing(cycleFrac);\n const easedRaw = (Math.floor(cycles) + easedFrac) * n;\n const phase = ((easedRaw % n) + n) % n;\n const phaseInt = Math.floor(phase);\n const phaseFrac = phase - phaseInt;\n\n const out = new Array<number>(base.length);\n for (let i = 0; i < n; i++) {\n const aIdx = ((i + phaseInt) % n) * 4;\n const bIdx = ((i + phaseInt + 1) % n) * 4;\n const a = [base[aIdx], base[aIdx + 1], base[aIdx + 2], base[aIdx + 3]];\n const b = [base[bIdx], base[bIdx + 1], base[bIdx + 2], base[bIdx + 3]];\n const blended = interp(a, b, phaseFrac);\n const k = i * 4;\n out[k] = blended[0];\n out[k + 1] = blended[1];\n out[k + 2] = blended[2];\n out[k + 3] = blended[3];\n }\n return out;\n };\n\n animator.colorOverrides.set(id, channel, override);\n // Cycle's \"value\" is a function of wall-clock time, not a tween-style\n // progress. We don't register a per-frame ticking animation, so without\n // an explicit keep-alive entry the animator's RAF loop would idle and\n // SceneCanvas's onTick redraw subscription would never fire. Keep the\n // loop running until cancel().\n const releaseKeepAlive = animator.keepAlive();\n\n return {\n cancel(): void {\n animator.colorOverrides.clear(id, channel);\n releaseKeepAlive();\n },\n };\n}\n","import { hslToSrgb } from '@weasel-js/paint';\n\n// Per-anchor RGBA arrays in the 0..1 range the renderer expects: bytes (0..255) clamp every\n// channel to 1.0 on the GPU and render white.\n\n/** Build an n-anchor rainbow RGBA array sweeping the hue wheel. The\n * output is suitable to pass directly into `stroke.vertexColors`,\n * `tweenVertexColors({ from: rainbowVertexColors(n) })`, or any\n * other API that wants per-anchor color floats. */\nexport function rainbowVertexColors(\n n: number,\n opts: { saturation?: number; lightness?: number; alpha?: number } = {},\n): number[] {\n const saturation = opts.saturation ?? 0.8;\n const lightness = opts.lightness ?? 0.6;\n const alpha = opts.alpha ?? 1;\n const out: number[] = [];\n for (let i = 0; i < n; i++) {\n const h = (i * 360) / Math.max(1, n);\n const [r, g, b] = hslToSrgb(h, saturation, lightness);\n out.push(r, g, b, alpha);\n }\n return out;\n}\n\n/** Build an n-anchor solid RGBA array. Shorthand for\n * `[r, g, b, a, r, g, b, a, …]` — the array a `tweenVertexColors`\n * `to`-target typically needs. */\nexport function solidVertexColors(\n n: number,\n r: number,\n g: number,\n b: number,\n a = 1,\n): number[] {\n const out: number[] = [];\n for (let i = 0; i < n; i++) out.push(r, g, b, a);\n return out;\n}\n","import {\n EASINGS, reviveTypedArrays, tagTypedArrays, type BezierEasing, type EasingName, type EasingSpec,\n} from '@weasel-js/geom';\nimport { axisIndexes } from '../axisNames';\nimport type { Target } from '../target';\nimport type { Interpolate } from '../types';\nimport type { EventTrack, NestedTimeline, SampledTrack, TimelineEvent, TimelineTrack, Track } from './types';\n\n/** A value a clip can hold: what `JSON.stringify` writes and `JSON.parse` reads back. The\n * object arm is any object, so a pose typed by an interface is one; `toClip` is what refuses\n * a member JSON cannot round-trip. An object's `undefined` members are left out, as JSON\n * leaves them. */\nexport type ClipValue = number | string | boolean | null | ClipValue[] | object;\n\n/** A keyframe as data. Its easing is a built-in's name or bezier control points. */\nexport interface ClipKey {\n t: number;\n /** A typed array in the live key's value, as a `Path` has, is held as a `TaggedTypedArray`\n * from `@weasel-js/geom`: `{ __ta: 'f32', data: [...] }`. `bindClip` makes it the array again. */\n value: ClipValue;\n easing?: EasingName | BezierEasing;\n}\n\n/** A `SampledTrack` as data: what it moves and how it interpolates are names. */\nexport interface ClipSampledTrack {\n kind: 'sampled';\n label?: string;\n /** Resolved by `ClipBinder.target`. A track with none is sampled and moves nothing. */\n target?: string;\n keys: ClipKey[];\n /** Resolved from `ClipBinder.interpolate`. Without one the track is sampled in its\n * target's axes, or field by field. */\n interpolate?: string;\n /** The track's share of its target: a number, or a name for `ClipBinder.weight` to resolve\n * into a function read each frame, as a crossfade's is. */\n weight?: number | string;\n /** The part of the target the track holds: the target's names for its axes, a rig's joints\n * among them, or positions in its axes where it has no names. */\n axes?: number[] | string[];\n}\n\n/** An `EventTrack` as data: each event is a name and what to carry with it. */\nexport interface ClipEventTrack {\n kind: 'event';\n label?: string;\n events: { t: number; name: string; data?: ClipValue }[];\n}\n\n/** A `TimelineTrack` as data. */\nexport interface ClipTimelineTrack {\n kind: 'timeline';\n label?: string;\n at: number;\n timeline: ClipTimeline;\n}\n\n/** Any track a clip can hold. */\nexport type ClipTrack = ClipSampledTrack | ClipEventTrack | ClipTimelineTrack;\n\n/** A `NestedTimeline` as data. */\nexport interface ClipTimeline {\n tracks: ClipTrack[];\n duration?: number;\n}\n\n/** A timeline as data: what `JSON.stringify` can write, `bindClip` can play, and `toClip`\n * can read back off a live timeline. */\nexport interface Clip extends ClipTimeline {\n version: 1;\n}\n\n/** What turns the names in a clip into the live things a timeline plays. */\nexport interface ClipBinder {\n /** The target a sampled track names. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n target?(name: string): Target<any> | undefined;\n /** Interpolations by name. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n interpolate?: Readonly<Record<string, Interpolate<any>>>;\n /** The function a track's named weight stands for. */\n weight?(name: string): (() => number) | undefined;\n /** What an event does: its `fire`, its `book`, or both. */\n event?(name: string, data: ClipValue | undefined): Pick<TimelineEvent, 'fire' | 'book'> | undefined;\n}\n\nconst defined = <T extends object>(o: T): T => {\n for (const k in o) if (o[k] === undefined) delete o[k];\n return o;\n};\n\nfunction bindTrack(track: ClipTrack, binder: ClipBinder): Track {\n if (track.kind === 'timeline') {\n return defined<TimelineTrack>({ kind: 'timeline', label: track.label, at: track.at, timeline: bindTimeline(track.timeline, binder) });\n }\n if (track.kind === 'event') {\n return defined<EventTrack>({\n kind: 'event',\n label: track.label,\n events: track.events.map((e) => {\n const does = binder.event?.(e.name, e.data);\n if (!does) throw new Error(`bindClip: the binder has no event named \"${e.name}\".`);\n return defined<TimelineEvent>({ t: e.t, name: e.name, data: e.data, fire: does.fire, book: does.book });\n }),\n });\n }\n const target = track.target === undefined ? undefined : binder.target?.(track.target);\n if (track.target !== undefined && !target) throw new Error(`bindClip: the binder has no target named \"${track.target}\".`);\n const interpolate = track.interpolate === undefined ? undefined : binder.interpolate?.[track.interpolate];\n if (track.interpolate !== undefined && !interpolate) {\n throw new Error(`bindClip: the binder has no interpolation named \"${track.interpolate}\".`);\n }\n return defined<SampledTrack<ClipValue>>({\n kind: 'sampled',\n label: track.label,\n keys: track.keys.map((k) => ({ ...k, value: reviveTypedArrays(k.value) as ClipValue })),\n target,\n targetName: track.target,\n interpolate,\n interpolateName: track.interpolate,\n ...bindWeight(track, binder),\n axes: bindAxes(track, target),\n });\n}\n\nfunction bindWeight(track: ClipSampledTrack, binder: ClipBinder): Pick<SampledTrack<ClipValue>, 'weight' | 'weightName'> {\n const { weight } = track;\n if (typeof weight !== 'string') return { weight };\n const read = binder.weight?.(weight);\n if (!read) throw new Error(`bindClip: the binder has no weight named \"${weight}\".`);\n return { weight: read, weightName: weight };\n}\n\n/** A clip track's axes for the live track, refused here where its target has no such axes\n * rather than when the playhead first reaches the track. */\nfunction bindAxes(track: ClipSampledTrack, target: Target<unknown> | undefined): SampledTrack<ClipValue>['axes'] {\n const { axes } = track;\n if (!axes) return undefined;\n const where = `bindClip: track \"${track.label ?? ''}\"`;\n if (!target) throw new Error(`${where} names axes and no target.`);\n axisIndexes(target.axes, axes, `${where} on the target \"${track.target}\"`);\n return [...axes] as SampledTrack<ClipValue>['axes'];\n}\n\nfunction bindTimeline(timeline: ClipTimeline, binder: ClipBinder): NestedTimeline {\n return defined<NestedTimeline>({ tracks: timeline.tracks.map((t) => bindTrack(t, binder)), duration: timeline.duration });\n}\n\n/**\n * The live timeline a clip describes, for `animator.timeline`: each sampled track given the\n * target and interpolation it names, each event what the binder says it does. The tracks\n * keep those names, so `toClip` can write them back after an editor has changed them.\n * Throws on a name the binder does not resolve.\n */\nexport function bindClip(clip: Clip, binder: ClipBinder): NestedTimeline {\n if (clip.version !== 1) throw new Error(`bindClip: this clip is version ${String(clip.version)}, and version 1 is the one understood.`);\n return bindTimeline(clip, binder);\n}\n\nconst EASING_NAMES = new Map<unknown, EasingName>(\n (Object.keys(EASINGS) as EasingName[]).map((name) => [EASINGS[name], name]),\n);\n\nfunction isClipValue(v: unknown): v is ClipValue {\n if (v === null || typeof v === 'string' || typeof v === 'boolean') return true;\n if (typeof v === 'number') return Number.isFinite(v);\n if (Array.isArray(v)) return v.every(isClipValue);\n if (typeof v !== 'object' || Object.prototype.toString.call(v) !== '[object Object]') return false;\n return Object.values(v as object).every((member) => member === undefined || isClipValue(member));\n}\n\nfunction easingOf(spec: EasingSpec | undefined, where: string): EasingName | BezierEasing | undefined {\n if (spec === undefined || typeof spec === 'string') return spec;\n if (typeof spec !== 'function') return { bezier: [...spec.bezier] as BezierEasing['bezier'] };\n const name = EASING_NAMES.get(spec);\n if (!name) throw new Error(`toClip: ${where} eases a key by a function that is not a built-in; name it or use bezier points.`);\n return name;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction sampledToClip(track: SampledTrack<any>, where: string): ClipSampledTrack {\n if (track.onTick) throw new Error(`toClip: ${where} has an onTick, which a clip cannot hold; move the value with a target.`);\n if (track.target && track.targetName === undefined) throw new Error(`toClip: ${where} has a target and no targetName.`);\n if (track.interpolator) throw new Error(`toClip: ${where} has an interpolator, which a clip cannot hold.`);\n if (track.interpolate && track.interpolateName === undefined) throw new Error(`toClip: ${where} has an interpolate and no interpolateName.`);\n if (typeof track.weight === 'function' && track.weightName === undefined) {\n throw new Error(`toClip: ${where} has a function for its weight and no weightName.`);\n }\n return defined<ClipSampledTrack>({\n kind: 'sampled',\n label: track.label,\n target: track.targetName,\n keys: track.keys.map((k) => {\n const value = tagTypedArrays(k.value);\n if (!isClipValue(value)) throw new Error(`toClip: ${where} holds a value JSON cannot round-trip, at t = ${k.t}.`);\n return defined<ClipKey>({ t: k.t, value, easing: easingOf(k.easing, where) });\n }),\n interpolate: track.interpolateName,\n weight: typeof track.weight === 'function' ? track.weightName : track.weight,\n axes: track.axes && ([...track.axes] as ClipSampledTrack['axes']),\n });\n}\n\nfunction trackToClip(track: Track, index: number): ClipTrack {\n const where = `track \"${track.label ?? index}\"`;\n if (track.kind === 'timeline') {\n return defined<ClipTimelineTrack>({ kind: 'timeline', label: track.label, at: track.at, timeline: timelineToClip(track.timeline) });\n }\n if (track.kind === 'sampled') return sampledToClip(track, where);\n return defined<ClipEventTrack>({\n kind: 'event',\n label: track.label,\n events: track.events.map((e) => {\n if (e.name === undefined) throw new Error(`toClip: ${where} has an event with no name, at t = ${e.t}.`);\n if (e.data !== undefined && !isClipValue(e.data)) throw new Error(`toClip: ${where} carries data JSON cannot round-trip, at t = ${e.t}.`);\n return defined({ t: e.t, name: e.name, data: e.data as ClipValue | undefined });\n }),\n });\n}\n\nfunction timelineToClip(timeline: NestedTimeline): ClipTimeline {\n return defined<ClipTimeline>({ tracks: timeline.tracks.map(trackToClip), duration: timeline.duration });\n}\n\n/**\n * A live timeline as a clip: `{ tracks, duration }` as `animator.timeline` takes them, or\n * `{ tracks: handle.tracks() }` off a running one. Each track is written by the names it\n * carries (`targetName`, `interpolateName`, an event's `name`), which `bindClip` sets and a\n * track written by hand can set too. A typed array in a key's value is written tagged.\n * Throws, naming the track, on anything a clip cannot hold: a function with no name, an\n * `onTick`, or a value JSON would not read back.\n */\nexport function toClip(timeline: NestedTimeline): Clip {\n return { version: 1, ...timelineToClip(timeline) };\n}\n","import type { JointTransform, Pose, Skeleton } from './types';\n\n/**\n * `pose` reflected across the rig's y axis, as deltas against the same\n * skeleton — so the mirrored pose still blends, samples, and resolves like any\n * other, and a rig faces the other way without a negative scale anywhere.\n *\n * Each joint's `x` and `rotation` are negated as bind plus delta, so the delta\n * for a joint the pose leaves at its bind is nonzero whenever the bind is.\n * Applying it twice gives the original pose back.\n */\nexport function mirrorPose(skeleton: Skeleton, pose: Pose): Pose {\n const out: Pose = {};\n const binds = new Map<string, JointTransform>();\n for (const joint of skeleton.joints) binds.set(joint.name, joint.bind);\n const names = new Set([...binds.keys(), ...Object.keys(pose)]);\n for (const name of names) {\n const bind = binds.get(name);\n const d = pose[name];\n out[name] = {\n ...d,\n x: -2 * (bind?.x ?? 0) - (d?.x ?? 0),\n rotation: -2 * (bind?.rotation ?? 0) - (d?.rotation ?? 0),\n };\n }\n return out;\n}\n","import { mat3, type GlMat3 } from '@weasel-js/geom';\nimport type { JointTransform, Pose, Skeleton } from './types';\n\n/** bind + delta, field by field. Scale is multiplicative, the rest additive. */\nexport function compose(bind: JointTransform, delta: Partial<JointTransform> | undefined): JointTransform {\n if (!delta) return bind;\n return {\n x: bind.x + (delta.x ?? 0),\n y: bind.y + (delta.y ?? 0),\n rotation: bind.rotation + (delta.rotation ?? 0),\n scaleX: bind.scaleX * (delta.scaleX ?? 1),\n scaleY: bind.scaleY * (delta.scaleY ?? 1),\n };\n}\n\n/** TRS as a GlMat3: translate * rotate * scale, applied to a column vector. */\nexport function toMat3(t: JointTransform): GlMat3 {\n const c = Math.cos(t.rotation);\n const s = Math.sin(t.rotation);\n const m = new Float32Array(9) as GlMat3;\n m[0] = c * t.scaleX; m[1] = s * t.scaleX; m[2] = 0;\n m[3] = -s * t.scaleY; m[4] = c * t.scaleY; m[5] = 0;\n m[6] = t.x; m[7] = t.y; m[8] = 1;\n return m;\n}\n\n/**\n * Resolve every joint's world transform by walking the skeleton once and\n * composing each joint onto its already-resolved parent.\n *\n * `skeleton.joints` must be in topological order — a joint whose parent has not\n * been resolved yet throws rather than silently resolving against identity,\n * because that failure is otherwise invisible until a limb renders in the wrong\n * place.\n */\nexport function resolveSkeleton(skeleton: Skeleton, pose: Pose): Map<string, GlMat3> {\n const out = new Map<string, GlMat3>();\n for (const joint of skeleton.joints) {\n const local = toMat3(compose(joint.bind, pose[joint.name]));\n if (joint.parent == null) {\n out.set(joint.name, local);\n continue;\n }\n const parent = out.get(joint.parent);\n if (!parent) {\n throw new Error(\n `resolveSkeleton: joint \"${joint.name}\" names parent \"${joint.parent}\", which has not ` +\n 'been resolved. Skeleton.joints must be in topological order.',\n );\n }\n out.set(joint.name, mat3.multiply(parent, local));\n }\n return out;\n}\n","/** A joint's local transform. Deliberately NOT the scene's generic `TPose`:\n * `TPose` is consumer-defined and may be a bare AABB with no rotation term,\n * which a joint chain cannot compose through. */\nexport interface JointTransform {\n x: number;\n y: number;\n /** Radians. */\n rotation: number;\n scaleX: number;\n scaleY: number;\n}\n\n/** One joint of a `Skeleton`. */\nexport interface Joint {\n name: string;\n /** Parent joint name, or null for a root. */\n parent: string | null;\n /** Local transform at rest. */\n bind: JointTransform;\n}\n\n/** Joints in topological order: every joint appears after its parent. */\nexport interface Skeleton {\n joints: Joint[];\n}\n\n/** Local deltas from the bind pose, keyed by joint name. Absent joints and\n * absent fields mean \"no change from bind\". */\nexport type Pose = Record<string, Partial<JointTransform>>;\n\n/** The transform that changes nothing: origin, no rotation, unit scale. */\nexport const IDENTITY_JOINT: JointTransform = {\n x: 0, y: 0, rotation: 0, scaleX: 1, scaleY: 1,\n};\n","import { axisIndexes } from '../axisNames';\nimport type { TargetAxes } from '../target';\nimport { IDENTITY_JOINT, type JointTransform, type Pose, type Skeleton } from './types';\n\nconst FIELDS = ['x', 'y', 'rotation', 'scaleX', 'scaleY'] as const satisfies readonly (keyof JointTransform)[];\nconst ROTATION = FIELDS.indexOf('rotation');\n\n/** A name for each axis of `skeletonAxes(skeleton)`: `<joint>.<field>`. */\nfunction axisNames(skeleton: Skeleton): string[] {\n return skeleton.joints.flatMap((joint) => FIELDS.map((field) => `${joint.name}.${field}`));\n}\n\n/**\n * The axes of `skeletonAxes(skeleton)` that belong to `joints`, as indexes, for a caller with\n * a skeleton and no target. A hold or a track on a rig's target takes the joints' names\n * themselves: `animator.hold({ target: rig.target, value: pose, axes: arm })`.\n */\nexport function jointAxes(skeleton: Skeleton, joints: readonly string[]): number[] {\n const names = axisNames(skeleton);\n return axisIndexes({ count: names.length, names }, joints, 'jointAxes: `joints`');\n}\n\n/**\n * How a {@link Pose} of `skeleton` maps to the numbers an animation moves: five per joint in\n * skeleton order (`x`, `y`, `rotation`, `scaleX`, `scaleY`), every rotation an angle, so a pose\n * blends the short way round. Each axis is named `<joint>.<field>`, so `axes: ['knee']` on a hold\n * reaches a joint's five and `['knee.rotation']` one of them. A joint or field the pose leaves out reads as its identity, and a\n * pose read back names every joint in full. Pass it as `axes` to `createTarget` for a pose target\n * of your own; a bound rig's is `Rig.target`.\n */\nexport function skeletonAxes(skeleton: Skeleton): TargetAxes<Pose> {\n const names = skeleton.joints.map((j) => j.name);\n const n = FIELDS.length;\n return {\n count: names.length * n,\n angles: names.map((_, j) => j * n + ROTATION),\n names: axisNames(skeleton),\n to(pose) {\n const out = new Array<number>(names.length * n);\n for (let j = 0; j < names.length; j++) {\n const joint = pose[names[j]!];\n for (let f = 0; f < n; f++) out[j * n + f] = joint?.[FIELDS[f]!] ?? IDENTITY_JOINT[FIELDS[f]!];\n }\n return out;\n },\n add(pose, delta) {\n const out: Pose = {};\n for (let j = 0; j < names.length; j++) {\n const joint = pose[names[j]!];\n const at = j * n;\n out[names[j]!] = {\n x: (joint?.x ?? IDENTITY_JOINT.x) + delta[at]!,\n y: (joint?.y ?? IDENTITY_JOINT.y) + delta[at + 1]!,\n rotation: (joint?.rotation ?? IDENTITY_JOINT.rotation) + delta[at + 2]!,\n scaleX: (joint?.scaleX ?? IDENTITY_JOINT.scaleX) + delta[at + 3]!,\n scaleY: (joint?.scaleY ?? IDENTITY_JOINT.scaleY) + delta[at + 4]!,\n };\n }\n return out;\n },\n write(pose, out, at) {\n for (let j = 0; j < names.length; j++) {\n const joint = pose[names[j]!];\n for (let f = 0; f < n; f++) out[at + j * n + f] = joint?.[FIELDS[f]!] ?? IDENTITY_JOINT[FIELDS[f]!];\n }\n },\n from(axes) {\n const pose: Pose = {};\n for (let j = 0; j < names.length; j++) {\n const at = j * n;\n pose[names[j]!] = { x: axes[at]!, y: axes[at + 1]!, rotation: axes[at + 2]!, scaleX: axes[at + 3]!, scaleY: axes[at + 4]! };\n }\n return pose;\n },\n };\n}\n","import { mat3, type GlMat3 } from '@weasel-js/geom';\nimport { compose, resolveSkeleton, toMat3 } from './resolveSkeleton';\nimport type { Joint, Pose, Skeleton } from './types';\n\nconst TAU = Math.PI * 2;\n\n/** A point in the skeleton's space — the space `resolveSkeleton` resolves into. */\nexport interface IkPoint {\n x: number;\n y: number;\n}\n\n/** Bounds on a joint's rotation delta from its bind, in radians, with\n * `-PI <= min <= max <= PI`. */\nexport interface IkLimit {\n min: number;\n max: number;\n}\n\n/** Options for {@link solveIk}. */\nexport interface SolveIkOptions {\n /** The joints the solver may rotate, root first, each the parent of the next. */\n joints: readonly string[];\n /** The end effector, in the last joint's local frame — the forearm's length\n * along its +x for an arm, or a hand joint's bind offset. */\n tip: IkPoint;\n /** Where the tip should go, in skeleton space. A rig posed with a `root`\n * wants the target carried back through that root's inverse first. */\n target: IkPoint;\n /** Per-joint limits, keyed by joint name. A joint without one turns freely. */\n limits?: Readonly<Record<string, IkLimit>>;\n /** Two-joint chains only: the middle joint bends toward this point, in\n * skeleton space. Without it the chain keeps the bend the input pose has. */\n pole?: IkPoint;\n /** Most CCD sweeps to run. Default 32. */\n iterations?: number;\n /** Tip-to-target distance that counts as reached, in skeleton units.\n * Default 0.01. */\n tolerance?: number;\n}\n\n/** What {@link solveIk} returns. */\nexport interface IkResult {\n /** The input pose with each chain joint's rotation replaced. */\n pose: Pose;\n /** Tip-to-target distance the solve ended at. */\n distance: number;\n /** Whether `distance` is within the tolerance. False for a target out of\n * reach, which leaves the chain pointing straight at it. */\n reached: boolean;\n /** CCD sweeps run; 0 when the two-joint solution or the straight-line\n * answer for an unreachable target settled it. */\n iterations: number;\n}\n\nfunction wrap(a: number): number {\n return a - TAU * Math.round(a / TAU);\n}\n\n/** `v` held to `limit`, where out of range means the nearer bound around the circle. */\nfunction clampAngle(v: number, limit: IkLimit | undefined): number {\n if (!limit) return v;\n for (const c of [v, v - TAU, v + TAU]) if (c >= limit.min && c <= limit.max) return c;\n return Math.abs(wrap(v - limit.min)) <= Math.abs(wrap(v - limit.max)) ? limit.min : limit.max;\n}\n\nconst cross = (ax: number, ay: number, bx: number, by: number) => ax * by - ay * bx;\n\n/**\n * Rotate a joint chain so its tip reaches `target`, returning the result as an\n * ordinary {@link Pose}. Weighting the IK against an animated pose is\n * `animator.hold({ target: rig.target, value: solved, weight: w })` beside the\n * clip at weight `1 - w`; with `axes: jointAxes(skeleton, joints)` on both, the\n * rest of the body is left to whatever else holds it.\n *\n * The solver is cyclic coordinate descent, and limits clamp the rotation the\n * pose stores. A two-joint chain is solved analytically first: of the two bends\n * that reach the target it takes the one on `pole`'s side, or the input pose's\n * side, and falls back to the other bend and then to CCD when limits refuse it.\n * A target beyond the chain's reach straightens the chain toward it.\n */\nexport function solveIk(skeleton: Skeleton, pose: Pose, options: SolveIkOptions): IkResult {\n const { tip, target, limits } = options;\n const maxIterations = options.iterations ?? 32;\n const tolerance = options.tolerance ?? 0.01;\n\n const byName = new Map<string, Joint>();\n for (const joint of skeleton.joints) byName.set(joint.name, joint);\n const chain = options.joints.map((name, i) => {\n const joint = byName.get(name);\n if (!joint) throw new Error(`solveIk: the skeleton has no joint \"${name}\".`);\n if (i > 0 && joint.parent !== options.joints[i - 1]) {\n throw new Error(\n `solveIk: chain joint \"${name}\" names parent \"${joint.parent}\", not \"${options.joints[i - 1]}\". ` +\n 'Each chain joint must be the parent of the next.',\n );\n }\n return joint;\n });\n const n = chain.length;\n if (n === 0) return { pose: { ...pose }, distance: Infinity, reached: false, iterations: 0 };\n\n const rootParent = chain[0].parent;\n const base = rootParent == null ? mat3.identity() : resolveSkeleton(skeleton, pose).get(rootParent)!;\n const rot = chain.map((joint) => clampAngle(wrap(pose[joint.name]?.rotation ?? 0), limits?.[joint.name]));\n\n let worlds: GlMat3[] = [];\n const resolve = () => {\n worlds = [];\n let parent = base;\n for (let i = 0; i < n; i += 1) {\n const joint = chain[i];\n parent = mat3.multiply(parent, toMat3(compose(joint.bind, { ...pose[joint.name], rotation: rot[i] })));\n worlds.push(parent);\n }\n };\n const pivot = (i: number) => mat3.apply(worlds[i], 0, 0);\n const tipWorld = () => mat3.apply(worlds[n - 1], tip.x, tip.y);\n /** The point joint `i` swings: the next joint's pivot, or the tip. */\n const next = (i: number) => (i + 1 < n ? pivot(i + 1) : tipWorld());\n\n /** Turn joint `i` so `effector` lies on the ray toward `goal`. True when a\n * limit cut the turn short. */\n const aim = (i: number, effector: [number, number], goal: IkPoint): boolean => {\n const inv = mat3.invert(i === 0 ? base : worlds[i - 1]);\n if (!inv) return false;\n const [ox, oy] = mat3.apply(inv, ...pivot(i));\n const [ex, ey] = mat3.apply(inv, ...effector);\n const [gx, gy] = mat3.apply(inv, goal.x, goal.y);\n if (Math.hypot(ex - ox, ey - oy) < 1e-9 || Math.hypot(gx - ox, gy - oy) < 1e-9) return false;\n const want = wrap(rot[i] + Math.atan2(gy - oy, gx - ox) - Math.atan2(ey - oy, ex - ox));\n rot[i] = clampAngle(want, limits?.[chain[i].name]);\n resolve();\n return Math.abs(wrap(rot[i] - want)) > 1e-9;\n };\n\n const distance = () => {\n const [x, y] = tipWorld();\n return Math.hypot(x - target.x, y - target.y);\n };\n const result = (iterations: number): IkResult => {\n const out: Pose = { ...pose };\n chain.forEach((joint, i) => { out[joint.name] = { ...pose[joint.name], rotation: rot[i] }; });\n const d = distance();\n return { pose: out, distance: d, reached: d <= tolerance, iterations };\n };\n\n resolve();\n const [rx, ry] = pivot(0);\n let reach = 0;\n for (let i = 0; i < n; i += 1) {\n const [ax, ay] = pivot(i);\n const [bx, by] = next(i);\n reach += Math.hypot(bx - ax, by - ay);\n }\n const toTarget = Math.hypot(target.x - rx, target.y - ry);\n\n if (toTarget >= reach) {\n for (let i = 0; i < n; i += 1) aim(i, next(i), target);\n return result(0);\n }\n\n if (n === 2 && toTarget > 1e-9) {\n const start = rot.slice();\n const [mx, my] = pivot(1);\n const [tx, ty] = tipWorld();\n const a = Math.hypot(mx - rx, my - ry);\n const b = Math.hypot(tx - mx, ty - my);\n const dx = target.x - rx;\n const dy = target.y - ry;\n const bendSide = options.pole\n ? cross(dx, dy, options.pole.x - rx, options.pole.y - ry)\n : cross(dx, dy, mx - rx, my - ry);\n const side = bendSide < 0 ? -1 : 1;\n const inner = Math.acos(Math.max(-1, Math.min(1, (a * a + toTarget * toTarget - b * b) / (2 * a * toTarget))));\n const heading = Math.atan2(dy, dx);\n\n const bend = (s: number): boolean => {\n rot.splice(0, 2, ...start);\n resolve();\n const elbow = { x: rx + a * Math.cos(heading + s * inner), y: ry + a * Math.sin(heading + s * inner) };\n const cut = aim(0, pivot(1), elbow);\n return aim(1, tipWorld(), target) || cut;\n };\n if (!bend(side) || !bend(-side)) {\n if (distance() <= tolerance) return result(0);\n } else {\n bend(side);\n }\n }\n\n let iterations = 0;\n while (iterations < maxIterations && distance() > tolerance) {\n for (let i = n - 1; i >= 0; i -= 1) aim(i, tipWorld(), target);\n iterations += 1;\n }\n return result(iterations);\n}\n","import {\n coordsFrom, mat3, PATH_L, PATH_M, PATH_Z, worldCoords, type GlMat3, type Path, type PolygonPath,\n} from '@weasel-js/geom';\nimport { resolveSkeleton } from './resolveSkeleton';\nimport type { Skeleton } from './types';\n\n/**\n * How much each point of a path follows each joint: one array per joint name, indexed by\n * point. Point `i` is the `i`-th coordinate pair of a polygon path's `coords`, so anchors and\n * curve handles are weighted alike; a rect's points are its corners, clockwise from the top\n * left. A joint left out, and an index past an array's end, weigh nothing. Weights need not\n * sum to 1: they are normalized per point as they are applied.\n */\nexport type Skin = Readonly<Record<string, readonly number[]>>;\n\n/**\n * Each joint's motion since the bind pose, in world space: `world * inverse(restWorld)`.\n * `world` is what `resolveSkeleton` or `Rig.world()` answers.\n */\nexport function motionsFromRest(\n skeleton: Skeleton,\n world: ReadonlyMap<string, GlMat3>,\n): Map<string, GlMat3> {\n const rest = resolveSkeleton(skeleton, {});\n const out = new Map<string, GlMat3>();\n for (const [name, r] of rest) {\n const inverse = mat3.invert(r);\n if (!inverse) throw new Error(`motionsFromRest: joint \"${name}\" is singular at the bind pose.`);\n const w = world.get(name);\n if (w) out.set(name, mat3.multiply(w, inverse));\n }\n return out;\n}\n\nconst RECT_COMMANDS = new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L, PATH_Z]);\n\n/** The path whose points a skin indexes: a rect as its four corners. */\nexport function skinnable(path: Path): PolygonPath {\n if (path.kind === 'polygon') return path;\n const { x, y, width, height } = path;\n return {\n kind: 'polygon',\n commands: RECT_COMMANDS,\n coords: new Float32Array([x, y, x + width, y, x + width, y + height, x, y + height]),\n fillRule: 'nonzero',\n };\n}\n\n/**\n * Bend `path` by linear blend skinning: each point goes where its joints' motions since the\n * bind pose would carry it, averaged by weight. `path` is the shape at the bind pose, in the\n * space `motions` are in; it is not modified. A point no joint weighs stays where it is.\n */\nexport function skinPath(path: Path, skin: Skin, motions: ReadonlyMap<string, GlMat3>): PolygonPath {\n const rest = skinnable(path);\n const from = worldCoords(rest);\n const count = from.length >> 1;\n const sum = new Float64Array(from.length);\n const total = new Float64Array(count);\n for (const joint in skin) {\n const m = motions.get(joint);\n if (!m) throw new Error(`skinPath: the skin weighs joint \"${joint}\", which has no motion.`);\n const weights = skin[joint];\n const n = Math.min(count, weights.length);\n for (let i = 0; i < n; i++) {\n const w = weights[i];\n if (!(w > 0)) continue;\n const x = from[2 * i];\n const y = from[2 * i + 1];\n sum[2 * i] += w * (m[0] * x + m[3] * y + m[6]);\n sum[2 * i + 1] += w * (m[1] * x + m[4] * y + m[7]);\n total[i] += w;\n }\n }\n const moved = new Float64Array(from.length);\n for (let i = 0; i < count; i++) {\n const t = total[i];\n moved[2 * i] = t > 0 ? sum[2 * i] / t : from[2 * i];\n moved[2 * i + 1] = t > 0 ? sum[2 * i + 1] / t : from[2 * i + 1];\n }\n return { ...rest, coords: coordsFrom(rest.origin, moved) };\n}\n","import { mat3, worldCoords, type Path } from '@weasel-js/geom';\nimport { resolveSkeleton } from './resolveSkeleton';\nimport { skinnable, type Skin } from './skin';\nimport type { Skeleton } from './types';\n\n/** Options for `autoSkin`. */\nexport interface AutoSkinOptions {\n /** How fast a bone's pull falls off with distance: a weight is `1 / distance ** power`.\n * Higher keeps the bend closer to the joint. Default 4. */\n power?: number;\n /** The most joints a point follows; the nearest are kept. Default 2. */\n max?: number;\n}\n\ninterface Bone {\n joint: string;\n /** Flat `x0, y0, x1, y1` per segment, from the joint to each of its children. */\n segments: number[];\n}\n\nfunction distanceToSegment(px: number, py: number, ax: number, ay: number, bx: number, by: number): number {\n const dx = bx - ax;\n const dy = by - ay;\n const len2 = dx * dx + dy * dy;\n const t = len2 > 0 ? Math.min(1, Math.max(0, ((px - ax) * dx + (py - ay) * dy) / len2)) : 0;\n return Math.hypot(px - (ax + t * dx), py - (ay + t * dy));\n}\n\n/** A joint's bones run to its children. A joint with no child has none, being where its\n * parent's bone ends, unless it has no parent either. */\nfunction bonesOf(skeleton: Skeleton): Bone[] {\n const world = resolveSkeleton(skeleton, {});\n const at = new Map<string, [number, number]>();\n for (const [name, m] of world) at.set(name, mat3.apply(m, 0, 0));\n const bones = new Map<string, Bone>();\n for (const joint of skeleton.joints) {\n if (joint.parent == null) continue;\n let bone = bones.get(joint.parent);\n if (!bone) {\n bone = { joint: joint.parent, segments: [] };\n bones.set(joint.parent, bone);\n }\n bone.segments.push(...at.get(joint.parent)!, ...at.get(joint.name)!);\n }\n for (const joint of skeleton.joints) {\n if (joint.parent != null || bones.has(joint.name)) continue;\n const [x, y] = at.get(joint.name)!;\n bones.set(joint.name, { joint: joint.name, segments: [x, y, x, y] });\n }\n // Skeleton order, so a tie between bones goes to the one nearer the root.\n return skeleton.joints.flatMap((joint) => bones.get(joint.name) ?? []);\n}\n\n/**\n * Weights for `path` from how far each of its points is from each bone of `skeleton` at the\n * bind pose. `path` is in the skeleton's space. A point on a bone follows that bone alone.\n */\nexport function autoSkin(path: Path, skeleton: Skeleton, options: AutoSkinOptions = {}): Skin {\n const power = options.power ?? 4;\n const max = Math.max(1, options.max ?? 2);\n const bones = bonesOf(skeleton);\n const coords = worldCoords(skinnable(path));\n const count = coords.length >> 1;\n const out = new Map<string, number[]>();\n const distance = new Float64Array(bones.length);\n const order = bones.map((_, b) => b);\n\n for (let i = 0; i < count; i++) {\n const px = coords[2 * i];\n const py = coords[2 * i + 1];\n for (let b = 0; b < bones.length; b++) {\n const s = bones[b].segments;\n let d = Infinity;\n for (let k = 0; k < s.length; k += 4) d = Math.min(d, distanceToSegment(px, py, s[k], s[k + 1], s[k + 2], s[k + 3]));\n distance[b] = d;\n }\n order.sort((a, b) => distance[a] - distance[b] || a - b);\n const kept = order.slice(0, max);\n const nearest = distance[kept[0]];\n let total = 0;\n const raw = kept.map((b) => {\n const w = nearest === 0 ? (distance[b] === 0 ? 1 : 0) : (nearest / distance[b]) ** power;\n total += w;\n return w;\n });\n kept.forEach((b, k) => {\n if (raw[k] === 0) return;\n let weights = out.get(bones[b].joint);\n if (!weights) {\n weights = new Array<number>(count).fill(0);\n out.set(bones[b].joint, weights);\n }\n weights[i] = raw[k] / total;\n });\n }\n return Object.fromEntries(out);\n}\n","import { mat3 } from '@weasel-js/geom';\nimport { resolveSkeleton } from './resolveSkeleton';\nimport type { Skin } from './skin';\nimport { IDENTITY_JOINT, type Joint, type Skeleton } from './types';\n\n/** Where each joint rests, in the skeleton's space and in its order. */\nexport function jointPositions(skeleton: Skeleton): Map<string, { x: number; y: number }> {\n const out = new Map<string, { x: number; y: number }>();\n for (const [name, m] of resolveSkeleton(skeleton, {})) {\n const [x, y] = mat3.apply(m, 0, 0);\n out.set(name, { x, y });\n }\n return out;\n}\n\n/** The joint resting nearest `(x, y)` and no further than `reach` from it, or `null`. */\nexport function jointAt(skeleton: Skeleton, x: number, y: number, reach: number): string | null {\n let best: string | null = null;\n let bestD = reach;\n for (const [name, p] of jointPositions(skeleton)) {\n const d = Math.hypot(p.x - x, p.y - y);\n if (d <= bestD) {\n best = name;\n bestD = d;\n }\n }\n return best;\n}\n\n/** `(x, y)` in the frame `parent`'s children are placed in. */\nfunction inParent(skeleton: Skeleton, parent: string | null, x: number, y: number): [number, number] {\n if (parent == null) return [x, y];\n const world = resolveSkeleton(skeleton, {}).get(parent);\n if (!world) throw new Error(`The skeleton has no joint \"${parent}\".`);\n const inverse = mat3.invert(world);\n if (!inverse) throw new Error(`Joint \"${parent}\" is singular at the bind pose.`);\n return mat3.apply(inverse, x, y);\n}\n\n/** `skeleton` with `name` resting at `(x, y)`. The joints under it keep their offsets from it,\n * so they move along. */\nexport function moveJoint(skeleton: Skeleton, name: string, x: number, y: number): Skeleton {\n const joint = skeleton.joints.find((j) => j.name === name);\n if (!joint) throw new Error(`moveJoint: the skeleton has no joint \"${name}\".`);\n const [lx, ly] = inParent(skeleton, joint.parent, x, y);\n return {\n joints: skeleton.joints.map((j) => (j === joint ? { ...j, bind: { ...j.bind, x: lx, y: ly } } : j)),\n };\n}\n\n/** `skeleton` with a new joint resting at `(x, y)` under `parent`, or as a root for `null`.\n * Without a `name` it gets the first of `joint`, `joint2`, … not in use. */\nexport function addJoint(\n skeleton: Skeleton,\n parent: string | null,\n x: number,\n y: number,\n name?: string,\n): { skeleton: Skeleton; name: string } {\n const taken = new Set(skeleton.joints.map((j) => j.name));\n let picked = name;\n if (picked === undefined) {\n picked = 'joint';\n for (let n = 2; taken.has(picked); n++) picked = `joint${n}`;\n } else if (taken.has(picked)) {\n throw new Error(`addJoint: the skeleton already has a joint \"${picked}\".`);\n }\n const [lx, ly] = inParent(skeleton, parent, x, y);\n const joint: Joint = { name: picked, parent, bind: { ...IDENTITY_JOINT, x: lx, y: ly } };\n return { skeleton: { joints: [...skeleton.joints, joint] }, name: picked };\n}\n\n/** `skeleton` without `name` and the joints under it, and the names that went. */\nexport function removeJoint(skeleton: Skeleton, name: string): { skeleton: Skeleton; removed: string[] } {\n const gone = new Set([name]);\n // Topological order: a joint's parent is decided before it is reached.\n for (const j of skeleton.joints) if (j.parent != null && gone.has(j.parent)) gone.add(j.name);\n const removed = skeleton.joints.filter((j) => gone.has(j.name)).map((j) => j.name);\n return { skeleton: { joints: skeleton.joints.filter((j) => !gone.has(j.name)) }, removed };\n}\n\n/** `skin` without the weights of `joints`; the same object when it weighs none of them. */\nexport function dropSkinJoints(skin: Skin, joints: readonly string[]): Skin {\n if (!joints.some((j) => j in skin)) return skin;\n const out: Record<string, readonly number[]> = {};\n for (const j in skin) if (!joints.includes(j)) out[j] = skin[j];\n return out;\n}\n","import type { Skin } from './skin';\n\n/**\n * `skin` with `joint`'s weight set on some points: `weights` maps a point's index to the new\n * weight, clamped to 0..1. On each of those points the other joints are scaled to share what\n * is left, so the point still sums to 1; a point no other joint weighs goes wholly to `joint`,\n * as it would when the skin is applied. Every array comes back `count` long, and a joint left\n * weighing nothing is dropped.\n */\nexport function setWeights(\n skin: Skin,\n count: number,\n joint: string,\n weights: ReadonlyMap<number, number>,\n): Skin {\n const next: Record<string, number[]> = {};\n for (const name in skin) next[name] = Array.from({ length: count }, (_, i) => skin[name][i] ?? 0);\n const own = (next[joint] ??= new Array<number>(count).fill(0));\n for (const [i, raw] of weights) {\n if (i < 0 || i >= count) continue;\n const w = Math.min(1, Math.max(0, raw));\n let others = 0;\n for (const name in next) if (name !== joint) others += next[name][i];\n if (others > 0) {\n for (const name in next) if (name !== joint) next[name][i] *= (1 - w) / others;\n own[i] = w;\n } else {\n own[i] = w > 0 ? 1 : 0;\n }\n }\n for (const name in next) if (!next[name].some((w) => w > 0)) delete next[name];\n return next;\n}\n\n/**\n * What a round brush at `(x, y)` does to one joint's weights: for each point of `coords`\n * within `radius`, a weight falling off linearly from the center. `'add'` raises a point\n * toward 1 and `'remove'` lowers it toward 0; neither moves a point the other way. Answers\n * only the points that change, by index, for {@link setWeights}.\n */\nexport function brushWeights(\n coords: ArrayLike<number>,\n x: number,\n y: number,\n radius: number,\n current: readonly number[] | undefined,\n mode: 'add' | 'remove',\n): Map<number, number> {\n const out = new Map<number, number>();\n for (let i = 0; 2 * i + 1 < coords.length; i++) {\n const d = Math.hypot(coords[2 * i] - x, coords[2 * i + 1] - y);\n if (d >= radius) continue;\n const had = current?.[i] ?? 0;\n const want = mode === 'add' ? Math.max(had, 1 - d / radius) : Math.min(had, d / radius);\n if (want !== had) out.set(i, want);\n }\n return out;\n}\n"]}
package/dist/react.d.ts CHANGED
@@ -1,8 +1,25 @@
1
- import { a8 as UseAnimatorOptions, A as Animator } from './types-QKD4dhHF.js';
1
+ import { A as Animator } from './types-TZO301HJ.js';
2
+ import { ClockHandle } from '@weasel-js/clock';
2
3
  import '@weasel-js/geom';
3
4
 
5
+ /** Options for `useAnimator`. Apart from `clock`, everything here is an injection seam for
6
+ * tests; the defaults are the real clock and rAF. */
7
+ interface UseAnimatorOptions {
8
+ /** Runs the animator on this clock rather than a frame loop of its own: it advances when the
9
+ * clock moves, so the clock's pause, rate, seeking and visibility gating govern it, and a host's
10
+ * `useClockLoop` syncs it. A move back plays the running animations backward to the time; one
11
+ * that ends meanwhile, at its end or back at its start, does not come back. `now` is unused. */
12
+ clock?: ClockHandle;
13
+ /** Optional clock injection for tests. Returns ms since some epoch. */
14
+ now?: () => number;
15
+ /** Optional rAF / cAF injection for tests. Defaults to window.requestAnimationFrame. */
16
+ requestFrame?: (cb: (t: number) => void) => number;
17
+ cancelFrame?: (handle: number) => void;
18
+ }
19
+
4
20
  /** Create the animator for a canvas. One rAF loop drives every animation it
5
- * owns, and everything still running is canceled on unmount. */
21
+ * owns, or the clock in `opts.clock` does, and everything still running is
22
+ * canceled on unmount. */
6
23
  declare function useAnimator(opts?: UseAnimatorOptions): Animator;
7
24
 
8
25
  export { useAnimator };