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
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
*/
|
|
15
15
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
16
|
exports.StageContext = void 0;
|
|
17
|
+
const write_1 = require("foottrace/write");
|
|
17
18
|
const summarize_js_1 = require("../capture/summarize.js");
|
|
18
19
|
const devMode_js_1 = require("../devMode.js");
|
|
19
20
|
const borrowedMutation_js_1 = require("./borrowedMutation.js");
|
|
20
21
|
const DiagnosticCollector_js_1 = require("./DiagnosticCollector.js");
|
|
21
|
-
const RecordFrame_js_1 = require("./RecordFrame.js");
|
|
22
22
|
const redaction_js_1 = require("./redaction.js");
|
|
23
23
|
const runAddress_js_1 = require("./runAddress.js");
|
|
24
24
|
const runPolicy_js_1 = require("./runPolicy.js");
|
|
@@ -148,7 +148,7 @@ class StageContext {
|
|
|
148
148
|
this.runId = runId;
|
|
149
149
|
this.stageName = name;
|
|
150
150
|
this.stageId = stageId;
|
|
151
|
-
this.record = new
|
|
151
|
+
this.record = new write_1.RecordFrame(sharedMemory, eventLog, (0, runAddress_js_1.runAddress)(runId));
|
|
152
152
|
this.record.useEncoding(this.policy);
|
|
153
153
|
this.branchId = branchId;
|
|
154
154
|
this.isDecider = !!isDecider;
|
|
@@ -866,4 +866,4 @@ class StageContext {
|
|
|
866
866
|
}
|
|
867
867
|
}
|
|
868
868
|
exports.StageContext = StageContext;
|
|
869
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7OztBQUVILDBEQUFrRjtBQUNsRiw4Q0FBMEM7QUFDMUMsK0RBQThHO0FBQzlHLHFFQUF1RjtBQUl2RixxREFBK0Q7QUFFL0QsaURBU3dCO0FBQ3hCLG1EQUE2QztBQUU3QyxpREFBbUU7QUFJbkUsTUFBYSxZQUFZO0lBQ3ZCOzs7Ozs7Ozs7T0FTRztJQUNjLE1BQU0sQ0FBYztJQUNyQzs7Ozs7OztPQU9HO0lBQ0ssTUFBTSxHQUFjLGlDQUFrQixDQUFDO0lBQy9DLGtGQUFrRjtJQUMxRSxTQUFTLENBQVU7SUFFcEIsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0Qix1RUFBdUU7SUFDaEUsT0FBTyxDQUFTO0lBQ3ZCLHFGQUFxRjtJQUM5RSxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQzNCOzs7Ozs7O09BT0c7SUFDSSxJQUFJLENBQXFCO0lBQ2hDOzs7OztPQUtHO0lBQ2EsS0FBSyxDQUFTO0lBQzlCOzs7Ozs7T0FNRztJQUNLLFlBQVksQ0FBVTtJQUN2QixRQUFRLENBQVU7SUFDbEIsU0FBUyxDQUFVO0lBQ25CLE1BQU0sQ0FBVTtJQUN2QixtRkFBbUY7SUFDNUUsV0FBVyxDQUFVO0lBQzVCLGdGQUFnRjtJQUN6RSxTQUFTLENBQVU7SUFFbkIsTUFBTSxDQUFnQjtJQUN0QixJQUFJLENBQWdCO0lBQ3BCLFFBQVEsQ0FBa0I7SUFFMUIsS0FBSyxHQUF3QixJQUFJLDRDQUFtQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFekY7O3lFQUVxRTtJQUM3RCxZQUFZLEdBQStFLEVBQUUsQ0FBQztJQUV0Rzs7Ozs7Ozs7T0FRRztJQUNLLGNBQWMsQ0FHcEI7SUFFRixtRUFBbUU7SUFD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R0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0Y7QUF6N0JELG9DQXk3QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWdlQ29udGV4dCDigJQgRXhlY3V0aW9uIGNvbnRleHQgZm9yIGEgc2luZ2xlIHN0YWdlIGluIGEgZmxvd2NoYXJ0IHJ1blxuICpcbiAqIExpa2UgYSBzdGFjayBmcmFtZSBpbiBhIGNvbXBpbGVyL3J1bnRpbWU6XG4gKiAtIEEgUmVjb3JkRnJhbWUg4oCUIHRoZSByZWNvcmQgaGFsZiAoQzMpOiB0aGUgaGVhcCwgdGhlIGFkZHJlc3MsIHRoZVxuICogICBmaXJzdC10b3VjaCBiYXNlLCB0aGUgbGF6eSB0cmFuc2FjdGlvbiBidWZmZXIgYW5kIGV2ZXJ5IHdyaXRlJ3Mgc2NydWJcbiAqICAgKEM0KSwgdGhlIHJlYWRLZXlzIGxpc3RcbiAqIC0gTGlua3MgdG8gcGFyZW50L2NoaWxkL25leHQgY29udGV4dHMgKGNhbGwgc3RhY2sgZnJhbWVzKVxuICogLSBXaGF0IGJlbG9uZ3MgdG8gYSBzdGFnZSBpbnNpZGUgYSBydW46IHJldGVudGlvbiBvZiByZWFkcyBhbmQgd3JpdGVzLCB0aGVcbiAqICAgcmVkYWN0aW9uIGRlY2lzaW9uIHBlciB3cml0ZSAoYHJlZGFjdGlvbi50cyDCtyBkZWNpZGVXcml0ZWApIGFuZCB3aGVyZSB0aGVcbiAqICAgZnJhbWUgd3JpdGVzIChgcnVuQWRkcmVzcy50c2ApLCB0aGUgZGV2LW1vZGUgd2FybmluZ3MsIHRoZSBjb21taXQgb2JzZXJ2ZXJcbiAqIC0gRGlhZ25vc3RpY0NvbGxlY3RvciBmb3IgbG9ncywgZXJyb3JzLCBtZXRyaWNzXG4gKi9cblxuaW1wb3J0IHsgc3VtbWFyaXplUmVhZFZhbHVlLCBzdW1tYXJpemVXcml0ZVZhbHVlIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgeyBib3Jyb3dlZE11dGF0aW9uTWVzc2FnZSwgY29tbWl0dGVkTXV0YXRpb25NZXNzYWdlLCBmaXJzdERpZmZlcmluZ1BhdGggfSBmcm9tICcuL2JvcnJvd2VkTXV0YXRpb24uanMnO1xuaW1wb3J0IHsgdHlwZSBEaWFnbm9zdGljQ2hhbm5lbCwgRGlhZ25vc3RpY0NvbGxlY3RvciB9IGZyb20gJy4vRGlhZ25vc3RpY0NvbGxlY3Rvci5qcyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50TG9nIH0gZnJvbSAnLi9FdmVudExvZy5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRTb3VyY2VQb3NpdGlvbiB9IGZyb20gJy4vZXZlbnRQb3NpdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dDb250cm9sVHlwZSwgRmxvd01lc3NhZ2UsIFJlYWRUcmFja2luZ01vZGUsIFN0YWdlU25hcHNob3QsIFdyaXRlVHJhY2tpbmdNb2RlIH0gZnJvbSAnLi9mcmFtZVR5cGVzLmpzJztcbmltcG9ydCB7IHR5cGUgV3JpdGVWZXJiLCBSZWNvcmRGcmFtZSB9IGZyb20gJy4vUmVjb3JkRnJhbWUuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25WZXJkaWN0IH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHtcbiAgQ0xFQVIsXG4gIGRlY2lkZVdyaXRlLFxuICBpbmhlcml0QnlJZGVudGl0eSxcbiAgbWFya1N0YWdlZFdyaXRlLFxuICBSZWRhY3Rpb25SdWxlLFxuICBTQ09QRV9QTEFDRUhPTERFUixcbiAgc2NydWJPZixcbiAgdXNlcktleU9mLFxufSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBydW5BZGRyZXNzIH0gZnJvbSAnLi9ydW5BZGRyZXNzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHsgREVGQVVMVF9SVU5fUE9MSUNZLCB3aXRoUmVkYWN0aW9uIH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHR5cGUgeyBTaGFyZWRNZW1vcnkgfSBmcm9tICcuL1NoYXJlZE1lbW9yeS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdFBoYXNlLCBVbnRyYWNrZWRTb3VyY2UgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFN0YWdlQ29udGV4dCB7XG4gIC8qKlxuICAgKiBUaGUgcmVjb3JkIGhhbGYgb2YgdGhpcyBmcmFtZSAoYFJlY29yZEZyYW1lLnRzYCwgTDMsIEMzKTogdGhlIGhlYXAgYW5kLFxuICAgKiB3aGVuIHRoZSBydW4ga2VlcHMgdGhlbSwgdGhlIHJlZGFjdGVkIG1pcnJvciBhbmQgdGhlIGxvZzsgdGhlIGFkZHJlc3M7XG4gICAqIHRoZSBmaXJzdC10b3VjaCBiYXNlOyB0aGUgbGF6eSB0cmFuc2FjdGlvbiBidWZmZXI7IHRoZSByZWFkS2V5cyBsaXN0LlxuICAgKiBFdmVyeSBzdGF0ZSByZWFkIG9mIHRoaXMgZnJhbWUgZ29lcyB0aHJvdWdoIGl0LCBhbmQgc28gZG9lcyBldmVyeVxuICAgKiBjb21taXQuIFRoZSBtaXJyb3IgaXMgcHJlc2VudCAqKm9ubHkqKiB3aGVuIHRoZSBydW4ncyBwb2xpY3kga2VlcHMgYVxuICAgKiByZWRhY3RlZCB2aWV3IChhIGBSZWRhY3Rpb25Qb2xpY3lgIGlzIGNvbmZpZ3VyZWQpIOKAlCByZWFkIHZpYVxuICAgKiBgRmxvd0NoYXJ0RXhlY3V0b3IuZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgLCB0aGUgZm91bmRhdGlvbiBmb3JcbiAgICogc2hhcmluZyBhIHRyYWNlIHdpdGhvdXQgbGVha2luZyByYXcgUElJIHRocm91Z2ggYHNoYXJlZFN0YXRlYC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVjb3JkOiBSZWNvcmRGcmFtZTtcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBwb2xpY3kg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGUgcmVkYWN0aW9uIHJ1bGUsIHRoZSBtaXJyb3IgZmxhZ1xuICAgKiAoYHJ1blBvbGljeS50c2AsIEY1KS4gSGVsZCBCWSBSRUZFUkVOQ0U6IG9uZSBmcm96ZW4gb2JqZWN0IHBlciBydW4gKGFuZFxuICAgKiBwZXIgcmVzdW1lKSwgc2hhcmVkIGJ5IGV2ZXJ5IGZyYW1lIG9mIHRoZSBydW4sIGEgc3ViZmxvdydzIGluY2x1ZGVkIOKAlFxuICAgKiB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfSBwYXNzIHRoZSByZWZlcmVuY2VcbiAgICogKHtAbGluayBpbmhlcml0UnVufSksIHRoZSBydW50aW1lIGluc3RhbGxzIGl0IG9uIGl0cyByb290XG4gICAqICh7QGxpbmsgdXNlUG9saWN5fSkuIE5ldmVyIGVkaXRlZDsgYSBjaGFuZ2UgaXMgYSBuZXcgb2JqZWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBwb2xpY3k6IFJ1blBvbGljeSA9IERFRkFVTFRfUlVOX1BPTElDWTtcbiAgLyoqIFRoZSBlbWl0dGluZyBmcmFtZSdzIGxvZ2ljYWwgbGVnLCBuZXZlciB0aGUgbXV0YWJsZSBleGVjdXRvcidzIGN1cnJlbnQgbGVnLiAqL1xuICBwcml2YXRlIGVtaXRSdW5JZD86IHN0cmluZztcblxuICBwdWJsaWMgc3RhZ2VOYW1lID0gJyc7XG4gIC8qKiBVbmlxdWUgc3RhZ2UgaWRlbnRpZmllciBmcm9tIHRoZSBidWlsZGVyIChtYXRjaGVzIHNwZWMgbm9kZSBpZCkuICovXG4gIHB1YmxpYyBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIFNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIHN0YWdlIGV4ZWN1dGlvbi4gKi9cbiAgcHVibGljIHJ1bnRpbWVTdGFnZUlkID0gJyc7XG4gIC8qKlxuICAgKiBEZWNsYXJlZCB0YWdzICg5LjIxLjApIGZvciB0aGUgc3RhZ2UgdGhpcyBjb250ZXh0IGlzIGV4ZWN1dGluZy4gU2V0IGJ5XG4gICAqIHRoZSB0cmF2ZXJzZXIgYmVzaWRlIGBydW50aW1lU3RhZ2VJZGAgKHBlci1ub2RlIGlkZW50aXR5IOKAlCBOT1QgaW5oZXJpdGVkXG4gICAqIGJ5IGBjcmVhdGVOZXh0YCAvIGBjcmVhdGVDaGlsZGApLCByZWNvcmRlZCBvbiB0aGUgZmlyc3QgYnVuZGxlXG4gICAqIGBjb21taXQoKWAgd3JpdGVzLCB0aGVuIHJlbGVhc2VkIHNvIGEgcm91dGluZSBzZWNvbmQgY29tbWl0IG9uIHRoZSBzYW1lXG4gICAqIGNvbnRleHQgKGEgZm9yayBjaGlsZCdzIGZhbi1vdXQgcmVwZWF0LCBhIG1vdW50J3MgZXhpdCBidW5kbGUpIGNhcnJpZXNcbiAgICogbm9uZSDigJQgdGhlIHNhbWUgb25jZS1wZXItZXhlY3V0aW9uIGxhdyBgX3VudHJhY2tlZFNvdXJjZXNgIGtlZXBzLlxuICAgKi9cbiAgcHVibGljIHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBydW4gdGhpcyBmcmFtZSBiZWxvbmdzIHRvIOKAlCBpdHMgaWRlbnRpdHkgb24gZXZlcnkgZXZlbnQsIGFuZCB0aGUgcnVuXG4gICAqIG5hbWVzcGFjZSBpdCByZWFkcyBhbmQgd3JpdGVzIGluICh7QGxpbmsgcnVuQWRkcmVzc30pLCByZWFkIG9uY2UsIHdoZW4gdGhlXG4gICAqIGZyYW1lIGlzIGJ1aWx0IChDMykuIE9ubHkge0BsaW5rIHVzZUFkZHJlc3NPZn0gbW92ZXMgdGhlIGFkZHJlc3MgYWZ0ZXJcbiAgICogdGhhdCwgYW5kIG9ubHkgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1biBuYW1lc3BhY2UgdGhpcyBmcmFtZSB3cml0ZXMgYW5kIHJlYWRzIGluIHdoZW4gdGhhdCBpcyBub3QgaXRzIG93blxuICAgKiBgcnVuSWRgIOKAlCBzZXQgb25jZSwgYmVmb3JlIHRoZSBmcmFtZSdzIGZpcnN0IHdyaXRlLCBieVxuICAgKiB7QGxpbmsgdXNlQWRkcmVzc09mfS4gSXRzIG9uZSB1c2VyIGlzIGEgc3ViZmxvdyBtb3VudCdzIG1lcmdlLWJhY2sgKFIxMyk6XG4gICAqIHRoZSByZWNvcmQgbmFtZXMgdGhlIG1vdW50LCB0aGUgdmFsdWVzIGxhbmQgd2hlcmUgdGhlIG1vdW50J3MgcGFyZW50XG4gICAqIHdyaXRlcy4gQWJzZW50IOKGkiBgcnVuSWRgLCBzbyBldmVyeSBvdGhlciBmcmFtZSBpcyB1bnRvdWNoZWQuXG4gICAqL1xuICBwcml2YXRlIGFkZHJlc3NSdW5JZD86IHN0cmluZztcbiAgcHVibGljIGJyYW5jaElkPzogc3RyaW5nO1xuICBwdWJsaWMgaXNEZWNpZGVyOiBib29sZWFuO1xuICBwdWJsaWMgaXNGb3JrOiBib29sZWFuO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZnJvbSBidWlsZGVyIChzZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBleGVjdXRpb24pLiAqL1xuICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIgKHNldCBieSB0cmF2ZXJzZXIgd2hlbiB0aGlzIGlzIGEgc3ViZmxvdyBlbnRyeSBwb2ludCkuICovXG4gIHB1YmxpYyBzdWJmbG93SWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHBhcmVudD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIG5leHQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBjaGlsZHJlbj86IFN0YWdlQ29udGV4dFtdO1xuXG4gIHB1YmxpYyBkZWJ1ZzogRGlhZ25vc3RpY0NvbGxlY3RvciA9IG5ldyBEaWFnbm9zdGljQ29sbGVjdG9yKCgpID0+IHRoaXMucG9saWN5LnJlZGFjdGlvbik7XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHdyaXRlcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldyBhbmQgb25Db21taXRcbiAgICogIOKAlCBpbiB0aGVpciBSRVRBSU5FRCBmb3JtIChjbG9uZWQgLyBzdW1tYXJpc2VkIC8gcmVkYWN0ZWQpLiBGaWxsZWQgZnJvbVxuICAgKiAge0BsaW5rIF9wZW5kaW5nV3JpdGVzfSBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9IGF0IGNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VXcml0ZXM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSB3cml0ZXMgb2YgdGhlIENVUlJFTlQgZXhlY3V0aW9uLCBoZWxkIGJ5IHJlZmVyZW5jZSB3aXRoIHRoZSB2ZXJkaWN0XG4gICAqIHRoZXkgd2VyZSBzdGFnZWQgdW5kZXIgKDkuMjMuMCkuIEEga2V5IHdyaXR0ZW4gayB0aW1lcyBob2xkcyBpdHMgTEFTVFxuICAgKiB2YWx1ZTsgdGhlIHJldGFpbmVkIGZvcm0gKHRoZSBgd3JpdGVUcmFja2luZ2AgY2xvbmUgb3Igc3VtbWFyeSwgdGhlXG4gICAqIHJlZGFjdGlvbiBwbGFjZWhvbGRlciBvciBmaWVsZCBzY3J1YikgaXMgdGFrZW4gT05DRSBwZXIga2V5IGF0IGNvbW1pdCDigJRcbiAgICogc2VlIHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30uIFNhbWUgbGF3IGFzIHRoZSB0cmFuc2FjdGlvbiBidWZmZXInc1xuICAgKiBwYXRjaCB0cmVlczogdGhlIGNvcHkgdGhlIHJlY29yZCBuZWVkcyBpcyBwYWlkIGF0IHRoZSBib3VuZGFyeSwgbm90IGF0XG4gICAqIGV2ZXJ5IHdyaXRlLiBMYXppbHkgYWxsb2NhdGVkOyBhIHN0YWdlIHRoYXQgbmV2ZXIgd3JpdGVzIHBheXMgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX3BlbmRpbmdXcml0ZXM/OiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHsgdmFsdWU6IHVua25vd247IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3Q7IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH1cbiAgPjtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgcmVhZHMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcuICovXG4gIHByaXZhdGUgX3N0YWdlUmVhZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBgX3N0YWdlUmVhZHNgIGtleXMgdGhhdCB3ZXJlIHJlYWQgYXQgYSBORVNURUQgcGF0aCAoYGdldFZhbHVlKHBhdGgsXG4gICAqIGtleSlgIHdpdGggYSBub24tZW1wdHkgYHBhdGhgKS4gT25seSB0aGUgZW5naW5lIHJlYWRzIHRoYXQgd2F5IOKAlCB0aGVcbiAgICogZmFjYWRlIHJlYWRzIHJvb3RzIOKAlCBzbyB0aGVzZSBhcmUgbm90IHVzZXIgcmVhZHMgYW5kIHRoZSBib3Jyb3dlZC1yZWFkXG4gICAqIGd1YXJkIHNraXBzIHRoZW0gYnkgdGhpcyBtYXJrZXIsIG5ldmVyIGJ5IGd1ZXNzaW5nIGZyb20gYSBkb3QgaW4gdGhlIGtleVxuICAgKiAoYSB1c2VyJ3MgdG9wLWxldmVsIGtleSBtYXkgaXRzZWxmIGNvbnRhaW4gb25lKS4gTGF6aWx5IGNyZWF0ZWQ7IHRoZVxuICAgKiBmYWNhZGUgcGF0aCBuZXZlciBhbGxvY2F0ZXMgaXQuXG4gICAqL1xuICBwcml2YXRlIF9uZXN0ZWRSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBEZXYgbW9kZSBvbmx5OiB0aGUgcm9vdCBrZXlzIHdob3NlIExBU1QgdHJhY2tlZCByZWFkIHdhcyBzZXJ2ZWQgZnJvbVxuICAgKiBjb21taXR0ZWQgc3RhdGUg4oCUIGJlZm9yZSB0aGlzIHN0YWdlJ3MgZmlyc3Qgd3JpdGUsIHdoZW4gbm8gdHJhbnNhY3Rpb25cbiAgICogYnVmZmVyIGV4aXN0cyB5ZXQuIFN1Y2ggYSByZWFkIGlzIHRoZSBjb21taXR0ZWQgb2JqZWN0IGl0c2VsZiwgc28gYW5cbiAgICogaW4tcGxhY2UgZWRpdCBvZiBpdCBtb3ZlcyB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIHRvbyAoY29weS1vbi13cml0ZSxcbiAgICogOS4yOS4wKTsge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259IGNoZWNrcyB0aGVzZSBrZXlzIGV2ZW4gd2hlbiB0aGVcbiAgICogc3RhZ2Ugd3JvdGUgdGhlbS4gTmV2ZXIgYWxsb2NhdGVkIG91dHNpZGUgYGVuYWJsZURldk1vZGUoKWAuXG4gICAqL1xuICBwcml2YXRlIF92aWV3UmVhZHM/OiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogSGFzIHRoaXMgZnJhbWUgY29tbWl0dGVkIGF0IGxlYXN0IG9uY2U/IFRoZSBib3Jyb3dlZC1yZWFkIGd1YXJkIHJ1bnMgb25cbiAgICogdGhlIEZJUlNUIGNvbW1pdCBvbmx5IOKAlCBzZWUge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259LiBUaGUgZnJhbWVcbiAgICogaXRzZWxmIHN0YXlzIHJlLXVzYWJsZSBhZnRlciBjb21taXQgKCMxM2IpOiB0aGUgZW5naW5lJ3MgZG91YmxlLWNvbW1pdFxuICAgKiBwYXRocyBhbmQgdGhlIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgYnJhbmNoIHBhcmVudCByZWx5IG9uIGl0LiBUaGVcbiAgICogdXNlci1sZXZlbCByZWZ1c2FsIG9mIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgbGl2ZXMgYXQgdGhlIHNjb3BlXG4gICAqIHRpZXIgKGBTY29wZUZhY2FkZWAsIG9uZSBwZXIgc3RhZ2UgZXhlY3V0aW9uKSwgbm90IGhlcmUuXG4gICAqL1xuICBwcml2YXRlIF9jb21taXR0ZWQgPSBmYWxzZTtcblxuICAvKiogVHJhY2tlZCByZWFkcyBvZiBhIHNlbGVjdGVkIHZhbHVlICh7QGxpbmsgc2VsZWN0ZWRSZWFkc30pLiAqL1xuICBwcml2YXRlIF9zZWxlY3RlZFJlYWRzID0gMDtcbiAgLyoqIEVhY2ggb2JqZWN0IHRoaXMgZnJhbWUgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUg4oaSIHRoYXQgcmVhZCdzIHZlcmRpY3QgKGBzdGFnZVdyaXRlYCBoYW5kcyBpdCBvbikuICovXG4gIHByaXZhdGUgX3NlbGVjdGVkT2JqZWN0cz86IFdlYWtNYXA8b2JqZWN0LCBSZWRhY3Rpb25WZXJkaWN0PjtcblxuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlcnMg4oCUIHVudHJhY2tlZCByZWFkIHBhdGhzIHVzZWQgZHVyaW5nIFRISVNcbiAgICogc3RhZ2UncyBleGVjdXRpb24gKGAnYXJncydgIC8gYCdlbnYnYCAvIGAnc2lsZW50J2ApLiBNYXJrZWQgYnlcbiAgICogYFNjb3BlRmFjYWRlYCwgc3VyZmFjZWQgb24gdGhlIHN0YWdlJ3MgQ29tbWl0QnVuZGxlIGFzXG4gICAqIGB1bnRyYWNrZWRTb3VyY2VzYCwgdGhlbiBSRUxFQVNFRCB3aXRoIHRoZSBzdGFnaW5nIHN0YXRlIGF0IGNvbW1pdCBlbmRcbiAgICogKHNvIHRoZSByb3V0aW5lIGRvdWJsZS1jb21taXQgcGF0aHMg4oCUIGZvcmsgY2hpbGRyZW4sIHN1YmZsb3cgbW91bnRzIOKAlFxuICAgKiByZWNvcmQgdGhlIGZpZWxkIGV4YWN0bHkgb25jZSwgb24gdGhlIGZpcnN0IGNvbW1pdCkuIExhemlseSBhbGxvY2F0ZWQ6XG4gICAqIHN0YWdlcyB0aGF0IG5ldmVyIHRvdWNoIGFuIHVudHJhY2tlZCBwYXRoIHBheSBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfdW50cmFja2VkU291cmNlcz86IFNldDxVbnRyYWNrZWRTb3VyY2U+O1xuXG4gIC8qKiBPYnNlcnZlciBjYWxsZWQgYWZ0ZXIgY29tbWl0KCkg4oCUIHVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZmlyZSBTY29wZVJlY29yZGVyLm9uQ29tbWl0LiAqL1xuICBwcml2YXRlIF9jb21taXRPYnNlcnZlcj86IChcbiAgICBtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+LFxuICApID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICAgIHNoYXJlZE1lbW9yeTogU2hhcmVkTWVtb3J5LFxuICAgIGJyYW5jaElkPzogc3RyaW5nLFxuICAgIGV2ZW50TG9nPzogRXZlbnRMb2csXG4gICAgaXNEZWNpZGVyPzogYm9vbGVhbixcbiAgKSB7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICAgIHRoaXMuc3RhZ2VOYW1lID0gbmFtZTtcbiAgICB0aGlzLnN0YWdlSWQgPSBzdGFnZUlkO1xuICAgIHRoaXMucmVjb3JkID0gbmV3IFJlY29yZEZyYW1lKHNoYXJlZE1lbW9yeSwgZXZlbnRMb2csIHJ1bkFkZHJlc3MocnVuSWQpKTtcbiAgICB0aGlzLnJlY29yZC51c2VFbmNvZGluZyh0aGlzLnBvbGljeSk7XG4gICAgdGhpcy5icmFuY2hJZCA9IGJyYW5jaElkO1xuICAgIHRoaXMuaXNEZWNpZGVyID0gISFpc0RlY2lkZXI7XG4gICAgdGhpcy5pc0ZvcmsgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBTaGFyZWRNZW1vcnkgaW5zdGFuY2UgKG5lZWRlZCBieSBzY29wZSBsYXllcikuICovXG4gIGdldFNoYXJlZE1lbW9yeSgpOiBTaGFyZWRNZW1vcnkge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5zdGF0ZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgU3RhbXBlZCBiZXNpZGUgcnVudGltZVN0YWdlSWQsIGJlZm9yZSBzY29wZSBjb25zdHJ1Y3Rpb24uICovXG4gIGJpbmRFbWl0T3JpZ2luKHJ1bklkOiBzdHJpbmcsIGRyaWxsUGF0aDogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXRSdW5JZCA9IGRyaWxsUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcnVuSWQ7XG4gICAgaWYgKGRyaWxsUGF0aCAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5sb2c/LmJpbmRBZGRyZXNzKHJ1bklkLCBkcmlsbFBhdGgpO1xuICB9XG5cbiAgLyoqIENhcHR1cmUgZnJvbSB0aGlzIGZyYW1lJ3MgT1dOIGxvZy4gQSBtYW51YWwvdW5hZGRyZXNzYWJsZSBmcmFtZSBzdGF5cyB1bmtub3duLiAqL1xuICBjYXB0dXJlRW1pdFBvc2l0aW9uKCk6IEVtaXRTb3VyY2VQb3NpdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdFJ1bklkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLnJlY29yZC5sb2c/LmNhcHR1cmVQb3NpdGlvbih0aGlzLmVtaXRSdW5JZCk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvci4gU3Vic2VxdWVudCBgY29tbWl0KClgIGNhbGxzIGFwcGx5XG4gICAqIHRoZSBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMg4oCUIHRoZSBvbmVzIHRoZSBsb2cgcmVjb3JkcyDigJQgdG9cbiAgICogdGhpcyBtaXJyb3IsIGJlc2lkZSB0aGUgcmF3IHBhdGNoZXMgb24gdGhlIGhlYXAgKGByZWNvcmRDb21taXRgKS5cbiAgICogQ2hpbGQgLyBuZXh0IGNvbnRleHRzIGluaGVyaXQgdGhlIG1pcnJvciB2aWEgYGNyZWF0ZU5leHRgIC8gYGNyZWF0ZUNoaWxkYC5cbiAgICpcbiAgICogQ2FsbGVkIG9uIGEgcnVudGltZSdzIHJvb3QgZnJhbWUgYnkgYEV4ZWN1dGlvblJ1bnRpbWVgIHdoZW4gdGhlIHJ1bidzIHBvbGljeSBrZWVwcyBhIG1pcnJvci5cbiAgICovXG4gIHVzZVJlZGFjdGVkTWlycm9yKG1pcnJvcjogU2hhcmVkTWVtb3J5KTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmQudXNlTWlycm9yKG1pcnJvcik7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgcmVkYWN0ZWQgbWlycm9yIGlmIGluc3RhbGxlZCwgZWxzZSB1bmRlZmluZWQuICovXG4gIGdldFJlZGFjdGVkU2hhcmVkTWVtb3J5KCk6IFNoYXJlZE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLm1pcnJvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyBwb2xpY3kgKGBydW5Qb2xpY3kudHNgKSBvbiB0aGlzIGZyYW1lIOKAlCBjYWxsZWQgb24gYVxuICAgKiBydW50aW1lJ3Mgcm9vdCBieSBgRXhlY3V0aW9uUnVudGltZWAgKGF0IGNvbnN0cnVjdGlvbiwgYW5kIGJ5XG4gICAqIGBFeGVjdXRpb25SdW50aW1lLnVzZVBvbGljeWAgb24gYSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSkuIERlc2NlbmRhbnRzIGdldFxuICAgKiB0aGUgc2FtZSByZWZlcmVuY2UgdGhyb3VnaCB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfTsgYVxuICAgKiBzdWJmbG93J3MgcnVudGltZSBpcyBjb25zdHJ1Y3RlZCB3aXRoIGl0LCBzbyBpdHMgc2VlZCBmcmFtZSBhbmQgZXZlcnlcbiAgICogZnJhbWUgYWZ0ZXIgY29tbWl0IHVuZGVyIHRoZSBydW4ncyBkaWFscyB0b28uXG4gICAqL1xuICB1c2VQb2xpY3kocG9saWN5OiBSdW5Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLmFkb3B0UG9saWN5KHBvbGljeSk7XG4gIH1cblxuICAvKiogVGhlIHJ1bidzIHBvbGljeSB0aGlzIGZyYW1lIHJldGFpbnMsIGVuY29kZXMgYW5kIHNjcnVicyB1bmRlci4gKi9cbiAgZ2V0UG9saWN5KCk6IFJ1blBvbGljeSB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYSByZWRhY3Rpb24gcnVsZSDigJQgdGhlIE9ORSBvd25lciBvZiBcIndoYXQgZG9lcyB0aGUgcG9saWN5IHNheVxuICAgKiBhYm91dCB0aGlzIHBhdGhcIiAoYG1lbW9yeS9yZWRhY3Rpb24udHNgKSDigJQgYXMgYSBORVcgcG9saWN5IGZvciB0aGlzIGZyYW1lXG4gICAqICh0aGUgc2hhcmVkIG9uZSBpcyBuZXZlciBlZGl0ZWQpLiBVbmRlciBhbiBleGVjdXRvciB0aGUgcnVsZSBhcnJpdmVzXG4gICAqIHdpdGggdGhlIHJ1bidzIHBvbGljeTsgdGhpcyBkb29yIGlzIGZvciBhIGBTY29wZUZhY2FkZWAgb24gYSBiYXJlIGZyYW1lXG4gICAqICh1bml0IHRlc3RzLCBoYW5kLWJ1aWx0IHNjb3BlcyksIHdoaWNoIGJyaW5ncyBpdHMgb3duIHJ1bGUuIEV2ZXJ5IHN0YWdlZFxuICAgKiB3cml0ZSBhbmQgZXZlcnkgdHJhY2tlZCByZWFkIGFza3MgaXQsIHNvIGEgd3JpdGUgdGhhdCBuZXZlciBwYXNzZXMgYVxuICAgKiBmYWNhZGUg4oCUIGEgc3ViZmxvdyBzZWVkLCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCBhIHJlc3VtZSByZS1zZWVkIOKAlFxuICAgKiBpcyByZXRhaW5lZCB1bmRlciB0aGUgc2FtZSB2ZXJkaWN0IGFzIGEgZmFjYWRlIHdyaXRlLiBBYnNlbnQ6IGV2ZXJ5XG4gICAqIHZlcmRpY3QgaXMgYCdjbGVhcidgIHVubGVzcyB0aGUgY2FsbGVyIHBhc3NlZCBhbiBleHBsaWNpdCBmbGFnLlxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUnVsZShydWxlOiBSZWRhY3Rpb25SdWxlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9saWN5LnJlZGFjdGlvbiAhPT0gcnVsZSkgdGhpcy5hZG9wdFBvbGljeSh3aXRoUmVkYWN0aW9uKHRoaXMucG9saWN5LCBydWxlKSk7XG4gIH1cblxuICAvKiogVGhlIGluc3RhbGxlZCByZWRhY3Rpb24gcnVsZSwgaWYgYW55ICh0aGUgZmFjYWRlJ3MgbG9va3VwKS4gKi9cbiAgZ2V0UmVkYWN0aW9uUnVsZSgpOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wb2xpY3kucmVkYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgdGhlIHJ1biBmcm9tIGBmcm9tYDogdGhlIHBvbGljeSAoYnkgcmVmZXJlbmNlKSBhbmQgdGhlIHJ1bidzIG1pcnJvclxuICAgKiBzdG9yZS4gVGhlIE9ORSBpbmhlcml0YW5jZSBzdGVwIOKAlCB7QGxpbmsgY3JlYXRlTmV4dH0gYW5kXG4gICAqIHtAbGluayBjcmVhdGVDaGlsZH0gYm90aCBjYWxsIGl0LCBhbmQgaXQgbmFtZXMgbm8gZGlhbC5cbiAgICovXG4gIHByaXZhdGUgaW5oZXJpdFJ1bihmcm9tOiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICB0aGlzLmFkb3B0UG9saWN5KGZyb20ucG9saWN5KTtcbiAgICB0aGlzLnJlY29yZC51c2VNaXJyb3IoZnJvbS5yZWNvcmQubWlycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgT05FIHBsYWNlIHRoaXMgZnJhbWUncyBwb2xpY3kgY2hhbmdlczogdGhlIGZyYW1lIGhvbGRzIGl0LCBhbmQgaXRzXG4gICAqIHJlY29yZCBmcmFtZSBlbmNvZGVzIHVuZGVyIHRoZSBzYW1lIHJlZmVyZW5jZSAoYGNvbW1pdFZhbHVlc2AsXG4gICAqIGB3cml0ZVByb3ZlbmFuY2VgIOKAlCBgUmVjb3JkRnJhbWUgwrcgdXNlRW5jb2RpbmdgKSwgc28gdGhlIHR3byBuZXZlciBkaWZmZXIuXG4gICAqL1xuICBwcml2YXRlIGFkb3B0UG9saWN5KHBvbGljeTogUnVuUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgdGhpcy5yZWNvcmQudXNlRW5jb2RpbmcocG9saWN5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSB0cmFja2VkIHVzZXItbGV2ZWwgd3JpdGUsIHBvbGljeS1nYXRlZCAoIzEzYy1BKSDigJQgdGhlIHNpbmdsZVxuICAgKiBib29ra2VlcGluZyBwYXRoIGZvciB7QGxpbmsgc2V0T2JqZWN0fSBhbmQge0BsaW5rIHVwZGF0ZU9iamVjdH0uIEhvbGRzXG4gICAqIHRoZSBSRUZFUkVOQ0UgYW5kIHRoZSB2ZXJkaWN0ICg5LjIzLjApOyB0aGUgcmV0YWluZWQgZm9ybSBpcyB0YWtlbiBhdFxuICAgKiBjb21taXQgYnkge0BsaW5rIG1hdGVyaWFsaXNlV3JpdGVzfSwgb25jZSBwZXIga2V5LlxuICAgKlxuICAgKiBSZWRhY3Rpb24gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBkaWFsIGluIEVWRVJZIG1vZGU6IGEgcmVkYWN0ZWRcbiAgICogd3JpdGUgc3RvcmVzIHRoZSBgJ1tSRURBQ1RFRF0nYCBwbGFjZWhvbGRlciB1bmRlciBgJ2Z1bGwnYCBBTkRcbiAgICogYCdzdW1tYXJ5J2AgKGEgc3VtbWFyeSBtYXJrZXIgd291bGQgbGVhayB0aGUgdmFsdWUncyBwcmV2aWV3L3NpemUpLFxuICAgKiBhbmQgc3RvcmVzIG5vdGhpbmcgdW5kZXIgYCdvZmYnYCAoZW50cnkgc2tpcHBlZCBlbnRpcmVseSDigJQgbm90aGluZyB0b1xuICAgKiBsZWFrKS4gQSBmaWVsZC1sZXZlbCB2ZXJkaWN0IHNjcnVicyBhIGNsb25lIEJFRk9SRSB0aGUgZGlhbCBzZWVzIGl0LCBzb1xuICAgKiBhIHN1bW1hcnkgcHJldmlldyBjYW4gbmV2ZXIgc2hvdyB0aGUgc2VjcmV0IGVpdGhlci4gVGhlIHZlcmRpY3QgaXMgdGhlXG4gICAqIG9uZSBgc3RhZ2VXcml0ZWAgZGVjaWRlZCBCRUZPUkUgc3RhZ2luZywgY2FycmllZCB0byBjb21taXQgd2l0aCB0aGVcbiAgICogdmFsdWUuIFRoZSBzdGFnZWQgd3JpdGUgaXRzZWxmIGlzIHVuYWZmZWN0ZWQg4oCUIHJlZGFjdGlvbiBvZiB0aGVcbiAgICogY29tbWl0dGVkIHBheWxvYWQgaXMgdGhlIHJlY29yZCBmcmFtZSdzIHNjcnViIG9mIHRoYXQgd3JpdGVcbiAgICogKGBSZWNvcmRGcmFtZSDCtyB3cml0ZWAsIHRoZW4gYHNjcnViLnRzYCBhdCBjb21taXQpLlxuICAgKi9cbiAgcHJpdmF0ZSB0cmFja1dyaXRlKFxuICAgIHVzZXJLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICAgIG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnLFxuICApIHtcbiAgICBpZiAodGhpcy5wb2xpY3kud3JpdGVUcmFja2luZyA9PT0gJ29mZicpIHJldHVybjtcbiAgICAodGhpcy5fcGVuZGluZ1dyaXRlcyA/Pz0gbmV3IE1hcCgpKS5zZXQodXNlcktleSwgeyB2YWx1ZSwgdmVyZGljdCwgb3BlcmF0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBfc3RhZ2VXcml0ZXNgIHdpdGggZXZlcnkgcGVuZGluZyB3cml0ZSBmb2xkZWQgaW4gYXMgaXRzIHJldGFpbmVkIGZvcm1cbiAgICog4oCUIHRoZSByZWNvcmQgYSByZWFkZXIgc2Vlcy4gQ29uc3VtZXMgbm90aGluZzogYSBtaWQtcnVuIHNuYXBzaG90IHJlYWRzXG4gICAqIHRoZSB3cml0ZXMgc28gZmFyLCBhbmQgY29tbWl0IHN0aWxsIG1hdGVyaWFsaXNlcyB0aGUgZmluYWwgdmFsdWVzLlxuICAgKiBSZXR1cm5zIGBfc3RhZ2VXcml0ZXNgIGl0c2VsZiB3aGVuIG5vdGhpbmcgaXMgcGVuZGluZy5cbiAgICovXG4gIHByaXZhdGUgcmV0YWluZWRXcml0ZXMoKTogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4ge1xuICAgIGlmICghdGhpcy5fcGVuZGluZ1dyaXRlcykgcmV0dXJuIHRoaXMuX3N0YWdlV3JpdGVzO1xuICAgIGNvbnN0IG91dCA9IHsgLi4udGhpcy5fc3RhZ2VXcml0ZXMgfTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHddIG9mIHRoaXMuX3BlbmRpbmdXcml0ZXMpIHtcbiAgICAgIG91dFtrZXldID0ge1xuICAgICAgICB2YWx1ZTogdGhpcy5yZXRhaW5lZEZvcm0ody52ZXJkaWN0LCB3LnZhbHVlLCB0aGlzLnBvbGljeS53cml0ZVRyYWNraW5nLCBzdW1tYXJpemVXcml0ZVZhbHVlKSxcbiAgICAgICAgb3BlcmF0aW9uOiB3Lm9wZXJhdGlvbixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogVGFrZSB0aGUgcmV0YWluZWQgZm9ybSBvZiBldmVyeSBwZW5kaW5nIHdyaXRlIOKAlCBPTkNFIHBlciBrZXksIGZyb20gdGhlXG4gICAqIHZhbHVlIGFzIGl0IHN0YW5kcyBhdCBjb21taXQgKDkuMjMuMCkg4oCUIGFuZCByZWxlYXNlIHRoZSByZWZlcmVuY2VzLiBUaGVcbiAgICogZmlyc3QgdGhpbmcgYGNvbW1pdCgpYCBkb2VzLCBzbyB0aGUgYm9ycm93ZWQtbXV0YXRpb24gZ3VhcmQgYW5kIHRoZVxuICAgKiBjb21taXQgb2JzZXJ2ZXIgc2VlIHRoZSBmaW5pc2hlZCByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIG1hdGVyaWFsaXNlV3JpdGVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcGVuZGluZ1dyaXRlcykgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9zdGFnZVdyaXRlcyA9IHRoaXMucmV0YWluZWRXcml0ZXMoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmVsZWFzZWQgZXZlbiB3aGVuIGEgcmV0YWluZWQgZm9ybSBjYW5ub3QgYmUgdGFrZW4g4oCUIGFuIHVuY2xvbmVhYmxlXG4gICAgICAvLyB2YWx1ZSAoYSBmdW5jdGlvbiwgYSBQcm94eSkgaXMgYSBjb250cmFjdCB2aW9sYXRpb24gKFwic3RhdGUgdmFsdWVzXG4gICAgICAvLyBtdXN0IHN1cnZpdmUgc3RydWN0dXJlZENsb25lXCIpIHRoYXQgbm93IHN1cmZhY2VzIEhFUkUsIGF0IGNvbW1pdCxcbiAgICAgIC8vIGFuZCBmYWlscyB0aGUgcnVuIGxvdWRseTsgYSBsYXRlciBzbmFwc2hvdCBvZiB0aGUgZmFpbGVkIHJ1biBtdXN0XG4gICAgICAvLyBub3QgdGhyb3cgdGhlIHNhbWUgZXJyb3IgYWdhaW4uXG4gICAgICB0aGlzLl9wZW5kaW5nV3JpdGVzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSBvZiBhIHZhbHVlIHRoZSBlbmdpbmUgUkVUQUlOUyAocmVhZHMgYW5kIHdyaXRlcyByZXRlbnRpb24pOlxuICAgKiB0aGUgcGxhY2Vob2xkZXIgYmVhdHMgZXZlcnkgZGlhbDsgYSBmaWVsZC1sZXZlbCBzY3J1YiBoYXBwZW5zIGJlZm9yZSB0aGVcbiAgICogZGlhbCBzZWVzIHRoZSB2YWx1ZTsgYSBjbGVhciB2YWx1ZSBpcyBzdW1tYXJpemVkIG9yIGNsb25lZCBhcyB0aGUgZGlhbFxuICAgKiBzYXlzLiBDYWxsZXJzIGhhbmRsZSBgdW5kZWZpbmVkYCBiZWZvcmUgYXNraW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZXRhaW5lZEZvcm0oXG4gICAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBtb2RlOiBSZWFkVHJhY2tpbmdNb2RlIHwgV3JpdGVUcmFja2luZ01vZGUsXG4gICAgc3VtbWFyaXplOiAodmFsdWU6IHVua25vd24pID0+IHVua25vd24sXG4gICk6IHVua25vd24ge1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBTQ09QRV9QTEFDRUhPTERFUjtcbiAgICBjb25zdCBzY3J1YmJlZCA9IHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycgPyBSZWRhY3Rpb25SdWxlLnNjcnViRmllbGRzKHZhbHVlLCB2ZXJkaWN0LnBhdGhzKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAobW9kZSA9PT0gJ3N1bW1hcnknKSByZXR1cm4gc3VtbWFyaXplKHNjcnViYmVkID8/IHZhbHVlKTtcbiAgICByZXR1cm4gc2NydWJiZWQgPz8gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcnVsZSB3aXRoIHNvbWV0aGluZyB0byBzYXkg4oCUIGB1bmRlZmluZWRgIG9uIHRoZSBuby1wb2xpY3kgcGF0aCAobm9cbiAgICogcnVsZSBpbnN0YWxsZWQsIG9yIGEgcnVsZSB3aXRoIG5vIHBvbGljeSBlbnRyaWVzIGFuZCBubyBtYXJrZWQga2V5cyksIHNvXG4gICAqIGEgdHJhY2tlZCByZWFkIG9yIGEgc3RhZ2VkIHdyaXRlIHRoZXJlIHBheXMgbm8gdmVyZGljdCBjYWxsIGFuZCBubyBwYXRoXG4gICAqIGFsbG9jYXRpb24uIFRoZSBkZWZhdWx0IHJ1biBpcyBieXRlLWlkZW50aWNhbCBBTkQgY29zdC1pZGVudGljYWwuXG4gICAqL1xuICBwcml2YXRlIGFjdGl2ZVJ1bGUoKTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcnVsZSA9IHRoaXMucG9saWN5LnJlZGFjdGlvbjtcbiAgICByZXR1cm4gcnVsZSAhPT0gdW5kZWZpbmVkICYmICFydWxlLmlzSW5lcnQoKSA/IHJ1bGUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVEhFIE9ORSBGVU5ORUwgZXZlcnkgc3RhZ2VkIHdyaXRlIHBhc3NlcyB0aHJvdWdoIOKAlCBmYWNhZGUgd3JpdGVzIEFORFxuICAgKiB0aGUgcGF0aHMgdGhhdCBieXBhc3MgdGhlIGZhY2FkZSAoc3ViZmxvdyBzZWVkLCBgb3V0cHV0TWFwcGVyYFxuICAgKiBtZXJnZS1iYWNrLCByZXN1bWUgcmUtc2VlZCkuIFR3byBvd25lcnMgKEM0KTogdGhlIHJ1bidzIHJ1bGUgREVDSURFUyxcbiAgICogdGhlIHJlY29yZCBmcmFtZSBXUklURVMgdGhlIHZlcmRpY3QncyBieXRlcywgaW4gZm91ciBzdGVwc1xuICAgKiAoYHJlZGFjdGlvbi50c2AsIFwiVGhlIHdyaXRlIGRlY2lzaW9uXCIpOlxuICAgKiAgIDEuIHRoZSB2ZXJkaWN0IOKAlCBgZGVjaWRlV3JpdGVgLCB1bmRlciB0aGUgcnVsZSBhY3RpdmUgYXMgdGhlIHdyaXRlIGJlZ2lucztcbiAgICogICAyLiBpZGVudGl0eSBpbmhlcml0YW5jZSDigJQgYGluaGVyaXRCeUlkZW50aXR5YCwgYWdhaW5zdCB0aGlzIGZyYW1lJ3NcbiAgICogICAgICBzZWxlY3RlZCByZWFkcyBhcyB0aGV5IHN0YW5kIGFmdGVyIHN0ZXAgMTtcbiAgICogICAzLiB0aGUgYnl0ZXMg4oCUIGBSZWNvcmRGcmFtZSDCtyB3cml0ZWAsIHRoZSBvcCBhbmQgaXRzIHNjcnViICh0aGUgd2hvbGVcbiAgICogICAgICB2YWx1ZSwgb3IgdGhlIGZpZWxkcyBpbnNpZGUgaXQpO1xuICAgKiAgIDQuIHRoZSBtYXJrcyDigJQgYG1hcmtTdGFnZWRXcml0ZWAsIG9ubHkgb25jZSB0aGUgd3JpdGUgc3RhZ2VkLCBzbyBhXG4gICAqICAgICAgd3JpdGUgdGhhdCBmYWlscyB0byBzdGFnZSBtYXJrcyBub3RoaW5nLlxuICAgKiBFYWNoIHN0ZXAgcmVhZHMgdGhlIHJ1bGUgKGFuZCB0aGUgc2VsZWN0ZWQgcmVhZHMpIHdoZW4gaXQgYWN0cywgYXMgdGhpc1xuICAgKiBmdW5uZWwgYWx3YXlzIGRpZC4gUmV0dXJucyB0aGUgdmVyZGljdCBzbyB0aGUgY2FsbGVyIHJldGFpbnMgYW5kIHJlcG9ydHNcbiAgICogdW5kZXIgdGhlIHNhbWUgZGVjaXNpb24uXG4gICAqL1xuICBwcml2YXRlIHN0YWdlV3JpdGUoXG4gICAgbnNQYXRoOiBzdHJpbmdbXSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBleHBsaWNpdDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICB2ZXJiOiBXcml0ZVZlcmIsXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuYWN0aXZlUnVsZSgpO1xuICAgIGlmIChhY3RpdmUgPT09IHVuZGVmaW5lZCAmJiAhZXhwbGljaXQpIHtcbiAgICAgIC8vIFRoZSBuby1wb2xpY3kgZmFzdCBwYXRoLCB0aGUgc2FtZSBmb3VyIHN0ZXBzIHdpdGggbm90aGluZyB0byBkbzogbm8gcnVsZSB3aXRoIGFueXRoaW5nIHRvIHNheVxuICAgICAgLy8gYW5kIG5vIGZsYWcgaXMgY2xlYXIgKHN0ZXAgMSksIG5vdGhpbmcgdG8gaW5oZXJpdCB3aXRob3V0IGEgcnVsZSAoc3RlcCAyKSwgbm8gc2NydWIgKHN0ZXAgMyksXG4gICAgICAvLyBhbmQgbm90aGluZyB0byBtYXJrIOKAlCBhIGNsZWFyIHZlcmRpY3QgbWFya3Mgbm90aGluZywgYW5kIGEgZGVsZXRlIHVubWFya3Mgb25seSBvbiB0aGUgcnVsZVxuICAgICAgLy8gYWN0aXZlIGFzIGl0IGJlZ2FuIChzdGVwIDQpLiBUaGUgZGVmYXVsdCBydW4gcGF5cyB0aGUgcmVjb3JkJ3Mgd3JpdGUgYW5kIG5vdGhpbmcgZWxzZS5cbiAgICAgIHRoaXMucmVjb3JkLndyaXRlKG5zUGF0aCwgdmFsdWUsIHZlcmIpO1xuICAgICAgcmV0dXJuIENMRUFSO1xuICAgIH1cbiAgICBjb25zdCBhc2tlZCA9IGRlY2lkZVdyaXRlKGFjdGl2ZSwgcGF0aCwga2V5LCBleHBsaWNpdCk7XG4gICAgY29uc3QgdmVyZGljdCA9IGluaGVyaXRCeUlkZW50aXR5KGFjdGl2ZSwgYXNrZWQsIHRoaXMuX3NlbGVjdGVkT2JqZWN0cywgcGF0aCwga2V5LCB2YWx1ZSk7XG4gICAgdGhpcy5yZWNvcmQud3JpdGUobnNQYXRoLCB2YWx1ZSwgdmVyYiwgc2NydWJPZih2ZXJkaWN0KSk7XG4gICAgbWFya1N0YWdlZFdyaXRlKGFjdGl2ZSwgdGhpcy5wb2xpY3kucmVkYWN0aW9uLCB2ZXJkaWN0LCBwYXRoLCBrZXksIHZlcmIpO1xuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGFuZCByZWFkIGF0IEFOT1RIRVIgZnJhbWUncyBhZGRyZXNzIChpdHMgcnVuIG5hbWVzcGFjZSkgd2hpbGUgdGhpc1xuICAgKiBmcmFtZSBrZWVwcyBpdHMgb3duIGlkZW50aXR5IG9uIHRoZSByZWNvcmQg4oCUIGBzdGFnZWAsIGBzdGFnZUlkYCxcbiAgICogYHJ1bnRpbWVTdGFnZUlkYCwgdGFncy4gQSBzdWJmbG93IG1vdW50J3MgbWVyZ2UtYmFjayBpcyB0aGUgb25lIGNhbGxlclxuICAgKiAoYFN1YmZsb3dFeGVjdXRvciDCtyBleGVjdXRlU3ViZmxvd2AsIFIxMyk6IHRoZSBtb3VudCBmcmFtZSBvZiBhIGJyYW5jaCBvclxuICAgKiBmb3JrIGNoaWxkIGxhbmRzIGl0cyB2YWx1ZXMgd2hlcmUgaXRzIHBhcmVudCB3cml0ZXMsIGFzIGJlZm9yZSwgYW5kIGl0c1xuICAgKiBidW5kbGUgbm93IG5hbWVzIHRoZSBtb3VudCBpbnN0ZWFkIG9mIHRoZSBzdGFnZSBiZWZvcmUgaXQuIFJlZnVzZWQgb25jZVxuICAgKiB0aGUgZnJhbWUgaGFzIHN0YWdlZCBhbnl0aGluZyDigJQgaXRzIGJ1ZmZlcidzIGFkZHJlc3MgaXMgZml4ZWQgdGhlbi4gVGhlXG4gICAqIGRlY2lzaW9uIGlzIHRoZSBlbmdpbmUncyAobmFtZXNwYWNlIGlkcywgYXMgc2luY2UgUjEzKTsgdGhlIHJlY29yZCBmcmFtZVxuICAgKiB0YWtlcyB0aGUgYWRkcmVzcyBpdCBjb21lcyB0byAoYFJlY29yZEZyYW1lIMK3IHVzZUFkZHJlc3NgKS5cbiAgICovXG4gIHVzZUFkZHJlc3NPZihmcmFtZTogU3RhZ2VDb250ZXh0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjb3JkLmhhc1N0YWdlZCAmJiBmcmFtZS5uYW1lc3BhY2VJZCAhPT0gdGhpcy5uYW1lc3BhY2VJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgW2Zvb3RwcmludF0gU3RhZ2VDb250ZXh0LnVzZUFkZHJlc3NPZjogJyR7dGhpcy5zdGFnZUlkfScgaGFzIGFscmVhZHkgc3RhZ2VkIHdyaXRlcyBhdCBpdHMgb3duIGFkZHJlc3MuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYWRkcmVzc1J1bklkID0gZnJhbWUubmFtZXNwYWNlSWQ7XG4gICAgdGhpcy5yZWNvcmQudXNlQWRkcmVzcyhydW5BZGRyZXNzKHRoaXMubmFtZXNwYWNlSWQpKTtcbiAgfVxuXG4gIC8qKiBUaGUgcnVuIG5hbWVzcGFjZSB3cml0ZXMgYW5kIHJlYWRzIGdvIHRvOiB7QGxpbmsgYWRkcmVzc1J1bklkfSwgZWxzZSBgcnVuSWRgLiAqL1xuICBwcml2YXRlIGdldCBuYW1lc3BhY2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFkZHJlc3NSdW5JZCA/PyB0aGlzLnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIFdyaXRlIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcGF0Y2gocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gdGhpcy5zdGFnZVdyaXRlKHRoaXMucmVjb3JkLmF0KHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ3NldCcpO1xuICB9XG5cbiAgc2V0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnBhdGNoKHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgbWVyZ2UocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIHJldHVybiB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnbWVyZ2UnKTtcbiAgfVxuXG4gIHNldE9iamVjdChcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBzaG91bGRSZWRhY3Q/OiBib29sZWFuLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIG9wZXJhdGlvbk92ZXJyaWRlPzogJ3NldCcgfCAnZGVsZXRlJyxcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgLy8gRXhwbGljaXQgZGVsZXRpb24gKFNjb3BlRmFjYWRlLmRlbGV0ZVZhbHVlKSBzdGFnZXMgYSBkaXN0aW5jdCBvcCBzb1xuICAgIC8vIGRlbHRhLW1vZGUgY29tbWl0cyAoIzEzYy1CKSBjYW4gZW1pdCBhIHJlYWwgYGRlbGV0ZWAgdHJhY2UgZW50cnkuXG4gICAgLy8gVW5kZXIgdGhlIGRlZmF1bHQgJ2Z1bGwnIG1vZGUgdGhlIGJ1ZmZlciBjb21taXRzIGl0IGFzIGFcbiAgICAvLyBzZXQtb2YtdW5kZWZpbmVkIOKAlCBieXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbCBmbGF0dGVuaW5nLlxuICAgIGNvbnN0IHZlcmRpY3QgPVxuICAgICAgb3BlcmF0aW9uT3ZlcnJpZGUgPT09ICdkZWxldGUnXG4gICAgICAgID8gdGhpcy5zdGFnZVdyaXRlKHRoaXMucmVjb3JkLmF0KHBhdGgsIGtleSksIHBhdGgsIGtleSwgdW5kZWZpbmVkLCBzaG91bGRSZWRhY3QsICdkZWxldGUnKVxuICAgICAgICA6IHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdzZXQnKTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdCDigJRcbiAgICAvLyBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSksIHNlZSB0cmFja1dyaXRlLlxuICAgIHRoaXMudHJhY2tXcml0ZSh1c2VyS2V5T2YocGF0aCwga2V5KSwgdmFsdWUsIHZlcmRpY3QsIG9wZXJhdGlvbk92ZXJyaWRlID8/ICdzZXQnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIGNvbnN0IHRhZ2dlZCA9IGRlc2NyaXB0aW9uLnN0YXJ0c1dpdGgoJ1snKSA/IGRlc2NyaXB0aW9uIDogYFtXUklURV0gJHtkZXNjcmlwdGlvbn1gO1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCB0YWdnZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIHVwZGF0ZU9iamVjdChcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBzaG91bGRSZWRhY3Q/OiBib29sZWFuLFxuICApOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5tZXJnZShwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QpO1xuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgd3JpdGUgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyArIG9uQ29tbWl0IOKAlFxuICAgIC8vIHBvbGljeS1nYXRlZCAoIzEzYy1BKSwgc2VlIHRyYWNrV3JpdGUuXG4gICAgdGhpcy50cmFja1dyaXRlKHVzZXJLZXlPZihwYXRoLCBrZXkpLCB2YWx1ZSwgdmVyZGljdCwgJ3VwZGF0ZScpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgc2V0Um9vdChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnBhdGNoKFtdLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBSb290LWxldmVsICh1bi1uYW1lc3BhY2VkKSB3cml0ZSDigJQgdGhlIHN1YmZsb3cgc2VlZCBhbmQgbWVyZ2UtYmFjayBwYXRoLiAqL1xuICBzZXRHbG9iYWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHRoaXMuc3RhZ2VXcml0ZShba2V5XSwgW10sIGtleSwgdmFsdWUsIHVuZGVmaW5lZCwgJ3NldCcpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBkZXNjcmlwdGlvbik7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlR2xvYmFsQ29udGV4dChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnN0YWdlV3JpdGUoW2tleV0sIFtdLCBrZXksIHZhbHVlLCB1bmRlZmluZWQsICdzZXQnKTtcbiAgfVxuXG4gIGFwcGVuZFRvQXJyYXkocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCBpdGVtczogdW5rbm93bltdLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5nZXRWYWx1ZShwYXRoLCBrZXkpO1xuICAgIGNvbnN0IG1lcmdlZCA9IEFycmF5LmlzQXJyYXkoZXhpc3RpbmcpID8gWy4uLmV4aXN0aW5nLCAuLi5pdGVtc10gOiBbLi4uaXRlbXNdO1xuICAgIHRoaXMuc2V0T2JqZWN0KHBhdGgsIGtleSwgbWVyZ2VkLCBmYWxzZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgbWVyZ2VPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5nZXRWYWx1ZShwYXRoLCBrZXkpO1xuICAgIGNvbnN0IG1lcmdlZCA9XG4gICAgICBleGlzdGluZyAmJiB0eXBlb2YgZXhpc3RpbmcgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGV4aXN0aW5nKVxuICAgICAgICA/IHsgLi4uKGV4aXN0aW5nIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSwgLi4ub2JqIH1cbiAgICAgICAgOiB7IC4uLm9iaiB9O1xuICAgIHRoaXMuc2V0T2JqZWN0KHBhdGgsIGtleSwgbWVyZ2VkLCBmYWxzZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlYWQgb3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogVHJhY2tlZCByZWFkLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgQk9SUk9XRUQg4oCUIHNlZSB0aGUgY29udHJhY3Qgb25cbiAgICogYFNjb3BlRmFjYWRlLmdldFZhbHVlYC4gUmVhZC10cmFja2luZyBjb3N0IGlzIHBvbGljeS1nYXRlZCAoIzE0KTpcbiAgICogYCdmdWxsJ2AgY2xvbmVzIHRoZSB2YWx1ZSBpbnRvIGBfc3RhZ2VSZWFkc2AgKGhpc3RvcmljYWwgZGVmYXVsdCksXG4gICAqIGAnc3VtbWFyeSdgIHJlY29yZHMgYSBjaGVhcCBtYXJrZXIsIGAnb2ZmJ2AgcmVjb3JkcyBub3RoaW5nLlxuICAgKi9cbiAgZ2V0VmFsdWUocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICAvLyBUaGUgcmVjb3JkIGZyYW1lIHNlcnZlcyB0aGUgdmFsdWUgKHR3byB0aWVycykgYW5kIGtlZXBzIHRoZSBwZXItd3JpdGVcbiAgICAvLyBwcm92ZW5hbmNlIHJlZ2lzdHJ5ICgjUDEpIOKAlCBrZXkgc3RyaW5ncyBvbmx5LCBpbmRlcGVuZGVudCBvZiB0aGVcbiAgICAvLyByZWFkVHJhY2tpbmcgcmV0ZW50aW9uIGRpYWwgKHdoaWNoIGdvdmVybnMgVkFMVUUgcmV0ZW50aW9uIGJlbG93KS5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucmVjb3JkLnJlYWQocGF0aCwga2V5KTtcbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHRoaXMucmVjb3JkLm5vdGVSZWFkKHBhdGgsIGtleSk7XG4gICAgLy8gVGhlIHZlcmRpY3QsIG9uY2Ug4oCUIGZvciB0aGUgcmV0YWluZWQgcmVhZCBiZWxvdyBhbmQgdGhlIHNlbGVjdGVkLXJlYWRcbiAgICAvLyBjb3VudCAoYHNlbGVjdGVkUmVhZHNgKS4gTm8gcG9saWN5IGFuZCBubyBtYXJrcyDihpIgbm8gdmVyZGljdCBjYWxsLCBub1xuICAgIC8vIGFsbG9jYXRpb24gKGFjdGl2ZVJ1bGUpLlxuICAgIGNvbnN0IHJ1bGUgPSBrZXkgIT09IHVuZGVmaW5lZCA/IHRoaXMuYWN0aXZlUnVsZSgpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHZlcmRpY3QgPSBydWxlICE9PSB1bmRlZmluZWQgPyBydWxlLnZlcmRpY3RBdChwYXRoLCBrZXkgYXMgc3RyaW5nKSA6IENMRUFSO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRSZWFkcyArPSAxO1xuICAgICAgLy8gQW4gb2JqZWN0IHJlYWQgdW5kZXIgYSBzZWxlY3RlZCBuYW1lLCB3cml0dGVuIGJhY2sgdW5kZXIgYW5vdGhlciwga2VlcHMgaXRzIHJ1bGUgKHN0YWdlV3JpdGUpLlxuICAgICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpICh0aGlzLl9zZWxlY3RlZE9iamVjdHMgPz89IG5ldyBXZWFrTWFwKCkpLnNldCh2YWx1ZSwgdmVyZGljdCk7XG4gICAgfVxuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgcmVhZCAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3IOKAlCByZXRhaW5lZCB1bmRlclxuICAgIC8vIHRoZSBydWxlJ3MgdmVyZGljdCAoOS4xOS4wKTogYSByZWRhY3RlZCBrZXkgaXMgcmV0YWluZWQgYXMgdGhlXG4gICAgLy8gcGxhY2Vob2xkZXIsIGEgZmllbGQtbGV2ZWwga2V5IGFzIGEgc2NydWJiZWQgY2xvbmUsIG5ldmVyIHRoZSBzZWNyZXQuXG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMucG9saWN5LnJlYWRUcmFja2luZyAhPT0gJ29mZicpIHtcbiAgICAgIGlmIChwYXRoLmxlbmd0aCA+IDApICh0aGlzLl9uZXN0ZWRSZWFkcyA/Pz0gbmV3IFNldCgpKS5hZGQodXNlcktleU9mKHBhdGgsIGtleSkpO1xuICAgICAgZWxzZSBpZiAodGhpcy5wb2xpY3kucmVhZFRyYWNraW5nID09PSAnZnVsbCcgJiYgaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgaWYgKHRoaXMucmVjb3JkLmhhc1N0YWdlZCkgdGhpcy5fdmlld1JlYWRzPy5kZWxldGUoa2V5KTtcbiAgICAgICAgZWxzZSAodGhpcy5fdmlld1JlYWRzID8/PSBuZXcgU2V0KCkpLmFkZChrZXkpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3RhZ2VSZWFkc1t1c2VyS2V5T2YocGF0aCwga2V5KV0gPVxuICAgICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IHRoaXMucmV0YWluZWRGb3JtKHZlcmRpY3QsIHZhbHVlLCB0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcsIHN1bW1hcml6ZVJlYWRWYWx1ZSk7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBgW1JFQURdICR7ZGVzY3JpcHRpb259YCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIb3cgbWFueSB0cmFja2VkIHJlYWRzIG9mIHRoaXMgZnJhbWUgcmVhZCBhIHZhbHVlIHRoZSBydW4ncyBydWxlIHNlbGVjdHNcbiAgICogKGEga2V5IGl0IG1hc2tzIHdob2xlLCBvciBvbmUgd2l0aCBzZWNyZXQgZmllbGRzKS4gQSBib3VuZGFyeSB0aGF0IG1hcHNcbiAgICogd2hhdCBhIHN0YWdlIGZ1bmN0aW9uIFJFQUQgaW50byBhIG5ldyBuYW1lIOKAlCB0aGUgYHBhcmFsbGVsRm9yRWFjaGAgaXRlbXNcbiAgICogc2VsZWN0b3Ig4oCUIGNvbXBhcmVzIGl0IGJlZm9yZSBhbmQgYWZ0ZXIsIGFzIGEgc3ViZmxvdyBtYXBwZXIncyB0YWludCBkb2VzXG4gICAqIChgbWVtb3J5L3JlZGFjdGlvbi50cyDCtyBNYXBwZXJUYWludGApLiBBbHdheXMgMCB3aXRob3V0IGEgcG9saWN5IG9yIGEgbWFyay5cbiAgICovXG4gIGdldCBzZWxlY3RlZFJlYWRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkUmVhZHM7XG4gIH1cblxuICAvKiogUmVhZCBzdGF0ZSB3aXRob3V0IHRyYWNraW5nIGluIF9zdGFnZVJlYWRzIG9yIHBheWluZyBzdHJ1Y3R1cmVkQ2xvbmUgY29zdC5cbiAgICogIFVzZWQgYnkgU2NvcGVGYWNhZGUuZ2V0VmFsdWVTaWxlbnQoKSBmb3IgYXJyYXkgcHJveHkgaW50ZXJuYWwgb3BlcmF0aW9ucy4gKi9cbiAgZ2V0VmFsdWVEaXJlY3QocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5yZWFkKHBhdGgsIGtleSk7XG4gIH1cblxuICBnZXRSb290KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnJlYWRMaXZlKGtleSk7XG4gIH1cblxuICBnZXRHbG9iYWwoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQucmVhZEdsb2JhbChrZXkpO1xuICB9XG5cbiAgZ2V0U2NvcGUoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5zdGF0ZS5nZXRTdGF0ZSgpO1xuICB9XG5cbiAgZ2V0UnVuSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDb21taXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDI6IHJlY29yZCB0aGF0IHRoaXMgc3RhZ2UgY29uc3VtZWQgYW4gdW50cmFja2VkIHJlYWQgcGF0aC5cbiAgICogQ2FsbGVkIGJ5IGBTY29wZUZhY2FkZWAgKGBnZXRBcmdzYC9gZ2V0RW52YC91bnNoYWRvd2VkIGBnZXRWYWx1ZVNpbGVudGApO1xuICAgKiBzdXJmYWNlZCBhcyBgQ29tbWl0QnVuZGxlLnVudHJhY2tlZFNvdXJjZXNgIG9uIHRoaXMgc3RhZ2UncyBjb21taXQuXG4gICAqL1xuICBtYXJrVW50cmFja2VkU291cmNlKHNvdXJjZTogVW50cmFja2VkU291cmNlKTogdm9pZCB7XG4gICAgKHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPz89IG5ldyBTZXQoKSkuYWRkKHNvdXJjZSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgdGhhdCBmaXJlcyBhZnRlciBjb21taXQoKSBhcHBsaWVzIHBhdGNoZXMuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGRpc3BhdGNoIFNjb3BlUmVjb3JkZXIub25Db21taXQgZXZlbnRzLiAqL1xuICBzZXRDb21taXRPYnNlcnZlcihcbiAgICBvYnNlcnZlcjogKG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4pID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyID0gb2JzZXJ2ZXI7XG4gIH1cblxuICAvKipcbiAgICogRGV2LW1vZGUgb25seTogZGlkIHRoaXMgc3RhZ2UgY2hhbmdlLCBJTiBQTEFDRSwgYSB2YWx1ZSBpdCBtZXJlbHkgUkVBRD9cbiAgICpcbiAgICogVGhlIHR5cGVkIHNjb3BlIGludGVyY2VwdHMgZXZlcnkgd3JpdGUgaXQgY2FuIHJlYWNoIOKAlCBhIHByb3BlcnR5IGF0IGFueVxuICAgKiBkZXB0aCwgYW4gaW5kZXhlZCBlbGVtZW50LCBhbiBhcnJheSBtZXRob2QuIFdoYXQgaXQgY2Fubm90IHJlYWNoIGlzIGFuXG4gICAqIGVsZW1lbnQgaGFuZGVkIG91dCBieSBhIHJlYWQgbWV0aG9kIChgZmluZGAsIGBmaWx0ZXJgLCBgZm9y4oCmb2ZgLFxuICAgKiBgZm9yRWFjaGAsIGRlc3RydWN0dXJpbmcpOiB3cmFwcGluZyB0aG9zZSB3b3VsZCBtZWFuIHJldHVybmluZyBwcm94aWVzIG91dFxuICAgKiBvZiBldmVyeSByZWFkLCB3aGljaCBpcyBhIGNvc3QgdGhlIGxpYnJhcnkgc2hvdWxkIG5vdCBwYXkuIFNvIHRoYXQgZmFtaWx5XG4gICAqIGlzIFdBUk5FRCBBQk9VVCByYXRoZXIgdGhhbiBpbnRlcmNlcHRlZCDigJQgbG91ZGx5LCBoZXJlLCBpbnN0ZWFkIG9mIGVuZGluZ1xuICAgKiB0aGUgcnVuIHdpdGggYSBjb21taXQgbG9nIHRoYXQgc2lsZW50bHkgZGlzYWdyZWVzIHdpdGggZmluYWwgc3RhdGUuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBSRVBPUlQgYWZ0ZXIgdGhlIGZhY3QsIG5vdCBhIHJlZnVzYWwgYXQgdGhlIHdyaXRlOiB0aGUgd3JpdGUgaGFzXG4gICAqIGFscmVhZHkgaGFwcGVuZWQgaW4gcGxhY2UgYW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW50ZXJjZXB0LiBJdCBydW5zIHVuZGVyXG4gICAqIFRXTyBwcmVjb25kaXRpb25zLCBib3RoIG5hbWVkIGluIHRoZSBSRUFETUUg4oCUIGBlbmFibGVEZXZNb2RlKClgLCBhbmRcbiAgICogYHJlYWRUcmFja2luZzogJ2Z1bGwnYCAodGhlIGRlZmF1bHQpLCBiZWNhdXNlIHRoZSBjb21wYXJpc29uIG5lZWRzIHRoZVxuICAgKiBjbG9uZSBvZiB0aGUgdmFsdWUgdGhhdCBtb2RlIHJldGFpbnMgYXQgcmVhZCB0aW1lLiBBIGtleSB0aGUgc3RhZ2UgbmV2ZXJcbiAgICogc3RhZ2VkIG11c3Qgc3RpbGwgaG9sZCB0aGF0IGNsb25lIOKAlCBjb21taXR0ZWQgc3RhdGUgaXMgaW1tdXRhYmxlLWFmdGVyLXN3YXBcbiAgICogYW5kIHRoZSBidWZmZXIncyB3b3JraW5nIGNvcHkgaXMgcHJpdmF0ZSB0byB0aGlzIHN0YWdlLiBLZXlzIHRoZSBzdGFnZSBESURcbiAgICogc3RhZ2UgYXJlIHNraXBwZWQgKHRoZXkgYXJlIGV4cGVjdGVkIHRvIGRpZmZlciwgYW5kIHRoZXkgYXJlIGluIHRoZSByZWNvcmQpLFxuICAgKiBzbyBhcmUga2V5cyB1bmRlciBhIHJlZGFjdGlvbiB2ZXJkaWN0LCB3aG9zZSByZXRhaW5lZCBmb3JtIGlzIGRlbGliZXJhdGVseVxuICAgKiBub3QgdGhlIHZhbHVlLCBhbmQgc28gYXJlIGtleXMgcmVhZCBhdCBhIG5lc3RlZCBwYXRoIChgX25lc3RlZFJlYWRzYCkg4oCUXG4gICAqIHRob3NlIGFyZSBlbmdpbmUgcmVhZHMgKHRoZSBzdWJmbG93IG1lcmdlLWJhY2spLCBub3QgdXNlciByZWFkcy5cbiAgICpcbiAgICogSXQgYWxzbyBvbmx5IGxvb2tzIGF0IGtleXMgc2VydmVkIGZyb20gdGhlIFBJTk5FRCBzb3VyY2Ug4oCUIHRoZSBmaXJzdC10b3VjaFxuICAgKiB2aWV3IG9yIHRoaXMgc3RhZ2UncyBvd24gYnVmZmVyLiBBIGtleSBhYnNlbnQgZnJvbSBib3RoIHdhcyBzZXJ2ZWQgYnkgdGhlXG4gICAqIHJlYWQncyBsaXZlIGZhbGxiYWNrIChgUmVjb3JkRnJhbWUgwrcgcmVhZGAsIHRpZXIgMiksIHdoaWNoIGEgcGFyYWxsZWwgc2libGluZydzIHJvb3Qta2V5IGNvbW1pdCBjYW5cbiAgICogbGVnaXRpbWF0ZWx5IG1vdmU7IGFjY3VzaW5nIHRoZSBzdGFnZSB0aGVyZSB3b3VsZCBiZSBhIGZhbHNlIGFsYXJtLiBGb3JcbiAgICogdGhlIHNhbWUgcmVhc29uIGl0IHJ1bnMgb24gdGhlIGZyYW1lJ3MgRklSU1QgY29tbWl0IG9ubHk6IHRoZSByZWFkcyBiZWxvbmdcbiAgICogdG8gdGhhdCByb3VuZCwgYW5kIGJ5IHRoZSBlbmdpbmUncyBzZWNvbmQgcm91bmQgKGEgZm9yayBkb3VibGUtY29tbWl0LCBhXG4gICAqIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgY29tbWl0dGVkIGJyYW5jaCBwYXJlbnQpIG90aGVyIHN0YWdlcyBoYXZlXG4gICAqIGxlZ2l0aW1hdGVseSBtb3ZlZCB0aGUgc3RhdGUgdGhleSB3ZXJlIGNvbXBhcmVkIGFnYWluc3QuXG4gICAqXG4gICAqIEEga2V5IHRoZSBzdGFnZSBESUQgc3RhZ2UgaXMgc3RpbGwgY2hlY2tlZCB3aGVuIGl0cyBsYXN0IHJlYWQgY2FtZSBmcm9tXG4gICAqIGNvbW1pdHRlZCBzdGF0ZSAoe0BsaW5rIF92aWV3UmVhZHN9IOKAlCByZWFkIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUpOlxuICAgKiB0aGF0IHJlYWQgd2FzIHRoZSBjb21taXR0ZWQgb2JqZWN0IGl0c2VsZiwgYW5kIHRoZSBidWZmZXIncyBkaWZmIGJhc2UgSVNcbiAgICogdGhhdCBvYmplY3QgKGNvcHktb24td3JpdGUsIDkuMjkuMCksIHNvIGFuIGluLXBsYWNlIGVkaXQgZm9sbG93ZWQgYnkgYVxuICAgKiB3cml0ZSBvZiB0aGUga2V5IGNvbW1pdHMgTk8gY2hhbmdlIOKAlCBsaXZlIHN0YXRlIGtlZXBzIHRoZSBlZGl0LCB0aGUgbG9nXG4gICAqIGRvZXMgbm90LiBDb21wYXJlZCBhZ2FpbnN0IGNvbW1pdHRlZCBzdGF0ZSwgbm90IHRoZSB3cml0dGVuIHZhbHVlLCBzbyBhXG4gICAqIGxlZ2l0aW1hdGUgd3JpdGUgbmV2ZXIgdHJpcHMgaXQuXG4gICAqXG4gICAqIENvc3RzIG5vdGhpbmcgb3V0c2lkZSBgZW5hYmxlRGV2TW9kZSgpYC5cbiAgICovXG4gIHByaXZhdGUgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIWlzRGV2TW9kZSgpIHx8IHRoaXMucG9saWN5LnJlYWRUcmFja2luZyAhPT0gJ2Z1bGwnIHx8IHRoaXMuX2NvbW1pdHRlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLl9zdGFnZVJlYWRzKSkge1xuICAgICAgY29uc3QgcmV0YWluZWQgPSB0aGlzLl9zdGFnZVJlYWRzW2tleV07XG4gICAgICAvLyBPbmx5IGEgY29udGFpbmVyIGNhbiBiZSBtdXRhdGVkIGluIHBsYWNlOyBhIHByaW1pdGl2ZSByZWFkIGNhbm5vdC5cbiAgICAgIGlmIChyZXRhaW5lZCA9PT0gbnVsbCB8fCB0eXBlb2YgcmV0YWluZWQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLl9uZXN0ZWRSZWFkcz8uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHJ1bGUgIT09IHVuZGVmaW5lZCAmJiBydWxlLnZlcmRpY3RBdChbXSwga2V5KS5raW5kICE9PSAnY2xlYXInKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZWQgPSB0aGlzLnJlY29yZC5hdChbXSwga2V5KTtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fc3RhZ2VXcml0ZXMsIGtleSkgfHwgdGhpcy5yZWNvcmQud2FzU3RhZ2VkKG5hbWVzcGFjZWQpKSB7XG4gICAgICAgIHRoaXMud2Fybk9uQ29tbWl0dGVkTXV0YXRpb24oa2V5LCBuYW1lc3BhY2VkLCByZXRhaW5lZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgcGlubmVkIHNvdXJjZSBvbmx5IOKAlCBzZWUgdGhlIG5vdGUgb24gdGhlIGxpdmUgZmFsbGJhY2sgYWJvdmUuXG4gICAgICAvLyBgcGVla2AsIG5vdCBgZ2V0YDogYSByZXBvcnQgY29tcGFyZXMsIGFuZCBtdXN0IG5vdCB0YWtlIHRoZSBwcml2YXRlXG4gICAgICAvLyBjb3B5IGEgc3RhZ2UncyByZWFkIHdvdWxkIChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLlxuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMucmVjb3JkLnBlZWsobmFtZXNwYWNlZCk7XG4gICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcGF0aCA9IGZpcnN0RGlmZmVyaW5nUGF0aChyZXRhaW5lZCwgY3VycmVudCk7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oYm9ycm93ZWRNdXRhdGlvbk1lc3NhZ2UodGhpcy5zdGFnZU5hbWUsIGtleSwgcGF0aCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgc3RhZ2VkLWtleSBoYWxmIG9mIHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufTogZGlkIGNvbW1pdHRlZCBzdGF0ZSBpdHNlbGYgbW92ZSB1bmRlciBhIHJlYWQ/ICovXG4gIHByaXZhdGUgd2Fybk9uQ29tbWl0dGVkTXV0YXRpb24oa2V5OiBzdHJpbmcsIG5hbWVzcGFjZWQ6IHN0cmluZ1tdLCByZXRhaW5lZDogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fdmlld1JlYWRzPy5oYXMoa2V5KSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbW1pdHRlZCA9IHRoaXMucmVjb3JkLmJhc2VBdChuYW1lc3BhY2VkKTtcbiAgICBpZiAoY29tbWl0dGVkID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBwYXRoID0gZmlyc3REaWZmZXJpbmdQYXRoKHJldGFpbmVkLCBjb21taXR0ZWQpO1xuICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2Fybihjb21taXR0ZWRNdXRhdGlvbk1lc3NhZ2UodGhpcy5zdGFnZU5hbWUsIGtleSwgcGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHN0YWdlZCB3cml0ZXMgdG8gc2hhcmVkIG1lbW9yeSBhbmQgUkVMRUFTRSB0aGUgcGVyLXN0YWdlIHN0YWdpbmdcbiAgICogc3RhdGUgKCMxM2IpLlxuICAgKlxuICAgKiBgcGhhc2VgICg5LjM5LjApIGlzIHRoZSBjYWxsZXIncyBzdGF0ZW1lbnQgb2Ygd2hhdCBhIENPTlRJTlVBVElPTiBjb21taXRcbiAgICogaXMg4oCUIGAnZXhpdCdgIGZyb20gYSBzdWJmbG93IG1vdW50J3MgZXhpdCwgYCdyZXBlYXQnYCBmcm9tIGEgZm9ya1xuICAgKiBmYW4tb3V0J3Mgc2V0dGxlLiBJdCBpcyBzdGFtcGVkIG9uIHRoZSBidW5kbGUgKGBDb21taXRCdW5kbGUucGhhc2VgKSBvbmx5XG4gICAqIHdoZW4gdGhpcyBmcmFtZSBoYXMgQUxSRUFEWSBjb21taXR0ZWQ6IHRoZSBGSVJTVCBidW5kbGUgb2YgYW4gZXhlY3V0aW9uXG4gICAqIGlzIHRoZSBzdGFnZSdzIG93biBhbmQgbmV2ZXIgY2FycmllcyBhIGBwaGFzZWAg4oCUIHNvIGEgbW91bnQgd2l0aG91dCBhblxuICAgKiBgb3V0cHV0TWFwcGVyYCAoYSBsYXp5IG1vdW50LCBldmVyeSBgcGFyYWxsZWxGb3JFYWNoYCBicmFuY2gpLCB3aG9zZSBleGl0XG4gICAqIGlzIGl0cyBvbmx5IGJ1bmRsZSwgcmVjb3JkcyB0aGF0IGJ1bmRsZSBhcyBpdHMgb3duLCB0YWdzIGFuZCBhbGwuXG4gICAqXG4gICAqIENvbW1pdCBpcyB0aGUgc3RhZ2UncyBsaWZlY3ljbGUgZW5kOiB0aGUgcmVjb3JkIGZyYW1lJ3MgYnVmZmVyIGFuZFxuICAgKiBmaXJzdC10b3VjaCBiYXNlIGFyZSBvbmx5IG5lZWRlZCBEVVJJTkcgZXhlY3V0aW9uLCBhcyB0aGUgcmVhZCBzbmFwc2hvdCArXG4gICAqIG5ldC1jaGFuZ2UgZGlmZiBiYXNlLCBzbyB0aGUgcmVjb3JkIGZyYW1lIHJlbGVhc2VzIHRoZW0gb25jZSB0aGUgY29tbWl0XG4gICAqIGhhcyBsYW5kZWQgYW5kIHRoZSBvYnNlcnZlciBoYXMgc2VlbiBpdCAoYFJlY29yZEZyYW1lIMK3IHJlbGVhc2VgIOKAlCB3aHkgYVxuICAgKiBmcmFtZSB0aGF0IGtlcHQgdGhlbSB3b3VsZCByZXRhaW4gb25lIHN0YXRlIGdlbmVyYXRpb24gcGVyIGV4ZWN1dGVkXG4gICAqIHN0YWdlLCBhbmQgd2h5IGEgcmUtdXNlZCBmcmFtZSByZS1hbmNob3JzIG9uIGN1cnJlbnQgc3RhdGUsIGlzIHRoZXJlKS5cbiAgICpcbiAgICogUkUtVVNFIEFGVEVSIENPTU1JVCBzdGF5cyBjb3JyZWN0IGJlY2F1c2UgYm90aCByZS1jcmVhdGUgbGF6aWx5OlxuICAgKiAtIGEgbGF0ZXIgUkVBRCByZS1hbmNob3JzIG9uIHRoZSBDVVJSRU5UIGNvbW1pdHRlZCBzdGF0ZSAod2hpY2ggaW5jbHVkZXNcbiAgICogICB0aGlzIHN0YWdlJ3Mgb3duIGZsdXNoZWQgd3JpdGVzKTtcbiAgICogLSBhIGxhdGVyIFdSSVRFIGNvbnN0cnVjdHMgYSBmcmVzaCBidWZmZXIgb24gdGhhdCByZS1hbmNob3JlZCB2aWV3LCBzbyBhXG4gICAqICAgc2Vjb25kIGNvbW1pdCBkaWZmcyBhZ2FpbnN0IHBvc3QtZmlyc3QtY29tbWl0IHN0YXRlLiBUaGUgcHJlLXJlbGVhc2VcbiAgICogICBidWZmZXIgYmVoYXZlZCB0aGUgc2FtZSBmb3IgVkFMVUVTIChpdHMgYHdvcmtpbmdDb3B5YCB3YXMgcmVzZXQgb25cbiAgICogICBjb21taXQsIGZhbGxpbmcgcmVhZHMgdGhyb3VnaCB0byBsaXZlIHN0YXRlKSBidXQga2VwdCB0aGUgT1JJR0lOQUxcbiAgICogICBgYmFzZVNuYXBzaG90YCBhcyBkaWZmIGJhc2Ug4oCUIHVucmVhY2hhYmxlIGluIHByYWN0aWNlOiB0aGUgZW5naW5lJ3NcbiAgICogICBvbmx5IHdyaXRlcyBhZnRlciBhIGNvbW1pdCBhcmUgdGhlIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgY29tbWl0dGVkXG4gICAqICAgYnJhbmNoIHBhcmVudCAoYSBkZWNpZGVyIG9yIGZvcmsgZnJhbWUgY29tbWl0cyBiZWZvcmUgaXRzIGJyYW5jaCBydW5zKTtcbiAgICogICB0aGUgb3RoZXIgXCJ3cml0ZSBhZnRlciBjb21taXRcIlxuICAgKiAgIHNpdGVzIChTdWJmbG93RXhlY3V0b3Igc2VlZCDihpIgcmVwbGFjZXMgdGhlIGNvbnRleHQ7IHJlc3VtZSDihpIgZnJlc2hcbiAgICogICBjb250ZXh0IHZpYSBgbGVhZi5jcmVhdGVOZXh0YCkgbmV2ZXIgcmUtdXNlIGEgY29tbWl0dGVkIGNvbnRleHQuXG4gICAqIC0gQSBVU0VSIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIGlzIGEgZGlmZmVyZW50IG1hdHRlcjogaXRzIHdyaXRlc1xuICAgKiAgIHdvdWxkIGxhbmQgaW4gYSBidWZmZXIgbm90aGluZyBldmVyIGNvbW1pdHMuIFRoYXQgcmVmdXNhbCBsaXZlcyBvbiB0aGVcbiAgICogICBzY29wZSB0aWVyIChgU2NvcGVGYWNhZGVgLCBzZWFsZWQgYnkgdGhlIGNvbW1pdCBvYnNlcnZlciDigJQgOS4yMi4wKSxcbiAgICogICBiZWNhdXNlIHRoZSBmcmFtZSdzIHJlLXVzYWJpbGl0eSBpcyBleGFjdGx5IHdoYXQgdGhlIGVuZ2luZSBwYXRoc1xuICAgKiAgIGFib3ZlIG5lZWQuXG4gICAqIC0gYF9zdGFnZVdyaXRlc2AgLyBgX3N0YWdlUmVhZHNgIGFyZSBOT1QgcmVsZWFzZWQg4oCUIGBzbmFwc2hvdFNlbGYoKWBcbiAgICogICByZWFkcyB0aGVtIHBvc3QtcnVuIGZvciB0aGUgZXhlY3V0aW9uLXRyZWUgc25hcHNob3QuXG4gICAqL1xuICBjb21taXQocGhhc2U/OiBDb21taXRQaGFzZSk6IHZvaWQge1xuICAgIC8vIEEgY29udGludWF0aW9uIG9ubHkgQUZURVIgdGhlIGV4ZWN1dGlvbidzIG93biBidW5kbGUgKHNlZSBhYm92ZSkuXG4gICAgY29uc3QgY29udGludWF0aW9uID0gdGhpcy5fY29tbWl0dGVkID8gcGhhc2UgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXRlcmlhbGlzZVdyaXRlcygpO1xuICAgIHRoaXMud2Fybk9uQm9ycm93ZWRNdXRhdGlvbigpO1xuICAgIC8vIFRoZSByZWNvcmQncyBoYWxmIChgUmVjb3JkRnJhbWUgwrcgY29tbWl0YCDihpIgYHJlY29yZENvbW1pdC50c2ApLiBObyBidWZmZXJcbiAgICAvLyA9IG5vIHdyaXRlIGV2ZXIgYnVpbHQgb25lICgjMTMpOiB0aGUgY29tbWl0IGlzIGVtcHR5IGJ5IGNvbnN0cnVjdGlvbixcbiAgICAvLyByZWNvcmRlZCB3aXRoIFpFUk8gY2xvbmVzLiBUaGUgbmFtZXMgYXJlIHJlYWQgb25jZSB0aGUgcGF5bG9hZCBpcyBidWlsdC5cbiAgICB0aGlzLnJlY29yZC5jb21taXQoKCkgPT4gKHtcbiAgICAgIHN0YWdlOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgdW50cmFja2VkU291cmNlczogdGhpcy5fdW50cmFja2VkU291cmNlcyxcbiAgICAgIHRhZ3M6IHRoaXMudGFncyxcbiAgICAgIHBoYXNlOiBjb250aW51YXRpb24sXG4gICAgfSkpO1xuICAgIC8vIFRoZSBvYnNlcnZlciAoU2NvcGVGYWNhZGUpIHNlZXMgdGhlIHRyYWNrZWQgbXV0YXRpb25zLCBUSEVOIHRoZSBzdGFnaW5nXG4gICAgLy8gc3RhdGUgaXMgcmVsZWFzZWQgKCMxM2IpLCBzbyBpdCBzZWVzIHRoZSB3b3JsZCBhcyBpdCB3YXMuIEQyJ3MgbWFya2Vyc1xuICAgIC8vIGFuZCB0aGUgZGVjbGFyZWQgdGFncyByZWxlYXNlIHdpdGggaXQg4oCUIG9uZSBzdGFtcCBwZXIgZXhlY3V0aW9uLCBzbyB0aGVcbiAgICAvLyBlbmdpbmUncyBkb3VibGUtY29tbWl0IHBhdGhzIHJlY29yZCB0aGVtIGV4YWN0bHkgb25jZS5cbiAgICBpZiAodGhpcy5fY29tbWl0T2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyKHsgLi4udGhpcy5fc3RhZ2VXcml0ZXMgfSk7XG4gICAgfVxuICAgIHRoaXMucmVjb3JkLnJlbGVhc2UoKTtcbiAgICB0aGlzLl91bnRyYWNrZWRTb3VyY2VzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudGFncyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jb21taXR0ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93IGF3YXkgZXZlcnl0aGluZyB0aGlzIHN0YWdlIGhhcyBTVEFHRUQsIHdpdGhvdXQgY29tbWl0dGluZyBhbnkgb2YgaXQuXG4gICAqXG4gICAqIFRoZSBpc29sYXRpb24gcHJpbWl0aXZlIGJlaGluZCBkZWNsYXJhdGl2ZSByZXRyeTogd2hlbiBhIG5vbi1maW5hbCBhdHRlbXB0XG4gICAqIGZhaWxzLCB0aGUgd3JpdGVzIGl0IHN0YWdlZCBtdXN0IG5vdCBiZSB2aXNpYmxlIHRvIHRoZSBuZXh0IGF0dGVtcHQsIG11c3RcbiAgICogbm90IHJlYWNoIHNoYXJlZCBzdGF0ZSwgYW5kIG11c3Qgbm90IGFwcGVhciBpbiB0aGUgY29tbWl0IGxvZyBvciBpbiB0aGlzXG4gICAqIHN0YWdlJ3Mgc25hcHNob3QuIERyb3BwaW5nIHRoZSBzdGFnaW5nIHN0YXRlIGFjaGlldmVzIGFsbCBmb3VyIGF0IG9uY2Ug4oCUXG4gICAqIHRoZXJlIGlzIG5vIHJvbGxiYWNrIG1hY2hpbmVyeSB0byBpbnZva2UgYmVjYXVzZSBub3RoaW5nIHdhcyBldmVyIGFwcGxpZWRcbiAgICogKE0xOiB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyIGhvbGRzIHdyaXRlcyB1bnRpbCBgY29tbWl0KClgIGZsdXNoZXMgdGhlbSkuXG4gICAqXG4gICAqIFdoYXQgaXMgcmVsZWFzZWQsIGFuZCB3aHkgZWFjaCBvbmUgbWF0dGVycyBmb3IgdGhlIG5leHQgYXR0ZW1wdDpcbiAgICogIC0gdGhlIHJlY29yZCBmcmFtZSdzIHN0YWdlZCBzdGF0ZSAoYFJlY29yZEZyYW1lIMK3IGRpc2NhcmRgKSDigJQgdGhlIGJ1ZmZlclxuICAgKiAgICAgICAgICAgICAgICAgICAgKHRoZSBuZXh0IGF0dGVtcHQgc3RhcnRzIHdpdGggbm90aGluZyBzdGFnZWQpLCB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgIGZpcnN0LXRvdWNoIGJhc2UgKGl0IHJlLWFuY2hvcnMgb24gY29tbWl0dGVkIHN0YXRlIGFzXG4gICAqICAgICAgICAgICAgICAgICAgICBpdCBzdGFuZHMgTk9XIOKAlCBhIHNpYmxpbmcgZm9yayBicmFuY2ggbWF5IGxlZ2l0aW1hdGVseVxuICAgKiAgICAgICAgICAgICAgICAgICAgaGF2ZSBjb21taXR0ZWQgaW4gYmV0d2VlbikgYW5kIHRoZSByZWFkS2V5cyBsaXN0ICgjUDE6XG4gICAqICAgICAgICAgICAgICAgICAgICBhIGRpc2NhcmRlZCBhdHRlbXB0J3MgcmVhZHMgbXVzdCBuZXZlciByZWFjaCB0aGUgbmV4dFxuICAgKiAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCdzIGBUcmFjZUVudHJ5LnJlYWRLZXlzYCk7XG4gICAqICAtIGBfc3RhZ2VXcml0ZXNgIC8gYF9wZW5kaW5nV3JpdGVzYCAvIGBfc3RhZ2VSZWFkc2Ag4oCUIHRoZSBzbmFwc2hvdFxuICAgKiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDsgd2l0aG91dCB0aGUgcmVzZXQgdGhlIGV4ZWN1dGlvbiB0cmVlIHdvdWxkXG4gICAqICAgICAgICAgICAgICAgICAgICByZXBvcnQgd3JpdGVzIHRoYXQgd2VyZSBkaXNjYXJkZWQsIHdoaWNoIGlzIHRoZSBleGFjdFxuICAgKiAgICAgICAgICAgICAgICAgICAgbGllIHRoaXMgZmVhdHVyZSBleGlzdHMgdG8gcHJldmVudCAodGhlIHBlbmRpbmcgbWFwXG4gICAqICAgICAgICAgICAgICAgICAgICBob2xkcyBiYXJlIHJlZmVyZW5jZXMg4oCUIGRyb3BwaW5nIGl0IHVuLWNsb25lcyBub3RoaW5nKTtcbiAgICogIC0gYF91bnRyYWNrZWRTb3VyY2VzYCDigJQgdGhlIEQyIGhvbmVzdHkgbWFya2VycywgcmVsZWFzZWQgd2l0aCB0aGUgcmVzdC5cbiAgICpcbiAgICogV2hhdCBpcyBkZWxpYmVyYXRlbHkgS0VQVDogYGRlYnVnYCAobG9ncywgbWV0cmljcywgZXJyb3JzLCBmbG93IG1lc3NhZ2VzKS5cbiAgICogRGlhZ25vc3RpY3MgYXJlIHRoZSBhcHBlbmQtb25seSByZWNvcmQgb2Ygd2hhdCBldmVyeSBhdHRlbXB0IGRpZCwgYW5kIHRoZVxuICAgKiByZXRyeSBmZWF0dXJlJ3Mgd2hvbGUgcG9pbnQgaXMgdGhhdCB0aGUgZWFybGllciBhdHRlbXB0cyBzdGF5IHZpc2libGUuXG4gICAqXG4gICAqIE5vIGNvbW1pdCBpcyByZWNvcmRlZCBhbmQgbm8gb2JzZXJ2ZXIgZmlyZXMg4oCUIGEgZGlzY2FyZGVkIGF0dGVtcHQgaXMgbm90IGFcbiAgICogY3Vyc29yIHN0b3AsIGJlY2F1c2UgZnJvbSBzaGFyZWQgc3RhdGUncyBwb2ludCBvZiB2aWV3IGl0IG5ldmVyIGhhcHBlbmVkLlxuICAgKi9cbiAgZGlzY2FyZFN0YWdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZC5kaXNjYXJkKCk7XG4gICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9wZW5kaW5nV3JpdGVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3N0YWdlV3JpdGVzID0ge307XG4gICAgdGhpcy5fc3RhZ2VSZWFkcyA9IHt9O1xuICAgIHRoaXMuX25lc3RlZFJlYWRzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3ZpZXdSZWFkcyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUcmVlIG5hdmlnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIENyZWF0ZSAob3IgcmV0dXJuKSB0aGlzIGNvbnRleHQncyBsaW5rZWQgc3VjY2Vzc29yLlxuICAgKlxuICAgKiBNRU1PSVpFRDogdGhlIGZpcnN0IGNhbGwgY3JlYXRlcyBgdGhpcy5uZXh0YDsgZXZlcnkgbGF0ZXIgY2FsbCByZXR1cm5zXG4gICAqIHRoYXQgU0FNRSBjb250ZXh0IGFuZCBJR05PUkVTIGl0cyBhcmd1bWVudHMuIEluIG5vcm1hbCB0cmF2ZXJzYWwgZWFjaFxuICAgKiBjb250ZXh0IGFkdmFuY2VzIGV4YWN0bHkgb25jZSwgc28gdGhlIG1lbW8gbmV2ZXIgYml0ZXMg4oCUIGJ1dCBhIGNhbGxlclxuICAgKiBleHBlY3RpbmcgYSBmcmVzaCBjb250ZXh0IGZvciBkaWZmZXJlbnQgYHN0YWdlTmFtZWAvYHN0YWdlSWRgIGFyZ3MgZ2V0c1xuICAgKiB0aGUgb2xkIG9uZSBzaWxlbnRseS4gRGV2IG1vZGUgKGBlbmFibGVEZXZNb2RlKClgKSB3YXJucyBvbiB0aGF0XG4gICAqIG1pc21hdGNoIChiYWNrbG9nIEI0KS5cbiAgICovXG4gIGNyZWF0ZU5leHQocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nLCBpc0RlY2lkZXIgPSBmYWxzZSk6IFN0YWdlQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLm5leHQpIHtcbiAgICAgIHRoaXMubmV4dCA9IG5ldyBTdGFnZUNvbnRleHQocGF0aCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0aGlzLnJlY29yZC5zdGF0ZSwgJycsIHRoaXMucmVjb3JkLmxvZywgaXNEZWNpZGVyKTtcbiAgICAgIHRoaXMubmV4dC5wYXJlbnQgPSB0aGlzO1xuICAgICAgdGhpcy5uZXh0LmluaGVyaXRSdW4odGhpcyk7XG4gICAgfSBlbHNlIGlmIChpc0Rldk1vZGUoKSAmJiAodGhpcy5uZXh0LnN0YWdlSWQgIT09IHN0YWdlSWQgfHwgdGhpcy5uZXh0LnN0YWdlTmFtZSAhPT0gc3RhZ2VOYW1lKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtmb290cHJpbnRdIFN0YWdlQ29udGV4dC5jcmVhdGVOZXh0OiBuZXh0IGNvbnRleHQgYWxyZWFkeSBleGlzdHMgYXMgXCIke3RoaXMubmV4dC5zdGFnZU5hbWV9XCIgYCArXG4gICAgICAgICAgYChpZDogXCIke3RoaXMubmV4dC5zdGFnZUlkfVwiKSDigJQgYXJndW1lbnRzIFwiJHtzdGFnZU5hbWV9XCIgKGlkOiBcIiR7c3RhZ2VJZH1cIikgYXJlIGlnbm9yZWQgYCArXG4gICAgICAgICAgJ2FuZCB0aGUgZXhpc3RpbmcgY29udGV4dCBpcyByZXR1cm5lZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubmV4dDtcbiAgfVxuXG4gIGNyZWF0ZUNoaWxkKHJ1bklkOiBzdHJpbmcsIGJyYW5jaElkOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB9XG4gICAgY29uc3QgY2hpbGQgPSBuZXcgU3RhZ2VDb250ZXh0KHJ1bklkLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMucmVjb3JkLnN0YXRlLCBicmFuY2hJZCwgdGhpcy5yZWNvcmQubG9nLCBpc0RlY2lkZXIpO1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgY2hpbGQuaW5oZXJpdFJ1bih0aGlzKTtcbiAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIGNyZWF0ZURlY2lkZXIocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXh0KHBhdGgsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdHJ1ZSk7XG4gIH1cblxuICBzZXRBc0RlY2lkZXIoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRGVjaWRlciA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBc0ZvcmsoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRm9yayA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgRGlhZ25vc3RpY3MgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQGludGVybmFsIFJldGFpbmVkIGluY29taW5nIHZhbHVlIGZvciB0aGUgZmFjYWRlJ3MgbGVnYWN5IGVtaXQgY2hhbm5lbC4gKi9cbiAgYWRkRGlhZ25vc3RpYyhjaGFubmVsOiBEaWFnbm9zdGljQ2hhbm5lbCwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5kZWJ1Zy5hZGQoY2hhbm5lbCwga2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldExvZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0TG9nKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkTWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRNZXRyaWMoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldE1ldHJpYyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEV2YWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEV2YWwoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRXJyb3Ioa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEVycm9yKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRmxvd0RlYnVnTWVzc2FnZShcbiAgICB0eXBlOiBGbG93Q29udHJvbFR5cGUsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyB0YXJnZXRTdGFnZT86IHN0cmluZyB8IHN0cmluZ1tdOyByYXRpb25hbGU/OiBzdHJpbmc7IGNvdW50PzogbnVtYmVyOyBpdGVyYXRpb24/OiBudW1iZXIgfSxcbiAgKSB7XG4gICAgY29uc3QgZmxvd01lc3NhZ2U6IEZsb3dNZXNzYWdlID0geyB0eXBlLCBkZXNjcmlwdGlvbiwgdGltZXN0YW1wOiBEYXRlLm5vdygpLCAuLi5vcHRpb25zIH07XG4gICAgdGhpcy5kZWJ1Zy5hZGRGbG93TWVzc2FnZShmbG93TWVzc2FnZSk7XG4gIH1cblxuICAvLyDilIDilIAgU25hcHNob3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0U3RhZ2VJZCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5ydW5JZCB8fCB0aGlzLnJ1bklkID09PSAnJykgcmV0dXJuIHRoaXMuc3RhZ2VOYW1lO1xuICAgIHJldHVybiBgJHt0aGlzLnJ1bklkfS4ke3RoaXMuc3RhZ2VOYW1lfWA7XG4gIH1cblxuICBnZXRTbmFwc2hvdCgpOiBTdGFnZVNuYXBzaG90IHtcbiAgICAvLyBJdGVyYXRpdmUgd2FsayAoZXhwbGljaXQgd29yayBzdGFjayksIE5PVCByZWN1cnNpb246IHRoZSBleGVjdXRpb25cbiAgICAvLyB0cmVlIGRlZXBlbnMgYnkgb25lIGxldmVsIHBlciBleGVjdXRlZCBzdGFnZSBhbG9uZyBgbmV4dGAgY2hhaW5zLCBhbmRcbiAgICAvLyB0aGUgdHJhbXBvbGluZWQgdHJhdmVyc2VyIGFsbG93cyBjaGFpbnMvbG9vcHMgb2YgdGVucyBvZiB0aG91c2FuZHMgb2ZcbiAgICAvLyBzdGFnZXMg4oCUIGZhciBkZWVwZXIgdGhhbiBhIHJlY3Vyc2l2ZSBzZXJpYWxpemVyIGNhbiB3YWxrIGJlZm9yZVxuICAgIC8vIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgICBjb25zdCByb290ID0gdGhpcy5zbmFwc2hvdFNlbGYoKTtcbiAgICBjb25zdCB3b3JrOiBBcnJheTx7IGN0eDogU3RhZ2VDb250ZXh0OyBzbmFwOiBTdGFnZVNuYXBzaG90IH0+ID0gW3sgY3R4OiB0aGlzLCBzbmFwOiByb290IH1dO1xuICAgIHdoaWxlICh3b3JrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgY3R4LCBzbmFwIH0gPSB3b3JrLnBvcCgpITtcbiAgICAgIGlmIChjdHgubmV4dCkge1xuICAgICAgICBjb25zdCBuZXh0U25hcCA9IGN0eC5uZXh0LnNuYXBzaG90U2VsZigpO1xuICAgICAgICBzbmFwLm5leHQgPSBuZXh0U25hcDtcbiAgICAgICAgd29yay5wdXNoKHsgY3R4OiBjdHgubmV4dCwgc25hcDogbmV4dFNuYXAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY3R4LmNoaWxkcmVuKSB7XG4gICAgICAgIHNuYXAuY2hpbGRyZW4gPSBjdHguY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoaWxkU25hcCA9IGNoaWxkLnNuYXBzaG90U2VsZigpO1xuICAgICAgICAgIHdvcmsucHVzaCh7IGN0eDogY2hpbGQsIHNuYXA6IGNoaWxkU25hcCB9KTtcbiAgICAgICAgICByZXR1cm4gY2hpbGRTbmFwO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKiogU25hcHNob3Qgb2YgVEhJUyBjb250ZXh0J3Mgb3duIGZpZWxkcyDigJQgYG5leHRgL2BjaGlsZHJlbmAgYXJlIGZpbGxlZFxuICAgKiAgaW4gYnkgdGhlIGl0ZXJhdGl2ZSB3YWxrIGluIGBnZXRTbmFwc2hvdGAuICovXG4gIHByaXZhdGUgc25hcHNob3RTZWxmKCk6IFN0YWdlU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90OiBTdGFnZVNuYXBzaG90ID0ge1xuICAgICAgaWQ6IHRoaXMuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLnJ1bnRpbWVTdGFnZUlkIHx8IHVuZGVmaW5lZCxcbiAgICAgIG5hbWU6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgaXNEZWNpZGVyOiB0aGlzLmlzRGVjaWRlcixcbiAgICAgIGlzRm9yazogdGhpcy5pc0ZvcmssXG4gICAgICBsb2dzOiB0aGlzLmRlYnVnLmxvZ0NvbnRleHQsXG4gICAgICBlcnJvcnM6IHRoaXMuZGVidWcuZXJyb3JDb250ZXh0LFxuICAgICAgbWV0cmljczogdGhpcy5kZWJ1Zy5tZXRyaWNDb250ZXh0LFxuICAgICAgZXZhbHM6IHRoaXMuZGVidWcuZXZhbENvbnRleHQsXG4gICAgfTtcbiAgICBjb25zdCBzdGFnZVdyaXRlcyA9IHRoaXMucmV0YWluZWRXcml0ZXMoKTtcbiAgICBpZiAoT2JqZWN0LmtleXMoc3RhZ2VXcml0ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEV4dHJhY3QgdmFsdWVzIG9ubHkgZm9yIHRoZSBzbmFwc2hvdCAoc3RyaXAgb3BlcmF0aW9uIG1ldGFkYXRhKVxuICAgICAgY29uc3Qgd3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaywgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHN0YWdlV3JpdGVzKSkge1xuICAgICAgICB3cml0ZXNba10gPSBlbnRyeS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHNuYXBzaG90LnN0YWdlV3JpdGVzID0gd3JpdGVzO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fc3RhZ2VSZWFkcykubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3Quc3RhZ2VSZWFkcyA9IHRoaXMuX3N0YWdlUmVhZHM7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICBzbmFwc2hvdC5kZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLnN1YmZsb3dJZCkge1xuICAgICAgc25hcHNob3Quc3ViZmxvd0lkID0gdGhpcy5zdWJmbG93SWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlYnVnLmZsb3dNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5mbG93TWVzc2FnZXMgPSB0aGlzLmRlYnVnLmZsb3dNZXNzYWdlcztcbiAgICB9XG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG59XG4iXX0=
|
|
869
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7OztBQUlILDJDQUE4QztBQUU5QywwREFBa0Y7QUFDbEYsOENBQTBDO0FBQzFDLCtEQUE4RztBQUM5RyxxRUFBdUY7QUFHdkYsaURBU3dCO0FBQ3hCLG1EQUE2QztBQUU3QyxpREFBbUU7QUFFbkUsTUFBYSxZQUFZO0lBQ3ZCOzs7Ozs7Ozs7T0FTRztJQUNjLE1BQU0sQ0FBYztJQUNyQzs7Ozs7OztPQU9HO0lBQ0ssTUFBTSxHQUFjLGlDQUFrQixDQUFDO0lBQy9DLGtGQUFrRjtJQUMxRSxTQUFTLENBQVU7SUFFcEIsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN0Qix1RUFBdUU7SUFDaEUsT0FBTyxDQUFTO0lBQ3ZCLHFGQUFxRjtJQUM5RSxjQUFjLEdBQUcsRUFBRSxDQUFDO0lBQzNCOzs7Ozs7O09BT0c7SUFDSSxJQUFJLENBQXFCO0lBQ2hDOzs7OztPQUtHO0lBQ2EsS0FBSyxDQUFTO0lBQzlCOzs7Ozs7T0FNRztJQUNLLFlBQVksQ0FBVTtJQUN2QixRQUFRLENBQVU7SUFDbEIsU0FBUyxDQUFVO0lBQ25CLE1BQU0sQ0FBVTtJQUN2QixtRkFBbUY7SUFDNUUsV0FBVyxDQUFVO0lBQzVCLGdGQUFnRjtJQUN6RSxTQUFTLENBQVU7SUFFbkIsTUFBTSxDQUFnQjtJQUN0QixJQUFJLENBQWdCO0lBQ3BCLFFBQVEsQ0FBa0I7SUFFMUIsS0FBSyxHQUF3QixJQUFJLDRDQUFtQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFekY7O3lFQUVxRTtJQUM3RCxZQUFZLEdBQStFLEVBQUUsQ0FBQztJQUV0Rzs7Ozs7Ozs7T0FRRztJQUNLLGNBQWMsQ0FHcEI7SUFFRixtRUFBbUU7SUFD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R0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0Y7QUF6N0JELG9DQXk3QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YWdlQ29udGV4dCDigJQgRXhlY3V0aW9uIGNvbnRleHQgZm9yIGEgc2luZ2xlIHN0YWdlIGluIGEgZmxvd2NoYXJ0IHJ1blxuICpcbiAqIExpa2UgYSBzdGFjayBmcmFtZSBpbiBhIGNvbXBpbGVyL3J1bnRpbWU6XG4gKiAtIEEgUmVjb3JkRnJhbWUg4oCUIHRoZSByZWNvcmQgaGFsZiAoQzMpOiB0aGUgaGVhcCwgdGhlIGFkZHJlc3MsIHRoZVxuICogICBmaXJzdC10b3VjaCBiYXNlLCB0aGUgbGF6eSB0cmFuc2FjdGlvbiBidWZmZXIgYW5kIGV2ZXJ5IHdyaXRlJ3Mgc2NydWJcbiAqICAgKEM0KSwgdGhlIHJlYWRLZXlzIGxpc3RcbiAqIC0gTGlua3MgdG8gcGFyZW50L2NoaWxkL25leHQgY29udGV4dHMgKGNhbGwgc3RhY2sgZnJhbWVzKVxuICogLSBXaGF0IGJlbG9uZ3MgdG8gYSBzdGFnZSBpbnNpZGUgYSBydW46IHJldGVudGlvbiBvZiByZWFkcyBhbmQgd3JpdGVzLCB0aGVcbiAqICAgcmVkYWN0aW9uIGRlY2lzaW9uIHBlciB3cml0ZSAoYHJlZGFjdGlvbi50cyDCtyBkZWNpZGVXcml0ZWApIGFuZCB3aGVyZSB0aGVcbiAqICAgZnJhbWUgd3JpdGVzIChgcnVuQWRkcmVzcy50c2ApLCB0aGUgZGV2LW1vZGUgd2FybmluZ3MsIHRoZSBjb21taXQgb2JzZXJ2ZXJcbiAqIC0gRGlhZ25vc3RpY0NvbGxlY3RvciBmb3IgbG9ncywgZXJyb3JzLCBtZXRyaWNzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRQaGFzZSwgRW1pdFNvdXJjZVBvc2l0aW9uLCBVbnRyYWNrZWRTb3VyY2UgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHR5cGUgeyBFdmVudExvZywgU2hhcmVkTWVtb3J5LCBXcml0ZVZlcmIgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuaW1wb3J0IHsgUmVjb3JkRnJhbWUgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgeyBzdW1tYXJpemVSZWFkVmFsdWUsIHN1bW1hcml6ZVdyaXRlVmFsdWUgfSBmcm9tICcuLi9jYXB0dXJlL3N1bW1hcml6ZS5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB7IGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlLCBjb21taXR0ZWRNdXRhdGlvbk1lc3NhZ2UsIGZpcnN0RGlmZmVyaW5nUGF0aCB9IGZyb20gJy4vYm9ycm93ZWRNdXRhdGlvbi5qcyc7XG5pbXBvcnQgeyB0eXBlIERpYWdub3N0aWNDaGFubmVsLCBEaWFnbm9zdGljQ29sbGVjdG9yIH0gZnJvbSAnLi9EaWFnbm9zdGljQ29sbGVjdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd0NvbnRyb2xUeXBlLCBGbG93TWVzc2FnZSwgUmVhZFRyYWNraW5nTW9kZSwgU3RhZ2VTbmFwc2hvdCwgV3JpdGVUcmFja2luZ01vZGUgfSBmcm9tICcuL2ZyYW1lVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25WZXJkaWN0IH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHtcbiAgQ0xFQVIsXG4gIGRlY2lkZVdyaXRlLFxuICBpbmhlcml0QnlJZGVudGl0eSxcbiAgbWFya1N0YWdlZFdyaXRlLFxuICBSZWRhY3Rpb25SdWxlLFxuICBTQ09QRV9QTEFDRUhPTERFUixcbiAgc2NydWJPZixcbiAgdXNlcktleU9mLFxufSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBydW5BZGRyZXNzIH0gZnJvbSAnLi9ydW5BZGRyZXNzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHsgREVGQVVMVF9SVU5fUE9MSUNZLCB3aXRoUmVkYWN0aW9uIH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuXG5leHBvcnQgY2xhc3MgU3RhZ2VDb250ZXh0IHtcbiAgLyoqXG4gICAqIFRoZSByZWNvcmQgaGFsZiBvZiB0aGlzIGZyYW1lIChgUmVjb3JkRnJhbWUudHNgLCBMMywgQzMpOiB0aGUgaGVhcCBhbmQsXG4gICAqIHdoZW4gdGhlIHJ1biBrZWVwcyB0aGVtLCB0aGUgcmVkYWN0ZWQgbWlycm9yIGFuZCB0aGUgbG9nOyB0aGUgYWRkcmVzcztcbiAgICogdGhlIGZpcnN0LXRvdWNoIGJhc2U7IHRoZSBsYXp5IHRyYW5zYWN0aW9uIGJ1ZmZlcjsgdGhlIHJlYWRLZXlzIGxpc3QuXG4gICAqIEV2ZXJ5IHN0YXRlIHJlYWQgb2YgdGhpcyBmcmFtZSBnb2VzIHRocm91Z2ggaXQsIGFuZCBzbyBkb2VzIGV2ZXJ5XG4gICAqIGNvbW1pdC4gVGhlIG1pcnJvciBpcyBwcmVzZW50ICoqb25seSoqIHdoZW4gdGhlIHJ1bidzIHBvbGljeSBrZWVwcyBhXG4gICAqIHJlZGFjdGVkIHZpZXcgKGEgYFJlZGFjdGlvblBvbGljeWAgaXMgY29uZmlndXJlZCkg4oCUIHJlYWQgdmlhXG4gICAqIGBGbG93Q2hhcnRFeGVjdXRvci5nZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAsIHRoZSBmb3VuZGF0aW9uIGZvclxuICAgKiBzaGFyaW5nIGEgdHJhY2Ugd2l0aG91dCBsZWFraW5nIHJhdyBQSUkgdGhyb3VnaCBgc2hhcmVkU3RhdGVgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWNvcmQ6IFJlY29yZEZyYW1lO1xuICAvKipcbiAgICogVGhlIHJ1bidzIHBvbGljeSDigJQgdGhlIGZvdXIgZGlhbHMsIHRoZSByZWRhY3Rpb24gcnVsZSwgdGhlIG1pcnJvciBmbGFnXG4gICAqIChgcnVuUG9saWN5LnRzYCwgRjUpLiBIZWxkIEJZIFJFRkVSRU5DRTogb25lIGZyb3plbiBvYmplY3QgcGVyIHJ1biAoYW5kXG4gICAqIHBlciByZXN1bWUpLCBzaGFyZWQgYnkgZXZlcnkgZnJhbWUgb2YgdGhlIHJ1biwgYSBzdWJmbG93J3MgaW5jbHVkZWQg4oCUXG4gICAqIHtAbGluayBjcmVhdGVOZXh0fS97QGxpbmsgY3JlYXRlQ2hpbGR9IHBhc3MgdGhlIHJlZmVyZW5jZVxuICAgKiAoe0BsaW5rIGluaGVyaXRSdW59KSwgdGhlIHJ1bnRpbWUgaW5zdGFsbHMgaXQgb24gaXRzIHJvb3RcbiAgICogKHtAbGluayB1c2VQb2xpY3l9KS4gTmV2ZXIgZWRpdGVkOyBhIGNoYW5nZSBpcyBhIG5ldyBvYmplY3QuXG4gICAqL1xuICBwcml2YXRlIHBvbGljeTogUnVuUG9saWN5ID0gREVGQVVMVF9SVU5fUE9MSUNZO1xuICAvKiogVGhlIGVtaXR0aW5nIGZyYW1lJ3MgbG9naWNhbCBsZWcsIG5ldmVyIHRoZSBtdXRhYmxlIGV4ZWN1dG9yJ3MgY3VycmVudCBsZWcuICovXG4gIHByaXZhdGUgZW1pdFJ1bklkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBzdGFnZU5hbWUgPSAnJztcbiAgLyoqIFVuaXF1ZSBzdGFnZSBpZGVudGlmaWVyIGZyb20gdGhlIGJ1aWxkZXIgKG1hdGNoZXMgc3BlYyBub2RlIGlkKS4gKi9cbiAgcHVibGljIHN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIFVuaXF1ZSBwZXItZXhlY3V0aW9uLXN0ZXAgaWRlbnRpZmllci4gU2V0IGJ5IHRyYXZlcnNlciBiZWZvcmUgc3RhZ2UgZXhlY3V0aW9uLiAqL1xuICBwdWJsaWMgcnVudGltZVN0YWdlSWQgPSAnJztcbiAgLyoqXG4gICAqIERlY2xhcmVkIHRhZ3MgKDkuMjEuMCkgZm9yIHRoZSBzdGFnZSB0aGlzIGNvbnRleHQgaXMgZXhlY3V0aW5nLiBTZXQgYnlcbiAgICogdGhlIHRyYXZlcnNlciBiZXNpZGUgYHJ1bnRpbWVTdGFnZUlkYCAocGVyLW5vZGUgaWRlbnRpdHkg4oCUIE5PVCBpbmhlcml0ZWRcbiAgICogYnkgYGNyZWF0ZU5leHRgIC8gYGNyZWF0ZUNoaWxkYCksIHJlY29yZGVkIG9uIHRoZSBmaXJzdCBidW5kbGVcbiAgICogYGNvbW1pdCgpYCB3cml0ZXMsIHRoZW4gcmVsZWFzZWQgc28gYSByb3V0aW5lIHNlY29uZCBjb21taXQgb24gdGhlIHNhbWVcbiAgICogY29udGV4dCAoYSBmb3JrIGNoaWxkJ3MgZmFuLW91dCByZXBlYXQsIGEgbW91bnQncyBleGl0IGJ1bmRsZSkgY2Fycmllc1xuICAgKiBub25lIOKAlCB0aGUgc2FtZSBvbmNlLXBlci1leGVjdXRpb24gbGF3IGBfdW50cmFja2VkU291cmNlc2Aga2VlcHMuXG4gICAqL1xuICBwdWJsaWMgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogVGhlIHJ1biB0aGlzIGZyYW1lIGJlbG9uZ3MgdG8g4oCUIGl0cyBpZGVudGl0eSBvbiBldmVyeSBldmVudCwgYW5kIHRoZSBydW5cbiAgICogbmFtZXNwYWNlIGl0IHJlYWRzIGFuZCB3cml0ZXMgaW4gKHtAbGluayBydW5BZGRyZXNzfSksIHJlYWQgb25jZSwgd2hlbiB0aGVcbiAgICogZnJhbWUgaXMgYnVpbHQgKEMzKS4gT25seSB7QGxpbmsgdXNlQWRkcmVzc09mfSBtb3ZlcyB0aGUgYWRkcmVzcyBhZnRlclxuICAgKiB0aGF0LCBhbmQgb25seSBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcnVuIG5hbWVzcGFjZSB0aGlzIGZyYW1lIHdyaXRlcyBhbmQgcmVhZHMgaW4gd2hlbiB0aGF0IGlzIG5vdCBpdHMgb3duXG4gICAqIGBydW5JZGAg4oCUIHNldCBvbmNlLCBiZWZvcmUgdGhlIGZyYW1lJ3MgZmlyc3Qgd3JpdGUsIGJ5XG4gICAqIHtAbGluayB1c2VBZGRyZXNzT2Z9LiBJdHMgb25lIHVzZXIgaXMgYSBzdWJmbG93IG1vdW50J3MgbWVyZ2UtYmFjayAoUjEzKTpcbiAgICogdGhlIHJlY29yZCBuYW1lcyB0aGUgbW91bnQsIHRoZSB2YWx1ZXMgbGFuZCB3aGVyZSB0aGUgbW91bnQncyBwYXJlbnRcbiAgICogd3JpdGVzLiBBYnNlbnQg4oaSIGBydW5JZGAsIHNvIGV2ZXJ5IG90aGVyIGZyYW1lIGlzIHVudG91Y2hlZC5cbiAgICovXG4gIHByaXZhdGUgYWRkcmVzc1J1bklkPzogc3RyaW5nO1xuICBwdWJsaWMgYnJhbmNoSWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBpc0RlY2lkZXI6IGJvb2xlYW47XG4gIHB1YmxpYyBpc0Zvcms6IGJvb2xlYW47XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBmcm9tIGJ1aWxkZXIgKHNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIGV4ZWN1dGlvbikuICovXG4gIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN1YmZsb3cgaWRlbnRpZmllciAoc2V0IGJ5IHRyYXZlcnNlciB3aGVuIHRoaXMgaXMgYSBzdWJmbG93IGVudHJ5IHBvaW50KS4gKi9cbiAgcHVibGljIHN1YmZsb3dJZD86IHN0cmluZztcblxuICBwdWJsaWMgcGFyZW50PzogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgbmV4dD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIGNoaWxkcmVuPzogU3RhZ2VDb250ZXh0W107XG5cbiAgcHVibGljIGRlYnVnOiBEaWFnbm9zdGljQ29sbGVjdG9yID0gbmV3IERpYWdub3N0aWNDb2xsZWN0b3IoKCkgPT4gdGhpcy5wb2xpY3kucmVkYWN0aW9uKTtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgd3JpdGVzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3IGFuZCBvbkNvbW1pdFxuICAgKiAg4oCUIGluIHRoZWlyIFJFVEFJTkVEIGZvcm0gKGNsb25lZCAvIHN1bW1hcmlzZWQgLyByZWRhY3RlZCkuIEZpbGxlZCBmcm9tXG4gICAqICB7QGxpbmsgX3BlbmRpbmdXcml0ZXN9IGJ5IHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30gYXQgY29tbWl0LiAqL1xuICBwcml2YXRlIF9zdGFnZVdyaXRlczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4gPSB7fTtcblxuICAvKipcbiAgICogVGhlIHdyaXRlcyBvZiB0aGUgQ1VSUkVOVCBleGVjdXRpb24sIGhlbGQgYnkgcmVmZXJlbmNlIHdpdGggdGhlIHZlcmRpY3RcbiAgICogdGhleSB3ZXJlIHN0YWdlZCB1bmRlciAoOS4yMy4wKS4gQSBrZXkgd3JpdHRlbiBrIHRpbWVzIGhvbGRzIGl0cyBMQVNUXG4gICAqIHZhbHVlOyB0aGUgcmV0YWluZWQgZm9ybSAodGhlIGB3cml0ZVRyYWNraW5nYCBjbG9uZSBvciBzdW1tYXJ5LCB0aGVcbiAgICogcmVkYWN0aW9uIHBsYWNlaG9sZGVyIG9yIGZpZWxkIHNjcnViKSBpcyB0YWtlbiBPTkNFIHBlciBrZXkgYXQgY29tbWl0IOKAlFxuICAgKiBzZWUge0BsaW5rIG1hdGVyaWFsaXNlV3JpdGVzfS4gU2FtZSBsYXcgYXMgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzXG4gICAqIHBhdGNoIHRyZWVzOiB0aGUgY29weSB0aGUgcmVjb3JkIG5lZWRzIGlzIHBhaWQgYXQgdGhlIGJvdW5kYXJ5LCBub3QgYXRcbiAgICogZXZlcnkgd3JpdGUuIExhemlseSBhbGxvY2F0ZWQ7IGEgc3RhZ2UgdGhhdCBuZXZlciB3cml0ZXMgcGF5cyBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcGVuZGluZ1dyaXRlcz86IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgeyB2YWx1ZTogdW5rbm93bjsgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdDsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfVxuICA+O1xuXG4gIC8qKiBUcmFja3MgdXNlci1sZXZlbCByZWFkcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VSZWFkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKipcbiAgICogVGhlIGBfc3RhZ2VSZWFkc2Aga2V5cyB0aGF0IHdlcmUgcmVhZCBhdCBhIE5FU1RFRCBwYXRoIChgZ2V0VmFsdWUocGF0aCxcbiAgICoga2V5KWAgd2l0aCBhIG5vbi1lbXB0eSBgcGF0aGApLiBPbmx5IHRoZSBlbmdpbmUgcmVhZHMgdGhhdCB3YXkg4oCUIHRoZVxuICAgKiBmYWNhZGUgcmVhZHMgcm9vdHMg4oCUIHNvIHRoZXNlIGFyZSBub3QgdXNlciByZWFkcyBhbmQgdGhlIGJvcnJvd2VkLXJlYWRcbiAgICogZ3VhcmQgc2tpcHMgdGhlbSBieSB0aGlzIG1hcmtlciwgbmV2ZXIgYnkgZ3Vlc3NpbmcgZnJvbSBhIGRvdCBpbiB0aGUga2V5XG4gICAqIChhIHVzZXIncyB0b3AtbGV2ZWwga2V5IG1heSBpdHNlbGYgY29udGFpbiBvbmUpLiBMYXppbHkgY3JlYXRlZDsgdGhlXG4gICAqIGZhY2FkZSBwYXRoIG5ldmVyIGFsbG9jYXRlcyBpdC5cbiAgICovXG4gIHByaXZhdGUgX25lc3RlZFJlYWRzPzogU2V0PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIERldiBtb2RlIG9ubHk6IHRoZSByb290IGtleXMgd2hvc2UgTEFTVCB0cmFja2VkIHJlYWQgd2FzIHNlcnZlZCBmcm9tXG4gICAqIGNvbW1pdHRlZCBzdGF0ZSDigJQgYmVmb3JlIHRoaXMgc3RhZ2UncyBmaXJzdCB3cml0ZSwgd2hlbiBubyB0cmFuc2FjdGlvblxuICAgKiBidWZmZXIgZXhpc3RzIHlldC4gU3VjaCBhIHJlYWQgaXMgdGhlIGNvbW1pdHRlZCBvYmplY3QgaXRzZWxmLCBzbyBhblxuICAgKiBpbi1wbGFjZSBlZGl0IG9mIGl0IG1vdmVzIHRoZSBidWZmZXIncyBkaWZmIGJhc2UgdG9vIChjb3B5LW9uLXdyaXRlLFxuICAgKiA5LjI5LjApOyB7QGxpbmsgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbn0gY2hlY2tzIHRoZXNlIGtleXMgZXZlbiB3aGVuIHRoZVxuICAgKiBzdGFnZSB3cm90ZSB0aGVtLiBOZXZlciBhbGxvY2F0ZWQgb3V0c2lkZSBgZW5hYmxlRGV2TW9kZSgpYC5cbiAgICovXG4gIHByaXZhdGUgX3ZpZXdSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBIYXMgdGhpcyBmcmFtZSBjb21taXR0ZWQgYXQgbGVhc3Qgb25jZT8gVGhlIGJvcnJvd2VkLXJlYWQgZ3VhcmQgcnVucyBvblxuICAgKiB0aGUgRklSU1QgY29tbWl0IG9ubHkg4oCUIHNlZSB7QGxpbmsgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbn0uIFRoZSBmcmFtZVxuICAgKiBpdHNlbGYgc3RheXMgcmUtdXNhYmxlIGFmdGVyIGNvbW1pdCAoIzEzYik6IHRoZSBlbmdpbmUncyBkb3VibGUtY29tbWl0XG4gICAqIHBhdGhzIGFuZCB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBicmFuY2ggcGFyZW50IHJlbHkgb24gaXQuIFRoZVxuICAgKiB1c2VyLWxldmVsIHJlZnVzYWwgb2YgYSBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZSBsaXZlcyBhdCB0aGUgc2NvcGVcbiAgICogdGllciAoYFNjb3BlRmFjYWRlYCwgb25lIHBlciBzdGFnZSBleGVjdXRpb24pLCBub3QgaGVyZS5cbiAgICovXG4gIHByaXZhdGUgX2NvbW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8qKiBUcmFja2VkIHJlYWRzIG9mIGEgc2VsZWN0ZWQgdmFsdWUgKHtAbGluayBzZWxlY3RlZFJlYWRzfSkuICovXG4gIHByaXZhdGUgX3NlbGVjdGVkUmVhZHMgPSAwO1xuICAvKiogRWFjaCBvYmplY3QgdGhpcyBmcmFtZSByZWFkIHVuZGVyIGEgc2VsZWN0ZWQgbmFtZSDihpIgdGhhdCByZWFkJ3MgdmVyZGljdCAoYHN0YWdlV3JpdGVgIGhhbmRzIGl0IG9uKS4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0ZWRPYmplY3RzPzogV2Vha01hcDxvYmplY3QsIFJlZGFjdGlvblZlcmRpY3Q+O1xuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyIGhvbmVzdHkgbWFya2VycyDigJQgdW50cmFja2VkIHJlYWQgcGF0aHMgdXNlZCBkdXJpbmcgVEhJU1xuICAgKiBzdGFnZSdzIGV4ZWN1dGlvbiAoYCdhcmdzJ2AgLyBgJ2VudidgIC8gYCdzaWxlbnQnYCkuIE1hcmtlZCBieVxuICAgKiBgU2NvcGVGYWNhZGVgLCBzdXJmYWNlZCBvbiB0aGUgc3RhZ2UncyBDb21taXRCdW5kbGUgYXNcbiAgICogYHVudHJhY2tlZFNvdXJjZXNgLCB0aGVuIFJFTEVBU0VEIHdpdGggdGhlIHN0YWdpbmcgc3RhdGUgYXQgY29tbWl0IGVuZFxuICAgKiAoc28gdGhlIHJvdXRpbmUgZG91YmxlLWNvbW1pdCBwYXRocyDigJQgZm9yayBjaGlsZHJlbiwgc3ViZmxvdyBtb3VudHMg4oCUXG4gICAqIHJlY29yZCB0aGUgZmllbGQgZXhhY3RseSBvbmNlLCBvbiB0aGUgZmlyc3QgY29tbWl0KS4gTGF6aWx5IGFsbG9jYXRlZDpcbiAgICogc3RhZ2VzIHRoYXQgbmV2ZXIgdG91Y2ggYW4gdW50cmFja2VkIHBhdGggcGF5IG5vdGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF91bnRyYWNrZWRTb3VyY2VzPzogU2V0PFVudHJhY2tlZFNvdXJjZT47XG5cbiAgLyoqIE9ic2VydmVyIGNhbGxlZCBhZnRlciBjb21taXQoKSDigJQgdXNlZCBieSBTY29wZUZhY2FkZSB0byBmaXJlIFNjb3BlUmVjb3JkZXIub25Db21taXQuICovXG4gIHByaXZhdGUgX2NvbW1pdE9ic2VydmVyPzogKFxuICAgIG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4sXG4gICkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdGFnZUlkOiBzdHJpbmcsXG4gICAgc2hhcmVkTWVtb3J5OiBTaGFyZWRNZW1vcnksXG4gICAgYnJhbmNoSWQ/OiBzdHJpbmcsXG4gICAgZXZlbnRMb2c/OiBFdmVudExvZyxcbiAgICBpc0RlY2lkZXI/OiBib29sZWFuLFxuICApIHtcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gICAgdGhpcy5zdGFnZU5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc3RhZ2VJZCA9IHN0YWdlSWQ7XG4gICAgdGhpcy5yZWNvcmQgPSBuZXcgUmVjb3JkRnJhbWUoc2hhcmVkTWVtb3J5LCBldmVudExvZywgcnVuQWRkcmVzcyhydW5JZCkpO1xuICAgIHRoaXMucmVjb3JkLnVzZUVuY29kaW5nKHRoaXMucG9saWN5KTtcbiAgICB0aGlzLmJyYW5jaElkID0gYnJhbmNoSWQ7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSAhIWlzRGVjaWRlcjtcbiAgICB0aGlzLmlzRm9yayA9IGZhbHNlO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIFNoYXJlZE1lbW9yeSBpbnN0YW5jZSAobmVlZGVkIGJ5IHNjb3BlIGxheWVyKS4gKi9cbiAgZ2V0U2hhcmVkTWVtb3J5KCk6IFNoYXJlZE1lbW9yeSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnN0YXRlO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBTdGFtcGVkIGJlc2lkZSBydW50aW1lU3RhZ2VJZCwgYmVmb3JlIHNjb3BlIGNvbnN0cnVjdGlvbi4gKi9cbiAgYmluZEVtaXRPcmlnaW4ocnVuSWQ6IHN0cmluZywgZHJpbGxQYXRoOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuZW1pdFJ1bklkID0gZHJpbGxQYXRoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBydW5JZDtcbiAgICBpZiAoZHJpbGxQYXRoICE9PSB1bmRlZmluZWQpIHRoaXMucmVjb3JkLmxvZz8uYmluZEFkZHJlc3MocnVuSWQsIGRyaWxsUGF0aCk7XG4gIH1cblxuICAvKiogQ2FwdHVyZSBmcm9tIHRoaXMgZnJhbWUncyBPV04gbG9nLiBBIG1hbnVhbC91bmFkZHJlc3NhYmxlIGZyYW1lIHN0YXlzIHVua25vd24uICovXG4gIGNhcHR1cmVFbWl0UG9zaXRpb24oKTogRW1pdFNvdXJjZVBvc2l0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5lbWl0UnVuSWQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMucmVjb3JkLmxvZz8uY2FwdHVyZVBvc2l0aW9uKHRoaXMuZW1pdFJ1bklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGEgcGFyYWxsZWwgcmVkYWN0ZWQgbWlycm9yLiBTdWJzZXF1ZW50IGBjb21taXQoKWAgY2FsbHMgYXBwbHlcbiAgICogdGhlIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyDigJQgdGhlIG9uZXMgdGhlIGxvZyByZWNvcmRzIOKAlCB0b1xuICAgKiB0aGlzIG1pcnJvciwgYmVzaWRlIHRoZSByYXcgcGF0Y2hlcyBvbiB0aGUgaGVhcCAoYHJlY29yZENvbW1pdGApLlxuICAgKiBDaGlsZCAvIG5leHQgY29udGV4dHMgaW5oZXJpdCB0aGUgbWlycm9yIHZpYSBgY3JlYXRlTmV4dGAgLyBgY3JlYXRlQ2hpbGRgLlxuICAgKlxuICAgKiBDYWxsZWQgb24gYSBydW50aW1lJ3Mgcm9vdCBmcmFtZSBieSBgRXhlY3V0aW9uUnVudGltZWAgd2hlbiB0aGUgcnVuJ3MgcG9saWN5IGtlZXBzIGEgbWlycm9yLlxuICAgKi9cbiAgdXNlUmVkYWN0ZWRNaXJyb3IobWlycm9yOiBTaGFyZWRNZW1vcnkpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZC51c2VNaXJyb3IobWlycm9yKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSByZWRhY3RlZCBtaXJyb3IgaWYgaW5zdGFsbGVkLCBlbHNlIHVuZGVmaW5lZC4gKi9cbiAgZ2V0UmVkYWN0ZWRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQubWlycm9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgdGhlIHJ1bidzIHBvbGljeSAoYHJ1blBvbGljeS50c2ApIG9uIHRoaXMgZnJhbWUg4oCUIGNhbGxlZCBvbiBhXG4gICAqIHJ1bnRpbWUncyByb290IGJ5IGBFeGVjdXRpb25SdW50aW1lYCAoYXQgY29uc3RydWN0aW9uLCBhbmQgYnlcbiAgICogYEV4ZWN1dGlvblJ1bnRpbWUudXNlUG9saWN5YCBvbiBhIHNhbWUtZXhlY3V0b3IgcmVzdW1lKS4gRGVzY2VuZGFudHMgZ2V0XG4gICAqIHRoZSBzYW1lIHJlZmVyZW5jZSB0aHJvdWdoIHtAbGluayBjcmVhdGVOZXh0fS97QGxpbmsgY3JlYXRlQ2hpbGR9OyBhXG4gICAqIHN1YmZsb3cncyBydW50aW1lIGlzIGNvbnN0cnVjdGVkIHdpdGggaXQsIHNvIGl0cyBzZWVkIGZyYW1lIGFuZCBldmVyeVxuICAgKiBmcmFtZSBhZnRlciBjb21taXQgdW5kZXIgdGhlIHJ1bidzIGRpYWxzIHRvby5cbiAgICovXG4gIHVzZVBvbGljeShwb2xpY3k6IFJ1blBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMuYWRvcHRQb2xpY3kocG9saWN5KTtcbiAgfVxuXG4gIC8qKiBUaGUgcnVuJ3MgcG9saWN5IHRoaXMgZnJhbWUgcmV0YWlucywgZW5jb2RlcyBhbmQgc2NydWJzIHVuZGVyLiAqL1xuICBnZXRQb2xpY3koKTogUnVuUG9saWN5IHtcbiAgICByZXR1cm4gdGhpcy5wb2xpY3k7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhIHJlZGFjdGlvbiBydWxlIOKAlCB0aGUgT05FIG93bmVyIG9mIFwid2hhdCBkb2VzIHRoZSBwb2xpY3kgc2F5XG4gICAqIGFib3V0IHRoaXMgcGF0aFwiIChgbWVtb3J5L3JlZGFjdGlvbi50c2ApIOKAlCBhcyBhIE5FVyBwb2xpY3kgZm9yIHRoaXMgZnJhbWVcbiAgICogKHRoZSBzaGFyZWQgb25lIGlzIG5ldmVyIGVkaXRlZCkuIFVuZGVyIGFuIGV4ZWN1dG9yIHRoZSBydWxlIGFycml2ZXNcbiAgICogd2l0aCB0aGUgcnVuJ3MgcG9saWN5OyB0aGlzIGRvb3IgaXMgZm9yIGEgYFNjb3BlRmFjYWRlYCBvbiBhIGJhcmUgZnJhbWVcbiAgICogKHVuaXQgdGVzdHMsIGhhbmQtYnVpbHQgc2NvcGVzKSwgd2hpY2ggYnJpbmdzIGl0cyBvd24gcnVsZS4gRXZlcnkgc3RhZ2VkXG4gICAqIHdyaXRlIGFuZCBldmVyeSB0cmFja2VkIHJlYWQgYXNrcyBpdCwgc28gYSB3cml0ZSB0aGF0IG5ldmVyIHBhc3NlcyBhXG4gICAqIGZhY2FkZSDigJQgYSBzdWJmbG93IHNlZWQsIGFuIGBvdXRwdXRNYXBwZXJgIG1lcmdlLWJhY2ssIGEgcmVzdW1lIHJlLXNlZWQg4oCUXG4gICAqIGlzIHJldGFpbmVkIHVuZGVyIHRoZSBzYW1lIHZlcmRpY3QgYXMgYSBmYWNhZGUgd3JpdGUuIEFic2VudDogZXZlcnlcbiAgICogdmVyZGljdCBpcyBgJ2NsZWFyJ2AgdW5sZXNzIHRoZSBjYWxsZXIgcGFzc2VkIGFuIGV4cGxpY2l0IGZsYWcuXG4gICAqL1xuICB1c2VSZWRhY3Rpb25SdWxlKHJ1bGU6IFJlZGFjdGlvblJ1bGUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2xpY3kucmVkYWN0aW9uICE9PSBydWxlKSB0aGlzLmFkb3B0UG9saWN5KHdpdGhSZWRhY3Rpb24odGhpcy5wb2xpY3ksIHJ1bGUpKTtcbiAgfVxuXG4gIC8qKiBUaGUgaW5zdGFsbGVkIHJlZGFjdGlvbiBydWxlLCBpZiBhbnkgKHRoZSBmYWNhZGUncyBsb29rdXApLiAqL1xuICBnZXRSZWRhY3Rpb25SdWxlKCk6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBvbGljeS5yZWRhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogVGFrZSB0aGUgcnVuIGZyb20gYGZyb21gOiB0aGUgcG9saWN5IChieSByZWZlcmVuY2UpIGFuZCB0aGUgcnVuJ3MgbWlycm9yXG4gICAqIHN0b3JlLiBUaGUgT05FIGluaGVyaXRhbmNlIHN0ZXAg4oCUIHtAbGluayBjcmVhdGVOZXh0fSBhbmRcbiAgICoge0BsaW5rIGNyZWF0ZUNoaWxkfSBib3RoIGNhbGwgaXQsIGFuZCBpdCBuYW1lcyBubyBkaWFsLlxuICAgKi9cbiAgcHJpdmF0ZSBpbmhlcml0UnVuKGZyb206IFN0YWdlQ29udGV4dCk6IHZvaWQge1xuICAgIHRoaXMuYWRvcHRQb2xpY3koZnJvbS5wb2xpY3kpO1xuICAgIHRoaXMucmVjb3JkLnVzZU1pcnJvcihmcm9tLnJlY29yZC5taXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBPTkUgcGxhY2UgdGhpcyBmcmFtZSdzIHBvbGljeSBjaGFuZ2VzOiB0aGUgZnJhbWUgaG9sZHMgaXQsIGFuZCBpdHNcbiAgICogcmVjb3JkIGZyYW1lIGVuY29kZXMgdW5kZXIgdGhlIHNhbWUgcmVmZXJlbmNlIChgY29tbWl0VmFsdWVzYCxcbiAgICogYHdyaXRlUHJvdmVuYW5jZWAg4oCUIGBSZWNvcmRGcmFtZSDCtyB1c2VFbmNvZGluZ2ApLCBzbyB0aGUgdHdvIG5ldmVyIGRpZmZlci5cbiAgICovXG4gIHByaXZhdGUgYWRvcHRQb2xpY3kocG9saWN5OiBSdW5Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLnJlY29yZC51c2VFbmNvZGluZyhwb2xpY3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIHRyYWNrZWQgdXNlci1sZXZlbCB3cml0ZSwgcG9saWN5LWdhdGVkICgjMTNjLUEpIOKAlCB0aGUgc2luZ2xlXG4gICAqIGJvb2trZWVwaW5nIHBhdGggZm9yIHtAbGluayBzZXRPYmplY3R9IGFuZCB7QGxpbmsgdXBkYXRlT2JqZWN0fS4gSG9sZHNcbiAgICogdGhlIFJFRkVSRU5DRSBhbmQgdGhlIHZlcmRpY3QgKDkuMjMuMCk7IHRoZSByZXRhaW5lZCBmb3JtIGlzIHRha2VuIGF0XG4gICAqIGNvbW1pdCBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9LCBvbmNlIHBlciBrZXkuXG4gICAqXG4gICAqIFJlZGFjdGlvbiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGRpYWwgaW4gRVZFUlkgbW9kZTogYSByZWRhY3RlZFxuICAgKiB3cml0ZSBzdG9yZXMgdGhlIGAnW1JFREFDVEVEXSdgIHBsYWNlaG9sZGVyIHVuZGVyIGAnZnVsbCdgIEFORFxuICAgKiBgJ3N1bW1hcnknYCAoYSBzdW1tYXJ5IG1hcmtlciB3b3VsZCBsZWFrIHRoZSB2YWx1ZSdzIHByZXZpZXcvc2l6ZSksXG4gICAqIGFuZCBzdG9yZXMgbm90aGluZyB1bmRlciBgJ29mZidgIChlbnRyeSBza2lwcGVkIGVudGlyZWx5IOKAlCBub3RoaW5nIHRvXG4gICAqIGxlYWspLiBBIGZpZWxkLWxldmVsIHZlcmRpY3Qgc2NydWJzIGEgY2xvbmUgQkVGT1JFIHRoZSBkaWFsIHNlZXMgaXQsIHNvXG4gICAqIGEgc3VtbWFyeSBwcmV2aWV3IGNhbiBuZXZlciBzaG93IHRoZSBzZWNyZXQgZWl0aGVyLiBUaGUgdmVyZGljdCBpcyB0aGVcbiAgICogb25lIGBzdGFnZVdyaXRlYCBkZWNpZGVkIEJFRk9SRSBzdGFnaW5nLCBjYXJyaWVkIHRvIGNvbW1pdCB3aXRoIHRoZVxuICAgKiB2YWx1ZS4gVGhlIHN0YWdlZCB3cml0ZSBpdHNlbGYgaXMgdW5hZmZlY3RlZCDigJQgcmVkYWN0aW9uIG9mIHRoZVxuICAgKiBjb21taXR0ZWQgcGF5bG9hZCBpcyB0aGUgcmVjb3JkIGZyYW1lJ3Mgc2NydWIgb2YgdGhhdCB3cml0ZVxuICAgKiAoYFJlY29yZEZyYW1lIMK3IHdyaXRlYCwgdGhlbiBgc2NydWIudHNgIGF0IGNvbW1pdCkuXG4gICAqL1xuICBwcml2YXRlIHRyYWNrV3JpdGUoXG4gICAgdXNlcktleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gICAgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScsXG4gICkge1xuICAgIGlmICh0aGlzLnBvbGljeS53cml0ZVRyYWNraW5nID09PSAnb2ZmJykgcmV0dXJuO1xuICAgICh0aGlzLl9wZW5kaW5nV3JpdGVzID8/PSBuZXcgTWFwKCkpLnNldCh1c2VyS2V5LCB7IHZhbHVlLCB2ZXJkaWN0LCBvcGVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogYF9zdGFnZVdyaXRlc2Agd2l0aCBldmVyeSBwZW5kaW5nIHdyaXRlIGZvbGRlZCBpbiBhcyBpdHMgcmV0YWluZWQgZm9ybVxuICAgKiDigJQgdGhlIHJlY29yZCBhIHJlYWRlciBzZWVzLiBDb25zdW1lcyBub3RoaW5nOiBhIG1pZC1ydW4gc25hcHNob3QgcmVhZHNcbiAgICogdGhlIHdyaXRlcyBzbyBmYXIsIGFuZCBjb21taXQgc3RpbGwgbWF0ZXJpYWxpc2VzIHRoZSBmaW5hbCB2YWx1ZXMuXG4gICAqIFJldHVybnMgYF9zdGFnZVdyaXRlc2AgaXRzZWxmIHdoZW4gbm90aGluZyBpcyBwZW5kaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZXRhaW5lZFdyaXRlcygpOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PiB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nV3JpdGVzKSByZXR1cm4gdGhpcy5fc3RhZ2VXcml0ZXM7XG4gICAgY29uc3Qgb3V0ID0geyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgd10gb2YgdGhpcy5fcGVuZGluZ1dyaXRlcykge1xuICAgICAgb3V0W2tleV0gPSB7XG4gICAgICAgIHZhbHVlOiB0aGlzLnJldGFpbmVkRm9ybSh3LnZlcmRpY3QsIHcudmFsdWUsIHRoaXMucG9saWN5LndyaXRlVHJhY2tpbmcsIHN1bW1hcml6ZVdyaXRlVmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246IHcub3BlcmF0aW9uLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIHRoZSByZXRhaW5lZCBmb3JtIG9mIGV2ZXJ5IHBlbmRpbmcgd3JpdGUg4oCUIE9OQ0UgcGVyIGtleSwgZnJvbSB0aGVcbiAgICogdmFsdWUgYXMgaXQgc3RhbmRzIGF0IGNvbW1pdCAoOS4yMy4wKSDigJQgYW5kIHJlbGVhc2UgdGhlIHJlZmVyZW5jZXMuIFRoZVxuICAgKiBmaXJzdCB0aGluZyBgY29tbWl0KClgIGRvZXMsIHNvIHRoZSBib3Jyb3dlZC1tdXRhdGlvbiBndWFyZCBhbmQgdGhlXG4gICAqIGNvbW1pdCBvYnNlcnZlciBzZWUgdGhlIGZpbmlzaGVkIHJlY29yZC5cbiAgICovXG4gIHByaXZhdGUgbWF0ZXJpYWxpc2VXcml0ZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nV3JpdGVzKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3N0YWdlV3JpdGVzID0gdGhpcy5yZXRhaW5lZFdyaXRlcygpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZWxlYXNlZCBldmVuIHdoZW4gYSByZXRhaW5lZCBmb3JtIGNhbm5vdCBiZSB0YWtlbiDigJQgYW4gdW5jbG9uZWFibGVcbiAgICAgIC8vIHZhbHVlIChhIGZ1bmN0aW9uLCBhIFByb3h5KSBpcyBhIGNvbnRyYWN0IHZpb2xhdGlvbiAoXCJzdGF0ZSB2YWx1ZXNcbiAgICAgIC8vIG11c3Qgc3Vydml2ZSBzdHJ1Y3R1cmVkQ2xvbmVcIikgdGhhdCBub3cgc3VyZmFjZXMgSEVSRSwgYXQgY29tbWl0LFxuICAgICAgLy8gYW5kIGZhaWxzIHRoZSBydW4gbG91ZGx5OyBhIGxhdGVyIHNuYXBzaG90IG9mIHRoZSBmYWlsZWQgcnVuIG11c3RcbiAgICAgIC8vIG5vdCB0aHJvdyB0aGUgc2FtZSBlcnJvciBhZ2Fpbi5cbiAgICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIG9mIGEgdmFsdWUgdGhlIGVuZ2luZSBSRVRBSU5TIChyZWFkcyBhbmQgd3JpdGVzIHJldGVudGlvbik6XG4gICAqIHRoZSBwbGFjZWhvbGRlciBiZWF0cyBldmVyeSBkaWFsOyBhIGZpZWxkLWxldmVsIHNjcnViIGhhcHBlbnMgYmVmb3JlIHRoZVxuICAgKiBkaWFsIHNlZXMgdGhlIHZhbHVlOyBhIGNsZWFyIHZhbHVlIGlzIHN1bW1hcml6ZWQgb3IgY2xvbmVkIGFzIHRoZSBkaWFsXG4gICAqIHNheXMuIENhbGxlcnMgaGFuZGxlIGB1bmRlZmluZWRgIGJlZm9yZSBhc2tpbmcuXG4gICAqL1xuICBwcml2YXRlIHJldGFpbmVkRm9ybShcbiAgICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIG1vZGU6IFJlYWRUcmFja2luZ01vZGUgfCBXcml0ZVRyYWNraW5nTW9kZSxcbiAgICBzdW1tYXJpemU6ICh2YWx1ZTogdW5rbm93bikgPT4gdW5rbm93bixcbiAgKTogdW5rbm93biB7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIFNDT1BFX1BMQUNFSE9MREVSO1xuICAgIGNvbnN0IHNjcnViYmVkID0gdmVyZGljdC5raW5kID09PSAnZmllbGRzJyA/IFJlZGFjdGlvblJ1bGUuc2NydWJGaWVsZHModmFsdWUsIHZlcmRpY3QucGF0aHMpIDogdW5kZWZpbmVkO1xuICAgIGlmIChtb2RlID09PSAnc3VtbWFyeScpIHJldHVybiBzdW1tYXJpemUoc2NydWJiZWQgPz8gdmFsdWUpO1xuICAgIHJldHVybiBzY3J1YmJlZCA/PyBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBydWxlIHdpdGggc29tZXRoaW5nIHRvIHNheSDigJQgYHVuZGVmaW5lZGAgb24gdGhlIG5vLXBvbGljeSBwYXRoIChub1xuICAgKiBydWxlIGluc3RhbGxlZCwgb3IgYSBydWxlIHdpdGggbm8gcG9saWN5IGVudHJpZXMgYW5kIG5vIG1hcmtlZCBrZXlzKSwgc29cbiAgICogYSB0cmFja2VkIHJlYWQgb3IgYSBzdGFnZWQgd3JpdGUgdGhlcmUgcGF5cyBubyB2ZXJkaWN0IGNhbGwgYW5kIG5vIHBhdGhcbiAgICogYWxsb2NhdGlvbi4gVGhlIGRlZmF1bHQgcnVuIGlzIGJ5dGUtaWRlbnRpY2FsIEFORCBjb3N0LWlkZW50aWNhbC5cbiAgICovXG4gIHByaXZhdGUgYWN0aXZlUnVsZSgpOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBydWxlID0gdGhpcy5wb2xpY3kucmVkYWN0aW9uO1xuICAgIHJldHVybiBydWxlICE9PSB1bmRlZmluZWQgJiYgIXJ1bGUuaXNJbmVydCgpID8gcnVsZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUSEUgT05FIEZVTk5FTCBldmVyeSBzdGFnZWQgd3JpdGUgcGFzc2VzIHRocm91Z2gg4oCUIGZhY2FkZSB3cml0ZXMgQU5EXG4gICAqIHRoZSBwYXRocyB0aGF0IGJ5cGFzcyB0aGUgZmFjYWRlIChzdWJmbG93IHNlZWQsIGBvdXRwdXRNYXBwZXJgXG4gICAqIG1lcmdlLWJhY2ssIHJlc3VtZSByZS1zZWVkKS4gVHdvIG93bmVycyAoQzQpOiB0aGUgcnVuJ3MgcnVsZSBERUNJREVTLFxuICAgKiB0aGUgcmVjb3JkIGZyYW1lIFdSSVRFUyB0aGUgdmVyZGljdCdzIGJ5dGVzLCBpbiBmb3VyIHN0ZXBzXG4gICAqIChgcmVkYWN0aW9uLnRzYCwgXCJUaGUgd3JpdGUgZGVjaXNpb25cIik6XG4gICAqICAgMS4gdGhlIHZlcmRpY3Qg4oCUIGBkZWNpZGVXcml0ZWAsIHVuZGVyIHRoZSBydWxlIGFjdGl2ZSBhcyB0aGUgd3JpdGUgYmVnaW5zO1xuICAgKiAgIDIuIGlkZW50aXR5IGluaGVyaXRhbmNlIOKAlCBgaW5oZXJpdEJ5SWRlbnRpdHlgLCBhZ2FpbnN0IHRoaXMgZnJhbWUnc1xuICAgKiAgICAgIHNlbGVjdGVkIHJlYWRzIGFzIHRoZXkgc3RhbmQgYWZ0ZXIgc3RlcCAxO1xuICAgKiAgIDMuIHRoZSBieXRlcyDigJQgYFJlY29yZEZyYW1lIMK3IHdyaXRlYCwgdGhlIG9wIGFuZCBpdHMgc2NydWIgKHRoZSB3aG9sZVxuICAgKiAgICAgIHZhbHVlLCBvciB0aGUgZmllbGRzIGluc2lkZSBpdCk7XG4gICAqICAgNC4gdGhlIG1hcmtzIOKAlCBgbWFya1N0YWdlZFdyaXRlYCwgb25seSBvbmNlIHRoZSB3cml0ZSBzdGFnZWQsIHNvIGFcbiAgICogICAgICB3cml0ZSB0aGF0IGZhaWxzIHRvIHN0YWdlIG1hcmtzIG5vdGhpbmcuXG4gICAqIEVhY2ggc3RlcCByZWFkcyB0aGUgcnVsZSAoYW5kIHRoZSBzZWxlY3RlZCByZWFkcykgd2hlbiBpdCBhY3RzLCBhcyB0aGlzXG4gICAqIGZ1bm5lbCBhbHdheXMgZGlkLiBSZXR1cm5zIHRoZSB2ZXJkaWN0IHNvIHRoZSBjYWxsZXIgcmV0YWlucyBhbmQgcmVwb3J0c1xuICAgKiB1bmRlciB0aGUgc2FtZSBkZWNpc2lvbi5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VXcml0ZShcbiAgICBuc1BhdGg6IHN0cmluZ1tdLFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIGV4cGxpY2l0OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgIHZlcmI6IFdyaXRlVmVyYixcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5hY3RpdmVSdWxlKCk7XG4gICAgaWYgKGFjdGl2ZSA9PT0gdW5kZWZpbmVkICYmICFleHBsaWNpdCkge1xuICAgICAgLy8gVGhlIG5vLXBvbGljeSBmYXN0IHBhdGgsIHRoZSBzYW1lIGZvdXIgc3RlcHMgd2l0aCBub3RoaW5nIHRvIGRvOiBubyBydWxlIHdpdGggYW55dGhpbmcgdG8gc2F5XG4gICAgICAvLyBhbmQgbm8gZmxhZyBpcyBjbGVhciAoc3RlcCAxKSwgbm90aGluZyB0byBpbmhlcml0IHdpdGhvdXQgYSBydWxlIChzdGVwIDIpLCBubyBzY3J1YiAoc3RlcCAzKSxcbiAgICAgIC8vIGFuZCBub3RoaW5nIHRvIG1hcmsg4oCUIGEgY2xlYXIgdmVyZGljdCBtYXJrcyBub3RoaW5nLCBhbmQgYSBkZWxldGUgdW5tYXJrcyBvbmx5IG9uIHRoZSBydWxlXG4gICAgICAvLyBhY3RpdmUgYXMgaXQgYmVnYW4gKHN0ZXAgNCkuIFRoZSBkZWZhdWx0IHJ1biBwYXlzIHRoZSByZWNvcmQncyB3cml0ZSBhbmQgbm90aGluZyBlbHNlLlxuICAgICAgdGhpcy5yZWNvcmQud3JpdGUobnNQYXRoLCB2YWx1ZSwgdmVyYik7XG4gICAgICByZXR1cm4gQ0xFQVI7XG4gICAgfVxuICAgIGNvbnN0IGFza2VkID0gZGVjaWRlV3JpdGUoYWN0aXZlLCBwYXRoLCBrZXksIGV4cGxpY2l0KTtcbiAgICBjb25zdCB2ZXJkaWN0ID0gaW5oZXJpdEJ5SWRlbnRpdHkoYWN0aXZlLCBhc2tlZCwgdGhpcy5fc2VsZWN0ZWRPYmplY3RzLCBwYXRoLCBrZXksIHZhbHVlKTtcbiAgICB0aGlzLnJlY29yZC53cml0ZShuc1BhdGgsIHZhbHVlLCB2ZXJiLCBzY3J1Yk9mKHZlcmRpY3QpKTtcbiAgICBtYXJrU3RhZ2VkV3JpdGUoYWN0aXZlLCB0aGlzLnBvbGljeS5yZWRhY3Rpb24sIHZlcmRpY3QsIHBhdGgsIGtleSwgdmVyYik7XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgYW5kIHJlYWQgYXQgQU5PVEhFUiBmcmFtZSdzIGFkZHJlc3MgKGl0cyBydW4gbmFtZXNwYWNlKSB3aGlsZSB0aGlzXG4gICAqIGZyYW1lIGtlZXBzIGl0cyBvd24gaWRlbnRpdHkgb24gdGhlIHJlY29yZCDigJQgYHN0YWdlYCwgYHN0YWdlSWRgLFxuICAgKiBgcnVudGltZVN0YWdlSWRgLCB0YWdzLiBBIHN1YmZsb3cgbW91bnQncyBtZXJnZS1iYWNrIGlzIHRoZSBvbmUgY2FsbGVyXG4gICAqIChgU3ViZmxvd0V4ZWN1dG9yIMK3IGV4ZWN1dGVTdWJmbG93YCwgUjEzKTogdGhlIG1vdW50IGZyYW1lIG9mIGEgYnJhbmNoIG9yXG4gICAqIGZvcmsgY2hpbGQgbGFuZHMgaXRzIHZhbHVlcyB3aGVyZSBpdHMgcGFyZW50IHdyaXRlcywgYXMgYmVmb3JlLCBhbmQgaXRzXG4gICAqIGJ1bmRsZSBub3cgbmFtZXMgdGhlIG1vdW50IGluc3RlYWQgb2YgdGhlIHN0YWdlIGJlZm9yZSBpdC4gUmVmdXNlZCBvbmNlXG4gICAqIHRoZSBmcmFtZSBoYXMgc3RhZ2VkIGFueXRoaW5nIOKAlCBpdHMgYnVmZmVyJ3MgYWRkcmVzcyBpcyBmaXhlZCB0aGVuLiBUaGVcbiAgICogZGVjaXNpb24gaXMgdGhlIGVuZ2luZSdzIChuYW1lc3BhY2UgaWRzLCBhcyBzaW5jZSBSMTMpOyB0aGUgcmVjb3JkIGZyYW1lXG4gICAqIHRha2VzIHRoZSBhZGRyZXNzIGl0IGNvbWVzIHRvIChgUmVjb3JkRnJhbWUgwrcgdXNlQWRkcmVzc2ApLlxuICAgKi9cbiAgdXNlQWRkcmVzc09mKGZyYW1lOiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmQuaGFzU3RhZ2VkICYmIGZyYW1lLm5hbWVzcGFjZUlkICE9PSB0aGlzLm5hbWVzcGFjZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbZm9vdHByaW50XSBTdGFnZUNvbnRleHQudXNlQWRkcmVzc09mOiAnJHt0aGlzLnN0YWdlSWR9JyBoYXMgYWxyZWFkeSBzdGFnZWQgd3JpdGVzIGF0IGl0cyBvd24gYWRkcmVzcy5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hZGRyZXNzUnVuSWQgPSBmcmFtZS5uYW1lc3BhY2VJZDtcbiAgICB0aGlzLnJlY29yZC51c2VBZGRyZXNzKHJ1bkFkZHJlc3ModGhpcy5uYW1lc3BhY2VJZCkpO1xuICB9XG5cbiAgLyoqIFRoZSBydW4gbmFtZXNwYWNlIHdyaXRlcyBhbmQgcmVhZHMgZ28gdG86IHtAbGluayBhZGRyZXNzUnVuSWR9LCBlbHNlIGBydW5JZGAuICovXG4gIHByaXZhdGUgZ2V0IG5hbWVzcGFjZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkcmVzc1J1bklkID8/IHRoaXMucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgV3JpdGUgb3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwYXRjaChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIHJldHVybiB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gIH1cblxuICBzZXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2gocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBtZXJnZShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdtZXJnZScpO1xuICB9XG5cbiAgc2V0T2JqZWN0KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uT3ZlcnJpZGU/OiAnc2V0JyB8ICdkZWxldGUnLFxuICApOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICAvLyBFeHBsaWNpdCBkZWxldGlvbiAoU2NvcGVGYWNhZGUuZGVsZXRlVmFsdWUpIHN0YWdlcyBhIGRpc3RpbmN0IG9wIHNvXG4gICAgLy8gZGVsdGEtbW9kZSBjb21taXRzICgjMTNjLUIpIGNhbiBlbWl0IGEgcmVhbCBgZGVsZXRlYCB0cmFjZSBlbnRyeS5cbiAgICAvLyBVbmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSB0aGUgYnVmZmVyIGNvbW1pdHMgaXQgYXMgYVxuICAgIC8vIHNldC1vZi11bmRlZmluZWQg4oCUIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBoaXN0b3JpY2FsIGZsYXR0ZW5pbmcuXG4gICAgY29uc3QgdmVyZGljdCA9XG4gICAgICBvcGVyYXRpb25PdmVycmlkZSA9PT0gJ2RlbGV0ZSdcbiAgICAgICAgPyB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB1bmRlZmluZWQsIHNob3VsZFJlZGFjdCwgJ2RlbGV0ZScpXG4gICAgICAgIDogdGhpcy5zdGFnZVdyaXRlKHRoaXMucmVjb3JkLmF0KHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ3NldCcpO1xuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgd3JpdGUgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyArIG9uQ29tbWl0IOKAlFxuICAgIC8vIHBvbGljeS1nYXRlZCAoIzEzYy1BKSwgc2VlIHRyYWNrV3JpdGUuXG4gICAgdGhpcy50cmFja1dyaXRlKHVzZXJLZXlPZihwYXRoLCBrZXkpLCB2YWx1ZSwgdmVyZGljdCwgb3BlcmF0aW9uT3ZlcnJpZGUgPz8gJ3NldCcpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdGFnZ2VkID0gZGVzY3JpcHRpb24uc3RhcnRzV2l0aCgnWycpID8gZGVzY3JpcHRpb24gOiBgW1dSSVRFXSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIHRhZ2dlZCk7XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgdXBkYXRlT2JqZWN0KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLm1lcmdlKHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCAndXBkYXRlJyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICBzZXRSb290KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2goW10sIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIFJvb3QtbGV2ZWwgKHVuLW5hbWVzcGFjZWQpIHdyaXRlIOKAlCB0aGUgc3ViZmxvdyBzZWVkIGFuZCBtZXJnZS1iYWNrIHBhdGguICovXG4gIHNldEdsb2JhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVHbG9iYWxDb250ZXh0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuc3RhZ2VXcml0ZShba2V5XSwgW10sIGtleSwgdmFsdWUsIHVuZGVmaW5lZCwgJ3NldCcpO1xuICB9XG5cbiAgYXBwZW5kVG9BcnJheShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIGl0ZW1zOiB1bmtub3duW10sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID0gQXJyYXkuaXNBcnJheShleGlzdGluZykgPyBbLi4uZXhpc3RpbmcsIC4uLml0ZW1zXSA6IFsuLi5pdGVtc107XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBtZXJnZU9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID1cbiAgICAgIGV4aXN0aW5nICYmIHR5cGVvZiBleGlzdGluZyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZXhpc3RpbmcpXG4gICAgICAgID8geyAuLi4oZXhpc3RpbmcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLCAuLi5vYmogfVxuICAgICAgICA6IHsgLi4ub2JqIH07XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZCBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUcmFja2VkIHJlYWQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBCT1JST1dFRCDigJQgc2VlIHRoZSBjb250cmFjdCBvblxuICAgKiBgU2NvcGVGYWNhZGUuZ2V0VmFsdWVgLiBSZWFkLXRyYWNraW5nIGNvc3QgaXMgcG9saWN5LWdhdGVkICgjMTQpOlxuICAgKiBgJ2Z1bGwnYCBjbG9uZXMgdGhlIHZhbHVlIGludG8gYF9zdGFnZVJlYWRzYCAoaGlzdG9yaWNhbCBkZWZhdWx0KSxcbiAgICogYCdzdW1tYXJ5J2AgcmVjb3JkcyBhIGNoZWFwIG1hcmtlciwgYCdvZmYnYCByZWNvcmRzIG5vdGhpbmcuXG4gICAqL1xuICBnZXRWYWx1ZShwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIC8vIFRoZSByZWNvcmQgZnJhbWUgc2VydmVzIHRoZSB2YWx1ZSAodHdvIHRpZXJzKSBhbmQga2VlcHMgdGhlIHBlci13cml0ZVxuICAgIC8vIHByb3ZlbmFuY2UgcmVnaXN0cnkgKCNQMSkg4oCUIGtleSBzdHJpbmdzIG9ubHksIGluZGVwZW5kZW50IG9mIHRoZVxuICAgIC8vIHJlYWRUcmFja2luZyByZXRlbnRpb24gZGlhbCAod2hpY2ggZ292ZXJucyBWQUxVRSByZXRlbnRpb24gYmVsb3cpLlxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWNvcmQucmVhZChwYXRoLCBrZXkpO1xuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgdGhpcy5yZWNvcmQubm90ZVJlYWQocGF0aCwga2V5KTtcbiAgICAvLyBUaGUgdmVyZGljdCwgb25jZSDigJQgZm9yIHRoZSByZXRhaW5lZCByZWFkIGJlbG93IGFuZCB0aGUgc2VsZWN0ZWQtcmVhZFxuICAgIC8vIGNvdW50IChgc2VsZWN0ZWRSZWFkc2ApLiBObyBwb2xpY3kgYW5kIG5vIG1hcmtzIOKGkiBubyB2ZXJkaWN0IGNhbGwsIG5vXG4gICAgLy8gYWxsb2NhdGlvbiAoYWN0aXZlUnVsZSkuXG4gICAgY29uc3QgcnVsZSA9IGtleSAhPT0gdW5kZWZpbmVkID8gdGhpcy5hY3RpdmVSdWxlKCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdmVyZGljdCA9IHJ1bGUgIT09IHVuZGVmaW5lZCA/IHJ1bGUudmVyZGljdEF0KHBhdGgsIGtleSBhcyBzdHJpbmcpIDogQ0xFQVI7XG4gICAgaWYgKHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJlYWRzICs9IDE7XG4gICAgICAvLyBBbiBvYmplY3QgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUsIHdyaXR0ZW4gYmFjayB1bmRlciBhbm90aGVyLCBrZWVwcyBpdHMgcnVsZSAoc3RhZ2VXcml0ZSkuXG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgKHRoaXMuX3NlbGVjdGVkT2JqZWN0cyA/Pz0gbmV3IFdlYWtNYXAoKSkuc2V0KHZhbHVlLCB2ZXJkaWN0KTtcbiAgICB9XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCByZWFkIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcg4oCUIHJldGFpbmVkIHVuZGVyXG4gICAgLy8gdGhlIHJ1bGUncyB2ZXJkaWN0ICg5LjE5LjApOiBhIHJlZGFjdGVkIGtleSBpcyByZXRhaW5lZCBhcyB0aGVcbiAgICAvLyBwbGFjZWhvbGRlciwgYSBmaWVsZC1sZXZlbCBrZXkgYXMgYSBzY3J1YmJlZCBjbG9uZSwgbmV2ZXIgdGhlIHNlY3JldC5cbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nICE9PSAnb2ZmJykge1xuICAgICAgaWYgKHBhdGgubGVuZ3RoID4gMCkgKHRoaXMuX25lc3RlZFJlYWRzID8/PSBuZXcgU2V0KCkpLmFkZCh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gICAgICBlbHNlIGlmICh0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgPT09ICdmdWxsJyAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgICBpZiAodGhpcy5yZWNvcmQuaGFzU3RhZ2VkKSB0aGlzLl92aWV3UmVhZHM/LmRlbGV0ZShrZXkpO1xuICAgICAgICBlbHNlICh0aGlzLl92aWV3UmVhZHMgPz89IG5ldyBTZXQoKSkuYWRkKGtleSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFnZVJlYWRzW3VzZXJLZXlPZihwYXRoLCBrZXkpXSA9XG4gICAgICAgIHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogdGhpcy5yZXRhaW5lZEZvcm0odmVyZGljdCwgdmFsdWUsIHRoaXMucG9saWN5LnJlYWRUcmFja2luZywgc3VtbWFyaXplUmVhZFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGBbUkVBRF0gJHtkZXNjcmlwdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRyYWNrZWQgcmVhZHMgb2YgdGhpcyBmcmFtZSByZWFkIGEgdmFsdWUgdGhlIHJ1bidzIHJ1bGUgc2VsZWN0c1xuICAgKiAoYSBrZXkgaXQgbWFza3Mgd2hvbGUsIG9yIG9uZSB3aXRoIHNlY3JldCBmaWVsZHMpLiBBIGJvdW5kYXJ5IHRoYXQgbWFwc1xuICAgKiB3aGF0IGEgc3RhZ2UgZnVuY3Rpb24gUkVBRCBpbnRvIGEgbmV3IG5hbWUg4oCUIHRoZSBgcGFyYWxsZWxGb3JFYWNoYCBpdGVtc1xuICAgKiBzZWxlY3RvciDigJQgY29tcGFyZXMgaXQgYmVmb3JlIGFuZCBhZnRlciwgYXMgYSBzdWJmbG93IG1hcHBlcidzIHRhaW50IGRvZXNcbiAgICogKGBtZW1vcnkvcmVkYWN0aW9uLnRzIMK3IE1hcHBlclRhaW50YCkuIEFsd2F5cyAwIHdpdGhvdXQgYSBwb2xpY3kgb3IgYSBtYXJrLlxuICAgKi9cbiAgZ2V0IHNlbGVjdGVkUmVhZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRSZWFkcztcbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgdHJhY2tpbmcgaW4gX3N0YWdlUmVhZHMgb3IgcGF5aW5nIHN0cnVjdHVyZWRDbG9uZSBjb3N0LlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZS5nZXRWYWx1ZVNpbGVudCgpIGZvciBhcnJheSBwcm94eSBpbnRlcm5hbCBvcGVyYXRpb25zLiAqL1xuICBnZXRWYWx1ZURpcmVjdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnJlYWQocGF0aCwga2V5KTtcbiAgfVxuXG4gIGdldFJvb3Qoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQucmVhZExpdmUoa2V5KTtcbiAgfVxuXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5yZWFkR2xvYmFsKGtleSk7XG4gIH1cblxuICBnZXRTY29wZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnN0YXRlLmdldFN0YXRlKCk7XG4gIH1cblxuICBnZXRSdW5JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIENvbW1pdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUkZDLTAwMyBEMjogcmVjb3JkIHRoYXQgdGhpcyBzdGFnZSBjb25zdW1lZCBhbiB1bnRyYWNrZWQgcmVhZCBwYXRoLlxuICAgKiBDYWxsZWQgYnkgYFNjb3BlRmFjYWRlYCAoYGdldEFyZ3NgL2BnZXRFbnZgL3Vuc2hhZG93ZWQgYGdldFZhbHVlU2lsZW50YCk7XG4gICAqIHN1cmZhY2VkIGFzIGBDb21taXRCdW5kbGUudW50cmFja2VkU291cmNlc2Agb24gdGhpcyBzdGFnZSdzIGNvbW1pdC5cbiAgICovXG4gIG1hcmtVbnRyYWNrZWRTb3VyY2Uoc291cmNlOiBVbnRyYWNrZWRTb3VyY2UpOiB2b2lkIHtcbiAgICAodGhpcy5fdW50cmFja2VkU291cmNlcyA/Pz0gbmV3IFNldCgpKS5hZGQoc291cmNlKTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBhbiBvYnNlcnZlciB0aGF0IGZpcmVzIGFmdGVyIGNvbW1pdCgpIGFwcGxpZXMgcGF0Y2hlcy5cbiAgICogIFVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZGlzcGF0Y2ggU2NvcGVSZWNvcmRlci5vbkNvbW1pdCBldmVudHMuICovXG4gIHNldENvbW1pdE9ic2VydmVyKFxuICAgIG9ic2VydmVyOiAobXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PikgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXYtbW9kZSBvbmx5OiBkaWQgdGhpcyBzdGFnZSBjaGFuZ2UsIElOIFBMQUNFLCBhIHZhbHVlIGl0IG1lcmVseSBSRUFEP1xuICAgKlxuICAgKiBUaGUgdHlwZWQgc2NvcGUgaW50ZXJjZXB0cyBldmVyeSB3cml0ZSBpdCBjYW4gcmVhY2gg4oCUIGEgcHJvcGVydHkgYXQgYW55XG4gICAqIGRlcHRoLCBhbiBpbmRleGVkIGVsZW1lbnQsIGFuIGFycmF5IG1ldGhvZC4gV2hhdCBpdCBjYW5ub3QgcmVhY2ggaXMgYW5cbiAgICogZWxlbWVudCBoYW5kZWQgb3V0IGJ5IGEgcmVhZCBtZXRob2QgKGBmaW5kYCwgYGZpbHRlcmAsIGBmb3LigKZvZmAsXG4gICAqIGBmb3JFYWNoYCwgZGVzdHJ1Y3R1cmluZyk6IHdyYXBwaW5nIHRob3NlIHdvdWxkIG1lYW4gcmV0dXJuaW5nIHByb3hpZXMgb3V0XG4gICAqIG9mIGV2ZXJ5IHJlYWQsIHdoaWNoIGlzIGEgY29zdCB0aGUgbGlicmFyeSBzaG91bGQgbm90IHBheS4gU28gdGhhdCBmYW1pbHlcbiAgICogaXMgV0FSTkVEIEFCT1VUIHJhdGhlciB0aGFuIGludGVyY2VwdGVkIOKAlCBsb3VkbHksIGhlcmUsIGluc3RlYWQgb2YgZW5kaW5nXG4gICAqIHRoZSBydW4gd2l0aCBhIGNvbW1pdCBsb2cgdGhhdCBzaWxlbnRseSBkaXNhZ3JlZXMgd2l0aCBmaW5hbCBzdGF0ZS5cbiAgICpcbiAgICogVGhpcyBpcyBhIFJFUE9SVCBhZnRlciB0aGUgZmFjdCwgbm90IGEgcmVmdXNhbCBhdCB0aGUgd3JpdGU6IHRoZSB3cml0ZSBoYXNcbiAgICogYWxyZWFkeSBoYXBwZW5lZCBpbiBwbGFjZSBhbmQgdGhlcmUgaXMgbm90aGluZyB0byBpbnRlcmNlcHQuIEl0IHJ1bnMgdW5kZXJcbiAgICogVFdPIHByZWNvbmRpdGlvbnMsIGJvdGggbmFtZWQgaW4gdGhlIFJFQURNRSDigJQgYGVuYWJsZURldk1vZGUoKWAsIGFuZFxuICAgKiBgcmVhZFRyYWNraW5nOiAnZnVsbCdgICh0aGUgZGVmYXVsdCksIGJlY2F1c2UgdGhlIGNvbXBhcmlzb24gbmVlZHMgdGhlXG4gICAqIGNsb25lIG9mIHRoZSB2YWx1ZSB0aGF0IG1vZGUgcmV0YWlucyBhdCByZWFkIHRpbWUuIEEga2V5IHRoZSBzdGFnZSBuZXZlclxuICAgKiBzdGFnZWQgbXVzdCBzdGlsbCBob2xkIHRoYXQgY2xvbmUg4oCUIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcFxuICAgKiBhbmQgdGhlIGJ1ZmZlcidzIHdvcmtpbmcgY29weSBpcyBwcml2YXRlIHRvIHRoaXMgc3RhZ2UuIEtleXMgdGhlIHN0YWdlIERJRFxuICAgKiBzdGFnZSBhcmUgc2tpcHBlZCAodGhleSBhcmUgZXhwZWN0ZWQgdG8gZGlmZmVyLCBhbmQgdGhleSBhcmUgaW4gdGhlIHJlY29yZCksXG4gICAqIHNvIGFyZSBrZXlzIHVuZGVyIGEgcmVkYWN0aW9uIHZlcmRpY3QsIHdob3NlIHJldGFpbmVkIGZvcm0gaXMgZGVsaWJlcmF0ZWx5XG4gICAqIG5vdCB0aGUgdmFsdWUsIGFuZCBzbyBhcmUga2V5cyByZWFkIGF0IGEgbmVzdGVkIHBhdGggKGBfbmVzdGVkUmVhZHNgKSDigJRcbiAgICogdGhvc2UgYXJlIGVuZ2luZSByZWFkcyAodGhlIHN1YmZsb3cgbWVyZ2UtYmFjayksIG5vdCB1c2VyIHJlYWRzLlxuICAgKlxuICAgKiBJdCBhbHNvIG9ubHkgbG9va3MgYXQga2V5cyBzZXJ2ZWQgZnJvbSB0aGUgUElOTkVEIHNvdXJjZSDigJQgdGhlIGZpcnN0LXRvdWNoXG4gICAqIHZpZXcgb3IgdGhpcyBzdGFnZSdzIG93biBidWZmZXIuIEEga2V5IGFic2VudCBmcm9tIGJvdGggd2FzIHNlcnZlZCBieSB0aGVcbiAgICogcmVhZCdzIGxpdmUgZmFsbGJhY2sgKGBSZWNvcmRGcmFtZSDCtyByZWFkYCwgdGllciAyKSwgd2hpY2ggYSBwYXJhbGxlbCBzaWJsaW5nJ3Mgcm9vdC1rZXkgY29tbWl0IGNhblxuICAgKiBsZWdpdGltYXRlbHkgbW92ZTsgYWNjdXNpbmcgdGhlIHN0YWdlIHRoZXJlIHdvdWxkIGJlIGEgZmFsc2UgYWxhcm0uIEZvclxuICAgKiB0aGUgc2FtZSByZWFzb24gaXQgcnVucyBvbiB0aGUgZnJhbWUncyBGSVJTVCBjb21taXQgb25seTogdGhlIHJlYWRzIGJlbG9uZ1xuICAgKiB0byB0aGF0IHJvdW5kLCBhbmQgYnkgdGhlIGVuZ2luZSdzIHNlY29uZCByb3VuZCAoYSBmb3JrIGRvdWJsZS1jb21taXQsIGFcbiAgICogc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBjb21taXR0ZWQgYnJhbmNoIHBhcmVudCkgb3RoZXIgc3RhZ2VzIGhhdmVcbiAgICogbGVnaXRpbWF0ZWx5IG1vdmVkIHRoZSBzdGF0ZSB0aGV5IHdlcmUgY29tcGFyZWQgYWdhaW5zdC5cbiAgICpcbiAgICogQSBrZXkgdGhlIHN0YWdlIERJRCBzdGFnZSBpcyBzdGlsbCBjaGVja2VkIHdoZW4gaXRzIGxhc3QgcmVhZCBjYW1lIGZyb21cbiAgICogY29tbWl0dGVkIHN0YXRlICh7QGxpbmsgX3ZpZXdSZWFkc30g4oCUIHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSk6XG4gICAqIHRoYXQgcmVhZCB3YXMgdGhlIGNvbW1pdHRlZCBvYmplY3QgaXRzZWxmLCBhbmQgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSBJU1xuICAgKiB0aGF0IG9iamVjdCAoY29weS1vbi13cml0ZSwgOS4yOS4wKSwgc28gYW4gaW4tcGxhY2UgZWRpdCBmb2xsb3dlZCBieSBhXG4gICAqIHdyaXRlIG9mIHRoZSBrZXkgY29tbWl0cyBOTyBjaGFuZ2Ug4oCUIGxpdmUgc3RhdGUga2VlcHMgdGhlIGVkaXQsIHRoZSBsb2dcbiAgICogZG9lcyBub3QuIENvbXBhcmVkIGFnYWluc3QgY29tbWl0dGVkIHN0YXRlLCBub3QgdGhlIHdyaXR0ZW4gdmFsdWUsIHNvIGFcbiAgICogbGVnaXRpbWF0ZSB3cml0ZSBuZXZlciB0cmlwcyBpdC5cbiAgICpcbiAgICogQ29zdHMgbm90aGluZyBvdXRzaWRlIGBlbmFibGVEZXZNb2RlKClgLlxuICAgKi9cbiAgcHJpdmF0ZSB3YXJuT25Cb3Jyb3dlZE11dGF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghaXNEZXZNb2RlKCkgfHwgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nICE9PSAnZnVsbCcgfHwgdGhpcy5fY29tbWl0dGVkKSByZXR1cm47XG4gICAgY29uc3QgcnVsZSA9IHRoaXMuYWN0aXZlUnVsZSgpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpKSB7XG4gICAgICBjb25zdCByZXRhaW5lZCA9IHRoaXMuX3N0YWdlUmVhZHNba2V5XTtcbiAgICAgIC8vIE9ubHkgYSBjb250YWluZXIgY2FuIGJlIG11dGF0ZWQgaW4gcGxhY2U7IGEgcHJpbWl0aXZlIHJlYWQgY2Fubm90LlxuICAgICAgaWYgKHJldGFpbmVkID09PSBudWxsIHx8IHR5cGVvZiByZXRhaW5lZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMuX25lc3RlZFJlYWRzPy5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICBpZiAocnVsZSAhPT0gdW5kZWZpbmVkICYmIHJ1bGUudmVyZGljdEF0KFtdLCBrZXkpLmtpbmQgIT09ICdjbGVhcicpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmFtZXNwYWNlZCA9IHRoaXMucmVjb3JkLmF0KFtdLCBrZXkpO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9zdGFnZVdyaXRlcywga2V5KSB8fCB0aGlzLnJlY29yZC53YXNTdGFnZWQobmFtZXNwYWNlZCkpIHtcbiAgICAgICAgdGhpcy53YXJuT25Db21taXR0ZWRNdXRhdGlvbihrZXksIG5hbWVzcGFjZWQsIHJldGFpbmVkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBwaW5uZWQgc291cmNlIG9ubHkg4oCUIHNlZSB0aGUgbm90ZSBvbiB0aGUgbGl2ZSBmYWxsYmFjayBhYm92ZS5cbiAgICAgIC8vIGBwZWVrYCwgbm90IGBnZXRgOiBhIHJlcG9ydCBjb21wYXJlcywgYW5kIG11c3Qgbm90IHRha2UgdGhlIHByaXZhdGVcbiAgICAgIC8vIGNvcHkgYSBzdGFnZSdzIHJlYWQgd291bGQgKGNvcHktb24td3JpdGUsIDkuMjkuMCkuXG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5yZWNvcmQucGVlayhuYW1lc3BhY2VkKTtcbiAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYXRoID0gZmlyc3REaWZmZXJpbmdQYXRoKHJldGFpbmVkLCBjdXJyZW50KTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2Fybihib3Jyb3dlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBzdGFnZWQta2V5IGhhbGYgb2Yge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259OiBkaWQgY29tbWl0dGVkIHN0YXRlIGl0c2VsZiBtb3ZlIHVuZGVyIGEgcmVhZD8gKi9cbiAgcHJpdmF0ZSB3YXJuT25Db21taXR0ZWRNdXRhdGlvbihrZXk6IHN0cmluZywgbmFtZXNwYWNlZDogc3RyaW5nW10sIHJldGFpbmVkOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl92aWV3UmVhZHM/LmhhcyhrZXkpKSByZXR1cm47XG4gICAgY29uc3QgY29tbWl0dGVkID0gdGhpcy5yZWNvcmQuYmFzZUF0KG5hbWVzcGFjZWQpO1xuICAgIGlmIChjb21taXR0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhdGggPSBmaXJzdERpZmZlcmluZ1BhdGgocmV0YWluZWQsIGNvbW1pdHRlZCk7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKGNvbW1pdHRlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggc3RhZ2VkIHdyaXRlcyB0byBzaGFyZWQgbWVtb3J5IGFuZCBSRUxFQVNFIHRoZSBwZXItc3RhZ2Ugc3RhZ2luZ1xuICAgKiBzdGF0ZSAoIzEzYikuXG4gICAqXG4gICAqIGBwaGFzZWAgKDkuMzkuMCkgaXMgdGhlIGNhbGxlcidzIHN0YXRlbWVudCBvZiB3aGF0IGEgQ09OVElOVUFUSU9OIGNvbW1pdFxuICAgKiBpcyDigJQgYCdleGl0J2AgZnJvbSBhIHN1YmZsb3cgbW91bnQncyBleGl0LCBgJ3JlcGVhdCdgIGZyb20gYSBmb3JrXG4gICAqIGZhbi1vdXQncyBzZXR0bGUuIEl0IGlzIHN0YW1wZWQgb24gdGhlIGJ1bmRsZSAoYENvbW1pdEJ1bmRsZS5waGFzZWApIG9ubHlcbiAgICogd2hlbiB0aGlzIGZyYW1lIGhhcyBBTFJFQURZIGNvbW1pdHRlZDogdGhlIEZJUlNUIGJ1bmRsZSBvZiBhbiBleGVjdXRpb25cbiAgICogaXMgdGhlIHN0YWdlJ3Mgb3duIGFuZCBuZXZlciBjYXJyaWVzIGEgYHBoYXNlYCDigJQgc28gYSBtb3VudCB3aXRob3V0IGFuXG4gICAqIGBvdXRwdXRNYXBwZXJgIChhIGxhenkgbW91bnQsIGV2ZXJ5IGBwYXJhbGxlbEZvckVhY2hgIGJyYW5jaCksIHdob3NlIGV4aXRcbiAgICogaXMgaXRzIG9ubHkgYnVuZGxlLCByZWNvcmRzIHRoYXQgYnVuZGxlIGFzIGl0cyBvd24sIHRhZ3MgYW5kIGFsbC5cbiAgICpcbiAgICogQ29tbWl0IGlzIHRoZSBzdGFnZSdzIGxpZmVjeWNsZSBlbmQ6IHRoZSByZWNvcmQgZnJhbWUncyBidWZmZXIgYW5kXG4gICAqIGZpcnN0LXRvdWNoIGJhc2UgYXJlIG9ubHkgbmVlZGVkIERVUklORyBleGVjdXRpb24sIGFzIHRoZSByZWFkIHNuYXBzaG90ICtcbiAgICogbmV0LWNoYW5nZSBkaWZmIGJhc2UsIHNvIHRoZSByZWNvcmQgZnJhbWUgcmVsZWFzZXMgdGhlbSBvbmNlIHRoZSBjb21taXRcbiAgICogaGFzIGxhbmRlZCBhbmQgdGhlIG9ic2VydmVyIGhhcyBzZWVuIGl0IChgUmVjb3JkRnJhbWUgwrcgcmVsZWFzZWAg4oCUIHdoeSBhXG4gICAqIGZyYW1lIHRoYXQga2VwdCB0aGVtIHdvdWxkIHJldGFpbiBvbmUgc3RhdGUgZ2VuZXJhdGlvbiBwZXIgZXhlY3V0ZWRcbiAgICogc3RhZ2UsIGFuZCB3aHkgYSByZS11c2VkIGZyYW1lIHJlLWFuY2hvcnMgb24gY3VycmVudCBzdGF0ZSwgaXMgdGhlcmUpLlxuICAgKlxuICAgKiBSRS1VU0UgQUZURVIgQ09NTUlUIHN0YXlzIGNvcnJlY3QgYmVjYXVzZSBib3RoIHJlLWNyZWF0ZSBsYXppbHk6XG4gICAqIC0gYSBsYXRlciBSRUFEIHJlLWFuY2hvcnMgb24gdGhlIENVUlJFTlQgY29tbWl0dGVkIHN0YXRlICh3aGljaCBpbmNsdWRlc1xuICAgKiAgIHRoaXMgc3RhZ2UncyBvd24gZmx1c2hlZCB3cml0ZXMpO1xuICAgKiAtIGEgbGF0ZXIgV1JJVEUgY29uc3RydWN0cyBhIGZyZXNoIGJ1ZmZlciBvbiB0aGF0IHJlLWFuY2hvcmVkIHZpZXcsIHNvIGFcbiAgICogICBzZWNvbmQgY29tbWl0IGRpZmZzIGFnYWluc3QgcG9zdC1maXJzdC1jb21taXQgc3RhdGUuIFRoZSBwcmUtcmVsZWFzZVxuICAgKiAgIGJ1ZmZlciBiZWhhdmVkIHRoZSBzYW1lIGZvciBWQUxVRVMgKGl0cyBgd29ya2luZ0NvcHlgIHdhcyByZXNldCBvblxuICAgKiAgIGNvbW1pdCwgZmFsbGluZyByZWFkcyB0aHJvdWdoIHRvIGxpdmUgc3RhdGUpIGJ1dCBrZXB0IHRoZSBPUklHSU5BTFxuICAgKiAgIGBiYXNlU25hcHNob3RgIGFzIGRpZmYgYmFzZSDigJQgdW5yZWFjaGFibGUgaW4gcHJhY3RpY2U6IHRoZSBlbmdpbmUnc1xuICAgKiAgIG9ubHkgd3JpdGVzIGFmdGVyIGEgY29tbWl0IGFyZSB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBjb21taXR0ZWRcbiAgICogICBicmFuY2ggcGFyZW50IChhIGRlY2lkZXIgb3IgZm9yayBmcmFtZSBjb21taXRzIGJlZm9yZSBpdHMgYnJhbmNoIHJ1bnMpO1xuICAgKiAgIHRoZSBvdGhlciBcIndyaXRlIGFmdGVyIGNvbW1pdFwiXG4gICAqICAgc2l0ZXMgKFN1YmZsb3dFeGVjdXRvciBzZWVkIOKGkiByZXBsYWNlcyB0aGUgY29udGV4dDsgcmVzdW1lIOKGkiBmcmVzaFxuICAgKiAgIGNvbnRleHQgdmlhIGBsZWFmLmNyZWF0ZU5leHRgKSBuZXZlciByZS11c2UgYSBjb21taXR0ZWQgY29udGV4dC5cbiAgICogLSBBIFVTRVIgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgaXMgYSBkaWZmZXJlbnQgbWF0dGVyOiBpdHMgd3JpdGVzXG4gICAqICAgd291bGQgbGFuZCBpbiBhIGJ1ZmZlciBub3RoaW5nIGV2ZXIgY29tbWl0cy4gVGhhdCByZWZ1c2FsIGxpdmVzIG9uIHRoZVxuICAgKiAgIHNjb3BlIHRpZXIgKGBTY29wZUZhY2FkZWAsIHNlYWxlZCBieSB0aGUgY29tbWl0IG9ic2VydmVyIOKAlCA5LjIyLjApLFxuICAgKiAgIGJlY2F1c2UgdGhlIGZyYW1lJ3MgcmUtdXNhYmlsaXR5IGlzIGV4YWN0bHkgd2hhdCB0aGUgZW5naW5lIHBhdGhzXG4gICAqICAgYWJvdmUgbmVlZC5cbiAgICogLSBgX3N0YWdlV3JpdGVzYCAvIGBfc3RhZ2VSZWFkc2AgYXJlIE5PVCByZWxlYXNlZCDigJQgYHNuYXBzaG90U2VsZigpYFxuICAgKiAgIHJlYWRzIHRoZW0gcG9zdC1ydW4gZm9yIHRoZSBleGVjdXRpb24tdHJlZSBzbmFwc2hvdC5cbiAgICovXG4gIGNvbW1pdChwaGFzZT86IENvbW1pdFBoYXNlKTogdm9pZCB7XG4gICAgLy8gQSBjb250aW51YXRpb24gb25seSBBRlRFUiB0aGUgZXhlY3V0aW9uJ3Mgb3duIGJ1bmRsZSAoc2VlIGFib3ZlKS5cbiAgICBjb25zdCBjb250aW51YXRpb24gPSB0aGlzLl9jb21taXR0ZWQgPyBwaGFzZSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hdGVyaWFsaXNlV3JpdGVzKCk7XG4gICAgdGhpcy53YXJuT25Cb3Jyb3dlZE11dGF0aW9uKCk7XG4gICAgLy8gVGhlIHJlY29yZCdzIGhhbGYgKGBSZWNvcmRGcmFtZSDCtyBjb21taXRgIOKGkiBgcmVjb3JkQ29tbWl0LnRzYCkuIE5vIGJ1ZmZlclxuICAgIC8vID0gbm8gd3JpdGUgZXZlciBidWlsdCBvbmUgKCMxMyk6IHRoZSBjb21taXQgaXMgZW1wdHkgYnkgY29uc3RydWN0aW9uLFxuICAgIC8vIHJlY29yZGVkIHdpdGggWkVSTyBjbG9uZXMuIFRoZSBuYW1lcyBhcmUgcmVhZCBvbmNlIHRoZSBwYXlsb2FkIGlzIGJ1aWx0LlxuICAgIHRoaXMucmVjb3JkLmNvbW1pdCgoKSA9PiAoe1xuICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgICB1bnRyYWNrZWRTb3VyY2VzOiB0aGlzLl91bnRyYWNrZWRTb3VyY2VzLFxuICAgICAgdGFnczogdGhpcy50YWdzLFxuICAgICAgcGhhc2U6IGNvbnRpbnVhdGlvbixcbiAgICB9KSk7XG4gICAgLy8gVGhlIG9ic2VydmVyIChTY29wZUZhY2FkZSkgc2VlcyB0aGUgdHJhY2tlZCBtdXRhdGlvbnMsIFRIRU4gdGhlIHN0YWdpbmdcbiAgICAvLyBzdGF0ZSBpcyByZWxlYXNlZCAoIzEzYiksIHNvIGl0IHNlZXMgdGhlIHdvcmxkIGFzIGl0IHdhcy4gRDIncyBtYXJrZXJzXG4gICAgLy8gYW5kIHRoZSBkZWNsYXJlZCB0YWdzIHJlbGVhc2Ugd2l0aCBpdCDigJQgb25lIHN0YW1wIHBlciBleGVjdXRpb24sIHNvIHRoZVxuICAgIC8vIGVuZ2luZSdzIGRvdWJsZS1jb21taXQgcGF0aHMgcmVjb3JkIHRoZW0gZXhhY3RseSBvbmNlLlxuICAgIGlmICh0aGlzLl9jb21taXRPYnNlcnZlcikge1xuICAgICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIoeyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9KTtcbiAgICB9XG4gICAgdGhpcy5yZWNvcmQucmVsZWFzZSgpO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50YWdzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NvbW1pdHRlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3cgYXdheSBldmVyeXRoaW5nIHRoaXMgc3RhZ2UgaGFzIFNUQUdFRCwgd2l0aG91dCBjb21taXR0aW5nIGFueSBvZiBpdC5cbiAgICpcbiAgICogVGhlIGlzb2xhdGlvbiBwcmltaXRpdmUgYmVoaW5kIGRlY2xhcmF0aXZlIHJldHJ5OiB3aGVuIGEgbm9uLWZpbmFsIGF0dGVtcHRcbiAgICogZmFpbHMsIHRoZSB3cml0ZXMgaXQgc3RhZ2VkIG11c3Qgbm90IGJlIHZpc2libGUgdG8gdGhlIG5leHQgYXR0ZW1wdCwgbXVzdFxuICAgKiBub3QgcmVhY2ggc2hhcmVkIHN0YXRlLCBhbmQgbXVzdCBub3QgYXBwZWFyIGluIHRoZSBjb21taXQgbG9nIG9yIGluIHRoaXNcbiAgICogc3RhZ2UncyBzbmFwc2hvdC4gRHJvcHBpbmcgdGhlIHN0YWdpbmcgc3RhdGUgYWNoaWV2ZXMgYWxsIGZvdXIgYXQgb25jZSDigJRcbiAgICogdGhlcmUgaXMgbm8gcm9sbGJhY2sgbWFjaGluZXJ5IHRvIGludm9rZSBiZWNhdXNlIG5vdGhpbmcgd2FzIGV2ZXIgYXBwbGllZFxuICAgKiAoTTE6IHRoZSB0cmFuc2FjdGlvbiBidWZmZXIgaG9sZHMgd3JpdGVzIHVudGlsIGBjb21taXQoKWAgZmx1c2hlcyB0aGVtKS5cbiAgICpcbiAgICogV2hhdCBpcyByZWxlYXNlZCwgYW5kIHdoeSBlYWNoIG9uZSBtYXR0ZXJzIGZvciB0aGUgbmV4dCBhdHRlbXB0OlxuICAgKiAgLSB0aGUgcmVjb3JkIGZyYW1lJ3Mgc3RhZ2VkIHN0YXRlIChgUmVjb3JkRnJhbWUgwrcgZGlzY2FyZGApIOKAlCB0aGUgYnVmZmVyXG4gICAqICAgICAgICAgICAgICAgICAgICAodGhlIG5leHQgYXR0ZW1wdCBzdGFydHMgd2l0aCBub3RoaW5nIHN0YWdlZCksIHRoZVxuICAgKiAgICAgICAgICAgICAgICAgICAgZmlyc3QtdG91Y2ggYmFzZSAoaXQgcmUtYW5jaG9ycyBvbiBjb21taXR0ZWQgc3RhdGUgYXNcbiAgICogICAgICAgICAgICAgICAgICAgIGl0IHN0YW5kcyBOT1cg4oCUIGEgc2libGluZyBmb3JrIGJyYW5jaCBtYXkgbGVnaXRpbWF0ZWx5XG4gICAqICAgICAgICAgICAgICAgICAgICBoYXZlIGNvbW1pdHRlZCBpbiBiZXR3ZWVuKSBhbmQgdGhlIHJlYWRLZXlzIGxpc3QgKCNQMTpcbiAgICogICAgICAgICAgICAgICAgICAgIGEgZGlzY2FyZGVkIGF0dGVtcHQncyByZWFkcyBtdXN0IG5ldmVyIHJlYWNoIHRoZSBuZXh0XG4gICAqICAgICAgICAgICAgICAgICAgICBhdHRlbXB0J3MgYFRyYWNlRW50cnkucmVhZEtleXNgKTtcbiAgICogIC0gYF9zdGFnZVdyaXRlc2AgLyBgX3BlbmRpbmdXcml0ZXNgIC8gYF9zdGFnZVJlYWRzYCDigJQgdGhlIHNuYXBzaG90XG4gICAqICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOyB3aXRob3V0IHRoZSByZXNldCB0aGUgZXhlY3V0aW9uIHRyZWUgd291bGRcbiAgICogICAgICAgICAgICAgICAgICAgIHJlcG9ydCB3cml0ZXMgdGhhdCB3ZXJlIGRpc2NhcmRlZCwgd2hpY2ggaXMgdGhlIGV4YWN0XG4gICAqICAgICAgICAgICAgICAgICAgICBsaWUgdGhpcyBmZWF0dXJlIGV4aXN0cyB0byBwcmV2ZW50ICh0aGUgcGVuZGluZyBtYXBcbiAgICogICAgICAgICAgICAgICAgICAgIGhvbGRzIGJhcmUgcmVmZXJlbmNlcyDigJQgZHJvcHBpbmcgaXQgdW4tY2xvbmVzIG5vdGhpbmcpO1xuICAgKiAgLSBgX3VudHJhY2tlZFNvdXJjZXNgIOKAlCB0aGUgRDIgaG9uZXN0eSBtYXJrZXJzLCByZWxlYXNlZCB3aXRoIHRoZSByZXN0LlxuICAgKlxuICAgKiBXaGF0IGlzIGRlbGliZXJhdGVseSBLRVBUOiBgZGVidWdgIChsb2dzLCBtZXRyaWNzLCBlcnJvcnMsIGZsb3cgbWVzc2FnZXMpLlxuICAgKiBEaWFnbm9zdGljcyBhcmUgdGhlIGFwcGVuZC1vbmx5IHJlY29yZCBvZiB3aGF0IGV2ZXJ5IGF0dGVtcHQgZGlkLCBhbmQgdGhlXG4gICAqIHJldHJ5IGZlYXR1cmUncyB3aG9sZSBwb2ludCBpcyB0aGF0IHRoZSBlYXJsaWVyIGF0dGVtcHRzIHN0YXkgdmlzaWJsZS5cbiAgICpcbiAgICogTm8gY29tbWl0IGlzIHJlY29yZGVkIGFuZCBubyBvYnNlcnZlciBmaXJlcyDigJQgYSBkaXNjYXJkZWQgYXR0ZW1wdCBpcyBub3QgYVxuICAgKiBjdXJzb3Igc3RvcCwgYmVjYXVzZSBmcm9tIHNoYXJlZCBzdGF0ZSdzIHBvaW50IG9mIHZpZXcgaXQgbmV2ZXIgaGFwcGVuZWQuXG4gICAqL1xuICBkaXNjYXJkU3RhZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMucmVjb3JkLmRpc2NhcmQoKTtcbiAgICB0aGlzLl91bnRyYWNrZWRTb3VyY2VzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3RhZ2VXcml0ZXMgPSB7fTtcbiAgICB0aGlzLl9zdGFnZVJlYWRzID0ge307XG4gICAgdGhpcy5fbmVzdGVkUmVhZHMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdmlld1JlYWRzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRyZWUgbmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3JlYXRlIChvciByZXR1cm4pIHRoaXMgY29udGV4dCdzIGxpbmtlZCBzdWNjZXNzb3IuXG4gICAqXG4gICAqIE1FTU9JWkVEOiB0aGUgZmlyc3QgY2FsbCBjcmVhdGVzIGB0aGlzLm5leHRgOyBldmVyeSBsYXRlciBjYWxsIHJldHVybnNcbiAgICogdGhhdCBTQU1FIGNvbnRleHQgYW5kIElHTk9SRVMgaXRzIGFyZ3VtZW50cy4gSW4gbm9ybWFsIHRyYXZlcnNhbCBlYWNoXG4gICAqIGNvbnRleHQgYWR2YW5jZXMgZXhhY3RseSBvbmNlLCBzbyB0aGUgbWVtbyBuZXZlciBiaXRlcyDigJQgYnV0IGEgY2FsbGVyXG4gICAqIGV4cGVjdGluZyBhIGZyZXNoIGNvbnRleHQgZm9yIGRpZmZlcmVudCBgc3RhZ2VOYW1lYC9gc3RhZ2VJZGAgYXJncyBnZXRzXG4gICAqIHRoZSBvbGQgb25lIHNpbGVudGx5LiBEZXYgbW9kZSAoYGVuYWJsZURldk1vZGUoKWApIHdhcm5zIG9uIHRoYXRcbiAgICogbWlzbWF0Y2ggKGJhY2tsb2cgQjQpLlxuICAgKi9cbiAgY3JlYXRlTmV4dChwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMubmV4dCkge1xuICAgICAgdGhpcy5uZXh0ID0gbmV3IFN0YWdlQ29udGV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMucmVjb3JkLnN0YXRlLCAnJywgdGhpcy5yZWNvcmQubG9nLCBpc0RlY2lkZXIpO1xuICAgICAgdGhpcy5uZXh0LnBhcmVudCA9IHRoaXM7XG4gICAgICB0aGlzLm5leHQuaW5oZXJpdFJ1bih0aGlzKTtcbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpICYmICh0aGlzLm5leHQuc3RhZ2VJZCAhPT0gc3RhZ2VJZCB8fCB0aGlzLm5leHQuc3RhZ2VOYW1lICE9PSBzdGFnZU5hbWUpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gU3RhZ2VDb250ZXh0LmNyZWF0ZU5leHQ6IG5leHQgY29udGV4dCBhbHJlYWR5IGV4aXN0cyBhcyBcIiR7dGhpcy5uZXh0LnN0YWdlTmFtZX1cIiBgICtcbiAgICAgICAgICBgKGlkOiBcIiR7dGhpcy5uZXh0LnN0YWdlSWR9XCIpIOKAlCBhcmd1bWVudHMgXCIke3N0YWdlTmFtZX1cIiAoaWQ6IFwiJHtzdGFnZUlkfVwiKSBhcmUgaWdub3JlZCBgICtcbiAgICAgICAgICAnYW5kIHRoZSBleGlzdGluZyBjb250ZXh0IGlzIHJldHVybmVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZXh0O1xuICB9XG5cbiAgY3JlYXRlQ2hpbGQocnVuSWQ6IHN0cmluZywgYnJhbmNoSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5jaGlsZHJlbikge1xuICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IG5ldyBTdGFnZUNvbnRleHQocnVuSWQsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5yZWNvcmQuc3RhdGUsIGJyYW5jaElkLCB0aGlzLnJlY29yZC5sb2csIGlzRGVjaWRlcik7XG4gICAgY2hpbGQucGFyZW50ID0gdGhpcztcbiAgICBjaGlsZC5pbmhlcml0UnVuKHRoaXMpO1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgY3JlYXRlRGVjaWRlcihwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcpOiBTdGFnZUNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5leHQocGF0aCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0cnVlKTtcbiAgfVxuXG4gIHNldEFzRGVjaWRlcigpOiBTdGFnZUNvbnRleHQge1xuICAgIHRoaXMuaXNEZWNpZGVyID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEFzRm9yaygpOiBTdGFnZUNvbnRleHQge1xuICAgIHRoaXMuaXNGb3JrID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBEaWFnbm9zdGljcyBkZWxlZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBAaW50ZXJuYWwgUmV0YWluZWQgaW5jb21pbmcgdmFsdWUgZm9yIHRoZSBmYWNhZGUncyBsZWdhY3kgZW1pdCBjaGFubmVsLiAqL1xuICBhZGREaWFnbm9zdGljKGNoYW5uZWw6IERpYWdub3N0aWNDaGFubmVsLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLmRlYnVnLmFkZChjaGFubmVsLCBrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZExvZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTG9nKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRNZXRyaWMoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZE1ldHJpYyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0TWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkRXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldEV2YWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldEV2YWwoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFcnJvcihrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkRXJyb3Ioa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRGbG93RGVidWdNZXNzYWdlKFxuICAgIHR5cGU6IEZsb3dDb250cm9sVHlwZSxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IHRhcmdldFN0YWdlPzogc3RyaW5nIHwgc3RyaW5nW107IHJhdGlvbmFsZT86IHN0cmluZzsgY291bnQ/OiBudW1iZXI7IGl0ZXJhdGlvbj86IG51bWJlciB9LFxuICApIHtcbiAgICBjb25zdCBmbG93TWVzc2FnZTogRmxvd01lc3NhZ2UgPSB7IHR5cGUsIGRlc2NyaXB0aW9uLCB0aW1lc3RhbXA6IERhdGUubm93KCksIC4uLm9wdGlvbnMgfTtcbiAgICB0aGlzLmRlYnVnLmFkZEZsb3dNZXNzYWdlKGZsb3dNZXNzYWdlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTbmFwc2hvdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXRTdGFnZUlkKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnJ1bklkIHx8IHRoaXMucnVuSWQgPT09ICcnKSByZXR1cm4gdGhpcy5zdGFnZU5hbWU7XG4gICAgcmV0dXJuIGAke3RoaXMucnVuSWR9LiR7dGhpcy5zdGFnZU5hbWV9YDtcbiAgfVxuXG4gIGdldFNuYXBzaG90KCk6IFN0YWdlU25hcHNob3Qge1xuICAgIC8vIEl0ZXJhdGl2ZSB3YWxrIChleHBsaWNpdCB3b3JrIHN0YWNrKSwgTk9UIHJlY3Vyc2lvbjogdGhlIGV4ZWN1dGlvblxuICAgIC8vIHRyZWUgZGVlcGVucyBieSBvbmUgbGV2ZWwgcGVyIGV4ZWN1dGVkIHN0YWdlIGFsb25nIGBuZXh0YCBjaGFpbnMsIGFuZFxuICAgIC8vIHRoZSB0cmFtcG9saW5lZCB0cmF2ZXJzZXIgYWxsb3dzIGNoYWlucy9sb29wcyBvZiB0ZW5zIG9mIHRob3VzYW5kcyBvZlxuICAgIC8vIHN0YWdlcyDigJQgZmFyIGRlZXBlciB0aGFuIGEgcmVjdXJzaXZlIHNlcmlhbGl6ZXIgY2FuIHdhbGsgYmVmb3JlXG4gICAgLy8gXCJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnNuYXBzaG90U2VsZigpO1xuICAgIGNvbnN0IHdvcms6IEFycmF5PHsgY3R4OiBTdGFnZUNvbnRleHQ7IHNuYXA6IFN0YWdlU25hcHNob3QgfT4gPSBbeyBjdHg6IHRoaXMsIHNuYXA6IHJvb3QgfV07XG4gICAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBjdHgsIHNuYXAgfSA9IHdvcmsucG9wKCkhO1xuICAgICAgaWYgKGN0eC5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG5leHRTbmFwID0gY3R4Lm5leHQuc25hcHNob3RTZWxmKCk7XG4gICAgICAgIHNuYXAubmV4dCA9IG5leHRTbmFwO1xuICAgICAgICB3b3JrLnB1c2goeyBjdHg6IGN0eC5uZXh0LCBzbmFwOiBuZXh0U25hcCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjdHguY2hpbGRyZW4pIHtcbiAgICAgICAgc25hcC5jaGlsZHJlbiA9IGN0eC5jaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGRTbmFwID0gY2hpbGQuc25hcHNob3RTZWxmKCk7XG4gICAgICAgICAgd29yay5wdXNoKHsgY3R4OiBjaGlsZCwgc25hcDogY2hpbGRTbmFwIH0pO1xuICAgICAgICAgIHJldHVybiBjaGlsZFNuYXA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKiBTbmFwc2hvdCBvZiBUSElTIGNvbnRleHQncyBvd24gZmllbGRzIOKAlCBgbmV4dGAvYGNoaWxkcmVuYCBhcmUgZmlsbGVkXG4gICAqICBpbiBieSB0aGUgaXRlcmF0aXZlIHdhbGsgaW4gYGdldFNuYXBzaG90YC4gKi9cbiAgcHJpdmF0ZSBzbmFwc2hvdFNlbGYoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3Q6IFN0YWdlU25hcHNob3QgPSB7XG4gICAgICBpZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQgfHwgdW5kZWZpbmVkLFxuICAgICAgbmFtZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBpc0RlY2lkZXI6IHRoaXMuaXNEZWNpZGVyLFxuICAgICAgaXNGb3JrOiB0aGlzLmlzRm9yayxcbiAgICAgIGxvZ3M6IHRoaXMuZGVidWcubG9nQ29udGV4dCxcbiAgICAgIGVycm9yczogdGhpcy5kZWJ1Zy5lcnJvckNvbnRleHQsXG4gICAgICBtZXRyaWNzOiB0aGlzLmRlYnVnLm1ldHJpY0NvbnRleHQsXG4gICAgICBldmFsczogdGhpcy5kZWJ1Zy5ldmFsQ29udGV4dCxcbiAgICB9O1xuICAgIGNvbnN0IHN0YWdlV3JpdGVzID0gdGhpcy5yZXRhaW5lZFdyaXRlcygpO1xuICAgIGlmIChPYmplY3Qua2V5cyhzdGFnZVdyaXRlcykubGVuZ3RoID4gMCkge1xuICAgICAgLy8gRXh0cmFjdCB2YWx1ZXMgb25seSBmb3IgdGhlIHNuYXBzaG90IChzdHJpcCBvcGVyYXRpb24gbWV0YWRhdGEpXG4gICAgICBjb25zdCB3cml0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtrLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoc3RhZ2VXcml0ZXMpKSB7XG4gICAgICAgIHdyaXRlc1trXSA9IGVudHJ5LnZhbHVlO1xuICAgICAgfVxuICAgICAgc25hcHNob3Quc3RhZ2VXcml0ZXMgPSB3cml0ZXM7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zdGFnZVJlYWRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5zdGFnZVJlYWRzID0gdGhpcy5fc3RhZ2VSZWFkcztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcbiAgICAgIHNuYXBzaG90LmRlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3ViZmxvd0lkKSB7XG4gICAgICBzbmFwc2hvdC5zdWJmbG93SWQgPSB0aGlzLnN1YmZsb3dJZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVidWcuZmxvd01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LmZsb3dNZXNzYWdlcyA9IHRoaXMuZGVidWcuZmxvd01lc3NhZ2VzO1xuICAgIH1cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
*/
|
|
33
33
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
34
|
exports.borrowedMutationMessage = exports.committedMutationMessage = exports.deadFrameMessage = exports.firstDifferingPath = void 0;
|
|
35
|
-
const
|
|
35
|
+
const foottrace_1 = require("foottrace");
|
|
36
36
|
/** Render one path segment for a human: `lines[0].qty`, not `lines.0.qty`. */
|
|
37
37
|
function joinSegment(prefix, segment, intoArray) {
|
|
38
38
|
if (intoArray)
|
|
@@ -48,7 +48,7 @@ function joinSegment(prefix, segment, intoArray) {
|
|
|
48
48
|
* `deepEqual`, and stops at the first disagreement.
|
|
49
49
|
*/
|
|
50
50
|
function firstDifferingPath(before, after, prefix = '', depth = 0) {
|
|
51
|
-
if ((0,
|
|
51
|
+
if ((0, foottrace_1.deepEqual)(before, after, 'copies'))
|
|
52
52
|
return undefined;
|
|
53
53
|
if (depth >= 24)
|
|
54
54
|
return prefix; // pathological nesting — name what we have
|
|
@@ -134,4 +134,4 @@ function borrowedMutationMessage(stageName, key, path) {
|
|
|
134
134
|
'which the scope proxy cannot intercept.');
|
|
135
135
|
}
|
|
136
136
|
exports.borrowedMutationMessage = borrowedMutationMessage;
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9ycm93ZWRNdXRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L2JvcnJvd2VkTXV0YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7OztBQUVILHlDQUF1QztBQUV2Qyw4RUFBOEU7QUFDOUUsU0FBUyxXQUFXLENBQUMsTUFBYyxFQUFFLE9BQWUsRUFBRSxTQUFrQjtJQUN0RSxJQUFJLFNBQVM7UUFBRSxPQUFPLEdBQUcsTUFBTSxJQUFJLE9BQU8sR0FBRyxDQUFDO0lBQzlDLE9BQU8sTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLE1BQWUsRUFBRSxLQUFjLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBQztJQUN4RixJQUFJLElBQUEsb0JBQVMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3pELElBQUksS0FBSyxJQUFJLEVBQUU7UUFBRSxPQUFPLE1BQU0sQ0FBQyxDQUFDLDJDQUEyQztJQUMzRSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBRWhILE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsSUFBSSxhQUFhLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUUxRCxJQUFJLGFBQWEs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LEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekUsT0FBTyxDQUNMLHNCQUFzQixTQUFTLGVBQWUsS0FBSyx3Q0FBd0M7UUFDM0Ysb0dBQW9HO1FBQ3BHLG1HQUFtRztRQUNuRyw0REFBNEQ7UUFDNUQsMENBQTBDO1FBQzFDLEtBQUs7UUFDTCx5REFBeUQ7UUFDekQsd0RBQXdELEdBQUcsY0FBYztRQUN6RSw2RkFBNkY7UUFDN0YseUNBQXlDLENBQzFDLENBQUM7QUFDSixDQUFDO0FBZEQsMERBY0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG1lbW9yeS9ib3Jyb3dlZE11dGF0aW9uIOKAlCB0aGUgaG9uZXN0IGJvdW5kYXJ5J3MgdHdvIHRleHRzOiB0aGUgZGV2LW1vZGVcbiAqIFJFUE9SVCBmb3IgYSB3cml0ZSB0aGUgZW5naW5lIGNhbm5vdCBzZWUgKHtAbGluayBib3Jyb3dlZE11dGF0aW9uTWVzc2FnZX0pXG4gKiBhbmQgdGhlIFJFRlVTQUwgZm9yIGEgd3JpdGUgZnJvbSBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlXG4gKiAoe0BsaW5rIGRlYWRGcmFtZU1lc3NhZ2V9LCB0aHJvd24gYnkgYFNjb3BlRmFjYWRlIMK3IGFzc2VydExpdmVgKS5cbiAqXG4gKiDilIDilIAgVGhlIGhvbmVzdCBib3VuZGFyeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAqIFRoZSB0eXBlZCBzY29wZSBpbnRlcmNlcHRzIGV2ZXJ5IHdyaXRlIGl0IGNhbiByZWFjaDogYSBwcm9wZXJ0eSBhdCBhbnlcbiAqIGRlcHRoLCBhbiBpbmRleGVkIGVsZW1lbnQsIGFuIGFycmF5IG1ldGhvZC4gV2hhdCBpdCBjYW5ub3QgcmVhY2ggaXMgYW5cbiAqIGVsZW1lbnQgaGFuZGVkIG91dCBieSBhIFJFQUQgTUVUSE9EIOKAlCBgZmluZGAsIGBmaWx0ZXJgLCBgZm9y4oCmb2ZgLCBgZm9yRWFjaGAsXG4gKiBkZXN0cnVjdHVyaW5nIOKAlCBiZWNhdXNlIHdyYXBwaW5nIHRob3NlIHdvdWxkIG1lYW4gcmV0dXJuaW5nIHByb3hpZXMgb3V0IG9mXG4gKiBldmVyeSByZWFkIChgbWFwYCB3b3VsZCBidWlsZCBhbiBhcnJheSBvZiBwcm94aWVzLCBgZmlsdGVyYCB3b3VsZCBjb21wYXJlXG4gKiBwcm94aWVzLCBhIHJldHVybmVkIHZhbHVlIHdvdWxkIGVzY2FwZSB0aGUgc3RhZ2Ugc3RpbGwgYm91bmQgdG8gaXQpLiBUaGF0IGlzXG4gKiBhIGNvc3QgdGhlIGxpYnJhcnkgc2hvdWxkIG5vdCBwYXksIGFuZCBhIHNlbWFudGljIGNoYW5nZSBpdCBzaG91bGQgbm90IG1ha2UuXG4gKlxuICogU28gdGhlIGFuc3dlciBmb3IgdGhhdCBmYW1pbHkgaXMgbm90IGludGVyY2VwdGlvbiDigJQgaXQgaXMgYSBSRVBPUlQuIEEgcmVhZFxuICogaXMgQk9SUk9XRUQ7IG11dGF0aW5nIGl0IGluIHBsYWNlIGlzIG91dCBvZiBjb250cmFjdC4gVGhpcyBtb2R1bGUgZGV0ZWN0cyB0aGVcbiAqIHZpb2xhdGlvbiBhZnRlciB0aGUgZmFjdCBhbmQgbmFtZXMgaXQgKGEgZGV2LW1vZGUgd2FybmluZyBhdCBjb21taXQg4oCUIHRoZVxuICogd3JpdGUgYWxyZWFkeSBoYXBwZW5lZCwgc28gaXQgY2Fubm90IGJlIHJlZnVzZWQpLCBpbnN0ZWFkIG9mIGxldHRpbmcgdGhlIHJ1blxuICogZW5kIHdpdGggYSBjb21taXQgbG9nIHRoYXQgZGlzYWdyZWVzIHdpdGggZmluYWwgc3RhdGUgYW5kIG5vdGhpbmcgc2F5aW5nIHNvLlxuICpcbiAqIOKUgOKUgCBIb3cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gKiBgcmVhZFRyYWNraW5nOiAnZnVsbCdgICh0aGUgZGVmYXVsdCkgYWxyZWFkeSByZXRhaW5zIGEgQ0xPTkUgb2YgZXZlcnkgdmFsdWVcbiAqIGEgc3RhZ2UgcmVhZC4gQXQgY29tbWl0LCBhIGtleSB0aGUgc3RhZ2UgcmVhZCBidXQgbmV2ZXIgV1JPVEUgbXVzdCBzdGlsbFxuICogaG9sZCB3aGF0IGl0IGhlbGQgYXQgcmVhZCB0aW1lIOKAlCBjb21taXR0ZWQgc3RhdGUgaXMgaW1tdXRhYmxlLWFmdGVyLXN3YXAgYW5kXG4gKiB0aGUgYnVmZmVyJ3Mgd29ya2luZyBjb3B5IGlzIHByaXZhdGUuIElmIGl0IGRpZmZlcnMsIHRoZSBvbmx5IHRoaW5nIHRoYXQgY2FuXG4gKiBoYXZlIGNoYW5nZWQgaXQgaXMgdGhlIHN0YWdlIGl0c2VsZiwgaW4gcGxhY2UuXG4gKlxuICogRGV2LW1vZGUgb25seSAoYGVuYWJsZURldk1vZGUoKWApLCBzbyB0aGUgZGVmYXVsdCBydW4gcGF5cyBub3RoaW5nIGFuZCBpdHNcbiAqIGJ5dGVzIGFyZSB1bmNoYW5nZWQuXG4gKi9cblxuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8qKiBSZW5kZXIgb25lIHBhdGggc2VnbWVudCBmb3IgYSBodW1hbjogYGxpbmVzWzBdLnF0eWAsIG5vdCBgbGluZXMuMC5xdHlgLiAqL1xuZnVuY3Rpb24gam9pblNlZ21lbnQocHJlZml4OiBzdHJpbmcsIHNlZ21lbnQ6IHN0cmluZywgaW50b0FycmF5OiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGludG9BcnJheSkgcmV0dXJuIGAke3ByZWZpeH1bJHtzZWdtZW50fV1gO1xuICByZXR1cm4gcHJlZml4ID09PSAnJyA/IHNlZ21lbnQgOiBgJHtwcmVmaXh9LiR7c2VnbWVudH1gO1xufVxuXG4vKipcbiAqIFRoZSBmaXJzdCBwYXRoIGF0IHdoaWNoIGBhZnRlcmAgc3RvcHMgYWdyZWVpbmcgd2l0aCBgYmVmb3JlYCwgb3IgYHVuZGVmaW5lZGBcbiAqIHdoZW4gdGhleSBhcmUgc3RydWN0dXJhbGx5IGVxdWFsLiBEZXB0aC1maXJzdCwgb3duIGtleXMgb25seSDigJQgdGhlIHNhbWVcbiAqIHNoYXBlcyBgZGVlcEVxdWFsYCBoYW5kbGVzLCBzaW5jZSBjb21taXR0ZWQgc3RhdGUgaXMgSlNPTi1zaGFwZWQuXG4gKlxuICogQ3ljbGUtc2FmZSBieSBjb25zdHJ1Y3Rpb246IGl0IG9ubHkgcmVjdXJzZXMgaW50byBwYWlycyB0aGF0IGFyZSBub3QgYWxyZWFkeVxuICogYGRlZXBFcXVhbGAsIGFuZCBzdG9wcyBhdCB0aGUgZmlyc3QgZGlzYWdyZWVtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlyc3REaWZmZXJpbmdQYXRoKGJlZm9yZTogdW5rbm93biwgYWZ0ZXI6IHVua25vd24sIHByZWZpeCA9ICcnLCBkZXB0aCA9IDApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoZGVlcEVxdWFsKGJlZm9yZSwgYWZ0ZXIsICdjb3BpZXMnKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGRlcHRoID49IDI0KSByZXR1cm4gcHJlZml4OyAvLyBwYXRob2xvZ2ljYWwgbmVzdGluZyDigJQgbmFtZSB3aGF0IHdlIGhhdmVcbiAgaWYgKGJlZm9yZSA9PT0gbnVsbCB8fCBhZnRlciA9PT0gbnVsbCB8fCB0eXBlb2YgYmVmb3JlICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgYWZ0ZXIgIT09ICdvYmplY3QnKSByZXR1cm4gcHJlZml4O1xuXG4gIGNvbnN0IGJlZm9yZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGJlZm9yZSk7XG4gIGlmIChiZWZvcmVJc0FycmF5ICE9PSBBcnJheS5pc0FycmF5KGFmdGVyKSkgcmV0dXJuIHByZWZpeDtcblxuICBpZiAoYmVmb3JlSXNBcnJheSkge1xuICAgIGNvbnN0IGEgPSBiZWZvcmUgYXMgdW5rbm93bltdO1xuICAgIGNvbnN0IGIgPSBhZnRlciBhcyB1bmtub3duW107XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIHByZWZpeDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGRlZXBlciA9IGZpcnN0RGlmZmVyaW5nUGF0aChhW2ldLCBiW2ldLCBqb2luU2VnbWVudChwcmVmaXgsIFN0cmluZyhpKSwgdHJ1ZSksIGRlcHRoICsgMSk7XG4gICAgICBpZiAoZGVlcGVyICE9PSB1bmRlZmluZWQpIHJldHVybiBkZWVwZXI7XG4gICAgfVxuICAgIHJldHVybiBwcmVmaXg7XG4gIH1cblxuICBjb25zdCBhID0gYmVmb3JlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBiID0gYWZ0ZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGtleXMgPSBuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhhKSwgLi4uT2JqZWN0LmtleXMoYildKTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IGRlZXBlciA9IGZpcnN0RGlmZmVyaW5nUGF0aChhW2tleV0sIGJba2V5XSwgam9pblNlZ21lbnQocHJlZml4LCBrZXksIGZhbHNlKSwgZGVwdGggKyAxKTtcbiAgICBpZiAoZGVlcGVyICE9PSB1bmRlZmluZWQpIHJldHVybiBkZWVwZXI7XG4gIH1cbiAgcmV0dXJuIHByZWZpeDtcbn1cblxuLyoqXG4gKiBUaGUgcmVmdXNhbCB0ZXh0IGZvciBhIHdyaXRlIHRoYXQgcmVhY2hlZCBhIGZyYW1lIEFGVEVSIGl0cyBzdGFnZSBjb21taXR0ZWQuXG4gKiBBIHNjb3BlLCBhbmQgZXZlcnkgcHJveHkgcmVhZCBvdXQgb2YgaXQsIGlzIGJvdW5kIHRvIHRoZSBzdGFnZSBpdCB3YXMgaGFuZGVkXG4gKiB0bzsga2VwdCBwYXN0IHRoYXQgc3RhZ2UncyBjb21taXQgaXQgaGFzIG5vIGZyYW1lIHRvIGxhbmQgaW4sIHNvIHRoZSB3cml0ZVxuICogd291bGQgc2l0IGluIGEgYnVmZmVyIG5vdGhpbmcgZXZlciBjb21taXRzIOKAlCBubyB0cmFjZSByb3csIHN0YXRlIHVuY2hhbmdlZC5cbiAqIFRoZSB0aHJvdyBzdXJmYWNlcyBpbiB0aGUgc3RhZ2UgdGhhdCBtYWRlIHRoZSB3cml0ZSAodGhlIGVuZ2luZSdzIGVycm9yXG4gKiBwYXRoIG5hbWVzIGl0KTsgdGhpcyB0ZXh0IG5hbWVzIHRoZSBzdGFnZSB0aGUgaGFuZGxlIGNhbWUgZnJvbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYWRGcmFtZU1lc3NhZ2Uoc3RhZ2VOYW1lOiBzdHJpbmcsIHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZnJvbSA9IHJ1bnRpbWVTdGFnZUlkID8gYFwiJHtzdGFnZU5hbWV9XCIgKCR7cnVudGltZVN0YWdlSWR9KWAgOiBgXCIke3N0YWdlTmFtZX1cImA7XG4gIHJldHVybiAoXG4gICAgYFtmb290cHJpbnRdIFN0YWdlICR7ZnJvbX0gaGFzIGFscmVhZHkgY29tbWl0dGVkIOKAlCBpdHMgc2NvcGUgaXMgZGVhZCwgYW5kIGEgd3JpdGUgdG8gXFxgJHtrZXl9XFxgIGAgK1xuICAgICdqdXN0IHJlYWNoZWQgaXQgZnJvbSBhIGxhdGVyIHN0YWdlICh0aGlzIGVycm9yIGlzIHJhaXNlZCBpbiB0aGF0IHN0YWdlKS4gQSBzY29wZSwgYW5kIGFueXRoaW5nIHJlYWQgJyArXG4gICAgJ291dCBvZiBpdCAoYHNjb3BlLmtgLCBgc2NvcGUuay5hcnJbMF1gKSwgYmVsb25ncyB0byB0aGUgc3RhZ2UgaXQgd2FzIGhhbmRlZCB0bzsgaGVsZCBwYXN0IHRoYXQgJyArXG4gICAgXCJzdGFnZSdzIGNvbW1pdCBpdCBoYXMgbm8gZnJhbWUgdG8gbGFuZCBpbiwgc28gdGhlIHdyaXRlIHdvdWxkIHZhbmlzaCB3aXRoIG5vIHRyYWNlIHJvdy4gXCIgK1xuICAgIFwiUmVhZCB0aGUga2V5IGFnYWluIHRocm91Z2ggdGhlIENVUlJFTlQgc3RhZ2UncyBzY29wZSBhbmQgd3JpdGUgdGhlcmUuXCJcbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgd2FybmluZyB0ZXh0IGZvciBhIGtleSB0aGUgc3RhZ2UgV1JPVEUgYWZ0ZXIgY2hhbmdpbmcsIGluIHBsYWNlLCB0aGVcbiAqIGNvbW1pdHRlZCB2YWx1ZSBpdCBoYWQgcmVhZCBiZWZvcmUgaXRzIGZpcnN0IHdyaXRlIChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLlxuICogVGhlIGNvbW1pdCBjb21wYXJlcyB3aGF0IHRoZSBzdGFnZSB3cm90ZSBhZ2FpbnN0IGNvbW1pdHRlZCBzdGF0ZSDigJQgdGhlXG4gKiBvYmplY3QgdGhlIGluLXBsYWNlIGNoYW5nZSBhbHNvIG1vdmVkIOKAlCBzbyBpdCByZWNvcmRzIG5vIGNoYW5nZTogbGl2ZSBzdGF0ZVxuICoga2VlcHMgdGhlIGVkaXQsIHRoZSBsb2cgYW5kIGV2ZXJ5IGZvbGQgZG8gbm90LiAoOS4yOC4wIHJlY29yZGVkIGl0IHdoZW4gdGhlXG4gKiBlZGl0IGNhbWUgYWZ0ZXIgdGhlIGZpcnN0IHdyaXRlLCBieSBhY2NpZGVudCBvZiBhIHdob2xlLXN0YXRlIGNsb25lLilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdHRlZE11dGF0aW9uTWVzc2FnZShzdGFnZU5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdoZXJlID0gcGF0aCA9PT0gJycgPyBrZXkgOiBgJHtrZXl9LiR7cGF0aH1gLnJlcGxhY2UoL1xcLlxcWy9nLCAnWycpO1xuICByZXR1cm4gKFxuICAgIGBbZm9vdHByaW50XSBTdGFnZSBcIiR7c3RhZ2VOYW1lfVwiIGNoYW5nZWQgXFxgJHt3aGVyZX1cXGAgSU4gUExBQ0Ugb24gdGhlIGNvbW1pdHRlZCB2YWx1ZSBpdCByZWFkIGJlZm9yZSBgICtcbiAgICAnaXRzIGZpcnN0IHdyaXRlLCB0aGVuIHdyb3RlIHRoZSBrZXkuIFRoZSBjb21taXQgY29tcGFyZXMgdGhlIHdyaXR0ZW4gdmFsdWUgd2l0aCBjb21taXR0ZWQgc3RhdGUg4oCUICcgK1xuICAgICd3aGljaCB0aGUgaW4tcGxhY2UgY2hhbmdlIGFsc28gbW92ZWQg4oCUIHNvIGl0IHJlY29yZHMgTk8gY2hhbmdlOiBsaXZlIHN0YXRlIGtlZXBzIHRoZSBlZGl0LCB0aGUgY29tbWl0ICcgK1xuICAgICdsb2cgYW5kIGV2ZXJ5IHJlYWRlciB0aGF0IGZvbGRzIGl0IGRvIG5vdC4gUmVhZHMgYXJlIEJPUlJPV0VELiBCdWlsZCB0aGUgbmV4dCB2YWx1ZSBpbnN0ZWFkICcgK1xuICAgIGAoXFxgc2NvcGUuJHNldFZhbHVlKCcke2tleX0nLCB7IC4uLnZhbHVlLCDigKYgfSlcXGApLCBvciByZWFkIHRoZSBrZXkgYWdhaW4gYWZ0ZXIgdGhlIHN0YWdlJ3MgZmlyc3QgYCArXG4gICAgXCJ3cml0ZSDigJQgdGhhdCByZWFkIGlzIHRoZSBzdGFnZSdzIG93biBjb3B5LlwiXG4gICk7XG59XG5cbi8qKlxuICogVGhlIHdhcm5pbmcgdGV4dC4gTmFtZXMgdGhlIHN0YWdlLCB0aGUgZXhhY3QgcGF0aCB0aGF0IG1vdmVkLCBhbmQgdGhlIHR3b1xuICogd2F5cyB0byB3cml0ZSBpdCBiYWNrIOKAlCBiZWNhdXNlIFwieW91IG11dGF0ZWQgc29tZXRoaW5nXCIgaXMgbm90IGFjdGlvbmFibGVcbiAqIGFuZCB0aGlzIGlzIHRoZSBvbmUgZmFpbHVyZSBtb2RlIHRoZSB3aG9sZSBkZXNpZ24gZXhpc3RzIHRvIHByZXZlbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib3Jyb3dlZE11dGF0aW9uTWVzc2FnZShzdGFnZU5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHdoZXJlID0gcGF0aCA9PT0gJycgPyBrZXkgOiBgJHtrZXl9LiR7cGF0aH1gLnJlcGxhY2UoL1xcLlxcWy9nLCAnWycpO1xuICByZXR1cm4gKFxuICAgIGBbZm9vdHByaW50XSBTdGFnZSBcIiR7c3RhZ2VOYW1lfVwiIGNoYW5nZWQgXFxgJHt3aGVyZX1cXGAgSU4gUExBQ0UsIG9uIGEgdmFsdWUgaXQgb25seSByZWFkLiBgICtcbiAgICAnZm9vdHByaW50IG5ldmVyIHNhdyB0aGF0IHdyaXRlOiB0aGVyZSBpcyBubyB0cmFjZSByb3cgZm9yIGl0LCBzbyB0aGUgY29tbWl0IGxvZywgdGhlIGNhdXNhbCBjaGFpbiAnICtcbiAgICAnYW5kIGV2ZXJ5IHJlYWRlciB0aGF0IGZvbGRzIHRoZSBsb2cgd2lsbCBkaXNhZ3JlZSB3aXRoIGZpbmFsIHN0YXRlIOKAlCBhbmQgdW5kZXIgYSBkaWZmZXJlbnQgd3JpdGUgJyArXG4gICAgJ29yZGVyIHRoZSBjaGFuZ2UgaXMgZHJvcHBlZCBlbnRpcmVseS4gUmVhZHMgYXJlIEJPUlJPV0VELiAnICtcbiAgICAnV3JpdGUgdGhyb3VnaCB0aGUgc2NvcGUgaW5zdGVhZCAoYHNjb3BlLicgK1xuICAgIHdoZXJlICtcbiAgICAnID0g4oCmYCDigJQgcHJvcGVydHkgYW5kIGluZGV4ZWQgYWNjZXNzIGFyZSBib3RoIHRyYWNrZWQpLCAnICtcbiAgICBgb3IgaGFuZCBiYWNrIHRoZSB3aG9sZSB2YWx1ZSB3aXRoIFxcYHNjb3BlLiRzZXRWYWx1ZSgnJHtrZXl9JywgbmV4dClcXGAuIGAgK1xuICAgICdUaGlzIHVzdWFsbHkgY29tZXMgZnJvbSBtdXRhdGluZyBhbiBlbGVtZW50IHJlYWNoZWQgYnkgYGZpbmRgL2BmaWx0ZXJgL2Bmb3LigKZvZmAvYGZvckVhY2hgLCAnICtcbiAgICAnd2hpY2ggdGhlIHNjb3BlIHByb3h5IGNhbm5vdCBpbnRlcmNlcHQuJ1xuICApO1xufVxuIl19
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9ycm93ZWRNdXRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L2JvcnJvd2VkTXV0YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7OztBQUVILHlDQUFzQztBQUV0Qyw4RUFBOEU7QUFDOUUsU0FBUyxXQUFXLENBQUMsTUFBYyxFQUFFLE9BQWUsRUFBRSxTQUFrQjtJQUN0RSxJQUFJLFNBQVM7UUFBRSxPQUFPLEdBQUcsTUFBTSxJQUFJLE9BQU8sR0FBRyxDQUFDO0lBQzlDLE9BQU8sTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLE1BQWUsRUFBRSxLQUFjLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxLQUFLLEdBQUcsQ0FBQztJQUN4RixJQUFJLElBQUEscUJBQVMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3pELElBQUksS0FBSyxJQUFJLEVBQUU7UUFBRSxPQUFPLE1BQU0sQ0FBQyxDQUFDLDJDQUEyQztJQUMzRSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBRWhILE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsSUFBSSxhQUFhLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUUxRCxJQUFJLGFBQWEs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LEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDekUsT0FBTyxDQUNMLHNCQUFzQixTQUFTLGVBQWUsS0FBSyx3Q0FBd0M7UUFDM0Ysb0dBQW9HO1FBQ3BHLG1HQUFtRztRQUNuRyw0REFBNEQ7UUFDNUQsMENBQTBDO1FBQzFDLEtBQUs7UUFDTCx5REFBeUQ7UUFDekQsd0RBQXdELEdBQUcsY0FBYztRQUN6RSw2RkFBNkY7UUFDN0YseUNBQXlDLENBQzFDLENBQUM7QUFDSixDQUFDO0FBZEQsMERBY0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIG1lbW9yeS9ib3Jyb3dlZE11dGF0aW9uIOKAlCB0aGUgaG9uZXN0IGJvdW5kYXJ5J3MgdHdvIHRleHRzOiB0aGUgZGV2LW1vZGVcbiAqIFJFUE9SVCBmb3IgYSB3cml0ZSB0aGUgZW5naW5lIGNhbm5vdCBzZWUgKHtAbGluayBib3Jyb3dlZE11dGF0aW9uTWVzc2FnZX0pXG4gKiBhbmQgdGhlIFJFRlVTQUwgZm9yIGEgd3JpdGUgZnJvbSBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlXG4gKiAoe0BsaW5rIGRlYWRGcmFtZU1lc3NhZ2V9LCB0aHJvd24gYnkgYFNjb3BlRmFjYWRlIMK3IGFzc2VydExpdmVgKS5cbiAqXG4gKiDilIDilIAgVGhlIGhvbmVzdCBib3VuZGFyeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAqIFRoZSB0eXBlZCBzY29wZSBpbnRlcmNlcHRzIGV2ZXJ5IHdyaXRlIGl0IGNhbiByZWFjaDogYSBwcm9wZXJ0eSBhdCBhbnlcbiAqIGRlcHRoLCBhbiBpbmRleGVkIGVsZW1lbnQsIGFuIGFycmF5IG1ldGhvZC4gV2hhdCBpdCBjYW5ub3QgcmVhY2ggaXMgYW5cbiAqIGVsZW1lbnQgaGFuZGVkIG91dCBieSBhIFJFQUQgTUVUSE9EIOKAlCBgZmluZGAsIGBmaWx0ZXJgLCBgZm9y4oCmb2ZgLCBgZm9yRWFjaGAsXG4gKiBkZXN0cnVjdHVyaW5nIOKAlCBiZWNhdXNlIHdyYXBwaW5nIHRob3NlIHdvdWxkIG1lYW4gcmV0dXJuaW5nIHByb3hpZXMgb3V0IG9mXG4gKiBldmVyeSByZWFkIChgbWFwYCB3b3VsZCBidWlsZCBhbiBhcnJheSBvZiBwcm94aWVzLCBgZmlsdGVyYCB3b3VsZCBjb21wYXJlXG4gKiBwcm94aWVzLCBhIHJldHVybmVkIHZhbHVlIHdvdWxkIGVzY2FwZSB0aGUgc3RhZ2Ugc3RpbGwgYm91bmQgdG8gaXQpLiBUaGF0IGlzXG4gKiBhIGNvc3QgdGhlIGxpYnJhcnkgc2hvdWxkIG5vdCBwYXksIGFuZCBhIHNlbWFudGljIGNoYW5nZSBpdCBzaG91bGQgbm90IG1ha2UuXG4gKlxuICogU28gdGhlIGFuc3dlciBmb3IgdGhhdCBmYW1pbHkgaXMgbm90IGludGVyY2VwdGlvbiDigJQgaXQgaXMgYSBSRVBPUlQuIEEgcmVhZFxuICogaXMgQk9SUk9XRUQ7IG11dGF0aW5nIGl0IGluIHBsYWNlIGlzIG91dCBvZiBjb250cmFjdC4gVGhpcyBtb2R1bGUgZGV0ZWN0cyB0aGVcbiAqIHZpb2xhdGlvbiBhZnRlciB0aGUgZmFjdCBhbmQgbmFtZXMgaXQgKGEgZGV2LW1vZGUgd2FybmluZyBhdCBjb21taXQg4oCUIHRoZVxuICogd3JpdGUgYWxyZWFkeSBoYXBwZW5lZCwgc28gaXQgY2Fubm90IGJlIHJlZnVzZWQpLCBpbnN0ZWFkIG9mIGxldHRpbmcgdGhlIHJ1blxuICogZW5kIHdpdGggYSBjb21taXQgbG9nIHRoYXQgZGlzYWdyZWVzIHdpdGggZmluYWwgc3RhdGUgYW5kIG5vdGhpbmcgc2F5aW5nIHNvLlxuICpcbiAqIOKUgOKUgCBIb3cg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gKiBgcmVhZFRyYWNraW5nOiAnZnVsbCdgICh0aGUgZGVmYXVsdCkgYWxyZWFkeSByZXRhaW5zIGEgQ0xPTkUgb2YgZXZlcnkgdmFsdWVcbiAqIGEgc3RhZ2UgcmVhZC4gQXQgY29tbWl0LCBhIGtleSB0aGUgc3RhZ2UgcmVhZCBidXQgbmV2ZXIgV1JPVEUgbXVzdCBzdGlsbFxuICogaG9sZCB3aGF0IGl0IGhlbGQgYXQgcmVhZCB0aW1lIOKAlCBjb21taXR0ZWQgc3RhdGUgaXMgaW1tdXRhYmxlLWFmdGVyLXN3YXAgYW5kXG4gKiB0aGUgYnVmZmVyJ3Mgd29ya2luZyBjb3B5IGlzIHByaXZhdGUuIElmIGl0IGRpZmZlcnMsIHRoZSBvbmx5IHRoaW5nIHRoYXQgY2FuXG4gKiBoYXZlIGNoYW5nZWQgaXQgaXMgdGhlIHN0YWdlIGl0c2VsZiwgaW4gcGxhY2UuXG4gKlxuICogRGV2LW1vZGUgb25seSAoYGVuYWJsZURldk1vZGUoKWApLCBzbyB0aGUgZGVmYXVsdCBydW4gcGF5cyBub3RoaW5nIGFuZCBpdHNcbiAqIGJ5dGVzIGFyZSB1bmNoYW5nZWQuXG4gKi9cblxuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuLyoqIFJlbmRlciBvbmUgcGF0aCBzZWdtZW50IGZvciBhIGh1bWFuOiBgbGluZXNbMF0ucXR5YCwgbm90IGBsaW5lcy4wLnF0eWAuICovXG5mdW5jdGlvbiBqb2luU2VnbWVudChwcmVmaXg6IHN0cmluZywgc2VnbWVudDogc3RyaW5nLCBpbnRvQXJyYXk6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoaW50b0FycmF5KSByZXR1cm4gYCR7cHJlZml4fVske3NlZ21lbnR9XWA7XG4gIHJldHVybiBwcmVmaXggPT09ICcnID8gc2VnbWVudCA6IGAke3ByZWZpeH0uJHtzZWdtZW50fWA7XG59XG5cbi8qKlxuICogVGhlIGZpcnN0IHBhdGggYXQgd2hpY2ggYGFmdGVyYCBzdG9wcyBhZ3JlZWluZyB3aXRoIGBiZWZvcmVgLCBvciBgdW5kZWZpbmVkYFxuICogd2hlbiB0aGV5IGFyZSBzdHJ1Y3R1cmFsbHkgZXF1YWwuIERlcHRoLWZpcnN0LCBvd24ga2V5cyBvbmx5IOKAlCB0aGUgc2FtZVxuICogc2hhcGVzIGBkZWVwRXF1YWxgIGhhbmRsZXMsIHNpbmNlIGNvbW1pdHRlZCBzdGF0ZSBpcyBKU09OLXNoYXBlZC5cbiAqXG4gKiBDeWNsZS1zYWZlIGJ5IGNvbnN0cnVjdGlvbjogaXQgb25seSByZWN1cnNlcyBpbnRvIHBhaXJzIHRoYXQgYXJlIG5vdCBhbHJlYWR5XG4gKiBgZGVlcEVxdWFsYCwgYW5kIHN0b3BzIGF0IHRoZSBmaXJzdCBkaXNhZ3JlZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXJzdERpZmZlcmluZ1BhdGgoYmVmb3JlOiB1bmtub3duLCBhZnRlcjogdW5rbm93biwgcHJlZml4ID0gJycsIGRlcHRoID0gMCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChkZWVwRXF1YWwoYmVmb3JlLCBhZnRlciwgJ2NvcGllcycpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoZGVwdGggPj0gMjQpIHJldHVybiBwcmVmaXg7IC8vIHBhdGhvbG9naWNhbCBuZXN0aW5nIOKAlCBuYW1lIHdoYXQgd2UgaGF2ZVxuICBpZiAoYmVmb3JlID09PSBudWxsIHx8IGFmdGVyID09PSBudWxsIHx8IHR5cGVvZiBiZWZvcmUgIT09ICdvYmplY3QnIHx8IHR5cGVvZiBhZnRlciAhPT0gJ29iamVjdCcpIHJldHVybiBwcmVmaXg7XG5cbiAgY29uc3QgYmVmb3JlSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoYmVmb3JlKTtcbiAgaWYgKGJlZm9yZUlzQXJyYXkgIT09IEFycmF5LmlzQXJyYXkoYWZ0ZXIpKSByZXR1cm4gcHJlZml4O1xuXG4gIGlmIChiZWZvcmVJc0FycmF5KSB7XG4gICAgY29uc3QgYSA9IGJlZm9yZSBhcyB1bmtub3duW107XG4gICAgY29uc3QgYiA9IGFmdGVyIGFzIHVua25vd25bXTtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gcHJlZml4O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZGVlcGVyID0gZmlyc3REaWZmZXJpbmdQYXRoKGFbaV0sIGJbaV0sIGpvaW5TZWdtZW50KHByZWZpeCwgU3RyaW5nKGkpLCB0cnVlKSwgZGVwdGggKyAxKTtcbiAgICAgIGlmIChkZWVwZXIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZXBlcjtcbiAgICB9XG4gICAgcmV0dXJuIHByZWZpeDtcbiAgfVxuXG4gIGNvbnN0IGEgPSBiZWZvcmUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGIgPSBhZnRlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3Qga2V5cyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGEpLCAuLi5PYmplY3Qua2V5cyhiKV0pO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgY29uc3QgZGVlcGVyID0gZmlyc3REaWZmZXJpbmdQYXRoKGFba2V5XSwgYltrZXldLCBqb2luU2VnbWVudChwcmVmaXgsIGtleSwgZmFsc2UpLCBkZXB0aCArIDEpO1xuICAgIGlmIChkZWVwZXIgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZXBlcjtcbiAgfVxuICByZXR1cm4gcHJlZml4O1xufVxuXG4vKipcbiAqIFRoZSByZWZ1c2FsIHRleHQgZm9yIGEgd3JpdGUgdGhhdCByZWFjaGVkIGEgZnJhbWUgQUZURVIgaXRzIHN0YWdlIGNvbW1pdHRlZC5cbiAqIEEgc2NvcGUsIGFuZCBldmVyeSBwcm94eSByZWFkIG91dCBvZiBpdCwgaXMgYm91bmQgdG8gdGhlIHN0YWdlIGl0IHdhcyBoYW5kZWRcbiAqIHRvOyBrZXB0IHBhc3QgdGhhdCBzdGFnZSdzIGNvbW1pdCBpdCBoYXMgbm8gZnJhbWUgdG8gbGFuZCBpbiwgc28gdGhlIHdyaXRlXG4gKiB3b3VsZCBzaXQgaW4gYSBidWZmZXIgbm90aGluZyBldmVyIGNvbW1pdHMg4oCUIG5vIHRyYWNlIHJvdywgc3RhdGUgdW5jaGFuZ2VkLlxuICogVGhlIHRocm93IHN1cmZhY2VzIGluIHRoZSBzdGFnZSB0aGF0IG1hZGUgdGhlIHdyaXRlICh0aGUgZW5naW5lJ3MgZXJyb3JcbiAqIHBhdGggbmFtZXMgaXQpOyB0aGlzIHRleHQgbmFtZXMgdGhlIHN0YWdlIHRoZSBoYW5kbGUgY2FtZSBmcm9tLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVhZEZyYW1lTWVzc2FnZShzdGFnZU5hbWU6IHN0cmluZywgcnVudGltZVN0YWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBmcm9tID0gcnVudGltZVN0YWdlSWQgPyBgXCIke3N0YWdlTmFtZX1cIiAoJHtydW50aW1lU3RhZ2VJZH0pYCA6IGBcIiR7c3RhZ2VOYW1lfVwiYDtcbiAgcmV0dXJuIChcbiAgICBgW2Zvb3RwcmludF0gU3RhZ2UgJHtmcm9tfSBoYXMgYWxyZWFkeSBjb21taXR0ZWQg4oCUIGl0cyBzY29wZSBpcyBkZWFkLCBhbmQgYSB3cml0ZSB0byBcXGAke2tleX1cXGAgYCArXG4gICAgJ2p1c3QgcmVhY2hlZCBpdCBmcm9tIGEgbGF0ZXIgc3RhZ2UgKHRoaXMgZXJyb3IgaXMgcmFpc2VkIGluIHRoYXQgc3RhZ2UpLiBBIHNjb3BlLCBhbmQgYW55dGhpbmcgcmVhZCAnICtcbiAgICAnb3V0IG9mIGl0IChgc2NvcGUua2AsIGBzY29wZS5rLmFyclswXWApLCBiZWxvbmdzIHRvIHRoZSBzdGFnZSBpdCB3YXMgaGFuZGVkIHRvOyBoZWxkIHBhc3QgdGhhdCAnICtcbiAgICBcInN0YWdlJ3MgY29tbWl0IGl0IGhhcyBubyBmcmFtZSB0byBsYW5kIGluLCBzbyB0aGUgd3JpdGUgd291bGQgdmFuaXNoIHdpdGggbm8gdHJhY2Ugcm93LiBcIiArXG4gICAgXCJSZWFkIHRoZSBrZXkgYWdhaW4gdGhyb3VnaCB0aGUgQ1VSUkVOVCBzdGFnZSdzIHNjb3BlIGFuZCB3cml0ZSB0aGVyZS5cIlxuICApO1xufVxuXG4vKipcbiAqIFRoZSB3YXJuaW5nIHRleHQgZm9yIGEga2V5IHRoZSBzdGFnZSBXUk9URSBhZnRlciBjaGFuZ2luZywgaW4gcGxhY2UsIHRoZVxuICogY29tbWl0dGVkIHZhbHVlIGl0IGhhZCByZWFkIGJlZm9yZSBpdHMgZmlyc3Qgd3JpdGUgKGNvcHktb24td3JpdGUsIDkuMjkuMCkuXG4gKiBUaGUgY29tbWl0IGNvbXBhcmVzIHdoYXQgdGhlIHN0YWdlIHdyb3RlIGFnYWluc3QgY29tbWl0dGVkIHN0YXRlIOKAlCB0aGVcbiAqIG9iamVjdCB0aGUgaW4tcGxhY2UgY2hhbmdlIGFsc28gbW92ZWQg4oCUIHNvIGl0IHJlY29yZHMgbm8gY2hhbmdlOiBsaXZlIHN0YXRlXG4gKiBrZWVwcyB0aGUgZWRpdCwgdGhlIGxvZyBhbmQgZXZlcnkgZm9sZCBkbyBub3QuICg5LjI4LjAgcmVjb3JkZWQgaXQgd2hlbiB0aGVcbiAqIGVkaXQgY2FtZSBhZnRlciB0aGUgZmlyc3Qgd3JpdGUsIGJ5IGFjY2lkZW50IG9mIGEgd2hvbGUtc3RhdGUgY2xvbmUuKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tbWl0dGVkTXV0YXRpb25NZXNzYWdlKHN0YWdlTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd2hlcmUgPSBwYXRoID09PSAnJyA/IGtleSA6IGAke2tleX0uJHtwYXRofWAucmVwbGFjZSgvXFwuXFxbL2csICdbJyk7XG4gIHJldHVybiAoXG4gICAgYFtmb290cHJpbnRdIFN0YWdlIFwiJHtzdGFnZU5hbWV9XCIgY2hhbmdlZCBcXGAke3doZXJlfVxcYCBJTiBQTEFDRSBvbiB0aGUgY29tbWl0dGVkIHZhbHVlIGl0IHJlYWQgYmVmb3JlIGAgK1xuICAgICdpdHMgZmlyc3Qgd3JpdGUsIHRoZW4gd3JvdGUgdGhlIGtleS4gVGhlIGNvbW1pdCBjb21wYXJlcyB0aGUgd3JpdHRlbiB2YWx1ZSB3aXRoIGNvbW1pdHRlZCBzdGF0ZSDigJQgJyArXG4gICAgJ3doaWNoIHRoZSBpbi1wbGFjZSBjaGFuZ2UgYWxzbyBtb3ZlZCDigJQgc28gaXQgcmVjb3JkcyBOTyBjaGFuZ2U6IGxpdmUgc3RhdGUga2VlcHMgdGhlIGVkaXQsIHRoZSBjb21taXQgJyArXG4gICAgJ2xvZyBhbmQgZXZlcnkgcmVhZGVyIHRoYXQgZm9sZHMgaXQgZG8gbm90LiBSZWFkcyBhcmUgQk9SUk9XRUQuIEJ1aWxkIHRoZSBuZXh0IHZhbHVlIGluc3RlYWQgJyArXG4gICAgYChcXGBzY29wZS4kc2V0VmFsdWUoJyR7a2V5fScsIHsgLi4udmFsdWUsIOKApiB9KVxcYCksIG9yIHJlYWQgdGhlIGtleSBhZ2FpbiBhZnRlciB0aGUgc3RhZ2UncyBmaXJzdCBgICtcbiAgICBcIndyaXRlIOKAlCB0aGF0IHJlYWQgaXMgdGhlIHN0YWdlJ3Mgb3duIGNvcHkuXCJcbiAgKTtcbn1cblxuLyoqXG4gKiBUaGUgd2FybmluZyB0ZXh0LiBOYW1lcyB0aGUgc3RhZ2UsIHRoZSBleGFjdCBwYXRoIHRoYXQgbW92ZWQsIGFuZCB0aGUgdHdvXG4gKiB3YXlzIHRvIHdyaXRlIGl0IGJhY2sg4oCUIGJlY2F1c2UgXCJ5b3UgbXV0YXRlZCBzb21ldGhpbmdcIiBpcyBub3QgYWN0aW9uYWJsZVxuICogYW5kIHRoaXMgaXMgdGhlIG9uZSBmYWlsdXJlIG1vZGUgdGhlIHdob2xlIGRlc2lnbiBleGlzdHMgdG8gcHJldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlKHN0YWdlTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd2hlcmUgPSBwYXRoID09PSAnJyA/IGtleSA6IGAke2tleX0uJHtwYXRofWAucmVwbGFjZSgvXFwuXFxbL2csICdbJyk7XG4gIHJldHVybiAoXG4gICAgYFtmb290cHJpbnRdIFN0YWdlIFwiJHtzdGFnZU5hbWV9XCIgY2hhbmdlZCBcXGAke3doZXJlfVxcYCBJTiBQTEFDRSwgb24gYSB2YWx1ZSBpdCBvbmx5IHJlYWQuIGAgK1xuICAgICdmb290cHJpbnQgbmV2ZXIgc2F3IHRoYXQgd3JpdGU6IHRoZXJlIGlzIG5vIHRyYWNlIHJvdyBmb3IgaXQsIHNvIHRoZSBjb21taXQgbG9nLCB0aGUgY2F1c2FsIGNoYWluICcgK1xuICAgICdhbmQgZXZlcnkgcmVhZGVyIHRoYXQgZm9sZHMgdGhlIGxvZyB3aWxsIGRpc2FncmVlIHdpdGggZmluYWwgc3RhdGUg4oCUIGFuZCB1bmRlciBhIGRpZmZlcmVudCB3cml0ZSAnICtcbiAgICAnb3JkZXIgdGhlIGNoYW5nZSBpcyBkcm9wcGVkIGVudGlyZWx5LiBSZWFkcyBhcmUgQk9SUk9XRUQuICcgK1xuICAgICdXcml0ZSB0aHJvdWdoIHRoZSBzY29wZSBpbnN0ZWFkIChgc2NvcGUuJyArXG4gICAgd2hlcmUgK1xuICAgICcgPSDigKZgIOKAlCBwcm9wZXJ0eSBhbmQgaW5kZXhlZCBhY2Nlc3MgYXJlIGJvdGggdHJhY2tlZCksICcgK1xuICAgIGBvciBoYW5kIGJhY2sgdGhlIHdob2xlIHZhbHVlIHdpdGggXFxgc2NvcGUuJHNldFZhbHVlKCcke2tleX0nLCBuZXh0KVxcYC4gYCArXG4gICAgJ1RoaXMgdXN1YWxseSBjb21lcyBmcm9tIG11dGF0aW5nIGFuIGVsZW1lbnQgcmVhY2hlZCBieSBgZmluZGAvYGZpbHRlcmAvYGZvcuKApm9mYC9gZm9yRWFjaGAsICcgK1xuICAgICd3aGljaCB0aGUgc2NvcGUgcHJveHkgY2Fubm90IGludGVyY2VwdC4nXG4gICk7XG59XG4iXX0=
|
package/dist/lib/memory/index.js
CHANGED
|
@@ -1,51 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* memory/ — Foundation library (zero external deps)
|
|
5
|
-
*
|
|
6
|
-
* Transactional state management with namespace isolation,
|
|
7
|
-
* atomic commits, and event-sourced time-travel.
|
|
8
|
-
*/
|
|
2
|
+
/** Engine frame, diagnostics, run policy and redaction. Record primitives belong to foottrace. */
|
|
9
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.
|
|
11
|
-
// Classes
|
|
4
|
+
exports.StageContext = exports.runPolicy = exports.DEFAULT_RUN_POLICY = exports.SCOPE_PLACEHOLDER = exports.RedactionRule = exports.DiagnosticCollector = void 0;
|
|
12
5
|
var DiagnosticCollector_js_1 = require("./DiagnosticCollector.js");
|
|
13
6
|
Object.defineProperty(exports, "DiagnosticCollector", { enumerable: true, get: function () { return DiagnosticCollector_js_1.DiagnosticCollector; } });
|
|
14
|
-
var EventLog_js_1 = require("./EventLog.js");
|
|
15
|
-
Object.defineProperty(exports, "EventLog", { enumerable: true, get: function () { return EventLog_js_1.EventLog; } });
|
|
16
|
-
var SharedMemory_js_1 = require("./SharedMemory.js");
|
|
17
|
-
Object.defineProperty(exports, "SharedMemory", { enumerable: true, get: function () { return SharedMemory_js_1.SharedMemory; } });
|
|
18
|
-
var StageContext_js_1 = require("./StageContext.js");
|
|
19
|
-
Object.defineProperty(exports, "StageContext", { enumerable: true, get: function () { return StageContext_js_1.StageContext; } });
|
|
20
|
-
var TransactionBuffer_js_1 = require("./TransactionBuffer.js");
|
|
21
|
-
Object.defineProperty(exports, "TransactionBuffer", { enumerable: true, get: function () { return TransactionBuffer_js_1.TransactionBuffer; } });
|
|
22
7
|
var redaction_js_1 = require("./redaction.js");
|
|
23
8
|
Object.defineProperty(exports, "RedactionRule", { enumerable: true, get: function () { return redaction_js_1.RedactionRule; } });
|
|
24
|
-
var
|
|
25
|
-
Object.defineProperty(exports, "
|
|
9
|
+
var redaction_js_2 = require("./redaction.js");
|
|
10
|
+
Object.defineProperty(exports, "SCOPE_PLACEHOLDER", { enumerable: true, get: function () { return redaction_js_2.SCOPE_PLACEHOLDER; } });
|
|
26
11
|
var runPolicy_js_1 = require("./runPolicy.js");
|
|
27
12
|
Object.defineProperty(exports, "DEFAULT_RUN_POLICY", { enumerable: true, get: function () { return runPolicy_js_1.DEFAULT_RUN_POLICY; } });
|
|
28
13
|
Object.defineProperty(exports, "runPolicy", { enumerable: true, get: function () { return runPolicy_js_1.runPolicy; } });
|
|
29
|
-
var
|
|
30
|
-
Object.defineProperty(exports, "
|
|
31
|
-
|
|
32
|
-
var placeholders_js_1 = require("./placeholders.js");
|
|
33
|
-
Object.defineProperty(exports, "LOG_PLACEHOLDER", { enumerable: true, get: function () { return placeholders_js_1.LOG_PLACEHOLDER; } });
|
|
34
|
-
var redaction_js_2 = require("./redaction.js");
|
|
35
|
-
Object.defineProperty(exports, "SCOPE_PLACEHOLDER", { enumerable: true, get: function () { return redaction_js_2.SCOPE_PLACEHOLDER; } });
|
|
36
|
-
// The verb law's refusal: a commit row whose verb is not set | merge | append | delete
|
|
37
|
-
var verbs_js_1 = require("./verbs.js");
|
|
38
|
-
Object.defineProperty(exports, "UnknownVerbError", { enumerable: true, get: function () { return verbs_js_1.UnknownVerbError; } });
|
|
39
|
-
// Utilities
|
|
40
|
-
var utils_js_1 = require("./utils.js");
|
|
41
|
-
Object.defineProperty(exports, "applySmartMerge", { enumerable: true, get: function () { return utils_js_1.applySmartMerge; } });
|
|
42
|
-
Object.defineProperty(exports, "deepSmartMerge", { enumerable: true, get: function () { return utils_js_1.deepSmartMerge; } });
|
|
43
|
-
Object.defineProperty(exports, "DELIM", { enumerable: true, get: function () { return utils_js_1.DELIM; } });
|
|
44
|
-
Object.defineProperty(exports, "getNestedValue", { enumerable: true, get: function () { return utils_js_1.getNestedValue; } });
|
|
45
|
-
Object.defineProperty(exports, "getRunAndGlobalPaths", { enumerable: true, get: function () { return utils_js_1.getRunAndGlobalPaths; } });
|
|
46
|
-
Object.defineProperty(exports, "normalisePath", { enumerable: true, get: function () { return utils_js_1.normalisePath; } });
|
|
47
|
-
Object.defineProperty(exports, "pathSegments", { enumerable: true, get: function () { return utils_js_1.pathSegments; } });
|
|
48
|
-
Object.defineProperty(exports, "setNestedValue", { enumerable: true, get: function () { return utils_js_1.setNestedValue; } });
|
|
49
|
-
Object.defineProperty(exports, "updateNestedValue", { enumerable: true, get: function () { return utils_js_1.updateNestedValue; } });
|
|
50
|
-
Object.defineProperty(exports, "updateValue", { enumerable: true, get: function () { return utils_js_1.updateValue; } });
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMEJBQTBCO0FBQzFCOzs7OztHQUtHOzs7QUFFSCxVQUFVO0FBQ1YsbUVBQStEO0FBQXRELDZIQUFBLG1CQUFtQixPQUFBO0FBQzVCLDZDQUF5QztBQUFoQyx1R0FBQSxRQUFRLE9BQUE7QUFDakIscURBQWlEO0FBQXhDLCtHQUFBLFlBQVksT0FBQTtBQUNyQixxREFBaUQ7QUFBeEMsK0dBQUEsWUFBWSxPQUFBO0FBQ3JCLCtEQUEyRDtBQUFsRCx5SEFBQSxpQkFBaUIsT0FBQTtBQUkxQiwrQ0FBK0M7QUFBdEMsNkdBQUEsYUFBYSxPQUFBO0FBQ3RCLHVDQUF5QztBQUFoQyx1R0FBQSxXQUFXLE9BQUE7QUFJcEIsK0NBQStEO0FBQXRELGtIQUFBLGtCQUFrQixPQUFBO0FBQUUseUdBQUEsU0FBUyxPQUFBO0FBSXRDLDJDQUE2QztBQUFwQywyR0FBQSxhQUFhLE9BQUE7QUFFdEIsc0hBQXNIO0FBQ3RILHFEQUFvRDtBQUEzQyxrSEFBQSxlQUFlLE9BQUE7QUFDeEIsK0NBQW1EO0FBQTFDLGlIQUFBLGlCQUFpQixPQUFBO0FBUzFCLHVGQUF1RjtBQUN2Rix1Q0FBOEM7QUFBckMsNEdBQUEsZ0JBQWdCLE9BQUE7QUFFekIsWUFBWTtBQUNaLHVDQVdvQjtBQVZsQiwyR0FBQSxlQUFlLE9BQUE7QUFDZiwwR0FBQSxjQUFjLE9BQUE7QUFDZCxpR0FBQSxLQUFLLE9BQUE7QUFDTCwwR0FBQSxjQUFjLE9BQUE7QUFDZCxnSEFBQSxvQkFBb0IsT0FBQTtBQUNwQix5R0FBQSxhQUFhLE9BQUE7QUFDYix3R0FBQSxZQUFZLE9BQUE7QUFDWiwwR0FBQSxjQUFjLE9BQUE7QUFDZCw2R0FBQSxpQkFBaUIsT0FBQTtBQUNqQix1R0FBQSxXQUFXLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuLyoqXG4gKiBtZW1vcnkvIOKAlCBGb3VuZGF0aW9uIGxpYnJhcnkgKHplcm8gZXh0ZXJuYWwgZGVwcylcbiAqXG4gKiBUcmFuc2FjdGlvbmFsIHN0YXRlIG1hbmFnZW1lbnQgd2l0aCBuYW1lc3BhY2UgaXNvbGF0aW9uLFxuICogYXRvbWljIGNvbW1pdHMsIGFuZCBldmVudC1zb3VyY2VkIHRpbWUtdHJhdmVsLlxuICovXG5cbi8vIENsYXNzZXNcbmV4cG9ydCB7IERpYWdub3N0aWNDb2xsZWN0b3IgfSBmcm9tICcuL0RpYWdub3N0aWNDb2xsZWN0b3IuanMnO1xuZXhwb3J0IHsgRXZlbnRMb2cgfSBmcm9tICcuL0V2ZW50TG9nLmpzJztcbmV4cG9ydCB7IFNoYXJlZE1lbW9yeSB9IGZyb20gJy4vU2hhcmVkTWVtb3J5LmpzJztcbmV4cG9ydCB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4vU3RhZ2VDb250ZXh0LmpzJztcbmV4cG9ydCB7IFRyYW5zYWN0aW9uQnVmZmVyIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkJ1ZmZlci5qcyc7XG5cbi8vIFJlZGFjdGlvbiDigJQgdGhlIE9ORSBvd25lciBvZiB0aGUgdmVyZGljdCAoOS4xOS4wKTsgdGhlIGxvZydzIHNjcnViIGlzIHRoZSByZWNvcmQncyAoc2NydWIudHMsIEM0KVxuZXhwb3J0IHR5cGUgeyBSZWRhY3Rpb25WZXJkaWN0IH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuZXhwb3J0IHsgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4vcmVkYWN0aW9uLmpzJztcbmV4cG9ydCB7IHJlZGFjdFBhdGNoIH0gZnJvbSAnLi9zY3J1Yi5qcyc7XG5cbi8vIFRoZSBydW4ncyBwb2xpY3kg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGUgcnVsZSwgdGhlIG1pcnJvciBmbGFnIGFzIE9ORSBvYmplY3QgKEY1KVxuZXhwb3J0IHR5cGUgeyBSdW5EaWFscywgUnVuUG9saWN5IH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuZXhwb3J0IHsgREVGQVVMVF9SVU5fUE9MSUNZLCBydW5Qb2xpY3kgfSBmcm9tICcuL3J1blBvbGljeS5qcyc7XG5cbi8vIEhvbmVzdHkg4oCUIHRoZSBPTkUgdm9jYWJ1bGFyeSBmb3Igd2hhdCBhIHJlYWRlciBjYW5ub3Qgc2VlIChGNGEpOiBjb2RlIOKGkiB0aGUgb25lIHNlbnRlbmNlXG5leHBvcnQgdHlwZSB7IEhvbmVzdHlDb2RlIH0gZnJvbSAnLi9ob25lc3R5LmpzJztcbmV4cG9ydCB7IEhPTkVTVFlfQ09ERVMgfSBmcm9tICcuL2hvbmVzdHkuanMnO1xuXG4vLyBUaGUgdHdvIHN0cmluZ3MgYSByZWRhY3Rpb24gbGVhdmVzIHdoZXJlIGEgdmFsdWUgd2FzLCBvbmUgcGVyIG93bmVyIChGNGE7IHNwbGl0IGluIEM0KTogdGhlIHJlY29yZCdzLCB0aGUgdmVyZGljdCdzXG5leHBvcnQgeyBMT0dfUExBQ0VIT0xERVIgfSBmcm9tICcuL3BsYWNlaG9sZGVycy5qcyc7XG5leHBvcnQgeyBTQ09QRV9QTEFDRUhPTERFUiB9IGZyb20gJy4vcmVkYWN0aW9uLmpzJztcblxuLy8gVHlwZXMg4oCUIHRoZSByZXRlbnRpb24gZmFtaWx5IHRoZSBmcmFtZSdzIGRpYWxzIGFsaWFzIChjYXB0dXJlLywgaXRzIG93bmVyKSwgdGhlIGZyYW1lJ3MgKGZyYW1lVHlwZXMudHMsXG4vLyBMNCDigJQgb3V0IG9mIHRoZSByZWNvcmQncyB0eXBlcy50cyBpbiBDNikgYW5kIHRoZSByZWNvcmQncyAodHlwZXMudHMpXG5leHBvcnQgdHlwZSB7IFJldGVudGlvblBvbGljeSB9IGZyb20gJy4uL2NhcHR1cmUvcG9saWNpZXMuanMnO1xuZXhwb3J0IHR5cGUgeyBSZWFkU3VtbWFyeU1hcmtlciwgV3JpdGVTdW1tYXJ5TWFya2VyIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuZXhwb3J0IHR5cGUgeyBGbG93Q29udHJvbFR5cGUsIEZsb3dNZXNzYWdlLCBSZWFkVHJhY2tpbmdNb2RlLCBTdGFnZVNuYXBzaG90LCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4vZnJhbWVUeXBlcy5qcyc7XG5leHBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgQ29tbWl0VmFsdWVzTW9kZSwgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnksIFVudHJhY2tlZFNvdXJjZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyBUaGUgdmVyYiBsYXcncyByZWZ1c2FsOiBhIGNvbW1pdCByb3cgd2hvc2UgdmVyYiBpcyBub3Qgc2V0IHwgbWVyZ2UgfCBhcHBlbmQgfCBkZWxldGVcbmV4cG9ydCB7IFVua25vd25WZXJiRXJyb3IgfSBmcm9tICcuL3ZlcmJzLmpzJztcblxuLy8gVXRpbGl0aWVzXG5leHBvcnQge1xuICBhcHBseVNtYXJ0TWVyZ2UsXG4gIGRlZXBTbWFydE1lcmdlLFxuICBERUxJTSxcbiAgZ2V0TmVzdGVkVmFsdWUsXG4gIGdldFJ1bkFuZEdsb2JhbFBhdGhzLFxuICBub3JtYWxpc2VQYXRoLFxuICBwYXRoU2VnbWVudHMsXG4gIHNldE5lc3RlZFZhbHVlLFxuICB1cGRhdGVOZXN0ZWRWYWx1ZSxcbiAgdXBkYXRlVmFsdWUsXG59IGZyb20gJy4vdXRpbHMuanMnO1xuIl19
|
|
14
|
+
var StageContext_js_1 = require("./StageContext.js");
|
|
15
|
+
Object.defineProperty(exports, "StageContext", { enumerable: true, get: function () { return StageContext_js_1.StageContext; } });
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsa0dBQWtHOzs7QUFJbEcsbUVBQStEO0FBQXRELDZIQUFBLG1CQUFtQixPQUFBO0FBRzVCLCtDQUErQztBQUF0Qyw2R0FBQSxhQUFhLE9BQUE7QUFDdEIsK0NBQW1EO0FBQTFDLGlIQUFBLGlCQUFpQixPQUFBO0FBRTFCLCtDQUErRDtBQUF0RCxrSEFBQSxrQkFBa0IsT0FBQTtBQUFFLHlHQUFBLFNBQVMsT0FBQTtBQUN0QyxxREFBaUQ7QUFBeEMsK0dBQUEsWUFBWSxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEVuZ2luZSBmcmFtZSwgZGlhZ25vc3RpY3MsIHJ1biBwb2xpY3kgYW5kIHJlZGFjdGlvbi4gUmVjb3JkIHByaW1pdGl2ZXMgYmVsb25nIHRvIGZvb3R0cmFjZS4gKi9cblxuZXhwb3J0IHR5cGUgeyBSZXRlbnRpb25Qb2xpY3kgfSBmcm9tICcuLi9jYXB0dXJlL3BvbGljaWVzLmpzJztcbmV4cG9ydCB0eXBlIHsgUmVhZFN1bW1hcnlNYXJrZXIsIFdyaXRlU3VtbWFyeU1hcmtlciB9IGZyb20gJy4uL2NhcHR1cmUvc3VtbWFyaXplLmpzJztcbmV4cG9ydCB7IERpYWdub3N0aWNDb2xsZWN0b3IgfSBmcm9tICcuL0RpYWdub3N0aWNDb2xsZWN0b3IuanMnO1xuZXhwb3J0IHR5cGUgeyBGbG93Q29udHJvbFR5cGUsIEZsb3dNZXNzYWdlLCBSZWFkVHJhY2tpbmdNb2RlLCBTdGFnZVNuYXBzaG90LCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4vZnJhbWVUeXBlcy5qcyc7XG5leHBvcnQgdHlwZSB7IFJlZGFjdGlvblZlcmRpY3QgfSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5leHBvcnQgeyBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuZXhwb3J0IHsgU0NPUEVfUExBQ0VIT0xERVIgfSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5leHBvcnQgdHlwZSB7IFJ1bkRpYWxzLCBSdW5Qb2xpY3kgfSBmcm9tICcuL3J1blBvbGljeS5qcyc7XG5leHBvcnQgeyBERUZBVUxUX1JVTl9QT0xJQ1ksIHJ1blBvbGljeSB9IGZyb20gJy4vcnVuUG9saWN5LmpzJztcbmV4cG9ydCB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4vU3RhZ2VDb250ZXh0LmpzJztcbiJdfQ==
|