@bitcobblers/wod-wiki-lang 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/registry/Registry.ts","../src/metrics/hints.ts","../src/metrics/units/UnitRegistry.ts","../src/utils/formatTime.ts","../src/metrics/presentation/labelFormatting.ts","../src/metrics/presentation/MetricPresentationPolicy.ts","../src/runtime/compiler/metrics/EffortMetric.ts","../src/runtime/compiler/metrics/DistanceMetric.ts","../src/runtime/compiler/metrics/ResistanceMetric.ts","../src/runtime/compiler/metrics/MeasuredMetric.ts","../src/runtime/compiler/metrics/dimensionFactory.ts","../src/runtime/compiler/metrics/ChoiceGroupMetric.ts","../src/dialects/units/fuseUnits.ts","../src/dialects/UnitsDialect.ts","../src/dialects/CrossFitDialect.ts","../src/dialects/WodDialect.ts","../src/dialects/CardioDialect.ts","../src/dialects/YogaDialect.ts","../src/dialects/HabitsDialect.ts","../src/dialects/ClimbDialect.ts","../src/dialects/DialectStack.ts","../src/runtime/compiler/metrics/ActionMetric.ts","../src/runtime/compiler/metrics/DurationMetric.ts","../src/runtime/compiler/metrics/GroupMetric.ts","../src/runtime/compiler/metrics/PropertyMetric.ts","../src/runtime/compiler/metrics/RepMetric.ts","../src/runtime/compiler/metrics/RoundsMetric.ts","../src/runtime/compiler/metrics/TextMetric.ts","../src/parser/semantic-classifier.ts","../src/grammar/parser.ts","../src/grammar/parser.terms.ts","../src/parser/syntax-parser.ts","../src/parser/lezer-mapper.ts","../src/parser/WhiteboardScript.ts","../src/parser/parseScript.ts","../src/parser/md-timer.ts","../src/parser/parserInstance.ts","../../../node_modules/.bun/@lezer+highlight@1.2.3/node_modules/@lezer/highlight/dist/index.js","../src/parser/whiteboard-script-language.ts","../src/effort-registry/types.ts","../src/effort-registry/disciplines.ts","../src/effort-registry/fuzzyMatch.ts","../src/effort-registry/EffortResolver.ts","../src/effort-registry/fixtures.ts","../src/effort-registry/data/bundled-efforts.ts","../src/effort-registry/InMemoryEffortRegistry.ts","../src/runtime/contracts/IRuntimeOptions.ts","../src/runtime/models/TimeSpan.ts","../src/runtime/RuntimeClock.ts","../src/runtime/INowProvider.ts","../src/runtime/actions/stack/NextAction.ts","../src/runtime/actions/ErrorAction.ts","../src/runtime/actions/ThrowError.ts","../src/runtime/events/NextEventHandler.ts","../src/runtime/actions/stack/AbortSessionAction.ts","../src/runtime/events/AbortEventHandler.ts","../src/runtime/actions/stack/EmitSystemOutputAction.ts","../src/runtime/ExecutionContext.ts","../src/runtime/OutputEmitter.ts","../src/runtime/RuntimeObservers.ts","../src/runtime/RuntimeLogger.ts","../src/runtime/actions/stack/PushBlockAction.ts","../src/runtime/actions/stack/PopBlockAction.ts","../src/runtime/ScriptRuntime.ts","../src/runtime/impl/TypedMemoryReference.ts","../src/runtime/RuntimeMemory.ts","../src/runtime/models/MemoryTypeEnum.ts","../src/runtime/events/MemoryEvents.ts","../src/runtime/BlockContext.ts","../src/runtime/memory/MemoryLocation.ts","../src/runtime/BehaviorContext.ts","../src/runtime/memory/MetricVisibility.ts","../src/runtime/RuntimeBlock.ts","../src/runtime/RuntimeStack.ts","../src/runtime/browserRuntimeNow.ts","../src/runtime/behaviors/CompletionTimestampBehavior.ts","../src/runtime/time/TimerSpans.ts","../src/runtime/behaviors/SpanTrackingBehavior.ts","../src/runtime/behaviors/CountupTimerBehavior.ts","../src/runtime/actions/stack/ClearChildrenAction.ts","../src/runtime/time/calculateElapsed.ts","../src/runtime/compiler/metrics/CurrentRoundMetric.ts","../src/runtime/behaviors/CountdownTimerBehavior.ts","../src/runtime/behaviors/MetricPromotionBehavior.ts","../src/runtime/behaviors/ExitBehavior.ts","../src/runtime/behaviors/LabelingBehavior.ts","../src/runtime/actions/stack/UpdateNextPreviewAction.ts","../src/analytics/effortResolution.ts","../src/runtime/compiler/EffortEnrichmentPass.ts","../src/runtime/actions/stack/CompileAndPushBlockAction.ts","../src/runtime/actions/stack/PushRestBlockAction.ts","../src/runtime/behaviors/ChildSelectionBehavior.ts","../src/runtime/compiler/metrics/ElapsedMetric.ts","../src/runtime/compiler/metrics/TotalMetric.ts","../src/runtime/compiler/metrics/SpansMetric.ts","../src/runtime/compiler/metrics/SystemTimeMetric.ts","../src/runtime/behaviors/ReportOutputBehavior.ts","../src/runtime/compiler/metrics/SoundMetric.ts","../src/runtime/behaviors/SoundCueBehavior.ts","../src/runtime/behaviors/ButtonBehavior.ts","../src/runtime/blocks/WaitingToStartBlock.ts","../src/runtime/behaviors/WaitingToStartInjectorBehavior.ts","../src/runtime/blocks/RestBlock.ts","../src/runtime/compiler/BlockBuilder.ts","../src/runtime/contracts/behaviors/IMetricPromoter.ts","../src/runtime/compiler/PromotionResolver.ts","../src/runtime/compiler/JitCompiler.ts","../src/runtime/events/EventBus.ts","../src/runtime/blocks/SessionRootBlock.ts","../src/runtime/compiler/strategies/SessionRootStrategy.ts","../src/runtime/actions/stack/StartSessionAction.ts","../src/analytics/AnalyticsEngine.ts","../src/analytics/TwoPassEffortResolutionProcess.ts","../src/analytics/calc/dimensions.ts","../src/analytics/calc/atoms.ts","../src/analytics/calc/units.ts","../src/analytics/calc/values.ts","../src/analytics/calc/evaluator.ts","../src/analytics/calc/check.ts","../src/analytics/calc/parser.ts","../src/analytics/calc/registry.ts","../src/analytics/calc/engine.ts","../src/analytics/calc/lookup.ts","../src/analytics/calc/seeds.ts","../src/analytics/calc/tables.ts","../src/analytics/calc/factory.ts","../src/analytics/StandardAnalyticsProfile.ts","../src/analytics/createAnalyticsEngineForBlock.ts","../src/runtime/compiler/metrics/ChoiceResolution.ts","../src/runtime/compiler/RuntimeFactory.ts","../src/runtime/compiler/RuntimeBuilder.ts","../src/runtime/events/NextEvent.ts","../src/runtime/models/SoundModels.ts","../src/runtime/utils/metricUtils.ts","../src/runtime/actions/events/EmitEventAction.ts","../src/runtime/blocks/EffortBlock.ts","../src/runtime/compiler/utils/LabelComposer.ts","../src/runtime/impl/PassthroughMetricDistributor.ts","../src/runtime/compiler/BlockTemplateComposer.ts","../src/runtime/compiler/strategies/logic/AmrapLogicStrategy.ts","../src/runtime/compiler/strategies/logic/IntervalLogicStrategy.ts","../src/runtime/compiler/strategies/components/GenericTimerStrategy.ts","../src/runtime/compiler/strategies/components/GenericLoopStrategy.ts","../src/runtime/compiler/strategies/components/GenericGroupStrategy.ts","../src/runtime/compiler/strategies/enhancements/SoundStrategy.ts","../src/runtime/compiler/strategies/enhancements/ReportOutputStrategy.ts","../src/runtime/compiler/strategies/enhancements/ChildrenStrategy.ts","../src/runtime/compiler/strategies/fallback/EffortFallbackStrategy.ts","../src/runtime/services/runtimeServices.ts","../src/runtime/actions/stack/StartWorkoutAction.ts","../src/runtime/actions/events/RegisterEventHandlerAction.ts","../src/runtime/actions/events/UnregisterEventHandlerAction.ts","../src/runtime/actions/audio/PlaySoundAction.ts","../src/analytics/AnalyticsTransformer.ts","../src/analytics/extractMetrics.ts","../src/analytics/calculateBlock.ts","../src/analytics/calc/index.ts","../src/analytics/calc/lineform.ts","../src/analytics/calc/diagnostics.ts","../src/analytics/rollup/workloadRollup.ts","../src/conversion/toStoredOutputStatement.ts"],"names":["MetricType","MetricContainer","t","comment","keyword","ParsedCodeStatement","content","LRParser","meta","name","tags","NodeProp","LRLanguage","LanguageSupport","uuidv7","OutputStatement","MemoryTypeEnum","BlockKey","formatDuration","actions","metrics","l","extended","dim","expr","atoms","tokenize","parseExpression","operator"],"mappings":";;;;;;;;;;;;;;;AAoBO,IAAM,WAAN,MAA4D;AAAA,EACzD,KAAA,uBAAY,GAAA,EAAe;AAAA,EAEnC,WAAA,CAAY,QAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,IAAA,EAAe;AACtB,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,WAAW,EAAA,EAAkB;AAC3B,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,EACtB;AAAA;AAAA,EAGA,IAAI,EAAA,EAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,EAAA,EAA2B;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAA,GAAY;AACV,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,MAC9B,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,EAAE,QAAA,IAAY,CAAA,KAAM,EAAE,QAAA,IAAY,CAAA;AAAA,KAC/C;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA;AAAA,EACpB;AACF;AClBO,IAAM,cAAA,GAAiB;AAAA;AAAA,EAE5B,kBAAA,EAAoB,6BAAA;AAAA;AAAA,EAEpB,cAAA,EAAgB,yBAAA;AAAA;AAAA,EAEhB,WAAA,EAAa,sBAAA;AAAA;AAAA,EAEb,WAAA,EAAa,eAAA;AAAA,EACb,UAAA,EAAY,cAAA;AAAA,EACZ,YAAA,EAAc,gBAAA;AAAA,EACd,cAAA,EAAgB;AAClB;AAGO,IAAM,kBAAA,GAAwC,MAAA,CAAO,MAAA,CAAO,cAAc;AASjF,SAAS,UAAU,MAAA,EAA8C;AAC/D,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,EAAA,IAAI,MAAM,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,SAAU,MAAA,CAAO,UAAA;AACpD,EAAA,MAAM,IAAI,MAAA,CAAO,OAAA;AACjB,EAAA,IAAI,CAAC,CAAA,EAAG,OAAO,EAAC;AAChB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,CAAA;AAE7B,EAAA,OAAO,CAAA,CAAE,cAAc,EAAC;AAC1B;AAGO,SAAS,UAAA,CAAW,IAAA,EAAc,MAAA,GAAuB,SAAA,EAAoB;AAClF,EAAA,OAAO,EAAE,MAAMA,sBAAA,CAAW,IAAA,EAAM,OAAO,IAAA,EAAM,KAAA,EAAO,MAAM,MAAA,EAAO;AACnE;AAMO,SAAS,gBAAA,CACd,KAAA,EACA,QAAA,EACA,MAAA,GAAuB,SAAA,EACN;AACjB,EAAA,MAAM,SAAA,GAAY,QAAA,IAAYC,2BAAA,CAAgB,KAAA,CAAM,SAAS,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,QAAA,CAAS,SAAS,CAAC,CAAA;AACxC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AACpB,IAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,IAAA,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,SAAA;AACT;AAGO,SAAS,SAAS,MAAA,EAA6C;AACpE,EAAA,OAAO,UAAU,MAAM,CAAA,CACpB,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAA,KAASD,sBAAA,CAAW,IAAA,IAAQ,OAAO,EAAE,KAAA,KAAU,QAAQ,EACrE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,KAAe,CAAA;AAC/B;AAGO,SAAS,OAAA,CAAQ,QAAmC,IAAA,EAAuB;AAChF,EAAA,OAAO,SAAA,CAAU,MAAM,CAAA,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAA,CAAW,IAAA,IAAQ,CAAA,CAAE,KAAA,KAAU,IAAI,CAAA;AACnF;;;ACvFA,IAAM,YAAA,GAAe,wBAAA;AASd,IAAM,OAAA,GAAN,MAAM,QAAA,CAAQ;AAAA;AAAA,EAEF,IAAA;AAAA,EACA,OAAA;AAAA,EAEjB,WAAA,CAAY,IAAA,GAA2B,EAAC,EAAG;AACzC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,uBAAc,GAAA,EAAI;AAEvB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,WAAA,IAAe,GAAG,CAAA;AACjD,MAAA,KAAA,MAAW,KAAA,IAAS,IAAI,OAAA,EAAS;AAC/B,QAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,WAAA,IAAe,GAAG,CAAA;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,KAAA,EAAoC;AACtC,IAAA,OAAO,KAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAA,EAAK,CAAE,aAAa,CAAA;AAAA,EACpD;AAAA;AAAA,EAGA,IAAI,KAAA,EAAwB;AAC1B,IAAA,OAAO,KAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAA,EAAK,CAAE,aAAa,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAe,IAAA,EAAgC;AAC7C,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA;AAC5C,IAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,IAAA,MAAM,KAAA,GAAQ,EAAE,CAAC,CAAA;AACjB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC3B,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,OAAO,EAAE,MAAM,KAAA,EAAO,IAAA,EAAM,EAAE,CAAC,CAAA,CAAE,MAAK,EAAE;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,KAAA,EAA2B;AACnC,IAAA,OAAO,IAAI,SAAQ,CAAC,GAAG,KAAK,IAAA,EAAM,GAAG,KAAK,CAAC,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,OAAA,GAAqB;AACnB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,IAAI,CAAA;AAAA,EACtB;AACF;AAMO,IAAM,cAAA,GAAqC;AAAA;AAAA,EAEhD,EAAE,SAAA,EAAW,GAAA,EAAM,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,CAAC,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAA,EAAE;AAAA,EACxF,EAAE,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,CAAC,WAAA,EAAa,YAAA,EAAc,WAAA,EAAa,YAAY,CAAA,EAAE;AAAA,EACxG,EAAE,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,CAAC,YAAA,EAAc,aAAA,EAAe,YAAA,EAAc,aAAa,CAAA,EAAE;AAAA,EAC5G,EAAE,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,CAAC,YAAA,EAAc,aAAA,EAAe,YAAA,EAAc,aAAa,CAAA,EAAE;AAAA,EAC5G,EAAE,WAAW,IAAA,EAAM,SAAA,EAAW,UAAU,OAAA,EAAS,CAAC,MAAA,EAAQ,MAAM,CAAA,EAAE;AAAA,EAClE,EAAE,WAAW,IAAA,EAAM,SAAA,EAAW,UAAU,OAAA,EAAS,CAAC,MAAA,EAAQ,QAAQ,CAAA,EAAE;AAAA,EACpE,EAAE,WAAW,IAAA,EAAM,SAAA,EAAW,UAAU,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAO,CAAA,EAAE;AAAA,EACnE,EAAE,WAAW,IAAA,EAAM,SAAA,EAAW,UAAU,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAO,CAAA,EAAE;AAAA;AAAA,EAGnE,EAAE,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,WAAW,CAAA,EAAE;AAAA,EAC1F,EAAE,WAAW,GAAA,EAAM,SAAA,EAAW,QAAQ,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAO,CAAA,EAAE;AAAA,EACjE,EAAE,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAS,CAAC,KAAA,EAAO,OAAA,EAAS,QAAQ,CAAA,EAAE;AAAA,EAC1E,EAAE,WAAW,IAAA,EAAM,SAAA,EAAW,QAAQ,OAAA,EAAS,CAAC,YAAY,CAAA,EAAE;AAAA;AAAA,EAG9D,EAAE,SAAA,EAAW,KAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,SAAS,CAAC,MAAA,EAAQ,SAAA,EAAW,UAAU,CAAA,EAAE;AAAA,EACnF,EAAE,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,SAAS,CAAC,OAAA,EAAS,aAAA,EAAe,cAAc,CAAA;AAC5F;AAMO,IAAM,YAAA,GAAe;AAAA;AAAA,EAE1B,QAAA,GAAoB;AAClB,IAAA,OAAO,IAAI,QAAQ,cAAc,CAAA;AAAA,EACnC,CAAA;AAAA;AAAA,EAEA,GAAG,KAAA,EAAoC;AACrC,IAAA,OAAO,IAAI,QAAQ,KAAK,CAAA;AAAA,EAC1B;AACF;;;AChIO,IAAM,cAAA,GAAiB,CAAC,EAAA,KAAuB;AACpD,EAAA,IAAI,EAAA,KAAO,UAAa,EAAA,KAAO,IAAA,IAAQ,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAG;AAC3D,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,MAAM,aAAa,EAAA,GAAK,CAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACzB,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAI,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,EAAE,CAAA;AAC5C,EAAA,MAAM,UAAU,YAAA,GAAe,EAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,aAAa,GAAA,GAAM,EAAA;AAChC,EAAA,OAAO,GAAG,IAAI,CAAA,EAAG,OAAA,CAAQ,QAAA,GAAW,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,IAAI,OAAA,CAAQ,QAAA,GAAW,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC7F,CAAA;AAMO,IAAM,gBAAA,GAAmB,CAAC,EAAA,KAAuB;AACtD,EAAA,IAAI,EAAA,KAAO,UAAa,EAAA,KAAO,IAAA,IAAQ,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAG;AAC3D,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,MAAM,aAAa,EAAA,GAAK,CAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACzB,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAI,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,IAAI,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,OAAQ,EAAE,CAAA;AACrD,EAAA,MAAM,UAAU,YAAA,GAAe,EAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,aAAa,GAAA,GAAM,EAAA;AAChC,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,KAAA,CAAM,QAAA,GAAW,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAA,EAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAClI,CAAA;AA8DO,IAAM,mBAAA,GAAsB,CAAC,EAAA,KAAuB;AACzD,EAAA,IAAI,EAAA,KAAO,UAAa,EAAA,KAAO,IAAA,IAAQ,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAG;AAC3D,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACzB,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,GAAI,CAAA;AAC5C,EAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,IAAA,OAAO,iBAAiB,EAAE,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,eAAe,EAAE,CAAA;AAC1B,CAAA;;;AC3GA,IAAM,eAAA,uBAAsB,GAAA,CAAY;AAAA,EACtCA,sBAAAA,CAAW,QAAA;AAAA,EACXA,sBAAAA,CAAW,IAAA;AAAA,EACXA,sBAAAA,CAAW,OAAA;AAAA,EACXA,sBAAAA,CAAW;AACb,CAAC,CAAA;AAEM,SAAS,iBAAiB,IAAA,EAAoC;AACnE,EAAA,OAAO,eAAA,CAAgB,IAAI,IAAc,CAAA;AAC3C;AAGA,SAAS,SAAS,MAAA,EAAyB;AACzC,EAAA,IAAI,MAAA,CAAO,KAAA,EAAO,OAAO,MAAA,CAAO,KAAA;AAChC,EAAA,IAAI,OAAO,KAAA,KAAU,MAAA,IAAa,OAAO,KAAA,KAAU,IAAA,SAAa,MAAA,CAAO,IAAA;AACvE,EAAA,IAAI,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,EAAU;AACpC,IAAA,MAAM,IAAI,MAAA,CAAO,KAAA;AACjB,IAAA,IAAI,MAAA,IAAU,CAAA,EAAG,OAAO,MAAA,CAAO,EAAE,IAAI,CAAA;AACrC,IAAA,IAAI,SAAA,IAAa,CAAA,EAAG,OAAO,CAAA,MAAA,EAAS,EAAE,OAAO,CAAA,CAAA;AAC7C,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAK,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,MAAA,CAAO,OAAO,KAAK,CAAA;AAC5B;AAMO,SAAS,YAAA,CAAa,QAAiB,QAAA,EAA6C;AAEzF,EAAA,IAAI,iBAAiB,MAAA,CAAO,IAAI,KAAK,OAAO,MAAA,CAAO,UAAU,QAAA,EAAU;AACrE,IAAA,OAAO,mBAAA,CAAoB,OAAO,KAAK,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,IAAA,GAAO,SAAS,MAAM,CAAA;AAG5B,EAAA,IAAI,OAAO,IAAA,KAASA,sBAAAA,CAAW,MAAA,IAAW,MAAA,CAAO,SAAoB,QAAA,EAAU;AAC7E,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AACzB,MAAA,MAAM,CAAA,GAAI,OAAO,OAAO,CAAA;AACxB,MAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,CAAA,KAAM,CAAA,GAAI,UAAU,QAAQ,CAAA,CAAA;AAAA,IAChD;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,aAAa,MAAA,EAAyB;AACpD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AACjC,EAAA,IAAI,MAAA,CAAO,UAAU,MAAA,EAAW,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AACnE,EAAA,IAAI,OAAO,MAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AACxD,EAAA,IAAI,OAAO,cAAA,EAAgB,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,MAAA,CAAO,cAAc,CAAA,CAAE,CAAA;AACvE,EAAA,IAAI,MAAA,CAAO,WAAW,KAAA,CAAM,IAAA,CAAK,SAAS,MAAA,CAAO,SAAA,CAAU,WAAA,EAAa,CAAA,CAAE,CAAA;AAC1E,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAMA,IAAM,gBAAA,GAAoD;AAAA,EACxD,QAAA,EAAiB,UAAA;AAAA,EACjB,GAAA,EAAiB,MAAA;AAAA,EACjB,MAAA,EAAiB,QAAA;AAAA,EACjB,QAAA,EAAiB,UAAA;AAAA,EACjB,MAAA,EAAiB,QAAA;AAAA,EACjB,UAAA,EAAiB,YAAA;AAAA,EACjB,MAAA,EAAiB,QAAA;AAAA,EACjB,SAAA,EAAiB,WAAA;AAAA,EACjB,MAAA,EAAiB,QAAA;AAAA,EACjB,KAAA,EAAiB,OAAA;AAAA,EACjB,IAAA,EAAiB,MAAA;AAAA,EACjB,MAAA,EAAiB,QAAA;AAAA,EACjB,UAAA,EAAiB,YAAA;AAAA,EACjB,eAAA,EAAiB,eAAA;AAAA,EACjB,MAAA,EAAiB,QAAA;AAAA,EACjB,SAAA,EAAiB,WAAA;AAAA,EACjB,IAAA,EAAiB,MAAA;AAAA,EACjB,IAAA,EAAiB,MAAA;AAAA,EACjB,GAAA,EAAiB,KAAA;AAAA,EACjB,KAAA,EAAiB,OAAA;AAAA,EACjB,IAAA,EAAiB,MAAA;AAAA,EACjB,OAAA,EAAiB,SAAA;AAAA,EACjB,KAAA,EAAiB,OAAA;AAAA,EACjB,aAAA,EAAiB,aAAA;AAAA,EACjB,KAAA,EAAiB,OAAA;AAAA,EACjB,MAAA,EAAiB,QAAA;AAAA,EACjB,GAAA,EAAiB,KAAA;AAAA,EACjB,aAAA,EAAiB,aAAA;AAAA,EACjB,cAAA,EAAiB,cAAA;AAAA,EACjB,WAAA,EAAiB,WAAA;AAAA,EACjB,GAAA,EAAiB,KAAA;AAAA,EACjB,KAAA,EAAiB;AACnB,CAAA;AAEO,SAAS,kBAAkB,KAAA,EAAuB;AACvD,EAAA,MAAM,MAAA,GAAS,KAAA,CACZ,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA,CACrB,OAAA,CAAQ,oBAAA,EAAsB,OAAO,CAAA,CACrC,OAAA,CAAQ,uBAAA,EAAyB,OAAO,EACxC,IAAA,EAAK;AAER,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAEhC,EAAA,OAAO,OACJ,KAAA,CAAM,KAAK,CAAA,CACX,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,IAAI,IAAA,KAAS,IAAA,CAAK,WAAA,EAAY,EAAG,OAAO,IAAA;AACxC,IAAA,IAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AACrC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,KAAgB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAAA,EAClE,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AACb;AAEO,SAAS,mBAAmB,IAAA,EAAmC;AACpE,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAI,CAAA,CAAE,IAAA,EAAK;AAC9B,EAAA,MAAM,UAAA,GAAa,IAAI,WAAA,EAAY;AACnC,EAAA,OAAO,gBAAA,CAAiB,UAAU,CAAA,IAAK,iBAAA,CAAkB,GAAG,CAAA;AAC9D;;;ACrHA,SAAS,aAAa,MAAA,EAA0B;AAC9C,EAAA,MAAME,EAAAA,GAAK,MAAA,CAAO,IAAA,CAAgB,WAAA,EAAY;AAC9C,EAAA,IAAIA,EAAAA,KAAM,UAAU,OAAO,KAAA;AAC3B,EAAA,MAAM,CAAA,GAAK,MAAA,CAAO,KAAA,IAAgC,MAAA,CAAO,KAAA,IAAS,EAAA;AAClE,EAAA,OAAO,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAY,KAAM,MAAA;AACpC;AAEA,SAAS,WAAA,CAAY,QAAiB,IAAA,EAA2B;AAC/D,EAAA,IAAI,MAAM,OAAO,MAAA;AACjB,EAAA,MAAMA,EAAAA,GAAK,MAAA,CAAO,IAAA,CAAgB,WAAA,EAAY;AAC9C,EAAA,MAAM,OAAA,GAAsC;AAAA,IAC1C,IAAA,EAAM,MAAA;AAAA,IAAQ,QAAA,EAAU,MAAA;AAAA,IAAQ,OAAA,EAAS,MAAA;AAAA,IAAQ,KAAA,EAAO,MAAA;AAAA,IAAQ,KAAA,EAAO,MAAA;AAAA,IACvE,GAAA,EAAK,KAAA;AAAA,IACL,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,QAAA;AAAA,IAAU,SAAA,EAAW,QAAA;AAAA,IAAU,eAAA,EAAiB,QAAA;AAAA,IACxD,MAAA,EAAQ,QAAA;AAAA,IACR,UAAA,EAAY,YAAA;AAAA,IACZ,IAAA,EAAM,OAAA;AAAA,IAAS,KAAA,EAAO,OAAA;AAAA,IAAS,KAAA,EAAO,OAAA;AAAA,IAAS,GAAA,EAAK,OAAA;AAAA,IACpD,MAAA,EAAQ,QAAA;AAAA,IAAU,aAAA,EAAe,QAAA;AAAA,IACjC,MAAA,EAAQ,KAAA;AAAA,IAAO,SAAA,EAAW,QAAA;AAAA,IAAU,IAAA,EAAM,YAAA;AAAA,IAAc,IAAA,EAAM,QAAA;AAAA,IAC9D,GAAA,EAAK,QAAA;AAAA,IAAU,aAAA,EAAe,QAAA;AAAA,IAAU,cAAA,EAAgB,YAAA;AAAA,IACxD,WAAA,EAAa,UAAA;AAAA,IAAY,GAAA,EAAK,QAAA;AAAA,IAAU,KAAA,EAAO,QAAA;AAAA,IAAU,MAAA,EAAQ,QAAA;AAAA,IACjE,MAAA,EAAQ,OAAA;AAAA,IAAS,UAAA,EAAY;AAAA,GAC/B;AACA,EAAA,OAAO,OAAA,CAAQA,EAAC,CAAA,IAAK,SAAA;AACvB;AAIA,SAAS,YAAA,GAA0C;AACjD,EAAA,MAAM,MAAA,GAAoC;AAAA,IAExC,aAAa,MAAA,EAA0B;AACrC,MAAA,MAAMA,KAAI,MAAA,CAAO,IAAA;AACjB,MAAA,IAAIA,EAAAA,KAAMF,sBAAAA,CAAW,KAAA,IAASE,EAAAA,KAAM,OAAA,EAAS;AAC3C,QAAA,MAAM,GAAA,GAAM,OAAO,KAAA,IAAS,EAAA;AAC5B,QAAA,OAAO,GAAA,KAAQ,OAAO,GAAA,KAAQ,GAAA;AAAA,MAChC;AACA,MAAA,OAAOA,EAAAA,KAAMF,sBAAAA,CAAW,GAAA,IAAOE,EAAAA,KAAM,KAAA;AAAA,IACvC,CAAA;AAAA,IAEA,QAAA,CAAS,QAAiB,OAAA,EAA6C;AACrE,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,EAAG;AAC7B,QAAA,OAAO,OAAA,KAAY,OAAA;AAAA,MACrB;AACA,MAAA,MAAMA,KAAI,MAAA,CAAO,IAAA;AAEjB,MAAA,IAAA,CAAKA,OAAMF,sBAAAA,CAAW,KAAA,IAASE,OAAM,OAAA,KAAY,OAAA,KAAY,SAAS,OAAO,IAAA;AAE7E,MAAA,IAAI,YAAY,oBAAA,EAAsB;AACpC,QAAA,IACEA,EAAAA,KAAMF,sBAAAA,CAAW,OAAA,IAAWE,EAAAA,KAAM,SAAA,IAClCA,OAAMF,sBAAAA,CAAW,KAAA,IAAWE,EAAAA,KAAM,OAAA,EAClC,OAAO,IAAA;AACT,QAAA,IAAIA,EAAAA,KAAMF,sBAAAA,CAAW,MAAA,IAAUE,EAAAA,KAAM,UAAU,OAAO,IAAA;AAAA,MACxD;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IAEA,OAAA,CAAQ,QAAiB,OAAA,EAA6D;AACpF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AAC5C,MAAA,MAAM,IAAA,GAAO,aAAa,MAAM,CAAA;AAChC,MAAA,MAAMC,QAAAA,GAAAA,CAAW,OAAO,IAAA,KAASH,sBAAAA,CAAW,QAAQ,MAAA,CAAO,IAAA,KAAS,MAAA,KAC/D,MAAA,CAAO,MAAA,KAAW,QAAA;AACvB,MAAA,MAAM,WAAA,GAAc,OAAO,MAAA,KAAW,MAAA;AAEtC,MAAA,IAAI,UAAA;AACJ,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,UAAA,GAAa,QAAA;AAAA,MACf,WAAWG,QAAAA,EAAS;AAClB,QAAA,UAAA,GAAa,SAAA;AAAA,MACf,WACE,OAAA,KAAY,gBAAA,IACZ,OAAA,KAAY,eAAA,IACZ,YAAY,gBAAA,EACZ;AACA,QAAA,UAAA,GAAa,YAAA;AAAA,MACf,CAAA,MAAA,IAAW,YAAY,oBAAA,EAAsB;AAC3C,QAAA,UAAA,GAAa,gBAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA,UAAA,GAAa,OAAA;AAAA,MACf;AAEA,MAAA,OAAO;AAAA,QACL,MAAA;AAAA,QACA,KAAA,EAAO,YAAA,CAAa,MAAe,CAAA;AAAA,QACnC,OAAA,EAAS,aAAa,MAAM,CAAA;AAAA,QAC5B,UAAA;AAAA,QACA,IAAA,EAAM,WAAA,CAAY,MAAA,EAAQ,IAAI,CAAA;AAAA,QAC9B,OAAA,EAAS,IAAA,GAAO,MAAA,GAAU,MAAA,CAAO,IAAA;AAAA,QACjC,SAAS,CAAC,MAAA;AAAA,QACV,UAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA,EAAAA,QAAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA,EAAa,kBAAA,CAAmB,MAAA,CAAO,IAAI;AAAA,OAC7C;AAAA,IACF,CAAA;AAAA,IAEA,YAAA,CACE,SACA,OAAA,EAC2B;AAC3B,MAAA,OAAO,QAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,KAAK,OAAA,CAAQ,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,IAClD,CAAA;AAAA,IAEA,YAAY,IAAA,EAAmC;AAC7C,MAAA,OAAO,mBAAmB,IAAI,CAAA;AAAA,IAChC;AAAA,GACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,IAAM,qBAAqB,YAAA;AClI3B,IAAM,eAAN,MAAsC;AAAA,EAK3C,YAAmB,MAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AAAA,EACf;AAAA,EAHmB,MAAA;AAAA,EAJV,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA,GAAuB,QAAA;AAAA,EAMvB,OAAOH,sBAAAA,CAAW,MAAA;AAC7B,CAAA;ACVO,IAAM,iBAAN,MAAwC;AAAA,EAK7C,WAAA,CAAY,OAAkC,IAAA,EAAc;AAAd,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAC5C,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAW;AACzC,IAAA,IAAA,CAAK,KAAA,GAAQ,UAAU,MAAA,GAAY,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA;AAEjE,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA,KAAU,MAAA,GAAY,QAAA,GAAW,QAAA;AAAA,EACjD;AAAA,EAL8C,IAAA;AAAA,EAJrC,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EAQA,OAAOA,sBAAAA,CAAW,QAAA;AAC7B,CAAA;ACZO,IAAM,mBAAN,MAA0C;AAAA,EAK/C,WAAA,CAAY,OAAkC,IAAA,EAAc;AAAd,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAC5C,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAW;AACzC,IAAA,IAAA,CAAK,KAAA,GAAQ,UAAU,MAAA,GAAY,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA;AAEjE,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA,KAAU,MAAA,GAAY,QAAA,GAAW,QAAA;AAAA,EACjD;AAAA,EAL8C,IAAA;AAAA,EAJrC,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EAQA,OAAOA,sBAAAA,CAAW,UAAA;AAC7B,CAAA;ACLO,IAAM,iBAAN,MAAwC;AAAA,EAM7C,WAAA,CACE,MAAA,EACO,IAAA,EACA,SAAA,EACP;AAFO,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAEP,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,MAAA,EAAQ,IAAA,EAAK;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQ,WAAW,MAAA,GAAY,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA,KAAW,MAAA,GAAY,QAAA,GAAW,QAAA;AAGhD,IAAA,IAAA,CAAK,IAAA,GAAO,SAAA,KAAc,QAAA,GAAW,QAAA,GAAWA,sBAAAA,CAAW,MAAA;AAAA,EAC7D;AAAA,EATS,IAAA;AAAA,EACA,SAAA;AAAA,EARA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAcX,CAAA;;;ACXO,IAAM,UAAA,GAAa,EAAA;AAgBnB,SAAS,kBAAA,CACZ,MAAA,EACA,KAAA,EACA,SAAA,EACO;AACP,EAAA,QAAQ,SAAA;AAAW,IACf,KAAK,QAAA;AACD,MAAA,OAAO,IAAI,cAAA,CAAe,MAAA,EAAQ,KAAK,CAAA;AAAA,IAC3C,KAAK,MAAA;AACD,MAAA,OAAO,IAAI,gBAAA,CAAiB,MAAA,EAAQ,KAAK,CAAA;AAAA,IAC7C;AACI,MAAA,OAAO,IAAI,cAAA,CAAe,MAAA,EAAQ,KAAA,EAAO,SAAS,CAAA;AAAA;AAE9D;AC1BO,IAAM,oBAAN,MAA2C;AAAA,EAMhD,YAA4B,YAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,YAAA,EAAa;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQ,YAAA,CAAa,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,IAAS,MAAA,CAAO,CAAA,CAAE,KAAA,IAAS,EAAE,CAAC,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,EACjF;AAAA,EAH4B,YAAA;AAAA,EALnB,OAAOA,sBAAAA,CAAW,MAAA;AAAA,EAClB,MAAA,GAAuB,QAAA;AAAA,EACvB,KAAA;AAAA,EACA,KAAA;AAMX,CAAA;;;ACHA,SAAS,aAAa,CAAA,EAAqB;AAEvC,EAAA,OAAO,CAAA,CAAE,SAASA,sBAAAA,CAAW,GAAA,KAAQ,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,CAAA,CAAE,KAAA,KAAU,MAAA,CAAA;AACpF;AAGA,SAAS,iBAAiB,CAAA,EAAqB;AAC3C,EAAA,OAAO,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,MAAA,IAAA,CAAW,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,MAAW,GAAA;AACjG;AAGA,SAAS,gBAAgB,CAAA,EAAqB;AAC1C,EAAA,OAAO,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,MAAA,IAAA,CAAW,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,MAAW,GAAA;AACjG;AAEA,SAAS,WAAW,CAAA,EAA2B;AAC3C,EAAA,IAAI,CAAA,CAAE,SAASA,sBAAAA,CAAW,MAAA,IAAU,EAAE,IAAA,KAASA,sBAAAA,CAAW,MAAM,OAAO,IAAA;AACvE,EAAA,IAAI,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,SAAiB,CAAA,CAAE,KAAA;AAC1C,EAAA,OAAO,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,GAAQ,IAAA;AACnD;AAGA,SAAS,aAAa,CAAA,EAAqB;AACvC,EAAA,IAAI,CAAA,CAAE,SAASA,sBAAAA,CAAW,QAAA,IAAY,EAAE,IAAA,KAASA,sBAAAA,CAAW,YAAY,OAAO,KAAA;AAC/E,EAAA,MAAM,IAAI,CAAA,CAAE,KAAA;AACZ,EAAA,OAAO,CAAC,CAAC,CAAA,IAAK,CAAA,CAAE,MAAA,KAAW,WAAc,CAAC,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,KAAS,UAAA,CAAA;AACnE;AAGA,SAAS,SAAA,CAAU,UAAA,EAAkB,UAAA,EAAkB,KAAA,EAAqB;AAC1E,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,SAAmB,UAAA,IAAc,UAAA;AACrD,EAAA,MAAM,cAAc,UAAA,CAAW,WAAA;AAC/B,EAAA,MAAM,QAAA,GAAA,CAAY,UAAA,CAAW,WAAA,IAAe,CAAA,IAAK,KAAA,CAAM,MAAA;AACvD,EAAA,MAAM,GAAA,GAAA,CAAO,UAAA,CAAW,WAAA,IAAe,CAAA,KAAM,WAAW,SAAA,IAAa,CAAA,CAAA;AACrE,EAAA,MAAM,GAAA,GACJ,UAAA,CAAW,GAAA,KAAQ,MAAA,GACf,WAAW,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,IAAI,KAAA,GAChD,MAAA;AACN,EAAA,MAAM,MAAA,GAAS,WAAA,KAAgB,MAAA,GAAY,QAAA,GAAW,WAAA,GAAc,MAAA;AACpE,EAAA,OAAO;AAAA,IACL,MAAM,UAAA,CAAW,IAAA;AAAA,IACjB,WAAA;AAAA,IACA,SAAA,EAAW,QAAA;AAAA,IACX,aAAa,UAAA,CAAW,WAAA;AAAA,IACxB,SAAA,EAAW,WAAW,WAAA,KAAgB,MAAA,IAAa,WAAW,MAAA,GAC1D,UAAA,CAAW,WAAA,GAAc,MAAA,GACzB,UAAA,CAAW,SAAA;AAAA,IACf,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAGA,SAAS,YAAA,CAAa,YAAkB,IAAA,EAAoB;AAC1D,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,GAAA,KAAQ,MAAA,EAAW;AAC/C,IAAA,OAAO,aAAa,EAAE,GAAG,UAAA,EAAY,GAAA,EAAK,MAAK,GAAI,UAAA;AAAA,EACrD;AACA,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,SAAA,IAAa,CAAA,GAAI,SAAA,GAAY,CAAA;AAC5C,EAAA,MAAM,WAAA,GAAA,CAAe,UAAA,CAAW,WAAA,IAAe,CAAA,IAAK,MAAA;AACpD,EAAA,OAAO;AAAA,IACL,MAAM,UAAA,CAAW,IAAA;AAAA,IACjB,WAAA;AAAA,IACA,WAAW,UAAA,CAAW,SAAA;AAAA,IACtB,WAAA,EAAA,CAAc,UAAA,CAAW,WAAA,IAAe,CAAA,IAAK,MAAA;AAAA,IAC7C,WAAW,UAAA,CAAW,SAAA;AAAA,IACtB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,GAAA,EAAK;AAAA,GACP;AACF;AAEA,SAAS,QAAA,CAAS,WAAiB,QAAA,EAAsB;AACvD,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,QAAA,SAAiB,SAAA,IAAa,QAAA;AACjD,EAAA,MAAM,cAAc,SAAA,CAAU,WAAA;AAC9B,EAAA,MAAM,YAAY,QAAA,CAAS,SAAA;AAC3B,EAAA,MAAM,SAAS,WAAA,KAAgB,MAAA,IAAa,SAAA,KAAc,MAAA,GACtD,YAAY,WAAA,GACZ,MAAA;AACJ,EAAA,OAAO;AAAA,IACL,MAAM,SAAA,CAAU,IAAA;AAAA,IAChB,WAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAa,SAAA,CAAU,WAAA;AAAA,IACvB,WAAW,QAAA,CAAS,SAAA;AAAA,IACpB,MAAA;AAAA,IACA,KAAK,SAAA,CAAU;AAAA,GACjB;AACF;AAOA,SAAS,SAAA,CAAU,OAAmB,KAAA,EAA4B;AAChE,EAAA,MAAM,MAAkB,EAAC;AAEzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAKxB,IAAA,IAAI,iBAAiB,GAAA,CAAI,MAAM,KAAK,eAAA,CAAgB,GAAA,CAAI,MAAM,CAAA,EAAG;AAC/D,MAAA;AAAA,IACF;AAMA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA;AACrC,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,UAAA,CAAW,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,CAAE,MAAM,CAAA,GAAI,IAAA;AACnE,MAAA,IACE,YAAY,IAAA,IACZ,eAAA,CAAgB,KAAK,MAAM,CAAA,IAC3B,cAAc,IAAA,EACd;AAEA,QAAA,MAAM,YAAA,GAA0B,CAAC,GAAA,CAAI,MAAM,CAAA;AAC3C,QAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,QAAA,OACE,IAAI,CAAA,GAAI,KAAA,CAAM,MAAA,IACd,eAAA,CAAgB,MAAM,CAAC,CAAA,CAAE,MAAM,CAAA,IAC/B,WAAW,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,CAAE,MAAM,MAAM,IAAA,EACpC;AACA,UAAA,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,CAAC,EAAE,MAAM,CAAA;AACrC,UAAA,CAAA,IAAK,CAAA;AAAA,QACP;AACA,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,MAAA,EAAQ,IAAI,iBAAA,CAAkB,YAAY,CAAA;AAAA,UAC1C,IAAA,EAAM,SAAS,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA,GAAI,CAAC,EAAE,IAAI;AAAA,SAC3C,CAAA;AACD,QAAA,CAAA,GAAI,CAAA,GAAI,CAAA;AACR,QAAA;AAAA,MACF;AAAA,IACF;AAMA,IAAA,IAAI,IAAA,IAAQ,MAAM,CAAA,GAAI,CAAC,KAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,EAAG;AACxC,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC1B,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC1B,MAAA,MAAM,WAAW,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,IAAK,YAAA,CAAa,IAAI,MAAM,CAAA;AACpE,MAAA,MAAM,WAAW,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA,IAAK,YAAA,CAAa,OAAO,MAAM,CAAA;AAE1E,MAAA,IAAI,QAAA,IAAY,eAAA,CAAgB,IAAA,CAAK,MAAM,KAAK,QAAA,EAAU;AACxD,QAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AACrC,QAAA,MAAM,QAAQ,IAAA,KAAS,IAAA,GAAO,KAAA,CAAM,cAAA,CAAe,IAAI,CAAA,GAAI,IAAA;AAC3D,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,OAAA,GAAU,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,GAClC,IAAI,MAAA,CAAO,KAAA,GACX,GAAA,CAAI,MAAA,CAAO,KAAA,CAA8B,MAAA;AAC9C,UAAA,MAAM,OAAA,GAAU,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA,GACrC,OAAO,MAAA,CAAO,KAAA,GACd,MAAA,CAAO,MAAA,CAAO,KAAA,CAA8B,MAAA;AAEjD,UAAA,MAAM,OAAO,kBAAA,CAAmB,OAAA,EAAS,MAAM,KAAA,EAAO,KAAA,CAAM,KAAK,SAAS,CAAA;AAC1E,UAAA,MAAM,OAAO,kBAAA,CAAmB,OAAA,EAAS,MAAM,KAAA,EAAO,KAAA,CAAM,KAAK,SAAS,CAAA;AAG1E,UAAA,IAAI,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM;AAC3B,YAAA,MAAM,aAAa,SAAA,CAAU,GAAA,CAAI,MAAM,MAAA,CAAO,IAAA,EAAM,MAAM,KAAK,CAAA;AAC/D,YAAA,GAAA,CAAI,IAAA,CAAK;AAAA,cACP,QAAQ,IAAI,iBAAA,CAAkB,CAAC,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,cAC1C,IAAA,EAAM;AAAA,aACP,CAAA;AACD,YAAA,IAAI,MAAM,IAAA,EAAM;AACd,cAAA,GAAA,CAAI,IAAA,CAAK;AAAA,gBACP,MAAA,EAAQ,IAAI,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AAAA,gBACnC,IAAA,EAAM,YAAA,CAAa,MAAA,CAAO,IAAA,EAAM,MAAM,IAAI;AAAA,eAC3C,CAAA;AAAA,YACH;AACA,YAAA,CAAA,IAAK,CAAA;AACL,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAOA,IAAA,IAAI,IAAA,IAAQ,MAAM,CAAA,GAAI,CAAC,KAAK,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,EAAG;AACxC,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC1B,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAC1B,MAAA,MAAM,WAAW,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,IAAK,YAAA,CAAa,IAAI,MAAM,CAAA;AACpE,MAAA,MAAM,WAAW,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA,IAAK,YAAA,CAAa,OAAO,MAAM,CAAA;AAE1E,MAAA,IAAI,QAAA,IAAY,gBAAA,CAAiB,IAAA,CAAK,MAAM,KAAK,QAAA,EAAU;AACzD,QAAA,MAAM,IAAA,GAAO,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AACrC,QAAA,MAAM,QAAQ,IAAA,KAAS,IAAA,GAAO,KAAA,CAAM,cAAA,CAAe,IAAI,CAAA,GAAI,IAAA;AAC3D,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,SAAA,GAAY,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,GACpC,IAAI,MAAA,CAAO,KAAA,GACX,GAAA,CAAI,MAAA,CAAO,KAAA,CAA8B,MAAA;AAC9C,UAAA,MAAM,WAAA,GAAc,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA,GACzC,OAAO,MAAA,CAAO,KAAA,GACd,MAAA,CAAO,MAAA,CAAO,KAAA,CAA8B,MAAA;AAEjD,UAAA,IAAI,SAAA,KAAc,MAAA,IAAa,WAAA,KAAgB,MAAA,IAAa,gBAAgB,CAAA,EAAG;AAC7E,YAAA,MAAM,UAAU,SAAA,GAAY,WAAA;AAC5B,YAAA,MAAM,QAAQ,kBAAA,CAAmB,OAAA,EAAS,MAAM,KAAA,EAAO,KAAA,CAAM,KAAK,SAAS,CAAA;AAC3E,YAAA,MAAM,WAAW,SAAA,CAAU,GAAA,CAAI,MAAM,MAAA,CAAO,IAAA,EAAM,MAAM,KAAK,CAAA;AAC7D,YAAA,GAAA,CAAI,IAAA,CAAK;AAAA,cACP,MAAA,EAAQ,KAAA;AAAA,cACR,IAAA,EAAM;AAAA,aACP,CAAA;AACD,YAAA,IAAI,MAAM,IAAA,EAAM;AACd,cAAA,GAAA,CAAI,IAAA,CAAK;AAAA,gBACP,MAAA,EAAQ,IAAI,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AAAA,gBACnC,IAAA,EAAM,YAAA,CAAa,MAAA,CAAO,IAAA,EAAM,MAAM,IAAI;AAAA,eAC3C,CAAA;AAAA,YACH;AACA,YAAA,CAAA,IAAK,CAAA;AACL,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,UAAU,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,IAAK,YAAA,CAAa,IAAI,MAAM,CAAA;AACnE,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AACnC,QAAA,MAAM,QAAQ,IAAA,KAAS,IAAA,GAAO,KAAA,CAAM,cAAA,CAAe,IAAI,CAAA,GAAI,IAAA;AAC3D,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,GACjC,IAAI,MAAA,CAAO,KAAA,GACX,GAAA,CAAI,MAAA,CAAO,KAAA,CAA8B,MAAA;AAC9C,UAAA,GAAA,CAAI,IAAA,CAAK;AAAA,YACP,QAAQ,kBAAA,CAAmB,MAAA,EAAQ,MAAM,KAAA,EAAO,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,YACpE,MAAM,SAAA,CAAU,GAAA,CAAI,MAAM,IAAA,CAAK,IAAA,EAAM,MAAM,KAAK;AAAA,WACjD,CAAA;AACD,UAAA,IAAI,MAAM,IAAA,EAAM;AACd,YAAA,GAAA,CAAI,IAAA,CAAK;AAAA,cACP,MAAA,EAAQ,IAAI,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AAAA,cACnC,IAAA,EAAM,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,MAAM,IAAI;AAAA,aACzC,CAAA;AAAA,UACH;AACA,UAAA,CAAA,EAAA;AACA,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,EACd;AAEA,EAAA,OAAO,GAAA;AACT;AAUO,SAAS,kBAAA,CAAmB,SAAoB,KAAA,EAA2B;AAChF,EAAA,OAAO,UAAU,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY,EAAE,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAU,CAAE,GAAG,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AACrG;AAQO,SAAS,SAAA,CAAU,WAA2B,KAAA,EAAsB;AACzE,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,OAAA,CAAQ,OAAA,EAAQ;AACzC,EAAA,MAAM,KAAA,GAAoB,MAAA,CAAO,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,IAChD,MAAA;AAAA,IACA,IAAA,EAAM,SAAA,CAAU,UAAA,EAAY,GAAA,CAAI,MAAM;AAAA,GACxC,CAAE,CAAA;AAEF,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA;AAEpC,EAAA,MAAM,OAAA,GACJ,KAAA,CAAM,MAAA,KAAW,MAAA,CAAO,UAAU,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,GAAA,KAAQ,CAAA,CAAE,MAAA,KAAW,MAAA,CAAO,GAAG,CAAC,CAAA;AACnF,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAM,CAAE,GAAA,CAAI,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAE3D,EAAA,IAAI,UAAU,UAAA,EAAY;AACxB,IAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,SAAA,CAAU,UAAU,CAAA;AAE7C,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQ,IAAI,CAAC,MAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,CAAC,CAAA,EAAG,QAAA,CAAS,OAAO,CAAC,CAAA;AACjF,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,IAAI,CAAA,CAAE,IAAA,WAAe,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,IAAW,CAAA;AACvE,IAAA,SAAA,CAAU,UAAA,GAAa,QAAA;AAAA,EACzB;AACF;;;ACnTO,IAAM,eAAN,MAAuC;AAAA,EAC5C,EAAA,GAAK,OAAA;AAAA,EACL,IAAA,GAAO,eAAA;AAAA,EAEU,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOjB,WAAA,CAAY,KAAA,GAAiB,YAAA,CAAa,QAAA,EAAS,EAAG;AACpD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,UAAU,SAAA,EAAiC;AACzC,IAAA,SAAA,CAAU,SAAA,EAAW,KAAK,KAAK,CAAA;AAAA,EACjC;AAAA,EAEA,QAAQ,UAAA,EAA6C;AACnD,IAAA,OAAO,EAAC;AAAA,EACV;AACF;ACxBO,IAAM,kBAAN,MAA0C;AAAA,EAC/C,EAAA,GAAK,UAAA;AAAA,EACL,IAAA,GAAO,kBAAA;AAAA;AAAA;AAAA;AAAA,EAKC,UAAA,CAAW,SAA0BI,QAAAA,EAA0B;AACrE,IAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,MAAK,QACjB,CAAA,CAAE,IAAA,KAASJ,uBAAW,MAAA,IAAU,CAAA,CAAE,SAASA,sBAAAA,CAAW,MAAA,KACvD,OAAO,CAAA,CAAE,UAAU,QAAA,IACnB,CAAA,CAAE,MAAM,WAAA,EAAY,CAAE,SAASI,QAAO;AAAA,KACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,SAAA,EAAoC;AACtD,IAAA,OAAO,SAAA,CAAU,QAAA,IAAY,SAAA,CAAU,QAAA,CAAS,MAAA,GAAS,CAAA;AAAA,EAC3D;AAAA,EAEA,QAAQ,SAAA,EAA4C;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,OAAA,GAAUH,2BAAAA,CAAgB,IAAA,CAAK,SAAA,CAAU,OAAc,CAAA;AAG7D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,OAAO,CAAA;AAChD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,CAAM,KAAK,qBAAqB,CAAA;AAChC,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAAA,IAC5B;AAIA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,MAAM,CAAA;AAC9C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,CAAM,KAAK,6BAA6B,CAAA;AACxC,MAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AAAA,IAC3B;AAOA,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS;AACvB,MAAA,MAAM,YAAY,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASD,uBAAW,MAAM,CAAA;AAChE,MAAA,MAAM,WAAW,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASA,uBAAW,QAAQ,CAAA;AACjE,MAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AAErD,MAAA,IAAI,SAAA,IAAa,YAAY,kBAAA,EAAoB;AAC/C,QAAA,KAAA,CAAM,KAAK,6BAA6B,CAAA;AACxC,QAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,QAAA,KAAA,CAAM,KAAK,uBAAuB,CAAA;AAAA,MACpC;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,UAAU,CAAA,EAAG;AACxC,MAAA,KAAA,CAAM,KAAK,qBAAqB,CAAA;AAChC,MAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAAA,IAC/B;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,QAAQ,CAAA,EAAG;AACtC,MAAA,KAAA,CAAM,KAAK,6BAA6B,CAAA;AACxC,MAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAAA,IAC7B;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,gBAAA,CAAiB,KAAK,CAAA,EAAE;AAAA,EAC5C;AACF;AC/DO,IAAM,aAAN,MAAqC;AAAA,EAC1C,EAAA,GAAK,KAAA;AAAA,EACL,IAAA,GAAO,aAAA;AAAA;AAAA,EAGC,UAAA,CAAW,SAA0BI,QAAAA,EAA0B;AACrE,IAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,MACb,CAAA,CAAA,KAAA,CACG,EAAE,IAAA,KAASJ,sBAAAA,CAAW,UAAU,CAAA,CAAE,IAAA,KAASA,uBAAW,MAAA,KACvD,OAAO,EAAE,KAAA,KAAU,QAAA,IACnB,EAAE,KAAA,CAAM,WAAA,GAAc,QAAA,CAASI,QAAAA,CAAQ,aAAa;AAAA,KACxD;AAAA,EACF;AAAA,EAEA,QAAQ,SAAA,EAA4C;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,OAAA,GAAUH,2BAAAA,CAAgB,IAAA,CAAK,SAAA,CAAU,OAAc,CAAA;AAI7D,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,UAAU,CAAA,EAAG;AACxC,MAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,MAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAC7B,MAAA,KAAA,CAAM,KAAK,uBAAuB,CAAA;AAAA,IACpC;AAIA,IAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS,QAAQ,KAAK,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,WAAW,CAAA,EAAG;AAC/E,MAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,MAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAAA,IAC7B;AAIA,IAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS,OAAO,KAAK,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,WAAW,CAAA,EAAG;AAC9E,MAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,MAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,KAAK,CAAA,EAAG;AACnC,MAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AAAA,IACzB;AAIA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,UAAU,CAAA,EAAG;AACxC,MAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,MAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAAA,IAC/B;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,gBAAA,CAAiB,KAAK,CAAA,EAAE;AAAA,EAC5C;AACF;AClDO,IAAM,gBAAN,MAAwC;AAAA,EAC7C,EAAA,GAAK,QAAA;AAAA,EACL,IAAA,GAAO,gBAAA;AAAA,EAEC,UAAA,CAAW,SAA0BG,QAAAA,EAA0B;AACrE,IAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,MACb,CAAA,CAAA,KAAA,CACG,EAAE,IAAA,KAASJ,sBAAAA,CAAW,UAAU,CAAA,CAAE,IAAA,KAASA,uBAAW,MAAA,KACvD,OAAO,EAAE,KAAA,KAAU,QAAA,IACnB,EAAE,KAAA,CAAM,WAAA,GAAc,QAAA,CAASI,QAAAA,CAAQ,aAAa;AAAA,KACxD;AAAA,EACF;AAAA,EAEQ,YAAY,OAAA,EAAmC;AACrD,IAAA,OAAO,QAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASJ,uBAAW,QAAQ,CAAA;AAAA,EACzD;AAAA,EAEA,QAAQ,SAAA,EAA4C;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,OAAA,GAAUC,2BAAAA,CAAgB,IAAA,CAAK,SAAA,CAAU,OAAc,CAAA;AAG7D,IAAA,IACE,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,KAAK,KAC9B,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,KAAK,CAAA,IAC9B,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,QAAQ,CAAA,EACjC;AACA,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,MAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,MAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAAA,IAC/B;AAGA,IAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS,KAAK,KAAK,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,QAAQ,CAAA,EAAG;AACzE,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,MAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,MAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAAA,IAC/B;AAGA,IAAA,IACE,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,MAAM,KAC/B,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,OAAO,CAAA,IAChC,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,SAAS,CAAA,EAClC;AACA,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,MAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,MAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAAA,IAC/B;AAGA,IAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS,MAAM,KAAK,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,UAAU,CAAA,EAAG;AAC5E,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,MAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,MAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAAA,IAC/B;AAGA,IAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS,MAAM,KAAK,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS,SAAS,CAAA,EAAG;AAC3E,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,MAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AAAA,IAC3B;AAIA,IAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,EAAG;AACnD,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,MAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AAAA,IACtC;AAGA,IAAA,IAAI,MAAM,QAAA,CAAS,eAAe,KAAK,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,EAAG;AAChE,MAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AACpC,MAAA,KAAA,CAAM,KAAK,qBAAqB,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,gBAAA,CAAiB,KAAK,CAAA,EAAE;AAAA,EAC5C;AACF;ACjFO,IAAM,WAAA,GAAN,MAAM,YAAA,CAAgC;AAAA,EAC3C,EAAA,GAAK,MAAA;AAAA,EACL,IAAA,GAAO,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMP,OAAwB,aAAA,GAAgB;AAAA,IACtC,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,QAAA;AAAA,IAAU,cAAA;AAAA,IAAgB,OAAA;AAAA,IACjD,QAAA;AAAA,IAAU,UAAA;AAAA,IAAY,UAAA;AAAA,IAAY,WAAA;AAAA,IAAa,OAAA;AAAA,IAC/C,QAAA;AAAA,IAAU,UAAA;AAAA,IAAY,UAAA;AAAA,IAAY,gBAAA;AAAA,IAClC,UAAA;AAAA,IAAY,MAAA;AAAA,IAAQ,QAAA;AAAA,IAAU,YAAA;AAAA,IAAc;AAAA,GAC9C;AAAA,EAEA,OAAwB,aAAA,GAAgB;AAAA,IACtC,gBAAA;AAAA,IAAkB,SAAA;AAAA,IAAW,MAAA;AAAA,IAAQ;AAAA,GACvC;AAAA,EAEA,OAAwB,kBAAA,GAAqB;AAAA,IAC3C,WAAA;AAAA,IAAa,QAAA;AAAA,IAAU,WAAA;AAAA,IAAa,eAAA;AAAA,IACpC,aAAA;AAAA,IAAe,QAAA;AAAA,IAAU,YAAA;AAAA,IAAc;AAAA,GACzC;AAAA,EAEA,OAAwB,mBAAA,GAAsB;AAAA,IAC5C,YAAA;AAAA,IAAc,UAAA;AAAA,IAAY,aAAA;AAAA,IAAe,WAAA;AAAA,IACzC;AAAA,GACF;AAAA,EAEQ,aAAA,CAAc,SAA0B,QAAA,EAA6B;AAC3E,IAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,MACb,CAAA,CAAA,KAAA,CACG,CAAA,CAAE,IAAA,KAASD,sBAAAA,CAAW,MAAA,IACrB,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,MAAA,IACtB,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,IAAA,KACxB,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,IACnB,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAO,QAAA,EAAS,CAAE,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAC;AAAA,KACpE;AAAA,EACF;AAAA,EAEA,QAAQ,SAAA,EAA4C;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,OAAA,GAAUC,2BAAAA,CAAgB,IAAA,CAAK,SAAA,CAAU,OAAc,CAAA;AAC7D,IAAA,MAAM,cAAc,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASD,uBAAW,QAAQ,CAAA;AAGpE,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,CAAY,aAAa,CAAA,EAAG;AAC1D,MAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,MAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAAA,MAC5B;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,CAAY,aAAa,CAAA,EAAG;AAC1D,MAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,MAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AAAA,IAC3B;AAGA,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,CAAY,kBAAkB,CAAA,EAAG;AAC/D,MAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,MAAA,KAAA,CAAM,KAAK,mBAAmB,CAAA;AAC9B,MAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAAA,IAC/B;AAGA,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,YAAA,CAAY,mBAAmB,CAAA,EAAG;AAChE,MAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AACxB,MAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAC/B,MAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAAA,IAC/B;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,gBAAA,CAAiB,KAAK,CAAA,EAAE;AAAA,EAC5C;AACF;AC5EO,IAAM,aAAA,GAAN,MAAM,cAAA,CAAkC;AAAA,EAC7C,EAAA,GAAK,QAAA;AAAA,EACL,IAAA,GAAO,gBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMP,OAAwB,cAAA,GAAiB;AAAA,IACvC,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU,OAAA;AAAA,IAAS,KAAA;AAAA,IACrC,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW;AAAA,GACxB;AAAA,EAEA,OAAwB,eAAA,GAAkB;AAAA,IACxC,QAAA;AAAA,IAAU,aAAA;AAAA,IAAe;AAAA,GAC3B;AAAA,EAEQ,aAAA,CAAc,SAA0B,QAAA,EAA6B;AAC3E,IAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,MACb,CAAA,CAAA,KAAA,CACG,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,UACrB,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,MAAA,IACtB,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,IAAA,IACtB,EAAE,IAAA,KAASA,sBAAAA,CAAW,KAAA,KACxB,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,IACnB,QAAA,CAAS,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAO,QAAA,EAAS,CAAE,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAC;AAAA,KACpE;AAAA,EACF;AAAA,EAEA,QAAQ,SAAA,EAA4C;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,OAAA,GAAUC,2BAAAA,CAAgB,IAAA,CAAK,SAAA,CAAU,OAAc,CAAA;AAE7D,IAAA,MAAM,cAAc,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASD,uBAAW,QAAQ,CAAA;AACpE,IAAA,MAAM,UAAU,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASA,uBAAW,GAAG,CAAA;AAC3D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,eAAc,cAAc,CAAA;AAGxE,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,MAAA,KAAA,CAAM,KAAK,sBAAsB,CAAA;AAEjC,MAAA,IAAI,WAAA,EAAa;AAEf,QAAA,KAAA,CAAM,KAAK,qBAAqB,CAAA;AAAA,MAClC,WAAW,OAAA,EAAS;AAElB,QAAA,KAAA,CAAM,KAAK,mBAAmB,CAAA;AAAA,MAChC,CAAA,MAAO;AAEL,QAAA,KAAA,CAAM,KAAK,qBAAqB,CAAA;AAChC,QAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAAA,MAC7B;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,cAAA,CAAc,eAAe,CAAA,EAAG;AAC9D,MAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,eAAe,CAAA,EAAG,KAAA,CAAM,KAAK,eAAe,CAAA;AAChE,MAAA,KAAA,CAAM,KAAK,iBAAiB,CAAA;AAC5B,MAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAAA,IACjC;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,gBAAA,CAAiB,KAAK,CAAA,EAAE;AAAA,EAC5C;AACF;ACnFO,IAAM,eAAA,GAAkB;AAAA,EAC7B,UAAA,EAAY,kBAAA;AAAA,EACZ,KAAA,EAAO,aAAA;AAAA,EACP,QAAA,EAAU,iBAAA;AAAA,EACV,YAAA,EAAc,qBAAA;AAAA,EACd,SAAA,EAAW,kBAAA;AAAA,EACX,SAAA,EAAW;AACb;AA4BA,IAAM,YAAA,GAAyC;AAAA,EAC7C,OAAA,EAAS,SAAA;AAAA,EACT,EAAA,EAAI,SAAA;AAAA,EACJ,KAAA,EAAO,OAAA;AAAA,EACP,EAAA,EAAI,OAAA;AAAA,EACJ,QAAA,EAAU,UAAA;AAAA,EACV,EAAA,EAAI,UAAA;AAAA,EACJ,IAAA,EAAM,UAAA;AAAA,EACN,IAAA,EAAM,UAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,QAAA;AAAA,EACX,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,QAAA;AAAA,EACT,EAAA,EAAI,QAAA;AAAA,EACJ,EAAA,EAAI,UAAA;AAAA,EACJ,OAAA,EAAS,UAAA;AAAA,EACT,UAAA,EAAY,UAAA;AAAA,EACZ,GAAA,EAAK,gBAAA;AAAA,EACL,SAAA,EAAW;AACb,CAAA;AAEA,IAAM,mBAAA,GAA8C;AAAA,EAClD,OAAA,EAAS,YAAA;AAAA,EACT,UAAA,EAAY,YAAA;AAAA,EACZ,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,UAAA,EAAY,UAAA;AAAA,EACZ,OAAA,EAAS,UAAA;AAAA,EACT,SAAA,EAAW,WAAA;AAAA,EACX,SAAA,EAAW,gBAAA;AAAA,EACX,MAAA,EAAQ,gBAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,WAAW,MAAA,EAA0B;AAC5C,EAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AACpB,EAAA,IAAI,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,SAAiB,MAAA,CAAO,KAAA;AACpD,EAAA,IAAI,MAAA,CAAO,SAAS,OAAO,MAAA,CAAO,UAAU,QAAA,IAAY,MAAA,IAAU,OAAO,KAAA,EAAO;AAC9E,IAAA,OAAO,MAAA,CAAQ,MAAA,CAAO,KAAA,CAA6B,IAAA,IAAQ,EAAE,CAAA;AAAA,EAC/D;AACA,EAAA,IAAI,OAAO,MAAA,CAAO,KAAA,KAAU,UAAU,OAAO,MAAA,CAAO,OAAO,KAAK,CAAA;AAChE,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,OAAO,MAAM,WAAA,EAAY,CAAE,QAAQ,SAAA,EAAW,GAAG,EAAE,IAAA,EAAK;AAC1D;AAEA,SAAS,SAAA,CAAU,OAAA,EAA0B,IAAA,EAAc,KAAA,EAAgB,IAAA,EAAqB;AAC9F,EAAA,OAAA,CAAQ,IAAI,EAAE,IAAA,EAAM,OAAO,MAAA,EAAQ,SAAA,EAAW,MAAM,CAAA;AACtD;AAEA,SAAS,UAAA,CAAW,QAAkB,KAAA,EAAqB;AACzD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG,MAAA,CAAO,KAAK,KAAK,CAAA;AAChD;AAYO,IAAM,eAAN,MAAuC;AAAA,EAC5C,EAAA,GAAK,OAAA;AAAA,EACL,IAAA,GAAO,eAAA;AAAA,EAEP,QAAQ,SAAA,EAA4C;AAClD,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,cAAA,GAAiBC,2BAAAA,CAAgB,KAAA,CAAM,eAAe,CAAA;AAC5D,IAAA,MAAM,OAAA,GAAUA,2BAAAA,CAAgB,IAAA,CAAK,SAAA,CAAU,OAAc,CAAA;AAC7D,IAAA,MAAM,UAAA,GAAa,QAAQ,OAAA,EAAQ;AACnC,IAAA,MAAM,IAAA,GAAO,WAAW,GAAA,CAAI,UAAU,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAEhE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,UAAU,CAAA;AAC/C,IAAA,IAAI,SAAA,EAAW,SAAA,CAAU,cAAA,EAAgB,eAAA,CAAgB,WAAW,SAAS,CAAA;AAE7E,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AACvC,IAAA,IAAI,KAAA,EAAO,SAAA,CAAU,cAAA,EAAgB,eAAA,CAAgB,OAAO,KAAK,CAAA;AAEjE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AACvC,IAAA,IAAI,QAAA,EAAU,SAAA,CAAU,cAAA,EAAgB,eAAA,CAAgB,UAAU,QAAQ,CAAA;AAE1E,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,CAAiB,UAAU,CAAA;AACrD,IAAA,IAAI,iBAAiB,MAAA,EAAW,SAAA,CAAU,cAAA,EAAgB,eAAA,CAAgB,cAAc,YAAY,CAAA;AAEpG,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACzC,IAAA,IAAI,SAAA,EAAW,SAAA,CAAU,cAAA,EAAgB,eAAA,CAAgB,WAAW,SAAS,CAAA;AAE7E,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,KAAK,CAAA;AACpD,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,MAAA,SAAA,CAAU,cAAA,EAAgB,eAAA,CAAgB,UAAA,EAAY,UAAU,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,cAAA,GAAiB,OAAA;AAAA,MACrB,SAAA,IAAa,KAAA,IAAS,QAAA,IAAY,SAAA,IAAa,YAAY,MAAA,GAAS;AAAA,KACtE;AAEA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AACzB,MAAA,KAAA,CAAM,KAAK,sBAAsB,CAAA;AAAA,IACnC;AAEA,IAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,sBAAsB,CAAA;AAC5C,IAAA,IAAI,YAAA,KAAiB,MAAA,EAAW,KAAA,CAAM,IAAA,CAAK,wBAAwB,CAAA;AACnE,IAAA,IAAI,QAAA,KAAa,gBAAA,EAAkB,KAAA,CAAM,IAAA,CAAK,eAAe,CAAA;AAE7D,IAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,MAAA,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,UAAA,CAAW,QAAQ,GAAA,EAAK,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IACpD;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,gBAAA,CAAiB,KAAA,EAAO,cAAc,CAAA,EAAE;AAAA,EAC5D;AAAA,EAEQ,cAAc,OAAA,EAAwC;AAC5D,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,KAAU,MAAA,CAAO,IAAA,KAASD,sBAAAA,CAAW,MAAA,IAAU,OAAO,MAAA,CAAO,KAAA,KAAU,QAAQ,CAAA;AAC3G,IAAA,OAAO,MAAA,EAAQ,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA;AAAA,EAChD;AAAA,EAEQ,UAAU,OAAA,EAAuD;AACvE,IAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,OAAA,CAAQ,MAAA,EAAQ,SAAS,CAAA,EAAG;AACtD,MAAA,MAAM,MAAA,GAAS,QAAQ,KAAK,CAAA;AAC5B,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM,CAAA;AACjC,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,OAAA,CAAQ,KAAA,GAAQ,CAAC,CAAY,CAAA;AAErD,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,0BAA0B,CAAA;AACvD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AACpC,QAAA,OAAO,EAAE,GAAA,EAAK,MAAA,CAAO,CAAC,CAAA,CAAE,aAAY,EAAG,MAAA,EAAQ,SAAA,EAAW,cAAA,EAAgB,WAAA,EAAY;AAAA,MACxF;AAEA,MAAA,IAAI,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,IAAS,CAAA,IAAK,MAAA,CAAO,KAAA,GAAQ,CAAA,EAAG;AAC7E,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,iBAAiB,IAAI,CAAC,CAAA;AAChD,QAAA,MAAM,GAAA,GAAM,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,KAAK,GAAG,MAAM,CAAA,CAAA,GAAK,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AACrE,QAAA,IAAI,sBAAA,CAAuB,IAAA,CAAK,GAAG,CAAA,EAAG;AACpC,UAAA,OAAO,EAAE,KAAK,MAAA,EAAQ,KAAA,EAAO,gBAAgB,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,EAAE;AAAA,QACjE;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,4BAA4B,CAAA;AAC5D,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,OAAO,EAAE,GAAA,EAAK,SAAA,CAAU,CAAC,CAAA,EAAG,MAAA,EAAQ,KAAA,EAAO,cAAA,EAAgB,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAC,CAAA,EAAE;AAAA,MACxF;AAEA,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,yBAAyB,CAAA;AAC1D,MAAA,IAAI,UAAA,SAAmB,EAAE,GAAA,EAAK,WAAW,CAAC,CAAA,EAAG,QAAQ,MAAA,EAAO;AAE5D,MAAA,IAAI,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,KAAA,IAAS,CAAA,IAAK,MAAA,CAAO,KAAA,IAAS,CAAA,EAAG;AAC9E,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,kBAAkB,IAAI,CAAC,CAAA;AACjD,QAAA,IAAI,MAAA,EAAQ,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAA,EAAQ,MAAA,EAAO;AAAA,MACvE;AAEA,MAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,yBAAyB,CAAA;AAC5D,MAAA,IAAI,YAAA,SAAqB,EAAE,GAAA,EAAK,aAAa,CAAC,CAAA,EAAG,QAAQ,QAAA,EAAS;AAAA,IACpE;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,QAAQ,GAAA,EAAiC;AAC/C,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,0BAA0B,CAAA;AAClD,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAC5B,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,EAAG,WAAA,EAAY;AACrC,IAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,GAAI,CAAA,GAAI,CAAA;AACvE,IAAA,OAAO,IAAA,GAAO,UAAA;AAAA,EAChB;AAAA,EAEQ,aAAa,IAAA,EAAoC;AACvD,IAAA,MAAM,SAAS,IAAA,CACZ,WAAA,GACA,KAAA,CAAM,aAAa,KAAK,EAAC;AAE5B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,UAAA,GAAa,cAAc,KAAK,CAAA;AACtC,MAAA,IAAI,UAAA,IAAc,YAAA,EAAc,OAAO,YAAA,CAAa,UAAU,CAAA;AAAA,IAChE;AAEA,IAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,gBAAA;AACzC,IAAA,IAAI,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,QAAA;AAE3C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,iBAAiB,OAAA,EAAwC;AAC/D,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,KAAU;AAC3C,MAAA,IAAI,MAAA,CAAO,IAAA,KAASA,sBAAAA,CAAW,UAAA,EAAY,OAAO,KAAA;AAClD,MAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,MAAA,OAAO,KAAA,IAAS,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,MAAA,CAAO,IAAA,IAAQ,UAAU,CAAA,KAAM,UAAA;AAAA,IAC1G,CAAC,CAAA;AAED,IAAA,OAAQ,eAAe,KAAA,EAA2C,MAAA;AAAA,EACpE;AAAA,EAEQ,cAAc,IAAA,EAAkC;AACtD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,4CAA4C,IAAI,CAAC,CAAA;AAC9E,IAAA,OAAO,YAAY,SAAA,CAAU,WAAA,GAAc,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,GAAI,MAAA;AAAA,EACpE;AAAA,EAEQ,eAAA,CAAgB,MAAc,KAAA,EAAyC;AAC7E,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAE/B,IAAA,KAAA,MAAW,CAACI,QAAAA,EAAS,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,mBAAmB,CAAA,EAAG;AACvE,MAAA,IAAI,MAAM,QAAA,CAASA,QAAO,CAAA,EAAG,UAAA,CAAW,OAAO,UAAU,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,KAAA,EAAO,WAAW,SAAA,IAAa,KAAA,EAAO,WAAW,MAAA,EAAQ,UAAA,CAAW,OAAO,YAAY,CAAA;AAC3F,IAAA,IAAI,KAAA,EAAO,WAAW,KAAA,IAAS,KAAA,EAAO,WAAW,QAAA,EAAU,UAAA,CAAW,OAAO,OAAO,CAAA;AAEpF,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACrPA,IAAM,gBAAA,GAAmB,OAAA;AAOzB,IAAM,aAAA,GAAkD;AAAA,EACpD,QAAA,EAAU;AACd,CAAA;AAGA,IAAM,YAAA,uBAAmB,GAAA,EAAY;AAkB9B,IAAM,eAAN,MAAmB;AAAA,EACL,QAAA;AAAA,EACA,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUjB,YAAY,QAAA,EAAoD;AAC5D,IAAA,IAAI,oBAAoB,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,IACpB,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,IACpB;AAAA,EACJ;AAAA,EAEA,IAAY,iBAAA,GAAyC;AACjD,IAAA,OAAO,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA,CAAS,MAAK,GAAK,IAAA,CAAK,YAAY,EAAC;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAY,KAAA,EAAqC;AAC7C,IAAA,MAAM,MAAM,IAAA,CAAK,iBAAA;AACjB,IAAA,IAAI,CAAC,OAAO,OAAO,GAAA;AACnB,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,KAAK,CAAA,IAAK,KAAA;AACnC,IAAA,IAAI,CAAC,GAAA,CAAI,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,EAAG;AAC7B,MAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG;AAC1B,QAAA,YAAA,CAAa,IAAI,KAAK,CAAA;AACtB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACJ,CAAA,sCAAA,EAAyC,KAAK,CAAA,oEAAA,EACT,GAAA,CAAI,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,SACtE;AAAA,MACJ;AACA,MAAA,OAAO,GAAA;AAAA,IACX;AACA,IAAA,OAAO,GAAA,CAAI,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,gBAAA,IAAoB,CAAA,CAAE,OAAO,EAAE,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAA,CAAQ,WAA2B,KAAA,EAAsB;AACrD,IAAA,IAAA,CAAK,aAAA,CAAc,SAAA,EAAW,IAAA,CAAK,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,EACzD;AAAA;AAAA,EAGA,UAAA,CAAW,YAA8B,KAAA,EAAsB;AAC3D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AACvC,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAChC,MAAA,IAAA,CAAK,aAAA,CAAc,WAAW,QAAQ,CAAA;AAAA,IAC1C;AAAA,EACJ;AAAA,EAEQ,aAAA,CAAc,WAA2B,QAAA,EAAqC;AAClF,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC5B,MAAA,OAAA,CAAQ,YAAY,SAAS,CAAA;AAC7B,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AAC1C,MAAA,IAAI,QAAA,EAAU,SAAS,MAAA,EAAQ;AAC3B,QAAA,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,GAAG,QAAA,CAAS,OAAO,CAAA;AAAA,MAC7C;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGA,IAAI,IAAA,GAA4B;AAC5B,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EAChB;AACJ;AAaO,IAAM,eAAA,GAAkB,IAAI,QAAA,CAAmB;AAAA;AAAA;AAAA,EAGlD,IAAI,YAAA,EAAa;AAAA;AAAA;AAAA,EAIjB,IAAI,eAAA,EAAgB;AAAA,EACpB,IAAI,UAAA,EAAW;AAAA,EACf,IAAI,aAAA,EAAc;AAAA,EAClB,IAAI,WAAA,EAAY;AAAA,EAChB,IAAI,aAAA,EAAc;AAAA,EAClB,IAAI,YAAA;AACR,CAAC;AAOM,SAAS,kBAAA,CAAmB,SAAA,GAAwB,EAAC,EAAiB;AACzE,EAAA,OAAO,IAAI,YAAA,CAAa;AAAA;AAAA,IAEpB,IAAI,YAAA,EAAa;AAAA;AAAA;AAAA,IAGjB,IAAI,eAAA,EAAgB;AAAA,IACpB,IAAI,UAAA,EAAW;AAAA,IACf,IAAI,aAAA,EAAc;AAAA,IAClB,IAAI,WAAA,EAAY;AAAA,IAChB,IAAI,aAAA,EAAc;AAAA,IAClB,IAAI,YAAA,EAAa;AAAA;AAAA;AAAA,IAGjB,GAAG;AAAA,GACN,CAAA;AACL;AAWO,IAAM,YAAA,GAA6B,IAAI,YAAA,CAAa,eAAe;AC5KnE,IAAM,eAAN,MAAsC;AAAA,EAClC,KAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA,GAAuB,QAAA;AAAA,EAEhC,WAAA,CAAY,MAAA,EAAgB,OAAA,GAA+B,EAAC,EAAG;AAE7D,IAAA,IAAA,CAAK,GAAA,GAAM,QAAQ,GAAA,IAAO,MAAA;AAC1B,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,IAAA,CAAK,IAAI,IAAA,EAAK,CAAE,WAAW,GAAG,CAAA;AAClE,IAAA,IAAA,CAAK,IAAA,GAAO,OAAA,CAAQ,IAAA,KAAS,IAAA,CAAK,GAAA,CAAI,MAAK,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,IAAK,MAAA,CAAA;AAElE,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAA;AAClB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,GAAA;AAAA,EACpB;AAAA,EAES,OAAOJ,sBAAAA,CAAW,MAAA;AAC7B,CAAA;ACXO,IAAM,iBAAN,MAAwC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW7C,WAAA,CACS,KAAA,EACS,YAAA,GAAwB,KAAA,EACxB,WAAoB,KAAA,EACpC;AAHO,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACS,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAEhB,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACvB,MAAA,IAAA,CAAK,IAAA,GAAO,CAAA;AACZ,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,MAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AACf,MAAA,IAAA,CAAK,OAAA,GAAU,CAAA;AACf,MAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAChB,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AACb,MAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CACjB,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAC,OAAA,KAAoB,CAAA,IAAK,YAAY,EAAA,GAAK,CAAA,GAAI,OAAO,OAAO,CAAA,CAAE,EACnE,OAAA,EAAQ;AAEX,MAAA,OAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AACxB,QAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACf;AACA,MAAA,IAAA,CAAK,IAAA,GAAO,OAAO,CAAC,CAAA;AACpB,MAAA,IAAA,CAAK,KAAA,GAAQ,OAAO,CAAC,CAAA;AACrB,MAAA,IAAA,CAAK,OAAA,GAAU,OAAO,CAAC,CAAA;AACvB,MAAA,IAAA,CAAK,OAAA,GAAU,OAAO,CAAC,CAAA;AAEvB,MAAA,IAAI,IAAA,CAAK,OAAA,GAAU,CAAA,IAAK,IAAA,CAAK,OAAA,GAAU,CAAA,IAAK,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,IAAA,GAAO,CAAA,EAAG;AAC3E,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,MACtE;AAEA,MAAA,IAAI,IAAA,CAAK,OAAA,GAAU,EAAA,KAAO,IAAA,CAAK,OAAA,GAAU,CAAA,IAAK,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,IAAA,GAAO,CAAA,CAAA,EAAI;AAC9E,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAA,CAAK,OAAO,CAAA,2CAAA,CAA6C,CAAA;AAAA,MACzG;AAEA,MAAA,IAAI,IAAA,CAAK,UAAU,EAAA,KAAO,IAAA,CAAK,QAAQ,CAAA,IAAK,IAAA,CAAK,OAAO,CAAA,CAAA,EAAI;AAC1D,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAA,CAAK,OAAO,CAAA,qCAAA,CAAuC,CAAA;AAAA,MACnG;AAEA,MAAA,IAAA,CAAK,QAAA,GAAA,CAAY,IAAA,CAAK,OAAA,GACpB,IAAA,CAAK,UAAU,EAAA,GACf,IAAA,CAAK,KAAA,GAAQ,EAAA,GAAK,EAAA,GAClB,IAAA,CAAK,IAAA,GAAO,EAAA,GAAK,KAAK,EAAA,IAAM,GAAA;AAE9B,MAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,QAAA;AAClB,MAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AAAA,IAChB;AAAA,EACF;AAAA,EA9CS,KAAA;AAAA,EACS,YAAA;AAAA,EACA,QAAA;AAAA,EAbT,KAAA;AAAA,EACA,MAAA;AAAA,EA0DA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAOA,sBAAAA,CAAW,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ3B,IAAI,SAAA,GAA2B;AAC7B,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAW;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,MAAA,GAAS,IAAA;AAAA,EACnC;AACF,CAAA;AChGO,IAAM,cAAN,MAAqC;AAAA,EAGxC,WAAA,CAAmB,OAAyB,KAAA,EAAe;AAAxC,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAyB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACxC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAFmB,KAAA;AAAA,EAAyB,KAAA;AAAA,EAFnC,KAAA;AAAA,EAKA,OAAOA,sBAAAA,CAAW,KAAA;AAAA,EACpB,MAAA,GAAuB,QAAA;AAClC,CAAA;ACLA,SAAS,oBAAoB,KAAA,EAAiD;AAC5E,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,MAAA;AAC3B,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEO,IAAM,iBAAN,MAAwC;AAAA,EACpC,GAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EAET,WAAA,CAAY,GAAA,EAAa,KAAA,EAAyC,OAAA,GAAiC,EAAC,EAAG;AACrG,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,mBAAA,CAAoB,KAAK,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,MAAA,IAAU,QAAA;AAChC,IAAA,IAAA,CAAK,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQA,sBAAAA,CAAW,MAAA;AAAA,EACzC;AAAA,EAES,IAAA;AACX,CAAA;AC1BO,IAAM,YAAN,MAAmC;AAAA,EAKxC,YAAmB,IAAA,EAAe;AAAf,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACjB,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,IAAI,OAAO,CAAA,EAAG;AACZ,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAI,CAAA,CAAE,CAAA;AAAA,MACzD;AAAA,IAKF;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,KAAS,MAAA,GAAY,IAAA,CAAK,UAAS,GAAI,GAAA;AAEpD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,KAAS,MAAA,GAAY,QAAA,GAAW,QAAA;AAAA,EAChD;AAAA,EAdmB,IAAA;AAAA,EAJV,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EAiBA,OAAOA,sBAAAA,CAAW,GAAA;AAC7B,CAAA;ACrBO,IAAM,eAAN,MAAsC;AAAA,EAK3C,YAAmB,KAAA,EAAwB;AAAxB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAM,QAAA,EAAS;AAAA,EAC9B;AAAA,EAHmB,KAAA;AAAA,EAJV,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA,GAAuB,QAAA;AAAA,EAMvB,OAAOA,sBAAAA,CAAW,MAAA;AAC7B,CAAA;ACVO,IAAM,aAAN,MAAoC;AAAA,EAKzC,WAAA,CAAmB,MAAqB,KAAA,EAAgB;AAArC,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAqB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACtC,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,IAAA,EAAY,KAAA,EAAa;AACxC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA,EAHmB,IAAA;AAAA,EAAqB,KAAA;AAAA,EAJ/B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA,GAAuB,QAAA;AAAA,EAMvB,OAAOA,sBAAAA,CAAW,IAAA;AAC7B,CAAA;;;ACMA,IAAM,2BAAA,GAA0D;AAAA,EAC9D,KAAKA,sBAAAA,CAAW,UAAA;AAAA,EAChB,KAAKA,sBAAAA,CAAW,GAAA;AAAA,EAChB,WAAWA,sBAAAA,CAAW,SAAA;AAAA,EACtB,MAAMA,sBAAAA,CAAW,IAAA;AAAA,EACjB,QAAQA,sBAAAA,CAAW,MAAA;AAAA,EACnB,MAAMA,sBAAAA,CAAW;AACnB,CAAA;AAEO,SAAS,mBAAmB,KAAA,EAA2C;AAC5E,EAAA,OAAO,KAAA,CAAM,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,KAAS;AACpC,IAAA,MAAM,SAAA,GAAY,IAAIK,+BAAA,EAAoB;AAC1C,IAAA,MAAM,cAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,UAAA,EAAY;AACvC,MAAA,WAAA,CAAY,IAAA,CAAK,GAAG,iBAAA,CAAkB,SAAS,CAAC,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,WAAA,GAAc,eAAe,WAAW,CAAA;AAC9C,IAAA,SAAA,CAAU,UAAU,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,OAAO,CAAA;AAC1D,IAAA,SAAA,CAAU,UAAA,GAAa,IAAI,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA;AAEnF,IAAA,SAAA,CAAU,KAAK,IAAA,CAAK,EAAA;AACpB,IAAA,SAAA,CAAU,OAAO,IAAA,CAAK,IAAA;AACtB,IAAA,SAAA,CAAU,IAAA,GAAO,KAAK,IAAA,CAAK,GAAA;AAC3B,IAAA,SAAA,CAAU,GAAA,GAAM,KAAK,IAAA,CAAK,GAAA;AAC1B,IAAA,SAAA,CAAU,OAAO,IAAA,CAAK,IAAA;AACtB,IAAA,SAAA,CAAU,SAAS,IAAA,CAAK,QAAA;AACxB,IAAA,SAAA,CAAU,WAAW,IAAA,CAAK,QAAA;AAC1B,IAAA,SAAA,CAAU,SAAS,IAAA,CAAK,MAAA;AAExB,IAAA,OAAO,SAAA;AAAA,EACT,CAAC,CAAA;AACH;AAEA,SAAS,kBAAkB,SAAA,EAA0C;AACnE,EAAA,QAAQ,UAAU,IAAA;AAAM,IACtB,KAAK,KAAA;AACH,MAAA,OAAO,CAAC,EAAE,OAAA,EAAS,IAAI,WAAA,CAAY,SAAA,CAAU,OAAA,EAAS,SAAA,CAAU,GAAG,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,MAAM,CAAA;AAAA,IAE9F,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,QAAsB,EAAC;AAC7B,MAAA,IAAI,UAAU,QAAA,EAAU;AACtB,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,OAAA,EAAS,IAAI,eAAe,SAAA,CAAU,QAAA,EAAU,SAAA,CAAU,QAAA,EAAU,UAAU,UAAU,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,MAAM,CAAA;AAAA,MAChI;AACA,MAAA,IAAI,UAAU,UAAA,EAAY;AACxB,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,OAAA,EAAS,UAAA,CAAW,yBAAA,EAA2B,QAAQ,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,CAAA;AAAA,MAC/F;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,IAEA,KAAK,QAAA,EAAU;AACb,MAAA,IAAI,UAAU,QAAA,EAAU;AACtB,QAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACnC,UAAA,OAAO,CAAC,EAAE,OAAA,EAAS,IAAI,YAAA,CAAa,SAAA,CAAU,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,MAAM,CAAA;AAAA,QACpF;AAEA,QAAA,OAAO;AAAA,UACL,EAAE,OAAA,EAAS,IAAI,YAAA,CAAa,SAAA,CAAU,SAAS,MAAM,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,IAAA,EAAK;AAAA,UAC7E,GAAG,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,OAAA,EAAS,IAAI,UAAU,KAAK,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,MAAK,CAAE;AAAA,SAChG;AAAA,MACF;AAEA,MAAA,OAAO,SAAA,CAAU,KAAA,GACb,CAAC,EAAE,SAAS,IAAI,YAAA,CAAa,SAAA,CAAU,KAAK,GAAG,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,IACrE,EAAC;AAAA,IACP;AAAA,IAEA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,UAAA,GAAa,UAAU,cAAA,GACzB,SAAA,CAAU,IAAI,SAAA,CAAU,CAAA,EAAG,SAAA,CAAU,GAAA,CAAI,MAAA,GAAS,CAAC,EAAE,IAAA,EAAK,GAC1D,SAAA,CAAU,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,UAAU,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,CAAE,IAAA,EAAK;AAC9D,MAAA,OAAO,CAAC,EAAE,OAAA,EAAS,IAAI,aAAa,UAAA,EAAY,EAAE,GAAA,EAAK,UAAA,EAAY,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,MAAM,CAAA;AAAA,IAC9F;AAAA,IAEA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAMC,WAAU,SAAA,CAAU,GAAA,CAAI,SAAA,CAAU,CAAC,EAAE,IAAA,EAAK;AAChD,MAAA,OAAO,CAAC,EAAE,OAAA,EAAS,IAAI,UAAA,CAAWA,QAAAA,EAAS,MAAS,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,CAAA;AAAA,IAC/E;AAAA,IAEA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,eAAe,CAAA;AACjD,MAAA,MAAM,QAAQ,KAAA,GAAQ,MAAA,CAAO,MAAM,CAAC,CAAA,CAAE,MAAM,CAAA,GAAI,GAAA;AAChD,MAAA,MAAMA,QAAAA,GAAU,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK,GAAI,SAAA,CAAU,GAAA,CAAI,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA,EAAK;AAC1E,MAAA,OAAO,CAAC,EAAE,OAAA,EAAS,IAAI,UAAA,CAAWA,QAAAA,EAAS,KAAK,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,CAAA;AAAA,IAC3E;AAAA,IAEA,KAAK,UAAA,EAAY;AACf,MAAA,IAAI,UAAU,SAAA,EAAW;AACvB,QAAA,OAAO,CAAC,EAAE,OAAA,EAAS,IAAI,gBAAA,CAAiB,SAAA,CAAU,KAAA,EAAO,UAAU,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,CAAA;AAAA,MAC9F;AAEA,MAAA,OAAO,CAAC,EAAE,OAAA,EAAS,IAAI,SAAA,CAAU,SAAA,CAAU,KAAK,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,CAAA;AAAA,IAC3E;AAAA,IAEA,KAAK,QAAA;AACH,MAAA,OAAO,CAAC,EAAE,OAAA,EAAS,IAAI,YAAA,CAAa,SAAA,CAAU,GAAG,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,CAAA;AAAA,IAE5E,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,aAAa,2BAAA,CAA4B,SAAA,CAAU,IAAI,WAAA,EAAa,KAAKN,sBAAAA,CAAW,MAAA;AAC1F,MAAA,OAAO,CAAC;AAAA,QACN,SAAS,IAAI,cAAA,CAAe,SAAA,CAAU,GAAA,EAAK,UAAU,KAAA,EAAO;AAAA,UAC1D,IAAA,EAAM,UAAA;AAAA,UACN,OAAO,SAAA,CAAU;AAAA,SAClB,CAAA;AAAA,QACD,MAAM,SAAA,CAAU;AAAA,OACjB,CAAA;AAAA,IACH;AAAA,IAEA,KAAK,eAAA,EAAiB;AACpB,MAAA,MAAM,QAAQ,SAAA,CAAU,KAAA;AACxB,MAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzB,QAAA,MAAM,aAAa,2BAAA,CAA4B,IAAA,CAAK,IAAI,WAAA,EAAa,KAAKA,sBAAAA,CAAW,MAAA;AACrF,QAAA,OAAO;AAAA,UACL,SAAS,IAAI,cAAA,CAAe,IAAA,CAAK,GAAA,EAAK,KAAK,KAAA,EAAO;AAAA,YAChD,IAAA,EAAM,UAAA;AAAA,YACN,OAAO,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA,EAAA,EAAK,KAAK,KAAK,CAAA;AAAA,WAClC,CAAA;AAAA,UACD,MAAM,SAAA,CAAU;AAAA,SAClB;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,IAEA;AACE,MAAA,OAAO,EAAC;AAAA;AAEd;AAEA,SAAS,eAAe,KAAA,EAAmC;AACzD,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAE7B,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,OAAA,GAAU,MAAM,CAAC,CAAA;AAErB,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,QAAQ,KAAA,EAAA,EAAS;AACjD,IAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AAExB,IAAA,IAAI,OAAA,CAAQ,OAAA,YAAmB,YAAA,IAAgB,IAAA,CAAK,mBAAmB,YAAA,EAAc;AACnF,MAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,MAAA,KAAW,GAAA,IAAO,QAAQ,OAAA,CAAQ,MAAA,KAAW,GAAA,IAC7D,IAAA,CAAK,QAAQ,MAAA,KAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,WAAW,GAAA,EAAK;AAC9D,QAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,QAAA,OAAA,GAAU,IAAA;AACV,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,WAAA,GAAc,QAAQ,IAAA,CAAK,SAAA;AACjD,MAAA,IAAI,OAAO,CAAA,EAAG;AACZ,QAAA,MAAM,UAAA,GAAyB;AAAA,UAC7B,GAAG,OAAA,CAAQ,IAAA;AAAA,UACX,SAAA,EAAW,KAAK,IAAA,CAAK,SAAA;AAAA,UACrB,SAAA,EAAW,KAAK,IAAA,CAAK,SAAA;AAAA,UACrB,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,QAAQ,IAAA,CAAK,WAAA;AAAA,UAC3C,GAAA,EAAK,QAAQ,IAAA,CAAK,GAAA,IAAO,QAAQ,CAAA,GAAI,GAAA,GAAM,EAAA,CAAA,GAAM,IAAA,CAAK,IAAA,CAAK;AAAA,SAC7D;AACA,QAAA,OAAA,GAAU;AAAA,UACR,OAAA,EAAS,IAAI,YAAA,CAAa,OAAA,CAAQ,OAAA,CAAQ,MAAA,IAAU,GAAA,KAAQ,CAAA,GAAI,GAAA,GAAM,EAAA,CAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAAA,UAC/F,IAAA,EAAM;AAAA,SACR;AACA,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,mBAAmB,SAAA,KAAc,IAAA,CAAK,mBAAmB,gBAAA,IAAoB,IAAA,CAAK,mBAAmB,cAAA,CAAA,EAAiB;AAChI,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,WAAA,GAAc,QAAQ,IAAA,CAAK,SAAA;AACjD,MAAA,IAAI,OAAO,CAAA,EAAG;AACZ,QAAA,MAAM,UAAA,GAAyB;AAAA,UAC7B,GAAG,OAAA,CAAQ,IAAA;AAAA,UACX,SAAA,EAAW,KAAK,IAAA,CAAK,SAAA;AAAA,UACrB,SAAA,EAAW,KAAK,IAAA,CAAK,SAAA;AAAA,UACrB,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,QAAQ,IAAA,CAAK,WAAA;AAAA,UAC3C,GAAA,EAAK,QAAQ,IAAA,CAAK,GAAA,IAAO,QAAQ,CAAA,GAAI,GAAA,GAAM,EAAA,CAAA,GAAM,IAAA,CAAK,IAAA,CAAK;AAAA,SAC7D;AACA,QAAA,IAAI,KAAK,OAAA,YAAmB,gBAAA,IAAoB,KAAK,OAAA,CAAQ,KAAA,CAAM,WAAW,MAAA,EAAW;AACvF,UAAA,OAAA,GAAU;AAAA,YACR,OAAA,EAAS,IAAI,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,IAAA,EAAM,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,YACrE,IAAA,EAAM;AAAA,WACR;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAK,OAAA,YAAmB,cAAA,IAAkB,KAAK,OAAA,CAAQ,KAAA,CAAM,WAAW,MAAA,EAAW;AACrF,UAAA,OAAA,GAAU;AAAA,YACR,OAAA,EAAS,IAAI,cAAA,CAAe,OAAA,CAAQ,QAAQ,IAAA,EAAM,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,YACnE,IAAA,EAAM;AAAA,WACR;AACA,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ;AAEA,EAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,EAAA,OAAO,MAAA;AACT;AClNO,IAAM,MAAA,GAASO,YAAS,WAAA,CAAY;AAAA,EACzC,OAAA,EAAS,EAAA;AAAA,EACT,MAAA,EAAQ,4lBAAA;AAAA,EACR,SAAA,EAAW,8eAAA;AAAA,EACX,IAAA,EAAM,4KAAA;AAAA,EACN,SAAA,EAAW,uNAAA;AAAA,EACX,OAAA,EAAS,EAAA;AAAA,EACT,YAAA,EAAc,CAAC,CAAC,CAAA;AAAA,EAChB,eAAA,EAAiB,CAAA;AAAA,EACjB,SAAA,EAAW,2hDAAA;AAAA,EACX,UAAA,EAAY,CAAC,CAAC,CAAA;AAAA,EACd,UAAU,EAAC,SAAA,EAAU,CAAC,CAAA,EAAE,CAAC,CAAA,EAAC;AAAA,EAC1B,SAAA,EAAW;AACb,CAAC;;;ACdM,IAOL,GAAA,GAAM,CAAA;AAPD,IAQL,QAAA,GAAW,CAAA;AARN,IASL,QAAA,GAAW,CAAA;AATN,IAaL,MAAA,GAAS,EAAA;AAbJ,IAeL,MAAA,GAAS,EAAA;AAfJ,IAgBL,IAAA,GAAO,EAAA;AAhBF,IAiBL,OAAA,GAAU,EAAA;AAjBL,IAkBL,QAAA,GAAW,EAAA;AAlBN,IAqBL,KAAA,GAAQ,EAAA;AArBH,IAsBL,IAAA,GAAO,EAAA;AAtBF,IAuBL,MAAA,GAAS,EAAA;AAvBJ,IAwBL,YAAA,GAAe,EAAA;;;ACAV,SAAS,kBAAkB,MAAA,EAA6B;AAC7D,EAAA,MAAM,UAAA,GAAa,CAAC,CAAC,CAAA;AACrB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,EAAM;AACtB,MAAA,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACvB;AAAA,EACF;AACA,EAAA,OAAO,CAAC,MAAA,KAAmB;AACzB,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,IAAA,GAAO,WAAW,MAAA,GAAS,CAAA;AAC/B,IAAA,OAAO,OAAO,IAAA,EAAM;AAClB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAA,CAAO,GAAA,GAAM,QAAQ,CAAC,CAAA;AACvC,MAAA,IAAI,UAAA,CAAW,GAAG,CAAA,IAAK,MAAA,EAAQ;AAC7B,QAAA,GAAA,GAAM,GAAA,GAAM,CAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAA,IAAA,GAAO,GAAA,GAAM,CAAA;AAAA,MACf;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,IAAA,IAAQ,CAAA,GAAI,IAAA,GAAO,CAAA;AACrC,IAAA,OAAO;AAAA,MACL,YAAY,SAAA,GAAY,CAAA;AAAA,MACxB,SAAA,EAAW,WAAW,SAAS;AAAA,KACjC;AAAA,EACF,CAAA;AACF;AAEO,SAAS,kBAAA,CACd,eACA,OAAA,EACa;AACb,EAAA,MAAM,SAAS,OAAO,aAAA,KAAkB,WAAW,aAAA,GAAgB,aAAA,CAAc,IAAI,QAAA,EAAS;AAC9F,EAAA,MAAM,cAAc,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,GAAI,SAAS,MAAA,GAAS,IAAA;AAC9D,EAAA,MAAM,IAAA,GAAO,OAAA,IAAW,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AAChD,EAAA,MAAM,OAAA,GAAU,kBAAkB,MAAM,CAAA;AAExC,EAAA,MAAM,aAAgC,EAAC;AACvC,EAAA,IAAI,YAAA,GAAqD,IAAA;AAEzD,EAAA,IAAA,CAAK,OAAA,CAAQ;AAAA,IACX,MAAM,IAAA,EAAM;AACV,MAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAK;AACrB,QAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,EAAA,KAAO,IAAA,CAAK,IAAA,EAAM;AACjD,UAAA,UAAA,CAAW,MAAA,CAAO,YAAA,CAAa,KAAA,EAAO,CAAC,CAAA;AAAA,QACzC;AACA,QAAA,YAAA,GAAe,IAAA;AACf,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC5B,QAAA,MAAM,YAAY,uBAAA,CAAwB,OAAA,EAAS,QAAQ,IAAA,CAAK,IAAA,EAAM,KAAK,EAAE,CAAA;AAC7E,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAMC,QAAO,SAAA,CAAU,IAAA;AACvB,UAAA,UAAA,CAAW,IAAA,CAAK;AAAA,YACd,IAAIA,KAAAA,CAAK,IAAA;AAAA,YACT,MAAMA,KAAAA,CAAK,IAAA;AAAA,YACX,IAAA,EAAAA,KAAAA;AAAA,YACA,UAAA,EAAY,CAAC,SAAS,CAAA;AAAA,YACtB,UAAU,EAAC;AAAA,YACX,MAAA,EAAQ;AAAA,WACT,CAAA;AACD,UAAA,YAAA,GAAe,EAAE,EAAA,EAAI,IAAA,CAAK,IAAI,KAAA,EAAO,UAAA,CAAW,SAAS,CAAA,EAAE;AAAA,QAC7D;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AAC3B,MAAA,YAAA,GAAe,IAAA;AAEf,MAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,OAAA,EAAS,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAC9F,MAAA,MAAM,SAAA,GAA6B;AAAA,QACjC,IAAI,aAAA,CAAc,IAAA;AAAA,QAClB,MAAM,aAAA,CAAc,IAAA;AAAA,QACpB,IAAA,EAAM,aAAA;AAAA,QACN,YAAY,EAAC;AAAA,QACb,UAAU,EAAC;AAAA,QACX,MAAA,EAAQ;AAAA,OACV;AAEA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,MAAA,EAAO;AAChC,MAAA,IAAI,MAAA,CAAO,YAAW,EAAG;AACvB,QAAA,GAAG;AACD,UAAA,MAAM,QAAQ,MAAA,CAAO,IAAA;AACrB,UAAA,MAAM,WAAW,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,MAAM,EAAE,CAAA;AAElD,UAAA,IAAI,KAAA,CAAM,IAAA,CAAK,EAAA,KAAa,GAAA,EAAK;AAC/B,YAAA,MAAM,YAAA,GAA6B;AAAA,cACjC,IAAA,EAAM,KAAA;AAAA,cACN,GAAA,EAAK,QAAA;AAAA,cACL,MAAM,UAAA,CAAW,OAAA,EAAS,MAAM,IAAA,EAAM,KAAA,CAAM,IAAI,QAAQ,CAAA;AAAA,cACxD,OAAA,EAAS,QAAA,KAAa,GAAA,GAAM,SAAA,GAAY;AAAA,aAC1C;AACA,YAAA,SAAA,CAAU,UAAA,CAAW,KAAK,YAAY,CAAA;AACtC,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,MAAM,IAAA,CAAK,EAAA,KAAa,QAAA,IAAY,CAAC,MAAM,UAAA,EAAY;AACzD,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,eAAe,KAAA,CAAM,UAAA;AAC3B,UAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,OAAA,EAAS,MAAA,EAAQ,YAAmB,CAAA;AAC7E,UAAA,IAAI,SAAA,EAAW,SAAA,CAAU,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA;AAAA,QACpD,CAAA,QAAS,OAAO,WAAA,EAAY;AAAA,MAC9B;AAEA,MAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IAC3B;AAAA,GACD,CAAA;AAED,EAAA,uBAAA,CAAwB,UAAU,CAAA;AAElC,EAAA,OAAO,EAAE,UAAA,EAAW;AACtB;AAEA,SAAS,uBAAA,CACP,OAAA,EACA,MAAA,EACA,IAAA,EACA,EAAA,EAC0B;AAC1B,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,EAAE,CAAA;AACjC,EAAA,MAAMA,KAAAA,GAAO,UAAA,CAAW,OAAA,EAAS,IAAA,EAAM,IAAI,GAAG,CAAA;AAC9C,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,4CAA4C,CAAA;AAEpE,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,GAAG,GAAA,EAAK,QAAQ,CAAA,GAAI,KAAA;AAC1B,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,GAAA;AAAA,IACA,IAAA,EAAAA,KAAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA,EAAU,QAAA;AAAA,IACV,KAAA,EAAO,mBAAmB,QAAQ;AAAA,GACpC;AACF;AAEA,SAAS,mBAAmB,QAAA,EAAoD;AAC9E,EAAA,MAAM,OAAA,GAAU,SAAS,IAAA,EAAK;AAE9B,EAAA,IAAI,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA,EAAG;AACvC,IAAA,OAAO,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,OAAA,CAAQ,oBAAoB,IAAI,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,sBAAA,CAAuB,IAAA,CAAK,OAAO,CAAA,EAAG;AACxC,IAAA,OAAO,OAAO,OAAO,CAAA;AAAA,EACvB;AAEA,EAAA,IAAI,OAAA,KAAY,QAAQ,OAAO,IAAA;AAC/B,EAAA,IAAI,OAAA,KAAY,SAAS,OAAO,KAAA;AAChC,EAAA,IAAI,OAAA,KAAY,QAAQ,OAAO,IAAA;AAE/B,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,sBAAA,CACP,OAAA,EACA,MAAA,EACA,IAAA,EAOwB;AACxB,EAAA,MAAM,MAAM,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,KAAK,EAAE,CAAA;AAC3C,EAAA,MAAMA,QAAO,UAAA,CAAW,OAAA,EAAS,KAAK,IAAA,EAAM,IAAA,CAAK,IAAI,GAAG,CAAA;AAExD,EAAA,QAAQ,IAAA,CAAK,KAAK,EAAA;AAAI,IACpB,KAAW,QAAA,EAAU;AACnB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACnC,MAAA,MAAM,YAAY,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IAAK,IAAA,CAAK,SAAS,kBAAkB,CAAA;AAE5E,MAAA,MAAM,SAAA,GAA+B;AAAA,QACnC,IAAA,EAAM,UAAA;AAAA,QACN,GAAA;AAAA,QACA,IAAA,EAAAA,KAAAA;AAAA,QACA,QAAA,EAAU,YAAY,MAAA,CAAO,KAAA,CAAM,UAAU,IAAA,EAAM,SAAA,CAAU,EAAE,CAAA,GAAI,MAAA;AAAA,QACnE,QAAA,EAAU,CAAC,CAAC,KAAA;AAAA,QACZ,UAAA,EAAY,GAAA,CAAI,QAAA,CAAS,GAAG;AAAA,OAC9B;AACA,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,IAEA,KAAW,MAAA,EAAQ;AACjB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA;AACzC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA;AAExC,MAAA,MAAM,SAAA,GAA6B;AAAA,QACjC,IAAA,EAAM,QAAA;AAAA,QACN,GAAA;AAAA,QACA,IAAA,EAAAA,KAAAA;AAAA,QACA,QAAA,EAAU,WACN,MAAA,CACG,KAAA,CAAM,SAAS,IAAA,EAAM,QAAA,CAAS,EAAE,CAAA,CAChC,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,IAAA,EAAK,EAAG,EAAE,CAAC,CAAA,GACpC,MAAA;AAAA,QACJ,KAAA,EAAO,QAAQ,MAAA,CAAO,KAAA,CAAM,MAAM,IAAA,EAAM,KAAA,CAAM,EAAE,CAAA,GAAI;AAAA,OACtD;AACA,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,IAEA,KAAW,MAAA,EAAQ;AACjB,MAAA,MAAM,SAAA,GAA6B;AAAA,QACjC,IAAA,EAAM,QAAA;AAAA,QACN,GAAA;AAAA,QACA,IAAA,EAAAA,KAAAA;AAAA,QACA,cAAA,EAAgB,GAAA,CAAI,UAAA,CAAW,IAAI;AAAA,OACrC;AACA,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,IAEA,KAAW,IAAA,EAAM;AACf,MAAA,MAAM,SAAA,GAA2B;AAAA,QAC/B,IAAA,EAAM,MAAA;AAAA,QACN,GAAA;AAAA,QACA,IAAA,EAAAA;AAAA,OACF;AACA,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,IAEA,KAAW,OAAA,EAAS;AAClB,MAAA,MAAM,SAAA,GAA8B;AAAA,QAClC,IAAA,EAAM,SAAA;AAAA,QACN,GAAA;AAAA,QACA,IAAA,EAAAA;AAAA,OACF;AACA,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,IAEA,KAAW,QAAA,EAAU;AACnB,MAAA,MAAM,SAAA,GAAY,CAAC,CAAC,IAAA,CAAK,SAAS,QAAQ,CAAA;AAC1C,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAEzC,MAAA,MAAM,SAAA,GAA+B;AAAA,QACnC,IAAA,EAAM,UAAA;AAAA,QACN,GAAA;AAAA,QACA,IAAA,EAAAA,KAAAA;AAAA,QACA,KAAA,EAAO,UAAA,GAAa,UAAA,CAAW,MAAA,CAAO,KAAA,CAAM,WAAW,IAAA,EAAM,UAAA,CAAW,EAAE,CAAC,CAAA,GAAI,MAAA;AAAA,QAC/E;AAAA,OACF;AACA,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,IAEA,KAAW,MAAA,EAAQ;AACjB,MAAA,MAAM,SAAA,GAA6B;AAAA,QACjC,IAAA,EAAM,QAAA;AAAA,QACN,GAAA;AAAA,QACA,IAAA,EAAAA;AAAA,OACF;AACA,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,IAEA,KAAW,KAAA,EAAO;AAChB,MAAA,MAAM,SAAA,GAA6B;AAAA,QACjC,IAAA,EAAM,QAAA;AAAA,QACN,GAAA;AAAA,QACA,IAAA,EAAAA;AAAA,OACF;AACA,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,IAEA,KAAW,IAAA,EAAM;AACf,MAAA,MAAM,SAAA,GAA6B;AAAA,QACjC,IAAA,EAAM,QAAA;AAAA,QACN,GAAA;AAAA,QACA,IAAA,EAAAA;AAAA,OACF;AACA,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,IAEA,KAAW,YAAA,EAAc;AACvB,MAAA,IAAI,QAAyE,EAAC;AAC9E,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,QAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClE,UAAA,KAAA,GAAQ,MAAA,CAAO,QAAQ,MAAM,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO;AAAA,YACpD,GAAA;AAAA,YACA;AAAA,WACF,CAAE,CAAA;AAAA,QACJ;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,MAAM,SAAA,GAAmC;AAAA,QACvC,IAAA,EAAM,eAAA;AAAA,QACN,GAAA;AAAA,QACA,IAAA,EAAAA,KAAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,IAEA;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAEA,SAAS,wBAAwB,UAAA,EAAqC;AACpE,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAsB;AACjD,EAAA,IAAI,QAAoE,EAAC;AAEzE,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,KAAA,GAAQ,KAAA,CAAM,OAAO,CAAC,IAAA,KAAS,KAAK,WAAA,GAAc,SAAA,CAAU,KAAK,WAAW,CAAA;AAE5E,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,KAAA,MAAW,UAAU,KAAA,EAAO;AAC1B,QAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA,EAAG;AAC5C,UAAA,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,SAAA,CAAU,EAAA,EAAI,EAAE,CAAA;AAAA,QAC5C;AACA,QAAA,cAAA,CAAe,IAAI,MAAA,CAAO,SAAA,CAAU,EAAE,CAAA,CAAG,IAAA,CAAK,UAAU,EAAE,CAAA;AAC1D,QAAA,SAAA,CAAU,QAAA,GAAW,OAAO,SAAA,CAAU,EAAA;AAAA,MACxC;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,KAAK,EAAE,WAAA,EAAa,UAAU,IAAA,CAAK,WAAA,EAAa,WAAW,CAAA;AAAA,EACnE;AAEA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,eAAe,cAAA,CAAe,GAAA,CAAI,SAAA,CAAU,EAAE,KAAK,EAAC;AAC1D,IAAA,SAAA,CAAU,QAAA,GAAW,kBAAA,CAAmB,YAAA,EAAc,UAAU,CAAA;AAChE,IAAA,SAAA,CAAU,MAAA,GAAS,SAAA,CAAU,QAAA,CAAS,MAAA,KAAW,CAAA;AAAA,EACnD;AACF;AAEA,SAAS,kBAAA,CAAmB,UAAoB,UAAA,EAA2C;AACzF,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEnC,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,KAAc,CAAC,SAAA,CAAU,EAAA,EAAI,SAAS,CAAC,CAAC,CAAA;AAC7E,EAAA,MAAM,SAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AAClC,IAAA,MAAM,GAAA,GAAM,WAAW,UAAA,CAAW,IAAA,CAAK,CAAC,SAAA,KAAc,SAAA,CAAU,SAAS,KAAK,CAAA;AAI9E,IAAA,IAAI,GAAA,EAAK,OAAA,KAAY,SAAA,IAAa,MAAA,CAAO,SAAS,CAAA,EAAG;AACnD,MAAA,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,CAAE,KAAK,OAAO,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,CAAC,OAAO,CAAC,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,UAAA,CACP,OAAA,EACA,IAAA,EACA,EAAA,EACA,GAAA,EACY;AACZ,EAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAU,GAAI,QAAQ,IAAI,CAAA;AAE9C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,IAAA;AAAA,IACb,SAAA,EAAW,EAAA;AAAA,IACX,aAAa,IAAA,GAAO,SAAA;AAAA,IACpB,WAAW,EAAA,GAAK,SAAA;AAAA,IAChB,QAAQ,EAAA,GAAK,IAAA;AAAA,IACb;AAAA,GACF;AACF;;;ACzXO,SAAS,oBAAA,CAAqB,cAA2B,OAAA,EAAkC;AAChG,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,IAAA,GAAyB,OAAA;AAE7B,EAAA,IAAI,OAAO,iBAAiB,QAAA,EAAU;AACpC,IAAA,MAAA,GAAS,YAAA;AAAA,EACX,CAAA,MAAA,IAAW,YAAY,YAAA,EAAc;AACnC,IAAA,MAAA,GAAS,YAAA,CAAa,MAAA;AACtB,IAAA,IAAA,GAAO,QAAQ,YAAA,CAAa,IAAA;AAAA,EAC9B,CAAA,MAAA,IAAW,SAAS,YAAA,EAAc;AAChC,IAAA,MAAA,GAAS,YAAA,CAAa,IAAI,QAAA,EAAS;AAAA,EACrC,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,EAAA;AAAA,EACX;AAEA,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,MAAA,EAAQ,IAAI,CAAA;AAC7C,EAAA,OAAO,mBAAmB,KAAK,CAAA;AACjC;AAYO,SAAS,iBAAA,CACd,YAAA,EACA,WAAA,EACA,QAAA,EACkB;AAClB,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,IAAA;AAEJ,EAAA,IAAI,OAAO,gBAAgB,QAAA,EAAU;AACnC,IAAA,KAAA,GAAQ,WAAA;AAAA,EACV,CAAA,MAAA,IAAW,WAAA,IAAe,OAAO,WAAA,KAAgB,QAAA,EAAU;AACzD,IAAA,IAAA,GAAO,WAAA;AACP,IAAA,KAAA,GAAQ,QAAA;AAAA,EACV;AAEA,EAAA,MAAM,UAAA,GAAa,oBAAA,CAAqB,YAAA,EAAc,IAAI,CAAA;AAC1D,EAAA,YAAA,CAAa,UAAA,CAAW,YAAY,KAAK,CAAA;AACzC,EAAA,OAAO,UAAA;AACT;;;AChDO,IAAM,mBAAN,MAA0C;AAAA,EAC/C,MAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA;AAAA,EAGQ,MAAA;AAAA,EAER,WAAA,CAAY,MAAA,EAAgB,UAAA,EAA8B,MAAA,GAAuB,EAAC,EAAG;AACnF,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,QAAA,GAAwC;AAC9C,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAChB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,EAAA,EAAc,CAAC,CAAC,CAAC,CAAA;AAAA,IACrE;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,GAAA,EAAiC;AACtC,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAC5B,IAAA,OAAO,GAAA,CAAI,IAAI,CAAA,EAAA,KAAM,KAAA,CAAM,IAAI,EAAE,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,EAAA,EAAwC;AAC5C,IAAA,OAAO,IAAA,CAAK,QAAA,EAAS,CAAE,GAAA,CAAI,EAAE,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,EAA2C;AAC/C,IAAA,OAAO,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,QAAA,EAAwC;AACtD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,QAAA,EAA0C;AACvD,IAAA,OAAO,SAAS,GAAA,CAAI,CAAA,KAAA,KAAS,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACjD;AACF;;;AC5DO,SAAS,WAAA,CAAY,SAAA,EAAmB,OAAA,GAAwB,EAAC,EAAqB;AAC3F,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,CAAU,MAAK,EAAG;AACnC,IAAA,OAAO,IAAI,gBAAA,CAAiB,SAAA,EAAW,EAAC,EAAG,EAAE,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,GAAI,YAAY,SAAA,GAAY,IAAA;AAC/D,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,OAAA;AACvC,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,eAAA,GACvB,oBAAA,CAAqB,SAAA,EAAW,IAAI,CAAA,GACpC,iBAAA,CAAkB,SAAA,EAAW,IAAA,EAAM,KAAK,CAAA;AAE5C,IAAA,OAAO,IAAI,gBAAA,CAAiB,SAAA,EAAW,UAAA,EAAY,EAAE,CAAA;AAAA,EACvD,SAAS,KAAA,EAAY;AACnB,IAAA,MAAM,GAAA,GAAM,OAAO,OAAA,IAAW,qBAAA;AAC9B,IAAA,OAAO,IAAI,gBAAA,CAAiB,SAAA,EAAW,EAAC,EAAG,CAAC,EAAE,OAAA,EAAS,GAAA,EAAK,CAAC,CAAA;AAAA,EAC/D;AACF;;;AC9BO,IAAM,iBAAN,MAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1B,IAAA,CAAK,WAAmB,KAAA,EAAyB;AAC/C,IAAA,OAAO,WAAA,CAAY,SAAA,EAAW,EAAE,KAAA,EAAO,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,SAAA,EAA4B;AAC9C,IAAA,OAAO,WAAA,CAAY,SAAA,EAAW,EAAE,eAAA,EAAiB,MAAM,CAAA;AAAA,EACzD;AACF;;;ACtBO,SAAS,YAAA,GAA+B;AAC7C,EAAA,OAAO,IAAI,cAAA,EAAe;AAC5B;AAKO,IAAM,+BAA+B,YAAA;ACP5C,IAAI,SAAA,GAAY,CAAA;AAoBhB,IAAM,GAAA,GAAN,MAAM,IAAA,CAAI;AAAA;AAAA;AAAA;AAAA,EAIN,WAAA,CAIAC,KAAAA,EAKA,GAAA,EAKA,IAAA,EAIA,QAAA,EAAU;AACN,IAAA,IAAA,CAAK,IAAA,GAAOA,KAAAA;AACZ,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAIhB,IAAA,IAAA,CAAK,EAAA,GAAK,SAAA,EAAA;AAAA,EACd;AAAA,EACA,QAAA,GAAW;AACP,IAAA,IAAI,EAAE,IAAA,EAAAA,KAAAA,EAAK,GAAI,IAAA;AACf,IAAA,KAAA,IAAS,OAAO,IAAA,CAAK,QAAA;AACjB,MAAA,IAAI,GAAA,CAAI,IAAA;AACJ,QAAAA,KAAAA,GAAO,CAAA,EAAG,GAAA,CAAI,IAAI,IAAIA,KAAI,CAAA,CAAA,CAAA;AAClC,IAAA,OAAOA,KAAAA;AAAA,EACX;AAAA,EACA,OAAO,MAAA,CAAO,YAAA,EAAc,MAAA,EAAQ;AAChC,IAAA,IAAIA,KAAAA,GAAO,OAAO,YAAA,IAAgB,QAAA,GAAW,YAAA,GAAe,GAAA;AAC5D,IAAA,IAAI,YAAA,YAAwB,IAAA;AACxB,MAAA,MAAA,GAAS,YAAA;AACb,IAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,MAAA,GAAS,SAAS,MAAA,CAAO,IAAA;AACvD,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AACxD,IAAA,IAAI,GAAA,GAAM,IAAI,IAAA,CAAIA,KAAAA,EAAM,EAAC,EAAG,IAAA,EAAM,EAAE,CAAA;AACpC,IAAA,GAAA,CAAI,GAAA,CAAI,KAAK,GAAG,CAAA;AAChB,IAAA,IAAI,MAAA;AACA,MAAA,KAAA,IAASP,MAAK,MAAA,CAAO,GAAA;AACjB,QAAA,GAAA,CAAI,GAAA,CAAI,KAAKA,EAAC,CAAA;AACtB,IAAA,OAAO,GAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,OAAO,eAAeO,KAAAA,EAAM;AACxB,IAAA,IAAI,GAAA,GAAM,IAAI,QAAA,CAASA,KAAI,CAAA;AAC3B,IAAA,OAAO,CAAC,GAAA,KAAQ;AACZ,MAAA,IAAI,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA,GAAI,EAAA;AAC5B,QAAA,OAAO,GAAA;AACX,MAAA,OAAO,SAAS,GAAA,CAAI,GAAA,CAAI,QAAQ,GAAA,EAAK,GAAA,CAAI,SAAS,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,IAC7F,CAAA;AAAA,EACJ;AACJ,CAAA;AACA,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAM,QAAA,GAAN,MAAM,SAAA,CAAS;AAAA,EACX,YAAYA,KAAAA,EAAM;AACd,IAAA,IAAA,CAAK,IAAA,GAAOA,KAAAA;AACZ,IAAA,IAAA,CAAK,YAAY,EAAC;AAClB,IAAA,IAAA,CAAK,EAAA,GAAK,cAAA,EAAA;AAAA,EACd;AAAA,EACA,OAAO,GAAA,CAAI,IAAA,EAAM,IAAA,EAAM;AACnB,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA;AACN,MAAA,OAAO,IAAA;AACX,IAAA,IAAI,MAAA,GAAS,IAAA,CAAK,CAAC,CAAA,CAAE,UAAU,IAAA,CAAK,CAAAP,EAAAA,KAAKA,EAAAA,CAAE,QAAQ,IAAA,IAAQ,SAAA,CAAU,IAAA,EAAMA,EAAAA,CAAE,QAAQ,CAAC,CAAA;AACtF,IAAA,IAAI,MAAA;AACA,MAAA,OAAO,MAAA;AACX,IAAA,IAAI,GAAA,GAAM,EAAC,EAAG,GAAA,GAAM,IAAI,IAAI,IAAA,CAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,IAAI,CAAA;AACtD,IAAA,KAAA,IAAS,CAAA,IAAK,IAAA;AACV,MAAA,CAAA,CAAE,SAAA,CAAU,KAAK,GAAG,CAAA;AACxB,IAAA,IAAI,OAAA,GAAU,SAAS,IAAI,CAAA;AAC3B,IAAA,KAAA,IAAS,UAAU,IAAA,CAAK,GAAA;AACpB,MAAA,IAAI,CAAC,OAAO,QAAA,CAAS,MAAA;AACjB,QAAA,KAAA,IAAS,MAAA,IAAU,OAAA;AACf,UAAA,GAAA,CAAI,IAAA,CAAK,SAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAC,CAAA;AACjD,IAAA,OAAO,GAAA;AAAA,EACX;AACJ,CAAA;AACA,SAAS,SAAA,CAAU,GAAG,CAAA,EAAG;AACrB,EAAA,OAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,IAAK,CAAA,CAAE,CAAC,CAAC,CAAA;AAC9D;AACA,SAAS,SAAS,KAAA,EAAO;AACrB,EAAA,IAAI,IAAA,GAAO,CAAC,EAAE,CAAA;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAK,MAAA,EAAQ,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACzC,MAAA,IAAA,CAAK,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,OAAO,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAAA,IACtC;AAAA,EACJ;AACA,EAAA,OAAO,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,MAAA,GAAS,EAAE,MAAM,CAAA;AAClD;AAoDA,SAAS,UAAU,IAAA,EAAM;AACrB,EAAA,IAAI,MAAA,mBAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAC/B,EAAA,KAAA,IAAS,QAAQ,IAAA,EAAM;AACnB,IAAA,IAAIQ,KAAAA,GAAO,KAAK,IAAI,CAAA;AACpB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQA,KAAI,CAAA;AACnB,MAAAA,KAAAA,GAAO,CAACA,KAAI,CAAA;AAChB,IAAA,KAAA,IAAS,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC3B,MAAA,IAAI,IAAA,EAAM;AACN,QAAA,IAAI,MAAA,GAAS,EAAC,EAAG,IAAA,GAAO,GAAqB,IAAA,GAAO,IAAA;AACpD,QAAA,KAAA,IAAS,MAAM,CAAA,MAAK;AAChB,UAAA,IAAI,QAAQ,KAAA,IAAS,GAAA,GAAM,KAAK,GAAA,GAAM,CAAA,IAAK,KAAK,MAAA,EAAQ;AACpD,YAAA,IAAA,GAAO,CAAA;AACP,YAAA;AAAA,UACJ;AACA,UAAA,IAAI,CAAA,GAAI,6BAAA,CAA8B,IAAA,CAAK,IAAI,CAAA;AAC/C,UAAA,IAAI,CAAC,CAAA;AACD,YAAA,MAAM,IAAI,UAAA,CAAW,gBAAA,GAAmB,IAAI,CAAA;AAChD,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAA,IAAK,MAAM,EAAA,GAAK,CAAA,CAAE,CAAC,CAAA,CAAE,CAAC,KAAK,GAAA,GAAM,IAAA,CAAK,MAAM,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AACvE,UAAA,GAAA,IAAO,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA;AACZ,UAAA,IAAI,OAAO,IAAA,CAAK,MAAA;AACZ,YAAA;AACJ,UAAA,IAAI,IAAA,GAAO,KAAK,GAAA,EAAK,CAAA;AACrB,UAAA,IAAI,GAAA,IAAO,IAAA,CAAK,MAAA,IAAU,IAAA,IAAQ,GAAA,EAAK;AACnC,YAAA,IAAA,GAAO,CAAA;AACP,YAAA;AAAA,UACJ;AACA,UAAA,IAAI,IAAA,IAAQ,GAAA;AACR,YAAA,MAAM,IAAI,UAAA,CAAW,gBAAA,GAAmB,IAAI,CAAA;AAChD,UAAA,IAAA,GAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,QACzB;AACA,QAAA,IAAI,OAAO,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,KAAA,GAAQ,OAAO,IAAI,CAAA;AACjD,QAAA,IAAI,CAAC,KAAA;AACD,UAAA,MAAM,IAAI,UAAA,CAAW,gBAAA,GAAmB,IAAI,CAAA;AAChD,QAAA,IAAI,IAAA,GAAO,IAAI,IAAA,CAAKA,KAAAA,EAAM,IAAA,EAAM,IAAA,GAAO,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,GAAI,IAAI,CAAA;AACvE,QAAA,MAAA,CAAO,KAAK,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAC3C;AAAA,EACR;AACA,EAAA,OAAO,YAAA,CAAa,IAAI,MAAM,CAAA;AAClC;AACA,IAAM,YAAA,GAAe,IAAIC,eAAA,CAAS;AAAA,EAC9B,OAAA,CAAQ,GAAG,CAAA,EAAG;AACV,IAAA,IAAI,KAAK,IAAA,EAAM,IAAA;AACf,IAAA,OAAO,KAAK,CAAA,EAAG;AACX,MAAA,IAAI,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA,CAAE,KAAA,IAAS,EAAE,KAAA,EAAO;AAC/B,QAAA,IAAA,GAAO,CAAA;AACP,QAAA,CAAA,GAAI,CAAA,CAAE,IAAA;AAAA,MACV,CAAA,MACK;AACD,QAAA,IAAA,GAAO,CAAA;AACP,QAAA,CAAA,GAAI,CAAA,CAAE,IAAA;AAAA,MACV;AACA,MAAA,IAAI,GAAA,IAAO,IAAI,IAAA,IAAQ,IAAA,CAAK,QAAQ,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,GAAA,CAAI,OAAA;AACtD,QAAA;AACJ,MAAA,IAAI,IAAA,GAAO,IAAI,IAAA,CAAK,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,EAAM,KAAK,OAAO,CAAA;AACtD,MAAA,IAAI,GAAA;AACA,QAAA,GAAA,CAAI,IAAA,GAAO,IAAA;AAAA;AAEX,QAAA,IAAA,GAAO,IAAA;AACX,MAAA,GAAA,GAAM,IAAA;AAAA,IACV;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ,CAAC,CAAA;AACD,IAAM,OAAN,MAAW;AAAA,EACP,WAAA,CAAYD,KAAAA,EAAM,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM;AACnC,IAAA,IAAA,CAAK,IAAA,GAAOA,KAAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EAChB;AAAA,EACA,IAAI,MAAA,GAAS;AAAE,IAAA,OAAO,KAAK,IAAA,IAAQ,CAAA;AAAA,EAAqB;AAAA,EACxD,IAAI,OAAA,GAAU;AAAE,IAAA,OAAO,KAAK,IAAA,IAAQ,CAAA;AAAA,EAAsB;AAAA,EAC1D,KAAK,KAAA,EAAO;AACR,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,KAAA,GAAQ,KAAK,KAAA,EAAO;AACpC,MAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AACZ,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,KAAA,CAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACjC,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EACA,IAAI,KAAA,GAAQ;AAAE,IAAA,OAAO,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA;AAAA,EAAG;AACjE,CAAA;AACA,IAAA,CAAK,QAAQ,IAAI,IAAA,CAAK,EAAC,EAAG,GAAqB,IAAI,CAAA;AAMnD,SAAS,cAAA,CAAeA,OAAM,OAAA,EAAS;AACnC,EAAA,IAAI,GAAA,mBAAM,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAC5B,EAAA,KAAA,IAAS,SAASA,KAAAA,EAAM;AACpB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AACxB,MAAA,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA,GAAI,KAAA,CAAM,KAAA;AAAA;AAE1B,MAAA,KAAA,IAAS,OAAO,KAAA,CAAM,GAAA;AAClB,QAAA,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,GAAI,KAAA,CAAM,KAAA;AAAA,EAChC;AACA,EAAA,IAAI,EAAE,KAAA,EAAO,GAAA,GAAM,IAAA,EAAK,GAAe,EAAC;AACxC,EAAA,OAAO;AAAA,IACH,KAAA,EAAO,CAACA,KAAAA,KAAS;AACb,MAAA,IAAI,GAAA,GAAM,GAAA;AACV,MAAA,KAAA,IAAS,OAAOA,KAAAA,EAAM;AAClB,QAAA,KAAA,IAAS,GAAA,IAAO,IAAI,GAAA,EAAK;AACrB,UAAA,IAAI,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AACzB,UAAA,IAAI,QAAA,EAAU;AACV,YAAA,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,QAAA,GAAW,QAAA;AACnC,YAAA;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AACA,MAAA,OAAO,GAAA;AAAA,IACX,CAAA;AAAA,IACA;AAAA,GACJ;AACJ;AA4JA,IAAM,IAAI,GAAA,CAAI,MAAA;AACd,IAAM,UAAU,CAAA,EAAE;AAAlB,IAAqB,OAAO,CAAA,EAAE;AAA9B,IAAiC,QAAA,GAAW,EAAE,IAAI,CAAA;AAAlD,IAAqD,YAAA,GAAe,EAAE,IAAI,CAAA;AAA1E,IAA6E,UAAU,CAAA,EAAE;AAAzF,IAA4F,MAAA,GAAS,EAAE,OAAO,CAAA;AAA9G,IAAiH,MAAA,GAAS,EAAE,OAAO,CAAA;AAAnI,IAAsI,UAAU,CAAA,EAAE;AAAlJ,IAAqJ,OAAA,GAAU,EAAE,OAAO,CAAA;AAAxK,IAA2K,UAAU,CAAA,EAAE;AAAvL,IAA0L,WAAW,CAAA,EAAE;AAAvM,IAA0M,cAAc,CAAA,EAAE;AAA1N,IAA6N,OAAA,GAAU,EAAE,WAAW,CAAA;AAApP,IAAuP,OAAO,CAAA,EAAE;AAqBhQ,IAAM,IAAA,GAAO;AAAA;AAAA;AAAA;AAAA,EAIT,OAAA;AAAA;AAAA;AAAA;AAAA,EAIA,WAAA,EAAa,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAItB,YAAA,EAAc,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIvB,UAAA,EAAY,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIrB,IAAA;AAAA;AAAA;AAAA;AAAA,EAIA,YAAA,EAAc,EAAE,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,EAIpB,QAAA;AAAA;AAAA;AAAA;AAAA,EAIA,OAAA,EAAS,EAAE,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,EAInB,YAAA;AAAA;AAAA;AAAA;AAAA,EAIA,aAAA,EAAe,EAAE,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA,EAI7B,SAAA,EAAW,EAAE,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,EAIjB,SAAA,EAAW,EAAE,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,EAIjB,SAAA,EAAW,EAAE,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,EAIjB,SAAA,EAAW,EAAE,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,EAIjB,OAAA;AAAA;AAAA;AAAA;AAAA,EAIA,MAAA;AAAA;AAAA;AAAA;AAAA,EAIA,SAAA,EAAW,EAAE,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,EAInB,SAAA,EAAW,EAAE,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,EAInB,cAAA,EAAgB,EAAE,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,EAIxB,MAAA;AAAA;AAAA;AAAA;AAAA,EAIA,OAAA,EAAS,EAAE,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,EAIjB,KAAA,EAAO,EAAE,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,EAIf,IAAA,EAAM,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIf,MAAA,EAAQ,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKjB,MAAA,EAAQ,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIjB,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIhB,GAAA,EAAK,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAId,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,EAAM,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIf,IAAA,EAAM,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIf,IAAA,EAAM,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIf,IAAA,EAAM,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIf,QAAA,EAAU,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAInB,eAAA,EAAiB,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAI1B,cAAA,EAAgB,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIzB,iBAAA,EAAmB,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5B,aAAA,EAAe,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIxB,QAAA;AAAA;AAAA;AAAA;AAAA,EAIA,aAAA,EAAe,EAAE,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,EAIzB,kBAAA,EAAoB,EAAE,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,EAI9B,aAAA,EAAe,EAAE,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,EAIzB,eAAA,EAAiB,EAAE,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,EAI3B,eAAA,EAAiB,EAAE,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,EAI3B,cAAA,EAAgB,EAAE,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,EAI1B,kBAAA,EAAoB,EAAE,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,EAI9B,YAAA,EAAc,EAAE,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,EAIxB,eAAA,EAAiB,EAAE,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,EAI3B,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,EAAW,EAAE,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA,EAIxB,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,EAAc,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvB,aAAA,EAAe,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxB,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhB,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIhB,OAAA;AAAA;AAAA;AAAA;AAAA,EAIA,OAAA;AAAA;AAAA;AAAA;AAAA,EAIA,QAAA,EAAU,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAInB,QAAA,EAAU,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAInB,QAAA,EAAU,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAInB,QAAA,EAAU,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAInB,QAAA,EAAU,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAInB,QAAA,EAAU,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAInB,gBAAA,EAAkB,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAI3B,IAAA,EAAM,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIf,KAAA,EAAO,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIhB,QAAA,EAAU,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAInB,MAAA,EAAQ,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIjB,IAAA,EAAM,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKf,SAAA,EAAW,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpB,aAAA,EAAe,EAAE,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,EAIxB,UAAU,CAAA,EAAE;AAAA;AAAA;AAAA;AAAA,EAIZ,SAAS,CAAA,EAAE;AAAA;AAAA;AAAA;AAAA,EAIX,SAAS,CAAA,EAAE;AAAA;AAAA;AAAA;AAAA,EAIX,SAAS,CAAA,EAAE;AAAA;AAAA;AAAA;AAAA,EAIX,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,EAAc,EAAE,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpB,UAAA,EAAY,EAAE,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlB,qBAAA,EAAuB,EAAE,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7B,UAAA,EAAY,GAAA,CAAI,cAAA,CAAe,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM3C,QAAA,EAAU,GAAA,CAAI,cAAA,CAAe,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvC,QAAA,EAAU,GAAA,CAAI,cAAA,CAAe,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvC,QAAA,EAAU,GAAA,CAAI,cAAA,CAAe,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKvC,KAAA,EAAO,GAAA,CAAI,cAAA,CAAe,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASjC,OAAA,EAAS,GAAA,CAAI,cAAA,CAAe,SAAS;AACzC,CAAA;AACA,KAAA,IAASD,SAAQ,IAAA,EAAM;AACnB,EAAA,IAAI,GAAA,GAAM,KAAKA,KAAI,CAAA;AACnB,EAAA,IAAI,GAAA,YAAe,GAAA;AACf,IAAA,GAAA,CAAI,IAAA,GAAOA,KAAAA;AACnB;AAiDyB,cAAA,CAAe;AAAA,EACpC,EAAE,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,OAAO,UAAA,EAAW;AAAA,EACpC,EAAE,GAAA,EAAK,IAAA,CAAK,OAAA,EAAS,OAAO,aAAA,EAAc;AAAA,EAC1C,EAAE,GAAA,EAAK,IAAA,CAAK,QAAA,EAAU,OAAO,cAAA,EAAe;AAAA,EAC5C,EAAE,GAAA,EAAK,IAAA,CAAK,MAAA,EAAQ,OAAO,YAAA,EAAa;AAAA,EACxC,EAAE,GAAA,EAAK,IAAA,CAAK,OAAA,EAAS,OAAO,aAAA,EAAc;AAAA,EAC1C,EAAE,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,OAAO,UAAA,EAAW;AAAA,EACpC,EAAE,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,OAAO,UAAA,EAAW;AAAA,EACpC,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,OAAO,SAAA,EAAU;AAAA,EAClC,EAAE,GAAA,EAAK,IAAA,CAAK,SAAA,EAAW,OAAO,eAAA,EAAgB;AAAA,EAC9C,EAAE,GAAA,EAAK,IAAA,CAAK,QAAA,EAAU,OAAO,cAAA,EAAe;AAAA,EAC5C,EAAE,GAAA,EAAK,IAAA,CAAK,OAAA,EAAS,OAAO,aAAA,EAAc;AAAA,EAC1C,EAAE,GAAA,EAAK,IAAA,CAAK,OAAA,EAAS,OAAO,aAAA,EAAc;AAAA,EAC1C,EAAE,GAAA,EAAK,IAAA,CAAK,MAAA,EAAQ,OAAO,YAAA,EAAa;AAAA,EACxC,EAAE,GAAA,EAAK,IAAA,CAAK,MAAA,EAAQ,OAAO,YAAA,EAAa;AAAA,EACxC,EAAE,GAAA,EAAK,CAAC,IAAA,CAAK,QAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA,EAAG,OAAO,aAAA,EAAc;AAAA,EACnF,EAAE,GAAA,EAAK,IAAA,CAAK,YAAA,EAAc,OAAO,kBAAA,EAAmB;AAAA,EACpD,EAAE,KAAK,IAAA,CAAK,KAAA,CAAM,KAAK,YAAY,CAAA,EAAG,OAAO,4BAAA,EAA6B;AAAA,EAC1E,EAAE,KAAK,IAAA,CAAK,UAAA,CAAW,KAAK,YAAY,CAAA,EAAG,OAAO,iCAAA,EAAkC;AAAA,EACpF,EAAE,KAAK,IAAA,CAAK,OAAA,CAAQ,KAAK,YAAY,CAAA,EAAG,OAAO,mBAAA,EAAoB;AAAA,EACnE,EAAE,KAAK,IAAA,CAAK,UAAA,CAAW,KAAK,YAAY,CAAA,EAAG,OAAO,iCAAA,EAAkC;AAAA,EACpF,EAAE,GAAA,EAAK,IAAA,CAAK,QAAA,EAAU,OAAO,cAAA,EAAe;AAAA,EAC5C,EAAE,GAAA,EAAK,IAAA,CAAK,SAAA,EAAW,OAAO,eAAA,EAAgB;AAAA,EAC9C,EAAE,GAAA,EAAK,IAAA,CAAK,SAAA,EAAW,OAAO,eAAA,EAAgB;AAAA,EAC9C,EAAE,GAAA,EAAK,IAAA,CAAK,SAAA,EAAW,OAAO,eAAA,EAAgB;AAAA,EAC9C,EAAE,GAAA,EAAK,IAAA,CAAK,YAAA,EAAc,OAAO,kBAAA,EAAmB;AAAA,EACpD,EAAE,GAAA,EAAK,IAAA,CAAK,QAAA,EAAU,OAAO,cAAA,EAAe;AAAA,EAC5C,EAAE,GAAA,EAAK,IAAA,CAAK,OAAA,EAAS,OAAO,aAAA,EAAc;AAAA,EAC1C,EAAE,GAAA,EAAK,IAAA,CAAK,IAAA,EAAM,OAAO,UAAA,EAAW;AAAA,EACpC,EAAE,GAAA,EAAK,IAAA,CAAK,OAAA,EAAS,OAAO,aAAA,EAAc;AAAA,EAC1C,EAAE,GAAA,EAAK,IAAA,CAAK,WAAA,EAAa,OAAO,iBAAA;AACpC,CAAC;;;ACx5BM,IAAM,wBAAA,GAA2BG,oBAAW,MAAA,CAAO;AAAA,EACxD,MAAA,EAAQ,OAAO,SAAA,CAAU;AAAA,IACvB,KAAA,EAAO;AAAA,MACL,SAAA,CAAU;AAAA,QACR,YAAY,IAAA,CAAE,YAAA;AAAA,QACd,QAAQ,IAAA,CAAE,MAAA;AAAA,QACV,QAAQ,IAAA,CAAE,MAAA;AAAA,QACV,OAAO,IAAA,CAAE,OAAA;AAAA,QACT,kBAAkB,IAAA,CAAE,OAAA;AAAA,QACpB,aAAa,IAAA,CAAE,WAAA;AAAA,QACf,SAAS,IAAA,CAAE,OAAA;AAAA,QACX,OAAO,IAAA,CAAE,QAAA;AAAA,QACT,MAAM,IAAA,CAAE,QAAA;AAAA,QACR,OAAO,IAAA,CAAE,QAAA;AAAA,QACT,QAAQ,IAAA,CAAE,QAAA;AAAA,QACV,eAAe,IAAA,CAAE,QAAA;AAAA,QACjB,UAAU,IAAA,CAAE,OAAA;AAAA,QACZ,YAAY,IAAA,CAAE,OAAA;AAAA,QACd,aAAa,IAAA,CAAE,OAAA;AAAA,QACf,WAAW,IAAA,CAAE,OAAA;AAAA,QACb,YAAY,IAAA,CAAE,OAAA;AAAA,QACd,OAAO,IAAA,CAAE,WAAA;AAAA,QACT,UAAU,IAAA,CAAE,YAAA;AAAA,QACZ,aAAa,IAAA,CAAE;AAAA,OAChB;AAAA;AACH,GACD,CAAA;AAAA,EACD,YAAA,EAAc;AAAA,IACZ,aAAA,EAAe,EAAE,IAAA,EAAM,IAAA,EAAK;AAAA,IAC5B,aAAA,EAAe,EAAE,QAAA,EAAU,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AAAE;AAEpD,CAAC;AAEM,SAAS,gBAAA,GAAmB;AACjC,EAAA,OAAO,IAAIC,yBAAgB,wBAAwB,CAAA;AACrD;;;ACzBO,IAAM,uBAAA,GAA0B,CAAC,SAAA,EAAW,MAAM;AAGlD,IAAM,eAAA,GAAkB,CAAC,KAAA,EAAO,UAAA,EAAY,MAAM;AAiJlD,IAAM,wBAAA,GAA4D;AAAA,EACvE,UAAA,EAAY,CAAA;AAAA,EACZ,gBAAA,EAAkB;AACpB;;;ACzJO,IAAM,kBAAA,GAAqB;AAAA,EAChC,YAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AAIO,SAAS,mBAAmB,KAAA,EAA2C;AAC5E,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAClB,mBAAyC,QAAA,CAAS,KAAA,CAAM,aAAa,CAAA;AAC7E;AASO,IAAM,kBAAA,GAAuD;AAAA,EAClE,QAAA,EAAU,GAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,UAAA,EAAY,GAAA;AAAA,EACZ,QAAA,EAAU,GAAA;AAAA,EACV,UAAA,EAAY,CAAA;AAAA,EACZ,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ,CAAA;AAAA,EACR,OAAA,EAAS,CAAA;AAAA,EACT,QAAA,EAAU,CAAA;AAAA,EACV,OAAA,EAAS;AACX;AAGO,SAAS,oBAAoB,UAAA,EAAwC;AAC1E,EAAA,IAAI,CAAC,YAAY,OAAO,CAAA;AACxB,EAAA,MAAM,GAAA,GAAM,WAAW,WAAA,EAAY;AACnC,EAAA,OAAO,kBAAA,CAAmB,GAAG,CAAA,GAAI,kBAAA,CAAmB,GAAG,CAAA,GAAI,CAAA;AAC7D;;;AC9CO,SAAS,mBAAA,CAAoB,GAAW,CAAA,EAAmB;AAChE,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA,CAAE,MAAA;AAC7B,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA,CAAE,MAAA;AAG7B,EAAA,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,MAAA,EAAQ;AACvB,IAAA,MAAM,GAAA,GAAM,CAAA;AACZ,IAAA,CAAA,GAAI,CAAA;AACJ,IAAA,CAAA,GAAI,GAAA;AAAA,EACN;AAEA,EAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,EAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AAIZ,EAAA,IAAI,IAAA,GAAO,IAAI,WAAA,CAAY,CAAA,GAAI,CAAC,CAAA;AAChC,EAAA,IAAI,IAAA,GAAO,IAAI,WAAA,CAAY,CAAA,GAAI,CAAC,CAAA;AAEhC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AAAA,EACZ;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,IAAA,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AACV,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,UAAA,CAAW,CAAA,GAAI,CAAC,CAAA;AAC7B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,OAAO,CAAA,CAAE,UAAA,CAAW,IAAI,CAAC,CAAA,KAAM,KAAK,CAAA,GAAI,CAAA;AAC9C,MAAA,IAAA,CAAK,CAAC,IAAI,IAAA,CAAK,GAAA;AAAA,QACb,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AAAA;AAAA,QACV,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI,CAAA;AAAA;AAAA,QACd,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,GAAI;AAAA;AAAA,OAChB;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,IAAA,GAAO,IAAA;AACP,IAAA,IAAA,GAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAK,CAAC,CAAA;AACf;AASO,SAAS,kBAAkB,KAAA,EAAuB;AACvD,EAAA,OAAO,KAAA,CACJ,WAAA,EAAY,CACZ,OAAA,CAAQ,sBAAsB,GAAG,CAAA,CACjC,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA,CACrB,IAAA,EAAK,CACL,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACxB;AAKO,SAAS,iBAAA,CAAkB,CAAA,EAAW,CAAA,EAAW,SAAA,EAA4B;AAClF,EAAA,MAAM,EAAA,GAAK,kBAAkB,CAAC,CAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,kBAAkB,CAAC,CAAA;AAG9B,EAAA,IAAI,EAAA,KAAO,IAAI,OAAO,IAAA;AAGtB,EAAA,IAAI,IAAA,CAAK,IAAI,EAAA,CAAG,MAAA,GAAS,GAAG,MAAM,CAAA,GAAI,WAAW,OAAO,KAAA;AAExD,EAAA,OAAO,mBAAA,CAAoB,EAAA,EAAI,EAAE,CAAA,IAAK,SAAA;AACxC;AAcO,SAAS,kBAAA,CACd,KAAA,EACA,UAAA,EACA,SAAA,EACuB;AACvB,EAAA,MAAM,EAAA,GAAK,kBAAkB,KAAK,CAAA;AAClC,EAAA,IAAI,IAAA,GAA8B,IAAA;AAElC,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,EAAA,GAAK,kBAAkB,SAAS,CAAA;AAGtC,IAAA,IAAI,KAAK,GAAA,CAAI,EAAA,CAAG,SAAS,EAAA,CAAG,MAAM,IAAI,SAAA,EAAW;AAEjD,IAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,EAAA,EAAI,EAAE,CAAA;AAC3C,IAAA,IAAI,WAAW,SAAA,EAAW;AAE1B,IAAA,IAAI,CAAC,IAAA,IAAQ,QAAA,GAAW,IAAA,CAAK,QAAA,EAAU;AACrC,MAAA,IAAA,GAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAS;AAErC,MAAA,IAAI,aAAa,CAAA,EAAG;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;ACtGA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,OAAO,iBAAA,CAAkB,KAAK,CAAA,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AACrD;AAEO,IAAM,iBAAN,MAAgD;AAAA,EAGrD,WAAA,CACmB,UACjB,OAAA,EACA;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAGjB,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,UAAA,EAAY,OAAA,EAAS,UAAA,IAAc,wBAAA,CAAyB,UAAA;AAAA,MAC5D,gBAAA,EACE,OAAA,EAAS,gBAAA,IAAoB,wBAAA,CAAyB;AAAA,KAC1D;AAAA,EACF;AAAA,EARmB,QAAA;AAAA,EAHX,OAAA;AAAA,EAaR,cAAc,IAAA,EAA8B;AAC1C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA;AAAA,EACnC;AAAA,EAEA,eAAe,KAAA,EAA+B;AAC5C,IAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAC1C,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,EAAG;AACzC,MAAA,IAAI,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAA,KAAM,YAAY,OAAO,MAAA;AAC3D,MAAA,KAAA,MAAW,KAAA,IAAS,OAAO,OAAA,EAAS;AAClC,QAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,KAAM,UAAA,EAAY,OAAO,MAAA;AAAA,MACtD;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,YAAA,CACE,OACA,OAAA,EACS;AACT,IAAA,MAAM,SAAA,GAAY,OAAA,EAAS,SAAA,IAAa,IAAA,CAAK,OAAA,CAAQ,gBAAA;AACrD,IAAA,MAAM,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAG1C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACvC,IAAA,IAAI,OAAO,OAAO,KAAA;AAGlB,IAAA,MAAM,aAAmD,EAAC;AAC1D,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,EAAG;AACzC,MAAA,KAAA,MAAW,SAAS,CAAC,MAAA,CAAO,OAAO,GAAG,MAAA,CAAO,OAAO,CAAA,EAAG;AACrD,QAAA,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,MACnC;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,kBAAA;AAAA,MACX,UAAA;AAAA,MACA,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAAA,MAC7B;AAAA,KACF;AAEA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,UAAU,UAAA,CAAW,IAAA;AAAA,QACzB,CAAC,MAAM,iBAAA,CAAkB,CAAA,CAAE,KAAK,CAAA,KAAM,iBAAA,CAAkB,KAAK,MAAM;AAAA,OACrE;AACA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,MACjB;AAAA,IACF;AAGA,IAAA,OAAO,IAAA,CAAK,sBAAsB,KAAK,CAAA;AAAA,EACzC;AAAA,EAEA,aAAA,CAAc,OAAe,OAAA,EAAmD;AAC9E,IAAA,MAAM,SAAS,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA,IAClC,KAAK,cAAA,CAAe,KAAK,CAAA,IACzB,IAAA,CAAK,aAAa,KAAA,EAAO,EAAE,SAAA,EAAW,OAAA,EAAS,WAAW,CAAA;AAC/D,IAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC/C;AAAA,EAEA,iBAAA,CAAkB,QAAiB,OAAA,EAAmD;AACpF,IAAA,OAAO,IAAA,CAAK,YAAY,MAAA,EAAQ,OAAA,EAAS,aAAa,EAAC,kBAAG,IAAI,GAAA,EAAa,CAAA;AAAA,EAC7E;AAAA,EAEA,IAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,EAAK;AAAA,EAC5B;AAAA,EAEQ,WAAA,CACN,UAAA,EACA,SAAA,EACA,IAAA,EACgB;AAChB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wDAAA,EAA2D,UAAA,CAAW,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/F;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,WAAW,IAAI,CAAA;AAExB,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,UAAA,EAAY,UAAA,GAClC,IAAA,CAAK,SAAS,OAAA,CAAQ,UAAA,CAAW,UAAA,CAAW,UAAU,CAAA,GACtD,IAAA;AACJ,IAAA,MAAM,iBAAiB,MAAA,GAAS,IAAA,CAAK,YAAY,MAAA,EAAQ,SAAA,EAAW,IAAI,CAAA,GAAI,IAAA;AAE5E,IAAA,IAAI,GAAA,GAAM,cAAA,EAAgB,GAAA,IAAO,UAAA,CAAW,cAAA,CAAe,GAAA;AAC3D,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,UAAA,EAAY,YAAA,IAAgB,EAAC;AAC7D,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC7D,MAAA,IAAI,IAAA,CAAK,sBAAA,CAAuB,GAAA,EAAK,SAAS,CAAA,EAAG;AAC/C,QAAA,GAAA,IAAO,WAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,UAAA,EAAY,aAAA,EAAe,GAAA;AACtD,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AAC3D,MAAA,GAAA,GAAM,OAAA;AAAA,IACR;AAEA,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,cAAA,CAAe,UAAA,IAAc,cAAA,EAAgB,UAAA;AAC3E,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,uBAAA,CAAwB,UAAA,EAAY,cAAc,CAAA;AAChF,IAAA,MAAM,iBAAiB,UAAA,CAAW,cAAA;AAClC,IAAA,MAAM,eAAmC,cAAA,KAAmB,MAAA,GACxD,MAAA,GACA,cAAA,KAAmB,YACjB,SAAA,GACA,SAAA;AACN,IAAA,MAAM,cAAc,cAAA,KAAmB,sBAAA;AAEvC,IAAA,MAAM,MAAA,GAAkB;AAAA,MACtB,GAAG,UAAA;AAAA,MACH,cAAA,EAAgB;AAAA,QACd,GAAG,UAAA,CAAW,cAAA;AAAA,QACd,GAAA;AAAA,QACA,UAAA;AAAA,QACA,gBAAA;AAAA,QACA,aAAA,EAAe,UAAA,CAAW,cAAA,CAAe,aAAA,IAAiB,cAAA,EAAgB;AAAA;AAC5E,KACF;AAEA,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,GAAA;AAAA,MACA,gBAAgB,MAAA,CAAO,cAAA;AAAA,MACvB,UAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA,EAAe,OAAO,cAAA,CAAe,aAAA;AAAA,MACrC,SAAA,EAAW,EAAE,GAAG,SAAA,EAAU;AAAA,MAC1B,cAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,sBAAA,CAAuB,KAAa,SAAA,EAA4C;AACtF,IAAA,IAAI,GAAA,KAAQ,KAAA,IAAS,GAAA,KAAQ,GAAA,EAAK,OAAO,IAAA;AACzC,IAAA,KAAA,MAAW,CAAC,WAAA,EAAa,aAAa,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpE,MAAA,IACE,GAAA,KAAQ,WAAA,IACR,GAAA,KAAQ,aAAA,IACR,QAAQ,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,aAAa,MACvC,GAAA,KAAQ,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,EACvC;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,uBAAA,CAAwB,YAAqB,MAAA,EAAwC;AAC3F,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,UAAA,EAAY,aAAA,EAAe,gBAAA;AAC3D,IAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,IAAY,OAAO,QAAA,CAAS,YAAY,GAAG,OAAO,YAAA;AAE9E,IAAA,MAAM,QAAA,GAAW,WAAW,cAAA,CAAe,gBAAA;AAC3C,IAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,OAAO,QAAA,CAAS,QAAQ,GAAG,OAAO,QAAA;AAEtE,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,cAAA,CAAe,UAAA,IAAc,MAAA,EAAQ,UAAA;AACnE,IAAA,IAAI,CAAC,UAAA,IAAc,MAAA,EAAQ,OAAO,MAAA,CAAO,gBAAA;AAEzC,IAAA,OAAO,oBAAoB,UAAU,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,sBAAsB,KAAA,EAAwB;AACpD,IAAA,MAAM,eAAA,GAAkB,kBAAkB,KAAK,CAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,cAAc,KAAK,CAAA;AAChC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,CAAA,UAAA,EAAaC,OAAA,EAAQ,CAAA,CAAA;AAAA,MACzB,IAAA;AAAA,MACA,KAAA,EAAO,eAAA;AAAA,MACP,OAAA,EAAS,CAAC,eAAe,CAAA;AAAA,MACzB,cAAA,EAAgB;AAAA,QACd,GAAA,EAAK,KAAK,OAAA,CAAQ,UAAA;AAAA,QAClB,UAAA,EAAY,MAAA;AAAA,QACZ,aAAA,EAAe;AAAA,OACjB;AAAA,MACA,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AACF;;;ACnNO,IAAM,cAAA,GAA0B;AAAA,EACrC,EAAA,EAAI,iBAAA;AAAA,EACJ,IAAA,EAAM,eAAA;AAAA,EACN,KAAA,EAAO,iBAAA;AAAA,EACP,OAAA,EAAS,CAAC,KAAA,EAAO,SAAA,EAAW,WAAW,CAAA;AAAA,EACvC,gBAAgB,EAAE,GAAA,EAAK,KAAK,UAAA,EAAY,SAAA,EAAW,eAAe,UAAA,EAAW;AAAA,EAC7E,cAAA,EAAgB;AAClB;AAEO,IAAM,aAAA,GAAyB;AAAA,EACpC,EAAA,EAAI,gBAAA;AAAA,EACJ,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,OAAA,EAAS,CAAC,KAAA,EAAO,OAAA,EAAS,KAAK,CAAA;AAAA,EAC/B,gBAAgB,EAAE,GAAA,EAAK,GAAK,UAAA,EAAY,QAAA,EAAU,eAAe,MAAA,EAAO;AAAA,EACxE,cAAA,EAAgB;AAClB;AAEO,IAAM,gBAAA,GAA4B;AAAA,EACvC,EAAA,EAAI,oBAAA;AAAA,EACJ,IAAA,EAAM,YAAA;AAAA,EACN,KAAA,EAAO,YAAA;AAAA,EACP,OAAA,EAAS,CAAC,OAAA,EAAS,eAAA,EAAiB,IAAI,CAAA;AAAA,EACxC,gBAAgB,EAAE,GAAA,EAAK,GAAK,UAAA,EAAY,UAAA,EAAY,eAAe,UAAA,EAAW;AAAA,EAC9E,cAAA,EAAgB;AAClB;AAEO,IAAM,aAAA,GAAyB;AAAA,EACpC,EAAA,EAAI,gBAAA;AAAA,EACJ,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,OAAA,EAAS,CAAC,SAAS,CAAA;AAAA,EACnB,gBAAgB,EAAE,GAAA,EAAK,IAAM,UAAA,EAAY,YAAA,EAAc,eAAe,MAAA,EAAO;AAAA,EAC7E,cAAA,EAAgB;AAClB;AAEO,IAAM,YAAA,GAAwB;AAAA,EACnC,EAAA,EAAI,eAAA;AAAA,EACJ,IAAA,EAAM,OAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,EAClB,gBAAgB,EAAE,GAAA,EAAK,KAAK,UAAA,EAAY,YAAA,EAAc,eAAe,KAAA,EAAM;AAAA,EAC3E,cAAA,EAAgB;AAClB;AAEO,IAAM,iBAAA,GAA6B;AAAA,EACxC,EAAA,EAAI,qBAAA;AAAA,EACJ,IAAA,EAAM,gBAAA;AAAA,EACN,KAAA,EAAO,wBAAA;AAAA,EACP,OAAA,EAAS,CAAC,MAAA,EAAQ,gBAAgB,CAAA;AAAA,EAClC,gBAAgB,EAAE,GAAA,EAAK,KAAK,UAAA,EAAY,UAAA,EAAY,eAAe,MAAA,EAAO;AAAA,EAC1E,cAAA,EAAgB,MAAA;AAAA,EAChB,UAAA,EAAY;AAAA,IACV,UAAA,EAAY,QAAA;AAAA,IACZ,YAAA,EAAc,EAAE,GAAA,EAAK,GAAA;AAAI,GAC3B;AAAA,EACA,SAAA,EAAW,sBAAA;AAAA,EACX,SAAA,EAAW;AACb;AAGO,IAAM,mBAAA,GAA+B;AAAA,EAC1C,EAAA,EAAI,uBAAA;AAAA,EACJ,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,qBAAA;AAAA,EACP,OAAA,EAAS,CAAC,KAAA,EAAO,OAAA,EAAS,KAAK,CAAA;AAAA,EAC/B,gBAAgB,EAAE,GAAA,EAAK,KAAK,UAAA,EAAY,QAAA,EAAU,eAAe,MAAA,EAAO;AAAA,EACxE,cAAA,EAAgB,MAAA;AAAA,EAChB,SAAA,EAAW,sBAAA;AAAA,EACX,SAAA,EAAW;AACb;AAGO,IAAM,gBAAA,GAAuC;AAAA,EAClD,cAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF;AAGO,IAAM,cAAA,GAAqC;AAAA,EAChD,GAAG,gBAAA;AAAA,EACH,iBAAA;AAAA,EACA;AACF;;;AC5FO,IAAM,cAAA,GAAqC;AAG3C,IAAM,uBAAuB,cAAA,CAAe;;;ACK5C,IAAM,yBAAN,MAAwD;AAAA,EACrD,OAAA,uBAAc,GAAA,EAAqB;AAAA,EACnC,YAAA,GAA4C,IAAA;AAAA,EAEpD,YAAY,YAAA,EAAqC;AAC/C,IAAA,IAAA,CAAK,eAAe,YAAA,IAAgB,IAAA;AAAA,EACtC;AAAA;AAAA,EAGA,MAAM,WAAA,GAA6B;AACjC,IAAA,KAAA,MAAW,UAAU,cAAA,EAAgB;AACnC,MAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,MAAA,CAAO,cAAA,KAAmB,KAAK,YAAA,EAAc;AACrE,QAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,KAAK,OAAA,EAAmC;AACtC,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AAAA,IACtC;AAAA,EACF;AAAA;AAAA,EAGA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AAAA,EAEA,QAAQ,IAAA,EAA8B;AACpC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA;AAAA,EACnC;AAAA,EAEA,IAAA,GAA2B;AACzB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,aAAa,MAAA,EAAkD;AAC7D,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,mBAAmB,MAAM,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAM,OAAO,MAAA,EAAgC;AAC3C,IAAA,IAAI,MAAA,CAAO,mBAAmB,MAAA,EAAQ;AACpC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,0FAAA,EAA6F,OAAO,cAAc,CAAA,CAAA;AAAA,OACpH;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,OAAO,IAAA,EAA6B;AACxC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACtC,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,cAAA,KAAmB,MAAA,EAAQ;AAClD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,iEAAiE,IAAI,CAAA,CAAA;AAAA,OACvE;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,EAC1B;AACF;;;ACWO,IAAM,uBAAA,GAA2H;AAAA,EACpI,SAAA,EAAW,KAAA;AAAA,EACX,aAAA,EAAe,KAAA;AAAA,EACf,cAAA,EAAgB;AACpB,CAAA;;;ACvEO,IAAM,QAAA,GAAN,MAAM,SAAA,CAAkC;AAAA,EAC3C,WAAA,CACW,SACA,KAAA,EACT;AAFS,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EACP;AAAA,EAFO,OAAA;AAAA,EACA,KAAA;AAAA,EAGX,OAAO,SAAS,IAAA,EAAqB;AACjC,IAAA,OAAO,IAAI,SAAA,CAAS,IAAA,CAAK,OAAA,EAAS,KAAK,KAAK,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAA,CAAU,KAAA,EAAa,GAAA,EAAsB;AAChD,IAAA,OAAO,IAAI,SAAA,CAAS,KAAA,CAAM,SAAQ,EAAG,GAAA,EAAK,SAAS,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,QAAA,GAAmB;AACnB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,GAAA,EAAI;AACnC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,KAAK,OAAO,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAkB;AAClB,IAAA,OAAO,KAAK,KAAA,KAAU,MAAA;AAAA,EAC1B;AAAA,EAEA,IAAI,SAAA,GAAkB;AAClB,IAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAAA,EAChC;AAAA,EAEA,IAAI,OAAA,GAA4B;AAC5B,IAAA,OAAO,KAAK,KAAA,GAAQ,IAAI,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,MAAA;AAAA,EAC/C;AACJ;;;ACpCO,IAAM,aAAA,GAAN,MAAM,cAAA,CAAuC;AAAA,EAChD,WAAA,CACqB,aACA,WAAA,EACnB;AAFmB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAClB;AAAA,EAFkB,WAAA;AAAA,EACA,WAAA;AAAA;AAAA,EAIrB,IAAI,WAAA,GAAoB;AACpB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AAAA,EAEA,GAAA,GAAY;AACR,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AAAA,EAEA,KAAA,GAAgB;AACZ,IAAA,OAAO,IAAA,CAAK,YAAY,OAAA,EAAQ;AAAA,EACpC;AAAA;AAAA,EAGA,IAAI,OAAA,GAAkB;AAClB,IAAA,OAAO,KAAK,WAAA,CAAY,OAAA;AAAA,EAC5B;AAAA,EAEA,IAAI,SAAA,GAAqB;AACrB,IAAA,OAAO,KAAK,WAAA,CAAY,SAAA;AAAA,EAC5B;AAAA,EAEA,IAAI,KAAA,GAAiC;AACjC,IAAA,OAAO,KAAK,WAAA,CAAY,KAAA;AAAA,EAC5B;AAAA,EAEA,KAAA,GAAc;AACV,IAAA,OAAO,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EAClC;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,OAAO,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,EAAA,CAAG,KAAA,EAAsB,IAAA,EAA2B;AACvD,IAAA,OAAO,IAAI,cAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,IAAI,KAAA,EAAqC;AAC5C,IAAA,OAAO,IAAI,cAAA,CAAc,KAAA,EAAO,KAAA,CAAM,WAAW,CAAA;AAAA,EACrD;AACJ;AAWO,IAAM,eAAN,MAA4C;AAAA,EACvC,SAAqB,EAAC;AAAA;AAAA;AAAA;AAAA,EAK9B,IAAW,WAAA,GAAoB;AAC3B,IAAA,2BAAW,IAAA,EAAK;AAAA,EACpB;AAAA,EAEA,GAAA,GAAY;AACR,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AAAA,EAEA,KAAA,GAAgB;AACZ,IAAA,OAAO,IAAA,CAAK,YAAY,OAAA,EAAQ;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,SAAA,GAAqB;AAC5B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACrC,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,KAAA,GAAiC;AACxC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,OAAA,GAAkB;AACzB,IAAA,OAAO,IAAA,CAAK,OAAO,MAAA,CAAO,CAAC,OAAO,IAAA,KAAS,KAAA,GAAQ,IAAA,CAAK,QAAA,EAAU,CAAC,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,KAAA,GAAc;AACjB,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,OAAO,KAAK,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,CAAE,SAAA;AAAA,IAC/C;AAEA,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAI,SAAS,GAAA,CAAI,OAAA,EAAS,CAAC,CAAA;AAC5C,IAAA,OAAO,GAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,IAAA,GAAa;AAChB,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAGrB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACjB,MAAA,OAAO,GAAA;AAAA,IACX;AAGA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,CAAE,KAAA,GAAQ,IAAI,OAAA,EAAQ;AACxD,IAAA,OAAO,GAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKO,KAAA,GAAc;AACjB,IAAA,IAAA,CAAK,SAAS,EAAC;AAAA,EACnB;AACJ;AAeO,SAAS,eAAA,CAAgB,WAAA,mBAAoB,IAAI,IAAA,EAAK,EAAc;AACvE,EAAA,IAAI,WAAA,GAAc,WAAA;AAClB,EAAA,MAAM,QAAoB,EAAC;AAE3B,EAAA,OAAO;AAAA,IACH,IAAI,WAAA,GAAc;AAAE,MAAA,OAAO,WAAA;AAAA,IAAa,CAAA;AAAA,IACxC,GAAA,GAAM;AAAE,MAAA,OAAO,WAAA;AAAA,IAAa,CAAA;AAAA,IAC5B,KAAA,GAAQ;AAAE,MAAA,OAAO,YAAY,OAAA,EAAQ;AAAA,IAAG,CAAA;AAAA,IACxC,IAAI,OAAA,GAAU;AACV,MAAA,OAAO,KAAA,CAAM,OAAO,CAAC,KAAA,EAAO,SAAS,KAAA,GAAQ,IAAA,CAAK,UAAU,CAAC,CAAA;AAAA,IACjE,CAAA;AAAA,IACA,IAAI,SAAA,GAAY;AACZ,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAC/B,MAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA;AAAA,IACnC,CAAA;AAAA,IACA,IAAI,KAAA,GAAQ;AAAE,MAAA,OAAO,KAAA;AAAA,IAAO,CAAA;AAAA,IAC5B,KAAA,GAAQ;AACJ,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,IAAK,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,CAAE,KAAA,KAAU,MAAA,EAAW;AACjE,QAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,SAAA;AAAA,MACnC;AACA,MAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,WAAW,CAAA;AACtC,MAAA,KAAA,CAAM,KAAK,IAAI,QAAA,CAAS,SAAA,CAAU,OAAA,EAAS,CAAC,CAAA;AAC5C,MAAA,OAAO,SAAA;AAAA,IACX,CAAA;AAAA,IACA,IAAA,GAAO;AACH,MAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,WAAW,CAAA;AACtC,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,IAAK,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,CAAE,KAAA,KAAU,MAAA,EAAW;AACjE,QAAA,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,CAAE,KAAA,GAAQ,UAAU,OAAA,EAAQ;AAAA,MACtD;AACA,MAAA,OAAO,SAAA;AAAA,IACX,CAAA;AAAA,IACA,QAAQ,EAAA,EAAY;AAChB,MAAA,WAAA,GAAc,IAAI,IAAA,CAAK,WAAA,CAAY,OAAA,KAAY,EAAE,CAAA;AAAA,IACrD,CAAA;AAAA,IACA,QAAQ,IAAA,EAAY;AAChB,MAAA,WAAA,GAAc,IAAA;AAAA,IAClB;AAAA,GACJ;AACJ;;;ACxNO,IAAM,YAAA,GAA6B;AAAA,EACtC,GAAA,EAAK,sBAAM,IAAI,IAAA,EAAK;AAAA,EACpB,KAAA,EAAO,MAAM,IAAA,CAAK,GAAA;AACtB;AAGO,SAAS,UAAU,EAAA,EAAwB;AAC9C,EAAA,OAAO,EAAE,KAAK,MAAM,EAAA,EAAI,OAAO,MAAM,EAAA,CAAG,SAAQ,EAAE;AACtD;;;ACfO,IAAM,aAAN,MAA2C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAShD,WAAA,CACmB,OAAA,EACA,GAAA,GAAoB,YAAA,EACrC;AAFiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAChB;AAAA,EAFgB,OAAA;AAAA,EACA,GAAA;AAAA,EAVV,IAAA,GAAO,MAAA;AAAA,EAahB,GAAG,OAAA,EAA4C;AAE7C,IAAA,IAAI,CAAC,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA,EAAG;AACvC,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,YAAA,GAAe,QAAQ,KAAA,CAAM,OAAA;AACnC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAI;AAGF,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,GAC1B,EAAE,KAAA,EAAO,cAAc,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA,EAAE,GAC1C,KAAA,CAAA;AACJ,MAAA,MAAM,mBAAmB,EAAE,GAAG,aAAA,EAAe,GAAG,KAAK,OAAA,EAAQ;AAI7D,MAAA,OAAO,YAAA,CAAa,IAAA,CAAK,OAAA,EAAS,gBAAgB,CAAA;AAAA,IAEpD,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,QAAQ,MAAA,IAAU,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AACnD,QAAA,OAAA,CAAQ,OAAO,IAAA,CAAK;AAAA,UAClB,KAAA;AAAA,UACA,MAAA,EAAQ,YAAA;AAAA,UACR,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,GAAA,EAAI;AAAA,UACxB,QAAA,EAAU,YAAA,CAAa,GAAA,CAAI,QAAA;AAAS,SACrC,CAAA;AAAA,MACH;AACA,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,qBAAqB,OAAA,EAAmC;AAE9D,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,OAAO,KAAA;AAAA,IACT;AAQA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC1CO,IAAM,cAAN,MAA4C;AAAA,EAGjD,WAAA,CAEkB,KAAA,EAEA,MAAA,EAEA,OAAA,EAChB;AALgB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAEA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EACd;AAAA,EALc,KAAA;AAAA,EAEA,MAAA;AAAA,EAEA,OAAA;AAAA,EART,IAAA,GAAO,OAAA;AAAA,EAWhB,GAAG,OAAA,EAAgC;AAGjC,IAAA,MAAM,iBAAA,GAAoB,OAAA;AAC1B,IAAA,IAAI,CAAC,kBAAkB,MAAA,EAAQ;AAC7B,MAAA,iBAAA,CAAkB,SAAS,EAAC;AAAA,IAC9B;AAEA,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,SAAS,IAAA,CAAK;AAAA,KAChB;AAEA,IAAA,iBAAA,CAAkB,MAAA,CAAO,KAAK,YAAY,CAAA;AAE1C,IAAA,OAAA,CAAQ,MAAM,CAAA,0BAAA,EAAwB,IAAA,CAAK,MAAM,CAAA,CAAA,CAAA,EAAK,IAAA,CAAK,MAAM,OAAO,CAAA;AACxE,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,WAAA,CAAA,EAAe,IAAA,CAAK,OAAO,CAAA;AAAA,IAC3C;AAAA,EACF;AACF;;;ACxDO,IAAM,mBAAN,MAAiD;AAAA,EAGpD,WAAA,CACqB,OACA,MAAA,EACnB;AAFmB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EACjB;AAAA,EAFiB,KAAA;AAAA,EACA,MAAA;AAAA,EAJZ,IAAA,GAAO,aAAA;AAAA,EAOhB,GAAG,OAAA,EAAgC;AAE/B,IAAA,IAAI,YAAY,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA,CAAE,GAAG,OAAO,CAAA;AAGnD,IAAA,OAAA,CAAQ,SAAS,QAAA,CAAS;AAAA,MACtB,IAAA,EAAM,eAAA;AAAA,MACN,SAAA,EAAW,QAAQ,KAAA,CAAM,WAAA;AAAA,MACzB,MAAM,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA;AAAO,OAChD,OAAO,CAAA;AAAA,EACd;AACJ;AAKO,SAAS,UAAA,CAAW,OAAc,MAAA,EAAgC;AACrE,EAAA,OAAO,IAAI,gBAAA,CAAiB,KAAA,EAAO,MAAM,CAAA;AAC7C;;;AC1BO,IAAM,mBAAN,MAAgD;AAAA,EAC7C,GAAA;AAAA,EACA,KAAA;AAAA,EAER,YAAY,EAAA,EAAY;AACtB,IAAA,IAAA,CAAK,GAAA,GAAM,EAAA;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ,cAAA;AAAA,EACf;AAAA,EAEA,IAAI,EAAA,GAAa;AACf,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AAAA,EAEA,IAAI,GAAG,MAAA,EAAgB;AACrB,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,IAAI,KAAK,MAAA,EAAgB;AACvB,IAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,EACxD;AAAA,EAEA,OAAA,CAAQ,OAAe,OAAA,EAA2C;AAEhE,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,IAAI,CAAC,WAAW,CAAC,OAAA,CAAQ,SAAS,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA,EAAG;AAC3D,MAAA,OAAO,CAAC,UAAA,CAAW,IAAI,MAAM,sCAAsC,CAAA,EAAG,kBAAkB,CAAC,CAAA;AAAA,IAC3F;AAGA,IAAA,OAAO,CAAC,IAAI,UAAA,CAAW,MAAA,EAAW,OAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,EACxD;AACF;;;AC3BO,IAAM,qBAAN,MAAmD;AAAA,EAC7C,IAAA,GAAO,eAAA;AAAA,EAEhB,GAAG,OAAA,EAA4C;AAC3C,IAAA,MAAM,cAAA,GAAiB,GAAA;AACvB,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,MAAM,mBAAqC,EAAC;AAE5C,IAAA,OAAO,UAAA,GAAa,cAAA,IAAkB,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC3D,MAAA,MAAM,OAAA,GAAU,QAAQ,KAAA,CAAM,OAAA;AAC9B,MAAA,IAAI,CAAC,OAAA,EAAS;AAGd,MAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,IAAc,OAAO,OAAA,CAAQ,iBAAiB,UAAA,EAAY;AACnE,QAAA,OAAA,CAAQ,aAAa,YAAY,CAAA;AAAA,MACrC;AAMA,MAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAa,CAAA,IAAK,EAAC;AAC9F,MAAA,MAAM,cAAc,cAAA,CAAe,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,YAAY,CAAA;AACtE,MAAA,gBAAA,CAAiB,IAAA,CAAK,GAAG,WAAW,CAAA;AAIpC,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,GAAA,EAAI;AACjC,MAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,MAAA,MAAA,CAAO,QAAQ,OAAO,CAAA;AACtB,MAAA,MAAA,CAAO,SAAS,OAAA,IAAU;AAE1B,MAAA,UAAA,EAAA;AAAA,IACJ;AAIA,IAAA,OAAO,gBAAA;AAAA,EACX;AACJ;;;ACxCO,IAAM,oBAAN,MAAiD;AAAA,EACnC,GAAA;AAAA,EAEjB,YAAY,EAAA,EAAY;AACpB,IAAA,IAAA,CAAK,GAAA,GAAM,EAAA;AAAA,EACf;AAAA,EAEA,IAAI,EAAA,GAAa;AACb,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EAChB;AAAA,EAEA,IAAI,GAAG,MAAA,EAAgB;AACnB,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACxD;AAAA,EAEA,IAAI,IAAA,GAAe;AACf,IAAA,OAAO,eAAA;AAAA,EACX;AAAA,EAEA,IAAI,KAAK,MAAA,EAAgB;AACrB,IAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,EAC1D;AAAA,EAEA,OAAA,CAAQ,OAAe,OAAA,EAA2C;AAC9D,IAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AACxB,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,KAAA,EAAO;AAC5B,MAAA,OAAO,EAAC;AAAA,IACZ;AAGA,IAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,KAAA,KAAU,CAAA,EAAG;AAC3B,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,OAAO,CAAC,IAAI,kBAAA,EAAoB,CAAA;AAAA,EACpC;AACJ,CAAA;AClBO,IAAM,yBAAN,MAAuD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW5D,YACmB,OAAA,EACA,KAAA,EACA,QAAA,EACA,UAAA,EACA,YACA,KAAA,EACjB;AANiB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAChB;AAAA,EANgB,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EAhBV,IAAA,GAAO,oBAAA;AAAA,EAmBhB,GAAG,OAAA,EAA4C;AAC7C,IAAA,MAAM,GAAA,GAAM,QAAQ,KAAA,CAAM,WAAA;AAE1B,IAAA,MAAM,KAAA,GAA2B;AAAA,MAC/B,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,GAAG,IAAA,CAAK;AAAA,KACV;AAEA,IAAA,MAAM,MAAA,GAAkB;AAAA,MACtB,MAAMd,sBAAAA,CAAW,MAAA;AAAA,MACjB,OAAO,IAAA,CAAK,OAAA;AAAA,MACZ,KAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,MAAM,MAAA,GAAS,IAAIe,2BAAA,CAAgB;AAAA,MACjC,UAAA,EAAY,QAAA;AAAA,MACZ,QAAA,EAAU,IAAI,QAAA,CAAS,GAAA,CAAI,SAAQ,EAAG,GAAA,CAAI,SAAS,CAAA;AAAA,MACnD,gBAAgB,IAAA,CAAK,QAAA;AAAA,MACrB,UAAA,EAAY,IAAA,CAAK,UAAA,IAAc,OAAA,CAAQ,KAAA,CAAM,KAAA;AAAA,MAC7C,OAAA,EAAS,CAAC,MAAM;AAAA,KACjB,CAAA;AAED,IAAA,OAAA,CAAQ,UAAU,MAAM,CAAA;AACxB,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;ACnDO,IAAM,mBAAN,MAAkD;AAAA,EAMrD,WAAA,CACqB,QAAA,EACjB,aAAA,GAAgB,EAAA,EAClB;AAFmB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAGjB,IAAA,IAAA,CAAK,cAAA,GAAiB,aAAA;AAEtB,IAAA,IAAA,CAAK,iBAAiB,aAAA,CAAc,EAAA,CAAG,SAAS,KAAA,EAAO,QAAA,CAAS,MAAM,WAAW,CAAA;AAAA,EACrF;AAAA,EANqB,QAAA;AAAA,EANb,YAA8B,EAAC;AAAA,EAC/B,UAAA,GAAa,CAAA;AAAA,EACJ,cAAA;AAAA,EACA,cAAA;AAAA;AAAA,EAajB,IAAI,MAAA,GAAS;AAAE,IAAA,OAAO,KAAK,QAAA,CAAS,MAAA;AAAA,EAAQ;AAAA,EAC5C,IAAI,QAAA,GAAW;AAAE,IAAA,OAAO,KAAK,QAAA,CAAS,QAAA;AAAA,EAAU;AAAA,EAChD,IAAI,KAAA,GAAQ;AAAE,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA;AAAA,EAAO;AAAA,EAC1C,IAAI,OAAA,GAAU;AAAE,IAAA,OAAO,KAAK,QAAA,CAAS,OAAA;AAAA,EAAS;AAAA,EAC9C,IAAI,GAAA,GAAM;AAAE,IAAA,OAAO,KAAK,QAAA,CAAS,GAAA;AAAA,EAAK;AAAA,EACtC,IAAI,MAAA,GAAS;AAAE,IAAA,OAAO,KAAK,QAAA,CAAS,MAAA;AAAA,EAAQ;AAAA,EAC5C,IAAI,gBAAA,GAAmB;AAAE,IAAA,OAAO,KAAK,QAAA,CAAS,gBAAA;AAAA,EAAkB;AAAA;AAAA,EAGhE,IAAI,KAAA,GAAQ;AAAE,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EAAgB;AAAA,EAC1C,IAAI,WAAA,GAAc;AAAE,IAAA,OAAO,KAAK,QAAA,CAAS,WAAA;AAAA,EAAa;AAAA,EAEtD,UAAU,MAAA,EAAgC;AACtC,IAAA,IAAA,CAAK,QAAA,CAAS,UAAU,MAAM,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAG,MAAA,EAA8B;AAC7B,IAAA,IAAA,CAAK,SAAA,CAAU,QAAQ,MAAM,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,EAAiC;AACnC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,GAAG,OAAO,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAA,EAAqB;AACxB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,OAAO,IAAI,CAAA;AAClD,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AAGpB,MAAA,MAAM,MAAA,GAAU,YAAY,KAAA,IAAS,OAAO,MAAM,MAAA,KAAW,QAAA,GACvD,MAAM,MAAA,GACN,WAAA;AACN,MAAA,MAAM,eAAe,IAAI,sBAAA;AAAA,QACrB,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,CAAA,QAAA,EAAM,QAAQ,MAAM,CAAA,UAAA,CAAA;AAAA,QACxC,cAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAK,KAAA,CAAM,KAAA;AAAA,QACX,EAAE,SAAA,EAAW,KAAA,CAAM,IAAA,EAAM,WAAA,EAAa,QAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA;AAAE,OACnE;AACA,MAAA,IAAA,CAAK,KAAA,CAAM,CAAC,YAAA,EAAc,GAAG,OAAO,CAAC,CAAA;AAAA,IACzC,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IACtB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,QAAQ,aAAA,EAAqC;AACzC,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,aAAa,CAAA;AAEjC,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,cAAA,EAAgB;AACxC,QAAA,MAAM,QAAA,GAAW,CAAA,2CAAA,EAA8C,IAAA,CAAK,cAAc,CAAA,qCAAA,CAAA;AAClF,QAAA,OAAA,CAAQ,MAAM,QAAQ,CAAA;AACtB,QAAA,MAAM,IAAI,MAAM,QAAQ,CAAA;AAAA,MAC5B;AAGA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,KAAA,EAAM;AACpC,MAAA,IAAA,CAAK,UAAA,EAAA;AAGL,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,EAAA,CAAG,IAAI,CAAA;AAInC,MAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AACzC,QAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,GAAG,YAAY,CAAA;AAAA,MAC1C;AAAA,IACJ;AAAA,EACJ;AACJ;ACjGO,IAAM,gBAAN,MAAoB;AAAA,EACf,oBAAwC,EAAC;AAAA,EACzC,gBAAA,uBAA4C,GAAA,EAAI;AAAA,EAChD,gBAAA,GAA4C,IAAA;AAAA;AAAA,EAE5C,mBAAA,GAAsB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOtB,iBAAqC,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtC,MAAA,GAA+B,IAAA;AAAA,EAC/B,MAAA,GAA+B,IAAA;AAAA,EAC/B,OAAA,GAAmC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3C,OAAO,IAAA,EAAsF;AACzF,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,KAAA;AACnB,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,KAAA;AACnB,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA;AAAA,EACxB;AAAA,EAEQ,aAAA,GAA+B;AACnC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AACd,MAAA,MAAM,IAAI,MAAM,kFAA6E,CAAA;AAAA,IACjG;AACA,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,IAAI,MAAA,EAAgC;AAChC,IAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,IAAA,CAAK,gBAAA,CAAiB,SAAS,CAAA,EAAG;AACpE,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,YAAY,IAAA,CAAK,gBAAA,GACjB,KAAK,gBAAA,CAAiB,GAAA,CAAI,MAAM,CAAA,GAChC,MAAA;AAEN,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,SAAS,CAAA;AAErC,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,gBAAA,EAAkB;AAC1C,MAAA,IAAI;AACA,QAAA,QAAA,CAAS,SAAS,CAAA;AAAA,MACtB,SAAS,GAAA,EAAK;AACV,QAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,GAAG,CAAA;AAAA,MACxD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU,QAAA,EAAuC;AAC7C,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAElC,IAAA,MAAM,QAAA,GAAW,CAAC,GAAG,IAAA,CAAK,iBAAiB,CAAA;AAC3C,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACrB,MAAA,UAAA,CAAW,MAAM;AACb,QAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA,EAAG;AACrC,UAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC3B,YAAA,QAAA,CAAS,MAAM,CAAA;AAAA,UACnB;AAAA,QACJ;AAAA,MACJ,GAAG,CAAC,CAAA;AAAA,IACR;AAEA,IAAA,OAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,QAAQ,CAAA;AAAA,EACtD;AAAA;AAAA,EAGA,MAAA,GAA6B;AACzB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,iBAAiB,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,YAAA,GAAwB;AACpB,IAAA,OAAO,IAAA,CAAK,iBAAiB,IAAA,GAAO,CAAA;AAAA,EACxC;AAAA,EACA,mBAAmB,MAAA,EAAgC;AAC/C,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AAGxB,IAAA,MAAA,CAAO,qBAAqB,CAAC,OAAA,KAAY,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAC,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAA,GAAwC;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,EAAkB,OAAO,EAAC;AAKpC,IAAA,IAAI,IAAA,CAAK,mBAAA,EAAqB,OAAO,EAAC;AACtC,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAE3B,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAS;AAItD,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,iBAAiB,IAAA,CAAK,cAAA;AAEjE,IAAA,KAAA,MAAW,UAAU,MAAA,EAAQ;AACzB,MAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,MAAM,CAAA;AAClC,MAAA,KAAA,MAAW,QAAA,IAAY,KAAK,gBAAA,EAAkB;AAC1C,QAAA,IAAI;AACA,UAAA,QAAA,CAAS,MAAM,CAAA;AAAA,QACnB,SAAS,GAAA,EAAK;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,GAAG,CAAA;AAAA,QACjE;AAAA,MACJ;AAAA,IACJ;AAIA,IAAA,IAAA,CAAK,iBAAiB,EAAC;AAEvB,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,kBAAkB,OAAA,EAAmC;AACzD,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AACtB,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC1B,MAAA,KAAA,MAAW,QAAA,IAAY,KAAK,gBAAA,EAAkB;AAC1C,QAAA,IAAI;AACA,UAAA,QAAA,CAAS,MAAM,CAAA;AAAA,QACnB,SAAS,GAAA,EAAK;AACV,UAAA,OAAA,CAAQ,KAAA,CAAM,kDAAkD,GAAG,CAAA;AAAA,QACvE;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGA,gBAAA,GAAuC;AACnC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,cAAc,CAAA;AAAA,EAClC;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAA,CAAK,oBAAoB,EAAC;AAC1B,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAC3B,IAAA,IAAA,CAAK,iBAAiB,EAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QAAA,GAAiB;AACb,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACf,MAAA,MAAM,IAAI,MAAM,8EAAyE,CAAA;AAAA,IAC7F;AACA,IAAA,MAAM,SAAS,IAAA,CAAK,OAAA;AACpB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,EAAc,CAAE,WAAA;AAEjC,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,UAAA,EAAY;AAClC,MAAA,MAAM,OAAA,GAAU,OAAO,MAAA,CAAO,SAAA;AAAA,QAC1B,KAAK,IAAA,CAAK,WAAA;AAAA,QACV,IAAA,CAAK,KAAK,SAAA,GAAY;AAAA,OAC1B;AAEA,MAAA,MAAM,UAAUd,2BAAAA,CAAgB,IAAA,CAAK,IAAA,CAAK,OAAA,EAAgB,KAAK,EAAE,CAAA;AACjE,MAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,QACR,MAAMD,sBAAAA,CAAW,KAAA;AAAA,QACjB,OAAO,OAAA,IAAW,WAAA;AAAA,QAClB,KAAA,EAAO,OAAA;AAAA,QACP,MAAA,EAAQ,SAAA;AAAA,QACR,SAAA,EAAW;AAAA,OACd,CAAA;AAKD,MAAA,IAAI,YAAA,GAAe,CAAA;AACnB,MAAA,IAAI,WAAW,IAAA,CAAK,MAAA;AACpB,MAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,MAAA,OAAO,aAAa,MAAA,IAAa,CAAC,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG;AAClD,QAAA,IAAA,CAAK,IAAI,QAAQ,CAAA;AACjB,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AACpC,QAAA,IAAI,MAAA,EAAQ;AAAE,UAAA,YAAA,EAAA;AAAgB,UAAA,QAAA,GAAW,MAAA,CAAO,MAAA;AAAA,QAAQ,CAAA,MACnD;AAAA,MACT;AAEA,MAAA,IAAA,CAAK,GAAA,CAAI,IAAIe,2BAAAA,CAAgB;AAAA,QACzB,UAAA,EAAY,MAAA;AAAA,QACZ,QAAA,EAAU,IAAI,QAAA,CAAS,GAAA,CAAI,SAAQ,EAAG,GAAA,CAAI,SAAS,CAAA;AAAA,QACnD,cAAA,EAAgB,MAAA;AAAA,QAChB,mBAAmB,IAAA,CAAK,EAAA;AAAA,QACxB,UAAA,EAAY,YAAA;AAAA,QACZ;AAAA,OACH,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,KAAA,EAA4E;AAEvF,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAa,EAAG;AAE1B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,EAAc,CAAE,WAAA;AACjC,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AAIpB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,EAAQ,MAAA,IAAU,EAAC;AAU5C,IAAA,MAAM,KAAA,GAAqB;AAAA,MACvB,OAAO,KAAA,CAAM,IAAA;AAAA,MACb,QAAA,EAAU,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MAC7B,YAAY,KAAA,CAAM,KAAA;AAAA,MAClB,UAAA,EAAY,KAAA,CAAM,IAAA,KAAS,MAAA,GAAS,YAAA,GAAe;AAAA,KACvD;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACvB,MAAA,MAAM,cAAc,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,WAAA,CAAY,CAAC,CAAA,GAAI,MAAA;AAC9D,MAAA,IAAI,WAAA,EAAa,KAAA,CAAM,SAAA,GAAY,WAAA,CAAY,IAAI,QAAA,EAAS;AAAA,IAChE,CAAA,MAAO;AACH,MAAA,KAAA,CAAM,gBAAA,GAAmB,MAAM,gBAAA,IAAoB,QAAA;AAAA,IACvD;AAEA,IAAA,MAAM,MAAA,GAAkB;AAAA,MACpB,MAAMf,sBAAAA,CAAW,MAAA;AAAA,MACjB,OAAO,KAAA,CAAM,IAAA,KAAS,MAAA,GAChB,CAAA,MAAA,EAAS,MAAM,KAAA,IAAS,KAAA,CAAM,SAAA,IAAa,OAAO,KAAK,KAAA,CAAM,GAAA,CAAI,UAAS,CAAE,KAAA,CAAM,GAAG,CAAC,CAAC,CAAA,CAAA,CAAA,GACvF,CAAA,KAAA,EAAQ,MAAM,KAAA,IAAS,KAAA,CAAM,SAAA,IAAa,OAAO,KAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS,CAAE,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,SAAA,EAAY,KAAA,CAAM,oBAAoB,QAAQ,CAAA,CAAA;AAAA,MAC1I,KAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW;AAAA,KACf;AAEA,IAAA,IAAA,CAAK,GAAA,CAAI,IAAIe,2BAAAA,CAAgB;AAAA,MACzB,UAAA,EAAY,QAAA;AAAA,MACZ,QAAA,EAAU,IAAI,QAAA,CAAS,GAAA,CAAI,SAAQ,EAAG,GAAA,CAAI,SAAS,CAAA;AAAA,MACnD,cAAA,EAAgB,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MACnC,YAAY,KAAA,CAAM,KAAA;AAAA,MAClB,OAAA,EAASd,4BAAgB,KAAA,CAAM,KAAA,CAAM,IAAI,QAAA,EAAU,CAAA,CAAE,GAAA,CAAI,MAAM;AAAA,KAClE,CAAC,CAAA;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,2BAAA,CAA4B,OAAsB,UAAA,EAA0B;AACxE,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,cAAA,CAAe,eAAe,CAAA;AACvD,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,cAAA,CAAe,gBAAgB,CAAA;AAEzD,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAE7B,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,aAAA,EAAc,CAAE,YAAY,OAAA,EAAQ;AAE/D,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,eAAA,GAAkBA,2BAAAA,CAAgB,IAAA,CAAK,UAAA,CAAW,CAAC,EAAE,OAAA,EAAS,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,CAAA;AAIxF,MAAA,MAAM,eAAA,GAAkBA,2BAAAA,CAAgB,IAAA,CAAK,WAAA,CAAY,CAAC,GAAG,OAAA,EAAS,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,CAAA;AAK1F,MAAA,MAAM,UAAUA,2BAAAA,CAAgB,KAAA,CAAM,MAAM,GAAA,CAAI,QAAA,EAAU,CAAA,CACrD,GAAA,CAAI,GAAG,eAAA,CAAgB,SAAS,CAAA,CAChC,IAAI,GAAG,eAAA,CAAgB,SAAS,CAAA;AAErC,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,MAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,eAAA,EAAiB,SAAA,EAAW,SAAQ,IAAK,aAAA;AACvE,MAAA,MAAM,QAAA,GAAW,IAAI,QAAA,CAAS,eAAA,EAAiB,aAAa,CAAA;AAE5D,MAAA,IAAA,CAAK,GAAA,CAAI,IAAIc,2BAAAA,CAAgB;AAAA,QACzB,UAAA,EAAY,SAAA;AAAA,QACZ,kBAAkB,KAAA,CAAM,gBAAA;AAAA,QACxB,QAAA;AAAA,QACA,cAAA,EAAgB,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,QACnC,mBAAmB,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA,IAAK,KAAA,CAAM,YAAY,CAAC,CAAA;AAAA,QAC9D,UAAA,EAAY,UAAA;AAAA,QACZ;AAAA,OACH,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,KAAA,EAAqB;AAClC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,EAAc,CAAE,WAAA;AACjC,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,IAAA,MAAM,QAAA,GAAW,KAAA,EAAO,OAAA,EAAS,GAAA,CAAI,UAAS,IAAK,MAAA;AAEnD,IAAA,MAAM,OAAA,GAAUd,2BAAAA,CAAgB,KAAA,CAAM,QAAQ,EAAE,GAAA,CAAI;AAAA,MAChD,MAAMD,sBAAAA,CAAW,MAAA;AAAA,MACjB,KAAA,EAAO,CAAA,OAAA,EAAU,KAAA,CAAM,IAAI,CAAA,CAAA;AAAA,MAC3B,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,CAAM,MAAM,IAAA,EAAM,KAAA,CAAM,MAAM,QAAA,EAAS;AAAA,MACtD,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW;AAAA,KACd,CAAA;AAED,IAAA,IAAA,CAAK,GAAA,CAAI,IAAIe,2BAAAA,CAAgB;AAAA,MACzB,UAAA,EAAY,OAAA;AAAA,MACZ,QAAA,EAAU,IAAI,QAAA,CAAS,GAAA,CAAI,SAAQ,EAAG,GAAA,CAAI,SAAS,CAAA;AAAA,MACnD,cAAA,EAAgB,QAAA;AAAA,MAChB,UAAA,EAAY,OAAO,KAAA,IAAS,CAAA;AAAA,MAC5B;AAAA,KACH,CAAC,CAAA;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,KAAA,EAA4B;AAC1C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,aAAA,EAAc,CAAE,WAAA;AAGjC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,EAAQ,KAAA,IAAS,CAAA;AAEzC,IAAA,MAAM,OAAA,GAAUd,4BAAgB,KAAA,CAAM,KAAA,CAAM,IAAI,QAAA,EAAU,EAAE,GAAA,CAAI;AAAA,MAC5D,MAAMD,sBAAAA,CAAW,KAAA;AAAA,MACjB,KAAA,EAAO,CAAA,WAAA,EAAc,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,CAAY,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MAC5E,OAAO,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,IAAI,CAAA;AAAA,MAClD,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW;AAAA,KACd,CAAA;AAED,IAAA,IAAA,CAAK,GAAA,CAAI,IAAIe,2BAAAA,CAAgB;AAAA,MACzB,UAAA,EAAY,UAAA;AAAA,MACZ,QAAA,EAAU,IAAI,QAAA,CAAS,GAAA,CAAI,SAAQ,EAAG,GAAA,CAAI,SAAS,CAAA;AAAA,MACnD,cAAA,EAAgB,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MACnC,UAAA,EAAY,UAAA;AAAA,MACZ;AAAA,KACH,CAAC,CAAA;AAAA,EACN;AAAA;AAAA;AAAA;AAKJ;;;ACvZO,IAAM,mBAAN,MAAuB;AAAA,EACT,eAAA,uBAA0C,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW/D,iBAAiB,QAAA,EAAsC;AACnD,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,QAAQ,CAAA;AACjC,IAAA,OAAO,MAAM;AACT,MAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,QAAQ,CAAA;AAAA,IACxC,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,QAAA,EAA+B;AACrC,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,IAAA,KAAS,CAAA,EAAG;AACrC,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,eAAA,EAAiB;AACzC,MAAA,IAAI;AACA,QAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,MACrB,SAAS,GAAA,EAAK;AACV,QAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,GAAG,CAAA;AAAA,MACjE;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,QAAA,EAAkC;AAC/C,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAA,CAAY,MAAA,EAAkC,KAAA,EAAe,SAAA,EAAuB;AAChF,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,IAAA,KAAS,CAAA,EAAG;AACrC,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,QAAA,GAA0B;AAAA,MAC5B,IAAA,EAAM,SAAA;AAAA,MACN,MAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACJ;AACA,IAAA,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAA,GAAgB;AACZ,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,EAC/B;AAAA;AAAA,EAGA,IAAI,kBAAA,GAA6B;AAAE,IAAA,OAAO,KAAK,eAAA,CAAgB,IAAA;AAAA,EAAM;AACzE;;;ACxFA,IAAM,oBAAN,MAAwB;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,WAA8B,EAAC;AAAA,EAC/B,WAAA,GAAc,GAAA;AAAA;AAAA,EAGL,MAAA,GAAS;AAAA,IACtB,IAAA,EAAM,mCAAA;AAAA;AAAA,IACN,GAAA,EAAK,mCAAA;AAAA;AAAA,IACL,IAAA,EAAM,mCAAA;AAAA;AAAA,IACN,KAAA,EAAO,mCAAA;AAAA;AAAA,IACP,MAAA,EAAQ,mCAAA;AAAA;AAAA,IACR,MAAA,EAAQ,qCAAA;AAAA;AAAA,IACR,MAAA,EAAQ;AAAA;AAAA,GACZ;AAAA,EAEA,WAAA,GAAc;AAEV,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,MAAA,IAAA,CAAK,QAAA,GAAW,CAAC,CAAE,MAAA,CAAe,aAAA;AAAA,IACtC;AAAA,EACJ;AAAA,EAEA,IAAI,OAAA,GAAmB;AACnB,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAChB;AAAA,EAEA,MAAA,GAAe;AACX,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,OAAA,CAAQ,GAAA,CAAI,4CAAqC,mCAAmC,CAAA;AAAA,EACxF;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,OAAA,CAAQ,GAAA,CAAI,mCAAmC,gBAAgB,CAAA;AAAA,EACnE;AAAA,EAEA,UAAA,GAAgC;AAC5B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC5B;AAAA,EAEA,YAAA,GAAqB;AACjB,IAAA,IAAA,CAAK,WAAW,EAAC;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAA,CAAQ,OAAsB,SAAA,EAA0B;AACpD,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAEpB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAA;AAC7C,IAAA,MAAM,WAAA,GAAc,MAAM,YAAA,IAAe,CAAE,IAAI,CAAA,GAAA,KAAO,GAAA,CAAI,GAAG,CAAA,IAAK,EAAC;AAEnE,IAAA,OAAA,CAAQ,cAAA;AAAA,MACJ,CAAA,qBAAA,EAAmB,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,aAAa,OAAO,CAAA,IAAA,EAAO,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,MACnG,KAAK,MAAA,CAAO,IAAA;AAAA,MACZ,mCAAA;AAAA,MACA;AAAA,KACJ;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AACxC,IAAA,IAAI,SAAA,EAAW,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,SAAS,CAAA;AAC/C,IAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,EAAe,KAAA,CAAM,SAAS,CAAA;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,cAAc,SAAS,CAAA;AACnC,IAAA,IAAI,YAAY,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,iBAAiB,WAAW,CAAA;AACpE,IAAA,OAAA,CAAQ,QAAA,EAAS;AAEjB,IAAA,IAAA,CAAK,aAAa,MAAA,EAAQ,MAAA,EAAQ,CAAA,KAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI;AAAA,MACrD,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MACxB,SAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAW,KAAA,CAAM;AAAA,KACpB,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,OAAsB,MAAA,EAAuB;AAChD,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAEpB,IAAA,OAAA,CAAQ,GAAA;AAAA,MACJ,CAAA,qBAAA,EAAmB,MAAM,KAAA,IAAS,KAAA,CAAM,aAAa,OAAO,CAAA,IAAA,EAAO,MAAM,GAAA,CAAI,QAAA,GAAW,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,EAAK,MAAM,MAAM,EAAE,CAAA,CAAA;AAAA,MACnI,KAAK,MAAA,CAAO,GAAA;AAAA,MACZ,mCAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,IAAA,CAAK,aAAa,MAAA,EAAQ,KAAA,EAAO,CAAA,IAAA,EAAO,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI;AAAA,MACnD,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MACxB;AAAA,KACH,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,OAAsB,OAAA,EAAiC;AAC3D,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAEpB,IAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAA,IAAQ,CAAA,CAAE,WAAA,EAAa,IAAA,IAAQ,QAAQ,CAAA;AAE9E,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAEtB,MAAA;AAAA,IACJ;AAEA,IAAA,OAAA,CAAQ,cAAA;AAAA,MACJ,wBAAmB,KAAA,CAAM,KAAA,IAAS,OAAO,CAAA,UAAA,EAAQ,QAAQ,MAAM,CAAA,UAAA,CAAA;AAAA,MAC/D,KAAK,MAAA,CAAO,IAAA;AAAA,MACZ,mCAAA;AAAA,MACA;AAAA,KACJ;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAU,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAY,WAAW,CAAA;AACnC,IAAA,OAAA,CAAQ,QAAA,EAAS;AAEjB,IAAA,IAAA,CAAK,aAAa,MAAA,EAAQ,MAAA,EAAQ,CAAA,KAAA,EAAQ,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI;AAAA,MACrD,GAAA,EAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MACxB,OAAA,EAAS;AAAA,KACZ,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,CAAS,OAAe,OAAA,EAAiC;AACrD,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAGpB,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,IAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAA,IAAQ,CAAA,CAAE,WAAA,EAAa,IAAA,IAAQ,QAAQ,CAAA;AAE9E,IAAA,OAAA,CAAQ,cAAA;AAAA,MACJ,CAAA,sBAAA,EAAoB,KAAA,CAAM,IAAI,CAAA,UAAA,EAAQ,QAAQ,MAAM,CAAA,UAAA,CAAA;AAAA,MACpD,KAAK,MAAA,CAAO,KAAA;AAAA,MACZ,mCAAA;AAAA,MACA;AAAA,KACJ;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,aAAA,EAAe,KAAA,CAAM,IAAI,CAAA;AACrC,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAY,WAAW,CAAA;AACnC,IAAA,OAAA,CAAQ,QAAA,EAAS;AAEjB,IAAA,IAAA,CAAK,aAAa,MAAA,EAAQ,OAAA,EAAS,CAAA,MAAA,EAAS,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI;AAAA,MACtD,WAAW,KAAA,CAAM,IAAA;AAAA,MACjB,WAAW,KAAA,CAAM,IAAA;AAAA,MACjB,OAAA,EAAS;AAAA,KACZ,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,QAAA,EAAkB,UAAA,EAAoB,KAAA,EAAsB;AACxE,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAGpB,IAAA,IAAI,YAAA,GAAwB,KAAA;AAC5B,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAE7C,MAAA,YAAA,GAAe,IAAA,CAAK,gBAAgB,KAAgC,CAAA;AAAA,IACxE;AAEA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACJ,6BAAsB,UAAU,CAAA,OAAA,EAAU,SAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,MAC9D,KAAK,MAAA,CAAO,MAAA;AAAA,MACZ,mCAAA;AAAA,MACA,qCAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,QAAA,EAAU,CAAA,OAAA,EAAU,UAAU,CAAA,CAAA,EAAI;AAAA,MACzD,QAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACV,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,QAAwB,KAAA,EAAqB;AACnD,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAEpB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,aAAa,IAAA,IAAQ,QAAA;AAE9D,IAAA,OAAA,CAAQ,GAAA;AAAA,MACJ,CAAA,OAAA,EAAU,MAAM,CAAA,SAAA,EAAO,UAAU,CAAA,CAAA;AAAA,MACjC,KAAK,MAAA,CAAO,MAAA;AAAA,MACZ;AAAA,KACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAiB,KAAA,EAAgC;AAErD,IAAA,MAAM,YAAa,KAAA,CAAc,SAAA;AACjC,IAAA,IAAI,CAAC,aAAa,CAAC,KAAA,CAAM,QAAQ,SAAS,CAAA,SAAU,EAAC;AACrD,IAAA,OAAO,UAAU,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,QAAQ,UAAU,CAAA;AAAA,EAC/D;AAAA,EAEQ,gBAAgB,GAAA,EAAuD;AAC3E,IAAA,MAAM,UAAmC,EAAC;AAC1C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC1C,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACpB,QAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,CAAA,CAAA,EAAI,GAAA,CAAI,MAAM,CAAA,OAAA,CAAA;AAAA,MACjC,CAAA,MAAA,IAAW,OAAO,GAAA,KAAQ,QAAA,IAAY,QAAQ,IAAA,EAAM;AAChD,QAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,OAAA;AAAA,MACnB,CAAA,MAAO;AACH,QAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA;AAAA,MACnB;AAAA,IACJ;AACA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEQ,YAAA,CAAa,KAAA,EAAiB,QAAA,EAAkB,OAAA,EAAiB,IAAA,EAAsC;AAC3G,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK;AAAA,MACf,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,KAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACH,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,IAAA,CAAK,WAAA,EAAa;AACzC,MAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,CAAC,KAAK,WAAW,CAAA;AAAA,IACzD;AAAA,EACJ;AACJ,CAAA;AAGO,IAAM,aAAA,GAAgB,IAAI,iBAAA;AAGjC,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,EAAC,OAAe,aAAA,GAAgB,aAAA;AACpC;;;ACzQO,IAAM,kBAAN,MAAgD;AAAA,EAGnD,WAAA,CAA4B,KAAA,EAAuC,OAAA,GAAiC,EAAC,EAAG;AAA5E,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAuC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAuC;AAAA,EAA9E,KAAA;AAAA,EAAuC,OAAA;AAAA,EAF3D,KAAA,GAAQ,YAAA;AAAA,EAIhB,IAAI,IAAA,GAAe;AACf,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,IAAI,KAAK,MAAA,EAAgB;AACrB,IAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,EAC1D;AAAA,EAEA,GAAG,OAAA,EAA4C;AAC3C,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAChB,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,IAAI;AAMA,MAAA,IAAI,SAAA,GAA8B,KAAK,OAAA,CAAQ,SAAA;AAC/C,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,KAAA;AAE5C,MAAA,IAAI,CAAC,SAAA,IAAa,KAAA,EAAO,SAAA,EAAW;AAGhC,QAAA,SAAA,GAAY,KAAA,CAAM,WAAA;AAAA,MACtB;AAEA,MAAA,MAAM,SAAA,GAAmC,SAAA,GACnC,EAAE,GAAG,IAAA,CAAK,OAAA,EAAS,SAAA,EAAU,GAC7B,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AAExB,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA;AACpB,MAAA,IAAI,SAAA,EAAW;AACX,QAAA,MAAA,CAAO,kBAAkB,EAAE,GAAI,OAAO,eAAA,IAAmB,IAAK,SAAA,EAAU;AAAA,MAC5E;AAGA,MAAA,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAG7B,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,SAAS,SAAS,CAAA;AAGxD,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,CAAA,GAC1C,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,GAAA,CAAI,UAAS,GACtC,KAAA,CAAA;AACN,MAAA,aAAA,CAAc,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,SAAS,CAAA;AAE3C,MAAA,OAAO,YAAA;AAAA,IAEX,SAAS,KAAA,EAAO;AAEZ,MAAA,MAAM,mBAAA,GAAsB,OAAA;AAC5B,MAAA,IAAI,OAAO,mBAAA,CAAoB,QAAA,KAAa,UAAA,EAAY;AACpD,QAAA,mBAAA,CAAoB,SAAS,KAAK,CAAA;AAAA,MACtC;AACA,MAAA,OAAO,EAAC;AAAA,IACZ;AAAA,EACJ;AACJ;;;AC7DO,IAAM,iBAAN,MAA+C;AAAA,EAGlD,WAAA,CAA6B,OAAA,GAAiC,EAAC,EAAG;AAArC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAuC;AAAA,EAAvC,OAAA;AAAA,EAFpB,IAAA,GAAO,WAAA;AAAA,EAIhB,GAAG,OAAA,EAA4C;AAC3C,IAAA,MAAM,OAAA,GAAU,QAAQ,KAAA,CAAM,OAAA;AAC9B,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,OAAO,EAAC;AAAA,IACZ;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,SAAA,IAAa,QAAQ,KAAA,CAAM,WAAA;AAC1D,IAAA,MAAM,gBAAA,GAA0C,EAAE,GAAG,IAAA,CAAK,SAAS,SAAA,EAAU;AAG7E,IAAA,IAAI,QAAQ,eAAA,EAAiB;AACzB,MAAA,OAAA,CAAQ,gBAAgB,SAAA,GAAY,SAAA;AAAA,IACxC;AAOA,IAAA,IAAI,CAAC,OAAA,CAAQ,UAAA,IAAc,OAAO,OAAA,CAAQ,iBAAiB,UAAA,EAAY;AACnE,MAAA,OAAA,CAAQ,aAAa,YAAY,CAAA;AACjC,MAAA,aAAA,CAAc,MAAA,CAAO,SAAS,mDAAmD,CAAA;AAAA,IACrF;AAGA,IAAA,MAAM,iBAAiB,OAAA,CAAQ,OAAA,CAAQ,OAAA,EAAS,gBAAgB,KAAK,EAAC;AAGtE,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,GAAA,EAAI;AACjC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACT,MAAA,OAAO,EAAC;AAAA,IACZ;AAGA,IAAA,MAAA,CAAO,QAAQ,OAAO,CAAA;AACtB,IAAA,MAAA,CAAO,SAAS,OAAA,IAAU;AAG1B,IAAA,IAAK,MAAA,CAAe,qBAAqB,YAAA,EAAc;AACnD,MAAA,aAAA,CAAc,MAAA,CAAO,MAAA,EAAS,MAAA,CAAe,gBAAgB,CAAA;AAAA,IACjE;AAUA,IAAA,MAAM,MAAA,GAAS,QAAQ,KAAA,CAAM,OAAA;AAK7B,IAAA,OAAO,MAAA,GACD,CAAC,GAAG,cAAA,EAAgB,IAAI,WAAW,gBAAA,EAAkB,OAAA,CAAQ,WAAW,CAAC,CAAA,GACzE,cAAA;AAAA,EACV;AACJ;;;AC7CO,IAAM,gBAAN,MAA8C;AAAA,EAwCjD,WAAA,CACoB,QAChB,QAAA,EACA,YAAA,EACA,UAA+B,EAAC,EAChC,MAAoB,YAAA,EACtB;AALkB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAOhB,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,uBAAA,EAAyB,GAAG,OAAA,EAAQ;AAExD,IAAA,IAAA,CAAK,QAAQ,YAAA,CAAa,KAAA;AAC1B,IAAA,IAAA,CAAK,QAAQ,YAAA,CAAa,KAAA;AAC1B,IAAA,IAAA,CAAK,WAAW,YAAA,CAAa,QAAA;AAC7B,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AAGZ,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,MAAA,EAAQ,IAAI,gBAAA,CAAiB,sBAAsB,CAAA,EAAG,SAAA,EAAW,EAAE,KAAA,EAAO,UAAU,CAAA;AAGpI,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,OAAA,EAAS,IAAI,iBAAA,CAAkB,uBAAuB,CAAA,EAAG,SAAA,EAAW,EAAE,KAAA,EAAO,UAAU,CAAA;AAExI,IAAA,IAAA,CAAK,GAAA,GAAM,QAAA;AAIX,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAKjF,IAAA,IAAA,CAAK,uBAAA,GAA0B,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,KAAA,KAAU;AAC3D,MAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACtB,QAAA,IAAA,CAAK,OAAA,CAAQ,2BAAA,CAA4B,KAAA,CAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AAAA,MACrE;AAGA,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,SAAS,KAAA,EAAO;AAC/C,QAAA,IAAA,CAAK,OAAA,CAAQ,eAAe,KAAK,CAAA;AAAA,MACrC;AAGA,MAAA,MAAM,QAAA,GAA0B;AAAA,QAC5B,IAAA,EAAM,KAAA,CAAM,IAAA,KAAS,SAAA,GAAY,YAAY,KAAA,CAAM,IAAA;AAAA,QACnD,QAAQ,KAAA,CAAM,IAAA,KAAS,SAAA,GAAY,KAAA,CAAM,SAAS,KAAA,CAAM,MAAA;AAAA,QACxD,aAAA,EAAe,KAAA,CAAM,IAAA,KAAS,SAAA,GAAY,MAAM,KAAA,GAAQ,MAAA;AAAA,QACxD,OAAO,KAAA,CAAM,IAAA,KAAS,YAAY,KAAA,CAAM,MAAA,CAAO,SAAS,KAAA,CAAM,KAAA;AAAA,QAC9D,SAAA,EAAW,KAAK,KAAA,CAAM;AAAA,OAC1B;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,UAAU,QAAQ,CAAA;AAAA,IACtC,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AAGjB,IAAA,IAAA,CAAK,QAAQ,QAAA,EAAS;AAAA,EAC1B;AAAA,EAvDoB,MAAA;AAAA,EAvCJ,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAA;AAAA,EAEA,SAAyB,EAAC;AAAA,EAC1B,OAAA;AAAA,EACT,gBAAA;AAAA;AAAA;AAAA,EAIU,OAAA,GAAU,IAAI,aAAA,EAAc;AAAA;AAAA;AAAA,EAI5B,UAAA,GAAa,IAAI,gBAAA,EAAiB;AAAA;AAAA,EAG3C,cAAA,GAA0C,IAAA;AAAA,EACjC,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,uBAAA,GAA+C,IAAA;AAAA;AAAA,EAG/C,iBAAA,GAAyC,IAAA;AAAA,EAEjD,IAAW,WAAA,GAA4B;AACnC,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA;AAAA,EAGQ,kBAAA,GAA0C,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiE3C,GAAG,MAAA,EAA8B;AACpC,IAAA,IAAI,KAAK,cAAA,EAAgB;AACrB,MAAA,IAAA,CAAK,cAAA,CAAe,GAAG,MAAM,CAAA;AAC7B,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,iBAAiB,IAAI,gBAAA,CAAiB,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAkB,EAAE,CAAA;AAClF,IAAA,IAAI;AACA,MAAA,IAAA,CAAK,cAAA,CAAe,QAAQ,MAAM,CAAA;AAAA,IACtC,CAAA,SAAE;AACE,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAUtB,MAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,IAC7B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAA,GAAuC;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,CAAM,MAAA;AAC1B,IAAA,OAAO;AAAA,MACH,IAAA,EAAM,SAAA;AAAA,MACN,MAAA;AAAA,MACA,OAAO,MAAA,CAAO,MAAA;AAAA,MACd,SAAA,EAAW,KAAK,KAAA,CAAM;AAAA,KAC1B;AAAA,EACJ;AAAA,EAEQ,mBAAA,GAA4B;AAIhC,IAAA,IAAA,CAAK,UAAA,CAAW,WAAA;AAAA,MACZ,KAAK,KAAA,CAAM,MAAA;AAAA,MACX,KAAK,KAAA,CAAM,KAAA;AAAA,MACX,KAAK,KAAA,CAAM;AAAA,KACf;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,MAAM,OAAA,EAAiC;AAC1C,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,IAAI,KAAK,cAAA,EAAgB;AACrB,MAAA,IAAA,CAAK,cAAA,CAAe,MAAM,OAAO,CAAA;AACjC,MAAA;AAAA,IACJ;AAGA,IAAA,IAAA,CAAK,EAAA,CAAG;AAAA,MACJ,IAAA,EAAM,iBAAA;AAAA,MACN,IAAI,MAAM;AAAA,KACb,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,OAAO,KAAA,EAAqB;AAC/B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,OAAO,IAAI,CAAA;AAIlD,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC7C,MAAA,IAAA,CAAK,OAAA,CAAQ,iBAAiB,KAAK,CAAA;AAAA,IACvC;AAEA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAE1B,IAAA,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,kBAAkB,QAAA,EAAuC;AAC5D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,QAAQ,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKO,mBAAA,GAA0C;AAC7C,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,EAAO;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKO,gBAAA,GAAuC;AAC1C,IAAA,OAAO,IAAA,CAAK,QAAQ,gBAAA,EAAiB;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,UAAU,MAAA,EAAgC;AAC7C,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,EAC3B;AAAA,EAEO,mBAAmB,MAAA,EAAgC;AACtD,IAAA,IAAA,CAAK,OAAA,CAAQ,mBAAmB,MAAM,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKO,iBAAA,GAAwC;AAC3C,IAAA,OAAO,IAAA,CAAK,QAAQ,iBAAA,EAAkB;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,iBAAiB,QAAA,EAAsC;AAC1D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,QAAQ,CAAA;AAavD,IAAA,UAAA,CAAW,MAAM;AAGb,MAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,QAAQ,CAAA,EAAG;AACjD,MAAA,IAAI;AACA,QAAA,QAAA,CAAS,IAAA,CAAK,uBAAuB,CAAA;AAAA,MACzC,SAAS,GAAA,EAAK;AACV,QAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,GAAG,CAAA;AAAA,MAC7D;AAAA,IACJ,GAAG,CAAC,CAAA;AAEJ,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKO,OAAA,GAAgB;AAEnB,IAAA,IAAA,CAAK,MAAM,IAAA,EAAK;AAGhB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG;AACzB,MAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,OAAA;AACzB,MAAA,IAAI,KAAA,EAAO;AACP,QAAA,IAAI;AACA,UAAA,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,QACtB,SAAS,EAAA,EAAI;AAAA,QAEb;AACA,QAAA,IAAA,CAAK,MAAM,GAAA,EAAI;AACf,QAAA,IAAI;AACA,UAAA,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,QACtB,SAAS,EAAA,EAAI;AAAA,QAEb;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,MAAM,GAAA,EAAI;AAAA,MACnB;AAAA,IACJ;AAGA,IAAA,IAAI,KAAK,iBAAA,EAAmB;AACxB,MAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,KAAK,kBAAA,EAAoB;AACzB,MAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC9B;AAGA,IAAA,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAGrB,IAAA,IAAI,KAAK,uBAAA,EAAyB;AAC9B,MAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,MAAA,IAAA,CAAK,uBAAA,GAA0B,IAAA;AAAA,IACnC;AAIA,IAAA,IAAA,CAAK,WAAW,OAAA,EAAQ;AAGxB,IAAA,IAAA,CAAK,SAAS,OAAA,EAAQ;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,SAAA,CAAU,OAA0D,SAAA,EAA6E;AACpJ,IAAA,MAAM,WAAA,GAAc,KAAK,KAAA,CAAM,OAAA;AAG/B,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,YAAA,GAAe,KAAA,EAAO,WAAW,CAAA;AAGrD,IAAA,IAAA,CAAK,OAAA,CAAQ,kBAAkB,KAAK,CAAA;AAGpC,IAAA,MAAM,eAAe,IAAA,CAAK,OAAA,CAAQ,SAAS,IAAA,GAAO,KAAA,EAAO,WAAW,CAAA,IAAK,KAAA;AAGzE,IAAA,IAAA,CAAK,EAAA,CAAG,IAAI,eAAA,CAAgB,YAAA,EAAc,SAAS,CAAC,CAAA;AAGpD,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,KAAA,GAAQ,mBAAA,EAAqB;AAAA,MAC9C,QAAA,EAAU,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MAC7B,SAAA,EAAW,WAAA,EAAa,GAAA,CAAI,QAAA;AAAS,KACxC,CAAA;AAGD,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,WAAA,GAAc,YAAA,EAAc,WAAW,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,SAAS,SAAA,EAA6E;AACzF,IAAA,MAAM,YAAA,GAAe,KAAK,KAAA,CAAM,OAAA;AAChC,IAAA,IAAI,CAAC,YAAA,EAAc;AACf,MAAA;AAAA,IACJ;AAGA,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,WAAA,GAAc,YAAY,CAAA;AAG9C,IAAA,IAAA,CAAK,EAAA,CAAG,IAAI,cAAA,CAAe,SAAS,CAAC,CAAA;AAGrC,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,OAAA,GAAU,YAAY,CAAA;AAG5C,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAO,iBAAA,GAAoB,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA;AAGnE,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,KAAA,GAAQ,kBAAA,EAAoB;AAAA,MAC7C,QAAA,EAAU,YAAA,CAAa,GAAA,CAAI,QAAA,EAAS;AAAA,MACpC,UAAA,EAAY,KAAK,KAAA,CAAM;AAAA,KAC1B,CAAA;AAGD,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,UAAA,GAAa,YAAY,CAAA;AAAA,EACjD;AACJ;ACzZO,IAAM,uBAAN,MAA0D;AAAA,EAI7D,WAAA,CACqB,OAAA,EACD,OAAA,EACA,IAAA,EACT,aAAiD,SAAA,EAC1D;AAJmB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACD,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACT,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAAA,EACR;AAAA,EAJkB,OAAA;AAAA,EACD,OAAA;AAAA,EACA,IAAA;AAAA,EACT,UAAA;AAAA,EAPJ,KAAaD,OAAAA,EAAO;AAAA,EACnB,iBAA2C,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAapD,KAAA,GAAiB;AACb,IAAA,OAAO,KAAK,GAAA,EAAI;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,aAAA,GAA6D;AAC7D,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EAChB;AAAA,EAEA,GAAA,GAAqB;AACjB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAO,IAAI,CAAA;AAAA,EACnC;AAAA,EAEA,IAAI,KAAA,EAAgB;AAChB,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAA,CACI,UACA,OAAA,EACU;AACV,IAAA,MAAM,iBAAiBA,OAAAA,EAAO;AAC9B,IAAA,MAAM,YAAA,GAAuC;AAAA,MACzC,EAAA,EAAI,cAAA;AAAA,MACJ,QAAA;AAAA,MACA,UAAU,IAAA,CAAK,EAAA;AAAA,MACf,SAAA,sBAAe,IAAA;AAAK,KACxB;AAEA,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,YAAY,CAAA;AAGrC,IAAA,IAAI,SAAS,SAAA,EAAW;AACpB,MAAA,MAAM,YAAA,GAAe,KAAK,GAAA,EAAI;AAC9B,MAAA,QAAA,CAAS,cAAc,MAAS,CAAA;AAAA,IACpC;AAGA,IAAA,OAAO,MAAM,IAAA,CAAK,WAAA,CAAY,cAAc,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,cAAA,EAA8B;AACtC,IAAA,MAAM,QAAQ,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,cAAc,CAAA;AACxE,IAAA,IAAI,SAAS,CAAA,EAAG;AAEZ,MAAA,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,IACvC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAA,GAA0B;AACtB,IAAA,OAAO,IAAA,CAAK,eAAe,MAAA,GAAS,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAA,CAAkB,UAAyB,QAAA,EAA+B;AAEtE,IAAA,KAAA,MAAW,YAAA,IAAgB,KAAK,cAAA,EAAgB;AAC5C,MAAA,IAAI;AACA,QAAA,YAAA,CAAa,QAAA,CAAS,UAAU,QAAQ,CAAA;AAAA,MAC5C,SAAS,KAAA,EAAO;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,KAAK,CAAA;AAAA,MACjE;AAAA,IACJ;AAAA,EACJ;AACJ;;;ACrGO,IAAM,gBAAN,MAA8C;AAAA;AAAA,EAEzC,cAAuC,EAAC;AAAA;AAAA,EAGhD,QAAA,CAAY,IAAA,EAAc,OAAA,EAAiB,YAAA,EAAkB,aAAiD,SAAA,EAAoC;AAC9I,IAAA,MAAM,MAAM,IAAI,oBAAA,CAAwB,IAAA,EAAM,OAAA,EAAS,MAAM,UAAU,CAAA;AACvE,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,EAAM,cAAc,CAAA;AAEjD,IAAA,OAAO,GAAA;AAAA,EACX;AAAA;AAAA,EAIA,IAAO,SAAA,EAAmD;AACtD,IAAA,MAAM,GAAA,GAAM,KAAK,WAAA,CAAY,IAAA,CAAK,OAAK,CAAA,CAAE,GAAA,CAAI,EAAA,KAAO,SAAA,CAAU,EAAE,CAAA;AAChE,IAAA,OAAQ,KAAK,IAAA,IAAc,MAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,GAAA,CAAO,WAAoC,KAAA,EAAgB;AACvD,IAAA,MAAM,GAAA,GAAM,KAAK,WAAA,CAAY,IAAA,CAAK,OAAK,CAAA,CAAE,GAAA,CAAI,EAAA,KAAO,SAAA,CAAU,EAAE,CAAA;AAChE,IAAA,IAAI,CAAC,GAAA,EAAK;AACN,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,SAAA,CAAU,EAAE,CAAA,CAAE,CAAA;AAAA,IAC/D;AACA,IAAA,MAAM,WAAW,GAAA,CAAI,IAAA;AACrB,IAAA,GAAA,CAAI,IAAA,GAAO,KAAA;AAGX,IAAA,IAAI,SAAA,CAAU,gBAAe,EAAG;AAC5B,MAAA,SAAA,CAAU,iBAAA,CAAkB,OAAO,QAAQ,CAAA;AAAA,IAC/C;AAAA,EACJ;AAAA;AAAA,EAGA,OAAO,QAAA,EAAoD;AAEvD,IAAA,OAAO,IAAA,CAAK,YACP,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,GAAG,CAAA,CACd,OAAO,CAAA,GAAA,KAAO;AACX,MAAA,IAAI,QAAA,CAAS,EAAA,KAAO,IAAA,IAAQ,QAAA,CAAS,EAAA,KAAO,UAAa,QAAA,CAAS,EAAA,KAAO,GAAA,CAAI,EAAA,EAAI,OAAO,KAAA;AACxF,MAAA,IAAI,QAAA,CAAS,OAAA,KAAY,IAAA,IAAQ,QAAA,CAAS,OAAA,KAAY,UAAa,QAAA,CAAS,OAAA,KAAY,GAAA,CAAI,OAAA,EAAS,OAAO,KAAA;AAC5G,MAAA,IAAI,QAAA,CAAS,IAAA,KAAS,IAAA,IAAQ,QAAA,CAAS,IAAA,KAAS,UAAa,QAAA,CAAS,IAAA,KAAS,GAAA,CAAI,IAAA,EAAM,OAAO,KAAA;AAChG,MAAA,IAAI,QAAA,CAAS,UAAA,KAAe,IAAA,IAAQ,QAAA,CAAS,UAAA,KAAe,UAAa,QAAA,CAAS,UAAA,KAAe,GAAA,CAAI,UAAA,EAAY,OAAO,KAAA;AACxH,MAAA,OAAO,IAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACT;AAAA;AAAA,EAGA,QAAQ,SAAA,EAAmC;AACvC,IAAA,MAAM,GAAA,GAAM,KAAK,WAAA,CAAY,SAAA,CAAU,OAAK,CAAA,CAAE,GAAA,CAAI,EAAA,KAAO,SAAA,CAAU,EAAE,CAAA;AACrE,IAAA,IAAI,OAAO,CAAA,EAAG;AACV,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAChC,MAAA,MAAM,YAAY,GAAA,CAAI,IAAA;AAGtB,MAAA,MAAM,MAAM,GAAA,CAAI,GAAA;AAChB,MAAA,IAAI,GAAA,YAAe,oBAAA,IAAwB,GAAA,CAAI,cAAA,EAAe,EAAG;AAE7D,QAAA,GAAA,CAAI,iBAAA,CAAkB,QAAW,SAAS,CAAA;AAAA,MAC9C;AAEA,MAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,GAAA,EAAK,CAAC,CAAA;AAAA,IAClC;AAAA,EACJ;AACJ;;;AC7EO,IAAK,cAAA,qBAAAE,eAAAA,KAAL;AAKL,EAAAA,gBAAA,qBAAA,CAAA,GAAsB,cAAA;AAMtB,EAAAA,gBAAA,oBAAA,CAAA,GAAqB,SAAA;AAMrB,EAAAA,gBAAA,cAAA,CAAA,GAAe,QAAA;AAMf,EAAAA,gBAAA,gBAAA,CAAA,GAAiB,UAAA;AAMjB,EAAAA,gBAAA,aAAA,CAAA,GAAc,aAAA;AAMd,EAAAA,gBAAA,QAAA,CAAA,GAAS,QAAA;AAnCC,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;;;ACEZ,IAAe,kBAAf,MAAiD;AAAA,EAEtC,SAAA;AAAA,EAET,WAAA,CAAY,MAAoB,YAAA,EAAc;AAC5C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,GAAA,EAAI;AAAA,EAC3B;AACF,CAAA;AAKO,IAAM,mBAAA,GAAN,cAAkC,eAAA,CAAgB;AAAA,EAC9C,IAAA,GAAO,iBAAA;AAAA,EACP,IAAA;AAAA,EAKT,WAAA,CAAY,GAAA,EAAuB,KAAA,EAAgB,GAAA,GAAoB,YAAA,EAAc;AACnF,IAAA,KAAA,CAAM,GAAG,CAAA;AACT,IAAA,IAAA,CAAK,IAAA,GAAO,EAAE,GAAA,EAAK,KAAA,EAAM;AAAA,EAC3B;AACF,CAAA;AAKO,IAAM,cAAA,GAAN,cAA6B,eAAA,CAAgB;AAAA,EACzC,IAAA,GAAO,YAAA;AAAA,EACP,IAAA;AAAA,EAMT,WAAA,CAAY,GAAA,EAAuB,KAAA,EAAgB,QAAA,EAAmB,MAAoB,YAAA,EAAc;AACtG,IAAA,KAAA,CAAM,GAAG,CAAA;AACT,IAAA,IAAA,CAAK,IAAA,GAAO,EAAE,GAAA,EAAK,KAAA,EAAO,QAAA,EAAS;AAAA,EACrC;AACF,CAAA;AAKO,IAAM,kBAAA,GAAN,cAAiC,eAAA,CAAgB;AAAA,EAC7C,IAAA,GAAO,gBAAA;AAAA,EACP,IAAA;AAAA,EAKT,WAAA,CAAY,GAAA,EAAuB,SAAA,EAAoB,GAAA,GAAoB,YAAA,EAAc;AACvF,IAAA,KAAA,CAAM,GAAG,CAAA;AACT,IAAA,IAAA,CAAK,IAAA,GAAO,EAAE,GAAA,EAAK,SAAA,EAAU;AAAA,EAC/B;AACF,CAAA;;;AC9BO,IAAM,eAAN,MAA4C;AAAA,EAK/C,WAAA,CACqB,SACD,OAAA,EACA,UAAA,GAAqB,IACrC,iBAAA,GAAwC,IACxC,MAAA,EACF;AALmB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACD,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAIhB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAC,GAAG,iBAAiB,CAAA;AACxC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,IAAU,IAAI,aAAA,EAAc;AAAA,EAC/C;AAAA,EARqB,OAAA;AAAA,EACD,OAAA;AAAA,EACA,UAAA;AAAA,EAPZ,cAAkC,EAAC;AAAA,EACnC,SAAA,GAAY,KAAA;AAAA,EACZ,OAAA;AAAA,EAaR,IAAI,UAAA,GAA8C;AAC9C,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAW,CAAA;AAAA,EAC/B;AAAA,EAEA,QAAA,CACI,IAAA,EACA,YAAA,EACA,UAAA,GAAiD,SAAA,EAC1B;AACvB,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACN,CAAA,8CAAA,EAAiD,KAAK,OAAO,CAAA,CAAA;AAAA,OACjE;AAAA,IACJ;AAGA,IAAA,MAAM,OAAA,GAAU,IAAA;AAEhB,IAAA,MAAM,GAAA,GAAM,KAAK,OAAA,CAAQ,QAAA;AAAA,MACrB,OAAA;AAAA,MACA,IAAA,CAAK,OAAA;AAAA,MACL,YAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,GAAG,CAAA;AAGzB,IAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,QAAA;AAAA,MAClB,IAAI,mBAAA,CAAoB,GAAA,EAAK,YAAA,EAAc,IAAA,CAAK,QAAQ,WAAW,CAAA;AAAA,MACnE,IAAA,CAAK;AAAA,KACT;AAEA,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEA,IAAO,IAAA,EAAoE;AACvE,IAAA,MAAM,OAAA,GAAU,IAAA;AAChB,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,OAAO,CAAA;AACzD,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEA,OAAU,IAAA,EAA0D;AAChE,IAAA,MAAM,OAAA,GAAU,IAAA;AAChB,IAAA,OAAO,KAAK,WAAA,CAAY,MAAA;AAAA,MACpB,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS;AAAA,KACpB;AAAA,EACJ;AAAA,EAEA,GAAA,CAAO,WAAoC,KAAA,EAAgB;AACvD,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACN,CAAA,yCAAA,EAA4C,KAAK,OAAO,CAAA,CAAA;AAAA,OAC5D;AAAA,IACJ;AAEA,IAAA,MAAM,QAAA,GAAW,UAAU,GAAA,EAAI;AAC/B,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAA,EAAW,KAAK,CAAA;AAGjC,IAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,QAAA;AAAA,MAClB,IAAI,cAAA,CAAe,SAAA,EAAW,OAAO,QAAA,EAAU,IAAA,CAAK,QAAQ,WAAW,CAAA;AAAA,MACvE,IAAA,CAAK;AAAA,KACT;AAAA,EACJ;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA;AAAA,IACJ;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,WAAA,EAAa;AAChC,MAAA,MAAM,SAAA,GAAY,IAAI,KAAA,EAAM;AAC5B,MAAA,IAAA,CAAK,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAGxB,MAAA,IAAA,CAAK,QAAQ,QAAA,CAAS,QAAA;AAAA,QAClB,IAAI,kBAAA,CAAmB,GAAA,EAAK,SAAA,EAAW,IAAA,CAAK,QAAQ,WAAW,CAAA;AAAA,QACnE,IAAA,CAAK;AAAA,OACL;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,cAAc,EAAC;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACrB;AAAA,EAEA,UAAA,GAAsB;AAClB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA,EAEA,kBAAkB,QAAA,EAAsD;AACpE,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACN,CAAA,mDAAA,EAAsD,KAAK,OAAO,CAAA,CAAA;AAAA,OACtE;AAAA,IACJ;AAGA,IAAA,IAAI,WAAA;AAEJ,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,MAAA,EAAQ;AAC3C,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,UAAA,CAAW,IAAA;AAAA,QACtC,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,QAAA,IAAY,CAAA,CAAE,IAAA,KAAA,QAAA;AAAA,OAChC;AACA,MAAA,IAAI,QAAA,EAAU;AACV,QAAA,WAAA,GAAc,QAAA;AACd,QAAA;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,IAAI,WAAA,EAAa;AAEb,MAAA,IAAI,CAAC,KAAK,WAAA,CAAY,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,WAAA,CAAY,EAAE,CAAA,EAAG;AACtD,QAAA,IAAA,CAAK,WAAA,CAAY,KAAK,WAAW,CAAA;AAAA,MACrC;AAEA,MAAA,OAAO,WAAA;AAAA,IACX;AAIA,IAAA,MAAM,SAAA,GAAY,KAAK,OAAA,CAAQ,QAAA;AAAA,MAAA,QAAA;AAAA,MAE3B,IAAA,CAAK,OAAA;AAAA,MACL,MAAA;AAAA;AAAA,MACA;AAAA,KACJ;AAGA,IAAA,SAAA,CAAU,EAAA,GAAK,QAAA;AAEf,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,SAAS,CAAA;AAC/B,IAAA,OAAO,SAAA;AAAA,EACX;AACJ;ACzGO,IAAM,iBAAN,MAAgD;AAAA,EAKnD,WAAA,CACoB,GAAA,EAChB,gBAAA,GAAgDf,2BAAAA,CAAgB,OAAM,EACxE;AAFkB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAGhB,IAAA,IAAA,CAAK,QAAA,GAAWA,2BAAAA,CAAgB,IAAA,CAAK,gBAAA,EAAkB,GAAG,CAAA;AAAA,EAC9D;AAAA,EAJoB,GAAA;AAAA,EALZ,UAAA,uBAAiB,GAAA,EAAwD;AAAA,EACzE,QAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EAStB,IAAI,OAAA,GAA2B;AAC3B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EAChB;AAAA,EAEA,OAAO,OAAA,EAA4C;AAC/C,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,sDAAA,EAAyD,IAAA,CAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AACjF,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAWA,2BAAAA,CAAgB,IAAA,CAAK,OAAA,EAAS,KAAK,GAAG,CAAA;AAGtD,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,UAAA,EAAY;AACpC,MAAA,QAAA,CAAS,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,IAC/B;AAAA,EACJ;AAAA,EAEA,UAAU,QAAA,EAA0E;AAChF,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,4DAAA,EAA+D,IAAA,CAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AACvF,MAAA,OAAO,MAAM;AAAA,MAAC,CAAA;AAAA,IAClB;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,QAAQ,CAAA;AAC5B,IAAA,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAA;AAAA,EAChD;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAWA,2BAAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAG9C,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,UAAA,EAAY;AACpC,MAAA,QAAA,CAAS,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA,IAC/B;AAEA,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AAAA,EAC1B;AACJ;;;AC7FO,IAAM,kBAAN,MAAkD;AAAA,EAiBrD,WAAA,CACa,KAAA,EACA,KAAA,EACA,UAAA,EACD,SACR,kBAAA,EACF;AALW,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACD,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGR,IAAA,IAAA,CAAK,aAAA,GAAgB,kBAAA,oBAAsB,IAAI,GAAA,EAAY;AAAA,EAC/D;AAAA,EAPa,KAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACD,OAAA;AAAA,EApBJ,gBAAuE,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcxE,aAAA;AAAA;AAAA;AAAA;AAAA,EAeR,SAAA,CAAU,SAAA,EAA8B,QAAA,EAAiC,OAAA,EAAyC;AAC9G,IAAA,MAAM,IAAA,GAAO,IAAA;AACb,IAAA,MAAM,OAAA,GAAU;AAAA,MACZ,EAAA,EAAI,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,MACpE,MAAM,CAAA,gBAAA,EAAmB,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,SAAS,CAAA,CAAA;AAAA,MACtD,OAAA,EAAS,CAAC,KAAA,EAAe,QAAA,KAAgD;AAIrE,QAAA,MAAM,WAAA,GAAgC,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM;AAAA,UACtD,KAAA,EAAO,EAAE,KAAA,EAAO,QAAA,CAAS,OAAO,UAAA,EAAY,IAAA,EAAM,cAAc,IAAA;AAAK,SACxE,CAAA;AACD,QAAA,OAAO,QAAA,CAAS,OAAO,WAAW,CAAA;AAAA,MACtC;AAAA,KACJ;AAGA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,QAAA;AAAA,MAChC,SAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MACxB,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,IAAS,QAAA;AAAS,KACxC;AAEA,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,EAAE,SAAA,EAAW,WAAA,EAAa,OAAO,CAAA;AACzD,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,KAAA,EAAqB;AAC3B,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,CACI,IAAA,EACA,OAAA,EACA,QAAA,EACI;AACJ,IAAA,MAAM,GAAA,GAAM,KAAK,KAAA,CAAM,WAAA;AASvB,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,MAAM,CAAA;AACvD,IAAA,IAAI,SAAA,GAAY,IAAI,OAAA,EAAQ;AAC5B,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAC5B,IAAA,IAAI,aAAyB,EAAC;AAE9B,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC3B,MAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,CAAC,CAAA,CAAE,OAAA;AACzC,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC3B,QAAA,MAAM,UAAA,GAAa,cAAA,CAAe,CAAC,CAAA,CAAE,KAAA;AACrC,QAAA,IAAI,UAAA,EAAY,KAAA,IAAS,UAAA,CAAW,KAAA,CAAM,SAAS,CAAA,EAAG;AAClD,UAAA,UAAA,GAAa,CAAC,GAAG,UAAA,CAAW,KAAK,CAAA;AAEjC,UAAA,SAAA,GAAY,UAAA,CAAW,CAAC,CAAA,CAAE,OAAA;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ;AAKA,IAAA,IAAI,kBAAA,GAAqBA,4BAAgB,IAAA,CAAK,OAAA,EAAS,KAAK,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAChF,IAAA,IAAI,kBAAA,CAAmB,WAAW,CAAA,EAAG;AACjC,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,gBAAgB,CAAA;AACnE,MAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC7B,QAAA,kBAAA,GAAqB,gBAAA,CAAiB,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,CAAA;AAAA,MACpF;AAAA,IACJ;AAGA,IAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MACjD,GAAG,CAAA;AAAA,MACH,gBAAgB,CAAA,CAAE,cAAA,IAAkB,IAAA,CAAK,KAAA,CAAM,IAAI,QAAA,EAAS;AAAA,MAC5D,SAAA,EAAW,EAAE,SAAA,IAAa;AAAA,KAC9B,CAAE,CAAA;AAIF,IAAA,MAAM,MAAA,GAAS,IAAIc,2BAAAA,CAAgB;AAAA,MAC/B,UAAA,EAAY,IAAA;AAAA,MACZ,QAAA,EAAU,IAAI,QAAA,CAAS,SAAA,EAAW,OAAO,CAAA;AAAA,MACzC,KAAA,EAAO,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,MAAA;AAAA,MAC5C,cAAA,EAAgB,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MACxC,iBAAA,EAAmB,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA;AAAA,MAC3C,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,OAAA,EAAS,eAAA;AAAA,MACT,kBAAkB,QAAA,EAAU;AAAA,KACL,CAAA;AAG3B,IAAA,IAAA,CAAK,mBAAmB,MAAM,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,MAAA,EAA+B;AACtD,IAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,MAAM,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,CAAW,KAAgB,OAAA,EAAuD;AAC9E,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,GAAA,EAAK,OAAO,CAAA;AAChD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAW,QAAQ,CAAA;AAC9B,IAAA,OAAO,QAAA;AAAA,EACX;AAAA,EAEA,eAAe,GAAA,EAAmC;AAC9C,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,GAAG,CAAA;AAAA,EACxC;AAAA,EAEA,YAAA,CAAa,KAAgB,OAAA,EAA4C;AACrE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,GAAG,CAAA;AAC/C,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACtB,MAAA,SAAA,CAAU,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAAA,IAC/B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,GAAA,EAAmB;AACjC,IAAA,IAAA,CAAK,aAAA,CAAc,IAAI,GAAG,CAAA;AAAA,EAC9B;AAAA,EAEA,cAAc,GAAA,EAAsB;AAChC,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAA,GAA+B;AAC3B,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,MAAA,EAAuB;AAChC,IAAA,IAAA,CAAK,KAAA,CAAM,aAAa,MAAM,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAA,GAAgB;AACZ,IAAA,KAAA,MAAW,EAAE,WAAA,EAAY,IAAK,IAAA,CAAK,aAAA,EAAe;AAC9C,MAAA,IAAI;AACA,QAAA,WAAA,EAAY;AAAA,MAChB,SAAS,GAAA,EAAK;AACV,QAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,GAAG,CAAA;AAAA,MAC7D;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,gBAAgB,EAAC;AAAA,EAC1B;AACJ;;;AC3NA,IAAM,YAAA,uBAA2C,GAAA,CAAe;AAAA,EAC5D;AACJ,CAAC,CAAA;AAGD,IAAM,WAAA,uBAA0C,GAAA,CAAe;AAAA,EAC3D;AACJ,CAAC,CAAA;AAGD,IAAM,YAAA,uBAA2C,GAAA,CAAe;AAAA,EAC5D,gBAAA;AAAA,EACA;AACJ,CAAC,CAAA;AAGD,IAAM,YAAA,uBAA2C,GAAA,CAAe;AAAA,EAC5D,gBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACJ,CAAC,CAAA;AASM,SAAS,oBAAoB,GAAA,EAA8C;AAC9E,EAAA,IAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,SAAA;AAClC,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,QAAA;AACjC,EAAA,IAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,SAAA;AAClC,EAAA,IAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,SAAA;AAGlC,EAAA,IAAK,GAAA,CAAe,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,SAAA;AAGlD,EAAA,OAAO,MAAA;AACX;AAKO,SAAS,cAAc,GAAA,EAAyB;AACnD,EAAA,OAAQ,GAAA,CAAe,UAAA,CAAW,SAAS,CAAA,IAAK,GAAA,KAAQ,SAAA;AAC5D;AAKO,SAAS,sBAAA,CACZL,OACA,UAAA,EACW;AACX,EAAA,OAAOA,MAAK,MAAA,CAAO,CAAA,GAAA,KAAO,mBAAA,CAAoB,GAAG,MAAM,UAAU,CAAA;AACrE;AAUO,IAAM,gBAAA,GAAqD;AAAA,EAC9D,OAAA,EAAS,WAAA;AAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA;AAAA,EACR,OAAA,EAAS,QAAA;AAAA;AAAA,EACT,OAAA,EAAS;AAAA;AACb;AAKO,IAAM,iBAAA,GAAsD;AAAA,EAC/D,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS;AACb;ACxDO,IAAM,eAAN,MAA4C;AAAA,EAC/B,YAAgC,EAAC;AAAA,EACjC,GAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAGR,UAA6B,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtC,IAAI,KAAA,GAAgB;AAEhB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,OAAA,EAAS;AAC5B,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,OAAA,EAAS;AAC5B,QAAA,IAAI,IAAA,CAAK,IAAA,KAASV,sBAAAA,CAAW,KAAA,EAAO;AAChC,UAAA,OAAO,KAAK,KAAA,IAAS,IAAA,CAAK,OAAO,QAAA,EAAS,IAAK,KAAK,SAAA,IAAa,OAAA;AAAA,QACrE;AAAA,MACJ;AAAA,IACJ;AACA,IAAA,OAAO,KAAK,SAAA,IAAa,OAAA;AAAA,EAC7B;AAAA;AAAA,EAGU,gBAAA;AAAA;AAAA,EAGM,kBAAwD,EAAC;AAAA;AAAA,EAGjE,WAAA,GAAuB,KAAA;AAAA,EACvB,iBAAA;AAAA;AAAA,EAGA,sBAAyC,EAAC;AAAA;AAAA,EAGxC,QAAA;AAAA,EAEV,YAAY,OAAA,EAA8B;AACtC,IAAA,MAAM;AAAA,MACF,OAAA;AAAA,MACA,YAAY,EAAC;AAAA,MACb,YAAY,EAAC;AAAA,MACb,OAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACJ,GAAI,OAAA;AAEJ,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA,IAAO,IAAIiB,oBAAA,EAAS;AAC/B,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,OAAA,GAAU,WAAW,IAAI,YAAA,CAAa,SAAS,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA;AAGvE,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,cAAA,CAAe,gBAAgB,CAAC;AAAA,QAClD,MAAMjB,sBAAAA,CAAW,KAAA;AAAA,QACjB,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,UAAA;AAAA,QACR,KAAA,EAAO;AAAA,OACC,CAAC,CAAC,CAAA;AAAA,IAClB;AAEA,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AACzB,QAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAI,cAAA,CAAe,gBAAA,EAAkB,KAAK,CAAC,CAAA;AAAA,MACjE;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,WAAW,QAAA,EAAiC;AACxC,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,KAAA,EAAgD;AACvD,IAAA,IAAI,CAAC,KAAA,IAAS,MAAA,CAAO,KAAK,KAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AAC/C,IAAA,MAAM,WAAW,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,GAAA,KAAO,GAAA,CAAI,QAAQ,aAAa,CAAA;AACnE,IAAA,MAAM,UAAA,GAAwB,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,MAAM,CAAA,MAAO;AAAA,MACxE,MAAMA,sBAAAA,CAAW,IAAA;AAAA,MACjB,KAAA,EAAO,GAAA;AAAA,MACP,KAAA,EAAO,GAAA;AAAA,MACP,MAAA,EAAQ,UAAA;AAAA,MACR,SAAA,sBAAe,IAAA;AAAK,KACxB,CAAE,CAAA;AACF,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAe,CAAC,CAAA;AAC9D,MAAA,MAAM,OAAO,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAQ,CAAE,OAAO,CAAA,CAAA,KAAK,EAAE,CAAA,CAAE,IAAA,KAASA,uBAAW,IAAA,IAAQ,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,KAAe,CAAA,CAAE,CAAA;AACnH,MAAA,QAAA,CAAS,OAAO,CAAC,GAAG,IAAA,EAAM,GAAG,UAAU,CAAC,CAAA;AAAA,IAC5C,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAI,cAAA,CAAe,aAAA,EAAe,UAAU,CAAC,CAAA;AAAA,IACnE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,GAAA,EAAmC;AAC9C,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,CAAO,CAAA,GAAA,KAAO,GAAA,CAAI,QAAQ,GAAG,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,GAAkC;AAC9B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,4BAA4B,UAAA,EAAiD;AACzE,IAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,CAAO,CAAA,GAAA,KAAO,oBAAoB,GAAA,CAAI,GAAG,MAAM,UAAU,CAAA;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBU,sBAAA,GAA+B;AAAA,EAGzC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,SAA0B,OAAA,EAAmD;AAC/E,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAGhB,IAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,KAAA,IAAS,OAAA,CAAQ,KAAA;AACxC,IAAA,IAAA,CAAK,eAAA,CAAgB,SAAA,GAAY,OAAA,EAAS,SAAA,IAAa,KAAA,CAAM,WAAA;AAG7D,IAAA,IAAA,CAAK,sBAAA,EAAuB;AAG5B,IAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAC,CAAA;AACtD,IAAA,IAAA,CAAK,mBAAmB,IAAI,eAAA,CAAgB,IAAA,EAAM,KAAA,EAAO,YAAY,OAAO,CAAA;AAG5E,IAAA,MAAM,UAA4B,EAAC;AACnC,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACnC,MAAA,IAAI,SAAS,OAAA,EAAS;AAClB,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,gBAAgB,CAAA;AACrD,QAAA,IAAI,MAAA,EAAQ;AACR,UAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,QAC1B;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,WAAA,CAAY,SAA0B,OAAA,EAAqD;AACvF,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAIxB,MAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,EAAC,EAAE;AAAA,IAC1C;AACA,IAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,KAAA,IAAS,IAAA,CAAK,gBAAA,CAAiB,KAAA;AAItD,IAAA,MAAM,cAAc,IAAI,eAAA;AAAA,MACpB,IAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAK,gBAAA,CAAiB,UAAA;AAAA,MACtB,OAAA;AAAA,MACA,IAAA,CAAK,iBAAiB,eAAA;AAAgB,KAC1C;AAIA,IAAA,MAAM,cAAc,IAAA,CAAK,WAAA;AACzB,IAAA,MAAM,YAAY,IAAA,CAAK,iBAAA;AAIvB,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACnC,MAAA,MAAM,mBAAA,GAAsB,QAAA;AAC5B,MAAA,IAAI,OAAO,mBAAA,CAAoB,mBAAA,KAAwB,UAAA,EAAY;AAC/D,QAAA,mBAAA,CAAoB,mBAAA,EAAoB;AAAA,MAC5C;AAAA,IACJ;AAEA,IAAA,MAAM,UAA4B,EAAC;AACnC,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACnC,MAAA,IAAI,SAAS,MAAA,EAAQ;AACjB,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,CAAO,WAAW,CAAA;AAC1C,QAAA,IAAI,MAAA,EAAQ;AACR,UAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,QAC1B;AAAA,MACJ;AAAA,IACJ;AAIA,IAAA,WAAA,CAAY,OAAA,EAAQ;AAMpB,IAAA,IAAI,IAAA,CAAK,eAAe,CAAC,OAAA,CAAQ,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,WAAW,CAAA,EAAG;AAChE,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,cAAA,EAAgB,CAAA;AAAA,IACrC;AAGA,IAAA,MAAM,QAAA,GAA+B;AAAA,MACjC,UAAU,IAAA,CAAK,WAAA;AAAA,MACf,QAAQ,IAAA,CAAK,iBAAA;AAAA,MACb;AAAA,KACJ;AAGA,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAA,CAAK,iBAAA,GAAoB,SAAA;AAEzB,IAAA,OAAO,QAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAA,CAAK,SAA0B,OAAA,EAAmD;AAC9E,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AACxB,MAAA,OAAA,CAAQ,KAAK,6CAA6C,CAAA;AAC1D,MAAA,OAAO,EAAC;AAAA,IACZ;AAGA,IAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,KAAA,IAAS,IAAA,CAAK,gBAAA,CAAiB,KAAA;AAGtD,IAAA,IAAA,CAAK,oBAAA,CAAqB,SAAS,KAAK,CAAA;AAIxC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,OAAO,CAAA;AAMlD,IAAA,IAAI,QAAA,CAAS,QAAA,IAAY,CAAC,IAAA,CAAK,WAAA,EAAa;AACxC,MAAA,IAAA,CAAK,YAAA,CAAa,SAAS,MAAM,CAAA;AAAA,IACrC;AAGA,IAAA,aAAA,CAAc,QAAQ,IAAA,EAAM,CAAC,GAAG,QAAA,CAAS,OAAO,CAAC,CAAA;AAEjD,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAA,CAAQ,SAA0B,OAAA,EAAmD;AAEjF,IAAA,MAAM,KAAA,GAAQ,OAAA,EAAS,KAAA,IAAS,OAAA,CAAQ,KAAA;AACxC,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,GAAU,OAAA,EAAS,SAAA,IAAa,KAAA,CAAM,WAAA;AAE3D,IAAA,MAAM,UAA4B,EAAC;AAInC,IAAA,MAAM,iBAAiB,IAAI,eAAA;AAAA,MACvB,IAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,CAAK,kBAAkB,UAAA,IAAc,CAAA;AAAA,MACrC,OAAA;AAAA,MACA,IAAA,CAAK,kBAAkB,eAAA;AAAgB,KAC3C;AAGA,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACnC,MAAA,IAAI,SAAS,SAAA,EAAW;AACpB,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,SAAA,CAAU,cAAc,CAAA;AAChD,QAAA,IAAI,MAAA,EAAQ;AACR,UAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,QAC1B;AAAA,MACJ;AAAA,IACJ;AAGA,IAAA,cAAA,CAAe,OAAA,EAAQ;AAGvB,IAAA,MAAM,mBAAA,GAAsB,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS;AAAA,MAClD,IAAA,EAAM,SAAA;AAAA,MACN,SAAA,EAAW,QAAQ,KAAA,CAAM,WAAA;AAAA,MACzB,MAAM,EAAE,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,UAAS;AAAE,OACvC,OAAO,CAAA;AACV,IAAA,IAAI,mBAAA,CAAoB,SAAS,CAAA,EAAG;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,mBAAmB,CAAA;AAAA,IACvC;AAGA,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,mBAAA,EAAqB;AAC1C,MAAA,IAAI;AACA,QAAA,KAAA,EAAM;AAAA,MACV,SAAS,GAAA,EAAK;AACV,QAAA,OAAA,CAAQ,KAAA,CAAM,qDAAqD,GAAG,CAAA;AAAA,MAC1E;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,sBAAsB,EAAC;AAG5B,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACvB,MAAA,IAAA,CAAK,iBAAiB,OAAA,EAAQ;AAC9B,MAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAA,EAAgC;AAEpC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,gBAAA,IAAoB,IAAI,eAAA;AAAA,MACrC,IAAA;AAAA,MACA,OAAA,CAAQ,KAAA;AAAA,MACR,CAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACnC,MAAA,IAAI,SAAS,SAAA,EAAW;AACpB,QAAA,QAAA,CAAS,UAAU,GAAG,CAAA;AAAA,MAC1B;AAAA,IACJ;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,IAAoB,GAAA,EAAK;AAC/B,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IAChB;AAGA,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,OAAA,EAAS;AACjC,MAAA,QAAA,CAAS,OAAA,EAAQ;AAAA,IACrB;AACA,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,UAAA,GAAsB;AACtB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EAChB;AAAA,EAEA,IAAI,gBAAA,GAAuC;AACvC,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,EAChB;AAAA,EAEA,aAAa,MAAA,EAAuB;AAChC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,iBAAA,GAAoB,MAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAwC,YAAA,EAAwD;AAC5F,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,CAAA,CAAA,KAAK,aAAa,YAAY,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAA,CAAqB,SAA0B,KAAA,EAA4B;AAC/E,IAAA,MAAM,MAAM,KAAA,CAAM,WAAA;AAWlB,IAAA,MAAM,KAAA,GAA2B;AAAA,MAC7B,KAAA,EAAO,MAAA;AAAA,MACP,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,QAAA,EAAS;AAAA,MAC5B,YAAY,IAAA,CAAK,KAAA;AAAA;AAAA,MAEjB,UAAA,EAAY;AAAA,KAChB;AAGA,IAAA,MAAM,MAAA,GAAkB;AAAA,MACpB,MAAMA,sBAAAA,CAAW,MAAA;AAAA,MACjB,KAAA,EAAO,CAAA,MAAA,EAAS,IAAA,CAAK,KAAA,IAAS,KAAK,SAAA,IAAa,OAAO,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,QAAA,EAAS,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,MAC3F,KAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAW;AAAA,KACf;AAGA,IAAA,MAAM,MAAA,GAAS,IAAIe,2BAAAA,CAAgB;AAAA,MAC/B,UAAA,EAAY,QAAA;AAAA,MACZ,QAAA,EAAU,IAAI,QAAA,CAAS,GAAA,CAAI,SAAQ,EAAG,GAAA,CAAI,SAAS,CAAA;AAAA,MACnD,cAAA,EAAgB,IAAA,CAAK,GAAA,CAAI,QAAA,EAAS;AAAA,MAClC,UAAA,EAAY,QAAQ,KAAA,CAAM,KAAA;AAAA,MAC1B,OAAA,EAAS,CAAC,MAAM;AAAA,KACnB,CAAA;AAED,IAAA,OAAA,CAAQ,UAAU,MAAM,CAAA;AAAA,EAC5B;AACJ;;;ACjhBO,IAAM,eAAN,MAA4C;AAAA,EAChC,UAA2B,EAAC;AAAA,EAC5B,UAAA,uBAAqC,GAAA,EAAI;AAAA;AAAA,EAG1D,IAAW,MAAA,GAAmC;AAC5C,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAO,EAAE,OAAA,EAAQ;AAAA,EACnC;AAAA,EAEA,IAAW,KAAA,GAAgB;AACzB,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,EACtB;AAAA,EAEA,IAAW,OAAA,GAAqC;AAC9C,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC7B,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,EAC7C;AAAA,EAEA,IAAW,IAAA,GAAmB;AAC5B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,GAAG,CAAA;AAAA,EACnC;AAAA,EAEO,KAAK,KAAA,EAA4B;AACtC,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AACvB,IAAA,IAAA,CAAK,MAAA,CAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,EACtF;AAAA,EAEO,GAAA,GAAiC;AACtC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI;AAC/B,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,MAAA,CAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,IACrF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEO,KAAA,GAAc;AACnB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,GAAA,EAAI;AAAA,IACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,UAAU,QAAA,EAAqC;AACpD,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,QAAQ,CAAA;AAG5B,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAEjD,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,UAAA,CAAW,OAAO,QAAQ,CAAA;AAAA,IACjC,CAAA;AAAA,EACF;AAAA,EAEQ,OAAO,KAAA,EAAyB;AACtC,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,UAAA,EAAY;AACtC,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA,MAChB,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACF;;;AChEO,SAAS,eAAA,GAA0B;AACxC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,cAAc,MAAA,CAAO,8BAAA;AAC3B,IAAA,IAAI,OAAO,gBAAgB,UAAA,EAAY;AACrC,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,WAAA,EAAY;AAC1B,QAAA,IAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AAC1B,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAK,GAAA,EAAI;AAClB;AAGO,SAAS,uBAAA,GAAwC;AACtD,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,MAAM,IAAI,IAAA,CAAK,iBAAiB,CAAA;AAAA,IACrC,KAAA,EAAO,MAAM,eAAA;AAAgB,GAC/B;AACF;ACxBO,IAAM,8BAAN,MAA8D;AAAA,EACzD,cAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EAEtB,QAAQ,IAAA,EAA0C;AAC9C,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,OAAO,GAAA,EAAyC;AAE5C,IAAA,MAAM,UAAA,GAAc,IAAI,KAAA,CAAc,KAAA;AACtC,IAAA,IAAI,UAAA,IAAc,WAAW,UAAA,IAAc,CAAC,KAAK,WAAA,IAAe,CAAC,KAAK,cAAA,EAAgB;AAClF,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAI,IAAA,CAAK,GAAA,CAAI,MAAM,WAAW,CAAA;AACpD,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAGnB,MAAA,MAAM,kBAAA,GAA8B;AAAA,QAChC,MAAMf,sBAAAA,CAAW,UAAA;AAAA;AAAA,QACjB,KAAA,EAAO,IAAA,CAAK,cAAA,CAAe,WAAA,EAAY;AAAA,QACvC,MAAA,EAAQ,SAAA;AAAA,QACR,KAAA,EAAO;AAAA,UACH,SAAA,EAAW,IAAA,CAAK,cAAA,CAAe,OAAA,EAAQ;AAAA,UACvC,WAAW,IAAA,CAAK;AAAA,SACpB;AAAA,QACA,cAAA,EAAgB,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,QACvC,SAAA,EAAW,IAAI,KAAA,CAAM;AAAA,OACzB;AAEA,MAAA,GAAA,CAAI,UAAA,CAAW,YAAA,EAAc,CAAC,kBAAkB,CAAC,CAAA;AAAA,IACrD;AACA,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA0C;AAChD,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA8B;AAAA,EAExC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA,GAAsC;AAClC,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EAChB;AACJ,CAAA;;;AChCA,IAAM,QAAA,GAAW,MAAA;AASV,SAAS,UAAU,KAAA,EAA2B;AACjD,EAAA,OAAO,CAAC,IAAI,QAAA,CAAS,KAAK,CAAC,CAAA;AAC/B;AAMO,SAAS,gBAAA,CAAiB,OAAiB,KAAA,EAA2B;AACzE,EAAA,OAAO,KAAA,CAAM,GAAA;AAAA,IAAI,CAAC,IAAA,EAAM,CAAA,KACpB,CAAA,KAAM,MAAM,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,KAAA,KAAU,SACnC,IAAI,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA,GAChC;AAAA,GACV;AACJ;AAGO,SAAS,QAAA,CAAS,OAAiB,KAAA,EAA2B;AACjE,EAAA,OAAO,CAAC,GAAG,KAAA,EAAO,IAAI,QAAA,CAAS,KAAK,CAAC,CAAA;AACzC;AAOO,SAAS,UAAU,GAAA,EAA+C;AACrE,EAAA,OAAO,GAAA,CAAI,eAAe,QAAQ,CAAA,CAAE,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA;AACxD;AASO,SAAS,gBAAA,CACZ,KACA,SAAA,EACO;AACP,EAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,QAAQ,EAAE,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AAC3D,EAAA,MAAM,QAAQ,QAAA,EAAU,KAAA;AACxB,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,QAAA,EAAU,OAAO,KAAA;AAEhC,EAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,CAAM,KAAA,EAAO,IAAI,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA;AACpE,EAAA,GAAA,CAAI,YAAA,CAAa,QAAA,EAAU,CAAC,EAAE,GAAG,QAAA,EAAU,KAAA,EAAO,EAAE,GAAG,KAAA,EAAO,KAAA,EAAM,EAAG,CAAC,CAAA;AACxE,EAAA,OAAO,IAAA;AACX;;;ACpEO,IAAM,uBAAN,MAAuD;AAAA,EAC1D,QAAQ,GAAA,EAAyC;AAC7C,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,WAAA,CAAY,OAAA,EAAQ;AAC1C,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,KAAA;AAExB,IAAA,MAAM,MAAA,GAAkB;AAAA,MACpB,MAAMA,sBAAAA,CAAW,IAAA;AAAA,MACjB,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACH,KAAA,EAAO,UAAU,GAAG,CAAA;AAAA,QACpB,SAAA,EAAW,IAAA;AAAA,QACX,UAAA,EAAY,MAAA;AAAA,QACZ,KAAA;AAAA,QACA,IAAA,EAAM;AAAA,OACV;AAAA,MACA,cAAA,EAAgB,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MACvC,SAAA,EAAW,IAAI,KAAA,CAAM;AAAA,KACzB;AAEA,IAAA,GAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,CAAC,MAAM,CAAC,CAAA;AAC/B,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,OAAO,IAAA,EAA0C;AAC7C,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,GAAA,EAAyC;AAC/C,IAAA,MAAM,UAAA,GAAa,UAAU,GAAG,CAAA;AAChC,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAM,MAAA,KAAW,CAAA,SAAU,EAAC;AAC1D,IAAA,gBAAA,CAAiB,KAAK,gBAAgB,CAAA;AACtC,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA8B;AAAA,EAExC;AACJ,CAAA;AC3BO,IAAM,uBAAN,MAAuD;AAAA,EAC1D,WAAA,CAA4B,MAAA,GAA6B,EAAC,EAAG;AAAjC,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAmC;AAAA,EAAnC,MAAA;AAAA,EAEpB,gBAA+B,EAAC;AAAA,EAChC,QAAA,GAAW,KAAA;AAAA,EAEnB,QAAQ,GAAA,EAAyC;AAC7C,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,WAAA,CAAY,OAAA,EAAQ;AAC1C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,IAAI,KAAA,CAAM,KAAA;AAC7C,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA,KAAS,WAAW,MAAA,GAAU,IAAA,CAAK,OAAO,IAAA,IAAQ,SAAA;AAE3E,IAAA,GAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,CAAC,IAAA,CAAK,eAAe,GAAA,EAAK;AAAA,MAC7C,KAAA,EAAO,UAAU,GAAG,CAAA;AAAA,MACpB,SAAA,EAAW,IAAA;AAAA,MACX,UAAA,EAAY,MAAA;AAAA,MACZ,KAAA;AAAA,MACA;AAAA,KACH,CAAC,CAAC,CAAA;AAGH,IAAA,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,MACf,GAAA,CAAI,SAAA,CAAU,aAAA,EAAsB,CAAC,QAAQ,IAAA,KAAS;AAClD,QAAA,IAAI,IAAA,CAAK,QAAA,EAAU,OAAO,EAAC;AAC3B,QAAA,IAAI,gBAAA,CAAiB,IAAA,EAAM,gBAAgB,CAAA,OAAQ,QAAA,GAAW,IAAA;AAC9D,QAAA,OAAO,EAAC;AAAA,MACZ,CAAC;AAAA,KACL;AAGA,IAAA,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,MACf,GAAA,CAAI,SAAA,CAAU,cAAA,EAAuB,CAAC,QAAQ,IAAA,KAAS;AACnD,QAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,EAAC;AAC5B,QAAA,IAAI,gBAAA,CAAiB,IAAA,EAAM,QAAQ,CAAA,OAAQ,QAAA,GAAW,KAAA;AACtD,QAAA,OAAO,EAAC;AAAA,MACZ,CAAC;AAAA,KACL;AAEA,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,OAAO,IAAA,EAA0C;AAC7C,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,GAAA,EAAyC;AAC/C,IAAA,gBAAA,CAAiB,KAAK,gBAAgB,CAAA;AACtC,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA8B;AACpC,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,aAAA,EAAe;AACpC,MAAA,IAAI;AAAE,QAAA,KAAA,EAAM;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAc;AAAA,IACzC;AACA,IAAA,IAAA,CAAK,cAAc,MAAA,GAAS,CAAA;AAAA,EAChC;AAAA,EAEQ,cAAA,CAAe,KAAuB,KAAA,EAA4B;AACtE,IAAA,OAAO;AAAA,MACH,MAAMA,sBAAAA,CAAW,IAAA;AAAA,MACjB,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,KAAA;AAAA,MACP,cAAA,EAAgB,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MACvC,SAAA,EAAW,IAAI,KAAA,CAAM;AAAA,KACzB;AAAA,EACJ;AACJ,CAAA;;;ACnEO,IAAM,sBAAN,MAAoD;AAAA,EAGvD,YAA6B,cAAA,EAAwB;AAAxB,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EAA0B;AAAA,EAA1B,cAAA;AAAA,EAFpB,IAAA,GAAO,gBAAA;AAAA,EAIhB,GAAG,OAAA,EAA4C;AAC3C,IAAA,MAAM,UAA4B,EAAC;AACnC,IAAA,MAAM,cAAA,GAAiB,EAAA;AACvB,IAAA,IAAI,UAAA,GAAa,CAAA;AAGjB,IAAA,OAAO,aAAa,cAAA,EAAgB;AAChC,MAAA,MAAM,OAAA,GAAU,QAAQ,KAAA,CAAM,OAAA;AAC9B,MAAA,IAAI,CAAC,OAAA,EAAS;AACV,QAAA;AAAA,MACJ;AAGA,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAS,KAAM,KAAK,cAAA,EAAgB;AAChD,QAAA;AAAA,MACJ;AAMA,MAAA,MAAM,SAAA,GAAY,IAAI,cAAA,EAAe;AAQrC,MAAA,MAAM,UAAA,GAAa,SAAA,CAAU,EAAA,CAAG,OAAO,CAAA;AAIvC,MAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC7B,QAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ;AACxB,UAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,QACvB;AAAA,MACJ;AAEA,MAAA,UAAA,EAAA;AAAA,IACJ;AAEA,IAAA,IAAI,cAAc,cAAA,EAAgB;AAC9B,MAAA,OAAA,CAAQ,MAAM,CAAA,oEAAA,CAAsE,CAAA;AAAA,IACxF;AAIA,IAAA,IAAI,QAAQ,KAAA,CAAM,OAAA,EAAS,IAAI,QAAA,EAAS,KAAM,KAAK,cAAA,EAAgB;AAC/D,MAAA,OAAA,CAAQ,KAAK,IAAI,UAAA,CAAW,MAAA,EAAW,OAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AACJ;;;ACrEO,SAAS,gBAAA,CAAiB,OAAmB,GAAA,EAAqB;AACrE,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC5B,IAAA,MAAM,GAAA,GAAM,KAAK,KAAA,IAAS,GAAA;AAC1B,IAAA,KAAA,IAAS,MAAM,IAAA,CAAK,OAAA;AAAA,EACxB;AACA,EAAA,OAAO,KAAA;AACX;AAQO,SAAS,eAAe,EAAA,EAAoB;AAC/C,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,EAAE,CAAA;AACzC,EAAA,MAAM,OAAO,YAAA,GAAe,EAAA;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AACtD;ACdO,IAAM,qBAAN,MAA4C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAajD,WAAA,CACW,OAAA,EACA,KAAA,EACA,cAAA,EACA,WACT,WAAA,EACA;AALS,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAGT,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,WAAA,KAAgB,KAAA,KAAU,MAAA,GACnC,CAAA,MAAA,EAAS,OAAO,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,GAC5B,CAAA,MAAA,EAAS,OAAO,CAAA,CAAA,CAAA;AAAA,EACtB;AAAA,EAVW,OAAA;AAAA,EACA,KAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EAhBF,OAAOA,sBAAAA,CAAW,YAAA;AAAA,EAClB,MAAA,GAAuB,SAAA;AAAA,EACvB,KAAA;AAAA,EACA,KAAA;AAqBX,CAAA;;;ACKO,IAAM,yBAAN,MAAyD;AAAA,EAC5D,YAA4B,MAAA,EAA8B;AAA9B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAgC;AAAA,EAAhC,MAAA;AAAA,EAEpB,gBAA+B,EAAC;AAAA,EAChC,QAAA,GAAW,KAAA;AAAA,EAEnB,QAAQ,GAAA,EAAyC;AAC7C,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,WAAA,CAAY,OAAA,EAAQ;AAC1C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,IAAI,KAAA,CAAM,KAAA;AAC7C,IAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,IAAA,KAAS,WAAW,MAAA,GAAU,IAAA,CAAK,OAAO,IAAA,IAAQ,SAAA;AAC3E,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,IAAA,IAAQ,gBAAA;AAEjC,IAAA,GAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,CAAC,IAAA,CAAK,eAAe,GAAA,EAAK;AAAA,MAC7C,KAAA,EAAO,UAAU,GAAG,CAAA;AAAA,MACpB,SAAA,EAAW,MAAA;AAAA,MACX,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,MACxB,KAAA;AAAA,MACA;AAAA,KACH,CAAC,CAAC,CAAA;AAGH,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,YAAA,CAAa,KAAK,IAAI,CAAA;AAC3B,MAAA,OAAO,CAAC,IAAI,mBAAA,CAAoB,GAAA,CAAI,MAAM,GAAA,CAAI,QAAA,EAAU,CAAC,CAAA;AAAA,IAC7D;AAGA,IAAA,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,MACf,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,CAAC,QAAQ,OAAA,KAAY;AACvC,QAAA,MAAM,KAAA,GAAQ,UAAU,OAAO,CAAA;AAC/B,QAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,cAAc,MAAA,IAAU,KAAA,CAAM,eAAe,MAAA,EAAW;AACxE,UAAA,OAAO,EAAC;AAAA,QACZ;AAEA,QAAA,IAAI,IAAA,KAAS,gBAAA,IAAoB,OAAA,CAAQ,KAAA,CAAM,UAAA,EAAY;AACvD,UAAA,OAAO,EAAC;AAAA,QACZ;AACA,QAAA,MAAM,UAAU,gBAAA,CAAiB,KAAA,EAAO,QAAQ,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA;AAC3E,QAAA,IAAI,OAAA,GAAU,KAAA,CAAM,UAAA,EAAY,OAAO,EAAC;AAExC,QAAA,IAAA,CAAK,YAAA,CAAa,SAAS,IAAI,CAAA;AAC/B,QAAA,OAAO,CAAC,IAAI,mBAAA,CAAoB,OAAA,CAAQ,MAAM,GAAA,CAAI,QAAA,EAAU,CAAC,CAAA;AAAA,MACjE,CAAA,EAAG,EAAE,KAAA,EAAO,QAAA,EAAU;AAAA,KAC1B;AAGA,IAAA,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,MACf,GAAA,CAAI,SAAA,CAAU,aAAA,EAAsB,CAAC,QAAQ,IAAA,KAAS;AAClD,QAAA,IAAI,IAAA,KAAS,gBAAA,EAAkB,OAAO,EAAC;AACvC,QAAA,gBAAA,CAAiB,MAAM,CAAC,MAAA,EAAQ,KAAA,KAAU,SAAA,CAAU,KAAK,CAAC,CAAA;AAC1D,QAAA,OAAO,EAAC;AAAA,MACZ,CAAC;AAAA,KACL;AAGA,IAAA,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,MACf,GAAA,CAAI,SAAA,CAAU,aAAA,EAAsB,CAAC,QAAQ,IAAA,KAAS;AAClD,QAAA,IAAI,IAAA,CAAK,QAAA,EAAU,OAAO,EAAC;AAC3B,QAAA,IAAI,gBAAA,CAAiB,IAAA,EAAM,gBAAgB,CAAA,OAAQ,QAAA,GAAW,IAAA;AAC9D,QAAA,OAAO,EAAC;AAAA,MACZ,CAAC;AAAA,KACL;AAGA,IAAA,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,MACf,GAAA,CAAI,SAAA,CAAU,cAAA,EAAuB,CAAC,QAAQ,IAAA,KAAS;AACnD,QAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,EAAC;AAC5B,QAAA,IAAI,gBAAA,CAAiB,IAAA,EAAM,QAAQ,CAAA,OAAQ,QAAA,GAAW,KAAA;AACtD,QAAA,OAAO,EAAC;AAAA,MACZ,CAAC;AAAA,KACL;AAEA,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,OAAO,GAAA,EAAyC;AAE5C,IAAA,IAAI,KAAK,MAAA,CAAO,QAAA,IAAY,CAAC,GAAA,CAAI,MAAM,UAAA,EAAY;AAC/C,MAAA,GAAA,CAAI,SAAA,CAAU;AAAA,QACV,IAAA,EAAM,oBAAA;AAAA,QACN,SAAA,EAAW,IAAI,KAAA,CAAM,WAAA;AAAA,QACrB,MAAM,EAAE,QAAA,EAAU,IAAI,KAAA,CAAM,GAAA,CAAI,UAAS;AAAE,OAC9C,CAAA;AACD,MAAA,OAAO,EAAC;AAAA,IACZ;AAMA,IAAA,IAAI,GAAA,CAAI,aAAA,CAAc,gBAAgB,CAAA,EAAG;AACrC,MAAA,OAAO,EAAC;AAAA,IACZ;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB;AAC/B,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAU,GAAG,CAAA;AAC3B,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,cAAc,MAAA,IAAU,CAAC,MAAM,UAAA,EAAY;AAC3D,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,uBAAA,CAAwB,GAAG,CAAA;AAGpD,IAAA,IAAI,cAAc,GAAA,EAAM;AACpB,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,WAAA,EAAa,MAAM,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,GAAA,EAAyC;AAC/C,IAAA,gBAAA,CAAiB,KAAK,gBAAgB,CAAA;AACtC,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA8B;AACpC,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,aAAA,EAAe;AACpC,MAAA,IAAI;AAAE,QAAA,KAAA,EAAM;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAc;AAAA,IACzC;AACA,IAAA,IAAA,CAAK,cAAc,MAAA,GAAS,CAAA;AAAA,EAChC;AAAA;AAAA,EAIQ,YAAA,CAAa,KAAuB,IAAA,EAA2B;AACnE,IAAA,GAAA,CAAI,SAAA,CAAU;AAAA,MACV,IAAA,EAAM,gBAAA;AAAA,MACN,SAAA,EAAW,IAAI,KAAA,CAAM,WAAA;AAAA,MACrB,MAAM,EAAE,QAAA,EAAU,IAAI,KAAA,CAAM,GAAA,CAAI,UAAS;AAAE,KAC9C,CAAA;AAED,IAAA,IAAI,SAAS,gBAAA,EAAkB;AAC3B,MAAA,GAAA,CAAI,aAAa,eAAe,CAAA;AAAA,IACpC,CAAA,MAAO;AAEH,MAAA,gBAAA,CAAiB,KAAK,CAAC,MAAA,EAAQ,KAAA,KAAU,SAAA,CAAU,KAAK,CAAC,CAAA;AAMzD,MAAA,IAAI,GAAA,CAAI,aAAA,CAAc,gBAAgB,CAAA,EAAG;AACrC,QAAA;AAAA,MACJ;AAKA,MAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,OAAO,EAAE,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AACvD,MAAA,IAAI,KAAA,EAAO;AACP,QAAA,MAAM,gBAAgB,IAAI,kBAAA;AAAA,UACtB,MAAM,OAAA,GAAU,CAAA;AAAA,UAChB,KAAA,CAAM,KAAA;AAAA,UACN,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,UACvB,IAAI,KAAA,CAAM;AAAA,SACd;AACA,QAAA,GAAA,CAAI,YAAA,CAAa,OAAA,EAAS,CAAC,aAAa,CAAC,CAAA;AAAA,MAC7C;AAEA,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,cAAA,CAAe,iBAAiB,EAAE,CAAC,CAAA;AACxD,MAAA,MAAM,WAAA,GAAc,QAAA,EAAU,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA;AAC1C,MAAA,MAAM,cAAA,GAAiB,EAAE,UAAA,EAAY,CAAA,EAAG,aAAA,EAAe,WAAA,EAAa,aAAA,IAAiB,CAAA,EAAG,WAAA,EAAa,KAAA,EAAO,YAAA,EAAc,KAAA,EAAM;AAChI,MAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,CAAC,CAAA,EAAG;AACtB,QAAA,GAAA,CAAI,YAAA,CAAa,iBAAA,EAAmB,CAAC,EAAC,GAAG,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA,EAAO,cAAA,EAAe,CAAC,CAAA;AAAA,MACzF,CAAA,MAAO;AACH,QAAA,GAAA,CAAI,UAAA,CAAW,iBAAA,EAAmB,CAAC,EAAC,IAAA,EAAM,CAAA,EAAU,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,SAAA,EAAkB,KAAA,EAAO,cAAA,EAAe,CAAC,CAAA;AAAA,MACpH;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,wBAAwB,GAAA,EAA+B;AAC3D,IAAA,MAAM,KAAA,GAAQ,UAAU,GAAG,CAAA;AAC3B,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,cAAc,MAAA,IAAU,CAAC,MAAM,UAAA,EAAY;AAC3D,MAAA,OAAO,CAAA;AAAA,IACX;AAEA,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,WAAA,CAAY,OAAA,EAAQ;AAC1C,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,KAAA,EAAO,GAAG,CAAA;AAC3C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,aAAa,OAAO,CAAA;AAAA,EACjD;AAAA,EAEQ,cAAA,CAAe,KAAuB,KAAA,EAA4B;AACtE,IAAA,OAAO;AAAA,MACH,MAAMA,sBAAAA,CAAW,IAAA;AAAA,MACjB,KAAA,EAAOkB,eAAAA,CAAe,KAAA,CAAM,UAAU,CAAA;AAAA,MACtC,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,KAAA;AAAA,MACP,cAAA,EAAgB,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MACvC,SAAA,EAAW,IAAI,KAAA,CAAM;AAAA,KACzB;AAAA,EACJ;AACJ,CAAA;AAEA,SAASA,gBAAe,UAAA,EAAwC;AAC5D,EAAA,IAAI,CAAC,UAAA,IAAc,UAAA,KAAe,CAAA,EAAG,OAAO,MAAA;AAC5C,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,GAAI,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,IAAI,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,OAAQ,EAAE,CAAA;AACrD,EAAA,MAAM,UAAU,YAAA,GAAe,EAAA;AAC/B,EAAA,IAAI,QAAQ,CAAA,EAAG;AACX,IAAA,OAAO,GAAG,KAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAA,GAAW,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,IAAI,OAAA,CAAQ,QAAA,GAAW,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,EACjG;AACA,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,OAAA,CAAQ,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAC5D;AC3OO,IAAM,0BAAN,MAAuF;AAAA,EAI1F,YAA6B,MAAA,EAA+B;AAA/B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACzB,IAAA,IAAA,CAAK,aAAa,CAAC,GAAI,MAAA,CAAO,SAAA,IAAa,EAAG,CAAA;AAAA,EAClD;AAAA,EAF6B,MAAA;AAAA,EAHZ,UAAA;AAAA,EACT,kBAAA;AAAA,EAMR,IAAI,SAAA,GAA+B;AAC/B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAChB;AAAA,EAEA,gBAAgB,KAAA,EAAmC;AAC/C,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACzC,IAAA,MAAM,KAAA,GAAA,CAAS,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,MAAA;AAC5C,IAAA,OAAO,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,EAChC;AAAA,EAEA,sBAAA,GAA6C;AACzC,IAAA,IAAI,IAAA,CAAK,uBAAuB,MAAA,EAAW;AACvC,MAAA,OAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,IAC5B;AAEA,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,kBAAkB,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,oBAAA,CAAqB,SAA0B,WAAA,EAA6C;AACxF,IAAA,MAAM,UAAUjB,2BAAAA,CAAgB,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA;AAGhE,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,UAAA,GAAa,YAAY,cAAA,CAAe,OAAO,EAAE,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AACpE,MAAA,MAAM,KAAA,GAAQ,YAAY,OAAA,IAAW,CAAA;AACrC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAEvC,MAAA,IAAI,SAAS,MAAA,EAAW;AACpB,QAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,UACR,MAAMD,sBAAAA,CAAW,GAAA;AAAA,UACjB,KAAA,EAAO,KAAK,QAAA,EAAS;AAAA,UACrB,MAAA,EAAQ,UAAA;AAAA,UACR,KAAA,EAAO,IAAA;AAAA,UACP,cAAA,EAAgB,WAAA,CAAY,GAAA,CAAI,QAAA,EAAS;AAAA,UACzC,SAAA,EAAW,QAAQ,KAAA,CAAM;AAAA,SAC5B,CAAA;AAAA,MACL;AAAA,IACJ;AAIA,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY;AACvC,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,yBAAA,CAA0B,WAAA,EAAa,IAAI,CAAA;AACvE,MAAA,IAAI,cAAA,EAAgB;AAChB,QAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,UACR,GAAG,cAAA;AAAA,UACH,MAAA,EAAQ,KAAK,MAAA,IAAU;AAAA,SAC1B,CAAA;AAAA,MACL;AAAA,IACJ;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,QAAQ,GAAA,EAAyC;AAC7C,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,KAAA,GAAS,GAAA,CAAI,cAAA,CAAe,OAAO,CAAA,CAAE,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,EAAyC,OAAA,IAAW,CAAA;AAC5G,MAAA,IAAA,CAAK,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAAA,IACpC;AAEA,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AACjD,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,OAAO,GAAA,EAAyC;AAC5C,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,OAAO,EAAE,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AACvD,MAAA,IAAI,KAAA,IAAS,KAAA,CAAM,OAAA,KAAY,IAAA,CAAK,kBAAA,EAAoB;AACpD,QAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,KAAA,CAAM,OAAO,CAAA;AAAA,MAC5C;AAAA,IACJ;AAEA,IAAA,MAAM,oBAAoB,IAAA,CAAK,MAAA,CAAO,WAAW,MAAA,CAAO,CAAA,IAAA,KAAQ,KAAK,oBAAoB,CAAA;AACzF,IAAA,IAAA,CAAK,gBAAA,CAAiB,KAAK,iBAAiB,CAAA;AAC5C,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA0C;AAChD,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA8B;AAAA,EACxC;AAAA,EAEQ,gBAAA,CAAiB,KAAuB,KAAA,EAA8B;AAC1E,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,kBAAA,CAAmB,GAAA,EAAK,IAAI,CAAA;AACxD,MAAA,IAAI,CAAC,cAAA,EAAgB;AAErB,MAAA,MAAM,gBAAA,GAA4B;AAAA,QAC9B,GAAG,cAAA;AAAA,QACH,MAAA,EAAQ,KAAK,MAAA,IAAU;AAAA,OAC3B;AAEA,MAAA,IAAA,CAAK,sBAAA,CAAuB,KAAK,gBAAgB,CAAA;AAAA,IACrD;AAAA,EACJ;AAAA,EAEQ,gBAAA,CAAiB,KAAuB,KAAA,EAAqB;AACjE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AACvC,IAAA,IAAI,SAAS,MAAA,EAAW;AAExB,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAE1B,IAAA,MAAM,WAAA,GAAuB;AAAA,MACzB,MAAMA,sBAAAA,CAAW,GAAA;AAAA,MACjB,KAAA,EAAO,KAAK,QAAA,EAAS;AAAA,MACrB,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,IAAA;AAAA,MACP,cAAA,EAAgB,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MACvC,SAAA,EAAW,IAAI,KAAA,CAAM;AAAA,KACzB;AAEA,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,cAAA,CAAe,mBAAmB,CAAA;AAC7D,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACrB,MAAA,GAAA,CAAI,YAAA,CAAa,mBAAA,EAAqB,CAAC,WAAW,CAAC,CAAA;AAAA,IACvD,CAAA,MAAO;AACH,MAAA,GAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,CAAC,WAAW,CAAC,CAAA;AAAA,IACrD;AAAA,EACJ;AAAA,EAEQ,kBAAA,CAAmB,KAAuB,IAAA,EAA0C;AACxF,IAAA,OAAO,IAAA,CAAK,yBAAA,CAA0B,GAAA,CAAI,KAAA,EAAO,IAAI,CAAA;AAAA,EACzD;AAAA,EAEQ,yBAAA,CAA0B,OAAkB,IAAA,EAA0C;AAC1F,IAAA,MAAM,MAAA,GAAS,MAAM,YAAA,EAAa;AAElC,IAAA,KAAA,MAAW,YAAY,MAAA,EAAQ;AAC3B,MAAA,IAAI,QAAA,CAAS,GAAA,KAAQ,gBAAA,IAAoB,QAAA,CAAS,QAAQ,mBAAA,EAAqB;AAC/E,MAAA,IAAI,IAAA,CAAK,SAAA,IAAa,QAAA,CAAS,GAAA,KAAQ,KAAK,SAAA,EAAW;AAEvD,MAAA,MAAM,KAAA,GAAQ,SAAS,OAAA,CAAQ,IAAA,CAAK,YAAU,MAAA,CAAO,IAAA,KAAS,KAAK,UAAU,CAAA;AAC7E,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACtB;AAEA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEQ,sBAAA,CAAuB,KAAuB,MAAA,EAAuB;AACzE,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,cAAA,CAAe,gBAAgB,CAAA;AAE1D,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACvB,MAAA,GAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,CAAC,MAAM,CAAC,CAAA;AACzC,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAA;AAAA,MAChC,CAAA,eAAA,KAAmB,eAAA,CAAgB,IAAA,KAAS,MAAA,CAAO;AAAA,KACvD;AAEA,IAAA,GAAA,CAAI,aAAa,gBAAA,EAAkB,CAAC,GAAG,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,EAC3D;AACJ,CAAA;;;ACpIO,IAAM,eAAN,MAA+C;AAAA,EACjC,MAAA;AAAA,EACT,gBAA+B,EAAC;AAAA,EAExC,YAAY,MAAA,EAAoB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACV,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,QAAQ,MAAA,CAAO,MAAA,KAAW,MAAA,CAAO,IAAA,KAAS,cAAc,IAAA,GAAO,KAAA,CAAA;AAAA,MAC/D,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY;AAAC,KAClC;AAAA,EACJ;AAAA,EAEA,QAAQ,GAAA,EAAyC;AAC7C,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,WAAA,EAAa;AAClC,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU;AAC1C,MAAA,MAAM,cAAc,GAAA,CAAI,SAAA,CAAU,SAAA,EAAkB,CAAC,OAAO,QAAA,KAAa;AACrE,QAAA,QAAA,CAAS,YAAA,CAAa,CAAA,MAAA,EAAS,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAC3C,QAAA,OAAO,CAAC,IAAI,cAAA,EAAgB,CAAA;AAAA,MAChC,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,aAAA,CAAc,KAAK,WAAW,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,OAAO,GAAA,EAAyC;AAC5C,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,UAAA,EAAY;AACjC,MAAA,IAAI,GAAA,CAAI,MAAM,UAAA,EAAY;AACtB,QAAA,OAAO,CAAC,IAAI,cAAA,EAAgB,CAAA;AAAA,MAChC;AACA,MAAA,OAAO,EAAC;AAAA,IACZ;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AACrB,MAAA,OAAO,EAAC;AAAA,IACZ;AAIA,IAAA,IAAI,CAAC,GAAA,CAAI,KAAA,CAAM,UAAA,EAAY;AACvB,MAAA,GAAA,CAAI,aAAa,cAAc,CAAA;AAAA,IACnC;AACA,IAAA,OAAO,CAAC,IAAI,cAAA,EAAgB,CAAA;AAAA,EAChC;AAAA,EAEA,UAAU,IAAA,EAA0C;AAChD,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA8B;AACpC,IAAA,KAAA,MAAW,WAAA,IAAe,KAAK,aAAA,EAAe;AAC1C,MAAA,WAAA,EAAY;AAAA,IAChB;AACA,IAAA,IAAA,CAAK,gBAAgB,EAAC;AAAA,EAC1B;AACJ,CAAA;AC1GO,IAAM,mBAAN,MAAmD;AAAA,EACtD,WAAA,CAA6B,MAAA,GAAyB,EAAC,EAAG;AAA7B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA+B;AAAA,EAA/B,MAAA;AAAA,EAE7B,QAAQ,GAAA,EAAyC;AAC7C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAA;AAChD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,aAAa,KAAA,EAAM;AACnC,IAAA,IAAI,UAAA,EAAY,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAEtC,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpB,MAAA,GAAA,CAAI,UAAA,CAAW,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAS,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,OAAO,GAAA,EAAyC;AAC5C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA;AAC5C,IAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AAEzB,IAAA,MAAM,eAAA,GAAkB,GAAA,CAAI,KAAA,CAAM,cAAA,CAAe,SAAS,CAAA;AAC1D,IAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAC9B,MAAA,GAAA,CAAI,UAAA,CAAW,SAAA,EAAW,CAAC,UAAU,CAAC,CAAA;AACtC,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,gBAAA,GAAmB,eAAA,CAAgB,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAA;AAAA,MAChD,CAAA,MAAA,KAAU,CAAC,IAAA,CAAK,mBAAA,CAAoB,MAAM;AAAA,KAC9C;AAEA,IAAA,GAAA,CAAI,aAAa,SAAA,EAAW,CAAC,GAAG,gBAAA,EAAkB,UAAU,CAAC,CAAA;AAC7D,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA0C;AAChD,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA8B;AAAA,EACxC;AAAA,EAEQ,mBAAmB,GAAA,EAAwC;AAC/D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,IAAI,KAAA,CAAM,KAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,QAAA;AAC7B,IAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,CAAO,aAAA;AAClC,IAAA,MAAM,UAAUC,2BAAAA,CAAgB,KAAA,CAAM,IAAI,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAE9D,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,IAC1D;AAEA,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,QAAA,EAAU,UAAU,CAAC,CAAA;AAAA,IAChE;AAEA,IAAA,IAAI,aAAA,EAAe;AACf,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,aAAA,EAAe,QAAQ,CAAC,CAAA;AAAA,IACnE;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEQ,iBAAiB,GAAA,EAA4C;AACjE,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,gBAAA,KAAqB,KAAA,EAAO,OAAO,MAAA;AAEnD,IAAA,MAAM,gBAAgB,GAAA,CAAI,KAAA,CAAM,cAAA,CAAe,OAAO,EAAE,CAAC,CAAA;AACzD,IAAA,IAAI,CAAC,aAAA,IAAiB,aAAA,CAAc,OAAA,CAAQ,MAAA,KAAW,GAAG,OAAO,MAAA;AAEjE,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAA;AAC1C,IAAA,IAAI,CAAC,UAAA,IAAc,OAAO,UAAA,CAAW,OAAA,KAAY,UAAU,OAAO,MAAA;AAElE,IAAA,MAAM,aAAa,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,OAAA,EAAS,WAAW,KAAK,CAAA;AACxE,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,UAAA,EAAY,OAAO,CAAA;AAAA,EACzD;AAAA,EAEQ,gBAAA,CACJ,GAAA,EACA,IAAA,EACA,IAAA,EACO;AACP,IAAA,OAAO;AAAA,MACH,MAAMD,sBAAAA,CAAW,IAAA;AAAA,MACjB,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,EAAE,IAAA,EAAM,IAAA,EAAK;AAAA,MACpB,cAAA,EAAgB,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MACvC,SAAA,EAAW,IAAI,KAAA,CAAM;AAAA,KACzB;AAAA,EACJ;AAAA,EAEQ,WAAA,CAAY,SAAiB,KAAA,EAAwB;AACzD,IAAA,IAAI,IAAA,CAAK,OAAO,WAAA,EAAa;AACzB,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,OAAA,EAAS,KAAK,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC3B,MAAA,OAAO,CAAA,MAAA,EAAS,OAAO,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,SAAS,OAAO,CAAA,CAAA;AAAA,EAC3B;AAAA,EAEQ,oBAAoB,MAAA,EAA0B;AAClD,IAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,IAAA,OAAO,OAAO,IAAA,KAAS,OAAA;AAAA,EAC3B;AACJ,CAAA;AC3FO,IAAM,0BAAN,MAAwD;AAAA,EAK3D,WAAA,CACqB,UACA,gBAAA,EACnB;AAFmB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AAEjB,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,gBAAA,EAAiB;AAAA,EACtC;AAAA,EALqB,QAAA;AAAA,EACA,gBAAA;AAAA,EANZ,IAAA,GAAO,qBAAA;AAAA,EACP,MAAA;AAAA,EACA,OAAA;AAAA,EAUT,GAAG,OAAA,EAA4C;AAE3C,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,IAAA;AAAA,MAC/B,CAAA,CAAA,KAAK,CAAA,CAAE,GAAA,CAAI,QAAA,OAAe,IAAA,CAAK;AAAA,KACnC;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAGpB,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,cAAA,CAAe,aAAa,CAAA;AAEvD,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,MAAA,KAAW,CAAA,EAAG;AAEpC,MAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC5B,QAAA,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAAA,MACjB;AACA,MAAA,OAAO,EAAC;AAAA,IACZ;AAGA,IAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AAErB,IAAA,MAAM,OAAA,GAAUC,2BAAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACnD,IAAA,KAAA,MAAW,EAAA,IAAM,KAAK,gBAAA,EAAkB;AACpC,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA;AACjC,MAAA,IAAI,SAAA,EAAW;AACX,QAAA,OAAA,CAAQ,KAAA,CAAM,UAAU,OAAO,CAAA;AAAA,MACnC;AAAA,IACJ;AAMA,IAAA,OAAA,CAAQ,YAAA,CAAaD,uBAAW,IAAI,CAAA;AAEpC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAEtB,MAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC5B,QAAA,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAAA,MACjB;AACA,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAEzB,MAAA,YAAA,CAAa,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAAA,IAClC,CAAA,MAAO;AAEH,MAAA,KAAA,CAAM,UAAA,CAAW,IAAI,cAAA,CAAe,aAAA,EAAe,OAAO,CAAC,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,EAAC;AAAA,EACZ;AACJ;;;ACzFO,IAAM,uBAAA,GAA0B;AAKhC,IAAM,gCAAgC,wBAAA,CAAyB;AAUtE,SAAS,iBAAiB,KAAA,EAAyC;AACjE,EAAA,OAAO,CAAC,CAAC,KAAA,IACJ,OAAO,KAAA,KAAU,YACjB,QAAA,IAAY,KAAA,IACZ,KAAA,IAAS,KAAA,IACT,kBAAA,IAAsB,KAAA;AAC7B;AAEA,SAAS,qBAAqB,KAAA,EAAiD;AAC7E,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG,OAAO,KAAA;AACpC,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,MAAM,UAAA,GAAa,OAAO,cAAA,CAAe,UAAA;AACzC,EAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,cAAA,CAAe,gBAAA,IAC1C,oBAAoB,UAAU,CAAA;AACnC,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,UAAA,EAAY,MAAA;AAAA,IACZ,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,GAAA,EAAK,OAAO,cAAA,CAAe,GAAA;AAAA,IAC3B,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,aAAA,EAAe,OAAO,cAAA,CAAe,aAAA;AAAA,IACrC,WAAW,EAAC;AAAA,IACZ,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,YAAA,EAAc,OAAO,cAAA,KAAmB,MAAA,GAAS,SAAS,MAAA,CAAO,cAAA,KAAmB,YAAY,SAAA,GAAY,SAAA;AAAA,IAC5G,WAAA,EAAa,OAAO,cAAA,KAAmB;AAAA,GACzC;AACF;AASO,SAAS,kBAAkB,OAAA,EAAoD;AACpF,EAAA,IAAI,IAAA;AACJ,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,IAAI,CAAA,CAAE,SAAS,uBAAA,IAA2B,CAAA,CAAE,SAAS,OAAO,CAAA,CAAE,UAAU,QAAA,EAAU;AAChF,MAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,CAAA,CAAE,KAAiC,CAAA;AACzE,MAAA,IAAA,GAAO;AAAA,QACL,QAAA;AAAA,QACA,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,QAAQ,CAAA,CAAE;AAAA,OACZ;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AASO,SAAS,sBAAsB,OAAA,EAAuC;AAC3E,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,UAAA;AACjC,EAAA,IAAI,QAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,KAAM,oBAAoB,GAAG,OAAO,oBAAA;AAC1D,EAAA,IAAI,QAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,KAAM,UAAU,GAAG,OAAO,UAAA;AAChD,EAAA,IAAI,QAAQ,KAAA,CAAM,CAAA,CAAA,KAAK,CAAA,KAAM,UAAU,GAAG,OAAO,UAAA;AACjD,EAAA,OAAO,UAAA;AACT;;;ACpCO,SAAS,qBAAA,CAAsB,OAAsB,OAAA,EAA4C;AACtG,EAAA,MAAM,EAAE,QAAA,EAAU,SAAA,GAAY,KAAA,EAAO,KAAA,GAAQ,OAAM,GAAI,OAAA;AACvD,EAAA,cAAA,CAAe,KAAA,EAAO,QAAA,EAAU,SAAA,EAAW,KAAK,CAAA;AAClD;AAEA,SAAS,cAAA,CACP,KAAA,EACA,QAAA,EACA,SAAA,EACA,KAAA,EACM;AAEN,EAAA,MAAM,mBAAA,GAAsB,KAAA,CAAM,SAAA,EAAW,WAAA,EAAY;AACzD,EAAA,IAAI,mBAAA,KAAwB,QAAA,IAAY,mBAAA,KAAwB,UAAA,EAAY;AAC1E,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,IAAI,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,iDAAA,EAAoD,KAAA,CAAM,GAAG,CAAA,CAAE,CAAA;AACtF,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,YAAA,EAAa,CAAE,IAAA;AAAA,IAC9C,CAAA,GAAA,KAAO,IAAI,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,uBAAuB;AAAA,GAC3E;AAEA,EAAA,IAAI,kBAAA,IAAsB,CAAC,SAAA,EAAW;AACpC,IAAA,IAAI,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,oDAAA,EAAuD,KAAK,CAAA,CAAE,CAAA;AACrF,IAAA;AAAA,EACF;AACA,EAAA,IAAI;AAQJ,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,IAAA,MAAM,WAAA,GAAc,SAAS,MAAA,CAAO,KAAA;AACpC,IAAA,IAAI,eAAe,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,SAAS,CAAA,EAAG;AACpD,MAAA,KAAA,CAAM,WAAW,WAAW,CAAA;AAAA,IAChC;AAEE,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,CAAQ,GAAA,CAAI,uCAAuC,KAAK,CAAA,QAAA,EAAM,SAAS,KAAK,CAAA,OAAA,EAAU,QAAA,CAAS,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACvG;AAGA,IAAA,MAAM,gBAAA,GAA4B;AAAA,MAChC,IAAA,EAAM,uBAAA;AAAA,MACN,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,KAAA,EAAO,QAAA;AAAA,MACP,MAAA,EAAQ,UAAA;AAAA,MACR,SAAA,sBAAe,IAAA;AAAK,KACtB;AAGA,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,2BAAA,CAA4B,SAAS,CAAA;AAClE,IAAA,MAAM,cAA2C,cAAA,CAAe,IAAA;AAAA,MAAK,CAAA,GAAA,KACnE,IAAI,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,uBAAuB;AAAA,KACpE;AAEA,IAAA,IAAI,eAAe,SAAA,EAAW;AAE5B,MAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,OAAA,CAAQ,OAAA,EAAQ;AACpD,MAAA,MAAM,WAAW,eAAA,CAAgB,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,uBAAuB,CAAA;AAC/E,MAAA,QAAA,CAAS,KAAK,gBAAgB,CAAA;AAC9B,MAAA,WAAA,CAAY,OAAO,QAAQ,CAAA;AAAA,IAC7B,CAAA,MAAA,IAAW,CAAC,WAAA,EAAa;AAEvB,MAAA,MAAM,WAAW,IAAI,cAAA,CAAe,gBAAA,EAAkB,CAAC,gBAAgB,CAAC,CAAA;AACxE,MAAA,KAAA,CAAM,WAAW,QAAQ,CAAA;AAAA,IAC3B;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,6CAAA,EAAgD,KAAK,CAAA,EAAA,CAAA,EAAM,GAAG,CAAA;AAAA,EAC9E;AACF;;;AC5HO,IAAM,4BAAN,MAA0D;AAAA,EAG7D,WAAA,CACoB,YAAA,EACA,OAAA,GAAiC,EAAC,EACpD;AAFkB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAChB;AAAA,EAFgB,YAAA;AAAA,EACA,OAAA;AAAA,EAJX,IAAA,GAAO,wBAAA;AAAA,EAOhB,GAAG,OAAA,EAA4C;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,YAAA,CAAa,WAAW,CAAA,EAAG;AACtD,MAAA,OAAO,EAAC;AAAA,IACZ;AAGA,IAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,KAAK,YAAY,CAAA;AAC/D,IAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAC9B,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,IAAI;AAEA,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,iBAAiB,OAAO,CAAA;AAElE,MAAA,IAAI,CAAC,aAAA,EAAe;AAChB,QAAA,OAAO,EAAC;AAAA,MACZ;AAGA,MAAA,IAAI,OAAA,CAAQ,kBAAkB,cAAA,EAAgB;AAC1C,QAAA,qBAAA,CAAsB,aAAA,EAAe;AAAA,UACjC,QAAA,EAAU,QAAQ,gBAAA,CAAiB;AAAA,SACtC,CAAA;AAAA,MACL;AAGA,MAAA,OAAO,CAAC,IAAI,eAAA,CAAgB,aAAA,EAAe,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IAC5D,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,iDAAiD,KAAK,CAAA;AACpE,MAAA,OAAO,EAAC;AAAA,IACZ;AAAA,EACJ;AACJ;;;AChCO,IAAM,sBAAN,MAAoD;AAAA,EAGvD,WAAA,CACoB,UAAA,EACA,KAAA,GAAgB,MAAA,EAClC;AAFkB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EAChB;AAAA,EAFgB,UAAA;AAAA,EACA,KAAA;AAAA,EAJX,IAAA,GAAO,iBAAA;AAAA,EAOhB,GAAG,OAAA,EAA4C;AAC3C,IAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,OAAA,EAAS;AAAA,MACrC,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,OAAO,IAAA,CAAK;AAAA,KACf,CAAA;AACD,IAAA,OAAO,CAAC,IAAI,eAAA,CAAgB,SAAS,CAAC,CAAA;AAAA,EAC1C;AACJ;;;ACIO,IAAM,sBAAA,GAAN,MAAM,uBAAA,CAAmD;AAAA,EAO5D,YAA6B,MAAA,EAA8B;AAA9B,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAgC;AAAA,EAAhC,MAAA;AAAA,EAN7B,OAAwB,mBAAA,GAAsB,GAAA;AAAA,EAEtC,UAAA,GAAa,CAAA;AAAA,EACb,oBAAA,GAAuB,KAAA;AAAA,EACvB,SAAA,GAA2C,MAAA;AAAA,EAInD,QAAQ,GAAA,EAAyC;AAC7C,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,oBAAA,GAAuB,KAAA;AAI5B,IAAA,GAAA,CAAI,kBAAkB,gBAAgB,CAAA;AAEtC,IAAA,MAAM,UAA4B,EAAC;AAEnC,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,KAAe,MAAA,EAAW;AACtC,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AACvC,MAAA,GAAA,CAAI,UAAA,CAAW,OAAA,EAAS,CAAC,IAAI,kBAAA;AAAA,QACzB,KAAK,MAAA,CAAO,UAAA;AAAA,QACZ,KAAK,MAAA,CAAO,WAAA;AAAA,QACZ,OAAA;AAAA,QACA,IAAI,KAAA,CAAM;AAAA,OACb,CAAC,CAAA;AAAA,IACN;AAGA,IAAA,IAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AACxB,MAAA,GAAA,CAAI,SAAA,CAAU,gBAAA,EAAyB,CAAC,MAAA,EAAQ,IAAA,KAAS;AAIrD,QAAA,IAAI,IAAA,CAAK,SAAA,KAAc,MAAA,EAAQ,OAAO,EAAC;AAEvC,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA;AAC5C,QAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,QAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,QAAA,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAC5B,QAAA,OAAO,cAAA;AAAA,MACX,CAAA,EAAG,EAAE,KAAA,EAAO,QAAA,EAAU,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,IAAA,CAAK,OAAO,WAAA,EAAa;AACzB,MAAA,IAAI,IAAA,CAAK,gBAAgB,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,iBAAA,CAAkB,GAAA,EAAK,KAAK,MAAA,CAAO,WAAA,CAAY,CAAC,CAAC,CAAC,CAAA;AAAA,MACxE;AACA,MAAA,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAC5B,MAAA,OAAO,OAAA;AAAA,IACX;AAEA,IAAA,IAAI,IAAA,CAAK,kBAAkB,CAAA,EAAG;AAC1B,MAAA,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAC5B,MAAA,OAAO,OAAA;AAAA,IACX;AAEA,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA;AAC7C,IAAA,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAC5B,IAAA,OAAO,CAAC,GAAG,OAAA,EAAS,GAAG,eAAe,CAAA;AAAA,EAC1C;AAAA,EACA,OAAO,GAAA,EAAyC;AAC5C,IAAA,IAAA,CAAK,oBAAA,GAAuB,KAAA;AAE5B,IAAA,IAAI,GAAA,CAAI,MAAM,UAAA,EAAY;AACtB,MAAA,MAAMmB,QAAAA,GAAU,CAAC,IAAA,CAAK,iBAAA,CAAkB,GAAG,CAAC,CAAA;AAC5C,MAAA,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAC5B,MAAA,OAAOA,QAAAA;AAAA,IACX;AAEA,IAAA,MAAM,UAA4B,EAAC;AAKnC,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,UAAA,KAAe,MAAA,EAAW;AACtC,MAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,OAAO,EAAE,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AACvD,MAAA,IAAI,OAAO,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,OAAA,GAAU,MAAM,KAAA,EAAO;AAC3D,QAAA,GAAA,CAAI,aAAa,kBAAkB,CAAA;AACnC,QAAA,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAC5B,QAAA,OAAO,CAAC,IAAI,cAAA,EAAgB,CAAA;AAAA,MAChC;AAAA,IACJ;AAEA,IAAA,IAAI,IAAA,CAAK,cAAc,QAAA,EAAU;AAC7B,MAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAIjB,MAAA,IAAI,IAAA,CAAK,OAAO,UAAA,EAAY;AACxB,QAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAA,CAAK,YAAA,CAAa,GAAG,CAAC,CAAA;AACtC,QAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAIlB,QAAA,GAAA,CAAI,SAAA,CAAU;AAAA,UACV,IAAA,EAAM,aAAA;AAAA,UACN,SAAA,EAAW,IAAI,KAAA,CAAM,WAAA;AAAA,UACrB,MAAM,EAAE,QAAA,EAAU,IAAI,KAAA,CAAM,GAAA,CAAI,UAAS;AAAE,SAC9C,CAAA;AAAA,MACL;AAAA,IACJ;AACA,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,aAAA,EAAe;AACvC,MAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAGvB,QAAA,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAC5B,QAAA,GAAA,CAAI,YAAA;AAAA,UACA,IAAA,CAAK,aAAA,EAAc,GAAI,kBAAA,GAAqB;AAAA,SAChD;AACA,QAAA,OAAO,CAAC,IAAA,CAAK,iBAAA,CAAkB,GAAG,CAAC,CAAA;AAAA,MACvC;AAIA,MAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA,EAAG;AAC5B,QAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,uBAAA,CAAwB,GAAG,CAAA;AACvD,QAAA,MAAM,WAAA,GAAgC;AAAA,UAClC,IAAI,mBAAA,CAAoB,cAAA,EAAgB,MAAM,CAAA;AAAA,UAC9C,KAAK,iBAAA,CAAkB,GAAA,EAAK,KAAK,MAAA,CAAO,WAAA,CAAY,CAAC,CAAC;AAAA,SAC1D;AACA,QAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AACjB,QAAA,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAC5B,QAAA,OAAO,CAAC,GAAG,OAAA,EAAS,GAAG,WAAW,CAAA;AAAA,MACtC;AAGA,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAA,CAAK,YAAA,CAAa,GAAG,CAAC,CAAA;AACtC,MAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAAA,IACtB;AAEA,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,YAAA,CAAa,GAAG,CAAA;AAC7C,IAAA,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAC5B,IAAA,OAAO,CAAC,GAAG,OAAA,EAAS,GAAG,eAAe,CAAA;AAAA,EAC1C;AAAA,EAEA,UAAU,IAAA,EAA0C;AAChD,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA8B;AACpC,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAAA,EACrB;AAAA,EAEA,IAAI,mBAAA,GAA+B;AAC/B,IAAA,OAAO,IAAA,CAAK,cAAc,IAAA,CAAK,aAAA;AAAA,EACnC;AAAA,EAEA,IAAI,oBAAA,GAAgC;AAChC,IAAA,OAAO,IAAA,CAAK,mBAAA,IAAuB,CAAC,IAAA,CAAK,oBAAA;AAAA,EAC7C;AAAA,EAEA,IAAI,aAAA,GAAwB;AACxB,IAAA,OAAO,IAAA,CAAK,OAAO,WAAA,CAAY,MAAA;AAAA,EACnC;AAAA,EAEQ,aAAa,GAAA,EAAyC;AAC1D,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,aAAA,EAAe;AACvC,MAAA,OAAO,CAAC,IAAA,CAAK,iBAAA,CAAkB,GAAG,CAAC,CAAA;AAAA,IACvC;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,KAAK,UAAU,CAAA;AACzD,IAAA,IAAA,CAAK,UAAA,EAAA;AACL,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAE5B,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,KAAK,UAAU,CAAA;AAC7D,IAAA,OAAO;AAAA,MACH,IAAI,0BAA0B,SAAS,CAAA;AAAA,MACvC,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,aAAa;AAAA,KAC7C;AAAA,EACJ;AAAA,EAEQ,WAAW,GAAA,EAAgC;AAC/C,IAAA,IAAI,IAAI,KAAA,CAAM,UAAA,IAAc,CAAC,IAAA,CAAK,eAAc,EAAG;AAC/C,MAAA,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,gBAAA,EAAiB;AACxC,IAAA,IAAI,cAAc,QAAA,EAAU;AACxB,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,IAAI,cAAc,cAAA,EAAgB;AAC9B,MAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,MAAM,EAAE,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA;AACzD,MAAA,IAAI,CAAC,KAAA,EAAO;AACR,QAAA,OAAO,KAAA;AAAA,MACX;AAEA,MAAA,IAAI,KAAA,CAAM,SAAA,KAAc,MAAA,IAAU,KAAA,CAAM,UAAA,EAAY;AAChD,QAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,GAAG,CAAA,GAAI,CAAA;AAAA,MAC/C;AAEA,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,OAAO,EAAE,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AACvD,IAAA,IAAI,CAAC,KAAA,EAAO;AACR,MAAA,OAAO,KAAA;AAAA,IACX;AACA,IAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC3B,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,OAAO,KAAA,CAAM,UAAU,KAAA,CAAM,KAAA;AAAA,EACjC;AAAA,EAEQ,iBAAiB,GAAA,EAAgC;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY;AACzB,MAAA,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,MAAM,EAAE,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA;AACzD,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,cAAc,MAAA,IAAU,CAAC,MAAM,UAAA,EAAY;AAC3D,MAAA,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,uBAAA,CAAwB,GAAG,CAAA;AACpD,IAAA,IAAI,WAAA,GAAc,wBAAuB,mBAAA,EAAqB;AAC1D,MAAA,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,IAAI,WAAA,IAAe,MAAM,UAAA,EAAY;AACjC,MAAA,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,wBAAwB,GAAA,EAA+B;AAC3D,IAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,MAAM,EAAE,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA;AACzD,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,cAAc,MAAA,IAAU,CAAC,MAAM,UAAA,EAAY;AAC3D,MAAA,OAAO,CAAA;AAAA,IACX;AAEA,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,WAAA,CAAY,OAAA,EAAQ;AAC1C,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,KAAA,EAAO,GAAG,CAAA;AAC3C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,aAAa,OAAO,CAAA;AAAA,EACjD;AAAA,EAEQ,oBAAoB,GAAA,EAA6B;AACrD,IAAA,MAAM,MAAA,GAA8B;AAAA,MAChC,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,eAAe,IAAA,CAAK,aAAA;AAAA,MACpB,aAAa,IAAA,CAAK,mBAAA;AAAA,MAClB,cAAc,IAAA,CAAK;AAAA,KACvB;AACA,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,cAAA,CAAe,iBAAiB,EAAE,CAAC,CAAA;AACxD,IAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,CAAC,CAAA,EAAG;AACtB,MAAA,GAAA,CAAI,YAAA,CAAa,iBAAA,EAAmB,CAAC,EAAC,GAAG,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA,EAAO,MAAA,EAAO,CAAC,CAAA;AAAA,IACjF,CAAA,MAAO;AACH,MAAA,GAAA,CAAI,UAAA,CAAW,iBAAA,EAAmB,CAAC,EAAC,IAAA,EAAM,CAAA,EAAU,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,SAAA,EAAkB,KAAA,EAAO,MAAA,EAAO,CAAC,CAAA;AAAA,IAC5G;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,aAAa,GAAA,EAAyC;AAC1D,IAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,OAAO,EAAE,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AACvD,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAMpB,IAAA,IAAI,MAAM,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,OAAA,IAAW,MAAM,KAAA,EAAO;AAC3D,MAAA,GAAA,CAAI,aAAa,kBAAkB,CAAA;AACnC,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AACvC,IAAA,MAAM,SAAA,GAAY,MAAM,OAAA,GAAU,CAAA;AAClC,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AAEpB,IAAA,MAAM,gBAAgB,IAAI,kBAAA;AAAA,MACtB,SAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAI,KAAA,CAAM;AAAA,KACd;AAEA,IAAA,GAAA,CAAI,YAAA,CAAa,OAAA,EAAS,CAAC,aAAa,CAAC,CAAA;AACzC,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEQ,iBAAA,CAAkB,KAAuB,SAAA,EAA+C;AAC5F,IAAA,OAAO,IAAI,uBAAA;AAAA,MACP,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MACvB,aAAa;AAAC,KAClB;AAAA,EACJ;AAAA,EAEQ,aAAA,GAAyB;AAC7B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,MAAA,EAAW;AAChC,MAAA,OAAO,KAAA;AAAA,IACX;AACA,IAAA,IAAI,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,KAAS,SAAA,EAAW;AACvC,MAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,IACvB;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,gBAAA,GAAgD;AACpD,IAAA,IAAI,OAAO,KAAK,MAAA,CAAO,IAAA,KAAS,YAAY,IAAA,CAAK,MAAA,CAAO,KAAK,SAAA,EAAW;AACpE,MAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,SAAA;AAAA,IAC5B;AACA,IAAA,OAAO,cAAA;AAAA,EACX;AACJ,CAAA;AC3UO,IAAM,gBAAN,MAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS5C,WAAA,CACW,KAAA,EACA,cAAA,EACA,SAAA,EACT;AAHS,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EACR;AAAA,EAHQ,KAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EAXF,OAAOnB,sBAAAA,CAAW,OAAA;AAAA,EAClB,MAAA,GAAuB,UAAA;AAAA;AAAA,EAchC,IAAI,KAAA,GAAgB;AAClB,IAAA,OAAO,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,EAClC;AACF,CAAA;ACjBO,IAAM,cAAN,MAAqC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS1C,WAAA,CACW,KAAA,EACA,cAAA,EACA,SAAA,EACT;AAHS,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EACR;AAAA,EAHQ,KAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EAXF,OAAOA,sBAAAA,CAAW,KAAA;AAAA,EAClB,MAAA,GAAuB,UAAA;AAAA;AAAA,EAchC,IAAI,KAAA,GAAgB;AAClB,IAAA,OAAO,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,EAClC;AACF,CAAA;AClBO,IAAM,WAAA,GAAN,MAAM,YAAA,CAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS1C,WAAA,CACW,KAAA,EACA,cAAA,EACA,SAAA,EACT;AAHS,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EACR;AAAA,EAHQ,KAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EAXF,OAAOA,sBAAAA,CAAW,KAAA;AAAA,EAClB,MAAA,GAAuB,SAAA;AAAA;AAAA,EAchC,IAAI,KAAA,GAA0C;AAC5C,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,KAAA,GAAgB;AAClB,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,OAAA;AACpC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACzB,MAAA,IAAI,IAAA,CAAK,OAAA,KAAY,IAAA,CAAK,KAAA,EAAO;AAC/B,QAAA,OAAO,YAAA,CAAY,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AAAA,MACjD;AACA,MAAA,OAAO,CAAA,EAAG,YAAA,CAAY,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAC,CAAA,QAAA,EAAM,YAAA,CAAY,eAAA,CAAgB,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,GAAA,EAAK,CAAC,CAAA,CAAA;AAAA,IAChH;AACA,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,MAAA,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,MAAA,GAAkB;AACpB,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACpC,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,gBAAgB,OAAA,EAAyB;AAC9C,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,OAAO,CAAA;AAC1B,IAAA,MAAM,CAAA,GAAI,EAAE,QAAA,EAAS,CAAE,UAAS,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACjD,IAAA,MAAM,CAAA,GAAI,EAAE,UAAA,EAAW,CAAE,UAAS,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACnD,IAAA,MAAM,CAAA,GAAI,EAAE,UAAA,EAAW,CAAE,UAAS,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACnD,IAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA,CAAA;AAAA,EACvB;AACF,CAAA;ACxDO,IAAM,mBAAN,MAA0C;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ/C,WAAA,CACW,OACA,cAAA,EACT;AAFS,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EACR;AAAA,EAFQ,KAAA;AAAA,EACA,cAAA;AAAA,EATF,OAAOA,sBAAAA,CAAW,UAAA;AAAA,EAClB,MAAA,GAAuB,SAAA;AAAA;AAAA,EAYhC,IAAI,SAAA,GAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,KAAA,GAAgB;AAClB,IAAA,OAAO,IAAA,CAAK,MAAM,WAAA,EAAY;AAAA,EAChC;AACF,CAAA;;;ACjBO,IAAM,uBAAN,MAAuD;AAAA,EAG1D,WAAA,CACqB,MAAA,GAA6B,EAAC,EAC9B,OAAqB,YAAA,EACxC;AAFmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EACjB;AAAA,EAFiB,MAAA;AAAA,EACA,IAAA;AAAA,EAJb,gBAAA;AAAA,EAOR,QAAQ,GAAA,EAAyC;AAC7C,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,MAAA,CAAO,kBAAA,IAAsB,KAAA;AAC5D,IAAA,IAAI,iBAAA,EAAmB;AACnB,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,uBAAA,CAAwB,GAAG,CAAA;AACzD,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,qBAAA,CAAsB,GAAG,CAAA;AACrD,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,cAAA,CAAe,gBAAA,EAAkB,cAAc,CAAA;AAE5E,MAAA,GAAA,CAAI,UAAA,CAAW,SAAA,EAAW,eAAA,CAAgB,OAAA,EAAQ,EAAG;AAAA,QACjD,KAAA,EAAO,IAAA,CAAK,WAAA,CAAY,GAAG;AAAA,OAC9B,CAAA;AAAA,IACL;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,OAAO,EAAE,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AACvD,IAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,MAAA,CAAO,cAAA,IAAkB,CAAC,CAAC,KAAA;AAC7D,IAAA,IAAI,wBAAwB,KAAA,KAAU,KAAA,CAAM,UAAU,MAAA,IAAa,KAAA,CAAM,QAAQ,CAAA,CAAA,EAAI;AACjF,MAAA,IAAA,CAAK,mBAAmB,KAAA,CAAM,OAAA;AAC9B,MAAA,GAAA,CAAI,UAAA,CAAW,aAAa,IAAA,CAAK,uBAAA,CAAwB,KAAK,KAAK,CAAA,CAAE,SAAQ,EAAG;AAAA,QAC5E,KAAA,EAAO,IAAA,CAAK,gBAAA,CAAiB,KAAK;AAAA,OACrC,CAAA;AAAA,IACL;AAEA,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,OAAO,GAAA,EAAyC;AAC5C,IAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,OAAO,EAAE,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AACvD,IAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,MAAA,CAAO,cAAA,IAAkB,CAAC,CAAC,KAAA;AAC7D,IAAA,IAAI,CAAC,wBAAwB,CAAC,KAAA,IAAU,MAAM,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,KAAA,IAAS,CAAA,EAAI;AACpF,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,IAAI,MAAM,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,OAAA,GAAU,MAAM,KAAA,EAAO;AAC1D,MAAA,OAAO,EAAC;AAAA,IACZ;AAOA,IAAA,IAAI,KAAK,gBAAA,KAAqB,MAAA,IAAa,KAAA,CAAM,OAAA,KAAY,KAAK,gBAAA,EAAkB;AAChF,MAAA,OAAO,EAAC;AAAA,IACZ;AAEA,IAAA,IAAA,CAAK,mBAAmB,KAAA,CAAM,OAAA;AAC9B,IAAA,GAAA,CAAI,UAAA,CAAW,aAAa,IAAA,CAAK,uBAAA,CAAwB,KAAK,KAAK,CAAA,CAAE,SAAQ,EAAG;AAAA,MAC5E,KAAA,EAAO,IAAA,CAAK,gBAAA,CAAiB,KAAK;AAAA,KACrC,CAAA;AAED,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,GAAA,EAAyC;AAC/C,IAAA,MAAM,KAAA,GAAQ,UAAU,GAAG,CAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,OAAO,EAAE,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AACvD,IAAA,MAAM,wBAAA,GAA2B,IAAA,CAAK,MAAA,CAAO,kBAAA,IAAsB,IAAA;AAGnE,IAAA,IAAI,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,WAAA;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AACpB,MAAA,IAAI,GAAA,CAAI,KAAA,CAAM,SAAA,KAAc,aAAA,EAAe;AACvC,QAAA,eAAA,GAAkB,mBAAA;AAAA,MACtB,WAAW,KAAA,IAAS,KAAA,CAAM,UAAU,MAAA,IAAa,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC9D,QAAA,eAAA,GAAkB,CAAA,UAAA,EAAa,MAAM,KAAK,CAAA,SAAA,CAAA;AAAA,MAC9C,CAAA,MAAA,IAAW,KAAA,IAAS,KAAA,CAAM,OAAA,GAAU,CAAA,EAAG;AAEnC,QAAA,eAAA,GAAkB,CAAA,UAAA,EAAa,MAAM,OAAO,CAAA,SAAA,CAAA;AAAA,MAChD;AAAA,IACJ;AAEA,IAAA,IAAI,wBAAA,EAA0B;AAC1B,MAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,KAAA,CAAM,cAAA,CAAe,gBAAgB,CAAA;AAC/D,MAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAE1B,QAAA,MAAM,eAAe,IAAA,CAAK,uBAAA;AAAA,UACtB,GAAA;AAAA,UACA,KAAA;AAAA,UACA,aAAA,CAAc,GAAA,CAAI,CAAA,GAAA,KAAO,GAAA,CAAI,OAAO,CAAA;AAAA,UACpC;AAAA,SACJ;AACA,QAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,YAAY,CAAA;AACxC,QAAA,OAAO,EAAC;AAAA,MACZ;AAAA,IACJ;AAEA,IAAA,MAAM,eAAA,GAAkB,2BAClB,IAAA,CAAK,kBAAA,CAAmB,KAAK,KAAA,EAAO,eAAe,IACnDC,2BAAAA,CAAgB,IAAA;AAAA,MACd,CAAC,IAAI,gBAAA,CAAiB,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,EAAG,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,CAAC,CAAA;AAAA,MAChE,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA;AAAS,KAC3B;AAEJ,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,eAAe,CAAA;AAE3C,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA8B;AAAA,EAExC;AAAA,EAEQ,wBAAwB,GAAA,EAAwC;AACpE,IAAA,MAAM,UAAUA,2BAAAA,CAAgB,KAAA,CAAM,IAAI,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAC9D,IAAA,KAAA,MAAW,GAAA,IAAO,GAAA,CAAI,KAAA,CAAM,cAAA,CAAe,gBAAgB,CAAA,EAAG;AAC1D,MAAA,OAAA,CAAQ,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEQ,sBAAsB,GAAA,EAAwC;AAClE,IAAA,MAAM,UAAUA,2BAAAA,CAAgB,KAAA,CAAM,IAAI,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAC9D,IAAA,KAAA,MAAW,GAAA,IAAO,IAAI,KAAA,CAAM,cAAA,CAAe,OAAO,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AAC9E,IAAA,KAAA,MAAW,GAAA,IAAO,IAAI,KAAA,CAAM,cAAA,CAAe,MAAM,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA;AAC7E,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEQ,cAAA,CAAe,kBAAmC,cAAA,EAAkD;AACxG,IAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,EAAE,CAAC,CAAA;AAC7E,IAAA,MAAM,uBAAuB,cAAA,CAAe,MAAA;AAAA,MACxC,CAAA,CAAA,KAAK,CAAC,YAAA,CAAa,GAAA,CAAI,CAAA,EAAG,EAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAE;AAAA,KAChD;AACA,IAAA,OAAO,gBAAA,CAAiB,KAAA,EAAM,CAAE,GAAA,CAAI,GAAG,oBAAoB,CAAA;AAAA,EAC/D;AAAA,EAEQ,uBAAA,CAAwB,KAAuB,KAAA,EAAoC;AACvF,IAAA,MAAM,OAAA,GAAUA,4BAAgB,KAAA,CAAM,GAAA,CAAI,MAAM,GAAA,CAAI,QAAA,EAAU,CAAA,CAAE,GAAA;AAAA,MAC5D,IAAI,kBAAA;AAAA,QACA,KAAA,CAAM,OAAA;AAAA,QACN,KAAA,CAAM,KAAA;AAAA,QACN,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,QACvB,IAAI,KAAA,CAAM;AAAA;AACd,KACJ;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAU,GAAG,CAAA;AAC3B,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,WAAA,CAAY,OAAA,EAAQ;AAC5C,MAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,KAAA,EAAO,KAAK,CAAA;AAC7C,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,aAAA,CAAc,OAAA,EAAS,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS,EAAG,GAAA,CAAI,KAAA,CAAM,WAAW,CAAC,CAAA;AAEvF,MAAA,IAAI,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,IAAI,IAAI,WAAA,CAAY,CAAC,GAAG,MAAM,KAAK,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,IAAI,QAAA,EAAS,EAAG,GAAA,CAAI,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,MAClG;AAAA,IACJ;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEQ,kBAAA,CACJ,GAAA,EACA,KAAA,EACA,gBAAA,EACe;AACf,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,WAAA;AACtB,IAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,OAAO,EAAE,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AAEvD,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,KAAA,EAAO,KAAK,CAAA;AAC7C,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA;AAClC,MAAA,MAAM,WAAW,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA;AACnD,MAAA,MAAM,OAAA,GAAU,SAAS,KAAA,IAAS,KAAA;AAClC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,UAAU,CAAA;AAE9C,MAAA,MAAMmB,QAAAA,GAAUnB,2BAAAA,CAAgB,KAAA,CAAM,QAAQ,CAAA,CAAE,GAAA;AAAA,QAC5C,IAAI,aAAA,CAAc,OAAA,EAAS,QAAA,EAAU,GAAG,CAAA;AAAA,QACxC,IAAI,WAAA,CAAY,KAAA,EAAO,QAAA,EAAU,GAAG,CAAA;AAAA,QACpC,IAAI,YAAY,CAAC,GAAG,MAAM,KAAK,CAAA,EAAG,UAAU,GAAG,CAAA;AAAA,QAC/C,IAAI,gBAAA,CAAiB,IAAA,CAAK,IAAA,CAAK,GAAA,IAAO,QAAQ;AAAA,OAClD;AACA,MAAA,IAAI,KAAA,EAAO;AACP,QAAAmB,QAAAA,CAAQ,GAAA,CAAI,IAAI,kBAAA,CAAmB,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,KAAA,EAAO,QAAA,EAAU,GAAA,EAAK,gBAAgB,CAAC,CAAA;AAAA,MACnG;AACA,MAAA,OAAOA,QAAAA;AAAA,IACX;AAEA,IAAA,MAAM,cAAA,GAAiB,IAAI,QAAA,CAAS,KAAA,EAAO,KAAK,CAAA;AAChD,IAAA,MAAM,OAAA,GAAUnB,2BAAAA,CAAgB,KAAA,CAAM,QAAQ,CAAA,CAAE,GAAA;AAAA,MAC5C,IAAI,aAAA,CAAc,CAAA,EAAG,QAAA,EAAU,GAAG,CAAA;AAAA,MAClC,IAAI,WAAA,CAAY,CAAA,EAAG,QAAA,EAAU,GAAG,CAAA;AAAA,MAChC,IAAI,WAAA,CAAY,CAAC,cAAc,CAAA,EAAG,UAAU,GAAG,CAAA;AAAA,MAC/C,IAAI,gBAAA,CAAiB,IAAA,CAAK,IAAA,CAAK,GAAA,IAAO,QAAQ;AAAA,KAClD;AACA,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,kBAAA,CAAmB,KAAA,CAAM,OAAA,EAAS,MAAM,KAAA,EAAO,QAAA,EAAU,GAAA,EAAK,gBAAgB,CAAC,CAAA;AAAA,IACnG;AACA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEQ,uBAAA,CACJ,GAAA,EACA,KAAA,EACA,MAAA,EACA,gBAAA,EACiB;AACjB,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,WAAA;AACtB,IAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,EAAQ;AAC1B,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe,OAAO,EAAE,CAAC,CAAA,EAAG,QAAQ,CAAC,CAAA;AAEvD,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA,EAAG;AACpC,MAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AACzB,QAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,KAAA,EAAM,CAAE,GAAA;AAAA,UACjC,IAAI,aAAA,CAAc,CAAA,EAAG,QAAA,EAAU,GAAG,CAAA;AAAA,UAClC,IAAI,WAAA,CAAY,CAAA,EAAG,QAAA,EAAU,GAAG,CAAA;AAAA,UAChC,IAAI,WAAA,CAAY,CAAC,IAAI,QAAA,CAAS,OAAO,KAAK,CAAC,CAAA,EAAG,QAAA,EAAU,GAAG,CAAA;AAAA,UAC3D,IAAI,gBAAA,CAAiB,IAAA,CAAK,IAAA,CAAK,GAAA,IAAO,QAAQ;AAAA,SAClD;AACA,QAAA,IAAI,KAAA,EAAO;AACP,UAAA,cAAA,CAAe,GAAA,CAAI,IAAI,kBAAA,CAAmB,KAAA,CAAM,OAAA,EAAS,MAAM,KAAA,EAAO,QAAA,EAAU,GAAA,EAAK,gBAAgB,CAAC,CAAA;AAAA,QAC1G;AACA,QAAA,OAAO,cAAA;AAAA,MACX,CAAC,CAAA;AAAA,IACL;AAEA,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,KAAA,EAAO,KAAK,CAAA;AAClD,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA;AAClC,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,EAAE,KAAA,IAAS,KAAA;AAC7D,IAAA,MAAM,gBAAgB,OAAA,GAAU,UAAA;AAGhC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,KAAS;AAChC,MAAA,MAAM,IAAA,GAAO,MACR,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAA,KAASD,sBAAAA,CAAW,OAAO,OAAO,CAAA,CAAE,UAAU,QAAQ,CAAA,CACpE,OAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAO,CAAA,CAAE,OAAkB,CAAC,CAAA;AACpD,MAAA,OAAO,IAAA,GAAO,IAAI,IAAA,GAAO,CAAA;AAAA,IAC7B,CAAC,CAAA;AACD,IAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,GAAG,CAAC,CAAA;AAGzD,IAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,IAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAO,CAAA,KAAM;AAC5B,MAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,MAAA,MAAM,QAAQ,MAAA,GAAS,WAAA;AACvB,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,KAAK,CAAA;AACpD,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,KAAK,CAAA;AAGnD,MAAA,MAAM,aAAa,UAAA,GAAa,eAAA;AAChC,MAAA,MAAM,WAAW,UAAA,GAAa,UAAA;AAC9B,MAAA,eAAA,IAAmB,UAAA;AAEnB,MAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,KAAA,EAAM,CAAE,GAAA;AAAA,QACjC,IAAI,aAAA,CAAc,YAAA,EAAc,QAAA,EAAU,GAAG,CAAA;AAAA,QAC7C,IAAI,WAAA,CAAY,UAAA,EAAY,QAAA,EAAU,GAAG,CAAA;AAAA,QACzC,IAAI,WAAA,CAAY,CAAC,IAAI,QAAA,CAAS,YAAY,QAAQ,CAAC,CAAA,EAAG,QAAA,EAAU,GAAG,CAAA;AAAA,QACnE,IAAI,gBAAA,CAAiB,IAAA,CAAK,IAAA,CAAK,GAAA,IAAO,QAAQ;AAAA,OAClD;AACA,MAAA,IAAI,KAAA,EAAO;AACP,QAAA,cAAA,CAAe,GAAA,CAAI,IAAI,kBAAA,CAAmB,KAAA,CAAM,OAAA,EAAS,MAAM,KAAA,EAAO,QAAA,EAAU,GAAA,EAAK,gBAAgB,CAAC,CAAA;AAAA,MAC1G;AACA,MAAA,OAAO,cAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,iBAAA,CAAkB,KAAuB,eAAA,EAAwC;AACrF,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,cAAA,CAAe,eAAe,CAAA;AACzD,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACrB,MAAA,GAAA,CAAI,YAAA,CAAa,eAAA,EAAiB,eAAA,CAAgB,OAAA,EAAS,CAAA;AAC3D,MAAA;AAAA,IACJ;AAEA,IAAA,GAAA,CAAI,UAAA,CAAW,eAAA,EAAiB,eAAA,CAAgB,OAAA,EAAS,CAAA;AAAA,EAC7D;AAAA,EAEQ,iBAAA,CAAkB,KAAuB,YAAA,EAAuC;AACpF,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,cAAA,CAAe,eAAe,CAAA;AACzD,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AAErB,MAAA;AAAA,IACJ;AAEA,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAC9B,MAAA,GAAA,CAAI,UAAA,CAAW,eAAA,EAAiB,KAAA,CAAM,OAAA,EAAS,CAAA;AAAA,IACnD;AAAA,EACJ;AAAA,EAEQ,YAAY,GAAA,EAA+B;AAC/C,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,GAAA,CAAI,KAAA,CAAM,KAAA;AAAA,EAC1C;AAAA,EAEQ,iBAAiB,KAAA,EAA2B;AAChD,IAAA,OAAO,KAAA,CAAM,KAAA,KAAU,MAAA,GACjB,CAAA,MAAA,EAAS,KAAA,CAAM,OAAO,CAAA,IAAA,EAAO,KAAA,CAAM,KAAK,CAAA,CAAA,GACxC,CAAA,MAAA,EAAS,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,EAChC;AACJ,CAAA;AC3SO,IAAM,cAAN,MAAqC;AAAA,EAMxC,WAAA,CAEoB,KAAA,EAEA,OAAA,EAEhB,OAAA,GAKI,EAAC,EACP;AAVkB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAEA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAShB,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,MAAA,IAAU,SAAA;AAChC,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACT,KAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAU,OAAA,CAAQ;AAAA,KACtB;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,QAAA,KAAa,MAAA,GAC5B,GAAG,KAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAQ,CAAA,CAAA,CAAA,GAC5B,KAAA;AAAA,EACV;AAAA,EApBoB,KAAA;AAAA,EAEA,OAAA;AAAA,EATX,OAAOA,sBAAAA,CAAW,KAAA;AAAA,EAClB,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAyBb,CAAA;;;ACEO,IAAM,mBAAN,MAAmD;AAAA,EACtD,YAAoB,MAAA,EAAwB;AAAxB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA0B;AAAA,EAA1B,MAAA;AAAA,EAEpB,QAAQ,GAAA,EAAyC;AAE7C,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM;AAChC,MAAA,IAAI,GAAA,CAAI,YAAY,OAAA,EAAS;AACzB,QAAA,GAAA,CAAI,WAAW,QAAA,EAAU;AAAA,UACrB,IAAI,WAAA,CAAY,GAAA,CAAI,KAAA,EAAO,OAAO;AAAA,WACnC,EAAE,KAAA,EAAO,UAAU,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,MACvC;AAAA,IACJ;AAIA,IAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,WAAW,CAAA;AAC5E,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC1B,MAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AAEtC,MAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,CAAC,MAAA,EAAQ,OAAA,KAAY;AACvC,QAAA,MAAM,KAAA,GAAQ,UAAU,OAAO,CAAA;AAC/B,QAAA,IAAI,CAAC,SAAS,KAAA,CAAM,SAAA,KAAc,UAAU,CAAC,KAAA,CAAM,UAAA,EAAY,OAAO,EAAC;AAGvE,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,OAAA,EAAQ;AAC9C,QAAA,IAAI,OAAA,GAAU,CAAA;AACd,QAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC5B,UAAA,MAAM,GAAA,GAAM,KAAK,KAAA,IAAS,GAAA;AAC1B,UAAA,OAAA,IAAW,MAAM,IAAA,CAAK,OAAA;AAAA,QAC1B;AACA,QAAA,MAAM,WAAA,GAAc,MAAM,UAAA,GAAa,OAAA;AACvC,QAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,IAAA,CAAK,WAAA,GAAc,GAAI,CAAA;AAGrD,QAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC7B,UAAA,IAAI,GAAA,CAAI,WAAW,QAAA,CAAS,gBAAgB,KAAK,CAAC,aAAA,CAAc,GAAA,CAAI,gBAAgB,CAAA,EAAG;AACnF,YAAA,aAAA,CAAc,IAAI,gBAAgB,CAAA;AAClC,YAAA,OAAA,CAAQ,WAAW,QAAA,EAAU;AAAA,cACzB,IAAI,YAAY,GAAA,CAAI,KAAA,EAAO,aAAa,EAAE,QAAA,EAAU,kBAAkB;AAAA,eACvE,EAAE,KAAA,EAAO,CAAA,WAAA,EAAc,gBAAgB,KAAK,CAAA;AAAA,UACnD;AAAA,QACJ;AAEA,QAAA,OAAO,EAAC;AAAA,MACZ,CAAA,EAAG,EAAE,KAAA,EAAO,QAAA,EAAU,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,OAAO,IAAA,EAA0C;AAC7C,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,GAAA,EAAyC;AAE/C,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM;AAChC,MAAA,IAAI,GAAA,CAAI,OAAA,KAAY,SAAA,IAAa,GAAA,CAAI,YAAY,UAAA,EAAY;AACzD,QAAA,GAAA,CAAI,WAAW,QAAA,EAAU;AAAA,UACrB,IAAI,WAAA,CAAY,GAAA,CAAI,KAAA,EAAO,IAAI,OAAO;AAAA,WACvC,EAAE,KAAA,EAAO,UAAU,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,MACvC;AAAA,IACJ;AAEA,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA8B;AAAA,EAExC;AACJ,CAAA;AC3EO,IAAM,iBAAN,MAAiD;AAAA,EACpD,YAAoB,MAAA,EAAwB;AAAxB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA0B;AAAA,EAA1B,MAAA;AAAA,EAEpB,QAAQ,GAAA,EAAyC;AAE7C,IAAA,MAAM,UAAUC,2BAAAA,CAAgB,IAAA,CAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,MAAA,MAAW;AAAA,MACpE,MAAMD,sBAAAA,CAAW,MAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACH,IAAI,MAAA,CAAO,EAAA;AAAA,QACX,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,WAAW,MAAA,CAAO;AAAA,OACtB;AAAA,MACA,cAAA,EAAgB,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS;AAAA,MACvC,SAAA,EAAW,IAAI,KAAA,CAAM;AAAA,MACvB,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAG7B,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpB,MAAA,GAAA,CAAI,UAAA,CAAW,UAAA,EAAY,OAAA,CAAQ,OAAA,EAAS,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,OAAO,IAAA,EAA0C;AAC7C,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,GAAA,EAAyC;AAE/C,IAAA,GAAA,CAAI,YAAA,CAAa,UAAA,EAAY,EAAE,CAAA;AAE/B,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA8B;AAAA,EAExC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,YAAA,CACH,GAAA,EACA,QAAA,EACA,OAAA,EACI;AACJ,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,KAAA,CAAM,cAAA,CAAe,UAAU,CAAA;AACxD,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAE/B,IAAA,MAAM,GAAA,GAAM,aAAa,CAAC,CAAA;AAC1B,IAAA,MAAM,gBAAA,GAAmB,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK;AAC1C,MAAA,MAAM,MAAM,CAAA,CAAE,KAAA;AACd,MAAA,IAAI,GAAA,CAAI,OAAO,QAAA,EAAU;AACrB,QAAA,OAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,EAAE,GAAG,GAAA,EAAK,GAAG,OAAA,EAAQ,EAAE;AAAA,MACjD;AACA,MAAA,OAAO,CAAA;AAAA,IACX,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,YAAA,CAAa,YAAY,gBAAgB,CAAA;AAAA,EACjD;AACJ,CAAA;AC5EO,IAAM,mBAAA,GAAN,MAAM,oBAAA,SAA4B,YAAA,CAAa;AAAA,EAClD,YAAY,OAAA,EAA0B;AAClC,IAAA,MAAM,QAAA,GAAW,IAAIiB,oBAAAA,CAAS,kBAAkB,CAAA;AAChD,IAAA,MAAM,UAAU,IAAI,YAAA,CAAa,SAAS,QAAA,CAAS,QAAA,IAAY,gBAAgB,CAAA;AAC/E,IAAA,MAAM,SAAA,GAAY,qBAAoB,cAAA,EAAe;AAErD,IAAA,KAAA,CAAM;AAAA,MACF,OAAA;AAAA,MACA,WAAW,EAAC;AAAA;AAAA,MACZ,SAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,gBAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACV,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,cAAA,GAAqC;AACxC,IAAA,MAAM,YAAgC,EAAC;AAKvC,IAAA,SAAA,CAAU,KAAK,IAAI,oBAAA,CAAqB,EAAE,KAAA,EAAO,gBAAA,EAAkB,CAAC,CAAA;AAKpE,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,gBAAA,CAAiB;AAAA,MAChC,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACV,CAAC,CAAA;AAKF,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,cAAA,CAAe;AAAA,MAC9B,OAAA,EAAS;AAAA,QACL;AAAA,UACI,EAAA,EAAI,OAAA;AAAA,UACJ,KAAA,EAAO,eAAA;AAAA,UACP,OAAA,EAAS,SAAA;AAAA,UACT,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,IAAA;AAAA,UACT,SAAA,EAAW;AAAA;AACf;AACJ,KACH,CAAC,CAAA;AAKF,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,YAAA,CAAa,EAAE,MAAM,WAAA,EAAa,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAEpE,IAAA,OAAO,SAAA;AAAA,EACX;AAAA,EAEA,KAAA,CAAM,SAA0B,OAAA,EAAmD;AAC/E,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,OAAO,CAAA;AAAA,EACvC;AAAA,EAEA,OAAA,CAAQ,SAA0B,OAAA,EAAmD;AACjF,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,EACzC;AAAA,EAEA,QAAQ,OAAA,EAAgC;AACpC,IAAA,KAAA,CAAM,QAAQ,OAAO,CAAA;AACrB,IAAA,IAAI,KAAK,OAAA,EAAS;AACd,MAAA,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAAA,IACzB;AAAA,EACJ;AACJ;;;ACxFO,IAAM,iCAAN,MAAiE;AAAA,EACpE,YAA6B,OAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAA2B;AAAA,EAA3B,OAAA;AAAA,EAE7B,QAAQ,IAAA,EAA0C;AAC9C,IAAA,MAAM,YAAA,GAAe,IAAI,mBAAA,CAAoB,IAAA,CAAK,OAAO,CAAA;AACzD,IAAA,OAAO,CAAC,IAAI,eAAA,CAAgB,YAAY,CAAC,CAAA;AAAA,EAC7C;AAAA,EAEA,OAAO,IAAA,EAA0C;AAC7C,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA0C;AAChD,IAAA,OAAO,EAAC;AAAA,EACZ;AAAA,EAEA,UAAU,IAAA,EAA8B;AAAA,EAExC;AACJ,CAAA;;;ACKO,IAAM,SAAA,GAAN,MAAM,UAAA,SAAkB,YAAA,CAAa;AAAA,EACxC,WAAA,CACI,SACA,MAAA,EACF;AACE,IAAA,IAAI,MAAA,CAAO,aAAa,CAAA,EAAG;AACvB,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,wCAAA,EAA2C,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AAAA,IACvF;AAEA,IAAA,MAAM,SAAA,GAAY,OAAO,KAAA,IAAS,MAAA;AAClC,IAAA,MAAM,QAAA,GAAW,IAAIA,oBAAAA,CAAS,MAAM,CAAA;AACpC,IAAA,MAAM,UAAU,IAAI,YAAA,CAAa,SAAS,QAAA,CAAS,QAAA,IAAY,MAAM,CAAA;AACrE,IAAA,MAAM,SAAA,GAAY,UAAA,CAAU,cAAA,CAAe,MAAM,CAAA;AAEjD,IAAA,KAAA,CAAM;AAAA,MACF,OAAA;AAAA,MACA,WAAW,EAAC;AAAA;AAAA,MACZ,SAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,MAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACV,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,eAAe,MAAA,EAA6C;AAC/D,IAAA,MAAM,YAAgC,EAAC;AACvC,IAAA,MAAM,SAAA,GAAY,OAAO,KAAA,IAAS,MAAA;AAKlC,IAAA,SAAA,CAAU,KAAK,IAAI,oBAAA,CAAqB,EAAE,KAAA,EAAO,SAAA,EAAW,CAAC,CAAA;AAK7D,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,sBAAA,CAAuB;AAAA,MACtC,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACT,CAAC,CAAA;AAOF,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,YAAA,CAAa;AAAA,MAC5B,IAAA,EAAM,WAAA;AAAA,MACN,MAAA,EAAQ,KAAA;AAAA,MACR,QAAA,EAAU,CAAC,gBAAgB;AAAA,KAC9B,CAAC,CAAA;AAKF,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,gBAAA,CAAiB;AAAA,MAChC,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACV,CAAC,CAAA;AAKF,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,gBAAA,CAAiB;AAAA,MAChC,IAAA,EAAM;AAAA,QACF;AAAA,UACI,KAAA,EAAO,WAAA;AAAA,UACP,OAAA,EAAS;AAAA,SACb;AAAA,QACA;AAAA,UACI,KAAA,EAAO,gBAAA;AAAA,UACP,OAAA,EAAS,WAAA;AAAA,UACT,SAAA,EAAW,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC;AAAA;AACvB;AACJ,KACH,CAAC,CAAA;AAEF,IAAA,OAAO,SAAA;AAAA,EACX;AAAA,EAEA,KAAA,CAAM,SAA0B,OAAA,EAAmD;AAC/E,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,OAAO,CAAA;AAAA,EACvC;AAAA,EAEA,OAAA,CAAQ,SAA0B,OAAA,EAAmD;AACjF,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,EACzC;AAAA,EAEA,QAAQ,OAAA,EAAgC;AACpC,IAAA,KAAA,CAAM,QAAQ,OAAO,CAAA;AACrB,IAAA,IAAI,KAAK,OAAA,EAAS;AACd,MAAA,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAAA,IACzB;AAAA,EACJ;AACJ;;;ACrGO,IAAM,eAAN,MAAmB;AAAA,EAatB,YAAoB,OAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAA2B;AAAA,EAA3B,OAAA;AAAA,EAZZ,SAAA,uBAA4C,GAAA,EAAI;AAAA,EAChD,OAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA,GAAgB,EAAA;AAAA,EAChB,SAAA,GAAoB,OAAA;AAAA,EACpB,OAAA;AAAA,EACA,YAAsB,EAAC;AAAA;AAAA,EAEvB,kBAAA;AAAA;AAAA,EAEA,gBAAA;AAAA,EAIR,YAAY,QAAA,EAA0C;AAuBlD,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,WAAA,EAAa,QAAQ,CAAA;AACjD,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB,QAAA,EAA0C;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3C,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,WAAA,EAAa,QAAQ,CAAA;AAAA,IACrD;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,eAA2C,IAAA,EAA+C;AAC9F,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,IAAI,CAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaQ,iBAA6C,IAAA,EAA+C;AAChG,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AACxC,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,IAAA,CAAK,SAAA,CAAU,OAAO,IAAI,CAAA;AAC1B,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,QAAQ,CAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,YAAwC,IAAA,EAA0C;AAC9E,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,IAAA,EAA8C;AACtD,IAAA,IAAI,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,gBAAA,KAAqB,MAAA,EAAW;AAC5D,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC5B;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAEA,IAAI,QAAA,GAAiD;AACjD,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EAChB;AAAA,EAEA,YAAwC,IAAA,EAAgD;AACpF,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA,EAClC;AAAA,EAEA,WAAW,OAAA,EAAsC;AAC7C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,OAAO,GAAA,EAA6B;AAChC,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,SAAS,KAAA,EAA6B;AAClC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,aAAa,IAAA,EAA4B;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,aAAa,OAAA,EAAwD;AAGjE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,KAAS;AAChC,MAAA,MAAM,SAAA,GAAYhB,2BAAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AAC5C,MAAA,SAAA,CAAU,YAAA,CAAaD,uBAAW,IAAI,CAAA;AACtC,MAAA,OAAO,SAAA;AAAA,IACX,CAAC,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,aAAa,GAAA,EAA6B;AACtC,IAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EACA,QAAA,GAAmB;AACf,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EACA,YAAA,GAAuB;AACnB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA,EACA,YAAA,GAA8C;AAC1C,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAAA,EACA,YAAA,GAAyB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA,EACA,UAAA,GAAwC;AACpC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAAA,EACA,MAAA,GAA+B;AAC3B,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,QAAQ,MAAA,EAKS;AACb,IAAA,IAAI,MAAA,CAAO,SAAA,KAAc,MAAA,IAAU,MAAA,CAAO,UAAA,EAAY;AAClD,MAAA,MAAM,IAAA,GAAsB,MAAA,CAAO,gBAAA,EAAkB,cAAA,KAAmB,QAClE,gBAAA,GACA,gBAAA;AAKN,MAAA,IAAA,CAAK,WAAA,CAAY,IAAI,sBAAA,CAAuB;AAAA,QACxC,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,IAAA;AAAA,QACA,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,gBAAA,EAAkB,MAAA,CAAO,UAAA,GAAa,CAAC,YAAoB,KAAA,KAAmB;AAC1E,UAAA,MAAM,SAAA,GAAY,IAAI,SAAA,CAAU,IAAA,CAAK,SAAS,EAAE,UAAA,EAAY,OAAO,CAAA;AACnE,UAAA,OAAO,CAAC,IAAI,eAAA,CAAgB,SAAS,CAAC,CAAA;AAAA,QAC1C,CAAA,GAAI;AAAA,OACP,CAAC,CAAA;AAAA,IACN,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,WAAA,CAAY,IAAI,oBAAA,CAAqB;AAAA,QACtC,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,MAAM,MAAA,CAAO;AAAA,OAChB,CAAC,CAAA;AAAA,IACN;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAA0B;AACtB,IAAA,OAAO,KAAK,kBAAA,KAAuB,MAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAA4B;AACxB,IAAA,OACI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,sBAAsB,CAAA,IACzC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,oBAAoB,CAAA,IACvC,IAAA,CAAK,SAAA,CAAU,IAAI,oBAAoB,CAAA;AAAA,EAE/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,WAAW,MAAA,EAAsC;AAC7C,IAAA,IAAA,CAAK,kBAAA,GAAqB;AAAA,MACtB,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,UAAA,EAAY,OAAO,UAAA,IAAc,CAAA;AAAA,MACjC,eAAe,MAAA,CAAO;AAAA,KAC1B;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YACI,MAAA,EAIY;AACZ,IAAA,MAAM,WAAW,IAAA,CAAK,kBAAA;AACtB,IAAA,IAAA,CAAK,WAAA,CAAY,IAAI,sBAAA,CAAuB;AAAA,MACxC,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,IAAA,EAAM,OAAO,OAAA,GACP,EAAE,WAAW,MAAA,CAAO,UAAA,EAAY,SAAA,IAAa,cAAA,EAAe,GAC5D,KAAA;AAAA,MACN,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,aAAa,MAAA,CAAO,WAAA;AAAA;AAAA,MAEpB,YAAY,QAAA,EAAU,UAAA;AAAA,MACtB,aAAa,QAAA,EAAU;AAAA,KAC1B,CAAC,CAAA;AAEF,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,KAAA,GAAuB;AACnB,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAC7D,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,EAAK,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAIrD,IAAA,IAAA,CAAK,oBAAA,CAAqB,IAAI,2BAAA,EAA6B,CAAA;AAO3D,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACvB,MAAA,IAAA,CAAK,eAAe,YAAY,CAAA;AAChC,MAAA,IAAA,CAAK,YAAY,IAAI,YAAA;AAAA,QACjB,IAAA,CAAK,gBAAA,KAAqB,WAAA,GACpB,EAAE,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,IAAA,EAAK,GAClC,EAAE,IAAA,EAAM,UAAA;AAAW,OAC5B,CAAA;AAAA,IACL;AAGA,IAAA,IAAA,CAAK,iBAAiB,uBAAuB,CAAA;AAE7C,IAAA,MAAM,KAAA,GAAQ,IAAI,YAAA,CAAa;AAAA,MAC3B,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,WAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,MAC7C,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,WAAW,IAAA,CAAK;AAAA;AAAA,KAEnB,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAEzC,MAAA,KAAA,MAAW,KAAA,IAAS,KAAK,OAAA,EAAS;AAC9B,QAAA,KAAA,CAAM,UAAA,CAAW,IAAI,cAAA,CAAe,gBAAA,EAAkB,KAAK,CAAC,CAAA;AAAA,MAChE;AAAA,IACJ;AAGA,IAAA,IAAI,KAAK,KAAA,EAAO;AACZ,MAAA,KAAA,CAAM,UAAA,CAAW,IAAI,cAAA,CAAe,cAAA,EAAgB,CAAC;AAAA,QACjD,MAAMA,sBAAAA,CAAW,KAAA;AAAA,QACjB,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAA,EAAQ,UAAA;AAAA,QACR,OAAO,IAAA,CAAK;AAAA,OACJ,CAAC,CAAC,CAAA;AAAA,IAClB;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AACJ,CAAA;;;ACnWO,SAAS,mBAAmB,QAAA,EAAgD;AAC/E,EAAA,OACI,OAAO,aAAa,QAAA,IACpB,QAAA,KAAa,QACb,sBAAA,IAA0B,QAAA,IAC1B,OAAQ,QAAA,CAA6B,oBAAA,KAAyB,UAAA;AAEtE;;;ACpBO,IAAM,oBAAN,MAAsD;AAAA,EACzD,iBAAA,CACI,aACA,OAAA,EACmB;AACnB,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,OAAO,EAAE,iBAAA,EAAmB,EAAC,EAAG,eAAe,KAAA,EAAM;AAAA,IACzD;AAGA,IAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,2BAAA,CAA4B,SAAS,CAAA;AAG3E,IAAA,MAAM,oBAA+B,iBAAA,CAAkB,OAAA;AAAA,MACnD,CAAA,GAAA,KAAO,GAAA,CAAI,OAAA,CAAQ,OAAA;AAAQ,KAC/B;AAKA,IAAA,KAAA,MAAW,QAAA,IAAY,YAAY,SAAA,EAAW;AAC1C,MAAA,IAAI,CAAC,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AACnC,MAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,oBAAA,CAAqB,OAAA,EAAS,WAAW,CAAA;AAC3E,MAAA,KAAA,MAAW,MAAM,gBAAA,EAAkB;AAG/B,QAAA,MAAM,gBAAgB,iBAAA,CAAkB,SAAA,CAAU,OAAK,CAAA,CAAE,IAAA,KAAS,GAAG,IAAI,CAAA;AACzE,QAAA,IAAI,kBAAkB,EAAA,EAAI;AACtB,UAAA,iBAAA,CAAkB,aAAa,CAAA,GAAI,EAAA;AAAA,QACvC,CAAA,MAAO;AACH,UAAA,iBAAA,CAAkB,KAAK,EAAE,CAAA;AAAA,QAC7B;AAAA,MACJ;AAAA,IACJ;AACA,IAAA,OAAO;AAAA,MACH,iBAAA;AAAA,MACA,aAAA,EAAe,kBAAkB,MAAA,GAAS;AAAA,KAC9C;AAAA,EACJ;AACJ,CAAA;;;ACxCO,IAAM,cAAN,MAA0C;AAAA,EAG/C,WAAA,CACU,UAAA,GAAsC,EAAC,EAC/C,iBAAA,EACA;AAFQ,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAGR,IAAA,IAAA,CAAK,kBAAA,GAAqB,iBAAA,IAAqB,IAAI,iBAAA,EAAkB;AAAA,EACvE;AAAA,EAJU,UAAA;AAAA,EAHF,kBAAA;AAAA,EASR,iBAAiB,QAAA,EAAuC;AACtD,IAAA,IAAA,CAAK,UAAA,CAAW,KAAK,QAAQ,CAAA;AAAA,EAC/B;AAAA,EAEA,OAAA,CAAQ,OAAyB,OAAA,EAAqD;AACpF,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,IAAA,MAAM,WAAA,GAAc,QAAQ,KAAA,EAAO,OAAA;AAInC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,kBAAA,CAAmB,iBAAA,CAAkB,aAAa,OAAO,CAAA;AAEhF,IAAA,IAAI,UAAU,aAAA,EAAe;AACzB,MAAA,MAAM,oBAAoB,SAAA,CAAU,iBAAA;AAKpC,MAAA,cAAA,GAAiB,KAAA,CAAM,IAAI,CAAA,IAAA,KAAQ;AAE/B,QAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,IAAI,CAAC,CAAA;AACvD,QAAA,MAAA,CAAO,MAAA,CAAO,OAAO,IAAI,CAAA;AACzB,QAAA,KAAA,CAAM,OAAA,GAAU,KAAK,OAAA,CAAQ,KAAA,CAAM,KAAK,EAAE,CAAA,CAAE,GAAA,CAAI,GAAG,iBAAiB,CAAA;AACpE,QAAA,OAAO,KAAA;AAAA,MACX,CAAC,CAAA;AAAA,IACL;AAOA,IAAA,MAAM,kBAAA,GAAqB,KAAK,UAAA,CAC7B,MAAA,CAAO,OAAK,CAAA,CAAE,KAAA,CAAM,gBAAgB,OAAO,CAAC,EAC5C,IAAA,CAAK,CAAC,GAAG,CAAA,KAAA,CAAO,CAAA,CAAE,YAAY,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA,CAAE,CAAA;AAEvD,IAAA,IAAI,kBAAA,CAAmB,WAAW,CAAA,EAAG;AACnC,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,OAAO,CAAA;AAExC,IAAA,KAAA,MAAW,YAAY,kBAAA,EAAoB;AACzC,MAAA,QAAA,CAAS,KAAA,CAAM,OAAA,EAAS,cAAA,EAAgB,OAAO,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,QAAQ,KAAA,EAAM;AAAA,IACvB,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,KAAA,CAAM,2CAA2C,CAAC,CAAA;AAC1D,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AACF;AC3CO,IAAM,WAAN,MAAoC;AAAA,EACjC,eAAA,uBAA+D,GAAA,EAAI;AAAA,EACnE,gBAAA,uBAA4D,GAAA,EAAI;AAAA,EAExE,SACE,SAAA,EACA,OAAA,EACA,OAAA,EACA,OAAA,GAA+B,EAAC,EACpB;AACZ,IAAA,MAAM,EAAE,QAAA,GAAW,CAAA,EAAG,KAAA,GAAQ,UAAS,GAAI,OAAA;AAE3C,IAAA,MAAM,OAAO,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAS,KAAK,EAAC;AACrD,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAA,EAAM,EAAE,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,CAAA;AAE/D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AAC9C,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAE3C,IAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,EAAE,CAAA;AAAA,EAC7C;AAAA,EAEA,EAAA,CAAG,SAAA,EAAmB,QAAA,EAAyB,OAAA,EAA6B;AAC1E,IAAA,MAAM,KAAKc,OAAAA,EAAO;AAClB,IAAA,MAAM,OAAO,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAS,KAAK,EAAC;AACtD,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,EAAA,EAAI,QAAA,EAAU,SAAS,CAAA;AACnC,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAA,EAAW,IAAI,CAAA;AAEzC,IAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,EAAE,CAAA;AAAA,EACrC;AAAA,EAEA,eAAe,SAAA,EAAyB;AAEtC,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,IAAI,KAAK,IAAA,CAAK,eAAA,CAAgB,SAAQ,EAAG;AAC9D,MAAA,MAAM,WAAW,IAAA,CAAK,MAAA,CAAO,WAAS,KAAA,CAAM,OAAA,CAAQ,OAAO,SAAS,CAAA;AACpE,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,SAAS,CAAA;AAAA,MACvC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAA,EAAW,QAAQ,CAAA;AAAA,MAC9C;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,IAAI,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAQ,EAAG;AAC/D,MAAA,MAAM,WAAW,IAAA,CAAK,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,SAAS,CAAA;AAC5D,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,SAAS,CAAA;AAAA,MACxC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAA,EAAW,QAAQ,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,kBAAkB,OAAA,EAAuB;AAEvC,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,IAAI,KAAK,IAAA,CAAK,eAAA,CAAgB,SAAQ,EAAG;AAC9D,MAAA,MAAM,WAAW,IAAA,CAAK,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,OAAO,CAAA;AAC/D,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,SAAS,CAAA;AAAA,MACvC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAA,EAAW,QAAQ,CAAA;AAAA,MAC9C;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,IAAI,KAAK,IAAA,CAAK,gBAAA,CAAiB,SAAQ,EAAG;AAC/D,MAAA,MAAM,WAAW,IAAA,CAAK,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,OAAO,CAAA;AAC/D,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,SAAS,CAAA;AAAA,MACxC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,SAAA,EAAW,QAAQ,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAA,CAAS,OAAe,OAAA,EAAiF;AAEvG,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,GAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,GAAG,KAAK,EAAC;AAAA,MACvC,GAAI,IAAA,CAAK,gBAAA,CAAiB,IAAI,KAAA,CAAM,IAAI,KAAK;AAAC,KAChD;AAEA,IAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,QAAA,CAAS,OAAO,OAAO,CAAA;AAAA,MAC/B,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,EAA+B,KAAA,CAAM,IAAI,KAAK,KAAK,CAAA;AAAA,MACnE;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,KAAA,CAAM,OAAA,EAAS,IAAI,QAAA,EAAS;AAC3D,IAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA;AAGnE,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAI,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,GAAG,KAAK,EAAC;AAAA,MACtC,GAAI,IAAA,CAAK,eAAA,CAAgB,IAAI,KAAA,CAAM,IAAI,KAAK;AAAC,KAC/C;AAGA,IAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,MAAA,CAAO,CAAA,KAAA,KAAS;AACnD,MAAA,QAAQ,MAAM,KAAA;AAAO,QACnB,KAAK,QAAA;AAEH,UAAA,OAAO,IAAA;AAAA,QACT,KAAK,QAAA;AAEH,UAAA,OAAO,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAAA,QACpC,KAAK,QAAA;AAAA,QACL;AAEE,UAAA,OAAO,MAAM,OAAA,KAAY,cAAA;AAAA;AAC7B,IACF,CAAC,CAAA;AAED,IAAA,MAAM,UAAU,EAAC;AAEjB,IAAA,KAAA,MAAW,SAAS,gBAAA,EAAkB;AACpC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,OAAO,OAAO,CAAA;AACnD,QAAA,IAAI,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC/B,UAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,MAAM,CAAA;AAAA,QACxB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAA8B,KAAA,CAAM,IAAI,KAAK,KAAK,CAAA;AAAA,MAClE;AAAA,IACF;AAGA,IAAA,aAAA,CAAc,QAAA,CAAS,OAAO,OAAO,CAAA;AAErC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,IAAA,CAAK,OAAe,OAAA,EAA+B;AACjD,IAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAAA,EAC9B;AACF;AC7HO,IAAM,gBAAA,GAAN,MAAM,iBAAA,SAAyB,YAAA,CAAa;AAAA,EAC/C,WAAA,CACI,SACA,MAAA,EACF;AACE,IAAA,MAAM,YAAA,GAAe,OAAO,KAAA,IAAS,SAAA;AACrC,IAAA,MAAM,QAAA,GAAW,IAAIG,oBAAAA,CAAS,cAAc,CAAA;AAC5C,IAAA,MAAM,UAAU,IAAI,YAAA,CAAa,SAAS,QAAA,CAAS,QAAA,IAAY,SAAS,CAAA;AAExE,IAAA,MAAM,SAAA,GAAY,iBAAA,CAAiB,cAAA,CAAe,MAAA,EAAQ,OAAO,CAAA;AAEjE,IAAA,KAAA,CAAM;AAAA,MACF,OAAA;AAAA,MACA,SAAA,EAAW,MAAA,CAAO,WAAA,CAAY,IAAA,EAAK;AAAA;AAAA,MACnC,SAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW,aAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACV,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,cAAA,CAAe,MAAA,EAA2B,OAAA,EAA8C;AAC3F,IAAA,MAAM,YAAgC,EAAC;AACvC,IAAA,MAAM,WAAA,GAAc,OAAO,WAAA,IAAe,CAAA;AAC1C,IAAA,MAAM,YAAA,GAAe,OAAO,KAAA,IAAS,SAAA;AAKrC,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,oBAAA,CAAqB;AAAA,MACpC,KAAA,EAAO,YAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACT,CAAC,CAAA;AASF,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,sBAAA,CAAuB;AAAA,MACtC,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,MAAM,WAAA,GAAc,CAAA,GAAI,EAAE,SAAA,EAAW,oBAAmB,GAAI,KAAA;AAAA,MAC5D,WAAA,EAAa,IAAA;AAAA,MACb,UAAA,EAAY,CAAA;AAAA,MACZ;AAAA,KACH,CAAC,CAAA;AAOF,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,8BAAA,CAA+B,OAAO,CAAC,CAAA;AAK1D,IAAA,SAAA,CAAU,KAAK,IAAI,oBAAA,CAAqB,EAAE,KAAA,EAAO,YAAA,EAAc,CAAC,CAAA;AAKhE,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,gBAAA,CAAiB;AAAA,MAChC,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACV,CAAC,CAAA;AAKF,IAAA,SAAA,CAAU,IAAA,CAAK,IAAI,cAAA,CAAe;AAAA,MAC9B,OAAA,EAAS;AAAA,QACL;AAAA,UACI,EAAA,EAAI,OAAA;AAAA,UACJ,KAAA,EAAO,OAAA;AAAA,UACP,OAAA,EAAS,WAAA;AAAA,UACT,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,IAAA;AAAA,UACT,SAAA,EAAW;AAAA,SACf;AAAA,QACA;AAAA,UACI,EAAA,EAAI,MAAA;AAAA,UACJ,KAAA,EAAO,MAAA;AAAA,UACP,OAAA,EAAS,SAAA;AAAA,UACT,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,IAAA;AAAA,UACT,SAAA,EAAW;AAAA,SACf;AAAA,QACA;AAAA,UACI,EAAA,EAAI,MAAA;AAAA,UACJ,KAAA,EAAO,MAAA;AAAA,UACP,OAAA,EAAS,QAAA;AAAA,UACT,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,IAAA;AAAA,UACT,SAAA,EAAW;AAAA;AACf;AACJ,KACH,CAAC,CAAA;AAEF,IAAA,OAAO,SAAA;AAAA,EACX;AAAA,EAEA,KAAA,CAAM,SAA0B,OAAA,EAAmD;AAC/E,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,OAAO,CAAA;AAAA,EACvC;AAAA,EAEA,OAAA,CAAQ,SAA0B,OAAA,EAAmD;AACjF,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,EACzC;AAAA,EAEA,QAAQ,OAAA,EAAgC;AACpC,IAAA,KAAA,CAAM,QAAQ,OAAO,CAAA;AACrB,IAAA,IAAI,KAAK,OAAA,EAAS;AACd,MAAA,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAAA,IACzB;AAAA,EACJ;AACJ;ACzJO,IAAM,sBAAN,MAA2D;AAAA,EAC9D,QAAA,GAAW,GAAA;AAAA,EACF,EAAA,GAAK,cAAA;AAAA;AAAA;AAAA;AAAA,EAKd,KAAA,CAAM,aAA+B,QAAA,EAAoC;AACrE,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,QAAA,EAAwB,WAAA,EAA+B,QAAA,EAAiC;AAAA,EAE9F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,KAAA,CAAM,SAA0B,MAAA,EAA0C;AACtE,IAAA,OAAO,IAAI,gBAAA,CAAiB,OAAA,EAAS,MAAM,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,mBAAA,CACI,OAAA,EACA,UAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,WAAA,GAAc,4BAA4B,UAAU,CAAA;AAE1D,IAAA,MAAM,MAAA,GAA4B;AAAA,MAC9B,WAAA;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,aAAa,OAAA,EAAS;AAAA,KAC1B;AAEA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,MAAM,CAAA;AAAA,EACrC;AACJ,CAAA;AAWO,SAAS,yBAAyB,IAAA,EAA+B;AACpE,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,EAAA,OAAA,CACK,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,KAC5C,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAASjB,sBAAAA,CAAW,MAAM,CAAA,IAC/C,CAAC,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,QAAQ,CAAA,IACjD,CAAC,QAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,MAAM,KAC/C,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,uBAAW,GAAG,CAAA,IAC5C,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,UAAA,IAAc,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,QAAQ,CAAA;AAE5F;AAMO,SAAS,iBAAiB,IAAA,EAA+B;AAC5D,EAAA,OACK,CAAC,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA,IAC3C,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,KAASA,sBAAAA,CAAW,MAAM,CAAA,IACnD,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,QAAQ,CAAA;AAE7D;AAQO,SAAS,4BAA4B,UAAA,EAA0C;AAClF,EAAA,MAAM,cAA0B,EAAC;AACjC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,WAAW,MAAA,EAAQ;AAC1B,IAAA,MAAM,OAAA,GAAU,WAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,yBAAyB,OAAO,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,WAAW,MAAA,EAAQ;AAChE,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,CAAA,GAAI,CAAC,CAAA;AAC7B,MAAA,IAAI,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAExB,QAAA,WAAA,CAAY,KAAK,CAAC,IAAA,CAAK,EAAA,EAAc,OAAA,CAAQ,EAAY,CAAC,CAAA;AAC1D,QAAA,CAAA,IAAK,CAAA;AACL,QAAA;AAAA,MACJ;AAAA,IACJ;AACA,IAAA,WAAA,CAAY,IAAA,CAAK,CAAC,OAAA,CAAQ,EAAY,CAAC,CAAA;AACvC,IAAA,CAAA,EAAA;AAAA,EACJ;AACA,EAAA,OAAO,WAAA;AACX;;;AChIO,IAAM,qBAAN,MAAmD;AAAA,EAGtD,WAAA,CAA6B,OAAA,GAA+B,EAAC,EAAG;AAAnC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAoC;AAAA,EAApC,OAAA;AAAA,EAFpB,IAAA,GAAO,eAAA;AAAA,EAIhB,GAAG,OAAA,EAA4C;AAE3C,IAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,KAAK,mEAAmE,CAAA;AAChF,MAAA,OAAO,EAAC;AAAA,IACZ;AAGA,IAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,EAAQ,UAAA;AACnC,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AACxC,MAAA,OAAA,CAAQ,KAAK,uDAAuD,CAAA;AACpE,MAAA,OAAO,EAAC;AAAA,IACZ;AAMA,IAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAY;AAC1C,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AACxB,MAAA,IAAI,EAAE,QAAA,EAAU;AACZ,QAAA,KAAA,MAAW,UAAA,IAAc,EAAE,QAAA,EAAU;AACjC,UAAA,KAAA,MAAW,WAAW,UAAA,EAAY;AAC9B,YAAA,iBAAA,CAAkB,IAAI,OAAO,CAAA;AAAA,UACjC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AACA,IAAA,MAAM,kBAAA,GAAqB,WAAW,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,iBAAA,CAAkB,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAC9E,IAAA,MAAM,WAAA,GAAc,4BAA4B,kBAAkB,CAAA;AAGlE,IAAA,MAAM,MAAA,GAA4B;AAAA,MAC9B,WAAA;AAAA,MACA,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,MACpB,WAAA,EAAa,KAAK,OAAA,CAAQ;AAAA,KAC9B;AAGA,IAAA,MAAM,QAAA,GAAW,IAAI,mBAAA,EAAoB;AACzC,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,OAAA,EAAS,MAAM,CAAA;AAGhD,IAAA,MAAM,SAAA,GAAmC;AAAA,MACrC,SAAA,EAAW,QAAQ,KAAA,CAAM,WAAA;AAAA,MACzB,GAAG,KAAK,OAAA,CAAQ;AAAA,KACpB;AAGA,IAAA,OAAO,CAAC,IAAI,eAAA,CAAgB,SAAA,EAAW,SAAS,CAAC,CAAA;AAAA,EACrD;AACJ;AClFO,IAAM,kBAAN,MAAkD;AAAA,EAC/C,qBAA2C,EAAC;AAAA,EAC5C,oBAAyC,EAAC;AAAA,EAC1C,gBAAoC,EAAC;AAAA;AAAA,EAErC,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,4BAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQR,qBAAqB,IAAA,EAAmD;AACtE,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,EACvB;AAAA,EAEA,qBAAqB,SAAA,EAAqC;AACxD,IAAA,IAAA,CAAK,kBAAA,CAAmB,KAAK,SAAS,CAAA;AAAA,EACxC;AAAA,EAEA,oBAAoB,SAAA,EAAoC;AACtD,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,SAAS,CAAA;AAAA,EACvC;AAAA,EAEA,IAAI,MAAA,EAA4C;AAE9C,IAAA,IAAI,OAAA,GAAU,MAAA;AACd,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,kBAAA,EAAoB;AAC/C,MAAA,IAAI;AACF,QAAA,OAAA,GAAU,SAAA,CAAU,QAAQ,OAAO,CAAA;AAAA,MACrC,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qCAAA,EAAwC,SAAA,CAAU,EAAE,MAAM,GAAG,CAAA;AAAA,MAC7E;AAAA,IACF;AAMA,IAAA,IAAI,OAAA,CAAQ,eAAe,SAAA,EAAW;AACpC,MAAA,IAAA,CAAK,aAAA,CAAc,KAAK,OAAO,CAAA;AAC/B,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,QAAA,MAAM,WAAA,GAAc,KAAK,aAAA,EAAc;AACvC,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,oBAAA,CAAqB,WAAW,CAAA;AAIvD,QAAA,IAAI,SAAA,KAAc,KAAK,4BAAA,EAA8B;AACnD,UAAA,IAAA,CAAK,4BAAA,GAA+B,SAAA;AACpC,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,uBAAA,CAAwB,WAAA,EAAa,GAAG,CAAA;AACjE,UAAA,IAAA,CAAK,cAAc,WAAW,CAAA;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAA+B;AAC7B,IAAA,MAAM,WAAA,GAAc,KAAK,aAAA,EAAc;AACvC,IAAA,MAAM,UAAU,IAAA,CAAK,uBAAA,CAAwB,WAAA,EAAa,IAAA,CAAK,KAAK,CAAA;AACpE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,oBAAA,CAAqB,WAAW,CAAA;AACvD,IAAA,IAAI,IAAA,CAAK,4BAAA,KAAiC,MAAA,IAAa,IAAA,CAAK,iCAAiC,SAAA,EAAW;AACtG,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,qBAAqB,WAAA,EAAyC;AACpE,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,MACV,YAAY,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,MAAM,CAAA,CAAE,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,OAAO,IAAA,EAAM,CAAA,CAAE,MAAM,UAAA,EAAY,CAAA,CAAE,YAAW,CAAE;AAAA,KACnG;AAAA,EACF;AAAA;AAAA,EAGQ,uBAAA,CAAwB,aAAiC,GAAA,EAAiC;AAChG,IAAA,OAAO,WAAA,CAAY,IAAI,CAAA,CAAA,KAAK;AAC1B,MAAA,MAAM,UAAUC,2BAAAA,CAAgB,KAAA,CAAM,cAAc,CAAA,CAAE,IAAI,EAAE,CAAA,CAAE,GAAA;AAAA,QAC5D;AAAA,UACE,MAAMD,sBAAAA,CAAW,KAAA;AAAA,UACjB,OAAO,CAAA,CAAE,IAAA;AAAA,UACT,OAAO,CAAA,CAAE,IAAA;AAAA,UACT,MAAA,EAAQ,EAAE,MAAA,IAAU,UAAA;AAAA,UACpB,SAAA,EAAW,IAAI,IAAA,CAAK,GAAG;AAAA,SACzB;AAAA;AAAA;AAAA,QAGA;AAAA,UACE,IAAA,EAAO,CAAA,CAAE,UAAA,IAA6BA,sBAAAA,CAAW,MAAA;AAAA,UACjD,OAAO,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA,CAAA;AAAA,UAC3B,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,MAAA,EAAQ,EAAE,MAAA,IAAU,UAAA;AAAA,UACpB,SAAA,EAAW,IAAI,IAAA,CAAK,GAAG,CAAA;AAAA,UACvB,GAAI,EAAE,QAAA,GAAW,EAAE,UAAU,CAAA,CAAE,QAAA,KAAa;AAAC;AAC/C,OACF;AACA,MAAA,OAAO,IAAIe,2BAAAA,CAAgB;AAAA,QACzB,UAAA,EAAY,WAAA;AAAA,QACZ,QAAA,EAAU,EAAE,OAAA,EAAS,GAAA,EAAK,OAAO,GAAA,EAAI;AAAA,QACrC,cAAA,EAAgB,mBAAA;AAAA,QAChB,UAAA,EAAY,CAAA;AAAA,QACZ;AAAA,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGQ,aAAA,GAAoC;AAC1C,IAAA,MAAM,UAA8B,EAAC;AACrC,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,iBAAA,EAAmB;AAC9C,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,KAAK,GAAG,SAAA,CAAU,SAAA,CAAU,IAAA,CAAK,aAAa,CAAC,CAAA;AAAA,MACzD,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAuC,SAAA,CAAU,EAAE,MAAM,GAAG,CAAA;AAAA,MAC5E;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AClHO,IAAM,iCAAN,MAAmE;AAAA,EAIxE,YAA6B,QAAA,EAA2B;AAA3B,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAA4B;AAAA,EAA5B,QAAA;AAAA,EAHb,EAAA,GAAK,4BAAA;AAAA,EACL,UAAA,GAAa,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,EAI3C,QAAQ,MAAA,EAA4C;AAClD,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,SAAA,CAAUf,sBAAAA,CAAW,MAAM,CAAA;AACvD,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,SAAA,CAAUA,sBAAAA,CAAW,MAAM,CAAA;AAEvD,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI,UAAA,GAA2B,UAAA;AAG/B,IAAA,IAAI,YAAA,IAAgB,OAAO,YAAA,CAAa,KAAA,KAAU,QAAA,EAAU;AAC1D,MAAA,KAAA,GAAQ,YAAA,CAAa,KAAA;AACrB,MAAA,UAAA,GAAa,YAAA,CAAa,MAAA,KAAW,UAAA,GAAa,UAAA,GAAa,UAAA;AAAA,IACjE,CAAA,MAAA,IAAW,YAAA,IAAgB,OAAO,YAAA,CAAa,UAAU,QAAA,EAAU;AACjE,MAAA,KAAA,GAAQ,YAAA,CAAa,KAAA;AACrB,MAAA,UAAA,GAAa,UAAA;AAAA,IACf;AAEA,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AAEnB,IAAA,MAAM,EAAE,QAAA,EAAU,WAAA,KAAgB,IAAA,CAAK,OAAA,CAAQ,OAAO,UAAU,CAAA;AAEhE,IAAA,MAAM,gBAAA,GAAmB;AAAA,MACvB,IAAA,EAAM,uBAAA;AAAA,MACN,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,KAAA,EAAO,QAAA;AAAA,MACP,MAAA,EAAQ,WAAA;AAAA,MACR,SAAA,sBAAe,IAAA;AAAK,KACtB;AAIA,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAQ;AACxC,IAAA,MAAM,YAA6B,EAAC;AACpC,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,SAAA,CAAU,KAAK,CAAC,CAAA;AAChB,MAAA,IAAI,CAAC,aAAa,CAAA,CAAE,IAAA,KAASA,uBAAW,MAAA,IAAU,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,MAAA,CAAA,EAAS;AAC/E,QAAA,SAAA,CAAU,KAAK,gBAAgB,CAAA;AAC/B,QAAA,QAAA,GAAW,IAAA;AAAA,MACb;AAAA,IACF;AACA,IAAA,IAAI,CAAC,QAAA,EAAU,SAAA,CAAU,IAAA,CAAK,gBAAgB,CAAA;AAE9C,IAAA,MAAA,CAAO,QAAQ,KAAA,EAAM;AACrB,IAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,MAAA,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,IACtB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,OAAA,CACN,OACA,UAAA,EACyD;AACzD,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI,eAAe,UAAA,EAAY;AAE7B,MAAA,MAAA,GAAS,IAAA,CAAK,SAAS,aAAA,CAAc,KAAK,KAAK,IAAA,CAAK,QAAA,CAAS,eAAe,KAAK,CAAA;AACjF,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,EAAE,UAAU,IAAA,CAAK,QAAA,CAAS,kBAAkB,MAAM,CAAA,EAAG,aAAa,UAAA,EAAW;AAAA,MACtF;AAAA,IAEF;AAGA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAElD,IAAA,MAAM,WAAA,GAA4B,QAAA,CAAS,WAAA,GAAc,oBAAA,GAAuB,UAAA;AAEhF,IAAA,OAAO,EAAE,UAAU,WAAA,EAAY;AAAA,EACjC;AACF;;;AC1FO,IAAM,WAAsB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAC1C,IAAM,aAAwB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAC5C,IAAM,WAAsB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAC1C,IAAM,WAAsB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC;AAC1C,IAAM,YAAuB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3C,IAAM,aAAwB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAE5C,SAAS,MAAA,CAAO,GAAc,CAAA,EAAyB;AAC5D,EAAA,OAAO,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AACzE;AAEO,SAAS,MAAA,CAAO,GAAc,CAAA,EAAyB;AAC5D,EAAA,OAAO,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,GAAG,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AACzE;AAEO,SAAS,SAAA,CAAU,GAAc,CAAA,EAAuB;AAC7D,EAAA,OAAO,CAAA,CAAE,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA;AACzF;AAEO,SAAS,gBAAgB,CAAA,EAAuB;AACrD,EAAA,OAAO,SAAA,CAAU,GAAG,QAAQ,CAAA;AAC9B;AAEA,IAAM,aAAa,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAGpC,SAAS,UAAU,CAAA,EAAsB;AAC9C,EAAA,IAAI,eAAA,CAAgB,CAAC,CAAA,EAAG,OAAO,eAAA;AAC/B,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AACb,IAAA,IAAI,MAAM,CAAA,EAAG;AACb,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,KAAM,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,GAAI,CAAA,EAAG,UAAA,CAAW,CAAC,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,MAAG,CAAA;AACvB;AAMO,IAAM,eAAA,GAAgF;AAAA,EAC3F,IAAA,EAAM,EAAE,GAAA,EAAK,CAAC,IAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,GAAG,cAAA,EAAgB,CAAC,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA,EAC9E,KAAA,EAAO,EAAE,GAAA,EAAK,CAAC,GAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA,EAAG,cAAA,EAAgB,CAAC,KAAA,EAAO,MAAM,CAAA,EAAE;AAAA,EAChE,MAAA,EAAQ,EAAE,GAAA,EAAK,CAAC,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG,cAAA,EAAgB,CAAC,IAAA,EAAM,IAAI,CAAA,EAAE;AAAA,EAC7D,KAAA,EAAO,EAAE,GAAA,EAAK,CAAC,GAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA,EAAG,cAAA,EAAgB,CAAC,MAAA,EAAQ,MAAM,CAAA,EAAE;AAAA,EACjE,IAAA,EAAM,EAAE,GAAA,EAAK,QAAA,EAAU,gBAAgB,CAAC,KAAA,EAAO,GAAA,EAAK,GAAG,CAAA,EAAE;AAAA,EACzD,IAAA,EAAM,EAAE,GAAA,EAAK,QAAA,EAAU,gBAAgB,CAAC,IAAA,EAAM,IAAI,CAAA,EAAE;AAAA,EACpD,MAAA,EAAQ,EAAE,GAAA,EAAK,UAAA,EAAY,gBAAgB,CAAC,GAAA,EAAK,IAAA,EAAM,IAAI,CAAA,EAAE;AAAA,EAC7D,OAAO,EAAE,GAAA,EAAK,WAAW,cAAA,EAAgB,CAAC,MAAM,CAAA,EAAE;AAAA,EAClD,MAAA,EAAQ,EAAE,GAAA,EAAK,UAAA,EAAY,gBAAgB,CAAC,KAAA,EAAO,MAAM,CAAA,EAAE;AAAA,EAC3D,aAAA,EAAe,EAAE,GAAA,EAAK,QAAA,EAAU,cAAA,EAAgB,CAAC,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AAC9E,CAAA;AAGO,SAAS,aAAa,CAAA,EAAkC;AAC7D,EAAA,KAAA,MAAW,CAACS,KAAAA,EAAM,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AACzD,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,CAAC,GAAG,OAAOA,KAAAA;AAAA,EACpC;AACA,EAAA,OAAO,MAAA;AACT;;;ACtDO,IAAM,YAAA,GAA8C;AAAA,EACzD,MAAM,EAAE,GAAA,EAAK,WAAW,UAAA,EAAY,KAAA,EAAO,MAAM,MAAA,EAAO;AAAA,EACxD,SAAS,EAAE,GAAA,EAAK,UAAU,UAAA,EAAY,SAAA,EAAW,MAAM,IAAA,EAAK;AAAA,EAC5D,UAAU,EAAE,GAAA,EAAK,YAAY,UAAA,EAAY,UAAA,EAAY,MAAM,GAAA,EAAI;AAAA,EAC/D,YAAY,EAAE,GAAA,EAAK,UAAU,UAAA,EAAY,YAAA,EAAc,MAAM,IAAA,EAAK;AAAA,EAClE,aAAA,EAAe,EAAE,GAAA,EAAK,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG,UAAA,EAAY,eAAA,EAAiB,MAAM,IAAA,EAAK;AAAA,EAC/E,YAAY,EAAE,GAAA,EAAK,UAAU,UAAA,EAAY,YAAA,EAAc,MAAM,KAAA,EAAM;AAAA,EACnE,SAAA,EAAW,EAAE,GAAA,EAAK,QAAA,EAAU,YAAY,WAAA,EAAY;AAAA,EACpD,mBAAA,EAAqB,EAAE,GAAA,EAAK,QAAA,EAAU,YAAY,qBAAA,EAAsB;AAAA,EACxE,UAAA,EAAY,EAAE,GAAA,EAAK,QAAA,EAAU,YAAY,aAAA,EAAc;AAAA;AAAA,EAEvD,WAAW,EAAE,GAAA,EAAK,WAAW,UAAA,EAAY,iBAAA,EAAmB,MAAM,OAAA,EAAQ;AAAA,EAC1E,UAAA,EAAY,EAAE,GAAA,EAAK,QAAA,EAAU,YAAY,aAAA;AAC3C,CAAA;AAGO,IAAM,aAAA,GAA2C;AAAA,EACtD,MAAA,EAAQ,QAAA;AAAA,EACR,WAAA,EAAa,QAAA;AAAA,EACb,UAAA,EAAY,QAAA;AAAA,EACZ,kBAAA,EAAoB,QAAA;AAAA,EACpB,gBAAA,EAAkB;AACpB,CAAA;AAGO,IAAM,kBAAA,GAA2C;AAAA,EACtD,GAAA,EAAK,IAAA;AAAA,EACL,GAAA,EAAK,IAAA;AAAA,EACL,GAAA,EAAK,IAAA;AAAA,EACL,GAAA,EAAK,IAAA;AAAA,EACL,KAAA,EAAO,IAAA;AAAA,EACP,IAAA,EAAM;AACR,CAAA;;;AC/BO,IAAM,mBAAA,GAA4C,EAAE,EAAA,EAAI,IAAA,EAAM,KAAK,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAE7G,IAAM,SAAA,GAAY,UAAA;AAClB,IAAM,QAAA,GAAW,QAAA;AAEV,IAAM,KAAA,GAAiC;AAAA;AAAA,EAE5C,EAAA,EAAI,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA,EAC/B,CAAA,EAAG,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,GAAA,EAAK;AAAA,EACjC,GAAA,EAAK,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,GAAA,EAAK;AAAA,EACnC,GAAA,EAAK,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,GAAA,EAAO;AAAA,EACrC,CAAA,EAAG,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,IAAA,EAAU;AAAA,EACtC,EAAA,EAAI,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,IAAA,EAAU;AAAA;AAAA,EAEvC,CAAA,EAAG,EAAE,GAAA,EAAK,UAAA,EAAY,QAAQ,CAAA,EAAE;AAAA,EAChC,EAAA,EAAI,EAAE,GAAA,EAAK,UAAA,EAAY,QAAQ,GAAA,EAAK;AAAA,EACpC,EAAA,EAAI,EAAE,GAAA,EAAK,UAAA,EAAY,QAAQ,QAAA,EAAS;AAAA;AAAA,EAExC,EAAA,EAAI,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA,EAC/B,EAAA,EAAI,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,SAAA,EAAU;AAAA,EACvC,GAAA,EAAK,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,SAAA,EAAU;AAAA;AAAA,EAExC,GAAA,EAAK,EAAE,GAAA,EAAK,SAAA,EAAW,QAAQ,CAAA,EAAE;AAAA,EACjC,IAAA,EAAM,EAAE,GAAA,EAAK,SAAA,EAAW,QAAQ,CAAA,EAAE;AAAA;AAAA,EAElC,GAAA,EAAK,EAAE,GAAA,EAAK,UAAA,EAAY,QAAQ,CAAA,EAAE;AAAA,EAClC,IAAA,EAAM,EAAE,GAAA,EAAK,UAAA,EAAY,QAAQ,GAAA,EAAK;AAAA;AAAA,EAEtC,GAAA,EAAK,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA;AAAA;AAAA;AAAA,EAIhC,GAAA,EAAK,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA,EAChC,MAAA,EAAQ,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA,EACnC,GAAA,EAAK,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,CAAA,EAAE;AAAA,EAChC,KAAA,EAAO,EAAE,GAAA,EAAK,SAAA,EAAW,QAAQ,CAAA,EAAE;AAAA;AAAA,EAEnC,KAAA,EAAO,EAAE,GAAA,EAAK,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAM;AAAA,EAC9C,MAAA,EAAQ,EAAE,GAAA,EAAK,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA,EAAG,MAAA,EAAQ,GAAA,GAAO,IAAA,EAAU;AAAA;AAAA,EAE1D,QAAA,EAAU,EAAE,GAAA,EAAK,CAAC,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,EAC7C,QAAA,EAAU,EAAE,GAAA,EAAK,CAAC,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG,MAAA,EAAQ,EAAA,EAAG;AAAA,EAC9C,QAAA,EAAU,EAAE,GAAA,EAAK,CAAC,EAAA,EAAI,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG,MAAA,EAAQ,GAAA,GAAS,QAAA,EAAS;AAAA;AAAA,EAE7D,UAAA,EAAY,EAAE,GAAA,EAAK,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA,EAAG,MAAA,EAAQ,CAAA,GAAI,GAAA,EAAO;AAAA;AAAA,EAExD,MAAA,EAAQ,EAAE,GAAA,EAAK,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAM;AAAA,EAC/C,MAAA,EAAQ,EAAE,GAAA,EAAK,CAAC,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA,EAAG,MAAA,EAAQ,SAAA,GAAY,GAAA;AACvD,CAAA;AAGO,SAAS,QAAQA,KAAAA,EAAmC;AACzD,EAAA,MAAM,GAAA,GAAM,MAAMA,KAAI,CAAA;AACtB,EAAA,IAAI,KAAK,OAAO,GAAA;AAChB,EAAA,IAAI,mBAAA,CAAoBA,KAAI,CAAA,EAAG,OAAO,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,CAAA,EAAE;AACjE,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,aAAA,CAAc,KAAA,EAAe,QAAA,EAA8B,MAAA,EAAwB;AACjG,EAAA,MAAM,EAAA,GAAK,MAAM,MAAM,CAAA;AACvB,EAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,aAAA,CAAc,CAAA,cAAA,EAAiB,MAAM,CAAA,CAAE,CAAA;AAC1D,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,KAAA,GAAQ,EAAA,CAAG,MAAA;AACjC,EAAA,MAAM,IAAA,GAAO,MAAM,QAAQ,CAAA;AAC3B,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,aAAA,CAAc,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAE,CAAA;AAC9D,EAAA,IAAI,CAAC,SAAA,CAAU,IAAA,CAAK,GAAA,EAAK,EAAA,CAAG,GAAG,CAAA,EAAG;AAChC,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,oBAAA,EAAuB,QAAQ,CAAA,IAAA,EAAO,MAAM,CAAA,oBAAA,CAAsB,CAAA;AAAA,EAC5F;AACA,EAAA,OAAQ,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAU,EAAA,CAAG,MAAA;AACpC;AAEO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF,CAAA;AAOO,SAAS,cAAA,CAAe,CAAA,EAAuB,IAAA,EAAiB,CAAA,EAAuB,MAAiB,SAAA,EAA0C;AACvJ,EAAA,IAAI,SAAA,CAAU,SAAA,EAAW,QAAQ,CAAA,EAAG,OAAO,MAAA;AAC3C,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,CAAC,CAAC,CAAA,EAAG,IAAI,CAAA,EAAG,CAAC,CAAA,EAAG,IAAI,CAAC,CAAA,EAAY;AACpD,IAAA,IAAI,CAAC,CAAA,IAAK,SAAA,CAAU,CAAA,EAAG,QAAQ,CAAA,EAAG;AAClC,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EACd;AACA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,EAAG,GAAA,IAAO,QAAA,EAAU,SAAS,CAAC,CAAA;AACrF,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,KAAA;AAC9C,EAAA,OAAO,KAAK,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,MAAG,CAAA,GAAI,MAAA;AAC5C;AAGO,SAAS,cAAA,CAAe,CAAA,EAAuB,CAAA,EAAuB,IAAA,EAAiB,SAAA,EAA0C;AACtI,EAAA,IAAI,SAAA,CAAU,SAAA,EAAW,QAAQ,CAAA,EAAG,OAAO,MAAA;AAC3C,EAAA,IAAI,CAAC,CAAA,IAAK,SAAA,CAAU,IAAA,EAAM,QAAQ,GAAG,OAAO,CAAA;AAC5C,EAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,EAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAClB;;;AC5GO,IAAM,MAAA,GAAc,EAAE,IAAA,EAAM,QAAA,EAAS;AAErC,SAAS,GAAA,CAAI,KAAA,EAAe,GAAA,GAAiB,QAAA,EAAU,IAAA,EAAoB;AAChF,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,KAAK,IAAA,EAAK;AAC5C;AAEO,SAAS,IAAI,KAAA,EAAoB;AACtC,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM;AACjC;AAGO,SAAS,OAAO,CAAA,EAAiB;AACtC,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,OAAO,EAAE,KAAA,KAAU,CAAA;AAC5C,EAAA,IAAI,EAAE,IAAA,KAAS,QAAA,EAAU,OAAO,CAAA,CAAE,MAAM,MAAA,GAAS,CAAA;AACjD,EAAA,IAAI,EAAE,IAAA,KAAS,QAAA,EAAU,OAAO,CAAA,CAAE,OAAO,IAAA,GAAO,CAAA;AAChD,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,OAAO,EAAE,IAAA,GAAO,CAAA;AACzC,EAAA,OAAO,KAAA;AACT;;;ACpBO,IAAM,aAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,EACvC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF,CAAA;AAeO,SAAS,QAAA,CAAS,MAAgB,GAAA,EAAuB;AAC9D,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,SAAA;AACH,MAAA,OAAO,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IACvB,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,KAAK,IAAA,EAAK;AAAA,IAC3C,KAAK,QAAA;AACH,MAAA,OAAO,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IACvB,KAAK,KAAA;AACH,MAAA,OAAO,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAAA,IACjC,KAAK,QAAA;AACH,MAAA,MAAM,IAAI,cAAc,yDAAyD,CAAA;AAAA,IACnF,KAAK,KAAA;AACH,MAAA,IAAI,CAAC,GAAA,CAAI,UAAA,EAAY,MAAM,IAAI,aAAA,CAAc,CAAA,SAAA,EAAY,IAAA,CAAK,UAAU,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,oBAAA,CAAsB,CAAA;AAC7G,MAAA,OAAO,GAAA,CAAI,WAAW,IAAI,CAAA;AAAA,IAC5B,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAChC,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO,OAAO,IAAI,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AACnD,MAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,OAAO,MAAA;AAChC,MAAA,IAAI,EAAE,IAAA,KAAS,QAAA,EAAU,MAAM,IAAI,cAAc,+BAA+B,CAAA;AAChF,MAAA,OAAO,IAAI,CAAC,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,EAAK,EAAE,IAAI,CAAA;AAAA,IACpC;AAAA,IACA,KAAK,QAAA;AACH,MAAA,OAAO,UAAA,CAAW,MAAM,GAAG,CAAA;AAAA,IAC7B,KAAK,MAAA;AACH,MAAA,OAAO,QAAA,CAAS,MAAM,GAAG,CAAA;AAAA;AAE/B;AAEA,SAAS,UAAA,CAAW,MAA6C,GAAA,EAAuB;AACtF,EAAA,MAAM,EAAE,IAAG,GAAI,IAAA;AACf,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,MAAMY,EAAAA,GAAI,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA;AACjC,IAAA,IAAI,CAAC,MAAA,CAAOA,EAAC,CAAA,EAAG,OAAO,IAAI,CAAC,CAAA;AAC5B,IAAA,OAAO,GAAA,CAAI,OAAO,QAAA,CAAS,IAAA,CAAK,OAAO,GAAG,CAAC,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,MAAMA,EAAAA,GAAI,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA;AACjC,IAAA,IAAI,MAAA,CAAOA,EAAC,CAAA,EAAG,OAAO,IAAI,CAAC,CAAA;AAC3B,IAAA,OAAO,GAAA,CAAI,OAAO,QAAA,CAAS,IAAA,CAAK,OAAO,GAAG,CAAC,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAAA,EACtD;AACA,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA;AACjC,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA;AAElC,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,SAAS,QAAA,EAAU;AAC9C,IAAA,OAAO,YAAA,CAAa,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA;AAAA,EAC9B;AAEA,EAAA,IAAI,EAAA,KAAO,IAAA,IAAQ,EAAA,KAAO,IAAA,EAAM;AAC9B,IAAA,MAAM,EAAA,GAAK,WAAA,CAAY,CAAA,EAAG,CAAC,CAAA;AAC3B,IAAA,OAAO,GAAA,CAAI,OAAO,IAAA,GAAQ,EAAA,GAAK,IAAI,CAAA,GAAK,EAAA,GAAK,IAAI,CAAC,CAAA;AAAA,EACpD;AACA,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,SAAS,QAAA,EAAU;AAE9C,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,IAAA,IAAQ,EAAA,KAAO,OAAO,EAAA,KAAO,IAAA,EAAM,OAAO,GAAA,CAAI,CAAC,CAAA;AACxE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,SAAS,QAAA,EAAU;AAC9C,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,UAAA,EAAa,EAAE,CAAA,kBAAA,CAAoB,CAAA;AAAA,EAC7D;AACA,EAAA,QAAQ,EAAA;AAAI,IACV,KAAK,GAAA;AAAA,IACL,KAAK,GAAA,EAAK;AACR,MAAA,IAAI,CAAC,SAAA,CAAU,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,GAAG,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAI,aAAA,CAAc,CAAA,wBAAA,EAA2B,EAAE,MAAM,SAAA,CAAU,CAAA,CAAE,GAAG,CAAC,CAAA,IAAA,EAAO,SAAA,CAAU,CAAA,CAAE,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,MACtG;AACA,MAAA,OAAO,IAAI,EAAA,KAAO,GAAA,GAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,IAAA,IAAQ,EAAE,IAAI,CAAA;AAAA,IACxF;AAAA,IACA,KAAK,GAAA,EAAK;AACR,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAA,CAAE,GAAA,EAAK,EAAE,GAAG,CAAA;AAC/B,MAAA,OAAO,IAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,EAAO,KAAK,cAAA,CAAe,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,IACtF;AAAA,IACA,KAAK,GAAA,EAAK;AACR,MAAA,IAAI,CAAA,CAAE,KAAA,KAAU,CAAA,EAAG,OAAO,MAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,CAAA,CAAE,GAAA,EAAK,EAAE,GAAG,CAAA;AAC/B,MAAA,OAAO,GAAA,CAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,OAAO,GAAA,EAAK,cAAA,CAAe,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,IAC/E;AAAA,IACA,KAAK,GAAA;AAAK,MAAA,OAAO,GAAA,CAAI,UAAU,CAAC,CAAA,GAAI,UAAU,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,IACxD,KAAK,IAAA;AAAM,MAAA,OAAO,GAAA,CAAI,UAAU,CAAC,CAAA,IAAK,UAAU,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,IAC1D,KAAK,GAAA;AAAK,MAAA,OAAO,GAAA,CAAI,UAAU,CAAC,CAAA,GAAI,UAAU,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,IACxD,KAAK,IAAA;AAAM,MAAA,OAAO,GAAA,CAAI,UAAU,CAAC,CAAA,IAAK,UAAU,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA;AAE9D;AAQA,SAAS,YAAA,CAAa,EAAA,EAAY,CAAA,EAAQ,CAAA,EAAa;AACrD,EAAA,IAAI,EAAA,KAAO,KAAA,IAAS,EAAA,KAAO,IAAA,IAAQ,OAAO,IAAA,IAAQ,EAAA,KAAO,IAAA,IAAQ,EAAA,KAAO,OAAO,EAAA,KAAO,IAAA,IAAQ,EAAA,KAAO,GAAA,IAAO,OAAO,IAAA,EAAM;AACvH,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,UAAA,EAAa,EAAE,CAAA,0BAAA,CAA4B,CAAA;AAAA,EACrE;AACA,EAAA,IAAI,EAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,KAAS,UAAU,OAAO,MAAA;AACvD,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,CAAA,GAAI,MAAA;AAC1C,EAAA,MAAM,OAAA,GAAU,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,CAAA,GAAI,MAAA;AAC1C,EAAA,MAAM,WAAW,CAAC,CAAA,KAAgC,EAAE,IAAA,KAAS,QAAA,GAAW,EAAE,KAAA,GAAQ,MAAA;AAClF,EAAA,IAAI,CAAC,OAAA,IAAW,QAAA,CAAS,CAAC,CAAA,KAAM,MAAA,EAAW,MAAM,IAAI,aAAA,CAAc,CAAA,UAAA,EAAa,EAAE,CAAA,4BAAA,CAA8B,CAAA;AAChH,EAAA,IAAI,CAAC,OAAA,IAAW,QAAA,CAAS,CAAC,CAAA,KAAM,MAAA,EAAW,MAAM,IAAI,aAAA,CAAc,CAAA,UAAA,EAAa,EAAE,CAAA,4BAAA,CAA8B,CAAA;AAEhH,EAAA,MAAM,IAAA,GAAO,SAAS,CAAC,CAAA;AACvB,EAAA,MAAM,IAAA,GAAO,SAAS,CAAC,CAAA;AACvB,EAAA,MAAM,IAAA,GAAO,EAAE,IAAA,KAAS,QAAA,IAAY,EAAE,IAAA,KAAS,QAAA,GAAW,EAAE,GAAA,GAAM,MAAA;AAClE,EAAA,MAAM,IAAA,GAAO,EAAE,IAAA,KAAS,QAAA,IAAY,EAAE,IAAA,KAAS,QAAA,GAAW,EAAE,GAAA,GAAM,MAAA;AAClE,EAAA,IAAA,CAAK,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,KAAQ,IAAA,IAAQ,QAAQ,CAAC,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA,EAAG;AACxE,IAAA,MAAM,IAAI,aAAA,CAAc,CAAA,wBAAA,EAA2B,EAAE,CAAA,GAAA,EAAM,SAAA,CAAU,IAAI,CAAC,CAAA,IAAA,EAAO,SAAA,CAAU,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACpG;AACA,EAAA,MAAM,YACJ,EAAA,KAAO,GAAA,GAAM,OAAO,IAAA,IAAQ,QAAA,EAAU,QAAQ,QAAQ,CAAA,GACpD,EAAA,KAAO,GAAA,GAAM,OAAO,IAAA,IAAQ,QAAA,EAAU,QAAQ,QAAQ,CAAA,GACrD,QAAQ,IAAA,IAAQ,QAAA;AAErB,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,CAAA,KAAkC;AAC1D,IAAA,QAAQ,EAAA;AAAI,MACV,KAAK,GAAA;AAAK,QAAA,OAAO,CAAA,GAAI,CAAA;AAAA,MACrB,KAAK,GAAA;AAAK,QAAA,OAAO,CAAA,GAAI,CAAA;AAAA,MACrB,KAAK,GAAA;AAAK,QAAA,OAAO,CAAA,GAAI,CAAA;AAAA,MACrB,KAAK,GAAA;AAAK,QAAA,OAAO,CAAA,KAAM,CAAA,GAAI,MAAA,GAAY,CAAA,GAAI,CAAA;AAAA,MAC3C;AAAS,QAAA,OAAO,MAAA;AAAA;AAClB,EACF,CAAA;AAEA,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,MAAM,SAAS,OAAA,IAAW,OAAA;AAC1B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,EAAE,CAAA,IAAK,OAAO,MAAA,EAAQ;AACrC,IAAA,MAAM,CAAA,GAAI,UAAU,EAAA,GAAK,IAAA;AACzB,IAAA,MAAM,IAAI,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA;AAC9C,IAAA,IAAI,MAAM,MAAA,EAAW;AACrB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACxB,IAAA,IAAI,KAAA,KAAU,UAAa,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAC1E;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,KAAK,SAAA,EAAU;AAClD;AAEA,SAAS,WAAA,CAAY,GAAQ,CAAA,EAAiB;AAC5C,EAAA,IAAI,CAAA,CAAE,SAAS,QAAA,IAAY,CAAA,CAAE,SAAS,QAAA,EAAU,OAAO,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,IAAA;AACpE,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,SAAS,QAAA,EAAU;AAC9C,IAAA,OAAO,CAAA,CAAE,SAAS,QAAA,IAAY,CAAA,CAAE,SAAS,QAAA,IAAY,CAAA,CAAE,UAAU,CAAA,CAAE,KAAA;AAAA,EACrE;AACA,EAAA,IAAI,CAAA,CAAE,SAAS,QAAA,IAAY,CAAA,CAAE,SAAS,QAAA,EAAU,OAAO,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,IAAA;AACpE,EAAA,IAAI,CAAC,SAAA,CAAU,CAAA,CAAE,KAAK,CAAA,CAAE,GAAG,GAAG,OAAO,KAAA;AACrC,EAAA,OAAO,SAAA,CAAU,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,CAAA;AACrC;AAGA,SAAS,UAAU,CAAA,EAA6C;AAC9D,EAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA,CAAE,KAAA;AACtB,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA;AACxB,EAAA,OAAO,GAAA,GAAM,CAAA,CAAE,KAAA,GAAQ,GAAA,CAAI,SAAS,CAAA,CAAE,KAAA;AACxC;AAEA,SAAS,QAAA,CAAS,MAA2C,GAAA,EAAuB;AAClF,EAAA,MAAM,EAAE,IAAA,EAAAZ,KAAAA,EAAM,IAAA,EAAK,GAAI,IAAA;AAEvB,EAAA,IAAIA,UAAS,KAAA,EAAO;AAClB,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,cAAc,0BAA0B,CAAA;AACzE,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,CAAC,GAAG,GAAG,CAAA;AAC/B,IAAA,OAAO,GAAA,CAAI,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,IAAI,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,IAAIA,UAAS,SAAA,EAAW;AACtB,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,cAAc,qCAAqC,CAAA;AACpF,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,CAAA;AAC9B,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,CAAC,GAAG,GAAG,CAAA;AAC/B,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,OAAO,MAAA;AAChC,IAAA,IAAI,EAAE,IAAA,KAAS,QAAA,EAAU,MAAM,IAAI,cAAc,6BAA6B,CAAA;AAC9E,IAAA,MAAM,EAAA,GAAK,MAAM,MAAM,CAAA;AACvB,IAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,aAAA,CAAc,CAAA,cAAA,EAAiB,MAAM,CAAA,CAAE,CAAA;AAC1D,IAAA,IAAI,CAAC,SAAA,CAAU,CAAA,CAAE,GAAA,EAAK,EAAA,CAAG,GAAG,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,aAAA,CAAc,CAAA,8BAAA,EAAiC,SAAA,CAAU,CAAA,CAAE,GAAG,CAAC,CAAA,QAAA,EAAW,SAAA,CAAU,EAAA,CAAG,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IACzG;AACA,IAAA,OAAO,GAAA,CAAI,aAAA,CAAc,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,MAAM,MAAM,CAAA,EAAG,EAAA,CAAG,GAAA,EAAK,MAAM,CAAA;AAAA,EACnE;AAGA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,MAAA,GAAS,QAAA,CAAS,CAAA,EAAG,GAAG,CAAE,CAAA;AAO9E,EAAA,IAAI,eAAA,CAAgBA,KAAI,CAAA,KAAM,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,KAAS,KAAA,IAAS,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,KAAS,QAAA,CAAA,EAAW;AACpF,IAAA,MAAMa,SAAAA,GAAW,GAAA,CAAI,YAAA,GAAeb,KAAAA,EAAM,MAAM,IAAI,CAAA;AACpD,IAAA,IAAIa,SAAAA,KAAa,QAAW,OAAOA,SAAAA;AAAA,EACrC;AAKA,EAAA,IAAIb,KAAAA,KAAS,YAAA,IAAgBA,KAAAA,KAAS,WAAA,IAAeA,UAAS,UAAA,EAAY;AACxE,IAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GAAI,IAAA;AACzB,IAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,QAAA,EAAU,OAAO,MAAA;AACtC,IAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,QAAA,IAAY,MAAA,EAAQ,SAAS,QAAA,EAAU;AAC1D,MAAA,MAAM,IAAI,aAAA,CAAc,CAAA,EAAGA,KAAI,CAAA,yBAAA,CAA2B,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,SAAA,CAAUA,KAAAA,EAAM,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,EAC5C;AAMA,EAAA,IAAIA,UAAS,YAAA,EAAc;AACzB,IAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GAAI,IAAA;AACzB,IAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,QAAA,EAAU,OAAO,MAAA;AACtC,IAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,QAAA,IAAY,MAAA,EAAQ,SAAS,QAAA,EAAU;AAC1D,MAAA,MAAM,IAAI,cAAc,qCAAqC,CAAA;AAAA,IAC/D;AACA,IAAA,MAAM,IAAA,GAAO,IAAI,MAAA,CAAO,IAAA;AACxB,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,IAAA,KAAA,MAAW,GAAA,IAAO,CAAC,GAAG,MAAA,CAAO,OAAO,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,EAAG;AACjE,MAAA,IAAA,GAAO,SAAS,MAAA,CAAO,MAAA,CAAO,IAAI,GAAG,CAAA,IAAK,KAAK,IAAA,IAAQ,IAAA;AACvD,MAAA,MAAA,CAAO,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,IACtB;AACA,IAAA,OAAO,EAAE,MAAM,QAAA,EAAU,MAAA,EAAQ,KAAK,MAAA,CAAO,GAAA,EAAK,IAAA,EAAM,MAAA,CAAO,IAAA,EAAK;AAAA,EACtE;AAGA,EAAA,IAAI,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,KAAS,aAAaA,KAAAA,KAAS,KAAA,IAASA,KAAAA,KAAS,MAAA,IAAUA,KAAAA,KAAS,KAAA,IAASA,KAAAA,KAAS,KAAA,IAASA,UAAS,MAAA,CAAA,EAAS;AAC5H,IAAA,MAAM,MAAA,GAAS,KAAK,CAAC,CAAA;AACrB,IAAA,MAAM,SAAS,CAAC,GAAG,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA;AACzC,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAChC,IAAA,QAAQA,KAAAA;AAAM,MACZ,KAAK,KAAA;AAAO,QAAA,OAAO,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,EAAG,MAAA,CAAO,GAAA,EAAK,OAAO,IAAI,CAAA;AAAA,MACjF,KAAK,MAAA;AAAQ,QAAA,OAAO,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,IAAI,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,GAAA,EAAK,OAAO,IAAI,CAAA;AAAA,MAClG,KAAK,KAAA;AAAO,QAAA,OAAO,GAAA,CAAI,KAAK,GAAA,CAAI,GAAG,MAAM,CAAA,EAAG,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,IAAI,CAAA;AAAA,MACnE,KAAK,KAAA;AAAO,QAAA,OAAO,GAAA,CAAI,KAAK,GAAA,CAAI,GAAG,MAAM,CAAA,EAAG,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,IAAI,CAAA;AAAA,MACnE,KAAK,MAAA;AAAQ,QAAA,OAAO,GAAA,CAAI,OAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,EAAG,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,IAAI,CAAA;AAAA;AAC5E,EACF;AAEA,EAAA,QAAQA,KAAAA;AAAM,IACZ,KAAK,KAAA;AAAA,IACL,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,OAAA,GAAU,WAAA,CAAYA,KAAAA,EAAM,IAAI,CAAA;AACtC,MAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACjC,MAAA,MAAM,IAAA,GAAO,QAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,KAAA,CAAOA,KAAAA,KAAS,QAAQ,SAAA,CAAU,CAAC,IAAI,SAAA,CAAU,CAAC,IAAI,SAAA,CAAU,CAAC,IAAI,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA,GAAI,CAAC,CAAA;AAC1H,MAAA,OAAO,IAAI,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,GAAA,EAAK,KAAK,IAAI,CAAA;AAAA,IAC5C;AAAA,IACA,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,CAAC,CAAC,CAAA,GAAI,WAAA,CAAYA,KAAAA,EAAM,MAAM,CAAC,CAAA;AACrC,MAAA,OAAO,GAAA,CAAI,KAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,EAAG,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AAAA,IAC7C;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,CAAC,CAAA,EAAG,CAAC,CAAA,GAAI,WAAA,CAAYA,OAAM,IAAI,CAAA;AACrC,MAAA,MAAM,QAAA,GAAW,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA;AAC/B,MAAA,MAAM,IAAI,EAAA,IAAM,QAAA;AAChB,MAAA,OAAO,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AAAA,IACvD;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,CAAC,CAAC,CAAA,GAAI,WAAA,CAAYA,KAAAA,EAAM,MAAM,CAAC,CAAA;AACrC,MAAA,OAAO,GAAA,CAAI,KAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA,EAAG,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AAAA,IAC/C;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,CAAC,CAAC,CAAA,GAAI,WAAA,CAAYA,KAAAA,EAAM,MAAM,CAAC,CAAA;AACrC,MAAA,OAAO,GAAA,CAAI,KAAK,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,EAAG,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AAAA,IAC9C;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,CAAC,GAAG,EAAA,EAAI,EAAE,IAAI,WAAA,CAAYA,KAAAA,EAAM,MAAM,CAAC,CAAA;AAC7C,MAAA,OAAO,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,EAAE,KAAA,EAAO,EAAA,CAAG,KAAK,CAAA,EAAG,GAAG,KAAK,CAAA,EAAG,CAAA,CAAE,GAAA,EAAK,EAAE,IAAI,CAAA;AAAA,IAC3E;AAAA;AAGF,EAAA,MAAM,QAAA,GAAW,GAAA,CAAI,YAAA,GAAeA,KAAAA,EAAM,MAAM,IAAI,CAAA;AACpD,EAAA,IAAI,QAAA,KAAa,QAAW,OAAO,QAAA;AACnC,EAAA,MAAM,IAAI,aAAA,CAAc,CAAA,kBAAA,EAAqBA,KAAI,CAAA,CAAE,CAAA;AACrD;AAEA,IAAM,eAAA,GAAwC,EAAE,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAM,IAAA,EAAK;AAGpH,SAAS,SAAA,CACPA,KAAAA,EACA,MAAA,EACA,MAAA,EACK;AACL,EAAA,MAAM,SAAS,CAAC,GAAA,KAAwB,OAAO,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,IAAK,CAAA;AAClE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,MAAA,CAAO,IAAA,EAAK,EAAG;AACtC,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,MAAA,EAAQ,KAAK,GAAA,IAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AACtD,IAAA,IAAIA,UAAS,WAAA,EAAa;AACxB,MAAA,MAAA,CAAO,GAAA,CAAI,KAAK,GAAG,CAAA;AACnB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAO,GAAA,GAAM,MAAA;AACnB,IAAA,IAAIA,UAAS,YAAA,EAAc;AACzB,MAAA,MAAA,CAAO,GAAA,CAAI,KAAK,IAAI,CAAA;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,GAAM,CAAC,CAAA,GAAI,IAAA;AAC/B,MAAA,QAAA,IAAY,IAAA,GAAO,IAAA;AAAA,IACrB;AACA,IAAA,MAAA,CAAO,IAAI,GAAA,EAAK,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,MAAM,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,EAAE,MAAM,QAAA,EAAU,MAAA,EAAQ,KAAK,MAAA,CAAO,GAAA,EAAK,IAAA,EAAM,MAAA,CAAO,IAAA,EAAK;AACtE;AAGA,SAAS,QAAQ,IAAA,EAAwB;AACvC,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,KAAA,EAAO,OAAO,IAAA,CAAK,IAAA;AACrC,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA,CAAK,KAAA;AACxC,EAAA,MAAM,IAAI,cAAc,2CAA2C,CAAA;AACrE;AAOA,SAAS,WAAA,CACPA,KAAAA,EACA,IAAA,EACA,KAAA,EACoC;AACpC,EAAA,MAAM,MAA0C,EAAC;AACjD,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACzB,IAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU,MAAM,IAAI,aAAA,CAAc,CAAA,EAAGA,KAAI,CAAA,6BAAA,CAA+B,CAAA;AACvF,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACZ;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,KAAA,IAAS,GAAA,CAAI,WAAW,KAAA,EAAO;AACjD,MAAA,MAAM,IAAI,cAAc,CAAA,EAAGA,KAAI,YAAY,KAAK,CAAA,0BAAA,EAA6B,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IAC3F;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;;;AC/VO,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,EAC/C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AACF,CAAA;AAcO,SAAS,QAAA,CAAS,MAAgB,GAAA,EAA2B;AAClE,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,SAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAChC,MAAA,IAAI,CAAC,KAAK,MAAM,IAAI,sBAAsB,CAAA,gBAAA,EAAmB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AACxE,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,IACA,KAAK,KAAA;AACH,MAAA,OAAO,GAAA,CAAI,MAAA,GAAS,IAAI,CAAA,IAAK,QAAA;AAAA,IAC/B,KAAK,OAAA;AACH,MAAA,OAAO,KAAK,EAAA,KAAO,KAAA,GAAQ,WAAW,QAAA,CAAS,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,IAC9D,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,EAAE,IAAG,GAAI,IAAA;AACf,MAAA,IAAI,EAAA,KAAO,KAAA,IAAS,EAAA,KAAO,IAAA,EAAM;AAC/B,QAAA,QAAA,CAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB,QAAA,QAAA,CAAS,IAAA,CAAK,OAAO,GAAG,CAAA;AACxB,QAAA,OAAO,QAAA;AAAA,MACT;AACA,MAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,GAAG,CAAC,CAAA;AACjF,MAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,GAAG,CAAC,CAAA;AACjF,MAAA,MAAM,CAAA,GAAI,aAAA,CAAc,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA;AACtC,MAAA,MAAM,CAAA,GAAI,aAAA,CAAc,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA;AACvC,MAAA,IAAI,KAAK,CAAA,IAAK,CAAC,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,qBAAA;AAAA,UACR,CAAA,wBAAA,EAA2B,EAAE,CAAA,GAAA,EAAM,SAAA,CAAU,CAAC,CAAC,CAAA,IAAA,EAAO,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,SACpE;AAAA,MACF;AACA,MAAA,OAAO,EAAA,KAAO,GAAA,IAAO,EAAA,KAAO,GAAA,GAAO,KAAK,QAAA,GAAY,QAAA;AAAA,IACtD;AAAA,IACA,KAAK,MAAA;AACH,MAAA,OAAO,YAAA,CAAa,MAAM,GAAG,CAAA;AAAA;AAEnC;AAGA,SAAS,aAAA,CAAc,MAAgB,GAAA,EAAuC;AAC5E,EAAA,IAAI,KAAK,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,KAAA,KAAU,GAAG,OAAO,MAAA;AACxD,EAAA,OAAO,QAAA,CAAS,MAAM,GAAG,CAAA;AAC3B;AAEA,SAAS,cAAc,IAAA,EAAoC;AACzD,EAAA,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,KAAA,GAAQ,MAAA;AAC/C;AAEA,SAAS,YAAA,CAAa,MAA2C,GAAA,EAA2B;AAC1F,EAAA,MAAM,EAAE,IAAA,EAAAA,KAAAA,EAAM,IAAA,EAAK,GAAI,IAAA;AACvB,EAAA,IAAIA,KAAAA,KAAS,OAAO,OAAO,QAAA;AAC3B,EAAA,IAAIA,UAAS,SAAA,EAAW;AACtB,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,sBAAsB,qCAAqC,CAAA;AAC5F,IAAA,MAAM,MAAA,GAAS,KAAK,CAAC,CAAA;AACrB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,KAAS,KAAA,GAAQ,MAAA,CAAO,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,MAAA,CAAO,KAAA,GAAQ,MAAA;AACjG,IAAA,MAAM,IAAA,GAAO,QAAA,KAAa,MAAA,GAAY,MAAA,GAAY,QAAQ,QAAQ,CAAA;AAClE,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,IAAA,EAAM;AACtB,MAAA,MAAM,IAAI,sBAAsB,4CAA4C,CAAA;AAAA,IAC9E;AACA,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,CAAC,GAAG,GAAG,CAAA;AACjC,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,EAAK,IAAA,CAAK,GAAG,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,WAAA,EAAc,QAAQ,CAAA,sBAAA,EAAyB,SAAA,CAAU,GAAG,CAAC,CAAA,QAAA,EAAW,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,OAC7F;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EACd;AACA,EAAA,IAAIA,KAAAA,KAAS,KAAA,IAASA,KAAAA,KAAS,KAAA,IAASA,UAAS,OAAA,EAAS;AACxD,IAAA,IAAIc,IAAAA;AACJ,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,CAAA,GAAI,QAAA,CAAS,GAAA,EAAK,GAAG,CAAA;AAC3B,MAAA,IAAIA,IAAAA,IAAO,CAAC,SAAA,CAAUA,IAAAA,EAAK,CAAC,CAAA,EAAG;AAC7B,QAAA,MAAM,IAAI,qBAAA,CAAsB,CAAA,EAAGd,KAAI,CAAA,uCAAA,CAAyC,CAAA;AAAA,MAClF;AACA,MAAAc,IAAAA,GAAM,CAAA;AAAA,IACR;AACA,IAAA,IAAI,CAACA,IAAAA,EAAK,MAAM,IAAI,qBAAA,CAAsB,CAAA,EAAGd,KAAI,CAAA,iCAAA,CAAmC,CAAA;AACpF,IAAA,OAAOc,IAAAA;AAAA,EACT;AACA,EAAA,IAAId,UAAS,KAAA,IAASA,KAAAA,KAAS,WAAWA,KAAAA,KAAS,OAAA,IAAWA,UAAS,MAAA,EAAQ;AAC7E,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG,MAAM,IAAI,qBAAA,CAAsB,CAAA,EAAGA,KAAI,CAAA,uBAAA,CAAyB,CAAA;AACrF,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,GAAG,CAAA;AAAA,EAC9B;AACA,EAAA,IAAIA,UAAS,YAAA,IAAgBA,KAAAA,KAAS,eAAeA,KAAAA,KAAS,UAAA,IAAcA,UAAS,YAAA,EAAc;AACjG,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG,MAAM,IAAI,qBAAA,CAAsB,CAAA,EAAGA,KAAI,CAAA,yBAAA,CAA2B,CAAA;AACzF,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,GAAG,CAAA;AAAA,EAC9B;AACA,EAAA,IAAIA,UAAS,QAAA,EAAU;AACrB,IAAA,IAAI,KAAK,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,sBAAsB,oCAAoC,CAAA;AAC3F,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,IAAA,CAAK,CAAC,CAAC,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,IAAA,CAAK,CAAC,CAAC,CAAA;AACnC,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,EAAO;AACpB,MAAA,MAAM,IAAI,sBAAsB,kDAAkD,CAAA;AAAA,IACpF;AACA,IAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,GAAG,CAAA;AACrB,IAAA,MAAMc,IAAAA,GAAM,GAAA,CAAI,SAAA,GAAY,KAAA,EAAO,KAAK,CAAA;AACxC,IAAA,IAAI,CAACA,MAAK,MAAM,IAAI,sBAAsB,CAAA,sBAAA,EAAyB,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AACnF,IAAA,OAAOA,IAAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,QAAA,GAAW,QAAA,CAAS,CAAA,EAAG,GAAG,CAAE,CAAA;AACnF,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,GAAUd,KAAAA,EAAM,OAAO,CAAA;AACvC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,qBAAA,CAAsB,CAAA,kBAAA,EAAqBA,KAAI,CAAA,CAAE,CAAA;AACrE,EAAA,OAAO,GAAA;AACT;AAOO,SAAS,kBAAA,CAAmB,SAAoB,IAAA,EAAgC;AACrF,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAQ;AAC9B,EAAA,IAAI,mBAAA,CAAoB,IAAI,CAAA,EAAG;AAC/B,EAAA,MAAM,GAAA,GAAM,QAAQ,IAAI,CAAA;AACxB,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,qBAAA,CAAsB,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAE,CAAA;AACxE,EAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,OAAO,CAAA,EAAG;AAChC,IAAA,MAAM,IAAI,qBAAA;AAAA,MACR,CAAA,cAAA,EAAiB,IAAI,CAAA,EAAA,EAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAC,CAAA,sCAAA,EAAyC,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,KACzG;AAAA,EACF;AACF;AAGO,SAAS,aAAA,CAAc,MAAgB,GAAA,EAA2B;AACvE,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA;AACnC,EAAA,IAAI,IAAA,CAAK,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,MAAM,GAAG,CAAA;AACtC,EAAA,kBAAA,CAAmB,GAAA,EAAK,KAAK,IAAI,CAAA;AACjC,EAAA,OAAO,GAAA;AACT;;;AC1JO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EACxC,WAAA,CAAY,SAA0B,GAAA,EAAa;AACjD,IAAA,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,CAAG,CAAA;AADM,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAEpC,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AAAA,EAHsC,GAAA;AAIxC,CAAA;AAYA,IAAM,WAAA,GAAc,WAAA;AACpB,IAAM,UAAA,GAAa,eAAA;AAEnB,SAAS,SAAS,GAAA,EAAsB;AACtC,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,IAAI,MAAA,EAAQ;AACrB,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,IAAA,IAAI,MAAM,GAAA,IAAO,CAAA,KAAM,OAAQ,CAAA,KAAM,IAAA,IAAQ,MAAM,IAAA,EAAM;AAAE,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AAC1E,IAAA,IAAI,CAAA,IAAK,GAAA,IAAO,CAAA,IAAK,GAAA,IAAQ,MAAM,GAAA,IAAO,GAAA,CAAI,CAAA,GAAI,CAAC,KAAK,GAAA,IAAO,GAAA,CAAI,CAAA,GAAI,CAAC,KAAK,GAAA,EAAM;AACjF,MAAA,MAAM,IAAI,YAAA,CAAa,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AACxC,MAAA,MAAM,GAAA,GAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA;AAErB,MAAA,IAAI,GAAA,CAAI,GAAG,CAAA,KAAM,GAAA,IAAO,EAAE,GAAA,GAAM,CAAA,GAAI,GAAA,CAAI,MAAA,IAAU,WAAW,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,CAAC,CAAC,CAAA,CAAA,EAAI;AAChF,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,UAAA,CAAW,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,CAAA;AACxD,QAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AACV,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,UAAA,CAAW,CAAA,CAAE,CAAC,CAAC,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,CAAA;AACrD,MAAA,CAAA,GAAI,GAAA;AACJ,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,EAAK;AAC1B,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,IAAI,CAAC,CAAA;AAChC,MAAA,IAAI,MAAM,CAAA,EAAG,MAAM,IAAI,cAAA,CAAe,+BAA+B,CAAC,CAAA;AACtE,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA;AAC1D,MAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AACV,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAM,GAAA,EAAK;AACb,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAC,CAAA;AAClC,MAAA,IAAI,MAAM,CAAA,EAAG,MAAM,IAAI,cAAA,CAAe,8BAA8B,CAAC,CAAA;AACrE,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA;AAC5D,MAAA,CAAA,GAAI,GAAA,GAAM,CAAA;AACV,MAAA;AAAA,IACF;AACA,IAAA,IAAI,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG;AACvB,MAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,MAAA,OAAO,CAAA,GAAI,IAAI,MAAA,IAAU,UAAA,CAAW,KAAK,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAA,EAAA;AAClD,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAG3B,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,MAAM,IAAI,kBAAA,CAAmB,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAC9C,QAAA,IAAI,CAAA,EAAG;AACL,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK,EAAG,GAAA,EAAK,CAAA,EAAG,CAAA;AACnD,UAAA,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,CAAE,MAAA;AACb,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,OAAA,EAAS,GAAG,IAAA,EAAM,GAAA,EAAK,GAAG,CAAA;AAC3C,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA;AAC9B,IAAA,IAAI,GAAA,KAAQ,QAAQ,GAAA,KAAQ,IAAA,IAAQ,QAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAA,EAAM;AAChF,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,EAAM,GAAG,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA;AACvC,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AACA,IAAA,IAAI,aAAA,CAAc,QAAA,CAAS,CAAC,CAAA,EAAG;AAC7B,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,EAAM,GAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAA;AACrC,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAI,cAAA,CAAe,CAAA,sBAAA,EAAyB,CAAC,KAAK,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,MAAA,CAAO,KAAK,EAAE,CAAA,EAAG,OAAO,GAAA,EAAK,GAAA,CAAI,QAAQ,CAAA;AACzC,EAAA,OAAO,MAAA;AACT;AAEA,IAAM,iBAAA,GAA4C;AAAA,EAChD,EAAA,EAAI,CAAA;AAAA,EACJ,GAAA,EAAK,CAAA;AAAA,EACL,IAAA,EAAM,CAAA;AAAA,EAAG,IAAA,EAAM,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,IAAA,EAAM,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAAG,IAAA,EAAM,CAAA;AAAA,EACjD,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EACb,GAAA,EAAK,CAAA;AAAA,EAAG,GAAA,EAAK;AACf,CAAA;AAEA,IAAM,SAAN,MAAa;AAAA,EAEX,YAA6B,MAAA,EAAiB;AAAjB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAkB;AAAA,EAAlB,MAAA;AAAA,EADrB,GAAA,GAAM,CAAA;AAAA,EAGN,IAAA,GAAc;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAAA,EAAG;AAAA,EAC9C,IAAA,GAAc;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,EAAG;AAAA,EAEhD,KAAK,CAAA,EAAoB;AAC/B,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,IAAA,OAAO,GAAA,CAAI,CAAA,KAAM,IAAA,IAAQ,GAAA,CAAI,CAAA,KAAM,CAAA;AAAA,EACrC;AAAA,EAEQ,QAAQ,CAAA,EAAoB;AAClC,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,IAAA,OAAO,GAAA,CAAI,CAAA,KAAM,OAAA,IAAW,GAAA,CAAI,CAAA,KAAM,CAAA;AAAA,EACxC;AAAA;AAAA,EAGA,QAAA,GAAqB;AACnB,IAAA,MAAMe,KAAAA,GAAO,KAAK,eAAA,EAAgB;AAClC,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,IAAA,IAAI,IAAA,CAAK,MAAM,KAAA,EAAO,MAAM,IAAI,cAAA,CAAe,2BAAA,EAA6B,KAAK,GAAG,CAAA;AACpF,IAAA,OAAOA,KAAAA;AAAA,EACT;AAAA,EAEQ,SAAS,CAAA,EAAkB;AACjC,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,IAAA,IAAI,GAAA,CAAI,CAAA,KAAM,IAAA,IAAQ,GAAA,CAAI,CAAA,KAAM,CAAA,EAAG,MAAM,IAAI,cAAA,CAAe,CAAA,UAAA,EAAa,CAAC,CAAA,CAAA,CAAA,EAAK,IAAI,GAAG,CAAA;AACtF,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA,EAGQ,QAAA,GAAuD;AAC7D,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,IAAA,MAAM,IAAI,GAAA,CAAI,CAAA,KAAM,IAAA,GAAO,GAAA,CAAI,IAAI,GAAA,CAAI,CAAA,KAAM,OAAA,KAAY,GAAA,CAAI,MAAM,KAAA,IAAS,GAAA,CAAI,CAAA,KAAM,IAAA,CAAA,GAAQ,IAAI,CAAA,GAAI,MAAA;AACtG,IAAA,IAAI,CAAA,KAAM,QAAW,OAAO,MAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,kBAAkB,CAAC,CAAA;AAChC,IAAA,OAAO,SAAS,MAAA,GAAY,MAAA,GAAY,EAAE,EAAA,EAAI,GAAe,IAAA,EAAK;AAAA,EACpE;AAAA,EAEA,eAAA,CAAgB,UAAU,CAAA,EAAa;AACrC,IAAA,IAAI,IAAA,GAAO,KAAK,UAAA,EAAW;AAC3B,IAAA,WAAS;AACP,MAAA,MAAM,CAAA,GAAI,KAAK,QAAA,EAAS;AACxB,MAAA,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,IAAA,GAAO,SAAS,OAAO,IAAA;AACnC,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,CAAA,CAAE,OAAO,CAAC,CAAA;AAC7C,MAAA,IAAA,GAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAI,CAAA,CAAE,EAAA,EAAI,MAAM,KAAA,EAAM;AAAA,IACjD;AAAA,EACF;AAAA,EAEQ,UAAA,GAAuB;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,IAAA,IAAI,GAAA,CAAI,CAAA,KAAM,IAAA,IAAQ,GAAA,CAAI,MAAM,GAAA,EAAK;AACnC,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,OAAO,EAAE,MAAM,OAAA,EAAS,EAAA,EAAI,KAAK,GAAA,EAAK,IAAA,CAAK,YAAW,EAAE;AAAA,IAC1D;AACA,IAAA,IAAI,GAAA,CAAI,CAAA,KAAM,OAAA,IAAW,GAAA,CAAI,MAAM,KAAA,EAAO;AACxC,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,OAAO,EAAE,MAAM,OAAA,EAAS,EAAA,EAAI,OAAO,GAAA,EAAK,IAAA,CAAK,YAAW,EAAE;AAAA,IAC5D;AACA,IAAA,OAAO,KAAK,YAAA,EAAa;AAAA,EAC3B;AAAA,EAEQ,YAAA,GAAyB;AAC/B,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,IAAA,IAAI,GAAA,CAAI,MAAM,KAAA,EAAO,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,GAAA,CAAI,CAAA,EAAE;AAC5D,IAAA,IAAI,GAAA,CAAI,MAAM,QAAA,EAAU,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,GAAA,CAAI,CAAA,EAAE;AAC7D,IAAA,IAAI,GAAA,CAAI,MAAM,KAAA,EAAO,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,GAAA,CAAI,CAAA,EAAE;AAC3D,IAAA,IAAI,GAAA,CAAI,CAAA,KAAM,IAAA,IAAQ,GAAA,CAAI,MAAM,GAAA,EAAK;AACnC,MAAA,MAAM,KAAA,GAAQ,KAAK,eAAA,EAAgB;AACnC,MAAA,IAAA,CAAK,SAAS,GAAG,CAAA;AACjB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,GAAA,CAAI,CAAA,KAAM,IAAA,IAAQ,GAAA,CAAI,MAAM,GAAA,EAAK;AACnC,MAAA,MAAM,IAAI,cAAA,CAAe,gBAAA,EAAkB,GAAA,CAAI,GAAG,CAAA;AAAA,IACpD;AACA,IAAA,IAAI,GAAA,CAAI,MAAM,OAAA,EAAS;AAErB,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAG;AAClB,QAAA,IAAA,CAAK,IAAA,EAAK;AACV,QAAA,MAAM,MAAA,GAAS,KAAK,IAAA,EAAK;AACzB,QAAA,IAAI,MAAA,CAAO,MAAM,OAAA,EAAS,MAAM,IAAI,cAAA,CAAe,uCAAA,EAAyC,OAAO,GAAG,CAAA;AACtG,QAAA,IAAI,OAAA;AACJ,QAAA,IAAI,OAAA;AACJ,QAAA,MAAM,UAAA,GAAa,KAAK,IAAA,EAAK;AAC7B,QAAA,IAAI,UAAA,CAAW,MAAM,OAAA,EAAS;AAAE,UAAA,OAAA,GAAU,UAAA,CAAW,CAAA;AAAG,UAAA,IAAA,CAAK,IAAA,EAAK;AAAA,QAAG;AACrE,QAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG;AACtB,UAAA,IAAA,CAAK,IAAA,EAAK;AACV,UAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,UAAA,IAAI,IAAA,CAAK,MAAM,OAAA,EAAS,MAAM,IAAI,cAAA,CAAe,8BAAA,EAAgC,KAAK,GAAG,CAAA;AACzF,UAAA,OAAA,GAAU,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,QACjE;AACA,QAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,GAAA,CAAI,GAAG,MAAA,EAAQ,MAAA,CAAO,CAAA,EAAG,OAAA,EAAS,OAAA,EAAQ;AAAA,MAC9E;AAEA,MAAA,IAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAG;AAClB,QAAA,IAAA,CAAK,IAAA,EAAK;AACV,QAAA,MAAM,OAAmB,EAAC;AAC1B,QAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAG;AACnB,UAAA,WAAS;AACP,YAAA,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAA;AACzB,YAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,YAAA,IAAI,GAAA,CAAI,CAAA,KAAM,IAAA,IAAQ,GAAA,CAAI,MAAM,GAAA,EAAK;AACrC,YAAA,IAAI,GAAA,CAAI,CAAA,KAAM,IAAA,IAAQ,GAAA,CAAI,MAAM,GAAA,EAAK;AACrC,YAAA,MAAM,IAAI,cAAA,CAAe,sCAAA,EAAwC,GAAA,CAAI,GAAG,CAAA;AAAA,UAC1E;AAAA,QACF,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,IAAA,EAAK;AAAA,QACZ;AACA,QAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,GAAA,CAAI,GAAG,IAAA,EAAK;AAAA,MAC3C;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,IAAI,CAAA,EAAE;AAAA,IACpC;AACA,IAAA,MAAM,IAAI,cAAA,CAAe,qBAAA,EAAuB,GAAA,CAAI,GAAG,CAAA;AAAA,EACzD;AAAA;AAAA,EAGQ,QAAA,GAAqB;AAC3B,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,IAAA,IAAI,GAAA,CAAI,MAAM,QAAA,EAAU;AACtB,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,IAAI,CAAA,EAAE;AAAA,IACxC;AACA,IAAA,OAAO,KAAK,eAAA,EAAgB;AAAA,EAC9B;AACF,CAAA;AAGO,SAAS,gBAAgB,GAAA,EAAuB;AACrD,EAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,GAAG,CAAC,EAAE,QAAA,EAAS;AAC5C;AAGA,SAAS,cAAc,GAAA,EAA6D;AAClF,EAAA,MAAM,MAAA,GAAS,SAAS,GAAG,CAAA;AAC3B,EAAA,IAAI,QAAA,GAAW,EAAA;AACf,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,GAAA,GAAM,OAAO,CAAC,CAAA;AACpB,IAAA,IAAI,GAAA,CAAI,CAAA,KAAM,IAAA,IAAQ,GAAA,CAAI,MAAM,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IAC5B,GAAA,CAAI,CAAA,KAAM,IAAA,IAAQ,GAAA,CAAI,MAAM,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACjC,KAAA,KAAU,CAAA,IAAK,GAAA,CAAI,CAAA,KAAM,IAAA,IAAQ,IAAI,CAAA,KAAM,IAAA,IAAQ,QAAA,GAAW,CAAA,EAAG,QAAA,GAAW,CAAA;AAAA,SAAA,IAC5E,UAAU,CAAA,IAAK,GAAA,CAAI,MAAM,OAAA,IAAW,GAAA,CAAI,MAAM,MAAA,EAAQ;AAAE,MAAA,OAAA,GAAU,CAAA;AAAG,MAAA;AAAA,IAAO;AAAA,EACvF;AACA,EAAA,MAAM,OAAA,GAAU,QAAA,IAAY,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,CAAE,GAAA,GAAM,OAAA,IAAW,CAAA,GAAI,MAAA,CAAO,OAAO,CAAA,CAAE,MAAM,GAAA,CAAI,MAAA;AAChG,EAAA,MAAM,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,OAAO,EAAE,IAAA,EAAK;AACxC,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,MAAM,UAAU,OAAA,IAAW,CAAA,GAAI,OAAO,OAAO,CAAA,CAAE,MAAM,GAAA,CAAI,MAAA;AACzD,IAAA,IAAA,GAAO,GAAA,CAAI,MAAM,MAAA,CAAO,QAAQ,EAAE,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,CAAE,IAAA,EAAK;AAAA,EAC3D;AACA,EAAA,IAAI,OAAA,IAAW,CAAA,EAAG,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,CAAE,GAAA,GAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AACjE,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,QAAQ,MAAA,EAAW,IAAA,EAAM,QAAQ,MAAA,EAAU;AAClE;AAOO,SAAS,cAAc,GAAA,EAAuB;AACnD,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAK,GAAI,cAAc,GAAG,CAAA;AAC9C,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC3B,EAAA,IAAI,KAAK,CAAA,EAAG,MAAM,IAAI,cAAA,CAAe,6BAA6B,CAAC,CAAA;AACnE,EAAA,MAAMf,QAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACpC,EAAA,IAAI,CAACA,KAAAA,EAAM,MAAM,IAAI,cAAA,CAAe,qBAAqB,CAAC,CAAA;AAC1D,EAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAC,EAAE,IAAA,EAAK;AACxC,EAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,cAAA,CAAe,oBAAA,EAAsB,KAAK,CAAC,CAAA;AACnE,EAAA,OAAO;AAAA,IACL,IAAA,EAAAA,KAAAA;AAAA,IACA,IAAA,EAAM,gBAAgB,OAAO,CAAA;AAAA,IAC7B,IAAA;AAAA,IACA,IAAA,EAAM,IAAA,GAAO,eAAA,CAAgB,IAAI,CAAA,GAAI;AAAA,GACvC;AACF;;;AC1QO,IAAM,sBAAN,MAA0B;AAAA,EAK/B,YAA6B,OAAA,EAAyB;AAAzB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAA0B;AAAA,EAA1B,OAAA;AAAA,EAJZ,IAAA,uBAAW,GAAA,EAAmC;AAAA;AAAA,EAE9C,WAAA,uBAAkB,GAAA,EAAuB;AAAA;AAAA,EAK1D,QAAQ,KAAA,EAA2C;AACjD,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA;AAAA,EAChE;AAAA,EAEA,IAAI,EAAA,EAA+C;AACjD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,GAAA,EAAkC;AACzC,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC7B,MAAA,MAAM,IAAI,qBAAA,CAAsB,CAAA,KAAA,EAAQ,GAAA,CAAI,EAAE,CAAA,kCAAA,CAAoC,CAAA;AAAA,IACpF;AACA,IAAA,MAAM,GAAA,GAAM,KAAK,SAAA,EAAU;AAC3B,IAAA,IAAI,GAAA,CAAI,MAAM,GAAA,CAAI,OAAA,GAAU,iBAAiB,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA;AAGlE,IAAA,GAAA,CAAI,QAAA,GAAW,CAAC,GAAG,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AAEvE,IAAA,KAAA,MAAW,OAAA,IAAW,IAAI,QAAA,EAAU;AAClC,MAAA,IAAA,CAAK,cAAA,CAAe,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAAA,IACvC;AAEA,IAAA,IAAI,GAAA,CAAI,SAAS,QAAA,IAAY,GAAA,CAAI,QAAQ,IAAA,IAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,KAAS,MAAA,EAAQ;AAC3E,MAAA,KAAA,MAAW,OAAA,IAAW,IAAI,QAAA,EAAU;AAClC,QAAA,KAAA,MAAW,MAAA,IAAU,aAAA,CAAc,GAAG,CAAA,EAAG;AACvC,UAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,QAAA,GAAW,MAAM,CAAA;AACrC,UAAA,IAAI,GAAA,EAAK,kBAAA,CAAmB,GAAA,EAAK,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,CAAI,SAAS,SAAA,EAAW;AAC1B,MAAA,KAAA,MAAW,OAAA,IAAW,IAAI,QAAA,EAAU;AAClC,QAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,GAAG,CAAA,IAAK,MAAA,CAAO,QAAQ,OAAA,CAAQ,QAAA,IAAY,EAAE,CAAA,EAAG;AAClE,UAAA,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,EAAG,GAAA,CAAI,EAAE,CAAA,CAAA,EAAI,MAAM,IAAI,GAAG,CAAA;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA;AAAA,EAC3B;AAAA;AAAA,EAGQ,cAAA,CAAe,GAAA,EAA4B,OAAA,EAAsB,OAAA,EAA0B;AACjG,IAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,OAAA,GAAU,iBAAiB,OAAA,CAAQ,IAAA,EAAM,CAAA,EAAG,GAAA,CAAI,EAAE,CAAA,CAAA,EAAI,OAAA,CAAQ,EAAE,IAAI,OAAO,CAAA;AAErG,IAAA,MAAM,WAAsC,EAAC;AAC7C,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAGjC,IAAA,MAAM,WAAA,GAAc,CAAC,MAAA,KAA8B;AACjD,MAAA,IAAI,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,SAAS,MAAM,CAAA;AAC5C,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA;AACjC,MAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,qBAAA,CAAsB,CAAA,gBAAA,EAAmB,MAAM,CAAA,CAAE,CAAA;AACtE,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AACxB,QAAA,MAAM,IAAI,qBAAA,CAAsB,CAAA,KAAA,EAAQ,GAAA,CAAI,EAAE,IAAI,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,uBAAA,CAAyB,CAAA;AAAA,MACjG;AACA,MAAA,QAAA,CAAS,IAAI,MAAM,CAAA;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,IAAO,eAAA,CAAgB,kBAAA,CAAmB,KAAK,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,UAAU,CAAC,CAAA;AACjG,QAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,aAAa,CAAA;AACxC,QAAA,IAAI,GAAA,GAAM,QAAA,CAAS,GAAA,EAAK,GAAG,CAAA;AAC3B,QAAA,IAAI,KAAK,IAAA,EAAM;AACb,UAAA,kBAAA,CAAmB,GAAA,EAAK,KAAK,IAAI,CAAA;AACjC,UAAA,IAAI,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA,EAAG,GAAA,GAAM,QAAA;AAAA,QAC5C;AACA,QAAA,QAAA,CAAS,MAAM,CAAA,GAAI,GAAA;AACnB,QAAA,OAAO,GAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,IAAA,CAAK,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,GAAG,CAAA;AAAA,MACtC,CAAA,SAAE;AACA,QAAA,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,MACxB;AAAA,IACF,CAAA;AACA,IAAA,MAAM,aAAA,GAAgB,CAACA,KAAAA,KAAwC;AAC7D,MAAA,IAAI,EAAEA,KAAAA,IAAQ,OAAA,CAAQ,KAAA,CAAA,EAAQ,OAAO,MAAA;AACrC,MAAA,OAAO,YAAYA,KAAI,CAAA;AAAA,IACzB,CAAA;AAEA,IAAA,KAAA,MAAW,UAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,KAAK,CAAA,cAAe,MAAM,CAAA;AACnE,IAAA,OAAA,CAAQ,QAAA,GAAW,QAAA;AAAA,EACrB;AAAA;AAAA,EAGQ,SAAA,CACN,aAAA,GAAyD,MAAM,MAAA,EACpD;AACX,IAAA,OAAO;AAAA,MACL,QAAQ,CAACA,KAAAA,KACP,aAAA,CAAcA,KAAI,KACf,IAAA,CAAK,WAAA,CAAY,GAAA,CAAIA,KAAI,KACzB,YAAA,CAAaA,KAAI,CAAA,EAAG,GAAA,IACpB,cAAcA,KAAI,CAAA;AAAA,MACvB,OAAA,EAAS,CAACA,KAAAA,EAAM,OAAA,KAAY;AAC1B,QAAA,IAAIA,KAAAA,KAAS,SAAS,OAAO,QAAA;AAC7B,QAAA,IAAI,kBAAA,CAAmBA,KAAI,CAAA,EAAG,OAAO,QAAQ,CAAC,CAAA;AAC9C,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,KAAA,EAAO,KAAA,KAAU,KAAK,OAAA,CAAQ,QAAA,CAAS,OAAO,KAAK;AAAA,KACjE;AAAA,EACF;AACF;AAEA,SAAS,gBAAA,CAAiB,GAAA,EAAa,KAAA,EAAe,GAAA,EAA0B;AAC9E,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,gBAAgB,GAAG,CAAA;AAC/B,IAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AACjB,IAAA,OAAO,GAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,GAAA,YAAe,KAAA,EAAO,MAAM,IAAI,qBAAA,CAAsB,QAAQ,KAAK,CAAA,YAAA,EAAe,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AACnG,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAEA,SAAS,kBAAA,CAAmB,GAAA,EAA4B,OAAA,EAAsB,MAAA,EAAgB,UAAA,EAAwC;AACpI,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,qBAAA,CAAsB,CAAA,KAAA,EAAQ,GAAA,CAAI,EAAE,IAAI,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,iCAAA,CAAmC,CAAA;AAAA,EAC3G;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,IAAA,CAAK,GAAA,EAA4B,OAAA,EAAsB,MAAA,EAAgB,GAAA,EAAqB;AACnG,EAAA,IAAI,eAAe,KAAA,EAAO;AACxB,IAAA,OAAO,IAAI,qBAAA,CAAsB,CAAA,KAAA,EAAQ,GAAA,CAAI,EAAE,CAAA,CAAA,EAAI,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,EAC3F;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,cAAc,GAAA,EAAsC;AAClE,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,EAAQ,MAAA;AAC3B,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,EAAA,OAAO,MAAM,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA,GAAS,CAAC,MAAM,CAAA;AACjD;;;AClHO,IAAM,aAAN,MAAkE;AAAA,EAavE,WAAA,CACmB,UACA,IAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEjB,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAA6B,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AACxF,IAAA,IAAA,CAAK,eAAe,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAO,MAAM,CAAA;AAC7D,IAAA,IAAA,CAAK,eAAe,QAAA,CAAS,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAO,MAAM,CAAA;AAAA,EAC/D;AAAA,EANmB,QAAA;AAAA,EACA,IAAA;AAAA,EAdV,EAAA,GAAK,uBAAA;AAAA,EACL,UAAA,GAAa,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,EAEnB,YAAA;AAAA,EACA,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,iBAAA;AAAA;AAAA,EAaR,QAAQ,MAAA,EAA4C;AAClD,IAAA,IAAI,OAAO,UAAA,KAAe,SAAA,IAAa,CAAC,MAAA,CAAO,QAAQ,OAAO,MAAA;AAC9D,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AAC9D,IAAA,IAAI,UAAA,EAAY,IAAA,CAAK,iBAAA,GAAoB,UAAA,CAAW,QAAA,CAAS,IAAA;AAC7D,IAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,MAAA,EAAQ,IAAA,CAAK,iBAAiB,CAAA;AAM9D,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,MAAM,CAAA,CAAE,QAAQ,IAAA,CAAK,iBAAA;AACtD,IAAA,MAAM,aAAsC,EAAC;AAC7C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,UAAA,CAAW,UAAA,GAAa,UAAA;AACxB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,UAAA,EAAY,YAAY,CAAA;AAC7D,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,YAAA,CAAa,UAAA,EAAY,eAAe,CAAA;AACnE,MAAA,IAAI,UAAA,aAAuB,gBAAA,GAAmB,UAAA;AAC9C,MAAA,IAAI,aAAA,aAA0B,mBAAA,GAAsB,aAAA;AAAA,IACtD;AAGA,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,aAAa,CAAA,EAAG,KAAA;AACzF,IAAA,IAAI,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,IAAY,SAAS,UAAA,EAAY;AACvE,MAAA,UAAA,CAAW,KAAA,GAAQ,MAAA,CAAQ,UAAA,CAAgC,GAAG,CAAA;AAAA,IAChE;AAEA,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,YAAA,EAAc;AACnC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AAClC,MAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAA,EAAS,GAAG,CAAA,EAAG;AACxC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,GAAA,EAAK,GAAG,CAAA;AAC3C,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,KAAK,CAAA;AAElD,MAAA,IAAI,GAAA,CAAI,SAAS,SAAA,EAAW;AAM1B,QAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,CAAA,IAAK,MAAA,EAAQ;AACpC,UAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC7B,UAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAA,EAAG;AACpC,UAAA,IAAA,CAAK,iBAAiB,MAAA,EAAQ,MAAA,EAAQ,OAAO,OAAA,CAAQ,MAAA,EAAQ,QAAW,UAAU,CAAA;AAAA,QACpF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,KAAA,MAAW,MAAA,IAAU,aAAA,CAAc,GAAG,CAAA,EAAG;AACvC,UAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAC/B,UAAA,IAAI,KAAA,EAAO,SAAS,QAAA,EAAU;AAC9B,UAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ,GAAA,CAAI,QAAQ,QAAA,IAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AAC5D,UAAA,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,QAAA,IAAY,GAAA,CAAI,EAAA,EAAI,KAAA,EAAO,OAAA,CAAQ,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,MAAM,UAAU,CAAA;AAAA,QACnH;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,iBACN,MAAA,EACA,IAAA,EACA,KAAA,EACA,MAAA,EACA,cACA,QAAA,EACM;AACN,IAAA,MAAM,OAAO,CAAC,YAAA,IAAgB,YAAA,KAAiB,MAAA,GAAS,MAAM,IAAA,GAAO,YAAA;AACrE,IAAA,MAAA,CAAO,QAAQ,GAAA,CAAI;AAAA,MACjB,IAAA;AAAA,MACA,KAAA,EAAO,IAAA,GAAO,CAAA,EAAG,YAAA,CAAa,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,YAAA,CAAa,KAAA,CAAM,KAAK,CAAA;AAAA,MAC/E,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,IAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,GAAI,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,EAAE,QAAA,EAAS,GAAI;AAAC,KACpE,CAAA;AAAA,EACH;AAAA;AAAA,EAGQ,SAAA,CAAU,QAA0B,IAAA,EAAuB;AACjE,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAA,IAAQ,CAAA,CAAE,MAAA,KAAW,oBAAoB,CAAA;AAAA,EACnG;AAAA;AAAA,EAIA,UAAU,OAAA,EAAiD;AACzD,IAAA,MAAM,cAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,YAAA,EAAc;AACnC,MAAA,IAAI,GAAA,CAAI,QAAQ,SAAA,EAAW;AACzB,QAAA,WAAA,CAAY,KAAK,GAAG,IAAA,CAAK,gBAAA,CAAiB,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,MACzD,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,KAAK,GAAG,IAAA,CAAK,kBAAA,CAAmB,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,MAC3D;AAAA,IACF;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEQ,kBAAA,CAAmB,KAA4B,OAAA,EAAiD;AACtG,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA;AAC5C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AAClC,IAAA,IAAI,CAAC,KAAK,UAAA,CAAW,GAAA,CAAI,SAAS,GAAG,CAAA,SAAU,EAAC;AAChD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,GAAA,EAAK,GAAG,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,KAAK,CAAA;AAClD,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,OAAA,EAAS,QAAQ,MAAS,CAAA;AAChE,IAAA,OAAO,MAAA,GAAS,CAAC,MAAM,CAAA,GAAI,EAAC;AAAA,EAC9B;AAAA,EAEQ,gBAAA,CAAiB,KAA4B,OAAA,EAAiD;AACpG,IAAA,MAAM,MAAA,uBAAa,GAAA,EAA6D;AAChF,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,MAAA,CAAO,eAAe,SAAA,EAAW;AACrC,MAAA,MAAM,MAAA,GAAS,cAAc,MAAM,CAAA;AACnC,MAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAClB,MAAA,IAAI,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAClC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,KAAA,GAAQ,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,QAAA,EAAU,EAAC,EAAE;AAC5C,QAAA,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAAA,MAC/B;AACA,MAAA,KAAA,CAAM,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,cAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,MAAA,EAAQ;AAClC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,QAAQ,CAAA;AACnD,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AAClC,MAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAA,EAAS,GAAG,CAAA,EAAG;AACxC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,GAAA,EAAK,GAAG,CAAA;AAC3C,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,KAAK,CAAA;AAClD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,SAAS,MAAA,EAAQ;AAAA,QACrD,UAAA,EAAY,IAAA;AAAA,QACZ,cAAc,KAAA,CAAM,KAAA;AAAA;AAAA;AAAA,QAGpB,SAAA,EAAW,EAAE,MAAA,EAAQ,IAAA,EAAK;AAAA,QAC1B,gBAAA,EAAkB,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,YAAY,CAAA;AAAA,QACtD,mBAAA,EAAqB,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,eAAe;AAAA,OAC7D,CAAA;AACD,MAAA,IAAI,MAAA,EAAQ,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEQ,YAAA,CAAa,KAAa,KAAA,EAAmC;AACnE,IAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,CAAK,QAAQ,MAAA,CAAO,QAAA,EAAU,KAAK,KAAK,CAAA;AAC3D,IAAA,OAAO,MAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,KAAA,GAAQ,MAAM,KAAA,GAAQ,MAAA;AAAA,EAChE;AAAA,EAEQ,YAAA,CACN,GAAA,EACA,OAAA,EACA,MAAA,EACA,KAAA,EAC8B;AAC9B,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAG,CAAA,CAAE,CAAC,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA;AAC/B,IAAA,IAAI,KAAA,EAAO,IAAA,KAAS,QAAA,EAAU,OAAO,MAAA;AAErC,IAAA,MAAM,QAAA,GAAoC;AAAA,MACxC,YAAA,EAAc,GAAA,CAAI,MAAA,EAAQ,GAAA,IAAO,GAAA,CAAI,EAAA;AAAA,MACrC,GAAG;AAAA,KACL;AACA,IAAA,KAAA,MAAW,UAAA,IAAc,GAAA,CAAI,MAAA,EAAQ,oBAAA,IAAwB,EAAC,EAAG;AAC/D,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AACvC,MAAA,IAAI,WAAW,IAAA,KAAS,QAAA,EAAU,QAAA,CAAS,UAAU,IAAI,SAAA,CAAU,KAAA;AACnE,MAAA,IAAI,WAAW,IAAA,KAAS,QAAA,EAAU,QAAA,CAAS,UAAU,IAAI,SAAA,CAAU,KAAA;AAAA,IACrE;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,GAAA,CAAI,MAAA,EAAQ,GAAA,IAAO,GAAA,CAAI,EAAA;AAAA,MAC7B,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,IAAA,EAAM,CAAC,GAAA,CAAI,MAAA,EAAQ,IAAA,IAAQ,GAAA,CAAI,MAAA,CAAO,IAAA,KAAS,MAAA,GAAU,KAAA,CAAM,IAAA,IAAQ,EAAA,GAAM,IAAI,MAAA,CAAO,IAAA;AAAA,MACxF,UAAA,EAAY,IAAI,MAAA,EAAQ,QAAA;AAAA,MACxB,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,CAAK,KAAI,EAAG,KAAA,EAAO,IAAA,CAAK,GAAA,EAAI,EAAE;AAAA,MACnD,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAIQ,UAAA,CAAW,SAA+B,GAAA,EAA2B;AAC3E,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,OAAA,EAAS,GAAG,CAAC,CAAA;AAAA,EACtC;AAAA;AAAA,EAGQ,aAAA,CAAc,KAA4B,GAAA,EAA2C;AAC3F,IAAA,KAAA,MAAW,OAAA,IAAW,IAAI,QAAA,EAAU;AAClC,MAAA,IAAI,KAAK,UAAA,CAAW,OAAA,CAAQ,OAAA,EAAS,GAAG,GAAG,OAAO,OAAA;AAAA,IACpD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGQ,eAAA,CAAgB,SAAsB,KAAA,EAAuC;AACnF,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAiB;AAClC,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,IAAA,MAAM,WAAA,GAAc,CAAC,MAAA,KAAwB;AAC3C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AAC9B,MAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA;AACjC,MAAA,IAAI,CAAC,IAAA,EAAM,GAAA,IAAO,SAAS,GAAA,CAAI,MAAM,GAAG,OAAO,MAAA;AAC/C,MAAA,QAAA,CAAS,IAAI,MAAM,CAAA;AACnB,MAAA,IAAI,KAAA,GAAQ,SAAS,IAAA,CAAK,GAAA,EAAK,KAAK,WAAA,CAAY,KAAA,EAAO,eAAe,CAAC,CAAA;AACvE,MAAA,QAAA,CAAS,OAAO,MAAM,CAAA;AAGtB,MAAA,IAAI,KAAA,CAAM,SAAS,QAAA,IAAY,IAAA,CAAK,QAAQ,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1E,QAAA,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,QAAA,EAAU,KAAK,IAAI,CAAA;AAAA,MAC9C;AACA,MAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,KAAK,CAAA;AACtB,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,eAAA,GAAkB,CAACA,KAAAA,KACvBA,KAAAA,IAAQ,QAAQ,KAAA,GAAQ,WAAA,CAAYA,KAAI,CAAA,GAAI,MAAA;AAC9C,IAAA,KAAA,MAAW,UAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,KAAK,CAAA,cAAe,MAAM,CAAA;AACnE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,WAAA,CAAY,OAAqB,eAAA,EAAoE;AAC3G,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,CAACA,KAAAA,KAAS,eAAA,GAAkBA,KAAI,CAAA,IAAK,KAAA,CAAM,WAAWA,KAAI,CAAA;AAAA,MACtE,YAAA,EAAc,CAACA,KAAAA,EAAM,IAAA,EAAM,OAAA,KAAY;AACrC,QAAA,IAAIA,KAAAA,KAAS,UAAU,OAAO,IAAA,CAAK,KAAK,OAAA,CAAQ,YAAA,CAAcA,KAAAA,EAAM,IAAA,EAAM,OAAO,CAAA;AACjF,QAAA,OAAO,KAAA,CAAM,YAAA,GAAeA,KAAAA,EAAM,IAAA,EAAM,OAAO,CAAA;AAAA,MACjD;AAAA,KACF;AAAA,EACF;AAAA;AAAA,EAGQ,kBAAkB,QAAA,EAA4C;AACpE,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAqC;AACjE,IAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAuC;AACvD,MAAA,IAAI,MAAA,GAAS,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA;AAClC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAA,GAAS,cAAc,CAAC,CAAA;AACxB,QAAA,eAAA,CAAgB,GAAA,CAAI,GAAG,MAAM,CAAA;AAAA,MAC/B;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAc,SAAA,KAA4D;AACzF,MAAA,MAAM,OAAA,GAAU,aAAa,IAAI,CAAA;AACjC,MAAA,MAAM,UAAA,GAAa,SAAS,UAAA,IAAc,IAAA;AAC1C,MAAA,MAAM,SAAmB,EAAC;AAC1B,MAAA,IAAI,OAAO,OAAA,EAAS,IAAA;AACpB,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,IAAI,OAAA,CAAQ,eAAe,SAAA,EAAW;AACtC,QAAA,IAAI,aAAa,gBAAA,CAAiB,QAAA,CAAS,OAAO,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA,EAAG;AACtE,QAAA,KAAA,MAAW,MAAA,IAAU,OAAA,CAAQ,OAAA,CAAQ,UAAA,EAAY;AAC/C,UAAA,IAAI,MAAA,CAAO,SAAS,UAAA,EAAY;AAChC,UAAA,MAAM,KAAA,GAAQ,mBAAmB,MAAM,CAAA;AACvC,UAAA,IAAI,UAAU,MAAA,EAAW;AACzB,UAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAGjB,UAAA,IAAA,GAAO,kBAAA,CAAmB,MAAM,CAAA,IAAK,MAAA,CAAO,IAAA,IAAQ,IAAA;AAAA,QACtD;AAAA,MACF;AACA,MAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AAAA,IACxB,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAACA,KAAAA,EAAc,OAAA,KAA6B;AAC5D,MAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,MAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,KAAA,EAAO,OAAO,MAAA;AACnC,MAAA,MAAM,SAAA,GAAY,QAAQ,CAAC,CAAA,EAAG,SAAS,QAAA,GAAW,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAA,GAAQ,MAAA;AACrE,MAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,KAAS,OAAA,CAAQ,MAAA,CAAO,MAAM,SAAS,CAAA;AACvD,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAChC,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA,EAAG,GAAA;AACvC,MAAA,QAAQA,KAAAA;AAAM,QACZ,KAAK,KAAA;AAAO,UAAA,OAAO,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,EAAG,GAAA,EAAK,IAAI,CAAA;AAAA,QACnE,KAAK,KAAA;AAAO,UAAA,OAAO,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA,EAAG,KAAK,IAAI,CAAA;AAAA,QACrD,KAAK,KAAA;AAAO,UAAA,OAAO,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA,EAAG,KAAK,IAAI,CAAA;AAAA,QACrD,KAAK,KAAA;AAAO,UAAA,OAAO,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,IAAI,CAAA;AAAA,QACnF,KAAK,MAAA;AAAQ,UAAA,OAAO,IAAI,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA,EAAG,KAAK,IAAI,CAAA;AAAA,QAC5D,KAAK,OAAA;AAAS,UAAA,OAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AAAA,QACtC;AAAS,UAAA,OAAO,MAAA;AAAA;AAClB,IACF,CAAA;AAEA,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAiB;AACzC,IAAA,MAAM,cAAA,GAAiB,CAACgB,MAAAA,EAAqBhB,KAAAA,KAAsB;AACjE,MAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC5B,MAAA,IAAI,GAAA,GAAM,GAAG,OAAO,MAAA;AACpB,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAIA,KAAI,CAAA;AACrC,MAAA,IAAI,UAAU,OAAO,QAAA;AACrB,MAAA,MAAM,GAAA,GAAM,KAAK,QAAA,CAAS,GAAA,CAAIA,MAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AAChD,MAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,IAAA,KAAS,WAAW,OAAO,MAAA;AAC3C,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAYgB,MAAK,CAAA;AAClC,MAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,IAAI,OAAA,EAAS,GAAG,GAAG,OAAO,MAAA;AAC/C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,GAAA,EAAK,GAAG,CAAA;AAC3C,MAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,OAAA,EAASA,MAAK,CAAA;AAClD,MAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,KAAK,CAAA,IAAK,MAAA,EAAQ;AACpC,QAAA,WAAA,CAAY,IAAI,CAAA,EAAG,GAAA,CAAI,EAAE,CAAA,CAAA,EAAI,MAAM,IAAI,KAAK,CAAA;AAAA,MAC9C;AACA,MAAA,OAAO,WAAA,CAAY,GAAA,CAAIhB,KAAI,CAAA,IAAK,MAAA;AAAA,IAClC,CAAA;AAEA,IAAA,MAAM,KAAA,GAAsB;AAAA,MAC1B,UAAA,EAAY,CAACA,KAAAA,KAAS;AACpB,QAAA,IAAIA,UAAS,kBAAA,EAAoB;AAC/B,UAAA,MAAM,QAAA,GAAW,gBAAgB,QAAQ,CAAA;AACzC,UAAA,OAAO,QAAA,KAAa,SAAY,MAAA,GAAS,GAAA,CAAI,UAAU,YAAA,CAAa,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,QACvF;AACA,QAAA,IAAIA,UAAS,YAAA,EAAc;AACzB,UAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,QAAA,EAAUT,sBAAAA,CAAW,UAAU,CAAA;AAC5D,UAAA,OAAO,GAAA,KAAQ,MAAA,GAAY,MAAA,GAAS,GAAA,CAAI,GAAG,CAAA;AAAA,QAC7C;AACA,QAAA,IAAIS,UAAS,gBAAA,EAAkB;AAC7B,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,MAAA;AACtC,UAAA,OAAO,MAAA,KAAW,MAAA,GAAY,MAAA,GAAS,GAAA,CAAI,MAAM,CAAA;AAAA,QACnD;AACA,QAAA,IAAIA,UAAS,QAAA,EAAU;AAGrB,UAAA,KAAA,IAAS,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7C,YAAA,MAAM,OAAO,iBAAA,CAAkB,QAAA,CAAS,CAAC,CAAA,CAAE,QAAQ,UAAU,CAAA;AAC7D,YAAA,IAAI,IAAA,EAAM,OAAO,GAAA,CAAI,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,UACzC;AACA,UAAA,OAAO,IAAI,EAAE,CAAA;AAAA,QACf;AACA,QAAA,IAAIA,MAAK,QAAA,CAAS,GAAG,GAAG,OAAO,cAAA,CAAe,OAAOA,KAAI,CAAA;AACzD,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAAA,MACA,YAAA,EAAc,CAACA,KAAAA,EAAM,KAAA,EAAO,OAAA,KAAY;AACtC,QAAA,IAAI,CAAC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,OAAO,OAAA,EAAS,MAAM,CAAA,CAAE,QAAA,CAASA,KAAI,CAAA,EAAG,OAAO,SAAA,CAAUA,OAAM,OAAO,CAAA;AAChG,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAWA,SAAS,iBAAA,CAAkB,QAA0B,cAAA,EAAuC;AAC1F,EAAA,MAAM,GAAA,GAAM,OAAO,OAAA,CAAQ,UAAA;AAE3B,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAqC;AACvD,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,KAAA,MAAW,CAAA,IAAK,OAAO,iBAAA,CAAkB,EAAE,OAAO,CAAC,IAAkB,CAAA,EAAG,CAAA,EAAG;AACzE,MAAA,IAAI,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,EAAU;AAC/B,QAAA,KAAA,IAAS,CAAA,CAAE,KAAA;AACX,QAAA,KAAA,GAAQ,IAAA;AAAA,MACV;AAAA,IACF;AACA,IAAA,OAAO,QAAQ,KAAA,GAAQ,MAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAA+D;AAC/E,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,IAAkB,CAAA;AAClD,IAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,mBAAmB,MAAM,CAAA;AACvC,IAAA,IAAI,KAAA,KAAU,QAAW,OAAO,MAAA;AAChC,IAAA,MAAM,YAAA,GAAe,mBAAmB,MAAM,CAAA;AAC9C,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,YAAA,IAAgB,OAAO,IAAA,EAAK;AAAA,EACpD,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,UAAA,CAAWT,sBAAAA,CAAW,GAAG,CAAA;AACtC,EAAA,MAAM,OAAA,GAAU,OAAO,MAAA,CAAO,SAAA,CAAUA,uBAAW,OAAO,CAAA,EAAG,KAAA,KAAU,QAAA,GAClE,MAAA,CAAO,SAAA,CAAUA,sBAAAA,CAAW,OAAO,EAAG,KAAA,GACvC,MAAA;AACJ,EAAA,MAAM,QAAA,GAAW,QAAA,CAASA,sBAAAA,CAAW,QAAQ,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,QAAA,CAASA,sBAAAA,CAAW,UAAU,CAAA;AACjD,EAAA,MAAM,UAAA,GAAa,kBAAkB,GAAG,CAAA;AACxC,EAAA,MAAM,cAAc,CAAC,GAAG,GAAG,CAAA,CAAE,SAAQ,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAASA,sBAAAA,CAAW,UAAU,OAAO,CAAA,CAAE,UAAU,QAAQ,CAAA;AAK9G,EAAA,MAAM,SAAA,GAAY,CAAC,GAAG,GAAG,CAAA,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,iBAAiB,CAAA;AACnE,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAG,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,aAAa,CAAA,EAAG,KAAA;AACxE,EAAA,MAAM,eAAA,GACJ,eAAA,IAAmB,OAAO,eAAA,KAAoB,QAAA,IAAY,SAAS,eAAA,GAC/D,MAAA,CAAQ,eAAA,CAAqC,GAAG,CAAA,GAChD,MAAA;AAEN,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,CAACS,KAAAA,KAAS;AACpB,MAAA,QAAQA,KAAAA;AAAM,QACZ,KAAK,MAAA;AAAQ,UAAA,OAAO,IAAA,KAAS,SAAY,MAAA,GAAS,GAAA,CAAI,MAAM,YAAA,CAAa,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,QACzF,KAAK,SAAA;AAAW,UAAA,OAAO,OAAA,KAAY,SAAY,MAAA,GAAS,GAAA,CAAI,SAAS,YAAA,CAAa,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,QACnG,KAAK,UAAA;AAAY,UAAA,OAAO,QAAA,KAAa,MAAA,GAAY,MAAA,GAAS,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,YAAA,CAAa,QAAA,CAAS,GAAA,EAAK,QAAA,CAAS,IAAA,IAAQ,GAAG,CAAA;AAAA,QAC7H,KAAK,YAAA;AAAc,UAAA,OAAO,UAAA,KAAe,MAAA,GAAY,MAAA,GAAS,GAAA,CAAI,UAAA,CAAW,KAAA,EAAO,YAAA,CAAa,UAAA,CAAW,GAAA,EAAK,UAAA,CAAW,IAAA,IAAQ,IAAI,CAAA;AAAA,QACxI,KAAK,WAAA;AAAa,UAAA,OAAO,YAAY,GAAA,CAAI,CAAA,EAAG,aAAa,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA,GAAI,MAAA;AAAA,QAC9E,KAAK,YAAA;AAAc,UAAA,OAAO,eAAA,GAAkB,GAAA,CAAI,eAAe,CAAA,GAAI,MAAA;AAAA,QACnE,KAAK,QAAA,EAAU;AAIb,UAAA,MAAM,IAAA,GAAO,UAAA,EAAY,QAAA,CAAS,IAAA,IAAQ,cAAA,IAAkB,EAAA;AAC5D,UAAA,OAAO,IAAI,IAAI,CAAA;AAAA,QACjB;AAAA,QACA,KAAK,aAAA;AAAe,UAAA,OAAO,WAAA,GAAc,GAAA,CAAI,WAAA,CAAY,KAAe,CAAA,GAAI,MAAA;AAAA,QAC5E;AAAS,UAAA,OAAO,MAAA;AAAA;AAClB,IACF;AAAA,GACF;AACF;AAGA,SAAS,mBAAmB,MAAA,EAAqC;AAC/D,EAAA,IAAI,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,SAAiB,MAAA,CAAO,KAAA;AACpD,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,YAAY,KAAA,IAAS,OAAO,KAAA,CAAM,MAAA,KAAW,QAAA,EAAU;AAC/F,IAAA,OAAO,KAAA,CAAM,MAAA;AAAA,EACf;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,mBAAmB,MAAA,EAAqC;AAC/D,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,OAAA,IAAW,KAAA,IAAS,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,KAAA,EAAO;AAC5G,IAAA,OAAO,KAAA,CAAM,KAAA;AAAA,EACf;AACA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,OAAO,IAAA,EAAsB;AACpC,EAAA,OAAO,IAAA,CAAK,aAAY,CAAE,OAAA,CAAQ,eAAe,GAAG,CAAA,CAAE,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAC9E;AAGA,SAAS,cAAc,MAAA,EAAyC;AAC9D,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AACxD,EAAA,IAAI,IAAA,EAAM,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,SAAS,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAM;AACxE,EAAA,MAAM,MAAM,CAAC,GAAG,OAAO,OAAA,CAAQ,UAAU,EAAE,OAAA,EAAQ,CAAE,KAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAAST,sBAAAA,CAAW,UAAU,OAAO,CAAA,CAAE,UAAU,QAAQ,CAAA;AAC5H,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,IAAA,EAAM,EAAA,EAAI,OAAO,EAAA,EAAG;AACvC,EAAA,OAAO,EAAE,MAAM,MAAA,CAAO,GAAA,CAAI,KAAe,CAAA,EAAG,KAAA,EAAO,IAAI,KAAA,EAAgB;AACzE;AAGA,SAAS,gBAAA,CAAiB,MAAc,SAAA,EAA4B;AAClE,EAAA,KAAA,MAAW,OAAA,IAAW,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,EAAG;AAC1C,IAAA,MAAM,CAAA,GAAI,QAAQ,IAAA,EAAK;AACvB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG;AACnB,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAC,GAAG,OAAO,IAAA;AAAA,IAC9C,CAAA,MAAA,IAAW,SAAS,CAAA,EAAG;AACrB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAOA,SAAS,gBAAgB,OAAA,EAAiD;AACxE,EAAA,MAAM,WAAW,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,eAAe,SAAS,CAAA;AACjE,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAClC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,UAAA,KAAe,CAAA,IAAK,CAAA,CAAE,cAAA,KAAmB,MAAM,CAAA;AACnF,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAgC;AACjD,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,SAAA,CAAUA,sBAAAA,CAAW,OAAO,CAAA,EAAG,KAAA;AAC3C,IAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,CAAA;AAAA,EACrC,CAAA;AACA,EAAA,IAAI,QAAQ,SAAA,CAAU,IAAI,IAAI,CAAA,EAAG,OAAO,UAAU,IAAI,CAAA;AAGtD,EAAA,MAAM,YAAY,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAC,CAAA;AACzD,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,QAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,SAAA,CAAU,CAAC,CAAA,EAAG,CAAC,CAAA;AAC3D,EAAA,OAAO,KAAA,GAAQ,IAAI,KAAA,GAAQ,MAAA;AAC7B;AAGA,SAAS,gBAAA,CAAiB,UAA8B,IAAA,EAAkC;AACxF,EAAA,IAAI,IAAA;AACJ,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,KAAA,MAAW,MAAA,IAAU,OAAA,CAAQ,OAAA,CAAQ,UAAA,EAAY;AAC/C,MAAA,IAAI,MAAA,CAAO,SAAS,IAAA,EAAM;AAC1B,MAAA,MAAM,KAAA,GAAQ,mBAAmB,MAAM,CAAA;AACvC,MAAA,IAAI,KAAA,KAAU,QAAW,IAAA,GAAO,KAAA;AAAA,IAClC;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,aAAa,KAAA,EAAuB;AAC3C,EAAA,OAAO,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,UAAU,EAAE,CAAA;AACxF;;;AC9hBA,IAAM,aAA0C,EAAE,OAAA,EAAS,GAAG,OAAA,EAAS,CAAA,EAAG,MAAM,CAAA,EAAE;AAE3E,IAAM,iBAAN,MAAqB;AAAA,EACT,MAAA,uBAAa,GAAA,EAAyD;AAAA;AAAA,EAGvF,QAAA,CAAS,KAAA,EAAqB,KAAA,GAAqB,SAAA,EAAiB;AAClE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,MAAM,EAAE,CAAA;AACzC,IAAA,IAAI,YAAY,UAAA,CAAW,QAAA,CAAS,KAAK,CAAA,GAAI,UAAA,CAAW,KAAK,CAAA,EAAG;AAChE,IAAA,IAAA,CAAK,OAAO,GAAA,CAAI,KAAA,CAAM,IAAI,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,EAC5C;AAAA,EAEA,IAAI,OAAA,EAA2C;AAC7C,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,EAAG,KAAA;AAAA,EACnC;AAAA;AAAA,EAGA,QAAA,CAAS,SAAiB,KAAA,EAAsC;AAC9D,IAAA,OAAO,IAAA,CAAK,OAAO,GAAA,CAAI,OAAO,GAAG,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA,EAAG,SAAA;AAAA,EACxD;AAAA;AAAA,EAGA,MAAA,CAAO,OAAA,EAAiB,GAAA,EAAa,KAAA,EAAoB;AACvD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,EAAG,KAAA;AACxC,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMS,YAAA,GAA4C,CAACS,KAAAA,EAAM,IAAA,KAAS;AACnE,IAAA,IAAIA,KAAAA,KAAS,UAAU,OAAO,MAAA;AAC9B,IAAA,MAAM,CAAC,KAAA,EAAO,GAAA,EAAK,KAAK,CAAA,GAAI,IAAA;AAC5B,IAAA,IAAI,KAAA,EAAO,IAAA,KAAS,QAAA,IAAY,KAAA,EAAO,SAAS,QAAA,EAAU;AACxD,MAAA,MAAM,IAAI,cAAc,0CAA0C,CAAA;AAAA,IACpE;AACA,IAAA,IAAI,GAAA,CAAI,SAAS,QAAA,IAAY,GAAA,CAAI,SAAS,QAAA,IAAY,GAAA,CAAI,IAAA,KAAS,QAAA,EAAU,OAAO,MAAA;AACpF,IAAA,MAAM,MAAA,GAAS,IAAI,IAAA,KAAS,QAAA,GAAW,IAAI,KAAA,GAAQ,MAAA,CAAO,IAAI,KAAK,CAAA;AACnE,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,MAAA,EAAQ,MAAM,KAAK,CAAA;AAAA,EACrD,CAAA;AACF;;;ACvDO,IAAM,cAAA,GAAiB,mBAAA;AAE9B,IAAM,IAAA,GAAO,CAAC,EAAA,EAAY,UAAA,EAAoB,IAAA,MAC3C,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAiB,UAAA,EAAY,IAAA,EAAK,CAAA;AAE1C,IAAM,aAAA,GAAyC;AAAA;AAAA,EAEpD;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,IAAA,EAAM,2BAAA;AAAA,IACN,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,8BAA8B,CAAA;AAAE,KAC/D,CAAA;AAAA,IACD,QAAQ,EAAE,MAAA,EAAQ,SAAS,QAAA,EAAU,MAAA,EAAQ,MAAM,UAAA;AAAW,GAChE;AAAA,EACA;AAAA,IACE,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,IAAA,EAAM,+BAAA;AAAA,IACN,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,gCAAgC,CAAA;AAAE,KACjE,CAAA;AAAA,IACD,QAAQ,EAAE,MAAA,EAAQ,SAAS,QAAA,EAAU,MAAA,EAAQ,MAAM,KAAA;AAAM,GAC3D;AAAA,EACA;AAAA,IACE,EAAA,EAAI,aAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,IAAA,EAAM,+BAAA;AAAA,IACN,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,+CAA+C,CAAA;AAAE,KAChF,CAAA;AAAA,IACD,QAAQ,EAAE,MAAA,EAAQ,SAAS,QAAA,EAAU,MAAA,EAAQ,MAAM,QAAA;AAAS,GAC9D;AAAA,EACA;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,IAAA,EAAM,+CAAA;AAAA,IACN,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,yCAAyC,CAAA;AAAE,KAC1E,CAAA;AAAA,IACD,QAAQ,EAAE,MAAA,EAAQ,SAAS,QAAA,EAAU,OAAA,EAAS,MAAM,MAAA;AAAO,GAC7D;AAAA,EACA;AAAA,IACE,EAAA,EAAI,gBAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,IAAA,EAAM,+BAAA;AAAA,IACN,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,OAAO,EAAE,aAAA,EAAe,IAAA,CAAK,eAAA,EAAiB,mBAAmB,CAAA;AAAE,KACpE;AAAA,GACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA,IACE,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,IAAA,EAAM,+DAAA;AAAA,IACN,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,KAAA,EAAO;AAAA;AAAA;AAAA,QAGL,SAAA,EAAW,IAAA,CAAK,WAAA,EAAa,WAAA,EAAa,OAAO,CAAA;AAAA,QACjD,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,wCAAwC;AAAA;AAC/D,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,WAAA,EAAa,GAAA,EAAK,WAAA,EAAa,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,eAAA;AAAgB,GAC3G;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,IAIE,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,IAAA,EAAM,4CAAA;AAAA,IACN,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,IAAA,CAAK,WAAA,EAAa,WAAA,EAAa,OAAO,CAAA;AAAA,QACjD,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,uBAAuB;AAAA;AAC9C,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,aAAA,EAAe,GAAA,EAAK,aAAA,EAAe,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,gBAAA;AAAiB,GAC7G;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,IAIE,EAAA,EAAI,aAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,IAAA,EAAM,gBAAA;AAAA,IACN,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AAAE,KAC5C,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,YAAA,EAAc,GAAA,EAAK,YAAA,EAAc,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,OAAA;AAAQ,GACtG;AAAA,EACA;AAAA,IACE,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,IAAA,EAAM,kBAAA;AAAA,IACN,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,OAAO,EAAE,SAAA,EAAW,IAAA,CAAK,WAAA,EAAa,0CAA0C,CAAA;AAAE,KACnF;AAAA,GACH;AAAA,EACA;AAAA,IACE,EAAA,EAAI,qBAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA;AAAA;AAAA,IAGP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,IAAA,EAAM,aAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR;AAAA,QACE,EAAA,EAAI,UAAA;AAAA,QAAY,QAAA,EAAU,GAAA;AAAA,QAC1B,IAAA,EAAM,uDAAA;AAAA,QACN,MAAA,EAAQ,UAAA;AAAA,QACR,OAAO,EAAE,UAAA,EAAY,IAAA,CAAK,YAAA,EAAc,yDAAyD,CAAA;AAAE,OACrG;AAAA,MACA;AAAA,QACE,EAAA,EAAI,YAAA;AAAA,QAAc,QAAA,EAAU,EAAA;AAAA,QAC5B,MAAA,EAAQ,oBAAA;AAAA,QACR,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,IAAA,CAAK,YAAA,EAAc,yDAAyD,CAAA;AAAA;AAAA,UAExF,mBAAA,EAAqB,IAAA,CAAK,qBAAA,EAAuB,GAAG;AAAA;AACtD;AACF;AACF,GACF;AAAA;AAAA,EAGA;AAAA,IACE,EAAA,EAAI,YAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,IAAA,EAAM,kCAAA;AAAA,IACN,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AAAE,KAC5C,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,IAAA,EAAM,MAAA;AAAO,GACxE;AAAA,EACA;AAAA,IACE,EAAA,EAAI,sBAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,CAAK,SAAS,CAAA,mBAAA,EAAsB,cAAc,GAAG,CAAA;AAAE,KACxE,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,IAAA,EAAM,QAAQ,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAE,GAC9G;AAAA,EACA;AAAA,IACE,EAAA,EAAI,gBAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,IAAA,EAAM,0CAAA;AAAA,IACN,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,eAAe,CAAA;AAAE,KAChD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,UAAA,EAAY,QAAA,EAAU,UAAA,EAAY,IAAA,EAAM,MAAA;AAAO,GACjF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,cAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,IAAA,EAAM,oDAAA;AAAA,IACN,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,oBAAoB,CAAA;AAAE,KACrD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,aAAA,EAAe,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,MAAA;AAAO,GAClF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,wBAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,oBAAoB,CAAA;AAAA,QACzC,SAAA,EAAW,IAAA,CAAK,WAAA,EAAa,sBAAsB;AAAA;AACrD,KACD,CAAA;AAAA,IACD,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,OAAA;AAAA,MAAS,GAAA,EAAK,aAAA;AAAA,MAAe,QAAA,EAAU,QAAA;AAAA,MAAU,IAAA,EAAM,MAAA;AAAA,MAC/D,SAAA,EAAW,IAAA;AAAA,MAAM,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,MAAG,oBAAA,EAAsB,CAAC,WAAW;AAAA;AAC1E,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,aAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,IAAA,EAAM,sBAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR;AAAA;AAAA;AAAA,QAGE,EAAA,EAAI,WAAA;AAAA,QAAa,QAAA,EAAU,GAAA;AAAA,QAC3B,IAAA,EAAM,8BAAA;AAAA,QACN,MAAA,EAAQ,oBAAA;AAAA,QACR,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,wBAAwB,CAAA;AAAE,OAC1D;AAAA,MACA;AAAA,QACE,EAAA,EAAI,UAAA;AAAA,QAAY,QAAA,EAAU,EAAA;AAAA,QAC1B,MAAA,EAAQ,UAAA;AAAA,QACR,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,wBAAwB,CAAA;AAAE;AAC1D,KACF;AAAA,IACA,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,iBAAA,EAAmB,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM,SAAA;AAAU,GACvF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,QAAA,EAAU;AAAA,MACR;AAAA,QACE,EAAA,EAAI,UAAA;AAAA,QAAY,QAAA,EAAU,GAAA;AAAA,QAC1B,IAAA,EAAM,iBAAA;AAAA,QACN,MAAA,EAAQ,UAAA;AAAA,QACR,OAAO,EAAE,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,YAAY,CAAA;AAAE,OAC1C;AAAA,MACA;AAAA,QACE,EAAA,EAAI,OAAA;AAAA,QAAS,QAAA,EAAU,EAAA;AAAA,QACvB,IAAA,EAAM,qBAAA;AAAA,QACN,MAAA,EAAQ,UAAA;AAAA,QACR,OAAO,EAAE,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,gBAAgB,CAAA;AAAE,OAC9C;AAAA,MACA;AAAA,QACE,EAAA,EAAI,SAAA;AAAA,QAAW,QAAA,EAAU,EAAA;AAAA,QACzB,MAAA,EAAQ,oBAAA;AAAA,QACR,OAAO,EAAE,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,GAAG,CAAA;AAAE;AACjC;AACF,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,cAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,IAAA,EAAM,uBAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR;AAAA,QACE,EAAA,EAAI,cAAA;AAAA,QAAgB,QAAA,EAAU,GAAA;AAAA,QAC9B,IAAA,EAAM,iBAAA;AAAA,QACN,MAAA,EAAQ,UAAA;AAAA,QACR,OAAO,gBAAA;AAAiB,OAC1B;AAAA,MACA;AAAA,QACE,EAAA,EAAI,WAAA;AAAA,QAAa,QAAA,EAAU,EAAA;AAAA,QAC3B,IAAA,EAAM,qBAAA;AAAA,QACN,MAAA,EAAQ,UAAA;AAAA,QACR,OAAO,gBAAA;AAAiB,OAC1B;AAAA,MACA;AAAA,QACE,EAAA,EAAI,aAAA;AAAA,QAAe,QAAA,EAAU,EAAA;AAAA,QAC7B,MAAA,EAAQ,oBAAA;AAAA,QACR,OAAO,gBAAA;AAAiB;AAC1B,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,MAAA;AAAA,MAAQ,GAAA,EAAK,aAAA;AAAA,MAAe,QAAA,EAAU,MAAA;AAAA,MAAQ,IAAA,EAAM,IAAA;AAAA,MAC5D,oBAAA,EAAsB,CAAC,MAAA,EAAQ,iBAAiB;AAAA;AAClD,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,QAAA,EAAU;AAAA,MACR;AAAA,QACE,EAAA,EAAI,cAAA;AAAA,QAAgB,QAAA,EAAU,GAAA;AAAA,QAC9B,IAAA,EAAM,qBAAA;AAAA,QACN,MAAA,EAAQ,UAAA;AAAA,QACR,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAA,EAAU,sBAAsB,CAAA;AAAE,OAC1D;AAAA,MACA;AAAA,QACE,EAAA,EAAI,YAAA;AAAA,QAAc,QAAA,EAAU,EAAA;AAAA,QAC5B,MAAA,EAAQ,UAAA;AAAA,QACR,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA;AAAE;AAC1C;AACF,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,IAAA,EAAM,4CAAA;AAAA,IACN,QAAA,EAAU;AAAA,MACR;AAAA;AAAA;AAAA,QAGE,EAAA,EAAI,UAAA;AAAA,QAAY,QAAA,EAAU,GAAA;AAAA,QAC1B,IAAA,EAAM,oCAAA;AAAA,QACN,MAAA,EAAQ,UAAA;AAAA,QACR,OAAO,QAAA;AAAS,OAClB;AAAA,MACA;AAAA,QACE,EAAA,EAAI,WAAA;AAAA,QAAa,QAAA,EAAU,EAAA;AAAA,QAC3B,MAAA,EAAQ,oBAAA;AAAA,QACR,OAAO,QAAA;AAAS;AAClB,KACF;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,KAAA;AAAA,MAAO,GAAA,EAAK,KAAA;AAAA,MAAO,QAAA,EAAU,KAAA;AAAA,MAAO,IAAA,EAAM,KAAA;AAAA,MAClD,sBAAsB,CAAC,UAAA,EAAY,UAAA,EAAY,eAAA,EAAiB,oBAAoB,QAAQ;AAAA;AAC9F;AAEJ;AAGA,SAAS,gBAAA,GAAuE;AAC9E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,eAAe,CAAA;AAAA,IAClC,eAAA,EAAiB,IAAA,CAAK,iBAAA,EAAmB,gCAAgC,CAAA;AAAA,IACzE,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,uDAAuD;AAAA,GAC5E;AACF;AAGA,SAAS,QAAA,GAA+D;AACtE,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,IAAA,CAAK,YAAA,EAAc,4BAA4B,CAAA;AAAA,IAC3D,OAAA,EAAS,IAAA,CAAK,SAAA,EAAW,8BAA8B,CAAA;AAAA,IACvD,MAAA,EAAQ,IAAA,CAAK,QAAA,EAAU,kBAAkB,CAAA;AAAA,IACzC,QAAA,EAAU,IAAA,CAAK,UAAA,EAAY,kCAAkC,CAAA;AAAA,IAC7D,QAAA,EAAU,IAAA,CAAK,UAAA,EAAY,oBAAoB,CAAA;AAAA;AAAA;AAAA,IAG/C,aAAA,EAAe,IAAA,CAAK,eAAA,EAAiB,4BAAA,EAA8B,KAAK,CAAA;AAAA,IACxE,gBAAA,EAAkB,IAAA,CAAK,kBAAA,EAAoB,8CAA8C,CAAA;AAAA,IACzF,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,8FAA8F;AAAA,GACjH;AACF;AASA,IAAM,UAAA,GAAa,OAAO,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,KAAA,EAAgB,YAAY,4BAAA,EAA6B,CAAA;AAEjG,IAAM,WAAA,GAAuC;AAAA,EAClD;AAAA,IACE,EAAA,EAAI,MAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,OAAO,UAAA,EAAW;AAAA,QAClB,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,uBAAuB,CAAA;AAAA,QAC5C,OAAA,EAAS,IAAA,CAAK,SAAA,EAAW,wBAAwB,CAAA;AAAA,QACjD,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,iBAAiB;AAAA;AACxC,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,WAAA,EAAa,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,8BAAA;AAA+B,GACpG;AAAA,EACA;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,OAAO,UAAA,EAAW;AAAA,QAClB,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,uBAAuB,CAAA;AAAA,QAC5C,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,qBAAqB,CAAA;AAAA,QACtC,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,aAAa;AAAA;AACpC,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,eAAA,EAAiB,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,mBAAA;AAAoB,GAC7F;AAAA,EACA;AAAA,IACE,EAAA,EAAI,QAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,OAAO,UAAA,EAAW;AAAA,QAClB,QAAA,EAAU,IAAA,CAAK,UAAA,EAAY,6CAAA,EAA+C,OAAO,CAAA;AAAA,QACjF,MAAA,EAAQ,IAAA,CAAK,QAAA,EAAU,sBAAsB,CAAA;AAAA,QAC7C,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,mBAAmB;AAAA;AAC1C,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,aAAA,EAAe,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,iBAAA;AAAkB,GACtF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,OAAO,UAAA,EAAW;AAAA,QAClB,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,wBAAwB;AAAA;AAC/C,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,UAAA,EAAY,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,6BAAA;AAA8B,GAC/F;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,OAAO,UAAA,EAAW;AAAA,QAClB,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,uBAAuB;AAAA;AAC9C,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,UAAA,EAAY,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,2BAAA;AAA4B,GAC7F;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,OAAO,UAAA,EAAW;AAAA,QAClB,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,wBAAwB,CAAA;AAAA,QACzC,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,uBAAuB,CAAA;AAAA,QACxC,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,WAAW;AAAA;AAClC,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,UAAA,EAAY,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,+BAAA;AAAgC,GACjG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,MAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,OAAO,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,KAAA,EAAgB,YAAY,yBAAA,EAA0B;AAAA,QAClF,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,yBAAyB;AAAA;AAChD,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,eAAA,EAAiB,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,UAAA;AAAW,GACrF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,MAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,OAAO,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,KAAA,EAAgB,YAAY,sBAAA,EAAuB;AAAA,QAC/E,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,yBAAyB;AAAA;AAChD,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,YAAA,EAAc,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,WAAA;AAAY,GAChF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,MAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,OAAO,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,KAAA,EAAgB,YAAY,oBAAA,EAAqB;AAAA,QAC7E,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,yBAAyB;AAAA;AAChD,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,UAAA;AAAW,GAC7E;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKE,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,UAAU,EAAE,EAAA,EAAI,YAAY,IAAA,EAAM,KAAA,EAAgB,YAAY,yBAAA,EAA0B;AAAA,QACxF,OAAO,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,KAAA,EAAgB,YAAY,sBAAA,EAAuB;AAAA,QAC/E,KAAK,EAAE,EAAA,EAAI,OAAO,IAAA,EAAM,KAAA,EAAgB,YAAY,oBAAA,EAAqB;AAAA,QACzE,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,sHAAsH;AAAA;AAC7I,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,gBAAA,EAAkB,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,WAAA;AAAY,GACpF;AAAA,EACA;AAAA;AAAA;AAAA,IAGE,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,MAAM,EAAE,EAAA,EAAI,QAAQ,IAAA,EAAM,KAAA,EAAgB,YAAY,qBAAA,EAAsB;AAAA,QAC5E,QAAQ,EAAE,EAAA,EAAI,UAAU,IAAA,EAAM,KAAA,EAAgB,YAAY,uBAAA,EAAwB;AAAA,QAClF,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,qBAAqB;AAAA;AAC5C,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,YAAA,EAAc,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,cAAA;AAAe,GACjF;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,IAIE,EAAA,EAAI,IAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,MAAM,EAAE,EAAA,EAAI,QAAQ,IAAA,EAAM,KAAA,EAAgB,YAAY,gDAAA,EAAiD;AAAA,QACvG,SAAS,EAAE,EAAA,EAAI,WAAW,IAAA,EAAM,KAAA,EAAgB,YAAY,0CAAA,EAA2C;AAAA,QACvG,IAAI,EAAE,EAAA,EAAI,MAAM,IAAA,EAAM,KAAA,EAAgB,YAAY,mBAAA,EAAoB;AAAA;AAAA,QAEtE,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,yBAAA,EAA2B,KAAK,CAAA;AAAA,QACnD,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,oBAAA,EAAsB,KAAK;AAAA;AAClD,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,mBAAA;AAAoB,GACrF;AAAA,EACA;AAAA;AAAA;AAAA,IAGE,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,OAAA;AAAA,IACP,MAAA,EAAQ,CAAC,MAAA,EAAQ,KAAK,CAAA;AAAA,IACtB,UAAU,CAAC;AAAA,MACT,EAAA,EAAI,SAAA;AAAA,MAAW,QAAA,EAAU,EAAA;AAAA,MAAI,MAAA,EAAQ,UAAA;AAAA,MACrC,KAAA,EAAO;AAAA,QACL,UAAU,EAAE,EAAA,EAAI,YAAY,IAAA,EAAM,KAAA,EAAgB,YAAY,8BAAA,EAA+B;AAAA,QAC7F,SAAS,EAAE,EAAA,EAAI,WAAW,IAAA,EAAM,KAAA,EAAgB,YAAY,wBAAA,EAAyB;AAAA,QACrF,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,oBAAoB;AAAA;AAC3C,KACD,CAAA;AAAA,IACD,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAK,gBAAA,EAAkB,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,gBAAA;AAAiB;AAE7F;;;ACtlBO,IAAM,UAAA,GAAqC;AAAA,EAChD,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU,CAAA;AAAA,EACV,IAAA,EAAM,CAAA;AAAA,EACN,SAAA,EAAW,EAAA;AAAA,EACX,GAAA,EAAK;AACP,CAAA;AAEO,SAAS,kBAAkB,QAAA,EAAyC;AACzE,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,QAAA;AAAA,IACJ,UAAA,EAAY,aAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,MACN,GAAA,EAAK,EAAE,SAAA,EAAW,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,MAC3C,gBAAA,EAAkB,EAAE,SAAA,EAAW,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,MACxD,UAAA,EAAY,EAAE,SAAA,EAAW,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,MAClD,aAAA,EAAe,EAAE,SAAA,EAAW,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,MACrD,YAAA,EAAc,EAAE,SAAA,EAAW,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,MACpD,WAAA,EAAa,EAAE,SAAA,EAAW,QAAA,EAAU,MAAM,QAAA;AAAS,KACrD;AAAA,IACA,GAAA,CAAI,KAAK,KAAA,EAAwB;AAG/B,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,QAAQ,KAAA;AAAO,UACb,KAAK,KAAA;AAAO,YAAA,OAAO,GAAA,CAAI,yBAAyB,UAAU,CAAA;AAAA,UAC1D,KAAK,kBAAA;AAAoB,YAAA,OAAO,IAAI,CAAG,CAAA;AAAA,UACvC,KAAK,cAAA;AAAgB,YAAA,OAAO,IAAI,SAAS,CAAA;AAAA,UACzC,KAAK,aAAA;AAAe,YAAA,OAAO,IAAI,CAAC,CAAA;AAAA,UAChC;AAAS,YAAA,OAAO,MAAA;AAAA;AAClB,MACF;AAGA,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AAC3C,MAAA,QAAQ,KAAA;AAAO,QACb,KAAK,KAAA;AAAO,UAAA,OAAO,GAAA,CAAI,SAAS,GAAG,CAAA;AAAA,QACnC,KAAK,kBAAA;AAAoB,UAAA,OAAO,GAAA,CAAI,SAAS,gBAAgB,CAAA;AAAA,QAC7D,KAAK,YAAA;AAAc,UAAA,OAAO,QAAA,CAAS,UAAA,GAAa,GAAA,CAAI,QAAA,CAAS,UAAU,CAAA,GAAI,MAAA;AAAA,QAC3E,KAAK,eAAA;AAAiB,UAAA,OAAO,QAAA,CAAS,aAAA,GAAgB,GAAA,CAAI,QAAA,CAAS,aAAa,CAAA,GAAI,MAAA;AAAA,QACpF,KAAK,cAAA;AAAgB,UAAA,OAAO,GAAA,CAAI,SAAS,YAAY,CAAA;AAAA,QACrD,KAAK,aAAA;AAAe,UAAA,OAAO,GAAA,CAAI,QAAA,CAAS,WAAA,GAAc,CAAA,GAAI,CAAC,CAAA;AAAA,QAC3D;AAAS,UAAA,OAAO,MAAA;AAAA;AAClB,IACF;AAAA,GACF;AACF;AAEO,SAAS,oBAAA,GAAqC;AACnD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,YAAA;AAAA,IACJ,UAAA,EAAY,QAAA;AAAA,IACZ,MAAA,EAAQ,EAAE,GAAA,EAAK,EAAE,WAAW,QAAA,EAAU,IAAA,EAAM,UAAS,EAAE;AAAA,IACvD,GAAA,CAAI,KAAK,KAAA,EAAwB;AAC/B,MAAA,IAAI,KAAA,KAAU,OAAO,OAAO,MAAA;AAC5B,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,GAAA,CAAI,WAAA,EAAa,CAAA;AACxC,MAAA,OAAO,GAAA,KAAQ,MAAA,GAAY,MAAA,GAAY,GAAA,CAAI,GAAG,CAAA;AAAA,IAChD;AAAA,GACF;AACF;AAMO,SAAS,mBAAmB,OAAA,EAAmD;AACpF,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,SAAA;AAAA,IACJ,UAAA,EAAY,QAAA;AAAA,IACZ,MAAA,EAAQ,EAAE,MAAA,EAAQ,EAAE,WAAW,QAAA,EAAU,IAAA,EAAM,UAAS,EAAE;AAAA,IAC1D,GAAA,CAAI,MAAM,KAAA,EAAwB;AAChC,MAAA,IAAI,KAAA,KAAU,UAAU,OAAO,MAAA;AAC/B,MAAA,OAAO,SAAS,MAAA,KAAW,MAAA,GAAY,MAAA,GAAY,GAAA,CAAI,QAAQ,MAAM,CAAA;AAAA,IACvE;AAAA,GACF;AACF;AAEO,SAAS,sBAAA,GAAuC;AACrD,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,aAAA;AAAA,IACJ,UAAA,EAAY,aAAA;AAAA,IACZ,MAAA,EAAQ,EAAE,gBAAA,EAAkB,EAAE,WAAW,QAAA,EAAU,IAAA,EAAM,UAAS,EAAE;AAAA,IACpE,GAAA,CAAI,KAAK,KAAA,EAAwB;AAC/B,MAAA,IAAI,KAAA,KAAU,oBAAoB,OAAO,MAAA;AACzC,MAAA,OAAO,IAAI,kBAAA,CAAmB,GAAG,IAAI,mBAAA,CAAoB,GAAG,IAAI,CAAG,CAAA;AAAA,IACrE;AAAA,GACF;AACF;;;AClFO,SAAS,gBAAgB,OAAA,EAAsC;AACpE,EAAA,MAAM,OAAA,GAAU,IAAI,cAAA,EAAe;AACnC,EAAA,OAAA,CAAQ,QAAA,CAAS,iBAAA,CAAkB,OAAA,CAAQ,cAAc,CAAC,CAAA;AAC1D,EAAA,OAAA,CAAQ,QAAA,CAAS,sBAAsB,CAAA;AACvC,EAAA,OAAA,CAAQ,QAAA,CAAS,kBAAA,CAAmB,OAAA,CAAQ,WAAW,CAAC,CAAA;AACxD,EAAA,OAAA,CAAQ,QAAA,CAAS,wBAAwB,CAAA;AAEzC,EAAA,MAAM,QAAA,GAAW,IAAI,mBAAA,CAAoB,OAAO,CAAA;AAChD,EAAA,KAAA,MAAW,GAAA,IAAO,aAAA,EAAe,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA;AACtD,EAAA,KAAA,MAAW,OAAO,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAG,QAAA,CAAS,SAAS,GAAG,CAAA;AAC5D,EAAA,OAAO,EAAE,SAAS,QAAA,EAAS;AAC7B;AAEO,SAAS,gBAAA,CAAiB,SAAiB,OAAA,EAAuC;AACvF,EAAA,MAAM,KAAA,GAAQ,gBAAgB,OAAO,CAAA;AACrC,EAAA,OAAO,IAAI,UAAA,CAAW,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,WAAA,EAAa,OAAA,CAAQ,WAAA,EAAa,CAAA;AAC7G;;;ACtBO,IAAM,yBAAA,GAA4B,IAAI,QAAA,CAA6B,EAAE;AAErE,IAAM,wBAAA,GAA2B,IAAI,QAAA,CAA4B,EAAE;AAYnE,IAAM,2BAAN,MAA4D;AAAA,EAC/D,MAAM,OAAA,EAGJ;AACE,IAAA,MAAM,WAAiC,EAAC;AACxC,IAAA,MAAM,UAA+B,EAAC;AAMtC,IAAA,IAAI,OAAA,CAAQ,kBAAkB,cAAA,EAAgB;AAC1C,MAAA,QAAA,CAAS,KAAK,IAAI,8BAAA,CAA+B,OAAA,CAAQ,gBAAA,CAAiB,cAAc,CAAC,CAAA;AACzF,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,OAAA,CAAQ,OAAA,EAAS;AAAA,QACjD,cAAA,EAAgB,QAAQ,gBAAA,CAAiB,cAAA;AAAA,QACzC,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,OAAO,OAAA,CAAQ;AAAA,OAClB,CAAA;AACD,MAAA,QAAA,CAAS,KAAK,UAAU,CAAA;AACxB,MAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AAAA,IAC3B;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,yBAAA,CAA0B,IAAA,EAAK,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG,OAAO,CAAC,CAAC,CAAA;AAC5F,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,wBAAA,CAAyB,IAAA,EAAK,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG,OAAO,CAAC,CAAC,CAAA;AAE1F,IAAA,OAAO,EAAE,UAAU,OAAA,EAAQ;AAAA,EAC/B;AAAA,EAEQ,YAAA,CACJ,WACA,OAAA,EACO;AAEP,IAAA,IAAI,SAAA,CAAU,UAAA,IAAc,SAAA,CAAU,UAAA,CAAW,SAAS,CAAA,EAAG;AACzD,MAAA,IAAI,CAAC,SAAA,CAAU,UAAA,CAAW,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,EAAG;AACjD,QAAA,OAAO,KAAA;AAAA,MACX;AAAA,IACJ;AAGA,IAAA,IAAI,SAAA,CAAU,eAAA,IAAmB,SAAA,CAAU,eAAA,CAAgB,SAAS,CAAA,EAAG;AACnE,MAAA,KAAA,MAAW,QAAA,IAAY,UAAU,eAAA,EAAiB;AAC9C,QAAA,IAAI,CAAC,OAAA,CAAQ,iBAAA,CAAkB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC1C,UAAA,OAAO,KAAA;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACpDO,SAAS,6BAAA,CACd,OACA,OAAA,EAC6B;AAC7B,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,MAAA;AAEjC,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAyB;AACvD,EAAA,IAAI,MAAM,UAAA,EAAY;AACpB,IAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,UAAA,EAAY;AACnC,MAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,QAAA,iBAAA,CAAkB,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,iBAAiB,OAAA,EAAS,cAAA;AAC9B,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,QAAA,GAAW,IAAI,sBAAA,EAAuB;AAC5C,IAAA,QAAA,CAAS,KAAK,cAAc,CAAA;AAC5B,IAAA,cAAA,GAAiB,IAAI,eAAe,QAAQ,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,gBAAA,GAAqC;AAAA,IACzC;AAAA,GACF;AAEA,EAAA,MAAM,OAAA,GAAmC;AAAA,IACvC,OAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,aAAa,OAAA,EAAS,WAAA;AAAA,IACtB,OAAO,OAAA,EAAS;AAAA,GAClB;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,wBAAA,EAAyB;AAC7C,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAQ,GAAI,OAAA,CAAQ,MAAM,OAAO,CAAA;AAEnD,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,KAAA,MAAW,aAAa,QAAA,EAAU;AAChC,IAAA,MAAA,CAAO,qBAAqB,SAAS,CAAA;AAAA,EACvC;AACA,EAAA,KAAA,MAAW,aAAa,OAAA,EAAS;AAC/B,IAAA,MAAA,CAAO,oBAAoB,SAAS,CAAA;AAAA,EACtC;AAEA,EAAA,OAAO,EAAE,QAAQ,gBAAA,EAAiB;AACpC;ACxCO,SAAS,gBAAA,CAAiB,MAAsB,MAAA,EAAoC;AACzF,EAAA,OAAO,CAAC,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,MAAM,MAAM,CAAA;AAC/C;AAGO,SAAS,sBAAsB,UAAA,EAAyD;AAC7F,EAAA,MAAM,OAAyB,EAAC;AAChC,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,IAAA,EAAM,cAAA,KAAmB;AAC3C,IAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,MAAA,IAAI,MAAA,CAAO,IAAA,KAAST,sBAAAA,CAAW,MAAA,EAAQ;AACrC,QAAA,MAAM,MAAA,GAAS,MAAA;AACf,QAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,EAAM,MAAM,CAAA,EAAG;AACnC,UAAA,IAAA,CAAK,KAAK,EAAE,cAAA,EAAgB,aAAa,IAAA,CAAK,EAAA,EAAI,QAAQ,CAAA;AAAA,QAC5D;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,IAAA;AACT;AAYO,SAAS,oBAAA,CACd,IAAA,EACA,YAAA,EACA,aAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,aAAa,CAAA,IAAK,aAAa,CAAC,CAAA;AAC5D,EAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,EAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,MAAA,CAAO,IAAA,IAAQ,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA;AAC7E,EAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAASA,sBAAAA,CAAW,MAAA,IAAW,CAAA,CAAwB,YAAA,KAAiB,YAAY,CAAA;AACjH,EAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,aAAa,CAAA;AACrD;AAYO,SAAS,0BAA0B,UAAA,EAA+C;AACvF,EAAA,MAAM,UAAA,GAAa,sBAAsB,UAAU,CAAA;AACnD,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,cAAc,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,GAAA,CAAI,MAAA,CAAO,YAAA,CAAa,CAAC,CAAA,EAAG,IAAA;AAC/C,IAAA,MAAM,oBAAA,GAAuB,UAAA,GACzB,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,GAC1E,KAAA;AACJ,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,IAAI,MAAM,CAAA;AAAA,IAC7C,CAAA,MAAO;AACL,MAAA,oBAAA,CAAqB,IAAA,EAAM,GAAA,CAAI,MAAA,CAAO,YAAA,EAAc,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AACA,EAAA,OAAO,UAAA,CAAW,MAAA;AACpB;;;ACnDO,IAAM,iBAAN,MAAgD;AAAA,EACrD,WAAA,CACmB,QAAA,EACA,WAAA,GAA4B,YAAA,EAC7C;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EACf;AAAA,EAFe,QAAA;AAAA,EACA,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBnB,aAAA,CAAc,OAAoB,OAAA,EAAsD;AACtF,IAAA,IAAI,CAAC,KAAA,CAAM,UAAA,IAAc,KAAA,CAAM,UAAA,CAAW,WAAW,CAAA,EAAG;AACtD,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,SAAS,IAAI,gBAAA,CAAiB,KAAA,CAAM,OAAA,EAAS,MAAM,UAAU,CAAA;AAOnE,IAAA,yBAAA,CAA0B,OAAO,UAAU,CAAA;AAG3C,IAAA,MAAM,KAAA,GAAQ,IAAI,YAAA,EAAa;AAE/B,IAAA,MAAM,KAAA,GAAQ,IAAI,YAAA,EAAa;AAC/B,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAE9B,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,KAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAc,MAAA,EAAQ,KAAK,QAAA,EAAU,YAAA,EAAc,OAAA,EAAS,IAAA,CAAK,WAAW,CAAA;AAGhG,IAAA,MAAM,EAAE,MAAA,EAAQ,gBAAA,KAAqB,6BAAA,CAA8B,KAAA,EAAO,SAAS,gBAAgB,CAAA;AACnG,IAAA,OAAA,CAAQ,gBAAA,GAAmB,gBAAA;AAC3B,IAAA,OAAA,CAAQ,mBAAmB,MAAM,CAAA;AAKjC,IAAA,OAAA,CAAQ,EAAA,CAAG,IAAI,kBAAA,EAAoB,CAAA;AAEnC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,OAAA,EAA+B;AAE5C,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,EAClB;AACF;;;AC5FO,IAAM,iBAAN,MAAqB;AAAA,EAIxB,WAAA,CACqB,QACA,QAAA,EACnB;AAFmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EACjB;AAAA,EAFiB,MAAA;AAAA,EACA,QAAA;AAAA,EALb,OAAA,GAA2B,EAAE,GAAG,uBAAA,EAAwB;AAAA,EACxD,WAAA,GAA4B,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAapC,cAAc,OAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,QAAQ,SAAA,GAAY,OAAA;AACzB,IAAA,IAAI,OAAA,EAAS;AAET,MAAA,IAAA,CAAK,QAAQ,aAAA,GAAgB,IAAA;AAAA,IACjC;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,OAAA,EAAwB;AAChC,IAAA,IAAA,CAAK,QAAQ,aAAA,GAAgB,OAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,0BAA0B,MAAA,EAA4C;AAClE,IAAA,IAAA,CAAK,QAAQ,qBAAA,GAAwB,MAAA;AACrC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAAwB,OAAA,EAAuD;AAC3E,IAAA,IAAA,CAAK,QAAQ,mBAAA,GAAsB,OAAA;AACnC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,OAAA,EAA8C;AAC9D,IAAA,IAAA,CAAK,QAAQ,UAAA,GAAa,OAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,QAAA,EAA8B;AAC1C,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAwC;AACpC,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAuB;AAEnB,IAAA,MAAM,YAAA,GAAe;AAAA,MACjB,KAAA,EAAO,IAAI,YAAA,EAAa;AAAA,MACxB,KAAA,EAAO,IAAI,YAAA,EAAa;AAAA,MACxB,QAAA,EAAU,IAAI,QAAA;AAAS,KAC3B;AACA,IAAA,OAAO,IAAI,aAAA,CAAc,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,UAAU,YAAA,EAAc,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,WAAW,CAAA;AAAA,EACrG;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAAyE;AACrE,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,EAAM;AAC3B,IAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,EAAE,GAAG,IAAA,CAAK,SAAQ,EAAE;AAAA,EACnD;AACJ;;;ACnIO,IAAM,SAAA,GAAN,MAAM,UAAA,CAA4B;AAAA,EAKvC,WAAA,CAAY,IAAA,EAAiC,GAAA,GAAoB,YAAA,EAAc;AAAlC,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAE3C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAM;AAC7B,IAAA,UAAA,CAAU,QAAA,EAAA;AACV,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,IAAA,CAAK,KAAA,GAAQ,WAAU,QAAQ,CAAA;AACpD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA,EAN6C,GAAA;AAAA,EAJpC,IAAA,GAAe,MAAA;AAAA,EACf,SAAA;AAAA,EACD,KAAA;AAAA,EACR,OAAe,QAAA,GAAW,CAAA;AAAA,EAS1B,IAAI,IAAA,GAAgB;AAClB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,IAAI,KAAK,KAAA,EAAgB;AACvB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA;AAAA,EAGA,MAAA,GAAS;AACP,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAM,IAAA,CAAK;AAAA,KACb;AAAA,EACF;AACF;;;ACyCO,IAAM,iBAAA,GAAoB;AAAA;AAAA,EAE/B,IAAA,EAAM,MAAA;AAAA;AAAA,EAGN,MAAA,EAAQ,QAAA;AAAA;AAAA,EAGR,KAAA,EAAO,OAAA;AAAA;AAAA,EAGP,IAAA,EAAM,MAAA;AAAA;AAAA,EAGN,KAAA,EAAO;AACT;ACzEO,SAAS,eAAe,OAAA,EAA4D;AACvF,EAAA,IAAI,mBAAmBC,2BAAAA,EAAiB;AACpC,IAAA,OAAO,cAAA,CAAe,OAAA,CAAQ,OAAA,EAAS,CAAA;AAAA,EAC3C;AACA,EAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,EAAA,MAAM,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,OAAA,CAAwB,MAAK,GAAK,OAAA;AAGvE,EAAA,MAAM,gBAAgB,IAAA,CAAK,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASD,uBAAW,KAAK,CAAA;AAChE,EAAA,IAAI,eAAe,OAAO,aAAA,CAAc,SAAS,aAAA,CAAc,KAAA,EAAO,UAAS,IAAK,OAAA;AAGpF,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,MAAA,IAAU,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,MAAM,CAAA;AAC3F,EAAA,IAAI,SAAS,OAAO,OAAA,CAAQ,SAAS,OAAA,CAAQ,KAAA,EAAO,UAAS,IAAK,OAAA;AAGlE,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,KAAK,CAAA;AAC7C,EAAA,IAAI,cAAA,EAAgB,OAAO,cAAA,CAAe,KAAA,IAAS,OAAA;AAEnD,EAAA,OAAO,OAAA;AACX;;;ACZO,IAAM,kBAAN,MAAgD;AAAA,EAIrD,WAAA,CAEkB,SAAA,EAEA,IAAA,EAEhB,SAAA,EACA,MAAoB,YAAA,EACpB;AANgB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAEA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAKhB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA,IAAa,GAAA,CAAI,GAAA,EAAI;AAAA,EACxC;AAAA,EARkB,SAAA;AAAA,EAEA,IAAA;AAAA,EAPT,IAAA,GAAO,YAAA;AAAA,EACA,SAAA;AAAA,EAchB,GAAG,OAAA,EAA4C;AAC7C,IAAA,MAAM,KAAA,GAAgB;AAAA,MACpB,MAAM,IAAA,CAAK,SAAA;AAAA,MACX,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAM,IAAA,CAAK;AAAA,KACb;AAEA,IAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS,KAAA,EAAO,OAAO,CAAA;AAAA,EACjD;AACF;;;ACvBA,IAAM,2BAAN,MAA2D;AAAA,EAIzD,YAA6B,aAAA,EAA8B;AAA9B,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AAAA,EAAgC;AAAA,EAAhC,aAAA;AAAA,EAHrB,cAAA,GAAiB,KAAA;AAAA,EACjB,WAAA,GAAc,KAAA;AAAA,EAItB,aAAA,GAAsB;AACpB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,EACxB;AAAA,EAEA,QAAQ,GAAA,EAAyC;AAG/C,IAAA,GAAA,CAAI,SAAA,CAAU,QAAQ,MAAM;AAC1B,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,OAAO,EAAC;AAAA,IACV,CAAC,CAAA;AACD,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEA,OAAO,GAAA,EAAyC;AAC9C,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAI,IAAA,CAAK,aAAA,EAAc,IAAK,IAAA,CAAK,cAAA,EAAgB;AAC/C,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,WAAA;AAEtB,MAAA,GAAA,CAAI,aAAa,iBAAiB,CAAA;AAClC,MAAA,OAAO;AAAA,QACL,IAAI,eAAA,CAAgB,gBAAA,EAAkB,EAAE,OAAA,EAAS,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS,EAAE,EAAG,GAAG;AAAA,OAClF;AAAA,IACF;AAEA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEA,UAAU,IAAA,EAA0C;AAClD,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEA,UAAU,IAAA,EAA8B;AAAA,EAExC;AACF,CAAA;AAKO,IAAM,WAAA,GAAN,cAA0B,YAAA,CAAa;AAAA,EAI5C,WAAA,CACE,OAAA,EACA,SAAA,EACiB,MAAA,EACjB,OAAA,EACA;AACA,IAAA,KAAA,CAAM;AAAA,MACJ,OAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAW,EAAC;AAAA;AAAA,MACZ,SAAA,EAAW,QAAA;AAAA,MACX,OAAO,CAAA,EAAG,MAAA,CAAO,UAAU,CAAA,CAAA,EAAI,OAAO,YAAY,CAAA,CAAA;AAAA,MAClD;AAAA,KACD,CAAA;AAVgB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAajB,IAAA,IAAI,CAAC,MAAA,CAAO,YAAA,IAAgB,OAAO,YAAA,CAAa,IAAA,OAAW,EAAA,EAAI;AAC7D,MAAA,MAAM,IAAI,UAAU,+CAA+C,CAAA;AAAA,IACrE;AAEA,IAAA,IAAI,MAAA,CAAO,aAAa,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,8BAAA,EAAiC,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AAAA,IAC3E;AAEA,IAAA,MAAM,qBAAqB,IAAI,wBAAA,CAAyB,MAAM,IAAA,CAAK,kBAAkB,CAAA;AAIrF,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,gBAAA,CAAiB;AAAA,MACvC,IAAA,EAAM,OAAA;AAAA,MACN,OAAO,CAAA,EAAG,MAAA,CAAO,UAAU,CAAA,CAAA,EAAI,OAAO,YAAY,CAAA,CAAA;AAAA,MAClD,eAAe,MAAA,CAAO;AAAA,KACvB,CAAC,CAAA;AACF,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,kBAAkB,CAAA;AAEtC,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,oBAAA,CAAqB;AAAA,MAC3C,KAAA,EAAO,eAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACP,CAAC,CAAA;AAAA,EACJ;AAAA,EApCmB,MAAA;AAAA,EANX,WAAA,GAAc,CAAA;AAAA,EACd,kBAAA,GAA6C,aAAA;AAAA,EA2CrD,KAAA,CAAM,SAA0B,OAAA,EAAmD;AACjF,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,OAAO,CAAA;AAC5C,IAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAA,CAAK,gBAAA,EAAkB,CAAA;AACvC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,OAAA,CAAQ,SAA0B,OAAA,EAAmD;AACnF,IAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,EACvC;AAAA,EAEA,QAAQ,OAAA,EAAgC;AACtC,IAAA,KAAA,CAAM,QAAQ,OAAO,CAAA;AACrB,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,MAAA,CAAO,UAAA;AAAA,EACzC;AAAA,EAEA,cAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,aAAA,GAAwB;AACtB,IAAA,OAAO,KAAK,MAAA,CAAO,UAAA;AAAA,EACrB;AAAA,EAEA,eAAA,GAA0B;AACxB,IAAA,OAAO,KAAK,MAAA,CAAO,YAAA;AAAA,EACrB;AAAA,EAEA,YAAA,GAAiC;AAC/B,IAAA,IAAI,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY;AAC7C,MAAA,IAAA,CAAK,WAAA,EAAA;AACL,MAAA,IAAA,CAAK,kBAAA,GAAqB,aAAA;AAC1B,MAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,IAC/B;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEA,QAAQ,KAAA,EAAiC;AACvC,IAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,KAAA,GAAQ,IAAA,CAAK,OAAO,UAAA,EAAY;AAC/C,MAAA,MAAM,IAAI,WAAW,CAAA,QAAA,EAAW,KAAK,4BAA4B,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5F;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,kBAAA,GAAqB,MAAA;AAC1B,IAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,EAC/B;AAAA,EAEA,YAAA,GAAiC;AAC/B,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,MAAA,CAAO,UAAA;AAC/B,IAAA,IAAA,CAAK,kBAAA,GAAqB,MAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,KAAK,gBAAA,EAAiB;AAEtC,IAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,eAAA,CAAgB,eAAA,EAAiB;AAAA,MAChD,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,QAAA,EAAS;AAAA,MAC3B,YAAA,EAAc,KAAK,MAAA,CAAO,YAAA;AAAA,MAC1B,WAAW,IAAA,CAAK;AAAA,KACjB,CAAC,CAAA;AAEF,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEQ,gBAAA,GAAqC;AAC3C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,QAAA,EAAS;AAClC,IAAA,MAAM,UAA4B,EAAC;AAGnC,IAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,eAAA,CAAgB,cAAA,EAAgB;AAAA,MAC/C,OAAA;AAAA,MACA,YAAA,EAAc,KAAK,MAAA,CAAO,YAAA;AAAA,MAC1B,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,MACxB,gBAAgB,IAAA,CAAK;AAAA,KACtB,CAAC,CAAA;AAGF,IAAA,IAAI,IAAA,CAAK,kBAAiB,EAAG;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,eAAA,CAAgB,eAAA,EAAiB;AAAA,QAChD,OAAA;AAAA,QACA,YAAA,EAAc,KAAK,MAAA,CAAO,YAAA;AAAA,QAC1B,WAAW,IAAA,CAAK;AAAA,OACjB,CAAC,CAAA;AAAA,IACJ;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AClMO,IAAM,gBAAN,MAAoB;AAAA;AAAA;AAAA;AAAA,EAIzB,OAAO,KAAA,CAAM,UAAA,EAA8B,OAAA,GAAwB,EAAC,EAAW;AAC7E,IAAA,MAAM;AAAA,MACJ,aAAA,GAAgB,IAAA;AAAA,MAChB,YAAA,GAAe,IAAA;AAAA,MACf,eAAA,GAAkB,IAAA;AAAA,MAClB,iBAAA,GAAoB,IAAA;AAAA,MACpB,YAAA,GAAe,OAAA;AAAA,MACf,MAAA,GAAS;AAAA,KACX,GAAI,OAAA;AAEJ,IAAA,MAAM,YAAA,GAAeC,4BAAgB,IAAA,CAAK,UAAA,CACvC,QAAQ,CAAA,CAAA,KAAKA,2BAAAA,CAAgB,IAAA,CAAK,CAAA,CAAE,OAAO,CAAA,CAAE,SAAS,CAAA,CACtD,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA,CAAE,IAAA,KAASD,sBAAAA,CAAW,IAAI,CAAC,CAAA;AAEpE,IAAA,IAAI,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG,OAAO,YAAA;AAGtC,IAAA,MAAM,gBAAgB,YAAA,CAAa,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASA,uBAAW,KAAK,CAAA;AACxE,IAAA,IAAI,eAAe,OAAO,aAAA,CAAc,SAAS,aAAA,CAAc,KAAA,EAAO,UAAS,IAAK,YAAA;AAEpF,IAAA,MAAM,OAAA,GAAU,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,YAAY,CAAA,GAAI,MAAA;AACtE,IAAA,MAAM,QAAQ,YAAA,GAAe,IAAA,CAAK,eAAA,CAAgB,UAAA,EAAY,YAAY,CAAA,GAAI,MAAA;AAC9E,IAAA,MAAM,QAAA,GAAW,eAAA,GAAkB,IAAA,CAAK,eAAA,CAAgB,YAAY,CAAA,GAAI,MAAA;AACxE,IAAA,MAAM,UAAA,GAAa,iBAAA,GAAoB,IAAA,CAAK,iBAAA,CAAkB,YAAY,CAAA,GAAI,MAAA;AAE9E,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,IAAI,WAAW,aAAA,EAAe;AAC1B,MAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC3B,MAAA,IAAI,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAC/B,MAAA,IAAI,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACjC,MAAA,IAAI,UAAA,EAAY,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AAAA,IACzC,CAAA,MAAA,IAAW,WAAW,cAAA,EAAgB;AAClC,MAAA,IAAI,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAC/B,MAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC3B,MAAA,IAAI,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACjC,MAAA,IAAI,UAAA,EAAY,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AAAA,IACzC,CAAA,MAAO;AACH,MAAA,IAAI,QAAA,EAAU,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AACjC,MAAA,IAAI,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAC/B,MAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC3B,MAAA,IAAI,UAAA,EAAY,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AAAA,IACzC;AAGA,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,YAAA,CACJ,OAAO,CAAA,CAAA,KAAK,CAAC,CAAC,CAAA,CAAE,KAAA,IAAS,CAAC,kBAAA,CAAmB,YAAA,CAAa,CAAC,CAAC,CAAA,CAC5D,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,CAChB,IAAA,CAAK,GAAG,CAAA,IAAK,YAAA;AAAA,IAClB;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA,CAAE,MAAK,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,EACnD;AAAA,EAEA,OAAe,iBAAiB,OAAA,EAA8C;AAE5E,IAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASA,uBAAW,MAAM,CAAA;AAC7D,IAAA,IAAI,MAAA,IAAU,MAAA,CAAO,KAAA,EAAO,OAAO,MAAA,CAAO,KAAA;AAG1C,IAAA,MAAM,WAAW,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASA,uBAAW,QAAQ,CAAA;AACjE,IAAA,IAAI,QAAA,IAAY,QAAA,CAAS,KAAA,EAAO,OAAO,QAAA,CAAS,KAAA;AAIhD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,OAAe,eAAA,CAAgB,UAAA,EAA8B,OAAA,EAA8C;AAEzG,IAAA,IAAI,UAAA,CAAW,KAAK,CAAA,CAAA,KAAK,OAAA,CAAQ,GAAG,cAAA,CAAe,WAAW,CAAC,CAAA,EAAG,OAAO,OAAA;AACzE,IAAA,IAAI,UAAA,CAAW,KAAK,CAAA,CAAA,KAAK,OAAA,CAAQ,GAAG,cAAA,CAAe,UAAU,CAAC,CAAA,EAAG,OAAO,MAAA;AACxE,IAAA,IAAI,UAAA,CAAW,KAAK,CAAA,CAAA,KAAK,OAAA,CAAQ,GAAG,cAAA,CAAe,YAAY,CAAC,CAAA,EAAG,OAAO,QAAA;AAC1E,IAAA,IAAI,UAAA,CAAW,KAAK,CAAA,CAAA,KAAK,OAAA,CAAQ,GAAG,cAAA,CAAe,cAAc,CAAC,CAAA,EAAG,OAAO,UAAA;AAG5E,IAAA,MAAM,QAAA,GAAW,CAAC,OAAA,EAAS,MAAA,EAAQ,UAAU,UAAU,CAAA;AACvD,IAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,MAAM,GAAA,GAAA,CAAO,KAAK,KAAA,IAAS,IAAA,CAAK,OAAO,QAAA,EAAS,IAAK,IAAI,WAAA,EAAY;AACrE,MAAA,IAAI,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,GAAA;AAAA,IACrC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,OAAe,gBAAgB,OAAA,EAA8C;AAC3E,IAAA,MAAM,aAAA,GAAgB,CAAC,OAAA,EAAS,MAAA,EAAQ,UAAU,UAAU,CAAA;AAI5D,IAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK;AAC5C,MAAA,IAAI,CAAA,CAAE,SAASA,sBAAAA,CAAW,QAAA,IAAY,EAAE,IAAA,KAASA,sBAAAA,CAAW,MAAA,IACxD,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,cAAc,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,QAAA,IAC1D,CAAA,CAAE,IAAA,KAASA,uBAAW,GAAA,IAAO,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,KAAA,EAAO;AAC1D,QAAA,OAAO,KAAA;AAAA,MACX;AACA,MAAA,MAAM,GAAA,GAAA,CAAO,EAAE,KAAA,IAAS,CAAA,CAAE,OAAO,QAAA,EAAS,IAAK,IAAI,WAAA,EAAY;AAC/D,MAAA,OAAO,CAAC,aAAA,CAAc,QAAA,CAAS,GAAG,CAAA;AAAA,IACpC,CAAC,CAAA;AAED,IAAA,IAAI,iBAAA,CAAkB,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAC3C,IAAA,OAAO,iBAAA,CAAkB,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAAK;AAAA,EAC5D;AAAA,EAEA,OAAe,kBAAkB,OAAA,EAA8C;AAC7E,IAAA,MAAM,gBAAgB,OAAA,CAAQ,MAAA;AAAA,MAAO,OACnC,CAAA,CAAE,IAAA,KAASA,uBAAW,UAAA,IACtB,CAAA,CAAE,SAASA,sBAAAA,CAAW;AAAA,KACxB;AAEA,IAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACvC,IAAA,OAAO,aAAA,CAAc,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAAK;AAAA,EACxD;AACF,CAAA;;;AChIO,IAAM,+BAAN,MAAkE;AAAA,EACrE,UAAA,CAAW,MAAuB,UAAA,EAAwC;AACtE,IAAA,OAAO,CAAC,IAAA,CAAK,KAAA,EAAO,CAAA;AAAA,EACxB;AACJ,CAAA;ACuBA,IAAM,YAAA,GAAe,CAAC,UAAA,KAAiD,UAAA,CAAW,CAAC,CAAA;AAO5E,SAAS,OAAA,CAAQ,SAAuB,QAAA,EAAiC;AAC5E,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,SAAA,EAAW,cAAa,GAAI,QAAA;AAEzD,EAAA,MAAM,IAAA,GAAO,SAAS,aAAA,IAAiB,YAAA;AACvC,EAAA,MAAM,eAAA,GAAkB,KAAK,UAAU,CAAA;AAGvC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,IAAO,IAAIiB,oBAAAA,EAAS;AAC9C,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,IAAW,IAAI,YAAA;AAAA,IACpC,OAAA;AAAA,IACA,SAAS,QAAA,EAAS;AAAA,IAClB,gBAAgB,UAAA,IAAc;AAAA,GAClC;AAEA,EAAA,MAAM,QAAQ,aAAA,CAAc,KAAA,CAAM,UAAA,EAAY,EAAE,cAAc,CAAA;AAE9D,EAAA,OAAA,CACK,WAAW,OAAO,CAAA,CAClB,OAAO,QAAQ,CAAA,CACf,aAAa,SAAS,CAAA,CACtB,QAAA,CAAS,KAAK,EACd,YAAA,CAAa,UAAA,CAAW,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAC,CAAA;AAM3C,EAAA,MAAM,eAAA,GAAkB,SAAS,qBAAA,IAAyB,SAAA;AAC1D,EAAA,MAAM,WAAA,GAAc,IAAI,4BAAA,EAA6B;AACrD,EAAA,MAAM,SAAS,QAAA,CAAS,aAAA;AACxB,EAAA,MAAM,YAAA,GAAe,UAAA,CAChB,OAAA,CAAQ,CAAA,CAAA,KAAK;AACV,IAAA,MAAM,MAAA,GAAS,MAAA,GACThB,2BAAAA,CAAgB,IAAA,CAAK,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAC,CAAA,GAC7CA,2BAAAA,CAAgB,IAAA,CAAK,EAAE,OAAO,CAAA;AACpC,IAAA,OAAO,WAAA,CAAY,UAAA,CAAW,MAAA,EAAQ,eAAe,CAAA;AAAA,EACzD,CAAC,CAAA,CACA,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,CAAC,CAAA;AACrC,EAAA,OAAA,CAAQ,aAAa,YAAY,CAAA;AAMjC,EAAA,IAAI,SAAS,KAAA,EAAO;AAChB,IAAA,MAAMC,KAAI,QAAA,CAAS,KAAA;AAInB,IAAA,MAAM,mBAAmBA,EAAAA,CAAE,IAAA,KAAS,mBAC9B,EAAE,cAAA,EAAgB,OAAM,GACxB,MAAA;AACN,IAAA,OAAA,CAAQ,OAAA,CAAQ;AAAA,MACZ,WAAWA,EAAAA,CAAE,SAAA;AAAA,MACb,YAAYA,EAAAA,CAAE,UAAA;AAAA,MACd,OAAOA,EAAAA,CAAE,KAAA;AAAA,MACT,IAAA,EAAMA,GAAE,IAAA,IAAQ,SAAA;AAAA,MAChB,aAAA,EAAeA,GAAE,IAAA,KAAS,gBAAA;AAAA,MAC1B,gBAAA;AAAA,MACA,YAAYA,EAAAA,CAAE,UAAA;AAAA,MACd,UAAUA,EAAAA,CAAE,QAAA;AAAA,MACZ,GAAI,QAAA,CAAS,oBAAA,IAAwB;AAAC,KACzC,CAAA;AAAA,EACL;AAGA,EAAA,IAAI,SAAS,QAAA,EAAU;AACnB,IAAA,MAAM,IAAI,QAAA,CAAS,QAAA;AACnB,IAAA,OAAA,CAAQ,UAAA,CAAW;AAAA,MACf,aAAa,CAAA,CAAE,WAAA;AAAA,MACf,UAAA,EAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAC5B,eAAe,CAAA,CAAE;AAAA,KACpB,CAAA;AAAA,EACL;AAEA,EAAA,OAAO,KAAA;AACX;;;ACjGO,IAAM,qBAAN,MAA0D;AAAA,EAC7D,QAAA,GAAW,EAAA;AAAA;AAAA,EACF,EAAA,GAAK,aAAA;AAAA,EAEd,KAAA,CAAM,YAA8B,QAAA,EAAoC;AACpE,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,KAAA;AAGnD,IAAA,MAAM,QAAA,GAAW,WAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,SAAA,CAAUF,sBAAAA,CAAW,QAAQ,CAAC,CAAA;AACtE,IAAA,MAAM,SAAA,GAAY,WAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,SAAA,CAAUA,sBAAAA,CAAW,MAAM,CAAC,CAAA;AACrE,IAAA,MAAM,gBAAA,GAAmB,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAA,CAAQ,IAAA;AAAA,MACpD,CAAA,CAAA,KAAA,CAAM,EAAE,IAAA,KAASA,sBAAAA,CAAW,UAAU,CAAA,CAAE,IAAA,KAASA,uBAAW,MAAA,KACrD,OAAO,EAAE,KAAA,KAAU,QAAA,KAClB,EAAE,KAAA,CAAM,WAAA,OAAkB,QAAA,IAAY,CAAA,CAAE,KAAA,CAAM,WAAA,EAAY,KAAM,OAAA;AAAA,KAC3E,CAAA;AAED,IAAA,OAAO,aAAa,SAAA,IAAa,gBAAA,CAAA;AAAA,EACrC;AAAA,EAEA,KAAA,CAAM,OAAA,EAAuB,UAAA,EAA8B,OAAA,EAAgC;AACvF,IAAA,MAAM,uBAAA,GAA0B,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAA,CAAUA,sBAAAA,CAAW,QAAQ,CAAC,CAAA,IAAK,UAAA,CAAW,CAAC,CAAA;AAEtG,IAAA,MAAM,aAAA,GAAgB,wBAAwB,OAAA,CAAQ,IAAA;AAAA,MAClD,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW;AAAA,KAC/B;AACA,IAAA,MAAM,UAAA,GAAa,eAAe,KAAA,IAAS,CAAA;AAI3C,IAAA,MAAM,QAAA,GAA0B;AAAA,MAC5B,SAAA,EAAW,OAAA;AAAA,MACX,cAAc,CAAA,MAAA,EAAS,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,GAAK,CAAC,CAAA,IAAA,CAAA;AAAA,MACrD,UAAA;AAAA,MACA,OAAA;AAAA;AAAA,MAEA,KAAA,EAAO;AAAA,QACH,SAAA,EAAW,MAAA;AAAA,QACX,UAAA;AAAA,QACA,KAAA,EAAO,OAAA;AAAA,QACP,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,gBAAA;AAAA,QACN,UAAA,EAAY;AAAA,OAChB;AAAA;AAAA;AAAA,MAGA,QAAA,EAAU;AAAA,QACN,WAAA,EAAa,MAAA;AAAA,QACb,UAAA,EAAY,CAAA;AAAA,QACZ,aAAA,EAAe;AAAA,OACnB;AAAA,MACA,aAAA,EAAe,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAA,CAAUA,sBAAAA,CAAW,QAAQ,CAAC,CAAA,IAAK,MAAM,CAAC;AAAA,KAC1F;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAA;AAKvC,IAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,gBAAA,CAAiB;AAAA,MACrC,IAAA,EAAM,WAAA;AAAA,MACN;AAAA,KACH,CAAC,CAAA;AAGF,IAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,gBAAA,CAAiB;AAAA,MACrC,IAAA,EAAM;AAAA,QACF,EAAE,KAAA,EAAO,YAAA,EAAc,OAAA,EAAS,OAAA,EAAQ;AAAA,QACxC,EAAE,KAAA,EAAO,gBAAA,EAAkB,OAAA,EAAS,WAAA,EAAa,WAAW,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,QACtE,EAAE,KAAA,EAAO,gBAAA,EAAkB,OAAA,EAAS,UAAA;AAAW;AACnD,KACH,CAAC,CAAA;AAAA,EACN;AACJ,CAAA;AClEO,IAAM,wBAAN,MAA6D;AAAA,EAChE,QAAA,GAAW,EAAA;AAAA;AAAA,EACF,EAAA,GAAK,gBAAA;AAAA,EAEd,KAAA,CAAM,YAA8B,QAAA,EAAoC;AACpE,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,KAAA;AAGnD,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,QAAQ,CAAC,CAAA;AACzF,IAAA,MAAM,UAAA,GAAa,WAAW,IAAA,CAAK,CAAA,CAAA,KAAK,QAAQ,CAAA,EAAG,cAAA,CAAe,kBAAkB,CAAC,CAAA;AAGrF,IAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAA,CAAQ,IAAA;AAAA,MACjD,QAAM,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,MAAA,IAAU,EAAE,IAAA,KAASA,sBAAAA,CAAW,MAAA,KACrD,OAAO,EAAE,KAAA,KAAU,QAAA,IACnB,CAAA,CAAE,KAAA,CAAM,aAAY,KAAM;AAAA,KACpC,CAAA;AACD,IAAA,OAAO,aAAa,UAAA,IAAc,aAAA,CAAA;AAAA,EACtC;AAAA,EAEA,KAAA,CAAM,OAAA,EAAuB,UAAA,EAA8B,OAAA,EAAgC;AACvF,IAAA,MAAM,uBAAA,GAA0B,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAA,CAAQ,IAAA;AAAA,MAC3D,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW;AAAA,KAC9B,CAAA,IAAK,UAAA,CAAW,CAAC,CAAA;AAElB,IAAA,MAAM,aAAA,GAAgB,wBAAwB,OAAA,CAAQ,IAAA;AAAA,MAClD,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW;AAAA,KAC/B;AAEA,IAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,OAAA,CAAQ,CAAA,CAAA,KAAKC,2BAAAA,CAAgB,IAAA,CAAK,CAAA,CAAE,OAAO,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,IAAA;AAAA,MACtF,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASD,sBAAAA,CAAW;AAAA,KAC/B;AAEA,IAAA,MAAM,UAAA,GAAa,eAAe,KAAA,IAAS,GAAA;AAC3C,IAAA,MAAM,cAAc,OAAO,cAAA,EAAgB,KAAA,KAAU,QAAA,GAC/C,eAAe,KAAA,GACf,EAAA;AAGN,IAAA,MAAM,QAAA,GAA0B;AAAA,MAC5B,SAAA,EAAW,MAAA;AAAA,MACX,YAAA,EAAc,QAAQ,WAAW,CAAA,CAAA;AAAA,MACjC,UAAA;AAAA,MACA,OAAA;AAAA;AAAA;AAAA,MAGA,KAAA,EAAO;AAAA,QACH,SAAA,EAAW,MAAA;AAAA,QACX,UAAA,EAAY,UAAA;AAAA,QACZ,KAAA,EAAO,UAAA;AAAA,QACP,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,gBAAA;AAAA;AAAA,QACN,UAAA,EAAY;AAAA,OAChB;AAAA;AAAA,MAEA,QAAA,EAAU;AAAA,QACN,WAAA;AAAA,QACA,UAAA,EAAY,CAAA;AAAA,QACZ,aAAA,EAAe;AAAA,OACnB;AAAA,MACA,aAAA,EAAe,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAA,CAAUA,sBAAAA,CAAW,QAAQ,CAAC,CAAA,IAAK,MAAM,CAAC,CAAA;AAAA,MACtF,qBAAA,EAAuB;AAAA,KAC3B;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAA;AAKvC,IAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,gBAAA,CAAiB;AAAA,MACrC,IAAA,EAAM,WAAA;AAAA,MACN;AAAA,KACH,CAAC,CAAA;AAGF,IAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,gBAAA,CAAiB;AAAA,MACrC,IAAA,EAAM;AAAA,QACF,EAAE,KAAA,EAAO,gBAAA,EAAkB,OAAA,EAAS,OAAA,EAAQ;AAAA,QAC5C,EAAE,KAAA,EAAO,gBAAA,EAAkB,OAAA,EAAS,WAAA,EAAa,WAAW,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,QACtE,EAAE,KAAA,EAAO,mBAAA,EAAqB,OAAA,EAAS,UAAA;AAAW;AACtD,KACH,CAAC,CAAA;AAGF,IAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,UAAU,CAAC,CAAA;AAChG,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,QAAQ,CAAC,CAAA;AAC5F,IAAA,MAAM,UAAA,GAAa;AAAA,MACf,GAAI,aAAA,GAAgB,CAAC,EAAE,UAAA,EAAYA,sBAAAA,CAAW,UAAA,EAAY,MAAA,EAAQ,UAAA,EAAqB,CAAA,GAAI,EAAC;AAAA,MAC5F,GAAI,WAAA,GAAc,CAAC,EAAE,UAAA,EAAYA,sBAAAA,CAAW,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAqB,CAAA,GAAI;AAAC,KAC5F;AACA,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACvB,MAAA,OAAA,CAAQ,YAAY,IAAI,uBAAA,CAAwB,EAAE,UAAA,EAAY,CAAC,CAAA;AAAA,IACnE;AAAA,EACJ;AACJ,CAAA;ACnGO,IAAM,uBAAN,MAA4D;AAAA,EAC/D,QAAA,GAAW,EAAA;AAAA;AAAA,EACF,EAAA,GAAK,eAAA;AAAA,EAEd,KAAA,CAAM,YAA8B,QAAA,EAAoC;AACpE,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,KAAA;AAGnD,IAAA,OAAO,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA;AAAA,MAClC,OAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,QAAA,IAAY,EAAE,MAAA,KAAW;AAAA,KACvD,CAAA;AAAA,EACL;AAAA,EAEA,KAAA,CAAM,OAAA,EAAuB,UAAA,EAA8B,OAAA,EAAgC;AAEvF,IAAA,IAAI,OAAA,CAAQ,kBAAiB,EAAG;AAC5B,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,uBAAA,GAA0B,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAA,CAAQ,IAAA;AAAA,MAC3D,OAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,QAAA,IAAY,EAAE,MAAA,KAAW;AAAA,KACvD,CAAA,IAAK,UAAA,CAAW,CAAC,CAAA;AAElB,IAAA,MAAM,aAAA,GAAgB,wBAAwB,OAAA,CAAQ,IAAA;AAAA,MAClD,OAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,QAAA,IAAY,EAAE,MAAA,KAAW;AAAA,KACxD;AAEA,IAAA,MAAM,SAAA,GAAY,eAAe,SAAA,IAAa,IAAA;AAC9C,IAAA,MAAM,UAAA,GAAa,eAAe,KAAA,IAAS,MAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,WAAW,IAAA,CAAK,CAAA,CAAA,KAAK,QAAQ,CAAA,EAAG,cAAA,CAAe,cAAc,CAAC,CAAA;AACjF,IAAA,MAAM,UAAA,GAAa,WAAW,IAAA,CAAK,CAAA,CAAA,KAAK,QAAQ,CAAA,EAAG,cAAA,CAAe,WAAW,CAAC,CAAA;AAC9E,IAAA,MAAM,WAAA,GAAc,CAAC,EAAE,UAAA,IAAc,SAAA,KAAc,MAAA,CAAA;AAInD,IAAA,MAAM,QAAA,GAA0B;AAAA,MAC5B,SAAA,EAAW,OAAA;AAAA,MACX,YAAA,EAAc,SAAA,KAAc,MAAA,GAAS,WAAA,GAAc,UAAA;AAAA,MACnD,UAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACH,SAAA;AAAA,QACA,UAAA;AAAA,QACA,KAAA,EAAO,aAAa,WAAA,GAAc,UAAA;AAAA,QAClC,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,cAAc,gBAAA,GAAmB,gBAAA;AAAA,QACvC,UAAA;AAAA,QACA,QAAA,EAAU;AAAA,OACd;AAAA,MACA,aAAA,EAAe,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA;AAAA,QAAK,CAAA,CAAA,KACjC,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,QAAA,IAAY,CAAA,CAAE,MAAA,KAAW,SAAS;AAAA,OAChF,IAAK,MAAM,CAAC;AAAA,KAChB;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAA;AAWvC,IAAA,IAAI,cAAc,WAAA,EAAa;AAC3B,MAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,YAAA,CAAa,EAAE,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,CAAC,gBAAgB,CAAA,EAAG,CAAC,CAAA;AAAA,IAC5G,CAAA,MAAO;AACH,MAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,YAAA,CAAa,EAAE,MAAM,WAAA,EAAa,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IAC7E;AAOA,IAAA,IAAI,WAAA,EAAa;AACb,MAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,gBAAA,CAAiB;AAAA,QACrC,IAAA,EAAM;AAAA,UACF,EAAE,KAAA,EAAO,gBAAA,EAAkB,OAAA,EAAS,WAAA,EAAa,WAAW,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,UACtE,EAAE,KAAA,EAAO,gBAAA,EAAkB,OAAA,EAAS,UAAA;AAAW;AACnD,OACH,CAAC,CAAA;AAAA,IACN;AAGA,IAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,gBAAA,CAAiB;AAAA,MACrC,IAAA,EAAM,aAAa,WAAA,GAAc,OAAA;AAAA,MACjC;AAAA,KACH,CAAC,CAAA;AAAA,EACN;AACJ,CAAA;AC7FO,IAAM,sBAAN,MAA2D;AAAA,EAC9D,QAAA,GAAW,EAAA;AAAA,EACF,EAAA,GAAK,cAAA;AAAA,EAEd,KAAA,CAAM,YAA8B,QAAA,EAAoC;AACpE,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,KAAA;AACnD,IAAA,OAAO,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,MAAM,CAAC,CAAA;AAAA,EACjF;AAAA,EAEA,KAAA,CAAM,OAAA,EAAuB,UAAA,EAA8B,OAAA,EAAgC;AAEvF,IAAA,IAAI,OAAA,CAAQ,gBAAe,EAAG;AAC1B,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,wBAAA,GAA2B,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAA,CAAQ,IAAA;AAAA,MAC5D,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW;AAAA,KAC9B,CAAA,IAAK,UAAA,CAAW,CAAC,CAAA;AAElB,IAAA,MAAM,cAAA,GAAiB,yBAAyB,OAAA,CAAQ,IAAA;AAAA,MACpD,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW;AAAA,KAC/B;AAEA,IAAA,IAAI,CAAC,cAAA,EAAgB;AAGrB,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,SAAA,GAAkC,MAAA;AAEtC,IAAA,IAAI,OAAO,cAAA,CAAe,KAAA,KAAU,QAAA,EAAU;AAC1C,MAAA,WAAA,GAAc,cAAA,CAAe,KAAA;AAAA,IACjC;AAKA,IAAA,MAAM,eAAe,UAAA,CAAW,OAAA;AAAA,MAAQ,CAAA,CAAA,KACpC,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,GAAA,IAAO,OAAO,CAAA,CAAE,KAAA,KAAU,QAAQ;AAAA,KAClF,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAe,CAAA;AAE5B,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AACzB,MAAA,SAAA,GAAY,YAAA;AAEZ,MAAA,IAAI,eAAe,CAAA,EAAG;AAClB,QAAA,WAAA,GAAc,SAAA,CAAU,MAAA;AAAA,MAC5B;AAAA,IACJ;AAGA,IAAA,MAAM,QAAA,GAA0B;AAAA,MAC5B,SAAA,EAAW,QAAA;AAAA,MACX,cAAc,SAAA,GAAY,SAAA,CAAU,KAAK,GAAG,CAAA,GAAI,GAAG,WAAW,CAAA,OAAA,CAAA;AAAA,MAC9D,UAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACN,WAAA;AAAA,QACA,UAAA,EAAY,CAAA;AAAA,QACZ,aAAA,EAAe;AAAA,OACnB;AAAA,MACA,eAAe,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,CAAK,OAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,KAASA,sBAAAA,CAAW,MAAM,CAAC,CAAA,IAAK,MAAM,CAAC,CAAA;AAAA;AAAA;AAAA,MAGvG,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,SAASA,sBAAAA,CAAW;AAAA,KAChD;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAA;AAKvC,IAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,gBAAA,CAAiB;AAAA,MACrC,IAAA,EAAM,OAAA;AAAA,MACN;AAAA,KACH,CAAC,CAAA;AAIF,IAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,UAAU,CAAC,CAAA;AAChG,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,QAAQ,CAAC,CAAA;AAC5F,IAAA,MAAM,UAAA,GAAa;AAAA,MACf,GAAI,aAAA,GAAgB,CAAC,EAAE,UAAA,EAAYA,sBAAAA,CAAW,UAAA,EAAY,MAAA,EAAQ,UAAA,EAAqB,CAAA,GAAI,EAAC;AAAA,MAC5F,GAAI,WAAA,GAAc,CAAC,EAAE,UAAA,EAAYA,sBAAAA,CAAW,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAqB,CAAA,GAAI;AAAC,KAC5F;AACA,IAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,uBAAA,CAAwB;AAAA,MAC5C,SAAA;AAAA,MACA;AAAA,KACH,CAAC,CAAA;AAMF,IAAA,OAAA,CAAQ,YAAY,WAAW,CAAA;AAAA,EACnC;AACJ,CAAA;AC/FO,IAAM,uBAAN,MAA4D;AAAA,EAC/D,QAAA,GAAW,EAAA;AAAA;AAAA,EACF,EAAA,GAAK,eAAA;AAAA,EAEd,KAAA,CAAM,YAA8B,QAAA,EAAoC;AACpE,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,KAAA;AAGnD,IAAA,MAAM,WAAA,GAAc,WAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,QAAA,IAAY,CAAA,CAAE,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAC5E,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAASA,sBAAAA,CAAW,QAAA,IAAY,CAAA,CAAE,MAAA,KAAW,SAAS,CAAC,CAAA;AACnH,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAASA,sBAAAA,CAAW,MAAA,IAAU,CAAA,CAAE,MAAA,KAAW,SAAS,CAAC,CAAA;AAElH,IAAA,OAAO,WAAA,IAAe,CAAC,QAAA,IAAY,CAAC,SAAA;AAAA,EACxC;AAAA,EAEA,KAAA,CAAM,OAAA,EAAuB,UAAA,EAA8B,OAAA,EAAgC;AAEvF,IAAA,IAAI,OAAA,CAAQ,gBAAA,EAAiB,IAAK,OAAA,CAAQ,gBAAe,EAAG;AACxD,MAAA;AAAA,IACJ;AAGA,IAAA,MAAM,QAAA,GAA0B;AAAA,MAC5B,SAAA,EAAW,OAAA;AAAA,MACX,YAAA,EAAc,OAAA;AAAA,MACd,UAAA;AAAA,MACA;AAAA,KACJ;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAA;AAKvC,IAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,gBAAA,CAAiB;AAAA,MACrC,IAAA,EAAM,OAAA;AAAA,MACN;AAAA,KACH,CAAC,CAAA;AAKF,IAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,UAAU,CAAC,CAAA;AAChG,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,QAAQ,CAAC,CAAA;AAC5F,IAAA,MAAM,UAAA,GAAa;AAAA,MACf,GAAI,aAAA,GAAgB,CAAC,EAAE,UAAA,EAAYA,sBAAAA,CAAW,UAAA,EAAY,MAAA,EAAQ,UAAA,EAAqB,CAAA,GAAI,EAAC;AAAA,MAC5F,GAAI,WAAA,GAAc,CAAC,EAAE,UAAA,EAAYA,sBAAAA,CAAW,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAqB,CAAA,GAAI;AAAC,KAC5F;AACA,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACvB,MAAA,OAAA,CAAQ,YAAY,IAAI,uBAAA,CAAwB,EAAE,UAAA,EAAY,CAAC,CAAA;AAAA,IACnE;AAAA,EACJ;AACJ,CAAA;;;ACpDO,IAAM,gBAAN,MAAqD;AAAA,EACxD,QAAA,GAAW,EAAA;AAAA,EACF,EAAA,GAAK,OAAA;AAAA,EAEd,KAAA,CAAM,YAA8B,QAAA,EAAoC;AACpE,IAAA,OAAO,UAAA,IAAc,WAAW,MAAA,GAAS,CAAA;AAAA,EAC7C;AAAA,EAEA,KAAA,CAAM,OAAA,EAAuB,WAAA,EAA+B,QAAA,EAAiC;AAEzF,IAAA,IAAI,OAAA,CAAQ,WAAA,CAAY,gBAAgB,CAAA,EAAG;AACvC,MAAA;AAAA,IACJ;AAGA,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,WAAA,CAAY,sBAAsB,CAAA;AAC5D,IAAA,IAAI,SAAA,EAAW;AACX,MAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,gBAAA,CAAiB;AAAA,QACrC,IAAA,EAAM;AAAA,UACF,EAAE,KAAA,EAAO,gBAAA,EAAkB,OAAA,EAAS,WAAA,EAAa,WAAW,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,UACtE,EAAE,KAAA,EAAO,gBAAA,EAAkB,OAAA,EAAS,UAAA;AAAW;AACnD,OACH,CAAC,CAAA;AACF,MAAA;AAAA,IACJ;AAGA,IAAA,IAAI,OAAA,CAAQ,WAAA,CAAY,oBAAoB,CAAA,EAAG;AAC3C,MAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,gBAAA,CAAiB;AAAA,QACrC,IAAA,EAAM;AAAA,UACF,EAAE,KAAA,EAAO,YAAA,EAAc,OAAA,EAAS,OAAA;AAAQ;AAC5C,OACH,CAAC,CAAA;AAAA,IACN;AAAA,EACJ;AACJ,CAAA;;;ACtCO,IAAM,uBAAN,MAA4D;AAAA,EAC/D,QAAA,GAAW,EAAA;AAAA,EACF,EAAA,GAAK,eAAA;AAAA,EAEd,KAAA,CAAM,YAA8B,QAAA,EAAoC;AACpE,IAAA,OAAO,UAAA,IAAc,WAAW,MAAA,GAAS,CAAA;AAAA,EAC7C;AAAA,EAEA,KAAA,CAAM,OAAA,EAAuB,WAAA,EAA+B,QAAA,EAAiC;AAEzF,IAAA,IAAI,OAAA,CAAQ,WAAA,CAAY,oBAAoB,CAAA,EAAG;AAC3C,MAAA;AAAA,IACJ;AAIA,IAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,oBAAA,EAAsB,CAAA;AAAA,EAClD;AACJ,CAAA;;;AClBO,IAAM,mBAAN,MAAwD;AAAA,EAC3D,QAAA,GAAW,EAAA;AAAA,EACF,EAAA,GAAK,UAAA;AAAA,EAEd,KAAA,CAAM,YAA8B,QAAA,EAAoC;AACpE,IAAA,OAAO,UAAA,IAAc,UAAA,CAAW,MAAA,GAAS,CAAA,IACrC,UAAA,CAAW,CAAC,CAAA,CAAE,QAAA,IACd,UAAA,CAAW,CAAC,CAAA,CAAE,QAAA,CAAS,MAAA,GAAS,CAAA;AAAA,EACxC;AAAA,EAEA,KAAA,CAAM,OAAA,EAAuB,UAAA,EAA8B,QAAA,EAAiC;AAExF,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,CAAC,CAAA,CAAE,QAAA;AAG/B,IAAA,MAAM,cAAc,QAAA,CAAS,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,CAAC,CAAA;AAI7D,IAAA,MAAM,qBAAA,GAAwB,QAAQ,cAAA,EAAe;AAErD,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,WAAA,CAAY,sBAAsB,CAAA;AAC5D,IAAA,MAAM,sBAAA,GAAyB,CAAC,CAAC,SAAA;AAKjC,IAAA,IAAI,CAAC,qBAAA,EAAuB;AACxB,MAAA,IAAI,sBAAA,EAAwB;AAExB,QAAA,OAAA,CAAQ,UAAA,CAAW,EAAE,WAAA,EAAa,MAAA,EAAW,YAAY,CAAA,EAAG,aAAA,EAAe,OAAO,CAAA;AAAA,MACtF,CAAA,MAAO;AAEH,QAAA,OAAA,CAAQ,UAAA,CAAW,EAAE,WAAA,EAAa,CAAA,EAAG,YAAY,CAAA,EAAG,aAAA,EAAe,MAAM,CAAA;AAAA,MAC7E;AAAA,IACJ;AASA,IAAA,MAAM,gBAAiB,sBAAA,IAA0B,qBAAA;AACjD,IAAA,MAAM,aAAA,GAAgB,wBAAwB,kBAAA,GAAqB,cAAA;AAInE,IAAA,MAAM,gBAAA,GAAmB,sBAAA,IAA0B,SAAA,EAAW,MAAA,CAAO,IAAA,KAAS,gBAAA;AAE9E,IAAA,OAAA,CAAQ,WAAA,CAAY;AAAA,MAChB,WAAA;AAAA,MACA,OAAA,EAAS,aAAA;AAAA,MACT,UAAA,EAAY,aAAA,GAAgB,EAAE,SAAA,EAAW,eAAc,GAAI,MAAA;AAAA,MAC3D,UAAA,EAAY;AAAA,KACf,CAAA;AAQD,IAAA,OAAA,CAAQ,YAAY,UAAU,CAAA;AAAA,EAClC;AACJ,CAAA;AC/DO,IAAM,yBAAN,MAA8D;AAAA,EACjE,QAAA,GAAW,CAAA;AAAA,EACF,EAAA,GAAK,iBAAA;AAAA,EAEd,KAAA,CAAM,YAA8B,QAAA,EAAoC;AACpE,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,GAAG,OAAO,KAAA;AAGnD,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAASA,sBAAAA,CAAW,QAAA,IAAY,CAAA,CAAE,MAAA,KAAW,SAAS,CAAC,CAAA;AACnH,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAASA,sBAAAA,CAAW,MAAA,IAAU,CAAA,CAAE,MAAA,KAAW,SAAS,CAAC,CAAA;AAClH,IAAA,MAAM,WAAA,GAAc,WAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,QAAA,IAAY,CAAA,CAAE,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAE5E,IAAA,OAAO,CAAC,QAAA,IAAY,CAAC,SAAA,IAAa,CAAC,WAAA;AAAA,EACvC;AAAA,EAEA,KAAA,CAAM,OAAA,EAAuB,UAAA,EAA8B,OAAA,EAAgC;AAIvF,IAAA,OAAA,CAAQ,OAAA,EAAS;AAAA,MACb,SAAA,EAAW,QAAA;AAAA,MACX,YAAA,EAAc,QAAA;AAAA,MACd,UAAA;AAAA,MACA,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,KAAA,EAAO;AAAA,QACH,SAAA,EAAW,IAAA;AAAA,QACX,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACV;AAAA,MACA,aAAA,EAAe,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,KAAW;AAAA,KACpC,CAAA;AAGD,IAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,YAAA,CAAa,EAAE,MAAM,WAAA,EAAa,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,EAC7E;AACJ,CAAA;;;AC3BO,IAAM,gBAAA,GAAmB,IAAI,QAAA,CAAgC;AAAA;AAAA,EAEhE,IAAI,kBAAA,EAAmB;AAAA,EACvB,IAAI,qBAAA,EAAsB;AAAA;AAAA,EAG1B,IAAI,oBAAA,EAAqB;AAAA,EACzB,IAAI,mBAAA,EAAoB;AAAA,EACxB,IAAI,oBAAA,EAAqB;AAAA;AAAA,EAGzB,IAAI,aAAA,EAAc;AAAA,EAClB,IAAI,oBAAA,EAAqB;AAAA,EACzB,IAAI,gBAAA,EAAiB;AAAA;AAAA,EAGrB,IAAI,sBAAA;AACR,CAAC;AAWM,IAAM,qBAAA,GAA0D,iBAAiB,IAAA;AASjF,SAAS,eAAe,UAAA,EAAmD;AAC9E,EAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AACjC,EAAA,KAAA,MAAW,QAAA,IAAa,UAAA,IAAc,gBAAA,CAAiB,IAAA,EAAK,EAAI;AAC5D,IAAA,QAAA,CAAS,iBAAiB,QAAQ,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,QAAA;AACX;;;ACzCO,IAAM,qBAAN,MAAmD;AAAA,EAGtD,WAAA,CAA6B,OAAA,GAA+B,EAAC,EAAG;AAAnC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAoC;AAAA,EAApC,OAAA;AAAA,EAFpB,IAAA,GAAO,eAAA;AAAA,EAIhB,GAAG,OAAA,EAA4C;AAE3C,IAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,KAAK,mEAAmE,CAAA;AAChF,MAAA,OAAO,EAAC;AAAA,IACZ;AAGA,IAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,EAAQ,UAAA;AACnC,IAAA,IAAI,CAAC,UAAA,IAAc,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AACxC,MAAA,OAAA,CAAQ,KAAK,uDAAuD,CAAA;AACpE,MAAA,OAAO,EAAC;AAAA,IACZ;AAGA,IAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAY;AAC1C,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AACxB,MAAA,IAAI,EAAE,QAAA,EAAU;AACZ,QAAA,KAAA,MAAW,UAAA,IAAc,EAAE,QAAA,EAAU;AACjC,UAAA,KAAA,MAAW,OAAA,IAAW,UAAA,EAAY,iBAAA,CAAkB,GAAA,CAAI,OAAO,CAAA;AAAA,QACnE;AAAA,MACJ;AAAA,IACJ;AACA,IAAA,MAAM,kBAAA,GAAqB,WAAW,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,iBAAA,CAAkB,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAC9E,IAAA,MAAM,cAAc,kBAAA,CAAmB,GAAA,CAAI,OAAK,CAAC,CAAA,CAAE,EAAE,CAAC,CAAA;AAEtD,IAAA,MAAM,UAAA,GAAgC;AAAA,MAClC,WAAA;AAAA,MACA,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,MACpB,WAAA,EAAa,IAAA,CAAK,OAAA,CAAQ,WAAA,IAAe;AAAA,KAC7C;AAGA,IAAA,MAAM,YAAA,GAAe,IAAI,mBAAA,EAAoB;AAC7C,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,KAAA,CAAM,OAAA,EAAS,UAAU,CAAA;AAGxD,IAAA,MAAM,SAAA,GAAmC;AAAA,MACrC,SAAA,EAAW,QAAQ,KAAA,CAAM,WAAA;AAAA,MACzB,GAAG,KAAK,OAAA,CAAQ;AAAA,KACpB;AAGA,IAAA,OAAO,CAAC,IAAI,eAAA,CAAgB,SAAA,EAAW,SAAS,CAAC,CAAA;AAAA,EACrD;AACJ;;;AChEO,IAAM,6BAAN,MAA2D;AAAA,EAGhE,WAAA,CAEkB,OAAA,EAEA,OAAA,EAEA,KAAA,GAAsB,QAAA,EACtC;AALgB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAEA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EACf;AAAA,EALe,OAAA;AAAA,EAEA,OAAA;AAAA,EAEA,KAAA;AAAA,EART,IAAA,GAAO,wBAAA;AAAA,EAWhB,GAAG,OAAA,EAAgC;AACjC,IAAA,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS,GAAA,EAAK,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AAAA,EAClF;AACF;;;ACrBO,IAAM,+BAAN,MAA6D;AAAA,EAGlE,YAEkB,SAAA,EAChB;AADgB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EACf;AAAA,EADe,SAAA;AAAA,EAJT,IAAA,GAAO,0BAAA;AAAA,EAOhB,GAAG,OAAA,EAAgC;AACjC,IAAA,OAAA,CAAQ,QAAA,CAAS,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA;AAAA,EAChD;AACF;;;ACJO,IAAM,kBAAN,MAAgD;AAAA,EAGrD,YAMkB,KAAA,EAEA,MAAA,GAAiB,CAAA,EAEjB,KAAA,EACC,MAAoB,YAAA,EACrC;AANgB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAEA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACC,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAGjB,IAAA,IAAI,MAAA,GAAS,CAAA,IAAK,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,UAAA,CAAW,CAAA,yCAAA,EAA4C,MAAM,CAAA,CAAE,CAAA;AAAA,IAC3E;AAAA,EACF;AAAA,EAXkB,KAAA;AAAA,EAEA,MAAA;AAAA,EAEA,KAAA;AAAA,EACC,GAAA;AAAA,EAbV,IAAA,GAAO,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBhB,GAAG,OAAA,EAA4C;AAC7C,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,IAAA,EAAM,YAAA;AAAA,MACN,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,GAAA,EAAI;AAAA,MACxB,IAAA,EAAM;AAAA,QACJ,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAO,IAAA,CAAK;AAAA;AACd,KACF;AACA,IAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS,KAAA,EAAO,OAAO,CAAA;AAAA,EACjD;AACF;ACtCA,SAAS,kBAAkB,GAAA,EAAqB;AAC9C,EAAA,OAAO,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AACrE;AAUA,SAAS,0BAA0B,MAAA,EAAyB;AAC1D,EAAA,MAAM,cAAA,GAAiB,MAAA;AACvB,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,GAAA,IAAO,cAAA,CAAe,QAAA,EAAU,MAAA;AACnE,EAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,IAAY,YAAY,IAAA,EAAK,CAAE,SAAS,CAAA,EAAG;AACpE,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,KAAA;AACH,MAAA,OAAO,MAAA;AAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,YAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA;AAEpB;AAKA,SAAS,yBAAyB,aAAA,EAAoD;AACpF,EAAA,MAAM,SAAiC,EAAC;AACxC,EAAA,MAAM,IAAA,GAAO,cAAc,IAAA,EAAK;AAEhC,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,EAAE,KAAA,KAAU,MAAA,IAAa,OAAO,CAAA,CAAE,UAAU,QAAA,EAAU;AACxD,MAAA,MAAM,GAAA,GAAM,0BAA0B,CAAC,CAAA;AACvC,MAAA,MAAM,MAAM,CAAA,CAAE,KAAA;AAGd,MAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AAIzB,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,GAAG,CAAA,GAAA,CAAK,MAAA,CAAO,GAAG,KAAK,CAAA,IAAK,GAAA;AAAA,IACrC;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAeO,IAAM,uBAAN,MAA2B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhC,oBAAA,CAAqB,OAAA,EAAuB,gBAAA,EAA2B,GAAA,GAAoB,YAAA,EAAqC;AAC9H,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACpC,MAAA,OAAO,EAAC;AAAA,IACV;AAIA,IAAA,MAAM,kBAAkB,OAAA,CACrB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,OAAO,CAAA,CAC5B,MAAA,CAAO,CAACE,OAAmB,OAAOA,EAAAA,KAAM,YAAY,CAAC,KAAA,CAAMA,EAAC,CAAC,CAAA;AAEhE,IAAA,MAAM,SAAA,GAAY,qBAChB,eAAA,CAAgB,MAAA,GAAS,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,eAAe,CAAA,GAAI,CAAA,CAAA;AAG9D,IAAA,OAAO,OAAA,CAAQ,IAAI,CAAA,MAAA,KAAU;AAC3B,MAAA,MAAM,gBAAgBD,2BAAAA,CAAgB,IAAA,CAAK,MAAA,CAAO,OAAA,EAAsB,OAAO,EAAE,CAAA;AAGjF,MAAA,MAAM,eAAe,aAAA,CAAc,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,UAAU,CAAA;AAClE,MAAA,MAAM,iBAAiB,YAAA,EAAc,KAAA,KAAU,MAAA,GAAa,YAAA,CAAa,QAAmB,GAAA,GAAO,MAAA;AAInG,MAAA,MAAM,gBAAgB,aAAA,CAAc,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASD,uBAAW,OAAO,CAAA;AAC3E,MAAA,MAAM,WAAW,OAAO,aAAA,EAAe,UAAU,QAAA,GAAW,aAAA,CAAc,QAAQ,CAAA,IAAK,GAAA;AAEvF,MAAA,MAAM,cAAc,aAAA,CAAc,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASA,uBAAW,KAAK,CAAA;AACvE,MAAA,MAAM,SAAS,OAAO,WAAA,EAAa,UAAU,QAAA,GAAW,WAAA,CAAY,QAAQ,CAAA,IAAK,GAAA;AAEjF,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,EAAU,OAAA,IAAW,SAAA;AAChD,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,EAAU,KAAA,IAAS,IAAI,KAAA,EAAM;AAEtD,MAAA,MAAM,mBAAmB,wBAAA,CAAyB,CAAC,aAAA,CAAc,OAAA,EAAS,CAAC,CAAA;AAE3E,MAAA,MAAM,aAAa,aAAA,CAAc,IAAA;AAAA,QAAK,OACpC,CAAA,CAAE,IAAA,KAAS,QAAA,IACX,CAAA,CAAE,SAAS,QAAA,IACX,CAAA,CAAE,IAAA,KAAS,UAAA,IACX,EAAE,IAAA,KAAS,QAAA,IACX,EAAE,IAAA,KAAS,eAAA,IACX,EAAE,IAAA,KAAS;AAAA,OACb;AACA,MAAA,MAAM,KAAA,GAAQ,UAAA,EAAY,KAAA,IAAS,MAAA,CAAO,cAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,UAAA,EAAY,IAAA,IAAQ,MAAA,CAAO,UAAA;AAIxC,MAAA,MAAM,cAAc,aAAA,CAAc,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASA,uBAAW,KAAK,CAAA;AACvE,MAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,WAAA,EAAa,KAAK,CAAA,GAAI,WAAA,CAAY,QAAQ,EAAC;AAC7E,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,MAAA,GAAS,CAAA,GAClC,WAAA,GACC,MAAA,CAAO,QAAA,GAAW,CAAC,MAAA,CAAO,QAAQ,CAAA,GAAI,EAAC;AAE5C,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAC/B,OAAA,EAAA,CAAU,CAAA,CAAE,OAAA,GAAU,SAAA,IAAa,GAAA;AAAA,QACnC,OAAO,CAAA,CAAE,KAAA,KAAU,UAAa,CAAA,CAAE,KAAA,GAAQ,aAAa,GAAA,GAAO;AAAA,OAChE,CAAE,CAAA;AAEF,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,OAAO,EAAA,IAAM,CAAA;AAAA,QACjB,MAAM,KAAA,IAAS,EAAA;AAAA,QACf,MAAM,IAAA,IAAQ,SAAA;AAAA,QACd,SAAA,EAAA,CAAY,cAAc,SAAA,IAAa,GAAA;AAAA,QACvC,OAAA,EAAA,CAAU,YAAY,SAAA,IAAa,GAAA;AAAA,QACnC,iBAAA,EAAmB,WAAA;AAAA,QACnB,QAAA,EAAU,cAAA;AAAA,QACV,OAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA,EAAU,OAAO,MAAA,IAAU,IAAA;AAAA,QAC3B,KAAA,EAAO,OAAO,UAAA,IAAc,CAAA;AAAA,QAC5B,MAAA,EAAQ,gBAAA;AAAA,QACR,IAAA,EAAM,OAAO,UAAA,IAAc,CAAA;AAAA,QAC3B,KAAA;AAAA,QACA,OAAA,EAAS,aAAA;AAAA,QACT,OAAO,MAAM;AAAE,UAAA,MAAM,CAAA,GAAI,SAAS,MAAgC,CAAA;AAAG,UAAA,OAAO,CAAA,CAAE,SAAS,CAAA,GAAI,MAAA;AAAA,QAAW,CAAA,GAAG;AAAA,QACzG,OAAA,EAAS;AAAA,UACP,YAAY,MAAA,CAAO,UAAA;AAAA,UACnB,mBAAmB,MAAA,CAAO,iBAAA;AAAA,UAC1B,gBAAgB,MAAA,CAAO,cAAA;AAAA,UACvB,kBAAkB,MAAA,CAAO;AAAA,SAC3B;AAAA,QACA,QAAA,EAAU,OAAO,UAAA,IAAc;AAAA,OACjC;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAAA,EAAmD;AAClE,IAAA,MAAM,SAA2B,EAAC;AAClC,IAAA,MAAM,mBAAA,uBAA0B,GAAA,EAAY;AAC5C,IAAA,QAAA,CAAS,OAAA,CAAQ,CAAA,CAAA,KAAK,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAA,KAAK,mBAAA,CAAoB,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA;AAEpF,IAAA,MAAM,eAAA,GAAwD;AAAA,MAC5D,OAAA,EAAS,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,OAAA,EAAS,MAAM,KAAA,EAAM;AAAA,MACnG,YAAA,EAAc,EAAE,EAAA,EAAI,YAAA,EAAc,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,MAAM,UAAA,EAAW;AAAA,MAC9H,SAAA,EAAW,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,SAAA,EAAW,MAAM,MAAA,EAAO;AAAA,MAC9G,OAAA,EAAS,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,MACxG,YAAA,EAAc,EAAE,EAAA,EAAI,YAAA,EAAc,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,MAAM,UAAA,EAAW;AAAA,MAC7H,MAAA,EAAQ,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,MACnG,UAAA,EAAY,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,UAAA,EAAY,MAAM,OAAA,EAAQ;AAAA,MACnH,UAAA,EAAY,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,UAAA,EAAY,MAAM,OAAA,EAAQ;AAAA,MACjH,SAAA,EAAW,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,SAAA,EAAW,MAAM,OAAA,EAAQ;AAAA,MAC7G,OAAA,EAAS,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,OAAA,EAAS,MAAM,OAAA;AAAQ,KACvG;AAEA,IAAA,MAAM,oBAA4C,EAAC;AACnD,IAAA,mBAAA,CAAoB,QAAQ,CAAA,GAAA,KAAO;AACjC,MAAA,IAAI,eAAA,CAAgB,GAAG,CAAA,EAAG;AACxB,QAAA,iBAAA,CAAkB,IAAA,CAAK,eAAA,CAAgB,GAAG,CAAC,CAAA;AAAA,MAC7C,CAAA,MAAO;AACL,QAAA,iBAAA,CAAkB,IAAA,CAAK;AAAA,UACrB,EAAA,EAAI,GAAA;AAAA,UACJ,KAAA,EAAO,kBAAkB,GAAG,CAAA;AAAA,UAC5B,IAAA,EAAM,EAAA;AAAA,UACN,KAAA,EAAO,SAAA;AAAA,UACP,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,EAAA,EAAI,aAAA,EAAe,MAAM,aAAA,EAAe,MAAA,EAAQ,mBAAmB,CAAA;AAAA,IACnF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,UAAiCU,KAAAA,EAAuC;AACnF,IAAA,IAAI,CAACA,KAAAA,IAAQA,KAAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC9B,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,OAAO,QAAA,CAAS,OAAO,CAAA,OAAA,KAAW;AAChC,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,IAAQ,EAAC;AACrC,MAAA,OAAOA,MAAK,KAAA,CAAM,CAAA,GAAA,KAAO,WAAA,CAAY,QAAA,CAAS,GAAG,CAAC,CAAA;AAAA,IACpD,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,UAAiC,IAAA,EAAqC;AACjF,IAAA,OAAO,QAAA,CAAS,MAAA,CAAO,CAAA,OAAA,KAAW,OAAA,CAAQ,aAAa,IAAI,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,OAAA,EAAuD;AACrE,IAAA,OAAO,OAAA,CAAQ,WAAW,EAAC;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CAAe,SAA8B,YAAA,EAA+B;AAC1E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAC5C,IAAA,OAAO,QAAQ,YAAA,KAAiB,YAAA;AAAA,EAClC;AACF;AAiBO,SAAS,wBAAwB,OAAA,EAAiD;AACvF,EAAA,IAAI,CAAC,SAAS,OAAO,EAAE,UAAU,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAEhD,EAAA,MAAM,WAAA,GAAc,IAAI,oBAAA,EAAqB;AAC7C,EAAA,MAAM,UAAA,GAAa,QAAQ,mBAAA,EAAoB;AAM/C,EAAA,MAAM,UAAU,UAAA,CAAW,MAAA;AAAA,IAAO,CAAA,CAAA,KAChC,EAAE,UAAA,KAAe,SAAA,IACjB,EAAE,UAAA,KAAe,WAAA,IACjB,EAAE,UAAA,KAAe;AAAA,GACnB;AACA,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,gBAAA,IAAmB,IAAK,EAAC;AACvD,EAAA,MAAM,MAAA,GAAS,cAAc,MAAA,GAAS,CAAA,GAAI,CAAC,GAAG,OAAA,EAAS,GAAG,aAAa,CAAA,GAAI,OAAA;AAE3E,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,oBAAA,CAAqB,MAAM,CAAA;AAExD,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,QAAA,EAAU,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAAA,EACpC;AAEA,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,gBAAA,CAAiB,QAAQ,CAAA;AAEpD,EAAA,OAAO,EAAE,UAAU,MAAA,EAAO;AAC5B;AAsBO,SAAS,oBAAA,CAAqB,OAAA,EAAkC,gBAAA,EAA2B,GAAA,EAAqC;AACrI,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,QAAA,EAAU,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAExE,EAAA,MAAM,WAAA,GAAc,IAAI,oBAAA,EAAqB;AAI7C,EAAA,MAAM,UAAA,GAGC,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,IACvB,GAAG,CAAA;AAAA,IACH,UAAU,CAAA,CAAE,QAAA,IAAY,EAAE,OAAA,EAAS,CAAA,CAAE,aAAa,CAAA,EAAE;AAAA,IACpD,SAAU,CAAA,CAAE;AAAA,GACd,CAAE,CAAA;AAIF,EAAA,MAAM,kBAAkB,UAAA,CAAW,MAAA;AAAA,IAAO,CAAA,CAAA,KACxC,EAAE,UAAA,KAAe,SAAA,IACjB,EAAE,UAAA,KAAe,WAAA,IACjB,EAAE,UAAA,KAAe;AAAA,GACnB;AASA,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,MAAM,iBAA0C,EAAC;AACjD,EAAA,KAAA,IAAS,IAAI,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpD,IAAA,MAAM,CAAA,GAAI,gBAAgB,CAAC,CAAA;AAC3B,IAAA,IAAI,CAAA,CAAE,eAAe,WAAA,EAAa;AAChC,MAAA,MAAM,KAAA,GAAQ,EAAE,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAASV,uBAAW,KAAK,CAAA;AAC7D,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAASA,sBAAAA,CAAW,KAAA,IAAS,OAAO,CAAA,CAAE,KAAA,KAAU,QAAQ,CAAA;AAC5F,MAAA,IAAI,SAAS,KAAA,EAAO;AAClB,QAAA,MAAM,GAAA,GAAM;AAAA,UACV,MAAA,CAAO,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,SAAS,EAAE,CAAA;AAAA,UACvC,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,UAClB,MAAM,IAAA,IAAQ;AAAA,SAChB,CAAE,KAAK,GAAG,CAAA;AACV,QAAA,MAAM,IAAA,GAAO,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AAClC,QAAA,IAAI,IAAA,KAAS,UAAa,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,GAAI,GAAA,EAAM;AACtE,QAAA,aAAA,CAAc,GAAA,CAAI,GAAA,EAAK,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA;AAAA,MAC3C;AAAA,IACF;AACA,IAAA,cAAA,CAAe,QAAQ,CAAC,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,oBAAA,CAAqB,cAAA,EAAgB,kBAAkB,GAAG,CAAA;AAEvF,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,QAAA,EAAU,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAE;AAAA,EACpC;AAEA,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,gBAAA,CAAiB,QAAQ,CAAA;AAEpD,EAAA,OAAO,EAAE,UAAU,MAAA,EAAO;AAC5B;;;AC9XO,SAAS,eAAe,OAAA,EAAwC;AACrE,EAAA,OAAO,QAAQ,OAAA,CAAQ,CAAA,CAAA,KAAK,EAAE,OAAA,EAAS,UAAA,IAAc,EAAE,CAAA;AACzD;ACJA,IAAM,mBAAA,uBAA0B,GAAA,CAAI,CAAC,OAAO,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,OAAO,CAAC,CAAA;AAuFnE,IAAM,0BAAN,MAA2D;AAAA,EAIhE,YAA6B,WAAA,EAA+C;AAA/C,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAAgD;AAAA,EAAhD,WAAA;AAAA,EAHb,EAAA,GAAK,iBAAA;AAAA,EACL,IAAA,GAAO,yBAAA;AAAA,EAIvB,UAAU,OAAA,EAAiD;AACzD,IAAA,OAAO,4BAAA,CAA6B,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA;AAAA,EAC/D;AACF;AAKO,SAAS,oBAAoBM,QAAAA,EAA4C;AAC9E,EAAA,MAAM,cAAuC,EAAC;AAC9C,EAAA,MAAM,SAAqC,EAAC;AAE5C,EAAA,IAAI,CAACA,QAAAA,IAAW,CAACA,QAAAA,CAAQ,MAAK,EAAG;AAC/B,IAAA,OAAO,EAAE,aAAa,MAAA,EAAO;AAAA,EAC/B;AAEA,EAAA,MAAM,KAAA,GAAQA,QAAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AACnC,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,QAAQ,KAAA,EAAA,EAAS;AACjD,IAAA,MAAM,GAAA,GAAM,MAAM,KAAK,CAAA;AACvB,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AAEzB,IAAA,IAAI,CAAC,WAAW,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACnE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,uCAAuC,CAAA;AACxE,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,MAAM,KAAA,GAAQ,CAAA;AAAA,QACd,GAAA;AAAA,QACA,OAAA,EAAS;AAAA,OACV,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,WAAW,CAAC,CAAA;AAC3B,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,CAAE,IAAA,EAAK;AAEtC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAASoB,UAAS,UAAU,CAAA;AAClC,MAAA,MAAM,GAAA,GAAMC,iBAAgB,MAAM,CAAA;AAClC,MAAA,SAAA,CAAU,MAAM,CAAA;AAChB,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,MAAA;AAAA,QACA,UAAA;AAAA,QACA,GAAA;AAAA,QACA,MAAM,KAAA,GAAQ,CAAA;AAAA,QACd,GAAA;AAAA,QACA,OAAA,EAAS,eAAe,GAAG;AAAA,OAC5B,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,MAAM,KAAA,GAAQ,CAAA;AAAA,QACd,GAAA;AAAA,QACA,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OACnD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,aAAa,MAAA,EAAO;AAC/B;AAKO,SAAS,4BAAA,CACd,aACA,OAAA,EACoB;AACpB,EAAA,IAAI,CAAC,WAAA,CAAY,MAAA,IAAU,CAAC,QAAQ,MAAA,EAAQ;AAC1C,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,IAAA,GAAO,qBAAqB,OAAO,CAAA;AACzC,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,UAA8B,EAAC;AAErC,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,MAAM,QAAQ,kBAAA,CAAmB,UAAA,EAAY,EAAE,IAAA,EAAM,UAAU,CAAA;AAC/D,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,MAAA,CAAO,KAAA,CAAM,KAAK,KAAK,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACzE,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,GAAA,CAAI,aAAA,CAAc,UAAA,CAAW,MAAM,GAAG,KAAK,CAAA;AACpD,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,MAAM,UAAA,CAAW,MAAA;AAAA,MACjB,KAAA;AAAA,MACA,IAAA,EAAM,EAAA;AAAA,MACN,YAAY3B,sBAAAA,CAAW,UAAA;AAAA,MACvB,QAAA,EAAU,EAAE,OAAA,EAAS,GAAA,CAAI,SAAQ,EAAG,KAAA,EAAO,GAAA,CAAI,OAAA,EAAQ,EAAE;AAAA,MACzD,MAAA,EAAQ,SAAA;AAAA,MACR,QAAA,EAAU;AAAA,QACR,QAAQ,UAAA,CAAW,MAAA;AAAA,QACnB,YAAY,UAAA,CAAW,UAAA;AAAA,QACvB,SAAS,UAAA,CAAW,OAAA;AAAA,QACpB,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,UAAU,IAAA,CAAK;AAAA;AACjB,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,kBAAA,CACP,YACA,OAAA,EACoB;AACpB,EAAA,OAAO,YAAA,CAAa,UAAA,CAAW,GAAA,EAAK,OAAA,EAAS,MAAS,CAAA;AACxD;AAEA,SAAS,YAAA,CACP,IAAA,EACA,OAAA,EACA,GAAA,EACoB;AACpB,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,QAAA;AACH,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IAEd,KAAK,YAAA;AACH,MAAA,OAAO,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,GAAG,CAAA;AAAA,IAElD,KAAK,OAAA,EAAS;AACZ,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,QAAA,EAAU,SAAS,GAAG,CAAA;AACtD,MAAA,IAAI,KAAA,KAAU,QAAW,OAAO,MAAA;AAChC,MAAA,OAAO,IAAA,CAAK,QAAA,KAAa,GAAA,GAAM,CAAC,KAAA,GAAQ,KAAA;AAAA,IAC1C;AAAA,IAEA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,SAAS,GAAG,CAAA;AACjD,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,KAAA,EAAO,SAAS,GAAG,CAAA;AACnD,MAAA,IAAI,IAAA,KAAS,MAAA,IAAa,KAAA,KAAU,MAAA,EAAW,OAAO,MAAA;AAEtD,MAAA,QAAQ,KAAK,QAAA;AAAU,QACrB,KAAK,GAAA;AAAK,UAAA,OAAO,IAAA,GAAO,KAAA;AAAA,QACxB,KAAK,GAAA;AAAK,UAAA,OAAO,IAAA,GAAO,KAAA;AAAA,QACxB,KAAK,GAAA;AAAK,UAAA,OAAO,IAAA,GAAO,KAAA;AAAA,QACxB,KAAK,GAAA;AAAK,UAAA,OAAO,KAAA,KAAU,CAAA,GAAI,MAAA,GAAY,IAAA,GAAO,KAAA;AAAA,QAClD,KAAK,GAAA;AAAK,UAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAAA;AACvC,IACF;AAAA,IAEA,KAAK,MAAA;AACH,MAAA,OAAO,YAAA,CAAa,MAAM,OAAO,CAAA;AAAA;AAEvC;AAEA,SAAS,YAAA,CACP,MACA,OAAA,EACoB;AACpB,EAAA,MAAMS,KAAAA,GAAO,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY;AAEnC,EAAA,IAAI,CAAC,mBAAA,CAAoB,GAAA,CAAIA,KAAI,CAAA,EAAG;AAClC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAIA,KAAAA,KAAS,OAAA,IAAW,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AAC9C,IAAA,OAAO,QAAQ,IAAA,CAAK,MAAA;AAAA,EACtB;AAEA,EAAA,KAAA,MAAW,YAAA,IAAgB,QAAQ,IAAA,EAAM;AACvC,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AACb,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,YAAA,CAAa,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,SAAS,YAAY,CAAA;AAC9D,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,MAAA,CAAO,KAAA,CAAM,KAAK,KAAK,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACzE,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACnB;AAEA,EAAA,IAAIA,UAAS,OAAA,EAAS;AACpB,IAAA,OAAO,MAAA,CAAO,MAAA;AAAA,EAChB;AAEA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAOA,KAAAA,KAAS,QAAQ,CAAA,GAAI,MAAA;AAAA,EAC9B;AAEA,EAAA,QAAQA,KAAAA;AAAM,IACZ,KAAK,KAAA;AACH,MAAA,OAAO,OAAO,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,OAAO,CAAC,CAAA;AAAA,IACrD,KAAK,MAAA;AACH,MAAA,OAAO,MAAA,CAAO,OAAO,CAAC,GAAA,EAAK,UAAU,GAAA,GAAM,KAAA,EAAO,CAAC,CAAA,GAAI,MAAA,CAAO,MAAA;AAAA,IAChE,KAAK,KAAA;AACH,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AAAA,IAC3B,KAAK,KAAA;AACH,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,MAAM,CAAA;AAAA;AAE/B;AAEA,SAAS,iBAAA,CACPA,KAAAA,EACA,OAAA,EACA,GAAA,EACoB;AACpB,EAAA,MAAM,UAAA,GAAa,cAAcA,KAAI,CAAA;AAErC,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,UAAU,CAAA;AAC1C,IAAA,IAAI,aAAa,MAAA,EAAW;AAC1B,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA;AACxC;AAEA,SAAS,qBAAqB,OAAA,EAAwD;AACpF,EAAA,MAAM,OAAyB,EAAC;AAEhC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,IAAA,MAAM,OAAA,GAAU,OAAO,MAAA,CAAO,iBAAA,KAAsB,aAChD,MAAA,CAAO,iBAAA,KACP,MAAA,CAAO,UAAA;AAEX,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,UAAA,GAAa,wBAAA,CAAyB,MAAA,EAAQ,MAAM,CAAA;AAC1D,MAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,QAAA,MAAA,CAAO,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,SAAA,CAAU,KAAK,CAAA;AAAA,MAC3C;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,OAAO,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,wBAAA,CACP,QACA,MAAA,EACoB;AACpB,EAAA,MAAM,aAAiC,EAAC;AACxC,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAEtC,EAAA,MAAM,WAAA,GAAc,aAAA,CAAc,MAAA,CAAO,KAAK,CAAA;AAC9C,EAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,IAAA,IAAI,OAAO,MAAA,CAAO,GAAA,KAAQ,YAAY,MAAA,CAAO,GAAA,CAAI,MAAK,EAAG;AACvD,MAAA,UAAA,CAAW,IAAA,CAAK,EAAE,GAAA,EAAK,aAAA,CAAc,OAAO,GAAG,CAAA,EAAG,KAAA,EAAO,WAAA,EAAa,CAAA;AAAA,IACxE;AAEA,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,aAAA,CAAc,MAAA,CAAOT,sBAAAA,CAAW,GAAG,CAAC,CAAA;AACvC,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,aAAa,CAAA;AAClD,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,aAAa,CAAA;AACnD,QAAA;AAAA,MACF,KAAK,aAAA,CAAc,MAAA,CAAOA,sBAAAA,CAAW,UAAU,CAAC,CAAA;AAC9C,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,aAAa,CAAA;AACrD,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,aAAa,CAAA;AACzD,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,aAAa,CAAA;AACrD,QAAA;AAAA,MACF,KAAK,aAAA,CAAc,MAAA,CAAOA,sBAAAA,CAAW,QAAQ,CAAC,CAAA;AAC5C,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,aAAa,CAAA;AACvD,QAAA;AAAA,MACF,KAAK,aAAA,CAAc,MAAA,CAAOA,sBAAAA,CAAW,SAAS,CAAC,CAAA;AAC7C,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,aAAa,CAAA;AACxD,QAAA;AAAA,MACF,KAAK,aAAA,CAAc,MAAA,CAAOA,sBAAAA,CAAW,IAAI,CAAC,CAAA;AACxC,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,aAAa,CAAA;AACnD,QAAA;AAAA,MACF,KAAK,aAAA,CAAc,MAAA,CAAOA,sBAAAA,CAAW,MAAM,CAAC,CAAA;AAC1C,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,aAAa,CAAA;AACrD,QAAA;AAAA,MACF,KAAK,aAAA,CAAc,MAAA,CAAOA,sBAAAA,CAAW,IAAI,CAAC,CAAA;AACxC,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,aAAa,CAAA;AACnD,QAAA;AAAA,MACF,KAAK,aAAA,CAAc,MAAA,CAAOA,sBAAAA,CAAW,GAAG,CAAC,CAAA;AACvC,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,aAAa,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,aAAA,CAAc,MAAA,CAAOA,sBAAAA,CAAW,UAAU,CAAC,CAAA;AAC9C,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,aAAa,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,aAAA,CAAc,MAAA,CAAOA,sBAAAA,CAAW,QAAQ,CAAC,CAAA;AAC5C,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,aAAa,CAAA;AACvD,QAAA;AAAA,MACF,KAAK,aAAA,CAAc,MAAA,CAAOA,sBAAAA,CAAW,GAAG,CAAC,CAAA;AACvC,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,aAAa,CAAA;AAClD,QAAA;AAAA,MACF,KAAK,aAAA,CAAc,MAAA,CAAOA,sBAAAA,CAAW,UAAU,CAAC,CAAA;AAC9C,QAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,aAAa,CAAA;AACzD,QAAA;AAAA;AACJ,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,SAAA,GAAYA,sBAAAA,CAAW,OAAO,CAAA;AAC3D,EAAA,MAAM,YAAY,OAAO,aAAA,EAAe,KAAA,KAAU,QAAA,GAAW,cAAc,KAAA,GAAQ,CAAA;AACnF,EAAA,MAAM,kBAAkB,SAAA,GAAY,GAAA;AACpC,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,eAAe,CAAA,IAAK,mBAAmB,CAAA,EAAG;AAC5D,IAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,iBAAiB,CAAA;AAC3D,IAAA,UAAA,CAAW,KAAK,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,iBAAiB,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAoC;AACzD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,EAAG;AACvD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,YAAY,KAAA,EAAO;AAC3D,IAAA,MAAM,SAAU,KAAA,CAA+B,MAAA;AAC/C,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AACzD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS0B,UAAS,IAAA,EAA2B;AAC3C,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,OAAO,KAAA,GAAQ,KAAK,MAAA,EAAQ;AAC1B,IAAA,MAAM,IAAA,GAAO,KAAK,KAAK,CAAA;AAEvB,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAG;AACnB,MAAA,KAAA,EAAA;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAA;AACd,IAAA,IAAI,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AACvB,MAAA,IAAI,MAAM,KAAA,GAAQ,CAAA;AAClB,MAAA,OAAO,GAAA,GAAM,KAAK,MAAA,IAAU,QAAA,CAAS,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG;AACpD,QAAA,GAAA,EAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AACnC,MAAA,IAAI,CAAC,kBAAkB,IAAA,CAAK,KAAK,KAAK,CAAC,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,EAAG;AAC5D,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,MAC7C;AACA,MAAA,MAAA,CAAO,KAAK,EAAE,IAAA,EAAM,UAAU,KAAA,EAAO,KAAA,EAAO,OAAO,CAAA;AACnD,MAAA,KAAA,GAAQ,GAAA;AACR,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1B,MAAA,IAAI,MAAM,KAAA,GAAQ,CAAA;AAClB,MAAA,OAAO,GAAA,GAAM,KAAK,MAAA,IAAU,cAAA,CAAe,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG;AAC1D,QAAA,GAAA,EAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,CAAA;AAC/E,MAAA,KAAA,GAAQ,GAAA;AACR,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,OAAO,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AAC3D,MAAA,KAAA,EAAA;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,EAAK;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AACxD,MAAA,KAAA,EAAA;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AACxD,MAAA,KAAA,EAAA;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,IAAI,CAAA,YAAA,EAAe,KAAA,GAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EACrE;AAEA,EAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,EAAA,EAAI,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,CAAA;AAC1D,EAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE;AAClC;AAEA,SAASC,iBAAgB,MAAA,EAAqC;AAC5D,EAAA,OAAO,cAAc,MAAM,CAAA;AAC7B;AAEA,SAAS,cAAc,MAAA,EAAqC;AAC1D,EAAA,IAAI,IAAA,GAAO,oBAAoB,MAAM,CAAA;AAErC,EAAA,OAAO,aAAA,CAAc,MAAA,EAAQ,GAAA,EAAK,GAAG,CAAA,EAAG;AACtC,IAAA,MAAMC,SAAAA,GAAW,OAAA,CAAQ,MAAM,CAAA,CAAE,KAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,oBAAoB,MAAM,CAAA;AACxC,IAAA,IAAA,GAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAAA,SAAAA,EAAU,IAAA,EAAM,MAAM,KAAA,EAAM;AAAA,EACvD;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,oBAAoB,MAAA,EAAqC;AAChE,EAAA,IAAI,IAAA,GAAO,WAAW,MAAM,CAAA;AAE5B,EAAA,OAAO,aAAA,CAAc,MAAA,EAAQ,GAAA,EAAK,GAAG,CAAA,EAAG;AACtC,IAAA,MAAMA,SAAAA,GAAW,OAAA,CAAQ,MAAM,CAAA,CAAE,KAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM,CAAA;AAC/B,IAAA,IAAA,GAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAAA,SAAAA,EAAU,IAAA,EAAM,MAAM,KAAA,EAAM;AAAA,EACvD;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAW,MAAA,EAAqC;AACvD,EAAA,MAAM,IAAA,GAAO,WAAW,MAAM,CAAA;AAE9B,EAAA,IAAI,aAAA,CAAc,MAAA,EAAQ,GAAG,CAAA,EAAG;AAC9B,IAAA,MAAMA,SAAAA,GAAW,OAAA,CAAQ,MAAM,CAAA,CAAE,KAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM,CAAA;AAC/B,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAAA,SAAAA,EAAU,IAAA,EAAM,MAAM,KAAA,EAAM;AAAA,EACvD;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAW,MAAA,EAAqC;AACvD,EAAA,IAAI,aAAA,CAAc,MAAA,EAAQ,GAAA,EAAK,GAAG,CAAA,EAAG;AACnC,IAAA,MAAMA,SAAAA,GAAW,OAAA,CAAQ,MAAM,CAAA,CAAE,KAAA;AACjC,IAAA,OAAO,EAAE,MAAM,OAAA,EAAS,QAAA,EAAAA,WAAU,QAAA,EAAU,UAAA,CAAW,MAAM,CAAA,EAAE;AAAA,EACjE;AAEA,EAAA,OAAO,aAAa,MAAM,CAAA;AAC5B;AAEA,SAAS,aAAa,MAAA,EAAqC;AACzD,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,CAAA;AAEzB,EAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,IAAA,OAAA,CAAQ,MAAM,CAAA;AACd,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,EACtD;AAEA,EAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,IAAA,OAAA,CAAQ,MAAM,CAAA;AACd,IAAA,IAAI,UAAA,CAAW,MAAA,EAAQ,GAAG,CAAA,EAAG;AAC3B,MAAA,OAAA,CAAQ,MAAM,CAAA;AACd,MAAA,MAAM,OAAyB,EAAC;AAChC,MAAA,IAAI,CAAC,UAAA,CAAW,MAAA,EAAQ,GAAG,CAAA,EAAG;AAC5B,QAAA,OAAO,IAAA,EAAM;AACX,UAAA,IAAA,CAAK,IAAA,CAAKD,gBAAAA,CAAgB,MAAM,CAAC,CAAA;AACjC,UAAA,IAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AACtB,YAAA,OAAA,CAAQ,MAAM,CAAA;AACd,YAAA;AAAA,UACF;AACA,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,WAAA,CAAY,QAAQ,GAAG,CAAA;AACvB,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,KAAA,CAAM,OAAO,IAAA,EAAK;AAAA,IACjD;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,MAAM,KAAA,EAAM;AAAA,EACjD;AAEA,EAAA,IAAI,UAAA,CAAW,MAAA,EAAQ,GAAG,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,MAAM,CAAA;AACd,IAAA,MAAM,IAAA,GAAOA,iBAAgB,MAAM,CAAA;AACnC,IAAA,WAAA,CAAY,QAAQ,GAAG,CAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,KAAA,CAAM,KAAA,IAAS,cAAc,CAAA,YAAA,EAAe,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,CAAE,CAAA;AACpG;AAEA,SAAS,UAAU,MAAA,EAA2B;AAC5C,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,CAAA;AACzB,EAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,IAAA,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EAClF;AACF;AAEA,SAAS,KAAK,MAAA,EAA4B;AACxC,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,IAAK,OAAO,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AAC9E;AAEA,SAAS,QAAQ,MAAA,EAA4B;AAC3C,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,CAAA;AACzB,EAAA,MAAA,CAAO,KAAA,IAAS,CAAA;AAChB,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,aAAA,CAAc,WAAwB,SAAA,EAAwD;AACrG,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,CAAA;AACzB,EAAA,OAAO,MAAM,IAAA,KAAS,UAAA,IAAc,SAAA,CAAU,QAAA,CAAS,MAAM,KAAY,CAAA;AAC3E;AAEA,SAAS,UAAA,CAAW,QAAqB,KAAA,EAA2B;AAClE,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,CAAA;AACzB,EAAA,OAAO,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,KAAA,KAAU,KAAA;AACnD;AAEA,SAAS,WAAW,MAAA,EAA8B;AAChD,EAAA,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,KAAS,OAAA;AAC/B;AAEA,SAAS,WAAA,CAAY,QAAqB,KAAA,EAAwB;AAChE,EAAA,MAAM,KAAA,GAAQ,KAAK,MAAM,CAAA;AACzB,EAAA,IAAI,CAAC,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC9B,IAAA,MAAM,IAAI,MAAM,CAAA,UAAA,EAAa,KAAK,eAAe,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EACpE;AACA,EAAA,OAAA,CAAQ,MAAM,CAAA;AAChB;AAEA,SAAS,eAAe,IAAA,EAAgC;AACtD,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AAExC,EAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,KAAkC;AAC/C,IAAA,QAAQ,QAAQ,IAAA;AAAM,MACpB,KAAK,YAAA;AACH,QAAA,IAAI,CAAC,mBAAA,CAAoB,GAAA,CAAI,QAAQ,IAAA,CAAK,WAAA,EAAa,CAAA,EAAG;AACxD,UAAA,OAAA,CAAQ,IAAI,aAAA,CAAc,OAAA,CAAQ,IAAI,CAAA,EAAG,QAAQ,IAAI,CAAA;AAAA,QACvD;AACA,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,KAAA,CAAM,QAAQ,QAAQ,CAAA;AACtB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,KAAA,CAAM,QAAQ,IAAI,CAAA;AAClB,QAAA,KAAA,CAAM,QAAQ,KAAK,CAAA;AACnB,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,IAAA,EAAM,KAAA,CAAM,GAAG,CAAA;AACzC,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA;AAAA;AACJ,EACF,CAAA;AAEA,EAAA,KAAA,CAAM,IAAI,CAAA;AACV,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA;AACpC;AAEA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,OAAO,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AAClC;;;ACroBA,IAAA,YAAA,GAAA;AAAA,QAAA,CAAA,YAAA,EAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,WAAA,EAAA,MAAA,WAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,KAAA,EAAA,MAAA,KAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,GAAA,EAAA,MAAA,GAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,MAAA,EAAA,MAAA,MAAA;AAAA,EAAA,kBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;;;ACsCA,IAAM,QAAA,GAAW,4BAAA;AAYV,SAAS,eAAA,CAAgB,KAAa,YAAA,EAAgD;AAC3F,EAAA,MAAM,OAAgC,EAAC;AACvC,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,IAAI,QAA+B,YAAA,EAAc,KAAA;AACjD,EAAA,IAAI,SAA+B,YAAA,EAAc,MAAA;AACjD,EAAA,IAAI,OAAA;AAEJ,EAAA,KAAA,MAAW,GAAA,IAAO,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AACpC,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAEnC,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAC7B,IAAA,IAAI,EAAA,IAAM,kBAAA,CAAmB,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,EAAG;AAClE,MAAA,KAAA,GAAQ,GAAG,CAAC,CAAA;AACZ,MAAA,MAAA,GAAS,MAAA;AACT,MAAA,OAAA,GAAU,MAAA;AACV,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,CAAC,CAAA,CAAE,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACjE,MAAA,MAAA,GAAS,MAAA,CAAO,MAAA;AAChB,MAAA,OAAA,GAAU,MAAA,CAAO,IAAA;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,KAAA,IAAS,YAAA,EAAc,SAAS,SAAA,EAAW,MAAA,EAAQ,OAAiB,CAAC,CAAA;AAAA,EACnG;AAEA,EAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAC1B;AAEA,SAAS,mBAAmB,IAAA,EAAoD;AAC9E,EAAA,IAAI,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,EAAE,EAAE,IAAA,EAAK;AAC1C,EAAA,IAAI,MAAA;AACJ,EAAA,MAAM,GAAA,GAAM,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA;AAC1C,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAA,GAAS,GAAA,CAAI,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAC9D,IAAA,IAAA,GAAO,KAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAE,MAAM,EAAE,IAAA,EAAK;AAAA,EACxC;AACA,EAAA,IAAI,IAAA;AACJ,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA;AAC5C,EAAA,IAAI,KAAA,SAAc,KAAA,CAAM,CAAC,EAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CAAE,IAAA,EAAK;AACrD,EAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AACxB;AAYA,SAAS,IAAI,GAAA,EAAoB;AAC/B,EAAA,MAAM,OAAc,EAAC;AACrB,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,IAAI,MAAA,EAAQ;AACrB,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,IAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,EAAM;AAAE,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AAC9C,IAAA,IAAI,MAAM,GAAA,EAAK;AACb,MAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,MAAA,OAAO,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,CAAC,MAAM,GAAA,EAAK,CAAA,EAAA;AACzC,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AAC5D,MAAA,CAAA,GAAK,CAAA,GAAI,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,CAAA;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA;AAC9B,IAAA,IAAI,GAAA,KAAQ,QAAQ,GAAA,KAAQ,IAAA,IAAQ,QAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,IAAA,EAAM;AAChF,MAAA,IAAA,CAAK,KAAK,EAAE,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,KAAK,CAAA;AAAG,MAAA,CAAA,IAAK,CAAA;AAAG,MAAA;AAAA,IAC1C;AACA,IAAA,IAAI,aAAA,CAAc,QAAA,CAAS,CAAC,CAAA,EAAG;AAAE,MAAA,IAAA,CAAK,KAAK,EAAE,GAAA,EAAK,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA;AAAG,MAAA,CAAA,EAAA;AAAK,MAAA;AAAA,IAAU;AAC9E,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,EAAG;AAC3B,MAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,MAAA,OAAO,CAAA,GAAI,IAAI,MAAA,IAAU,eAAA,CAAgB,KAAK,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAA,EAAA;AACvD,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,IAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,CAAA;AAC3C,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA;AAAA,IACF;AACA,IAAA,CAAA,EAAA;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,UAAA,CAAW,KAAa,EAAA,EAAsB;AACrD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,IAAA,IAAI,MAAM,GAAA,EAAK;AAAE,MAAA,KAAA,GAAQ,CAAC,KAAA;AAAO,MAAA;AAAA,IAAU;AAC3C,IAAA,IAAI,KAAA,EAAO;AACX,IAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IAAO,MAAM,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IAChC,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IAAO,MAAM,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACrC,UAAU,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,EAAA,EAAI,CAAC,CAAA,EAAG;AAC7C,MAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,MAAA,CAAA,IAAK,GAAG,MAAA,GAAS,CAAA;AAAA,IACnB;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,SAAA,CAAU,KAAa,QAAA,EAA8B;AAC5D,EAAA,MAAM,IAAA,GAAO,IAAI,GAAG,CAAA;AACpB,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAWzB,MAAK,IAAA,EAAM;AACpB,IAAA,IAAIA,EAAAA,CAAE,OAAO,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACTA,EAAAA,CAAE,OAAO,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACd,KAAA,KAAU,CAAA,IAAKA,EAAAA,CAAE,IAAA,IAAQ,QAAA,CAAS,QAAA,CAASA,EAAAA,CAAE,IAAI,CAAA,EAAG,GAAA,CAAI,IAAA,CAAKA,EAAAA,CAAE,GAAG,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,GAAA;AACT;AAOA,SAAS,sBAAsB,IAAA,EAAuE;AACpG,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,GAAG,CAAA;AAClC,EAAA,MAAM,WAAW,SAAA,CAAU,IAAA,EAAM,CAAC,OAAO,CAAC,EAAE,IAAA,CAAK,CAAC,CAAA,KAAO,KAAA,CAAM,SAAS,CAAA,GAAI,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,IAAI,IAAK,CAAA;AAC3G,EAAA,MAAM,GAAA,GAAM,YAAY,IAAA,CAAK,MAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,GAAI,GAAG,CAAA,CAAE,IAAA,EAAK;AAClE,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AACzB,IAAA,MAAM,IAAA,GAAO,IAAI,CAAA,GAAI,KAAA,CAAM,SAAS,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA;AACnD,IAAA,QAAA,CAAS,KAAK,IAAA,CAAK,KAAA,CAAM,OAAO,IAAI,CAAA,CAAE,MAAM,CAAA;AAAA,EAC9C;AACA,EAAA,MAAM,KAAA,GAAQ,QAAA,KAAa,MAAA,GAAY,IAAA,CAAK,KAAA,CAAM,WAAW,OAAA,CAAQ,MAAM,CAAA,CAAE,IAAA,EAAK,GAAI,MAAA;AACtF,EAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,EAAM;AACpC;AAEA,IAAM,cAAc,CAAC,MAAA,EAAQ,OAAO,OAAA,EAAS,MAAA,EAAQ,QAAQ,WAAW,CAAA;AAGxE,SAAS,aAAa,OAAA,EAAmF;AAEvG,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,OAAA,EAAS,IAAI,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,EAAS,WAAW,CAAA;AAC5C,EAAA,IAAI,MAAM,OAAA,CAAQ,MAAA;AAClB,EAAA,IAAI,MAAA,CAAO,UAAU,MAAA,CAAO,CAAC,IAAI,GAAA,EAAK,GAAA,GAAM,OAAO,CAAC,CAAA;AACpD,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,IAAI,CAAA,GAAI,KAAK,GAAA,GAAM,CAAA;AAC1C,EAAA,MAAMsB,QAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,EAAE,IAAA,EAAK;AAExC,EAAA,IAAI,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,IAAA,EAAK;AACnC,EAAA,IAAI,IAAA;AACJ,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAEjC,IAAA,MAAM,IAAA,GAAO,gDAAA,CAAiD,IAAA,CAAK,KAAK,CAAA;AACxE,IAAA,MAAM,GAAA,GAAM,IAAA,GAAO,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,CAAC,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,GAAM,CAAA,GAAI,CAAA,CAAA,GAAK,KAAA,CAAM,MAAA;AACrE,IAAA,IAAA,GAAO,MAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,CAAE,MAAK,IAAK,MAAA;AACrC,IAAA,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA,EAAK;AAAA,EAC/B;AAEA,EAAA,WAAS;AACP,IAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AACjB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,CAAA,GAAI,mDAAA,CAAoD,IAAA,CAAK,IAAI,CAAA;AACvE,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAK;AAC1B,IAAA,MAAM,IAAA,GAAO,yCAAA,CAA0C,IAAA,CAAK,OAAO,CAAA;AACnE,IAAA,MAAM,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAM,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,GAAI,OAAA;AAClD,IAAA,OAAA,CAAQ,EAAE,CAAA,GAAI,GAAA,CAAI,IAAA,EAAK;AACvB,IAAA,IAAA,GAAO,QAAQ,KAAA,CAAM,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,QAAQ,MAAM,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAC/B;AAGA,SAAS,mBAAmB,GAAA,EAAuB;AACjD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,IAAA,IAAI,MAAM,GAAA,EAAK;AAAE,MAAA,KAAA,GAAQ,CAAC,KAAA;AAAO,MAAA;AAAA,IAAU;AAC3C,IAAA,IAAI,KAAA,EAAO;AACX,IAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IAAO,MAAM,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IAChC,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IAAO,MAAM,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACrC,KAAA,KAAU,CAAA,IAAK,CAAA,KAAM,GAAA,EAAK;AAAE,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,CAAC,CAAC,CAAA;AAAG,MAAA,KAAA,GAAQ,CAAA,GAAI,CAAA;AAAG,MAAA;AAAA,IAAU;AAC7F,IAAA,IAAI,KAAA,KAAU,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,OAAA,EAAS,CAAC,CAAA,IAAK,CAAC,eAAA,CAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,IAAK,EAAE,CAAA,IAAK,CAAC,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,GAAI,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG;AACnI,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,CAAC,CAAC,CAAA;AAC5B,MAAA,KAAA,GAAQ,IAAI,OAAA,CAAQ,MAAA;AACpB,MAAA,CAAA,IAAK,QAAQ,MAAA,GAAS,CAAA;AAAA,IACxB;AAAA,EACF;AACA,EAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAK,CAAC,CAAA;AACzB,EAAA,OAAO,GAAA,CAAI,IAAI,CAAC,CAAA,KAAM,EAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAChD;AAEA,SAAS,WAAW,QAAA,EAAmE;AACrF,EAAA,MAAM,MAAuD,EAAC;AAC9D,EAAA,KAAA,MAAW,CAAA,IAAK,kBAAA,CAAmB,QAAQ,CAAA,EAAG;AAC5C,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,CAAA,EAAG,IAAI,CAAA;AAChC,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,IAAA,GAAO,EAAE,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAC,EAAE,IAAA,EAAK;AACjC,MAAA,IAAA,GAAO,CAAA,CAAE,MAAM,KAAA,CAAM,CAAC,IAAI,CAAC,CAAA,CAAE,MAAK,IAAK,MAAA;AAAA,IACzC;AACA,IAAA,MAAM,EAAA,GAAK,IAAI,IAAI,CAAA,CAAE,KAAK,CAACtB,EAAAA,KAAMA,EAAAA,CAAE,EAAA,KAAO,GAAG,CAAA;AAC7C,IAAA,IAAI,CAAC,IAAI,MAAM,IAAI,eAAe,CAAA,uBAAA,EAA0B,CAAC,IAAI,CAAC,CAAA;AAClE,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,EAAG,EAAA,CAAG,GAAG,CAAA,CAAE,IAAA,IAAQ,IAAA,EAAM,IAAA,CAAK,MAAM,EAAA,CAAG,GAAA,GAAM,CAAC,CAAA,CAAE,IAAA,EAAK,EAAG,IAAA,EAAM,CAAA;AAAA,EAC5F;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAA,CAAa,KAAa,WAAA,EAA0F;AAC3H,EAAA,MAAM,UAAU,SAAA,CAAU,GAAA,EAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAC1C,EAAA,IAAI,IAAA,GAAO,GAAA;AACX,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,IAAA,GAAO,IAAI,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,MAAM,EAAE,IAAA,EAAK;AAC/C,IAAA,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,OAAO,EAAE,IAAA,EAAK;AAAA,EACpC;AACA,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAC3C,EAAA,MAAM,WAAW,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,EAAE,EAAE,IAAA,EAAK;AACzD,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,MAAM,WAAA,EAAY;AAC3D,EAAA,MAAM,EAAE,IAAA,EAAAsB,KAAAA,EAAM,IAAA,EAAK,GAAI,aAAa,QAAQ,CAAA;AAC5C,EAAA,OAAO,EAAE,IAAA,EAAAA,KAAAA,EAAM,IAAA,EAAM,MAAM,SAAA,EAAU;AACvC;AAEA,SAAS,aACP,SAAA,EACA,QAAA,EACA,QACA,OAAA,EACA,IAAA,EACA,UACA,IAAA,EACa;AACb,EAAA,MAAM,QAAkC,EAAC;AACzC,EAAA,KAAA,CAAM,OAAO,CAAA,GAAI,EAAE,EAAA,EAAI,SAAS,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,OAAA,EAAS,GAAI,IAAA,GAAO,EAAE,IAAA,EAAK,GAAI,EAAC,EAAG;AAC7F,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA,GAAI,EAAE,IAAI,CAAA,CAAE,IAAA,EAAM,MAAM,MAAA,EAAQ,UAAA,EAAY,EAAE,IAAA,EAAM,GAAI,EAAE,IAAA,GAAO,EAAE,MAAM,CAAA,CAAE,IAAA,EAAK,GAAI,EAAC,EAAG;AAAA,EACtG;AACA,EAAA,MAAM,IAAiB,EAAE,EAAA,EAAI,SAAA,EAAW,QAAA,EAAU,QAAQ,KAAA,EAAM;AAChE,EAAA,IAAI,IAAA,IAAQ,IAAA,GAAO,IAAA;AACnB,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,WAAA,CACP,IAAA,EACA,KAAA,EACA,MAAA,EACA,YACA,SAAA,EACuB;AACvB,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AACtC,EAAA,MAAM,OAAA,GAAU,CAAC,CAAC,MAAA;AAClB,EAAA,MAAM,OAAO,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,OAAQ,KAAK,CAAA,GAAI,GAAA,GAAM,IAAA,CAAK,MAAM,MAAA,CAAQ,KAAA,GAAQ,OAAQ,CAAC,CAAA,CAAE,MAAM,CAAA,GAAI,IAAA;AAC5G,EAAA,MAAM,EAAA,GAAK,IAAI,IAAI,CAAA,CAAE,KAAK,CAACtB,EAAAA,KAAMA,EAAAA,CAAE,EAAA,KAAO,GAAG,CAAA;AAC7C,EAAA,IAAI,CAAC,IAAI,MAAM,IAAI,eAAe,CAAA,0BAAA,EAA6B,IAAI,IAAI,CAAC,CAAA;AACxE,EAAA,MAAMO,QAAO,IAAA,CAAK,KAAA,CAAM,GAAG,EAAA,CAAG,GAAG,EAAE,IAAA,EAAK;AACxC,EAAA,IAAI,CAACA,KAAAA,EAAM,MAAM,IAAI,cAAA,CAAe,qBAAqB,CAAC,CAAA;AAC1D,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,GAAA,GAAM,CAAC,EAAE,IAAA,EAAK;AAEzC,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,aAAa,KAAA,EAAM,GAAI,sBAAsB,IAAI,CAAA;AAC5E,EAAA,MAAM,EAAE,IAAA,EAAAe,KAAAA,EAAM,MAAM,OAAA,EAAQ,GAAI,aAAa,OAAO,CAAA;AACpD,EAAA,MAAM,QAAA,GAAW,KAAA,GAAQ,UAAA,CAAW,KAAK,IAAI,EAAC;AAI9C,EAAA,eAAA,CAAgBA,KAAI,CAAA;AACpB,EAAA,KAAA,MAAW,CAAA,IAAK,QAAA,EAAU,eAAA,CAAgB,CAAA,CAAE,IAAI,CAAA;AAChD,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA;AAE9C,EAAA,MAAM,WAAW,OAAA,CAAQ,IAAA;AACzB,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAA,GAAS,CAAA;AAEnC,EAAA,MAAM,WAA0B,EAAC;AAEjC,EAAA,MAAM,aAAA,GACJ,OAAA,CAAQ,SAAA,KAAc,MAAA,GAAY,oBAAA,GAAuB,UAAA;AAC3D,EAAA,MAAM,eAAA,GAAkB,aAAA,KAAkB,oBAAA,GAAuB,EAAA,GAAK,GAAA;AACtE,EAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,GAAW,MAAA;AACvC,EAAA,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,SAAA,EAAW,eAAA,EAAiB,aAAA,EAAeA,OAAM,IAAA,EAAM,QAAA,EAAU,WAAA,IAAe,MAAS,CAAC,CAAA;AAGrH,EAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,MAAA,EAAQ,CAAA,KAAM;AACjC,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,MAAA,EAAQA,KAAI,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,IAAI,SAAA,GAAY,CAAA,IAAA,EAAO,IAAI,CAAC,CAAA,CAAA,GAAK,CAAA,IAAA,EAAO,CAAA,GAAI,CAAC,CAAA,CAAA;AACzD,IAAA,MAAM,QAAA,GAAW,CAAA,KAAM,CAAA,GAAI,EAAA,GAAK,EAAA;AAChC,IAAA,QAAA,CAAS,IAAA,CAAK,YAAA;AAAA,MACZ,GAAA;AAAA,MAAK,QAAA;AAAA,MACL,GAAA,CAAI,YAAY,oBAAA,GAAuB,UAAA;AAAA,MACvC,IAAI,IAAA,IAAQA,KAAAA;AAAA,MAAM,GAAA,CAAI,IAAA,KAAS,CAAA,KAAM,CAAA,GAAI,IAAA,GAAO,MAAA,CAAA;AAAA,MAChD,QAAA;AAAA,MAAU,GAAA,CAAI;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAA,GAAS,EAAE,QAAQ,OAAA,EAAS,GAAI,OAAO,EAAE,IAAA,EAAK,GAAI,EAAC,EAAG;AACtD,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,MAAM,CAAA,GAAI,cAAA,CAAe,OAAA,CAAQ,GAAG,CAAA;AACpC,MAAA,MAAA,CAAO,MAAM,CAAA,CAAE,GAAA;AACf,MAAA,IAAI,EAAE,OAAA,EAAS;AACb,QAAA,MAAA,CAAO,SAAA,GAAY,IAAA;AACnB,QAAA,MAAA,CAAO,UAAU,CAAA,CAAE,OAAA;AAAA,MACrB;AAAA,IACF;AACA,IAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,CAAO,KAAA,GAAQ,QAAQ,KAAA,CAAM,OAAA,CAAQ,UAAU,EAAE,CAAA;AACpE,IAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,IAAA;AAC5C,IAAA,IAAI,QAAQ,IAAA,EAAM,MAAA,CAAO,oBAAA,GAAuB,OAAA,CAAQ,KAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,EAC7G;AAEA,EAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,UAAA,GAAc,QAAA,IAAY,UAAA;AAC/C,EAAA,MAAM,GAAA,GAA6B;AAAA,IACjC,EAAA,EAAIf,KAAAA;AAAA,IACJ,IAAA,EAAM,UAAU,SAAA,GAAY,QAAA;AAAA,IAC5B,KAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAI,MAAA,IAAU,MAAA,CAAO,SAAS,EAAE,MAAA,KAAW,EAAC;AAAA,IAC5C,GAAI,IAAA,GAAO,EAAE,IAAA,KAAS;AAAC,GACzB;AACA,EAAA,IAAI,MAAA,MAAY,MAAA,GAAS,MAAA;AACzB,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,eAAe,SAAA,EAA0E;AAChG,EAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAA;AAC7C,EAAA,MAAM,UAAU,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,IAAK,CAAC,CAAC,GAAA;AACnD,EAAA,MAAM,UAAU,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA;AAC/E,EAAA,MAAM,GAAA,GAAM,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,KAAM,SAAA,IAAa,CAAC,MAAA,CAAO,KAAK,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAC,CAAA,CAAE,UAAA,CAAW,IAAI,CAAC,CAAA,IAAK,SAAA;AACnI,EAAA,OAAO,EAAE,GAAA,EAAK,OAAA,EAAS,OAAA,EAAQ;AACjC;AAUO,SAAS,aAAa,GAAA,EAAgD;AAC3E,EAAA,MAAM,GAAA,GAAM,IAAI,MAAA,EAAQ,MAAA;AACxB,EAAA,IAAI,MAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,IAAI,CAAC,CAAA;AACpC,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,iBAAiB,GAAA,EAAoC;AACnE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,MAAA,GAAS,GAAG,GAAA,CAAI,KAAK,GAAG,GAAA,CAAI,MAAA,EAAQ,MAAA,GAAS,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAA,CAAO,KAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAG,GAAA,CAAI,OAAO,CAAA,MAAA,EAAS,GAAA,CAAI,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,CAAA;AAC9H,EAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAEjB,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,GAAA,CAAI,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAA,GAAW,EAAE,QAAQ,CAAA;AACvE,EAAA,MAAM,OAAA,GAAU,OAAO,CAAC,CAAA;AACxB,EAAA,MAAM,KAAA,GAAQ,aAAa,GAAG,CAAA;AAC9B,EAAA,MAAM,OAAA,GAAU,OAAA,IAAW,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,GACnD,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,GACnB,MAAA;AACJ,EAAA,MAAMe,KAAAA,GAAO,OAAA,EAAS,UAAA,KAAe,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAC,CAAA,EAAG,UAAA,GAAa,EAAA,CAAA,IAAO,EAAA;AAEpG,EAAA,IAAI,IAAA,GAAO,CAAA,EAAA,EAAK,GAAA,CAAI,EAAE,CAAA,EAAG,GAAA,CAAI,IAAA,KAAS,SAAA,GAAY,YAAA,GAAe,EAAE,CAAA,GAAA,EAAMA,KAAI,CAAA,CAAA;AAC7E,EAAA,MAAM,WAAW,OAAA,EAAS,IAAA;AAC1B,EAAA,IAAI,QAAA,EAAU,IAAA,IAAQ,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAA;AACrC,EAAA,IAAI,IAAI,MAAA,EAAQ;AACd,IAAA,IAAI,GAAA,CAAI,OAAO,IAAA,IAAQ,CAAC,UAAU,IAAA,IAAQ,CAAA,IAAA,EAAO,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,CAAA;AAChE,IAAA,IAAI,GAAA,CAAI,OAAO,GAAA,EAAK;AAClB,MAAA,IAAA,IAAQ,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAA;AAC9B,MAAA,IAAI,GAAA,CAAI,OAAO,SAAA,EAAW;AACxB,QAAA,IAAA,IAAQ,CAAA,QAAA,EAAW,GAAA,CAAI,MAAA,CAAO,OAAA,EAAS,MAAA,GAAS,CAAA,KAAA,EAAQ,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,MAAM,EAAE,CAAA,CAAA;AAAA,MAC/F;AAAA,IACF;AACA,IAAA,IAAI,IAAI,MAAA,CAAO,KAAA,UAAe,CAAA,QAAA,EAAW,GAAA,CAAI,OAAO,KAAK,CAAA,CAAA,CAAA;AACzD,IAAA,IAAI,IAAI,MAAA,CAAO,QAAA,UAAkB,CAAA,MAAA,EAAS,GAAA,CAAI,OAAO,QAAQ,CAAA,CAAA;AAC7D,IAAA,IAAI,GAAA,CAAI,MAAA,CAAO,oBAAA,EAAsB,MAAA,EAAQ,IAAA,IAAQ,CAAA,MAAA,EAAS,GAAA,CAAI,MAAA,CAAO,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,EAC1G;AACA,EAAA,IAAI,OAAA,EAAS,MAAA,KAAW,oBAAA,EAAsB,IAAA,IAAQ,YAAA;AACtD,EAAA,IAAI,OAAA,EAAS,IAAA,EAAM,IAAA,IAAQ,CAAA,MAAA,EAAS,QAAQ,IAAI,CAAA,CAAA;AAGhD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,GAAI,MAAA;AACtC,IAAA,IAAI,GAAA,GAAM,CAAA,GAAA,EAAM,IAAA,GAAO,IAAA,CAAK,aAAa,EAAE,CAAA,CAAA;AAC3C,IAAA,IAAI,IAAA,EAAM,IAAA,EAAM,GAAA,IAAO,CAAA,IAAA,EAAO,KAAK,IAAI,CAAA,CAAA;AACvC,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,oBAAA,EAAsB,GAAA,IAAO,YAAA;AAC9C,IAAA,IAAI,CAAA,CAAE,IAAA,EAAM,GAAA,IAAO,CAAA,MAAA,EAAS,EAAE,IAAI,CAAA,CAAA;AAClC,IAAA,IAAA,IAAQ,GAAA;AAAA,EACV;AAGA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,KAAA,MAAW,CAAC,IAAI,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,CAAA,CAAE,KAAK,CAAA,EAAG;AAC7C,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,EAAO;AAC3B,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,MAAA,IAAA,IAAQ,CAAA,OAAA,EAAU,EAAE,CAAA,GAAA,EAAM,CAAA,CAAE,UAAU,CAAA,CAAA;AACtC,MAAA,IAAI,CAAA,CAAE,IAAA,EAAM,IAAA,IAAQ,CAAA,IAAA,EAAO,EAAE,IAAI,CAAA,CAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;ACvbA,SAAS,WAAA,CACP,EAAA,EACA,MAAA,EACA,UAAA,GAAuC,QAAA,EACzB;AACd,EAAA,OAAO,EAAE,EAAA,EAAI,MAAA,EAAQ,UAAA,EAAY,GAAA,EAAK,MAAM,MAAA,EAAU;AACxD;AAEO,SAAS,kBAAA,GAAqC;AACnD,EAAA,MAAM,GAAA,GAAM,IAAI,cAAA,EAAe;AAC/B,EAAA,GAAA,CAAI,QAAA,CAAS,YAAY,QAAA,EAAU;AAAA,IACjC,GAAA,EAAK,EAAE,SAAA,EAAW,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAC3C,gBAAA,EAAkB,EAAE,SAAA,EAAW,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IACxD,UAAA,EAAY,EAAE,SAAA,EAAW,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IAClD,aAAA,EAAe,EAAE,SAAA,EAAW,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IACrD,YAAA,EAAc,EAAE,SAAA,EAAW,QAAA,EAAU,MAAM,QAAA;AAAS,GACtD,EAAG,aAAa,CAAC,CAAA;AACjB,EAAA,GAAA,CAAI,QAAA,CAAS,WAAA,CAAY,YAAA,EAAc,EAAE,GAAA,EAAK,EAAE,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,QAAA,EAAS,EAAG,CAAC,CAAA;AACxF,EAAA,GAAA,CAAI,QAAA,CAAS,WAAA,CAAY,SAAA,EAAW,EAAE,MAAA,EAAQ,EAAE,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,QAAA,EAAS,EAAG,CAAC,CAAA;AACxF,EAAA,GAAA,CAAI,QAAA,CAAS,WAAA,CAAY,aAAA,EAAe,EAAE,gBAAA,EAAkB,EAAE,SAAA,EAAW,QAAA,EAAU,IAAA,EAAM,QAAA,EAAS,EAAE,EAAG,aAAa,CAAC,CAAA;AACrH,EAAA,OAAO,GAAA;AACT;;;ACnBO,IAAM,GAAA,GAAM;AAGZ,SAAS,UAAU,EAAA,EAAoB;AAC5C,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAG,CAAA;AAC5B;AAWO,SAAS,kBACd,KAAA,EACqB;AACrB,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,IAAA,CAAK,SAAS,CAAA;AACpC,IAAA,KAAA,CAAM,GAAA,CAAI,MAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,IAAK,CAAA,IAAK,KAAK,KAAK,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,KAAA;AACT;AAQO,SAAS,sBAAA,CACd,OACA,UAAA,EACa;AACb,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAK,UAAU,CAAA;AAChE,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AACnC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAG,QAAQ,CAAA;AACrC,EAAA,MAAM,SAAS,CAAC,CAAA,KAAc,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AAE9C,EAAA,MAAM,UAAuB,EAAC;AAC9B,EAAA,KAAA,IAAS,GAAA,GAAM,QAAA,EAAU,GAAA,IAAO,UAAA,EAAY,GAAA,EAAA,EAAO;AACjD,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,GAAM,CAAC,CAAA;AAC3B,MAAA,KAAA,IAAS,IAAA;AACT,MAAA,IAAI,CAAA,GAAI,GAAG,IAAA,IAAQ,IAAA;AAAA,IACrB;AACA,IAAA,MAAM,QAAQ,IAAA,GAAO,CAAA;AACrB,IAAA,MAAM,UAAU,KAAA,GAAQ,EAAA;AAExB,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,GAAM,CAAC,CAAA,GAAI,KAAA;AAC/B,MAAA,QAAA,IAAY,IAAA,GAAO,IAAA;AAAA,IACrB;AACA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA;AAElC,IAAA,MAAM,MAAA,GAAoB,EAAE,GAAA,EAAI;AAChC,IAAA,IAAI,OAAA,GAAU,CAAA,EAAG,MAAA,CAAO,IAAA,GAAO,KAAA,GAAQ,OAAA;AACvC,IAAA,IAAI,MAAM,CAAA,EAAG;AACX,MAAA,MAAA,CAAO,WAAW,KAAA,GAAQ,GAAA;AAC1B,MAAA,MAAA,CAAO,MAAA,GAAS,OAAO,QAAA,GAAW,IAAA;AAAA,IACpC;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,IAAa,MAAA,CAAO,aAAa,MAAA,EAAW;AAC9D,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AC3EO,SAAS,wBAAwB,MAAA,EAAmE;AACzG,EAAA,MAAM,OAAA,GAAqB,OAAO,OAAA,YAAmBvB,2BAAAA,GACjD,OAAO,OAAA,CAAQ,OAAA,EAAQ,GACvB,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,GACzB,MAAA,CAAO,UACP,MAAA,CAAO,OAAA,EAAiB,UACtB,MAAA,CAAO,OAAA,CAAgB,OAAA,EAAQ,GAChC,EAAC;AAET,EAAA,MAAM,KAAA,GAAQ,SAAS,MAAM,CAAA;AAE7B,EAAA,OAAO;AAAA,IACL,IAAI,MAAA,CAAO,EAAA;AAAA,IACX,IAAA,EAAO,MAAA,CAAe,IAAA,IAAS,MAAA,CAAe,SAAA,EAAW,IAAA;AAAA,IACzD,IAAA,EAAO,MAAA,CAAe,IAAA,IAAS,MAAA,CAAe,SAAA,EAAW,IAAA;AAAA,IACzD,OAAA,EAAU,MAAA,CAAe,OAAA,IAAY,MAAA,CAAe,SAAA,EAAW,OAAA;AAAA,IAC/D,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,EAAE,OAAA,EAAS,MAAA,CAAO,QAAA,CAAS,OAAA,EAAS,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,KAAA,EAAM,GAAI,MAAA;AAAA,IACjG,OAAA;AAAA,IACA,KAAA,EAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,MAAA;AAAA,IAClC,gBAAgB,MAAA,CAAO,cAAA;AAAA,IACvB,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,mBAAmB,MAAA,CAAO,iBAAA;AAAA,IAC1B,kBAAkB,MAAA,CAAO;AAAA,GAC3B;AACF","file":"index.cjs","sourcesContent":["/**\n * Registry — one registration story for every consumer-facing extension point.\n *\n * Used for dialects, compiler strategies, realtime analytics processors,\n * and summary analytics processors. Replaces the previous hardcoded\n * `createDialectStack(overrides)`, `PRODUCTION_STRATEGIES`, and\n * `StandardAnalyticsProfile.allRealtime`/`allSummary` flat arrays with\n * one shape: a priority-ordered map keyed by `id`, with consumer-facing\n * `register` / `unregister` / `list` so a third party can extend the\n * library without forking the repository.\n *\n * The constructor seeds the registry with the built-in defaults. Built-ins\n * can still be overridden (or removed) by registering an entry with the\n * same `id` (or calling `unregister(id)`).\n *\n * @typeParam T Items must expose an `id: string` and an optional\n * `priority: number`; `list()` returns them sorted by descending\n * priority, matching the contract strategies, dialects, and\n * processors already follow.\n */\nexport class Registry<T extends { id: string; priority?: number }> {\n private items = new Map<string, T>();\n\n constructor(defaults: readonly T[] = []) {\n for (const item of defaults) {\n this.items.set(item.id, item);\n }\n }\n\n /**\n * Register an item. If an item with the same `id` already exists it is\n * replaced (mirrors \"last registration wins\" already used for dialect\n * metric merges).\n *\n * Use {@link unregister} first if you need strict rejection of duplicates.\n */\n register(item: T): void {\n this.items.set(item.id, item);\n }\n\n /** Remove the item registered under `id`. No-op if not present. */\n unregister(id: string): void {\n this.items.delete(id);\n }\n\n /** Whether an item is currently registered under `id`. */\n has(id: string): boolean {\n return this.items.has(id);\n }\n\n /**\n * Get the item registered under `id`, or `undefined` if absent.\n */\n get(id: string): T | undefined {\n return this.items.get(id);\n }\n\n /**\n * Items in descending `priority` order (highest first). Items without\n * an explicit priority are treated as priority 0.\n */\n list(): T[] {\n return [...this.items.values()].sort(\n (a, b) => (b.priority ?? 0) - (a.priority ?? 0),\n );\n }\n\n /** Number of currently registered items. */\n get size(): number {\n return this.items.size;\n }\n}\n","import { IMetric, MetricOrigin, MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\n\n/**\n * Hint helpers + canonical hint vocabulary contract.\n *\n * A \"hint\" is a dot-namespaced string (e.g. `workout.amrap`,\n * `behavior.required_timer`) that dialects, effort markdown files, and the\n * parser attach to a statement so that compiler strategies and the label\n * composer can make decisions. Hints used to live in a parallel `Set<string>`\n * channel on the statement; they now flow through the single metric channel\n * as {@link MetricType.Hint} metrics.\n *\n * Hint metrics are deliberately excluded from display resolution\n * (see ownership `legacyAdapters`) and from runtime block fragments\n * (see `BlockBuilder.setFragments`), so they never surface as visible metrics.\n *\n * ─────────────────────────────────────────────────────────────────────────────\n * CANONICAL HINT VOCABULARY (Tier 3 §3.2)\n * ─────────────────────────────────────────────────────────────────────────────\n *\n * A new dialect or effort author can self-serve the answer to \"which\n * hints are actually consumed by the runtime?\" by reading\n * {@link CONSUMED_HINTS}. Any other hint key is **analytics-only** today:\n * it reaches the output stream and processors, but does not affect\n * compilation, label generation, or exit ordering. There is no hidden\n * \"the strategy that consumes this hint\" to discover.\n *\n * Categories:\n *\n * - **compiler-consumed** — `BEHAVIOR_REPEATING_INTERVAL`,\n * `BEHAVIOR_REQUIRED_TIMER`, `BEHAVIOR_INJECT_REST`. Setting one of these\n * from a dialect (or an effort — see Tier 3 §3.3) flips a strategy-level\n * decision at compile time (e.g. IntervalLogicStrategy matches on\n * `BEHAVIOR_REPEATING_INTERVAL`).\n * - **label-consumed** — `LABEL_AMRAP`, `LABEL_EMOM`, `LABEL_TABATA`,\n * `LABEL_FOR_TIME`. These override the generated label in\n * `LabelComposer.getLogicKeyword` (the only consumer).\n * - **analytics-only / sport-domain** — every other hint a sport dialect\n * emits (e.g. `workout.run`, `ClimbMetricType.Grade`, `domain.climb.*`)\n * is intentionally analytics-only: it surfaces on the output stream\n * for processors and review-grid consumers, and never affects\n * compilation. If you write a custom analytics processor, gate it via\n * `requiredMetrics` (see `IAnalyticsProcessorDescriptor`) — not by\n * inventing a new hint.\n *\n * If you need a new compiler-consumed or label-consumed hint, add it\n * here and update the consumer(s) in the same PR. If you only need\n * analytics-only data, emit a regular `MetricType.Metric` (or a\n * domain-specific MetricType) — no new hint key required.\n */\n\n/** Hint keys currently consumed by compiler strategies or the label composer. */\nexport const CONSUMED_HINTS = {\n /** IntervalLogicStrategy: treats the block as an EMOM-style repeating interval. */\n REPEATING_INTERVAL: 'behavior.repeating_interval',\n /** GenericTimerStrategy: block cannot be skipped past until timer:complete fires. */\n REQUIRED_TIMER: 'behavior.required_timer',\n /** GenericTimerStrategy: injects a rest block between repeating intervals. */\n INJECT_REST: 'behavior.inject_rest',\n /** LabelComposer: overrides the generated label with a workout-type name. */\n LABEL_AMRAP: 'workout.amrap',\n LABEL_EMOM: 'workout.emom',\n LABEL_TABATA: 'workout.tabata',\n LABEL_FOR_TIME: 'workout.for_time',\n} as const;\n\n/** Derived from CONSUMED_HINTS — useful for runtime validation (\"is this hint consumed?\"). */\nexport const CONSUMED_HINT_KEYS: readonly string[] = Object.values(CONSUMED_HINTS);\n\n/** A read surface that exposes metrics, via `rawMetrics` or a `metrics` field. */\ninterface MetricBearing {\n rawMetrics?: IMetric[];\n metrics?: MetricContainer | IMetric[];\n}\n\n/** Resolve a flat metric list from any metric-bearing source. */\nfunction metricsOf(source: MetricBearing | undefined): IMetric[] {\n if (!source) return [];\n if (Array.isArray(source.rawMetrics)) return source.rawMetrics;\n const m = source.metrics;\n if (!m) return [];\n if (Array.isArray(m)) return m;\n // MetricContainer exposes a rawMetrics getter.\n return m.rawMetrics ?? [];\n}\n\n/** Create a single hint metric. */\nexport function hintMetric(hint: string, origin: MetricOrigin = 'dialect'): IMetric {\n return { type: MetricType.Hint, value: hint, image: hint, origin };\n}\n\n/**\n * Build (or extend) a {@link MetricContainer} of hint metrics from a list of\n * hint strings. Duplicate hint strings are collapsed.\n */\nexport function hintsToContainer(\n hints: readonly string[],\n existing?: MetricContainer,\n origin: MetricOrigin = 'dialect',\n): MetricContainer {\n const container = existing ?? MetricContainer.empty('dialect');\n const seen = new Set(getHints(container));\n for (const hint of hints) {\n if (seen.has(hint)) continue;\n seen.add(hint);\n container.add(hintMetric(hint, origin));\n }\n return container;\n}\n\n/** All hint strings carried by a metric-bearing source. */\nexport function getHints(source: MetricBearing | undefined): string[] {\n return metricsOf(source)\n .filter(m => m.type === MetricType.Hint && typeof m.value === 'string')\n .map(m => m.value as string);\n}\n\n/** Whether a metric-bearing source carries a given hint. */\nexport function hasHint(source: MetricBearing | undefined, hint: string): boolean {\n return metricsOf(source).some(m => m.type === MetricType.Hint && m.value === hint);\n}\n","/**\n * Unit Registry — the core catalog of measurement units.\n *\n * Units are NOT a parser concept. The parser emits bare Number and Text; a\n * {@link UnitSet} (imported by a Dialect) identifies which text tokens are units\n * and what {@link Dimension} they measure. See CONTEXT.md → \"Units of measurement\".\n *\n * This module is pure data + lookup. It has no dependency on metric classes,\n * the parser, or dialects — those import from here, never the reverse.\n */\n\n/** The physical quantity a {@link UnitDef} measures. */\nexport type Dimension = 'length' | 'mass' | 'energy' | 'count' | 'time';\n\n/** A single recognized unit: its canonical spelling, dimension, and aliases. */\nexport interface UnitDef {\n /** Canonical, normalized spelling (e.g. `m`, `kg`, `cal`). */\n readonly canonical: string;\n /** What the unit measures. */\n readonly dimension: Dimension;\n /** Alternate spellings / acronyms (e.g. `lb` ← `lbs`, `pound`, `pounds`). */\n readonly aliases: readonly string[];\n}\n\n/** Result of peeling a leading unit token off raw text. */\nexport interface UnitMatch {\n /** The matched canonical unit definition. */\n readonly unit: UnitDef;\n /** The exact token as it appeared in the source (e.g. `miles`). */\n readonly token: string;\n /** Remaining text after the consumed unit token (whitespace-trimmed). */\n readonly rest: string;\n}\n\nconst LEADING_WORD = /^([a-zA-Z]+)([\\s\\S]*)$/;\n\n/**\n * An importable, composable set of {@link UnitDef}s.\n *\n * Lookups are case-insensitive across canonical spellings and aliases. Sets\n * compose with {@link extend}: on a token collision the later definition wins,\n * which is how a Dialect overrides a base unit.\n */\nexport class UnitSet {\n /** Definitions in priority order (later entries override earlier on token collision). */\n private readonly defs: readonly UnitDef[];\n private readonly byToken: Map<string, UnitDef>;\n\n constructor(defs: readonly UnitDef[] = []) {\n this.defs = defs;\n this.byToken = new Map();\n // Iterate in order so later defs overwrite earlier ones (override semantics).\n for (const def of defs) {\n this.byToken.set(def.canonical.toLowerCase(), def);\n for (const alias of def.aliases) {\n this.byToken.set(alias.toLowerCase(), def);\n }\n }\n }\n\n /** Look up a unit by canonical spelling or alias (case-insensitive). */\n get(token: string): UnitDef | undefined {\n return this.byToken.get(token.trim().toLowerCase());\n }\n\n /** Whether the token is a recognized unit (canonical or alias). */\n has(token: string): boolean {\n return this.byToken.has(token.trim().toLowerCase());\n }\n\n /**\n * Peel a leading unit token off the front of `text`.\n *\n * Returns `null` when the first whitespace/letter-delimited word is not a\n * recognized unit — this is what keeps `5 Burpees` from ever fusing while\n * `4 mile Run` → `{ unit: mile, rest: \"Run\" }`.\n */\n consumeLeading(text: string): UnitMatch | null {\n const m = LEADING_WORD.exec(text.trimStart());\n if (!m) return null;\n const token = m[1];\n const unit = this.get(token);\n if (!unit) return null;\n return { unit, token, rest: m[2].trim() };\n }\n\n /**\n * Compose into a new set. Later units override earlier ones on token\n * collision — the mechanism a Dialect uses to add or redefine units.\n */\n extend(...units: UnitDef[]): UnitSet {\n return new UnitSet([...this.defs, ...units]);\n }\n\n /** All definitions in priority order. */\n toArray(): UnitDef[] {\n return [...this.defs];\n }\n}\n\n/**\n * The base catalog applied at the bottom of the Dialect Stack. Sport and\n * personal dialects extend or override these via {@link UnitSet.extend}.\n */\nexport const STANDARD_UNITS: readonly UnitDef[] = [\n // length\n { canonical: 'm', dimension: 'length', aliases: ['meter', 'meters', 'metre', 'metres'] },\n { canonical: 'km', dimension: 'length', aliases: ['kilometer', 'kilometers', 'kilometre', 'kilometres'] },\n { canonical: 'cm', dimension: 'length', aliases: ['centimeter', 'centimeters', 'centimetre', 'centimetres'] },\n { canonical: 'mm', dimension: 'length', aliases: ['millimeter', 'millimeters', 'millimetre', 'millimetres'] },\n { canonical: 'ft', dimension: 'length', aliases: ['foot', 'feet'] },\n { canonical: 'in', dimension: 'length', aliases: ['inch', 'inches'] },\n { canonical: 'yd', dimension: 'length', aliases: ['yard', 'yards'] },\n { canonical: 'mi', dimension: 'length', aliases: ['mile', 'miles'] },\n\n // mass\n { canonical: 'kg', dimension: 'mass', aliases: ['kilo', 'kilos', 'kilogram', 'kilograms'] },\n { canonical: 'g', dimension: 'mass', aliases: ['gram', 'grams'] },\n { canonical: 'lb', dimension: 'mass', aliases: ['lbs', 'pound', 'pounds'] },\n { canonical: 'bw', dimension: 'mass', aliases: ['bodyweight'] },\n\n // energy\n { canonical: 'cal', dimension: 'energy', aliases: ['cals', 'calorie', 'calories'] },\n { canonical: 'kcal', dimension: 'energy', aliases: ['kcals', 'kilocalorie', 'kilocalories'] },\n];\n\n/**\n * Factory for {@link UnitSet}s. `standard()` is the base catalog; `of()` builds\n * a custom set a Dialect can stack on top.\n */\nexport const UnitRegistry = {\n /** The base catalog used by the base Units Dialect. */\n standard(): UnitSet {\n return new UnitSet(STANDARD_UNITS);\n },\n /** Build a set from arbitrary definitions. */\n of(units: readonly UnitDef[]): UnitSet {\n return new UnitSet(units);\n },\n};\n","/**\n * Canonical time formatting utilities\n * Consolidates 15+ inline formatter implementations across the codebase\n * \n * All formatters handle edge cases: null, undefined, negative numbers, non-finite values\n */\n\n/**\n * Formats milliseconds to MM:SS format\n * e.g., 65432 → \"01:05\" (~65 seconds)\n */\nexport const formatTimeMMSS = (ms: number): string => {\n if (ms === undefined || ms === null || !Number.isFinite(ms)) {\n return '--:--';\n }\n const isNegative = ms < 0;\n const absMs = Math.abs(ms);\n const totalSeconds = Math.floor(absMs / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n const sign = isNegative ? '-' : '';\n return `${sign}${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n};\n\n/**\n * Formats milliseconds to HH:MM:SS format\n * e.g., 3665432 → \"01:01:05\" (~1 hour, 1 minute, 5 seconds)\n */\nexport const formatTimeHHMMSS = (ms: number): string => {\n if (ms === undefined || ms === null || !Number.isFinite(ms)) {\n return '--:--:--';\n }\n const isNegative = ms < 0;\n const absMs = Math.abs(ms);\n const totalSeconds = Math.floor(absMs / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const sign = isNegative ? '-' : '';\n return `${sign}${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n};\n\n/**\n * Formats milliseconds to MM:SS.ms format (with centisecond precision)\n * e.g., 65432 → \"01:05.43\" (~65.4 seconds)\n */\nexport const formatTimePrecise = (ms: number): string => {\n if (ms === undefined || ms === null || !Number.isFinite(ms)) {\n return '--:--.--';\n }\n const isNegative = ms < 0;\n const absMs = Math.abs(ms);\n const totalSeconds = Math.floor(absMs / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n const centiseconds = Math.floor((absMs % 1000) / 10);\n const sign = isNegative ? '-' : '';\n return `${sign}${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${centiseconds.toString().padStart(2, '0')}`;\n};\n\n/**\n * Formats seconds to MM:SS format\n * NOTE: Input is SECONDS, not milliseconds (unlike the ms variants above)\n * e.g., 65 → \"01:05\"\n * \n * Use this ONLY for callers that have seconds-based time values\n */\nexport const formatSecondsMMSS = (seconds: number): string => {\n if (seconds === undefined || seconds === null || !Number.isFinite(seconds)) {\n return '--:--';\n }\n const isNegative = seconds < 0;\n const absSeconds = Math.abs(seconds);\n const mins = Math.floor(absSeconds / 60);\n const secs = Math.floor(absSeconds % 60);\n const sign = isNegative ? '-' : '';\n return `${sign}${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n};\n\n/**\n * Formats seconds to HH:MM:SS format\n * NOTE: Input is SECONDS, not milliseconds\n * e.g., 3665 → \"01:01:05\"\n */\nexport const formatSecondsHHMMSS = (seconds: number): string => {\n if (seconds === undefined || seconds === null || !Number.isFinite(seconds)) {\n return '--:--:--';\n }\n const isNegative = seconds < 0;\n const absSeconds = Math.abs(seconds);\n const hours = Math.floor(absSeconds / 3600);\n const mins = Math.floor((absSeconds % 3600) / 60);\n const secs = Math.floor(absSeconds % 60);\n const sign = isNegative ? '-' : '';\n return `${sign}${hours.toString().padStart(2, '0')}:${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n};\n\n/**\n * Smart duration formatter: chooses MM:SS or HH:MM:SS based on total duration\n * If duration >= 1 hour: returns HH:MM:SS, else MM:SS\n * Input: milliseconds\n */\nexport const formatDurationSmart = (ms: number): string => {\n if (ms === undefined || ms === null || !Number.isFinite(ms)) {\n return '--:--';\n }\n const absMs = Math.abs(ms);\n const totalSeconds = Math.floor(absMs / 1000);\n if (totalSeconds >= 3600) {\n return formatTimeHHMMSS(ms);\n }\n return formatTimeMMSS(ms);\n};\n\n/**\n * Compact duration format: M:SS.m or MM:SS depending on magnitude\n * e.g., 5432 → \"5:43\", 65432 → \"01:05\"\n * Input: milliseconds\n * \n * Use this only for space-constrained UIs\n */\nexport const formatDurationCompact = (ms: number): string => {\n if (ms === undefined || ms === null || !Number.isFinite(ms)) {\n return '--:--';\n }\n const absMs = Math.abs(ms);\n const totalSeconds = Math.floor(absMs / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n \n // If minutes < 10, use compact format without leading zero\n if (minutes < 10) {\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n }\n \n // Otherwise use standard MM:SS\n return formatTimeMMSS(ms);\n};\n\n/**\n * Formats a timestamp (Date or number) into HH:MM:SS format\n * e.g., new Date('2024-01-01T12:34:56Z') → \"12:34:56\"\n * Returns 'running' if date is undefined.\n */\nexport const formatTimestamp = (date?: Date | number): string => {\n if (!date) return 'running';\n const dateObj = typeof date === 'number' ? new Date(date) : date;\n return dateObj.toLocaleTimeString('en-US', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit'\n });\n};\n","import { type IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\nimport { formatDurationSmart } from '../../utils/formatTime';\nimport type { MetricPresentationSurface } from './types';\n\n/** Metric types whose numeric value represents milliseconds. */\nconst TIME_LIKE_TYPES = new Set<string>([\n MetricType.Duration,\n MetricType.Time,\n MetricType.Elapsed,\n MetricType.Total,\n]);\n\nexport function isTimeLikeMetric(type: MetricType | string): boolean {\n return TIME_LIKE_TYPES.has(type as string);\n}\n\n/** Convert an IMetric value/image pair to a usable base string. */\nfunction baseText(metric: IMetric): string {\n if (metric.image) return metric.image;\n if (metric.value === undefined || metric.value === null) return metric.type;\n if (typeof metric.value === 'object') {\n const v = metric.value as Record<string, unknown>;\n if ('text' in v) return String(v.text);\n if ('current' in v) return `Round ${v.current}`;\n return JSON.stringify(metric.value);\n }\n return String(metric.value);\n}\n\n/**\n * Compute the display label for a metric on a given surface.\n * All per-type formatting rules live here — nowhere else.\n */\nexport function computeLabel(metric: IMetric, _surface: MetricPresentationSurface): string {\n // Time-based: format ms value with smart HH:MM or MM:SS\n if (isTimeLikeMetric(metric.type) && typeof metric.value === 'number') {\n return formatDurationSmart(metric.value);\n }\n\n const base = baseText(metric);\n\n // Rounds: append \"Round\" / \"Rounds\" suffix when base is a bare number (UX-03)\n if (metric.type === MetricType.Rounds || (metric.type as string) === 'rounds') {\n const trimmed = base.trim();\n if (/^\\d+$/.test(trimmed)) {\n const n = Number(trimmed);\n return `${base} ${n === 1 ? 'Round' : 'Rounds'}`;\n }\n }\n\n return base;\n}\n\n/**\n * Build a tooltip string for a metric — identical to the existing buildTooltip\n * in MetricPill so callers can migrate without losing fidelity.\n */\nexport function buildTooltip(metric: IMetric): string {\n const parts: string[] = [];\n parts.push(`Type: ${metric.type}`);\n if (metric.value !== undefined) parts.push(`Value: ${metric.value}`);\n if (metric.origin) parts.push(`Origin: ${metric.origin}`);\n if (metric.sourceBlockKey) parts.push(`Block: ${metric.sourceBlockKey}`);\n if (metric.timestamp) parts.push(`Time: ${metric.timestamp.toISOString()}`);\n return parts.join('\\n');\n}\n\n/**\n * Canonical column labels for the review grid.\n * Replaces METRIC_LABELS in GridHeader.tsx.\n */\nconst COLUMN_LABEL_MAP: Partial<Record<string, string>> = {\n duration: 'Duration',\n rep: 'Reps',\n effort: 'Effort',\n distance: 'Distance',\n rounds: 'Rounds',\n resistance: 'Resistance',\n action: 'Action',\n increment: 'Increment',\n metric: 'Metric',\n label: 'Label',\n text: 'Text',\n custom: 'Custom',\n calculated: 'Calculated',\n 'current-round': 'Current Round',\n volume: 'Volume',\n intensity: 'Intensity',\n load: 'Load',\n work: 'Work',\n lap: 'Lap',\n group: 'Group',\n time: 'Time',\n elapsed: 'Elapsed',\n total: 'Total',\n 'system-time': 'System Time',\n spans: 'Spans',\n system: 'System',\n rir: 'RIR',\n 'session-rpe': 'Session RPE',\n 'session-load': 'Session Load',\n 'met-score': 'MET Score',\n tis: 'TIS',\n sound: 'Sound',\n};\n\nexport function humanizeMetricKey(value: string): string {\n const spaced = value\n .replace(/[_-]+/g, ' ')\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .trim();\n\n if (spaced.length === 0) return '';\n\n return spaced\n .split(/\\s+/)\n .map((word) => {\n if (word === word.toUpperCase()) return word;\n if (/^[A-Z]{2,}$/.test(word)) return word;\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join(' ');\n}\n\nexport function computeColumnLabel(type: MetricType | string): string {\n const key = String(type).trim();\n const normalized = key.toLowerCase();\n return COLUMN_LABEL_MAP[normalized] ?? humanizeMetricKey(key);\n}\n","import { type IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\nimport type {\n IMetricPresentationPolicy,\n MetricPresentationSurface,\n MetricPresentationToken,\n MetricRenderKind,\n MetricTone,\n} from './types';\nimport { computeLabel, computeColumnLabel, buildTooltip } from './labelFormatting';\n\n// ─── helpers ────────────────────────────────────────────────────────────────\n\nfunction isRestMetric(metric: IMetric): boolean {\n const t = (metric.type as string).toLowerCase();\n if (t !== 'effort') return false;\n const v = (metric.value as string | undefined) ?? metric.image ?? '';\n return v.trim().toLowerCase() === 'rest';\n}\n\nfunction computeTone(metric: IMetric, rest: boolean): MetricTone {\n if (rest) return 'rest';\n const t = (metric.type as string).toLowerCase();\n const toneMap: Record<string, MetricTone> = {\n time: 'time', duration: 'time', elapsed: 'time', total: 'time', spans: 'time',\n rep: 'rep',\n effort: 'effort',\n distance: 'distance',\n rounds: 'rounds', increment: 'rounds', 'current-round': 'rounds',\n action: 'action',\n resistance: 'resistance',\n text: 'muted', label: 'muted', group: 'muted', lap: 'muted',\n system: 'system', 'system-time': 'system',\n volume: 'rep', intensity: 'effort', load: 'resistance', work: 'effort',\n rir: 'effort', 'session-rpe': 'effort', 'session-load': 'resistance',\n 'met-score': 'distance', tis: 'action', sound: 'system', metric: 'effort',\n custom: 'muted', calculated: 'effort',\n };\n return toneMap[t] ?? 'unknown';\n}\n\n// ─── factory ────────────────────────────────────────────────────────────────\n\nfunction createPolicy(): IMetricPresentationPolicy {\n const policy: IMetricPresentationPolicy = {\n\n isStructural(metric: IMetric): boolean {\n const t = metric.type as string;\n if (t === MetricType.Group || t === 'group') {\n const img = metric.image ?? '';\n return img === '+' || img === '-';\n }\n return t === MetricType.Lap || t === 'lap';\n },\n\n isHidden(metric: IMetric, surface: MetricPresentationSurface): boolean {\n if (this.isStructural(metric)) {\n return surface !== 'debug';\n }\n const t = metric.type as string;\n // Sound never shows in non-debug surfaces\n if ((t === MetricType.Sound || t === 'sound') && surface !== 'debug') return true;\n // review-grid-column suppresses combined time columns and system metrics\n if (surface === 'review-grid-column') {\n if (\n t === MetricType.Elapsed || t === 'elapsed' ||\n t === MetricType.Total || t === 'total'\n ) return true;\n if (t === MetricType.System || t === 'system') return true;\n }\n return false;\n },\n\n present(metric: IMetric, surface: MetricPresentationSurface): MetricPresentationToken {\n const structural = this.isStructural(metric);\n const hidden = this.isHidden(metric, surface);\n const rest = isRestMetric(metric);\n const comment = (metric.type === MetricType.Text || metric.type === 'text')\n && metric.origin === 'parser';\n const userEntered = metric.origin === 'user';\n\n let renderKind: MetricRenderKind;\n if (hidden) {\n renderKind = 'hidden';\n } else if (comment) {\n renderKind = 'comment';\n } else if (\n surface === 'timer-subtitle' ||\n surface === 'history-label' ||\n surface === 'label-composer'\n ) {\n renderKind = 'plain-text';\n } else if (surface === 'review-grid-column') {\n renderKind = 'column-heading';\n } else {\n renderKind = 'badge';\n }\n\n return {\n metric,\n label: computeLabel(metric, surface),\n tooltip: buildTooltip(metric),\n renderKind,\n tone: computeTone(metric, rest),\n iconKey: rest ? 'rest' : (metric.type as string),\n visible: !hidden,\n structural,\n rest,\n comment,\n userEntered,\n columnLabel: computeColumnLabel(metric.type),\n };\n },\n\n presentGroup(\n metrics: readonly IMetric[],\n surface: MetricPresentationSurface,\n ): MetricPresentationToken[] {\n return metrics.map(m => this.present(m, surface));\n },\n\n columnLabel(type: MetricType | string): string {\n return computeColumnLabel(type);\n },\n };\n\n return policy;\n}\n\n/**\n * Singleton policy instance for app code.\n * Use `createMetricPresentationPolicy()` in tests for isolated instances.\n */\nexport const metricPresentation = createPolicy();\n\nexport { createPolicy as createMetricPresentationPolicy };\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\n\nexport class EffortMetric implements IMetric {\n readonly value: string;\n readonly image: string;\n readonly origin: MetricOrigin = 'parser';\n\n constructor(public effort: string) {\n this.value = effort;\n this.image = effort;\n }\n readonly type = MetricType.Effort;\n}\n\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\n\nexport class DistanceMetric implements IMetric {\n readonly value: { amount: number | undefined, unit: string };\n readonly image: string;\n readonly origin: MetricOrigin;\n\n constructor(value: number | undefined, public unit: string) {\n this.value = { amount: value, unit: unit };\n this.image = value !== undefined ? `${value} ${unit}` : `? ${unit}`;\n // If value is undefined, this is a collectible metric hinted from user input\n this.origin = value === undefined ? 'hinted' : 'parser';\n }\n readonly type = MetricType.Distance;\n} \n\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\n\nexport class ResistanceMetric implements IMetric {\n readonly value: { amount: number | undefined, unit: string };\n readonly image: string;\n readonly origin: MetricOrigin;\n\n constructor(value: number | undefined, public unit: string) {\n this.value = { amount: value, unit: unit };\n this.image = value !== undefined ? `${value} ${unit}` : `? ${unit}`;\n // If value is undefined, this is a collectible metric hinted from user input\n this.origin = value === undefined ? 'hinted' : 'parser';\n }\n readonly type = MetricType.Resistance;\n} \n\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\nimport { Dimension } from '../../../metrics/units';\n\n/**\n * A dimensioned measurement that has no dedicated metric class (e.g. energy\n * `cal`, time `min`). Length and mass fuse into DistanceMetric / ResistanceMetric;\n * every other {@link Dimension} fuses into this generic carrier so the value and\n * unit are preserved for analytics.\n */\nexport class MeasuredMetric implements IMetric {\n readonly value: { amount: number | undefined; unit: string };\n readonly image: string;\n readonly origin: MetricOrigin;\n readonly type: MetricType | string;\n\n constructor(\n amount: number | undefined,\n public unit: string,\n public dimension: Dimension,\n ) {\n this.value = { amount, unit };\n this.image = amount !== undefined ? `${amount} ${unit}` : `? ${unit}`;\n this.origin = amount === undefined ? 'hinted' : 'parser';\n // Energy gets a stable string type so analytics can find calories; other\n // dimensions fall back to the generic Custom bucket.\n this.type = dimension === 'energy' ? 'energy' : MetricType.Custom;\n }\n}\n","import type { Dimension } from '../../../metrics/units';\nimport { DistanceMetric } from './DistanceMetric';\nimport { ResistanceMetric } from './ResistanceMetric';\nimport { MeasuredMetric } from './MeasuredMetric';\nimport type { IMetric } from '@bitcobblers/wod-wiki-core';\n\n/**\n * EMPTY_UNIT — the @N empty-unit sentinel.\n *\n * The parser emits a bare number with `@` (e.g. `@5`) as a `ResistanceMetric`\n * whose unit slot is this empty string; the base Units Dialect later fills\n * it (e.g. `@5 kg` → `ResistanceMetric(5, 'kg')`). ClimbDialect also reads the\n * sentinel to detect climb attempt counts. S5c gives the sentinel one named\n * home so the three sites (emit, fuse, read) reference the same constant\n * rather than a duplicated empty-string literal.\n */\nexport const EMPTY_UNIT = '';\n\n/**\n * Dimension → metric class mapping — the single home for \"what is a length\n * at runtime.\"\n *\n * Length and mass map to their dedicated classes (analytics depends on them);\n * every other dimension uses the generic {@link MeasuredMetric}. The stored\n * unit is the token *as written* (`miles`), not the canonical spelling, to\n * preserve display fidelity.\n *\n * This used to live inside `fuseUnits.metricForUnit` (the caller + the\n * mapping co-located); S5c co-locates the mapping with the metric classes it\n * instantiates, so adding a new dimension→metric pair is a one-file change\n * next to the classes themselves.\n */\nexport function metricForDimension(\n amount: number | undefined,\n token: string,\n dimension: Dimension,\n): IMetric {\n switch (dimension) {\n case 'length':\n return new DistanceMetric(amount, token);\n case 'mass':\n return new ResistanceMetric(amount, token);\n default:\n return new MeasuredMetric(amount, token, dimension);\n }\n}\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\n\n/**\n * ChoiceGroupMetric — a pipe-separated OR expression preserved for pre-run resolution.\n *\n * Emitted by Fusion (`fuseUnits`) when a slash/pipe separates two or more homogeneous\n * alternatives of the **same** MetricType (e.g. `185/125 lb` → two Resistance options;\n * `Run | Walk` → two Effort options). Separator between *different* MetricTypes is\n * silently dropped — no ChoiceGroupMetric is emitted.\n *\n * ## Lifecycle\n * 1. `fuseUnits` emits one ChoiceGroupMetric per homogeneous slash/pipe group, at origin `parser`.\n * 2. The Pre-Run Wizard finds it via `useCollectionMetrics` (scans for `MetricType.Choice`).\n * 3. The first alternative is pre-selected; the user may change it.\n * 4. On \"Start Workout\", the selected alternative replaces this Choice group in\n * the same Statement's MetricContainer at origin `user-plan`.\n * 5. The runtime/compiler must not consume `MetricType.Choice`; any non-wizard\n * entry point defaults unresolved choices before runtime creation.\n */\nexport class ChoiceGroupMetric implements IMetric {\n readonly type = MetricType.Choice;\n readonly origin: MetricOrigin = 'parser';\n readonly value: { alternatives: IMetric[] };\n readonly image: string;\n\n constructor(public readonly alternatives: IMetric[]) {\n this.value = { alternatives };\n this.image = alternatives.map(m => m.image ?? String(m.value ?? '')).join(' | ');\n }\n}\n","import { IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { UnitSet } from '../../metrics/units';\nimport { EffortMetric } from \"../../runtime/compiler/metrics/EffortMetric\";\nimport { metricForDimension, EMPTY_UNIT } from \"../../runtime/compiler/metrics/dimensionFactory\";\n\nimport { ChoiceGroupMetric } from \"../../runtime/compiler/metrics/ChoiceGroupMetric\";\n\n/** Source location carried alongside a metric (the parser's SyntaxMeta, which\n * includes `raw`). Optional because the pure helper is used meta-less in tests. */\ntype Meta = {\n line?: number;\n startOffset?: number;\n endOffset?: number;\n columnStart?: number;\n columnEnd?: number;\n length?: number;\n raw?: string;\n} | undefined;\n\ninterface MetaPair {\n metric: IMetric;\n meta: Meta;\n}\n\n\nfunction isBareNumber(m: IMetric): boolean {\n // RepMetric carries a number, or `undefined` for a collectible `?` quantity.\n return m.type === MetricType.Rep && (typeof m.value === 'number' || m.value === undefined);\n}\n\n/** Whether a metric is the bare \"/\" separator (reclassified as an effort primitive). */\nfunction isSlashSeparator(m: IMetric): boolean {\n return m.type === MetricType.Effort && (typeof m.value === 'string' ? m.value : m.image) === '/';\n}\n\n/** Whether a metric is the bare \"|\" separator (reclassified as an effort primitive). */\nfunction isPipeSeparator(m: IMetric): boolean {\n return m.type === MetricType.Effort && (typeof m.value === 'string' ? m.value : m.image) === '|';\n}\n\nfunction effortText(m: IMetric): string | null {\n if (m.type !== MetricType.Effort && m.type !== MetricType.Text) return null;\n if (typeof m.value === 'string') return m.value;\n return typeof m.image === 'string' ? m.image : null;\n}\n\n/** Whether a metric is a Distance/Resistance whose unit slot is still empty. */\nfunction hasEmptyUnit(m: IMetric): boolean {\n if (m.type !== MetricType.Distance && m.type !== MetricType.Resistance) return false;\n const v = m.value as { amount?: number; unit?: string } | undefined;\n return !!v && v.amount !== undefined && (!v.unit || v.unit === EMPTY_UNIT);\n}\n\n/** Meta spanning the number metric through the consumed unit token. */\nfunction fusedMeta(numberMeta: Meta, effortMeta: Meta, token: string): Meta {\n if (!numberMeta || !effortMeta) return numberMeta ?? effortMeta;\n const startOffset = numberMeta.startOffset;\n const tokenEnd = (effortMeta.startOffset ?? 0) + token.length;\n const gap = (effortMeta.startOffset ?? 0) - (numberMeta.endOffset ?? 0);\n const raw =\n numberMeta.raw !== undefined\n ? numberMeta.raw + ' '.repeat(Math.max(0, gap)) + token\n : undefined;\n const length = startOffset !== undefined ? tokenEnd - startOffset : undefined;\n return {\n line: numberMeta.line,\n startOffset,\n endOffset: tokenEnd,\n columnStart: numberMeta.columnStart,\n columnEnd: numberMeta.columnStart !== undefined && length !== undefined\n ? numberMeta.columnStart + length\n : numberMeta.columnEnd,\n length,\n raw,\n };\n}\n\n/** Meta for the residual effort text left after the unit token is peeled. */\nfunction residualMeta(effortMeta: Meta, rest: string): Meta {\n if (!effortMeta || effortMeta.raw === undefined) {\n return effortMeta ? { ...effortMeta, raw: rest } : effortMeta;\n }\n const restStart = effortMeta.raw.indexOf(rest);\n const offset = restStart >= 0 ? restStart : 0;\n const startOffset = (effortMeta.startOffset ?? 0) + offset;\n return {\n line: effortMeta.line,\n startOffset,\n endOffset: effortMeta.endOffset,\n columnStart: (effortMeta.columnStart ?? 0) + offset,\n columnEnd: effortMeta.columnEnd,\n length: rest.length,\n raw: rest,\n };\n}\n/** Meta spanning from the first metric through the last metric in a group. */\nfunction spanMeta(firstMeta: Meta, lastMeta: Meta): Meta {\n if (!firstMeta || !lastMeta) return firstMeta ?? lastMeta;\n const startOffset = firstMeta.startOffset;\n const endOffset = lastMeta.endOffset;\n const length = startOffset !== undefined && endOffset !== undefined\n ? endOffset - startOffset\n : undefined;\n return {\n line: firstMeta.line,\n startOffset,\n endOffset,\n columnStart: firstMeta.columnStart,\n columnEnd: lastMeta.columnEnd,\n length,\n raw: firstMeta.raw,\n };\n}\n\n/**\n * Core fusion over metric+meta pairs. See {@link fuseUnits} for semantics.\n * Idempotent: once a unit word is consumed there is no bare Number+unit pair\n * left, so re-running is a no-op.\n */\nfunction fusePairs(pairs: MetaPair[], units: UnitSet): MetaPair[] {\n const out: MetaPair[] = [];\n\n for (let i = 0; i < pairs.length; i++) {\n const cur = pairs[i];\n const next = pairs[i + 1];\n\n // ── Slash/Pipe guard: a bare separator that no pattern consumed is silently dropped ──\n // Slash: unhandled fractions (shouldn't happen if patterns below cover all cases).\n // Pipe: heterogeneous choice (e.g. \"Run | 5\" — Effort + Rep) where no ChoiceGroup is emitted.\n if (isSlashSeparator(cur.metric) || isPipeSeparator(cur.metric)) {\n continue;\n }\n\n // ── effort|effort choice: Effort(A) Pipe Effort(B) → ChoiceGroupMetric ──────\n // Homogeneous: both sides are Effort → emit a single ChoiceGroupMetric.\n // Heterogeneous (e.g. Run|5): the pipe guard above will drop the pipe\n // when it becomes cur in the next iteration.\n if (next) {\n const curText = effortText(cur.metric);\n const thirdText = pairs[i + 2] ? effortText(pairs[i + 2].metric) : null;\n if (\n curText !== null &&\n isPipeSeparator(next.metric) &&\n thirdText !== null\n ) {\n // Collect all consecutive pipe-separated efforts into one group.\n const alternatives: IMetric[] = [cur.metric];\n let j = i + 1; // points at the PipeMetric\n while (\n j + 1 < pairs.length &&\n isPipeSeparator(pairs[j].metric) &&\n effortText(pairs[j + 1].metric) !== null\n ) {\n alternatives.push(pairs[j + 1].metric);\n j += 2;\n }\n out.push({\n metric: new ChoiceGroupMetric(alternatives),\n meta: spanMeta(cur.meta, pairs[j - 1].meta),\n });\n i = j - 1; // consume all pipe+effort pairs (for-loop does i++)\n continue;\n }\n }\n\n // ── {number}|{number} {unit} → ChoiceGroupMetric (pipe choices) ────────────\n // Detect the 4-token sequence: bareNumber Pipe bareNumber unitText\n // Both numbers fuse to the same MetricType → ChoiceGroupMetric.\n // e.g. \"185 | 125 lb\" → ChoiceGroupMetric([Resistance(185,\"lb\"), Resistance(125,\"lb\")])\n if (next && pairs[i + 2] && pairs[i + 3]) {\n const second = pairs[i + 2];\n const fourth = pairs[i + 3];\n const fusable1 = isBareNumber(cur.metric) || hasEmptyUnit(cur.metric);\n const fusable2 = isBareNumber(second.metric) || hasEmptyUnit(second.metric);\n\n if (fusable1 && isPipeSeparator(next.metric) && fusable2) {\n const text = effortText(fourth.metric);\n const match = text !== null ? units.consumeLeading(text) : null;\n if (match) {\n const amount1 = isBareNumber(cur.metric)\n ? (cur.metric.value as number | undefined)\n : (cur.metric.value as { amount?: number }).amount;\n const amount2 = isBareNumber(second.metric)\n ? (second.metric.value as number | undefined)\n : (second.metric.value as { amount?: number }).amount;\n\n const alt1 = metricForDimension(amount1, match.token, match.unit.dimension);\n const alt2 = metricForDimension(amount2, match.token, match.unit.dimension);\n\n // Homogeneous check: both alternatives must resolve to the same MetricType.\n if (alt1.type === alt2.type) {\n const choiceMeta = fusedMeta(cur.meta, fourth.meta, match.token);\n out.push({\n metric: new ChoiceGroupMetric([alt1, alt2]),\n meta: choiceMeta,\n });\n if (match.rest) {\n out.push({\n metric: new EffortMetric(match.rest),\n meta: residualMeta(fourth.meta, match.rest),\n });\n }\n i += 3; // consume Pipe, second number, unit text\n continue;\n }\n }\n }\n }\n\n // ── {number}/{number} {unit} → single decimal metric (fraction) ─────────────\n // Detect the 4-token sequence: bareNumber Slash bareNumber unitText\n // Compute fraction: numerator/denominator → single decimal metric.\n // e.g. \"1/4 mile\" → Distance(0.25, \"mile\")\n // e.g. \"1/2 pood\" → Resistance(0.5, \"pood\")\n if (next && pairs[i + 2] && pairs[i + 3]) {\n const second = pairs[i + 2];\n const fourth = pairs[i + 3];\n const fusable1 = isBareNumber(cur.metric) || hasEmptyUnit(cur.metric);\n const fusable2 = isBareNumber(second.metric) || hasEmptyUnit(second.metric);\n\n if (fusable1 && isSlashSeparator(next.metric) && fusable2) {\n const text = effortText(fourth.metric);\n const match = text !== null ? units.consumeLeading(text) : null;\n if (match) {\n const numerator = isBareNumber(cur.metric)\n ? (cur.metric.value as number | undefined)\n : (cur.metric.value as { amount?: number }).amount;\n const denominator = isBareNumber(second.metric)\n ? (second.metric.value as number | undefined)\n : (second.metric.value as { amount?: number }).amount;\n\n if (numerator !== undefined && denominator !== undefined && denominator !== 0) {\n const decimal = numerator / denominator;\n const fused = metricForDimension(decimal, match.token, match.unit.dimension);\n const fracMeta = fusedMeta(cur.meta, fourth.meta, match.token);\n out.push({\n metric: fused,\n meta: fracMeta,\n });\n if (match.rest) {\n out.push({\n metric: new EffortMetric(match.rest),\n meta: residualMeta(fourth.meta, match.rest),\n });\n }\n i += 3; // consume Slash, second number, unit text\n continue;\n }\n }\n }\n }\n\n if (next) {\n const fusable = isBareNumber(cur.metric) || hasEmptyUnit(cur.metric);\n if (fusable) {\n const text = effortText(next.metric);\n const match = text !== null ? units.consumeLeading(text) : null;\n if (match) {\n const amount = isBareNumber(cur.metric)\n ? (cur.metric.value as number | undefined)\n : (cur.metric.value as { amount?: number }).amount;\n out.push({\n metric: metricForDimension(amount, match.token, match.unit.dimension),\n meta: fusedMeta(cur.meta, next.meta, match.token),\n });\n if (match.rest) {\n out.push({\n metric: new EffortMetric(match.rest),\n meta: residualMeta(next.meta, match.rest),\n });\n }\n i++; // consume `next`\n continue;\n }\n }\n }\n\n out.push(cur);\n } // end for\n\n return out;\n}\n\n/**\n * Pure fusion over a metric array (no source metadata). Used by unit tests and\n * any caller that doesn't track `metricMeta`.\n *\n * Rep(100) + Effort(\"m Run\") → Distance(100, \"m\") + Effort(\"Run\")\n * Rep(24) + Effort(\"kg\") → Resistance(24, \"kg\")\n * Rep(5) + Effort(\"Burpees\")→ unchanged (not a unit)\n */\nexport function fuseUnitsInMetrics(metrics: IMetric[], units: UnitSet): IMetric[] {\n return fusePairs(metrics.map((metric) => ({ metric, meta: undefined })), units).map((p) => p.metric);\n}\n\n/**\n * Rewrite a statement's metric list in place, fusing number + unit pairs and\n * keeping `metricMeta` source locations in sync (the fused metric spans the\n * number through the unit token; the residual effort keeps the remainder).\n * No-op when nothing fuses. Safe to call repeatedly (idempotent).\n */\nexport function fuseUnits(statement: ICodeStatement, units: UnitSet): void {\n const before = statement.metrics.toArray();\n const pairs: MetaPair[] = before.map((metric) => ({\n metric,\n meta: statement.metricMeta?.get(metric) as Meta,\n }));\n\n const after = fusePairs(pairs, units);\n\n const changed =\n after.length !== before.length || after.some((p, idx) => p.metric !== before[idx]);\n if (!changed) return;\n\n statement.metrics.clear().add(...after.map((p) => p.metric));\n\n if (statement.metricMeta) {\n const nextMeta = new Map(statement.metricMeta);\n // Drop stale entries for replaced metrics, add entries for new ones.\n for (const m of before) if (!after.some((p) => p.metric === m)) nextMeta.delete(m);\n for (const p of after) if (p.meta) nextMeta.set(p.metric, p.meta as any);\n statement.metricMeta = nextMeta;\n }\n}\n","import { IDialect, DialectAnalysis } from '@bitcobblers/wod-wiki-core';\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { UnitRegistry, UnitSet } from '../metrics/units';\nimport { fuseUnits } from \"./units/fuseUnits\";\n\n/**\n * Base Units Dialect — the bottom of the Dialect Stack.\n *\n * The parser is unit-agnostic: it emits bare Number and Text. This dialect's\n * {@link transform} fuses adjacent Number + unit-word metrics into dimensioned\n * metrics (Distance / Resistance / energy …) using the core {@link UnitRegistry}.\n *\n * It contributes no hints — units are a rewrite, not a marker — so {@link analyze}\n * returns nothing. Sport dialects stack on top and may extend the unit set; a\n * personal-overrides dialect can sit last. Because fusion is idempotent, this\n * dialect is safe to run in both the parse pipeline and the compile-time stack.\n */\nexport class UnitsDialect implements IDialect {\n id = 'units';\n name = 'Units Dialect';\n\n private readonly units: UnitSet;\n\n /**\n * @param units the unit set to recognize. Defaults to the standard catalog;\n * pass an extended set (e.g. `UnitRegistry.standard().extend(...)`) to add\n * or override units.\n */\n constructor(units: UnitSet = UnitRegistry.standard()) {\n this.units = units;\n }\n\n transform(statement: ICodeStatement): void {\n fuseUnits(statement, this.units);\n }\n\n analyze(_statement: ICodeStatement): DialectAnalysis {\n return {};\n }\n}\n","import { IDialect, DialectAnalysis } from '@bitcobblers/wod-wiki-core';\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { hintsToContainer } from '../metrics/hints';\n\n/**\n * CrossFit dialect for recognizing CrossFit-specific workout patterns.\n * \n * Recognizes:\n * - AMRAP: \"As Many Rounds As Possible\" - time-bound workout\n * - EMOM: \"Every Minute On the Minute\" - repeating interval workout\n * - FOR TIME: Time-capped workout with completion goal\n * - TABATA: High-intensity interval protocol (20s work / 10s rest)\n */\nexport class CrossFitDialect implements IDialect {\n id = 'crossfit';\n name = 'CrossFit Dialect';\n\n /**\n * Check if any Action or Effort metrics contains a keyword (case-insensitive)\n */\n private hasKeyword(metrics: MetricContainer, keyword: string): boolean {\n return metrics.some(f =>\n (f.type === MetricType.Action || f.type === MetricType.Effort) &&\n typeof f.value === 'string' &&\n f.value.toUpperCase().includes(keyword)\n );\n }\n\n /**\n * Check if statement has children (is a parent block)\n */\n private hasChildren(statement: ICodeStatement): boolean {\n return statement.children && statement.children.length > 0;\n }\n\n analyze(statement: ICodeStatement): DialectAnalysis {\n const hints: string[] = [];\n const metrics = MetricContainer.from(statement.metrics as any);\n\n // Check for AMRAP - time-bound workout\n const isAmrap = this.hasKeyword(metrics, 'AMRAP');\n if (isAmrap) {\n hints.push('behavior.time_bound');\n hints.push('workout.amrap');\n }\n\n // Check for EMOM - repeating interval workout\n // Explicit EMOM keyword\n const isEmom = this.hasKeyword(metrics, 'EMOM');\n if (isEmom) {\n hints.push('behavior.repeating_interval');\n hints.push('workout.emom');\n }\n\n // Implicit EMOM: Rounds + Timer + Children pattern\n // e.g., \"(20) :60\" with child statements implies EMOM\n // - Rounds specify how many intervals\n // - Timer specifies interval duration (defaults to 60s if not specified)\n // - Children are executed within each interval\n if (!isEmom && !isAmrap) {\n const hasRounds = metrics.some(f => f.type === MetricType.Rounds);\n const hasTimer = metrics.some(f => f.type === MetricType.Duration);\n const hasChildStatements = this.hasChildren(statement);\n\n if (hasRounds && hasTimer && hasChildStatements) {\n hints.push('behavior.repeating_interval');\n hints.push('workout.emom');\n hints.push('workout.implicit_emom');\n }\n }\n\n // Check for FOR TIME - time-bound workout with completion goal\n if (this.hasKeyword(metrics, 'FOR TIME')) {\n hints.push('behavior.time_bound');\n hints.push('workout.for_time');\n }\n\n // Check for TABATA - high-intensity interval protocol\n if (this.hasKeyword(metrics, 'TABATA')) {\n hints.push('behavior.repeating_interval');\n hints.push('workout.tabata');\n }\n\n return { metrics: hintsToContainer(hints) };\n }\n}\n","import { IDialect, DialectAnalysis } from '@bitcobblers/wod-wiki-core';\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { hintsToContainer } from '../metrics/hints';\n\n/**\n * WOD (Workout of the Day) dialect for recognizing general structured workout patterns.\n *\n * Recognizes:\n * - STRENGTH: Heavy barbell / loaded movement blocks\n * - METCON: Metabolic conditioning blocks\n * - SKILLS: Skill/technique practice blocks\n * - WOD: Explicit \"WOD\" keyword\n * - SUPERSET: Multiple exercises grouped with no rest\n *\n * Emitted hints (dot-namespaced):\n * domain.wod - any statement processed by this dialect\n * workout.strength - heavy loaded-movement block\n * workout.metcon - metabolic conditioning block\n * workout.skills - skill/technique block\n * workout.superset - superset / paired-set block\n * behavior.load_bearing - statement involves significant external load\n */\nexport class WodDialect implements IDialect {\n id = 'wod';\n name = 'WOD Dialect';\n\n /** Case-insensitive keyword check on Action/Effort metrics */\n private hasKeyword(metrics: MetricContainer, keyword: string): boolean {\n return metrics.some(\n m =>\n (m.type === MetricType.Action || m.type === MetricType.Effort) &&\n typeof m.value === 'string' &&\n m.value.toUpperCase().includes(keyword.toUpperCase())\n );\n }\n\n analyze(statement: ICodeStatement): DialectAnalysis {\n const hints: string[] = [];\n const metrics = MetricContainer.from(statement.metrics as any);\n\n // TODO: Detect STRENGTH blocks\n // \"Strength: 5x5 Back Squat\", \"5x5 225lb Squat\" etc.\n if (this.hasKeyword(metrics, 'STRENGTH')) {\n hints.push('domain.wod');\n hints.push('workout.strength');\n hints.push('behavior.load_bearing');\n }\n\n // TODO: Detect METCON blocks\n // \"Metcon\", \"MetCon\", \"Metabolic Conditioning\"\n if (this.hasKeyword(metrics, 'METCON') || this.hasKeyword(metrics, 'METABOLIC')) {\n hints.push('domain.wod');\n hints.push('workout.metcon');\n }\n\n // TODO: Detect SKILLS blocks\n // \"Skills\", \"Skill Work\", \"Technique\"\n if (this.hasKeyword(metrics, 'SKILL') || this.hasKeyword(metrics, 'TECHNIQUE')) {\n hints.push('domain.wod');\n hints.push('workout.skills');\n }\n\n // TODO: Detect explicit WOD keyword\n if (this.hasKeyword(metrics, 'WOD')) {\n hints.push('domain.wod');\n }\n\n // TODO: Detect SUPERSET blocks\n // \"Superset\", \"A1/A2 pairing\", consecutive exercises without rest\n if (this.hasKeyword(metrics, 'SUPERSET')) {\n hints.push('domain.wod');\n hints.push('workout.superset');\n }\n\n return { metrics: hintsToContainer(hints) };\n }\n}\n","import { IDialect, DialectAnalysis } from '@bitcobblers/wod-wiki-core';\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { hintsToContainer } from '../metrics/hints';\n\n/**\n * Cardio dialect for recognizing endurance/aerobic workout patterns.\n *\n * Recognizes:\n * - RUN / JOG / SPRINT: Running activities\n * - ROW: Rowing (erg, water)\n * - BIKE / CYCLE: Cycling activities\n * - SWIM: Swimming\n * - WALK: Walking / recovery activity\n * - Distance-only statements (e.g. \"5km\", \"400m\") without explicit activity\n *\n * Emitted hints (dot-namespaced):\n * domain.cardio - any statement processed by this dialect\n * workout.run - running activity\n * workout.row - rowing activity\n * workout.bike - cycling activity\n * workout.swim - swimming activity\n * workout.walk - walking activity\n * behavior.distance_based - primary metric is distance\n * behavior.pace_based - pacing / splits are relevant\n * behavior.aerobic - sustained aerobic effort\n */\nexport class CardioDialect implements IDialect {\n id = 'cardio';\n name = 'Cardio Dialect';\n\n private hasKeyword(metrics: MetricContainer, keyword: string): boolean {\n return metrics.some(\n m =>\n (m.type === MetricType.Action || m.type === MetricType.Effort) &&\n typeof m.value === 'string' &&\n m.value.toUpperCase().includes(keyword.toUpperCase())\n );\n }\n\n private hasDistance(metrics: MetricContainer): boolean {\n return metrics.some(m => m.type === MetricType.Distance);\n }\n\n analyze(statement: ICodeStatement): DialectAnalysis {\n const hints: string[] = [];\n const metrics = MetricContainer.from(statement.metrics as any);\n\n // TODO: Detect running activities\n if (\n this.hasKeyword(metrics, 'RUN') ||\n this.hasKeyword(metrics, 'JOG') ||\n this.hasKeyword(metrics, 'SPRINT')\n ) {\n hints.push('domain.cardio');\n hints.push('workout.run');\n hints.push('behavior.aerobic');\n }\n\n // TODO: Detect rowing\n if (this.hasKeyword(metrics, 'ROW') || this.hasKeyword(metrics, 'ROWING')) {\n hints.push('domain.cardio');\n hints.push('workout.row');\n hints.push('behavior.aerobic');\n }\n\n // TODO: Detect cycling\n if (\n this.hasKeyword(metrics, 'BIKE') ||\n this.hasKeyword(metrics, 'CYCLE') ||\n this.hasKeyword(metrics, 'CYCLING')\n ) {\n hints.push('domain.cardio');\n hints.push('workout.bike');\n hints.push('behavior.aerobic');\n }\n\n // TODO: Detect swimming\n if (this.hasKeyword(metrics, 'SWIM') || this.hasKeyword(metrics, 'SWIMMING')) {\n hints.push('domain.cardio');\n hints.push('workout.swim');\n hints.push('behavior.aerobic');\n }\n\n // TODO: Detect walking\n if (this.hasKeyword(metrics, 'WALK') || this.hasKeyword(metrics, 'WALKING')) {\n hints.push('domain.cardio');\n hints.push('workout.walk');\n }\n\n // TODO: Detect distance-only statements (e.g. \"400m\", \"5km\" with no activity keyword)\n // These are generically cardio-flavoured even without an explicit activity name.\n if (hints.length === 0 && this.hasDistance(metrics)) {\n hints.push('domain.cardio');\n hints.push('behavior.distance_based');\n }\n\n // If any cardio activity was found, also tag as distance/pace relevant\n if (hints.includes('domain.cardio') && this.hasDistance(metrics)) {\n hints.push('behavior.distance_based');\n hints.push('behavior.pace_based');\n }\n\n return { metrics: hintsToContainer(hints) };\n }\n}\n","import { IDialect, DialectAnalysis } from '@bitcobblers/wod-wiki-core';\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { hintsToContainer } from '../metrics/hints';\n\n/**\n * Yoga dialect for recognizing yoga and mindfulness practice patterns.\n *\n * Recognizes:\n * - Pose holds: duration-based single poses (e.g. \"Warrior II :60\")\n * - Flows: sequences of poses (e.g. \"Sun Salutation x5\")\n * - Breathing exercises: pranayama patterns\n * - Meditation: seated/silent practice blocks\n * - Explicit pose names (a curated vocabulary of common poses)\n *\n * Emitted hints (dot-namespaced):\n * domain.yoga - any statement processed by this dialect\n * workout.pose - single pose hold\n * workout.flow - sequence / vinyasa flow\n * workout.breathing - pranayama / breathing exercise\n * workout.meditation - seated meditation block\n * behavior.hold - timed static hold\n * behavior.mindful - mindfulness / attention cue\n */\nexport class YogaDialect implements IDialect {\n id = 'yoga';\n name = 'Yoga Dialect';\n\n /**\n * Common yoga pose keywords.\n * TODO: Expand this list as the dialect matures.\n */\n private static readonly POSE_KEYWORDS = [\n 'WARRIOR', 'DOWNWARD', 'UPWARD', \"CHILD'S POSE\", 'COBRA',\n 'PIGEON', 'TRIANGLE', 'MOUNTAIN', 'TREE POSE', 'LOTUS',\n 'CORPSE', 'SAVASANA', 'TADASANA', 'VIRABHADRASANA',\n 'BALASANA', 'ADHO', 'URDHVA', 'UTTANASANA', 'VRKSASANA',\n ];\n\n private static readonly FLOW_KEYWORDS = [\n 'SUN SALUTATION', 'VINYASA', 'FLOW', 'SEQUENCE',\n ];\n\n private static readonly BREATHING_KEYWORDS = [\n 'PRANAYAMA', 'BREATH', 'BREATHING', 'NADI SHODHANA',\n 'KAPALABHATI', 'UJJAYI', 'BOX BREATH', 'WIM HOF',\n ];\n\n private static readonly MEDITATION_KEYWORDS = [\n 'MEDITATION', 'MEDITATE', 'MINDFULNESS', 'BODY SCAN',\n 'VISUALIZATION',\n ];\n\n private hasAnyKeyword(metrics: MetricContainer, keywords: string[]): boolean {\n return metrics.some(\n m =>\n (m.type === MetricType.Action ||\n m.type === MetricType.Effort ||\n m.type === MetricType.Text) &&\n typeof m.value === 'string' &&\n keywords.some(k => m.value!.toString().toUpperCase().includes(k))\n );\n }\n\n analyze(statement: ICodeStatement): DialectAnalysis {\n const hints: string[] = [];\n const metrics = MetricContainer.from(statement.metrics as any);\n const hasDuration = metrics.some(m => m.type === MetricType.Duration);\n\n // TODO: Detect individual pose holds\n if (this.hasAnyKeyword(metrics, YogaDialect.POSE_KEYWORDS)) {\n hints.push('domain.yoga');\n hints.push('workout.pose');\n if (hasDuration) {\n hints.push('behavior.hold');\n }\n }\n\n // TODO: Detect flows / sequences\n if (this.hasAnyKeyword(metrics, YogaDialect.FLOW_KEYWORDS)) {\n hints.push('domain.yoga');\n hints.push('workout.flow');\n }\n\n // TODO: Detect breathing exercises\n if (this.hasAnyKeyword(metrics, YogaDialect.BREATHING_KEYWORDS)) {\n hints.push('domain.yoga');\n hints.push('workout.breathing');\n hints.push('behavior.mindful');\n }\n\n // TODO: Detect meditation blocks\n if (this.hasAnyKeyword(metrics, YogaDialect.MEDITATION_KEYWORDS)) {\n hints.push('domain.yoga');\n hints.push('workout.meditation');\n hints.push('behavior.mindful');\n }\n\n return { metrics: hintsToContainer(hints) };\n }\n}\n","import { IDialect, DialectAnalysis } from '@bitcobblers/wod-wiki-core';\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { hintsToContainer } from '../metrics/hints';\n\n/**\n * Habits dialect for tracking daily/recurring habit completions.\n *\n * Recognizes:\n * - Daily habits: single-completion items logged once per day\n * - Recurring habits: timed or rep-counted recurring actions\n * - Streaks: consecutive day tracking\n * - Check-off items: boolean \"did I do this?\" entries\n *\n * Emitted hints (dot-namespaced):\n * domain.habits - any statement processed by this dialect\n * behavior.daily - once-a-day completion\n * behavior.completable - boolean done/not-done state\n * behavior.streak - streak-relevant (consecutive occurrences matter)\n * behavior.recurring - repeats on a schedule\n * workout.habit_check - single check-off habit\n * workout.habit_timed - habit with a target duration (e.g. \"Meditate :10:00\")\n * workout.habit_rep - habit with a target count (e.g. \"10 Pushups daily\")\n */\nexport class HabitsDialect implements IDialect {\n id = 'habits';\n name = 'Habits Dialect';\n\n /**\n * Keywords that indicate a habit/daily-tracking context.\n * TODO: Expand as habit vocabulary is refined.\n */\n private static readonly HABIT_KEYWORDS = [\n 'DAILY', 'HABIT', 'STREAK', 'CHECK', 'LOG',\n 'MORNING', 'EVENING', 'ROUTINE',\n ];\n\n private static readonly STREAK_KEYWORDS = [\n 'STREAK', 'CONSECUTIVE', 'IN A ROW',\n ];\n\n private hasAnyKeyword(metrics: MetricContainer, keywords: string[]): boolean {\n return metrics.some(\n m =>\n (m.type === MetricType.Action ||\n m.type === MetricType.Effort ||\n m.type === MetricType.Text ||\n m.type === MetricType.Label) &&\n typeof m.value === 'string' &&\n keywords.some(k => m.value!.toString().toUpperCase().includes(k))\n );\n }\n\n analyze(statement: ICodeStatement): DialectAnalysis {\n const hints: string[] = [];\n const metrics = MetricContainer.from(statement.metrics as any);\n\n const hasDuration = metrics.some(m => m.type === MetricType.Duration);\n const hasReps = metrics.some(m => m.type === MetricType.Rep);\n const isHabit = this.hasAnyKeyword(metrics, HabitsDialect.HABIT_KEYWORDS);\n\n // TODO: Detect habit-flavoured statements\n if (isHabit) {\n hints.push('domain.habits');\n hints.push('behavior.completable');\n\n if (hasDuration) {\n // e.g. \"Meditate :10:00 daily\"\n hints.push('workout.habit_timed');\n } else if (hasReps) {\n // e.g. \"10 Pushups daily\"\n hints.push('workout.habit_rep');\n } else {\n // e.g. \"Morning journaling\"\n hints.push('workout.habit_check');\n hints.push('behavior.daily');\n }\n }\n\n // TODO: Detect streak tracking\n if (this.hasAnyKeyword(metrics, HabitsDialect.STREAK_KEYWORDS)) {\n if (!hints.includes('domain.habits')) hints.push('domain.habits');\n hints.push('behavior.streak');\n hints.push('behavior.recurring');\n }\n\n return { metrics: hintsToContainer(hints) };\n }\n}\n","import { IDialect, DialectAnalysis } from '@bitcobblers/wod-wiki-core';\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { hintsToContainer } from '../metrics/hints';\nimport { EMPTY_UNIT } from \"../runtime/compiler/metrics/dimensionFactory\";\nexport const ClimbMetricType = {\n Discipline: 'climb-discipline',\n Grade: 'climb-grade',\n SendType: 'climb-send-type',\n AttemptCount: 'climb-attempt-count',\n RouteName: 'climb-route-name',\n HighPoint: 'climb-high-point',\n} as const;\n\nexport type ClimbGradeSystem =\n | 'v-scale'\n | 'font'\n | 'yds'\n | 'french'\n | 'uiaa'\n | 'ewbank'\n | 'british'\n | 'dankyu'\n | 'unknown';\n\nexport interface ClimbGradeMetricValue {\n raw: string;\n system: ClimbGradeSystem;\n normalizedRank?: number;\n}\n\ntype SendType =\n | 'onsight'\n | 'flash'\n | 'redpoint'\n | 'repeat'\n | 'dogged'\n | 'top-rope'\n | 'did-not-finish';\n\nconst SEND_ALIASES: Record<string, SendType> = {\n onsight: 'onsight',\n os: 'onsight',\n flash: 'flash',\n fl: 'flash',\n redpoint: 'redpoint',\n rp: 'redpoint',\n sent: 'redpoint',\n send: 'redpoint',\n repeat: 'repeat',\n 're-send': 'repeat',\n resend: 'repeat',\n dogged: 'dogged',\n hangdog: 'dogged',\n a0: 'dogged',\n tr: 'top-rope',\n toprope: 'top-rope',\n 'top-rope': 'top-rope',\n dnf: 'did-not-finish',\n attempted: 'did-not-finish',\n};\n\nconst DISCIPLINE_KEYWORDS: Record<string, string> = {\n boulder: 'bouldering',\n bouldering: 'bouldering',\n sport: 'sport',\n trad: 'trad',\n 'top rope': 'top-rope',\n toprope: 'top-rope',\n hangboard: 'hangboard',\n moonboard: 'training-board',\n kilter: 'training-board',\n board: 'training-board',\n};\n\nfunction metricText(metric?: IMetric): string {\n if (!metric) return '';\n if (typeof metric.value === 'string') return metric.value;\n if (metric.value && typeof metric.value === 'object' && 'text' in metric.value) {\n return String((metric.value as { text?: unknown }).text ?? '');\n }\n if (typeof metric.value === 'number') return String(metric.value);\n return '';\n}\n\nfunction normalizeText(value: string): string {\n return value.toLowerCase().replace(/[_\\s]+/g, '-').trim();\n}\n\nfunction addMetric(metrics: MetricContainer, type: string, value: unknown, unit?: string): void {\n metrics.add({ type, value, origin: 'dialect', unit });\n}\n\nfunction uniquePush(values: string[], value: string): void {\n if (!values.includes(value)) values.push(value);\n}\n\n/**\n * Climbing dialect for recognizing route/problem logs and climbing training.\n *\n * Recognizes:\n * - route/problem names from Action metrics\n * - V-scale, YDS, Fontainebleau, and French-style grades\n * - send type aliases such as OS, flash, RP, TR, and DNF\n * - attempt counts from climb-only `@N` shorthand parsed as empty-unit resistance\n * - high-point notes such as `bolt 6` and `move 9`\n */\nexport class ClimbDialect implements IDialect {\n id = 'climb';\n name = 'Climb Dialect';\n\n analyze(statement: ICodeStatement): DialectAnalysis {\n const hints: string[] = [];\n const dialectMetrics = MetricContainer.empty('climb-dialect');\n const metrics = MetricContainer.from(statement.metrics as any);\n const rawMetrics = metrics.toArray();\n const text = rawMetrics.map(metricText).filter(Boolean).join(' ');\n\n const routeName = this.findRouteName(rawMetrics);\n if (routeName) addMetric(dialectMetrics, ClimbMetricType.RouteName, routeName);\n\n const grade = this.findGrade(rawMetrics);\n if (grade) addMetric(dialectMetrics, ClimbMetricType.Grade, grade);\n\n const sendType = this.findSendType(text);\n if (sendType) addMetric(dialectMetrics, ClimbMetricType.SendType, sendType);\n\n const attemptCount = this.findAttemptCount(rawMetrics);\n if (attemptCount !== undefined) addMetric(dialectMetrics, ClimbMetricType.AttemptCount, attemptCount);\n\n const highPoint = this.findHighPoint(text);\n if (highPoint) addMetric(dialectMetrics, ClimbMetricType.HighPoint, highPoint);\n\n const disciplines = this.findDisciplines(text, grade);\n for (const discipline of disciplines) {\n addMetric(dialectMetrics, ClimbMetricType.Discipline, discipline);\n }\n\n const hasClimbSignal = Boolean(\n routeName || grade || sendType || highPoint || disciplines.length > 0,\n );\n\n if (hasClimbSignal) {\n hints.push('domain.climb');\n hints.push('behavior.route_based');\n }\n\n if (grade) hints.push('behavior.grade_based');\n if (attemptCount !== undefined) hints.push('behavior.attempt_based');\n if (sendType === 'did-not-finish') hints.push('climb.project');\n\n for (const discipline of disciplines) {\n hints.push(`climb.${discipline.replace('-', '_')}`);\n }\n\n return { metrics: hintsToContainer(hints, dialectMetrics) };\n }\n\n private findRouteName(metrics: IMetric[]): string | undefined {\n const action = metrics.find(metric => metric.type === MetricType.Action && typeof metric.value === 'string');\n return action?.value ? String(action.value) : undefined;\n }\n\n private findGrade(metrics: IMetric[]): ClimbGradeMetricValue | undefined {\n for (let index = 0; index < metrics.length; index += 1) {\n const metric = metrics[index];\n const current = metricText(metric);\n const next = metricText(metrics[index + 1] as IMetric);\n\n const vScale = current.match(/\\bV(\\d{1,2})(?:[-+])?\\b/i);\n if (vScale) {\n const gradeNumber = Number(vScale[1]);\n return { raw: vScale[0].toUpperCase(), system: 'v-scale', normalizedRank: gradeNumber };\n }\n\n if (typeof metric.value === 'number' && metric.value >= 5 && metric.value < 6) {\n const suffix = next.match(/^\\s*([abcd])\\b/i)?.[1];\n const raw = suffix ? `${metric.value}${suffix}` : String(metric.value);\n if (/^5\\.\\d{1,2}[abcd]?$/i.test(raw)) {\n return { raw, system: 'yds', normalizedRank: this.ydsRank(raw) };\n }\n }\n\n const ydsInline = current.match(/\\b5\\.(\\d{1,2})([abcd])?\\b/i);\n if (ydsInline) {\n return { raw: ydsInline[0], system: 'yds', normalizedRank: this.ydsRank(ydsInline[0]) };\n }\n\n const fontInline = current.match(/\\b([3-9][ABC](?:\\+)?)\\b/);\n if (fontInline) return { raw: fontInline[1], system: 'font' };\n\n if (typeof metric.value === 'number' && metric.value >= 3 && metric.value <= 9) {\n const suffix = next.match(/^\\s*([ABC]\\+?)\\b/)?.[1];\n if (suffix) return { raw: `${metric.value}${suffix}`, system: 'font' };\n }\n\n const frenchInline = current.match(/\\b([3-9][abc](?:\\+)?)\\b/);\n if (frenchInline) return { raw: frenchInline[1], system: 'french' };\n }\n\n return undefined;\n }\n\n private ydsRank(raw: string): number | undefined {\n const match = raw.match(/^5\\.(\\d{1,2})([abcd])?$/i);\n if (!match) return undefined;\n const base = Number(match[1]);\n const suffix = match[2]?.toLowerCase();\n const suffixRank = suffix ? ['a', 'b', 'c', 'd'].indexOf(suffix) / 4 : 0;\n return base + suffixRank;\n }\n\n private findSendType(text: string): SendType | undefined {\n const tokens = text\n .toLowerCase()\n .match(/[a-z0-9-]+/g) ?? [];\n\n for (const token of tokens) {\n const normalized = normalizeText(token);\n if (normalized in SEND_ALIASES) return SEND_ALIASES[normalized];\n }\n\n if (/\\bnot\\s+sent\\b/i.test(text)) return 'did-not-finish';\n if (/\\bwith\\s+falls\\b/i.test(text)) return 'dogged';\n\n return undefined;\n }\n\n private findAttemptCount(metrics: IMetric[]): number | undefined {\n const attemptMetric = metrics.find(metric => {\n if (metric.type !== MetricType.Resistance) return false;\n const value = metric.value as { amount?: unknown; unit?: unknown } | undefined;\n return value && typeof value.amount === 'number' && String(value.unit ?? metric.unit ?? EMPTY_UNIT) === EMPTY_UNIT;\n });\n\n return (attemptMetric?.value as { amount?: number } | undefined)?.amount;\n }\n\n private findHighPoint(text: string): string | undefined {\n const highPoint = text.match(/\\b(?:bolt|move|crux|high\\s*point)\\s*\\d+\\b/i)?.[0];\n return highPoint ? highPoint.toLowerCase().replace(/\\s+/g, ' ') : undefined;\n }\n\n private findDisciplines(text: string, grade?: ClimbGradeMetricValue): string[] {\n const found: string[] = [];\n const lower = text.toLowerCase();\n\n for (const [keyword, discipline] of Object.entries(DISCIPLINE_KEYWORDS)) {\n if (lower.includes(keyword)) uniquePush(found, discipline);\n }\n\n if (grade?.system === 'v-scale' || grade?.system === 'font') uniquePush(found, 'bouldering');\n if (grade?.system === 'yds' || grade?.system === 'french') uniquePush(found, 'sport');\n\n return found;\n }\n}\n","import type { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport type { IDialect } from '@bitcobblers/wod-wiki-core';\nimport { Registry } from '../registry/Registry';\nimport { UnitsDialect } from './UnitsDialect';\nimport { CrossFitDialect } from './CrossFitDialect';\nimport { WodDialect } from './WodDialect';\nimport { CardioDialect } from './CardioDialect';\nimport { YogaDialect } from './YogaDialect';\nimport { HabitsDialect } from './HabitsDialect';\nimport { ClimbDialect } from './ClimbDialect';\n\n/** Id of the base Units Dialect — always part of a sport-scoped stack. */\nconst UNITS_DIALECT_ID = 'units';\n\n/**\n * User-facing `:sport` suffixes that differ from their dialect registry id.\n * The fence suffix is a sport name (` ```log:climbing `); the registry id is\n * the dialect's short id (`climb`). Exact registry ids always match directly.\n */\nconst SPORT_ALIASES: Readonly<Record<string, string>> = {\n climbing: 'climb',\n};\n\n/** Suffixes already warned about — one warning per unknown suffix, not per parse. */\nconst warnedSports = new Set<string>();\n\n/**\n * DialectStack — the single ordered place where the base Units Dialect and\n * the sport/personal Dialects are composed and run.\n *\n * Replaces both:\n * - The parse-time `baseUnits` singleton in `lezer-mapper.ts` (hardcoded to\n * one Dialect with no extension hook).\n * - The empty compile-time `DialectRegistry` that was removed from `JitCompiler`\n * in S5a (no production path ever registered a Dialect).\n *\n * Ordering: base Units Dialect runs first (fuses bare Number + unit-word into\n * dimensioned metrics); sport Dialects run after (they observe fused units);\n * personal-overrides run last (a `CONTEXT.md` concept that was previously\n * impossible). Later-wins metric merge and hint accumulation are handled by\n * the per-statement `transform` + `analyze` + append loop.\n */\nexport class DialectStack {\n private readonly dialects?: readonly IDialect[];\n private readonly registry?: Registry<IDialect>;\n\n /**\n * Accepts either a frozen array (the `createDialectStack(overrides)` /\n * test-fixture case) or a live `Registry<IDialect>` (the production\n * singleton below). When constructed from a registry, every `process()`\n * call re-reads `registry.list()`, so a `dialectRegistry.register(...)`\n * made by a consumer after import is honored on the next parse — a\n * frozen array snapshot taken once at module-load time would not see it.\n */\n constructor(dialects: readonly IDialect[] | Registry<IDialect>) {\n if (dialects instanceof Registry) {\n this.registry = dialects;\n } else {\n this.dialects = dialects;\n }\n }\n\n private get effectiveDialects(): readonly IDialect[] {\n return this.registry ? this.registry.list() : (this.dialects ?? []);\n }\n\n /**\n * Resolve the effective Dialect list for a block's `:sport` suffix.\n *\n * - No suffix → the full stack (a bare `time`/`log` block — unchanged).\n * - Known suffix (registry id or {@link SPORT_ALIASES} entry) → the base\n * Units Dialect plus the named sport Dialect, in registration order.\n * - Unknown suffix → warn once per suffix and fall back to the full stack.\n */\n dialectsFor(sport?: string): readonly IDialect[] {\n const all = this.effectiveDialects;\n if (!sport) return all;\n const id = SPORT_ALIASES[sport] ?? sport;\n if (!all.some(d => d.id === id)) {\n if (!warnedSports.has(sport)) {\n warnedSports.add(sport);\n console.warn(\n `[DialectStack] Unknown :sport suffix \"${sport}\" — falling back to the full ` +\n `dialect stack. Known dialect ids: ${all.map(d => d.id).join(', ')}.`,\n );\n }\n return all;\n }\n return all.filter(d => d.id === UNITS_DIALECT_ID || d.id === id);\n }\n\n /**\n * Process a single statement through the Dialects selected by `sport`\n * (full stack when omitted). Each Dialect's `transform` runs before its\n * `analyze`, and the emitted metrics (hint markers + domain values) are\n * appended onto the statement.\n */\n process(statement: ICodeStatement, sport?: string): void {\n this.applyDialects(statement, this.dialectsFor(sport));\n }\n\n /** Process a batch of statements through the Dialects selected by `sport`. */\n processAll(statements: ICodeStatement[], sport?: string): void {\n const dialects = this.dialectsFor(sport);\n for (const statement of statements) {\n this.applyDialects(statement, dialects);\n }\n }\n\n private applyDialects(statement: ICodeStatement, dialects: readonly IDialect[]): void {\n for (const dialect of dialects) {\n dialect.transform?.(statement);\n const analysis = dialect.analyze(statement);\n if (analysis?.metrics?.length) {\n statement.metrics.add(...analysis.metrics);\n }\n }\n }\n\n /** The ordered Dialect list (for inspection / testing). Live when registry-backed. */\n get list(): readonly IDialect[] {\n return this.effectiveDialects;\n }\n}\n\n/**\n * Consumer-facing dialect registry, pre-seeded with the built-in dialects.\n *\n * Replaces the previous `createDialectStack(overrides)` parameter as the way\n * to extend the dialect set. Consumer code can call\n * `dialectRegistry.register(new MyDialect())` to add a personal-overrides\n * dialect, and the production `dialectStack` below reads its ordered list\n * from this registry.\n *\n * Built-ins can be removed or overridden by `id`.\n */\nexport const dialectRegistry = new Registry<IDialect>([\n // Base — fuses bare Number + unit-word into dimensioned metrics.\n // Must run first so sport Dialects see fused units.\n new UnitsDialect(),\n\n // Sport Dialects — emit hints (workout.amrap, workout.emom, etc.)\n // and domain-specific metrics (climb grades, cardio distances).\n new CrossFitDialect(),\n new WodDialect(),\n new CardioDialect(),\n new YogaDialect(),\n new HabitsDialect(),\n new ClimbDialect(),\n]);\n\n/**\n * Build a DialectStack from an explicit list — preserved signature for\n * tests and the `personal-overrides` pattern. Production uses\n * {@link dialectStack} (which reads the registry) via `extractStatements`.\n */\nexport function createDialectStack(overrides: IDialect[] = []): DialectStack {\n return new DialectStack([\n // Base — fuses bare Number + unit-word into dimensioned metrics.\n new UnitsDialect(),\n // Sport Dialects — emit hints (workout.amrap, workout.emom, etc.)\n // and domain-specific metrics (climb grades, cardio distances).\n new CrossFitDialect(),\n new WodDialect(),\n new CardioDialect(),\n new YogaDialect(),\n new HabitsDialect(),\n new ClimbDialect(),\n // Personal-overrides Dialect last (later wins). A `CONTEXT.md`\n // concept that was impossible before the Stack existed.\n ...overrides,\n ]);\n}\n\n/**\n * Module singleton — the default Dialect Stack used by the parse pipeline.\n *\n * Registry-backed (not a frozen array snapshot): every `process()`/`processAll()`\n * call re-reads {@link dialectRegistry} live, so a consumer `dialectRegistry.register(...)`\n * call is honored on the very next parse, no matter when it happens relative to\n * module load. Equivalent to the old `const baseUnits = new UnitsDialect()` but\n * with the full sport-Dialect set wired, and genuinely extensible.\n */\nexport const dialectStack: DialectStack = new DialectStack(dialectRegistry);\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\n\nexport interface ActionMetricOptions {\n /** Original text inside the action fence (after the colon) */\n raw?: string;\n /** Normalized action name (without leading ! pin marker) */\n name?: string;\n /** Whether the action is pinned ([:!action]) */\n isPinned?: boolean;\n}\n\nexport class ActionMetric implements IMetric {\n readonly value: string;\n readonly image: string;\n readonly raw: string;\n readonly name: string;\n readonly isPinned: boolean;\n readonly origin: MetricOrigin = 'parser';\n\n constructor(action: string, options: ActionMetricOptions = {}) {\n // Preserve backward compatibility: \"action\" arg is the normalized name when options not provided\n this.raw = options.raw ?? action;\n this.isPinned = options.isPinned ?? this.raw.trim().startsWith('!');\n this.name = options.name ?? (this.raw.trim().replace(/^!/, '') || action);\n\n this.value = this.name;\n this.image = this.raw;\n }\n\n readonly type = MetricType.Action;\n}\n\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\n\n/**\n * **Duration** (Parser layer)\n *\n * A metrics defined by the CodeStatement representing a planned time target.\n * Syntax like `5:00` produces 300 000 ms; `:?` means the duration is collectible\n * (actual time will be recorded at runtime).\n *\n * Consumed by `TimerEndingBehavior` to know how long the Elapsed should be\n * before closing the span.\n *\n * ## Glossary (docs/architecture/time-terminology.md)\n * - **Duration** = the plan (set by parser) — this metrics\n * - **Time / Spans** = raw clock recordings (TimeSpan[])\n * - **Elapsed** = Σ(end − start) of each span (active time only)\n * - **Total** = lastEnd − firstStart (wall-clock bracket, includes pauses)\n * - **TimeStamp** = system Date.now() when a message is logged\n */\nexport class DurationMetric implements IMetric {\n readonly value: number | undefined;\n readonly origin: MetricOrigin;\n\n /**\n * Creates a new DurationMetric.\n *\n * @param image The duration string (e.g., \"5:00\", \"1:30:00\") or \":?\" for collectible\n * @param forceCountUp If true, timer counts up even with explicit duration (^ modifier)\n * @param required If true, this timer cannot be skipped by the user (`*` prefix)\n */\n constructor(\n public image: string,\n public readonly forceCountUp: boolean = false,\n public readonly required: boolean = false\n ) {\n if (this.image === ':?') {\n this.days = 0;\n this.hours = 0;\n this.minutes = 0;\n this.seconds = 0;\n this.original = undefined;\n this.value = undefined;\n this.origin = 'hinted';\n } else {\n const digits = this.image\n .split(\":\")\n .map((segment: string) => 1 * (segment === \"\" ? 0 : Number(segment)))\n .reverse();\n\n while (digits.length < 4) {\n digits.push(0);\n }\n this.days = digits[3];\n this.hours = digits[2];\n this.minutes = digits[1];\n this.seconds = digits[0];\n\n if (this.seconds < 0 || this.minutes < 0 || this.hours < 0 || this.days < 0) {\n throw new Error(`Timer components cannot be negative: ${this.image}`);\n }\n\n if (this.seconds > 59 && (this.minutes > 0 || this.hours > 0 || this.days > 0)) {\n throw new Error(`Invalid seconds component: ${this.seconds} (must be < 60 if other components present)`);\n }\n\n if (this.minutes > 59 && (this.hours > 0 || this.days > 0)) {\n throw new Error(`Invalid minutes component: ${this.minutes} (must be < 60 if hours/days present)`);\n }\n\n this.original = (this.seconds +\n this.minutes * 60 +\n this.hours * 60 * 60 +\n this.days * 60 * 60 * 24) * 1000;\n\n this.value = this.original;\n this.origin = 'parser';\n }\n }\n\n readonly days: number;\n readonly hours: number;\n readonly minutes: number;\n readonly seconds: number;\n readonly original: number | undefined;\n readonly type = MetricType.Duration;\n\n /**\n * Determines the intended timer direction based on value and modifiers.\n * - If forceCountUp is true (^ modifier), always returns 'up'\n * - If value > 0 (explicit duration), returns 'down' (countdown)\n * - If value === 0, undefined, or collectible, returns 'up' (count-up)\n */\n get direction(): 'up' | 'down' {\n if (this.forceCountUp) {\n return 'up';\n }\n if (this.value === undefined) {\n return 'up';\n }\n return this.value > 0 ? 'down' : 'up';\n }\n}\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\n\n\nexport type GroupType = string;\n\nexport class GroupMetric implements IMetric {\n readonly value: GroupType;\n\n constructor(public group: GroupType, public image: string) {\n this.value = group;\n }\n readonly type = MetricType.Group;\n readonly origin: MetricOrigin = 'parser';\n}\n\n","import { IMetric, MetricOrigin, MetricType } from '@bitcobblers/wod-wiki-core';\n\nexport interface PropertyMetricOptions {\n readonly type?: MetricType | string;\n readonly origin?: MetricOrigin;\n readonly image?: string;\n}\n\nfunction formatPropertyValue(value: string | number | boolean | null): string {\n if (value === null) return 'null';\n return String(value);\n}\n\nexport class PropertyMetric implements IMetric {\n readonly key: string;\n readonly value: string | number | boolean | null;\n readonly image: string;\n readonly origin: MetricOrigin;\n\n constructor(key: string, value: string | number | boolean | null, options: PropertyMetricOptions = {}) {\n this.key = key;\n this.value = value;\n this.image = options.image ?? `${key}: ${formatPropertyValue(value)}`;\n this.origin = options.origin ?? 'parser';\n this.type = options.type ?? MetricType.Custom;\n }\n\n readonly type: MetricType | string;\n}\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\n\nexport class RepMetric implements IMetric {\n readonly value?: number;\n readonly image: string;\n readonly origin: MetricOrigin;\n\n constructor(public reps?: number) {\n if (reps !== undefined) {\n if (reps < 0) {\n throw new Error(`Rep count cannot be negative: ${reps}`);\n }\n // Non-integer values are allowed here because the parser produces\n // Number fragments before unit fragments (e.g. \"1.5\" then \"km\").\n // mergeFragments() combines them into a DistanceMetric/ResistanceMetric.\n // Integer-only validation belongs in the runtime strategy layer, not here.\n }\n this.value = reps;\n this.image = reps !== undefined ? reps.toString() : '?';\n // If reps is undefined, this is a collectible metric hinted from user input\n this.origin = reps === undefined ? 'hinted' : 'parser';\n }\n readonly type = MetricType.Rep;\n} \n\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\n\nexport class RoundsMetric implements IMetric {\n readonly value: number | string;\n readonly image: string;\n readonly origin: MetricOrigin = 'parser';\n\n constructor(public count: number | string) {\n this.value = count;\n this.image = count.toString();\n }\n readonly type = MetricType.Rounds;\n}\n\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\n\nexport class TextMetric implements IMetric {\n readonly value: { text: string, level?: string };\n readonly image: string;\n readonly origin: MetricOrigin = 'parser';\n\n constructor(public text: string, public level?: string) {\n this.value = { text: text, level: level };\n this.image = text;\n }\n readonly type = MetricType.Text;\n}\n\n","import { ParsedCodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { ActionMetric } from '../runtime/compiler/metrics/ActionMetric';\nimport { DistanceMetric } from '../runtime/compiler/metrics/DistanceMetric';\nimport { DurationMetric } from '../runtime/compiler/metrics/DurationMetric';\nimport { EffortMetric } from '../runtime/compiler/metrics/EffortMetric';\nimport { GroupMetric } from '../runtime/compiler/metrics/GroupMetric';\nimport { PropertyMetric } from '../runtime/compiler/metrics/PropertyMetric';\nimport { RepMetric } from '../runtime/compiler/metrics/RepMetric';\nimport { ResistanceMetric } from '../runtime/compiler/metrics/ResistanceMetric';\nimport { RoundsMetric } from '../runtime/compiler/metrics/RoundsMetric';\nimport { TextMetric } from '../runtime/compiler/metrics/TextMetric';\nimport { hintMetric } from '../metrics/hints';\nimport { EMPTY_UNIT } from '../runtime/compiler/metrics/dimensionFactory';\nimport { SyntaxFacts, SyntaxMeta, SyntaxPrimitive } from './syntax-facts';\n\ntype MetricPair = { metrics: any; meta: SyntaxMeta };\n\nconst PROPERTY_KEY_TO_METRIC_TYPE: Record<string, MetricType> = {\n rpe: MetricType.SessionRPE,\n rir: MetricType.RIR,\n intensity: MetricType.Intensity,\n load: MetricType.Load,\n volume: MetricType.Volume,\n work: MetricType.Work,\n};\n\nexport function classifyStatements(facts: SyntaxFacts): ParsedCodeStatement[] {\n return facts.statements.map((fact) => {\n const statement = new ParsedCodeStatement();\n const metricPairs: MetricPair[] = [];\n\n for (const primitive of fact.primitives) {\n metricPairs.push(...classifyPrimitive(primitive));\n }\n\n const mergedPairs = mergeFragments(metricPairs);\n statement.metrics = mergedPairs.map((pair) => pair.metrics);\n statement.metricMeta = new Map(mergedPairs.map((pair) => [pair.metrics, pair.meta]));\n\n statement.id = fact.id;\n statement.line = fact.line;\n statement.text = fact.meta.raw;\n statement.raw = fact.meta.raw;\n statement.meta = fact.meta;\n statement.parent = fact.parentId;\n statement.children = fact.children;\n statement.isLeaf = fact.isLeaf;\n\n return statement;\n });\n}\n\nfunction classifyPrimitive(primitive: SyntaxPrimitive): MetricPair[] {\n switch (primitive.kind) {\n case 'lap':\n return [{ metrics: new GroupMetric(primitive.lapType, primitive.raw), meta: primitive.meta }];\n\n case 'duration': {\n const pairs: MetricPair[] = [];\n if (primitive.timerRaw) {\n pairs.push({ metrics: new DurationMetric(primitive.timerRaw, primitive.hasTrend, primitive.isRequired), meta: primitive.meta });\n }\n if (primitive.isRequired) {\n pairs.push({ metrics: hintMetric('behavior.required_timer', 'parser'), meta: primitive.meta });\n }\n return pairs;\n }\n\n case 'rounds': {\n if (primitive.sequence) {\n if (primitive.sequence.length === 1) {\n return [{ metrics: new RoundsMetric(primitive.sequence[0]), meta: primitive.meta }];\n }\n\n return [\n { metrics: new RoundsMetric(primitive.sequence.length), meta: primitive.meta },\n ...primitive.sequence.map((value) => ({ metrics: new RepMetric(value), meta: primitive.meta })),\n ];\n }\n\n return primitive.label\n ? [{ metrics: new RoundsMetric(primitive.label), meta: primitive.meta }]\n : [];\n }\n\n case 'action': {\n const actionText = primitive.hasColonPrefix\n ? primitive.raw.substring(2, primitive.raw.length - 1).trim()\n : primitive.raw.substring(1, primitive.raw.length - 1).trim();\n return [{ metrics: new ActionMetric(actionText, { raw: actionText }), meta: primitive.meta }];\n }\n\n case 'text': {\n const content = primitive.raw.substring(2).trim();\n return [{ metrics: new TextMetric(content, undefined), meta: primitive.meta }];\n }\n\n case 'heading': {\n const match = primitive.raw.match(/^(#+)\\s*(.*)$/);\n const level = match ? String(match[1].length) : '1';\n const content = match ? match[2].trim() : primitive.raw.substring(1).trim();\n return [{ metrics: new TextMetric(content, level), meta: primitive.meta }];\n }\n\n case 'quantity': {\n if (primitive.hasAtSign) {\n return [{ metrics: new ResistanceMetric(primitive.value, EMPTY_UNIT), meta: primitive.meta }];\n }\n\n return [{ metrics: new RepMetric(primitive.value), meta: primitive.meta }];\n }\n\n case 'effort':\n return [{ metrics: new EffortMetric(primitive.raw), meta: primitive.meta }];\n\n case 'property': {\n const metricType = PROPERTY_KEY_TO_METRIC_TYPE[primitive.key.toLowerCase()] ?? MetricType.Custom;\n return [{\n metrics: new PropertyMetric(primitive.key, primitive.value, {\n type: metricType,\n image: primitive.raw,\n }),\n meta: primitive.meta,\n }];\n }\n\n case 'metric_object': {\n const pairs = primitive.pairs;\n return pairs.map((pair) => {\n const metricType = PROPERTY_KEY_TO_METRIC_TYPE[pair.key.toLowerCase()] ?? MetricType.Custom;\n return {\n metrics: new PropertyMetric(pair.key, pair.value, {\n type: metricType,\n image: `${pair.key}: ${pair.value}`,\n }),\n meta: primitive.meta,\n };\n });\n }\n\n default:\n return [];\n }\n}\n\nfunction mergeFragments(pairs: MetricPair[]): MetricPair[] {\n if (pairs.length < 2) return pairs;\n\n const result: MetricPair[] = [];\n let current = pairs[0];\n\n for (let index = 1; index < pairs.length; index++) {\n const next = pairs[index];\n\n if (current.metrics instanceof EffortMetric && next.metrics instanceof EffortMetric) {\n if (current.metrics.effort === '/' || current.metrics.effort === '|' ||\n next.metrics.effort === '/' || next.metrics.effort === '|') {\n result.push(current);\n current = next;\n continue;\n }\n const gap = next.meta.startOffset - current.meta.endOffset;\n if (gap <= 1) {\n const mergedMeta: SyntaxMeta = {\n ...current.meta,\n endOffset: next.meta.endOffset,\n columnEnd: next.meta.columnEnd,\n length: next.meta.endOffset - current.meta.startOffset,\n raw: current.meta.raw + (gap === 1 ? ' ' : '') + next.meta.raw,\n };\n current = {\n metrics: new EffortMetric(current.metrics.effort + (gap === 1 ? ' ' : '') + next.metrics.effort),\n meta: mergedMeta,\n };\n continue;\n }\n }\n\n if (current.metrics instanceof RepMetric && (next.metrics instanceof ResistanceMetric || next.metrics instanceof DistanceMetric)) {\n const gap = next.meta.startOffset - current.meta.endOffset;\n if (gap <= 1) {\n const mergedMeta: SyntaxMeta = {\n ...current.meta,\n endOffset: next.meta.endOffset,\n columnEnd: next.meta.columnEnd,\n length: next.meta.endOffset - current.meta.startOffset,\n raw: current.meta.raw + (gap === 1 ? ' ' : '') + next.meta.raw,\n };\n if (next.metrics instanceof ResistanceMetric && next.metrics.value.amount === undefined) {\n current = {\n metrics: new ResistanceMetric(current.metrics.reps, next.metrics.unit),\n meta: mergedMeta,\n };\n continue;\n }\n if (next.metrics instanceof DistanceMetric && next.metrics.value.amount === undefined) {\n current = {\n metrics: new DistanceMetric(current.metrics.reps, next.metrics.unit),\n meta: mergedMeta,\n };\n continue;\n }\n }\n }\n\n result.push(current);\n current = next;\n }\n\n result.push(current);\n return result;\n}\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"(QQVQPOOO!dQPO'#C|O#qQPO'#CcOOQO'#Cc'#CcOOQO'#Cf'#CfOOQO'#Cg'#CgOOQO'#Ce'#CeO${QPO'#CeO%TQPO'#CiOOQO'#C|'#C|OOQO'#Cs'#CsO%]QPO'#CkOOQO'#Cl'#ClOOQO'#Cm'#CmOOQO'#Co'#CoOOQO'#Cp'#CpOOQO'#Cn'#CnO%bQPO'#CnOOQO'#Cq'#CqOOQO'#Cr'#CrO&XQPO'#CtOOQO'#Cd'#CdOOQO'#Cy'#CyO'gQPO'#CbO&`QPO'#CbOOQO'#Cx'#CxQVQPOOO'nQPO,58xOOQO,59P,59PO'yQPO'#CjOOQO'#Cz'#CzO(XQPO,59TOOQO-E6z-E6zO(dQPO,59VOOQO,59Y,59YOOQO'#C}'#C}O(oQPO,59`OOQO,59`,59`OOQO-E6w-E6wOOQO,58|,58|O(vQPO,58|OOQO-E6v-E6vOOQO1G.d1G.dO(}QPO'#C{O)SQPO,59UOOQO-E6x-E6xOOQO1G.o1G.oO)bQPO1G.qOOQO-E6{-E6{OOQO1G.z1G.zOOQO1G.h1G.hOOQO,59g,59gOOQO-E6y-E6yOOQO7+$]7+$]\",\n stateData: \"*Z~OtOS~ORPOT`O[UOvQOwROxSOyVOzTO{WO}ZO!OXO!Q[O!R]O!S^O!T_O!UbO!VcO!WdO!ZiO~OukORpXTpX[pXvpXxpXypXzpX{pX}pX!OpX!QpX!RpX!SpX!TpX!UpX!VpX!WpX!ZpX~ORVXTVX[VXvVXxVXyVXzVX{VX}VX!OVX!QVX!RVX!SVX!TVX!UVX!VVX!WVX!ZpX~O[lOzTO~ORnOTmO~OuqO~OTrO!T_O~ORsOSsOTsOisOjsOksOusO!OsO!XsO~O!YuO~P%jORXOT`O[UOvXOxSOyVOzTO{WO}ZO!OXO!Q[O!R]O!S^O!T_O!UbO!VcO!WdO~O!ZwO~P&`ORzOSzOTzO~Ov{OR^XT^X|^X~ORnOTmO|!OO~ORXOvXO!OXO~O!Y!RO~P%jO!Z!SO~P&`OT!TO~Ov{OR^aT^a|^a~ORXOvXO!OXO!P!VO~O!Q!Rz[!Sxyu!U!V!O!W!Y!XijkRvwT!Zt!W~\",\n goto: \"$TrPPsPPPsw{!S!Z!bP!S!l!S!S!S!S!p!w!S!S!S!SPPP#R#X#d#j#p#}TiOjThOjZfOghjxZeOghjxZVOghjxYUOghjxRlVTnWoZaOghjxY`OghjxRraQjORyjSgOjSvgxRxhQoWR}oQ|mR!U|YYOghjxQp!PR!PqQtdR!Qt\",\n nodeNames: \"⚠ Program Property Identifier String Number Block Lap Fragment Duration Trend CollectibleTimer Timer Rounds Sequence Action Text Heading Quantity AtSign Question Slash Pipe Effort MetricObject True False Null\",\n maxTerm: 57,\n skippedNodes: [0],\n repeatNodeCount: 6,\n tokenData: \"5_~RvXY#iYZ#z]^$Ppq#iqr$Vrs$}st'dtu$Vuv$Vvw$Vxy(Oyz(Tz{(Y{|)S|})X}!O*R!O!P*W!P!Q+Z!Q![+}![!],t!_!`$V!a!b-^!b!c-c!c!}.]!}#O.k#O#P$V#P#Q.p#Q#R.u#T#Y.]#Y#Z/o#Z#b.]#b#c1p#c#h.]#h#i3`#i#o.]#o#p5O#p#q5T#q#r5Y~#nSt~XY#iYZ#z]^$Ppq#i~$PO!Z~~$SPYZ#z~$[Z!O~qr$Vtu$Vuv$Vvw$Vz{$V|}$V!O!P$V!_!`$V!b!c$V#O#P$V#Q#R$V~%QXOY$}Z]$}^r$}rs%ms#O$}#O#P&_#P;'S$};'S;=`'^<%lO$}~%rXS~OY$}Z]$}^r$}rs%ms#O$}#O#P&_#P;'S$};'S;=`'^<%lO$}~&bRO;'S$};'S;=`&k;=`O$}~&nYOY$}Z]$}^r$}rs%ms#O$}#O#P&_#P;'S$};'S;=`'^;=`<%l$}<%lO$}~'aP;=`<%l$}~'iT!R~OY'dZ]'d^;'S'd;'S;=`'x<%lO'd~'{P;=`<%l'd~(TO{~~(YO|~~(aZy~!O~qr$Vtu$Vuv$Vvw$Vz{$V|}$V!O!P$V!_!`$V!b!c$V#O#P$V#Q#R$V~)XOw~~)`Z!O~!X~qr$Vtu$Vuv$Vvw$Vz{$V|}$V!O!P$V!_!`$V!b!c$V#O#P$V#Q#R$V~*WOv~~*][!O~qr$Vtu$Vuv$Vvw$Vz{$V|}$V!O!P$V!Q![+R!_!`$V!b!c$V#O#P$V#Q#R$V~+WPT~!Q![+R~+`P!U~!P!Q+c~+hT!Q~OY+cZ]+c^;'S+c;'S;=`+w<%lO+c~+zP;=`<%l+c~,SRT~!O!P,]!Q![+}![!],c~,`P!Q![+R~,fP!Q![,i~,nQ[~!Q![,i![!],c~,yQu~!Q![-P!a!b-X~-UP[~!Q![-P~-^Oz~~-cO!T~~-jZ!S~!O~qr$Vtu$Vuv$Vvw$Vz{$V|}$V!O!P$V!_!`$V!b!c$V#O#P$V#Q#R$V~.bRR~!Q![.]!c!}.]#T#o.]~.pO}~~.uO!P~~.|Zx~!O~qr$Vtu$Vuv$Vvw$Vz{$V|}$V!O!P$V!_!`$V!b!c$V#O#P$V#Q#R$V~/tSR~!Q![.]!c!}.]#T#U0Q#U#o.]~0VTR~!Q![.]!c!}.]#T#`.]#`#a0f#a#o.]~0kTR~!Q![.]!c!}.]#T#g.]#g#h0z#h#o.]~1PTR~!Q![.]!c!}.]#T#X.]#X#Y1`#Y#o.]~1gRj~R~!Q![.]!c!}.]#T#o.]~1uTR~!Q![.]!c!}.]#T#i.]#i#j2U#j#o.]~2ZTR~!Q![.]!c!}.]#T#`.]#`#a2j#a#o.]~2oTR~!Q![.]!c!}.]#T#`.]#`#a3O#a#o.]~3VRk~R~!Q![.]!c!}.]#T#o.]~3eTR~!Q![.]!c!}.]#T#f.]#f#g3t#g#o.]~3yTR~!Q![.]!c!}.]#T#i.]#i#j4Y#j#o.]~4_TR~!Q![.]!c!}.]#T#X.]#X#Y4n#Y#o.]~4uRi~R~!Q![.]!c!}.]#T#o.]~5TO!W~~5YO!V~~5_O!Y~\",\n tokenizers: [0],\n topRules: {\"Program\":[0,1]},\n tokenPrec: 400\n})\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n Program = 1,\n Property = 2,\n Identifier = 3,\n String = 4,\n Number = 5,\n Block = 6,\n Lap = 7,\n Fragment = 8,\n Duration = 9,\n Trend = 10,\n CollectibleTimer = 11,\n Timer = 12,\n Rounds = 13,\n Sequence = 14,\n Action = 15,\n Text = 16,\n Heading = 17,\n Quantity = 18,\n AtSign = 19,\n Question = 20,\n Slash = 21,\n Pipe = 22,\n Effort = 23,\n MetricObject = 24,\n True = 25,\n False = 26,\n Null = 27\n","import type { Tree } from '@lezer/common';\nimport { parser } from '../grammar/parser';\nimport * as terms from '../grammar/parser.terms';\nimport {\n ActionPrimitive,\n DurationPrimitive,\n EffortPrimitive,\n HeadingPrimitive,\n LapPrimitive,\n MetricObjectPrimitive,\n PropertyPrimitive,\n QuantityPrimitive,\n RoundsPrimitive,\n SyntaxFacts,\n SyntaxMeta,\n SyntaxPrimitive,\n SyntaxStatement,\n TextPrimitive,\n} from './syntax-facts';\n\n/** Helper to compute line and column numbers from offset without EditorState */\nexport interface LineLocator {\n (offset: number): { lineNumber: number; lineStart: number };\n}\n\nexport function createLineLocator(source: string): LineLocator {\n const lineStarts = [0];\n for (let i = 0; i < source.length; i++) {\n if (source[i] === '\\n') {\n lineStarts.push(i + 1);\n }\n }\n return (offset: number) => {\n let low = 0;\n let high = lineStarts.length - 1;\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n if (lineStarts[mid] <= offset) {\n low = mid + 1;\n } else {\n high = mid - 1;\n }\n }\n const lineIndex = high >= 0 ? high : 0;\n return {\n lineNumber: lineIndex + 1,\n lineStart: lineStarts[lineIndex],\n };\n };\n}\n\nexport function extractSyntaxFacts(\n sourceOrState: string | { doc: { toString(): string } },\n treeArg?: Tree\n): SyntaxFacts {\n const source = typeof sourceOrState === 'string' ? sourceOrState : sourceOrState.doc.toString();\n const parseSource = source.endsWith('\\n') ? source : source + '\\n';\n const tree = treeArg ?? parser.parse(parseSource);\n const locator = createLineLocator(source);\n\n const statements: SyntaxStatement[] = [];\n let lastProperty: { to: number; index: number } | null = null;\n\n tree.iterate({\n enter(node) {\n if (node.name === '⚠') {\n if (lastProperty && lastProperty.to === node.from) {\n statements.splice(lastProperty.index, 1);\n }\n lastProperty = null;\n return;\n }\n\n if (node.name === 'Property') {\n const primitive = createPropertyPrimitive(locator, source, node.from, node.to);\n if (primitive) {\n const meta = primitive.meta;\n statements.push({\n id: meta.line,\n line: meta.line,\n meta,\n primitives: [primitive],\n children: [],\n isLeaf: true,\n });\n lastProperty = { to: node.to, index: statements.length - 1 };\n }\n return;\n }\n\n if (node.name !== 'Block') return;\n lastProperty = null;\n\n const statementMeta = createMeta(locator, node.from, node.to, source.slice(node.from, node.to));\n const statement: SyntaxStatement = {\n id: statementMeta.line,\n line: statementMeta.line,\n meta: statementMeta,\n primitives: [],\n children: [],\n isLeaf: true,\n };\n\n const cursor = node.node.cursor();\n if (cursor.firstChild()) {\n do {\n const child = cursor.node;\n const childRaw = source.slice(child.from, child.to);\n\n if (child.type.id === terms.Lap) {\n const lapPrimitive: LapPrimitive = {\n kind: 'lap',\n raw: childRaw,\n meta: createMeta(locator, child.from, child.to, childRaw),\n lapType: childRaw === '+' ? 'compose' : 'round',\n };\n statement.primitives.push(lapPrimitive);\n continue;\n }\n\n if (child.type.id !== terms.Fragment || !child.firstChild) {\n continue;\n }\n\n const fragmentNode = child.firstChild;\n const primitive = mapFragmentToPrimitive(locator, source, fragmentNode as any);\n if (primitive) statement.primitives.push(primitive);\n } while (cursor.nextSibling());\n }\n\n statements.push(statement);\n },\n });\n\n applyIndentationNesting(statements);\n\n return { statements };\n}\n\nfunction createPropertyPrimitive(\n locator: LineLocator,\n source: string,\n from: number,\n to: number\n): PropertyPrimitive | null {\n const raw = source.slice(from, to);\n const meta = createMeta(locator, from, to, raw);\n const match = raw.match(/^\\s*([A-Za-z][A-Za-z0-9]*)\\s*:\\s*(.*?)\\s*$/);\n\n if (!match) return null;\n\n const [, key, rawValue] = match;\n return {\n kind: 'property',\n raw,\n meta,\n key,\n valueRaw: rawValue,\n value: parsePropertyValue(rawValue),\n };\n}\n\nfunction parsePropertyValue(rawValue: string): string | number | boolean | null {\n const trimmed = rawValue.trim();\n\n if (/^\"(?:[^\"\\\\]|\\\\.)*\"$/.test(trimmed)) {\n return trimmed.slice(1, -1).replace(/\\\\([\"\\\\/bfnrt])/g, '$1');\n }\n\n if (/^-?(?:\\d+\\.\\d+|\\d+)$/.test(trimmed)) {\n return Number(trimmed);\n }\n\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n if (trimmed === 'null') return null;\n\n return trimmed;\n}\n\nfunction mapFragmentToPrimitive(\n locator: LineLocator,\n source: string,\n node: {\n from: number;\n to: number;\n type: { id: number };\n getChild: (name: string) => any;\n cursor: () => { firstChild: () => boolean; node: { name: string; from: number; to: number }; nextSibling: () => boolean };\n }\n): SyntaxPrimitive | null {\n const raw = source.slice(node.from, node.to);\n const meta = createMeta(locator, node.from, node.to, raw);\n\n switch (node.type.id) {\n case terms.Duration: {\n const trend = node.getChild('Trend');\n const timerNode = node.getChild('Timer') || node.getChild('CollectibleTimer');\n\n const primitive: DurationPrimitive = {\n kind: 'duration',\n raw,\n meta,\n timerRaw: timerNode ? source.slice(timerNode.from, timerNode.to) : undefined,\n hasTrend: !!trend,\n isRequired: raw.includes('*'),\n };\n return primitive;\n }\n\n case terms.Rounds: {\n const sequence = node.getChild('Sequence');\n const label = node.getChild('Identifier');\n\n const primitive: RoundsPrimitive = {\n kind: 'rounds',\n raw,\n meta,\n sequence: sequence\n ? source\n .slice(sequence.from, sequence.to)\n .split('-')\n .map((n) => parseInt(n.trim(), 10))\n : undefined,\n label: label ? source.slice(label.from, label.to) : undefined,\n };\n return primitive;\n }\n\n case terms.Action: {\n const primitive: ActionPrimitive = {\n kind: 'action',\n raw,\n meta,\n hasColonPrefix: raw.startsWith('[:'),\n };\n return primitive;\n }\n\n case terms.Text: {\n const primitive: TextPrimitive = {\n kind: 'text',\n raw,\n meta,\n };\n return primitive;\n }\n\n case terms.Heading: {\n const primitive: HeadingPrimitive = {\n kind: 'heading',\n raw,\n meta,\n };\n return primitive;\n }\n\n case terms.Quantity: {\n const hasAtSign = !!node.getChild('AtSign');\n const numberNode = node.getChild('Number');\n\n const primitive: QuantityPrimitive = {\n kind: 'quantity',\n raw,\n meta,\n value: numberNode ? parseFloat(source.slice(numberNode.from, numberNode.to)) : undefined,\n hasAtSign,\n };\n return primitive;\n }\n\n case terms.Effort: {\n const primitive: EffortPrimitive = {\n kind: 'effort',\n raw,\n meta,\n };\n return primitive;\n }\n\n case terms.Slash: {\n const primitive: EffortPrimitive = {\n kind: 'effort',\n raw,\n meta,\n };\n return primitive;\n }\n\n case terms.Pipe: {\n const primitive: EffortPrimitive = {\n kind: 'effort',\n raw,\n meta,\n };\n return primitive;\n }\n\n case terms.MetricObject: {\n let pairs: Array<{ key: string; value: string | number | boolean | null }> = [];\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n pairs = Object.entries(parsed).map(([key, value]) => ({\n key,\n value: value as string | number | boolean | null,\n }));\n }\n } catch {\n // Malformed JSON — emit empty pairs; raw text is still preserved\n }\n\n const primitive: MetricObjectPrimitive = {\n kind: 'metric_object',\n raw,\n meta,\n pairs,\n };\n return primitive;\n }\n\n default:\n return null;\n }\n}\n\nfunction applyIndentationNesting(statements: SyntaxStatement[]): void {\n const parentChildMap = new Map<number, number[]>();\n let stack: Array<{ columnStart: number; statement: SyntaxStatement }> = [];\n\n for (const statement of statements) {\n stack = stack.filter((item) => item.columnStart < statement.meta.columnStart);\n\n if (stack.length > 0) {\n for (const parent of stack) {\n if (!parentChildMap.has(parent.statement.id)) {\n parentChildMap.set(parent.statement.id, []);\n }\n parentChildMap.get(parent.statement.id)!.push(statement.id);\n statement.parentId = parent.statement.id;\n }\n }\n\n stack.push({ columnStart: statement.meta.columnStart, statement });\n }\n\n for (const statement of statements) {\n const flatChildren = parentChildMap.get(statement.id) ?? [];\n statement.children = groupChildrenByLap(flatChildren, statements);\n statement.isLeaf = statement.children.length === 0;\n }\n}\n\nfunction groupChildrenByLap(childIds: number[], statements: SyntaxStatement[]): number[][] {\n if (childIds.length === 0) return [];\n\n const byId = new Map(statements.map((statement) => [statement.id, statement]));\n const groups: number[][] = [];\n\n for (const childId of childIds) {\n const statement = byId.get(childId);\n const lap = statement?.primitives.find((primitive) => primitive.kind === 'lap') as\n | LapPrimitive\n | undefined;\n\n if (lap?.lapType === 'compose' && groups.length > 0) {\n groups[groups.length - 1].push(childId);\n } else {\n groups.push([childId]);\n }\n }\n\n return groups;\n}\n\nfunction createMeta(\n locator: LineLocator,\n from: number,\n to: number,\n raw: string\n): SyntaxMeta {\n const { lineNumber, lineStart } = locator(from);\n\n return {\n line: lineNumber,\n startOffset: from,\n endOffset: to,\n columnStart: from - lineStart,\n columnEnd: to - lineStart,\n length: to - from,\n raw,\n };\n}\n","import type { Tree } from '@lezer/common';\nimport type { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { classifyStatements } from './semantic-classifier';\nimport { extractSyntaxFacts } from './syntax-parser';\nimport { dialectStack } from '../dialects/DialectStack';\n\nexport type SourceInput = string | { tree?: Tree; source: string; doc?: { toString(): string } } | { doc: { toString(): string } };\n\n/**\n * Extract statements WITHOUT running the Dialect Stack.\n *\n * Used by the parser test harness (which applies its own Dialect set) and by\n * any consumer that needs the raw classified statements before Dialect\n * processing. Production consumers should use {@link extractStatements}.\n */\nexport function extractStatementsRaw(sourceOrTree: SourceInput, treeArg?: Tree): ICodeStatement[] {\n let source: string;\n let tree: Tree | undefined = treeArg;\n\n if (typeof sourceOrTree === 'string') {\n source = sourceOrTree;\n } else if ('source' in sourceOrTree) {\n source = sourceOrTree.source;\n tree = tree ?? sourceOrTree.tree;\n } else if ('doc' in sourceOrTree) {\n source = sourceOrTree.doc.toString();\n } else {\n source = '';\n }\n\n const facts = extractSyntaxFacts(source, tree);\n return classifyStatements(facts);\n}\n\n/**\n * Extracts WhiteboardScript statements from source or Lezer tree.\n *\n * The Dialect Stack (base Units + sport Dialects + personal-overrides) runs on\n * every statement here, so every parse consumer gets fused units and sport\n * hints uniformly. See `DialectStack.ts`.\n *\n * @param sport - The block's `:sport` fence suffix (` ```log:climbing `).\n * Omitted → the full registry stack runs. See {@link DialectStack.dialectsFor}.\n */\nexport function extractStatements(\n sourceOrTree: SourceInput,\n sportOrTree?: string | Tree,\n sportArg?: string\n): ICodeStatement[] {\n let sport: string | undefined;\n let tree: Tree | undefined;\n\n if (typeof sportOrTree === 'string') {\n sport = sportOrTree;\n } else if (sportOrTree && typeof sportOrTree === 'object') {\n tree = sportOrTree as Tree;\n sport = sportArg;\n }\n\n const statements = extractStatementsRaw(sourceOrTree, tree);\n dialectStack.processAll(statements, sport);\n return statements;\n}\n","import { ICodeStatement, ParseError } from '@bitcobblers/wod-wiki-core';\n\n// Re-export ParseError for consumers\nexport type { ParseError } from '@bitcobblers/wod-wiki-core';\n\nexport interface IScript {\n source: string;\n statements: ICodeStatement[];\n errors?: ParseError[] | undefined;\n getIds(ids: number[]) : ICodeStatement[];\n getId(id: number): ICodeStatement | undefined;\n getAt(index: number): ICodeStatement | undefined;\n}\n\nexport class WhiteboardScript implements IScript {\n source: string;\n statements: ICodeStatement[];\n errors: ParseError[] | undefined;\n \n // Lazy-initialized Map for O(1) ID lookups\n private _idMap?: Map<number, ICodeStatement>;\n\n constructor(source: string, statements: ICodeStatement[], errors: ParseError[] = []) {\n this.source = source;\n this.statements = statements;\n this.errors = errors;\n }\n\n /**\n * Gets the ID-to-statement Map, building it lazily on first access.\n * Provides O(1) lookups instead of O(n) find() calls.\n */\n private getIdMap(): Map<number, ICodeStatement> {\n if (!this._idMap) {\n this._idMap = new Map(this.statements.map(s => [s.id as number, s]));\n }\n return this._idMap;\n }\n\n /**\n * Resolves multiple statement IDs to statements.\n * Uses cached Map for O(n) performance instead of O(n²).\n */\n getIds(ids: number[]): ICodeStatement[] {\n const idMap = this.getIdMap();\n return ids.map(id => idMap.get(id)).filter(Boolean) as ICodeStatement[];\n }\n\n /**\n * Resolves a single statement ID to a statement.\n * Uses cached Map for O(1) performance instead of O(n).\n */\n getId(id: number): ICodeStatement | undefined {\n return this.getIdMap().get(id);\n }\n\n /**\n * Gets a statement by its array index.\n */\n getAt(index: number): ICodeStatement | undefined {\n return this.statements[index];\n }\n\n /**\n * Flattens grouped children (number[][]) and resolves to statements.\n * Convenience wrapper for getIds(children.flat()).\n */\n getFlatChildren(children: number[][]): ICodeStatement[] {\n return this.getIds(children.flat());\n }\n\n /**\n * Resolves grouped children while preserving group structure.\n * Maps each number[] group to ICodeStatement[] group.\n */\n getChildGroups(children: number[][]): ICodeStatement[][] {\n return children.map(group => this.getIds(group));\n }\n}\n","import { WhiteboardScript } from './WhiteboardScript';\nimport { extractStatements, extractStatementsRaw } from './lezer-mapper';\nimport { parser } from '../grammar/parser';\n\nexport interface ParseOptions {\n dialect?: string;\n sport?: string;\n strict?: boolean;\n withoutDialects?: boolean;\n}\n\n/**\n * Parses Whiteboard Script source directly into a WhiteboardScript AST\n * with 0 DOM / EditorState dependencies.\n *\n * @param inputText Raw Whiteboard Script text.\n * @param options Parse options including dialect/sport fence suffix and strictness.\n */\nexport function parseScript(inputText: string, options: ParseOptions = {}): WhiteboardScript {\n if (!inputText || !inputText.trim()) {\n return new WhiteboardScript(inputText, [], []);\n }\n\n try {\n const doc = inputText.endsWith('\\n') ? inputText : inputText + '\\n';\n const tree = parser.parse(doc);\n const sport = options.sport ?? options.dialect;\n const statements = options.withoutDialects\n ? extractStatementsRaw(inputText, tree)\n : extractStatements(inputText, tree, sport);\n\n return new WhiteboardScript(inputText, statements, []);\n } catch (error: any) {\n const msg = error?.message || 'Unknown parse error';\n return new WhiteboardScript(inputText, [], [{ message: msg }]);\n }\n}\n","import { IScript, WhiteboardScript } from './WhiteboardScript';\nimport { parseScript } from './parseScript';\n\n/**\n * Headless parser facade using the Lezer parser with 0 DOM / EditorState overhead.\n */\nexport class MdTimerRuntime {\n /**\n * Parse WhiteboardScript source into a {@link WhiteboardScript}, running the\n * Dialect Stack on every statement.\n *\n * @param sport - The block's `:sport` fence suffix (` ```log:climbing `).\n */\n read(inputText: string, sport?: string): IScript {\n return parseScript(inputText, { sport });\n }\n\n /**\n * Parse without running the Dialect Stack. Used by the parser test harness\n * which applies its own Dialect set. Production consumers should use {@link read}.\n */\n readWithoutDialects(inputText: string): IScript {\n return parseScript(inputText, { withoutDialects: true });\n }\n}\n","import { MdTimerRuntime } from './md-timer';\n\nexport function createParser(): MdTimerRuntime {\n return new MdTimerRuntime();\n}\n\n/**\n * @deprecated Use createParser() instead.\n */\nexport const sharedParser = /* @__PURE__ */ createParser();\n","import { NodeProp } from '@lezer/common';\n\nlet nextTagID = 0;\n/**\nHighlighting tags are markers that denote a highlighting category.\nThey are [associated](#highlight.styleTags) with parts of a syntax\ntree by a language mode, and then mapped to an actual CSS style by\na [highlighter](#highlight.Highlighter).\n\nBecause syntax tree node types and highlight styles have to be\nable to talk the same language, CodeMirror uses a mostly _closed_\n[vocabulary](#highlight.tags) of syntax tags (as opposed to\ntraditional open string-based systems, which make it hard for\nhighlighting themes to cover all the tokens produced by the\nvarious languages).\n\nIt _is_ possible to [define](#highlight.Tag^define) your own\nhighlighting tags for system-internal use (where you control both\nthe language package and the highlighter), but such tags will not\nbe picked up by regular highlighters (though you can derive them\nfrom standard tags to allow highlighters to fall back to those).\n*/\nclass Tag {\n /**\n @internal\n */\n constructor(\n /**\n The optional name of the base tag @internal\n */\n name, \n /**\n The set of this tag and all its parent tags, starting with\n this one itself and sorted in order of decreasing specificity.\n */\n set, \n /**\n The base unmodified tag that this one is based on, if it's\n modified @internal\n */\n base, \n /**\n The modifiers applied to this.base @internal\n */\n modified) {\n this.name = name;\n this.set = set;\n this.base = base;\n this.modified = modified;\n /**\n @internal\n */\n this.id = nextTagID++;\n }\n toString() {\n let { name } = this;\n for (let mod of this.modified)\n if (mod.name)\n name = `${mod.name}(${name})`;\n return name;\n }\n static define(nameOrParent, parent) {\n let name = typeof nameOrParent == \"string\" ? nameOrParent : \"?\";\n if (nameOrParent instanceof Tag)\n parent = nameOrParent;\n if (parent === null || parent === void 0 ? void 0 : parent.base)\n throw new Error(\"Can not derive from a modified tag\");\n let tag = new Tag(name, [], null, []);\n tag.set.push(tag);\n if (parent)\n for (let t of parent.set)\n tag.set.push(t);\n return tag;\n }\n /**\n Define a tag _modifier_, which is a function that, given a tag,\n will return a tag that is a subtag of the original. Applying the\n same modifier to a twice tag will return the same value (`m1(t1)\n == m1(t1)`) and applying multiple modifiers will, regardless or\n order, produce the same tag (`m1(m2(t1)) == m2(m1(t1))`).\n \n When multiple modifiers are applied to a given base tag, each\n smaller set of modifiers is registered as a parent, so that for\n example `m1(m2(m3(t1)))` is a subtype of `m1(m2(t1))`,\n `m1(m3(t1)`, and so on.\n */\n static defineModifier(name) {\n let mod = new Modifier(name);\n return (tag) => {\n if (tag.modified.indexOf(mod) > -1)\n return tag;\n return Modifier.get(tag.base || tag, tag.modified.concat(mod).sort((a, b) => a.id - b.id));\n };\n }\n}\nlet nextModifierID = 0;\nclass Modifier {\n constructor(name) {\n this.name = name;\n this.instances = [];\n this.id = nextModifierID++;\n }\n static get(base, mods) {\n if (!mods.length)\n return base;\n let exists = mods[0].instances.find(t => t.base == base && sameArray(mods, t.modified));\n if (exists)\n return exists;\n let set = [], tag = new Tag(base.name, set, base, mods);\n for (let m of mods)\n m.instances.push(tag);\n let configs = powerSet(mods);\n for (let parent of base.set)\n if (!parent.modified.length)\n for (let config of configs)\n set.push(Modifier.get(parent, config));\n return tag;\n }\n}\nfunction sameArray(a, b) {\n return a.length == b.length && a.every((x, i) => x == b[i]);\n}\nfunction powerSet(array) {\n let sets = [[]];\n for (let i = 0; i < array.length; i++) {\n for (let j = 0, e = sets.length; j < e; j++) {\n sets.push(sets[j].concat(array[i]));\n }\n }\n return sets.sort((a, b) => b.length - a.length);\n}\n/**\nThis function is used to add a set of tags to a language syntax\nvia [`NodeSet.extend`](#common.NodeSet.extend) or\n[`LRParser.configure`](#lr.LRParser.configure).\n\nThe argument object maps node selectors to [highlighting\ntags](#highlight.Tag) or arrays of tags.\n\nNode selectors may hold one or more (space-separated) node paths.\nSuch a path can be a [node name](#common.NodeType.name), or\nmultiple node names (or `*` wildcards) separated by slash\ncharacters, as in `\"Block/Declaration/VariableName\"`. Such a path\nmatches the final node but only if its direct parent nodes are the\nother nodes mentioned. A `*` in such a path matches any parent,\nbut only a single level—wildcards that match multiple parents\naren't supported, both for efficiency reasons and because Lezer\ntrees make it rather hard to reason about what they would match.)\n\nA path can be ended with `/...` to indicate that the tag assigned\nto the node should also apply to all child nodes, even if they\nmatch their own style (by default, only the innermost style is\nused).\n\nWhen a path ends in `!`, as in `Attribute!`, no further matching\nhappens for the node's child nodes, and the entire node gets the\ngiven style.\n\nIn this notation, node names that contain `/`, `!`, `*`, or `...`\nmust be quoted as JSON strings.\n\nFor example:\n\n```javascript\nparser.configure({props: [\n styleTags({\n // Style Number and BigNumber nodes\n \"Number BigNumber\": tags.number,\n // Style Escape nodes whose parent is String\n \"String/Escape\": tags.escape,\n // Style anything inside Attributes nodes\n \"Attributes!\": tags.meta,\n // Add a style to all content inside Italic nodes\n \"Italic/...\": tags.emphasis,\n // Style InvalidString nodes as both `string` and `invalid`\n \"InvalidString\": [tags.string, tags.invalid],\n // Style the node named \"/\" as punctuation\n '\"/\"': tags.punctuation\n })\n]})\n```\n*/\nfunction styleTags(spec) {\n let byName = Object.create(null);\n for (let prop in spec) {\n let tags = spec[prop];\n if (!Array.isArray(tags))\n tags = [tags];\n for (let part of prop.split(\" \"))\n if (part) {\n let pieces = [], mode = 2 /* Mode.Normal */, rest = part;\n for (let pos = 0;;) {\n if (rest == \"...\" && pos > 0 && pos + 3 == part.length) {\n mode = 1 /* Mode.Inherit */;\n break;\n }\n let m = /^\"(?:[^\"\\\\]|\\\\.)*?\"|[^\\/!]+/.exec(rest);\n if (!m)\n throw new RangeError(\"Invalid path: \" + part);\n pieces.push(m[0] == \"*\" ? \"\" : m[0][0] == '\"' ? JSON.parse(m[0]) : m[0]);\n pos += m[0].length;\n if (pos == part.length)\n break;\n let next = part[pos++];\n if (pos == part.length && next == \"!\") {\n mode = 0 /* Mode.Opaque */;\n break;\n }\n if (next != \"/\")\n throw new RangeError(\"Invalid path: \" + part);\n rest = part.slice(pos);\n }\n let last = pieces.length - 1, inner = pieces[last];\n if (!inner)\n throw new RangeError(\"Invalid path: \" + part);\n let rule = new Rule(tags, mode, last > 0 ? pieces.slice(0, last) : null);\n byName[inner] = rule.sort(byName[inner]);\n }\n }\n return ruleNodeProp.add(byName);\n}\nconst ruleNodeProp = new NodeProp({\n combine(a, b) {\n let cur, root, take;\n while (a || b) {\n if (!a || b && a.depth >= b.depth) {\n take = b;\n b = b.next;\n }\n else {\n take = a;\n a = a.next;\n }\n if (cur && cur.mode == take.mode && !take.context && !cur.context)\n continue;\n let copy = new Rule(take.tags, take.mode, take.context);\n if (cur)\n cur.next = copy;\n else\n root = copy;\n cur = copy;\n }\n return root;\n }\n});\nclass Rule {\n constructor(tags, mode, context, next) {\n this.tags = tags;\n this.mode = mode;\n this.context = context;\n this.next = next;\n }\n get opaque() { return this.mode == 0 /* Mode.Opaque */; }\n get inherit() { return this.mode == 1 /* Mode.Inherit */; }\n sort(other) {\n if (!other || other.depth < this.depth) {\n this.next = other;\n return this;\n }\n other.next = this.sort(other.next);\n return other;\n }\n get depth() { return this.context ? this.context.length : 0; }\n}\nRule.empty = new Rule([], 2 /* Mode.Normal */, null);\n/**\nDefine a [highlighter](#highlight.Highlighter) from an array of\ntag/class pairs. Classes associated with more specific tags will\ntake precedence.\n*/\nfunction tagHighlighter(tags, options) {\n let map = Object.create(null);\n for (let style of tags) {\n if (!Array.isArray(style.tag))\n map[style.tag.id] = style.class;\n else\n for (let tag of style.tag)\n map[tag.id] = style.class;\n }\n let { scope, all = null } = options || {};\n return {\n style: (tags) => {\n let cls = all;\n for (let tag of tags) {\n for (let sub of tag.set) {\n let tagClass = map[sub.id];\n if (tagClass) {\n cls = cls ? cls + \" \" + tagClass : tagClass;\n break;\n }\n }\n }\n return cls;\n },\n scope\n };\n}\nfunction highlightTags(highlighters, tags) {\n let result = null;\n for (let highlighter of highlighters) {\n let value = highlighter.style(tags);\n if (value)\n result = result ? result + \" \" + value : value;\n }\n return result;\n}\n/**\nHighlight the given [tree](#common.Tree) with the given\n[highlighter](#highlight.Highlighter). Often, the higher-level\n[`highlightCode`](#highlight.highlightCode) function is easier to\nuse.\n*/\nfunction highlightTree(tree, highlighter, \n/**\nAssign styling to a region of the text. Will be called, in order\nof position, for any ranges where more than zero classes apply.\n`classes` is a space separated string of CSS classes.\n*/\nputStyle, \n/**\nThe start of the range to highlight.\n*/\nfrom = 0, \n/**\nThe end of the range.\n*/\nto = tree.length) {\n let builder = new HighlightBuilder(from, Array.isArray(highlighter) ? highlighter : [highlighter], putStyle);\n builder.highlightRange(tree.cursor(), from, to, \"\", builder.highlighters);\n builder.flush(to);\n}\n/**\nHighlight the given tree with the given highlighter, calling\n`putText` for every piece of text, either with a set of classes or\nwith the empty string when unstyled, and `putBreak` for every line\nbreak.\n*/\nfunction highlightCode(code, tree, highlighter, putText, putBreak, from = 0, to = code.length) {\n let pos = from;\n function writeTo(p, classes) {\n if (p <= pos)\n return;\n for (let text = code.slice(pos, p), i = 0;;) {\n let nextBreak = text.indexOf(\"\\n\", i);\n let upto = nextBreak < 0 ? text.length : nextBreak;\n if (upto > i)\n putText(text.slice(i, upto), classes);\n if (nextBreak < 0)\n break;\n putBreak();\n i = nextBreak + 1;\n }\n pos = p;\n }\n highlightTree(tree, highlighter, (from, to, classes) => {\n writeTo(from, \"\");\n writeTo(to, classes);\n }, from, to);\n writeTo(to, \"\");\n}\nclass HighlightBuilder {\n constructor(at, highlighters, span) {\n this.at = at;\n this.highlighters = highlighters;\n this.span = span;\n this.class = \"\";\n }\n startSpan(at, cls) {\n if (cls != this.class) {\n this.flush(at);\n if (at > this.at)\n this.at = at;\n this.class = cls;\n }\n }\n flush(to) {\n if (to > this.at && this.class)\n this.span(this.at, to, this.class);\n }\n highlightRange(cursor, from, to, inheritedClass, highlighters) {\n let { type, from: start, to: end } = cursor;\n if (start >= to || end <= from)\n return;\n if (type.isTop)\n highlighters = this.highlighters.filter(h => !h.scope || h.scope(type));\n let cls = inheritedClass;\n let rule = getStyleTags(cursor) || Rule.empty;\n let tagCls = highlightTags(highlighters, rule.tags);\n if (tagCls) {\n if (cls)\n cls += \" \";\n cls += tagCls;\n if (rule.mode == 1 /* Mode.Inherit */)\n inheritedClass += (inheritedClass ? \" \" : \"\") + tagCls;\n }\n this.startSpan(Math.max(from, start), cls);\n if (rule.opaque)\n return;\n let mounted = cursor.tree && cursor.tree.prop(NodeProp.mounted);\n if (mounted && mounted.overlay) {\n let inner = cursor.node.enter(mounted.overlay[0].from + start, 1);\n let innerHighlighters = this.highlighters.filter(h => !h.scope || h.scope(mounted.tree.type));\n let hasChild = cursor.firstChild();\n for (let i = 0, pos = start;; i++) {\n let next = i < mounted.overlay.length ? mounted.overlay[i] : null;\n let nextPos = next ? next.from + start : end;\n let rangeFrom = Math.max(from, pos), rangeTo = Math.min(to, nextPos);\n if (rangeFrom < rangeTo && hasChild) {\n while (cursor.from < rangeTo) {\n this.highlightRange(cursor, rangeFrom, rangeTo, inheritedClass, highlighters);\n this.startSpan(Math.min(rangeTo, cursor.to), cls);\n if (cursor.to >= nextPos || !cursor.nextSibling())\n break;\n }\n }\n if (!next || nextPos > to)\n break;\n pos = next.to + start;\n if (pos > from) {\n this.highlightRange(inner.cursor(), Math.max(from, next.from + start), Math.min(to, pos), \"\", innerHighlighters);\n this.startSpan(Math.min(to, pos), cls);\n }\n }\n if (hasChild)\n cursor.parent();\n }\n else if (cursor.firstChild()) {\n if (mounted)\n inheritedClass = \"\";\n do {\n if (cursor.to <= from)\n continue;\n if (cursor.from >= to)\n break;\n this.highlightRange(cursor, from, to, inheritedClass, highlighters);\n this.startSpan(Math.min(to, cursor.to), cls);\n } while (cursor.nextSibling());\n cursor.parent();\n }\n }\n}\n/**\nMatch a syntax node's [highlight rules](#highlight.styleTags). If\nthere's a match, return its set of tags, and whether it is\nopaque (uses a `!`) or applies to all child nodes (`/...`).\n*/\nfunction getStyleTags(node) {\n let rule = node.type.prop(ruleNodeProp);\n while (rule && rule.context && !node.matchContext(rule.context))\n rule = rule.next;\n return rule || null;\n}\nconst t = Tag.define;\nconst comment = t(), name = t(), typeName = t(name), propertyName = t(name), literal = t(), string = t(literal), number = t(literal), content = t(), heading = t(content), keyword = t(), operator = t(), punctuation = t(), bracket = t(punctuation), meta = t();\n/**\nThe default set of highlighting [tags](#highlight.Tag).\n\nThis collection is heavily biased towards programming languages,\nand necessarily incomplete. A full ontology of syntactic\nconstructs would fill a stack of books, and be impractical to\nwrite themes for. So try to make do with this set. If all else\nfails, [open an\nissue](https://github.com/codemirror/codemirror.next) to propose a\nnew tag, or [define](#highlight.Tag^define) a local custom tag for\nyour use case.\n\nNote that it is not obligatory to always attach the most specific\ntag possible to an element—if your grammar can't easily\ndistinguish a certain type of element (such as a local variable),\nit is okay to style it as its more general variant (a variable).\n\nFor tags that extend some parent tag, the documentation links to\nthe parent.\n*/\nconst tags = {\n /**\n A comment.\n */\n comment,\n /**\n A line [comment](#highlight.tags.comment).\n */\n lineComment: t(comment),\n /**\n A block [comment](#highlight.tags.comment).\n */\n blockComment: t(comment),\n /**\n A documentation [comment](#highlight.tags.comment).\n */\n docComment: t(comment),\n /**\n Any kind of identifier.\n */\n name,\n /**\n The [name](#highlight.tags.name) of a variable.\n */\n variableName: t(name),\n /**\n A type [name](#highlight.tags.name).\n */\n typeName: typeName,\n /**\n A tag name (subtag of [`typeName`](#highlight.tags.typeName)).\n */\n tagName: t(typeName),\n /**\n A property or field [name](#highlight.tags.name).\n */\n propertyName: propertyName,\n /**\n An attribute name (subtag of [`propertyName`](#highlight.tags.propertyName)).\n */\n attributeName: t(propertyName),\n /**\n The [name](#highlight.tags.name) of a class.\n */\n className: t(name),\n /**\n A label [name](#highlight.tags.name).\n */\n labelName: t(name),\n /**\n A namespace [name](#highlight.tags.name).\n */\n namespace: t(name),\n /**\n The [name](#highlight.tags.name) of a macro.\n */\n macroName: t(name),\n /**\n A literal value.\n */\n literal,\n /**\n A string [literal](#highlight.tags.literal).\n */\n string,\n /**\n A documentation [string](#highlight.tags.string).\n */\n docString: t(string),\n /**\n A character literal (subtag of [string](#highlight.tags.string)).\n */\n character: t(string),\n /**\n An attribute value (subtag of [string](#highlight.tags.string)).\n */\n attributeValue: t(string),\n /**\n A number [literal](#highlight.tags.literal).\n */\n number,\n /**\n An integer [number](#highlight.tags.number) literal.\n */\n integer: t(number),\n /**\n A floating-point [number](#highlight.tags.number) literal.\n */\n float: t(number),\n /**\n A boolean [literal](#highlight.tags.literal).\n */\n bool: t(literal),\n /**\n Regular expression [literal](#highlight.tags.literal).\n */\n regexp: t(literal),\n /**\n An escape [literal](#highlight.tags.literal), for example a\n backslash escape in a string.\n */\n escape: t(literal),\n /**\n A color [literal](#highlight.tags.literal).\n */\n color: t(literal),\n /**\n A URL [literal](#highlight.tags.literal).\n */\n url: t(literal),\n /**\n A language keyword.\n */\n keyword,\n /**\n The [keyword](#highlight.tags.keyword) for the self or this\n object.\n */\n self: t(keyword),\n /**\n The [keyword](#highlight.tags.keyword) for null.\n */\n null: t(keyword),\n /**\n A [keyword](#highlight.tags.keyword) denoting some atomic value.\n */\n atom: t(keyword),\n /**\n A [keyword](#highlight.tags.keyword) that represents a unit.\n */\n unit: t(keyword),\n /**\n A modifier [keyword](#highlight.tags.keyword).\n */\n modifier: t(keyword),\n /**\n A [keyword](#highlight.tags.keyword) that acts as an operator.\n */\n operatorKeyword: t(keyword),\n /**\n A control-flow related [keyword](#highlight.tags.keyword).\n */\n controlKeyword: t(keyword),\n /**\n A [keyword](#highlight.tags.keyword) that defines something.\n */\n definitionKeyword: t(keyword),\n /**\n A [keyword](#highlight.tags.keyword) related to defining or\n interfacing with modules.\n */\n moduleKeyword: t(keyword),\n /**\n An operator.\n */\n operator,\n /**\n An [operator](#highlight.tags.operator) that dereferences something.\n */\n derefOperator: t(operator),\n /**\n Arithmetic-related [operator](#highlight.tags.operator).\n */\n arithmeticOperator: t(operator),\n /**\n Logical [operator](#highlight.tags.operator).\n */\n logicOperator: t(operator),\n /**\n Bit [operator](#highlight.tags.operator).\n */\n bitwiseOperator: t(operator),\n /**\n Comparison [operator](#highlight.tags.operator).\n */\n compareOperator: t(operator),\n /**\n [Operator](#highlight.tags.operator) that updates its operand.\n */\n updateOperator: t(operator),\n /**\n [Operator](#highlight.tags.operator) that defines something.\n */\n definitionOperator: t(operator),\n /**\n Type-related [operator](#highlight.tags.operator).\n */\n typeOperator: t(operator),\n /**\n Control-flow [operator](#highlight.tags.operator).\n */\n controlOperator: t(operator),\n /**\n Program or markup punctuation.\n */\n punctuation,\n /**\n [Punctuation](#highlight.tags.punctuation) that separates\n things.\n */\n separator: t(punctuation),\n /**\n Bracket-style [punctuation](#highlight.tags.punctuation).\n */\n bracket,\n /**\n Angle [brackets](#highlight.tags.bracket) (usually `<` and `>`\n tokens).\n */\n angleBracket: t(bracket),\n /**\n Square [brackets](#highlight.tags.bracket) (usually `[` and `]`\n tokens).\n */\n squareBracket: t(bracket),\n /**\n Parentheses (usually `(` and `)` tokens). Subtag of\n [bracket](#highlight.tags.bracket).\n */\n paren: t(bracket),\n /**\n Braces (usually `{` and `}` tokens). Subtag of\n [bracket](#highlight.tags.bracket).\n */\n brace: t(bracket),\n /**\n Content, for example plain text in XML or markup documents.\n */\n content,\n /**\n [Content](#highlight.tags.content) that represents a heading.\n */\n heading,\n /**\n A level 1 [heading](#highlight.tags.heading).\n */\n heading1: t(heading),\n /**\n A level 2 [heading](#highlight.tags.heading).\n */\n heading2: t(heading),\n /**\n A level 3 [heading](#highlight.tags.heading).\n */\n heading3: t(heading),\n /**\n A level 4 [heading](#highlight.tags.heading).\n */\n heading4: t(heading),\n /**\n A level 5 [heading](#highlight.tags.heading).\n */\n heading5: t(heading),\n /**\n A level 6 [heading](#highlight.tags.heading).\n */\n heading6: t(heading),\n /**\n A prose [content](#highlight.tags.content) separator (such as a horizontal rule).\n */\n contentSeparator: t(content),\n /**\n [Content](#highlight.tags.content) that represents a list.\n */\n list: t(content),\n /**\n [Content](#highlight.tags.content) that represents a quote.\n */\n quote: t(content),\n /**\n [Content](#highlight.tags.content) that is emphasized.\n */\n emphasis: t(content),\n /**\n [Content](#highlight.tags.content) that is styled strong.\n */\n strong: t(content),\n /**\n [Content](#highlight.tags.content) that is part of a link.\n */\n link: t(content),\n /**\n [Content](#highlight.tags.content) that is styled as code or\n monospace.\n */\n monospace: t(content),\n /**\n [Content](#highlight.tags.content) that has a strike-through\n style.\n */\n strikethrough: t(content),\n /**\n Inserted text in a change-tracking format.\n */\n inserted: t(),\n /**\n Deleted text.\n */\n deleted: t(),\n /**\n Changed text.\n */\n changed: t(),\n /**\n An invalid or unsyntactic element.\n */\n invalid: t(),\n /**\n Metadata or meta-instruction.\n */\n meta,\n /**\n [Metadata](#highlight.tags.meta) that applies to the entire\n document.\n */\n documentMeta: t(meta),\n /**\n [Metadata](#highlight.tags.meta) that annotates or adds\n attributes to a given syntactic element.\n */\n annotation: t(meta),\n /**\n Processing instruction or preprocessor directive. Subtag of\n [meta](#highlight.tags.meta).\n */\n processingInstruction: t(meta),\n /**\n [Modifier](#highlight.Tag^defineModifier) that indicates that a\n given element is being defined. Expected to be used with the\n various [name](#highlight.tags.name) tags.\n */\n definition: Tag.defineModifier(\"definition\"),\n /**\n [Modifier](#highlight.Tag^defineModifier) that indicates that\n something is constant. Mostly expected to be used with\n [variable names](#highlight.tags.variableName).\n */\n constant: Tag.defineModifier(\"constant\"),\n /**\n [Modifier](#highlight.Tag^defineModifier) used to indicate that\n a [variable](#highlight.tags.variableName) or [property\n name](#highlight.tags.propertyName) is being called or defined\n as a function.\n */\n function: Tag.defineModifier(\"function\"),\n /**\n [Modifier](#highlight.Tag^defineModifier) that can be applied to\n [names](#highlight.tags.name) to indicate that they belong to\n the language's standard environment.\n */\n standard: Tag.defineModifier(\"standard\"),\n /**\n [Modifier](#highlight.Tag^defineModifier) that indicates a given\n [names](#highlight.tags.name) is local to some scope.\n */\n local: Tag.defineModifier(\"local\"),\n /**\n A generic variant [modifier](#highlight.Tag^defineModifier) that\n can be used to tag language-specific alternative variants of\n some common tag. It is recommended for themes to define special\n forms of at least the [string](#highlight.tags.string) and\n [variable name](#highlight.tags.variableName) tags, since those\n come up a lot.\n */\n special: Tag.defineModifier(\"special\")\n};\nfor (let name in tags) {\n let val = tags[name];\n if (val instanceof Tag)\n val.name = name;\n}\n/**\nThis is a highlighter that adds stable, predictable classes to\ntokens, for styling with external CSS.\n\nThe following tags are mapped to their name prefixed with `\"tok-\"`\n(for example `\"tok-comment\"`):\n\n* [`link`](#highlight.tags.link)\n* [`heading`](#highlight.tags.heading)\n* [`emphasis`](#highlight.tags.emphasis)\n* [`strong`](#highlight.tags.strong)\n* [`keyword`](#highlight.tags.keyword)\n* [`atom`](#highlight.tags.atom)\n* [`bool`](#highlight.tags.bool)\n* [`url`](#highlight.tags.url)\n* [`labelName`](#highlight.tags.labelName)\n* [`inserted`](#highlight.tags.inserted)\n* [`deleted`](#highlight.tags.deleted)\n* [`literal`](#highlight.tags.literal)\n* [`string`](#highlight.tags.string)\n* [`number`](#highlight.tags.number)\n* [`variableName`](#highlight.tags.variableName)\n* [`typeName`](#highlight.tags.typeName)\n* [`namespace`](#highlight.tags.namespace)\n* [`className`](#highlight.tags.className)\n* [`macroName`](#highlight.tags.macroName)\n* [`propertyName`](#highlight.tags.propertyName)\n* [`operator`](#highlight.tags.operator)\n* [`comment`](#highlight.tags.comment)\n* [`meta`](#highlight.tags.meta)\n* [`punctuation`](#highlight.tags.punctuation)\n* [`invalid`](#highlight.tags.invalid)\n\nIn addition, these mappings are provided:\n\n* [`regexp`](#highlight.tags.regexp),\n [`escape`](#highlight.tags.escape), and\n [`special`](#highlight.tags.special)[`(string)`](#highlight.tags.string)\n are mapped to `\"tok-string2\"`\n* [`special`](#highlight.tags.special)[`(variableName)`](#highlight.tags.variableName)\n to `\"tok-variableName2\"`\n* [`local`](#highlight.tags.local)[`(variableName)`](#highlight.tags.variableName)\n to `\"tok-variableName tok-local\"`\n* [`definition`](#highlight.tags.definition)[`(variableName)`](#highlight.tags.variableName)\n to `\"tok-variableName tok-definition\"`\n* [`definition`](#highlight.tags.definition)[`(propertyName)`](#highlight.tags.propertyName)\n to `\"tok-propertyName tok-definition\"`\n*/\nconst classHighlighter = tagHighlighter([\n { tag: tags.link, class: \"tok-link\" },\n { tag: tags.heading, class: \"tok-heading\" },\n { tag: tags.emphasis, class: \"tok-emphasis\" },\n { tag: tags.strong, class: \"tok-strong\" },\n { tag: tags.keyword, class: \"tok-keyword\" },\n { tag: tags.atom, class: \"tok-atom\" },\n { tag: tags.bool, class: \"tok-bool\" },\n { tag: tags.url, class: \"tok-url\" },\n { tag: tags.labelName, class: \"tok-labelName\" },\n { tag: tags.inserted, class: \"tok-inserted\" },\n { tag: tags.deleted, class: \"tok-deleted\" },\n { tag: tags.literal, class: \"tok-literal\" },\n { tag: tags.string, class: \"tok-string\" },\n { tag: tags.number, class: \"tok-number\" },\n { tag: [tags.regexp, tags.escape, tags.special(tags.string)], class: \"tok-string2\" },\n { tag: tags.variableName, class: \"tok-variableName\" },\n { tag: tags.local(tags.variableName), class: \"tok-variableName tok-local\" },\n { tag: tags.definition(tags.variableName), class: \"tok-variableName tok-definition\" },\n { tag: tags.special(tags.variableName), class: \"tok-variableName2\" },\n { tag: tags.definition(tags.propertyName), class: \"tok-propertyName tok-definition\" },\n { tag: tags.typeName, class: \"tok-typeName\" },\n { tag: tags.namespace, class: \"tok-namespace\" },\n { tag: tags.className, class: \"tok-className\" },\n { tag: tags.macroName, class: \"tok-macroName\" },\n { tag: tags.propertyName, class: \"tok-propertyName\" },\n { tag: tags.operator, class: \"tok-operator\" },\n { tag: tags.comment, class: \"tok-comment\" },\n { tag: tags.meta, class: \"tok-meta\" },\n { tag: tags.invalid, class: \"tok-invalid\" },\n { tag: tags.punctuation, class: \"tok-punctuation\" }\n]);\n\nexport { Tag, classHighlighter, getStyleTags, highlightCode, highlightTree, styleTags, tagHighlighter, tags };\n","import { LRLanguage, LanguageSupport } from \"@codemirror/language\";\nimport { styleTags, tags as t } from \"@lezer/highlight\";\nimport { parser } from '../grammar/parser';\n\nexport const whiteboardScriptLanguage = LRLanguage.define({\n parser: parser.configure({\n props: [\n styleTags({\n Identifier: t.variableName,\n String: t.string,\n Number: t.number,\n Timer: t.keyword,\n collectibleTimer: t.keyword,\n textComment: t.lineComment,\n heading: t.heading,\n minus: t.operator,\n plus: t.operator,\n trend: t.operator,\n atSign: t.operator,\n \"Slash/slash\": t.operator,\n question: t.keyword,\n actionOpen: t.bracket,\n actionClose: t.bracket,\n groupOpen: t.bracket,\n groupClose: t.bracket,\n colon: t.punctuation,\n Property: t.propertyName,\n \"Block/Lap\": t.keyword,\n })\n ]\n }),\n languageData: {\n commentTokens: { line: \"//\" },\n closeBrackets: { brackets: [\"(\", \"[\", \"'\", '\"'] },\n }\n});\n\nexport function whiteboardScript() {\n return new LanguageSupport(whiteboardScriptLanguage);\n}\n","/**\n * Effort Registry — Core Types\n *\n * First-class domain entity system for exercise effort definitions.\n * Centralizes effort metadata (MET, discipline, aliases) and supports\n * user-defined derivations with coefficient chains and hard overrides.\n */\n\nimport type { EffortDiscipline } from './disciplines';\n\nexport type EffortRegistrySource = 'bundled' | 'user' | 'synthetic-unresolved';\n\n/** Origins that hold real registry records (synthetic-unresolved entries are\n * resolver phantoms, never listed) — the WQL `origin:` filter vocabulary. */\nexport const EFFORT_REGISTRY_ORIGINS = ['bundled', 'user'] as const;\n\n/** Intensity tiers, low → high — the WQL `intensity:` filter vocabulary. */\nexport const INTENSITY_TIERS = ['low', 'moderate', 'high'] as const;\n\nexport type IntensityTier = (typeof INTENSITY_TIERS)[number];\n\nexport interface EffortBaseAttributes {\n /** Metabolic equivalent of task */\n met: number;\n /** Broad discipline category — canonical vocabulary in `./disciplines`. */\n discipline?: EffortDiscipline;\n /** TIS discipline multiplier. When omitted, resolver derives it from discipline. */\n disciplineFactor?: number;\n /** Qualitative intensity bucket */\n intensityTier?: IntensityTier;\n}\n\nexport interface EffortDerivation {\n /** Slug of the parent effort this was cloned from */\n parentSlug?: string;\n /** Multiplicative modifiers applied to numeric base attributes */\n coefficients?: Record<string, number>;\n /** Explicit replacement values for specific attributes */\n hardOverrides?: Record<string, unknown>;\n}\n\n/**\n * Canonical effort entity.\n *\n * The slug is the durable identity boundary. Display labels and aliases\n * may vary, but references should point at the slug.\n */\nexport interface IEffort {\n /** UUID */\n id: string;\n /** Canonical identifier — unique, lowercase, hyphenated */\n slug: string;\n /** Primary human-readable name */\n label: string;\n /** Alternative names for fuzzy matching */\n aliases: string[];\n /** Canonical effort attributes */\n baseAttributes: EffortBaseAttributes;\n /** Where this record came from */\n registrySource: EffortRegistrySource;\n /** Clone-based derivation metadata (user efforts only) */\n derivation?: EffortDerivation;\n /** ISO timestamp */\n createdAt?: string;\n /** ISO timestamp */\n updatedAt?: string;\n /** Free-form markdown description / notes */\n body?: string;\n /**\n * Compiler hints attached to any block resolved to this effort. Consumed by\n * strategies exactly like dialect-emitted hints — see `CONSUMED_HINTS` in\n * `core/metrics/hints.ts`. Use sparingly: any key not in `CONSUMED_HINTS`\n * is currently inert (analytics-only). For effort-specific metadata, prefer\n * a domain metric.\n */\n hints?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Registry interface (persistence + lookup)\n// ---------------------------------------------------------------------------\n\nexport interface IEffortRegistry {\n // Read\n resolve(slug: string): IEffort | null;\n list(): readonly IEffort[];\n listByOrigin(origin: EffortRegistrySource): readonly IEffort[];\n\n // Write (user efforts only)\n upsert(effort: IEffort): Promise<void>;\n delete(slug: string): Promise<void>;\n\n // Bundled seed (read-only)\n loadBundled(): Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Resolver interface (analytics boundary)\n// ---------------------------------------------------------------------------\n\nexport interface EffortResolutionOptions {\n /** Attribute metrics from /effort/:slug query params or logged execution metrics. */\n modifiers?: Record<string, string>;\n /** Fuzzy-match threshold override. */\n threshold?: number;\n}\n\nexport type EffortResolvedFrom = 'user' | 'bundled' | 'default';\n\n/**\n * Effective effort instance after alias lookup, derivation, modifiers,\n * hard overrides, fallback policy, and discipline-factor calculation.\n */\nexport interface ResolvedEffort {\n /** Effective effort copy; baseAttributes reflect the resolved values. */\n effort: IEffort;\n /** Original registry definition before effective attributes were materialized. */\n definition: IEffort;\n slug: string;\n label: string;\n met: number;\n /** Effective attributes mirrored for legacy metric consumers. */\n baseAttributes: EffortBaseAttributes;\n discipline?: EffortDiscipline;\n disciplineFactor: number;\n intensityTier?: IntensityTier;\n modifiers: Record<string, string>;\n registrySource: EffortRegistrySource;\n resolvedFrom: EffortResolvedFrom;\n isEstimated: boolean;\n}\n\nexport interface IEffortResolver {\n /** Exact slug lookup */\n resolveBySlug(slug: string): IEffort | null;\n /** Exact alias lookup */\n resolveByAlias(label: string): IEffort | null;\n /**\n * Fuzzy alias matching with configurable threshold.\n * Returns a synthetic unresolved effort when no match is found\n * (analytics continuity — never returns null).\n */\n resolveFuzzy(label: string, options?: { threshold?: number }): IEffort;\n /** Resolve a label/slug into an effective effort instance. */\n resolveEffort(label: string, options?: EffortResolutionOptions): ResolvedEffort;\n /** Materialize an already-found effort definition into an effective instance. */\n resolveDefinition(effort: IEffort, options?: EffortResolutionOptions): ResolvedEffort;\n /** All registered efforts (bundled + user) */\n list(): readonly IEffort[];\n}\n\n// ---------------------------------------------------------------------------\n// Resolver options\n// ---------------------------------------------------------------------------\n\nexport interface EffortResolverOptions {\n /** Default MET for synthetic unresolved efforts */\n defaultMet?: number;\n /** Default fuzzy-match threshold (Levenshtein distance) */\n defaultThreshold?: number;\n}\n\nexport const DEFAULT_RESOLVER_OPTIONS: Required<EffortResolverOptions> = {\n defaultMet: 5.0,\n defaultThreshold: 2,\n};\n","/**\n * Canonical discipline vocabulary — the single source of truth for effort\n * disciplines across the resolver, the TIS factor table, fact-row tags, the\n * WQL tag dictionary, and UI filters.\n *\n * The vocabulary is the 10 values used by the bundled catalog\n * (markdown/efforts/<discipline>/<slug>.md, 53 efforts). Earlier factor-table\n * keys ('resistance', 'yoga', 'cardio', 'hiit') and the 'weightlifting' /\n * 'monostructural' examples in storage docs were stale text — no live effort\n * ever carried them.\n */\n\nexport const EFFORT_DISCIPLINES = [\n 'bodyweight',\n 'cycling',\n 'gymnastics',\n 'kettlebell',\n 'recovery',\n 'rowing',\n 'running',\n 'strength',\n 'swimming',\n 'walking',\n] as const;\n\nexport type EffortDiscipline = (typeof EFFORT_DISCIPLINES)[number];\n\nexport function isEffortDiscipline(value: unknown): value is EffortDiscipline {\n return typeof value === 'string'\n && (EFFORT_DISCIPLINES as readonly string[]).includes(value.toLowerCase());\n}\n\n/**\n * TIS discipline multiplier per canonical discipline. Loaded modalities\n * (strength + the loaded-skill pair kettlebell/gymnastics) score 1.2;\n * recovery absorbs the retired 'yoga' case at 0.9; the monostructural five\n * and bodyweight take the 1.0 default. Unknown/absent disciplines fall back\n * to 1.0 — the historical behavior for every non-'strength' value.\n */\nexport const DISCIPLINE_FACTORS: Record<EffortDiscipline, number> = {\n strength: 1.2,\n kettlebell: 1.2,\n gymnastics: 1.2,\n recovery: 0.9,\n bodyweight: 1.0,\n cycling: 1.0,\n rowing: 1.0,\n running: 1.0,\n swimming: 1.0,\n walking: 1.0,\n};\n\n/** Factor for an arbitrary discipline string; 1.0 when absent or unknown. */\nexport function disciplineFactorFor(discipline: string | undefined): number {\n if (!discipline) return 1.0;\n const key = discipline.toLowerCase();\n return isEffortDiscipline(key) ? DISCIPLINE_FACTORS[key] : 1.0;\n}\n","/**\n * Fuzzy Alias Matching — Levenshtein Distance\n *\n * Edit-distance based fuzzy matching for effort alias resolution.\n * Default threshold: ≤ 2 (configurable per instance).\n */\n\n/**\n * Compute the Levenshtein edit distance between two strings.\n * Time: O(m × n), Space: O(min(m, n))\n */\nexport function levenshteinDistance(a: string, b: string): number {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n\n // Ensure 'a' is the shorter string for space optimization\n if (a.length > b.length) {\n const tmp = a;\n a = b;\n b = tmp;\n }\n\n const m = a.length;\n const n = b.length;\n\n // Early exit: if length difference exceeds threshold, we can still compute,\n // but callers typically short-circuit. Keep full correctness here.\n let prev = new Uint32Array(m + 1);\n let curr = new Uint32Array(m + 1);\n\n for (let i = 0; i <= m; i++) {\n prev[i] = i;\n }\n\n for (let j = 1; j <= n; j++) {\n curr[0] = j;\n const bj = b.charCodeAt(j - 1);\n for (let i = 1; i <= m; i++) {\n const cost = a.charCodeAt(i - 1) === bj ? 0 : 1;\n curr[i] = Math.min(\n prev[i] + 1, // deletion\n curr[i - 1] + 1, // insertion\n prev[i - 1] + cost // substitution\n );\n }\n const swap = prev;\n prev = curr;\n curr = swap;\n }\n\n return prev[m];\n}\n\n/**\n * Normalise a string for fuzzy comparison:\n * - lower-case\n * - trim whitespace\n * - strip punctuation\n * - collapse multiple spaces\n */\nexport function normalizeForFuzzy(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}\\s-]/gu, ' ')\n .replace(/[-_]+/g, ' ')\n .trim()\n .replace(/\\s+/g, ' ');\n}\n\n/**\n * Check whether two strings are within a given edit-distance threshold.\n */\nexport function isWithinThreshold(a: string, b: string, threshold: number): boolean {\n const na = normalizeForFuzzy(a);\n const nb = normalizeForFuzzy(b);\n\n // Fast path: exact match\n if (na === nb) return true;\n\n // Fast path: length difference already exceeds threshold\n if (Math.abs(na.length - nb.length) > threshold) return false;\n\n return levenshteinDistance(na, nb) <= threshold;\n}\n\n/**\n * Score a fuzzy match candidate. Lower is better (0 = exact).\n */\nexport interface FuzzyCandidate {\n readonly target: string;\n readonly distance: number;\n}\n\n/**\n * Find the best fuzzy match for `query` among `candidates`.\n * Returns `null` if no candidate is within `threshold`.\n */\nexport function findBestFuzzyMatch(\n query: string,\n candidates: readonly string[],\n threshold: number\n): FuzzyCandidate | null {\n const nq = normalizeForFuzzy(query);\n let best: FuzzyCandidate | null = null;\n\n for (const candidate of candidates) {\n const nc = normalizeForFuzzy(candidate);\n\n // Length-difference fast path\n if (Math.abs(nq.length - nc.length) > threshold) continue;\n\n const distance = levenshteinDistance(nq, nc);\n if (distance > threshold) continue;\n\n if (!best || distance < best.distance) {\n best = { target: candidate, distance };\n // Can't get better than exact\n if (distance === 0) break;\n }\n }\n\n return best;\n}\n","/**\n * Effort Resolver — Analytics Boundary\n *\n * Implements IEffortResolver with exact and fuzzy alias matching.\n * Creates synthetic unresolved efforts for unmatched labels.\n */\n\nimport { v7 as uuidv7 } from 'uuid';\nimport { disciplineFactorFor } from './disciplines';\nimport type {\n IEffort,\n IEffortRegistry,\n IEffortResolver,\n EffortResolverOptions,\n EffortResolutionOptions,\n ResolvedEffort,\n EffortResolvedFrom,\n} from './types';\nimport { DEFAULT_RESOLVER_OPTIONS } from './types';\nimport { findBestFuzzyMatch, normalizeForFuzzy } from './fuzzyMatch';\n\nfunction normalizeSlug(label: string): string {\n return normalizeForFuzzy(label).replace(/\\s+/g, '-');\n}\n\nexport class EffortResolver implements IEffortResolver {\n private options: Required<EffortResolverOptions>;\n\n constructor(\n private readonly registry: IEffortRegistry,\n options?: EffortResolverOptions,\n ) {\n this.options = {\n defaultMet: options?.defaultMet ?? DEFAULT_RESOLVER_OPTIONS.defaultMet,\n defaultThreshold:\n options?.defaultThreshold ?? DEFAULT_RESOLVER_OPTIONS.defaultThreshold,\n };\n }\n\n resolveBySlug(slug: string): IEffort | null {\n return this.registry.resolve(slug);\n }\n\n resolveByAlias(label: string): IEffort | null {\n const normalized = normalizeForFuzzy(label);\n for (const effort of this.registry.list()) {\n if (normalizeForFuzzy(effort.label) === normalized) return effort;\n for (const alias of effort.aliases) {\n if (normalizeForFuzzy(alias) === normalized) return effort;\n }\n }\n return null;\n }\n\n resolveFuzzy(\n label: string,\n options?: { threshold?: number },\n ): IEffort {\n const threshold = options?.threshold ?? this.options.defaultThreshold;\n const normalized = normalizeForFuzzy(label);\n\n // 1. Exact alias/slug match (distance 0)\n const exact = this.resolveByAlias(label);\n if (exact) return exact;\n\n // 2. Fuzzy alias matching\n const candidates: { alias: string; effort: IEffort }[] = [];\n for (const effort of this.registry.list()) {\n for (const alias of [effort.label, ...effort.aliases]) {\n candidates.push({ alias, effort });\n }\n }\n\n const best = findBestFuzzyMatch(\n normalized,\n candidates.map((c) => c.alias),\n threshold,\n );\n\n if (best) {\n const matched = candidates.find(\n (c) => normalizeForFuzzy(c.alias) === normalizeForFuzzy(best.target),\n );\n if (matched) {\n return matched.effort;\n }\n }\n\n // 3. Synthetic fallback\n return this.createSyntheticEffort(label);\n }\n\n resolveEffort(label: string, options?: EffortResolutionOptions): ResolvedEffort {\n const effort = this.resolveBySlug(label)\n ?? this.resolveByAlias(label)\n ?? this.resolveFuzzy(label, { threshold: options?.threshold });\n return this.resolveDefinition(effort, options);\n }\n\n resolveDefinition(effort: IEffort, options?: EffortResolutionOptions): ResolvedEffort {\n return this.materialize(effort, options?.modifiers ?? {}, new Set<string>());\n }\n\n list(): readonly IEffort[] {\n return this.registry.list();\n }\n\n private materialize(\n definition: IEffort,\n modifiers: Record<string, string>,\n seen: Set<string>,\n ): ResolvedEffort {\n if (seen.has(definition.slug)) {\n throw new Error(`EffortResolver: circular effort derivation detected at \"${definition.slug}\"`);\n }\n seen.add(definition.slug);\n\n const parent = definition.derivation?.parentSlug\n ? this.registry.resolve(definition.derivation.parentSlug)\n : null;\n const parentResolved = parent ? this.materialize(parent, modifiers, seen) : null;\n\n let met = parentResolved?.met ?? definition.baseAttributes.met;\n const coefficients = definition.derivation?.coefficients ?? {};\n for (const [key, coefficient] of Object.entries(coefficients)) {\n if (this.shouldApplyCoefficient(key, modifiers)) {\n met *= coefficient;\n }\n }\n\n const hardMet = definition.derivation?.hardOverrides?.met;\n if (typeof hardMet === 'number' && Number.isFinite(hardMet)) {\n met = hardMet;\n }\n\n const discipline = definition.baseAttributes.discipline ?? parentResolved?.discipline;\n const disciplineFactor = this.resolveDisciplineFactor(definition, parentResolved);\n const registrySource = definition.registrySource;\n const resolvedFrom: EffortResolvedFrom = registrySource === 'user'\n ? 'user'\n : registrySource === 'bundled'\n ? 'bundled'\n : 'default';\n const isEstimated = registrySource === 'synthetic-unresolved';\n\n const effort: IEffort = {\n ...definition,\n baseAttributes: {\n ...definition.baseAttributes,\n met,\n discipline,\n disciplineFactor,\n intensityTier: definition.baseAttributes.intensityTier ?? parentResolved?.intensityTier,\n },\n };\n\n return {\n effort,\n definition,\n slug: effort.slug,\n label: effort.label,\n met,\n baseAttributes: effort.baseAttributes,\n discipline,\n disciplineFactor,\n intensityTier: effort.baseAttributes.intensityTier,\n modifiers: { ...modifiers },\n registrySource,\n resolvedFrom,\n isEstimated,\n };\n }\n\n private shouldApplyCoefficient(key: string, modifiers: Record<string, string>): boolean {\n if (key === 'met' || key === '*') return true;\n for (const [modifierKey, modifierValue] of Object.entries(modifiers)) {\n if (\n key === modifierKey ||\n key === modifierValue ||\n key === `${modifierKey}:${modifierValue}` ||\n key === `${modifierKey}=${modifierValue}`\n ) {\n return true;\n }\n }\n return false;\n }\n\n private resolveDisciplineFactor(definition: IEffort, parent?: ResolvedEffort | null): number {\n const hardOverride = definition.derivation?.hardOverrides?.disciplineFactor;\n if (typeof hardOverride === 'number' && Number.isFinite(hardOverride)) return hardOverride;\n\n const explicit = definition.baseAttributes.disciplineFactor;\n if (typeof explicit === 'number' && Number.isFinite(explicit)) return explicit;\n\n const discipline = definition.baseAttributes.discipline ?? parent?.discipline;\n if (!discipline && parent) return parent.disciplineFactor;\n\n return disciplineFactorFor(discipline);\n }\n\n /**\n * Create a synthetic unresolved effort for analytics continuity.\n * Not persisted to the registry.\n */\n private createSyntheticEffort(label: string): IEffort {\n const normalizedLabel = normalizeForFuzzy(label);\n const slug = normalizeSlug(label);\n return {\n id: `synthetic-${uuidv7()}`,\n slug,\n label: normalizedLabel,\n aliases: [normalizedLabel],\n baseAttributes: {\n met: this.options.defaultMet,\n discipline: undefined,\n intensityTier: undefined,\n },\n registrySource: 'synthetic-unresolved',\n };\n }\n}\n","/**\n * Effort Registry — Test Fixtures\n *\n * Deterministic mock effort sets for unit and integration tests.\n * Covers common test scenarios: running, strength, low MET, high MET,\n * user-derived efforts, and synthetic unresolved.\n */\n\nimport type { IEffort } from './types';\n\nexport const fixtureRunning: IEffort = {\n id: 'fixture-running',\n slug: 'running-6-mph',\n label: 'Running (6 mph)',\n aliases: ['run', 'jogging', 'treadmill'],\n baseAttributes: { met: 9.8, discipline: 'running', intensityTier: 'moderate' },\n registrySource: 'bundled',\n};\n\nexport const fixtureRowing: IEffort = {\n id: 'fixture-rowing',\n slug: 'rowing',\n label: 'Rowing',\n aliases: ['row', 'rower', 'erg'],\n baseAttributes: { met: 7.0, discipline: 'rowing', intensityTier: 'high' },\n registrySource: 'bundled',\n};\n\nexport const fixtureBackSquat: IEffort = {\n id: 'fixture-back-squat',\n slug: 'back-squat',\n label: 'Back Squat',\n aliases: ['squat', 'barbell squat', 'bs'],\n baseAttributes: { met: 6.0, discipline: 'strength', intensityTier: 'moderate' },\n registrySource: 'bundled',\n};\n\nexport const fixtureBurpee: IEffort = {\n id: 'fixture-burpee',\n slug: 'burpee',\n label: 'Burpee',\n aliases: ['burpees'],\n baseAttributes: { met: 10.0, discipline: 'bodyweight', intensityTier: 'high' },\n registrySource: 'bundled',\n};\n\nexport const fixturePlank: IEffort = {\n id: 'fixture-plank',\n slug: 'plank',\n label: 'Plank',\n aliases: ['planks'],\n baseAttributes: { met: 3.5, discipline: 'bodyweight', intensityTier: 'low' },\n registrySource: 'bundled',\n};\n\nexport const fixtureUserCustom: IEffort = {\n id: 'fixture-user-custom',\n slug: 'my-custom-hiit',\n label: 'My Custom HIIT Circuit',\n aliases: ['hiit', 'custom circuit'],\n baseAttributes: { met: 8.5, discipline: 'strength', intensityTier: 'high' },\n registrySource: 'user',\n derivation: {\n parentSlug: 'burpee',\n coefficients: { met: 1.2 },\n },\n createdAt: '2024-01-15T10:00:00Z',\n updatedAt: '2024-01-15T10:00:00Z',\n};\n\n/** A user effort that overrides a bundled effort by slug collision */\nexport const fixtureUserOverride: IEffort = {\n id: 'fixture-user-override',\n slug: 'rowing',\n label: 'Rowing (Calibrated)',\n aliases: ['row', 'rower', 'erg'],\n baseAttributes: { met: 8.5, discipline: 'rowing', intensityTier: 'high' },\n registrySource: 'user',\n createdAt: '2024-02-01T08:00:00Z',\n updatedAt: '2024-02-01T08:00:00Z',\n};\n\n/** Common bundled fixture set — covers running, rowing, strength, bodyweight, low MET */\nexport const commonFixtureSet: readonly IEffort[] = [\n fixtureRunning,\n fixtureRowing,\n fixtureBackSquat,\n fixtureBurpee,\n fixturePlank,\n];\n\n/** Full fixture set including user efforts */\nexport const fullFixtureSet: readonly IEffort[] = [\n ...commonFixtureSet,\n fixtureUserCustom,\n fixtureUserOverride,\n];\n","import { commonFixtureSet } from '../fixtures';\nimport type { IEffort } from '../types';\n\n/** All bundled efforts — seeded with common fixture set for headless/standalone runtime */\nexport const bundledEfforts: readonly IEffort[] = commonFixtureSet;\n\n/** Number of bundled efforts */\nexport const BUNDLED_EFFORT_COUNT = bundledEfforts.length;\n","import type { IEffort, IEffortRegistry, EffortRegistrySource } from './types';\nimport { bundledEfforts } from './data/bundled-efforts';\n\n/**\n * In-Memory Effort Registry\n *\n * Stores all efforts in a Map indexed by slug.\n * Used for:\n * - Unit tests (deterministic, no I/O)\n * - Storybook / static builds (no IndexedDB)\n * - Bundled seed fallback\n */\nexport class InMemoryEffortRegistry implements IEffortRegistry {\n private efforts = new Map<string, IEffort>();\n private sourceFilter: EffortRegistrySource | null = null;\n\n constructor(sourceFilter?: EffortRegistrySource) {\n this.sourceFilter = sourceFilter ?? null;\n }\n\n /** Seed with bundled efforts */\n async loadBundled(): Promise<void> {\n for (const effort of bundledEfforts) {\n if (!this.sourceFilter || effort.registrySource === this.sourceFilter) {\n this.efforts.set(effort.slug, effort);\n }\n }\n }\n\n /** Seed with arbitrary efforts (useful for tests) */\n seed(efforts: readonly IEffort[]): void {\n for (const effort of efforts) {\n this.efforts.set(effort.slug, effort);\n }\n }\n\n /** Clear all efforts */\n clear(): void {\n this.efforts.clear();\n }\n\n resolve(slug: string): IEffort | null {\n return this.efforts.get(slug) ?? null;\n }\n\n list(): readonly IEffort[] {\n return Array.from(this.efforts.values());\n }\n\n listByOrigin(origin: EffortRegistrySource): readonly IEffort[] {\n return this.list().filter((e) => e.registrySource === origin);\n }\n\n async upsert(effort: IEffort): Promise<void> {\n if (effort.registrySource !== 'user') {\n throw new Error(\n `InMemoryEffortRegistry.upsert: only user efforts can be written. Received registrySource=\"${effort.registrySource}\"`\n );\n }\n this.efforts.set(effort.slug, effort);\n }\n\n async delete(slug: string): Promise<void> {\n const existing = this.efforts.get(slug);\n if (existing && existing.registrySource !== 'user') {\n throw new Error(\n `InMemoryEffortRegistry.delete: cannot delete non-user effort \"${slug}\"`\n );\n }\n this.efforts.delete(slug);\n }\n}\n","import { IRuntimeBlock } from './IRuntimeBlock';\nimport type { TestableBlockConfig } from './ITestableBlockConfig';\n\n/**\n * Factory function type for wrapping blocks in debug mode.\n * Receives the original block and returns a wrapped version.\n */\nexport type BlockWrapperFactory = (block: IRuntimeBlock, config?: TestableBlockConfig) => IRuntimeBlock;\n\n/**\n * Configuration options for ScriptRuntime initialization.\n * These options control debugging, logging, and testing capabilities.\n */\nexport interface IRuntimeOptions {\n /**\n * Enable debug mode for the runtime.\n * When true:\n * - All blocks pushed to the stack are automatically wrapped with TestableBlock\n * - Additional lifecycle events are logged\n */\n debugMode?: boolean;\n\n /**\n * Custom factory for wrapping blocks when debugMode is true.\n * If not provided, uses the default TestableBlock wrapper with spy mode.\n */\n blockWrapperFactory?: BlockWrapperFactory;\n\n /**\n * Default configuration for TestableBlock wrappers.\n * Applied to all blocks wrapped in debug mode unless overridden.\n */\n defaultTestableConfig?: Partial<TestableBlockConfig>;\n\n /**\n * Enable console logging for runtime debug output.\n * Automatically set to true when debugMode is true.\n */\n enableLogging?: boolean;\n\n /**\n * Custom log handler for debug events.\n * If provided, called in addition to console logging.\n */\n onDebugLog?: (event: DebugLogEvent) => void;\n\n /**\n * Maximum depth for nested actions within a single execution turn.\n * Defaults to 20 if not specified.\n */\n maxActionDepth?: number;\n}\n\n/**\n * Types of debug log events\n */\nexport type DebugLogEventType =\n | 'block-wrapped'\n | 'block-mount'\n | 'block-next'\n | 'block-unmount'\n | 'block-dispose'\n | 'stack-push'\n | 'stack-pop'\n | 'memory-allocate'\n | 'memory-release'\n | 'event-handled';\n\n/**\n * Debug log event structure\n */\nexport interface DebugLogEvent {\n type: DebugLogEventType;\n timestamp: number;\n blockKey?: string;\n blockType?: string;\n details?: Record<string, any>;\n}\n\n/**\n * Default runtime options\n */\nexport const DEFAULT_RUNTIME_OPTIONS: Required<Omit<IRuntimeOptions, 'blockWrapperFactory' | 'onDebugLog' | 'defaultTestableConfig'>> = {\n debugMode: false,\n enableLogging: false,\n maxActionDepth: 20,\n};\n\n\n\nexport interface RuntimeStackWrapper {\n wrap?: (block: IRuntimeBlock, parent?: IRuntimeBlock) => IRuntimeBlock;\n cleanup?: (block: IRuntimeBlock) => void;\n}\n\nexport interface RuntimeStackLogger {\n debug?: (message: string, details?: Record<string, unknown>) => void;\n error?: (message: string, error: unknown, details?: Record<string, unknown>) => void;\n}\n\nexport interface RuntimeStackHooks {\n onBeforePush?: (block: IRuntimeBlock, parent?: IRuntimeBlock) => void;\n onAfterPush?: (block: IRuntimeBlock, parent?: IRuntimeBlock) => void;\n onBeforePop?: (block: IRuntimeBlock | undefined) => void;\n onAfterPop?: (block: IRuntimeBlock | undefined) => void;\n unregisterByOwner?: (ownerKey: string) => void;\n}\n\nexport interface RuntimeStackOptions extends IRuntimeOptions {\n wrapper?: RuntimeStackWrapper;\n logger?: RuntimeStackLogger;\n hooks?: RuntimeStackHooks;\n analyticsOptions?: {\n effortResolver?: import('../../effort-registry/types').IEffortResolver;\n userProfile?: { vo2max?: number };\n };\n}\n","/**\n * TimeSpan represents a discrete segment of a block's **Time** — a single\n * start/stop recording within the spans collection.\n *\n * Multiple TimeSpans allow for pause/resume tracking.\n *\n * Note: The `.duration` getter computes the length of this individual span\n * (end − start). This differs from the glossary term **Duration**, which\n * refers to the parser-defined planned target. To avoid confusion, prefer\n * the term \"span length\" when discussing individual span measurements.\n *\n * @see docs/architecture/time-terminology.md\n */\nimport type { TimeSpan as TimeSpanShape } from '@bitcobblers/wod-wiki-core';\n\nexport class TimeSpan implements TimeSpanShape {\n constructor(\n public started: number,\n public ended?: number\n ) { }\n\n static fromJSON(json: any): TimeSpan {\n return new TimeSpan(json.started, json.ended);\n }\n\n /**\n * Create a TimeSpan from Date objects (legacy support/compatibility)\n */\n static fromDates(start: Date, end?: Date): TimeSpan {\n return new TimeSpan(start.getTime(), end?.getTime());\n }\n\n /**\n * Length of this individual span in milliseconds.\n * Uses current time if the span is still open.\n *\n * Note: Not to be confused with the glossary term \"Duration\" which\n * refers to the parser-defined planned target (DurationMetric).\n */\n get duration(): number {\n const end = this.ended ?? Date.now();\n return Math.max(0, end - this.started);\n }\n\n /**\n * Whether the span is currently open (no end time).\n */\n get isOpen(): boolean {\n return this.ended === undefined;\n }\n\n get startDate(): Date {\n return new Date(this.started);\n }\n\n get endDate(): Date | undefined {\n return this.ended ? new Date(this.ended) : undefined;\n }\n}\n","import { IRuntimeClock } from './contracts/IRuntimeClock';\nimport { } from '@bitcobblers/wod-wiki-core';\nimport { TimeSpan } from './models/TimeSpan';\n\n\n/**\n * SnapshotClock wraps an IRuntimeClock and freezes `currentDate` at a specific timestamp.\n * Used to ensure consistent timing during execution chains (pop → next → push).\n *\n * All other properties and methods delegate to the underlying clock.\n *\n * @example\n * ```typescript\n * // Freeze time at completion moment\n * const createdAt = new Date();\n * const snapshot = SnapshotClock.at(runtime.clock, createdAt);\n *\n * // All operations see the same frozen time\n * parent.next(runtime, { clock: snapshot });\n * // child pushed with startTime = snapshot.currentDate = createdAt\n * ```\n */\nexport class SnapshotClock implements IRuntimeClock {\n constructor(\n private readonly _underlying: IRuntimeClock,\n private readonly _frozenTime: Date\n ) {}\n\n /** Always returns the frozen timestamp */\n get currentDate(): Date {\n return this._frozenTime;\n }\n\n now(): Date {\n return this._frozenTime;\n }\n\n nowMs(): number {\n return this._frozenTime.getTime();\n }\n\n /** Delegate to underlying clock */\n get elapsed(): number {\n return this._underlying.elapsed;\n }\n\n get isRunning(): boolean {\n return this._underlying.isRunning;\n }\n\n get spans(): ReadonlyArray<TimeSpan> {\n return this._underlying.spans;\n }\n\n start(): Date {\n return this._underlying.start();\n }\n\n stop(): Date {\n return this._underlying.stop();\n }\n\n /**\n * Factory method for cleaner creation.\n *\n * @param clock The underlying clock to wrap\n * @param time The frozen timestamp to return from `currentDate`\n */\n static at(clock: IRuntimeClock, time: Date): SnapshotClock {\n return new SnapshotClock(clock, time);\n }\n\n /**\n * Create a snapshot at the clock's current time.\n * Useful for freezing `currentDate` before starting an execution chain.\n *\n * @param clock The clock to snapshot\n */\n static now(clock: IRuntimeClock): SnapshotClock {\n return new SnapshotClock(clock, clock.currentDate);\n }\n}\n\n\n/**\n * RuntimeClock tracks time using spans created by start/stop calls.\n * \n * Provides:\n * - `now`: Current wall-clock time as a Date\n * - `elapsed`: Total milliseconds of running time (sum of all spans)\n * - `start()`/`stop()`: Control methods that return timestamps for event creation\n */\nexport class RuntimeClock implements IRuntimeClock {\n private _spans: TimeSpan[] = [];\n\n /**\n * Current wall-clock time as a Date.\n */\n public get currentDate(): Date {\n return new Date();\n }\n\n now(): Date {\n return this.currentDate;\n }\n\n nowMs(): number {\n return this.currentDate.getTime();\n }\n\n /**\n * Whether the clock is currently running (has an open span without a stop time).\n */\n public get isRunning(): boolean {\n if (this._spans.length === 0) return false;\n return this._spans[this._spans.length - 1].isOpen;\n }\n\n /**\n * All time spans tracked by this clock.\n */\n public get spans(): ReadonlyArray<TimeSpan> {\n return this._spans;\n }\n\n /**\n * Total elapsed milliseconds while running.\n * Sums all completed spans plus the current running span (if any).\n */\n public get elapsed(): number {\n return this._spans.reduce((total, span) => total + span.duration, 0);\n }\n\n /**\n * Start the clock. Creates a new span with the current time.\n * Returns the start timestamp for event creation.\n * \n * If the clock is already running, returns the current span's start time.\n */\n public start(): Date {\n const now = new Date();\n // If already running, return the current span's start\n if (this.isRunning) {\n return this._spans[this._spans.length - 1].startDate;\n }\n\n this._spans.push(new TimeSpan(now.getTime()));\n return now;\n }\n\n /**\n * Stop the clock. Closes the current span with the current time.\n * Returns the stop timestamp for event creation.\n * \n * If the clock is not running, returns the current time.\n */\n public stop(): Date {\n const now = new Date();\n\n // If not running, just return current time\n if (!this.isRunning) {\n return now;\n }\n\n // Close the current span\n this._spans[this._spans.length - 1].ended = now.getTime();\n return now;\n }\n\n /**\n * Reset the clock. Clears all spans.\n */\n public reset(): void {\n this._spans = [];\n }\n}\n\n/**\n * Type for the mock clock returned by createMockClock.\n */\nexport type MockClock = IRuntimeClock & {\n /** Advance the mock time by the specified milliseconds */\n advance: (ms: number) => void;\n /** Set the mock time to a specific Date */\n setTime: (time: Date) => void;\n};\n\n/**\n * Creates a mock clock for testing with controllable time.\n */\nexport function createMockClock(initialTime: Date = new Date()): MockClock {\n let currentTime = initialTime;\n const spans: TimeSpan[] = [];\n\n return {\n get currentDate() { return currentTime; },\n now() { return currentTime; },\n nowMs() { return currentTime.getTime(); },\n get elapsed() {\n return spans.reduce((total, span) => total + span.duration, 0);\n },\n get isRunning() {\n if (spans.length === 0) return false;\n return spans[spans.length - 1].isOpen;\n },\n get spans() { return spans; },\n start() {\n if (spans.length > 0 && spans[spans.length - 1].ended === undefined) {\n return spans[spans.length - 1].startDate;\n }\n const timestamp = new Date(currentTime);\n spans.push(new TimeSpan(timestamp.getTime()));\n return timestamp;\n },\n stop() {\n const timestamp = new Date(currentTime);\n if (spans.length > 0 && spans[spans.length - 1].ended === undefined) {\n spans[spans.length - 1].ended = timestamp.getTime();\n }\n return timestamp;\n },\n advance(ms: number) {\n currentTime = new Date(currentTime.getTime() + ms);\n },\n setTime(time: Date) {\n currentTime = time;\n },\n };\n}\n","/**\n * INowProvider — the only seam for \"what time is it\" in the runtime.\n * Events, actions, and behaviors that need a timestamp take a now-fn\n * in their constructor; the runtime passes its single provider down.\n * Tests pass a frozen clock so the timeline is deterministic.\n */\nexport interface INowProvider {\n now(): Date;\n nowMs(): number;\n}\n\n/** Default provider: reads wall clock. */\nexport const wallClockNow: INowProvider = {\n now: () => new Date(),\n nowMs: () => Date.now(),\n};\n\n/** A provider that always returns the same Date (for tests). */\nexport function frozenNow(at: Date): INowProvider {\n return { now: () => at, nowMs: () => at.getTime() };\n}\n","import { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\nimport { BlockLifecycleOptions } from '../../contracts/IRuntimeBlock';\nimport { SnapshotClock } from '../../RuntimeClock';\nimport { INowProvider, wallClockNow } from '../../INowProvider';\nexport class NextAction implements IRuntimeAction {\n readonly type = 'next';\n\n /**\n * @param options Optional lifecycle options to pass to the block's next() method.\n * When provided (e.g., from PopBlockAction carrying createdAt), these options\n * are merged with a snapshot clock. When omitted (e.g., user-triggered next),\n * a fresh snapshot clock is created.\n */\n constructor(\n private readonly options?: BlockLifecycleOptions,\n private readonly now: INowProvider = wallClockNow,\n ) {}\n\n do(runtime: IRuntimeContext): IRuntimeAction[] {\n // Validate runtime state\n if (!this.validateRuntimeState(runtime)) {\n return [];\n }\n\n // Get current block\n const currentBlock = runtime.stack.current;\n if (!currentBlock) {\n return [];\n }\n\n try {\n // Build lifecycle options: merge any provided options with a snapshot clock.\n // The snapshot clock ensures any child blocks pushed during next() start at the same time.\n const snapshotClock = runtime.clock \n ? { clock: SnapshotClock.now(runtime.clock) } \n : undefined;\n const lifecycleOptions = { ...snapshotClock, ...this.options };\n\n // Execute block's next logic with the lifecycle options\n // System output for next lifecycle is now emitted by RuntimeBlock.next() itself\n return currentBlock.next(runtime, lifecycleOptions);\n\n } catch (error) {\n // Add error to runtime errors array if available\n if (runtime.errors && Array.isArray(runtime.errors)) {\n runtime.errors.push({\n error: error as Error,\n source: 'NextAction',\n timestamp: this.now.now(),\n blockKey: currentBlock.key.toString()\n });\n }\n return [];\n }\n }\n\n private validateRuntimeState(runtime: IRuntimeContext): boolean {\n // Check for undefined/null stack\n if (!runtime.stack) {\n return false;\n }\n\n // Note: We intentionally do NOT check runtime.errors here.\n // The errors array is append-only and never cleared, so a single\n // transient error would permanently halt all block advancement.\n // Errors are logged and tracked separately; NextAction should\n // continue to function so the user can still advance.\n\n return true;\n }\n}\n","import { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../contracts/IRuntimeContext';\nimport type { RuntimeError } from '../contracts/IRuntimeError';\n\nexport type { RuntimeError };\n\n/**\n * Action for pushing errors to the runtime error list.\n * \n * This action provides centralized error handling by collecting errors\n * in the runtime instead of using EventHandlerResponse.abort flags.\n * \n * Actions can check `runtime.errors.length > 0` to abort processing.\n * \n * @example\n * ```typescript\n * // Push an error during event handling\n * try {\n * // ... some operation\n * } catch (error) {\n * return [new ErrorAction(error as Error, 'TimerBehavior')];\n * }\n * \n * // Check for errors before proceeding\n * if (runtime.errors && runtime.errors.length > 0) {\n * return []; // Abort further processing\n * }\n * ```\n */\nexport class ErrorAction implements IRuntimeAction {\n readonly type = 'error';\n\n constructor(\n /** The error that occurred */\n public readonly error: Error,\n /** Source of the error (block ID, handler ID, etc.) */\n public readonly source: string,\n /** Additional context about the error */\n public readonly context?: unknown\n ) { }\n\n do(runtime: IRuntimeContext): void {\n // Initialize errors array if it doesn't exist\n // Use type assertion for runtime with mutable errors array\n const runtimeWithErrors = runtime as IRuntimeContext & { errors: RuntimeError[] };\n if (!runtimeWithErrors.errors) {\n runtimeWithErrors.errors = [];\n }\n\n const runtimeError: RuntimeError = {\n error: this.error,\n source: this.source,\n timestamp: new Date(),\n context: this.context\n };\n\n runtimeWithErrors.errors.push(runtimeError);\n\n console.error(`❌ Runtime Error from ${this.source}:`, this.error.message);\n if (this.context) {\n console.error(` Context:`, this.context);\n }\n }\n}\n","import { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../contracts/IRuntimeContext';\nimport { ErrorAction } from './ErrorAction';\n\n/**\n * Action that registers a runtime error and transitions the workout to an error state.\n */\nexport class ThrowErrorAction implements IRuntimeAction {\n readonly type = 'throw-error';\n\n constructor(\n private readonly error: Error,\n private readonly source: string\n ) { }\n\n do(runtime: IRuntimeContext): void {\n // Register the error in the runtime\n new ErrorAction(this.error, this.source).do(runtime);\n\n // Emit error state via event bus so UI can react\n runtime.eventBus.dispatch({\n name: 'workout:error',\n timestamp: runtime.clock.currentDate,\n data: { error: this.error, source: this.source }\n }, runtime);\n }\n}\n\n/**\n * Factory function to create a ThrowErrorAction.\n */\nexport function ThrowError(error: Error, source: string): IRuntimeAction {\n return new ThrowErrorAction(error, source);\n}\n","import { IEvent } from '../contracts/events/IEvent';\nimport { IEventHandler } from '../contracts/events/IEventHandler';\nimport { IScriptRuntime } from '../contracts/IScriptRuntime';\nimport { NextAction } from '../actions/stack/NextAction';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { ThrowError } from '../actions/ThrowError';\n\nexport class NextEventHandler implements IEventHandler {\n private _id: string;\n private _name: string;\n\n constructor(id: string) {\n this._id = id;\n this._name = 'next-handler';\n }\n\n get id(): string {\n return this._id;\n }\n\n set id(_value: string) {\n throw new Error('Cannot modify readonly property id');\n }\n\n get name(): string {\n return this._name;\n }\n\n set name(_value: string) {\n throw new Error('Cannot modify readonly property name');\n }\n\n handler(event: IEvent, runtime: IScriptRuntime): IRuntimeAction[] {\n // Event filtering\n if (event.name !== 'next') {\n return [];\n }\n\n // Minimal validation: check runtime existence and non-empty stack\n if (!runtime || !runtime.stack || runtime.stack.count === 0) {\n return [ThrowError(new Error('Invalid runtime state for next event'), 'NextEventHandler')];\n }\n\n // Generate next action\n return [new NextAction(undefined, runtime.nowProvider)];\n }\n}\n","import { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\n\n/**\n * Action that aborts the current session by force-popping all blocks from the stack.\n *\n * Unlike PopBlockAction (which pops one block and calls parent.next()), AbortSessionAction\n * drains the entire stack without triggering parent advancement or pushing new children.\n *\n * Each block receives the full lifecycle:\n * 1. markComplete('user-abort') — marks the block as intentionally terminated\n * 2. unmount() — runs behaviors (e.g. ReportOutputBehavior) which write result memory\n * 3. stack.pop() — triggers emitSegmentFromResultMemory in ScriptRuntime, the sole\n * site that turns a pop into a 'segment' OutputStatement\n * 4. dispose() — releases block resources\n *\n * This ensures every aborted block still gets a well-formed 'segment' output\n * (checked by assertPairedOutputs() in tests).\n */\nexport class AbortSessionAction implements IRuntimeAction {\n readonly type = 'abort-session';\n\n do(runtime: IRuntimeContext): IRuntimeAction[] {\n const MAX_ITERATIONS = 100; // Safety limit to prevent infinite loops\n let iterations = 0;\n const collectedActions: IRuntimeAction[] = [];\n\n while (iterations < MAX_ITERATIONS && runtime.stack.count > 0) {\n const current = runtime.stack.current;\n if (!current) break;\n\n // Mark block as complete before unmounting so behaviors know it's intentionally ended\n if (!current.isComplete && typeof current.markComplete === 'function') {\n current.markComplete('user-abort');\n }\n\n // Unmount runs ReportOutputBehavior.onUnmount(), which writes result memory\n // (elapsed/spans/round) that the later stack.pop() reads to build the 'segment'\n // output. Filter out 'emit-event' actions to prevent cascading timer:complete /\n // timer:stop events from triggering further block transitions during the abort drain.\n const unmountActions = current.unmount(runtime, { createdAt: runtime.clock.currentDate }) ?? [];\n const safeActions = unmountActions.filter(a => a.type !== 'emit-event');\n collectedActions.push(...safeActions);\n\n // Pop from stack — triggers ScriptRuntime's stack subscription which calls\n // emitSegmentOutputFromResultMemory() to emit the 'segment' output.\n const popped = runtime.stack.pop();\n if (!popped) break;\n\n // Release resources\n popped.dispose(runtime);\n popped.context?.release?.();\n\n iterations++;\n }\n\n // Return safe cleanup actions (handler unregistrations, etc.) for the ExecutionContext\n // to process after the stack has been drained.\n return collectedActions;\n }\n}\n","import { IEvent } from '../contracts/events/IEvent';\nimport { IEventHandler } from '../contracts/events/IEventHandler';\nimport { IScriptRuntime } from '../contracts/IScriptRuntime';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { AbortSessionAction } from '../actions/stack/AbortSessionAction';\n\n/**\n * Handles the 'abort' event by initiating an emergency session termination.\n *\n * When dispatched, this handler returns an AbortSessionAction that drains the\n * entire runtime stack — calling proper lifecycle methods on each block so that\n * all open segments receive matching completion outputs.\n *\n * Registered globally in ScriptRuntime (scope: 'global') so it fires regardless\n * of which block is currently active on the stack.\n *\n * @example\n * // Trigger an abort from UI or test code:\n * runtime.handle({ name: 'abort', timestamp: new Date(), data: {} });\n */\nexport class AbortEventHandler implements IEventHandler {\n private readonly _id: string;\n\n constructor(id: string) {\n this._id = id;\n }\n\n get id(): string {\n return this._id;\n }\n\n set id(_value: string) {\n throw new Error('Cannot modify readonly property id');\n }\n\n get name(): string {\n return 'abort-handler';\n }\n\n set name(_value: string) {\n throw new Error('Cannot modify readonly property name');\n }\n\n handler(event: IEvent, runtime: IScriptRuntime): IRuntimeAction[] {\n if (event.name !== 'abort') {\n return [];\n }\n\n if (!runtime || !runtime.stack) {\n return [];\n }\n\n // Nothing to abort if the stack is already empty\n if (runtime.stack.count === 0) {\n return [];\n }\n\n return [new AbortSessionAction()];\n }\n}\n","import { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\nimport { IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\nimport { OutputStatement } from '@bitcobblers/wod-wiki-core';\nimport { } from '@bitcobblers/wod-wiki-core';\nimport { TimeSpan } from '../../models/TimeSpan';\n\n/**\n * Structured data carried by system output metrics.\n */\ninterface SystemOutputValue {\n /** The lifecycle event that triggered this output */\n event: 'push' | 'pop' | 'next' | 'event-action';\n /** The block key involved */\n blockKey: string;\n /** Human-readable block label (if available) */\n blockLabel?: string;\n /** Additional event-specific data */\n [key: string]: unknown;\n}\n\n/**\n * Action that emits a system-level output statement for lifecycle tracing.\n *\n * System outputs are diagnostic records emitted on block push/pop/next\n * and when event handlers produce actions. They flow through the normal\n * output pipeline (runtime.addOutput) and appear alongside segment/completion\n * outputs in the output log.\n *\n * Consumers that don't want system output can filter:\n * outputs.filter(o => o.outputType !== 'system')\n *\n * ## Fragment Encoding\n *\n * Each system output carries a single metrics:\n * - metricType: MetricType.System\n * - type: 'lifecycle' | 'event-action'\n * - image: human-readable message\n * - value: SystemOutputValue with structured data\n * - origin: 'runtime'\n */\nexport class EmitSystemOutputAction implements IRuntimeAction {\n readonly type = 'emit-system-output';\n\n /**\n * @param message Human-readable description (becomes metrics.image)\n * @param event Which lifecycle event triggered this output\n * @param blockKey The block key involved\n * @param blockLabel Optional human-readable block label\n * @param stackLevel Stack depth at time of emission\n * @param extra Additional key-value data to include in the metrics value\n */\n constructor(\n private readonly message: string,\n private readonly event: 'push' | 'pop' | 'next' | 'event-action',\n private readonly blockKey: string,\n private readonly blockLabel?: string,\n private readonly stackLevel?: number,\n private readonly extra?: Record<string, unknown>\n ) {}\n\n do(runtime: IRuntimeContext): IRuntimeAction[] {\n const now = runtime.clock.currentDate;\n\n const value: SystemOutputValue = {\n event: this.event,\n blockKey: this.blockKey,\n blockLabel: this.blockLabel,\n ...this.extra\n };\n\n const metric: IMetric = {\n type: MetricType.System,\n image: this.message,\n value,\n origin: 'runtime',\n timestamp: now,\n };\n\n const output = new OutputStatement({\n outputType: 'system',\n timeSpan: new TimeSpan(now.getTime(), now.getTime()),\n sourceBlockKey: this.blockKey,\n stackLevel: this.stackLevel ?? runtime.stack.count,\n metrics: [metric],\n });\n\n runtime.addOutput(output);\n return [];\n }\n}\n","import { IScriptRuntime } from './contracts/IScriptRuntime';\nimport { IRuntimeAction } from './contracts/IRuntimeAction';\nimport { IRuntimeContext } from './contracts/IRuntimeContext';\nimport { SnapshotClock } from './RuntimeClock';\nimport { IOutputStatement } from '@bitcobblers/wod-wiki-core';\nimport { IEvent } from './contracts/events/IEvent';\nimport { EmitSystemOutputAction } from './actions/stack/EmitSystemOutputAction';\n\n/**\n * ExecutionContext manages a \"turn\" of execution.\n *\n * It wraps a runtime and ensures that all actions pushed during the turn\n * see a consistent frozen clock and share an execution depth limit.\n *\n * This class declares only the narrow {@link IRuntimeContext} surface — the\n * collaborators and verbs the execution world (actions, blocks, behaviors)\n * actually uses mid-turn. The wide `IScriptRuntime` members (subscribeTo*,\n * finalizeAnalytics, setAnalyticsEngine, pushBlock/popBlock, dispose) stay on\n * `ScriptRuntime` for external drivers; they are NOT re-declared here, so\n * adding a member to `IScriptRuntime` no longer forces a matching pass-through.\n *\n * ## Stack Semantics (LIFO)\n *\n * Actions are processed using a **stack** (Last-In-First-Out). When an action\n * produces child actions via `runtime.do()`, those children are pushed onto the\n * stack and executed **before** returning to any remaining sibling actions.\n *\n * This ensures that nested operations (e.g., a pop that triggers a parent.next()\n * which pushes a new child) complete their full depth before processing continues\n * at the parent level — mirroring the natural call-stack behavior of block\n * lifecycle operations.\n *\n * ## Lifecycle\n *\n * 1. Created by `ScriptRuntime.do()` or `ScriptRuntime.handle()` when no active context exists\n * 2. Clock is frozen at creation time (SnapshotClock)\n * 3. Actions are executed from the stack until empty\n * 4. Context is discarded — all actions in the turn shared the same frozen timestamp\n */\nexport class ExecutionContext implements IRuntimeContext {\n private _workList: IRuntimeAction[] = [];\n private _iteration = 0;\n private readonly _maxIterations: number;\n private readonly _snapshotClock: SnapshotClock;\n\n constructor(\n private readonly _runtime: IScriptRuntime,\n maxIterations = 20\n ) {\n this._maxIterations = maxIterations;\n // Freeze the clock at the start of the execution context\n this._snapshotClock = SnapshotClock.at(_runtime.clock, _runtime.clock.currentDate);\n }\n\n // --- Collaborators (delegated to the underlying runtime) ---\n\n get script() { return this._runtime.script; }\n get eventBus() { return this._runtime.eventBus; }\n get stack() { return this._runtime.stack; }\n get options() { return this._runtime.options; }\n get jit() { return this._runtime.jit; }\n get errors() { return this._runtime.errors; }\n get analyticsContext() { return this._runtime.analyticsContext; }\n\n // Use our frozen clock instead of the live runtime clock\n get clock() { return this._snapshotClock; }\n get nowProvider() { return this._runtime.nowProvider; }\n\n addOutput(output: IOutputStatement): void {\n this._runtime.addOutput(output);\n }\n\n /**\n * Pushes an action onto the execution work list to be processed in this turn.\n * Actions pushed during another action's execution land on top of the stack\n * (LIFO / Depth-First semantics).\n */\n do(action: IRuntimeAction): void {\n this._workList.unshift(action);\n }\n\n /**\n * Pushes multiple actions onto the work list. Land on top of the stack\n * in the order provided (first element on very top).\n */\n doAll(actions: IRuntimeAction[]): void {\n if (actions.length === 0) return;\n this._workList.unshift(...actions);\n }\n\n /**\n * Dispatches an event and pushes all resulting actions onto the work list.\n */\n handle(event: IEvent): void {\n const actions = this.eventBus.dispatch(event, this);\n if (actions.length > 0) {\n // `source` is an optional attribution carried by some concrete events\n // beyond the IEvent base; narrow it rather than asserting a shape.\n const source = ('source' in event && typeof event.source === 'string')\n ? event.source\n : 'event-bus';\n const systemOutput = new EmitSystemOutputAction(\n `event: ${event.name} → ${actions.length} action(s)`,\n 'event-action',\n source,\n undefined,\n this.stack.count,\n { eventName: event.name, actionTypes: actions.map(a => a.type) }\n );\n this.doAll([systemOutput, ...actions]);\n } else {\n this.doAll(actions);\n }\n }\n\n /**\n * Executes an initial action and then all subsequent actions on the work list until empty.\n *\n * Uses an 'Ordered Stack' model:\n * 1. **Queued actions (do)** are appended to the back (FIFO).\n * 2. **Returned actions (children)** are prepended to the front (Depth-First).\n * 3. **Execution** always takes from the front.\n *\n * This ensures that nested operations (e.g., a pop that triggers a parent.next())\n * complete their full depth before processing continues at the sibling level,\n * while explicitly queued side-effects run in the order they were triggered.\n *\n * @throws Error if max iterations reached\n */\n execute(initialAction: IRuntimeAction): void {\n this._workList.push(initialAction);\n\n while (this._workList.length > 0) {\n if (this._iteration >= this._maxIterations) {\n const errorMsg = `[ExecutionContext] Max iterations reached (${this._maxIterations}). Aborting to prevent infinite loop.`;\n console.error(errorMsg);\n throw new Error(errorMsg);\n }\n\n // Always take from the front\n const action = this._workList.shift()!;\n this._iteration++;\n\n // Execute the action using THIS context as the runtime.\n const childActions = action.do(this);\n\n // If the action returned child actions, prepend them to the front\n // of the work list to maintain depth-first processing.\n if (childActions && childActions.length > 0) {\n this._workList.unshift(...childActions);\n }\n }\n }\n}\n","import { IOutputStatement, OutputStatement } from '@bitcobblers/wod-wiki-core';\nimport { IAnalyticsEngine } from '../analytics/contracts/IAnalyticsEngine';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\nimport { } from '@bitcobblers/wod-wiki-core';\nimport { TimeSpan } from './models/TimeSpan';\nimport { IRuntimeClock } from './contracts/IRuntimeClock';\nimport { IRuntimeBlock } from './contracts/IRuntimeBlock';\nimport { IRuntimeStack } from './contracts/IRuntimeStack';\nimport { IEvent } from './contracts/events/IEvent';\nimport type { WhiteboardScript } from '../parser/WhiteboardScript';\nimport type { OutputListener } from './contracts/IScriptRuntime';\nimport type { Unsubscribe } from './contracts/IRuntimeStack';\n\n/**\n * OutputEmitter — the single module responsible for everything that flows into\n * the output log: buffering, subscriber notification, analytics enrichment,\n * and all runtime emission helpers.\n *\n * ## Why this exists\n *\n * Previously ScriptRuntime owned the output buffer, 5 private emission methods,\n * analytics integration, and subscriber management — 8 separate emission sites\n * scattered across the runtime. OutputEmitter concentrates all of that behind a\n * narrow interface so that:\n *\n * - **Locality**: every output invariant (GC guard for system outputs, analytics\n * enrichment, listener error isolation) lives in one place.\n * - **Leverage**: callers call `add()` and the whole policy runs automatically.\n * - **Testability**: the output pipeline can be tested without constructing a\n * full ScriptRuntime.\n *\n * ## Interface\n *\n * ```\n * add(output) — buffer + notify (called by runtime, behaviors, blocks)\n * subscribe(listener) — reactive subscription with deferred catch-up\n * getAll() — snapshot of accumulated statements\n * setAnalyticsEngine(engine) — attach enrichment pipeline\n * finalizeAnalytics() — flush summary statements after workout ends\n * dispose() — release buffer and listeners\n * ```\n *\n * ## Emission helpers\n *\n * The five helpers that were private methods of ScriptRuntime are now methods\n * here. They read their clock/stack/script from {@link OutputEmitter.attach}\n * (wired once by ScriptRuntime) rather than taking runtime-shaped args at every\n * call — closing the \"carve-out moved code without moving the bugs\" defect.\n *\n * - emitLoad()\n * - emitStackEvent(event)\n * - emitSegmentFromResultMemory(block, stackDepth)\n * - emitRuntimeEvent(event)\n * - emitCompilerBlock(block)\n */\nexport class OutputEmitter {\n private _outputStatements: IOutputStatement[] = [];\n private _outputListeners: Set<OutputListener> = new Set();\n private _analyticsEngine: IAnalyticsEngine | null = null;\n /** Session-scoped latch: summary outputs are appended once per session. */\n private _analyticsFinalized = false;\n /**\n * Ephemeral Tier-2 (running-total) snapshot — display-only. Replaced\n * wholesale on each segment; NEVER buffered into _outputStatements, so it\n * never reaches the persisted log. Only finalizeAnalytics() materializes\n * the final values into the records.\n */\n private _liveAnalytics: IOutputStatement[] = [];\n\n // Runtime dependencies wired once via attach() — the emission helpers read\n // these instead of taking clock/stack/script across the seam at every call.\n // This closes the \"carve-out moved code without moving the bugs\" defect:\n // OutputEmitter no longer takes runtime-shaped args per emit.\n private _clock: IRuntimeClock | null = null;\n private _stack: IRuntimeStack | null = null;\n private _script: WhiteboardScript | null = null;\n\n /**\n * Wire the runtime dependencies the emission helpers read. Called once by\n * ScriptRuntime's constructor after its own stack/clock/script are set.\n * Replaces the per-call clock/stack/script parameters the helpers used to take.\n */\n attach(deps: { clock: IRuntimeClock; stack: IRuntimeStack; script: WhiteboardScript }): void {\n this._clock = deps.clock;\n this._stack = deps.stack;\n this._script = deps.script;\n }\n\n private _requireClock(): IRuntimeClock {\n if (!this._clock) {\n throw new Error('[OutputEmitter] emission helper called before attach() — clock is not wired');\n }\n return this._clock;\n }\n\n // =========================================================================\n // Core output API\n // =========================================================================\n\n /**\n * Add an output statement, run it through analytics enrichment, buffer it,\n * and notify all subscribers.\n *\n * GC guard: system-typed outputs are skipped entirely when no listener is\n * present to prevent object allocation pressure during high-iteration\n * workloads (e.g. 10 000-round performance tests).\n */\n add(output: IOutputStatement): void {\n if (output.outputType === 'system' && this._outputListeners.size === 0) {\n return;\n }\n\n const processed = this._analyticsEngine\n ? this._analyticsEngine.run(output)\n : output;\n\n this._outputStatements.push(processed);\n\n for (const listener of this._outputListeners) {\n try {\n listener(processed);\n } catch (err) {\n console.error('[OutputEmitter] Listener error:', err);\n }\n }\n }\n\n /**\n * Subscribe to output statements.\n *\n * New subscribers receive a deferred catch-up of all statements emitted so\n * far (setTimeout 0) to avoid synchronous React render warnings.\n */\n subscribe(listener: OutputListener): Unsubscribe {\n this._outputListeners.add(listener);\n\n const snapshot = [...this._outputStatements];\n if (snapshot.length > 0) {\n setTimeout(() => {\n if (this._outputListeners.has(listener)) {\n for (const output of snapshot) {\n listener(output);\n }\n }\n }, 0);\n }\n\n return () => this._outputListeners.delete(listener);\n }\n\n /** Returns a copy of all output statements accumulated so far. */\n getAll(): IOutputStatement[] {\n return [...this._outputStatements];\n }\n\n /** Returns true when at least one subscriber is listening. */\n hasListeners(): boolean {\n return this._outputListeners.size > 0;\n }\n setAnalyticsEngine(engine: IAnalyticsEngine): void {\n this._analyticsEngine = engine;\n // Route the live Tier-2 snapshot through emitLiveAnalytics — display-only,\n // never buffered. Finals are materialized by finalizeAnalytics() below.\n engine.setLiveOutputEmitter((outputs) => this.emitLiveAnalytics(outputs));\n }\n\n /**\n * Flush the analytics engine's final summary outputs after a workout ends.\n * Summary statements bypass the enrichment chain (already fully processed)\n * and are the ONLY Tier-2 outputs that reach the persisted buffer — live\n * running-total snapshots stay ephemeral ({@link emitLiveAnalytics}).\n */\n finalizeAnalytics(): IOutputStatement[] {\n if (!this._analyticsEngine) return [];\n // Idempotent per session: session-end has multiple legitimate callers\n // (auto-complete effect, handleStop, unmount partial-save, StrictMode\n // double-effects) — without this latch each call re-appends the same\n // summary outputs, producing duplicate analytics rows/cards (N9).\n if (this._analyticsFinalized) return [];\n this._analyticsFinalized = true;\n\n const summaryOutputs = this._analyticsEngine.finalize();\n // When finalize returns [] the projections were already emitted live and\n // are unchanged — the live snapshot holds the final values. Materialize\n // it so the records carry the finals even though live never buffered.\n const finals = summaryOutputs.length > 0 ? summaryOutputs : this._liveAnalytics;\n\n for (const output of finals) {\n this._outputStatements.push(output);\n for (const listener of this._outputListeners) {\n try {\n listener(output);\n } catch (err) {\n console.error('[OutputEmitter] Finalize listener error:', err);\n }\n }\n }\n\n // The live snapshot has served its purpose; the finals now live in the\n // persisted buffer. Clear it so post-finalize reads don't double-count.\n this._liveAnalytics = [];\n\n return finals;\n }\n\n /**\n * Replace the ephemeral live-analytics snapshot and notify subscribers,\n * WITHOUT buffering into the persisted output stream. Live Tier-2 totals\n * (running totals per segment) are display-only; only {@link finalizeAnalytics}\n * writes the final values into the records.\n *\n * Each projection output is still fanned out to listeners individually so\n * reactive consumers (session store, cast bridge) update per-segment.\n */\n private emitLiveAnalytics(outputs: IOutputStatement[]): void {\n this._liveAnalytics = outputs;\n for (const output of outputs) {\n for (const listener of this._outputListeners) {\n try {\n listener(output);\n } catch (err) {\n console.error('[OutputEmitter] Live analytics listener error:', err);\n }\n }\n }\n }\n\n /** Ephemeral Tier-2 (running-total) snapshot for live display; never persisted. */\n getLiveAnalytics(): IOutputStatement[] {\n return [...this._liveAnalytics];\n }\n\n dispose(): void {\n this._outputStatements = [];\n this._outputListeners.clear();\n this._analyticsFinalized = false;\n this._liveAnalytics = [];\n }\n\n // =========================================================================\n // Emission helpers (previously private methods of ScriptRuntime)\n // =========================================================================\n\n /**\n * Emit a `'load'` output for every statement in the script.\n * Called once during ScriptRuntime construction. Reads the attached script\n * and clock (see {@link attach}); no runtime-shaped args cross the seam.\n */\n emitLoad(): void {\n if (!this._script) {\n throw new Error('[OutputEmitter] emitLoad() called before attach() — script is not wired');\n }\n const script = this._script;\n const now = this._requireClock().currentDate;\n\n for (const stmt of script.statements) {\n const rawText = script.source.substring(\n stmt.meta.startOffset,\n stmt.meta.endOffset + 1\n );\n\n const metrics = MetricContainer.from(stmt.metrics as any, stmt.id);\n metrics.add({\n type: MetricType.Label,\n image: rawText || 'Statement',\n value: rawText,\n origin: 'runtime',\n timestamp: now,\n });\n\n // Logical depth: count ancestors. The visited-set is a cycle\n // guard: degenerate parses (duplicate line-number ids making a\n // statement its own ancestor) must never hang emission.\n let logicalDepth = 0;\n let parentId = stmt.parent;\n const seen = new Set<number>();\n while (parentId !== undefined && !seen.has(parentId)) {\n seen.add(parentId);\n const parent = script.getId(parentId);\n if (parent) { logicalDepth++; parentId = parent.parent; }\n else break;\n }\n\n this.add(new OutputStatement({\n outputType: 'load',\n timeSpan: new TimeSpan(now.getTime(), now.getTime()),\n sourceBlockKey: 'root',\n sourceStatementId: stmt.id,\n stackLevel: logicalDepth,\n metrics,\n }));\n }\n }\n\n /**\n * Emit a `'system'` output for a push or pop stack event.\n * Reads the attached clock and stack blocks; only the event (which carries\n * the affected block + depth) crosses the seam.\n */\n emitStackEvent(event: { type: 'push' | 'pop'; block: IRuntimeBlock; depth: number }): void {\n // GC guard: only create objects when a listener wants them\n if (!this.hasListeners()) return;\n\n const now = this._requireClock().currentDate;\n const block = event.block;\n // The stack's current blocks at emit time — equivalent to the per-call\n // `stackBlocks` arg this used to take (the subscription handler fires\n // after the mutation, so attached stack state is the post-event state).\n const stackBlocks = this._stack?.blocks ?? [];\n\n interface SystemValue {\n event: 'push' | 'pop';\n blockKey: string;\n blockLabel?: string;\n actionType?: string;\n [key: string]: unknown;\n }\n\n const value: SystemValue = {\n event: event.type,\n blockKey: block.key.toString(),\n blockLabel: block.label,\n actionType: event.type === 'push' ? 'push-block' : 'pop-block',\n };\n\n if (event.type === 'push') {\n const parentBlock = stackBlocks.length > 1 ? stackBlocks[1] : undefined;\n if (parentBlock) value.parentKey = parentBlock.key.toString();\n } else {\n value.completionReason = block.completionReason ?? 'normal';\n }\n\n const metric: IMetric = {\n type: MetricType.System,\n image: event.type === 'push'\n ? `push: ${block.label ?? block.blockType ?? 'Block'} [${block.key.toString().slice(0, 8)}]`\n : `pop: ${block.label ?? block.blockType ?? 'Block'} [${block.key.toString().slice(0, 8)}] reason=${block.completionReason ?? 'normal'}`,\n value,\n origin: 'runtime',\n timestamp: now,\n };\n\n this.add(new OutputStatement({\n outputType: 'system',\n timeSpan: new TimeSpan(now.getTime(), now.getTime()),\n sourceBlockKey: block.key.toString(),\n stackLevel: event.depth,\n metrics: MetricContainer.empty(block.key.toString()).add(metric),\n }));\n }\n\n /**\n * Emit `'segment'` outputs from a block's `metric:result` memory.\n * Called when a block is popped from the stack. `stackDepth` is the\n * event-specific depth at pop time; clock is read from the attached deps.\n */\n emitSegmentFromResultMemory(block: IRuntimeBlock, stackDepth: number): void {\n const resultLocs = block.getMemoryByTag('metric:result');\n const displayLocs = block.getMemoryByTag('metric:display');\n\n if (resultLocs.length === 0) return;\n\n const fallbackEndMs = this._requireClock().currentDate.getTime();\n\n for (let i = 0; i < resultLocs.length; i++) {\n const resultFragments = MetricContainer.from(resultLocs[i].metrics, block.key.toString());\n\n // Match with corresponding display metrics if available\n // (Assumes 1:1 pairing from ReportOutputBehavior)\n const sourceFragments = MetricContainer.from(displayLocs[i]?.metrics, block.key.toString());\n\n // Keep source + result contributions as raw metrics.\n // Visibility winners are resolved downstream by ownership-aware\n // display reads — do NOT pre-filter source by result type here.\n const metrics = MetricContainer.empty(block.key.toString())\n .add(...sourceFragments.toArray())\n .add(...resultFragments.toArray());\n\n if (metrics.length === 0) continue;\n\n const fallbackStartMs = block.executionTiming?.startTime?.getTime() ?? fallbackEndMs;\n const timeSpan = new TimeSpan(fallbackStartMs, fallbackEndMs);\n\n this.add(new OutputStatement({\n outputType: 'segment',\n completionReason: block.completionReason,\n timeSpan,\n sourceBlockKey: block.key.toString(),\n sourceStatementId: block.sourceIds?.[i] ?? block.sourceIds?.[0],\n stackLevel: stackDepth,\n metrics,\n }));\n }\n }\n\n /**\n * Emit an `'event'` output for a dispatched runtime event.\n * Reads the attached clock and stack; only the event crosses the seam.\n */\n emitRuntimeEvent(event: IEvent): void {\n const now = this._requireClock().currentDate;\n const stack = this._stack;\n const blockKey = stack?.current?.key.toString() ?? 'root';\n\n const metrics = MetricContainer.empty(blockKey).add({\n type: MetricType.System,\n image: `event: ${event.name}`,\n value: { name: event.name, data: event.data, blockKey },\n origin: 'runtime',\n timestamp: now,\n });\n\n this.add(new OutputStatement({\n outputType: 'event',\n timeSpan: new TimeSpan(now.getTime(), now.getTime()),\n sourceBlockKey: blockKey,\n stackLevel: stack?.count ?? 0,\n metrics,\n }));\n }\n\n /**\n * Emit a `'compiler'` output recording the behaviors attached to a block.\n * Reads the attached clock and stack count; only the block crosses the seam.\n */\n emitCompilerBlock(block: IRuntimeBlock): void {\n const now = this._requireClock().currentDate;\n // Pre-push count, same as the per-call `stackCount` this used to take —\n // ScriptRuntime calls this before queueing the PushBlockAction.\n const stackCount = this._stack?.count ?? 0;\n\n const metrics = MetricContainer.empty(block.key.toString()).add({\n type: MetricType.Label,\n image: `Behaviors: ${block.behaviors.map(b => b.constructor.name).join(', ')}`,\n value: block.behaviors.map(b => b.constructor.name),\n origin: 'runtime',\n timestamp: now,\n });\n\n this.add(new OutputStatement({\n outputType: 'compiler',\n timeSpan: new TimeSpan(now.getTime(), now.getTime()),\n sourceBlockKey: block.key.toString(),\n stackLevel: stackCount,\n metrics,\n }));\n }\n\n // =========================================================================\n // Private helpers\n // =========================================================================\n}\n","/**\n * RuntimeObservers — the shared observer collaborator for IScriptRuntime adapters.\n *\n * Owns the **subscriber side** of the stack-snapshot reactive seam\n * (`IScriptRuntime.subscribeToStack`). Both `ScriptRuntime` and\n * `ChromecastProxyRuntime` compose one of these.\n *\n * ## Post-mount contract\n *\n * Stack snapshots emitted via `emitStack` reflect **post-mount state** —\n * the calling adapter is responsible for invoking `emitStack` only with\n * snapshots taken from a stack where every visible block has completed\n * `onMount`. `ScriptRuntime` enforces this by calling `emitStack` from\n * two points only:\n *\n * 1. The bridge from `IRuntimeStack` push/pop events (post-mount because\n * `RuntimeStack.push` mounts the block before notifying listeners).\n * 2. The post-turn settle re-emit in `do()` (post-mount by construction —\n * the turn completed, so every action including `onMount` has run).\n *\n * The collaborator itself does not check this invariant; the **adapter's\n * emit sites** are the contract. The regression test\n * `tests/runtime-compliance/post-mount-snapshot-invariant.compliance.test.ts`\n * pins the outcome.\n *\n * ## What this collaborator is NOT\n *\n * - Not a producer of snapshots. The adapter decides *when* to call\n * `emitStack(snapshot)`. The collaborator only fans out.\n * - Not a replacement for `OutputEmitter` (output buffer, analytics\n * enrichment, GC guard, deferred catch-up). Output emission semantics\n * live there.\n */\nimport type { IRuntimeBlock } from './contracts/IRuntimeBlock';\nimport type {\n StackObserver,\n StackSnapshot,\n Unsubscribe,\n} from './contracts/IRuntimeStack';\n\n/**\n * Subscriber collaborator for stack snapshots. (The former tracker-listener\n * seam was removed when session-totals moved to the live 'analytics' output\n * stream — see AnalyticsEngine.setLiveOutputEmitter.)\n */\nexport class RuntimeObservers {\n private readonly _stackObservers: Set<StackObserver> = new Set();\n\n /**\n * Subscribe to stack snapshots. The collaborator does NOT emit an\n * `'initial'` snapshot automatically — the calling adapter is\n * responsible for constructing the snapshot and calling `emitStack`\n * right after subscribe, so the adapter owns its own initial-snapshot\n * timing (ScriptRuntime defers via setTimeout to dodge React render\n * warnings; the Chromecast proxy fires synchronously per its existing\n * contract — see `ChromecastProxyRuntime.test.ts`).\n */\n subscribeToStack(observer: StackObserver): Unsubscribe {\n this._stackObservers.add(observer);\n return () => {\n this._stackObservers.delete(observer);\n };\n }\n\n /**\n * Fan-out a stack snapshot to all subscribers. Errors are isolated\n * per-observer so a misbehaving listener cannot stop the others.\n */\n emitStack(snapshot: StackSnapshot): void {\n if (this._stackObservers.size === 0) return;\n for (const observer of this._stackObservers) {\n try {\n observer(snapshot);\n } catch (err) {\n console.error('[RuntimeObservers] Stack observer error:', err);\n }\n }\n }\n\n /**\n * Membership check used by adapters that defer their initial-snapshot\n * emit (e.g. ScriptRuntime via setTimeout) and need to drop the\n * emit if the observer unsubscribed in the meantime.\n */\n hasStackObserver(observer: StackObserver): boolean {\n return this._stackObservers.has(observer);\n }\n\n /**\n * Build the `initial`-type snapshot the collaborator itself cannot\n * build (it doesn't know the adapter's stack). Used by the settle\n * path in `ScriptRuntime.do()`'s `finally` to re-emit a\n * post-mount snapshot after the turn completes.\n */\n emitSettled(blocks: readonly IRuntimeBlock[], depth: number, clockTime: Date): void {\n if (this._stackObservers.size === 0) return;\n if (blocks.length === 0) return;\n const snapshot: StackSnapshot = {\n type: 'initial',\n blocks,\n depth,\n clockTime,\n };\n this.emitStack(snapshot);\n }\n\n /**\n * Drop all subscribers. After `dispose`, `emit*` calls become no-ops\n * (empty Set checks), and any subscription returned previously\n * continues to function as an unsubscribe.\n */\n dispose(): void {\n this._stackObservers.clear();\n }\n\n /** Introspection (testing / diagnostics). */\n get stackObserverCount(): number { return this._stackObservers.size; }\n}\n","/**\n * RuntimeLogger - Centralized debug logging for the runtime engine.\n * \n * Enable/disable via:\n * - `RuntimeLogger.enable()` / `RuntimeLogger.disable()`\n * - `window.__WOD_DEBUG__ = true` in browser console\n * \n * Logs:\n * - Block push/pop with behaviors\n * - `next()` calls\n * - Events that produce actions\n * - Memory updates\n */\n\nimport { IRuntimeBlock } from './contracts/IRuntimeBlock';\nimport { IRuntimeBehavior } from './contracts/IRuntimeBehavior';\nimport { IRuntimeAction } from './contracts/IRuntimeAction';\nimport { IEvent } from './contracts/events/IEvent';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface RuntimeLogEntry {\n timestamp: Date;\n level: LogLevel;\n category: string;\n message: string;\n data?: Record<string, unknown>;\n}\n\nclass RuntimeLoggerImpl {\n private _enabled = false;\n private _history: RuntimeLogEntry[] = [];\n private _maxHistory = 500;\n\n // Style constants for console output\n private readonly STYLES = {\n push: 'color: #22c55e; font-weight: bold', // green\n pop: 'color: #ef4444; font-weight: bold', // red\n next: 'color: #3b82f6; font-weight: bold', // blue\n event: 'color: #a855f7; font-weight: bold', // purple\n memory: 'color: #f59e0b; font-weight: bold', // amber\n action: 'color: #6366f1; font-weight: normal', // indigo\n origin: 'color: #64748b; font-weight: normal', // slate\n };\n\n constructor() {\n // Check for global debug flag in browser\n if (typeof window !== 'undefined') {\n this._enabled = !!(window as any).__WOD_DEBUG__;\n }\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n enable(): void {\n this._enabled = true;\n console.log('%c[RT] 🔧 Runtime logging ENABLED', 'color: #22c55e; font-weight: bold');\n }\n\n disable(): void {\n this._enabled = false;\n console.log('%c[RT] Runtime logging disabled', 'color: #64748b');\n }\n\n getHistory(): RuntimeLogEntry[] {\n return [...this._history];\n }\n\n clearHistory(): void {\n this._history = [];\n }\n\n // ============================================================================\n // Logging Methods\n // ============================================================================\n\n /**\n * Log when a block is pushed onto the stack\n */\n logPush(block: IRuntimeBlock, parentKey?: string): void {\n if (!this._enabled) return;\n\n const behaviors = this.getBehaviorNames(block);\n const memoryTypes = block.getAllMemory?.().map(loc => loc.tag) ?? [];\n\n console.groupCollapsed(\n `%c[RT] ▶ PUSH %c${block.label || block.blockType || 'Block'}%c [${block.key.toString().slice(0, 8)}]`,\n this.STYLES.push,\n 'color: inherit; font-weight: bold',\n 'color: #64748b; font-weight: normal'\n );\n console.log('Key:', block.key.toString());\n if (parentKey) console.log('Parent:', parentKey);\n console.log('Source IDs:', block.sourceIds);\n console.log('Behaviors:', behaviors);\n if (memoryTypes.length > 0) console.log('Memory Types:', memoryTypes);\n console.groupEnd();\n\n this.addToHistory('info', 'push', `PUSH ${block.label}`, {\n key: block.key.toString(),\n parentKey,\n behaviors,\n sourceIds: block.sourceIds,\n });\n }\n\n /**\n * Log when a block is popped from the stack\n */\n logPop(block: IRuntimeBlock, reason?: string): void {\n if (!this._enabled) return;\n\n console.log(\n `%c[RT] ◀ POP %c${block.label || block.blockType || 'Block'}%c [${block.key.toString().slice(0, 8)}]${reason ? ` (${reason})` : ''}`,\n this.STYLES.pop,\n 'color: inherit; font-weight: bold',\n 'color: #64748b; font-weight: normal'\n );\n\n this.addToHistory('info', 'pop', `POP ${block.label}`, {\n key: block.key.toString(),\n reason,\n });\n }\n\n /**\n * Log when next() is called on a block\n */\n logNext(block: IRuntimeBlock, actions: IRuntimeAction[]): void {\n if (!this._enabled) return;\n\n const actionNames = actions.map(a => a.type || a.constructor?.name || 'Action');\n\n if (actions.length === 0) {\n // Only log if there are actions, per user request\n return;\n }\n\n console.groupCollapsed(\n `%c[RT] → NEXT %c${block.label || 'Block'}%c → ${actions.length} action(s)`,\n this.STYLES.next,\n 'color: inherit; font-weight: bold',\n 'color: #64748b; font-weight: normal'\n );\n console.log('Block:', block.key.toString());\n console.log('Actions:', actionNames);\n console.groupEnd();\n\n this.addToHistory('info', 'next', `NEXT ${block.label}`, {\n key: block.key.toString(),\n actions: actionNames,\n });\n }\n\n /**\n * Log when an event produces actions\n */\n logEvent(event: IEvent, actions: IRuntimeAction[]): void {\n if (!this._enabled) return;\n\n // Skip tick events that produce no actions (per user request)\n if (actions.length === 0) return;\n\n const actionNames = actions.map(a => a.type || a.constructor?.name || 'Action');\n\n console.groupCollapsed(\n `%c[RT] ⚡ EVENT %c${event.name}%c → ${actions.length} action(s)`,\n this.STYLES.event,\n 'color: inherit; font-weight: bold',\n 'color: #64748b; font-weight: normal'\n );\n console.log('Event Data:', event.data);\n console.log('Actions:', actionNames);\n console.groupEnd();\n\n this.addToHistory('info', 'event', `EVENT ${event.name}`, {\n eventName: event.name,\n eventData: event.data,\n actions: actionNames,\n });\n }\n\n /**\n * Log when memory is updated on a block\n */\n logMemoryUpdate(blockKey: string, memoryType: string, value: unknown): void {\n if (!this._enabled) return;\n\n // Create a simplified view of the value\n let displayValue: unknown = value;\n if (typeof value === 'object' && value !== null) {\n // For objects, show a summary\n displayValue = this.summarizeObject(value as Record<string, unknown>);\n }\n\n console.log(\n `%c[RT] 📝 MEMORY %c${memoryType}%c on [${blockKey.slice(0, 8)}]:`,\n this.STYLES.memory,\n 'color: inherit; font-weight: bold',\n 'color: #64748b; font-weight: normal',\n displayValue\n );\n\n this.addToHistory('debug', 'memory', `MEMORY ${memoryType}`, {\n blockKey,\n memoryType,\n value: displayValue,\n });\n }\n\n /**\n * Log action execution (verbose, under a group)\n */\n logAction(action: IRuntimeAction, depth: number): void {\n if (!this._enabled) return;\n\n const indent = ' '.repeat(depth);\n const actionName = action.type || action.constructor?.name || 'Action';\n\n console.log(\n `%c[RT] ${indent}⚙ %c${actionName}`,\n this.STYLES.action,\n 'color: inherit'\n );\n }\n\n // ============================================================================\n // Helpers\n // ============================================================================\n\n private getBehaviorNames(block: IRuntimeBlock): string[] {\n // Access behaviors via reflection if possible\n const behaviors = (block as any).behaviors as IRuntimeBehavior[] | undefined;\n if (!behaviors || !Array.isArray(behaviors)) return [];\n return behaviors.map(b => b.constructor?.name || 'Behavior');\n }\n\n private summarizeObject(obj: Record<string, unknown>): Record<string, unknown> {\n const summary: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj)) {\n if (Array.isArray(val)) {\n summary[key] = `[${val.length} items]`;\n } else if (typeof val === 'object' && val !== null) {\n summary[key] = '{...}';\n } else {\n summary[key] = val;\n }\n }\n return summary;\n }\n\n private addToHistory(level: LogLevel, category: string, message: string, data?: Record<string, unknown>): void {\n this._history.push({\n timestamp: new Date(),\n level,\n category,\n message,\n data,\n });\n\n // Trim history if too large\n if (this._history.length > this._maxHistory) {\n this._history = this._history.slice(-this._maxHistory);\n }\n }\n}\n\n// Singleton instance\nexport const RuntimeLogger = new RuntimeLoggerImpl();\n\n// Make available on window for easy debugging\nif (typeof window !== 'undefined') {\n (window as any).RuntimeLogger = RuntimeLogger;\n}\n","import type { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport type { IRuntimeBlock } from '../../contracts/IRuntimeBlock';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\nimport type { BlockLifecycleOptions } from '../../contracts';\nimport { RuntimeLogger } from \"../../RuntimeLogger\";\n\n/**\n * Action that pushes a compiled block onto the runtime stack.\n * Used by behaviors to add child blocks for execution.\n */\nexport class PushBlockAction implements IRuntimeAction {\n private _type = 'push-block';\n\n constructor(public readonly block: IRuntimeBlock, private readonly options: BlockLifecycleOptions = {}) { }\n\n get type(): string {\n return this._type;\n }\n\n set type(_value: string) {\n throw new Error('Cannot modify readonly property type');\n }\n\n do(runtime: IRuntimeContext): IRuntimeAction[] {\n if (!runtime.stack) {\n return [];\n }\n\n try {\n // Block push timing rules:\n // If startTime is explicitly provided in options, use it\n // Otherwise: if clock running → create start time automatically\n // Note: Use options.clock if provided (e.g., SnapshotClock) to maintain timing consistency\n\n let startTime: Date | undefined = this.options.startTime;\n const clock = this.options.clock ?? runtime.clock;\n\n if (!startTime && clock?.isRunning) {\n // Clock running → create startTime automatically\n // Uses frozen clock if provided for timing consistency\n startTime = clock.currentDate;\n }\n\n const lifecycle: BlockLifecycleOptions = startTime\n ? { ...this.options, startTime }\n : { ...this.options };\n\n const target = this.block as IRuntimeBlock & { executionTiming?: BlockLifecycleOptions };\n if (startTime) {\n target.executionTiming = { ...(target.executionTiming ?? {}), startTime };\n }\n\n // Push the block onto the stack\n runtime.stack.push(this.block);\n\n // Mount the block with lifecycle options - returns actions to be executed\n const mountActions = this.block.mount(runtime, lifecycle);\n\n // Log the push with behaviors\n const parentKey = runtime.stack.blocks.length > 1\n ? runtime.stack.blocks[1]?.key.toString()\n : undefined;\n RuntimeLogger.logPush(this.block, parentKey);\n\n return mountActions;\n\n } catch (error) {\n // Check if runtime has optional setError method\n const runtimeWithSetError = runtime as IRuntimeContext & { setError?: (error: unknown) => void };\n if (typeof runtimeWithSetError.setError === 'function') {\n runtimeWithSetError.setError(error);\n }\n return [];\n }\n }\n}\n","import { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\nimport { BlockLifecycleOptions } from '../../contracts/IRuntimeBlock';\nimport { NextAction } from './NextAction';\nimport { RuntimeLogger } from '../../RuntimeLogger';\n\n/**\n * Action that pops the current block from the runtime stack.\n * Handles the full lifecycle: unmount, pop, dispose, emit output.\n * \n * Returns unmount actions followed by a NextAction for the parent,\n * decoupling the pop and next phases into distinct actions processed\n * by the ExecutionContext.\n */\nexport class PopBlockAction implements IRuntimeAction {\n readonly type = 'pop-block';\n\n constructor(private readonly options: BlockLifecycleOptions = {}) { }\n\n do(runtime: IRuntimeContext): IRuntimeAction[] {\n const current = runtime.stack.current;\n if (!current) {\n return [];\n }\n\n // Set createdAt time if not provided\n const createdAt = this.options.createdAt ?? runtime.clock.currentDate;\n const lifecycleOptions: BlockLifecycleOptions = { ...this.options, createdAt };\n\n // Update block's execution timing\n if (current.executionTiming) {\n current.executionTiming.createdAt = createdAt;\n }\n\n // Forced-pop: if block was NOT marked complete before pop, mark it now.\n // This distinguishes a \"clean pop\" (next → markComplete → pop) from a\n // \"forced pop\" (direct pop on an incomplete block, e.g., parent timer expiry).\n // Forced pops still run the full unmount lifecycle so behaviors can report\n // their fragments via onUnmount.\n if (!current.isComplete && typeof current.markComplete === 'function') {\n current.markComplete('forced-pop');\n RuntimeLogger.logPop(current, 'forced-pop (incomplete block popped without next)');\n }\n\n // Get unmount actions from the block\n const unmountActions = current.unmount(runtime, lifecycleOptions) ?? [];\n\n // Pop from stack\n const popped = runtime.stack.pop();\n if (!popped) {\n return [];\n }\n\n // Dispose and cleanup\n popped.dispose(runtime);\n popped.context?.release?.();\n\n // Log the pop (skip if already logged as forced-pop above)\n if ((popped as any).completionReason !== 'forced-pop') {\n RuntimeLogger.logPop(popped, (popped as any).completionReason);\n }\n\n // The 'segment' OutputStatement for this pop is emitted by the stack's\n // pop-event listener (OutputEmitter.emitSegmentFromResultMemory), which\n // reads the result memory ReportOutputBehavior.onUnmount wrote. PopBlockAction\n // does not emit output itself — there is exactly one emission site per pop.\n\n // If a parent block exists, queue a NextAction to notify it of child completion.\n // This decouples the pop and next steps into separate actions, ensuring each\n // lifecycle phase (unmount → next → push) is a distinct action in the ExecutionContext.\n const parent = runtime.stack.current;\n\n // Return unmount actions first, then a NextAction for the parent (if any).\n // ExecutionContext reverse-pushes returned arrays so first element executes first:\n // unmount effects run before parent advancement.\n return parent\n ? [...unmountActions, new NextAction(lifecycleOptions, runtime.nowProvider)]\n : unmountActions;\n }\n}\n","import type { IScriptRuntime, OutputListener } from './contracts/IScriptRuntime';\nimport type { IJitCompiler } from './contracts/IJitCompiler';\nimport type { IRuntimeStack, Unsubscribe, StackObserver, StackSnapshot } from './contracts/IRuntimeStack';\nimport type { WhiteboardScript } from '../parser/WhiteboardScript';\nimport type { RuntimeError } from './actions/ErrorAction';\nimport type { IEventBus } from './contracts/events/IEventBus';\nimport {\n DEFAULT_RUNTIME_OPTIONS,\n RuntimeStackOptions\n} from './contracts/IRuntimeOptions';\nimport { IRuntimeClock } from './contracts/IRuntimeClock';\nimport { NextEventHandler } from './events/NextEventHandler';\nimport { AbortEventHandler } from './events/AbortEventHandler';\nimport { IOutputStatement } from '@bitcobblers/wod-wiki-core';\nimport type { IRuntimeAction } from './contracts/IRuntimeAction';\nimport { IEvent } from './contracts/events/IEvent';\nimport { ExecutionContext } from './ExecutionContext';\nimport { OutputEmitter } from './OutputEmitter';\nimport { RuntimeObservers } from './RuntimeObservers';\nimport { PushBlockAction } from './actions/stack/PushBlockAction';\nimport { PopBlockAction } from './actions/stack/PopBlockAction';\nimport { IAnalyticsEngine } from '../analytics/contracts/IAnalyticsEngine';\nimport type { AnalyticsContext } from '../analytics/AnalyticsContext';\nimport type { INowProvider } from './INowProvider';\nimport { wallClockNow } from './INowProvider';\n\nexport type RuntimeState = 'idle' | 'running' | 'compiling' | 'completed';\n\nexport interface ScriptRuntimeDependencies {\n stack: IRuntimeStack;\n clock: IRuntimeClock;\n eventBus: IEventBus;\n}\n\nexport class ScriptRuntime implements IScriptRuntime {\n\n public readonly eventBus: IEventBus;\n public readonly clock: IRuntimeClock;\n public readonly stack: IRuntimeStack;\n public readonly jit: IJitCompiler;\n\n public readonly errors: RuntimeError[] = [];\n public readonly options: RuntimeStackOptions;\n public analyticsContext?: AnalyticsContext;\n\n // Single module owning the output buffer, subscriber notification,\n // analytics enrichment, and all runtime emission helpers.\n private readonly _output = new OutputEmitter();\n\n // Shared observer collaborator — owns the stack subscriber Set and the\n // post-mount snapshot contract. See `RuntimeObservers` for the seam.\n private readonly _observers = new RuntimeObservers();\n\n // The current execution context for the \"turn\"\n private _activeContext: ExecutionContext | null = null;\n private readonly _now: INowProvider;\n\n\n // Unsubscribe function for the IRuntimeStack → stack snapshot bridge.\n // The stack-snapshot fan-out itself is owned by _observers (see\n // RuntimeObservers); this field only holds the unsubscribe for the\n // upstream `this.stack.subscribe(...)` call in the constructor.\n private _stackSubscriptionUnsub: (() => void) | null = null;\n\n // Unsubscribe function for the global NextEventHandler\n private _nextHandlerUnsub: (() => void) | null = null;\n\n public get nowProvider(): INowProvider {\n return this._now;\n }\n\n // Unsubscribe function for the global AbortEventHandler\n private _abortHandlerUnsub: (() => void) | null = null;\n\n constructor(\n public readonly script: WhiteboardScript,\n compiler: IJitCompiler,\n dependencies: ScriptRuntimeDependencies,\n options: RuntimeStackOptions = {},\n now: INowProvider = wallClockNow\n ) {\n // Merge with defaults\n this.options = { ...DEFAULT_RUNTIME_OPTIONS, ...options };\n\n this.stack = dependencies.stack;\n this.clock = dependencies.clock;\n this.eventBus = dependencies.eventBus;\n this._now = now;\n\n // Handle explicit next events to advance the current block once per request\n this._nextHandlerUnsub = this.eventBus.register('next', new NextEventHandler('runtime-next-handler'), 'runtime', { scope: 'global' });\n\n // Handle abort events to force-terminate the session\n this._abortHandlerUnsub = this.eventBus.register('abort', new AbortEventHandler('runtime-abort-handler'), 'runtime', { scope: 'global' });\n\n this.jit = compiler;\n\n // Wire the OutputEmitter's runtime deps once — the emission helpers\n // read clock/stack/script from here instead of taking them per call.\n this._output.attach({ clock: this.clock, stack: this.stack, script: this.script });\n\n // Bridge stack events to StackSnapshot observers and emit system outputs.\n // The stack-snapshot fan-out is owned by RuntimeObservers; we just\n // translate the IRuntimeStack event into a StackSnapshot and delegate.\n this._stackSubscriptionUnsub = this.stack.subscribe((event) => {\n if (event.type === 'pop') {\n this._output.emitSegmentFromResultMemory(event.block, event.depth);\n }\n\n // Emit system output for push/pop events\n if (event.type === 'push' || event.type === 'pop') {\n this._output.emitStackEvent(event);\n }\n\n // Notify stack observers via the shared collaborator\n const snapshot: StackSnapshot = {\n type: event.type === 'initial' ? 'initial' : event.type,\n blocks: event.type === 'initial' ? event.blocks : event.blocks,\n affectedBlock: event.type !== 'initial' ? event.block : undefined,\n depth: event.type === 'initial' ? event.blocks.length : event.depth,\n clockTime: this.clock.currentDate,\n };\n this._observers.emitStack(snapshot);\n });\n\n // Start the clock\n this.clock.start();\n\n // Emit 'load' output with initial state\n this._output.emitLoad();\n }\n\n /**\n * Executes an action within a managed execution context (a \"turn\").\n * Actions can queue further actions which will be processed in the same turn.\n * Time is frozen during the turn.\n */\n public do(action: IRuntimeAction): void {\n if (this._activeContext) {\n this._activeContext.do(action);\n return;\n }\n\n this._activeContext = new ExecutionContext(this, this.options.maxActionDepth ?? 20);\n try {\n this._activeContext.execute(action);\n } finally {\n this._activeContext = null;\n // POST-MOUNT SNAPSHOT INVARIANT (see\n // tests/runtime-compliance/post-mount-snapshot-invariant.compliance.test.ts):\n // Snapshots reflect post-mount state. A block whose onMount has not\n // completed must not appear in a snapshot. We re-notify stack observers\n // here — AFTER the full execution turn (push + mount + child pushes) —\n // so blocks that initialize timer memory during onMount are serialized\n // with correct timer data. Without this, leaf blocks (no children pushed\n // on mount) would have timer:null in the Chromecast snapshot because\n // push fires before mount initializes memory.\n this._notifyStackSettled();\n }\n }\n\n /** Build the 'initial' snapshot of the current stack. Shared by settle-time\n * notification (sync, all observers) and subscribe-time catch-up (deferred,\n * new observer only). The two delivery timings differ deliberately — see\n * the call sites. */\n private _buildInitialSnapshot(): StackSnapshot {\n const blocks = this.stack.blocks;\n return {\n type: 'initial',\n blocks,\n depth: blocks.length,\n clockTime: this.clock.currentDate,\n };\n }\n\n private _notifyStackSettled(): void {\n // Delegate the post-turn re-emit to the shared collaborator. The\n // collaborator owns the post-mount snapshot contract — it skips\n // fan-out when there are no subscribers or the stack is empty.\n this._observers.emitSettled(\n this.stack.blocks,\n this.stack.count,\n this.clock.currentDate,\n );\n }\n\n /**\n * Pushes multiple actions onto the execution stack in the correct order\n * for LIFO processing. The first action in the array will execute first.\n * \n * If called within an active execution context, delegates to it.\n * Otherwise, wraps in a new context as a composite action.\n */\n public doAll(actions: IRuntimeAction[]): void {\n if (actions.length === 0) return;\n if (this._activeContext) {\n this._activeContext.doAll(actions);\n return;\n }\n\n // No active context — create one with a composite wrapper that returns actions\n this.do({\n type: 'composite-doAll',\n do: () => actions\n });\n }\n\n /**\n * Dispatches an event to the event bus and executes any resulting actions\n * within a single execution turn.\n */\n public handle(event: IEvent): void {\n const actions = this.eventBus.dispatch(event, this);\n\n // Only emit 'event' output if it's NOT a tick event OR if it produced actions\n // This prevents flooding the log with empty tick cycles\n if (event.name !== 'tick' || actions.length > 0) {\n this._output.emitRuntimeEvent(event);\n }\n\n if (actions.length === 0) return;\n\n this.doAll(actions);\n }\n\n // ========== Output Statement API ==========\n\n /**\n * Subscribe to output statements generated during execution.\n */\n public subscribeToOutput(listener: OutputListener): Unsubscribe {\n return this._output.subscribe(listener);\n }\n\n /**\n * Get all output statements generated so far.\n */\n public getOutputStatements(): IOutputStatement[] {\n return this._output.getAll();\n }\n\n /**\n * Ephemeral Tier-2 (running-total) snapshot for live display; never persisted.\n */\n public getLiveAnalytics(): IOutputStatement[] {\n return this._output.getLiveAnalytics();\n }\n\n /**\n * Add an output statement to the collection and notify subscribers.\n * Used by BehaviorContext to emit outputs at any lifecycle point.\n */\n public addOutput(output: IOutputStatement): void {\n this._output.add(output);\n }\n\n public setAnalyticsEngine(engine: IAnalyticsEngine): void {\n this._output.setAnalyticsEngine(engine);\n }\n\n /**\n * Finalize the analytics engine and return any summary output statements.\n */\n public finalizeAnalytics(): IOutputStatement[] {\n return this._output.finalizeAnalytics();\n }\n\n // ========== Stack Observer API ==========\n\n /**\n * Subscribe to stack snapshots. The observer receives a StackSnapshot\n * on every push/pop/clear event. New subscribers immediately receive\n * an 'initial' snapshot with the current stack state.\n */\n public subscribeToStack(observer: StackObserver): Unsubscribe {\n const unsub = this._observers.subscribeToStack(observer);\n\n // Immediate notification of current state, deferred to next tick to\n // avoid React render warnings. The collaborator is timing-agnostic;\n // each adapter owns its own initial-snapshot policy (the proxy fires\n // synchronously; ScriptRuntime defers). We call the observer\n // directly — `emitStack` is a broadcast and would re-deliver to all\n // existing subscribers, which is not the catch-up behavior either\n // adapter had before this refactor.\n // Build the snapshot at delivery time, not subscribe time: mutations\n // between subscription and the deferred delivery (e.g. the tour's\n // microtask gate-pop) would otherwise deliver a stale snapshot that\n // clobbers fresher push/pop notifications.\n setTimeout(() => {\n // Re-check membership: the observer may have unsubscribed before\n // the deferred callback fired.\n if (!this._observers.hasStackObserver(observer)) return;\n try {\n observer(this._buildInitialSnapshot());\n } catch (err) {\n console.error('[RT] Stack observer error (initial):', err);\n }\n }, 0);\n\n return unsub;\n }\n\n /**\n * Cleanup method that properly unmounts and disposes all blocks in the stack.\n */\n public dispose(): void {\n // Stop the clock\n this.clock.stop();\n\n // Properly unmount and dispose each block (top-down)\n while (this.stack.count > 0) {\n const block = this.stack.current;\n if (block) {\n try {\n block.unmount(this);\n } catch (_e) {\n // Swallow errors during emergency cleanup\n }\n this.stack.pop();\n try {\n block.dispose(this);\n } catch (_e) {\n // Swallow errors during emergency cleanup\n }\n } else {\n this.stack.pop();\n }\n }\n\n // Unregister the global NextEventHandler\n if (this._nextHandlerUnsub) {\n this._nextHandlerUnsub();\n this._nextHandlerUnsub = null;\n }\n\n // Unregister the global AbortEventHandler\n if (this._abortHandlerUnsub) {\n this._abortHandlerUnsub();\n this._abortHandlerUnsub = null;\n }\n\n // Clear output state to release references\n this._output.dispose();\n\n // Unsubscribe the IRuntimeStack → stack snapshot bridge.\n if (this._stackSubscriptionUnsub) {\n this._stackSubscriptionUnsub();\n this._stackSubscriptionUnsub = null;\n }\n\n // Drop all stack + tracker subscribers (and any upstream tracker\n // subscription the collaborator holds) in one call.\n this._observers.dispose();\n\n // Clear the event bus\n this.eventBus.dispose();\n }\n\n /**\n * Pushes a block onto the runtime stack.\n * This is a convenience method that wraps PushBlockAction.\n * Also handles hooks, tracking, wrapping, and logging if configured.\n * \n * @param block The block to push\n * @param lifecycle Optional lifecycle options (startTime, etc.)\n */\n public pushBlock(block: import('./contracts/IRuntimeBlock').IRuntimeBlock, lifecycle?: import('./contracts/IRuntimeBlock').BlockLifecycleOptions): void {\n const parentBlock = this.stack.current;\n\n // Call before hooks\n this.options.hooks?.onBeforePush?.(block, parentBlock);\n\n // Emit 'compiler' output for the new block\n this._output.emitCompilerBlock(block);\n\n // Wrap block if wrapper is configured\n const wrappedBlock = this.options.wrapper?.wrap?.(block, parentBlock) ?? block;\n\n // Execute the push action\n this.do(new PushBlockAction(wrappedBlock, lifecycle));\n\n // Log the push\n this.options.logger?.debug?.('runtime.pushBlock', {\n blockKey: block.key.toString(),\n parentKey: parentBlock?.key.toString(),\n });\n\n // Call after hooks\n this.options.hooks?.onAfterPush?.(wrappedBlock, parentBlock);\n }\n\n /**\n * Pops the current block from the runtime stack.\n * This is a convenience method that wraps PopBlockAction.\n * Handles the full lifecycle: unmount, pop, dispose, and parent notification.\n * Also handles hooks, tracking, wrapping cleanup, and logging if configured.\n * \n * @param lifecycle Optional lifecycle options (createdAt, etc.)\n */\n public popBlock(lifecycle?: import('./contracts/IRuntimeBlock').BlockLifecycleOptions): void {\n const currentBlock = this.stack.current;\n if (!currentBlock) {\n return;\n }\n\n // Call before hooks\n this.options.hooks?.onBeforePop?.(currentBlock);\n\n // Execute the pop action (which handles unmount, dispose, output statement, parent.next)\n this.do(new PopBlockAction(lifecycle));\n\n // Cleanup wrapper\n this.options.wrapper?.cleanup?.(currentBlock);\n\n // Unregister hooks by owner\n this.options.hooks?.unregisterByOwner?.(currentBlock.key.toString());\n\n // Log the pop\n this.options.logger?.debug?.('runtime.popBlock', {\n blockKey: currentBlock.key.toString(),\n stackDepth: this.stack.count,\n });\n\n // Call after hooks\n this.options.hooks?.onAfterPop?.(currentBlock);\n }\n}\n","/**\n * Concrete implementation of {@link IMemoryReference} for typed memory cells.\n *\n * This class lives in the `impl/` layer (not `contracts/`) so that\n * `contracts/IMemoryReference.ts` does not need to import\n * `contracts/IRuntimeMemory.ts` — breaking the cycle:\n *\n * IMemoryReference ↔ IRuntimeMemory\n */\nimport { v7 as uuidv7 } from 'uuid';\nimport type {\n IMemoryReference,\n IMemorySubscription,\n SubscriptionOptions,\n} from '../contracts/IMemoryReference';\nimport type { IRuntimeMemory } from '../contracts/IRuntimeMemory';\n\nexport class TypedMemoryReference<T> implements IMemoryReference {\n public id: string = uuidv7();\n private _subscriptions: IMemorySubscription<T>[] = [];\n\n constructor(\n private readonly _memory: IRuntimeMemory,\n public readonly ownerId: string,\n public readonly type: string,\n public visibility: 'public' | 'private' | 'inherited' = 'private',\n ) {}\n\n /**\n * Get the current value in an untyped manner.\n * Implements IMemoryReference.value() for debugging and inspection.\n */\n value(): unknown {\n return this.get();\n }\n\n /**\n * Readonly access to subscriptions list.\n * Implements IMemoryReference.subscriptions for debugging and inspection.\n */\n get subscriptions(): ReadonlyArray<IMemorySubscription<unknown>> {\n return this._subscriptions as ReadonlyArray<IMemorySubscription<unknown>>;\n }\n\n get(): T | undefined {\n return this._memory.get<T>(this);\n }\n\n set(value: T): void {\n this._memory.set<T>(this, value);\n }\n\n /**\n * Subscribe to changes in this memory reference.\n * @param callback Function to call when the value changes\n * @param options Subscription options (immediate, throttle)\n * @returns Unsubscribe function\n */\n subscribe(\n callback: (newValue: T | undefined, oldValue: T | undefined) => void,\n options?: SubscriptionOptions,\n ): () => void {\n const subscriptionId = uuidv7();\n const subscription: IMemorySubscription<T> = {\n id: subscriptionId,\n callback,\n memoryId: this.id,\n createdAt: new Date(),\n };\n\n this._subscriptions.push(subscription);\n\n // Call immediately with current value if requested\n if (options?.immediate) {\n const currentValue = this.get();\n callback(currentValue, undefined);\n }\n\n // Return unsubscribe function\n return () => this.unsubscribe(subscriptionId);\n }\n\n /**\n * Unsubscribe from changes by subscription ID.\n * @param subscriptionId The ID of the subscription to remove\n */\n unsubscribe(subscriptionId: string): void {\n const index = this._subscriptions.findIndex(s => s.id === subscriptionId);\n if (index >= 0) {\n // Simply remove from array - no need for active flag\n this._subscriptions.splice(index, 1);\n }\n }\n\n /**\n * Check if this reference has any active subscribers.\n * @returns true if there are active subscribers\n */\n hasSubscribers(): boolean {\n return this._subscriptions.length > 0;\n }\n\n /**\n * Notify all subscribers of a value change.\n * This is called internally by RuntimeMemory.\n * @internal\n */\n notifySubscribers(newValue: T | undefined, oldValue: T | undefined): void {\n // All subscriptions in the array are active (removed ones are spliced out)\n for (const subscription of this._subscriptions) {\n try {\n subscription.callback(newValue, oldValue);\n } catch (error) {\n console.error(`Error in memory subscription callback:`, error);\n }\n }\n }\n}\n","import { IRuntimeMemory, MemorySearchCriteria } from './contracts/IRuntimeMemory';\nimport { IMemoryReference } from './contracts/IMemoryReference';\nimport { TypedMemoryReference } from './impl/TypedMemoryReference';\n\nexport type RuntimeMemoryLocation = {\n ref: IMemoryReference;\n data: unknown;\n}\n\n/**\n * RuntimeMemory is a pure storage system for runtime state.\n * \n * Note: This class does not dispatch events. Memory events (allocate, set, release)\n * are dispatched by BlockContext, which wraps memory operations and dispatches\n * events to the EventBus. This keeps RuntimeMemory decoupled from the event system.\n */\nexport class RuntimeMemory implements IRuntimeMemory {\n // Linear storage for memory locations\n private _references: RuntimeMemoryLocation[] = [];\n\n // Allocates a new memory location and returns a reference to it.\n allocate<T>(type: string, ownerId: string, initialValue?: T, visibility: 'public' | 'private' | 'inherited' = 'private'): TypedMemoryReference<T> {\n const ref = new TypedMemoryReference<T>(this, ownerId, type, visibility);\n this._references.push({ ref, data: initialValue });\n\n return ref;\n }\n\n\n // Gets the value for a given reference, or undefined if not found.\n get<T>(reference: TypedMemoryReference<T>): T | undefined {\n const loc = this._references.find(l => l.ref.id === reference.id);\n return (loc?.data as T) ?? undefined;\n }\n\n // Sets the value for a given reference. Throws if the reference is invalid.\n set<T>(reference: TypedMemoryReference<T>, value: T): void {\n const loc = this._references.find(l => l.ref.id === reference.id);\n if (!loc) {\n throw new Error(`Invalid memory reference: ${reference.id}`);\n }\n const oldValue = loc.data as T | undefined;\n loc.data = value;\n\n // Notify subscribers if value changed\n if (reference.hasSubscribers()) {\n reference.notifySubscribers(value, oldValue);\n }\n }\n\n // Searches for references matching any non-null fields in the criteria object.\n search(criteria: MemorySearchCriteria): IMemoryReference[] {\n\n return this._references\n .map(l => l.ref)\n .filter(ref => {\n if (criteria.id !== null && criteria.id !== undefined && criteria.id !== ref.id) return false;\n if (criteria.ownerId !== null && criteria.ownerId !== undefined && criteria.ownerId !== ref.ownerId) return false;\n if (criteria.type !== null && criteria.type !== undefined && criteria.type !== ref.type) return false;\n if (criteria.visibility !== null && criteria.visibility !== undefined && criteria.visibility !== ref.visibility) return false;\n return true;\n });\n }\n\n // Manually releases a memory reference.\n release(reference: IMemoryReference): void {\n const idx = this._references.findIndex(l => l.ref.id === reference.id);\n if (idx >= 0) {\n const loc = this._references[idx];\n const lastValue = loc.data;\n\n // If this is a TypedMemoryReference with subscribers, notify them before releasing\n const ref = loc.ref;\n if (ref instanceof TypedMemoryReference && ref.hasSubscribers()) {\n // Notify subscribers that the reference is being released\n ref.notifySubscribers(undefined, lastValue);\n }\n\n this._references.splice(idx, 1);\n }\n }\n}\n\n","/**\n * Enum for type-safe memory allocation in the runtime system.\n * Prevents typos and provides IDE autocomplete support.\n */\nexport enum MemoryTypeEnum {\n /**\n * Display stack state - Full UI display hierarchy state\n * Type: IDisplayStackState (timer stack, card stack, workout state)\n */\n DISPLAY_STACK_STATE = 'displaystack',\n\n /**\n * Action stack state - Available actions surfaced to UI\n * Type: ActionStackState\n */\n ACTION_STACK_STATE = 'actions',\n\n /**\n * Timer state prefix - use as `timer:${blockId}`\n * Type: TimerState\n */\n TIMER_PREFIX = 'timer:',\n\n /**\n * Handler prefix - use as `handler:${id}`\n * Type: IEventHandler\n */\n HANDLER_PREFIX = 'handler:',\n\n /**\n * Target reps for the current round/block\n * Type: number\n */\n METRIC_REPS = 'metric:reps',\n\n /**\n * Anchor for cross-block references\n * Type: IAnchorValue\n */\n ANCHOR = 'anchor',\n}\n","import { IEvent } from '../contracts/events/IEvent';\nimport { IMemoryReference } from '../contracts/IMemoryReference';\nimport { INowProvider, wallClockNow } from '../INowProvider';\n/**\n * Base class for memory events.\n */\nabstract class BaseMemoryEvent implements IEvent {\n abstract readonly name: string;\n readonly timestamp: Date;\n\n constructor(now: INowProvider = wallClockNow) {\n this.timestamp = now.now();\n }\n}\n\n/**\n * Event dispatched when a memory location is allocated.\n */\nexport class MemoryAllocateEvent extends BaseMemoryEvent {\n readonly name = 'memory:allocate';\n readonly data: {\n ref: IMemoryReference;\n value: unknown;\n };\n\n constructor(ref: IMemoryReference, value: unknown, now: INowProvider = wallClockNow) {\n super(now);\n this.data = { ref, value };\n }\n}\n\n/**\n * Event dispatched when a memory value is set/updated.\n */\nexport class MemorySetEvent extends BaseMemoryEvent {\n readonly name = 'memory:set';\n readonly data: {\n ref: IMemoryReference;\n value: unknown;\n oldValue: unknown;\n };\n\n constructor(ref: IMemoryReference, value: unknown, oldValue: unknown, now: INowProvider = wallClockNow) {\n super(now);\n this.data = { ref, value, oldValue };\n }\n}\n\n/**\n * Event dispatched when a memory location is released.\n */\nexport class MemoryReleaseEvent extends BaseMemoryEvent {\n readonly name = 'memory:release';\n readonly data: {\n ref: IMemoryReference;\n lastValue: unknown;\n };\n\n constructor(ref: IMemoryReference, lastValue: unknown, now: INowProvider = wallClockNow) {\n super(now);\n this.data = { ref, lastValue };\n }\n}\n","import { IBlockContext } from './contracts/IBlockContext';\nimport { IMemoryReference } from './contracts/IMemoryReference';\nimport { TypedMemoryReference } from './impl/TypedMemoryReference';\nimport type { IRuntimeContext } from './contracts/IRuntimeContext';\nimport { IRuntimeMemory } from './contracts/IRuntimeMemory';\nimport { RuntimeMemory } from './RuntimeMemory';\nimport { MemoryTypeEnum } from './models/MemoryTypeEnum';\nimport { IAnchorValue } from './contracts/IAnchorValue';\nimport { MemoryAllocateEvent, MemorySetEvent, MemoryReleaseEvent } from './events/MemoryEvents';\n\n/**\n * BlockContext implementation for runtime block memory management.\n * \n * Responsibilities:\n * - Allocate and track memory references for a single block\n * - Provide type-safe access to allocated memory\n * - Clean up all memory on release\n * \n * Lifecycle:\n * 1. Created by strategy with runtime and ownerId\n * 2. Strategy allocates memory via allocate()\n * 3. Memory references injected into behaviors\n * 4. Consumer calls release() after block disposal\n * \n * @example\n * ```typescript\n * const context = new BlockContext(runtime, 'block-123');\n * const ref = context.allocate<number>('counter', 0, 'private');\n * // ... use ref in behaviors ...\n * context.release(); // Clean up\n * ```\n */\nexport class BlockContext implements IBlockContext {\n private _references: IMemoryReference[] = [];\n private _released = false;\n private _memory: IRuntimeMemory;\n\n constructor(\n private readonly runtime: IRuntimeContext,\n public readonly ownerId: string,\n public readonly exerciseId: string = '',\n initialReferences: IMemoryReference[] = [],\n memory?: IRuntimeMemory\n ) {\n this._references = [...initialReferences];\n this._memory = memory ?? new RuntimeMemory();\n }\n\n get references(): ReadonlyArray<IMemoryReference> {\n return [...this._references];\n }\n\n allocate<T>(\n type: MemoryTypeEnum | string,\n initialValue?: T,\n visibility: 'public' | 'private' | 'inherited' = 'private'\n ): TypedMemoryReference<T> {\n if (this._released) {\n throw new Error(\n `Cannot allocate on released context (ownerId: ${this.ownerId})`\n );\n }\n\n // Convert enum to string for storage (enums are strings in runtime)\n const typeStr = type as string;\n\n const ref = this._memory.allocate<T>(\n typeStr,\n this.ownerId,\n initialValue,\n visibility\n );\n\n this._references.push(ref);\n\n // Dispatch memory:allocate event\n this.runtime.eventBus.dispatch(\n new MemoryAllocateEvent(ref, initialValue, this.runtime.nowProvider),\n this.runtime\n );\n\n return ref;\n }\n\n get<T>(type: MemoryTypeEnum | string): TypedMemoryReference<T> | undefined {\n const typeStr = type as string;\n const ref = this._references.find(r => r.type === typeStr);\n return ref as TypedMemoryReference<T> | undefined;\n }\n\n getAll<T>(type: MemoryTypeEnum | string): TypedMemoryReference<T>[] {\n const typeStr = type as string;\n return this._references.filter(\n r => r.type === typeStr\n ) as TypedMemoryReference<T>[];\n }\n\n set<T>(reference: TypedMemoryReference<T>, value: T): void {\n if (this._released) {\n throw new Error(\n `Cannot set on released context (ownerId: ${this.ownerId})`\n );\n }\n\n const oldValue = reference.get();\n this._memory.set(reference, value);\n\n // Dispatch memory:set event\n this.runtime.eventBus.dispatch(\n new MemorySetEvent(reference, value, oldValue, this.runtime.nowProvider),\n this.runtime\n );\n }\n\n release(): void {\n if (this._released) {\n return; // Idempotent\n }\n\n for (const ref of this._references) {\n const lastValue = ref.value();\n this._memory.release(ref);\n\n // Dispatch memory:release event\n this.runtime.eventBus.dispatch(\n new MemoryReleaseEvent(ref, lastValue, this.runtime.nowProvider),\n this.runtime\n );\n }\n\n this._references = [];\n this._released = true;\n }\n\n isReleased(): boolean {\n return this._released;\n }\n\n getOrCreateAnchor(anchorId: string): TypedMemoryReference<IAnchorValue> {\n if (this._released) {\n throw new Error(\n `Cannot access anchor on released context (ownerId: ${this.ownerId})`\n );\n }\n\n // Search for existing anchor with this ID in the stack\n let existingRef: TypedMemoryReference<IAnchorValue> | undefined;\n\n for (const block of this.runtime.stack.blocks) {\n const matching = block.context.references.find(\n r => r.id === anchorId && r.type === MemoryTypeEnum.ANCHOR\n );\n if (matching) {\n existingRef = matching as TypedMemoryReference<IAnchorValue>;\n break;\n }\n }\n\n if (existingRef) {\n // Add to our references if not already tracked\n if (!this._references.find(r => r.id === existingRef.id)) {\n this._references.push(existingRef);\n }\n\n return existingRef;\n }\n\n // Create new anchor in this block's memory\n // We use 'public' visibility so it can be shared via the stack\n const anchorRef = this._memory.allocate<IAnchorValue>(\n MemoryTypeEnum.ANCHOR,\n this.ownerId,\n undefined, // No initial value\n 'public'\n );\n\n // Ensure the ID matches the requested anchorId for consistent lookup\n anchorRef.id = anchorId;\n\n this._references.push(anchorRef);\n return anchorRef;\n }\n}\n","import { IMetric } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\n\n/**\n * Tags for memory locations. A block can have multiple locations with the same tag.\n * Tags replace the previous MemoryType keys but are no longer unique per block.\n *\n * Fragment tags follow the `metrics:*` namespace convention and are classified\n * into three visibility tiers:\n *\n * | Tier | Tags | Purpose |\n * |-----------|------------------------------------------|----------------------------------|\n * | display | `metrics:display` | Shown on UI cards |\n * | result | `metric:result` | Block output collected on pop |\n * | promote | `metric:promote`, `metric:rep-target` | Inherited by child blocks |\n * | private | `metric:tracked`, `metric:label` | Internal behavior state |\n *\n * @see MetricVisibility for classification helpers.\n */\nexport type MemoryTag =\n | 'time'\n | 'round'\n | 'children:status'\n | 'completion'\n | 'display'\n | 'controls'\n | 'metrics'\n // metric:display — public metric rendered on the UI card\n | 'metric:display'\n // metric:promote — metric promoted/inherited to child blocks\n | 'metric:promote'\n | 'metric:rep-target'\n // metric:result — block output metric collected on pop/completion\n | 'metric:result'\n // metric:private — internal behavior state (not shown in normal UI)\n | 'metric:tracked'\n | 'metric:label'\n // metric:hint — compiler hints (from dialects or effort markdown) consumed\n // by strategies via the hints contract (see core/metrics/hints.ts).\n | 'metric:hint'\n // metric:next — preview metric for the next child to be executed\n | 'metric:next';\n\n/**\n * A single memory location in a block's memory list.\n *\n * Memory locations are the fundamental unit of state storage in the runtime.\n * Multiple locations with the same tag can coexist, enabling:\n * - Multiple timers per block\n * - Multiple display rows per block (metrics:display)\n * - Multiple round counters\n *\n * All memory values are MetricContainer instances — metrics are the universal currency.\n */\nexport interface IMemoryLocation {\n /** Discriminator tag — multiple locations can share the same tag */\n readonly tag: MemoryTag;\n\n /** The metrics data stored at this location */\n readonly metrics: MetricContainer;\n\n /** Subscribe to changes at this location */\n subscribe(listener: (newValue: MetricContainer, oldValue: MetricContainer) => void): () => void;\n\n /** Update the metrics at this location */\n update(metrics: MetricContainer | IMetric[]): void;\n\n /** Dispose of this location and notify subscribers */\n dispose(): void;\n}\n\n/**\n * Concrete implementation of a memory location.\n *\n * Provides observable state storage with subscription management.\n * When disposed, sends empty array to all subscribers for cleanup.\n */\nexport class MemoryLocation implements IMemoryLocation {\n private _listeners = new Set<(nv: MetricContainer, ov: MetricContainer) => void>();\n private _metrics: MetricContainer;\n private _isDisposed = false;\n\n constructor(\n public readonly tag: MemoryTag,\n initialFragments: MetricContainer | IMetric[] = MetricContainer.empty()\n ) {\n this._metrics = MetricContainer.from(initialFragments, tag);\n }\n\n get metrics(): MetricContainer {\n return this._metrics;\n }\n\n update(metrics: MetricContainer | IMetric[]): void {\n if (this._isDisposed) {\n console.warn(`Attempted to update disposed MemoryLocation with tag '${this.tag}'`);\n return;\n }\n\n const old = this._metrics;\n this._metrics = MetricContainer.from(metrics, this.tag);\n\n // Notify all listeners\n for (const listener of this._listeners) {\n listener(this._metrics, old);\n }\n }\n\n subscribe(listener: (nv: MetricContainer, ov: MetricContainer) => void): () => void {\n if (this._isDisposed) {\n console.warn(`Attempted to subscribe to disposed MemoryLocation with tag '${this.tag}'`);\n return () => {}; // No-op unsubscribe\n }\n\n this._listeners.add(listener);\n return () => this._listeners.delete(listener);\n }\n\n dispose(): void {\n if (this._isDisposed) {\n return; // Multiple dispose calls are safe\n }\n\n this._isDisposed = true;\n const old = this._metrics;\n this._metrics = MetricContainer.empty(this.tag);\n\n // Notify all listeners about disposal\n for (const listener of this._listeners) {\n listener(this._metrics, old);\n }\n\n this._listeners.clear();\n }\n}\n","import { IEvent } from './contracts/events/IEvent';\nimport { IEventHandler } from './contracts/events/IEventHandler';\nimport { IRuntimeAction } from './contracts/IRuntimeAction';\nimport { IRuntimeBlock } from './contracts/IRuntimeBlock';\nimport { IRuntimeClock } from './contracts/IRuntimeClock';\nimport type { IRuntimeContext } from './contracts/IRuntimeContext';\nimport { IMetric } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { OutputStatement, OutputStatementType } from '@bitcobblers/wod-wiki-core';\nimport type { OutputStatementOptions } from '@bitcobblers/wod-wiki-core';\nimport { } from '@bitcobblers/wod-wiki-core';\nimport { TimeSpan } from './models/TimeSpan';\nimport { IMemoryLocation, MemoryLocation, MemoryTag } from './memory/MemoryLocation';\nimport {\n IBehaviorContext,\n BehaviorEventType,\n BehaviorEventListener,\n OutputOptions,\n SubscribeOptions,\n Unsubscribe,\n} from './contracts/IBehaviorContext';\n\n/**\n * BehaviorContext is the concrete implementation of IBehaviorContext.\n * \n * It is created by RuntimeBlock when a block is mounted and provides\n * behaviors with a unified API for:\n * - Subscribing to events (tick, next, etc.)\n * - Emitting events (for coordination)\n * - Emitting output statements (for reporting)\n * - Reading and writing block memory\n * - Marking the block as complete\n * \n * ## Lifecycle\n * \n * 1. Created during block.mount()\n * 2. Passed to behavior.onMount(ctx)\n * 3. Same context passed to behavior.onNext(ctx)\n * 4. Same context passed to behavior.onUnmount(ctx)\n * 5. dispose() called during block.unmount() to clean up subscriptions\n */\nexport class BehaviorContext implements IBehaviorContext {\n private subscriptions: Array<{ eventType: string; unsubscribe: () => void }> = [];\n /**\n * Capabilities registered on this context (or shared from the persistent\n * per-block context if one was injected).\n *\n * Capability state is block-scoped, not call-scoped: the `inspectNext`\n * path in `RuntimeBlock` constructs a fresh `BehaviorContext` per\n * invocation so it can run the onNext chain without side effects, but\n * capabilities declared during `onMount` must still be visible to\n * peer behaviors in any subsequent call. We therefore let an external\n * owner (the persistent `_behaviorContext` on `RuntimeBlock`) inject\n * the shared Set so all contexts for the same block observe the same\n * capabilities.\n */\n private _capabilities: Set<string>;\n\n constructor(\n readonly block: IRuntimeBlock,\n readonly clock: IRuntimeClock,\n readonly stackLevel: number,\n private runtime: IRuntimeContext,\n sharedCapabilities?: Set<string>\n ) {\n this._capabilities = sharedCapabilities ?? new Set<string>();\n }\n // ============================================================================\n // Event Subscription\n // ============================================================================\n\n subscribe(eventType: BehaviorEventType, listener: BehaviorEventListener, options?: SubscribeOptions): Unsubscribe {\n const self = this;\n const handler = {\n id: `behavior-${this.block.key.toString()}-${eventType}-${Date.now()}`,\n name: `BehaviorHandler-${this.block.label}-${eventType}`,\n handler: (event: IEvent, _runtime: IRuntimeContext): IRuntimeAction[] => {\n // For event callbacks, use the dispatching runtime's live clock\n // instead of the frozen mount-time SnapshotClock. This is critical\n // for tick handlers that need to see current time (e.g., TimerEndingBehavior).\n const callbackCtx: IBehaviorContext = Object.create(self, {\n clock: { value: _runtime.clock, enumerable: true, configurable: true }\n });\n return listener(event, callbackCtx);\n }\n } as unknown as IEventHandler;\n\n // Register with event bus scoped to this block\n const unsub = this.runtime.eventBus.register(\n eventType,\n handler,\n this.block.key.toString(),\n { scope: options?.scope ?? 'active' }\n );\n\n this.subscriptions.push({ eventType, unsubscribe: unsub });\n return unsub;\n }\n\n // ============================================================================\n // Event Emission\n // ============================================================================\n\n emitEvent(event: IEvent): void {\n this.runtime.handle(event);\n }\n\n // ============================================================================\n // Output Emission\n // ============================================================================\n\n emitOutput(\n type: OutputStatementType,\n metrics: MetricContainer | IMetric[],\n _options?: OutputOptions\n ): void {\n const now = this.clock.currentDate;\n\n // Extract raw spans from the block's timer memory.\n // These spans represent continuous periods of active (unpaused) execution.\n // A \"timestamp\" is a degenerate span where started === ended (zero duration).\n //\n // Time semantics derived from spans:\n // elapsed = sum of all span durations (pause-aware active time)\n // total = start of first span to end of last span (wall-clock bracket)\n const timerLocations = this.block.getMemoryByTag('time');\n let startTime = now.getTime();\n const endTime = now.getTime();\n let timerSpans: TimeSpan[] = [];\n\n if (timerLocations.length > 0) {\n const timerFragments = timerLocations[0].metrics;\n if (timerFragments.length > 0) {\n const timerValue = timerFragments[0].value as { spans?: TimeSpan[] } | undefined;\n if (timerValue?.spans && timerValue.spans.length > 0) {\n timerSpans = [...timerValue.spans];\n // Use the earliest span start as the output start time\n startTime = timerSpans[0].started;\n }\n }\n }\n\n // If the caller provided no metrics, pull display metrics from the\n // block's metrics:display memory so the output carries the source\n // label, effort, rep, etc. metrics that the UI needs to render.\n let effectiveFragments = MetricContainer.from(metrics, this.block.key.toString());\n if (effectiveFragments.length === 0) {\n const displayLocations = this.block.getMemoryByTag('metric:display');\n if (displayLocations.length > 0) {\n effectiveFragments = displayLocations[0].metrics.clone(this.block.key.toString());\n }\n }\n\n // Tag metrics with source block and timestamp\n const taggedFragments = effectiveFragments.map(f => ({\n ...f,\n sourceBlockKey: f.sourceBlockKey ?? this.block.key.toString(),\n timestamp: f.timestamp ?? now\n }));\n\n // Create the output statement with both the wall-clock timeSpan\n // and the raw spans for pause-aware elapsed/total computation.\n const output = new OutputStatement({\n outputType: type,\n timeSpan: new TimeSpan(startTime, endTime),\n spans: timerSpans.length > 0 ? timerSpans : undefined,\n sourceBlockKey: this.block.key.toString(),\n sourceStatementId: this.block.sourceIds?.[0],\n stackLevel: this.stackLevel,\n metrics: taggedFragments,\n completionReason: _options?.completionReason,\n } as OutputStatementOptions);\n\n // Add to runtime's output collection and notify subscribers\n this.addOutputToRuntime(output);\n }\n\n /**\n * Add output to the runtime's collection and notify subscribers.\n */\n private addOutputToRuntime(output: OutputStatement): void {\n this.runtime.addOutput(output);\n }\n\n // ============================================================================\n // List-Based Memory API\n // ============================================================================\n\n pushMemory(tag: MemoryTag, metrics: MetricContainer | IMetric[]): IMemoryLocation {\n const location = new MemoryLocation(tag, metrics);\n this.block.pushMemory(location);\n return location;\n }\n\n getMemoryByTag(tag: MemoryTag): IMemoryLocation[] {\n return this.block.getMemoryByTag(tag);\n }\n\n updateMemory(tag: MemoryTag, metrics: MetricContainer | IMetric[]): void {\n const locations = this.block.getMemoryByTag(tag);\n if (locations.length > 0) {\n locations[0].update(metrics);\n }\n }\n\n // ============================================================================\n // Capability Registry\n // ============================================================================\n\n declareCapability(cap: string): void {\n this._capabilities.add(cap);\n }\n\n hasCapability(cap: string): boolean {\n return this._capabilities.has(cap);\n }\n\n /**\n * Returns the Set used to store declared capabilities. Internal callers\n * (e.g. `RuntimeBlock.inspectNext`) pass this back to a fresh\n * `BehaviorContext` so that all contexts for the same block observe the\n * same capabilities without coupling the inspection context to a\n * specific owner.\n */\n getCapabilities(): Set<string> {\n return this._capabilities;\n }\n\n // ============================================================================\n // Block Control\n // ============================================================================\n\n markComplete(reason?: string): void {\n this.block.markComplete(reason);\n }\n // ============================================================================\n // Lifecycle\n // ============================================================================\n\n /**\n * Dispose of all subscriptions.\n * Called by RuntimeBlock during unmount.\n */\n dispose(): void {\n for (const { unsubscribe } of this.subscriptions) {\n try {\n unsubscribe();\n } catch (err) {\n console.error('[BehaviorContext] Unsubscribe error:', err);\n }\n }\n this.subscriptions = [];\n }\n}\n","/**\n * MetricVisibility.ts - Categorizes metrics memory tags by visibility level.\n *\n * All `metrics:*` memory tags carry typed metrics on runtime blocks.\n * This module introduces a three-tier visibility classification so the UI,\n * JIT compiler, and runtime can treat metrics memory consistently:\n *\n * | Visibility | Purpose | Example tags |\n * |------------|---------|-------------|\n * | `display` | Shown on the workout card in the UI (one row per location) | `metrics:display` |\n * | `result` | Block output metric collected when the block is popped | `metric:result` |\n * | `promote` | Promoted/inherited by child blocks during compilation | `metric:promote`, `metric:rep-target` |\n * | `private` | Internal behavior state; hidden from UI in normal mode | `metric:tracked`, `metric:label` |\n *\n * In **debug mode** the UI shows all three tiers, each with a distinguishing\n * icon so developers can inspect the full memory surface of every block.\n */\n\nimport { MemoryTag } from './MemoryLocation';\n\n// ---------------------------------------------------------------------------\n// Visibility enum\n// ---------------------------------------------------------------------------\n\n/**\n * The four visibility tiers for metrics memory tags.\n */\nexport type MetricVisibility = 'display' | 'result' | 'promote' | 'private';\n\n// ---------------------------------------------------------------------------\n// Classification helpers\n// ---------------------------------------------------------------------------\n\n/** Tags whose metrics are rendered in the UI card. */\nconst DISPLAY_TAGS: ReadonlySet<MemoryTag> = new Set<MemoryTag>([\n 'metric:display',\n]);\n\n/** Tags whose metrics are collected as block output on pop/completion. */\nconst RESULT_TAGS: ReadonlySet<MemoryTag> = new Set<MemoryTag>([\n 'metric:result',\n]);\n\n/** Tags whose metrics are promoted/inherited to child blocks. */\nconst PROMOTE_TAGS: ReadonlySet<MemoryTag> = new Set<MemoryTag>([\n 'metric:promote',\n 'metric:rep-target',\n]);\n\n/** Tags whose metrics are internal behavior state. */\nconst PRIVATE_TAGS: ReadonlySet<MemoryTag> = new Set<MemoryTag>([\n 'metric:tracked',\n 'metric:label',\n 'metric:next',\n]);\n\n/**\n * Returns the visibility tier for a given memory tag.\n *\n * - Known `metrics:*` tags are mapped via the static sets above.\n * - Any unknown `metric:*` tag defaults to `'private'`.\n * - Non-metric tags (e.g., `'timer'`, `'round'`) return `undefined`.\n */\nexport function getMetricVisibility(tag: MemoryTag): MetricVisibility | undefined {\n if (DISPLAY_TAGS.has(tag)) return 'display';\n if (RESULT_TAGS.has(tag)) return 'result';\n if (PROMOTE_TAGS.has(tag)) return 'promote';\n if (PRIVATE_TAGS.has(tag)) return 'private';\n\n // Any other `metrics:*` tag is assumed private\n if ((tag as string).startsWith('metric:')) return 'private';\n\n // Non-metrics tags have no metrics visibility\n return undefined;\n}\n\n/**\n * Returns `true` if the tag belongs to a metrics namespace.\n */\nexport function isFragmentTag(tag: MemoryTag): boolean {\n return (tag as string).startsWith('metric:') || tag === 'metrics';\n}\n\n/**\n * Filter memory tags by visibility tier.\n */\nexport function filterTagsByVisibility(\n tags: readonly MemoryTag[],\n visibility: MetricVisibility\n): MemoryTag[] {\n return tags.filter(tag => getMetricVisibility(tag) === visibility);\n}\n\n// ---------------------------------------------------------------------------\n// Icons for debug mode\n// ---------------------------------------------------------------------------\n\n/**\n * Unicode icon for each visibility tier.\n * Used in debug mode UI to label each metrics row.\n */\nexport const VISIBILITY_ICONS: Record<MetricVisibility, string> = {\n display: '👁', // Eye – publicly visible metric\n result: '📤', // Outbox tray – block output on pop\n promote: '⬆', // Up arrow – promoted to children\n private: '🔒', // Lock – internal/private state\n};\n\n/**\n * Short label for each visibility tier (used in debug badges).\n */\nexport const VISIBILITY_LABELS: Record<MetricVisibility, string> = {\n display: 'Display',\n result: 'Result',\n promote: 'Promote',\n private: 'Private',\n};\n","import { BlockKey } from '@bitcobblers/wod-wiki-core';\nimport type { IRuntimeContext } from './contracts/IRuntimeContext';\nimport { IRuntimeBehavior } from './contracts/IRuntimeBehavior';\nimport { BlockLifecycleOptions, CompletionDecision, IRuntimeBlock } from './contracts/IRuntimeBlock';\nimport { IRuntimeAction } from './contracts/IRuntimeAction';\nimport { IBlockContext } from './contracts/IBlockContext';\nimport { BlockContext } from './BlockContext';\nimport { BehaviorContext } from './BehaviorContext';\nimport { RuntimeLogger } from './RuntimeLogger';\nimport { IMemoryLocation, MemoryLocation, MemoryTag } from './memory/MemoryLocation';\nimport { MetricVisibility, getMetricVisibility } from './memory/MetricVisibility';\nimport { IMetric, MetricOrigin, MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { OutputStatement } from '@bitcobblers/wod-wiki-core';\nimport { } from '@bitcobblers/wod-wiki-core';\nimport { TimeSpan } from './models/TimeSpan';\nimport { IRuntimeClock } from './contracts/IRuntimeClock';\nimport { PopBlockAction } from './actions/stack/PopBlockAction';\n\n/**\n * Options for constructing a {@link RuntimeBlock}.\n *\n * Construction goes through a single options object — there is no positional\n * overload. The sanctioned way to build a block is {@link BlockBuilder.build},\n * and the four block subclasses (RestBlock, EffortBlock, SessionRootBlock,\n * WaitingToStartBlock) forward their own config into this shape.\n */\nexport interface RuntimeBlockOptions {\n /** The owning runtime. */\n runtime: IRuntimeContext;\n /** Source statement ids this block was compiled from. Defaults to `[]`. */\n sourceIds?: number[];\n /** Behaviors composed onto this block. Defaults to `[]`. */\n behaviors?: IRuntimeBehavior[];\n /** Block context. A {@link BlockContext} is created from the key when omitted. */\n context?: IBlockContext;\n /** Block key. A fresh {@link BlockKey} is created when omitted. */\n key?: BlockKey;\n /** Stable type tag (e.g. 'Rest', 'SessionRoot'). */\n blockType?: string;\n /** Optional label, stored as a `metric:label` memory location. */\n label?: string;\n /** Optional display metric groups, each stored as a `metric:display` location. */\n metrics?: MetricContainer[] | IMetric[][];\n}\n\n/**\n * RuntimeBlock represents an executable unit in the workout runtime.\n * \n * Blocks are composed of behaviors that handle specific aspects (time, iteration, completion, etc.)\n * Behaviors receive an IBehaviorContext that provides access to memory, events, and output emission.\n * \n * ## Lifecycle\n * \n * 1. Block is created by a strategy with behaviors attached\n * 2. mount() is called when pushed onto stack - behaviors receive onMount(ctx)\n * 3. next() is called when child completes or user advances - behaviors receive onNext(ctx)\n * 4. unmount() is called when popped from stack - behaviors receive onUnmount(ctx)\n * 5. dispose() is called for cleanup - behaviors receive onDispose(ctx)\n */\nexport class RuntimeBlock implements IRuntimeBlock {\n public readonly behaviors: IRuntimeBehavior[] = [];\n public readonly key: BlockKey;\n public readonly blockType?: string;\n public readonly context: IBlockContext;\n public readonly sourceIds: number[];\n\n // List-based memory storage\n private _memory: IMemoryLocation[] = [];\n\n /**\n * Computed label derived from the block's Label metrics.\n * Priority: Label metric in memory → blockType → 'Block'\n */\n get label(): string {\n // Check all memory locations for a Label metrics\n for (const loc of this._memory) {\n for (const frag of loc.metrics) {\n if (frag.type === MetricType.Label) {\n return frag.image || frag.value?.toString() || this.blockType || 'Block';\n }\n }\n }\n return this.blockType || 'Block';\n }\n\n // Behavior context (created on mount)\n protected _behaviorContext?: BehaviorContext;\n\n // Execution timing\n public readonly executionTiming: { startTime?: Date; endTime?: Date } = {};\n\n // Completion state\n private _isComplete: boolean = false;\n private _completionReason?: string;\n\n // Event unsubscribers\n private _eventUnsubscribers: Array<() => void> = [];\n\n // Runtime reference (set during mount)\n protected _runtime?: IRuntimeContext;\n\n constructor(options: RuntimeBlockOptions) {\n const {\n runtime,\n sourceIds = [],\n behaviors = [],\n context,\n key,\n blockType,\n label,\n metrics,\n } = options;\n\n this._runtime = runtime;\n this.sourceIds = sourceIds;\n this.behaviors = behaviors;\n this.key = key ?? new BlockKey();\n this.blockType = blockType;\n this.context = context ?? new BlockContext(runtime, this.key.toString());\n\n // Store label as a Label metrics in memory (only if explicitly provided)\n if (label) {\n this._memory.push(new MemoryLocation('metric:label', [{\n type: MetricType.Label,\n image: label,\n origin: 'compiler',\n value: label,\n } as IMetric]));\n }\n\n if (metrics) {\n for (const group of metrics) {\n this._memory.push(new MemoryLocation('metric:display', group));\n }\n }\n }\n\n // ============================================================================\n // List-Based Memory API\n // ============================================================================\n\n /**\n * Push a new memory location onto the block's memory list.\n * Multiple locations with the same tag can coexist.\n */\n pushMemory(location: IMemoryLocation): void {\n this._memory.push(location);\n }\n\n /**\n * Merge a set of compiler hints (e.g. from an effort markdown file) into\n * a `metric:hint` memory location. Hints are surfaced to strategies\n * exactly the same way dialect-emitted hints are. Duplicate keys are\n * overwritten (the effort hint wins, matching the doc's\n * \"more specific wins\" precedence).\n */\n mergeHints(hints: Readonly<Record<string, unknown>>): void {\n if (!hints || Object.keys(hints).length === 0) return;\n const existing = this._memory.find(loc => loc.tag === 'metric:hint');\n const newMetrics: IMetric[] = Object.entries(hints).map(([key, _value]) => ({\n type: MetricType.Hint,\n value: key,\n image: key,\n origin: 'compiler' as MetricOrigin,\n timestamp: new Date(),\n }));\n if (existing) {\n const newKeys = new Set(newMetrics.map(m => m.value as string));\n const kept = existing.metrics.toArray().filter(m => !(m.type === MetricType.Hint && newKeys.has(m.value as string)));\n existing.update([...kept, ...newMetrics]);\n } else {\n this._memory.push(new MemoryLocation('metric:hint', newMetrics));\n }\n }\n\n /**\n * Get all memory locations matching the given tag.\n * Returns an empty array if no locations match.\n */\n getMemoryByTag(tag: MemoryTag): IMemoryLocation[] {\n return this._memory.filter(loc => loc.tag === tag);\n }\n\n /**\n * Get all memory locations owned by this block.\n * Returns the full memory list in insertion order.\n */\n getAllMemory(): IMemoryLocation[] {\n return [...this._memory];\n }\n\n /**\n * Get all metrics memory locations matching a given visibility tier.\n *\n * @param visibility The visibility tier: 'display' | 'promote' | 'private'\n * @returns Memory locations whose tags belong to the requested tier\n */\n getMetricMemoryByVisibility(visibility: MetricVisibility): IMemoryLocation[] {\n return this._memory.filter(loc => getMetricVisibility(loc.tag) === visibility);\n }\n\n // ============================================================================\n // Backward-Compatible Memory API (shims over list-based memory)\n // ============================================================================\n\n // ============================================================================\n // Lifecycle Methods\n // ============================================================================\n\n /**\n * Register default event handlers for block-level events.\n * \n * Note: 'next' events are handled globally by NextEventHandler\n * registered in ScriptRuntime. Per-block 'next' handlers are not\n * needed and were removed to avoid unnecessary handler registrations.\n */\n protected registerDefaultHandler(): void {\n // No per-block handlers currently needed.\n // The global NextEventHandler in ScriptRuntime handles 'next' events.\n }\n\n /**\n * Called when this block is pushed onto the runtime stack.\n */\n mount(runtime: IRuntimeContext, options?: BlockLifecycleOptions): IRuntimeAction[] {\n this._runtime = runtime;\n\n // Use provided clock or fall back to runtime clock\n const clock = options?.clock ?? runtime.clock;\n this.executionTiming.startTime = options?.startTime ?? clock.currentDate;\n\n // Register default event handlers\n this.registerDefaultHandler();\n\n // Create behavior context with the appropriate clock\n const stackLevel = Math.max(0, runtime.stack.count - 1);\n this._behaviorContext = new BehaviorContext(this, clock, stackLevel, runtime);\n\n // Call behavior onMount hooks\n const actions: IRuntimeAction[] = [];\n for (const behavior of this.behaviors) {\n if (behavior.onMount) {\n const result = behavior.onMount(this._behaviorContext);\n if (result) {\n actions.push(...result);\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Inspect what the next() call would do, WITHOUT dispatching.\n *\n * PURE READ for completion state. Runs the behavior onNext chain against\n * a temporary BehaviorContext, captures the decision, and restores the\n * block's completion flag so the caller can inspect without side effects.\n *\n * The decision is DETERMINISTIC given the same runtime state: the same\n * behaviors, the same block memory, and the same clock always produce\n * the exact same decision (behaviors are assumed to be pure functions\n * of their context).\n *\n * @param runtime The script runtime context\n * @param options Lifecycle options including optional clock for timing consistency\n */\n inspectNext(runtime: IRuntimeContext, options?: BlockLifecycleOptions): CompletionDecision {\n if (!this._behaviorContext) {\n // Mirror next()'s no-context behavior: return an empty decision.\n // DO NOT warn — inspectNext is a pure read; calling before mount\n // is a valid test scenario.\n return { complete: false, actions: [] };\n }\n const clock = options?.clock ?? this._behaviorContext.clock;\n // Share the persistent context's capability registry so capabilities\n // declared in onMount remain visible to behavior chains in\n // inspectNext (which constructs a fresh per-call BehaviorContext).\n const nextContext = new BehaviorContext(\n this,\n clock,\n this._behaviorContext.stackLevel,\n runtime,\n this._behaviorContext.getCapabilities(),\n );\n // Snapshot completion state so we can restore it after inspection.\n // Behaviors may call ctx.markComplete() during the chain; we capture\n // the result without leaving a permanent mutation.\n const wasComplete = this._isComplete;\n const wasReason = this._completionReason;\n\n // Same per-call state reset as next() so behaviors that depend on\n // prepareForNextCycle see consistent state.\n for (const behavior of this.behaviors) {\n const behaviorWithPrepare = behavior as { prepareForNextCycle?: () => void };\n if (typeof behaviorWithPrepare.prepareForNextCycle === 'function') {\n behaviorWithPrepare.prepareForNextCycle();\n }\n }\n\n const actions: IRuntimeAction[] = [];\n for (const behavior of this.behaviors) {\n if (behavior.onNext) {\n const result = behavior.onNext(nextContext);\n if (result) {\n actions.push(...result);\n }\n }\n }\n\n // Dispose the temporary context immediately. The dispatch path (next())\n // does this too, so the lifecycle is identical.\n nextContext.dispose();\n\n // Auto-pop: if the chain marked the block complete and no PopBlockAction\n // was already queued, add one. This mirrors next()'s auto-pop logic.\n // Done before constructing the `decision` object so the captured\n // `actions` array reflects the full set the dispatcher will see.\n if (this._isComplete && !actions.some(a => a.type === 'pop-block')) {\n actions.push(new PopBlockAction());\n }\n\n // Capture the decision before restoring state.\n const decision: CompletionDecision = {\n complete: this._isComplete,\n reason: this._completionReason,\n actions,\n };\n\n // Restore completion state — inspectNext must not mutate the block.\n this._isComplete = wasComplete;\n this._completionReason = wasReason;\n\n return decision;\n }\n\n /**\n * Called when a child block completes or user advances.\n *\n * @param runtime The script runtime context\n * @param options Lifecycle options including optional clock for timing consistency\n */\n next(runtime: IRuntimeContext, options?: BlockLifecycleOptions): IRuntimeAction[] {\n if (!this._behaviorContext) {\n console.warn('[RuntimeBlock] next() called before mount()');\n return [];\n }\n\n // Use provided clock or fall back to existing context clock\n const clock = options?.clock ?? this._behaviorContext.clock;\n\n // Emit system output for next lifecycle event\n this.emitNextSystemOutput(runtime, clock);\n\n // Delegate the behavior chain to inspectNext. The actions and the\n // decision come back together; we just dispatch.\n const decision = this.inspectNext(runtime, options);\n\n // Apply the completion state from the decision. inspectNext restored\n // the original state, so we re-apply the mutation the behavior chain\n // intended. This keeps next() the single source of truth for stateful\n // side effects while inspectNext remains a pure read.\n if (decision.complete && !this._isComplete) {\n this.markComplete(decision.reason);\n }\n\n // Log the next call with resulting actions (preserves the existing log line)\n RuntimeLogger.logNext(this, [...decision.actions]);\n\n return decision.actions as IRuntimeAction[];\n }\n\n /**\n * Called when this block is popped from the runtime stack.\n * \n * @param runtime The script runtime context\n * @param options Lifecycle options including optional clock for timing consistency\n */\n unmount(runtime: IRuntimeContext, options?: BlockLifecycleOptions): IRuntimeAction[] {\n // Use provided clock or fall back to runtime clock\n const clock = options?.clock ?? runtime.clock;\n this.executionTiming.endTime = options?.createdAt ?? clock.currentDate;\n\n const actions: IRuntimeAction[] = [];\n\n // Create a fresh context for this unmount() call with the appropriate clock\n // This ensures all behaviors in this unmount() chain see the same frozen time\n const unmountContext = new BehaviorContext(\n this,\n clock,\n this._behaviorContext?.stackLevel ?? 0,\n runtime,\n this._behaviorContext?.getCapabilities(),\n );\n\n // Call behavior onUnmount hooks\n for (const behavior of this.behaviors) {\n if (behavior.onUnmount) {\n const result = behavior.onUnmount(unmountContext);\n if (result) {\n actions.push(...result);\n }\n }\n }\n\n // Dispose temporary context\n unmountContext.dispose();\n\n // Emit unmount event and capture any resulting actions\n const unmountEventActions = runtime.eventBus.dispatch({\n name: 'unmount',\n timestamp: runtime.clock.currentDate,\n data: { blockKey: this.key.toString() }\n }, runtime);\n if (unmountEventActions.length > 0) {\n actions.push(...unmountEventActions);\n }\n\n // Unregister event handlers\n for (const unsub of this._eventUnsubscribers) {\n try {\n unsub();\n } catch (err) {\n console.error('[RuntimeBlock] Error unsubscribing event handler:', err);\n }\n }\n this._eventUnsubscribers = [];\n\n // Dispose behavior context (cleans up subscriptions)\n if (this._behaviorContext) {\n this._behaviorContext.dispose();\n this._behaviorContext = undefined;\n }\n\n return actions;\n }\n\n /**\n * Called for final cleanup.\n */\n dispose(runtime: IRuntimeContext): void {\n // Create a temporary context if needed for dispose\n const ctx = this._behaviorContext ?? new BehaviorContext(\n this,\n runtime.clock,\n 0,\n runtime\n );\n\n for (const behavior of this.behaviors) {\n if (behavior.onDispose) {\n behavior.onDispose(ctx);\n }\n }\n\n // Clean up temporary context if we created one\n if (!this._behaviorContext && ctx) {\n ctx.dispose();\n }\n\n // Dispose list-based memory locations\n for (const location of this._memory) {\n location.dispose();\n }\n this._memory = [];\n }\n\n // ============================================================================\n // Completion\n // ============================================================================\n\n get isComplete(): boolean {\n return this._isComplete;\n }\n\n get completionReason(): string | undefined {\n return this._completionReason;\n }\n\n markComplete(reason?: string): void {\n this._isComplete = true;\n this._completionReason = reason;\n }\n\n // ============================================================================\n // Utilities\n // ============================================================================\n\n /**\n * Gets a specific behavior by type from the behaviors array.\n */\n getBehavior<T extends IRuntimeBehavior>(behaviorType: new (...args: any[]) => T): T | undefined {\n return this.behaviors.find(b => b instanceof behaviorType) as T | undefined;\n }\n\n /**\n * Emit a system output for next lifecycle event.\n * Called directly from next() to ensure accurate timing.\n */\n private emitNextSystemOutput(runtime: IRuntimeContext, clock: IRuntimeClock): void {\n const now = clock.currentDate;\n\n // Build structured data for the metrics value\n interface SystemOutputValue {\n event: 'next';\n blockKey: string;\n blockLabel?: string;\n actionType?: string;\n [key: string]: unknown;\n }\n\n const value: SystemOutputValue = {\n event: 'next',\n blockKey: this.key.toString(),\n blockLabel: this.label,\n // Include action type for debugging - helps trace what triggered this next() call\n actionType: 'next',\n };\n\n // Create the metrics\n const metric: IMetric = {\n type: MetricType.System,\n image: `next: ${this.label ?? this.blockType ?? 'Block'} [${this.key.toString().slice(0, 8)}]`,\n value,\n origin: 'runtime',\n timestamp: now,\n };\n\n // Create and emit the output statement\n const output = new OutputStatement({\n outputType: 'system',\n timeSpan: new TimeSpan(now.getTime(), now.getTime()),\n sourceBlockKey: this.key.toString(),\n stackLevel: runtime.stack.count,\n metrics: [metric],\n });\n\n runtime.addOutput(output);\n }\n}\n","import { IRuntimeBlock } from './contracts/IRuntimeBlock';\nimport { BlockKey } from '@bitcobblers/wod-wiki-core';\n\nimport { IRuntimeStack, StackListener, StackEvent } from './contracts/IRuntimeStack';\n\n/**\n * Lightweight runtime stack that only maintains state.\n * All complex logic (lifecycles, wrapping, hooks) has been moved to ScriptRuntime.\n * Stack events are dispatched via the EventBus in ScriptRuntime and via\n * independent subscribers on this stack.\n */\nexport class RuntimeStack implements IRuntimeStack {\n private readonly _blocks: IRuntimeBlock[] = [];\n private readonly _listeners: Set<StackListener> = new Set();\n\n /** Top-first view of blocks (copy) */\n public get blocks(): readonly IRuntimeBlock[] {\n return [...this._blocks].reverse();\n }\n\n public get count(): number {\n return this._blocks.length;\n }\n\n public get current(): IRuntimeBlock | undefined {\n if (this._blocks.length === 0) {\n return undefined;\n }\n return this._blocks[this._blocks.length - 1];\n }\n\n public get keys(): BlockKey[] {\n return this.blocks.map(b => b.key);\n }\n\n public push(block: IRuntimeBlock): void {\n this._blocks.push(block);\n this.notify({ type: 'push', block, depth: this._blocks.length, blocks: this.blocks });\n }\n\n public pop(): IRuntimeBlock | undefined {\n const block = this._blocks.pop();\n if (block) {\n this.notify({ type: 'pop', block, depth: this._blocks.length, blocks: this.blocks });\n }\n return block;\n }\n\n public clear(): void {\n while (this._blocks.length > 0) {\n this.pop();\n }\n }\n\n /**\n * Subscribe to stack changes.\n * New subscribers will immediately receive an 'initial' event with the current stack state.\n */\n public subscribe(listener: StackListener): () => void {\n this._listeners.add(listener);\n\n // Immediate notification of current state\n listener({ type: 'initial', blocks: this.blocks });\n\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n private notify(event: StackEvent): void {\n for (const listener of this._listeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('Error in stack listener:', error);\n }\n }\n }\n}\n","import type { INowProvider } from './INowProvider';\n\ndeclare global {\n interface Window {\n __chromecast_senderClockTimeMs?: () => number;\n }\n}\n\n/**\n * Returns the canonical \"now\" used for runtime timer interpolation.\n *\n * Browser workbench: falls back to Date.now().\n * Chromecast receiver: uses sender-synchronized clock when available.\n */\nexport function getRuntimeNowMs(): number {\n if (typeof window !== 'undefined') {\n const senderClock = window.__chromecast_senderClockTimeMs;\n if (typeof senderClock === 'function') {\n try {\n const value = senderClock();\n if (Number.isFinite(value)) {\n return value;\n }\n } catch {\n // Ignore sender clock failures and fall back to Date.now().\n }\n }\n }\n\n return Date.now();\n}\n\n/** Creates an INowProvider that reads the browser sender-clock when available. */\nexport function createBrowserRuntimeNow(): INowProvider {\n return {\n now: () => new Date(getRuntimeNowMs()),\n nowMs: () => getRuntimeNowMs(),\n };\n}\n","import { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { IBehaviorContext } from '../contracts/IBehaviorContext';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\n\n/**\n * CompletionTimestampBehavior records when a block is marked as complete.\n *\n * ## Universal Invariant\n *\n * This behavior is automatically added to ALL blocks by BlockBuilder.\n * It records the completion timestamp when the block's isComplete flag is set to true.\n * The timestamp is stored in block memory under the 'completion' tag.\n */\nexport class CompletionTimestampBehavior implements IRuntimeBehavior {\n private completionTime: Date | undefined;\n private wasComplete = false;\n\n onMount(_ctx: IBehaviorContext): IRuntimeAction[] {\n return [];\n }\n\n onNext(ctx: IBehaviorContext): IRuntimeAction[] {\n // Check if block was just marked complete and we haven't recorded the timestamp yet\n const blockState = (ctx.block as any).state;\n if (blockState && blockState.isComplete && !this.wasComplete && !this.completionTime) {\n this.completionTime = new Date(ctx.clock.currentDate);\n this.wasComplete = true;\n\n // Push completion timestamp to memory\n const completionFragment: IMetric = {\n type: MetricType.SystemTime, // System timestamp, not a duration or time state\n image: this.completionTime.toISOString(),\n origin: 'runtime',\n value: {\n createdAt: this.completionTime.getTime(),\n timestamp: this.completionTime\n },\n sourceBlockKey: ctx.block.key.toString(),\n timestamp: ctx.clock.currentDate,\n };\n\n ctx.pushMemory('completion', [completionFragment]);\n }\n return [];\n }\n\n onUnmount(_ctx: IBehaviorContext): IRuntimeAction[] {\n return [];\n }\n\n onDispose(_ctx: IBehaviorContext): void {\n // No cleanup needed\n }\n\n /**\n * Get the completion timestamp if the block has been completed.\n * @returns Completion timestamp or undefined\n */\n getCompletionTime(): Date | undefined {\n return this.completionTime;\n }\n}\n","import { IBehaviorContext } from '../contracts/IBehaviorContext';\nimport { TimerState } from '../memory/MemoryTypes';\nimport { } from '@bitcobblers/wod-wiki-core';\nimport { TimeSpan } from '../models/TimeSpan';\n\n/**\n * TimerSpans — the single module that owns how a block's timer span list is\n * read and transformed.\n *\n * ## Why this exists\n *\n * The open-span / close-span / append-span / reset dance was previously\n * hand-threaded (and `closeCurrentSpan` literally copy-pasted) across\n * CountupTimerBehavior, CountdownTimerBehavior, and SpanTrackingBehavior, with\n * the read-modify-write of `time` memory spelled out at every pause, resume,\n * unmount, and reset site. The span invariant (only the trailing span is open;\n * mutations preserve the metric fragment and only swap `spans`) lived nowhere.\n *\n * This module concentrates it:\n *\n * - **Pure span transforms** (`startSpan`, `closeCurrentSpan`, `openSpan`) are\n * unit-testable as plain array transforms, independent of any block.\n * - **`readTimer` / `mutateTimerSpans`** own the one correct way to read and\n * write the `time` memory location, preserving the metric fragment.\n *\n * Behaviors orchestrate *which* transform runs on *which* lifecycle hook; the\n * span math and memory plumbing live here.\n */\n\n/** Memory tag under which a block's timer state lives. */\nconst TIME_TAG = 'time';\n\n/** A list of execution spans. The trailing span may be open (`ended === undefined`). */\nexport type SpanList = readonly TimeSpan[];\n\n/**\n * Start a fresh span list with a single open span.\n * Used for the initial mount span and for interval/timer resets.\n */\nexport function startSpan(nowMs: number): TimeSpan[] {\n return [new TimeSpan(nowMs)];\n}\n\n/**\n * Close the trailing open span at `nowMs` (pause / unmount).\n * No-op for spans that are already closed.\n */\nexport function closeCurrentSpan(spans: SpanList, nowMs: number): TimeSpan[] {\n return spans.map((span, i) =>\n i === spans.length - 1 && span.ended === undefined\n ? new TimeSpan(span.started, nowMs)\n : span\n );\n}\n\n/** Append a new open span at `nowMs` (resume). */\nexport function openSpan(spans: SpanList, nowMs: number): TimeSpan[] {\n return [...spans, new TimeSpan(nowMs)];\n}\n\n/**\n * Read the `TimerState` from a block's `time` memory, or `undefined` if absent.\n * This is the canonical accessor — prefer it over reaching into\n * `getMemoryByTag('time')[0]?.metrics[0]?.value` by hand.\n */\nexport function readTimer(ctx: IBehaviorContext): TimerState | undefined {\n return ctx.getMemoryByTag(TIME_TAG)[0]?.metrics[0]?.value as TimerState | undefined;\n}\n\n/**\n * Apply a span transform to the block's `time` memory, preserving the metric\n * fragment (image, direction, durationMs, label, role) and swapping only the\n * `spans` array.\n *\n * @returns `true` when the timer existed and was updated; `false` otherwise.\n */\nexport function mutateTimerSpans(\n ctx: IBehaviorContext,\n transform: (spans: SpanList, nowMs: number) => TimeSpan[]\n): boolean {\n const fragment = ctx.getMemoryByTag(TIME_TAG)[0]?.metrics[0];\n const timer = fragment?.value as TimerState | undefined;\n if (!timer || !fragment) return false;\n\n const spans = transform(timer.spans, ctx.clock.currentDate.getTime());\n ctx.updateMemory(TIME_TAG, [{ ...fragment, value: { ...timer, spans } }]);\n return true;\n}\n","import { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { IBehaviorContext } from '../contracts/IBehaviorContext';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { TimerState } from '../memory/MemoryTypes';\nimport { IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\nimport { startSpan, closeCurrentSpan, readTimer, mutateTimerSpans } from '../time/TimerSpans';\n\n/**\n * SpanTrackingBehavior records the wall-clock time a block was active.\n *\n * ## Aspect: Time (Span-only)\n *\n * No tick subscription, no pause/resume, no completion signal.\n * Simply opens a TimeSpan on mount and closes it on unmount so the\n * block's execution window is captured in memory for history/reporting.\n *\n * Use this for blocks that need timing data but do NOT display a running\n * timer, e.g. effort leaves where elapsed is only needed for reports.\n */\nexport class SpanTrackingBehavior implements IRuntimeBehavior {\n onMount(ctx: IBehaviorContext): IRuntimeAction[] {\n const now = ctx.clock.currentDate.getTime();\n const label = ctx.block.label;\n\n const metric: IMetric = {\n type: MetricType.Time,\n image: '0:00',\n origin: 'runtime',\n value: {\n spans: startSpan(now),\n direction: 'up',\n durationMs: undefined,\n label,\n role: 'hidden'\n } satisfies TimerState,\n sourceBlockKey: ctx.block.key.toString(),\n timestamp: ctx.clock.currentDate,\n };\n\n ctx.pushMemory('time', [metric]);\n return [];\n }\n\n onNext(_ctx: IBehaviorContext): IRuntimeAction[] {\n return [];\n }\n\n onUnmount(ctx: IBehaviorContext): IRuntimeAction[] {\n const timerState = readTimer(ctx);\n if (!timerState || timerState.spans.length === 0) return [];\n mutateTimerSpans(ctx, closeCurrentSpan);\n return [];\n }\n\n onDispose(_ctx: IBehaviorContext): void {\n // No subscriptions — nothing to clean up\n }\n}\n","import { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { IBehaviorContext, Unsubscribe } from '../contracts/IBehaviorContext';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\nimport { TimerState } from '../memory/MemoryTypes';\nimport { startSpan, closeCurrentSpan, openSpan, mutateTimerSpans } from '../time/TimerSpans';\n\nexport interface CountupTimerConfig {\n /** Human-readable label shown in the display layer */\n label?: string;\n /** Timer role for display priority */\n role?: 'primary' | 'secondary' | 'hidden' | 'auto';\n}\n\n/**\n * CountupTimerBehavior manages the full lifecycle of a count-up timer.\n *\n * ## Aspect: Time (Count-up)\n *\n * Covers the complete lifecycle for blocks without a fixed duration:\n * - **mount**: opens an initial TimeSpan to start tracking\n * - **pause/resume events**: closes/opens spans to exclude paused time\n * - **unmount**: closes the current span to finalise elapsed time\n *\n * There is no tick subscription and no completion signal — the block\n * advances only when the user (or a parent) calls `next()`.\n *\n * Strategies: assign this directly instead of composing TimerInitBehavior\n * + TimerTickBehavior + TimerPauseBehavior.\n */\nexport class CountupTimerBehavior implements IRuntimeBehavior {\n constructor(public readonly config: CountupTimerConfig = {}) { }\n\n private subscriptions: Unsubscribe[] = [];\n private isPaused = false;\n\n onMount(ctx: IBehaviorContext): IRuntimeAction[] {\n const now = ctx.clock.currentDate.getTime();\n const label = this.config.label ?? ctx.block.label;\n const role = this.config.role === 'hidden' ? 'auto' : (this.config.role ?? 'primary');\n\n ctx.pushMemory('time', [this.createFragment(ctx, {\n spans: startSpan(now),\n direction: 'up',\n durationMs: undefined,\n label,\n role\n })]);\n\n // Pause — close current span\n this.subscriptions.push(\n ctx.subscribe('timer:pause' as any, (_event, pCtx) => {\n if (this.isPaused) return [];\n if (mutateTimerSpans(pCtx, closeCurrentSpan)) this.isPaused = true;\n return [];\n })\n );\n\n // Resume — open a new span\n this.subscriptions.push(\n ctx.subscribe('timer:resume' as any, (_event, rCtx) => {\n if (!this.isPaused) return [];\n if (mutateTimerSpans(rCtx, openSpan)) this.isPaused = false;\n return [];\n })\n );\n\n return [];\n }\n\n onNext(_ctx: IBehaviorContext): IRuntimeAction[] {\n return [];\n }\n\n onUnmount(ctx: IBehaviorContext): IRuntimeAction[] {\n mutateTimerSpans(ctx, closeCurrentSpan);\n return [];\n }\n\n onDispose(_ctx: IBehaviorContext): void {\n for (const unsub of this.subscriptions) {\n try { unsub(); } catch { /* no-op */ }\n }\n this.subscriptions.length = 0;\n }\n\n private createFragment(ctx: IBehaviorContext, state: TimerState): IMetric {\n return {\n type: MetricType.Time,\n image: '0:00',\n origin: 'runtime',\n value: state,\n sourceBlockKey: ctx.block.key.toString(),\n timestamp: ctx.clock.currentDate,\n };\n }\n}\n","import { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\nimport { PopBlockAction } from './PopBlockAction';\nimport { NextAction } from './NextAction';\n\n/**\n * ClearChildrenAction pops all blocks above a target block on the stack.\n *\n * Used when a parent timer expires (AMRAP/EMOM) and active children must\n * be force-completed and removed. Each child is popped via PopBlockAction\n * so the full lifecycle runs:\n *\n * 1. PopBlockAction checks isComplete → marks 'forced-pop' if not yet complete\n * 2. Unmount fires → ReportOutputBehavior writes result memory (elapsed/spans),\n * then the pop emits a single 'segment' output carrying those fragments\n * 3. Block is disposed and cleaned up\n *\n * After all children are cleared, a NextAction is queued so the parent\n * block (now on top) receives its next() call, where the container's\n * ExitBehavior (deferred) can pop it cleanly.\n *\n * ## Example: AMRAP timer expires mid-exercise\n *\n * Stack: [Session, AMRAP, Pullups]\n * Timer fires → ClearChildrenAction(AMRAP.key)\n * → PopBlockAction pops Pullups (forced-pop, fragments reported)\n * → NextAction on AMRAP → ExitBehavior (deferred) → PopBlockAction\n * → Session receives next(), advances to review\n */\nexport class ClearChildrenAction implements IRuntimeAction {\n readonly type = 'clear-children';\n\n constructor(private readonly targetBlockKey: string) { }\n\n do(runtime: IRuntimeContext): IRuntimeAction[] {\n const actions: IRuntimeAction[] = [];\n const MAX_ITERATIONS = 20; // Safety limit matching ExecutionContext\n let iterations = 0;\n\n // Pop all blocks above the target block\n while (iterations < MAX_ITERATIONS) {\n const current = runtime.stack.current;\n if (!current) {\n break;\n }\n\n // Stop when we reach the target block (don't pop it)\n if (current.key.toString() === this.targetBlockKey) {\n break;\n }\n\n // Pop this child using standard PopBlockAction lifecycle.\n // PopBlockAction handles forced-pop marking for incomplete blocks.\n // We execute it inline rather than returning it to avoid LIFO\n // ordering issues — children must pop sequentially top-to-bottom.\n const popAction = new PopBlockAction();\n // Execute pop inline — the pop action will handle:\n // - marking incomplete blocks as forced-pop\n // - running unmount lifecycle (metrics emission)\n // - disposing the block\n // We collect any unmount side-effect actions but discard\n // the NextAction that PopBlockAction normally queues (we'll\n // queue our own single NextAction at the end).\n const popResults = popAction.do(runtime);\n\n // Filter: keep unmount side-effects, drop NextAction\n // (we queue a single NextAction after all children are cleared)\n for (const result of popResults) {\n if (result.type !== 'next') {\n actions.push(result);\n }\n }\n\n iterations++;\n }\n\n if (iterations >= MAX_ITERATIONS) {\n console.error(`[ClearChildrenAction] Max iterations reached, possible infinite loop`);\n }\n\n // Queue a NextAction so the target block (now on top) gets its next() call.\n // For AMRAP/EMOM, ExitBehavior (deferred) will fire and pop the parent.\n if (runtime.stack.current?.key.toString() === this.targetBlockKey) {\n actions.push(new NextAction(undefined, runtime.nowProvider));\n }\n\n return actions;\n }\n}\n","import { TimerState } from '../memory/MemoryTypes';\n\n/**\n * Calculates **Elapsed** time from timer spans.\n *\n * Iterates the span list, summing (end − start) for each span.\n * Open spans (no `ended`) use `now` as the end timestamp.\n *\n * This is the canonical Elapsed computation — all behaviors\n * that need pause-aware active time should use this function.\n *\n * ## Glossary (docs/architecture/time-terminology.md)\n * - **Elapsed** = Σ(end − start) per span (this function)\n * - **Total** = lastEnd − firstStart (computed elsewhere)\n *\n * @param timer The timer state containing the Time spans\n * @param now Current timestamp in milliseconds for open spans\n * @returns Elapsed time in milliseconds (active only, excludes pauses)\n */\nexport function calculateElapsed(timer: TimerState, now: number): number {\n let total = 0;\n for (const span of timer.spans) {\n const end = span.ended ?? now;\n total += end - span.started;\n }\n return total;\n}\n\n/**\n * Formats milliseconds as mm:ss for display.\n *\n * @param ms Duration or Elapsed value in milliseconds\n * @returns Formatted string like \"5:03\"\n */\nexport function formatDuration(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n const mins = Math.floor(totalSeconds / 60);\n const secs = totalSeconds % 60;\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\n\n/**\n * CurrentRoundMetric represents the live round counter during execution.\n *\n * This is a **runtime** metrics — it is NOT set by the parser. It tracks\n * which round the block is currently executing (e.g., \"Round 2 of 5\").\n *\n * ## Relationship to RoundsMetric\n * - **RoundsMetric** (parser-origin) = the plan: how many rounds total\n * (e.g., `(3)` → count = 3, or `(21-15-9)` → count = 3).\n * - **CurrentRoundMetric** (runtime-origin) = recorded progress: which\n * round is currently active.\n *\n * ## Relationship to re-entry behaviors\n * Created by the Re-Entry / Round output aspect on mount and each `onNext()`.\n * Written to `round` memory tag alongside timer milestone outputs.\n *\n * @example\n * // Round 2 of 5\n * new CurrentRoundMetric(2, 5, 'block-key', new Date())\n *\n * // Round 3 (unbounded — AMRAP)\n * new CurrentRoundMetric(3, undefined, 'block-key', new Date())\n */\nexport class CurrentRoundMetric implements IMetric {\n readonly type = MetricType.CurrentRound;\n readonly origin: MetricOrigin = 'tracked';\n readonly value: number;\n readonly image: string;\n\n /**\n * @param current The current round number (1-based)\n * @param total Total number of planned rounds (undefined for unbounded)\n * @param sourceBlockKey Block that owns this round counter\n * @param timestamp When this metrics was created\n * @param customImage Optional custom image string (e.g., \"Completed 3 Round(s)\")\n */\n constructor(\n readonly current: number,\n readonly total: number | undefined,\n readonly sourceBlockKey?: string,\n readonly timestamp?: Date,\n customImage?: string\n ) {\n this.value = current;\n this.image = customImage ?? (total !== undefined\n ? `Round ${current} of ${total}`\n : `Round ${current}`);\n }\n}\n","import { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { IBehaviorContext, Unsubscribe } from '../contracts/IBehaviorContext';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { TimerState, ChildrenStatusState, RoundState } from '../memory/MemoryTypes';\nimport { IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\nimport { ClearChildrenAction } from '../actions/stack/ClearChildrenAction';\nimport { calculateElapsed } from '../time/calculateElapsed';\nimport { startSpan, closeCurrentSpan, openSpan, readTimer, mutateTimerSpans } from '../time/TimerSpans';\nimport { CurrentRoundMetric } from '../compiler/metrics/CurrentRoundMetric';\n\n/**\n * Controls what happens when the countdown reaches zero.\n *\n * - `complete-block`: marks the block complete and clears children.\n * Use for timers that own the block's lifecycle (AMRAP cap, timed effort).\n * - `reset-interval`: resets spans and children state for the next round.\n * Use for repeating-interval timers where the block lives across many rounds (EMOM).\n */\nexport type CountdownMode = 'complete-block' | 'reset-interval';\n\nexport interface CountdownTimerConfig {\n /** Duration in milliseconds — required for a countdown */\n durationMs: number;\n /** Human-readable label shown in the display layer */\n label?: string;\n /** Timer role for display priority */\n role?: 'primary' | 'secondary' | 'hidden' | 'auto';\n /**\n * What happens when elapsed >= durationMs.\n * Defaults to `'complete-block'`.\n */\n mode?: CountdownMode;\n /** Factory to create a rest block for \"next\" transitions */\n restBlockFactory?: (durationMs: number, label?: string) => IRuntimeAction[];\n /**\n * If true, the user cannot skip this timer. Pressing \"Next\" emits a\n * `timer:skip-attempt` event instead of advancing the block.\n */\n required?: boolean;\n}\n\n/**\n * CountdownTimerBehavior manages the full lifecycle of a count-down timer.\n *\n * ## Aspect: Time (Count-down)\n *\n * Covers the complete lifecycle for blocks with a fixed duration:\n * - **mount**: opens an initial TimeSpan; checks immediate expiry\n * - **tick events**: monitors elapsed time and fires `timer:complete` on expiry\n * - **pause/resume events**: closes/opens spans to exclude paused time\n * - **unmount**: closes the current span to finalise elapsed time\n *\n * Strategies assign this one behavior instead of composing the old quartet\n * (TimerInitBehavior + TimerTickBehavior + TimerEndingBehavior + TimerPauseBehavior).\n */\nexport class CountdownTimerBehavior implements IRuntimeBehavior {\n constructor(public readonly config: CountdownTimerConfig) { }\n\n private subscriptions: Unsubscribe[] = [];\n private isPaused = false;\n\n onMount(ctx: IBehaviorContext): IRuntimeAction[] {\n const now = ctx.clock.currentDate.getTime();\n const label = this.config.label ?? ctx.block.label;\n const role = this.config.role === 'hidden' ? 'auto' : (this.config.role ?? 'primary');\n const mode = this.config.mode ?? 'complete-block';\n\n ctx.pushMemory('time', [this.createFragment(ctx, {\n spans: startSpan(now),\n direction: 'down',\n durationMs: this.config.durationMs,\n label,\n role\n })]);\n\n // Immediate expiry check (e.g. duration was already 0 when compiled)\n if (this.config.durationMs <= 0) {\n this.handleExpiry(ctx, mode);\n return [new ClearChildrenAction(ctx.block.key.toString())];\n }\n\n // Tick subscription — monitors elapsed and triggers expiry\n this.subscriptions.push(\n ctx.subscribe('tick', (_event, tickCtx) => {\n const timer = readTimer(tickCtx);\n if (!timer || timer.direction !== 'down' || timer.durationMs === undefined) {\n return [];\n }\n // Once block is complete in complete-block mode, stop monitoring\n if (mode === 'complete-block' && tickCtx.block.isComplete) {\n return [];\n }\n const elapsed = calculateElapsed(timer, tickCtx.clock.currentDate.getTime());\n if (elapsed < timer.durationMs) return [];\n\n this.handleExpiry(tickCtx, mode);\n return [new ClearChildrenAction(tickCtx.block.key.toString())];\n }, { scope: 'bubble' })\n );\n\n // Timer Reset — for EMOM manual skip or synchronization\n this.subscriptions.push(\n ctx.subscribe('timer:reset' as any, (_event, rCtx) => {\n if (mode !== 'reset-interval') return [];\n mutateTimerSpans(rCtx, (_spans, nowMs) => startSpan(nowMs));\n return [];\n })\n );\n\n // Pause — close current span\n this.subscriptions.push(\n ctx.subscribe('timer:pause' as any, (_event, pCtx) => {\n if (this.isPaused) return [];\n if (mutateTimerSpans(pCtx, closeCurrentSpan)) this.isPaused = true;\n return [];\n })\n );\n\n // Resume — open a new span\n this.subscriptions.push(\n ctx.subscribe('timer:resume' as any, (_event, rCtx) => {\n if (!this.isPaused) return [];\n if (mutateTimerSpans(rCtx, openSpan)) this.isPaused = false;\n return [];\n })\n );\n\n return [];\n }\n\n onNext(ctx: IBehaviorContext): IRuntimeAction[] {\n // Required timers cannot be skipped — emit a skip-attempt event instead.\n if (this.config.required && !ctx.block.isComplete) {\n ctx.emitEvent({\n name: 'timer:skip-attempt' as any,\n timestamp: ctx.clock.currentDate,\n data: { blockKey: ctx.block.key.toString() }\n });\n return [];\n }\n // Parent blocks (those with child selection) should NEVER push their own rest.\n // ChildSelectionBehavior handles rest injection (EMOM) or sibling transitions.\n // Coordination is via the `'childSelection'` capability declared by\n // ChildSelectionBehavior — avoids both circular imports and\n // `behaviors[i].constructor.name` string inspection.\n if (ctx.hasCapability('childSelection')) {\n return [];\n }\n if (!this.config.restBlockFactory) {\n return [];\n }\n\n const timer = readTimer(ctx);\n if (!timer || timer.direction !== 'down' || !timer.durationMs) {\n return [];\n }\n\n const remainingMs = this.getRemainingCountdownMs(ctx);\n\n // Only inject rest if more than 1s remaining (matching ChildSelectionBehavior logic)\n if (remainingMs > 1000) {\n return this.config.restBlockFactory(remainingMs, 'Rest');\n }\n\n return [];\n }\n\n onUnmount(ctx: IBehaviorContext): IRuntimeAction[] {\n mutateTimerSpans(ctx, closeCurrentSpan);\n return [];\n }\n\n onDispose(_ctx: IBehaviorContext): void {\n for (const unsub of this.subscriptions) {\n try { unsub(); } catch { /* no-op */ }\n }\n this.subscriptions.length = 0;\n }\n\n // -------------------------------------------------------------------------\n\n private handleExpiry(ctx: IBehaviorContext, mode: CountdownMode): void {\n ctx.emitEvent({\n name: 'timer:complete',\n timestamp: ctx.clock.currentDate,\n data: { blockKey: ctx.block.key.toString() }\n });\n\n if (mode === 'complete-block') {\n ctx.markComplete('timer-expired');\n } else {\n // reset-interval: new span starting now, reset child cursor\n mutateTimerSpans(ctx, (_spans, nowMs) => startSpan(nowMs));\n\n // If ChildSelectionBehavior is present, it will handle round/status advancement\n // via its own logic (coordinated with Rest block popping or manual next).\n // We use the `'childSelection'` capability to avoid coupling on the\n // concrete class identity.\n if (ctx.hasCapability('childSelection')) {\n return;\n }\n\n // Cycle complete — advance round counter directly before\n // resetting for the next cycle. This keeps round tracking\n // self-contained for simple repeating timers without children.\n const round = ctx.getMemoryByTag('round')[0]?.metrics[0] as unknown as RoundState | undefined;\n if (round) {\n const roundFragment = new CurrentRoundMetric(\n round.current + 1,\n round.total,\n ctx.block.key.toString(),\n ctx.clock.currentDate,\n );\n ctx.updateMemory('round', [roundFragment]);\n }\n\n const childLoc = ctx.getMemoryByTag('children:status')[0];\n const childStatus = childLoc?.metrics[0]?.value as ChildrenStatusState | undefined;\n const newChildStatus = { childIndex: 0, totalChildren: childStatus?.totalChildren ?? 0, allExecuted: false, allCompleted: false };\n if (childLoc?.metrics[0]) {\n ctx.updateMemory('children:status', [{...childLoc.metrics[0], value: newChildStatus}]);\n } else {\n ctx.pushMemory('children:status', [{type: 0 as any, image: '', origin: 'runtime' as any, value: newChildStatus}]);\n }\n }\n }\n\n private getRemainingCountdownMs(ctx: IBehaviorContext): number {\n const timer = readTimer(ctx);\n if (!timer || timer.direction !== 'down' || !timer.durationMs) {\n return 0;\n }\n\n const now = ctx.clock.currentDate.getTime();\n const elapsed = calculateElapsed(timer, now);\n return Math.max(0, timer.durationMs - elapsed);\n }\n\n private createFragment(ctx: IBehaviorContext, state: TimerState): IMetric {\n return {\n type: MetricType.Time,\n image: formatDuration(state.durationMs),\n origin: 'runtime',\n value: state,\n sourceBlockKey: ctx.block.key.toString(),\n timestamp: ctx.clock.currentDate,\n };\n }\n}\n\nfunction formatDuration(durationMs: number | undefined): string {\n if (!durationMs || durationMs === 0) return '0:00';\n const totalSeconds = Math.floor(durationMs / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n if (hours > 0) {\n return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n }\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n}\n\n","import { MetricOrigin, MetricType, IMetric } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { IRepSource } from '../contracts/behaviors/IRepSource';\nimport { IBehaviorContext } from '../contracts/IBehaviorContext';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { MemoryTag } from '../memory/MemoryLocation';\nimport { RoundState } from '../memory/MemoryTypes';\nimport { IMetricPromoter } from '../contracts/behaviors/IMetricPromoter';\nimport type { IRuntimeContext } from '../contracts/IRuntimeContext';\nimport { IRuntimeBlock } from '../contracts/IRuntimeBlock';\nimport { IBlockRef } from '../contracts/primitives/IBlockRef';\n\nexport interface PromotionRule {\n metricType: MetricType;\n origin?: MetricOrigin;\n enableDynamicUpdates?: boolean;\n sourceTag?: MemoryTag;\n}\n\nexport interface MetricPromotionConfig {\n promotions: PromotionRule[];\n repScheme?: number[];\n}\n\nexport class MetricPromotionBehavior implements IRuntimeBehavior, IRepSource, IMetricPromoter {\n private readonly _repScheme: readonly number[];\n private _lastPromotedRound: number | undefined;\n\n constructor(private readonly config: MetricPromotionConfig) {\n this._repScheme = [...(config.repScheme ?? [])];\n }\n\n get repScheme(): readonly number[] {\n return this._repScheme;\n }\n\n getRepsForRound(round: number): number | undefined {\n if (this._repScheme.length === 0) return undefined;\n const index = (round - 1) % this._repScheme.length;\n return this._repScheme[index];\n }\n\n getRepsForCurrentRound(): number | undefined {\n if (this._lastPromotedRound === undefined) {\n return this._repScheme[0];\n }\n\n return this.getRepsForRound(this._lastPromotedRound);\n }\n\n /**\n * Compiler-time promotion handler.\n *\n * Queries current state from parent block memory and returns the\n * correct metrics to be injected into child blocks during JIT\n * compilation. This ensures inheritance works even when a round\n * advances and children are compiled in the same runtime tick.\n */\n getPromotedFragments(runtime: IRuntimeContext, parentBlock: IRuntimeBlock): MetricContainer {\n const metrics = MetricContainer.empty(parentBlock.key.toString());\n\n // 1. Dynamic rep scheme promotion\n if (this._repScheme.length > 0) {\n const roundState = parentBlock.getMemoryByTag('round')[0]?.metrics[0] as unknown as RoundState | undefined;\n const round = roundState?.current ?? 1;\n const reps = this.getRepsForRound(round);\n \n if (reps !== undefined) {\n metrics.add({\n type: MetricType.Rep,\n image: reps.toString(),\n origin: 'compiler',\n value: reps,\n sourceBlockKey: parentBlock.key.toString(),\n timestamp: runtime.clock.currentDate,\n });\n }\n }\n\n // 2. Generic promotion rules\n // For each rule, find the source metrics in parent memory and promote it\n for (const rule of this.config.promotions) {\n const sourceFragment = this.findSourceFragmentInBlock(parentBlock, rule);\n if (sourceFragment) {\n metrics.add({\n ...sourceFragment,\n origin: rule.origin ?? 'compiler'\n });\n }\n }\n\n return metrics;\n }\n\n onMount(ctx: IBehaviorContext): IRuntimeAction[] {\n if (this._repScheme.length > 0) {\n const round = (ctx.getMemoryByTag('round')[0]?.metrics[0] as unknown as RoundState | undefined)?.current ?? 1;\n this.promoteRepScheme(ctx, round);\n }\n\n this.promoteFragments(ctx, this.config.promotions);\n return [];\n }\n\n onNext(ctx: IBehaviorContext): IRuntimeAction[] {\n if (this._repScheme.length > 0) {\n const round = ctx.getMemoryByTag('round')[0]?.metrics[0] as unknown as RoundState | undefined;\n if (round && round.current !== this._lastPromotedRound) {\n this.promoteRepScheme(ctx, round.current);\n }\n }\n\n const dynamicPromotions = this.config.promotions.filter(rule => rule.enableDynamicUpdates);\n this.promoteFragments(ctx, dynamicPromotions);\n return [];\n }\n\n onUnmount(_ctx: IBehaviorContext): IRuntimeAction[] {\n return [];\n }\n\n onDispose(_ctx: IBehaviorContext): void {\n }\n\n private promoteFragments(ctx: IBehaviorContext, rules: PromotionRule[]): void {\n for (const rule of rules) {\n const sourceFragment = this.findSourceFragment(ctx, rule);\n if (!sourceFragment) continue;\n\n const promotedFragment: IMetric = {\n ...sourceFragment,\n origin: rule.origin ?? 'runtime'\n };\n\n this.upsertPromotedFragment(ctx, promotedFragment);\n }\n }\n\n private promoteRepScheme(ctx: IBehaviorContext, round: number): void {\n const reps = this.getRepsForRound(round);\n if (reps === undefined) return;\n\n this._lastPromotedRound = round;\n\n const repFragment: IMetric = {\n type: MetricType.Rep,\n image: reps.toString(),\n origin: 'runtime',\n value: reps,\n sourceBlockKey: ctx.block.key.toString(),\n timestamp: ctx.clock.currentDate,\n };\n\n const existing = ctx.block.getMemoryByTag('metric:rep-target');\n if (existing.length > 0) {\n ctx.updateMemory('metric:rep-target', [repFragment]);\n } else {\n ctx.pushMemory('metric:rep-target', [repFragment]);\n }\n }\n\n private findSourceFragment(ctx: IBehaviorContext, rule: PromotionRule): IMetric | undefined {\n return this.findSourceFragmentInBlock(ctx.block, rule);\n }\n\n private findSourceFragmentInBlock(block: IBlockRef, rule: PromotionRule): IMetric | undefined {\n const memory = block.getAllMemory();\n\n for (const location of memory) {\n if (location.tag === 'metric:promote' || location.tag === 'metric:rep-target') continue;\n if (rule.sourceTag && location.tag !== rule.sourceTag) continue;\n\n const match = location.metrics.find(metric => metric.type === rule.metricType);\n if (match) return match;\n }\n\n return undefined;\n }\n\n private upsertPromotedFragment(ctx: IBehaviorContext, metric: IMetric): void {\n const existing = ctx.block.getMemoryByTag('metric:promote');\n\n if (existing.length === 0) {\n ctx.pushMemory('metric:promote', [metric]);\n return;\n }\n\n const current = existing[0].metrics.filter(\n currentFragment => currentFragment.type !== metric.type\n );\n\n ctx.updateMemory('metric:promote', [...current, metric]);\n }\n}\n","import { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { IBehaviorContext, Unsubscribe } from '../contracts/IBehaviorContext';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { PopBlockAction } from '../actions/stack/PopBlockAction';\n\nexport interface ExitConfig {\n /**\n * `immediate` — pop as soon as trigger fires (replaces LeafExitBehavior).\n * `deferred` — pop on next() only when block is already marked complete\n * (replaces CompletedBlockPopBehavior; used by container blocks\n * where a timer or event marks completion externally).\n */\n mode: 'immediate' | 'deferred';\n /**\n * For `mode: 'immediate'` — pop when next() is called.\n * Defaults to `true` for immediate mode.\n */\n onNext?: boolean;\n /**\n * For `mode: 'immediate'` — pop when any of these events fires.\n * Defaults to `[]`.\n */\n onEvents?: string[];\n}\n\n/**\n * ExitBehavior unifies the two completion-pop patterns into a single behavior.\n *\n * ## Modes\n *\n * ### `immediate`\n * Pops the block as soon as a trigger fires:\n * - `onNext: true` (default) — pops when the user calls next()\n * - `onEvents: ['timer:complete']` — pops when the event fires\n * Both can be active simultaneously.\n *\n * Replaces `LeafExitBehavior`.\n *\n * ### `deferred`\n * Pops the block on the next call to next() *only if* `block.isComplete`\n * is already true. Used on container blocks where an external trigger\n * (timer expiry, event) marks completion, but the block should only pop\n * once all in-flight children have had a chance to run.\n *\n * Replaces `CompletedBlockPopBehavior`.\n *\n * ## Migration\n *\n * ```typescript\n * // Before:\n * new LeafExitBehavior({ onNext: true })\n * new LeafExitBehavior({ onEvents: ['timer:complete'] })\n * new LeafExitBehavior({ onNext: true, onEvents: ['timer:start'] })\n * new CompletedBlockPopBehavior()\n *\n * // After:\n * new ExitBehavior({ mode: 'immediate' })\n * new ExitBehavior({ mode: 'immediate', onNext: false, onEvents: ['timer:complete'] })\n * new ExitBehavior({ mode: 'immediate', onNext: true, onEvents: ['timer:start'] })\n * new ExitBehavior({ mode: 'deferred' })\n * ```\n */\nexport class ExitBehavior implements IRuntimeBehavior {\n private readonly config: Required<ExitConfig>;\n private unsubscribers: Unsubscribe[] = [];\n\n constructor(config: ExitConfig) {\n this.config = {\n mode: config.mode,\n onNext: config.onNext ?? (config.mode === 'immediate' ? true : false),\n onEvents: config.onEvents ?? [],\n };\n }\n\n onMount(ctx: IBehaviorContext): IRuntimeAction[] {\n if (this.config.mode !== 'immediate') {\n return [];\n }\n\n for (const eventName of this.config.onEvents) {\n const unsubscribe = ctx.subscribe(eventName as any, (event, eventCtx) => {\n eventCtx.markComplete(`event:${event.name}`);\n return [new PopBlockAction()];\n });\n this.unsubscribers.push(unsubscribe);\n }\n\n return [];\n }\n\n onNext(ctx: IBehaviorContext): IRuntimeAction[] {\n if (this.config.mode === 'deferred') {\n if (ctx.block.isComplete) {\n return [new PopBlockAction()];\n }\n return [];\n }\n\n // immediate mode\n if (!this.config.onNext) {\n return [];\n }\n\n // Only mark user-advance if the block hasn't already been completed\n // by another mechanism (e.g., timer-expired auto-pop via NextAction).\n if (!ctx.block.isComplete) {\n ctx.markComplete('user-advance');\n }\n return [new PopBlockAction()];\n }\n\n onUnmount(_ctx: IBehaviorContext): IRuntimeAction[] {\n return [];\n }\n\n onDispose(_ctx: IBehaviorContext): void {\n for (const unsubscribe of this.unsubscribers) {\n unsubscribe();\n }\n this.unsubscribers = [];\n }\n}\n","import { IBehaviorContext } from '../contracts/IBehaviorContext';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { MetricType, IMetric } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\n\nexport interface LabelingConfig {\n mode?: 'clock' | 'timer' | 'countdown' | 'hidden';\n label?: string;\n subtitle?: string;\n actionDisplay?: string;\n showRoundDisplay?: boolean;\n roundFormat?: (current: number, total?: number) => string;\n}\n\nexport class LabelingBehavior implements IRuntimeBehavior {\n constructor(private readonly config: LabelingConfig = {}) { }\n\n onMount(ctx: IBehaviorContext): IRuntimeAction[] {\n const staticLabels = this.createStaticLabels(ctx);\n const roundLabel = this.createRoundLabel(ctx);\n const metrics = staticLabels.clone();\n if (roundLabel) metrics.add(roundLabel);\n\n if (metrics.length > 0) {\n ctx.pushMemory('display', metrics.toArray());\n }\n\n return [];\n }\n\n onNext(ctx: IBehaviorContext): IRuntimeAction[] {\n const roundLabel = this.createRoundLabel(ctx);\n if (!roundLabel) return [];\n\n const existingDisplay = ctx.block.getMemoryByTag('display');\n if (existingDisplay.length === 0) {\n ctx.pushMemory('display', [roundLabel]);\n return [];\n }\n\n const currentFragments = existingDisplay[0].metrics.filter(\n metric => !this.isRoundRoleFragment(metric)\n );\n\n ctx.updateMemory('display', [...currentFragments, roundLabel]);\n return [];\n }\n\n onUnmount(_ctx: IBehaviorContext): IRuntimeAction[] {\n return [];\n }\n\n onDispose(_ctx: IBehaviorContext): void {\n }\n\n private createStaticLabels(ctx: IBehaviorContext): MetricContainer {\n const label = this.config.label ?? ctx.block.label;\n const subtitle = this.config.subtitle;\n const actionDisplay = this.config.actionDisplay;\n const metrics = MetricContainer.empty(ctx.block.key.toString());\n\n if (label) {\n metrics.add(this.createTextMetric(ctx, label, 'label'));\n }\n\n if (subtitle) {\n metrics.add(this.createTextMetric(ctx, subtitle, 'subtitle'));\n }\n\n if (actionDisplay) {\n metrics.add(this.createTextMetric(ctx, actionDisplay, 'action'));\n }\n\n return metrics;\n }\n\n private createRoundLabel(ctx: IBehaviorContext): IMetric | undefined {\n if (this.config.showRoundDisplay === false) return undefined;\n\n const roundLocation = ctx.block.getMemoryByTag('round')[0];\n if (!roundLocation || roundLocation.metrics.length === 0) return undefined;\n\n const roundValue = roundLocation.metrics[0] as { current?: number; total?: number };\n if (!roundValue || typeof roundValue.current !== 'number') return undefined;\n\n const roundLabel = this.formatRound(roundValue.current, roundValue.total);\n return this.createTextMetric(ctx, roundLabel, 'round');\n }\n\n private createTextMetric(\n ctx: IBehaviorContext,\n text: string,\n role: 'label' | 'subtitle' | 'action' | 'round'\n ): IMetric {\n return {\n type: MetricType.Text,\n image: text,\n origin: 'runtime',\n value: { text, role },\n sourceBlockKey: ctx.block.key.toString(),\n timestamp: ctx.clock.currentDate,\n };\n }\n\n private formatRound(current: number, total?: number): string {\n if (this.config.roundFormat) {\n return this.config.roundFormat(current, total);\n }\n\n if (typeof total === 'number') {\n return `Round ${current} of ${total}`;\n }\n\n return `Round ${current}`;\n }\n\n private isRoundRoleFragment(metric: IMetric): boolean {\n const value = metric.value as { role?: string } | undefined;\n return value?.role === 'round';\n }\n}\n","import { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MemoryLocation } from '../../memory/MemoryLocation';\n\n/**\n * UpdateNextPreviewAction resolves the next child statement(s) and stores\n * their metrics in the block's `metric:next` memory location.\n *\n * ## Purpose\n *\n * Behaviors (ChildRunnerBehavior) cannot access `runtime.script` directly —\n * it's only available in `IRuntimeAction.do(runtime)`. This action bridges\n * the gap: the behavior returns this action with statement IDs, and the\n * action looks up the metrics and pushes them into block memory.\n *\n * ## Memory Contract\n *\n * - Tag: `metric:next`\n * - Value: `MetricContainer` from the next statement(s) to be compiled\n * - When `nextStatementIds` is empty, any existing `metric:next` memory\n * is cleared (updated to empty metric) to signal \"no more children\".\n *\n * ## Consumed By\n *\n * - `useNextPreview` hook → `LookaheadView` component\n * - The UI walks the stack leaf-to-root and shows the deepest block's\n * `metric:next` as the \"Up Next\" preview.\n */\nexport class UpdateNextPreviewAction implements IRuntimeAction {\n readonly type = 'update-next-preview';\n readonly target?: string;\n readonly payload?: unknown;\n\n constructor(\n private readonly blockKey: string,\n private readonly nextStatementIds: number[]\n ) {\n this.target = blockKey;\n this.payload = { nextStatementIds };\n }\n\n do(runtime: IRuntimeContext): IRuntimeAction[] {\n // Find the block on the stack\n const block = runtime.stack.blocks.find(\n b => b.key.toString() === this.blockKey\n );\n\n if (!block) return [];\n\n // Get existing metrics:next locations\n const existingLocs = block.getMemoryByTag('metric:next');\n\n if (this.nextStatementIds.length === 0) {\n // Clear: update existing locations to empty, or do nothing if none exist\n for (const loc of existingLocs) {\n loc.update([]);\n }\n return [];\n }\n\n // Look up statement metrics from the script\n const script = runtime.script;\n if (!script) return [];\n\n const metrics = MetricContainer.empty(this.blockKey);\n for (const id of this.nextStatementIds) {\n const statement = script.getId(id);\n if (statement) {\n metrics.merge(statement.metrics);\n }\n }\n\n // Hint metrics are semantic markers (e.g. `behavior.*`, `workout.emom`),\n // not display fragments — drop them so they never surface as \"Up Next\"\n // badges (mirrors BlockBuilder.setFragments). This single choke point\n // also covers the Chromecast receiver, which reads the same metric:next.\n metrics.removeByType(MetricType.Hint);\n\n if (metrics.length === 0) {\n // No metric found — clear any existing preview\n for (const loc of existingLocs) {\n loc.update([]);\n }\n return [];\n }\n\n if (existingLocs.length > 0) {\n // Update the first existing location\n existingLocs[0].update(metrics);\n } else {\n // Push a new memory location\n block.pushMemory(new MemoryLocation('metric:next', metrics));\n }\n\n return [];\n }\n}\n","import type { IMetric, MetricOrigin } from '@bitcobblers/wod-wiki-core';\nimport { disciplineFactorFor } from '../effort-registry/disciplines';\nimport type { IEffort, ResolvedEffort } from '../effort-registry/types';\nimport { DEFAULT_RESOLVER_OPTIONS } from '../effort-registry/types';\n\n/**\n * Custom metric type for resolved effort data attached by\n * TwoPassEffortResolutionProcess.\n */\nexport const EFFORT_DATA_METRIC_TYPE = 'effort-data' as const;\n\n/**\n * Resolved effort data extracted from an enriched metrics stream.\n */\nexport const DEFAULT_UNRESOLVED_EFFORT_MET = DEFAULT_RESOLVER_OPTIONS.defaultMet;\n\nexport interface ResolvedEffortData {\n /** Effective resolved effort instance. */\n resolved: ResolvedEffort;\n /** Effective effort copy retained for legacy callers. */\n effort: IEffort;\n origin: MetricOrigin;\n}\n\nfunction isResolvedEffort(value: unknown): value is ResolvedEffort {\n return !!value\n && typeof value === 'object'\n && 'effort' in value\n && 'met' in value\n && 'disciplineFactor' in value;\n}\n\nfunction coerceResolvedEffort(value: IEffort | ResolvedEffort): ResolvedEffort {\n if (isResolvedEffort(value)) return value;\n const effort = value;\n const discipline = effort.baseAttributes.discipline;\n const disciplineFactor = effort.baseAttributes.disciplineFactor\n ?? disciplineFactorFor(discipline);\n return {\n effort,\n definition: effort,\n slug: effort.slug,\n label: effort.label,\n met: effort.baseAttributes.met,\n baseAttributes: effort.baseAttributes,\n discipline,\n disciplineFactor,\n intensityTier: effort.baseAttributes.intensityTier,\n modifiers: {},\n registrySource: effort.registrySource,\n resolvedFrom: effort.registrySource === 'user' ? 'user' : effort.registrySource === 'bundled' ? 'bundled' : 'default',\n isEstimated: effort.registrySource === 'synthetic-unresolved',\n };\n}\n\n/**\n * Extract the most recent resolved effort data from a metric stream.\n *\n * Iterates in order and returns the last `effort-data` metric found,\n * since metrics are processed sequentially and later entries override\n * earlier ones within a segment.\n */\nexport function extractEffortData(metrics: IMetric[]): ResolvedEffortData | undefined {\n let last: ResolvedEffortData | undefined;\n for (const m of metrics) {\n if (m.type === EFFORT_DATA_METRIC_TYPE && m.value && typeof m.value === 'object') {\n const resolved = coerceResolvedEffort(m.value as IEffort | ResolvedEffort);\n last = {\n resolved,\n effort: resolved.effort,\n origin: m.origin as MetricOrigin,\n };\n }\n }\n return last;\n}\n\n/**\n * Determine the dominant origin across a collection of effort data.\n *\n * Priority: analyzed-estimated (most conservative) > analyzed > compiler.\n * If any effort was unresolved synthetic, the whole projection is flagged\n * as estimated so downstream consumers know to treat it with caution.\n */\nexport function resolveDominantOrigin(origins: MetricOrigin[]): MetricOrigin {\n if (origins.length === 0) return 'analyzed';\n if (origins.some(o => o === 'analyzed-estimated')) return 'analyzed-estimated';\n if (origins.some(o => o === 'analyzed')) return 'analyzed';\n if (origins.every(o => o === 'compiler')) return 'compiler';\n return 'analyzed';\n}\n","/**\n * EffortEnrichmentPass — Post-compilation pass that injects planned effort metrics.\n *\n * Runs AFTER JIT compilation completes, once per compiled block (there is no\n * block tree — see `applyEffortEnrichment`'s doc comment). Enriches exercise\n * blocks with resolved effort-data metrics containing planned MET, discipline\n * factor, and intensity information.\n *\n * This enables the runtime UI to display \"planned 12 MET-min\" and effort identity\n * during execution, before analytics finalization.\n *\n * IMPORTANT: because this pass runs strictly after `JitCompiler.compile()`,\n * any hints it merges onto the block (`resolved.effort.hints`, via\n * `block.mergeHints`) arrive too late to affect strategy `match()`/`apply()`\n * decisions — those already ran against the pre-compile *statement*, which\n * this pass never touches. See docs/architectural-cleanup-tier-3-extensibility.md\n * §3.3 verification notes for the full explanation, and\n * docs/adr/effort-hints-pre-compile-resolution.md for the proposed fix\n * (a sibling pre-compile pass, `applyEffortHintsToStatements`, not yet\n * implemented as of this comment).\n *\n * @see docs/adr/effort-resolution-compile-time.md\n */\n\nimport type { IRuntimeBlock } from '../contracts/IRuntimeBlock';\nimport type { IEffortResolver } from '../../effort-registry/types';\nimport { EFFORT_DATA_METRIC_TYPE } from '../../analytics/effortResolution';\nimport type { IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\nimport { IMemoryLocation, MemoryLocation } from '../memory/MemoryLocation';\n\nexport interface EffortEnrichmentPassOptions {\n /** Effort resolver for label → definition lookup. */\n resolver: IEffortResolver;\n /** Whether to overwrite existing effort-data metrics (default: false). */\n overwrite?: boolean;\n /** Debug logging enabled (default: false). */\n debug?: boolean;\n}\n\n/**\n * Enriches a single compiled block with planned effort metrics.\n *\n * There is no block *tree* to walk here: the JIT compiler is lazy and\n * per-round (see docs/parser-compiler-runtime-metrics.md) — `JitCompiler.compile()`\n * returns exactly one block per call, and `IRuntimeBlock` has no `children`\n * field. Each child block gets its own `applyEffortEnrichment` call when\n * *it* is compiled and pushed (see `CompileAndPushBlockAction`), so a single,\n * non-recursive call here already covers every block in the workout — an\n * earlier version of this function attempted to recurse into `block.children`,\n * which is dead code (no `IRuntimeBlock` implementation ever has that field).\n *\n * @param block The single compiled block to enrich (not a tree root)\n * @param options Resolver and configuration\n */\nexport function applyEffortEnrichment(block: IRuntimeBlock, options: EffortEnrichmentPassOptions): void {\n const { resolver, overwrite = false, debug = false } = options;\n tryEnrichBlock(block, resolver, overwrite, debug);\n}\n\nfunction tryEnrichBlock(\n block: IRuntimeBlock,\n resolver: IEffortResolver,\n overwrite: boolean,\n debug: boolean,\n): void {\n // Only enrich exercise blocks and effort blocks\n const normalizedBlockType = block.blockType?.toLowerCase();\n if (normalizedBlockType !== 'effort' && normalizedBlockType !== 'exercise') {\n return;\n }\n\n // Get the block label to use as the effort identifier\n const label = block.label;\n if (!label) {\n if (debug) console.log(`[EffortEnrichment] Skipping block with no label: ${block.key}`);\n return;\n }\n\n // Check if block already has effort-data metric\n const existingEffortData = block.getAllMemory().find(\n loc => loc.metrics.toArray().some(m => m.type === EFFORT_DATA_METRIC_TYPE),\n );\n\n if (existingEffortData && !overwrite) {\n if (debug) console.log(`[EffortEnrichment] Skipping block already enriched: ${label}`);\n return;\n }\n try {\n // Resolve the effort. `resolved.effort.hints` carries effort-defined hints\n // (Tier 3 §3.3), merged into 'metric:hint' block memory below. NOTE: this\n // runs after JitCompiler.compile() has already returned, so these hints\n // are NOT visible to hasHint()/getHints() during strategy match()/apply()\n // (those only read statement metrics, attached before compilation) — see\n // IRuntimeBlock.mergeHints's doc comment and\n // docs/architectural-cleanup-tier-3-extensibility.md §3.3 for the gap.\n const resolved = resolver.resolveEffort(label);\n const effortHints = resolved.effort.hints;\n if (effortHints && Object.keys(effortHints).length > 0) {\n block.mergeHints(effortHints);\n }\n\n if (debug) {\n console.log(`[EffortEnrichment] Resolved effort: ${label} → ${resolved.label} (MET: ${resolved.met})`);\n }\n\n // Create the effort-data metric\n const effortDataMetric: IMetric = {\n type: EFFORT_DATA_METRIC_TYPE as MetricType,\n image: resolved.label,\n value: resolved,\n origin: 'compiler',\n timestamp: new Date(),\n };\n\n // Create or update a private metrics memory location\n const privateMetrics = block.getMetricMemoryByVisibility('private');\n const existingLoc: IMemoryLocation | undefined = privateMetrics.find(loc =>\n loc.metrics.toArray().some(m => m.type === EFFORT_DATA_METRIC_TYPE),\n );\n\n if (existingLoc && overwrite) {\n // Update existing effort-data location: remove old effort-data and add new one\n const existingMetrics = existingLoc.metrics.toArray();\n const filtered = existingMetrics.filter(m => m.type !== EFFORT_DATA_METRIC_TYPE);\n filtered.push(effortDataMetric);\n existingLoc.update(filtered);\n } else if (!existingLoc) {\n // Create new private metrics location\n const location = new MemoryLocation('metric:tracked', [effortDataMetric]);\n block.pushMemory(location);\n }\n } catch (err) {\n console.error(`[EffortEnrichment] Failed to resolve effort \"${label}\":`, err);\n }\n}\n","import { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport { BlockLifecycleOptions } from '../../contracts/IRuntimeBlock';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\nimport { PushBlockAction } from './PushBlockAction';\nimport { applyEffortEnrichment } from '../../compiler/EffortEnrichmentPass';\n\n/**\n * Action that compiles a set of statement IDs and pushes the resulting block.\n * Allows behaviors to request JIT compilation without holding a reference to the runtime/JIT compiler.\n */\nexport class CompileAndPushBlockAction implements IRuntimeAction {\n readonly type = 'compile-and-push-block';\n\n constructor(\n public readonly statementIds: number[],\n public readonly options: BlockLifecycleOptions = {}\n ) { }\n\n do(runtime: IRuntimeContext): IRuntimeAction[] {\n if (!this.statementIds || this.statementIds.length === 0) {\n return [];\n }\n\n // Resolve child IDs to statements (lazy JIT resolution)\n const childStatements = runtime.script.getIds(this.statementIds);\n if (childStatements.length === 0) {\n return [];\n }\n\n try {\n // Compile the child group using JIT compiler\n const compiledBlock = runtime.jit.compile(childStatements, runtime);\n\n if (!compiledBlock) {\n return [];\n }\n\n // Apply compile-time effort enrichment if analytics context is available\n if (runtime.analyticsContext?.effortResolver) {\n applyEffortEnrichment(compiledBlock, {\n resolver: runtime.analyticsContext.effortResolver,\n });\n }\n\n // Delegate to PushBlockAction\n return [new PushBlockAction(compiledBlock, this.options)];\n } catch (error) {\n console.error(`CompileAndPushBlockAction: Compilation failed`, error);\n return [];\n }\n }\n}\n","import { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\nimport { RestBlock } from '../../blocks/RestBlock';\nimport { PushBlockAction } from './PushBlockAction';\n\n/**\n * Action that constructs a RestBlock with the given duration and pushes it\n * onto the runtime stack.\n *\n * Previously a private class inside ChildSelectionBehavior. Elevated to a\n * named action so any behavior or strategy that needs to inject a rest period\n * can do so without re-implementing the RestBlock construction pattern.\n *\n * @example\n * ```typescript\n * // Inside a behavior that needs a rest break between intervals\n * return [new PushRestBlockAction(remainingMs, 'Rest')];\n * ```\n */\nexport class PushRestBlockAction implements IRuntimeAction {\n readonly type = 'push-rest-block';\n\n constructor(\n public readonly durationMs: number,\n public readonly label: string = 'Rest'\n ) { }\n\n do(runtime: IRuntimeContext): IRuntimeAction[] {\n const restBlock = new RestBlock(runtime, {\n durationMs: this.durationMs,\n label: this.label,\n });\n return [new PushBlockAction(restBlock)];\n }\n}\n","import { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { IBehaviorContext } from '../contracts/IBehaviorContext';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { PopBlockAction } from '../actions/stack/PopBlockAction';\nimport { UpdateNextPreviewAction } from '../actions/stack/UpdateNextPreviewAction';\nimport { CompileAndPushBlockAction } from '../actions/stack/CompileAndPushBlockAction';\nimport { PushRestBlockAction } from '../actions/stack/PushRestBlockAction';\nimport { ChildrenStatusState, RoundState, TimerState } from '../memory/MemoryTypes';\nimport { calculateElapsed } from '../time/calculateElapsed';\nimport { CurrentRoundMetric } from '../compiler/metrics/CurrentRoundMetric';\n\nexport type ChildSelectionLoopCondition = 'always' | 'timer-active' | 'rounds-remaining';\n\nexport interface ChildSelectionConfig {\n /** Groups of statement indices to compile and dispatch */\n childGroups: number[][];\n /** Enable looping when all children complete */\n loop?: boolean | {\n /** Loop condition: always, while timer running, or while rounds remain */\n condition?: ChildSelectionLoopCondition;\n };\n /** Inject rest blocks between loop iterations */\n injectRest?: boolean;\n /** Skip first child dispatch on mount (e.g., for deferred start) */\n skipOnMount?: boolean;\n /**\n * If set, initializes round state on mount (absorbs ReEntryBehavior).\n * Use 1 for the first round. When provided, round memory is written\n * at mount time so display and loop logic can read it immediately.\n */\n startRound?: number;\n /**\n * Total rounds for completion checking (undefined = unbounded).\n * Only used when startRound is also provided.\n */\n totalRounds?: number;\n}\n\nexport class ChildSelectionBehavior implements IRuntimeBehavior {\n private static readonly DEFAULT_MIN_REST_MS = 1000;\n\n private childIndex = 0;\n private dispatchedOnLastNext = false;\n private restState: 'idle' | 'pending' | 'active' = 'idle';\n\n constructor(private readonly config: ChildSelectionConfig) { }\n\n onMount(ctx: IBehaviorContext): IRuntimeAction[] {\n this.restState = 'idle';\n this.dispatchedOnLastNext = false;\n\n // Declare capability so peer behaviors (e.g. CountdownTimerBehavior) can\n // coordinate without inspecting `behaviors[i].constructor.name`.\n ctx.declareCapability('childSelection');\n\n const actions: IRuntimeAction[] = [];\n // Initialize round state if configured (absorbed from ReEntryBehavior)\n if (this.config.startRound !== undefined) {\n const blockId = ctx.block.key.toString();\n ctx.pushMemory('round', [new CurrentRoundMetric(\n this.config.startRound,\n this.config.totalRounds,\n blockId,\n ctx.clock.currentDate,\n )]);\n }\n\n // Handle interval timer resets for EMOM synchronization\n if (this.config.injectRest) {\n ctx.subscribe('timer:complete' as any, (_event, _ctx) => {\n // While a rest block is pending/active, the rest-pop path in\n // onNext owns the round advance — never advance twice for one\n // interval boundary.\n if (this.restState !== 'idle') return [];\n // Interval over — advance round and reset for the next cycle\n const advanceActions = this.advanceRound(ctx);\n this.childIndex = 0;\n this.restState = 'idle';\n this.writeChildrenStatus(ctx);\n return advanceActions;\n }, { scope: 'active' });\n }\n\n if (this.config.skipOnMount) {\n if (this.totalChildren > 0) {\n actions.push(this.createNextPreview(ctx, this.config.childGroups[0]));\n }\n this.writeChildrenStatus(ctx);\n return actions;\n }\n\n if (this.totalChildren === 0) {\n this.writeChildrenStatus(ctx);\n return actions;\n }\n\n const dispatchActions = this.dispatchNext(ctx);\n this.writeChildrenStatus(ctx);\n return [...actions, ...dispatchActions];\n }\n onNext(ctx: IBehaviorContext): IRuntimeAction[] {\n this.dispatchedOnLastNext = false;\n\n if (ctx.block.isComplete) {\n const actions = [this.createNextPreview(ctx)];\n this.writeChildrenStatus(ctx);\n return actions;\n }\n\n const actions: IRuntimeAction[] = [];\n\n // Safety net: catch round overshot (absorbed from RoundsEndBehavior).\n // ChildSelectionBehavior.shouldLoop() handles the normal exhaustion path;\n // this guard catches the edge case where current advances past total externally.\n if (this.config.startRound !== undefined) {\n const round = ctx.getMemoryByTag('round')[0]?.metrics[0] as unknown as RoundState | undefined;\n if (round?.total !== undefined && round.current > round.total) {\n ctx.markComplete('rounds-exhausted');\n this.writeChildrenStatus(ctx);\n return [new PopBlockAction()];\n }\n }\n\n if (this.restState === 'active') {\n this.restState = 'idle';\n\n // For EMOM (injectRest = true), we only advance the round AFTER the rest block pops.\n // This keeps us in the correct round during the rest period.\n if (this.config.injectRest) {\n actions.push(...this.advanceRound(ctx));\n this.childIndex = 0;\n\n // If this next was manual (rest timer didn't expire yet),\n // we should reset the parent timer for the next interval.\n ctx.emitEvent({\n name: 'timer:reset' as any,\n timestamp: ctx.clock.currentDate,\n data: { blockKey: ctx.block.key.toString() }\n });\n }\n }\n if (this.childIndex >= this.totalChildren) {\n if (!this.shouldLoop(ctx)) {\n // All children done, no more loops — mark block complete.\n // RuntimeBlock.next() auto-pop ensures the block is popped.\n this.writeChildrenStatus(ctx);\n ctx.markComplete(\n this.isLoopEnabled() ? 'rounds-exhausted' : 'children-complete'\n );\n return [this.createNextPreview(ctx)];\n }\n\n // If we have rest injection (EMOM), we push a Rest block and STAY in the current round.\n // We will advance the round when the Rest block is done (either Naturally or via manual Next).\n if (this.shouldInjectRest(ctx)) {\n this.restState = 'pending';\n const restDurationMs = this.getRemainingCountdownMs(ctx);\n const loopActions: IRuntimeAction[] = [\n new PushRestBlockAction(restDurationMs, 'Rest'),\n this.createNextPreview(ctx, this.config.childGroups[0])\n ];\n this.restState = 'active';\n this.writeChildrenStatus(ctx);\n return [...actions, ...loopActions];\n }\n\n // No rest, so advance round and reset index immediately for the next cycle (AMRAP pattern).\n actions.push(...this.advanceRound(ctx));\n this.childIndex = 0;\n }\n\n const dispatchActions = this.dispatchNext(ctx);\n this.writeChildrenStatus(ctx);\n return [...actions, ...dispatchActions];\n }\n\n onUnmount(_ctx: IBehaviorContext): IRuntimeAction[] {\n return [];\n }\n\n onDispose(_ctx: IBehaviorContext): void {\n this.restState = 'idle';\n }\n\n get allChildrenExecuted(): boolean {\n return this.childIndex >= this.totalChildren;\n }\n\n get allChildrenCompleted(): boolean {\n return this.allChildrenExecuted && !this.dispatchedOnLastNext;\n }\n\n get totalChildren(): number {\n return this.config.childGroups.length;\n }\n\n private dispatchNext(ctx: IBehaviorContext): IRuntimeAction[] {\n if (this.childIndex >= this.totalChildren) {\n return [this.createNextPreview(ctx)];\n }\n\n const nextGroup = this.config.childGroups[this.childIndex];\n this.childIndex++;\n this.dispatchedOnLastNext = true;\n\n const upcomingGroup = this.config.childGroups[this.childIndex];\n return [\n new CompileAndPushBlockAction(nextGroup),\n this.createNextPreview(ctx, upcomingGroup),\n ];\n }\n\n private shouldLoop(ctx: IBehaviorContext): boolean {\n if (ctx.block.isComplete || !this.isLoopEnabled()) {\n return false;\n }\n\n const condition = this.getLoopCondition();\n if (condition === 'always') {\n return true;\n }\n\n if (condition === 'timer-active') {\n const timer = ctx.getMemoryByTag('time')[0]?.metrics[0]?.value as TimerState | undefined;\n if (!timer) {\n return false;\n }\n\n if (timer.direction === 'down' && timer.durationMs) {\n return this.getRemainingCountdownMs(ctx) > 0;\n }\n\n return true;\n }\n\n const round = ctx.getMemoryByTag('round')[0]?.metrics[0] as unknown as RoundState | undefined;\n if (!round) {\n return false;\n }\n if (round.total === undefined) {\n return true;\n }\n return round.current < round.total;\n }\n\n private shouldInjectRest(ctx: IBehaviorContext): boolean {\n if (!this.config.injectRest) {\n return false;\n }\n\n const timer = ctx.getMemoryByTag('time')[0]?.metrics[0]?.value as TimerState | undefined;\n if (!timer || timer.direction !== 'down' || !timer.durationMs) {\n return false;\n }\n\n const remainingMs = this.getRemainingCountdownMs(ctx);\n if (remainingMs < ChildSelectionBehavior.DEFAULT_MIN_REST_MS) {\n return false;\n }\n\n if (remainingMs >= timer.durationMs) {\n return false;\n }\n\n return true;\n }\n\n private getRemainingCountdownMs(ctx: IBehaviorContext): number {\n const timer = ctx.getMemoryByTag('time')[0]?.metrics[0]?.value as TimerState | undefined;\n if (!timer || timer.direction !== 'down' || !timer.durationMs) {\n return 0;\n }\n\n const now = ctx.clock.currentDate.getTime();\n const elapsed = calculateElapsed(timer, now);\n return Math.max(0, timer.durationMs - elapsed);\n }\n\n private writeChildrenStatus(ctx: IBehaviorContext): void {\n const status: ChildrenStatusState = {\n childIndex: this.childIndex,\n totalChildren: this.totalChildren,\n allExecuted: this.allChildrenExecuted,\n allCompleted: this.allChildrenCompleted,\n };\n const childLoc = ctx.getMemoryByTag('children:status')[0];\n if (childLoc?.metrics[0]) {\n ctx.updateMemory('children:status', [{...childLoc.metrics[0], value: status}]);\n } else {\n ctx.pushMemory('children:status', [{type: 0 as any, image: '', origin: 'runtime' as any, value: status}]);\n }\n }\n\n /**\n * Advance the round counter in block memory and emit tracker action.\n *\n * Called by this behavior when a complete cycle of children finishes\n * and shouldLoop() returns true. This keeps round tracking\n * self-contained within ChildSelectionBehavior — no dependency on\n * ReEntryBehavior's onNext() or behavior execution ordering.\n */\n private advanceRound(ctx: IBehaviorContext): IRuntimeAction[] {\n const round = ctx.getMemoryByTag('round')[0]?.metrics[0] as unknown as RoundState | undefined;\n if (!round) return [];\n\n // Total guard: never advance past the configured total (AMRAP leaves\n // total undefined = unbounded). Prevents overshoot (e.g. \"4/3\") when\n // advance paths interleave; completion is surfaced via markComplete so\n // the RuntimeBlock.next() auto-pop / safety-net paths can pop the block.\n if (round.total !== undefined && round.current >= round.total) {\n ctx.markComplete('rounds-exhausted');\n return [];\n }\n\n const blockId = ctx.block.key.toString();\n const nextRound = round.current + 1;\n const total = round.total;\n\n const roundFragment = new CurrentRoundMetric(\n nextRound,\n total,\n blockId,\n ctx.clock.currentDate,\n );\n\n ctx.updateMemory('round', [roundFragment]);\n return [];\n }\n\n private createNextPreview(ctx: IBehaviorContext, nextGroup?: number[]): UpdateNextPreviewAction {\n return new UpdateNextPreviewAction(\n ctx.block.key.toString(),\n nextGroup ?? []\n );\n }\n\n private isLoopEnabled(): boolean {\n if (this.config.loop === undefined) {\n return false;\n }\n if (typeof this.config.loop === 'boolean') {\n return this.config.loop;\n }\n return true;\n }\n\n private getLoopCondition(): ChildSelectionLoopCondition {\n if (typeof this.config.loop === 'object' && this.config.loop.condition) {\n return this.config.loop.condition;\n }\n return 'timer-active';\n }\n}\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\nimport { formatDuration } from \"../../time/calculateElapsed\";\n\n/**\n * **Elapsed** (Runtime layer)\n *\n * The total running time of the block's Time spans — Σ(end − start) for each\n * segment. Paused gaps between spans are excluded.\n *\n * Created by the runtime when collecting output statements.\n *\n * ## Glossary (docs/architecture/time-terminology.md)\n * - **Duration** = the plan (set by parser)\n * - **Time / Spans** = raw clock recordings (source data)\n * - **Elapsed** = sum of span durations, active time only — this metrics\n * - **Total** = lastEnd − firstStart (wall-clock bracket, includes pauses)\n *\n * @example\n * // Two spans: [0-100ms], [200-350ms] → Elapsed = 250ms\n * // (the 100ms paused gap between spans is excluded)\n */\nexport class ElapsedMetric implements IMetric {\n readonly type = MetricType.Elapsed;\n readonly origin: MetricOrigin = 'analyzed';\n\n /**\n * @param value Elapsed time in milliseconds\n * @param sourceBlockKey Block that produced this measurement\n * @param timestamp When this metrics was created\n */\n constructor(\n readonly value: number,\n readonly sourceBlockKey?: string,\n readonly timestamp?: Date,\n ) {}\n\n /** Human-readable elapsed time (e.g., \"5:03\") */\n get image(): string {\n return formatDuration(this.value);\n }\n}\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\nimport { formatDuration } from \"../../time/calculateElapsed\";\n\n/**\n * **Total** (Runtime layer)\n *\n * The total time including pauses — last span's end minus first span's start.\n * Represents the wall-clock bracket of the block's execution.\n *\n * Unlike Elapsed, this **includes** paused gaps between spans.\n *\n * Created by the runtime when collecting output statements.\n *\n * ## Glossary (docs/architecture/time-terminology.md)\n * - **Duration** = the plan (set by parser)\n * - **Time / Spans** = raw clock recordings (source data)\n * - **Elapsed** = Σ(end − start), active time only (excludes pauses)\n * - **Total** = wall-clock bracket — this metrics (includes pauses)\n *\n * @example\n * // Two spans: [t=0 to t=100ms], [t=200 to t=350ms] → Total = 350ms\n * // (the 100ms paused gap IS included)\n */\nexport class TotalMetric implements IMetric {\n readonly type = MetricType.Total;\n readonly origin: MetricOrigin = 'analyzed';\n\n /**\n * @param value Total wall-clock time in milliseconds\n * @param sourceBlockKey Block that produced this measurement\n * @param timestamp When this metrics was created\n */\n constructor(\n readonly value: number,\n readonly sourceBlockKey?: string,\n readonly timestamp?: Date,\n ) {}\n\n /** Human-readable total time (e.g., \"5:03\") */\n get image(): string {\n return formatDuration(this.value);\n }\n}\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\nimport { TimeSpan } from '../../models/TimeSpan';\n\n/**\n * **Time / Spans** (Block layer)\n *\n * The raw start/stop TimeSpan[] recordings that a block tracks.\n * Each span represents a continuous period of active (unpaused) execution.\n * Multiple spans occur when the timer is paused and resumed.\n *\n * Displayed on the grid as session-relative time ranges (e.g., `:00 → 2:30`).\n *\n * ## Display behavior\n * - Single span with start === end → displayed as a timestamp\n * - Single span with start !== end → displayed as a time range\n * - Multiple spans → displayed as a list of time ranges\n *\n * ## Glossary (docs/architecture/time-terminology.md)\n * - **Duration** = the plan (set by parser)\n * - **Time / Spans** = raw clock recordings — this metrics (source of truth)\n * - **Elapsed** = Σ(end − start) of each span (active time, derived from this)\n * - **Total** = lastEnd − firstStart (wall-clock bracket, derived from this)\n * - **TimeStamp** = system Date.now() when a message is logged\n */\nexport class SpansMetric implements IMetric {\n readonly type = MetricType.Spans;\n readonly origin: MetricOrigin = 'tracked';\n\n /**\n * @param spans Array of TimeSpan objects recording clock start/stop events\n * @param sourceBlockKey Block that owns these spans\n * @param timestamp When this metrics was created\n */\n constructor(\n readonly spans: readonly TimeSpan[] | TimeSpan[],\n readonly sourceBlockKey?: string,\n readonly timestamp?: Date,\n ) {}\n\n /** The raw TimeSpan array */\n get value(): readonly TimeSpan[] | TimeSpan[] {\n return this.spans;\n }\n\n /** Human-readable image of the spans */\n get image(): string {\n if (this.spans.length === 0) return '--:--';\n if (this.spans.length === 1) {\n const span = this.spans[0];\n if (span.started === span.ended) {\n return SpansMetric.formatTimestamp(span.started);\n }\n return `${SpansMetric.formatTimestamp(span.started)} – ${SpansMetric.formatTimestamp(span.ended ?? Date.now())}`;\n }\n return `${this.spans.length} spans`;\n }\n\n /**\n * Whether the last span is still open (clock currently running).\n */\n get isOpen(): boolean {\n if (this.spans.length === 0) return false;\n return this.spans[this.spans.length - 1].isOpen;\n }\n\n /**\n * Format a timestamp (epoch ms) as HH:MM:SS.\n */\n static formatTimestamp(epochMs: number): string {\n const d = new Date(epochMs);\n const h = d.getHours().toString().padStart(2, '0');\n const m = d.getMinutes().toString().padStart(2, '0');\n const s = d.getSeconds().toString().padStart(2, '0');\n return `${h}:${m}:${s}`;\n }\n}\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\n\n/**\n * **TimeStamp** (Runtime layer)\n *\n * The system time (Date.now()) when a message is logged.\n * Provides a ground-truth wall-clock reference independent of the\n * runtime clock, which can be frozen during event chain execution.\n *\n * ## When it's created\n * Created during output collection alongside ElapsedMetric and TotalMetric.\n *\n * ## Glossary (docs/architecture/time-terminology.md)\n * - **Duration** = the plan (set by parser)\n * - **Time / Spans** = clock-relative recordings (may use frozen/faked clock)\n * - **Elapsed** = Σ(end − start), active time only\n * - **Total** = lastEnd − firstStart (wall-clock bracket)\n * - **TimeStamp** = real Date.now() time — this metrics\n */\nexport class SystemTimeMetric implements IMetric {\n readonly type = MetricType.SystemTime;\n readonly origin: MetricOrigin = 'tracked';\n\n /**\n * @param value The real system time as a Date object\n * @param sourceBlockKey Block that produced this metrics\n */\n constructor(\n readonly value: Date,\n readonly sourceBlockKey?: string,\n ) {}\n\n /** The timestamp this metrics was created (same as value for system time) */\n get timestamp(): Date {\n return this.value;\n }\n\n /** ISO 8601 formatted system time */\n get image(): string {\n return this.value.toISOString();\n }\n}\n","import { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { IBehaviorContext } from '../contracts/IBehaviorContext';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { RoundState, TimerState } from '../memory/MemoryTypes';\nimport { } from '@bitcobblers/wod-wiki-core';\nimport { TimeSpan } from '../models/TimeSpan';\nimport { readTimer } from '../time/TimerSpans';\nimport { calculateElapsed } from '../time/calculateElapsed';\nimport { CurrentRoundMetric } from '../compiler/metrics/CurrentRoundMetric';\nimport { ElapsedMetric } from '../compiler/metrics/ElapsedMetric';\nimport { TotalMetric } from '../compiler/metrics/TotalMetric';\nimport { SpansMetric } from '../compiler/metrics/SpansMetric';\nimport { SystemTimeMetric } from '../compiler/metrics/SystemTimeMetric';\nimport { INowProvider, wallClockNow } from '../INowProvider';\n\nexport interface ReportOutputConfig {\n label?: string;\n emitSegmentOnMount?: boolean;\n emitMilestones?: boolean;\n computeTimeResults?: boolean;\n}\n\nexport class ReportOutputBehavior implements IRuntimeBehavior {\n private lastEmittedRound?: number;\n\n constructor(\n private readonly config: ReportOutputConfig = {},\n private readonly _now: INowProvider = wallClockNow,\n ) { }\n\n onMount(ctx: IBehaviorContext): IRuntimeAction[] {\n const shouldEmitSegment = this.config.emitSegmentOnMount ?? false;\n if (shouldEmitSegment) {\n const displayFragments = this.collectDisplayFragments(ctx);\n const stateFragments = this.collectStateFragments(ctx);\n const mergedFragments = this.mergeFragments(displayFragments, stateFragments);\n\n ctx.emitOutput('segment', mergedFragments.toArray(), {\n label: this.formatLabel(ctx),\n });\n }\n\n const round = ctx.getMemoryByTag('round')[0]?.metrics[0] as unknown as RoundState | undefined;\n const shouldEmitMilestones = this.config.emitMilestones ?? !!round;\n if (shouldEmitMilestones && round && (round.total === undefined || round.total > 1)) {\n this.lastEmittedRound = round.current;\n ctx.emitOutput('milestone', this.buildMilestoneFragments(ctx, round).toArray(), {\n label: this.formatRoundLabel(round),\n });\n }\n\n return [];\n }\n\n onNext(ctx: IBehaviorContext): IRuntimeAction[] {\n const round = ctx.getMemoryByTag('round')[0]?.metrics[0] as unknown as RoundState | undefined;\n const shouldEmitMilestones = this.config.emitMilestones ?? !!round;\n if (!shouldEmitMilestones || !round || (round.total !== undefined && round.total <= 1)) {\n return [];\n }\n\n if (round.total !== undefined && round.current > round.total) {\n return [];\n }\n\n // Only emit milestone when the round has actually changed.\n // ChildSelectionBehavior advances the round and dispatches new\n // children in the same onNext cycle, so children:status.allCompleted\n // is always false at this point. Tracking the last emitted round\n // avoids duplicate milestones without depending on child status.\n if (this.lastEmittedRound !== undefined && round.current === this.lastEmittedRound) {\n return [];\n }\n\n this.lastEmittedRound = round.current;\n ctx.emitOutput('milestone', this.buildMilestoneFragments(ctx, round).toArray(), {\n label: this.formatRoundLabel(round),\n });\n\n return [];\n }\n\n onUnmount(ctx: IBehaviorContext): IRuntimeAction[] {\n const timer = readTimer(ctx);\n const round = ctx.getMemoryByTag('round')[0]?.metrics[0] as unknown as RoundState | undefined;\n const shouldComputeTimeResults = this.config.computeTimeResults ?? true;\n\n // Determine a descriptive completion label\n let completionLabel = this.config.label ?? 'Completed';\n if (!this.config.label) {\n if (ctx.block.blockType === 'SessionRoot') {\n completionLabel = 'Session Completed';\n } else if (round && round.total !== undefined && round.total > 1) {\n completionLabel = `Completed ${round.total} Round(s)`;\n } else if (round && round.current > 1) {\n // Fallback for unbounded rounds where at least one round was done\n completionLabel = `Completed ${round.current} Round(s)`;\n }\n }\n\n if (shouldComputeTimeResults) {\n const displayGroups = ctx.block.getMemoryByTag('metric:display');\n if (displayGroups.length > 1) {\n // Split results proportionally across groups\n const resultGroups = this.computeSplitTimeResults(\n ctx,\n timer,\n displayGroups.map(loc => loc.metrics),\n completionLabel\n );\n this.writeResultGroups(ctx, resultGroups);\n return [];\n }\n }\n\n const resultFragments = shouldComputeTimeResults\n ? this.computeTimeResults(ctx, timer, completionLabel)\n : MetricContainer.from(\n [new SystemTimeMetric(this._now.now(), ctx.block.key.toString())],\n ctx.block.key.toString()\n );\n\n this.writeResultMemory(ctx, resultFragments);\n\n return [];\n }\n\n onDispose(_ctx: IBehaviorContext): void {\n // No cleanup needed\n }\n\n private collectDisplayFragments(ctx: IBehaviorContext): MetricContainer {\n const metrics = MetricContainer.empty(ctx.block.key.toString());\n for (const loc of ctx.block.getMemoryByTag('metric:display')) {\n metrics.merge(loc.metrics);\n }\n return metrics;\n }\n\n private collectStateFragments(ctx: IBehaviorContext): MetricContainer {\n const metrics = MetricContainer.empty(ctx.block.key.toString());\n for (const loc of ctx.block.getMemoryByTag('round')) metrics.merge(loc.metrics);\n for (const loc of ctx.block.getMemoryByTag('time')) metrics.merge(loc.metrics);\n return metrics;\n }\n\n private mergeFragments(displayFragments: MetricContainer, stateFragments: MetricContainer): MetricContainer {\n const displayTypes = new Set(displayFragments.map(f => `${f.type}:${f.type}`));\n const uniqueStateFragments = stateFragments.filter(\n f => !displayTypes.has(`${f.type}:${f.type}`)\n );\n return displayFragments.clone().add(...uniqueStateFragments);\n }\n\n private buildMilestoneFragments(ctx: IBehaviorContext, round: RoundState): MetricContainer {\n const metrics = MetricContainer.empty(ctx.block.key.toString()).add(\n new CurrentRoundMetric(\n round.current,\n round.total,\n ctx.block.key.toString(),\n ctx.clock.currentDate,\n ),\n );\n\n const timer = readTimer(ctx);\n if (timer) {\n const nowMs = ctx.clock.currentDate.getTime();\n const elapsed = calculateElapsed(timer, nowMs);\n metrics.add(new ElapsedMetric(elapsed, ctx.block.key.toString(), ctx.clock.currentDate));\n\n if (timer.spans.length > 0) {\n metrics.add(new SpansMetric([...timer.spans], ctx.block.key.toString(), ctx.clock.currentDate));\n }\n }\n\n return metrics;\n }\n\n private computeTimeResults(\n ctx: IBehaviorContext,\n timer: TimerState | undefined,\n customRoundLabel?: string\n ): MetricContainer {\n const now = ctx.clock.currentDate;\n const nowMs = now.getTime();\n const blockKey = ctx.block.key.toString();\n const round = ctx.getMemoryByTag('round')[0]?.metrics[0] as unknown as RoundState | undefined;\n\n if (timer && timer.spans.length > 0) {\n const elapsed = calculateElapsed(timer, nowMs);\n const firstStart = timer.spans[0].started;\n const lastSpan = timer.spans[timer.spans.length - 1];\n const lastEnd = lastSpan.ended ?? nowMs;\n const total = Math.max(0, lastEnd - firstStart);\n\n const metrics = MetricContainer.empty(blockKey).add(\n new ElapsedMetric(elapsed, blockKey, now),\n new TotalMetric(total, blockKey, now),\n new SpansMetric([...timer.spans], blockKey, now),\n new SystemTimeMetric(this._now.now(), blockKey),\n );\n if (round) {\n metrics.add(new CurrentRoundMetric(round.current, round.total, blockKey, now, customRoundLabel));\n }\n return metrics;\n }\n\n const degenerateSpan = new TimeSpan(nowMs, nowMs);\n const metrics = MetricContainer.empty(blockKey).add(\n new ElapsedMetric(0, blockKey, now),\n new TotalMetric(0, blockKey, now),\n new SpansMetric([degenerateSpan], blockKey, now),\n new SystemTimeMetric(this._now.now(), blockKey),\n );\n if (round) {\n metrics.add(new CurrentRoundMetric(round.current, round.total, blockKey, now, customRoundLabel));\n }\n return metrics;\n }\n\n private computeSplitTimeResults(\n ctx: IBehaviorContext,\n timer: TimerState | undefined,\n groups: MetricContainer[],\n customRoundLabel?: string\n ): MetricContainer[] {\n const now = ctx.clock.currentDate;\n const nowMs = now.getTime();\n const blockKey = ctx.block.key.toString();\n const round = ctx.getMemoryByTag('round')[0]?.metrics[0] as unknown as RoundState | undefined;\n\n if (!timer || timer.spans.length === 0) {\n return groups.map((group) => {\n const groupFragments = group.clone().add(\n new ElapsedMetric(0, blockKey, now),\n new TotalMetric(0, blockKey, now),\n new SpansMetric([new TimeSpan(nowMs, nowMs)], blockKey, now),\n new SystemTimeMetric(this._now.now(), blockKey),\n );\n if (round) {\n groupFragments.add(new CurrentRoundMetric(round.current, round.total, blockKey, now, customRoundLabel));\n }\n return groupFragments;\n });\n }\n\n const totalElapsed = calculateElapsed(timer, nowMs);\n const firstStart = timer.spans[0].started;\n const lastEnd = timer.spans[timer.spans.length - 1].ended ?? nowMs;\n const totalDuration = lastEnd - firstStart;\n\n // 1. Calculate weights for each group based on reps\n const weights = groups.map(group => {\n const reps = group\n .filter(f => f.type === MetricType.Rep && typeof f.value === 'number')\n .reduce((sum, f) => sum + (f.value as number), 0);\n return reps > 0 ? reps : 1; // Default to 1 if no reps\n });\n const totalWeight = weights.reduce((sum, w) => sum + w, 0);\n\n // 2. Distribute time and create virtual spans\n let currentOffsetMs = 0;\n return groups.map((group, i) => {\n const weight = weights[i];\n const ratio = weight / totalWeight;\n const groupElapsed = Math.round(totalElapsed * ratio);\n const groupTotal = Math.round(totalDuration * ratio);\n\n // Create virtual spans for this group starting at an offset from firstStart\n const groupStart = firstStart + currentOffsetMs;\n const groupEnd = groupStart + groupTotal;\n currentOffsetMs += groupTotal;\n\n const groupFragments = group.clone().add(\n new ElapsedMetric(groupElapsed, blockKey, now),\n new TotalMetric(groupTotal, blockKey, now),\n new SpansMetric([new TimeSpan(groupStart, groupEnd)], blockKey, now),\n new SystemTimeMetric(this._now.now(), blockKey),\n );\n if (round) {\n groupFragments.add(new CurrentRoundMetric(round.current, round.total, blockKey, now, customRoundLabel));\n }\n return groupFragments;\n });\n }\n\n private writeResultMemory(ctx: IBehaviorContext, resultFragments: MetricContainer): void {\n const existing = ctx.block.getMemoryByTag('metric:result');\n if (existing.length > 0) {\n ctx.updateMemory('metric:result', resultFragments.toArray());\n return;\n }\n\n ctx.pushMemory('metric:result', resultFragments.toArray());\n }\n\n private writeResultGroups(ctx: IBehaviorContext, resultGroups: MetricContainer[]): void {\n const existing = ctx.block.getMemoryByTag('metric:result');\n if (existing.length > 0) {\n // Not supporting partial updates of groups yet\n return;\n }\n\n for (const group of resultGroups) {\n ctx.pushMemory('metric:result', group.toArray());\n }\n }\n\n private formatLabel(ctx: IBehaviorContext): string {\n return this.config.label ?? ctx.block.label;\n }\n\n private formatRoundLabel(round: RoundState): string {\n return round.total !== undefined\n ? `Round ${round.current} of ${round.total}`\n : `Round ${round.current}`;\n }\n}\n","import { IMetric, MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\n/**\n * Trigger types for when a sound should play.\n */\nexport type SoundTrigger = 'mount' | 'unmount' | 'countdown' | 'complete';\n\n/**\n * SoundMetric represents an audio cue to be played during workout execution.\n * \n * Used by SoundCueBehavior to emit output records that audio systems can process.\n * \n * @example\n * ```typescript\n * // A countdown beep at 3 seconds remaining\n * new SoundMetric('countdown-beep', 'countdown', { atSecond: 3 })\n * \n * // A completion chime\n * new SoundMetric('complete-chime', 'complete')\n * ```\n */\nexport class SoundMetric implements IMetric {\n readonly type = MetricType.Sound;\n readonly origin: MetricOrigin;\n readonly value: SoundMetricValue;\n readonly image: string;\n\n constructor(\n /** Sound identifier or URL */\n public readonly sound: string,\n /** When this sound was triggered */\n public readonly trigger: SoundTrigger,\n /** Additional options */\n options: {\n /** For countdown triggers, the second at which this played */\n atSecond?: number;\n /** Origin of this metrics */\n origin?: MetricOrigin;\n } = {}\n ) {\n this.origin = options.origin ?? 'tracked';\n this.value = {\n sound,\n trigger,\n atSecond: options.atSecond\n };\n this.image = options.atSecond !== undefined \n ? `${sound}@${options.atSecond}s` \n : sound;\n }\n}\n\n/**\n * Value structure for SoundMetric\n */\nexport interface SoundMetricValue {\n /** Sound identifier or URL */\n readonly sound: string;\n /** Trigger type */\n readonly trigger: SoundTrigger;\n /** For countdown triggers, the second at which this played */\n readonly atSecond?: number;\n}\n","import { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { IBehaviorContext } from '../contracts/IBehaviorContext';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { readTimer } from '../time/TimerSpans';\nimport { SoundMetric } from '../compiler/metrics/SoundMetric';\nimport type { SoundTrigger } from '../compiler/metrics/SoundMetric';\n\nexport interface SoundCue {\n /** Sound identifier or URL */\n sound: string;\n /** When to play: 'mount' | 'unmount' | 'countdown' | 'complete' */\n trigger: SoundTrigger;\n /** Countdown seconds (only for trigger: 'countdown') */\n atSeconds?: number[];\n}\n\nexport interface SoundCueConfig {\n /** Sound cues to play */\n cues: SoundCue[];\n}\n\n/**\n * SoundCueBehavior emits sound cue outputs at specific lifecycle points.\n * \n * ## Aspect: Output (Audio)\n * \n * Emits 'system' outputs with SoundMetric that audio systems can observe.\n * Sound outputs are tracked as system events so they do not appear in the\n * user-facing review/logs page — only in the debug view.\n * This follows the principle that behaviors emit outputs, not events.\n * \n * ## Output Contract\n * \n * - **Mount**: Emits system output for 'mount' trigger sounds\n * - **Tick**: Emits system output for 'countdown' trigger sounds at specified seconds\n * - **Unmount**: Emits system output for 'unmount' and 'complete' trigger sounds\n * \n * ## Audio System Integration\n * \n * Audio systems should subscribe to outputs (via runtime output stream) and\n * filter for SoundMetric to play audio cues:\n * \n * ```typescript\n * runtime.outputs$.subscribe(output => {\n * const soundFragments = output.metrics.filter(f => f.metricType === MetricType.Sound);\n * for (const sf of soundFragments) {\n * audioPlayer.play(sf.value.sound);\n * }\n * });\n * ```\n */\nexport class SoundCueBehavior implements IRuntimeBehavior {\n constructor(private config: SoundCueConfig) { }\n\n onMount(ctx: IBehaviorContext): IRuntimeAction[] {\n // Emit mount sound outputs as system events (not shown in review logs)\n for (const cue of this.config.cues) {\n if (cue.trigger === 'mount') {\n ctx.emitOutput('system', [\n new SoundMetric(cue.sound, 'mount')\n ], { label: `Sound: ${cue.sound}` });\n }\n }\n\n // Subscribe to timer tick for countdown sounds\n // Use 'bubble' scope so countdown cues play even when child blocks are active\n const countdownCues = this.config.cues.filter(c => c.trigger === 'countdown');\n if (countdownCues.length > 0) {\n const playedSeconds = new Set<number>();\n\n ctx.subscribe('tick', (_event, tickCtx) => {\n const timer = readTimer(tickCtx);\n if (!timer || timer.direction !== 'down' || !timer.durationMs) return [];\n\n // Calculate remaining seconds using TimeSpan properties\n const now = tickCtx.clock.currentDate.getTime();\n let elapsed = 0;\n for (const span of timer.spans) {\n const end = span.ended ?? now;\n elapsed += end - span.started;\n }\n const remainingMs = timer.durationMs - elapsed;\n const remainingSeconds = Math.ceil(remainingMs / 1000);\n\n // Check if we should emit a sound cue\n for (const cue of countdownCues) {\n if (cue.atSeconds?.includes(remainingSeconds) && !playedSeconds.has(remainingSeconds)) {\n playedSeconds.add(remainingSeconds);\n tickCtx.emitOutput('system', [\n new SoundMetric(cue.sound, 'countdown', { atSecond: remainingSeconds })\n ], { label: `Countdown: ${remainingSeconds}s` });\n }\n }\n\n return [];\n }, { scope: 'bubble' });\n }\n\n return [];\n }\n\n onNext(_ctx: IBehaviorContext): IRuntimeAction[] {\n return [];\n }\n\n onUnmount(ctx: IBehaviorContext): IRuntimeAction[] {\n // Emit unmount/complete sound outputs as system events (not shown in review logs)\n for (const cue of this.config.cues) {\n if (cue.trigger === 'unmount' || cue.trigger === 'complete') {\n ctx.emitOutput('system', [\n new SoundMetric(cue.sound, cue.trigger)\n ], { label: `Sound: ${cue.sound}` });\n }\n }\n\n return [];\n }\n\n onDispose(_ctx: IBehaviorContext): void {\n // No cleanup needed\n }\n}\n","import { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { IBehaviorContext } from '../contracts/IBehaviorContext';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport type { ButtonConfig } from '../memory/MemoryTypes';\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\n\n// Re-export types for consumers\nexport type { ButtonConfig };\n\nexport interface ControlsConfig {\n /** Initial buttons to display */\n buttons: ButtonConfig[];\n}\n\n/**\n * ButtonBehavior initializes control button state in memory.\n *\n * ## Aspect: Controls\n *\n * Sets up the button configurations in memory that the UI observes.\n * When buttons are clicked, the UI emits the corresponding `eventName`\n * as an external event that behaviors can subscribe to.\n *\n * ## Memory Contract\n *\n * - **Writes**: `controls` memory on mount\n * - **Clears**: `controls` memory on unmount (sets empty buttons array)\n *\n * ## UI Integration\n *\n * The UI should:\n * 1. Subscribe to `controls` memory changes\n * 2. Render buttons based on action metrics\n * 3. Emit `button.eventName` when user clicks a button\n *\n * @example\n * ```typescript\n * new ButtonBehavior({\n * buttons: [\n * { id: 'next', label: 'Next', variant: 'primary', visible: true, enabled: true, eventName: 'next' },\n * { id: 'pause', label: 'Pause', variant: 'secondary', visible: true, enabled: true, eventName: 'timer:pause' }\n * ]\n * })\n * ```\n */\nexport class ButtonBehavior implements IRuntimeBehavior {\n constructor(private config: ControlsConfig) { }\n\n onMount(ctx: IBehaviorContext): IRuntimeAction[] {\n // Create action metrics for each button\n const metrics = MetricContainer.from(this.config.buttons.map(button => ({\n type: MetricType.Action,\n image: button.label,\n origin: 'runtime',\n value: {\n id: button.id,\n label: button.label,\n variant: button.variant,\n visible: button.visible,\n enabled: button.enabled,\n eventName: button.eventName\n },\n sourceBlockKey: ctx.block.key.toString(),\n timestamp: ctx.clock.currentDate,\n })), ctx.block.key.toString());\n\n // Push action metrics to list-based memory\n if (metrics.length > 0) {\n ctx.pushMemory('controls', metrics.toArray());\n }\n\n return [];\n }\n\n onNext(_ctx: IBehaviorContext): IRuntimeAction[] {\n return [];\n }\n\n onUnmount(ctx: IBehaviorContext): IRuntimeAction[] {\n // Clear controls memory (signals UI to remove buttons)\n ctx.updateMemory('controls', []);\n\n return [];\n }\n\n onDispose(_ctx: IBehaviorContext): void {\n // No cleanup needed\n }\n\n /**\n * Update a specific button's state dynamically.\n * Call this from other behaviors to enable/disable buttons.\n */\n static updateButton(\n ctx: IBehaviorContext,\n buttonId: string,\n updates: Partial<Pick<ButtonConfig, 'visible' | 'enabled' | 'label'>>\n ): void {\n const controlsLocs = ctx.block.getMemoryByTag('controls');\n if (controlsLocs.length === 0) return;\n\n const loc = controlsLocs[0];\n const updatedFragments = loc.metrics.map(f => {\n const btn = f.value as ButtonConfig;\n if (btn.id === buttonId) {\n return { ...f, value: { ...btn, ...updates } };\n }\n return f;\n });\n\n ctx.updateMemory('controls', updatedFragments);\n }\n}\n","import type { IRuntimeContext } from '../contracts/IRuntimeContext';\nimport { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { BlockLifecycleOptions } from '../contracts/IRuntimeBlock';\nimport { RuntimeBlock } from '../RuntimeBlock';\nimport { BlockContext } from '../BlockContext';\nimport { BlockKey } from '@bitcobblers/wod-wiki-core';\n\n// Aspect-based behaviors\nimport {\n ReportOutputBehavior,\n ExitBehavior,\n LabelingBehavior,\n ButtonBehavior\n} from '../behaviors';\n\n/**\n * WaitingToStartBlock is an idle gate that pauses before workout execution.\n *\n * The user must click 'next()' (i.e., the \"Start\" button) to advance.\n * When next() is called, WaitingToStart pops immediately via ExitBehavior.\n * The parent SessionRoot then detects the pop and pushes the first workout block.\n *\n * ## Lifecycle\n *\n * 1. Mount: Emits 'segment' output with \"Ready to Start\" message\n * 2. User clicks next → ExitBehavior marks complete, returns PopBlockAction\n * 3. Pop: emits a 'segment' output carrying the completion reason\n * 4. Parent receives control, pushes next child\n *\n * ## Behavior Chain\n *\n * - ReportOutputBehavior (output on mount/unmount)\n * - LabelingBehavior (show \"Ready to Start\")\n * - ButtonBehavior (show \"Start\" button)\n * - ExitBehavior (pop on user advance)\n */\nexport class WaitingToStartBlock extends RuntimeBlock {\n constructor(runtime: IRuntimeContext) {\n const blockKey = new BlockKey('waiting-to-start');\n const context = new BlockContext(runtime, blockKey.toString(), 'WaitingToStart');\n const behaviors = WaitingToStartBlock.buildBehaviors();\n\n super({\n runtime,\n sourceIds: [], // No source IDs for idle block\n behaviors,\n context,\n key: blockKey,\n blockType: 'WaitingToStart',\n label: 'Ready to Start',\n });\n }\n\n /**\n * Builds the behavior list for the WaitingToStart block.\n */\n static buildBehaviors(): IRuntimeBehavior[] {\n const behaviors: IRuntimeBehavior[] = [];\n\n // =====================================================================\n // Output Aspect - Segment tracking\n // =====================================================================\n behaviors.push(new ReportOutputBehavior({ label: 'Ready to Start' }));\n\n // =====================================================================\n // Display Aspect\n // =====================================================================\n behaviors.push(new LabelingBehavior({\n mode: 'clock',\n label: 'Ready to Start'\n }));\n\n // =====================================================================\n // Controls Aspect - Start button\n // =====================================================================\n behaviors.push(new ButtonBehavior({\n buttons: [\n {\n id: 'start',\n label: 'Start Workout',\n variant: 'primary' as const,\n visible: true,\n enabled: true,\n eventName: 'next'\n }\n ]\n }));\n\n // =====================================================================\n // Completion Aspect - Pop on user advance\n // =====================================================================\n behaviors.push(new ExitBehavior({ mode: 'immediate', onNext: true }));\n\n return behaviors;\n }\n\n mount(runtime: IRuntimeContext, options?: BlockLifecycleOptions): IRuntimeAction[] {\n return super.mount(runtime, options);\n }\n\n unmount(runtime: IRuntimeContext, options?: BlockLifecycleOptions): IRuntimeAction[] {\n return super.unmount(runtime, options);\n }\n\n dispose(runtime: IRuntimeContext): void {\n super.dispose(runtime);\n if (this.context) {\n this.context.release();\n }\n }\n}\n","import { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { IBehaviorContext } from '../contracts/IBehaviorContext';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../contracts/IRuntimeContext';\nimport { WaitingToStartBlock } from '../blocks/WaitingToStartBlock';\nimport { PushBlockAction } from '../actions/stack/PushBlockAction';\n\n/**\n * WaitingToStartInjectorBehavior pushes a WaitingToStartBlock on mount.\n *\n * This behavior is placed BEFORE ChildRunnerBehavior in the SessionRootBlock\n * behavior chain. On mount, it returns a PushBlockAction for a WaitingToStartBlock.\n * The WaitingToStartBlock acts as an idle gate — the user must click \"Start\"\n * to dismiss it, after which the parent's ChildRunnerBehavior takes over.\n *\n * ## Interaction with ChildRunnerBehavior\n *\n * When this behavior is present, ChildRunnerBehavior must be configured with\n * `skipOnMount: true` so it doesn't also push a child on mount.\n * When WaitingToStart pops (user clicks Start), PopBlockAction fires NextAction\n * on the parent, which triggers ChildRunnerBehavior.onNext() → pushes the\n * actual first child from childGroups[0].\n */\nexport class WaitingToStartInjectorBehavior implements IRuntimeBehavior {\n constructor(private readonly runtime: IRuntimeContext) {}\n\n onMount(_ctx: IBehaviorContext): IRuntimeAction[] {\n const waitingBlock = new WaitingToStartBlock(this.runtime);\n return [new PushBlockAction(waitingBlock)];\n }\n\n onNext(_ctx: IBehaviorContext): IRuntimeAction[] {\n return [];\n }\n\n onUnmount(_ctx: IBehaviorContext): IRuntimeAction[] {\n return [];\n }\n\n onDispose(_ctx: IBehaviorContext): void {\n // No cleanup needed\n }\n}\n","import type { IRuntimeContext } from '../contracts/IRuntimeContext';\nimport { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { BlockLifecycleOptions } from '../contracts/IRuntimeBlock';\nimport { RuntimeBlock } from '../RuntimeBlock';\nimport { BlockContext } from '../BlockContext';\nimport { BlockKey } from '@bitcobblers/wod-wiki-core';\n\n// Aspect-based behaviors\nimport {\n ReportOutputBehavior,\n CountdownTimerBehavior,\n ExitBehavior,\n LabelingBehavior,\n SoundCueBehavior\n} from '../behaviors';\n\n/**\n * Configuration for the rest block.\n */\nexport interface RestBlockConfig {\n /** Duration of the rest period in milliseconds */\n durationMs: number;\n /** Label for the rest period (default: \"Rest\") */\n label?: string;\n}\n\n/**\n * RestBlock is a timer-based block for rest periods between exercises.\n *\n * Timer-based parents (AMRAP, EMOM) can auto-generate Rest blocks between exercises.\n * The rest block counts down from the configured duration and auto-pops when the timer expires.\n *\n * ## Lifecycle\n *\n * 1. Mount: Emits 'segment' output with rest label and duration, starts countdown timer\n * 2. Timer counts down via CountdownTimerBehavior span tracking\n * 3. CountdownTimerBehavior marks complete when elapsed >= durationMs\n * 4. Pop: emits a 'segment' output carrying the completion reason, plays rest-over sound cue\n *\n * ## Behavior Chain\n *\n * - ReportOutputBehavior (output on mount/unmount)\n * - CountdownTimerBehavior (countdown timer + pause/resume + auto-complete)\n * - LabelingBehavior (show rest countdown)\n * - SoundCueBehavior (beep on unmount for rest-over signal)\n */\nexport class RestBlock extends RuntimeBlock {\n constructor(\n runtime: IRuntimeContext,\n config: RestBlockConfig\n ) {\n if (config.durationMs < 0) {\n throw new RangeError(`RestBlock durationMs must be >= 0, got: ${config.durationMs}`);\n }\n\n const restLabel = config.label ?? 'Rest';\n const blockKey = new BlockKey('rest');\n const context = new BlockContext(runtime, blockKey.toString(), 'Rest');\n const behaviors = RestBlock.buildBehaviors(config);\n\n super({\n runtime,\n sourceIds: [], // No source IDs for auto-generated block\n behaviors,\n context,\n key: blockKey,\n blockType: 'Rest',\n label: restLabel,\n });\n }\n\n /**\n * Builds the behavior list for a rest block.\n */\n static buildBehaviors(config: RestBlockConfig): IRuntimeBehavior[] {\n const behaviors: IRuntimeBehavior[] = [];\n const restLabel = config.label ?? 'Rest';\n\n // =====================================================================\n // Output Aspect - Segment tracking\n // =====================================================================\n behaviors.push(new ReportOutputBehavior({ label: restLabel }));\n\n // ====================================================================\n // Time Aspect - Countdown timer (self-contained lifecycle)\n // ====================================================================\n behaviors.push(new CountdownTimerBehavior({\n durationMs: config.durationMs,\n label: restLabel,\n role: 'primary',\n mode: 'complete-block'\n }));\n\n // =====================================================================\n // Completion Aspect - Rest should end on timer completion.\n // Ignore generic next events to prevent accidental fast-skipping\n // (e.g., rapid user/input next events during EMOM).\n // =====================================================================\n behaviors.push(new ExitBehavior({\n mode: 'immediate',\n onNext: false,\n onEvents: ['timer:complete']\n }));\n\n // =====================================================================\n // Display Aspect\n // =====================================================================\n behaviors.push(new LabelingBehavior({\n mode: 'timer',\n label: restLabel\n }));\n\n // =====================================================================\n // Sound Aspect - Rest-over beep\n // =====================================================================\n behaviors.push(new SoundCueBehavior({\n cues: [\n {\n sound: 'rest-over',\n trigger: 'complete'\n },\n {\n sound: 'countdown-beep',\n trigger: 'countdown',\n atSeconds: [3, 2, 1]\n }\n ]\n }));\n\n return behaviors;\n }\n\n mount(runtime: IRuntimeContext, options?: BlockLifecycleOptions): IRuntimeAction[] {\n return super.mount(runtime, options);\n }\n\n unmount(runtime: IRuntimeContext, options?: BlockLifecycleOptions): IRuntimeAction[] {\n return super.unmount(runtime, options);\n }\n\n dispose(runtime: IRuntimeContext): void {\n super.dispose(runtime);\n if (this.context) {\n this.context.release();\n }\n }\n}\n","import { IRuntimeBehavior } from \"../contracts/IRuntimeBehavior\";\nimport { IBlockContext } from \"../contracts/IBlockContext\";\nimport { BlockKey } from '@bitcobblers/wod-wiki-core';\nimport { IRuntimeBlock } from \"../contracts/IRuntimeBlock\";\nimport { RuntimeBlock } from \"../RuntimeBlock\";\nimport type { IRuntimeContext } from \"../contracts/IRuntimeContext\";\nimport { IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { MemoryLocation } from \"../memory/MemoryLocation\";\nimport { RestBlock } from \"../blocks/RestBlock\";\nimport { PushBlockAction } from \"../actions/stack/PushBlockAction\";\nimport {\n CompletionTimestampBehavior,\n CountupTimerBehavior,\n CountdownTimerBehavior, CountdownMode,\n SpanTrackingBehavior,\n ChildSelectionBehavior,\n ChildSelectionConfig,\n ChildSelectionLoopCondition,\n ExitBehavior,\n MetricPromotionBehavior\n} from \"../behaviors\";\n\n\n/** Legacy timer config shape — kept for call-site backward compatibility */\nexport interface TimerConfig {\n direction: 'up' | 'down';\n durationMs?: number;\n label?: string;\n role?: 'primary' | 'secondary' | 'hidden' | 'auto';\n}\n\nexport interface TimerCompletionConfig {\n completesBlock?: boolean;\n}\n\n/** Round configuration stored by asRepeater() and forwarded by asContainer() */\nexport interface RepeaterConfig {\n totalRounds?: number;\n startRound?: number;\n addCompletion?: boolean;\n}\n\n/** @internal re-exported for backward compat */ \nexport type { CountdownMode };\n\nexport class BlockBuilder {\n private behaviors: Map<any, IRuntimeBehavior> = new Map();\n private context: IBlockContext | undefined;\n private key: BlockKey | undefined;\n private label: string = \"\";\n private blockType: string = \"Block\";\n private metrics: MetricContainer[] | undefined;\n private sourceIds: number[] = [];\n /** Pending round config stored by asRepeater(), consumed by asContainer() */\n private pendingRoundConfig: RepeaterConfig | undefined;\n /** Declared exit intent — resolved into a single ExitBehavior in build(). */\n private declaredExitMode: 'immediate' | 'deferred' | undefined;\n\n constructor(private runtime: IRuntimeContext) {}\n\n addBehavior(behavior: IRuntimeBehavior): BlockBuilder {\n\n // The user prompt implies \"union\".\n // But we also need \"override\".\n // Strategy: Key by constructor. High priority strategies run first and add behaviors.\n // If we want to prevent overwrite, we check hasBehavior.\n // If we want to allow multiples, we need a different storage.\n\n // Let's use a list but provide helpers to check existence.\n // \"strategies return behaviors... union... compound block behavior\"\n // If two strategies add SoundBehavior, we probably want both? Or merged?\n // Usually we want one SoundBehavior that handles all cues.\n // But TimerBehavior? Definitely only one.\n\n // Let's store in a list, but offer `removeBehavior` or `hasBehavior`.\n // Actually, for composition, usually \"Last Write Wins\" or \"First Write Wins\".\n // With Priority: High Priority runs FIRST. So \"First Write Wins\" prevents Low Priority from messing it up?\n // Or High Priority runs LAST and overwrites?\n // Standard Chain of Responsibility / Decorator:\n // Usually High Priority decides FIRST.\n // If `IntervalStrategy` (High) sets a Timer, `GenericTimer` (Low) should see it and skip.\n\n // So we need to be able to query.\n this.behaviors.set(behavior.constructor, behavior);\n return this;\n }\n\n /**\n * Adds a behavior only if one of that type doesn't already exist.\n */\n addBehaviorIfMissing(behavior: IRuntimeBehavior): BlockBuilder {\n if (!this.behaviors.has(behavior.constructor)) {\n this.behaviors.set(behavior.constructor, behavior);\n }\n return this;\n }\n\n /**\n * Remove a behavior by its constructor type.\n *\n * Private: this is a mechanic `build()` uses to resolve a declared exit\n * intent (see `declareExit`) into exactly one `ExitBehavior`. Strategies\n * declare intent instead of calling this directly — see §2.3 of\n * docs/architectural-cleanup-tier-2-consolidations.md for why strategies\n * used to mutate each other's contributions this way, and why that\n * coupling was removed.\n */\n private removeBehavior<T extends IRuntimeBehavior>(type: new (...args: any[]) => T): BlockBuilder {\n this.behaviors.delete(type);\n return this;\n }\n\n /**\n * Move an already-added behavior to the LAST position in the behavior list.\n *\n * Behavior order = Map insertion order = RuntimeBlock.onNext execution order.\n *\n * Private: `build()` calls this once to canonicalize ordering (e.g.\n * MetricPromotionBehavior must run after ChildSelectionBehavior so it sees\n * the round ChildSelectionBehavior just advanced). No-op when the behavior\n * is not present (or already last). Strategies no longer call this\n * directly — see §2.3 of docs/architectural-cleanup-tier-2-consolidations.md.\n */\n private moveBehaviorLast<T extends IRuntimeBehavior>(type: new (...args: any[]) => T): BlockBuilder {\n const behavior = this.behaviors.get(type);\n if (!behavior) return this;\n this.behaviors.delete(type);\n this.behaviors.set(type, behavior);\n return this;\n }\n\n hasBehavior<T extends IRuntimeBehavior>(type: new (...args: any[]) => T): boolean {\n return this.behaviors.has(type);\n }\n /**\n * Declare the block's exit intent. Strategies call this instead of adding\n * or removing ExitBehavior across each other. 'deferred' supersedes\n * 'immediate' (a container strategy overrides a leaf strategy's\n * immediate-exit guess). Resolved into a single ExitBehavior in build().\n */\n declareExit(mode: 'immediate' | 'deferred'): BlockBuilder {\n if (mode === 'deferred' || this.declaredExitMode === undefined) {\n this.declaredExitMode = mode;\n }\n return this;\n }\n /** The declared exit intent (resolved into a single ExitBehavior in build). */\n get exitMode(): 'immediate' | 'deferred' | undefined {\n return this.declaredExitMode;\n }\n\n getBehavior<T extends IRuntimeBehavior>(type: new (...args: any[]) => T): T | undefined {\n return this.behaviors.get(type) as T | undefined;\n }\n\n setContext(context: IBlockContext): BlockBuilder {\n this.context = context;\n return this;\n }\n\n setKey(key: BlockKey): BlockBuilder {\n this.key = key;\n return this;\n }\n\n setLabel(label: string): BlockBuilder {\n this.label = label;\n return this;\n }\n\n setBlockType(type: string): BlockBuilder {\n this.blockType = type;\n return this;\n }\n\n setFragments(metrics: IMetric[][] | MetricContainer[]): BlockBuilder {\n // Hint metrics are semantic markers, not display fragments — drop them\n // so they never surface as block metrics.\n this.metrics = metrics.map(group => {\n const container = MetricContainer.from(group);\n container.removeByType(MetricType.Hint);\n return container;\n });\n return this;\n }\n\n setSourceIds(ids: number[]): BlockBuilder {\n this.sourceIds = ids;\n return this;\n }\n getLabel(): string {\n return this.label;\n }\n getBlockType(): string {\n return this.blockType;\n }\n getFragments(): MetricContainer[] | undefined {\n return this.metrics;\n }\n getSourceIds(): number[] {\n return this.sourceIds;\n }\n getContext(): IBlockContext | undefined {\n return this.context;\n }\n getKey(): BlockKey | undefined {\n return this.key;\n }\n\n // ============================================================================\n // Aspect Composer Methods - High-level composition helpers\n // ============================================================================\n\n /**\n * Timer Aspect Composer — assigns exactly ONE self-contained timer behavior.\n *\n * - `direction: 'down'` + `durationMs` → `CountdownTimerBehavior`\n * (subscribes to tick, fires timer:complete, handles pause/resume)\n * - `direction: 'up'` or no duration → `CountupTimerBehavior`\n * (tracks elapsed via spans, handles pause/resume, no completion signal)\n *\n * @param config Timer configuration\n * @returns This builder for chaining\n */\n asTimer(config: TimerConfig & {\n addCompletion?: boolean;\n completionConfig?: TimerCompletionConfig;\n injectRest?: boolean;\n required?: boolean;\n }): BlockBuilder {\n if (config.direction === 'down' && config.durationMs) {\n const mode: CountdownMode = config.completionConfig?.completesBlock === false\n ? 'reset-interval'\n : 'complete-block';\n\n // The `restBlockFactory` closure is a builder concern (it talks\n // to runtime/push-action plumbing that is not a behavior concern),\n // so it stays closed over here rather than moving into the behavior.\n this.addBehavior(new CountdownTimerBehavior({\n durationMs: config.durationMs,\n label: config.label,\n role: config.role,\n mode,\n required: config.required,\n restBlockFactory: config.injectRest ? (durationMs: number, label?: string) => {\n const restBlock = new RestBlock(this.runtime, { durationMs, label });\n return [new PushBlockAction(restBlock)];\n } : undefined\n }));\n } else {\n this.addBehavior(new CountupTimerBehavior({\n label: config.label,\n role: config.role\n }));\n }\n return this;\n }\n /**\n * Returns true if round config was stored via asRepeater().\n * Use this guard in strategies that must skip their iteration logic when rounds are already set.\n */\n hasRoundConfig(): boolean {\n return this.pendingRoundConfig !== undefined;\n }\n\n /**\n * Returns true if any timer behavior (countdown, countup, or span-only) is present.\n * Use this guard in strategies that must skip their timer logic when timer is already set.\n */\n hasTimerBehavior(): boolean {\n return (\n this.behaviors.has(CountdownTimerBehavior) ||\n this.behaviors.has(CountupTimerBehavior) ||\n this.behaviors.has(SpanTrackingBehavior)\n );\n }\n\n /**\n * Repeater Aspect Composer — stores round/iteration config to be forwarded\n * when asContainer() is called.\n *\n * Previously created ReEntryBehavior + RoundsEndBehavior directly; now the\n * config is absorbed into ChildSelectionBehavior via asContainer(), which\n * owns round state initialization and the overflow safety net.\n *\n * @param config Round configuration\n * @returns This builder for chaining\n */\n asRepeater(config: RepeaterConfig): BlockBuilder {\n this.pendingRoundConfig = {\n totalRounds: config.totalRounds,\n startRound: config.startRound ?? 1,\n addCompletion: config.addCompletion,\n };\n return this;\n }\n\n /**\n * Container Aspect Composer — adds ChildSelectionBehavior, incorporating any\n * round config stored by a prior asRepeater() call.\n *\n * @param config Container configuration\n * @returns This builder for chaining\n */\n asContainer(\n config: ChildSelectionConfig & {\n addLoop?: boolean;\n loopConfig?: { condition?: ChildSelectionLoopCondition };\n }\n ): BlockBuilder {\n const roundCfg = this.pendingRoundConfig;\n this.addBehavior(new ChildSelectionBehavior({\n childGroups: config.childGroups,\n loop: config.addLoop\n ? { condition: config.loopConfig?.condition ?? 'timer-active' }\n : false,\n injectRest: config.injectRest,\n skipOnMount: config.skipOnMount,\n // Forward round config from asRepeater() (absorbed from ReEntryBehavior)\n startRound: roundCfg?.startRound,\n totalRounds: roundCfg?.totalRounds,\n }));\n\n return this;\n }\n\n build(): IRuntimeBlock {\n if (!this.context) throw new Error(\"BlockContext is required\");\n if (!this.key) throw new Error(\"BlockKey is required\");\n\n // Add Universal Invariants - automatically added to ALL blocks\n // These behaviors are added implicitly and don't require strategy opt-in\n this.addBehaviorIfMissing(new CompletionTimestampBehavior());\n // Resolve declared exit intent into exactly one ExitBehavior. Strategies\n // declare intent (declareExit) rather than add/remove ExitBehavior across\n // each other; 'deferred' wins over 'immediate'. A declared intent supersedes\n // any ExitBehavior a strategy added directly (e.g. a timer strategy's default\n // exit is overridden by a container's 'deferred') — matching the former\n // removeBehavior+re-add that ChildrenStrategy did inline.\n if (this.declaredExitMode) {\n this.removeBehavior(ExitBehavior);\n this.addBehavior(new ExitBehavior(\n this.declaredExitMode === 'immediate'\n ? { mode: 'immediate', onNext: true }\n : { mode: 'deferred' }\n ));\n }\n // Canonical order: MetricPromotionBehavior runs after ChildSelectionBehavior\n // so it observes the round ChildSelectionBehavior just advanced.\n this.moveBehaviorLast(MetricPromotionBehavior);\n\n const block = new RuntimeBlock({\n runtime: this.runtime,\n sourceIds: this.sourceIds,\n behaviors: Array.from(this.behaviors.values()),\n context: this.context,\n key: this.key,\n blockType: this.blockType,\n // label is NOT passed here — it's pushed as a Label metrics below\n });\n\n // Push metrics memory preserving group structure from strategies\n if (this.metrics && this.metrics.length > 0) {\n // Push each metric group as a separate 'metric:display' location\n for (const group of this.metrics) {\n block.pushMemory(new MemoryLocation('metric:display', group));\n }\n }\n\n // Push label as a Label metrics in dedicated memory location\n if (this.label) {\n block.pushMemory(new MemoryLocation('metric:label', [{\n type: MetricType.Label,\n image: this.label,\n origin: 'compiler',\n value: this.label,\n } as IMetric]));\n }\n\n return block;\n }\n}\n","import { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport type { IRuntimeContext } from \"../IRuntimeContext\";\nimport type { IRuntimeBlock } from \"../IRuntimeBlock\";\n\n/**\n * Interface for behaviors that provide dynamic metrics promotions to child blocks.\n *\n * During compilation of a child block, the JitCompiler queries the parent block's\n * behaviors for any IMetricPromoter. These promoters return metrics that\n * should be injected into the child block's statements.\n *\n * This enables \"compiler-time\" inheritance where the parent's state (e.g. current round,\n * rep scheme index) is used to decorate child blocks during their creation.\n */\nexport interface IMetricPromoter {\n /**\n * Returns metrics to be promoted to child blocks.\n * @param runtime The current script runtime\n * @param parentBlock The parent block that is promoting metrics\n * @returns MetricContainer of metrics to inject into children\n */\n getPromotedFragments(runtime: IRuntimeContext, parentBlock: IRuntimeBlock): MetricContainer;\n}\n\n/**\n * Type guard for IMetricPromoter\n */\nexport function isFragmentPromoter(behavior: unknown): behavior is IMetricPromoter {\n return (\n typeof behavior === 'object' &&\n behavior !== null &&\n 'getPromotedFragments' in behavior &&\n typeof (behavior as IMetricPromoter).getPromotedFragments === 'function'\n );\n}\n","/**\n * PromotionResolver — concrete implementation of {@link IPromotionResolver}.\n *\n * Lifts the parent-block promotion logic that previously lived inline\n * in `JitCompiler.compile()` (lines 84-123 of the pre-Phase-D code).\n * The compiler becomes a pure `Statement[] → Block` transform; this\n * resolver owns the runtime-side projection.\n */\nimport type { IRuntimeBlock } from '../contracts/IRuntimeBlock';\nimport type { IRuntimeContext } from '../contracts/IRuntimeContext';\nimport type { IMetric } from '@bitcobblers/wod-wiki-core';\nimport { isFragmentPromoter } from '../contracts/behaviors/IMetricPromoter';\nimport type { IPromotionResolver, PromotionResolution } from './contracts/IPromotionResolver';\n\nexport class PromotionResolver implements IPromotionResolver {\n resolvePromotions(\n parentBlock: IRuntimeBlock | undefined,\n runtime: IRuntimeContext\n ): PromotionResolution {\n if (!parentBlock) {\n return { promotedFragments: [], hasPromotions: false };\n }\n\n // 1. Static promotions from memory (`metrics:promote`, `metrics:rep-target`).\n const promotedLocations = parentBlock.getMetricMemoryByVisibility('promote');\n // Defensive copy — the resolver may append dynamic promotions and\n // we must not mutate the caller's container.\n const promotedFragments: IMetric[] = promotedLocations.flatMap(\n loc => loc.metrics.toArray()\n );\n\n // 2. Dynamic promotions from behaviors (compiler-time concern).\n // This lets behaviors compute promotions based on current parent\n // state (e.g. current round) regardless of memory update ordering.\n for (const behavior of parentBlock.behaviors) {\n if (!isFragmentPromoter(behavior)) continue;\n const dynamicFragments = behavior.getPromotedFragments(runtime, parentBlock);\n for (const df of dynamicFragments) {\n // Deduplicate: dynamic promotions take precedence over\n // memory-based ones for the same metric type.\n const existingIndex = promotedFragments.findIndex(f => f.type === df.type);\n if (existingIndex !== -1) {\n promotedFragments[existingIndex] = df;\n } else {\n promotedFragments.push(df);\n }\n }\n }\n return {\n promotedFragments,\n hasPromotions: promotedFragments.length > 0,\n };\n }\n}\n","import type { IRuntimeBlock } from \"../contracts/IRuntimeBlock\";\nimport type { IRuntimeContext } from \"../contracts/IRuntimeContext\";\nimport type { IRuntimeBlockStrategy } from \"../contracts/IRuntimeBlockStrategy\";\nimport type { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { BlockBuilder } from \"./BlockBuilder\";\nimport type { IJitCompiler } from \"../contracts/IJitCompiler\";\nimport { PromotionResolver } from \"./PromotionResolver\";\nimport type { IPromotionResolver } from \"./contracts/IPromotionResolver\";\n\n/**\n * Just-In-Time Compiler for Runtime Blocks.\n * Coordinates strategy application to build composed RuntimeBlocks.\n */\nexport class JitCompiler implements IJitCompiler {\n private _promotionResolver: IPromotionResolver;\n\n constructor(\n private strategies: IRuntimeBlockStrategy[] = [],\n promotionResolver?: IPromotionResolver\n ) {\n this._promotionResolver = promotionResolver ?? new PromotionResolver();\n }\n\n registerStrategy(strategy: IRuntimeBlockStrategy): void {\n this.strategies.push(strategy);\n }\n\n compile(nodes: ICodeStatement[], runtime: IRuntimeContext): IRuntimeBlock | undefined {\n if (nodes.length === 0) {\n return undefined;\n }\n\n let effectiveNodes = nodes;\n const parentBlock = runtime.stack?.current;\n\n // Delegate parent-block promotion projection to the resolver; the\n // compiler remains a pure `Statement[] → Block` transform.\n const promotion = this._promotionResolver.resolvePromotions(parentBlock, runtime);\n\n if (promotion.hasPromotions) {\n const promotedFragments = promotion.promotedFragments;\n // Clone nodes and append promoted metrics. We append so that\n // explicit child metrics (index 0) take precedence when origins\n // are equal (defaults), but higher-precedence origins\n // (compiler/execution) will still resort to the top in the UI.\n effectiveNodes = nodes.map(node => {\n // Preserve the prototype chain (to keep methods like getFragment)\n const clone = Object.create(Object.getPrototypeOf(node));\n Object.assign(clone, node);\n clone.metrics = node.metrics.clone(node.id).add(...promotedFragments);\n return clone;\n });\n }\n\n // Match strategies directly: every production `match()` is a cheap\n // boolean predicate, so the filter+sort below costs less than building\n // a cache key would (and avoids stale-hit bugs where the key doesn't\n // capture everything `match()` inspects). Re-evaluate if profiling ever\n // shows strategy matching is hot.\n const matchingStrategies = this.strategies\n .filter(s => s.match(effectiveNodes, runtime))\n .sort((a, b) => (b.priority || 0) - (a.priority || 0));\n\n if (matchingStrategies.length === 0) {\n return undefined;\n }\n\n // Composition Flow\n const builder = new BlockBuilder(runtime);\n\n for (const strategy of matchingStrategies) {\n strategy.apply(builder, effectiveNodes, runtime);\n }\n\n try {\n return builder.build();\n } catch (e) {\n console.error(\"Failed to build block from composition:\", e);\n return undefined;\n }\n }\n}\n","import { IEvent } from '../contracts/events/IEvent';\nimport { v7 as uuidv7 } from 'uuid';\nimport { IScriptRuntime } from '../contracts/IScriptRuntime';\nimport { IEventHandler } from '../contracts/events/IEventHandler';\nimport { IEventBus, EventCallback, HandlerScope, EventHandlerOptions } from '../contracts/events/IEventBus';\nimport { RuntimeLogger } from '../RuntimeLogger';\n\nexport type EventHandlerRegistration = {\n handler: IEventHandler;\n ownerId: string;\n priority: number;\n scope: HandlerScope;\n};\n\ntype CallbackRegistration = {\n id: string;\n callback: EventCallback;\n ownerId: string;\n};\n\n/**\n * Simple in-memory event bus for runtime events.\n * \n * ## Handler Scope Filtering\n * \n * Handlers registered via `register()` are filtered by scope before dispatch:\n * - `'active'` (default): Only fires when ownerId matches the current/active block on the stack\n * - `'bubble'`: Fires when ownerId is anywhere on the stack (parent can listen to child events)\n * - `'global'`: Always fires regardless of stack state (for runtime-level handlers)\n * \n * ## Callbacks vs Handlers\n * \n * - **Handlers** (via `register()`): Produce `IRuntimeAction[]`, are scope-filtered\n * - **Callbacks** (via `on()`): Simple notifications for UI, are NOT scope-filtered (always fire)\n * \n * Callbacks are intended for UI components that need to react to all events regardless\n * of which block is active. They do not produce actions and cannot affect runtime state.\n */\nexport class EventBus implements IEventBus {\n private handlersByEvent: Map<string, EventHandlerRegistration[]> = new Map();\n private callbacksByEvent: Map<string, CallbackRegistration[]> = new Map();\n\n register(\n eventName: string,\n handler: IEventHandler,\n ownerId: string,\n options: EventHandlerOptions = {}\n ): () => void {\n const { priority = 0, scope = 'active' } = options;\n\n const list = this.handlersByEvent.get(eventName) ?? [];\n const updated = [...list, { handler, ownerId, priority, scope }];\n // Keep deterministic order: higher priority first, then insertion\n updated.sort((a, b) => b.priority - a.priority);\n this.handlersByEvent.set(eventName, updated);\n\n return () => this.unregisterById(handler.id);\n }\n\n on(eventName: string, callback: EventCallback, ownerId: string): () => void {\n const id = uuidv7();\n const list = this.callbacksByEvent.get(eventName) ?? [];\n list.push({ id, callback, ownerId });\n this.callbacksByEvent.set(eventName, list);\n\n return () => this.unregisterById(id);\n }\n\n unregisterById(handlerId: string): void {\n // Unregister from handlers\n for (const [eventName, list] of this.handlersByEvent.entries()) {\n const filtered = list.filter(entry => entry.handler.id !== handlerId);\n if (filtered.length === 0) {\n this.handlersByEvent.delete(eventName);\n } else {\n this.handlersByEvent.set(eventName, filtered);\n }\n }\n\n // Unregister from callbacks\n for (const [eventName, list] of this.callbacksByEvent.entries()) {\n const filtered = list.filter(entry => entry.id !== handlerId);\n if (filtered.length === 0) {\n this.callbacksByEvent.delete(eventName);\n } else {\n this.callbacksByEvent.set(eventName, filtered);\n }\n }\n }\n\n unregisterByOwner(ownerId: string): void {\n // Unregister handlers by owner\n for (const [eventName, list] of this.handlersByEvent.entries()) {\n const filtered = list.filter(entry => entry.ownerId !== ownerId);\n if (filtered.length === 0) {\n this.handlersByEvent.delete(eventName);\n } else {\n this.handlersByEvent.set(eventName, filtered);\n }\n }\n\n // Unregister callbacks by owner\n for (const [eventName, list] of this.callbacksByEvent.entries()) {\n const filtered = list.filter(entry => entry.ownerId !== ownerId);\n if (filtered.length === 0) {\n this.callbacksByEvent.delete(eventName);\n } else {\n this.callbacksByEvent.set(eventName, filtered);\n }\n }\n }\n\n dispatch(event: IEvent, runtime: IScriptRuntime): import('../contracts/IRuntimeAction').IRuntimeAction[] {\n // First, invoke simple callbacks (no actions) - callbacks are not scope-filtered\n const callbacks = [\n ...(this.callbacksByEvent.get('*') ?? []),\n ...(this.callbacksByEvent.get(event.name) ?? [])\n ];\n\n for (const entry of callbacks) {\n try {\n entry.callback(event, runtime);\n } catch (error) {\n console.error(`EventBus callback error for ${event.name}:`, error);\n }\n }\n\n // Get active block key and all stack keys for scope filtering\n const activeBlockKey = runtime.stack.current?.key.toString();\n const stackKeys = new Set(runtime.stack.keys.map(k => k.toString()));\n\n // Get all handlers for this event\n const allHandlers = [\n ...(this.handlersByEvent.get('*') ?? []),\n ...(this.handlersByEvent.get(event.name) ?? [])\n ];\n\n // Filter handlers based on scope\n const eligibleHandlers = allHandlers.filter(entry => {\n switch (entry.scope) {\n case 'global':\n // Global handlers always fire\n return true;\n case 'bubble':\n // Bubble handlers fire when owner is anywhere on stack\n return stackKeys.has(entry.ownerId);\n case 'active':\n default:\n // Active handlers only fire when owner is the current block\n return entry.ownerId === activeBlockKey;\n }\n });\n\n const actions = [] as import('../contracts/IRuntimeAction').IRuntimeAction[];\n\n for (const entry of eligibleHandlers) {\n try {\n const result = entry.handler.handler(event, runtime);\n if (result && result.length > 0) {\n actions.push(...result);\n }\n } catch (error) {\n console.error(`EventBus handler error for ${event.name}:`, error);\n }\n }\n\n // Log events that produce actions (skip no-op ticks)\n RuntimeLogger.logEvent(event, actions);\n\n return actions;\n }\n\n emit(event: IEvent, runtime: IScriptRuntime): void {\n runtime.handle(event);\n }\n\n /**\n * Dispose of all handlers and callbacks, releasing all references.\n */\n dispose(): void {\n this.handlersByEvent.clear();\n this.callbacksByEvent.clear();\n }\n}\n","import type { IRuntimeContext } from '../contracts/IRuntimeContext';\nimport { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { BlockLifecycleOptions } from '../contracts/IRuntimeBlock';\nimport { RuntimeBlock } from '../RuntimeBlock';\nimport { BlockContext } from '../BlockContext';\nimport { BlockKey } from '@bitcobblers/wod-wiki-core';\n\n// Aspect-based behaviors\nimport {\n CountupTimerBehavior,\n ChildSelectionBehavior,\n LabelingBehavior,\n ButtonBehavior,\n ReportOutputBehavior\n} from '../behaviors';\nimport { WaitingToStartInjectorBehavior } from '../behaviors/WaitingToStartInjectorBehavior';\n\n/**\n * Configuration for the session root block.\n */\nexport interface SessionRootConfig {\n /** Session label (e.g., \"Morning WOD\") */\n label?: string;\n /** Child statement ID groups to execute */\n childGroups: number[][];\n /** Total rounds for the workout (default: 1) */\n totalRounds?: number;\n}\n\n/**\n * SessionRootBlock is the top-level container for a workout session.\n *\n * ## Lifecycle\n *\n * 1. Mount: Emits 'segment' output with session label, starts elapsed timer,\n * pushes WaitingToStart block as first child (index 0)\n * 2. First next(): WaitingToStart pops → ChildRunner pushes first workout block\n * 3. Subsequent next(): ChildRunner pushes remaining workout blocks in sequence\n * 4. Final next(): All children done → marks complete and pops\n * 5. Pop: emits a 'segment' output carrying the completion reason, records history\n *\n * ## Behavior Chain Order\n *\n * Behaviors are order-independent for correctness. ChildSelectionBehavior\n * handles round advancement internally, and RuntimeBlock.next() auto-pops\n * when any behavior marks the block complete.\n *\n * - CountupTimerBehavior (elapsed workout timer)\n * - ChildSelectionBehavior (child dispatch + round init + advancement + safety net)\n * - WaitingToStartInjectorBehavior (pushes WaitingToStart gate on mount)\n * - ReportOutputBehavior (output on mount/unmount)\n * - LabelingBehavior (display)\n * - ButtonBehavior (controls)\n *\n * History persistence is the responsibility of the workbench — all data\n * needed for history is available in the output stream (ReportOutputBehavior).\n */\nexport class SessionRootBlock extends RuntimeBlock {\n constructor(\n runtime: IRuntimeContext,\n config: SessionRootConfig\n ) {\n const sessionLabel = config.label ?? 'Session';\n const blockKey = new BlockKey('session-root');\n const context = new BlockContext(runtime, blockKey.toString(), 'Session');\n\n const behaviors = SessionRootBlock.buildBehaviors(config, runtime);\n\n super({\n runtime,\n sourceIds: config.childGroups.flat(), // Flatten child groups to provide identity\n behaviors,\n context,\n key: blockKey,\n blockType: 'SessionRoot',\n label: sessionLabel,\n });\n }\n\n /**\n * Builds the behavior list for a session root block.\n * @param config Session configuration\n * @param runtime Script runtime (needed for WaitingToStartInjectorBehavior)\n */\n static buildBehaviors(config: SessionRootConfig, runtime: IRuntimeContext): IRuntimeBehavior[] {\n const behaviors: IRuntimeBehavior[] = [];\n const totalRounds = config.totalRounds ?? 1;\n const sessionLabel = config.label ?? 'Session';\n\n // ====================================================================\n // Time Aspect - Track total session elapsed time\n // ====================================================================\n behaviors.push(new CountupTimerBehavior({\n label: sessionLabel,\n role: 'auto'\n }));\n\n // =====================================================================\n // Children Aspect - Execute child blocks\n // skipOnMount: true because WaitingToStartInjectorBehavior handles\n // the first mount push. Child selection begins on the first onNext()\n // (triggered when WaitingToStart pops).\n // startRound/totalRounds: absorbed from ReEntryBehavior + RoundsEndBehavior.\n // =====================================================================\n behaviors.push(new ChildSelectionBehavior({\n childGroups: config.childGroups,\n loop: totalRounds > 1 ? { condition: 'rounds-remaining' } : false,\n skipOnMount: true,\n startRound: 1,\n totalRounds,\n }));\n\n // =====================================================================\n // Gate Aspect - WaitingToStart idle gate\n // Pushes a WaitingToStartBlock on mount. User must click \"Start\"\n // before ChildSelectionBehavior begins pushing workout children.\n // =====================================================================\n behaviors.push(new WaitingToStartInjectorBehavior(runtime));\n\n // =====================================================================\n // Output Aspect - Segment tracking\n // =====================================================================\n behaviors.push(new ReportOutputBehavior({ label: sessionLabel }));\n\n // =====================================================================\n // Display Aspect\n // =====================================================================\n behaviors.push(new LabelingBehavior({\n mode: 'clock',\n label: sessionLabel\n }));\n\n // =====================================================================\n // Controls Aspect - Session control buttons\n // =====================================================================\n behaviors.push(new ButtonBehavior({\n buttons: [\n {\n id: 'pause',\n label: 'Pause',\n variant: 'secondary' as const,\n visible: true,\n enabled: true,\n eventName: 'timer:pause'\n },\n {\n id: 'next',\n label: 'Next',\n variant: 'primary' as const,\n visible: true,\n enabled: true,\n eventName: 'next'\n },\n {\n id: 'stop',\n label: 'Stop',\n variant: 'danger' as const,\n visible: true,\n enabled: true,\n eventName: 'workout:stop'\n }\n ]\n }));\n\n return behaviors;\n }\n\n mount(runtime: IRuntimeContext, options?: BlockLifecycleOptions): IRuntimeAction[] {\n return super.mount(runtime, options);\n }\n\n unmount(runtime: IRuntimeContext, options?: BlockLifecycleOptions): IRuntimeAction[] {\n return super.unmount(runtime, options);\n }\n\n dispose(runtime: IRuntimeContext): void {\n super.dispose(runtime);\n if (this.context) {\n this.context.release();\n }\n }\n}\n","import { IRuntimeBlockStrategy } from '../../contracts/IRuntimeBlockStrategy';\nimport { IRuntimeBlock } from '../../contracts/IRuntimeBlock';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { BlockBuilder } from '../BlockBuilder';\nimport { SessionRootBlock, SessionRootConfig } from '../../blocks/SessionRootBlock';\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\n\n/**\n * SessionRootStrategy composes a SessionRootBlock for workout sessions.\n *\n * This is a direct-build strategy (match() returns false) — it is not\n * discovered by the JIT pipeline. Instead, it is invoked explicitly by\n * StartWorkoutAction or equivalent entry points.\n *\n * ## Responsibilities\n *\n * 1. Accept parsed CodeStatements representing a workout\n * 2. Extract section label from the first statement\n * 3. Build child groups from top-level statement IDs\n * 4. Create a SessionRootBlock that sequences:\n * - WaitingToStart (idle gate)\n * - Compiled child blocks (workout exercises)\n *\n * History persistence is delegated to the workbench layer — all data needed\n * is available in the output stream (ReportOutputBehavior completions).\n *\n * @see SessionRootBlock\n */\nexport class SessionRootStrategy implements IRuntimeBlockStrategy {\n priority = 100;\n readonly id = 'session-root';\n\n /**\n * Root blocks are not matched from statements — they are created directly.\n */\n match(_statements: ICodeStatement[], _runtime: IRuntimeContext): boolean {\n return false;\n }\n\n /**\n * Composable apply — not used for root blocks.\n */\n apply(_builder: BlockBuilder, _statements: ICodeStatement[], _runtime: IRuntimeContext): void {\n // No-op for direct build\n }\n\n /**\n * Builds a SessionRootBlock from a configuration.\n *\n * @param runtime - The script runtime context\n * @param config - Session root configuration with child groups and optional label/rounds\n * @returns A fully composed SessionRootBlock\n *\n * @example\n * ```typescript\n * const strategy = new SessionRootStrategy();\n * const root = strategy.build(runtime, {\n * childGroups: [[1], [2], [3]],\n * label: 'Morning WOD',\n * totalRounds: 1\n * });\n * ```\n */\n build(runtime: IRuntimeContext, config: SessionRootConfig): IRuntimeBlock {\n return new SessionRootBlock(runtime, config);\n }\n\n /**\n * Builds a SessionRootBlock from parsed workout statements.\n *\n * Convenience method that extracts child groups from top-level statements\n * and delegates to build().\n *\n * @param runtime - The script runtime context\n * @param statements - Parsed top-level workout statements\n * @param options - Optional overrides for label and total rounds\n * @returns A fully composed SessionRootBlock\n *\n * @example\n * ```typescript\n * const strategy = new SessionRootStrategy();\n * const root = strategy.buildFromStatements(runtime, statements, {\n * label: 'Grace',\n * totalRounds: 1\n * });\n * ```\n */\n buildFromStatements(\n runtime: IRuntimeContext,\n statements: ICodeStatement[],\n options?: { label?: string; totalRounds?: number }\n ): IRuntimeBlock {\n const childGroups = buildChildGroupsWithContext(statements);\n\n const config: SessionRootConfig = {\n childGroups,\n label: options?.label,\n totalRounds: options?.totalRounds\n };\n\n return this.build(runtime, config);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers for metric-context detection (exported for use in StartSessionAction)\n// ---------------------------------------------------------------------------\n\n/**\n * Returns true if the statement carries only metric context (resistance/distance)\n * with no effort, timer, rounds, or children — indicating it should cascade its\n * metrics into the immediately following group/loop statement.\n */\nexport function isMetricContextStatement(stmt: ICodeStatement): boolean {\n const metrics = stmt.metrics;\n return (\n (!stmt.children || stmt.children.length === 0) &&\n !metrics.some(m => m.type === MetricType.Effort) &&\n !metrics.some(m => m.type === MetricType.Duration) &&\n !metrics.some(m => m.type === MetricType.Rounds) &&\n !metrics.some(m => m.type === MetricType.Rep) &&\n metrics.some(m => m.type === MetricType.Resistance || m.type === MetricType.Distance)\n );\n}\n\n/**\n * Returns true if the statement represents a group-like block (has children,\n * rounds, or duration) that can accept metric promotions from a context statement.\n */\nexport function isGroupStatement(stmt: ICodeStatement): boolean {\n return (\n (!!stmt.children && stmt.children.length > 0) ||\n stmt.metrics.some(m => m.type === MetricType.Rounds) ||\n stmt.metrics.some(m => m.type === MetricType.Duration)\n );\n}\n\n/**\n * Builds child groups from an ordered list of top-level statements, merging\n * standalone metric-context statements (e.g. \"95 lb\", \"400 m\") with the\n * immediately following group/loop statement so those metrics cascade to\n * the group's children via MetricPromotionBehavior.\n */\nexport function buildChildGroupsWithContext(statements: ICodeStatement[]): number[][] {\n const childGroups: number[][] = [];\n let i = 0;\n while (i < statements.length) {\n const current = statements[i];\n if (isMetricContextStatement(current) && i + 1 < statements.length) {\n const next = statements[i + 1];\n if (isGroupStatement(next)) {\n // Merge: put the group stmt first so statements[0].children is valid\n childGroups.push([next.id as number, current.id as number]);\n i += 2;\n continue;\n }\n }\n childGroups.push([current.id as number]);\n i++;\n }\n return childGroups;\n}\n","import { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\nimport { BlockLifecycleOptions } from '../../contracts/IRuntimeBlock';\nimport { SessionRootStrategy, buildChildGroupsWithContext } from '../../compiler/strategies/SessionRootStrategy';\nimport { SessionRootConfig } from '../../blocks/SessionRootBlock';\nimport { PushBlockAction } from './PushBlockAction';\n\n/**\n * Configuration for starting a session-based workout.\n */\nexport interface StartSessionOptions {\n /** Display label for the session (e.g., \"Grace\", \"Cindy\") */\n label?: string;\n /** Total rounds for the session (default: 1) */\n totalRounds?: number;\n /** Optional lifecycle options for the root block */\n lifecycle?: BlockLifecycleOptions;\n}\n\n/**\n * Action that initializes a workout using the SessionRootBlock.\n *\n * Uses SessionRootStrategy to create a SessionRootBlock with proper behavior composition:\n *\n * - ReportOutputBehavior (emits segment/completion outputs — source of truth for history)\n * - CountupTimerBehavior (countup for total elapsed time)\n * - ChildSelectionBehavior (sequences WaitingToStart + children)\n *\n * History persistence is the responsibility of the workbench layer,\n * which subscribes to the output stream.\n *\n * @see SessionRootStrategy\n * @see SessionRootBlock\n */\nexport class StartSessionAction implements IRuntimeAction {\n readonly type = 'start-session';\n\n constructor(private readonly options: StartSessionOptions = {}) {}\n\n do(runtime: IRuntimeContext): IRuntimeAction[] {\n // Guard: Check if workout already started\n if (runtime.stack.count > 0) {\n console.warn('[StartSessionAction] Session already started - stack is not empty');\n return [];\n }\n\n // Guard: Check for statements\n const statements = runtime.script?.statements;\n if (!statements || statements.length === 0) {\n console.warn('[StartSessionAction] No statements in script to start');\n return [];\n }\n\n // Build child groups: only include TOP-LEVEL statements.\n // The parser lists ALL statements flat (parents and children).\n // We filter to statements that are NOT children of any other statement.\n // Note: children is number[][] (groups of statement IDs).\n const childStatementIds = new Set<number>();\n for (const s of statements) {\n if (s.children) {\n for (const childGroup of s.children) {\n for (const childId of childGroup) {\n childStatementIds.add(childId);\n }\n }\n }\n }\n const topLevelStatements = statements.filter(s => !childStatementIds.has(s.id));\n const childGroups = buildChildGroupsWithContext(topLevelStatements);\n\n // Build session root configuration\n const config: SessionRootConfig = {\n childGroups,\n label: this.options.label,\n totalRounds: this.options.totalRounds,\n };\n\n // Direct-build: SessionRootStrategy is invoked by class here, not via JitCompiler.compile()\n const strategy = new SessionRootStrategy();\n const rootBlock = strategy.build(runtime, config);\n\n // Build lifecycle options with start time\n const lifecycle: BlockLifecycleOptions = {\n startTime: runtime.clock.currentDate,\n ...this.options.lifecycle\n };\n\n // Push root block\n return [new PushBlockAction(rootBlock, lifecycle)];\n }\n}\n","import { IAnalyticsEngine } from './contracts/IAnalyticsEngine';\nimport type { IRealtimeProcessor } from './IRealtimeProcessor';\nimport type { ISummaryProcessor } from './ISummaryProcessor';\nimport { IOutputStatement, OutputStatement } from '@bitcobblers/wod-wiki-core';\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { ProjectionResult } from './ProjectionResult';\n\nexport class AnalyticsEngine implements IAnalyticsEngine {\n private realtimeProcessors: IRealtimeProcessor[] = [];\n private summaryProcessors: ISummaryProcessor[] = [];\n private outputHistory: IOutputStatement[] = [];\n /** Emits a live 'analytics' snapshot per segment so the UI updates in real time. */\n private _onLiveOutput?: (outputs: IOutputStatement[]) => void;\n /**\n * Signature of the last live projection emission. Used by finalize() to avoid\n * re-emitting the same projections at session end. Timestamps are ignored.\n */\n private _lastLiveProjectionSignature?: string;\n\n /**\n * Wire a sink for live analytics outputs. The sink receives the FULL\n * projection snapshot (a replaceable, ephemeral set) each time projections\n * change — not appended one-at-a-time. The snapshot is display-only; it must\n * not be persisted. Persistence happens once via {@link finalize}.\n */\n setLiveOutputEmitter(emit: (outputs: IOutputStatement[]) => void): void {\n this._onLiveOutput = emit;\n }\n\n addRealtimeProcessor(processor: IRealtimeProcessor): void {\n this.realtimeProcessors.push(processor);\n }\n\n addSummaryProcessor(processor: ISummaryProcessor): void {\n this.summaryProcessors.push(processor);\n }\n\n run(output: IOutputStatement): IOutputStatement {\n // Phase 1: realtime enrichment — per-segment metric derivation\n let current = output;\n for (const processor of this.realtimeProcessors) {\n try {\n current = processor.process(current);\n } catch (err) {\n console.error(`[AnalyticsEngine] realtime error in '${processor.id}':`, err);\n }\n }\n\n // Accumulate segment outputs for summary processors, and emit a live\n // 'analytics' output so session-totals reach the UI over the output stream\n // (no separate tracker channel). Bounded recursion: the emitted 'analytics'\n // output is not a 'segment', so re-entering run() does not re-trigger this.\n if (current.outputType === 'segment') {\n this.outputHistory.push(current);\n if (this._onLiveOutput) {\n const now = Date.now();\n const projections = this._runSummaries();\n const signature = this._projectionSignature(projections);\n // Skip emission when the projections carry no new information — e.g.\n // several blocks popping at completion each trigger run() with\n // identical aggregates, producing byte-identical same-ms rows.\n if (signature !== this._lastLiveProjectionSignature) {\n this._lastLiveProjectionSignature = signature;\n const liveOutputs = this._buildProjectionOutputs(projections, now);\n this._onLiveOutput(liveOutputs);\n }\n }\n }\n\n return current;\n }\n\n finalize(): IOutputStatement[] {\n const projections = this._runSummaries();\n const outputs = this._buildProjectionOutputs(projections, Date.now());\n const signature = this._projectionSignature(projections);\n if (this._lastLiveProjectionSignature !== undefined && this._lastLiveProjectionSignature === signature) {\n return [];\n }\n return outputs;\n }\n\n /**\n * Identity of a projection set for dedupe — which fields make two emission\n * sets 'the same'. Timestamps are intentionally ignored; display/fact\n * layers have their own keys (see getAnalyticsFromLogs and\n * normalizeSummaryFacts).\n */\n private _projectionSignature(projections: ProjectionResult[]): string {\n return JSON.stringify(\n projections.map((p) => ({ name: p.name, value: p.value, unit: p.unit, metricType: p.metricType })),\n );\n }\n\n /** Build one 'analytics' OutputStatement per summary projection. */\n private _buildProjectionOutputs(projections: ProjectionResult[], now: number): IOutputStatement[] {\n return projections.map(p => {\n const metrics = MetricContainer.empty(`projection-${p.name}`).add(\n {\n type: MetricType.Label,\n image: p.name,\n value: p.name,\n origin: p.origin ?? 'analyzed',\n timestamp: new Date(now),\n },\n // Projection value metric — carries the processor's derivation\n // metadata (effortSlug/discipline/…) through to stored logs.\n {\n type: (p.metricType as MetricType) || MetricType.Metric,\n image: `${p.value} ${p.unit}`,\n value: p.value,\n unit: p.unit,\n origin: p.origin ?? 'analyzed',\n timestamp: new Date(now),\n ...(p.metadata ? { metadata: p.metadata } : {}),\n }\n );\n return new OutputStatement({\n outputType: 'analytics',\n timeSpan: { started: now, ended: now },\n sourceBlockKey: 'analytics-summary',\n stackLevel: 0,\n metrics,\n });\n });\n }\n\n /** Run all summary processors over current output history. */\n private _runSummaries(): ProjectionResult[] {\n const results: ProjectionResult[] = [];\n for (const processor of this.summaryProcessors) {\n try {\n results.push(...processor.summarize(this.outputHistory));\n } catch (err) {\n console.error(`[AnalyticsEngine] summary error in '${processor.id}':`, err);\n }\n }\n return results;\n }\n}\n","import { IRealtimeProcessor } from './IRealtimeProcessor';\nimport { IOutputStatement } from '@bitcobblers/wod-wiki-core';\nimport { MetricType, MetricOrigin } from '@bitcobblers/wod-wiki-core';\nimport type { IEffortResolver, IEffort, ResolvedEffort } from '../effort-registry/types';\nimport { EFFORT_DATA_METRIC_TYPE } from './effortResolution';\n\n/**\n * Two-Pass Effort Resolution — Realtime Processor\n *\n * Pass 1 (compile-time recovery):\n * Output statements that carry an effort metric with `origin: 'compiler'`\n * are treated as already-canonical. The processor looks them up by\n * slug/alias and attaches the full {@link IEffort} record.\n *\n * Pass 2 (analytics-time fuzzy recovery):\n * Output statements with free-form effort or action text get resolved\n * through fuzzy alias matching. A successful match attaches the effort\n * with `origin: 'analyzed'`; a synthetic fallback attaches it with\n * `origin: 'analyzed-estimated'`.\n *\n * The resolved effort is stored as a metric of type `'effort-data'` so\n * downstream summary processors can consume it without importing the\n * registry directly.\n *\n * @see docs/adr/effort-resolution-compile-time.md\n */\nexport class TwoPassEffortResolutionProcess implements IRealtimeProcessor {\n public readonly id = 'two-pass-effort-resolution';\n public readonly fenceTypes = ['time', 'log'] as const;\n\n constructor(private readonly resolver: IEffortResolver) {}\n\n process(output: IOutputStatement): IOutputStatement {\n const effortMetric = output.getMetric(MetricType.Effort);\n const actionMetric = output.getMetric(MetricType.Action);\n\n let label: string | undefined;\n let passOrigin: MetricOrigin = 'analyzed';\n\n // Prefer explicit Effort metric, fall back to Action metric\n if (effortMetric && typeof effortMetric.value === 'string') {\n label = effortMetric.value;\n passOrigin = effortMetric.origin === 'compiler' ? 'compiler' : 'analyzed';\n } else if (actionMetric && typeof actionMetric.value === 'string') {\n label = actionMetric.value;\n passOrigin = 'analyzed';\n }\n\n if (!label) return output;\n\n const { resolved, finalOrigin } = this.resolve(label, passOrigin);\n\n const effortDataMetric = {\n type: EFFORT_DATA_METRIC_TYPE,\n image: resolved.label,\n value: resolved,\n origin: finalOrigin,\n timestamp: new Date(),\n };\n\n // Insert effort-data right after the triggering effort/action metric\n // so downstream processors see it before elapsed metrics.\n const original = output.metrics.toArray();\n const reordered: typeof original = [];\n let inserted = false;\n for (const m of original) {\n reordered.push(m);\n if (!inserted && (m.type === MetricType.Effort || m.type === MetricType.Action)) {\n reordered.push(effortDataMetric);\n inserted = true;\n }\n }\n if (!inserted) reordered.push(effortDataMetric);\n\n output.metrics.clear();\n for (const m of reordered) {\n output.metrics.add(m);\n }\n\n return output;\n }\n\n private resolve(\n label: string,\n passOrigin: MetricOrigin,\n ): { resolved: ResolvedEffort; finalOrigin: MetricOrigin } {\n let effort: IEffort | null;\n\n if (passOrigin === 'compiler') {\n // Pass 1: compiler-resolved — try exact slug/alias first\n effort = this.resolver.resolveBySlug(label) ?? this.resolver.resolveByAlias(label);\n if (effort) {\n return { resolved: this.resolver.resolveDefinition(effort), finalOrigin: 'compiler' };\n }\n // Compiler claimed it but we can't find it — fall through to fuzzy\n }\n\n // Pass 2: fuzzy recovery (always returns an effort, never null)\n const resolved = this.resolver.resolveEffort(label);\n\n const finalOrigin: MetricOrigin = resolved.isEstimated ? 'analyzed-estimated' : 'analyzed';\n\n return { resolved, finalOrigin };\n }\n}\n","/**\n * Exponent-vector dimension model for the composed calculations layer.\n *\n * Dimensions are 5-element exponent vectors over base physical quantities:\n * [L, M, T, C, E] = [length, mass, time, count(reps), energy(cal)]\n *\n * Algebra (docs/composed-calculations-spec.md §5.1):\n * Dim(a * b) = Dim(a) + Dim(b)\n * Dim(a / b) = Dim(a) − Dim(b)\n * Dim(a ± b) requires Dim(a) = Dim(b) (static registration failure otherwise)\n */\n\nexport type DimVector = readonly [number, number, number, number, number];\n\nexport const DIM_ZERO: DimVector = [0, 0, 0, 0, 0];\nexport const DIM_LENGTH: DimVector = [1, 0, 0, 0, 0];\nexport const DIM_MASS: DimVector = [0, 1, 0, 0, 0];\nexport const DIM_TIME: DimVector = [0, 0, 1, 0, 0];\nexport const DIM_COUNT: DimVector = [0, 0, 0, 1, 0];\nexport const DIM_ENERGY: DimVector = [0, 0, 0, 0, 1];\n\nexport function addDim(a: DimVector, b: DimVector): DimVector {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2], a[3] + b[3], a[4] + b[4]];\n}\n\nexport function subDim(a: DimVector, b: DimVector): DimVector {\n return [a[0] - b[0], a[1] - b[1], a[2] - b[2], a[3] - b[3], a[4] - b[4]];\n}\n\nexport function dimEquals(a: DimVector, b: DimVector): boolean {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4];\n}\n\nexport function isDimensionless(d: DimVector): boolean {\n return dimEquals(d, DIM_ZERO);\n}\n\nconst AXIS_NAMES = ['L', 'M', 'T', 'C', 'E'] as const;\n\n/** Human-readable vector, e.g. \"T·L⁻¹\" for pace. */\nexport function formatDim(d: DimVector): string {\n if (isDimensionless(d)) return 'dimensionless';\n const parts: string[] = [];\n for (let i = 0; i < 5; i++) {\n const e = d[i];\n if (e === 0) continue;\n parts.push(e === 1 ? AXIS_NAMES[i] : `${AXIS_NAMES[i]}^${e}`);\n }\n return parts.join('·');\n}\n\n/**\n * Named compound dimension registry (spec §5.2). Used for diagnostics and\n * dimension-filtered unit suggestions — not required for evaluation.\n */\nexport const NAMED_COMPOUNDS: Record<string, { dim: DimVector; preferredUnits: string[] }> = {\n pace: { dim: [-1, 0, 1, 0, 0], preferredUnits: ['min/km', 'sec/km', 'min/mi'] },\n speed: { dim: [1, 0, -1, 0, 0], preferredUnits: ['m/s', 'km/h'] },\n volume: { dim: [0, 1, 0, 1, 0], preferredUnits: ['kg', 'lb'] },\n power: { dim: [0, 1, -1, 1, 0], preferredUnits: ['kg/s', 'lb/s'] },\n time: { dim: DIM_TIME, preferredUnits: ['min', 's', 'h'] },\n mass: { dim: DIM_MASS, preferredUnits: ['kg', 'lb'] },\n length: { dim: DIM_LENGTH, preferredUnits: ['m', 'km', 'mi'] },\n count: { dim: DIM_COUNT, preferredUnits: ['reps'] },\n energy: { dim: DIM_ENERGY, preferredUnits: ['cal', 'kcal'] },\n dimensionless: { dim: DIM_ZERO, preferredUnits: ['pts', 'AU', 'MET', 'ratio'] },\n};\n\n/** Reverse lookup: find the compound name for a vector, if one exists. */\nexport function compoundName(d: DimVector): string | undefined {\n for (const [name, def] of Object.entries(NAMED_COMPOUNDS)) {\n if (dimEquals(def.dim, d)) return name;\n }\n return undefined;\n}\n","/**\n * Known atom vocabulary for the composed calculations layer.\n *\n * Stream atoms name metrics on the log stream that aggregates scan\n * (`sum(metMinutes)` reads `metMinutes` segment annotations). Context atoms\n * are engine-provided nodes (`session.duration`, `effort`, …). Registration\n * uses these tables for static dimension checking; evaluation uses them to\n * resolve refs and stamp units.\n */\n\nimport { DimVector, DIM_ZERO, DIM_TIME, DIM_LENGTH, DIM_MASS, DIM_COUNT } from './dimensions';\n\nexport interface StreamAtomDef {\n dim: DimVector;\n /** Metric type scanned on the log stream. */\n metricType: string;\n /** Unit stamped on aggregate values (last-seen source unit wins for distance/volume). */\n unit?: string;\n}\n\nexport const STREAM_ATOMS: Record<string, StreamAtomDef> = {\n reps: { dim: DIM_COUNT, metricType: 'rep', unit: 'reps' },\n elapsed: { dim: DIM_TIME, metricType: 'elapsed', unit: 'ms' },\n distance: { dim: DIM_LENGTH, metricType: 'distance', unit: 'm' },\n resistance: { dim: DIM_MASS, metricType: 'resistance', unit: 'kg' },\n segmentVolume: { dim: [0, 1, 0, 1, 0], metricType: 'segmentVolume', unit: 'kg' },\n metMinutes: { dim: DIM_TIME, metricType: 'metMinutes', unit: 'min' },\n effortRpe: { dim: DIM_ZERO, metricType: 'effortRpe' },\n metMinutesEstimated: { dim: DIM_ZERO, metricType: 'metMinutesEstimated' },\n sessionRpe: { dim: DIM_ZERO, metricType: 'session-rpe' },\n // Climb: send presence (count dim) + grade (dimensionless label).\n climbSend: { dim: DIM_COUNT, metricType: 'climb-send-type', unit: 'count' },\n climbGrade: { dim: DIM_ZERO, metricType: 'climb-grade' },\n};\n\n/** Engine-provided context nodes (both scopes, where meaningful). */\nexport const CONTEXT_ATOMS: Record<string, DimVector> = {\n effort: DIM_ZERO,\n effortLabel: DIM_ZERO,\n sessionRpe: DIM_ZERO,\n 'session.duration': DIM_TIME,\n 'profile.vo2max': DIM_ZERO,\n};\n\n/** Stream aggregate builtins (workout scope). `count` is dimensionless. */\nexport const AGGREGATE_BUILTINS: Record<string, true> = {\n sum: true,\n max: true,\n min: true,\n avg: true,\n count: true,\n last: true,\n};\n","/**\n * Unit registry for the composed calculations layer.\n *\n * Every unit maps to a dimension vector plus a conversion factor to the\n * vector's canonical base unit (ms, m, kg, reps, cal, and products thereof).\n * `convert(x, u)` is vector-checked: source and target vectors must match,\n * then the scalar rescales by `factor(from) / factor(to)`.\n *\n * Named zero-vector units (AU, pts, MET-min, ratio) are **authoritative\n * casts** (spec §5.3): declaring them as an output unit overrides the\n * computed vector instead of failing validation.\n */\n\nimport { DimVector, DIM_ZERO, DIM_TIME, DIM_LENGTH, DIM_MASS, DIM_COUNT, DIM_ENERGY, dimEquals } from './dimensions';\n\nexport interface UnitDef {\n readonly dim: DimVector;\n /** Multiply a value in this unit by `factor` to get the base-unit value. */\n readonly factor: number;\n}\n\nexport const AUTHORITATIVE_CASTS: Record<string, true> = { AU: true, pts: true, 'MET-min': true, ratio: true };\n\nconst KG_PER_LB = 0.45359237;\nconst M_PER_MI = 1609.344;\n\nexport const UNITS: Record<string, UnitDef> = {\n // time — base ms\n ms: { dim: DIM_TIME, factor: 1 },\n s: { dim: DIM_TIME, factor: 1000 },\n sec: { dim: DIM_TIME, factor: 1000 },\n min: { dim: DIM_TIME, factor: 60_000 },\n h: { dim: DIM_TIME, factor: 3_600_000 },\n hr: { dim: DIM_TIME, factor: 3_600_000 },\n // length — base m\n m: { dim: DIM_LENGTH, factor: 1 },\n km: { dim: DIM_LENGTH, factor: 1000 },\n mi: { dim: DIM_LENGTH, factor: M_PER_MI },\n // mass — base kg\n kg: { dim: DIM_MASS, factor: 1 },\n lb: { dim: DIM_MASS, factor: KG_PER_LB },\n lbs: { dim: DIM_MASS, factor: KG_PER_LB },\n // count — base reps\n rep: { dim: DIM_COUNT, factor: 1 },\n reps: { dim: DIM_COUNT, factor: 1 },\n // energy — base cal\n cal: { dim: DIM_ENERGY, factor: 1 },\n kcal: { dim: DIM_ENERGY, factor: 1000 },\n // dimensionless\n MET: { dim: DIM_ZERO, factor: 1 },\n // resilience / score display units — DIM_ZERO keep the store-scope\n // (dimensionless) series valid; 'count' is genuinely count-dimensioned\n // (sends, sessions) so segment facts can carry it.\n '%': { dim: DIM_ZERO, factor: 1 },\n rating: { dim: DIM_ZERO, factor: 1 },\n bpm: { dim: DIM_ZERO, factor: 1 },\n count: { dim: DIM_COUNT, factor: 1 },\n // speed — base m/ms\n 'm/s': { dim: [1, 0, -1, 0, 0], factor: 0.001 },\n 'km/h': { dim: [1, 0, -1, 0, 0], factor: 1000 / 3_600_000 },\n // pace — base ms/m\n 'sec/km': { dim: [-1, 0, 1, 0, 0], factor: 1 },\n 'min/km': { dim: [-1, 0, 1, 0, 0], factor: 60 },\n 'min/mi': { dim: [-1, 0, 1, 0, 0], factor: 60_000 / M_PER_MI },\n // rep rate — base reps/ms\n 'reps/min': { dim: [0, 0, -1, 1, 0], factor: 1 / 60_000 },\n // power — base kg·reps/ms\n 'kg/s': { dim: [0, 1, -1, 1, 0], factor: 0.001 },\n 'lb/s': { dim: [0, 1, -1, 1, 0], factor: KG_PER_LB / 1000 },\n};\n\n/** Authoritative casts are also valid output units (zero-vector override). */\nexport function getUnit(name: string): UnitDef | undefined {\n const def = UNITS[name];\n if (def) return def;\n if (AUTHORITATIVE_CASTS[name]) return { dim: DIM_ZERO, factor: 1 };\n return undefined;\n}\n\n/**\n * Convert a scalar between units. Vectors must match (static checking catches\n * mismatches at registration; this is the runtime guard). A value with no\n * recorded unit is treated as already being in the vector's base unit.\n */\nexport function convertScalar(value: number, fromUnit: string | undefined, toUnit: string): number {\n const to = UNITS[toUnit];\n if (!to) throw new CalcUnitError(`Unknown unit: ${toUnit}`);\n if (!fromUnit) return value / to.factor;\n const from = UNITS[fromUnit];\n if (!from) throw new CalcUnitError(`Unknown unit: ${fromUnit}`);\n if (!dimEquals(from.dim, to.dim)) {\n throw new CalcUnitError(`Cannot convert from ${fromUnit} to ${toUnit}: dimension mismatch`);\n }\n return (value * from.factor) / to.factor;\n}\n\nexport class CalcUnitError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CalcUnitError';\n }\n}\n\n/**\n * Compose units through `*`. Dimensionless sides contribute nothing; count\n * units (`reps`) drop when any non-count unit is present — the domain\n * convention behind `kg` (volume) and `kg/s` (power) rather than `kg·reps`.\n */\nexport function composeMulUnit(a: string | undefined, aDim: DimVector, b: string | undefined, bDim: DimVector, resultDim: DimVector): string | undefined {\n if (dimEquals(resultDim, DIM_ZERO)) return undefined;\n const parts: string[] = [];\n for (const [u, d] of [[a, aDim], [b, bDim]] as const) {\n if (!u || dimEquals(d, DIM_ZERO)) continue;\n parts.push(u);\n }\n const nonCount = parts.filter((u) => !dimEquals(UNITS[u]?.dim ?? DIM_ZERO, DIM_COUNT));\n const kept = nonCount.length > 0 ? nonCount : parts;\n return kept.length > 0 ? kept.join('·') : undefined;\n}\n\n/** Compose units through `/` (`m` ÷ `s` → `m/s`). */\nexport function composeDivUnit(a: string | undefined, b: string | undefined, bDim: DimVector, resultDim: DimVector): string | undefined {\n if (dimEquals(resultDim, DIM_ZERO)) return undefined;\n if (!b || dimEquals(bDim, DIM_ZERO)) return a;\n if (!a) return undefined;\n return `${a}/${b}`;\n}\n","/**\n * Dimension-aware value model for calc evaluation.\n *\n * Numbers carry a dimension vector and (optionally) the unit they were\n * measured in; arithmetic tracks vectors per spec §5.1. `absent` is the\n * missing-data value: it propagates through arithmetic, reads as `false` in\n * predicates (applicability decision, #848), and is what `has()` probes.\n */\n\nimport { DimVector, DIM_ZERO } from './dimensions';\n\nexport type Val =\n | { kind: 'number'; value: number; dim: DimVector; unit?: string }\n | { kind: 'string'; value: string }\n | { kind: 'series'; points: Map<number, number>; dim: DimVector; unit?: string }\n | { kind: 'period'; days: number }\n | { kind: 'absent' };\n\nexport const ABSENT: Val = { kind: 'absent' };\n\nexport function num(value: number, dim: DimVector = DIM_ZERO, unit?: string): Val {\n return { kind: 'number', value, dim, unit };\n}\n\nexport function str(value: string): Val {\n return { kind: 'string', value };\n}\n\n/** Predicate truthiness: absent → false; numbers → ≠ 0; strings → non-empty. */\nexport function truthy(v: Val): boolean {\n if (v.kind === 'number') return v.value !== 0;\n if (v.kind === 'string') return v.value.length > 0;\n if (v.kind === 'series') return v.points.size > 0;\n if (v.kind === 'period') return v.days > 0;\n return false;\n}\n","/**\n * Expression evaluator for the composed calculations layer.\n *\n * The core owns arithmetic, comparison/logic, and the scalar function table\n * (min, max, abs, round, floor, ceil, clamp, convert, has). Everything\n * scope-dependent — metric refs, context nodes, stream aggregates, lookup(),\n * WQL atoms — resolves through the EvalContext, so the same evaluator serves\n * segment, workout, and store scopes (spec §3.1).\n */\n\nimport { ExprNode } from './ast';\nimport { addDim, subDim, dimEquals, formatDim, DIM_ZERO } from './dimensions';\nimport { convertScalar, UNITS, composeMulUnit, composeDivUnit } from './units';\nimport { ABSENT, num, str, truthy, Val } from './values';\n\nexport class CalcEvalError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CalcEvalError';\n }\n}\n\nexport interface EvalContext {\n /** Resolve a ref atom (metric, context node, library node). ABSENT when missing. */\n resolveRef(name: string): Val;\n /**\n * Extension functions (stream aggregates, lookup). Receives evaluated args\n * plus the raw arg nodes (aggregates need the filter node unevaluated).\n * Return undefined to signal \"not mine\" → CalcEvalError.\n */\n callFunction?(name: string, args: Val[], rawArgs: ExprNode[]): Val | undefined;\n /** Store-scope WQL selections (QueryService). Store scope only. */\n resolveWql?(node: Extract<ExprNode, { kind: 'wql' }>): Val;\n}\n\nexport function evaluate(node: ExprNode, ctx: EvalContext): Val {\n switch (node.kind) {\n case 'literal':\n return num(node.value);\n case 'period':\n return { kind: 'period', days: node.days };\n case 'string':\n return str(node.value);\n case 'ref':\n return ctx.resolveRef(node.name);\n case 'filter':\n throw new CalcEvalError('Exclusion filter is only valid as an aggregate argument');\n case 'wql':\n if (!ctx.resolveWql) throw new CalcEvalError(`WQL atom ${node.aggregator}:${node.metric} is store-scope only`);\n return ctx.resolveWql(node);\n case 'unary': {\n const v = evaluate(node.arg, ctx);\n if (node.op === 'not') return num(truthy(v) ? 0 : 1);\n if (v.kind === 'absent') return ABSENT;\n if (v.kind !== 'number') throw new CalcEvalError('Unary minus requires a number');\n return num(-v.value, v.dim, v.unit);\n }\n case 'binary':\n return evalBinary(node, ctx);\n case 'call':\n return evalCall(node, ctx);\n }\n}\n\nfunction evalBinary(node: Extract<ExprNode, { kind: 'binary' }>, ctx: EvalContext): Val {\n const { op } = node;\n if (op === 'and') {\n const l = evaluate(node.left, ctx);\n if (!truthy(l)) return num(0);\n return num(truthy(evaluate(node.right, ctx)) ? 1 : 0);\n }\n if (op === 'or') {\n const l = evaluate(node.left, ctx);\n if (truthy(l)) return num(1);\n return num(truthy(evaluate(node.right, ctx)) ? 1 : 0);\n }\n const l = evaluate(node.left, ctx);\n const r = evaluate(node.right, ctx);\n\n if (l.kind === 'series' || r.kind === 'series') {\n return seriesBinary(op, l, r);\n }\n\n if (op === '==' || op === '!=') {\n const eq = valuesEqual(l, r);\n return num(op === '==' ? (eq ? 1 : 0) : eq ? 0 : 1);\n }\n if (l.kind === 'absent' || r.kind === 'absent') {\n // Missing data: comparisons are false (#848), arithmetic stays absent.\n if (op === '<' || op === '<=' || op === '>' || op === '>=') return num(0);\n return ABSENT;\n }\n if (l.kind !== 'number' || r.kind !== 'number') {\n throw new CalcEvalError(`Operator '${op}' requires numbers`);\n }\n switch (op) {\n case '+':\n case '-': {\n if (!dimEquals(l.dim, r.dim)) {\n throw new CalcEvalError(`Dimension mismatch for '${op}': ${formatDim(l.dim)} vs ${formatDim(r.dim)}`);\n }\n return num(op === '+' ? l.value + r.value : l.value - r.value, l.dim, l.unit ?? r.unit);\n }\n case '*': {\n const dim = addDim(l.dim, r.dim);\n return num(l.value * r.value, dim, composeMulUnit(l.unit, l.dim, r.unit, r.dim, dim));\n }\n case '/': {\n if (r.value === 0) return ABSENT;\n const dim = subDim(l.dim, r.dim);\n return num(l.value / r.value, dim, composeDivUnit(l.unit, r.unit, r.dim, dim));\n }\n case '<': return num(baseValue(l) < baseValue(r) ? 1 : 0);\n case '<=': return num(baseValue(l) <= baseValue(r) ? 1 : 0);\n case '>': return num(baseValue(l) > baseValue(r) ? 1 : 0);\n case '>=': return num(baseValue(l) >= baseValue(r) ? 1 : 0);\n }\n}\n\n/**\n * Pointwise series arithmetic (spec §3.2). Binary ops iterate the left\n * operand's day domain: a missing right point (or a zero divisor) suppresses\n * the point — that's how ACWR vanishes while chronic = 0. Scalar operands\n * broadcast across every point.\n */\nfunction seriesBinary(op: string, l: Val, r: Val): Val {\n if (op === 'and' || op === 'or' || op === '==' || op === '!=' || op === '<' || op === '<=' || op === '>' || op === '>=') {\n throw new CalcEvalError(`Operator '${op}' is not defined on series`);\n }\n if (l.kind === 'absent' || r.kind === 'absent') return ABSENT;\n const lSeries = l.kind === 'series' ? l : undefined;\n const rSeries = r.kind === 'series' ? r : undefined;\n const scalarOf = (v: Val): number | undefined => (v.kind === 'number' ? v.value : undefined);\n if (!lSeries && scalarOf(l) === undefined) throw new CalcEvalError(`Operator '${op}' requires numbers or series`);\n if (!rSeries && scalarOf(r) === undefined) throw new CalcEvalError(`Operator '${op}' requires numbers or series`);\n\n const lNum = scalarOf(l);\n const rNum = scalarOf(r);\n const lDim = l.kind === 'number' || l.kind === 'series' ? l.dim : undefined;\n const rDim = r.kind === 'number' || r.kind === 'series' ? r.dim : undefined;\n if ((op === '+' || op === '-') && lDim && rDim && !dimEquals(lDim, rDim)) {\n throw new CalcEvalError(`Dimension mismatch for '${op}': ${formatDim(lDim)} vs ${formatDim(rDim)}`);\n }\n const resultDim =\n op === '*' ? addDim(lDim ?? DIM_ZERO, rDim ?? DIM_ZERO)\n : op === '/' ? subDim(lDim ?? DIM_ZERO, rDim ?? DIM_ZERO)\n : (lDim ?? rDim ?? DIM_ZERO);\n\n const apply = (a: number, b: number): number | undefined => {\n switch (op) {\n case '+': return a + b;\n case '-': return a - b;\n case '*': return a * b;\n case '/': return b === 0 ? undefined : a / b;\n default: return undefined;\n }\n };\n\n const points = new Map<number, number>();\n const domain = lSeries ?? rSeries!;\n for (const [day, lv] of domain.points) {\n const a = lSeries ? lv : lNum!;\n const b = rSeries ? rSeries.points.get(day) : rNum!;\n if (b === undefined) continue;\n const value = apply(a, b);\n if (value !== undefined && Number.isFinite(value)) points.set(day, value);\n }\n return { kind: 'series', points, dim: resultDim };\n}\n\nfunction valuesEqual(l: Val, r: Val): boolean {\n if (l.kind === 'absent' || r.kind === 'absent') return l.kind === r.kind;\n if (l.kind === 'string' || r.kind === 'string') {\n return l.kind === 'string' && r.kind === 'string' && l.value === r.value;\n }\n if (l.kind !== 'number' || r.kind !== 'number') return l.kind === r.kind;\n if (!dimEquals(l.dim, r.dim)) return false;\n return baseValue(l) === baseValue(r);\n}\n\n/** Scalar in the vector's base unit, so `90 s` compares correctly to `1.5 min`. */\nfunction baseValue(v: Extract<Val, { kind: 'number' }>): number {\n if (!v.unit) return v.value;\n const def = UNITS[v.unit];\n return def ? v.value * def.factor : v.value;\n}\n\nfunction evalCall(node: Extract<ExprNode, { kind: 'call' }>, ctx: EvalContext): Val {\n const { name, args } = node;\n\n if (name === 'has') {\n if (args.length !== 1) throw new CalcEvalError('has() takes one argument');\n const v = evaluate(args[0], ctx);\n return num(v.kind === 'absent' ? 0 : 1);\n }\n if (name === 'convert') {\n if (args.length !== 2) throw new CalcEvalError('convert() takes (value, targetUnit)');\n const target = unitArg(args[1]);\n const v = evaluate(args[0], ctx);\n if (v.kind === 'absent') return ABSENT;\n if (v.kind !== 'number') throw new CalcEvalError('convert() requires a number');\n const to = UNITS[target];\n if (!to) throw new CalcEvalError(`Unknown unit: ${target}`);\n if (!dimEquals(v.dim, to.dim)) {\n throw new CalcEvalError(`convert() dimension mismatch: ${formatDim(v.dim)} is not ${formatDim(to.dim)}`);\n }\n return num(convertScalar(v.value, v.unit, target), to.dim, target);\n }\n\n // Filter args stay raw — only extension functions (aggregates) read them.\n const vals = args.map((a) => (a.kind === 'filter' ? ABSENT : evaluate(a, ctx)));\n\n // Aggregate disambiguation: sum/max/min/avg/count/last with a ref or\n // filter first argument are stream aggregates, delegated to the context\n // (e.g. max(effortRpe)); scalar min/max keep their math meaning\n // (min(100, score)). Segment scope has no aggregate resolver, so its\n // min/max always fall through to scalar.\n if (AGGREGATE_NAMES[name] && (args[0]?.kind === 'ref' || args[0]?.kind === 'filter')) {\n const extended = ctx.callFunction?.(name, vals, args);\n if (extended !== undefined) return extended;\n }\n\n // Trailing window maps (store-scope series tier, spec §3.2). Window math\n // is parity-pinned to workloadRollup.ts: iteration order k = 0..p−1 over\n // loadAt(day−k) matches the reference exactly (bit-identical floats).\n if (name === 'windowMean' || name === 'windowSum' || name === 'windowSd') {\n const [series, period] = vals;\n if (series?.kind === 'absent') return ABSENT;\n if (series?.kind !== 'series' || period?.kind !== 'period') {\n throw new CalcEvalError(`${name}() takes (series, period)`);\n }\n return windowMap(name, series, period.days);\n }\n\n // EWMA over the continuous day domain (PMC-style, #905): recursion\n // v_d = v_{d-1} + (load_d − v_{d-1}) / N with the canonical 1/N gain\n // (TrainingPeaks CTL/ATL), seeded at 0 and warmed by the zero-filled\n // domain — early days underestimate until the window saturates.\n if (name === 'windowEwma') {\n const [series, period] = vals;\n if (series?.kind === 'absent') return ABSENT;\n if (series?.kind !== 'series' || period?.kind !== 'period') {\n throw new CalcEvalError('windowEwma() takes (series, period)');\n }\n const gain = 1 / period.days;\n let prev = 0;\n const points = new Map<number, number>();\n for (const day of [...series.points.keys()].sort((a, b) => a - b)) {\n prev = prev + ((series.points.get(day) ?? 0) - prev) * gain;\n points.set(day, prev);\n }\n return { kind: 'series', points, dim: series.dim, unit: series.unit };\n }\n\n // Scalar reductions over a series: sum/mean/min/max/last.\n if (vals[0]?.kind === 'series' && (name === 'sum' || name === 'mean' || name === 'min' || name === 'max' || name === 'last')) {\n const series = vals[0];\n const values = [...series.points.values()];\n if (values.length === 0) return ABSENT;\n switch (name) {\n case 'sum': return num(values.reduce((a, b) => a + b, 0), series.dim, series.unit);\n case 'mean': return num(values.reduce((a, b) => a + b, 0) / values.length, series.dim, series.unit);\n case 'min': return num(Math.min(...values), series.dim, series.unit);\n case 'max': return num(Math.max(...values), series.dim, series.unit);\n case 'last': return num(values[values.length - 1], series.dim, series.unit);\n }\n }\n\n switch (name) {\n case 'min':\n case 'max': {\n const present = numericArgs(name, vals);\n if (present.length === 0) return ABSENT;\n const best = present.reduce((a, b) => (name === 'min' ? baseValue(b) < baseValue(a) : baseValue(b) > baseValue(a)) ? b : a);\n return num(best.value, best.dim, best.unit);\n }\n case 'abs': {\n const [v] = numericArgs(name, vals, 1);\n return num(Math.abs(v.value), v.dim, v.unit);\n }\n case 'round': {\n const [v, d] = numericArgs(name, vals);\n const decimals = d ? d.value : 0;\n const f = 10 ** decimals;\n return num(Math.round(v.value * f) / f, v.dim, v.unit);\n }\n case 'floor': {\n const [v] = numericArgs(name, vals, 1);\n return num(Math.floor(v.value), v.dim, v.unit);\n }\n case 'ceil': {\n const [v] = numericArgs(name, vals, 1);\n return num(Math.ceil(v.value), v.dim, v.unit);\n }\n case 'clamp': {\n const [v, lo, hi] = numericArgs(name, vals, 3);\n return num(Math.min(Math.max(v.value, lo.value), hi.value), v.dim, v.unit);\n }\n }\n\n const extended = ctx.callFunction?.(name, vals, args);\n if (extended !== undefined) return extended;\n throw new CalcEvalError(`Unknown function: ${name}`);\n}\n\nconst AGGREGATE_NAMES: Record<string, true> = { sum: true, max: true, min: true, avg: true, count: true, last: true };\n\n/** Trailing window over a series' day domain; missing days count as 0. */\nfunction windowMap(\n name: string,\n series: Extract<Val, { kind: 'series' }>,\n period: number,\n): Val {\n const loadAt = (day: number): number => series.points.get(day) ?? 0;\n const points = new Map<number, number>();\n for (const day of series.points.keys()) {\n let sum = 0;\n for (let k = 0; k < period; k++) sum += loadAt(day - k);\n if (name === 'windowSum') {\n points.set(day, sum);\n continue;\n }\n const mean = sum / period;\n if (name === 'windowMean') {\n points.set(day, mean);\n continue;\n }\n // windowSd: population SD (÷n), matching workloadRollup.\n let variance = 0;\n for (let k = 0; k < period; k++) {\n const diff = loadAt(day - k) - mean;\n variance += diff * diff;\n }\n points.set(day, Math.sqrt(variance / period));\n }\n return { kind: 'series', points, dim: series.dim, unit: series.unit };\n}\n\n/** convert()'s second argument is a unit symbol, not a value to resolve. */\nfunction unitArg(node: ExprNode): string {\n if (node.kind === 'ref') return node.name;\n if (node.kind === 'string') return node.value;\n throw new CalcEvalError('convert() target unit must be a unit name');\n}\n\n/**\n * Extract numeric args, dropping absent values. With `exact`, arity and\n * presence are enforced (unary math can't skip); without it (min/max),\n * absent args are ignored so partial data still yields a value.\n */\nfunction numericArgs(\n name: string,\n vals: Val[],\n exact?: number,\n): Extract<Val, { kind: 'number' }>[] {\n const out: Extract<Val, { kind: 'number' }>[] = [];\n for (const v of vals) {\n if (v.kind === 'absent') continue;\n if (v.kind !== 'number') throw new CalcEvalError(`${name}() requires numeric arguments`);\n out.push(v);\n }\n if (exact !== undefined) {\n if (vals.length !== exact || out.length !== exact) {\n throw new CalcEvalError(`${name}() needs ${exact} numeric argument(s), got ${out.length}`);\n }\n }\n return out;\n}\n","/**\n * Static dimension checking, run at calc registration time (spec §5).\n *\n * Walks an expression computing dimension vectors: `*` adds, `/` subtracts,\n * `+`/`-`/comparisons require equal vectors (numeric literal 0 is polymorphic\n * so `elapsed > 0` passes), `convert()` targets must match the source\n * vector. Declared output units must match the computed vector unless the\n * unit is `auto` or a named zero-vector authoritative cast (AU, pts,\n * MET-min, ratio). Any mismatch or unknown symbol is a registration error —\n * bad calcs never reach the evaluator.\n */\n\nimport { CalcLine, ExprNode } from './ast';\nimport { addDim, subDim, dimEquals, DimVector, DIM_ZERO, formatDim } from './dimensions';\nimport { AUTHORITATIVE_CASTS, getUnit } from './units';\n\nexport class CalcRegistrationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CalcRegistrationError';\n }\n}\n\nexport interface StaticEnv {\n /** Dimension of a ref atom; undefined → unknown symbol error. */\n refDim(name: string): DimVector | undefined;\n /** Dimension of an extension function result (aggregates, lookup fields). */\n callDim?(name: string, argDims: (DimVector | undefined)[]): DimVector | undefined;\n /** Dimension of a lookup() table field; undefined → unknown table/field. */\n lookupDim?(table: string, field: string): DimVector | undefined;\n /** Dimension of a WQL selection result; defaults to dimensionless. */\n wqlDim?(node: Extract<ExprNode, { kind: 'wql' }>): DimVector | undefined;\n}\n\n/** Infer the dimension vector of an expression, throwing on any violation. */\nexport function inferDim(node: ExprNode, env: StaticEnv): DimVector {\n switch (node.kind) {\n case 'literal':\n return DIM_ZERO;\n case 'period':\n return DIM_ZERO;\n case 'string':\n return DIM_ZERO;\n case 'filter':\n return DIM_ZERO;\n case 'ref': {\n const dim = env.refDim(node.name);\n if (!dim) throw new CalcRegistrationError(`Unknown symbol: ${node.name}`);\n return dim;\n }\n case 'wql':\n return env.wqlDim?.(node) ?? DIM_ZERO;\n case 'unary':\n return node.op === 'not' ? DIM_ZERO : inferDim(node.arg, env);\n case 'binary': {\n const { op } = node;\n if (op === 'and' || op === 'or') {\n inferDim(node.left, env);\n inferDim(node.right, env);\n return DIM_ZERO;\n }\n if (op === '*') return addDim(inferDim(node.left, env), inferDim(node.right, env));\n if (op === '/') return subDim(inferDim(node.left, env), inferDim(node.right, env));\n const l = comparableDim(node.left, env);\n const r = comparableDim(node.right, env);\n if (l && r && !dimEquals(l, r)) {\n throw new CalcRegistrationError(\n `Dimension mismatch for '${op}': ${formatDim(l)} vs ${formatDim(r)}`,\n );\n }\n return op === '+' || op === '-' ? (l ?? DIM_ZERO) : DIM_ZERO;\n }\n case 'call':\n return inferCallDim(node, env);\n }\n}\n\n/** Zero literal adopts the other side's vector (`elapsed > 0` idiom). */\nfunction comparableDim(node: ExprNode, env: StaticEnv): DimVector | undefined {\n if (node.kind === 'literal' && node.value === 0) return undefined;\n return inferDim(node, env);\n}\n\nfunction literalString(node: ExprNode): string | undefined {\n return node.kind === 'string' ? node.value : undefined;\n}\n\nfunction inferCallDim(node: Extract<ExprNode, { kind: 'call' }>, env: StaticEnv): DimVector {\n const { name, args } = node;\n if (name === 'has') return DIM_ZERO;\n if (name === 'convert') {\n if (args.length !== 2) throw new CalcRegistrationError('convert() takes (value, targetUnit)');\n const target = args[1];\n const unitName = target.kind === 'ref' ? target.name : target.kind === 'string' ? target.value : undefined;\n const unit = unitName === undefined ? undefined : getUnit(unitName);\n if (!unitName || !unit) {\n throw new CalcRegistrationError('convert() target must be a known unit name');\n }\n const src = inferDim(args[0], env);\n if (!dimEquals(src, unit.dim)) {\n throw new CalcRegistrationError(\n `convert(x, ${unitName}) dimension mismatch: ${formatDim(src)} is not ${formatDim(unit.dim)}`,\n );\n }\n return unit.dim;\n }\n if (name === 'min' || name === 'max' || name === 'clamp') {\n let dim: DimVector | undefined;\n for (const arg of args) {\n const d = inferDim(arg, env);\n if (dim && !dimEquals(dim, d)) {\n throw new CalcRegistrationError(`${name}() arguments have mismatched dimensions`);\n }\n dim = d;\n }\n if (!dim) throw new CalcRegistrationError(`${name}() requires at least one argument`);\n return dim;\n }\n if (name === 'abs' || name === 'round' || name === 'floor' || name === 'ceil') {\n if (args.length < 1) throw new CalcRegistrationError(`${name}() requires an argument`);\n return inferDim(args[0], env);\n }\n if (name === 'windowMean' || name === 'windowSum' || name === 'windowSd' || name === 'windowEwma') {\n if (args.length !== 2) throw new CalcRegistrationError(`${name}() takes (series, period)`);\n return inferDim(args[0], env);\n }\n if (name === 'lookup') {\n if (args.length !== 3) throw new CalcRegistrationError('lookup() takes (table, key, field)');\n const table = literalString(args[0]);\n const field = literalString(args[2]);\n if (!table || !field) {\n throw new CalcRegistrationError('lookup() table and field must be string literals');\n }\n inferDim(args[1], env); // key expression must still check\n const dim = env.lookupDim?.(table, field);\n if (!dim) throw new CalcRegistrationError(`Unknown lookup field: ${table}.${field}`);\n return dim;\n }\n const argDims = args.map((a) => (a.kind === 'filter' ? DIM_ZERO : inferDim(a, env)));\n const dim = env.callDim?.(name, argDims);\n if (!dim) throw new CalcRegistrationError(`Unknown function: ${name}`);\n return dim;\n}\n\n/**\n * Validate a parsed calc line's declared output unit against the computed\n * vector. `auto` always passes; authoritative casts override; anything else\n * must match exactly.\n */\nexport function validateOutputUnit(exprDim: DimVector, unit: string | undefined): void {\n if (!unit || unit === 'auto') return;\n if (AUTHORITATIVE_CASTS[unit]) return;\n const def = getUnit(unit);\n if (!def) throw new CalcRegistrationError(`Unknown output unit: ${unit}`);\n if (!dimEquals(def.dim, exprDim)) {\n throw new CalcRegistrationError(\n `Declared unit ${unit} (${formatDim(def.dim)}) does not match expression dimension ${formatDim(exprDim)}`,\n );\n }\n}\n\n/** Full registration-time check for one calc line. Returns the computed vector. */\nexport function checkCalcLine(line: CalcLine, env: StaticEnv): DimVector {\n const dim = inferDim(line.expr, env);\n if (line.when) inferDim(line.when, env);\n validateOutputUnit(dim, line.unit);\n return dim;\n}\n","/**\n * Hand-rolled parser for the calc expression language.\n *\n * Line-oriented and small by design (review doc §11.4): expressions use a\n * Pratt parser; WQL atoms (`sum:reps{...} by {effort}`) lex as single atoms\n * and stay opaque here — the QueryService layer executes them. The full\n * authoring surface (sections, `|` variant sugar, `where` bindings) belongs\n * to the line-form compiler (#863/#880); seeds are DAG records (#849), so\n * only the expression/predicate core and the single-line form live here.\n */\n\nimport { BinaryOp, CalcLine, ExprNode } from './ast';\n\nexport class CalcParseError extends Error {\n constructor(message: string, readonly pos: number) {\n super(`${message} (at ${pos})`);\n this.name = 'CalcParseError';\n }\n}\n\ntype Token =\n | { t: 'num'; v: number; pos: number }\n | { t: 'period'; v: number; pos: number } // trailing window: 7d, 28d\n | { t: 'str'; v: string; pos: number }\n | { t: 'ident'; v: string; pos: number }\n | { t: 'filter'; v: string; pos: number } // raw without: exclusion filter\n | { t: 'op'; v: string; pos: number }\n | { t: 'brace'; v: string; pos: number } // raw {...} contents\n | { t: 'eof'; pos: number };\n\nconst IDENT_START = /[A-Za-z_]/;\nconst IDENT_CHAR = /[A-Za-z0-9_.]/;\n\nfunction tokenize(src: string): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n while (i < src.length) {\n const c = src[i];\n if (c === ' ' || c === '\\t' || c === '\\n' || c === '\\r') { i++; continue; }\n if (c >= '0' && c <= '9' || (c === '.' && src[i + 1] >= '0' && src[i + 1] <= '9')) {\n const m = /^\\d*\\.?\\d+/.exec(src.slice(i))!;\n const end = i + m[0].length;\n // Trailing-period literal: `7d`, `28d` — window durations.\n if (src[end] === 'd' && !(end + 1 < src.length && IDENT_CHAR.test(src[end + 1]))) {\n tokens.push({ t: 'period', v: parseFloat(m[0]), pos: i });\n i = end + 1;\n continue;\n }\n tokens.push({ t: 'num', v: parseFloat(m[0]), pos: i });\n i = end;\n continue;\n }\n if (c === '\"' || c === \"'\") {\n const end = src.indexOf(c, i + 1);\n if (end < 0) throw new CalcParseError('Unterminated string literal', i);\n tokens.push({ t: 'str', v: src.slice(i + 1, end), pos: i });\n i = end + 1;\n continue;\n }\n if (c === '{') {\n const end = src.indexOf('}', i + 1);\n if (end < 0) throw new CalcParseError('Unterminated filter braces', i);\n tokens.push({ t: 'brace', v: src.slice(i + 1, end), pos: i });\n i = end + 1;\n continue;\n }\n if (IDENT_START.test(c)) {\n let j = i + 1;\n while (j < src.length && IDENT_CHAR.test(src[j])) j++;\n const word = src.slice(i, j);\n // `without: rest|pause|rest-*` — raw exclusion filter (| and * are not\n // expression operators), lexed verbatim up to the next ',' or ')'.\n if (word === 'without') {\n const m = /^\\s*:\\s*([^,)]+)/.exec(src.slice(j));\n if (m) {\n tokens.push({ t: 'filter', v: m[1].trim(), pos: i });\n i = j + m[0].length;\n continue;\n }\n }\n tokens.push({ t: 'ident', v: word, pos: i });\n i = j;\n continue;\n }\n const two = src.slice(i, i + 2);\n if (two === '==' || two === '!=' || two === '<=' || two === '>=' || two === '->') {\n tokens.push({ t: 'op', v: two, pos: i });\n i += 2;\n continue;\n }\n if ('+-*/()<>=,:'.includes(c)) {\n tokens.push({ t: 'op', v: c, pos: i });\n i++;\n continue;\n }\n throw new CalcParseError(`Unexpected character '${c}'`, i);\n }\n tokens.push({ t: 'eof', pos: src.length });\n return tokens;\n}\n\nconst BINARY_PRECEDENCE: Record<string, number> = {\n or: 1,\n and: 2,\n '==': 3, '!=': 3, '<': 3, '<=': 3, '>': 3, '>=': 3,\n '+': 4, '-': 4,\n '*': 5, '/': 5,\n};\n\nclass Parser {\n private pos = 0;\n constructor(private readonly tokens: Token[]) {}\n\n private peek(): Token { return this.tokens[this.pos]; }\n private next(): Token { return this.tokens[this.pos++]; }\n\n private isOp(v: string): boolean {\n const tok = this.peek();\n return tok.t === 'op' && tok.v === v;\n }\n\n private isIdent(v: string): boolean {\n const tok = this.peek();\n return tok.t === 'ident' && tok.v === v;\n }\n\n /** Parse a full expression; must consume all input. */\n parseTop(): ExprNode {\n const expr = this.parseExpression();\n const tail = this.peek();\n if (tail.t !== 'eof') throw new CalcParseError('Unexpected trailing input', tail.pos);\n return expr;\n }\n\n private expectOp(v: string): Token {\n const tok = this.next();\n if (tok.t !== 'op' || tok.v !== v) throw new CalcParseError(`Expected '${v}'`, tok.pos);\n return tok;\n }\n\n /** Binary operator at the current position: punctuation or and/or keyword. */\n private binaryOp(): { op: BinaryOp; prec: number } | undefined {\n const tok = this.peek();\n const v = tok.t === 'op' ? tok.v : tok.t === 'ident' && (tok.v === 'and' || tok.v === 'or') ? tok.v : undefined;\n if (v === undefined) return undefined;\n const prec = BINARY_PRECEDENCE[v];\n return prec === undefined ? undefined : { op: v as BinaryOp, prec };\n }\n\n parseExpression(minPrec = 1): ExprNode {\n let left = this.parseUnary();\n for (;;) {\n const b = this.binaryOp();\n if (!b || b.prec < minPrec) return left;\n this.next();\n const right = this.parseExpression(b.prec + 1);\n left = { kind: 'binary', op: b.op, left, right };\n }\n }\n\n private parseUnary(): ExprNode {\n const tok = this.peek();\n if (tok.t === 'op' && tok.v === '-') {\n this.next();\n return { kind: 'unary', op: '-', arg: this.parseUnary() };\n }\n if (tok.t === 'ident' && tok.v === 'not') {\n this.next();\n return { kind: 'unary', op: 'not', arg: this.parseUnary() };\n }\n return this.parsePrimary();\n }\n\n private parsePrimary(): ExprNode {\n const tok = this.next();\n if (tok.t === 'num') return { kind: 'literal', value: tok.v };\n if (tok.t === 'period') return { kind: 'period', days: tok.v };\n if (tok.t === 'str') return { kind: 'string', value: tok.v };\n if (tok.t === 'op' && tok.v === '(') {\n const inner = this.parseExpression();\n this.expectOp(')');\n return inner;\n }\n if (tok.t === 'op' && tok.v === ':') {\n throw new CalcParseError(\"Unexpected ':'\", tok.pos);\n }\n if (tok.t === 'ident') {\n // WQL atom: aggregator:metric{filters} by {dims} — store scope only.\n if (this.isOp(':')) {\n this.next();\n const metric = this.next();\n if (metric.t !== 'ident') throw new CalcParseError('Expected metric name after aggregator', metric.pos);\n let filters: string | undefined;\n let groupBy: string[] | undefined;\n const maybeBrace = this.peek();\n if (maybeBrace.t === 'brace') { filters = maybeBrace.v; this.next(); }\n if (this.isIdent('by')) {\n this.next();\n const dims = this.next();\n if (dims.t !== 'brace') throw new CalcParseError(\"Expected '{dims}' after 'by'\", dims.pos);\n groupBy = dims.v.split(',').map((d) => d.trim()).filter(Boolean);\n }\n return { kind: 'wql', aggregator: tok.v, metric: metric.v, filters, groupBy };\n }\n // Function call.\n if (this.isOp('(')) {\n this.next();\n const args: ExprNode[] = [];\n if (!this.isOp(')')) {\n for (;;) {\n args.push(this.parseArg());\n const sep = this.next();\n if (sep.t === 'op' && sep.v === ',') continue;\n if (sep.t === 'op' && sep.v === ')') break;\n throw new CalcParseError(\"Expected ',' or ')' in argument list\", sep.pos);\n }\n } else {\n this.next();\n }\n return { kind: 'call', name: tok.v, args };\n }\n return { kind: 'ref', name: tok.v };\n }\n throw new CalcParseError('Expected expression', tok.pos);\n }\n\n /** One call argument; `without:` filters arrive pre-lexed. */\n private parseArg(): ExprNode {\n const tok = this.peek();\n if (tok.t === 'filter') {\n this.next();\n return { kind: 'filter', value: tok.v };\n }\n return this.parseExpression();\n }\n}\n\n/** Parse a standalone expression or predicate. */\nexport function parseExpression(src: string): ExprNode {\n return new Parser(tokenize(src)).parseTop();\n}\n\n/** Raw token scan for the calc-line form: find top-level `->` and ` when `. */\nfunction splitCalcLine(src: string): { head: string; unit?: string; when?: string } {\n const tokens = tokenize(src);\n let arrowIdx = -1;\n let whenIdx = -1;\n let depth = 0;\n for (let k = 0; k < tokens.length; k++) {\n const tok = tokens[k];\n if (tok.t === 'op' && tok.v === '(') depth++;\n else if (tok.t === 'op' && tok.v === ')') depth--;\n else if (depth === 0 && tok.t === 'op' && tok.v === '->' && arrowIdx < 0) arrowIdx = k;\n else if (depth === 0 && tok.t === 'ident' && tok.v === 'when') { whenIdx = k; break; }\n }\n const headEnd = arrowIdx >= 0 ? tokens[arrowIdx].pos : whenIdx >= 0 ? tokens[whenIdx].pos : src.length;\n const head = src.slice(0, headEnd).trim();\n let unit: string | undefined;\n let when: string | undefined;\n if (arrowIdx >= 0) {\n const unitEnd = whenIdx >= 0 ? tokens[whenIdx].pos : src.length;\n unit = src.slice(tokens[arrowIdx].pos + 2, unitEnd).trim();\n }\n if (whenIdx >= 0) when = src.slice(tokens[whenIdx].pos + 4).trim();\n return { head, unit: unit || undefined, when: when || undefined };\n}\n\n/**\n * Parse one calc line: `name = expr -> unit when predicate`.\n * Unit may be `auto`; `key`/`grouped` output declarations are registry\n * concerns (record form), not parsed here.\n */\nexport function parseCalcLine(src: string): CalcLine {\n const { head, unit, when } = splitCalcLine(src);\n const eq = head.indexOf('=');\n if (eq < 0) throw new CalcParseError(\"Expected '=' in calc line\", 0);\n const name = head.slice(0, eq).trim();\n if (!name) throw new CalcParseError('Missing calc name', 0);\n const exprSrc = head.slice(eq + 1).trim();\n if (!exprSrc) throw new CalcParseError('Missing expression', eq + 1);\n return {\n name,\n expr: parseExpression(exprSrc),\n unit,\n when: when ? parseExpression(when) : undefined,\n };\n}\n","/**\n * Calculation registry — registration and static validation of composed\n * calculation DAG records (spec §2.2).\n *\n * Every expression and predicate is parsed and dimension-checked at\n * registration (spec §5): unknown symbols, dimension mismatches, bad\n * convert targets, and invalid output units fail here, never at runtime.\n * Library calcs register their node dimensions under qualified names\n * (`calcId.nodeId`) so dependent calcs can reference them statically.\n */\n\nimport { ExprNode } from './ast';\nimport { CalcRegistrationError, inferDim, StaticEnv, validateOutputUnit } from './check';\nimport { DimVector, DIM_ZERO } from './dimensions';\nimport { LookupRegistry } from './lookup';\nimport { parseExpression } from './parser';\nimport { AGGREGATE_BUILTINS, CONTEXT_ATOMS, STREAM_ATOMS } from './atoms';\nimport { AUTHORITATIVE_CASTS } from './units';\nimport { CalculationDefinition, CalcScope, CalcVariant } from './types';\n\nexport class CalculationRegistry {\n private readonly defs = new Map<string, CalculationDefinition>();\n /** Qualified library node dimensions: `calcId.nodeId` → vector. */\n private readonly libraryDims = new Map<string, DimVector>();\n\n constructor(private readonly lookups: LookupRegistry) {}\n\n /** All registered calcs for a scope, registration order preserved. */\n byScope(scope: CalcScope): CalculationDefinition[] {\n return [...this.defs.values()].filter((d) => d.scope === scope);\n }\n\n get(id: string): CalculationDefinition | undefined {\n return this.defs.get(id);\n }\n\n /**\n * Register a calculation. Compiles every node expression and predicate,\n * runs static dimension checking, and (for library calcs) publishes node\n * dimensions for dependent calcs. Throws CalcRegistrationError on any\n * violation.\n */\n register(def: CalculationDefinition): void {\n if (def.variants.length === 0) {\n throw new CalcRegistrationError(`Calc ${def.id}: at least one variant is required`);\n }\n const env = this.staticEnv();\n if (def.when) def.whenAst = compilePredicate(def.when, def.id, env);\n\n // Sort variants once: higher priority first, registration order breaks ties.\n def.variants = [...def.variants].sort((a, b) => b.priority - a.priority);\n\n for (const variant of def.variants) {\n this.compileVariant(def, variant, env);\n }\n\n if (def.kind === 'output' && def.output?.unit && def.output.unit !== 'auto') {\n for (const variant of def.variants) {\n for (const nodeId of outputNodeIds(def)) {\n const dim = variant.nodeDims?.[nodeId];\n if (dim) validateOutputUnit(dim, def.output.unit);\n }\n }\n }\n\n if (def.kind === 'library') {\n for (const variant of def.variants) {\n for (const [nodeId, dim] of Object.entries(variant.nodeDims ?? {})) {\n this.libraryDims.set(`${def.id}.${nodeId}`, dim);\n }\n }\n }\n this.defs.set(def.id, def);\n }\n\n /** Parse + dimension-check every node and predicate in a variant. */\n private compileVariant(def: CalculationDefinition, variant: CalcVariant, baseEnv: StaticEnv): void {\n if (variant.when) variant.whenAst = compilePredicate(variant.when, `${def.id}:${variant.id}`, baseEnv);\n\n const nodeDims: Record<string, DimVector> = {};\n const visiting = new Set<string>();\n // Sibling refs resolve recursively, so declaration order doesn't matter\n // and cycles fail as registration errors.\n const resolveNode = (nodeId: string): DimVector => {\n if (nodeDims[nodeId]) return nodeDims[nodeId];\n const node = variant.nodes[nodeId];\n if (!node) throw new CalcRegistrationError(`Unknown symbol: ${nodeId}`);\n if (visiting.has(nodeId)) {\n throw new CalcRegistrationError(`Calc ${def.id}:${variant.id}.${nodeId}: cyclic node reference`);\n }\n visiting.add(nodeId);\n try {\n const ast = node.ast ?? parseExpression(requiredExpression(def, variant, nodeId, node.expression));\n node.ast = ast;\n const env = this.staticEnv(siblingRefDim);\n let dim = inferDim(ast, env);\n if (node.unit) {\n validateOutputUnit(dim, node.unit);\n if (AUTHORITATIVE_CASTS[node.unit]) dim = DIM_ZERO;\n }\n nodeDims[nodeId] = dim;\n return dim;\n } catch (err) {\n throw wrap(def, variant, nodeId, err);\n } finally {\n visiting.delete(nodeId);\n }\n };\n const siblingRefDim = (name: string): DimVector | undefined => {\n if (!(name in variant.nodes)) return undefined;\n return resolveNode(name);\n };\n\n for (const nodeId of Object.keys(variant.nodes)) resolveNode(nodeId);\n variant.nodeDims = nodeDims;\n }\n\n /** Static environment for a calc: siblings → library → stream → context. */\n private staticEnv(\n siblingRefDim: (name: string) => DimVector | undefined = () => undefined,\n ): StaticEnv {\n return {\n refDim: (name) =>\n siblingRefDim(name)\n ?? this.libraryDims.get(name)\n ?? STREAM_ATOMS[name]?.dim\n ?? CONTEXT_ATOMS[name],\n callDim: (name, argDims) => {\n if (name === 'count') return DIM_ZERO;\n if (AGGREGATE_BUILTINS[name]) return argDims[0];\n return undefined;\n },\n lookupDim: (table, field) => this.lookups.fieldDim(table, field),\n };\n }\n}\n\nfunction compilePredicate(src: string, owner: string, env: StaticEnv): ExprNode {\n try {\n const ast = parseExpression(src);\n inferDim(ast, env);\n return ast;\n } catch (err) {\n if (err instanceof Error) throw new CalcRegistrationError(`Calc ${owner} predicate: ${err.message}`);\n throw err;\n }\n}\n\nfunction requiredExpression(def: CalculationDefinition, variant: CalcVariant, nodeId: string, expression: string | undefined): string {\n if (!expression) {\n throw new CalcRegistrationError(`Calc ${def.id}:${variant.id}.${nodeId}: node needs an expression or AST`);\n }\n return expression;\n}\n\nfunction wrap(def: CalculationDefinition, variant: CalcVariant, nodeId: string, err: unknown): Error {\n if (err instanceof Error) {\n return new CalcRegistrationError(`Calc ${def.id}:${variant.id}.${nodeId}: ${err.message}`);\n }\n return err as Error;\n}\n\n/** Output node ids as an array regardless of the single/multi form. */\nexport function outputNodeIds(def: CalculationDefinition): string[] {\n const nodeId = def.output?.nodeId;\n if (!nodeId) return [];\n return Array.isArray(nodeId) ? nodeId : [nodeId];\n}\n","/**\n * Composed calculation engine — Phases 1 & 2 of the evaluation pipeline\n * (spec §1.1).\n *\n * Implements both legacy processor contracts so it drops into the existing\n * AnalyticsEngine chain:\n *\n * - `process(output)` — **Phase 1, segment scope.** On each leaf segment,\n * evaluates segment calcs against the segment's metrics + context and\n * appends `analyzed` / `analyzed-estimated` annotations to the segment's\n * own OutputStatement (pace, power, and the library nodes segmentVolume,\n * effortRpe, metMinutes + the metMinutesEstimated companion count).\n *\n * - `summarize(outputs)` — **Phase 2, workout scope.** Recompute-all over\n * the accumulated log-stream history: stream aggregates, context nodes,\n * variant resolution, grouped emission. Emits ProjectionResults which the\n * AnalyticsEngine turns into replacement `analytics` OutputStatements\n * with signature dedupe (live running totals).\n *\n * Store scope (Phase 3) lives in the rollup driver replacement (#877).\n */\n\nimport type { IMetric, MetricOrigin } from '@bitcobblers/wod-wiki-core';\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport type { IOutputStatement } from '@bitcobblers/wod-wiki-core';\nimport type { IRealtimeProcessor } from '../IRealtimeProcessor';\nimport type { ISummaryProcessor } from '../ISummaryProcessor';\nimport type { ProjectionResult } from '../ProjectionResult';\nimport { extractEffortData } from '../effortResolution';\nimport { ExprNode } from './ast';\nimport { STREAM_ATOMS } from './atoms';\nimport { evaluate, EvalContext } from './evaluator';\nimport { LookupRegistry } from './lookup';\nimport { outputNodeIds, CalculationRegistry } from './registry';\nimport { IProfileSource } from './tables';\nimport { CalculationDefinition, CalcVariant } from './types';\nimport { ABSENT, num, str, truthy, Val } from './values';\nimport { DIM_ZERO } from './dimensions';\nimport { AUTHORITATIVE_CASTS } from './units';\n\nexport interface CalcEngineDeps {\n /** Fence dialect of the block being analyzed; calcs filter on it. */\n dialect: string;\n lookups: LookupRegistry;\n userProfile?: IProfileSource;\n}\n\n/** Segment's resolved effort identity for grouping/exclusion. */\ninterface SegmentEffort {\n slug: string;\n label: string;\n}\n\nexport class CalcEngine implements IRealtimeProcessor, ISummaryProcessor {\n readonly id = 'composed-calculations';\n readonly fenceTypes = ['time', 'log'] as const;\n\n private readonly segmentCalcs: CalculationDefinition[];\n private readonly workoutCalcs: CalculationDefinition[];\n /**\n * Last resolved effort slug seen this workout — the \"last-seen effort\"\n * scan state from MetMinuteProjectionEngine, carried across process()\n * calls (segments arrive in stream order, live and in replay).\n */\n private lastSegmentEffort?: string;\n\n constructor(\n private readonly registry: CalculationRegistry,\n private readonly deps: CalcEngineDeps,\n ) {\n const fenced = (d: CalculationDefinition) => !d.fences || d.fences.includes(deps.dialect);\n this.segmentCalcs = registry.byScope('segment').filter(fenced);\n this.workoutCalcs = registry.byScope('workout').filter(fenced);\n }\n\n // ── Phase 1: segment scope ─────────────────────────────────────────────\n\n process(output: IOutputStatement): IOutputStatement {\n if (output.outputType !== 'segment' || !output.isLeaf) return output;\n const effortData = extractEffortData(output.metrics.rawMetrics);\n if (effortData) this.lastSegmentEffort = effortData.resolved.slug;\n const atoms = buildSegmentAtoms(output, this.lastSegmentEffort);\n // Effort identity rides segment annotations as metadata so persisted\n // segment-grain facts (workoutDerivation.normalizeAllMetrics) carry the\n // effortSlug/discipline/intensityTier tags that WQL `by {effort}` and\n // discipline filters group on — without this, derived metrics like\n // calc.e1rm could never group by lift (#904).\n const effortSlug = segmentEffort(output).slug ?? this.lastSegmentEffort;\n const effortTags: Record<string, unknown> = {};\n if (effortSlug) {\n effortTags.effortSlug = effortSlug;\n const discipline = this.lookupString(effortSlug, 'discipline');\n const intensityTier = this.lookupString(effortSlug, 'intensityTier');\n if (discipline) effortTags.effortDiscipline = discipline;\n if (intensityTier) effortTags.effortIntensityTier = intensityTier;\n }\n // Climb grade rides the annotation metadata too, so `calc.sends` facts\n // persist a `grade` tag and WQL groups them `by {grade}`.\n const climbGrade = [...output.metrics.rawMetrics].find((m) => m.type === 'climb-grade')?.value;\n if (climbGrade && typeof climbGrade === 'object' && 'raw' in climbGrade) {\n effortTags.grade = String((climbGrade as { raw: unknown }).raw);\n }\n\n for (const def of this.segmentCalcs) {\n const ctx = this.makeContext(atoms);\n if (!this.applicable(def.whenAst, ctx)) continue;\n const variant = this.selectVariant(def, ctx);\n if (!variant) continue;\n const values = this.evaluateVariant(variant, atoms);\n\n if (def.kind === 'library') {\n // Library results append as annotations so workout-scope aggregates\n // can scan them (review doc §6 note). Absent nodes are skipped —\n // that's how the metMinutesEstimated companion count works. Frozen\n // predictions (#846: replay strips 'analyzed' but freezes\n // 'analyzed-estimated') are never re-derived or double-counted.\n for (const [nodeId, value] of values) {\n if (value.kind !== 'number') continue;\n if (this.hasFrozen(output, nodeId)) continue;\n this.appendAnnotation(output, nodeId, value, variant.origin, undefined, effortTags);\n }\n } else {\n for (const nodeId of outputNodeIds(def)) {\n const value = values.get(nodeId);\n if (value?.kind !== 'number') continue;\n if (this.hasFrozen(output, def.output?.emitType ?? def.id)) continue;\n this.appendAnnotation(output, def.output?.emitType ?? def.id, value, variant.origin, def.output?.unit, effortTags);\n }\n }\n }\n return output;\n }\n\n private appendAnnotation(\n output: IOutputStatement,\n type: string,\n value: Extract<Val, { kind: 'number' }>,\n origin: MetricOrigin,\n declaredUnit?: string,\n metadata?: Record<string, unknown>,\n ): void {\n const unit = !declaredUnit || declaredUnit === 'auto' ? value.unit : declaredUnit;\n output.metrics.add({\n type,\n image: unit ? `${formatNumber(value.value)} ${unit}` : formatNumber(value.value),\n value: value.value,\n unit,\n origin,\n timestamp: new Date(),\n ...(metadata && Object.keys(metadata).length > 0 ? { metadata } : {}),\n });\n }\n\n /** A frozen prediction of this type already rides the segment (replay). */\n private hasFrozen(output: IOutputStatement, type: string): boolean {\n return output.metrics.rawMetrics.some((m) => m.type === type && m.origin === 'analyzed-estimated');\n }\n\n // ── Phase 2: workout scope ─────────────────────────────────────────────\n\n summarize(outputs: IOutputStatement[]): ProjectionResult[] {\n const projections: ProjectionResult[] = [];\n for (const def of this.workoutCalcs) {\n if (def.output?.isGrouped) {\n projections.push(...this.summarizeGrouped(def, outputs));\n } else {\n projections.push(...this.summarizeUngrouped(def, outputs));\n }\n }\n return projections;\n }\n\n private summarizeUngrouped(def: CalculationDefinition, outputs: IOutputStatement[]): ProjectionResult[] {\n const atoms = this.buildWorkoutAtoms(outputs);\n const ctx = this.makeContext(atoms);\n if (!this.applicable(def.whenAst, ctx)) return [];\n const variant = this.selectVariant(def, ctx);\n if (!variant) return [];\n const values = this.evaluateVariant(variant, atoms);\n const result = this.toProjection(def, variant, values, undefined);\n return result ? [result] : [];\n }\n\n private summarizeGrouped(def: CalculationDefinition, outputs: IOutputStatement[]): ProjectionResult[] {\n const groups = new Map<string, { label: string; segments: IOutputStatement[] }>();\n for (const output of outputs) {\n if (output.outputType !== 'segment') continue;\n const effort = segmentEffort(output);\n if (!effort.slug) continue;\n let group = groups.get(effort.slug);\n if (!group) {\n group = { label: effort.label, segments: [] };\n groups.set(effort.slug, group);\n }\n group.segments.push(output);\n }\n\n const projections: ProjectionResult[] = [];\n for (const [slug, group] of groups) {\n const atoms = this.buildWorkoutAtoms(group.segments);\n const ctx = this.makeContext(atoms);\n if (!this.applicable(def.whenAst, ctx)) continue;\n const variant = this.selectVariant(def, ctx);\n if (!variant) continue;\n const values = this.evaluateVariant(variant, atoms);\n const result = this.toProjection(def, variant, values, {\n effortSlug: slug,\n exerciseName: group.label,\n // Group dims auto-tag (spec §7.1); effort identity tags populate the\n // by-effort / by-discipline indexes from the effort lookup table.\n groupTags: { effort: slug },\n effortDiscipline: this.lookupString(slug, 'discipline'),\n effortIntensityTier: this.lookupString(slug, 'intensityTier'),\n });\n if (result) projections.push(result);\n }\n return projections;\n }\n\n private lookupString(key: string, field: string): string | undefined {\n const value = this.deps.lookups.lookup('effort', key, field);\n return value.kind === 'string' && value.value ? value.value : undefined;\n }\n\n private toProjection(\n def: CalculationDefinition,\n variant: CalcVariant,\n values: Map<string, Val>,\n group: { effortSlug: string; exerciseName: string; groupTags: Record<string, string>; effortDiscipline?: string; effortIntensityTier?: string } | undefined,\n ): ProjectionResult | undefined {\n const nodeId = outputNodeIds(def)[0];\n const value = values.get(nodeId);\n if (value?.kind !== 'number') return undefined;\n\n const metadata: Record<string, unknown> = {\n canonicalKey: def.output?.key ?? def.id,\n ...group,\n };\n for (const metaNodeId of def.output?.publishMetadataNodes ?? []) {\n const metaValue = values.get(metaNodeId);\n if (metaValue?.kind === 'number') metadata[metaNodeId] = metaValue.value;\n if (metaValue?.kind === 'string') metadata[metaNodeId] = metaValue.value;\n }\n\n return {\n name: def.output?.key ?? def.id,\n value: value.value,\n unit: !def.output?.unit || def.output.unit === 'auto' ? (value.unit ?? '') : def.output.unit,\n metricType: def.output?.emitType,\n timeSpan: { started: Date.now(), ended: Date.now() },\n origin: variant.origin,\n metadata,\n };\n }\n\n // ── Shared evaluation machinery ────────────────────────────────────────\n\n private applicable(whenAst: ExprNode | undefined, ctx: EvalContext): boolean {\n if (!whenAst) return true;\n return truthy(evaluate(whenAst, ctx));\n }\n\n /** First applicable variant wins (variants are pre-sorted by priority). */\n private selectVariant(def: CalculationDefinition, ctx: EvalContext): CalcVariant | undefined {\n for (const variant of def.variants) {\n if (this.applicable(variant.whenAst, ctx)) return variant;\n }\n return undefined;\n }\n\n /** Evaluate all nodes in a variant, resolving sibling refs lazily. */\n private evaluateVariant(variant: CalcVariant, atoms: AtomResolver): Map<string, Val> {\n const memo = new Map<string, Val>();\n const visiting = new Set<string>();\n const resolveNode = (nodeId: string): Val => {\n const cached = memo.get(nodeId);\n if (cached) return cached;\n const node = variant.nodes[nodeId];\n if (!node?.ast || visiting.has(nodeId)) return ABSENT;\n visiting.add(nodeId);\n let value = evaluate(node.ast, this.makeContext(atoms, siblingResolver));\n visiting.delete(nodeId);\n // §5.3 authoritative casts apply at node boundaries, not just at\n // registration — TIS's durationScore folds time into the score here.\n if (value.kind === 'number' && node.unit && AUTHORITATIVE_CASTS[node.unit]) {\n value = num(value.value, DIM_ZERO, node.unit);\n }\n memo.set(nodeId, value);\n return value;\n };\n const siblingResolver = (name: string): Val | undefined =>\n name in variant.nodes ? resolveNode(name) : undefined;\n for (const nodeId of Object.keys(variant.nodes)) resolveNode(nodeId);\n return memo;\n }\n\n private makeContext(atoms: AtomResolver, siblingResolver?: (nodeId: string) => Val | undefined): EvalContext {\n return {\n resolveRef: (name) => siblingResolver?.(name) ?? atoms.resolveRef(name),\n callFunction: (name, args, rawArgs) => {\n if (name === 'lookup') return this.deps.lookups.callFunction!(name, args, rawArgs);\n return atoms.callFunction?.(name, args, rawArgs);\n },\n };\n }\n\n /** Workout-scope atoms over a segment list (full history or one group). */\n private buildWorkoutAtoms(segments: IOutputStatement[]): AtomResolver {\n const effortBySegment = new Map<IOutputStatement, SegmentEffort>();\n const effortOf = (s: IOutputStatement): SegmentEffort => {\n let effort = effortBySegment.get(s);\n if (!effort) {\n effort = segmentEffort(s);\n effortBySegment.set(s, effort);\n }\n return effort;\n };\n\n const collect = (atom: string, exclusion?: string): { values: number[]; unit?: string } => {\n const atomDef = STREAM_ATOMS[atom];\n const metricType = atomDef?.metricType ?? atom;\n const values: number[] = [];\n let unit = atomDef?.unit;\n for (const segment of segments) {\n if (segment.outputType !== 'segment') continue;\n if (exclusion && matchesExclusion(effortOf(segment).slug, exclusion)) continue;\n for (const metric of segment.metrics.rawMetrics) {\n if (metric.type !== metricType) continue;\n const value = numericMetricValue(metric);\n if (value === undefined) continue;\n values.push(value);\n // Last-seen unit wins (DistanceProjectionEngine parity); the unit\n // may be embedded in an `{amount, units}` value or on the metric.\n unit = embeddedMetricUnit(metric) ?? metric.unit ?? unit;\n }\n }\n return { values, unit };\n };\n\n const aggregate = (name: string, rawArgs: ExprNode[]): Val => {\n const target = rawArgs[0];\n if (target?.kind !== 'ref') return ABSENT;\n const exclusion = rawArgs[1]?.kind === 'filter' ? rawArgs[1].value : undefined;\n const { values, unit } = collect(target.name, exclusion);\n if (values.length === 0) return ABSENT;\n const dim = STREAM_ATOMS[target.name]?.dim;\n switch (name) {\n case 'sum': return num(values.reduce((a, b) => a + b, 0), dim, unit);\n case 'max': return num(Math.max(...values), dim, unit);\n case 'min': return num(Math.min(...values), dim, unit);\n case 'avg': return num(values.reduce((a, b) => a + b, 0) / values.length, dim, unit);\n case 'last': return num(values[values.length - 1], dim, unit);\n case 'count': return num(values.length);\n default: return ABSENT;\n }\n };\n\n const libraryMemo = new Map<string, Val>();\n const resolveLibrary = (atoms: AtomResolver, name: string): Val => {\n const dot = name.indexOf('.');\n if (dot < 0) return ABSENT;\n const memoized = libraryMemo.get(name);\n if (memoized) return memoized;\n const def = this.registry.get(name.slice(0, dot));\n if (!def || def.kind !== 'library') return ABSENT;\n const ctx = this.makeContext(atoms);\n if (!this.applicable(def.whenAst, ctx)) return ABSENT;\n const variant = this.selectVariant(def, ctx);\n if (!variant) return ABSENT;\n const values = this.evaluateVariant(variant, atoms);\n for (const [nodeId, value] of values) {\n libraryMemo.set(`${def.id}.${nodeId}`, value);\n }\n return libraryMemo.get(name) ?? ABSENT;\n };\n\n const atoms: AtomResolver = {\n resolveRef: (name) => {\n if (name === 'session.duration') {\n const duration = sessionDuration(segments);\n return duration === undefined ? ABSENT : num(duration, STREAM_ATOMS.elapsed.dim, 'ms');\n }\n if (name === 'sessionRpe') {\n const rpe = lastMetricNumber(segments, MetricType.SessionRPE);\n return rpe === undefined ? ABSENT : num(rpe);\n }\n if (name === 'profile.vo2max') {\n const vo2max = this.deps.userProfile?.vo2max;\n return vo2max === undefined ? ABSENT : num(vo2max);\n }\n if (name === 'effort') {\n // Last resolved effort in the stream (TIS disciplineFactor source);\n // empty string routes through the effort table's default row.\n for (let i = segments.length - 1; i >= 0; i--) {\n const data = extractEffortData(segments[i].metrics.rawMetrics);\n if (data) return str(data.resolved.slug);\n }\n return str('');\n }\n if (name.includes('.')) return resolveLibrary(atoms, name);\n return ABSENT;\n },\n callFunction: (name, _args, rawArgs) => {\n if (['sum', 'max', 'min', 'avg', 'count', 'last'].includes(name)) return aggregate(name, rawArgs);\n return undefined;\n },\n };\n return atoms;\n }\n}\n\n/** Ref/function resolution for one scope instance. */\ninterface AtomResolver {\n resolveRef(name: string): Val;\n callFunction?(name: string, args: Val[], rawArgs: ExprNode[]): Val | undefined;\n}\n\n// ── Segment atom extraction ──────────────────────────────────────────────\n\n/** Build segment-scope atoms from a leaf segment's metrics. */\nfunction buildSegmentAtoms(output: IOutputStatement, lastEffortSlug?: string): AtomResolver {\n const raw = output.metrics.rawMetrics;\n\n const sumNumeric = (type: string): number | undefined => {\n let total = 0;\n let found = false;\n for (const m of output.getDisplayMetrics({ types: [type as MetricType] })) {\n if (typeof m.value === 'number') {\n total += m.value;\n found = true;\n }\n }\n return found ? total : undefined;\n };\n\n const amountOf = (type: string): { value: number; unit?: string } | undefined => {\n const metric = output.getMetric(type as MetricType);\n if (!metric) return undefined;\n const value = numericMetricValue(metric);\n if (value === undefined) return undefined;\n const embeddedUnit = embeddedMetricUnit(metric);\n return { value, unit: embeddedUnit ?? metric.unit };\n };\n\n const reps = sumNumeric(MetricType.Rep);\n const elapsed = typeof output.getMetric(MetricType.Elapsed)?.value === 'number'\n ? (output.getMetric(MetricType.Elapsed)!.value as number)\n : undefined;\n const distance = amountOf(MetricType.Distance);\n const resistance = amountOf(MetricType.Resistance);\n const effortData = extractEffortData(raw);\n const effortLabel = [...raw].reverse().find((m) => m.type === MetricType.Effort && typeof m.value === 'string');\n // Climb send detection: a `climb-send-type` metric (onsight/flash/redpoint…)\n // marks this segment as one completed send; the grade stars the fact row so\n // WQL groups sends `by {grade}`. Metric type strings mirror ClimbMetricType\n // (src/dialects/ClimbDialect) without a core→dialects dependency.\n const climbSend = [...raw].some((m) => m.type === 'climb-send-type');\n const climbGradeValue = [...raw].find((m) => m.type === 'climb-grade')?.value;\n const climbGradeLabel =\n climbGradeValue && typeof climbGradeValue === 'object' && 'raw' in climbGradeValue\n ? String((climbGradeValue as { raw: unknown }).raw)\n : undefined;\n\n return {\n resolveRef: (name) => {\n switch (name) {\n case 'reps': return reps === undefined ? ABSENT : num(reps, STREAM_ATOMS.reps.dim, 'reps');\n case 'elapsed': return elapsed === undefined ? ABSENT : num(elapsed, STREAM_ATOMS.elapsed.dim, 'ms');\n case 'distance': return distance === undefined ? ABSENT : num(distance.value, STREAM_ATOMS.distance.dim, distance.unit ?? 'm');\n case 'resistance': return resistance === undefined ? ABSENT : num(resistance.value, STREAM_ATOMS.resistance.dim, resistance.unit ?? 'kg');\n case 'climbSend': return climbSend ? num(1, STREAM_ATOMS.reps.dim, 'count') : ABSENT;\n case 'climbGrade': return climbGradeLabel ? str(climbGradeLabel) : ABSENT;\n case 'effort': {\n // Never absent: unresolved/never-seen effort resolves through the\n // effort table's default row (default MET, estimated) — the\n // historical fallback path.\n const slug = effortData?.resolved.slug ?? lastEffortSlug ?? '';\n return str(slug);\n }\n case 'effortLabel': return effortLabel ? str(effortLabel.value as string) : ABSENT;\n default: return ABSENT;\n }\n },\n };\n}\n\n/** Numeric value of a metric, unwrapping `{amount, units}` objects. */\nfunction numericMetricValue(metric: IMetric): number | undefined {\n if (typeof metric.value === 'number') return metric.value;\n const value = metric.value;\n if (value && typeof value === 'object' && 'amount' in value && typeof value.amount === 'number') {\n return value.amount;\n }\n return undefined;\n}\n\n/** Unit embedded in an `{amount, units}` metric value. */\nfunction embeddedMetricUnit(metric: IMetric): string | undefined {\n const value = metric.value;\n if (value && typeof value === 'object' && 'units' in value && typeof value.units === 'string' && value.units) {\n return value.units;\n }\n return undefined;\n}\n\n// ── Workout-scope helpers ────────────────────────────────────────────────\n\n/** toSlug parity with RepProjectionEngine. */\nfunction toSlug(text: string): string {\n return text.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '');\n}\n\n/** Segment's effort identity: resolved slug, else slugified raw label. */\nfunction segmentEffort(output: IOutputStatement): SegmentEffort {\n const data = extractEffortData(output.metrics.rawMetrics);\n if (data) return { slug: data.resolved.slug, label: data.resolved.label };\n const raw = [...output.metrics.rawMetrics].reverse().find((m) => m.type === MetricType.Effort && typeof m.value === 'string');\n if (!raw) return { slug: '', label: '' };\n return { slug: toSlug(raw.value as string), label: raw.value as string };\n}\n\n/** Exclusion patterns: `rest|pause|rest-*` — exact or trailing-glob prefix. */\nfunction matchesExclusion(slug: string, exclusion: string): boolean {\n for (const pattern of exclusion.split('|')) {\n const p = pattern.trim();\n if (!p) continue;\n if (p.endsWith('*')) {\n if (slug.startsWith(p.slice(0, -1))) return true;\n } else if (slug === p) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * `session.duration` — the hierarchy-aware disambiguation (§10.2), ported\n * exactly from SessionLoadProjectionEngine: a root segment's elapsed wins;\n * otherwise sum leaf-segment elapsed; fall back to all segments.\n */\nfunction sessionDuration(outputs: IOutputStatement[]): number | undefined {\n const segments = outputs.filter((o) => o.outputType === 'segment');\n if (segments.length === 0) return undefined;\n const root = segments.find((o) => o.stackLevel === 0 || o.sourceBlockKey === 'root');\n const elapsedOf = (o: IOutputStatement): number => {\n const v = o.getMetric(MetricType.Elapsed)?.value;\n return typeof v === 'number' ? v : 0;\n };\n if (root && elapsedOf(root) > 0) return elapsedOf(root);\n // Legacy parity: the fallback pool is every segment below the root level\n // (NOT just leaves) — SessionLoadProjectionEngine's exact rule.\n const belowRoot = segments.filter((o) => o.stackLevel > 0);\n const pool = belowRoot.length > 0 ? belowRoot : segments;\n const total = pool.reduce((sum, o) => sum + elapsedOf(o), 0);\n return total > 0 ? total : undefined;\n}\n\n/** Last numeric metric of a type across the stream (SessionRPE capture). */\nfunction lastMetricNumber(segments: IOutputStatement[], type: string): number | undefined {\n let last: number | undefined;\n for (const segment of segments) {\n for (const metric of segment.metrics.rawMetrics) {\n if (metric.type !== type) continue;\n const value = numericMetricValue(metric);\n if (value !== undefined) last = value;\n }\n }\n return last;\n}\n\n/** Compact display formatting for annotation images. */\nfunction formatNumber(value: number): string {\n return Number.isInteger(value) ? String(value) : value.toFixed(2).replace(/\\.?0+$/, '');\n}\n","/**\n * Lookup table registry (spec §4).\n *\n * Tables are adapters over heterogeneous sources (effort resolver, static\n * maps, user profile) exposing a uniform single-row lookup contract:\n * `lookup(\"table\", keyExpr, \"field\")`. Registration is layered —\n * bundled → dialect → user — with later layers replacing earlier ones\n * (mirrors the Dialect Stack's personal-overrides-last rule). Miss behavior\n * is per-table: `absent` yields the absent value; `default-row` yields a\n * synthetic row so calcs never see a miss.\n */\n\nimport { DimVector } from './dimensions';\nimport { CalcEvalError, EvalContext } from './evaluator';\nimport { ABSENT, Val } from './values';\n\nexport interface LookupFieldDef {\n dimension: DimVector;\n type: 'number' | 'string';\n}\n\nexport interface ILookupTable {\n readonly id: string;\n readonly fields: Record<string, LookupFieldDef>;\n readonly missPolicy: 'absent' | 'default-row';\n /** Single-row lookup. `absent` tables return undefined on a miss. */\n get(key: string, field: string): Val | undefined;\n}\n\nexport type LookupLayer = 'bundled' | 'dialect' | 'user';\n\nconst LAYER_RANK: Record<LookupLayer, number> = { bundled: 0, dialect: 1, user: 2 };\n\nexport class LookupRegistry {\n private readonly tables = new Map<string, { table: ILookupTable; layer: LookupLayer }>();\n\n /** Register a table; a later-or-equal layer replaces the existing entry. */\n register(table: ILookupTable, layer: LookupLayer = 'bundled'): void {\n const existing = this.tables.get(table.id);\n if (existing && LAYER_RANK[existing.layer] > LAYER_RANK[layer]) return;\n this.tables.set(table.id, { table, layer });\n }\n\n get(tableId: string): ILookupTable | undefined {\n return this.tables.get(tableId)?.table;\n }\n\n /** Field dimension for static checking; undefined when table/field unknown. */\n fieldDim(tableId: string, field: string): DimVector | undefined {\n return this.tables.get(tableId)?.table.fields[field]?.dimension;\n }\n\n /** Runtime lookup honoring the table's miss policy. */\n lookup(tableId: string, key: string, field: string): Val {\n const table = this.tables.get(tableId)?.table;\n if (!table) return ABSENT;\n return table.get(key, field) ?? ABSENT;\n }\n\n /**\n * EvalContext `callFunction` implementation for `lookup(\"table\", key, \"field\")`.\n * Compose with other extension functions (aggregates) at the engine layer.\n */\n readonly callFunction: EvalContext['callFunction'] = (name, args) => {\n if (name !== 'lookup') return undefined;\n const [table, key, field] = args;\n if (table?.kind !== 'string' || field?.kind !== 'string') {\n throw new CalcEvalError('lookup() table and field must be strings');\n }\n if (key.kind === 'absent' || key.kind === 'series' || key.kind === 'period') return ABSENT;\n const keyStr = key.kind === 'string' ? key.value : String(key.value);\n return this.lookup(table.value, keyStr, field.value);\n };\n}\n","/**\n * Built-in calculation suite as DAG seed records (#849 resolution 4: seeds\n * are TS object literals; no parser on the critical path — the line-form\n * parser's acceptance test is round-tripping these exact records).\n *\n * This is spec §6 compiled to record form, with the migration decisions\n * baked in:\n * - rest exclusion pinned once as the shared filter `rest|pause|rest-*` (§10.6);\n * - origin provenance via the metMinutesEstimated companion count (§10.3);\n * - TIS intermediate nodes published as fact metadata (§10.4);\n * - durationScore carries a `pts` cast — §5.3 applied to intermediates so\n * the score algebra passes static dimension checking;\n * - rounding lives in `round()` where today rounds, nowhere else (§10.9).\n */\n\nimport { CalculationDefinition } from './types';\n\n/** Shared rest/pause exclusion filter constant (§10.6). */\nexport const REST_EXCLUSION = 'rest|pause|rest-*';\n\nconst expr = (id: string, expression: string, unit?: string) =>\n ({ id, kind: 'expr' as const, expression, unit });\n\nexport const BUILTIN_CALCS: CalculationDefinition[] = [\n // ── segment scope (Tier-1 annotations) ────────────────────────────────\n {\n id: 'pace-reps',\n kind: 'output',\n scope: 'segment',\n fences: ['time', 'log'],\n when: 'elapsed > 0 and has(reps)',\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: { value: expr('value', 'reps / convert(elapsed, min)') },\n }],\n output: { nodeId: 'value', emitType: 'pace', unit: 'reps/min' },\n },\n {\n id: 'pace-speed',\n kind: 'output',\n scope: 'segment',\n fences: ['time', 'log'],\n when: 'elapsed > 0 and has(distance)',\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: { value: expr('value', 'distance / convert(elapsed, s)') },\n }],\n output: { nodeId: 'value', emitType: 'pace', unit: 'm/s' },\n },\n {\n id: 'pace-runner',\n kind: 'output',\n scope: 'segment',\n fences: ['time', 'log'],\n when: 'elapsed > 0 and has(distance)',\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: { value: expr('value', 'convert(elapsed, min) / convert(distance, km)') },\n }],\n output: { nodeId: 'value', emitType: 'pace', unit: 'min/km' },\n },\n {\n id: 'power',\n kind: 'output',\n scope: 'segment',\n fences: ['time', 'log'],\n when: 'elapsed > 0 and has(reps) and has(resistance)',\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: { value: expr('value', 'reps * resistance / convert(elapsed, s)') },\n }],\n output: { nodeId: 'value', emitType: 'power', unit: 'auto' },\n },\n {\n id: 'segment-volume',\n kind: 'library',\n scope: 'segment',\n when: 'has(reps) and has(resistance)',\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: { segmentVolume: expr('segmentVolume', 'reps * resistance') },\n }],\n },\n // Estimated one-rep max (#904) — Epley: load × (1 + reps/30). Bodyweight\n // segments (no resistance) produce no estimate by construction, which\n // sidesteps the missing bodyweight profile field; an RPE/RIR-adjusted\n // variant can layer on later via effortRpe (higher priority, same key).\n // emitType carries the full `calc.e1rm` key so segment-grain facts and\n // WQL (`max:calc.e1rm{} by {effort}`) resolve it directly.\n {\n id: 'e1rm',\n kind: 'output',\n scope: 'segment',\n fences: ['time', 'log'],\n when: 'has(reps) and has(resistance) and reps > 0 and resistance > 0',\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: {\n // ratio cast (§5.3): reps is count-dimensioned, the Epley factor\n // must be dimensionless for 1 + reps/30 to type-check.\n repFactor: expr('repFactor', 'reps / 30', 'ratio'),\n value: expr('value', 'round(resistance * (1 + repFactor), 1)'),\n },\n }],\n output: { nodeId: 'value', emitType: 'calc.e1rm', key: 'calc.e1rm', unit: 'auto', label: 'Estimated 1RM' },\n },\n {\n // %1RM intensity — the Epley inverse: a set of N reps ≈ 100/(1+N/30)%\n // of that set's projected e1RM. Independent of load history, so it needs\n // no profile 1RM; the dashboard tracks intensity by `by {week}`.\n id: 'pct1rm',\n kind: 'output',\n scope: 'segment',\n fences: ['time', 'log'],\n when: 'has(reps) and has(resistance) and reps > 0',\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: {\n repFactor: expr('repFactor', 'reps / 30', 'ratio'),\n value: expr('value', '100 / (1 + repFactor)'),\n },\n }],\n output: { nodeId: 'value', emitType: 'calc.pct1rm', key: 'calc.pct1rm', unit: '%', label: '%1RM Intensity' },\n },\n {\n // Climbing sends — one counted unit per completed send (a segment whose\n // ClimbDialect marked a climb-send-type). Metadata carries the grade so\n // `count:calc.sends{} by {grade}` builds the pyramid.\n id: 'climb-sends',\n kind: 'output',\n scope: 'segment',\n fences: ['time', 'log'],\n when: 'has(climbSend)',\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: { value: expr('value', 'climbSend') },\n }],\n output: { nodeId: 'value', emitType: 'calc.sends', key: 'calc.sends', unit: 'count', label: 'Sends' },\n },\n {\n id: 'effort-rpe',\n kind: 'library',\n scope: 'segment',\n when: 'has(effortLabel)',\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: { effortRpe: expr('effortRpe', 'lookup(\"rpe-labels\", effortLabel, \"rpe\")') },\n }],\n },\n {\n id: 'met-minutes-segment',\n kind: 'library',\n scope: 'segment',\n // Fenced like the legacy MetMinuteProjectionEngine — segment-scope only\n // (its workout consumer is fenced too).\n fences: ['time', 'log'],\n when: 'elapsed > 0',\n variants: [\n {\n id: 'resolved', priority: 100,\n when: 'lookup(\"effort\", effort, \"resolvedFrom\") != \"default\"',\n origin: 'analyzed',\n nodes: { metMinutes: expr('metMinutes', 'lookup(\"effort\", effort, \"met\") * convert(elapsed, min)') },\n },\n {\n id: 'unresolved', priority: 10,\n origin: 'analyzed-estimated',\n nodes: {\n metMinutes: expr('metMinutes', 'lookup(\"effort\", effort, \"met\") * convert(elapsed, min)'),\n // Companion count (§10.3): workout variants predicate on this.\n metMinutesEstimated: expr('metMinutesEstimated', '1'),\n },\n },\n ],\n },\n\n // ── workout scope (Tier-2 summaries) ───────────────────────────────────\n {\n id: 'total-reps',\n kind: 'output',\n scope: 'workout',\n fences: ['time', 'log'],\n when: 'has(sum(reps)) and sum(reps) > 0',\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: { total: expr('total', 'sum(reps)') },\n }],\n output: { nodeId: 'total', key: 'reps', emitType: 'rep', unit: 'reps' },\n },\n {\n id: 'total-reps-by-effort',\n kind: 'output',\n scope: 'workout',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: { total: expr('total', `sum(reps, without: ${REST_EXCLUSION})`) },\n }],\n output: { nodeId: 'total', key: 'reps', emitType: 'rep', unit: 'reps', isGrouped: true, groupBy: ['effort'] },\n },\n {\n id: 'total-distance',\n kind: 'output',\n scope: 'workout',\n fences: ['time', 'log'],\n when: 'has(sum(distance)) and sum(distance) > 0',\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: { total: expr('total', 'sum(distance)') },\n }],\n output: { nodeId: 'total', key: 'distance', emitType: 'distance', unit: 'auto' },\n },\n {\n id: 'total-volume',\n kind: 'output',\n scope: 'workout',\n fences: ['time', 'log'],\n when: 'has(sum(segmentVolume)) and sum(segmentVolume) > 0',\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: { total: expr('total', 'sum(segmentVolume)') },\n }],\n output: { nodeId: 'total', key: 'totalVolume', emitType: 'volume', unit: 'auto' },\n },\n {\n id: 'total-volume-by-effort',\n kind: 'output',\n scope: 'workout',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: {\n total: expr('total', 'sum(segmentVolume)'),\n totalSets: expr('totalSets', 'count(segmentVolume)'),\n },\n }],\n output: {\n nodeId: 'total', key: 'totalVolume', emitType: 'volume', unit: 'auto',\n isGrouped: true, groupBy: ['effort'], publishMetadataNodes: ['totalSets'],\n },\n },\n {\n id: 'met-minutes',\n kind: 'output',\n scope: 'workout',\n fences: ['time', 'log'],\n when: 'has(sum(metMinutes))',\n variants: [\n {\n // Companion-count provenance (§10.3): any estimated segment flags\n // the whole workout estimated — today's resolveDominantOrigin rule.\n id: 'estimated', priority: 100,\n when: 'sum(metMinutesEstimated) > 0',\n origin: 'analyzed-estimated',\n nodes: { total: expr('total', 'round(sum(metMinutes))') },\n },\n {\n id: 'resolved', priority: 10,\n origin: 'analyzed',\n nodes: { total: expr('total', 'round(sum(metMinutes))') },\n },\n ],\n output: { nodeId: 'total', key: 'calc.metMinutes', emitType: 'work', unit: 'MET-min' },\n },\n {\n id: 'rpeSource',\n kind: 'library',\n scope: 'workout',\n variants: [\n {\n id: 'captured', priority: 100,\n when: 'has(sessionRpe)',\n origin: 'analyzed',\n nodes: { rpe: expr('rpe', 'sessionRpe') },\n },\n {\n id: 'label', priority: 50,\n when: 'has(max(effortRpe))',\n origin: 'analyzed',\n nodes: { rpe: expr('rpe', 'max(effortRpe)') },\n },\n {\n id: 'default', priority: 10,\n origin: 'analyzed-estimated',\n nodes: { rpe: expr('rpe', '5') },\n },\n ],\n },\n {\n id: 'session-load',\n kind: 'output',\n scope: 'workout',\n fences: ['time', 'log'],\n when: 'has(session.duration)',\n variants: [\n {\n id: 'captured-rpe', priority: 100,\n when: 'has(sessionRpe)',\n origin: 'analyzed',\n nodes: sessionLoadNodes(),\n },\n {\n id: 'label-rpe', priority: 50,\n when: 'has(max(effortRpe))',\n origin: 'analyzed',\n nodes: sessionLoadNodes(),\n },\n {\n id: 'default-rpe', priority: 10,\n origin: 'analyzed-estimated',\n nodes: sessionLoadNodes(),\n },\n ],\n output: {\n nodeId: 'load', key: 'sessionLoad', emitType: 'load', unit: 'AU',\n publishMetadataNodes: ['sRPE', 'durationMinutes'],\n },\n },\n {\n id: 'sharedMet',\n kind: 'library',\n scope: 'workout',\n variants: [\n {\n id: 'personalized', priority: 100,\n when: 'has(profile.vo2max)',\n origin: 'analyzed',\n nodes: { metMax: expr('metMax', 'profile.vo2max / 3.5') },\n },\n {\n id: 'population', priority: 10,\n origin: 'analyzed',\n nodes: { metMax: expr('metMax', '11.4') },\n },\n ],\n },\n {\n id: 'tis',\n kind: 'output',\n scope: 'workout',\n fences: ['time', 'log'],\n when: 'has(sum(metMinutes)) and has(sum(elapsed))',\n variants: [\n {\n // Today's origin rule: estimated iff any elapsed-bearing segment had\n // unresolved effort (dominant-origin via the companion count, §10.3).\n id: 'resolved', priority: 100,\n when: 'not (sum(metMinutesEstimated) > 0)',\n origin: 'analyzed',\n nodes: tisNodes(),\n },\n {\n id: 'estimated', priority: 10,\n origin: 'analyzed-estimated',\n nodes: tisNodes(),\n },\n ],\n output: {\n nodeId: 'tis', key: 'tis', emitType: 'tis', unit: 'pts',\n publishMetadataNodes: ['metScore', 'rpeScore', 'durationScore', 'disciplineFactor', 'metMax'],\n },\n },\n];\n\n/** SessionLoad node graph — identical across variants, only the origin differs. */\nfunction sessionLoadNodes(): CalculationDefinition['variants'][number]['nodes'] {\n return {\n sRPE: expr('sRPE', 'rpeSource.rpe'),\n durationMinutes: expr('durationMinutes', 'convert(session.duration, min)'),\n load: expr('load', 'round(rpeSource.rpe * convert(session.duration, min))'),\n };\n}\n\n/** TIS node graph — identical across variants, only the origin differs. */\nfunction tisNodes(): CalculationDefinition['variants'][number]['nodes'] {\n return {\n elapsedMin: expr('elapsedMin', 'convert(sum(elapsed), min)'),\n avgMets: expr('avgMets', 'sum(metMinutes) / elapsedMin'),\n metMax: expr('metMax', 'sharedMet.metMax'),\n metScore: expr('metScore', 'min(100, avgMets / metMax * 100)'),\n rpeScore: expr('rpeScore', 'rpeSource.rpe * 10'),\n // The pts cast (§5.3 on intermediates): hours×score folds time into the\n // dimensionless score algebra so the weighted sum type-checks.\n durationScore: expr('durationScore', 'elapsedMin / 60 * metScore', 'pts'),\n disciplineFactor: expr('disciplineFactor', 'lookup(\"effort\", effort, \"disciplineFactor\")'),\n tis: expr('tis', 'round(0.30 * metScore + 0.35 * rpeScore + 0.20 * durationScore + 0.15 * disciplineFactor, 1)'),\n };\n}\n\n// ── store scope (cross-workout rollups, #877) ──────────────────────────────\n//\n// ACWR / monotony / strain as composed calcs — the rollup absorption (#850).\n// Window semantics are parity-pinned to workloadRollup.ts (#864): trailing\n// windows over a zero-filled continuous day domain, population SD, strain =\n// monotony × weekly sum. Each output publishes one fact per series point.\n\nconst dailyLoads = () => ({ id: 'daily', kind: 'wql' as const, expression: 'sum:sessionLoad{} by {day}' });\n\nexport const STORE_CALCS: CalculationDefinition[] = [\n {\n id: 'acwr',\n kind: 'output',\n scope: 'store',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: {\n daily: dailyLoads(),\n acute: expr('acute', 'windowMean(daily, 7d)'),\n chronic: expr('chronic', 'windowMean(daily, 28d)'),\n value: expr('value', 'acute / chronic'),\n },\n }],\n output: { nodeId: 'value', key: 'calc.acwr', unit: 'ratio', label: 'Acute:Chronic Workload Ratio' },\n },\n {\n id: 'monotony',\n kind: 'output',\n scope: 'store',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: {\n daily: dailyLoads(),\n mean7: expr('mean7', 'windowMean(daily, 7d)'),\n sd7: expr('sd7', 'windowSd(daily, 7d)'),\n value: expr('value', 'mean7 / sd7'),\n },\n }],\n output: { nodeId: 'value', key: 'calc.monotony', unit: 'ratio', label: 'Training Monotony' },\n },\n {\n id: 'strain',\n kind: 'output',\n scope: 'store',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: {\n daily: dailyLoads(),\n monotony: expr('monotony', 'windowMean(daily, 7d) / windowSd(daily, 7d)', 'ratio'),\n weekly: expr('weekly', 'windowSum(daily, 7d)'),\n value: expr('value', 'monotony * weekly'),\n },\n }],\n output: { nodeId: 'value', key: 'calc.strain', unit: 'AU', label: 'Training Strain' },\n },\n // ── PMC (#905): CTL/ATL/TSB as EWMAs over daily sessionLoad. Canonical\n // TrainingPeaks gains (1/42, 1/7); TSB = CTL − ATL pointwise. A composite\n // `calc.pmc` series widget is out of scope for this map — the three scalar\n // loads feed value/zone/goal widgets individually.\n {\n id: 'ctl',\n kind: 'output',\n scope: 'store',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: {\n daily: dailyLoads(),\n value: expr('value', 'windowEwma(daily, 42d)'),\n },\n }],\n output: { nodeId: 'value', key: 'calc.ctl', unit: 'AU', label: 'Chronic Training Load (CTL)' },\n },\n {\n id: 'atl',\n kind: 'output',\n scope: 'store',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: {\n daily: dailyLoads(),\n value: expr('value', 'windowEwma(daily, 7d)'),\n },\n }],\n output: { nodeId: 'value', key: 'calc.atl', unit: 'AU', label: 'Acute Training Load (ATL)' },\n },\n {\n id: 'tsb',\n kind: 'output',\n scope: 'store',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: {\n daily: dailyLoads(),\n ctl: expr('ctl', 'windowEwma(daily, 42d)'),\n atl: expr('atl', 'windowEwma(daily, 7d)'),\n value: expr('value', 'ctl - atl'),\n },\n }],\n output: { nodeId: 'value', key: 'calc.tsb', unit: 'AU', label: 'Training Stress Balance (TSB)' },\n },\n // ── Wellness metrics (user-captured ```wellness fences, #901 placeholders\n // landed): the capture writes day-grain user facts under raw keys\n // (soreness / sleep / hrv / weight / hang / hr / planned); these seeds\n // publish the `calc.*` rollup rows the dashboards query. Passthroughs keep\n // the calc.* = engine-published convention; composites derive from the\n // captured series. The `x * (x / x)` masks suppress zero-filled days\n // (0/0 drops the point) so unchecked days emit NO row instead of a\n // misleading zero.\n {\n id: 'soreness',\n kind: 'output',\n scope: 'store',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'user',\n nodes: {\n daily: { id: 'daily', kind: 'wql' as const, expression: 'avg:soreness{} by {day}' },\n value: expr('value', 'daily * (daily / daily)'),\n },\n }],\n output: { nodeId: 'value', key: 'calc.soreness', unit: 'rating', label: 'Soreness' },\n },\n {\n id: 'sleep',\n kind: 'output',\n scope: 'store',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'user',\n nodes: {\n daily: { id: 'daily', kind: 'wql' as const, expression: 'avg:sleep{} by {day}' },\n value: expr('value', 'daily * (daily / daily)'),\n },\n }],\n output: { nodeId: 'value', key: 'calc.sleep', unit: 'pts', label: 'Sleep (h)' },\n },\n {\n id: 'hrv',\n kind: 'output',\n scope: 'store',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'user',\n nodes: {\n daily: { id: 'daily', kind: 'wql' as const, expression: 'avg:hrv{} by {day}' },\n value: expr('value', 'daily * (daily / daily)'),\n },\n }],\n output: { nodeId: 'value', key: 'calc.hrv', unit: 'pts', label: 'HRV (ms)' },\n },\n {\n // Readiness composite: soreness (inverted) 40%, sleep 30%, HRV 30%,\n // normalized to ~0-100. Pure arithmetic over the captured day series —\n // no clamp/min (those are scalar-only in the evaluator). Masks drop any\n // day missing one of the three inputs.\n id: 'readiness',\n kind: 'output',\n scope: 'store',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: {\n soreness: { id: 'soreness', kind: 'wql' as const, expression: 'avg:soreness{} by {day}' },\n sleep: { id: 'sleep', kind: 'wql' as const, expression: 'avg:sleep{} by {day}' },\n hrv: { id: 'hrv', kind: 'wql' as const, expression: 'avg:hrv{} by {day}' },\n value: expr('value', '((10 - soreness) / 10 * 40 + sleep / 8 * 30 + hrv / 90 * 30) * (soreness / soreness) * (sleep / sleep) * (hrv / hrv)'),\n },\n }],\n output: { nodeId: 'value', key: 'calc.readiness', unit: 'pts', label: 'Readiness' },\n },\n {\n // Max-hang MVC as % of bodyweight — the hangboard benchmark. Captured\n // `hang` (max hang added weight, kg) over `weight` (bodyweight, kg).\n id: 'mvcBw',\n kind: 'output',\n scope: 'store',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: {\n hang: { id: 'hang', kind: 'wql' as const, expression: 'max:hang{} by {day}' },\n weight: { id: 'weight', kind: 'wql' as const, expression: 'avg:weight{} by {day}' },\n value: expr('value', 'hang / weight * 100'),\n },\n }],\n output: { nodeId: 'value', key: 'calc.mvcBw', unit: '%', label: 'Max Hang %BW' },\n },\n {\n // Efficiency factor — running pace per beat of captured average HR.\n // pace (m/s) is cast to pts (§5.3 authoritative cast) so the ratio with\n // HR type-checks; the value is a normalized efficiency score.\n id: 'ef',\n kind: 'output',\n scope: 'store',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: {\n dist: { id: 'dist', kind: 'wql' as const, expression: 'sum:totalDistance{discipline:running} by {day}' },\n elapsed: { id: 'elapsed', kind: 'wql' as const, expression: 'sum:elapsed{discipline:running} by {day}' },\n hr: { id: 'hr', kind: 'wql' as const, expression: 'avg:hr{} by {day}' },\n // pace m/s — elapsed facts are ms, so scale to seconds first.\n pace: expr('pace', 'dist / (elapsed / 1000)', 'pts'),\n value: expr('value', 'pace / hr * 100000', 'pts'),\n },\n }],\n output: { nodeId: 'value', key: 'calc.ef', unit: 'pts', label: 'Efficiency Factor' },\n },\n {\n // Plan adherence — completed sessions over planned sessions per day.\n // `planned` is captured in wellness fences; sessions are counted facts.\n id: 'adherence',\n kind: 'output',\n scope: 'store',\n fences: ['time', 'log'],\n variants: [{\n id: 'default', priority: 10, origin: 'analyzed',\n nodes: {\n sessions: { id: 'sessions', kind: 'wql' as const, expression: 'count:sessionLoad{} by {day}' },\n planned: { id: 'planned', kind: 'wql' as const, expression: 'avg:planned{} by {day}' },\n value: expr('value', 'sessions / planned'),\n },\n }],\n output: { nodeId: 'value', key: 'calc.adherence', unit: 'ratio', label: 'Plan Adherence' },\n },\n];\n","/**\n * Built-in lookup table adapters (spec §4.1).\n *\n * - `effort` — IEffortResolver-backed; preserves fuzzy matching, aliases,\n * derivations, modifiers. Miss policy `default-row`: the resolver's\n * synthetic unresolved effort (default MET 5.0, flagged isEstimated)\n * guarantees a row for any key.\n * - `rpe-labels` — effort label → RPE map shared by SessionLoad and TIS\n * (replaces the duplicated effortToRpe maps, review doc §7 note b).\n * - `profile` — user profile attributes (vo2max). Miss policy `absent`.\n * - `disciplines` — canonical discipline factor table. Miss policy\n * `default-row` (1.0).\n */\n\nimport type { IEffortResolver } from '../../effort-registry/types';\nimport { DEFAULT_RESOLVER_OPTIONS } from '../../effort-registry/types';\nimport { disciplineFactorFor, isEffortDiscipline } from '../../effort-registry/disciplines';\nimport { DIM_ZERO } from './dimensions';\nimport { ILookupTable } from './lookup';\nimport { num, str, Val } from './values';\n\n/** Label → RPE. Canonical map (SessionLoadProjectionEngine / TISProcessor). */\nexport const RPE_LABELS: Record<string, number> = {\n easy: 3,\n moderate: 5,\n hard: 7,\n 'all-out': 10,\n max: 10,\n};\n\nexport function createEffortTable(resolver: IEffortResolver): ILookupTable {\n return {\n id: 'effort',\n missPolicy: 'default-row',\n fields: {\n met: { dimension: DIM_ZERO, type: 'number' },\n disciplineFactor: { dimension: DIM_ZERO, type: 'number' },\n discipline: { dimension: DIM_ZERO, type: 'string' },\n intensityTier: { dimension: DIM_ZERO, type: 'string' },\n resolvedFrom: { dimension: DIM_ZERO, type: 'string' },\n isEstimated: { dimension: DIM_ZERO, type: 'number' },\n },\n get(key, field): Val | undefined {\n // Empty key (no effort seen yet in the stream) is the historical\n // DEFAULT_UNRESOLVED_EFFORT_MET path: synthetic default row, estimated.\n if (!key) {\n switch (field) {\n case 'met': return num(DEFAULT_RESOLVER_OPTIONS.defaultMet);\n case 'disciplineFactor': return num(1.0);\n case 'resolvedFrom': return str('default');\n case 'isEstimated': return num(1);\n default: return undefined;\n }\n }\n // resolveEffort never misses: unknown keys resolve to the synthetic\n // unresolved effort (default MET, isEstimated) — the default row.\n const resolved = resolver.resolveEffort(key);\n switch (field) {\n case 'met': return num(resolved.met);\n case 'disciplineFactor': return num(resolved.disciplineFactor);\n case 'discipline': return resolved.discipline ? str(resolved.discipline) : undefined;\n case 'intensityTier': return resolved.intensityTier ? str(resolved.intensityTier) : undefined;\n case 'resolvedFrom': return str(resolved.resolvedFrom);\n case 'isEstimated': return num(resolved.isEstimated ? 1 : 0);\n default: return undefined;\n }\n },\n };\n}\n\nexport function createRpeLabelsTable(): ILookupTable {\n return {\n id: 'rpe-labels',\n missPolicy: 'absent',\n fields: { rpe: { dimension: DIM_ZERO, type: 'number' } },\n get(key, field): Val | undefined {\n if (field !== 'rpe') return undefined;\n const rpe = RPE_LABELS[key.toLowerCase()];\n return rpe === undefined ? undefined : num(rpe);\n },\n };\n}\n\nexport interface IProfileSource {\n readonly vo2max?: number;\n}\n\nexport function createProfileTable(profile: IProfileSource | undefined): ILookupTable {\n return {\n id: 'profile',\n missPolicy: 'absent',\n fields: { vo2max: { dimension: DIM_ZERO, type: 'number' } },\n get(_key, field): Val | undefined {\n if (field !== 'vo2max') return undefined;\n return profile?.vo2max === undefined ? undefined : num(profile.vo2max);\n },\n };\n}\n\nexport function createDisciplinesTable(): ILookupTable {\n return {\n id: 'disciplines',\n missPolicy: 'default-row',\n fields: { disciplineFactor: { dimension: DIM_ZERO, type: 'number' } },\n get(key, field): Val | undefined {\n if (field !== 'disciplineFactor') return undefined;\n return num(isEffortDiscipline(key) ? disciplineFactorFor(key) : 1.0);\n },\n };\n}\n","/**\n * Factory for a fully-seeded composed calculation stack: lookup registry\n * with the four built-in adapters, calculation registry with the built-in\n * suite statically validated, and the engine ready to join an\n * AnalyticsEngine processor chain.\n */\n\nimport type { IEffortResolver } from '../../effort-registry/types';\nimport { CalcEngine } from './engine';\nimport { LookupRegistry } from './lookup';\nimport { CalculationRegistry } from './registry';\nimport { BUILTIN_CALCS } from './seeds';\nimport { createDisciplinesTable, createEffortTable, createProfileTable, createRpeLabelsTable, IProfileSource } from './tables';\nimport { CalculationDefinition } from './types';\n\nexport interface CalcStackOptions {\n effortResolver: IEffortResolver;\n userProfile?: IProfileSource;\n /** Extra/override calcs (dialect, user) registered after the built-ins. */\n calcs?: CalculationDefinition[];\n}\n\nexport interface CalcStack {\n lookups: LookupRegistry;\n registry: CalculationRegistry;\n}\n\nexport function createCalcStack(options: CalcStackOptions): CalcStack {\n const lookups = new LookupRegistry();\n lookups.register(createEffortTable(options.effortResolver));\n lookups.register(createRpeLabelsTable());\n lookups.register(createProfileTable(options.userProfile));\n lookups.register(createDisciplinesTable());\n\n const registry = new CalculationRegistry(lookups);\n for (const def of BUILTIN_CALCS) registry.register(def);\n for (const def of options.calcs ?? []) registry.register(def);\n return { lookups, registry };\n}\n\nexport function createCalcEngine(dialect: string, options: CalcStackOptions): CalcEngine {\n const stack = createCalcStack(options);\n return new CalcEngine(stack.registry, { dialect, lookups: stack.lookups, userProfile: options.userProfile });\n}\n","import type { IAnalyticsProfile, AnalyticsProfileContext } from './IAnalyticsProfile';\nimport type { IRealtimeProcessor } from './IRealtimeProcessor';\nimport type { ISummaryProcessor } from './ISummaryProcessor';\nimport type { IAnalyticsProcessorDescriptor } from './IAnalyticsProcessorDescriptor';\nimport { Registry } from '../registry/Registry';\nimport { TwoPassEffortResolutionProcess } from './TwoPassEffortResolutionProcess';\nimport { createCalcEngine } from './calc/factory';\n\n/**\n * Consumer-facing registries for analytics processors — extension points\n * for custom (e.g. sport-specific) processors. The built-in calculations\n * are no longer processors: they are registered composed calcs evaluated\n * by the CalcEngine (#879 cutover). Register custom processors with the\n * standard `register`/`unregister` shape.\n *\n * @example\n * ```typescript\n * import { summaryProcessorRegistry } from 'wod-wiki/core';\n * summaryProcessorRegistry.register(ClimbGradeProgressionProcess);\n * ```\n */\nexport const realtimeProcessorRegistry = new Registry<IRealtimeProcessor>([]);\n\nexport const summaryProcessorRegistry = new Registry<ISummaryProcessor>([]);\n\n/**\n * Standard built-in analytics profile.\n *\n * Chain: TwoPassEffortResolutionProcess (effort-data infrastructure) →\n * CalcEngine (the composed calculation layer: phase-1 segment annotations\n * as a realtime processor, phase-2 workout running totals as a summary\n * processor) → any custom registry processors. Applicability of individual\n * calcs is dynamic (`when` predicates, #848); the fence/requiredMetrics\n * filter below still applies to custom registry processors.\n */\nexport class StandardAnalyticsProfile implements IAnalyticsProfile {\n build(context: AnalyticsProfileContext): {\n realtime: IRealtimeProcessor[];\n summary: ISummaryProcessor[];\n } {\n const realtime: IRealtimeProcessor[] = [];\n const summary: ISummaryProcessor[] = [];\n\n // Two-pass effort resolution MUST run first so downstream processors\n // (and the calc engine's effort context node) see enriched\n // effort-data metrics. The calc engine needs the resolver for its\n // effort lookup table — without one, neither is registered.\n if (context.analyticsContext?.effortResolver) {\n realtime.push(new TwoPassEffortResolutionProcess(context.analyticsContext.effortResolver));\n const calcEngine = createCalcEngine(context.dialect, {\n effortResolver: context.analyticsContext.effortResolver,\n userProfile: context.userProfile,\n calcs: context.calcs,\n });\n realtime.push(calcEngine);\n summary.push(calcEngine);\n }\n\n realtime.push(...realtimeProcessorRegistry.list().filter(p => this.isApplicable(p, context)));\n summary.push(...summaryProcessorRegistry.list().filter(p => this.isApplicable(p, context)));\n\n return { realtime, summary };\n }\n\n private isApplicable(\n processor: IAnalyticsProcessorDescriptor,\n context: AnalyticsProfileContext\n ): boolean {\n // Fence-dialect filter: if `fenceTypes` is specified, context dialect must be in the list\n if (processor.fenceTypes && processor.fenceTypes.length > 0) {\n if (!processor.fenceTypes.includes(context.dialect)) {\n return false;\n }\n }\n\n // Required metrics filter: if requiredMetrics is specified, ALL must be present\n if (processor.requiredMetrics && processor.requiredMetrics.length > 0) {\n for (const required of processor.requiredMetrics) {\n if (!context.scriptMetricTypes.has(required)) {\n return false;\n }\n }\n }\n\n return true;\n }\n}\n","import { AnalyticsEngine } from './AnalyticsEngine';\nimport { StandardAnalyticsProfile } from './StandardAnalyticsProfile';\nimport type { AnalyticsProfileContext } from './IAnalyticsProfile';\nimport type { AnalyticsContext } from './AnalyticsContext';\nimport type { ScriptBlock } from '@bitcobblers/wod-wiki-core';\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { InMemoryEffortRegistry } from '../effort-registry/InMemoryEffortRegistry';\nimport { EffortResolver } from '../effort-registry/EffortResolver';\nimport { bundledEfforts } from '../effort-registry/data/bundled-efforts';\nimport type { IEffortResolver } from '../effort-registry/types';\nimport type { CalculationDefinition } from './calc/types';\n\nexport interface CreateAnalyticsEngineResult {\n engine: AnalyticsEngine;\n analyticsContext: AnalyticsContext;\n}\n\nexport interface CreateAnalyticsEngineOptions {\n effortResolver?: IEffortResolver;\n userProfile?: { vo2max?: number };\n /** User-authored composed calcs (#880), registered after the built-ins. */\n calcs?: CalculationDefinition[];\n}\n\n/**\n * Creates a fully-configured AnalyticsEngine for a workout block.\n *\n * Extracts the dialect and metric types from the block, builds a\n * StandardAnalyticsProfile, and assembles the engine with all\n * applicable realtime and summary processors.\n *\n * When no effortResolver is provided, creates a default one backed\n * by the bundled effort catalog (synchronously seeded).\n */\nexport function createAnalyticsEngineForBlock(\n block: ScriptBlock,\n options?: CreateAnalyticsEngineOptions\n): CreateAnalyticsEngineResult {\n const dialect = block.dialect || 'time';\n\n const scriptMetricTypes = new Set<MetricType | string>();\n if (block.statements) {\n for (const stmt of block.statements) {\n for (const metric of stmt.metrics) {\n scriptMetricTypes.add(metric.type);\n }\n }\n }\n\n let effortResolver = options?.effortResolver;\n if (!effortResolver) {\n const registry = new InMemoryEffortRegistry();\n registry.seed(bundledEfforts);\n effortResolver = new EffortResolver(registry);\n }\n\n const analyticsContext: AnalyticsContext = {\n effortResolver,\n };\n\n const context: AnalyticsProfileContext = {\n dialect,\n scriptMetricTypes,\n analyticsContext,\n userProfile: options?.userProfile,\n calcs: options?.calcs,\n };\n\n const profile = new StandardAnalyticsProfile();\n const { realtime, summary } = profile.build(context);\n\n const engine = new AnalyticsEngine();\n for (const processor of realtime) {\n engine.addRealtimeProcessor(processor);\n }\n for (const processor of summary) {\n engine.addSummaryProcessor(processor);\n }\n\n return { engine, analyticsContext };\n}\n","import { IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\nimport type { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { ChoiceGroupMetric } from './ChoiceGroupMetric';\n\n/**\n * ChoiceResolution — the single owner of \"collapse a Choice Group into a Statement\".\n *\n * A `ChoiceGroupMetric` (`MetricType.Choice`) is a slash-separated OR expression\n * emitted by Fusion. The runtime never understands a Choice; it must be collapsed\n * into a concrete alternative **before the JIT compiles the first WOD block**.\n *\n * Collapsing means replacing the `ChoiceGroupMetric` with the selected concrete\n * alternative at origin `user-plan`. After collapse, the statement no longer\n * contains `MetricType.Choice`; the runtime/compiler must only ever see the\n * concrete selected metric.\n *\n * Two seams use this module:\n * - The Pre-Run Wizard, when the user picks an alternative ({@link writeChoiceSelection}).\n * - {@link RuntimeFactory.createRuntime}, as the enforced safety net that defaults\n * any still-unresolved Choice before the runtime spins up ({@link collapseUnresolvedChoices}).\n *\n * This replaces the previously duplicated, inlined resolution logic that lived in\n * both `track-panel.tsx` and `RuntimeTimerPanel.tsx`.\n */\n\n/** A located, still-unresolved Choice Group awaiting a selection. */\nexport interface ChoiceGroupRef {\n /** Index into the statements array. */\n statementIndex: number;\n /** The owning statement's id. */\n statementId: number | string;\n /** The Choice Group metric carrying the alternatives. */\n choice: ChoiceGroupMetric;\n}\n\n/**\n * Whether a Choice Group has already been structurally collapsed out of its\n * statement. A present `ChoiceGroupMetric` is still unresolved, even if older\n * code also wrote a same-type `user-plan` metric beside it.\n */\nexport function isChoiceResolved(stmt: ICodeStatement, choice: ChoiceGroupMetric): boolean {\n return !stmt.metrics.some((m) => m === choice);\n}\n\n/** Find every Choice Group across the statements that has not yet been collapsed. */\nexport function findUnresolvedChoices(statements: readonly ICodeStatement[]): ChoiceGroupRef[] {\n const refs: ChoiceGroupRef[] = [];\n statements.forEach((stmt, statementIndex) => {\n for (const metric of stmt.metrics) {\n if (metric.type === MetricType.Choice) {\n const choice = metric as ChoiceGroupMetric;\n if (!isChoiceResolved(stmt, choice)) {\n refs.push({ statementIndex, statementId: stmt.id, choice });\n }\n }\n }\n });\n return refs;\n}\n\n/**\n * Collapse a Choice Group into a Statement by removing that group and writing\n * the selected alternative at origin `user-plan`. Idempotent: any prior\n * user-plan metric of the chosen type is removed first, so re-selecting\n * (default → user pick → different pick) never accumulates duplicates.\n *\n * @param stmt the statement owning the Choice Group\n * @param alternatives the Choice Group's alternatives\n * @param selectedIndex index of the chosen alternative (out-of-range falls back to 0)\n */\nexport function writeChoiceSelection(\n stmt: ICodeStatement,\n alternatives: readonly IMetric[],\n selectedIndex: number,\n): void {\n const chosen = alternatives[selectedIndex] ?? alternatives[0];\n if (!chosen) return;\n // Drop any prior user-plan pick of this type and remove the corresponding\n // ChoiceGroupMetric, then write the concrete selected metric.\n stmt.metrics.remove((m) => m.type === chosen.type && m.origin === 'user-plan');\n stmt.metrics.remove((m) => m.type === MetricType.Choice && (m as ChoiceGroupMetric).alternatives === alternatives);\n stmt.metrics.add({ ...chosen, origin: 'user-plan' });\n}\n\n/**\n * Safety net: collapse every still-unresolved Choice Group to its **first**\n * alternative (the documented pre-selected default). Run inside the runtime\n * factory before the first WOD block compiles, so a `MetricType.Choice` can never\n * reach a compiled Block. Selections already written by the wizard (a user-plan\n * metric of the chosen alternative type) are preserved while the stale Choice\n * group is removed.\n *\n * @returns the number of Choice Groups that were collapsed.\n */\nexport function collapseUnresolvedChoices(statements: readonly ICodeStatement[]): number {\n const unresolved = findUnresolvedChoices(statements);\n for (const ref of unresolved) {\n const stmt = statements[ref.statementIndex];\n const chosenType = ref.choice.alternatives[0]?.type;\n const hasExistingSelection = chosenType\n ? stmt.metrics.some((m) => m.type === chosenType && m.origin === 'user-plan')\n : false;\n if (hasExistingSelection) {\n stmt.metrics.remove((m) => m === ref.choice);\n } else {\n writeChoiceSelection(stmt, ref.choice.alternatives, 0);\n }\n }\n return unresolved.length;\n}\n","/**\n * RuntimeFactory - Service for creating ScriptRuntime instances\n * \n * This factory encapsulates the runtime creation logic, decoupling it from\n * UI components like WorkbenchContext. It handles:\n * - WhiteboardScript creation from block content\n * - ScriptRuntime instantiation with JIT compiler\n * - Root block compilation and mounting\n * - Optional debug mode enabling\n * \n * @example\n * ```typescript\n * const factory = new RuntimeFactory(createCompiler());\n * const runtime = factory.createRuntime(scriptBlock);\n * \n * // With debug mode\n * const debugRuntime = factory.createRuntime(scriptBlock, { debugMode: true });\n * ```\n */\n\nimport { ScriptRuntime } from '../ScriptRuntime';\nimport { RuntimeStack } from '../RuntimeStack';\nimport { RuntimeClock } from '../RuntimeClock';\nimport { EventBus } from '../events/EventBus';\nimport { JitCompiler } from './JitCompiler';\nimport { WhiteboardScript } from '../../parser/WhiteboardScript';\nimport type { ScriptBlock } from '@bitcobblers/wod-wiki-core';\nimport { RuntimeStackOptions } from '../contracts/IRuntimeOptions';\nimport type { IScriptRuntime } from '../contracts/IScriptRuntime';\nimport type { INowProvider } from '../INowProvider';\nimport { wallClockNow } from '../INowProvider';\nimport { StartSessionAction } from '../actions/stack/StartSessionAction';\nimport { createAnalyticsEngineForBlock } from '../../analytics/createAnalyticsEngineForBlock';\nimport { collapseUnresolvedChoices } from './metrics/ChoiceResolution';\n\n/**\n * Interface for runtime factory implementations\n * Allows for dependency injection and testing\n */\nexport interface IRuntimeFactory {\n /**\n * Creates a new ScriptRuntime from a ScriptBlock\n * @param block - The WOD block containing workout script and parsed statements\n * @param options - Optional runtime options (debug mode, logging, tracker, etc.)\n * @returns A fully initialized ScriptRuntime, or null if block has no statements\n */\n createRuntime(block: ScriptBlock, options?: RuntimeStackOptions): IScriptRuntime | null;\n\n /**\n * Disposes of a runtime and cleans up resources\n * @param runtime - The runtime to dispose\n */\n disposeRuntime(runtime: IScriptRuntime): void;\n}\n\n/**\n * Default implementation of IRuntimeFactory\n */\nexport class RuntimeFactory implements IRuntimeFactory {\n constructor(\n private readonly compiler: JitCompiler,\n private readonly nowProvider: INowProvider = wallClockNow,\n ) { }\n\n /**\n * Creates a new ScriptRuntime from a ScriptBlock\n * \n * Process:\n * 1. Validates block has statements\n * 2. Creates WhiteboardScript from content + statements\n * 3. Instantiates ScriptRuntime with JIT compiler and options\n * 4. Dispatches StartSessionAction to wrap script in session root block and push it\n * \n * @param block - The WOD block to create runtime for\n * @param options - Optional runtime options (debug mode, logging, tracker, etc.)\n * @returns Initialized ScriptRuntime or null if invalid block\n */\n createRuntime(block: ScriptBlock, options?: RuntimeStackOptions): IScriptRuntime | null {\n if (!block.statements || block.statements.length === 0) {\n return null;\n }\n\n // Create WhiteboardScript from block content and statements\n const script = new WhiteboardScript(block.content, block.statements);\n\n // Collapse any unresolved Choice Groups BEFORE the runtime spins up its first\n // block. The Pre-Run Wizard resolves Choices at origin 'user-plan'; this is the\n // enforced safety net that defaults anything still unresolved to its first\n // alternative, guaranteeing a MetricType.Choice never reaches a compiled Block\n // — even on entry points that never surface the wizard.\n collapseUnresolvedChoices(script.statements);\n\n // Instantiate dependencies\n const stack = new RuntimeStack();\n // Clock is wall-clock; tests inject a mock via ScriptRuntime ctor.\n const clock = new RuntimeClock();\n const eventBus = new EventBus();\n\n const dependencies = {\n stack,\n clock,\n eventBus\n };\n\n // Create runtime with JIT compiler and optional debug options\n const runtime = new ScriptRuntime(script, this.compiler, dependencies, options, this.nowProvider);\n\n // Wire analytics engine automatically for all runtimes\n const { engine, analyticsContext } = createAnalyticsEngineForBlock(block, options?.analyticsOptions);\n runtime.analyticsContext = analyticsContext;\n runtime.setAnalyticsEngine(engine);\n\n // Start the workout by dispatching StartSessionAction\n // This wraps the script in a SessionRootBlock (with WaitingToStart gate)\n // and pushes it onto the stack\n runtime.do(new StartSessionAction());\n\n return runtime;\n }\n\n /**\n * Disposes of a runtime, cleaning up all blocks and resources\n * \n * @param runtime - The runtime to dispose\n */\n disposeRuntime(runtime: IScriptRuntime): void {\n\n runtime.dispose();\n }\n}\n","import { ScriptRuntime } from '../ScriptRuntime';\n\nimport { RuntimeStack } from '../RuntimeStack';\nimport { RuntimeClock } from '../RuntimeClock';\nimport { EventBus } from '../events/EventBus';\nimport { JitCompiler } from './JitCompiler';\nimport type { WhiteboardScript } from '../../parser/WhiteboardScript';\nimport { IRuntimeOptions, DEFAULT_RUNTIME_OPTIONS } from '../contracts/IRuntimeOptions';\nimport type { INowProvider } from '../INowProvider';\nimport { wallClockNow } from '../INowProvider';\nimport type { TestableBlockConfig } from '../contracts/ITestableBlockConfig';\n\n/**\n * RuntimeBuilder provides a fluent API for constructing ScriptRuntime instances\n * with configurable options including debug mode, logging, and custom block wrappers.\n * \n * @example\n * ```typescript\n * // Basic usage\n * const runtime = new RuntimeBuilder(script, compiler).build();\n * \n * // With debug mode\n * const debugRuntime = new RuntimeBuilder(script, compiler)\n * .withDebugMode(true)\n * .build();\n * \n * // With custom configuration\n * const customRuntime = new RuntimeBuilder(script, compiler)\n * .withDebugMode(true)\n * .withLogging(true)\n * .withDefaultTestableConfig({ mountMode: 'spy', nextMode: 'spy' })\n * .withDebugLogHandler((event) => {\n * console.log('[Debug]', event);\n * })\n * .build();\n * ```\n */\nexport class RuntimeBuilder {\n private options: IRuntimeOptions = { ...DEFAULT_RUNTIME_OPTIONS };\n private nowProvider: INowProvider = wallClockNow;\n\n constructor(\n private readonly script: WhiteboardScript,\n private readonly compiler: JitCompiler\n ) { }\n\n /**\n * Enable or disable debug mode.\n * When enabled:\n * - All blocks are wrapped with TestableBlock for inspection\n * - Lifecycle events are tracked and can be inspected\n */\n withDebugMode(enabled: boolean): this {\n this.options.debugMode = enabled;\n if (enabled) {\n // Auto-enable logging in debug mode\n this.options.enableLogging = true;\n }\n return this;\n }\n\n /**\n * Enable or disable debug logging.\n * Can be enabled independently of debug mode for lighter-weight logging.\n */\n withLogging(enabled: boolean): this {\n this.options.enableLogging = enabled;\n return this;\n }\n\n /**\n * Set default TestableBlock configuration.\n * Applied to all blocks wrapped in debug mode.\n */\n withDefaultTestableConfig(config: Partial<TestableBlockConfig>): this {\n this.options.defaultTestableConfig = config;\n return this;\n }\n\n /**\n * Set a custom block wrapper factory.\n * Use this to customize how blocks are wrapped in debug mode.\n */\n withBlockWrapperFactory(factory: IRuntimeOptions['blockWrapperFactory']): this {\n this.options.blockWrapperFactory = factory;\n return this;\n }\n\n /**\n * Set a custom debug log handler.\n * Called for every debug event in addition to console logging.\n */\n withDebugLogHandler(handler: IRuntimeOptions['onDebugLog']): this {\n this.options.onDebugLog = handler;\n return this;\n }\n\n /**\n * Set a custom INowProvider (time seam — see docs/adr/time-seam.md).\n * Defaults to wall-clock.\n */\n withNowProvider(provider: INowProvider): this {\n this.nowProvider = provider;\n return this;\n }\n\n /**\n * Get the current options (for inspection/debugging)\n */\n getOptions(): Readonly<IRuntimeOptions> {\n return { ...this.options };\n }\n\n /**\n * Build the ScriptRuntime with the configured options.\n */\n build(): ScriptRuntime {\n // Create runtime with options\n const dependencies = {\n stack: new RuntimeStack(),\n clock: new RuntimeClock(),\n eventBus: new EventBus()\n };\n return new ScriptRuntime(this.script, this.compiler, dependencies, this.options, this.nowProvider);\n }\n\n /**\n * Build the runtime and also return the options used.\n * Useful for debugging the builder configuration.\n */\n buildWithOptions(): { runtime: ScriptRuntime; options: IRuntimeOptions } {\n const runtime = this.build();\n return { runtime, options: { ...this.options } };\n }\n}\n\n/**\n * Factory function to create a RuntimeBuilder.\n * Convenience function for creating builders.\n * \n * @example\n * ```typescript\n * const runtime = createRuntimeBuilder(script, compiler)\n * .withDebugMode(true)\n * .build();\n * ```\n */\nexport function createRuntimeBuilder(script: WhiteboardScript, compiler: JitCompiler): RuntimeBuilder {\n return new RuntimeBuilder(script, compiler);\n}\n","import { IEvent } from '../contracts/events/IEvent';\nimport { INowProvider, wallClockNow } from '../INowProvider';\n\nexport class NextEvent implements IEvent {\n readonly name: string = 'next';\n readonly timestamp: Date;\n private _data?: unknown;\n private static _counter = 0;\n constructor(data?: unknown, private readonly now: INowProvider = wallClockNow) {\n // Ensure unique timestamp by using current time plus counter offset\n const nowMs = this.now.nowMs();\n NextEvent._counter++;\n this.timestamp = new Date(nowMs + NextEvent._counter);\n this._data = data;\n }\n\n get data(): unknown {\n return this._data;\n }\n\n set data(value: unknown) {\n this._data = value;\n }\n\n // Custom toJSON method for proper JSON serialization\n toJSON() {\n return {\n name: this.name,\n timestamp: this.timestamp,\n data: this._data\n };\n }\n}\n","/**\n * Sound-related type definitions for the runtime.\n */\n\n/**\n * Configuration for a single sound cue.\n * Sound cues are triggered when a timer reaches a specific threshold.\n */\nexport interface SoundCue {\n /** Unique identifier for this cue */\n id: string;\n \n /** \n * Time threshold in milliseconds when this cue should trigger.\n * For countdown timers: triggers when remainingMs <= threshold\n * For count-up timers: triggers when elapsedMs >= threshold\n */\n threshold: number;\n \n /** \n * Sound to play. Can be:\n * - Predefined sound name: 'beep', 'buzzer', 'chime', 'tick'\n * - URL to audio file\n */\n sound: string;\n \n /** Volume level (0.0 to 1.0). Default is 1.0 */\n volume?: number;\n}\n\n/**\n * State tracking for a single sound cue.\n * Used to prevent duplicate triggers.\n */\nexport interface SoundCueState {\n /** Reference to the cue configuration ID */\n cueId: string;\n \n /** Whether this cue has been triggered */\n triggered: boolean;\n \n /** Timestamp when the cue was triggered (ms since epoch) */\n triggeredAt?: number;\n}\n\n/**\n * Configuration for SoundBehavior.\n */\nexport interface SoundBehaviorConfig {\n /** Direction of the timer ('up' for count-up, 'down' for countdown) */\n direction: 'up' | 'down';\n \n /** Total duration for countdown timers (required for 'down' direction) */\n durationMs?: number;\n \n /** Array of sound cues to trigger at specific time thresholds */\n cues: SoundCue[];\n}\n\n/**\n * Runtime state for sound behavior stored in memory.\n */\nexport interface SoundState {\n /** Block ID that owns this sound state */\n blockId: string;\n \n /** State of each configured cue */\n cues: SoundCueState[];\n}\n\n/**\n * Predefined sound names that can be used in SoundCue.sound\n */\nexport const PREDEFINED_SOUNDS = {\n /** Short single beep - good for countdown ticks */\n BEEP: 'beep',\n \n /** Long buzz - good for timer completion */\n BUZZER: 'buzzer',\n \n /** Pleasant chime - good for milestones */\n CHIME: 'chime',\n \n /** Clock tick - good for second-by-second countdown */\n TICK: 'tick',\n \n /** Ascending sequence - good for timer start */\n START: 'start',\n} as const;\n\nexport type PredefinedSoundName = typeof PREDEFINED_SOUNDS[keyof typeof PREDEFINED_SOUNDS];\n","/**\n * Shared utility for managing IMetric arrays and labels.\n * \n * This utility is used by multiple UI components:\n * - RuntimeEventLog (sectioned log view)\n * - RuntimeHistoryPanel (tree view)\n * - AnalyticsLayout (timeline/graphs)\n */\n\nimport { IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\n\n/**\n * Extract a human-readable label from an array of metric.\n */\nexport function metricsToLabel(metrics: MetricContainer | IMetric[] | IMetric[][]): string {\n if (metrics instanceof MetricContainer) {\n return metricsToLabel(metrics.toArray());\n }\n const first = metrics[0];\n const flat = Array.isArray(first) ? (metrics as IMetric[][]).flat() : (metrics as IMetric[]);\n\n // Highest priority: explicit Label metric\n const labelFragment = flat.find(f => f.type === MetricType.Label);\n if (labelFragment) return labelFragment.image || labelFragment.value?.toString() || 'Block';\n\n // Try to find an Effort or Action metric next\n const primary = flat.find(f => f.type === MetricType.Effort || f.type === MetricType.Action);\n if (primary) return primary.image || primary.value?.toString() || 'Block';\n\n // Fallback to first metric with an image\n const firstWithImage = flat.find(f => f.image);\n if (firstWithImage) return firstWithImage.image || 'Block';\n\n return 'Block';\n}\n","import type { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\nimport type { IEvent } from '../../contracts/events/IEvent';\nimport { INowProvider, wallClockNow } from '../../INowProvider';\n\n/**\n * Action for declarative event emission from behaviors.\n * \n * This action allows behaviors to emit events through the action system\n * using eventBus.emit(), maintaining declarative patterns.\n * \n * @example\n * ```typescript\n * // Emit a timer start event\n * return [new EmitEventAction('timer:started')];\n * \n * // Emit event with custom data\n * return [new EmitEventAction('rounds:completed', { round: 5 })];\n * \n * // Emit event with custom timestamp\n * return [new EmitEventAction('workout:finished', undefined, new Date())];\n * ```\n */\nexport class EmitEventAction implements IRuntimeAction {\n readonly type = 'emit-event';\n public readonly timestamp: Date;\n\n constructor(\n /** Name of the event to emit */\n public readonly eventName: string,\n /** Optional data to include with the event */\n public readonly data?: unknown,\n /** Optional timestamp (defaults to now) */\n timestamp?: Date,\n now: INowProvider = wallClockNow,\n ) {\n this.timestamp = timestamp ?? now.now();\n }\n\n do(runtime: IRuntimeContext): IRuntimeAction[] {\n const event: IEvent = {\n name: this.eventName,\n timestamp: this.timestamp,\n data: this.data\n };\n \n return runtime.eventBus.dispatch(event, runtime);\n }\n}\n","\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { IBehaviorContext } from '../contracts/IBehaviorContext';\nimport { RuntimeBlock } from '../RuntimeBlock';\nimport type { IRuntimeContext } from '../contracts/IRuntimeContext';\nimport { IRuntimeAction } from '../contracts/IRuntimeAction';\nimport { IRuntimeBehavior } from '../contracts/IRuntimeBehavior';\nimport { BlockLifecycleOptions } from '../contracts/IRuntimeBlock';\nimport { EmitEventAction } from '../actions/events/EmitEventAction';\nimport { CountupTimerBehavior } from '../behaviors/CountupTimerBehavior';\nimport { LabelingBehavior } from '../behaviors/LabelingBehavior';\n\n\n/**\n * EffortBlock Configuration\n */\nexport interface EffortBlockConfig {\n exerciseName: string;\n targetReps: number;\n}\n\n/**\n * EffortCompletionBehavior - Handles completion via onNext() to avoid conflicts with NextEventHandler.\n * Marks the block as complete when target is achieved or when force-completed.\n */\nclass EffortCompletionBehavior implements IRuntimeBehavior {\n private _forceComplete = false;\n private _isComplete = false;\n\n constructor(private readonly checkComplete: () => boolean) { }\n\n forceComplete(): void {\n this._forceComplete = true;\n }\n\n onMount(ctx: IBehaviorContext): IRuntimeAction[] {\n // Set force complete flag when 'next' event received\n // The actual completion happens in onNext()\n ctx.subscribe('next', () => {\n this._forceComplete = true;\n return [];\n });\n return [];\n }\n\n onNext(ctx: IBehaviorContext): IRuntimeAction[] {\n if (this._isComplete) {\n return [];\n }\n\n if (this.checkComplete() || this._forceComplete) {\n this._isComplete = true;\n const now = ctx.clock.currentDate;\n // Mark block as complete - stack will pop it during sweep\n ctx.markComplete('target-achieved');\n return [\n new EmitEventAction('block:complete', { blockId: ctx.block.key.toString() }, now)\n ];\n }\n\n return [];\n }\n\n onUnmount(_ctx: IBehaviorContext): IRuntimeAction[] {\n return [];\n }\n\n onDispose(_ctx: IBehaviorContext): void {\n // No explicit cleanup needed\n }\n}\n\n/**\n * EffortBlock tracks individual exercise/rep completion.\n */\nexport class EffortBlock extends RuntimeBlock {\n private currentReps = 0;\n private lastCompletionMode: 'incremental' | 'bulk' = 'incremental';\n\n constructor(\n runtime: IRuntimeContext,\n sourceIds: number[],\n private readonly config: EffortBlockConfig,\n metrics?: MetricContainer[]\n ) {\n super({\n runtime,\n sourceIds,\n behaviors: [], // Behaviors added below\n blockType: 'Effort',\n label: `${config.targetReps} ${config.exerciseName}`,\n metrics,\n });\n\n // Validate configuration\n if (!config.exerciseName || config.exerciseName.trim() === '') {\n throw new TypeError('EffortBlock requires a non-empty exerciseName');\n }\n\n if (config.targetReps < 1) {\n throw new RangeError(`targetReps must be >= 1, got: ${config.targetReps}`);\n }\n\n const completionBehavior = new EffortCompletionBehavior(() => this.isTargetComplete());\n\n // Initialize behaviors in order\n // Display aspect\n this.behaviors.push(new LabelingBehavior({\n mode: 'clock',\n label: `${config.targetReps} ${config.exerciseName}`,\n actionDisplay: config.exerciseName\n }));\n this.behaviors.push(completionBehavior);\n // Timer aspect - countup timer for segment timing\n this.behaviors.push(new CountupTimerBehavior({\n label: 'Segment Timer',\n role: 'secondary'\n }));\n }\n\n mount(runtime: IRuntimeContext, options?: BlockLifecycleOptions): IRuntimeAction[] {\n const actions = super.mount(runtime, options);\n actions.push(...this.getMetricActions());\n return actions;\n }\n\n unmount(runtime: IRuntimeContext, options?: BlockLifecycleOptions): IRuntimeAction[] {\n return super.unmount(runtime, options);\n }\n\n dispose(runtime: IRuntimeContext): void {\n super.dispose(runtime);\n if (this.context) {\n this.context.release();\n }\n }\n\n /**\n * Check if the effort target has been met.\n * Note: This is distinct from the block's isComplete flag which is used by the stack.\n */\n isTargetComplete(): boolean {\n return this.currentReps >= this.config.targetReps;\n }\n\n getCurrentReps(): number {\n return this.currentReps;\n }\n\n getTargetReps(): number {\n return this.config.targetReps;\n }\n\n getExerciseName(): string {\n return this.config.exerciseName;\n }\n\n incrementRep(): IRuntimeAction[] {\n if (this.currentReps < this.config.targetReps) {\n this.currentReps++;\n this.lastCompletionMode = 'incremental';\n return this.getMetricActions();\n }\n return [];\n }\n\n setReps(count: number): IRuntimeAction[] {\n if (count < 0 || count > this.config.targetReps) {\n throw new RangeError(`setReps(${count}) out of valid range [0, ${this.config.targetReps}]`);\n }\n\n this.currentReps = count;\n this.lastCompletionMode = 'bulk';\n return this.getMetricActions();\n }\n\n markComplete(): IRuntimeAction[] {\n this.currentReps = this.config.targetReps;\n this.lastCompletionMode = 'bulk';\n const actions = this.getMetricActions();\n\n actions.push(new EmitEventAction('reps:complete', {\n blockId: this.key.toString(),\n exerciseName: this.config.exerciseName,\n finalReps: this.currentReps,\n }));\n\n return actions;\n }\n\n private getMetricActions(): IRuntimeAction[] {\n const blockId = this.key.toString();\n const actions: IRuntimeAction[] = [];\n\n // 2. Emit event for UI\n actions.push(new EmitEventAction('reps:updated', {\n blockId,\n exerciseName: this.config.exerciseName,\n currentReps: this.currentReps,\n targetReps: this.config.targetReps,\n completionMode: this.lastCompletionMode,\n }));\n\n // 3. Check if target is complete\n if (this.isTargetComplete()) {\n actions.push(new EmitEventAction('reps:complete', {\n blockId,\n exerciseName: this.config.exerciseName,\n finalReps: this.currentReps,\n }));\n }\n\n return actions;\n }\n}\n","import { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { metricPresentation } from '../../../metrics/presentation';\nimport { hasHint, CONSUMED_HINTS } from '../../../metrics/hints';\n\nexport interface LabelOptions {\n includeMetric?: boolean;\n includeLogic?: boolean;\n includeIdentity?: boolean;\n includeAttributes?: boolean;\n defaultLabel?: string;\n format?: 'metric-first' | 'logic-first' | 'identity-first';\n}\n\n/**\n * Utility for composing standardized labels for runtime blocks from parsed statements.\n *\n * Standardized Pattern: [Logic] [Metric] [Identity] [Attributes]\n */\nexport class LabelComposer {\n /**\n * Builds a descriptive label from a set of statements.\n */\n static build(statements: ICodeStatement[], options: LabelOptions = {}): string {\n const {\n includeMetric = true,\n includeLogic = true,\n includeIdentity = true,\n includeAttributes = true,\n defaultLabel = \"Block\",\n format = 'logic-first'\n } = options;\n\n const allFragments = MetricContainer.from(statements\n .flatMap(s => MetricContainer.from(s.metrics).toArray())\n .filter(f => f.origin !== 'runtime' && f.type !== MetricType.Hint));\n\n if (allFragments.length === 0) return defaultLabel;\n\n // 1. Check for explicit Label metrics\n const explicitLabel = allFragments.find(f => f.type === MetricType.Label);\n if (explicitLabel) return explicitLabel.image || explicitLabel.value?.toString() || defaultLabel;\n\n const metrics = includeMetric ? this.getPrimaryMetric(allFragments) : undefined;\n const logic = includeLogic ? this.getLogicKeyword(statements, allFragments) : undefined;\n const identity = includeIdentity ? this.getIdentityText(allFragments) : undefined;\n const attributes = includeAttributes ? this.getAttributesText(allFragments) : undefined;\n\n const parts: string[] = [];\n\n if (format === 'logic-first') {\n if (logic) parts.push(logic);\n if (metrics) parts.push(metrics);\n if (identity) parts.push(identity);\n if (attributes) parts.push(attributes);\n } else if (format === 'metric-first') {\n if (metrics) parts.push(metrics);\n if (logic) parts.push(logic);\n if (identity) parts.push(identity);\n if (attributes) parts.push(attributes);\n } else { // identity-first\n if (identity) parts.push(identity);\n if (metrics) parts.push(metrics);\n if (logic) parts.push(logic);\n if (attributes) parts.push(attributes);\n }\n\n // Fallback: If no structured parts, join all non-runtime metrics\n if (parts.length === 0) {\n return allFragments\n .filter(f => !!f.image && !metricPresentation.isStructural(f))\n .map(f => f.image)\n .join(\" \") || defaultLabel;\n }\n\n return parts.join(\" \").trim().replace(/\\s+/g, ' ');\n }\n\n private static getPrimaryMetric(metrics: MetricContainer): string | undefined {\n // Priority 1: Rounds sequence (21-15-9) or Rounds count\n const rounds = metrics.find(f => f.type === MetricType.Rounds);\n if (rounds && rounds.image) return rounds.image;\n\n // Priority 2: Duration (5:00, :30)\n const duration = metrics.find(f => f.type === MetricType.Duration);\n if (duration && duration.image) return duration.image;\n\n // Note: We don't use Rep metrics here if they are part of the identity (e.g. \"100 Swings\")\n // Unless there is NO identity.\n return undefined;\n }\n\n private static getLogicKeyword(statements: ICodeStatement[], metrics: MetricContainer): string | undefined {\n // Check hints first (from Dialect analysis)\n if (statements.some(s => hasHint(s, CONSUMED_HINTS.LABEL_AMRAP))) return 'AMRAP';\n if (statements.some(s => hasHint(s, CONSUMED_HINTS.LABEL_EMOM))) return 'EMOM';\n if (statements.some(s => hasHint(s, CONSUMED_HINTS.LABEL_TABATA))) return 'TABATA';\n if (statements.some(s => hasHint(s, CONSUMED_HINTS.LABEL_FOR_TIME))) return 'FOR TIME';\n\n // Fallback: Check for keywords in metrics\n const keywords = ['AMRAP', 'EMOM', 'TABATA', 'FOR TIME'];\n for (const frag of metrics) {\n const val = (frag.image || frag.value?.toString() || \"\").toUpperCase();\n if (keywords.includes(val)) return val;\n }\n\n return undefined;\n }\n\n private static getIdentityText(metrics: MetricContainer): string | undefined {\n const logicKeywords = ['AMRAP', 'EMOM', 'TABATA', 'FOR TIME'];\n \n // Filter metrics that contribute to the identity\n // We include Reps here if they are interleaved (e.g. \"100 KB Swings\")\n const identityFragments = metrics.filter(f => {\n if (f.type === MetricType.Duration || f.type === MetricType.Rounds || \n f.type === MetricType.Resistance || f.type === MetricType.Distance ||\n f.type === MetricType.Lap || f.type === MetricType.Group) {\n return false;\n }\n const val = (f.image || f.value?.toString() || \"\").toUpperCase();\n return !logicKeywords.includes(val);\n });\n\n if (identityFragments.length === 0) return undefined;\n return identityFragments.map(f => f.image).join(\" \").trim();\n }\n\n private static getAttributesText(metrics: MetricContainer): string | undefined {\n const attrFragments = metrics.filter(f => \n f.type === MetricType.Resistance || \n f.type === MetricType.Distance\n );\n\n if (attrFragments.length === 0) return undefined;\n return attrFragments.map(f => f.image).join(\" \").trim();\n }\n}\n","import type { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport type { IDistributedMetrics } from '../contracts/IDistributedMetrics';\n\n/**\n * Default passthrough distributor: keeps a single metric group.\n *\n * Lives in `impl/` rather than `contracts/` to keep the contracts layer free\n * of concrete classes (interface segregation / abstraction-implementation\n * separation).\n */\nexport class PassthroughMetricDistributor implements IDistributedMetrics {\n distribute(base: MetricContainer, _blockType?: string): MetricContainer[] {\n return [base.clone()];\n }\n}\n","/**\n * BlockTemplateComposer — executes a `BlockTemplate` against a\n * `BlockBuilder`, replacing the ~20 lines of metadata-and-aspect boilerplate\n * that every compound strategy repeats.\n *\n * Strategies still attach strategy-specific behaviors via\n * `builder.addBehavior(...)` after `compose()` returns. The composer's job\n * is to materialize the \"common chassis\" — key, context, label, source\n * ids, fragments, plus the timer/repeater aspects — so the strategy only\n * has to express the *delta*.\n *\n * ## Usage\n *\n * ```ts\n * apply(builder, statements, runtime) {\n * compose(builder, {\n * blockType: 'AMRAP',\n * defaultLabel: 'AMRAP',\n * statements,\n * runtime,\n * timer: { direction: 'down', durationMs, mode: 'complete-block' },\n * repeater: { startRound: 1, totalRounds: undefined, addCompletion: false },\n * });\n * builder.addBehavior(new LabelingBehavior({ mode: 'countdown', label: ... }));\n * builder.addBehavior(new SoundCueBehavior({ cues: [...] }));\n * }\n * ```\n */\nimport type { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport { BlockKey } from '@bitcobblers/wod-wiki-core';\nimport { BlockContext } from '../BlockContext';\nimport { LabelComposer } from './utils/LabelComposer';\nimport { PassthroughMetricDistributor } from '../impl/PassthroughMetricDistributor';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport type { BlockBuilder } from './BlockBuilder';\nimport type { BlockTemplate } from './BlockTemplate';\n\nconst DEFAULT_PICK = (statements: ICodeStatement[]): ICodeStatement => statements[0];\n\n/**\n * Apply a {@link BlockTemplate} to the supplied builder. Returns the\n * label so callers can attach downstream behaviors that reference it\n * (e.g. `LabelingBehavior`, `SoundCueBehavior`) without re-deriving it.\n */\nexport function compose(builder: BlockBuilder, template: BlockTemplate): string {\n const { statements, runtime, blockType, defaultLabel } = template;\n\n const pick = template.pickStatement ?? DEFAULT_PICK;\n const anchorStatement = pick(statements);\n\n // Block metadata\n const blockKey = template.key ?? new BlockKey();\n const context = template.context ?? new BlockContext(\n runtime,\n blockKey.toString(),\n anchorStatement.exerciseId || ''\n );\n\n const label = LabelComposer.build(statements, { defaultLabel });\n\n builder\n .setContext(context)\n .setKey(blockKey)\n .setBlockType(blockType)\n .setLabel(label)\n .setSourceIds(statements.map(s => s.id));\n\n // Metric fragments — fanned through the existing distributor. The\n // distributor type doubles as a \"display group\" key in the\n // existing pipeline, so we honor the override but default to the\n // block type so each strategy keeps its own grouping semantics.\n const distributorType = template.metricDistributorType ?? blockType;\n const distributor = new PassthroughMetricDistributor();\n const filter = template.filterMetrics;\n const metricGroups = statements\n .flatMap(s => {\n const source = filter\n ? MetricContainer.from(s.metrics.filter(filter))\n : MetricContainer.from(s.metrics);\n return distributor.distribute(source, distributorType);\n })\n .filter(group => group.length > 0);\n builder.setFragments(metricGroups);\n\n // Timer aspect — only emitted when the template carries a timer slot.\n // The composer deliberately keeps the call to `asTimer()` so the\n // existing `CountdownTimerBehavior` factory wiring (including\n // `restBlockFactory`) stays in one place.\n if (template.timer) {\n const t = template.timer;\n // `asTimer` derives `mode` from `completionConfig.completesBlock`:\n // mode = 'reset-interval' when completesBlock === false\n // mode = 'complete-block' otherwise (default)\n const completionConfig = t.mode === 'reset-interval'\n ? { completesBlock: false }\n : undefined;\n builder.asTimer({\n direction: t.direction,\n durationMs: t.durationMs,\n label: t.label,\n role: t.role ?? 'primary',\n addCompletion: t.mode !== 'reset-interval',\n completionConfig,\n injectRest: t.injectRest,\n required: t.required,\n ...(template.countdownTimerConfig ?? {}),\n });\n }\n\n // Repeater aspect — only emitted when the template carries a repeater slot.\n if (template.repeater) {\n const r = template.repeater;\n builder.asRepeater({\n totalRounds: r.totalRounds,\n startRound: r.startRound ?? 1,\n addCompletion: r.addCompletion,\n });\n }\n\n return label;\n}\n","import { IRuntimeBlockStrategy } from \"../../../contracts/IRuntimeBlockStrategy\";\nimport { BlockBuilder } from \"../../BlockBuilder\";\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport type { IRuntimeContext } from \"../../../contracts/IRuntimeContext\";\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { DurationMetric } from \"../../metrics/DurationMetric\";\nimport { compose } from \"../../BlockTemplateComposer\";\nimport type { BlockTemplate } from \"../../BlockTemplate\";\nimport {\n LabelingBehavior,\n SoundCueBehavior\n} from \"../../../behaviors\";\n\n/**\n * AmrapLogicStrategy handles \"As Many Rounds As Possible\" blocks.\n *\n * Pattern: Timer (countdown) + Rounds (unbounded)\n *\n * Uses aspect composer methods:\n * - .asTimer() - Time tracking with countdown\n * - .asRepeater() - Unbounded rounds (no completion)\n * Plus specific behaviors for display, output, rest, and sound.\n */\nexport class AmrapLogicStrategy implements IRuntimeBlockStrategy {\n priority = 90; // High priority - runs before generic strategies\n readonly id = 'amrap-logic';\n\n match(statements: ICodeStatement[], _runtime: IRuntimeContext): boolean {\n if (!statements || statements.length === 0) return false;\n \n // Match if ANY statement has timer and ANY statement has rounds/amrap keyword\n const hasTimer = statements.some(s => s.hasMetric(MetricType.Duration));\n const hasRounds = statements.some(s => s.hasMetric(MetricType.Rounds));\n const hasRoundsKeyword = statements.some(s => s.metrics.some(\n f => (f.type === MetricType.Effort || f.type === MetricType.Action)\n && typeof f.value === 'string'\n && (f.value.toLowerCase() === 'rounds' || f.value.toLowerCase() === 'amrap')\n ));\n\n return hasTimer && (hasRounds || hasRoundsKeyword);\n }\n\n apply(builder: BlockBuilder, statements: ICodeStatement[], runtime: IRuntimeContext): void {\n const firstStatementWithTimer = statements.find(s => s.hasMetric(MetricType.Duration)) || statements[0];\n\n const timerFragment = firstStatementWithTimer.metrics.find(\n f => f.type === MetricType.Duration\n ) as DurationMetric | undefined;\n const durationMs = timerFragment?.value || 0;\n\n // Build the common chassis via the template composer; strategy-specific\n // behaviors (Labeling, SoundCue) are added below.\n const template: BlockTemplate = {\n blockType: 'AMRAP',\n defaultLabel: `AMRAP ${Math.round(durationMs / 60000)} min`,\n statements,\n runtime,\n // AMRAP uses countdown timer that marks block complete when expired\n timer: {\n direction: 'down',\n durationMs,\n label: 'AMRAP',\n role: 'primary',\n mode: 'complete-block',\n injectRest: false,\n },\n // Unbounded rounds — no completion on round exhaustion, the timer\n // drives completion.\n repeater: {\n totalRounds: undefined,\n startRound: 1,\n addCompletion: false,\n },\n pickStatement: (stmts) => stmts.find(s => s.hasMetric(MetricType.Duration)) || stmts[0],\n };\n\n const label = compose(builder, template);\n\n // =====================================================================\n // Display Aspect\n // =====================================================================\n builder.addBehavior(new LabelingBehavior({\n mode: 'countdown',\n label\n }));\n\n // Sound Cues\n builder.addBehavior(new SoundCueBehavior({\n cues: [\n { sound: 'start-beep', trigger: 'mount' },\n { sound: 'countdown-beep', trigger: 'countdown', atSeconds: [3, 2, 1] },\n { sound: 'timer-complete', trigger: 'complete' }\n ]\n }));\n }\n}\n","import { IRuntimeBlockStrategy } from \"../../../contracts/IRuntimeBlockStrategy\";\nimport { BlockBuilder } from \"../../BlockBuilder\";\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport type { IRuntimeContext } from \"../../../contracts/IRuntimeContext\";\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { DurationMetric } from \"../../metrics/DurationMetric\";\nimport { RoundsMetric } from \"../../metrics/RoundsMetric\";\nimport { hasHint, CONSUMED_HINTS } from '../../../../metrics/hints';\nimport { compose } from \"../../BlockTemplateComposer\";\nimport type { BlockTemplate } from \"../../BlockTemplate\";\n// Specific behaviors not covered by aspect composers\nimport {\n LabelingBehavior,\n MetricPromotionBehavior,\n SoundCueBehavior,\n} from \"../../../behaviors\";\n\n/**\n * IntervalLogicStrategy handles EMOM (Every Minute On the Minute) blocks.\n *\n * Pattern: Repeating interval timer + Rounds\n * Each interval resets the timer.\n *\n * Uses aspect composer methods:\n * - .asTimer() - Countdown per interval (completesBlock: false)\n * - .asRepeater() - Fixed rounds with completion\n * Plus specific behaviors for display, output, rest, and sound.\n */\nexport class IntervalLogicStrategy implements IRuntimeBlockStrategy {\n priority = 90; // High priority\n readonly id = 'interval-logic';\n\n match(statements: ICodeStatement[], _runtime: IRuntimeContext): boolean {\n if (!statements || statements.length === 0) return false;\n \n // Match if ANY statement has timer and (hint or EMOM keyword)\n const hasTimer = statements.some(s => s.metrics.some(f => f.type === MetricType.Duration));\n const isInterval = statements.some(s => hasHint(s, CONSUMED_HINTS.REPEATING_INTERVAL));\n\n // EMOM can be parsed as 'Action' OR 'Effort' depending on parser version\n const hasEmomAction = statements.some(s => s.metrics.some(\n f => (f.type === MetricType.Action || f.type === MetricType.Effort)\n && typeof f.value === 'string'\n && f.value.toLowerCase() === 'emom'\n ));\n return hasTimer && (isInterval || hasEmomAction);\n }\n\n apply(builder: BlockBuilder, statements: ICodeStatement[], runtime: IRuntimeContext): void {\n const firstStatementWithTimer = statements.find(s => s.metrics.some(\n f => f.type === MetricType.Duration\n )) || statements[0];\n\n const timerFragment = firstStatementWithTimer.metrics.find(\n f => f.type === MetricType.Duration\n ) as DurationMetric | undefined;\n\n const roundsFragment = statements.flatMap(s => MetricContainer.from(s.metrics).toArray()).find(\n f => f.type === MetricType.Rounds\n ) as RoundsMetric | undefined;\n\n const intervalMs = timerFragment?.value || 60000; // Default 1 minute\n const totalRounds = typeof roundsFragment?.value === 'number'\n ? roundsFragment.value\n : 10; // Default 10 rounds if not specified\n\n // Build the common chassis via the template composer.\n const template: BlockTemplate = {\n blockType: 'EMOM',\n defaultLabel: `EMOM ${totalRounds}`,\n statements,\n runtime,\n // EMOM uses countdown timer per interval. Timer expiry does NOT\n // mark block complete — it's a per-round pacing signal.\n timer: {\n direction: 'down',\n durationMs: intervalMs,\n label: 'Interval',\n role: 'primary',\n mode: 'reset-interval', // Timer resets for next round\n injectRest: true,\n },\n // EMOM has fixed rounds, block completes when exhausted.\n repeater: {\n totalRounds,\n startRound: 1,\n addCompletion: true,\n },\n pickStatement: (stmts) => stmts.find(s => s.hasMetric(MetricType.Duration)) || stmts[0],\n metricDistributorType: 'EMOM',\n };\n\n const label = compose(builder, template);\n\n // =====================================================================\n // Display Aspect\n // =====================================================================\n builder.addBehavior(new LabelingBehavior({\n mode: 'countdown',\n label\n }));\n\n // Sound Cues\n builder.addBehavior(new SoundCueBehavior({\n cues: [\n { sound: 'interval-start', trigger: 'mount' },\n { sound: 'countdown-beep', trigger: 'countdown', atSeconds: [3, 2, 1] },\n { sound: 'interval-complete', trigger: 'complete' }\n ]\n }));\n\n // Promotion Aspect - cascade resistance/distance to child blocks\n const hasResistance = statements.some(s => s.metrics.some(m => m.type === MetricType.Resistance));\n const hasDistance = statements.some(s => s.metrics.some(m => m.type === MetricType.Distance));\n const promotions = [\n ...(hasResistance ? [{ metricType: MetricType.Resistance, origin: 'compiler' as const }] : []),\n ...(hasDistance ? [{ metricType: MetricType.Distance, origin: 'compiler' as const }] : []),\n ];\n if (promotions.length > 0) {\n builder.addBehavior(new MetricPromotionBehavior({ promotions }));\n }\n }\n}\n","import { IRuntimeBlockStrategy } from \"../../../contracts/IRuntimeBlockStrategy\";\nimport { BlockBuilder } from \"../../BlockBuilder\";\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport type { IRuntimeContext } from \"../../../contracts/IRuntimeContext\";\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { DurationMetric } from \"../../metrics/DurationMetric\";\nimport { hasHint, CONSUMED_HINTS } from '../../../../metrics/hints';\nimport { compose } from \"../../BlockTemplateComposer\";\nimport type { BlockTemplate } from \"../../BlockTemplate\";\n\n// Specific behaviors not covered by aspect composers\nimport {\n LabelingBehavior,\n ExitBehavior,\n SoundCueBehavior\n} from \"../../../behaviors\";\n\n/**\n * GenericTimerStrategy handles blocks with timer metrics.\n *\n * Uses aspect composer methods:\n * - .asTimer() - Time tracking (countdown or countup)\n * Plus specific behaviors for display, output, completion, and sound.\n */\nexport class GenericTimerStrategy implements IRuntimeBlockStrategy {\n priority = 50; // Mid priority\n readonly id = 'generic-timer';\n\n match(statements: ICodeStatement[], _runtime: IRuntimeContext): boolean {\n if (!statements || statements.length === 0) return false;\n\n // Match if duration metrics exists in ANY statement, ignoring runtime-generated ones\n return statements.some(s => s.metrics.some(\n f => f.type === MetricType.Duration && f.origin !== 'runtime'\n ));\n }\n\n apply(builder: BlockBuilder, statements: ICodeStatement[], runtime: IRuntimeContext): void {\n // Skip if a timer behavior was already added by a higher-priority strategy\n if (builder.hasTimerBehavior()) {\n return;\n }\n\n const firstStatementWithTimer = statements.find(s => s.metrics.some(\n f => f.type === MetricType.Duration && f.origin !== 'runtime'\n )) || statements[0];\n\n const timerFragment = firstStatementWithTimer.metrics.find(\n f => f.type === MetricType.Duration && f.origin !== 'runtime'\n ) as DurationMetric | undefined;\n\n const direction = timerFragment?.direction || 'up';\n const durationMs = timerFragment?.value || undefined;\n const isRequired = statements.some(s => hasHint(s, CONSUMED_HINTS.REQUIRED_TIMER));\n const injectRest = statements.some(s => hasHint(s, CONSUMED_HINTS.INJECT_REST));\n const isCountdown = !!(durationMs && direction === 'down');\n\n // Build the common chassis via the template composer; strategy-specific\n // behaviors (ExitBehavior, SoundCue, Labeling) are added below.\n const template: BlockTemplate = {\n blockType: 'Timer',\n defaultLabel: direction === 'down' ? 'Countdown' : 'For Time',\n statements,\n runtime,\n timer: {\n direction,\n durationMs,\n label: durationMs ? 'Countdown' : 'For Time',\n role: 'primary',\n mode: isCountdown ? 'complete-block' : 'complete-block',\n injectRest,\n required: isRequired,\n },\n pickStatement: (stmts) => stmts.find(s =>\n s.metrics.some(f => f.type === MetricType.Duration && f.origin !== 'runtime')\n ) || stmts[0],\n };\n\n const label = compose(builder, template);\n\n // =====================================================================\n // Specific Behaviors - Added BEFORE aspects to ensure correct execution order\n // (LeafExit before Timer ensures Pop comes before Rest Push onNext)\n // =====================================================================\n\n // Completion Aspect\n // For required timers, only exit when the timer:complete event fires (not on user next).\n // For normal timers, user can still advance manually (skip or acknowledge completion).\n // For parent blocks with children, ChildrenStrategy removes ExitBehavior since children manage advancement.\n if (isRequired && isCountdown) {\n builder.addBehavior(new ExitBehavior({ mode: 'immediate', onNext: false, onEvents: ['timer:complete'] }));\n } else {\n builder.addBehavior(new ExitBehavior({ mode: 'immediate', onNext: true }));\n }\n\n // =====================================================================\n // Display and Sound\n // =====================================================================\n\n // Sound Cues\n if (isCountdown) {\n builder.addBehavior(new SoundCueBehavior({\n cues: [\n { sound: 'countdown-beep', trigger: 'countdown', atSeconds: [3, 2, 1] },\n { sound: 'timer-complete', trigger: 'complete' }\n ]\n }));\n }\n\n // Display Aspect\n builder.addBehavior(new LabelingBehavior({\n mode: durationMs ? 'countdown' : 'clock',\n label\n }));\n }\n}\n\n","import { IRuntimeBlockStrategy } from \"../../../contracts/IRuntimeBlockStrategy\";\nimport { BlockBuilder } from \"../../BlockBuilder\";\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport type { IRuntimeContext } from \"../../../contracts/IRuntimeContext\";\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { RoundsMetric } from \"../../metrics/RoundsMetric\";\nimport { compose } from \"../../BlockTemplateComposer\";\nimport type { BlockTemplate } from \"../../BlockTemplate\";\n\n// Specific behaviors not covered by aspect composers\nimport {\n MetricPromotionBehavior,\n LabelingBehavior,\n} from \"../../../behaviors\";\n\n/**\n * GenericLoopStrategy handles blocks with round/iteration metrics.\n *\n * Uses aspect composer methods:\n * - .asRepeater() - Iteration/round management with completion\n * Plus specific behaviors for display, output, and history.\n */\nexport class GenericLoopStrategy implements IRuntimeBlockStrategy {\n priority = 50;\n readonly id = 'generic-loop';\n\n match(statements: ICodeStatement[], _runtime: IRuntimeContext): boolean {\n if (!statements || statements.length === 0) return false;\n return statements.some(s => s.metrics.some(f => f.type === MetricType.Rounds));\n }\n\n apply(builder: BlockBuilder, statements: ICodeStatement[], runtime: IRuntimeContext): void {\n // Skip if round behaviors already added by higher-priority strategy\n if (builder.hasRoundConfig()) {\n return;\n }\n\n const firstStatementWithRounds = statements.find(s => s.metrics.some(\n f => f.type === MetricType.Rounds\n )) || statements[0];\n\n const roundsFragment = firstStatementWithRounds.metrics.find(\n f => f.type === MetricType.Rounds\n ) as RoundsMetric | undefined;\n\n if (!roundsFragment) return;\n\n // Parse rounds value\n let totalRounds = 1;\n let repScheme: number[] | undefined = undefined;\n\n if (typeof roundsFragment.value === 'number') {\n totalRounds = roundsFragment.value;\n }\n\n // Collect individual RepMetrics from ALL statements to build a rep scheme.\n // The parser creates separate RepMetric instances (e.g., 21-15-9 becomes\n // three RepMetrics with values 21, 15, 9) alongside a RoundsMetric.\n const repFragments = statements.flatMap(s =>\n s.metrics.filter(f => f.type === MetricType.Rep && typeof f.value === 'number')\n ).map(f => f.value as number);\n\n if (repFragments.length > 0) {\n repScheme = repFragments;\n // If rounds weren't explicitly set, infer from rep scheme length\n if (totalRounds <= 1) {\n totalRounds = repScheme.length;\n }\n }\n\n // Build the common chassis via the template composer.\n const template: BlockTemplate = {\n blockType: 'Rounds',\n defaultLabel: repScheme ? repScheme.join('-') : `${totalRounds} Rounds`,\n statements,\n runtime,\n repeater: {\n totalRounds,\n startRound: 1,\n addCompletion: true,\n },\n pickStatement: (stmts) => stmts.find(s => s.metrics.some(f => f.type === MetricType.Rounds)) || stmts[0],\n // Legacy `GenericLoopStrategy` dropped `Rep` metrics from the\n // distributed fragments — preserve that here.\n filterMetrics: (m) => m.type !== MetricType.Rep,\n };\n\n const label = compose(builder, template);\n\n // =====================================================================\n // Display Aspect\n // =====================================================================\n builder.addBehavior(new LabelingBehavior({\n mode: 'clock',\n label\n }));\n\n // Promotion Aspect - Share internal state with children\n // Use execution origin to override parser-based text metrics\n const hasResistance = statements.some(s => s.metrics.some(m => m.type === MetricType.Resistance));\n const hasDistance = statements.some(s => s.metrics.some(m => m.type === MetricType.Distance));\n const promotions = [\n ...(hasResistance ? [{ metricType: MetricType.Resistance, origin: 'compiler' as const }] : []),\n ...(hasDistance ? [{ metricType: MetricType.Distance, origin: 'compiler' as const }] : []),\n ];\n builder.addBehavior(new MetricPromotionBehavior({\n repScheme,\n promotions\n }));\n\n // Leaf Exit Aspect — for round blocks with no children (e.g., \"(3) Pullups\"),\n // declare an immediate exit so userNext completes the block. If the block\n // turns out to have children, ChildrenStrategy declares 'deferred', which\n // supersedes this. Resolved into one ExitBehavior in BlockBuilder.build().\n builder.declareExit('immediate');\n }\n}","import { IRuntimeBlockStrategy } from \"../../../contracts/IRuntimeBlockStrategy\";\nimport { BlockBuilder } from \"../../BlockBuilder\";\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport type { IRuntimeContext } from \"../../../contracts/IRuntimeContext\";\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\nimport { compose } from \"../../BlockTemplateComposer\";\nimport type { BlockTemplate } from \"../../BlockTemplate\";\n\n// New aspect-based behaviors\nimport {\n LabelingBehavior,\n MetricPromotionBehavior,\n} from \"../../../behaviors\";\n\n/**\n * GenericGroupStrategy handles blocks with children but no timer/loop.\n * \n * Uses aspect-based behaviors:\n * - Display: DisplayInit\n * - Output: HistoryRecord\n */\nexport class GenericGroupStrategy implements IRuntimeBlockStrategy {\n priority = 50; // Same as GenericTimer/GenericLoop; runs before ChildrenStrategy (same priority, registered earlier)\n readonly id = 'generic-group';\n\n match(statements: ICodeStatement[], _runtime: IRuntimeContext): boolean {\n if (!statements || statements.length === 0) return false;\n \n // Match if ANY statement has children but NO statement has timer/rounds\n const hasChildren = statements.some(s => s.children && s.children.length > 0);\n const hasTimer = statements.some(s => s.metrics.some(f => f.type === MetricType.Duration && f.origin !== 'runtime'));\n const hasRounds = statements.some(s => s.metrics.some(f => f.type === MetricType.Rounds && f.origin !== 'runtime'));\n \n return hasChildren && !hasTimer && !hasRounds;\n }\n\n apply(builder: BlockBuilder, statements: ICodeStatement[], runtime: IRuntimeContext): void {\n // If we have a timer or loop behavior, the identity is already set (Timer/Rounds/AMRAP/EMOM).\n if (builder.hasTimerBehavior() || builder.hasRoundConfig()) {\n return;\n }\n\n // If we are here, it has children but no timer/loop. It is a simple Group.\n const template: BlockTemplate = {\n blockType: 'Group',\n defaultLabel: 'Group',\n statements,\n runtime,\n };\n\n const label = compose(builder, template);\n\n // =====================================================================\n // Display Aspect\n // =====================================================================\n builder.addBehavior(new LabelingBehavior({\n mode: 'clock',\n label\n }));\n\n // =====================================================================\n // Promotion Aspect — cascade resistance/distance to child blocks\n // =====================================================================\n const hasResistance = statements.some(s => s.metrics.some(m => m.type === MetricType.Resistance));\n const hasDistance = statements.some(s => s.metrics.some(m => m.type === MetricType.Distance));\n const promotions = [\n ...(hasResistance ? [{ metricType: MetricType.Resistance, origin: 'compiler' as const }] : []),\n ...(hasDistance ? [{ metricType: MetricType.Distance, origin: 'compiler' as const }] : []),\n ];\n if (promotions.length > 0) {\n builder.addBehavior(new MetricPromotionBehavior({ promotions }));\n }\n }\n}\n","import { IRuntimeBlockStrategy } from \"../../../contracts/IRuntimeBlockStrategy\";\nimport { BlockBuilder } from \"../../BlockBuilder\";\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport type { IRuntimeContext } from \"../../../contracts/IRuntimeContext\";\n\n// New aspect-based behaviors\nimport {\n SoundCueBehavior,\n CountdownTimerBehavior,\n CountupTimerBehavior\n} from \"../../../behaviors\";\n\n/**\n * SoundStrategy adds sound cues to timer-based blocks.\n * \n * Uses aspect-based behaviors:\n * - Output: SoundCueBehavior\n * \n * This is a low-priority enhancement that adds sound cues\n * if not already added by a higher-priority strategy.\n */\nexport class SoundStrategy implements IRuntimeBlockStrategy {\n priority = 20;\n readonly id = 'sound';\n\n match(statements: ICodeStatement[], _runtime: IRuntimeContext): boolean {\n return statements && statements.length > 0;\n }\n\n apply(builder: BlockBuilder, _statements: ICodeStatement[], _runtime: IRuntimeContext): void {\n // Skip if sound already added by Logic strategy\n if (builder.hasBehavior(SoundCueBehavior)) {\n return;\n }\n\n // Countdown timer: add 3-2-1 beeps and completion cue\n const countdown = builder.getBehavior(CountdownTimerBehavior);\n if (countdown) {\n builder.addBehavior(new SoundCueBehavior({\n cues: [\n { sound: 'countdown-beep', trigger: 'countdown', atSeconds: [3, 2, 1] },\n { sound: 'timer-complete', trigger: 'complete' }\n ]\n }));\n return;\n }\n\n // Countup timer: start beep only\n if (builder.hasBehavior(CountupTimerBehavior)) {\n builder.addBehavior(new SoundCueBehavior({\n cues: [\n { sound: 'start-beep', trigger: 'mount' }\n ]\n }));\n }\n }\n}\n","import { IRuntimeBlockStrategy } from \"../../../contracts/IRuntimeBlockStrategy\";\nimport { BlockBuilder } from \"../../BlockBuilder\";\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport type { IRuntimeContext } from \"../../../contracts/IRuntimeContext\";\nimport { ReportOutputBehavior } from \"../../../behaviors\";\n\n/**\n * ReportOutputStrategy adds output reporting behavior to blocks.\n *\n * Uses aspect-based behaviors:\n * - Output: ReportOutputBehavior\n *\n * This is a low-priority enhancement (Priority 15) that adds segment\n * and milestone reporting if not already added. By running with a low\n * priority, it ensures the behavior is added AFTER child selection and\n * round management behaviors, so that round advancement occurs before\n * milestone emission in the onNext chain.\n */\nexport class ReportOutputStrategy implements IRuntimeBlockStrategy {\n priority = 15;\n readonly id = 'report-output';\n\n match(statements: ICodeStatement[], _runtime: IRuntimeContext): boolean {\n return statements && statements.length > 0;\n }\n\n apply(builder: BlockBuilder, _statements: ICodeStatement[], _runtime: IRuntimeContext): void {\n // Skip if already added by a Logic strategy (for special config)\n if (builder.hasBehavior(ReportOutputBehavior)) {\n return;\n }\n\n // Add standard report output behavior. \n // It will automatically pick up the block's label for output.\n builder.addBehavior(new ReportOutputBehavior());\n }\n}\n","import { IRuntimeBlockStrategy } from \"../../../contracts/IRuntimeBlockStrategy\";\nimport { BlockBuilder } from \"../../BlockBuilder\";\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport type { IRuntimeContext } from \"../../../contracts/IRuntimeContext\";\n\n// Specific behaviors not covered by aspect composers\nimport {\n CountdownTimerBehavior,\n} from \"../../../behaviors\";\n\n/**\n * ChildrenStrategy handles blocks with child statements.\n *\n * Uses aspect composer methods:\n * - .asRepeater() - Stores round config for ChildSelectionBehavior\n * - .asContainer() - Child execution with optional looping (consumes round config)\n * Plus ExitBehavior in deferred mode for container completion pop.\n */\nexport class ChildrenStrategy implements IRuntimeBlockStrategy {\n priority = 50;\n readonly id = 'children';\n\n match(statements: ICodeStatement[], _runtime: IRuntimeContext): boolean {\n return statements && statements.length > 0 &&\n statements[0].children &&\n statements[0].children.length > 0;\n }\n\n apply(builder: BlockBuilder, statements: ICodeStatement[], _runtime: IRuntimeContext): void {\n // children is already number[][] (grouped child statement IDs)\n const children = statements[0].children!;\n\n // Filter out empty groups\n const childGroups = children.filter(group => group.length > 0);\n\n // Check if rounds were already set up by another strategy (e.g., GenericLoopStrategy)\n // This indicates multi-round blocks like Annie (50-40-30-20-10) that need child looping\n const hasRoundsFromStrategy = builder.hasRoundConfig();\n // Check if a countdown timer controls completion (AMRAP/EMOM pattern)\n const countdown = builder.getBehavior(CountdownTimerBehavior);\n const hasCountdownCompletion = !!countdown;\n\n // =====================================================================\n // Round config — must be stored BEFORE asContainer() consumes it\n // =====================================================================\n if (!hasRoundsFromStrategy) {\n if (hasCountdownCompletion) {\n // Countdown timer (AMRAP pattern): unbounded rounds, timer controls completion\n builder.asRepeater({ totalRounds: undefined, startRound: 1, addCompletion: false });\n } else {\n // Single pass through children (no timer, or countup \"for time\" timer)\n builder.asRepeater({ totalRounds: 1, startRound: 1, addCompletion: true });\n }\n }\n\n // =====================================================================\n // ASPECT COMPOSERS - High-level composition\n // =====================================================================\n\n // Container Aspect - Child execution with optional looping/rest.\n // asContainer() picks up the pending round config from asRepeater() above\n // and injects startRound/totalRounds into ChildSelectionBehavior.\n const shouldAddLoop = (hasCountdownCompletion || hasRoundsFromStrategy);\n const loopCondition = hasRoundsFromStrategy ? 'rounds-remaining' : 'timer-active';\n\n // Only inject rest for interval-based countdowns (EMOM).\n // For block-capping countdowns (AMRAP), rounds should restart immediately.\n const shouldInjectRest = hasCountdownCompletion && countdown?.config.mode === 'reset-interval';\n\n builder.asContainer({\n childGroups,\n addLoop: shouldAddLoop,\n loopConfig: shouldAddLoop ? { condition: loopCondition } : undefined,\n injectRest: shouldInjectRest,\n });\n\n // =====================================================================\n // Completion Aspect — declare a deferred exit for all container blocks.\n // Fires on next() only once block.isComplete is set externally (timer\n // expiry, rounds exhausted). Resolved into one ExitBehavior in build();\n // supersedes any leaf strategy's 'immediate' declaration.\n // =====================================================================\n builder.declareExit('deferred');\n }\n}\n","import { IRuntimeBlockStrategy } from \"../../../contracts/IRuntimeBlockStrategy\";\nimport { BlockBuilder } from \"../../BlockBuilder\";\nimport { ICodeStatement } from '@bitcobblers/wod-wiki-core';\nimport type { IRuntimeContext } from \"../../../contracts/IRuntimeContext\";\nimport { MetricType } from '@bitcobblers/wod-wiki-core';\n\n// Specific behaviors not covered by aspect composers\nimport { ExitBehavior } from \"../../../behaviors/ExitBehavior\";\nimport { compose } from \"../../BlockTemplateComposer\";\n\n/**\n * EffortFallbackStrategy handles simple leaf effort blocks (e.g., \"10 Push-ups\").\n *\n * These blocks have no timer, no rounds, and no children — they complete when\n * the user advances. They track elapsed time via a secondary countup timer so\n * the stack display can show how long each effort takes.\n *\n * Blocks WITH children are excluded from this strategy and handled by\n * GenericGroupStrategy + ChildrenStrategy instead, which properly push child\n * blocks onto the stack via ChildRunnerBehavior.\n */\nexport class EffortFallbackStrategy implements IRuntimeBlockStrategy {\n priority = 0;\n readonly id = 'effort-fallback';\n\n match(statements: ICodeStatement[], _runtime: IRuntimeContext): boolean {\n if (!statements || statements.length === 0) return false;\n\n // Check if ANY statement has timer, rounds, or children\n const hasTimer = statements.some(s => s.metrics.some(f => f.type === MetricType.Duration && f.origin !== 'runtime'));\n const hasRounds = statements.some(s => s.metrics.some(f => f.type === MetricType.Rounds && f.origin !== 'runtime'));\n const hasChildren = statements.some(s => s.children && s.children.length > 0);\n\n return !hasTimer && !hasRounds && !hasChildren;\n }\n\n apply(builder: BlockBuilder, statements: ICodeStatement[], runtime: IRuntimeContext): void {\n // Route through the shared chassis composer — key, context, label,\n // source IDs, fragments, and the timer aspect are all handled by\n // `compose()`. Only the exit behavior is the delta.\n compose(builder, {\n blockType: 'effort',\n defaultLabel: 'Effort',\n statements,\n runtime,\n // Secondary countup timer so the stack display shows how long\n // the effort took. Role 'secondary' prevents it from stealing\n // primary display from a parent timer. Mode 'reset-interval'\n // means no timer completion (the user advances manually).\n timer: {\n direction: 'up',\n role: 'secondary',\n mode: 'reset-interval',\n },\n filterMetrics: f => f.origin !== 'runtime',\n });\n\n // Completion Aspect: complete on user advance (no timer completion).\n builder.addBehavior(new ExitBehavior({ mode: 'immediate', onNext: true }));\n }\n}\n","import { JitCompiler } from '../compiler/JitCompiler';\nimport { Registry } from '../../registry/Registry';\n\n// Strategies (ordered by specificity)\nimport { AmrapLogicStrategy } from '../compiler/strategies/logic/AmrapLogicStrategy';\nimport { IntervalLogicStrategy } from '../compiler/strategies/logic/IntervalLogicStrategy';\nimport { GenericTimerStrategy } from '../compiler/strategies/components/GenericTimerStrategy';\nimport { GenericLoopStrategy } from '../compiler/strategies/components/GenericLoopStrategy';\nimport { GenericGroupStrategy } from '../compiler/strategies/components/GenericGroupStrategy';\nimport { SoundStrategy } from '../compiler/strategies/enhancements/SoundStrategy';\nimport { ReportOutputStrategy } from '../compiler/strategies/enhancements/ReportOutputStrategy';\nimport { ChildrenStrategy } from '../compiler/strategies/enhancements/ChildrenStrategy';\nimport { EffortFallbackStrategy } from '../compiler/strategies/fallback/EffortFallbackStrategy';\n\nimport type { IRuntimeBlockStrategy } from '../contracts/IRuntimeBlockStrategy';\n\n/**\n * Consumer-facing strategy registry, pre-seeded with the built-in strategies.\n *\n * Replaces the previous hardcoded `PRODUCTION_STRATEGIES` flat array. Consumer\n * code can call `strategyRegistry.register(new MyStrategy())` to add their\n * own strategies without editing the library.\n *\n * @example\n * ```typescript\n * import { strategyRegistry } from 'wod-wiki/core';\n * strategyRegistry.register(new MySportStrategy());\n * ```\n *\n * Note: rest blocks are NOT produced by a JIT strategy. They are built\n * directly at runtime (PushRestBlockAction / BlockBuilder) and pushed onto\n * the stack, so no rest strategy appears in this registry.\n */\nexport const strategyRegistry = new Registry<IRuntimeBlockStrategy>([\n // Logic (priority 90)\n new AmrapLogicStrategy(),\n new IntervalLogicStrategy(),\n\n // Components (priority 50)\n new GenericTimerStrategy(),\n new GenericLoopStrategy(),\n new GenericGroupStrategy(),\n\n // Enhancements (priority 15–50)\n new SoundStrategy(),\n new ReportOutputStrategy(),\n new ChildrenStrategy(),\n\n // Fallback (priority 0)\n new EffortFallbackStrategy(),\n]);\n/**\n * Legacy array form of the production strategy set, kept for backward\n * compatibility. Derived from {@link strategyRegistry} (same instances, same\n * priority-sorted order `JitCompiler` itself would apply) rather than\n * re-constructing a separate set of strategy instances — a previous version\n * of this export built its own `new XxxStrategy()` list independently,\n * which meant `strategyRegistry.register()`/`unregister()` calls silently\n * had no effect on anything reading `PRODUCTION_STRATEGIES` directly. Use\n * `strategyRegistry` (or `createCompiler()`, which reads it live) for new code.\n */\nexport const PRODUCTION_STRATEGIES: readonly IRuntimeBlockStrategy[] = strategyRegistry.list();\n\n/**\n * Create a JitCompiler with the given strategies (or the registered set).\n *\n * The default argument now reads from the consumer-facing\n * {@link strategyRegistry} so consumer registrations are honored. Pass an\n * explicit array to override (e.g. in tests).\n */\nexport function createCompiler(strategies?: IRuntimeBlockStrategy[]): JitCompiler {\n const compiler = new JitCompiler();\n for (const strategy of (strategies ?? strategyRegistry.list())) {\n compiler.registerStrategy(strategy);\n }\n return compiler;\n}\n","import { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\nimport { BlockLifecycleOptions } from '../../contracts/IRuntimeBlock';\nimport { SessionRootStrategy } from '../../compiler/strategies/SessionRootStrategy';\nimport { SessionRootConfig } from '../../blocks/SessionRootBlock';\nimport { PushBlockAction } from './PushBlockAction';\n\n/**\n * Configuration for starting a workout.\n */\nexport interface StartWorkoutOptions {\n /** Display label for the session */\n label?: string;\n /** Total rounds for the workout (default: 1) */\n totalRounds?: number;\n /** Optional lifecycle options for the root block */\n lifecycle?: BlockLifecycleOptions;\n}\n\n/**\n * Action that initializes a workout by wrapping the script's statements\n * in a root block and pushing it onto the stack.\n *\n * This action:\n * 1. Reads all top-level statements from runtime.script\n * 2. Creates child groups (each top-level statement in its own group)\n * 3. Builds a SessionRootBlock using SessionRootStrategy\n * 4. Pushes the root block to start the workout\n *\n * @example\n * ```typescript\n * runtime.do(new StartWorkoutAction());\n * runtime.do(new StartWorkoutAction({ label: 'Grace', totalRounds: 3 }));\n * ```\n */\nexport class StartWorkoutAction implements IRuntimeAction {\n readonly type = 'start-workout';\n\n constructor(private readonly options: StartWorkoutOptions = {}) {}\n\n do(runtime: IRuntimeContext): IRuntimeAction[] {\n // Guard: Check if workout already started (root block on stack)\n if (runtime.stack.count > 0) {\n console.warn('[StartWorkoutAction] Workout already started - stack is not empty');\n return [];\n }\n\n // Guard: Check for statements\n const statements = runtime.script?.statements;\n if (!statements || statements.length === 0) {\n console.warn('[StartWorkoutAction] No statements in script to start');\n return [];\n }\n\n // Build child groups: filter to top-level statements only\n const childStatementIds = new Set<number>();\n for (const s of statements) {\n if (s.children) {\n for (const childGroup of s.children) {\n for (const childId of childGroup) childStatementIds.add(childId);\n }\n }\n }\n const topLevelStatements = statements.filter(s => !childStatementIds.has(s.id));\n const childGroups = topLevelStatements.map(s => [s.id]);\n\n const rootConfig: SessionRootConfig = {\n childGroups,\n label: this.options.label,\n totalRounds: this.options.totalRounds ?? 1,\n };\n\n // Create root block using SessionRootStrategy\n const rootStrategy = new SessionRootStrategy();\n const rootBlock = rootStrategy.build(runtime, rootConfig);\n\n // Build lifecycle options with start time\n const lifecycle: BlockLifecycleOptions = {\n startTime: runtime.clock.currentDate,\n ...this.options.lifecycle\n };\n\n // Push root block via PushBlockAction\n return [new PushBlockAction(rootBlock, lifecycle)];\n }\n}\n","import { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\nimport { IEventHandler } from '../../contracts/events/IEventHandler';\nimport { HandlerScope } from '../../contracts/events/IEventBus';\n\n/**\n * Action for declaratively registering an event handler.\n * \n * This action manages event handler registration by storing the handler\n * in runtime memory, making it available for event processing.\n * \n * @example\n * ```typescript\n * // Register a handler for block completion (default 'active' scope)\n * const handler = new BlockCompleteEventHandler(blockId);\n * return [new RegisterEventHandlerAction(handler, blockId)];\n * \n * // Register a handler that listens to child events ('bubble' scope)\n * return [new RegisterEventHandlerAction(handler, blockId, 'bubble')];\n * ```\n */\nexport class RegisterEventHandlerAction implements IRuntimeAction {\n readonly type = 'register-event-handler';\n \n constructor(\n /** The event handler to register */\n public readonly handler: IEventHandler,\n /** The block ID that owns this handler (for cleanup) */\n public readonly ownerId: string,\n /** Handler scope. Default: 'active' (only fires when owner is current block) */\n public readonly scope: HandlerScope = 'active'\n ) {}\n\n do(runtime: IRuntimeContext): void {\n runtime.eventBus.register('*', this.handler, this.ownerId, { scope: this.scope });\n }\n}\n","import { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\n\n/**\n * Action for declaratively unregistering an event handler.\n * \n * This action manages event handler cleanup by removing the handler\n * from runtime memory, preventing further event processing.\n * \n * @example\n * ```typescript\n * // Unregister a handler during block disposal\n * return [new UnregisterEventHandlerAction(handlerId)];\n * ```\n */\nexport class UnregisterEventHandlerAction implements IRuntimeAction {\n readonly type = 'unregister-event-handler';\n \n constructor(\n /** The ID of the handler to unregister */\n public readonly handlerId: string\n ) {}\n\n do(runtime: IRuntimeContext): void {\n runtime.eventBus.unregisterById(this.handlerId);\n }\n}\n","import { IRuntimeAction } from '../../contracts/IRuntimeAction';\nimport type { IRuntimeContext } from '../../contracts/IRuntimeContext';\nimport { INowProvider, wallClockNow } from '../../INowProvider';\n/**\n * Action for playing sounds during workout execution.\n * \n * This action emits a 'sound:play' event that can be consumed by UI components\n * to trigger audio playback. The runtime itself does not handle audio playback\n * directly - it delegates to registered sound handlers.\n * \n * @example\n * ```typescript\n * // Play a predefined beep sound\n * return [new PlaySoundAction('beep')];\n * \n * // Play a sound at 50% volume\n * return [new PlaySoundAction('buzzer', 0.5)];\n * \n * // Play a custom sound URL\n * return [new PlaySoundAction('https://example.com/sound.mp3')];\n * ```\n */\nexport class PlaySoundAction implements IRuntimeAction {\n readonly type = 'play-sound';\n \n constructor(\n /** \n * Sound identifier. Can be:\n * - Predefined sound name: 'beep', 'buzzer', 'chime', 'tick'\n * - URL to audio file\n */\n public readonly sound: string,\n /** Volume level (0.0 to 1.0). Default is 1.0 */\n public readonly volume: number = 1.0,\n /** Optional cue ID for tracking which cue triggered this sound */\n public readonly cueId?: string,\n private readonly now: INowProvider = wallClockNow,\n ) {\n // Validate volume range\n if (volume < 0 || volume > 1) {\n throw new RangeError(`Volume must be between 0.0 and 1.0, got: ${volume}`);\n }\n }\n\n /**\n * Executes the sound playback by emitting a 'sound:play' event.\n * UI components should register handlers for this event to play audio.\n */\n do(runtime: IRuntimeContext): IRuntimeAction[] {\n const event = {\n name: 'sound:play',\n timestamp: this.now.now(),\n data: {\n sound: this.sound,\n volume: this.volume,\n cueId: this.cueId\n }\n };\n return runtime.eventBus.dispatch(event, runtime);\n }\n}\n","\n\nimport { AnalyticsGroup, AnalyticsGraphConfig, Segment } from '@bitcobblers/wod-wiki-core';\n\nimport { IMetric, MetricType } from '@bitcobblers/wod-wiki-core';\nimport { MetricContainer } from '@bitcobblers/wod-wiki-core';\nimport { getHints } from '../metrics/hints';\nimport { IOutputStatement } from '@bitcobblers/wod-wiki-core';\nimport type { StoredOutputStatement } from '@bitcobblers/wod-wiki-core';\nimport { IScriptRuntime } from '../runtime/contracts/IScriptRuntime';\nimport { INowProvider, wallClockNow } from '../runtime/INowProvider';\n\n/**\n * Union accepted by the transformer — either a live OutputStatement (from a\n * running runtime) or a plain StoredOutputStatement (loaded from IndexedDB).\n */\ntype OutputLike = IOutputStatement | StoredOutputStatement;\n\n/**\n * Format a metric key into a human-readable label.\n * Capitalizes the first letter and replaces underscores with spaces.\n */\nfunction formatMetricLabel(key: string): string {\n return key.charAt(0).toUpperCase() + key.slice(1).replace(/_/g, ' ');\n}\n\n/**\n * Extract a stable analytics key from a metric.\n *\n * Preference order:\n * 1. Explicit metric key / calculated target\n * 2. Canonical metric type mapping used by graph surfaces\n * 3. Raw metric type as a safe fallback\n */\nfunction resolveAnalyticsMetricKey(metric: IMetric): string {\n const enrichedMetric = metric as IMetric & { key?: string; metadata?: { target?: string } };\n const explicitKey = enrichedMetric.key ?? enrichedMetric.metadata?.target;\n if (typeof explicitKey === 'string' && explicitKey.trim().length > 0) {\n return explicitKey;\n }\n\n switch (metric.type) {\n case 'rep':\n return 'reps'; // Canonical Metric Key — same in fact rows and display (CONTEXT.md)\n case 'distance':\n return 'distance';\n case 'resistance':\n return 'resistance';\n default:\n return metric.type;\n }\n}\n\n/**\n * Extract numeric metrics from metric groups.\n */\nfunction extractMetricsFromGroups(metricsGroups: IMetric[][]): Record<string, number> {\n const result: Record<string, number> = {};\n const flat = metricsGroups.flat();\n\n for (const f of flat) {\n if (f.value !== undefined && typeof f.value === 'number') {\n const key = resolveAnalyticsMetricKey(f);\n const val = f.value;\n // Convert time-based metrics (except elapsed/total which are handled separately)\n // from milliseconds to seconds for consistency in the analytics data points.\n if (f.type === 'duration') {\n // Duration (intent) is now handled as a top-level segment property,\n // we don't want it in the dynamic metrics map to avoid double-counting\n // or unit confusion in the performance graphs.\n continue;\n }\n\n result[key] = (result[key] || 0) + val;\n }\n }\n return result;\n}\n\n/**\n * UI-ready segment format.\n */\nexport interface SegmentWithMetadata extends Segment {\n metrics?: MetricContainer;\n tags?: string[];\n spanType?: string;\n context?: Record<string, any>;\n}\n\n/**\n * AnalyticsTransformer - Transforms OutputStatements into UI-ready analytics data.\n */\nexport class AnalyticsTransformer {\n\n /**\n * Transform OutputStatements into UI-ready Segments.\n * This is the primary API for the new runtime architecture.\n */\n fromOutputStatements(outputs: OutputLike[], workoutStartTime?: number, now: INowProvider = wallClockNow): SegmentWithMetadata[] {\n if (!outputs || outputs.length === 0) {\n return [];\n }\n\n // Find the earliest start time from all outputs (ignoring NaNs).\n // Stored rows may lack a timeSpan (pre-V13 logs) — skip those.\n const validStartTimes = outputs\n .map(o => o.timeSpan?.started)\n .filter((t): t is number => typeof t === 'number' && !isNaN(t));\n\n const startTime = workoutStartTime ?? (\n validStartTimes.length > 0 ? Math.min(...validStartTimes) : 0\n );\n\n return outputs.map(output => {\n const outputMetrics = MetricContainer.from(output.metrics as IMetric[], output.id);\n\n // Intent: parser-defined duration (if any)\n const durationFrag = outputMetrics.find(f => f.type === 'duration');\n const intentDuration = durationFrag?.value !== undefined ? (durationFrag.value as number) / 1000 : undefined;\n\n // Real Time: pause-aware elapsed time and wall-clock total\n // These are stored as canonical metrics on OutputStatement.\n const elapsedMetric = outputMetrics.find(m => m.type === MetricType.Elapsed);\n const elapsed = (typeof elapsedMetric?.value === 'number' ? elapsedMetric.value : 0) / 1000;\n\n const totalMetric = outputMetrics.find(m => m.type === MetricType.Total);\n const total = (typeof totalMetric?.value === 'number' ? totalMetric.value : 0) / 1000;\n\n const startTimeMs = output.timeSpan?.started ?? startTime;\n const endTimeMs = output.timeSpan?.ended ?? now.nowMs();\n\n const extractedMetrics = extractMetricsFromGroups([outputMetrics.toArray()]);\n\n const nameMetric = outputMetrics.find(f =>\n f.type === 'effort' ||\n f.type === 'action' ||\n f.type === 'duration' ||\n f.type === 'rounds' ||\n f.type === 'current-round' ||\n f.type === 'label'\n );\n const label = nameMetric?.image || output.sourceBlockKey;\n const type = nameMetric?.type || output.outputType;\n\n // Spans are recorded using the runtime clock.\n // We convert them to session-relative seconds for visualization.\n const spansMetric = outputMetrics.find(m => m.type === MetricType.Spans);\n const metricSpans = Array.isArray(spansMetric?.value) ? spansMetric.value : [];\n const rawSpans = metricSpans.length > 0\n ? metricSpans\n : (output.timeSpan ? [output.timeSpan] : []);\n\n const spans = rawSpans.map(s => ({\n started: (s.started - startTime) / 1000,\n ended: s.ended !== undefined ? (s.ended - startTime) / 1000 : undefined,\n }));\n\n return {\n id: output.id ?? 0,\n name: label ?? '',\n type: type ?? 'segment',\n startTime: (startTimeMs - startTime) / 1000,\n endTime: (endTimeMs - startTime) / 1000,\n absoluteStartTime: startTimeMs,\n duration: intentDuration,\n elapsed,\n total,\n parentId: output.parent ?? null,\n depth: output.stackLevel ?? 0,\n metric: extractedMetrics,\n lane: output.stackLevel ?? 0,\n spans,\n metrics: outputMetrics,\n tags: (() => { const h = getHints(output as { metrics: IMetric[] }); return h.length ? h : undefined; })(),\n context: {\n outputType: output.outputType,\n sourceStatementId: output.sourceStatementId,\n sourceBlockKey: output.sourceBlockKey,\n completionReason: output.completionReason,\n },\n spanType: output.outputType ?? 'segment'\n };\n });\n }\n\n /**\n * Group segments by analytics categories.\n */\n toAnalyticsGroup(segments: SegmentWithMetadata[]): AnalyticsGroup[] {\n const groups: AnalyticsGroup[] = [];\n const availableMetricKeys = new Set<string>();\n segments.forEach(s => Object.keys(s.metric).forEach(k => availableMetricKeys.add(k)));\n\n const standardMetrics: Record<string, AnalyticsGraphConfig> = {\n 'power': { id: 'power', label: 'Power', unit: 'W', color: '#8b5cf6', dataKey: 'power', icon: 'Zap' },\n 'heart_rate': { id: 'heart_rate', label: 'Heart Rate', unit: 'bpm', color: '#ef4444', dataKey: 'heart_rate', icon: 'Activity' },\n 'cadence': { id: 'cadence', label: 'Cadence', unit: 'rpm', color: '#3b82f6', dataKey: 'cadence', icon: 'Wind' },\n 'speed': { id: 'speed', label: 'Speed', unit: 'km/h', color: '#10b981', dataKey: 'speed', icon: 'Gauge' },\n 'resistance': { id: 'resistance', label: 'Resistance', unit: 'kg', color: '#f59e0b', dataKey: 'resistance', icon: 'Dumbbell' },\n 'reps': { id: 'reps', label: 'Reps', unit: 'reps', color: '#6366f1', dataKey: 'reps', icon: 'Hash' },\n 'calories': { id: 'calories', label: 'Calories', unit: 'cal', color: '#f97316', dataKey: 'calories', icon: 'Flame' },\n 'duration': { id: 'duration', label: 'Duration', unit: 's', color: '#0ea5e9', dataKey: 'duration', icon: 'Timer' },\n 'elapsed': { id: 'elapsed', label: 'Elapsed', unit: 's', color: '#14b8a6', dataKey: 'elapsed', icon: 'Clock' },\n 'total': { id: 'total', label: 'Total', unit: 's', color: '#f43f5e', dataKey: 'total', icon: 'Timer' },\n };\n\n const performanceGraphs: AnalyticsGraphConfig[] = [];\n availableMetricKeys.forEach(key => {\n if (standardMetrics[key]) {\n performanceGraphs.push(standardMetrics[key]);\n } else {\n performanceGraphs.push({\n id: key,\n label: formatMetricLabel(key),\n unit: '',\n color: '#888888',\n dataKey: key\n });\n }\n });\n\n if (performanceGraphs.length > 0) {\n groups.push({ id: 'performance', name: 'Performance', graphs: performanceGraphs });\n }\n\n return groups;\n }\n\n /**\n * Filter segments by tag.\n */\n filterByTags(segments: SegmentWithMetadata[], tags: string[]): SegmentWithMetadata[] {\n if (!tags || tags.length === 0) {\n return segments;\n }\n\n return segments.filter(segment => {\n const segmentTags = segment.tags || [];\n return tags.every(tag => segmentTags.includes(tag));\n });\n }\n\n /**\n * Filter segments by workout type.\n */\n filterByType(segments: SegmentWithMetadata[], type: string): SegmentWithMetadata[] {\n return segments.filter(segment => segment.spanType === type);\n }\n\n /**\n * Get debug context from a segment.\n */\n getDebugContext(segment: SegmentWithMetadata): Record<string, unknown> {\n return segment.context || {};\n }\n\n /**\n * Check if a segment was created by a specific strategy.\n */\n isFromStrategy(segment: SegmentWithMetadata, strategyName: string): boolean {\n const context = this.getDebugContext(segment);\n return context.strategyUsed === strategyName;\n }\n}\n\n/**\n * Analytics result from transforming runtime output.\n */\nexport interface AnalyticsResult {\n segments: SegmentWithMetadata[];\n groups: AnalyticsGroup[];\n}\n\n/**\n * Transform runtime output statements into analytics-ready data.\n * This is the primary entry point for analytics visualization.\n * \n * @param runtime The script runtime to extract output from\n * @returns Analytics data including time-series data, segments, and metric groups\n */\nexport function getAnalyticsFromRuntime(runtime: IScriptRuntime | null): AnalyticsResult {\n if (!runtime) return { segments: [], groups: [] };\n\n const transformer = new AnalyticsTransformer();\n const allOutputs = runtime.getOutputStatements();\n // Filter for workout segments and analytics outputs — avoids 'load', 'system', 'event' outputs\n // appearing in results and analytics graphs. During a live session the persisted\n // buffer holds no Tier-2 totals (they stay ephemeral), so fold in the live\n // running-total snapshot for display. After finalize the finals are already in\n // the buffer and the snapshot is empty, so this never double-counts.\n const outputs = allOutputs.filter(o =>\n o.outputType === 'segment' ||\n o.outputType === 'analytics' ||\n o.outputType === 'milestone'\n );\n const liveAnalytics = runtime.getLiveAnalytics?.() ?? [];\n const source = liveAnalytics.length > 0 ? [...outputs, ...liveAnalytics] : outputs;\n \n const segments = transformer.fromOutputStatements(source);\n\n if (segments.length === 0) {\n return { segments: [], groups: [] };\n }\n\n const groups = transformer.toAnalyticsGroup(segments);\n\n return { segments, groups };\n}\n\n/**\n * Derive analytics segments from a stored workout log.\n *\n * This is the **canonical read path** for all analytics derived from a\n * completed workout. WorkoutResult.data.logs (StoredOutputStatement[]) is\n * the source of truth; call this function to obtain Segment[] for display,\n * review grids, or trend summaries.\n *\n * Relationship to the analytics IDB store:\n * The `analytics` IndexedDB store holds AnalyticsDataPoint[] summary fact\n * rows written by normalizeSummaryFacts() from Tier-2 outputs in data.logs.\n * They are NOT required for any current display feature. If they disagree\n * with logs, logs win. Use this function — not the analytics store — to\n * obtain segment data for display.\n *\n * @param outputs - StoredOutputStatement[] from WorkoutResult.data.logs\n * @param workoutStartTime - Optional workout start timestamp (ms). Used to\n * anchor relative timing in the segment timeline.\n * @param now - Optional clock provider; defaults to wall-clock.\n */\nexport function getAnalyticsFromLogs(outputs: StoredOutputStatement[], workoutStartTime?: number, now?: INowProvider): AnalyticsResult {\n if (!outputs || outputs.length === 0) return { segments: [], groups: [] };\n\n const transformer = new AnalyticsTransformer();\n // Rows read back from storage can carry the weak serialized metric shape\n // and a missing timeSpan (older logs). Normalize once at the boundary:\n // rows written by toStoredOutputStatement always carry both.\n const normalized: (StoredOutputStatement & {\n timeSpan: { started: number; ended?: number };\n metrics: IMetric[];\n })[] = outputs.map(o => ({\n ...o,\n timeSpan: o.timeSpan ?? { started: o.timestamp ?? 0 },\n metrics: (o.metrics as IMetric[]),\n }));\n\n // Filter for workout segments and analytics outputs — avoids historical 'load' outputs\n // appearing in results and analytics graphs.\n const filteredOutputs = normalized.filter(o =>\n o.outputType === 'segment' ||\n o.outputType === 'analytics' ||\n o.outputType === 'milestone'\n );\n\n // Drop duplicate 'analytics' outputs: same (label, value, unit) within the\n // same second. The pre-dedupe live+finalize pair was stamped with distinct\n // Date.now() values inside one second, so an exact-ms key misses it; a 1s\n // window catches it while preserving legitimate progressions (same value\n // recurring across rounds, seconds apart). Keep the last occurrence.\n // Fact-row identity is a separate contract — see normalizeSummaryFacts\n // (metricKey, keep-last) and AnalyticsEngine's emission signature.\n const lastKeptByKey = new Map<string, number>();\n const dedupedOutputs: StoredOutputStatement[] = [];\n for (let i = filteredOutputs.length - 1; i >= 0; i--) {\n const o = filteredOutputs[i];\n if (o.outputType === 'analytics') {\n const label = o.metrics.find(m => m.type === MetricType.Label);\n const value = o.metrics.find(m => m.type !== MetricType.Label && typeof m.value === 'number');\n if (label && value) {\n const key = [\n String(label.value ?? label.image ?? ''),\n String(value.value),\n value.unit ?? '',\n ].join('|');\n const kept = lastKeptByKey.get(key);\n if (kept !== undefined && Math.abs(kept - o.timeSpan.started) < 1000) continue;\n lastKeptByKey.set(key, o.timeSpan.started);\n }\n }\n dedupedOutputs.unshift(o);\n }\n\n const segments = transformer.fromOutputStatements(dedupedOutputs, workoutStartTime, now);\n\n if (segments.length === 0) {\n return { segments: [], groups: [] };\n }\n\n const groups = transformer.toAnalyticsGroup(segments);\n\n return { segments, groups };\n}\n\n","import type { IOutputStatement } from '@bitcobblers/wod-wiki-core';\nimport type { IMetric } from '@bitcobblers/wod-wiki-core';\n\n/**\n * Flatten all metrics from a collection of output statements into a single array.\n * Preserves order. Used by projection stages to replicate the metric stream\n * that AnalysisService previously received from ProjectionSyncProcess.\n */\nexport function extractMetrics(outputs: IOutputStatement[]): IMetric[] {\n return outputs.flatMap(o => o.metrics?.rawMetrics ?? []);\n}\n","import { MetricType } from '@bitcobblers/wod-wiki-core';\n\nimport type { IOutputStatement } from '@bitcobblers/wod-wiki-core';\nimport type { ISummaryProcessor } from './ISummaryProcessor';\nimport type { ProjectionResult } from './ProjectionResult';\n\nconst AGGREGATE_FUNCTIONS = new Set(['sum', 'mean', 'max', 'min', 'count']);\n\nexport interface CalculationDefinition {\n readonly target: string;\n readonly expression: string;\n readonly raw: string;\n readonly line: number;\n readonly ast: ExpressionNode;\n readonly sources: string[];\n}\n\nexport interface CalculateBlockParseError {\n readonly line: number;\n readonly raw: string;\n readonly message: string;\n}\n\nexport interface CalculateBlockParseResult {\n readonly definitions: CalculationDefinition[];\n readonly errors: CalculateBlockParseError[];\n}\n\ninterface CalculationRow {\n readonly source: IOutputStatement;\n readonly values: Map<string, number>;\n}\n\ninterface EvaluationContext {\n readonly rows: CalculationRow[];\n readonly computed: Map<string, number>;\n}\n\ntype ExpressionNode =\n | NumberNode\n | IdentifierNode\n | UnaryNode\n | BinaryNode\n | CallNode;\n\ninterface NumberNode {\n readonly kind: 'number';\n readonly value: number;\n}\n\ninterface IdentifierNode {\n readonly kind: 'identifier';\n readonly name: string;\n}\n\ninterface UnaryNode {\n readonly kind: 'unary';\n readonly operator: '+' | '-';\n readonly argument: ExpressionNode;\n}\n\ninterface BinaryNode {\n readonly kind: 'binary';\n readonly operator: '+' | '-' | '*' | '/' | '^';\n readonly left: ExpressionNode;\n readonly right: ExpressionNode;\n}\n\ninterface CallNode {\n readonly kind: 'call';\n readonly name: string;\n readonly args: ExpressionNode[];\n}\n\ntype TokenKind = 'number' | 'identifier' | 'operator' | 'paren' | 'comma' | 'eof';\n\ninterface Token {\n readonly kind: TokenKind;\n readonly value: string;\n readonly index: number;\n}\n\ninterface TokenStream {\n readonly tokens: Token[];\n readonly text: string;\n index: number;\n}\n\ninterface NumericCandidate {\n readonly key: string;\n readonly value: number;\n}\n\nexport class CalculateBlockProcessor implements ISummaryProcessor {\n public readonly id = 'calculate-block';\n public readonly name = 'CalculateBlockProcessor';\n\n constructor(private readonly definitions: readonly CalculationDefinition[]) {}\n\n summarize(outputs: IOutputStatement[]): ProjectionResult[] {\n return evaluateCalculateDefinitions(this.definitions, outputs);\n }\n}\n\n/**\n * Parse a `calculate` block into assignment definitions.\n */\nexport function parseCalculateBlock(content: string): CalculateBlockParseResult {\n const definitions: CalculationDefinition[] = [];\n const errors: CalculateBlockParseError[] = [];\n\n if (!content || !content.trim()) {\n return { definitions, errors };\n }\n\n const lines = content.split(/\\r?\\n/);\n for (let index = 0; index < lines.length; index++) {\n const raw = lines[index];\n const trimmed = raw.trim();\n\n if (!trimmed || trimmed.startsWith('//') || trimmed.startsWith('#')) {\n continue;\n }\n\n const assignment = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)\\s*=\\s*(.+)$/);\n if (!assignment) {\n errors.push({\n line: index + 1,\n raw,\n message: 'Expected `target = expression`',\n });\n continue;\n }\n\n const target = assignment[1];\n const expression = assignment[2].trim();\n\n try {\n const stream = tokenize(expression);\n const ast = parseExpression(stream);\n expectEnd(stream);\n definitions.push({\n target,\n expression,\n raw,\n line: index + 1,\n ast,\n sources: collectSources(ast),\n });\n } catch (error) {\n errors.push({\n line: index + 1,\n raw,\n message: error instanceof Error ? error.message : 'Invalid expression',\n });\n }\n }\n\n return { definitions, errors };\n}\n\n/**\n * Evaluate calculate definitions against runtime output statements.\n */\nexport function evaluateCalculateDefinitions(\n definitions: readonly CalculationDefinition[],\n outputs: readonly IOutputStatement[],\n): ProjectionResult[] {\n if (!definitions.length || !outputs.length) {\n return [];\n }\n\n const rows = buildCalculationRows(outputs);\n if (rows.length === 0) {\n return [];\n }\n\n const computed = new Map<string, number>();\n const now = new Date();\n const results: ProjectionResult[] = [];\n\n for (const definition of definitions) {\n const value = evaluateDefinition(definition, { rows, computed });\n if (value === undefined || Number.isNaN(value) || !Number.isFinite(value)) {\n continue;\n }\n\n computed.set(normalizeName(definition.target), value);\n results.push({\n name: definition.target,\n value,\n unit: '',\n metricType: MetricType.Calculated,\n timeSpan: { started: now.getTime(), ended: now.getTime() },\n origin: 'runtime',\n metadata: {\n target: definition.target,\n expression: definition.expression,\n sources: definition.sources,\n line: definition.line,\n rowCount: rows.length,\n },\n });\n }\n\n return results;\n}\n\nfunction evaluateDefinition(\n definition: CalculationDefinition,\n context: EvaluationContext,\n): number | undefined {\n return evaluateNode(definition.ast, context, undefined);\n}\n\nfunction evaluateNode(\n node: ExpressionNode,\n context: EvaluationContext,\n row: CalculationRow | undefined,\n): number | undefined {\n switch (node.kind) {\n case 'number':\n return node.value;\n\n case 'identifier':\n return resolveIdentifier(node.name, context, row);\n\n case 'unary': {\n const value = evaluateNode(node.argument, context, row);\n if (value === undefined) return undefined;\n return node.operator === '-' ? -value : value;\n }\n\n case 'binary': {\n const left = evaluateNode(node.left, context, row);\n const right = evaluateNode(node.right, context, row);\n if (left === undefined || right === undefined) return undefined;\n\n switch (node.operator) {\n case '+': return left + right;\n case '-': return left - right;\n case '*': return left * right;\n case '/': return right === 0 ? undefined : left / right;\n case '^': return Math.pow(left, right);\n }\n }\n\n case 'call':\n return evaluateCall(node, context);\n }\n}\n\nfunction evaluateCall(\n node: CallNode,\n context: EvaluationContext,\n): number | undefined {\n const name = node.name.toLowerCase();\n\n if (!AGGREGATE_FUNCTIONS.has(name)) {\n return undefined;\n }\n\n const values: number[] = [];\n\n if (name === 'count' && node.args.length === 0) {\n return context.rows.length;\n }\n\n for (const candidateRow of context.rows) {\n if (node.args.length === 0) {\n values.push(1);\n continue;\n }\n\n const value = evaluateNode(node.args[0], context, candidateRow);\n if (value === undefined || Number.isNaN(value) || !Number.isFinite(value)) {\n continue;\n }\n values.push(value);\n }\n\n if (name === 'count') {\n return values.length;\n }\n\n if (values.length === 0) {\n return name === 'sum' ? 0 : undefined;\n }\n\n switch (name) {\n case 'sum':\n return values.reduce((sum, value) => sum + value, 0);\n case 'mean':\n return values.reduce((sum, value) => sum + value, 0) / values.length;\n case 'max':\n return Math.max(...values);\n case 'min':\n return Math.min(...values);\n }\n}\n\nfunction resolveIdentifier(\n name: string,\n context: EvaluationContext,\n row: CalculationRow | undefined,\n): number | undefined {\n const normalized = normalizeName(name);\n\n if (row) {\n const rowValue = row.values.get(normalized);\n if (rowValue !== undefined) {\n return rowValue;\n }\n }\n\n return context.computed.get(normalized);\n}\n\nfunction buildCalculationRows(outputs: readonly IOutputStatement[]): CalculationRow[] {\n const rows: CalculationRow[] = [];\n\n for (const output of outputs) {\n const values = new Map<string, number>();\n const metrics = typeof output.getDisplayMetrics === 'function'\n ? output.getDisplayMetrics()\n : output.rawMetrics;\n\n for (const metric of metrics) {\n const candidates = extractNumericCandidates(output, metric);\n for (const candidate of candidates) {\n values.set(candidate.key, candidate.value);\n }\n }\n\n if (values.size > 0) {\n rows.push({ source: output, values });\n }\n }\n\n return rows;\n}\n\nfunction extractNumericCandidates(\n output: IOutputStatement,\n metric: { type: string; value?: unknown; key?: string; unit?: string },\n): NumericCandidate[] {\n const candidates: NumericCandidate[] = [];\n const type = normalizeName(metric.type);\n\n const numberValue = extractNumber(metric.value);\n if (numberValue !== undefined) {\n if (typeof metric.key === 'string' && metric.key.trim()) {\n candidates.push({ key: normalizeName(metric.key), value: numberValue });\n }\n\n switch (type) {\n case normalizeName(String(MetricType.Rep)):\n candidates.push({ key: 'rep', value: numberValue });\n candidates.push({ key: 'reps', value: numberValue });\n break;\n case normalizeName(String(MetricType.Resistance)):\n candidates.push({ key: 'weight', value: numberValue });\n candidates.push({ key: 'resistance', value: numberValue });\n candidates.push({ key: 'amount', value: numberValue });\n break;\n case normalizeName(String(MetricType.Distance)):\n candidates.push({ key: 'distance', value: numberValue });\n break;\n case normalizeName(String(MetricType.Intensity)):\n candidates.push({ key: 'intensity', value: numberValue });\n break;\n case normalizeName(String(MetricType.Load)):\n candidates.push({ key: 'load', value: numberValue });\n break;\n case normalizeName(String(MetricType.Volume)):\n candidates.push({ key: 'volume', value: numberValue });\n break;\n case normalizeName(String(MetricType.Work)):\n candidates.push({ key: 'work', value: numberValue });\n break;\n case normalizeName(String(MetricType.RIR)):\n candidates.push({ key: 'rir', value: numberValue });\n break;\n case normalizeName(String(MetricType.SessionRPE)):\n candidates.push({ key: 'rpe', value: numberValue });\n break;\n case normalizeName(String(MetricType.METScore)):\n candidates.push({ key: 'metscore', value: numberValue });\n break;\n case normalizeName(String(MetricType.TIS)):\n candidates.push({ key: 'tis', value: numberValue });\n break;\n case normalizeName(String(MetricType.Calculated)):\n candidates.push({ key: 'calculated', value: numberValue });\n break;\n }\n }\n\n const elapsedMetric = output.getMetric?.(MetricType.Elapsed);\n const elapsedMs = typeof elapsedMetric?.value === 'number' ? elapsedMetric.value : 0;\n const durationSeconds = elapsedMs / 1000;\n if (Number.isFinite(durationSeconds) && durationSeconds >= 0) {\n candidates.push({ key: 'duration', value: durationSeconds });\n candidates.push({ key: 'elapsed', value: durationSeconds });\n }\n\n return candidates;\n}\n\nfunction extractNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n\n if (value && typeof value === 'object' && 'amount' in value) {\n const amount = (value as { amount?: unknown }).amount;\n if (typeof amount === 'number' && Number.isFinite(amount)) {\n return amount;\n }\n }\n\n return undefined;\n}\n\nfunction tokenize(text: string): TokenStream {\n const tokens: Token[] = [];\n let index = 0;\n\n while (index < text.length) {\n const char = text[index];\n\n if (/\\s/.test(char)) {\n index++;\n continue;\n }\n\n const start = index;\n if (/[0-9.]/.test(char)) {\n let end = index + 1;\n while (end < text.length && /[0-9.]/.test(text[end])) {\n end++;\n }\n const value = text.slice(start, end);\n if (!/^\\d+(?:\\.\\d+)?$/.test(value) && !/^\\.\\d+$/.test(value)) {\n throw new Error(`Invalid number '${value}'`);\n }\n tokens.push({ kind: 'number', value, index: start });\n index = end;\n continue;\n }\n\n if (/[A-Za-z_]/.test(char)) {\n let end = index + 1;\n while (end < text.length && /[A-Za-z0-9_]/.test(text[end])) {\n end++;\n }\n tokens.push({ kind: 'identifier', value: text.slice(start, end), index: start });\n index = end;\n continue;\n }\n\n if ('+-*/^'.includes(char)) {\n tokens.push({ kind: 'operator', value: char, index: start });\n index++;\n continue;\n }\n\n if (char === '(' || char === ')') {\n tokens.push({ kind: 'paren', value: char, index: start });\n index++;\n continue;\n }\n\n if (char === ',') {\n tokens.push({ kind: 'comma', value: char, index: start });\n index++;\n continue;\n }\n\n throw new Error(`Unexpected token '${char}' at column ${start + 1}`);\n }\n\n tokens.push({ kind: 'eof', value: '', index: text.length });\n return { tokens, text, index: 0 };\n}\n\nfunction parseExpression(stream: TokenStream): ExpressionNode {\n return parseAddition(stream);\n}\n\nfunction parseAddition(stream: TokenStream): ExpressionNode {\n let node = parseMultiplication(stream);\n\n while (matchOperator(stream, '+', '-')) {\n const operator = consume(stream).value as '+' | '-';\n const right = parseMultiplication(stream);\n node = { kind: 'binary', operator, left: node, right };\n }\n\n return node;\n}\n\nfunction parseMultiplication(stream: TokenStream): ExpressionNode {\n let node = parsePower(stream);\n\n while (matchOperator(stream, '*', '/')) {\n const operator = consume(stream).value as '*' | '/';\n const right = parsePower(stream);\n node = { kind: 'binary', operator, left: node, right };\n }\n\n return node;\n}\n\nfunction parsePower(stream: TokenStream): ExpressionNode {\n const node = parseUnary(stream);\n\n if (matchOperator(stream, '^')) {\n const operator = consume(stream).value as '^';\n const right = parsePower(stream);\n return { kind: 'binary', operator, left: node, right };\n }\n\n return node;\n}\n\nfunction parseUnary(stream: TokenStream): ExpressionNode {\n if (matchOperator(stream, '+', '-')) {\n const operator = consume(stream).value as '+' | '-';\n return { kind: 'unary', operator, argument: parseUnary(stream) };\n }\n\n return parsePrimary(stream);\n}\n\nfunction parsePrimary(stream: TokenStream): ExpressionNode {\n const token = peek(stream);\n\n if (token.kind === 'number') {\n consume(stream);\n return { kind: 'number', value: Number(token.value) };\n }\n\n if (token.kind === 'identifier') {\n consume(stream);\n if (matchParen(stream, '(')) {\n consume(stream);\n const args: ExpressionNode[] = [];\n if (!matchParen(stream, ')')) {\n while (true) {\n args.push(parseExpression(stream));\n if (matchComma(stream)) {\n consume(stream);\n continue;\n }\n break;\n }\n }\n expectParen(stream, ')');\n return { kind: 'call', name: token.value, args };\n }\n\n return { kind: 'identifier', name: token.value };\n }\n\n if (matchParen(stream, '(')) {\n consume(stream);\n const node = parseExpression(stream);\n expectParen(stream, ')');\n return node;\n }\n\n throw new Error(`Unexpected token '${token.value || 'end of input'}' at column ${token.index + 1}`);\n}\n\nfunction expectEnd(stream: TokenStream): void {\n const token = peek(stream);\n if (token.kind !== 'eof') {\n throw new Error(`Unexpected token '${token.value}' at column ${token.index + 1}`);\n }\n}\n\nfunction peek(stream: TokenStream): Token {\n return stream.tokens[stream.index] ?? stream.tokens[stream.tokens.length - 1];\n}\n\nfunction consume(stream: TokenStream): Token {\n const token = peek(stream);\n stream.index += 1;\n return token;\n}\n\nfunction matchOperator(stream: TokenStream, ...operators: Array<'+' | '-' | '*' | '/' | '^'>): boolean {\n const token = peek(stream);\n return token.kind === 'operator' && operators.includes(token.value as any);\n}\n\nfunction matchParen(stream: TokenStream, value: '(' | ')'): boolean {\n const token = peek(stream);\n return token.kind === 'paren' && token.value === value;\n}\n\nfunction matchComma(stream: TokenStream): boolean {\n return peek(stream).kind === 'comma';\n}\n\nfunction expectParen(stream: TokenStream, value: '(' | ')'): void {\n const token = peek(stream);\n if (!matchParen(stream, value)) {\n throw new Error(`Expected '${value}' at column ${token.index + 1}`);\n }\n consume(stream);\n}\n\nfunction collectSources(node: ExpressionNode): string[] {\n const sources = new Map<string, string>();\n\n const visit = (current: ExpressionNode): void => {\n switch (current.kind) {\n case 'identifier':\n if (!AGGREGATE_FUNCTIONS.has(current.name.toLowerCase())) {\n sources.set(normalizeName(current.name), current.name);\n }\n return;\n case 'unary':\n visit(current.argument);\n return;\n case 'binary':\n visit(current.left);\n visit(current.right);\n return;\n case 'call':\n for (const arg of current.args) visit(arg);\n return;\n case 'number':\n return;\n }\n };\n\n visit(node);\n return Array.from(sources.values());\n}\n\nfunction normalizeName(value: string): string {\n return value.trim().toLowerCase();\n}\n","export * from './dimensions';\nexport * from './units';\nexport * from './values';\nexport * from './ast';\nexport * from './parser';\nexport * from './lineform';\nexport * from './evaluator';\nexport * from './check';\nexport * from './types';\nexport * from './lookup';\nexport * from './tables';\nexport * from './atoms';\nexport * from './registry';\nexport * from './engine';\nexport * from './seeds';\nexport * from './factory';\nexport * from './diagnostics';\n","/**\n * Lossless line-form compiler for the composed calculations layer (spec §2).\n *\n * Round-trips between the author-facing line syntax and canonical DAG\n * records (`CalculationDefinition`, spec §2.2). The line syntax is a superset\n * of `parseCalcLine`: it adds scope headers, `(library)` markers, `key`,\n * `grouped`, `label`, `emit`, `meta` output clauses, `|` variant sugar (with\n * optional `estimated` origin and per-variant `when`), and `where`\n * intermediate bindings.\n *\n * Guarantees (verified by tests):\n * - `compile(print(def))` deep-equals `def` for any def this module emits.\n * - Output defs register cleanly into `CalculationRegistry` (no\n * `CalcRegistrationError`), so diagnostics reuse registration-time\n * checking.\n *\n * Only the atom/expression grammar lives in `parser.ts`; line structure,\n * sections, variants, and output clauses live here.\n */\n\nimport { CalcParseError, parseExpression } from './parser';\nimport {\n CalculationDefinition,\n CalcNode,\n CalcScope,\n CalcVariant,\n} from './types';\n\nexport interface LineFormScope {\n scope: CalcScope;\n fences?: string[];\n}\n\nexport interface CompiledLineForm {\n defs: CalculationDefinition[];\n warnings: string[];\n}\n\nconst SCOPE_RE = /^(segment|workout|store)\\b/;\n\n/**\n * Compile calc-line source into DAG records.\n *\n * Two document styles are accepted:\n * - A scope header line per calc: `segment on [time, log] when P: name = …`\n * - A bare line: `name = …` (scope from `defaultScope`, default 'segment').\n *\n * One `CalculationDefinition` per line; `where` bindings fold into the line's\n * node graph.\n */\nexport function compileLineForm(src: string, defaultScope?: LineFormScope): CompiledLineForm {\n const defs: CalculationDefinition[] = [];\n const warnings: string[] = [];\n\n let scope: CalcScope | undefined = defaultScope?.scope;\n let fences: string[] | undefined = defaultScope?.fences;\n let defWhen: string | undefined;\n\n for (const raw of src.split(/\\r?\\n/)) {\n const line = raw.trim();\n if (!line || line.startsWith('#')) continue;\n\n const sc = SCOPE_RE.exec(line);\n if (sc && /^(on\\s|when\\s|:)/.test(line.slice(sc[0].length).trim())) {\n scope = sc[1] as CalcScope;\n fences = undefined;\n defWhen = undefined;\n const header = parseSectionHeader(line.slice(sc[0].length).trim());\n fences = header.fences;\n defWhen = header.when;\n continue;\n }\n\n defs.push(compileLine(line, scope ?? defaultScope?.scope ?? 'segment', fences, defWhen, warnings));\n }\n\n return { defs, warnings };\n}\n\nfunction parseSectionHeader(body: string): { fences?: string[]; when?: string } {\n let rest = body.replace(/^\\s*:/, '').trim();\n let fences: string[] | undefined;\n const onM = /^on\\s*\\[([^\\]]*)\\]/.exec(rest);\n if (onM) {\n fences = onM[1].split(',').map((s) => s.trim()).filter(Boolean);\n rest = rest.slice(onM[0].length).trim();\n }\n let when: string | undefined;\n const whenM = /^when\\s+([\\s\\S]+)$/.exec(rest);\n if (whenM) when = whenM[1].replace(/:\\s*$/, '').trim();\n return { fences, when };\n}\n\n// ── Tokenizing / splitting ─────────────────────────────────────────────────\n\ninterface Tok {\n pos: number;\n op?: string; // structural operator\n word?: string; // identifier / string literal text\n isStr?: boolean;\n}\n\n/** Structural lexer: tracks paren depth, parens/braces/brackets/commas, `->`, `|`, `=`. */\nfunction lex(src: string): Tok[] {\n const toks: Tok[] = [];\n let i = 0;\n while (i < src.length) {\n const c = src[i];\n if (c === ' ' || c === '\\t') { i++; continue; }\n if (c === '\"') {\n let j = i + 1;\n while (j < src.length && src[j] !== '\"') j++;\n toks.push({ pos: i, word: src.slice(i + 1, j), isStr: true });\n i = (j < src.length ? j + 1 : j);\n continue;\n }\n const two = src.slice(i, i + 2);\n if (two === '->' || two === '==' || two === '!=' || two === '<=' || two === '>=') {\n toks.push({ pos: i, op: two }); i += 2; continue;\n }\n if ('(),[]{}|=<:'.includes(c)) { toks.push({ pos: i, op: c }); i++; continue; }\n if (/[0-9A-Za-z_.]/.test(c)) {\n let j = i + 1;\n while (j < src.length && /[0-9A-Za-z_.]/.test(src[j])) j++;\n toks.push({ pos: i, word: src.slice(i, j) });\n i = j;\n continue;\n }\n i++;\n }\n return toks;\n}\n\n/** Top-level (depth-0) positions of a structural token. */\nfunction topLevelOf(src: string, op: string): number[] {\n const out: number[] = [];\n let depth = 0;\n let inStr = false;\n for (let i = 0; i < src.length; i++) {\n const c = src[i];\n if (c === '\"') { inStr = !inStr; continue; }\n if (inStr) continue;\n if (c === '(' || c === '[' || c === '{') depth++;\n else if (c === ')' || c === ']' || c === '}') depth--;\n else if (depth === 0 && src.startsWith(op, i)) {\n out.push(i);\n i += op.length - 1;\n }\n }\n return out;\n}\n\n/** Top-level positions of the given keywords (identifier tokens at depth 0). */\nfunction keywordOf(src: string, keywords: string[]): number[] {\n const toks = lex(src);\n const out: number[] = [];\n let depth = 0;\n for (const t of toks) {\n if (t.op === '(') depth++;\n else if (t.op === ')') depth--;\n else if (depth === 0 && t.word && keywords.includes(t.word)) out.push(t.pos);\n }\n return out;\n}\n\n// ── Calc line parsing ──────────────────────────────────────────────────────\n\n\n\n/** Break a line body into variants at top-level `|`, and bindings at `where`. */\nfunction splitVariantsAndWhere(body: string): { primary: string; variants: string[]; where?: string } {\n const pipes = topLevelOf(body, '|');\n const wherePos = keywordOf(body, ['where']).find((p) => (pipes.length ? p > pipes[pipes.length - 1] : true));\n const end = wherePos ?? body.length;\n const primary = body.slice(0, pipes.length ? pipes[0] : end).trim();\n const variants: string[] = [];\n for (let i = 0; i < pipes.length; i++) {\n const start = pipes[i] + 1;\n const stop = i + 1 < pipes.length ? pipes[i + 1] : end;\n variants.push(body.slice(start, stop).trim());\n }\n const where = wherePos !== undefined ? body.slice(wherePos + 'where'.length).trim() : undefined;\n return { primary, variants, where };\n}\n\nconst CLAUSE_KEYS = ['when', 'key', 'label', 'emit', 'meta', 'estimated'];\n\n/** Split the primary segment into expr/unit and keyword clauses. */\nfunction splitPrimary(segment: string): { expr: string; unit?: string; clauses: Record<string, string> } {\n // Cut the expression at the earliest top-level `->` or clause keyword.\n const arrows = topLevelOf(segment, '->');\n const kwPos = keywordOf(segment, CLAUSE_KEYS);\n let cut = segment.length;\n if (arrows.length && arrows[0] < cut) cut = arrows[0];\n for (const p of kwPos) if (p < cut) cut = p;\n const expr = segment.slice(0, cut).trim();\n\n let tail = segment.slice(cut).trim();\n let unit: string | undefined;\n const clauses: Record<string, string> = {};\n if (tail.startsWith('->')) {\n const after = tail.slice(2).trim();\n // First clause keyword anywhere after the unit.\n const next = /(?:^|\\s)(when|key|label|emit|meta|estimated)\\b/.exec(after);\n const end = next ? next.index + (next[0][0] === ' ' ? 1 : 0) : after.length;\n unit = after.slice(0, end).trim() || undefined;\n tail = after.slice(end).trim();\n }\n // Iteratively consume each clause keyword's value.\n for (;;) {\n tail = tail.trim();\n if (!tail) break;\n const m = /^(when|key|label|emit|meta|estimated)\\b([\\s\\S]*)$/.exec(tail);\n if (!m) break;\n const kw = m[1];\n const afterKw = m[2].trim();\n const next = /^(when|key|label|emit|meta|estimated)\\b/.exec(afterKw);\n const val = next ? afterKw.slice(0, next.index) : afterKw;\n clauses[kw] = val.trim();\n tail = afterKw.slice(next ? next.index : afterKw.length);\n }\n return { expr, unit, clauses };\n}\n\n/** Split the where tail into bindings at top-level commas or `where` keywords. */\nfunction splitWhereBindings(src: string): string[] {\n const out: string[] = [];\n let start = 0;\n let depth = 0;\n let inStr = false;\n for (let i = 0; i < src.length; i++) {\n const c = src[i];\n if (c === '\"') { inStr = !inStr; continue; }\n if (inStr) continue;\n if (c === '(' || c === '[' || c === '{') depth++;\n else if (c === ')' || c === ']' || c === '}') depth--;\n else if (depth === 0 && c === ',') { out.push(src.slice(start, i)); start = i + 1; continue; }\n if (depth === 0 && src.startsWith('where', i) && !/[A-Za-z0-9_.]/.test(src[i - 1] ?? '') && !/[A-Za-z0-9_.]/.test(src[i + 5] ?? '')) {\n out.push(src.slice(start, i));\n start = i + 'where'.length;\n i += 'where'.length - 1;\n }\n }\n out.push(src.slice(start));\n return out.map((s) => s.trim()).filter(Boolean);\n}\n\nfunction parseWhere(whereSrc: string): { name: string; expr: string; unit?: string }[] {\n const out: { name: string; expr: string; unit?: string }[] = [];\n for (const p of splitWhereBindings(whereSrc)) {\n const arrow = topLevelOf(p, '->');\n let body = p;\n let unit: string | undefined;\n if (arrow.length) {\n body = p.slice(0, arrow[0]).trim();\n unit = p.slice(arrow[0] + 2).trim() || undefined;\n }\n const eq = lex(body).find((t) => t.op === '=');\n if (!eq) throw new CalcParseError(`Invalid where binding: ${p}`, 0);\n out.push({ name: body.slice(0, eq.pos).trim(), expr: body.slice(eq.pos + 1).trim(), unit });\n }\n return out;\n}\n\nfunction parseVariant(alt: string, primaryExpr: string): { expr?: string; unit?: string; when?: string; estimated: boolean } {\n const whenPos = keywordOf(alt, ['when'])[0];\n let rest = alt;\n let when: string | undefined;\n if (whenPos !== undefined) {\n when = alt.slice(whenPos + 'when'.length).trim();\n rest = alt.slice(0, whenPos).trim();\n }\n const estimated = /\\bestimated\\b/.test(rest);\n const exprPart = rest.replace(/\\bestimated\\b/g, '').trim();\n if (!exprPart) return { when, estimated, expr: primaryExpr };\n const { expr, unit } = splitPrimary(exprPart);\n return { expr, unit, when, estimated };\n}\n\nfunction buildVariant(\n variantId: string,\n priority: number,\n origin: 'analyzed' | 'analyzed-estimated',\n exprSrc: string,\n unit: string | undefined,\n bindings: { name: string; expr: string; unit?: string }[],\n when: string | undefined,\n): CalcVariant {\n const nodes: Record<string, CalcNode> = {};\n nodes['value'] = { id: 'value', kind: 'expr', expression: exprSrc, ...(unit ? { unit } : {}) };\n for (const b of bindings) {\n nodes[b.name] = { id: b.name, kind: 'expr', expression: b.expr, ...(b.unit ? { unit: b.unit } : {}) };\n }\n const v: CalcVariant = { id: variantId, priority, origin, nodes };\n if (when) v.when = when;\n return v;\n}\n\nfunction compileLine(\n line: string,\n scope: CalcScope,\n fences: string[] | undefined,\n headerWhen: string | undefined,\n _warnings: string[],\n): CalculationDefinition {\n const marker = /\\(library\\)/.exec(line);\n const library = !!marker;\n const live = library ? line.slice(0, marker!.index) + ' ' + line.slice(marker!.index + marker![0].length) : line;\n const eq = lex(live).find((t) => t.op === '=');\n if (!eq) throw new CalcParseError(`Missing '=' in calc line: ${line}`, 0);\n const name = live.slice(0, eq.pos).trim();\n if (!name) throw new CalcParseError('Missing calc name', 0);\n const body = live.slice(eq.pos + 1).trim();\n\n const { primary, variants: variantSrcs, where } = splitVariantsAndWhere(body);\n const { expr, unit, clauses } = splitPrimary(primary);\n const bindings = where ? parseWhere(where) : [];\n\n // Expression validation happens at registration; but cheap-parse now for\n // early structural feedback and to fail malformed input at compile time.\n parseExpression(expr);\n for (const b of bindings) parseExpression(b.expr);\n if (clauses.when) parseExpression(clauses.when);\n\n const lineWhen = clauses.when;\n const multi = variantSrcs.length > 0;\n\n const variants: CalcVariant[] = [];\n // Primary variant (may itself be `estimated`).\n const primaryOrigin: 'analyzed' | 'analyzed-estimated' =\n clauses.estimated !== undefined ? 'analyzed-estimated' : 'analyzed';\n const primaryPriority = primaryOrigin === 'analyzed-estimated' ? 10 : 100;\n const primaryWhen = multi ? lineWhen : undefined;\n variants.push(buildVariant('default', primaryPriority, primaryOrigin, expr, unit, bindings, primaryWhen ?? undefined));\n\n // Alternates.\n variantSrcs.forEach((altSrc, i) => {\n const alt = parseVariant(altSrc, expr);\n const vId = alt.estimated ? `est-${i + 1}` : `alt-${i + 1}`;\n const priority = i === 0 ? 50 : 10;\n variants.push(buildVariant(\n vId, priority,\n alt.estimated ? 'analyzed-estimated' : 'analyzed',\n alt.expr ?? expr, alt.unit ?? (i === 0 ? unit : undefined),\n bindings, alt.when,\n ));\n });\n\n let output: CalculationDefinition['output'];\n if (!library) {\n output = { nodeId: 'value', ...(unit ? { unit } : {}) };\n if (clauses.key) {\n const k = splitKeyClause(clauses.key);\n output.key = k.key;\n if (k.grouped) {\n output.isGrouped = true;\n output.groupBy = k.groupBy;\n }\n }\n if (clauses.label) output.label = clauses.label.replace(/^\"|\"$/g, '');\n if (clauses.emit) output.emitType = clauses.emit;\n if (clauses.meta) output.publishMetadataNodes = clauses.meta.split(',').map((s) => s.trim()).filter(Boolean);\n }\n\n const when = multi ? headerWhen : (lineWhen ?? headerWhen);\n const def: CalculationDefinition = {\n id: name,\n kind: library ? 'library' : 'output',\n scope,\n variants,\n ...(fences && fences.length ? { fences } : {}),\n ...(when ? { when } : {}),\n };\n if (output) def.output = output;\n return def;\n}\n\nfunction splitKeyClause(keyClause: string): { key: string; grouped: boolean; groupBy?: string[] } {\n const byM = /by\\s*\\{([^}]*)\\}/.exec(keyClause);\n const grouped = keyClause.includes('grouped') || !!byM;\n const groupBy = byM ? byM[1].split(',').map((s) => s.trim()).filter(Boolean) : undefined;\n const key = keyClause.split(/\\s+/).find((w) => w !== 'grouped' && !/^by$/.test(w) && !w.startsWith('{') && !w.startsWith('by')) ?? keyClause;\n return { key, grouped, groupBy };\n}\n\n// ── Printer ────────────────────────────────────────────────────────────────\n\n/**\n * Render one `CalculationDefinition` back to canonical line form, losslessly\n * preserving everything the parser reads (scope, fences, when, variants,\n * origins, units, output clauses, intermediate nodes).\n */\n/** First output node id (output.nodeId may be a single id or an array). */\nexport function outputNodeId(def: CalculationDefinition): string | undefined {\n const nid = def.output?.nodeId;\n if (Array.isArray(nid)) return nid[0];\n return nid;\n}\n\nexport function printCalculation(def: CalculationDefinition): string {\n const lines: string[] = [];\n const header = `${def.scope}${def.fences?.length ? ` on [${def.fences.join(', ')}]` : ''}${def.when ? ` when ${def.when}` : ''}:`;\n lines.push(header);\n\n const sorted = [...def.variants].sort((a, b) => b.priority - a.priority);\n const primary = sorted[0];\n const outId = outputNodeId(def);\n const outNode = primary && outId && primary.nodes[outId]\n ? primary.nodes[outId]\n : undefined;\n const expr = outNode?.expression ?? (primary ? Object.values(primary.nodes)[0]?.expression : '') ?? '';\n\n let line = ` ${def.id}${def.kind === 'library' ? ' (library)' : ''} = ${expr}`;\n const nodeUnit = outNode?.unit;\n if (nodeUnit) line += ` -> ${nodeUnit}`;\n if (def.output) {\n if (def.output.unit && !nodeUnit) line += ` -> ${def.output.unit}`;\n if (def.output.key) {\n line += ` key ${def.output.key}`;\n if (def.output.isGrouped) {\n line += ` grouped${def.output.groupBy?.length ? ` by {${def.output.groupBy.join(', ')}}` : ''}`;\n }\n }\n if (def.output.label) line += ` label \"${def.output.label}\"`;\n if (def.output.emitType) line += ` emit ${def.output.emitType}`;\n if (def.output.publishMetadataNodes?.length) line += ` meta ${def.output.publishMetadataNodes.join(', ')}`;\n }\n if (primary?.origin === 'analyzed-estimated') line += ' estimated';\n if (primary?.when) line += ` when ${primary.when}`;\n\n // Follower variants (strip the priority-leading primary) as `|` alternates.\n for (let i = 1; i < sorted.length; i++) {\n const v = sorted[i];\n const vOut = outId ? v.nodes[outId] : undefined;\n let alt = ` | ${vOut ? vOut.expression : ''}`;\n if (vOut?.unit) alt += ` -> ${vOut.unit}`;\n if (v.origin === 'analyzed-estimated') alt += ' estimated';\n if (v.when) alt += ` when ${v.when}`;\n line += alt;\n }\n\n // Intermediate nodes (non-output) as `where` bindings — shared across variants.\n const seen = new Set<string>();\n for (const v of sorted) {\n for (const [id, n] of Object.entries(v.nodes)) {\n if (outId && id === outId) continue;\n if (seen.has(id)) continue;\n seen.add(id);\n line += ` where ${id} = ${n.expression}`;\n if (n.unit) line += ` -> ${n.unit}`;\n }\n }\n\n lines.push(line);\n return lines.join('\\n');\n}\n","import { DimVector, DIM_ZERO } from './dimensions';\nimport { LookupRegistry, ILookupTable } from './lookup';\nimport { CalculationDefinition } from './types';\n\nexport interface CalcDiagnostic {\n severity: 'error' | 'warning';\n message: string;\n}\n\nexport interface CalcAnalysis {\n defs: CalculationDefinition[];\n diagnostics: CalcDiagnostic[];\n dim: DimVector | undefined;\n compound: string | undefined;\n}\n\nfunction silentTable(\n id: string,\n fields: ILookupTable['fields'],\n missPolicy: 'absent' | 'default-row' = 'absent',\n): ILookupTable {\n return { id, fields, missPolicy, get: () => undefined };\n}\n\nexport function buildStaticLookups(): LookupRegistry {\n const reg = new LookupRegistry();\n reg.register(silentTable('effort', {\n met: { dimension: DIM_ZERO, type: 'number' },\n disciplineFactor: { dimension: DIM_ZERO, type: 'number' },\n discipline: { dimension: DIM_ZERO, type: 'string' },\n intensityTier: { dimension: DIM_ZERO, type: 'string' },\n resolvedFrom: { dimension: DIM_ZERO, type: 'string' },\n }, 'default-row'));\n reg.register(silentTable('rpe-labels', { rpe: { dimension: DIM_ZERO, type: 'number' } }));\n reg.register(silentTable('profile', { vo2max: { dimension: DIM_ZERO, type: 'number' } }));\n reg.register(silentTable('disciplines', { disciplineFactor: { dimension: DIM_ZERO, type: 'number' } }, 'default-row'));\n return reg;\n}\n","/**\n * workloadRollup — pure workload-window math behind Rollup Facts\n * (CONTEXT.md §Analytics). Foster sRPE periodization over daily SessionLoad:\n *\n * dailyLoad[d] = Σ sessionLoad fact values in UTC day d\n * acute = mean daily load over the trailing 7 days (D-6 … D)\n * chronic = mean daily load over the trailing 28 days (D-27 … D)\n * ACWR = acute / chronic — emitted when chronic > 0\n * monotony = mean7 / sd7 — population SD (÷7) over the 7\n * daily values; emitted when sd7 > 0 (a flat week has no\n * meaningful monotony)\n * strain = monotony × (Σ of the 7 daily loads) — emitted with monotony\n *\n * Day buckets are UTC (`Math.floor(ts / DAY)`) — the same bucketing the\n * Query Service uses for the `day` dimension, so rollup rows land in the\n * buckets widgets already group by.\n */\n\nexport const DAY = 86_400_000;\n\n/** Local day bucket for a canonical timestamp. */\nexport function dayBucket(ts: number): number {\n return Math.floor(ts / DAY);\n}\n\n/** One UTC day's computed windows; absent fields were suppressed (see header). */\nexport interface DayRollup {\n day: number;\n acwr?: number;\n monotony?: number;\n strain?: number;\n}\n\n/** Sum fact values into UTC day buckets. */\nexport function dailySessionLoads(\n facts: readonly { timestamp: number; value: number }[],\n): Map<number, number> {\n const loads = new Map<number, number>();\n for (const fact of facts) {\n const day = dayBucket(fact.timestamp);\n loads.set(day, (loads.get(day) ?? 0) + fact.value);\n }\n return loads;\n}\n\n/**\n * Compute the Foster windows for every day that can produce a value: from\n * the first day with load through `throughDay` (inclusive, UTC day bucket).\n * Earlier days have empty chronic windows and zero-variance acute windows,\n * so every value would be suppressed anyway.\n */\nexport function computeWorkloadRollups(\n loads: ReadonlyMap<number, number>,\n throughDay: number,\n): DayRollup[] {\n const loadDays = [...loads.keys()].filter((d) => d <= throughDay);\n if (loadDays.length === 0) return [];\n const firstDay = Math.min(...loadDays);\n const loadAt = (d: number) => loads.get(d) ?? 0;\n\n const rollups: DayRollup[] = [];\n for (let day = firstDay; day <= throughDay; day++) {\n let sum7 = 0;\n let sum28 = 0;\n for (let k = 0; k < 28; k++) {\n const load = loadAt(day - k);\n sum28 += load;\n if (k < 7) sum7 += load;\n }\n const acute = sum7 / 7;\n const chronic = sum28 / 28;\n\n let variance = 0;\n for (let k = 0; k < 7; k++) {\n const diff = loadAt(day - k) - acute;\n variance += diff * diff;\n }\n const sd7 = Math.sqrt(variance / 7);\n\n const rollup: DayRollup = { day };\n if (chronic > 0) rollup.acwr = acute / chronic;\n if (sd7 > 0) {\n rollup.monotony = acute / sd7;\n rollup.strain = rollup.monotony * sum7;\n }\n if (rollup.acwr !== undefined || rollup.monotony !== undefined) {\n rollups.push(rollup);\n }\n }\n return rollups;\n}\n","import {\n OutputStatement,\n MetricContainer,\n type IOutputStatement,\n type StoredOutputStatement,\n type IMetric,\n} from '@bitcobblers/wod-wiki-core';\nimport { getHints } from '../metrics/hints';\n\n/**\n * Convert a live IOutputStatement into a StoredOutputStatement.\n *\n * Normalises non-serialisable types (`Set` → `string[]`, `MetricContainer` → `IMetric[]`)\n * so the result survives a JSON / IndexedDB round-trip without data loss.\n */\nexport function toStoredOutputStatement(output: IOutputStatement | OutputStatement): StoredOutputStatement {\n const metrics: IMetric[] = output.metrics instanceof MetricContainer\n ? output.metrics.toArray()\n : Array.isArray(output.metrics)\n ? (output.metrics as IMetric[])\n : (output.metrics as any)?.toArray\n ? (output.metrics as any).toArray()\n : [];\n\n const hints = getHints(output);\n\n return {\n id: output.id,\n line: (output as any).line ?? (output as any).statement?.line,\n text: (output as any).text ?? (output as any).statement?.text,\n dialect: (output as any).dialect ?? (output as any).statement?.dialect,\n outputType: output.outputType,\n timeSpan: output.timeSpan ? { started: output.timeSpan.started, ended: output.timeSpan.ended } : undefined,\n metrics,\n hints: hints.length > 0 ? hints : undefined,\n sourceBlockKey: output.sourceBlockKey,\n stackLevel: output.stackLevel,\n parent: output.parent,\n sourceStatementId: output.sourceStatementId,\n completionReason: output.completionReason,\n };\n}\n"]}