@pibbl/core 0.0.1 → 0.0.2

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.
Files changed (167) hide show
  1. package/README.md +1 -1
  2. package/dist/features/machines/animation.d.ts +64 -0
  3. package/dist/features/machines/animation.js +55 -0
  4. package/dist/features/machines/animation.js.map +7 -0
  5. package/dist/features/machines/animation.mjs +1 -0
  6. package/dist/features/machines/assign.d.ts +16 -0
  7. package/dist/features/machines/assign.js +15 -0
  8. package/dist/features/machines/assign.js.map +7 -0
  9. package/dist/features/machines/callback.d.ts +9 -0
  10. package/dist/features/machines/callback.js +7 -0
  11. package/dist/features/machines/callback.js.map +7 -0
  12. package/dist/features/machines/hook.d.ts +30 -0
  13. package/dist/features/machines/hook.js +37 -0
  14. package/dist/features/machines/hook.js.map +7 -0
  15. package/dist/features/machines/index.d.ts +6 -0
  16. package/dist/features/machines/index.js +12 -0
  17. package/dist/features/machines/index.js.map +7 -0
  18. package/dist/features/machines/index.mjs +1 -0
  19. package/dist/features/machines/runtime.d.ts +18 -0
  20. package/dist/features/machines/runtime.js +363 -0
  21. package/dist/features/machines/runtime.js.map +7 -0
  22. package/dist/features/machines/types.d.ts +164 -0
  23. package/dist/features/physics/2d-geometry.d.ts +3 -3
  24. package/dist/features/physics/2d-geometry.js.map +1 -1
  25. package/dist/features/physics/2d.d.ts +115 -62
  26. package/dist/features/physics/2d.js +59 -28
  27. package/dist/features/physics/2d.js.map +2 -2
  28. package/dist/features/physics/lib/2d/query-types.d.ts +6 -0
  29. package/dist/features/physics/lib/2d/runtime/controller.d.ts +7 -6
  30. package/dist/features/physics/lib/2d/runtime/controller.js.map +2 -2
  31. package/dist/features/physics/lib/2d/types.d.ts +8 -30
  32. package/dist/features/physics/lib/2d/world/queries.d.ts +7 -6
  33. package/dist/features/physics/lib/2d/world/queries.js.map +2 -2
  34. package/dist/features/sprites/formats/aseprite.d.ts +5 -0
  35. package/dist/features/sprites/formats/texture-packer.d.ts +5 -0
  36. package/dist/features/sprites/index.d.ts +6 -0
  37. package/dist/features/sprites/loader.d.ts +25 -0
  38. package/dist/features/sprites/model.d.ts +75 -0
  39. package/dist/features/sprites/sprite.d.ts +22 -0
  40. package/dist/features/viz/index.d.ts +28 -3
  41. package/dist/features/viz/index.js +40 -4
  42. package/dist/features/viz/index.js.map +2 -2
  43. package/dist/features/viz/lib/axis-labels.d.ts +2 -0
  44. package/dist/features/viz/lib/axis-labels.js +41 -0
  45. package/dist/features/viz/lib/axis-labels.js.map +7 -0
  46. package/dist/features/viz/lib/axis-title.d.ts +23 -0
  47. package/dist/features/viz/lib/axis-title.js +23 -0
  48. package/dist/features/viz/lib/axis-title.js.map +7 -0
  49. package/dist/features/viz/lib/axis.d.ts +1 -1
  50. package/dist/features/viz/lib/axis.js +50 -50
  51. package/dist/features/viz/lib/axis.js.map +2 -2
  52. package/dist/features/viz/lib/bar-scale.d.ts +7 -0
  53. package/dist/features/viz/lib/bar-scale.js +34 -0
  54. package/dist/features/viz/lib/bar-scale.js.map +7 -0
  55. package/dist/features/viz/lib/bar-series.js +5 -4
  56. package/dist/features/viz/lib/bar-series.js.map +2 -2
  57. package/dist/features/viz/lib/chart-lines.d.ts +41 -0
  58. package/dist/features/viz/lib/chart-lines.js +32 -0
  59. package/dist/features/viz/lib/chart-lines.js.map +7 -0
  60. package/dist/features/viz/lib/hover-data.js +2 -2
  61. package/dist/features/viz/lib/hover-data.js.map +2 -2
  62. package/dist/features/viz/lib/hover-types.d.ts +5 -5
  63. package/dist/features/viz/lib/line-series.js +3 -3
  64. package/dist/features/viz/lib/line-series.js.map +2 -2
  65. package/dist/features/viz/lib/linear-scale-component.d.ts +7 -0
  66. package/dist/features/viz/lib/linear-scale-component.js +18 -0
  67. package/dist/features/viz/lib/linear-scale-component.js.map +7 -0
  68. package/dist/features/viz/lib/linear-scale.js +1 -1
  69. package/dist/features/viz/lib/linear-scale.js.map +2 -2
  70. package/dist/features/viz/lib/log-scale-component.d.ts +7 -0
  71. package/dist/features/viz/lib/log-scale-component.js +19 -0
  72. package/dist/features/viz/lib/log-scale-component.js.map +7 -0
  73. package/dist/features/viz/lib/log-scale.d.ts +2 -0
  74. package/dist/features/viz/lib/log-scale.js +53 -0
  75. package/dist/features/viz/lib/log-scale.js.map +7 -0
  76. package/dist/features/viz/lib/nearest.d.ts +9 -9
  77. package/dist/features/viz/lib/nearest.js.map +1 -1
  78. package/dist/features/viz/lib/numeric-ticks.d.ts +38 -0
  79. package/dist/features/viz/lib/numeric-ticks.js +54 -0
  80. package/dist/features/viz/lib/numeric-ticks.js.map +7 -0
  81. package/dist/features/viz/lib/plot-series.js +2 -2
  82. package/dist/features/viz/lib/plot-series.js.map +2 -2
  83. package/dist/features/viz/lib/point-scale-component.d.ts +7 -0
  84. package/dist/features/viz/lib/point-scale-component.js +19 -0
  85. package/dist/features/viz/lib/point-scale-component.js.map +7 -0
  86. package/dist/features/viz/lib/point-scale.d.ts +2 -0
  87. package/dist/features/viz/lib/point-scale.js +45 -0
  88. package/dist/features/viz/lib/point-scale.js.map +7 -0
  89. package/dist/features/viz/lib/point-series.js +2 -2
  90. package/dist/features/viz/lib/point-series.js.map +2 -2
  91. package/dist/features/viz/lib/reference-band.d.ts +16 -0
  92. package/dist/features/viz/lib/reference-band.js +27 -0
  93. package/dist/features/viz/lib/reference-band.js.map +7 -0
  94. package/dist/features/viz/lib/scale-adjust.js +9 -4
  95. package/dist/features/viz/lib/scale-adjust.js.map +2 -2
  96. package/dist/features/viz/lib/scale-context.d.ts +5 -4
  97. package/dist/features/viz/lib/scale-context.js +15 -11
  98. package/dist/features/viz/lib/scale-context.js.map +2 -2
  99. package/dist/features/viz/lib/scale-provider.d.ts +2 -0
  100. package/dist/features/viz/lib/scale-provider.js +13 -0
  101. package/dist/features/viz/lib/scale-provider.js.map +7 -0
  102. package/dist/features/viz/lib/scale-ticks.d.ts +5 -0
  103. package/dist/features/viz/lib/scale-ticks.js +49 -0
  104. package/dist/features/viz/lib/scale-ticks.js.map +7 -0
  105. package/dist/features/viz/lib/scale-view.d.ts +4 -0
  106. package/dist/features/viz/lib/scale-view.js +21 -0
  107. package/dist/features/viz/lib/scale-view.js.map +7 -0
  108. package/dist/features/viz/lib/symlog-scale-component.d.ts +7 -0
  109. package/dist/features/viz/lib/symlog-scale-component.js +19 -0
  110. package/dist/features/viz/lib/symlog-scale-component.js.map +7 -0
  111. package/dist/features/viz/lib/symlog-scale.d.ts +2 -0
  112. package/dist/features/viz/lib/symlog-scale.js +38 -0
  113. package/dist/features/viz/lib/symlog-scale.js.map +7 -0
  114. package/dist/features/viz/lib/types.d.ts +95 -18
  115. package/dist/features/viz/lib/use-bar-scale.d.ts +8 -0
  116. package/dist/features/viz/lib/use-bar-scale.js +9 -0
  117. package/dist/features/viz/lib/use-bar-scale.js.map +7 -0
  118. package/dist/features/viz/lib/use-continuous-scale.d.ts +8 -0
  119. package/dist/features/viz/lib/use-continuous-scale.js +9 -0
  120. package/dist/features/viz/lib/use-continuous-scale.js.map +7 -0
  121. package/dist/features/viz/lib/use-linear-scale.d.ts +8 -0
  122. package/dist/features/viz/lib/use-linear-scale.js +9 -0
  123. package/dist/features/viz/lib/use-linear-scale.js.map +7 -0
  124. package/dist/features/viz/lib/use-log-scale.d.ts +8 -0
  125. package/dist/features/viz/lib/use-log-scale.js +9 -0
  126. package/dist/features/viz/lib/use-log-scale.js.map +7 -0
  127. package/dist/features/viz/lib/use-point-scale.d.ts +8 -0
  128. package/dist/features/viz/lib/use-point-scale.js +9 -0
  129. package/dist/features/viz/lib/use-point-scale.js.map +7 -0
  130. package/dist/features/viz/lib/use-symlog-scale.d.ts +8 -0
  131. package/dist/features/viz/lib/use-symlog-scale.js +9 -0
  132. package/dist/features/viz/lib/use-symlog-scale.js.map +7 -0
  133. package/dist/features/viz/lib/use-utc-scale.d.ts +8 -0
  134. package/dist/features/viz/lib/use-utc-scale.js +9 -0
  135. package/dist/features/viz/lib/use-utc-scale.js.map +7 -0
  136. package/dist/features/viz/lib/utc-labels.d.ts +12 -0
  137. package/dist/features/viz/lib/utc-labels.js +27 -0
  138. package/dist/features/viz/lib/utc-labels.js.map +7 -0
  139. package/dist/features/viz/lib/utc-scale-component.d.ts +7 -0
  140. package/dist/features/viz/lib/utc-scale-component.js +18 -0
  141. package/dist/features/viz/lib/utc-scale-component.js.map +7 -0
  142. package/dist/features/viz/lib/utc-scale.d.ts +21 -0
  143. package/dist/features/viz/lib/utc-scale.js +123 -0
  144. package/dist/features/viz/lib/utc-scale.js.map +7 -0
  145. package/dist/index.d.ts +1 -1
  146. package/dist/index.js.map +1 -1
  147. package/dist/lib/animation/definition.d.ts +5 -3
  148. package/dist/lib/animation/definition.js +29 -4
  149. package/dist/lib/animation/definition.js.map +2 -2
  150. package/dist/lib/animation/playback.d.ts +8 -0
  151. package/dist/lib/animation/playback.js +33 -11
  152. package/dist/lib/animation/playback.js.map +2 -2
  153. package/dist/lib/animation/spring.d.ts +3 -1
  154. package/dist/lib/animation/spring.js.map +2 -2
  155. package/dist/lib/animation/types.d.ts +29 -73
  156. package/dist/lib/hooks/use-animated-value.d.ts +11 -21
  157. package/dist/lib/hooks/use-animated-value.js +23 -70
  158. package/dist/lib/hooks/use-animated-value.js.map +3 -3
  159. package/dist/lib/hooks/use-playback.js +1 -0
  160. package/dist/lib/hooks/use-playback.js.map +2 -2
  161. package/package.json +18 -4
  162. package/dist/features/viz/lib/scale.d.ts +0 -11
  163. package/dist/features/viz/lib/scale.js +0 -80
  164. package/dist/features/viz/lib/scale.js.map +0 -7
  165. package/dist/features/viz/lib/use-scale.d.ts +0 -20
  166. package/dist/features/viz/lib/use-scale.js +0 -10
  167. package/dist/features/viz/lib/use-scale.js.map +0 -7
@@ -8,11 +8,18 @@ export interface AnimationPlaybackSnapshot {
8
8
  readonly queuedMilestones: number;
9
9
  readonly outputStageAttempts: number;
10
10
  }
11
+ /** Internal root lifetime used to revoke a deferred disposal publication. */
12
+ interface DeferredStatusCommandOwner {
13
+ add(teardown: () => void): void;
14
+ remove(teardown: () => void): void;
15
+ }
11
16
  export interface AnimationPlaybackController {
12
17
  readonly handle: PibblPlayback;
13
18
  adopt(program: PibblAnimationProgram, options?: PibblPlaybackOptions): void;
14
19
  committedSpringSnapshot(): SpringSample | undefined;
15
20
  retarget(program: PibblAnimationProgram, options?: PibblPlaybackOptions): void;
21
+ /** @internal Associates render-phase disposal work with the owning root. */
22
+ setDeferredStatusCommandOwner(owner: DeferredStatusCommandOwner): void;
16
23
  dispose(): void;
17
24
  }
