footprintjs 10.0.1 → 10.2.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 +2 -1
- package/CLAUDE.md +61 -7
- package/README.md +136 -312
- package/dist/esm/index.d.ts +62 -2
- package/dist/esm/index.js +13 -6
- package/dist/esm/lib/attempt/anySignal.d.ts +19 -0
- package/dist/esm/lib/attempt/anySignal.js +39 -0
- package/dist/esm/lib/attempt/call.d.ts +88 -0
- package/dist/esm/lib/attempt/call.js +129 -0
- package/dist/esm/lib/attempt/category.d.ts +37 -0
- package/dist/esm/lib/attempt/category.js +131 -0
- package/dist/esm/lib/attempt/correlation.d.ts +95 -0
- package/dist/esm/lib/attempt/correlation.js +178 -0
- package/dist/esm/lib/attempt/deadline.d.ts +44 -0
- package/dist/esm/lib/attempt/deadline.js +101 -0
- package/dist/esm/lib/attempt/decision.d.ts +52 -0
- package/dist/esm/lib/attempt/decision.js +134 -0
- package/dist/esm/lib/attempt/effect.d.ts +76 -0
- package/dist/esm/lib/attempt/effect.js +160 -0
- package/dist/esm/lib/attempt/errors.d.ts +41 -0
- package/dist/esm/lib/attempt/errors.js +44 -0
- package/dist/esm/lib/attempt/index.d.ts +18 -0
- package/dist/esm/lib/attempt/index.js +15 -0
- package/dist/esm/lib/attempt/name.d.ts +21 -0
- package/dist/esm/lib/attempt/name.js +43 -0
- package/dist/esm/lib/attempt/observed.d.ts +66 -0
- package/dist/esm/lib/attempt/observed.js +171 -0
- package/dist/esm/lib/attempt/policy.d.ts +45 -0
- package/dist/esm/lib/attempt/policy.js +83 -0
- package/dist/esm/lib/attempt/record.d.ts +11 -0
- package/dist/esm/lib/attempt/record.js +24 -0
- package/dist/esm/lib/attempt/retryLoopContext.d.ts +18 -0
- package/dist/esm/lib/attempt/retryLoopContext.js +24 -0
- package/dist/esm/lib/attempt/retryLoopTypes.d.ts +18 -0
- package/dist/esm/lib/attempt/retryLoopTypes.js +2 -0
- package/dist/esm/lib/attempt/runner.d.ts +157 -0
- package/dist/esm/lib/attempt/runner.js +523 -0
- package/dist/esm/lib/attempt/standalone.d.ts +47 -0
- package/dist/esm/lib/attempt/standalone.js +126 -0
- package/dist/esm/lib/attempt/types.d.ts +453 -0
- package/dist/esm/lib/attempt/types.js +16 -0
- package/dist/esm/lib/budget/index.d.ts +9 -0
- package/dist/esm/lib/budget/index.js +9 -0
- package/dist/esm/lib/budget/timeBudget.d.ts +136 -0
- package/dist/esm/lib/budget/timeBudget.js +666 -0
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +88 -3
- package/dist/esm/lib/builder/FlowChartBuilder.js +199 -9
- package/dist/esm/lib/builder/retryLoop.d.ts +56 -0
- package/dist/esm/lib/builder/retryLoop.js +283 -0
- package/dist/esm/lib/builder/types.d.ts +35 -1
- package/dist/esm/lib/builder/types.js +1 -1
- package/dist/esm/lib/decide/decide.js +2 -2
- package/dist/esm/lib/decide/index.d.ts +1 -1
- package/dist/esm/lib/decide/index.js +2 -2
- package/dist/esm/lib/decide/types.d.ts +3 -0
- package/dist/esm/lib/decide/types.js +1 -8
- package/dist/esm/lib/engine/graph/StageNode.d.ts +11 -1
- package/dist/esm/lib/engine/graph/StageNode.js +1 -1
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +5 -1
- package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
- package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +3 -1
- package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
- package/dist/esm/lib/engine/handlers/StageRunner.d.ts +8 -1
- package/dist/esm/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +24 -5
- package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
- package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
- package/dist/esm/lib/engine/handlers/stageError.d.ts +9 -0
- package/dist/esm/lib/engine/handlers/stageError.js +23 -1
- package/dist/esm/lib/engine/index.d.ts +2 -2
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +68 -40
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +61 -9
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
- package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +23 -0
- package/dist/esm/lib/engine/narrative/formatting/sentences.js +127 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +2 -2
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +27 -21
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
- package/dist/esm/lib/engine/narrative/recorders/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/recorders/index.js +1 -1
- package/dist/esm/lib/engine/narrative/types.d.ts +74 -5
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +194 -118
- package/dist/esm/lib/engine/traversalContext.d.ts +7 -2
- package/dist/esm/lib/engine/traversalContext.js +6 -3
- package/dist/esm/lib/engine/types.d.ts +52 -57
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
- package/dist/esm/lib/errors/terminalFailure.js +60 -0
- package/dist/esm/lib/{decide → filter}/evaluator.d.ts +7 -2
- package/dist/esm/lib/filter/evaluator.js +135 -0
- package/dist/esm/lib/ids/idempotencyKey.d.ts +14 -0
- package/dist/esm/lib/ids/idempotencyKey.js +24 -0
- package/dist/esm/lib/memory/StageContext.d.ts +123 -3
- package/dist/esm/lib/memory/StageContext.js +245 -4
- package/dist/esm/lib/memory/attention.d.ts +26 -0
- package/dist/esm/lib/memory/attention.js +171 -0
- package/dist/esm/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/esm/lib/memory/borrowedMutation.js +14 -1
- package/dist/esm/lib/memory/frameTypes.d.ts +38 -0
- package/dist/esm/lib/memory/frameTypes.js +3 -1
- package/dist/esm/lib/memory/redaction.d.ts +12 -0
- package/dist/esm/lib/memory/redaction.js +54 -5
- package/dist/esm/lib/pause/record.js +10 -1
- package/dist/esm/lib/pause/types.d.ts +19 -0
- package/dist/esm/lib/pause/types.js +17 -1
- package/dist/esm/lib/reactive/createTypedScope.js +3 -1
- package/dist/esm/lib/reactive/types.d.ts +36 -4
- package/dist/esm/lib/reactive/types.js +3 -1
- package/dist/esm/lib/recorder/AttemptRecorder.d.ts +141 -0
- package/dist/esm/lib/recorder/AttemptRecorder.js +412 -0
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +36 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +50 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +3 -0
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.d.ts +37 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +75 -6
- package/dist/esm/lib/recorder/QualityRecorder.d.ts +32 -5
- package/dist/esm/lib/recorder/QualityRecorder.js +87 -29
- package/dist/esm/lib/recorder/TopologyRecorder.d.ts +35 -5
- package/dist/esm/lib/recorder/TopologyRecorder.js +76 -2
- package/dist/esm/lib/recorder/attemptMetricRows.d.ts +11 -0
- package/dist/esm/lib/recorder/attemptMetricRows.js +202 -0
- package/dist/esm/lib/recorder/attemptMetrics.d.ts +7 -0
- package/dist/esm/lib/recorder/attemptMetrics.js +165 -0
- package/dist/esm/lib/recorder/attemptMetricsTypes.d.ts +114 -0
- package/dist/esm/lib/recorder/attemptMetricsTypes.js +2 -0
- package/dist/esm/lib/recorder/attemptOTel.d.ts +78 -0
- package/dist/esm/lib/recorder/attemptOTel.js +107 -0
- package/dist/esm/lib/recorder/attemptSeries.d.ts +81 -0
- package/dist/esm/lib/recorder/attemptSeries.js +103 -0
- package/dist/esm/lib/recorder/hooks.d.ts +9 -0
- package/dist/esm/lib/recorder/hooks.js +4 -1
- package/dist/esm/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/esm/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +46 -2
- package/dist/esm/lib/runner/FlowChartExecutor.js +330 -101
- package/dist/esm/lib/runner/RunnableChart.d.ts +6 -0
- package/dist/esm/lib/runner/RunnableChart.js +5 -1
- package/dist/esm/lib/runner/attach.d.ts +2 -1
- package/dist/esm/lib/runner/attach.js +8 -2
- package/dist/esm/lib/runner/checkpoint.js +3 -1
- package/dist/esm/lib/runner/deadline.d.ts +42 -0
- package/dist/esm/lib/runner/deadline.js +90 -0
- package/dist/esm/lib/runner/index.d.ts +3 -1
- package/dist/esm/lib/runner/index.js +2 -1
- package/dist/esm/lib/runner/options.d.ts +17 -0
- package/dist/esm/lib/runner/options.js +3 -1
- package/dist/esm/lib/runner/recordSink.d.ts +128 -0
- package/dist/esm/lib/runner/recordSink.js +296 -0
- package/dist/esm/lib/runner/resume.d.ts +3 -0
- package/dist/esm/lib/runner/resume.js +22 -2
- package/dist/esm/lib/runner/snapshot.d.ts +2 -2
- package/dist/esm/lib/runner/snapshot.js +6 -2
- package/dist/esm/lib/scope/ScopeFacade.d.ts +118 -4
- package/dist/esm/lib/scope/ScopeFacade.js +304 -7
- package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +17 -3
- package/dist/esm/lib/scope/recorders/DebugRecorder.js +79 -13
- package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +10 -0
- package/dist/esm/lib/scope/recorders/MetricRecorder.js +15 -2
- package/dist/esm/lib/scope/runtime.d.ts +3 -0
- package/dist/esm/lib/scope/runtime.js +1 -1
- package/dist/esm/lib/scope/types.d.ts +6 -0
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/esm/lib/sinks/fileSink.d.ts +135 -0
- package/dist/esm/lib/sinks/fileSink.js +387 -0
- package/dist/esm/recorders.d.ts +8 -2
- package/dist/esm/recorders.js +7 -1
- package/dist/esm/sinks.d.ts +23 -0
- package/dist/esm/sinks.js +23 -0
- package/dist/esm/trace.d.ts +2 -2
- package/dist/esm/trace.js +1 -1
- package/dist/index.js +77 -60
- package/dist/lib/attempt/anySignal.js +43 -0
- package/dist/lib/attempt/call.js +134 -0
- package/dist/lib/attempt/category.js +136 -0
- package/dist/lib/attempt/correlation.js +186 -0
- package/dist/lib/attempt/deadline.js +112 -0
- package/dist/lib/attempt/decision.js +139 -0
- package/dist/lib/attempt/effect.js +174 -0
- package/dist/lib/attempt/errors.js +49 -0
- package/dist/lib/attempt/index.js +26 -0
- package/dist/lib/attempt/name.js +48 -0
- package/dist/lib/attempt/observed.js +177 -0
- package/dist/lib/attempt/policy.js +92 -0
- package/dist/lib/attempt/record.js +29 -0
- package/dist/lib/attempt/retryLoopContext.js +31 -0
- package/dist/lib/attempt/retryLoopTypes.js +3 -0
- package/dist/lib/attempt/runner.js +530 -0
- package/dist/lib/attempt/standalone.js +130 -0
- package/dist/lib/attempt/types.js +17 -0
- package/dist/lib/budget/index.js +17 -0
- package/dist/lib/budget/timeBudget.js +674 -0
- package/dist/lib/builder/FlowChartBuilder.js +199 -9
- package/dist/lib/builder/retryLoop.js +287 -0
- package/dist/lib/builder/types.js +1 -1
- package/dist/lib/decide/decide.js +2 -2
- package/dist/lib/decide/index.js +2 -2
- package/dist/lib/decide/types.js +1 -8
- package/dist/lib/engine/graph/StageNode.js +1 -1
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -1
- package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
- package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
- package/dist/lib/engine/handlers/ResumeEntry.js +3 -1
- package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
- package/dist/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/lib/engine/handlers/SubflowExecutor.js +24 -5
- package/dist/lib/engine/handlers/commitStage.js +24 -5
- package/dist/lib/engine/handlers/stageError.js +26 -2
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +67 -39
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
- package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +60 -8
- package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
- package/dist/lib/engine/narrative/formatting/sentences.js +131 -2
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
- package/dist/lib/engine/narrative/recorders/index.js +1 -1
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +192 -116
- package/dist/lib/engine/traversalContext.js +6 -3
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/errors/terminalFailure.js +64 -0
- package/dist/lib/filter/evaluator.js +139 -0
- package/dist/lib/ids/idempotencyKey.js +28 -0
- package/dist/lib/memory/StageContext.js +246 -5
- package/dist/lib/memory/attention.js +175 -0
- package/dist/lib/memory/borrowedMutation.js +16 -2
- package/dist/lib/memory/frameTypes.js +3 -1
- package/dist/lib/memory/redaction.js +54 -5
- package/dist/lib/pause/record.js +10 -1
- package/dist/lib/pause/types.js +17 -1
- package/dist/lib/reactive/createTypedScope.js +3 -1
- package/dist/lib/reactive/types.js +3 -1
- package/dist/lib/recorder/AttemptRecorder.js +417 -0
- package/dist/lib/recorder/ControlDepRecorder.js +50 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +75 -6
- package/dist/lib/recorder/QualityRecorder.js +87 -29
- package/dist/lib/recorder/TopologyRecorder.js +76 -2
- package/dist/lib/recorder/attemptMetricRows.js +209 -0
- package/dist/lib/recorder/attemptMetrics.js +174 -0
- package/dist/lib/recorder/attemptMetricsTypes.js +3 -0
- package/dist/lib/recorder/attemptOTel.js +111 -0
- package/dist/lib/recorder/attemptSeries.js +113 -0
- package/dist/lib/recorder/hooks.js +4 -1
- package/dist/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/lib/runner/FlowChartExecutor.js +330 -101
- package/dist/lib/runner/RunnableChart.js +5 -1
- package/dist/lib/runner/attach.js +8 -2
- package/dist/lib/runner/checkpoint.js +3 -1
- package/dist/lib/runner/deadline.js +94 -0
- package/dist/lib/runner/index.js +4 -2
- package/dist/lib/runner/options.js +3 -1
- package/dist/lib/runner/recordSink.js +302 -0
- package/dist/lib/runner/resume.js +22 -2
- package/dist/lib/runner/snapshot.js +6 -2
- package/dist/lib/scope/ScopeFacade.js +303 -6
- package/dist/lib/scope/recorders/DebugRecorder.js +79 -13
- package/dist/lib/scope/recorders/MetricRecorder.js +15 -2
- package/dist/lib/scope/runtime.js +1 -1
- package/dist/lib/scope/types.js +1 -1
- package/dist/lib/sinks/fileSink.js +392 -0
- package/dist/recorders.js +10 -2
- package/dist/sinks.js +32 -0
- package/dist/trace.js +1 -1
- package/dist/types/index.d.ts +62 -2
- package/dist/types/lib/attempt/anySignal.d.ts +19 -0
- package/dist/types/lib/attempt/call.d.ts +88 -0
- package/dist/types/lib/attempt/category.d.ts +37 -0
- package/dist/types/lib/attempt/correlation.d.ts +95 -0
- package/dist/types/lib/attempt/deadline.d.ts +44 -0
- package/dist/types/lib/attempt/decision.d.ts +52 -0
- package/dist/types/lib/attempt/effect.d.ts +76 -0
- package/dist/types/lib/attempt/errors.d.ts +41 -0
- package/dist/types/lib/attempt/index.d.ts +18 -0
- package/dist/types/lib/attempt/name.d.ts +21 -0
- package/dist/types/lib/attempt/observed.d.ts +66 -0
- package/dist/types/lib/attempt/policy.d.ts +45 -0
- package/dist/types/lib/attempt/record.d.ts +11 -0
- package/dist/types/lib/attempt/retryLoopContext.d.ts +18 -0
- package/dist/types/lib/attempt/retryLoopTypes.d.ts +18 -0
- package/dist/types/lib/attempt/runner.d.ts +157 -0
- package/dist/types/lib/attempt/standalone.d.ts +47 -0
- package/dist/types/lib/attempt/types.d.ts +453 -0
- package/dist/types/lib/budget/index.d.ts +9 -0
- package/dist/types/lib/budget/timeBudget.d.ts +136 -0
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +88 -3
- package/dist/types/lib/builder/retryLoop.d.ts +56 -0
- package/dist/types/lib/builder/types.d.ts +35 -1
- package/dist/types/lib/decide/index.d.ts +1 -1
- package/dist/types/lib/decide/types.d.ts +3 -0
- package/dist/types/lib/engine/graph/StageNode.d.ts +11 -1
- package/dist/types/lib/engine/handlers/StageRunner.d.ts +8 -1
- package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
- package/dist/types/lib/engine/handlers/stageError.d.ts +9 -0
- package/dist/types/lib/engine/index.d.ts +2 -2
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
- package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
- package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
- package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +23 -0
- package/dist/types/lib/engine/narrative/index.d.ts +2 -2
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +27 -21
- package/dist/types/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
- package/dist/types/lib/engine/narrative/recorders/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/types.d.ts +74 -5
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
- package/dist/types/lib/engine/traversalContext.d.ts +7 -2
- package/dist/types/lib/engine/types.d.ts +52 -57
- package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
- package/dist/types/lib/{decide → filter}/evaluator.d.ts +7 -2
- package/dist/types/lib/ids/idempotencyKey.d.ts +14 -0
- package/dist/types/lib/memory/StageContext.d.ts +123 -3
- package/dist/types/lib/memory/attention.d.ts +26 -0
- package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/types/lib/memory/frameTypes.d.ts +38 -0
- package/dist/types/lib/memory/redaction.d.ts +12 -0
- package/dist/types/lib/pause/types.d.ts +19 -0
- package/dist/types/lib/reactive/types.d.ts +36 -4
- package/dist/types/lib/recorder/AttemptRecorder.d.ts +141 -0
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +36 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +3 -0
- package/dist/types/lib/recorder/InOutRecorder.d.ts +37 -1
- package/dist/types/lib/recorder/QualityRecorder.d.ts +32 -5
- package/dist/types/lib/recorder/TopologyRecorder.d.ts +35 -5
- package/dist/types/lib/recorder/attemptMetricRows.d.ts +11 -0
- package/dist/types/lib/recorder/attemptMetrics.d.ts +7 -0
- package/dist/types/lib/recorder/attemptMetricsTypes.d.ts +114 -0
- package/dist/types/lib/recorder/attemptOTel.d.ts +78 -0
- package/dist/types/lib/recorder/attemptSeries.d.ts +81 -0
- package/dist/types/lib/recorder/hooks.d.ts +9 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +46 -2
- package/dist/types/lib/runner/RunnableChart.d.ts +6 -0
- package/dist/types/lib/runner/attach.d.ts +2 -1
- package/dist/types/lib/runner/deadline.d.ts +42 -0
- package/dist/types/lib/runner/index.d.ts +3 -1
- package/dist/types/lib/runner/options.d.ts +17 -0
- package/dist/types/lib/runner/recordSink.d.ts +128 -0
- package/dist/types/lib/runner/resume.d.ts +3 -0
- package/dist/types/lib/runner/snapshot.d.ts +2 -2
- package/dist/types/lib/scope/ScopeFacade.d.ts +118 -4
- package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +17 -3
- package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +10 -0
- package/dist/types/lib/scope/runtime.d.ts +3 -0
- package/dist/types/lib/scope/types.d.ts +6 -0
- package/dist/types/lib/sinks/fileSink.d.ts +135 -0
- package/dist/types/recorders.d.ts +8 -2
- package/dist/types/sinks.d.ts +23 -0
- package/dist/types/trace.d.ts +2 -2
- package/package.json +20 -6
- package/dist/esm/lib/decide/evaluator.js +0 -130
- package/dist/lib/decide/evaluator.js +0 -134
|
@@ -17,6 +17,13 @@
|
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.ScopeFacade = void 0;
|
|
19
19
|
const foottrace_1 = require("foottrace");
|
|
20
|
+
const call_js_1 = require("../attempt/call.js");
|
|
21
|
+
const effect_js_1 = require("../attempt/effect.js");
|
|
22
|
+
const name_js_1 = require("../attempt/name.js");
|
|
23
|
+
const observed_js_1 = require("../attempt/observed.js");
|
|
24
|
+
const policy_js_1 = require("../attempt/policy.js");
|
|
25
|
+
const retryLoopContext_js_1 = require("../attempt/retryLoopContext.js");
|
|
26
|
+
const runner_js_1 = require("../attempt/runner.js");
|
|
20
27
|
const circular_js_1 = require("../capture/circular.js");
|
|
21
28
|
const spawn_js_1 = require("../detach/spawn.js");
|
|
22
29
|
const devMode_js_1 = require("../devMode.js");
|
|
@@ -72,6 +79,28 @@ class ScopeFacade {
|
|
|
72
79
|
* tree and this stays unset; see {@link rule}.
|
|
73
80
|
*/
|
|
74
81
|
_localRule;
|
|
82
|
+
/**
|
|
83
|
+
* The run's correlation (10.1), installed by the executor's composed scope factory
|
|
84
|
+
* (`RunObservers · composeScopeFactory`) — stamped LAST on every scope and emit event this facade fires,
|
|
85
|
+
* only when present, so a run without one fires byte-identical events.
|
|
86
|
+
*/
|
|
87
|
+
_correlation;
|
|
88
|
+
/**
|
|
89
|
+
* The attempt this facade was built for (P1b) — the runner's, read off the
|
|
90
|
+
* context at construction. A facade is ONE attempt's handle: once that
|
|
91
|
+
* attempt ends without an answer (its cap, the deadline, a cancellation, a
|
|
92
|
+
* throw), the function behind it may still be running, and anything it
|
|
93
|
+
* touches through this facade is refused ({@link refuseIfAttemptEnded}) —
|
|
94
|
+
* a write or an emit is also recorded on the stage. Absent for a stage the
|
|
95
|
+
* runner does not run: nothing is fenced, as before.
|
|
96
|
+
*/
|
|
97
|
+
_attempt;
|
|
98
|
+
/** The run's signal, for `$attempt()` of a stage the runner does not run. */
|
|
99
|
+
_runSignal;
|
|
100
|
+
/** `$call`s with `of > 1` in flight through this facade — a keyless touching call inside one is refused (P3). */
|
|
101
|
+
_retryingCalls = 0;
|
|
102
|
+
/** This attempt's observed reports, grouped into series (P2) — made on the first report. */
|
|
103
|
+
_observedBook;
|
|
75
104
|
constructor(context, stageName, readOnlyValues, executionEnv) {
|
|
76
105
|
this._stageContext = context;
|
|
77
106
|
this._stageName = stageName;
|
|
@@ -80,6 +109,8 @@ class ScopeFacade {
|
|
|
80
109
|
this._executionEnv = Object.freeze({ ...executionEnv });
|
|
81
110
|
this._hasArgs = Object.keys(this._frozenArgs).length > 0;
|
|
82
111
|
this._hasEnv = Object.keys(this._executionEnv).length > 0;
|
|
112
|
+
this._attempt = context.attempt;
|
|
113
|
+
this._runSignal = context.runSignal;
|
|
83
114
|
// The context must carry the rule BEFORE the first write, since the
|
|
84
115
|
// context's write funnel is what marks a per-call redacted key on it.
|
|
85
116
|
// Under an executor the context already has the run's rule (installed on
|
|
@@ -136,6 +167,14 @@ class ScopeFacade {
|
|
|
136
167
|
useRedactionPolicy(policy) {
|
|
137
168
|
this.rule.setPolicy(policy);
|
|
138
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* Install the run's correlation — every scope and emit event this facade fires carries it; `undefined` clears
|
|
172
|
+
* it. Engine-only (the composed scope factory calls it once per stage), like `useRedactionPolicy`.
|
|
173
|
+
* @internal
|
|
174
|
+
*/
|
|
175
|
+
useCorrelation(correlation) {
|
|
176
|
+
this._correlation = correlation;
|
|
177
|
+
}
|
|
139
178
|
/** @internal */
|
|
140
179
|
getRedactionPolicy() {
|
|
141
180
|
return this.rule.getPolicy();
|
|
@@ -220,11 +259,240 @@ class ScopeFacade {
|
|
|
220
259
|
* stage the handle came from; the engine's error path attributes the throw
|
|
221
260
|
* to the stage that made the write.
|
|
222
261
|
*/
|
|
223
|
-
assertLive(key) {
|
|
262
|
+
assertLive(key, channel = 'state') {
|
|
263
|
+
this.refuseIfAttemptEnded(key, channel);
|
|
224
264
|
if (this._committed) {
|
|
225
265
|
throw new Error((0, borrowedMutation_js_1.deadFrameMessage)(this._stageName, this._stageContext.runtimeStageId, key));
|
|
226
266
|
}
|
|
227
267
|
}
|
|
268
|
+
/**
|
|
269
|
+
* The attempt fence (P1b): this facade's attempt has ended, so whatever the
|
|
270
|
+
* abandoned function does now must not reach the stage — not its buffer, its
|
|
271
|
+
* reads, its untracked sources or a recorder. Refused; a write or an emit is
|
|
272
|
+
* recorded on the stage first (`StageSnapshot.lateWrites`, the name only),
|
|
273
|
+
* a read (`channel` undefined) is not.
|
|
274
|
+
*/
|
|
275
|
+
refuseIfAttemptEnded(key, channel) {
|
|
276
|
+
const attempt = this._attempt;
|
|
277
|
+
if (attempt === undefined || !this._stageContext.hasAttemptEnded(attempt.attempt))
|
|
278
|
+
return;
|
|
279
|
+
if (channel !== undefined)
|
|
280
|
+
this._stageContext.recordLateWrite({ attempt: attempt.attempt, key, channel });
|
|
281
|
+
throw new Error((0, borrowedMutation_js_1.lateAttemptMessage)(this._stageName, attempt.series, attempt.attempt, key));
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* The attempt this stage function runs in — `scope.$attempt()` (design
|
|
285
|
+
* §3.1). Its `signal` aborts when the attempt must stop (its cap, the run's
|
|
286
|
+
* deadline, a cancellation): pass it to `fetch` and SDK calls. Its
|
|
287
|
+
* `timeLeftMs()` reads the run's deadline — time is an input the record
|
|
288
|
+
* cannot replay, so with a deadline the read marks the stage's commit
|
|
289
|
+
* `untrackedSources: ['env']`, as `getEnv()` does.
|
|
290
|
+
*
|
|
291
|
+
* A stage the attempt runner does not run (no retry policy, no `timeoutMs`,
|
|
292
|
+
* no deadline) is attempt 1 of 1, with the run's signal and `Infinity` left.
|
|
293
|
+
*
|
|
294
|
+
* ```typescript
|
|
295
|
+
* const t = scope.$attempt();
|
|
296
|
+
* const res = await fetch(url, { signal: t.signal });
|
|
297
|
+
* if (t.timeLeftMs() < 1_000) scope.summary = 'partial';
|
|
298
|
+
* ```
|
|
299
|
+
*/
|
|
300
|
+
getAttempt() {
|
|
301
|
+
const attempt = this._attempt;
|
|
302
|
+
const observed = (report) => this.recordObserved(report);
|
|
303
|
+
if (attempt === undefined) {
|
|
304
|
+
return Object.freeze({
|
|
305
|
+
series: this._stageContext.runtimeStageId,
|
|
306
|
+
attempt: 1,
|
|
307
|
+
of: 1,
|
|
308
|
+
signal: this._runSignal ?? NEVER_ABORTED,
|
|
309
|
+
timeLeftMs: () => Infinity,
|
|
310
|
+
observed,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
this.refuseIfAttemptEnded('$attempt');
|
|
314
|
+
const context = this._stageContext;
|
|
315
|
+
return Object.freeze({
|
|
316
|
+
...attempt,
|
|
317
|
+
timeLeftMs: () => {
|
|
318
|
+
// Read through a handle held past its attempt, it must not mark a LATER attempt's commit.
|
|
319
|
+
this.refuseIfAttemptEnded('$attempt');
|
|
320
|
+
if (attempt.deadline !== undefined)
|
|
321
|
+
context.markUntrackedSource('env');
|
|
322
|
+
return attempt.timeLeftMs();
|
|
323
|
+
},
|
|
324
|
+
observed,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* A call to an outside system, made inside this stage — `scope.$call(target, fn, policy?)` (design §3.6, P2).
|
|
329
|
+
* `fn` runs on the attempt runner under `policy` (none = ONE attempt, still recorded: a single call is evidence
|
|
330
|
+
* too), and every attempt is an `AttemptRecord` of kind `'call'` on this stage's execution-tree node and on
|
|
331
|
+
* `onAttempt` — its timing, outcome, failure category and the retry-or-stop decision, its error served under the
|
|
332
|
+
* run's redaction rule.
|
|
333
|
+
*
|
|
334
|
+
* The call lives within this stage attempt: it is capped by the time the attempt has left (its cap, the run's
|
|
335
|
+
* deadline) and `fn`'s `signal` aborts when the attempt does; once the attempt is over nothing of the call lands
|
|
336
|
+
* and no further attempt of it starts (`attempt/call.ts`). `target` is a NAME from code — never a value.
|
|
337
|
+
*
|
|
338
|
+
* ```typescript
|
|
339
|
+
* const quote = await scope.$call('stripe.quotes.create', (t) => stripe.quotes.create(body, { signal: t.signal }),
|
|
340
|
+
* { attempts: 3, timeoutMs: 10_000, backoffMs: (n) => 500 * n });
|
|
341
|
+
* ```
|
|
342
|
+
*
|
|
343
|
+
* A call that CHANGES an outside system declares it (P3): `options.touches` names the system and
|
|
344
|
+
* `options.idempotencyKey` the key every attempt is made under (`t.idempotencyKey`) — a value from the stage's
|
|
345
|
+
* input or state, never from model output. A touching call that may retry without a key is refused here,
|
|
346
|
+
* before anything is sent; each record says what its attempt did (`effect`), and a call that ends without an answer after any attempt left the
|
|
347
|
+
* effect unknown rejects with `UnknownEffectError` — reconcile by the key, do not retry blindly.
|
|
348
|
+
*/
|
|
349
|
+
call(target, fn, policy, options) {
|
|
350
|
+
const name = (0, name_js_1.admitAttemptName)('$call', 'target', target);
|
|
351
|
+
const where = `$call('${name}')`;
|
|
352
|
+
if (typeof fn !== 'function')
|
|
353
|
+
throw new TypeError(`${where}: fn must be a function`);
|
|
354
|
+
const admitted = (0, policy_js_1.admitCallPolicy)(where, policy);
|
|
355
|
+
const touches = (0, effect_js_1.callTouches)(where, options, admitted);
|
|
356
|
+
// A keyless touching call is sent once only if the stage attempt that makes it never runs again (P3): a stage
|
|
357
|
+
// that may retry would re-send it without a key — refused here, before anything is sent.
|
|
358
|
+
// So is one inside an enclosing `$call` that may retry (its function runs once per outer attempt).
|
|
359
|
+
if (touches !== undefined && touches.idempotencyKey === undefined) {
|
|
360
|
+
const enclosing = (this._attempt?.of ?? 1) > 1 ? 'a stage' : this._retryingCalls > 0 ? 'a $call' : undefined;
|
|
361
|
+
if (enclosing !== undefined) {
|
|
362
|
+
throw new TypeError(`${where}: touches "${touches.system}" with no idempotencyKey, inside ${enclosing} that may retry — a ` +
|
|
363
|
+
'retry would send it again without a key. Give the call a key.');
|
|
364
|
+
}
|
|
365
|
+
this._stageContext.markKeylessEffect();
|
|
366
|
+
}
|
|
367
|
+
// From an ended attempt or a committed frame: refused (and recorded by name) before anything reaches outside.
|
|
368
|
+
this.refuseLateCall(`call:${name}`);
|
|
369
|
+
const context = this._stageContext;
|
|
370
|
+
const stageAttempt = this._attempt?.attempt ?? 1;
|
|
371
|
+
const signal = this._attempt?.signal ?? this._runSignal;
|
|
372
|
+
const deadline = (0, runner_js_1.attemptEndsAt)(this._attempt);
|
|
373
|
+
const ended = context.callsEndedSignal(stageAttempt);
|
|
374
|
+
// While a call that may retry is in flight, a keyless touching call made inside it is refused (above).
|
|
375
|
+
const retrying = (0, policy_js_1.attemptCeiling)(admitted.attempts) > 1;
|
|
376
|
+
if (retrying)
|
|
377
|
+
this._retryingCalls += 1;
|
|
378
|
+
let result;
|
|
379
|
+
try {
|
|
380
|
+
result = this.startCall(name, fn, admitted, touches, stageAttempt, signal, deadline, ended);
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
if (retrying)
|
|
384
|
+
this._retryingCalls -= 1;
|
|
385
|
+
throw error;
|
|
386
|
+
}
|
|
387
|
+
if (!retrying)
|
|
388
|
+
return result;
|
|
389
|
+
const release = () => {
|
|
390
|
+
this._retryingCalls -= 1;
|
|
391
|
+
};
|
|
392
|
+
result.then(release, release);
|
|
393
|
+
return result;
|
|
394
|
+
}
|
|
395
|
+
/** `runCall` with this stage attempt as its host (`call`). */
|
|
396
|
+
startCall(name, fn, admitted, touches, stageAttempt, signal, deadline, ended) {
|
|
397
|
+
const context = this._stageContext;
|
|
398
|
+
const loop = (0, retryLoopContext_js_1.takeRetryLoopCall)(this);
|
|
399
|
+
return (0, call_js_1.runCall)(name, fn, admitted, {
|
|
400
|
+
openSeries: () => (0, call_js_1.callSeries)(context.runtimeStageId, stageAttempt, context.nextCallOrdinal(stageAttempt)),
|
|
401
|
+
...(signal !== undefined && { signal }),
|
|
402
|
+
...(deadline !== undefined && { deadline }),
|
|
403
|
+
ended,
|
|
404
|
+
...(touches !== undefined && { effect: this.callEffect(touches) }),
|
|
405
|
+
// The frame's own commit state (every attempt's facade reads the same), never a facade flag.
|
|
406
|
+
admits: (cut) => !context.committed && (cut || !(ended.aborted || this.attemptHasEnded())),
|
|
407
|
+
serve: (error) => this.rule.servedError(error),
|
|
408
|
+
report: (record, structuredError) => {
|
|
409
|
+
const served = loop ? Object.freeze({ ...record, retryLoop: loop.identity }) : record;
|
|
410
|
+
context.reportCallAttempt(served, structuredError);
|
|
411
|
+
loop?.record(served);
|
|
412
|
+
},
|
|
413
|
+
refused: () => context.recordLateWrite({ attempt: stageAttempt, key: `call:${name}`, channel: 'attempt' }),
|
|
414
|
+
observe: (report, at) => this.recordObserved(report, at.ended),
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
/** @internal The explicit retry helper owns this state; the normal write path still owns retention/commit. */
|
|
418
|
+
writeRetryLoopState(key, state) {
|
|
419
|
+
const kept = this.serveRetryLoopKey(state.idempotencyKey);
|
|
420
|
+
if (kept !== state.idempotencyKey)
|
|
421
|
+
this.rule.inheritFields(key, ['idempotencyKey']);
|
|
422
|
+
this.setValue(key, state);
|
|
423
|
+
}
|
|
424
|
+
/** @internal Exactly the existing P3 key-retention law; operational state keeps the real key. */
|
|
425
|
+
serveRetryLoopKey(key) {
|
|
426
|
+
return this.rule.retainIdempotencyKey(key, {
|
|
427
|
+
input: this._readOnlyValues,
|
|
428
|
+
selectedReads: this._stageContext.selectedReads + (this._stageContext.effectKeyTainted ? 1 : 0),
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
/** @internal Loop state is durable data: never persist the thrown value, stack, cause or payload. */
|
|
432
|
+
serveRetryLoopError(error) {
|
|
433
|
+
const served = this.rule.servedError(error);
|
|
434
|
+
return {
|
|
435
|
+
message: served.message,
|
|
436
|
+
...(served.name !== undefined ? { name: served.name } : {}),
|
|
437
|
+
...(served.code !== undefined ? { code: served.code } : {}),
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
/** A touching call's target, its key served for the records (`RedactionRule · retainIdempotencyKey`: by name and by its sources). */
|
|
441
|
+
callEffect(touches) {
|
|
442
|
+
const key = touches.idempotencyKey;
|
|
443
|
+
if (key === undefined)
|
|
444
|
+
return touches;
|
|
445
|
+
// A key the stage built after reading a selected value — or from an input holding one — is served whole.
|
|
446
|
+
const recordedKey = this.rule.retainIdempotencyKey(key, {
|
|
447
|
+
input: this._readOnlyValues,
|
|
448
|
+
// The stage's own key may be made of a selected value: a key passed on from it is served the same way.
|
|
449
|
+
selectedReads: this._stageContext.selectedReads + (this._stageContext.effectKeyTainted ? 1 : 0),
|
|
450
|
+
});
|
|
451
|
+
return { ...touches, recordedKey };
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* A `$call` from an ended attempt, or from a frame that has committed: recorded by name (`lateWrites`, channel
|
|
455
|
+
* `'attempt'`) and refused — before anything reaches outside. The P1b fence first, so its message and record are
|
|
456
|
+
* the same.
|
|
457
|
+
*/
|
|
458
|
+
refuseLateCall(key) {
|
|
459
|
+
this.refuseIfAttemptEnded(key, 'attempt');
|
|
460
|
+
if (!this._stageContext.committed && !this._committed)
|
|
461
|
+
return;
|
|
462
|
+
this._stageContext.recordLateWrite({ attempt: this._attempt?.attempt ?? 1, key, channel: 'attempt' });
|
|
463
|
+
throw new Error((0, borrowedMutation_js_1.deadFrameMessage)(this._stageName, this._stageContext.runtimeStageId, key));
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* An outside attempt an adapter reported — `AttemptContext.observed` on this stage's attempt or on one of its
|
|
467
|
+
* calls' (P2). Read and validated first (a malformed report is the adapter's bug: a `TypeError`, and it never
|
|
468
|
+
* reaches the record). A report that comes after its attempt ended — the call attempt it was made through, this
|
|
469
|
+
* stage attempt, or the frame's commit — is recorded by name (`lateWrites`, channel `'attempt'`) and DROPPED,
|
|
470
|
+
* never thrown: adapters report from an SDK's own callbacks, which may fire after the stage moved on, and an
|
|
471
|
+
* observed attempt never changes control flow — in either direction. Its series opens at this stage attempt's call
|
|
472
|
+
* level: an SDK's call is a call the stage attempt made, so a report made through a `$call` is that call's sibling.
|
|
473
|
+
*/
|
|
474
|
+
recordObserved(report, callAttemptEnded = false) {
|
|
475
|
+
const read = (0, observed_js_1.readObservedReport)(report);
|
|
476
|
+
const key = `observed:${read.target}`;
|
|
477
|
+
const context = this._stageContext;
|
|
478
|
+
const stageAttempt = this._attempt?.attempt ?? 1;
|
|
479
|
+
if (callAttemptEnded || this.attemptHasEnded() || context.committed || this._committed) {
|
|
480
|
+
context.recordLateWrite({ attempt: stageAttempt, key, channel: 'attempt' });
|
|
481
|
+
return;
|
|
482
|
+
}
|
|
483
|
+
const book = (this._observedBook ??= new observed_js_1.ObservedSeriesBook(() => (0, call_js_1.callSeries)(context.runtimeStageId, stageAttempt, context.nextCallOrdinal(stageAttempt))));
|
|
484
|
+
const { record, structuredError } = (0, observed_js_1.observedRecord)(read, {
|
|
485
|
+
series: book.seriesFor(read),
|
|
486
|
+
now: Date.now,
|
|
487
|
+
serve: (error) => this.rule.servedError(error),
|
|
488
|
+
});
|
|
489
|
+
context.reportCallAttempt(record, structuredError);
|
|
490
|
+
}
|
|
491
|
+
/** This facade's attempt has ended — the P1b fence is closed. */
|
|
492
|
+
attemptHasEnded() {
|
|
493
|
+
const attempt = this._attempt;
|
|
494
|
+
return attempt !== undefined && this._stageContext.hasAttemptEnded(attempt.attempt);
|
|
495
|
+
}
|
|
228
496
|
/** Called by StageContext.commit() observer. Converts tracked writes to CommitEvent format.
|
|
229
497
|
* Errors are caught to prevent recorder issues from aborting the traversal. */
|
|
230
498
|
_onCommitFired(mutations) {
|
|
@@ -255,22 +523,27 @@ class ScopeFacade {
|
|
|
255
523
|
// attached `EmitRecorder` sees them in real time — closing the
|
|
256
524
|
// long-standing gap where `$debug`/`$metric` went to unobserved bags.
|
|
257
525
|
addDebugInfo(key, value) {
|
|
526
|
+
this.refuseIfAttemptEnded(`log.debug.${key}`, 'emit');
|
|
258
527
|
const kept = this._stageContext.addDiagnostic('logs', key, value);
|
|
259
528
|
this.emitEvent(`log.debug.${key}`, { key, value: kept, level: 'debug' });
|
|
260
529
|
}
|
|
261
530
|
addDebugMessage(value) {
|
|
531
|
+
this.refuseIfAttemptEnded('log.debug.messages', 'emit');
|
|
262
532
|
const kept = this._stageContext.addDiagnostic('logs', 'messages', [value]);
|
|
263
533
|
this.emitEvent('log.debug.messages', { value: Array.isArray(kept) ? kept[0] : kept, level: 'debug' });
|
|
264
534
|
}
|
|
265
535
|
addErrorInfo(key, value) {
|
|
536
|
+
this.refuseIfAttemptEnded(`log.error.${key}`, 'emit');
|
|
266
537
|
const kept = this._stageContext.addDiagnostic('errors', key, value);
|
|
267
538
|
this.emitEvent(`log.error.${key}`, { key, value: kept, level: 'error' });
|
|
268
539
|
}
|
|
269
540
|
addMetric(metricName, value) {
|
|
541
|
+
this.refuseIfAttemptEnded(`metric.${metricName}`, 'emit');
|
|
270
542
|
const kept = this._stageContext.addDiagnostic('metrics', metricName, value);
|
|
271
543
|
this.emitEvent(`metric.${metricName}`, { name: metricName, value: kept });
|
|
272
544
|
}
|
|
273
545
|
addEval(metricName, value) {
|
|
546
|
+
this.refuseIfAttemptEnded(`eval.${metricName}`, 'emit');
|
|
274
547
|
const kept = this._stageContext.addDiagnostic('evals', metricName, value);
|
|
275
548
|
this.emitEvent(`eval.${metricName}`, { name: metricName, value: kept });
|
|
276
549
|
}
|
|
@@ -294,6 +567,9 @@ class ScopeFacade {
|
|
|
294
567
|
* the method routes here via `createTypedScope`.
|
|
295
568
|
*/
|
|
296
569
|
emitEvent(name, payload) {
|
|
570
|
+
// An ended attempt emits nothing — refused (and recorded) before the fast path, so the record does not depend
|
|
571
|
+
// on whether a recorder happened to be attached.
|
|
572
|
+
this.refuseIfAttemptEnded(name, 'emit');
|
|
297
573
|
// Fast-path: zero work when no recorders are attached.
|
|
298
574
|
if (this._recorders.length === 0)
|
|
299
575
|
return;
|
|
@@ -318,7 +594,7 @@ class ScopeFacade {
|
|
|
318
594
|
// Dispatch with error isolation — the same `fire` loop and the same failure routing as
|
|
319
595
|
// every other scope event: a throwing recorder's error reaches onError on the recorders;
|
|
320
596
|
// the emit loop continues unaffected.
|
|
321
|
-
(0, hooks_js_1.fire)(this._recorders, 'onEmit', event, this._routeFailure);
|
|
597
|
+
(0, hooks_js_1.fire)(this._recorders, 'onEmit', this._correlated(event), this._routeFailure);
|
|
322
598
|
}
|
|
323
599
|
// ── Detach — fire-and-forget child flowchart execution ─────────────────
|
|
324
600
|
//
|
|
@@ -328,10 +604,12 @@ class ScopeFacade {
|
|
|
328
604
|
// and `scope.$detachAndForget(...)`.
|
|
329
605
|
/** See `ScopeMethods.$detachAndJoinLater`. */
|
|
330
606
|
detachAndJoinLater(driver, child, input) {
|
|
607
|
+
this.refuseIfAttemptEnded(detachKey(child), 'detach');
|
|
331
608
|
return (0, spawn_js_1.detachAndJoinLater)(driver, child, input, this._stageContext.runtimeStageId);
|
|
332
609
|
}
|
|
333
610
|
/** See `ScopeMethods.$detachAndForget`. */
|
|
334
611
|
detachAndForget(driver, child, input) {
|
|
612
|
+
this.refuseIfAttemptEnded(detachKey(child), 'detach');
|
|
335
613
|
(0, spawn_js_1.detachAndForget)(driver, child, input, this._stageContext.runtimeStageId);
|
|
336
614
|
}
|
|
337
615
|
/**
|
|
@@ -361,6 +639,7 @@ class ScopeFacade {
|
|
|
361
639
|
// ── Non-Tracking State Inspection (for TypedScope proxy internals) ──────
|
|
362
640
|
/** Returns all state keys without firing onRead. Used by TypedScope ownKeys/has traps. */
|
|
363
641
|
getStateKeys() {
|
|
642
|
+
this.refuseIfAttemptEnded('*');
|
|
364
643
|
const snapshot = this._stageContext.getValue([], undefined);
|
|
365
644
|
if (!snapshot || typeof snapshot !== 'object')
|
|
366
645
|
return [];
|
|
@@ -370,6 +649,7 @@ class ScopeFacade {
|
|
|
370
649
|
* Contract: returns false for keys never set OR keys set to undefined.
|
|
371
650
|
* This matches deleteValue() semantics (sets to undefined = deleted). */
|
|
372
651
|
hasKey(key) {
|
|
652
|
+
this.refuseIfAttemptEnded(key);
|
|
373
653
|
return this._stageContext.getValue([], key) !== undefined;
|
|
374
654
|
}
|
|
375
655
|
/** Read state without firing onRead. Used by array proxy getCurrent() to avoid
|
|
@@ -387,6 +667,7 @@ class ScopeFacade {
|
|
|
387
667
|
* array-proxy pattern above) are not flagged: their edge is captured. A
|
|
388
668
|
* whole-state silent read (no key) is always flagged. */
|
|
389
669
|
getValueSilent(key) {
|
|
670
|
+
this.refuseIfAttemptEnded(key ?? '*');
|
|
390
671
|
if (key === undefined || !this._trackedReadKeys.has(key)) {
|
|
391
672
|
this._stageContext.markUntrackedSource('silent');
|
|
392
673
|
}
|
|
@@ -428,6 +709,7 @@ class ScopeFacade {
|
|
|
428
709
|
* a literal top-level `'user.ssn'` produce the same event key (same for the writes below).
|
|
429
710
|
*/
|
|
430
711
|
getValueAt(path, key) {
|
|
712
|
+
this.refuseIfAttemptEnded(key === undefined ? path.join('.') || '*' : [...path, key].join('.'));
|
|
431
713
|
const value = this._stageContext.getValue(path, key);
|
|
432
714
|
// RFC-003 D2: remember tracked keys so later SILENT reads of the same
|
|
433
715
|
// key count as shadowed (edge already captured) instead of untracked.
|
|
@@ -578,6 +860,7 @@ class ScopeFacade {
|
|
|
578
860
|
* here. An empty-args read carries no information and is not flagged.
|
|
579
861
|
*/
|
|
580
862
|
getArgs() {
|
|
863
|
+
this.refuseIfAttemptEnded('$args');
|
|
581
864
|
if (this._hasArgs)
|
|
582
865
|
this._stageContext.markUntrackedSource('args');
|
|
583
866
|
return this._frozenArgs;
|
|
@@ -586,8 +869,10 @@ class ScopeFacade {
|
|
|
586
869
|
* Returns the execution environment — read-only infrastructure values
|
|
587
870
|
* that propagate through nested executors (like `process.env` for flowcharts).
|
|
588
871
|
*
|
|
589
|
-
* Contains: signal (abort), timeoutMs, traceId
|
|
590
|
-
*
|
|
872
|
+
* Contains: signal (abort — the run's one effective signal), timeoutMs, traceId, operationId, traceparent,
|
|
873
|
+
* deadline (epoch ms) — the run's env as admitted (`attempt/correlation.ts · admitRunEnv`: one own-field
|
|
874
|
+
* snapshot; `traceparent` is the canonical header the run's correlation carries, never the received bytes), then
|
|
875
|
+
* armed (`runner/deadline.ts · armRun`). Frozen at construction time. Inherited by subflows automatically.
|
|
591
876
|
*
|
|
592
877
|
* ```typescript
|
|
593
878
|
* const { signal, traceId } = scope.getEnv();
|
|
@@ -598,6 +883,7 @@ class ScopeFacade {
|
|
|
598
883
|
* `untrackedSources: ['env']` — see {@link getArgs}.
|
|
599
884
|
*/
|
|
600
885
|
getEnv() {
|
|
886
|
+
this.refuseIfAttemptEnded('$env');
|
|
601
887
|
if (this._hasEnv)
|
|
602
888
|
this._stageContext.markUntrackedSource('env');
|
|
603
889
|
return this._executionEnv;
|
|
@@ -610,7 +896,11 @@ class ScopeFacade {
|
|
|
610
896
|
_invokeHook(hook, event) {
|
|
611
897
|
// The one per-recorder loop (`recorder/hooks.ts · fire`) — the SAME invoke primitive the
|
|
612
898
|
// deferred tier uses at delivery time, so the inline and deferred paths cannot drift.
|
|
613
|
-
(0, hooks_js_1.fire)(this._recorders, hook, event, this._routeFailure);
|
|
899
|
+
(0, hooks_js_1.fire)(this._recorders, hook, this._correlated(event), this._routeFailure);
|
|
900
|
+
}
|
|
901
|
+
/** The event as fired: unchanged without a correlation, else with the run's correlation as its last key. */
|
|
902
|
+
_correlated(event) {
|
|
903
|
+
return this._correlation === undefined ? event : { ...event, correlation: this._correlation };
|
|
614
904
|
}
|
|
615
905
|
/**
|
|
616
906
|
* The scope channel's isolation: a recorder's throw becomes an `onError` on every recorder
|
|
@@ -628,4 +918,11 @@ class ScopeFacade {
|
|
|
628
918
|
};
|
|
629
919
|
}
|
|
630
920
|
exports.ScopeFacade = ScopeFacade;
|
|
631
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NvcGVGYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL1Njb3BlRmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBRUgseUNBQThDO0FBRTlDLHdEQUE4RDtBQUM5RCxpREFHNEI7QUFDNUIsOENBQTBDO0FBRTFDLHVFQUFpRTtBQUNqRSx5REFBOEQ7QUFHOUQsbURBQWtFO0FBQ2xFLG9FQUFvRjtBQUNwRiw2Q0FBb0Q7QUFHcEQsTUFBYSxXQUFXO0lBQ2YsTUFBTSxDQUFVLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFFNUQ7Ozs7T0FJRztJQUNLLE1BQU0sQ0FBVSxtQkFBbUIsR0FBc0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUV6RSxhQUFhLENBQWU7SUFDNUIsVUFBVSxDQUFTO0lBQ1YsZUFBZSxDQUFXO0lBRTdDLCtFQUErRTtJQUM5RCxXQUFXLENBQTBCO0lBRXRELHlFQUF5RTtJQUN4RCxhQUFhLENBQXlCO0lBRXZEO29FQUNnRTtJQUMvQyxRQUFRLENBQVU7SUFFbkMsK0RBQStEO0lBQzlDLE9BQU8sQ0FBVTtJQUVsQzs7Ozs7O09BTUc7SUFDYyxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRTlDLFVBQVUsR0FBb0IsRUFBRSxDQUFDO0lBRXpDOzs7Ozs7Ozs7O09BVUc7SUFDSyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBRTNCOzs7O09BSUc7SUFDSyxVQUFVLENBQWlCO0lBRW5DLFlBQVksT0FBcUIsRUFBRSxTQUFpQixFQUFFLGNBQXdCLEVBQUUsWUFBMkI7UUFDekcsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFBLG1DQUFnQixFQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzFELG9FQUFvRTtRQUNwRSxzRUFBc0U7UUFDdEUseUVBQXlFO1FBQ3pFLHVFQUF1RTtRQUN2RSx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0MsbUdBQW1HO1FBQ25HLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBQSxpQ0FBb0IsRUFBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsSUFBWSxJQUFJO1FBQ2QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JELElBQUksTUFBTTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLDRCQUFhLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxxQkFBcUIsQ0FBQyxTQUFzQjtRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGtCQUFrQixDQUFDLE1BQXVCO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsaUZBQWlGO0lBRWpGLG1CQUFtQixDQUFDLFFBQXVCO1FBQ3pDLGlGQUFpRjtRQUNqRixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsbUJBQW1CLENBQUMsVUFBa0I7UUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUU7WUFDL0IsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87WUFDbkMsY0FBYyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYztZQUNqRCxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLO1lBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1NBQ3RCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsY0FBYyxDQUFDLFFBQWlCO1FBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFO1lBQzdCLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPO1lBQ25DLGNBQWMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWM7WUFDakQsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSztZQUNwQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyQixRQUFRO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixXQUFXLENBQUMsU0FBbUI7UUFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUU7WUFDMUIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87WUFDbkMsY0FBYyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYztZQUNqRCxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLO1lBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JCLFNBQVM7WUFDVCxPQUFPLEVBQUUsT0FBZ0I7U0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixZQUFZLENBQUMsUUFBaUI7UUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUU7WUFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87WUFDbkMsY0FBYyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYztZQUNqRCxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLO1lBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JCLFFBQVE7WUFDUixPQUFPLEVBQUUsT0FBZ0I7U0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixZQUFZLENBQUMsU0FBbUM7UUFDOUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUU7WUFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87WUFDbkMsY0FBYyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYztZQUNqRCxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLO1lBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JCLFNBQVM7U0FDVixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFVBQVUsQ0FBQyxHQUFXO1FBQzVCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBQSxzQ0FBZ0IsRUFBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDN0YsQ0FBQztJQUNILENBQUM7SUFFRDtvRkFDZ0Y7SUFDeEUsY0FBYyxDQUFDLFNBQXFGO1FBQzFHLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFFekMsSUFBSSxDQUFDO1lBQ0gsc0VBQXNFO1lBQ3RFLHNFQUFzRTtZQUN0RSxrRUFBa0U7WUFDbEUsTUFBTSxlQUFlLEdBQTZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2pHLEdBQUc7Z0JBQ0gsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQztnQkFDM0MsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2FBQzNCLENBQUMsQ0FBQyxDQUFDO1lBRUosSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsMERBQTBEO1lBQzFELGtFQUFrRTtRQUNwRSxDQUFDO0lBQ0gsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSxFQUFFO0lBQ0Ysb0VBQW9FO0lBQ3BFLDBFQUEwRTtJQUMxRSxxRUFBcUU7SUFDckUsK0RBQStEO0lBQy9ELHNFQUFzRTtJQUV0RSxZQUFZLENBQUMsR0FBVyxFQUFFLEtBQWM7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWM7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN4RyxDQUFDO0lBRUQsWUFBWSxDQUFDLEdBQVcsRUFBRSxLQUFjO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELFNBQVMsQ0FBQyxVQUFrQixFQUFFLEtBQWM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsVUFBVSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxPQUFPLENBQUMsVUFBa0IsRUFBRSxLQUFjO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLFVBQVUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsNEVBQTRFO0lBRTVFOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNILFNBQVMsQ0FBQyxJQUFZLEVBQUUsT0FBZ0I7UUFDdEMsdURBQXVEO1FBQ3ZELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU87UUFFekMsd0VBQXdFO1FBQ3hFLG1FQUFtRTtRQUNuRSw2REFBNkQ7UUFDN0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3pELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUVoRSxnRUFBZ0U7UUFDaEUsbUVBQW1FO1FBQ25FLHNFQUFzRTtRQUN0RSxNQUFNLEtBQUssR0FBRztZQUNaLElBQUk7WUFDSixPQUFPLEVBQUUsWUFBWTtZQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDMUIsY0FBYyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYztZQUNqRCxXQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNuQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLO1lBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JCLEdBQUcsQ0FBQyxjQUFjLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUM7U0FDbkQsQ0FBQztRQUVYLHVGQUF1RjtRQUN2Rix5RkFBeUY7UUFDekYsc0NBQXNDO1FBQ3RDLElBQUEsZUFBSSxFQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELDBFQUEwRTtJQUMxRSxFQUFFO0lBQ0YscUVBQXFFO0lBQ3JFLG9FQUFvRTtJQUNwRSx3RUFBd0U7SUFDeEUscUNBQXFDO0lBRXJDLDhDQUE4QztJQUM5QyxrQkFBa0IsQ0FDaEIsTUFBaUQsRUFDakQsS0FBOEMsRUFDOUMsS0FBZTtRQUVmLE9BQU8sSUFBQSw2QkFBdUIsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFRCwyQ0FBMkM7SUFDM0MsZUFBZSxDQUNiLE1BQWlELEVBQ2pELEtBQThDLEVBQzlDLEtBQWU7UUFFZixJQUFBLDBCQUFvQixFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSyxlQUFlO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDO1FBQy9DLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxXQUFXLENBQUMsbUJBQW1CLENBQUM7UUFDbEQsNEVBQTRFO1FBQzVFLE1BQU0sUUFBUSxHQUFHLElBQUEsNkJBQWlCLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQztRQUNsRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELDJFQUEyRTtJQUUzRSwwRkFBMEY7SUFDMUYsWUFBWTtRQUNWLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVE7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN6RCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBbUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7OEVBRTBFO0lBQzFFLE1BQU0sQ0FBQyxHQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxLQUFLLFNBQVMsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7OERBYTBEO0lBQzFELGNBQWMsQ0FBQyxHQUFZO1FBQ3pCLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsNEVBQTRFO0lBRTVFLGtCQUFrQixDQUFDLEdBQVc7UUFDNUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXNCRztJQUNILFFBQVEsQ0FBQyxHQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsSUFBYyxFQUFFLEdBQVk7UUFDckMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXJELHNFQUFzRTtRQUN0RSxzRUFBc0U7UUFDdEUsMEVBQTBFO1FBQzFFLHlFQUF5RTtRQUN6RSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUN0RSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEdBQUcsS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQztRQUVyRixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9CLHVFQUF1RTtZQUN2RSwrREFBK0Q7WUFDL0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLFNBQVMsQ0FBQztZQUMxRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLG9CQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDbEgsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsNEJBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3ZHLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRWpHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFO2dCQUN6QixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQzFCLE9BQU8sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87Z0JBQ25DLGNBQWMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWM7Z0JBQ2pELFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUs7Z0JBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUNyQixHQUFHLEVBQUUsUUFBUTtnQkFDYixLQUFLLEVBQUUsYUFBYTtnQkFDcEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLFNBQVM7YUFDaEQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFFBQVEsQ0FBQyxHQUFXLEVBQUUsS0FBYyxFQUFFLFlBQXNCLEVBQUUsV0FBb0I7UUFDaEYsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQseUZBQXlGO0lBQ3pGLFVBQVUsQ0FBQyxJQUFjLEVBQUUsR0FBVyxFQUFFLEtBQWMsRUFBRSxZQUFzQixFQUFFLFdBQW9CO1FBQ2xHLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BFLElBQUEsb0NBQWlCLEVBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFMUIsNERBQTREO1FBQzVELDhFQUE4RTtRQUM5RSxxRUFBcUU7UUFDckUsdUVBQXVFO1FBQ3ZFLElBQUksSUFBQSxzQkFBUyxHQUFFLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvRCxJQUFJLElBQUEsa0NBQW9CLEVBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsc0NBQXNDO2dCQUN0QyxPQUFPLENBQUMsSUFBSSxDQUNWLHdEQUF3RCxRQUFRLE1BQU07b0JBQ3BFLGdFQUFnRTtvQkFDaEUseUNBQXlDLENBQzVDLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELHdFQUF3RTtRQUN4RSxzRUFBc0U7UUFDdEUseUVBQXlFO1FBQ3pFLDZEQUE2RDtRQUM3RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFMUYsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRTtnQkFDMUIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPO2dCQUNuQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjO2dCQUNqRCxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLO2dCQUNwQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDckIsR0FBRyxFQUFFLFFBQVE7Z0JBQ2IsS0FBSyxFQUFFLDRCQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7Z0JBQzFDLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksU0FBUzthQUNoRCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFXLEVBQUUsS0FBYyxFQUFFLFdBQW9CO1FBQzNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLGFBQWEsQ0FBQyxJQUFjLEVBQUUsR0FBVyxFQUFFLEtBQWMsRUFBRSxXQUFvQjtRQUM3RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRSxJQUFBLG9DQUFpQixFQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTFCLGdGQUFnRjtRQUNoRixJQUFJLElBQUEsc0JBQVMsR0FBRSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDL0QsSUFBSSxJQUFBLGtDQUFvQixFQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLHNDQUFzQztnQkFDdEMsT0FBTyxDQUFDLElBQUksQ0FDViwyREFBMkQsUUFBUSxNQUFNO29CQUN2RSx5Q0FBeUMsQ0FDNUMsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFL0UsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRTtnQkFDMUIsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPO2dCQUNuQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjO2dCQUNqRCxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLO2dCQUNwQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDckIsR0FBRyxFQUFFLFFBQVE7Z0JBQ2IsS0FBSyxFQUFFLDRCQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUM7Z0JBQzFDLFNBQVMsRUFBRSxRQUFRO2dCQUNuQixRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksU0FBUzthQUNoRCxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFXLEVBQUUsV0FBb0I7UUFDM0MsSUFBQSxvQ0FBaUIsRUFBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXJCLG1FQUFtRTtRQUNuRSwyREFBMkQ7UUFDM0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFdBQVcsSUFBSSxXQUFXLEdBQUcsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRW5HLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUU7Z0JBQzFCLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDMUIsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTztnQkFDbkMsY0FBYyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYztnQkFDakQsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSztnQkFDcEMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3JCLEdBQUc7Z0JBQ0gsS0FBSyxFQUFFLFNBQVM7Z0JBQ2hCLFNBQVMsRUFBRSxRQUFRO2FBQ3BCLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQVMsQ0FBQyxHQUFXLEVBQUUsS0FBYyxFQUFFLFdBQW9CO1FBQ3pELElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixTQUFTLENBQUMsR0FBVztRQUNuQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixlQUFlLENBQUMsR0FBVyxFQUFFLEtBQWM7UUFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCw0RUFBNEU7SUFFNUU7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsT0FBTztRQUNMLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLFdBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0gsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFFRCw0RUFBNEU7SUFFcEUsV0FBVyxDQUEwQixJQUFPLEVBQUUsS0FBcUI7UUFDekUseUZBQXlGO1FBQ3pGLHNGQUFzRjtRQUN0RixJQUFBLGVBQUksRUFBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7O09BR0c7SUFDYyxhQUFhLEdBQWdCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUN2RSxJQUFJLElBQUksS0FBSyxTQUFTO1lBQUUsT0FBTztRQUMvQixJQUFJLENBQUMsV0FBVyxDQUNkLFNBQVMsRUFDVCxJQUFBLCtCQUFvQixFQUNsQjtZQUNFLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMxQixPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPO1lBQ25DLGNBQWMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWM7WUFDakQsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSztTQUNyQyxFQUNELEtBQUssRUFDTCxJQUFJLENBQ0wsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDOztBQWhyQkosa0NBaXJCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2NvcGVGYWNhZGUg4oCUIEJhc2UgY2xhc3MgdGhhdCBsaWJyYXJ5IGNvbnN1bWVycyBleHRlbmQgdG8gY3JlYXRlIGN1c3RvbSBzY29wZSBjbGFzc2VzXG4gKlxuICogV3JhcHMgU3RhZ2VDb250ZXh0IChmcm9tIG1lbW9yeS8pIHRvIHByb3ZpZGUgYSBjb25zdW1lci1mcmllbmRseSBBUEkgZm9yXG4gKiBzdGF0ZSBhY2Nlc3MsIGRlYnVnIGxvZ2dpbmcsIG1ldHJpY3MsIGFuZCByZWNvcmRlciBob29rcy5cbiAqXG4gKiBDb25zdW1lcnMgZXh0ZW5kIHRoaXMgY2xhc3MgdG8gYWRkIGRvbWFpbi1zcGVjaWZpYyBwcm9wZXJ0aWVzOlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIE15U2NvcGUgZXh0ZW5kcyBTY29wZUZhY2FkZSB7XG4gKiAgIGdldCB1c2VyTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRWYWx1ZSgnbmFtZScpIGFzIHN0cmluZzsgfVxuICogICBzZXQgdXNlck5hbWUodmFsdWU6IHN0cmluZykgeyB0aGlzLnNldFZhbHVlKCduYW1lJywgdmFsdWUpOyB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBzdWJmbG93U2VnbWVudHNPZiB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB7IGhhc0NpcmN1bGFyUmVmZXJlbmNlIH0gZnJvbSAnLi4vY2FwdHVyZS9jaXJjdWxhci5qcyc7XG5pbXBvcnQge1xuICBkZXRhY2hBbmRGb3JnZXQgYXMgZGV0YWNoQW5kRm9yZ2V0U3Bhd24sXG4gIGRldGFjaEFuZEpvaW5MYXRlciBhcyBkZXRhY2hBbmRKb2luTGF0ZXJTcGF3bixcbn0gZnJvbSAnLi4vZGV0YWNoL3NwYXduLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25FbnYgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVhZEZyYW1lTWVzc2FnZSB9IGZyb20gJy4uL21lbW9yeS9ib3Jyb3dlZE11dGF0aW9uLmpzJztcbmltcG9ydCB7IENMRUFSLCBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi4vbWVtb3J5L3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBTdGFnZUNvbnRleHQgfSBmcm9tICcuLi9tZW1vcnkvU3RhZ2VDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgSG9va0ZhaWx1cmUsIEhvb2tQYXlsb2FkLCBTY29wZUhvb2tOYW1lIH0gZnJvbSAnLi4vcmVjb3JkZXIvaG9va3MuanMnO1xuaW1wb3J0IHsgZmlyZSwgcmVjb3JkZXJGYWlsdXJlRXZlbnQgfSBmcm9tICcuLi9yZWNvcmRlci9ob29rcy5qcyc7XG5pbXBvcnQgeyBhc3NlcnROb3RSZWFkb25seSwgY3JlYXRlRnJvemVuQXJncyB9IGZyb20gJy4vcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LmpzJztcbmltcG9ydCB7IHJlZ2lzdGVyU2NvcGVSdW50aW1lIH0gZnJvbSAnLi9ydW50aW1lLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0RXZlbnQsIFJlZGFjdGlvblBvbGljeSwgUmVkYWN0aW9uUmVwb3J0LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBTY29wZUZhY2FkZSB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQlJBTkQgPSBTeW1ib2wuZm9yKCdTY29wZUZhY2FkZUB2MScpO1xuXG4gIC8qKlxuICAgKiBTaGFyZWQgc2VudGluZWwgcmV0dXJuZWQgYnkgYF9nZXRTdWJmbG93UGF0aCgpYCBmb3Igcm9vdC1sZXZlbCBzdGFnZXNcbiAgICogKG5vIHN1YmZsb3cgbmVzdGluZykuIEF2b2lkcyBwZXItY2FsbCBhbGxvY2F0aW9uIG9mIGEgZnJlc2hcbiAgICogYE9iamVjdC5mcmVlemUoW10pYCBvbiBldmVyeSBgZW1pdEV2ZW50YCBpbiB0aGUgY29tbW9uIG5vLXN1YmZsb3cgY2FzZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IF9FTVBUWV9TVUJGTE9XX1BBVEg6IHJlYWRvbmx5IHN0cmluZ1tdID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbiAgcHJvdGVjdGVkIF9zdGFnZUNvbnRleHQ6IFN0YWdlQ29udGV4dDtcbiAgcHJvdGVjdGVkIF9zdGFnZU5hbWU6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9yZWFkT25seVZhbHVlcz86IHVua25vd247XG5cbiAgLyoqIENhY2hlZCBkZWVwbHktZnJvemVuIGNvcHkgb2YgcmVhZE9ubHlWYWx1ZXMgZm9yIGdldEFyZ3MoKS4gQ3JlYXRlZCBvbmNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9mcm96ZW5BcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKiogRXhlY3V0aW9uIGVudmlyb25tZW50IOKAlCByZWFkLW9ubHksIGluaGVyaXRlZCBmcm9tIHBhcmVudCBleGVjdXRvci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZXhlY3V0aW9uRW52OiBSZWFkb25seTxFeGVjdXRpb25FbnY+O1xuXG4gIC8qKiBSRkMtMDAzIEQyOiB0cnVlIHdoZW4gYGdldEFyZ3MoKWAgY2FuIHJldHVybiBhY3R1YWwgZGF0YSDigJQgYW4gZW1wdHlcbiAgICogIGB7fWAgcmVhZCBjYXJyaWVzIG5vIGluZm9ybWF0aW9uLCBzbyBpdCBpcyBuZXZlciBmbGFnZ2VkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9oYXNBcmdzOiBib29sZWFuO1xuXG4gIC8qKiBSRkMtMDAzIEQyOiB0cnVlIHdoZW4gYGdldEVudigpYCBjYW4gcmV0dXJuIGFjdHVhbCBkYXRhLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9oYXNFbnY6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDI6IGtleXMgdGhpcyBzdGFnZSBoYXMgVFJBQ0tFRC1yZWFkICh2aWEgYGdldFZhbHVlKGtleSlgKS5cbiAgICogQSBzaWxlbnQgcmVhZCBvZiBhIGtleSBpbiB0aGlzIHNldCBpcyBTSEFET1dFRCDigJQgaXRzIHJlYWTihpJ3cml0ZSBlZGdlIGlzXG4gICAqIGFscmVhZHkgY2FwdHVyZWQsIHNvIGl0IGlzIG5vdCBmbGFnZ2VkIGFzIGFuIHVudHJhY2tlZCBzb3VyY2UuIFRoaXMgaXNcbiAgICogd2hhdCBrZWVwcyBUeXBlZFNjb3BlIGFycmF5LXByb3h5IGludGVybmFscyAod2hpY2ggYWx3YXlzIGZvbGxvdyBhXG4gICAqIHRyYWNrZWQgcHJvcGVydHkgcmVhZCkgYW5kIGAkYmF0Y2hBcnJheWAgaG9uZXN0LWJ1dC1xdWlldC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RyYWNrZWRSZWFkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgX3JlY29yZGVyczogU2NvcGVSZWNvcmRlcltdID0gW107XG5cbiAgLyoqXG4gICAqIFNldCBieSB0aGUgY29tbWl0IG9ic2VydmVyOiB0aGlzIHN0YWdlJ3MgZnJhbWUgaGFzIGZsdXNoZWQuIEEgZmFjYWRlIGlzXG4gICAqIE9ORSBzdGFnZSBleGVjdXRpb24ncyBoYW5kbGUg4oCUIHRoZSBlbmdpbmUgYnVpbGRzIGEgZnJlc2ggb25lIHBlciBzdGFnZSDigJRcbiAgICogYW5kIGV2ZXJ5IHByb3h5IHRoZSB0eXBlZCBzY29wZSBoYW5kcyBvdXQgaXMgYm91bmQgdG8gaXQuIEEgd3JpdGUgYXJyaXZpbmdcbiAgICogYWZ0ZXIgdGhlIGNvbW1pdCBjb21lcyBmcm9tIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgKGEgY2xvc3VyZSwgYVxuICAgKiBtb2R1bGUtbGV2ZWwgYGxldGApIGFuZCB3b3VsZCBsYW5kIGluIGEgYnVmZmVyIG5vdGhpbmcgZXZlciBjb21taXRzOiBub1xuICAgKiB0cmFjZSByb3csIHN0YXRlIHVuY2hhbmdlZC4gU28gaXQgaXMgcmVmdXNlZCAoe0BsaW5rIGFzc2VydExpdmV9KSBpbnN0ZWFkXG4gICAqIG9mIGxvc3QuIFNlYWxpbmcgaGVyZSBhbmQgbm90IG9uIGBTdGFnZUNvbnRleHRgIGlzIGRlbGliZXJhdGU6IHRoZSBmcmFtZVxuICAgKiBzdGF5cyByZS11c2FibGUgYWZ0ZXIgY29tbWl0IGJ5IGRlc2lnbiAoIzEzYiDigJQgdGhlIGVuZ2luZSdzIGRvdWJsZS1jb21taXRcbiAgICogcGF0aHMgYW5kIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGJyYW5jaCBwYXJlbnQgbmVlZCBpdCkuXG4gICAqL1xuICBwcml2YXRlIF9jb21taXR0ZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogQSBydWxlIG9mIHRoaXMgZmFjYWRlJ3Mgb3duIOKAlCBPTkxZIHdoZW4gaXRzIGNvbnRleHQgY2FycmllcyBub25lIChiYXJlXG4gICAqIGNvbnRleHRzIGluIHVuaXQgdGVzdHMpLiBVbmRlciBhbiBleGVjdXRvciB0aGUgcnVsZSBsaXZlcyBvbiB0aGUgY29udGV4dFxuICAgKiB0cmVlIGFuZCB0aGlzIHN0YXlzIHVuc2V0OyBzZWUge0BsaW5rIHJ1bGV9LlxuICAgKi9cbiAgcHJpdmF0ZSBfbG9jYWxSdWxlPzogUmVkYWN0aW9uUnVsZTtcblxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBTdGFnZUNvbnRleHQsIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seVZhbHVlcz86IHVua25vd24sIGV4ZWN1dGlvbkVudj86IEV4ZWN1dGlvbkVudikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5fc3RhZ2VOYW1lID0gc3RhZ2VOYW1lO1xuICAgIHRoaXMuX3JlYWRPbmx5VmFsdWVzID0gcmVhZE9ubHlWYWx1ZXM7XG4gICAgdGhpcy5fZnJvemVuQXJncyA9IGNyZWF0ZUZyb3plbkFyZ3MocmVhZE9ubHlWYWx1ZXMpO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkVudiA9IE9iamVjdC5mcmVlemUoeyAuLi5leGVjdXRpb25FbnYgfSk7XG4gICAgdGhpcy5faGFzQXJncyA9IE9iamVjdC5rZXlzKHRoaXMuX2Zyb3plbkFyZ3MpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy5faGFzRW52ID0gT2JqZWN0LmtleXModGhpcy5fZXhlY3V0aW9uRW52KS5sZW5ndGggPiAwO1xuICAgIC8vIFRoZSBjb250ZXh0IG11c3QgY2FycnkgdGhlIHJ1bGUgQkVGT1JFIHRoZSBmaXJzdCB3cml0ZSwgc2luY2UgdGhlXG4gICAgLy8gY29udGV4dCdzIHdyaXRlIGZ1bm5lbCBpcyB3aGF0IG1hcmtzIGEgcGVyLWNhbGwgcmVkYWN0ZWQga2V5IG9uIGl0LlxuICAgIC8vIFVuZGVyIGFuIGV4ZWN1dG9yIHRoZSBjb250ZXh0IGFscmVhZHkgaGFzIHRoZSBydW4ncyBydWxlIChpbnN0YWxsZWQgb25cbiAgICAvLyB0aGUgcm9vdCwgaW5oZXJpdGVkIGRvd24pIGFuZCB0aGlzIHJlLWluc3RhbGxzIHRoZSBzYW1lIG9iamVjdDsgb24gYVxuICAgIC8vIGJhcmUgY29udGV4dCBpdCBpbnN0YWxscyBhIGZyZXNoIG9uZS5cbiAgICB0aGlzLl9zdGFnZUNvbnRleHQudXNlUmVkYWN0aW9uUnVsZSh0aGlzLnJ1bGUpO1xuXG4gICAgLy8gUmVnaXN0ZXIgYXMgY29tbWl0IG9ic2VydmVyIHNvIFNjb3BlUmVjb3JkZXIub25Db21taXQgZmlyZXMgd2hlbiBTdGFnZUNvbnRleHQuY29tbWl0KCkgaXMgY2FsbGVkXG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LnNldENvbW1pdE9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcbiAgICAgIHRoaXMuX29uQ29tbWl0RmlyZWQobXV0YXRpb25zKTtcbiAgICB9KTtcbiAgICByZWdpc3RlclNjb3BlUnVudGltZSh0aGlzLCB7IHRhcmdldDogdGhpcywgaGFuZGxlc0Fzc2lnbm1lbnRzOiBmYWxzZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmVkYWN0aW9uIHJ1bGUgdGhpcyBmYWNhZGUgZGVjaWRlcyB3aXRoIOKAlCB0aGUgU0FNRSBvYmplY3QgaXRzXG4gICAqIGBTdGFnZUNvbnRleHRgIHJldGFpbnMgd2l0aCAoYG1lbW9yeS9yZWRhY3Rpb24udHNgLCB0aGUgb25lIG93bmVyKS4gVW5kZXJcbiAgICogYW4gZXhlY3V0b3IgdGhlIHJ1bGUgaXMgaW5zdGFsbGVkIG9uIHRoZSBydW50aW1lIHJvb3QgYW5kIGluaGVyaXRlZCBieVxuICAgKiBldmVyeSBjb250ZXh0LCBzbyB0aGUgZmFjYWRlIHNpbXBseSByZWFkcyBpdC4gT24gYSBiYXJlIGNvbnRleHQgKHVuaXRcbiAgICogdGVzdHMsIGhhbmQtYnVpbHQgc2NvcGVzKSB0aGUgZmFjYWRlIGNyZWF0ZXMgb25lIGFuZCBpbnN0YWxscyBpdCBvbiB0aGVcbiAgICogY29udGV4dCwgc28gdGhlIGNvbnRleHQncyByZXRlbnRpb24gYW5kIHRoZSBmYWNhZGUncyByZWNvcmRlciB2aWV3c1xuICAgKiBzdGlsbCBzaGFyZSBhIHNpbmdsZSB2ZXJkaWN0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgcnVsZSgpOiBSZWRhY3Rpb25SdWxlIHtcbiAgICBjb25zdCBzaGFyZWQgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0UmVkYWN0aW9uUnVsZSgpO1xuICAgIGlmIChzaGFyZWQpIHJldHVybiBzaGFyZWQ7XG4gICAgaWYgKCF0aGlzLl9sb2NhbFJ1bGUpIHtcbiAgICAgIHRoaXMuX2xvY2FsUnVsZSA9IG5ldyBSZWRhY3Rpb25SdWxlKCk7XG4gICAgICB0aGlzLl9zdGFnZUNvbnRleHQudXNlUmVkYWN0aW9uUnVsZSh0aGlzLl9sb2NhbFJ1bGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9jYWxSdWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIGEgcmVkYWN0ZWQta2V5cyBzZXQgYWNyb3NzIG11bHRpcGxlIFNjb3BlRmFjYWRlIGluc3RhbmNlcy5cbiAgICogQ2FsbCB0aGlzIHRvIG1ha2UgcmVkYWN0aW9uIHBlcnNpc3QgYWNyb3NzIHN0YWdlcyBpbiB0aGUgc2FtZSBwaXBlbGluZS5cbiAgICogKFVuZGVyIGFuIGV4ZWN1dG9yIHRoZSBydW4ncyBydWxlIGFscmVhZHkgc2hhcmVzIG9uZSBzZXQ7IHRoaXMgY2FsbCBpc1xuICAgKiB0aGVuIGEgbm8tb3AuKVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVzZVNoYXJlZFJlZGFjdGVkS2V5cyhzaGFyZWRTZXQ6IFNldDxzdHJpbmc+KTogdm9pZCB7XG4gICAgdGhpcy5ydWxlLnVzZU1hcmtlZEtleXMoc2hhcmVkU2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHJlZGFjdGVkLWtleXMgc2V0IChmb3Igc2hhcmluZyB3aXRoIG90aGVyIHNjb3BlcykuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0UmVkYWN0ZWRLZXlzKCk6IFNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5ydWxlLm1hcmtlZEtleXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhIGRlY2xhcmF0aXZlIHJlZGFjdGlvbiBwb2xpY3kuIFRoZSBwb2xpY3kgaXMgYWRkaXRpdmUg4oCUXG4gICAqIGl0IHdvcmtzIGFsb25nc2lkZSBtYW51YWwgYHNldFZhbHVlKC4uLiwgdHJ1ZSlgIGNhbGxzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVzZVJlZGFjdGlvblBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucnVsZS5zZXRQb2xpY3kocG9saWN5KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UmVkYWN0aW9uUG9saWN5KCk6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucnVsZS5nZXRQb2xpY3koKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxpYW5jZS1mcmllbmRseSByZXBvcnQgb2YgYWxsIHJlZGFjdGlvbiBhY3Rpdml0eS5cbiAgICogTmV2ZXIgaW5jbHVkZXMgYWN0dWFsIHZhbHVlcyDigJQgb25seSBrZXkgbmFtZXMsIGZpZWxkIG5hbWVzLCBhbmQgcGF0dGVybnMuXG4gICAqL1xuICBnZXRSZWRhY3Rpb25SZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICByZXR1cm4gdGhpcy5ydWxlLnJlcG9ydCgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNjb3BlUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyOiBTY29wZVJlY29yZGVyKTogdm9pZCB7XG4gICAgLy8gUmVwbGFjZSBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgSUQgKGlkZW1wb3RlbnQg4oCUIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZylcbiAgICB0aGlzLl9yZWNvcmRlcnMgPSB0aGlzLl9yZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgdGhpcy5fcmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICB9XG5cbiAgZGV0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWNvcmRlcnMgPSB0aGlzLl9yZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlcklkKTtcbiAgfVxuXG4gIGdldFNjb3BlUmVjb3JkZXJzKCk6IFNjb3BlUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9yZWNvcmRlcnNdO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlTdGFnZVN0YXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uU3RhZ2VTdGFydCcsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlTdGFnZUVuZChkdXJhdGlvbj86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uU3RhZ2VFbmQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlQYXVzZShwYXVzZURhdGE/OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25QYXVzZScsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgcGF1c2VEYXRhLFxuICAgICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5UmVzdW1lKGhhc0lucHV0OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25SZXN1bWUnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGhhc0lucHV0LFxuICAgICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5Q29tbWl0KG11dGF0aW9uczogQ29tbWl0RXZlbnRbJ211dGF0aW9ucyddKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25Db21taXQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG11dGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZ1c2UgYSB3cml0ZSBmcm9tIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgKDkuMjIuMCkuIFRocm93cyB3aXRoIHRoZVxuICAgKiBzdGFnZSB0aGUgaGFuZGxlIGNhbWUgZnJvbTsgdGhlIGVuZ2luZSdzIGVycm9yIHBhdGggYXR0cmlidXRlcyB0aGUgdGhyb3dcbiAgICogdG8gdGhlIHN0YWdlIHRoYXQgbWFkZSB0aGUgd3JpdGUuXG4gICAqL1xuICBwcml2YXRlIGFzc2VydExpdmUoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY29tbWl0dGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZGVhZEZyYW1lTWVzc2FnZSh0aGlzLl9zdGFnZU5hbWUsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCwga2V5KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENhbGxlZCBieSBTdGFnZUNvbnRleHQuY29tbWl0KCkgb2JzZXJ2ZXIuIENvbnZlcnRzIHRyYWNrZWQgd3JpdGVzIHRvIENvbW1pdEV2ZW50IGZvcm1hdC5cbiAgICogIEVycm9ycyBhcmUgY2F1Z2h0IHRvIHByZXZlbnQgcmVjb3JkZXIgaXNzdWVzIGZyb20gYWJvcnRpbmcgdGhlIHRyYXZlcnNhbC4gKi9cbiAgcHJpdmF0ZSBfb25Db21taXRGaXJlZChtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+KTogdm9pZCB7XG4gICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGBfc3RhZ2VXcml0ZXNgIGFscmVhZHkgaG9sZHMgdGhlIHJldGFpbmVkIGZvcm0gKHRoZSBjb250ZXh0IHJldGFpbnNcbiAgICAgIC8vIHVuZGVyIHRoZSBzYW1lIHJ1bGUpOyBhcHBseWluZyB0aGUgdmVyZGljdCBhZ2FpbiBoZXJlIGlzIGlkZW1wb3RlbnRcbiAgICAgIC8vIGFuZCBrZWVwcyBhIGtleSBtYXJrZWQgQUZURVIgaXRzIHdyaXRlIHNjcnViYmVkIGF0IGNvbW1pdCB0aW1lLlxuICAgICAgY29uc3QgY29tbWl0TXV0YXRpb25zOiBDb21taXRFdmVudFsnbXV0YXRpb25zJ10gPSBPYmplY3QuZW50cmllcyhtdXRhdGlvbnMpLm1hcCgoW2tleSwgZW50cnldKSA9PiAoe1xuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiB0aGlzLnJ1bGUucmV0YWluKFtrZXldLCBlbnRyeS52YWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogZW50cnkub3BlcmF0aW9uLFxuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLm5vdGlmeUNvbW1pdChjb21taXRNdXRhdGlvbnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3dhbGxvdyDigJQgcmVjb3JkZXIgZXJyb3JzIG11c3Qgbm90IGFib3J0IHRoZSB0cmF2ZXJzYWwuXG4gICAgICAvLyBJbmRpdmlkdWFsIHJlY29yZGVyIGVycm9ycyBhcmUgYWxyZWFkeSBpc29sYXRlZCBieSBfaW52b2tlSG9vay5cbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRGVidWcgLyBEaWFnbm9zdGljcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gVGhlc2UgbGVnYWN5IG1ldGhvZHMgc3RpbGwgd3JpdGUgdG8gdGhlIGBTdGFnZUNvbnRleHRgIGRpYWdub3N0aWNcbiAgLy8gc2lkZSBiYWdzIChsb2dDb250ZXh0IC8gZXJyb3JDb250ZXh0IC8gbWV0cmljQ29udGV4dCAvIGV2YWxDb250ZXh0KSBmb3JcbiAgLy8gc25hcHNob3QgaW5jbHVzaW9uLiBUaGV5IEFMU08gZmlyZSB0aHJvdWdoIHRoZSBFbWl0IGNoYW5uZWwgc28gYW55XG4gIC8vIGF0dGFjaGVkIGBFbWl0UmVjb3JkZXJgIHNlZXMgdGhlbSBpbiByZWFsIHRpbWUg4oCUIGNsb3NpbmcgdGhlXG4gIC8vIGxvbmctc3RhbmRpbmcgZ2FwIHdoZXJlIGAkZGVidWdgL2AkbWV0cmljYCB3ZW50IHRvIHVub2JzZXJ2ZWQgYmFncy5cblxuICBhZGREZWJ1Z0luZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdsb2dzJywga2V5LCB2YWx1ZSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoYGxvZy5kZWJ1Zy4ke2tleX1gLCB7IGtleSwgdmFsdWU6IGtlcHQsIGxldmVsOiAnZGVidWcnIH0pO1xuICB9XG5cbiAgYWRkRGVidWdNZXNzYWdlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdsb2dzJywgJ21lc3NhZ2VzJywgW3ZhbHVlXSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoJ2xvZy5kZWJ1Zy5tZXNzYWdlcycsIHsgdmFsdWU6IEFycmF5LmlzQXJyYXkoa2VwdCkgPyBrZXB0WzBdIDoga2VwdCwgbGV2ZWw6ICdkZWJ1ZycgfSk7XG4gIH1cblxuICBhZGRFcnJvckluZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdlcnJvcnMnLCBrZXksIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgbG9nLmVycm9yLiR7a2V5fWAsIHsga2V5LCB2YWx1ZToga2VwdCwgbGV2ZWw6ICdlcnJvcicgfSk7XG4gIH1cblxuICBhZGRNZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRGlhZ25vc3RpYygnbWV0cmljcycsIG1ldHJpY05hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgbWV0cmljLiR7bWV0cmljTmFtZX1gLCB7IG5hbWU6IG1ldHJpY05hbWUsIHZhbHVlOiBrZXB0IH0pO1xuICB9XG5cbiAgYWRkRXZhbChtZXRyaWNOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdldmFscycsIG1ldHJpY05hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgZXZhbC4ke21ldHJpY05hbWV9YCwgeyBuYW1lOiBtZXRyaWNOYW1lLCB2YWx1ZToga2VwdCB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBFbWl0IOKAlCBQaGFzZSAzIHByaW1hcnkgcHJpbWl0aXZlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBGaXJlIGEgc3RydWN0dXJlZCBldmVudCB0byBldmVyeSBhdHRhY2hlZCByZWNvcmRlciBpbXBsZW1lbnRpbmdcbiAgICogYG9uRW1pdGAuIFN5bmNocm9ub3VzLCBpbi1vcmRlciwgcGFzcy10aHJvdWdoIOKAlCBubyBidWZmZXJpbmcuXG4gICAqXG4gICAqIC0gKipGYXN0LXBhdGgqKjogemVybyBhbGxvY2F0aW9uICsgemVybyBjb3N0IHdoZW4gbm8gcmVjb3JkZXJzIGFyZVxuICAgKiAgIGF0dGFjaGVkIChlYXJseSByZXR1cm4gb24gZW1wdHkgbGlzdCkuXG4gICAqIC0gKipFbnJpY2htZW50Kio6IGxpYnJhcnkgYXV0by1hZGRzIGBzdGFnZU5hbWVgLCBgcnVudGltZVN0YWdlSWRgLFxuICAgKiAgIGBzdWJmbG93UGF0aGAsIGBwaXBlbGluZUlkYCwgYHRpbWVzdGFtcGAgdG8gdGhlIGV2ZW50LlxuICAgKiAtICoqUmVkYWN0aW9uKio6IGBSZWRhY3Rpb25Qb2xpY3kuZW1pdFBhdHRlcm5zYCByZWdleGVzIGFyZSBtYXRjaGVkXG4gICAqICAgYWdhaW5zdCBgbmFtZWAg4oCUIG1hdGNoZWQgZXZlbnRzIGhhdmUgdGhlaXIgcGF5bG9hZCByZXBsYWNlZCB3aXRoXG4gICAqICAgYCdbUkVEQUNURURdJ2AgYmVmb3JlIGRpc3BhdGNoLlxuICAgKiAtICoqRXJyb3IgaXNvbGF0aW9uKio6IGEgdGhyb3dpbmcgYG9uRW1pdGAgZG9lcyBub3QgcHJvcGFnYXRlIOKAlCBpdCBpc1xuICAgKiAgIGNhdWdodCBhbmQgcm91dGVkIHRvIGBvbkVycm9yYCBvbiByZW1haW5pbmcgcmVjb3JkZXJzLCBtYXRjaGluZyB0aGVcbiAgICogICBwYXR0ZXJuIHVzZWQgYnkgb3RoZXIgc2NvcGUgZXZlbnRzLlxuICAgKlxuICAgKiBDb25zdW1lcnMgY2FsbCB0aGlzIHZpYSB0aGUgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYCBzY29wZSBtZXRob2Q7XG4gICAqIHRoZSBtZXRob2Qgcm91dGVzIGhlcmUgdmlhIGBjcmVhdGVUeXBlZFNjb3BlYC5cbiAgICovXG4gIGVtaXRFdmVudChuYW1lOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pOiB2b2lkIHtcbiAgICAvLyBGYXN0LXBhdGg6IHplcm8gd29yayB3aGVuIG5vIHJlY29yZGVycyBhcmUgYXR0YWNoZWQuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIFJlZGFjdGlvbjogaWYgdGhlIGV2ZW50IG5hbWUgbWF0Y2hlcyBhbnkgZW1pdFBhdHRlcm4sIHJlcGxhY2UgcGF5bG9hZFxuICAgIC8vIHdpdGggJ1tSRURBQ1RFRF0nIEJFRk9SRSBjb25zdHJ1Y3RpbmcgdGhlIGV2ZW50IChubyBsZWFrIHRocm91Z2hcbiAgICAvLyBjb3B5LW9uLXdyaXRlLCBubyB3YXkgZm9yIHJlY29yZGVycyB0byBzZWUgdGhlIHJhdyB2YWx1ZSkuXG4gICAgY29uc3QgZmluYWxQYXlsb2FkID0gdGhpcy5ydWxlLnJldGFpbkVtaXQobmFtZSwgcGF5bG9hZCk7XG4gICAgY29uc3Qgc291cmNlUG9zaXRpb24gPSB0aGlzLl9zdGFnZUNvbnRleHQuY2FwdHVyZUVtaXRQb3NpdGlvbigpO1xuXG4gICAgLy8gQnVpbGQgdGhlIGVucmljaGVkIGV2ZW50IG9uY2U7IHBhc3MgdGhlIHNhbWUgcmVmZXJlbmNlIHRvIGFsbFxuICAgIC8vIHJlY29yZGVycyB1bmRlciB0aGVpciByZWFkLW9ubHkgY29udHJhY3QuIFNvdXJjZSBjb29yZGluYXRlcyBhcmVcbiAgICAvLyBjYXB0dXJlZCBiZWZvcmUgYW55IGlubGluZSBob29rIG9yIGRlZmVycmVkIHRhcCBvYnNlcnZlcyB0aGUgZXZlbnQuXG4gICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICBuYW1lLFxuICAgICAgcGF5bG9hZDogZmluYWxQYXlsb2FkLFxuICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd1BhdGg6IHRoaXMuX2dldFN1YmZsb3dQYXRoKCksXG4gICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAuLi4oc291cmNlUG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IHt9IDogeyBzb3VyY2VQb3NpdGlvbiB9KSxcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgLy8gRGlzcGF0Y2ggd2l0aCBlcnJvciBpc29sYXRpb24g4oCUIHRoZSBzYW1lIGBmaXJlYCBsb29wIGFuZCB0aGUgc2FtZSBmYWlsdXJlIHJvdXRpbmcgYXNcbiAgICAvLyBldmVyeSBvdGhlciBzY29wZSBldmVudDogYSB0aHJvd2luZyByZWNvcmRlcidzIGVycm9yIHJlYWNoZXMgb25FcnJvciBvbiB0aGUgcmVjb3JkZXJzO1xuICAgIC8vIHRoZSBlbWl0IGxvb3AgY29udGludWVzIHVuYWZmZWN0ZWQuXG4gICAgZmlyZSh0aGlzLl9yZWNvcmRlcnMsICdvbkVtaXQnLCBldmVudCwgdGhpcy5fcm91dGVGYWlsdXJlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZXRhY2gg4oCUIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBmbG93Y2hhcnQgZXhlY3V0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvL1xuICAvLyBEZWxlZ2F0ZXMgdG8gdGhlIHNoYXJlZCBgZGV0YWNoL3NwYXduYCBoZWxwZXIsIHdoaWNoIG1pbnRzIGEgcmVmSWRcbiAgLy8gZnJvbSB0aGlzIHN0YWdlJ3MgYHJ1bnRpbWVTdGFnZUlkYCBhbmQgY2FsbHMgYGRyaXZlci5zY2hlZHVsZSgpYC5cbiAgLy8gUm91dGVkIHRocm91Z2ggYGNyZWF0ZVR5cGVkU2NvcGVgIGFzIGBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKC4uLilgXG4gIC8vIGFuZCBgc2NvcGUuJGRldGFjaEFuZEZvcmdldCguLi4pYC5cblxuICAvKiogU2VlIGBTY29wZU1ldGhvZHMuJGRldGFjaEFuZEpvaW5MYXRlcmAuICovXG4gIGRldGFjaEFuZEpvaW5MYXRlcihcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaEhhbmRsZSB7XG4gICAgcmV0dXJuIGRldGFjaEFuZEpvaW5MYXRlclNwYXduKGRyaXZlciwgY2hpbGQsIGlucHV0LCB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIFNlZSBgU2NvcGVNZXRob2RzLiRkZXRhY2hBbmRGb3JnZXRgLiAqL1xuICBkZXRhY2hBbmRGb3JnZXQoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogdm9pZCB7XG4gICAgZGV0YWNoQW5kRm9yZ2V0U3Bhd24oZHJpdmVyLCBjaGlsZCwgaW5wdXQsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHN1YmZsb3dQYXRoIChvdXRlciDihpIgaW5uZXIpIGZvciBldmVudCBlbnJpY2htZW50LlxuICAgKlxuICAgKiBQYXJzZXMgZnJvbSBgcnVudGltZVN0YWdlSWRgIHdoaWNoIGhhcyB0aGUgZm9ybWF0XG4gICAqIGBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXhgIChzZWUgYGxpYi9pZHMvcnVudGltZVN0YWdlSWQudHNgKS5cbiAgICogU3ViZmxvdyBpc29sYXRpb24gcHJldmVudHMgd2Fsa2luZyB0aGUgcGFyZW50LWNoYWluIGFjcm9zcyBib3VuZGFyaWVzLFxuICAgKiBzbyB0aGUgcnVudGltZVN0YWdlSWQg4oCUIGdsb2JhbGx5IHVuaXF1ZSwgaW5jbHVkZXMgZnVsbCBwYXRoIOKAlCBpcyB0aGVcbiAgICogY2Fub25pY2FsIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIHN1YmZsb3cgaGllcmFyY2h5IGF0IGVtaXQgdGltZS5cbiAgICpcbiAgICogRXhhbXBsZXM6XG4gICAqICAgJ3NlZWQjMCcgICAgICAgICAgICAgICAgIOKGkiBbXSAgICAgICAgICAgICAgICAgICAgKHJvb3QpXG4gICAqICAgJ3NmLWlubmVyL2lubmVyIzUnICAgICAgIOKGkiBbJ3NmLWlubmVyJ11cbiAgICogICAnc2YtYS9zZi1iL3N0YWdlIzMnICAgICAg4oaSIFsnc2YtYScsICdzZi1iJ10gICAgICAobmVzdGVkKVxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0U3ViZmxvd1BhdGgoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIGNvbnN0IHJ0aWQgPSB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQ7XG4gICAgaWYgKCFydGlkKSByZXR1cm4gU2NvcGVGYWNhZGUuX0VNUFRZX1NVQkZMT1dfUEFUSDtcbiAgICAvLyBUaGUgZ3JhbW1hcidzIG9uZSBvd25lciByZWFkcyB0aGUgcGF0aCBwb3J0aW9uIChgaWRzL3J1bnRpbWVTdGFnZUlkLnRzYCkuXG4gICAgY29uc3Qgc2VnbWVudHMgPSBzdWJmbG93U2VnbWVudHNPZihydGlkKTtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gU2NvcGVGYWNhZGUuX0VNUFRZX1NVQkZMT1dfUEFUSDtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShzZWdtZW50cyk7XG4gIH1cblxuICAvLyDilIDilIAgTm9uLVRyYWNraW5nIFN0YXRlIEluc3BlY3Rpb24gKGZvciBUeXBlZFNjb3BlIHByb3h5IGludGVybmFscykg4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFJldHVybnMgYWxsIHN0YXRlIGtleXMgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IFR5cGVkU2NvcGUgb3duS2V5cy9oYXMgdHJhcHMuICovXG4gIGdldFN0YXRlS2V5cygpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIHVuZGVmaW5lZCk7XG4gICAgaWYgKCFzbmFwc2hvdCB8fCB0eXBlb2Ygc25hcHNob3QgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNuYXBzaG90IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgfVxuXG4gIC8qKiBDaGVjayBrZXkgZXhpc3RlbmNlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBUeXBlZFNjb3BlIGhhcyB0cmFwLlxuICAgKiAgQ29udHJhY3Q6IHJldHVybnMgZmFsc2UgZm9yIGtleXMgbmV2ZXIgc2V0IE9SIGtleXMgc2V0IHRvIHVuZGVmaW5lZC5cbiAgICogIFRoaXMgbWF0Y2hlcyBkZWxldGVWYWx1ZSgpIHNlbWFudGljcyAoc2V0cyB0byB1bmRlZmluZWQgPSBkZWxldGVkKS4gKi9cbiAgaGFzS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZShbXSwga2V5KSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCBmaXJpbmcgb25SZWFkLiBVc2VkIGJ5IGFycmF5IHByb3h5IGdldEN1cnJlbnQoKSB0byBhdm9pZFxuICAgKiAgcGhhbnRvbSByZWFkcyBvbiBpbnRlcm5hbCBhcnJheSBvcGVyYXRpb25zICgubGVuZ3RoLCAuaGFzLCBpdGVyYXRpb24sIGV0Yy4pLlxuICAgKiAgVGhlIGluaXRpYWwgcHJvcGVydHkgYWNjZXNzIGZpcmVzIG9uZSB0cmFja2VkIG9uUmVhZCB2aWEgZ2V0VmFsdWUoKTsgc3Vic2VxdWVudFxuICAgKiAgaW50ZXJuYWwgYXJyYXkgb3BlcmF0aW9ucyB1c2UgdGhpcyBtZXRob2QgdG8gc3RheSBzaWxlbnQuXG4gICAqICBOT1RFOiBMaWtlIGdldFZhbHVlKCksIHJldHVybnMgdGhlIHJhdyB2YWx1ZSB0byB0aGUgY2FsbGVyLiBSZWRhY3Rpb24gYXBwbGllc1xuICAgKiAgb25seSB0byByZWNvcmRlciBkaXNwYXRjaCDigJQgaXQgZG9lcyBub3QgZmlsdGVyIHRoZSByZXR1cm5lZCB2YWx1ZS4gVGhpcyBtYXRjaGVzXG4gICAqICB0aGUgZXhpc3RpbmcgZ2V0VmFsdWUoKSBjb250cmFjdCB3aGVyZSB1c2VyIGNvZGUgYWx3YXlzIHJlY2VpdmVzIHJhdyBkYXRhLlxuICAgKlxuICAgKiAgUkZDLTAwMyBEMjogYSBzaWxlbnQgcmVhZCBvZiBhIGtleSB0aGlzIHN0YWdlIG5ldmVyIFRSQUNLRUQtcmVhZCBtYXJrc1xuICAgKiAgdGhlIHN0YWdlJ3MgY29tbWl0IHdpdGggYHVudHJhY2tlZFNvdXJjZXM6IFsnc2lsZW50J11gIOKAlCBhIGNhdXNhbCBzbGljZVxuICAgKiAgYnVpbHQgZnJvbSBvblJlYWQgZXZlbnRzIHdvdWxkIG1pc3MgdGhpcyBkZXBlbmRlbmN5LCBhbmQgY29uc3VtZXJzIG11c3RcbiAgICogIGJlIHRvbGQuIFNpbGVudCByZWFkcyBzaGFkb3dlZCBieSBhIHRyYWNrZWQgcmVhZCBvZiB0aGUgc2FtZSBrZXkgKHRoZVxuICAgKiAgYXJyYXktcHJveHkgcGF0dGVybiBhYm92ZSkgYXJlIG5vdCBmbGFnZ2VkOiB0aGVpciBlZGdlIGlzIGNhcHR1cmVkLiBBXG4gICAqICB3aG9sZS1zdGF0ZSBzaWxlbnQgcmVhZCAobm8ga2V5KSBpcyBhbHdheXMgZmxhZ2dlZC4gKi9cbiAgZ2V0VmFsdWVTaWxlbnQoa2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLl90cmFja2VkUmVhZEtleXMuaGFzKGtleSkpIHtcbiAgICAgIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdzaWxlbnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZURpcmVjdChbXSwga2V5KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdGF0ZSBBY2Nlc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0SW5pdGlhbFZhbHVlRm9yKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZCBvZiBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqICoqUmVhZCB2YWx1ZXMgYXJlIEJPUlJPV0VEIOKAlCBkbyBub3QgbXV0YXRlIHRoZW0uKiogU2luY2UgdGhlIGxhenkgYnVmZmVyXG4gICAqICgjMTMpLCByZWFkcyBiZWZvcmUgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgcmV0dXJuIHJlZmVyZW5jZXMgSU5UT1xuICAgKiBDT01NSVRURUQgU0hBUkVEIFNUQVRFLCBhbmQgcmVhZHMgYWZ0ZXIgYSB3cml0ZSByZXR1cm4gcmVmZXJlbmNlcyBpbnRvXG4gICAqIHRoZSBzdGFnZSdzIHByaXZhdGUgdHJhbnNhY3Rpb24tYnVmZmVyIHdvcmtpbmcgY29weSAodGhlIGVhZ2VyIGVuZ2luZVxuICAgKiByZXR1cm5lZCByZWZlcmVuY2VzIGludG8gdGhhdCB3b3JraW5nIGNvcHkgZm9yIEFMTCByZWFkcykuIE11dGF0aW5nIGFcbiAgICogcmV0dXJuZWQgdmFsdWUgaW4gcGxhY2Ugd291bGQgY29ycnVwdCBzdGF0ZSB3aXRob3V0IGEgY29tbWl0IHJlY29yZCDigJRcbiAgICogd3JpdGUgY2hhbmdlcyBiYWNrIHZpYSBgc2V0VmFsdWVgL2B1cGRhdGVWYWx1ZWAgaW5zdGVhZC4gVHlwZWRTY29wZVxuICAgKiBjb25zdW1lcnMgYXJlIHNhZmUgYXV0b21hdGljYWxseTogdGhlIHByb3h5IHJvdXRlcyBldmVyeSBtdXRhdGlvblxuICAgKiB0aHJvdWdoIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYC9jb3B5LW9uLXdyaXRlIGFycmF5IG9wcy5cbiAgICpcbiAgICogVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IE5PIGRldi1tb2RlIGZyZWV6ZSBndWFyZCBoZXJlOiBkZWVwLWZyZWV6aW5nIGFcbiAgICogYnVmZmVyLXNlcnZlZCByZWFkIHdvdWxkIGZyZWV6ZSB0aGUgc3RhZ2UncyBvd24gd29ya2luZyBjb3B5IGFuZCBtYWtlIGFcbiAgICogbGVnaXRpbWF0ZSByZWFkLXRoZW4tZGVlcC13cml0ZSB0aHJvdywgYW5kIGZyZWV6aW5nIGEgY29tbWl0dGVkLXN0YXRlXG4gICAqIHJlYWQgbXV0YXRlcyBhbiBvYmplY3Qgc2hhcmVkIHdpdGggZXZlcnkgb3RoZXIgY29uc3VtZXIgb2YgdGhlIGxpdmVcbiAgICogc3RhdGUuIFNlZSBgc3JjL2xpYi9tZW1vcnkvUkVBRE1FLm1kYCAoXCJSZWFkIHZhbHVlcyBhcmUgYm9ycm93ZWRcIikuXG4gICAqXG4gICAqIFJlY29yZGVyIG5vdGU6IHRoZSBgb25SZWFkYCBldmVudCBiZWxvdyBwYXNzZXMgdGhlIFNBTUUgbGl2ZSByZWZlcmVuY2VcbiAgICogKG5vIGNsb25lKSB1bmxlc3MgZmllbGQtbGV2ZWwgcmVkYWN0aW9uIHNjcnVicyBhIGNvcHkg4oCUIHJlY29yZGVycyBtdXN0XG4gICAqIHRyZWF0IGV2ZW50IHZhbHVlcyBhcyByZWFkLW9ubHkgdG9vLlxuICAgKi9cbiAgZ2V0VmFsdWUoa2V5Pzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVBdChbXSwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoLWF3YXJlIGFkYXB0ZXIgYWNjZXNzLiBTZWdtZW50cyBzdGF5IHNlcGFyYXRlIGZyb20gbGl0ZXJhbCBkb3R0ZWQga2V5cyBpbiBTVEFURTtcbiAgICogdGhlIHJlY29yZGVyIGV2ZW50J3MgYGtleWAgaXMgb25seSBhIGRvdC1qb2luZWQgZGlzcGxheSBsYWJlbCwgc28gYFsndXNlcicsJ3NzbiddYCBhbmRcbiAgICogYSBsaXRlcmFsIHRvcC1sZXZlbCBgJ3VzZXIuc3NuJ2AgcHJvZHVjZSB0aGUgc2FtZSBldmVudCBrZXkgKHNhbWUgZm9yIHRoZSB3cml0ZXMgYmVsb3cpLlxuICAgKi9cbiAgZ2V0VmFsdWVBdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUocGF0aCwga2V5KTtcblxuICAgIC8vIFJGQy0wMDMgRDI6IHJlbWVtYmVyIHRyYWNrZWQga2V5cyBzbyBsYXRlciBTSUxFTlQgcmVhZHMgb2YgdGhlIHNhbWVcbiAgICAvLyBrZXkgY291bnQgYXMgc2hhZG93ZWQgKGVkZ2UgYWxyZWFkeSBjYXB0dXJlZCkgaW5zdGVhZCBvZiB1bnRyYWNrZWQuXG4gICAgLy8gT25seSBhIHdob2xlIHRvcC1sZXZlbCB2YWx1ZSBzaGFkb3dzIGEgbGF0ZXIgc2lsZW50IHJlYWQgb2YgdGhhdCB2YWx1ZS5cbiAgICAvLyBSZWFkaW5nIG9uZSBuZXN0ZWQgZmllbGQgbXVzdCBub3QgY2xhaW0gdG8gaGF2ZSBvYnNlcnZlZCBpdHMgc2libGluZ3MuXG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwICYmIGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLl90cmFja2VkUmVhZEtleXMuYWRkKGtleSk7XG4gICAgZWxzZSBpZiAocGF0aC5sZW5ndGggPT09IDEgJiYga2V5ID09PSB1bmRlZmluZWQpIHRoaXMuX3RyYWNrZWRSZWFkS2V5cy5hZGQocGF0aFswXSEpO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBBIHdob2xlLXN0YXRlIHJlYWQgKG5vIGtleSkgaXMgc2VydmVkIHdpdGggZXZlcnkgcmVkYWN0ZWQga2V5IGluc2lkZVxuICAgICAgLy8gaXQgc2NydWJiZWQ7IGEga2V5ZWQgcmVhZCBpcyBzZXJ2ZWQgdW5kZXIgdGhlIGtleSdzIHZlcmRpY3QuXG4gICAgICBjb25zdCB3aG9sZVN0YXRlID0gcGF0aC5sZW5ndGggPT09IDAgJiYga2V5ID09PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB2ZXJkaWN0ID0gd2hvbGVTdGF0ZSA/IENMRUFSIDoga2V5ID09PSB1bmRlZmluZWQgPyB0aGlzLnJ1bGUudmVyZGljdChwYXRoKSA6IHRoaXMucnVsZS52ZXJkaWN0QXQocGF0aCwga2V5KTtcbiAgICAgIGNvbnN0IHJlY29yZGVyVmFsdWUgPSB3aG9sZVN0YXRlID8gdGhpcy5ydWxlLnJldGFpblJlY29yZCh2YWx1ZSkgOiBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKTtcbiAgICAgIGNvbnN0IGV2ZW50S2V5ID0gcGF0aC5sZW5ndGggPT09IDAgPyBrZXkgOiAoa2V5ID09PSB1bmRlZmluZWQgPyBwYXRoIDogWy4uLnBhdGgsIGtleV0pLmpvaW4oJy4nKTtcblxuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25SZWFkJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICB2YWx1ZTogcmVjb3JkZXJWYWx1ZSxcbiAgICAgICAgcmVkYWN0ZWQ6IHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBzZXRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VmFsdWVBdChbXSwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogUGF0aC1hd2FyZSB3cml0ZXMgc2hhcmUgcmVjb3JkaW5nLCByZWRhY3Rpb24gYW5kIGxpZmV0aW1lIHBvbGljeSB3aXRoIGZsYXQgd3JpdGVzLiAqL1xuICBzZXRWYWx1ZUF0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXZlbnRLZXkgPSBwYXRoLmxlbmd0aCA9PT0gMCA/IGtleSA6IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKTtcbiAgICBhc3NlcnROb3RSZWFkb25seSh0aGlzLl9yZWFkT25seVZhbHVlcywgcGF0aFswXSA/PyBrZXksICd3cml0ZScpO1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShldmVudEtleSk7XG5cbiAgICAvLyBEZXYtbW9kZTogd2FybiBpZiB0aGUgdmFsdWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbiAgICAvLyBDaGVjayBBRlRFUiBhc3NlcnROb3RSZWFkb25seSDigJQgZG9uJ3Qgd2FybiBmb3Igd3JpdGVzIHRoYXQgd2lsbCBiZSBibG9ja2VkLlxuICAgIC8vIENpcmN1bGFyIHZhbHVlcyB3b3JrICh0ZXJtaW5hbCBwcm94eSBoYW5kbGVzIHRoZW0pIGJ1dCBjYW4gcHJvZHVjZVxuICAgIC8vIHN1cnByaXNpbmcgYmVoYXZpb3IgaW4gbmFycmF0aXZlLCBKU09OIHNlcmlhbGl6YXRpb24sIGFuZCBzbmFwc2hvdHMuXG4gICAgaWYgKGlzRGV2TW9kZSgpICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChoYXNDaXJjdWxhclJlZmVyZW5jZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gc2V0VmFsdWUoJyR7ZXZlbnRLZXl9JykuIGAgK1xuICAgICAgICAgICAgJ1dyaXRlcyBwYXN0IHRoZSBjeWNsZSBkZXB0aCB3aWxsIHVzZSB0ZXJtaW5hbCBwcm94eSB0cmFja2luZy4gJyArXG4gICAgICAgICAgICAnQ29uc2lkZXIgZmxhdHRlbmluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgY29udGV4dCBpcyB0aGUgT05FIGZ1bm5lbDogaXQgZGVjaWRlcyB0aGUgdmVyZGljdCAoZXhwbGljaXQgZmxhZyxcbiAgICAvLyBwb2xpY3kga2V5L3BhdHRlcm4sIHBlci1ydW4gbWFyaywgb3IgZmllbGQtbGV2ZWwgc2NydWIpLCBzdGFnZXMgdGhlXG4gICAgLy8gd3JpdGUgd2l0aCB0aGUgcGF0aHMgdGhlIGxvZyB3aWxsIHNjcnViLCBhbmQgaGFuZHMgdGhlIHZlcmRpY3QgYmFjayBzb1xuICAgIC8vIHJlY29yZGVycyBzZWUgdGhlIHNhbWUgZGVjaXNpb24gdGhlIHJldGFpbmVkIHJlY29yZCBob2xkcy5cbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsIGRlc2NyaXB0aW9uKTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgdmFsdWU6IFJlZGFjdGlvblJ1bGUuYXBwbHkodmVyZGljdCwgdmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246ICdzZXQnLFxuICAgICAgICByZWRhY3RlZDogdmVyZGljdC5raW5kICE9PSAnY2xlYXInIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVWYWx1ZUF0KFtdLCBrZXksIHZhbHVlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogUGF0aC1hd2FyZSBtZXJnZXMgdXNlIHRoZSBzYW1lIHdyaXRlIGZ1bm5lbCBhcyByZXBsYWNlbWVudHMuICovXG4gIHVwZGF0ZVZhbHVlQXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBldmVudEtleSA9IHBhdGgubGVuZ3RoID09PSAwID8ga2V5IDogWy4uLnBhdGgsIGtleV0uam9pbignLicpO1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBwYXRoWzBdID8/IGtleSwgJ3dyaXRlJyk7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGV2ZW50S2V5KTtcblxuICAgIC8vIERldi1tb2RlOiBzYW1lIGNpcmN1bGFyIGNoZWNrIGFzIHNldFZhbHVlIChtZXJnZSB0YXJnZXRzIGNhbiBiZSBjaXJjdWxhciB0b28pXG4gICAgaWYgKGlzRGV2TW9kZSgpICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChoYXNDaXJjdWxhclJlZmVyZW5jZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gdXBkYXRlVmFsdWUoJyR7ZXZlbnRLZXl9JykuIGAgK1xuICAgICAgICAgICAgJ0NvbnNpZGVyIGZsYXR0ZW5pbmcgdGhlIGRhdGEgc3RydWN0dXJlLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMuX3N0YWdlQ29udGV4dC51cGRhdGVPYmplY3QocGF0aCwga2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvbldyaXRlJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICB2YWx1ZTogUmVkYWN0aW9uUnVsZS5hcHBseSh2ZXJkaWN0LCB2YWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgICAgIHJlZGFjdGVkOiB2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlVmFsdWUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIGtleSwgJ2RlbGV0ZScpO1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShrZXkpO1xuXG4gICAgLy8gRGVsZXRpbmcgYSBrZXkgY2xlYXJzIGl0cyBwZXItY2FsbCByZWRhY3Rpb24gbWFyayAodGhlIGNvbnRleHQnc1xuICAgIC8vIGZ1bm5lbCBkb2VzIHRoYXQpOyBhIHBvbGljeSB2ZXJkaWN0IG9uIHRoZSBrZXkgc3Vydml2ZXMuXG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChbXSwga2V5LCB1bmRlZmluZWQsIGZhbHNlLCBkZXNjcmlwdGlvbiA/PyBgZGVsZXRlZCAke2tleX1gLCAnZGVsZXRlJyk7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uV3JpdGUnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgb3BlcmF0aW9uOiAnZGVsZXRlJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmFzc2VydExpdmUoa2V5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LnNldEdsb2JhbD8uKGtleSwgdmFsdWUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0R2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRPYmplY3RJblJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGtleSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRSb290Py4oa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZC1vbmx5ICsgbWlzYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVhZG9ubHkgaW5wdXQgdmFsdWVzIHBhc3NlZCB0byB0aGlzIHBpcGVsaW5lLCBjYXN0IHRvIGBUYC5cbiAgICogT3JkaW5hcnkgbXV0YWJsZSByZWNvcmRzL2FycmF5cyBhcmUgY29waWVkIGFuZCBmcm96ZW4sIG5vdCBmcm96ZW4gaW4gcGxhY2UuXG4gICAqIE9wYXF1ZSBjYXBhYmlsaXRpZXMgYW5kIGV4cGxpY2l0bHkgZnJvemVuIHdyYXBwZXJzIHJlbWFpbiBib3Jyb3dlZC9saXZlO1xuICAgKiBzZWUgYHByb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC50cyDCtyBjcmVhdGVGcm96ZW5BcmdzYCBmb3IgdGhlIG93bmVyc2hpcCBydWxlLlxuICAgKiBDYWNoZWQgYXQgY29uc3RydWN0aW9uIHRpbWUgZm9yIHplcm8tYWxsb2NhdGlvbiByZXBlYXRlZCBhY2Nlc3MuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBhcHBsaWNhbnROYW1lLCBpbmNvbWUgfSA9IHNjb3BlLmdldEFyZ3M8eyBhcHBsaWNhbnROYW1lOiBzdHJpbmc7IGluY29tZTogbnVtYmVyIH0+KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBSRkMtMDAzIEQyOiBhcmdzIGFyZSB1bnRyYWNrZWQgQlkgREVTSUdOLCBzbyBjYWxsaW5nIHRoaXMgKHdpdGggYWN0dWFsXG4gICAqIGlucHV0IHByZXNlbnQpIG1hcmtzIHRoZSBzdGFnZSdzIGNvbW1pdCB3aXRoIGB1bnRyYWNrZWRTb3VyY2VzOiBbJ2FyZ3MnXWBcbiAgICog4oCUIHRlbGxpbmcgY2F1c2FsLXNsaWNlIGNvbnN1bWVycyB0aGUgYmFja3dhcmQgc2xpY2UgbWF5IGJlIGluY29tcGxldGVcbiAgICogaGVyZS4gQW4gZW1wdHktYXJncyByZWFkIGNhcnJpZXMgbm8gaW5mb3JtYXRpb24gYW5kIGlzIG5vdCBmbGFnZ2VkLlxuICAgKi9cbiAgZ2V0QXJnczxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk6IFQge1xuICAgIGlmICh0aGlzLl9oYXNBcmdzKSB0aGlzLl9zdGFnZUNvbnRleHQubWFya1VudHJhY2tlZFNvdXJjZSgnYXJncycpO1xuICAgIHJldHVybiB0aGlzLl9mcm96ZW5BcmdzIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IOKAlCByZWFkLW9ubHkgaW5mcmFzdHJ1Y3R1cmUgdmFsdWVzXG4gICAqIHRoYXQgcHJvcGFnYXRlIHRocm91Z2ggbmVzdGVkIGV4ZWN1dG9ycyAobGlrZSBgcHJvY2Vzcy5lbnZgIGZvciBmbG93Y2hhcnRzKS5cbiAgICpcbiAgICogQ29udGFpbnM6IHNpZ25hbCAoYWJvcnQpLCB0aW1lb3V0TXMsIHRyYWNlSWQuXG4gICAqIEZyb3plbiBhdCBjb25zdHJ1Y3Rpb24gdGltZS4gSW5oZXJpdGVkIGJ5IHN1YmZsb3dzIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBzaWduYWwsIHRyYWNlSWQgfSA9IHNjb3BlLmdldEVudigpO1xuICAgKiBgYGBcbiAgICpcbiAgICogUkZDLTAwMyBEMjogZW52IGlzIHVudHJhY2tlZCBCWSBERVNJR04sIHNvIGNhbGxpbmcgdGhpcyAod2l0aCBhXG4gICAqIG5vbi1lbXB0eSBlbnZpcm9ubWVudCkgbWFya3MgdGhlIHN0YWdlJ3MgY29tbWl0IHdpdGhcbiAgICogYHVudHJhY2tlZFNvdXJjZXM6IFsnZW52J11gIOKAlCBzZWUge0BsaW5rIGdldEFyZ3N9LlxuICAgKi9cbiAgZ2V0RW52KCk6IFJlYWRvbmx5PEV4ZWN1dGlvbkVudj4ge1xuICAgIGlmICh0aGlzLl9oYXNFbnYpIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdlbnYnKTtcbiAgICByZXR1cm4gdGhpcy5fZXhlY3V0aW9uRW52O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRQaXBlbGluZUlkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBfaW52b2tlSG9vazxLIGV4dGVuZHMgU2NvcGVIb29rTmFtZT4oaG9vazogSywgZXZlbnQ6IEhvb2tQYXlsb2FkPEs+KTogdm9pZCB7XG4gICAgLy8gVGhlIG9uZSBwZXItcmVjb3JkZXIgbG9vcCAoYHJlY29yZGVyL2hvb2tzLnRzIMK3IGZpcmVgKSDigJQgdGhlIFNBTUUgaW52b2tlIHByaW1pdGl2ZSB0aGVcbiAgICAvLyBkZWZlcnJlZCB0aWVyIHVzZXMgYXQgZGVsaXZlcnkgdGltZSwgc28gdGhlIGlubGluZSBhbmQgZGVmZXJyZWQgcGF0aHMgY2Fubm90IGRyaWZ0LlxuICAgIGZpcmUodGhpcy5fcmVjb3JkZXJzLCBob29rLCBldmVudCwgdGhpcy5fcm91dGVGYWlsdXJlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2NvcGUgY2hhbm5lbCdzIGlzb2xhdGlvbjogYSByZWNvcmRlcidzIHRocm93IGJlY29tZXMgYW4gYG9uRXJyb3JgIG9uIGV2ZXJ5IHJlY29yZGVyXG4gICAqIChzdGFtcGVkIHdpdGggdGhpcyBzdGFnZSksIGFuZCBhIHRocm93IGZyb20gYG9uRXJyb3JgIGl0c2VsZiBpcyBkcm9wcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcm91dGVGYWlsdXJlOiBIb29rRmFpbHVyZSA9IChlcnJvciwgX3JlY29yZGVyLCBob29rKSA9PiB7XG4gICAgaWYgKGhvb2sgPT09ICdvbkVycm9yJykgcmV0dXJuO1xuICAgIHRoaXMuX2ludm9rZUhvb2soXG4gICAgICAnb25FcnJvcicsXG4gICAgICByZWNvcmRlckZhaWx1cmVFdmVudChcbiAgICAgICAge1xuICAgICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgaG9vayxcbiAgICAgICksXG4gICAgKTtcbiAgfTtcbn1cbiJdfQ==
|
|
921
|
+
/** The signal of a stage outside the runner in a run with no signal: one that never aborts, shared. */
|
|
922
|
+
const NEVER_ABORTED = new AbortController().signal;
|
|
923
|
+
/** The name a late detach is recorded under: the child chart's root id — a name, never its input. */
|
|
924
|
+
function detachKey(child) {
|
|
925
|
+
const id = child?.root?.id;
|
|
926
|
+
return typeof id === 'string' ? `detach:${id}` : 'detach';
|
|
927
|
+
}
|
|
928
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NvcGVGYWNhZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Njb3BlL1Njb3BlRmFjYWRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBRUgseUNBQThDO0FBRTlDLGdEQUF5RDtBQUN6RCxvREFBbUQ7QUFDbkQsZ0RBQXNEO0FBQ3RELHdEQUFnRztBQUNoRyxvREFBdUU7QUFDdkUsd0VBQW1FO0FBQ25FLG9EQUFxRDtBQVdyRCx3REFBOEQ7QUFDOUQsaURBRzRCO0FBRTVCLDhDQUEwQztBQUUxQyx1RUFBcUY7QUFDckYseURBQThEO0FBRzlELG1EQUFrRTtBQUNsRSxvRUFBb0Y7QUFDcEYsNkNBQW9EO0FBR3BELE1BQWEsV0FBVztJQUNmLE1BQU0sQ0FBVSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTVEOzs7O09BSUc7SUFDSyxNQUFNLENBQVUsbUJBQW1CLEdBQXNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFekUsYUFBYSxDQUFlO0lBQzVCLFVBQVUsQ0FBUztJQUNWLGVBQWUsQ0FBVztJQUU3QywrRUFBK0U7SUFDOUQsV0FBVyxDQUEwQjtJQUV0RCx5RUFBeUU7SUFDeEQsYUFBYSxDQUF5QjtJQUV2RDtvRUFDZ0U7SUFDL0MsUUFBUSxDQUFVO0lBRW5DLCtEQUErRDtJQUM5QyxPQUFPLENBQVU7SUFFbEM7Ozs7OztPQU1HO0lBQ2MsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUU5QyxVQUFVLEdBQW9CLEVBQUUsQ0FBQztJQUV6Qzs7Ozs7Ozs7OztPQVVHO0lBQ0ssVUFBVSxHQUFHLEtBQUssQ0FBQztJQUUzQjs7OztPQUlHO0lBQ0ssVUFBVSxDQUFpQjtJQUVuQzs7OztPQUlHO0lBQ0ssWUFBWSxDQUFrQjtJQUV0Qzs7Ozs7Ozs7T0FRRztJQUNjLFFBQVEsQ0FBa0I7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QUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTY29wZUZhY2FkZSDigJQgQmFzZSBjbGFzcyB0aGF0IGxpYnJhcnkgY29uc3VtZXJzIGV4dGVuZCB0byBjcmVhdGUgY3VzdG9tIHNjb3BlIGNsYXNzZXNcbiAqXG4gKiBXcmFwcyBTdGFnZUNvbnRleHQgKGZyb20gbWVtb3J5LykgdG8gcHJvdmlkZSBhIGNvbnN1bWVyLWZyaWVuZGx5IEFQSSBmb3JcbiAqIHN0YXRlIGFjY2VzcywgZGVidWcgbG9nZ2luZywgbWV0cmljcywgYW5kIHJlY29yZGVyIGhvb2tzLlxuICpcbiAqIENvbnN1bWVycyBleHRlbmQgdGhpcyBjbGFzcyB0byBhZGQgZG9tYWluLXNwZWNpZmljIHByb3BlcnRpZXM6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgTXlTY29wZSBleHRlbmRzIFNjb3BlRmFjYWRlIHtcbiAqICAgZ2V0IHVzZXJOYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmdldFZhbHVlKCduYW1lJykgYXMgc3RyaW5nOyB9XG4gKiAgIHNldCB1c2VyTmFtZSh2YWx1ZTogc3RyaW5nKSB7IHRoaXMuc2V0VmFsdWUoJ25hbWUnLCB2YWx1ZSk7IH1cbiAqIH1cbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IHN1YmZsb3dTZWdtZW50c09mIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHsgY2FsbFNlcmllcywgcnVuQ2FsbCB9IGZyb20gJy4uL2F0dGVtcHQvY2FsbC5qcyc7XG5pbXBvcnQgeyBjYWxsVG91Y2hlcyB9IGZyb20gJy4uL2F0dGVtcHQvZWZmZWN0LmpzJztcbmltcG9ydCB7IGFkbWl0QXR0ZW1wdE5hbWUgfSBmcm9tICcuLi9hdHRlbXB0L25hbWUuanMnO1xuaW1wb3J0IHsgb2JzZXJ2ZWRSZWNvcmQsIE9ic2VydmVkU2VyaWVzQm9vaywgcmVhZE9ic2VydmVkUmVwb3J0IH0gZnJvbSAnLi4vYXR0ZW1wdC9vYnNlcnZlZC5qcyc7XG5pbXBvcnQgeyBhZG1pdENhbGxQb2xpY3ksIGF0dGVtcHRDZWlsaW5nIH0gZnJvbSAnLi4vYXR0ZW1wdC9wb2xpY3kuanMnO1xuaW1wb3J0IHsgdGFrZVJldHJ5TG9vcENhbGwgfSBmcm9tICcuLi9hdHRlbXB0L3JldHJ5TG9vcENvbnRleHQuanMnO1xuaW1wb3J0IHsgYXR0ZW1wdEVuZHNBdCB9IGZyb20gJy4uL2F0dGVtcHQvcnVubmVyLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQXR0ZW1wdENvbnRleHQsXG4gIEF0dGVtcHRFcnJvcixcbiAgQ2FsbE9wdGlvbnMsXG4gIExhdGVXcml0ZSxcbiAgT2JzZXJ2ZWRBdHRlbXB0LFxuICBSZXRyeVBvbGljeSxcbiAgUnVuQ29ycmVsYXRpb24sXG59IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Q2hhcnQgfSBmcm9tICcuLi9idWlsZGVyL3R5cGVzLmpzJztcbmltcG9ydCB7IGhhc0NpcmN1bGFyUmVmZXJlbmNlIH0gZnJvbSAnLi4vY2FwdHVyZS9jaXJjdWxhci5qcyc7XG5pbXBvcnQge1xuICBkZXRhY2hBbmRGb3JnZXQgYXMgZGV0YWNoQW5kRm9yZ2V0U3Bhd24sXG4gIGRldGFjaEFuZEpvaW5MYXRlciBhcyBkZXRhY2hBbmRKb2luTGF0ZXJTcGF3bixcbn0gZnJvbSAnLi4vZGV0YWNoL3NwYXduLmpzJztcbmltcG9ydCB0eXBlIHsgRGV0YWNoRHJpdmVyLCBEZXRhY2hIYW5kbGUgfSBmcm9tICcuLi9kZXRhY2gvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEV4ZWN1dGlvbkVudiB9IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZWFkRnJhbWVNZXNzYWdlLCBsYXRlQXR0ZW1wdE1lc3NhZ2UgfSBmcm9tICcuLi9tZW1vcnkvYm9ycm93ZWRNdXRhdGlvbi5qcyc7XG5pbXBvcnQgeyBDTEVBUiwgUmVkYWN0aW9uUnVsZSB9IGZyb20gJy4uL21lbW9yeS9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IEhvb2tGYWlsdXJlLCBIb29rUGF5bG9hZCwgU2NvcGVIb29rTmFtZSB9IGZyb20gJy4uL3JlY29yZGVyL2hvb2tzLmpzJztcbmltcG9ydCB7IGZpcmUsIHJlY29yZGVyRmFpbHVyZUV2ZW50IH0gZnJvbSAnLi4vcmVjb3JkZXIvaG9va3MuanMnO1xuaW1wb3J0IHsgYXNzZXJ0Tm90UmVhZG9ubHksIGNyZWF0ZUZyb3plbkFyZ3MgfSBmcm9tICcuL3Byb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC5qcyc7XG5pbXBvcnQgeyByZWdpc3RlclNjb3BlUnVudGltZSB9IGZyb20gJy4vcnVudGltZS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEV2ZW50LCBSZWRhY3Rpb25Qb2xpY3ksIFJlZGFjdGlvblJlcG9ydCwgU2NvcGVSZWNvcmRlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgY2xhc3MgU2NvcGVGYWNhZGUge1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJSQU5EID0gU3ltYm9sLmZvcignU2NvcGVGYWNhZGVAdjEnKTtcblxuICAvKipcbiAgICogU2hhcmVkIHNlbnRpbmVsIHJldHVybmVkIGJ5IGBfZ2V0U3ViZmxvd1BhdGgoKWAgZm9yIHJvb3QtbGV2ZWwgc3RhZ2VzXG4gICAqIChubyBzdWJmbG93IG5lc3RpbmcpLiBBdm9pZHMgcGVyLWNhbGwgYWxsb2NhdGlvbiBvZiBhIGZyZXNoXG4gICAqIGBPYmplY3QuZnJlZXplKFtdKWAgb24gZXZlcnkgYGVtaXRFdmVudGAgaW4gdGhlIGNvbW1vbiBuby1zdWJmbG93IGNhc2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBfRU1QVFlfU1VCRkxPV19QQVRIOiByZWFkb25seSBzdHJpbmdbXSA9IE9iamVjdC5mcmVlemUoW10pO1xuXG4gIHByb3RlY3RlZCBfc3RhZ2VDb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIHByb3RlY3RlZCBfc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSBfcmVhZE9ubHlWYWx1ZXM/OiB1bmtub3duO1xuXG4gIC8qKiBDYWNoZWQgZGVlcGx5LWZyb3plbiBjb3B5IG9mIHJlYWRPbmx5VmFsdWVzIGZvciBnZXRBcmdzKCkuIENyZWF0ZWQgb25jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZnJvemVuQXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcmVhZC1vbmx5LCBpbmhlcml0ZWQgZnJvbSBwYXJlbnQgZXhlY3V0b3IuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2V4ZWN1dGlvbkVudjogUmVhZG9ubHk8RXhlY3V0aW9uRW52PjtcblxuICAvKiogUkZDLTAwMyBEMjogdHJ1ZSB3aGVuIGBnZXRBcmdzKClgIGNhbiByZXR1cm4gYWN0dWFsIGRhdGEg4oCUIGFuIGVtcHR5XG4gICAqICBge31gIHJlYWQgY2FycmllcyBubyBpbmZvcm1hdGlvbiwgc28gaXQgaXMgbmV2ZXIgZmxhZ2dlZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzQXJnczogYm9vbGVhbjtcblxuICAvKiogUkZDLTAwMyBEMjogdHJ1ZSB3aGVuIGBnZXRFbnYoKWAgY2FuIHJldHVybiBhY3R1YWwgZGF0YS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzRW52OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyOiBrZXlzIHRoaXMgc3RhZ2UgaGFzIFRSQUNLRUQtcmVhZCAodmlhIGBnZXRWYWx1ZShrZXkpYCkuXG4gICAqIEEgc2lsZW50IHJlYWQgb2YgYSBrZXkgaW4gdGhpcyBzZXQgaXMgU0hBRE9XRUQg4oCUIGl0cyByZWFk4oaSd3JpdGUgZWRnZSBpc1xuICAgKiBhbHJlYWR5IGNhcHR1cmVkLCBzbyBpdCBpcyBub3QgZmxhZ2dlZCBhcyBhbiB1bnRyYWNrZWQgc291cmNlLiBUaGlzIGlzXG4gICAqIHdoYXQga2VlcHMgVHlwZWRTY29wZSBhcnJheS1wcm94eSBpbnRlcm5hbHMgKHdoaWNoIGFsd2F5cyBmb2xsb3cgYVxuICAgKiB0cmFja2VkIHByb3BlcnR5IHJlYWQpIGFuZCBgJGJhdGNoQXJyYXlgIGhvbmVzdC1idXQtcXVpZXQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF90cmFja2VkUmVhZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBwcml2YXRlIF9yZWNvcmRlcnM6IFNjb3BlUmVjb3JkZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBTZXQgYnkgdGhlIGNvbW1pdCBvYnNlcnZlcjogdGhpcyBzdGFnZSdzIGZyYW1lIGhhcyBmbHVzaGVkLiBBIGZhY2FkZSBpc1xuICAgKiBPTkUgc3RhZ2UgZXhlY3V0aW9uJ3MgaGFuZGxlIOKAlCB0aGUgZW5naW5lIGJ1aWxkcyBhIGZyZXNoIG9uZSBwZXIgc3RhZ2Ug4oCUXG4gICAqIGFuZCBldmVyeSBwcm94eSB0aGUgdHlwZWQgc2NvcGUgaGFuZHMgb3V0IGlzIGJvdW5kIHRvIGl0LiBBIHdyaXRlIGFycml2aW5nXG4gICAqIGFmdGVyIHRoZSBjb21taXQgY29tZXMgZnJvbSBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIChhIGNsb3N1cmUsIGFcbiAgICogbW9kdWxlLWxldmVsIGBsZXRgKSBhbmQgd291bGQgbGFuZCBpbiBhIGJ1ZmZlciBub3RoaW5nIGV2ZXIgY29tbWl0czogbm9cbiAgICogdHJhY2Ugcm93LCBzdGF0ZSB1bmNoYW5nZWQuIFNvIGl0IGlzIHJlZnVzZWQgKHtAbGluayBhc3NlcnRMaXZlfSkgaW5zdGVhZFxuICAgKiBvZiBsb3N0LiBTZWFsaW5nIGhlcmUgYW5kIG5vdCBvbiBgU3RhZ2VDb250ZXh0YCBpcyBkZWxpYmVyYXRlOiB0aGUgZnJhbWVcbiAgICogc3RheXMgcmUtdXNhYmxlIGFmdGVyIGNvbW1pdCBieSBkZXNpZ24gKCMxM2Ig4oCUIHRoZSBlbmdpbmUncyBkb3VibGUtY29tbWl0XG4gICAqIHBhdGhzIGFuZCB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBicmFuY2ggcGFyZW50IG5lZWQgaXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29tbWl0dGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgcnVsZSBvZiB0aGlzIGZhY2FkZSdzIG93biDigJQgT05MWSB3aGVuIGl0cyBjb250ZXh0IGNhcnJpZXMgbm9uZSAoYmFyZVxuICAgKiBjb250ZXh0cyBpbiB1bml0IHRlc3RzKS4gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bGUgbGl2ZXMgb24gdGhlIGNvbnRleHRcbiAgICogdHJlZSBhbmQgdGhpcyBzdGF5cyB1bnNldDsgc2VlIHtAbGluayBydWxlfS5cbiAgICovXG4gIHByaXZhdGUgX2xvY2FsUnVsZT86IFJlZGFjdGlvblJ1bGU7XG5cbiAgLyoqXG4gICAqIFRoZSBydW4ncyBjb3JyZWxhdGlvbiAoMTAuMSksIGluc3RhbGxlZCBieSB0aGUgZXhlY3V0b3IncyBjb21wb3NlZCBzY29wZSBmYWN0b3J5XG4gICAqIChgUnVuT2JzZXJ2ZXJzIMK3IGNvbXBvc2VTY29wZUZhY3RvcnlgKSDigJQgc3RhbXBlZCBMQVNUIG9uIGV2ZXJ5IHNjb3BlIGFuZCBlbWl0IGV2ZW50IHRoaXMgZmFjYWRlIGZpcmVzLFxuICAgKiBvbmx5IHdoZW4gcHJlc2VudCwgc28gYSBydW4gd2l0aG91dCBvbmUgZmlyZXMgYnl0ZS1pZGVudGljYWwgZXZlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29ycmVsYXRpb24/OiBSdW5Db3JyZWxhdGlvbjtcblxuICAvKipcbiAgICogVGhlIGF0dGVtcHQgdGhpcyBmYWNhZGUgd2FzIGJ1aWx0IGZvciAoUDFiKSDigJQgdGhlIHJ1bm5lcidzLCByZWFkIG9mZiB0aGVcbiAgICogY29udGV4dCBhdCBjb25zdHJ1Y3Rpb24uIEEgZmFjYWRlIGlzIE9ORSBhdHRlbXB0J3MgaGFuZGxlOiBvbmNlIHRoYXRcbiAgICogYXR0ZW1wdCBlbmRzIHdpdGhvdXQgYW4gYW5zd2VyIChpdHMgY2FwLCB0aGUgZGVhZGxpbmUsIGEgY2FuY2VsbGF0aW9uLCBhXG4gICAqIHRocm93KSwgdGhlIGZ1bmN0aW9uIGJlaGluZCBpdCBtYXkgc3RpbGwgYmUgcnVubmluZywgYW5kIGFueXRoaW5nIGl0XG4gICAqIHRvdWNoZXMgdGhyb3VnaCB0aGlzIGZhY2FkZSBpcyByZWZ1c2VkICh7QGxpbmsgcmVmdXNlSWZBdHRlbXB0RW5kZWR9KSDigJRcbiAgICogYSB3cml0ZSBvciBhbiBlbWl0IGlzIGFsc28gcmVjb3JkZWQgb24gdGhlIHN0YWdlLiBBYnNlbnQgZm9yIGEgc3RhZ2UgdGhlXG4gICAqIHJ1bm5lciBkb2VzIG5vdCBydW46IG5vdGhpbmcgaXMgZmVuY2VkLCBhcyBiZWZvcmUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9hdHRlbXB0PzogQXR0ZW1wdENvbnRleHQ7XG5cbiAgLyoqIFRoZSBydW4ncyBzaWduYWwsIGZvciBgJGF0dGVtcHQoKWAgb2YgYSBzdGFnZSB0aGUgcnVubmVyIGRvZXMgbm90IHJ1bi4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcnVuU2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqIGAkY2FsbGBzIHdpdGggYG9mID4gMWAgaW4gZmxpZ2h0IHRocm91Z2ggdGhpcyBmYWNhZGUg4oCUIGEga2V5bGVzcyB0b3VjaGluZyBjYWxsIGluc2lkZSBvbmUgaXMgcmVmdXNlZCAoUDMpLiAqL1xuICBwcml2YXRlIF9yZXRyeWluZ0NhbGxzID0gMDtcblxuICAvKiogVGhpcyBhdHRlbXB0J3Mgb2JzZXJ2ZWQgcmVwb3J0cywgZ3JvdXBlZCBpbnRvIHNlcmllcyAoUDIpIOKAlCBtYWRlIG9uIHRoZSBmaXJzdCByZXBvcnQuICovXG4gIHByaXZhdGUgX29ic2VydmVkQm9vaz86IE9ic2VydmVkU2VyaWVzQm9vaztcblxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBTdGFnZUNvbnRleHQsIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seVZhbHVlcz86IHVua25vd24sIGV4ZWN1dGlvbkVudj86IEV4ZWN1dGlvbkVudikge1xuICAgIHRoaXMuX3N0YWdlQ29udGV4dCA9IGNvbnRleHQ7XG4gICAgdGhpcy5fc3RhZ2VOYW1lID0gc3RhZ2VOYW1lO1xuICAgIHRoaXMuX3JlYWRPbmx5VmFsdWVzID0gcmVhZE9ubHlWYWx1ZXM7XG4gICAgdGhpcy5fZnJvemVuQXJncyA9IGNyZWF0ZUZyb3plbkFyZ3MocmVhZE9ubHlWYWx1ZXMpO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkVudiA9IE9iamVjdC5mcmVlemUoeyAuLi5leGVjdXRpb25FbnYgfSk7XG4gICAgdGhpcy5faGFzQXJncyA9IE9iamVjdC5rZXlzKHRoaXMuX2Zyb3plbkFyZ3MpLmxlbmd0aCA+IDA7XG4gICAgdGhpcy5faGFzRW52ID0gT2JqZWN0LmtleXModGhpcy5fZXhlY3V0aW9uRW52KS5sZW5ndGggPiAwO1xuICAgIHRoaXMuX2F0dGVtcHQgPSBjb250ZXh0LmF0dGVtcHQ7XG4gICAgdGhpcy5fcnVuU2lnbmFsID0gY29udGV4dC5ydW5TaWduYWw7XG4gICAgLy8gVGhlIGNvbnRleHQgbXVzdCBjYXJyeSB0aGUgcnVsZSBCRUZPUkUgdGhlIGZpcnN0IHdyaXRlLCBzaW5jZSB0aGVcbiAgICAvLyBjb250ZXh0J3Mgd3JpdGUgZnVubmVsIGlzIHdoYXQgbWFya3MgYSBwZXItY2FsbCByZWRhY3RlZCBrZXkgb24gaXQuXG4gICAgLy8gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIGNvbnRleHQgYWxyZWFkeSBoYXMgdGhlIHJ1bidzIHJ1bGUgKGluc3RhbGxlZCBvblxuICAgIC8vIHRoZSByb290LCBpbmhlcml0ZWQgZG93bikgYW5kIHRoaXMgcmUtaW5zdGFsbHMgdGhlIHNhbWUgb2JqZWN0OyBvbiBhXG4gICAgLy8gYmFyZSBjb250ZXh0IGl0IGluc3RhbGxzIGEgZnJlc2ggb25lLlxuICAgIHRoaXMuX3N0YWdlQ29udGV4dC51c2VSZWRhY3Rpb25SdWxlKHRoaXMucnVsZSk7XG5cbiAgICAvLyBSZWdpc3RlciBhcyBjb21taXQgb2JzZXJ2ZXIgc28gU2NvcGVSZWNvcmRlci5vbkNvbW1pdCBmaXJlcyB3aGVuIFN0YWdlQ29udGV4dC5jb21taXQoKSBpcyBjYWxsZWRcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQuc2V0Q29tbWl0T2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgdGhpcy5fb25Db21taXRGaXJlZChtdXRhdGlvbnMpO1xuICAgIH0pO1xuICAgIHJlZ2lzdGVyU2NvcGVSdW50aW1lKHRoaXMsIHsgdGFyZ2V0OiB0aGlzLCBoYW5kbGVzQXNzaWdubWVudHM6IGZhbHNlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWRhY3Rpb24gcnVsZSB0aGlzIGZhY2FkZSBkZWNpZGVzIHdpdGgg4oCUIHRoZSBTQU1FIG9iamVjdCBpdHNcbiAgICogYFN0YWdlQ29udGV4dGAgcmV0YWlucyB3aXRoIChgbWVtb3J5L3JlZGFjdGlvbi50c2AsIHRoZSBvbmUgb3duZXIpLiBVbmRlclxuICAgKiBhbiBleGVjdXRvciB0aGUgcnVsZSBpcyBpbnN0YWxsZWQgb24gdGhlIHJ1bnRpbWUgcm9vdCBhbmQgaW5oZXJpdGVkIGJ5XG4gICAqIGV2ZXJ5IGNvbnRleHQsIHNvIHRoZSBmYWNhZGUgc2ltcGx5IHJlYWRzIGl0LiBPbiBhIGJhcmUgY29udGV4dCAodW5pdFxuICAgKiB0ZXN0cywgaGFuZC1idWlsdCBzY29wZXMpIHRoZSBmYWNhZGUgY3JlYXRlcyBvbmUgYW5kIGluc3RhbGxzIGl0IG9uIHRoZVxuICAgKiBjb250ZXh0LCBzbyB0aGUgY29udGV4dCdzIHJldGVudGlvbiBhbmQgdGhlIGZhY2FkZSdzIHJlY29yZGVyIHZpZXdzXG4gICAqIHN0aWxsIHNoYXJlIGEgc2luZ2xlIHZlcmRpY3QuXG4gICAqL1xuICBwcml2YXRlIGdldCBydWxlKCk6IFJlZGFjdGlvblJ1bGUge1xuICAgIGNvbnN0IHNoYXJlZCA9IHRoaXMuX3N0YWdlQ29udGV4dC5nZXRSZWRhY3Rpb25SdWxlKCk7XG4gICAgaWYgKHNoYXJlZCkgcmV0dXJuIHNoYXJlZDtcbiAgICBpZiAoIXRoaXMuX2xvY2FsUnVsZSkge1xuICAgICAgdGhpcy5fbG9jYWxSdWxlID0gbmV3IFJlZGFjdGlvblJ1bGUoKTtcbiAgICAgIHRoaXMuX3N0YWdlQ29udGV4dC51c2VSZWRhY3Rpb25SdWxlKHRoaXMuX2xvY2FsUnVsZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9sb2NhbFJ1bGU7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmUgYSByZWRhY3RlZC1rZXlzIHNldCBhY3Jvc3MgbXVsdGlwbGUgU2NvcGVGYWNhZGUgaW5zdGFuY2VzLlxuICAgKiBDYWxsIHRoaXMgdG8gbWFrZSByZWRhY3Rpb24gcGVyc2lzdCBhY3Jvc3Mgc3RhZ2VzIGluIHRoZSBzYW1lIHBpcGVsaW5lLlxuICAgKiAoVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bidzIHJ1bGUgYWxyZWFkeSBzaGFyZXMgb25lIHNldDsgdGhpcyBjYWxsIGlzXG4gICAqIHRoZW4gYSBuby1vcC4pXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdXNlU2hhcmVkUmVkYWN0ZWRLZXlzKHNoYXJlZFNldDogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLnJ1bGUudXNlTWFya2VkS2V5cyhzaGFyZWRTZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgcmVkYWN0ZWQta2V5cyBzZXQgKGZvciBzaGFyaW5nIHdpdGggb3RoZXIgc2NvcGVzKS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRSZWRhY3RlZEtleXMoKTogU2V0PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnJ1bGUubWFya2VkS2V5cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGx5IGEgZGVjbGFyYXRpdmUgcmVkYWN0aW9uIHBvbGljeS4gVGhlIHBvbGljeSBpcyBhZGRpdGl2ZSDigJRcbiAgICogaXQgd29ya3MgYWxvbmdzaWRlIG1hbnVhbCBgc2V0VmFsdWUoLi4uLCB0cnVlKWAgY2FsbHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5ydWxlLnNldFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgdGhlIHJ1bidzIGNvcnJlbGF0aW9uIOKAlCBldmVyeSBzY29wZSBhbmQgZW1pdCBldmVudCB0aGlzIGZhY2FkZSBmaXJlcyBjYXJyaWVzIGl0OyBgdW5kZWZpbmVkYCBjbGVhcnNcbiAgICogaXQuIEVuZ2luZS1vbmx5ICh0aGUgY29tcG9zZWQgc2NvcGUgZmFjdG9yeSBjYWxscyBpdCBvbmNlIHBlciBzdGFnZSksIGxpa2UgYHVzZVJlZGFjdGlvblBvbGljeWAuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdXNlQ29ycmVsYXRpb24oY29ycmVsYXRpb246IFJ1bkNvcnJlbGF0aW9uIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fY29ycmVsYXRpb24gPSBjb3JyZWxhdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UmVkYWN0aW9uUG9saWN5KCk6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucnVsZS5nZXRQb2xpY3koKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxpYW5jZS1mcmllbmRseSByZXBvcnQgb2YgYWxsIHJlZGFjdGlvbiBhY3Rpdml0eS5cbiAgICogTmV2ZXIgaW5jbHVkZXMgYWN0dWFsIHZhbHVlcyDigJQgb25seSBrZXkgbmFtZXMsIGZpZWxkIG5hbWVzLCBhbmQgcGF0dGVybnMuXG4gICAqL1xuICBnZXRSZWRhY3Rpb25SZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICByZXR1cm4gdGhpcy5ydWxlLnJlcG9ydCgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNjb3BlUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyOiBTY29wZVJlY29yZGVyKTogdm9pZCB7XG4gICAgLy8gUmVwbGFjZSBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgSUQgKGlkZW1wb3RlbnQg4oCUIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZylcbiAgICB0aGlzLl9yZWNvcmRlcnMgPSB0aGlzLl9yZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgdGhpcy5fcmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICB9XG5cbiAgZGV0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWNvcmRlcnMgPSB0aGlzLl9yZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlcklkKTtcbiAgfVxuXG4gIGdldFNjb3BlUmVjb3JkZXJzKCk6IFNjb3BlUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9yZWNvcmRlcnNdO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlTdGFnZVN0YXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uU3RhZ2VTdGFydCcsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlTdGFnZUVuZChkdXJhdGlvbj86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2ludm9rZUhvb2soJ29uU3RhZ2VFbmQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlQYXVzZShwYXVzZURhdGE/OiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25QYXVzZScsIHtcbiAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgcGF1c2VEYXRhLFxuICAgICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5UmVzdW1lKGhhc0lucHV0OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25SZXN1bWUnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGhhc0lucHV0LFxuICAgICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgbm90aWZ5Q29tbWl0KG11dGF0aW9uczogQ29tbWl0RXZlbnRbJ211dGF0aW9ucyddKTogdm9pZCB7XG4gICAgdGhpcy5faW52b2tlSG9vaygnb25Db21taXQnLCB7XG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG11dGF0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZ1c2UgYSB3cml0ZSBmcm9tIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgKDkuMjIuMCkuIFRocm93cyB3aXRoIHRoZVxuICAgKiBzdGFnZSB0aGUgaGFuZGxlIGNhbWUgZnJvbTsgdGhlIGVuZ2luZSdzIGVycm9yIHBhdGggYXR0cmlidXRlcyB0aGUgdGhyb3dcbiAgICogdG8gdGhlIHN0YWdlIHRoYXQgbWFkZSB0aGUgd3JpdGUuXG4gICAqL1xuICBwcml2YXRlIGFzc2VydExpdmUoa2V5OiBzdHJpbmcsIGNoYW5uZWw6IExhdGVXcml0ZVsnY2hhbm5lbCddID0gJ3N0YXRlJyk6IHZvaWQge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoa2V5LCBjaGFubmVsKTtcbiAgICBpZiAodGhpcy5fY29tbWl0dGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZGVhZEZyYW1lTWVzc2FnZSh0aGlzLl9zdGFnZU5hbWUsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCwga2V5KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhdHRlbXB0IGZlbmNlIChQMWIpOiB0aGlzIGZhY2FkZSdzIGF0dGVtcHQgaGFzIGVuZGVkLCBzbyB3aGF0ZXZlciB0aGVcbiAgICogYWJhbmRvbmVkIGZ1bmN0aW9uIGRvZXMgbm93IG11c3Qgbm90IHJlYWNoIHRoZSBzdGFnZSDigJQgbm90IGl0cyBidWZmZXIsIGl0c1xuICAgKiByZWFkcywgaXRzIHVudHJhY2tlZCBzb3VyY2VzIG9yIGEgcmVjb3JkZXIuIFJlZnVzZWQ7IGEgd3JpdGUgb3IgYW4gZW1pdCBpc1xuICAgKiByZWNvcmRlZCBvbiB0aGUgc3RhZ2UgZmlyc3QgKGBTdGFnZVNuYXBzaG90LmxhdGVXcml0ZXNgLCB0aGUgbmFtZSBvbmx5KSxcbiAgICogYSByZWFkIChgY2hhbm5lbGAgdW5kZWZpbmVkKSBpcyBub3QuXG4gICAqL1xuICBwcml2YXRlIHJlZnVzZUlmQXR0ZW1wdEVuZGVkKGtleTogc3RyaW5nLCBjaGFubmVsPzogTGF0ZVdyaXRlWydjaGFubmVsJ10pOiB2b2lkIHtcbiAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5fYXR0ZW1wdDtcbiAgICBpZiAoYXR0ZW1wdCA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLl9zdGFnZUNvbnRleHQuaGFzQXR0ZW1wdEVuZGVkKGF0dGVtcHQuYXR0ZW1wdCkpIHJldHVybjtcbiAgICBpZiAoY2hhbm5lbCAhPT0gdW5kZWZpbmVkKSB0aGlzLl9zdGFnZUNvbnRleHQucmVjb3JkTGF0ZVdyaXRlKHsgYXR0ZW1wdDogYXR0ZW1wdC5hdHRlbXB0LCBrZXksIGNoYW5uZWwgfSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGxhdGVBdHRlbXB0TWVzc2FnZSh0aGlzLl9zdGFnZU5hbWUsIGF0dGVtcHQuc2VyaWVzLCBhdHRlbXB0LmF0dGVtcHQsIGtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhdHRlbXB0IHRoaXMgc3RhZ2UgZnVuY3Rpb24gcnVucyBpbiDigJQgYHNjb3BlLiRhdHRlbXB0KClgIChkZXNpZ25cbiAgICogwqczLjEpLiBJdHMgYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlIGF0dGVtcHQgbXVzdCBzdG9wIChpdHMgY2FwLCB0aGUgcnVuJ3NcbiAgICogZGVhZGxpbmUsIGEgY2FuY2VsbGF0aW9uKTogcGFzcyBpdCB0byBgZmV0Y2hgIGFuZCBTREsgY2FsbHMuIEl0c1xuICAgKiBgdGltZUxlZnRNcygpYCByZWFkcyB0aGUgcnVuJ3MgZGVhZGxpbmUg4oCUIHRpbWUgaXMgYW4gaW5wdXQgdGhlIHJlY29yZFxuICAgKiBjYW5ub3QgcmVwbGF5LCBzbyB3aXRoIGEgZGVhZGxpbmUgdGhlIHJlYWQgbWFya3MgdGhlIHN0YWdlJ3MgY29tbWl0XG4gICAqIGB1bnRyYWNrZWRTb3VyY2VzOiBbJ2VudiddYCwgYXMgYGdldEVudigpYCBkb2VzLlxuICAgKlxuICAgKiBBIHN0YWdlIHRoZSBhdHRlbXB0IHJ1bm5lciBkb2VzIG5vdCBydW4gKG5vIHJldHJ5IHBvbGljeSwgbm8gYHRpbWVvdXRNc2AsXG4gICAqIG5vIGRlYWRsaW5lKSBpcyBhdHRlbXB0IDEgb2YgMSwgd2l0aCB0aGUgcnVuJ3Mgc2lnbmFsIGFuZCBgSW5maW5pdHlgIGxlZnQuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdCA9IHNjb3BlLiRhdHRlbXB0KCk7XG4gICAqIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IHQuc2lnbmFsIH0pO1xuICAgKiBpZiAodC50aW1lTGVmdE1zKCkgPCAxXzAwMCkgc2NvcGUuc3VtbWFyeSA9ICdwYXJ0aWFsJztcbiAgICogYGBgXG4gICAqL1xuICBnZXRBdHRlbXB0KCk6IEF0dGVtcHRDb250ZXh0IHtcbiAgICBjb25zdCBhdHRlbXB0ID0gdGhpcy5fYXR0ZW1wdDtcbiAgICBjb25zdCBvYnNlcnZlZCA9IChyZXBvcnQ6IE9ic2VydmVkQXR0ZW1wdCkgPT4gdGhpcy5yZWNvcmRPYnNlcnZlZChyZXBvcnQpO1xuICAgIGlmIChhdHRlbXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2VyaWVzOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIGF0dGVtcHQ6IDEsXG4gICAgICAgIG9mOiAxLFxuICAgICAgICBzaWduYWw6IHRoaXMuX3J1blNpZ25hbCA/PyBORVZFUl9BQk9SVEVELFxuICAgICAgICB0aW1lTGVmdE1zOiAoKSA9PiBJbmZpbml0eSxcbiAgICAgICAgb2JzZXJ2ZWQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZCgnJGF0dGVtcHQnKTtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fc3RhZ2VDb250ZXh0O1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgIC4uLmF0dGVtcHQsXG4gICAgICB0aW1lTGVmdE1zOiAoKSA9PiB7XG4gICAgICAgIC8vIFJlYWQgdGhyb3VnaCBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIGF0dGVtcHQsIGl0IG11c3Qgbm90IG1hcmsgYSBMQVRFUiBhdHRlbXB0J3MgY29tbWl0LlxuICAgICAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKCckYXR0ZW1wdCcpO1xuICAgICAgICBpZiAoYXR0ZW1wdC5kZWFkbGluZSAhPT0gdW5kZWZpbmVkKSBjb250ZXh0Lm1hcmtVbnRyYWNrZWRTb3VyY2UoJ2VudicpO1xuICAgICAgICByZXR1cm4gYXR0ZW1wdC50aW1lTGVmdE1zKCk7XG4gICAgICB9LFxuICAgICAgb2JzZXJ2ZWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQSBjYWxsIHRvIGFuIG91dHNpZGUgc3lzdGVtLCBtYWRlIGluc2lkZSB0aGlzIHN0YWdlIOKAlCBgc2NvcGUuJGNhbGwodGFyZ2V0LCBmbiwgcG9saWN5PylgIChkZXNpZ24gwqczLjYsIFAyKS5cbiAgICogYGZuYCBydW5zIG9uIHRoZSBhdHRlbXB0IHJ1bm5lciB1bmRlciBgcG9saWN5YCAobm9uZSA9IE9ORSBhdHRlbXB0LCBzdGlsbCByZWNvcmRlZDogYSBzaW5nbGUgY2FsbCBpcyBldmlkZW5jZVxuICAgKiB0b28pLCBhbmQgZXZlcnkgYXR0ZW1wdCBpcyBhbiBgQXR0ZW1wdFJlY29yZGAgb2Yga2luZCBgJ2NhbGwnYCBvbiB0aGlzIHN0YWdlJ3MgZXhlY3V0aW9uLXRyZWUgbm9kZSBhbmQgb25cbiAgICogYG9uQXR0ZW1wdGAg4oCUIGl0cyB0aW1pbmcsIG91dGNvbWUsIGZhaWx1cmUgY2F0ZWdvcnkgYW5kIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uLCBpdHMgZXJyb3Igc2VydmVkIHVuZGVyIHRoZVxuICAgKiBydW4ncyByZWRhY3Rpb24gcnVsZS5cbiAgICpcbiAgICogVGhlIGNhbGwgbGl2ZXMgd2l0aGluIHRoaXMgc3RhZ2UgYXR0ZW1wdDogaXQgaXMgY2FwcGVkIGJ5IHRoZSB0aW1lIHRoZSBhdHRlbXB0IGhhcyBsZWZ0IChpdHMgY2FwLCB0aGUgcnVuJ3NcbiAgICogZGVhZGxpbmUpIGFuZCBgZm5gJ3MgYHNpZ25hbGAgYWJvcnRzIHdoZW4gdGhlIGF0dGVtcHQgZG9lczsgb25jZSB0aGUgYXR0ZW1wdCBpcyBvdmVyIG5vdGhpbmcgb2YgdGhlIGNhbGwgbGFuZHNcbiAgICogYW5kIG5vIGZ1cnRoZXIgYXR0ZW1wdCBvZiBpdCBzdGFydHMgKGBhdHRlbXB0L2NhbGwudHNgKS4gYHRhcmdldGAgaXMgYSBOQU1FIGZyb20gY29kZSDigJQgbmV2ZXIgYSB2YWx1ZS5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBxdW90ZSA9IGF3YWl0IHNjb3BlLiRjYWxsKCdzdHJpcGUucXVvdGVzLmNyZWF0ZScsICh0KSA9PiBzdHJpcGUucXVvdGVzLmNyZWF0ZShib2R5LCB7IHNpZ25hbDogdC5zaWduYWwgfSksXG4gICAqICAgeyBhdHRlbXB0czogMywgdGltZW91dE1zOiAxMF8wMDAsIGJhY2tvZmZNczogKG4pID0+IDUwMCAqIG4gfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBBIGNhbGwgdGhhdCBDSEFOR0VTIGFuIG91dHNpZGUgc3lzdGVtIGRlY2xhcmVzIGl0IChQMyk6IGBvcHRpb25zLnRvdWNoZXNgIG5hbWVzIHRoZSBzeXN0ZW0gYW5kXG4gICAqIGBvcHRpb25zLmlkZW1wb3RlbmN5S2V5YCB0aGUga2V5IGV2ZXJ5IGF0dGVtcHQgaXMgbWFkZSB1bmRlciAoYHQuaWRlbXBvdGVuY3lLZXlgKSDigJQgYSB2YWx1ZSBmcm9tIHRoZSBzdGFnZSdzXG4gICAqIGlucHV0IG9yIHN0YXRlLCBuZXZlciBmcm9tIG1vZGVsIG91dHB1dC4gQSB0b3VjaGluZyBjYWxsIHRoYXQgbWF5IHJldHJ5IHdpdGhvdXQgYSBrZXkgaXMgcmVmdXNlZCBoZXJlLFxuICAgKiBiZWZvcmUgYW55dGhpbmcgaXMgc2VudDsgZWFjaCByZWNvcmQgc2F5cyB3aGF0IGl0cyBhdHRlbXB0IGRpZCAoYGVmZmVjdGApLCBhbmQgYSBjYWxsIHRoYXQgZW5kcyB3aXRob3V0IGFuIGFuc3dlciBhZnRlciBhbnkgYXR0ZW1wdCBsZWZ0IHRoZVxuICAgKiBlZmZlY3QgdW5rbm93biByZWplY3RzIHdpdGggYFVua25vd25FZmZlY3RFcnJvcmAg4oCUIHJlY29uY2lsZSBieSB0aGUga2V5LCBkbyBub3QgcmV0cnkgYmxpbmRseS5cbiAgICovXG4gIGNhbGw8VD4oXG4gICAgdGFyZ2V0OiBzdHJpbmcsXG4gICAgZm46IChhdHRlbXB0OiBBdHRlbXB0Q29udGV4dCkgPT4gUHJvbWlzZTxUPiB8IFQsXG4gICAgcG9saWN5PzogUmV0cnlQb2xpY3ksXG4gICAgb3B0aW9ucz86IENhbGxPcHRpb25zLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBuYW1lID0gYWRtaXRBdHRlbXB0TmFtZSgnJGNhbGwnLCAndGFyZ2V0JywgdGFyZ2V0KTtcbiAgICBjb25zdCB3aGVyZSA9IGAkY2FsbCgnJHtuYW1lfScpYDtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGAke3doZXJlfTogZm4gbXVzdCBiZSBhIGZ1bmN0aW9uYCk7XG4gICAgY29uc3QgYWRtaXR0ZWQgPSBhZG1pdENhbGxQb2xpY3kod2hlcmUsIHBvbGljeSk7XG4gICAgY29uc3QgdG91Y2hlcyA9IGNhbGxUb3VjaGVzKHdoZXJlLCBvcHRpb25zLCBhZG1pdHRlZCk7XG4gICAgLy8gQSBrZXlsZXNzIHRvdWNoaW5nIGNhbGwgaXMgc2VudCBvbmNlIG9ubHkgaWYgdGhlIHN0YWdlIGF0dGVtcHQgdGhhdCBtYWtlcyBpdCBuZXZlciBydW5zIGFnYWluIChQMyk6IGEgc3RhZ2VcbiAgICAvLyB0aGF0IG1heSByZXRyeSB3b3VsZCByZS1zZW5kIGl0IHdpdGhvdXQgYSBrZXkg4oCUIHJlZnVzZWQgaGVyZSwgYmVmb3JlIGFueXRoaW5nIGlzIHNlbnQuXG4gICAgLy8gU28gaXMgb25lIGluc2lkZSBhbiBlbmNsb3NpbmcgYCRjYWxsYCB0aGF0IG1heSByZXRyeSAoaXRzIGZ1bmN0aW9uIHJ1bnMgb25jZSBwZXIgb3V0ZXIgYXR0ZW1wdCkuXG4gICAgaWYgKHRvdWNoZXMgIT09IHVuZGVmaW5lZCAmJiB0b3VjaGVzLmlkZW1wb3RlbmN5S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGVuY2xvc2luZyA9ICh0aGlzLl9hdHRlbXB0Py5vZiA/PyAxKSA+IDEgPyAnYSBzdGFnZScgOiB0aGlzLl9yZXRyeWluZ0NhbGxzID4gMCA/ICdhICRjYWxsJyA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbmNsb3NpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGAke3doZXJlfTogdG91Y2hlcyBcIiR7dG91Y2hlcy5zeXN0ZW19XCIgd2l0aCBubyBpZGVtcG90ZW5jeUtleSwgaW5zaWRlICR7ZW5jbG9zaW5nfSB0aGF0IG1heSByZXRyeSDigJQgYSBgICtcbiAgICAgICAgICAgICdyZXRyeSB3b3VsZCBzZW5kIGl0IGFnYWluIHdpdGhvdXQgYSBrZXkuIEdpdmUgdGhlIGNhbGwgYSBrZXkuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrS2V5bGVzc0VmZmVjdCgpO1xuICAgIH1cbiAgICAvLyBGcm9tIGFuIGVuZGVkIGF0dGVtcHQgb3IgYSBjb21taXR0ZWQgZnJhbWU6IHJlZnVzZWQgKGFuZCByZWNvcmRlZCBieSBuYW1lKSBiZWZvcmUgYW55dGhpbmcgcmVhY2hlcyBvdXRzaWRlLlxuICAgIHRoaXMucmVmdXNlTGF0ZUNhbGwoYGNhbGw6JHtuYW1lfWApO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9zdGFnZUNvbnRleHQ7XG4gICAgY29uc3Qgc3RhZ2VBdHRlbXB0ID0gdGhpcy5fYXR0ZW1wdD8uYXR0ZW1wdCA/PyAxO1xuICAgIGNvbnN0IHNpZ25hbCA9IHRoaXMuX2F0dGVtcHQ/LnNpZ25hbCA/PyB0aGlzLl9ydW5TaWduYWw7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBhdHRlbXB0RW5kc0F0KHRoaXMuX2F0dGVtcHQpO1xuICAgIGNvbnN0IGVuZGVkID0gY29udGV4dC5jYWxsc0VuZGVkU2lnbmFsKHN0YWdlQXR0ZW1wdCk7XG4gICAgLy8gV2hpbGUgYSBjYWxsIHRoYXQgbWF5IHJldHJ5IGlzIGluIGZsaWdodCwgYSBrZXlsZXNzIHRvdWNoaW5nIGNhbGwgbWFkZSBpbnNpZGUgaXQgaXMgcmVmdXNlZCAoYWJvdmUpLlxuICAgIGNvbnN0IHJldHJ5aW5nID0gYXR0ZW1wdENlaWxpbmcoYWRtaXR0ZWQuYXR0ZW1wdHMpID4gMTtcbiAgICBpZiAocmV0cnlpbmcpIHRoaXMuX3JldHJ5aW5nQ2FsbHMgKz0gMTtcbiAgICBsZXQgcmVzdWx0OiBQcm9taXNlPFQ+O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSB0aGlzLnN0YXJ0Q2FsbChuYW1lLCBmbiwgYWRtaXR0ZWQsIHRvdWNoZXMsIHN0YWdlQXR0ZW1wdCwgc2lnbmFsLCBkZWFkbGluZSwgZW5kZWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAocmV0cnlpbmcpIHRoaXMuX3JldHJ5aW5nQ2FsbHMgLT0gMTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBpZiAoIXJldHJ5aW5nKSByZXR1cm4gcmVzdWx0O1xuICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9yZXRyeWluZ0NhbGxzIC09IDE7XG4gICAgfTtcbiAgICByZXN1bHQudGhlbihyZWxlYXNlLCByZWxlYXNlKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqIGBydW5DYWxsYCB3aXRoIHRoaXMgc3RhZ2UgYXR0ZW1wdCBhcyBpdHMgaG9zdCAoYGNhbGxgKS4gKi9cbiAgcHJpdmF0ZSBzdGFydENhbGw8VD4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGZuOiAoYXR0ZW1wdDogQXR0ZW1wdENvbnRleHQpID0+IFByb21pc2U8VD4gfCBULFxuICAgIGFkbWl0dGVkOiBSZXRyeVBvbGljeSxcbiAgICB0b3VjaGVzOiB7IHJlYWRvbmx5IHN5c3RlbTogc3RyaW5nOyByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZyB9IHwgdW5kZWZpbmVkLFxuICAgIHN0YWdlQXR0ZW1wdDogbnVtYmVyLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4gICAgZGVhZGxpbmU6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBlbmRlZDogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9zdGFnZUNvbnRleHQ7XG4gICAgY29uc3QgbG9vcCA9IHRha2VSZXRyeUxvb3BDYWxsKHRoaXMpO1xuICAgIHJldHVybiBydW5DYWxsKG5hbWUsIGZuLCBhZG1pdHRlZCwge1xuICAgICAgb3BlblNlcmllczogKCkgPT4gY2FsbFNlcmllcyhjb250ZXh0LnJ1bnRpbWVTdGFnZUlkLCBzdGFnZUF0dGVtcHQsIGNvbnRleHQubmV4dENhbGxPcmRpbmFsKHN0YWdlQXR0ZW1wdCkpLFxuICAgICAgLi4uKHNpZ25hbCAhPT0gdW5kZWZpbmVkICYmIHsgc2lnbmFsIH0pLFxuICAgICAgLi4uKGRlYWRsaW5lICE9PSB1bmRlZmluZWQgJiYgeyBkZWFkbGluZSB9KSxcbiAgICAgIGVuZGVkLFxuICAgICAgLi4uKHRvdWNoZXMgIT09IHVuZGVmaW5lZCAmJiB7IGVmZmVjdDogdGhpcy5jYWxsRWZmZWN0KHRvdWNoZXMpIH0pLFxuICAgICAgLy8gVGhlIGZyYW1lJ3Mgb3duIGNvbW1pdCBzdGF0ZSAoZXZlcnkgYXR0ZW1wdCdzIGZhY2FkZSByZWFkcyB0aGUgc2FtZSksIG5ldmVyIGEgZmFjYWRlIGZsYWcuXG4gICAgICBhZG1pdHM6IChjdXQpID0+ICFjb250ZXh0LmNvbW1pdHRlZCAmJiAoY3V0IHx8ICEoZW5kZWQuYWJvcnRlZCB8fCB0aGlzLmF0dGVtcHRIYXNFbmRlZCgpKSksXG4gICAgICBzZXJ2ZTogKGVycm9yKSA9PiB0aGlzLnJ1bGUuc2VydmVkRXJyb3IoZXJyb3IpLFxuICAgICAgcmVwb3J0OiAocmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3IpID0+IHtcbiAgICAgICAgY29uc3Qgc2VydmVkID0gbG9vcCA/IE9iamVjdC5mcmVlemUoeyAuLi5yZWNvcmQsIHJldHJ5TG9vcDogbG9vcC5pZGVudGl0eSB9KSA6IHJlY29yZDtcbiAgICAgICAgY29udGV4dC5yZXBvcnRDYWxsQXR0ZW1wdChzZXJ2ZWQsIHN0cnVjdHVyZWRFcnJvcik7XG4gICAgICAgIGxvb3A/LnJlY29yZChzZXJ2ZWQpO1xuICAgICAgfSxcbiAgICAgIHJlZnVzZWQ6ICgpID0+IGNvbnRleHQucmVjb3JkTGF0ZVdyaXRlKHsgYXR0ZW1wdDogc3RhZ2VBdHRlbXB0LCBrZXk6IGBjYWxsOiR7bmFtZX1gLCBjaGFubmVsOiAnYXR0ZW1wdCcgfSksXG4gICAgICBvYnNlcnZlOiAocmVwb3J0LCBhdCkgPT4gdGhpcy5yZWNvcmRPYnNlcnZlZChyZXBvcnQsIGF0LmVuZGVkKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgVGhlIGV4cGxpY2l0IHJldHJ5IGhlbHBlciBvd25zIHRoaXMgc3RhdGU7IHRoZSBub3JtYWwgd3JpdGUgcGF0aCBzdGlsbCBvd25zIHJldGVudGlvbi9jb21taXQuICovXG4gIHdyaXRlUmV0cnlMb29wU3RhdGUoa2V5OiBzdHJpbmcsIHN0YXRlOiB7IHJlYWRvbmx5IGlkZW1wb3RlbmN5S2V5OiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLnNlcnZlUmV0cnlMb29wS2V5KHN0YXRlLmlkZW1wb3RlbmN5S2V5KTtcbiAgICBpZiAoa2VwdCAhPT0gc3RhdGUuaWRlbXBvdGVuY3lLZXkpIHRoaXMucnVsZS5pbmhlcml0RmllbGRzKGtleSwgWydpZGVtcG90ZW5jeUtleSddKTtcbiAgICB0aGlzLnNldFZhbHVlKGtleSwgc3RhdGUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBFeGFjdGx5IHRoZSBleGlzdGluZyBQMyBrZXktcmV0ZW50aW9uIGxhdzsgb3BlcmF0aW9uYWwgc3RhdGUga2VlcHMgdGhlIHJlYWwga2V5LiAqL1xuICBzZXJ2ZVJldHJ5TG9vcEtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucnVsZS5yZXRhaW5JZGVtcG90ZW5jeUtleShrZXksIHtcbiAgICAgIGlucHV0OiB0aGlzLl9yZWFkT25seVZhbHVlcyxcbiAgICAgIHNlbGVjdGVkUmVhZHM6IHRoaXMuX3N0YWdlQ29udGV4dC5zZWxlY3RlZFJlYWRzICsgKHRoaXMuX3N0YWdlQ29udGV4dC5lZmZlY3RLZXlUYWludGVkID8gMSA6IDApLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBMb29wIHN0YXRlIGlzIGR1cmFibGUgZGF0YTogbmV2ZXIgcGVyc2lzdCB0aGUgdGhyb3duIHZhbHVlLCBzdGFjaywgY2F1c2Ugb3IgcGF5bG9hZC4gKi9cbiAgc2VydmVSZXRyeUxvb3BFcnJvcihlcnJvcjogdW5rbm93bik6IEF0dGVtcHRFcnJvciB7XG4gICAgY29uc3Qgc2VydmVkID0gdGhpcy5ydWxlLnNlcnZlZEVycm9yKGVycm9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgbWVzc2FnZTogc2VydmVkLm1lc3NhZ2UsXG4gICAgICAuLi4oc2VydmVkLm5hbWUgIT09IHVuZGVmaW5lZCA/IHsgbmFtZTogc2VydmVkLm5hbWUgfSA6IHt9KSxcbiAgICAgIC4uLihzZXJ2ZWQuY29kZSAhPT0gdW5kZWZpbmVkID8geyBjb2RlOiBzZXJ2ZWQuY29kZSB9IDoge30pLFxuICAgIH07XG4gIH1cblxuICAvKiogQSB0b3VjaGluZyBjYWxsJ3MgdGFyZ2V0LCBpdHMga2V5IHNlcnZlZCBmb3IgdGhlIHJlY29yZHMgKGBSZWRhY3Rpb25SdWxlIMK3IHJldGFpbklkZW1wb3RlbmN5S2V5YDogYnkgbmFtZSBhbmQgYnkgaXRzIHNvdXJjZXMpLiAqL1xuICBwcml2YXRlIGNhbGxFZmZlY3QodG91Y2hlczogeyByZWFkb25seSBzeXN0ZW06IHN0cmluZzsgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmcgfSk6IHtcbiAgICByZWFkb25seSBzeXN0ZW06IHN0cmluZztcbiAgICByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcbiAgICByZWFkb25seSByZWNvcmRlZEtleT86IHN0cmluZztcbiAgfSB7XG4gICAgY29uc3Qga2V5ID0gdG91Y2hlcy5pZGVtcG90ZW5jeUtleTtcbiAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHJldHVybiB0b3VjaGVzO1xuICAgIC8vIEEga2V5IHRoZSBzdGFnZSBidWlsdCBhZnRlciByZWFkaW5nIGEgc2VsZWN0ZWQgdmFsdWUg4oCUIG9yIGZyb20gYW4gaW5wdXQgaG9sZGluZyBvbmUg4oCUIGlzIHNlcnZlZCB3aG9sZS5cbiAgICBjb25zdCByZWNvcmRlZEtleSA9IHRoaXMucnVsZS5yZXRhaW5JZGVtcG90ZW5jeUtleShrZXksIHtcbiAgICAgIGlucHV0OiB0aGlzLl9yZWFkT25seVZhbHVlcyxcbiAgICAgIC8vIFRoZSBzdGFnZSdzIG93biBrZXkgbWF5IGJlIG1hZGUgb2YgYSBzZWxlY3RlZCB2YWx1ZTogYSBrZXkgcGFzc2VkIG9uIGZyb20gaXQgaXMgc2VydmVkIHRoZSBzYW1lIHdheS5cbiAgICAgIHNlbGVjdGVkUmVhZHM6IHRoaXMuX3N0YWdlQ29udGV4dC5zZWxlY3RlZFJlYWRzICsgKHRoaXMuX3N0YWdlQ29udGV4dC5lZmZlY3RLZXlUYWludGVkID8gMSA6IDApLFxuICAgIH0pO1xuICAgIHJldHVybiB7IC4uLnRvdWNoZXMsIHJlY29yZGVkS2V5IH07XG4gIH1cblxuICAvKipcbiAgICogQSBgJGNhbGxgIGZyb20gYW4gZW5kZWQgYXR0ZW1wdCwgb3IgZnJvbSBhIGZyYW1lIHRoYXQgaGFzIGNvbW1pdHRlZDogcmVjb3JkZWQgYnkgbmFtZSAoYGxhdGVXcml0ZXNgLCBjaGFubmVsXG4gICAqIGAnYXR0ZW1wdCdgKSBhbmQgcmVmdXNlZCDigJQgYmVmb3JlIGFueXRoaW5nIHJlYWNoZXMgb3V0c2lkZS4gVGhlIFAxYiBmZW5jZSBmaXJzdCwgc28gaXRzIG1lc3NhZ2UgYW5kIHJlY29yZCBhcmVcbiAgICogdGhlIHNhbWUuXG4gICAqL1xuICBwcml2YXRlIHJlZnVzZUxhdGVDYWxsKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChrZXksICdhdHRlbXB0Jyk7XG4gICAgaWYgKCF0aGlzLl9zdGFnZUNvbnRleHQuY29tbWl0dGVkICYmICF0aGlzLl9jb21taXR0ZWQpIHJldHVybjtcbiAgICB0aGlzLl9zdGFnZUNvbnRleHQucmVjb3JkTGF0ZVdyaXRlKHsgYXR0ZW1wdDogdGhpcy5fYXR0ZW1wdD8uYXR0ZW1wdCA/PyAxLCBrZXksIGNoYW5uZWw6ICdhdHRlbXB0JyB9KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZGVhZEZyYW1lTWVzc2FnZSh0aGlzLl9zdGFnZU5hbWUsIHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCwga2V5KSk7XG4gIH1cblxuICAvKipcbiAgICogQW4gb3V0c2lkZSBhdHRlbXB0IGFuIGFkYXB0ZXIgcmVwb3J0ZWQg4oCUIGBBdHRlbXB0Q29udGV4dC5vYnNlcnZlZGAgb24gdGhpcyBzdGFnZSdzIGF0dGVtcHQgb3Igb24gb25lIG9mIGl0c1xuICAgKiBjYWxscycgKFAyKS4gUmVhZCBhbmQgdmFsaWRhdGVkIGZpcnN0IChhIG1hbGZvcm1lZCByZXBvcnQgaXMgdGhlIGFkYXB0ZXIncyBidWc6IGEgYFR5cGVFcnJvcmAsIGFuZCBpdCBuZXZlclxuICAgKiByZWFjaGVzIHRoZSByZWNvcmQpLiBBIHJlcG9ydCB0aGF0IGNvbWVzIGFmdGVyIGl0cyBhdHRlbXB0IGVuZGVkIOKAlCB0aGUgY2FsbCBhdHRlbXB0IGl0IHdhcyBtYWRlIHRocm91Z2gsIHRoaXNcbiAgICogc3RhZ2UgYXR0ZW1wdCwgb3IgdGhlIGZyYW1lJ3MgY29tbWl0IOKAlCBpcyByZWNvcmRlZCBieSBuYW1lIChgbGF0ZVdyaXRlc2AsIGNoYW5uZWwgYCdhdHRlbXB0J2ApIGFuZCBEUk9QUEVELFxuICAgKiBuZXZlciB0aHJvd246IGFkYXB0ZXJzIHJlcG9ydCBmcm9tIGFuIFNESydzIG93biBjYWxsYmFja3MsIHdoaWNoIG1heSBmaXJlIGFmdGVyIHRoZSBzdGFnZSBtb3ZlZCBvbiwgYW5kIGFuXG4gICAqIG9ic2VydmVkIGF0dGVtcHQgbmV2ZXIgY2hhbmdlcyBjb250cm9sIGZsb3cg4oCUIGluIGVpdGhlciBkaXJlY3Rpb24uIEl0cyBzZXJpZXMgb3BlbnMgYXQgdGhpcyBzdGFnZSBhdHRlbXB0J3MgY2FsbFxuICAgKiBsZXZlbDogYW4gU0RLJ3MgY2FsbCBpcyBhIGNhbGwgdGhlIHN0YWdlIGF0dGVtcHQgbWFkZSwgc28gYSByZXBvcnQgbWFkZSB0aHJvdWdoIGEgYCRjYWxsYCBpcyB0aGF0IGNhbGwncyBzaWJsaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZWNvcmRPYnNlcnZlZChyZXBvcnQ6IE9ic2VydmVkQXR0ZW1wdCwgY2FsbEF0dGVtcHRFbmRlZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgcmVhZCA9IHJlYWRPYnNlcnZlZFJlcG9ydChyZXBvcnQpO1xuICAgIGNvbnN0IGtleSA9IGBvYnNlcnZlZDoke3JlYWQudGFyZ2V0fWA7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMuX3N0YWdlQ29udGV4dDtcbiAgICBjb25zdCBzdGFnZUF0dGVtcHQgPSB0aGlzLl9hdHRlbXB0Py5hdHRlbXB0ID8/IDE7XG4gICAgaWYgKGNhbGxBdHRlbXB0RW5kZWQgfHwgdGhpcy5hdHRlbXB0SGFzRW5kZWQoKSB8fCBjb250ZXh0LmNvbW1pdHRlZCB8fCB0aGlzLl9jb21taXR0ZWQpIHtcbiAgICAgIGNvbnRleHQucmVjb3JkTGF0ZVdyaXRlKHsgYXR0ZW1wdDogc3RhZ2VBdHRlbXB0LCBrZXksIGNoYW5uZWw6ICdhdHRlbXB0JyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYm9vayA9ICh0aGlzLl9vYnNlcnZlZEJvb2sgPz89IG5ldyBPYnNlcnZlZFNlcmllc0Jvb2soKCkgPT5cbiAgICAgIGNhbGxTZXJpZXMoY29udGV4dC5ydW50aW1lU3RhZ2VJZCwgc3RhZ2VBdHRlbXB0LCBjb250ZXh0Lm5leHRDYWxsT3JkaW5hbChzdGFnZUF0dGVtcHQpKSxcbiAgICApKTtcbiAgICBjb25zdCB7IHJlY29yZCwgc3RydWN0dXJlZEVycm9yIH0gPSBvYnNlcnZlZFJlY29yZChyZWFkLCB7XG4gICAgICBzZXJpZXM6IGJvb2suc2VyaWVzRm9yKHJlYWQpLFxuICAgICAgbm93OiBEYXRlLm5vdyxcbiAgICAgIHNlcnZlOiAoZXJyb3IpID0+IHRoaXMucnVsZS5zZXJ2ZWRFcnJvcihlcnJvciksXG4gICAgfSk7XG4gICAgY29udGV4dC5yZXBvcnRDYWxsQXR0ZW1wdChyZWNvcmQsIHN0cnVjdHVyZWRFcnJvcik7XG4gIH1cblxuICAvKiogVGhpcyBmYWNhZGUncyBhdHRlbXB0IGhhcyBlbmRlZCDigJQgdGhlIFAxYiBmZW5jZSBpcyBjbG9zZWQuICovXG4gIHByaXZhdGUgYXR0ZW1wdEhhc0VuZGVkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGF0dGVtcHQgPSB0aGlzLl9hdHRlbXB0O1xuICAgIHJldHVybiBhdHRlbXB0ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fc3RhZ2VDb250ZXh0Lmhhc0F0dGVtcHRFbmRlZChhdHRlbXB0LmF0dGVtcHQpO1xuICB9XG5cbiAgLyoqIENhbGxlZCBieSBTdGFnZUNvbnRleHQuY29tbWl0KCkgb2JzZXJ2ZXIuIENvbnZlcnRzIHRyYWNrZWQgd3JpdGVzIHRvIENvbW1pdEV2ZW50IGZvcm1hdC5cbiAgICogIEVycm9ycyBhcmUgY2F1Z2h0IHRvIHByZXZlbnQgcmVjb3JkZXIgaXNzdWVzIGZyb20gYWJvcnRpbmcgdGhlIHRyYXZlcnNhbC4gKi9cbiAgcHJpdmF0ZSBfb25Db21taXRGaXJlZChtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+KTogdm9pZCB7XG4gICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGBfc3RhZ2VXcml0ZXNgIGFscmVhZHkgaG9sZHMgdGhlIHJldGFpbmVkIGZvcm0gKHRoZSBjb250ZXh0IHJldGFpbnNcbiAgICAgIC8vIHVuZGVyIHRoZSBzYW1lIHJ1bGUpOyBhcHBseWluZyB0aGUgdmVyZGljdCBhZ2FpbiBoZXJlIGlzIGlkZW1wb3RlbnRcbiAgICAgIC8vIGFuZCBrZWVwcyBhIGtleSBtYXJrZWQgQUZURVIgaXRzIHdyaXRlIHNjcnViYmVkIGF0IGNvbW1pdCB0aW1lLlxuICAgICAgY29uc3QgY29tbWl0TXV0YXRpb25zOiBDb21taXRFdmVudFsnbXV0YXRpb25zJ10gPSBPYmplY3QuZW50cmllcyhtdXRhdGlvbnMpLm1hcCgoW2tleSwgZW50cnldKSA9PiAoe1xuICAgICAgICBrZXksXG4gICAgICAgIHZhbHVlOiB0aGlzLnJ1bGUucmV0YWluKFtrZXldLCBlbnRyeS52YWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogZW50cnkub3BlcmF0aW9uLFxuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLm5vdGlmeUNvbW1pdChjb21taXRNdXRhdGlvbnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3dhbGxvdyDigJQgcmVjb3JkZXIgZXJyb3JzIG11c3Qgbm90IGFib3J0IHRoZSB0cmF2ZXJzYWwuXG4gICAgICAvLyBJbmRpdmlkdWFsIHJlY29yZGVyIGVycm9ycyBhcmUgYWxyZWFkeSBpc29sYXRlZCBieSBfaW52b2tlSG9vay5cbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRGVidWcgLyBEaWFnbm9zdGljcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gVGhlc2UgbGVnYWN5IG1ldGhvZHMgc3RpbGwgd3JpdGUgdG8gdGhlIGBTdGFnZUNvbnRleHRgIGRpYWdub3N0aWNcbiAgLy8gc2lkZSBiYWdzIChsb2dDb250ZXh0IC8gZXJyb3JDb250ZXh0IC8gbWV0cmljQ29udGV4dCAvIGV2YWxDb250ZXh0KSBmb3JcbiAgLy8gc25hcHNob3QgaW5jbHVzaW9uLiBUaGV5IEFMU08gZmlyZSB0aHJvdWdoIHRoZSBFbWl0IGNoYW5uZWwgc28gYW55XG4gIC8vIGF0dGFjaGVkIGBFbWl0UmVjb3JkZXJgIHNlZXMgdGhlbSBpbiByZWFsIHRpbWUg4oCUIGNsb3NpbmcgdGhlXG4gIC8vIGxvbmctc3RhbmRpbmcgZ2FwIHdoZXJlIGAkZGVidWdgL2AkbWV0cmljYCB3ZW50IHRvIHVub2JzZXJ2ZWQgYmFncy5cblxuICBhZGREZWJ1Z0luZm8oa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChgbG9nLmRlYnVnLiR7a2V5fWAsICdlbWl0Jyk7XG4gICAgY29uc3Qga2VwdCA9IHRoaXMuX3N0YWdlQ29udGV4dC5hZGREaWFnbm9zdGljKCdsb2dzJywga2V5LCB2YWx1ZSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoYGxvZy5kZWJ1Zy4ke2tleX1gLCB7IGtleSwgdmFsdWU6IGtlcHQsIGxldmVsOiAnZGVidWcnIH0pO1xuICB9XG5cbiAgYWRkRGVidWdNZXNzYWdlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZCgnbG9nLmRlYnVnLm1lc3NhZ2VzJywgJ2VtaXQnKTtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmFkZERpYWdub3N0aWMoJ2xvZ3MnLCAnbWVzc2FnZXMnLCBbdmFsdWVdKTtcbiAgICB0aGlzLmVtaXRFdmVudCgnbG9nLmRlYnVnLm1lc3NhZ2VzJywgeyB2YWx1ZTogQXJyYXkuaXNBcnJheShrZXB0KSA/IGtlcHRbMF0gOiBrZXB0LCBsZXZlbDogJ2RlYnVnJyB9KTtcbiAgfVxuXG4gIGFkZEVycm9ySW5mbyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGBsb2cuZXJyb3IuJHtrZXl9YCwgJ2VtaXQnKTtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmFkZERpYWdub3N0aWMoJ2Vycm9ycycsIGtleSwgdmFsdWUpO1xuICAgIHRoaXMuZW1pdEV2ZW50KGBsb2cuZXJyb3IuJHtrZXl9YCwgeyBrZXksIHZhbHVlOiBrZXB0LCBsZXZlbDogJ2Vycm9yJyB9KTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChgbWV0cmljLiR7bWV0cmljTmFtZX1gLCAnZW1pdCcpO1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLl9zdGFnZUNvbnRleHQuYWRkRGlhZ25vc3RpYygnbWV0cmljcycsIG1ldHJpY05hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmVtaXRFdmVudChgbWV0cmljLiR7bWV0cmljTmFtZX1gLCB7IG5hbWU6IG1ldHJpY05hbWUsIHZhbHVlOiBrZXB0IH0pO1xuICB9XG5cbiAgYWRkRXZhbChtZXRyaWNOYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChgZXZhbC4ke21ldHJpY05hbWV9YCwgJ2VtaXQnKTtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LmFkZERpYWdub3N0aWMoJ2V2YWxzJywgbWV0cmljTmFtZSwgdmFsdWUpO1xuICAgIHRoaXMuZW1pdEV2ZW50KGBldmFsLiR7bWV0cmljTmFtZX1gLCB7IG5hbWU6IG1ldHJpY05hbWUsIHZhbHVlOiBrZXB0IH0pO1xuICB9XG5cbiAgLy8g4pSA4pSAIEVtaXQg4oCUIFBoYXNlIDMgcHJpbWFyeSBwcmltaXRpdmUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEZpcmUgYSBzdHJ1Y3R1cmVkIGV2ZW50IHRvIGV2ZXJ5IGF0dGFjaGVkIHJlY29yZGVyIGltcGxlbWVudGluZ1xuICAgKiBgb25FbWl0YC4gU3luY2hyb25vdXMsIGluLW9yZGVyLCBwYXNzLXRocm91Z2gg4oCUIG5vIGJ1ZmZlcmluZy5cbiAgICpcbiAgICogLSAqKkZhc3QtcGF0aCoqOiB6ZXJvIGFsbG9jYXRpb24gKyB6ZXJvIGNvc3Qgd2hlbiBubyByZWNvcmRlcnMgYXJlXG4gICAqICAgYXR0YWNoZWQgKGVhcmx5IHJldHVybiBvbiBlbXB0eSBsaXN0KS5cbiAgICogLSAqKkVucmljaG1lbnQqKjogbGlicmFyeSBhdXRvLWFkZHMgYHN0YWdlTmFtZWAsIGBydW50aW1lU3RhZ2VJZGAsXG4gICAqICAgYHN1YmZsb3dQYXRoYCwgYHBpcGVsaW5lSWRgLCBgdGltZXN0YW1wYCB0byB0aGUgZXZlbnQuXG4gICAqIC0gKipSZWRhY3Rpb24qKjogYFJlZGFjdGlvblBvbGljeS5lbWl0UGF0dGVybnNgIHJlZ2V4ZXMgYXJlIG1hdGNoZWRcbiAgICogICBhZ2FpbnN0IGBuYW1lYCDigJQgbWF0Y2hlZCBldmVudHMgaGF2ZSB0aGVpciBwYXlsb2FkIHJlcGxhY2VkIHdpdGhcbiAgICogICBgJ1tSRURBQ1RFRF0nYCBiZWZvcmUgZGlzcGF0Y2guXG4gICAqIC0gKipFcnJvciBpc29sYXRpb24qKjogYSB0aHJvd2luZyBgb25FbWl0YCBkb2VzIG5vdCBwcm9wYWdhdGUg4oCUIGl0IGlzXG4gICAqICAgY2F1Z2h0IGFuZCByb3V0ZWQgdG8gYG9uRXJyb3JgIG9uIHJlbWFpbmluZyByZWNvcmRlcnMsIG1hdGNoaW5nIHRoZVxuICAgKiAgIHBhdHRlcm4gdXNlZCBieSBvdGhlciBzY29wZSBldmVudHMuXG4gICAqXG4gICAqIENvbnN1bWVycyBjYWxsIHRoaXMgdmlhIHRoZSBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgIHNjb3BlIG1ldGhvZDtcbiAgICogdGhlIG1ldGhvZCByb3V0ZXMgaGVyZSB2aWEgYGNyZWF0ZVR5cGVkU2NvcGVgLlxuICAgKi9cbiAgZW1pdEV2ZW50KG5hbWU6IHN0cmluZywgcGF5bG9hZDogdW5rbm93bik6IHZvaWQge1xuICAgIC8vIEFuIGVuZGVkIGF0dGVtcHQgZW1pdHMgbm90aGluZyDigJQgcmVmdXNlZCAoYW5kIHJlY29yZGVkKSBiZWZvcmUgdGhlIGZhc3QgcGF0aCwgc28gdGhlIHJlY29yZCBkb2VzIG5vdCBkZXBlbmRcbiAgICAvLyBvbiB3aGV0aGVyIGEgcmVjb3JkZXIgaGFwcGVuZWQgdG8gYmUgYXR0YWNoZWQuXG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChuYW1lLCAnZW1pdCcpO1xuICAgIC8vIEZhc3QtcGF0aDogemVybyB3b3JrIHdoZW4gbm8gcmVjb3JkZXJzIGFyZSBhdHRhY2hlZC5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gUmVkYWN0aW9uOiBpZiB0aGUgZXZlbnQgbmFtZSBtYXRjaGVzIGFueSBlbWl0UGF0dGVybiwgcmVwbGFjZSBwYXlsb2FkXG4gICAgLy8gd2l0aCAnW1JFREFDVEVEXScgQkVGT1JFIGNvbnN0cnVjdGluZyB0aGUgZXZlbnQgKG5vIGxlYWsgdGhyb3VnaFxuICAgIC8vIGNvcHktb24td3JpdGUsIG5vIHdheSBmb3IgcmVjb3JkZXJzIHRvIHNlZSB0aGUgcmF3IHZhbHVlKS5cbiAgICBjb25zdCBmaW5hbFBheWxvYWQgPSB0aGlzLnJ1bGUucmV0YWluRW1pdChuYW1lLCBwYXlsb2FkKTtcbiAgICBjb25zdCBzb3VyY2VQb3NpdGlvbiA9IHRoaXMuX3N0YWdlQ29udGV4dC5jYXB0dXJlRW1pdFBvc2l0aW9uKCk7XG5cbiAgICAvLyBCdWlsZCB0aGUgZW5yaWNoZWQgZXZlbnQgb25jZTsgcGFzcyB0aGUgc2FtZSByZWZlcmVuY2UgdG8gYWxsXG4gICAgLy8gcmVjb3JkZXJzIHVuZGVyIHRoZWlyIHJlYWQtb25seSBjb250cmFjdC4gU291cmNlIGNvb3JkaW5hdGVzIGFyZVxuICAgIC8vIGNhcHR1cmVkIGJlZm9yZSBhbnkgaW5saW5lIGhvb2sgb3IgZGVmZXJyZWQgdGFwIG9ic2VydmVzIHRoZSBldmVudC5cbiAgICBjb25zdCBldmVudCA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBwYXlsb2FkOiBmaW5hbFBheWxvYWQsXG4gICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93UGF0aDogdGhpcy5fZ2V0U3ViZmxvd1BhdGgoKSxcbiAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIC4uLihzb3VyY2VQb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHNvdXJjZVBvc2l0aW9uIH0pLFxuICAgIH0gYXMgY29uc3Q7XG5cbiAgICAvLyBEaXNwYXRjaCB3aXRoIGVycm9yIGlzb2xhdGlvbiDigJQgdGhlIHNhbWUgYGZpcmVgIGxvb3AgYW5kIHRoZSBzYW1lIGZhaWx1cmUgcm91dGluZyBhc1xuICAgIC8vIGV2ZXJ5IG90aGVyIHNjb3BlIGV2ZW50OiBhIHRocm93aW5nIHJlY29yZGVyJ3MgZXJyb3IgcmVhY2hlcyBvbkVycm9yIG9uIHRoZSByZWNvcmRlcnM7XG4gICAgLy8gdGhlIGVtaXQgbG9vcCBjb250aW51ZXMgdW5hZmZlY3RlZC5cbiAgICBmaXJlKHRoaXMuX3JlY29yZGVycywgJ29uRW1pdCcsIHRoaXMuX2NvcnJlbGF0ZWQoZXZlbnQpLCB0aGlzLl9yb3V0ZUZhaWx1cmUpO1xuICB9XG5cbiAgLy8g4pSA4pSAIERldGFjaCDigJQgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydCBleGVjdXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vXG4gIC8vIERlbGVnYXRlcyB0byB0aGUgc2hhcmVkIGBkZXRhY2gvc3Bhd25gIGhlbHBlciwgd2hpY2ggbWludHMgYSByZWZJZFxuICAvLyBmcm9tIHRoaXMgc3RhZ2UncyBgcnVudGltZVN0YWdlSWRgIGFuZCBjYWxscyBgZHJpdmVyLnNjaGVkdWxlKClgLlxuICAvLyBSb3V0ZWQgdGhyb3VnaCBgY3JlYXRlVHlwZWRTY29wZWAgYXMgYHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWBcbiAgLy8gYW5kIGBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KC4uLilgLlxuXG4gIC8qKiBTZWUgYFNjb3BlTWV0aG9kcy4kZGV0YWNoQW5kSm9pbkxhdGVyYC4gKi9cbiAgZGV0YWNoQW5kSm9pbkxhdGVyKGRyaXZlcjogRGV0YWNoRHJpdmVyLCBjaGlsZDogRmxvd0NoYXJ0LCBpbnB1dD86IHVua25vd24pOiBEZXRhY2hIYW5kbGUge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoZGV0YWNoS2V5KGNoaWxkKSwgJ2RldGFjaCcpO1xuICAgIHJldHVybiBkZXRhY2hBbmRKb2luTGF0ZXJTcGF3bihkcml2ZXIsIGNoaWxkLCBpbnB1dCwgdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKiBTZWUgYFNjb3BlTWV0aG9kcy4kZGV0YWNoQW5kRm9yZ2V0YC4gKi9cbiAgZGV0YWNoQW5kRm9yZ2V0KGRyaXZlcjogRGV0YWNoRHJpdmVyLCBjaGlsZDogRmxvd0NoYXJ0LCBpbnB1dD86IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKGRldGFjaEtleShjaGlsZCksICdkZXRhY2gnKTtcbiAgICBkZXRhY2hBbmRGb3JnZXRTcGF3bihkcml2ZXIsIGNoaWxkLCBpbnB1dCwgdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgc3ViZmxvd1BhdGggKG91dGVyIOKGkiBpbm5lcikgZm9yIGV2ZW50IGVucmljaG1lbnQuXG4gICAqXG4gICAqIFBhcnNlcyBmcm9tIGBydW50aW1lU3RhZ2VJZGAgd2hpY2ggaGFzIHRoZSBmb3JtYXRcbiAgICogYFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleGAgKHNlZSBgbGliL2lkcy9ydW50aW1lU3RhZ2VJZC50c2ApLlxuICAgKiBTdWJmbG93IGlzb2xhdGlvbiBwcmV2ZW50cyB3YWxraW5nIHRoZSBwYXJlbnQtY2hhaW4gYWNyb3NzIGJvdW5kYXJpZXMsXG4gICAqIHNvIHRoZSBydW50aW1lU3RhZ2VJZCDigJQgZ2xvYmFsbHkgdW5pcXVlLCBpbmNsdWRlcyBmdWxsIHBhdGgg4oCUIGlzIHRoZVxuICAgKiBjYW5vbmljYWwgc291cmNlIG9mIHRydXRoIGZvciB0aGUgc3ViZmxvdyBoaWVyYXJjaHkgYXQgZW1pdCB0aW1lLlxuICAgKlxuICAgKiBFeGFtcGxlczpcbiAgICogICAnc2VlZCMwJyAgICAgICAgICAgICAgICAg4oaSIFtdICAgICAgICAgICAgICAgICAgICAocm9vdClcbiAgICogICAnc2YtaW5uZXIvaW5uZXIjNScgICAgICAg4oaSIFsnc2YtaW5uZXInXVxuICAgKiAgICdzZi1hL3NmLWIvc3RhZ2UjMycgICAgICDihpIgWydzZi1hJywgJ3NmLWInXSAgICAgIChuZXN0ZWQpXG4gICAqL1xuICBwcml2YXRlIF9nZXRTdWJmbG93UGF0aCgpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gICAgY29uc3QgcnRpZCA9IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZDtcbiAgICBpZiAoIXJ0aWQpIHJldHVybiBTY29wZUZhY2FkZS5fRU1QVFlfU1VCRkxPV19QQVRIO1xuICAgIC8vIFRoZSBncmFtbWFyJ3Mgb25lIG93bmVyIHJlYWRzIHRoZSBwYXRoIHBvcnRpb24gKGBpZHMvcnVudGltZVN0YWdlSWQudHNgKS5cbiAgICBjb25zdCBzZWdtZW50cyA9IHN1YmZsb3dTZWdtZW50c09mKHJ0aWQpO1xuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDApIHJldHVybiBTY29wZUZhY2FkZS5fRU1QVFlfU1VCRkxPV19QQVRIO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHNlZ21lbnRzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBOb24tVHJhY2tpbmcgU3RhdGUgSW5zcGVjdGlvbiAoZm9yIFR5cGVkU2NvcGUgcHJveHkgaW50ZXJuYWxzKSDilIDilIDilIDilIDilIDilIBcblxuICAvKiogUmV0dXJucyBhbGwgc3RhdGUga2V5cyB3aXRob3V0IGZpcmluZyBvblJlYWQuIFVzZWQgYnkgVHlwZWRTY29wZSBvd25LZXlzL2hhcyB0cmFwcy4gKi9cbiAgZ2V0U3RhdGVLZXlzKCk6IHN0cmluZ1tdIHtcbiAgICB0aGlzLnJlZnVzZUlmQXR0ZW1wdEVuZGVkKCcqJyk7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIHVuZGVmaW5lZCk7XG4gICAgaWYgKCFzbmFwc2hvdCB8fCB0eXBlb2Ygc25hcHNob3QgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNuYXBzaG90IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgfVxuXG4gIC8qKiBDaGVjayBrZXkgZXhpc3RlbmNlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBUeXBlZFNjb3BlIGhhcyB0cmFwLlxuICAgKiAgQ29udHJhY3Q6IHJldHVybnMgZmFsc2UgZm9yIGtleXMgbmV2ZXIgc2V0IE9SIGtleXMgc2V0IHRvIHVuZGVmaW5lZC5cbiAgICogIFRoaXMgbWF0Y2hlcyBkZWxldGVWYWx1ZSgpIHNlbWFudGljcyAoc2V0cyB0byB1bmRlZmluZWQgPSBkZWxldGVkKS4gKi9cbiAgaGFzS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChrZXkpO1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUoW10sIGtleSkgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgZmlyaW5nIG9uUmVhZC4gVXNlZCBieSBhcnJheSBwcm94eSBnZXRDdXJyZW50KCkgdG8gYXZvaWRcbiAgICogIHBoYW50b20gcmVhZHMgb24gaW50ZXJuYWwgYXJyYXkgb3BlcmF0aW9ucyAoLmxlbmd0aCwgLmhhcywgaXRlcmF0aW9uLCBldGMuKS5cbiAgICogIFRoZSBpbml0aWFsIHByb3BlcnR5IGFjY2VzcyBmaXJlcyBvbmUgdHJhY2tlZCBvblJlYWQgdmlhIGdldFZhbHVlKCk7IHN1YnNlcXVlbnRcbiAgICogIGludGVybmFsIGFycmF5IG9wZXJhdGlvbnMgdXNlIHRoaXMgbWV0aG9kIHRvIHN0YXkgc2lsZW50LlxuICAgKiAgTk9URTogTGlrZSBnZXRWYWx1ZSgpLCByZXR1cm5zIHRoZSByYXcgdmFsdWUgdG8gdGhlIGNhbGxlci4gUmVkYWN0aW9uIGFwcGxpZXNcbiAgICogIG9ubHkgdG8gcmVjb3JkZXIgZGlzcGF0Y2gg4oCUIGl0IGRvZXMgbm90IGZpbHRlciB0aGUgcmV0dXJuZWQgdmFsdWUuIFRoaXMgbWF0Y2hlc1xuICAgKiAgdGhlIGV4aXN0aW5nIGdldFZhbHVlKCkgY29udHJhY3Qgd2hlcmUgdXNlciBjb2RlIGFsd2F5cyByZWNlaXZlcyByYXcgZGF0YS5cbiAgICpcbiAgICogIFJGQy0wMDMgRDI6IGEgc2lsZW50IHJlYWQgb2YgYSBrZXkgdGhpcyBzdGFnZSBuZXZlciBUUkFDS0VELXJlYWQgbWFya3NcbiAgICogIHRoZSBzdGFnZSdzIGNvbW1pdCB3aXRoIGB1bnRyYWNrZWRTb3VyY2VzOiBbJ3NpbGVudCddYCDigJQgYSBjYXVzYWwgc2xpY2VcbiAgICogIGJ1aWx0IGZyb20gb25SZWFkIGV2ZW50cyB3b3VsZCBtaXNzIHRoaXMgZGVwZW5kZW5jeSwgYW5kIGNvbnN1bWVycyBtdXN0XG4gICAqICBiZSB0b2xkLiBTaWxlbnQgcmVhZHMgc2hhZG93ZWQgYnkgYSB0cmFja2VkIHJlYWQgb2YgdGhlIHNhbWUga2V5ICh0aGVcbiAgICogIGFycmF5LXByb3h5IHBhdHRlcm4gYWJvdmUpIGFyZSBub3QgZmxhZ2dlZDogdGhlaXIgZWRnZSBpcyBjYXB0dXJlZC4gQVxuICAgKiAgd2hvbGUtc3RhdGUgc2lsZW50IHJlYWQgKG5vIGtleSkgaXMgYWx3YXlzIGZsYWdnZWQuICovXG4gIGdldFZhbHVlU2lsZW50KGtleT86IHN0cmluZyk6IHVua25vd24ge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoa2V5ID8/ICcqJyk7XG4gICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLl90cmFja2VkUmVhZEtleXMuaGFzKGtleSkpIHtcbiAgICAgIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdzaWxlbnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRWYWx1ZURpcmVjdChbXSwga2V5KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdGF0ZSBBY2Nlc3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0SW5pdGlhbFZhbHVlRm9yKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZCBvZiBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqICoqUmVhZCB2YWx1ZXMgYXJlIEJPUlJPV0VEIOKAlCBkbyBub3QgbXV0YXRlIHRoZW0uKiogU2luY2UgdGhlIGxhenkgYnVmZmVyXG4gICAqICgjMTMpLCByZWFkcyBiZWZvcmUgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgcmV0dXJuIHJlZmVyZW5jZXMgSU5UT1xuICAgKiBDT01NSVRURUQgU0hBUkVEIFNUQVRFLCBhbmQgcmVhZHMgYWZ0ZXIgYSB3cml0ZSByZXR1cm4gcmVmZXJlbmNlcyBpbnRvXG4gICAqIHRoZSBzdGFnZSdzIHByaXZhdGUgdHJhbnNhY3Rpb24tYnVmZmVyIHdvcmtpbmcgY29weSAodGhlIGVhZ2VyIGVuZ2luZVxuICAgKiByZXR1cm5lZCByZWZlcmVuY2VzIGludG8gdGhhdCB3b3JraW5nIGNvcHkgZm9yIEFMTCByZWFkcykuIE11dGF0aW5nIGFcbiAgICogcmV0dXJuZWQgdmFsdWUgaW4gcGxhY2Ugd291bGQgY29ycnVwdCBzdGF0ZSB3aXRob3V0IGEgY29tbWl0IHJlY29yZCDigJRcbiAgICogd3JpdGUgY2hhbmdlcyBiYWNrIHZpYSBgc2V0VmFsdWVgL2B1cGRhdGVWYWx1ZWAgaW5zdGVhZC4gVHlwZWRTY29wZVxuICAgKiBjb25zdW1lcnMgYXJlIHNhZmUgYXV0b21hdGljYWxseTogdGhlIHByb3h5IHJvdXRlcyBldmVyeSBtdXRhdGlvblxuICAgKiB0aHJvdWdoIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYC9jb3B5LW9uLXdyaXRlIGFycmF5IG9wcy5cbiAgICpcbiAgICogVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IE5PIGRldi1tb2RlIGZyZWV6ZSBndWFyZCBoZXJlOiBkZWVwLWZyZWV6aW5nIGFcbiAgICogYnVmZmVyLXNlcnZlZCByZWFkIHdvdWxkIGZyZWV6ZSB0aGUgc3RhZ2UncyBvd24gd29ya2luZyBjb3B5IGFuZCBtYWtlIGFcbiAgICogbGVnaXRpbWF0ZSByZWFkLXRoZW4tZGVlcC13cml0ZSB0aHJvdywgYW5kIGZyZWV6aW5nIGEgY29tbWl0dGVkLXN0YXRlXG4gICAqIHJlYWQgbXV0YXRlcyBhbiBvYmplY3Qgc2hhcmVkIHdpdGggZXZlcnkgb3RoZXIgY29uc3VtZXIgb2YgdGhlIGxpdmVcbiAgICogc3RhdGUuIFNlZSBgc3JjL2xpYi9tZW1vcnkvUkVBRE1FLm1kYCAoXCJSZWFkIHZhbHVlcyBhcmUgYm9ycm93ZWRcIikuXG4gICAqXG4gICAqIFJlY29yZGVyIG5vdGU6IHRoZSBgb25SZWFkYCBldmVudCBiZWxvdyBwYXNzZXMgdGhlIFNBTUUgbGl2ZSByZWZlcmVuY2VcbiAgICogKG5vIGNsb25lKSB1bmxlc3MgZmllbGQtbGV2ZWwgcmVkYWN0aW9uIHNjcnVicyBhIGNvcHkg4oCUIHJlY29yZGVycyBtdXN0XG4gICAqIHRyZWF0IGV2ZW50IHZhbHVlcyBhcyByZWFkLW9ubHkgdG9vLlxuICAgKi9cbiAgZ2V0VmFsdWUoa2V5Pzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVBdChbXSwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoLWF3YXJlIGFkYXB0ZXIgYWNjZXNzLiBTZWdtZW50cyBzdGF5IHNlcGFyYXRlIGZyb20gbGl0ZXJhbCBkb3R0ZWQga2V5cyBpbiBTVEFURTtcbiAgICogdGhlIHJlY29yZGVyIGV2ZW50J3MgYGtleWAgaXMgb25seSBhIGRvdC1qb2luZWQgZGlzcGxheSBsYWJlbCwgc28gYFsndXNlcicsJ3NzbiddYCBhbmRcbiAgICogYSBsaXRlcmFsIHRvcC1sZXZlbCBgJ3VzZXIuc3NuJ2AgcHJvZHVjZSB0aGUgc2FtZSBldmVudCBrZXkgKHNhbWUgZm9yIHRoZSB3cml0ZXMgYmVsb3cpLlxuICAgKi9cbiAgZ2V0VmFsdWVBdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKSB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZChrZXkgPT09IHVuZGVmaW5lZCA/IHBhdGguam9pbignLicpIHx8ICcqJyA6IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSk7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLl9zdGFnZUNvbnRleHQuZ2V0VmFsdWUocGF0aCwga2V5KTtcblxuICAgIC8vIFJGQy0wMDMgRDI6IHJlbWVtYmVyIHRyYWNrZWQga2V5cyBzbyBsYXRlciBTSUxFTlQgcmVhZHMgb2YgdGhlIHNhbWVcbiAgICAvLyBrZXkgY291bnQgYXMgc2hhZG93ZWQgKGVkZ2UgYWxyZWFkeSBjYXB0dXJlZCkgaW5zdGVhZCBvZiB1bnRyYWNrZWQuXG4gICAgLy8gT25seSBhIHdob2xlIHRvcC1sZXZlbCB2YWx1ZSBzaGFkb3dzIGEgbGF0ZXIgc2lsZW50IHJlYWQgb2YgdGhhdCB2YWx1ZS5cbiAgICAvLyBSZWFkaW5nIG9uZSBuZXN0ZWQgZmllbGQgbXVzdCBub3QgY2xhaW0gdG8gaGF2ZSBvYnNlcnZlZCBpdHMgc2libGluZ3MuXG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwICYmIGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLl90cmFja2VkUmVhZEtleXMuYWRkKGtleSk7XG4gICAgZWxzZSBpZiAocGF0aC5sZW5ndGggPT09IDEgJiYga2V5ID09PSB1bmRlZmluZWQpIHRoaXMuX3RyYWNrZWRSZWFkS2V5cy5hZGQocGF0aFswXSEpO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBBIHdob2xlLXN0YXRlIHJlYWQgKG5vIGtleSkgaXMgc2VydmVkIHdpdGggZXZlcnkgcmVkYWN0ZWQga2V5IGluc2lkZVxuICAgICAgLy8gaXQgc2NydWJiZWQ7IGEga2V5ZWQgcmVhZCBpcyBzZXJ2ZWQgdW5kZXIgdGhlIGtleSdzIHZlcmRpY3QuXG4gICAgICBjb25zdCB3aG9sZVN0YXRlID0gcGF0aC5sZW5ndGggPT09IDAgJiYga2V5ID09PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCB2ZXJkaWN0ID0gd2hvbGVTdGF0ZSA/IENMRUFSIDoga2V5ID09PSB1bmRlZmluZWQgPyB0aGlzLnJ1bGUudmVyZGljdChwYXRoKSA6IHRoaXMucnVsZS52ZXJkaWN0QXQocGF0aCwga2V5KTtcbiAgICAgIGNvbnN0IHJlY29yZGVyVmFsdWUgPSB3aG9sZVN0YXRlID8gdGhpcy5ydWxlLnJldGFpblJlY29yZCh2YWx1ZSkgOiBSZWRhY3Rpb25SdWxlLmFwcGx5KHZlcmRpY3QsIHZhbHVlKTtcbiAgICAgIGNvbnN0IGV2ZW50S2V5ID0gcGF0aC5sZW5ndGggPT09IDAgPyBrZXkgOiAoa2V5ID09PSB1bmRlZmluZWQgPyBwYXRoIDogWy4uLnBhdGgsIGtleV0pLmpvaW4oJy4nKTtcblxuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25SZWFkJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICB2YWx1ZTogcmVjb3JkZXJWYWx1ZSxcbiAgICAgICAgcmVkYWN0ZWQ6IHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyB8fCB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBzZXRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VmFsdWVBdChbXSwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogUGF0aC1hd2FyZSB3cml0ZXMgc2hhcmUgcmVjb3JkaW5nLCByZWRhY3Rpb24gYW5kIGxpZmV0aW1lIHBvbGljeSB3aXRoIGZsYXQgd3JpdGVzLiAqL1xuICBzZXRWYWx1ZUF0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXZlbnRLZXkgPSBwYXRoLmxlbmd0aCA9PT0gMCA/IGtleSA6IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKTtcbiAgICBhc3NlcnROb3RSZWFkb25seSh0aGlzLl9yZWFkT25seVZhbHVlcywgcGF0aFswXSA/PyBrZXksICd3cml0ZScpO1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShldmVudEtleSk7XG5cbiAgICAvLyBEZXYtbW9kZTogd2FybiBpZiB0aGUgdmFsdWUgY29udGFpbnMgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbiAgICAvLyBDaGVjayBBRlRFUiBhc3NlcnROb3RSZWFkb25seSDigJQgZG9uJ3Qgd2FybiBmb3Igd3JpdGVzIHRoYXQgd2lsbCBiZSBibG9ja2VkLlxuICAgIC8vIENpcmN1bGFyIHZhbHVlcyB3b3JrICh0ZXJtaW5hbCBwcm94eSBoYW5kbGVzIHRoZW0pIGJ1dCBjYW4gcHJvZHVjZVxuICAgIC8vIHN1cnByaXNpbmcgYmVoYXZpb3IgaW4gbmFycmF0aXZlLCBKU09OIHNlcmlhbGl6YXRpb24sIGFuZCBzbmFwc2hvdHMuXG4gICAgaWYgKGlzRGV2TW9kZSgpICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChoYXNDaXJjdWxhclJlZmVyZW5jZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gc2V0VmFsdWUoJyR7ZXZlbnRLZXl9JykuIGAgK1xuICAgICAgICAgICAgJ1dyaXRlcyBwYXN0IHRoZSBjeWNsZSBkZXB0aCB3aWxsIHVzZSB0ZXJtaW5hbCBwcm94eSB0cmFja2luZy4gJyArXG4gICAgICAgICAgICAnQ29uc2lkZXIgZmxhdHRlbmluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgY29udGV4dCBpcyB0aGUgT05FIGZ1bm5lbDogaXQgZGVjaWRlcyB0aGUgdmVyZGljdCAoZXhwbGljaXQgZmxhZyxcbiAgICAvLyBwb2xpY3kga2V5L3BhdHRlcm4sIHBlci1ydW4gbWFyaywgb3IgZmllbGQtbGV2ZWwgc2NydWIpLCBzdGFnZXMgdGhlXG4gICAgLy8gd3JpdGUgd2l0aCB0aGUgcGF0aHMgdGhlIGxvZyB3aWxsIHNjcnViLCBhbmQgaGFuZHMgdGhlIHZlcmRpY3QgYmFjayBzb1xuICAgIC8vIHJlY29yZGVycyBzZWUgdGhlIHNhbWUgZGVjaXNpb24gdGhlIHJldGFpbmVkIHJlY29yZCBob2xkcy5cbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsIGRlc2NyaXB0aW9uKTtcblxuICAgIGlmICh0aGlzLl9yZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5faW52b2tlSG9vaygnb25Xcml0ZScsIHtcbiAgICAgICAgc3RhZ2VOYW1lOiB0aGlzLl9zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICBwaXBlbGluZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAga2V5OiBldmVudEtleSxcbiAgICAgICAgdmFsdWU6IFJlZGFjdGlvblJ1bGUuYXBwbHkodmVyZGljdCwgdmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246ICdzZXQnLFxuICAgICAgICByZWRhY3RlZDogdmVyZGljdC5raW5kICE9PSAnY2xlYXInIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVWYWx1ZUF0KFtdLCBrZXksIHZhbHVlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKiogUGF0aC1hd2FyZSBtZXJnZXMgdXNlIHRoZSBzYW1lIHdyaXRlIGZ1bm5lbCBhcyByZXBsYWNlbWVudHMuICovXG4gIHVwZGF0ZVZhbHVlQXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBldmVudEtleSA9IHBhdGgubGVuZ3RoID09PSAwID8ga2V5IDogWy4uLnBhdGgsIGtleV0uam9pbignLicpO1xuICAgIGFzc2VydE5vdFJlYWRvbmx5KHRoaXMuX3JlYWRPbmx5VmFsdWVzLCBwYXRoWzBdID8/IGtleSwgJ3dyaXRlJyk7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGV2ZW50S2V5KTtcblxuICAgIC8vIERldi1tb2RlOiBzYW1lIGNpcmN1bGFyIGNoZWNrIGFzIHNldFZhbHVlIChtZXJnZSB0YXJnZXRzIGNhbiBiZSBjaXJjdWxhciB0b28pXG4gICAgaWYgKGlzRGV2TW9kZSgpICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChoYXNDaXJjdWxhclJlZmVyZW5jZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbZm9vdHByaW50XSBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gdXBkYXRlVmFsdWUoJyR7ZXZlbnRLZXl9JykuIGAgK1xuICAgICAgICAgICAgJ0NvbnNpZGVyIGZsYXR0ZW5pbmcgdGhlIGRhdGEgc3RydWN0dXJlLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMuX3N0YWdlQ29udGV4dC51cGRhdGVPYmplY3QocGF0aCwga2V5LCB2YWx1ZSwgZGVzY3JpcHRpb24pO1xuXG4gICAgaWYgKHRoaXMuX3JlY29yZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLl9pbnZva2VIb29rKCdvbldyaXRlJywge1xuICAgICAgICBzdGFnZU5hbWU6IHRoaXMuX3N0YWdlTmFtZSxcbiAgICAgICAgc3RhZ2VJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIHBpcGVsaW5lSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW5JZCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBrZXk6IGV2ZW50S2V5LFxuICAgICAgICB2YWx1ZTogUmVkYWN0aW9uUnVsZS5hcHBseSh2ZXJkaWN0LCB2YWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgICAgIHJlZGFjdGVkOiB2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZGVsZXRlVmFsdWUoa2V5OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgYXNzZXJ0Tm90UmVhZG9ubHkodGhpcy5fcmVhZE9ubHlWYWx1ZXMsIGtleSwgJ2RlbGV0ZScpO1xuICAgIHRoaXMuYXNzZXJ0TGl2ZShrZXkpO1xuXG4gICAgLy8gRGVsZXRpbmcgYSBrZXkgY2xlYXJzIGl0cyBwZXItY2FsbCByZWRhY3Rpb24gbWFyayAodGhlIGNvbnRleHQnc1xuICAgIC8vIGZ1bm5lbCBkb2VzIHRoYXQpOyBhIHBvbGljeSB2ZXJkaWN0IG9uIHRoZSBrZXkgc3Vydml2ZXMuXG4gICAgdGhpcy5fc3RhZ2VDb250ZXh0LnNldE9iamVjdChbXSwga2V5LCB1bmRlZmluZWQsIGZhbHNlLCBkZXNjcmlwdGlvbiA/PyBgZGVsZXRlZCAke2tleX1gLCAnZGVsZXRlJyk7XG5cbiAgICBpZiAodGhpcy5fcmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2ludm9rZUhvb2soJ29uV3JpdGUnLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgb3BlcmF0aW9uOiAnZGVsZXRlJyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmFzc2VydExpdmUoa2V5KTtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VDb250ZXh0LnNldEdsb2JhbD8uKGtleSwgdmFsdWUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0R2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5nZXRHbG9iYWw/LihrZXkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRPYmplY3RJblJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5hc3NlcnRMaXZlKGtleSk7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlQ29udGV4dC5zZXRSb290Py4oa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZC1vbmx5ICsgbWlzYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVhZG9ubHkgaW5wdXQgdmFsdWVzIHBhc3NlZCB0byB0aGlzIHBpcGVsaW5lLCBjYXN0IHRvIGBUYC5cbiAgICogT3JkaW5hcnkgbXV0YWJsZSByZWNvcmRzL2FycmF5cyBhcmUgY29waWVkIGFuZCBmcm96ZW4sIG5vdCBmcm96ZW4gaW4gcGxhY2UuXG4gICAqIE9wYXF1ZSBjYXBhYmlsaXRpZXMgYW5kIGV4cGxpY2l0bHkgZnJvemVuIHdyYXBwZXJzIHJlbWFpbiBib3Jyb3dlZC9saXZlO1xuICAgKiBzZWUgYHByb3RlY3Rpb24vcmVhZG9ubHlJbnB1dC50cyDCtyBjcmVhdGVGcm96ZW5BcmdzYCBmb3IgdGhlIG93bmVyc2hpcCBydWxlLlxuICAgKiBDYWNoZWQgYXQgY29uc3RydWN0aW9uIHRpbWUgZm9yIHplcm8tYWxsb2NhdGlvbiByZXBlYXRlZCBhY2Nlc3MuXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgeyBhcHBsaWNhbnROYW1lLCBpbmNvbWUgfSA9IHNjb3BlLmdldEFyZ3M8eyBhcHBsaWNhbnROYW1lOiBzdHJpbmc7IGluY29tZTogbnVtYmVyIH0+KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBSRkMtMDAzIEQyOiBhcmdzIGFyZSB1bnRyYWNrZWQgQlkgREVTSUdOLCBzbyBjYWxsaW5nIHRoaXMgKHdpdGggYWN0dWFsXG4gICAqIGlucHV0IHByZXNlbnQpIG1hcmtzIHRoZSBzdGFnZSdzIGNvbW1pdCB3aXRoIGB1bnRyYWNrZWRTb3VyY2VzOiBbJ2FyZ3MnXWBcbiAgICog4oCUIHRlbGxpbmcgY2F1c2FsLXNsaWNlIGNvbnN1bWVycyB0aGUgYmFja3dhcmQgc2xpY2UgbWF5IGJlIGluY29tcGxldGVcbiAgICogaGVyZS4gQW4gZW1wdHktYXJncyByZWFkIGNhcnJpZXMgbm8gaW5mb3JtYXRpb24gYW5kIGlzIG5vdCBmbGFnZ2VkLlxuICAgKi9cbiAgZ2V0QXJnczxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk6IFQge1xuICAgIHRoaXMucmVmdXNlSWZBdHRlbXB0RW5kZWQoJyRhcmdzJyk7XG4gICAgaWYgKHRoaXMuX2hhc0FyZ3MpIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdhcmdzJyk7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb3plbkFyZ3MgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQg4oCUIHJlYWQtb25seSBpbmZyYXN0cnVjdHVyZSB2YWx1ZXNcbiAgICogdGhhdCBwcm9wYWdhdGUgdGhyb3VnaCBuZXN0ZWQgZXhlY3V0b3JzIChsaWtlIGBwcm9jZXNzLmVudmAgZm9yIGZsb3djaGFydHMpLlxuICAgKlxuICAgKiBDb250YWluczogc2lnbmFsIChhYm9ydCDigJQgdGhlIHJ1bidzIG9uZSBlZmZlY3RpdmUgc2lnbmFsKSwgdGltZW91dE1zLCB0cmFjZUlkLCBvcGVyYXRpb25JZCwgdHJhY2VwYXJlbnQsXG4gICAqIGRlYWRsaW5lIChlcG9jaCBtcykg4oCUIHRoZSBydW4ncyBlbnYgYXMgYWRtaXR0ZWQgKGBhdHRlbXB0L2NvcnJlbGF0aW9uLnRzIMK3IGFkbWl0UnVuRW52YDogb25lIG93bi1maWVsZFxuICAgKiBzbmFwc2hvdDsgYHRyYWNlcGFyZW50YCBpcyB0aGUgY2Fub25pY2FsIGhlYWRlciB0aGUgcnVuJ3MgY29ycmVsYXRpb24gY2FycmllcywgbmV2ZXIgdGhlIHJlY2VpdmVkIGJ5dGVzKSwgdGhlblxuICAgKiBhcm1lZCAoYHJ1bm5lci9kZWFkbGluZS50cyDCtyBhcm1SdW5gKS4gRnJvemVuIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBJbmhlcml0ZWQgYnkgc3ViZmxvd3MgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB7IHNpZ25hbCwgdHJhY2VJZCB9ID0gc2NvcGUuZ2V0RW52KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBSRkMtMDAzIEQyOiBlbnYgaXMgdW50cmFja2VkIEJZIERFU0lHTiwgc28gY2FsbGluZyB0aGlzICh3aXRoIGFcbiAgICogbm9uLWVtcHR5IGVudmlyb25tZW50KSBtYXJrcyB0aGUgc3RhZ2UncyBjb21taXQgd2l0aFxuICAgKiBgdW50cmFja2VkU291cmNlczogWydlbnYnXWAg4oCUIHNlZSB7QGxpbmsgZ2V0QXJnc30uXG4gICAqL1xuICBnZXRFbnYoKTogUmVhZG9ubHk8RXhlY3V0aW9uRW52PiB7XG4gICAgdGhpcy5yZWZ1c2VJZkF0dGVtcHRFbmRlZCgnJGVudicpO1xuICAgIGlmICh0aGlzLl9oYXNFbnYpIHRoaXMuX3N0YWdlQ29udGV4dC5tYXJrVW50cmFja2VkU291cmNlKCdlbnYnKTtcbiAgICByZXR1cm4gdGhpcy5fZXhlY3V0aW9uRW52O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRQaXBlbGluZUlkKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUNvbnRleHQucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWwg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBfaW52b2tlSG9vazxLIGV4dGVuZHMgU2NvcGVIb29rTmFtZT4oaG9vazogSywgZXZlbnQ6IEhvb2tQYXlsb2FkPEs+KTogdm9pZCB7XG4gICAgLy8gVGhlIG9uZSBwZXItcmVjb3JkZXIgbG9vcCAoYHJlY29yZGVyL2hvb2tzLnRzIMK3IGZpcmVgKSDigJQgdGhlIFNBTUUgaW52b2tlIHByaW1pdGl2ZSB0aGVcbiAgICAvLyBkZWZlcnJlZCB0aWVyIHVzZXMgYXQgZGVsaXZlcnkgdGltZSwgc28gdGhlIGlubGluZSBhbmQgZGVmZXJyZWQgcGF0aHMgY2Fubm90IGRyaWZ0LlxuICAgIGZpcmUodGhpcy5fcmVjb3JkZXJzLCBob29rLCB0aGlzLl9jb3JyZWxhdGVkKGV2ZW50IGFzIG9iamVjdCkgYXMgSG9va1BheWxvYWQ8Sz4sIHRoaXMuX3JvdXRlRmFpbHVyZSk7XG4gIH1cblxuICAvKiogVGhlIGV2ZW50IGFzIGZpcmVkOiB1bmNoYW5nZWQgd2l0aG91dCBhIGNvcnJlbGF0aW9uLCBlbHNlIHdpdGggdGhlIHJ1bidzIGNvcnJlbGF0aW9uIGFzIGl0cyBsYXN0IGtleS4gKi9cbiAgcHJpdmF0ZSBfY29ycmVsYXRlZDxFIGV4dGVuZHMgb2JqZWN0PihldmVudDogRSk6IEUge1xuICAgIHJldHVybiB0aGlzLl9jb3JyZWxhdGlvbiA9PT0gdW5kZWZpbmVkID8gZXZlbnQgOiB7IC4uLmV2ZW50LCBjb3JyZWxhdGlvbjogdGhpcy5fY29ycmVsYXRpb24gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2NvcGUgY2hhbm5lbCdzIGlzb2xhdGlvbjogYSByZWNvcmRlcidzIHRocm93IGJlY29tZXMgYW4gYG9uRXJyb3JgIG9uIGV2ZXJ5IHJlY29yZGVyXG4gICAqIChzdGFtcGVkIHdpdGggdGhpcyBzdGFnZSksIGFuZCBhIHRocm93IGZyb20gYG9uRXJyb3JgIGl0c2VsZiBpcyBkcm9wcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcm91dGVGYWlsdXJlOiBIb29rRmFpbHVyZSA9IChlcnJvciwgX3JlY29yZGVyLCBob29rKSA9PiB7XG4gICAgaWYgKGhvb2sgPT09ICdvbkVycm9yJykgcmV0dXJuO1xuICAgIHRoaXMuX2ludm9rZUhvb2soXG4gICAgICAnb25FcnJvcicsXG4gICAgICByZWNvcmRlckZhaWx1cmVFdmVudChcbiAgICAgICAge1xuICAgICAgICAgIHN0YWdlTmFtZTogdGhpcy5fc3RhZ2VOYW1lLFxuICAgICAgICAgIHN0YWdlSWQ6IHRoaXMuX3N0YWdlQ29udGV4dC5zdGFnZUlkLFxuICAgICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLl9zdGFnZUNvbnRleHQucnVudGltZVN0YWdlSWQsXG4gICAgICAgICAgcGlwZWxpbmVJZDogdGhpcy5fc3RhZ2VDb250ZXh0LnJ1bklkLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgaG9vayxcbiAgICAgICksXG4gICAgKTtcbiAgfTtcbn1cblxuLyoqIFRoZSBzaWduYWwgb2YgYSBzdGFnZSBvdXRzaWRlIHRoZSBydW5uZXIgaW4gYSBydW4gd2l0aCBubyBzaWduYWw6IG9uZSB0aGF0IG5ldmVyIGFib3J0cywgc2hhcmVkLiAqL1xuY29uc3QgTkVWRVJfQUJPUlRFRDogQWJvcnRTaWduYWwgPSBuZXcgQWJvcnRDb250cm9sbGVyKCkuc2lnbmFsO1xuXG4vKiogVGhlIG5hbWUgYSBsYXRlIGRldGFjaCBpcyByZWNvcmRlZCB1bmRlcjogdGhlIGNoaWxkIGNoYXJ0J3Mgcm9vdCBpZCDigJQgYSBuYW1lLCBuZXZlciBpdHMgaW5wdXQuICovXG5mdW5jdGlvbiBkZXRhY2hLZXkoY2hpbGQ6IEZsb3dDaGFydCk6IHN0cmluZyB7XG4gIGNvbnN0IGlkID0gKGNoaWxkIGFzIHsgcm9vdD86IHsgaWQ/OiB1bmtub3duIH0gfSB8IHVuZGVmaW5lZCk/LnJvb3Q/LmlkO1xuICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyA/IGBkZXRhY2g6JHtpZH1gIDogJ2RldGFjaCc7XG59XG4iXX0=
|