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
package/dist/lib/memory/scrub.js
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* scrub.ts — the commit log's scrub: the placeholder at every redacted path of a patch (C4, L2).
|
|
4
|
-
*
|
|
5
|
-
* The RECORD's half of a redaction. A redacted path is DATA by the time it reaches here — the
|
|
6
|
-
* transaction buffer's `redactedPaths`, registered by `RecordFrame · write` from the scrub it was
|
|
7
|
-
* handed — and this file only writes `LOG_PLACEHOLDER` (`placeholders.ts`) where such a path holds
|
|
8
|
-
* a value. It never decides WHAT is secret: that is the engine's verdict (`redaction.ts`, L4 —
|
|
9
|
-
* `RedactionRule` and the write decision), which also owns the OTHER placeholder, the scope channel's
|
|
10
|
-
* `SCOPE_PLACEHOLDER`. Before C4 both halves lived in `redaction.ts`, so the record imported the
|
|
11
|
-
* engine's policy module to write a string.
|
|
12
|
-
*
|
|
13
|
-
* THE LAW:
|
|
14
|
-
* 1. A path is scrubbed only where it holds a DEFINED value — scrubbing never invents a field.
|
|
15
|
-
* 2. Paths are scrubbed in the set's order, against the tree as scrubbed so far: a path under one
|
|
16
|
-
* already scrubbed finds a string, not a container, and is left alone.
|
|
17
|
-
* 3. The input patch is never edited. `scrubPatch` copies only the spine of each scrubbed path
|
|
18
|
-
* (and nothing at all when nothing is scrubbed); `redactPatch` hands back a fresh deep copy.
|
|
19
|
-
*/
|
|
20
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
exports.redactPatch = exports.scrubPatch = void 0;
|
|
22
|
-
const pathOps_js_1 = require("./pathOps.js");
|
|
23
|
-
const paths_js_1 = require("./paths.js");
|
|
24
|
-
const placeholders_js_1 = require("./placeholders.js");
|
|
25
|
-
/**
|
|
26
|
-
* The commit log's scrub: `patch` with {@link LOG_PLACEHOLDER} at every path in `redactedPaths` that
|
|
27
|
-
* holds a defined value — the copy `recordCommit` records and feeds the redacted mirror.
|
|
28
|
-
*
|
|
29
|
-
* CLONE-FREE (9.33.0). The patch is the transaction buffer's commit-time payload, already the record's
|
|
30
|
-
* own copy (`TransactionBuffer · commit` clones each surviving path once; the buffer is dropped at
|
|
31
|
-
* commit), so the scrub copies only what it must not edit in place:
|
|
32
|
-
* - no path to scrub (no policy, no per-call mark — the common case) → `patch` ITSELF, no copy at all;
|
|
33
|
-
* - otherwise → a new root and a shallow copy of each container on a scrubbed path (`pathOps ·
|
|
34
|
-
* ownSpine`), every other subtree shared with `patch`. `patch` is never edited.
|
|
35
|
-
* The engine called the public {@link redactPatch} (a whole `structuredClone`) twice per commit before
|
|
36
|
-
* 9.33.0. The bytes are the same: a scrubbed path holds the placeholder, every other path the value the
|
|
37
|
-
* buffer cloned (pinned by the 9.18.1 / 9.19.1 redaction byte tests).
|
|
38
|
-
*
|
|
39
|
-
* Paths are scrubbed in the set's order, against the tree as scrubbed so far: a path under one already
|
|
40
|
-
* scrubbed finds a string, not a container, and is left alone (as before).
|
|
41
|
-
*
|
|
42
|
-
* INTERNAL — the result shares structure with `patch`. A caller outside the commit path wants
|
|
43
|
-
* {@link redactPatch}.
|
|
44
|
-
*
|
|
45
|
-
* @param redactedPaths DELIM-joined paths (`TransactionBuffer`'s `redactedPaths`; a bundle's
|
|
46
|
-
* `redactedPaths` array works too).
|
|
47
|
-
*/
|
|
48
|
-
function scrubPatch(patch, redactedPaths) {
|
|
49
|
-
let out;
|
|
50
|
-
let owned;
|
|
51
|
-
for (const flat of redactedPaths) {
|
|
52
|
-
const segs = flat.split(paths_js_1.DELIM);
|
|
53
|
-
const current = out ?? patch;
|
|
54
|
-
if (!(0, pathOps_js_1.nativeHas)(current, segs) || (0, pathOps_js_1.nativeGet)(current, segs) === undefined)
|
|
55
|
-
continue;
|
|
56
|
-
if (out === undefined) {
|
|
57
|
-
owned = new WeakSet();
|
|
58
|
-
out = (0, pathOps_js_1.ownedRootOf)(patch, owned);
|
|
59
|
-
}
|
|
60
|
-
(0, pathOps_js_1.ownSpine)(out, segs, owned);
|
|
61
|
-
(0, pathOps_js_1.nativeSet)(out, segs, placeholders_js_1.LOG_PLACEHOLDER);
|
|
62
|
-
}
|
|
63
|
-
return out ?? patch;
|
|
64
|
-
}
|
|
65
|
-
exports.scrubPatch = scrubPatch;
|
|
66
|
-
/**
|
|
67
|
-
* Redacts sensitive values in a patch for logging/debugging — the PUBLIC scrub (`footprintjs/advanced`),
|
|
68
|
-
* its contract unchanged since 4.x: a fresh deep copy of `patch` (`structuredClone`) with
|
|
69
|
-
* {@link LOG_PLACEHOLDER} at every listed path that holds a defined value. Shares nothing with `patch`
|
|
70
|
-
* and never edits it. (It lived in `memory/utils.ts` until 9.33.0 and in `memory/redaction.ts` until
|
|
71
|
-
* C4; the engine's own commit path uses the clone-free {@link scrubPatch}.) No caller inside the
|
|
72
|
-
* library: it stays on `footprintjs/advanced` for the consumers that import it until 10.0.0 (the trace
|
|
73
|
-
* extraction, E6), which takes it off every door.
|
|
74
|
-
*/
|
|
75
|
-
function redactPatch(patch, redactedSet) {
|
|
76
|
-
return scrubPatch(structuredClone(patch), redactedSet);
|
|
77
|
-
}
|
|
78
|
-
exports.redactPatch = redactPatch;
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NydWIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9zY3J1Yi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHOzs7QUFFSCw2Q0FBc0Y7QUFDdEYseUNBQW1DO0FBQ25DLHVEQUFvRDtBQUdwRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxLQUFrQixFQUFFLGFBQStCO0lBQzVFLElBQUksR0FBNEIsQ0FBQztJQUNqQyxJQUFJLEtBQWtDLENBQUM7SUFDdkMsS0FBSyxNQUFNLElBQUksSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFLLENBQUMsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxJQUFBLHNCQUFTLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUEsc0JBQVMsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssU0FBUztZQUFFLFNBQVM7UUFDbEYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEIsS0FBSyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7WUFDOUIsR0FBRyxHQUFHLElBQUEsd0JBQVcsRUFBQyxLQUFLLEVBQUUsS0FBSyxDQUFnQixDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFBLHFCQUFRLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFNLENBQUMsQ0FBQztRQUM1QixJQUFBLHNCQUFTLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxpQ0FBZSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQztBQUN0QixDQUFDO0FBZkQsZ0NBZUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxLQUFrQixFQUFFLFdBQXdCO0lBQ3RFLE9BQU8sVUFBVSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRkQsa0NBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNjcnViLnRzIOKAlCB0aGUgY29tbWl0IGxvZydzIHNjcnViOiB0aGUgcGxhY2Vob2xkZXIgYXQgZXZlcnkgcmVkYWN0ZWQgcGF0aCBvZiBhIHBhdGNoIChDNCwgTDIpLlxuICpcbiAqIFRoZSBSRUNPUkQncyBoYWxmIG9mIGEgcmVkYWN0aW9uLiBBIHJlZGFjdGVkIHBhdGggaXMgREFUQSBieSB0aGUgdGltZSBpdCByZWFjaGVzIGhlcmUg4oCUIHRoZVxuICogdHJhbnNhY3Rpb24gYnVmZmVyJ3MgYHJlZGFjdGVkUGF0aHNgLCByZWdpc3RlcmVkIGJ5IGBSZWNvcmRGcmFtZSDCtyB3cml0ZWAgZnJvbSB0aGUgc2NydWIgaXQgd2FzXG4gKiBoYW5kZWQg4oCUIGFuZCB0aGlzIGZpbGUgb25seSB3cml0ZXMgYExPR19QTEFDRUhPTERFUmAgKGBwbGFjZWhvbGRlcnMudHNgKSB3aGVyZSBzdWNoIGEgcGF0aCBob2xkc1xuICogYSB2YWx1ZS4gSXQgbmV2ZXIgZGVjaWRlcyBXSEFUIGlzIHNlY3JldDogdGhhdCBpcyB0aGUgZW5naW5lJ3MgdmVyZGljdCAoYHJlZGFjdGlvbi50c2AsIEw0IOKAlFxuICogYFJlZGFjdGlvblJ1bGVgIGFuZCB0aGUgd3JpdGUgZGVjaXNpb24pLCB3aGljaCBhbHNvIG93bnMgdGhlIE9USEVSIHBsYWNlaG9sZGVyLCB0aGUgc2NvcGUgY2hhbm5lbCdzXG4gKiBgU0NPUEVfUExBQ0VIT0xERVJgLiBCZWZvcmUgQzQgYm90aCBoYWx2ZXMgbGl2ZWQgaW4gYHJlZGFjdGlvbi50c2AsIHNvIHRoZSByZWNvcmQgaW1wb3J0ZWQgdGhlXG4gKiBlbmdpbmUncyBwb2xpY3kgbW9kdWxlIHRvIHdyaXRlIGEgc3RyaW5nLlxuICpcbiAqIFRIRSBMQVc6XG4gKiAgIDEuIEEgcGF0aCBpcyBzY3J1YmJlZCBvbmx5IHdoZXJlIGl0IGhvbGRzIGEgREVGSU5FRCB2YWx1ZSDigJQgc2NydWJiaW5nIG5ldmVyIGludmVudHMgYSBmaWVsZC5cbiAqICAgMi4gUGF0aHMgYXJlIHNjcnViYmVkIGluIHRoZSBzZXQncyBvcmRlciwgYWdhaW5zdCB0aGUgdHJlZSBhcyBzY3J1YmJlZCBzbyBmYXI6IGEgcGF0aCB1bmRlciBvbmVcbiAqICAgICAgYWxyZWFkeSBzY3J1YmJlZCBmaW5kcyBhIHN0cmluZywgbm90IGEgY29udGFpbmVyLCBhbmQgaXMgbGVmdCBhbG9uZS5cbiAqICAgMy4gVGhlIGlucHV0IHBhdGNoIGlzIG5ldmVyIGVkaXRlZC4gYHNjcnViUGF0Y2hgIGNvcGllcyBvbmx5IHRoZSBzcGluZSBvZiBlYWNoIHNjcnViYmVkIHBhdGhcbiAqICAgICAgKGFuZCBub3RoaW5nIGF0IGFsbCB3aGVuIG5vdGhpbmcgaXMgc2NydWJiZWQpOyBgcmVkYWN0UGF0Y2hgIGhhbmRzIGJhY2sgYSBmcmVzaCBkZWVwIGNvcHkuXG4gKi9cblxuaW1wb3J0IHsgbmF0aXZlR2V0LCBuYXRpdmVIYXMsIG5hdGl2ZVNldCwgb3duZWRSb290T2YsIG93blNwaW5lIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgeyBMT0dfUExBQ0VIT0xERVIgfSBmcm9tICcuL3BsYWNlaG9sZGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogVGhlIGNvbW1pdCBsb2cncyBzY3J1YjogYHBhdGNoYCB3aXRoIHtAbGluayBMT0dfUExBQ0VIT0xERVJ9IGF0IGV2ZXJ5IHBhdGggaW4gYHJlZGFjdGVkUGF0aHNgIHRoYXRcbiAqIGhvbGRzIGEgZGVmaW5lZCB2YWx1ZSDigJQgdGhlIGNvcHkgYHJlY29yZENvbW1pdGAgcmVjb3JkcyBhbmQgZmVlZHMgdGhlIHJlZGFjdGVkIG1pcnJvci5cbiAqXG4gKiBDTE9ORS1GUkVFICg5LjMzLjApLiBUaGUgcGF0Y2ggaXMgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzIGNvbW1pdC10aW1lIHBheWxvYWQsIGFscmVhZHkgdGhlIHJlY29yZCdzXG4gKiBvd24gY29weSAoYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGNvbW1pdGAgY2xvbmVzIGVhY2ggc3Vydml2aW5nIHBhdGggb25jZTsgdGhlIGJ1ZmZlciBpcyBkcm9wcGVkIGF0XG4gKiBjb21taXQpLCBzbyB0aGUgc2NydWIgY29waWVzIG9ubHkgd2hhdCBpdCBtdXN0IG5vdCBlZGl0IGluIHBsYWNlOlxuICogICAtIG5vIHBhdGggdG8gc2NydWIgKG5vIHBvbGljeSwgbm8gcGVyLWNhbGwgbWFyayDigJQgdGhlIGNvbW1vbiBjYXNlKSDihpIgYHBhdGNoYCBJVFNFTEYsIG5vIGNvcHkgYXQgYWxsO1xuICogICAtIG90aGVyd2lzZSDihpIgYSBuZXcgcm9vdCBhbmQgYSBzaGFsbG93IGNvcHkgb2YgZWFjaCBjb250YWluZXIgb24gYSBzY3J1YmJlZCBwYXRoIChgcGF0aE9wcyDCt1xuICogICAgIG93blNwaW5lYCksIGV2ZXJ5IG90aGVyIHN1YnRyZWUgc2hhcmVkIHdpdGggYHBhdGNoYC4gYHBhdGNoYCBpcyBuZXZlciBlZGl0ZWQuXG4gKiBUaGUgZW5naW5lIGNhbGxlZCB0aGUgcHVibGljIHtAbGluayByZWRhY3RQYXRjaH0gKGEgd2hvbGUgYHN0cnVjdHVyZWRDbG9uZWApIHR3aWNlIHBlciBjb21taXQgYmVmb3JlXG4gKiA5LjMzLjAuIFRoZSBieXRlcyBhcmUgdGhlIHNhbWU6IGEgc2NydWJiZWQgcGF0aCBob2xkcyB0aGUgcGxhY2Vob2xkZXIsIGV2ZXJ5IG90aGVyIHBhdGggdGhlIHZhbHVlIHRoZVxuICogYnVmZmVyIGNsb25lZCAocGlubmVkIGJ5IHRoZSA5LjE4LjEgLyA5LjE5LjEgcmVkYWN0aW9uIGJ5dGUgdGVzdHMpLlxuICpcbiAqIFBhdGhzIGFyZSBzY3J1YmJlZCBpbiB0aGUgc2V0J3Mgb3JkZXIsIGFnYWluc3QgdGhlIHRyZWUgYXMgc2NydWJiZWQgc28gZmFyOiBhIHBhdGggdW5kZXIgb25lIGFscmVhZHlcbiAqIHNjcnViYmVkIGZpbmRzIGEgc3RyaW5nLCBub3QgYSBjb250YWluZXIsIGFuZCBpcyBsZWZ0IGFsb25lIChhcyBiZWZvcmUpLlxuICpcbiAqIElOVEVSTkFMIOKAlCB0aGUgcmVzdWx0IHNoYXJlcyBzdHJ1Y3R1cmUgd2l0aCBgcGF0Y2hgLiBBIGNhbGxlciBvdXRzaWRlIHRoZSBjb21taXQgcGF0aCB3YW50c1xuICoge0BsaW5rIHJlZGFjdFBhdGNofS5cbiAqXG4gKiBAcGFyYW0gcmVkYWN0ZWRQYXRocyBERUxJTS1qb2luZWQgcGF0aHMgKGBUcmFuc2FjdGlvbkJ1ZmZlcmAncyBgcmVkYWN0ZWRQYXRoc2A7IGEgYnVuZGxlJ3NcbiAqICAgYHJlZGFjdGVkUGF0aHNgIGFycmF5IHdvcmtzIHRvbykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY3J1YlBhdGNoKHBhdGNoOiBNZW1vcnlQYXRjaCwgcmVkYWN0ZWRQYXRoczogSXRlcmFibGU8c3RyaW5nPik6IE1lbW9yeVBhdGNoIHtcbiAgbGV0IG91dDogTWVtb3J5UGF0Y2ggfCB1bmRlZmluZWQ7XG4gIGxldCBvd25lZDogV2Vha1NldDxvYmplY3Q+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IGZsYXQgb2YgcmVkYWN0ZWRQYXRocykge1xuICAgIGNvbnN0IHNlZ3MgPSBmbGF0LnNwbGl0KERFTElNKTtcbiAgICBjb25zdCBjdXJyZW50ID0gb3V0ID8/IHBhdGNoO1xuICAgIGlmICghbmF0aXZlSGFzKGN1cnJlbnQsIHNlZ3MpIHx8IG5hdGl2ZUdldChjdXJyZW50LCBzZWdzKSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICBpZiAob3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICAgICAgb3V0ID0gb3duZWRSb290T2YocGF0Y2gsIG93bmVkKSBhcyBNZW1vcnlQYXRjaDtcbiAgICB9XG4gICAgb3duU3BpbmUob3V0LCBzZWdzLCBvd25lZCEpO1xuICAgIG5hdGl2ZVNldChvdXQsIHNlZ3MsIExPR19QTEFDRUhPTERFUik7XG4gIH1cbiAgcmV0dXJuIG91dCA/PyBwYXRjaDtcbn1cblxuLyoqXG4gKiBSZWRhY3RzIHNlbnNpdGl2ZSB2YWx1ZXMgaW4gYSBwYXRjaCBmb3IgbG9nZ2luZy9kZWJ1Z2dpbmcg4oCUIHRoZSBQVUJMSUMgc2NydWIgKGBmb290cHJpbnRqcy9hZHZhbmNlZGApLFxuICogaXRzIGNvbnRyYWN0IHVuY2hhbmdlZCBzaW5jZSA0Lng6IGEgZnJlc2ggZGVlcCBjb3B5IG9mIGBwYXRjaGAgKGBzdHJ1Y3R1cmVkQ2xvbmVgKSB3aXRoXG4gKiB7QGxpbmsgTE9HX1BMQUNFSE9MREVSfSBhdCBldmVyeSBsaXN0ZWQgcGF0aCB0aGF0IGhvbGRzIGEgZGVmaW5lZCB2YWx1ZS4gU2hhcmVzIG5vdGhpbmcgd2l0aCBgcGF0Y2hgXG4gKiBhbmQgbmV2ZXIgZWRpdHMgaXQuIChJdCBsaXZlZCBpbiBgbWVtb3J5L3V0aWxzLnRzYCB1bnRpbCA5LjMzLjAgYW5kIGluIGBtZW1vcnkvcmVkYWN0aW9uLnRzYCB1bnRpbFxuICogQzQ7IHRoZSBlbmdpbmUncyBvd24gY29tbWl0IHBhdGggdXNlcyB0aGUgY2xvbmUtZnJlZSB7QGxpbmsgc2NydWJQYXRjaH0uKSBObyBjYWxsZXIgaW5zaWRlIHRoZVxuICogbGlicmFyeTogaXQgc3RheXMgb24gYGZvb3RwcmludGpzL2FkdmFuY2VkYCBmb3IgdGhlIGNvbnN1bWVycyB0aGF0IGltcG9ydCBpdCB1bnRpbCAxMC4wLjAgKHRoZSB0cmFjZVxuICogZXh0cmFjdGlvbiwgRTYpLCB3aGljaCB0YWtlcyBpdCBvZmYgZXZlcnkgZG9vci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZGFjdFBhdGNoKHBhdGNoOiBNZW1vcnlQYXRjaCwgcmVkYWN0ZWRTZXQ6IFNldDxzdHJpbmc+KTogTWVtb3J5UGF0Y2gge1xuICByZXR1cm4gc2NydWJQYXRjaChzdHJ1Y3R1cmVkQ2xvbmUocGF0Y2gpLCByZWRhY3RlZFNldCk7XG59XG4iXX0=
|
package/dist/lib/memory/types.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* types.ts — the record's types: a bundle, its rows, its patches, its encoding, and the
|
|
4
|
-
* execution tree as the record's readers read it.
|
|
5
|
-
*
|
|
6
|
-
* Imports nothing. The record names nothing outside itself (C6, `RECORD_FILES` in
|
|
7
|
-
* scripts/layering.config.cjs): the engine's frame types — the stage snapshot, the flow
|
|
8
|
-
* messages, the retention dials — live beside the frame, in `frameTypes.ts` (L4).
|
|
9
|
-
*/
|
|
10
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdHlwZXMudHMg4oCUIHRoZSByZWNvcmQncyB0eXBlczogYSBidW5kbGUsIGl0cyByb3dzLCBpdHMgcGF0Y2hlcywgaXRzIGVuY29kaW5nLCBhbmQgdGhlXG4gKiBleGVjdXRpb24gdHJlZSBhcyB0aGUgcmVjb3JkJ3MgcmVhZGVycyByZWFkIGl0LlxuICpcbiAqIEltcG9ydHMgbm90aGluZy4gVGhlIHJlY29yZCBuYW1lcyBub3RoaW5nIG91dHNpZGUgaXRzZWxmIChDNiwgYFJFQ09SRF9GSUxFU2AgaW5cbiAqIHNjcmlwdHMvbGF5ZXJpbmcuY29uZmlnLmNqcyk6IHRoZSBlbmdpbmUncyBmcmFtZSB0eXBlcyDigJQgdGhlIHN0YWdlIHNuYXBzaG90LCB0aGUgZmxvd1xuICogbWVzc2FnZXMsIHRoZSByZXRlbnRpb24gZGlhbHMg4oCUIGxpdmUgYmVzaWRlIHRoZSBmcmFtZSwgaW4gYGZyYW1lVHlwZXMudHNgIChMNCkuXG4gKi9cblxuLy8g4pSA4pSAIFBhdGNoICYgVHJhY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBBIGZsYXQga2V5LXZhbHVlIGJhZyByZXByZXNlbnRpbmcgYSBzdGF0ZSBwYXRjaCAob3ZlcndyaXRlIG9yIG1lcmdlKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVtb3J5UGF0Y2gge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKiBBIHNpbmdsZSBlbnRyeSBpbiB0aGUgY2hyb25vbG9naWNhbCBvcGVyYXRpb24gdHJhY2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNlRW50cnkge1xuICAvKiogQ2Fub25pY2FsIHBhdGggc3RyaW5nIChzZWdtZW50cyBqb2luZWQgYnkgREVMSU0pLiAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItd3JpdGUgcmVhZCBwcm92ZW5hbmNlICgjUDEpIOKAlCB0aGUga2V5cyB0aGlzIHN0YWdlIGhhZCBUUkFDS0VELVJFQUQgYXRcbiAgICogdGhlIG1vbWVudCB0aGlzIHBhdGggd2FzIChsYXN0KSB3cml0dGVuOiB0aGUgdGVtcG9yYWwtcHJlZml4IGF0dHJpYnV0aW9uXG4gICAqIHRoYXQgbGV0cyBzbGljZXMgbGluayBhIHNwZWNpZmljIHdyaXRlIHRvIG9ubHkgdGhlIHJlYWRzIHRoYXQgY291bGQgaGF2ZVxuICAgKiBmZWQgaXQgKGEgc3RhZ2UgcmVhZGluZyBgYSxiYCBhbmQgd3JpdGluZyBgeCx5YCBubyBsb25nZXIgaW1wbGllcyB44oaQYikuXG4gICAqIEFCU0VOVCB1bmxlc3MgdGhlIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBkaWFsIGlzIG9uIOKAlCBjaGFydHNcbiAgICogdGhhdCBuZXZlciBlbmFibGUgaXQga2VlcCBieXRlLWlkZW50aWNhbCBjb21taXQgbG9ncy4gUmVhZCBwcmVmaXhlcyBvbmx5XG4gICAqIGdyb3cgZHVyaW5nIGEgc3RhZ2UsIHNvIHVuZGVyIGRlbHRhIG1vZGUncyBvbmUtZW50cnktcGVyLXBhdGggZGVkdXAgdGhlXG4gICAqIExBU1Qgd3JpdGUncyBwcmVmaXggPT0gdGhlIHVuaW9uIGFjcm9zcyBhbGwgb2YgdGhhdCBwYXRoJ3Mgd3JpdGVzLlxuICAgKiBIb25lc3QgY2VpbGluZzogYSB3cml0ZSB3aXRoIE5PIHRyYWNrZWQgcmVhZHMgYmVmb3JlIGl0IHJlY29yZHMgYFtdYCDigJRcbiAgICogXCJkZXBlbmRlZCBvbiBubyB0cmFja2VkIHJlYWRzXCIgaXMgaW5mb3JtYXRpb24sIG5vdCBhYnNlbmNlLlxuICAgKi9cbiAgcmVhZEtleXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIC0gYCdzZXQnYCAgICDigJQgaGFyZCBvdmVyd3JpdGU7IGBvdmVyd3JpdGVbcGF0aF1gIGhvbGRzIHRoZSBmdWxsIGZpbmFsIHZhbHVlLlxuICAgKiAtIGAnbWVyZ2UnYCAg4oCUIGRlZXAgdW5pb24gbWVyZ2U7IGB1cGRhdGVzW3BhdGhdYCBob2xkcyB0aGUgYWNjdW11bGF0ZWQgZGVsdGEuXG4gICAqIC0gYCdhcHBlbmQnYCDigJQgKCMxM2MtQiwgcHJvZHVjZWQgb25seSB1bmRlciB7QGxpbmsgQ29tbWl0VmFsdWVzTW9kZX1cbiAgICogICBgJ2RlbHRhJ2ApIHRoZSBwYXRoJ3MgZmluYWwgdmFsdWUgaXMgaXRzIGJhc2UgdmFsdWUgcGx1cyBhIHRhaWwgb2YgbmV3XG4gICAqICAgdHJhaWxpbmcgZWxlbWVudHM7IGBvdmVyd3JpdGVbcGF0aF1gIGhvbGRzIE9OTFkgdGhlIHRhaWwuIFJlcGxheVxuICAgKiAgIHJlY29uc3RydWN0cyBieSBjb25jYXRlbmF0aW9uLiBOT1QgaWRlbXBvdGVudCDigJQgZGVsdGEtbW9kZSBidW5kbGVzXG4gICAqICAgY2FycnkgZXhhY3RseSBvbmUgdHJhY2UgZW50cnkgcGVyIHN1cnZpdmluZyBwYXRoLlxuICAgKiAtIGAnZGVsZXRlJ2Ag4oCUICgjMTNjLUIsIHByb2R1Y2VkIG9ubHkgdW5kZXIgYCdkZWx0YSdgOyBhYnNvcmJzIGJhY2tsb2dcbiAgICogICBCOCkgdGhlIGtleSB3YXMgZXhwbGljaXRseSByZW1vdmVkIHZpYSBgZGVsZXRlVmFsdWUoKWAuIFJlcGxheSByZW1vdmVzXG4gICAqICAgdGhlIGtleS4gYG92ZXJ3cml0ZVtwYXRoXWAgc3RpbGwgRU5VTUVSQVRFUyB0aGUgcGF0aCAodmFsdWVcbiAgICogICBgdW5kZWZpbmVkYCkgc28ga2V5LXNldCBjb25zdW1lcnMga2VlcCBzZWVpbmcgdGhlIGNoYW5nZWQga2V5LlxuICAgKlxuICAgKiBgb3ZlcndyaXRlYCB2YWx1ZXMgYXJlIHRoZXJlZm9yZSBWRVJCLVFVQUxJRklFRDogY29uc3VtZXJzIHRoYXQgcmVhZFxuICAgKiBgYnVuZGxlLm92ZXJ3cml0ZVtrZXldYCBhcyBcInRoZSBmdWxsIHZhbHVlIHdyaXR0ZW5cIiBtdXN0IHVzZVxuICAgKiBgY29tbWl0VmFsdWVBdChjb21taXRMb2csIGlkeCwga2V5KWAgKGZyb20gYGZvb3RwcmludGpzL3RyYWNlYCkgd2hlbiB0aGVcbiAgICogbG9nIG1heSBjb250YWluIGRlbHRhLW1vZGUgYnVuZGxlcy5cbiAgICovXG4gIHZlcmI6ICdzZXQnIHwgJ21lcmdlJyB8ICdhcHBlbmQnIHwgJ2RlbGV0ZSc7XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMiDigJQgcmVhZCBwYXRocyB0aGF0IEJZUEFTUyByZWFkIHRyYWNraW5nOlxuICogLSBgJ2FyZ3MnYCAgIOKAlCB0aGUgc3RhZ2UgY2FsbGVkIGBnZXRBcmdzKClgIC8gYCRnZXRBcmdzKClgIHdpdGggbm9uLWVtcHR5XG4gKiAgIHJ1biBpbnB1dCAoZnJvemVuLCB1bnRyYWNrZWQgYnkgZGVzaWduKVxuICogLSBgJ2VudidgICAgIOKAlCB0aGUgc3RhZ2UgY2FsbGVkIGBnZXRFbnYoKWAgLyBgJGdldEVudigpYCB3aXRoIGEgbm9uLWVtcHR5XG4gKiAgIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCAoZnJvemVuLCB1bnRyYWNrZWQgYnkgZGVzaWduKVxuICogLSBgJ3NpbGVudCdgIOKAlCB0aGUgc3RhZ2UgcGVyZm9ybWVkIGEgc2lsZW50IHJlYWQgKGBnZXRWYWx1ZVNpbGVudGAgL1xuICogICBgZ2V0VmFsdWVEaXJlY3RgKSBvZiBhIGtleSBpdCBuZXZlciB0cmFja2VkLXJlYWQgaW4gdGhlIHNhbWUgc3RhZ2UuXG4gKiAgIFNpbGVudCByZWFkcyBTSEFET1dFRCBieSBhIHRyYWNrZWQgcmVhZCBvZiB0aGUgc2FtZSBrZXkgaW4gdGhlIHNhbWVcbiAqICAgc3RhZ2UgKFR5cGVkU2NvcGUgYXJyYXktcHJveHkgaW50ZXJuYWxzLCBgJGJhdGNoQXJyYXlgKSBhcmUgTk9UXG4gKiAgIGZsYWdnZWQg4oCUIHRoZWlyIHJlYWTihpJ3cml0ZSBlZGdlIGlzIGFscmVhZHkgY2FwdHVyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFVudHJhY2tlZFNvdXJjZSA9ICdhcmdzJyB8ICdlbnYnIHwgJ3NpbGVudCc7XG5cbi8qKiBUaGUgYXRvbWljIGJ1bmRsZSBwcm9kdWNlZCBieSBUcmFuc2FjdGlvbkJ1ZmZlci5jb21taXQoKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0QnVuZGxlIHtcbiAgLyoqIEF1dG8tYXNzaWduZWQgc3RlcCBpbmRleCAoc2V0IGJ5IEV2ZW50TG9nLnJlY29yZCkuICovXG4gIGlkeD86IG51bWJlcjtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUuICovXG4gIHN0YWdlOiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgc3RhZ2UgaWRlbnRpZmllciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIEZvcm1hdDogW3N1YmZsb3dQYXRoL11zdGFnZUlkI2V4ZWN1dGlvbkluZGV4ICovXG4gIHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBDaHJvbm9sb2dpY2FsIHdyaXRlIGxvZyBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuICovXG4gIHRyYWNlOiBUcmFjZUVudHJ5W107XG4gIC8qKiBQYXRocyB0aGF0IHNob3VsZCBiZSByZWRhY3RlZCBpbiBVSSAoc2Vuc2l0aXZlIGRhdGEpLiAqL1xuICByZWRhY3RlZFBhdGhzOiBzdHJpbmdbXTtcbiAgLyoqIEhhcmQgb3ZlcndyaXRlIHBhdGNoZXMuICovXG4gIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2g7XG4gIC8qKiBEZWVwIG1lcmdlIHBhdGNoZXMuICovXG4gIHVwZGF0ZXM6IE1lbW9yeVBhdGNoO1xuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlcnMg4oCUIHVudHJhY2tlZCByZWFkIHBhdGhzIHRoaXMgc3RhZ2UgY29uc3VtZWRcbiAgICogKHNlZSB7QGxpbmsgVW50cmFja2VkU291cmNlfSkuIEFCU0VOVCB3aGVuIHRoZSBzdGFnZSB1c2VkIG5vbmUsIHNvXG4gICAqIGNoYXJ0cyB0aGF0IG5ldmVyIHRvdWNoIHRob3NlIHBhdGhzIGtlZXAgYnl0ZS1pZGVudGljYWwgY29tbWl0IGxvZ3MuXG4gICAqIENhdXNhbC1zbGljZSBjb25zdW1lcnMgKGBjYXVzYWxDaGFpbmAvYGZvcm1hdENhdXNhbENoYWluYCkgc3VyZmFjZSB0aGlzXG4gICAqIGFzIFwic2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZVwiLiBSZXNpZHVhbCBsaW1pdGF0aW9uIChieSBkZXNpZ24pOlxuICAgKiB2YWx1ZXMgc211Z2dsZWQgdGhyb3VnaCBKUyBjbG9zdXJlcyBhcmUgdW5kZXRlY3RhYmxlLlxuICAgKi9cbiAgdW50cmFja2VkU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPjtcbiAgLyoqXG4gICAqIERlY2xhcmVkIHRhZ3MgKDkuMjEuMCkg4oCUIHRoZSBuYW1lcyB0aGUgYXV0aG9yIHB1dCBvbiB0aGlzIHN0YWdlIGF0IGJ1aWxkXG4gICAqIHRpbWUgKGBGbG93Q2hhcnRCdWlsZGVyLnRhZ2AgLyBgb3B0aW9ucy50YWdzYCksIHN0YW1wZWQgaGVyZSBieSB0aGVcbiAgICogdHJhdmVyc2VyIHNvIGEgc3RvcmVkIHJlY29yZGluZyBjYXJyaWVzIGl0cyBvd24gbWlsZXN0b25lcyB3aXRob3V0IGFcbiAgICogY29uc3VtZXIncyBpZCBjb252ZW50aW9ucy4gQUJTRU5UIHdoZW4gdGhlIHN0YWdlIGRlY2xhcmVzIG5vbmUsIHNvIGFuXG4gICAqIHVudGFnZ2VkIGNoYXJ0J3MgbG9nIGlzIGJ5dGUtaWRlbnRpY2FsIHRvIDkuMjAuMCAodGhlIGxhd1xuICAgKiBgdW50cmFja2VkU291cmNlc2Aga2VlcHMpLiBSZWNvcmRlZCBvbiB0aGUgRklSU1QgYnVuZGxlIG9mIGVhY2ggZXhlY3V0aW9uXG4gICAqIG9mIHRoZSBzdGFnZSDigJQgdGhlIHN0YWdlJ3Mgb3duIGJ1bmRsZSwgdGhlIG9uZSB3aXRob3V0IGEgYHBoYXNlYCDigJQgc29cbiAgICogcmV0cnkgYXR0ZW1wdHMgc3RhbXAgaXQgb25jZSwgYSBjb250aW51YXRpb24gKGEgZm9yayBjaGlsZCdzIGAncmVwZWF0J2AsXG4gICAqIGEgbW91bnQncyBgJ2V4aXQnYCBhZnRlciBpdHMgbWVyZ2UtYmFjaykgY2FycmllcyBub25lLCBhbmQgYSBtb3VudCB3aG9zZVxuICAgKiBleGl0IGlzIGl0cyBvbmx5IGJ1bmRsZSAobm8gYG91dHB1dE1hcHBlcmApIGNhcnJpZXMgdGhlbSBvbiB0aGF0IGJ1bmRsZS4gRnJlZSBzdHJpbmdzOiBmb290cHJpbnRqcyBhc3NpZ25zXG4gICAqIHRoZW0gbm8gbWVhbmluZzsgYHRhZ1N0b3BzYCAoZm9vdHByaW50anMvdHJhY2UpIGtlZXBzIGEgc3RvcCB3aGVuIGFueSBvZlxuICAgKiB0aGVtIG1hdGNoZXMuXG4gICAqL1xuICB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBXaGljaCBDT05USU5VQVRJT04gb2YgYSBzdGFnZSdzIGV4ZWN1dGlvbiB0aGlzIGJ1bmRsZSBpcyAoOS4zOS4wKSDigJRcbiAgICogc3RhbXBlZCBieSB0aGUgV1JJVEVSLiBUSEUgTEFXOiB0aGUgRklSU1QgYnVuZGxlIHBlciBgcnVudGltZVN0YWdlSWRgIGlzXG4gICAqIHRoZSBzdGFnZSdzIG93biBhbmQgY2FycmllcyBOTyBgcGhhc2VgOyBvbmx5IGEgYnVuZGxlIGFmdGVyIGl0IGNhbjpcbiAgICpcbiAgICogLSBgJ2V4aXQnYCDigJQgYSBzdWJmbG93IG1vdW50J3MgZXhpdCBjb21taXQgKGBTdWJmbG93RXhlY3V0b3JgKSBhZnRlciBpdHNcbiAgICogICBtZXJnZS1iYWNrIGJ1bmRsZSAoYG91dHB1dE1hcHBlcmApLiBBIG1vdW50IHdpdGhvdXQgYSBtZXJnZS1iYWNrIChhIGxhenlcbiAgICogICBtb3VudCwgZXZlcnkgYHBhcmFsbGVsRm9yRWFjaGAgYnJhbmNoLCBhbnkgbW91bnQgd2l0aCBubyBtYXBwZXIpIGhhc1xuICAgKiAgIGl0cyBleGl0IGFzIGl0cyBPTkxZIGJ1bmRsZSDigJQgaXRzIG93biwgc28gbm8gYHBoYXNlYDsgdGhlIGV4ZWN1dGlvblxuICAgKiAgIHRyZWUgbmFtZXMgaXQgYSBtb3VudC5cbiAgICogLSBgJ3JlcGVhdCdgIOKAlCB0aGUgZmFuLW91dCdzIHNldHRsZSBjb21taXQgb2YgYSBmb3JrIGNoaWxkJ3MgZnJhbWVcbiAgICogICAoYENoaWxkcmVuRXhlY3V0b3JgKSwgYWZ0ZXIgdGhlIGNoaWxkJ3Mgb3duIGJ1bmRsZS5cbiAgICpcbiAgICogQSByZWFkZXIgZ3JvdXBzIGEgc3RhZ2UncyBidW5kbGVzIGJ5IGBydW50aW1lU3RhZ2VJZGAgYW5kIHJlYWRzIHRoaXNcbiAgICogZmllbGQgdG8ga25vdyB3aGF0IGVhY2ggY29udGludWF0aW9uIGlzOyBpdCBuZXZlciBpbmZlcnMgaXQgZnJvbSB0aGVcbiAgICogbG9nJ3Mgc2hhcGUuIEEgbG9nIHdyaXR0ZW4gYmVmb3JlIDkuMzkuMCBjYXJyaWVzIG5vIGBwaGFzZWAgYW55d2hlcmUg4oCUXG4gICAqIHNlZSBgaW5mZXJMZWdhY3lQaGFzZXNgIChmb290cHJpbnRqcy90cmFjZSkgZm9yIGhvdyBpdCBpcyBzdGlsbCByZWFkLlxuICAgKi9cbiAgcGhhc2U/OiBDb21taXRQaGFzZTtcbn1cblxuLyoqIFRoZSBjb250aW51YXRpb24gYSBidW5kbGUgcmVjb3JkcyDigJQgc2VlIHtAbGluayBDb21taXRCdW5kbGUucGhhc2V9LiAqL1xuZXhwb3J0IHR5cGUgQ29tbWl0UGhhc2UgPSAnZXhpdCcgfCAncmVwZWF0JztcblxuLyoqXG4gKiBQZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIHBvbGljeSAoI1AxKSDigJQgdGhlIGZvdXJ0aCBkaWFsIG9mIHRoZVxuICogcmVhZFRyYWNraW5nL3dyaXRlVHJhY2tpbmcvY29tbWl0VmFsdWVzIGZhbWlseSwgc2FtZSA2LXNpdGUgcHJvcGFnYXRpb25cbiAqIHBhdHRlcm4gKGV4ZWN1dG9yIG9wdGlvbiDihpIgRXhlY3V0aW9uUnVudGltZS51c2UqIOKGkiByb290IFN0YWdlQ29udGV4dCDihpJcbiAqIGNyZWF0ZU5leHQvY3JlYXRlQ2hpbGQgaW5oZXJpdGFuY2Ug4oaSIFN1YmZsb3dFeGVjdXRvciBkdWNrLXB1c2gpLlxuICpcbiAqIC0gYCdvZmYnYCAoZGVmYXVsdCkg4oCUIHplcm8gY29zdCwgYnl0ZS1pZGVudGljYWwgY29tbWl0IGxvZ3MuXG4gKiAtIGAncmVhZHMtcHJlZml4J2Ag4oCUIGV2ZXJ5IGNvbW1pdHRlZCB7QGxpbmsgVHJhY2VFbnRyeX0gY2Fycmllc1xuICogICBgcmVhZEtleXNgOiB0aGUga2V5cyB0cmFja2VkLXJlYWQgQkVGT1JFIHRoYXQgd3JpdGUgKHRlbXBvcmFsLXByZWZpeFxuICogICBhdHRyaWJ1dGlvbikuIENvc3Q6IG9uZSBTZXQtdG8tYXJyYXkgY29weSBwZXIgd3JpdGUuIENvbnN1bWVkIGJ5XG4gKiAgIGBjYXVzYWxDaGFpbmAncyBgZWRnZUF0dHJpYnV0aW9uOiAncGVyLXdyaXRlJ2AgYW5kIHRoZSBzbGljZSBsYXllci5cbiAqL1xuZXhwb3J0IHR5cGUgV3JpdGVQcm92ZW5hbmNlTW9kZSA9ICdvZmYnIHwgJ3JlYWRzLXByZWZpeCc7XG5cbi8qKlxuICogUG9saWN5IGZvciBob3cgY29tbWl0LWJ1bmRsZSBWQUxVRVMgYXJlIGVuY29kZWQgaW50byB0aGUgY29tbWl0IGxvZ1xuICogKCMxM2MtQikg4oCUIGNvbXBsZXRlcyB0aGUgYHJlYWRUcmFja2luZ2AvYHdyaXRlVHJhY2tpbmdgIGRpYWwgZmFtaWx5LlxuICogVW5saWtlIHRob3NlIHR3byAod2hpY2ggZ2F0ZSBsb3NzeSBzbmFwc2hvdCBib29ra2VlcGluZyksIHRoaXMgZGlhbCBpc1xuICogKipsb3NzbGVzcyBpbiBib3RoIG1vZGVzKiog4oCUIGl0IGNoYW5nZXMgdGhlIGNvbW1pdCBsb2cncyAqZW5jb2RpbmcqLFxuICogbmV2ZXIgaXRzICppbmZvcm1hdGlvbio7IGFueSBzdGVwJ3MgZnVsbCBzdGF0ZSBzdGF5cyBleGFjdGx5XG4gKiByZWNvbnN0cnVjdGFibGUgYnkgcmVwbGF5LlxuICpcbiAqIC0gYCdmdWxsJ2AgKGRlZmF1bHQpIOKAlCBldmVyeSBzdXJ2aXZpbmcgYHNldGAgcGF0aCBzdG9yZXMgdGhlIGZ1bGwgZmluYWxcbiAqICAgdmFsdWUsIG9uZSB0cmFjZSBlbnRyeSBwZXIgb3BlcmF0aW9uLiBCeXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbFxuICogICBiZWhhdmlvci5cbiAqIC0gYCdkZWx0YSdgIOKAlCB0d28gY2hhbmdlcywgYm90aCByZXBsYXktY292ZXJlZCBieSBgYXBwbHlTbWFydE1lcmdlYDpcbiAqICAgMS4gKipgYXBwZW5kYCBkZXRlY3Rpb24qKjogd2hlbiBhIHBhdGgncyBuZXQgY2hhbmdlIGlzIFwidGhlIGJhc2UgYXJyYXlcbiAqICAgICAgcGx1cyBuZXcgdHJhaWxpbmcgZWxlbWVudHNcIiAoc3RyaWN0IHByZWZpeCksIHRoZSBidW5kbGUgcmVjb3JkcyBPTkxZXG4gKiAgICAgIHRoZSB0YWlsIHVuZGVyIGEgYHZlcmI6ICdhcHBlbmQnYCB0cmFjZSBlbnRyeSDigJQgdGhlIGdyb3dpbmctaGlzdG9yeVxuICogICAgICBjb21taXQgbG9nIGJlY29tZXMgbGluZWFyIGluIHRhaWwgc2l6ZSBpbnN0ZWFkIG9mIE8oTsKyKSByZXRhaW5lZC5cbiAqICAgICAgQSByZWFsIGB2ZXJiOiAnZGVsZXRlJ2AgZW50cnkgcmVwbGFjZXMgdGhlIGBzZXQ6IHVuZGVmaW5lZGAgZmxhdHRlbmluZ1xuICogICAgICBmb3IgYGRlbGV0ZVZhbHVlKClgIChjbG9zZXMgdGhlIGRvY3VtZW50ZWQgTWVtb3J5UGF0Y2ggbGltaXRhdGlvbikuXG4gKiAgIDIuICoqT25lIHRyYWNlIGVudHJ5IHBlciBzdXJ2aXZpbmcgcGF0aCoqIChhcHBlbmQgaXMgbm90IGlkZW1wb3RlbnQgb25cbiAqICAgICAgcmVwbGF5KTogdGhlIHZlcmIgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgcGF0aCdzIGJhc2XihpJmaW5hbCByZWxhdGlvbnNoaXBcbiAqICAgICAgYW5kIG9wIG1peDsgZW50cmllcyBhcmUgb3JkZXJlZCBieSBlYWNoIHBhdGgncyBMQVNUIHRvdWNoLlxuICpcbiAqIEhvbmVzdCBjb3N0IG5vdGU6IGFwcGVuZCBkZXRlY3Rpb24gaXMgTkVXIHdhbGwgd29yayDigJQgYW4gTyh8YmFzZXwpXG4gKiBzdHJ1Y3R1cmFsIHByZWZpeCBjb21wYXJlIHBlciBhcnJheS1zZXQgcGF0aCBwZXIgY29tbWl0ICh0b2RheSdzXG4gKiBgZGVlcEVxdWFsYCBmYXN0LWZhaWxzIG9uIGxlbmd0aCBpbiBPKDEpIGZvciBhIGdyb3duIGFycmF5KS4gT24gYSBoaXQgdGhlXG4gKiBjb21taXQgZ2V0cyBjaGVhcGVyIGluIGJvdGggd2FsbCBhbmQgaGVhcCAodGhlIE8ofGZpbmFsfCkgY2xvbmUgc2hyaW5rcyB0b1xuICogTyh8dGFpbHwpKTsgb24gYSBtaXNzIGl0IHBheXMgY29tcGFyZSArIGZ1bGwgY2xvbmUuIGAnZnVsbCdgIHBheXMgemVybyDigJRcbiAqIHRoZSBkZXRlY3Rpb24gYnJhbmNoIGlzIG1vZGUtZ2F0ZWQuXG4gKlxuICogU2V0IHZpYSBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IGNvbW1pdFZhbHVlcyB9KWAgb3JcbiAqIGBleGVjdXRvci5zZXRDb21taXRWYWx1ZXMobW9kZSlgIChiZWZvcmUgYHJ1bigpYCkuIFRoZSBhY3RpdmUgbW9kZSBpc1xuICogc3VyZmFjZWQgYXMgdGhlIHNuYXBzaG90IGRpc2NyaW1pbmFudCBgUnVudGltZVNuYXBzaG90LmNvbW1pdFZhbHVlc2AuXG4gKi9cbmV4cG9ydCB0eXBlIENvbW1pdFZhbHVlc01vZGUgPSAnZnVsbCcgfCAnZGVsdGEnO1xuXG4vLyDilIDilIAgVGhlIGV4ZWN1dGlvbiB0cmVlLCBhcyB0aGUgcmVjb3JkJ3MgcmVhZGVycyByZWFkIGl0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFRoZSBleGVjdXRpb24gdHJlZSBhcyB0aGUgcmVjb3JkJ3MgcmVhZGVycyByZWFkIGl0IChDNik6IHRoZSBmaWVsZHMgYSByZWFkZXIgdG91Y2hlcyBhbmRcbiAqIG5vdGhpbmcgZWxzZS4gYGNvbW1pdFN0b3BzYCAoYW5kIHNvIGB0YWdTdG9wc2AgYW5kIGV2ZXJ5IHN0cmF0ZWd5IGJ1aWx0IG9uIGl0KSByZWFkcyB0aGUgbW91bnRcbiAqIG1hcmtlciAoYHN1YmZsb3dJZGApIGFuZCB0aGUgcm9vdCdzIGBpZGA7IGBrZXlzUmVhZEZyb21FeGVjdXRpb25UcmVlYCByZWFkcyB0aGUga2V5cyBvZlxuICogYHN0YWdlUmVhZHNgOyBib3RoIGtleSBvbiBgcnVudGltZVN0YWdlSWRgIGFuZCB3YWxrIGBuZXh0YCBhbmQgYGNoaWxkcmVuYC5cbiAqXG4gKiBBIHN0cnVjdHVyYWwgdHlwZSB0aGUgcmVjb3JkIG93bnMsIHNvIHRoZSByZWFkZXJzIG5hbWUgbm90aGluZyBvZiB0aGUgZW5naW5lLiBUaGUgZW5naW5lJ3NcbiAqIGBTdGFnZVNuYXBzaG90YCAoYGdldFNuYXBzaG90KCkuZXhlY3V0aW9uVHJlZWApIGlzIG9uZSDigJQgYSBzdXBlcnR5cGUgb2YgaXQsIHNvIGV2ZXJ5IGNhbGxlclxuICogdGhhdCBoYW5kcyBhIHNuYXBzaG90J3MgdHJlZSBvdmVyIGNvbXBpbGVzIHVuY2hhbmdlZCDigJQgYW5kIHNvIGlzIGEgc3RvcmVkIHJlY29yZGluZydzIHBhcnNlZFxuICogSlNPTiB3aXRoIHRoZXNlIGZpZWxkcy4gRXZlcnkgZmllbGQgaXMgb3B0aW9uYWw6IGEgcmVhZGVyIHRoYXQgZmluZHMgb25lIGFic2VudCByZWFkcyBvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgdHlwZSBFeGVjdXRpb25UcmVlLCBrZXlzUmVhZEZyb21FeGVjdXRpb25UcmVlIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuICpcbiAqIGNvbnN0IHRyZWU6IEV4ZWN1dGlvblRyZWUgPSB7XG4gKiAgIHJ1bnRpbWVTdGFnZUlkOiAnc2VlZCMwJyxcbiAqICAgbmV4dDogeyBydW50aW1lU3RhZ2VJZDogJ2RlY2lkZSMxJywgc3RhZ2VSZWFkczogeyBjcmVkaXRUaWVyOiAnQScgfSB9LFxuICogfTtcbiAqIGtleXNSZWFkRnJvbUV4ZWN1dGlvblRyZWUodHJlZSkubG9va3VwKCdkZWNpZGUjMScpOyAvLyBbJ2NyZWRpdFRpZXInXVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uVHJlZSB7XG4gIC8qKiBUaGUgc3RhZ2UncyBpZCAocHJlZml4ZWQgaW5zaWRlIGEgc3ViZmxvdykuIGBjb21taXRTdG9wc2AgcmVhZHMgdGhlIHJvb3QncyB0byBwbGFjZSBhIHN1YmZsb3cncyBzZWVkLiAqL1xuICByZWFkb25seSBpZD86IHN0cmluZztcbiAgLyoqIGBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXhgIOKAlCB3aGF0IGEgcmVhZGVyIGtleXMgb24uIEEgbm9kZSB3aXRob3V0IG9uZSBpcyBub3QgYSBzdGFnZS4gKi9cbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ/OiBzdHJpbmc7XG4gIC8qKiBQcmVzZW50IG9uIGEgc3ViZmxvdyBtb3VudDogdGhlIHN0b3AgdGhlcmUgc2F5cyBga2luZDogJ21vdW50J2AuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqIFdoYXQgdGhlIHN0YWdlIHRyYWNrZWQtcmVhZCwgYnkga2V5LiBPbmx5IHRoZSBLRVlTIGFyZSByZWFkOiBhIGAnc3VtbWFyeSdgIG1hcmtlciBzZXJ2ZXMgYXMgd2VsbCBhcyBhIHZhbHVlLiAqL1xuICByZWFkb25seSBzdGFnZVJlYWRzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAvKiogVGhlIHN0YWdlIHRoYXQgcmFuIG5leHQuICovXG4gIHJlYWRvbmx5IG5leHQ/OiBFeGVjdXRpb25UcmVlO1xuICAvKiogVGhlIHN0YWdlcyB0aGF0IHJhbiBhcyB0aGlzIG9uZSdzIGNoaWxkcmVuIChhIGZvcmsncyBicmFuY2hlcywgYSBkZWNpZGVyJ3MgY2hvc2VuIGJyYW5jaCkuICovXG4gIHJlYWRvbmx5IGNoaWxkcmVuPzogcmVhZG9ubHkgRXhlY3V0aW9uVHJlZVtdO1xufVxuIl19
|
package/dist/lib/memory/utils.js
DELETED
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* utils.ts — nested-object helpers for the heap, and the memory leaves' one
|
|
4
|
-
* re-export surface.
|
|
5
|
-
*
|
|
6
|
-
* The helpers here (`setNestedValue`, `updateNestedValue`, `updateValue`,
|
|
7
|
-
* `getNestedValue`) walk a nested object by path with
|
|
8
|
-
* prototype-pollution protection. Everything else this file used to hold has an
|
|
9
|
-
* owner of its own and is re-exported, so no importer moved: the path codec
|
|
10
|
-
* (`paths.ts`), structural equality (`equality.ts`) and the union merge
|
|
11
|
-
* (`merge.ts`) at L0, and the verb law (`verbs.ts`) at L1 — `applySmartMerge`,
|
|
12
|
-
* `nextGeneration`, `applySmartMergeInto`, `dryFold`, `supersededByNextSet`.
|
|
13
|
-
* The log's scrub, `redactPatch`, moved out in 9.33.0; it is the record's own, `scrub.ts` (C4).
|
|
14
|
-
* The writers take an ADDRESS, a path prefix their caller computed, and never
|
|
15
|
-
* name one (C2: the engine decides where a stage writes, `runAddress.ts · runAddress`).
|
|
16
|
-
* Zero external dependencies.
|
|
17
|
-
*/
|
|
18
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.getNestedValue = exports.updateValue = exports.updateNestedValue = exports.setNestedValue = exports.isDeniedWritePath = exports.getRunAndGlobalPaths = exports.supersededByNextSet = exports.nextGeneration = exports.dryFold = exports.applySmartMergeInto = exports.applySmartMerge = exports.pathSegments = exports.normalisePath = exports.DELIM = exports.deepSmartMerge = exports.deepEqual = void 0;
|
|
20
|
-
const pathOps_js_1 = require("./pathOps.js");
|
|
21
|
-
var equality_js_1 = require("./equality.js");
|
|
22
|
-
Object.defineProperty(exports, "deepEqual", { enumerable: true, get: function () { return equality_js_1.deepEqual; } });
|
|
23
|
-
var merge_js_1 = require("./merge.js");
|
|
24
|
-
Object.defineProperty(exports, "deepSmartMerge", { enumerable: true, get: function () { return merge_js_1.deepSmartMerge; } });
|
|
25
|
-
var paths_js_1 = require("./paths.js");
|
|
26
|
-
Object.defineProperty(exports, "DELIM", { enumerable: true, get: function () { return paths_js_1.DELIM; } });
|
|
27
|
-
Object.defineProperty(exports, "normalisePath", { enumerable: true, get: function () { return paths_js_1.normalisePath; } });
|
|
28
|
-
Object.defineProperty(exports, "pathSegments", { enumerable: true, get: function () { return paths_js_1.pathSegments; } });
|
|
29
|
-
var verbs_js_1 = require("./verbs.js");
|
|
30
|
-
Object.defineProperty(exports, "applySmartMerge", { enumerable: true, get: function () { return verbs_js_1.applySmartMerge; } });
|
|
31
|
-
Object.defineProperty(exports, "applySmartMergeInto", { enumerable: true, get: function () { return verbs_js_1.applySmartMergeInto; } });
|
|
32
|
-
Object.defineProperty(exports, "dryFold", { enumerable: true, get: function () { return verbs_js_1.dryFold; } });
|
|
33
|
-
Object.defineProperty(exports, "nextGeneration", { enumerable: true, get: function () { return verbs_js_1.nextGeneration; } });
|
|
34
|
-
Object.defineProperty(exports, "supersededByNextSet", { enumerable: true, get: function () { return verbs_js_1.supersededByNextSet; } });
|
|
35
|
-
/**
|
|
36
|
-
* The two places a value at `path` can sit: under `address` (`runPath`, absent
|
|
37
|
-
* for the root address `[]`) and at the root (`globalPath`). `address` is a
|
|
38
|
-
* path prefix the caller computed — for the engine, a frame's run namespace
|
|
39
|
-
* (`runAddress.ts · runAddress`, C2), held by its record frame (`RecordFrame · address`, C3).
|
|
40
|
-
*/
|
|
41
|
-
function getRunAndGlobalPaths(address = [], path = []) {
|
|
42
|
-
return {
|
|
43
|
-
runPath: addressOf(address).length > 0 ? pathUnder(address, path) : undefined,
|
|
44
|
-
globalPath: [...path],
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
exports.getRunAndGlobalPaths = getRunAndGlobalPaths;
|
|
48
|
-
/** An address is an array. A run id still passed in its place (C2) is refused, never spread into its characters. */
|
|
49
|
-
function addressOf(address) {
|
|
50
|
-
if (Array.isArray(address))
|
|
51
|
-
return address;
|
|
52
|
-
throw new TypeError(`footprintjs: an address is an array path prefix, got ${address === null ? 'null' : typeof address}`);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* `address` then `path`, as one new array. An index loop, because the double
|
|
56
|
-
* spread `[...address, ...path]` costs twice as much and a frame builds one on
|
|
57
|
-
* every read it serves from live state (a fork child reading a root key).
|
|
58
|
-
*/
|
|
59
|
-
function pathUnder(address, path) {
|
|
60
|
-
const out = new Array(address.length + path.length);
|
|
61
|
-
for (let i = 0; i < address.length; i++)
|
|
62
|
-
out[i] = address[i];
|
|
63
|
-
for (let i = 0; i < path.length; i++)
|
|
64
|
-
out[address.length + i] = path[i];
|
|
65
|
-
return out;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Refuse the WHOLE selector before creating a container or copying a generation.
|
|
69
|
-
* The address's array contract is checked even when another selector is denied.
|
|
70
|
-
* Payload keys are data, not selectors, and are deliberately not inspected.
|
|
71
|
-
* @internal Shared by the nested writers and SharedMemory's pre-copy boundary.
|
|
72
|
-
*/
|
|
73
|
-
function isDeniedWritePath(address = [], path = [], field) {
|
|
74
|
-
const prefix = addressOf(address);
|
|
75
|
-
return prefix.some(pathOps_js_1.isDeniedSegment) || path.some(pathOps_js_1.isDeniedSegment) || (0, pathOps_js_1.isDeniedSegment)(field);
|
|
76
|
-
}
|
|
77
|
-
exports.isDeniedWritePath = isDeniedWritePath;
|
|
78
|
-
/** Keep existing own-property behavior; a missing slot must not call an inherited setter. */
|
|
79
|
-
function setOwnValue(object, key, value) {
|
|
80
|
-
if (Object.prototype.hasOwnProperty.call(object, key)) {
|
|
81
|
-
object[key] = value;
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
Object.defineProperty(object, key, { value, enumerable: true, writable: true, configurable: true });
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* The container at `address` + `path` inside `obj`, each missing one created
|
|
89
|
-
* on the way: the one AT the address from `defaultValues` when given, every
|
|
90
|
-
* other one empty. The one walk both nested writers share.
|
|
91
|
-
*/
|
|
92
|
-
function containerAt(obj, address = [], path = [], defaultValues) {
|
|
93
|
-
const segments = pathUnder(addressOf(address), path);
|
|
94
|
-
let current = obj;
|
|
95
|
-
for (let i = 0; i < segments.length; i++) {
|
|
96
|
-
const key = segments[i];
|
|
97
|
-
if (!Object.prototype.hasOwnProperty.call(current, key)) {
|
|
98
|
-
setOwnValue(current, key, i === address.length - 1 && defaultValues ? defaultValues : {});
|
|
99
|
-
}
|
|
100
|
-
current = current[key];
|
|
101
|
-
}
|
|
102
|
-
return current;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Sets a value at a nested path under `address`, creating intermediate objects as needed.
|
|
106
|
-
* A denied address/path/field leaves `obj` unchanged, including its prototype.
|
|
107
|
-
*/
|
|
108
|
-
function setNestedValue(obj, address, path, field, value, defaultValues) {
|
|
109
|
-
if (isDeniedWritePath(address, path, field))
|
|
110
|
-
return obj;
|
|
111
|
-
setOwnValue(containerAt(obj, address, path, defaultValues), field, value);
|
|
112
|
-
return obj;
|
|
113
|
-
}
|
|
114
|
-
exports.setNestedValue = setNestedValue;
|
|
115
|
-
/**
|
|
116
|
-
* Updates a value in the object at a nested path under `address`.
|
|
117
|
-
* A denied address/path/field leaves `obj` unchanged, including its prototype.
|
|
118
|
-
* - Arrays: concatenate
|
|
119
|
-
* - Objects: shallow merge at each level
|
|
120
|
-
* - Primitives: replace
|
|
121
|
-
*/
|
|
122
|
-
function updateNestedValue(obj, address, path, field, value, defaultValues) {
|
|
123
|
-
if (isDeniedWritePath(address, path, field))
|
|
124
|
-
return obj;
|
|
125
|
-
updateValue(containerAt(obj, address, path, defaultValues), field, value);
|
|
126
|
-
return obj;
|
|
127
|
-
}
|
|
128
|
-
exports.updateNestedValue = updateNestedValue;
|
|
129
|
-
/**
|
|
130
|
-
* In-place value update with merge semantics.
|
|
131
|
-
* - Arrays (non-empty): concatenate onto existing
|
|
132
|
-
* - Arrays (empty): direct replace — writing `[]` clears the field
|
|
133
|
-
* - Objects (non-empty): shallow merge (spread)
|
|
134
|
-
* - Objects (empty): direct replace — writing `{}` clears the field
|
|
135
|
-
* - Primitives: direct assignment
|
|
136
|
-
*
|
|
137
|
-
* Note on empty arrays: both `value && Array.isArray(value)` and
|
|
138
|
-
* `Array.isArray(value)` evaluate the same for arrays — `[]` is truthy in
|
|
139
|
-
* JavaScript, so the `&&` guard was never the issue. The actual bug was the
|
|
140
|
-
* concat path: `[...cur, ...[]]` silently returned `cur` unchanged when `value`
|
|
141
|
-
* was `[]`, making `updateValue(obj, 'tags', [])` a no-op instead of a clear.
|
|
142
|
-
* The fix is the explicit `value.length === 0` early-return branch.
|
|
143
|
-
*/
|
|
144
|
-
function updateValue(object, key, value) {
|
|
145
|
-
if ((0, pathOps_js_1.isDeniedSegment)(key))
|
|
146
|
-
return;
|
|
147
|
-
if (Array.isArray(value)) {
|
|
148
|
-
if (value.length === 0) {
|
|
149
|
-
setOwnValue(object, key, value); // clear: [] replaces whatever was there
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
const cur = Object.prototype.hasOwnProperty.call(object, key) ? object[key] : undefined;
|
|
153
|
-
setOwnValue(object, key, cur === undefined ? value : [...cur, ...value]);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
else if (value && typeof value === 'object' && Object.keys(value).length) {
|
|
157
|
-
const cur = Object.prototype.hasOwnProperty.call(object, key) ? object[key] : undefined;
|
|
158
|
-
setOwnValue(object, key, cur === undefined ? value : { ...cur, ...value });
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
setOwnValue(object, key, value);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
exports.updateValue = updateValue;
|
|
165
|
-
/**
|
|
166
|
-
* Gets a value at a nested path with prototype-pollution protection.
|
|
167
|
-
*/
|
|
168
|
-
function getNestedValue(root, path, field) {
|
|
169
|
-
const node = path && path.length > 0 ? (0, pathOps_js_1.nativeGet)(root, path) : root;
|
|
170
|
-
if (field === undefined || node === undefined)
|
|
171
|
-
return node;
|
|
172
|
-
if (node !== null && typeof node === 'object' && Object.prototype.hasOwnProperty.call(node, field)) {
|
|
173
|
-
return node[field];
|
|
174
|
-
}
|
|
175
|
-
return undefined;
|
|
176
|
-
}
|
|
177
|
-
exports.getNestedValue = getNestedValue;
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFFSCw2Q0FBa0U7QUFJbEUsNkNBQTBDO0FBQWpDLHdHQUFBLFNBQVMsT0FBQTtBQUNsQix1Q0FBNEM7QUFBbkMsMEdBQUEsY0FBYyxPQUFBO0FBQ3ZCLHVDQUFnRTtBQUF2RCxpR0FBQSxLQUFLLE9BQUE7QUFBRSx5R0FBQSxhQUFhLE9BQUE7QUFBRSx3R0FBQSxZQUFZLE9BQUE7QUFDM0MsdUNBQWdIO0FBQXZHLDJHQUFBLGVBQWUsT0FBQTtBQUFFLCtHQUFBLG1CQUFtQixPQUFBO0FBQUUsbUdBQUEsT0FBTyxPQUFBO0FBQUUsMEdBQUEsY0FBYyxPQUFBO0FBQUUsK0dBQUEsbUJBQW1CLE9BQUE7QUFJM0Y7Ozs7O0dBS0c7QUFDSCxTQUFnQixvQkFBb0IsQ0FBQyxVQUE2QixFQUFFLEVBQUUsT0FBNEIsRUFBRTtJQUNsRyxPQUFPO1FBQ0wsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzdFLFVBQVUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ3RCLENBQUM7QUFDSixDQUFDO0FBTEQsb0RBS0M7QUFFRCxvSEFBb0g7QUFDcEgsU0FBUyxTQUFTLENBQUMsT0FBMEI7SUFDM0MsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQzNDLE1BQU0sSUFBSSxTQUFTLENBQ2pCLHdEQUF3RCxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxFQUFFLENBQ3JHLENBQUM7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QUksS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFQRCx3Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogdXRpbHMudHMg4oCUIG5lc3RlZC1vYmplY3QgaGVscGVycyBmb3IgdGhlIGhlYXAsIGFuZCB0aGUgbWVtb3J5IGxlYXZlcycgb25lXG4gKiByZS1leHBvcnQgc3VyZmFjZS5cbiAqXG4gKiBUaGUgaGVscGVycyBoZXJlIChgc2V0TmVzdGVkVmFsdWVgLCBgdXBkYXRlTmVzdGVkVmFsdWVgLCBgdXBkYXRlVmFsdWVgLFxuICogYGdldE5lc3RlZFZhbHVlYCkgd2FsayBhIG5lc3RlZCBvYmplY3QgYnkgcGF0aCB3aXRoXG4gKiBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uIEV2ZXJ5dGhpbmcgZWxzZSB0aGlzIGZpbGUgdXNlZCB0byBob2xkIGhhcyBhblxuICogb3duZXIgb2YgaXRzIG93biBhbmQgaXMgcmUtZXhwb3J0ZWQsIHNvIG5vIGltcG9ydGVyIG1vdmVkOiB0aGUgcGF0aCBjb2RlY1xuICogKGBwYXRocy50c2ApLCBzdHJ1Y3R1cmFsIGVxdWFsaXR5IChgZXF1YWxpdHkudHNgKSBhbmQgdGhlIHVuaW9uIG1lcmdlXG4gKiAoYG1lcmdlLnRzYCkgYXQgTDAsIGFuZCB0aGUgdmVyYiBsYXcgKGB2ZXJicy50c2ApIGF0IEwxIOKAlCBgYXBwbHlTbWFydE1lcmdlYCxcbiAqIGBuZXh0R2VuZXJhdGlvbmAsIGBhcHBseVNtYXJ0TWVyZ2VJbnRvYCwgYGRyeUZvbGRgLCBgc3VwZXJzZWRlZEJ5TmV4dFNldGAuXG4gKiBUaGUgbG9nJ3Mgc2NydWIsIGByZWRhY3RQYXRjaGAsIG1vdmVkIG91dCBpbiA5LjMzLjA7IGl0IGlzIHRoZSByZWNvcmQncyBvd24sIGBzY3J1Yi50c2AgKEM0KS5cbiAqIFRoZSB3cml0ZXJzIHRha2UgYW4gQUREUkVTUywgYSBwYXRoIHByZWZpeCB0aGVpciBjYWxsZXIgY29tcHV0ZWQsIGFuZCBuZXZlclxuICogbmFtZSBvbmUgKEMyOiB0aGUgZW5naW5lIGRlY2lkZXMgd2hlcmUgYSBzdGFnZSB3cml0ZXMsIGBydW5BZGRyZXNzLnRzIMK3IHJ1bkFkZHJlc3NgKS5cbiAqIFplcm8gZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IGlzRGVuaWVkU2VnbWVudCwgbmF0aXZlR2V0IGFzIF9nZXQgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgREVMSU0gfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5leHBvcnQgeyBkZWVwU21hcnRNZXJnZSB9IGZyb20gJy4vbWVyZ2UuanMnO1xuZXhwb3J0IHsgREVMSU0sIG5vcm1hbGlzZVBhdGgsIHBhdGhTZWdtZW50cyB9IGZyb20gJy4vcGF0aHMuanMnO1xuZXhwb3J0IHsgYXBwbHlTbWFydE1lcmdlLCBhcHBseVNtYXJ0TWVyZ2VJbnRvLCBkcnlGb2xkLCBuZXh0R2VuZXJhdGlvbiwgc3VwZXJzZWRlZEJ5TmV4dFNldCB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG50eXBlIE5lc3RlZE9iamVjdCA9IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbi8qKlxuICogVGhlIHR3byBwbGFjZXMgYSB2YWx1ZSBhdCBgcGF0aGAgY2FuIHNpdDogdW5kZXIgYGFkZHJlc3NgIChgcnVuUGF0aGAsIGFic2VudFxuICogZm9yIHRoZSByb290IGFkZHJlc3MgYFtdYCkgYW5kIGF0IHRoZSByb290IChgZ2xvYmFsUGF0aGApLiBgYWRkcmVzc2AgaXMgYVxuICogcGF0aCBwcmVmaXggdGhlIGNhbGxlciBjb21wdXRlZCDigJQgZm9yIHRoZSBlbmdpbmUsIGEgZnJhbWUncyBydW4gbmFtZXNwYWNlXG4gKiAoYHJ1bkFkZHJlc3MudHMgwrcgcnVuQWRkcmVzc2AsIEMyKSwgaGVsZCBieSBpdHMgcmVjb3JkIGZyYW1lIChgUmVjb3JkRnJhbWUgwrcgYWRkcmVzc2AsIEMzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSkge1xuICByZXR1cm4ge1xuICAgIHJ1blBhdGg6IGFkZHJlc3NPZihhZGRyZXNzKS5sZW5ndGggPiAwID8gcGF0aFVuZGVyKGFkZHJlc3MsIHBhdGgpIDogdW5kZWZpbmVkLFxuICAgIGdsb2JhbFBhdGg6IFsuLi5wYXRoXSxcbiAgfTtcbn1cblxuLyoqIEFuIGFkZHJlc3MgaXMgYW4gYXJyYXkuIEEgcnVuIGlkIHN0aWxsIHBhc3NlZCBpbiBpdHMgcGxhY2UgKEMyKSBpcyByZWZ1c2VkLCBuZXZlciBzcHJlYWQgaW50byBpdHMgY2hhcmFjdGVycy4gKi9cbmZ1bmN0aW9uIGFkZHJlc3NPZihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYWRkcmVzcykpIHJldHVybiBhZGRyZXNzO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIGBmb290cHJpbnRqczogYW4gYWRkcmVzcyBpcyBhbiBhcnJheSBwYXRoIHByZWZpeCwgZ290ICR7YWRkcmVzcyA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBhZGRyZXNzfWAsXG4gICk7XG59XG5cbi8qKlxuICogYGFkZHJlc3NgIHRoZW4gYHBhdGhgLCBhcyBvbmUgbmV3IGFycmF5LiBBbiBpbmRleCBsb29wLCBiZWNhdXNlIHRoZSBkb3VibGVcbiAqIHNwcmVhZCBgWy4uLmFkZHJlc3MsIC4uLnBhdGhdYCBjb3N0cyB0d2ljZSBhcyBtdWNoIGFuZCBhIGZyYW1lIGJ1aWxkcyBvbmUgb25cbiAqIGV2ZXJ5IHJlYWQgaXQgc2VydmVzIGZyb20gbGl2ZSBzdGF0ZSAoYSBmb3JrIGNoaWxkIHJlYWRpbmcgYSByb290IGtleSkuXG4gKi9cbmZ1bmN0aW9uIHBhdGhVbmRlcihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICBjb25zdCBvdXQgPSBuZXcgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPihhZGRyZXNzLmxlbmd0aCArIHBhdGgubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRyZXNzLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBhZGRyZXNzW2ldO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIG91dFthZGRyZXNzLmxlbmd0aCArIGldID0gcGF0aFtpXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZWZ1c2UgdGhlIFdIT0xFIHNlbGVjdG9yIGJlZm9yZSBjcmVhdGluZyBhIGNvbnRhaW5lciBvciBjb3B5aW5nIGEgZ2VuZXJhdGlvbi5cbiAqIFRoZSBhZGRyZXNzJ3MgYXJyYXkgY29udHJhY3QgaXMgY2hlY2tlZCBldmVuIHdoZW4gYW5vdGhlciBzZWxlY3RvciBpcyBkZW5pZWQuXG4gKiBQYXlsb2FkIGtleXMgYXJlIGRhdGEsIG5vdCBzZWxlY3RvcnMsIGFuZCBhcmUgZGVsaWJlcmF0ZWx5IG5vdCBpbnNwZWN0ZWQuXG4gKiBAaW50ZXJuYWwgU2hhcmVkIGJ5IHRoZSBuZXN0ZWQgd3JpdGVycyBhbmQgU2hhcmVkTWVtb3J5J3MgcHJlLWNvcHkgYm91bmRhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlbmllZFdyaXRlUGF0aChcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSA9IFtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHByZWZpeCA9IGFkZHJlc3NPZihhZGRyZXNzKTtcbiAgcmV0dXJuIHByZWZpeC5zb21lKGlzRGVuaWVkU2VnbWVudCkgfHwgcGF0aC5zb21lKGlzRGVuaWVkU2VnbWVudCkgfHwgaXNEZW5pZWRTZWdtZW50KGZpZWxkKTtcbn1cblxuLyoqIEtlZXAgZXhpc3Rpbmcgb3duLXByb3BlcnR5IGJlaGF2aW9yOyBhIG1pc3Npbmcgc2xvdCBtdXN0IG5vdCBjYWxsIGFuIGluaGVyaXRlZCBzZXR0ZXIuICovXG5mdW5jdGlvbiBzZXRPd25WYWx1ZShvYmplY3Q6IE5lc3RlZE9iamVjdCwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgfSBlbHNlIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqZWN0LCBrZXksIHsgdmFsdWUsIGVudW1lcmFibGU6IHRydWUsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgY29udGFpbmVyIGF0IGBhZGRyZXNzYCArIGBwYXRoYCBpbnNpZGUgYG9iamAsIGVhY2ggbWlzc2luZyBvbmUgY3JlYXRlZFxuICogb24gdGhlIHdheTogdGhlIG9uZSBBVCB0aGUgYWRkcmVzcyBmcm9tIGBkZWZhdWx0VmFsdWVzYCB3aGVuIGdpdmVuLCBldmVyeVxuICogb3RoZXIgb25lIGVtcHR5LiBUaGUgb25lIHdhbGsgYm90aCBuZXN0ZWQgd3JpdGVycyBzaGFyZS5cbiAqL1xuZnVuY3Rpb24gY29udGFpbmVyQXQoXG4gIG9iajogTmVzdGVkT2JqZWN0LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10sXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoVW5kZXIoYWRkcmVzc09mKGFkZHJlc3MpLCBwYXRoKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBzZWdtZW50c1tpXTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpKSB7XG4gICAgICBzZXRPd25WYWx1ZShjdXJyZW50LCBrZXksIGkgPT09IGFkZHJlc3MubGVuZ3RoIC0gMSAmJiBkZWZhdWx0VmFsdWVzID8gZGVmYXVsdFZhbHVlcyA6IHt9KTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBTZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB1bmRlciBgYWRkcmVzc2AsIGNyZWF0aW5nIGludGVybWVkaWF0ZSBvYmplY3RzIGFzIG5lZWRlZC5cbiAqIEEgZGVuaWVkIGFkZHJlc3MvcGF0aC9maWVsZCBsZWF2ZXMgYG9iamAgdW5jaGFuZ2VkLCBpbmNsdWRpbmcgaXRzIHByb3RvdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHBhdGg6IHN0cmluZ1tdLFxuICBmaWVsZDogc3RyaW5nLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBpZiAoaXNEZW5pZWRXcml0ZVBhdGgoYWRkcmVzcywgcGF0aCwgZmllbGQpKSByZXR1cm4gb2JqO1xuICBzZXRPd25WYWx1ZShjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpLCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGF0IGEgbmVzdGVkIHBhdGggdW5kZXIgYGFkZHJlc3NgLlxuICogQSBkZW5pZWQgYWRkcmVzcy9wYXRoL2ZpZWxkIGxlYXZlcyBgb2JqYCB1bmNoYW5nZWQsIGluY2x1ZGluZyBpdHMgcHJvdG90eXBlLlxuICogLSBBcnJheXM6IGNvbmNhdGVuYXRlXG4gKiAtIE9iamVjdHM6IHNoYWxsb3cgbWVyZ2UgYXQgZWFjaCBsZXZlbFxuICogLSBQcmltaXRpdmVzOiByZXBsYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVOZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBhbnksXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBhbnkge1xuICBpZiAoaXNEZW5pZWRXcml0ZVBhdGgoYWRkcmVzcywgcGF0aCwgZmllbGQpKSByZXR1cm4gb2JqO1xuICB1cGRhdGVWYWx1ZShjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpLCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEluLXBsYWNlIHZhbHVlIHVwZGF0ZSB3aXRoIG1lcmdlIHNlbWFudGljcy5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiBjb25jYXRlbmF0ZSBvbnRvIGV4aXN0aW5nXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYFtdYCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIE9iamVjdHMgKG5vbi1lbXB0eSk6IHNoYWxsb3cgbWVyZ2UgKHNwcmVhZClcbiAqIC0gT2JqZWN0cyAoZW1wdHkpOiAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBge31gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gUHJpbWl0aXZlczogZGlyZWN0IGFzc2lnbm1lbnRcbiAqXG4gKiBOb3RlIG9uIGVtcHR5IGFycmF5czogYm90aCBgdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGFuZFxuICogYEFycmF5LmlzQXJyYXkodmFsdWUpYCBldmFsdWF0ZSB0aGUgc2FtZSBmb3IgYXJyYXlzIOKAlCBgW11gIGlzIHRydXRoeSBpblxuICogSmF2YVNjcmlwdCwgc28gdGhlIGAmJmAgZ3VhcmQgd2FzIG5ldmVyIHRoZSBpc3N1ZS4gVGhlIGFjdHVhbCBidWcgd2FzIHRoZVxuICogY29uY2F0IHBhdGg6IGBbLi4uY3VyLCAuLi5bXV1gIHNpbGVudGx5IHJldHVybmVkIGBjdXJgIHVuY2hhbmdlZCB3aGVuIGB2YWx1ZWBcbiAqIHdhcyBgW11gLCBtYWtpbmcgYHVwZGF0ZVZhbHVlKG9iaiwgJ3RhZ3MnLCBbXSlgIGEgbm8tb3AgaW5zdGVhZCBvZiBhIGNsZWFyLlxuICogVGhlIGZpeCBpcyB0aGUgZXhwbGljaXQgYHZhbHVlLmxlbmd0aCA9PT0gMGAgZWFybHktcmV0dXJuIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZhbHVlKG9iamVjdDogYW55LCBrZXk6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICBpZiAoaXNEZW5pZWRTZWdtZW50KGtleSkpIHJldHVybjtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc2V0T3duVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKTsgLy8gY2xlYXI6IFtdIHJlcGxhY2VzIHdoYXRldmVyIHdhcyB0aGVyZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpID8gb2JqZWN0W2tleV0gOiB1bmRlZmluZWQ7XG4gICAgICBzZXRPd25WYWx1ZShvYmplY3QsIGtleSwgY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IFsuLi5jdXIsIC4uLnZhbHVlXSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCkge1xuICAgIGNvbnN0IGN1ciA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgPyBvYmplY3Rba2V5XSA6IHVuZGVmaW5lZDtcbiAgICBzZXRPd25WYWx1ZShvYmplY3QsIGtleSwgY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHsgLi4uY3VyLCAuLi52YWx1ZSB9KTtcbiAgfSBlbHNlIHtcbiAgICBzZXRPd25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGggd2l0aCBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXN0ZWRWYWx1ZShyb290OiBhbnksIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGZpZWxkPzogc3RyaW5nIHwgbnVtYmVyKTogYW55IHtcbiAgY29uc3Qgbm9kZSA9IHBhdGggJiYgcGF0aC5sZW5ndGggPiAwID8gX2dldChyb290LCBwYXRoKSA6IHJvb3Q7XG4gIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IG5vZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5vZGU7XG4gIGlmIChub2RlICE9PSBudWxsICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobm9kZSwgZmllbGQpKSB7XG4gICAgcmV0dXJuIG5vZGVbZmllbGRdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
|