18
25
  export interface AnimationPlaybackCandidate {
@@ -28,3 +35,4 @@ export declare function normalizeAnimationPlaybackCandidate(program: PibblAnimat
28
35
  * usePlayback in the following implementation task.
29
36
  */
30
37
  export declare function createAnimationPlaybackController(initialProgram: PibblAnimationProgram, initialOptions?: PibblPlaybackOptions): AnimationPlaybackController;
38
+ export {};
@@ -123,6 +123,7 @@ function createAnimationPlaybackController(initialProgram, initialOptions = {})
123
123
  let storedPlaybackRate = 1;
124
124
  let delivery;
125
125
  let pendingRetarget;
126
+ let deferredStatusCommandOwner;
126
127
  const pendingCommands = /* @__PURE__ */ new Set();
127
128
  const metadataWriter = Object.freeze({ name: "Pibbl playback metadata" });
128
129
  const status = signal("idle", {
@@ -706,6 +707,34 @@ function createAnimationPlaybackController(initialProgram, initialOptions = {})
706
707
  pendingCommands.add(commandHandle);
707
708
  return commandHandle;
708
709
  }
710
+ function stageDisposedAfterRender() {
711
+ let command;
712
+ let revokeFromOwner;
713
+ command = queueBeginCommand((snapshot, batch) => {
714
+ try {
715
+ batch.stage(status, "disposed", metadataWriter);
716
+ recordSchedulerTrace({
717
+ kind: "animation-write",
718
+ frameId: snapshot.frameId,
719
+ logicalTime: snapshot.logicalTime,
720
+ debugName: debugName(),
721
+ target: "status",
722
+ outcome: "staged"
723
+ });
724
+ } finally {
725
+ revokeFromOwner?.();
726
+ }
727
+ });
728
+ const owner = deferredStatusCommandOwner;
729
+ if (owner === void 0) return;
730
+ const revoke = () => {
731
+ command.cancel();
732
+ const phase = snapshotRealmScheduler().phase;
733
+ if (phase !== "advance" && phase !== "render") status.set("disposed");
734
+ };
735
+ revokeFromOwner = () => owner.remove(revoke);
736
+ owner.add(revoke);
737
+ }
709
738
  function acceptCommandWithoutTrace(command, generation, snapshot, batch, argument) {
710
739
  if (command === "play") {
711
740
  acceptPlay(generation, argument, snapshot, batch);
@@ -888,6 +917,9 @@ function createAnimationPlaybackController(initialProgram, initialOptions = {})
888
917
  const generation = ++queuedGeneration;
889
918
  pendingRetarget = enqueue("play", generation, "replace");
890
919
  },
920
+ setDeferredStatusCommandOwner(owner) {
921
+ deferredStatusCommandOwner = owner;
922
+ },
891
923
  dispose() {
892
924
  if (disposed) return;
893
925
  disposed = true;
@@ -909,17 +941,7 @@ function createAnimationPlaybackController(initialProgram, initialOptions = {})
909
941
  if (schedulerPhase !== "advance" && schedulerPhase !== "render") {
910
942
  status.set("disposed");
911
943
  } else {
912
- queueBeginCommand((snapshot, batch) => {
913
- batch.stage(status, "disposed", metadataWriter);
914
- recordSchedulerTrace({
915
- kind: "animation-write",
916
- frameId: snapshot.frameId,
917
- logicalTime: snapshot.logicalTime,
918
- debugName: debugName(),
919
- target: "status",
920
- outcome: "staged"
921
- });
922
- });
944
+ stageDisposedAfterRender();
923
945
  }
924
946
  }
925
947
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/animation/playback.ts"],
4
- "sourcesContent": ["import {\n getSignalNode,\n signal,\n type SignalCommitBatch,\n} from '../signals/graph.js';\nimport type { WritableSignal } from '../signals/types.js';\nimport {\n queueBeginCommand,\n queueCurrentFrameCommitAcknowledgement,\n queueCurrentFrameCompletion,\n queueCurrentFrameOrderedPlaybackCompletion,\n recordSchedulerTrace,\n registerAdvanceParticipant,\n snapshotRealmScheduler,\n} from '../scheduler/realm-scheduler.js';\nimport type {\n PibblBeginCommandHandle,\n PibblFrameSnapshot,\n} from '../scheduler/types.js';\nimport { getDefinitionRecord } from './definition.js';\nimport { sampleSpring, type SpringSample } from './spring.js';\nimport {\n adoptProgramActivationFork,\n evaluateProgram,\n finishProgram,\n forkProgramActivation,\n getProgramActivationRecord,\n preflightProgramActivation,\n releaseProgramActivation,\n seekProgram,\n type ProgramActivation,\n type ProgramEvaluationResult,\n} from './evaluate.js';\nimport { getProgramRecord, type ProgramDuration } from './program.js';\nimport type {\n PibblAnimationProgram,\n PibblPlayback,\n PibblPlaybackEvent,\n PibblPlaybackOptions,\n PibblPlaybackStatus,\n} from './types.js';\nimport {\n acquireTransactionalProgramWriterLeases,\n preflightProgramWriterLeaseAcquisition,\n type AnimationWriterLeaseReplacement,\n type TransactionalProgramWriterLease,\n} from './writer-leases.js';\n\ntype PlaybackCommandName =\n | 'play'\n | 'pause'\n | 'resume'\n | 'cancel'\n | 'finish'\n | 'seek'\n | 'reverse'\n | 'setPlaybackRate';\n\ntype PendingEvaluation =\n | {\n readonly kind: 'seek';\n readonly time: number;\n readonly direction?: 'forward' | 'reverse';\n }\n | { readonly kind: 'finish' };\n\ninterface PlaybackRun {\n readonly generation: number;\n readonly registration: object;\n readonly registrationOrder: number;\n readonly token: object;\n readonly lease: TransactionalProgramWriterLease;\n readonly activation: ProgramActivation;\n readonly program: PibblAnimationProgram;\n direction: 'forward' | 'reverse';\n playbackRate: number;\n position: number;\n anchorPosition: number;\n anchorLogicalTime: number;\n previousTime: number | undefined;\n status: 'running' | 'paused' | 'ending';\n pendingEvaluation: PendingEvaluation | undefined;\n unregisterAdvance: (() => void) | undefined;\n released: boolean;\n startPending: boolean;\n startQueuedFrameId: number | undefined;\n}\n\ninterface PendingTraceWrite {\n readonly signal: WritableSignal<unknown>;\n readonly version: number;\n readonly target: string;\n}\n\ninterface FrameDelivery {\n readonly frameId: number;\n readonly logicalTime: number;\n readonly events: Array<{\n readonly event: PibblPlaybackEvent;\n readonly registrationOrder: number;\n }>;\n readonly errors: Array<{\n readonly error: unknown;\n readonly registrationOrder: number;\n readonly commitRequired: boolean;\n }>;\n readonly terminalRuns: Set<PlaybackRun>;\n readonly writes: PendingTraceWrite[];\n commitApplied: boolean;\n}\n\nexport interface AnimationPlaybackSnapshot {\n readonly activePlaybacks: number;\n readonly createdPlaybacks: number;\n readonly releasedPlaybacks: number;\n readonly queuedCommands: number;\n readonly queuedMilestones: number;\n readonly outputStageAttempts: number;\n}\n\nexport interface AnimationPlaybackController {\n readonly handle: PibblPlayback;\n adopt(program: PibblAnimationProgram, options?: PibblPlaybackOptions): void;\n committedSpringSnapshot(): SpringSample | undefined;\n retarget(program: PibblAnimationProgram, options?: PibblPlaybackOptions): void;\n dispose(): void;\n}\n\nexport interface AnimationPlaybackCandidate {\n readonly program: PibblAnimationProgram;\n readonly options: PibblPlaybackOptions;\n}\n\nlet nextPlaybackRegistrationOrder = 0;\nlet activePlaybacks = 0;\nlet createdPlaybacks = 0;\nlet releasedPlaybacks = 0;\nlet queuedCommands = 0;\nlet queuedMilestones = 0;\nlet outputStageAttempts = 0;\nlet activePlaybackBeginContext: {\n readonly snapshot: PibblFrameSnapshot;\n readonly batch: SignalCommitBatch;\n} | undefined;\n\n/** @internal Deterministic resource counters for tests and diagnostics. */\nexport function animationPlaybackSnapshot(): AnimationPlaybackSnapshot {\n return Object.freeze({\n activePlaybacks,\n createdPlaybacks,\n releasedPlaybacks,\n queuedCommands,\n queuedMilestones,\n outputStageAttempts,\n });\n}\n\nfunction freezePath(path: readonly number[]): readonly number[] {\n return Object.freeze([...path]);\n}\n\nfunction playbackEvent(\n type: PibblPlaybackEvent['type'],\n snapshot: PibblFrameSnapshot,\n programPath: readonly number[] = [],\n iteration = 0,\n marker?: string,\n): PibblPlaybackEvent {\n return Object.freeze({\n type,\n logicalTime: snapshot.logicalTime,\n frameId: snapshot.frameId,\n programPath: freezePath(programPath),\n iteration,\n ...(marker === undefined ? {} : { marker }),\n });\n}\n\nfunction validateOptions(options: PibblPlaybackOptions): void {\n if (options.conflict !== undefined &&\n options.conflict !== 'error' && options.conflict !== 'replace') {\n throw new TypeError('Pibbl animation playback conflict must be \"error\" or \"replace\".');\n }\n if (options.debugName !== undefined &&\n (typeof options.debugName !== 'string' || options.debugName.length === 0)) {\n throw new TypeError('Pibbl animation playback debugName must be nonempty when provided.');\n }\n if (options.onEvent !== undefined && typeof options.onEvent !== 'function') {\n throw new TypeError('Pibbl animation playback onEvent must be a function.');\n }\n if (options.onError !== undefined && typeof options.onError !== 'function') {\n throw new TypeError('Pibbl animation playback onError must be a function.');\n }\n}\n\n/** @internal Creates one validated immutable render-time playback candidate. */\nexport function normalizeAnimationPlaybackCandidate(\n program: PibblAnimationProgram,\n options: PibblPlaybackOptions = {},\n): AnimationPlaybackCandidate {\n getProgramRecord(program);\n const normalizedOptions = Object.freeze({ ...options });\n validateOptions(normalizedOptions);\n return Object.freeze({ program, options: normalizedOptions });\n}\n\nfunction firstStepperName(program: PibblAnimationProgram): string | undefined {\n const record = getProgramRecord(program);\n if (record.kind === 'track') {\n const definition = getDefinitionRecord(record.definition);\n return definition.kind === 'stepper' ? definition.debugName : undefined;\n }\n for (const child of record.children) {\n const name = firstStepperName(child);\n if (name !== undefined) return name;\n }\n return undefined;\n}\n\nfunction unavailableControlError(\n program: PibblAnimationProgram,\n control: 'reverse' | 'finish',\n): Error | undefined {\n const duration = getProgramRecord(program).duration;\n if (duration.kind === 'infinite') {\n return new TypeError(\n `Pibbl animation program is infinite; ${control} is unavailable.`,\n );\n }\n if (duration.kind === 'unresolved-stepper') {\n const name = firstStepperName(program);\n const label = name === undefined ? 'Pibbl animation stateful program' :\n `Pibbl animation stepper \"${name}\"`;\n return new TypeError(\n `${label} terminal time is not discovered; ${control} is unavailable.`,\n );\n }\n return undefined;\n}\n\nfunction finiteDuration(duration: ProgramDuration): number | undefined {\n return duration.kind === 'finite' ? duration.milliseconds : undefined;\n}\n\n/**\n * Creates one scheduler-owned playback slot. Component lifetime is added by\n * usePlayback in the following implementation task.\n */\nexport function createAnimationPlaybackController(\n initialProgram: PibblAnimationProgram,\n initialOptions: PibblPlaybackOptions = {},\n): AnimationPlaybackController {\n const initialCandidate = normalizeAnimationPlaybackCandidate(\n initialProgram,\n initialOptions,\n );\n\n let program = initialCandidate.program;\n let options = initialCandidate.options;\n let disposed = false;\n let queuedGeneration = 0;\n let run: PlaybackRun | undefined;\n let storedPlaybackRate = 1;\n let delivery: FrameDelivery | undefined;\n let pendingRetarget: PibblBeginCommandHandle | undefined;\n const pendingCommands = new Set<PibblBeginCommandHandle>();\n const metadataWriter = Object.freeze({ name: 'Pibbl playback metadata' });\n const status = signal<PibblPlaybackStatus>('idle', {\n debugName: options.debugName === undefined ? undefined : `${options.debugName} status`,\n });\n const currentTime = signal(0, {\n debugName: options.debugName === undefined ? undefined : `${options.debugName} current time`,\n });\n\n function debugName(): string | undefined {\n return options.debugName;\n }\n\n function ensureDelivery(snapshot: PibblFrameSnapshot): FrameDelivery {\n if (delivery?.frameId === snapshot.frameId) return delivery;\n const current: FrameDelivery = {\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n events: [],\n errors: [],\n terminalRuns: new Set(),\n writes: [],\n commitApplied: false,\n };\n delivery = current;\n queueCurrentFrameCommitAcknowledgement((_snapshot, outcome) => {\n current.commitApplied = outcome.applied;\n });\n queueCurrentFrameCompletion(() => {\n if (delivery === current) delivery = undefined;\n if (!current.commitApplied) {\n queuedMilestones -= current.events.length;\n } else {\n for (const terminalRun of current.terminalRuns) releaseRun(terminalRun);\n\n for (const write of current.writes) {\n const node = getSignalNode(write.signal);\n recordSchedulerTrace({\n kind: 'animation-write',\n frameId: current.frameId,\n logicalTime: current.logicalTime,\n debugName: debugName(),\n target: write.target,\n outcome: node.version === write.version ?\n 'equality-suppressed' : 'staged',\n });\n }\n\n for (const { event, registrationOrder } of current.events) {\n queueCurrentFrameOrderedPlaybackCompletion(registrationOrder, () => {\n queuedMilestones--;\n if (!disposed) options.onEvent?.(event);\n });\n }\n }\n for (const { error, registrationOrder, commitRequired } of current.errors) {\n if (commitRequired && !current.commitApplied) continue;\n queueCurrentFrameOrderedPlaybackCompletion(registrationOrder, () => {\n if (disposed) return;\n if (options.onError) options.onError(error);\n else throw error;\n });\n }\n });\n return current;\n }\n\n function queueEvent(\n snapshot: PibblFrameSnapshot,\n event: PibblPlaybackEvent,\n registrationOrder: number,\n ): void {\n const frame = ensureDelivery(snapshot);\n frame.events.push({ event, registrationOrder });\n queuedMilestones++;\n recordSchedulerTrace({\n kind: 'animation-milestone',\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n debugName: debugName(),\n event: event.type,\n programPath: event.programPath,\n iteration: event.iteration,\n });\n }\n\n function queueError(\n snapshot: PibblFrameSnapshot,\n error: unknown,\n registrationOrder: number,\n trace = true,\n commitRequired = true,\n ): void {\n ensureDelivery(snapshot).errors.push({ error, registrationOrder, commitRequired });\n if (trace) {\n recordSchedulerTrace({\n kind: 'animation-error',\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n debugName: debugName(),\n error,\n });\n }\n }\n\n function queueDiagnosticError(\n snapshot: PibblFrameSnapshot,\n error: unknown,\n registrationOrder: number,\n ): void {\n queueError(snapshot, error, registrationOrder, true, false);\n }\n\n function queuePendingStart(target: PlaybackRun, snapshot: PibblFrameSnapshot): void {\n if (!target.startPending || target.startQueuedFrameId === snapshot.frameId) return;\n target.startQueuedFrameId = snapshot.frameId;\n queueEvent(snapshot, playbackEvent('start', snapshot), target.registrationOrder);\n queueCurrentFrameCommitAcknowledgement((_committedSnapshot, outcome) => {\n if (outcome.applied && !target.released) target.startPending = false;\n });\n }\n\n function stage<T>(\n batch: SignalCommitBatch,\n snapshot: PibblFrameSnapshot,\n target: WritableSignal<T>,\n value: T,\n label: string,\n ): void {\n const node = getSignalNode(target);\n ensureDelivery(snapshot).writes.push({\n signal: target as WritableSignal<unknown>,\n version: node.version,\n target: label,\n });\n batch.stage(target, value, metadataWriter);\n }\n\n function stageStatus(\n batch: SignalCommitBatch,\n snapshot: PibblFrameSnapshot,\n value: PibblPlaybackStatus,\n ): void {\n stage(batch, snapshot, status, value, 'status');\n }\n\n function stageCurrentTime(\n batch: SignalCommitBatch,\n snapshot: PibblFrameSnapshot,\n value: number,\n ): void {\n stage(batch, snapshot, currentTime, value, 'currentTime');\n }\n\n function releaseRun(target: PlaybackRun): void {\n if (target.released) return;\n target.released = true;\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n target.lease.release();\n releaseProgramActivation(target.activation);\n activePlaybacks--;\n releasedPlaybacks++;\n if (run === target) run = undefined;\n }\n\n function scheduleTerminal(snapshot: PibblFrameSnapshot, target: PlaybackRun): void {\n ensureDelivery(snapshot).terminalRuns.add(target);\n }\n\n function cancelRun(\n target: PlaybackRun,\n snapshot: PibblFrameSnapshot,\n batch: SignalCommitBatch,\n releaseImmediately = false,\n ): void {\n if (target.status === 'ending') return;\n queuePendingStart(target, snapshot);\n const previousStatus = target.status;\n target.status = 'ending';\n stageStatus(batch, snapshot, 'cancelled');\n queueEvent(snapshot, playbackEvent('cancel', snapshot), target.registrationOrder);\n if (releaseImmediately) {\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n scheduleTerminal(snapshot, target);\n releaseRun(target);\n return;\n }\n queueCurrentFrameCommitAcknowledgement((_committedSnapshot, outcome) => {\n if (disposed || run !== target || target.released) return;\n if (!outcome.applied) {\n target.status = previousStatus;\n enqueue('cancel', target.generation);\n return;\n }\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n scheduleTerminal(snapshot, target);\n });\n }\n\n function beginRunReplacement(\n target: PlaybackRun,\n snapshot: PibblFrameSnapshot,\n batch: SignalCommitBatch,\n ): AnimationWriterLeaseReplacement {\n if (target.status === 'ending' || target.released) {\n throw new Error('Pibbl animation playback run is already ending.');\n }\n const previousStatus = target.status;\n const previousStartPending = target.startPending;\n const wasRegistered = target.unregisterAdvance !== undefined;\n queuePendingStart(target, snapshot);\n target.status = 'ending';\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n stageStatus(batch, snapshot, 'cancelled');\n queueEvent(snapshot, playbackEvent('cancel', snapshot), target.registrationOrder);\n let pending = true;\n return Object.freeze({\n commit(): void {\n if (!pending) return;\n pending = false;\n scheduleTerminal(snapshot, target);\n },\n rollback(): void {\n if (!pending) return;\n pending = false;\n if (target.released) return;\n if (disposed) {\n releaseRun(target);\n return;\n }\n target.status = previousStatus;\n target.startPending = previousStartPending;\n if (wasRegistered) registerRun(target);\n },\n });\n }\n\n function queueEvaluationTraces(\n target: PlaybackRun,\n snapshot: PibblFrameSnapshot,\n result: ProgramEvaluationResult,\n stagedOutputs: ReadonlySet<WritableSignal<unknown>>,\n sampledTime: number,\n ): void {\n recordSchedulerTrace({\n kind: 'animation-sample',\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n registrationOrder: target.registrationOrder,\n debugName: debugName(),\n localTime: sampledTime,\n direction: target.direction,\n });\n for (const output of stagedOutputs) {\n ensureDelivery(snapshot).writes.push({\n signal: output,\n version: getSignalNode(output).version,\n target: getSignalNode(output).debugName ?? '<unnamed signal>',\n });\n }\n for (const trace of result.steppers) {\n recordSchedulerTrace({\n kind: 'animation-stepper',\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n debugName: debugName(),\n programPath: trace.programPath,\n repeatIterations: trace.repeatIterations,\n appliedSteps: trace.appliedSteps,\n retainedRemainderMilliseconds: trace.retainedRemainderMilliseconds,\n clampedElapsedMilliseconds: trace.clampedElapsedMilliseconds,\n discardedElapsedMilliseconds: trace.discardedElapsedMilliseconds,\n });\n }\n }\n\n function queueEvaluationMilestones(\n target: PlaybackRun,\n snapshot: PibblFrameSnapshot,\n result: ProgramEvaluationResult,\n ): void {\n for (const milestone of result.milestones) {\n queueEvent(snapshot, playbackEvent(\n milestone.kind,\n snapshot,\n milestone.programPath,\n milestone.iteration,\n milestone.kind === 'marker' ? milestone.marker : undefined,\n ), target.registrationOrder);\n }\n }\n\n function clampRunTime(target: PlaybackRun, candidate: number): number {\n const record = getProgramActivationRecord(target.activation);\n const knownDuration = record.terminalDuration ??\n finiteDuration(getProgramRecord(target.program).duration);\n return Math.max(0, knownDuration === undefined ? candidate :\n Math.min(candidate, knownDuration));\n }\n\n function registerRun(target: PlaybackRun): void {\n if (target.unregisterAdvance !== undefined || target.released) return;\n target.unregisterAdvance = registerAdvanceParticipant((snapshot, batch) => {\n if (disposed || run !== target || target.released || target.status === 'ending') return;\n advanceRun(target, snapshot, batch);\n }, 'animation');\n }\n\n function advanceRun(\n target: PlaybackRun,\n snapshot: PibblFrameSnapshot,\n batch: SignalCommitBatch,\n ): void {\n queuePendingStart(target, snapshot);\n const evaluationActivation = forkProgramActivation(target.activation);\n const stagedOutputs = new Set<WritableSignal<unknown>>();\n const evaluationBatch: SignalCommitBatch = {\n read<T>(value: WritableSignal<T>): T {\n return batch.read(value);\n },\n stage<T>(value: WritableSignal<T>, nextValue: T, writer: object): void {\n batch.stage(value, nextValue, writer);\n if (writer === target.token) {\n outputStageAttempts++;\n stagedOutputs.add(value as WritableSignal<unknown>);\n }\n },\n discardWriter(writer: object): void {\n batch.discardWriter(writer);\n },\n registerLifecycle(writer, lifecycle): void {\n batch.registerLifecycle(writer, lifecycle);\n },\n commit(): void {\n batch.commit();\n },\n clear(): void {\n batch.clear();\n },\n };\n const pending = target.pendingEvaluation;\n let destination = pending?.kind === 'seek' ? pending.time :\n target.anchorPosition +\n (target.direction === 'forward' ? 1 : -1) *\n (snapshot.logicalTime - target.anchorLogicalTime) * target.playbackRate;\n destination = clampRunTime(target, destination);\n let result: ProgramEvaluationResult;\n try {\n if (pending?.kind === 'finish') {\n const staticDuration = finiteDuration(getProgramRecord(target.program).duration);\n if (staticDuration === undefined) {\n result = finishProgram(evaluationActivation, {\n previousTime: target.previousTime,\n frameId: snapshot.frameId,\n writer: target.token,\n batch: evaluationBatch,\n });\n } else {\n result = seekProgram(evaluationActivation, {\n previousTime: target.previousTime,\n time: staticDuration,\n direction: 'forward',\n frameId: snapshot.frameId,\n writer: target.token,\n batch: evaluationBatch,\n });\n }\n } else if (pending?.kind === 'seek') {\n result = seekProgram(evaluationActivation, {\n previousTime: target.previousTime,\n time: destination,\n direction: pending.direction ??\n (destination < target.position ? 'reverse' : 'forward'),\n frameId: snapshot.frameId,\n writer: target.token,\n batch: evaluationBatch,\n });\n } else {\n result = evaluateProgram(evaluationActivation, {\n previousTime: target.previousTime,\n time: destination,\n direction: target.direction,\n frameId: snapshot.frameId,\n writer: target.token,\n batch: evaluationBatch,\n });\n }\n } catch (error) {\n releaseProgramActivation(evaluationActivation);\n batch.discardWriter(target.token);\n stageStatus(batch, snapshot, 'cancelled');\n recordSchedulerTrace({\n kind: 'animation-error',\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n debugName: debugName(),\n error,\n });\n queueCurrentFrameCommitAcknowledgement((_committedSnapshot, outcome) => {\n if (!outcome.applied || disposed || run !== target || target.released) return;\n target.status = 'ending';\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n queueEvent(snapshot, playbackEvent('cancel', snapshot), target.registrationOrder);\n queueError(snapshot, error, target.registrationOrder, false);\n scheduleTerminal(snapshot, target);\n });\n return;\n }\n\n if (disposed || run !== target || target.released) {\n releaseProgramActivation(evaluationActivation);\n batch.discardWriter(target.token);\n return;\n }\n\n const duration = result.terminal.duration;\n const presentedTime = duration !== undefined && Number.isFinite(duration) &&\n result.terminal.atEnd ? duration : destination;\n stageCurrentTime(batch, snapshot, presentedTime);\n queueEvaluationTraces(target, snapshot, result, stagedOutputs, presentedTime);\n\n const terminalReached = target.status === 'running' && result.terminal.reached ||\n pending?.kind === 'finish';\n if (terminalReached) {\n stageStatus(batch, snapshot, 'finished');\n } else {\n stageStatus(batch, snapshot, target.status === 'paused' ? 'paused' : 'running');\n }\n queueCurrentFrameCommitAcknowledgement((_committedSnapshot, outcome) => {\n if (!outcome.applied || disposed || run !== target || target.released) {\n releaseProgramActivation(evaluationActivation);\n return;\n }\n adoptProgramActivationFork(target.activation, evaluationActivation);\n target.position = presentedTime;\n target.previousTime = presentedTime;\n if (pending?.kind === 'seek') {\n target.anchorPosition = presentedTime;\n target.anchorLogicalTime = snapshot.logicalTime;\n }\n target.pendingEvaluation = undefined;\n queueEvaluationMilestones(target, snapshot, result);\n if (terminalReached) {\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n queueEvent(snapshot, playbackEvent('finish', snapshot), target.registrationOrder);\n scheduleTerminal(snapshot, target);\n } else if (target.status === 'paused') {\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n }\n });\n }\n\n function createRun(\n generation: number,\n snapshot: PibblFrameSnapshot,\n batch: SignalCommitBatch,\n conflict: 'error' | 'replace',\n ignoredToken?: object,\n ): PlaybackRun | undefined {\n const registration = Object.freeze({});\n const registrationOrder = ++nextPlaybackRegistrationOrder;\n const token = Object.freeze({ registrationOrder });\n let target!: PlaybackRun;\n try {\n const lease = acquireTransactionalProgramWriterLeases(program, registration, {\n token,\n registrationOrder,\n debugName: debugName(),\n cancel(): void {\n if (target !== undefined && !target.released) {\n const context = activePlaybackBeginContext;\n if (context === undefined) releaseRun(target);\n else cancelRun(target, context.snapshot, context.batch, true);\n }\n },\n preflightReplacement(): void {\n if (target === undefined || target.released) {\n throw new Error('Pibbl animation replacement owner is unavailable.');\n }\n if (activePlaybackBeginContext === undefined) {\n throw new Error('Pibbl animation replacement must begin during Begin.');\n }\n if (target.status === 'ending') {\n throw new Error('Pibbl animation playback run is already ending.');\n }\n },\n beginReplacement(): AnimationWriterLeaseReplacement {\n if (target === undefined || target.released) {\n throw new Error('Pibbl animation replacement owner is unavailable.');\n }\n const context = activePlaybackBeginContext;\n if (context === undefined) {\n throw new Error('Pibbl animation replacement must begin during Begin.');\n }\n return beginRunReplacement(target, context.snapshot, context.batch);\n },\n }, { conflict, ignoredToken });\n target = {\n generation,\n registration,\n registrationOrder,\n token,\n lease,\n activation: lease.activation,\n program,\n direction: 'forward',\n playbackRate: storedPlaybackRate,\n position: 0,\n anchorPosition: 0,\n anchorLogicalTime: snapshot.logicalTime,\n previousTime: undefined,\n status: 'running',\n pendingEvaluation: undefined,\n unregisterAdvance: undefined,\n released: false,\n startPending: false,\n startQueuedFrameId: undefined,\n };\n } catch (error) {\n stageStatus(batch, snapshot, 'cancelled');\n queueDiagnosticError(snapshot, error, registrationOrder);\n return undefined;\n }\n run = target;\n activePlaybacks++;\n createdPlaybacks++;\n return target;\n }\n\n function settleProvisionalRun(\n target: PlaybackRun,\n previousRun: PlaybackRun | undefined,\n additionalReplacement: AnimationWriterLeaseReplacement | undefined,\n ): void {\n if (target.lease.replacedOwnerCount === 0 && additionalReplacement === undefined) return;\n queueCurrentFrameCommitAcknowledgement((_snapshot, outcome) => {\n if (outcome.applied) {\n target.lease.commitReplacement();\n additionalReplacement?.commit();\n return;\n }\n const targetAlreadyReleased = target.released;\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n target.released = true;\n if (run === target) run = previousRun;\n if (previousRun !== undefined) queuedGeneration = previousRun.generation;\n if (!targetAlreadyReleased) {\n if (target.lease.replacedOwnerCount === 0) target.lease.release();\n else target.lease.rollbackReplacement();\n }\n additionalReplacement?.rollback();\n if (!targetAlreadyReleased) {\n releaseProgramActivation(target.activation);\n activePlaybacks--;\n releasedPlaybacks++;\n }\n });\n }\n\n function acceptPlay(\n generation: number,\n conflict: 'error' | 'replace',\n snapshot: PibblFrameSnapshot,\n batch: SignalCommitBatch,\n ): void {\n try {\n if (conflict === 'error') {\n preflightProgramWriterLeaseAcquisition(program, run?.token);\n } else {\n preflightProgramActivation(program);\n }\n } catch (error) {\n if (run === undefined || run.status === 'ending') {\n stageStatus(batch, snapshot, 'cancelled');\n } else if (queuedGeneration === generation) {\n queuedGeneration = run.generation;\n }\n queueDiagnosticError(\n snapshot,\n error,\n run?.registrationOrder ?? Number.MAX_SAFE_INTEGER,\n );\n return;\n }\n const previousRun = run;\n const target = createRun(\n generation,\n snapshot,\n batch,\n conflict,\n previousRun?.token,\n );\n if (target === undefined) return;\n let additionalReplacement: AnimationWriterLeaseReplacement | undefined;\n if (previousRun !== undefined && !previousRun.released &&\n previousRun.status !== 'ending') {\n additionalReplacement = beginRunReplacement(previousRun, snapshot, batch);\n }\n stageStatus(batch, snapshot, 'scheduled');\n stageCurrentTime(batch, snapshot, 0);\n stageStatus(batch, snapshot, 'running');\n target.startPending = true;\n queuePendingStart(target, snapshot);\n registerRun(target);\n settleProvisionalRun(target, previousRun, additionalReplacement);\n }\n\n function acceptFreshControl(\n generation: number,\n command: 'seek' | 'reverse' | 'finish',\n snapshot: PibblFrameSnapshot,\n batch: SignalCommitBatch,\n seekTime?: number,\n ): void {\n if (command !== 'seek') {\n const error = unavailableControlError(program, command);\n if (error !== undefined) {\n queueDiagnosticError(snapshot, error, Number.MAX_SAFE_INTEGER);\n return;\n }\n }\n const target = createRun(\n generation,\n snapshot,\n batch,\n options.conflict ?? 'error',\n );\n if (target === undefined) return;\n target.status = command === 'reverse' ? 'running' : 'paused';\n if (command === 'reverse') {\n const duration = finiteDuration(getProgramRecord(target.program).duration)!;\n target.direction = 'reverse';\n target.position = duration;\n target.anchorPosition = duration;\n target.pendingEvaluation = { kind: 'seek', time: duration, direction: 'reverse' };\n stageStatus(batch, snapshot, 'scheduled');\n stageStatus(batch, snapshot, 'running');\n target.startPending = true;\n } else if (command === 'finish') {\n target.status = 'running';\n target.pendingEvaluation = { kind: 'finish' };\n stageStatus(batch, snapshot, 'scheduled');\n stageStatus(batch, snapshot, 'running');\n target.startPending = true;\n } else {\n const staticDuration = finiteDuration(getProgramRecord(target.program).duration);\n target.pendingEvaluation = {\n kind: 'seek',\n time: Math.max(0, staticDuration === undefined ? seekTime! :\n Math.min(seekTime!, staticDuration)),\n };\n stageStatus(batch, snapshot, 'paused');\n }\n queuePendingStart(target, snapshot);\n registerRun(target);\n settleProvisionalRun(target, undefined, undefined);\n }\n\n function enqueue(\n command: PlaybackCommandName,\n generation: number,\n argument?: number | 'error' | 'replace',\n ): PibblBeginCommandHandle | undefined {\n if (disposed) return undefined;\n queuedCommands++;\n let commandHandle!: PibblBeginCommandHandle;\n commandHandle = queueBeginCommand((snapshot, batch, sequence) => {\n pendingCommands.delete(commandHandle);\n if (pendingRetarget === commandHandle) pendingRetarget = undefined;\n queuedCommands--;\n if (disposed || generation !== queuedGeneration) return;\n recordSchedulerTrace({\n kind: 'animation-command',\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n sequence,\n command,\n debugName: debugName(),\n });\n const previousContext = activePlaybackBeginContext;\n activePlaybackBeginContext = { snapshot, batch };\n try {\n acceptCommandWithoutTrace(command, generation, snapshot, batch, argument);\n } finally {\n activePlaybackBeginContext = previousContext;\n }\n });\n pendingCommands.add(commandHandle);\n return commandHandle;\n }\n\n function acceptCommandWithoutTrace(\n command: PlaybackCommandName,\n generation: number,\n snapshot: PibblFrameSnapshot,\n batch: SignalCommitBatch,\n argument?: number | 'error' | 'replace',\n ): void {\n // Keep trace emission in the immutable scheduler command wrapper so the\n // realm sequence, not a controller-local approximation, is recorded.\n if (command === 'play') {\n acceptPlay(generation, argument as 'error' | 'replace', snapshot, batch);\n return;\n }\n const target = run?.generation === generation ? run : undefined;\n if (target === undefined) {\n if (command === 'seek' || command === 'reverse' || command === 'finish') {\n acceptFreshControl(\n generation,\n command,\n snapshot,\n batch,\n command === 'seek' ? argument as number : undefined,\n );\n } else if (command === 'cancel') {\n stageStatus(batch, snapshot, 'cancelled');\n } else if (command === 'setPlaybackRate') {\n storedPlaybackRate = argument as number;\n }\n return;\n }\n if (target.status === 'ending') {\n if (command === 'seek' || command === 'reverse' || command === 'finish') {\n releaseRun(target);\n acceptFreshControl(\n generation,\n command,\n snapshot,\n batch,\n command === 'seek' ? argument as number : undefined,\n );\n } else if (command === 'setPlaybackRate') {\n storedPlaybackRate = argument as number;\n }\n return;\n }\n if (command === 'pause') {\n if (target.status !== 'paused') {\n const previousStatus = target.status;\n target.status = 'paused';\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n stageStatus(batch, snapshot, 'paused');\n queueCurrentFrameCommitAcknowledgement((_committedSnapshot, outcome) => {\n if (outcome.applied || disposed || run !== target || target.released) return;\n target.status = previousStatus;\n registerRun(target);\n enqueue('pause', target.generation);\n });\n }\n return;\n }\n if (command === 'resume') {\n if (target.status === 'paused') {\n const previousAnchorPosition = target.anchorPosition;\n const previousAnchorLogicalTime = target.anchorLogicalTime;\n target.status = 'running';\n target.anchorPosition = target.position;\n target.anchorLogicalTime = snapshot.logicalTime;\n stageStatus(batch, snapshot, 'running');\n registerRun(target);\n queueCurrentFrameCommitAcknowledgement((_committedSnapshot, outcome) => {\n if (outcome.applied || disposed || run !== target || target.released) return;\n target.status = 'paused';\n target.anchorPosition = previousAnchorPosition;\n target.anchorLogicalTime = previousAnchorLogicalTime;\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n enqueue('resume', target.generation);\n });\n }\n return;\n }\n if (command === 'cancel') {\n cancelRun(target, snapshot, batch);\n return;\n }\n if (command === 'seek') {\n const staticDuration = finiteDuration(getProgramRecord(target.program).duration);\n const time = Math.max(0, staticDuration === undefined ? argument as number :\n Math.min(argument as number, staticDuration));\n target.pendingEvaluation = { kind: 'seek', time };\n target.anchorPosition = time;\n target.anchorLogicalTime = snapshot.logicalTime;\n registerRun(target);\n return;\n }\n if (command === 'reverse') {\n target.direction = target.direction === 'forward' ? 'reverse' : 'forward';\n target.anchorPosition = target.position;\n target.anchorLogicalTime = snapshot.logicalTime;\n if (target.status === 'running') registerRun(target);\n return;\n }\n if (command === 'setPlaybackRate') {\n storedPlaybackRate = argument as number;\n target.playbackRate = storedPlaybackRate;\n target.anchorPosition = target.position;\n target.anchorLogicalTime = snapshot.logicalTime;\n return;\n }\n const unavailable = unavailableControlError(target.program, 'finish');\n if (unavailable !== undefined &&\n getProgramActivationRecord(target.activation).terminalDuration === undefined) {\n queueDiagnosticError(snapshot, unavailable, target.registrationOrder);\n return;\n }\n target.pendingEvaluation = { kind: 'finish' };\n registerRun(target);\n }\n\n const handle: PibblPlayback = Object.freeze({\n status: status.asReadonly(),\n currentTime: currentTime.asReadonly(),\n play(playOptions: { readonly conflict?: 'error' | 'replace' } = {}): void {\n if (disposed) return;\n const conflict = playOptions.conflict ?? options.conflict ?? 'error';\n if (conflict !== 'error' && conflict !== 'replace') {\n throw new TypeError('Pibbl animation playback conflict must be \"error\" or \"replace\".');\n }\n const generation = ++queuedGeneration;\n enqueue('play', generation, conflict);\n },\n pause(): void {\n enqueue('pause', queuedGeneration);\n },\n resume(): void {\n enqueue('resume', queuedGeneration);\n },\n cancel(): void {\n enqueue('cancel', queuedGeneration);\n },\n finish(): void {\n enqueue('finish', queuedGeneration);\n },\n seek(milliseconds: number): void {\n if (disposed) return;\n if (!Number.isFinite(milliseconds)) {\n throw new RangeError('Pibbl animation playback seek time must be finite.');\n }\n enqueue('seek', queuedGeneration, milliseconds);\n },\n reverse(): void {\n enqueue('reverse', queuedGeneration);\n },\n setPlaybackRate(rate: number): void {\n if (disposed) return;\n if (!Number.isFinite(rate) || rate <= 0) {\n throw new RangeError(\n 'Pibbl animation playback rate must be finite and greater than zero.',\n );\n }\n enqueue('setPlaybackRate', queuedGeneration, rate);\n },\n });\n\n return Object.freeze({\n handle,\n adopt(nextProgram: PibblAnimationProgram, nextOptions: PibblPlaybackOptions = {}): void {\n if (disposed) return;\n const candidate = normalizeAnimationPlaybackCandidate(nextProgram, nextOptions);\n program = candidate.program;\n options = candidate.options;\n },\n committedSpringSnapshot(): SpringSample | undefined {\n const target = run;\n if (disposed || target === undefined || target.released) return undefined;\n const programRecord = getProgramRecord(target.program);\n if (programRecord.kind !== 'track') return undefined;\n const definitionRecord = getDefinitionRecord(programRecord.definition);\n if (definitionRecord.kind !== 'spring') return undefined;\n return sampleSpring(definitionRecord, target.position / 1000);\n },\n retarget(nextProgram: PibblAnimationProgram, nextOptions: PibblPlaybackOptions = {}): void {\n if (disposed) return;\n const candidate = normalizeAnimationPlaybackCandidate(nextProgram, nextOptions);\n program = candidate.program;\n options = candidate.options;\n if (pendingRetarget !== undefined) {\n pendingRetarget.cancel();\n if (pendingCommands.delete(pendingRetarget)) queuedCommands--;\n }\n const generation = ++queuedGeneration;\n pendingRetarget = enqueue('play', generation, 'replace');\n },\n dispose(): void {\n if (disposed) return;\n disposed = true;\n queuedGeneration++;\n for (const commandHandle of pendingCommands) {\n commandHandle.cancel();\n queuedCommands--;\n }\n pendingCommands.clear();\n pendingRetarget = undefined;\n if (run !== undefined) releaseRun(run);\n if (delivery !== undefined) {\n queuedMilestones -= delivery.events.length;\n delivery.events.length = 0;\n delivery.errors.length = 0;\n delivery.terminalRuns.clear();\n }\n const schedulerPhase = snapshotRealmScheduler().phase;\n if (schedulerPhase !== 'advance' && schedulerPhase !== 'render') {\n status.set('disposed');\n } else {\n queueBeginCommand((snapshot, batch) => {\n batch.stage(status, 'disposed', metadataWriter);\n recordSchedulerTrace({\n kind: 'animation-write',\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n debugName: debugName(),\n target: 'status',\n outcome: 'staged',\n });\n });\n }\n },\n });\n}\n"],
5
- "mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAKP,SAAS,2BAA2B;AACpC,SAAS,oBAAuC;AAChD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,SAAS,wBAA8C;AAQvD;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAuFP,IAAI,gCAAgC;AACpC,IAAI,kBAAkB;AACtB,IAAI,mBAAmB;AACvB,IAAI,oBAAoB;AACxB,IAAI,iBAAiB;AACrB,IAAI,mBAAmB;AACvB,IAAI,sBAAsB;AAC1B,IAAI;AAMG,SAAS,4BAAuD;AACrE,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,WAAW,MAA4C;AAC9D,SAAO,OAAO,OAAO,CAAC,GAAG,IAAI,CAAC;AAChC;AAEA,SAAS,cACP,MACA,UACA,cAAiC,CAAC,GAClC,YAAY,GACZ,QACoB;AACpB,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA,aAAa,SAAS;AAAA,IACtB,SAAS,SAAS;AAAA,IAClB,aAAa,WAAW,WAAW;AAAA,IACnC;AAAA,IACA,GAAI,WAAW,SAAY,CAAC,IAAI,EAAE,OAAO;AAAA,EAC3C,CAAC;AACH;AAEA,SAAS,gBAAgB,SAAqC;AAC5D,MAAI,QAAQ,aAAa,UACvB,QAAQ,aAAa,WAAW,QAAQ,aAAa,WAAW;AAChE,UAAM,IAAI,UAAU,iEAAiE;AAAA,EACvF;AACA,MAAI,QAAQ,cAAc,WACvB,OAAO,QAAQ,cAAc,YAAY,QAAQ,UAAU,WAAW,IAAI;AAC3E,UAAM,IAAI,UAAU,oEAAoE;AAAA,EAC1F;AACA,MAAI,QAAQ,YAAY,UAAa,OAAO,QAAQ,YAAY,YAAY;AAC1E,UAAM,IAAI,UAAU,sDAAsD;AAAA,EAC5E;AACA,MAAI,QAAQ,YAAY,UAAa,OAAO,QAAQ,YAAY,YAAY;AAC1E,UAAM,IAAI,UAAU,sDAAsD;AAAA,EAC5E;AACF;AAGO,SAAS,oCACd,SACA,UAAgC,CAAC,GACL;AAC5B,mBAAiB,OAAO;AACxB,QAAM,oBAAoB,OAAO,OAAO,EAAE,GAAG,QAAQ,CAAC;AACtD,kBAAgB,iBAAiB;AACjC,SAAO,OAAO,OAAO,EAAE,SAAS,SAAS,kBAAkB,CAAC;AAC9D;AAEA,SAAS,iBAAiB,SAAoD;AAC5E,QAAM,SAAS,iBAAiB,OAAO;AACvC,MAAI,OAAO,SAAS,SAAS;AAC3B,UAAM,aAAa,oBAAoB,OAAO,UAAU;AACxD,WAAO,WAAW,SAAS,YAAY,WAAW,YAAY;AAAA,EAChE;AACA,aAAW,SAAS,OAAO,UAAU;AACnC,UAAM,OAAO,iBAAiB,KAAK;AACnC,QAAI,SAAS,OAAW,QAAO;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAAS,wBACP,SACA,SACmB;AACnB,QAAM,WAAW,iBAAiB,OAAO,EAAE;AAC3C,MAAI,SAAS,SAAS,YAAY;AAChC,WAAO,IAAI;AAAA,MACT,wCAAwC,OAAO;AAAA,IACjD;AAAA,EACF;AACA,MAAI,SAAS,SAAS,sBAAsB;AAC1C,UAAM,OAAO,iBAAiB,OAAO;AACrC,UAAM,QAAQ,SAAS,SAAY,qCACjC,4BAA4B,IAAI;AAClC,WAAO,IAAI;AAAA,MACT,GAAG,KAAK,qCAAqC,OAAO;AAAA,IACtD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,UAA+C;AACrE,SAAO,SAAS,SAAS,WAAW,SAAS,eAAe;AAC9D;AAMO,SAAS,kCACd,gBACA,iBAAuC,CAAC,GACX;AAC7B,QAAM,mBAAmB;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AAEA,MAAI,UAAU,iBAAiB;AAC/B,MAAI,UAAU,iBAAiB;AAC/B,MAAI,WAAW;AACf,MAAI,mBAAmB;AACvB,MAAI;AACJ,MAAI,qBAAqB;AACzB,MAAI;AACJ,MAAI;AACJ,QAAM,kBAAkB,oBAAI,IAA6B;AACzD,QAAM,iBAAiB,OAAO,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxE,QAAM,SAAS,OAA4B,QAAQ;AAAA,IACjD,WAAW,QAAQ,cAAc,SAAY,SAAY,GAAG,QAAQ,SAAS;AAAA,EAC/E,CAAC;AACD,QAAM,cAAc,OAAO,GAAG;AAAA,IAC5B,WAAW,QAAQ,cAAc,SAAY,SAAY,GAAG,QAAQ,SAAS;AAAA,EAC/E,CAAC;AAED,WAAS,YAAgC;AACvC,WAAO,QAAQ;AAAA,EACjB;AAEA,WAAS,eAAe,UAA6C;AACnE,QAAI,UAAU,YAAY,SAAS,QAAS,QAAO;AACnD,UAAM,UAAyB;AAAA,MAC7B,SAAS,SAAS;AAAA,MAClB,aAAa,SAAS;AAAA,MACtB,QAAQ,CAAC;AAAA,MACT,QAAQ,CAAC;AAAA,MACT,cAAc,oBAAI,IAAI;AAAA,MACtB,QAAQ,CAAC;AAAA,MACT,eAAe;AAAA,IACjB;AACA,eAAW;AACX,2CAAuC,CAAC,WAAW,YAAY;AAC7D,cAAQ,gBAAgB,QAAQ;AAAA,IAClC,CAAC;AACD,gCAA4B,MAAM;AAChC,UAAI,aAAa,QAAS,YAAW;AACrC,UAAI,CAAC,QAAQ,eAAe;AAC1B,4BAAoB,QAAQ,OAAO;AAAA,MACrC,OAAO;AACL,mBAAW,eAAe,QAAQ,aAAc,YAAW,WAAW;AAEtE,mBAAW,SAAS,QAAQ,QAAQ;AAClC,gBAAM,OAAO,cAAc,MAAM,MAAM;AACvC,+BAAqB;AAAA,YACnB,MAAM;AAAA,YACN,SAAS,QAAQ;AAAA,YACjB,aAAa,QAAQ;AAAA,YACrB,WAAW,UAAU;AAAA,YACrB,QAAQ,MAAM;AAAA,YACd,SAAS,KAAK,YAAY,MAAM,UAC9B,wBAAwB;AAAA,UAC5B,CAAC;AAAA,QACH;AAEA,mBAAW,EAAE,OAAO,kBAAkB,KAAK,QAAQ,QAAQ;AACzD,qDAA2C,mBAAmB,MAAM;AAClE;AACA,gBAAI,CAAC,SAAU,SAAQ,UAAU,KAAK;AAAA,UACxC,CAAC;AAAA,QACH;AAAA,MACF;AACA,iBAAW,EAAE,OAAO,mBAAmB,eAAe,KAAK,QAAQ,QAAQ;AACzE,YAAI,kBAAkB,CAAC,QAAQ,cAAe;AAC9C,mDAA2C,mBAAmB,MAAM;AAClE,cAAI,SAAU;AACd,cAAI,QAAQ,QAAS,SAAQ,QAAQ,KAAK;AAAA,cACrC,OAAM;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAEA,WAAS,WACP,UACA,OACA,mBACM;AACN,UAAM,QAAQ,eAAe,QAAQ;AACrC,UAAM,OAAO,KAAK,EAAE,OAAO,kBAAkB,CAAC;AAC9C;AACA,yBAAqB;AAAA,MACnB,MAAM;AAAA,MACN,SAAS,SAAS;AAAA,MAClB,aAAa,SAAS;AAAA,MACtB,WAAW,UAAU;AAAA,MACrB,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,WAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,WAAS,WACP,UACA,OACA,mBACA,QAAQ,MACR,iBAAiB,MACX;AACN,mBAAe,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,mBAAmB,eAAe,CAAC;AACjF,QAAI,OAAO;AACT,2BAAqB;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,SAAS;AAAA,QAClB,aAAa,SAAS;AAAA,QACtB,WAAW,UAAU;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,WAAS,qBACP,UACA,OACA,mBACM;AACN,eAAW,UAAU,OAAO,mBAAmB,MAAM,KAAK;AAAA,EAC5D;AAEA,WAAS,kBAAkB,QAAqB,UAAoC;AAClF,QAAI,CAAC,OAAO,gBAAgB,OAAO,uBAAuB,SAAS,QAAS;AAC5E,WAAO,qBAAqB,SAAS;AACrC,eAAW,UAAU,cAAc,SAAS,QAAQ,GAAG,OAAO,iBAAiB;AAC/E,2CAAuC,CAAC,oBAAoB,YAAY;AACtE,UAAI,QAAQ,WAAW,CAAC,OAAO,SAAU,QAAO,eAAe;AAAA,IACjE,CAAC;AAAA,EACH;AAEA,WAAS,MACP,OACA,UACA,QACA,OACA,OACM;AACN,UAAM,OAAO,cAAc,MAAM;AACjC,mBAAe,QAAQ,EAAE,OAAO,KAAK;AAAA,MACnC,QAAQ;AAAA,MACR,SAAS,KAAK;AAAA,MACd,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,MAAM,QAAQ,OAAO,cAAc;AAAA,EAC3C;AAEA,WAAS,YACP,OACA,UACA,OACM;AACN,UAAM,OAAO,UAAU,QAAQ,OAAO,QAAQ;AAAA,EAChD;AAEA,WAAS,iBACP,OACA,UACA,OACM;AACN,UAAM,OAAO,UAAU,aAAa,OAAO,aAAa;AAAA,EAC1D;AAEA,WAAS,WAAW,QAA2B;AAC7C,QAAI,OAAO,SAAU;AACrB,WAAO,WAAW;AAClB,WAAO,oBAAoB;AAC3B,WAAO,oBAAoB;AAC3B,WAAO,MAAM,QAAQ;AACrB,6BAAyB,OAAO,UAAU;AAC1C;AACA;AACA,QAAI,QAAQ,OAAQ,OAAM;AAAA,EAC5B;AAEA,WAAS,iBAAiB,UAA8B,QAA2B;AACjF,mBAAe,QAAQ,EAAE,aAAa,IAAI,MAAM;AAAA,EAClD;AAEA,WAAS,UACP,QACA,UACA,OACA,qBAAqB,OACf;AACN,QAAI,OAAO,WAAW,SAAU;AAChC,sBAAkB,QAAQ,QAAQ;AAClC,UAAM,iBAAiB,OAAO;AAC9B,WAAO,SAAS;AAChB,gBAAY,OAAO,UAAU,WAAW;AACxC,eAAW,UAAU,cAAc,UAAU,QAAQ,GAAG,OAAO,iBAAiB;AAChF,QAAI,oBAAoB;AACtB,aAAO,oBAAoB;AAC3B,aAAO,oBAAoB;AAC3B,uBAAiB,UAAU,MAAM;AACjC,iBAAW,MAAM;AACjB;AAAA,IACF;AACA,2CAAuC,CAAC,oBAAoB,YAAY;AACtE,UAAI,YAAY,QAAQ,UAAU,OAAO,SAAU;AACnD,UAAI,CAAC,QAAQ,SAAS;AACpB,eAAO,SAAS;AAChB,gBAAQ,UAAU,OAAO,UAAU;AACnC;AAAA,MACF;AACA,aAAO,oBAAoB;AAC3B,aAAO,oBAAoB;AAC3B,uBAAiB,UAAU,MAAM;AAAA,IACnC,CAAC;AAAA,EACH;AAEA,WAAS,oBACP,QACA,UACA,OACiC;AACjC,QAAI,OAAO,WAAW,YAAY,OAAO,UAAU;AACjD,YAAM,IAAI,MAAM,iDAAiD;AAAA,IACnE;AACA,UAAM,iBAAiB,OAAO;AAC9B,UAAM,uBAAuB,OAAO;AACpC,UAAM,gBAAgB,OAAO,sBAAsB;AACnD,sBAAkB,QAAQ,QAAQ;AAClC,WAAO,SAAS;AAChB,WAAO,oBAAoB;AAC3B,WAAO,oBAAoB;AAC3B,gBAAY,OAAO,UAAU,WAAW;AACxC,eAAW,UAAU,cAAc,UAAU,QAAQ,GAAG,OAAO,iBAAiB;AAChF,QAAI,UAAU;AACd,WAAO,OAAO,OAAO;AAAA,MACnB,SAAe;AACb,YAAI,CAAC,QAAS;AACd,kBAAU;AACV,yBAAiB,UAAU,MAAM;AAAA,MACnC;AAAA,MACA,WAAiB;AACf,YAAI,CAAC,QAAS;AACd,kBAAU;AACV,YAAI,OAAO,SAAU;AACrB,YAAI,UAAU;AACZ,qBAAW,MAAM;AACjB;AAAA,QACF;AACA,eAAO,SAAS;AAChB,eAAO,eAAe;AACtB,YAAI,cAAe,aAAY,MAAM;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,sBACP,QACA,UACA,QACA,eACA,aACM;AACN,yBAAqB;AAAA,MACnB,MAAM;AAAA,MACN,SAAS,SAAS;AAAA,MAClB,aAAa,SAAS;AAAA,MACtB,mBAAmB,OAAO;AAAA,MAC1B,WAAW,UAAU;AAAA,MACrB,WAAW;AAAA,MACX,WAAW,OAAO;AAAA,IACpB,CAAC;AACD,eAAW,UAAU,eAAe;AAClC,qBAAe,QAAQ,EAAE,OAAO,KAAK;AAAA,QACnC,QAAQ;AAAA,QACR,SAAS,cAAc,MAAM,EAAE;AAAA,QAC/B,QAAQ,cAAc,MAAM,EAAE,aAAa;AAAA,MAC7C,CAAC;AAAA,IACH;AACA,eAAW,SAAS,OAAO,UAAU;AACnC,2BAAqB;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,SAAS;AAAA,QAClB,aAAa,SAAS;AAAA,QACtB,WAAW,UAAU;AAAA,QACrB,aAAa,MAAM;AAAA,QACnB,kBAAkB,MAAM;AAAA,QACxB,cAAc,MAAM;AAAA,QACpB,+BAA+B,MAAM;AAAA,QACrC,4BAA4B,MAAM;AAAA,QAClC,8BAA8B,MAAM;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,WAAS,0BACP,QACA,UACA,QACM;AACN,eAAW,aAAa,OAAO,YAAY;AACzC,iBAAW,UAAU;AAAA,QACnB,UAAU;AAAA,QACV;AAAA,QACA,UAAU;AAAA,QACV,UAAU;AAAA,QACV,UAAU,SAAS,WAAW,UAAU,SAAS;AAAA,MACnD,GAAG,OAAO,iBAAiB;AAAA,IAC7B;AAAA,EACF;AAEA,WAAS,aAAa,QAAqB,WAA2B;AACpE,UAAM,SAAS,2BAA2B,OAAO,UAAU;AAC3D,UAAM,gBAAgB,OAAO,oBAC3B,eAAe,iBAAiB,OAAO,OAAO,EAAE,QAAQ;AAC1D,WAAO,KAAK,IAAI,GAAG,kBAAkB,SAAY,YAC/C,KAAK,IAAI,WAAW,aAAa,CAAC;AAAA,EACtC;AAEA,WAAS,YAAY,QAA2B;AAC9C,QAAI,OAAO,sBAAsB,UAAa,OAAO,SAAU;AAC/D,WAAO,oBAAoB,2BAA2B,CAAC,UAAU,UAAU;AACzE,UAAI,YAAY,QAAQ,UAAU,OAAO,YAAY,OAAO,WAAW,SAAU;AACjF,iBAAW,QAAQ,UAAU,KAAK;AAAA,IACpC,GAAG,WAAW;AAAA,EAChB;AAEA,WAAS,WACP,QACA,UACA,OACM;AACN,sBAAkB,QAAQ,QAAQ;AAClC,UAAM,uBAAuB,sBAAsB,OAAO,UAAU;AACpE,UAAM,gBAAgB,oBAAI,IAA6B;AACvD,UAAM,kBAAqC;AAAA,MACzC,KAAQ,OAA6B;AACnC,eAAO,MAAM,KAAK,KAAK;AAAA,MACzB;AAAA,MACA,MAAS,OAA0B,WAAc,QAAsB;AACrE,cAAM,MAAM,OAAO,WAAW,MAAM;AACpC,YAAI,WAAW,OAAO,OAAO;AAC3B;AACA,wBAAc,IAAI,KAAgC;AAAA,QACpD;AAAA,MACF;AAAA,MACA,cAAc,QAAsB;AAClC,cAAM,cAAc,MAAM;AAAA,MAC5B;AAAA,MACA,kBAAkB,QAAQ,WAAiB;AACzC,cAAM,kBAAkB,QAAQ,SAAS;AAAA,MAC3C;AAAA,MACA,SAAe;AACb,cAAM,OAAO;AAAA,MACf;AAAA,MACA,QAAc;AACZ,cAAM,MAAM;AAAA,MACd;AAAA,IACF;AACA,UAAM,UAAU,OAAO;AACvB,QAAI,cAAc,SAAS,SAAS,SAAS,QAAQ,OACnD,OAAO,kBACJ,OAAO,cAAc,YAAY,IAAI,OACrC,SAAS,cAAc,OAAO,qBAAqB,OAAO;AAC/D,kBAAc,aAAa,QAAQ,WAAW;AAC9C,QAAI;AACJ,QAAI;AACF,UAAI,SAAS,SAAS,UAAU;AAC9B,cAAM,iBAAiB,eAAe,iBAAiB,OAAO,OAAO,EAAE,QAAQ;AAC/E,YAAI,mBAAmB,QAAW;AAChC,mBAAS,cAAc,sBAAsB;AAAA,YAC3C,cAAc,OAAO;AAAA,YACrB,SAAS,SAAS;AAAA,YAClB,QAAQ,OAAO;AAAA,YACf,OAAO;AAAA,UACT,CAAC;AAAA,QACH,OAAO;AACL,mBAAS,YAAY,sBAAsB;AAAA,YACzC,cAAc,OAAO;AAAA,YACrB,MAAM;AAAA,YACN,WAAW;AAAA,YACX,SAAS,SAAS;AAAA,YAClB,QAAQ,OAAO;AAAA,YACf,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AAAA,MACF,WAAW,SAAS,SAAS,QAAQ;AACnC,iBAAS,YAAY,sBAAsB;AAAA,UACzC,cAAc,OAAO;AAAA,UACrB,MAAM;AAAA,UACN,WAAW,QAAQ,cAChB,cAAc,OAAO,WAAW,YAAY;AAAA,UAC/C,SAAS,SAAS;AAAA,UAClB,QAAQ,OAAO;AAAA,UACf,OAAO;AAAA,QACT,CAAC;AAAA,MACH,OAAO;AACL,iBAAS,gBAAgB,sBAAsB;AAAA,UAC7C,cAAc,OAAO;AAAA,UACrB,MAAM;AAAA,UACN,WAAW,OAAO;AAAA,UAClB,SAAS,SAAS;AAAA,UAClB,QAAQ,OAAO;AAAA,UACf,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF,SAAS,OAAO;AACd,+BAAyB,oBAAoB;AAC7C,YAAM,cAAc,OAAO,KAAK;AAChC,kBAAY,OAAO,UAAU,WAAW;AACxC,2BAAqB;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,SAAS;AAAA,QAClB,aAAa,SAAS;AAAA,QACtB,WAAW,UAAU;AAAA,QACrB;AAAA,MACF,CAAC;AACD,6CAAuC,CAAC,oBAAoB,YAAY;AACtE,YAAI,CAAC,QAAQ,WAAW,YAAY,QAAQ,UAAU,OAAO,SAAU;AACvE,eAAO,SAAS;AAChB,eAAO,oBAAoB;AAC3B,eAAO,oBAAoB;AAC3B,mBAAW,UAAU,cAAc,UAAU,QAAQ,GAAG,OAAO,iBAAiB;AAChF,mBAAW,UAAU,OAAO,OAAO,mBAAmB,KAAK;AAC3D,yBAAiB,UAAU,MAAM;AAAA,MACnC,CAAC;AACD;AAAA,IACF;AAEA,QAAI,YAAY,QAAQ,UAAU,OAAO,UAAU;AACjD,+BAAyB,oBAAoB;AAC7C,YAAM,cAAc,OAAO,KAAK;AAChC;AAAA,IACF;AAEA,UAAM,WAAW,OAAO,SAAS;AACjC,UAAM,gBAAgB,aAAa,UAAa,OAAO,SAAS,QAAQ,KACtE,OAAO,SAAS,QAAQ,WAAW;AACrC,qBAAiB,OAAO,UAAU,aAAa;AAC/C,0BAAsB,QAAQ,UAAU,QAAQ,eAAe,aAAa;AAE5E,UAAM,kBAAkB,OAAO,WAAW,aAAa,OAAO,SAAS,WACrE,SAAS,SAAS;AACpB,QAAI,iBAAiB;AACnB,kBAAY,OAAO,UAAU,UAAU;AAAA,IACzC,OAAO;AACL,kBAAY,OAAO,UAAU,OAAO,WAAW,WAAW,WAAW,SAAS;AAAA,IAChF;AACA,2CAAuC,CAAC,oBAAoB,YAAY;AACtE,UAAI,CAAC,QAAQ,WAAW,YAAY,QAAQ,UAAU,OAAO,UAAU;AACrE,iCAAyB,oBAAoB;AAC7C;AAAA,MACF;AACA,iCAA2B,OAAO,YAAY,oBAAoB;AAClE,aAAO,WAAW;AAClB,aAAO,eAAe;AACtB,UAAI,SAAS,SAAS,QAAQ;AAC5B,eAAO,iBAAiB;AACxB,eAAO,oBAAoB,SAAS;AAAA,MACtC;AACA,aAAO,oBAAoB;AAC3B,gCAA0B,QAAQ,UAAU,MAAM;AAClD,UAAI,iBAAiB;AACnB,eAAO,oBAAoB;AAC3B,eAAO,oBAAoB;AAC3B,mBAAW,UAAU,cAAc,UAAU,QAAQ,GAAG,OAAO,iBAAiB;AAChF,yBAAiB,UAAU,MAAM;AAAA,MACnC,WAAW,OAAO,WAAW,UAAU;AACrC,eAAO,oBAAoB;AAC3B,eAAO,oBAAoB;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,UACP,YACA,UACA,OACA,UACA,cACyB;AACzB,UAAM,eAAe,OAAO,OAAO,CAAC,CAAC;AACrC,UAAM,oBAAoB,EAAE;AAC5B,UAAM,QAAQ,OAAO,OAAO,EAAE,kBAAkB,CAAC;AACjD,QAAI;AACJ,QAAI;AACF,YAAM,QAAQ,wCAAwC,SAAS,cAAc;AAAA,QAC3E;AAAA,QACA;AAAA,QACA,WAAW,UAAU;AAAA,QACrB,SAAe;AACb,cAAI,WAAW,UAAa,CAAC,OAAO,UAAU;AAC5C,kBAAM,UAAU;AAChB,gBAAI,YAAY,OAAW,YAAW,MAAM;AAAA,gBACvC,WAAU,QAAQ,QAAQ,UAAU,QAAQ,OAAO,IAAI;AAAA,UAC9D;AAAA,QACF;AAAA,QACA,uBAA6B;AAC3B,cAAI,WAAW,UAAa,OAAO,UAAU;AAC3C,kBAAM,IAAI,MAAM,mDAAmD;AAAA,UACrE;AACA,cAAI,+BAA+B,QAAW;AAC5C,kBAAM,IAAI,MAAM,sDAAsD;AAAA,UACxE;AACA,cAAI,OAAO,WAAW,UAAU;AAC9B,kBAAM,IAAI,MAAM,iDAAiD;AAAA,UACnE;AAAA,QACF;AAAA,QACA,mBAAoD;AAClD,cAAI,WAAW,UAAa,OAAO,UAAU;AAC3C,kBAAM,IAAI,MAAM,mDAAmD;AAAA,UACrE;AACA,gBAAM,UAAU;AAChB,cAAI,YAAY,QAAW;AACzB,kBAAM,IAAI,MAAM,sDAAsD;AAAA,UACxE;AACA,iBAAO,oBAAoB,QAAQ,QAAQ,UAAU,QAAQ,KAAK;AAAA,QACpE;AAAA,MACF,GAAG,EAAE,UAAU,aAAa,CAAC;AAC7B,eAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,MAAM;AAAA,QAClB;AAAA,QACA,WAAW;AAAA,QACX,cAAc;AAAA,QACd,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,mBAAmB,SAAS;AAAA,QAC5B,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,mBAAmB;AAAA,QACnB,mBAAmB;AAAA,QACnB,UAAU;AAAA,QACV,cAAc;AAAA,QACd,oBAAoB;AAAA,MACtB;AAAA,IACF,SAAS,OAAO;AACd,kBAAY,OAAO,UAAU,WAAW;AACxC,2BAAqB,UAAU,OAAO,iBAAiB;AACvD,aAAO;AAAA,IACT;AACA,UAAM;AACN;AACA;AACA,WAAO;AAAA,EACT;AAEA,WAAS,qBACP,QACA,aACA,uBACM;AACN,QAAI,OAAO,MAAM,uBAAuB,KAAK,0BAA0B,OAAW;AAClF,2CAAuC,CAAC,WAAW,YAAY;AAC7D,UAAI,QAAQ,SAAS;AACnB,eAAO,MAAM,kBAAkB;AAC/B,+BAAuB,OAAO;AAC9B;AAAA,MACF;AACA,YAAM,wBAAwB,OAAO;AACrC,aAAO,oBAAoB;AAC3B,aAAO,oBAAoB;AAC3B,aAAO,WAAW;AAClB,UAAI,QAAQ,OAAQ,OAAM;AAC1B,UAAI,gBAAgB,OAAW,oBAAmB,YAAY;AAC9D,UAAI,CAAC,uBAAuB;AAC1B,YAAI,OAAO,MAAM,uBAAuB,EAAG,QAAO,MAAM,QAAQ;AAAA,YAC3D,QAAO,MAAM,oBAAoB;AAAA,MACxC;AACA,6BAAuB,SAAS;AAChC,UAAI,CAAC,uBAAuB;AAC1B,iCAAyB,OAAO,UAAU;AAC1C;AACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,WACP,YACA,UACA,UACA,OACM;AACN,QAAI;AACF,UAAI,aAAa,SAAS;AACxB,+CAAuC,SAAS,KAAK,KAAK;AAAA,MAC5D,OAAO;AACL,mCAA2B,OAAO;AAAA,MACpC;AAAA,IACF,SAAS,OAAO;AACd,UAAI,QAAQ,UAAa,IAAI,WAAW,UAAU;AAChD,oBAAY,OAAO,UAAU,WAAW;AAAA,MAC1C,WAAW,qBAAqB,YAAY;AAC1C,2BAAmB,IAAI;AAAA,MACzB;AACA;AAAA,QACE;AAAA,QACA;AAAA,QACA,KAAK,qBAAqB,OAAO;AAAA,MACnC;AACA;AAAA,IACF;AACA,UAAM,cAAc;AACpB,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf;AACA,QAAI,WAAW,OAAW;AAC1B,QAAI;AACJ,QAAI,gBAAgB,UAAa,CAAC,YAAY,YAC5C,YAAY,WAAW,UAAU;AACjC,8BAAwB,oBAAoB,aAAa,UAAU,KAAK;AAAA,IAC1E;AACA,gBAAY,OAAO,UAAU,WAAW;AACxC,qBAAiB,OAAO,UAAU,CAAC;AACnC,gBAAY,OAAO,UAAU,SAAS;AACtC,WAAO,eAAe;AACtB,sBAAkB,QAAQ,QAAQ;AAClC,gBAAY,MAAM;AAClB,yBAAqB,QAAQ,aAAa,qBAAqB;AAAA,EACjE;AAEA,WAAS,mBACP,YACA,SACA,UACA,OACA,UACM;AACN,QAAI,YAAY,QAAQ;AACtB,YAAM,QAAQ,wBAAwB,SAAS,OAAO;AACtD,UAAI,UAAU,QAAW;AACvB,6BAAqB,UAAU,OAAO,OAAO,gBAAgB;AAC7D;AAAA,MACF;AAAA,IACF;AACA,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,YAAY;AAAA,IACtB;AACA,QAAI,WAAW,OAAW;AAC1B,WAAO,SAAS,YAAY,YAAY,YAAY;AACpD,QAAI,YAAY,WAAW;AACzB,YAAM,WAAW,eAAe,iBAAiB,OAAO,OAAO,EAAE,QAAQ;AACzE,aAAO,YAAY;AACnB,aAAO,WAAW;AAClB,aAAO,iBAAiB;AACxB,aAAO,oBAAoB,EAAE,MAAM,QAAQ,MAAM,UAAU,WAAW,UAAU;AAChF,kBAAY,OAAO,UAAU,WAAW;AACxC,kBAAY,OAAO,UAAU,SAAS;AACtC,aAAO,eAAe;AAAA,IACxB,WAAW,YAAY,UAAU;AAC/B,aAAO,SAAS;AAChB,aAAO,oBAAoB,EAAE,MAAM,SAAS;AAC5C,kBAAY,OAAO,UAAU,WAAW;AACxC,kBAAY,OAAO,UAAU,SAAS;AACtC,aAAO,eAAe;AAAA,IACxB,OAAO;AACL,YAAM,iBAAiB,eAAe,iBAAiB,OAAO,OAAO,EAAE,QAAQ;AAC/E,aAAO,oBAAoB;AAAA,QACzB,MAAM;AAAA,QACN,MAAM,KAAK,IAAI,GAAG,mBAAmB,SAAY,WAC/C,KAAK,IAAI,UAAW,cAAc,CAAC;AAAA,MACvC;AACA,kBAAY,OAAO,UAAU,QAAQ;AAAA,IACvC;AACA,sBAAkB,QAAQ,QAAQ;AAClC,gBAAY,MAAM;AAClB,yBAAqB,QAAQ,QAAW,MAAS;AAAA,EACnD;AAEA,WAAS,QACP,SACA,YACA,UACqC;AACrC,QAAI,SAAU,QAAO;AACrB;AACA,QAAI;AACJ,oBAAgB,kBAAkB,CAAC,UAAU,OAAO,aAAa;AAC/D,sBAAgB,OAAO,aAAa;AACpC,UAAI,oBAAoB,cAAe,mBAAkB;AACzD;AACA,UAAI,YAAY,eAAe,iBAAkB;AACjD,2BAAqB;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,SAAS;AAAA,QAClB,aAAa,SAAS;AAAA,QACtB;AAAA,QACA;AAAA,QACA,WAAW,UAAU;AAAA,MACvB,CAAC;AACD,YAAM,kBAAkB;AACxB,mCAA6B,EAAE,UAAU,MAAM;AAC/C,UAAI;AACF,kCAA0B,SAAS,YAAY,UAAU,OAAO,QAAQ;AAAA,MAC1E,UAAE;AACA,qCAA6B;AAAA,MAC/B;AAAA,IACF,CAAC;AACD,oBAAgB,IAAI,aAAa;AACjC,WAAO;AAAA,EACT;AAEA,WAAS,0BACP,SACA,YACA,UACA,OACA,UACM;AAGN,QAAI,YAAY,QAAQ;AACtB,iBAAW,YAAY,UAAiC,UAAU,KAAK;AACvE;AAAA,IACF;AACA,UAAM,SAAS,KAAK,eAAe,aAAa,MAAM;AACtD,QAAI,WAAW,QAAW;AACxB,UAAI,YAAY,UAAU,YAAY,aAAa,YAAY,UAAU;AACvE;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,SAAS,WAAqB;AAAA,QAC5C;AAAA,MACF,WAAW,YAAY,UAAU;AAC/B,oBAAY,OAAO,UAAU,WAAW;AAAA,MAC1C,WAAW,YAAY,mBAAmB;AACxC,6BAAqB;AAAA,MACvB;AACA;AAAA,IACF;AACA,QAAI,OAAO,WAAW,UAAU;AAC9B,UAAI,YAAY,UAAU,YAAY,aAAa,YAAY,UAAU;AACvE,mBAAW,MAAM;AACjB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,SAAS,WAAqB;AAAA,QAC5C;AAAA,MACF,WAAW,YAAY,mBAAmB;AACxC,6BAAqB;AAAA,MACvB;AACA;AAAA,IACF;AACA,QAAI,YAAY,SAAS;AACvB,UAAI,OAAO,WAAW,UAAU;AAC9B,cAAM,iBAAiB,OAAO;AAC9B,eAAO,SAAS;AAChB,eAAO,oBAAoB;AAC3B,eAAO,oBAAoB;AAC3B,oBAAY,OAAO,UAAU,QAAQ;AACrC,+CAAuC,CAAC,oBAAoB,YAAY;AACtE,cAAI,QAAQ,WAAW,YAAY,QAAQ,UAAU,OAAO,SAAU;AACtE,iBAAO,SAAS;AAChB,sBAAY,MAAM;AAClB,kBAAQ,SAAS,OAAO,UAAU;AAAA,QACpC,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,QAAI,YAAY,UAAU;AACxB,UAAI,OAAO,WAAW,UAAU;AAC9B,cAAM,yBAAyB,OAAO;AACtC,cAAM,4BAA4B,OAAO;AACzC,eAAO,SAAS;AAChB,eAAO,iBAAiB,OAAO;AAC/B,eAAO,oBAAoB,SAAS;AACpC,oBAAY,OAAO,UAAU,SAAS;AACtC,oBAAY,MAAM;AAClB,+CAAuC,CAAC,oBAAoB,YAAY;AACtE,cAAI,QAAQ,WAAW,YAAY,QAAQ,UAAU,OAAO,SAAU;AACtE,iBAAO,SAAS;AAChB,iBAAO,iBAAiB;AACxB,iBAAO,oBAAoB;AAC3B,iBAAO,oBAAoB;AAC3B,iBAAO,oBAAoB;AAC3B,kBAAQ,UAAU,OAAO,UAAU;AAAA,QACrC,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,QAAI,YAAY,UAAU;AACxB,gBAAU,QAAQ,UAAU,KAAK;AACjC;AAAA,IACF;AACA,QAAI,YAAY,QAAQ;AACtB,YAAM,iBAAiB,eAAe,iBAAiB,OAAO,OAAO,EAAE,QAAQ;AAC/E,YAAM,OAAO,KAAK,IAAI,GAAG,mBAAmB,SAAY,WACtD,KAAK,IAAI,UAAoB,cAAc,CAAC;AAC9C,aAAO,oBAAoB,EAAE,MAAM,QAAQ,KAAK;AAChD,aAAO,iBAAiB;AACxB,aAAO,oBAAoB,SAAS;AACpC,kBAAY,MAAM;AAClB;AAAA,IACF;AACA,QAAI,YAAY,WAAW;AACzB,aAAO,YAAY,OAAO,cAAc,YAAY,YAAY;AAChE,aAAO,iBAAiB,OAAO;AAC/B,aAAO,oBAAoB,SAAS;AACpC,UAAI,OAAO,WAAW,UAAW,aAAY,MAAM;AACnD;AAAA,IACF;AACA,QAAI,YAAY,mBAAmB;AACjC,2BAAqB;AACrB,aAAO,eAAe;AACtB,aAAO,iBAAiB,OAAO;AAC/B,aAAO,oBAAoB,SAAS;AACpC;AAAA,IACF;AACA,UAAM,cAAc,wBAAwB,OAAO,SAAS,QAAQ;AACpE,QAAI,gBAAgB,UAClB,2BAA2B,OAAO,UAAU,EAAE,qBAAqB,QAAW;AAC9E,2BAAqB,UAAU,aAAa,OAAO,iBAAiB;AACpE;AAAA,IACF;AACA,WAAO,oBAAoB,EAAE,MAAM,SAAS;AAC5C,gBAAY,MAAM;AAAA,EACpB;AAEA,QAAM,SAAwB,OAAO,OAAO;AAAA,IAC1C,QAAQ,OAAO,WAAW;AAAA,IAC1B,aAAa,YAAY,WAAW;AAAA,IACpC,KAAK,cAA2D,CAAC,GAAS;AACxE,UAAI,SAAU;AACd,YAAM,WAAW,YAAY,YAAY,QAAQ,YAAY;AAC7D,UAAI,aAAa,WAAW,aAAa,WAAW;AAClD,cAAM,IAAI,UAAU,iEAAiE;AAAA,MACvF;AACA,YAAM,aAAa,EAAE;AACrB,cAAQ,QAAQ,YAAY,QAAQ;AAAA,IACtC;AAAA,IACA,QAAc;AACZ,cAAQ,SAAS,gBAAgB;AAAA,IACnC;AAAA,IACA,SAAe;AACb,cAAQ,UAAU,gBAAgB;AAAA,IACpC;AAAA,IACA,SAAe;AACb,cAAQ,UAAU,gBAAgB;AAAA,IACpC;AAAA,IACA,SAAe;AACb,cAAQ,UAAU,gBAAgB;AAAA,IACpC;AAAA,IACA,KAAK,cAA4B;AAC/B,UAAI,SAAU;AACd,UAAI,CAAC,OAAO,SAAS,YAAY,GAAG;AAClC,cAAM,IAAI,WAAW,oDAAoD;AAAA,MAC3E;AACA,cAAQ,QAAQ,kBAAkB,YAAY;AAAA,IAChD;AAAA,IACA,UAAgB;AACd,cAAQ,WAAW,gBAAgB;AAAA,IACrC;AAAA,IACA,gBAAgB,MAAoB;AAClC,UAAI,SAAU;AACd,UAAI,CAAC,OAAO,SAAS,IAAI,KAAK,QAAQ,GAAG;AACvC,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,cAAQ,mBAAmB,kBAAkB,IAAI;AAAA,IACnD;AAAA,EACF,CAAC;AAED,SAAO,OAAO,OAAO;AAAA,IACnB;AAAA,IACA,MAAM,aAAoC,cAAoC,CAAC,GAAS;AACtF,UAAI,SAAU;AACd,YAAM,YAAY,oCAAoC,aAAa,WAAW;AAC9E,gBAAU,UAAU;AACpB,gBAAU,UAAU;AAAA,IACtB;AAAA,IACA,0BAAoD;AAClD,YAAM,SAAS;AACf,UAAI,YAAY,WAAW,UAAa,OAAO,SAAU,QAAO;AAChE,YAAM,gBAAgB,iBAAiB,OAAO,OAAO;AACrD,UAAI,cAAc,SAAS,QAAS,QAAO;AAC3C,YAAM,mBAAmB,oBAAoB,cAAc,UAAU;AACrE,UAAI,iBAAiB,SAAS,SAAU,QAAO;AAC/C,aAAO,aAAa,kBAAkB,OAAO,WAAW,GAAI;AAAA,IAC9D;AAAA,IACA,SAAS,aAAoC,cAAoC,CAAC,GAAS;AACzF,UAAI,SAAU;AACd,YAAM,YAAY,oCAAoC,aAAa,WAAW;AAC9E,gBAAU,UAAU;AACpB,gBAAU,UAAU;AACpB,UAAI,oBAAoB,QAAW;AACjC,wBAAgB,OAAO;AACvB,YAAI,gBAAgB,OAAO,eAAe,EAAG;AAAA,MAC/C;AACA,YAAM,aAAa,EAAE;AACrB,wBAAkB,QAAQ,QAAQ,YAAY,SAAS;AAAA,IACzD;AAAA,IACA,UAAgB;AACd,UAAI,SAAU;AACd,iBAAW;AACX;AACA,iBAAW,iBAAiB,iBAAiB;AAC3C,sBAAc,OAAO;AACrB;AAAA,MACF;AACA,sBAAgB,MAAM;AACtB,wBAAkB;AAClB,UAAI,QAAQ,OAAW,YAAW,GAAG;AACrC,UAAI,aAAa,QAAW;AAC1B,4BAAoB,SAAS,OAAO;AACpC,iBAAS,OAAO,SAAS;AACzB,iBAAS,OAAO,SAAS;AACzB,iBAAS,aAAa,MAAM;AAAA,MAC9B;AACA,YAAM,iBAAiB,uBAAuB,EAAE;AAChD,UAAI,mBAAmB,aAAa,mBAAmB,UAAU;AAC/D,eAAO,IAAI,UAAU;AAAA,MACvB,OAAO;AACL,0BAAkB,CAAC,UAAU,UAAU;AACrC,gBAAM,MAAM,QAAQ,YAAY,cAAc;AAC9C,+BAAqB;AAAA,YACnB,MAAM;AAAA,YACN,SAAS,SAAS;AAAA,YAClB,aAAa,SAAS;AAAA,YACtB,WAAW,UAAU;AAAA,YACrB,QAAQ;AAAA,YACR,SAAS;AAAA,UACX,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACH;",
4
+ "sourcesContent": ["import {\n getSignalNode,\n signal,\n type SignalCommitBatch,\n} from '../signals/graph.js';\nimport type { WritableSignal } from '../signals/types.js';\nimport {\n queueBeginCommand,\n queueCurrentFrameCommitAcknowledgement,\n queueCurrentFrameCompletion,\n queueCurrentFrameOrderedPlaybackCompletion,\n recordSchedulerTrace,\n registerAdvanceParticipant,\n snapshotRealmScheduler,\n} from '../scheduler/realm-scheduler.js';\nimport type {\n PibblBeginCommandHandle,\n PibblFrameSnapshot,\n} from '../scheduler/types.js';\nimport { getDefinitionRecord } from './definition.js';\nimport { sampleSpring, type SpringSample } from './spring.js';\nimport {\n adoptProgramActivationFork,\n evaluateProgram,\n finishProgram,\n forkProgramActivation,\n getProgramActivationRecord,\n preflightProgramActivation,\n releaseProgramActivation,\n seekProgram,\n type ProgramActivation,\n type ProgramEvaluationResult,\n} from './evaluate.js';\nimport { getProgramRecord, type ProgramDuration } from './program.js';\nimport type {\n PibblAnimationProgram,\n PibblPlayback,\n PibblPlaybackEvent,\n PibblPlaybackOptions,\n PibblPlaybackStatus,\n} from './types.js';\nimport {\n acquireTransactionalProgramWriterLeases,\n preflightProgramWriterLeaseAcquisition,\n type AnimationWriterLeaseReplacement,\n type TransactionalProgramWriterLease,\n} from './writer-leases.js';\n\ntype PlaybackCommandName =\n | 'play'\n | 'pause'\n | 'resume'\n | 'cancel'\n | 'finish'\n | 'seek'\n | 'reverse'\n | 'setPlaybackRate';\n\ntype PendingEvaluation =\n | {\n readonly kind: 'seek';\n readonly time: number;\n readonly direction?: 'forward' | 'reverse';\n }\n | { readonly kind: 'finish' };\n\ninterface PlaybackRun {\n readonly generation: number;\n readonly registration: object;\n readonly registrationOrder: number;\n readonly token: object;\n readonly lease: TransactionalProgramWriterLease;\n readonly activation: ProgramActivation;\n readonly program: PibblAnimationProgram;\n direction: 'forward' | 'reverse';\n playbackRate: number;\n position: number;\n anchorPosition: number;\n anchorLogicalTime: number;\n previousTime: number | undefined;\n status: 'running' | 'paused' | 'ending';\n pendingEvaluation: PendingEvaluation | undefined;\n unregisterAdvance: (() => void) | undefined;\n released: boolean;\n startPending: boolean;\n startQueuedFrameId: number | undefined;\n}\n\ninterface PendingTraceWrite {\n readonly signal: WritableSignal<unknown>;\n readonly version: number;\n readonly target: string;\n}\n\ninterface FrameDelivery {\n readonly frameId: number;\n readonly logicalTime: number;\n readonly events: Array<{\n readonly event: PibblPlaybackEvent;\n readonly registrationOrder: number;\n }>;\n readonly errors: Array<{\n readonly error: unknown;\n readonly registrationOrder: number;\n readonly commitRequired: boolean;\n }>;\n readonly terminalRuns: Set<PlaybackRun>;\n readonly writes: PendingTraceWrite[];\n commitApplied: boolean;\n}\n\nexport interface AnimationPlaybackSnapshot {\n readonly activePlaybacks: number;\n readonly createdPlaybacks: number;\n readonly releasedPlaybacks: number;\n readonly queuedCommands: number;\n readonly queuedMilestones: number;\n readonly outputStageAttempts: number;\n}\n\n/** Internal root lifetime used to revoke a deferred disposal publication. */\ninterface DeferredStatusCommandOwner {\n add(teardown: () => void): void;\n remove(teardown: () => void): void;\n}\n\nexport interface AnimationPlaybackController {\n readonly handle: PibblPlayback;\n adopt(program: PibblAnimationProgram, options?: PibblPlaybackOptions): void;\n committedSpringSnapshot(): SpringSample | undefined;\n retarget(program: PibblAnimationProgram, options?: PibblPlaybackOptions): void;\n /** @internal Associates render-phase disposal work with the owning root. */\n setDeferredStatusCommandOwner(owner: DeferredStatusCommandOwner): void;\n dispose(): void;\n}\n\nexport interface AnimationPlaybackCandidate {\n readonly program: PibblAnimationProgram;\n readonly options: PibblPlaybackOptions;\n}\n\nlet nextPlaybackRegistrationOrder = 0;\nlet activePlaybacks = 0;\nlet createdPlaybacks = 0;\nlet releasedPlaybacks = 0;\nlet queuedCommands = 0;\nlet queuedMilestones = 0;\nlet outputStageAttempts = 0;\nlet activePlaybackBeginContext: {\n readonly snapshot: PibblFrameSnapshot;\n readonly batch: SignalCommitBatch;\n} | undefined;\n\n/** @internal Deterministic resource counters for tests and diagnostics. */\nexport function animationPlaybackSnapshot(): AnimationPlaybackSnapshot {\n return Object.freeze({\n activePlaybacks,\n createdPlaybacks,\n releasedPlaybacks,\n queuedCommands,\n queuedMilestones,\n outputStageAttempts,\n });\n}\n\nfunction freezePath(path: readonly number[]): readonly number[] {\n return Object.freeze([...path]);\n}\n\nfunction playbackEvent(\n type: PibblPlaybackEvent['type'],\n snapshot: PibblFrameSnapshot,\n programPath: readonly number[] = [],\n iteration = 0,\n marker?: string,\n): PibblPlaybackEvent {\n return Object.freeze({\n type,\n logicalTime: snapshot.logicalTime,\n frameId: snapshot.frameId,\n programPath: freezePath(programPath),\n iteration,\n ...(marker === undefined ? {} : { marker }),\n });\n}\n\nfunction validateOptions(options: PibblPlaybackOptions): void {\n if (options.conflict !== undefined &&\n options.conflict !== 'error' && options.conflict !== 'replace') {\n throw new TypeError('Pibbl animation playback conflict must be \"error\" or \"replace\".');\n }\n if (options.debugName !== undefined &&\n (typeof options.debugName !== 'string' || options.debugName.length === 0)) {\n throw new TypeError('Pibbl animation playback debugName must be nonempty when provided.');\n }\n if (options.onEvent !== undefined && typeof options.onEvent !== 'function') {\n throw new TypeError('Pibbl animation playback onEvent must be a function.');\n }\n if (options.onError !== undefined && typeof options.onError !== 'function') {\n throw new TypeError('Pibbl animation playback onError must be a function.');\n }\n}\n\n/** @internal Creates one validated immutable render-time playback candidate. */\nexport function normalizeAnimationPlaybackCandidate(\n program: PibblAnimationProgram,\n options: PibblPlaybackOptions = {},\n): AnimationPlaybackCandidate {\n getProgramRecord(program);\n const normalizedOptions = Object.freeze({ ...options });\n validateOptions(normalizedOptions);\n return Object.freeze({ program, options: normalizedOptions });\n}\n\nfunction firstStepperName(program: PibblAnimationProgram): string | undefined {\n const record = getProgramRecord(program);\n if (record.kind === 'track') {\n const definition = getDefinitionRecord(record.definition);\n return definition.kind === 'stepper' ? definition.debugName : undefined;\n }\n for (const child of record.children) {\n const name = firstStepperName(child);\n if (name !== undefined) return name;\n }\n return undefined;\n}\n\nfunction unavailableControlError(\n program: PibblAnimationProgram,\n control: 'reverse' | 'finish',\n): Error | undefined {\n const duration = getProgramRecord(program).duration;\n if (duration.kind === 'infinite') {\n return new TypeError(\n `Pibbl animation program is infinite; ${control} is unavailable.`,\n );\n }\n if (duration.kind === 'unresolved-stepper') {\n const name = firstStepperName(program);\n const label = name === undefined ? 'Pibbl animation stateful program' :\n `Pibbl animation stepper \"${name}\"`;\n return new TypeError(\n `${label} terminal time is not discovered; ${control} is unavailable.`,\n );\n }\n return undefined;\n}\n\nfunction finiteDuration(duration: ProgramDuration): number | undefined {\n return duration.kind === 'finite' ? duration.milliseconds : undefined;\n}\n\n/**\n * Creates one scheduler-owned playback slot. Component lifetime is added by\n * usePlayback in the following implementation task.\n */\nexport function createAnimationPlaybackController(\n initialProgram: PibblAnimationProgram,\n initialOptions: PibblPlaybackOptions = {},\n): AnimationPlaybackController {\n const initialCandidate = normalizeAnimationPlaybackCandidate(\n initialProgram,\n initialOptions,\n );\n\n let program = initialCandidate.program;\n let options = initialCandidate.options;\n let disposed = false;\n let queuedGeneration = 0;\n let run: PlaybackRun | undefined;\n let storedPlaybackRate = 1;\n let delivery: FrameDelivery | undefined;\n let pendingRetarget: PibblBeginCommandHandle | undefined;\n let deferredStatusCommandOwner: DeferredStatusCommandOwner | undefined;\n const pendingCommands = new Set<PibblBeginCommandHandle>();\n const metadataWriter = Object.freeze({ name: 'Pibbl playback metadata' });\n const status = signal<PibblPlaybackStatus>('idle', {\n debugName: options.debugName === undefined ? undefined : `${options.debugName} status`,\n });\n const currentTime = signal(0, {\n debugName: options.debugName === undefined ? undefined : `${options.debugName} current time`,\n });\n\n function debugName(): string | undefined {\n return options.debugName;\n }\n\n function ensureDelivery(snapshot: PibblFrameSnapshot): FrameDelivery {\n if (delivery?.frameId === snapshot.frameId) return delivery;\n const current: FrameDelivery = {\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n events: [],\n errors: [],\n terminalRuns: new Set(),\n writes: [],\n commitApplied: false,\n };\n delivery = current;\n queueCurrentFrameCommitAcknowledgement((_snapshot, outcome) => {\n current.commitApplied = outcome.applied;\n });\n queueCurrentFrameCompletion(() => {\n if (delivery === current) delivery = undefined;\n if (!current.commitApplied) {\n queuedMilestones -= current.events.length;\n } else {\n for (const terminalRun of current.terminalRuns) releaseRun(terminalRun);\n\n for (const write of current.writes) {\n const node = getSignalNode(write.signal);\n recordSchedulerTrace({\n kind: 'animation-write',\n frameId: current.frameId,\n logicalTime: current.logicalTime,\n debugName: debugName(),\n target: write.target,\n outcome: node.version === write.version ?\n 'equality-suppressed' : 'staged',\n });\n }\n\n for (const { event, registrationOrder } of current.events) {\n queueCurrentFrameOrderedPlaybackCompletion(registrationOrder, () => {\n queuedMilestones--;\n if (!disposed) options.onEvent?.(event);\n });\n }\n }\n for (const { error, registrationOrder, commitRequired } of current.errors) {\n if (commitRequired && !current.commitApplied) continue;\n queueCurrentFrameOrderedPlaybackCompletion(registrationOrder, () => {\n if (disposed) return;\n if (options.onError) options.onError(error);\n else throw error;\n });\n }\n });\n return current;\n }\n\n function queueEvent(\n snapshot: PibblFrameSnapshot,\n event: PibblPlaybackEvent,\n registrationOrder: number,\n ): void {\n const frame = ensureDelivery(snapshot);\n frame.events.push({ event, registrationOrder });\n queuedMilestones++;\n recordSchedulerTrace({\n kind: 'animation-milestone',\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n debugName: debugName(),\n event: event.type,\n programPath: event.programPath,\n iteration: event.iteration,\n });\n }\n\n function queueError(\n snapshot: PibblFrameSnapshot,\n error: unknown,\n registrationOrder: number,\n trace = true,\n commitRequired = true,\n ): void {\n ensureDelivery(snapshot).errors.push({ error, registrationOrder, commitRequired });\n if (trace) {\n recordSchedulerTrace({\n kind: 'animation-error',\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n debugName: debugName(),\n error,\n });\n }\n }\n\n function queueDiagnosticError(\n snapshot: PibblFrameSnapshot,\n error: unknown,\n registrationOrder: number,\n ): void {\n queueError(snapshot, error, registrationOrder, true, false);\n }\n\n function queuePendingStart(target: PlaybackRun, snapshot: PibblFrameSnapshot): void {\n if (!target.startPending || target.startQueuedFrameId === snapshot.frameId) return;\n target.startQueuedFrameId = snapshot.frameId;\n queueEvent(snapshot, playbackEvent('start', snapshot), target.registrationOrder);\n queueCurrentFrameCommitAcknowledgement((_committedSnapshot, outcome) => {\n if (outcome.applied && !target.released) target.startPending = false;\n });\n }\n\n function stage<T>(\n batch: SignalCommitBatch,\n snapshot: PibblFrameSnapshot,\n target: WritableSignal<T>,\n value: T,\n label: string,\n ): void {\n const node = getSignalNode(target);\n ensureDelivery(snapshot).writes.push({\n signal: target as WritableSignal<unknown>,\n version: node.version,\n target: label,\n });\n batch.stage(target, value, metadataWriter);\n }\n\n function stageStatus(\n batch: SignalCommitBatch,\n snapshot: PibblFrameSnapshot,\n value: PibblPlaybackStatus,\n ): void {\n stage(batch, snapshot, status, value, 'status');\n }\n\n function stageCurrentTime(\n batch: SignalCommitBatch,\n snapshot: PibblFrameSnapshot,\n value: number,\n ): void {\n stage(batch, snapshot, currentTime, value, 'currentTime');\n }\n\n function releaseRun(target: PlaybackRun): void {\n if (target.released) return;\n target.released = true;\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n target.lease.release();\n releaseProgramActivation(target.activation);\n activePlaybacks--;\n releasedPlaybacks++;\n if (run === target) run = undefined;\n }\n\n function scheduleTerminal(snapshot: PibblFrameSnapshot, target: PlaybackRun): void {\n ensureDelivery(snapshot).terminalRuns.add(target);\n }\n\n function cancelRun(\n target: PlaybackRun,\n snapshot: PibblFrameSnapshot,\n batch: SignalCommitBatch,\n releaseImmediately = false,\n ): void {\n if (target.status === 'ending') return;\n queuePendingStart(target, snapshot);\n const previousStatus = target.status;\n target.status = 'ending';\n stageStatus(batch, snapshot, 'cancelled');\n queueEvent(snapshot, playbackEvent('cancel', snapshot), target.registrationOrder);\n if (releaseImmediately) {\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n scheduleTerminal(snapshot, target);\n releaseRun(target);\n return;\n }\n queueCurrentFrameCommitAcknowledgement((_committedSnapshot, outcome) => {\n if (disposed || run !== target || target.released) return;\n if (!outcome.applied) {\n target.status = previousStatus;\n enqueue('cancel', target.generation);\n return;\n }\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n scheduleTerminal(snapshot, target);\n });\n }\n\n function beginRunReplacement(\n target: PlaybackRun,\n snapshot: PibblFrameSnapshot,\n batch: SignalCommitBatch,\n ): AnimationWriterLeaseReplacement {\n if (target.status === 'ending' || target.released) {\n throw new Error('Pibbl animation playback run is already ending.');\n }\n const previousStatus = target.status;\n const previousStartPending = target.startPending;\n const wasRegistered = target.unregisterAdvance !== undefined;\n queuePendingStart(target, snapshot);\n target.status = 'ending';\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n stageStatus(batch, snapshot, 'cancelled');\n queueEvent(snapshot, playbackEvent('cancel', snapshot), target.registrationOrder);\n let pending = true;\n return Object.freeze({\n commit(): void {\n if (!pending) return;\n pending = false;\n scheduleTerminal(snapshot, target);\n },\n rollback(): void {\n if (!pending) return;\n pending = false;\n if (target.released) return;\n if (disposed) {\n releaseRun(target);\n return;\n }\n target.status = previousStatus;\n target.startPending = previousStartPending;\n if (wasRegistered) registerRun(target);\n },\n });\n }\n\n function queueEvaluationTraces(\n target: PlaybackRun,\n snapshot: PibblFrameSnapshot,\n result: ProgramEvaluationResult,\n stagedOutputs: ReadonlySet<WritableSignal<unknown>>,\n sampledTime: number,\n ): void {\n recordSchedulerTrace({\n kind: 'animation-sample',\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n registrationOrder: target.registrationOrder,\n debugName: debugName(),\n localTime: sampledTime,\n direction: target.direction,\n });\n for (const output of stagedOutputs) {\n ensureDelivery(snapshot).writes.push({\n signal: output,\n version: getSignalNode(output).version,\n target: getSignalNode(output).debugName ?? '<unnamed signal>',\n });\n }\n for (const trace of result.steppers) {\n recordSchedulerTrace({\n kind: 'animation-stepper',\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n debugName: debugName(),\n programPath: trace.programPath,\n repeatIterations: trace.repeatIterations,\n appliedSteps: trace.appliedSteps,\n retainedRemainderMilliseconds: trace.retainedRemainderMilliseconds,\n clampedElapsedMilliseconds: trace.clampedElapsedMilliseconds,\n discardedElapsedMilliseconds: trace.discardedElapsedMilliseconds,\n });\n }\n }\n\n function queueEvaluationMilestones(\n target: PlaybackRun,\n snapshot: PibblFrameSnapshot,\n result: ProgramEvaluationResult,\n ): void {\n for (const milestone of result.milestones) {\n queueEvent(snapshot, playbackEvent(\n milestone.kind,\n snapshot,\n milestone.programPath,\n milestone.iteration,\n milestone.kind === 'marker' ? milestone.marker : undefined,\n ), target.registrationOrder);\n }\n }\n\n function clampRunTime(target: PlaybackRun, candidate: number): number {\n const record = getProgramActivationRecord(target.activation);\n const knownDuration = record.terminalDuration ??\n finiteDuration(getProgramRecord(target.program).duration);\n return Math.max(0, knownDuration === undefined ? candidate :\n Math.min(candidate, knownDuration));\n }\n\n function registerRun(target: PlaybackRun): void {\n if (target.unregisterAdvance !== undefined || target.released) return;\n target.unregisterAdvance = registerAdvanceParticipant((snapshot, batch) => {\n if (disposed || run !== target || target.released || target.status === 'ending') return;\n advanceRun(target, snapshot, batch);\n }, 'animation');\n }\n\n function advanceRun(\n target: PlaybackRun,\n snapshot: PibblFrameSnapshot,\n batch: SignalCommitBatch,\n ): void {\n queuePendingStart(target, snapshot);\n const evaluationActivation = forkProgramActivation(target.activation);\n const stagedOutputs = new Set<WritableSignal<unknown>>();\n const evaluationBatch: SignalCommitBatch = {\n read<T>(value: WritableSignal<T>): T {\n return batch.read(value);\n },\n stage<T>(value: WritableSignal<T>, nextValue: T, writer: object): void {\n batch.stage(value, nextValue, writer);\n if (writer === target.token) {\n outputStageAttempts++;\n stagedOutputs.add(value as WritableSignal<unknown>);\n }\n },\n discardWriter(writer: object): void {\n batch.discardWriter(writer);\n },\n registerLifecycle(writer, lifecycle): void {\n batch.registerLifecycle(writer, lifecycle);\n },\n commit(): void {\n batch.commit();\n },\n clear(): void {\n batch.clear();\n },\n };\n const pending = target.pendingEvaluation;\n let destination = pending?.kind === 'seek' ? pending.time :\n target.anchorPosition +\n (target.direction === 'forward' ? 1 : -1) *\n (snapshot.logicalTime - target.anchorLogicalTime) * target.playbackRate;\n destination = clampRunTime(target, destination);\n let result: ProgramEvaluationResult;\n try {\n if (pending?.kind === 'finish') {\n const staticDuration = finiteDuration(getProgramRecord(target.program).duration);\n if (staticDuration === undefined) {\n result = finishProgram(evaluationActivation, {\n previousTime: target.previousTime,\n frameId: snapshot.frameId,\n writer: target.token,\n batch: evaluationBatch,\n });\n } else {\n result = seekProgram(evaluationActivation, {\n previousTime: target.previousTime,\n time: staticDuration,\n direction: 'forward',\n frameId: snapshot.frameId,\n writer: target.token,\n batch: evaluationBatch,\n });\n }\n } else if (pending?.kind === 'seek') {\n result = seekProgram(evaluationActivation, {\n previousTime: target.previousTime,\n time: destination,\n direction: pending.direction ??\n (destination < target.position ? 'reverse' : 'forward'),\n frameId: snapshot.frameId,\n writer: target.token,\n batch: evaluationBatch,\n });\n } else {\n result = evaluateProgram(evaluationActivation, {\n previousTime: target.previousTime,\n time: destination,\n direction: target.direction,\n frameId: snapshot.frameId,\n writer: target.token,\n batch: evaluationBatch,\n });\n }\n } catch (error) {\n releaseProgramActivation(evaluationActivation);\n batch.discardWriter(target.token);\n stageStatus(batch, snapshot, 'cancelled');\n recordSchedulerTrace({\n kind: 'animation-error',\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n debugName: debugName(),\n error,\n });\n queueCurrentFrameCommitAcknowledgement((_committedSnapshot, outcome) => {\n if (!outcome.applied || disposed || run !== target || target.released) return;\n target.status = 'ending';\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n queueEvent(snapshot, playbackEvent('cancel', snapshot), target.registrationOrder);\n queueError(snapshot, error, target.registrationOrder, false);\n scheduleTerminal(snapshot, target);\n });\n return;\n }\n\n if (disposed || run !== target || target.released) {\n releaseProgramActivation(evaluationActivation);\n batch.discardWriter(target.token);\n return;\n }\n\n const duration = result.terminal.duration;\n const presentedTime = duration !== undefined && Number.isFinite(duration) &&\n result.terminal.atEnd ? duration : destination;\n stageCurrentTime(batch, snapshot, presentedTime);\n queueEvaluationTraces(target, snapshot, result, stagedOutputs, presentedTime);\n\n const terminalReached = target.status === 'running' && result.terminal.reached ||\n pending?.kind === 'finish';\n if (terminalReached) {\n stageStatus(batch, snapshot, 'finished');\n } else {\n stageStatus(batch, snapshot, target.status === 'paused' ? 'paused' : 'running');\n }\n queueCurrentFrameCommitAcknowledgement((_committedSnapshot, outcome) => {\n if (!outcome.applied || disposed || run !== target || target.released) {\n releaseProgramActivation(evaluationActivation);\n return;\n }\n adoptProgramActivationFork(target.activation, evaluationActivation);\n target.position = presentedTime;\n target.previousTime = presentedTime;\n if (pending?.kind === 'seek') {\n target.anchorPosition = presentedTime;\n target.anchorLogicalTime = snapshot.logicalTime;\n }\n target.pendingEvaluation = undefined;\n queueEvaluationMilestones(target, snapshot, result);\n if (terminalReached) {\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n queueEvent(snapshot, playbackEvent('finish', snapshot), target.registrationOrder);\n scheduleTerminal(snapshot, target);\n } else if (target.status === 'paused') {\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n }\n });\n }\n\n function createRun(\n generation: number,\n snapshot: PibblFrameSnapshot,\n batch: SignalCommitBatch,\n conflict: 'error' | 'replace',\n ignoredToken?: object,\n ): PlaybackRun | undefined {\n const registration = Object.freeze({});\n const registrationOrder = ++nextPlaybackRegistrationOrder;\n const token = Object.freeze({ registrationOrder });\n let target!: PlaybackRun;\n try {\n const lease = acquireTransactionalProgramWriterLeases(program, registration, {\n token,\n registrationOrder,\n debugName: debugName(),\n cancel(): void {\n if (target !== undefined && !target.released) {\n const context = activePlaybackBeginContext;\n if (context === undefined) releaseRun(target);\n else cancelRun(target, context.snapshot, context.batch, true);\n }\n },\n preflightReplacement(): void {\n if (target === undefined || target.released) {\n throw new Error('Pibbl animation replacement owner is unavailable.');\n }\n if (activePlaybackBeginContext === undefined) {\n throw new Error('Pibbl animation replacement must begin during Begin.');\n }\n if (target.status === 'ending') {\n throw new Error('Pibbl animation playback run is already ending.');\n }\n },\n beginReplacement(): AnimationWriterLeaseReplacement {\n if (target === undefined || target.released) {\n throw new Error('Pibbl animation replacement owner is unavailable.');\n }\n const context = activePlaybackBeginContext;\n if (context === undefined) {\n throw new Error('Pibbl animation replacement must begin during Begin.');\n }\n return beginRunReplacement(target, context.snapshot, context.batch);\n },\n }, { conflict, ignoredToken });\n target = {\n generation,\n registration,\n registrationOrder,\n token,\n lease,\n activation: lease.activation,\n program,\n direction: 'forward',\n playbackRate: storedPlaybackRate,\n position: 0,\n anchorPosition: 0,\n anchorLogicalTime: snapshot.logicalTime,\n previousTime: undefined,\n status: 'running',\n pendingEvaluation: undefined,\n unregisterAdvance: undefined,\n released: false,\n startPending: false,\n startQueuedFrameId: undefined,\n };\n } catch (error) {\n stageStatus(batch, snapshot, 'cancelled');\n queueDiagnosticError(snapshot, error, registrationOrder);\n return undefined;\n }\n run = target;\n activePlaybacks++;\n createdPlaybacks++;\n return target;\n }\n\n function settleProvisionalRun(\n target: PlaybackRun,\n previousRun: PlaybackRun | undefined,\n additionalReplacement: AnimationWriterLeaseReplacement | undefined,\n ): void {\n if (target.lease.replacedOwnerCount === 0 && additionalReplacement === undefined) return;\n queueCurrentFrameCommitAcknowledgement((_snapshot, outcome) => {\n if (outcome.applied) {\n target.lease.commitReplacement();\n additionalReplacement?.commit();\n return;\n }\n const targetAlreadyReleased = target.released;\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n target.released = true;\n if (run === target) run = previousRun;\n if (previousRun !== undefined) queuedGeneration = previousRun.generation;\n if (!targetAlreadyReleased) {\n if (target.lease.replacedOwnerCount === 0) target.lease.release();\n else target.lease.rollbackReplacement();\n }\n additionalReplacement?.rollback();\n if (!targetAlreadyReleased) {\n releaseProgramActivation(target.activation);\n activePlaybacks--;\n releasedPlaybacks++;\n }\n });\n }\n\n function acceptPlay(\n generation: number,\n conflict: 'error' | 'replace',\n snapshot: PibblFrameSnapshot,\n batch: SignalCommitBatch,\n ): void {\n try {\n if (conflict === 'error') {\n preflightProgramWriterLeaseAcquisition(program, run?.token);\n } else {\n preflightProgramActivation(program);\n }\n } catch (error) {\n if (run === undefined || run.status === 'ending') {\n stageStatus(batch, snapshot, 'cancelled');\n } else if (queuedGeneration === generation) {\n queuedGeneration = run.generation;\n }\n queueDiagnosticError(\n snapshot,\n error,\n run?.registrationOrder ?? Number.MAX_SAFE_INTEGER,\n );\n return;\n }\n const previousRun = run;\n const target = createRun(\n generation,\n snapshot,\n batch,\n conflict,\n previousRun?.token,\n );\n if (target === undefined) return;\n let additionalReplacement: AnimationWriterLeaseReplacement | undefined;\n if (previousRun !== undefined && !previousRun.released &&\n previousRun.status !== 'ending') {\n additionalReplacement = beginRunReplacement(previousRun, snapshot, batch);\n }\n stageStatus(batch, snapshot, 'scheduled');\n stageCurrentTime(batch, snapshot, 0);\n stageStatus(batch, snapshot, 'running');\n target.startPending = true;\n queuePendingStart(target, snapshot);\n registerRun(target);\n settleProvisionalRun(target, previousRun, additionalReplacement);\n }\n\n function acceptFreshControl(\n generation: number,\n command: 'seek' | 'reverse' | 'finish',\n snapshot: PibblFrameSnapshot,\n batch: SignalCommitBatch,\n seekTime?: number,\n ): void {\n if (command !== 'seek') {\n const error = unavailableControlError(program, command);\n if (error !== undefined) {\n queueDiagnosticError(snapshot, error, Number.MAX_SAFE_INTEGER);\n return;\n }\n }\n const target = createRun(\n generation,\n snapshot,\n batch,\n options.conflict ?? 'error',\n );\n if (target === undefined) return;\n target.status = command === 'reverse' ? 'running' : 'paused';\n if (command === 'reverse') {\n const duration = finiteDuration(getProgramRecord(target.program).duration)!;\n target.direction = 'reverse';\n target.position = duration;\n target.anchorPosition = duration;\n target.pendingEvaluation = { kind: 'seek', time: duration, direction: 'reverse' };\n stageStatus(batch, snapshot, 'scheduled');\n stageStatus(batch, snapshot, 'running');\n target.startPending = true;\n } else if (command === 'finish') {\n target.status = 'running';\n target.pendingEvaluation = { kind: 'finish' };\n stageStatus(batch, snapshot, 'scheduled');\n stageStatus(batch, snapshot, 'running');\n target.startPending = true;\n } else {\n const staticDuration = finiteDuration(getProgramRecord(target.program).duration);\n target.pendingEvaluation = {\n kind: 'seek',\n time: Math.max(0, staticDuration === undefined ? seekTime! :\n Math.min(seekTime!, staticDuration)),\n };\n stageStatus(batch, snapshot, 'paused');\n }\n queuePendingStart(target, snapshot);\n registerRun(target);\n settleProvisionalRun(target, undefined, undefined);\n }\n\n function enqueue(\n command: PlaybackCommandName,\n generation: number,\n argument?: number | 'error' | 'replace',\n ): PibblBeginCommandHandle | undefined {\n if (disposed) return undefined;\n queuedCommands++;\n let commandHandle!: PibblBeginCommandHandle;\n commandHandle = queueBeginCommand((snapshot, batch, sequence) => {\n pendingCommands.delete(commandHandle);\n if (pendingRetarget === commandHandle) pendingRetarget = undefined;\n queuedCommands--;\n if (disposed || generation !== queuedGeneration) return;\n recordSchedulerTrace({\n kind: 'animation-command',\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n sequence,\n command,\n debugName: debugName(),\n });\n const previousContext = activePlaybackBeginContext;\n activePlaybackBeginContext = { snapshot, batch };\n try {\n acceptCommandWithoutTrace(command, generation, snapshot, batch, argument);\n } finally {\n activePlaybackBeginContext = previousContext;\n }\n });\n pendingCommands.add(commandHandle);\n return commandHandle;\n }\n\n function stageDisposedAfterRender(): void {\n let command!: PibblBeginCommandHandle;\n let revokeFromOwner: (() => void) | undefined;\n command = queueBeginCommand((snapshot, batch) => {\n try {\n batch.stage(status, 'disposed', metadataWriter);\n recordSchedulerTrace({\n kind: 'animation-write',\n frameId: snapshot.frameId,\n logicalTime: snapshot.logicalTime,\n debugName: debugName(),\n target: 'status',\n outcome: 'staged',\n });\n } finally {\n revokeFromOwner?.();\n }\n });\n const owner = deferredStatusCommandOwner;\n if (owner === undefined) return;\n const revoke = () => {\n command.cancel();\n const phase = snapshotRealmScheduler().phase;\n if (phase !== 'advance' && phase !== 'render') status.set('disposed');\n };\n revokeFromOwner = () => owner.remove(revoke);\n owner.add(revoke);\n }\n\n function acceptCommandWithoutTrace(\n command: PlaybackCommandName,\n generation: number,\n snapshot: PibblFrameSnapshot,\n batch: SignalCommitBatch,\n argument?: number | 'error' | 'replace',\n ): void {\n // Keep trace emission in the immutable scheduler command wrapper so the\n // realm sequence, not a controller-local approximation, is recorded.\n if (command === 'play') {\n acceptPlay(generation, argument as 'error' | 'replace', snapshot, batch);\n return;\n }\n const target = run?.generation === generation ? run : undefined;\n if (target === undefined) {\n if (command === 'seek' || command === 'reverse' || command === 'finish') {\n acceptFreshControl(\n generation,\n command,\n snapshot,\n batch,\n command === 'seek' ? argument as number : undefined,\n );\n } else if (command === 'cancel') {\n stageStatus(batch, snapshot, 'cancelled');\n } else if (command === 'setPlaybackRate') {\n storedPlaybackRate = argument as number;\n }\n return;\n }\n if (target.status === 'ending') {\n if (command === 'seek' || command === 'reverse' || command === 'finish') {\n releaseRun(target);\n acceptFreshControl(\n generation,\n command,\n snapshot,\n batch,\n command === 'seek' ? argument as number : undefined,\n );\n } else if (command === 'setPlaybackRate') {\n storedPlaybackRate = argument as number;\n }\n return;\n }\n if (command === 'pause') {\n if (target.status !== 'paused') {\n const previousStatus = target.status;\n target.status = 'paused';\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n stageStatus(batch, snapshot, 'paused');\n queueCurrentFrameCommitAcknowledgement((_committedSnapshot, outcome) => {\n if (outcome.applied || disposed || run !== target || target.released) return;\n target.status = previousStatus;\n registerRun(target);\n enqueue('pause', target.generation);\n });\n }\n return;\n }\n if (command === 'resume') {\n if (target.status === 'paused') {\n const previousAnchorPosition = target.anchorPosition;\n const previousAnchorLogicalTime = target.anchorLogicalTime;\n target.status = 'running';\n target.anchorPosition = target.position;\n target.anchorLogicalTime = snapshot.logicalTime;\n stageStatus(batch, snapshot, 'running');\n registerRun(target);\n queueCurrentFrameCommitAcknowledgement((_committedSnapshot, outcome) => {\n if (outcome.applied || disposed || run !== target || target.released) return;\n target.status = 'paused';\n target.anchorPosition = previousAnchorPosition;\n target.anchorLogicalTime = previousAnchorLogicalTime;\n target.unregisterAdvance?.();\n target.unregisterAdvance = undefined;\n enqueue('resume', target.generation);\n });\n }\n return;\n }\n if (command === 'cancel') {\n cancelRun(target, snapshot, batch);\n return;\n }\n if (command === 'seek') {\n const staticDuration = finiteDuration(getProgramRecord(target.program).duration);\n const time = Math.max(0, staticDuration === undefined ? argument as number :\n Math.min(argument as number, staticDuration));\n target.pendingEvaluation = { kind: 'seek', time };\n target.anchorPosition = time;\n target.anchorLogicalTime = snapshot.logicalTime;\n registerRun(target);\n return;\n }\n if (command === 'reverse') {\n target.direction = target.direction === 'forward' ? 'reverse' : 'forward';\n target.anchorPosition = target.position;\n target.anchorLogicalTime = snapshot.logicalTime;\n if (target.status === 'running') registerRun(target);\n return;\n }\n if (command === 'setPlaybackRate') {\n storedPlaybackRate = argument as number;\n target.playbackRate = storedPlaybackRate;\n target.anchorPosition = target.position;\n target.anchorLogicalTime = snapshot.logicalTime;\n return;\n }\n const unavailable = unavailableControlError(target.program, 'finish');\n if (unavailable !== undefined &&\n getProgramActivationRecord(target.activation).terminalDuration === undefined) {\n queueDiagnosticError(snapshot, unavailable, target.registrationOrder);\n return;\n }\n target.pendingEvaluation = { kind: 'finish' };\n registerRun(target);\n }\n\n const handle: PibblPlayback = Object.freeze({\n status: status.asReadonly(),\n currentTime: currentTime.asReadonly(),\n play(playOptions: { readonly conflict?: 'error' | 'replace' } = {}): void {\n if (disposed) return;\n const conflict = playOptions.conflict ?? options.conflict ?? 'error';\n if (conflict !== 'error' && conflict !== 'replace') {\n throw new TypeError('Pibbl animation playback conflict must be \"error\" or \"replace\".');\n }\n const generation = ++queuedGeneration;\n enqueue('play', generation, conflict);\n },\n pause(): void {\n enqueue('pause', queuedGeneration);\n },\n resume(): void {\n enqueue('resume', queuedGeneration);\n },\n cancel(): void {\n enqueue('cancel', queuedGeneration);\n },\n finish(): void {\n enqueue('finish', queuedGeneration);\n },\n seek(milliseconds: number): void {\n if (disposed) return;\n if (!Number.isFinite(milliseconds)) {\n throw new RangeError('Pibbl animation playback seek time must be finite.');\n }\n enqueue('seek', queuedGeneration, milliseconds);\n },\n reverse(): void {\n enqueue('reverse', queuedGeneration);\n },\n setPlaybackRate(rate: number): void {\n if (disposed) return;\n if (!Number.isFinite(rate) || rate <= 0) {\n throw new RangeError(\n 'Pibbl animation playback rate must be finite and greater than zero.',\n );\n }\n enqueue('setPlaybackRate', queuedGeneration, rate);\n },\n });\n\n return Object.freeze({\n handle,\n adopt(nextProgram: PibblAnimationProgram, nextOptions: PibblPlaybackOptions = {}): void {\n if (disposed) return;\n const candidate = normalizeAnimationPlaybackCandidate(nextProgram, nextOptions);\n program = candidate.program;\n options = candidate.options;\n },\n committedSpringSnapshot(): SpringSample | undefined {\n const target = run;\n if (disposed || target === undefined || target.released) return undefined;\n const programRecord = getProgramRecord(target.program);\n if (programRecord.kind !== 'track') return undefined;\n const definitionRecord = getDefinitionRecord(programRecord.definition);\n if (definitionRecord.kind !== 'spring') return undefined;\n return sampleSpring(definitionRecord, target.position / 1000);\n },\n retarget(nextProgram: PibblAnimationProgram, nextOptions: PibblPlaybackOptions = {}): void {\n if (disposed) return;\n const candidate = normalizeAnimationPlaybackCandidate(nextProgram, nextOptions);\n program = candidate.program;\n options = candidate.options;\n if (pendingRetarget !== undefined) {\n pendingRetarget.cancel();\n if (pendingCommands.delete(pendingRetarget)) queuedCommands--;\n }\n const generation = ++queuedGeneration;\n pendingRetarget = enqueue('play', generation, 'replace');\n },\n setDeferredStatusCommandOwner(owner: DeferredStatusCommandOwner): void {\n deferredStatusCommandOwner = owner;\n },\n dispose(): void {\n if (disposed) return;\n disposed = true;\n queuedGeneration++;\n for (const commandHandle of pendingCommands) {\n commandHandle.cancel();\n queuedCommands--;\n }\n pendingCommands.clear();\n pendingRetarget = undefined;\n if (run !== undefined) releaseRun(run);\n if (delivery !== undefined) {\n queuedMilestones -= delivery.events.length;\n delivery.events.length = 0;\n delivery.errors.length = 0;\n delivery.terminalRuns.clear();\n }\n const schedulerPhase = snapshotRealmScheduler().phase;\n if (schedulerPhase !== 'advance' && schedulerPhase !== 'render') {\n status.set('disposed');\n } else {\n stageDisposedAfterRender();\n }\n },\n });\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -22,7 +22,9 @@ type SpringWithoutDuration = Omit<SpringDefinitionRecord, 'duration'>;
22
22
  /** @internal Resolves a deterministic settlement duration in milliseconds. */
23
23
  export declare function resolveSpringDuration(record: SpringWithoutDuration): number;
24
24
  /** @internal Creates the fully normalized immutable spring definition record. */
25
- export declare function createSpringRecord(options: Readonly<PibblSpringOptions>): SpringDefinitionRecord;
25
+ export declare function createSpringRecord(options: Readonly<PibblSpringOptions & {
26
+ readonly to: number;
27
+ }>): SpringDefinitionRecord;
26
28
  /** @internal Resolves an omitted start from a track's activation snapshot. */
27
29
  export declare function resolveSpringStart(record: SpringDefinitionRecord, initialValue: number): SpringDefinitionRecord;
28
30
  /** @internal Samples position and logical-units-per-second velocity analytically. */
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/animation/spring.ts"],
4
- "sourcesContent": ["import type { PibblSpringOptions } from './types.js';\n\nconst DEFAULT_MASS = 1;\nconst DEFAULT_STIFFNESS = 170;\nconst DEFAULT_DAMPING = 26;\nconst DEFAULT_INITIAL_VELOCITY = 0;\nconst DEFAULT_REST_SPEED = 0.01;\nconst DEFAULT_REST_DELTA = 0.001;\nconst DEFAULT_MAX_DURATION = 10_000;\n\n/**\n * Ratios this close to one use the critical solution. This avoids dividing by\n * a vanishing damped frequency or root separation without changing visibly\n * distinct underdamped and overdamped springs.\n */\nconst CRITICAL_DAMPING_EPSILON = 1e-7;\nconst DURATION_BISECTION_ITERATIONS = 64;\nconst INITIAL_BRACKET_SECONDS = 0.001;\n\nexport interface SpringDefinitionRecord {\n readonly kind: 'spring';\n readonly duration: number;\n readonly debugName: string | undefined;\n readonly hasFrom: boolean;\n readonly from: number;\n readonly to: number;\n readonly mass: number;\n readonly stiffness: number;\n readonly damping: number;\n readonly initialVelocity: number;\n readonly restSpeed: number;\n readonly restDelta: number;\n readonly maxDuration: number;\n}\n\nexport interface SpringSample {\n readonly position: number;\n readonly velocity: number;\n}\n\ntype SpringWithoutDuration = Omit<SpringDefinitionRecord, 'duration'>;\n\ninterface SpringEnvelope {\n readonly lastPeakSeconds: number;\n readonly displacement: (seconds: number) => number;\n readonly velocity: (seconds: number) => number;\n}\n\ninterface SpringFrequencies {\n readonly natural: number;\n readonly ratio: number;\n readonly decay: number;\n}\n\nfunction definitionLabel(debugName: string | undefined): string {\n return debugName === undefined ? 'Pibbl spring definition' :\n `Pibbl spring definition \"${debugName}\"`;\n}\n\nfunction finite(value: number, property: string, debugName: string | undefined): number {\n if (!Number.isFinite(value)) {\n throw new RangeError(`${definitionLabel(debugName)} ${property} must be finite.`);\n }\n return value;\n}\n\nfunction positive(value: number, property: string, debugName: string | undefined): number {\n finite(value, property, debugName);\n if (value <= 0) {\n throw new RangeError(`${definitionLabel(debugName)} ${property} must be positive.`);\n }\n return value;\n}\n\nfunction nonnegative(\n value: number,\n property: string,\n debugName: string | undefined,\n): number {\n finite(value, property, debugName);\n if (value < 0) {\n throw new RangeError(`${definitionLabel(debugName)} ${property} must be nonnegative.`);\n }\n return value;\n}\n\nfunction defaulted(value: number | undefined, fallback: number): number {\n return value === undefined ? fallback : value;\n}\n\nfunction normalizedSpring(options: Readonly<PibblSpringOptions>): SpringWithoutDuration {\n const debugName = options.debugName;\n const hasFrom = options.from !== undefined;\n return {\n kind: 'spring',\n debugName,\n hasFrom,\n from: finite(defaulted(options.from, 0), 'from', debugName),\n to: finite(options.to, 'to', debugName),\n mass: positive(defaulted(options.mass, DEFAULT_MASS), 'mass', debugName),\n stiffness: positive(\n defaulted(options.stiffness, DEFAULT_STIFFNESS),\n 'stiffness',\n debugName,\n ),\n damping: nonnegative(\n defaulted(options.damping, DEFAULT_DAMPING),\n 'damping',\n debugName,\n ),\n initialVelocity: finite(\n defaulted(options.initialVelocity, DEFAULT_INITIAL_VELOCITY),\n 'initialVelocity',\n debugName,\n ),\n restSpeed: nonnegative(\n defaulted(options.restSpeed, DEFAULT_REST_SPEED),\n 'restSpeed',\n debugName,\n ),\n restDelta: nonnegative(\n defaulted(options.restDelta, DEFAULT_REST_DELTA),\n 'restDelta',\n debugName,\n ),\n maxDuration: positive(\n defaulted(options.maxDuration, DEFAULT_MAX_DURATION),\n 'maxDuration',\n debugName,\n ),\n };\n}\n\nfunction frequencies(record: SpringWithoutDuration): SpringFrequencies {\n const logMass = Math.log(record.mass);\n const logStiffness = Math.log(record.stiffness);\n const natural = Math.exp((logStiffness - logMass) / 2);\n const dampingLog = record.damping === 0 ? Number.NEGATIVE_INFINITY :\n Math.log(record.damping);\n const ratio = record.damping === 0 ? 0 : Math.exp(\n dampingLog - Math.LN2 - logStiffness / 2 - logMass / 2,\n );\n const decay = record.damping === 0 ? 0 : Math.exp(\n dampingLog - Math.LN2 - logMass,\n );\n if (!(natural > 0) || !Number.isFinite(natural) ||\n !Number.isFinite(ratio) || !Number.isFinite(decay)) {\n throw new RangeError(\n `${definitionLabel(record.debugName)} parameters must produce finite representable frequencies.`,\n );\n }\n return { natural, ratio, decay };\n}\n\nfunction displacement(record: SpringWithoutDuration): number {\n const value = record.from - record.to;\n if (!Number.isFinite(value)) {\n throw new RangeError(\n `${definitionLabel(record.debugName)} displacement must be finite and representable.`,\n );\n }\n return value;\n}\n\nfunction assertRepresentable(\n record: SpringWithoutDuration,\n ...values: readonly number[]\n): void {\n if (values.some(value => !Number.isFinite(value))) {\n throw new RangeError(\n `${definitionLabel(record.debugName)} parameters must produce finite representable coefficients.`,\n );\n }\n}\n\nfunction underdampedTerms(\n record: SpringWithoutDuration,\n natural: number,\n ratio: number,\n decay: number,\n): {\n readonly displacement: number;\n readonly damped: number;\n readonly velocityCoefficient: number;\n} {\n const initialDisplacement = displacement(record);\n const damped = natural * Math.sqrt((1 - ratio) * (1 + ratio));\n const velocityCoefficient =\n record.initialVelocity + decay * initialDisplacement;\n const maximumSeconds = record.maxDuration / 1000;\n if (!(damped > 0)) {\n throw new RangeError(\n `${definitionLabel(record.debugName)} parameters must produce finite representable coefficients.`,\n );\n }\n assertRepresentable(\n record,\n damped,\n velocityCoefficient,\n damped * maximumSeconds,\n velocityCoefficient * maximumSeconds,\n initialDisplacement * damped,\n decay * velocityCoefficient * maximumSeconds,\n Math.abs(record.to) + Math.abs(initialDisplacement) +\n Math.abs(velocityCoefficient * maximumSeconds),\n );\n return { displacement: initialDisplacement, damped, velocityCoefficient };\n}\n\nfunction criticalEnvelope(\n record: SpringWithoutDuration,\n natural: number,\n): SpringEnvelope {\n const a = displacement(record);\n const b = record.initialVelocity + natural * a;\n const maximumSeconds = record.maxDuration / 1000;\n assertRepresentable(\n record,\n b,\n b * maximumSeconds,\n natural * a,\n natural * b,\n natural * b * maximumSeconds,\n Math.abs(record.to) + Math.abs(a) + Math.abs(b * maximumSeconds),\n );\n const velocityA = b - natural * a;\n const velocityB = -natural * b;\n const displacementA = Math.abs(a);\n const displacementB = Math.abs(b);\n const speedA = Math.abs(velocityA);\n const speedB = Math.abs(velocityB);\n const peak = (constant: number, slope: number): number => {\n if (slope === 0 || !Number.isFinite(slope)) return 0;\n return Math.max(0, (slope - natural * constant) / (natural * slope));\n };\n return {\n lastPeakSeconds: Math.max(\n peak(displacementA, displacementB),\n peak(speedA, speedB),\n ),\n displacement: seconds =>\n (displacementA + displacementB * seconds) * Math.exp(-natural * seconds),\n velocity: seconds =>\n (speedA + speedB * seconds) * Math.exp(-natural * seconds),\n };\n}\n\nfunction underdampedEnvelope(\n record: SpringWithoutDuration,\n natural: number,\n ratio: number,\n decay: number,\n): SpringEnvelope {\n const terms = underdampedTerms(record, natural, ratio, decay);\n const a = terms.displacement;\n const b = terms.velocityCoefficient / terms.damped;\n const displacementAmplitude = Math.hypot(a, b);\n const velocitySineCoefficient = terms.velocityCoefficient === 0 ? 0 :\n -a * terms.damped - (decay / terms.damped) * terms.velocityCoefficient;\n const velocityAmplitude = Math.hypot(\n record.initialVelocity,\n velocitySineCoefficient,\n );\n const conservative = (value: number): number =>\n Number.isFinite(value) ? value : Number.POSITIVE_INFINITY;\n return {\n lastPeakSeconds: 0,\n displacement: seconds =>\n conservative(displacementAmplitude * Math.exp(-decay * seconds)),\n velocity: seconds =>\n conservative(velocityAmplitude * Math.exp(-decay * seconds)),\n };\n}\n\nfunction overdampedTerms(\n record: SpringWithoutDuration,\n natural: number,\n ratio: number,\n decay: number,\n): {\n readonly firstCoefficient: number;\n readonly firstRoot: number;\n readonly secondCoefficient: number;\n readonly secondRoot: number;\n} {\n const reciprocalRatio = 1 / ratio;\n const rootOffsetRatio = Math.sqrt(\n (1 - reciprocalRatio) * (1 + reciprocalRatio),\n );\n const rootSum = decay * (1 + rootOffsetRatio);\n const firstRoot = -(natural / rootSum) * natural;\n const secondRoot = -rootSum;\n const initialDisplacement = displacement(record);\n const firstCoefficient =\n (record.initialVelocity - secondRoot * initialDisplacement) /\n (firstRoot - secondRoot);\n const secondCoefficient = initialDisplacement - firstCoefficient;\n if (!(firstRoot < 0) || !(secondRoot < 0)) {\n throw new RangeError(\n `${definitionLabel(record.debugName)} parameters must produce finite representable coefficients.`,\n );\n }\n assertRepresentable(\n record,\n firstRoot,\n secondRoot,\n firstCoefficient,\n secondCoefficient,\n firstRoot * firstCoefficient,\n secondRoot * secondCoefficient,\n Math.abs(record.to) + Math.abs(firstCoefficient) + Math.abs(secondCoefficient),\n );\n return {\n firstCoefficient,\n firstRoot,\n secondCoefficient,\n secondRoot,\n };\n}\n\nfunction overdampedEnvelope(\n record: SpringWithoutDuration,\n natural: number,\n ratio: number,\n decay: number,\n): SpringEnvelope {\n const terms = overdampedTerms(record, natural, ratio, decay);\n return {\n lastPeakSeconds: 0,\n displacement: seconds =>\n Math.abs(terms.firstCoefficient) * Math.exp(terms.firstRoot * seconds) +\n Math.abs(terms.secondCoefficient) * Math.exp(terms.secondRoot * seconds),\n velocity: seconds =>\n Math.abs(terms.firstRoot * terms.firstCoefficient) *\n Math.exp(terms.firstRoot * seconds) +\n Math.abs(terms.secondRoot * terms.secondCoefficient) *\n Math.exp(terms.secondRoot * seconds),\n };\n}\n\nfunction springEnvelope(record: SpringWithoutDuration): SpringEnvelope {\n const { natural, ratio, decay } = frequencies(record);\n if (Math.abs(ratio - 1) <= CRITICAL_DAMPING_EPSILON) {\n return criticalEnvelope(record, natural);\n }\n return ratio < 1 ?\n underdampedEnvelope(record, natural, ratio, decay) :\n overdampedEnvelope(record, natural, ratio, decay);\n}\n\n/** @internal Resolves a deterministic settlement duration in milliseconds. */\nexport function resolveSpringDuration(record: SpringWithoutDuration): number {\n if (record.from === record.to && record.initialVelocity === 0) return 0;\n const envelope = springEnvelope(record);\n const maximumSeconds = record.maxDuration / 1000;\n const settled = (seconds: number): boolean =>\n envelope.displacement(seconds) <= record.restDelta &&\n envelope.velocity(seconds) <= record.restSpeed;\n\n let lower = Math.min(maximumSeconds, envelope.lastPeakSeconds);\n if (!Number.isFinite(lower)) return record.maxDuration;\n if (settled(lower)) return lower * 1000;\n\n let bracketSize = Math.max(INITIAL_BRACKET_SECONDS, lower);\n let upper = lower;\n while (upper < maximumSeconds) {\n upper = Math.min(maximumSeconds, lower + bracketSize);\n if (settled(upper)) break;\n lower = upper;\n bracketSize *= 2;\n }\n if (!settled(upper)) return record.maxDuration;\n\n for (let iteration = 0; iteration < DURATION_BISECTION_ITERATIONS; iteration++) {\n const middle = lower + (upper - lower) / 2;\n if (settled(middle)) upper = middle;\n else lower = middle;\n }\n return upper * 1000;\n}\n\n/** @internal Creates the fully normalized immutable spring definition record. */\nexport function createSpringRecord(\n options: Readonly<PibblSpringOptions>,\n): SpringDefinitionRecord {\n const normalized = normalizedSpring(options);\n return Object.freeze({\n ...normalized,\n duration: normalized.hasFrom ?\n resolveSpringDuration(normalized) : normalized.maxDuration,\n });\n}\n\n/** @internal Resolves an omitted start from a track's activation snapshot. */\nexport function resolveSpringStart(\n record: SpringDefinitionRecord,\n initialValue: number,\n): SpringDefinitionRecord {\n if (record.hasFrom) return record;\n const resolved = {\n ...record,\n hasFrom: true,\n from: finite(initialValue, 'activation value', record.debugName),\n };\n return Object.freeze({\n ...resolved,\n duration: resolveSpringDuration(resolved),\n });\n}\n\n/** @internal Samples position and logical-units-per-second velocity analytically. */\nexport function sampleSpring(\n record: SpringDefinitionRecord,\n seconds: number,\n): SpringSample {\n finite(seconds, 'sample time', record.debugName);\n const time = Math.max(0, seconds);\n if (time >= record.duration / 1000) {\n return Object.freeze({ position: record.to, velocity: 0 });\n }\n if (time === 0) {\n return Object.freeze({\n position: record.from,\n velocity: record.initialVelocity,\n });\n }\n\n const initialDisplacement = displacement(record);\n const { natural, ratio, decay: decayRate } = frequencies(record);\n let offset: number;\n let velocity: number;\n if (Math.abs(ratio - 1) <= CRITICAL_DAMPING_EPSILON) {\n const b = record.initialVelocity + natural * initialDisplacement;\n const decay = Math.exp(-natural * time);\n offset = (initialDisplacement + b * time) * decay;\n velocity = (b - natural * (initialDisplacement + b * time)) * decay;\n } else if (ratio < 1) {\n const terms = underdampedTerms(record, natural, ratio, decayRate);\n const angle = terms.damped * time;\n const sine = Math.sin(angle);\n const sineOverFrequency = angle === 0 ? time : time * sine / angle;\n const decay = Math.exp(-decayRate * time);\n const cosine = Math.cos(angle);\n offset = decay * (\n initialDisplacement * cosine +\n terms.velocityCoefficient * sineOverFrequency\n );\n velocity = decay * (\n record.initialVelocity * cosine -\n initialDisplacement * terms.damped * sine -\n decayRate * terms.velocityCoefficient * sineOverFrequency\n );\n } else {\n const terms = overdampedTerms(record, natural, ratio, decayRate);\n const first = terms.firstCoefficient * Math.exp(terms.firstRoot * time);\n const second = terms.secondCoefficient * Math.exp(terms.secondRoot * time);\n offset = first + second;\n velocity = terms.firstRoot * first + terms.secondRoot * second;\n }\n\n const position = record.to + offset;\n if (!Number.isFinite(position) || !Number.isFinite(velocity)) {\n throw new RangeError(`${definitionLabel(record.debugName)} sampled values must be finite.`);\n }\n return Object.freeze({ position, velocity });\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { PibblSpringOptions } from './types.js';\n\nconst DEFAULT_MASS = 1;\nconst DEFAULT_STIFFNESS = 170;\nconst DEFAULT_DAMPING = 26;\nconst DEFAULT_INITIAL_VELOCITY = 0;\nconst DEFAULT_REST_SPEED = 0.01;\nconst DEFAULT_REST_DELTA = 0.001;\nconst DEFAULT_MAX_DURATION = 10_000;\n\n/**\n * Ratios this close to one use the critical solution. This avoids dividing by\n * a vanishing damped frequency or root separation without changing visibly\n * distinct underdamped and overdamped springs.\n */\nconst CRITICAL_DAMPING_EPSILON = 1e-7;\nconst DURATION_BISECTION_ITERATIONS = 64;\nconst INITIAL_BRACKET_SECONDS = 0.001;\n\nexport interface SpringDefinitionRecord {\n readonly kind: 'spring';\n readonly duration: number;\n readonly debugName: string | undefined;\n readonly hasFrom: boolean;\n readonly from: number;\n readonly to: number;\n readonly mass: number;\n readonly stiffness: number;\n readonly damping: number;\n readonly initialVelocity: number;\n readonly restSpeed: number;\n readonly restDelta: number;\n readonly maxDuration: number;\n}\n\nexport interface SpringSample {\n readonly position: number;\n readonly velocity: number;\n}\n\ntype SpringWithoutDuration = Omit<SpringDefinitionRecord, 'duration'>;\n\ninterface SpringEnvelope {\n readonly lastPeakSeconds: number;\n readonly displacement: (seconds: number) => number;\n readonly velocity: (seconds: number) => number;\n}\n\ninterface SpringFrequencies {\n readonly natural: number;\n readonly ratio: number;\n readonly decay: number;\n}\n\nfunction definitionLabel(debugName: string | undefined): string {\n return debugName === undefined ? 'Pibbl spring definition' :\n `Pibbl spring definition \"${debugName}\"`;\n}\n\nfunction finite(value: number, property: string, debugName: string | undefined): number {\n if (!Number.isFinite(value)) {\n throw new RangeError(`${definitionLabel(debugName)} ${property} must be finite.`);\n }\n return value;\n}\n\nfunction positive(value: number, property: string, debugName: string | undefined): number {\n finite(value, property, debugName);\n if (value <= 0) {\n throw new RangeError(`${definitionLabel(debugName)} ${property} must be positive.`);\n }\n return value;\n}\n\nfunction nonnegative(\n value: number,\n property: string,\n debugName: string | undefined,\n): number {\n finite(value, property, debugName);\n if (value < 0) {\n throw new RangeError(`${definitionLabel(debugName)} ${property} must be nonnegative.`);\n }\n return value;\n}\n\nfunction defaulted(value: number | undefined, fallback: number): number {\n return value === undefined ? fallback : value;\n}\n\nfunction normalizedSpring(options: Readonly<PibblSpringOptions & { readonly to: number }>): SpringWithoutDuration {\n const debugName = options.debugName;\n const hasFrom = options.from !== undefined;\n return {\n kind: 'spring',\n debugName,\n hasFrom,\n from: finite(defaulted(options.from, 0), 'from', debugName),\n to: finite(options.to, 'to', debugName),\n mass: positive(defaulted(options.mass, DEFAULT_MASS), 'mass', debugName),\n stiffness: positive(\n defaulted(options.stiffness, DEFAULT_STIFFNESS),\n 'stiffness',\n debugName,\n ),\n damping: nonnegative(\n defaulted(options.damping, DEFAULT_DAMPING),\n 'damping',\n debugName,\n ),\n initialVelocity: finite(\n defaulted(options.initialVelocity, DEFAULT_INITIAL_VELOCITY),\n 'initialVelocity',\n debugName,\n ),\n restSpeed: nonnegative(\n defaulted(options.restSpeed, DEFAULT_REST_SPEED),\n 'restSpeed',\n debugName,\n ),\n restDelta: nonnegative(\n defaulted(options.restDelta, DEFAULT_REST_DELTA),\n 'restDelta',\n debugName,\n ),\n maxDuration: positive(\n defaulted(options.maxDuration, DEFAULT_MAX_DURATION),\n 'maxDuration',\n debugName,\n ),\n };\n}\n\nfunction frequencies(record: SpringWithoutDuration): SpringFrequencies {\n const logMass = Math.log(record.mass);\n const logStiffness = Math.log(record.stiffness);\n const natural = Math.exp((logStiffness - logMass) / 2);\n const dampingLog = record.damping === 0 ? Number.NEGATIVE_INFINITY :\n Math.log(record.damping);\n const ratio = record.damping === 0 ? 0 : Math.exp(\n dampingLog - Math.LN2 - logStiffness / 2 - logMass / 2,\n );\n const decay = record.damping === 0 ? 0 : Math.exp(\n dampingLog - Math.LN2 - logMass,\n );\n if (!(natural > 0) || !Number.isFinite(natural) ||\n !Number.isFinite(ratio) || !Number.isFinite(decay)) {\n throw new RangeError(\n `${definitionLabel(record.debugName)} parameters must produce finite representable frequencies.`,\n );\n }\n return { natural, ratio, decay };\n}\n\nfunction displacement(record: SpringWithoutDuration): number {\n const value = record.from - record.to;\n if (!Number.isFinite(value)) {\n throw new RangeError(\n `${definitionLabel(record.debugName)} displacement must be finite and representable.`,\n );\n }\n return value;\n}\n\nfunction assertRepresentable(\n record: SpringWithoutDuration,\n ...values: readonly number[]\n): void {\n if (values.some(value => !Number.isFinite(value))) {\n throw new RangeError(\n `${definitionLabel(record.debugName)} parameters must produce finite representable coefficients.`,\n );\n }\n}\n\nfunction underdampedTerms(\n record: SpringWithoutDuration,\n natural: number,\n ratio: number,\n decay: number,\n): {\n readonly displacement: number;\n readonly damped: number;\n readonly velocityCoefficient: number;\n} {\n const initialDisplacement = displacement(record);\n const damped = natural * Math.sqrt((1 - ratio) * (1 + ratio));\n const velocityCoefficient =\n record.initialVelocity + decay * initialDisplacement;\n const maximumSeconds = record.maxDuration / 1000;\n if (!(damped > 0)) {\n throw new RangeError(\n `${definitionLabel(record.debugName)} parameters must produce finite representable coefficients.`,\n );\n }\n assertRepresentable(\n record,\n damped,\n velocityCoefficient,\n damped * maximumSeconds,\n velocityCoefficient * maximumSeconds,\n initialDisplacement * damped,\n decay * velocityCoefficient * maximumSeconds,\n Math.abs(record.to) + Math.abs(initialDisplacement) +\n Math.abs(velocityCoefficient * maximumSeconds),\n );\n return { displacement: initialDisplacement, damped, velocityCoefficient };\n}\n\nfunction criticalEnvelope(\n record: SpringWithoutDuration,\n natural: number,\n): SpringEnvelope {\n const a = displacement(record);\n const b = record.initialVelocity + natural * a;\n const maximumSeconds = record.maxDuration / 1000;\n assertRepresentable(\n record,\n b,\n b * maximumSeconds,\n natural * a,\n natural * b,\n natural * b * maximumSeconds,\n Math.abs(record.to) + Math.abs(a) + Math.abs(b * maximumSeconds),\n );\n const velocityA = b - natural * a;\n const velocityB = -natural * b;\n const displacementA = Math.abs(a);\n const displacementB = Math.abs(b);\n const speedA = Math.abs(velocityA);\n const speedB = Math.abs(velocityB);\n const peak = (constant: number, slope: number): number => {\n if (slope === 0 || !Number.isFinite(slope)) return 0;\n return Math.max(0, (slope - natural * constant) / (natural * slope));\n };\n return {\n lastPeakSeconds: Math.max(\n peak(displacementA, displacementB),\n peak(speedA, speedB),\n ),\n displacement: seconds =>\n (displacementA + displacementB * seconds) * Math.exp(-natural * seconds),\n velocity: seconds =>\n (speedA + speedB * seconds) * Math.exp(-natural * seconds),\n };\n}\n\nfunction underdampedEnvelope(\n record: SpringWithoutDuration,\n natural: number,\n ratio: number,\n decay: number,\n): SpringEnvelope {\n const terms = underdampedTerms(record, natural, ratio, decay);\n const a = terms.displacement;\n const b = terms.velocityCoefficient / terms.damped;\n const displacementAmplitude = Math.hypot(a, b);\n const velocitySineCoefficient = terms.velocityCoefficient === 0 ? 0 :\n -a * terms.damped - (decay / terms.damped) * terms.velocityCoefficient;\n const velocityAmplitude = Math.hypot(\n record.initialVelocity,\n velocitySineCoefficient,\n );\n const conservative = (value: number): number =>\n Number.isFinite(value) ? value : Number.POSITIVE_INFINITY;\n return {\n lastPeakSeconds: 0,\n displacement: seconds =>\n conservative(displacementAmplitude * Math.exp(-decay * seconds)),\n velocity: seconds =>\n conservative(velocityAmplitude * Math.exp(-decay * seconds)),\n };\n}\n\nfunction overdampedTerms(\n record: SpringWithoutDuration,\n natural: number,\n ratio: number,\n decay: number,\n): {\n readonly firstCoefficient: number;\n readonly firstRoot: number;\n readonly secondCoefficient: number;\n readonly secondRoot: number;\n} {\n const reciprocalRatio = 1 / ratio;\n const rootOffsetRatio = Math.sqrt(\n (1 - reciprocalRatio) * (1 + reciprocalRatio),\n );\n const rootSum = decay * (1 + rootOffsetRatio);\n const firstRoot = -(natural / rootSum) * natural;\n const secondRoot = -rootSum;\n const initialDisplacement = displacement(record);\n const firstCoefficient =\n (record.initialVelocity - secondRoot * initialDisplacement) /\n (firstRoot - secondRoot);\n const secondCoefficient = initialDisplacement - firstCoefficient;\n if (!(firstRoot < 0) || !(secondRoot < 0)) {\n throw new RangeError(\n `${definitionLabel(record.debugName)} parameters must produce finite representable coefficients.`,\n );\n }\n assertRepresentable(\n record,\n firstRoot,\n secondRoot,\n firstCoefficient,\n secondCoefficient,\n firstRoot * firstCoefficient,\n secondRoot * secondCoefficient,\n Math.abs(record.to) + Math.abs(firstCoefficient) + Math.abs(secondCoefficient),\n );\n return {\n firstCoefficient,\n firstRoot,\n secondCoefficient,\n secondRoot,\n };\n}\n\nfunction overdampedEnvelope(\n record: SpringWithoutDuration,\n natural: number,\n ratio: number,\n decay: number,\n): SpringEnvelope {\n const terms = overdampedTerms(record, natural, ratio, decay);\n return {\n lastPeakSeconds: 0,\n displacement: seconds =>\n Math.abs(terms.firstCoefficient) * Math.exp(terms.firstRoot * seconds) +\n Math.abs(terms.secondCoefficient) * Math.exp(terms.secondRoot * seconds),\n velocity: seconds =>\n Math.abs(terms.firstRoot * terms.firstCoefficient) *\n Math.exp(terms.firstRoot * seconds) +\n Math.abs(terms.secondRoot * terms.secondCoefficient) *\n Math.exp(terms.secondRoot * seconds),\n };\n}\n\nfunction springEnvelope(record: SpringWithoutDuration): SpringEnvelope {\n const { natural, ratio, decay } = frequencies(record);\n if (Math.abs(ratio - 1) <= CRITICAL_DAMPING_EPSILON) {\n return criticalEnvelope(record, natural);\n }\n return ratio < 1 ?\n underdampedEnvelope(record, natural, ratio, decay) :\n overdampedEnvelope(record, natural, ratio, decay);\n}\n\n/** @internal Resolves a deterministic settlement duration in milliseconds. */\nexport function resolveSpringDuration(record: SpringWithoutDuration): number {\n if (record.from === record.to && record.initialVelocity === 0) return 0;\n const envelope = springEnvelope(record);\n const maximumSeconds = record.maxDuration / 1000;\n const settled = (seconds: number): boolean =>\n envelope.displacement(seconds) <= record.restDelta &&\n envelope.velocity(seconds) <= record.restSpeed;\n\n let lower = Math.min(maximumSeconds, envelope.lastPeakSeconds);\n if (!Number.isFinite(lower)) return record.maxDuration;\n if (settled(lower)) return lower * 1000;\n\n let bracketSize = Math.max(INITIAL_BRACKET_SECONDS, lower);\n let upper = lower;\n while (upper < maximumSeconds) {\n upper = Math.min(maximumSeconds, lower + bracketSize);\n if (settled(upper)) break;\n lower = upper;\n bracketSize *= 2;\n }\n if (!settled(upper)) return record.maxDuration;\n\n for (let iteration = 0; iteration < DURATION_BISECTION_ITERATIONS; iteration++) {\n const middle = lower + (upper - lower) / 2;\n if (settled(middle)) upper = middle;\n else lower = middle;\n }\n return upper * 1000;\n}\n\n/** @internal Creates the fully normalized immutable spring definition record. */\nexport function createSpringRecord(\n options: Readonly<PibblSpringOptions & { readonly to: number }>,\n): SpringDefinitionRecord {\n const normalized = normalizedSpring(options);\n return Object.freeze({\n ...normalized,\n duration: normalized.hasFrom ?\n resolveSpringDuration(normalized) : normalized.maxDuration,\n });\n}\n\n/** @internal Resolves an omitted start from a track's activation snapshot. */\nexport function resolveSpringStart(\n record: SpringDefinitionRecord,\n initialValue: number,\n): SpringDefinitionRecord {\n if (record.hasFrom) return record;\n const resolved = {\n ...record,\n hasFrom: true,\n from: finite(initialValue, 'activation value', record.debugName),\n };\n return Object.freeze({\n ...resolved,\n duration: resolveSpringDuration(resolved),\n });\n}\n\n/** @internal Samples position and logical-units-per-second velocity analytically. */\nexport function sampleSpring(\n record: SpringDefinitionRecord,\n seconds: number,\n): SpringSample {\n finite(seconds, 'sample time', record.debugName);\n const time = Math.max(0, seconds);\n if (time >= record.duration / 1000) {\n return Object.freeze({ position: record.to, velocity: 0 });\n }\n if (time === 0) {\n return Object.freeze({\n position: record.from,\n velocity: record.initialVelocity,\n });\n }\n\n const initialDisplacement = displacement(record);\n const { natural, ratio, decay: decayRate } = frequencies(record);\n let offset: number;\n let velocity: number;\n if (Math.abs(ratio - 1) <= CRITICAL_DAMPING_EPSILON) {\n const b = record.initialVelocity + natural * initialDisplacement;\n const decay = Math.exp(-natural * time);\n offset = (initialDisplacement + b * time) * decay;\n velocity = (b - natural * (initialDisplacement + b * time)) * decay;\n } else if (ratio < 1) {\n const terms = underdampedTerms(record, natural, ratio, decayRate);\n const angle = terms.damped * time;\n const sine = Math.sin(angle);\n const sineOverFrequency = angle === 0 ? time : time * sine / angle;\n const decay = Math.exp(-decayRate * time);\n const cosine = Math.cos(angle);\n offset = decay * (\n initialDisplacement * cosine +\n terms.velocityCoefficient * sineOverFrequency\n );\n velocity = decay * (\n record.initialVelocity * cosine -\n initialDisplacement * terms.damped * sine -\n decayRate * terms.velocityCoefficient * sineOverFrequency\n );\n } else {\n const terms = overdampedTerms(record, natural, ratio, decayRate);\n const first = terms.firstCoefficient * Math.exp(terms.firstRoot * time);\n const second = terms.secondCoefficient * Math.exp(terms.secondRoot * time);\n offset = first + second;\n velocity = terms.firstRoot * first + terms.secondRoot * second;\n }\n\n const position = record.to + offset;\n if (!Number.isFinite(position) || !Number.isFinite(velocity)) {\n throw new RangeError(`${definitionLabel(record.debugName)} sampled values must be finite.`);\n }\n return Object.freeze({ position, velocity });\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }