footprintjs 9.48.2 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +12 -10
- package/CLAUDE.md +21 -23
- package/README.md +1 -1
- package/dist/advanced.js +71 -128
- package/dist/esm/advanced.d.ts +24 -58
- package/dist/esm/advanced.js +13 -51
- package/dist/esm/index.d.ts +5 -8
- package/dist/esm/index.js +3 -3
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
- package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/esm/lib/capture/index.d.ts +0 -1
- package/dist/esm/lib/capture/index.js +1 -2
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
- package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
- package/dist/esm/lib/engine/index.d.ts +1 -1
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
- package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
- package/dist/esm/lib/engine/traversalContext.js +2 -2
- package/dist/esm/lib/engine/types.d.ts +2 -10
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
- package/dist/esm/lib/ids/reservedIds.js +2 -2
- package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +2 -4
- package/dist/esm/lib/memory/StageContext.js +2 -2
- package/dist/esm/lib/memory/borrowedMutation.js +2 -2
- package/dist/esm/lib/memory/index.d.ts +6 -21
- package/dist/esm/lib/memory/index.js +4 -22
- package/dist/esm/lib/memory/redaction.d.ts +1 -1
- package/dist/esm/lib/memory/redaction.js +2 -2
- package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
- package/dist/esm/lib/memory/runPolicy.js +1 -1
- package/dist/esm/lib/reactive/createTypedScope.js +2 -2
- package/dist/esm/lib/reactive/writeTraps.js +2 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
- package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/esm/lib/recorder/qualityTrace.js +2 -2
- package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
- package/dist/esm/lib/runner/resume.js +2 -2
- package/dist/esm/lib/runner/snapshot.js +3 -2
- package/dist/esm/lib/scope/ScopeFacade.js +2 -2
- package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
- package/dist/esm/recorders.d.ts +2 -3
- package/dist/esm/recorders.js +1 -1
- package/dist/esm/trace.d.ts +11 -57
- package/dist/esm/trace.js +10 -68
- package/dist/index.js +3 -3
- package/dist/lib/builder/FlowChartBuilder.js +5 -5
- package/dist/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/lib/capture/index.js +2 -4
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
- package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
- package/dist/lib/engine/traversalContext.js +4 -4
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/engine/walkSubflowSpec.js +3 -3
- package/dist/lib/ids/reservedIds.js +5 -5
- package/dist/lib/memory/DiagnosticCollector.js +3 -3
- package/dist/lib/memory/StageContext.js +3 -3
- package/dist/lib/memory/borrowedMutation.js +3 -3
- package/dist/lib/memory/index.js +7 -42
- package/dist/lib/memory/redaction.js +3 -3
- package/dist/lib/memory/runPolicy.js +1 -1
- package/dist/lib/reactive/createTypedScope.js +3 -3
- package/dist/lib/reactive/writeTraps.js +4 -4
- package/dist/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +3 -3
- package/dist/lib/recorder/qualityTrace.js +4 -4
- package/dist/lib/runner/DeferredObserverTier.js +3 -3
- package/dist/lib/runner/ExecutionRuntime.js +6 -9
- package/dist/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
- package/dist/lib/runner/resume.js +3 -3
- package/dist/lib/runner/snapshot.js +6 -5
- package/dist/lib/scope/ScopeFacade.js +3 -3
- package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
- package/dist/recorders.js +1 -1
- package/dist/trace.js +18 -120
- package/dist/types/advanced.d.ts +24 -58
- package/dist/types/index.d.ts +5 -8
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/types/lib/capture/index.d.ts +0 -1
- package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/types/lib/engine/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/types/lib/engine/narrative/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/types/lib/engine/traversalContext.d.ts +1 -1
- package/dist/types/lib/engine/types.d.ts +2 -10
- package/dist/types/lib/memory/StageContext.d.ts +2 -4
- package/dist/types/lib/memory/index.d.ts +6 -21
- package/dist/types/lib/memory/redaction.d.ts +1 -1
- package/dist/types/lib/memory/runPolicy.d.ts +3 -2
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/types/recorders.d.ts +2 -3
- package/dist/types/trace.d.ts +11 -57
- package/package.json +6 -15
- package/dist/esm/lib/capture/freeze.d.ts +0 -91
- package/dist/esm/lib/capture/freeze.js +0 -314
- package/dist/esm/lib/capture/ownData.d.ts +0 -7
- package/dist/esm/lib/capture/ownData.js +0 -15
- package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
- package/dist/esm/lib/capture/valueKinds.js +0 -142
- package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/esm/lib/ids/runtimeStageId.js +0 -194
- package/dist/esm/lib/memory/EventLog.d.ts +0 -105
- package/dist/esm/lib/memory/EventLog.js +0 -148
- package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/esm/lib/memory/RecordFrame.js +0 -296
- package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/esm/lib/memory/SharedMemory.js +0 -88
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
- package/dist/esm/lib/memory/admission.d.ts +0 -81
- package/dist/esm/lib/memory/admission.js +0 -153
- package/dist/esm/lib/memory/backtrack.d.ts +0 -286
- package/dist/esm/lib/memory/backtrack.js +0 -457
- package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/esm/lib/memory/commitLogUtils.js +0 -384
- package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/esm/lib/memory/deltaEncoding.js +0 -122
- package/dist/esm/lib/memory/equality.d.ts +0 -93
- package/dist/esm/lib/memory/equality.js +0 -262
- package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
- package/dist/esm/lib/memory/eventPosition.js +0 -2
- package/dist/esm/lib/memory/honesty.d.ts +0 -93
- package/dist/esm/lib/memory/honesty.js +0 -92
- package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
- package/dist/esm/lib/memory/keyPaths.js +0 -227
- package/dist/esm/lib/memory/logModel.d.ts +0 -76
- package/dist/esm/lib/memory/logModel.js +0 -364
- package/dist/esm/lib/memory/merge.d.ts +0 -26
- package/dist/esm/lib/memory/merge.js +0 -60
- package/dist/esm/lib/memory/pathOps.d.ts +0 -115
- package/dist/esm/lib/memory/pathOps.js +0 -290
- package/dist/esm/lib/memory/paths.d.ts +0 -52
- package/dist/esm/lib/memory/paths.js +0 -57
- package/dist/esm/lib/memory/placeholders.d.ts +0 -39
- package/dist/esm/lib/memory/placeholders.js +0 -40
- package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
- package/dist/esm/lib/memory/recordCommit.js +0 -61
- package/dist/esm/lib/memory/scrub.d.ts +0 -53
- package/dist/esm/lib/memory/scrub.js +0 -74
- package/dist/esm/lib/memory/types.d.ts +0 -209
- package/dist/esm/lib/memory/types.js +0 -10
- package/dist/esm/lib/memory/utils.d.ts +0 -73
- package/dist/esm/lib/memory/utils.js +0 -159
- package/dist/esm/lib/memory/verbs.d.ts +0 -333
- package/dist/esm/lib/memory/verbs.js +0 -427
- package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
- package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
- package/dist/esm/lib/scope/detectCircular.js +0 -14
- package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
- package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/esm/lib/slice/elementProvenance.js +0 -190
- package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
- package/dist/esm/lib/slice/index.d.ts +0 -25
- package/dist/esm/lib/slice/index.js +0 -25
- package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
- package/dist/esm/lib/slice/keyIndex.js +0 -293
- package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/esm/lib/slice/keyTimeline.js +0 -113
- package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/esm/lib/slice/keysReadSources.js +0 -95
- package/dist/esm/lib/slice/serialize.d.ts +0 -78
- package/dist/esm/lib/slice/serialize.js +0 -278
- package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/esm/lib/slice/sliceForKey.js +0 -88
- package/dist/esm/lib/slice/types.d.ts +0 -567
- package/dist/esm/lib/slice/types.js +0 -25
- package/dist/esm/lib/time-travel/axis.d.ts +0 -119
- package/dist/esm/lib/time-travel/axis.js +0 -179
- package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
- package/dist/esm/lib/time-travel/bundles.js +0 -136
- package/dist/esm/lib/time-travel/chain.d.ts +0 -93
- package/dist/esm/lib/time-travel/chain.js +0 -188
- package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/esm/lib/time-travel/commitStops.js +0 -202
- package/dist/esm/lib/time-travel/index.d.ts +0 -22
- package/dist/esm/lib/time-travel/index.js +0 -21
- package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/esm/lib/time-travel/stateAt.js +0 -153
- package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/esm/lib/time-travel/tagStops.js +0 -102
- package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/esm/lib/time-travel/timeTravel.js +0 -360
- package/dist/esm/lib/time-travel/types.d.ts +0 -470
- package/dist/esm/lib/time-travel/types.js +0 -23
- package/dist/esm/write.d.ts +0 -47
- package/dist/esm/write.js +0 -46
- package/dist/lib/capture/freeze.js +0 -320
- package/dist/lib/capture/ownData.js +0 -19
- package/dist/lib/capture/valueKinds.js +0 -146
- package/dist/lib/ids/runtimeStageId.js +0 -210
- package/dist/lib/memory/EventLog.js +0 -152
- package/dist/lib/memory/RecordFrame.js +0 -300
- package/dist/lib/memory/SharedMemory.js +0 -92
- package/dist/lib/memory/TransactionBuffer.js +0 -950
- package/dist/lib/memory/admission.js +0 -159
- package/dist/lib/memory/backtrack.js +0 -463
- package/dist/lib/memory/commitLogUtils.js +0 -399
- package/dist/lib/memory/deltaEncoding.js +0 -128
- package/dist/lib/memory/equality.js +0 -266
- package/dist/lib/memory/eventPosition.js +0 -3
- package/dist/lib/memory/honesty.js +0 -95
- package/dist/lib/memory/keyPaths.js +0 -243
- package/dist/lib/memory/logModel.js +0 -372
- package/dist/lib/memory/merge.js +0 -64
- package/dist/lib/memory/pathOps.js +0 -306
- package/dist/lib/memory/paths.js +0 -62
- package/dist/lib/memory/placeholders.js +0 -43
- package/dist/lib/memory/recordCommit.js +0 -65
- package/dist/lib/memory/scrub.js +0 -79
- package/dist/lib/memory/types.js +0 -11
- package/dist/lib/memory/utils.js +0 -178
- package/dist/lib/memory/verbs.js +0 -444
- package/dist/lib/recorder/CommitRangeIndex.js +0 -211
- package/dist/lib/scope/detectCircular.js +0 -21
- package/dist/lib/scope/recorders/summarizeValue.js +0 -10
- package/dist/lib/slice/elementProvenance.js +0 -195
- package/dist/lib/slice/forwardSliceForKey.js +0 -247
- package/dist/lib/slice/index.js +0 -42
- package/dist/lib/slice/keyIndex.js +0 -313
- package/dist/lib/slice/keyTimeline.js +0 -117
- package/dist/lib/slice/keysReadSources.js +0 -101
- package/dist/lib/slice/serialize.js +0 -286
- package/dist/lib/slice/sliceForKey.js +0 -93
- package/dist/lib/slice/types.js +0 -26
- package/dist/lib/time-travel/axis.js +0 -184
- package/dist/lib/time-travel/bundles.js +0 -144
- package/dist/lib/time-travel/chain.js +0 -193
- package/dist/lib/time-travel/commitStops.js +0 -206
- package/dist/lib/time-travel/index.js +0 -32
- package/dist/lib/time-travel/stateAt.js +0 -160
- package/dist/lib/time-travel/tagStops.js +0 -106
- package/dist/lib/time-travel/timeTravel.js +0 -364
- package/dist/lib/time-travel/types.js +0 -24
- package/dist/types/lib/capture/freeze.d.ts +0 -91
- package/dist/types/lib/capture/ownData.d.ts +0 -7
- package/dist/types/lib/capture/valueKinds.d.ts +0 -57
- package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/types/lib/memory/EventLog.d.ts +0 -105
- package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/types/lib/memory/admission.d.ts +0 -81
- package/dist/types/lib/memory/backtrack.d.ts +0 -286
- package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/types/lib/memory/equality.d.ts +0 -93
- package/dist/types/lib/memory/eventPosition.d.ts +0 -18
- package/dist/types/lib/memory/honesty.d.ts +0 -93
- package/dist/types/lib/memory/keyPaths.d.ts +0 -125
- package/dist/types/lib/memory/logModel.d.ts +0 -76
- package/dist/types/lib/memory/merge.d.ts +0 -26
- package/dist/types/lib/memory/pathOps.d.ts +0 -115
- package/dist/types/lib/memory/paths.d.ts +0 -52
- package/dist/types/lib/memory/placeholders.d.ts +0 -39
- package/dist/types/lib/memory/recordCommit.d.ts +0 -45
- package/dist/types/lib/memory/scrub.d.ts +0 -53
- package/dist/types/lib/memory/types.d.ts +0 -209
- package/dist/types/lib/memory/utils.d.ts +0 -73
- package/dist/types/lib/memory/verbs.d.ts +0 -333
- package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/types/lib/scope/detectCircular.d.ts +0 -13
- package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/types/lib/slice/index.d.ts +0 -25
- package/dist/types/lib/slice/keyIndex.d.ts +0 -137
- package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/types/lib/slice/serialize.d.ts +0 -78
- package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/types/lib/slice/types.d.ts +0 -567
- package/dist/types/lib/time-travel/axis.d.ts +0 -119
- package/dist/types/lib/time-travel/bundles.d.ts +0 -77
- package/dist/types/lib/time-travel/chain.d.ts +0 -93
- package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/types/lib/time-travel/index.d.ts +0 -22
- package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/types/lib/time-travel/types.d.ts +0 -470
- package/dist/types/write.d.ts +0 -47
- package/dist/write.js +0 -52
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* admission.ts — the admitted record's check (9.30.0): does a commit's bundle
|
|
4
|
-
* fold back to what its stage read? (docs/design/2026-10-admitted-record.md)
|
|
5
|
-
*
|
|
6
|
-
* THE LAW: a commit is admitted only if its bundle, replayed onto the state
|
|
7
|
-
* the stage began from, gives back the stage's read-your-writes view at every
|
|
8
|
-
* path the stage touched — and at every container and array slot its writes
|
|
9
|
-
* made on the way there, below the stage's address.
|
|
10
|
-
*
|
|
11
|
-
* Pure: handed the candidate rows, the stage's diff base, its working copy,
|
|
12
|
-
* its op trace and its address, {@link lossyFamilies} answers which families
|
|
13
|
-
* of touched paths do not fold back. `TransactionBuffer · admit` asks once per
|
|
14
|
-
* commit that staged a `merge` or a nested op, and lays the rows out again
|
|
15
|
-
* with those families written as what the stage read. The fold is the one
|
|
16
|
-
* verb law ({@link dryFold}, no clone); the compare is {@link deepEqual}.
|
|
17
|
-
*/
|
|
18
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.addressDepthOf = exports.touchedFamilies = exports.lossyFamilies = void 0;
|
|
20
|
-
const pathOps_js_1 = require("./pathOps.js");
|
|
21
|
-
const utils_js_1 = require("./utils.js");
|
|
22
|
-
/**
|
|
23
|
-
* The families of `ops` whose candidate rows do not fold back to what the
|
|
24
|
-
* stage read — `undefined` when every family does. Each family ROOT is
|
|
25
|
-
* compared ({@link foldsBack}): its value and the way down to it.
|
|
26
|
-
*/
|
|
27
|
-
function lossyFamilies(candidate, base, workingCopy, ops, address) {
|
|
28
|
-
const fold = (0, utils_js_1.dryFold)(base, candidate.updates, candidate.overwrite, candidate.trace);
|
|
29
|
-
const { rootOf, families } = touchedFamilies(ops);
|
|
30
|
-
let lossy;
|
|
31
|
-
for (const family of families.values()) {
|
|
32
|
-
if (!foldsBack(fold, workingCopy, family, address))
|
|
33
|
-
(lossy ??= new Map()).set(family.root, family);
|
|
34
|
-
}
|
|
35
|
-
return lossy === undefined ? undefined : { rootOf, families: lossy };
|
|
36
|
-
}
|
|
37
|
-
exports.lossyFamilies = lossyFamilies;
|
|
38
|
-
/**
|
|
39
|
-
* Does the fold give back what the stage read at a family root? The way down
|
|
40
|
-
* ({@link spineHeld}), then the value by {@link deepEqual} (a root covers every
|
|
41
|
-
* descendant; an own `undefined` is a deleted key) — against the read-back as
|
|
42
|
-
* a record can hold it. A record holds `structuredClone`s of what a stage
|
|
43
|
-
* wrote (state values must survive one), and a few values do not survive one
|
|
44
|
-
* whole: an `Error`'s own fields are dropped. When the fold equals the
|
|
45
|
-
* read-back's clone, no row could hold more, and the family is admitted as it
|
|
46
|
-
* is; the clone, taken only for a root the cheap compare refused, is kept for
|
|
47
|
-
* the re-encoding.
|
|
48
|
-
*/
|
|
49
|
-
function foldsBack(fold, workingCopy, family, address) {
|
|
50
|
-
const segments = family.rootSegments;
|
|
51
|
-
if (!spineHeld(fold, workingCopy, segments, address))
|
|
52
|
-
return false;
|
|
53
|
-
const folded = (0, pathOps_js_1.nativeGet)(fold, segments);
|
|
54
|
-
const read = (0, pathOps_js_1.nativeGet)(workingCopy, segments);
|
|
55
|
-
// Both sides are the same values as a record holds them: an opaque one (a Blob) is never the same object.
|
|
56
|
-
if ((0, utils_js_1.deepEqual)(folded, read, 'copies'))
|
|
57
|
-
return true;
|
|
58
|
-
family.held = { value: structuredClone(read) };
|
|
59
|
-
return (0, utils_js_1.deepEqual)(folded, family.held.value, 'copies');
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Every staged path grouped under its SHALLOWEST staged ancestor-or-self —
|
|
63
|
-
* over TOUCHED paths, not surviving ones: an op the net-change filter drops
|
|
64
|
-
* can still have changed what the stage reads (L-1). Members are listed by
|
|
65
|
-
* last touch; a family's slot is its last op.
|
|
66
|
-
*/
|
|
67
|
-
function touchedFamilies(ops) {
|
|
68
|
-
const touches = new Map();
|
|
69
|
-
for (let i = 0; i < ops.length; i++) {
|
|
70
|
-
touches.delete(ops[i].path); // re-insert: the Map's order is last-touch order
|
|
71
|
-
touches.set(ops[i].path, { last: i, readKeys: ops[i].readKeys });
|
|
72
|
-
}
|
|
73
|
-
const rootOf = new Map();
|
|
74
|
-
const families = new Map();
|
|
75
|
-
for (const [path, touch] of touches) {
|
|
76
|
-
const root = shallowestIn(path, touches);
|
|
77
|
-
rootOf.set(path, root);
|
|
78
|
-
let family = families.get(root);
|
|
79
|
-
if (family === undefined) {
|
|
80
|
-
family = { root, rootSegments: root.split(utils_js_1.DELIM), members: [], slot: touch.last };
|
|
81
|
-
families.set(root, family);
|
|
82
|
-
}
|
|
83
|
-
family.members.push({ path, readKeys: touch.readKeys });
|
|
84
|
-
if (touch.last > family.slot)
|
|
85
|
-
family.slot = touch.last;
|
|
86
|
-
}
|
|
87
|
-
return { rootOf, families };
|
|
88
|
-
}
|
|
89
|
-
exports.touchedFamilies = touchedFamilies;
|
|
90
|
-
/**
|
|
91
|
-
* How many leading segments of `path` are the stage's `address` — its length
|
|
92
|
-
* when `path` lies strictly below it, else 0.
|
|
93
|
-
*/
|
|
94
|
-
function addressDepthOf(path, address) {
|
|
95
|
-
const depth = address.length;
|
|
96
|
-
if (depth === 0 || path.length <= depth)
|
|
97
|
-
return 0;
|
|
98
|
-
for (let i = 0; i < depth; i++)
|
|
99
|
-
if (String(path[i]) !== address[i])
|
|
100
|
-
return 0;
|
|
101
|
-
return depth;
|
|
102
|
-
}
|
|
103
|
-
exports.addressDepthOf = addressDepthOf;
|
|
104
|
-
/**
|
|
105
|
-
* L-1: a nested op through an absent or primitive parent makes that parent a
|
|
106
|
-
* container in the working copy — and when the op itself changes nothing (a
|
|
107
|
-
* delete of a key that was never there) no row is left to make it in the
|
|
108
|
-
* fold, so the stage reads back a container the record never mentions. The
|
|
109
|
-
* same op on an ARRAY parent past its end grows it (`delete a.0` on `[]`
|
|
110
|
-
* reads back `[undefined]`). Every container the working copy holds on the
|
|
111
|
-
* way to `segments`, and every array slot each step lands in, must be one the
|
|
112
|
-
* fold holds too — below the stage's address, whose containers are where it
|
|
113
|
-
* writes, not a value it reads.
|
|
114
|
-
*/
|
|
115
|
-
function spineHeld(fold, workingCopy, segments, address) {
|
|
116
|
-
const from = addressDepthOf(segments, address);
|
|
117
|
-
let f = fold;
|
|
118
|
-
let w = workingCopy;
|
|
119
|
-
for (let i = 0; i < segments.length; i++) {
|
|
120
|
-
if (i >= from && !slotHeld(f, w, segments[i]))
|
|
121
|
-
return false;
|
|
122
|
-
if (i === segments.length - 1)
|
|
123
|
-
return true;
|
|
124
|
-
f = (0, pathOps_js_1.ownChild)(f, segments[i]);
|
|
125
|
-
w = (0, pathOps_js_1.ownChild)(w, segments[i]);
|
|
126
|
-
if (!(0, pathOps_js_1.isContainer)(w))
|
|
127
|
-
return true;
|
|
128
|
-
if (i >= from && (!(0, pathOps_js_1.isContainer)(f) || Array.isArray(f) !== Array.isArray(w)))
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
return true;
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Does the fold hold every array slot the working copy's container `w` holds
|
|
135
|
-
* at `key`? Only an array can be grown by a write that changes nothing else
|
|
136
|
-
* (an index past its end, set to `undefined`); an object's own `undefined`
|
|
137
|
-
* key is a deleted key to every reader, so objects always pass.
|
|
138
|
-
*/
|
|
139
|
-
function slotHeld(f, w, key) {
|
|
140
|
-
if (!Array.isArray(w))
|
|
141
|
-
return true;
|
|
142
|
-
const index = Number(key);
|
|
143
|
-
if (!Number.isInteger(index) || index < 0 || String(index) !== key || index >= w.length)
|
|
144
|
-
return true;
|
|
145
|
-
return Array.isArray(f) && index < f.length;
|
|
146
|
-
}
|
|
147
|
-
/** The shallowest of `path` and its ancestors that `touched` holds — its family's root. */
|
|
148
|
-
function shallowestIn(path, touched) {
|
|
149
|
-
if (path.indexOf(utils_js_1.DELIM) === -1)
|
|
150
|
-
return path;
|
|
151
|
-
const segments = path.split(utils_js_1.DELIM);
|
|
152
|
-
for (let i = 1; i < segments.length; i++) {
|
|
153
|
-
const ancestor = segments.slice(0, i).join(utils_js_1.DELIM);
|
|
154
|
-
if (touched.has(ancestor))
|
|
155
|
-
return ancestor;
|
|
156
|
-
}
|
|
157
|
-
return path;
|
|
158
|
-
}
|
|
159
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYWRtaXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7OztBQUVILDZDQUF3RTtBQUV4RSx5Q0FBdUQ7QUFrQ3ZEOzs7O0dBSUc7QUFDSCxTQUFnQixhQUFhLENBQzNCLFNBQWUsRUFDZixJQUFhLEVBQ2IsV0FBb0IsRUFDcEIsR0FBd0IsRUFDeEIsT0FBMEI7SUFFMUIsTUFBTSxJQUFJLEdBQUcsSUFBQSxrQkFBTyxFQUFDLElBQUksRUFBRSxTQUFTLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BGLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELElBQUksS0FBc0MsQ0FBQztJQUMzQyxLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDO1lBQUUsQ0FBQyxLQUFLLEtBQUssSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFDRCxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3ZFLENBQUM7QUFkRCxzQ0FjQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxJQUFhLEVBQUUsV0FBb0IsRUFBRSxNQUFjLEVBQUUsT0FBMEI7SUFDaEcsTUFBTSxRQUFR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QU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBSyxDQUFDLENBQUM7UUFDbEQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzdDLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGFkbWlzc2lvbi50cyDigJQgdGhlIGFkbWl0dGVkIHJlY29yZCdzIGNoZWNrICg5LjMwLjApOiBkb2VzIGEgY29tbWl0J3MgYnVuZGxlXG4gKiBmb2xkIGJhY2sgdG8gd2hhdCBpdHMgc3RhZ2UgcmVhZD8gKGRvY3MvZGVzaWduLzIwMjYtMTAtYWRtaXR0ZWQtcmVjb3JkLm1kKVxuICpcbiAqIFRIRSBMQVc6IGEgY29tbWl0IGlzIGFkbWl0dGVkIG9ubHkgaWYgaXRzIGJ1bmRsZSwgcmVwbGF5ZWQgb250byB0aGUgc3RhdGVcbiAqIHRoZSBzdGFnZSBiZWdhbiBmcm9tLCBnaXZlcyBiYWNrIHRoZSBzdGFnZSdzIHJlYWQteW91ci13cml0ZXMgdmlldyBhdCBldmVyeVxuICogcGF0aCB0aGUgc3RhZ2UgdG91Y2hlZCDigJQgYW5kIGF0IGV2ZXJ5IGNvbnRhaW5lciBhbmQgYXJyYXkgc2xvdCBpdHMgd3JpdGVzXG4gKiBtYWRlIG9uIHRoZSB3YXkgdGhlcmUsIGJlbG93IHRoZSBzdGFnZSdzIGFkZHJlc3MuXG4gKlxuICogUHVyZTogaGFuZGVkIHRoZSBjYW5kaWRhdGUgcm93cywgdGhlIHN0YWdlJ3MgZGlmZiBiYXNlLCBpdHMgd29ya2luZyBjb3B5LFxuICogaXRzIG9wIHRyYWNlIGFuZCBpdHMgYWRkcmVzcywge0BsaW5rIGxvc3N5RmFtaWxpZXN9IGFuc3dlcnMgd2hpY2ggZmFtaWxpZXNcbiAqIG9mIHRvdWNoZWQgcGF0aHMgZG8gbm90IGZvbGQgYmFjay4gYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGFkbWl0YCBhc2tzIG9uY2UgcGVyXG4gKiBjb21taXQgdGhhdCBzdGFnZWQgYSBgbWVyZ2VgIG9yIGEgbmVzdGVkIG9wLCBhbmQgbGF5cyB0aGUgcm93cyBvdXQgYWdhaW5cbiAqIHdpdGggdGhvc2UgZmFtaWxpZXMgd3JpdHRlbiBhcyB3aGF0IHRoZSBzdGFnZSByZWFkLiBUaGUgZm9sZCBpcyB0aGUgb25lXG4gKiB2ZXJiIGxhdyAoe0BsaW5rIGRyeUZvbGR9LCBubyBjbG9uZSk7IHRoZSBjb21wYXJlIGlzIHtAbGluayBkZWVwRXF1YWx9LlxuICovXG5cbmltcG9ydCB7IGlzQ29udGFpbmVyLCBuYXRpdmVHZXQgYXMgX2dldCwgb3duQ2hpbGQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlQYXRjaCwgVHJhY2VFbnRyeSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBERUxJTSwgZHJ5Rm9sZCB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG4vKiogVGhlIHJvd3MgYSBwYXlsb2FkIGlzIGJ1aWx0IGZyb20sIGJlZm9yZSB0aGUgY29tbWl0IG5hbWVzIGl0cyByZWRhY3RlZCBwYXRocy4gKi9cbmV4cG9ydCB0eXBlIFJvd3MgPSB7IG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2g7IHVwZGF0ZXM6IE1lbW9yeVBhdGNoOyB0cmFjZTogVHJhY2VFbnRyeVtdIH07XG5cbi8qKiBPbmUgc3RhZ2VkIG9wLCBhcyBgVHJhbnNhY3Rpb25CdWZmZXJgIHJlY29yZHMgaXQuICovXG5leHBvcnQgdHlwZSBTdGFnZWRPcCA9IHsgcGF0aDogc3RyaW5nOyB2ZXJiOiBzdHJpbmc7IHJlYWRLZXlzPzogc3RyaW5nW10gfTtcblxuLyoqIEEgc3RhZ2VkIHBhdGggaW4gYSB7QGxpbmsgRmFtaWx5fSwgd2l0aCBpdHMgbGFzdCBvcCdzIHJlYWQgcHJlZml4LiAqL1xuZXhwb3J0IHR5cGUgTWVtYmVyID0geyBwYXRoOiBzdHJpbmc7IHJlYWRLZXlzPzogc3RyaW5nW10gfTtcblxuLyoqXG4gKiBBIGZhbWlseSBvZiBUT1VDSEVEIHBhdGhzOiBldmVyeSBzdGFnZWQgcGF0aCB1bmRlciBpdHMgc2hhbGxvd2VzdCBzdGFnZWRcbiAqIGFuY2VzdG9yLW9yLXNlbGYg4oCUIHRoZSB1bml0IHRoZSBjaGVjayB2ZXJpZmllcyBhbmQsIHdoZW4gaXQgZG9lcyBub3QgZm9sZFxuICogYmFjaywgdGhlIHVuaXQgcmUtZW5jb2RlZC4gVHdvIGZhbWlsaWVzIG5ldmVyIG92ZXJsYXAuXG4gKi9cbmV4cG9ydCB0eXBlIEZhbWlseSA9IHtcbiAgcm9vdDogc3RyaW5nO1xuICByb290U2VnbWVudHM6IHN0cmluZ1tdO1xuICAvKiogSXRzIHN0YWdlZCBwYXRocywgYnkgbGFzdCB0b3VjaC4gKi9cbiAgbWVtYmVyczogTWVtYmVyW107XG4gIC8qKiBJbmRleCBpbiB0aGUgb3AgdHJhY2Ugb2YgdGhlIGZhbWlseSdzIGxhc3Qgb3A6IHdoZXJlIGl0cyByZS1lbmNvZGVkIHJvd3MgZ28uICovXG4gIHNsb3Q6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSByb290J3MgcmVhZC1iYWNrIGFzIGEgcmVjb3JkIGNhbiBob2xkIGl0IOKAlCBpdHMgYHN0cnVjdHVyZWRDbG9uZWAsXG4gICAqIGJveGVkIOKAlCB3aGVuIHRoZSBjaGVjayB0b29rIG9uZSAoe0BsaW5rIGZvbGRzQmFja30pOyB0aGUgcmUtZW5jb2RpbmdcbiAgICogcmV1c2VzIGl0LlxuICAgKi9cbiAgaGVsZD86IHsgdmFsdWU6IHVua25vd24gfTtcbn07XG5cbi8qKiBUaGUgZmFtaWxpZXMgd2hvc2Ugcm93cyBkaWQgbm90IGZvbGQgYmFjaywgYW5kIHdoaWNoIGZhbWlseSBldmVyeSBzdGFnZWQgcGF0aCBpcyBpbi4gKi9cbmV4cG9ydCB0eXBlIExvc3N5ID0geyByb290T2Y6IE1hcDxzdHJpbmcsIHN0cmluZz47IGZhbWlsaWVzOiBNYXA8c3RyaW5nLCBGYW1pbHk+IH07XG5cbi8qKlxuICogVGhlIGZhbWlsaWVzIG9mIGBvcHNgIHdob3NlIGNhbmRpZGF0ZSByb3dzIGRvIG5vdCBmb2xkIGJhY2sgdG8gd2hhdCB0aGVcbiAqIHN0YWdlIHJlYWQg4oCUIGB1bmRlZmluZWRgIHdoZW4gZXZlcnkgZmFtaWx5IGRvZXMuIEVhY2ggZmFtaWx5IFJPT1QgaXNcbiAqIGNvbXBhcmVkICh7QGxpbmsgZm9sZHNCYWNrfSk6IGl0cyB2YWx1ZSBhbmQgdGhlIHdheSBkb3duIHRvIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9zc3lGYW1pbGllcyhcbiAgY2FuZGlkYXRlOiBSb3dzLFxuICBiYXNlOiB1bmtub3duLFxuICB3b3JraW5nQ29weTogdW5rbm93bixcbiAgb3BzOiByZWFkb25seSBTdGFnZWRPcFtdLFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IExvc3N5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZm9sZCA9IGRyeUZvbGQoYmFzZSwgY2FuZGlkYXRlLnVwZGF0ZXMsIGNhbmRpZGF0ZS5vdmVyd3JpdGUsIGNhbmRpZGF0ZS50cmFjZSk7XG4gIGNvbnN0IHsgcm9vdE9mLCBmYW1pbGllcyB9ID0gdG91Y2hlZEZhbWlsaWVzKG9wcyk7XG4gIGxldCBsb3NzeTogTWFwPHN0cmluZywgRmFtaWx5PiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBmYW1pbHkgb2YgZmFtaWxpZXMudmFsdWVzKCkpIHtcbiAgICBpZiAoIWZvbGRzQmFjayhmb2xkLCB3b3JraW5nQ29weSwgZmFtaWx5LCBhZGRyZXNzKSkgKGxvc3N5ID8/PSBuZXcgTWFwKCkpLnNldChmYW1pbHkucm9vdCwgZmFtaWx5KTtcbiAgfVxuICByZXR1cm4gbG9zc3kgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHsgcm9vdE9mLCBmYW1pbGllczogbG9zc3kgfTtcbn1cblxuLyoqXG4gKiBEb2VzIHRoZSBmb2xkIGdpdmUgYmFjayB3aGF0IHRoZSBzdGFnZSByZWFkIGF0IGEgZmFtaWx5IHJvb3Q/IFRoZSB3YXkgZG93blxuICogKHtAbGluayBzcGluZUhlbGR9KSwgdGhlbiB0aGUgdmFsdWUgYnkge0BsaW5rIGRlZXBFcXVhbH0gKGEgcm9vdCBjb3ZlcnMgZXZlcnlcbiAqIGRlc2NlbmRhbnQ7IGFuIG93biBgdW5kZWZpbmVkYCBpcyBhIGRlbGV0ZWQga2V5KSDigJQgYWdhaW5zdCB0aGUgcmVhZC1iYWNrIGFzXG4gKiBhIHJlY29yZCBjYW4gaG9sZCBpdC4gQSByZWNvcmQgaG9sZHMgYHN0cnVjdHVyZWRDbG9uZWBzIG9mIHdoYXQgYSBzdGFnZVxuICogd3JvdGUgKHN0YXRlIHZhbHVlcyBtdXN0IHN1cnZpdmUgb25lKSwgYW5kIGEgZmV3IHZhbHVlcyBkbyBub3Qgc3Vydml2ZSBvbmVcbiAqIHdob2xlOiBhbiBgRXJyb3JgJ3Mgb3duIGZpZWxkcyBhcmUgZHJvcHBlZC4gV2hlbiB0aGUgZm9sZCBlcXVhbHMgdGhlXG4gKiByZWFkLWJhY2sncyBjbG9uZSwgbm8gcm93IGNvdWxkIGhvbGQgbW9yZSwgYW5kIHRoZSBmYW1pbHkgaXMgYWRtaXR0ZWQgYXMgaXRcbiAqIGlzOyB0aGUgY2xvbmUsIHRha2VuIG9ubHkgZm9yIGEgcm9vdCB0aGUgY2hlYXAgY29tcGFyZSByZWZ1c2VkLCBpcyBrZXB0IGZvclxuICogdGhlIHJlLWVuY29kaW5nLlxuICovXG5mdW5jdGlvbiBmb2xkc0JhY2soZm9sZDogdW5rbm93biwgd29ya2luZ0NvcHk6IHVua25vd24sIGZhbWlseTogRmFtaWx5LCBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBzZWdtZW50cyA9IGZhbWlseS5yb290U2VnbWVudHM7XG4gIGlmICghc3BpbmVIZWxkKGZvbGQsIHdvcmtpbmdDb3B5LCBzZWdtZW50cywgYWRkcmVzcykpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZm9sZGVkID0gX2dldChmb2xkLCBzZWdtZW50cyk7XG4gIGNvbnN0IHJlYWQgPSBfZ2V0KHdvcmtpbmdDb3B5LCBzZWdtZW50cyk7XG4gIC8vIEJvdGggc2lkZXMgYXJlIHRoZSBzYW1lIHZhbHVlcyBhcyBhIHJlY29yZCBob2xkcyB0aGVtOiBhbiBvcGFxdWUgb25lIChhIEJsb2IpIGlzIG5ldmVyIHRoZSBzYW1lIG9iamVjdC5cbiAgaWYgKGRlZXBFcXVhbChmb2xkZWQsIHJlYWQsICdjb3BpZXMnKSkgcmV0dXJuIHRydWU7XG4gIGZhbWlseS5oZWxkID0geyB2YWx1ZTogc3RydWN0dXJlZENsb25lKHJlYWQpIH07XG4gIHJldHVybiBkZWVwRXF1YWwoZm9sZGVkLCBmYW1pbHkuaGVsZC52YWx1ZSwgJ2NvcGllcycpO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHN0YWdlZCBwYXRoIGdyb3VwZWQgdW5kZXIgaXRzIFNIQUxMT1dFU1Qgc3RhZ2VkIGFuY2VzdG9yLW9yLXNlbGYg4oCUXG4gKiBvdmVyIFRPVUNIRUQgcGF0aHMsIG5vdCBzdXJ2aXZpbmcgb25lczogYW4gb3AgdGhlIG5ldC1jaGFuZ2UgZmlsdGVyIGRyb3BzXG4gKiBjYW4gc3RpbGwgaGF2ZSBjaGFuZ2VkIHdoYXQgdGhlIHN0YWdlIHJlYWRzIChMLTEpLiBNZW1iZXJzIGFyZSBsaXN0ZWQgYnlcbiAqIGxhc3QgdG91Y2g7IGEgZmFtaWx5J3Mgc2xvdCBpcyBpdHMgbGFzdCBvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoZWRGYW1pbGllcyhvcHM6IHJlYWRvbmx5IFN0YWdlZE9wW10pOiB7XG4gIHJvb3RPZjogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgZmFtaWxpZXM6IE1hcDxzdHJpbmcsIEZhbWlseT47XG59IHtcbiAgY29uc3QgdG91Y2hlcyA9IG5ldyBNYXA8c3RyaW5nLCB7IGxhc3Q6IG51bWJlcjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9PigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykge1xuICAgIHRvdWNoZXMuZGVsZXRlKG9wc1tpXS5wYXRoKTsgLy8gcmUtaW5zZXJ0OiB0aGUgTWFwJ3Mgb3JkZXIgaXMgbGFzdC10b3VjaCBvcmRlclxuICAgIHRvdWNoZXMuc2V0KG9wc1tpXS5wYXRoLCB7IGxhc3Q6IGksIHJlYWRLZXlzOiBvcHNbaV0ucmVhZEtleXMgfSk7XG4gIH1cbiAgY29uc3Qgcm9vdE9mID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgY29uc3QgZmFtaWxpZXMgPSBuZXcgTWFwPHN0cmluZywgRmFtaWx5PigpO1xuICBmb3IgKGNvbnN0IFtwYXRoLCB0b3VjaF0gb2YgdG91Y2hlcykge1xuICAgIGNvbnN0IHJvb3QgPSBzaGFsbG93ZXN0SW4ocGF0aCwgdG91Y2hlcyk7XG4gICAgcm9vdE9mLnNldChwYXRoLCByb290KTtcbiAgICBsZXQgZmFtaWx5ID0gZmFtaWxpZXMuZ2V0KHJvb3QpO1xuICAgIGlmIChmYW1pbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmFtaWx5ID0geyByb290LCByb290U2VnbWVudHM6IHJvb3Quc3BsaXQoREVMSU0pLCBtZW1iZXJzOiBbXSwgc2xvdDogdG91Y2gubGFzdCB9O1xuICAgICAgZmFtaWxpZXMuc2V0KHJvb3QsIGZhbWlseSk7XG4gICAgfVxuICAgIGZhbWlseS5tZW1iZXJzLnB1c2goeyBwYXRoLCByZWFkS2V5czogdG91Y2gucmVhZEtleXMgfSk7XG4gICAgaWYgKHRvdWNoLmxhc3QgPiBmYW1pbHkuc2xvdCkgZmFtaWx5LnNsb3QgPSB0b3VjaC5sYXN0O1xuICB9XG4gIHJldHVybiB7IHJvb3RPZiwgZmFtaWxpZXMgfTtcbn1cblxuLyoqXG4gKiBIb3cgbWFueSBsZWFkaW5nIHNlZ21lbnRzIG9mIGBwYXRoYCBhcmUgdGhlIHN0YWdlJ3MgYGFkZHJlc3NgIOKAlCBpdHMgbGVuZ3RoXG4gKiB3aGVuIGBwYXRoYCBsaWVzIHN0cmljdGx5IGJlbG93IGl0LCBlbHNlIDAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRyZXNzRGVwdGhPZihwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdLCBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IG51bWJlciB7XG4gIGNvbnN0IGRlcHRoID0gYWRkcmVzcy5sZW5ndGg7XG4gIGlmIChkZXB0aCA9PT0gMCB8fCBwYXRoLmxlbmd0aCA8PSBkZXB0aCkgcmV0dXJuIDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgaWYgKFN0cmluZyhwYXRoW2ldKSAhPT0gYWRkcmVzc1tpXSkgcmV0dXJuIDA7XG4gIHJldHVybiBkZXB0aDtcbn1cblxuLyoqXG4gKiBMLTE6IGEgbmVzdGVkIG9wIHRocm91Z2ggYW4gYWJzZW50IG9yIHByaW1pdGl2ZSBwYXJlbnQgbWFrZXMgdGhhdCBwYXJlbnQgYVxuICogY29udGFpbmVyIGluIHRoZSB3b3JraW5nIGNvcHkg4oCUIGFuZCB3aGVuIHRoZSBvcCBpdHNlbGYgY2hhbmdlcyBub3RoaW5nIChhXG4gKiBkZWxldGUgb2YgYSBrZXkgdGhhdCB3YXMgbmV2ZXIgdGhlcmUpIG5vIHJvdyBpcyBsZWZ0IHRvIG1ha2UgaXQgaW4gdGhlXG4gKiBmb2xkLCBzbyB0aGUgc3RhZ2UgcmVhZHMgYmFjayBhIGNvbnRhaW5lciB0aGUgcmVjb3JkIG5ldmVyIG1lbnRpb25zLiBUaGVcbiAqIHNhbWUgb3Agb24gYW4gQVJSQVkgcGFyZW50IHBhc3QgaXRzIGVuZCBncm93cyBpdCAoYGRlbGV0ZSBhLjBgIG9uIGBbXWBcbiAqIHJlYWRzIGJhY2sgYFt1bmRlZmluZWRdYCkuIEV2ZXJ5IGNvbnRhaW5lciB0aGUgd29ya2luZyBjb3B5IGhvbGRzIG9uIHRoZVxuICogd2F5IHRvIGBzZWdtZW50c2AsIGFuZCBldmVyeSBhcnJheSBzbG90IGVhY2ggc3RlcCBsYW5kcyBpbiwgbXVzdCBiZSBvbmUgdGhlXG4gKiBmb2xkIGhvbGRzIHRvbyDigJQgYmVsb3cgdGhlIHN0YWdlJ3MgYWRkcmVzcywgd2hvc2UgY29udGFpbmVycyBhcmUgd2hlcmUgaXRcbiAqIHdyaXRlcywgbm90IGEgdmFsdWUgaXQgcmVhZHMuXG4gKi9cbmZ1bmN0aW9uIHNwaW5lSGVsZChmb2xkOiB1bmtub3duLCB3b3JraW5nQ29weTogdW5rbm93biwgc2VnbWVudHM6IHN0cmluZ1tdLCBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBmcm9tID0gYWRkcmVzc0RlcHRoT2Yoc2VnbWVudHMsIGFkZHJlc3MpO1xuICBsZXQgZjogdW5rbm93biA9IGZvbGQ7XG4gIGxldCB3OiB1bmtub3duID0gd29ya2luZ0NvcHk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaSA+PSBmcm9tICYmICFzbG90SGVsZChmLCB3LCBzZWdtZW50c1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaSA9PT0gc2VnbWVudHMubGVuZ3RoIC0gMSkgcmV0dXJuIHRydWU7XG4gICAgZiA9IG93bkNoaWxkKGYsIHNlZ21lbnRzW2ldKTtcbiAgICB3ID0gb3duQ2hpbGQodywgc2VnbWVudHNbaV0pO1xuICAgIGlmICghaXNDb250YWluZXIodykpIHJldHVybiB0cnVlO1xuICAgIGlmIChpID49IGZyb20gJiYgKCFpc0NvbnRhaW5lcihmKSB8fCBBcnJheS5pc0FycmF5KGYpICE9PSBBcnJheS5pc0FycmF5KHcpKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIERvZXMgdGhlIGZvbGQgaG9sZCBldmVyeSBhcnJheSBzbG90IHRoZSB3b3JraW5nIGNvcHkncyBjb250YWluZXIgYHdgIGhvbGRzXG4gKiBhdCBga2V5YD8gT25seSBhbiBhcnJheSBjYW4gYmUgZ3Jvd24gYnkgYSB3cml0ZSB0aGF0IGNoYW5nZXMgbm90aGluZyBlbHNlXG4gKiAoYW4gaW5kZXggcGFzdCBpdHMgZW5kLCBzZXQgdG8gYHVuZGVmaW5lZGApOyBhbiBvYmplY3QncyBvd24gYHVuZGVmaW5lZGBcbiAqIGtleSBpcyBhIGRlbGV0ZWQga2V5IHRvIGV2ZXJ5IHJlYWRlciwgc28gb2JqZWN0cyBhbHdheXMgcGFzcy5cbiAqL1xuZnVuY3Rpb24gc2xvdEhlbGQoZjogdW5rbm93biwgdzogdW5rbm93biwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHcpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgaW5kZXggPSBOdW1iZXIoa2V5KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSB8fCBpbmRleCA8IDAgfHwgU3RyaW5nKGluZGV4KSAhPT0ga2V5IHx8IGluZGV4ID49IHcubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZikgJiYgaW5kZXggPCBmLmxlbmd0aDtcbn1cblxuLyoqIFRoZSBzaGFsbG93ZXN0IG9mIGBwYXRoYCBhbmQgaXRzIGFuY2VzdG9ycyB0aGF0IGB0b3VjaGVkYCBob2xkcyDigJQgaXRzIGZhbWlseSdzIHJvb3QuICovXG5mdW5jdGlvbiBzaGFsbG93ZXN0SW4ocGF0aDogc3RyaW5nLCB0b3VjaGVkOiBSZWFkb25seU1hcDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgaWYgKHBhdGguaW5kZXhPZihERUxJTSkgPT09IC0xKSByZXR1cm4gcGF0aDtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KERFTElNKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFuY2VzdG9yID0gc2VnbWVudHMuc2xpY2UoMCwgaSkuam9pbihERUxJTSk7XG4gICAgaWYgKHRvdWNoZWQuaGFzKGFuY2VzdG9yKSkgcmV0dXJuIGFuY2VzdG9yO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuIl19
|