footprintjs 9.30.0 → 9.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +3 -3
- package/CLAUDE.md +6 -4
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/lib/builder/FlowChartBuilder.js +2 -2
- package/dist/esm/lib/builder/structure/StructureRecorderDispatcher.js +2 -2
- package/dist/esm/lib/capture/circular.d.ts +17 -0
- package/dist/esm/lib/capture/circular.js +45 -0
- package/dist/esm/lib/capture/envelope.d.ts +1 -1
- package/dist/esm/lib/capture/envelope.js +2 -2
- package/dist/esm/lib/capture/index.d.ts +7 -1
- package/dist/esm/lib/capture/index.js +8 -2
- package/dist/esm/lib/capture/invokeHook.d.ts +36 -0
- package/dist/esm/lib/capture/invokeHook.js +42 -0
- package/dist/esm/lib/capture/summarize.d.ts +13 -0
- package/dist/esm/lib/capture/summarize.js +37 -1
- package/dist/esm/lib/decide/decide.js +2 -2
- package/dist/esm/lib/decide/evaluator.js +5 -4
- package/dist/esm/lib/decide/evidence.js +4 -3
- package/dist/esm/lib/devMode.d.ts +45 -0
- package/dist/esm/lib/devMode.js +96 -0
- package/dist/esm/lib/engine/handlers/RuntimeStructureManager.js +2 -2
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +2 -2
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +2 -2
- package/dist/esm/lib/memory/StageContext.js +5 -4
- package/dist/esm/lib/memory/admission.d.ts +1 -1
- package/dist/esm/lib/memory/admission.js +2 -2
- package/dist/esm/lib/memory/backtrack.d.ts +9 -0
- package/dist/esm/lib/memory/backtrack.js +2 -2
- package/dist/esm/lib/memory/commitLogUtils.d.ts +21 -3
- package/dist/esm/lib/memory/commitLogUtils.js +39 -43
- package/dist/esm/lib/memory/equality.d.ts +57 -0
- package/dist/esm/lib/memory/equality.js +159 -0
- package/dist/esm/lib/memory/honesty.d.ts +88 -0
- package/dist/esm/lib/memory/honesty.js +86 -0
- package/dist/esm/lib/memory/index.d.ts +5 -1
- package/dist/esm/lib/memory/index.js +7 -2
- package/dist/esm/lib/memory/merge.d.ts +25 -0
- package/dist/esm/lib/memory/merge.js +49 -0
- package/dist/esm/lib/memory/paths.d.ts +52 -0
- package/dist/esm/lib/memory/paths.js +57 -0
- package/dist/esm/lib/memory/placeholders.d.ts +44 -0
- package/dist/esm/lib/memory/placeholders.js +45 -0
- package/dist/esm/lib/memory/redaction.d.ts +4 -4
- package/dist/esm/lib/memory/redaction.js +12 -11
- package/dist/esm/lib/memory/utils.d.ts +15 -216
- package/dist/esm/lib/memory/utils.js +19 -438
- package/dist/esm/lib/memory/verbs.d.ts +289 -0
- package/dist/esm/lib/memory/verbs.js +386 -0
- package/dist/esm/lib/recorder/BoundaryStateStore.js +2 -2
- package/dist/esm/lib/recorder/invokeHook.d.ts +5 -29
- package/dist/esm/lib/recorder/invokeHook.js +6 -35
- package/dist/esm/lib/runner/DeferredObserverTier.js +3 -3
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +1 -0
- package/dist/esm/lib/runner/ExecutionRuntime.js +2 -4
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +2 -2
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +2 -2
- package/dist/esm/lib/scope/ScopeFacade.js +6 -4
- package/dist/esm/lib/scope/detectCircular.d.ts +9 -43
- package/dist/esm/lib/scope/detectCircular.js +10 -121
- package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +3 -5
- package/dist/esm/lib/scope/recorders/summarizeValue.js +4 -29
- package/dist/esm/lib/slice/elementProvenance.d.ts +13 -9
- package/dist/esm/lib/slice/elementProvenance.js +54 -63
- package/dist/esm/lib/slice/types.d.ts +40 -27
- package/dist/esm/lib/slice/types.js +1 -1
- package/dist/esm/lib/time-travel/bundles.js +6 -4
- package/dist/esm/lib/time-travel/stateAt.d.ts +3 -2
- package/dist/esm/lib/time-travel/stateAt.js +4 -3
- package/dist/esm/lib/time-travel/types.d.ts +18 -7
- package/dist/esm/lib/time-travel/types.js +1 -1
- package/dist/esm/trace.d.ts +3 -0
- package/dist/esm/trace.js +7 -1
- package/dist/index.js +5 -5
- package/dist/lib/builder/FlowChartBuilder.js +3 -3
- package/dist/lib/builder/structure/StructureRecorderDispatcher.js +3 -3
- package/dist/lib/capture/circular.js +49 -0
- package/dist/lib/capture/envelope.js +2 -2
- package/dist/lib/capture/index.js +11 -2
- package/dist/lib/capture/invokeHook.js +46 -0
- package/dist/lib/capture/summarize.js +39 -2
- package/dist/lib/decide/decide.js +4 -4
- package/dist/lib/decide/evaluator.js +6 -5
- package/dist/lib/decide/evidence.js +4 -3
- package/dist/lib/devMode.js +102 -0
- package/dist/lib/engine/handlers/RuntimeStructureManager.js +5 -5
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +3 -3
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -19
- package/dist/lib/memory/StageContext.js +7 -6
- package/dist/lib/memory/admission.js +2 -2
- package/dist/lib/memory/backtrack.js +3 -3
- package/dist/lib/memory/commitLogUtils.js +41 -44
- package/dist/lib/memory/equality.js +163 -0
- package/dist/lib/memory/honesty.js +89 -0
- package/dist/lib/memory/index.js +11 -3
- package/dist/lib/memory/merge.js +53 -0
- package/dist/lib/memory/paths.js +62 -0
- package/dist/lib/memory/placeholders.js +48 -0
- package/dist/lib/memory/redaction.js +14 -13
- package/dist/lib/memory/utils.js +30 -448
- package/dist/lib/memory/verbs.js +403 -0
- package/dist/lib/recorder/BoundaryStateStore.js +5 -5
- package/dist/lib/recorder/invokeHook.js +8 -37
- package/dist/lib/runner/DeferredObserverTier.js +6 -6
- package/dist/lib/runner/ExecutionRuntime.js +3 -5
- package/dist/lib/runner/FlowChartExecutor.js +4 -4
- package/dist/lib/runner/getSubtreeSnapshot.js +3 -3
- package/dist/lib/scope/ScopeFacade.js +10 -8
- package/dist/lib/scope/detectCircular.js +15 -126
- package/dist/lib/scope/recorders/summarizeValue.js +7 -32
- package/dist/lib/slice/elementProvenance.js +53 -62
- package/dist/lib/slice/types.js +1 -1
- package/dist/lib/time-travel/bundles.js +6 -4
- package/dist/lib/time-travel/stateAt.js +4 -3
- package/dist/lib/time-travel/types.js +1 -1
- package/dist/trace.js +35 -27
- package/dist/types/index.d.ts +1 -1
- package/dist/types/lib/capture/circular.d.ts +17 -0
- package/dist/types/lib/capture/envelope.d.ts +1 -1
- package/dist/types/lib/capture/index.d.ts +7 -1
- package/dist/types/lib/capture/invokeHook.d.ts +36 -0
- package/dist/types/lib/capture/summarize.d.ts +13 -0
- package/dist/types/lib/devMode.d.ts +45 -0
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
- package/dist/types/lib/memory/admission.d.ts +1 -1
- package/dist/types/lib/memory/backtrack.d.ts +9 -0
- package/dist/types/lib/memory/commitLogUtils.d.ts +21 -3
- package/dist/types/lib/memory/equality.d.ts +57 -0
- package/dist/types/lib/memory/honesty.d.ts +88 -0
- package/dist/types/lib/memory/index.d.ts +5 -1
- package/dist/types/lib/memory/merge.d.ts +25 -0
- package/dist/types/lib/memory/paths.d.ts +52 -0
- package/dist/types/lib/memory/placeholders.d.ts +44 -0
- package/dist/types/lib/memory/redaction.d.ts +4 -4
- package/dist/types/lib/memory/utils.d.ts +15 -216
- package/dist/types/lib/memory/verbs.d.ts +289 -0
- package/dist/types/lib/recorder/invokeHook.d.ts +5 -29
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +1 -0
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/types/lib/scope/detectCircular.d.ts +9 -43
- package/dist/types/lib/scope/recorders/summarizeValue.d.ts +3 -5
- package/dist/types/lib/slice/elementProvenance.d.ts +13 -9
- package/dist/types/lib/slice/types.d.ts +40 -27
- package/dist/types/lib/time-travel/stateAt.d.ts +3 -2
- package/dist/types/lib/time-travel/types.d.ts +18 -7
- package/dist/types/trace.d.ts +3 -0
- package/package.json +2 -1
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
25
|
exports.listSubflowPaths = exports.getSubtreeSnapshot = void 0;
|
|
26
|
-
const
|
|
26
|
+
const devMode_js_1 = require("../devMode.js");
|
|
27
27
|
/**
|
|
28
28
|
* Navigate the execution snapshot tree by a slash-separated subflow path.
|
|
29
29
|
*
|
|
@@ -64,7 +64,7 @@ function getSubtreeSnapshot(snapshot, path, allNarrativeEntries) {
|
|
|
64
64
|
const foundNode = findSubflowInTree(snapshot.executionTree, lastSegment);
|
|
65
65
|
if (!foundNode)
|
|
66
66
|
return undefined;
|
|
67
|
-
if ((0,
|
|
67
|
+
if ((0, devMode_js_1.isDevMode)()) {
|
|
68
68
|
console.warn(`[footprint] getSubtreeSnapshot('${normalizedPath}'): subflowResults not populated — ` +
|
|
69
69
|
'sharedState will be undefined. The subflow may not have completed, ' +
|
|
70
70
|
'or its outputMapper did not write back to the parent scope.');
|
|
@@ -137,4 +137,4 @@ function findSubflowInTree(node, subflowId) {
|
|
|
137
137
|
}
|
|
138
138
|
return undefined;
|
|
139
139
|
}
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0U3VidHJlZVNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ydW5uZXIvZ2V0U3VidHJlZVNuYXBzaG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHOzs7QUFJSCxrRUFBdUQ7QUFrQ3ZEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQ2hDLFFBQXlCLEVBQ3pCLElBQVksRUFDWixtQkFBOEM7SUFFOUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUV6QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakUsSUFBSSxDQUFDLGNBQWM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUV0QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQy9DLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFHLENBQUM7SUFFckQsNERBQTREO0lBQzVELDZFQUE2RTtJQUM3RSxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUE0QixDQUFDO1FBQzNFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxXQUFrRCxDQUFDO1FBRTVFLE9BQU87WUFDTCxTQUFTLEVBQUUsV0FBVztZQUN0QixhQUFhLEVBQ1YsT0FBTyxFQUFFLGFBQTBDLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUM7WUFDaEgsV0FBVyxFQUFFLE9BQU8sRUFBRSxhQUFvRDtZQUMxRSxPQUFPLEVB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QUNqRCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZ2V0U3VidHJlZVNuYXBzaG90IOKAlCBuYXZpZ2F0ZSBhbiBleGVjdXRpb24gc25hcHNob3QgdHJlZSBieSBzdWJmbG93IHBhdGguXG4gKlxuICogR2l2ZW4gYSBSdW50aW1lU25hcHNob3QgYW5kIGEgc2xhc2gtc2VwYXJhdGVkIHBhdGggb2Ygc3ViZmxvdyBJRHMsXG4gKiByZXR1cm5zIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCB0aGF0IHN1YmZsb3cuIFVzZWZ1bCBmb3IgTExNIGRyaWxsLWRvd246XG4gKiBpbnN0ZWFkIG9mIGR1bXBpbmcgdGhlIGZ1bGwgdHJhY2UsIGZldGNoIG9ubHkgdGhlIHJlbGV2YW50IHN1YnRyZWUuXG4gKlxuICogVXNhZ2U6XG4gKiAgIGNvbnN0IHNuYXBzaG90ID0gZXhlY3V0b3IuZ2V0U25hcHNob3QoKTtcbiAqXG4gKiAgIC8vIFRvcC1sZXZlbCBzdWJmbG93XG4gKiAgIGdldFN1YnRyZWVTbmFwc2hvdChzbmFwc2hvdCwgJ3NmLXBheW1lbnQnKTtcbiAqXG4gKiAgIC8vIE5lc3RlZCBzdWJmbG93IChwYXltZW50IOKGkiB2YWxpZGF0aW9uKVxuICogICBnZXRTdWJ0cmVlU25hcHNob3Qoc25hcHNob3QsICdzZi1wYXltZW50L3NmLXZhbGlkYXRpb24nKTtcbiAqXG4gKiAgIC8vIFJldHVybnMgdW5kZWZpbmVkIGlmIHBhdGggbm90IGZvdW5kXG4gKiAgIGdldFN1YnRyZWVTbmFwc2hvdChzbmFwc2hvdCwgJ25vbmV4aXN0ZW50Jyk7IC8vIHVuZGVmaW5lZFxuICpcbiAqICAgLy8gRGlzY292ZXIgYXZhaWxhYmxlIHBhdGhzXG4gKiAgIGxpc3RTdWJmbG93UGF0aHMoc25hcHNob3QpOyAvLyBbJ3NmLXBheW1lbnQnLCAnc2YtcGF5bWVudC9zZi12YWxpZGF0aW9uJ11cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlRW50cnkgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL25hcnJhdGl2ZVR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VTbmFwc2hvdCB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9zY29wZS9kZXRlY3RDaXJjdWxhci5qcyc7XG5pbXBvcnQgdHlwZSB7IFJ1bnRpbWVTbmFwc2hvdCB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZS5qcyc7XG5cbi8qKiBUaGUgcmVzdWx0IG9mIG5hdmlnYXRpbmcgdG8gYSBzdWJ0cmVlIHdpdGhpbiBhIHNuYXBzaG90LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWJ0cmVlU25hcHNob3Qge1xuICAvKiogVGhlIHN1YmZsb3cgSUQgdGhhdCB3YXMgbWF0Y2hlZCAobGFzdCBzZWdtZW50IG9mIHRoZSBwYXRoKS4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd0lkOiBzdHJpbmc7XG4gIC8qKiBUaGUgZXhlY3V0aW9uIHRyZWUgcm9vdGVkIGF0IHRoaXMgc3ViZmxvdy4gKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uVHJlZTogU3RhZ2VTbmFwc2hvdDtcbiAgLyoqIFNoYXJlZCBzdGF0ZSBzY29wZWQgdG8gdGhpcyBzdWJmbG93IChmcm9tIHN1YmZsb3dSZXN1bHRzIGlmIGF2YWlsYWJsZSkuICovXG4gIHJlYWRvbmx5IHNoYXJlZFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKlxuICAgKiBUaGUgc3ViZmxvdydzIE9XTiBjb21taXQgbG9nIChgdHJlZUNvbnRleHQuaGlzdG9yeWApIOKAlCB0aGUgcGVyLXN1YmZsb3cgYXVkaXQgdHJhaWwuXG4gICAqIFRoaXMgaXMgdGhlIHB1YmxpYyBkb29yIHRvIGEgc3ViZmxvdydzIGNvbW1pdHMgKHRoZSBydW4tbGV2ZWwgYGNvbW1pdExvZ2AgY2FycmllcyBvbmx5XG4gICAqIHRoZSBzdWJmbG93J3MgTU9VTlQgYm91bmRhcnksIG5vdCBpdHMgaW5uZXIgc3RhZ2VzIOKAlCBzdWJmbG93cyBydW4gaW4gaXNvbGF0ZWQgcnVudGltZXM7XG4gICAqIHNlZSBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKS4gYGZpbmRMYXN0V3JpdGVyYC9gY2F1c2FsQ2hhaW5gL1xuICAgKiBgY29tbWl0VmFsdWVBdGAgY2FuIHJ1biBQRVItU0NPUEUgb3ZlciB0aGlzLiBBYnNlbnQgd2hlbiBgc3ViZmxvd1Jlc3VsdHNgIHdhcyBub3RcbiAgICogcG9wdWxhdGVkLiBGb3IgYSBMT09QSU5HIHN1YmZsb3cgdGhpcyBpcyB0aGUgTEFTVCBpdGVyYXRpb247IGFkZHJlc3MgYSBzcGVjaWZpY1xuICAgKiBpdGVyYXRpb24gYnkgcGFzc2luZyBpdHMgbW91bnQgYHJ1bnRpbWVTdGFnZUlkYCBhcyB0aGUgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGhpc3Rvcnk/OiByZWFkb25seSB1bmtub3duW107XG4gIC8qKlxuICAgKiBUaGUgc3ViZmxvdydzIE9XTiBmb2xkIGJhc2Ug4oCUIHRoZSBzdGF0ZSBpdHMgaXNvbGF0ZWQgcnVudGltZSBzdGFydGVkIGZyb20sXG4gICAqIGJlZm9yZSBpdHMgZmlyc3QgY29tbWl0IChgdHJlZUNvbnRleHQuaW5pdGlhbFN0YXRlYCkuIFBhaXIgaXQgd2l0aFxuICAgKiBgaGlzdG9yeWAgdG8gZm9sZCB0aGUgc3ViZmxvdydzIHN0YXRlIGF0IGFueSBvZiBpdHMgY29tbWl0czpcbiAgICogYHN0YXRlQXQoc3VidHJlZSwgaSlgIGZyb20gYGZvb3RwcmludGpzL3RyYWNlYCByZWFkcyBleGFjdGx5IHRoZXNlIHR3b1xuICAgKiBmaWVsZHMuIE5vcm1hbGx5IGB7fWAg4oCUIGEgc3ViZmxvdydzIGBpbnB1dE1hcHBlcmAgc2VlZCBpcyBpdHMgZmlyc3RcbiAgICogQ09NTUlULCBub3QgYSBwcmUtcnVuIGJhc2UuXG4gICAqL1xuICByZWFkb25seSBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqIE5hcnJhdGl2ZSBlbnRyaWVzIHNjb3BlZCB0byB0aGlzIHN1YmZsb3cgKGJldHdlZW4gZW50cnkvZXhpdCBldmVudHMpLiAqL1xuICByZWFkb25seSBuYXJyYXRpdmVFbnRyaWVzPzogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdO1xufVxuXG4vKipcbiAqIE5hdmlnYXRlIHRoZSBleGVjdXRpb24gc25hcHNob3QgdHJlZSBieSBhIHNsYXNoLXNlcGFyYXRlZCBzdWJmbG93IHBhdGguXG4gKlxuICogKipJbXBsZW1lbnRhdGlvbiBub3RlOioqIGZvb3RwcmludGpzJ3MgU3ViZmxvd0V4ZWN1dG9yIHN0b3JlcyBuZXN0ZWQgc3ViZmxvd1xuICogcmVzdWx0cyB3aXRoIGNvbXBvc2l0ZSBzbGFzaC1zZXBhcmF0ZWQga2V5cyAoZS5nLiBcInNmLW91dGVyL3NmLWlubmVyXCIpIGluXG4gKiB0aGUgZmxhdCBgc3ViZmxvd1Jlc3VsdHNgIG1hcC4gVGhpcyBmdW5jdGlvbiB1c2VzIHRob3NlIGtleXMgZm9yIGxvb2t1cC5cbiAqXG4gKiBAcGFyYW0gc25hcHNob3Qg4oCUIHRoZSBmdWxsIFJ1bnRpbWVTbmFwc2hvdCBmcm9tIGBleGVjdXRvci5nZXRTbmFwc2hvdCgpYFxuICogQHBhcmFtIHBhdGgg4oCUIHNsYXNoLXNlcGFyYXRlZCBzdWJmbG93IElEcywgZS5nLiBgXCJzZi1wYXltZW50XCJgIG9yIGBcInNmLXBheW1lbnQvc2YtdmFsaWRhdGlvblwiYFxuICogQHBhcmFtIGFsbE5hcnJhdGl2ZUVudHJpZXMg4oCUIG9wdGlvbmFsIGZ1bGwgbmFycmF0aXZlIGVudHJpZXMgZnJvbSBgZXhlY3V0b3IuZ2V0TmFycmF0aXZlRW50cmllcygpYCwgdXNlZCB0byBleHRyYWN0IHNjb3BlZCBuYXJyYXRpdmUgZm9yIHRoZSBzdWJ0cmVlXG4gKiBAcmV0dXJucyB0aGUgbWF0Y2hpbmcgU3VidHJlZVNuYXBzaG90LCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgcGF0aCBpcyBub3QgZm91bmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN1YnRyZWVTbmFwc2hvdChcbiAgc25hcHNob3Q6IFJ1bnRpbWVTbmFwc2hvdCxcbiAgcGF0aDogc3RyaW5nLFxuICBhbGxOYXJyYXRpdmVFbnRyaWVzPzogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdLFxuKTogU3VidHJlZVNuYXBzaG90IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFzbmFwc2hvdCB8fCAhcGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGguc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbikuam9pbignLycpO1xuICBpZiAoIW5vcm1hbGl6ZWRQYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN1YmZsb3dSZXN1bHRzID0gc25hcHNob3Quc3ViZmxvd1Jlc3VsdHM7XG4gIGNvbnN0IGxhc3RTZWdtZW50ID0gbm9ybWFsaXplZFBhdGguc3BsaXQoJy8nKS5wb3AoKSE7XG5cbiAgLy8gU3RyYXRlZ3kgMTogRGlyZWN0IGxvb2t1cCBpbiBzdWJmbG93UmVzdWx0cyBieSBmdWxsIHBhdGguXG4gIC8vIFN1YmZsb3dFeGVjdXRvciBzdG9yZXMgbmVzdGVkIHJlc3VsdHMgd2l0aCBjb21wb3NpdGUgc2xhc2gtc2VwYXJhdGVkIGtleXMuXG4gIGlmIChzdWJmbG93UmVzdWx0cyAmJiBzdWJmbG93UmVzdWx0c1tub3JtYWxpemVkUGF0aF0pIHtcbiAgICBjb25zdCBzZlJlc3VsdCA9IHN1YmZsb3dSZXN1bHRzW25vcm1hbGl6ZWRQYXRoXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCB0cmVlQ3R4ID0gc2ZSZXN1bHQudHJlZUNvbnRleHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3ViZmxvd0lkOiBsYXN0U2VnbWVudCxcbiAgICAgIGV4ZWN1dGlvblRyZWU6XG4gICAgICAgICh0cmVlQ3R4Py5zdGFnZUNvbnRleHRzIGFzIHVua25vd24gYXMgU3RhZ2VTbmFwc2hvdCkgPz8gZmluZFN1YmZsb3dJblRyZWUoc25hcHNob3QuZXhlY3V0aW9uVHJlZSwgbGFzdFNlZ21lbnQpLFxuICAgICAgc2hhcmVkU3RhdGU6IHRyZWVDdHg/Lmdsb2JhbENvbnRleHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICBoaXN0b3J5OiB0cmVlQ3R4Py5oaXN0b3J5IGFzIHJlYWRvbmx5IHVua25vd25bXSB8IHVuZGVmaW5lZCxcbiAgICAgIGluaXRpYWxTdGF0ZTogdHJlZUN0eD8uaW5pdGlhbFN0YXRlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgbmFycmF0aXZlRW50cmllczogYWxsTmFycmF0aXZlRW50cmllcyA/IGV4dHJhY3RTY29wZWROYXJyYXRpdmUoYWxsTmFycmF0aXZlRW50cmllcywgbGFzdFNlZ21lbnQpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICAvLyBTdHJhdGVneSAyOiBGaW5kIHRoZSBub2RlIGluIHRoZSBleGVjdXRpb24gdHJlZSBieSBzdWJmbG93SWQuXG4gIC8vIFRoaXMgcGF0aCBsYWNrcyBzaGFyZWRTdGF0ZSAoc3ViZmxvd1Jlc3VsdHMgd2FzIG5vdCBwb3B1bGF0ZWQpLlxuICAvLyBUaGlzIHR5cGljYWxseSBtZWFucyB0aGUgZXhlY3V0b3IgcmFuIHdpdGhvdXQgc3ViZmxvdyByZXN1bHQgZW5yaWNobWVudC5cbiAgY29uc3QgZm91bmROb2RlID0gZmluZFN1YmZsb3dJblRyZWUoc25hcHNob3QuZXhlY3V0aW9uVHJlZSwgbGFzdFNlZ21lbnQpO1xuICBpZiAoIWZvdW5kTm9kZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW2Zvb3RwcmludF0gZ2V0U3VidHJlZVNuYXBzaG90KCcke25vcm1hbGl6ZWRQYXRofScpOiBzdWJmbG93UmVzdWx0cyBub3QgcG9wdWxhdGVkIOKAlCBgICtcbiAgICAgICAgJ3NoYXJlZFN0YXRlIHdpbGwgYmUgdW5kZWZpbmVkLiBUaGUgc3ViZmxvdyBtYXkgbm90IGhhdmUgY29tcGxldGVkLCAnICtcbiAgICAgICAgJ29yIGl0cyBvdXRwdXRNYXBwZXIgZGlkIG5vdCB3cml0ZSBiYWNrIHRvIHRoZSBwYXJlbnQgc2NvcGUuJyxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdWJmbG93SWQ6IGxhc3RTZWdtZW50LFxuICAgIGV4ZWN1dGlvblRyZWU6IGZvdW5kTm9kZSxcbiAgICBzaGFyZWRTdGF0ZTogdW5kZWZpbmVkLFxuICAgIG5hcnJhdGl2ZUVudHJpZXM6IGFsbE5hcnJhdGl2ZUVudHJpZXMgPyBleHRyYWN0U2NvcGVkTmFycmF0aXZlKGFsbE5hcnJhdGl2ZUVudHJpZXMsIGxhc3RTZWdtZW50KSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBMaXN0IGFsbCBhdmFpbGFibGUgc3ViZmxvdyBwYXRocyBpbiBhIHNuYXBzaG90LlxuICpcbiAqIFJldHVybnMgdGhlIGtleXMgZnJvbSBgc3ViZmxvd1Jlc3VsdHNgLCB3aGljaCBhcmUgc2xhc2gtc2VwYXJhdGVkXG4gKiBzdWJmbG93IElEIHBhdGhzIChlLmcuIGBbXCJzZi1wYXltZW50XCIsIFwic2Ytb3V0ZXIvc2YtaW5uZXJcIl1gKS5cbiAqIFVzZWZ1bCBmb3IgZGlzY292ZXJ5IOKAlCBhbiBMTE0gb3IgVUkgY2FuIGVudW1lcmF0ZSBhdmFpbGFibGUgZHJpbGwtZG93biB0YXJnZXRzLlxuICpcbiAqIEBwYXJhbSBzbmFwc2hvdCDigJQgdGhlIGZ1bGwgUnVudGltZVNuYXBzaG90IGZyb20gYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgXG4gKiBAcmV0dXJucyBhcnJheSBvZiBhdmFpbGFibGUgc3ViZmxvdyBwYXRocywgZW1wdHkgaWYgbm9uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFN1YmZsb3dQYXRocyhzbmFwc2hvdDogUnVudGltZVNuYXBzaG90KTogc3RyaW5nW10ge1xuICBpZiAoIXNuYXBzaG90Py5zdWJmbG93UmVzdWx0cykgcmV0dXJuIFtdO1xuICAvLyBgc3ViZmxvd1Jlc3VsdHNgIGlzIGR1YWwta2V5ZWQgKGRlc2lnbjogc3ViZmxvdy1jb21taXQtdmlzaWJpbGl0eSk6IHN1YmZsb3cgUEFUSFMgcGx1c1xuICAvLyBwZXItaXRlcmF0aW9uIG1vdW50IGBydW50aW1lU3RhZ2VJZGBzICh3aGljaCBjb250YWluICcjJykuIFRoaXMgZnVuY3Rpb24ncyBjb250cmFjdCBpc1xuICAvLyBwYXRoLW9ubHksIHNvIGZpbHRlciB0aGUgJyMnIGtleXMgb3V0IOKAlCBhZGRyZXNzaW5nIGEgc3BlY2lmaWMgaXRlcmF0aW9uIGlzIGRvbmUgYnkgcGFzc2luZ1xuICAvLyBpdHMgcnVudGltZVN0YWdlSWQgc3RyYWlnaHQgdG8gZ2V0U3VidHJlZVNuYXBzaG90LlxuICByZXR1cm4gT2JqZWN0LmtleXMoc25hcHNob3Quc3ViZmxvd1Jlc3VsdHMpLmZpbHRlcigoaykgPT4gIWsuaW5jbHVkZXMoJyMnKSk7XG59XG5cbi8qKlxuICogRXh0cmFjdCBuYXJyYXRpdmUgZW50cmllcyBzY29wZWQgdG8gYSBzcGVjaWZpYyBzdWJmbG93LlxuICogRmlsdGVycyBieSBlbnRyeS5zdWJmbG93SWQgZmllbGQgKHNldCBieSBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIGR1cmluZyB0cmF2ZXJzYWwpLlxuICogQWxzbyBpbmNsdWRlcyB0aGUgc3ViZmxvdyBlbnRyeS9leGl0IG1hcmtlciBlbnRyaWVzIHRoZW1zZWx2ZXMuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RTY29wZWROYXJyYXRpdmUoZW50cmllczogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdLCBwYXRoOiBzdHJpbmcpOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10ge1xuICAvLyBUaGUgbGFzdCBzZWdtZW50IG9mIHRoZSBwYXRoIGlzIHRoZSBzdWJmbG93SWQgc3RvcmVkIG9uIGVudHJpZXNcbiAgY29uc3Qgc3ViZmxvd0lkID0gcGF0aC5zcGxpdCgnLycpLnBvcCgpITtcbiAgcmV0dXJuIGVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4ge1xuICAgIC8vIEluY2x1ZGUgZW50cmllcyB3aG9zZSBzdWJmbG93SWQgbWF0Y2hlcyAoZXZlbnRzIGVtaXR0ZWQgd2hpbGUgaW5zaWRlIHRoaXMgc3ViZmxvdylcbiAgICBpZiAoZW50cnkuc3ViZmxvd0lkID09PSBzdWJmbG93SWQpIHJldHVybiB0cnVlO1xuICAgIC8vIEFsc28gaW5jbHVkZSB0aGUgc3ViZmxvdyBlbnRyeS9leGl0IG1hcmtlcnMgKHRoZXkgY2FycnkgdGhlIHBhcmVudCBzdWJmbG93SWQgb3IgdW5kZWZpbmVkKVxuICAgIGlmIChlbnRyeS50eXBlID09PSAnc3ViZmxvdycgJiYgZW50cnkuc3RhZ2VJZCA9PT0gc3ViZmxvd0lkKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xufVxuXG4vKipcbiAqIEZpbmQgYSBzdWJmbG93IG5vZGUgaW4gdGhlIGV4ZWN1dGlvbiB0cmVlIGJ5IHNlYXJjaGluZyBmb3IgYSBub2RlXG4gKiB3aG9zZSBzdWJmbG93SWQgbWF0Y2hlcy5cbiAqIFNlYXJjaGVzIGRlcHRoLWZpcnN0IHRocm91Z2ggYG5leHRgIGFuZCBgY2hpbGRyZW5gIGxpbmtzLlxuICovXG5mdW5jdGlvbiBmaW5kU3ViZmxvd0luVHJlZShub2RlOiBTdGFnZVNuYXBzaG90IHwgdW5kZWZpbmVkLCBzdWJmbG93SWQ6IHN0cmluZyk6IFN0YWdlU25hcHNob3QgfCB1bmRlZmluZWQge1xuICBpZiAoIW5vZGUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgaWYgKG5vZGUuc3ViZmxvd0lkID09PSBzdWJmbG93SWQpIHJldHVybiBub2RlO1xuXG4gIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IGZpbmRTdWJmbG93SW5UcmVlKGNoaWxkLCBzdWJmbG93SWQpO1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vZGUubmV4dCkge1xuICAgIHJldHVybiBmaW5kU3ViZmxvd0luVHJlZShub2RlLm5leHQsIHN1YmZsb3dJZCk7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0U3VidHJlZVNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ydW5uZXIvZ2V0U3VidHJlZVNuYXBzaG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHOzs7QUFFSCw4Q0FBMEM7QUFvQzFDOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQ2hDLFFBQXlCLEVBQ3pCLElBQVksRUFDWixtQkFBOEM7SUFFOUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUV6QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakUsSUFBSSxDQUFDLGNBQWM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUV0QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQy9DLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFHLENBQUM7SUFFckQsNERBQTREO0lBQzVELDZFQUE2RTtJQUM3RSxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUE0QixDQUFDO1FBQzNFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxXQUFrRCxDQUFDO1FBRTVFLE9BQU87WUFDTCxTQUFTLEVBQUUsV0FBVztZQUN0QixhQUFhLEVBQ1YsT0FBTyxFQUFFLGFBQTBDLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUM7WUFDaEgsV0FBVyxFQUFFLE9BQU8sRUFBRSxhQUFvRDtZQUMxRSxPQUFPLEVB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QUNqRCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZ2V0U3VidHJlZVNuYXBzaG90IOKAlCBuYXZpZ2F0ZSBhbiBleGVjdXRpb24gc25hcHNob3QgdHJlZSBieSBzdWJmbG93IHBhdGguXG4gKlxuICogR2l2ZW4gYSBSdW50aW1lU25hcHNob3QgYW5kIGEgc2xhc2gtc2VwYXJhdGVkIHBhdGggb2Ygc3ViZmxvdyBJRHMsXG4gKiByZXR1cm5zIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCB0aGF0IHN1YmZsb3cuIFVzZWZ1bCBmb3IgTExNIGRyaWxsLWRvd246XG4gKiBpbnN0ZWFkIG9mIGR1bXBpbmcgdGhlIGZ1bGwgdHJhY2UsIGZldGNoIG9ubHkgdGhlIHJlbGV2YW50IHN1YnRyZWUuXG4gKlxuICogVXNhZ2U6XG4gKiAgIGNvbnN0IHNuYXBzaG90ID0gZXhlY3V0b3IuZ2V0U25hcHNob3QoKTtcbiAqXG4gKiAgIC8vIFRvcC1sZXZlbCBzdWJmbG93XG4gKiAgIGdldFN1YnRyZWVTbmFwc2hvdChzbmFwc2hvdCwgJ3NmLXBheW1lbnQnKTtcbiAqXG4gKiAgIC8vIE5lc3RlZCBzdWJmbG93IChwYXltZW50IOKGkiB2YWxpZGF0aW9uKVxuICogICBnZXRTdWJ0cmVlU25hcHNob3Qoc25hcHNob3QsICdzZi1wYXltZW50L3NmLXZhbGlkYXRpb24nKTtcbiAqXG4gKiAgIC8vIFJldHVybnMgdW5kZWZpbmVkIGlmIHBhdGggbm90IGZvdW5kXG4gKiAgIGdldFN1YnRyZWVTbmFwc2hvdChzbmFwc2hvdCwgJ25vbmV4aXN0ZW50Jyk7IC8vIHVuZGVmaW5lZFxuICpcbiAqICAgLy8gRGlzY292ZXIgYXZhaWxhYmxlIHBhdGhzXG4gKiAgIGxpc3RTdWJmbG93UGF0aHMoc25hcHNob3QpOyAvLyBbJ3NmLXBheW1lbnQnLCAnc2YtcGF5bWVudC9zZi12YWxpZGF0aW9uJ11cbiAqL1xuXG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvbmFycmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZVNuYXBzaG90IH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVudGltZVNuYXBzaG90IH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lLmpzJztcblxuLyoqIFRoZSByZXN1bHQgb2YgbmF2aWdhdGluZyB0byBhIHN1YnRyZWUgd2l0aGluIGEgc25hcHNob3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1YnRyZWVTbmFwc2hvdCB7XG4gIC8qKiBUaGUgc3ViZmxvdyBJRCB0aGF0IHdhcyBtYXRjaGVkIChsYXN0IHNlZ21lbnQgb2YgdGhlIHBhdGgpLiAqL1xuICByZWFkb25seSBzdWJmbG93SWQ6IHN0cmluZztcbiAgLyoqIFRoZSBleGVjdXRpb24gdHJlZSByb290ZWQgYXQgdGhpcyBzdWJmbG93LiAqL1xuICByZWFkb25seSBleGVjdXRpb25UcmVlOiBTdGFnZVNuYXBzaG90O1xuICAvKiogU2hhcmVkIHN0YXRlIHNjb3BlZCB0byB0aGlzIHN1YmZsb3cgKGZyb20gc3ViZmxvd1Jlc3VsdHMgaWYgYXZhaWxhYmxlKS4gKi9cbiAgcmVhZG9ubHkgc2hhcmVkU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgLyoqXG4gICAqIFRoZSBzdWJmbG93J3MgT1dOIGNvbW1pdCBsb2cgKGB0cmVlQ29udGV4dC5oaXN0b3J5YCkg4oCUIHRoZSBwZXItc3ViZmxvdyBhdWRpdCB0cmFpbC5cbiAgICogVGhpcyBpcyB0aGUgcHVibGljIGRvb3IgdG8gYSBzdWJmbG93J3MgY29tbWl0cyAodGhlIHJ1bi1sZXZlbCBgY29tbWl0TG9nYCBjYXJyaWVzIG9ubHlcbiAgICogdGhlIHN1YmZsb3cncyBNT1VOVCBib3VuZGFyeSwgbm90IGl0cyBpbm5lciBzdGFnZXMg4oCUIHN1YmZsb3dzIHJ1biBpbiBpc29sYXRlZCBydW50aW1lcztcbiAgICogc2VlIGRvY3MvZGVzaWduL3N1YmZsb3ctY29tbWl0LXZpc2liaWxpdHkubWQpLiBgZmluZExhc3RXcml0ZXJgL2BjYXVzYWxDaGFpbmAvXG4gICAqIGBjb21taXRWYWx1ZUF0YCBjYW4gcnVuIFBFUi1TQ09QRSBvdmVyIHRoaXMuIEFic2VudCB3aGVuIGBzdWJmbG93UmVzdWx0c2Agd2FzIG5vdFxuICAgKiBwb3B1bGF0ZWQuIEZvciBhIExPT1BJTkcgc3ViZmxvdyB0aGlzIGlzIHRoZSBMQVNUIGl0ZXJhdGlvbjsgYWRkcmVzcyBhIHNwZWNpZmljXG4gICAqIGl0ZXJhdGlvbiBieSBwYXNzaW5nIGl0cyBtb3VudCBgcnVudGltZVN0YWdlSWRgIGFzIHRoZSBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgaGlzdG9yeT86IHJlYWRvbmx5IHVua25vd25bXTtcbiAgLyoqXG4gICAqIFRoZSBzdWJmbG93J3MgT1dOIGZvbGQgYmFzZSDigJQgdGhlIHN0YXRlIGl0cyBpc29sYXRlZCBydW50aW1lIHN0YXJ0ZWQgZnJvbSxcbiAgICogYmVmb3JlIGl0cyBmaXJzdCBjb21taXQgKGB0cmVlQ29udGV4dC5pbml0aWFsU3RhdGVgKS4gUGFpciBpdCB3aXRoXG4gICAqIGBoaXN0b3J5YCB0byBmb2xkIHRoZSBzdWJmbG93J3Mgc3RhdGUgYXQgYW55IG9mIGl0cyBjb21taXRzOlxuICAgKiBgc3RhdGVBdChzdWJ0cmVlLCBpKWAgZnJvbSBgZm9vdHByaW50anMvdHJhY2VgIHJlYWRzIGV4YWN0bHkgdGhlc2UgdHdvXG4gICAqIGZpZWxkcy4gTm9ybWFsbHkgYHt9YCDigJQgYSBzdWJmbG93J3MgYGlucHV0TWFwcGVyYCBzZWVkIGlzIGl0cyBmaXJzdFxuICAgKiBDT01NSVQsIG5vdCBhIHByZS1ydW4gYmFzZS5cbiAgICovXG4gIHJlYWRvbmx5IGluaXRpYWxTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogTmFycmF0aXZlIGVudHJpZXMgc2NvcGVkIHRvIHRoaXMgc3ViZmxvdyAoYmV0d2VlbiBlbnRyeS9leGl0IGV2ZW50cykuICovXG4gIHJlYWRvbmx5IG5hcnJhdGl2ZUVudHJpZXM/OiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W107XG59XG5cbi8qKlxuICogTmF2aWdhdGUgdGhlIGV4ZWN1dGlvbiBzbmFwc2hvdCB0cmVlIGJ5IGEgc2xhc2gtc2VwYXJhdGVkIHN1YmZsb3cgcGF0aC5cbiAqXG4gKiAqKkltcGxlbWVudGF0aW9uIG5vdGU6KiogZm9vdHByaW50anMncyBTdWJmbG93RXhlY3V0b3Igc3RvcmVzIG5lc3RlZCBzdWJmbG93XG4gKiByZXN1bHRzIHdpdGggY29tcG9zaXRlIHNsYXNoLXNlcGFyYXRlZCBrZXlzIChlLmcuIFwic2Ytb3V0ZXIvc2YtaW5uZXJcIikgaW5cbiAqIHRoZSBmbGF0IGBzdWJmbG93UmVzdWx0c2AgbWFwLiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhvc2Uga2V5cyBmb3IgbG9va3VwLlxuICpcbiAqIEBwYXJhbSBzbmFwc2hvdCDigJQgdGhlIGZ1bGwgUnVudGltZVNuYXBzaG90IGZyb20gYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgXG4gKiBAcGFyYW0gcGF0aCDigJQgc2xhc2gtc2VwYXJhdGVkIHN1YmZsb3cgSURzLCBlLmcuIGBcInNmLXBheW1lbnRcImAgb3IgYFwic2YtcGF5bWVudC9zZi12YWxpZGF0aW9uXCJgXG4gKiBAcGFyYW0gYWxsTmFycmF0aXZlRW50cmllcyDigJQgb3B0aW9uYWwgZnVsbCBuYXJyYXRpdmUgZW50cmllcyBmcm9tIGBleGVjdXRvci5nZXROYXJyYXRpdmVFbnRyaWVzKClgLCB1c2VkIHRvIGV4dHJhY3Qgc2NvcGVkIG5hcnJhdGl2ZSBmb3IgdGhlIHN1YnRyZWVcbiAqIEByZXR1cm5zIHRoZSBtYXRjaGluZyBTdWJ0cmVlU25hcHNob3QsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBwYXRoIGlzIG5vdCBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3VidHJlZVNuYXBzaG90KFxuICBzbmFwc2hvdDogUnVudGltZVNuYXBzaG90LFxuICBwYXRoOiBzdHJpbmcsXG4gIGFsbE5hcnJhdGl2ZUVudHJpZXM/OiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10sXG4pOiBTdWJ0cmVlU25hcHNob3QgfCB1bmRlZmluZWQge1xuICBpZiAoIXNuYXBzaG90IHx8ICFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKS5qb2luKCcvJyk7XG4gIGlmICghbm9ybWFsaXplZFBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3ViZmxvd1Jlc3VsdHMgPSBzbmFwc2hvdC5zdWJmbG93UmVzdWx0cztcbiAgY29uc3QgbGFzdFNlZ21lbnQgPSBub3JtYWxpemVkUGF0aC5zcGxpdCgnLycpLnBvcCgpITtcblxuICAvLyBTdHJhdGVneSAxOiBEaXJlY3QgbG9va3VwIGluIHN1YmZsb3dSZXN1bHRzIGJ5IGZ1bGwgcGF0aC5cbiAgLy8gU3ViZmxvd0V4ZWN1dG9yIHN0b3JlcyBuZXN0ZWQgcmVzdWx0cyB3aXRoIGNvbXBvc2l0ZSBzbGFzaC1zZXBhcmF0ZWQga2V5cy5cbiAgaWYgKHN1YmZsb3dSZXN1bHRzICYmIHN1YmZsb3dSZXN1bHRzW25vcm1hbGl6ZWRQYXRoXSkge1xuICAgIGNvbnN0IHNmUmVzdWx0ID0gc3ViZmxvd1Jlc3VsdHNbbm9ybWFsaXplZFBhdGhdIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHRyZWVDdHggPSBzZlJlc3VsdC50cmVlQ29udGV4dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICBzdWJmbG93SWQ6IGxhc3RTZWdtZW50LFxuICAgICAgZXhlY3V0aW9uVHJlZTpcbiAgICAgICAgKHRyZWVDdHg/LnN0YWdlQ29udGV4dHMgYXMgdW5rbm93biBhcyBTdGFnZVNuYXBzaG90KSA/PyBmaW5kU3ViZmxvd0luVHJlZShzbmFwc2hvdC5leGVjdXRpb25UcmVlLCBsYXN0U2VnbWVudCksXG4gICAgICBzaGFyZWRTdGF0ZTogdHJlZUN0eD8uZ2xvYmFsQ29udGV4dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAgIGhpc3Rvcnk6IHRyZWVDdHg/Lmhpc3RvcnkgYXMgcmVhZG9ubHkgdW5rbm93bltdIHwgdW5kZWZpbmVkLFxuICAgICAgaW5pdGlhbFN0YXRlOiB0cmVlQ3R4Py5pbml0aWFsU3RhdGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICBuYXJyYXRpdmVFbnRyaWVzOiBhbGxOYXJyYXRpdmVFbnRyaWVzID8gZXh0cmFjdFNjb3BlZE5hcnJhdGl2ZShhbGxOYXJyYXRpdmVFbnRyaWVzLCBsYXN0U2VnbWVudCkgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFN0cmF0ZWd5IDI6IEZpbmQgdGhlIG5vZGUgaW4gdGhlIGV4ZWN1dGlvbiB0cmVlIGJ5IHN1YmZsb3dJZC5cbiAgLy8gVGhpcyBwYXRoIGxhY2tzIHNoYXJlZFN0YXRlIChzdWJmbG93UmVzdWx0cyB3YXMgbm90IHBvcHVsYXRlZCkuXG4gIC8vIFRoaXMgdHlwaWNhbGx5IG1lYW5zIHRoZSBleGVjdXRvciByYW4gd2l0aG91dCBzdWJmbG93IHJlc3VsdCBlbnJpY2htZW50LlxuICBjb25zdCBmb3VuZE5vZGUgPSBmaW5kU3ViZmxvd0luVHJlZShzbmFwc2hvdC5leGVjdXRpb25UcmVlLCBsYXN0U2VnbWVudCk7XG4gIGlmICghZm91bmROb2RlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGlmIChpc0Rldk1vZGUoKSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbZm9vdHByaW50XSBnZXRTdWJ0cmVlU25hcHNob3QoJyR7bm9ybWFsaXplZFBhdGh9Jyk6IHN1YmZsb3dSZXN1bHRzIG5vdCBwb3B1bGF0ZWQg4oCUIGAgK1xuICAgICAgICAnc2hhcmVkU3RhdGUgd2lsbCBiZSB1bmRlZmluZWQuIFRoZSBzdWJmbG93IG1heSBub3QgaGF2ZSBjb21wbGV0ZWQsICcgK1xuICAgICAgICAnb3IgaXRzIG91dHB1dE1hcHBlciBkaWQgbm90IHdyaXRlIGJhY2sgdG8gdGhlIHBhcmVudCBzY29wZS4nLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN1YmZsb3dJZDogbGFzdFNlZ21lbnQsXG4gICAgZXhlY3V0aW9uVHJlZTogZm91bmROb2RlLFxuICAgIHNoYXJlZFN0YXRlOiB1bmRlZmluZWQsXG4gICAgbmFycmF0aXZlRW50cmllczogYWxsTmFycmF0aXZlRW50cmllcyA/IGV4dHJhY3RTY29wZWROYXJyYXRpdmUoYWxsTmFycmF0aXZlRW50cmllcywgbGFzdFNlZ21lbnQpIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIExpc3QgYWxsIGF2YWlsYWJsZSBzdWJmbG93IHBhdGhzIGluIGEgc25hcHNob3QuXG4gKlxuICogUmV0dXJucyB0aGUga2V5cyBmcm9tIGBzdWJmbG93UmVzdWx0c2AsIHdoaWNoIGFyZSBzbGFzaC1zZXBhcmF0ZWRcbiAqIHN1YmZsb3cgSUQgcGF0aHMgKGUuZy4gYFtcInNmLXBheW1lbnRcIiwgXCJzZi1vdXRlci9zZi1pbm5lclwiXWApLlxuICogVXNlZnVsIGZvciBkaXNjb3Zlcnkg4oCUIGFuIExMTSBvciBVSSBjYW4gZW51bWVyYXRlIGF2YWlsYWJsZSBkcmlsbC1kb3duIHRhcmdldHMuXG4gKlxuICogQHBhcmFtIHNuYXBzaG90IOKAlCB0aGUgZnVsbCBSdW50aW1lU25hcHNob3QgZnJvbSBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWBcbiAqIEByZXR1cm5zIGFycmF5IG9mIGF2YWlsYWJsZSBzdWJmbG93IHBhdGhzLCBlbXB0eSBpZiBub25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0U3ViZmxvd1BhdGhzKHNuYXBzaG90OiBSdW50aW1lU25hcHNob3QpOiBzdHJpbmdbXSB7XG4gIGlmICghc25hcHNob3Q/LnN1YmZsb3dSZXN1bHRzKSByZXR1cm4gW107XG4gIC8vIGBzdWJmbG93UmVzdWx0c2AgaXMgZHVhbC1rZXllZCAoZGVzaWduOiBzdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5KTogc3ViZmxvdyBQQVRIUyBwbHVzXG4gIC8vIHBlci1pdGVyYXRpb24gbW91bnQgYHJ1bnRpbWVTdGFnZUlkYHMgKHdoaWNoIGNvbnRhaW4gJyMnKS4gVGhpcyBmdW5jdGlvbidzIGNvbnRyYWN0IGlzXG4gIC8vIHBhdGgtb25seSwgc28gZmlsdGVyIHRoZSAnIycga2V5cyBvdXQg4oCUIGFkZHJlc3NpbmcgYSBzcGVjaWZpYyBpdGVyYXRpb24gaXMgZG9uZSBieSBwYXNzaW5nXG4gIC8vIGl0cyBydW50aW1lU3RhZ2VJZCBzdHJhaWdodCB0byBnZXRTdWJ0cmVlU25hcHNob3QuXG4gIHJldHVybiBPYmplY3Qua2V5cyhzbmFwc2hvdC5zdWJmbG93UmVzdWx0cykuZmlsdGVyKChrKSA9PiAhay5pbmNsdWRlcygnIycpKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IG5hcnJhdGl2ZSBlbnRyaWVzIHNjb3BlZCB0byBhIHNwZWNpZmljIHN1YmZsb3cuXG4gKiBGaWx0ZXJzIGJ5IGVudHJ5LnN1YmZsb3dJZCBmaWVsZCAoc2V0IGJ5IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgZHVyaW5nIHRyYXZlcnNhbCkuXG4gKiBBbHNvIGluY2x1ZGVzIHRoZSBzdWJmbG93IGVudHJ5L2V4aXQgbWFya2VyIGVudHJpZXMgdGhlbXNlbHZlcy5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFNjb3BlZE5hcnJhdGl2ZShlbnRyaWVzOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10sIHBhdGg6IHN0cmluZyk6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSB7XG4gIC8vIFRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIHBhdGggaXMgdGhlIHN1YmZsb3dJZCBzdG9yZWQgb24gZW50cmllc1xuICBjb25zdCBzdWJmbG93SWQgPSBwYXRoLnNwbGl0KCcvJykucG9wKCkhO1xuICByZXR1cm4gZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgLy8gSW5jbHVkZSBlbnRyaWVzIHdob3NlIHN1YmZsb3dJZCBtYXRjaGVzIChldmVudHMgZW1pdHRlZCB3aGlsZSBpbnNpZGUgdGhpcyBzdWJmbG93KVxuICAgIGlmIChlbnRyeS5zdWJmbG93SWQgPT09IHN1YmZsb3dJZCkgcmV0dXJuIHRydWU7XG4gICAgLy8gQWxzbyBpbmNsdWRlIHRoZSBzdWJmbG93IGVudHJ5L2V4aXQgbWFya2VycyAodGhleSBjYXJyeSB0aGUgcGFyZW50IHN1YmZsb3dJZCBvciB1bmRlZmluZWQpXG4gICAgaWYgKGVudHJ5LnR5cGUgPT09ICdzdWJmbG93JyAmJiBlbnRyeS5zdGFnZUlkID09PSBzdWJmbG93SWQpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59XG5cbi8qKlxuICogRmluZCBhIHN1YmZsb3cgbm9kZSBpbiB0aGUgZXhlY3V0aW9uIHRyZWUgYnkgc2VhcmNoaW5nIGZvciBhIG5vZGVcbiAqIHdob3NlIHN1YmZsb3dJZCBtYXRjaGVzLlxuICogU2VhcmNoZXMgZGVwdGgtZmlyc3QgdGhyb3VnaCBgbmV4dGAgYW5kIGBjaGlsZHJlbmAgbGlua3MuXG4gKi9cbmZ1bmN0aW9uIGZpbmRTdWJmbG93SW5UcmVlKG5vZGU6IFN0YWdlU25hcHNob3QgfCB1bmRlZmluZWQsIHN1YmZsb3dJZDogc3RyaW5nKTogU3RhZ2VTbmFwc2hvdCB8IHVuZGVmaW5lZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBpZiAobm9kZS5zdWJmbG93SWQgPT09IHN1YmZsb3dJZCkgcmV0dXJuIG5vZGU7XG5cbiAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gZmluZFN1YmZsb3dJblRyZWUoY2hpbGQsIHN1YmZsb3dJZCk7XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH1cblxuICBpZiAobm9kZS5uZXh0KSB7XG4gICAgcmV0dXJuIGZpbmRTdWJmbG93SW5UcmVlKG5vZGUubmV4dCwgc3ViZmxvd0lkKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
@@ -16,11 +16,13 @@
|
|
|
16
16
|
*/
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.ScopeFacade = void 0;
|
|
19
|
+
const circular_js_1 = require("../capture/circular.js");
|
|
20
|
+
const invokeHook_js_1 = require("../capture/invokeHook.js");
|
|
19
21
|
const spawn_js_1 = require("../detach/spawn.js");
|
|
22
|
+
const devMode_js_1 = require("../devMode.js");
|
|
20
23
|
const borrowedMutation_js_1 = require("../memory/borrowedMutation.js");
|
|
24
|
+
const placeholders_js_1 = require("../memory/placeholders.js");
|
|
21
25
|
const redaction_js_1 = require("../memory/redaction.js");
|
|
22
|
-
const invokeHook_js_1 = require("../recorder/invokeHook.js");
|
|
23
|
-
const detectCircular_js_1 = require("./detectCircular.js");
|
|
24
26
|
const readonlyInput_js_1 = require("./protection/readonlyInput.js");
|
|
25
27
|
class ScopeFacade {
|
|
26
28
|
static BRAND = Symbol.for('ScopeFacade@v1');
|
|
@@ -301,7 +303,7 @@ class ScopeFacade {
|
|
|
301
303
|
if (patterns && patterns.length > 0) {
|
|
302
304
|
for (const pattern of patterns) {
|
|
303
305
|
if (pattern.test(name)) {
|
|
304
|
-
finalPayload =
|
|
306
|
+
finalPayload = placeholders_js_1.SCOPE_PLACEHOLDER;
|
|
305
307
|
break;
|
|
306
308
|
}
|
|
307
309
|
}
|
|
@@ -476,8 +478,8 @@ class ScopeFacade {
|
|
|
476
478
|
// Check AFTER assertNotReadonly — don't warn for writes that will be blocked.
|
|
477
479
|
// Circular values work (terminal proxy handles them) but can produce
|
|
478
480
|
// surprising behavior in narrative, JSON serialization, and snapshots.
|
|
479
|
-
if ((0,
|
|
480
|
-
if ((0,
|
|
481
|
+
if ((0, devMode_js_1.isDevMode)() && value !== null && typeof value === 'object') {
|
|
482
|
+
if ((0, circular_js_1.hasCircularReference)(value)) {
|
|
481
483
|
// eslint-disable-next-line no-console
|
|
482
484
|
console.warn(`[footprint] Circular reference detected in setValue('${key}'). ` +
|
|
483
485
|
'Writes past the cycle depth will use terminal proxy tracking. ' +
|
|
@@ -507,8 +509,8 @@ class ScopeFacade {
|
|
|
507
509
|
(0, readonlyInput_js_1.assertNotReadonly)(this._readOnlyValues, key, 'write');
|
|
508
510
|
this.assertLive(key);
|
|
509
511
|
// Dev-mode: same circular check as setValue (merge targets can be circular too)
|
|
510
|
-
if ((0,
|
|
511
|
-
if ((0,
|
|
512
|
+
if ((0, devMode_js_1.isDevMode)() && value !== null && typeof value === 'object') {
|
|
513
|
+
if ((0, circular_js_1.hasCircularReference)(value)) {
|
|
512
514
|
// eslint-disable-next-line no-console
|
|
513
515
|
console.warn(`[footprint] Circular reference detected in updateValue('${key}'). ` +
|
|
514
516
|
'Consider flattening the data structure.');
|
|
@@ -634,4 +636,4 @@ class ScopeFacade {
|
|
|
634
636
|
}
|
|
635
637
|
}
|
|
636
638
|
exports.ScopeFacade = ScopeFacade;
|
|
637
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NvcGVGYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL1Njb3BlRmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBRUgsaURBRzRCO0FBRTVCLHVFQUFpRTtBQUNqRSx5REFBOEQ7QUFFOUQsNkRBQStEO0FBQy9ELDJEQUFzRTtBQUN0RSxvRUFBb0Y7QUFHcEYsTUFBYSxXQUFXO0lBQ2YsTUFBTSxDQUFVLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFNUQ7Ozs7T0FJRztJQUNLLE1BQU0sQ0FBVSxtQkFBbUIsR0FBc0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUV6RSxhQUFhLENBQWU7SUFDNUIsVUFBVSxDQUFTO0lBQ1YsZUFBZSxDQUFXO0lBRTdDLCtFQUErRTtJQUM5RCxXQUFXLENBQTBCO0lBRXRELHlFQUF5RTtJQUN4RCxhQUFhLENBQXlCO0lBRXZEO29FQUNnRTtJQUMvQyxRQUFRLENBQVU7SUFFbkMsK0RBQStEO0lBQzlDLE9BQU8sQ0FBVTtJQUVsQzs7Ozs7O09BTUc7SUFDYyxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRTlDLFVBQVUsR0FBb0IsRUFBRSxDQUFDO0lBRXpDOzs7Ozs7Ozs7O09BVUc7SUFDSyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBRTNCOzs7O09BSUc7SUFDSyxVQUFVLENBQWlCO0lBRW5DLFlBQVksT0FBcUIsRUFBRSxTQUFpQixFQUFFLGNBQXdCLEVBQUUsWUFBMkI7UUFDekcsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFBLG1DQUFn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c291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTY29wZUZhY2FkZSDigJQgQmFzZSBjbGFzcyB0aGF0IGxpYnJhcnkgY29uc3VtZXJzIGV4dGVuZCB0byBjcmVhdGUgY3VzdG9tIHNjb3BlIGNsYXNzZXNcbiAqXG4gKiBXcmFwcyBTdGFnZUNvbnRleHQgKGZyb20gbWVtb3J5LykgdG8gcHJvdmlkZSBhIGNvbnN1bWVyLWZyaWVuZGx5IEFQSSBmb3JcbiAqIHN0YXRlIGFjY2VzcywgZGVidWcgbG9nZ2luZywgbWV0cmljcywgYW5kIHJlY29yZGVyIGhvb2tzLlxuICpcbiAqIENvbnN1bWVycyBleHRlbmQgdGhpcyBjbGFzcyB0byBhZGQgZG9tYWluLXNwZWNpZmljIHByb3BlcnRpZXM6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgTXlTY29wZSBleHRlbmRzIFNjb3BlRmFjYWRlIHtcbiAqICAgZ2V0IHVzZXJOYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFZhbHVlKCduYW1lJykgYXMgc3RyaW5nOyB9XG4gKiAgIHNldCB1c2VyTmFtZSh2YWx1ZTogc3RyaW5nKSB7IHRoaXMuc2V0VmFsdWUoJ25hbWUnLCB2YWx1ZSk7IH1cbiAqIH1cbiAqIGBgYFxuICovXG5cbmltcG9ydCB7XG4gIGRldGFjaEFuZEZvcmdldCBhcyBkZXRhY2hBbmRGb3JnZXRTcGF3bixcbiAgZGV0YWNoQW5kSm9pbkxhdGVyIGFzIGRldGFjaEFuZEpvaW5MYXRlclNwYXduLFxufSBmcm9tICcuLi9kZXRhY2gvc3Bhd24uanMnO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25FbnYgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVhZEZyYW1lTWVzc2FnZSB9IGZyb20gJy4uL21lbW9yeS9ib3Jyb3dlZE11dGF0aW9uLmpzJztcbmltcG9ydCB7IENMRUFSLCBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi4vbWVtb3J5L3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGludm9rZVJlY29yZGVySG9vayB9IGZyb20gJy4uL3JlY29yZGVyL2ludm9rZUhvb2suanMnO1xuaW1wb3J0IHsgaGFzQ2lyY3VsYXJSZWZlcmVuY2UsIGlzRGV2TW9kZSB9IGZyb20gJy4vZGV0ZWN0Q2lyY3VsYXIuanMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90UmVhZG9ubHksIGNyZWF0ZUZyb3plbkFyZ3MgfSBmcm9tICcuL3Byb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEV2ZW50LCBSZWRhY3Rpb25Qb2xpY3ksIFJlZGFjdGlvblJlcG9ydCwgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgU2NvcGVGYWNhZGUge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJSQU5EID0gU3ltYm9sLmZvcignU2NvcGVGYWNhZGVAdjEnKTtcblxuICAvKipcbiAgICogU2hhcmVkIHNlbnRpbmVsIHJldHVybmVkIGJ5IGBfZ2V0U3ViZmxvd1BhdGgoKWAgZm9yIHJvb3QtbGV2ZWwgc3RhZ2VzXG4gICAqIChubyBzdWJmbG93IG5lc3RpbmcpLiBBdm9pZHMgcGVyLWNhbGwgYWxsb2NhdGlvbiBvZiBhIGZyZXNoXG4gICAqIGBPYmplY3QuZnJlZXplKFtdKWAgb24gZXZlcnkgYGVtaXRFdmVudGAgaW4gdGhlIGNvbW1vbiBuby1zdWJmbG93IGNhc2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBfRU1QVFlfU1VCRkxPV19QQVRIOiByZWFkb25seSBzdHJpbmdbXSA9IE9iamVjdC5mcmVlemUoW10pO1xuXG4gIHByb3RlY3RlZCBfc3RhZ2VDb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIHByb3RlY3RlZCBfc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfcmVhZE9ubHlWYWx1ZXM/OiB1bmtub3duO1xuXG4gIC8qKiBDYWNoZWQgZGVlcGx5LWZyb3plbiBjb3B5IG9mIHJlYWRPbmx5VmFsdWVzIGZvciBnZXRBcmdzKCkuIENyZWF0ZWQgb25jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZnJvemVuQXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcmVhZC1vbmx5LCBpbmhlcml0ZWQgZnJvbSBwYXJlbnQgZXhlY3V0b3IuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2V4ZWN1dGlvbkVudjogUmVhZG9ubHk8RXhlY3V0aW9uRW52PjtcblxuICAvKiogUkZDLTAwMyBEMjogdHJ1ZSB3aGVuIGBnZXRBcmdzKClgIGNhbiByZXR1cm4gYWN0dWFsIGRhdGEg4oCUIGFuIGVtcHR5XG4gICAqICBge31gIHJlYWQgY2FycmllcyBubyBpbmZvcm1hdGlvbiwgc28gaXQgaXMgbmV2ZXIgZmxhZ2dlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzQXJnczogYm9vbGVhbjtcblxuICAvKiogUkZDLTAwMyBEMjogdHJ1ZSB3aGVuIGBnZXRFbnYoKWAgY2FuIHJldHVybiBhY3R1YWwgZGF0YS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzRW52OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyOiBrZXlzIHRoaXMgc3RhZ2UgaGFzIFRSQUNLRUQtcmVhZCAodmlhIGBnZXRWYWx1ZShrZXkpYCkuXG4gICAqIEEgc2lsZW50IHJlYWQgb2YgYSBrZXkgaW4gdGhpcyBzZXQgaXMgU0hBRE9XRUQg4oCUIGl0cyByZWFk4oaSd3JpdGUgZWRnZSBpc1xuICAgKiBhbHJlYWR5IGNhcHR1cmVkLCBzbyBpdCBpcyBub3QgZmxhZ2dlZCBhcyBhbiB1bnRyYWNrZWQgc291cmNlLiBUaGlzIGlzXG4gICAqIHdoYXQga2VlcHMgVHlwZWRTY29wZSBhcnJheS1wcm94eSBpbnRlcm5hbHMgKHdoaWNoIGFsd2F5cyBmb2xsb3cgYVxuICAgKiB0cmFja2VkIHByb3BlcnR5IHJlYWQpIGFuZCBgJGJhdGNoQXJyYXlgIGhvbmVzdC1idXQtcXVpZXQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF90cmFja2VkUmVhZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIF9yZWNvcmRlcnM6IFNjb3BlUmVjb3JkZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTZXQgYnkgdGhlIGNvbW1pdCBvYnNlcnZlcjogdGhpcyBzdGFnZSdzIGZyYW1lIGhhcyBmbHVzaGVkLiBBIGZhY2FkZSBpc1xuICAgKiBPTkUgc3RhZ2UgZXhlY3V0aW9uJ3MgaGFuZGxlIOKAlCB0aGUgZW5naW5lIGJ1aWxkcyBhIGZyZXNoIG9uZSBwZXIgc3RhZ2Ug4oCUXG4gICAqIGFuZCBldmVyeSBwcm94eSB0aGUgdHlwZWQgc2NvcGUgaGFuZHMgb3V0IGlzIGJvdW5kIHRvIGl0LiBBIHdyaXRlIGFycml2aW5nXG4gICAqIGFmdGVyIHRoZSBjb21taXQgY29tZXMgZnJvbSBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIChhIGNsb3N1cmUsIGFcbiAgICogbW9kdWxlLWxldmVsIGBsZXRgKSBhbmQgd291bGQgbGFuZCBpbiBhIGJ1ZmZlciBub3RoaW5nIGV2ZXIgY29tbWl0czogbm9cbiAgICogdHJhY2Ugcm93LCBzdGF0ZSB1bmNoYW5nZWQuIFNvIGl0IGlzIHJlZnVzZWQgKHtAbGluayBhc3NlcnRMaXZlfSkgaW5zdGVhZFxuICAgKiBvZiBsb3N0LiBTZWFsaW5nIGhlcmUgYW5kIG5vdCBvbiBgU3RhZ2VDb250ZXh0YCBpcyBkZWxpYmVyYXRlOiB0aGUgZnJhbWVcbiAgICogc3RheXMgcmUtdXNhYmxlIGFmdGVyIGNvbW1pdCBieSBkZXNpZ24gKCMxM2Ig4oCUIHRoZSBlbmdpbmUncyBkb3VibGUtY29tbWl0XG4gICAqIHBhdGhzIGFuZCB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBicmFuY2ggcGFyZW50IG5lZWQgaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29tbWl0dGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgcnVsZSBvZiB0aGlzIGZhY2FkZSdzIG93biDigJQgT05MWSB3aGVuIGl0cyBjb250ZXh0IGNhcnJpZXMgbm9uZSAoYmFyZVxuICAgKiBjb250ZXh0cyBpbiB1bml0IHRlc3RzKS4gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bGUgbGl2ZXMgb24gdGhlIGNvbnRleHRcbiAgICogdHJlZSBhbmQgdGhpcyBzdGF5cyB1bnNldDsgc2VlIHtAbGluayBydWxlfS5cbiAgICovXG4gIHByaXZhdGUgX2xvY2FsUnVsZT86IFJlZGFjdGlvblJ1bGU7XG5cbiAgY29uc3RydWN0b3IoY29udGV4dDogU3RhZ2VDb250ZXh0LCBzdGFnZU5hbWU6IHN0cmluZywgcmVhZE9ubHlWYWx1ZXM/OiB1bmtub3duLCBleGVjdXRpb25FbnY/OiBFeGVjdXRpb25FbnYpIHtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuX3N0YWdlTmFtZSA9IHN0YWdlTmFtZTtcbiAgICB0aGlzLl9yZWFkT25seVZhbHVlcyA9IHJlYWRPbmx5VmFsdWVzO1xuICAgIHRoaXMuX2Zyb3plbkFyZ3MgPSBjcmVhdGVGcm96ZW5BcmdzKHJlYWRPbmx5VmFsdWVzKTtcbiAgICB0aGlzLl9leGVjdXRpb25FbnYgPSBPYmplY3QuZnJlZXplKHsgLi4uZXhlY3V0aW9uRW52IH0pO1xuICAgIHRoaXMuX2hhc0FyZ3MgPSBPYmplY3Qua2V5cyh0aGlzLl9mcm96ZW5BcmdzKS5sZW5ndGggPiAwO1xuICAgIHRoaXMuX2hhc0VudiA9IE9iamVjdC5rZXlzKHRoaXMuX2V4ZWN1dGlvbkVudikubGVuZ3RoID4gMDtcbiAgICAvLyBUaGUgY29udGV4dCBtdXN0IGNhcnJ5IHRoZSBydWxlIEJFRk9SRSB0aGUgZmlyc3Qgd3JpdGUsIHNpbmNlIHRoZVxuICAgIC8vIGNvbnRleHQncyB3cml0ZSBmdW5uZWwgaXMgd2hhdCBtYXJrcyBhIHBlci1jYWxsIHJlZGFjdGVkIGtleSBvbiBpdC5cbiAgICAvLyBVbmRlciBhbiBleGVjdXRvciB0aGUgY29udGV4dCBhbHJlYWR5IGhhcyB0aGUgcnVuJ3MgcnVsZSAoaW5zdGFsbGVkIG9uXG4gICAgLy8gdGhlIHJvb3QsIGluaGVyaXRlZCBkb3duKSBhbmQgdGhpcyByZS1pbnN0YWxscyB0aGUgc2FtZSBvYmplY3Q7IG9uIGFcbiAgICAvLyBiYXJlIGNvbnRleHQgaXQgaW5zdGFsbHMgYSBmcmVzaCBvbmUuXG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LnVzZVJlZGFjdGlvblJ1bGU/Lih0aGlzLnJ1bGUpO1xuXG4gICAgLy8gUmVnaXN0ZXIgYXMgY29tbWl0IG9ic2VydmVyIHNvIFNjb3BlUmVjb3JkZXIub25Db21taXQgZmlyZXMgd2hlbiBTdGFnZUNvbnRleHQuY29tbWl0KCkgaXMgY2FsbGVkXG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LnNldENvbW1pdE9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgIHRoaXMuX29uQ29tbWl0RmlyZWQobXV0YXRpb25zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0aW9uIHJ1bGUgdGhpcyBmYWNhZGUgZGVjaWRlcyB3aXRoIOKAlCB0aGUgU0FNRSBvYmplY3QgaXRzXG4gICAqIGBTdGFnZUNvbnRleHRgIHJldGFpbnMgd2l0aCAoYG1lbW9yeS9yZWRhY3Rpb24udHNgLCB0aGUgb25lIG93bmVyKS4gVW5kZXJcbiAgICogYW4gZXhlY3V0b3IgdGhlIHJ1bGUgaXMgaW5zdGFsbGVkIG9uIHRoZSBydW50aW1lIHJvb3QgYW5kIGluaGVyaXRlZCBieVxuICAgKiBldmVyeSBjb250ZXh0LCBzbyB0aGUgZmFjYWRlIHNpbXBseSByZWFkcyBpdC4gT24gYSBiYXJlIGNvbnRleHQgKHVuaXRcbiAgICogdGVzdHMsIGhhbmQtYnVpbHQgc2NvcGVzKSB0aGUgZmFjYWRlIGNyZWF0ZXMgb25lIGFuZCBpbnN0YWxscyBpdCBvbiB0aGVcbiAgICogY29udGV4dCwgc28gdGhlIGNvbnRleHQncyByZXRlbnRpb24gYW5kIHRoZSBmYWNhZGUncyByZWNvcmRlciB2aWV3c1xuICAgKiBzdGlsbCBzaGFyZSBhIHNpbmdsZSB2ZXJkaWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgcnVsZSgpOiBSZWRhY3Rpb25SdWxlIHtcbiAgICBjb25zdCBzaGFyZWQgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZT8uKCk7XG4gICAgaWYgKHNoYXJlZCkgcmV0dXJuIHNoYXJlZDtcbiAgICBpZiAoIXRoaXMuX2xvY2FsUnVsZSkge1xuICAgICAgdGhpcy5fbG9jYWxSdWxlID0gbmV3IFJlZGFjdGlvblJ1bGUoKTtcbiAgICAgIHRoaXMuX3N0YWdlQ29udGV4dC51c2VSZWRhY3Rpb25SdWxlPy4odGhpcy5fbG9jYWxSdWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsUnVsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZSBhIHJlZGFjdGVkLWtleXMgc2V0IGFjcm9zcyBtdWx0aXBsZSBTY29wZUZhY2FkZSBpbnN0YW5jZXMuXG4gICAqIENhbGwgdGhpcyB0byBtYWtlIHJlZGFjdGlvbiBwZXJzaXN0IGFjcm9zcyBzdGFnZXMgaW4gdGhlIHNhbWUgcGlwZWxpbmUuXG4gICAqIChVbmRlciBhbiBleGVjdXRvciB0aGUgcnVuJ3MgcnVsZSBhbHJlYWR5IHNoYXJlcyBvbmUgc2V0OyB0aGlzIGNhbGwgaXNcbiAgICogdGhlbiBhIG5vLW9wLilcbiAgICogQGludGVybmFsXG4gICAqL1xuICB1c2VTaGFyZWRSZWRhY3RlZEtleXMoc2hhcmVkU2V0OiBTZXQ8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMucnVsZS51c2VNYXJrZWRLZXlzKHNoYXJlZFNldCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCByZWRhY3RlZC1rZXlzIHNldCAoZm9yIHNoYXJpbmcgd2l0aCBvdGhlciBzY29wZXMpLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldFJlZGFjdGVkS2V5cygpOiBTZXQ8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMucnVsZS5tYXJrZWRLZXlzKCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYSBkZWNsYXJhdGl2ZSByZWRhY3Rpb24gcG9saWN5LiBUaGUgcG9saWN5IGlzIGFkZGl0aXZlIOKAlFxuICAgKiBpdCB3b3JrcyBhbG9uZ3NpZGUgbWFudWFsIGBzZXRWYWx1ZSguLi4sIHRydWUpYCBjYWxscy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICB1c2VSZWRhY3Rpb25Qb2xpY3kocG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnJ1bGUuc2V0UG9saWN5KHBvbGljeSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJlZGFjdGlvblBvbGljeSgpOiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJ1bGUuZ2V0UG9saWN5KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXBsaWFuY2UtZnJpZW5kbHkgcmVwb3J0IG9mIGFsbCByZWRhY3Rpb24gYWN0aXZpdHkuXG4gICAqIE5ldmVyIGluY2x1ZGVzIGFjdHVhbCB2YWx1ZXMg4oCUIG9ubHkga2V5IG5hbWVzLCBmaWVsZCBuYW1lcywgYW5kIHBhdHRlcm5zLlxuICAgKi9cbiAgZ2V0UmVkYWN0aW9uUmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgcmV0dXJuIHRoaXMucnVsZS5yZXBvcnQoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTY29wZVJlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcjogU2NvcGVSZWNvcmRlcik6IHZvaWQge1xuICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIElEIChpZGVtcG90ZW50IOKAlCBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcpXG4gICAgdGhpcy5fcmVjb3JkZXJzID0gdGhpcy5fcmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXIuaWQpO1xuICAgIHRoaXMuX3JlY29yZGVycy5wdXNoKHJlY29yZGVyKTtcbiAgfVxuXG4gIGRldGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fcmVjb3JkZXJzID0gdGhpcy5fcmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXJJZCk7XG4gIH1cblxuICBnZXRTY29wZVJlY29yZGVycygpOiBTY29wZVJlY29yZGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fcmVjb3JkZXJzXTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5U3RhZ2VTdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvblN0YWdlU3RhcnQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5U3RhZ2VFbmQoZHVyYXRpb24/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvblN0YWdlRW5kJywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBkdXJhdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5UGF1c2UocGF1c2VEYXRhPzogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uUGF1c2UnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIHBhdXNlRGF0YSxcbiAgICAgIGNoYW5uZWw6ICdzY29wZScgYXMgY29uc3QsXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVJlc3VtZShoYXNJbnB1dDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uUmVzdW1lJywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBoYXNJbnB1dCxcbiAgICAgIGNoYW5uZWw6ICdzY29wZScgYXMgY29uc3QsXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeUNvbW1pdChtdXRhdGlvbnM6IENvbW1pdEV2ZW50WydtdXRhdGlvbnMnXSk6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uQ29tbWl0Jywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBtdXRhdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmdXNlIGEgd3JpdGUgZnJvbSBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlICg5LjIyLjApLiBUaHJvd3Mgd2l0aCB0aGVcbiAgICogc3RhZ2UgdGhlIGhhbmRsZSBjYW1lIGZyb207IHRoZSBlbmdpbmUncyBlcnJvciBwYXRoIGF0dHJpYnV0ZXMgdGhlIHRocm93XG4gICAqIHRvIHRoZSBzdGFnZSB0aGF0IG1hZGUgdGhlIHdyaXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NlcnRMaXZlKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NvbW1pdHRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGRlYWRGcmFtZU1lc3NhZ2UodGhpcy5fc3RhZ2VOYW1lLCB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsIGtleSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsZWQgYnkgU3RhZ2VDb250ZXh0LmNvbW1pdCgpIG9ic2VydmVyLiBDb252ZXJ0cyB0cmFja2VkIHdyaXRlcyB0byBDb21taXRFdmVudCBmb3JtYXQuXG4gICAqICBFcnJvcnMgYXJlIGNhdWdodCB0byBwcmV2ZW50IHJlY29yZGVyIGlzc3VlcyBmcm9tIGFib3J0aW5nIHRoZSB0cmF2ZXJzYWwuICovXG4gIHByaXZhdGUgX29uQ29tbWl0RmlyZWQobXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9Pik6IHZvaWQge1xuICAgIHRoaXMuX2NvbW1pdHRlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICAvLyBgX3N0YWdlV3JpdGVzYCBhbHJlYWR5IGhvbGRzIHRoZSByZXRhaW5lZCBmb3JtICh0aGUgY29udGV4dCByZXRhaW5zXG4gICAgICAvLyB1bmRlciB0aGUgc2FtZSBydWxlKTsgYXBwbHlpbmcgdGhlIHZlcmRpY3QgYWdhaW4gaGVyZSBpcyBpZGVtcG90ZW50XG4gICAgICAvLyBhbmQga2VlcHMgYSBrZXkgbWFya2VkIEFGVEVSIGl0cyB3cml0ZSBzY3J1YmJlZCBhdCBjb21taXQgdGltZS5cbiAgICAgIGNvbnN0IGNvbW1pdE11dGF0aW9uczogQ29tbWl0RXZlbnRbJ211dGF0aW9ucyddID0gT2JqZWN0LmVudHJpZXMobXV0YXRpb25zKS5tYXAoKFtrZXksIGVudHJ5XSkgPT4gKHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogdGhpcy5ydWxlLnJldGFpbihba2V5XSwgZW50cnkudmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246IGVudHJ5Lm9wZXJhdGlvbixcbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5ub3RpZnlDb21taXQoY29tbWl0TXV0YXRpb25zKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFN3YWxsb3cg4oCUIHJlY29yZGVyIGVycm9ycyBtdXN0IG5vdCBhYm9ydCB0aGUgdHJhdmVyc2FsLlxuICAgICAgLy8gSW5kaXZpZHVhbCByZWNvcmRlciBlcnJvcnMgYXJlIGFscmVhZHkgaXNvbGF0ZWQgYnkgX2ludm9rZUhvb2suXG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIERlYnVnIC8gRGlhZ25vc3RpY3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIFRoZXNlIGxlZ2FjeSBtZXRob2RzIHN0aWxsIHdyaXRlIHRvIHRoZSBgU3RhZ2VDb250ZXh0YCBkaWFnbm9zdGljXG4gIC8vIHNpZGUgYmFncyAobG9nQ29udGV4dCAvIGVycm9yQ29udGV4dCAvIG1ldHJpY0NvbnRleHQgLyBldmFsQ29udGV4dCkgZm9yXG4gIC8vIHNuYXBzaG90IGluY2x1c2lvbi4gVGhleSBBTFNPIGZpcmUgdGhyb3VnaCB0aGUgRW1pdCBjaGFubmVsIHNvIGFueVxuICAvLyBhdHRhY2hlZCBgRW1pdFJlY29yZGVyYCBzZWVzIHRoZW0gaW4gcmVhbCB0aW1lIOKAlCBjbG9zaW5nIHRoZVxuICAvLyBsb25nLXN0YW5kaW5nIGdhcCB3aGVyZSBgJGRlYnVnYC9gJG1ldHJpY2Agd2VudCB0byB1bm9ic2VydmVkIGJhZ3MuXG5cbiAgYWRkRGVidWdJbmZvKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5hZGRMb2coa2V5LCB2YWx1ZSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoYGxvZy5kZWJ1Zy4ke2tleX1gLCB7IGtleSwgdmFsdWUsIGxldmVsOiAnZGVidWcnIH0pO1xuICB9XG5cbiAgYWRkRGVidWdNZXNzYWdlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LmFkZExvZygnbWVzc2FnZXMnLCBbdmFsdWVdKTtcbiAgICB0aGlzLmVtaXRFdmVudCgnbG9nLmRlYnVnLm1lc3NhZ2VzJywgeyB2YWx1ZSwgbGV2ZWw6ICdkZWJ1ZycgfSk7XG4gIH1cblxuICBhZGRFcnJvckluZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LmFkZEVycm9yKGtleSwgdmFsdWUpO1xuICAgIHRoaXMuZW1pdEV2ZW50KGBsb2cuZXJyb3IuJHtrZXl9YCwgeyBrZXksIHZhbHVlLCBsZXZlbDogJ2Vycm9yJyB9KTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LmFkZE1ldHJpYyhtZXRyaWNOYW1lLCB2YWx1ZSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoYG1ldHJpYy4ke21ldHJpY05hbWV9YCwgeyBuYW1lOiBtZXRyaWNOYW1lLCB2YWx1ZSB9KTtcbiAgfVxuXG4gIGFkZEV2YWwobWV0cmljTmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5hZGRFdmFsKG1ldHJpY05hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgZXZhbC4ke21ldHJpY05hbWV9YCwgeyBuYW1lOiBtZXRyaWNOYW1lLCB2YWx1ZSB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBFbWl0IOKAlCBQaGFzZSAzIHByaW1hcnkgcHJpbWl0aXZlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBGaXJlIGEgc3RydWN0dXJlZCBldmVudCB0byBldmVyeSBhdHRhY2hlZCByZWNvcmRlciBpbXBsZW1lbnRpbmdcbiAgICogYG9uRW1pdGAuIFN5bmNocm9ub3VzLCBpbi1vcmRlciwgcGFzcy10aHJvdWdoIOKAlCBubyBidWZmZXJpbmcuXG4gICAqXG4gICAqIC0gKipGYXN0LXBhdGgqKjogemVybyBhbGxvY2F0aW9uICsgemVybyBjb3N0IHdoZW4gbm8gcmVjb3JkZXJzIGFyZVxuICAgKiAgIGF0dGFjaGVkIChlYXJseSByZXR1cm4gb24gZW1wdHkgbGlzdCkuXG4gICAqIC0gKipFbnJpY2htZW50Kio6IGxpYnJhcnkgYXV0by1hZGRzIGBzdGFnZU5hbWVgLCBgcnVudGltZVN0YWdlSWRgLFxuICAgKiAgIGBzdWJmbG93UGF0aGAsIGBwaXBlbGluZUlkYCwgYHRpbWVzdGFtcGAgdG8gdGhlIGV2ZW50LlxuICAgKiAtICoqUmVkYWN0aW9uKio6IGBSZWRhY3Rpb25Qb2xpY3kuZW1pdFBhdHRlcm5zYCByZWdleGVzIGFyZSBtYXRjaGVkXG4gICAqICAgYWdhaW5zdCBgbmFtZWAg4oCUIG1hdGNoZWQgZXZlbnRzIGhhdmUgdGhlaXIgcGF5bG9hZCByZXBsYWNlZCB3aXRoXG4gICAqICAgYCdbUkVEQUNURURdJ2AgYmVmb3JlIGRpc3BhdGNoLlxuICAgKiAtICoqRXJyb3IgaXNvbGF0aW9uKio6IGEgdGhyb3dpbmcgYG9uRW1pdGAgZG9lcyBub3QgcHJvcGFnYXRlIOKAlCBpdCBpc1xuICAgKiAgIGNhdWdodCBhbmQgcm91dGVkIHRvIGBvbkVycm9yYCBvbiByZW1haW5pbmcgcmVjb3JkZXJzLCBtYXRjaGluZyB0aGVcbiAgICogICBwYXR0ZXJuIHVzZWQgYnkgb3RoZXIgc2NvcGUgZXZlbnRzLlxuICAgKlxuICAgKiBDb25zdW1lcnMgY2FsbCB0aGlzIHZpYSB0aGUgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYCBzY29wZSBtZXRob2Q7XG4gICAqIHRoZSBtZXRob2Qgcm91dGVzIGhlcmUgdmlhIGBjcmVhdGVUeXBlZFNjb3BlYC5cbiAgICovXG4gIGVtaXRFdmVudChuYW1lOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBGYXN0LXBhdGg6IHplcm8gd29yayB3aGVuIG5vIHJlY29yZGVycyBhcmUgYXR0YWNoZWQuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIFJlZGFjdGlvbjogaWYgdGhlIGV2ZW50IG5hbWUgbWF0Y2hlcyBhbnkgZW1pdFBhdHRlcm4sIHJlcGxhY2UgcGF5bG9hZFxuICAgIC8vIHdpdGggJ1tSRURBQ1RFRF0nIEJFRk9SRSBjb25zdHJ1Y3RpbmcgdGhlIGV2ZW50IChubyBsZWFrIHRocm91Z2hcbiAgICAvLyBjb3B5LW9uLXdyaXRlLCBubyB3YXkgZm9yIHJlY29yZGVycyB0byBzZWUgdGhlIHJhdyB2YWx1ZSkuXG4gICAgbGV0IGZpbmFsUGF5bG9hZDogdW5rbm93biA9IHBheWxvYWQ7XG4gICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLnJ1bGUuZ2V0UG9saWN5KCk/LmVtaXRQYXR0ZXJucztcbiAgICBpZiAocGF0dGVybnMgJiYgcGF0dGVybnMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICAgIGlmIChwYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICBmaW5hbFBheWxvYWQgPSAnW1JFREFDVEVEXSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCdWlsZCB0aGUgZW5yaWNoZWQgZXZlbnQgb25jZTsgcGFzcyB0aGUgc2FtZSByZWZlcmVuY2UgdG8gYWxsXG4gICAgLy8gcmVjb3JkZXJzLiBTaW5jZSBFbWl0RXZlbnQgaXMgYHJlYWRvbmx5YCwgc2hhcmluZyBpcyBzYWZlLlxuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIHBheWxvYWQ6IGZpbmFsUGF5bG9hZCxcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiB0aGlzLl9nZXRTdWJmbG93UGF0aCgpLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0gYXMgY29uc3Q7XG5cbiAgICAvLyBEaXNwYXRjaCB3aXRoIGVycm9yIGlzb2xhdGlvbiDigJQgc2FtZSBwYXR0ZXJuIGFzIF9pbnZva2VIb29rIHVzZXMgZm9yXG4gICAgLy8gb3RoZXIgc2NvcGUgZXZlbnRzLiBBIHRocm93aW5nIHJlY29yZGVyJ3MgZXJyb3IgaXMgc3VyZmFjZWQgdmlhXG4gICAgLy8gb25FcnJvciBvbiB0aGUgb3RoZXIgcmVjb3JkZXJzOyB0aGUgZW1pdCBsb29wIGNvbnRpbnVlcyB1bmFmZmVjdGVkLlxuICAgIGZvciAoY29uc3QgcmVjb3JkZXIgb2YgdGhpcy5fcmVjb3JkZXJzKSB7XG4gICAgICBpZiAodHlwZW9mIHJlY29yZGVyLm9uRW1pdCAhPT0gJ2Z1bmN0aW9uJykgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBTaGFyZWQgaW52b2tlIGhlbHBlciDigJQgdGhlIFNBTUUgcHJpbWl0aXZlIHRoZSBkZWZlcnJlZCB0aWVyIHVzZXNcbiAgICAgICAgLy8gYXQgZGVsaXZlcnkgdGltZSwgc28gdGhlIHR3byBkZWxpdmVyeSBwYXRocyBjYW5ub3QgZHJpZnQuXG4gICAgICAgIGludm9rZVJlY29yZGVySG9vayhyZWNvcmRlciwgJ29uRW1pdCcsIGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uRXJyb3InLCB7XG4gICAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGVycm9yOiBlcnJvciBhcyBFcnJvcixcbiAgICAgICAgICBvcGVyYXRpb246ICd3cml0ZScsXG4gICAgICAgICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIERldGFjaCDigJQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydCBleGVjdXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIERlbGVnYXRlcyB0byB0aGUgc2hhcmVkIGBkZXRhY2gvc3Bhd25gIGhlbHBlciwgd2hpY2ggbWludHMgYSByZWZJZFxuICAvLyBmcm9tIHRoaXMgc3RhZ2UncyBgcnVudGltZVN0YWdlSWRgIGFuZCBjYWxscyBgZHJpdmVyLnNjaGVkdWxlKClgLlxuICAvLyBSb3V0ZWQgdGhyb3VnaCBgY3JlYXRlVHlwZWRTY29wZWAgYXMgYHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWBcbiAgLy8gYW5kIGBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KC4uLilgLlxuXG4gIC8qKiBTZWUgYFNjb3BlTWV0aG9kcy4kZGV0YWNoQW5kSm9pbkxhdGVyYC4gKi9cbiAgZGV0YWNoQW5kSm9pbkxhdGVyKFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoSGFuZGxlIHtcbiAgICByZXR1cm4gZGV0YWNoQW5kSm9pbkxhdGVyU3Bhd24oZHJpdmVyLCBjaGlsZCwgaW5wdXQsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKiogU2VlIGBTY29wZU1ldGhvZHMuJGRldGFjaEFuZEZvcmdldGAuICovXG4gIGRldGFjaEFuZEZvcmdldChcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiB2b2lkIHtcbiAgICBkZXRhY2hBbmRGb3JnZXRTcGF3bihkcml2ZXIsIGNoaWxkLCBpbnB1dCwgdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgc3ViZmxvd1BhdGggKG91dGVyIOKGkiBpbm5lcikgZm9yIGV2ZW50IGVucmljaG1lbnQuXG4gICAqXG4gICAqIFBhcnNlcyBmcm9tIGBydW50aW1lU3RhZ2VJZGAgd2hpY2ggaGFzIHRoZSBmb3JtYXRcbiAgICogYFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleGAgKHNlZSBgbGliL2VuZ2luZS9ydW50aW1lU3RhZ2VJZC50c2ApLlxuICAgKiBTdWJmbG93IGlzb2xhdGlvbiBwcmV2ZW50cyB3YWxraW5nIHRoZSBwYXJlbnQtY2hhaW4gYWNyb3NzIGJvdW5kYXJpZXMsXG4gICAqIHNvIHRoZSBydW50aW1lU3RhZ2VJZCDigJQgZ2xvYmFsbHkgdW5pcXVlLCBpbmNsdWRlcyBmdWxsIHBhdGgg4oCUIGlzIHRoZVxuICAgKiBjYW5vbmljYWwgc291cmNlIG9mIHRydXRoIGZvciB0aGUgc3ViZmxvdyBoaWVyYXJjaHkgYXQgZW1pdCB0aW1lLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICogICAnc2VlZCMwJyAgICAgICAgICAgICAgICAg4oaSIFtdICAgICAgICAgICAgICAgICAgICAocm9vdClcbiAgICogICAnc2YtaW5uZXIvaW5uZXIjNScgICAgICAg4oaSIFsnc2YtaW5uZXInXVxuICAgKiAgICdzZi1hL3NmLWIvc3RhZ2UjMycgICAgICDihpIgWydzZi1hJywgJ3NmLWInXSAgICAgIChuZXN0ZWQpXG4gICAqL1xuICBwcml2YXRlIF9nZXRTdWJmbG93UGF0aCgpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgY29uc3QgcnRpZCA9IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZDtcbiAgICBpZiAoIXJ0aWQpIHJldHVybiBTY29wZUZhY2FkZS5fRU1QVFlfU1VCRkxPV19QQVRIO1xuICAgIC8vIFN0cmlwIHRoZSB0cmFpbGluZyBgI2V4ZWN1dGlvbkluZGV4YCB0byBpc29sYXRlIHRoZSBwYXRoIHBvcnRpb24uXG4gICAgY29uc3QgaGFzaElkeCA9IHJ0aWQubGFzdEluZGV4T2YoJyMnKTtcbiAgICBjb25zdCBwYXRoUG9ydGlvbiA9IGhhc2hJZHggPj0gMCA/IHJ0aWQuc2xpY2UoMCwgaGFzaElkeCkgOiBydGlkO1xuICAgIC8vIHBhdGhQb3J0aW9uIGlzIG5vdyBgW3N1YmZsb3dQYXRoL11zdGFnZUlkYC4gU3BsaXQgb24gJy8nIGFuZCBkcm9wIHRoZVxuICAgIC8vIGxhc3Qgc2VnbWVudCAoc3RhZ2VJZCkg4oCUIHdoYXQgcmVtYWlucyBpcyB0aGUgc3ViZmxvdyBwYXRoLlxuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aFBvcnRpb24uc3BsaXQoJy8nKTtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoIDw9IDEpIHJldHVybiBTY29wZUZhY2FkZS5fRU1QVFlfU1VCRkxPV19QQVRIO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHNlZ21lbnRzLnNsaWNlKDAsIC0xKSk7XG4gIH1cblxuICAvLyDilIDilIAgTm9uLVRyYWNraW5nIFN0YXRlIEluc3BlY3Rpb24gKGZvciBUeXBlZFNjb3BlIHByb3h5IGludGVybmFscykg4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFJldHVybnMgYWxsIHN0YXRlIGtleXMgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IFR5cGVkU2NvcGUgb3duS2V5cy9oYXMgdHJhcHMuICovXG4gIGdldFN0YXRlS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIHVuZGVmaW5lZCk7XG4gICAgaWYgKCFzbmFwc2hvdCB8fCB0eXBlb2Ygc25hcHNob3QgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNuYXBzaG90IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgfVxuXG4gIC8qKiBDaGVjayBrZXkgZXhpc3RlbmNlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBUeXBlZFNjb3BlIGhhcyB0cmFwLlxuICAgKiAgQ29udHJhY3Q6IHJldHVybnMgZmFsc2UgZm9yIGtleXMgbmV2ZXIgc2V0IE9SIGtleXMgc2V0IHRvIHVuZGVmaW5lZC5cbiAgICogIFRoaXMgbWF0Y2hlcyBkZWxldGVWYWx1ZSgpIHNlbWFudGljcyAoc2V0cyB0byB1bmRlZmluZWQgPSBkZWxldGVkKS4gKi9cbiAgaGFzS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZShbXSwga2V5KSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGFycmF5IHByb3h5IGdldEN1cnJlbnQoKSB0byBhdm9pZFxuICAgKiAgcGhhbnRvbSByZWFkcyBvbiBpbnRlcm5hbCBhcnJheSBvcGVyYXRpb25zICgubGVuZ3RoLCAuaGFzLCBpdGVyYXRpb24sIGV0Yy4pLlxuICAgKiAgVGhlIGluaXRpYWwgcHJvcGVydHkgYWNjZXNzIGZpcmVzIG9uZSB0cmFja2VkIG9uUmVhZCB2aWEgZ2V0VmFsdWUoKTsgc3Vic2VxdWVudFxuICAgKiAgaW50ZXJuYWwgYXJyYXkgb3BlcmF0aW9ucyB1c2UgdGhpcyBtZXRob2QgdG8gc3RheSBzaWxlbnQuXG4gICAqICBOT1RFOiBMaWtlIGdldFZhbHVlKCksIHJldHVybnMgdGhlIHJhdyB2YWx1ZSB0byB0aGUgY2FsbGVyLiBSZWRhY3Rpb24gYXBwbGllc1xuICAgKiAgb25seSB0byByZWNvcmRlciBkaXNwYXRjaCDigJQgaXQgZG9lcyBub3QgZmlsdGVyIHRoZSByZXR1cm5lZCB2YWx1ZS4gVGhpcyBtYXRjaGVzXG4gICAqICB0aGUgZXhpc3RpbmcgZ2V0VmFsdWUoKSBjb250cmFjdCB3aGVyZSB1c2VyIGNvZGUgYWx3YXlzIHJlY2VpdmVzIHJhdyBkYXRhLlxuICAgKlxuICAgKiAgUkZDLTAwMyBEMjogYSBzaWxlbnQgcmVhZCBvZiBhIGtleSB0aGlzIHN0YWdlIG5ldmVyIFRSQUNLRUQtcmVhZCBtYXJrc1xuICAgKiAgdGhlIHN0YWdlJ3MgY29tbWl0IHdpdGggYHVudHJhY2tlZFNvdXJjZXM6IFsnc2lsZW50J11gIOKAlCBhIGNhdXNhbCBzbGljZVxuICAgKiAgYnVpbHQgZnJvbSBvblJlYWQgZXZlbnRzIHdvdWxkIG1pc3MgdGhpcyBkZXBlbmRlbmN5LCBhbmQgY29uc3VtZXJzIG11c3RcbiAgICogIGJlIHRvbGQuIFNpbGVudCByZWFkcyBzaGFkb3dlZCBieSBhIHRyYWNrZWQgcmVhZCBvZiB0aGUgc2FtZSBrZXkgKHRoZVxuICAgKiAgYXJyYXktcHJveHkgcGF0dGVybiBhYm92ZSkgYXJlIG5vdCBmbGFnZ2VkOiB0aGVpciBlZGdlIGlzIGNhcHR1cmVkLiBBXG4gICAqICB3aG9sZS1zdGF0ZSBzaWxlbnQgcmVhZCAobm8ga2V5KSBpcyBhbHdheXMgZmxhZ2dlZC4gKi9cbiAgZ2V0VmFsdWVTaWxlbnQoa2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLl90cmFja2VkUmVhZEtleXMuaGFzKGtleSkpIHtcbiAgICAgIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdzaWxlbnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZURpcmVjdChbXSwga2V5KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdGF0ZSBBY2Nlc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0SW5pdGlhbFZhbHVlRm9yKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZCBvZiBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqICoqUmVhZCB2YWx1ZXMgYXJlIEJPUlJPV0VEIOKAlCBkbyBub3QgbXV0YXRlIHRoZW0uKiogU2luY2UgdGhlIGxhenkgYnVmZmVyXG4gICAqICgjMTMpLCByZWFkcyBiZWZvcmUgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgcmV0dXJuIHJlZmVyZW5jZXMgSU5UT1xuICAgKiBDT01NSVRURUQgU0hBUkVEIFNUQVRFLCBhbmQgcmVhZHMgYWZ0ZXIgYSB3cml0ZSByZXR1cm4gcmVmZXJlbmNlcyBpbnRvXG4gICAqIHRoZSBzdGFnZSdzIHByaXZhdGUgdHJhbnNhY3Rpb24tYnVmZmVyIHdvcmtpbmcgY29weSAodGhlIGVhZ2VyIGVuZ2luZVxuICAgKiByZXR1cm5lZCByZWZlcmVuY2VzIGludG8gdGhhdCB3b3JraW5nIGNvcHkgZm9yIEFMTCByZWFkcykuIE11dGF0aW5nIGFcbiAgICogcmV0dXJuZWQgdmFsdWUgaW4gcGxhY2Ugd291bGQgY29ycnVwdCBzdGF0ZSB3aXRob3V0IGEgY29tbWl0IHJlY29yZCDigJRcbiAgICogd3JpdGUgY2hhbmdlcyBiYWNrIHZpYSBgc2V0VmFsdWVgL2B1cGRhdGVWYWx1ZWAgaW5zdGVhZC4gVHlwZWRTY29wZVxuICAgKiBjb25zdW1lcnMgYXJlIHNhZmUgYXV0b21hdGljYWxseTogdGhlIHByb3h5IHJvdXRlcyBldmVyeSBtdXRhdGlvblxuICAgKiB0aHJvdWdoIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYC9jb3B5LW9uLXdyaXRlIGFycmF5IG9wcy5cbiAgICpcbiAgICogVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IE5PIGRldi1tb2RlIGZyZWV6ZSBndWFyZCBoZXJlOiBkZWVwLWZyZWV6aW5nIGFcbiAgICogYnVmZmVyLXNlcnZlZCByZWFkIHdvdWxkIGZyZWV6ZSB0aGUgc3RhZ2UncyBvd24gd29ya2luZyBjb3B5IGFuZCBtYWtlIGFcbiAgICogbGVnaXRpbWF0ZSByZWFkLXRoZW4tZGVlcC13cml0ZSB0aHJvdywgYW5kIGZyZWV6aW5nIGEgY29tbWl0dGVkLXN0YXRlXG4gICAqIHJlYWQgbXV0YXRlcyBhbiBvYmplY3Qgc2hhcmVkIHdpdGggZXZlcnkgb3RoZXIgY29uc3VtZXIgb2YgdGhlIGxpdmVcbiAgICogc3RhdGUuIFNlZSBgc3JjL2xpYi9tZW1vcnkvUkVBRE1FLm1kYCAoXCJSZWFkIHZhbHVlcyBhcmUgYm9ycm93ZWRcIikuXG4gICAqXG4gICAqIFJlY29yZGVyIG5vdGU6IHRoZSBgb25SZWFkYCBldmVudCBiZWxvdyBwYXNzZXMgdGhlIFNBTUUgbGl2ZSByZWZlcmVuY2VcbiAgICogKG5vIGNsb25lKSB1bmxlc3MgZmllbGQtbGV2ZWwgcmVkYWN0aW9uIHNjcnVicyBhIGNvcHkg4oCUIHJlY29yZGVycyBtdXN0XG4gICAqIHRyZWF0IGV2ZW50IHZhbHVlcyBhcyByZWFkLW9ubHkgdG9vLlxuICAgKi9cbiAgZ2V0VmFsdWUoa2V5Pzogc3RyaW5nKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIGtleSk7XG5cbiAgICAvLyBSRkMtMDAzIEQyOiByZW1lbWJlciB0cmFja2VkIGtleXMgc28gbGF0ZXIgU0lMRU5UIHJlYWRzIG9mIHRoZSBzYW1lXG4gICAgLy8ga2V5IGNvdW50IGFzIHNoYWRvd2VkIChlZGdlIGFscmVhZHkgY2FwdHVyZWQpIGluc3RlYWQgb2YgdW50cmFja2VkLlxuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgdGhpcy5fdHJhY2tlZFJlYWRLZXlzLmFkZChrZXkpO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBBIHdob2xlLXN0YXRlIHJlYWQgKG5vIGtleSkgaXMgc2VydmVkIHdpdGggZXZlcnkgcmVkYWN0ZWQga2V5IGluc2lkZVxuICAgICAgLy8gaXQgc2NydWJiZWQ7IGEga2V5ZWQgcmVhZCBpcyBzZXJ2ZWQgdW5kZXIgdGhlIGtleSdzIHZlcmRpY3QuXG4gICAgICBjb25zdCB2ZXJkaWN0ID0ga2V5ID09PSB1bmRlZmluZWQgPyBDTEVBUiA6IHRoaXMucnVsZS52ZXJkaWN0KFtrZXldKTtcbiAgICAgIGNvbnN0IHJlY29yZGVyVmFsdWUgPSBrZXkgPT09IHVuZGVmaW5lZCA/IHRoaXMucnVsZS5yZXRhaW5SZWNvcmQodmFsdWUpIDogUmVkYWN0aW9uUnVsZS5hcHBseSh2ZXJkaWN0LCB2YWx1ZSk7XG5cbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uUmVhZCcsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogcmVjb3JkZXJWYWx1ZSxcbiAgICAgICAgcmVkYWN0ZWQ6IHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBzZXRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIGtleSwgJ3dyaXRlJyk7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGtleSk7XG5cbiAgICAvLyBEZXYtbW9kZTogd2FybiBpZiB0aGUgdmFsdWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbiAgICAvLyBDaGVjayBBRlRFUiBhc3NlcnROb3RSZWFkb25seSDigJQgZG9uJ3Qgd2FybiBmb3Igd3JpdGVzIHRoYXQgd2lsbCBiZSBibG9ja2VkLlxuICAgIC8vIENpcmN1bGFyIHZhbHVlcyB3b3JrICh0ZXJtaW5hbCBwcm94eSBoYW5kbGVzIHRoZW0pIGJ1dCBjYW4gcHJvZHVjZVxuICAgIC8vIHN1cnByaXNpbmcgYmVoYXZpb3IgaW4gbmFycmF0aXZlLCBKU09OIHNlcmlhbGl6YXRpb24sIGFuZCBzbmFwc2hvdHMuXG4gICAgaWYgKGlzRGV2TW9kZSgpICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChoYXNDaXJjdWxhclJlZmVyZW5jZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gc2V0VmFsdWUoJyR7a2V5fScpLiBgICtcbiAgICAgICAgICAgICdXcml0ZXMgcGFzdCB0aGUgY3ljbGUgZGVwdGggd2lsbCB1c2UgdGVybWluYWwgcHJveHkgdHJhY2tpbmcuICcgK1xuICAgICAgICAgICAgJ0NvbnNpZGVyIGZsYXR0ZW5pbmcgdGhlIGRhdGEgc3RydWN0dXJlLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGNvbnRleHQgaXMgdGhlIE9ORSBmdW5uZWw6IGl0IGRlY2lkZXMgdGhlIHZlcmRpY3QgKGV4cGxpY2l0IGZsYWcsXG4gICAgLy8gcG9saWN5IGtleS9wYXR0ZXJuLCBwZXItcnVuIG1hcmssIG9yIGZpZWxkLWxldmVsIHNjcnViKSwgc3RhZ2VzIHRoZVxuICAgIC8vIHdyaXRlIHdpdGggdGhlIHBhdGhzIHRoZSBsb2cgd2lsbCBzY3J1YiwgYW5kIGhhbmRzIHRoZSB2ZXJkaWN0IGJhY2sgc29cbiAgICAvLyByZWNvcmRlcnMgc2VlIHRoZSBzYW1lIGRlY2lzaW9uIHRoZSByZXRhaW5lZCByZWNvcmQgaG9sZHMuXG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5zZXRPYmplY3QoW10sIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgZGVzY3JpcHRpb24pO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvbldyaXRlJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKSxcbiAgICAgICAgb3BlcmF0aW9uOiAnc2V0JyxcbiAgICAgICAgcmVkYWN0ZWQ6IHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIGtleSwgJ3dyaXRlJyk7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGtleSk7XG5cbiAgICAvLyBEZXYtbW9kZTogc2FtZSBjaXJjdWxhciBjaGVjayBhcyBzZXRWYWx1ZSAobWVyZ2UgdGFyZ2V0cyBjYW4gYmUgY2lyY3VsYXIgdG9vKVxuICAgIGlmIChpc0Rldk1vZGUoKSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaGFzQ2lyY3VsYXJSZWZlcmVuY2UodmFsdWUpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2Zvb3RwcmludF0gQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluIHVwZGF0ZVZhbHVlKCcke2tleX0nKS4gYCArXG4gICAgICAgICAgICAnQ29uc2lkZXIgZmxhdHRlbmluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnVwZGF0ZU9iamVjdChbXSwga2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvbldyaXRlJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKSxcbiAgICAgICAgb3BlcmF0aW9uOiAndXBkYXRlJyxcbiAgICAgICAgcmVkYWN0ZWQ6IHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBkZWxldGVWYWx1ZShrZXk6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBhc3NlcnROb3RSZWFkb25seSh0aGlzLl9yZWFkT25seVZhbHVlcywga2V5LCAnZGVsZXRlJyk7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGtleSk7XG5cbiAgICAvLyBEZWxldGluZyBhIGtleSBjbGVhcnMgaXRzIHBlci1jYWxsIHJlZGFjdGlvbiBtYXJrICh0aGUgY29udGV4dCdzXG4gICAgLy8gZnVubmVsIGRvZXMgdGhhdCk7IGEgcG9saWN5IHZlcmRpY3Qgb24gdGhlIGtleSBzdXJ2aXZlcy5cbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuc2V0T2JqZWN0KFtdLCBrZXksIHVuZGVmaW5lZCwgZmFsc2UsIGRlc2NyaXB0aW9uID8/IGBkZWxldGVkICR7a2V5fWAsICdkZWxldGUnKTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBvcGVyYXRpb246ICdkZWxldGUnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRHbG9iYWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShrZXkpO1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuc2V0R2xvYmFsPy4oa2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRHbG9iYWwoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LmdldEdsb2JhbD8uKGtleSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldE9iamVjdEluUm9vdChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmFzc2VydExpdmUoa2V5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LnNldFJvb3Q/LihrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkLW9ubHkgKyBtaXNjIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZWFkb25seSBpbnB1dCB2YWx1ZXMgcGFzc2VkIHRvIHRoaXMgcGlwZWxpbmUsIGNhc3QgdG8gYFRgLlxuICAgKiBUaGUgcmV0dXJuZWQgb2JqZWN0IGlzIGRlZXBseSBmcm96ZW4g4oCUIGFueSBhdHRlbXB0IHRvIG11dGF0ZSBpdCB0aHJvd3MuXG4gICAqIENhY2hlZCBhdCBjb25zdHJ1Y3Rpb24gdGltZSBmb3IgemVyby1hbGxvY2F0aW9uIHJlcGVhdGVkIGFjY2Vzcy5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB7IGFwcGxpY2FudE5hbWUsIGluY29tZSB9ID0gc2NvcGUuZ2V0QXJnczx7IGFwcGxpY2FudE5hbWU6IHN0cmluZzsgaW5jb21lOiBudW1iZXIgfT4oKTtcbiAgICogYGBgXG4gICAqXG4gICAqIFJGQy0wMDMgRDI6IGFyZ3MgYXJlIHVudHJhY2tlZCBCWSBERVNJR04sIHNvIGNhbGxpbmcgdGhpcyAod2l0aCBhY3R1YWxcbiAgICogaW5wdXQgcHJlc2VudCkgbWFya3MgdGhlIHN0YWdlJ3MgY29tbWl0IHdpdGggYHVudHJhY2tlZFNvdXJjZXM6IFsnYXJncyddYFxuICAgKiDigJQgdGVsbGluZyBjYXVzYWwtc2xpY2UgY29uc3VtZXJzIHRoZSBiYWNrd2FyZCBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZVxuICAgKiBoZXJlLiBBbiBlbXB0eS1hcmdzIHJlYWQgY2FycmllcyBubyBpbmZvcm1hdGlvbiBhbmQgaXMgbm90IGZsYWdnZWQuXG4gICAqL1xuICBnZXRBcmdzPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTogVCB7XG4gICAgaWYgKHRoaXMuX2hhc0FyZ3MpIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdhcmdzJyk7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb3plbkFyZ3MgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQg4oCUIHJlYWQtb25seSBpbmZyYXN0cnVjdHVyZSB2YWx1ZXNcbiAgICogdGhhdCBwcm9wYWdhdGUgdGhyb3VnaCBuZXN0ZWQgZXhlY3V0b3JzIChsaWtlIGBwcm9jZXNzLmVudmAgZm9yIGZsb3djaGFydHMpLlxuICAgKlxuICAgKiBDb250YWluczogc2lnbmFsIChhYm9ydCksIHRpbWVvdXRNcywgdHJhY2VJZC5cbiAgICogRnJvemVuIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBJbmhlcml0ZWQgYnkgc3ViZmxvd3MgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB7IHNpZ25hbCwgdHJhY2VJZCB9ID0gc2NvcGUuZ2V0RW52KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBSRkMtMDAzIEQyOiBlbnYgaXMgdW50cmFja2VkIEJZIERFU0lHTiwgc28gY2FsbGluZyB0aGlzICh3aXRoIGFcbiAgICogbm9uLWVtcHR5IGVudmlyb25tZW50KSBtYXJrcyB0aGUgc3RhZ2UncyBjb21taXQgd2l0aFxuICAgKiBgdW50cmFja2VkU291cmNlczogWydlbnYnXWAg4oCUIHNlZSB7QGxpbmsgZ2V0QXJnc30uXG4gICAqL1xuICBnZXRFbnYoKTogUmVhZG9ubHk8RXhlY3V0aW9uRW52PiB7XG4gICAgaWYgKHRoaXMuX2hhc0VudikgdGhpcy5fc3RhZ2VDb250ZXh0Lm1hcmtVbnRyYWNrZWRTb3VyY2UoJ2VudicpO1xuICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25FbnY7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFBpcGVsaW5lSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbnRlcm5hbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIF9pbnZva2VIb29rKGhvb2s6IGtleW9mIE9taXQ8U2NvcGVSZWNvcmRlciwgJ2lkJz4sIGV2ZW50OiB1bmtub3duKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCByZWNvcmRlciBvZiB0aGlzLl9yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFNoYXJlZCBpbnZva2UgaGVscGVyIOKAlCB0aGUgU0FNRSBwcmltaXRpdmUgdGhlIGRlZmVycmVkIHRpZXIgdXNlc1xuICAgICAgICAvLyBhdCBkZWxpdmVyeSB0aW1lIChSRkMtMDAxIMKnOSBtaXRpZ2F0aW9uKTogbG9va3VwICsgYC5jYWxsKHRoaXMpYFxuICAgICAgICAvLyBzZW1hbnRpY3MgbGl2ZSBpbiBleGFjdGx5IG9uZSBwbGFjZSwgc28gdGhlIGlubGluZSBhbmQgZGVmZXJyZWRcbiAgICAgICAgLy8gcGF0aHMgY2Fubm90IGRyaWZ0LlxuICAgICAgICBpbnZva2VSZWNvcmRlckhvb2socmVjb3JkZXIsIGhvb2ssIGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChob29rICE9PSAnb25FcnJvcicpIHtcbiAgICAgICAgICB0aGlzLl9pbnZva2VIb29rKCdvbkVycm9yJywge1xuICAgICAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgYXMgRXJyb3IsXG4gICAgICAgICAgICBvcGVyYXRpb246IGhvb2sgPT09ICdvblJlYWQnID8gJ3JlYWQnIDogaG9vayA9PT0gJ29uQ29tbWl0JyA/ICdjb21taXQnIDogJ3dyaXRlJyxcbiAgICAgICAgICAgIGNoYW5uZWw6ICdzY29wZScgYXMgY29uc3QsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
639
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NvcGVGYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL1Njb3BlRmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBRUgsd0RBQThEO0FBQzlELDREQUE4RDtBQUM5RCxpREFHNEI7QUFDNUIsOENBQTBDO0FBRTFDLHVFQUFpRTtBQUNqRSwrREFBOEQ7QUFDOUQseURBQThEO0FBRTlELG9FQUFvRjtBQUdwRixNQUFhLFdBQVc7SUFDZixNQUFNLENBQVUsS0FBSyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUU1RDs7OztPQUlHO0lBQ0ssTUFBTSxDQUFVLG1CQUFtQixHQUFzQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRXpFLGFBQWEsQ0FBZTtJQUM1QixVQUFVLENBQVM7SUFDVixlQUFlLENBQVc7SUFFN0MsK0VBQStFO0lBQzlELFdBQVcsQ0FBMEI7SUFFdEQseUVBQXlFO0lBQ3hELGFBQWEsQ0FBeUI7SUFFdkQ7b0VBQ2dFO0lBQy9DLFFBQVEsQ0FBVTtJQUVuQywrREFBK0Q7SUFDOUMsT0FBTyxDQUFVO0lBRWxDOzs7Ozs7T0FNRztJQUNjLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFOUMsVUFBVSxHQUFvQixFQUFFLENBQUM7SUFFekM7Ozs7Ozs7Ozs7T0FVRztJQUNLLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFFM0I7Ozs7T0FJRztJQUNLLFVBQVUsQ0FBaUI7SUFFbkMsWUFBWSxPQUFxQixFQUFFLFNBQWlCLEVBQUUsY0FBd0IsRUFBRSxZQUEyQjtRQUN6RyxJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztRQUN0QyxJQUFJ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SUFDSCxDQUFDOztBQTdxQkgsa0NBOHFCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2NvcGVGYWNhZGUg4oCUIEJhc2UgY2xhc3MgdGhhdCBsaWJyYXJ5IGNvbnN1bWVycyBleHRlbmQgdG8gY3JlYXRlIGN1c3RvbSBzY29wZSBjbGFzc2VzXG4gKlxuICogV3JhcHMgU3RhZ2VDb250ZXh0IChmcm9tIG1lbW9yeS8pIHRvIHByb3ZpZGUgYSBjb25zdW1lci1mcmllbmRseSBBUEkgZm9yXG4gKiBzdGF0ZSBhY2Nlc3MsIGRlYnVnIGxvZ2dpbmcsIG1ldHJpY3MsIGFuZCByZWNvcmRlciBob29rcy5cbiAqXG4gKiBDb25zdW1lcnMgZXh0ZW5kIHRoaXMgY2xhc3MgdG8gYWRkIGRvbWFpbi1zcGVjaWZpYyBwcm9wZXJ0aWVzOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIE15U2NvcGUgZXh0ZW5kcyBTY29wZUZhY2FkZSB7XG4gKiAgIGdldCB1c2VyTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRWYWx1ZSgnbmFtZScpIGFzIHN0cmluZzsgfVxuICogICBzZXQgdXNlck5hbWUodmFsdWU6IHN0cmluZykgeyB0aGlzLnNldFZhbHVlKCduYW1lJywgdmFsdWUpOyB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBoYXNDaXJjdWxhclJlZmVyZW5jZSB9IGZyb20gJy4uL2NhcHR1cmUvY2lyY3VsYXIuanMnO1xuaW1wb3J0IHsgaW52b2tlUmVjb3JkZXJIb29rIH0gZnJvbSAnLi4vY2FwdHVyZS9pbnZva2VIb29rLmpzJztcbmltcG9ydCB7XG4gIGRldGFjaEFuZEZvcmdldCBhcyBkZXRhY2hBbmRGb3JnZXRTcGF3bixcbiAgZGV0YWNoQW5kSm9pbkxhdGVyIGFzIGRldGFjaEFuZEpvaW5MYXRlclNwYXduLFxufSBmcm9tICcuLi9kZXRhY2gvc3Bhd24uanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkVudiB9IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZWFkRnJhbWVNZXNzYWdlIH0gZnJvbSAnLi4vbWVtb3J5L2JvcnJvd2VkTXV0YXRpb24uanMnO1xuaW1wb3J0IHsgU0NPUEVfUExBQ0VIT0xERVIgfSBmcm9tICcuLi9tZW1vcnkvcGxhY2Vob2xkZXJzLmpzJztcbmltcG9ydCB7IENMRUFSLCBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi4vbWVtb3J5L3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB7IGFzc2VydE5vdFJlYWRvbmx5LCBjcmVhdGVGcm96ZW5BcmdzIH0gZnJvbSAnLi9wcm90ZWN0aW9uL3JlYWRvbmx5SW5wdXQuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRFdmVudCwgUmVkYWN0aW9uUG9saWN5LCBSZWRhY3Rpb25SZXBvcnQsIFNjb3BlUmVjb3JkZXIgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFNjb3BlRmFjYWRlIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBCUkFORCA9IFN5bWJvbC5mb3IoJ1Njb3BlRmFjYWRlQHYxJyk7XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBzZW50aW5lbCByZXR1cm5lZCBieSBgX2dldFN1YmZsb3dQYXRoKClgIGZvciByb290LWxldmVsIHN0YWdlc1xuICAgKiAobm8gc3ViZmxvdyBuZXN0aW5nKS4gQXZvaWRzIHBlci1jYWxsIGFsbG9jYXRpb24gb2YgYSBmcmVzaFxuICAgKiBgT2JqZWN0LmZyZWV6ZShbXSlgIG9uIGV2ZXJ5IGBlbWl0RXZlbnRgIGluIHRoZSBjb21tb24gbm8tc3ViZmxvdyBjYXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgX0VNUFRZX1NVQkZMT1dfUEFUSDogcmVhZG9ubHkgc3RyaW5nW10gPSBPYmplY3QuZnJlZXplKFtdKTtcblxuICBwcm90ZWN0ZWQgX3N0YWdlQ29udGV4dDogU3RhZ2VDb250ZXh0O1xuICBwcm90ZWN0ZWQgX3N0YWdlTmFtZTogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3JlYWRPbmx5VmFsdWVzPzogdW5rbm93bjtcblxuICAvKiogQ2FjaGVkIGRlZXBseS1mcm96ZW4gY29weSBvZiByZWFkT25seVZhbHVlcyBmb3IgZ2V0QXJncygpLiBDcmVhdGVkIG9uY2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Zyb3plbkFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKiBFeGVjdXRpb24gZW52aXJvbm1lbnQg4oCUIHJlYWQtb25seSwgaW5oZXJpdGVkIGZyb20gcGFyZW50IGV4ZWN1dG9yLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leGVjdXRpb25FbnY6IFJlYWRvbmx5PEV4ZWN1dGlvbkVudj47XG5cbiAgLyoqIFJGQy0wMDMgRDI6IHRydWUgd2hlbiBgZ2V0QXJncygpYCBjYW4gcmV0dXJuIGFjdHVhbCBkYXRhIOKAlCBhbiBlbXB0eVxuICAgKiAgYHt9YCByZWFkIGNhcnJpZXMgbm8gaW5mb3JtYXRpb24sIHNvIGl0IGlzIG5ldmVyIGZsYWdnZWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhc0FyZ3M6IGJvb2xlYW47XG5cbiAgLyoqIFJGQy0wMDMgRDI6IHRydWUgd2hlbiBgZ2V0RW52KClgIGNhbiByZXR1cm4gYWN0dWFsIGRhdGEuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhc0VudjogYm9vbGVhbjtcblxuICAvKipcbiAgICogUkZDLTAwMyBEMjoga2V5cyB0aGlzIHN0YWdlIGhhcyBUUkFDS0VELXJlYWQgKHZpYSBgZ2V0VmFsdWUoa2V5KWApLlxuICAgKiBBIHNpbGVudCByZWFkIG9mIGEga2V5IGluIHRoaXMgc2V0IGlzIFNIQURPV0VEIOKAlCBpdHMgcmVhZOKGkndyaXRlIGVkZ2UgaXNcbiAgICogYWxyZWFkeSBjYXB0dXJlZCwgc28gaXQgaXMgbm90IGZsYWdnZWQgYXMgYW4gdW50cmFja2VkIHNvdXJjZS4gVGhpcyBpc1xuICAgKiB3aGF0IGtlZXBzIFR5cGVkU2NvcGUgYXJyYXktcHJveHkgaW50ZXJuYWxzICh3aGljaCBhbHdheXMgZm9sbG93IGFcbiAgICogdHJhY2tlZCBwcm9wZXJ0eSByZWFkKSBhbmQgYCRiYXRjaEFycmF5YCBob25lc3QtYnV0LXF1aWV0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdHJhY2tlZFJlYWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSBfcmVjb3JkZXJzOiBTY29wZVJlY29yZGVyW10gPSBbXTtcblxuICAvKipcbiAgICogU2V0IGJ5IHRoZSBjb21taXQgb2JzZXJ2ZXI6IHRoaXMgc3RhZ2UncyBmcmFtZSBoYXMgZmx1c2hlZC4gQSBmYWNhZGUgaXNcbiAgICogT05FIHN0YWdlIGV4ZWN1dGlvbidzIGhhbmRsZSDigJQgdGhlIGVuZ2luZSBidWlsZHMgYSBmcmVzaCBvbmUgcGVyIHN0YWdlIOKAlFxuICAgKiBhbmQgZXZlcnkgcHJveHkgdGhlIHR5cGVkIHNjb3BlIGhhbmRzIG91dCBpcyBib3VuZCB0byBpdC4gQSB3cml0ZSBhcnJpdmluZ1xuICAgKiBhZnRlciB0aGUgY29tbWl0IGNvbWVzIGZyb20gYSBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZSAoYSBjbG9zdXJlLCBhXG4gICAqIG1vZHVsZS1sZXZlbCBgbGV0YCkgYW5kIHdvdWxkIGxhbmQgaW4gYSBidWZmZXIgbm90aGluZyBldmVyIGNvbW1pdHM6IG5vXG4gICAqIHRyYWNlIHJvdywgc3RhdGUgdW5jaGFuZ2VkLiBTbyBpdCBpcyByZWZ1c2VkICh7QGxpbmsgYXNzZXJ0TGl2ZX0pIGluc3RlYWRcbiAgICogb2YgbG9zdC4gU2VhbGluZyBoZXJlIGFuZCBub3Qgb24gYFN0YWdlQ29udGV4dGAgaXMgZGVsaWJlcmF0ZTogdGhlIGZyYW1lXG4gICAqIHN0YXlzIHJlLXVzYWJsZSBhZnRlciBjb21taXQgYnkgZGVzaWduICgjMTNiIOKAlCB0aGUgZW5naW5lJ3MgZG91YmxlLWNvbW1pdFxuICAgKiBwYXRocyBhbmQgdGhlIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgYnJhbmNoIHBhcmVudCBuZWVkIGl0KS5cbiAgICovXG4gIHByaXZhdGUgX2NvbW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBIHJ1bGUgb2YgdGhpcyBmYWNhZGUncyBvd24g4oCUIE9OTFkgd2hlbiBpdHMgY29udGV4dCBjYXJyaWVzIG5vbmUgKGJhcmVcbiAgICogY29udGV4dHMgaW4gdW5pdCB0ZXN0cykuIFVuZGVyIGFuIGV4ZWN1dG9yIHRoZSBydWxlIGxpdmVzIG9uIHRoZSBjb250ZXh0XG4gICAqIHRyZWUgYW5kIHRoaXMgc3RheXMgdW5zZXQ7IHNlZSB7QGxpbmsgcnVsZX0uXG4gICAqL1xuICBwcml2YXRlIF9sb2NhbFJ1bGU/OiBSZWRhY3Rpb25SdWxlO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQ6IFN0YWdlQ29udGV4dCwgc3RhZ2VOYW1lOiBzdHJpbmcsIHJlYWRPbmx5VmFsdWVzPzogdW5rbm93biwgZXhlY3V0aW9uRW52PzogRXhlY3V0aW9uRW52KSB7XG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLl9zdGFnZU5hbWUgPSBzdGFnZU5hbWU7XG4gICAgdGhpcy5fcmVhZE9ubHlWYWx1ZXMgPSByZWFkT25seVZhbHVlcztcbiAgICB0aGlzLl9mcm96ZW5BcmdzID0gY3JlYXRlRnJvemVuQXJncyhyZWFkT25seVZhbHVlcyk7XG4gICAgdGhpcy5fZXhlY3V0aW9uRW52ID0gT2JqZWN0LmZyZWV6ZSh7IC4uLmV4ZWN1dGlvbkVudiB9KTtcbiAgICB0aGlzLl9oYXNBcmdzID0gT2JqZWN0LmtleXModGhpcy5fZnJvemVuQXJncykubGVuZ3RoID4gMDtcbiAgICB0aGlzLl9oYXNFbnYgPSBPYmplY3Qua2V5cyh0aGlzLl9leGVjdXRpb25FbnYpLmxlbmd0aCA+IDA7XG4gICAgLy8gVGhlIGNvbnRleHQgbXVzdCBjYXJyeSB0aGUgcnVsZSBCRUZPUkUgdGhlIGZpcnN0IHdyaXRlLCBzaW5jZSB0aGVcbiAgICAvLyBjb250ZXh0J3Mgd3JpdGUgZnVubmVsIGlzIHdoYXQgbWFya3MgYSBwZXItY2FsbCByZWRhY3RlZCBrZXkgb24gaXQuXG4gICAgLy8gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIGNvbnRleHQgYWxyZWFkeSBoYXMgdGhlIHJ1bidzIHJ1bGUgKGluc3RhbGxlZCBvblxuICAgIC8vIHRoZSByb290LCBpbmhlcml0ZWQgZG93bikgYW5kIHRoaXMgcmUtaW5zdGFsbHMgdGhlIHNhbWUgb2JqZWN0OyBvbiBhXG4gICAgLy8gYmFyZSBjb250ZXh0IGl0IGluc3RhbGxzIGEgZnJlc2ggb25lLlxuICAgIHRoaXMuX3N0YWdlQ29udGV4dC51c2VSZWRhY3Rpb25SdWxlPy4odGhpcy5ydWxlKTtcblxuICAgIC8vIFJlZ2lzdGVyIGFzIGNvbW1pdCBvYnNlcnZlciBzbyBTY29wZVJlY29yZGVyLm9uQ29tbWl0IGZpcmVzIHdoZW4gU3RhZ2VDb250ZXh0LmNvbW1pdCgpIGlzIGNhbGxlZFxuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRDb21taXRPYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICB0aGlzLl9vbkNvbW1pdEZpcmVkKG11dGF0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlZGFjdGlvbiBydWxlIHRoaXMgZmFjYWRlIGRlY2lkZXMgd2l0aCDigJQgdGhlIFNBTUUgb2JqZWN0IGl0c1xuICAgKiBgU3RhZ2VDb250ZXh0YCByZXRhaW5zIHdpdGggKGBtZW1vcnkvcmVkYWN0aW9uLnRzYCwgdGhlIG9uZSBvd25lcikuIFVuZGVyXG4gICAqIGFuIGV4ZWN1dG9yIHRoZSBydWxlIGlzIGluc3RhbGxlZCBvbiB0aGUgcnVudGltZSByb290IGFuZCBpbmhlcml0ZWQgYnlcbiAgICogZXZlcnkgY29udGV4dCwgc28gdGhlIGZhY2FkZSBzaW1wbHkgcmVhZHMgaXQuIE9uIGEgYmFyZSBjb250ZXh0ICh1bml0XG4gICAqIHRlc3RzLCBoYW5kLWJ1aWx0IHNjb3BlcykgdGhlIGZhY2FkZSBjcmVhdGVzIG9uZSBhbmQgaW5zdGFsbHMgaXQgb24gdGhlXG4gICAqIGNvbnRleHQsIHNvIHRoZSBjb250ZXh0J3MgcmV0ZW50aW9uIGFuZCB0aGUgZmFjYWRlJ3MgcmVjb3JkZXIgdmlld3NcbiAgICogc3RpbGwgc2hhcmUgYSBzaW5nbGUgdmVyZGljdC5cbiAgICovXG4gIHByaXZhdGUgZ2V0IHJ1bGUoKTogUmVkYWN0aW9uUnVsZSB7XG4gICAgY29uc3Qgc2hhcmVkID0gdGhpcy5fc3RhZ2VDb250ZXh0LmdldFJlZGFjdGlvblJ1bGU/LigpO1xuICAgIGlmIChzaGFyZWQpIHJldHVybiBzaGFyZWQ7XG4gICAgaWYgKCF0aGlzLl9sb2NhbFJ1bGUpIHtcbiAgICAgIHRoaXMuX2xvY2FsUnVsZSA9IG5ldyBSZWRhY3Rpb25SdWxlKCk7XG4gICAgICB0aGlzLl9zdGFnZUNvbnRleHQudXNlUmVkYWN0aW9uUnVsZT8uKHRoaXMuX2xvY2FsUnVsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9sb2NhbFJ1bGU7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgYSByZWRhY3RlZC1rZXlzIHNldCBhY3Jvc3MgbXVsdGlwbGUgU2NvcGVGYWNhZGUgaW5zdGFuY2VzLlxuICAgKiBDYWxsIHRoaXMgdG8gbWFrZSByZWRhY3Rpb24gcGVyc2lzdCBhY3Jvc3Mgc3RhZ2VzIGluIHRoZSBzYW1lIHBpcGVsaW5lLlxuICAgKiAoVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bidzIHJ1bGUgYWxyZWFkeSBzaGFyZXMgb25lIHNldDsgdGhpcyBjYWxsIGlzXG4gICAqIHRoZW4gYSBuby1vcC4pXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdXNlU2hhcmVkUmVkYWN0ZWRLZXlzKHNoYXJlZFNldDogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLnJ1bGUudXNlTWFya2VkS2V5cyhzaGFyZWRTZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcmVkYWN0ZWQta2V5cyBzZXQgKGZvciBzaGFyaW5nIHdpdGggb3RoZXIgc2NvcGVzKS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRSZWRhY3RlZEtleXMoKTogU2V0PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnJ1bGUubWFya2VkS2V5cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGEgZGVjbGFyYXRpdmUgcmVkYWN0aW9uIHBvbGljeS4gVGhlIHBvbGljeSBpcyBhZGRpdGl2ZSDigJRcbiAgICogaXQgd29ya3MgYWxvbmdzaWRlIG1hbnVhbCBgc2V0VmFsdWUoLi4uLCB0cnVlKWAgY2FsbHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5ydWxlLnNldFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSZWRhY3Rpb25Qb2xpY3koKTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlLmdldFBvbGljeSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGlhbmNlLWZyaWVuZGx5IHJlcG9ydCBvZiBhbGwgcmVkYWN0aW9uIGFjdGl2aXR5LlxuICAgKiBOZXZlciBpbmNsdWRlcyBhY3R1YWwgdmFsdWVzIOKAlCBvbmx5IGtleSBuYW1lcywgZmllbGQgbmFtZXMsIGFuZCBwYXR0ZXJucy5cbiAgICovXG4gIGdldFJlZGFjdGlvblJlcG9ydCgpOiBSZWRhY3Rpb25SZXBvcnQge1xuICAgIHJldHVybiB0aGlzLnJ1bGUucmVwb3J0KCk7XG4gIH1cblxuICAvLyDilIDilIAgU2NvcGVSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXI6IFNjb3BlUmVjb3JkZXIpOiB2b2lkIHtcbiAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBJRCAoaWRlbXBvdGVudCDigJQgcHJldmVudHMgZG91YmxlLWNvdW50aW5nKVxuICAgIHRoaXMuX3JlY29yZGVycyA9IHRoaXMuX3JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVyLmlkKTtcbiAgICB0aGlzLl9yZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gIH1cblxuICBkZXRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3JlY29yZGVycyA9IHRoaXMuX3JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVySWQpO1xuICB9XG5cbiAgZ2V0U2NvcGVSZWNvcmRlcnMoKTogU2NvcGVSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX3JlY29yZGVyc107XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVN0YWdlU3RhcnQoKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25TdGFnZVN0YXJ0Jywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVN0YWdlRW5kKGR1cmF0aW9uPzogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25TdGFnZUVuZCcsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgZHVyYXRpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5vdGlmeVBhdXNlKHBhdXNlRGF0YT86IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvblBhdXNlJywge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBwYXVzZURhdGEsXG4gICAgICBjaGFubmVsOiAnc2NvcGUnIGFzIGNvbnN0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlSZXN1bWUoaGFzSW5wdXQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvblJlc3VtZScsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgaGFzSW5wdXQsXG4gICAgICBjaGFubmVsOiAnc2NvcGUnIGFzIGNvbnN0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlDb21taXQobXV0YXRpb25zOiBDb21taXRFdmVudFsnbXV0YXRpb25zJ10pOiB2b2lkIHtcbiAgICB0aGlzLl9pbnZva2VIb29rKCdvbkNvbW1pdCcsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbXV0YXRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnVzZSBhIHdyaXRlIGZyb20gYSBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZSAoOS4yMi4wKS4gVGhyb3dzIHdpdGggdGhlXG4gICAqIHN0YWdlIHRoZSBoYW5kbGUgY2FtZSBmcm9tOyB0aGUgZW5naW5lJ3MgZXJyb3IgcGF0aCBhdHRyaWJ1dGVzIHRoZSB0aHJvd1xuICAgKiB0byB0aGUgc3RhZ2UgdGhhdCBtYWRlIHRoZSB3cml0ZS5cbiAgICovXG4gIHByaXZhdGUgYXNzZXJ0TGl2ZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jb21taXR0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihkZWFkRnJhbWVNZXNzYWdlKHRoaXMuX3N0YWdlTmFtZSwgdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLCBrZXkpKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbGVkIGJ5IFN0YWdlQ29udGV4dC5jb21taXQoKSBvYnNlcnZlci4gQ29udmVydHMgdHJhY2tlZCB3cml0ZXMgdG8gQ29tbWl0RXZlbnQgZm9ybWF0LlxuICAgKiAgRXJyb3JzIGFyZSBjYXVnaHQgdG8gcHJldmVudCByZWNvcmRlciBpc3N1ZXMgZnJvbSBhYm9ydGluZyB0aGUgdHJhdmVyc2FsLiAqL1xuICBwcml2YXRlIF9vbkNvbW1pdEZpcmVkKG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4pOiB2b2lkIHtcbiAgICB0aGlzLl9jb21taXR0ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgLy8gYF9zdGFnZVdyaXRlc2AgYWxyZWFkeSBob2xkcyB0aGUgcmV0YWluZWQgZm9ybSAodGhlIGNvbnRleHQgcmV0YWluc1xuICAgICAgLy8gdW5kZXIgdGhlIHNhbWUgcnVsZSk7IGFwcGx5aW5nIHRoZSB2ZXJkaWN0IGFnYWluIGhlcmUgaXMgaWRlbXBvdGVudFxuICAgICAgLy8gYW5kIGtlZXBzIGEga2V5IG1hcmtlZCBBRlRFUiBpdHMgd3JpdGUgc2NydWJiZWQgYXQgY29tbWl0IHRpbWUuXG4gICAgICBjb25zdCBjb21taXRNdXRhdGlvbnM6IENvbW1pdEV2ZW50WydtdXRhdGlvbnMnXSA9IE9iamVjdC5lbnRyaWVzKG11dGF0aW9ucykubWFwKChba2V5LCBlbnRyeV0pID0+ICh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHRoaXMucnVsZS5yZXRhaW4oW2tleV0sIGVudHJ5LnZhbHVlKSxcbiAgICAgICAgb3BlcmF0aW9uOiBlbnRyeS5vcGVyYXRpb24sXG4gICAgICB9KSk7XG5cbiAgICAgIHRoaXMubm90aWZ5Q29tbWl0KGNvbW1pdE11dGF0aW9ucyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTd2FsbG93IOKAlCByZWNvcmRlciBlcnJvcnMgbXVzdCBub3QgYWJvcnQgdGhlIHRyYXZlcnNhbC5cbiAgICAgIC8vIEluZGl2aWR1YWwgcmVjb3JkZXIgZXJyb3JzIGFyZSBhbHJlYWR5IGlzb2xhdGVkIGJ5IF9pbnZva2VIb29rLlxuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBEZWJ1ZyAvIERpYWdub3N0aWNzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvL1xuICAvLyBUaGVzZSBsZWdhY3kgbWV0aG9kcyBzdGlsbCB3cml0ZSB0byB0aGUgYFN0YWdlQ29udGV4dGAgZGlhZ25vc3RpY1xuICAvLyBzaWRlIGJhZ3MgKGxvZ0NvbnRleHQgLyBlcnJvckNvbnRleHQgLyBtZXRyaWNDb250ZXh0IC8gZXZhbENvbnRleHQpIGZvclxuICAvLyBzbmFwc2hvdCBpbmNsdXNpb24uIFRoZXkgQUxTTyBmaXJlIHRocm91Z2ggdGhlIEVtaXQgY2hhbm5lbCBzbyBhbnlcbiAgLy8gYXR0YWNoZWQgYEVtaXRSZWNvcmRlcmAgc2VlcyB0aGVtIGluIHJlYWwgdGltZSDigJQgY2xvc2luZyB0aGVcbiAgLy8gbG9uZy1zdGFuZGluZyBnYXAgd2hlcmUgYCRkZWJ1Z2AvYCRtZXRyaWNgIHdlbnQgdG8gdW5vYnNlcnZlZCBiYWdzLlxuXG4gIGFkZERlYnVnSW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuYWRkTG9nKGtleSwgdmFsdWUpO1xuICAgIHRoaXMuZW1pdEV2ZW50KGBsb2cuZGVidWcuJHtrZXl9YCwgeyBrZXksIHZhbHVlLCBsZXZlbDogJ2RlYnVnJyB9KTtcbiAgfVxuXG4gIGFkZERlYnVnTWVzc2FnZSh2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5hZGRMb2coJ21lc3NhZ2VzJywgW3ZhbHVlXSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoJ2xvZy5kZWJ1Zy5tZXNzYWdlcycsIHsgdmFsdWUsIGxldmVsOiAnZGVidWcnIH0pO1xuICB9XG5cbiAgYWRkRXJyb3JJbmZvKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5hZGRFcnJvcihrZXksIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgbG9nLmVycm9yLiR7a2V5fWAsIHsga2V5LCB2YWx1ZSwgbGV2ZWw6ICdlcnJvcicgfSk7XG4gIH1cblxuICBhZGRNZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dC5hZGRNZXRyaWMobWV0cmljTmFtZSwgdmFsdWUpO1xuICAgIHRoaXMuZW1pdEV2ZW50KGBtZXRyaWMuJHttZXRyaWNOYW1lfWAsIHsgbmFtZTogbWV0cmljTmFtZSwgdmFsdWUgfSk7XG4gIH1cblxuICBhZGRFdmFsKG1ldHJpY05hbWU6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRXZhbChtZXRyaWNOYW1lLCB2YWx1ZSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoYGV2YWwuJHttZXRyaWNOYW1lfWAsIHsgbmFtZTogbWV0cmljTmFtZSwgdmFsdWUgfSk7XG4gIH1cblxuICAvLyDilIDilIAgRW1pdCDigJQgUGhhc2UgMyBwcmltYXJ5IHByaW1pdGl2ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogRmlyZSBhIHN0cnVjdHVyZWQgZXZlbnQgdG8gZXZlcnkgYXR0YWNoZWQgcmVjb3JkZXIgaW1wbGVtZW50aW5nXG4gICAqIGBvbkVtaXRgLiBTeW5jaHJvbm91cywgaW4tb3JkZXIsIHBhc3MtdGhyb3VnaCDigJQgbm8gYnVmZmVyaW5nLlxuICAgKlxuICAgKiAtICoqRmFzdC1wYXRoKio6IHplcm8gYWxsb2NhdGlvbiArIHplcm8gY29zdCB3aGVuIG5vIHJlY29yZGVycyBhcmVcbiAgICogICBhdHRhY2hlZCAoZWFybHkgcmV0dXJuIG9uIGVtcHR5IGxpc3QpLlxuICAgKiAtICoqRW5yaWNobWVudCoqOiBsaWJyYXJ5IGF1dG8tYWRkcyBgc3RhZ2VOYW1lYCwgYHJ1bnRpbWVTdGFnZUlkYCxcbiAgICogICBgc3ViZmxvd1BhdGhgLCBgcGlwZWxpbmVJZGAsIGB0aW1lc3RhbXBgIHRvIHRoZSBldmVudC5cbiAgICogLSAqKlJlZGFjdGlvbioqOiBgUmVkYWN0aW9uUG9saWN5LmVtaXRQYXR0ZXJuc2AgcmVnZXhlcyBhcmUgbWF0Y2hlZFxuICAgKiAgIGFnYWluc3QgYG5hbWVgIOKAlCBtYXRjaGVkIGV2ZW50cyBoYXZlIHRoZWlyIHBheWxvYWQgcmVwbGFjZWQgd2l0aFxuICAgKiAgIGAnW1JFREFDVEVEXSdgIGJlZm9yZSBkaXNwYXRjaC5cbiAgICogLSAqKkVycm9yIGlzb2xhdGlvbioqOiBhIHRocm93aW5nIGBvbkVtaXRgIGRvZXMgbm90IHByb3BhZ2F0ZSDigJQgaXQgaXNcbiAgICogICBjYXVnaHQgYW5kIHJvdXRlZCB0byBgb25FcnJvcmAgb24gcmVtYWluaW5nIHJlY29yZGVycywgbWF0Y2hpbmcgdGhlXG4gICAqICAgcGF0dGVybiB1c2VkIGJ5IG90aGVyIHNjb3BlIGV2ZW50cy5cbiAgICpcbiAgICogQ29uc3VtZXJzIGNhbGwgdGhpcyB2aWEgdGhlIGBzY29wZS4kZW1pdChuYW1lLCBwYXlsb2FkKWAgc2NvcGUgbWV0aG9kO1xuICAgKiB0aGUgbWV0aG9kIHJvdXRlcyBoZXJlIHZpYSBgY3JlYXRlVHlwZWRTY29wZWAuXG4gICAqL1xuICBlbWl0RXZlbnQobmFtZTogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogdm9pZCB7XG4gICAgLy8gRmFzdC1wYXRoOiB6ZXJvIHdvcmsgd2hlbiBubyByZWNvcmRlcnMgYXJlIGF0dGFjaGVkLlxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAvLyBSZWRhY3Rpb246IGlmIHRoZSBldmVudCBuYW1lIG1hdGNoZXMgYW55IGVtaXRQYXR0ZXJuLCByZXBsYWNlIHBheWxvYWRcbiAgICAvLyB3aXRoICdbUkVEQUNURURdJyBCRUZPUkUgY29uc3RydWN0aW5nIHRoZSBldmVudCAobm8gbGVhayB0aHJvdWdoXG4gICAgLy8gY29weS1vbi13cml0ZSwgbm8gd2F5IGZvciByZWNvcmRlcnMgdG8gc2VlIHRoZSByYXcgdmFsdWUpLlxuICAgIGxldCBmaW5hbFBheWxvYWQ6IHVua25vd24gPSBwYXlsb2FkO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5ydWxlLmdldFBvbGljeSgpPy5lbWl0UGF0dGVybnM7XG4gICAgaWYgKHBhdHRlcm5zICYmIHBhdHRlcm5zLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgICAgICBpZiAocGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgZmluYWxQYXlsb2FkID0gU0NPUEVfUExBQ0VIT0xERVI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCdWlsZCB0aGUgZW5yaWNoZWQgZXZlbnQgb25jZTsgcGFzcyB0aGUgc2FtZSByZWZlcmVuY2UgdG8gYWxsXG4gICAgLy8gcmVjb3JkZXJzLiBTaW5jZSBFbWl0RXZlbnQgaXMgYHJlYWRvbmx5YCwgc2hhcmluZyBpcyBzYWZlLlxuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgbmFtZSxcbiAgICAgIHBheWxvYWQ6IGZpbmFsUGF5bG9hZCxcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiB0aGlzLl9nZXRTdWJmbG93UGF0aCgpLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0gYXMgY29uc3Q7XG5cbiAgICAvLyBEaXNwYXRjaCB3aXRoIGVycm9yIGlzb2xhdGlvbiDigJQgc2FtZSBwYXR0ZXJuIGFzIF9pbnZva2VIb29rIHVzZXMgZm9yXG4gICAgLy8gb3RoZXIgc2NvcGUgZXZlbnRzLiBBIHRocm93aW5nIHJlY29yZGVyJ3MgZXJyb3IgaXMgc3VyZmFjZWQgdmlhXG4gICAgLy8gb25FcnJvciBvbiB0aGUgb3RoZXIgcmVjb3JkZXJzOyB0aGUgZW1pdCBsb29wIGNvbnRpbnVlcyB1bmFmZmVjdGVkLlxuICAgIGZvciAoY29uc3QgcmVjb3JkZXIgb2YgdGhpcy5fcmVjb3JkZXJzKSB7XG4gICAgICBpZiAodHlwZW9mIHJlY29yZGVyLm9uRW1pdCAhPT0gJ2Z1bmN0aW9uJykgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBTaGFyZWQgaW52b2tlIGhlbHBlciDigJQgdGhlIFNBTUUgcHJpbWl0aXZlIHRoZSBkZWZlcnJlZCB0aWVyIHVzZXNcbiAgICAgICAgLy8gYXQgZGVsaXZlcnkgdGltZSwgc28gdGhlIHR3byBkZWxpdmVyeSBwYXRocyBjYW5ub3QgZHJpZnQuXG4gICAgICAgIGludm9rZVJlY29yZGVySG9vayhyZWNvcmRlciwgJ29uRW1pdCcsIGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uRXJyb3InLCB7XG4gICAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGVycm9yOiBlcnJvciBhcyBFcnJvcixcbiAgICAgICAgICBvcGVyYXRpb246ICd3cml0ZScsXG4gICAgICAgICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIERldGFjaCDigJQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydCBleGVjdXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIERlbGVnYXRlcyB0byB0aGUgc2hhcmVkIGBkZXRhY2gvc3Bhd25gIGhlbHBlciwgd2hpY2ggbWludHMgYSByZWZJZFxuICAvLyBmcm9tIHRoaXMgc3RhZ2UncyBgcnVudGltZVN0YWdlSWRgIGFuZCBjYWxscyBgZHJpdmVyLnNjaGVkdWxlKClgLlxuICAvLyBSb3V0ZWQgdGhyb3VnaCBgY3JlYXRlVHlwZWRTY29wZWAgYXMgYHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWBcbiAgLy8gYW5kIGBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KC4uLilgLlxuXG4gIC8qKiBTZWUgYFNjb3BlTWV0aG9kcy4kZGV0YWNoQW5kSm9pbkxhdGVyYC4gKi9cbiAgZGV0YWNoQW5kSm9pbkxhdGVyKFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoSGFuZGxlIHtcbiAgICByZXR1cm4gZGV0YWNoQW5kSm9pbkxhdGVyU3Bhd24oZHJpdmVyLCBjaGlsZCwgaW5wdXQsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKiogU2VlIGBTY29wZU1ldGhvZHMuJGRldGFjaEFuZEZvcmdldGAuICovXG4gIGRldGFjaEFuZEZvcmdldChcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiB2b2lkIHtcbiAgICBkZXRhY2hBbmRGb3JnZXRTcGF3bihkcml2ZXIsIGNoaWxkLCBpbnB1dCwgdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgc3ViZmxvd1BhdGggKG91dGVyIOKGkiBpbm5lcikgZm9yIGV2ZW50IGVucmljaG1lbnQuXG4gICAqXG4gICAqIFBhcnNlcyBmcm9tIGBydW50aW1lU3RhZ2VJZGAgd2hpY2ggaGFzIHRoZSBmb3JtYXRcbiAgICogYFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleGAgKHNlZSBgbGliL2VuZ2luZS9ydW50aW1lU3RhZ2VJZC50c2ApLlxuICAgKiBTdWJmbG93IGlzb2xhdGlvbiBwcmV2ZW50cyB3YWxraW5nIHRoZSBwYXJlbnQtY2hhaW4gYWNyb3NzIGJvdW5kYXJpZXMsXG4gICAqIHNvIHRoZSBydW50aW1lU3RhZ2VJZCDigJQgZ2xvYmFsbHkgdW5pcXVlLCBpbmNsdWRlcyBmdWxsIHBhdGgg4oCUIGlzIHRoZVxuICAgKiBjYW5vbmljYWwgc291cmNlIG9mIHRydXRoIGZvciB0aGUgc3ViZmxvdyBoaWVyYXJjaHkgYXQgZW1pdCB0aW1lLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICogICAnc2VlZCMwJyAgICAgICAgICAgICAgICAg4oaSIFtdICAgICAgICAgICAgICAgICAgICAocm9vdClcbiAgICogICAnc2YtaW5uZXIvaW5uZXIjNScgICAgICAg4oaSIFsnc2YtaW5uZXInXVxuICAgKiAgICdzZi1hL3NmLWIvc3RhZ2UjMycgICAgICDihpIgWydzZi1hJywgJ3NmLWInXSAgICAgIChuZXN0ZWQpXG4gICAqL1xuICBwcml2YXRlIF9nZXRTdWJmbG93UGF0aCgpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgY29uc3QgcnRpZCA9IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZDtcbiAgICBpZiAoIXJ0aWQpIHJldHVybiBTY29wZUZhY2FkZS5fRU1QVFlfU1VCRkxPV19QQVRIO1xuICAgIC8vIFN0cmlwIHRoZSB0cmFpbGluZyBgI2V4ZWN1dGlvbkluZGV4YCB0byBpc29sYXRlIHRoZSBwYXRoIHBvcnRpb24uXG4gICAgY29uc3QgaGFzaElkeCA9IHJ0aWQubGFzdEluZGV4T2YoJyMnKTtcbiAgICBjb25zdCBwYXRoUG9ydGlvbiA9IGhhc2hJZHggPj0gMCA/IHJ0aWQuc2xpY2UoMCwgaGFzaElkeCkgOiBydGlkO1xuICAgIC8vIHBhdGhQb3J0aW9uIGlzIG5vdyBgW3N1YmZsb3dQYXRoL11zdGFnZUlkYC4gU3BsaXQgb24gJy8nIGFuZCBkcm9wIHRoZVxuICAgIC8vIGxhc3Qgc2VnbWVudCAoc3RhZ2VJZCkg4oCUIHdoYXQgcmVtYWlucyBpcyB0aGUgc3ViZmxvdyBwYXRoLlxuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aFBvcnRpb24uc3BsaXQoJy8nKTtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoIDw9IDEpIHJldHVybiBTY29wZUZhY2FkZS5fRU1QVFlfU1VCRkxPV19QQVRIO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHNlZ21lbnRzLnNsaWNlKDAsIC0xKSk7XG4gIH1cblxuICAvLyDilIDilIAgTm9uLVRyYWNraW5nIFN0YXRlIEluc3BlY3Rpb24gKGZvciBUeXBlZFNjb3BlIHByb3h5IGludGVybmFscykg4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFJldHVybnMgYWxsIHN0YXRlIGtleXMgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IFR5cGVkU2NvcGUgb3duS2V5cy9oYXMgdHJhcHMuICovXG4gIGdldFN0YXRlS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIHVuZGVmaW5lZCk7XG4gICAgaWYgKCFzbmFwc2hvdCB8fCB0eXBlb2Ygc25hcHNob3QgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNuYXBzaG90IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgfVxuXG4gIC8qKiBDaGVjayBrZXkgZXhpc3RlbmNlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBUeXBlZFNjb3BlIGhhcyB0cmFwLlxuICAgKiAgQ29udHJhY3Q6IHJldHVybnMgZmFsc2UgZm9yIGtleXMgbmV2ZXIgc2V0IE9SIGtleXMgc2V0IHRvIHVuZGVmaW5lZC5cbiAgICogIFRoaXMgbWF0Y2hlcyBkZWxldGVWYWx1ZSgpIHNlbWFudGljcyAoc2V0cyB0byB1bmRlZmluZWQgPSBkZWxldGVkKS4gKi9cbiAgaGFzS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZShbXSwga2V5KSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGFycmF5IHByb3h5IGdldEN1cnJlbnQoKSB0byBhdm9pZFxuICAgKiAgcGhhbnRvbSByZWFkcyBvbiBpbnRlcm5hbCBhcnJheSBvcGVyYXRpb25zICgubGVuZ3RoLCAuaGFzLCBpdGVyYXRpb24sIGV0Yy4pLlxuICAgKiAgVGhlIGluaXRpYWwgcHJvcGVydHkgYWNjZXNzIGZpcmVzIG9uZSB0cmFja2VkIG9uUmVhZCB2aWEgZ2V0VmFsdWUoKTsgc3Vic2VxdWVudFxuICAgKiAgaW50ZXJuYWwgYXJyYXkgb3BlcmF0aW9ucyB1c2UgdGhpcyBtZXRob2QgdG8gc3RheSBzaWxlbnQuXG4gICAqICBOT1RFOiBMaWtlIGdldFZhbHVlKCksIHJldHVybnMgdGhlIHJhdyB2YWx1ZSB0byB0aGUgY2FsbGVyLiBSZWRhY3Rpb24gYXBwbGllc1xuICAgKiAgb25seSB0byByZWNvcmRlciBkaXNwYXRjaCDigJQgaXQgZG9lcyBub3QgZmlsdGVyIHRoZSByZXR1cm5lZCB2YWx1ZS4gVGhpcyBtYXRjaGVzXG4gICAqICB0aGUgZXhpc3RpbmcgZ2V0VmFsdWUoKSBjb250cmFjdCB3aGVyZSB1c2VyIGNvZGUgYWx3YXlzIHJlY2VpdmVzIHJhdyBkYXRhLlxuICAgKlxuICAgKiAgUkZDLTAwMyBEMjogYSBzaWxlbnQgcmVhZCBvZiBhIGtleSB0aGlzIHN0YWdlIG5ldmVyIFRSQUNLRUQtcmVhZCBtYXJrc1xuICAgKiAgdGhlIHN0YWdlJ3MgY29tbWl0IHdpdGggYHVudHJhY2tlZFNvdXJjZXM6IFsnc2lsZW50J11gIOKAlCBhIGNhdXNhbCBzbGljZVxuICAgKiAgYnVpbHQgZnJvbSBvblJlYWQgZXZlbnRzIHdvdWxkIG1pc3MgdGhpcyBkZXBlbmRlbmN5LCBhbmQgY29uc3VtZXJzIG11c3RcbiAgICogIGJlIHRvbGQuIFNpbGVudCByZWFkcyBzaGFkb3dlZCBieSBhIHRyYWNrZWQgcmVhZCBvZiB0aGUgc2FtZSBrZXkgKHRoZVxuICAgKiAgYXJyYXktcHJveHkgcGF0dGVybiBhYm92ZSkgYXJlIG5vdCBmbGFnZ2VkOiB0aGVpciBlZGdlIGlzIGNhcHR1cmVkLiBBXG4gICAqICB3aG9sZS1zdGF0ZSBzaWxlbnQgcmVhZCAobm8ga2V5KSBpcyBhbHdheXMgZmxhZ2dlZC4gKi9cbiAgZ2V0VmFsdWVTaWxlbnQoa2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLl90cmFja2VkUmVhZEtleXMuaGFzKGtleSkpIHtcbiAgICAgIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdzaWxlbnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZURpcmVjdChbXSwga2V5KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdGF0ZSBBY2Nlc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0SW5pdGlhbFZhbHVlRm9yKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZCBvZiBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqICoqUmVhZCB2YWx1ZXMgYXJlIEJPUlJPV0VEIOKAlCBkbyBub3QgbXV0YXRlIHRoZW0uKiogU2luY2UgdGhlIGxhenkgYnVmZmVyXG4gICAqICgjMTMpLCByZWFkcyBiZWZvcmUgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgcmV0dXJuIHJlZmVyZW5jZXMgSU5UT1xuICAgKiBDT01NSVRURUQgU0hBUkVEIFNUQVRFLCBhbmQgcmVhZHMgYWZ0ZXIgYSB3cml0ZSByZXR1cm4gcmVmZXJlbmNlcyBpbnRvXG4gICAqIHRoZSBzdGFnZSdzIHByaXZhdGUgdHJhbnNhY3Rpb24tYnVmZmVyIHdvcmtpbmcgY29weSAodGhlIGVhZ2VyIGVuZ2luZVxuICAgKiByZXR1cm5lZCByZWZlcmVuY2VzIGludG8gdGhhdCB3b3JraW5nIGNvcHkgZm9yIEFMTCByZWFkcykuIE11dGF0aW5nIGFcbiAgICogcmV0dXJuZWQgdmFsdWUgaW4gcGxhY2Ugd291bGQgY29ycnVwdCBzdGF0ZSB3aXRob3V0IGEgY29tbWl0IHJlY29yZCDigJRcbiAgICogd3JpdGUgY2hhbmdlcyBiYWNrIHZpYSBgc2V0VmFsdWVgL2B1cGRhdGVWYWx1ZWAgaW5zdGVhZC4gVHlwZWRTY29wZVxuICAgKiBjb25zdW1lcnMgYXJlIHNhZmUgYXV0b21hdGljYWxseTogdGhlIHByb3h5IHJvdXRlcyBldmVyeSBtdXRhdGlvblxuICAgKiB0aHJvdWdoIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYC9jb3B5LW9uLXdyaXRlIGFycmF5IG9wcy5cbiAgICpcbiAgICogVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IE5PIGRldi1tb2RlIGZyZWV6ZSBndWFyZCBoZXJlOiBkZWVwLWZyZWV6aW5nIGFcbiAgICogYnVmZmVyLXNlcnZlZCByZWFkIHdvdWxkIGZyZWV6ZSB0aGUgc3RhZ2UncyBvd24gd29ya2luZyBjb3B5IGFuZCBtYWtlIGFcbiAgICogbGVnaXRpbWF0ZSByZWFkLXRoZW4tZGVlcC13cml0ZSB0aHJvdywgYW5kIGZyZWV6aW5nIGEgY29tbWl0dGVkLXN0YXRlXG4gICAqIHJlYWQgbXV0YXRlcyBhbiBvYmplY3Qgc2hhcmVkIHdpdGggZXZlcnkgb3RoZXIgY29uc3VtZXIgb2YgdGhlIGxpdmVcbiAgICogc3RhdGUuIFNlZSBgc3JjL2xpYi9tZW1vcnkvUkVBRE1FLm1kYCAoXCJSZWFkIHZhbHVlcyBhcmUgYm9ycm93ZWRcIikuXG4gICAqXG4gICAqIFJlY29yZGVyIG5vdGU6IHRoZSBgb25SZWFkYCBldmVudCBiZWxvdyBwYXNzZXMgdGhlIFNBTUUgbGl2ZSByZWZlcmVuY2VcbiAgICogKG5vIGNsb25lKSB1bmxlc3MgZmllbGQtbGV2ZWwgcmVkYWN0aW9uIHNjcnVicyBhIGNvcHkg4oCUIHJlY29yZGVycyBtdXN0XG4gICAqIHRyZWF0IGV2ZW50IHZhbHVlcyBhcyByZWFkLW9ubHkgdG9vLlxuICAgKi9cbiAgZ2V0VmFsdWUoa2V5Pzogc3RyaW5nKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIGtleSk7XG5cbiAgICAvLyBSRkMtMDAzIEQyOiByZW1lbWJlciB0cmFja2VkIGtleXMgc28gbGF0ZXIgU0lMRU5UIHJlYWRzIG9mIHRoZSBzYW1lXG4gICAgLy8ga2V5IGNvdW50IGFzIHNoYWRvd2VkIChlZGdlIGFscmVhZHkgY2FwdHVyZWQpIGluc3RlYWQgb2YgdW50cmFja2VkLlxuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgdGhpcy5fdHJhY2tlZFJlYWRLZXlzLmFkZChrZXkpO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBBIHdob2xlLXN0YXRlIHJlYWQgKG5vIGtleSkgaXMgc2VydmVkIHdpdGggZXZlcnkgcmVkYWN0ZWQga2V5IGluc2lkZVxuICAgICAgLy8gaXQgc2NydWJiZWQ7IGEga2V5ZWQgcmVhZCBpcyBzZXJ2ZWQgdW5kZXIgdGhlIGtleSdzIHZlcmRpY3QuXG4gICAgICBjb25zdCB2ZXJkaWN0ID0ga2V5ID09PSB1bmRlZmluZWQgPyBDTEVBUiA6IHRoaXMucnVsZS52ZXJkaWN0KFtrZXldKTtcbiAgICAgIGNvbnN0IHJlY29yZGVyVmFsdWUgPSBrZXkgPT09IHVuZGVmaW5lZCA/IHRoaXMucnVsZS5yZXRhaW5SZWNvcmQodmFsdWUpIDogUmVkYWN0aW9uUnVsZS5hcHBseSh2ZXJkaWN0LCB2YWx1ZSk7XG5cbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uUmVhZCcsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogcmVjb3JkZXJWYWx1ZSxcbiAgICAgICAgcmVkYWN0ZWQ6IHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBzZXRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIGtleSwgJ3dyaXRlJyk7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGtleSk7XG5cbiAgICAvLyBEZXYtbW9kZTogd2FybiBpZiB0aGUgdmFsdWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbiAgICAvLyBDaGVjayBBRlRFUiBhc3NlcnROb3RSZWFkb25seSDigJQgZG9uJ3Qgd2FybiBmb3Igd3JpdGVzIHRoYXQgd2lsbCBiZSBibG9ja2VkLlxuICAgIC8vIENpcmN1bGFyIHZhbHVlcyB3b3JrICh0ZXJtaW5hbCBwcm94eSBoYW5kbGVzIHRoZW0pIGJ1dCBjYW4gcHJvZHVjZVxuICAgIC8vIHN1cnByaXNpbmcgYmVoYXZpb3IgaW4gbmFycmF0aXZlLCBKU09OIHNlcmlhbGl6YXRpb24sIGFuZCBzbmFwc2hvdHMuXG4gICAgaWYgKGlzRGV2TW9kZSgpICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChoYXNDaXJjdWxhclJlZmVyZW5jZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gc2V0VmFsdWUoJyR7a2V5fScpLiBgICtcbiAgICAgICAgICAgICdXcml0ZXMgcGFzdCB0aGUgY3ljbGUgZGVwdGggd2lsbCB1c2UgdGVybWluYWwgcHJveHkgdHJhY2tpbmcuICcgK1xuICAgICAgICAgICAgJ0NvbnNpZGVyIGZsYXR0ZW5pbmcgdGhlIGRhdGEgc3RydWN0dXJlLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGNvbnRleHQgaXMgdGhlIE9ORSBmdW5uZWw6IGl0IGRlY2lkZXMgdGhlIHZlcmRpY3QgKGV4cGxpY2l0IGZsYWcsXG4gICAgLy8gcG9saWN5IGtleS9wYXR0ZXJuLCBwZXItcnVuIG1hcmssIG9yIGZpZWxkLWxldmVsIHNjcnViKSwgc3RhZ2VzIHRoZVxuICAgIC8vIHdyaXRlIHdpdGggdGhlIHBhdGhzIHRoZSBsb2cgd2lsbCBzY3J1YiwgYW5kIGhhbmRzIHRoZSB2ZXJkaWN0IGJhY2sgc29cbiAgICAvLyByZWNvcmRlcnMgc2VlIHRoZSBzYW1lIGRlY2lzaW9uIHRoZSByZXRhaW5lZCByZWNvcmQgaG9sZHMuXG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5zZXRPYmplY3QoW10sIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgZGVzY3JpcHRpb24pO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvbldyaXRlJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKSxcbiAgICAgICAgb3BlcmF0aW9uOiAnc2V0JyxcbiAgICAgICAgcmVkYWN0ZWQ6IHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIGtleSwgJ3dyaXRlJyk7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGtleSk7XG5cbiAgICAvLyBEZXYtbW9kZTogc2FtZSBjaXJjdWxhciBjaGVjayBhcyBzZXRWYWx1ZSAobWVyZ2UgdGFyZ2V0cyBjYW4gYmUgY2lyY3VsYXIgdG9vKVxuICAgIGlmIChpc0Rldk1vZGUoKSAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaGFzQ2lyY3VsYXJSZWZlcmVuY2UodmFsdWUpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2Zvb3RwcmludF0gQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGluIHVwZGF0ZVZhbHVlKCcke2tleX0nKS4gYCArXG4gICAgICAgICAgICAnQ29uc2lkZXIgZmxhdHRlbmluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnVwZGF0ZU9iamVjdChbXSwga2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvbldyaXRlJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKSxcbiAgICAgICAgb3BlcmF0aW9uOiAndXBkYXRlJyxcbiAgICAgICAgcmVkYWN0ZWQ6IHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBkZWxldGVWYWx1ZShrZXk6IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBhc3NlcnROb3RSZWFkb25seSh0aGlzLl9yZWFkT25seVZhbHVlcywga2V5LCAnZGVsZXRlJyk7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGtleSk7XG5cbiAgICAvLyBEZWxldGluZyBhIGtleSBjbGVhcnMgaXRzIHBlci1jYWxsIHJlZGFjdGlvbiBtYXJrICh0aGUgY29udGV4dCdzXG4gICAgLy8gZnVubmVsIGRvZXMgdGhhdCk7IGEgcG9saWN5IHZlcmRpY3Qgb24gdGhlIGtleSBzdXJ2aXZlcy5cbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuc2V0T2JqZWN0KFtdLCBrZXksIHVuZGVmaW5lZCwgZmFsc2UsIGRlc2NyaXB0aW9uID8/IGBkZWxldGVkICR7a2V5fWAsICdkZWxldGUnKTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBvcGVyYXRpb246ICdkZWxldGUnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRHbG9iYWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShrZXkpO1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuc2V0R2xvYmFsPy4oa2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRHbG9iYWwoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LmdldEdsb2JhbD8uKGtleSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldE9iamVjdEluUm9vdChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLmFzc2VydExpdmUoa2V5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LnNldFJvb3Q/LihrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkLW9ubHkgKyBtaXNjIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZWFkb25seSBpbnB1dCB2YWx1ZXMgcGFzc2VkIHRvIHRoaXMgcGlwZWxpbmUsIGNhc3QgdG8gYFRgLlxuICAgKiBUaGUgcmV0dXJuZWQgb2JqZWN0IGlzIGRlZXBseSBmcm96ZW4g4oCUIGFueSBhdHRlbXB0IHRvIG11dGF0ZSBpdCB0aHJvd3MuXG4gICAqIENhY2hlZCBhdCBjb25zdHJ1Y3Rpb24gdGltZSBmb3IgemVyby1hbGxvY2F0aW9uIHJlcGVhdGVkIGFjY2Vzcy5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB7IGFwcGxpY2FudE5hbWUsIGluY29tZSB9ID0gc2NvcGUuZ2V0QXJnczx7IGFwcGxpY2FudE5hbWU6IHN0cmluZzsgaW5jb21lOiBudW1iZXIgfT4oKTtcbiAgICogYGBgXG4gICAqXG4gICAqIFJGQy0wMDMgRDI6IGFyZ3MgYXJlIHVudHJhY2tlZCBCWSBERVNJR04sIHNvIGNhbGxpbmcgdGhpcyAod2l0aCBhY3R1YWxcbiAgICogaW5wdXQgcHJlc2VudCkgbWFya3MgdGhlIHN0YWdlJ3MgY29tbWl0IHdpdGggYHVudHJhY2tlZFNvdXJjZXM6IFsnYXJncyddYFxuICAgKiDigJQgdGVsbGluZyBjYXVzYWwtc2xpY2UgY29uc3VtZXJzIHRoZSBiYWNrd2FyZCBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZVxuICAgKiBoZXJlLiBBbiBlbXB0eS1hcmdzIHJlYWQgY2FycmllcyBubyBpbmZvcm1hdGlvbiBhbmQgaXMgbm90IGZsYWdnZWQuXG4gICAqL1xuICBnZXRBcmdzPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTogVCB7XG4gICAgaWYgKHRoaXMuX2hhc0FyZ3MpIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdhcmdzJyk7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb3plbkFyZ3MgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQg4oCUIHJlYWQtb25seSBpbmZyYXN0cnVjdHVyZSB2YWx1ZXNcbiAgICogdGhhdCBwcm9wYWdhdGUgdGhyb3VnaCBuZXN0ZWQgZXhlY3V0b3JzIChsaWtlIGBwcm9jZXNzLmVudmAgZm9yIGZsb3djaGFydHMpLlxuICAgKlxuICAgKiBDb250YWluczogc2lnbmFsIChhYm9ydCksIHRpbWVvdXRNcywgdHJhY2VJZC5cbiAgICogRnJvemVuIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBJbmhlcml0ZWQgYnkgc3ViZmxvd3MgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB7IHNpZ25hbCwgdHJhY2VJZCB9ID0gc2NvcGUuZ2V0RW52KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBSRkMtMDAzIEQyOiBlbnYgaXMgdW50cmFja2VkIEJZIERFU0lHTiwgc28gY2FsbGluZyB0aGlzICh3aXRoIGFcbiAgICogbm9uLWVtcHR5IGVudmlyb25tZW50KSBtYXJrcyB0aGUgc3RhZ2UncyBjb21taXQgd2l0aFxuICAgKiBgdW50cmFja2VkU291cmNlczogWydlbnYnXWAg4oCUIHNlZSB7QGxpbmsgZ2V0QXJnc30uXG4gICAqL1xuICBnZXRFbnYoKTogUmVhZG9ubHk8RXhlY3V0aW9uRW52PiB7XG4gICAgaWYgKHRoaXMuX2hhc0VudikgdGhpcy5fc3RhZ2VDb250ZXh0Lm1hcmtVbnRyYWNrZWRTb3VyY2UoJ2VudicpO1xuICAgIHJldHVybiB0aGlzLl9leGVjdXRpb25FbnY7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFBpcGVsaW5lSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbnRlcm5hbCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIF9pbnZva2VIb29rKGhvb2s6IGtleW9mIE9taXQ8U2NvcGVSZWNvcmRlciwgJ2lkJz4sIGV2ZW50OiB1bmtub3duKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCByZWNvcmRlciBvZiB0aGlzLl9yZWNvcmRlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFNoYXJlZCBpbnZva2UgaGVscGVyIOKAlCB0aGUgU0FNRSBwcmltaXRpdmUgdGhlIGRlZmVycmVkIHRpZXIgdXNlc1xuICAgICAgICAvLyBhdCBkZWxpdmVyeSB0aW1lIChSRkMtMDAxIMKnOSBtaXRpZ2F0aW9uKTogbG9va3VwICsgYC5jYWxsKHRoaXMpYFxuICAgICAgICAvLyBzZW1hbnRpY3MgbGl2ZSBpbiBleGFjdGx5IG9uZSBwbGFjZSwgc28gdGhlIGlubGluZSBhbmQgZGVmZXJyZWRcbiAgICAgICAgLy8gcGF0aHMgY2Fubm90IGRyaWZ0LlxuICAgICAgICBpbnZva2VSZWNvcmRlckhvb2socmVjb3JkZXIsIGhvb2ssIGV2ZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChob29rICE9PSAnb25FcnJvcicpIHtcbiAgICAgICAgICB0aGlzLl9pbnZva2VIb29rKCdvbkVycm9yJywge1xuICAgICAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgYXMgRXJyb3IsXG4gICAgICAgICAgICBvcGVyYXRpb246IGhvb2sgPT09ICdvblJlYWQnID8gJ3JlYWQnIDogaG9vayA9PT0gJ29uQ29tbWl0JyA/ICdjb21taXQnIDogJ3dyaXRlJyxcbiAgICAgICAgICAgIGNoYW5uZWw6ICdzY29wZScgYXMgY29uc3QsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,132 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* detectCircular — Dev-mode circular reference detection for scope values.
|
|
4
|
-
*
|
|
5
|
-
* Checks if a value contains circular references using a WeakSet traversal.
|
|
6
|
-
* O(n) where n = total nested objects. Uses WeakSet so no memory leak.
|
|
7
|
-
*
|
|
8
|
-
* Gated by the caller — only called in dev mode to avoid production overhead.
|
|
9
|
-
* Same approach as Immer (detect and warn at runtime).
|
|
10
|
-
*/
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.isDevMode = exports.
|
|
3
|
+
exports.isDevMode = exports.enableDevMode = exports.disableDevMode = exports.hasCircularReference = void 0;
|
|
13
4
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*/
|
|
17
|
-
function hasCircularReference(value, ancestors = new WeakSet()) {
|
|
18
|
-
if (value === null || typeof value !== 'object')
|
|
19
|
-
return false;
|
|
20
|
-
// Skip non-plain objects (Date, Map, Set, class instances) — same as allowlist logic
|
|
21
|
-
if (Array.isArray(value)) {
|
|
22
|
-
if (ancestors.has(value))
|
|
23
|
-
return true;
|
|
24
|
-
ancestors.add(value);
|
|
25
|
-
for (const item of value) {
|
|
26
|
-
if (hasCircularReference(item, ancestors))
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
ancestors.delete(value); // backtrack — allow diamond references
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
const ctor = value.constructor;
|
|
33
|
-
if (ctor !== undefined && ctor !== Object)
|
|
34
|
-
return false; // class instance — skip
|
|
35
|
-
if (ancestors.has(value))
|
|
36
|
-
return true;
|
|
37
|
-
ancestors.add(value);
|
|
38
|
-
for (const v of Object.values(value)) {
|
|
39
|
-
if (hasCircularReference(v, ancestors))
|
|
40
|
-
return true;
|
|
41
|
-
}
|
|
42
|
-
ancestors.delete(value); // backtrack — allow diamond references
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
exports.hasCircularReference = hasCircularReference;
|
|
46
|
-
/**
|
|
47
|
-
* Global dev-mode flag for the whole `footprintjs` library.
|
|
48
|
-
*
|
|
49
|
-
* ## What it gates
|
|
50
|
-
*
|
|
51
|
-
* Multiple library subsystems use `isDevMode()` to decide whether to run
|
|
52
|
-
* expensive or noisy developer-only checks. Production leaves it OFF (the
|
|
53
|
-
* default) to avoid the cost and keep logs clean. Turning it ON enables:
|
|
54
|
-
*
|
|
55
|
-
* - Circular-reference detection in `ScopeFacade.setValue()` (O(n) per write).
|
|
56
|
-
* - Warnings when `attachCombinedRecorder()` receives a recorder with no
|
|
57
|
-
* observer methods (likely mistake — easy to forget an `on*` handler).
|
|
58
|
-
* - Warnings from `decide()` / `select()` when a predicate or rule shape
|
|
59
|
-
* looks suspicious.
|
|
60
|
-
* - Structural-integrity warnings in `getSubtreeSnapshot()`.
|
|
61
|
-
* - Any future developer-only diagnostic added to the library.
|
|
62
|
-
*
|
|
63
|
-
* ## How to enable
|
|
64
|
-
*
|
|
65
|
-
* Call `enableDevMode()` once at application startup (typically near your
|
|
66
|
-
* executor construction):
|
|
67
|
-
*
|
|
68
|
-
* ```ts
|
|
69
|
-
* import { enableDevMode } from 'footprintjs';
|
|
70
|
-
*
|
|
71
|
-
* if (process.env.NODE_ENV !== 'production') {
|
|
72
|
-
* enableDevMode();
|
|
73
|
-
* }
|
|
74
|
-
* ```
|
|
5
|
+
* @deprecated Moved (F0, the fence and the leaves). This path re-exports for one minor
|
|
6
|
+
* and then goes away; import from the new homes:
|
|
75
7
|
*
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* ## Contract
|
|
80
|
-
*
|
|
81
|
-
* - Default: OFF. A library import does NOT enable dev-mode automatically.
|
|
82
|
-
* - Global: one flag controls all library dev diagnostics. A consumer who
|
|
83
|
-
* calls `disableDevMode()` silences every dev warning at once.
|
|
84
|
-
* - Process-wide: not per-executor. Enabling mid-run affects subsequent
|
|
85
|
-
* operations but does not retroactively replay missed checks.
|
|
86
|
-
* - Safe in production: when OFF, every gated check is a cheap `!flag`
|
|
87
|
-
* branch and adds negligible overhead.
|
|
88
|
-
*/
|
|
89
|
-
let devModeEnabled = false;
|
|
90
|
-
/**
|
|
91
|
-
* Enable dev-mode diagnostics across the whole library.
|
|
92
|
-
*
|
|
93
|
-
* When on, the library performs developer-only checks (circular references,
|
|
94
|
-
* empty recorder detection, suspicious predicate shapes, etc.) and emits
|
|
95
|
-
* `console.warn` messages to help you catch mistakes early.
|
|
96
|
-
*
|
|
97
|
-
* Call once at application startup. See the module header for the full
|
|
98
|
-
* list of what dev-mode gates.
|
|
99
|
-
*
|
|
100
|
-
* @example
|
|
101
|
-
* ```ts
|
|
102
|
-
* import { enableDevMode } from 'footprintjs';
|
|
103
|
-
* if (process.env.NODE_ENV !== 'production') enableDevMode();
|
|
104
|
-
* ```
|
|
105
|
-
*/
|
|
106
|
-
function enableDevMode() {
|
|
107
|
-
devModeEnabled = true;
|
|
108
|
-
}
|
|
109
|
-
exports.enableDevMode = enableDevMode;
|
|
110
|
-
/**
|
|
111
|
-
* Disable dev-mode diagnostics across the whole library (default state).
|
|
112
|
-
*
|
|
113
|
-
* All dev-only checks become no-ops. Safe to call in production paths —
|
|
114
|
-
* typically the default never needs to be re-asserted, but this is the
|
|
115
|
-
* documented way to turn the flag off if your code enabled it earlier.
|
|
116
|
-
*/
|
|
117
|
-
function disableDevMode() {
|
|
118
|
-
devModeEnabled = false;
|
|
119
|
-
}
|
|
120
|
-
exports.disableDevMode = disableDevMode;
|
|
121
|
-
/**
|
|
122
|
-
* Returns whether dev-mode diagnostics are currently enabled.
|
|
8
|
+
* - `enableDevMode` / `disableDevMode` / `isDevMode` → `lib/devMode.ts`
|
|
9
|
+
* - `hasCircularReference` → `lib/capture/circular.ts`
|
|
123
10
|
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
11
|
+
* Both are leaves that imported nothing but sat inside `scope/`, which made `memory/`,
|
|
12
|
+
* `recorder/`, `decide/`, `engine/` and `runner/` import upward for them. Same functions,
|
|
13
|
+
* same module state — the flag lives in `devMode.ts` and is shared, never copied.
|
|
127
14
|
*/
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
exports.
|
|
132
|
-
|
|
15
|
+
var circular_js_1 = require("../capture/circular.js");
|
|
16
|
+
Object.defineProperty(exports, "hasCircularReference", { enumerable: true, get: function () { return circular_js_1.hasCircularReference; } });
|
|
17
|
+
var devMode_js_1 = require("../devMode.js");
|
|
18
|
+
Object.defineProperty(exports, "disableDevMode", { enumerable: true, get: function () { return devMode_js_1.disableDevMode; } });
|
|
19
|
+
Object.defineProperty(exports, "enableDevMode", { enumerable: true, get: function () { return devMode_js_1.enableDevMode; } });
|
|
20
|
+
Object.defineProperty(exports, "isDevMode", { enumerable: true, get: function () { return devMode_js_1.isDevMode; } });
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV0ZWN0Q2lyY3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL2RldGVjdENpcmN1bGFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxzREFBOEQ7QUFBckQsbUhBQUEsb0JBQW9CLE9BQUE7QUFDN0IsNENBQXlFO0FBQWhFLDRHQUFBLGNBQWMsT0FBQTtBQUFFLDJHQUFBLGFBQWEsT0FBQTtBQUFFLHVHQUFBLFNBQVMsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlcHJlY2F0ZWQgTW92ZWQgKEYwLCB0aGUgZmVuY2UgYW5kIHRoZSBsZWF2ZXMpLiBUaGlzIHBhdGggcmUtZXhwb3J0cyBmb3Igb25lIG1pbm9yXG4gKiBhbmQgdGhlbiBnb2VzIGF3YXk7IGltcG9ydCBmcm9tIHRoZSBuZXcgaG9tZXM6XG4gKlxuICogICAtIGBlbmFibGVEZXZNb2RlYCAvIGBkaXNhYmxlRGV2TW9kZWAgLyBgaXNEZXZNb2RlYCAg4oaSICBgbGliL2Rldk1vZGUudHNgXG4gKiAgIC0gYGhhc0NpcmN1bGFyUmVmZXJlbmNlYCAgICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgIGBsaWIvY2FwdHVyZS9jaXJjdWxhci50c2BcbiAqXG4gKiBCb3RoIGFyZSBsZWF2ZXMgdGhhdCBpbXBvcnRlZCBub3RoaW5nIGJ1dCBzYXQgaW5zaWRlIGBzY29wZS9gLCB3aGljaCBtYWRlIGBtZW1vcnkvYCxcbiAqIGByZWNvcmRlci9gLCBgZGVjaWRlL2AsIGBlbmdpbmUvYCBhbmQgYHJ1bm5lci9gIGltcG9ydCB1cHdhcmQgZm9yIHRoZW0uIFNhbWUgZnVuY3Rpb25zLFxuICogc2FtZSBtb2R1bGUgc3RhdGUg4oCUIHRoZSBmbGFnIGxpdmVzIGluIGBkZXZNb2RlLnRzYCBhbmQgaXMgc2hhcmVkLCBuZXZlciBjb3BpZWQuXG4gKi9cbmV4cG9ydCB7IGhhc0NpcmN1bGFyUmVmZXJlbmNlIH0gZnJvbSAnLi4vY2FwdHVyZS9jaXJjdWxhci5qcyc7XG5leHBvcnQgeyBkaXNhYmxlRGV2TW9kZSwgZW5hYmxlRGV2TW9kZSwgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG4iXX0=
|