footprintjs 4.17.2 → 5.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/CLAUDE.md +39 -1
- package/dist/advanced.js +1 -1
- package/dist/esm/advanced.js +1 -1
- package/dist/esm/index.js +3 -3
- package/dist/esm/lib/builder/FlowChartBuilder.js +32 -7
- package/dist/esm/lib/decide/decide.js +9 -9
- package/dist/esm/lib/decide/evidence.js +2 -2
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +3 -3
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +3 -3
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +20 -3
- package/dist/esm/lib/memory/StageContext.js +3 -3
- package/dist/esm/lib/memory/backtrack.js +1 -1
- package/dist/esm/lib/reactive/createTypedScope.js +5 -5
- package/dist/esm/lib/reactive/types.js +7 -7
- package/dist/esm/lib/recorder/BoundaryStateStore.js +167 -0
- package/dist/esm/lib/recorder/BoundaryStateTracker.js +4 -4
- package/dist/esm/lib/recorder/CombinedRecorder.js +9 -9
- package/dist/esm/lib/recorder/CommitRangeIndex.js +207 -0
- package/dist/esm/lib/recorder/CompositeRecorder.js +6 -6
- package/dist/esm/lib/recorder/EmitRecorder.js +3 -3
- package/dist/esm/lib/recorder/InOutRecorder.js +1 -1
- package/dist/esm/lib/recorder/KeyedStore.js +113 -0
- package/dist/esm/lib/recorder/QualityRecorder.js +2 -2
- package/dist/esm/lib/recorder/SequenceRecorder.js +2 -2
- package/dist/esm/lib/recorder/SequenceStore.js +195 -0
- package/dist/esm/lib/recorder/TopologyRecorder.js +1 -1
- package/dist/esm/lib/recorder/index.js +13 -3
- package/dist/esm/lib/runner/ExecutionRuntime.js +1 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +72 -28
- package/dist/esm/lib/runner/RunContext.js +2 -2
- package/dist/esm/lib/runner/RunnableChart.js +1 -1
- package/dist/esm/lib/runner/runId.js +65 -0
- package/dist/esm/lib/scope/ScopeFacade.js +6 -6
- package/dist/esm/lib/scope/index.js +1 -1
- package/dist/esm/lib/scope/recorders/DebugRecorder.js +4 -4
- package/dist/esm/lib/scope/recorders/MetricRecorder.js +2 -2
- package/dist/esm/lib/scope/recorders/index.js +1 -1
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/esm/recorders.js +1 -1
- package/dist/esm/trace.js +13 -1
- package/dist/index.js +3 -3
- package/dist/lib/builder/FlowChartBuilder.js +32 -7
- package/dist/lib/decide/decide.js +9 -9
- package/dist/lib/decide/evidence.js +2 -2
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +3 -3
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +3 -3
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +20 -3
- package/dist/lib/memory/StageContext.js +3 -3
- package/dist/lib/memory/backtrack.js +1 -1
- package/dist/lib/reactive/createTypedScope.js +5 -5
- package/dist/lib/reactive/types.js +7 -7
- package/dist/lib/recorder/BoundaryStateStore.js +171 -0
- package/dist/lib/recorder/BoundaryStateTracker.js +4 -4
- package/dist/lib/recorder/CombinedRecorder.js +9 -9
- package/dist/lib/recorder/CommitRangeIndex.js +211 -0
- package/dist/lib/recorder/CompositeRecorder.js +6 -6
- package/dist/lib/recorder/EmitRecorder.js +3 -3
- package/dist/lib/recorder/InOutRecorder.js +1 -1
- package/dist/lib/recorder/KeyedStore.js +117 -0
- package/dist/lib/recorder/QualityRecorder.js +2 -2
- package/dist/lib/recorder/SequenceRecorder.js +2 -2
- package/dist/lib/recorder/SequenceStore.js +199 -0
- package/dist/lib/recorder/TopologyRecorder.js +1 -1
- package/dist/lib/recorder/index.js +19 -6
- package/dist/lib/runner/ExecutionRuntime.js +1 -1
- package/dist/lib/runner/FlowChartExecutor.js +72 -28
- package/dist/lib/runner/RunContext.js +2 -2
- package/dist/lib/runner/RunnableChart.js +1 -1
- package/dist/lib/runner/runId.js +70 -0
- package/dist/lib/scope/ScopeFacade.js +6 -6
- package/dist/lib/scope/index.js +1 -1
- package/dist/lib/scope/recorders/DebugRecorder.js +4 -4
- package/dist/lib/scope/recorders/MetricRecorder.js +2 -2
- package/dist/lib/scope/recorders/index.js +1 -1
- package/dist/lib/scope/types.js +1 -1
- package/dist/recorders.js +1 -1
- package/dist/trace.js +18 -2
- package/dist/types/index.d.ts +4 -4
- package/dist/types/lib/decide/evidence.d.ts +3 -3
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +2 -2
- package/dist/types/lib/engine/narrative/types.d.ts +19 -2
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +11 -0
- package/dist/types/lib/memory/StageContext.d.ts +2 -2
- package/dist/types/lib/memory/backtrack.d.ts +1 -1
- package/dist/types/lib/reactive/types.d.ts +7 -7
- package/dist/types/lib/recorder/BoundaryStateStore.d.ts +115 -0
- package/dist/types/lib/recorder/BoundaryStateTracker.d.ts +3 -3
- package/dist/types/lib/recorder/CombinedRecorder.d.ts +11 -11
- package/dist/types/lib/recorder/CommitRangeIndex.d.ts +147 -0
- package/dist/types/lib/recorder/CompositeRecorder.d.ts +8 -8
- package/dist/types/lib/recorder/EmitRecorder.d.ts +2 -2
- package/dist/types/lib/recorder/InOutRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/KeyedStore.d.ts +70 -0
- package/dist/types/lib/recorder/QualityRecorder.d.ts +4 -4
- package/dist/types/lib/recorder/SequenceRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/SequenceStore.d.ts +120 -0
- package/dist/types/lib/recorder/TopologyRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/index.d.ts +5 -2
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +1 -1
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +36 -14
- package/dist/types/lib/runner/RunContext.d.ts +2 -2
- package/dist/types/lib/runner/RunnableChart.d.ts +2 -2
- package/dist/types/lib/runner/runId.d.ts +45 -0
- package/dist/types/lib/scope/ScopeFacade.d.ts +4 -4
- package/dist/types/lib/scope/index.d.ts +1 -1
- package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +4 -4
- package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +4 -4
- package/dist/types/lib/scope/recorders/index.d.ts +1 -1
- package/dist/types/lib/scope/types.d.ts +1 -1
- package/dist/types/recorders.d.ts +1 -1
- package/dist/types/trace.d.ts +5 -0
- package/package.json +1 -1
|
@@ -25,9 +25,9 @@ exports.SCOPE_METHOD_NAMES = new Set([
|
|
|
25
25
|
'$error',
|
|
26
26
|
'$metric',
|
|
27
27
|
'$eval',
|
|
28
|
-
'$
|
|
29
|
-
'$
|
|
30
|
-
'$
|
|
28
|
+
'$attachScopeRecorder',
|
|
29
|
+
'$detachScopeRecorder',
|
|
30
|
+
'$getScopeRecorders',
|
|
31
31
|
'$batchArray',
|
|
32
32
|
'$break',
|
|
33
33
|
'$emit',
|
|
@@ -51,10 +51,10 @@ exports.EXECUTOR_INTERNAL_METHODS = new Set([
|
|
|
51
51
|
'notifyStageStart', // StageRunner.run() line 59
|
|
52
52
|
'notifyStageEnd', // StageRunner.run() line 79
|
|
53
53
|
'notifyPause', // StageRunner.run() — pause detection
|
|
54
|
-
'
|
|
55
|
-
'
|
|
56
|
-
'
|
|
54
|
+
'attachScopeRecorder', // FlowChartExecutor.createTraverser() — narrative + user recorders
|
|
55
|
+
'detachScopeRecorder', // FlowChartExecutor.detachScopeRecorder()
|
|
56
|
+
'getScopeRecorders', // FlowChartExecutor.getScopeRecorders()
|
|
57
57
|
'useSharedRedactedKeys', // FlowChartExecutor.createTraverser() — redaction wrapping
|
|
58
58
|
'useRedactionPolicy', // FlowChartExecutor.createTraverser() — redaction wrapping
|
|
59
59
|
]);
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlYWN0aXZlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7R0FRRzs7O0FBMFBILCtFQUErRTtBQUMvRSx1RUFBdUU7QUFFMUQsUUFBQSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBUztJQUNoRCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixhQUFhO0lBQ2IsUUFBUTtJQUNSLE9BQU87SUFDUCxxQkFBcUI7SUFDckIsa0JBQWtCO0lBQ2xCLFFBQVE7Q0FDVCxDQUFDLENBQUM7QUFFSCwrRUFBK0U7QUFDL0UsZ0VBQWdFO0FBQ2hFLHFFQUFxRTtBQUV4RCxRQUFBLFlBQVksR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUVsRSwrRUFBK0U7QUFDL0UsNkVBQTZFO0FBQzdFLCtDQUErQztBQUVsQyxRQUFBLGNBQWMsR0FBRyxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUV4RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFFN0QsUUFBQSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMvQyxrQkFBa0IsRUFBRSw0QkFBNEI7SUFDaEQsZ0JBQWdCLEVBQUUsNEJBQTRCO0lBQzlDLGFBQWEsRUFBRSxzQ0FBc0M7SUFDckQsZ0JBQWdCLEVBQUUsbUVBQW1FO0lBQ3JGLGdCQUFnQixFQUFFLHFDQUFxQztJQUN2RCxjQUFjLEVBQUUsbUNBQW1DO0lBQ25ELHVCQUF1QixFQUFFLDJEQUEyRDtJQUNwRixvQkFBb0IsRUFBRSwyREFBMkQ7Q0FDbEYsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZWFjdGl2ZS90eXBlcyAtLSBUeXBlIGRlZmluaXRpb25zIGZvciB0aGUgVHlwZWRTY29wZTxUPiByZWFjdGl2ZSBwcm94eSBzeXN0ZW0uXG4gKlxuICogVHlwZWRTY29wZTxUPiB3cmFwcyBhIFJlYWN0aXZlVGFyZ2V0IChTY29wZUZhY2FkZSkgaW4gYSBQcm94eSB0aGF0IHByb3ZpZGVzXG4gKiB0eXBlZCBwcm9wZXJ0eSBhY2Nlc3MuIEFsbCBzY29wZSBpbmZyYXN0cnVjdHVyZSBtZXRob2RzIGFyZSAkLXByZWZpeGVkIHRvXG4gKiBhdm9pZCBjb2xsaXNpb25zIHdpdGggdXNlciBzdGF0ZSBrZXlzLlxuICpcbiAqIERlcGVuZGVuY3k6IHR5cGUtb25seSBpbXBvcnRzIGZyb20gZW5naW5lLyBhbmQgc2NvcGUvICh6ZXJvIHJ1bnRpbWUgY29zdCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25FbnYgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWNvcmRlciB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcblxuLy8gLS0gUmVhY3RpdmVUYXJnZXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTWluaW11bSBwcm90b2NvbCByZXF1aXJlZCBieSBUeXBlZFNjb3BlIC0tIGEgY3VyYXRlZCBzdWJzZXQgb2YgU2NvcGVGYWNhZGUnc1xuLy8gcHVibGljIEFQSS4gTm90IGEgZnVsbCBtaXJyb3I6IGV4Y2x1ZGVzIGludGVybmFsL3JlZGFjdGlvbiBtZXRob2RzIHRoYXQgYXJlXG4vLyBoYW5kbGVkIGF0IHRoZSBleGVjdXRvciBsZXZlbCAodXNlUmVkYWN0aW9uUG9saWN5LCB1c2VTaGFyZWRSZWRhY3RlZEtleXMsIGV0Yy4pXG4vLyBhbmQgaW5mcmFzdHJ1Y3R1cmUgbWV0aG9kcyAoZ2V0UGlwZWxpbmVJZCwgc2V0R2xvYmFsLCBnZXRHbG9iYWwsIGV0Yy4pLlxuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWN0aXZlVGFyZ2V0IHtcbiAgLy8gU3RhdGUgYWNjZXNzICh0cmFja2VkIGJ5IHJlY29yZGVycylcbiAgZ2V0VmFsdWUoa2V5Pzogc3RyaW5nKTogdW5rbm93bjtcbiAgc2V0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQ7XG4gIHVwZGF0ZVZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICBkZWxldGVWYWx1ZShrZXk6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8vIE5vbi10cmFja2luZyBzdGF0ZSBpbnNwZWN0aW9uIChmb3IgcHJveHkgaW50ZXJuYWxzIOKAlCBubyByZWNvcmRlciBkaXNwYXRjaClcbiAgLyoqIFJldHVybnMgYWxsIHN0YXRlIGtleXMgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IG93bktleXMvaGFzIHRyYXBzLiAqL1xuICBnZXRTdGF0ZUtleXM/KCk6IHN0cmluZ1tdO1xuICAvKiogQ2hlY2sga2V5IGV4aXN0ZW5jZSB3aXRob3V0IGZpcmluZyBvblJlYWQuIFVzZWQgYnkgaGFzIHRyYXAuICovXG4gIGhhc0tleT8oa2V5OiBzdHJpbmcpOiBib29sZWFuO1xuICAvKiogUmVhZCBzdGF0ZSB3aXRob3V0IGZpcmluZyBvblJlYWQuIFVzZWQgYnkgYXJyYXkgcHJveHkgZ2V0Q3VycmVudCgpLiAqL1xuICBnZXRWYWx1ZVNpbGVudD8oa2V5Pzogc3RyaW5nKTogdW5rbm93bjtcblxuICAvLyBJbnB1dCAmIGVudmlyb25tZW50IChyZWFkb25seSwgTk9UIHRyYWNrZWQpXG4gIGdldEFyZ3M8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpOiBUO1xuICBnZXRFbnYoKTogUmVhZG9ubHk8RXhlY3V0aW9uRW52PjtcblxuICAvLyBSZWNvcmRlciBtYW5hZ2VtZW50XG4gIGF0dGFjaFJlY29yZGVyKHJlY29yZGVyOiBSZWNvcmRlcik6IHZvaWQ7XG4gIGRldGFjaFJlY29yZGVyKHJlY29yZGVySWQ6IHN0cmluZyk6IHZvaWQ7XG4gIGdldFJlY29yZGVycygpOiBSZWNvcmRlcltdO1xuXG4gIC8vIERpYWdub3N0aWNzXG4gIGFkZERlYnVnSW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBhZGREZWJ1Z01lc3NhZ2UodmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBhZGRFcnJvckluZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgYWRkTWV0cmljKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBhZGRFdmFsKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuXG4gIC8vIEVtaXQgY2hhbm5lbCAoUGhhc2UgMykg4oCUIHN0cnVjdHVyZWQgdXNlci1hdXRob3JlZCBldmVudHMgdG8gRW1pdFJlY29yZGVycy5cbiAgZW1pdEV2ZW50KG5hbWU6IHN0cmluZywgcGF5bG9hZD86IHVua25vd24pOiB2b2lkO1xuXG4gIC8vIERldGFjaCAoVDQpIOKAlCBmaXJlLWFuZC1mb3JnZXQgY2hpbGQgZmxvd2NoYXJ0cy4gU2NvcGVGYWNhZGVcbiAgLy8gZGVsZWdhdGVzIHRvIGBkZXRhY2gvc3Bhd25gLCBtaW50aW5nIHJlZklkcyBmcm9tIHRoaXMgc3RhZ2Unc1xuICAvLyBydW50aW1lU3RhZ2VJZCBmb3IgZGlhZ25vc3RpYyBjb3JyZWxhdGlvbi5cbiAgZGV0YWNoQW5kSm9pbkxhdGVyKFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoSGFuZGxlO1xuXG4gIGRldGFjaEFuZEZvcmdldChcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiB2b2lkO1xufVxuXG4vLyAtLSBTY29wZU1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyAkLXByZWZpeGVkIGVzY2FwZSBoYXRjaGVzLiBOb24tZW51bWVyYWJsZSBvbiB0aGUgcHJveHkgLS0gZG9uJ3QgYXBwZWFyIGluXG4vLyBPYmplY3Qua2V5cygpLCBkZXN0cnVjdHVyaW5nLCBvciBmb3IuLi5pbi4gT25seSBzdGF0ZSBrZXlzIGFyZSB2aXNpYmxlLlxuXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlTWV0aG9kcyB7XG4gIC8vIFN0YXRlICh1bnR5cGVkIGVzY2FwZSBoYXRjaCAtLSBmb3IgZHluYW1pYyBrZXlzLCByZWRhY3Rpb24sIGRlc2NyaXB0aW9uKVxuICAkZ2V0VmFsdWUoa2V5OiBzdHJpbmcpOiB1bmtub3duO1xuICAkc2V0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQ7XG4gICR1cGRhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQ7XG4gICRkZWxldGUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbiAgLyoqIFByb3h5LXN5bnRoZXNpemVkOiBjYWxscyBnZXRWYWx1ZShyb290S2V5KSB0aGVuIGxvZGFzaC5nZXQgZm9yIG5lc3RlZCBwYXRoLiBOb3QgYSBkaXJlY3QgZGVsZWdhdGlvbi4gKi9cbiAgJHJlYWQoZG90UGF0aDogc3RyaW5nKTogdW5rbm93bjtcblxuICAvLyBJbnB1dCAmIGVudmlyb25tZW50IChyZWFkb25seSlcbiAgJGdldEFyZ3M8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpOiBUO1xuICAkZ2V0RW52KCk6IFJlYWRvbmx5PEV4ZWN1dGlvbkVudj47XG5cbiAgLy8gT2JzZXJ2YWJpbGl0eSDigJQgbGVnYWN5IGRpYWdub3N0aWMgcHJpbWl0aXZlcy5cbiAgLy9cbiAgLy8gQXMgb2YgUGhhc2UgMyB0aGVzZSBBTFNPIGRpc3BhdGNoIG9uIHRoZSBlbWl0IGNoYW5uZWwgKGluIGFkZGl0aW9uIHRvXG4gIC8vIHRoZWlyIGV4aXN0aW5nIGBEaWFnbm9zdGljQ29sbGVjdG9yYCBzaWRlLWJhZyB3cml0ZXMgZm9yIHNuYXBzaG90XG4gIC8vIGluY2x1c2lvbikuIEFueSBhdHRhY2hlZCBgRW1pdFJlY29yZGVyYCB3aWxsIHNlZSB0aGVzZSBldmVudHMgd2l0aFxuICAvLyB0aGUgY29ycmVzcG9uZGluZyBuYW1lc3BhY2VkIG5hbWVzOlxuICAvL1xuICAvLyAgICRkZWJ1ZyhrZXksIHZhbHVlKSAgICAtPiBlbWl0cyBgbG9nLmRlYnVnLiR7a2V5fWBcbiAgLy8gICAkZXJyb3Ioa2V5LCB2YWx1ZSkgICAgLT4gZW1pdHMgYGxvZy5lcnJvci4ke2tleX1gXG4gIC8vICAgJG1ldHJpYyhuYW1lLCB2YWx1ZSkgIC0+IGVtaXRzIGBtZXRyaWMuJHtuYW1lfWBcbiAgLy8gICAkZXZhbCAobmFtZSwgdmFsdWUpICAgLT4gZW1pdHMgYGV2YWwuJHtuYW1lfWBcbiAgLy8gICAkbG9nKHZhbHVlKSAgICAgICAgICAgLT4gZW1pdHMgYGxvZy5kZWJ1Zy5tZXNzYWdlc2BcbiAgLy9cbiAgLy8gVGhpcyBtYWtlcyB0aGUgY2FsbHMgb2JzZXJ2YWJsZSBpbiByZWFsIHRpbWUg4oCUIG5vIGxvc3Mgb2YgYmFja3dhcmRcbiAgLy8gY29tcGF0OyB0aGUgc2lkZSBiYWcgY29udGludWVzIHRvIHBvcHVsYXRlIGZvciBjb25zdW1lcnMgdGhhdCBpbnNwZWN0XG4gIC8vIHRoZSBzbmFwc2hvdCBkaXJlY3RseS5cbiAgJGRlYnVnKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gICRsb2codmFsdWU6IHVua25vd24pOiB2b2lkO1xuICAkZXJyb3Ioa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgJG1ldHJpYyhuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgJGV2YWwobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG5cbiAgLy8gUmVjb3JkZXIgbWFuYWdlbWVudFxuICAkYXR0YWNoUmVjb3JkZXIocmVjb3JkZXI6IFJlY29yZGVyKTogdm9pZDtcbiAgJGRldGFjaFJlY29yZGVyKHJlY29yZGVySWQ6IHN0cmluZyk6IHZvaWQ7XG4gICRnZXRSZWNvcmRlcnMoKTogUmVjb3JkZXJbXTtcblxuICAvKipcbiAgICogQmF0Y2gtbXV0YXRlIGFuIGFycmF5IGtleSBpbiBhIHNpbmdsZSBjbG9uZSt3cml0ZSBjeWNsZS5cbiAgICpcbiAgICogRXZlcnkgYHNjb3BlLml0ZW1zLnB1c2goeClgIGNsb25lcyB0aGUgZW50aXJlIGFycmF5IGFuZCBjb21taXRzIGl0IOKAlCBPKE4pIHBlciBjYWxsLlxuICAgKiBGb3IgTiBtdXRhdGlvbnMgb24gYW4gTS1sZW5ndGggYXJyYXkgdGhhdCBpcyBPKE7Dl00pLiBVc2UgYCRiYXRjaEFycmF5YCB0byBjbG9uZSBvbmNlLFxuICAgKiBhcHBseSBhbGwgbXV0YXRpb25zIGluc2lkZSBgZm5gLCB0aGVuIGNvbW1pdCBvbmNlIOKAlCBPKE0pIHRvdGFsLlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIEJlZm9yZTogMTAwMCBjbG9uZXMgw5cgZ3Jvd2luZyBhcnJheSA9IE8oTsKyKVxuICAgKiBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykgc2NvcGUuaXRlbXMucHVzaChpKTtcbiAgICpcbiAgICogLy8gQWZ0ZXI6IDEgY2xvbmUgKyAxIGNvbW1pdCA9IE8oTilcbiAgICogc2NvcGUuJGJhdGNoQXJyYXkoJ2l0ZW1zJywgKGFycikgPT4ge1xuICAgKiAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSBhcnIucHVzaChpKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBgZm5gIHJlY2VpdmVzIGEgcGxhaW4gKG5vbi1wcm94eSkgbXV0YWJsZSAqKnNoYWxsb3cgY29weSoqIG9mIHRoZSBjdXJyZW50IGFycmF5LlxuICAgKiBUaGUgYXJyYXkgaXRzZWxmIGlzIGEgbmV3IGluc3RhbmNlLCBidXQgb2JqZWN0IHJlZmVyZW5jZXMgaW5zaWRlIGl0IGFyZSBzaGFyZWQgd2l0aFxuICAgKiB0aGUgb3JpZ2luYWwgc3RhdGUg4oCUIG11dGF0aW9ucyB0byBuZXN0ZWQgb2JqZWN0cyBpbnNpZGUgYGZuYCBhZmZlY3QgdGhvc2Ugb3JpZ2luYWxzLlxuICAgKiBPbmx5IHB1c2gvcG9wL3NvcnQvc3BsaWNlIGFuZCBvdGhlciBvcGVyYXRpb25zIHRoYXQgY2hhbmdlIHRoZSBhcnJheSdzIG93biBzbG90cyBhcmVcbiAgICogc2FmZWx5IGlzb2xhdGVkLlxuICAgKlxuICAgKiBNdXRhdGlvbnMgaW5zaWRlIGBmbmAgYXJlIE5PVCB0cmFja2VkIGluZGl2aWR1YWxseSDigJQgb25seSB0aGUgZmluYWwgY29tbWl0dGVkIGFycmF5XG4gICAqIGFwcGVhcnMgaW4gdGhlIG5hcnJhdGl2ZSBhcyBhIHNpbmdsZSB3cml0ZS4gSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYW5cbiAgICogYXJyYXksIGBmbmAgcmVjZWl2ZXMgYW4gZW1wdHkgYXJyYXkgYW5kIHRoZSByZXN1bHQgaXMgY29tbWl0dGVkIGFzIHRoZSBuZXcgdmFsdWUuXG4gICAqXG4gICAqIElmIGBmbmAgdGhyb3dzLCBgc2V0VmFsdWVgIGlzIG5ldmVyIGNhbGxlZCBhbmQgc3RhdGUgcmVtYWlucyB1bmNoYW5nZWQgKGF0b21pYyBvblxuICAgKiBlcnJvcikuIFRoZSBleGNlcHRpb24gcHJvcGFnYXRlcyB0byB0aGUgY2FsbGVyLlxuICAgKlxuICAgKiBga2V5YCBpcyB1bnR5cGVkIChgc3RyaW5nYCkg4oCUIFR5cGVTY3JpcHQgd2lsbCBub3QgY2F0Y2ggdHlwb3MuIGBhcnJgIGlzIHR5cGVkIGFzXG4gICAqIGB1bmtub3duW11gIGJlY2F1c2UgYFNjb3BlTWV0aG9kc2AgaXMgbm90IHBhcmFtZXRlcml6ZWQgYnkgYFRgOyBjYXN0IGluc2lkZSBgZm5gXG4gICAqIHdoZW4gZWxlbWVudCB0eXBlcyBhcmUga25vd246IGAoYXJyIGFzIHN0cmluZ1tdKS5wdXNoKHgpYC5cbiAgICovXG4gICRiYXRjaEFycmF5KGtleTogc3RyaW5nLCBmbjogKGFycjogdW5rbm93bltdKSA9PiB2b2lkKTogdm9pZDtcblxuICAvLyBPYnNlcnZhYmlsaXR5IOKAlCBFbWl0IGNoYW5uZWwgKFBoYXNlIDMpXG4gIC8qKlxuICAgKiBGaXJlIGEgc3RydWN0dXJlZCBldmVudCB0byBldmVyeSBhdHRhY2hlZCByZWNvcmRlciBpbXBsZW1lbnRpbmdcbiAgICogYG9uRW1pdGAuIFRoZSBwcmltYXJ5IHByaW1pdGl2ZSBmb3IgY29uc3VtZXItYXV0aG9yZWQgb2JzZXJ2YWJpbGl0eVxuICAgKiBldmVudHMgKExMTSB0b2tlbnMsIGJpbGxpbmcgbWV0cmljcywgZG9tYWluIG1pbGVzdG9uZXMsIGV0Yy4pIHRoYXRcbiAgICogc2hvdWxkbid0IGxpdmUgaW4gc2NvcGUgc3RhdGUuXG4gICAqXG4gICAqIFN5bmNocm9ub3VzLCBwYXNzLXRocm91Z2gg4oCUIGRlbGl2ZXJlZCB0byByZWNvcmRlcnMgaW1tZWRpYXRlbHksIGluXG4gICAqIGNhbGwgb3JkZXIuIFplcm8tYWxsb2NhdGlvbiB3aGVuIG5vIHJlY29yZGVycyBhcmUgYXR0YWNoZWQuXG4gICAqXG4gICAqICMjIE5hbWluZyBjb252ZW50aW9uXG4gICAqXG4gICAqIFVzZSBoaWVyYXJjaGljYWwgZG90dGVkIG5hbWVzOiBgJzxuYW1lc3BhY2U+LjxjYXRlZ29yeT4uPGV2ZW50PidgLlxuICAgKiBFeGFtcGxlczpcbiAgICogICAtIGAnYWdlbnRmb290cHJpbnQubGxtLnRva2VucydgXG4gICAqICAgLSBgJ215YXBwLmJpbGxpbmcuc3BlbmQnYFxuICAgKiAgIC0gYCdhdXRoLmNoZWNrLmRlbmllZCdgXG4gICAqXG4gICAqIFRoZSBsaWJyYXJ5IHN0YXlzIHZvY2FidWxhcnktYWdub3N0aWMg4oCUIG5vIGNlbnRyYWwgcmVnaXN0cnksIG5vXG4gICAqIHJlc2VydmVkIHByZWZpeGVzLiBOYW1lc3BhY2UgcHJlZml4ZXMgcHJldmVudCBjb2xsaXNpb25zIGFjcm9zc1xuICAgKiBsaWJyYXJpZXMgYW5kIGFwcHMgbmF0dXJhbGx5LlxuICAgKlxuICAgKiAjIyBSZWRhY3Rpb25cbiAgICpcbiAgICogSWYgYFJlZGFjdGlvblBvbGljeS5lbWl0UGF0dGVybnNgIG1hdGNoZXMgdGhlIG5hbWUsIHRoZSBwYXlsb2FkIGlzXG4gICAqIHJlcGxhY2VkIHdpdGggYCdbUkVEQUNURURdJ2AgYmVmb3JlIGRpc3BhdGNoLiBObyByZWNvcmRlciBldmVyIHNlZXNcbiAgICogdGhlIHJhdyB2YWx1ZSBmb3IgcmVkYWN0ZWQgZXZlbnQgbmFtZXMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQ29uc3VtZXItY2hvc2VuIGV2ZW50IGlkZW50aWZpZXIgKHNlZSBuYW1pbmcgY29udmVudGlvbikuXG4gICAqIEBwYXJhbSBwYXlsb2FkIC0gU3RydWN0dXJlZCBkYXRhIHRvIGF0dGFjaC4gU2hhcGUgaXMgdXAgdG8gdGhlXG4gICAqICAgY29uc3VtZXI7IGxpYnJhcnkgdHJlYXRzIGl0IGFzIG9wYXF1ZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBzY29wZS4kZW1pdCgnYWdlbnRmb290cHJpbnQubGxtLnRva2VucycsIHsgaW5wdXQ6IDEwMCwgb3V0cHV0OiA1MCB9KTtcbiAgICogc2NvcGUuJGVtaXQoJ215YXBwLmRlY2lzaW9uJywgeyBicmFuY2g6ICdhcHByb3ZlZCcsIGNvbmZpZGVuY2U6IDAuOTIgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgJGVtaXQobmFtZTogc3RyaW5nLCBwYXlsb2FkPzogdW5rbm93bik6IHZvaWQ7XG5cbiAgLy8gRGV0YWNoIOKAlCBmaXJlLWFuZC1mb3JnZXQgY2hpbGQgZmxvd2NoYXJ0IGV4ZWN1dGlvbi5cbiAgLy9cbiAgLy8gYCRkZXRhY2hBbmRKb2luTGF0ZXIoZHJpdmVyLCBjaGlsZCwgaW5wdXQ/KWAgc2NoZWR1bGVzIHRoZSBjaGlsZCB2aWFcbiAgLy8gdGhlIGdpdmVuIGRyaXZlciBhbmQgcmV0dXJucyBhIGBEZXRhY2hIYW5kbGVgIHRoZSBjb25zdW1lciBjYW4gcmVhZFxuICAvLyBzeW5jaHJvbm91c2x5IChgLnN0YXR1c2ApIG9yIGF3YWl0IChgLndhaXQoKWApLiBUaGUgcGFyZW50IHN0YWdlXG4gIC8vIGRvZXMgTk9UIGJsb2NrIG9uIHRoZSBjaGlsZCDigJQgaXQgcmV0dXJucyB0byB0aGUgYWdlbnQgbG9vcCB0aGVcbiAgLy8gbW9tZW50IHRoZSBkcml2ZXIncyBgc2NoZWR1bGUoKWAgcmV0dXJucyAocGFzc2l2ZSByZWNvcmRlciBydWxlKS5cbiAgLy9cbiAgLy8gYCRkZXRhY2hBbmRGb3JnZXQoZHJpdmVyLCBjaGlsZCwgaW5wdXQ/KWAgZGlzY2FyZHMgdGhlIGhhbmRsZSDigJRcbiAgLy8gdXNlZnVsIGZvciBmaXJlLWFuZC1mb3JnZXQgdGVsZW1ldHJ5IHdoZXJlIHRoZSBjYWxsZXIgbmV2ZXIgbmVlZHNcbiAgLy8gdG8ga25vdyBob3cgdGhlIGNoaWxkIGZpbmlzaGVkLiBFcnJvcnMgc3RpbGwgbGFuZCBvbiB0aGUgKG5vdy1cbiAgLy8gZHJvcHBlZCkgaGFuZGxlIGFuZCBnbyBzaWxlbnQgdW5sZXNzIGFuIG9ic2VydmVyIHN1cmZhY2VzIHRoZW0uXG4gIC8vXG4gIC8vIERyaXZlciBpcyBSRVFVSVJFRCDigJQgdGhlcmUncyBubyBsaWJyYXJ5LWRlZmF1bHQuIFBhc3MgZS5nLlxuICAvLyBgbWljcm90YXNrQmF0Y2hEcml2ZXJgIChmcm9tICdmb290cHJpbnRqcy9kZXRhY2gnKSBvciB5b3VyIG93blxuICAvLyBjdXN0b20gZHJpdmVyLiBFeHBsaWNpdCBwYXNzaW5nIGF2b2lkcyBnbG9iYWwgc3RhdGUgYW5kIGtlZXBzIHRoZVxuICAvLyBlbmdpbmUgZnJlZSBvZiBkcml2ZXIgaW1wb3J0cy5cbiAgJGRldGFjaEFuZEpvaW5MYXRlcihcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaEhhbmRsZTtcblxuICAkZGV0YWNoQW5kRm9yZ2V0KFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IHZvaWQ7XG5cbiAgLy8gUGlwZWxpbmUgY29udHJvbFxuICAvKipcbiAgICogU3RvcCB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dC5cbiAgICpcbiAgICogLSAqKkluIGEgdG9wLWxldmVsIGNoYXJ0OioqIHRoZSB0cmF2ZXJzZXIgZXhpdHMgY2xlYW5seSBhZnRlciB0aGlzIHN0YWdlXG4gICAqICAgY29tcGxldGVzLlxuICAgKiAtICoqSW5zaWRlIGEgc3ViZmxvdzoqKiBieSBkZWZhdWx0LCBvbmx5IHRoZSBzdWJmbG93J3Mgb3duIGV4ZWN1dGlvblxuICAgKiAgIHN0b3BzOyBjb250cm9sIHJldHVybnMgdG8gdGhlIHBhcmVudCBhcyBub3JtYWwuIElmIHRoZSBzdWJmbG93IGlzXG4gICAqICAgbW91bnRlZCB3aXRoIGBwcm9wYWdhdGVCcmVhazogdHJ1ZWAsIHRoZSBicmVhayBzaWduYWwgKGFuZCBpdHNcbiAgICogICBvcHRpb25hbCByZWFzb24pIHByb3BhZ2F0ZXMgdXAgdG8gdGhlIHBhcmVudCBzY29wZSwgdGVybWluYXRpbmcgdGhlXG4gICAqICAgb3V0ZXIgbG9vcCB0b28uIFNlZSBgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVha2AuXG4gICAqXG4gICAqIEBwYXJhbSByZWFzb24gLSBPcHRpb25hbCBmcmVlLWZvcm0gc3RyaW5nIGRlc2NyaWJpbmcgd2h5IHRoZSBicmVha1xuICAgKiAgIGhhcHBlbmVkLiBQcm9wYWdhdGVzIHRvIGBGbG93QnJlYWtFdmVudC5yZWFzb25gIHNvIHJlY29yZGVycyBhbmRcbiAgICogICBjdXN0b20gbmFycmF0aXZlcyBjYW4gc3VyZmFjZSBpdC4gRGVmYXVsdHMgdG8gdW5kZWZpbmVkLlxuICAgKi9cbiAgJGJyZWFrKHJlYXNvbj86IHN0cmluZyk6IHZvaWQ7XG5cbiAgLy8gRXNjYXBlIGhhdGNoIC0tIHVud3JhcCB0byB1bmRlcmx5aW5nIFJlYWN0aXZlVGFyZ2V0XG4gICR0b1JhdygpOiBSZWFjdGl2ZVRhcmdldDtcbn1cblxuLy8gLS0gVHlwZWRTY29wZTxUPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVGhlIGNvbnN1bWVyLWZhY2luZyB0eXBlLiBUIGlzIHRoZSB1c2VyJ3Mgc3RhdGUgaW50ZXJmYWNlLlxuLy8gUHJvcGVydHkgYWNjZXNzIGlzIHR5cGVkOyAkLW1ldGhvZHMgcHJvdmlkZSBlc2NhcGUgaGF0Y2hlcy5cblxuZXhwb3J0IHR5cGUgVHlwZWRTY29wZTxUIGV4dGVuZHMgb2JqZWN0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0gVCAmIFNjb3BlTWV0aG9kcztcblxuLy8gLS0gUmVhY3RpdmVPcHRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29uZmlndXJhdGlvbiBwYXNzZWQgdG8gY3JlYXRlVHlwZWRTY29wZS5cblxuZXhwb3J0IGludGVyZmFjZSBSZWFjdGl2ZU9wdGlvbnMge1xuICAvKipcbiAgICogUGlwZWxpbmUgYnJlYWsgZnVuY3Rpb24g4oCUIGluamVjdGVkIGJ5IFN0YWdlUnVubmVyIGFmdGVyIHNjb3BlIGNyZWF0aW9uLlxuICAgKiBBY2NlcHRzIGFuIG9wdGlvbmFsIHJlYXNvbiBzdHJpbmcgdGhhdCBwcm9wYWdhdGVzIHRvIGBGbG93QnJlYWtFdmVudGBcbiAgICogYW5kICh3aGVuIGBwcm9wYWdhdGVCcmVha2AgaXMgc2V0IG9uIGEgbW91bnQpIHVwIHRvIHRoZSBwYXJlbnQgc2NvcGUuXG4gICAqL1xuICBicmVha1BpcGVsaW5lPzogKHJlYXNvbj86IHN0cmluZykgPT4gdm9pZDtcbn1cblxuLy8gLS0gSW50ZXJuYWw6ICQtbWV0aG9kIG5hbWUgc2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVXNlZCBieSB0aGUgUHJveHkgZ2V0IHRyYXAgdG8gZGlzdGluZ3Vpc2ggJC1tZXRob2RzIGZyb20gc3RhdGUga2V5cy5cblxuZXhwb3J0IGNvbnN0IFNDT1BFX01FVEhPRF9OQU1FUyA9IG5ldyBTZXQ8c3RyaW5nPihbXG4gICckZ2V0VmFsdWUnLFxuICAnJHNldFZhbHVlJyxcbiAgJyR1cGRhdGUnLFxuICAnJGRlbGV0ZScsXG4gICckcmVhZCcsXG4gICckZ2V0QXJncycsXG4gICckZ2V0RW52JyxcbiAgJyRkZWJ1ZycsXG4gICckbG9nJyxcbiAgJyRlcnJvcicsXG4gICckbWV0cmljJyxcbiAgJyRldmFsJyxcbiAgJyRhdHRhY2hSZWNvcmRlcicsXG4gICckZGV0YWNoUmVjb3JkZXInLFxuICAnJGdldFJlY29yZGVycycsXG4gICckYmF0Y2hBcnJheScsXG4gICckYnJlYWsnLFxuICAnJGVtaXQnLFxuICAnJGRldGFjaEFuZEpvaW5MYXRlcicsXG4gICckZGV0YWNoQW5kRm9yZ2V0JyxcbiAgJyR0b1JhdycsXG5dKTtcblxuLy8gLS0gSW50ZXJuYWw6IFN5bWJvbCBmb3IgZGVmZXJyZWQgYnJlYWsgaW5qZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3RhZ2VSdW5uZXIgc2V0cyB0aGlzIGFmdGVyIHNjb3BlIGNyZWF0aW9uIHNvICRicmVhaygpIHdvcmtzLlxuLy8gUHJpdmF0ZSBTeW1ib2wgKG5vdCBTeW1ib2wuZm9yKSB0byBwcmV2ZW50IGNyb3NzLW1vZHVsZSB0YW1wZXJpbmcuXG5cbmV4cG9ydCBjb25zdCBCUkVBS19TRVRURVIgPSBTeW1ib2woJ2Zvb3RwcmludDpyZWFjdGl2ZTpzZXRCcmVhaycpO1xuXG4vLyAtLSBJbnRlcm5hbDogU3ltYm9sIGZvciBUeXBlZFNjb3BlIGRldGVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBVc2VkIGJ5IFN0YWdlUnVubmVyIHRvIHNraXAgY3JlYXRlUHJvdGVjdGVkU2NvcGUgZm9yIFR5cGVkU2NvcGUgaW5zdGFuY2VzLlxuLy8gUHJpdmF0ZSBTeW1ib2wgcHJldmVudHMgc3RyaW5nLXRhZyBzcG9vZmluZy5cblxuZXhwb3J0IGNvbnN0IElTX1RZUEVEX1NDT1BFID0gU3ltYm9sKCdmb290cHJpbnQ6cmVhY3RpdmU6aXNUeXBlZFNjb3BlJyk7XG5cbi8vIC0tIEludGVybmFsOiBleGVjdXRvciBtZXRob2QgYWxsb3dsaXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNjb3BlRmFjYWRlIG1ldGhvZHMgY2FsbGVkIGJ5IEZsb3dDaGFydEV4ZWN1dG9yIHdyYXBwaW5nIGNvZGUgYW5kIFN0YWdlUnVubmVyXG4vLyBUSFJPVUdIIGEgVHlwZWRTY29wZSBwcm94eS4gT25seSBhZGQgbWV0aG9kcyB3aXRoIGNvbmZpcm1lZCBjYWxsIHNpdGVzLlxuLy8gU2hhcmVkIGJldHdlZW4gY3JlYXRlVHlwZWRTY29wZS50cyBhbmQgU3RhZ2VSdW5uZXIudHMgdG8gcHJldmVudCBkcmlmdC5cblxuZXhwb3J0IGNvbnN0IEVYRUNVVE9SX0lOVEVSTkFMX01FVEhPRFMgPSBuZXcgU2V0KFtcbiAgJ25vdGlmeVN0YWdlU3RhcnQnLCAvLyBTdGFnZVJ1bm5lci5ydW4oKSBsaW5lIDU5XG4gICdub3RpZnlTdGFnZUVuZCcsIC8vIFN0YWdlUnVubmVyLnJ1bigpIGxpbmUgNzlcbiAgJ25vdGlmeVBhdXNlJywgLy8gU3RhZ2VSdW5uZXIucnVuKCkg4oCUIHBhdXNlIGRldGVjdGlvblxuICAnYXR0YWNoUmVjb3JkZXInLCAvLyBGbG93Q2hhcnRFeGVjdXRvci5jcmVhdGVUcmF2ZXJzZXIoKSDigJQgbmFycmF0aXZlICsgdXNlciByZWNvcmRlcnNcbiAgJ2RldGFjaFJlY29yZGVyJywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuZGV0YWNoUmVjb3JkZXIoKVxuICAnZ2V0UmVjb3JkZXJzJywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuZ2V0UmVjb3JkZXJzKClcbiAgJ3VzZVNoYXJlZFJlZGFjdGVkS2V5cycsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmNyZWF0ZVRyYXZlcnNlcigpIOKAlCByZWRhY3Rpb24gd3JhcHBpbmdcbiAgJ3VzZVJlZGFjdGlvblBvbGljeScsIC8vIEZsb3dDaGFydEV4ZWN1dG9yLmNyZWF0ZVRyYXZlcnNlcigpIOKAlCByZWRhY3Rpb24gd3JhcHBpbmdcbl0pO1xuIl19
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlYWN0aXZlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7R0FRRzs7O0FBMFBILCtFQUErRTtBQUMvRSx1RUFBdUU7QUFFMUQsUUFBQSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBUztJQUNoRCxXQUFXO0lBQ1gsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixTQUFTO0lBQ1QsUUFBUTtJQUNSLE1BQU07SUFDTixRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxzQkFBc0I7SUFDdEIsc0JBQXNCO0lBQ3RCLG9CQUFvQjtJQUNwQixhQUFhO0lBQ2IsUUFBUTtJQUNSLE9BQU87SUFDUCxxQkFBcUI7SUFDckIsa0JBQWtCO0lBQ2xCLFFBQVE7Q0FDVCxDQUFDLENBQUM7QUFFSCwrRUFBK0U7QUFDL0UsZ0VBQWdFO0FBQ2hFLHFFQUFxRTtBQUV4RCxRQUFBLFlBQVksR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUVsRSwrRUFBK0U7QUFDL0UsNkVBQTZFO0FBQzdFLCtDQUErQztBQUVsQyxRQUFBLGNBQWMsR0FBRyxNQUFNLENBQUMsaUNBQWlDLENBQUMsQ0FBQztBQUV4RSwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFFN0QsUUFBQSx5QkFBeUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUMvQyxrQkFBa0IsRUFBRSw0QkFBNEI7SUFDaEQsZ0JBQWdCLEVBQUUsNEJBQTRCO0lBQzlDLGFBQWEsRUFBRSxzQ0FBc0M7SUFDckQscUJBQXFCLEVBQUUsbUVBQW1FO0lBQzFGLHFCQUFxQixFQUFFLDBDQUEwQztJQUNqRSxtQkFBbUIsRUFBRSx3Q0FBd0M7SUFDN0QsdUJBQXVCLEVBQUUsMkRBQTJEO0lBQ3BGLG9CQUFvQixFQUFFLDJEQUEyRDtDQUNsRixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlYWN0aXZlL3R5cGVzIC0tIFR5cGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBUeXBlZFNjb3BlPFQ+IHJlYWN0aXZlIHByb3h5IHN5c3RlbS5cbiAqXG4gKiBUeXBlZFNjb3BlPFQ+IHdyYXBzIGEgUmVhY3RpdmVUYXJnZXQgKFNjb3BlRmFjYWRlKSBpbiBhIFByb3h5IHRoYXQgcHJvdmlkZXNcbiAqIHR5cGVkIHByb3BlcnR5IGFjY2Vzcy4gQWxsIHNjb3BlIGluZnJhc3RydWN0dXJlIG1ldGhvZHMgYXJlICQtcHJlZml4ZWQgdG9cbiAqIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCB1c2VyIHN0YXRlIGtleXMuXG4gKlxuICogRGVwZW5kZW5jeTogdHlwZS1vbmx5IGltcG9ydHMgZnJvbSBlbmdpbmUvIGFuZCBzY29wZS8gKHplcm8gcnVudGltZSBjb3N0KS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkVudiB9IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjb3BlUmVjb3JkZXIgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5cbi8vIC0tIFJlYWN0aXZlVGFyZ2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1pbmltdW0gcHJvdG9jb2wgcmVxdWlyZWQgYnkgVHlwZWRTY29wZSAtLSBhIGN1cmF0ZWQgc3Vic2V0IG9mIFNjb3BlRmFjYWRlJ3Ncbi8vIHB1YmxpYyBBUEkuIE5vdCBhIGZ1bGwgbWlycm9yOiBleGNsdWRlcyBpbnRlcm5hbC9yZWRhY3Rpb24gbWV0aG9kcyB0aGF0IGFyZVxuLy8gaGFuZGxlZCBhdCB0aGUgZXhlY3V0b3IgbGV2ZWwgKHVzZVJlZGFjdGlvblBvbGljeSwgdXNlU2hhcmVkUmVkYWN0ZWRLZXlzLCBldGMuKVxuLy8gYW5kIGluZnJhc3RydWN0dXJlIG1ldGhvZHMgKGdldFBpcGVsaW5lSWQsIHNldEdsb2JhbCwgZ2V0R2xvYmFsLCBldGMuKS5cblxuZXhwb3J0IGludGVyZmFjZSBSZWFjdGl2ZVRhcmdldCB7XG4gIC8vIFN0YXRlIGFjY2VzcyAodHJhY2tlZCBieSByZWNvcmRlcnMpXG4gIGdldFZhbHVlKGtleT86IHN0cmluZyk6IHVua25vd247XG4gIHNldFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICB1cGRhdGVWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcbiAgZGVsZXRlVmFsdWUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKTogdm9pZDtcblxuICAvLyBOb24tdHJhY2tpbmcgc3RhdGUgaW5zcGVjdGlvbiAoZm9yIHByb3h5IGludGVybmFscyDigJQgbm8gcmVjb3JkZXIgZGlzcGF0Y2gpXG4gIC8qKiBSZXR1cm5zIGFsbCBzdGF0ZSBrZXlzIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBvd25LZXlzL2hhcyB0cmFwcy4gKi9cbiAgZ2V0U3RhdGVLZXlzPygpOiBzdHJpbmdbXTtcbiAgLyoqIENoZWNrIGtleSBleGlzdGVuY2Ugd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGhhcyB0cmFwLiAqL1xuICBoYXNLZXk/KGtleTogc3RyaW5nKTogYm9vbGVhbjtcbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGFycmF5IHByb3h5IGdldEN1cnJlbnQoKS4gKi9cbiAgZ2V0VmFsdWVTaWxlbnQ/KGtleT86IHN0cmluZyk6IHVua25vd247XG5cbiAgLy8gSW5wdXQgJiBlbnZpcm9ubWVudCAocmVhZG9ubHksIE5PVCB0cmFja2VkKVxuICBnZXRBcmdzPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTogVDtcbiAgZ2V0RW52KCk6IFJlYWRvbmx5PEV4ZWN1dGlvbkVudj47XG5cbiAgLy8gU2NvcGVSZWNvcmRlciBtYW5hZ2VtZW50XG4gIGF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXI6IFNjb3BlUmVjb3JkZXIpOiB2b2lkO1xuICBkZXRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVySWQ6IHN0cmluZyk6IHZvaWQ7XG4gIGdldFNjb3BlUmVjb3JkZXJzKCk6IFNjb3BlUmVjb3JkZXJbXTtcblxuICAvLyBEaWFnbm9zdGljc1xuICBhZGREZWJ1Z0luZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgYWRkRGVidWdNZXNzYWdlKHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgYWRkRXJyb3JJbmZvKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gIGFkZE1ldHJpYyhuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgYWRkRXZhbChuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcblxuICAvLyBFbWl0IGNoYW5uZWwgKFBoYXNlIDMpIOKAlCBzdHJ1Y3R1cmVkIHVzZXItYXV0aG9yZWQgZXZlbnRzIHRvIEVtaXRSZWNvcmRlcnMuXG4gIGVtaXRFdmVudChuYW1lOiBzdHJpbmcsIHBheWxvYWQ/OiB1bmtub3duKTogdm9pZDtcblxuICAvLyBEZXRhY2ggKFQ0KSDigJQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydHMuIFNjb3BlRmFjYWRlXG4gIC8vIGRlbGVnYXRlcyB0byBgZGV0YWNoL3NwYXduYCwgbWludGluZyByZWZJZHMgZnJvbSB0aGlzIHN0YWdlJ3NcbiAgLy8gcnVudGltZVN0YWdlSWQgZm9yIGRpYWdub3N0aWMgY29ycmVsYXRpb24uXG4gIGRldGFjaEFuZEpvaW5MYXRlcihcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaEhhbmRsZTtcblxuICBkZXRhY2hBbmRGb3JnZXQoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogdm9pZDtcbn1cblxuLy8gLS0gU2NvcGVNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gJC1wcmVmaXhlZCBlc2NhcGUgaGF0Y2hlcy4gTm9uLWVudW1lcmFibGUgb24gdGhlIHByb3h5IC0tIGRvbid0IGFwcGVhciBpblxuLy8gT2JqZWN0LmtleXMoKSwgZGVzdHJ1Y3R1cmluZywgb3IgZm9yLi4uaW4uIE9ubHkgc3RhdGUga2V5cyBhcmUgdmlzaWJsZS5cblxuZXhwb3J0IGludGVyZmFjZSBTY29wZU1ldGhvZHMge1xuICAvLyBTdGF0ZSAodW50eXBlZCBlc2NhcGUgaGF0Y2ggLS0gZm9yIGR5bmFtaWMga2V5cywgcmVkYWN0aW9uLCBkZXNjcmlwdGlvbilcbiAgJGdldFZhbHVlKGtleTogc3RyaW5nKTogdW5rbm93bjtcbiAgJHNldFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0PzogYm9vbGVhbiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICAkdXBkYXRlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpOiB2b2lkO1xuICAkZGVsZXRlKGtleTogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZyk6IHZvaWQ7XG4gIC8qKiBQcm94eS1zeW50aGVzaXplZDogY2FsbHMgZ2V0VmFsdWUocm9vdEtleSkgdGhlbiBsb2Rhc2guZ2V0IGZvciBuZXN0ZWQgcGF0aC4gTm90IGEgZGlyZWN0IGRlbGVnYXRpb24uICovXG4gICRyZWFkKGRvdFBhdGg6IHN0cmluZyk6IHVua25vd247XG5cbiAgLy8gSW5wdXQgJiBlbnZpcm9ubWVudCAocmVhZG9ubHkpXG4gICRnZXRBcmdzPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTogVDtcbiAgJGdldEVudigpOiBSZWFkb25seTxFeGVjdXRpb25FbnY+O1xuXG4gIC8vIE9ic2VydmFiaWxpdHkg4oCUIGxlZ2FjeSBkaWFnbm9zdGljIHByaW1pdGl2ZXMuXG4gIC8vXG4gIC8vIEFzIG9mIFBoYXNlIDMgdGhlc2UgQUxTTyBkaXNwYXRjaCBvbiB0aGUgZW1pdCBjaGFubmVsIChpbiBhZGRpdGlvbiB0b1xuICAvLyB0aGVpciBleGlzdGluZyBgRGlhZ25vc3RpY0NvbGxlY3RvcmAgc2lkZS1iYWcgd3JpdGVzIGZvciBzbmFwc2hvdFxuICAvLyBpbmNsdXNpb24pLiBBbnkgYXR0YWNoZWQgYEVtaXRSZWNvcmRlcmAgd2lsbCBzZWUgdGhlc2UgZXZlbnRzIHdpdGhcbiAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgbmFtZXNwYWNlZCBuYW1lczpcbiAgLy9cbiAgLy8gICAkZGVidWcoa2V5LCB2YWx1ZSkgICAgLT4gZW1pdHMgYGxvZy5kZWJ1Zy4ke2tleX1gXG4gIC8vICAgJGVycm9yKGtleSwgdmFsdWUpICAgIC0+IGVtaXRzIGBsb2cuZXJyb3IuJHtrZXl9YFxuICAvLyAgICRtZXRyaWMobmFtZSwgdmFsdWUpICAtPiBlbWl0cyBgbWV0cmljLiR7bmFtZX1gXG4gIC8vICAgJGV2YWwgKG5hbWUsIHZhbHVlKSAgIC0+IGVtaXRzIGBldmFsLiR7bmFtZX1gXG4gIC8vICAgJGxvZyh2YWx1ZSkgICAgICAgICAgIC0+IGVtaXRzIGBsb2cuZGVidWcubWVzc2FnZXNgXG4gIC8vXG4gIC8vIFRoaXMgbWFrZXMgdGhlIGNhbGxzIG9ic2VydmFibGUgaW4gcmVhbCB0aW1lIOKAlCBubyBsb3NzIG9mIGJhY2t3YXJkXG4gIC8vIGNvbXBhdDsgdGhlIHNpZGUgYmFnIGNvbnRpbnVlcyB0byBwb3B1bGF0ZSBmb3IgY29uc3VtZXJzIHRoYXQgaW5zcGVjdFxuICAvLyB0aGUgc25hcHNob3QgZGlyZWN0bHkuXG4gICRkZWJ1ZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICAkbG9nKHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgJGVycm9yKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gICRtZXRyaWMobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gICRldmFsKG5hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuXG4gIC8vIFNjb3BlUmVjb3JkZXIgbWFuYWdlbWVudFxuICAkYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcjogU2NvcGVSZWNvcmRlcik6IHZvaWQ7XG4gICRkZXRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVySWQ6IHN0cmluZyk6IHZvaWQ7XG4gICRnZXRTY29wZVJlY29yZGVycygpOiBTY29wZVJlY29yZGVyW107XG5cbiAgLyoqXG4gICAqIEJhdGNoLW11dGF0ZSBhbiBhcnJheSBrZXkgaW4gYSBzaW5nbGUgY2xvbmUrd3JpdGUgY3ljbGUuXG4gICAqXG4gICAqIEV2ZXJ5IGBzY29wZS5pdGVtcy5wdXNoKHgpYCBjbG9uZXMgdGhlIGVudGlyZSBhcnJheSBhbmQgY29tbWl0cyBpdCDigJQgTyhOKSBwZXIgY2FsbC5cbiAgICogRm9yIE4gbXV0YXRpb25zIG9uIGFuIE0tbGVuZ3RoIGFycmF5IHRoYXQgaXMgTyhOw5dNKS4gVXNlIGAkYmF0Y2hBcnJheWAgdG8gY2xvbmUgb25jZSxcbiAgICogYXBwbHkgYWxsIG11dGF0aW9ucyBpbnNpZGUgYGZuYCwgdGhlbiBjb21taXQgb25jZSDigJQgTyhNKSB0b3RhbC5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBCZWZvcmU6IDEwMDAgY2xvbmVzIMOXIGdyb3dpbmcgYXJyYXkgPSBPKE7CsilcbiAgICogZm9yIChsZXQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHNjb3BlLml0ZW1zLnB1c2goaSk7XG4gICAqXG4gICAqIC8vIEFmdGVyOiAxIGNsb25lICsgMSBjb21taXQgPSBPKE4pXG4gICAqIHNjb3BlLiRiYXRjaEFycmF5KCdpdGVtcycsIChhcnIpID0+IHtcbiAgICogICBmb3IgKGxldCBpID0gMDsgaSA8IDEwMDA7IGkrKykgYXJyLnB1c2goaSk7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogYGZuYCByZWNlaXZlcyBhIHBsYWluIChub24tcHJveHkpIG11dGFibGUgKipzaGFsbG93IGNvcHkqKiBvZiB0aGUgY3VycmVudCBhcnJheS5cbiAgICogVGhlIGFycmF5IGl0c2VsZiBpcyBhIG5ldyBpbnN0YW5jZSwgYnV0IG9iamVjdCByZWZlcmVuY2VzIGluc2lkZSBpdCBhcmUgc2hhcmVkIHdpdGhcbiAgICogdGhlIG9yaWdpbmFsIHN0YXRlIOKAlCBtdXRhdGlvbnMgdG8gbmVzdGVkIG9iamVjdHMgaW5zaWRlIGBmbmAgYWZmZWN0IHRob3NlIG9yaWdpbmFscy5cbiAgICogT25seSBwdXNoL3BvcC9zb3J0L3NwbGljZSBhbmQgb3RoZXIgb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgYXJyYXkncyBvd24gc2xvdHMgYXJlXG4gICAqIHNhZmVseSBpc29sYXRlZC5cbiAgICpcbiAgICogTXV0YXRpb25zIGluc2lkZSBgZm5gIGFyZSBOT1QgdHJhY2tlZCBpbmRpdmlkdWFsbHkg4oCUIG9ubHkgdGhlIGZpbmFsIGNvbW1pdHRlZCBhcnJheVxuICAgKiBhcHBlYXJzIGluIHRoZSBuYXJyYXRpdmUgYXMgYSBzaW5nbGUgd3JpdGUuIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGFuXG4gICAqIGFycmF5LCBgZm5gIHJlY2VpdmVzIGFuIGVtcHR5IGFycmF5IGFuZCB0aGUgcmVzdWx0IGlzIGNvbW1pdHRlZCBhcyB0aGUgbmV3IHZhbHVlLlxuICAgKlxuICAgKiBJZiBgZm5gIHRocm93cywgYHNldFZhbHVlYCBpcyBuZXZlciBjYWxsZWQgYW5kIHN0YXRlIHJlbWFpbnMgdW5jaGFuZ2VkIChhdG9taWMgb25cbiAgICogZXJyb3IpLiBUaGUgZXhjZXB0aW9uIHByb3BhZ2F0ZXMgdG8gdGhlIGNhbGxlci5cbiAgICpcbiAgICogYGtleWAgaXMgdW50eXBlZCAoYHN0cmluZ2ApIOKAlCBUeXBlU2NyaXB0IHdpbGwgbm90IGNhdGNoIHR5cG9zLiBgYXJyYCBpcyB0eXBlZCBhc1xuICAgKiBgdW5rbm93bltdYCBiZWNhdXNlIGBTY29wZU1ldGhvZHNgIGlzIG5vdCBwYXJhbWV0ZXJpemVkIGJ5IGBUYDsgY2FzdCBpbnNpZGUgYGZuYFxuICAgKiB3aGVuIGVsZW1lbnQgdHlwZXMgYXJlIGtub3duOiBgKGFyciBhcyBzdHJpbmdbXSkucHVzaCh4KWAuXG4gICAqL1xuICAkYmF0Y2hBcnJheShrZXk6IHN0cmluZywgZm46IChhcnI6IHVua25vd25bXSkgPT4gdm9pZCk6IHZvaWQ7XG5cbiAgLy8gT2JzZXJ2YWJpbGl0eSDigJQgRW1pdCBjaGFubmVsIChQaGFzZSAzKVxuICAvKipcbiAgICogRmlyZSBhIHN0cnVjdHVyZWQgZXZlbnQgdG8gZXZlcnkgYXR0YWNoZWQgcmVjb3JkZXIgaW1wbGVtZW50aW5nXG4gICAqIGBvbkVtaXRgLiBUaGUgcHJpbWFyeSBwcmltaXRpdmUgZm9yIGNvbnN1bWVyLWF1dGhvcmVkIG9ic2VydmFiaWxpdHlcbiAgICogZXZlbnRzIChMTE0gdG9rZW5zLCBiaWxsaW5nIG1ldHJpY3MsIGRvbWFpbiBtaWxlc3RvbmVzLCBldGMuKSB0aGF0XG4gICAqIHNob3VsZG4ndCBsaXZlIGluIHNjb3BlIHN0YXRlLlxuICAgKlxuICAgKiBTeW5jaHJvbm91cywgcGFzcy10aHJvdWdoIOKAlCBkZWxpdmVyZWQgdG8gcmVjb3JkZXJzIGltbWVkaWF0ZWx5LCBpblxuICAgKiBjYWxsIG9yZGVyLiBaZXJvLWFsbG9jYXRpb24gd2hlbiBubyByZWNvcmRlcnMgYXJlIGF0dGFjaGVkLlxuICAgKlxuICAgKiAjIyBOYW1pbmcgY29udmVudGlvblxuICAgKlxuICAgKiBVc2UgaGllcmFyY2hpY2FsIGRvdHRlZCBuYW1lczogYCc8bmFtZXNwYWNlPi48Y2F0ZWdvcnk+LjxldmVudD4nYC5cbiAgICogRXhhbXBsZXM6XG4gICAqICAgLSBgJ2FnZW50Zm9vdHByaW50LmxsbS50b2tlbnMnYFxuICAgKiAgIC0gYCdteWFwcC5iaWxsaW5nLnNwZW5kJ2BcbiAgICogICAtIGAnYXV0aC5jaGVjay5kZW5pZWQnYFxuICAgKlxuICAgKiBUaGUgbGlicmFyeSBzdGF5cyB2b2NhYnVsYXJ5LWFnbm9zdGljIOKAlCBubyBjZW50cmFsIHJlZ2lzdHJ5LCBub1xuICAgKiByZXNlcnZlZCBwcmVmaXhlcy4gTmFtZXNwYWNlIHByZWZpeGVzIHByZXZlbnQgY29sbGlzaW9ucyBhY3Jvc3NcbiAgICogbGlicmFyaWVzIGFuZCBhcHBzIG5hdHVyYWxseS5cbiAgICpcbiAgICogIyMgUmVkYWN0aW9uXG4gICAqXG4gICAqIElmIGBSZWRhY3Rpb25Qb2xpY3kuZW1pdFBhdHRlcm5zYCBtYXRjaGVzIHRoZSBuYW1lLCB0aGUgcGF5bG9hZCBpc1xuICAgKiByZXBsYWNlZCB3aXRoIGAnW1JFREFDVEVEXSdgIGJlZm9yZSBkaXNwYXRjaC4gTm8gcmVjb3JkZXIgZXZlciBzZWVzXG4gICAqIHRoZSByYXcgdmFsdWUgZm9yIHJlZGFjdGVkIGV2ZW50IG5hbWVzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIENvbnN1bWVyLWNob3NlbiBldmVudCBpZGVudGlmaWVyIChzZWUgbmFtaW5nIGNvbnZlbnRpb24pLlxuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFN0cnVjdHVyZWQgZGF0YSB0byBhdHRhY2guIFNoYXBlIGlzIHVwIHRvIHRoZVxuICAgKiAgIGNvbnN1bWVyOyBsaWJyYXJ5IHRyZWF0cyBpdCBhcyBvcGFxdWUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogc2NvcGUuJGVtaXQoJ2FnZW50Zm9vdHByaW50LmxsbS50b2tlbnMnLCB7IGlucHV0OiAxMDAsIG91dHB1dDogNTAgfSk7XG4gICAqIHNjb3BlLiRlbWl0KCdteWFwcC5kZWNpc2lvbicsIHsgYnJhbmNoOiAnYXBwcm92ZWQnLCBjb25maWRlbmNlOiAwLjkyIH0pO1xuICAgKiBgYGBcbiAgICovXG4gICRlbWl0KG5hbWU6IHN0cmluZywgcGF5bG9hZD86IHVua25vd24pOiB2b2lkO1xuXG4gIC8vIERldGFjaCDigJQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydCBleGVjdXRpb24uXG4gIC8vXG4gIC8vIGAkZGV0YWNoQW5kSm9pbkxhdGVyKGRyaXZlciwgY2hpbGQsIGlucHV0PylgIHNjaGVkdWxlcyB0aGUgY2hpbGQgdmlhXG4gIC8vIHRoZSBnaXZlbiBkcml2ZXIgYW5kIHJldHVybnMgYSBgRGV0YWNoSGFuZGxlYCB0aGUgY29uc3VtZXIgY2FuIHJlYWRcbiAgLy8gc3luY2hyb25vdXNseSAoYC5zdGF0dXNgKSBvciBhd2FpdCAoYC53YWl0KClgKS4gVGhlIHBhcmVudCBzdGFnZVxuICAvLyBkb2VzIE5PVCBibG9jayBvbiB0aGUgY2hpbGQg4oCUIGl0IHJldHVybnMgdG8gdGhlIGFnZW50IGxvb3AgdGhlXG4gIC8vIG1vbWVudCB0aGUgZHJpdmVyJ3MgYHNjaGVkdWxlKClgIHJldHVybnMgKHBhc3NpdmUgcmVjb3JkZXIgcnVsZSkuXG4gIC8vXG4gIC8vIGAkZGV0YWNoQW5kRm9yZ2V0KGRyaXZlciwgY2hpbGQsIGlucHV0PylgIGRpc2NhcmRzIHRoZSBoYW5kbGUg4oCUXG4gIC8vIHVzZWZ1bCBmb3IgZmlyZS1hbmQtZm9yZ2V0IHRlbGVtZXRyeSB3aGVyZSB0aGUgY2FsbGVyIG5ldmVyIG5lZWRzXG4gIC8vIHRvIGtub3cgaG93IHRoZSBjaGlsZCBmaW5pc2hlZC4gRXJyb3JzIHN0aWxsIGxhbmQgb24gdGhlIChub3ctXG4gIC8vIGRyb3BwZWQpIGhhbmRsZSBhbmQgZ28gc2lsZW50IHVubGVzcyBhbiBvYnNlcnZlciBzdXJmYWNlcyB0aGVtLlxuICAvL1xuICAvLyBEcml2ZXIgaXMgUkVRVUlSRUQg4oCUIHRoZXJlJ3Mgbm8gbGlicmFyeS1kZWZhdWx0LiBQYXNzIGUuZy5cbiAgLy8gYG1pY3JvdGFza0JhdGNoRHJpdmVyYCAoZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJykgb3IgeW91ciBvd25cbiAgLy8gY3VzdG9tIGRyaXZlci4gRXhwbGljaXQgcGFzc2luZyBhdm9pZHMgZ2xvYmFsIHN0YXRlIGFuZCBrZWVwcyB0aGVcbiAgLy8gZW5naW5lIGZyZWUgb2YgZHJpdmVyIGltcG9ydHMuXG4gICRkZXRhY2hBbmRKb2luTGF0ZXIoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hIYW5kbGU7XG5cbiAgJGRldGFjaEFuZEZvcmdldChcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiB2b2lkO1xuXG4gIC8vIFBpcGVsaW5lIGNvbnRyb2xcbiAgLyoqXG4gICAqIFN0b3AgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGNvbnRleHQuXG4gICAqXG4gICAqIC0gKipJbiBhIHRvcC1sZXZlbCBjaGFydDoqKiB0aGUgdHJhdmVyc2VyIGV4aXRzIGNsZWFubHkgYWZ0ZXIgdGhpcyBzdGFnZVxuICAgKiAgIGNvbXBsZXRlcy5cbiAgICogLSAqKkluc2lkZSBhIHN1YmZsb3c6KiogYnkgZGVmYXVsdCwgb25seSB0aGUgc3ViZmxvdydzIG93biBleGVjdXRpb25cbiAgICogICBzdG9wczsgY29udHJvbCByZXR1cm5zIHRvIHRoZSBwYXJlbnQgYXMgbm9ybWFsLiBJZiB0aGUgc3ViZmxvdyBpc1xuICAgKiAgIG1vdW50ZWQgd2l0aCBgcHJvcGFnYXRlQnJlYWs6IHRydWVgLCB0aGUgYnJlYWsgc2lnbmFsIChhbmQgaXRzXG4gICAqICAgb3B0aW9uYWwgcmVhc29uKSBwcm9wYWdhdGVzIHVwIHRvIHRoZSBwYXJlbnQgc2NvcGUsIHRlcm1pbmF0aW5nIHRoZVxuICAgKiAgIG91dGVyIGxvb3AgdG9vLiBTZWUgYFN1YmZsb3dNb3VudE9wdGlvbnMucHJvcGFnYXRlQnJlYWtgLlxuICAgKlxuICAgKiBAcGFyYW0gcmVhc29uIC0gT3B0aW9uYWwgZnJlZS1mb3JtIHN0cmluZyBkZXNjcmliaW5nIHdoeSB0aGUgYnJlYWtcbiAgICogICBoYXBwZW5lZC4gUHJvcGFnYXRlcyB0byBgRmxvd0JyZWFrRXZlbnQucmVhc29uYCBzbyByZWNvcmRlcnMgYW5kXG4gICAqICAgY3VzdG9tIG5hcnJhdGl2ZXMgY2FuIHN1cmZhY2UgaXQuIERlZmF1bHRzIHRvIHVuZGVmaW5lZC5cbiAgICovXG4gICRicmVhayhyZWFzb24/OiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8vIEVzY2FwZSBoYXRjaCAtLSB1bndyYXAgdG8gdW5kZXJseWluZyBSZWFjdGl2ZVRhcmdldFxuICAkdG9SYXcoKTogUmVhY3RpdmVUYXJnZXQ7XG59XG5cbi8vIC0tIFR5cGVkU2NvcGU8VD4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRoZSBjb25zdW1lci1mYWNpbmcgdHlwZS4gVCBpcyB0aGUgdXNlcidzIHN0YXRlIGludGVyZmFjZS5cbi8vIFByb3BlcnR5IGFjY2VzcyBpcyB0eXBlZDsgJC1tZXRob2RzIHByb3ZpZGUgZXNjYXBlIGhhdGNoZXMuXG5cbmV4cG9ydCB0eXBlIFR5cGVkU2NvcGU8VCBleHRlbmRzIG9iamVjdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IFQgJiBTY29wZU1ldGhvZHM7XG5cbi8vIC0tIFJlYWN0aXZlT3B0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIGNyZWF0ZVR5cGVkU2NvcGUuXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3RpdmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFBpcGVsaW5lIGJyZWFrIGZ1bmN0aW9uIOKAlCBpbmplY3RlZCBieSBTdGFnZVJ1bm5lciBhZnRlciBzY29wZSBjcmVhdGlvbi5cbiAgICogQWNjZXB0cyBhbiBvcHRpb25hbCByZWFzb24gc3RyaW5nIHRoYXQgcHJvcGFnYXRlcyB0byBgRmxvd0JyZWFrRXZlbnRgXG4gICAqIGFuZCAod2hlbiBgcHJvcGFnYXRlQnJlYWtgIGlzIHNldCBvbiBhIG1vdW50KSB1cCB0byB0aGUgcGFyZW50IHNjb3BlLlxuICAgKi9cbiAgYnJlYWtQaXBlbGluZT86IChyZWFzb24/OiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbi8vIC0tIEludGVybmFsOiAkLW1ldGhvZCBuYW1lIHNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFVzZWQgYnkgdGhlIFByb3h5IGdldCB0cmFwIHRvIGRpc3Rpbmd1aXNoICQtbWV0aG9kcyBmcm9tIHN0YXRlIGtleXMuXG5cbmV4cG9ydCBjb25zdCBTQ09QRV9NRVRIT0RfTkFNRVMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnJGdldFZhbHVlJyxcbiAgJyRzZXRWYWx1ZScsXG4gICckdXBkYXRlJyxcbiAgJyRkZWxldGUnLFxuICAnJHJlYWQnLFxuICAnJGdldEFyZ3MnLFxuICAnJGdldEVudicsXG4gICckZGVidWcnLFxuICAnJGxvZycsXG4gICckZXJyb3InLFxuICAnJG1ldHJpYycsXG4gICckZXZhbCcsXG4gICckYXR0YWNoU2NvcGVSZWNvcmRlcicsXG4gICckZGV0YWNoU2NvcGVSZWNvcmRlcicsXG4gICckZ2V0U2NvcGVSZWNvcmRlcnMnLFxuICAnJGJhdGNoQXJyYXknLFxuICAnJGJyZWFrJyxcbiAgJyRlbWl0JyxcbiAgJyRkZXRhY2hBbmRKb2luTGF0ZXInLFxuICAnJGRldGFjaEFuZEZvcmdldCcsXG4gICckdG9SYXcnLFxuXSk7XG5cbi8vIC0tIEludGVybmFsOiBTeW1ib2wgZm9yIGRlZmVycmVkIGJyZWFrIGluamVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFN0YWdlUnVubmVyIHNldHMgdGhpcyBhZnRlciBzY29wZSBjcmVhdGlvbiBzbyAkYnJlYWsoKSB3b3Jrcy5cbi8vIFByaXZhdGUgU3ltYm9sIChub3QgU3ltYm9sLmZvcikgdG8gcHJldmVudCBjcm9zcy1tb2R1bGUgdGFtcGVyaW5nLlxuXG5leHBvcnQgY29uc3QgQlJFQUtfU0VUVEVSID0gU3ltYm9sKCdmb290cHJpbnQ6cmVhY3RpdmU6c2V0QnJlYWsnKTtcblxuLy8gLS0gSW50ZXJuYWw6IFN5bWJvbCBmb3IgVHlwZWRTY29wZSBkZXRlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVXNlZCBieSBTdGFnZVJ1bm5lciB0byBza2lwIGNyZWF0ZVByb3RlY3RlZFNjb3BlIGZvciBUeXBlZFNjb3BlIGluc3RhbmNlcy5cbi8vIFByaXZhdGUgU3ltYm9sIHByZXZlbnRzIHN0cmluZy10YWcgc3Bvb2ZpbmcuXG5cbmV4cG9ydCBjb25zdCBJU19UWVBFRF9TQ09QRSA9IFN5bWJvbCgnZm9vdHByaW50OnJlYWN0aXZlOmlzVHlwZWRTY29wZScpO1xuXG4vLyAtLSBJbnRlcm5hbDogZXhlY3V0b3IgbWV0aG9kIGFsbG93bGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTY29wZUZhY2FkZSBtZXRob2RzIGNhbGxlZCBieSBGbG93Q2hhcnRFeGVjdXRvciB3cmFwcGluZyBjb2RlIGFuZCBTdGFnZVJ1bm5lclxuLy8gVEhST1VHSCBhIFR5cGVkU2NvcGUgcHJveHkuIE9ubHkgYWRkIG1ldGhvZHMgd2l0aCBjb25maXJtZWQgY2FsbCBzaXRlcy5cbi8vIFNoYXJlZCBiZXR3ZWVuIGNyZWF0ZVR5cGVkU2NvcGUudHMgYW5kIFN0YWdlUnVubmVyLnRzIHRvIHByZXZlbnQgZHJpZnQuXG5cbmV4cG9ydCBjb25zdCBFWEVDVVRPUl9JTlRFUk5BTF9NRVRIT0RTID0gbmV3IFNldChbXG4gICdub3RpZnlTdGFnZVN0YXJ0JywgLy8gU3RhZ2VSdW5uZXIucnVuKCkgbGluZSA1OVxuICAnbm90aWZ5U3RhZ2VFbmQnLCAvLyBTdGFnZVJ1bm5lci5ydW4oKSBsaW5lIDc5XG4gICdub3RpZnlQYXVzZScsIC8vIFN0YWdlUnVubmVyLnJ1bigpIOKAlCBwYXVzZSBkZXRlY3Rpb25cbiAgJ2F0dGFjaFNjb3BlUmVjb3JkZXInLCAvLyBGbG93Q2hhcnRFeGVjdXRvci5jcmVhdGVUcmF2ZXJzZXIoKSDigJQgbmFycmF0aXZlICsgdXNlciByZWNvcmRlcnNcbiAgJ2RldGFjaFNjb3BlUmVjb3JkZXInLCAvLyBGbG93Q2hhcnRFeGVjdXRvci5kZXRhY2hTY29wZVJlY29yZGVyKClcbiAgJ2dldFNjb3BlUmVjb3JkZXJzJywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuZ2V0U2NvcGVSZWNvcmRlcnMoKVxuICAndXNlU2hhcmVkUmVkYWN0ZWRLZXlzJywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuY3JlYXRlVHJhdmVyc2VyKCkg4oCUIHJlZGFjdGlvbiB3cmFwcGluZ1xuICAndXNlUmVkYWN0aW9uUG9saWN5JywgLy8gRmxvd0NoYXJ0RXhlY3V0b3IuY3JlYXRlVHJhdmVyc2VyKCkg4oCUIHJlZGFjdGlvbiB3cmFwcGluZ1xuXSk7XG4iXX0=
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* BoundaryStateStore<TState> — concrete, composable per-boundary
|
|
4
|
+
* transient state storage.
|
|
5
|
+
*
|
|
6
|
+
* Pattern: COMPOSITION primitive. Concrete class — instantiate with
|
|
7
|
+
* `new BoundaryStateStore<TState>()` and own it as a field
|
|
8
|
+
* on your recorder. Replaces the abstract
|
|
9
|
+
* `BoundaryStateTracker<TState>` base class for the v5
|
|
10
|
+
* "one purpose per recorder" rule.
|
|
11
|
+
* Role: "What's the LIVE transient state of every currently-active
|
|
12
|
+
* boundary?" A boundary is a matched event pair `[start, stop]`
|
|
13
|
+
* bracketing an interval (e.g., `(llm_start, llm_end)`).
|
|
14
|
+
* Between the brackets, intermediate events evolve the
|
|
15
|
+
* boundary's state. On `stop`, the state clears.
|
|
16
|
+
*
|
|
17
|
+
* Algorithmically this is the **DFS bracket-sequence pattern** — the
|
|
18
|
+
* `active` map is the open-brackets stack at any moment.
|
|
19
|
+
*
|
|
20
|
+
* **Lifecycle contract — STRICT:** every `start(key, ...)` call MUST
|
|
21
|
+
* be paired with a `stop(key)` call. Failure to wire stop produces a
|
|
22
|
+
* memory leak: the active map grows without bound.
|
|
23
|
+
*
|
|
24
|
+
* **Concurrency / nesting:** concurrent boundaries (parallel branches
|
|
25
|
+
* with two LLM calls active at once) work correctly — each is keyed
|
|
26
|
+
* independently. Nested boundaries of DIFFERENT KINDS require
|
|
27
|
+
* SEPARATE store instances — one per kind.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* import { BoundaryStateStore } from 'footprintjs/trace';
|
|
32
|
+
* import type { CombinedRecorder, EmitEvent } from 'footprintjs';
|
|
33
|
+
*
|
|
34
|
+
* interface LLMLiveState { partial: string; tokens: number; }
|
|
35
|
+
*
|
|
36
|
+
* class LiveLLMTracker implements CombinedRecorder {
|
|
37
|
+
* readonly id = 'live-llm';
|
|
38
|
+
* private readonly store = new BoundaryStateStore<LLMLiveState>();
|
|
39
|
+
*
|
|
40
|
+
* onEmit(event: EmitEvent): void {
|
|
41
|
+
* if (event.name === 'agentfootprint.stream.llm_start') {
|
|
42
|
+
* this.store.start(event.runtimeStageId, { partial: '', tokens: 0 });
|
|
43
|
+
* } else if (event.name === 'agentfootprint.stream.llm_end') {
|
|
44
|
+
* this.store.stop(event.runtimeStageId);
|
|
45
|
+
* } else if (event.name === 'agentfootprint.stream.token') {
|
|
46
|
+
* this.store.update(event.runtimeStageId, (s) => ({
|
|
47
|
+
* partial: s.partial + (event.payload as { content: string }).content,
|
|
48
|
+
* tokens: s.tokens + 1,
|
|
49
|
+
* }));
|
|
50
|
+
* }
|
|
51
|
+
* }
|
|
52
|
+
*
|
|
53
|
+
* isInFlight(): boolean { return this.store.hasActive; }
|
|
54
|
+
* getPartial(rid: string): string {
|
|
55
|
+
* return this.store.get(rid)?.partial ?? '';
|
|
56
|
+
* }
|
|
57
|
+
*
|
|
58
|
+
* clear() { this.store.clear(); }
|
|
59
|
+
* }
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
63
|
+
exports.BoundaryStateStore = void 0;
|
|
64
|
+
const detectCircular_js_1 = require("../scope/detectCircular.js");
|
|
65
|
+
class BoundaryStateStore {
|
|
66
|
+
/** Open-brackets stack: key → current transient state. */
|
|
67
|
+
active = new Map();
|
|
68
|
+
/** Per-key count of `update` calls that landed without a matching
|
|
69
|
+
* active boundary. Drives rate-limited dev-mode warnings so a
|
|
70
|
+
* stuck loop doesn't spam the console. */
|
|
71
|
+
missedUpdates = new Map();
|
|
72
|
+
/** Optional id for diagnostics — passed to dev-mode warnings so the
|
|
73
|
+
* source of the leak is easy to find when multiple stores coexist. */
|
|
74
|
+
diagnosticId;
|
|
75
|
+
constructor(diagnosticId = 'boundary-state-store') {
|
|
76
|
+
this.diagnosticId = diagnosticId;
|
|
77
|
+
}
|
|
78
|
+
// ── Mutators ─────────────────────────────────────────────────────────
|
|
79
|
+
/**
|
|
80
|
+
* Open a new boundary with initial transient state. If a boundary
|
|
81
|
+
* with the same `key` is already active, the prior state is
|
|
82
|
+
* overwritten (last-writer-wins). Dev mode warns — usually
|
|
83
|
+
* indicates a missed `stop` upstream.
|
|
84
|
+
*/
|
|
85
|
+
start(key, initial) {
|
|
86
|
+
if (this.active.has(key) && (0, detectCircular_js_1.isDevMode)()) {
|
|
87
|
+
console.warn(`[${this.diagnosticId}] start('${key}') called while an active boundary ` +
|
|
88
|
+
'already exists. Overwriting prior state — likely a missed stop upstream.');
|
|
89
|
+
}
|
|
90
|
+
this.active.set(key, initial);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Evolve the transient state of an active boundary using a pure
|
|
94
|
+
* updater function. Silent no-op if no boundary is active for `key`
|
|
95
|
+
* (defensive against out-of-order events). Dev mode logs a rate-
|
|
96
|
+
* limited warning.
|
|
97
|
+
*/
|
|
98
|
+
update(key, updater) {
|
|
99
|
+
const cur = this.active.get(key);
|
|
100
|
+
if (cur === undefined) {
|
|
101
|
+
if ((0, detectCircular_js_1.isDevMode)()) {
|
|
102
|
+
const n = (this.missedUpdates.get(key) ?? 0) + 1;
|
|
103
|
+
this.missedUpdates.set(key, n);
|
|
104
|
+
if (n === 1) {
|
|
105
|
+
console.warn(`[${this.diagnosticId}] update('${key}') — no active boundary. Update dropped.`);
|
|
106
|
+
}
|
|
107
|
+
else if (n === 10 || n === 100) {
|
|
108
|
+
console.warn(`[${this.diagnosticId}] update('${key}') — ${n} dropped updates. Wiring bug?`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
this.active.set(key, updater(cur));
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Close the boundary identified by `key` and return its FINAL
|
|
117
|
+
* transient state (so the consumer can do any cleanup — e.g., emit
|
|
118
|
+
* a snapshot to a SequenceStore for durable storage).
|
|
119
|
+
*/
|
|
120
|
+
stop(key) {
|
|
121
|
+
const final = this.active.get(key);
|
|
122
|
+
this.active.delete(key);
|
|
123
|
+
return final;
|
|
124
|
+
}
|
|
125
|
+
// ── Read (O(1)) ──────────────────────────────────────────────────────
|
|
126
|
+
/** Current transient state of ONE active boundary. `undefined` if no
|
|
127
|
+
* boundary is active for `key`. */
|
|
128
|
+
get(key) {
|
|
129
|
+
return this.active.get(key);
|
|
130
|
+
}
|
|
131
|
+
/** All currently-active boundaries.
|
|
132
|
+
*
|
|
133
|
+
* **Type-only readonly:** TypeScript prevents mutation through
|
|
134
|
+
* `ReadonlyMap`, but a runtime cast or non-TS consumer can mutate
|
|
135
|
+
* the underlying Map and corrupt state. Don't. */
|
|
136
|
+
getAll() {
|
|
137
|
+
return this.active;
|
|
138
|
+
}
|
|
139
|
+
/** True if any boundary is currently active. O(1). */
|
|
140
|
+
get hasActive() {
|
|
141
|
+
return this.active.size > 0;
|
|
142
|
+
}
|
|
143
|
+
/** Number of currently-active boundaries. O(1). */
|
|
144
|
+
get activeCount() {
|
|
145
|
+
return this.active.size;
|
|
146
|
+
}
|
|
147
|
+
// ── Lifecycle ────────────────────────────────────────────────────────
|
|
148
|
+
/**
|
|
149
|
+
* Reset all transient state. Called by recorder composers from
|
|
150
|
+
* their own `clear()` method, which the executor invokes before
|
|
151
|
+
* each run.
|
|
152
|
+
*
|
|
153
|
+
* Dev mode warns if any boundaries are still active when called —
|
|
154
|
+
* likely indicates a missed `stop` upstream. Leaked keys are listed
|
|
155
|
+
* (truncated to 10) so the wiring bug is findable.
|
|
156
|
+
*/
|
|
157
|
+
clear() {
|
|
158
|
+
if (this.active.size > 0 && (0, detectCircular_js_1.isDevMode)()) {
|
|
159
|
+
const keys = [...this.active.keys()];
|
|
160
|
+
const head = keys.slice(0, 10).join(', ');
|
|
161
|
+
const more = keys.length > 10 ? ` ...(+${keys.length - 10} more)` : '';
|
|
162
|
+
console.warn(`[${this.diagnosticId}] clear() called with ${this.active.size} ` +
|
|
163
|
+
'still-active boundaries. Missed stop? ' +
|
|
164
|
+
`Leaked keys: ${head}${more}`);
|
|
165
|
+
}
|
|
166
|
+
this.active.clear();
|
|
167
|
+
this.missedUpdates.clear();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.BoundaryStateStore = BoundaryStateStore;
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm91bmRhcnlTdGF0ZVN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9Cb3VuZGFyeVN0YXRlU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJERzs7O0FBRUgsa0VBQXVEO0FBRXZELE1BQWEsa0JBQWtCO0lBQzdCLDBEQUEwRDtJQUN6QyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFcEQ7OytDQUUyQztJQUMxQixhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFM0Q7MkVBQ3VFO0lBQ3RELFlBQVksQ0FBUztJQUV0QyxZQUFZLFlBQVksR0FBRyxzQkFBc0I7UUFDL0MsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7SUFDbkMsQ0FBQztJQUVELHdFQUF3RTtJQUV4RTs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxHQUFXLEVBQUUsT0FBZTtRQUNoQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUEsNkJBQVMsR0FBRSxFQUFFLENBQUM7WUFDeEMsT0FBTyxDQUFDLElBQUksQ0FDVixJQUFJLElBQUksQ0FBQyxZQUFZLFlBQVksR0FBRyxxQ0FBcUM7Z0JBQ3ZFLDBFQUEwRSxDQUM3RSxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsR0FBVyxFQUFFLE9BQWlDO1FBQ25ELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksR0FBRyxLQUFLLFNBQVMsRUFB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Ii8qKlxuICogQm91bmRhcnlTdGF0ZVN0b3JlPFRTdGF0ZT4g4oCUIGNvbmNyZXRlLCBjb21wb3NhYmxlIHBlci1ib3VuZGFyeVxuICogdHJhbnNpZW50IHN0YXRlIHN0b3JhZ2UuXG4gKlxuICogUGF0dGVybjogQ09NUE9TSVRJT04gcHJpbWl0aXZlLiBDb25jcmV0ZSBjbGFzcyDigJQgaW5zdGFudGlhdGUgd2l0aFxuICogICAgICAgICAgYG5ldyBCb3VuZGFyeVN0YXRlU3RvcmU8VFN0YXRlPigpYCBhbmQgb3duIGl0IGFzIGEgZmllbGRcbiAqICAgICAgICAgIG9uIHlvdXIgcmVjb3JkZXIuIFJlcGxhY2VzIHRoZSBhYnN0cmFjdFxuICogICAgICAgICAgYEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT5gIGJhc2UgY2xhc3MgZm9yIHRoZSB2NVxuICogICAgICAgICAgXCJvbmUgcHVycG9zZSBwZXIgcmVjb3JkZXJcIiBydWxlLlxuICogUm9sZTogICAgXCJXaGF0J3MgdGhlIExJVkUgdHJhbnNpZW50IHN0YXRlIG9mIGV2ZXJ5IGN1cnJlbnRseS1hY3RpdmVcbiAqICAgICAgICAgIGJvdW5kYXJ5P1wiIEEgYm91bmRhcnkgaXMgYSBtYXRjaGVkIGV2ZW50IHBhaXIgYFtzdGFydCwgc3RvcF1gXG4gKiAgICAgICAgICBicmFja2V0aW5nIGFuIGludGVydmFsIChlLmcuLCBgKGxsbV9zdGFydCwgbGxtX2VuZClgKS5cbiAqICAgICAgICAgIEJldHdlZW4gdGhlIGJyYWNrZXRzLCBpbnRlcm1lZGlhdGUgZXZlbnRzIGV2b2x2ZSB0aGVcbiAqICAgICAgICAgIGJvdW5kYXJ5J3Mgc3RhdGUuIE9uIGBzdG9wYCwgdGhlIHN0YXRlIGNsZWFycy5cbiAqXG4gKiBBbGdvcml0aG1pY2FsbHkgdGhpcyBpcyB0aGUgKipERlMgYnJhY2tldC1zZXF1ZW5jZSBwYXR0ZXJuKiog4oCUIHRoZVxuICogYGFjdGl2ZWAgbWFwIGlzIHRoZSBvcGVuLWJyYWNrZXRzIHN0YWNrIGF0IGFueSBtb21lbnQuXG4gKlxuICogKipMaWZlY3ljbGUgY29udHJhY3Qg4oCUIFNUUklDVDoqKiBldmVyeSBgc3RhcnQoa2V5LCAuLi4pYCBjYWxsIE1VU1RcbiAqIGJlIHBhaXJlZCB3aXRoIGEgYHN0b3Aoa2V5KWAgY2FsbC4gRmFpbHVyZSB0byB3aXJlIHN0b3AgcHJvZHVjZXMgYVxuICogbWVtb3J5IGxlYWs6IHRoZSBhY3RpdmUgbWFwIGdyb3dzIHdpdGhvdXQgYm91bmQuXG4gKlxuICogKipDb25jdXJyZW5jeSAvIG5lc3Rpbmc6KiogY29uY3VycmVudCBib3VuZGFyaWVzIChwYXJhbGxlbCBicmFuY2hlc1xuICogd2l0aCB0d28gTExNIGNhbGxzIGFjdGl2ZSBhdCBvbmNlKSB3b3JrIGNvcnJlY3RseSDigJQgZWFjaCBpcyBrZXllZFxuICogaW5kZXBlbmRlbnRseS4gTmVzdGVkIGJvdW5kYXJpZXMgb2YgRElGRkVSRU5UIEtJTkRTIHJlcXVpcmVcbiAqIFNFUEFSQVRFIHN0b3JlIGluc3RhbmNlcyDigJQgb25lIHBlciBraW5kLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBCb3VuZGFyeVN0YXRlU3RvcmUgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKiBpbXBvcnQgdHlwZSB7IENvbWJpbmVkUmVjb3JkZXIsIEVtaXRFdmVudCB9IGZyb20gJ2Zvb3RwcmludGpzJztcbiAqXG4gKiBpbnRlcmZhY2UgTExNTGl2ZVN0YXRlIHsgcGFydGlhbDogc3RyaW5nOyB0b2tlbnM6IG51bWJlcjsgfVxuICpcbiAqIGNsYXNzIExpdmVMTE1UcmFja2VyIGltcGxlbWVudHMgQ29tYmluZWRSZWNvcmRlciB7XG4gKiAgIHJlYWRvbmx5IGlkID0gJ2xpdmUtbGxtJztcbiAqICAgcHJpdmF0ZSByZWFkb25seSBzdG9yZSA9IG5ldyBCb3VuZGFyeVN0YXRlU3RvcmU8TExNTGl2ZVN0YXRlPigpO1xuICpcbiAqICAgb25FbWl0KGV2ZW50OiBFbWl0RXZlbnQpOiB2b2lkIHtcbiAqICAgICBpZiAoZXZlbnQubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LnN0cmVhbS5sbG1fc3RhcnQnKSB7XG4gKiAgICAgICB0aGlzLnN0b3JlLnN0YXJ0KGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCB7IHBhcnRpYWw6ICcnLCB0b2tlbnM6IDAgfSk7XG4gKiAgICAgfSBlbHNlIGlmIChldmVudC5uYW1lID09PSAnYWdlbnRmb290cHJpbnQuc3RyZWFtLmxsbV9lbmQnKSB7XG4gKiAgICAgICB0aGlzLnN0b3JlLnN0b3AoZXZlbnQucnVudGltZVN0YWdlSWQpO1xuICogICAgIH0gZWxzZSBpZiAoZXZlbnQubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LnN0cmVhbS50b2tlbicpIHtcbiAqICAgICAgIHRoaXMuc3RvcmUudXBkYXRlKGV2ZW50LnJ1bnRpbWVTdGFnZUlkLCAocykgPT4gKHtcbiAqICAgICAgICAgcGFydGlhbDogcy5wYXJ0aWFsICsgKGV2ZW50LnBheWxvYWQgYXMgeyBjb250ZW50OiBzdHJpbmcgfSkuY29udGVudCxcbiAqICAgICAgICAgdG9rZW5zOiBzLnRva2VucyArIDEsXG4gKiAgICAgICB9KSk7XG4gKiAgICAgfVxuICogICB9XG4gKlxuICogICBpc0luRmxpZ2h0KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5zdG9yZS5oYXNBY3RpdmU7IH1cbiAqICAgZ2V0UGFydGlhbChyaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gKiAgICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0KHJpZCk/LnBhcnRpYWwgPz8gJyc7XG4gKiAgIH1cbiAqXG4gKiAgIGNsZWFyKCkgeyB0aGlzLnN0b3JlLmNsZWFyKCk7IH1cbiAqIH1cbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcblxuZXhwb3J0IGNsYXNzIEJvdW5kYXJ5U3RhdGVTdG9yZTxUU3RhdGU+IHtcbiAgLyoqIE9wZW4tYnJhY2tldHMgc3RhY2s6IGtleSDihpIgY3VycmVudCB0cmFuc2llbnQgc3RhdGUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZlID0gbmV3IE1hcDxzdHJpbmcsIFRTdGF0ZT4oKTtcblxuICAvKiogUGVyLWtleSBjb3VudCBvZiBgdXBkYXRlYCBjYWxscyB0aGF0IGxhbmRlZCB3aXRob3V0IGEgbWF0Y2hpbmdcbiAgICogIGFjdGl2ZSBib3VuZGFyeS4gRHJpdmVzIHJhdGUtbGltaXRlZCBkZXYtbW9kZSB3YXJuaW5ncyBzbyBhXG4gICAqICBzdHVjayBsb29wIGRvZXNuJ3Qgc3BhbSB0aGUgY29uc29sZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBtaXNzZWRVcGRhdGVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAvKiogT3B0aW9uYWwgaWQgZm9yIGRpYWdub3N0aWNzIOKAlCBwYXNzZWQgdG8gZGV2LW1vZGUgd2FybmluZ3Mgc28gdGhlXG4gICAqICBzb3VyY2Ugb2YgdGhlIGxlYWsgaXMgZWFzeSB0byBmaW5kIHdoZW4gbXVsdGlwbGUgc3RvcmVzIGNvZXhpc3QuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGlhZ25vc3RpY0lkOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGlhZ25vc3RpY0lkID0gJ2JvdW5kYXJ5LXN0YXRlLXN0b3JlJykge1xuICAgIHRoaXMuZGlhZ25vc3RpY0lkID0gZGlhZ25vc3RpY0lkO1xuICB9XG5cbiAgLy8g4pSA4pSAIE11dGF0b3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBPcGVuIGEgbmV3IGJvdW5kYXJ5IHdpdGggaW5pdGlhbCB0cmFuc2llbnQgc3RhdGUuIElmIGEgYm91bmRhcnlcbiAgICogd2l0aCB0aGUgc2FtZSBga2V5YCBpcyBhbHJlYWR5IGFjdGl2ZSwgdGhlIHByaW9yIHN0YXRlIGlzXG4gICAqIG92ZXJ3cml0dGVuIChsYXN0LXdyaXRlci13aW5zKS4gRGV2IG1vZGUgd2FybnMg4oCUIHVzdWFsbHlcbiAgICogaW5kaWNhdGVzIGEgbWlzc2VkIGBzdG9wYCB1cHN0cmVhbS5cbiAgICovXG4gIHN0YXJ0KGtleTogc3RyaW5nLCBpbml0aWFsOiBUU3RhdGUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3RpdmUuaGFzKGtleSkgJiYgaXNEZXZNb2RlKCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFske3RoaXMuZGlhZ25vc3RpY0lkfV0gc3RhcnQoJyR7a2V5fScpIGNhbGxlZCB3aGlsZSBhbiBhY3RpdmUgYm91bmRhcnkgYCArXG4gICAgICAgICAgJ2FscmVhZHkgZXhpc3RzLiBPdmVyd3JpdGluZyBwcmlvciBzdGF0ZSDigJQgbGlrZWx5IGEgbWlzc2VkIHN0b3AgdXBzdHJlYW0uJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlLnNldChrZXksIGluaXRpYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2b2x2ZSB0aGUgdHJhbnNpZW50IHN0YXRlIG9mIGFuIGFjdGl2ZSBib3VuZGFyeSB1c2luZyBhIHB1cmVcbiAgICogdXBkYXRlciBmdW5jdGlvbi4gU2lsZW50IG5vLW9wIGlmIG5vIGJvdW5kYXJ5IGlzIGFjdGl2ZSBmb3IgYGtleWBcbiAgICogKGRlZmVuc2l2ZSBhZ2FpbnN0IG91dC1vZi1vcmRlciBldmVudHMpLiBEZXYgbW9kZSBsb2dzIGEgcmF0ZS1cbiAgICogbGltaXRlZCB3YXJuaW5nLlxuICAgKi9cbiAgdXBkYXRlKGtleTogc3RyaW5nLCB1cGRhdGVyOiAocHJldjogVFN0YXRlKSA9PiBUU3RhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBjdXIgPSB0aGlzLmFjdGl2ZS5nZXQoa2V5KTtcbiAgICBpZiAoY3VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICBjb25zdCBuID0gKHRoaXMubWlzc2VkVXBkYXRlcy5nZXQoa2V5KSA/PyAwKSArIDE7XG4gICAgICAgIHRoaXMubWlzc2VkVXBkYXRlcy5zZXQoa2V5LCBuKTtcbiAgICAgICAgaWYgKG4gPT09IDEpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFske3RoaXMuZGlhZ25vc3RpY0lkfV0gdXBkYXRlKCcke2tleX0nKSDigJQgbm8gYWN0aXZlIGJvdW5kYXJ5LiBVcGRhdGUgZHJvcHBlZC5gKTtcbiAgICAgICAgfSBlbHNlIGlmIChuID09PSAxMCB8fCBuID09PSAxMDApIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFske3RoaXMuZGlhZ25vc3RpY0lkfV0gdXBkYXRlKCcke2tleX0nKSDigJQgJHtufSBkcm9wcGVkIHVwZGF0ZXMuIFdpcmluZyBidWc/YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmUuc2V0KGtleSwgdXBkYXRlcihjdXIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgYm91bmRhcnkgaWRlbnRpZmllZCBieSBga2V5YCBhbmQgcmV0dXJuIGl0cyBGSU5BTFxuICAgKiB0cmFuc2llbnQgc3RhdGUgKHNvIHRoZSBjb25zdW1lciBjYW4gZG8gYW55IGNsZWFudXAg4oCUIGUuZy4sIGVtaXRcbiAgICogYSBzbmFwc2hvdCB0byBhIFNlcXVlbmNlU3RvcmUgZm9yIGR1cmFibGUgc3RvcmFnZSkuXG4gICAqL1xuICBzdG9wKGtleTogc3RyaW5nKTogVFN0YXRlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmaW5hbCA9IHRoaXMuYWN0aXZlLmdldChrZXkpO1xuICAgIHRoaXMuYWN0aXZlLmRlbGV0ZShrZXkpO1xuICAgIHJldHVybiBmaW5hbDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkIChPKDEpKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQ3VycmVudCB0cmFuc2llbnQgc3RhdGUgb2YgT05FIGFjdGl2ZSBib3VuZGFyeS4gYHVuZGVmaW5lZGAgaWYgbm9cbiAgICogIGJvdW5kYXJ5IGlzIGFjdGl2ZSBmb3IgYGtleWAuICovXG4gIGdldChrZXk6IHN0cmluZyk6IFRTdGF0ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlLmdldChrZXkpO1xuICB9XG5cbiAgLyoqIEFsbCBjdXJyZW50bHktYWN0aXZlIGJvdW5kYXJpZXMuXG4gICAqXG4gICAqICAqKlR5cGUtb25seSByZWFkb25seToqKiBUeXBlU2NyaXB0IHByZXZlbnRzIG11dGF0aW9uIHRocm91Z2hcbiAgICogIGBSZWFkb25seU1hcGAsIGJ1dCBhIHJ1bnRpbWUgY2FzdCBvciBub24tVFMgY29uc3VtZXIgY2FuIG11dGF0ZVxuICAgKiAgdGhlIHVuZGVybHlpbmcgTWFwIGFuZCBjb3JydXB0IHN0YXRlLiBEb24ndC4gKi9cbiAgZ2V0QWxsKCk6IFJlYWRvbmx5TWFwPHN0cmluZywgVFN0YXRlPiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xuICB9XG5cbiAgLyoqIFRydWUgaWYgYW55IGJvdW5kYXJ5IGlzIGN1cnJlbnRseSBhY3RpdmUuIE8oMSkuICovXG4gIGdldCBoYXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlLnNpemUgPiAwO1xuICB9XG5cbiAgLyoqIE51bWJlciBvZiBjdXJyZW50bHktYWN0aXZlIGJvdW5kYXJpZXMuIE8oMSkuICovXG4gIGdldCBhY3RpdmVDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZS5zaXplO1xuICB9XG5cbiAgLy8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmVzZXQgYWxsIHRyYW5zaWVudCBzdGF0ZS4gQ2FsbGVkIGJ5IHJlY29yZGVyIGNvbXBvc2VycyBmcm9tXG4gICAqIHRoZWlyIG93biBgY2xlYXIoKWAgbWV0aG9kLCB3aGljaCB0aGUgZXhlY3V0b3IgaW52b2tlcyBiZWZvcmVcbiAgICogZWFjaCBydW4uXG4gICAqXG4gICAqIERldiBtb2RlIHdhcm5zIGlmIGFueSBib3VuZGFyaWVzIGFyZSBzdGlsbCBhY3RpdmUgd2hlbiBjYWxsZWQg4oCUXG4gICAqIGxpa2VseSBpbmRpY2F0ZXMgYSBtaXNzZWQgYHN0b3BgIHVwc3RyZWFtLiBMZWFrZWQga2V5cyBhcmUgbGlzdGVkXG4gICAqICh0cnVuY2F0ZWQgdG8gMTApIHNvIHRoZSB3aXJpbmcgYnVnIGlzIGZpbmRhYmxlLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlLnNpemUgPiAwICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICBjb25zdCBrZXlzID0gWy4uLnRoaXMuYWN0aXZlLmtleXMoKV07XG4gICAgICBjb25zdCBoZWFkID0ga2V5cy5zbGljZSgwLCAxMCkuam9pbignLCAnKTtcbiAgICAgIGNvbnN0IG1vcmUgPSBrZXlzLmxlbmd0aCA+IDEwID8gYCAuLi4oKyR7a2V5cy5sZW5ndGggLSAxMH0gbW9yZSlgIDogJyc7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbJHt0aGlzLmRpYWdub3N0aWNJZH1dIGNsZWFyKCkgY2FsbGVkIHdpdGggJHt0aGlzLmFjdGl2ZS5zaXplfSBgICtcbiAgICAgICAgICAnc3RpbGwtYWN0aXZlIGJvdW5kYXJpZXMuIE1pc3NlZCBzdG9wPyAnICtcbiAgICAgICAgICBgTGVha2VkIGtleXM6ICR7aGVhZH0ke21vcmV9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlLmNsZWFyKCk7XG4gICAgdGhpcy5taXNzZWRVcGRhdGVzLmNsZWFyKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* **Mental model — observers vs. bookkeepers:**
|
|
7
7
|
*
|
|
8
|
-
* `
|
|
8
|
+
* `ScopeRecorder` / `FlowRecorder` / `EmitRecorder` / `CombinedRecorder`
|
|
9
9
|
* are OBSERVER interfaces — they describe how a recorder hears
|
|
10
10
|
* events from the executor.
|
|
11
11
|
*
|
|
@@ -58,8 +58,8 @@
|
|
|
58
58
|
* - Aggregations across the whole run (totals, counts) — those are
|
|
59
59
|
* `SequenceRecorder.aggregate()` / `KeyedRecorder.aggregate()`.
|
|
60
60
|
*
|
|
61
|
-
* - Stage-level concerns — those use `
|
|
62
|
-
* `
|
|
61
|
+
* - Stage-level concerns — those use `ScopeRecorder.onStageStart` /
|
|
62
|
+
* `ScopeRecorder.onStageEnd`. This primitive operates at finer
|
|
63
63
|
* granularity (events emitted DURING a stage execution).
|
|
64
64
|
*
|
|
65
65
|
* **Lifecycle contract — STRICT:**
|
|
@@ -264,4 +264,4 @@ class BoundaryStateTracker {
|
|
|
264
264
|
}
|
|
265
265
|
}
|
|
266
266
|
exports.BoundaryStateTracker = BoundaryStateTracker;
|
|
267
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm91bmRhcnlTdGF0ZVRyYWNrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL0JvdW5kYXJ5U3RhdGVUcmFja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0pHOzs7QUFFSCxrRUFBdUQ7QUFFdkQsTUFBc0Isb0JBQW9CO0lBSXhDLDBEQUEwRDtJQUN6QyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFcEQ7O29EQUVnRDtJQUMvQixhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFM0QsdUVBQXVFO0lBRXZFOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDTyxhQUFhLENBQUMsR0FBVyxFQUFFLE9BQWU7UUFDbEQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFBLDZCQUFTLEdBQUUsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsSUFBSSxJQUFJLENBQUMsRUFBRSxvQkFBb0IsR0FBRyxxREFBcUQ7Z0JBQ3JGLGtFQUFrRSxDQUNyRSxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxjQUFjLENBQUMsR0FBVyxFQUFFLE9BQWlDO1FBQ3JFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksR0FBRyxLQUFLLFNBQVMsRUFB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b250ZW50IjpbIi8qKlxuICogQm91bmRhcnlTdGF0ZVRyYWNrZXI8VFN0YXRlPiDigJQgdGhpcmQgc3RvcmFnZSBwcmltaXRpdmUgb24gdGhlIHJlY29yZGVyXG4gKiBzaGVsZiwgYWxvbmdzaWRlIGBTZXF1ZW5jZVJlY29yZGVyPFQ+YCBhbmQgYEtleWVkUmVjb3JkZXI8VD5gLlxuICpcbiAqICoqTWVudGFsIG1vZGVsIOKAlCBvYnNlcnZlcnMgdnMuIGJvb2trZWVwZXJzOioqXG4gKlxuICogICBgUmVjb3JkZXJgIC8gYEZsb3dSZWNvcmRlcmAgLyBgRW1pdFJlY29yZGVyYCAvIGBDb21iaW5lZFJlY29yZGVyYFxuICogICAgIGFyZSBPQlNFUlZFUiBpbnRlcmZhY2VzIOKAlCB0aGV5IGRlc2NyaWJlIGhvdyBhIHJlY29yZGVyIGhlYXJzXG4gKiAgICAgZXZlbnRzIGZyb20gdGhlIGV4ZWN1dG9yLlxuICpcbiAqICAgYFNlcXVlbmNlUmVjb3JkZXI8VD5gIC8gYEtleWVkUmVjb3JkZXI8VD5gIC8gYEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT5gXG4gKiAgICAgYXJlIFNUT1JBR0UgcHJpbWl0aXZlcyDigJQgdGhyZWUgZGlmZmVyZW50IGJvb2trZWVwaW5nIHNoZWx2ZXMgd2l0aFxuICogICAgIGRpZmZlcmVudCBkdXJhYmlsaXR5IGFuZCBpbmRleGluZyBwcm9wZXJ0aWVzLiBBIHJlYWwgcmVjb3JkZXJcbiAqICAgICBjbGFzcyB0eXBpY2FsbHkgcGlja3MgT05FIG9ic2VydmVyIGludGVyZmFjZSBBTkQgT05FIHN0b3JhZ2VcbiAqICAgICBzaGVsZiwgY29tYmluaW5nIHRoZW0gdmlhIGBleHRlbmRzICsgaW1wbGVtZW50c2AuXG4gKlxuICogKipXaGF0IHRoaXMgcHJpbWl0aXZlIGFuc3dlcnM6KiogXCJBdCBhbnkgbW9tZW50IGR1cmluZyB0aGUgcnVuLCB3aGF0XG4gKiBpcyB0aGUgTElWRSB0cmFuc2llbnQgc3RhdGUgb2YgZXZlcnkgY3VycmVudGx5LWFjdGl2ZSBib3VuZGFyeT9cIlxuICpcbiAqIEEgXCJib3VuZGFyeVwiIGlzIGEgbWF0Y2hlZCBldmVudCBwYWlyIGBbc3RhcnQsIHN0b3BdYCBicmFja2V0aW5nIGFuXG4gKiBpbnRlcnZhbCDigJQgZm9yIGV4YW1wbGUsIGAobGxtX3N0YXJ0LCBsbG1fZW5kKWAgZm9yIGFuIExMTSBjYWxsLFxuICogYCh0b29sX3N0YXJ0LCB0b29sX2VuZClgIGZvciB0b29sIGV4ZWN1dGlvbiwgYCh0dXJuX3N0YXJ0LCB0dXJuX2VuZClgXG4gKiBmb3IgYW4gYWdlbnQgdHVybi4gQmV0d2VlbiB0aGUgYnJhY2tldHMsIGludGVybWVkaWF0ZSBldmVudHMgZXZvbHZlXG4gKiB0aGUgYm91bmRhcnkncyBzdGF0ZSAodG9rZW4gY2h1bmtzIGFjY3VtdWxhdGluZyBpbnRvIGEgcGFydGlhbFxuICogYW5zd2VyLCBhcmdzIHN0cmVhbWluZyBpbiwgZXRjLikuIE9uIGBzdG9wYCwgdGhlIHN0YXRlIGNsZWFycy5cbiAqXG4gKiBBbGdvcml0aG1pY2FsbHkgdGhpcyBpcyB0aGUgKipERlMgYnJhY2tldC1zZXF1ZW5jZSBwYXR0ZXJuKiog4oCUXG4gKiBzdGFjay1mcmFtZSBzdGF0ZSBkdXJpbmcgYSBncmFwaC10cmF2ZXJzYWwgaW50ZXJ2YWwuIFNhbWUgc2hhcGUgdXNlZFxuICogYnkgVGFyamFuJ3MgU0NDIGFsZ29yaXRobSwgdHJlZSBkZWNvbXBvc2l0aW9uLCBhbmQgcHVzaC1kb3duXG4gKiBhdXRvbWF0YS4gVGhlIGBhY3RpdmVgIG1hcCBpcyB0aGUgb3Blbi1icmFja2V0cyBzdGFjayBhdCBhbnkgbW9tZW50LlxuICpcbiAqICoqQ29tcGFyaXNvbiB3aXRoIHRoZSBvdGhlciBzdG9yYWdlIHByaW1pdGl2ZXM6KipcbiAqXG4gKiB8IFByaW1pdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgfCBTdG9yZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaW1lIHNjb3BlICAgICAgICAgIHwgTWVtb3J5ICAgICAgfFxuICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXxcbiAqIHwgYFNlcXVlbmNlUmVjb3JkZXI8VD5gICAgICAgICAgICB8IGFwcGVuZC1vbmx5IG9yZGVyZWQgKyBrZXllZCBlbnRyaWVzICB8IGR1cmFibGUgYWNyb3NzIHJ1biAgfCBPKE4gZXZlbnRzKSB8XG4gKiB8IGBLZXllZFJlY29yZGVyPFQ+YCAgICAgICAgICAgICAgfCAxOjEgZW50cnkgcGVyIGBydW50aW1lU3RhZ2VJZGAgICAgICAgfCBkdXJhYmxlIGFjcm9zcyBydW4gIHwgTyhOIHN0ZXBzKSAgfFxuICogfCBgQm91bmRhcnlTdGF0ZVRyYWNrZXI8VFN0YXRlPmAgIHwgdHJhbnNpZW50IGJyYWNrZXQtc2NvcGVkIHN0YXRlICAgICAgIHwgbGl2ZTsgY2xlYXJzIG9uIHN0b3AgfCBPKEsgYWN0aXZlKSB8XG4gKlxuICogKipXaGVuIHRvIHBpY2sgd2hpY2g6KipcbiAqXG4gKiAgIC0gXCJJIG5lZWQgdG8ga2VlcCBhIHBlcm1hbmVudCBsb2cgb2YgZXZlcnkgZXZlbnQgZm9yIHRpbWUtdHJhdmVsXCJcbiAqICAgICAg4oaSIGBTZXF1ZW5jZVJlY29yZGVyPFQ+YFxuICogICAtIFwiSSB3YW50IG9uZSBkdXJhYmxlIHJlY29yZCBwZXIgc3RhZ2UgZXhlY3V0aW9uIChlLmcuLCBtZXRyaWNzKVwiXG4gKiAgICAgIOKGkiBgS2V5ZWRSZWNvcmRlcjxUPmBcbiAqICAgLSBcIkkgbmVlZCB0byBrbm93IHdoYXQncyBoYXBwZW5pbmcgUklHSFQgTk9XIGluc2lkZSBhbiBpbi1mbGlnaHRcbiAqICAgICBib3VuZGFyeSAoZS5nLiwgcGFydGlhbCBMTE0gc3RyZWFtLCBwYXJ0aWFsIHRvb2wgYXJncylcIlxuICogICAgICDihpIgYEJvdW5kYXJ5U3RhdGVUcmFja2VyPFRTdGF0ZT5gICh0aGlzIGNsYXNzKVxuICpcbiAqICoqV2hhdCB0aGlzIGlzIE5PVCBmb3I6KipcbiAqXG4gKiAgIC0gVGltZS10cmF2ZWwgcXVlcmllcyAoXCJ3aGF0IHdhcyB0aGUgc3RhdGUgYXQgcGFzdCBzbGlkZXIgc3RlcCBOP1wiKVxuICogICAgIOKAlCB0cmFuc2llbnQgc3RhdGUgY2xlYXJzIG9uIHN0b3AuIEZvciB0aW1lLXRyYXZlbCwgc25hcHNob3QgdGhlXG4gKiAgICAgc3RhdGUgYXQgZWFjaCBlbWl0IGludG8gYSBzZXBhcmF0ZSBgU2VxdWVuY2VSZWNvcmRlcjxUU3RhdGU+YCxcbiAqICAgICBvciB3YWl0IGZvciBhIGZ1dHVyZSBgQm91bmRhcnlTbmFwc2hvdFJlY29yZGVyPFRTdGF0ZT5gIHByaW1pdGl2ZS5cbiAqXG4gKiAgIC0gQWdncmVnYXRpb25zIGFjcm9zcyB0aGUgd2hvbGUgcnVuICh0b3RhbHMsIGNvdW50cykg4oCUIHRob3NlIGFyZVxuICogICAgIGBTZXF1ZW5jZVJlY29yZGVyLmFnZ3JlZ2F0ZSgpYCAvIGBLZXllZFJlY29yZGVyLmFnZ3JlZ2F0ZSgpYC5cbiAqXG4gKiAgIC0gU3RhZ2UtbGV2ZWwgY29uY2VybnMg4oCUIHRob3NlIHVzZSBgUmVjb3JkZXIub25TdGFnZVN0YXJ0YCAvXG4gKiAgICAgYFJlY29yZGVyLm9uU3RhZ2VFbmRgLiBUaGlzIHByaW1pdGl2ZSBvcGVyYXRlcyBhdCBmaW5lclxuICogICAgIGdyYW51bGFyaXR5IChldmVudHMgZW1pdHRlZCBEVVJJTkcgYSBzdGFnZSBleGVjdXRpb24pLlxuICpcbiAqICoqTGlmZWN5Y2xlIGNvbnRyYWN0IOKAlCBTVFJJQ1Q6KipcbiAqXG4gKiAgIEV2ZXJ5IGBzdGFydEJvdW5kYXJ5KGtleSwgLi4uKWAgY2FsbCBNVVNUIGJlIHBhaXJlZCB3aXRoIGFcbiAqICAgYHN0b3BCb3VuZGFyeShrZXkpYCBjYWxsLiBGYWlsdXJlIHRvIHdpcmUgdGhlIHN0b3Agc2lkZSBwcm9kdWNlcyBhXG4gKiAgIG1lbW9yeSBsZWFrOiB0aGUgYWN0aXZlIG1hcCBncm93cyB3aXRob3V0IGJvdW5kLCBhbmQgYGdldEFsbEFjdGl2ZSgpYFxuICogICByZXR1cm5zIHN0YWxlIGVudHJpZXMgdGhhdCBsb29rIGluLWZsaWdodCBidXQgYXJlbid0LiBDb21tb24gY2F1c2U6XG4gKiAgIHN1YmNsYXNzIHdpcmVzIGBzdGFydGAgdG8gb25lIGV2ZW50IGhhbmRsZXIgYW5kIGZvcmdldHMgdG8gd2lyZVxuICogICBgc3RvcGAuICoqQWx3YXlzIHdpcmUgYm90aCBhdCB0aGUgc2FtZSB0aW1lLioqXG4gKlxuICogICBEZXYgbW9kZSAoYGVuYWJsZURldk1vZGUoKWApIGRldGVjdHMgbGVha3MgYXQgYGNsZWFyKClgIHRpbWUg4oCUXG4gKiAgIHdhcm5pbmcgaW5jbHVkZXMgdGhlIGxlYWtlZCBrZXlzIHNvIHlvdSBjYW4gZmluZCB0aGUgbWlzc2luZyB3aXJpbmcuXG4gKlxuICogKipDb25jdXJyZW5jeSAvIG5lc3Rpbmc6KipcbiAqXG4gKiAgIC0gQ29uY3VycmVudCBib3VuZGFyaWVzIChwYXJhbGxlbCBicmFuY2hlcyB3aXRoIHR3byBMTE0gY2FsbHNcbiAqICAgICBhY3RpdmUgYXQgb25jZSkgd29yayBjb3JyZWN0bHk6IGVhY2ggaXMga2V5ZWQgaW5kZXBlbmRlbnRseSBpblxuICogICAgIHRoZSBhY3RpdmUgbWFwLlxuICogICAtIE5lc3RlZCBib3VuZGFyaWVzIG9mIERJRkZFUkVOVCBLSU5EUyAoQWdlbnQgYm91bmRhcnkgY29udGFpbnNcbiAqICAgICBMTE0gYm91bmRhcnkpIHJlcXVpcmUgU0VQQVJBVEUgdHJhY2tlciBpbnN0YW5jZXMg4oCUIG9uZSBwZXIga2luZC5cbiAqICAgICBUaGUgYmFzZSBjbGFzcyB0cmFja3Mgb25lIGJvdW5kYXJ5IGtpbmQgcGVyIGluc3RhbmNlLlxuICpcbiAqICoqS2V5IGNvbnZlbnRpb246KipcbiAqXG4gKiAgIFRoZSBga2V5OiBzdHJpbmdgIGlzIHdoYXRldmVyIHlvdXIgc3ViY2xhc3MgcGlja3MuIENvbnZlbnRpb246XG4gKiAgIHVzZSBgcnVudGltZVN0YWdlSWRgIHdoZW4gdGhlIGJvdW5kYXJ5IG1hcHMgMToxIHRvIGEgc3RhZ2VcbiAqICAgZXhlY3V0aW9uIOKAlCB0aGlzIGdpdmVzIGZyZWUgaW50ZXJvcCB3aXRoIGBTZXF1ZW5jZVJlY29yZGVyXG4gKiAgIC5nZXRFbnRyaWVzRm9yU3RlcGAsIGBLZXllZFJlY29yZGVyLmdldEJ5S2V5YCwgYGZpbmRDb21taXRgIC9cbiAqICAgYGZpbmRMYXN0V3JpdGVyYCwgYW5kIHRoZSByZXN0IG9mIHRoZSB0cmFjZSBlY29zeXN0ZW0uIFVzZSBhIG1vcmVcbiAqICAgZ3JhbnVsYXIga2V5IChlLmcuLCBgdG9vbENhbGxJZGApIG9ubHkgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGVcbiAqICAgY29uY3VycmVudCBib3VuZGFyaWVzIFdJVEhJTiBvbmUgc3RhZ2UgZXhlY3V0aW9uLlxuICpcbiAqIEBleGFtcGxlIEJ1aWxkIGEgbGl2ZSBMTE0gdHJhY2tlciAoY29tYmluaW5nIHN0b3JhZ2UgKyBvYnNlcnZlcik6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHtcbiAqICAgQm91bmRhcnlTdGF0ZVRyYWNrZXIsXG4gKiAgIHR5cGUgQ29tYmluZWRSZWNvcmRlcixcbiAqICAgdHlwZSBFbWl0RXZlbnQsXG4gKiB9IGZyb20gJ2Zvb3RwcmludGpzJztcbiAqXG4gKiBpbnRlcmZhY2UgTExNTGl2ZVN0YXRlIHtcbiAqICAgcmVhZG9ubHkgcGFydGlhbDogc3RyaW5nO1xuICogICByZWFkb25seSB0b2tlbnM6IG51bWJlcjtcbiAqIH1cbiAqXG4gKiBjbGFzcyBMaXZlTExNVHJhY2tlclxuICogICBleHRlbmRzIEJvdW5kYXJ5U3RhdGVUcmFja2VyPExMTUxpdmVTdGF0ZT4gICAvLyBTVE9SQUdFIHNoZWxmXG4gKiAgIGltcGxlbWVudHMgQ29tYmluZWRSZWNvcmRlciAgICAgICAgICAgICAgICAgICAvLyBPQlNFUlZFUiBpbnRlcmZhY2VcbiAqIHtcbiAqICAgcmVhZG9ubHkgaWQgPSAnbGl2ZS1sbG0nO1xuICpcbiAqICAgLy8gT2JzZXJ2ZXIgaGFsZiDigJQgdHJhbnNsYXRlIGV2ZW50cyBpbnRvIGJyYWNrZXQgbXV0YXRpb25zLlxuICogICBvbkVtaXQoZXZlbnQ6IEVtaXRFdmVudCk6IHZvaWQge1xuICogICAgIGlmIChldmVudC5uYW1lID09PSAnYWdlbnRmb290cHJpbnQuc3RyZWFtLmxsbV9zdGFydCcpIHtcbiAqICAgICAgIHRoaXMuc3RhcnRCb3VuZGFyeShldmVudC5ydW50aW1lU3RhZ2VJZCwgeyBwYXJ0aWFsOiAnJywgdG9rZW5zOiAwIH0pO1xuICogICAgIH0gZWxzZSBpZiAoZXZlbnQubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LnN0cmVhbS5sbG1fZW5kJykge1xuICogICAgICAgdGhpcy5zdG9wQm91bmRhcnkoZXZlbnQucnVudGltZVN0YWdlSWQpO1xuICogICAgIH0gZWxzZSBpZiAoZXZlbnQubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LnN0cmVhbS50b2tlbicpIHtcbiAqICAgICAgIHRoaXMudXBkYXRlQm91bmRhcnkoZXZlbnQucnVudGltZVN0YWdlSWQsIChzKSA9PiAoe1xuICogICAgICAgICBwYXJ0aWFsOiBzLnBhcnRpYWwgKyAoZXZlbnQucGF5bG9hZCBhcyB7IGNvbnRlbnQ6IHN0cmluZyB9KS5jb250ZW50LFxuICogICAgICAgICB0b2tlbnM6IHMudG9rZW5zICsgMSxcbiAqICAgICAgIH0pKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqXG4gKiAgIC8vIFB1YmxpYyByZWFkIEFQSSDigJQgTygxKSBhdCBhbnkgbW9tZW50LlxuICogICBpc0luRmxpZ2h0KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5oYXNBY3RpdmU7IH1cbiAqICAgZ2V0UGFydGlhbChzdGFnZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICogICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZShzdGFnZUlkKT8ucGFydGlhbCA/PyAnJztcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIEF0dGFjaGVkIHRoZSBzYW1lIHdheSBhcyBhbnkgb3RoZXIgQ29tYmluZWRSZWNvcmRlci5cbiAqIGNvbnN0IHRyYWNrZXIgPSBuZXcgTGl2ZUxMTVRyYWNrZXIoKTtcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIodHJhY2tlcik7XG4gKiBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAqXG4gKiAvLyBSZWFkIGxpdmUgc3RhdGUgYXQgYW55IHRpbWUgZHVyaW5nIG9yIGFmdGVyIHRoZSBydW4uXG4gKiB0cmFja2VyLmlzSW5GbGlnaHQoKTtcbiAqIHRyYWNrZXIuZ2V0UGFydGlhbChyaWQpO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vc2NvcGUvZGV0ZWN0Q2lyY3VsYXIuanMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQm91bmRhcnlTdGF0ZVRyYWNrZXI8VFN0YXRlPiB7XG4gIC8qKiBTdGFibGUgaWQg4oCUIHNhbWUgaWRlbXBvdGVuY3kgY29udHJhY3QgYXMgb3RoZXIgcmVjb3JkZXJzLiAqL1xuICBhYnN0cmFjdCByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKiBPcGVuLWJyYWNrZXRzIHN0YWNrOiBrZXkg4oaSIGN1cnJlbnQgdHJhbnNpZW50IHN0YXRlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZSA9IG5ldyBNYXA8c3RyaW5nLCBUU3RhdGU+KCk7XG5cbiAgLyoqIFBlci1rZXkgY291bnQgb2YgYHVwZGF0ZUJvdW5kYXJ5YCBjYWxscyB0aGF0IGxhbmRlZCB3aXRob3V0IGFcbiAgICogIG1hdGNoaW5nIGFjdGl2ZSBib3VuZGFyeS4gRHJpdmVzIHJhdGUtbGltaXRlZCBkZXYtbW9kZSB3YXJuaW5nc1xuICAgKiAgc28gYSBzdHVjayBsb29wIGRvZXNuJ3Qgc3BhbSB0aGUgY29uc29sZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBtaXNzZWRVcGRhdGVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAvLyDilIDilIAgTXV0YXRvciBBUEkgKHN1YmNsYXNzIGNhbGxzIHRoZXNlIGZyb20gb2JzZXJ2ZXIgaG9va3MpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBPcGVuIGEgbmV3IGJvdW5kYXJ5IHdpdGggaW5pdGlhbCB0cmFuc2llbnQgc3RhdGUuXG4gICAqXG4gICAqIElmIGEgYm91bmRhcnkgd2l0aCB0aGUgc2FtZSBga2V5YCBpcyBhbHJlYWR5IGFjdGl2ZSwgdGhlIHByaW9yXG4gICAqIHN0YXRlIGlzIG92ZXJ3cml0dGVuIChsYXN0LXdyaXRlci13aW5zKS4gSW4gZGV2IG1vZGUsIGEgd2FybmluZ1xuICAgKiBpcyBsb2dnZWQgYmVjYXVzZSByZS1zdGFydGluZyBhbiBhY3RpdmUga2V5IHVzdWFsbHkgaW5kaWNhdGVzIGFcbiAgICogbWlzc2VkIGBzdG9wQm91bmRhcnlgIGNhbGwgdXBzdHJlYW0uXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgQm91bmRhcnkgaWRlbnRpZmllciDigJQgYnkgY29udmVudGlvbiwgYHJ1bnRpbWVTdGFnZUlkYFxuICAgKiAgICAgICAgICAgIGZvciAxOjEtd2l0aC1zdGFnZSBib3VuZGFyaWVzLCBvciBhIG1vcmUgZ3JhbnVsYXIgaWRcbiAgICogICAgICAgICAgICAoZS5nLiwgYHRvb2xDYWxsSWRgKSB3aGVuIG11bHRpcGxlIGNvbmN1cnJlbnQgYm91bmRhcmllc1xuICAgKiAgICAgICAgICAgIHJ1biB3aXRoaW4gb25lIHN0YWdlIGV4ZWN1dGlvbi5cbiAgICogQHBhcmFtIGluaXRpYWwgSW5pdGlhbCBzdGF0ZSDigJQgdHlwZWQgYnkgYFRTdGF0ZWAuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhcnRCb3VuZGFyeShrZXk6IHN0cmluZywgaW5pdGlhbDogVFN0YXRlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlLmhhcyhrZXkpICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbJHt0aGlzLmlkfV0gc3RhcnRCb3VuZGFyeSgnJHtrZXl9JykgY2FsbGVkIHdoaWxlIGFuIGFjdGl2ZSBib3VuZGFyeSBhbHJlYWR5IGV4aXN0cy4gYCArXG4gICAgICAgICAgJ092ZXJ3cml0aW5nIHByaW9yIHN0YXRlIOKAlCBsaWtlbHkgYSBtaXNzZWQgc3RvcEJvdW5kYXJ5IHVwc3RyZWFtLicsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZS5zZXQoa2V5LCBpbml0aWFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdm9sdmUgdGhlIHRyYW5zaWVudCBzdGF0ZSBvZiBhbiBhY3RpdmUgYm91bmRhcnkgdXNpbmcgYW4gdXBkYXRlclxuICAgKiBmdW5jdGlvbi4gU2lsZW50IG5vLW9wIGlmIG5vIGJvdW5kYXJ5IGlzIGFjdGl2ZSBmb3IgYGtleWBcbiAgICogKGRlZmVuc2l2ZSBhZ2FpbnN0IG91dC1vZi1vcmRlciBldmVudHMpLiBJbiBkZXYgbW9kZSwgYSByYXRlLWxpbWl0ZWRcbiAgICogd2FybmluZyBpcyBsb2dnZWQgb24gdGhlIDFzdCwgMTB0aCwgYW5kIDEwMHRoIG1pc3NlZCB1cGRhdGUgcGVyIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAgICAgIEJvdW5kYXJ5IGlkZW50aWZpZXIgKG11c3QgbWF0Y2ggYSBwcmlvciBgc3RhcnRCb3VuZGFyeWApLlxuICAgKiBAcGFyYW0gdXBkYXRlciAgUHVyZSBmdW5jdGlvbjogcHJldmlvdXMgc3RhdGUg4oaSIG5leHQgc3RhdGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlQm91bmRhcnkoa2V5OiBzdHJpbmcsIHVwZGF0ZXI6IChwcmV2OiBUU3RhdGUpID0+IFRTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuYWN0aXZlLmdldChrZXkpO1xuICAgIGlmIChjdXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnN0IG4gPSAodGhpcy5taXNzZWRVcGRhdGVzLmdldChrZXkpID8/IDApICsgMTtcbiAgICAgICAgdGhpcy5taXNzZWRVcGRhdGVzLnNldChrZXksIG4pO1xuICAgICAgICBpZiAobiA9PT0gMSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgWyR7dGhpcy5pZH1dIHVwZGF0ZUJvdW5kYXJ5KCcke2tleX0nKSDigJQgbm8gYWN0aXZlIGJvdW5kYXJ5LiBVcGRhdGUgZHJvcHBlZC5gKTtcbiAgICAgICAgfSBlbHNlIGlmIChuID09PSAxMCB8fCBuID09PSAxMDApIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFske3RoaXMuaWR9XSB1cGRhdGVCb3VuZGFyeSgnJHtrZXl9Jykg4oCUICR7bn0gZHJvcHBlZCB1cGRhdGVzLiBXaXJpbmcgYnVnP2ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlLnNldChrZXksIHVwZGF0ZXIoY3VyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGJvdW5kYXJ5IGlkZW50aWZpZWQgYnkgYGtleWAgYW5kIHJldHVybiBpdHMgRklOQUxcbiAgICogdHJhbnNpZW50IHN0YXRlIChmb3IgYW55IGNsZWFudXAgdGhlIHN1YmNsYXNzIHdhbnRzIOKAlCBlLmcuLCBlbWl0IGFcbiAgICogc25hcHNob3QgdG8gYSBTZXF1ZW5jZVJlY29yZGVyIGZvciBkdXJhYmxlIHN0b3JhZ2UpLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IEJvdW5kYXJ5IGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIFRoZSBmaW5hbCBzdGF0ZSwgb3IgYHVuZGVmaW5lZGAgaWYgbm8gYm91bmRhcnkgd2FzIGFjdGl2ZS5cbiAgICovXG4gIHByb3RlY3RlZCBzdG9wQm91bmRhcnkoa2V5OiBzdHJpbmcpOiBUU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZpbmFsID0gdGhpcy5hY3RpdmUuZ2V0KGtleSk7XG4gICAgdGhpcy5hY3RpdmUuZGVsZXRlKGtleSk7XG4gICAgcmV0dXJuIGZpbmFsO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlYWQgQVBJIChjb25zdW1lcnMgY2FsbCB0aGVzZSDigJQgTygxKSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEN1cnJlbnQgdHJhbnNpZW50IHN0YXRlIG9mIE9ORSBhY3RpdmUgYm91bmRhcnkuIGB1bmRlZmluZWRgIGlmIG5vXG4gICAqICBib3VuZGFyeSBpcyBhY3RpdmUgZm9yIGBrZXlgLiAqL1xuICBnZXRBY3RpdmUoa2V5OiBzdHJpbmcpOiBUU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZS5nZXQoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgY3VycmVudGx5LWFjdGl2ZSBib3VuZGFyaWVzLlxuICAgKlxuICAgKiAqKlR5cGUtb25seSByZWFkb25seToqKiB0aGUgcmV0dXJuZWQgcmVmZXJlbmNlIElTIHRoZSBpbnRlcm5hbCBNYXAuXG4gICAqIFR5cGVTY3JpcHQgcHJldmVudHMgbXV0YXRpb24gdGhyb3VnaCB0aGUgYFJlYWRvbmx5TWFwYCB0eXBlLCBidXQgYVxuICAgKiBydW50aW1lIGNhc3Qgb3Igbm9uLVRTIGNvbnN1bWVyIGNhbiBtdXRhdGUgaXQgYW5kIGNvcnJ1cHQgaW50ZXJuYWxcbiAgICogc3RhdGUuICoqRG8gbm90IG11dGF0ZS4qKlxuICAgKi9cbiAgZ2V0QWxsQWN0aXZlKCk6IFJlYWRvbmx5TWFwPHN0cmluZywgVFN0YXRlPiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xuICB9XG5cbiAgLyoqIFRydWUgaWYgYW55IGJvdW5kYXJ5IGlzIGN1cnJlbnRseSBhY3RpdmUuIE8oMSkuICovXG4gIGdldCBoYXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlLnNpemUgPiAwO1xuICB9XG5cbiAgLyoqIE51bWJlciBvZiBjdXJyZW50bHktYWN0aXZlIGJvdW5kYXJpZXMuIE8oMSkuICovXG4gIGdldCBhY3RpdmVDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZS5zaXplO1xuICB9XG5cbiAgLy8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmVzZXQgYWxsIHRyYW5zaWVudCBzdGF0ZS4gQ2FsbGVkIGJ5IGV4ZWN1dG9ycyBiZWZvcmUgZWFjaCBgcnVuKClgXG4gICAqIHNvIGNvbnN1bWVycyBnZXQgYSBjbGVhbiBzbGF0ZSBwZXIgcnVuIOKAlCBzYW1lIGxpZmVjeWNsZSBjb250cmFjdFxuICAgKiBhcyBgU2VxdWVuY2VSZWNvcmRlci5jbGVhcigpYC5cbiAgICpcbiAgICogSW4gZGV2IG1vZGUsIHdhcm5zIGlmIGFueSBib3VuZGFyaWVzIGFyZSBzdGlsbCBhY3RpdmUgd2hlbiBjYWxsZWRcbiAgICog4oCUIGxpa2VseSBpbmRpY2F0ZXMgYSBtaXNzZWQgYHN0b3BCb3VuZGFyeWAgdXBzdHJlYW0uIFRoZSBsZWFrZWRcbiAgICoga2V5cyBhcmUgbGlzdGVkICh0cnVuY2F0ZWQgdG8gMTApIHNvIHRoZSB3aXJpbmcgYnVnIGlzIGZpbmRhYmxlLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlLnNpemUgPiAwICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICBjb25zdCBrZXlzID0gWy4uLnRoaXMuYWN0aXZlLmtleXMoKV07XG4gICAgICBjb25zdCBoZWFkID0ga2V5cy5zbGljZSgwLCAxMCkuam9pbignLCAnKTtcbiAgICAgIGNvbnN0IG1vcmUgPSBrZXlzLmxlbmd0aCA+IDEwID8gYCAuLi4oKyR7a2V5cy5sZW5ndGggLSAxMH0gbW9yZSlgIDogJyc7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbJHt0aGlzLmlkfV0gY2xlYXIoKSBjYWxsZWQgd2l0aCAke3RoaXMuYWN0aXZlLnNpemV9IGAgK1xuICAgICAgICAgICdzdGlsbC1hY3RpdmUgYm91bmRhcmllcy4gTWlzc2VkIHN0b3BCb3VuZGFyeT8gJyArXG4gICAgICAgICAgYExlYWtlZCBrZXlzOiAke2hlYWR9JHttb3JlfWAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZS5jbGVhcigpO1xuICAgIHRoaXMubWlzc2VkVXBkYXRlcy5jbGVhcigpO1xuICB9XG59XG4iXX0=
|
|
267
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm91bmRhcnlTdGF0ZVRyYWNrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY29yZGVyL0JvdW5kYXJ5U3RhdGVUcmFja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0pHOzs7QUFFSCxrRUFBdUQ7QUFFdkQsTUFBc0Isb0JBQW9CO0lBSXhDLDBEQUEwRDtJQUN6QyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFcEQ7O29EQUVnRDtJQUMvQixhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFFM0QsdUVBQXVFO0lBRXZFOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDTyxhQUFhLENBQUMsR0FBVyxFQUFFLE9BQWU7UUFDbEQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFBLDZCQUFTLEdBQUUsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsSUFBSSxJQUFJLENBQUMsRUFBRSxvQkFBb0IsR0FBRyxxREFBcUQ7Z0JBQ3JGLGtFQUFrRSxDQUNyRSxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxjQUFjLENBQUMsR0FBVyxFQUFFLE9BQWlDO1FBQ3JFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksR0FBRyxLQUFLLFNBQVMsRUFB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b250ZW50IjpbIi8qKlxuICogQm91bmRhcnlTdGF0ZVRyYWNrZXI8VFN0YXRlPiDigJQgdGhpcmQgc3RvcmFnZSBwcmltaXRpdmUgb24gdGhlIHJlY29yZGVyXG4gKiBzaGVsZiwgYWxvbmdzaWRlIGBTZXF1ZW5jZVJlY29yZGVyPFQ+YCBhbmQgYEtleWVkUmVjb3JkZXI8VD5gLlxuICpcbiAqICoqTWVudGFsIG1vZGVsIOKAlCBvYnNlcnZlcnMgdnMuIGJvb2trZWVwZXJzOioqXG4gKlxuICogICBgU2NvcGVSZWNvcmRlcmAgLyBgRmxvd1JlY29yZGVyYCAvIGBFbWl0UmVjb3JkZXJgIC8gYENvbWJpbmVkUmVjb3JkZXJgXG4gKiAgICAgYXJlIE9CU0VSVkVSIGludGVyZmFjZXMg4oCUIHRoZXkgZGVzY3JpYmUgaG93IGEgcmVjb3JkZXIgaGVhcnNcbiAqICAgICBldmVudHMgZnJvbSB0aGUgZXhlY3V0b3IuXG4gKlxuICogICBgU2VxdWVuY2VSZWNvcmRlcjxUPmAgLyBgS2V5ZWRSZWNvcmRlcjxUPmAgLyBgQm91bmRhcnlTdGF0ZVRyYWNrZXI8VFN0YXRlPmBcbiAqICAgICBhcmUgU1RPUkFHRSBwcmltaXRpdmVzIOKAlCB0aHJlZSBkaWZmZXJlbnQgYm9va2tlZXBpbmcgc2hlbHZlcyB3aXRoXG4gKiAgICAgZGlmZmVyZW50IGR1cmFiaWxpdHkgYW5kIGluZGV4aW5nIHByb3BlcnRpZXMuIEEgcmVhbCByZWNvcmRlclxuICogICAgIGNsYXNzIHR5cGljYWxseSBwaWNrcyBPTkUgb2JzZXJ2ZXIgaW50ZXJmYWNlIEFORCBPTkUgc3RvcmFnZVxuICogICAgIHNoZWxmLCBjb21iaW5pbmcgdGhlbSB2aWEgYGV4dGVuZHMgKyBpbXBsZW1lbnRzYC5cbiAqXG4gKiAqKldoYXQgdGhpcyBwcmltaXRpdmUgYW5zd2VyczoqKiBcIkF0IGFueSBtb21lbnQgZHVyaW5nIHRoZSBydW4sIHdoYXRcbiAqIGlzIHRoZSBMSVZFIHRyYW5zaWVudCBzdGF0ZSBvZiBldmVyeSBjdXJyZW50bHktYWN0aXZlIGJvdW5kYXJ5P1wiXG4gKlxuICogQSBcImJvdW5kYXJ5XCIgaXMgYSBtYXRjaGVkIGV2ZW50IHBhaXIgYFtzdGFydCwgc3RvcF1gIGJyYWNrZXRpbmcgYW5cbiAqIGludGVydmFsIOKAlCBmb3IgZXhhbXBsZSwgYChsbG1fc3RhcnQsIGxsbV9lbmQpYCBmb3IgYW4gTExNIGNhbGwsXG4gKiBgKHRvb2xfc3RhcnQsIHRvb2xfZW5kKWAgZm9yIHRvb2wgZXhlY3V0aW9uLCBgKHR1cm5fc3RhcnQsIHR1cm5fZW5kKWBcbiAqIGZvciBhbiBhZ2VudCB0dXJuLiBCZXR3ZWVuIHRoZSBicmFja2V0cywgaW50ZXJtZWRpYXRlIGV2ZW50cyBldm9sdmVcbiAqIHRoZSBib3VuZGFyeSdzIHN0YXRlICh0b2tlbiBjaHVua3MgYWNjdW11bGF0aW5nIGludG8gYSBwYXJ0aWFsXG4gKiBhbnN3ZXIsIGFyZ3Mgc3RyZWFtaW5nIGluLCBldGMuKS4gT24gYHN0b3BgLCB0aGUgc3RhdGUgY2xlYXJzLlxuICpcbiAqIEFsZ29yaXRobWljYWxseSB0aGlzIGlzIHRoZSAqKkRGUyBicmFja2V0LXNlcXVlbmNlIHBhdHRlcm4qKiDigJRcbiAqIHN0YWNrLWZyYW1lIHN0YXRlIGR1cmluZyBhIGdyYXBoLXRyYXZlcnNhbCBpbnRlcnZhbC4gU2FtZSBzaGFwZSB1c2VkXG4gKiBieSBUYXJqYW4ncyBTQ0MgYWxnb3JpdGhtLCB0cmVlIGRlY29tcG9zaXRpb24sIGFuZCBwdXNoLWRvd25cbiAqIGF1dG9tYXRhLiBUaGUgYGFjdGl2ZWAgbWFwIGlzIHRoZSBvcGVuLWJyYWNrZXRzIHN0YWNrIGF0IGFueSBtb21lbnQuXG4gKlxuICogKipDb21wYXJpc29uIHdpdGggdGhlIG90aGVyIHN0b3JhZ2UgcHJpbWl0aXZlczoqKlxuICpcbiAqIHwgUHJpbWl0aXZlICAgICAgICAgICAgICAgICAgICAgICB8IFN0b3JlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRpbWUgc2NvcGUgICAgICAgICAgfCBNZW1vcnkgICAgICB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfFxuICogfCBgU2VxdWVuY2VSZWNvcmRlcjxUPmAgICAgICAgICAgIHwgYXBwZW5kLW9ubHkgb3JkZXJlZCArIGtleWVkIGVudHJpZXMgIHwgZHVyYWJsZSBhY3Jvc3MgcnVuICB8IE8oTiBldmVudHMpIHxcbiAqIHwgYEtleWVkUmVjb3JkZXI8VD5gICAgICAgICAgICAgICB8IDE6MSBlbnRyeSBwZXIgYHJ1bnRpbWVTdGFnZUlkYCAgICAgICB8IGR1cmFibGUgYWNyb3NzIHJ1biAgfCBPKE4gc3RlcHMpICB8XG4gKiB8IGBCb3VuZGFyeVN0YXRlVHJhY2tlcjxUU3RhdGU+YCAgfCB0cmFuc2llbnQgYnJhY2tldC1zY29wZWQgc3RhdGUgICAgICAgfCBsaXZlOyBjbGVhcnMgb24gc3RvcCB8IE8oSyBhY3RpdmUpIHxcbiAqXG4gKiAqKldoZW4gdG8gcGljayB3aGljaDoqKlxuICpcbiAqICAgLSBcIkkgbmVlZCB0byBrZWVwIGEgcGVybWFuZW50IGxvZyBvZiBldmVyeSBldmVudCBmb3IgdGltZS10cmF2ZWxcIlxuICogICAgICDihpIgYFNlcXVlbmNlUmVjb3JkZXI8VD5gXG4gKiAgIC0gXCJJIHdhbnQgb25lIGR1cmFibGUgcmVjb3JkIHBlciBzdGFnZSBleGVjdXRpb24gKGUuZy4sIG1ldHJpY3MpXCJcbiAqICAgICAg4oaSIGBLZXllZFJlY29yZGVyPFQ+YFxuICogICAtIFwiSSBuZWVkIHRvIGtub3cgd2hhdCdzIGhhcHBlbmluZyBSSUdIVCBOT1cgaW5zaWRlIGFuIGluLWZsaWdodFxuICogICAgIGJvdW5kYXJ5IChlLmcuLCBwYXJ0aWFsIExMTSBzdHJlYW0sIHBhcnRpYWwgdG9vbCBhcmdzKVwiXG4gKiAgICAgIOKGkiBgQm91bmRhcnlTdGF0ZVRyYWNrZXI8VFN0YXRlPmAgKHRoaXMgY2xhc3MpXG4gKlxuICogKipXaGF0IHRoaXMgaXMgTk9UIGZvcjoqKlxuICpcbiAqICAgLSBUaW1lLXRyYXZlbCBxdWVyaWVzIChcIndoYXQgd2FzIHRoZSBzdGF0ZSBhdCBwYXN0IHNsaWRlciBzdGVwIE4/XCIpXG4gKiAgICAg4oCUIHRyYW5zaWVudCBzdGF0ZSBjbGVhcnMgb24gc3RvcC4gRm9yIHRpbWUtdHJhdmVsLCBzbmFwc2hvdCB0aGVcbiAqICAgICBzdGF0ZSBhdCBlYWNoIGVtaXQgaW50byBhIHNlcGFyYXRlIGBTZXF1ZW5jZVJlY29yZGVyPFRTdGF0ZT5gLFxuICogICAgIG9yIHdhaXQgZm9yIGEgZnV0dXJlIGBCb3VuZGFyeVNuYXBzaG90UmVjb3JkZXI8VFN0YXRlPmAgcHJpbWl0aXZlLlxuICpcbiAqICAgLSBBZ2dyZWdhdGlvbnMgYWNyb3NzIHRoZSB3aG9sZSBydW4gKHRvdGFscywgY291bnRzKSDigJQgdGhvc2UgYXJlXG4gKiAgICAgYFNlcXVlbmNlUmVjb3JkZXIuYWdncmVnYXRlKClgIC8gYEtleWVkUmVjb3JkZXIuYWdncmVnYXRlKClgLlxuICpcbiAqICAgLSBTdGFnZS1sZXZlbCBjb25jZXJucyDigJQgdGhvc2UgdXNlIGBTY29wZVJlY29yZGVyLm9uU3RhZ2VTdGFydGAgL1xuICogICAgIGBTY29wZVJlY29yZGVyLm9uU3RhZ2VFbmRgLiBUaGlzIHByaW1pdGl2ZSBvcGVyYXRlcyBhdCBmaW5lclxuICogICAgIGdyYW51bGFyaXR5IChldmVudHMgZW1pdHRlZCBEVVJJTkcgYSBzdGFnZSBleGVjdXRpb24pLlxuICpcbiAqICoqTGlmZWN5Y2xlIGNvbnRyYWN0IOKAlCBTVFJJQ1Q6KipcbiAqXG4gKiAgIEV2ZXJ5IGBzdGFydEJvdW5kYXJ5KGtleSwgLi4uKWAgY2FsbCBNVVNUIGJlIHBhaXJlZCB3aXRoIGFcbiAqICAgYHN0b3BCb3VuZGFyeShrZXkpYCBjYWxsLiBGYWlsdXJlIHRvIHdpcmUgdGhlIHN0b3Agc2lkZSBwcm9kdWNlcyBhXG4gKiAgIG1lbW9yeSBsZWFrOiB0aGUgYWN0aXZlIG1hcCBncm93cyB3aXRob3V0IGJvdW5kLCBhbmQgYGdldEFsbEFjdGl2ZSgpYFxuICogICByZXR1cm5zIHN0YWxlIGVudHJpZXMgdGhhdCBsb29rIGluLWZsaWdodCBidXQgYXJlbid0LiBDb21tb24gY2F1c2U6XG4gKiAgIHN1YmNsYXNzIHdpcmVzIGBzdGFydGAgdG8gb25lIGV2ZW50IGhhbmRsZXIgYW5kIGZvcmdldHMgdG8gd2lyZVxuICogICBgc3RvcGAuICoqQWx3YXlzIHdpcmUgYm90aCBhdCB0aGUgc2FtZSB0aW1lLioqXG4gKlxuICogICBEZXYgbW9kZSAoYGVuYWJsZURldk1vZGUoKWApIGRldGVjdHMgbGVha3MgYXQgYGNsZWFyKClgIHRpbWUg4oCUXG4gKiAgIHdhcm5pbmcgaW5jbHVkZXMgdGhlIGxlYWtlZCBrZXlzIHNvIHlvdSBjYW4gZmluZCB0aGUgbWlzc2luZyB3aXJpbmcuXG4gKlxuICogKipDb25jdXJyZW5jeSAvIG5lc3Rpbmc6KipcbiAqXG4gKiAgIC0gQ29uY3VycmVudCBib3VuZGFyaWVzIChwYXJhbGxlbCBicmFuY2hlcyB3aXRoIHR3byBMTE0gY2FsbHNcbiAqICAgICBhY3RpdmUgYXQgb25jZSkgd29yayBjb3JyZWN0bHk6IGVhY2ggaXMga2V5ZWQgaW5kZXBlbmRlbnRseSBpblxuICogICAgIHRoZSBhY3RpdmUgbWFwLlxuICogICAtIE5lc3RlZCBib3VuZGFyaWVzIG9mIERJRkZFUkVOVCBLSU5EUyAoQWdlbnQgYm91bmRhcnkgY29udGFpbnNcbiAqICAgICBMTE0gYm91bmRhcnkpIHJlcXVpcmUgU0VQQVJBVEUgdHJhY2tlciBpbnN0YW5jZXMg4oCUIG9uZSBwZXIga2luZC5cbiAqICAgICBUaGUgYmFzZSBjbGFzcyB0cmFja3Mgb25lIGJvdW5kYXJ5IGtpbmQgcGVyIGluc3RhbmNlLlxuICpcbiAqICoqS2V5IGNvbnZlbnRpb246KipcbiAqXG4gKiAgIFRoZSBga2V5OiBzdHJpbmdgIGlzIHdoYXRldmVyIHlvdXIgc3ViY2xhc3MgcGlja3MuIENvbnZlbnRpb246XG4gKiAgIHVzZSBgcnVudGltZVN0YWdlSWRgIHdoZW4gdGhlIGJvdW5kYXJ5IG1hcHMgMToxIHRvIGEgc3RhZ2VcbiAqICAgZXhlY3V0aW9uIOKAlCB0aGlzIGdpdmVzIGZyZWUgaW50ZXJvcCB3aXRoIGBTZXF1ZW5jZVJlY29yZGVyXG4gKiAgIC5nZXRFbnRyaWVzRm9yU3RlcGAsIGBLZXllZFJlY29yZGVyLmdldEJ5S2V5YCwgYGZpbmRDb21taXRgIC9cbiAqICAgYGZpbmRMYXN0V3JpdGVyYCwgYW5kIHRoZSByZXN0IG9mIHRoZSB0cmFjZSBlY29zeXN0ZW0uIFVzZSBhIG1vcmVcbiAqICAgZ3JhbnVsYXIga2V5IChlLmcuLCBgdG9vbENhbGxJZGApIG9ubHkgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGVcbiAqICAgY29uY3VycmVudCBib3VuZGFyaWVzIFdJVEhJTiBvbmUgc3RhZ2UgZXhlY3V0aW9uLlxuICpcbiAqIEBleGFtcGxlIEJ1aWxkIGEgbGl2ZSBMTE0gdHJhY2tlciAoY29tYmluaW5nIHN0b3JhZ2UgKyBvYnNlcnZlcik6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHtcbiAqICAgQm91bmRhcnlTdGF0ZVRyYWNrZXIsXG4gKiAgIHR5cGUgQ29tYmluZWRSZWNvcmRlcixcbiAqICAgdHlwZSBFbWl0RXZlbnQsXG4gKiB9IGZyb20gJ2Zvb3RwcmludGpzJztcbiAqXG4gKiBpbnRlcmZhY2UgTExNTGl2ZVN0YXRlIHtcbiAqICAgcmVhZG9ubHkgcGFydGlhbDogc3RyaW5nO1xuICogICByZWFkb25seSB0b2tlbnM6IG51bWJlcjtcbiAqIH1cbiAqXG4gKiBjbGFzcyBMaXZlTExNVHJhY2tlclxuICogICBleHRlbmRzIEJvdW5kYXJ5U3RhdGVUcmFja2VyPExMTUxpdmVTdGF0ZT4gICAvLyBTVE9SQUdFIHNoZWxmXG4gKiAgIGltcGxlbWVudHMgQ29tYmluZWRSZWNvcmRlciAgICAgICAgICAgICAgICAgICAvLyBPQlNFUlZFUiBpbnRlcmZhY2VcbiAqIHtcbiAqICAgcmVhZG9ubHkgaWQgPSAnbGl2ZS1sbG0nO1xuICpcbiAqICAgLy8gT2JzZXJ2ZXIgaGFsZiDigJQgdHJhbnNsYXRlIGV2ZW50cyBpbnRvIGJyYWNrZXQgbXV0YXRpb25zLlxuICogICBvbkVtaXQoZXZlbnQ6IEVtaXRFdmVudCk6IHZvaWQge1xuICogICAgIGlmIChldmVudC5uYW1lID09PSAnYWdlbnRmb290cHJpbnQuc3RyZWFtLmxsbV9zdGFydCcpIHtcbiAqICAgICAgIHRoaXMuc3RhcnRCb3VuZGFyeShldmVudC5ydW50aW1lU3RhZ2VJZCwgeyBwYXJ0aWFsOiAnJywgdG9rZW5zOiAwIH0pO1xuICogICAgIH0gZWxzZSBpZiAoZXZlbnQubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LnN0cmVhbS5sbG1fZW5kJykge1xuICogICAgICAgdGhpcy5zdG9wQm91bmRhcnkoZXZlbnQucnVudGltZVN0YWdlSWQpO1xuICogICAgIH0gZWxzZSBpZiAoZXZlbnQubmFtZSA9PT0gJ2FnZW50Zm9vdHByaW50LnN0cmVhbS50b2tlbicpIHtcbiAqICAgICAgIHRoaXMudXBkYXRlQm91bmRhcnkoZXZlbnQucnVudGltZVN0YWdlSWQsIChzKSA9PiAoe1xuICogICAgICAgICBwYXJ0aWFsOiBzLnBhcnRpYWwgKyAoZXZlbnQucGF5bG9hZCBhcyB7IGNvbnRlbnQ6IHN0cmluZyB9KS5jb250ZW50LFxuICogICAgICAgICB0b2tlbnM6IHMudG9rZW5zICsgMSxcbiAqICAgICAgIH0pKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqXG4gKiAgIC8vIFB1YmxpYyByZWFkIEFQSSDigJQgTygxKSBhdCBhbnkgbW9tZW50LlxuICogICBpc0luRmxpZ2h0KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5oYXNBY3RpdmU7IH1cbiAqICAgZ2V0UGFydGlhbChzdGFnZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICogICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZShzdGFnZUlkKT8ucGFydGlhbCA/PyAnJztcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIEF0dGFjaGVkIHRoZSBzYW1lIHdheSBhcyBhbnkgb3RoZXIgQ29tYmluZWRSZWNvcmRlci5cbiAqIGNvbnN0IHRyYWNrZXIgPSBuZXcgTGl2ZUxMTVRyYWNrZXIoKTtcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIodHJhY2tlcik7XG4gKiBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAqXG4gKiAvLyBSZWFkIGxpdmUgc3RhdGUgYXQgYW55IHRpbWUgZHVyaW5nIG9yIGFmdGVyIHRoZSBydW4uXG4gKiB0cmFja2VyLmlzSW5GbGlnaHQoKTtcbiAqIHRyYWNrZXIuZ2V0UGFydGlhbChyaWQpO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vc2NvcGUvZGV0ZWN0Q2lyY3VsYXIuanMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQm91bmRhcnlTdGF0ZVRyYWNrZXI8VFN0YXRlPiB7XG4gIC8qKiBTdGFibGUgaWQg4oCUIHNhbWUgaWRlbXBvdGVuY3kgY29udHJhY3QgYXMgb3RoZXIgcmVjb3JkZXJzLiAqL1xuICBhYnN0cmFjdCByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKiBPcGVuLWJyYWNrZXRzIHN0YWNrOiBrZXkg4oaSIGN1cnJlbnQgdHJhbnNpZW50IHN0YXRlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFjdGl2ZSA9IG5ldyBNYXA8c3RyaW5nLCBUU3RhdGU+KCk7XG5cbiAgLyoqIFBlci1rZXkgY291bnQgb2YgYHVwZGF0ZUJvdW5kYXJ5YCBjYWxscyB0aGF0IGxhbmRlZCB3aXRob3V0IGFcbiAgICogIG1hdGNoaW5nIGFjdGl2ZSBib3VuZGFyeS4gRHJpdmVzIHJhdGUtbGltaXRlZCBkZXYtbW9kZSB3YXJuaW5nc1xuICAgKiAgc28gYSBzdHVjayBsb29wIGRvZXNuJ3Qgc3BhbSB0aGUgY29uc29sZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBtaXNzZWRVcGRhdGVzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuICAvLyDilIDilIAgTXV0YXRvciBBUEkgKHN1YmNsYXNzIGNhbGxzIHRoZXNlIGZyb20gb2JzZXJ2ZXIgaG9va3MpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBPcGVuIGEgbmV3IGJvdW5kYXJ5IHdpdGggaW5pdGlhbCB0cmFuc2llbnQgc3RhdGUuXG4gICAqXG4gICAqIElmIGEgYm91bmRhcnkgd2l0aCB0aGUgc2FtZSBga2V5YCBpcyBhbHJlYWR5IGFjdGl2ZSwgdGhlIHByaW9yXG4gICAqIHN0YXRlIGlzIG92ZXJ3cml0dGVuIChsYXN0LXdyaXRlci13aW5zKS4gSW4gZGV2IG1vZGUsIGEgd2FybmluZ1xuICAgKiBpcyBsb2dnZWQgYmVjYXVzZSByZS1zdGFydGluZyBhbiBhY3RpdmUga2V5IHVzdWFsbHkgaW5kaWNhdGVzIGFcbiAgICogbWlzc2VkIGBzdG9wQm91bmRhcnlgIGNhbGwgdXBzdHJlYW0uXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgQm91bmRhcnkgaWRlbnRpZmllciDigJQgYnkgY29udmVudGlvbiwgYHJ1bnRpbWVTdGFnZUlkYFxuICAgKiAgICAgICAgICAgIGZvciAxOjEtd2l0aC1zdGFnZSBib3VuZGFyaWVzLCBvciBhIG1vcmUgZ3JhbnVsYXIgaWRcbiAgICogICAgICAgICAgICAoZS5nLiwgYHRvb2xDYWxsSWRgKSB3aGVuIG11bHRpcGxlIGNvbmN1cnJlbnQgYm91bmRhcmllc1xuICAgKiAgICAgICAgICAgIHJ1biB3aXRoaW4gb25lIHN0YWdlIGV4ZWN1dGlvbi5cbiAgICogQHBhcmFtIGluaXRpYWwgSW5pdGlhbCBzdGF0ZSDigJQgdHlwZWQgYnkgYFRTdGF0ZWAuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhcnRCb3VuZGFyeShrZXk6IHN0cmluZywgaW5pdGlhbDogVFN0YXRlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlLmhhcyhrZXkpICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbJHt0aGlzLmlkfV0gc3RhcnRCb3VuZGFyeSgnJHtrZXl9JykgY2FsbGVkIHdoaWxlIGFuIGFjdGl2ZSBib3VuZGFyeSBhbHJlYWR5IGV4aXN0cy4gYCArXG4gICAgICAgICAgJ092ZXJ3cml0aW5nIHByaW9yIHN0YXRlIOKAlCBsaWtlbHkgYSBtaXNzZWQgc3RvcEJvdW5kYXJ5IHVwc3RyZWFtLicsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZS5zZXQoa2V5LCBpbml0aWFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdm9sdmUgdGhlIHRyYW5zaWVudCBzdGF0ZSBvZiBhbiBhY3RpdmUgYm91bmRhcnkgdXNpbmcgYW4gdXBkYXRlclxuICAgKiBmdW5jdGlvbi4gU2lsZW50IG5vLW9wIGlmIG5vIGJvdW5kYXJ5IGlzIGFjdGl2ZSBmb3IgYGtleWBcbiAgICogKGRlZmVuc2l2ZSBhZ2FpbnN0IG91dC1vZi1vcmRlciBldmVudHMpLiBJbiBkZXYgbW9kZSwgYSByYXRlLWxpbWl0ZWRcbiAgICogd2FybmluZyBpcyBsb2dnZWQgb24gdGhlIDFzdCwgMTB0aCwgYW5kIDEwMHRoIG1pc3NlZCB1cGRhdGUgcGVyIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAgICAgIEJvdW5kYXJ5IGlkZW50aWZpZXIgKG11c3QgbWF0Y2ggYSBwcmlvciBgc3RhcnRCb3VuZGFyeWApLlxuICAgKiBAcGFyYW0gdXBkYXRlciAgUHVyZSBmdW5jdGlvbjogcHJldmlvdXMgc3RhdGUg4oaSIG5leHQgc3RhdGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlQm91bmRhcnkoa2V5OiBzdHJpbmcsIHVwZGF0ZXI6IChwcmV2OiBUU3RhdGUpID0+IFRTdGF0ZSk6IHZvaWQge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuYWN0aXZlLmdldChrZXkpO1xuICAgIGlmIChjdXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnN0IG4gPSAodGhpcy5taXNzZWRVcGRhdGVzLmdldChrZXkpID8/IDApICsgMTtcbiAgICAgICAgdGhpcy5taXNzZWRVcGRhdGVzLnNldChrZXksIG4pO1xuICAgICAgICBpZiAobiA9PT0gMSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgWyR7dGhpcy5pZH1dIHVwZGF0ZUJvdW5kYXJ5KCcke2tleX0nKSDigJQgbm8gYWN0aXZlIGJvdW5kYXJ5LiBVcGRhdGUgZHJvcHBlZC5gKTtcbiAgICAgICAgfSBlbHNlIGlmIChuID09PSAxMCB8fCBuID09PSAxMDApIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFske3RoaXMuaWR9XSB1cGRhdGVCb3VuZGFyeSgnJHtrZXl9Jykg4oCUICR7bn0gZHJvcHBlZCB1cGRhdGVzLiBXaXJpbmcgYnVnP2ApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlLnNldChrZXksIHVwZGF0ZXIoY3VyKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGJvdW5kYXJ5IGlkZW50aWZpZWQgYnkgYGtleWAgYW5kIHJldHVybiBpdHMgRklOQUxcbiAgICogdHJhbnNpZW50IHN0YXRlIChmb3IgYW55IGNsZWFudXAgdGhlIHN1YmNsYXNzIHdhbnRzIOKAlCBlLmcuLCBlbWl0IGFcbiAgICogc25hcHNob3QgdG8gYSBTZXF1ZW5jZVJlY29yZGVyIGZvciBkdXJhYmxlIHN0b3JhZ2UpLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IEJvdW5kYXJ5IGlkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIFRoZSBmaW5hbCBzdGF0ZSwgb3IgYHVuZGVmaW5lZGAgaWYgbm8gYm91bmRhcnkgd2FzIGFjdGl2ZS5cbiAgICovXG4gIHByb3RlY3RlZCBzdG9wQm91bmRhcnkoa2V5OiBzdHJpbmcpOiBUU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZpbmFsID0gdGhpcy5hY3RpdmUuZ2V0KGtleSk7XG4gICAgdGhpcy5hY3RpdmUuZGVsZXRlKGtleSk7XG4gICAgcmV0dXJuIGZpbmFsO1xuICB9XG5cbiAgLy8g4pSA4pSAIFJlYWQgQVBJIChjb25zdW1lcnMgY2FsbCB0aGVzZSDigJQgTygxKSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEN1cnJlbnQgdHJhbnNpZW50IHN0YXRlIG9mIE9ORSBhY3RpdmUgYm91bmRhcnkuIGB1bmRlZmluZWRgIGlmIG5vXG4gICAqICBib3VuZGFyeSBpcyBhY3RpdmUgZm9yIGBrZXlgLiAqL1xuICBnZXRBY3RpdmUoa2V5OiBzdHJpbmcpOiBUU3RhdGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZS5nZXQoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgY3VycmVudGx5LWFjdGl2ZSBib3VuZGFyaWVzLlxuICAgKlxuICAgKiAqKlR5cGUtb25seSByZWFkb25seToqKiB0aGUgcmV0dXJuZWQgcmVmZXJlbmNlIElTIHRoZSBpbnRlcm5hbCBNYXAuXG4gICAqIFR5cGVTY3JpcHQgcHJldmVudHMgbXV0YXRpb24gdGhyb3VnaCB0aGUgYFJlYWRvbmx5TWFwYCB0eXBlLCBidXQgYVxuICAgKiBydW50aW1lIGNhc3Qgb3Igbm9uLVRTIGNvbnN1bWVyIGNhbiBtdXRhdGUgaXQgYW5kIGNvcnJ1cHQgaW50ZXJuYWxcbiAgICogc3RhdGUuICoqRG8gbm90IG11dGF0ZS4qKlxuICAgKi9cbiAgZ2V0QWxsQWN0aXZlKCk6IFJlYWRvbmx5TWFwPHN0cmluZywgVFN0YXRlPiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xuICB9XG5cbiAgLyoqIFRydWUgaWYgYW55IGJvdW5kYXJ5IGlzIGN1cnJlbnRseSBhY3RpdmUuIE8oMSkuICovXG4gIGdldCBoYXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlLnNpemUgPiAwO1xuICB9XG5cbiAgLyoqIE51bWJlciBvZiBjdXJyZW50bHktYWN0aXZlIGJvdW5kYXJpZXMuIE8oMSkuICovXG4gIGdldCBhY3RpdmVDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZS5zaXplO1xuICB9XG5cbiAgLy8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmVzZXQgYWxsIHRyYW5zaWVudCBzdGF0ZS4gQ2FsbGVkIGJ5IGV4ZWN1dG9ycyBiZWZvcmUgZWFjaCBgcnVuKClgXG4gICAqIHNvIGNvbnN1bWVycyBnZXQgYSBjbGVhbiBzbGF0ZSBwZXIgcnVuIOKAlCBzYW1lIGxpZmVjeWNsZSBjb250cmFjdFxuICAgKiBhcyBgU2VxdWVuY2VSZWNvcmRlci5jbGVhcigpYC5cbiAgICpcbiAgICogSW4gZGV2IG1vZGUsIHdhcm5zIGlmIGFueSBib3VuZGFyaWVzIGFyZSBzdGlsbCBhY3RpdmUgd2hlbiBjYWxsZWRcbiAgICog4oCUIGxpa2VseSBpbmRpY2F0ZXMgYSBtaXNzZWQgYHN0b3BCb3VuZGFyeWAgdXBzdHJlYW0uIFRoZSBsZWFrZWRcbiAgICoga2V5cyBhcmUgbGlzdGVkICh0cnVuY2F0ZWQgdG8gMTApIHNvIHRoZSB3aXJpbmcgYnVnIGlzIGZpbmRhYmxlLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZlLnNpemUgPiAwICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICBjb25zdCBrZXlzID0gWy4uLnRoaXMuYWN0aXZlLmtleXMoKV07XG4gICAgICBjb25zdCBoZWFkID0ga2V5cy5zbGljZSgwLCAxMCkuam9pbignLCAnKTtcbiAgICAgIGNvbnN0IG1vcmUgPSBrZXlzLmxlbmd0aCA+IDEwID8gYCAuLi4oKyR7a2V5cy5sZW5ndGggLSAxMH0gbW9yZSlgIDogJyc7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbJHt0aGlzLmlkfV0gY2xlYXIoKSBjYWxsZWQgd2l0aCAke3RoaXMuYWN0aXZlLnNpemV9IGAgK1xuICAgICAgICAgICdzdGlsbC1hY3RpdmUgYm91bmRhcmllcy4gTWlzc2VkIHN0b3BCb3VuZGFyeT8gJyArXG4gICAgICAgICAgYExlYWtlZCBrZXlzOiAke2hlYWR9JHttb3JlfWAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZS5jbGVhcigpO1xuICAgIHRoaXMubWlzc2VkVXBkYXRlcy5jbGVhcigpO1xuICB9XG59XG4iXX0=
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Before `CombinedRecorder`, a consumer who wanted to observe both streams
|
|
10
10
|
* had to:
|
|
11
|
-
* 1. Implement both `
|
|
11
|
+
* 1. Implement both `ScopeRecorder` (8 methods) and `FlowRecorder` (12 methods)
|
|
12
12
|
* fully — stubbing every event they didn't care about.
|
|
13
|
-
* 2. Remember to call BOTH `
|
|
13
|
+
* 2. Remember to call BOTH `attachScopeRecorder(r)` AND `attachFlowRecorder(r)`.
|
|
14
14
|
* Forgetting the second call silently dropped half their events — no
|
|
15
15
|
* warning, no runtime error.
|
|
16
16
|
* 3. Re-implement coordination logic (buffering, ordering) themselves.
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
*
|
|
38
38
|
* const audit: CombinedRecorder = {
|
|
39
39
|
* id: 'audit',
|
|
40
|
-
* onWrite: (e) => logWrite(e.key, e.value), //
|
|
40
|
+
* onWrite: (e) => logWrite(e.key, e.value), // ScopeRecorder method
|
|
41
41
|
* onDecision: (e) => logDecision(e.chosen), // FlowRecorder method
|
|
42
42
|
* };
|
|
43
43
|
*
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
*
|
|
48
48
|
* ## Contract with existing APIs
|
|
49
49
|
*
|
|
50
|
-
* - `
|
|
50
|
+
* - `attachScopeRecorder(r)` and `attachFlowRecorder(r)` remain unchanged.
|
|
51
51
|
* Consumers who want only ONE channel keep using them — explicit is good.
|
|
52
52
|
* - `attachCombinedRecorder(r)` is the ONLY way to guarantee an object is
|
|
53
53
|
* hooked into every stream it has methods for, without maintaining two
|
|
@@ -89,9 +89,9 @@ function isFlowEvent(event) {
|
|
|
89
89
|
}
|
|
90
90
|
exports.isFlowEvent = isFlowEvent;
|
|
91
91
|
/**
|
|
92
|
-
* Method names belonging to the `
|
|
92
|
+
* Method names belonging to the `ScopeRecorder` (data-flow) interface.
|
|
93
93
|
* Kept as a single source of truth so the runtime duck-type detector stays
|
|
94
|
-
* in sync with the interface. If a method is added to `
|
|
94
|
+
* in sync with the interface. If a method is added to `ScopeRecorder`, adding it
|
|
95
95
|
* here is the ONLY change required to route combined-recorders correctly.
|
|
96
96
|
*/
|
|
97
97
|
const RECORDER_EVENT_METHODS = [
|
|
@@ -187,10 +187,10 @@ function hasOwnOrClassMethod(r, m) {
|
|
|
187
187
|
*
|
|
188
188
|
* ## Return type
|
|
189
189
|
*
|
|
190
|
-
* Returns plain `boolean` (not a type predicate). The full `
|
|
190
|
+
* Returns plain `boolean` (not a type predicate). The full `ScopeRecorder`
|
|
191
191
|
* interface has payload types that diverge from `CombinedRecorder`'s union
|
|
192
192
|
* variants for shared methods, so a narrowing predicate would be unsound.
|
|
193
|
-
* Callers that need to treat the recorder as a `
|
|
193
|
+
* Callers that need to treat the recorder as a `ScopeRecorder` do so explicitly
|
|
194
194
|
* at the attach site — the cast is the contract that each channel passes
|
|
195
195
|
* its own payload variant.
|
|
196
196
|
*/
|
|
@@ -215,4 +215,4 @@ function hasEmitRecorderMethods(r) {
|
|
|
215
215
|
return EMIT_RECORDER_EVENT_METHODS.some((m) => hasOwnOrClassMethod(r, m));
|
|
216
216
|
}
|
|
217
217
|
exports.hasEmitRecorderMethods = hasEmitRecorderMethods;
|
|
218
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1REc7OztBQW1GSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsU0FBZ0IsV0FBVyxDQUFJLEtBQVE7SUFDckMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxPQUFRLEtBQWlDLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQztBQUNyRSxDQUFDO0FBSEQsa0NBR0M7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sc0JBQXNCLEdBQUc7SUFDN0IsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULGNBQWM7SUFDZCxZQUFZO0lBQ1osU0FBUztJQUNULFVBQVU7Q0FDRixDQUFDO0FBRVg7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSwyQkFBMkIsR0FBRztJQUNsQyxpQkFBaUI7SUFDakIsUUFBUTtJQUNSLFlBQVk7SUFDWixRQUFRO0lBQ1IsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YscUJBQXFCO0lBQ3JCLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0NBQ0YsQ0FBQztBQUVYOzs7O0dBSUc7QUFDSCxNQUFNLDJCQUEyQixHQUFHLENBQUMsUUFBUSxDQUFVLENBQUM7QUFFeEQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLENBQVUsRUFBRSxDQUFTO0lBQ2hELElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdEQsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0MsT0FBTyxPQUFRLENBQTZCLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxDQUFDO0lBQ2pFLENBQUM7SUFDRCxJQUFJLEtBQUssR0FBWSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25ELE9BQU8sT0FBUSxLQUFpQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLENBQW1CO0lBQ3BELE9BQU8sc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRkQsZ0RBRUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxDQUFtQjtJQUN4RCxPQUFPLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUZELHdEQUVDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLENBQW1CO0lBQ3hELE9BQU8sMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRkQsd0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbWJpbmVkUmVjb3JkZXIg4oCUIGEgc2luZ2xlIG9ic2VydmVyIHRoYXQgY2FuIGhvb2sgaW50byBNVUxUSVBMRSBldmVudFxuICogc3RyZWFtcyAoY3VycmVudGx5OiBzY29wZSBkYXRhLWZsb3cgKyBjb250cm9sLWZsb3cpLiBPbmUgb2JqZWN0LCBvbmUgYGlkYCxcbiAqIG9uZSBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIGV4ZWN1dGlvbi5cbiAqXG4gKiAjIyBXaHkgdGhpcyBleGlzdHNcbiAqXG4gKiBCZWZvcmUgYENvbWJpbmVkUmVjb3JkZXJgLCBhIGNvbnN1bWVyIHdobyB3YW50ZWQgdG8gb2JzZXJ2ZSBib3RoIHN0cmVhbXNcbiAqIGhhZCB0bzpcbiAqICAgMS4gSW1wbGVtZW50IGJvdGggYFJlY29yZGVyYCAoOCBtZXRob2RzKSBhbmQgYEZsb3dSZWNvcmRlcmAgKDEyIG1ldGhvZHMpXG4gKiAgICAgIGZ1bGx5IOKAlCBzdHViYmluZyBldmVyeSBldmVudCB0aGV5IGRpZG4ndCBjYXJlIGFib3V0LlxuICogICAyLiBSZW1lbWJlciB0byBjYWxsIEJPVEggYGF0dGFjaFJlY29yZGVyKHIpYCBBTkQgYGF0dGFjaEZsb3dSZWNvcmRlcihyKWAuXG4gKiAgICAgIEZvcmdldHRpbmcgdGhlIHNlY29uZCBjYWxsIHNpbGVudGx5IGRyb3BwZWQgaGFsZiB0aGVpciBldmVudHMg4oCUIG5vXG4gKiAgICAgIHdhcm5pbmcsIG5vIHJ1bnRpbWUgZXJyb3IuXG4gKiAgIDMuIFJlLWltcGxlbWVudCBjb29yZGluYXRpb24gbG9naWMgKGJ1ZmZlcmluZywgb3JkZXJpbmcpIHRoZW1zZWx2ZXMuXG4gKlxuICogYENvbWJpbmVkUmVjb3JkZXJgIGNvbGxhcHNlcyB0aGF0IGludG8gYSBzaW5nbGUgdHlwZSBhbmQgYSBzaW5nbGUgYXR0YWNoXG4gKiBjYWxsIChgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyKWApLCB3aXRoIHRoZSBsaWJyYXJ5IGhhbmRsaW5nIHRoZVxuICogcm91dGluZyBpbnRlcm5hbGx5LiBDb25zdW1lcnMgaW1wbGVtZW50IG9ubHkgdGhlIGV2ZW50cyB0aGV5IGNhcmUgYWJvdXRcbiAqIChgUGFydGlhbDwuLi4+YCkgYW5kIHRoZSBhdHRhY2ggbWV0aG9kIGR1Y2stdHlwZXMgYXQgcnVudGltZSB0byBkaXNwYXRjaFxuICogdG8gdGhlIHJlbGV2YW50IGNoYW5uZWxzLlxuICpcbiAqICMjIEZvcndhcmQgY29tcGF0aWJpbGl0eVxuICpcbiAqIFdoZW4gYSB0aGlyZCBvYnNlcnZlciB0eXBlIGlzIGFkZGVkIChlLmcuIGFuIGBPcGVyYXRpb25SZWNvcmRlcmApLCB0aGVcbiAqIGBDb21iaW5lZFJlY29yZGVyYCB0eXBlIGdhaW5zIGFuIGAmIFBhcnRpYWw8T3BlcmF0aW9uUmVjb3JkZXI+YCBjbGF1c2UgYW5kXG4gKiBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcmAgZ2FpbnMgb25lIG1vcmUgcnVudGltZSBicmFuY2ggaW4gaXRzIGRpc3BhdGNoLlxuICogQ29uc3VtZXJzIHdyaXRpbmcgYSBgQ29tYmluZWRSZWNvcmRlcmAgdG9kYXkgYXJlIE5PVCBhZmZlY3RlZCDigJQgdGhlaXJcbiAqIGNvZGUga2VlcHMgY29tcGlsaW5nIGFuZCBhdHRhY2hpbmcgY29ycmVjdGx5LCBiZWNhdXNlIGV2ZXJ5IG5ldyBsYXllciBpc1xuICogb3B0aW9uYWwuXG4gKlxuICogIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJ2Zvb3RwcmludGpzJztcbiAqXG4gKiBjb25zdCBhdWRpdDogQ29tYmluZWRSZWNvcmRlciA9IHtcbiAqICAgaWQ6ICdhdWRpdCcsXG4gKiAgIG9uV3JpdGU6IChlKSA9PiBsb2dXcml0ZShlLmtleSwgZS52YWx1ZSksICAgICAgICAvLyBSZWNvcmRlciBtZXRob2RcbiAqICAgb25EZWNpc2lvbjogKGUpID0+IGxvZ0RlY2lzaW9uKGUuY2hvc2VuKSwgICAgICAgIC8vIEZsb3dSZWNvcmRlciBtZXRob2RcbiAqIH07XG4gKlxuICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihhdWRpdCk7XG4gKiAvLyBeIGludGVybmFsbHk6IGRldGVjdHMgYm90aCBzZXRzIG9mIG1ldGhvZHMsIHJvdXRlcyB0byBib3RoIGNoYW5uZWxzLlxuICogYGBgXG4gKlxuICogIyMgQ29udHJhY3Qgd2l0aCBleGlzdGluZyBBUElzXG4gKlxuICogLSBgYXR0YWNoUmVjb3JkZXIocilgIGFuZCBgYXR0YWNoRmxvd1JlY29yZGVyKHIpYCByZW1haW4gdW5jaGFuZ2VkLlxuICogICBDb25zdW1lcnMgd2hvIHdhbnQgb25seSBPTkUgY2hhbm5lbCBrZWVwIHVzaW5nIHRoZW0g4oCUIGV4cGxpY2l0IGlzIGdvb2QuXG4gKiAtIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyKHIpYCBpcyB0aGUgT05MWSB3YXkgdG8gZ3VhcmFudGVlIGFuIG9iamVjdCBpc1xuICogICBob29rZWQgaW50byBldmVyeSBzdHJlYW0gaXQgaGFzIG1ldGhvZHMgZm9yLCB3aXRob3V0IG1haW50YWluaW5nIHR3b1xuICogICBhdHRhY2ggY2FsbHMgYXQgdGhlIGNhbGwgc2l0ZS5cbiAqIC0gSWRlbXBvdGVuY3kgYnkgYGlkYCBpcyBwcmVzZXJ2ZWQgYWNyb3NzIGNoYW5uZWxzOiByZS1hdHRhY2hpbmcgd2l0aCB0aGVcbiAqICAgc2FtZSBgaWRgIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBvbiBCT1RIIGNoYW5uZWxzLCBub3QganVzdCBvbmUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBGbG93RXJyb3JFdmVudCwgRmxvd1BhdXNlRXZlbnQsIEZsb3dSZWNvcmRlciwgRmxvd1Jlc3VtZUV2ZW50IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEVycm9yRXZlbnQsIFBhdXNlRXZlbnQsIFJlY29yZGVyLCBSZXN1bWVFdmVudCB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi9FbWl0UmVjb3JkZXIuanMnO1xuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyB0aGF0IGFwcGVhciBvbiBCT1RIIGBSZWNvcmRlcmAgYW5kIGBGbG93UmVjb3JkZXJgIGJ1dCB3aXRoXG4gKiBkaWZmZXJlbnQgZXZlbnQgcGF5bG9hZCB0eXBlcy4gRm9yIHRoZXNlLCBhIGBDb21iaW5lZFJlY29yZGVyYCBkZWNsYXJlc1xuICogT05FIGhhbmRsZXIgdGhhdCByZWNlaXZlcyB0aGUgdW5pb24gb2YgYm90aCBwYXlsb2FkcyDigJQgY29uc3VtZXJzXG4gKiBkaXNjcmltaW5hdGUgb24gYHRyYXZlcnNhbENvbnRleHRgLCB3aGljaCBvbmx5IGNvbnRyb2wtZmxvdyBldmVudHMgY2FycnkuXG4gKi9cbnR5cGUgU2hhcmVkTGlmZWN5Y2xlT3ZlcmxhcCA9ICdvbkVycm9yJyB8ICdvblBhdXNlJyB8ICdvblJlc3VtZSc7XG5cbi8qKiBMaWZlY3ljbGUgaG9va3MgKG5vdCBldmVudC1zcGVjaWZpYykgdGhhdCBib3RoIGludGVyZmFjZXMgc2hhcmUgaWRlbnRpY2FsbHkuICovXG50eXBlIFNoYXJlZExpZmVjeWNsZSA9ICdpZCcgfCAnY2xlYXInIHwgJ3RvU25hcHNob3QnO1xuXG4vKipcbiAqIEEgcmVjb3JkZXIgdGhhdCBNQVkgb2JzZXJ2ZSBhbnkgY29tYmluYXRpb24gb2Ygc3VwcG9ydGVkIGV2ZW50IHN0cmVhbXMuXG4gKlxuICogVG9kYXkncyBzdHJlYW1zOlxuICogICAtIFNjb3BlIGRhdGEtZmxvdyAoYFJlY29yZGVyYDogb25SZWFkL29uV3JpdGUvb25Db21taXQvb25TdGFnZVN0YXJ0L+KApilcbiAqICAgLSBDb250cm9sLWZsb3cgKGBGbG93UmVjb3JkZXJgOiBvbkRlY2lzaW9uL29uU3ViZmxvd0VudHJ5L29uTG9vcC/igKYpXG4gKlxuICogQWxsIGV2ZW50IGhhbmRsZXJzIGFyZSBvcHRpb25hbCDigJQgaW1wbGVtZW50IG9ubHkgd2hhdCB5b3UgY2FyZSBhYm91dC5cbiAqIGBpZGAgaXMgcmVxdWlyZWQgc28gdGhlIGxpYnJhcnkgY2FuIGRlZHVwbGljYXRlIHJlLWF0dGFjaGVzLlxuICpcbiAqICMjIFNoYXJlZCBtZXRob2QgbmFtZXMgKG9uRXJyb3IgLyBvblBhdXNlIC8gb25SZXN1bWUpXG4gKlxuICogQm90aCBgUmVjb3JkZXJgIGFuZCBgRmxvd1JlY29yZGVyYCBkZWNsYXJlIHRoZXNlIHdpdGggRElGRkVSRU5UIHBheWxvYWRcbiAqIHNoYXBlcy4gSW4gYSBjb21iaW5lZCByZWNvcmRlciwgZWFjaCBzdWNoIGhhbmRsZXIgaXMgY2FsbGVkIGJ5IEJPVEhcbiAqIGNoYW5uZWxzIHdpdGggaXRzIG93biB2YXJpYW50LiBUaGUgcGFyYW1ldGVyIHR5cGUgaXMgYSB1bmlvbiDigJQgY29uc3VtZXJzXG4gKiBjYW4gZWl0aGVyIGhhbmRsZSBib3RoIHZhcmlhbnRzIHVuaWZvcm1seSwgb3IgZGlzY3JpbWluYXRlIChjb250cm9sLWZsb3dcbiAqIHZhcmlhbnRzIGNhcnJ5IGEgYHRyYXZlcnNhbENvbnRleHRgIGZpZWxkIHRoYXQgZGF0YS1mbG93IHZhcmlhbnRzIGxhY2spLlxuICpcbiAqICMjIEZvcndhcmQgY29tcGF0aWJpbGl0eVxuICpcbiAqIFdoZW4gYSB0aGlyZCBvYnNlcnZlciB0eXBlIHNoaXBzIChlLmcuIGBPcGVyYXRpb25SZWNvcmRlcmApLCB0aGUgdHlwZVxuICogZ2FpbnMgYW5vdGhlciBgJiBQYXJ0aWFsPOKApj5gIGNsYXVzZS4gQmVjYXVzZSBldmVyeSBjbGF1c2UgaXMgYFBhcnRpYWxgLFxuICogZXhpc3RpbmcgYENvbWJpbmVkUmVjb3JkZXJgIGltcGxlbWVudGF0aW9ucyByZW1haW4gdHlwZS12YWxpZC5cbiAqL1xuZXhwb3J0IHR5cGUgQ29tYmluZWRSZWNvcmRlciA9IFBhcnRpYWw8T21pdDxSZWNvcmRlciwgU2hhcmVkTGlmZWN5Y2xlT3ZlcmxhcCB8IFNoYXJlZExpZmVjeWNsZT4+ICZcbiAgUGFydGlhbDxPbWl0PEZsb3dSZWNvcmRlciwgU2hhcmVkTGlmZWN5Y2xlT3ZlcmxhcCB8IFNoYXJlZExpZmVjeWNsZT4+ICZcbiAgLy8gRW1pdCBjaGFubmVsIOKAlCBuZXcgdGhpcmQgc3RyZWFtIChQaGFzZSAzKS4gTm8gbWV0aG9kLW5hbWUgb3ZlcmxhcCB3aXRoXG4gIC8vIHRoZSBvdGhlciB0d28gaW50ZXJmYWNlcywgc28gYSBwbGFpbiBpbnRlcnNlY3Rpb24gaXMgc291bmQg4oCUIG5vXG4gIC8vIHVuaW9uLXBheWxvYWQgZGlzY3JpbWluYXRvciBuZWVkZWQuXG4gIFBhcnRpYWw8T21pdDxFbWl0UmVjb3JkZXIsIFNoYXJlZExpZmVjeWNsZT4+ICYge1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgICAvLyBTaGFyZWQgbGlmZWN5Y2xlIGhvb2tzIOKAlCBzYW1lIG9uIGJvdGggaW50ZXJmYWNlcywgc2hhcGUgY29tcGF0aWJsZS5cbiAgICBjbGVhcj8oKTogdm9pZDtcbiAgICB0b1NuYXBzaG90PygpOiB7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbj86ICd0cmFuc2xhdGUnIHwgJ2FjY3VtdWxhdGUnIHwgJ2FnZ3JlZ2F0ZSc7XG4gICAgICBkYXRhOiB1bmtub3duO1xuICAgIH07XG5cbiAgICAvLyBTaGFyZWQgZXZlbnQgbWV0aG9kIG5hbWVzIHdpdGggRElWRVJHRU5UIHBheWxvYWRzIOKAlCBkZWNsYXJlZCBhcyB1bmlvbnMuXG4gICAgLy8gQ29uc3VtZXJzIGVpdGhlciBoYW5kbGUgYm90aCB2YXJpYW50cywgb3IgZGlzY3JpbWluYXRlIHVzaW5nIHRoZVxuICAgIC8vIGV4cG9ydGVkIGhlbHBlciBgaXNGbG93RXZlbnQoKWAgKHdoaWNoIGNoZWNrcyBmb3IgdGhlXG4gICAgLy8gYHRyYXZlcnNhbENvbnRleHRgIGZpZWxkIOKAlCBwcmVzZW50IG9ubHkgb24gY29udHJvbC1mbG93IHZhcmlhbnRzKS5cbiAgICAvL1xuICAgIC8vIEBleGFtcGxlXG4gICAgLy8gYGBgdHNcbiAgICAvLyBjb25zdCBhdWRpdDogQ29tYmluZWRSZWNvcmRlciA9IHtcbiAgICAvLyAgIGlkOiAnYXVkaXQnLFxuICAgIC8vICAgb25FcnJvcjogKGUpID0+IHtcbiAgICAvLyAgICAgaWYgKGlzRmxvd0V2ZW50KGUpKSB7XG4gICAgLy8gICAgICAgLy8gZSBpcyBGbG93RXJyb3JFdmVudCDigJQgaGFzIHN0YWdlTmFtZSwgbWVzc2FnZSwgc3RydWN0dXJlZEVycm9yXG4gICAgLy8gICAgICAgbG9nKCdmbG93IGVycm9yIGluIHN0YWdlJywgZS5zdGFnZU5hbWUpO1xuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgIC8vIGUgaXMgRXJyb3JFdmVudCDigJQgaGFzIGVycm9yLCBvcGVyYXRpb24sIGtleT9cbiAgICAvLyAgICAgICBsb2coJ3Njb3BlIGVycm9yIGR1cmluZycsIGUub3BlcmF0aW9uLCBlLmVycm9yLm1lc3NhZ2UpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9LFxuICAgIC8vIH07XG4gICAgLy8gYGBgXG4gICAgb25FcnJvcj8oZXZlbnQ6IEVycm9yRXZlbnQgfCBGbG93RXJyb3JFdmVudCk6IHZvaWQ7XG4gICAgb25QYXVzZT8oZXZlbnQ6IFBhdXNlRXZlbnQgfCBGbG93UGF1c2VFdmVudCk6IHZvaWQ7XG4gICAgb25SZXN1bWU/KGV2ZW50OiBSZXN1bWVFdmVudCB8IEZsb3dSZXN1bWVFdmVudCk6IHZvaWQ7XG4gIH07XG5cbi8qKlxuICogRGlzY3JpbWluYXRvciBmb3IgdGhlIHVuaW9uIHBheWxvYWQgdHlwZXMgb24gYENvbWJpbmVkUmVjb3JkZXJgJ3Mgc2hhcmVkXG4gKiBtZXRob2RzIChgb25FcnJvcmAsIGBvblBhdXNlYCwgYG9uUmVzdW1lYCkuIFJldHVybnMgYHRydWVgIGlmIHRoZSBldmVudFxuICogd2FzIGVtaXR0ZWQgZnJvbSB0aGUgY29udHJvbC1mbG93IGNoYW5uZWwgKEZsb3dSZWNvcmRlcikuXG4gKlxuICogIyMgSG93IGl0IGRpc2NyaW1pbmF0ZXNcbiAqXG4gKiBTY29wZS1jaGFubmVsIGV2ZW50cyBleHRlbmQgYFJlY29yZGVyQ29udGV4dGAsIHdoaWNoIGNhcnJpZXMgYHBpcGVsaW5lSWRgLlxuICogRmxvdy1jaGFubmVsIGV2ZW50cyBkbyBub3QgY2FycnkgYHBpcGVsaW5lSWRgICh0aGV5IGNhcnJ5IGFuIG9wdGlvbmFsXG4gKiBgdHJhdmVyc2FsQ29udGV4dGAgaW5zdGVhZCwgYnV0IHRoYXQgZmllbGQgaXMgb3B0aW9uYWwgYW5kIGNhbm5vdCBiZVxuICogcmVsaWVkIG9uIGFzIGEgcG9zaXRpdmUgc2lnbmFsKS4gV2UgZGV0ZWN0IHRoZSBmbG93IHZhcmlhbnQgYnkgdGhlXG4gKiBBQlNFTkNFIG9mIGBwaXBlbGluZUlkYCDigJQgdGhpcyBpcyBzY2hlbWEtc3RhYmxlIGFzIGxvbmcgYXMgc2NvcGUgZXZlbnRzXG4gKiBjb250aW51ZSB0byBleHRlbmQgYFJlY29yZGVyQ29udGV4dGAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBvbkVycm9yOiAoZSkgPT4ge1xuICogICBpZiAoaXNGbG93RXZlbnQoZSkpIHtcbiAqICAgICAvLyBOYXJyb3dlZCB0byBGbG93RXJyb3JFdmVudDogaGFzIHN0YWdlTmFtZSwgbWVzc2FnZSwgc3RydWN0dXJlZEVycm9yXG4gKiAgIH0gZWxzZSB7XG4gKiAgICAgLy8gTmFycm93ZWQgdG8gRXJyb3JFdmVudDogaGFzIGVycm9yLCBvcGVyYXRpb24sIGtleT9cbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zsb3dFdmVudDxUPihldmVudDogVCk6IGV2ZW50IGlzIEV4Y2x1ZGU8VCwgeyBwaXBlbGluZUlkOiBzdHJpbmcgfT4ge1xuICBpZiAodHlwZW9mIGV2ZW50ICE9PSAnb2JqZWN0JyB8fCBldmVudCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKGV2ZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5waXBlbGluZUlkID09PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTWV0aG9kIG5hbWVzIGJlbG9uZ2luZyB0byB0aGUgYFJlY29yZGVyYCAoZGF0YS1mbG93KSBpbnRlcmZhY2UuXG4gKiBLZXB0IGFzIGEgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBzbyB0aGUgcnVudGltZSBkdWNrLXR5cGUgZGV0ZWN0b3Igc3RheXNcbiAqIGluIHN5bmMgd2l0aCB0aGUgaW50ZXJmYWNlLiBJZiBhIG1ldGhvZCBpcyBhZGRlZCB0byBgUmVjb3JkZXJgLCBhZGRpbmcgaXRcbiAqIGhlcmUgaXMgdGhlIE9OTFkgY2hhbmdlIHJlcXVpcmVkIHRvIHJvdXRlIGNvbWJpbmVkLXJlY29yZGVycyBjb3JyZWN0bHkuXG4gKi9cbmNvbnN0IFJFQ09SREVSX0VWRU5UX01FVEhPRFMgPSBbXG4gICdvblJlYWQnLFxuICAnb25Xcml0ZScsXG4gICdvbkNvbW1pdCcsXG4gICdvbkVycm9yJyxcbiAgJ29uU3RhZ2VTdGFydCcsXG4gICdvblN0YWdlRW5kJyxcbiAgJ29uUGF1c2UnLFxuICAnb25SZXN1bWUnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBNZXRob2QgbmFtZXMgYmVsb25naW5nIHRvIHRoZSBgRmxvd1JlY29yZGVyYCAoY29udHJvbC1mbG93KSBpbnRlcmZhY2UuXG4gKiBTZWUgdGhlIG5vdGUgb24gYFJFQ09SREVSX0VWRU5UX01FVEhPRFNgLlxuICpcbiAqIE5PVEU6IHRoZSBgb25FcnJvcmAsIGBvblBhdXNlYCwgYG9uUmVzdW1lYCBtZXRob2RzIGV4aXN0IG9uIEJPVEggaW50ZXJmYWNlc1xuICogd2l0aCBESUZGRVJFTlQgZXZlbnQgcGF5bG9hZCBzaGFwZXMuIEEgYENvbWJpbmVkUmVjb3JkZXJgIHRoYXQgaW1wbGVtZW50c1xuICogYW55IG9mIHRoZXNlIHJlY2VpdmVzIGJvdGggdmFyaWFudHMgKG9uZSBmcm9tIGVhY2ggY2hhbm5lbCkuIENvbnN1bWVycyB3aG9cbiAqIGNhcmUgYWJvdXQgdGhlIGRpc3RpbmN0aW9uIGNhbiBkaXNjcmltaW5hdGUgb24gdGhlIHByZXNlbmNlIG9mXG4gKiBgdHJhdmVyc2FsQ29udGV4dGAgKHdoaWNoIG9ubHkgY29udHJvbC1mbG93IGV2ZW50cyBjYXJyeSkuXG4gKi9cbmNvbnN0IEZMT1dfUkVDT1JERVJfRVZFTlRfTUVUSE9EUyA9IFtcbiAgJ29uU3RhZ2VFeGVjdXRlZCcsXG4gICdvbk5leHQnLFxuICAnb25EZWNpc2lvbicsXG4gICdvbkZvcmsnLFxuICAnb25TZWxlY3RlZCcsXG4gICdvblN1YmZsb3dFbnRyeScsXG4gICdvblN1YmZsb3dFeGl0JyxcbiAgJ29uU3ViZmxvd1JlZ2lzdGVyZWQnLFxuICAnb25Mb29wJyxcbiAgJ29uQnJlYWsnLFxuICAnb25FcnJvcicsXG4gICdvblBhdXNlJyxcbiAgJ29uUmVzdW1lJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogTWV0aG9kIG5hbWVzIGJlbG9uZ2luZyB0byB0aGUgYEVtaXRSZWNvcmRlcmAgKHVzZXItZW1pdHRlZCBldmVudHMpXG4gKiBpbnRlcmZhY2UuIFNhbWUgY29udmVudGlvbiBhcyB0aGUgb3RoZXIgdHdvIGFycmF5cyBhYm92ZSDigJQga2VwdCBhc1xuICogdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGR1Y2stdHlwZSBkZXRlY3Rpb24uXG4gKi9cbmNvbnN0IEVNSVRfUkVDT1JERVJfRVZFTlRfTUVUSE9EUyA9IFsnb25FbWl0J10gYXMgY29uc3Q7XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJlY29yZGVyIGRlY2xhcmVzIGEgbWV0aG9kIG5hbWVkIGBtYCBlaXRoZXIgYXMgYW4gb3duXG4gKiBwcm9wZXJ0eSBPUiBvbiBpdHMgY2xhc3MtcHJvdG90eXBlIGNoYWluIOKAlCBidXQgTk9UIGluaGVyaXRlZCBmcm9tXG4gKiBgT2JqZWN0LnByb3RvdHlwZWAuXG4gKlxuICogIyMgV2h5IHRoaXMgbGF5ZXJlZCBjaGVja1xuICpcbiAqIEEgYENvbWJpbmVkUmVjb3JkZXJgIGNhbiBiZSBlaXRoZXIgYSBwbGFpbiBvYmplY3QgbGl0ZXJhbCAoaGFuZGxlcnMgYXNcbiAqIG93biBwcm9wZXJ0aWVzKSBPUiBhIGNsYXNzIGluc3RhbmNlIChoYW5kbGVycyBhcyBjbGFzcy1wcm90b3R5cGVcbiAqIG1ldGhvZHMpLiBCb3RoIGFyZSBsZWdpdGltYXRlIGNvbnN1bWVyIHBhdHRlcm5zIGFuZCBib3RoIE1VU1QgYXR0YWNoLlxuICpcbiAqIEJ1dCBoYW5kbGVycyBpbmhlcml0ZWQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYXJlIEFMV0FZUyBhY2NpZGVudGFsIG9yXG4gKiBtYWxpY2lvdXMgKG5vYm9keSBsZWdpdGltYXRlbHkgYXR0YWNoZXMgcmVjb3JkZXIgbWV0aG9kcyB0aGVyZSkuIFNvIHdlXG4gKiB3YWxrIHRoZSBwcm90b3R5cGUgY2hhaW4sIFNUT1BQSU5HIGJlZm9yZSBgT2JqZWN0LnByb3RvdHlwZWAuIFRoaXNcbiAqIGFjY2VwdHMgY2xhc3MgbWV0aG9kcyB3aGlsZSBzdGlsbCBibG9ja2luZyBgT2JqZWN0LnByb3RvdHlwZWBcbiAqIHBvbGx1dGlvbiBhdHRhY2tzLlxuICovXG5mdW5jdGlvbiBoYXNPd25PckNsYXNzTWV0aG9kKHI6IHVua25vd24sIG06IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAociA9PT0gbnVsbCB8fCB0eXBlb2YgciAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLCBtKSkge1xuICAgIHJldHVybiB0eXBlb2YgKHIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW21dID09PSAnZnVuY3Rpb24nO1xuICB9XG4gIGxldCBwcm90bzogdW5rbm93biA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtcbiAgd2hpbGUgKHByb3RvICE9PSBudWxsICYmIHByb3RvICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgbSkpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgKHByb3RvIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVttXSA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgaW1wbGVtZW50cyBhdCBsZWFzdCBvbmUgZGF0YS1mbG93IGV2ZW50IG1ldGhvZC5cbiAqIFVzZWQgYnkgYGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXJgIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGhvb2sgaW50b1xuICogdGhlIHNjb3BlIGRhdGEtZmxvdyBjaGFubmVsLlxuICpcbiAqICMjIERldGVjdGlvbiBydWxlXG4gKlxuICogQWNjZXB0cyBib3RoIG9iamVjdC1saXRlcmFsIHJlY29yZGVycyAob3duLXByb3BlcnR5IGhhbmRsZXJzKSBBTkQgY2xhc3NcbiAqIGluc3RhbmNlcyAoaGFuZGxlcnMgZGVjbGFyZWQgb24gdGhlIGNsYXNzIHByb3RvdHlwZSkuIFJlamVjdHMgaGFuZGxlcnNcbiAqIGluaGVyaXRlZCBmcm9tIGBPYmplY3QucHJvdG90eXBlYCDigJQgdGhhdCdzIGFsd2F5cyBhY2NpZGVudGFsIG9yXG4gKiBtYWxpY2lvdXMgcG9sbHV0aW9uLCBuZXZlciBhIGxlZ2l0aW1hdGUgcmVjb3JkZXIuXG4gKlxuICogIyMgTGlmZWN5Y2xlIGV4Y2x1c2lvbnNcbiAqXG4gKiBgY2xlYXJgIGFuZCBgdG9TbmFwc2hvdGAgYXJlIE5PVCBjb3VudGVkIGFzIGV2ZW50IG1ldGhvZHMg4oCUIGEgcmVjb3JkZXJcbiAqIHRoYXQgb25seSBpbXBsZW1lbnRzIHRob3NlIGhhcyBub3RoaW5nIHRvIG9ic2VydmUgYW5kIHdvdWxkIGJlIGEgbm8tb3BcbiAqIG9uIGVpdGhlciBjaGFubmVsLlxuICpcbiAqICMjIFJldHVybiB0eXBlXG4gKlxuICogUmV0dXJucyBwbGFpbiBgYm9vbGVhbmAgKG5vdCBhIHR5cGUgcHJlZGljYXRlKS4gVGhlIGZ1bGwgYFJlY29yZGVyYFxuICogaW50ZXJmYWNlIGhhcyBwYXlsb2FkIHR5cGVzIHRoYXQgZGl2ZXJnZSBmcm9tIGBDb21iaW5lZFJlY29yZGVyYCdzIHVuaW9uXG4gKiB2YXJpYW50cyBmb3Igc2hhcmVkIG1ldGhvZHMsIHNvIGEgbmFycm93aW5nIHByZWRpY2F0ZSB3b3VsZCBiZSB1bnNvdW5kLlxuICogQ2FsbGVycyB0aGF0IG5lZWQgdG8gdHJlYXQgdGhlIHJlY29yZGVyIGFzIGEgYFJlY29yZGVyYCBkbyBzbyBleHBsaWNpdGx5XG4gKiBhdCB0aGUgYXR0YWNoIHNpdGUg4oCUIHRoZSBjYXN0IGlzIHRoZSBjb250cmFjdCB0aGF0IGVhY2ggY2hhbm5lbCBwYXNzZXNcbiAqIGl0cyBvd24gcGF5bG9hZCB2YXJpYW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUmVjb3JkZXJNZXRob2RzKHI6IENvbWJpbmVkUmVjb3JkZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIFJFQ09SREVSX0VWRU5UX01FVEhPRFMuc29tZSgobSkgPT4gaGFzT3duT3JDbGFzc01ldGhvZChyLCBtKSk7XG59XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJlY29yZGVyIGltcGxlbWVudHMgYXQgbGVhc3Qgb25lIGNvbnRyb2wtZmxvdyBldmVudCBtZXRob2QuXG4gKiBTZWUgYGhhc1JlY29yZGVyTWV0aG9kc2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNGbG93UmVjb3JkZXJNZXRob2RzKHI6IENvbWJpbmVkUmVjb3JkZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIEZMT1dfUkVDT1JERVJfRVZFTlRfTUVUSE9EUy5zb21lKChtKSA9PiBoYXNPd25PckNsYXNzTWV0aG9kKHIsIG0pKTtcbn1cblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgaW1wbGVtZW50cyBhdCBsZWFzdCBvbmUgZW1pdC1jaGFubmVsIGV2ZW50IG1ldGhvZC5cbiAqIFNlZSBgaGFzUmVjb3JkZXJNZXRob2RzYCBmb3IgdGhlIG93bmVyc2hpcC1kZXRlY3Rpb24gcnVsZXMgKG93biBvclxuICogY2xhc3MtcHJvdG90eXBlIG1ldGhvZHMgY291bnQ7IGBPYmplY3QucHJvdG90eXBlYCBwb2xsdXRpb24gZG9lcyBub3QpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRW1pdFJlY29yZGVyTWV0aG9kcyhyOiBDb21iaW5lZFJlY29yZGVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBFTUlUX1JFQ09SREVSX0VWRU5UX01FVEhPRFMuc29tZSgobSkgPT4gaGFzT3duT3JDbGFzc01ldGhvZChyLCBtKSk7XG59XG4iXX0=
|
|
218
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tYmluZWRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1REc7OztBQW1GSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsU0FBZ0IsV0FBVyxDQUFJLEtBQVE7SUFDckMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUk7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxPQUFRLEtBQWlDLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQztBQUNyRSxDQUFDO0FBSEQsa0NBR0M7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sc0JBQXNCLEdBQUc7SUFDN0IsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0lBQ1YsU0FBUztJQUNULGNBQWM7SUFDZCxZQUFZO0lBQ1osU0FBUztJQUNULFVBQVU7Q0FDRixDQUFDO0FBRVg7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSwyQkFBMkIsR0FBRztJQUNsQyxpQkFBaUI7SUFDakIsUUFBUTtJQUNSLFlBQVk7SUFDWixRQUFRO0lBQ1IsWUFBWTtJQUNaLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YscUJBQXFCO0lBQ3JCLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxVQUFVO0NBQ0YsQ0FBQztBQUVYOzs7O0dBSUc7QUFDSCxNQUFNLDJCQUEyQixHQUFHLENBQUMsUUFBUSxDQUFVLENBQUM7QUFFeEQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLENBQVUsRUFBRSxDQUFTO0lBQ2hELElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDdEQsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0MsT0FBTyxPQUFRLENBQTZCLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxDQUFDO0lBQ2pFLENBQUM7SUFDRCxJQUFJLEtBQUssR0FBWSxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3BELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ25ELE9BQU8sT0FBUSxLQUFpQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsS0FBSyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLENBQW1CO0lBQ3BELE9BQU8sc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRkQsZ0RBRUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixzQkFBc0IsQ0FBQyxDQUFtQjtJQUN4RCxPQUFPLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUZELHdEQUVDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLHNCQUFzQixDQUFDLENBQW1CO0lBQ3hELE9BQU8sMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRkQsd0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbWJpbmVkUmVjb3JkZXIg4oCUIGEgc2luZ2xlIG9ic2VydmVyIHRoYXQgY2FuIGhvb2sgaW50byBNVUxUSVBMRSBldmVudFxuICogc3RyZWFtcyAoY3VycmVudGx5OiBzY29wZSBkYXRhLWZsb3cgKyBjb250cm9sLWZsb3cpLiBPbmUgb2JqZWN0LCBvbmUgYGlkYCxcbiAqIG9uZSBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIGV4ZWN1dGlvbi5cbiAqXG4gKiAjIyBXaHkgdGhpcyBleGlzdHNcbiAqXG4gKiBCZWZvcmUgYENvbWJpbmVkUmVjb3JkZXJgLCBhIGNvbnN1bWVyIHdobyB3YW50ZWQgdG8gb2JzZXJ2ZSBib3RoIHN0cmVhbXNcbiAqIGhhZCB0bzpcbiAqICAgMS4gSW1wbGVtZW50IGJvdGggYFNjb3BlUmVjb3JkZXJgICg4IG1ldGhvZHMpIGFuZCBgRmxvd1JlY29yZGVyYCAoMTIgbWV0aG9kcylcbiAqICAgICAgZnVsbHkg4oCUIHN0dWJiaW5nIGV2ZXJ5IGV2ZW50IHRoZXkgZGlkbid0IGNhcmUgYWJvdXQuXG4gKiAgIDIuIFJlbWVtYmVyIHRvIGNhbGwgQk9USCBgYXR0YWNoU2NvcGVSZWNvcmRlcihyKWAgQU5EIGBhdHRhY2hGbG93UmVjb3JkZXIocilgLlxuICogICAgICBGb3JnZXR0aW5nIHRoZSBzZWNvbmQgY2FsbCBzaWxlbnRseSBkcm9wcGVkIGhhbGYgdGhlaXIgZXZlbnRzIOKAlCBub1xuICogICAgICB3YXJuaW5nLCBubyBydW50aW1lIGVycm9yLlxuICogICAzLiBSZS1pbXBsZW1lbnQgY29vcmRpbmF0aW9uIGxvZ2ljIChidWZmZXJpbmcsIG9yZGVyaW5nKSB0aGVtc2VsdmVzLlxuICpcbiAqIGBDb21iaW5lZFJlY29yZGVyYCBjb2xsYXBzZXMgdGhhdCBpbnRvIGEgc2luZ2xlIHR5cGUgYW5kIGEgc2luZ2xlIGF0dGFjaFxuICogY2FsbCAoYGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIocilgKSwgd2l0aCB0aGUgbGlicmFyeSBoYW5kbGluZyB0aGVcbiAqIHJvdXRpbmcgaW50ZXJuYWxseS4gQ29uc3VtZXJzIGltcGxlbWVudCBvbmx5IHRoZSBldmVudHMgdGhleSBjYXJlIGFib3V0XG4gKiAoYFBhcnRpYWw8Li4uPmApIGFuZCB0aGUgYXR0YWNoIG1ldGhvZCBkdWNrLXR5cGVzIGF0IHJ1bnRpbWUgdG8gZGlzcGF0Y2hcbiAqIHRvIHRoZSByZWxldmFudCBjaGFubmVscy5cbiAqXG4gKiAjIyBGb3J3YXJkIGNvbXBhdGliaWxpdHlcbiAqXG4gKiBXaGVuIGEgdGhpcmQgb2JzZXJ2ZXIgdHlwZSBpcyBhZGRlZCAoZS5nLiBhbiBgT3BlcmF0aW9uUmVjb3JkZXJgKSwgdGhlXG4gKiBgQ29tYmluZWRSZWNvcmRlcmAgdHlwZSBnYWlucyBhbiBgJiBQYXJ0aWFsPE9wZXJhdGlvblJlY29yZGVyPmAgY2xhdXNlIGFuZFxuICogYGF0dGFjaENvbWJpbmVkUmVjb3JkZXJgIGdhaW5zIG9uZSBtb3JlIHJ1bnRpbWUgYnJhbmNoIGluIGl0cyBkaXNwYXRjaC5cbiAqIENvbnN1bWVycyB3cml0aW5nIGEgYENvbWJpbmVkUmVjb3JkZXJgIHRvZGF5IGFyZSBOT1QgYWZmZWN0ZWQg4oCUIHRoZWlyXG4gKiBjb2RlIGtlZXBzIGNvbXBpbGluZyBhbmQgYXR0YWNoaW5nIGNvcnJlY3RseSwgYmVjYXVzZSBldmVyeSBuZXcgbGF5ZXIgaXNcbiAqIG9wdGlvbmFsLlxuICpcbiAqICMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgdHlwZSB7IENvbWJpbmVkUmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcyc7XG4gKlxuICogY29uc3QgYXVkaXQ6IENvbWJpbmVkUmVjb3JkZXIgPSB7XG4gKiAgIGlkOiAnYXVkaXQnLFxuICogICBvbldyaXRlOiAoZSkgPT4gbG9nV3JpdGUoZS5rZXksIGUudmFsdWUpLCAgICAgICAgLy8gU2NvcGVSZWNvcmRlciBtZXRob2RcbiAqICAgb25EZWNpc2lvbjogKGUpID0+IGxvZ0RlY2lzaW9uKGUuY2hvc2VuKSwgICAgICAgIC8vIEZsb3dSZWNvcmRlciBtZXRob2RcbiAqIH07XG4gKlxuICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihhdWRpdCk7XG4gKiAvLyBeIGludGVybmFsbHk6IGRldGVjdHMgYm90aCBzZXRzIG9mIG1ldGhvZHMsIHJvdXRlcyB0byBib3RoIGNoYW5uZWxzLlxuICogYGBgXG4gKlxuICogIyMgQ29udHJhY3Qgd2l0aCBleGlzdGluZyBBUElzXG4gKlxuICogLSBgYXR0YWNoU2NvcGVSZWNvcmRlcihyKWAgYW5kIGBhdHRhY2hGbG93UmVjb3JkZXIocilgIHJlbWFpbiB1bmNoYW5nZWQuXG4gKiAgIENvbnN1bWVycyB3aG8gd2FudCBvbmx5IE9ORSBjaGFubmVsIGtlZXAgdXNpbmcgdGhlbSDigJQgZXhwbGljaXQgaXMgZ29vZC5cbiAqIC0gYGF0dGFjaENvbWJpbmVkUmVjb3JkZXIocilgIGlzIHRoZSBPTkxZIHdheSB0byBndWFyYW50ZWUgYW4gb2JqZWN0IGlzXG4gKiAgIGhvb2tlZCBpbnRvIGV2ZXJ5IHN0cmVhbSBpdCBoYXMgbWV0aG9kcyBmb3IsIHdpdGhvdXQgbWFpbnRhaW5pbmcgdHdvXG4gKiAgIGF0dGFjaCBjYWxscyBhdCB0aGUgY2FsbCBzaXRlLlxuICogLSBJZGVtcG90ZW5jeSBieSBgaWRgIGlzIHByZXNlcnZlZCBhY3Jvc3MgY2hhbm5lbHM6IHJlLWF0dGFjaGluZyB3aXRoIHRoZVxuICogICBzYW1lIGBpZGAgcmVwbGFjZXMgdGhlIHByZXZpb3VzIGluc3RhbmNlIG9uIEJPVEggY2hhbm5lbHMsIG5vdCBqdXN0IG9uZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dFcnJvckV2ZW50LCBGbG93UGF1c2VFdmVudCwgRmxvd1JlY29yZGVyLCBGbG93UmVzdW1lRXZlbnQgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRXJyb3JFdmVudCwgUGF1c2VFdmVudCwgUmVzdW1lRXZlbnQsIFNjb3BlUmVjb3JkZXIgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRSZWNvcmRlciB9IGZyb20gJy4vRW1pdFJlY29yZGVyLmpzJztcblxuLyoqXG4gKiBNZXRob2QgbmFtZXMgdGhhdCBhcHBlYXIgb24gQk9USCBgU2NvcGVSZWNvcmRlcmAgYW5kIGBGbG93UmVjb3JkZXJgIGJ1dCB3aXRoXG4gKiBkaWZmZXJlbnQgZXZlbnQgcGF5bG9hZCB0eXBlcy4gRm9yIHRoZXNlLCBhIGBDb21iaW5lZFJlY29yZGVyYCBkZWNsYXJlc1xuICogT05FIGhhbmRsZXIgdGhhdCByZWNlaXZlcyB0aGUgdW5pb24gb2YgYm90aCBwYXlsb2FkcyDigJQgY29uc3VtZXJzXG4gKiBkaXNjcmltaW5hdGUgb24gYHRyYXZlcnNhbENvbnRleHRgLCB3aGljaCBvbmx5IGNvbnRyb2wtZmxvdyBldmVudHMgY2FycnkuXG4gKi9cbnR5cGUgU2hhcmVkTGlmZWN5Y2xlT3ZlcmxhcCA9ICdvbkVycm9yJyB8ICdvblBhdXNlJyB8ICdvblJlc3VtZSc7XG5cbi8qKiBMaWZlY3ljbGUgaG9va3MgKG5vdCBldmVudC1zcGVjaWZpYykgdGhhdCBib3RoIGludGVyZmFjZXMgc2hhcmUgaWRlbnRpY2FsbHkuICovXG50eXBlIFNoYXJlZExpZmVjeWNsZSA9ICdpZCcgfCAnY2xlYXInIHwgJ3RvU25hcHNob3QnO1xuXG4vKipcbiAqIEEgcmVjb3JkZXIgdGhhdCBNQVkgb2JzZXJ2ZSBhbnkgY29tYmluYXRpb24gb2Ygc3VwcG9ydGVkIGV2ZW50IHN0cmVhbXMuXG4gKlxuICogVG9kYXkncyBzdHJlYW1zOlxuICogICAtIFNjb3BlIGRhdGEtZmxvdyAoYFNjb3BlUmVjb3JkZXJgOiBvblJlYWQvb25Xcml0ZS9vbkNvbW1pdC9vblN0YWdlU3RhcnQv4oCmKVxuICogICAtIENvbnRyb2wtZmxvdyAoYEZsb3dSZWNvcmRlcmA6IG9uRGVjaXNpb24vb25TdWJmbG93RW50cnkvb25Mb29wL+KApilcbiAqXG4gKiBBbGwgZXZlbnQgaGFuZGxlcnMgYXJlIG9wdGlvbmFsIOKAlCBpbXBsZW1lbnQgb25seSB3aGF0IHlvdSBjYXJlIGFib3V0LlxuICogYGlkYCBpcyByZXF1aXJlZCBzbyB0aGUgbGlicmFyeSBjYW4gZGVkdXBsaWNhdGUgcmUtYXR0YWNoZXMuXG4gKlxuICogIyMgU2hhcmVkIG1ldGhvZCBuYW1lcyAob25FcnJvciAvIG9uUGF1c2UgLyBvblJlc3VtZSlcbiAqXG4gKiBCb3RoIGBTY29wZVJlY29yZGVyYCBhbmQgYEZsb3dSZWNvcmRlcmAgZGVjbGFyZSB0aGVzZSB3aXRoIERJRkZFUkVOVCBwYXlsb2FkXG4gKiBzaGFwZXMuIEluIGEgY29tYmluZWQgcmVjb3JkZXIsIGVhY2ggc3VjaCBoYW5kbGVyIGlzIGNhbGxlZCBieSBCT1RIXG4gKiBjaGFubmVscyB3aXRoIGl0cyBvd24gdmFyaWFudC4gVGhlIHBhcmFtZXRlciB0eXBlIGlzIGEgdW5pb24g4oCUIGNvbnN1bWVyc1xuICogY2FuIGVpdGhlciBoYW5kbGUgYm90aCB2YXJpYW50cyB1bmlmb3JtbHksIG9yIGRpc2NyaW1pbmF0ZSAoY29udHJvbC1mbG93XG4gKiB2YXJpYW50cyBjYXJyeSBhIGB0cmF2ZXJzYWxDb250ZXh0YCBmaWVsZCB0aGF0IGRhdGEtZmxvdyB2YXJpYW50cyBsYWNrKS5cbiAqXG4gKiAjIyBGb3J3YXJkIGNvbXBhdGliaWxpdHlcbiAqXG4gKiBXaGVuIGEgdGhpcmQgb2JzZXJ2ZXIgdHlwZSBzaGlwcyAoZS5nLiBgT3BlcmF0aW9uUmVjb3JkZXJgKSwgdGhlIHR5cGVcbiAqIGdhaW5zIGFub3RoZXIgYCYgUGFydGlhbDzigKY+YCBjbGF1c2UuIEJlY2F1c2UgZXZlcnkgY2xhdXNlIGlzIGBQYXJ0aWFsYCxcbiAqIGV4aXN0aW5nIGBDb21iaW5lZFJlY29yZGVyYCBpbXBsZW1lbnRhdGlvbnMgcmVtYWluIHR5cGUtdmFsaWQuXG4gKi9cbmV4cG9ydCB0eXBlIENvbWJpbmVkUmVjb3JkZXIgPSBQYXJ0aWFsPE9taXQ8U2NvcGVSZWNvcmRlciwgU2hhcmVkTGlmZWN5Y2xlT3ZlcmxhcCB8IFNoYXJlZExpZmVjeWNsZT4+ICZcbiAgUGFydGlhbDxPbWl0PEZsb3dSZWNvcmRlciwgU2hhcmVkTGlmZWN5Y2xlT3ZlcmxhcCB8IFNoYXJlZExpZmVjeWNsZT4+ICZcbiAgLy8gRW1pdCBjaGFubmVsIOKAlCBuZXcgdGhpcmQgc3RyZWFtIChQaGFzZSAzKS4gTm8gbWV0aG9kLW5hbWUgb3ZlcmxhcCB3aXRoXG4gIC8vIHRoZSBvdGhlciB0d28gaW50ZXJmYWNlcywgc28gYSBwbGFpbiBpbnRlcnNlY3Rpb24gaXMgc291bmQg4oCUIG5vXG4gIC8vIHVuaW9uLXBheWxvYWQgZGlzY3JpbWluYXRvciBuZWVkZWQuXG4gIFBhcnRpYWw8T21pdDxFbWl0UmVjb3JkZXIsIFNoYXJlZExpZmVjeWNsZT4+ICYge1xuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgICAvLyBTaGFyZWQgbGlmZWN5Y2xlIGhvb2tzIOKAlCBzYW1lIG9uIGJvdGggaW50ZXJmYWNlcywgc2hhcGUgY29tcGF0aWJsZS5cbiAgICBjbGVhcj8oKTogdm9pZDtcbiAgICB0b1NuYXBzaG90PygpOiB7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAgIHByZWZlcnJlZE9wZXJhdGlvbj86ICd0cmFuc2xhdGUnIHwgJ2FjY3VtdWxhdGUnIHwgJ2FnZ3JlZ2F0ZSc7XG4gICAgICBkYXRhOiB1bmtub3duO1xuICAgIH07XG5cbiAgICAvLyBTaGFyZWQgZXZlbnQgbWV0aG9kIG5hbWVzIHdpdGggRElWRVJHRU5UIHBheWxvYWRzIOKAlCBkZWNsYXJlZCBhcyB1bmlvbnMuXG4gICAgLy8gQ29uc3VtZXJzIGVpdGhlciBoYW5kbGUgYm90aCB2YXJpYW50cywgb3IgZGlzY3JpbWluYXRlIHVzaW5nIHRoZVxuICAgIC8vIGV4cG9ydGVkIGhlbHBlciBgaXNGbG93RXZlbnQoKWAgKHdoaWNoIGNoZWNrcyBmb3IgdGhlXG4gICAgLy8gYHRyYXZlcnNhbENvbnRleHRgIGZpZWxkIOKAlCBwcmVzZW50IG9ubHkgb24gY29udHJvbC1mbG93IHZhcmlhbnRzKS5cbiAgICAvL1xuICAgIC8vIEBleGFtcGxlXG4gICAgLy8gYGBgdHNcbiAgICAvLyBjb25zdCBhdWRpdDogQ29tYmluZWRSZWNvcmRlciA9IHtcbiAgICAvLyAgIGlkOiAnYXVkaXQnLFxuICAgIC8vICAgb25FcnJvcjogKGUpID0+IHtcbiAgICAvLyAgICAgaWYgKGlzRmxvd0V2ZW50KGUpKSB7XG4gICAgLy8gICAgICAgLy8gZSBpcyBGbG93RXJyb3JFdmVudCDigJQgaGFzIHN0YWdlTmFtZSwgbWVzc2FnZSwgc3RydWN0dXJlZEVycm9yXG4gICAgLy8gICAgICAgbG9nKCdmbG93IGVycm9yIGluIHN0YWdlJywgZS5zdGFnZU5hbWUpO1xuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgIC8vIGUgaXMgRXJyb3JFdmVudCDigJQgaGFzIGVycm9yLCBvcGVyYXRpb24sIGtleT9cbiAgICAvLyAgICAgICBsb2coJ3Njb3BlIGVycm9yIGR1cmluZycsIGUub3BlcmF0aW9uLCBlLmVycm9yLm1lc3NhZ2UpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9LFxuICAgIC8vIH07XG4gICAgLy8gYGBgXG4gICAgb25FcnJvcj8oZXZlbnQ6IEVycm9yRXZlbnQgfCBGbG93RXJyb3JFdmVudCk6IHZvaWQ7XG4gICAgb25QYXVzZT8oZXZlbnQ6IFBhdXNlRXZlbnQgfCBGbG93UGF1c2VFdmVudCk6IHZvaWQ7XG4gICAgb25SZXN1bWU/KGV2ZW50OiBSZXN1bWVFdmVudCB8IEZsb3dSZXN1bWVFdmVudCk6IHZvaWQ7XG4gIH07XG5cbi8qKlxuICogRGlzY3JpbWluYXRvciBmb3IgdGhlIHVuaW9uIHBheWxvYWQgdHlwZXMgb24gYENvbWJpbmVkUmVjb3JkZXJgJ3Mgc2hhcmVkXG4gKiBtZXRob2RzIChgb25FcnJvcmAsIGBvblBhdXNlYCwgYG9uUmVzdW1lYCkuIFJldHVybnMgYHRydWVgIGlmIHRoZSBldmVudFxuICogd2FzIGVtaXR0ZWQgZnJvbSB0aGUgY29udHJvbC1mbG93IGNoYW5uZWwgKEZsb3dSZWNvcmRlcikuXG4gKlxuICogIyMgSG93IGl0IGRpc2NyaW1pbmF0ZXNcbiAqXG4gKiBTY29wZS1jaGFubmVsIGV2ZW50cyBleHRlbmQgYFJlY29yZGVyQ29udGV4dGAsIHdoaWNoIGNhcnJpZXMgYHBpcGVsaW5lSWRgLlxuICogRmxvdy1jaGFubmVsIGV2ZW50cyBkbyBub3QgY2FycnkgYHBpcGVsaW5lSWRgICh0aGV5IGNhcnJ5IGFuIG9wdGlvbmFsXG4gKiBgdHJhdmVyc2FsQ29udGV4dGAgaW5zdGVhZCwgYnV0IHRoYXQgZmllbGQgaXMgb3B0aW9uYWwgYW5kIGNhbm5vdCBiZVxuICogcmVsaWVkIG9uIGFzIGEgcG9zaXRpdmUgc2lnbmFsKS4gV2UgZGV0ZWN0IHRoZSBmbG93IHZhcmlhbnQgYnkgdGhlXG4gKiBBQlNFTkNFIG9mIGBwaXBlbGluZUlkYCDigJQgdGhpcyBpcyBzY2hlbWEtc3RhYmxlIGFzIGxvbmcgYXMgc2NvcGUgZXZlbnRzXG4gKiBjb250aW51ZSB0byBleHRlbmQgYFJlY29yZGVyQ29udGV4dGAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBvbkVycm9yOiAoZSkgPT4ge1xuICogICBpZiAoaXNGbG93RXZlbnQoZSkpIHtcbiAqICAgICAvLyBOYXJyb3dlZCB0byBGbG93RXJyb3JFdmVudDogaGFzIHN0YWdlTmFtZSwgbWVzc2FnZSwgc3RydWN0dXJlZEVycm9yXG4gKiAgIH0gZWxzZSB7XG4gKiAgICAgLy8gTmFycm93ZWQgdG8gRXJyb3JFdmVudDogaGFzIGVycm9yLCBvcGVyYXRpb24sIGtleT9cbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Zsb3dFdmVudDxUPihldmVudDogVCk6IGV2ZW50IGlzIEV4Y2x1ZGU8VCwgeyBwaXBlbGluZUlkOiBzdHJpbmcgfT4ge1xuICBpZiAodHlwZW9mIGV2ZW50ICE9PSAnb2JqZWN0JyB8fCBldmVudCA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKGV2ZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5waXBlbGluZUlkID09PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogTWV0aG9kIG5hbWVzIGJlbG9uZ2luZyB0byB0aGUgYFNjb3BlUmVjb3JkZXJgIChkYXRhLWZsb3cpIGludGVyZmFjZS5cbiAqIEtlcHQgYXMgYSBzaW5nbGUgc291cmNlIG9mIHRydXRoIHNvIHRoZSBydW50aW1lIGR1Y2stdHlwZSBkZXRlY3RvciBzdGF5c1xuICogaW4gc3luYyB3aXRoIHRoZSBpbnRlcmZhY2UuIElmIGEgbWV0aG9kIGlzIGFkZGVkIHRvIGBTY29wZVJlY29yZGVyYCwgYWRkaW5nIGl0XG4gKiBoZXJlIGlzIHRoZSBPTkxZIGNoYW5nZSByZXF1aXJlZCB0byByb3V0ZSBjb21iaW5lZC1yZWNvcmRlcnMgY29ycmVjdGx5LlxuICovXG5jb25zdCBSRUNPUkRFUl9FVkVOVF9NRVRIT0RTID0gW1xuICAnb25SZWFkJyxcbiAgJ29uV3JpdGUnLFxuICAnb25Db21taXQnLFxuICAnb25FcnJvcicsXG4gICdvblN0YWdlU3RhcnQnLFxuICAnb25TdGFnZUVuZCcsXG4gICdvblBhdXNlJyxcbiAgJ29uUmVzdW1lJyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogTWV0aG9kIG5hbWVzIGJlbG9uZ2luZyB0byB0aGUgYEZsb3dSZWNvcmRlcmAgKGNvbnRyb2wtZmxvdykgaW50ZXJmYWNlLlxuICogU2VlIHRoZSBub3RlIG9uIGBSRUNPUkRFUl9FVkVOVF9NRVRIT0RTYC5cbiAqXG4gKiBOT1RFOiB0aGUgYG9uRXJyb3JgLCBgb25QYXVzZWAsIGBvblJlc3VtZWAgbWV0aG9kcyBleGlzdCBvbiBCT1RIIGludGVyZmFjZXNcbiAqIHdpdGggRElGRkVSRU5UIGV2ZW50IHBheWxvYWQgc2hhcGVzLiBBIGBDb21iaW5lZFJlY29yZGVyYCB0aGF0IGltcGxlbWVudHNcbiAqIGFueSBvZiB0aGVzZSByZWNlaXZlcyBib3RoIHZhcmlhbnRzIChvbmUgZnJvbSBlYWNoIGNoYW5uZWwpLiBDb25zdW1lcnMgd2hvXG4gKiBjYXJlIGFib3V0IHRoZSBkaXN0aW5jdGlvbiBjYW4gZGlzY3JpbWluYXRlIG9uIHRoZSBwcmVzZW5jZSBvZlxuICogYHRyYXZlcnNhbENvbnRleHRgICh3aGljaCBvbmx5IGNvbnRyb2wtZmxvdyBldmVudHMgY2FycnkpLlxuICovXG5jb25zdCBGTE9XX1JFQ09SREVSX0VWRU5UX01FVEhPRFMgPSBbXG4gICdvblN0YWdlRXhlY3V0ZWQnLFxuICAnb25OZXh0JyxcbiAgJ29uRGVjaXNpb24nLFxuICAnb25Gb3JrJyxcbiAgJ29uU2VsZWN0ZWQnLFxuICAnb25TdWJmbG93RW50cnknLFxuICAnb25TdWJmbG93RXhpdCcsXG4gICdvblN1YmZsb3dSZWdpc3RlcmVkJyxcbiAgJ29uTG9vcCcsXG4gICdvbkJyZWFrJyxcbiAgJ29uRXJyb3InLFxuICAnb25QYXVzZScsXG4gICdvblJlc3VtZScsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIE1ldGhvZCBuYW1lcyBiZWxvbmdpbmcgdG8gdGhlIGBFbWl0UmVjb3JkZXJgICh1c2VyLWVtaXR0ZWQgZXZlbnRzKVxuICogaW50ZXJmYWNlLiBTYW1lIGNvbnZlbnRpb24gYXMgdGhlIG90aGVyIHR3byBhcnJheXMgYWJvdmUg4oCUIGtlcHQgYXNcbiAqIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBkdWNrLXR5cGUgZGV0ZWN0aW9uLlxuICovXG5jb25zdCBFTUlUX1JFQ09SREVSX0VWRU5UX01FVEhPRFMgPSBbJ29uRW1pdCddIGFzIGNvbnN0O1xuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByZWNvcmRlciBkZWNsYXJlcyBhIG1ldGhvZCBuYW1lZCBgbWAgZWl0aGVyIGFzIGFuIG93blxuICogcHJvcGVydHkgT1Igb24gaXRzIGNsYXNzLXByb3RvdHlwZSBjaGFpbiDigJQgYnV0IE5PVCBpbmhlcml0ZWQgZnJvbVxuICogYE9iamVjdC5wcm90b3R5cGVgLlxuICpcbiAqICMjIFdoeSB0aGlzIGxheWVyZWQgY2hlY2tcbiAqXG4gKiBBIGBDb21iaW5lZFJlY29yZGVyYCBjYW4gYmUgZWl0aGVyIGEgcGxhaW4gb2JqZWN0IGxpdGVyYWwgKGhhbmRsZXJzIGFzXG4gKiBvd24gcHJvcGVydGllcykgT1IgYSBjbGFzcyBpbnN0YW5jZSAoaGFuZGxlcnMgYXMgY2xhc3MtcHJvdG90eXBlXG4gKiBtZXRob2RzKS4gQm90aCBhcmUgbGVnaXRpbWF0ZSBjb25zdW1lciBwYXR0ZXJucyBhbmQgYm90aCBNVVNUIGF0dGFjaC5cbiAqXG4gKiBCdXQgaGFuZGxlcnMgaW5oZXJpdGVkIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFyZSBBTFdBWVMgYWNjaWRlbnRhbCBvclxuICogbWFsaWNpb3VzIChub2JvZHkgbGVnaXRpbWF0ZWx5IGF0dGFjaGVzIHJlY29yZGVyIG1ldGhvZHMgdGhlcmUpLiBTbyB3ZVxuICogd2FsayB0aGUgcHJvdG90eXBlIGNoYWluLCBTVE9QUElORyBiZWZvcmUgYE9iamVjdC5wcm90b3R5cGVgLiBUaGlzXG4gKiBhY2NlcHRzIGNsYXNzIG1ldGhvZHMgd2hpbGUgc3RpbGwgYmxvY2tpbmcgYE9iamVjdC5wcm90b3R5cGVgXG4gKiBwb2xsdXRpb24gYXR0YWNrcy5cbiAqL1xuZnVuY3Rpb24gaGFzT3duT3JDbGFzc01ldGhvZChyOiB1bmtub3duLCBtOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHIgPT09IG51bGwgfHwgdHlwZW9mIHIgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwgbSkpIHtcbiAgICByZXR1cm4gdHlwZW9mIChyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVttXSA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuICBsZXQgcHJvdG86IHVua25vd24gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7XG4gIHdoaWxlIChwcm90byAhPT0gbnVsbCAmJiBwcm90byAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvdG8sIG0pKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIChwcm90byBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbbV0gPT09ICdmdW5jdGlvbic7XG4gICAgfVxuICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJlY29yZGVyIGltcGxlbWVudHMgYXQgbGVhc3Qgb25lIGRhdGEtZmxvdyBldmVudCBtZXRob2QuXG4gKiBVc2VkIGJ5IGBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyYCB0byBkZWNpZGUgd2hldGhlciB0byBob29rIGludG9cbiAqIHRoZSBzY29wZSBkYXRhLWZsb3cgY2hhbm5lbC5cbiAqXG4gKiAjIyBEZXRlY3Rpb24gcnVsZVxuICpcbiAqIEFjY2VwdHMgYm90aCBvYmplY3QtbGl0ZXJhbCByZWNvcmRlcnMgKG93bi1wcm9wZXJ0eSBoYW5kbGVycykgQU5EIGNsYXNzXG4gKiBpbnN0YW5jZXMgKGhhbmRsZXJzIGRlY2xhcmVkIG9uIHRoZSBjbGFzcyBwcm90b3R5cGUpLiBSZWplY3RzIGhhbmRsZXJzXG4gKiBpbmhlcml0ZWQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAg4oCUIHRoYXQncyBhbHdheXMgYWNjaWRlbnRhbCBvclxuICogbWFsaWNpb3VzIHBvbGx1dGlvbiwgbmV2ZXIgYSBsZWdpdGltYXRlIHJlY29yZGVyLlxuICpcbiAqICMjIExpZmVjeWNsZSBleGNsdXNpb25zXG4gKlxuICogYGNsZWFyYCBhbmQgYHRvU25hcHNob3RgIGFyZSBOT1QgY291bnRlZCBhcyBldmVudCBtZXRob2RzIOKAlCBhIHJlY29yZGVyXG4gKiB0aGF0IG9ubHkgaW1wbGVtZW50cyB0aG9zZSBoYXMgbm90aGluZyB0byBvYnNlcnZlIGFuZCB3b3VsZCBiZSBhIG5vLW9wXG4gKiBvbiBlaXRoZXIgY2hhbm5lbC5cbiAqXG4gKiAjIyBSZXR1cm4gdHlwZVxuICpcbiAqIFJldHVybnMgcGxhaW4gYGJvb2xlYW5gIChub3QgYSB0eXBlIHByZWRpY2F0ZSkuIFRoZSBmdWxsIGBTY29wZVJlY29yZGVyYFxuICogaW50ZXJmYWNlIGhhcyBwYXlsb2FkIHR5cGVzIHRoYXQgZGl2ZXJnZSBmcm9tIGBDb21iaW5lZFJlY29yZGVyYCdzIHVuaW9uXG4gKiB2YXJpYW50cyBmb3Igc2hhcmVkIG1ldGhvZHMsIHNvIGEgbmFycm93aW5nIHByZWRpY2F0ZSB3b3VsZCBiZSB1bnNvdW5kLlxuICogQ2FsbGVycyB0aGF0IG5lZWQgdG8gdHJlYXQgdGhlIHJlY29yZGVyIGFzIGEgYFNjb3BlUmVjb3JkZXJgIGRvIHNvIGV4cGxpY2l0bHlcbiAqIGF0IHRoZSBhdHRhY2ggc2l0ZSDigJQgdGhlIGNhc3QgaXMgdGhlIGNvbnRyYWN0IHRoYXQgZWFjaCBjaGFubmVsIHBhc3Nlc1xuICogaXRzIG93biBwYXlsb2FkIHZhcmlhbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNSZWNvcmRlck1ldGhvZHMocjogQ29tYmluZWRSZWNvcmRlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gUkVDT1JERVJfRVZFTlRfTUVUSE9EUy5zb21lKChtKSA9PiBoYXNPd25PckNsYXNzTWV0aG9kKHIsIG0pKTtcbn1cblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmVjb3JkZXIgaW1wbGVtZW50cyBhdCBsZWFzdCBvbmUgY29udHJvbC1mbG93IGV2ZW50IG1ldGhvZC5cbiAqIFNlZSBgaGFzUmVjb3JkZXJNZXRob2RzYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0Zsb3dSZWNvcmRlck1ldGhvZHMocjogQ29tYmluZWRSZWNvcmRlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gRkxPV19SRUNPUkRFUl9FVkVOVF9NRVRIT0RTLnNvbWUoKG0pID0+IGhhc093bk9yQ2xhc3NNZXRob2QociwgbSkpO1xufVxuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIGF0IGxlYXN0IG9uZSBlbWl0LWNoYW5uZWwgZXZlbnQgbWV0aG9kLlxuICogU2VlIGBoYXNSZWNvcmRlck1ldGhvZHNgIGZvciB0aGUgb3duZXJzaGlwLWRldGVjdGlvbiBydWxlcyAob3duIG9yXG4gKiBjbGFzcy1wcm90b3R5cGUgbWV0aG9kcyBjb3VudDsgYE9iamVjdC5wcm90b3R5cGVgIHBvbGx1dGlvbiBkb2VzIG5vdCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbWl0UmVjb3JkZXJNZXRob2RzKHI6IENvbWJpbmVkUmVjb3JkZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIEVNSVRfUkVDT1JERVJfRVZFTlRfTUVUSE9EUy5zb21lKChtKSA9PiBoYXNPd25PckNsYXNzTWV0aG9kKHIsIG0pKTtcbn1cbiJdfQ==
|