@things-factory/headless-twin 10.0.8 → 10.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/engine/attention-digest.d.ts +52 -0
- package/dist-server/engine/attention-digest.js +76 -0
- package/dist-server/engine/attention-digest.js.map +1 -0
- package/dist-server/engine/canonical-ingest.d.ts +2 -2
- package/dist-server/engine/canonical-ingest.js +24 -2
- package/dist-server/engine/canonical-ingest.js.map +1 -1
- package/dist-server/engine/command-routing.d.ts +33 -0
- package/dist-server/engine/command-routing.js +53 -0
- package/dist-server/engine/command-routing.js.map +1 -0
- package/dist-server/engine/energy-topology.d.ts +86 -0
- package/dist-server/engine/energy-topology.js +144 -0
- package/dist-server/engine/energy-topology.js.map +1 -0
- package/dist-server/engine/index.d.ts +11 -0
- package/dist-server/engine/index.js +17 -0
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/kpi-baseline.d.ts +78 -0
- package/dist-server/engine/kpi-baseline.js +123 -0
- package/dist-server/engine/kpi-baseline.js.map +1 -0
- package/dist-server/engine/kpi-fold.d.ts +137 -1
- package/dist-server/engine/kpi-fold.js +225 -0
- package/dist-server/engine/kpi-fold.js.map +1 -1
- package/dist-server/engine/kpi-query.d.ts +32 -1
- package/dist-server/engine/kpi-query.js +262 -20
- package/dist-server/engine/kpi-query.js.map +1 -1
- package/dist-server/engine/kpi-target.d.ts +17 -0
- package/dist-server/engine/kpi-target.js +24 -2
- package/dist-server/engine/kpi-target.js.map +1 -1
- package/dist-server/engine/live-attentions.d.ts +1 -0
- package/dist-server/engine/live-attentions.js +7 -1
- package/dist-server/engine/live-attentions.js.map +1 -1
- package/dist-server/engine/live-feed-registry.d.ts +25 -0
- package/dist-server/engine/live-feed-registry.js +51 -0
- package/dist-server/engine/live-feed-registry.js.map +1 -0
- package/dist-server/engine/load-meter.d.ts +181 -0
- package/dist-server/engine/load-meter.js +267 -0
- package/dist-server/engine/load-meter.js.map +1 -0
- package/dist-server/engine/local-declarations.d.ts +262 -0
- package/dist-server/engine/local-declarations.js +528 -0
- package/dist-server/engine/local-declarations.js.map +1 -0
- package/dist-server/engine/model-basis.d.ts +39 -6
- package/dist-server/engine/model-basis.js +69 -9
- package/dist-server/engine/model-basis.js.map +1 -1
- package/dist-server/engine/model-vocabulary.d.ts +17 -0
- package/dist-server/engine/model-vocabulary.js +81 -0
- package/dist-server/engine/model-vocabulary.js.map +1 -0
- package/dist-server/engine/oee-accumulator.d.ts +28 -0
- package/dist-server/engine/oee-accumulator.js +26 -1
- package/dist-server/engine/oee-accumulator.js.map +1 -1
- package/dist-server/engine/operation-basis.d.ts +32 -0
- package/dist-server/engine/operation-basis.js +87 -0
- package/dist-server/engine/operation-basis.js.map +1 -0
- package/dist-server/engine/property-effects.d.ts +30 -0
- package/dist-server/engine/property-effects.js +192 -0
- package/dist-server/engine/property-effects.js.map +1 -0
- package/dist-server/engine/runtime-key.d.ts +15 -0
- package/dist-server/engine/runtime-key.js +64 -0
- package/dist-server/engine/runtime-key.js.map +1 -0
- package/dist-server/engine/spec-coverage.js +3 -3
- package/dist-server/engine/spec-coverage.js.map +1 -1
- package/dist-server/engine/state-axes.d.ts +21 -0
- package/dist-server/engine/state-axes.js +59 -0
- package/dist-server/engine/state-axes.js.map +1 -0
- package/dist-server/engine/structure-diff.js +1 -1
- package/dist-server/engine/structure-diff.js.map +1 -1
- package/dist-server/engine/travel-estimator.d.ts +9 -2
- package/dist-server/engine/travel-estimator.js +11 -6
- package/dist-server/engine/travel-estimator.js.map +1 -1
- package/dist-server/engine/twin-engine.d.ts +418 -57
- package/dist-server/engine/twin-engine.js +1599 -306
- package/dist-server/engine/twin-engine.js.map +1 -1
- package/dist-server/engine/warm-start.d.ts +93 -13
- package/dist-server/engine/warm-start.js +114 -14
- package/dist-server/engine/warm-start.js.map +1 -1
- package/dist-server/index.d.ts +1 -0
- package/dist-server/index.js +17 -11
- package/dist-server/index.js.map +1 -1
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.d.ts +5 -0
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js +48 -0
- package/dist-server/migrations/1786000000000-RenameTwinInstanceBoardToModel.js.map +1 -0
- package/dist-server/migrations/index.d.ts +2 -0
- package/dist-server/migrations/index.js +10 -0
- package/dist-server/migrations/index.js.map +1 -0
- package/dist-server/service/index.d.ts +3 -2
- package/dist-server/service/index.js +25 -17
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/reference/discovery-result.d.ts +34 -0
- package/dist-server/service/reference/discovery-result.js +84 -0
- package/dist-server/service/reference/discovery-result.js.map +1 -0
- package/dist-server/service/reference/ingest-space.d.ts +53 -0
- package/dist-server/service/reference/ingest-space.js +79 -0
- package/dist-server/service/reference/ingest-space.js.map +1 -0
- package/dist-server/service/reference/knob-defaults.d.ts +20 -0
- package/dist-server/service/reference/knob-defaults.js +59 -0
- package/dist-server/service/reference/knob-defaults.js.map +1 -0
- package/dist-server/service/reference/reference-live.d.ts +23 -0
- package/dist-server/service/reference/reference-live.js +123 -6
- package/dist-server/service/reference/reference-live.js.map +1 -1
- package/dist-server/service/reference/reference-master.d.ts +227 -11
- package/dist-server/service/reference/reference-master.js +206 -25
- package/dist-server/service/reference/reference-master.js.map +1 -1
- package/dist-server/service/reference/reference-resolver.d.ts +33 -3
- package/dist-server/service/reference/reference-resolver.js +290 -23
- package/dist-server/service/reference/reference-resolver.js.map +1 -1
- package/dist-server/service/reference/template-registry.d.ts +19 -3
- package/dist-server/service/reference/template-registry.js.map +1 -1
- package/dist-server/service/twin-attention/twin-attention-query.d.ts +8 -1
- package/dist-server/service/twin-attention/twin-attention-query.js +39 -8
- package/dist-server/service/twin-attention/twin-attention-query.js.map +1 -1
- package/dist-server/service/twin-audit/command-audit.d.ts +37 -0
- package/dist-server/service/twin-audit/command-audit.js +53 -0
- package/dist-server/service/twin-audit/command-audit.js.map +1 -0
- package/dist-server/service/twin-audit/index.d.ts +4 -0
- package/dist-server/service/twin-audit/index.js +8 -0
- package/dist-server/service/twin-audit/index.js.map +1 -0
- package/dist-server/service/twin-audit/twin-audit-event.d.ts +24 -0
- package/dist-server/service/twin-audit/twin-audit-event.js +125 -0
- package/dist-server/service/twin-audit/twin-audit-event.js.map +1 -0
- package/dist-server/service/twin-audit/twin-audit-query.d.ts +4 -0
- package/dist-server/service/twin-audit/twin-audit-query.js +76 -0
- package/dist-server/service/twin-audit/twin-audit-query.js.map +1 -0
- package/dist-server/service/twin-control/twin-control-mutation.d.ts +2 -0
- package/dist-server/service/twin-control/twin-control-mutation.js +50 -11
- package/dist-server/service/twin-control/twin-control-mutation.js.map +1 -1
- package/dist-server/service/twin-event/twin-event-keys.d.ts +1 -1
- package/dist-server/service/twin-event/twin-event-keys.js +1 -1
- package/dist-server/service/twin-event/twin-event-keys.js.map +1 -1
- package/dist-server/service/twin-event/twin-event.d.ts +14 -5
- package/dist-server/service/twin-event/twin-event.js +46 -14
- package/dist-server/service/twin-event/twin-event.js.map +1 -1
- package/dist-server/service/twin-forecast/forecast-metrics.d.ts +13 -0
- package/dist-server/service/twin-forecast/forecast-metrics.js +57 -0
- package/dist-server/service/twin-forecast/forecast-metrics.js.map +1 -0
- package/dist-server/service/twin-forecast/forecast-tuning.d.ts +12 -0
- package/dist-server/service/twin-forecast/forecast-tuning.js +44 -0
- package/dist-server/service/twin-forecast/forecast-tuning.js.map +1 -0
- package/dist-server/service/twin-forecast/gap-analytics.d.ts +28 -2
- package/dist-server/service/twin-forecast/gap-analytics.js +43 -17
- package/dist-server/service/twin-forecast/gap-analytics.js.map +1 -1
- package/dist-server/service/twin-forecast/twin-forecast-query.js +219 -39
- package/dist-server/service/twin-forecast/twin-forecast-query.js.map +1 -1
- package/dist-server/service/twin-instance/twin-instance.d.ts +38 -5
- package/dist-server/service/twin-instance/twin-instance.js +66 -18
- package/dist-server/service/twin-instance/twin-instance.js.map +1 -1
- package/dist-server/service/twin-journal/twin-journal-query.d.ts +11 -4
- package/dist-server/service/twin-journal/twin-journal-query.js +95 -15
- package/dist-server/service/twin-journal/twin-journal-query.js.map +1 -1
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.d.ts +11 -5
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js +46 -27
- package/dist-server/service/twin-lifecycle/twin-lifecycle-mutation.js.map +1 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.d.ts +1 -0
- package/dist-server/service/twin-metrics/twin-metrics-query.js +63 -1
- package/dist-server/service/twin-metrics/twin-metrics-query.js.map +1 -1
- package/dist-server/service/twin-model/epcis-coverage.d.ts +14 -0
- package/dist-server/service/twin-model/epcis-coverage.js +174 -0
- package/dist-server/service/twin-model/epcis-coverage.js.map +1 -0
- package/dist-server/service/twin-model/iec61850-coverage.d.ts +14 -0
- package/dist-server/service/twin-model/iec61850-coverage.js +98 -0
- package/dist-server/service/twin-model/iec61850-coverage.js.map +1 -0
- package/dist-server/service/twin-model/index.d.ts +13 -0
- package/dist-server/service/twin-model/index.js +29 -0
- package/dist-server/service/twin-model/index.js.map +1 -0
- package/dist-server/service/twin-model/isa95-coverage.d.ts +48 -0
- package/dist-server/service/twin-model/isa95-coverage.js +155 -0
- package/dist-server/service/twin-model/isa95-coverage.js.map +1 -0
- package/dist-server/service/twin-model/project-structure.d.ts +16 -0
- package/dist-server/service/twin-model/project-structure.js +173 -0
- package/dist-server/service/twin-model/project-structure.js.map +1 -0
- package/dist-server/service/twin-model/standard-coverage.d.ts +9 -0
- package/dist-server/service/twin-model/standard-coverage.js +37 -0
- package/dist-server/service/twin-model/standard-coverage.js.map +1 -0
- package/dist-server/service/twin-model/twin-equipment.d.ts +64 -0
- package/dist-server/service/twin-model/twin-equipment.js +134 -0
- package/dist-server/service/twin-model/twin-equipment.js.map +1 -0
- package/dist-server/service/twin-model/twin-lineage-query.d.ts +3 -0
- package/dist-server/service/twin-model/twin-lineage-query.js +206 -0
- package/dist-server/service/twin-model/twin-lineage-query.js.map +1 -0
- package/dist-server/service/twin-model/twin-location.d.ts +58 -0
- package/dist-server/service/twin-model/twin-location.js +130 -0
- package/dist-server/service/twin-model/twin-location.js.map +1 -0
- package/dist-server/service/twin-model/twin-model-item-query.d.ts +141 -0
- package/dist-server/service/twin-model/twin-model-item-query.js +852 -0
- package/dist-server/service/twin-model/twin-model-item-query.js.map +1 -0
- package/dist-server/service/twin-model/twin-model-mutation.d.ts +57 -0
- package/dist-server/service/twin-model/twin-model-mutation.js +490 -0
- package/dist-server/service/twin-model/twin-model-mutation.js.map +1 -0
- package/dist-server/service/twin-model/twin-model-query.d.ts +43 -0
- package/dist-server/service/twin-model/twin-model-query.js +551 -0
- package/dist-server/service/twin-model/twin-model-query.js.map +1 -0
- package/dist-server/service/twin-model/twin-model-tree-query.d.ts +3 -0
- package/dist-server/service/twin-model/twin-model-tree-query.js +158 -0
- package/dist-server/service/twin-model/twin-model-tree-query.js.map +1 -0
- package/dist-server/service/twin-model/twin-operation.d.ts +61 -0
- package/dist-server/service/twin-model/twin-operation.js +137 -0
- package/dist-server/service/twin-model/twin-operation.js.map +1 -0
- package/dist-server/service/twin-space/move-space.d.ts +65 -0
- package/dist-server/service/twin-space/move-space.js +166 -0
- package/dist-server/service/twin-space/move-space.js.map +1 -0
- package/dist-server/service/twin-space/space-integrity.d.ts +97 -0
- package/dist-server/service/twin-space/space-integrity.js +182 -0
- package/dist-server/service/twin-space/space-integrity.js.map +1 -0
- package/dist-server/service/twin-space/twin-space-area.js +4 -4
- package/dist-server/service/twin-space/twin-space-area.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-representation.js +6 -6
- package/dist-server/service/twin-space/twin-space-representation.js.map +1 -1
- package/dist-server/service/twin-space/twin-space-resolver.d.ts +63 -1
- package/dist-server/service/twin-space/twin-space-resolver.js +365 -18
- package/dist-server/service/twin-space/twin-space-resolver.js.map +1 -1
- package/dist-server/service/twin-space/twin-space.d.ts +17 -1
- package/dist-server/service/twin-space/twin-space.js +15 -5
- package/dist-server/service/twin-space/twin-space.js.map +1 -1
- package/dist-server/service/twin-state/twin-state-subscription.js +1 -1
- package/dist-server/service/twin-state/twin-state-subscription.js.map +1 -1
- package/dist-server/service/twin-structure/twin-structure.d.ts +1 -1
- package/dist-server/service/twin-structure/twin-structure.js +8 -7
- package/dist-server/service/twin-structure/twin-structure.js.map +1 -1
- package/dist-server/service/twin-target/twin-target-resolver.js +21 -4
- package/dist-server/service/twin-target/twin-target-resolver.js.map +1 -1
- package/dist-shared/axis-read.d.ts +12 -0
- package/dist-shared/axis-read.js +32 -0
- package/dist-shared/axis-read.js.map +1 -0
- package/dist-shared/entity-delta.d.ts +29 -0
- package/dist-shared/entity-delta.js +287 -0
- package/dist-shared/entity-delta.js.map +1 -0
- package/dist-shared/kpi-broadcast.d.ts +4 -0
- package/dist-shared/kpi-broadcast.js +16 -0
- package/dist-shared/kpi-broadcast.js.map +1 -0
- package/dist-shared/twin-level.d.ts +23 -0
- package/dist-shared/twin-level.js +52 -0
- package/dist-shared/twin-level.js.map +1 -0
- package/package.json +14 -12
- package/server/engine/attention-digest.ts +102 -0
- package/server/engine/canonical-ingest.ts +36 -4
- package/server/engine/command-routing.ts +67 -0
- package/server/engine/energy-topology.ts +189 -0
- package/server/engine/index.ts +17 -0
- package/server/engine/kpi-baseline.ts +202 -0
- package/server/engine/kpi-fold.ts +389 -1
- package/server/engine/kpi-query.ts +295 -22
- package/server/engine/kpi-target.ts +24 -2
- package/server/engine/live-attentions.ts +7 -2
- package/server/engine/live-feed-registry.ts +58 -0
- package/server/engine/load-meter.ts +384 -0
- package/server/engine/local-declarations.ts +700 -0
- package/server/engine/model-basis.ts +78 -10
- package/server/engine/model-vocabulary.ts +82 -0
- package/server/engine/oee-accumulator.ts +34 -1
- package/server/engine/operation-basis.ts +100 -0
- package/server/engine/property-effects.ts +199 -0
- package/server/engine/runtime-key.ts +58 -0
- package/server/engine/spec-coverage.ts +3 -3
- package/server/engine/state-axes.ts +60 -0
- package/server/engine/structure-diff.ts +1 -1
- package/server/engine/travel-estimator.ts +11 -6
- package/server/engine/twin-engine.ts +1710 -297
- package/server/engine/warm-start.ts +207 -22
- package/server/index.ts +13 -10
- package/server/migrations/1786000000000-RenameTwinInstanceBoardToModel.ts +43 -0
- package/server/migrations/index.ts +7 -0
- package/server/service/index.ts +9 -1
- package/server/service/reference/discovery-result.ts +95 -0
- package/server/service/reference/ingest-space.ts +104 -0
- package/server/service/reference/knob-defaults.ts +59 -0
- package/server/service/reference/reference-live.ts +121 -6
- package/server/service/reference/reference-master.ts +362 -35
- package/server/service/reference/reference-resolver.ts +307 -23
- package/server/service/reference/template-registry.ts +20 -5
- package/server/service/twin-attention/twin-attention-query.ts +43 -6
- package/server/service/twin-audit/command-audit.ts +81 -0
- package/server/service/twin-audit/index.ts +5 -0
- package/server/service/twin-audit/twin-audit-event.ts +112 -0
- package/server/service/twin-audit/twin-audit-query.ts +72 -0
- package/server/service/twin-control/twin-control-mutation.ts +53 -13
- package/server/service/twin-event/twin-event-keys.ts +1 -1
- package/server/service/twin-event/twin-event.ts +52 -15
- package/server/service/twin-forecast/forecast-metrics.ts +60 -0
- package/server/service/twin-forecast/forecast-tuning.ts +40 -0
- package/server/service/twin-forecast/gap-analytics.ts +48 -9
- package/server/service/twin-forecast/twin-forecast-query.ts +211 -38
- package/server/service/twin-instance/twin-instance.ts +127 -22
- package/server/service/twin-journal/twin-journal-query.ts +108 -14
- package/server/service/twin-lifecycle/twin-lifecycle-mutation.ts +40 -23
- package/server/service/twin-metrics/twin-metrics-query.ts +60 -3
- package/server/service/twin-model/epcis-coverage.ts +195 -0
- package/server/service/twin-model/iec61850-coverage.ts +117 -0
- package/server/service/twin-model/index.ts +25 -0
- package/server/service/twin-model/isa95-coverage.ts +190 -0
- package/server/service/twin-model/project-structure.ts +199 -0
- package/server/service/twin-model/standard-coverage.ts +35 -0
- package/server/service/twin-model/twin-equipment.ts +150 -0
- package/server/service/twin-model/twin-lineage-query.ts +193 -0
- package/server/service/twin-model/twin-location.ts +140 -0
- package/server/service/twin-model/twin-model-item-query.ts +848 -0
- package/server/service/twin-model/twin-model-mutation.ts +503 -0
- package/server/service/twin-model/twin-model-query.ts +537 -0
- package/server/service/twin-model/twin-model-tree-query.ts +180 -0
- package/server/service/twin-model/twin-operation.ts +150 -0
- package/server/service/twin-space/move-space.ts +262 -0
- package/server/service/twin-space/space-integrity.ts +293 -0
- package/server/service/twin-space/twin-space-area.ts +4 -4
- package/server/service/twin-space/twin-space-representation.ts +6 -6
- package/server/service/twin-space/twin-space-resolver.ts +365 -22
- package/server/service/twin-space/twin-space.ts +40 -6
- package/server/service/twin-state/twin-state-subscription.ts +1 -1
- package/server/service/twin-structure/twin-structure.ts +10 -7
- package/server/service/twin-target/twin-target-resolver.ts +22 -4
- package/shared/axis-read.ts +28 -0
- package/shared/entity-delta.ts +286 -0
- package/shared/kpi-broadcast.ts +13 -0
- package/shared/twin-level.ts +48 -0
- package/test/adopt-structure-live.test.ts +133 -0
- package/test/attention-digest.test.ts +135 -0
- package/test/axis-read.test.ts +87 -0
- package/test/boot-resume.test.ts +205 -0
- package/test/canonical-ingest-vocabularies.test.ts +118 -0
- package/test/capability-mapping.test.ts +5 -5
- package/test/command-routing.test.ts +61 -0
- package/test/declaration-reaches-model.test.ts +178 -0
- package/test/discovery-result.test.ts +75 -0
- package/test/energy-topology.test.ts +113 -0
- package/test/entity-delta.test.ts +195 -25
- package/test/event-time-column.test.ts +67 -0
- package/test/forecast-metrics.test.ts +71 -0
- package/test/forecast-tuning.test.ts +42 -0
- package/test/gap-analytics.test.ts +34 -7
- package/test/ingest-bench.test.ts +9 -9
- package/test/ingest-running-guard.test.ts +136 -0
- package/test/ingest-space.test.ts +78 -0
- package/test/instance-cache-lifecycle.test.ts +110 -0
- package/test/kernel-kind-guard.test.ts +96 -0
- package/test/knob-defaults.test.ts +72 -0
- package/test/kpi-baseline-db.test.ts +216 -0
- package/test/kpi-baseline.test.ts +196 -0
- package/test/kpi-fold.test.ts +393 -2
- package/test/kpi-query-bench.test.ts +130 -0
- package/test/lineage-survives-restart.test.ts +203 -0
- package/test/live-feed-registry.test.ts +67 -0
- package/test/live-kernel-facts.test.ts +161 -0
- package/test/live-mirror-parity.test.ts +54 -14
- package/test/load-meter.test.ts +314 -0
- package/test/local-declarations.test.ts +554 -0
- package/test/master-to-twin.test.ts +128 -36
- package/test/model-basis.test.ts +56 -1
- package/test/model-vocabulary.test.ts +114 -0
- package/test/move-space.test.ts +149 -0
- package/test/mutation-gate.test.ts +122 -0
- package/test/oee-accumulator.test.ts +90 -7
- package/test/operation-basis.test.ts +100 -0
- package/test/operations-capability-db.test.ts +165 -0
- package/test/project-structure-db.test.ts +226 -0
- package/test/projection-reaches-screen.test.ts +272 -0
- package/test/property-effects.test.ts +96 -0
- package/test/registry-key-guard.test.ts +80 -0
- package/test/resync-origin-site.test.ts +77 -0
- package/test/runtime-key.test.ts +66 -0
- package/test/scale-twin-bench.test.ts +7 -7
- package/test/snapshot-freshness.test.ts +60 -0
- package/test/space-integrity.test.ts +223 -0
- package/test/standard-coverage.test.ts +94 -0
- package/test/state-axes.test.ts +74 -0
- package/test/streamline-e2e.test.ts +16 -16
- package/test/structure-revision-db.test.ts +16 -15
- package/test/tenant-registry-db.test.ts +149 -0
- package/test/twin-audit.test.ts +83 -0
- package/test/twin-model-item-db.test.ts +275 -0
- package/test/twin-model-tree-db.test.ts +176 -0
- package/test/twin-origin-resync.test.ts +114 -0
- package/test/warm-start-seam.test.ts +140 -0
- package/test/warm-start.test.ts +223 -4
- package/tsconfig.json +6 -1
- package/tsconfig.shared.json +23 -0
- package/tsconfig.shared.tsbuildinfo +1 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/dist-server/engine/entity-delta.d.ts +0 -19
- package/dist-server/engine/entity-delta.js +0 -161
- package/dist-server/engine/entity-delta.js.map +0 -1
- package/dist-server/service/twin-event/backfill-keys.d.ts +0 -11
- package/dist-server/service/twin-event/backfill-keys.js +0 -63
- package/dist-server/service/twin-event/backfill-keys.js.map +0 -1
- package/dist-server/tsconfig.tsbuildinfo +0 -1
- package/server/engine/entity-delta.ts +0 -169
- package/server/service/twin-event/backfill-keys.ts +0 -72
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ★ 웜스타트 이음매 검증 — 판정이 만든 씨앗이 **실제 커널에 심기는지**.
|
|
3
|
+
*
|
|
4
|
+
* ── 왜 따로 있나 ────────────────────────────────────────────────────────────
|
|
5
|
+
* `warm-start.test.ts` 는 순수 판정만 본다("무엇을 씨앗에 담기로 했나"). 그것만으로는 부족했다:
|
|
6
|
+
* 재기동 후 주문이 사라진 결함은 판정과 커널 **사이**에 있었기 때문이다. 판정은 오더를 버렸고,
|
|
7
|
+
* 커널은 받을 준비가 되어 있었다. 양쪽 테스트가 각각 초록이어도 이음매는 끊겨 있었다.
|
|
8
|
+
*
|
|
9
|
+
* 특히 이 테스트가 겨누는 것은 **`snap.orders` 경로**다. 커널은 오더를 두 가지로 받는다 —
|
|
10
|
+
* 두 번째 인자(`OrderStatusDelta[]`)와 스냅샷 안(`snap.orders`). 커널 테스트는 두 번째 인자를
|
|
11
|
+
* 쓰고, 호스트 웜스타트는 스냅샷 안을 쓴다. 즉 **호스트가 의존하는 쪽이 검증되지 않은 상태**였다.
|
|
12
|
+
*
|
|
13
|
+
* ── 무엇을 단언하나 ────────────────────────────────────────────────────────
|
|
14
|
+
* 스냅샷의 오더가 남은 데맨드(requested − fulfilled)로 커널에 서고, 이행이 끝난 오더는 서지 않고,
|
|
15
|
+
* 원값이 없는 오더는 조용히 서지 않는다는 것. 숫자를 지어내지 않는다는 규칙이 이음매 끝까지 지켜지는가.
|
|
16
|
+
*/
|
|
17
|
+
import { test } from 'node:test'
|
|
18
|
+
import assert from 'node:assert/strict'
|
|
19
|
+
|
|
20
|
+
import { WmsKernel } from '@operato/twin-kernel'
|
|
21
|
+
|
|
22
|
+
import { planWarmStart } from '../server/engine/warm-start.ts'
|
|
23
|
+
import { withLiveAttentions } from '../server/engine/live-attentions.ts'
|
|
24
|
+
|
|
25
|
+
const GTIN = 'urn:epc:idpat:sgtin:0614141.012345.*'
|
|
26
|
+
|
|
27
|
+
/*
|
|
28
|
+
* 보드 — WMS 출고 흐름(피킹 → 스테이징 → 출하)이 실제로 굴러갈 최소 구성.
|
|
29
|
+
* `staging` 을 빼고 짜 봤더니 오더가 서기만 하고 진행이 0 이었다. 이음매가 아니라 픽스처 문제였다 —
|
|
30
|
+
* 이 테스트가 흐름 요건까지 시험하려는 것이 아니므로 커널 테스트와 같은 네 자리를 쓴다.
|
|
31
|
+
*/
|
|
32
|
+
const model = () => ({
|
|
33
|
+
locations: [
|
|
34
|
+
{ id: 'dock-recv', type: 'dock', capacity: 100 },
|
|
35
|
+
{ id: 'bin-1', type: 'storage', capacity: 200 },
|
|
36
|
+
{ id: 'staging', type: 'staging', capacity: 100 },
|
|
37
|
+
{ id: 'dock-ship', type: 'dock-ship', capacity: 100 }
|
|
38
|
+
],
|
|
39
|
+
equipment: [
|
|
40
|
+
{ id: 'fk-1', kind: 'forklift', homeLocation: 'dock-recv' },
|
|
41
|
+
{ id: 'fk-2', kind: 'forklift', homeLocation: 'dock-recv' }
|
|
42
|
+
]
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
/** 관측 스냅샷 흉내가 아니라, 스냅샷이 실제로 들고 오는 모양(일곱 축 중 필요한 것). */
|
|
46
|
+
const observed = (orders: unknown[]) => ({
|
|
47
|
+
locations: model().locations.map(n => ({ ...n, occupancy: 0, status: 'idle' })),
|
|
48
|
+
items: Array.from({ length: 20 }, (_, i) => ({
|
|
49
|
+
epc: `urn:epc:id:sgtin:0614141.012345.${i}`,
|
|
50
|
+
location: 'bin-1',
|
|
51
|
+
gtin: GTIN,
|
|
52
|
+
qty: 1
|
|
53
|
+
})),
|
|
54
|
+
equipment: model().equipment.map(m => ({ ...m, location: 'dock-recv', status: 'idle' })),
|
|
55
|
+
tasks: [],
|
|
56
|
+
orders
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
/** 판정 → 주입. 호스트 `warmStart` 가 하는 일과 같은 순서로 잇는다. */
|
|
60
|
+
function seedKernel(state: ReturnType<typeof observed>) {
|
|
61
|
+
const plan = planWarmStart(state, undefined, true)
|
|
62
|
+
assert.equal(plan.action, 'hydrate', '심기로 판정해야 한다')
|
|
63
|
+
if (plan.action !== 'hydrate') throw new Error('unreachable')
|
|
64
|
+
const k = new WmsKernel('t')
|
|
65
|
+
k.loadTwinModel(model() as any)
|
|
66
|
+
;(k as any).hydrateObserved(plan.seed)
|
|
67
|
+
return { k, plan }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
test('스냅샷 안의 오더가 커널에 선다 — 남은 데맨드로', () => {
|
|
71
|
+
const { k, plan } = seedKernel(
|
|
72
|
+
observed([{ id: 'SO-1', kind: 'outbound', status: 'in-progress', requested: 20, fulfilled: 5, lines: [{ gtin: GTIN, requested: 20, fulfilled: 5 }] }])
|
|
73
|
+
)
|
|
74
|
+
assert.equal(plan.orderCount, 1)
|
|
75
|
+
const o = (k as any).orders.get('SO-1')
|
|
76
|
+
assert.ok(o, '재기동 후 진행 중 주문이 커널에 있어야 한다 — 사라지던 결함의 회귀 방지')
|
|
77
|
+
assert.equal(o.requested, 15, '남은 데맨드 15(20−5)로 서야 한다 — 원값이 아니라 남은 양이다')
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
test('재고가 있으면 복원된 오더가 실제로 이행된다 — 서 있기만 하면 의미가 없다', () => {
|
|
81
|
+
const { k } = seedKernel(
|
|
82
|
+
observed([{ id: 'SO-1', kind: 'outbound', status: 'in-progress', requested: 8, fulfilled: 0, lines: [{ gtin: GTIN, requested: 8, fulfilled: 0 }] }])
|
|
83
|
+
)
|
|
84
|
+
const fc = (k as any).fork()
|
|
85
|
+
for (let t = 0; t < 1200; t++) fc.tick(1000)
|
|
86
|
+
const o = fc.getSnapshot().orders.find((x: any) => x.id === 'SO-1')
|
|
87
|
+
assert.ok(o, '예측에도 오더가 있어야 한다')
|
|
88
|
+
assert.ok(o.progress > 0, `복원된 오더가 진행돼야 한다(progress=${o.progress})`)
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
test('이미 이행된 오더는 서지 않는다 — 다 끝난 일을 다시 계획하지 않는다', () => {
|
|
92
|
+
const { k, plan } = seedKernel(
|
|
93
|
+
observed([{ id: 'SO-DONE', kind: 'outbound', status: 'completed', requested: 10, fulfilled: 10, lines: [{ gtin: GTIN, requested: 10, fulfilled: 10 }] }])
|
|
94
|
+
)
|
|
95
|
+
assert.equal(plan.orderCount, 1, '판정은 원값이 있으므로 넘긴다')
|
|
96
|
+
assert.equal((k as any).orders.get('SO-DONE'), undefined, '커널이 남은 양 0 으로 보고 세우지 않는다')
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
test('원값이 없는 오더는 커널에 서지 않고, 몇 건인지 남는다', () => {
|
|
100
|
+
const state = observed([{ id: 'SO-P', kind: 'outbound', status: 'in-progress', progress: 0.5 }])
|
|
101
|
+
const plan = planWarmStart(state, undefined, true)
|
|
102
|
+
assert.equal(plan.action, 'hydrate')
|
|
103
|
+
if (plan.action !== 'hydrate') return
|
|
104
|
+
assert.equal(plan.orderCount, 0)
|
|
105
|
+
assert.equal(plan.ordersWithoutDemand, 1, '뺀 사실이 숫자로 남아야 로그가 말할 수 있다')
|
|
106
|
+
|
|
107
|
+
const k = new WmsKernel('t')
|
|
108
|
+
k.loadTwinModel(model() as any)
|
|
109
|
+
;(k as any).hydrateObserved(plan.seed)
|
|
110
|
+
assert.equal((k as any).orders.size, 0, 'progress 만으로는 남은 양을 알 수 없으므로 지어내지 않는다')
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
test('재고도 함께 살아난다 — 오더를 넣다가 기존 복원을 깨지 않았는지', () => {
|
|
114
|
+
const { k } = seedKernel(observed([{ id: 'SO-1', requested: 5, fulfilled: 0, kind: 'outbound', status: 'in-progress' }]))
|
|
115
|
+
const snap = (k as any).getSnapshot()
|
|
116
|
+
assert.equal(snap.items.length, 20, '재고 20건이 그대로 복원돼야 한다')
|
|
117
|
+
assert.equal(snap.equipment.length, 2)
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
test('라이브 상태의 확인 처리가 신호에 반영된다 — 라이브에서는 전혀 반영되지 않던 것', () => {
|
|
121
|
+
/*
|
|
122
|
+
* `withLiveAttentions` 가 확인 목록을 넘기지 않아, 라이브(미러)에서는 사람이 확인해도 신호가
|
|
123
|
+
* 계속 활성으로 나갔다. 저널에서 되살린 확인 처리가 여기까지 닿는지 본다.
|
|
124
|
+
*/
|
|
125
|
+
const state = {
|
|
126
|
+
locations: [{ id: 'bin-tight', type: 'storage', capacity: 1, occupancy: 1 }],
|
|
127
|
+
equipment: [],
|
|
128
|
+
orders: [],
|
|
129
|
+
tasks: [],
|
|
130
|
+
acked: [] as string[]
|
|
131
|
+
}
|
|
132
|
+
const before = withLiveAttentions(state).attentions ?? []
|
|
133
|
+
const signal = before[0]
|
|
134
|
+
assert.ok(signal, '픽스처 전제 — 병목 신호가 서야 한다')
|
|
135
|
+
/* 확인 전에는 `state` 를 채우지 않는다(확인된 것만 표시한다) — 없음과 'acknowledged' 를 가른다. */
|
|
136
|
+
assert.notEqual(signal.state, 'acknowledged', '확인하지 않았는데 확인된 것으로 나오면 안 된다')
|
|
137
|
+
|
|
138
|
+
const after = withLiveAttentions({ ...state, acked: [signal.id] }).attentions ?? []
|
|
139
|
+
assert.equal(after.find((a: any) => a.id === signal.id)?.state, 'acknowledged', '확인 처리가 라이브 신호에 반영돼야 한다')
|
|
140
|
+
})
|
package/test/warm-start.test.ts
CHANGED
|
@@ -7,8 +7,10 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { test } from 'node:test'
|
|
9
9
|
import assert from 'node:assert/strict'
|
|
10
|
+
import { readFileSync } from 'node:fs'
|
|
11
|
+
import { fileURLToPath } from 'node:url'
|
|
10
12
|
|
|
11
|
-
import { planWarmStart } from '../server/engine/warm-start.ts'
|
|
13
|
+
import { planLiveContinuity, planWarmStart, unwrapState } from '../server/engine/warm-start.ts'
|
|
12
14
|
|
|
13
15
|
const STATE = {
|
|
14
16
|
locations: [{ id: 'dock-recv' }, { id: 'rack-1' }],
|
|
@@ -27,13 +29,82 @@ test('상태가 있으면 심는다 — 재고·노드·무버', () => {
|
|
|
27
29
|
assert.deepEqual(plan.seed.locations, STATE.locations)
|
|
28
30
|
})
|
|
29
31
|
|
|
30
|
-
test('오더는 심지 않는다 —
|
|
32
|
+
test('원값 없는 오더는 심지 않는다 — 남은 수량을 알 수 없어 지어내야 하기 때문', () => {
|
|
33
|
+
/* STATE 의 오더는 progress 만 들고 있다 — 커널 판정(requested !== undefined)과 같은 기준으로 뺀다. */
|
|
31
34
|
const plan = planWarmStart(STATE, undefined, true)
|
|
32
35
|
assert.equal(plan.action, 'hydrate')
|
|
33
36
|
if (plan.action !== 'hydrate') return
|
|
37
|
+
assert.equal(plan.seed.orders, undefined)
|
|
38
|
+
assert.equal(plan.orderCount, 0)
|
|
39
|
+
assert.equal(plan.ordersWithoutDemand, 1)
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
test('뺀 오더의 수를 센다 — "주문이 없다" 와 "주문을 못 심었다" 가 같아지면 안 된다', () => {
|
|
43
|
+
/*
|
|
44
|
+
* 이 숫자가 로그의 근거다. 세지 않고 조용히 빼면, 재기동 후 빈 주문 목록을 보고
|
|
45
|
+
* 사용자는 "원래 없었다" 로 읽는다. 실제로 그 화면이 오래 남아 있었다.
|
|
46
|
+
*/
|
|
47
|
+
const mixed = {
|
|
48
|
+
...STATE,
|
|
49
|
+
orders: [
|
|
50
|
+
{ id: 'SO-1', kind: 'outbound', status: 'created', progress: 0.5 },
|
|
51
|
+
{ id: 'SO-2', kind: 'outbound', status: 'created', requested: 100, fulfilled: 40 },
|
|
52
|
+
{ id: 'SO-3', kind: 'outbound', status: 'created', requested: 30 }
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
const plan = planWarmStart(mixed, undefined, true)
|
|
56
|
+
assert.equal(plan.action, 'hydrate')
|
|
57
|
+
if (plan.action !== 'hydrate') return
|
|
58
|
+
assert.equal(plan.orderCount, 2)
|
|
59
|
+
assert.equal(plan.ordersWithoutDemand, 1)
|
|
60
|
+
assert.deepEqual((plan.seed.orders as any[]).map(o => o.id), ['SO-2', 'SO-3'])
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
test('진행 중 주문을 심는다 — 재기동하면 주문이 사라졌던 결함의 회귀 방지', () => {
|
|
64
|
+
/*
|
|
65
|
+
* 예전에는 씨앗이 자리·물품·설비 셋만 넘겨, 재고는 맞는데 주문 목록이 비었다. 원값이 있는
|
|
66
|
+
* 오더는 반드시 씨앗에 실려야 한다 — 이 단언이 그 결함으로 되돌아가는 것을 막는다.
|
|
67
|
+
*/
|
|
68
|
+
const plan = planWarmStart(
|
|
69
|
+
{ ...STATE, orders: [{ id: 'SO-9', kind: 'outbound', status: 'created', requested: 50, fulfilled: 10, lines: [{ gtin: 'g1', requested: 50 }] }] },
|
|
70
|
+
undefined,
|
|
71
|
+
true
|
|
72
|
+
)
|
|
73
|
+
assert.equal(plan.action, 'hydrate')
|
|
74
|
+
if (plan.action !== 'hydrate') return
|
|
75
|
+
assert.equal(plan.orderCount, 1)
|
|
76
|
+
assert.equal(plan.ordersWithoutDemand, 0)
|
|
77
|
+
assert.equal((plan.seed.orders as any[])[0].requested, 50)
|
|
78
|
+
assert.equal((plan.seed.orders as any[])[0].fulfilled, 10)
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
test('작업·사람·자산도 함께 심는다 — 커널이 심을 수 있는 축을 호스트가 버리지 않는다', () => {
|
|
82
|
+
const plan = planWarmStart(
|
|
83
|
+
{ ...STATE, persons: [{ id: 'p1' }, { id: 'p2' }], assets: [{ id: 'pallet-1' }] },
|
|
84
|
+
undefined,
|
|
85
|
+
true
|
|
86
|
+
)
|
|
87
|
+
assert.equal(plan.action, 'hydrate')
|
|
88
|
+
if (plan.action !== 'hydrate') return
|
|
89
|
+
assert.equal(plan.taskCount, 1)
|
|
90
|
+
assert.equal(plan.personCount, 2)
|
|
91
|
+
assert.equal(plan.assetCount, 1)
|
|
92
|
+
assert.deepEqual(plan.seed.tasks, STATE.tasks)
|
|
93
|
+
assert.equal((plan.seed.persons as any[]).length, 2)
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
test('없는 축은 씨앗에 키를 만들지 않는다 — 빈 배열로 커널 판정을 흐리지 않는다', () => {
|
|
97
|
+
const plan = planWarmStart({ locations: [{ id: 'n1' }], items: [], equipment: [] }, undefined, true)
|
|
98
|
+
assert.equal(plan.action, 'hydrate')
|
|
99
|
+
if (plan.action !== 'hydrate') return
|
|
34
100
|
assert.deepEqual(Object.keys(plan.seed).sort(), ['equipment', 'items', 'locations'])
|
|
35
|
-
|
|
36
|
-
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
test('오더만 있어도 심는다 — 구조가 모델에서 오는 경우가 있다', () => {
|
|
104
|
+
const plan = planWarmStart({ orders: [{ id: 'SO-1', requested: 10 }] } as any, undefined, true)
|
|
105
|
+
assert.equal(plan.action, 'hydrate')
|
|
106
|
+
if (plan.action !== 'hydrate') return
|
|
107
|
+
assert.equal(plan.orderCount, 1)
|
|
37
108
|
})
|
|
38
109
|
|
|
39
110
|
test('벤치 트윈에는 심지 않는다 — 새 시작에서 용량을 재는 것이 목적이다', () => {
|
|
@@ -76,3 +147,151 @@ test('빠진 배열은 빈 배열로 다뤄지되 없는 것을 지어내지 않
|
|
|
76
147
|
assert.deepEqual(plan.seed.equipment, [])
|
|
77
148
|
assert.equal(plan.itemCount, 1)
|
|
78
149
|
})
|
|
150
|
+
|
|
151
|
+
test('확인해 둔 주목 신호를 이어받는다 — 재기동하면 다시 빨개지던 것', () => {
|
|
152
|
+
/*
|
|
153
|
+
* 확인 처리는 상태에서 파생되지 않는 유일한 축이다. 씨앗에서 빠지면 재기동 후 확인해 둔 신호가
|
|
154
|
+
* 전부 다시 활성으로 뜬다 — 오류는 나지 않고, 사용자는 "또 터졌다" 로 읽는다.
|
|
155
|
+
*/
|
|
156
|
+
const plan = planWarmStart({ ...STATE, acked: ['bottleneck:bin-1', 'breakdown:fk-1'] } as any, undefined, true)
|
|
157
|
+
assert.equal(plan.action, 'hydrate')
|
|
158
|
+
if (plan.action !== 'hydrate') return
|
|
159
|
+
assert.deepEqual(plan.seed.acked, ['bottleneck:bin-1', 'breakdown:fk-1'])
|
|
160
|
+
assert.equal(plan.ackedCount, 2)
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
test('확인 처리만 있어도 복원한다 — 신호를 확인해 둔 사실 자체가 이어받을 가치가 있다', () => {
|
|
164
|
+
const plan = planWarmStart({ acked: ['bottleneck:bin-1'] } as any, undefined, true)
|
|
165
|
+
assert.equal(plan.action, 'hydrate')
|
|
166
|
+
if (plan.action !== 'hydrate') return
|
|
167
|
+
assert.equal(plan.ackedCount, 1)
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
test('확인 처리가 문자열 목록이 아니면 없는 것으로 본다 — 지어내지 않는다', () => {
|
|
171
|
+
const plan = planWarmStart({ ...STATE, acked: 'nope' } as any, undefined, true)
|
|
172
|
+
assert.equal(plan.action, 'hydrate')
|
|
173
|
+
if (plan.action !== 'hydrate') return
|
|
174
|
+
assert.equal(plan.ackedCount, 0)
|
|
175
|
+
assert.equal(plan.seed.acked, undefined)
|
|
176
|
+
})
|
|
177
|
+
|
|
178
|
+
/*
|
|
179
|
+
* ── 겹포장 회귀 방지 (2026-08-05) ──────────────────────────────────────────
|
|
180
|
+
* 체크포인트가 `{revision, state:{revision, state:{실제}}}` 로 저장돼, 꺼낸 값에 축이 하나도 없었다.
|
|
181
|
+
* 판정은 "심을 것이 없다"(no-state)로 답하고 **조용히** 넘어갔다 — 저널에 수천 건이 있고 캐시도
|
|
182
|
+
* 최신인데 트윈이 빈 채로 떴다. 오류도 로그도 없어서 이 경로가 처음부터 죽어 있었다.
|
|
183
|
+
*/
|
|
184
|
+
test('봉투로 감싸여 와도 벗겨서 심는다 — 체크포인트가 겹포장돼 복원이 죽었던 자리', () => {
|
|
185
|
+
const enveloped = { revision: 2684, state: { revision: 2684, state: STATE } }
|
|
186
|
+
const plan = planWarmStart(enveloped as any, undefined, true)
|
|
187
|
+
assert.equal(plan.action, 'hydrate', '봉투를 받으면 심을 것이 없다고 답하면 안 된다')
|
|
188
|
+
if (plan.action !== 'hydrate') return
|
|
189
|
+
assert.equal(plan.itemCount, 3)
|
|
190
|
+
assert.deepEqual(plan.seed.locations, STATE.locations)
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
test('한 겹 봉투도 벗긴다 — 저장 방식이 바뀌는 동안 두 모양이 함께 남는다', () => {
|
|
194
|
+
const plan = planWarmStart({ revision: 1, state: STATE } as any, undefined, true)
|
|
195
|
+
assert.equal(plan.action, 'hydrate')
|
|
196
|
+
if (plan.action !== 'hydrate') return
|
|
197
|
+
assert.equal(plan.itemCount, 3)
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
test('벗길 것이 없으면 그대로 쓴다 — 상태를 봉투로 착각하지 않는다', () => {
|
|
201
|
+
const plan = planWarmStart(STATE, undefined, true)
|
|
202
|
+
assert.equal(plan.action, 'hydrate')
|
|
203
|
+
if (plan.action !== 'hydrate') return
|
|
204
|
+
assert.equal(plan.itemCount, 3)
|
|
205
|
+
})
|
|
206
|
+
|
|
207
|
+
test('빈 봉투는 여전히 no-state — 벗겼는데도 아무 축이 없으면 심을 것이 없다', () => {
|
|
208
|
+
assert.deepEqual(planWarmStart({ revision: 5, state: { revision: 5 } } as any, undefined, true), { action: 'skip', reason: 'no-state' })
|
|
209
|
+
})
|
|
210
|
+
|
|
211
|
+
test('unwrapState 는 상태를 먼저 알아본다 — state 라는 이름의 축이 있어도 벗기지 않는다', () => {
|
|
212
|
+
const st = { items: [{ epc: 'a' }], state: 'whatever' }
|
|
213
|
+
assert.equal(unwrapState(st as any), st, '축이 있으면 그것이 상태다')
|
|
214
|
+
})
|
|
215
|
+
|
|
216
|
+
/*
|
|
217
|
+
* ── 「언제부터인가」도 씨앗에 실린다 (2026-08-18) ─────────────────────────────
|
|
218
|
+
* 확인과 같은 성질이다 — 상태에서 파생되지 않으므로 넘기지 않으면 사라진다. 사라지면 세 시간째
|
|
219
|
+
* 지속된 조건이 재기동 뒤 「0초째」가 되고, 화면은 사람을 잘못된 순서로 움직인다.
|
|
220
|
+
*/
|
|
221
|
+
test('주목 신호 시작 시각이 씨앗에 실린다 — 재기동 뒤 지속 시간이 거짓이 되지 않게', () => {
|
|
222
|
+
const since = [{ id: 'bottleneck:bin-1', since: '2026-08-18T01:00:00.000Z' }]
|
|
223
|
+
const plan = planWarmStart({ ...STATE, attentionSince: since } as any, undefined, true)
|
|
224
|
+
assert.equal(plan.action, 'hydrate')
|
|
225
|
+
if (plan.action !== 'hydrate') return
|
|
226
|
+
assert.deepEqual(plan.seed.attentionSince, since)
|
|
227
|
+
assert.equal(plan.attentionSinceCount, 1)
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
test('시작 시각만 있어도 복원한다 — 그 사실 자체가 이어받을 가치가 있다', () => {
|
|
231
|
+
const plan = planWarmStart({ attentionSince: [{ id: 'a', since: '2026-08-18T01:00:00.000Z' }] } as any, undefined, true)
|
|
232
|
+
assert.equal(plan.action, 'hydrate')
|
|
233
|
+
if (plan.action !== 'hydrate') return
|
|
234
|
+
assert.equal(plan.attentionSinceCount, 1)
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
test('모양이 아닌 시작 시각은 없는 것으로 본다 — 지어낸 시각을 심지 않는다', () => {
|
|
238
|
+
const plan = planWarmStart({ ...STATE, attentionSince: ['bottleneck:bin-1', { id: 'ok', since: 5 }, { since: '2026-08-18T01:00:00.000Z' }] } as any, undefined, true)
|
|
239
|
+
assert.equal(plan.action, 'hydrate')
|
|
240
|
+
if (plan.action !== 'hydrate') return
|
|
241
|
+
assert.equal(plan.attentionSinceCount, 0)
|
|
242
|
+
assert.equal(plan.seed.attentionSince, undefined)
|
|
243
|
+
})
|
|
244
|
+
|
|
245
|
+
/*
|
|
246
|
+
* ── 미러 재기동의 연속성 (2026-08-18) ────────────────────────────────────────
|
|
247
|
+
* 미러는 오랫동안 아무것도 이어받지 않았다 — 진실이 원천에 있으니 옳았지만, 원천이 **애초에 다시 말해
|
|
248
|
+
* 주지 않는 축**까지 함께 버렸다. 그래서 재기동하면 오류 없이 값이 작아졌다.
|
|
249
|
+
*/
|
|
250
|
+
test('미러는 되풀어 주지 않는 축만 이어받는다 — 관측 축은 원천에서 온다', () => {
|
|
251
|
+
const plan = planLiveContinuity({
|
|
252
|
+
...STATE,
|
|
253
|
+
acked: ['bottleneck:bin-1'],
|
|
254
|
+
attentionSince: [{ id: 'bottleneck:bin-1', since: '2026-08-18T01:00:00.000Z' }],
|
|
255
|
+
energy: { points: [{ id: 'm-1', kWhAtWindowStart: 1000, samplesInWindow: 3 }], closed: [], closedTotal: 0 }
|
|
256
|
+
})
|
|
257
|
+
assert.equal(plan.ackedCount, 1)
|
|
258
|
+
assert.equal(plan.attentionSinceCount, 1)
|
|
259
|
+
assert.equal(plan.energy, true)
|
|
260
|
+
/* 관측 축은 **일부러** 넣지 않는다 — 심으면 부팅 전에 떠난 물건이 되살아난다. */
|
|
261
|
+
assert.equal((plan.seed as any).locations, undefined)
|
|
262
|
+
assert.equal((plan.seed as any).items, undefined)
|
|
263
|
+
assert.equal((plan.seed as any).equipment, undefined)
|
|
264
|
+
assert.equal((plan.seed as any).orders, undefined)
|
|
265
|
+
})
|
|
266
|
+
|
|
267
|
+
test('에너지가 없는 트윈은 에너지를 이어받지 않는다 — 없는 것을 있다고 하지 않는다', () => {
|
|
268
|
+
const plan = planLiveContinuity({ ...STATE, acked: ['x'] })
|
|
269
|
+
assert.equal(plan.energy, false)
|
|
270
|
+
assert.equal((plan.seed as any).energy, undefined)
|
|
271
|
+
})
|
|
272
|
+
|
|
273
|
+
test('이어받을 것이 없으면 빈 씨앗이다 — 빈 주입으로 로그만 남기지 않는다', () => {
|
|
274
|
+
const plan = planLiveContinuity(STATE)
|
|
275
|
+
assert.deepEqual(plan.seed, {})
|
|
276
|
+
assert.equal(plan.ackedCount + plan.attentionSinceCount, 0)
|
|
277
|
+
assert.equal(plan.energy, false)
|
|
278
|
+
})
|
|
279
|
+
|
|
280
|
+
test('겹포장된 체크포인트도 벗겨 읽는다 — 한 번은 반드시 만난다', () => {
|
|
281
|
+
const plan = planLiveContinuity({ revision: 42, state: { acked: ['a'], energy: { points: [] } } })
|
|
282
|
+
assert.equal(plan.ackedCount, 1)
|
|
283
|
+
assert.equal(plan.energy, true)
|
|
284
|
+
})
|
|
285
|
+
|
|
286
|
+
/* 배선이 사라지면 미러는 조용히 예전으로 돌아간다 — 소스 모양으로 못 박는다(엔진은 DB 를 물고 있다). */
|
|
287
|
+
test('미러 기동이 연속성 씨앗을 심는다 — 배선이 사라지지 않게', () => {
|
|
288
|
+
const src = readFileSync(fileURLToPath(new URL('../server/engine/twin-engine.ts', import.meta.url)), 'utf-8')
|
|
289
|
+
const at = src.indexOf('static startLive(')
|
|
290
|
+
assert.ok(at > 0)
|
|
291
|
+
const body = src.slice(at, src.indexOf('\n static ', at + 10))
|
|
292
|
+
assert.match(body, /seedLiveContinuity\(domainId, id, kernel\)/, '미러가 연속성을 이어받아야 한다')
|
|
293
|
+
assert.ok(
|
|
294
|
+
body.indexOf('seedLiveContinuity') < body.indexOf('delete this.recovered[key]'),
|
|
295
|
+
'캐시를 지우기 전에 심는다 — 순서가 뒤집히면 늘 빈손이다'
|
|
296
|
+
)
|
|
297
|
+
})
|
package/tsconfig.json
CHANGED
|
@@ -2,8 +2,13 @@
|
|
|
2
2
|
"extends": "../tsconfig-base.json",
|
|
3
3
|
"compilerOptions": {
|
|
4
4
|
"outDir": "./dist-server",
|
|
5
|
+
/* shared/ 는 별도 산출(dist-shared) — 여기 섞이면 dist-server/server/ 로 한 겹 밀린다. */
|
|
6
|
+
"rootDir": "./server",
|
|
5
7
|
"baseUrl": "./",
|
|
6
|
-
"skipLibCheck": true
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
/* 시험은 소스를 그대로 불러오므로 지역 import 가 `.ts` 여야 하고, 산출물은 `.js` 여야 한다.
|
|
10
|
+
이 옵션이 컴파일 때 확장자를 바꿔 준다(twin-ai 가 이미 쓰는 관행 — 두 규칙을 함께 지킨다). */
|
|
11
|
+
"rewriteRelativeImportExtensions": true
|
|
7
12
|
},
|
|
8
13
|
"include": ["./server/**/*"],
|
|
9
14
|
"exclude": ["**/*.spec.ts"]
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* 공유 어휘 빌드 — 서버와 **브라우저가 함께 보는** 순수 모듈.
|
|
3
|
+
*
|
|
4
|
+
* 왜 서버 빌드와 따로인가 (2026-08-07):
|
|
5
|
+
* 이 파일들은 `server/engine/` 안에 있었고, 화면 코드가 `dist-server/engine/*.js` 를 깊이 참조했다.
|
|
6
|
+
* 그런데 `build:server` 는 `rm -rf dist-server` 로 시작한다. tsc 가 다시 채우기 전 그 틈에 webpack 이
|
|
7
|
+
* 컴파일하면 해석에 실패하고, 그 실패가 `bootstrap.js` 를 죽여 **앱 전체가 백지**가 된다. 콘솔에
|
|
8
|
+
* 오류 한 줄 없이 화면만 빈다. 실제로 그렇게 한 번 멈췄다.
|
|
9
|
+
*
|
|
10
|
+
* 그래서 산출 자리를 서버와 분리한다. `dist-shared` 는 서버를 다시 빌드해도 지워지지 않는다.
|
|
11
|
+
* (`build:shared` 도 일부러 clean 하지 않는다 — 지우는 순간이 곧 그 틈이다. 전체 정리는 `clean` 이 한다.)
|
|
12
|
+
*/
|
|
13
|
+
{
|
|
14
|
+
"extends": "../tsconfig-base.json",
|
|
15
|
+
"compilerOptions": {
|
|
16
|
+
"outDir": "./dist-shared",
|
|
17
|
+
"rootDir": "./shared",
|
|
18
|
+
"baseUrl": "./",
|
|
19
|
+
"declaration": true,
|
|
20
|
+
"skipLibCheck": true
|
|
21
|
+
},
|
|
22
|
+
"include": ["./shared/**/*"]
|
|
23
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/typescript/lib/lib.esnext.float16.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/tslib/tslib.d.ts","./shared/axis-read.ts","./shared/entity-delta.ts","./shared/kpi-broadcast.ts","./shared/twin-level.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/blob.d.ts","../../node_modules/@types/node/web-globals/console.d.ts","../../node_modules/@types/node/web-globals/crypto.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/encoding.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/utility.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client-stats.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/round-robin-pool.d.ts","../../node_modules/undici-types/h2c-client.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/dispatcher1-wrapper.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-call-history.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/snapshot-agent.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/socks5-proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/importmeta.d.ts","../../node_modules/@types/node/web-globals/messaging.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/performance.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/web-globals/streams.d.ts","../../node_modules/@types/node/web-globals/timers.d.ts","../../node_modules/@types/node/web-globals/url.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/ffi.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/inspector/promises.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/path/posix.d.ts","../../node_modules/@types/node/path/win32.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/quic.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/iter.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/test/reporters.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/util/types.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/zlib/iter.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@jest/expect-utils/build/index.d.ts","../../node_modules/chalk/index.d.ts","../../node_modules/@sinclair/typebox/typebox.d.ts","../../node_modules/@jest/schemas/build/index.d.ts","../../node_modules/pretty-format/build/index.d.ts","../../node_modules/jest-diff/build/index.d.ts","../../node_modules/jest-matcher-utils/build/index.d.ts","../../node_modules/expect/build/index.d.ts","../../node_modules/@types/jest/index.d.ts"],"fileIdsList":[[68,133,141,146,149,151,152,153,166],[68,133,141,146,149,151,152,153,166,196],[68,133,141,146,149,151,152,153,166,198,201],[68,130,131,133,141,146,149,151,152,153,166],[68,132,133,141,146,149,151,152,153,166],[133,141,146,149,151,152,153,166],[68,133,141,146,149,151,152,153,166,175],[68,133,134,139,141,144,146,149,151,152,153,155,166,171,184],[68,133,134,135,141,144,146,149,151,152,153,166],[68,133,136,141,146,149,151,152,153,166,185],[68,133,137,138,141,146,149,151,152,153,157,166],[68,133,138,141,146,149,151,152,153,166,171,181],[68,133,139,141,144,146,149,151,152,153,155,166],[68,132,133,140,141,146,149,151,152,153,166],[68,133,141,142,146,149,151,152,153,166],[68,133,141,143,144,146,149,151,152,153,166],[68,132,133,141,144,146,149,151,152,153,166],[68,133,141,144,146,147,149,151,152,153,166,171,184],[68,133,141,144,146,147,149,151,152,153,166,171,173,175],[68,120,133,141,144,146,148,149,151,152,153,155,166,171,184],[68,133,141,144,146,148,149,151,152,153,155,166,171,181,184],[68,133,141,146,148,149,150,151,152,153,166,171,181,184],[67,68,69,70,71,72,73,74,75,76,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192],[68,133,141,144,146,149,151,152,153,166],[68,133,141,146,149,151,153,166],[68,133,141,146,149,151,152,153,154,166,184],[68,133,141,144,146,149,151,152,153,155,166,171],[68,133,141,146,149,151,152,153,157,166],[68,133,141,146,149,151,152,153,158,166],[68,133,141,144,146,149,151,152,153,161,166],[68,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191],[68,133,141,146,149,151,152,153,163,166],[68,133,141,146,149,151,152,153,164,166],[68,133,138,141,146,147,149,151,152,153,155,166,173,181],[68,133,141,144,146,149,151,152,153,166,167],[68,133,141,146,149,151,152,153,166,168,185,188],[68,133,141,144,146,149,151,152,153,166,171,173,174,175],[68,133,141,146,149,151,152,153,166,172,175],[68,133,141,144,146,149,151,152,153,166,171,173],[68,133,141,144,146,149,151,152,153,166,171,174,175],[68,133,141,146,149,151,152,153,166,175,185],[68,133,141,146,149,151,152,153,166,176],[68,130,133,141,146,149,151,152,153,166,171,178,184],[68,133,141,146,149,151,152,153,166,171,177],[68,133,141,144,146,149,151,152,153,166,179,180],[68,133,141,146,149,151,152,153,166,179,180],[68,133,138,141,146,149,151,152,153,155,166,171,181],[68,133,141,146,149,151,152,153,166,182],[68,133,141,146,149,151,152,153,155,166,183],[68,133,141,146,148,149,151,152,153,164,166,184],[68,133,141,146,149,151,152,153,166,185,186],[68,133,138,141,146,149,151,152,153,166,186],[68,133,141,146,149,151,152,153,166,171,187],[68,133,141,146,149,151,152,153,154,166,188],[68,133,141,146,149,151,152,153,166,189],[68,133,136,141,146,149,151,152,153,166],[68,133,138,141,146,149,151,152,153,166],[68,133,141,146,149,151,152,153,166,185],[68,120,133,141,146,149,151,152,153,166],[68,133,141,146,149,151,152,153,166,184],[68,133,141,146,149,151,152,153,166,190],[68,133,141,146,149,151,152,153,161,166],[68,133,141,146,149,151,152,153,166,180],[68,120,133,141,144,146,147,149,151,152,153,161,166,171,175,184,187,188,190],[68,133,141,146,149,151,152,153,166,171,191],[68,133,141,146,149,151,152,153,166,173,192],[68,133,141,146,149,151,152,153,166,194,200],[68,133,141,146,149,151,152,153,166,198],[68,133,141,146,149,151,152,153,166,195,199],[68,133,141,146,149,151,152,153,166,197],[68,83,86,89,90,133,141,146,149,151,152,153,166,184],[68,86,133,141,146,149,151,152,153,166,171,184],[68,86,90,133,141,146,149,151,152,153,166,184],[68,133,141,146,149,151,152,153,166,171],[68,80,133,141,146,149,151,152,153,166],[68,84,133,141,146,149,151,152,153,166],[68,82,83,86,133,141,146,149,151,152,153,166,184],[68,133,141,146,149,151,152,153,155,166,181],[68,133,141,146,149,151,152,153,166,193],[68,80,133,141,146,149,151,152,153,166,193],[68,82,86,133,141,146,149,151,152,153,155,166,184],[68,77,78,79,81,85,133,141,144,146,149,151,152,153,166,171,184],[68,86,133,141,146,149,151,152,153,166],[68,86,95,104,133,141,146,149,151,152,153,166],[68,78,84,133,141,146,149,151,152,153,166],[68,86,114,115,133,141,146,149,151,152,153,166],[68,78,81,86,133,141,146,149,151,152,153,166,175,184,193],[68,82,86,133,141,146,149,151,152,153,166,184],[68,77,133,141,146,149,151,152,153,166],[68,80,81,82,84,85,86,87,88,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,115,116,117,118,119,133,141,146,149,151,152,153,166],[68,86,107,110,133,141,146,149,151,152,153,166],[68,86,95,97,98,133,141,146,149,151,152,153,166],[68,84,86,97,99,133,141,146,149,151,152,153,166],[68,85,133,141,146,149,151,152,153,166],[68,78,80,86,133,141,146,149,151,152,153,166],[68,86,90,97,99,133,141,146,149,151,152,153,166],[68,90,133,141,146,149,151,152,153,166],[68,84,86,89,133,141,146,149,151,152,153,166,184],[68,78,82,86,95,133,141,146,149,151,152,153,166],[68,86,107,133,141,146,149,151,152,153,166],[68,99,133,141,146,149,151,152,153,166],[68,78,82,86,90,133,141,146,149,151,152,153,166],[68,80,86,114,133,141,146,149,151,152,153,166,175,190,193],[62,68,133,141,146,149,151,152,153,166]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"5d3b72167b75e6c9f9d2ccbfd0d187874500558db92d396b3285039f2bfb5463","signature":"0bc2994fd3b67ed51b20f5fbd97f46e18690e87fb87c746b526cc6c092288c9a"},{"version":"2a672837661d3df6bf8fd8eaac6fb5c355d2c349b9e07d95ddfbadbe5dcda76d","signature":"849658141e8d6abcf2a1914cbb86a4d2e62af11667ee96027af4bf10f786c664"},{"version":"f9d9f664ddafcb8cdb036ab3f596144342e3ccf35eb65a750b1d5963c3b74699","signature":"2229812d96a52f08b7115b248ce84784ce61ad614d9394832cb5155184d07f87"},{"version":"2216140fd5da7bf0d59c14a6d2d6075ddc8e171af1fadef747fb8b8e59252978","signature":"1bbf41276b84e861d423ace1d49581e14308c88644ce3e3e1f6304a65ab01009"},{"version":"0ccdaa19852d25ecd84eec365c3bfa16e7859cadecf6e9ca6d0dbbbee439743f","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc2110f7decca6bfb9392e30421cfa1436479e4a6756e8fec6cbc22625d4f881","affectsGlobalScope":true,"impliedFormat":1},{"version":"f53a7652392cf26ebbe4e29fd0672aa87c93bd6d0241289c13fab87b9ac35c8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5e01375c9e124a83b52ee4b3244ed1a4d214a6cfb54ac73e164a823a4a7860a","affectsGlobalScope":true,"impliedFormat":1},{"version":"f90ae2bbce1505e67f2f6502392e318f5714bae82d2d969185c4a6cecc8af2fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b58e207b93a8f1c88bbf2a95ddc686ac83962b13830fe8ad3f404ffc7051fb4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1fefabcb2b06736a66d2904074d56268753654805e829989a46a0161cd8412c5","affectsGlobalScope":true,"impliedFormat":1},{"version":"b00a630557d1622ad312633bdbfbdb9c6b7220d948dca9f899db30679f160074","affectsGlobalScope":true,"impliedFormat":1},{"version":"c18a99f01eb788d849ad032b31cafd49de0b19e083fe775370834c5675d7df8e","affectsGlobalScope":true,"impliedFormat":1},{"version":"5247874c2a23b9a62d178ae84f2db6a1d54e6c9a2e7e057e178cc5eea13757fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"88809d6c1b9c78d04a133646a6feb926def05a8774c308c7c93bc32ee163d271","impliedFormat":1},{"version":"156a859e21ef3244d13afeeba4e49760a6afa035c149dda52f0c45ea8903b338","impliedFormat":1},{"version":"3ac40516c33b87f751f7507346933081a26cdb8a3e11a6b3aa07d23f803c85db","impliedFormat":1},{"version":"615754924717c0b1e293e083b83503c0a872717ad5aa60ed7f1a699eb1b4ea5c","impliedFormat":1},{"version":"14e9acf826baba0ef4b5665704084896e7bcc06f65a9ab13af7e93d27d6b7069","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"829bc57ee8f287b490ab5bbc5a962fca57e432c1e38ec680ecd3ecaf12800613","impliedFormat":1},{"version":"eec76bf6b9346f3f95fa402621b889489e96930e72295b0369022f332e9b4a6a","impliedFormat":1},{"version":"3a3ff14da53d5013f3e6d8c4ad55225e3649c08786c4421ce639c00d8d589b7d","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"38004e6801340cb890afb8cb5a9fc8972297e7f88ab94026e4b0b3c61fb32f8a","impliedFormat":1},{"version":"d243db6b25788f439e7e2f03c05688e92f46764351673bb0e7b2f3631232e186","impliedFormat":1},{"version":"4d327f7d72ad0918275cea3eee49a6a8dc8114ae1d5b7f3f5d0774de75f7439a","impliedFormat":1},{"version":"149f9a9e7f04e67afa0e2a49fc0ff421035c01d6b793cfcae7d2e9f6819431e2","impliedFormat":1},{"version":"e8a9dfa4c75ef6d25df8b40eaa9c31e0a69452aaf2ced4a3f4215dbdbaa876f4","impliedFormat":1},{"version":"a70af845a2eb9dd6e2723e319e14ea7fb28b129ec1361c21509b49305448c323","impliedFormat":1},{"version":"b53dc572d4f187904207ae1166652de47aab8eeb00c254d009cb226863076b56","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"f501234c5aeeeb5d7659412335227466aaacf30b952372d60afeb21c02c96348","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"9ac977503f15bf13ca7c82ad9a32a782f42d43e474824e8b3bffe228fd5f2639","impliedFormat":1},{"version":"8b91ff5bb912be3ea213cbcf0075aace1f5d4ff249a0d227ed673868cb7bfabc","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"8aee8b6d4f9f62cf3776cda1305fb18763e2aade7e13cea5bbe699112df85214","impliedFormat":1},{"version":"98498b101803bb3dde9f76a56e65c14b75db1cc8bec5f4db72be541570f74fc5","impliedFormat":1},{"version":"7cb4f431a4591b0e23002bed805dc871a874dfed6b9a3994dce68a6df73e6739","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"436d7b4543b340b0f3eef4310d524242e41369b9652aa9c70428767c4dcac455","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"12950411eeab8563b349cb7959543d92d8d02c289ed893d78499a19becb5a8cc","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"e99963ae1e3a48ca7a7958c02f3e88bb963eb7978c28b68ae6b8c9f03309d83c","impliedFormat":1},{"version":"c3f5289820990ab66b70c7fb5b63cb674001009ff84b13de40619619a9c8175f","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3275d55fac10b799c9546804126239baf020d220136163f763b55a74e50e750","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa68a0a3b7cb32c00e39ee3cd31f8f15b80cac97dce51b6ee7fc14a1e8deb30b","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c36e755bced82df7fb6ce8169265d0a7bb046ab4e2cb6d0da0cb72b22033e89","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"7a93de4ff8a63bafe62ba86b89af1df0ccb5e40bb85b0c67d6bbcfdcf96bf3d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"90e85f9bc549dfe2b5749b45fe734144e96cd5d04b38eae244028794e142a77e","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0a5deeb610b2a50a6350bd23df6490036a1773a8a71d70f2f9549ab009e67ee","affectsGlobalScope":true,"impliedFormat":1},{"version":"594ae90cacd813fa392ff80d2e0a8eff4e41f4a136329a940e321399dd8895b4","impliedFormat":1},{"version":"d1f333ade8ff35a409b4984e1f11956fe11c61855b0c7e9b59f0313e48b40c4a","impliedFormat":1},{"version":"0224aa4b3464895d69c413a640a19ac2166778a74eb5eb3b36b021c72d42b274","impliedFormat":1},{"version":"2e6fca0024dd8a076a886d9ec031a936ea59ad878a25b944820495d92f8381dd","affectsGlobalScope":true,"impliedFormat":1},{"version":"47d917e731d06acf182baa38ac2fbd720c3555fa9160e6a40d47994515f7f0ea","impliedFormat":1},{"version":"2fbf504c4791f9d32cd766cfe6b605bcda63289b925401953a7900db9af85348","impliedFormat":1},{"version":"ed0fb633cae35948d9e144004299a4bdf1ab912667c787b7fbffcd6d8c7b92a2","impliedFormat":1},{"version":"1678b04557dca52feab73cc67610918a7f5e25bfdba3e7fa081acd625d93106d","impliedFormat":1},{"version":"aa7b2f4e5f2fced2d34405e729ee7e09903d3330fb896a8b3d44c8fbd16be04d","impliedFormat":1},{"version":"2ea729503db9793f2691162fec3dd1118cab62e96d025f8eeb376d43ec293395","impliedFormat":1},{"version":"98fc7231d6c846a8ed19bdef026ddffe5e2182cc818be74899287421ad370a87","impliedFormat":1},{"version":"e494b286c8e27c52f8c7f945aa80ff223f2a3cd4f7a2619fa8991f1459e26f07","impliedFormat":1},{"version":"f54f5f9e10bbceba7515dfad0ffc89dffdb8d749d0604594c57a725cf6d79c20","impliedFormat":1},{"version":"41d17e1ad9a002feb11c8cdd2777e5bbc0cdb1e3f595d237e4dded0b6949983b","impliedFormat":1},{"version":"8c7e618c2a91ea7f6b5cca272a295864e92c16413be8fc56a943e8c7d5320011","affectsGlobalScope":true,"impliedFormat":1},{"version":"79a85c64bf083c5f4dd7074e804d1000c0c47301b84d48417a224decd681be30","impliedFormat":1},{"version":"6d81823c5704398a68b98e3c7a459334fc0403ad5e6953f4317b5b4919e289e4","impliedFormat":1},{"version":"4f1fd541f720030367b5d7ebfea7ae5f9edc8481422993b9a363f459c5412437","impliedFormat":1},{"version":"baa9cafc61ef8b42b6e8f7a1aa1f75841ec9c9d2f59229277ed282ccb99b72c9","impliedFormat":1},{"version":"af960bc194044cd1f0c8a9857461f0e5fd88a5e33326f38a738d6ef0e1b56fbf","impliedFormat":1},{"version":"2c2bdaa1d8ead9f68628d6d9d250e46ee8e81aa4898b4769a36956ae15e060fe","impliedFormat":1},{"version":"57a0d1b3d59063d4af2d3f8aac27cfe3c20a0f5d1faf0f8598ccf0b779637939","impliedFormat":1},{"version":"5ff4433a2deae4f85ab1377e90a7554ce6b47ae51c69a84ca30a6e22fae85834","impliedFormat":1},{"version":"82b91e4e42e6c41bc7fc1b6c2dc5eba6a2ba98375eb1f210e6ff6bba2d54177e","impliedFormat":1},{"version":"97234c5303866576f913d0ccae7d58d6322d9e803c7bf1228a3fda46ab8087b2","affectsGlobalScope":true,"impliedFormat":1},{"version":"93ecf87143cac7b9d05cffc1d6bdc075b7e4fdd48ff05f1fad85043f6ae678d3","impliedFormat":1},{"version":"4967529644e391115ca5592184d4b63980569adf60ee685f968fd59ab1557188","impliedFormat":1},{"version":"73eeb740dacc45adc607a4f59f90fa9dbe2717d93d82f115f45f34e18f8d644a","impliedFormat":1},{"version":"ec501101c2a96133a6c695f934c8f6642149cc728571b29cbb7b770984c1088e","impliedFormat":1},{"version":"b214ebcf76c51b115453f69729ee8aa7b7f8eccdae2a922b568a45c2d7ff52f7","impliedFormat":1},{"version":"429c9cdfa7d126255779efd7e6d9057ced2d69c81859bbab32073bad52e9ba76","impliedFormat":1},{"version":"b17f272f903d155b9ec21791b5889b638977bc1dee181efb2bc317ce006d8c9b","impliedFormat":1},{"version":"1c16d778cc142455f35a3f1a411227b9901c671756338af12a9175958500ce66","affectsGlobalScope":true,"impliedFormat":1},{"version":"230763250f20449fa7b3c9273e1967adb0023dc890d4be1553faca658ee65971","impliedFormat":1},{"version":"c3e9078b60cb329d1221f5878e88cecfa3e74460550e605a58fcfb41a66029ff","impliedFormat":1},{"version":"1940d3dcf5bc8fdaf65d4a6fe08b9c9d6e6481186baec210d6e5ed57ced8c26b","impliedFormat":1},{"version":"441b9bb09013654aa3d050e68b06464d8959b473e85868249d9d18f692acd35b","impliedFormat":1},{"version":"bc18a1991ba681f03e13285fa1d7b99b03b67ee671b7bc936254467177543890","impliedFormat":1},{"version":"55246f15e33ff1e2e9e679b25fa9790a48db55dc63d567fe25fac8b6a0efe911","impliedFormat":1},{"version":"fa94bbf532b7af8f394b95fa310980d6e20bd2d4c871c6a6cb9f70f03750a44b","impliedFormat":1},{"version":"9f979aaeb0e4ab8456942064596786aa2720c1984fea198ae0caa526f77547b1","impliedFormat":1},{"version":"5b26c4dd672d88336bb929787c9bfb55119e80ba89ec6dc923da1c063892843e","affectsGlobalScope":true,"impliedFormat":1},{"version":"7fa2214bb0d64701bc6f9ce8cde2fd2ff8c571e0b23065fa04a8a5a6beb91511","impliedFormat":1},{"version":"79e9c2d48d413b4d1f1c574d604e663231770e8883f53ba5773b32618aefd799","impliedFormat":1},{"version":"f12624a4a8d042b68914eac1b0a16571fc1c523173fcdf2517c65d191bd5a86c","impliedFormat":1},{"version":"b4769767f13a1692a66186e01c3aa186ff808d5ff72ed36eda8c37738fb2ac92","impliedFormat":1},{"version":"841983e39bd4cbb463be385e92fda11057cab368bf27100a801c492f1d86cbaa","impliedFormat":1},{"version":"9b82f9d3cd32399278813e2de0eed4b059d362fbac5222c815e2ab01879893d7","impliedFormat":1},{"version":"1ec3f3a5f04cc42df33274fbe5c0937d9a9e06f249a7a26288d7d54f0763ffd4","impliedFormat":1},{"version":"e4156ddb25aa0e3b5303d372f26957b36778f0f6bbd4326359269873295e3058","affectsGlobalScope":true,"impliedFormat":1},{"version":"cc1b433a84cae05ddc5672d4823170af78606ad21ecef60dbc4570190cbf1357","impliedFormat":1},{"version":"e47f532d6e1617833f13a5b0710c0089d402c89c2f2b54f324e5a20e418d287a","impliedFormat":1},{"version":"7f78cfb2b343838612c192cb251746e3a7c62ac7675726a47e130d9b213f6580","impliedFormat":1},{"version":"201db9cf1687fab1adf5282fcba861f382b32303dc4f67c89d59655e78a25461","impliedFormat":1},{"version":"8e2577e7262051fd3c5bd6ca2b2056d358ff8853565720f92455860824c25188","impliedFormat":1},{"version":"7ec8d7d483f7394f9da611b10d3a0e402f76ff5c991261e6ce43a15f81ca4258","impliedFormat":1},{"version":"bb9dbb4b2ad81e3e71ec5ba4314973718555b9d04ba2a17dfbf875efecb8e2c0","impliedFormat":1},{"version":"9021dc5be8f3a87af5cede29221188a6497e2092b6889e0be212ef6b6b7153e9","impliedFormat":1},{"version":"045a210189ec63c5488410b33f9fca53d77d051599d0d6506d8048551399c5f3","impliedFormat":1},{"version":"99ab6d0d660ce4d21efb52288a39fd35bb3f556980ec5463b1ae8f304a3bbc85","impliedFormat":1},{"version":"632c45ccb4cdc2c3a80c7a36a63dd7763016e59cac5e07bfb3e37e3548957028","impliedFormat":1},{"version":"c9a2daf6cd1eb854cd5b9e424247c5e306692055738c2effd35f7871d942b76e","impliedFormat":1},{"version":"afa1c49f8e559e413d57343339db857d2a8159435cf9cf7d4deb41718fff1b88","impliedFormat":1},{"version":"e50a7130339a951e6da9e968ed5521b0997a5b0479e148914087213839b5474c","impliedFormat":1},{"version":"cdcc132f207d097d7d3aa75615ab9a2e71d6a478162dde8b67f88ea19f3e54de","impliedFormat":1},{"version":"0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","impliedFormat":1},{"version":"e1028394c1cf96d5d057ecc647e31e457b919092f882ed0c7092152b077fed9d","impliedFormat":1},{"version":"f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","impliedFormat":1},{"version":"5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","impliedFormat":1},{"version":"3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","impliedFormat":1},{"version":"ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","impliedFormat":1},{"version":"d96cc6598148bf1a98fb2e8dcf01c63a4b3558bdaec6ef35e087fd0562eb40ec","impliedFormat":1},{"version":"f8db4fea512ab759b2223b90ecbbe7dae919c02f8ce95ec03f7fb1cf757cfbeb","affectsGlobalScope":true,"impliedFormat":1}],"root":[[63,66]],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"declaration":true,"emitDecoratorMetadata":true,"esModuleInterop":true,"experimentalDecorators":true,"importHelpers":true,"inlineSources":true,"module":1,"noEmitOnError":true,"noImplicitAny":false,"outDir":"./dist-shared","rootDir":"./shared","skipLibCheck":true,"sourceMap":true,"strict":false,"target":9,"useDefineForClassFields":false},"referencedMap":[[194,1],[197,2],[196,1],[202,3],[130,4],[131,4],[132,5],[68,6],[133,7],[134,8],[135,9],[136,10],[137,11],[138,12],[139,13],[140,14],[141,15],[142,15],[143,16],[144,17],[145,1],[146,18],[147,19],[69,1],[67,1],[148,20],[149,21],[150,22],[193,23],[151,24],[152,25],[153,24],[154,26],[155,27],[157,28],[158,29],[159,29],[160,29],[161,30],[162,31],[163,32],[164,33],[165,34],[166,35],[167,35],[168,36],[169,1],[170,1],[171,37],[172,38],[173,39],[174,40],[175,41],[176,42],[177,43],[178,44],[179,45],[180,46],[181,47],[182,48],[183,49],[184,50],[185,51],[186,52],[187,53],[188,54],[189,55],[70,24],[71,1],[72,56],[73,57],[74,1],[75,58],[76,1],[121,59],[122,60],[123,61],[124,61],[125,62],[126,1],[127,7],[128,63],[129,60],[190,64],[191,65],[192,66],[156,1],[195,1],[201,67],[199,68],[200,69],[198,70],[62,1],[60,1],[61,1],[10,1],[11,1],[13,1],[12,1],[2,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],[21,1],[3,1],[22,1],[23,1],[4,1],[24,1],[28,1],[25,1],[26,1],[27,1],[29,1],[30,1],[31,1],[5,1],[32,1],[33,1],[34,1],[35,1],[6,1],[39,1],[36,1],[37,1],[38,1],[40,1],[7,1],[41,1],[46,1],[47,1],[42,1],[43,1],[44,1],[45,1],[8,1],[51,1],[48,1],[49,1],[50,1],[52,1],[9,1],[53,1],[54,1],[55,1],[57,1],[56,1],[1,1],[58,1],[59,1],[95,71],[109,72],[92,73],[110,74],[119,75],[83,76],[84,77],[82,78],[118,79],[113,80],[117,81],[86,82],[96,83],[106,84],[85,85],[116,86],[80,87],[81,80],[87,83],[88,1],[94,88],[91,83],[78,89],[120,90],[111,91],[99,92],[98,83],[100,93],[103,94],[97,95],[101,96],[114,79],[89,97],[90,98],[104,99],[79,74],[108,100],[107,83],[93,98],[102,101],[105,102],[112,1],[77,1],[115,103],[63,104],[64,104],[65,104],[66,104]],"version":"5.9.3"}
|