footprintjs 10.2.1 → 10.3.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/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/capture/nativeCoverage.d.ts +56 -0
- package/dist/esm/lib/capture/nativeCoverage.js +102 -0
- package/dist/esm/lib/memory/StageContext.d.ts +5 -0
- package/dist/esm/lib/memory/StageContext.js +27 -6
- package/dist/esm/lib/memory/attention.d.ts +2 -0
- package/dist/esm/lib/memory/attention.js +12 -5
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +12 -1
- package/dist/esm/lib/recorder/ControlDepRecorder.js +23 -1
- package/dist/esm/lib/recorder/snapshot.d.ts +1 -1
- package/dist/esm/lib/recorder/snapshot.js +7 -2
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +9 -0
- package/dist/esm/lib/runner/ExecutionRuntime.js +13 -1
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +2 -0
- package/dist/esm/lib/runner/FlowChartExecutor.js +31 -2
- package/dist/esm/lib/runner/attach.js +4 -2
- package/dist/esm/lib/runner/options.d.ts +3 -0
- package/dist/esm/lib/runner/options.js +5 -1
- package/dist/esm/lib/runner/snapshot.d.ts +3 -1
- package/dist/esm/lib/runner/snapshot.js +35 -4
- package/dist/esm/lib/scope/ScopeFacade.js +4 -2
- package/dist/esm/lib/scope/runtime.d.ts +2 -0
- package/dist/esm/lib/scope/runtime.js +9 -1
- package/dist/index.js +1 -1
- package/dist/lib/capture/nativeCoverage.js +107 -0
- package/dist/lib/memory/StageContext.js +27 -6
- package/dist/lib/memory/attention.js +12 -5
- package/dist/lib/recorder/ControlDepRecorder.js +23 -1
- package/dist/lib/recorder/snapshot.js +7 -2
- package/dist/lib/runner/ExecutionRuntime.js +13 -1
- package/dist/lib/runner/FlowChartExecutor.js +34 -5
- package/dist/lib/runner/attach.js +3 -1
- package/dist/lib/runner/options.js +5 -1
- package/dist/lib/runner/snapshot.js +35 -4
- package/dist/lib/scope/ScopeFacade.js +3 -1
- package/dist/lib/scope/runtime.js +12 -2
- package/dist/types/index.d.ts +1 -0
- package/dist/types/lib/capture/nativeCoverage.d.ts +56 -0
- package/dist/types/lib/memory/StageContext.d.ts +5 -0
- package/dist/types/lib/memory/attention.d.ts +2 -0
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +12 -1
- package/dist/types/lib/recorder/snapshot.d.ts +1 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +9 -0
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +2 -0
- package/dist/types/lib/runner/options.d.ts +3 -0
- package/dist/types/lib/runner/snapshot.d.ts +3 -1
- package/dist/types/lib/scope/runtime.d.ts +2 -0
- package/package.json +1 -1
|
@@ -68,6 +68,8 @@ export class StageContext {
|
|
|
68
68
|
policy = DEFAULT_RUN_POLICY;
|
|
69
69
|
/** The emitting frame's logical leg, never the mutable executor's current leg. */
|
|
70
70
|
emitRunId;
|
|
71
|
+
/** The native root-log collector; copied to same-log frames, never child runtimes. */
|
|
72
|
+
capture;
|
|
71
73
|
stageName = '';
|
|
72
74
|
/** Unique stage identifier from the builder (matches spec node id). */
|
|
73
75
|
stageId;
|
|
@@ -282,6 +284,7 @@ export class StageContext {
|
|
|
282
284
|
*/
|
|
283
285
|
inheritRun(from) {
|
|
284
286
|
this.adoptPolicy(from.policy);
|
|
287
|
+
this.capture = from.capture;
|
|
285
288
|
this.record.useMirror(from.record.mirror);
|
|
286
289
|
}
|
|
287
290
|
/**
|
|
@@ -503,6 +506,15 @@ export class StageContext {
|
|
|
503
506
|
* `'summary'` records a cheap marker, `'off'` records nothing.
|
|
504
507
|
*/
|
|
505
508
|
getValue(path, key, description) {
|
|
509
|
+
try {
|
|
510
|
+
return this.readRetainedValue(path, key, description);
|
|
511
|
+
}
|
|
512
|
+
catch (error) {
|
|
513
|
+
this.capture?.limit('read-retention-failed');
|
|
514
|
+
throw error;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
readRetainedValue(path, key, description) {
|
|
506
518
|
// The record frame serves the value (two tiers) and keeps the per-write
|
|
507
519
|
// provenance registry (#P1) — key strings only, independent of the
|
|
508
520
|
// readTracking retention dial (which governs VALUE retention below).
|
|
@@ -710,6 +722,15 @@ export class StageContext {
|
|
|
710
722
|
* reads them post-run for the execution-tree snapshot.
|
|
711
723
|
*/
|
|
712
724
|
commit(phase) {
|
|
725
|
+
try {
|
|
726
|
+
this.commitRetained(phase);
|
|
727
|
+
}
|
|
728
|
+
catch (error) {
|
|
729
|
+
this.capture?.limit('commit-retention-failed');
|
|
730
|
+
throw error;
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
commitRetained(phase) {
|
|
713
734
|
// A continuation only AFTER the execution's own bundle (see above).
|
|
714
735
|
const continuation = this._committed ? phase : undefined;
|
|
715
736
|
this.materialiseWrites();
|
|
@@ -791,7 +812,7 @@ export class StageContext {
|
|
|
791
812
|
/** Append one attempt's record — the attempt runner calls this as each attempt ends. */
|
|
792
813
|
recordAttempt(record) {
|
|
793
814
|
(this._attempts ??= []).push(record);
|
|
794
|
-
(this._attention ??= new StageAttention()).recordAttempt(record, this.runtimeStageId);
|
|
815
|
+
(this._attention ??= new StageAttention(() => this.capture?.limit('attention-omitted'))).recordAttempt(record, this.runtimeStageId);
|
|
795
816
|
this.noteAttempt(record);
|
|
796
817
|
// The stage attempt is over, however it ended: the calls it made stop (P2).
|
|
797
818
|
this.endCalls(record.attempt);
|
|
@@ -799,7 +820,7 @@ export class StageContext {
|
|
|
799
820
|
/** Stamp the series' summary — once, when the runner ends the series. */
|
|
800
821
|
endAttempts(summary) {
|
|
801
822
|
this._attemptSummary = summary;
|
|
802
|
-
(this._attention ??= new StageAttention()).recordSummary(summary);
|
|
823
|
+
(this._attention ??= new StageAttention(() => this.capture?.limit('attention-omitted'))).recordSummary(summary);
|
|
803
824
|
}
|
|
804
825
|
/** Reset only at the node's execution stamp, never between attempts. */
|
|
805
826
|
beginAttention() {
|
|
@@ -807,7 +828,7 @@ export class StageContext {
|
|
|
807
828
|
}
|
|
808
829
|
/** Delegate the explicit retained-error fact; attention owns validation of its proof. */
|
|
809
830
|
markStageFailure() {
|
|
810
|
-
(this._attention ??= new StageAttention()).stageFailed(this.debug.errorContext);
|
|
831
|
+
(this._attention ??= new StageAttention(() => this.capture?.limit('attention-omitted'))).stageFailed(this.debug.errorContext);
|
|
811
832
|
}
|
|
812
833
|
/**
|
|
813
834
|
* The crash-safe record (10.1, P6): an attempt that ended is noted in the run's sink AT ONCE, beside this frame's
|
|
@@ -935,12 +956,12 @@ export class StageContext {
|
|
|
935
956
|
if (this._callRecords < MAX_CALL_RECORDS) {
|
|
936
957
|
this._callRecords += 1;
|
|
937
958
|
(this._attempts ??= []).push(record);
|
|
938
|
-
(this._attention ??= new StageAttention()).recordAttempt(record, this.runtimeStageId);
|
|
959
|
+
(this._attention ??= new StageAttention(() => this.capture?.limit('attention-omitted'))).recordAttempt(record, this.runtimeStageId);
|
|
939
960
|
this.noteAttempt(record);
|
|
940
961
|
}
|
|
941
962
|
else {
|
|
942
963
|
this._attemptsDropped += 1;
|
|
943
|
-
(this._attention ??= new StageAttention()).attemptDropped();
|
|
964
|
+
(this._attention ??= new StageAttention(() => this.capture?.limit('attention-omitted'))).attemptDropped();
|
|
944
965
|
}
|
|
945
966
|
this._attemptReporter?.(record, structuredError);
|
|
946
967
|
}
|
|
@@ -1103,4 +1124,4 @@ export class StageContext {
|
|
|
1103
1124
|
return snapshot;
|
|
1104
1125
|
}
|
|
1105
1126
|
}
|
|
1106
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUlILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUc5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBK0Isa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUcsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3ZGLE9BQU8sRUFDTCxLQUFLLEVBQ0wsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixPQUFPLEVBQ1AsU0FBUyxHQUNWLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRSxtSEFBbUg7QUFDbkgsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDO0FBRTVCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFFckMsdUhBQXVIO0FBQ3ZILFNBQVMsZ0JBQWdCO0lBQ3ZCLE9BQU8sSUFBSSxLQUFLLENBQ2QsOEdBQThHO1FBQzVHLHVEQUF1RCxDQUMxRCxD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R0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzFDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDbEQsQ0FBQztRQUNELHNHQUFzRztRQUN0Ryw4REFBOEQ7UUFDOUQsSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLFFBQVEsQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxJQUFJLENBQUMsZUFBZTtZQUFFLFFBQVEsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUN6RSxJQUFJLElBQUksQ0FBQyxXQUFXO1lBQUUsUUFBUSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUNqRixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDO1lBQUUsUUFBUSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDaEYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUM5QyxJQUFJLFNBQVMsRUFBRSxNQUFNO1lBQUUsUUFBUSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDdEQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFnZUNvbnRleHQg4oCUIEV4ZWN1dGlvbiBjb250ZXh0IGZvciBhIHNpbmdsZSBzdGFnZSBpbiBhIGZsb3djaGFydCBydW5cbiAqXG4gKiBMaWtlIGEgc3RhY2sgZnJhbWUgaW4gYSBjb21waWxlci9ydW50aW1lOlxuICogLSBBIFJlY29yZEZyYW1lIOKAlCB0aGUgcmVjb3JkIGhhbGYgKEMzKTogdGhlIGhlYXAsIHRoZSBhZGRyZXNzLCB0aGVcbiAqICAgZmlyc3QtdG91Y2ggYmFzZSwgdGhlIGxhenkgdHJhbnNhY3Rpb24gYnVmZmVyIGFuZCBldmVyeSB3cml0ZSdzIHNjcnViXG4gKiAgIChDNCksIHRoZSByZWFkS2V5cyBsaXN0XG4gKiAtIExpbmtzIHRvIHBhcmVudC9jaGlsZC9uZXh0IGNvbnRleHRzIChjYWxsIHN0YWNrIGZyYW1lcylcbiAqIC0gV2hhdCBiZWxvbmdzIHRvIGEgc3RhZ2UgaW5zaWRlIGEgcnVuOiByZXRlbnRpb24gb2YgcmVhZHMgYW5kIHdyaXRlcywgdGhlXG4gKiAgIHJlZGFjdGlvbiBkZWNpc2lvbiBwZXIgd3JpdGUgKGByZWRhY3Rpb24udHMgwrcgZGVjaWRlV3JpdGVgKSBhbmQgd2hlcmUgdGhlXG4gKiAgIGZyYW1lIHdyaXRlcyAoYHJ1bkFkZHJlc3MudHNgKSwgdGhlIGRldi1tb2RlIHdhcm5pbmdzLCB0aGUgY29tbWl0IG9ic2VydmVyXG4gKiAtIERpYWdub3N0aWNDb2xsZWN0b3IgZm9yIGxvZ3MsIGVycm9ycywgbWV0cmljc1xuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tbWl0UGhhc2UsIEVtaXRTb3VyY2VQb3NpdGlvbiwgVW50cmFja2VkU291cmNlIH0gZnJvbSAnZm9vdHRyYWNlJztcbmltcG9ydCB0eXBlIHsgRXZlbnRMb2csIFNoYXJlZE1lbW9yeSwgV3JpdGVWZXJiIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcbmltcG9ydCB7IFJlY29yZEZyYW1lIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHR5cGUgeyBBdHRlbXB0Q29udGV4dCwgQXR0ZW1wdFJlY29yZCwgQXR0ZW1wdFN1bW1hcnksIExhdGVXcml0ZSB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHsgc3VtbWFyaXplUmVhZFZhbHVlLCBzdW1tYXJpemVXcml0ZVZhbHVlIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IHR5cGUgVGVybWluYWxGYWlsdXJlQ29udGV4dCwgTmF0aXZlRmFpbHVyZVN0YXRlIH0gZnJvbSAnLi4vZXJyb3JzL3Rlcm1pbmFsRmFpbHVyZS5qcyc7XG5pbXBvcnQgeyBTdGFnZUF0dGVudGlvbiB9IGZyb20gJy4vYXR0ZW50aW9uLmpzJztcbmltcG9ydCB7IGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlLCBjb21taXR0ZWRNdXRhdGlvbk1lc3NhZ2UsIGZpcnN0RGlmZmVyaW5nUGF0aCB9IGZyb20gJy4vYm9ycm93ZWRNdXRhdGlvbi5qcyc7XG5pbXBvcnQgeyB0eXBlIERpYWdub3N0aWNDaGFubmVsLCBEaWFnbm9zdGljQ29sbGVjdG9yIH0gZnJvbSAnLi9EaWFnbm9zdGljQ29sbGVjdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd0NvbnRyb2xUeXBlLCBGbG93TWVzc2FnZSwgUmVhZFRyYWNraW5nTW9kZSwgU3RhZ2VTbmFwc2hvdCwgV3JpdGVUcmFja2luZ01vZGUgfSBmcm9tICcuL2ZyYW1lVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25WZXJkaWN0IH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHtcbiAgQ0xFQVIsXG4gIGRlY2lkZVdyaXRlLFxuICBpbmhlcml0QnlJZGVudGl0eSxcbiAgbWFya1N0YWdlZFdyaXRlLFxuICBSZWRhY3Rpb25SdWxlLFxuICBTQ09QRV9QTEFDRUhPTERFUixcbiAgc2NydWJPZixcbiAgdXNlcktleU9mLFxufSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBydW5BZGRyZXNzIH0gZnJvbSAnLi9ydW5BZGRyZXNzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHsgREVGQVVMVF9SVU5fUE9MSUNZLCB3aXRoUmVkYWN0aW9uIH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuXG4vKiogSG93IG1hbnkgbGF0ZSB3cml0ZXMgYSBzdGFnZSBrZWVwcyDigJQgYW4gYWJhbmRvbmVkIGF0dGVtcHQgdGhhdCBsb29wcyBtdXN0IG5vdCBncm93IHRoZSByZWNvcmQgd2l0aG91dCBib3VuZC4gKi9cbmNvbnN0IE1BWF9MQVRFX1dSSVRFUyA9IDEwMDtcblxuLyoqXG4gKiBIb3cgbWFueSBjYWxsIGFuZCBvYnNlcnZlZCBhdHRlbXB0IHJlY29yZHMgb25lIHN0YWdlIGV4ZWN1dGlvbiBrZWVwcyAoUDIpIOKAlCBhIHN0YWdlIHRoYXQgY2FsbHMgaW4gYSBsb29wIG11c3RcbiAqIG5vdCBncm93IHRoZSBleGVjdXRpb24gdHJlZSB3aXRob3V0IGJvdW5kLiBUaGUgcmVzdCBhcmUgY291bnRlZCAoYFN0YWdlU25hcHNob3QuYXR0ZW1wdHNEcm9wcGVkYCkgYW5kIHN0aWxsXG4gKiBmaXJlZCBvbiBgb25BdHRlbXB0YC4gQSBzdGFnZSdzIE9XTiBhdHRlbXB0IHJlY29yZHMgYXJlIG5ldmVyIGRpc3BsYWNlZDogaXRzIHBvbGljeSdzIGNlaWxpbmcgYm91bmRzIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQ0FMTF9SRUNPUkRTID0gMTAwMDtcblxuLyoqIFdoeSBhIGNhbGwgc3RvcHBlZCB3aGVuIHRoZSBzdGFnZSBhdHRlbXB0IHRoYXQgbWFkZSBpdCBlbmRlZCB3aXRob3V0IGEgcmVhc29uIG9mIGl0cyBvd24gKGl0IHJldHVybmVkIG9yIHRocmV3KS4gKi9cbmZ1bmN0aW9uIGNhbGxzRW5kZWRSZWFzb24oKTogRXJyb3Ige1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgICdbZm9vdHByaW50XSAkY2FsbDogdGhlIHN0YWdlIGF0dGVtcHQgdGhhdCBtYWRlIHRoaXMgY2FsbCBoYXMgZW5kZWQg4oCUIHRoZSBjYWxsIHN0b3BzLCBhbmQgbm90aGluZyBpdCByZWNvcmRzICcgK1xuICAgICAgJ2xhbmRzIG9uIHRoZSBzdGFnZS4gQXdhaXQgZXZlcnkgY2FsbCB0aGUgc3RhZ2UgbWFrZXMuJyxcbiAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIFN0YWdlQ29udGV4dCB7XG4gIC8qKiBAaW50ZXJuYWwgT3duZXJzaGlwIG9mIGFuIGVzY2FwaW5nIGZhaWx1cmUuIFNoYXJlZCBvbmx5IGJ5IHNlcXVlbnRpYWwgZnJhbWVzLCBuZXZlciBzZXJpYWxpemVkLiAqL1xuICBmYWlsdXJlU3RhdGUgPSBuZXcgTmF0aXZlRmFpbHVyZVN0YXRlKCk7XG4gICNmYWlsdXJlSWRlbnRpdHk/OiBOb25OdWxsYWJsZTxUZXJtaW5hbEZhaWx1cmVDb250ZXh0WydzdGFnZSddPjtcblxuICAvKiogQGludGVybmFsIFRoZSBuYXRpdmUgZnJhbWUgc3RhbXAsIGluZGVwZW5kZW50IG9mIG11dGFibGUgcmVjb3JkZXIgZXZlbnQgY29udGV4dC4gKi9cbiAgZ2V0IGZhaWx1cmVJZGVudGl0eSgpOiBOb25OdWxsYWJsZTxUZXJtaW5hbEZhaWx1cmVDb250ZXh0WydzdGFnZSddPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2ZhaWx1cmVJZGVudGl0eTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgU3RhbXBlZCBiZWZvcmUgb2JzZXJ2ZXJzOyBuZXZlciBpbmhlcml0ZWQgYnkgYW5vdGhlciBmcmFtZSBvciBwZXJzaXN0ZWQuICovXG4gIGJpbmRGYWlsdXJlSWRlbnRpdHkocnVuSWQ6IHN0cmluZywgcnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuI2ZhaWx1cmVJZGVudGl0eSA9IE9iamVjdC5mcmVlemUoeyBydW5JZCwgcnVudGltZVN0YWdlSWQgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlY29yZCBoYWxmIG9mIHRoaXMgZnJhbWUgKGBSZWNvcmRGcmFtZS50c2AsIEwzLCBDMyk6IHRoZSBoZWFwIGFuZCxcbiAgICogd2hlbiB0aGUgcnVuIGtlZXBzIHRoZW0sIHRoZSByZWRhY3RlZCBtaXJyb3IgYW5kIHRoZSBsb2c7IHRoZSBhZGRyZXNzO1xuICAgKiB0aGUgZmlyc3QtdG91Y2ggYmFzZTsgdGhlIGxhenkgdHJhbnNhY3Rpb24gYnVmZmVyOyB0aGUgcmVhZEtleXMgbGlzdC5cbiAgICogRXZlcnkgc3RhdGUgcmVhZCBvZiB0aGlzIGZyYW1lIGdvZXMgdGhyb3VnaCBpdCwgYW5kIHNvIGRvZXMgZXZlcnlcbiAgICogY29tbWl0LiBUaGUgbWlycm9yIGlzIHByZXNlbnQgKipvbmx5Kiogd2hlbiB0aGUgcnVuJ3MgcG9saWN5IGtlZXBzIGFcbiAgICogcmVkYWN0ZWQgdmlldyAoYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkKSDigJQgcmVhZCB2aWFcbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yLmdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCwgdGhlIGZvdW5kYXRpb24gZm9yXG4gICAqIHNoYXJpbmcgYSB0cmFjZSB3aXRob3V0IGxlYWtpbmcgcmF3IFBJSSB0aHJvdWdoIGBzaGFyZWRTdGF0ZWAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlY29yZDogUmVjb3JkRnJhbWU7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgcG9saWN5IOKAlCB0aGUgZm91ciBkaWFscywgdGhlIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yIGZsYWdcbiAgICogKGBydW5Qb2xpY3kudHNgLCBGNSkuIEhlbGQgQlkgUkVGRVJFTkNFOiBvbmUgZnJvemVuIG9iamVjdCBwZXIgcnVuIChhbmRcbiAgICogcGVyIHJlc3VtZSksIHNoYXJlZCBieSBldmVyeSBmcmFtZSBvZiB0aGUgcnVuLCBhIHN1YmZsb3cncyBpbmNsdWRlZCDigJRcbiAgICoge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH0gcGFzcyB0aGUgcmVmZXJlbmNlXG4gICAqICh7QGxpbmsgaW5oZXJpdFJ1bn0pLCB0aGUgcnVudGltZSBpbnN0YWxscyBpdCBvbiBpdHMgcm9vdFxuICAgKiAoe0BsaW5rIHVzZVBvbGljeX0pLiBOZXZlciBlZGl0ZWQ7IGEgY2hhbmdlIGlzIGEgbmV3IG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgcG9saWN5OiBSdW5Qb2xpY3kgPSBERUZBVUxUX1JVTl9QT0xJQ1k7XG4gIC8qKiBUaGUgZW1pdHRpbmcgZnJhbWUncyBsb2dpY2FsIGxlZywgbmV2ZXIgdGhlIG11dGFibGUgZXhlY3V0b3IncyBjdXJyZW50IGxlZy4gKi9cbiAgcHJpdmF0ZSBlbWl0UnVuSWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHN0YWdlTmFtZSA9ICcnO1xuICAvKiogVW5pcXVlIHN0YWdlIGlkZW50aWZpZXIgZnJvbSB0aGUgYnVpbGRlciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBwdWJsaWMgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBTZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBzdGFnZSBleGVjdXRpb24uICovXG4gIHB1YmxpYyBydW50aW1lU3RhZ2VJZCA9ICcnO1xuICAvKipcbiAgICogRGVjbGFyZWQgdGFncyAoOS4yMS4wKSBmb3IgdGhlIHN0YWdlIHRoaXMgY29udGV4dCBpcyBleGVjdXRpbmcuIFNldCBieVxuICAgKiB0aGUgdHJhdmVyc2VyIGJlc2lkZSBgcnVudGltZVN0YWdlSWRgIChwZXItbm9kZSBpZGVudGl0eSDigJQgTk9UIGluaGVyaXRlZFxuICAgKiBieSBgY3JlYXRlTmV4dGAgLyBgY3JlYXRlQ2hpbGRgKSwgcmVjb3JkZWQgb24gdGhlIGZpcnN0IGJ1bmRsZVxuICAgKiBgY29tbWl0KClgIHdyaXRlcywgdGhlbiByZWxlYXNlZCBzbyBhIHJvdXRpbmUgc2Vjb25kIGNvbW1pdCBvbiB0aGUgc2FtZVxuICAgKiBjb250ZXh0IChhIGZvcmsgY2hpbGQncyBmYW4tb3V0IHJlcGVhdCwgYSBtb3VudCdzIGV4aXQgYnVuZGxlKSBjYXJyaWVzXG4gICAqIG5vbmUg4oCUIHRoZSBzYW1lIG9uY2UtcGVyLWV4ZWN1dGlvbiBsYXcgYF91bnRyYWNrZWRTb3VyY2VzYCBrZWVwcy5cbiAgICovXG4gIHB1YmxpYyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgcnVuIHRoaXMgZnJhbWUgYmVsb25ncyB0byDigJQgaXRzIGlkZW50aXR5IG9uIGV2ZXJ5IGV2ZW50LCBhbmQgdGhlIHJ1blxuICAgKiBuYW1lc3BhY2UgaXQgcmVhZHMgYW5kIHdyaXRlcyBpbiAoe0BsaW5rIHJ1bkFkZHJlc3N9KSwgcmVhZCBvbmNlLCB3aGVuIHRoZVxuICAgKiBmcmFtZSBpcyBidWlsdCAoQzMpLiBPbmx5IHtAbGluayB1c2VBZGRyZXNzT2Z9IG1vdmVzIHRoZSBhZGRyZXNzIGFmdGVyXG4gICAqIHRoYXQsIGFuZCBvbmx5IGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4gbmFtZXNwYWNlIHRoaXMgZnJhbWUgd3JpdGVzIGFuZCByZWFkcyBpbiB3aGVuIHRoYXQgaXMgbm90IGl0cyBvd25cbiAgICogYHJ1bklkYCDigJQgc2V0IG9uY2UsIGJlZm9yZSB0aGUgZnJhbWUncyBmaXJzdCB3cml0ZSwgYnlcbiAgICoge0BsaW5rIHVzZUFkZHJlc3NPZn0uIEl0cyBvbmUgdXNlciBpcyBhIHN1YmZsb3cgbW91bnQncyBtZXJnZS1iYWNrIChSMTMpOlxuICAgKiB0aGUgcmVjb3JkIG5hbWVzIHRoZSBtb3VudCwgdGhlIHZhbHVlcyBsYW5kIHdoZXJlIHRoZSBtb3VudCdzIHBhcmVudFxuICAgKiB3cml0ZXMuIEFic2VudCDihpIgYHJ1bklkYCwgc28gZXZlcnkgb3RoZXIgZnJhbWUgaXMgdW50b3VjaGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRyZXNzUnVuSWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBicmFuY2hJZD86IHN0cmluZztcbiAgcHVibGljIGlzRGVjaWRlcjogYm9vbGVhbjtcbiAgcHVibGljIGlzRm9yazogYm9vbGVhbjtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZyb20gYnVpbGRlciAoc2V0IGJ5IHRyYXZlcnNlciBiZWZvcmUgZXhlY3V0aW9uKS4gKi9cbiAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogU3ViZmxvdyBpZGVudGlmaWVyIChzZXQgYnkgdHJhdmVyc2VyIHdoZW4gdGhpcyBpcyBhIHN1YmZsb3cgZW50cnkgcG9pbnQpLiAqL1xuICBwdWJsaWMgc3ViZmxvd0lkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBwYXJlbnQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBuZXh0PzogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgY2hpbGRyZW4/OiBTdGFnZUNvbnRleHRbXTtcblxuICBwdWJsaWMgZGVidWc6IERpYWdub3N0aWNDb2xsZWN0b3IgPSBuZXcgRGlhZ25vc3RpY0NvbGxlY3RvcigoKSA9PiB0aGlzLnBvbGljeS5yZWRhY3Rpb24pO1xuXG4gIC8qKiBUcmFja3MgdXNlci1sZXZlbCB3cml0ZXMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcgYW5kIG9uQ29tbWl0XG4gICAqICDigJQgaW4gdGhlaXIgUkVUQUlORUQgZm9ybSAoY2xvbmVkIC8gc3VtbWFyaXNlZCAvIHJlZGFjdGVkKS4gRmlsbGVkIGZyb21cbiAgICogIHtAbGluayBfcGVuZGluZ1dyaXRlc30gYnkge0BsaW5rIG1hdGVyaWFsaXNlV3JpdGVzfSBhdCBjb21taXQuICovXG4gIHByaXZhdGUgX3N0YWdlV3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PiA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgd3JpdGVzIG9mIHRoZSBDVVJSRU5UIGV4ZWN1dGlvbiwgaGVsZCBieSByZWZlcmVuY2Ugd2l0aCB0aGUgdmVyZGljdFxuICAgKiB0aGV5IHdlcmUgc3RhZ2VkIHVuZGVyICg5LjIzLjApLiBBIGtleSB3cml0dGVuIGsgdGltZXMgaG9sZHMgaXRzIExBU1RcbiAgICogdmFsdWU7IHRoZSByZXRhaW5lZCBmb3JtICh0aGUgYHdyaXRlVHJhY2tpbmdgIGNsb25lIG9yIHN1bW1hcnksIHRoZVxuICAgKiByZWRhY3Rpb24gcGxhY2Vob2xkZXIgb3IgZmllbGQgc2NydWIpIGlzIHRha2VuIE9OQ0UgcGVyIGtleSBhdCBjb21taXQg4oCUXG4gICAqIHNlZSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9LiBTYW1lIGxhdyBhcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3NcbiAgICogcGF0Y2ggdHJlZXM6IHRoZSBjb3B5IHRoZSByZWNvcmQgbmVlZHMgaXMgcGFpZCBhdCB0aGUgYm91bmRhcnksIG5vdCBhdFxuICAgKiBldmVyeSB3cml0ZS4gTGF6aWx5IGFsbG9jYXRlZDsgYSBzdGFnZSB0aGF0IG5ldmVyIHdyaXRlcyBwYXlzIG5vdGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF9wZW5kaW5nV3JpdGVzPzogTWFwPFxuICAgIHN0cmluZyxcbiAgICB7IHZhbHVlOiB1bmtub3duOyB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0OyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9XG4gID47XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHJlYWRzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3LiAqL1xuICBwcml2YXRlIF9zdGFnZVJlYWRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgYF9zdGFnZVJlYWRzYCBrZXlzIHRoYXQgd2VyZSByZWFkIGF0IGEgTkVTVEVEIHBhdGggKGBnZXRWYWx1ZShwYXRoLFxuICAgKiBrZXkpYCB3aXRoIGEgbm9uLWVtcHR5IGBwYXRoYCkuIE9ubHkgdGhlIGVuZ2luZSByZWFkcyB0aGF0IHdheSDigJQgdGhlXG4gICAqIGZhY2FkZSByZWFkcyByb290cyDigJQgc28gdGhlc2UgYXJlIG5vdCB1c2VyIHJlYWRzIGFuZCB0aGUgYm9ycm93ZWQtcmVhZFxuICAgKiBndWFyZCBza2lwcyB0aGVtIGJ5IHRoaXMgbWFya2VyLCBuZXZlciBieSBndWVzc2luZyBmcm9tIGEgZG90IGluIHRoZSBrZXlcbiAgICogKGEgdXNlcidzIHRvcC1sZXZlbCBrZXkgbWF5IGl0c2VsZiBjb250YWluIG9uZSkuIExhemlseSBjcmVhdGVkOyB0aGVcbiAgICogZmFjYWRlIHBhdGggbmV2ZXIgYWxsb2NhdGVzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBfbmVzdGVkUmVhZHM/OiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogRGV2IG1vZGUgb25seTogdGhlIHJvb3Qga2V5cyB3aG9zZSBMQVNUIHRyYWNrZWQgcmVhZCB3YXMgc2VydmVkIGZyb21cbiAgICogY29tbWl0dGVkIHN0YXRlIOKAlCBiZWZvcmUgdGhpcyBzdGFnZSdzIGZpcnN0IHdyaXRlLCB3aGVuIG5vIHRyYW5zYWN0aW9uXG4gICAqIGJ1ZmZlciBleGlzdHMgeWV0LiBTdWNoIGEgcmVhZCBpcyB0aGUgY29tbWl0dGVkIG9iamVjdCBpdHNlbGYsIHNvIGFuXG4gICAqIGluLXBsYWNlIGVkaXQgb2YgaXQgbW92ZXMgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSB0b28gKGNvcHktb24td3JpdGUsXG4gICAqIDkuMjkuMCk7IHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufSBjaGVja3MgdGhlc2Uga2V5cyBldmVuIHdoZW4gdGhlXG4gICAqIHN0YWdlIHdyb3RlIHRoZW0uIE5ldmVyIGFsbG9jYXRlZCBvdXRzaWRlIGBlbmFibGVEZXZNb2RlKClgLlxuICAgKi9cbiAgcHJpdmF0ZSBfdmlld1JlYWRzPzogU2V0PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEhhcyB0aGlzIGZyYW1lIGNvbW1pdHRlZCBhdCBsZWFzdCBvbmNlPyBUaGUgYm9ycm93ZWQtcmVhZCBndWFyZCBydW5zIG9uXG4gICAqIHRoZSBGSVJTVCBjb21taXQgb25seSDigJQgc2VlIHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufS4gVGhlIGZyYW1lXG4gICAqIGl0c2VsZiBzdGF5cyByZS11c2FibGUgYWZ0ZXIgY29tbWl0ICgjMTNiKTogdGhlIGVuZ2luZSdzIGRvdWJsZS1jb21taXRcbiAgICogcGF0aHMgYW5kIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGJyYW5jaCBwYXJlbnQgcmVseSBvbiBpdC4gVGhlXG4gICAqIHVzZXItbGV2ZWwgcmVmdXNhbCBvZiBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIGxpdmVzIGF0IHRoZSBzY29wZVxuICAgKiB0aWVyIChgU2NvcGVGYWNhZGVgLCBvbmUgcGVyIHN0YWdlIGV4ZWN1dGlvbiksIG5vdCBoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29tbWl0dGVkID0gZmFsc2U7XG5cbiAgLyoqIFRyYWNrZWQgcmVhZHMgb2YgYSBzZWxlY3RlZCB2YWx1ZSAoe0BsaW5rIHNlbGVjdGVkUmVhZHN9KS4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSZWFkcyA9IDA7XG4gIC8qKiBFYWNoIG9iamVjdCB0aGlzIGZyYW1lIHJlYWQgdW5kZXIgYSBzZWxlY3RlZCBuYW1lIOKGkiB0aGF0IHJlYWQncyB2ZXJkaWN0IChgc3RhZ2VXcml0ZWAgaGFuZHMgaXQgb24pLiAqL1xuICBwcml2YXRlIF9zZWxlY3RlZE9iamVjdHM/OiBXZWFrTWFwPG9iamVjdCwgUmVkYWN0aW9uVmVyZGljdD47XG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDIgaG9uZXN0eSBtYXJrZXJzIOKAlCB1bnRyYWNrZWQgcmVhZCBwYXRocyB1c2VkIGR1cmluZyBUSElTXG4gICAqIHN0YWdlJ3MgZXhlY3V0aW9uIChgJ2FyZ3MnYCAvIGAnZW52J2AgLyBgJ3NpbGVudCdgKS4gTWFya2VkIGJ5XG4gICAqIGBTY29wZUZhY2FkZWAsIHN1cmZhY2VkIG9uIHRoZSBzdGFnZSdzIENvbW1pdEJ1bmRsZSBhc1xuICAgKiBgdW50cmFja2VkU291cmNlc2AsIHRoZW4gUkVMRUFTRUQgd2l0aCB0aGUgc3RhZ2luZyBzdGF0ZSBhdCBjb21taXQgZW5kXG4gICAqIChzbyB0aGUgcm91dGluZSBkb3VibGUtY29tbWl0IHBhdGhzIOKAlCBmb3JrIGNoaWxkcmVuLCBzdWJmbG93IG1vdW50cyDigJRcbiAgICogcmVjb3JkIHRoZSBmaWVsZCBleGFjdGx5IG9uY2UsIG9uIHRoZSBmaXJzdCBjb21taXQpLiBMYXppbHkgYWxsb2NhdGVkOlxuICAgKiBzdGFnZXMgdGhhdCBuZXZlciB0b3VjaCBhbiB1bnRyYWNrZWQgcGF0aCBwYXkgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX3VudHJhY2tlZFNvdXJjZXM/OiBTZXQ8VW50cmFja2VkU291cmNlPjtcblxuICAvKipcbiAgICogVGhlIGF0dGVtcHRzIG9mIHRoaXMgZnJhbWUncyBleGVjdXRpb24gKDEwLjEpIOKAlCBpdHMgb3duIHVuZGVyIHRoZSBhdHRlbXB0IHJ1bm5lciwgYXBwZW5kZWQgYXMgZWFjaCBhdHRlbXB0IGVuZHNcbiAgICogKGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCksIGFuZCB0aG9zZSBvZiB0aGUgY2FsbHMgaXQgbWFkZSAoUDIsIHtAbGluayByZXBvcnRDYWxsQXR0ZW1wdH0pIOKAlCByZWFkXG4gICAqIGJ5IHtAbGluayBzbmFwc2hvdFNlbGZ9LiBBcHBlbmQtb25seVxuICAgKiBldmlkZW5jZSBsaWtlIGBkZWJ1Z2A6IE5PVCBjbGVhcmVkIGJ5IHtAbGluayBkaXNjYXJkU3RhZ2VkfSAodGhlIGVhcmxpZXIgYXR0ZW1wdHMgYXJlIHRoZSBwb2ludCkgYW5kIG5ldmVyXG4gICAqIHBhcnQgb2YgYSBjb21taXQgYnVuZGxlLiBMYXppbHkgYWxsb2NhdGVkOiBhIHN0YWdlIHdpdGhvdXQgYSBwb2xpY3kgcGF5cyBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfYXR0ZW1wdHM/OiBBdHRlbXB0UmVjb3JkW107XG4gIC8qKiBUaGUgYXR0ZW1wdCBzZXJpZXMgYXQgYSBnbGFuY2UsIHN0YW1wZWQgb25jZSB3aGVuIGl0IGVuZHMuICovXG4gIHByaXZhdGUgX2F0dGVtcHRTdW1tYXJ5PzogQXR0ZW1wdFN1bW1hcnk7XG4gIC8qKiBGYWN0cyBjb2xsZWN0ZWQgZm9yIHRoaXMgZXhlY3V0aW9uIG9ubHk7IHJldHJ5IGRpc2NhcmRzIGRlbGliZXJhdGVseSBrZWVwIHRoZW0uICovXG4gIHByaXZhdGUgX2F0dGVudGlvbj86IFN0YWdlQXR0ZW50aW9uO1xuICAvKipcbiAgICogVGhlIGF0dGVtcHQgbm93IHJ1bm5pbmcgKFAxYikg4oCUIHNldCBieSBgU3RhZ2VSdW5uZXJgIGJlZm9yZSB0aGUgc2NvcGUgaXMgYnVpbHQsIHNvIHRoZSBmYWNhZGUgY2FuIGhhbmQgaXQgb3V0XG4gICAqIChgc2NvcGUuJGF0dGVtcHQoKWApIGFuZCBmZW5jZSBpdHMgb3duIGF0dGVtcHQuIEFic2VudCBmb3IgYSBzdGFnZSB0aGUgYXR0ZW1wdCBydW5uZXIgZG9lcyBub3QgcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBfYXR0ZW1wdD86IEF0dGVtcHRDb250ZXh0O1xuICAvKiogVGhlIHJ1bidzIHNpZ25hbCwgZm9yIHRoZSBhdHRlbXB0IGEgc3RhZ2Ugb3V0c2lkZSB0aGUgcnVubmVyIHJlcG9ydHMgKGF0dGVtcHQgMSBvZiAxKS4gKi9cbiAgcHJpdmF0ZSBfcnVuU2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKiBFdmVyeSBhdHRlbXB0IHVwIHRvIHRoaXMgbnVtYmVyIGhhcyBFTkRFRCB3aXRob3V0IGFuIGFuc3dlciDigJQgaXRzIHNjb3BlIGlzIGZlbmNlZCAoMCA9IG5vbmUpLiAqL1xuICBwcml2YXRlIF9lbmRlZFRocm91Z2ggPSAwO1xuICAvKiogV3JpdGVzIGFuIGF0dGVtcHQgdHJpZWQgYWZ0ZXIgaXQgZW5kZWQg4oCUIGRyb3BwZWQgYXQgdGhlIHNjb3BlLCBrZXB0IGhlcmUgYXMgbmFtZXMuIExhemlseSBhbGxvY2F0ZWQuICovXG4gIHByaXZhdGUgX2xhdGVXcml0ZXM/OiBMYXRlV3JpdGVbXTtcbiAgLyoqXG4gICAqIFdoZXJlIGEgY2FsbCdzIGF0dGVtcHQgcmVjb3JkcyBhcmUgcmVwb3J0ZWQgKFAyKSDigJQgdGhlIGVuZ2luZSdzIGBvbkF0dGVtcHRgIGZvciB0aGlzIHN0YWdlIGV4ZWN1dGlvbiwgc2V0IGJ5XG4gICAqIGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCB3aXRoIHRoZSBzdGFnZSdzIG93biB0cmF2ZXJzYWwgY29udGV4dCAoYW5kIGl0cyBjb3JyZWxhdGlvbikuXG4gICAqL1xuICBwcml2YXRlIF9hdHRlbXB0UmVwb3J0ZXI/OiAocmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8gfCB1bmRlZmluZWQpID0+IHZvaWQ7XG5cbiAgLyoqIENhbGxzIG1hZGUgc28gZmFyLCBwZXIgc3RhZ2UgYXR0ZW1wdCDigJQgdGhlIGBrYCBvZiBhIGNhbGwncyBzZXJpZXMuIExhemlseSBhbGxvY2F0ZWQuICovXG4gIHByaXZhdGUgX2NhbGxPcmRpbmFscz86IE1hcDxudW1iZXIsIG51bWJlcj47XG4gIC8qKiBQZXIgc3RhZ2UgYXR0ZW1wdCwgdGhlIHNpZ25hbCBpdHMgY2FsbHMgc3RvcCBieSAoYGNhbGxzRW5kZWRTaWduYWxgKS4gTGF6aWx5IGFsbG9jYXRlZC4gKi9cbiAgcHJpdmF0ZSBfY2FsbHNFbmRlZD86IE1hcDxudW1iZXIsIEFib3J0Q29udHJvbGxlcj47XG4gIC8qKiBDYWxsIGFuZCBvYnNlcnZlZCByZWNvcmRzIGtlcHQgb24gdGhlIGZyYW1lLCBhbmQgdGhvc2UgcGFzdCB7QGxpbmsgTUFYX0NBTExfUkVDT1JEU30uICovXG4gIHByaXZhdGUgX2NhbGxSZWNvcmRzID0gMDtcbiAgcHJpdmF0ZSBfYXR0ZW1wdHNEcm9wcGVkID0gMDtcblxuICAvKiogT2JzZXJ2ZXIgY2FsbGVkIGFmdGVyIGNvbW1pdCgpIOKAlCB1c2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGZpcmUgU2NvcGVSZWNvcmRlci5vbkNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfY29tbWl0T2JzZXJ2ZXI/OiAoXG4gICAgbXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PixcbiAgKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgICBzaGFyZWRNZW1vcnk6IFNoYXJlZE1lbW9yeSxcbiAgICBicmFuY2hJZD86IHN0cmluZyxcbiAgICBldmVudExvZz86IEV2ZW50TG9nLFxuICAgIGlzRGVjaWRlcj86IGJvb2xlYW4sXG4gICkge1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgICB0aGlzLnN0YWdlTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdGFnZUlkID0gc3RhZ2VJZDtcbiAgICB0aGlzLnJlY29yZCA9IG5ldyBSZWNvcmRGcmFtZShzaGFyZWRNZW1vcnksIGV2ZW50TG9nLCBydW5BZGRyZXNzKHJ1bklkKSk7XG4gICAgdGhpcy5yZWNvcmQudXNlRW5jb2RpbmcodGhpcy5wb2xpY3kpO1xuICAgIHRoaXMuYnJhbmNoSWQgPSBicmFuY2hJZDtcbiAgICB0aGlzLmlzRGVjaWRlciA9ICEhaXNEZWNpZGVyO1xuICAgIHRoaXMuaXNGb3JrID0gZmFsc2U7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgU2hhcmVkTWVtb3J5IGluc3RhbmNlIChuZWVkZWQgYnkgc2NvcGUgbGF5ZXIpLiAqL1xuICBnZXRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQuc3RhdGU7XG4gIH1cblxuICAvKiogQGludGVybmFsIFN0YW1wZWQgYmVzaWRlIHJ1bnRpbWVTdGFnZUlkLCBiZWZvcmUgc2NvcGUgY29uc3RydWN0aW9uLiAqL1xuICBiaW5kRW1pdE9yaWdpbihydW5JZDogc3RyaW5nLCBkcmlsbFBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5lbWl0UnVuSWQgPSBkcmlsbFBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJ1bklkO1xuICAgIGlmIChkcmlsbFBhdGggIT09IHVuZGVmaW5lZCkgdGhpcy5yZWNvcmQubG9nPy5iaW5kQWRkcmVzcyhydW5JZCwgZHJpbGxQYXRoKTtcbiAgfVxuXG4gIC8qKiBDYXB0dXJlIGZyb20gdGhpcyBmcmFtZSdzIE9XTiBsb2cuIEEgbWFudWFsL3VuYWRkcmVzc2FibGUgZnJhbWUgc3RheXMgdW5rbm93bi4gKi9cbiAgY2FwdHVyZUVtaXRQb3NpdGlvbigpOiBFbWl0U291cmNlUG9zaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVtaXRSdW5JZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5yZWNvcmQubG9nPy5jYXB0dXJlUG9zaXRpb24odGhpcy5lbWl0UnVuSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYSBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IuIFN1YnNlcXVlbnQgYGNvbW1pdCgpYCBjYWxscyBhcHBseVxuICAgKiB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzIOKAlCB0aGUgb25lcyB0aGUgbG9nIHJlY29yZHMg4oCUIHRvXG4gICAqIHRoaXMgbWlycm9yLCBiZXNpZGUgdGhlIHJhdyBwYXRjaGVzIG9uIHRoZSBoZWFwIChgcmVjb3JkQ29tbWl0YCkuXG4gICAqIENoaWxkIC8gbmV4dCBjb250ZXh0cyBpbmhlcml0IHRoZSBtaXJyb3IgdmlhIGBjcmVhdGVOZXh0YCAvIGBjcmVhdGVDaGlsZGAuXG4gICAqXG4gICAqIENhbGxlZCBvbiBhIHJ1bnRpbWUncyByb290IGZyYW1lIGJ5IGBFeGVjdXRpb25SdW50aW1lYCB3aGVuIHRoZSBydW4ncyBwb2xpY3kga2VlcHMgYSBtaXJyb3IuXG4gICAqL1xuICB1c2VSZWRhY3RlZE1pcnJvcihtaXJyb3I6IFNoYXJlZE1lbW9yeSk6IHZvaWQge1xuICAgIHRoaXMucmVjb3JkLnVzZU1pcnJvcihtaXJyb3IpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHJlZGFjdGVkIG1pcnJvciBpZiBpbnN0YWxsZWQsIGVsc2UgdW5kZWZpbmVkLiAqL1xuICBnZXRSZWRhY3RlZFNoYXJlZE1lbW9yeSgpOiBTaGFyZWRNZW1vcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5taXJyb3I7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCB0aGUgcnVuJ3MgcG9saWN5IChgcnVuUG9saWN5LnRzYCkgb24gdGhpcyBmcmFtZSDigJQgY2FsbGVkIG9uIGFcbiAgICogcnVudGltZSdzIHJvb3QgYnkgYEV4ZWN1dGlvblJ1bnRpbWVgIChhdCBjb25zdHJ1Y3Rpb24sIGFuZCBieVxuICAgKiBgRXhlY3V0aW9uUnVudGltZS51c2VQb2xpY3lgIG9uIGEgc2FtZS1leGVjdXRvciByZXN1bWUpLiBEZXNjZW5kYW50cyBnZXRcbiAgICogdGhlIHNhbWUgcmVmZXJlbmNlIHRocm91Z2gge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH07IGFcbiAgICogc3ViZmxvdydzIHJ1bnRpbWUgaXMgY29uc3RydWN0ZWQgd2l0aCBpdCwgc28gaXRzIHNlZWQgZnJhbWUgYW5kIGV2ZXJ5XG4gICAqIGZyYW1lIGFmdGVyIGNvbW1pdCB1bmRlciB0aGUgcnVuJ3MgZGlhbHMgdG9vLlxuICAgKi9cbiAgdXNlUG9saWN5KHBvbGljeTogUnVuUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5hZG9wdFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgLyoqIFRoZSBydW4ncyBwb2xpY3kgdGhpcyBmcmFtZSByZXRhaW5zLCBlbmNvZGVzIGFuZCBzY3J1YnMgdW5kZXIuICovXG4gIGdldFBvbGljeSgpOiBSdW5Qb2xpY3kge1xuICAgIHJldHVybiB0aGlzLnBvbGljeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGEgcmVkYWN0aW9uIHJ1bGUg4oCUIHRoZSBPTkUgb3duZXIgb2YgXCJ3aGF0IGRvZXMgdGhlIHBvbGljeSBzYXlcbiAgICogYWJvdXQgdGhpcyBwYXRoXCIgKGBtZW1vcnkvcmVkYWN0aW9uLnRzYCkg4oCUIGFzIGEgTkVXIHBvbGljeSBmb3IgdGhpcyBmcmFtZVxuICAgKiAodGhlIHNoYXJlZCBvbmUgaXMgbmV2ZXIgZWRpdGVkKS4gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bGUgYXJyaXZlc1xuICAgKiB3aXRoIHRoZSBydW4ncyBwb2xpY3k7IHRoaXMgZG9vciBpcyBmb3IgYSBgU2NvcGVGYWNhZGVgIG9uIGEgYmFyZSBmcmFtZVxuICAgKiAodW5pdCB0ZXN0cywgaGFuZC1idWlsdCBzY29wZXMpLCB3aGljaCBicmluZ3MgaXRzIG93biBydWxlLiBFdmVyeSBzdGFnZWRcbiAgICogd3JpdGUgYW5kIGV2ZXJ5IHRyYWNrZWQgcmVhZCBhc2tzIGl0LCBzbyBhIHdyaXRlIHRoYXQgbmV2ZXIgcGFzc2VzIGFcbiAgICogZmFjYWRlIOKAlCBhIHN1YmZsb3cgc2VlZCwgYW4gYG91dHB1dE1hcHBlcmAgbWVyZ2UtYmFjaywgYSByZXN1bWUgcmUtc2VlZCDigJRcbiAgICogaXMgcmV0YWluZWQgdW5kZXIgdGhlIHNhbWUgdmVyZGljdCBhcyBhIGZhY2FkZSB3cml0ZS4gQWJzZW50OiBldmVyeVxuICAgKiB2ZXJkaWN0IGlzIGAnY2xlYXInYCB1bmxlc3MgdGhlIGNhbGxlciBwYXNzZWQgYW4gZXhwbGljaXQgZmxhZy5cbiAgICovXG4gIHVzZVJlZGFjdGlvblJ1bGUocnVsZTogUmVkYWN0aW9uUnVsZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvbGljeS5yZWRhY3Rpb24gIT09IHJ1bGUpIHRoaXMuYWRvcHRQb2xpY3kod2l0aFJlZGFjdGlvbih0aGlzLnBvbGljeSwgcnVsZSkpO1xuICB9XG5cbiAgLyoqIFRoZSBpbnN0YWxsZWQgcmVkYWN0aW9uIHJ1bGUsIGlmIGFueSAodGhlIGZhY2FkZSdzIGxvb2t1cCkuICovXG4gIGdldFJlZGFjdGlvblJ1bGUoKTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5LnJlZGFjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIHRoZSBydW4gZnJvbSBgZnJvbWA6IHRoZSBwb2xpY3kgKGJ5IHJlZmVyZW5jZSkgYW5kIHRoZSBydW4ncyBtaXJyb3JcbiAgICogc3RvcmUuIFRoZSBPTkUgaW5oZXJpdGFuY2Ugc3RlcCDigJQge0BsaW5rIGNyZWF0ZU5leHR9IGFuZFxuICAgKiB7QGxpbmsgY3JlYXRlQ2hpbGR9IGJvdGggY2FsbCBpdCwgYW5kIGl0IG5hbWVzIG5vIGRpYWwuXG4gICAqL1xuICBwcml2YXRlIGluaGVyaXRSdW4oZnJvbTogU3RhZ2VDb250ZXh0KTogdm9pZCB7XG4gICAgdGhpcy5hZG9wdFBvbGljeShmcm9tLnBvbGljeSk7XG4gICAgdGhpcy5yZWNvcmQudXNlTWlycm9yKGZyb20ucmVjb3JkLm1pcnJvcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIE9ORSBwbGFjZSB0aGlzIGZyYW1lJ3MgcG9saWN5IGNoYW5nZXM6IHRoZSBmcmFtZSBob2xkcyBpdCwgYW5kIGl0c1xuICAgKiByZWNvcmQgZnJhbWUgZW5jb2RlcyB1bmRlciB0aGUgc2FtZSByZWZlcmVuY2UgKGBjb21taXRWYWx1ZXNgLFxuICAgKiBgd3JpdGVQcm92ZW5hbmNlYCDigJQgYFJlY29yZEZyYW1lIMK3IHVzZUVuY29kaW5nYCksIHNvIHRoZSB0d28gbmV2ZXIgZGlmZmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhZG9wdFBvbGljeShwb2xpY3k6IFJ1blBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMucmVjb3JkLnVzZUVuY29kaW5nKHBvbGljeSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgdHJhY2tlZCB1c2VyLWxldmVsIHdyaXRlLCBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSkg4oCUIHRoZSBzaW5nbGVcbiAgICogYm9va2tlZXBpbmcgcGF0aCBmb3Ige0BsaW5rIHNldE9iamVjdH0gYW5kIHtAbGluayB1cGRhdGVPYmplY3R9LiBIb2xkc1xuICAgKiB0aGUgUkVGRVJFTkNFIGFuZCB0aGUgdmVyZGljdCAoOS4yMy4wKTsgdGhlIHJldGFpbmVkIGZvcm0gaXMgdGFrZW4gYXRcbiAgICogY29tbWl0IGJ5IHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30sIG9uY2UgcGVyIGtleS5cbiAgICpcbiAgICogUmVkYWN0aW9uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZGlhbCBpbiBFVkVSWSBtb2RlOiBhIHJlZGFjdGVkXG4gICAqIHdyaXRlIHN0b3JlcyB0aGUgYCdbUkVEQUNURURdJ2AgcGxhY2Vob2xkZXIgdW5kZXIgYCdmdWxsJ2AgQU5EXG4gICAqIGAnc3VtbWFyeSdgIChhIHN1bW1hcnkgbWFya2VyIHdvdWxkIGxlYWsgdGhlIHZhbHVlJ3MgcHJldmlldy9zaXplKSxcbiAgICogYW5kIHN0b3JlcyBub3RoaW5nIHVuZGVyIGAnb2ZmJ2AgKGVudHJ5IHNraXBwZWQgZW50aXJlbHkg4oCUIG5vdGhpbmcgdG9cbiAgICogbGVhaykuIEEgZmllbGQtbGV2ZWwgdmVyZGljdCBzY3J1YnMgYSBjbG9uZSBCRUZPUkUgdGhlIGRpYWwgc2VlcyBpdCwgc29cbiAgICogYSBzdW1tYXJ5IHByZXZpZXcgY2FuIG5ldmVyIHNob3cgdGhlIHNlY3JldCBlaXRoZXIuIFRoZSB2ZXJkaWN0IGlzIHRoZVxuICAgKiBvbmUgYHN0YWdlV3JpdGVgIGRlY2lkZWQgQkVGT1JFIHN0YWdpbmcsIGNhcnJpZWQgdG8gY29tbWl0IHdpdGggdGhlXG4gICAqIHZhbHVlLiBUaGUgc3RhZ2VkIHdyaXRlIGl0c2VsZiBpcyB1bmFmZmVjdGVkIOKAlCByZWRhY3Rpb24gb2YgdGhlXG4gICAqIGNvbW1pdHRlZCBwYXlsb2FkIGlzIHRoZSByZWNvcmQgZnJhbWUncyBzY3J1YiBvZiB0aGF0IHdyaXRlXG4gICAqIChgUmVjb3JkRnJhbWUgwrcgd3JpdGVgLCB0aGVuIGBzY3J1Yi50c2AgYXQgY29tbWl0KS5cbiAgICovXG4gIHByaXZhdGUgdHJhY2tXcml0ZShcbiAgICB1c2VyS2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgICBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyxcbiAgKSB7XG4gICAgaWYgKHRoaXMucG9saWN5LndyaXRlVHJhY2tpbmcgPT09ICdvZmYnKSByZXR1cm47XG4gICAgKHRoaXMuX3BlbmRpbmdXcml0ZXMgPz89IG5ldyBNYXAoKSkuc2V0KHVzZXJLZXksIHsgdmFsdWUsIHZlcmRpY3QsIG9wZXJhdGlvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgX3N0YWdlV3JpdGVzYCB3aXRoIGV2ZXJ5IHBlbmRpbmcgd3JpdGUgZm9sZGVkIGluIGFzIGl0cyByZXRhaW5lZCBmb3JtXG4gICAqIOKAlCB0aGUgcmVjb3JkIGEgcmVhZGVyIHNlZXMuIENvbnN1bWVzIG5vdGhpbmc6IGEgbWlkLXJ1biBzbmFwc2hvdCByZWFkc1xuICAgKiB0aGUgd3JpdGVzIHNvIGZhciwgYW5kIGNvbW1pdCBzdGlsbCBtYXRlcmlhbGlzZXMgdGhlIGZpbmFsIHZhbHVlcy5cbiAgICogUmV0dXJucyBgX3N0YWdlV3JpdGVzYCBpdHNlbGYgd2hlbiBub3RoaW5nIGlzIHBlbmRpbmcuXG4gICAqL1xuICBwcml2YXRlIHJldGFpbmVkV3JpdGVzKCk6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+IHtcbiAgICBpZiAoIXRoaXMuX3BlbmRpbmdXcml0ZXMpIHJldHVybiB0aGlzLl9zdGFnZVdyaXRlcztcbiAgICBjb25zdCBvdXQgPSB7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB3XSBvZiB0aGlzLl9wZW5kaW5nV3JpdGVzKSB7XG4gICAgICBvdXRba2V5XSA9IHtcbiAgICAgICAgdmFsdWU6IHRoaXMucmV0YWluZWRGb3JtKHcudmVyZGljdCwgdy52YWx1ZSwgdGhpcy5wb2xpY3kud3JpdGVUcmFja2luZywgc3VtbWFyaXplV3JpdGVWYWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogdy5vcGVyYXRpb24sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgdGhlIHJldGFpbmVkIGZvcm0gb2YgZXZlcnkgcGVuZGluZyB3cml0ZSDigJQgT05DRSBwZXIga2V5LCBmcm9tIHRoZVxuICAgKiB2YWx1ZSBhcyBpdCBzdGFuZHMgYXQgY29tbWl0ICg5LjIzLjApIOKAlCBhbmQgcmVsZWFzZSB0aGUgcmVmZXJlbmNlcy4gVGhlXG4gICAqIGZpcnN0IHRoaW5nIGBjb21taXQoKWAgZG9lcywgc28gdGhlIGJvcnJvd2VkLW11dGF0aW9uIGd1YXJkIGFuZCB0aGVcbiAgICogY29tbWl0IG9ic2VydmVyIHNlZSB0aGUgZmluaXNoZWQgcmVjb3JkLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXRlcmlhbGlzZVdyaXRlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3BlbmRpbmdXcml0ZXMpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fc3RhZ2VXcml0ZXMgPSB0aGlzLnJldGFpbmVkV3JpdGVzKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlbGVhc2VkIGV2ZW4gd2hlbiBhIHJldGFpbmVkIGZvcm0gY2Fubm90IGJlIHRha2VuIOKAlCBhbiB1bmNsb25lYWJsZVxuICAgICAgLy8gdmFsdWUgKGEgZnVuY3Rpb24sIGEgUHJveHkpIGlzIGEgY29udHJhY3QgdmlvbGF0aW9uIChcInN0YXRlIHZhbHVlc1xuICAgICAgLy8gbXVzdCBzdXJ2aXZlIHN0cnVjdHVyZWRDbG9uZVwiKSB0aGF0IG5vdyBzdXJmYWNlcyBIRVJFLCBhdCBjb21taXQsXG4gICAgICAvLyBhbmQgZmFpbHMgdGhlIHJ1biBsb3VkbHk7IGEgbGF0ZXIgc25hcHNob3Qgb2YgdGhlIGZhaWxlZCBydW4gbXVzdFxuICAgICAgLy8gbm90IHRocm93IHRoZSBzYW1lIGVycm9yIGFnYWluLlxuICAgICAgdGhpcy5fcGVuZGluZ1dyaXRlcyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZvcm0gb2YgYSB2YWx1ZSB0aGUgZW5naW5lIFJFVEFJTlMgKHJlYWRzIGFuZCB3cml0ZXMgcmV0ZW50aW9uKTpcbiAgICogdGhlIHBsYWNlaG9sZGVyIGJlYXRzIGV2ZXJ5IGRpYWw7IGEgZmllbGQtbGV2ZWwgc2NydWIgaGFwcGVucyBiZWZvcmUgdGhlXG4gICAqIGRpYWwgc2VlcyB0aGUgdmFsdWU7IGEgY2xlYXIgdmFsdWUgaXMgc3VtbWFyaXplZCBvciBjbG9uZWQgYXMgdGhlIGRpYWxcbiAgICogc2F5cy4gQ2FsbGVycyBoYW5kbGUgYHVuZGVmaW5lZGAgYmVmb3JlIGFza2luZy5cbiAgICovXG4gIHByaXZhdGUgcmV0YWluZWRGb3JtKFxuICAgIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgbW9kZTogUmVhZFRyYWNraW5nTW9kZSB8IFdyaXRlVHJhY2tpbmdNb2RlLFxuICAgIHN1bW1hcml6ZTogKHZhbHVlOiB1bmtub3duKSA9PiB1bmtub3duLFxuICApOiB1bmtub3duIHtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gU0NPUEVfUExBQ0VIT0xERVI7XG4gICAgY29uc3Qgc2NydWJiZWQgPSB2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnID8gUmVkYWN0aW9uUnVsZS5zY3J1YkZpZWxkcyh2YWx1ZSwgdmVyZGljdC5wYXRocykgOiB1bmRlZmluZWQ7XG4gICAgaWYgKG1vZGUgPT09ICdzdW1tYXJ5JykgcmV0dXJuIHN1bW1hcml6ZShzY3J1YmJlZCA/PyB2YWx1ZSk7XG4gICAgcmV0dXJuIHNjcnViYmVkID8/IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJ1bGUgd2l0aCBzb21ldGhpbmcgdG8gc2F5IOKAlCBgdW5kZWZpbmVkYCBvbiB0aGUgbm8tcG9saWN5IHBhdGggKG5vXG4gICAqIHJ1bGUgaW5zdGFsbGVkLCBvciBhIHJ1bGUgd2l0aCBubyBwb2xpY3kgZW50cmllcyBhbmQgbm8gbWFya2VkIGtleXMpLCBzb1xuICAgKiBhIHRyYWNrZWQgcmVhZCBvciBhIHN0YWdlZCB3cml0ZSB0aGVyZSBwYXlzIG5vIHZlcmRpY3QgY2FsbCBhbmQgbm8gcGF0aFxuICAgKiBhbGxvY2F0aW9uLiBUaGUgZGVmYXVsdCBydW4gaXMgYnl0ZS1pZGVudGljYWwgQU5EIGNvc3QtaWRlbnRpY2FsLlxuICAgKi9cbiAgcHJpdmF0ZSBhY3RpdmVSdWxlKCk6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLnBvbGljeS5yZWRhY3Rpb247XG4gICAgcmV0dXJuIHJ1bGUgIT09IHVuZGVmaW5lZCAmJiAhcnVsZS5pc0luZXJ0KCkgPyBydWxlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRIRSBPTkUgRlVOTkVMIGV2ZXJ5IHN0YWdlZCB3cml0ZSBwYXNzZXMgdGhyb3VnaCDigJQgZmFjYWRlIHdyaXRlcyBBTkRcbiAgICogdGhlIHBhdGhzIHRoYXQgYnlwYXNzIHRoZSBmYWNhZGUgKHN1YmZsb3cgc2VlZCwgYG91dHB1dE1hcHBlcmBcbiAgICogbWVyZ2UtYmFjaywgcmVzdW1lIHJlLXNlZWQpLiBUd28gb3duZXJzIChDNCk6IHRoZSBydW4ncyBydWxlIERFQ0lERVMsXG4gICAqIHRoZSByZWNvcmQgZnJhbWUgV1JJVEVTIHRoZSB2ZXJkaWN0J3MgYnl0ZXMsIGluIGZvdXIgc3RlcHNcbiAgICogKGByZWRhY3Rpb24udHNgLCBcIlRoZSB3cml0ZSBkZWNpc2lvblwiKTpcbiAgICogICAxLiB0aGUgdmVyZGljdCDigJQgYGRlY2lkZVdyaXRlYCwgdW5kZXIgdGhlIHJ1bGUgYWN0aXZlIGFzIHRoZSB3cml0ZSBiZWdpbnM7XG4gICAqICAgMi4gaWRlbnRpdHkgaW5oZXJpdGFuY2Ug4oCUIGBpbmhlcml0QnlJZGVudGl0eWAsIGFnYWluc3QgdGhpcyBmcmFtZSdzXG4gICAqICAgICAgc2VsZWN0ZWQgcmVhZHMgYXMgdGhleSBzdGFuZCBhZnRlciBzdGVwIDE7XG4gICAqICAgMy4gdGhlIGJ5dGVzIOKAlCBgUmVjb3JkRnJhbWUgwrcgd3JpdGVgLCB0aGUgb3AgYW5kIGl0cyBzY3J1YiAodGhlIHdob2xlXG4gICAqICAgICAgdmFsdWUsIG9yIHRoZSBmaWVsZHMgaW5zaWRlIGl0KTtcbiAgICogICA0LiB0aGUgbWFya3Mg4oCUIGBtYXJrU3RhZ2VkV3JpdGVgLCBvbmx5IG9uY2UgdGhlIHdyaXRlIHN0YWdlZCwgc28gYVxuICAgKiAgICAgIHdyaXRlIHRoYXQgZmFpbHMgdG8gc3RhZ2UgbWFya3Mgbm90aGluZy5cbiAgICogRWFjaCBzdGVwIHJlYWRzIHRoZSBydWxlIChhbmQgdGhlIHNlbGVjdGVkIHJlYWRzKSB3aGVuIGl0IGFjdHMsIGFzIHRoaXNcbiAgICogZnVubmVsIGFsd2F5cyBkaWQuIFJldHVybnMgdGhlIHZlcmRpY3Qgc28gdGhlIGNhbGxlciByZXRhaW5zIGFuZCByZXBvcnRzXG4gICAqIHVuZGVyIHRoZSBzYW1lIGRlY2lzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZVdyaXRlKFxuICAgIG5zUGF0aDogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZXhwbGljaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgdmVyYjogV3JpdGVWZXJiLFxuICApOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICBpZiAoYWN0aXZlID09PSB1bmRlZmluZWQgJiYgIWV4cGxpY2l0KSB7XG4gICAgICAvLyBUaGUgbm8tcG9saWN5IGZhc3QgcGF0aCwgdGhlIHNhbWUgZm91ciBzdGVwcyB3aXRoIG5vdGhpbmcgdG8gZG86IG5vIHJ1bGUgd2l0aCBhbnl0aGluZyB0byBzYXlcbiAgICAgIC8vIGFuZCBubyBmbGFnIGlzIGNsZWFyIChzdGVwIDEpLCBub3RoaW5nIHRvIGluaGVyaXQgd2l0aG91dCBhIHJ1bGUgKHN0ZXAgMiksIG5vIHNjcnViIChzdGVwIDMpLFxuICAgICAgLy8gYW5kIG5vdGhpbmcgdG8gbWFyayDigJQgYSBjbGVhciB2ZXJkaWN0IG1hcmtzIG5vdGhpbmcsIGFuZCBhIGRlbGV0ZSB1bm1hcmtzIG9ubHkgb24gdGhlIHJ1bGVcbiAgICAgIC8vIGFjdGl2ZSBhcyBpdCBiZWdhbiAoc3RlcCA0KS4gVGhlIGRlZmF1bHQgcnVuIHBheXMgdGhlIHJlY29yZCdzIHdyaXRlIGFuZCBub3RoaW5nIGVsc2UuXG4gICAgICB0aGlzLnJlY29yZC53cml0ZShuc1BhdGgsIHZhbHVlLCB2ZXJiKTtcbiAgICAgIHJldHVybiBDTEVBUjtcbiAgICB9XG4gICAgY29uc3QgYXNrZWQgPSBkZWNpZGVXcml0ZShhY3RpdmUsIHBhdGgsIGtleSwgZXhwbGljaXQpO1xuICAgIGNvbnN0IHZlcmRpY3QgPSBpbmhlcml0QnlJZGVudGl0eShhY3RpdmUsIGFza2VkLCB0aGlzLl9zZWxlY3RlZE9iamVjdHMsIHBhdGgsIGtleSwgdmFsdWUpO1xuICAgIHRoaXMucmVjb3JkLndyaXRlKG5zUGF0aCwgdmFsdWUsIHZlcmIsIHNjcnViT2YodmVyZGljdCkpO1xuICAgIG1hcmtTdGFnZWRXcml0ZShhY3RpdmUsIHRoaXMucG9saWN5LnJlZGFjdGlvbiwgdmVyZGljdCwgcGF0aCwga2V5LCB2ZXJiKTtcbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBhbmQgcmVhZCBhdCBBTk9USEVSIGZyYW1lJ3MgYWRkcmVzcyAoaXRzIHJ1biBuYW1lc3BhY2UpIHdoaWxlIHRoaXNcbiAgICogZnJhbWUga2VlcHMgaXRzIG93biBpZGVudGl0eSBvbiB0aGUgcmVjb3JkIOKAlCBgc3RhZ2VgLCBgc3RhZ2VJZGAsXG4gICAqIGBydW50aW1lU3RhZ2VJZGAsIHRhZ3MuIEEgc3ViZmxvdyBtb3VudCdzIG1lcmdlLWJhY2sgaXMgdGhlIG9uZSBjYWxsZXJcbiAgICogKGBTdWJmbG93RXhlY3V0b3IgwrcgZXhlY3V0ZVN1YmZsb3dgLCBSMTMpOiB0aGUgbW91bnQgZnJhbWUgb2YgYSBicmFuY2ggb3JcbiAgICogZm9yayBjaGlsZCBsYW5kcyBpdHMgdmFsdWVzIHdoZXJlIGl0cyBwYXJlbnQgd3JpdGVzLCBhcyBiZWZvcmUsIGFuZCBpdHNcbiAgICogYnVuZGxlIG5vdyBuYW1lcyB0aGUgbW91bnQgaW5zdGVhZCBvZiB0aGUgc3RhZ2UgYmVmb3JlIGl0LiBSZWZ1c2VkIG9uY2VcbiAgICogdGhlIGZyYW1lIGhhcyBzdGFnZWQgYW55dGhpbmcg4oCUIGl0cyBidWZmZXIncyBhZGRyZXNzIGlzIGZpeGVkIHRoZW4uIFRoZVxuICAgKiBkZWNpc2lvbiBpcyB0aGUgZW5naW5lJ3MgKG5hbWVzcGFjZSBpZHMsIGFzIHNpbmNlIFIxMyk7IHRoZSByZWNvcmQgZnJhbWVcbiAgICogdGFrZXMgdGhlIGFkZHJlc3MgaXQgY29tZXMgdG8gKGBSZWNvcmRGcmFtZSDCtyB1c2VBZGRyZXNzYCkuXG4gICAqL1xuICB1c2VBZGRyZXNzT2YoZnJhbWU6IFN0YWdlQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZC5oYXNTdGFnZWQgJiYgZnJhbWUubmFtZXNwYWNlSWQgIT09IHRoaXMubmFtZXNwYWNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtmb290cHJpbnRdIFN0YWdlQ29udGV4dC51c2VBZGRyZXNzT2Y6ICcke3RoaXMuc3RhZ2VJZH0nIGhhcyBhbHJlYWR5IHN0YWdlZCB3cml0ZXMgYXQgaXRzIG93biBhZGRyZXNzLmAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFkZHJlc3NSdW5JZCA9IGZyYW1lLm5hbWVzcGFjZUlkO1xuICAgIHRoaXMucmVjb3JkLnVzZUFkZHJlc3MocnVuQWRkcmVzcyh0aGlzLm5hbWVzcGFjZUlkKSk7XG4gIH1cblxuICAvKiogVGhlIHJ1biBuYW1lc3BhY2Ugd3JpdGVzIGFuZCByZWFkcyBnbyB0bzoge0BsaW5rIGFkZHJlc3NSdW5JZH0sIGVsc2UgYHJ1bklkYC4gKi9cbiAgcHJpdmF0ZSBnZXQgbmFtZXNwYWNlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hZGRyZXNzUnVuSWQgPz8gdGhpcy5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBXcml0ZSBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBhdGNoKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdzZXQnKTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIG1lcmdlKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gdGhpcy5zdGFnZVdyaXRlKHRoaXMucmVjb3JkLmF0KHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ21lcmdlJyk7XG4gIH1cblxuICBzZXRPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBvcGVyYXRpb25PdmVycmlkZT86ICdzZXQnIHwgJ2RlbGV0ZScsXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIC8vIEV4cGxpY2l0IGRlbGV0aW9uIChTY29wZUZhY2FkZS5kZWxldGVWYWx1ZSkgc3RhZ2VzIGEgZGlzdGluY3Qgb3Agc29cbiAgICAvLyBkZWx0YS1tb2RlIGNvbW1pdHMgKCMxM2MtQikgY2FuIGVtaXQgYSByZWFsIGBkZWxldGVgIHRyYWNlIGVudHJ5LlxuICAgIC8vIFVuZGVyIHRoZSBkZWZhdWx0ICdmdWxsJyBtb2RlIHRoZSBidWZmZXIgY29tbWl0cyBpdCBhcyBhXG4gICAgLy8gc2V0LW9mLXVuZGVmaW5lZCDigJQgYnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICBjb25zdCB2ZXJkaWN0ID1cbiAgICAgIG9wZXJhdGlvbk92ZXJyaWRlID09PSAnZGVsZXRlJ1xuICAgICAgICA/IHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHVuZGVmaW5lZCwgc2hvdWxkUmVkYWN0LCAnZGVsZXRlJylcbiAgICAgICAgOiB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCBvcGVyYXRpb25PdmVycmlkZSA/PyAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCB0YWdnZWQgPSBkZXNjcmlwdGlvbi5zdGFydHNXaXRoKCdbJykgPyBkZXNjcmlwdGlvbiA6IGBbV1JJVEVdICR7ZGVzY3JpcHRpb259YDtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgdGFnZ2VkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICB1cGRhdGVPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMubWVyZ2UocGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0KTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdCDigJRcbiAgICAvLyBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSksIHNlZSB0cmFja1dyaXRlLlxuICAgIHRoaXMudHJhY2tXcml0ZSh1c2VyS2V5T2YocGF0aCwga2V5KSwgdmFsdWUsIHZlcmRpY3QsICd1cGRhdGUnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIHNldFJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChbXSwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogUm9vdC1sZXZlbCAodW4tbmFtZXNwYWNlZCkgd3JpdGUg4oCUIHRoZSBzdWJmbG93IHNlZWQgYW5kIG1lcmdlLWJhY2sgcGF0aC4gKi9cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0YWdlV3JpdGUoW2tleV0sIFtdLCBrZXksIHZhbHVlLCB1bmRlZmluZWQsICdzZXQnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUdsb2JhbENvbnRleHQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gIH1cblxuICBhcHBlbmRUb0FycmF5KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgaXRlbXM6IHVua25vd25bXSwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPSBBcnJheS5pc0FycmF5KGV4aXN0aW5nKSA/IFsuLi5leGlzdGluZywgLi4uaXRlbXNdIDogWy4uLml0ZW1zXTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIG1lcmdlT2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPVxuICAgICAgZXhpc3RpbmcgJiYgdHlwZW9mIGV4aXN0aW5nID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShleGlzdGluZylcbiAgICAgICAgPyB7IC4uLihleGlzdGluZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksIC4uLm9iaiB9XG4gICAgICAgIDogeyAuLi5vYmogfTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIEJPUlJPV0VEIOKAlCBzZWUgdGhlIGNvbnRyYWN0IG9uXG4gICAqIGBTY29wZUZhY2FkZS5nZXRWYWx1ZWAuIFJlYWQtdHJhY2tpbmcgY29zdCBpcyBwb2xpY3ktZ2F0ZWQgKCMxNCk6XG4gICAqIGAnZnVsbCdgIGNsb25lcyB0aGUgdmFsdWUgaW50byBgX3N0YWdlUmVhZHNgIChoaXN0b3JpY2FsIGRlZmF1bHQpLFxuICAgKiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXAgbWFya2VyLCBgJ29mZidgIHJlY29yZHMgbm90aGluZy5cbiAgICovXG4gIGdldFZhbHVlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgLy8gVGhlIHJlY29yZCBmcmFtZSBzZXJ2ZXMgdGhlIHZhbHVlICh0d28gdGllcnMpIGFuZCBrZWVwcyB0aGUgcGVyLXdyaXRlXG4gICAgLy8gcHJvdmVuYW5jZSByZWdpc3RyeSAoI1AxKSDigJQga2V5IHN0cmluZ3Mgb25seSwgaW5kZXBlbmRlbnQgb2YgdGhlXG4gICAgLy8gcmVhZFRyYWNraW5nIHJldGVudGlvbiBkaWFsICh3aGljaCBnb3Zlcm5zIFZBTFVFIHJldGVudGlvbiBiZWxvdykuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlY29yZC5yZWFkKHBhdGgsIGtleSk7XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5ub3RlUmVhZChwYXRoLCBrZXkpO1xuICAgIC8vIFRoZSB2ZXJkaWN0LCBvbmNlIOKAlCBmb3IgdGhlIHJldGFpbmVkIHJlYWQgYmVsb3cgYW5kIHRoZSBzZWxlY3RlZC1yZWFkXG4gICAgLy8gY291bnQgKGBzZWxlY3RlZFJlYWRzYCkuIE5vIHBvbGljeSBhbmQgbm8gbWFya3Mg4oaSIG5vIHZlcmRpY3QgY2FsbCwgbm9cbiAgICAvLyBhbGxvY2F0aW9uIChhY3RpdmVSdWxlKS5cbiAgICBjb25zdCBydWxlID0ga2V5ICE9PSB1bmRlZmluZWQgPyB0aGlzLmFjdGl2ZVJ1bGUoKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB2ZXJkaWN0ID0gcnVsZSAhPT0gdW5kZWZpbmVkID8gcnVsZS52ZXJkaWN0QXQocGF0aCwga2V5IGFzIHN0cmluZykgOiBDTEVBUjtcbiAgICBpZiAodmVyZGljdC5raW5kICE9PSAnY2xlYXInICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUmVhZHMgKz0gMTtcbiAgICAgIC8vIEFuIG9iamVjdCByZWFkIHVuZGVyIGEgc2VsZWN0ZWQgbmFtZSwgd3JpdHRlbiBiYWNrIHVuZGVyIGFub3RoZXIsIGtlZXBzIGl0cyBydWxlIChzdGFnZVdyaXRlKS5cbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSAodGhpcy5fc2VsZWN0ZWRPYmplY3RzID8/PSBuZXcgV2Vha01hcCgpKS5zZXQodmFsdWUsIHZlcmRpY3QpO1xuICAgIH1cbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHJlYWQgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyDigJQgcmV0YWluZWQgdW5kZXJcbiAgICAvLyB0aGUgcnVsZSdzIHZlcmRpY3QgKDkuMTkuMCk6IGEgcmVkYWN0ZWQga2V5IGlzIHJldGFpbmVkIGFzIHRoZVxuICAgIC8vIHBsYWNlaG9sZGVyLCBhIGZpZWxkLWxldmVsIGtleSBhcyBhIHNjcnViYmVkIGNsb25lLCBuZXZlciB0aGUgc2VjcmV0LlxuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgIT09ICdvZmYnKSB7XG4gICAgICBpZiAocGF0aC5sZW5ndGggPiAwKSAodGhpcy5fbmVzdGVkUmVhZHMgPz89IG5ldyBTZXQoKSkuYWRkKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgICAgIGVsc2UgaWYgKHRoaXMucG9saWN5LnJlYWRUcmFja2luZyA9PT0gJ2Z1bGwnICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGlmICh0aGlzLnJlY29yZC5oYXNTdGFnZWQpIHRoaXMuX3ZpZXdSZWFkcz8uZGVsZXRlKGtleSk7XG4gICAgICAgIGVsc2UgKHRoaXMuX3ZpZXdSZWFkcyA/Pz0gbmV3IFNldCgpKS5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YWdlUmVhZHNbdXNlcktleU9mKHBhdGgsIGtleSldID1cbiAgICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB0aGlzLnJldGFpbmVkRm9ybSh2ZXJkaWN0LCB2YWx1ZSwgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nLCBzdW1tYXJpemVSZWFkVmFsdWUpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgYFtSRUFEXSAke2Rlc2NyaXB0aW9ufWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogSG93IG1hbnkgdHJhY2tlZCByZWFkcyBvZiB0aGlzIGZyYW1lIHJlYWQgYSB2YWx1ZSB0aGUgcnVuJ3MgcnVsZSBzZWxlY3RzXG4gICAqIChhIGtleSBpdCBtYXNrcyB3aG9sZSwgb3Igb25lIHdpdGggc2VjcmV0IGZpZWxkcykuIEEgYm91bmRhcnkgdGhhdCBtYXBzXG4gICAqIHdoYXQgYSBzdGFnZSBmdW5jdGlvbiBSRUFEIGludG8gYSBuZXcgbmFtZSDigJQgdGhlIGBwYXJhbGxlbEZvckVhY2hgIGl0ZW1zXG4gICAqIHNlbGVjdG9yIOKAlCBjb21wYXJlcyBpdCBiZWZvcmUgYW5kIGFmdGVyLCBhcyBhIHN1YmZsb3cgbWFwcGVyJ3MgdGFpbnQgZG9lc1xuICAgKiAoYG1lbW9yeS9yZWRhY3Rpb24udHMgwrcgTWFwcGVyVGFpbnRgKS4gQWx3YXlzIDAgd2l0aG91dCBhIHBvbGljeSBvciBhIG1hcmsuXG4gICAqL1xuICBnZXQgc2VsZWN0ZWRSZWFkcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJlYWRzO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCB0cmFja2luZyBpbiBfc3RhZ2VSZWFkcyBvciBwYXlpbmcgc3RydWN0dXJlZENsb25lIGNvc3QuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlLmdldFZhbHVlU2lsZW50KCkgZm9yIGFycmF5IHByb3h5IGludGVybmFsIG9wZXJhdGlvbnMuICovXG4gIGdldFZhbHVlRGlyZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQucmVhZChwYXRoLCBrZXkpO1xuICB9XG5cbiAgZ2V0Um9vdChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5yZWFkTGl2ZShrZXkpO1xuICB9XG5cbiAgZ2V0R2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnJlYWRHbG9iYWwoa2V5KTtcbiAgfVxuXG4gIGdldFNjb3BlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgfVxuXG4gIGdldFJ1bklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgQ29tbWl0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyOiByZWNvcmQgdGhhdCB0aGlzIHN0YWdlIGNvbnN1bWVkIGFuIHVudHJhY2tlZCByZWFkIHBhdGguXG4gICAqIENhbGxlZCBieSBgU2NvcGVGYWNhZGVgIChgZ2V0QXJnc2AvYGdldEVudmAvdW5zaGFkb3dlZCBgZ2V0VmFsdWVTaWxlbnRgKTtcbiAgICogc3VyZmFjZWQgYXMgYENvbW1pdEJ1bmRsZS51bnRyYWNrZWRTb3VyY2VzYCBvbiB0aGlzIHN0YWdlJ3MgY29tbWl0LlxuICAgKi9cbiAgbWFya1VudHJhY2tlZFNvdXJjZShzb3VyY2U6IFVudHJhY2tlZFNvdXJjZSk6IHZvaWQge1xuICAgICh0aGlzLl91bnRyYWNrZWRTb3VyY2VzID8/PSBuZXcgU2V0KCkpLmFkZChzb3VyY2UpO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIGFuIG9ic2VydmVyIHRoYXQgZmlyZXMgYWZ0ZXIgY29tbWl0KCkgYXBwbGllcyBwYXRjaGVzLlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZSB0byBkaXNwYXRjaCBTY29wZVJlY29yZGVyLm9uQ29tbWl0IGV2ZW50cy4gKi9cbiAgc2V0Q29tbWl0T2JzZXJ2ZXIoXG4gICAgb2JzZXJ2ZXI6IChtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+KSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9jb21taXRPYnNlcnZlciA9IG9ic2VydmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIERldi1tb2RlIG9ubHk6IGRpZCB0aGlzIHN0YWdlIGNoYW5nZSwgSU4gUExBQ0UsIGEgdmFsdWUgaXQgbWVyZWx5IFJFQUQ/XG4gICAqXG4gICAqIFRoZSB0eXBlZCBzY29wZSBpbnRlcmNlcHRzIGV2ZXJ5IHdyaXRlIGl0IGNhbiByZWFjaCDigJQgYSBwcm9wZXJ0eSBhdCBhbnlcbiAgICogZGVwdGgsIGFuIGluZGV4ZWQgZWxlbWVudCwgYW4gYXJyYXkgbWV0aG9kLiBXaGF0IGl0IGNhbm5vdCByZWFjaCBpcyBhblxuICAgKiBlbGVtZW50IGhhbmRlZCBvdXQgYnkgYSByZWFkIG1ldGhvZCAoYGZpbmRgLCBgZmlsdGVyYCwgYGZvcuKApm9mYCxcbiAgICogYGZvckVhY2hgLCBkZXN0cnVjdHVyaW5nKTogd3JhcHBpbmcgdGhvc2Ugd291bGQgbWVhbiByZXR1cm5pbmcgcHJveGllcyBvdXRcbiAgICogb2YgZXZlcnkgcmVhZCwgd2hpY2ggaXMgYSBjb3N0IHRoZSBsaWJyYXJ5IHNob3VsZCBub3QgcGF5LiBTbyB0aGF0IGZhbWlseVxuICAgKiBpcyBXQVJORUQgQUJPVVQgcmF0aGVyIHRoYW4gaW50ZXJjZXB0ZWQg4oCUIGxvdWRseSwgaGVyZSwgaW5zdGVhZCBvZiBlbmRpbmdcbiAgICogdGhlIHJ1biB3aXRoIGEgY29tbWl0IGxvZyB0aGF0IHNpbGVudGx5IGRpc2FncmVlcyB3aXRoIGZpbmFsIHN0YXRlLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgUkVQT1JUIGFmdGVyIHRoZSBmYWN0LCBub3QgYSByZWZ1c2FsIGF0IHRoZSB3cml0ZTogdGhlIHdyaXRlIGhhc1xuICAgKiBhbHJlYWR5IGhhcHBlbmVkIGluIHBsYWNlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGludGVyY2VwdC4gSXQgcnVucyB1bmRlclxuICAgKiBUV08gcHJlY29uZGl0aW9ucywgYm90aCBuYW1lZCBpbiB0aGUgUkVBRE1FIOKAlCBgZW5hYmxlRGV2TW9kZSgpYCwgYW5kXG4gICAqIGByZWFkVHJhY2tpbmc6ICdmdWxsJ2AgKHRoZSBkZWZhdWx0KSwgYmVjYXVzZSB0aGUgY29tcGFyaXNvbiBuZWVkcyB0aGVcbiAgICogY2xvbmUgb2YgdGhlIHZhbHVlIHRoYXQgbW9kZSByZXRhaW5zIGF0IHJlYWQgdGltZS4gQSBrZXkgdGhlIHN0YWdlIG5ldmVyXG4gICAqIHN0YWdlZCBtdXN0IHN0aWxsIGhvbGQgdGhhdCBjbG9uZSDigJQgY29tbWl0dGVkIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwXG4gICAqIGFuZCB0aGUgYnVmZmVyJ3Mgd29ya2luZyBjb3B5IGlzIHByaXZhdGUgdG8gdGhpcyBzdGFnZS4gS2V5cyB0aGUgc3RhZ2UgRElEXG4gICAqIHN0YWdlIGFyZSBza2lwcGVkICh0aGV5IGFyZSBleHBlY3RlZCB0byBkaWZmZXIsIGFuZCB0aGV5IGFyZSBpbiB0aGUgcmVjb3JkKSxcbiAgICogc28gYXJlIGtleXMgdW5kZXIgYSByZWRhY3Rpb24gdmVyZGljdCwgd2hvc2UgcmV0YWluZWQgZm9ybSBpcyBkZWxpYmVyYXRlbHlcbiAgICogbm90IHRoZSB2YWx1ZSwgYW5kIHNvIGFyZSBrZXlzIHJlYWQgYXQgYSBuZXN0ZWQgcGF0aCAoYF9uZXN0ZWRSZWFkc2ApIOKAlFxuICAgKiB0aG9zZSBhcmUgZW5naW5lIHJlYWRzICh0aGUgc3ViZmxvdyBtZXJnZS1iYWNrKSwgbm90IHVzZXIgcmVhZHMuXG4gICAqXG4gICAqIEl0IGFsc28gb25seSBsb29rcyBhdCBrZXlzIHNlcnZlZCBmcm9tIHRoZSBQSU5ORUQgc291cmNlIOKAlCB0aGUgZmlyc3QtdG91Y2hcbiAgICogdmlldyBvciB0aGlzIHN0YWdlJ3Mgb3duIGJ1ZmZlci4gQSBrZXkgYWJzZW50IGZyb20gYm90aCB3YXMgc2VydmVkIGJ5IHRoZVxuICAgKiByZWFkJ3MgbGl2ZSBmYWxsYmFjayAoYFJlY29yZEZyYW1lIMK3IHJlYWRgLCB0aWVyIDIpLCB3aGljaCBhIHBhcmFsbGVsIHNpYmxpbmcncyByb290LWtleSBjb21taXQgY2FuXG4gICAqIGxlZ2l0aW1hdGVseSBtb3ZlOyBhY2N1c2luZyB0aGUgc3RhZ2UgdGhlcmUgd291bGQgYmUgYSBmYWxzZSBhbGFybS4gRm9yXG4gICAqIHRoZSBzYW1lIHJlYXNvbiBpdCBydW5zIG9uIHRoZSBmcmFtZSdzIEZJUlNUIGNvbW1pdCBvbmx5OiB0aGUgcmVhZHMgYmVsb25nXG4gICAqIHRvIHRoYXQgcm91bmQsIGFuZCBieSB0aGUgZW5naW5lJ3Mgc2Vjb25kIHJvdW5kIChhIGZvcmsgZG91YmxlLWNvbW1pdCwgYVxuICAgKiBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGNvbW1pdHRlZCBicmFuY2ggcGFyZW50KSBvdGhlciBzdGFnZXMgaGF2ZVxuICAgKiBsZWdpdGltYXRlbHkgbW92ZWQgdGhlIHN0YXRlIHRoZXkgd2VyZSBjb21wYXJlZCBhZ2FpbnN0LlxuICAgKlxuICAgKiBBIGtleSB0aGUgc3RhZ2UgRElEIHN0YWdlIGlzIHN0aWxsIGNoZWNrZWQgd2hlbiBpdHMgbGFzdCByZWFkIGNhbWUgZnJvbVxuICAgKiBjb21taXR0ZWQgc3RhdGUgKHtAbGluayBfdmlld1JlYWRzfSDigJQgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlKTpcbiAgICogdGhhdCByZWFkIHdhcyB0aGUgY29tbWl0dGVkIG9iamVjdCBpdHNlbGYsIGFuZCB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIElTXG4gICAqIHRoYXQgb2JqZWN0IChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLCBzbyBhbiBpbi1wbGFjZSBlZGl0IGZvbGxvd2VkIGJ5IGFcbiAgICogd3JpdGUgb2YgdGhlIGtleSBjb21taXRzIE5PIGNoYW5nZSDigJQgbGl2ZSBzdGF0ZSBrZWVwcyB0aGUgZWRpdCwgdGhlIGxvZ1xuICAgKiBkb2VzIG5vdC4gQ29tcGFyZWQgYWdhaW5zdCBjb21taXR0ZWQgc3RhdGUsIG5vdCB0aGUgd3JpdHRlbiB2YWx1ZSwgc28gYVxuICAgKiBsZWdpdGltYXRlIHdyaXRlIG5ldmVyIHRyaXBzIGl0LlxuICAgKlxuICAgKiBDb3N0cyBub3RoaW5nIG91dHNpZGUgYGVuYWJsZURldk1vZGUoKWAuXG4gICAqL1xuICBwcml2YXRlIHdhcm5PbkJvcnJvd2VkTXV0YXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCFpc0Rldk1vZGUoKSB8fCB0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgIT09ICdmdWxsJyB8fCB0aGlzLl9jb21taXR0ZWQpIHJldHVybjtcbiAgICBjb25zdCBydWxlID0gdGhpcy5hY3RpdmVSdWxlKCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5fc3RhZ2VSZWFkcykpIHtcbiAgICAgIGNvbnN0IHJldGFpbmVkID0gdGhpcy5fc3RhZ2VSZWFkc1trZXldO1xuICAgICAgLy8gT25seSBhIGNvbnRhaW5lciBjYW4gYmUgbXV0YXRlZCBpbiBwbGFjZTsgYSBwcmltaXRpdmUgcmVhZCBjYW5ub3QuXG4gICAgICBpZiAocmV0YWluZWQgPT09IG51bGwgfHwgdHlwZW9mIHJldGFpbmVkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICBpZiAodGhpcy5fbmVzdGVkUmVhZHM/LmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGlmIChydWxlICE9PSB1bmRlZmluZWQgJiYgcnVsZS52ZXJkaWN0QXQoW10sIGtleSkua2luZCAhPT0gJ2NsZWFyJykgY29udGludWU7XG4gICAgICBjb25zdCBuYW1lc3BhY2VkID0gdGhpcy5yZWNvcmQuYXQoW10sIGtleSk7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3N0YWdlV3JpdGVzLCBrZXkpIHx8IHRoaXMucmVjb3JkLndhc1N0YWdlZChuYW1lc3BhY2VkKSkge1xuICAgICAgICB0aGlzLndhcm5PbkNvbW1pdHRlZE11dGF0aW9uKGtleSwgbmFtZXNwYWNlZCwgcmV0YWluZWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHBpbm5lZCBzb3VyY2Ugb25seSDigJQgc2VlIHRoZSBub3RlIG9uIHRoZSBsaXZlIGZhbGxiYWNrIGFib3ZlLlxuICAgICAgLy8gYHBlZWtgLCBub3QgYGdldGA6IGEgcmVwb3J0IGNvbXBhcmVzLCBhbmQgbXVzdCBub3QgdGFrZSB0aGUgcHJpdmF0ZVxuICAgICAgLy8gY29weSBhIHN0YWdlJ3MgcmVhZCB3b3VsZCAoY29weS1vbi13cml0ZSwgOS4yOS4wKS5cbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJlY29yZC5wZWVrKG5hbWVzcGFjZWQpO1xuICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHBhdGggPSBmaXJzdERpZmZlcmluZ1BhdGgocmV0YWluZWQsIGN1cnJlbnQpO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlKHRoaXMuc3RhZ2VOYW1lLCBrZXksIHBhdGgpKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIHN0YWdlZC1rZXkgaGFsZiBvZiB7QGxpbmsgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbn06IGRpZCBjb21taXR0ZWQgc3RhdGUgaXRzZWxmIG1vdmUgdW5kZXIgYSByZWFkPyAqL1xuICBwcml2YXRlIHdhcm5PbkNvbW1pdHRlZE11dGF0aW9uKGtleTogc3RyaW5nLCBuYW1lc3BhY2VkOiBzdHJpbmdbXSwgcmV0YWluZWQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3ZpZXdSZWFkcz8uaGFzKGtleSkpIHJldHVybjtcbiAgICBjb25zdCBjb21taXR0ZWQgPSB0aGlzLnJlY29yZC5iYXNlQXQobmFtZXNwYWNlZCk7XG4gICAgaWYgKGNvbW1pdHRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgcGF0aCA9IGZpcnN0RGlmZmVyaW5nUGF0aChyZXRhaW5lZCwgY29tbWl0dGVkKTtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oY29tbWl0dGVkTXV0YXRpb25NZXNzYWdlKHRoaXMuc3RhZ2VOYW1lLCBrZXksIHBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCBzdGFnZWQgd3JpdGVzIHRvIHNoYXJlZCBtZW1vcnkgYW5kIFJFTEVBU0UgdGhlIHBlci1zdGFnZSBzdGFnaW5nXG4gICAqIHN0YXRlICgjMTNiKS5cbiAgICpcbiAgICogYHBoYXNlYCAoOS4zOS4wKSBpcyB0aGUgY2FsbGVyJ3Mgc3RhdGVtZW50IG9mIHdoYXQgYSBDT05USU5VQVRJT04gY29tbWl0XG4gICAqIGlzIOKAlCBgJ2V4aXQnYCBmcm9tIGEgc3ViZmxvdyBtb3VudCdzIGV4aXQsIGAncmVwZWF0J2AgZnJvbSBhIGZvcmtcbiAgICogZmFuLW91dCdzIHNldHRsZS4gSXQgaXMgc3RhbXBlZCBvbiB0aGUgYnVuZGxlIChgQ29tbWl0QnVuZGxlLnBoYXNlYCkgb25seVxuICAgKiB3aGVuIHRoaXMgZnJhbWUgaGFzIEFMUkVBRFkgY29tbWl0dGVkOiB0aGUgRklSU1QgYnVuZGxlIG9mIGFuIGV4ZWN1dGlvblxuICAgKiBpcyB0aGUgc3RhZ2UncyBvd24gYW5kIG5ldmVyIGNhcnJpZXMgYSBgcGhhc2VgIOKAlCBzbyBhIG1vdW50IHdpdGhvdXQgYW5cbiAgICogYG91dHB1dE1hcHBlcmAgKGEgbGF6eSBtb3VudCwgZXZlcnkgYHBhcmFsbGVsRm9yRWFjaGAgYnJhbmNoKSwgd2hvc2UgZXhpdFxuICAgKiBpcyBpdHMgb25seSBidW5kbGUsIHJlY29yZHMgdGhhdCBidW5kbGUgYXMgaXRzIG93biwgdGFncyBhbmQgYWxsLlxuICAgKlxuICAgKiBDb21taXQgaXMgdGhlIHN0YWdlJ3MgbGlmZWN5Y2xlIGVuZDogdGhlIHJlY29yZCBmcmFtZSdzIGJ1ZmZlciBhbmRcbiAgICogZmlyc3QtdG91Y2ggYmFzZSBhcmUgb25seSBuZWVkZWQgRFVSSU5HIGV4ZWN1dGlvbiwgYXMgdGhlIHJlYWQgc25hcHNob3QgK1xuICAgKiBuZXQtY2hhbmdlIGRpZmYgYmFzZSwgc28gdGhlIHJlY29yZCBmcmFtZSByZWxlYXNlcyB0aGVtIG9uY2UgdGhlIGNvbW1pdFxuICAgKiBoYXMgbGFuZGVkIGFuZCB0aGUgb2JzZXJ2ZXIgaGFzIHNlZW4gaXQgKGBSZWNvcmRGcmFtZSDCtyByZWxlYXNlYCDigJQgd2h5IGFcbiAgICogZnJhbWUgdGhhdCBrZXB0IHRoZW0gd291bGQgcmV0YWluIG9uZSBzdGF0ZSBnZW5lcmF0aW9uIHBlciBleGVjdXRlZFxuICAgKiBzdGFnZSwgYW5kIHdoeSBhIHJlLXVzZWQgZnJhbWUgcmUtYW5jaG9ycyBvbiBjdXJyZW50IHN0YXRlLCBpcyB0aGVyZSkuXG4gICAqXG4gICAqIFJFLVVTRSBBRlRFUiBDT01NSVQgc3RheXMgY29ycmVjdCBiZWNhdXNlIGJvdGggcmUtY3JlYXRlIGxhemlseTpcbiAgICogLSBhIGxhdGVyIFJFQUQgcmUtYW5jaG9ycyBvbiB0aGUgQ1VSUkVOVCBjb21taXR0ZWQgc3RhdGUgKHdoaWNoIGluY2x1ZGVzXG4gICAqICAgdGhpcyBzdGFnZSdzIG93biBmbHVzaGVkIHdyaXRlcyk7XG4gICAqIC0gYSBsYXRlciBXUklURSBjb25zdHJ1Y3RzIGEgZnJlc2ggYnVmZmVyIG9uIHRoYXQgcmUtYW5jaG9yZWQgdmlldywgc28gYVxuICAgKiAgIHNlY29uZCBjb21taXQgZGlmZnMgYWdhaW5zdCBwb3N0LWZpcnN0LWNvbW1pdCBzdGF0ZS4gVGhlIHByZS1yZWxlYXNlXG4gICAqICAgYnVmZmVyIGJlaGF2ZWQgdGhlIHNhbWUgZm9yIFZBTFVFUyAoaXRzIGB3b3JraW5nQ29weWAgd2FzIHJlc2V0IG9uXG4gICAqICAgY29tbWl0LCBmYWxsaW5nIHJlYWRzIHRocm91Z2ggdG8gbGl2ZSBzdGF0ZSkgYnV0IGtlcHQgdGhlIE9SSUdJTkFMXG4gICAqICAgYGJhc2VTbmFwc2hvdGAgYXMgZGlmZiBiYXNlIOKAlCB1bnJlYWNoYWJsZSBpbiBwcmFjdGljZTogdGhlIGVuZ2luZSdzXG4gICAqICAgb25seSB3cml0ZXMgYWZ0ZXIgYSBjb21taXQgYXJlIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGNvbW1pdHRlZFxuICAgKiAgIGJyYW5jaCBwYXJlbnQgKGEgZGVjaWRlciBvciBmb3JrIGZyYW1lIGNvbW1pdHMgYmVmb3JlIGl0cyBicmFuY2ggcnVucyk7XG4gICAqICAgdGhlIG90aGVyIFwid3JpdGUgYWZ0ZXIgY29tbWl0XCJcbiAgICogICBzaXRlcyAoU3ViZmxvd0V4ZWN1dG9yIHNlZWQg4oaSIHJlcGxhY2VzIHRoZSBjb250ZXh0OyByZXN1bWUg4oaSIGZyZXNoXG4gICAqICAgY29udGV4dCB2aWEgYGxlYWYuY3JlYXRlTmV4dGApIG5ldmVyIHJlLXVzZSBhIGNvbW1pdHRlZCBjb250ZXh0LlxuICAgKiAtIEEgVVNFUiBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZSBpcyBhIGRpZmZlcmVudCBtYXR0ZXI6IGl0cyB3cml0ZXNcbiAgICogICB3b3VsZCBsYW5kIGluIGEgYnVmZmVyIG5vdGhpbmcgZXZlciBjb21taXRzLiBUaGF0IHJlZnVzYWwgbGl2ZXMgb24gdGhlXG4gICAqICAgc2NvcGUgdGllciAoYFNjb3BlRmFjYWRlYCwgc2VhbGVkIGJ5IHRoZSBjb21taXQgb2JzZXJ2ZXIg4oCUIDkuMjIuMCksXG4gICAqICAgYmVjYXVzZSB0aGUgZnJhbWUncyByZS11c2FiaWxpdHkgaXMgZXhhY3RseSB3aGF0IHRoZSBlbmdpbmUgcGF0aHNcbiAgICogICBhYm92ZSBuZWVkLlxuICAgKiAtIGBfc3RhZ2VXcml0ZXNgIC8gYF9zdGFnZVJlYWRzYCBhcmUgTk9UIHJlbGVhc2VkIOKAlCBgc25hcHNob3RTZWxmKClgXG4gICAqICAgcmVhZHMgdGhlbSBwb3N0LXJ1biBmb3IgdGhlIGV4ZWN1dGlvbi10cmVlIHNuYXBzaG90LlxuICAgKi9cbiAgY29tbWl0KHBoYXNlPzogQ29tbWl0UGhhc2UpOiB2b2lkIHtcbiAgICAvLyBBIGNvbnRpbnVhdGlvbiBvbmx5IEFGVEVSIHRoZSBleGVjdXRpb24ncyBvd24gYnVuZGxlIChzZWUgYWJvdmUpLlxuICAgIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHRoaXMuX2NvbW1pdHRlZCA/IHBoYXNlIDogdW5kZWZpbmVkO1xuICAgIHRoaXMubWF0ZXJpYWxpc2VXcml0ZXMoKTtcbiAgICB0aGlzLndhcm5PbkJvcnJvd2VkTXV0YXRpb24oKTtcbiAgICAvLyBUaGUgcmVjb3JkJ3MgaGFsZiAoYFJlY29yZEZyYW1lIMK3IGNvbW1pdGAg4oaSIGByZWNvcmRDb21taXQudHNgKS4gTm8gYnVmZmVyXG4gICAgLy8gPSBubyB3cml0ZSBldmVyIGJ1aWx0IG9uZSAoIzEzKTogdGhlIGNvbW1pdCBpcyBlbXB0eSBieSBjb25zdHJ1Y3Rpb24sXG4gICAgLy8gcmVjb3JkZWQgd2l0aCBaRVJPIGNsb25lcy4gVGhlIG5hbWVzIGFyZSByZWFkIG9uY2UgdGhlIHBheWxvYWQgaXMgYnVpbHQuXG4gICAgdGhpcy5yZWNvcmQuY29tbWl0KCgpID0+ICh7XG4gICAgICBzdGFnZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHVudHJhY2tlZFNvdXJjZXM6IHRoaXMuX3VudHJhY2tlZFNvdXJjZXMsXG4gICAgICB0YWdzOiB0aGlzLnRhZ3MsXG4gICAgICBwaGFzZTogY29udGludWF0aW9uLFxuICAgIH0pKTtcbiAgICAvLyBUaGUgb2JzZXJ2ZXIgKFNjb3BlRmFjYWRlKSBzZWVzIHRoZSB0cmFja2VkIG11dGF0aW9ucywgVEhFTiB0aGUgc3RhZ2luZ1xuICAgIC8vIHN0YXRlIGlzIHJlbGVhc2VkICgjMTNiKSwgc28gaXQgc2VlcyB0aGUgd29ybGQgYXMgaXQgd2FzLiBEMidzIG1hcmtlcnNcbiAgICAvLyBhbmQgdGhlIGRlY2xhcmVkIHRhZ3MgcmVsZWFzZSB3aXRoIGl0IOKAlCBvbmUgc3RhbXAgcGVyIGV4ZWN1dGlvbiwgc28gdGhlXG4gICAgLy8gZW5naW5lJ3MgZG91YmxlLWNvbW1pdCBwYXRocyByZWNvcmQgdGhlbSBleGFjdGx5IG9uY2UuXG4gICAgaWYgKHRoaXMuX2NvbW1pdE9ic2VydmVyKSB7XG4gICAgICB0aGlzLl9jb21taXRPYnNlcnZlcih7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH0pO1xuICAgIH1cbiAgICB0aGlzLnJlY29yZC5yZWxlYXNlKCk7XG4gICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgICAvLyBUaGUgc3RhZ2UgaXMgb3ZlcjogZXZlcnkgY2FsbCBpdCBtYWRlIHRoYXQgaXMgc3RpbGwgcnVubmluZyBzdG9wcyAoUDIpLCBhbmQgbm90aGluZyByZXBvcnRzIHRocm91Z2ggdGhlXG4gICAgLy8gZW5naW5lIGFueSBtb3JlIOKAlCBhIGxhdGUgcmVjb3JkIGlzIHJlZnVzZWQgYmVmb3JlIGl0IHdvdWxkIHJlYWNoIGl0LlxuICAgIHRoaXMuZW5kQ2FsbHModW5kZWZpbmVkKTtcbiAgICB0aGlzLl9hdHRlbXB0UmVwb3J0ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGlzIGZyYW1lIGhhcyBjb21taXR0ZWQg4oCUIGEgY2FsbCdzIHJlY29yZCBhcnJpdmluZyBhZnRlciBpdCBpcyBsYXRlIChQMiwgYFNjb3BlRmFjYWRlIMK3IGNhbGxgKS4gKi9cbiAgZ2V0IGNvbW1pdHRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbWl0dGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93IGF3YXkgZXZlcnl0aGluZyB0aGlzIHN0YWdlIGhhcyBTVEFHRUQsIHdpdGhvdXQgY29tbWl0dGluZyBhbnkgb2YgaXQuXG4gICAqXG4gICAqIFRoZSBpc29sYXRpb24gcHJpbWl0aXZlIGJlaGluZCBkZWNsYXJhdGl2ZSByZXRyeTogd2hlbiBhIG5vbi1maW5hbCBhdHRlbXB0XG4gICAqIGZhaWxzLCB0aGUgd3JpdGVzIGl0IHN0YWdlZCBtdXN0IG5vdCBiZSB2aXNpYmxlIHRvIHRoZSBuZXh0IGF0dGVtcHQsIG11c3RcbiAgICogbm90IHJlYWNoIHNoYXJlZCBzdGF0ZSwgYW5kIG11c3Qgbm90IGFwcGVhciBpbiB0aGUgY29tbWl0IGxvZyBvciBpbiB0aGlzXG4gICAqIHN0YWdlJ3Mgc25hcHNob3QuIERyb3BwaW5nIHRoZSBzdGFnaW5nIHN0YXRlIGFjaGlldmVzIGFsbCBmb3VyIGF0IG9uY2Ug4oCUXG4gICAqIHRoZXJlIGlzIG5vIHJvbGxiYWNrIG1hY2hpbmVyeSB0byBpbnZva2UgYmVjYXVzZSBub3RoaW5nIHdhcyBldmVyIGFwcGxpZWRcbiAgICogKE0xOiB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyIGhvbGRzIHdyaXRlcyB1bnRpbCBgY29tbWl0KClgIGZsdXNoZXMgdGhlbSkuXG4gICAqXG4gICAqIFdoYXQgaXMgcmVsZWFzZWQsIGFuZCB3aHkgZWFjaCBvbmUgbWF0dGVycyBmb3IgdGhlIG5leHQgYXR0ZW1wdDpcbiAgICogIC0gdGhlIHJlY29yZCBmcmFtZSdzIHN0YWdlZCBzdGF0ZSAoYFJlY29yZEZyYW1lIMK3IGRpc2NhcmRgKSDigJQgdGhlIGJ1ZmZlclxuICAgKiAgICAgICAgICAgICAgICAgICAgKHRoZSBuZXh0IGF0dGVtcHQgc3RhcnRzIHdpdGggbm90aGluZyBzdGFnZWQpLCB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgIGZpcnN0LXRvdWNoIGJhc2UgKGl0IHJlLWFuY2hvcnMgb24gY29tbWl0dGVkIHN0YXRlIGFzXG4gICAqICAgICAgICAgICAgICAgICAgICBpdCBzdGFuZHMgTk9XIOKAlCBhIHNpYmxpbmcgZm9yayBicmFuY2ggbWF5IGxlZ2l0aW1hdGVseVxuICAgKiAgICAgICAgICAgICAgICAgICAgaGF2ZSBjb21taXR0ZWQgaW4gYmV0d2VlbikgYW5kIHRoZSByZWFkS2V5cyBsaXN0ICgjUDE6XG4gICAqICAgICAgICAgICAgICAgICAgICBhIGRpc2NhcmRlZCBhdHRlbXB0J3MgcmVhZHMgbXVzdCBuZXZlciByZWFjaCB0aGUgbmV4dFxuICAgKiAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCdzIGBUcmFjZUVudHJ5LnJlYWRLZXlzYCk7XG4gICAqICAtIGBfc3RhZ2VXcml0ZXNgIC8gYF9wZW5kaW5nV3JpdGVzYCAvIGBfc3RhZ2VSZWFkc2Ag4oCUIHRoZSBzbmFwc2hvdFxuICAgKiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDsgd2l0aG91dCB0aGUgcmVzZXQgdGhlIGV4ZWN1dGlvbiB0cmVlIHdvdWxkXG4gICAqICAgICAgICAgICAgICAgICAgICByZXBvcnQgd3JpdGVzIHRoYXQgd2VyZSBkaXNjYXJkZWQsIHdoaWNoIGlzIHRoZSBleGFjdFxuICAgKiAgICAgICAgICAgICAgICAgICAgbGllIHRoaXMgZmVhdHVyZSBleGlzdHMgdG8gcHJldmVudCAodGhlIHBlbmRpbmcgbWFwXG4gICAqICAgICAgICAgICAgICAgICAgICBob2xkcyBiYXJlIHJlZmVyZW5jZXMg4oCUIGRyb3BwaW5nIGl0IHVuLWNsb25lcyBub3RoaW5nKTtcbiAgICogIC0gYF91bnRyYWNrZWRTb3VyY2VzYCDigJQgdGhlIEQyIGhvbmVzdHkgbWFya2VycywgcmVsZWFzZWQgd2l0aCB0aGUgcmVzdC5cbiAgICpcbiAgICogV2hhdCBpcyBkZWxpYmVyYXRlbHkgS0VQVDogYGRlYnVnYCAobG9ncywgbWV0cmljcywgZXJyb3JzLCBmbG93IG1lc3NhZ2VzKVxuICAgKiBhbmQgdGhlIGF0dGVtcHQgcmVjb3JkcyAoMTAuMSkuIEJvdGggYXJlIHRoZSBhcHBlbmQtb25seSByZWNvcmQgb2Ygd2hhdFxuICAgKiBldmVyeSBhdHRlbXB0IGRpZCwgYW5kIHRoZSByZXRyeSBmZWF0dXJlJ3Mgd2hvbGUgcG9pbnQgaXMgdGhhdCB0aGUgZWFybGllclxuICAgKiBhdHRlbXB0cyBzdGF5IHZpc2libGUuXG4gICAqXG4gICAqIE5vIGNvbW1pdCBpcyByZWNvcmRlZCBhbmQgbm8gb2JzZXJ2ZXIgZmlyZXMg4oCUIGEgZGlzY2FyZGVkIGF0dGVtcHQgaXMgbm90IGFcbiAgICogY3Vyc29yIHN0b3AsIGJlY2F1c2UgZnJvbSBzaGFyZWQgc3RhdGUncyBwb2ludCBvZiB2aWV3IGl0IG5ldmVyIGhhcHBlbmVkLlxuICAgKi9cbiAgZGlzY2FyZFN0YWdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZC5kaXNjYXJkKCk7XG4gICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9wZW5kaW5nV3JpdGVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3N0YWdlV3JpdGVzID0ge307XG4gICAgdGhpcy5fc3RhZ2VSZWFkcyA9IHt9O1xuICAgIHRoaXMuX25lc3RlZFJlYWRzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3ZpZXdSZWFkcyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBBdHRlbXB0cyAoMTAuMSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEFwcGVuZCBvbmUgYXR0ZW1wdCdzIHJlY29yZCDigJQgdGhlIGF0dGVtcHQgcnVubmVyIGNhbGxzIHRoaXMgYXMgZWFjaCBhdHRlbXB0IGVuZHMuICovXG4gIHJlY29yZEF0dGVtcHQocmVjb3JkOiBBdHRlbXB0UmVjb3JkKTogdm9pZCB7XG4gICAgKHRoaXMuX2F0dGVtcHRzID8/PSBbXSkucHVzaChyZWNvcmQpO1xuICAgICh0aGlzLl9hdHRlbnRpb24gPz89IG5ldyBTdGFnZUF0dGVudGlvbigpKS5yZWNvcmRBdHRlbXB0KHJlY29yZCwgdGhpcy5ydW50aW1lU3RhZ2VJZCk7XG4gICAgdGhpcy5ub3RlQXR0ZW1wdChyZWNvcmQpO1xuICAgIC8vIFRoZSBzdGFnZSBhdHRlbXB0IGlzIG92ZXIsIGhvd2V2ZXIgaXQgZW5kZWQ6IHRoZSBjYWxscyBpdCBtYWRlIHN0b3AgKFAyKS5cbiAgICB0aGlzLmVuZENhbGxzKHJlY29yZC5hdHRlbXB0KTtcbiAgfVxuXG4gIC8qKiBTdGFtcCB0aGUgc2VyaWVzJyBzdW1tYXJ5IOKAlCBvbmNlLCB3aGVuIHRoZSBydW5uZXIgZW5kcyB0aGUgc2VyaWVzLiAqL1xuICBlbmRBdHRlbXB0cyhzdW1tYXJ5OiBBdHRlbXB0U3VtbWFyeSk6IHZvaWQge1xuICAgIHRoaXMuX2F0dGVtcHRTdW1tYXJ5ID0gc3VtbWFyeTtcbiAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKSkucmVjb3JkU3VtbWFyeShzdW1tYXJ5KTtcbiAgfVxuXG4gIC8qKiBSZXNldCBvbmx5IGF0IHRoZSBub2RlJ3MgZXhlY3V0aW9uIHN0YW1wLCBuZXZlciBiZXR3ZWVuIGF0dGVtcHRzLiAqL1xuICBiZWdpbkF0dGVudGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9hdHRlbnRpb24/LmJlZ2luKCk7XG4gIH1cblxuICAvKiogRGVsZWdhdGUgdGhlIGV4cGxpY2l0IHJldGFpbmVkLWVycm9yIGZhY3Q7IGF0dGVudGlvbiBvd25zIHZhbGlkYXRpb24gb2YgaXRzIHByb29mLiAqL1xuICBtYXJrU3RhZ2VGYWlsdXJlKCk6IHZvaWQge1xuICAgICh0aGlzLl9hdHRlbnRpb24gPz89IG5ldyBTdGFnZUF0dGVudGlvbigpKS5zdGFnZUZhaWxlZCh0aGlzLmRlYnVnLmVycm9yQ29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNyYXNoLXNhZmUgcmVjb3JkICgxMC4xLCBQNik6IGFuIGF0dGVtcHQgdGhhdCBlbmRlZCBpcyBub3RlZCBpbiB0aGUgcnVuJ3Mgc2luayBBVCBPTkNFLCBiZXNpZGUgdGhpcyBmcmFtZSdzXG4gICAqIGxvZyDigJQgc28gYSBwcm9jZXNzIGtpbGxlZCBiZWZvcmUgdGhlIHN0YWdlIGNvbW1pdHMgKG1pZC1yZXRyeSkgc3RpbGwgbGVhdmVzIGV2ZXJ5IGF0dGVtcHQgdGhhdCBlbmRlZC4gVGhlXG4gICAqIHJlY29yZCBpcyB0aGUgb25lIHRoZSB0cmVlIGtlZXBzOiBmcm96ZW4sIGBzdHJ1Y3R1cmVkQ2xvbmVgLXNhZmUsIGl0cyBlcnJvciB0aGUgU0VSVkVEIGZvcm0gKG5vIGByYXdgKSwgc28gdGhlXG4gICAqIG5vdGUgbmVlZHMgbm8gc2Vjb25kIHJlZGFjdGlvbiBwYXNzLiBXaXRob3V0IGEgc2luayB0aGUgbG9nIGRvZXMgbm90aGluZyAoYEV2ZW50TG9nIMK3IG5vdGVgKS5cbiAgICovXG4gIHByaXZhdGUgbm90ZUF0dGVtcHQocmVjb3JkOiBBdHRlbXB0UmVjb3JkKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmQubG9nPy5ub3RlKCdhdHRlbXB0JywgeyByZWNvcmQgfSk7XG4gIH1cblxuICAvKiogVGhlIGF0dGVtcHRzIG9mIHRoaXMgZXhlY3V0aW9uIHNvIGZhciwgaW4gb3JkZXIg4oCUIGl0cyBvd24gYW5kIGl0cyBjYWxscyc7IGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgYXJlIG5vbmUuICovXG4gIGdldCBhdHRlbXB0cygpOiByZWFkb25seSBBdHRlbXB0UmVjb3JkW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hdHRlbXB0cztcbiAgfVxuXG4gIC8qKiBUaGUgZW5kZWQgc2VyaWVzJyBzdW1tYXJ5OyBgdW5kZWZpbmVkYCB3aGlsZSBpdCBydW5zIGFuZCB3aXRob3V0IGEgcG9saWN5LiAqL1xuICBnZXQgYXR0ZW1wdFN1bW1hcnkoKTogQXR0ZW1wdFN1bW1hcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hdHRlbXB0U3VtbWFyeTtcbiAgfVxuXG4gIC8qKiBUaGUgYXR0ZW1wdCBhYm91dCB0byBydW4gKGFuZCB0aGUgcnVuJ3Mgc2lnbmFsKSDigJQgYFN0YWdlUnVubmVyYCBzZXRzIGJvdGggYmVmb3JlIGl0IGJ1aWxkcyB0aGUgc2NvcGUuICovXG4gIHVzZUF0dGVtcHQoYXR0ZW1wdDogQXR0ZW1wdENvbnRleHQgfCB1bmRlZmluZWQsIHJ1blNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl9hdHRlbXB0ID0gYXR0ZW1wdDtcbiAgICB0aGlzLl9ydW5TaWduYWwgPSBydW5TaWduYWw7XG4gIH1cblxuICAvKiogVGhlIGF0dGVtcHQgbm93IHJ1bm5pbmc7IGB1bmRlZmluZWRgIGZvciBhIHN0YWdlIHRoZSBhdHRlbXB0IHJ1bm5lciBkb2VzIG5vdCBydW4uICovXG4gIGdldCBhdHRlbXB0KCk6IEF0dGVtcHRDb250ZXh0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYXR0ZW1wdDtcbiAgfVxuXG4gIC8qKiBUaGUgcnVuJ3Mgc2lnbmFsLCBhcyBgU3RhZ2VSdW5uZXJgIGxhc3Qgc2F3IGl0LiAqL1xuICBnZXQgcnVuU2lnbmFsKCk6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuU2lnbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgYGF0dGVtcHRgIGVuZGVkIHdpdGhvdXQgYW4gYW5zd2VyOiBmcm9tIG5vdyBvbiBpdHMgc2NvcGUgaXMgZmVuY2VkIOKAlCBhIHdyaXRlLCBhbiBlbWl0IG9yIGEgcmVhZFxuICAgKiB0aHJvdWdoIGl0IGlzIHJlZnVzZWQgKGBTY29wZUZhY2FkZWApLiBUaGUgcnVubmVyIGNhbGxzIHRoaXMgdGhlIG1vbWVudCB0aGUgYXR0ZW1wdCdzIHNpZ25hbCBhYm9ydHMuXG4gICAqL1xuICBlbmRBdHRlbXB0KGF0dGVtcHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChhdHRlbXB0ID4gdGhpcy5fZW5kZWRUaHJvdWdoKSB0aGlzLl9lbmRlZFRocm91Z2ggPSBhdHRlbXB0O1xuICAgIC8vIEl0cyBjYWxscyBzdG9wIGF0IHRoZSBzYW1lIG1vbWVudCwgd2l0aCB0aGUgYXR0ZW1wdCdzIG93biByZWFzb24gd2hlbiBpdHMgc2lnbmFsIGFib3J0ZWQgKGEgY2FwIG9yIHRoZVxuICAgIC8vIGRlYWRsaW5lIGlzIGEgdGltZSBsaW1pdDogYSBjYWxsIGl0IGN1dHMgdGltZWQgb3V0KSDigJQgc3luY2hyb25vdXMsIGFoZWFkIG9mIHRoZSBjYWxscycgb3duIGxpc3RlbmVycy5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fYXR0ZW1wdDtcbiAgICBjb25zdCBzaWduYWwgPSBjdXJyZW50ICE9PSB1bmRlZmluZWQgJiYgY3VycmVudC5hdHRlbXB0ID09PSBhdHRlbXB0ID8gY3VycmVudC5zaWduYWwgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbmRDYWxscyhhdHRlbXB0LCBzaWduYWw/LmFib3J0ZWQgPyBzaWduYWwucmVhc29uIDogdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGF0dGVtcHQgYGF0dGVtcHRgIGhhcyBlbmRlZCDigJQgaXRzIHNjb3BlIG1heSBubyBsb25nZXIgdG91Y2ggdGhlIHN0YWdlLiAqL1xuICBoYXNBdHRlbXB0RW5kZWQoYXR0ZW1wdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGF0dGVtcHQgPD0gdGhpcy5fZW5kZWRUaHJvdWdoO1xuICB9XG5cbiAgLyoqIFJlY29yZCBhIHdyaXRlIGFuIGVuZGVkIGF0dGVtcHQgdHJpZWQg4oCUIGEgbmFtZSwgbmV2ZXIgdGhlIHZhbHVlLiBBcHBlbmQtb25seSBldmlkZW5jZSBsaWtlIHRoZSBhdHRlbXB0cy4gKi9cbiAgcmVjb3JkTGF0ZVdyaXRlKHdyaXRlOiBMYXRlV3JpdGUpOiB2b2lkIHtcbiAgICBjb25zdCB3cml0ZXMgPSAodGhpcy5fbGF0ZVdyaXRlcyA/Pz0gW10pO1xuICAgIC8vIEJvdW5kZWQ6IHRoZSBmaXJzdCBvbmVzIHNheSB3aGF0IHRoZSBhYmFuZG9uZWQgYXR0ZW1wdCBrZXB0IGRvaW5nOyBhIGxvb3Agb2YgdGhlbSBhZGRzIG5vdGhpbmcuXG4gICAgaWYgKHdyaXRlcy5sZW5ndGggPCBNQVhfTEFURV9XUklURVMpIHdyaXRlcy5wdXNoKE9iamVjdC5mcmVlemUoeyAuLi53cml0ZSB9KSk7XG4gIH1cblxuICAvLyDilIDilIAgU2lkZSBlZmZlY3RzIChQMykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRoaXMgZXhlY3V0aW9uJ3Mgb3duIGlkZW1wb3RlbmN5IGtleSBtYXkgYmUgbWFkZSBvZiBhIHNlbGVjdGVkIHZhbHVlIChvciB3YXMgY2FycmllZCBieSBhIGNoZWNrcG9pbnQpLiAqL1xuICBwcml2YXRlIF9lZmZlY3RLZXlUYWludGVkID0gZmFsc2U7XG4gIC8qKiBBIHRvdWNoaW5nIGAkY2FsbGAgd2l0aCBOTyBrZXkgc3RhcnRlZCBpbiB0aGlzIGV4ZWN1dGlvbiDigJQgdGhlIHN0YWdlIG1heSBub3QgYmUgcmUtcnVuIGJ5IGEgcmVzdW1lLiAqL1xuICBwcml2YXRlIF9rZXlsZXNzRWZmZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGFuIGV4ZWN1dGlvbidzIHNpZGUtZWZmZWN0IGJvb2trZWVwaW5nIChgRmxvd2NoYXJ0VHJhdmVyc2VyIMK3IGV4ZWN1dGVTdGFnZWAsIGJlZm9yZSBhdHRlbXB0IDEpIOKAlCByZXNldCxcbiAgICogYmVjYXVzZSBhIGZyYW1lIGNhbiBiZSByZS11c2VkIGJ5IGEgbGF0ZXIgZXhlY3V0aW9uLiBga2V5VGFpbnRlZGA6IHRoZSBzdGFnZSdzIG93biBrZXkgbWF5IGJlIG1hZGUgb2YgYSBzZWxlY3RlZFxuICAgKiB2YWx1ZSwgc28gYSBrZXkgYSBgJGNhbGxgIHBhc3NlcyBvbiAoYCRhdHRlbXB0KCkuaWRlbXBvdGVuY3lLZXlgKSBpcyBzZXJ2ZWQgdGhlIHNhbWUgd2F5LlxuICAgKi9cbiAgYmVnaW5FZmZlY3RzKGtleVRhaW50ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9lZmZlY3RLZXlUYWludGVkID0ga2V5VGFpbnRlZDtcbiAgICB0aGlzLl9rZXlsZXNzRWZmZWN0ID0gZmFsc2U7XG4gIH1cblxuICBnZXQgZWZmZWN0S2V5VGFpbnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZWZmZWN0S2V5VGFpbnRlZDtcbiAgfVxuXG4gIC8qKiBBIGtleWxlc3MgdG91Y2hpbmcgYCRjYWxsYCBzdGFydGVkOiBhbiBgaW50ZXJydXB0KClgIGFmdGVyIGl0IHdvdWxkIHJlLXNlbmQgaXQgb24gcmVzdW1lIChgU3RhZ2VSdW5uZXJgKS4gKi9cbiAgbWFya0tleWxlc3NFZmZlY3QoKTogdm9pZCB7XG4gICAgdGhpcy5fa2V5bGVzc0VmZmVjdCA9IHRydWU7XG4gIH1cblxuICBnZXQgaGFzS2V5bGVzc0VmZmVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fa2V5bGVzc0VmZmVjdDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYWxscyBtYWRlIGluc2lkZSB0aGUgc3RhZ2UgKFAyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogV2hlcmUgdGhpcyBleGVjdXRpb24ncyBjYWxsIHJlY29yZHMgYXJlIHJlcG9ydGVkIOKAlCB0aGUgZW5naW5lIHNldHMgaXQgYmVmb3JlIHRoZSBzdGFnZSBydW5zLiAqL1xuICB1c2VBdHRlbXB0UmVwb3J0ZXIoXG4gICAgcmVwb3J0OiAoKHJlY29yZDogQXR0ZW1wdFJlY29yZCwgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHwgdW5kZWZpbmVkKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fYXR0ZW1wdFJlcG9ydGVyID0gcmVwb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaWduYWwgdGhlIGNhbGxzIG9mIHN0YWdlIGF0dGVtcHQgYHN0YWdlQXR0ZW1wdGAgcnVuIHVuZGVyIGJlc2lkZXMgaXRzIG93biAoUDIpOiBhYm9ydGVkIHdoZW4gdGhhdCBhdHRlbXB0IGlzXG4gICAqIG92ZXIg4oCUIGhvd2V2ZXIgaXQgZW5kZWQg4oCUIGFuZCB3aGVuIHRoZSBmcmFtZSBjb21taXRzLCBzbyBubyBjYWxsIG91dGxpdmVzIHRoZSBhdHRlbXB0IHRoYXQgbWFkZSBpdCAobm9cbiAgICogYmFja2dyb3VuZCByZXRyeSwgbm8gd2FpdCwgbm8gbGlzdGVuZXIgbGVmdCBvbiB0aGUgcnVuJ3Mgc2lnbmFsKS4gQWxyZWFkeSBhYm9ydGVkIGFmdGVyIHRoZSBjb21taXQuXG4gICAqL1xuICBjYWxsc0VuZGVkU2lnbmFsKHN0YWdlQXR0ZW1wdDogbnVtYmVyKTogQWJvcnRTaWduYWwge1xuICAgIGNvbnN0IGVuZGVkID0gKHRoaXMuX2NhbGxzRW5kZWQgPz89IG5ldyBNYXAoKSk7XG4gICAgbGV0IGNvbnRyb2xsZXIgPSBlbmRlZC5nZXQoc3RhZ2VBdHRlbXB0KTtcbiAgICBpZiAoY29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgZW5kZWQuc2V0KHN0YWdlQXR0ZW1wdCwgY29udHJvbGxlcik7XG4gICAgICBpZiAodGhpcy5fY29tbWl0dGVkKSBjb250cm9sbGVyLmFib3J0KGNhbGxzRW5kZWRSZWFzb24oKSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyLnNpZ25hbDtcbiAgfVxuXG4gIC8qKiBFbmQgdGhlIGNhbGxzIG9mIGBzdGFnZUF0dGVtcHRgIChldmVyeSBhdHRlbXB0J3Mgd2hlbiBgdW5kZWZpbmVkYCkg4oCUIGByZWFzb25gIHdoZW4gdGhlIGF0dGVtcHQncyBzaWduYWwgZ2F2ZSBvbmUuICovXG4gIHByaXZhdGUgZW5kQ2FsbHMoc3RhZ2VBdHRlbXB0OiBudW1iZXIgfCB1bmRlZmluZWQsIHJlYXNvbj86IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2FsbHNFbmRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBbYXR0ZW1wdCwgY29udHJvbGxlcl0gb2YgdGhpcy5fY2FsbHNFbmRlZCkge1xuICAgICAgaWYgKHN0YWdlQXR0ZW1wdCAhPT0gdW5kZWZpbmVkICYmIGF0dGVtcHQgIT09IHN0YWdlQXR0ZW1wdCkgY29udGludWU7XG4gICAgICBpZiAoIWNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGNvbnRyb2xsZXIuYWJvcnQocmVhc29uID8/IGNhbGxzRW5kZWRSZWFzb24oKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBuZXh0IGNhbGwncyBvcmRpbmFsIHdpdGhpbiBzdGFnZSBhdHRlbXB0IGBzdGFnZUF0dGVtcHRgLCAxLWJhc2VkIChgYXR0ZW1wdC9jYWxsLnRzIMK3IGNhbGxTZXJpZXNgKS4gKi9cbiAgbmV4dENhbGxPcmRpbmFsKHN0YWdlQXR0ZW1wdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBvcmRpbmFscyA9ICh0aGlzLl9jYWxsT3JkaW5hbHMgPz89IG5ldyBNYXAoKSk7XG4gICAgY29uc3QgbmV4dCA9IChvcmRpbmFscy5nZXQoc3RhZ2VBdHRlbXB0KSA/PyAwKSArIDE7XG4gICAgb3JkaW5hbHMuc2V0KHN0YWdlQXR0ZW1wdCwgbmV4dCk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBjYWxsJ3MgKG9yIGFuIG9ic2VydmVkKSBhdHRlbXB0IHJlY29yZDoga2VwdCBiZXNpZGUgdGhlIHN0YWdlJ3Mgb3duIGF0dGVtcHRzIOKAlCB0aGUgZmlyc3RcbiAgICoge0BsaW5rIE1BWF9DQUxMX1JFQ09SRFN9LCB0aGUgcmVzdCBjb3VudGVkIOKAlCBhbmQgcmVwb3J0ZWQgdG8gdGhlIHJ1bidzIGBvbkF0dGVtcHRgIGVpdGhlciB3YXkuIExpa2UgdGhlIHN0YWdlJ3NcbiAgICogcmVjb3JkcywgTk9UIGNsZWFyZWQgYnkge0BsaW5rIGRpc2NhcmRTdGFnZWR9OiBhIGZhaWxlZCBhdHRlbXB0J3MgY2FsbHMgYXJlIGV2aWRlbmNlIHRvby5cbiAgICovXG4gIHJlcG9ydENhbGxBdHRlbXB0KHJlY29yZDogQXR0ZW1wdFJlY29yZCwgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NhbGxSZWNvcmRzIDwgTUFYX0NBTExfUkVDT1JEUykge1xuICAgICAgdGhpcy5fY2FsbFJlY29yZHMgKz0gMTtcbiAgICAgICh0aGlzLl9hdHRlbXB0cyA/Pz0gW10pLnB1c2gocmVjb3JkKTtcbiAgICAgICh0aGlzLl9hdHRlbnRpb24gPz89IG5ldyBTdGFnZUF0dGVudGlvbigpKS5yZWNvcmRBdHRlbXB0KHJlY29yZCwgdGhpcy5ydW50aW1lU3RhZ2VJZCk7XG4gICAgICB0aGlzLm5vdGVBdHRlbXB0KHJlY29yZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2F0dGVtcHRzRHJvcHBlZCArPSAxO1xuICAgICAgKHRoaXMuX2F0dGVudGlvbiA/Pz0gbmV3IFN0YWdlQXR0ZW50aW9uKCkpLmF0dGVtcHREcm9wcGVkKCk7XG4gICAgfVxuICAgIHRoaXMuX2F0dGVtcHRSZXBvcnRlcj8uKHJlY29yZCwgc3RydWN0dXJlZEVycm9yKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUcmVlIG5hdmlnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIENyZWF0ZSAob3IgcmV0dXJuKSB0aGlzIGNvbnRleHQncyBsaW5rZWQgc3VjY2Vzc29yLlxuICAgKlxuICAgKiBNRU1PSVpFRDogdGhlIGZpcnN0IGNhbGwgY3JlYXRlcyBgdGhpcy5uZXh0YDsgZXZlcnkgbGF0ZXIgY2FsbCByZXR1cm5zXG4gICAqIHRoYXQgU0FNRSBjb250ZXh0IGFuZCBJR05PUkVTIGl0cyBhcmd1bWVudHMuIEluIG5vcm1hbCB0cmF2ZXJzYWwgZWFjaFxuICAgKiBjb250ZXh0IGFkdmFuY2VzIGV4YWN0bHkgb25jZSwgc28gdGhlIG1lbW8gbmV2ZXIgYml0ZXMg4oCUIGJ1dCBhIGNhbGxlclxuICAgKiBleHBlY3RpbmcgYSBmcmVzaCBjb250ZXh0IGZvciBkaWZmZXJlbnQgYHN0YWdlTmFtZWAvYHN0YWdlSWRgIGFyZ3MgZ2V0c1xuICAgKiB0aGUgb2xkIG9uZSBzaWxlbnRseS4gRGV2IG1vZGUgKGBlbmFibGVEZXZNb2RlKClgKSB3YXJucyBvbiB0aGF0XG4gICAqIG1pc21hdGNoIChiYWNrbG9nIEI0KS5cbiAgICovXG4gIGNyZWF0ZU5leHQocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nLCBpc0RlY2lkZXIgPSBmYWxzZSk6IFN0YWdlQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLm5leHQpIHtcbiAgICAgIHRoaXMubmV4dCA9IG5ldyBTdGFnZUNvbnRleHQocGF0aCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0aGlzLnJlY29yZC5zdGF0ZSwgJycsIHRoaXMucmVjb3JkLmxvZywgaXNEZWNpZGVyKTtcbiAgICAgIHRoaXMubmV4dC5wYXJlbnQgPSB0aGlzO1xuICAgICAgdGhpcy5uZXh0LmluaGVyaXRSdW4odGhpcyk7XG4gICAgICB0aGlzLm5leHQuZmFpbHVyZVN0YXRlID0gdGhpcy5mYWlsdXJlU3RhdGU7XG4gICAgfSBlbHNlIGlmIChpc0Rldk1vZGUoKSAmJiAodGhpcy5uZXh0LnN0YWdlSWQgIT09IHN0YWdlSWQgfHwgdGhpcy5uZXh0LnN0YWdlTmFtZSAhPT0gc3RhZ2VOYW1lKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtmb290cHJpbnRdIFN0YWdlQ29udGV4dC5jcmVhdGVOZXh0OiBuZXh0IGNvbnRleHQgYWxyZWFkeSBleGlzdHMgYXMgXCIke3RoaXMubmV4dC5zdGFnZU5hbWV9XCIgYCArXG4gICAgICAgICAgYChpZDogXCIke3RoaXMubmV4dC5zdGFnZUlkfVwiKSDigJQgYXJndW1lbnRzIFwiJHtzdGFnZU5hbWV9XCIgKGlkOiBcIiR7c3RhZ2VJZH1cIikgYXJlIGlnbm9yZWQgYCArXG4gICAgICAgICAgJ2FuZCB0aGUgZXhpc3RpbmcgY29udGV4dCBpcyByZXR1cm5lZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubmV4dDtcbiAgfVxuXG4gIGNyZWF0ZUNoaWxkKHJ1bklkOiBzdHJpbmcsIGJyYW5jaElkOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB9XG4gICAgY29uc3QgY2hpbGQgPSBuZXcgU3RhZ2VDb250ZXh0KHJ1bklkLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMucmVjb3JkLnN0YXRlLCBicmFuY2hJZCwgdGhpcy5yZWNvcmQubG9nLCBpc0RlY2lkZXIpO1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgY2hpbGQuaW5oZXJpdFJ1bih0aGlzKTtcbiAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIGNyZWF0ZURlY2lkZXIocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXh0KHBhdGgsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdHJ1ZSk7XG4gIH1cblxuICBzZXRBc0RlY2lkZXIoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRGVjaWRlciA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBc0ZvcmsoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRm9yayA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgRGlhZ25vc3RpY3MgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQGludGVybmFsIFJldGFpbmVkIGluY29taW5nIHZhbHVlIGZvciB0aGUgZmFjYWRlJ3MgbGVnYWN5IGVtaXQgY2hhbm5lbC4gKi9cbiAgYWRkRGlhZ25vc3RpYyhjaGFubmVsOiBEaWFnbm9zdGljQ2hhbm5lbCwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5kZWJ1Zy5hZGQoY2hhbm5lbCwga2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldExvZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0TG9nKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkTWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRNZXRyaWMoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldE1ldHJpYyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEV2YWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEV2YWwoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRXJyb3Ioa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEVycm9yKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRmxvd0RlYnVnTWVzc2FnZShcbiAgICB0eXBlOiBGbG93Q29udHJvbFR5cGUsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyB0YXJnZXRTdGFnZT86IHN0cmluZyB8IHN0cmluZ1tdOyByYXRpb25hbGU/OiBzdHJpbmc7IGNvdW50PzogbnVtYmVyOyBpdGVyYXRpb24/OiBudW1iZXIgfSxcbiAgKSB7XG4gICAgY29uc3QgZmxvd01lc3NhZ2U6IEZsb3dNZXNzYWdlID0geyB0eXBlLCBkZXNjcmlwdGlvbiwgdGltZXN0YW1wOiBEYXRlLm5vdygpLCAuLi5vcHRpb25zIH07XG4gICAgdGhpcy5kZWJ1Zy5hZGRGbG93TWVzc2FnZShmbG93TWVzc2FnZSk7XG4gIH1cblxuICAvLyDilIDilIAgU25hcHNob3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0U3RhZ2VJZCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5ydW5JZCB8fCB0aGlzLnJ1bklkID09PSAnJykgcmV0dXJuIHRoaXMuc3RhZ2VOYW1lO1xuICAgIHJldHVybiBgJHt0aGlzLnJ1bklkfS4ke3RoaXMuc3RhZ2VOYW1lfWA7XG4gIH1cblxuICBnZXRTbmFwc2hvdCgpOiBTdGFnZVNuYXBzaG90IHtcbiAgICAvLyBJdGVyYXRpdmUgd2FsayAoZXhwbGljaXQgd29yayBzdGFjayksIE5PVCByZWN1cnNpb246IHRoZSBleGVjdXRpb25cbiAgICAvLyB0cmVlIGRlZXBlbnMgYnkgb25lIGxldmVsIHBlciBleGVjdXRlZCBzdGFnZSBhbG9uZyBgbmV4dGAgY2hhaW5zLCBhbmRcbiAgICAvLyB0aGUgdHJhbXBvbGluZWQgdHJhdmVyc2VyIGFsbG93cyBjaGFpbnMvbG9vcHMgb2YgdGVucyBvZiB0aG91c2FuZHMgb2ZcbiAgICAvLyBzdGFnZXMg4oCUIGZhciBkZWVwZXIgdGhhbiBhIHJlY3Vyc2l2ZSBzZXJpYWxpemVyIGNhbiB3YWxrIGJlZm9yZVxuICAgIC8vIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgICBjb25zdCByb290ID0gdGhpcy5zbmFwc2hvdFNlbGYoKTtcbiAgICBjb25zdCB3b3JrOiBBcnJheTx7IGN0eDogU3RhZ2VDb250ZXh0OyBzbmFwOiBTdGFnZVNuYXBzaG90IH0+ID0gW3sgY3R4OiB0aGlzLCBzbmFwOiByb290IH1dO1xuICAgIHdoaWxlICh3b3JrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgY3R4LCBzbmFwIH0gPSB3b3JrLnBvcCgpITtcbiAgICAgIGlmIChjdHgubmV4dCkge1xuICAgICAgICBjb25zdCBuZXh0U25hcCA9IGN0eC5uZXh0LnNuYXBzaG90U2VsZigpO1xuICAgICAgICBzbmFwLm5leHQgPSBuZXh0U25hcDtcbiAgICAgICAgd29yay5wdXNoKHsgY3R4OiBjdHgubmV4dCwgc25hcDogbmV4dFNuYXAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY3R4LmNoaWxkcmVuKSB7XG4gICAgICAgIHNuYXAuY2hpbGRyZW4gPSBjdHguY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoaWxkU25hcCA9IGNoaWxkLnNuYXBzaG90U2VsZigpO1xuICAgICAgICAgIHdvcmsucHVzaCh7IGN0eDogY2hpbGQsIHNuYXA6IGNoaWxkU25hcCB9KTtcbiAgICAgICAgICByZXR1cm4gY2hpbGRTbmFwO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKiogU25hcHNob3Qgb2YgVEhJUyBjb250ZXh0J3Mgb3duIGZpZWxkcyDigJQgYG5leHRgL2BjaGlsZHJlbmAgYXJlIGZpbGxlZFxuICAgKiAgaW4gYnkgdGhlIGl0ZXJhdGl2ZSB3YWxrIGluIGBnZXRTbmFwc2hvdGAuICovXG4gIHByaXZhdGUgc25hcHNob3RTZWxmKCk6IFN0YWdlU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90OiBTdGFnZVNuYXBzaG90ID0ge1xuICAgICAgaWQ6IHRoaXMuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLnJ1bnRpbWVTdGFnZUlkIHx8IHVuZGVmaW5lZCxcbiAgICAgIG5hbWU6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgaXNEZWNpZGVyOiB0aGlzLmlzRGVjaWRlcixcbiAgICAgIGlzRm9yazogdGhpcy5pc0ZvcmssXG4gICAgICBsb2dzOiB0aGlzLmRlYnVnLmxvZ0NvbnRleHQsXG4gICAgICBlcnJvcnM6IHRoaXMuZGVidWcuZXJyb3JDb250ZXh0LFxuICAgICAgbWV0cmljczogdGhpcy5kZWJ1Zy5tZXRyaWNDb250ZXh0LFxuICAgICAgZXZhbHM6IHRoaXMuZGVidWcuZXZhbENvbnRleHQsXG4gICAgfTtcbiAgICBjb25zdCBzdGFnZVdyaXRlcyA9IHRoaXMucmV0YWluZWRXcml0ZXMoKTtcbiAgICBpZiAoT2JqZWN0LmtleXMoc3RhZ2VXcml0ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEV4dHJhY3QgdmFsdWVzIG9ubHkgZm9yIHRoZSBzbmFwc2hvdCAoc3RyaXAgb3BlcmF0aW9uIG1ldGFkYXRhKVxuICAgICAgY29uc3Qgd3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaywgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHN0YWdlV3JpdGVzKSkge1xuICAgICAgICB3cml0ZXNba10gPSBlbnRyeS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHNuYXBzaG90LnN0YWdlV3JpdGVzID0gd3JpdGVzO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fc3RhZ2VSZWFkcykubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3Quc3RhZ2VSZWFkcyA9IHRoaXMuX3N0YWdlUmVhZHM7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICBzbmFwc2hvdC5kZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLnN1YmZsb3dJZCkge1xuICAgICAgc25hcHNob3Quc3ViZmxvd0lkID0gdGhpcy5zdWJmbG93SWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlYnVnLmZsb3dNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5mbG93TWVzc2FnZXMgPSB0aGlzLmRlYnVnLmZsb3dNZXNzYWdlcztcbiAgICB9XG4gICAgLy8gQSBjb3B5IG9mIHRoZSBsaXN0ICh0aGUgcmVjb3JkcyB0aGVtc2VsdmVzIGFyZSBmcm96ZW4pOiBhIHJlYWRlciBvZiBvbmUgc25hcHNob3QgbmV2ZXIgc2VlcyBhIGxhdGVyXG4gICAgLy8gYXR0ZW1wdCBhcnJpdmUgaW4gaXQsIGFuZCBuZXZlciBlZGl0cyB0aGUgZnJhbWUncyBvd24gbGlzdC5cbiAgICBpZiAodGhpcy5fYXR0ZW1wdHMpIHNuYXBzaG90LmF0dGVtcHRzID0gT2JqZWN0LmZyZWV6ZShbLi4udGhpcy5fYXR0ZW1wdHNdKTtcbiAgICBpZiAodGhpcy5fYXR0ZW1wdFN1bW1hcnkpIHNuYXBzaG90LmF0dGVtcHRTdW1tYXJ5ID0gdGhpcy5fYXR0ZW1wdFN1bW1hcnk7XG4gICAgaWYgKHRoaXMuX2xhdGVXcml0ZXMpIHNuYXBzaG90LmxhdGVXcml0ZXMgPSBPYmplY3QuZnJlZXplKFsuLi50aGlzLl9sYXRlV3JpdGVzXSk7XG4gICAgaWYgKHRoaXMuX2F0dGVtcHRzRHJvcHBlZCA+IDApIHNuYXBzaG90LmF0dGVtcHRzRHJvcHBlZCA9IHRoaXMuX2F0dGVtcHRzRHJvcHBlZDtcbiAgICBjb25zdCBhdHRlbnRpb24gPSB0aGlzLl9hdHRlbnRpb24/LnNuYXBzaG90KCk7XG4gICAgaWYgKGF0dGVudGlvbj8ubGVuZ3RoKSBzbmFwc2hvdC5hdHRlbnRpb24gPSBhdHRlbnRpb247XG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG59XG4iXX0=
|
|
1127
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUlILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUk5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBK0Isa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUcsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3ZGLE9BQU8sRUFDTCxLQUFLLEVBQ0wsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixPQUFPLEVBQ1AsU0FBUyxHQUNWLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRSxtSEFBbUg7QUFDbkgsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDO0FBRTVCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFFckMsdUhBQXVIO0FBQ3ZILFNBQVMsZ0JBQWdCO0lBQ3ZCLE9BQU8sSUFBSSxLQUFLLENBQ2QsOEdBQThHO1FBQzVHLHVEQUF1RCxDQUMxRCxD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LENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ2xELENBQUM7UUFDRCxzR0FBc0c7UUFDdEcsOERBQThEO1FBQzlELElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxRQUFRLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksSUFBSSxDQUFDLGVBQWU7WUFBRSxRQUFRLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDekUsSUFBSSxJQUFJLENBQUMsV0FBVztZQUFFLFFBQVEsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDakYsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQztZQUFFLFFBQVEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ2hGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDOUMsSUFBSSxTQUFTLEVBQUUsTUFBTTtZQUFFLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3RELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RhZ2VDb250ZXh0IOKAlCBFeGVjdXRpb24gY29udGV4dCBmb3IgYSBzaW5nbGUgc3RhZ2UgaW4gYSBmbG93Y2hhcnQgcnVuXG4gKlxuICogTGlrZSBhIHN0YWNrIGZyYW1lIGluIGEgY29tcGlsZXIvcnVudGltZTpcbiAqIC0gQSBSZWNvcmRGcmFtZSDigJQgdGhlIHJlY29yZCBoYWxmIChDMyk6IHRoZSBoZWFwLCB0aGUgYWRkcmVzcywgdGhlXG4gKiAgIGZpcnN0LXRvdWNoIGJhc2UsIHRoZSBsYXp5IHRyYW5zYWN0aW9uIGJ1ZmZlciBhbmQgZXZlcnkgd3JpdGUncyBzY3J1YlxuICogICAoQzQpLCB0aGUgcmVhZEtleXMgbGlzdFxuICogLSBMaW5rcyB0byBwYXJlbnQvY2hpbGQvbmV4dCBjb250ZXh0cyAoY2FsbCBzdGFjayBmcmFtZXMpXG4gKiAtIFdoYXQgYmVsb25ncyB0byBhIHN0YWdlIGluc2lkZSBhIHJ1bjogcmV0ZW50aW9uIG9mIHJlYWRzIGFuZCB3cml0ZXMsIHRoZVxuICogICByZWRhY3Rpb24gZGVjaXNpb24gcGVyIHdyaXRlIChgcmVkYWN0aW9uLnRzIMK3IGRlY2lkZVdyaXRlYCkgYW5kIHdoZXJlIHRoZVxuICogICBmcmFtZSB3cml0ZXMgKGBydW5BZGRyZXNzLnRzYCksIHRoZSBkZXYtbW9kZSB3YXJuaW5ncywgdGhlIGNvbW1pdCBvYnNlcnZlclxuICogLSBEaWFnbm9zdGljQ29sbGVjdG9yIGZvciBsb2dzLCBlcnJvcnMsIG1ldHJpY3NcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdFBoYXNlLCBFbWl0U291cmNlUG9zaXRpb24sIFVudHJhY2tlZFNvdXJjZSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50TG9nLCBTaGFyZWRNZW1vcnksIFdyaXRlVmVyYiB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5pbXBvcnQgeyBSZWNvcmRGcmFtZSB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgQXR0ZW1wdENvbnRleHQsIEF0dGVtcHRSZWNvcmQsIEF0dGVtcHRTdW1tYXJ5LCBMYXRlV3JpdGUgfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTmF0aXZlQ2FwdHVyZSB9IGZyb20gJy4uL2NhcHR1cmUvbmF0aXZlQ292ZXJhZ2UuanMnO1xuaW1wb3J0IHsgc3VtbWFyaXplUmVhZFZhbHVlLCBzdW1tYXJpemVXcml0ZVZhbHVlIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IHR5cGUgVGVybWluYWxGYWlsdXJlQ29udGV4dCwgTmF0aXZlRmFpbHVyZVN0YXRlIH0gZnJvbSAnLi4vZXJyb3JzL3Rlcm1pbmFsRmFpbHVyZS5qcyc7XG5pbXBvcnQgeyBTdGFnZUF0dGVudGlvbiB9IGZyb20gJy4vYXR0ZW50aW9uLmpzJztcbmltcG9ydCB7IGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlLCBjb21taXR0ZWRNdXRhdGlvbk1lc3NhZ2UsIGZpcnN0RGlmZmVyaW5nUGF0aCB9IGZyb20gJy4vYm9ycm93ZWRNdXRhdGlvbi5qcyc7XG5pbXBvcnQgeyB0eXBlIERpYWdub3N0aWNDaGFubmVsLCBEaWFnbm9zdGljQ29sbGVjdG9yIH0gZnJvbSAnLi9EaWFnbm9zdGljQ29sbGVjdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd0NvbnRyb2xUeXBlLCBGbG93TWVzc2FnZSwgUmVhZFRyYWNraW5nTW9kZSwgU3RhZ2VTbmFwc2hvdCwgV3JpdGVUcmFja2luZ01vZGUgfSBmcm9tICcuL2ZyYW1lVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25WZXJkaWN0IH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHtcbiAgQ0xFQVIsXG4gIGRlY2lkZVdyaXRlLFxuICBpbmhlcml0QnlJZGVudGl0eSxcbiAgbWFya1N0YWdlZFdyaXRlLFxuICBSZWRhY3Rpb25SdWxlLFxuICBTQ09QRV9QTEFDRUhPTERFUixcbiAgc2NydWJPZixcbiAgdXNlcktleU9mLFxufSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBydW5BZGRyZXNzIH0gZnJvbSAnLi9ydW5BZGRyZXNzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHsgREVGQVVMVF9SVU5fUE9MSUNZLCB3aXRoUmVkYWN0aW9uIH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuXG4vKiogSG93IG1hbnkgbGF0ZSB3cml0ZXMgYSBzdGFnZSBrZWVwcyDigJQgYW4gYWJhbmRvbmVkIGF0dGVtcHQgdGhhdCBsb29wcyBtdXN0IG5vdCBncm93IHRoZSByZWNvcmQgd2l0aG91dCBib3VuZC4gKi9cbmNvbnN0IE1BWF9MQVRFX1dSSVRFUyA9IDEwMDtcblxuLyoqXG4gKiBIb3cgbWFueSBjYWxsIGFuZCBvYnNlcnZlZCBhdHRlbXB0IHJlY29yZHMgb25lIHN0YWdlIGV4ZWN1dGlvbiBrZWVwcyAoUDIpIOKAlCBhIHN0YWdlIHRoYXQgY2FsbHMgaW4gYSBsb29wIG11c3RcbiAqIG5vdCBncm93IHRoZSBleGVjdXRpb24gdHJlZSB3aXRob3V0IGJvdW5kLiBUaGUgcmVzdCBhcmUgY291bnRlZCAoYFN0YWdlU25hcHNob3QuYXR0ZW1wdHNEcm9wcGVkYCkgYW5kIHN0aWxsXG4gKiBmaXJlZCBvbiBgb25BdHRlbXB0YC4gQSBzdGFnZSdzIE9XTiBhdHRlbXB0IHJlY29yZHMgYXJlIG5ldmVyIGRpc3BsYWNlZDogaXRzIHBvbGljeSdzIGNlaWxpbmcgYm91bmRzIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQ0FMTF9SRUNPUkRTID0gMTAwMDtcblxuLyoqIFdoeSBhIGNhbGwgc3RvcHBlZCB3aGVuIHRoZSBzdGFnZSBhdHRlbXB0IHRoYXQgbWFkZSBpdCBlbmRlZCB3aXRob3V0IGEgcmVhc29uIG9mIGl0cyBvd24gKGl0IHJldHVybmVkIG9yIHRocmV3KS4gKi9cbmZ1bmN0aW9uIGNhbGxzRW5kZWRSZWFzb24oKTogRXJyb3Ige1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgICdbZm9vdHByaW50XSAkY2FsbDogdGhlIHN0YWdlIGF0dGVtcHQgdGhhdCBtYWRlIHRoaXMgY2FsbCBoYXMgZW5kZWQg4oCUIHRoZSBjYWxsIHN0b3BzLCBhbmQgbm90aGluZyBpdCByZWNvcmRzICcgK1xuICAgICAgJ2xhbmRzIG9uIHRoZSBzdGFnZS4gQXdhaXQgZXZlcnkgY2FsbCB0aGUgc3RhZ2UgbWFrZXMuJyxcbiAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIFN0YWdlQ29udGV4dCB7XG4gIC8qKiBAaW50ZXJuYWwgT3duZXJzaGlwIG9mIGFuIGVzY2FwaW5nIGZhaWx1cmUuIFNoYXJlZCBvbmx5IGJ5IHNlcXVlbnRpYWwgZnJhbWVzLCBuZXZlciBzZXJpYWxpemVkLiAqL1xuICBmYWlsdXJlU3RhdGUgPSBuZXcgTmF0aXZlRmFpbHVyZVN0YXRlKCk7XG4gICNmYWlsdXJlSWRlbnRpdHk/OiBOb25OdWxsYWJsZTxUZXJtaW5hbEZhaWx1cmVDb250ZXh0WydzdGFnZSddPjtcblxuICAvKiogQGludGVybmFsIFRoZSBuYXRpdmUgZnJhbWUgc3RhbXAsIGluZGVwZW5kZW50IG9mIG11dGFibGUgcmVjb3JkZXIgZXZlbnQgY29udGV4dC4gKi9cbiAgZ2V0IGZhaWx1cmVJZGVudGl0eSgpOiBOb25OdWxsYWJsZTxUZXJtaW5hbEZhaWx1cmVDb250ZXh0WydzdGFnZSddPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2ZhaWx1cmVJZGVudGl0eTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgU3RhbXBlZCBiZWZvcmUgb2JzZXJ2ZXJzOyBuZXZlciBpbmhlcml0ZWQgYnkgYW5vdGhlciBmcmFtZSBvciBwZXJzaXN0ZWQuICovXG4gIGJpbmRGYWlsdXJlSWRlbnRpdHkocnVuSWQ6IHN0cmluZywgcnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuI2ZhaWx1cmVJZGVudGl0eSA9IE9iamVjdC5mcmVlemUoeyBydW5JZCwgcnVudGltZVN0YWdlSWQgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlY29yZCBoYWxmIG9mIHRoaXMgZnJhbWUgKGBSZWNvcmRGcmFtZS50c2AsIEwzLCBDMyk6IHRoZSBoZWFwIGFuZCxcbiAgICogd2hlbiB0aGUgcnVuIGtlZXBzIHRoZW0sIHRoZSByZWRhY3RlZCBtaXJyb3IgYW5kIHRoZSBsb2c7IHRoZSBhZGRyZXNzO1xuICAgKiB0aGUgZmlyc3QtdG91Y2ggYmFzZTsgdGhlIGxhenkgdHJhbnNhY3Rpb24gYnVmZmVyOyB0aGUgcmVhZEtleXMgbGlzdC5cbiAgICogRXZlcnkgc3RhdGUgcmVhZCBvZiB0aGlzIGZyYW1lIGdvZXMgdGhyb3VnaCBpdCwgYW5kIHNvIGRvZXMgZXZlcnlcbiAgICogY29tbWl0LiBUaGUgbWlycm9yIGlzIHByZXNlbnQgKipvbmx5Kiogd2hlbiB0aGUgcnVuJ3MgcG9saWN5IGtlZXBzIGFcbiAgICogcmVkYWN0ZWQgdmlldyAoYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkKSDigJQgcmVhZCB2aWFcbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yLmdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCwgdGhlIGZvdW5kYXRpb24gZm9yXG4gICAqIHNoYXJpbmcgYSB0cmFjZSB3aXRob3V0IGxlYWtpbmcgcmF3IFBJSSB0aHJvdWdoIGBzaGFyZWRTdGF0ZWAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlY29yZDogUmVjb3JkRnJhbWU7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgcG9saWN5IOKAlCB0aGUgZm91ciBkaWFscywgdGhlIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yIGZsYWdcbiAgICogKGBydW5Qb2xpY3kudHNgLCBGNSkuIEhlbGQgQlkgUkVGRVJFTkNFOiBvbmUgZnJvemVuIG9iamVjdCBwZXIgcnVuIChhbmRcbiAgICogcGVyIHJlc3VtZSksIHNoYXJlZCBieSBldmVyeSBmcmFtZSBvZiB0aGUgcnVuLCBhIHN1YmZsb3cncyBpbmNsdWRlZCDigJRcbiAgICoge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH0gcGFzcyB0aGUgcmVmZXJlbmNlXG4gICAqICh7QGxpbmsgaW5oZXJpdFJ1bn0pLCB0aGUgcnVudGltZSBpbnN0YWxscyBpdCBvbiBpdHMgcm9vdFxuICAgKiAoe0BsaW5rIHVzZVBvbGljeX0pLiBOZXZlciBlZGl0ZWQ7IGEgY2hhbmdlIGlzIGEgbmV3IG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgcG9saWN5OiBSdW5Qb2xpY3kgPSBERUZBVUxUX1JVTl9QT0xJQ1k7XG4gIC8qKiBUaGUgZW1pdHRpbmcgZnJhbWUncyBsb2dpY2FsIGxlZywgbmV2ZXIgdGhlIG11dGFibGUgZXhlY3V0b3IncyBjdXJyZW50IGxlZy4gKi9cbiAgcHJpdmF0ZSBlbWl0UnVuSWQ/OiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBuYXRpdmUgcm9vdC1sb2cgY29sbGVjdG9yOyBjb3BpZWQgdG8gc2FtZS1sb2cgZnJhbWVzLCBuZXZlciBjaGlsZCBydW50aW1lcy4gKi9cbiAgY2FwdHVyZT86IE5hdGl2ZUNhcHR1cmU7XG5cbiAgcHVibGljIHN0YWdlTmFtZSA9ICcnO1xuICAvKiogVW5pcXVlIHN0YWdlIGlkZW50aWZpZXIgZnJvbSB0aGUgYnVpbGRlciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBwdWJsaWMgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBTZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBzdGFnZSBleGVjdXRpb24uICovXG4gIHB1YmxpYyBydW50aW1lU3RhZ2VJZCA9ICcnO1xuICAvKipcbiAgICogRGVjbGFyZWQgdGFncyAoOS4yMS4wKSBmb3IgdGhlIHN0YWdlIHRoaXMgY29udGV4dCBpcyBleGVjdXRpbmcuIFNldCBieVxuICAgKiB0aGUgdHJhdmVyc2VyIGJlc2lkZSBgcnVudGltZVN0YWdlSWRgIChwZXItbm9kZSBpZGVudGl0eSDigJQgTk9UIGluaGVyaXRlZFxuICAgKiBieSBgY3JlYXRlTmV4dGAgLyBgY3JlYXRlQ2hpbGRgKSwgcmVjb3JkZWQgb24gdGhlIGZpcnN0IGJ1bmRsZVxuICAgKiBgY29tbWl0KClgIHdyaXRlcywgdGhlbiByZWxlYXNlZCBzbyBhIHJvdXRpbmUgc2Vjb25kIGNvbW1pdCBvbiB0aGUgc2FtZVxuICAgKiBjb250ZXh0IChhIGZvcmsgY2hpbGQncyBmYW4tb3V0IHJlcGVhdCwgYSBtb3VudCdzIGV4aXQgYnVuZGxlKSBjYXJyaWVzXG4gICAqIG5vbmUg4oCUIHRoZSBzYW1lIG9uY2UtcGVyLWV4ZWN1dGlvbiBsYXcgYF91bnRyYWNrZWRTb3VyY2VzYCBrZWVwcy5cbiAgICovXG4gIHB1YmxpYyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgcnVuIHRoaXMgZnJhbWUgYmVsb25ncyB0byDigJQgaXRzIGlkZW50aXR5IG9uIGV2ZXJ5IGV2ZW50LCBhbmQgdGhlIHJ1blxuICAgKiBuYW1lc3BhY2UgaXQgcmVhZHMgYW5kIHdyaXRlcyBpbiAoe0BsaW5rIHJ1bkFkZHJlc3N9KSwgcmVhZCBvbmNlLCB3aGVuIHRoZVxuICAgKiBmcmFtZSBpcyBidWlsdCAoQzMpLiBPbmx5IHtAbGluayB1c2VBZGRyZXNzT2Z9IG1vdmVzIHRoZSBhZGRyZXNzIGFmdGVyXG4gICAqIHRoYXQsIGFuZCBvbmx5IGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4gbmFtZXNwYWNlIHRoaXMgZnJhbWUgd3JpdGVzIGFuZCByZWFkcyBpbiB3aGVuIHRoYXQgaXMgbm90IGl0cyBvd25cbiAgICogYHJ1bklkYCDigJQgc2V0IG9uY2UsIGJlZm9yZSB0aGUgZnJhbWUncyBmaXJzdCB3cml0ZSwgYnlcbiAgICoge0BsaW5rIHVzZUFkZHJlc3NPZn0uIEl0cyBvbmUgdXNlciBpcyBhIHN1YmZsb3cgbW91bnQncyBtZXJnZS1iYWNrIChSMTMpOlxuICAgKiB0aGUgcmVjb3JkIG5hbWVzIHRoZSBtb3VudCwgdGhlIHZhbHVlcyBsYW5kIHdoZXJlIHRoZSBtb3VudCdzIHBhcmVudFxuICAgKiB3cml0ZXMuIEFic2VudCDihpIgYHJ1bklkYCwgc28gZXZlcnkgb3RoZXIgZnJhbWUgaXMgdW50b3VjaGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRyZXNzUnVuSWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBicmFuY2hJZD86IHN0cmluZztcbiAgcHVibGljIGlzRGVjaWRlcjogYm9vbGVhbjtcbiAgcHVibGljIGlzRm9yazogYm9vbGVhbjtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZyb20gYnVpbGRlciAoc2V0IGJ5IHRyYXZlcnNlciBiZWZvcmUgZXhlY3V0aW9uKS4gKi9cbiAgcHVibGljIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogU3ViZmxvdyBpZGVudGlmaWVyIChzZXQgYnkgdHJhdmVyc2VyIHdoZW4gdGhpcyBpcyBhIHN1YmZsb3cgZW50cnkgcG9pbnQpLiAqL1xuICBwdWJsaWMgc3ViZmxvd0lkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBwYXJlbnQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBuZXh0PzogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgY2hpbGRyZW4/OiBTdGFnZUNvbnRleHRbXTtcblxuICBwdWJsaWMgZGVidWc6IERpYWdub3N0aWNDb2xsZWN0b3IgPSBuZXcgRGlhZ25vc3RpY0NvbGxlY3RvcigoKSA9PiB0aGlzLnBvbGljeS5yZWRhY3Rpb24pO1xuXG4gIC8qKiBUcmFja3MgdXNlci1sZXZlbCB3cml0ZXMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcgYW5kIG9uQ29tbWl0XG4gICAqICDigJQgaW4gdGhlaXIgUkVUQUlORUQgZm9ybSAoY2xvbmVkIC8gc3VtbWFyaXNlZCAvIHJlZGFjdGVkKS4gRmlsbGVkIGZyb21cbiAgICogIHtAbGluayBfcGVuZGluZ1dyaXRlc30gYnkge0BsaW5rIG1hdGVyaWFsaXNlV3JpdGVzfSBhdCBjb21taXQuICovXG4gIHByaXZhdGUgX3N0YWdlV3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PiA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgd3JpdGVzIG9mIHRoZSBDVVJSRU5UIGV4ZWN1dGlvbiwgaGVsZCBieSByZWZlcmVuY2Ugd2l0aCB0aGUgdmVyZGljdFxuICAgKiB0aGV5IHdlcmUgc3RhZ2VkIHVuZGVyICg5LjIzLjApLiBBIGtleSB3cml0dGVuIGsgdGltZXMgaG9sZHMgaXRzIExBU1RcbiAgICogdmFsdWU7IHRoZSByZXRhaW5lZCBmb3JtICh0aGUgYHdyaXRlVHJhY2tpbmdgIGNsb25lIG9yIHN1bW1hcnksIHRoZVxuICAgKiByZWRhY3Rpb24gcGxhY2Vob2xkZXIgb3IgZmllbGQgc2NydWIpIGlzIHRha2VuIE9OQ0UgcGVyIGtleSBhdCBjb21taXQg4oCUXG4gICAqIHNlZSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9LiBTYW1lIGxhdyBhcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3NcbiAgICogcGF0Y2ggdHJlZXM6IHRoZSBjb3B5IHRoZSByZWNvcmQgbmVlZHMgaXMgcGFpZCBhdCB0aGUgYm91bmRhcnksIG5vdCBhdFxuICAgKiBldmVyeSB3cml0ZS4gTGF6aWx5IGFsbG9jYXRlZDsgYSBzdGFnZSB0aGF0IG5ldmVyIHdyaXRlcyBwYXlzIG5vdGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF9wZW5kaW5nV3JpdGVzPzogTWFwPFxuICAgIHN0cmluZyxcbiAgICB7IHZhbHVlOiB1bmtub3duOyB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0OyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9XG4gID47XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHJlYWRzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3LiAqL1xuICBwcml2YXRlIF9zdGFnZVJlYWRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgYF9zdGFnZVJlYWRzYCBrZXlzIHRoYXQgd2VyZSByZWFkIGF0IGEgTkVTVEVEIHBhdGggKGBnZXRWYWx1ZShwYXRoLFxuICAgKiBrZXkpYCB3aXRoIGEgbm9uLWVtcHR5IGBwYXRoYCkuIE9ubHkgdGhlIGVuZ2luZSByZWFkcyB0aGF0IHdheSDigJQgdGhlXG4gICAqIGZhY2FkZSByZWFkcyByb290cyDigJQgc28gdGhlc2UgYXJlIG5vdCB1c2VyIHJlYWRzIGFuZCB0aGUgYm9ycm93ZWQtcmVhZFxuICAgKiBndWFyZCBza2lwcyB0aGVtIGJ5IHRoaXMgbWFya2VyLCBuZXZlciBieSBndWVzc2luZyBmcm9tIGEgZG90IGluIHRoZSBrZXlcbiAgICogKGEgdXNlcidzIHRvcC1sZXZlbCBrZXkgbWF5IGl0c2VsZiBjb250YWluIG9uZSkuIExhemlseSBjcmVhdGVkOyB0aGVcbiAgICogZmFjYWRlIHBhdGggbmV2ZXIgYWxsb2NhdGVzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBfbmVzdGVkUmVhZHM/OiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogRGV2IG1vZGUgb25seTogdGhlIHJvb3Qga2V5cyB3aG9zZSBMQVNUIHRyYWNrZWQgcmVhZCB3YXMgc2VydmVkIGZyb21cbiAgICogY29tbWl0dGVkIHN0YXRlIOKAlCBiZWZvcmUgdGhpcyBzdGFnZSdzIGZpcnN0IHdyaXRlLCB3aGVuIG5vIHRyYW5zYWN0aW9uXG4gICAqIGJ1ZmZlciBleGlzdHMgeWV0LiBTdWNoIGEgcmVhZCBpcyB0aGUgY29tbWl0dGVkIG9iamVjdCBpdHNlbGYsIHNvIGFuXG4gICAqIGluLXBsYWNlIGVkaXQgb2YgaXQgbW92ZXMgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSB0b28gKGNvcHktb24td3JpdGUsXG4gICAqIDkuMjkuMCk7IHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufSBjaGVja3MgdGhlc2Uga2V5cyBldmVuIHdoZW4gdGhlXG4gICAqIHN0YWdlIHdyb3RlIHRoZW0uIE5ldmVyIGFsbG9jYXRlZCBvdXRzaWRlIGBlbmFibGVEZXZNb2RlKClgLlxuICAgKi9cbiAgcHJpdmF0ZSBfdmlld1JlYWRzPzogU2V0PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEhhcyB0aGlzIGZyYW1lIGNvbW1pdHRlZCBhdCBsZWFzdCBvbmNlPyBUaGUgYm9ycm93ZWQtcmVhZCBndWFyZCBydW5zIG9uXG4gICAqIHRoZSBGSVJTVCBjb21taXQgb25seSDigJQgc2VlIHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufS4gVGhlIGZyYW1lXG4gICAqIGl0c2VsZiBzdGF5cyByZS11c2FibGUgYWZ0ZXIgY29tbWl0ICgjMTNiKTogdGhlIGVuZ2luZSdzIGRvdWJsZS1jb21taXRcbiAgICogcGF0aHMgYW5kIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGJyYW5jaCBwYXJlbnQgcmVseSBvbiBpdC4gVGhlXG4gICAqIHVzZXItbGV2ZWwgcmVmdXNhbCBvZiBhIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIGxpdmVzIGF0IHRoZSBzY29wZVxuICAgKiB0aWVyIChgU2NvcGVGYWNhZGVgLCBvbmUgcGVyIHN0YWdlIGV4ZWN1dGlvbiksIG5vdCBoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBfY29tbWl0dGVkID0gZmFsc2U7XG5cbiAgLyoqIFRyYWNrZWQgcmVhZHMgb2YgYSBzZWxlY3RlZCB2YWx1ZSAoe0BsaW5rIHNlbGVjdGVkUmVhZHN9KS4gKi9cbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSZWFkcyA9IDA7XG4gIC8qKiBFYWNoIG9iamVjdCB0aGlzIGZyYW1lIHJlYWQgdW5kZXIgYSBzZWxlY3RlZCBuYW1lIOKGkiB0aGF0IHJlYWQncyB2ZXJkaWN0IChgc3RhZ2VXcml0ZWAgaGFuZHMgaXQgb24pLiAqL1xuICBwcml2YXRlIF9zZWxlY3RlZE9iamVjdHM/OiBXZWFrTWFwPG9iamVjdCwgUmVkYWN0aW9uVmVyZGljdD47XG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDIgaG9uZXN0eSBtYXJrZXJzIOKAlCB1bnRyYWNrZWQgcmVhZCBwYXRocyB1c2VkIGR1cmluZyBUSElTXG4gICAqIHN0YWdlJ3MgZXhlY3V0aW9uIChgJ2FyZ3MnYCAvIGAnZW52J2AgLyBgJ3NpbGVudCdgKS4gTWFya2VkIGJ5XG4gICAqIGBTY29wZUZhY2FkZWAsIHN1cmZhY2VkIG9uIHRoZSBzdGFnZSdzIENvbW1pdEJ1bmRsZSBhc1xuICAgKiBgdW50cmFja2VkU291cmNlc2AsIHRoZW4gUkVMRUFTRUQgd2l0aCB0aGUgc3RhZ2luZyBzdGF0ZSBhdCBjb21taXQgZW5kXG4gICAqIChzbyB0aGUgcm91dGluZSBkb3VibGUtY29tbWl0IHBhdGhzIOKAlCBmb3JrIGNoaWxkcmVuLCBzdWJmbG93IG1vdW50cyDigJRcbiAgICogcmVjb3JkIHRoZSBmaWVsZCBleGFjdGx5IG9uY2UsIG9uIHRoZSBmaXJzdCBjb21taXQpLiBMYXppbHkgYWxsb2NhdGVkOlxuICAgKiBzdGFnZXMgdGhhdCBuZXZlciB0b3VjaCBhbiB1bnRyYWNrZWQgcGF0aCBwYXkgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX3VudHJhY2tlZFNvdXJjZXM/OiBTZXQ8VW50cmFja2VkU291cmNlPjtcblxuICAvKipcbiAgICogVGhlIGF0dGVtcHRzIG9mIHRoaXMgZnJhbWUncyBleGVjdXRpb24gKDEwLjEpIOKAlCBpdHMgb3duIHVuZGVyIHRoZSBhdHRlbXB0IHJ1bm5lciwgYXBwZW5kZWQgYXMgZWFjaCBhdHRlbXB0IGVuZHNcbiAgICogKGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCksIGFuZCB0aG9zZSBvZiB0aGUgY2FsbHMgaXQgbWFkZSAoUDIsIHtAbGluayByZXBvcnRDYWxsQXR0ZW1wdH0pIOKAlCByZWFkXG4gICAqIGJ5IHtAbGluayBzbmFwc2hvdFNlbGZ9LiBBcHBlbmQtb25seVxuICAgKiBldmlkZW5jZSBsaWtlIGBkZWJ1Z2A6IE5PVCBjbGVhcmVkIGJ5IHtAbGluayBkaXNjYXJkU3RhZ2VkfSAodGhlIGVhcmxpZXIgYXR0ZW1wdHMgYXJlIHRoZSBwb2ludCkgYW5kIG5ldmVyXG4gICAqIHBhcnQgb2YgYSBjb21taXQgYnVuZGxlLiBMYXppbHkgYWxsb2NhdGVkOiBhIHN0YWdlIHdpdGhvdXQgYSBwb2xpY3kgcGF5cyBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfYXR0ZW1wdHM/OiBBdHRlbXB0UmVjb3JkW107XG4gIC8qKiBUaGUgYXR0ZW1wdCBzZXJpZXMgYXQgYSBnbGFuY2UsIHN0YW1wZWQgb25jZSB3aGVuIGl0IGVuZHMuICovXG4gIHByaXZhdGUgX2F0dGVtcHRTdW1tYXJ5PzogQXR0ZW1wdFN1bW1hcnk7XG4gIC8qKiBGYWN0cyBjb2xsZWN0ZWQgZm9yIHRoaXMgZXhlY3V0aW9uIG9ubHk7IHJldHJ5IGRpc2NhcmRzIGRlbGliZXJhdGVseSBrZWVwIHRoZW0uICovXG4gIHByaXZhdGUgX2F0dGVudGlvbj86IFN0YWdlQXR0ZW50aW9uO1xuICAvKipcbiAgICogVGhlIGF0dGVtcHQgbm93IHJ1bm5pbmcgKFAxYikg4oCUIHNldCBieSBgU3RhZ2VSdW5uZXJgIGJlZm9yZSB0aGUgc2NvcGUgaXMgYnVpbHQsIHNvIHRoZSBmYWNhZGUgY2FuIGhhbmQgaXQgb3V0XG4gICAqIChgc2NvcGUuJGF0dGVtcHQoKWApIGFuZCBmZW5jZSBpdHMgb3duIGF0dGVtcHQuIEFic2VudCBmb3IgYSBzdGFnZSB0aGUgYXR0ZW1wdCBydW5uZXIgZG9lcyBub3QgcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBfYXR0ZW1wdD86IEF0dGVtcHRDb250ZXh0O1xuICAvKiogVGhlIHJ1bidzIHNpZ25hbCwgZm9yIHRoZSBhdHRlbXB0IGEgc3RhZ2Ugb3V0c2lkZSB0aGUgcnVubmVyIHJlcG9ydHMgKGF0dGVtcHQgMSBvZiAxKS4gKi9cbiAgcHJpdmF0ZSBfcnVuU2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKiBFdmVyeSBhdHRlbXB0IHVwIHRvIHRoaXMgbnVtYmVyIGhhcyBFTkRFRCB3aXRob3V0IGFuIGFuc3dlciDigJQgaXRzIHNjb3BlIGlzIGZlbmNlZCAoMCA9IG5vbmUpLiAqL1xuICBwcml2YXRlIF9lbmRlZFRocm91Z2ggPSAwO1xuICAvKiogV3JpdGVzIGFuIGF0dGVtcHQgdHJpZWQgYWZ0ZXIgaXQgZW5kZWQg4oCUIGRyb3BwZWQgYXQgdGhlIHNjb3BlLCBrZXB0IGhlcmUgYXMgbmFtZXMuIExhemlseSBhbGxvY2F0ZWQuICovXG4gIHByaXZhdGUgX2xhdGVXcml0ZXM/OiBMYXRlV3JpdGVbXTtcbiAgLyoqXG4gICAqIFdoZXJlIGEgY2FsbCdzIGF0dGVtcHQgcmVjb3JkcyBhcmUgcmVwb3J0ZWQgKFAyKSDigJQgdGhlIGVuZ2luZSdzIGBvbkF0dGVtcHRgIGZvciB0aGlzIHN0YWdlIGV4ZWN1dGlvbiwgc2V0IGJ5XG4gICAqIGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCB3aXRoIHRoZSBzdGFnZSdzIG93biB0cmF2ZXJzYWwgY29udGV4dCAoYW5kIGl0cyBjb3JyZWxhdGlvbikuXG4gICAqL1xuICBwcml2YXRlIF9hdHRlbXB0UmVwb3J0ZXI/OiAocmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8gfCB1bmRlZmluZWQpID0+IHZvaWQ7XG5cbiAgLyoqIENhbGxzIG1hZGUgc28gZmFyLCBwZXIgc3RhZ2UgYXR0ZW1wdCDigJQgdGhlIGBrYCBvZiBhIGNhbGwncyBzZXJpZXMuIExhemlseSBhbGxvY2F0ZWQuICovXG4gIHByaXZhdGUgX2NhbGxPcmRpbmFscz86IE1hcDxudW1iZXIsIG51bWJlcj47XG4gIC8qKiBQZXIgc3RhZ2UgYXR0ZW1wdCwgdGhlIHNpZ25hbCBpdHMgY2FsbHMgc3RvcCBieSAoYGNhbGxzRW5kZWRTaWduYWxgKS4gTGF6aWx5IGFsbG9jYXRlZC4gKi9cbiAgcHJpdmF0ZSBfY2FsbHNFbmRlZD86IE1hcDxudW1iZXIsIEFib3J0Q29udHJvbGxlcj47XG4gIC8qKiBDYWxsIGFuZCBvYnNlcnZlZCByZWNvcmRzIGtlcHQgb24gdGhlIGZyYW1lLCBhbmQgdGhvc2UgcGFzdCB7QGxpbmsgTUFYX0NBTExfUkVDT1JEU30uICovXG4gIHByaXZhdGUgX2NhbGxSZWNvcmRzID0gMDtcbiAgcHJpdmF0ZSBfYXR0ZW1wdHNEcm9wcGVkID0gMDtcblxuICAvKiogT2JzZXJ2ZXIgY2FsbGVkIGFmdGVyIGNvbW1pdCgpIOKAlCB1c2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGZpcmUgU2NvcGVSZWNvcmRlci5vbkNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfY29tbWl0T2JzZXJ2ZXI/OiAoXG4gICAgbXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PixcbiAgKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJ1bklkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHN0YWdlSWQ6IHN0cmluZyxcbiAgICBzaGFyZWRNZW1vcnk6IFNoYXJlZE1lbW9yeSxcbiAgICBicmFuY2hJZD86IHN0cmluZyxcbiAgICBldmVudExvZz86IEV2ZW50TG9nLFxuICAgIGlzRGVjaWRlcj86IGJvb2xlYW4sXG4gICkge1xuICAgIHRoaXMucnVuSWQgPSBydW5JZDtcbiAgICB0aGlzLnN0YWdlTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5zdGFnZUlkID0gc3RhZ2VJZDtcbiAgICB0aGlzLnJlY29yZCA9IG5ldyBSZWNvcmRGcmFtZShzaGFyZWRNZW1vcnksIGV2ZW50TG9nLCBydW5BZGRyZXNzKHJ1bklkKSk7XG4gICAgdGhpcy5yZWNvcmQudXNlRW5jb2RpbmcodGhpcy5wb2xpY3kpO1xuICAgIHRoaXMuYnJhbmNoSWQgPSBicmFuY2hJZDtcbiAgICB0aGlzLmlzRGVjaWRlciA9ICEhaXNEZWNpZGVyO1xuICAgIHRoaXMuaXNGb3JrID0gZmFsc2U7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgU2hhcmVkTWVtb3J5IGluc3RhbmNlIChuZWVkZWQgYnkgc2NvcGUgbGF5ZXIpLiAqL1xuICBnZXRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQuc3RhdGU7XG4gIH1cblxuICAvKiogQGludGVybmFsIFN0YW1wZWQgYmVzaWRlIHJ1bnRpbWVTdGFnZUlkLCBiZWZvcmUgc2NvcGUgY29uc3RydWN0aW9uLiAqL1xuICBiaW5kRW1pdE9yaWdpbihydW5JZDogc3RyaW5nLCBkcmlsbFBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5lbWl0UnVuSWQgPSBkcmlsbFBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJ1bklkO1xuICAgIGlmIChkcmlsbFBhdGggIT09IHVuZGVmaW5lZCkgdGhpcy5yZWNvcmQubG9nPy5iaW5kQWRkcmVzcyhydW5JZCwgZHJpbGxQYXRoKTtcbiAgfVxuXG4gIC8qKiBDYXB0dXJlIGZyb20gdGhpcyBmcmFtZSdzIE9XTiBsb2cuIEEgbWFudWFsL3VuYWRkcmVzc2FibGUgZnJhbWUgc3RheXMgdW5rbm93bi4gKi9cbiAgY2FwdHVyZUVtaXRQb3NpdGlvbigpOiBFbWl0U291cmNlUG9zaXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmVtaXRSdW5JZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdGhpcy5yZWNvcmQubG9nPy5jYXB0dXJlUG9zaXRpb24odGhpcy5lbWl0UnVuSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYSBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IuIFN1YnNlcXVlbnQgYGNvbW1pdCgpYCBjYWxscyBhcHBseVxuICAgKiB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzIOKAlCB0aGUgb25lcyB0aGUgbG9nIHJlY29yZHMg4oCUIHRvXG4gICAqIHRoaXMgbWlycm9yLCBiZXNpZGUgdGhlIHJhdyBwYXRjaGVzIG9uIHRoZSBoZWFwIChgcmVjb3JkQ29tbWl0YCkuXG4gICAqIENoaWxkIC8gbmV4dCBjb250ZXh0cyBpbmhlcml0IHRoZSBtaXJyb3IgdmlhIGBjcmVhdGVOZXh0YCAvIGBjcmVhdGVDaGlsZGAuXG4gICAqXG4gICAqIENhbGxlZCBvbiBhIHJ1bnRpbWUncyByb290IGZyYW1lIGJ5IGBFeGVjdXRpb25SdW50aW1lYCB3aGVuIHRoZSBydW4ncyBwb2xpY3kga2VlcHMgYSBtaXJyb3IuXG4gICAqL1xuICB1c2VSZWRhY3RlZE1pcnJvcihtaXJyb3I6IFNoYXJlZE1lbW9yeSk6IHZvaWQge1xuICAgIHRoaXMucmVjb3JkLnVzZU1pcnJvcihtaXJyb3IpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHJlZGFjdGVkIG1pcnJvciBpZiBpbnN0YWxsZWQsIGVsc2UgdW5kZWZpbmVkLiAqL1xuICBnZXRSZWRhY3RlZFNoYXJlZE1lbW9yeSgpOiBTaGFyZWRNZW1vcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5taXJyb3I7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCB0aGUgcnVuJ3MgcG9saWN5IChgcnVuUG9saWN5LnRzYCkgb24gdGhpcyBmcmFtZSDigJQgY2FsbGVkIG9uIGFcbiAgICogcnVudGltZSdzIHJvb3QgYnkgYEV4ZWN1dGlvblJ1bnRpbWVgIChhdCBjb25zdHJ1Y3Rpb24sIGFuZCBieVxuICAgKiBgRXhlY3V0aW9uUnVudGltZS51c2VQb2xpY3lgIG9uIGEgc2FtZS1leGVjdXRvciByZXN1bWUpLiBEZXNjZW5kYW50cyBnZXRcbiAgICogdGhlIHNhbWUgcmVmZXJlbmNlIHRocm91Z2gge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH07IGFcbiAgICogc3ViZmxvdydzIHJ1bnRpbWUgaXMgY29uc3RydWN0ZWQgd2l0aCBpdCwgc28gaXRzIHNlZWQgZnJhbWUgYW5kIGV2ZXJ5XG4gICAqIGZyYW1lIGFmdGVyIGNvbW1pdCB1bmRlciB0aGUgcnVuJ3MgZGlhbHMgdG9vLlxuICAgKi9cbiAgdXNlUG9saWN5KHBvbGljeTogUnVuUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5hZG9wdFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgLyoqIFRoZSBydW4ncyBwb2xpY3kgdGhpcyBmcmFtZSByZXRhaW5zLCBlbmNvZGVzIGFuZCBzY3J1YnMgdW5kZXIuICovXG4gIGdldFBvbGljeSgpOiBSdW5Qb2xpY3kge1xuICAgIHJldHVybiB0aGlzLnBvbGljeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIGEgcmVkYWN0aW9uIHJ1bGUg4oCUIHRoZSBPTkUgb3duZXIgb2YgXCJ3aGF0IGRvZXMgdGhlIHBvbGljeSBzYXlcbiAgICogYWJvdXQgdGhpcyBwYXRoXCIgKGBtZW1vcnkvcmVkYWN0aW9uLnRzYCkg4oCUIGFzIGEgTkVXIHBvbGljeSBmb3IgdGhpcyBmcmFtZVxuICAgKiAodGhlIHNoYXJlZCBvbmUgaXMgbmV2ZXIgZWRpdGVkKS4gVW5kZXIgYW4gZXhlY3V0b3IgdGhlIHJ1bGUgYXJyaXZlc1xuICAgKiB3aXRoIHRoZSBydW4ncyBwb2xpY3k7IHRoaXMgZG9vciBpcyBmb3IgYSBgU2NvcGVGYWNhZGVgIG9uIGEgYmFyZSBmcmFtZVxuICAgKiAodW5pdCB0ZXN0cywgaGFuZC1idWlsdCBzY29wZXMpLCB3aGljaCBicmluZ3MgaXRzIG93biBydWxlLiBFdmVyeSBzdGFnZWRcbiAgICogd3JpdGUgYW5kIGV2ZXJ5IHRyYWNrZWQgcmVhZCBhc2tzIGl0LCBzbyBhIHdyaXRlIHRoYXQgbmV2ZXIgcGFzc2VzIGFcbiAgICogZmFjYWRlIOKAlCBhIHN1YmZsb3cgc2VlZCwgYW4gYG91dHB1dE1hcHBlcmAgbWVyZ2UtYmFjaywgYSByZXN1bWUgcmUtc2VlZCDigJRcbiAgICogaXMgcmV0YWluZWQgdW5kZXIgdGhlIHNhbWUgdmVyZGljdCBhcyBhIGZhY2FkZSB3cml0ZS4gQWJzZW50OiBldmVyeVxuICAgKiB2ZXJkaWN0IGlzIGAnY2xlYXInYCB1bmxlc3MgdGhlIGNhbGxlciBwYXNzZWQgYW4gZXhwbGljaXQgZmxhZy5cbiAgICovXG4gIHVzZVJlZGFjdGlvblJ1bGUocnVsZTogUmVkYWN0aW9uUnVsZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvbGljeS5yZWRhY3Rpb24gIT09IHJ1bGUpIHRoaXMuYWRvcHRQb2xpY3kod2l0aFJlZGFjdGlvbih0aGlzLnBvbGljeSwgcnVsZSkpO1xuICB9XG5cbiAgLyoqIFRoZSBpbnN0YWxsZWQgcmVkYWN0aW9uIHJ1bGUsIGlmIGFueSAodGhlIGZhY2FkZSdzIGxvb2t1cCkuICovXG4gIGdldFJlZGFjdGlvblJ1bGUoKTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5LnJlZGFjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIHRoZSBydW4gZnJvbSBgZnJvbWA6IHRoZSBwb2xpY3kgKGJ5IHJlZmVyZW5jZSkgYW5kIHRoZSBydW4ncyBtaXJyb3JcbiAgICogc3RvcmUuIFRoZSBPTkUgaW5oZXJpdGFuY2Ugc3RlcCDigJQge0BsaW5rIGNyZWF0ZU5leHR9IGFuZFxuICAgKiB7QGxpbmsgY3JlYXRlQ2hpbGR9IGJvdGggY2FsbCBpdCwgYW5kIGl0IG5hbWVzIG5vIGRpYWwuXG4gICAqL1xuICBwcml2YXRlIGluaGVyaXRSdW4oZnJvbTogU3RhZ2VDb250ZXh0KTogdm9pZCB7XG4gICAgdGhpcy5hZG9wdFBvbGljeShmcm9tLnBvbGljeSk7XG4gICAgdGhpcy5jYXB0dXJlID0gZnJvbS5jYXB0dXJlO1xuICAgIHRoaXMucmVjb3JkLnVzZU1pcnJvcihmcm9tLnJlY29yZC5taXJyb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBPTkUgcGxhY2UgdGhpcyBmcmFtZSdzIHBvbGljeSBjaGFuZ2VzOiB0aGUgZnJhbWUgaG9sZHMgaXQsIGFuZCBpdHNcbiAgICogcmVjb3JkIGZyYW1lIGVuY29kZXMgdW5kZXIgdGhlIHNhbWUgcmVmZXJlbmNlIChgY29tbWl0VmFsdWVzYCxcbiAgICogYHdyaXRlUHJvdmVuYW5jZWAg4oCUIGBSZWNvcmRGcmFtZSDCtyB1c2VFbmNvZGluZ2ApLCBzbyB0aGUgdHdvIG5ldmVyIGRpZmZlci5cbiAgICovXG4gIHByaXZhdGUgYWRvcHRQb2xpY3kocG9saWN5OiBSdW5Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICB0aGlzLnJlY29yZC51c2VFbmNvZGluZyhwb2xpY3kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIHRyYWNrZWQgdXNlci1sZXZlbCB3cml0ZSwgcG9saWN5LWdhdGVkICgjMTNjLUEpIOKAlCB0aGUgc2luZ2xlXG4gICAqIGJvb2trZWVwaW5nIHBhdGggZm9yIHtAbGluayBzZXRPYmplY3R9IGFuZCB7QGxpbmsgdXBkYXRlT2JqZWN0fS4gSG9sZHNcbiAgICogdGhlIFJFRkVSRU5DRSBhbmQgdGhlIHZlcmRpY3QgKDkuMjMuMCk7IHRoZSByZXRhaW5lZCBmb3JtIGlzIHRha2VuIGF0XG4gICAqIGNvbW1pdCBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9LCBvbmNlIHBlciBrZXkuXG4gICAqXG4gICAqIFJlZGFjdGlvbiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGRpYWwgaW4gRVZFUlkgbW9kZTogYSByZWRhY3RlZFxuICAgKiB3cml0ZSBzdG9yZXMgdGhlIGAnW1JFREFDVEVEXSdgIHBsYWNlaG9sZGVyIHVuZGVyIGAnZnVsbCdgIEFORFxuICAgKiBgJ3N1bW1hcnknYCAoYSBzdW1tYXJ5IG1hcmtlciB3b3VsZCBsZWFrIHRoZSB2YWx1ZSdzIHByZXZpZXcvc2l6ZSksXG4gICAqIGFuZCBzdG9yZXMgbm90aGluZyB1bmRlciBgJ29mZidgIChlbnRyeSBza2lwcGVkIGVudGlyZWx5IOKAlCBub3RoaW5nIHRvXG4gICAqIGxlYWspLiBBIGZpZWxkLWxldmVsIHZlcmRpY3Qgc2NydWJzIGEgY2xvbmUgQkVGT1JFIHRoZSBkaWFsIHNlZXMgaXQsIHNvXG4gICAqIGEgc3VtbWFyeSBwcmV2aWV3IGNhbiBuZXZlciBzaG93IHRoZSBzZWNyZXQgZWl0aGVyLiBUaGUgdmVyZGljdCBpcyB0aGVcbiAgICogb25lIGBzdGFnZVdyaXRlYCBkZWNpZGVkIEJFRk9SRSBzdGFnaW5nLCBjYXJyaWVkIHRvIGNvbW1pdCB3aXRoIHRoZVxuICAgKiB2YWx1ZS4gVGhlIHN0YWdlZCB3cml0ZSBpdHNlbGYgaXMgdW5hZmZlY3RlZCDigJQgcmVkYWN0aW9uIG9mIHRoZVxuICAgKiBjb21taXR0ZWQgcGF5bG9hZCBpcyB0aGUgcmVjb3JkIGZyYW1lJ3Mgc2NydWIgb2YgdGhhdCB3cml0ZVxuICAgKiAoYFJlY29yZEZyYW1lIMK3IHdyaXRlYCwgdGhlbiBgc2NydWIudHNgIGF0IGNvbW1pdCkuXG4gICAqL1xuICBwcml2YXRlIHRyYWNrV3JpdGUoXG4gICAgdXNlcktleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gICAgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScsXG4gICkge1xuICAgIGlmICh0aGlzLnBvbGljeS53cml0ZVRyYWNraW5nID09PSAnb2ZmJykgcmV0dXJuO1xuICAgICh0aGlzLl9wZW5kaW5nV3JpdGVzID8/PSBuZXcgTWFwKCkpLnNldCh1c2VyS2V5LCB7IHZhbHVlLCB2ZXJkaWN0LCBvcGVyYXRpb24gfSk7XG4gIH1cblxuICAvKipcbiAgICogYF9zdGFnZVdyaXRlc2Agd2l0aCBldmVyeSBwZW5kaW5nIHdyaXRlIGZvbGRlZCBpbiBhcyBpdHMgcmV0YWluZWQgZm9ybVxuICAgKiDigJQgdGhlIHJlY29yZCBhIHJlYWRlciBzZWVzLiBDb25zdW1lcyBub3RoaW5nOiBhIG1pZC1ydW4gc25hcHNob3QgcmVhZHNcbiAgICogdGhlIHdyaXRlcyBzbyBmYXIsIGFuZCBjb21taXQgc3RpbGwgbWF0ZXJpYWxpc2VzIHRoZSBmaW5hbCB2YWx1ZXMuXG4gICAqIFJldHVybnMgYF9zdGFnZVdyaXRlc2AgaXRzZWxmIHdoZW4gbm90aGluZyBpcyBwZW5kaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZXRhaW5lZFdyaXRlcygpOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PiB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nV3JpdGVzKSByZXR1cm4gdGhpcy5fc3RhZ2VXcml0ZXM7XG4gICAgY29uc3Qgb3V0ID0geyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgd10gb2YgdGhpcy5fcGVuZGluZ1dyaXRlcykge1xuICAgICAgb3V0W2tleV0gPSB7XG4gICAgICAgIHZhbHVlOiB0aGlzLnJldGFpbmVkRm9ybSh3LnZlcmRpY3QsIHcudmFsdWUsIHRoaXMucG9saWN5LndyaXRlVHJhY2tpbmcsIHN1bW1hcml6ZVdyaXRlVmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246IHcub3BlcmF0aW9uLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIHRoZSByZXRhaW5lZCBmb3JtIG9mIGV2ZXJ5IHBlbmRpbmcgd3JpdGUg4oCUIE9OQ0UgcGVyIGtleSwgZnJvbSB0aGVcbiAgICogdmFsdWUgYXMgaXQgc3RhbmRzIGF0IGNvbW1pdCAoOS4yMy4wKSDigJQgYW5kIHJlbGVhc2UgdGhlIHJlZmVyZW5jZXMuIFRoZVxuICAgKiBmaXJzdCB0aGluZyBgY29tbWl0KClgIGRvZXMsIHNvIHRoZSBib3Jyb3dlZC1tdXRhdGlvbiBndWFyZCBhbmQgdGhlXG4gICAqIGNvbW1pdCBvYnNlcnZlciBzZWUgdGhlIGZpbmlzaGVkIHJlY29yZC5cbiAgICovXG4gIHByaXZhdGUgbWF0ZXJpYWxpc2VXcml0ZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nV3JpdGVzKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3N0YWdlV3JpdGVzID0gdGhpcy5yZXRhaW5lZFdyaXRlcygpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZWxlYXNlZCBldmVuIHdoZW4gYSByZXRhaW5lZCBmb3JtIGNhbm5vdCBiZSB0YWtlbiDigJQgYW4gdW5jbG9uZWFibGVcbiAgICAgIC8vIHZhbHVlIChhIGZ1bmN0aW9uLCBhIFByb3h5KSBpcyBhIGNvbnRyYWN0IHZpb2xhdGlvbiAoXCJzdGF0ZSB2YWx1ZXNcbiAgICAgIC8vIG11c3Qgc3Vydml2ZSBzdHJ1Y3R1cmVkQ2xvbmVcIikgdGhhdCBub3cgc3VyZmFjZXMgSEVSRSwgYXQgY29tbWl0LFxuICAgICAgLy8gYW5kIGZhaWxzIHRoZSBydW4gbG91ZGx5OyBhIGxhdGVyIHNuYXBzaG90IG9mIHRoZSBmYWlsZWQgcnVuIG11c3RcbiAgICAgIC8vIG5vdCB0aHJvdyB0aGUgc2FtZSBlcnJvciBhZ2Fpbi5cbiAgICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIG9mIGEgdmFsdWUgdGhlIGVuZ2luZSBSRVRBSU5TIChyZWFkcyBhbmQgd3JpdGVzIHJldGVudGlvbik6XG4gICAqIHRoZSBwbGFjZWhvbGRlciBiZWF0cyBldmVyeSBkaWFsOyBhIGZpZWxkLWxldmVsIHNjcnViIGhhcHBlbnMgYmVmb3JlIHRoZVxuICAgKiBkaWFsIHNlZXMgdGhlIHZhbHVlOyBhIGNsZWFyIHZhbHVlIGlzIHN1bW1hcml6ZWQgb3IgY2xvbmVkIGFzIHRoZSBkaWFsXG4gICAqIHNheXMuIENhbGxlcnMgaGFuZGxlIGB1bmRlZmluZWRgIGJlZm9yZSBhc2tpbmcuXG4gICAqL1xuICBwcml2YXRlIHJldGFpbmVkRm9ybShcbiAgICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIG1vZGU6IFJlYWRUcmFja2luZ01vZGUgfCBXcml0ZVRyYWNraW5nTW9kZSxcbiAgICBzdW1tYXJpemU6ICh2YWx1ZTogdW5rbm93bikgPT4gdW5rbm93bixcbiAgKTogdW5rbm93biB7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIFNDT1BFX1BMQUNFSE9MREVSO1xuICAgIGNvbnN0IHNjcnViYmVkID0gdmVyZGljdC5raW5kID09PSAnZmllbGRzJyA/IFJlZGFjdGlvblJ1bGUuc2NydWJGaWVsZHModmFsdWUsIHZlcmRpY3QucGF0aHMpIDogdW5kZWZpbmVkO1xuICAgIGlmIChtb2RlID09PSAnc3VtbWFyeScpIHJldHVybiBzdW1tYXJpemUoc2NydWJiZWQgPz8gdmFsdWUpO1xuICAgIHJldHVybiBzY3J1YmJlZCA/PyBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBydWxlIHdpdGggc29tZXRoaW5nIHRvIHNheSDigJQgYHVuZGVmaW5lZGAgb24gdGhlIG5vLXBvbGljeSBwYXRoIChub1xuICAgKiBydWxlIGluc3RhbGxlZCwgb3IgYSBydWxlIHdpdGggbm8gcG9saWN5IGVudHJpZXMgYW5kIG5vIG1hcmtlZCBrZXlzKSwgc29cbiAgICogYSB0cmFja2VkIHJlYWQgb3IgYSBzdGFnZWQgd3JpdGUgdGhlcmUgcGF5cyBubyB2ZXJkaWN0IGNhbGwgYW5kIG5vIHBhdGhcbiAgICogYWxsb2NhdGlvbi4gVGhlIGRlZmF1bHQgcnVuIGlzIGJ5dGUtaWRlbnRpY2FsIEFORCBjb3N0LWlkZW50aWNhbC5cbiAgICovXG4gIHByaXZhdGUgYWN0aXZlUnVsZSgpOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBydWxlID0gdGhpcy5wb2xpY3kucmVkYWN0aW9uO1xuICAgIHJldHVybiBydWxlICE9PSB1bmRlZmluZWQgJiYgIXJ1bGUuaXNJbmVydCgpID8gcnVsZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUSEUgT05FIEZVTk5FTCBldmVyeSBzdGFnZWQgd3JpdGUgcGFzc2VzIHRocm91Z2gg4oCUIGZhY2FkZSB3cml0ZXMgQU5EXG4gICAqIHRoZSBwYXRocyB0aGF0IGJ5cGFzcyB0aGUgZmFjYWRlIChzdWJmbG93IHNlZWQsIGBvdXRwdXRNYXBwZXJgXG4gICAqIG1lcmdlLWJhY2ssIHJlc3VtZSByZS1zZWVkKS4gVHdvIG93bmVycyAoQzQpOiB0aGUgcnVuJ3MgcnVsZSBERUNJREVTLFxuICAgKiB0aGUgcmVjb3JkIGZyYW1lIFdSSVRFUyB0aGUgdmVyZGljdCdzIGJ5dGVzLCBpbiBmb3VyIHN0ZXBzXG4gICAqIChgcmVkYWN0aW9uLnRzYCwgXCJUaGUgd3JpdGUgZGVjaXNpb25cIik6XG4gICAqICAgMS4gdGhlIHZlcmRpY3Qg4oCUIGBkZWNpZGVXcml0ZWAsIHVuZGVyIHRoZSBydWxlIGFjdGl2ZSBhcyB0aGUgd3JpdGUgYmVnaW5zO1xuICAgKiAgIDIuIGlkZW50aXR5IGluaGVyaXRhbmNlIOKAlCBgaW5oZXJpdEJ5SWRlbnRpdHlgLCBhZ2FpbnN0IHRoaXMgZnJhbWUnc1xuICAgKiAgICAgIHNlbGVjdGVkIHJlYWRzIGFzIHRoZXkgc3RhbmQgYWZ0ZXIgc3RlcCAxO1xuICAgKiAgIDMuIHRoZSBieXRlcyDigJQgYFJlY29yZEZyYW1lIMK3IHdyaXRlYCwgdGhlIG9wIGFuZCBpdHMgc2NydWIgKHRoZSB3aG9sZVxuICAgKiAgICAgIHZhbHVlLCBvciB0aGUgZmllbGRzIGluc2lkZSBpdCk7XG4gICAqICAgNC4gdGhlIG1hcmtzIOKAlCBgbWFya1N0YWdlZFdyaXRlYCwgb25seSBvbmNlIHRoZSB3cml0ZSBzdGFnZWQsIHNvIGFcbiAgICogICAgICB3cml0ZSB0aGF0IGZhaWxzIHRvIHN0YWdlIG1hcmtzIG5vdGhpbmcuXG4gICAqIEVhY2ggc3RlcCByZWFkcyB0aGUgcnVsZSAoYW5kIHRoZSBzZWxlY3RlZCByZWFkcykgd2hlbiBpdCBhY3RzLCBhcyB0aGlzXG4gICAqIGZ1bm5lbCBhbHdheXMgZGlkLiBSZXR1cm5zIHRoZSB2ZXJkaWN0IHNvIHRoZSBjYWxsZXIgcmV0YWlucyBhbmQgcmVwb3J0c1xuICAgKiB1bmRlciB0aGUgc2FtZSBkZWNpc2lvbi5cbiAgICovXG4gIHByaXZhdGUgc3RhZ2VXcml0ZShcbiAgICBuc1BhdGg6IHN0cmluZ1tdLFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIGV4cGxpY2l0OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICAgIHZlcmI6IFdyaXRlVmVyYixcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgYWN0aXZlID0gdGhpcy5hY3RpdmVSdWxlKCk7XG4gICAgaWYgKGFjdGl2ZSA9PT0gdW5kZWZpbmVkICYmICFleHBsaWNpdCkge1xuICAgICAgLy8gVGhlIG5vLXBvbGljeSBmYXN0IHBhdGgsIHRoZSBzYW1lIGZvdXIgc3RlcHMgd2l0aCBub3RoaW5nIHRvIGRvOiBubyBydWxlIHdpdGggYW55dGhpbmcgdG8gc2F5XG4gICAgICAvLyBhbmQgbm8gZmxhZyBpcyBjbGVhciAoc3RlcCAxKSwgbm90aGluZyB0byBpbmhlcml0IHdpdGhvdXQgYSBydWxlIChzdGVwIDIpLCBubyBzY3J1YiAoc3RlcCAzKSxcbiAgICAgIC8vIGFuZCBub3RoaW5nIHRvIG1hcmsg4oCUIGEgY2xlYXIgdmVyZGljdCBtYXJrcyBub3RoaW5nLCBhbmQgYSBkZWxldGUgdW5tYXJrcyBvbmx5IG9uIHRoZSBydWxlXG4gICAgICAvLyBhY3RpdmUgYXMgaXQgYmVnYW4gKHN0ZXAgNCkuIFRoZSBkZWZhdWx0IHJ1biBwYXlzIHRoZSByZWNvcmQncyB3cml0ZSBhbmQgbm90aGluZyBlbHNlLlxuICAgICAgdGhpcy5yZWNvcmQud3JpdGUobnNQYXRoLCB2YWx1ZSwgdmVyYik7XG4gICAgICByZXR1cm4gQ0xFQVI7XG4gICAgfVxuICAgIGNvbnN0IGFza2VkID0gZGVjaWRlV3JpdGUoYWN0aXZlLCBwYXRoLCBrZXksIGV4cGxpY2l0KTtcbiAgICBjb25zdCB2ZXJkaWN0ID0gaW5oZXJpdEJ5SWRlbnRpdHkoYWN0aXZlLCBhc2tlZCwgdGhpcy5fc2VsZWN0ZWRPYmplY3RzLCBwYXRoLCBrZXksIHZhbHVlKTtcbiAgICB0aGlzLnJlY29yZC53cml0ZShuc1BhdGgsIHZhbHVlLCB2ZXJiLCBzY3J1Yk9mKHZlcmRpY3QpKTtcbiAgICBtYXJrU3RhZ2VkV3JpdGUoYWN0aXZlLCB0aGlzLnBvbGljeS5yZWRhY3Rpb24sIHZlcmRpY3QsIHBhdGgsIGtleSwgdmVyYik7XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgYW5kIHJlYWQgYXQgQU5PVEhFUiBmcmFtZSdzIGFkZHJlc3MgKGl0cyBydW4gbmFtZXNwYWNlKSB3aGlsZSB0aGlzXG4gICAqIGZyYW1lIGtlZXBzIGl0cyBvd24gaWRlbnRpdHkgb24gdGhlIHJlY29yZCDigJQgYHN0YWdlYCwgYHN0YWdlSWRgLFxuICAgKiBgcnVudGltZVN0YWdlSWRgLCB0YWdzLiBBIHN1YmZsb3cgbW91bnQncyBtZXJnZS1iYWNrIGlzIHRoZSBvbmUgY2FsbGVyXG4gICAqIChgU3ViZmxvd0V4ZWN1dG9yIMK3IGV4ZWN1dGVTdWJmbG93YCwgUjEzKTogdGhlIG1vdW50IGZyYW1lIG9mIGEgYnJhbmNoIG9yXG4gICAqIGZvcmsgY2hpbGQgbGFuZHMgaXRzIHZhbHVlcyB3aGVyZSBpdHMgcGFyZW50IHdyaXRlcywgYXMgYmVmb3JlLCBhbmQgaXRzXG4gICAqIGJ1bmRsZSBub3cgbmFtZXMgdGhlIG1vdW50IGluc3RlYWQgb2YgdGhlIHN0YWdlIGJlZm9yZSBpdC4gUmVmdXNlZCBvbmNlXG4gICAqIHRoZSBmcmFtZSBoYXMgc3RhZ2VkIGFueXRoaW5nIOKAlCBpdHMgYnVmZmVyJ3MgYWRkcmVzcyBpcyBmaXhlZCB0aGVuLiBUaGVcbiAgICogZGVjaXNpb24gaXMgdGhlIGVuZ2luZSdzIChuYW1lc3BhY2UgaWRzLCBhcyBzaW5jZSBSMTMpOyB0aGUgcmVjb3JkIGZyYW1lXG4gICAqIHRha2VzIHRoZSBhZGRyZXNzIGl0IGNvbWVzIHRvIChgUmVjb3JkRnJhbWUgwrcgdXNlQWRkcmVzc2ApLlxuICAgKi9cbiAgdXNlQWRkcmVzc09mKGZyYW1lOiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWNvcmQuaGFzU3RhZ2VkICYmIGZyYW1lLm5hbWVzcGFjZUlkICE9PSB0aGlzLm5hbWVzcGFjZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbZm9vdHByaW50XSBTdGFnZUNvbnRleHQudXNlQWRkcmVzc09mOiAnJHt0aGlzLnN0YWdlSWR9JyBoYXMgYWxyZWFkeSBzdGFnZWQgd3JpdGVzIGF0IGl0cyBvd24gYWRkcmVzcy5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hZGRyZXNzUnVuSWQgPSBmcmFtZS5uYW1lc3BhY2VJZDtcbiAgICB0aGlzLnJlY29yZC51c2VBZGRyZXNzKHJ1bkFkZHJlc3ModGhpcy5uYW1lc3BhY2VJZCkpO1xuICB9XG5cbiAgLyoqIFRoZSBydW4gbmFtZXNwYWNlIHdyaXRlcyBhbmQgcmVhZHMgZ28gdG86IHtAbGluayBhZGRyZXNzUnVuSWR9LCBlbHNlIGBydW5JZGAuICovXG4gIHByaXZhdGUgZ2V0IG5hbWVzcGFjZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkcmVzc1J1bklkID8/IHRoaXMucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgV3JpdGUgb3BlcmF0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwYXRjaChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3QgPSBmYWxzZSk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIHJldHVybiB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gIH1cblxuICBzZXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2gocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBtZXJnZShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdtZXJnZScpO1xuICB9XG5cbiAgc2V0T2JqZWN0KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uT3ZlcnJpZGU/OiAnc2V0JyB8ICdkZWxldGUnLFxuICApOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICAvLyBFeHBsaWNpdCBkZWxldGlvbiAoU2NvcGVGYWNhZGUuZGVsZXRlVmFsdWUpIHN0YWdlcyBhIGRpc3RpbmN0IG9wIHNvXG4gICAgLy8gZGVsdGEtbW9kZSBjb21taXRzICgjMTNjLUIpIGNhbiBlbWl0IGEgcmVhbCBgZGVsZXRlYCB0cmFjZSBlbnRyeS5cbiAgICAvLyBVbmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSB0aGUgYnVmZmVyIGNvbW1pdHMgaXQgYXMgYVxuICAgIC8vIHNldC1vZi11bmRlZmluZWQg4oCUIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBoaXN0b3JpY2FsIGZsYXR0ZW5pbmcuXG4gICAgY29uc3QgdmVyZGljdCA9XG4gICAgICBvcGVyYXRpb25PdmVycmlkZSA9PT0gJ2RlbGV0ZSdcbiAgICAgICAgPyB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB1bmRlZmluZWQsIHNob3VsZFJlZGFjdCwgJ2RlbGV0ZScpXG4gICAgICAgIDogdGhpcy5zdGFnZVdyaXRlKHRoaXMucmVjb3JkLmF0KHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ3NldCcpO1xuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgd3JpdGUgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyArIG9uQ29tbWl0IOKAlFxuICAgIC8vIHBvbGljeS1nYXRlZCAoIzEzYy1BKSwgc2VlIHRyYWNrV3JpdGUuXG4gICAgdGhpcy50cmFja1dyaXRlKHVzZXJLZXlPZihwYXRoLCBrZXkpLCB2YWx1ZSwgdmVyZGljdCwgb3BlcmF0aW9uT3ZlcnJpZGUgPz8gJ3NldCcpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdGFnZ2VkID0gZGVzY3JpcHRpb24uc3RhcnRzV2l0aCgnWycpID8gZGVzY3JpcHRpb24gOiBgW1dSSVRFXSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIHRhZ2dlZCk7XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgdXBkYXRlT2JqZWN0KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLm1lcmdlKHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCAndXBkYXRlJyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICBzZXRSb290KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2goW10sIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIFJvb3QtbGV2ZWwgKHVuLW5hbWVzcGFjZWQpIHdyaXRlIOKAlCB0aGUgc3ViZmxvdyBzZWVkIGFuZCBtZXJnZS1iYWNrIHBhdGguICovXG4gIHNldEdsb2JhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVHbG9iYWxDb250ZXh0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuc3RhZ2VXcml0ZShba2V5XSwgW10sIGtleSwgdmFsdWUsIHVuZGVmaW5lZCwgJ3NldCcpO1xuICB9XG5cbiAgYXBwZW5kVG9BcnJheShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIGl0ZW1zOiB1bmtub3duW10sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID0gQXJyYXkuaXNBcnJheShleGlzdGluZykgPyBbLi4uZXhpc3RpbmcsIC4uLml0ZW1zXSA6IFsuLi5pdGVtc107XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBtZXJnZU9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID1cbiAgICAgIGV4aXN0aW5nICYmIHR5cGVvZiBleGlzdGluZyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZXhpc3RpbmcpXG4gICAgICAgID8geyAuLi4oZXhpc3RpbmcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLCAuLi5vYmogfVxuICAgICAgICA6IHsgLi4ub2JqIH07XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZCBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBUcmFja2VkIHJlYWQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBCT1JST1dFRCDigJQgc2VlIHRoZSBjb250cmFjdCBvblxuICAgKiBgU2NvcGVGYWNhZGUuZ2V0VmFsdWVgLiBSZWFkLXRyYWNraW5nIGNvc3QgaXMgcG9saWN5LWdhdGVkICgjMTQpOlxuICAgKiBgJ2Z1bGwnYCBjbG9uZXMgdGhlIHZhbHVlIGludG8gYF9zdGFnZVJlYWRzYCAoaGlzdG9yaWNhbCBkZWZhdWx0KSxcbiAgICogYCdzdW1tYXJ5J2AgcmVjb3JkcyBhIGNoZWFwIG1hcmtlciwgYCdvZmYnYCByZWNvcmRzIG5vdGhpbmcuXG4gICAqL1xuICBnZXRWYWx1ZShwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkUmV0YWluZWRWYWx1ZShwYXRoLCBrZXksIGRlc2NyaXB0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5jYXB0dXJlPy5saW1pdCgncmVhZC1yZXRlbnRpb24tZmFpbGVkJyk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlYWRSZXRhaW5lZFZhbHVlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgLy8gVGhlIHJlY29yZCBmcmFtZSBzZXJ2ZXMgdGhlIHZhbHVlICh0d28gdGllcnMpIGFuZCBrZWVwcyB0aGUgcGVyLXdyaXRlXG4gICAgLy8gcHJvdmVuYW5jZSByZWdpc3RyeSAoI1AxKSDigJQga2V5IHN0cmluZ3Mgb25seSwgaW5kZXBlbmRlbnQgb2YgdGhlXG4gICAgLy8gcmVhZFRyYWNraW5nIHJldGVudGlvbiBkaWFsICh3aGljaCBnb3Zlcm5zIFZBTFVFIHJldGVudGlvbiBiZWxvdykuXG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlY29yZC5yZWFkKHBhdGgsIGtleSk7XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5ub3RlUmVhZChwYXRoLCBrZXkpO1xuICAgIC8vIFRoZSB2ZXJkaWN0LCBvbmNlIOKAlCBmb3IgdGhlIHJldGFpbmVkIHJlYWQgYmVsb3cgYW5kIHRoZSBzZWxlY3RlZC1yZWFkXG4gICAgLy8gY291bnQgKGBzZWxlY3RlZFJlYWRzYCkuIE5vIHBvbGljeSBhbmQgbm8gbWFya3Mg4oaSIG5vIHZlcmRpY3QgY2FsbCwgbm9cbiAgICAvLyBhbGxvY2F0aW9uIChhY3RpdmVSdWxlKS5cbiAgICBjb25zdCBydWxlID0ga2V5ICE9PSB1bmRlZmluZWQgPyB0aGlzLmFjdGl2ZVJ1bGUoKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCB2ZXJkaWN0ID0gcnVsZSAhPT0gdW5kZWZpbmVkID8gcnVsZS52ZXJkaWN0QXQocGF0aCwga2V5IGFzIHN0cmluZykgOiBDTEVBUjtcbiAgICBpZiAodmVyZGljdC5raW5kICE9PSAnY2xlYXInICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3NlbGVjdGVkUmVhZHMgKz0gMTtcbiAgICAgIC8vIEFuIG9iamVjdCByZWFkIHVuZGVyIGEgc2VsZWN0ZWQgbmFtZSwgd3JpdHRlbiBiYWNrIHVuZGVyIGFub3RoZXIsIGtlZXBzIGl0cyBydWxlIChzdGFnZVdyaXRlKS5cbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSAodGhpcy5fc2VsZWN0ZWRPYmplY3RzID8/PSBuZXcgV2Vha01hcCgpKS5zZXQodmFsdWUsIHZlcmRpY3QpO1xuICAgIH1cbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHJlYWQgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyDigJQgcmV0YWluZWQgdW5kZXJcbiAgICAvLyB0aGUgcnVsZSdzIHZlcmRpY3QgKDkuMTkuMCk6IGEgcmVkYWN0ZWQga2V5IGlzIHJldGFpbmVkIGFzIHRoZVxuICAgIC8vIHBsYWNlaG9sZGVyLCBhIGZpZWxkLWxldmVsIGtleSBhcyBhIHNjcnViYmVkIGNsb25lLCBuZXZlciB0aGUgc2VjcmV0LlxuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgIT09ICdvZmYnKSB7XG4gICAgICBpZiAocGF0aC5sZW5ndGggPiAwKSAodGhpcy5fbmVzdGVkUmVhZHMgPz89IG5ldyBTZXQoKSkuYWRkKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgICAgIGVsc2UgaWYgKHRoaXMucG9saWN5LnJlYWRUcmFja2luZyA9PT0gJ2Z1bGwnICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGlmICh0aGlzLnJlY29yZC5oYXNTdGFnZWQpIHRoaXMuX3ZpZXdSZWFkcz8uZGVsZXRlKGtleSk7XG4gICAgICAgIGVsc2UgKHRoaXMuX3ZpZXdSZWFkcyA/Pz0gbmV3IFNldCgpKS5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YWdlUmVhZHNbdXNlcktleU9mKHBhdGgsIGtleSldID1cbiAgICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB0aGlzLnJldGFpbmVkRm9ybSh2ZXJkaWN0LCB2YWx1ZSwgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nLCBzdW1tYXJpemVSZWFkVmFsdWUpO1xuICAgIH1cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgYFtSRUFEXSAke2Rlc2NyaXB0aW9ufWApO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogSG93IG1hbnkgdHJhY2tlZCByZWFkcyBvZiB0aGlzIGZyYW1lIHJlYWQgYSB2YWx1ZSB0aGUgcnVuJ3MgcnVsZSBzZWxlY3RzXG4gICAqIChhIGtleSBpdCBtYXNrcyB3aG9sZSwgb3Igb25lIHdpdGggc2VjcmV0IGZpZWxkcykuIEEgYm91bmRhcnkgdGhhdCBtYXBzXG4gICAqIHdoYXQgYSBzdGFnZSBmdW5jdGlvbiBSRUFEIGludG8gYSBuZXcgbmFtZSDigJQgdGhlIGBwYXJhbGxlbEZvckVhY2hgIGl0ZW1zXG4gICAqIHNlbGVjdG9yIOKAlCBjb21wYXJlcyBpdCBiZWZvcmUgYW5kIGFmdGVyLCBhcyBhIHN1YmZsb3cgbWFwcGVyJ3MgdGFpbnQgZG9lc1xuICAgKiAoYG1lbW9yeS9yZWRhY3Rpb24udHMgwrcgTWFwcGVyVGFpbnRgKS4gQWx3YXlzIDAgd2l0aG91dCBhIHBvbGljeSBvciBhIG1hcmsuXG4gICAqL1xuICBnZXQgc2VsZWN0ZWRSZWFkcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJlYWRzO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCB0cmFja2luZyBpbiBfc3RhZ2VSZWFkcyBvciBwYXlpbmcgc3RydWN0dXJlZENsb25lIGNvc3QuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlLmdldFZhbHVlU2lsZW50KCkgZm9yIGFycmF5IHByb3h5IGludGVybmFsIG9wZXJhdGlvbnMuICovXG4gIGdldFZhbHVlRGlyZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQucmVhZChwYXRoLCBrZXkpO1xuICB9XG5cbiAgZ2V0Um9vdChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5yZWFkTGl2ZShrZXkpO1xuICB9XG5cbiAgZ2V0R2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnJlYWRHbG9iYWwoa2V5KTtcbiAgfVxuXG4gIGdldFNjb3BlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQuc3RhdGUuZ2V0U3RhdGUoKTtcbiAgfVxuXG4gIGdldFJ1bklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgQ29tbWl0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyOiByZWNvcmQgdGhhdCB0aGlzIHN0YWdlIGNvbnN1bWVkIGFuIHVudHJhY2tlZCByZWFkIHBhdGguXG4gICAqIENhbGxlZCBieSBgU2NvcGVGYWNhZGVgIChgZ2V0QXJnc2AvYGdldEVudmAvdW5zaGFkb3dlZCBgZ2V0VmFsdWVTaWxlbnRgKTtcbiAgICogc3VyZmFjZWQgYXMgYENvbW1pdEJ1bmRsZS51bnRyYWNrZWRTb3VyY2VzYCBvbiB0aGlzIHN0YWdlJ3MgY29tbWl0LlxuICAgKi9cbiAgbWFya1VudHJhY2tlZFNvdXJjZShzb3VyY2U6IFVudHJhY2tlZFNvdXJjZSk6IHZvaWQge1xuICAgICh0aGlzLl91bnRyYWNrZWRTb3VyY2VzID8/PSBuZXcgU2V0KCkpLmFkZChzb3VyY2UpO1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIGFuIG9ic2VydmVyIHRoYXQgZmlyZXMgYWZ0ZXIgY29tbWl0KCkgYXBwbGllcyBwYXRjaGVzLlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZSB0byBkaXNwYXRjaCBTY29wZVJlY29yZGVyLm9uQ29tbWl0IGV2ZW50cy4gKi9cbiAgc2V0Q29tbWl0T2JzZXJ2ZXIoXG4gICAgb2JzZXJ2ZXI6IChtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+KSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9jb21taXRPYnNlcnZlciA9IG9ic2VydmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIERldi1tb2RlIG9ubHk6IGRpZCB0aGlzIHN0YWdlIGNoYW5nZSwgSU4gUExBQ0UsIGEgdmFsdWUgaXQgbWVyZWx5IFJFQUQ/XG4gICAqXG4gICAqIFRoZSB0eXBlZCBzY29wZSBpbnRlcmNlcHRzIGV2ZXJ5IHdyaXRlIGl0IGNhbiByZWFjaCDigJQgYSBwcm9wZXJ0eSBhdCBhbnlcbiAgICogZGVwdGgsIGFuIGluZGV4ZWQgZWxlbWVudCwgYW4gYXJyYXkgbWV0aG9kLiBXaGF0IGl0IGNhbm5vdCByZWFjaCBpcyBhblxuICAgKiBlbGVtZW50IGhhbmRlZCBvdXQgYnkgYSByZWFkIG1ldGhvZCAoYGZpbmRgLCBgZmlsdGVyYCwgYGZvcuKApm9mYCxcbiAgICogYGZvckVhY2hgLCBkZXN0cnVjdHVyaW5nKTogd3JhcHBpbmcgdGhvc2Ugd291bGQgbWVhbiByZXR1cm5pbmcgcHJveGllcyBvdXRcbiAgICogb2YgZXZlcnkgcmVhZCwgd2hpY2ggaXMgYSBjb3N0IHRoZSBsaWJyYXJ5IHNob3VsZCBub3QgcGF5LiBTbyB0aGF0IGZhbWlseVxuICAgKiBpcyBXQVJORUQgQUJPVVQgcmF0aGVyIHRoYW4gaW50ZXJjZXB0ZWQg4oCUIGxvdWRseSwgaGVyZSwgaW5zdGVhZCBvZiBlbmRpbmdcbiAgICogdGhlIHJ1biB3aXRoIGEgY29tbWl0IGxvZyB0aGF0IHNpbGVudGx5IGRpc2FncmVlcyB3aXRoIGZpbmFsIHN0YXRlLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgUkVQT1JUIGFmdGVyIHRoZSBmYWN0LCBub3QgYSByZWZ1c2FsIGF0IHRoZSB3cml0ZTogdGhlIHdyaXRlIGhhc1xuICAgKiBhbHJlYWR5IGhhcHBlbmVkIGluIHBsYWNlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGludGVyY2VwdC4gSXQgcnVucyB1bmRlclxuICAgKiBUV08gcHJlY29uZGl0aW9ucywgYm90aCBuYW1lZCBpbiB0aGUgUkVBRE1FIOKAlCBgZW5hYmxlRGV2TW9kZSgpYCwgYW5kXG4gICAqIGByZWFkVHJhY2tpbmc6ICdmdWxsJ2AgKHRoZSBkZWZhdWx0KSwgYmVjYXVzZSB0aGUgY29tcGFyaXNvbiBuZWVkcyB0aGVcbiAgICogY2xvbmUgb2YgdGhlIHZhbHVlIHRoYXQgbW9kZSByZXRhaW5zIGF0IHJlYWQgdGltZS4gQSBrZXkgdGhlIHN0YWdlIG5ldmVyXG4gICAqIHN0YWdlZCBtdXN0IHN0aWxsIGhvbGQgdGhhdCBjbG9uZSDigJQgY29tbWl0dGVkIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwXG4gICAqIGFuZCB0aGUgYnVmZmVyJ3Mgd29ya2luZyBjb3B5IGlzIHByaXZhdGUgdG8gdGhpcyBzdGFnZS4gS2V5cyB0aGUgc3RhZ2UgRElEXG4gICAqIHN0YWdlIGFyZSBza2lwcGVkICh0aGV5IGFyZSBleHBlY3RlZCB0byBkaWZmZXIsIGFuZCB0aGV5IGFyZSBpbiB0aGUgcmVjb3JkKSxcbiAgICogc28gYXJlIGtleXMgdW5kZXIgYSByZWRhY3Rpb24gdmVyZGljdCwgd2hvc2UgcmV0YWluZWQgZm9ybSBpcyBkZWxpYmVyYXRlbHlcbiAgICogbm90IHRoZSB2YWx1ZSwgYW5kIHNvIGFyZSBrZXlzIHJlYWQgYXQgYSBuZXN0ZWQgcGF0aCAoYF9uZXN0ZWRSZWFkc2ApIOKAlFxuICAgKiB0aG9zZSBhcmUgZW5naW5lIHJlYWRzICh0aGUgc3ViZmxvdyBtZXJnZS1iYWNrKSwgbm90IHVzZXIgcmVhZHMuXG4gICAqXG4gICAqIEl0IGFsc28gb25seSBsb29rcyBhdCBrZXlzIHNlcnZlZCBmcm9tIHRoZSBQSU5ORUQgc291cmNlIOKAlCB0aGUgZmlyc3QtdG91Y2hcbiAgICogdmlldyBvciB0aGlzIHN0YWdlJ3Mgb3duIGJ1ZmZlci4gQSBrZXkgYWJzZW50IGZyb20gYm90aCB3YXMgc2VydmVkIGJ5IHRoZVxuICAgKiByZWFkJ3MgbGl2ZSBmYWxsYmFjayAoYFJlY29yZEZyYW1lIMK3IHJlYWRgLCB0aWVyIDIpLCB3aGljaCBhIHBhcmFsbGVsIHNpYmxpbmcncyByb290LWtleSBjb21taXQgY2FuXG4gICAqIGxlZ2l0aW1hdGVseSBtb3ZlOyBhY2N1c2luZyB0aGUgc3RhZ2UgdGhlcmUgd291bGQgYmUgYSBmYWxzZSBhbGFybS4gRm9yXG4gICAqIHRoZSBzYW1lIHJlYXNvbiBpdCBydW5zIG9uIHRoZSBmcmFtZSdzIEZJUlNUIGNvbW1pdCBvbmx5OiB0aGUgcmVhZHMgYmVsb25nXG4gICAqIHRvIHRoYXQgcm91bmQsIGFuZCBieSB0aGUgZW5naW5lJ3Mgc2Vjb25kIHJvdW5kIChhIGZvcmsgZG91YmxlLWNvbW1pdCwgYVxuICAgKiBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGNvbW1pdHRlZCBicmFuY2ggcGFyZW50KSBvdGhlciBzdGFnZXMgaGF2ZVxuICAgKiBsZWdpdGltYXRlbHkgbW92ZWQgdGhlIHN0YXRlIHRoZXkgd2VyZSBjb21wYXJlZCBhZ2FpbnN0LlxuICAgKlxuICAgKiBBIGtleSB0aGUgc3RhZ2UgRElEIHN0YWdlIGlzIHN0aWxsIGNoZWNrZWQgd2hlbiBpdHMgbGFzdCByZWFkIGNhbWUgZnJvbVxuICAgKiBjb21taXR0ZWQgc3RhdGUgKHtAbGluayBfdmlld1JlYWRzfSDigJQgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlKTpcbiAgICogdGhhdCByZWFkIHdhcyB0aGUgY29tbWl0dGVkIG9iamVjdCBpdHNlbGYsIGFuZCB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIElTXG4gICAqIHRoYXQgb2JqZWN0IChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLCBzbyBhbiBpbi1wbGFjZSBlZGl0IGZvbGxvd2VkIGJ5IGFcbiAgICogd3JpdGUgb2YgdGhlIGtleSBjb21taXRzIE5PIGNoYW5nZSDigJQgbGl2ZSBzdGF0ZSBrZWVwcyB0aGUgZWRpdCwgdGhlIGxvZ1xuICAgKiBkb2VzIG5vdC4gQ29tcGFyZWQgYWdhaW5zdCBjb21taXR0ZWQgc3RhdGUsIG5vdCB0aGUgd3JpdHRlbiB2YWx1ZSwgc28gYVxuICAgKiBsZWdpdGltYXRlIHdyaXRlIG5ldmVyIHRyaXBzIGl0LlxuICAgKlxuICAgKiBDb3N0cyBub3RoaW5nIG91dHNpZGUgYGVuYWJsZURldk1vZGUoKWAuXG4gICAqL1xuICBwcml2YXRlIHdhcm5PbkJvcnJvd2VkTXV0YXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCFpc0Rldk1vZGUoKSB8fCB0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgIT09ICdmdWxsJyB8fCB0aGlzLl9jb21taXR0ZWQpIHJldHVybjtcbiAgICBjb25zdCBydWxlID0gdGhpcy5hY3RpdmVSdWxlKCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5fc3RhZ2VSZWFkcykpIHtcbiAgICAgIGNvbnN0IHJldGFpbmVkID0gdGhpcy5fc3RhZ2VSZWFkc1trZXldO1xuICAgICAgLy8gT25seSBhIGNvbnRhaW5lciBjYW4gYmUgbXV0YXRlZCBpbiBwbGFjZTsgYSBwcmltaXRpdmUgcmVhZCBjYW5ub3QuXG4gICAgICBpZiAocmV0YWluZWQgPT09IG51bGwgfHwgdHlwZW9mIHJldGFpbmVkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICBpZiAodGhpcy5fbmVzdGVkUmVhZHM/LmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGlmIChydWxlICE9PSB1bmRlZmluZWQgJiYgcnVsZS52ZXJkaWN0QXQoW10sIGtleSkua2luZCAhPT0gJ2NsZWFyJykgY29udGludWU7XG4gICAgICBjb25zdCBuYW1lc3BhY2VkID0gdGhpcy5yZWNvcmQuYXQoW10sIGtleSk7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3N0YWdlV3JpdGVzLCBrZXkpIHx8IHRoaXMucmVjb3JkLndhc1N0YWdlZChuYW1lc3BhY2VkKSkge1xuICAgICAgICB0aGlzLndhcm5PbkNvbW1pdHRlZE11dGF0aW9uKGtleSwgbmFtZXNwYWNlZCwgcmV0YWluZWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHBpbm5lZCBzb3VyY2Ugb25seSDigJQgc2VlIHRoZSBub3RlIG9uIHRoZSBsaXZlIGZhbGxiYWNrIGFib3ZlLlxuICAgICAgLy8gYHBlZWtgLCBub3QgYGdldGA6IGEgcmVwb3J0IGNvbXBhcmVzLCBhbmQgbXVzdCBub3QgdGFrZSB0aGUgcHJpdmF0ZVxuICAgICAgLy8gY29weSBhIHN0YWdlJ3MgcmVhZCB3b3VsZCAoY29weS1vbi13cml0ZSwgOS4yOS4wKS5cbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJlY29yZC5wZWVrKG5hbWVzcGFjZWQpO1xuICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHBhdGggPSBmaXJzdERpZmZlcmluZ1BhdGgocmV0YWluZWQsIGN1cnJlbnQpO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlKHRoaXMuc3RhZ2VOYW1lLCBrZXksIHBhdGgpKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIHN0YWdlZC1rZXkgaGFsZiBvZiB7QGxpbmsgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbn06IGRpZCBjb21taXR0ZWQgc3RhdGUgaXRzZWxmIG1vdmUgdW5kZXIgYSByZWFkPyAqL1xuICBwcml2YXRlIHdhcm5PbkNvbW1pdHRlZE11dGF0aW9uKGtleTogc3RyaW5nLCBuYW1lc3BhY2VkOiBzdHJpbmdbXSwgcmV0YWluZWQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3ZpZXdSZWFkcz8uaGFzKGtleSkpIHJldHVybjtcbiAgICBjb25zdCBjb21taXR0ZWQgPSB0aGlzLnJlY29yZC5iYXNlQXQobmFtZXNwYWNlZCk7XG4gICAgaWYgKGNvbW1pdHRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgcGF0aCA9IGZpcnN0RGlmZmVyaW5nUGF0aChyZXRhaW5lZCwgY29tbWl0dGVkKTtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oY29tbWl0dGVkTXV0YXRpb25NZXNzYWdlKHRoaXMuc3RhZ2VOYW1lLCBrZXksIHBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCBzdGFnZWQgd3JpdGVzIHRvIHNoYXJlZCBtZW1vcnkgYW5kIFJFTEVBU0UgdGhlIHBlci1zdGFnZSBzdGFnaW5nXG4gICAqIHN0YXRlICgjMTNiKS5cbiAgICpcbiAgICogYHBoYXNlYCAoOS4zOS4wKSBpcyB0aGUgY2FsbGVyJ3Mgc3RhdGVtZW50IG9mIHdoYXQgYSBDT05USU5VQVRJT04gY29tbWl0XG4gICAqIGlzIOKAlCBgJ2V4aXQnYCBmcm9tIGEgc3ViZmxvdyBtb3VudCdzIGV4aXQsIGAncmVwZWF0J2AgZnJvbSBhIGZvcmtcbiAgICogZmFuLW91dCdzIHNldHRsZS4gSXQgaXMgc3RhbXBlZCBvbiB0aGUgYnVuZGxlIChgQ29tbWl0QnVuZGxlLnBoYXNlYCkgb25seVxuICAgKiB3aGVuIHRoaXMgZnJhbWUgaGFzIEFMUkVBRFkgY29tbWl0dGVkOiB0aGUgRklSU1QgYnVuZGxlIG9mIGFuIGV4ZWN1dGlvblxuICAgKiBpcyB0aGUgc3RhZ2UncyBvd24gYW5kIG5ldmVyIGNhcnJpZXMgYSBgcGhhc2VgIOKAlCBzbyBhIG1vdW50IHdpdGhvdXQgYW5cbiAgICogYG91dHB1dE1hcHBlcmAgKGEgbGF6eSBtb3VudCwgZXZlcnkgYHBhcmFsbGVsRm9yRWFjaGAgYnJhbmNoKSwgd2hvc2UgZXhpdFxuICAgKiBpcyBpdHMgb25seSBidW5kbGUsIHJlY29yZHMgdGhhdCBidW5kbGUgYXMgaXRzIG93biwgdGFncyBhbmQgYWxsLlxuICAgKlxuICAgKiBDb21taXQgaXMgdGhlIHN0YWdlJ3MgbGlmZWN5Y2xlIGVuZDogdGhlIHJlY29yZCBmcmFtZSdzIGJ1ZmZlciBhbmRcbiAgICogZmlyc3QtdG91Y2ggYmFzZSBhcmUgb25seSBuZWVkZWQgRFVSSU5HIGV4ZWN1dGlvbiwgYXMgdGhlIHJlYWQgc25hcHNob3QgK1xuICAgKiBuZXQtY2hhbmdlIGRpZmYgYmFzZSwgc28gdGhlIHJlY29yZCBmcmFtZSByZWxlYXNlcyB0aGVtIG9uY2UgdGhlIGNvbW1pdFxuICAgKiBoYXMgbGFuZGVkIGFuZCB0aGUgb2JzZXJ2ZXIgaGFzIHNlZW4gaXQgKGBSZWNvcmRGcmFtZSDCtyByZWxlYXNlYCDigJQgd2h5IGFcbiAgICogZnJhbWUgdGhhdCBrZXB0IHRoZW0gd291bGQgcmV0YWluIG9uZSBzdGF0ZSBnZW5lcmF0aW9uIHBlciBleGVjdXRlZFxuICAgKiBzdGFnZSwgYW5kIHdoeSBhIHJlLXVzZWQgZnJhbWUgcmUtYW5jaG9ycyBvbiBjdXJyZW50IHN0YXRlLCBpcyB0aGVyZSkuXG4gICAqXG4gICAqIFJFLVVTRSBBRlRFUiBDT01NSVQgc3RheXMgY29ycmVjdCBiZWNhdXNlIGJvdGggcmUtY3JlYXRlIGxhemlseTpcbiAgICogLSBhIGxhdGVyIFJFQUQgcmUtYW5jaG9ycyBvbiB0aGUgQ1VSUkVOVCBjb21taXR0ZWQgc3RhdGUgKHdoaWNoIGluY2x1ZGVzXG4gICAqICAgdGhpcyBzdGFnZSdzIG93biBmbHVzaGVkIHdyaXRlcyk7XG4gICAqIC0gYSBsYXRlciBXUklURSBjb25zdHJ1Y3RzIGEgZnJlc2ggYnVmZmVyIG9uIHRoYXQgcmUtYW5jaG9yZWQgdmlldywgc28gYVxuICAgKiAgIHNlY29uZCBjb21taXQgZGlmZnMgYWdhaW5zdCBwb3N0LWZpcnN0LWNvbW1pdCBzdGF0ZS4gVGhlIHByZS1yZWxlYXNlXG4gICAqICAgYnVmZmVyIGJlaGF2ZWQgdGhlIHNhbWUgZm9yIFZBTFVFUyAoaXRzIGB3b3JraW5nQ29weWAgd2FzIHJlc2V0IG9uXG4gICAqICAgY29tbWl0LCBmYWxsaW5nIHJlYWRzIHRocm91Z2ggdG8gbGl2ZSBzdGF0ZSkgYnV0IGtlcHQgdGhlIE9SSUdJTkFMXG4gICAqICAgYGJhc2VTbmFwc2hvdGAgYXMgZGlmZiBiYXNlIOKAlCB1bnJlYWNoYWJsZSBpbiBwcmFjdGljZTogdGhlIGVuZ2luZSdzXG4gICAqICAgb25seSB3cml0ZXMgYWZ0ZXIgYSBjb21taXQgYXJlIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGNvbW1pdHRlZFxuICAgKiAgIGJyYW5jaCBwYXJlbnQgKGEgZGVjaWRlciBvciBmb3JrIGZyYW1lIGNvbW1pdHMgYmVmb3JlIGl0cyBicmFuY2ggcnVucyk7XG4gICAqICAgdGhlIG90aGVyIFwid3JpdGUgYWZ0ZXIgY29tbWl0XCJcbiAgICogICBzaXRlcyAoU3ViZmxvd0V4ZWN1dG9yIHNlZWQg4oaSIHJlcGxhY2VzIHRoZSBjb250ZXh0OyByZXN1bWUg4oaSIGZyZXNoXG4gICAqICAgY29udGV4dCB2aWEgYGxlYWYuY3JlYXRlTmV4dGApIG5ldmVyIHJlLXVzZSBhIGNvbW1pdHRlZCBjb250ZXh0LlxuICAgKiAtIEEgVVNFUiBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZSBpcyBhIGRpZmZlcmVudCBtYXR0ZXI6IGl0cyB3cml0ZXNcbiAgICogICB3b3VsZCBsYW5kIGluIGEgYnVmZmVyIG5vdGhpbmcgZXZlciBjb21taXRzLiBUaGF0IHJlZnVzYWwgbGl2ZXMgb24gdGhlXG4gICAqICAgc2NvcGUgdGllciAoYFNjb3BlRmFjYWRlYCwgc2VhbGVkIGJ5IHRoZSBjb21taXQgb2JzZXJ2ZXIg4oCUIDkuMjIuMCksXG4gICAqICAgYmVjYXVzZSB0aGUgZnJhbWUncyByZS11c2FiaWxpdHkgaXMgZXhhY3RseSB3aGF0IHRoZSBlbmdpbmUgcGF0aHNcbiAgICogICBhYm92ZSBuZWVkLlxuICAgKiAtIGBfc3RhZ2VXcml0ZXNgIC8gYF9zdGFnZVJlYWRzYCBhcmUgTk9UIHJlbGVhc2VkIOKAlCBgc25hcHNob3RTZWxmKClgXG4gICAqICAgcmVhZHMgdGhlbSBwb3N0LXJ1biBmb3IgdGhlIGV4ZWN1dGlvbi10cmVlIHNuYXBzaG90LlxuICAgKi9cbiAgY29tbWl0KHBoYXNlPzogQ29tbWl0UGhhc2UpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5jb21taXRSZXRhaW5lZChwaGFzZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuY2FwdHVyZT8ubGltaXQoJ2NvbW1pdC1yZXRlbnRpb24tZmFpbGVkJyk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbW1pdFJldGFpbmVkKHBoYXNlPzogQ29tbWl0UGhhc2UpOiB2b2lkIHtcbiAgICAvLyBBIGNvbnRpbnVhdGlvbiBvbmx5IEFGVEVSIHRoZSBleGVjdXRpb24ncyBvd24gYnVuZGxlIChzZWUgYWJvdmUpLlxuICAgIGNvbnN0IGNvbnRpbnVhdGlvbiA9IHRoaXMuX2NvbW1pdHRlZCA/IHBoYXNlIDogdW5kZWZpbmVkO1xuICAgIHRoaXMubWF0ZXJpYWxpc2VXcml0ZXMoKTtcbiAgICB0aGlzLndhcm5PbkJvcnJvd2VkTXV0YXRpb24oKTtcbiAgICAvLyBUaGUgcmVjb3JkJ3MgaGFsZiAoYFJlY29yZEZyYW1lIMK3IGNvbW1pdGAg4oaSIGByZWNvcmRDb21taXQudHNgKS4gTm8gYnVmZmVyXG4gICAgLy8gPSBubyB3cml0ZSBldmVyIGJ1aWx0IG9uZSAoIzEzKTogdGhlIGNvbW1pdCBpcyBlbXB0eSBieSBjb25zdHJ1Y3Rpb24sXG4gICAgLy8gcmVjb3JkZWQgd2l0aCBaRVJPIGNsb25lcy4gVGhlIG5hbWVzIGFyZSByZWFkIG9uY2UgdGhlIHBheWxvYWQgaXMgYnVpbHQuXG4gICAgdGhpcy5yZWNvcmQuY29tbWl0KCgpID0+ICh7XG4gICAgICBzdGFnZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIHVudHJhY2tlZFNvdXJjZXM6IHRoaXMuX3VudHJhY2tlZFNvdXJjZXMsXG4gICAgICB0YWdzOiB0aGlzLnRhZ3MsXG4gICAgICBwaGFzZTogY29udGludWF0aW9uLFxuICAgIH0pKTtcbiAgICAvLyBUaGUgb2JzZXJ2ZXIgKFNjb3BlRmFjYWRlKSBzZWVzIHRoZSB0cmFja2VkIG11dGF0aW9ucywgVEhFTiB0aGUgc3RhZ2luZ1xuICAgIC8vIHN0YXRlIGlzIHJlbGVhc2VkICgjMTNiKSwgc28gaXQgc2VlcyB0aGUgd29ybGQgYXMgaXQgd2FzLiBEMidzIG1hcmtlcnNcbiAgICAvLyBhbmQgdGhlIGRlY2xhcmVkIHRhZ3MgcmVsZWFzZSB3aXRoIGl0IOKAlCBvbmUgc3RhbXAgcGVyIGV4ZWN1dGlvbiwgc28gdGhlXG4gICAgLy8gZW5naW5lJ3MgZG91YmxlLWNvbW1pdCBwYXRocyByZWNvcmQgdGhlbSBleGFjdGx5IG9uY2UuXG4gICAgaWYgKHRoaXMuX2NvbW1pdE9ic2VydmVyKSB7XG4gICAgICB0aGlzLl9jb21taXRPYnNlcnZlcih7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH0pO1xuICAgIH1cbiAgICB0aGlzLnJlY29yZC5yZWxlYXNlKCk7XG4gICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgICAvLyBUaGUgc3RhZ2UgaXMgb3ZlcjogZXZlcnkgY2FsbCBpdCBtYWRlIHRoYXQgaXMgc3RpbGwgcnVubmluZyBzdG9wcyAoUDIpLCBhbmQgbm90aGluZyByZXBvcnRzIHRocm91Z2ggdGhlXG4gICAgLy8gZW5naW5lIGFueSBtb3JlIOKAlCBhIGxhdGUgcmVjb3JkIGlzIHJlZnVzZWQgYmVmb3JlIGl0IHdvdWxkIHJlYWNoIGl0LlxuICAgIHRoaXMuZW5kQ2FsbHModW5kZWZpbmVkKTtcbiAgICB0aGlzLl9hdHRlbXB0UmVwb3J0ZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogV2hldGhlciB0aGlzIGZyYW1lIGhhcyBjb21taXR0ZWQg4oCUIGEgY2FsbCdzIHJlY29yZCBhcnJpdmluZyBhZnRlciBpdCBpcyBsYXRlIChQMiwgYFNjb3BlRmFjYWRlIMK3IGNhbGxgKS4gKi9cbiAgZ2V0IGNvbW1pdHRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbWl0dGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93IGF3YXkgZXZlcnl0aGluZyB0aGlzIHN0YWdlIGhhcyBTVEFHRUQsIHdpdGhvdXQgY29tbWl0dGluZyBhbnkgb2YgaXQuXG4gICAqXG4gICAqIFRoZSBpc29sYXRpb24gcHJpbWl0aXZlIGJlaGluZCBkZWNsYXJhdGl2ZSByZXRyeTogd2hlbiBhIG5vbi1maW5hbCBhdHRlbXB0XG4gICAqIGZhaWxzLCB0aGUgd3JpdGVzIGl0IHN0YWdlZCBtdXN0IG5vdCBiZSB2aXNpYmxlIHRvIHRoZSBuZXh0IGF0dGVtcHQsIG11c3RcbiAgICogbm90IHJlYWNoIHNoYXJlZCBzdGF0ZSwgYW5kIG11c3Qgbm90IGFwcGVhciBpbiB0aGUgY29tbWl0IGxvZyBvciBpbiB0aGlzXG4gICAqIHN0YWdlJ3Mgc25hcHNob3QuIERyb3BwaW5nIHRoZSBzdGFnaW5nIHN0YXRlIGFjaGlldmVzIGFsbCBmb3VyIGF0IG9uY2Ug4oCUXG4gICAqIHRoZXJlIGlzIG5vIHJvbGxiYWNrIG1hY2hpbmVyeSB0byBpbnZva2UgYmVjYXVzZSBub3RoaW5nIHdhcyBldmVyIGFwcGxpZWRcbiAgICogKE0xOiB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyIGhvbGRzIHdyaXRlcyB1bnRpbCBgY29tbWl0KClgIGZsdXNoZXMgdGhlbSkuXG4gICAqXG4gICAqIFdoYXQgaXMgcmVsZWFzZWQsIGFuZCB3aHkgZWFjaCBvbmUgbWF0dGVycyBmb3IgdGhlIG5leHQgYXR0ZW1wdDpcbiAgICogIC0gdGhlIHJlY29yZCBmcmFtZSdzIHN0YWdlZCBzdGF0ZSAoYFJlY29yZEZyYW1lIMK3IGRpc2NhcmRgKSDigJQgdGhlIGJ1ZmZlclxuICAgKiAgICAgICAgICAgICAgICAgICAgKHRoZSBuZXh0IGF0dGVtcHQgc3RhcnRzIHdpdGggbm90aGluZyBzdGFnZWQpLCB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgIGZpcnN0LXRvdWNoIGJhc2UgKGl0IHJlLWFuY2hvcnMgb24gY29tbWl0dGVkIHN0YXRlIGFzXG4gICAqICAgICAgICAgICAgICAgICAgICBpdCBzdGFuZHMgTk9XIOKAlCBhIHNpYmxpbmcgZm9yayBicmFuY2ggbWF5IGxlZ2l0aW1hdGVseVxuICAgKiAgICAgICAgICAgICAgICAgICAgaGF2ZSBjb21taXR0ZWQgaW4gYmV0d2VlbikgYW5kIHRoZSByZWFkS2V5cyBsaXN0ICgjUDE6XG4gICAqICAgICAgICAgICAgICAgICAgICBhIGRpc2NhcmRlZCBhdHRlbXB0J3MgcmVhZHMgbXVzdCBuZXZlciByZWFjaCB0aGUgbmV4dFxuICAgKiAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCdzIGBUcmFjZUVudHJ5LnJlYWRLZXlzYCk7XG4gICAqICAtIGBfc3RhZ2VXcml0ZXNgIC8gYF9wZW5kaW5nV3JpdGVzYCAvIGBfc3RhZ2VSZWFkc2Ag4oCUIHRoZSBzbmFwc2hvdFxuICAgKiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDsgd2l0aG91dCB0aGUgcmVzZXQgdGhlIGV4ZWN1dGlvbiB0cmVlIHdvdWxkXG4gICAqICAgICAgICAgICAgICAgICAgICByZXBvcnQgd3JpdGVzIHRoYXQgd2VyZSBkaXNjYXJkZWQsIHdoaWNoIGlzIHRoZSBleGFjdFxuICAgKiAgICAgICAgICAgICAgICAgICAgbGllIHRoaXMgZmVhdHVyZSBleGlzdHMgdG8gcHJldmVudCAodGhlIHBlbmRpbmcgbWFwXG4gICAqICAgICAgICAgICAgICAgICAgICBob2xkcyBiYXJlIHJlZmVyZW5jZXMg4oCUIGRyb3BwaW5nIGl0IHVuLWNsb25lcyBub3RoaW5nKTtcbiAgICogIC0gYF91bnRyYWNrZWRTb3VyY2VzYCDigJQgdGhlIEQyIGhvbmVzdHkgbWFya2VycywgcmVsZWFzZWQgd2l0aCB0aGUgcmVzdC5cbiAgICpcbiAgICogV2hhdCBpcyBkZWxpYmVyYXRlbHkgS0VQVDogYGRlYnVnYCAobG9ncywgbWV0cmljcywgZXJyb3JzLCBmbG93IG1lc3NhZ2VzKVxuICAgKiBhbmQgdGhlIGF0dGVtcHQgcmVjb3JkcyAoMTAuMSkuIEJvdGggYXJlIHRoZSBhcHBlbmQtb25seSByZWNvcmQgb2Ygd2hhdFxuICAgKiBldmVyeSBhdHRlbXB0IGRpZCwgYW5kIHRoZSByZXRyeSBmZWF0dXJlJ3Mgd2hvbGUgcG9pbnQgaXMgdGhhdCB0aGUgZWFybGllclxuICAgKiBhdHRlbXB0cyBzdGF5IHZpc2libGUuXG4gICAqXG4gICAqIE5vIGNvbW1pdCBpcyByZWNvcmRlZCBhbmQgbm8gb2JzZXJ2ZXIgZmlyZXMg4oCUIGEgZGlzY2FyZGVkIGF0dGVtcHQgaXMgbm90IGFcbiAgICogY3Vyc29yIHN0b3AsIGJlY2F1c2UgZnJvbSBzaGFyZWQgc3RhdGUncyBwb2ludCBvZiB2aWV3IGl0IG5ldmVyIGhhcHBlbmVkLlxuICAgKi9cbiAgZGlzY2FyZFN0YWdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZC5kaXNjYXJkKCk7XG4gICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9wZW5kaW5nV3JpdGVzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3N0YWdlV3JpdGVzID0ge307XG4gICAgdGhpcy5fc3RhZ2VSZWFkcyA9IHt9O1xuICAgIHRoaXMuX25lc3RlZFJlYWRzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3ZpZXdSZWFkcyA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBBdHRlbXB0cyAoMTAuMSkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEFwcGVuZCBvbmUgYXR0ZW1wdCdzIHJlY29yZCDigJQgdGhlIGF0dGVtcHQgcnVubmVyIGNhbGxzIHRoaXMgYXMgZWFjaCBhdHRlbXB0IGVuZHMuICovXG4gIHJlY29yZEF0dGVtcHQocmVjb3JkOiBBdHRlbXB0UmVjb3JkKTogdm9pZCB7XG4gICAgKHRoaXMuX2F0dGVtcHRzID8/PSBbXSkucHVzaChyZWNvcmQpO1xuICAgICh0aGlzLl9hdHRlbnRpb24gPz89IG5ldyBTdGFnZUF0dGVudGlvbigoKSA9PiB0aGlzLmNhcHR1cmU/LmxpbWl0KCdhdHRlbnRpb24tb21pdHRlZCcpKSkucmVjb3JkQXR0ZW1wdChcbiAgICAgIHJlY29yZCxcbiAgICAgIHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgKTtcbiAgICB0aGlzLm5vdGVBdHRlbXB0KHJlY29yZCk7XG4gICAgLy8gVGhlIHN0YWdlIGF0dGVtcHQgaXMgb3ZlciwgaG93ZXZlciBpdCBlbmRlZDogdGhlIGNhbGxzIGl0IG1hZGUgc3RvcCAoUDIpLlxuICAgIHRoaXMuZW5kQ2FsbHMocmVjb3JkLmF0dGVtcHQpO1xuICB9XG5cbiAgLyoqIFN0YW1wIHRoZSBzZXJpZXMnIHN1bW1hcnkg4oCUIG9uY2UsIHdoZW4gdGhlIHJ1bm5lciBlbmRzIHRoZSBzZXJpZXMuICovXG4gIGVuZEF0dGVtcHRzKHN1bW1hcnk6IEF0dGVtcHRTdW1tYXJ5KTogdm9pZCB7XG4gICAgdGhpcy5fYXR0ZW1wdFN1bW1hcnkgPSBzdW1tYXJ5O1xuICAgICh0aGlzLl9hdHRlbnRpb24gPz89IG5ldyBTdGFnZUF0dGVudGlvbigoKSA9PiB0aGlzLmNhcHR1cmU/LmxpbWl0KCdhdHRlbnRpb24tb21pdHRlZCcpKSkucmVjb3JkU3VtbWFyeShzdW1tYXJ5KTtcbiAgfVxuXG4gIC8qKiBSZXNldCBvbmx5IGF0IHRoZSBub2RlJ3MgZXhlY3V0aW9uIHN0YW1wLCBuZXZlciBiZXR3ZWVuIGF0dGVtcHRzLiAqL1xuICBiZWdpbkF0dGVudGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9hdHRlbnRpb24/LmJlZ2luKCk7XG4gIH1cblxuICAvKiogRGVsZWdhdGUgdGhlIGV4cGxpY2l0IHJldGFpbmVkLWVycm9yIGZhY3Q7IGF0dGVudGlvbiBvd25zIHZhbGlkYXRpb24gb2YgaXRzIHByb29mLiAqL1xuICBtYXJrU3RhZ2VGYWlsdXJlKCk6IHZvaWQge1xuICAgICh0aGlzLl9hdHRlbnRpb24gPz89IG5ldyBTdGFnZUF0dGVudGlvbigoKSA9PiB0aGlzLmNhcHR1cmU/LmxpbWl0KCdhdHRlbnRpb24tb21pdHRlZCcpKSkuc3RhZ2VGYWlsZWQoXG4gICAgICB0aGlzLmRlYnVnLmVycm9yQ29udGV4dCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjcmFzaC1zYWZlIHJlY29yZCAoMTAuMSwgUDYpOiBhbiBhdHRlbXB0IHRoYXQgZW5kZWQgaXMgbm90ZWQgaW4gdGhlIHJ1bidzIHNpbmsgQVQgT05DRSwgYmVzaWRlIHRoaXMgZnJhbWUnc1xuICAgKiBsb2cg4oCUIHNvIGEgcHJvY2VzcyBraWxsZWQgYmVmb3JlIHRoZSBzdGFnZSBjb21taXRzIChtaWQtcmV0cnkpIHN0aWxsIGxlYXZlcyBldmVyeSBhdHRlbXB0IHRoYXQgZW5kZWQuIFRoZVxuICAgKiByZWNvcmQgaXMgdGhlIG9uZSB0aGUgdHJlZSBrZWVwczogZnJvemVuLCBgc3RydWN0dXJlZENsb25lYC1zYWZlLCBpdHMgZXJyb3IgdGhlIFNFUlZFRCBmb3JtIChubyBgcmF3YCksIHNvIHRoZVxuICAgKiBub3RlIG5lZWRzIG5vIHNlY29uZCByZWRhY3Rpb24gcGFzcy4gV2l0aG91dCBhIHNpbmsgdGhlIGxvZyBkb2VzIG5vdGhpbmcgKGBFdmVudExvZyDCtyBub3RlYCkuXG4gICAqL1xuICBwcml2YXRlIG5vdGVBdHRlbXB0KHJlY29yZDogQXR0ZW1wdFJlY29yZCk6IHZvaWQge1xuICAgIHRoaXMucmVjb3JkLmxvZz8ubm90ZSgnYXR0ZW1wdCcsIHsgcmVjb3JkIH0pO1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0cyBvZiB0aGlzIGV4ZWN1dGlvbiBzbyBmYXIsIGluIG9yZGVyIOKAlCBpdHMgb3duIGFuZCBpdHMgY2FsbHMnOyBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGFyZSBub25lLiAqL1xuICBnZXQgYXR0ZW1wdHMoKTogcmVhZG9ubHkgQXR0ZW1wdFJlY29yZFtdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYXR0ZW1wdHM7XG4gIH1cblxuICAvKiogVGhlIGVuZGVkIHNlcmllcycgc3VtbWFyeTsgYHVuZGVmaW5lZGAgd2hpbGUgaXQgcnVucyBhbmQgd2l0aG91dCBhIHBvbGljeS4gKi9cbiAgZ2V0IGF0dGVtcHRTdW1tYXJ5KCk6IEF0dGVtcHRTdW1tYXJ5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYXR0ZW1wdFN1bW1hcnk7XG4gIH1cblxuICAvKiogVGhlIGF0dGVtcHQgYWJvdXQgdG8gcnVuIChhbmQgdGhlIHJ1bidzIHNpZ25hbCkg4oCUIGBTdGFnZVJ1bm5lcmAgc2V0cyBib3RoIGJlZm9yZSBpdCBidWlsZHMgdGhlIHNjb3BlLiAqL1xuICB1c2VBdHRlbXB0KGF0dGVtcHQ6IEF0dGVtcHRDb250ZXh0IHwgdW5kZWZpbmVkLCBydW5TaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fYXR0ZW1wdCA9IGF0dGVtcHQ7XG4gICAgdGhpcy5fcnVuU2lnbmFsID0gcnVuU2lnbmFsO1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0IG5vdyBydW5uaW5nOyBgdW5kZWZpbmVkYCBmb3IgYSBzdGFnZSB0aGUgYXR0ZW1wdCBydW5uZXIgZG9lcyBub3QgcnVuLiAqL1xuICBnZXQgYXR0ZW1wdCgpOiBBdHRlbXB0Q29udGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dGVtcHQ7XG4gIH1cblxuICAvKiogVGhlIHJ1bidzIHNpZ25hbCwgYXMgYFN0YWdlUnVubmVyYCBsYXN0IHNhdyBpdC4gKi9cbiAgZ2V0IHJ1blNpZ25hbCgpOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3J1blNpZ25hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0IGBhdHRlbXB0YCBlbmRlZCB3aXRob3V0IGFuIGFuc3dlcjogZnJvbSBub3cgb24gaXRzIHNjb3BlIGlzIGZlbmNlZCDigJQgYSB3cml0ZSwgYW4gZW1pdCBvciBhIHJlYWRcbiAgICogdGhyb3VnaCBpdCBpcyByZWZ1c2VkIChgU2NvcGVGYWNhZGVgKS4gVGhlIHJ1bm5lciBjYWxscyB0aGlzIHRoZSBtb21lbnQgdGhlIGF0dGVtcHQncyBzaWduYWwgYWJvcnRzLlxuICAgKi9cbiAgZW5kQXR0ZW1wdChhdHRlbXB0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoYXR0ZW1wdCA+IHRoaXMuX2VuZGVkVGhyb3VnaCkgdGhpcy5fZW5kZWRUaHJvdWdoID0gYXR0ZW1wdDtcbiAgICAvLyBJdHMgY2FsbHMgc3RvcCBhdCB0aGUgc2FtZSBtb21lbnQsIHdpdGggdGhlIGF0dGVtcHQncyBvd24gcmVhc29uIHdoZW4gaXRzIHNpZ25hbCBhYm9ydGVkIChhIGNhcCBvciB0aGVcbiAgICAvLyBkZWFkbGluZSBpcyBhIHRpbWUgbGltaXQ6IGEgY2FsbCBpdCBjdXRzIHRpbWVkIG91dCkg4oCUIHN5bmNocm9ub3VzLCBhaGVhZCBvZiB0aGUgY2FsbHMnIG93biBsaXN0ZW5lcnMuXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2F0dGVtcHQ7XG4gICAgY29uc3Qgc2lnbmFsID0gY3VycmVudCAhPT0gdW5kZWZpbmVkICYmIGN1cnJlbnQuYXR0ZW1wdCA9PT0gYXR0ZW1wdCA/IGN1cnJlbnQuc2lnbmFsIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuZW5kQ2FsbHMoYXR0ZW1wdCwgc2lnbmFsPy5hYm9ydGVkID8gc2lnbmFsLnJlYXNvbiA6IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKiogV2hldGhlciBhdHRlbXB0IGBhdHRlbXB0YCBoYXMgZW5kZWQg4oCUIGl0cyBzY29wZSBtYXkgbm8gbG9uZ2VyIHRvdWNoIHRoZSBzdGFnZS4gKi9cbiAgaGFzQXR0ZW1wdEVuZGVkKGF0dGVtcHQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhdHRlbXB0IDw9IHRoaXMuX2VuZGVkVGhyb3VnaDtcbiAgfVxuXG4gIC8qKiBSZWNvcmQgYSB3cml0ZSBhbiBlbmRlZCBhdHRlbXB0IHRyaWVkIOKAlCBhIG5hbWUsIG5ldmVyIHRoZSB2YWx1ZS4gQXBwZW5kLW9ubHkgZXZpZGVuY2UgbGlrZSB0aGUgYXR0ZW1wdHMuICovXG4gIHJlY29yZExhdGVXcml0ZSh3cml0ZTogTGF0ZVdyaXRlKTogdm9pZCB7XG4gICAgY29uc3Qgd3JpdGVzID0gKHRoaXMuX2xhdGVXcml0ZXMgPz89IFtdKTtcbiAgICAvLyBCb3VuZGVkOiB0aGUgZmlyc3Qgb25lcyBzYXkgd2hhdCB0aGUgYWJhbmRvbmVkIGF0dGVtcHQga2VwdCBkb2luZzsgYSBsb29wIG9mIHRoZW0gYWRkcyBub3RoaW5nLlxuICAgIGlmICh3cml0ZXMubGVuZ3RoIDwgTUFYX0xBVEVfV1JJVEVTKSB3cml0ZXMucHVzaChPYmplY3QuZnJlZXplKHsgLi4ud3JpdGUgfSkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNpZGUgZWZmZWN0cyAoUDMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBUaGlzIGV4ZWN1dGlvbidzIG93biBpZGVtcG90ZW5jeSBrZXkgbWF5IGJlIG1hZGUgb2YgYSBzZWxlY3RlZCB2YWx1ZSAob3Igd2FzIGNhcnJpZWQgYnkgYSBjaGVja3BvaW50KS4gKi9cbiAgcHJpdmF0ZSBfZWZmZWN0S2V5VGFpbnRlZCA9IGZhbHNlO1xuICAvKiogQSB0b3VjaGluZyBgJGNhbGxgIHdpdGggTk8ga2V5IHN0YXJ0ZWQgaW4gdGhpcyBleGVjdXRpb24g4oCUIHRoZSBzdGFnZSBtYXkgbm90IGJlIHJlLXJ1biBieSBhIHJlc3VtZS4gKi9cbiAgcHJpdmF0ZSBfa2V5bGVzc0VmZmVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTdGFydCBhbiBleGVjdXRpb24ncyBzaWRlLWVmZmVjdCBib29ra2VlcGluZyAoYEZsb3djaGFydFRyYXZlcnNlciDCtyBleGVjdXRlU3RhZ2VgLCBiZWZvcmUgYXR0ZW1wdCAxKSDigJQgcmVzZXQsXG4gICAqIGJlY2F1c2UgYSBmcmFtZSBjYW4gYmUgcmUtdXNlZCBieSBhIGxhdGVyIGV4ZWN1dGlvbi4gYGtleVRhaW50ZWRgOiB0aGUgc3RhZ2UncyBvd24ga2V5IG1heSBiZSBtYWRlIG9mIGEgc2VsZWN0ZWRcbiAgICogdmFsdWUsIHNvIGEga2V5IGEgYCRjYWxsYCBwYXNzZXMgb24gKGAkYXR0ZW1wdCgpLmlkZW1wb3RlbmN5S2V5YCkgaXMgc2VydmVkIHRoZSBzYW1lIHdheS5cbiAgICovXG4gIGJlZ2luRWZmZWN0cyhrZXlUYWludGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5fZWZmZWN0S2V5VGFpbnRlZCA9IGtleVRhaW50ZWQ7XG4gICAgdGhpcy5fa2V5bGVzc0VmZmVjdCA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGVmZmVjdEtleVRhaW50ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2VmZmVjdEtleVRhaW50ZWQ7XG4gIH1cblxuICAvKiogQSBrZXlsZXNzIHRvdWNoaW5nIGAkY2FsbGAgc3RhcnRlZDogYW4gYGludGVycnVwdCgpYCBhZnRlciBpdCB3b3VsZCByZS1zZW5kIGl0IG9uIHJlc3VtZSAoYFN0YWdlUnVubmVyYCkuICovXG4gIG1hcmtLZXlsZXNzRWZmZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuX2tleWxlc3NFZmZlY3QgPSB0cnVlO1xuICB9XG5cbiAgZ2V0IGhhc0tleWxlc3NFZmZlY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2tleWxlc3NFZmZlY3Q7XG4gIH1cblxuICAvLyDilIDilIAgQ2FsbHMgbWFkZSBpbnNpZGUgdGhlIHN0YWdlIChQMikg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFdoZXJlIHRoaXMgZXhlY3V0aW9uJ3MgY2FsbCByZWNvcmRzIGFyZSByZXBvcnRlZCDigJQgdGhlIGVuZ2luZSBzZXRzIGl0IGJlZm9yZSB0aGUgc3RhZ2UgcnVucy4gKi9cbiAgdXNlQXR0ZW1wdFJlcG9ydGVyKFxuICAgIHJlcG9ydDogKChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQsIHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB8IHVuZGVmaW5lZCkgPT4gdm9pZCkgfCB1bmRlZmluZWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2F0dGVtcHRSZXBvcnRlciA9IHJlcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2lnbmFsIHRoZSBjYWxscyBvZiBzdGFnZSBhdHRlbXB0IGBzdGFnZUF0dGVtcHRgIHJ1biB1bmRlciBiZXNpZGVzIGl0cyBvd24gKFAyKTogYWJvcnRlZCB3aGVuIHRoYXQgYXR0ZW1wdCBpc1xuICAgKiBvdmVyIOKAlCBob3dldmVyIGl0IGVuZGVkIOKAlCBhbmQgd2hlbiB0aGUgZnJhbWUgY29tbWl0cywgc28gbm8gY2FsbCBvdXRsaXZlcyB0aGUgYXR0ZW1wdCB0aGF0IG1hZGUgaXQgKG5vXG4gICAqIGJhY2tncm91bmQgcmV0cnksIG5vIHdhaXQsIG5vIGxpc3RlbmVyIGxlZnQgb24gdGhlIHJ1bidzIHNpZ25hbCkuIEFscmVhZHkgYWJvcnRlZCBhZnRlciB0aGUgY29tbWl0LlxuICAgKi9cbiAgY2FsbHNFbmRlZFNpZ25hbChzdGFnZUF0dGVtcHQ6IG51bWJlcik6IEFib3J0U2lnbmFsIHtcbiAgICBjb25zdCBlbmRlZCA9ICh0aGlzLl9jYWxsc0VuZGVkID8/PSBuZXcgTWFwKCkpO1xuICAgIGxldCBjb250cm9sbGVyID0gZW5kZWQuZ2V0KHN0YWdlQXR0ZW1wdCk7XG4gICAgaWYgKGNvbnRyb2xsZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIGVuZGVkLnNldChzdGFnZUF0dGVtcHQsIGNvbnRyb2xsZXIpO1xuICAgICAgaWYgKHRoaXMuX2NvbW1pdHRlZCkgY29udHJvbGxlci5hYm9ydChjYWxsc0VuZGVkUmVhc29uKCkpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gIH1cblxuICAvKiogRW5kIHRoZSBjYWxscyBvZiBgc3RhZ2VBdHRlbXB0YCAoZXZlcnkgYXR0ZW1wdCdzIHdoZW4gYHVuZGVmaW5lZGApIOKAlCBgcmVhc29uYCB3aGVuIHRoZSBhdHRlbXB0J3Mgc2lnbmFsIGdhdmUgb25lLiAqL1xuICBwcml2YXRlIGVuZENhbGxzKHN0YWdlQXR0ZW1wdDogbnVtYmVyIHwgdW5kZWZpbmVkLCByZWFzb24/OiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NhbGxzRW5kZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgW2F0dGVtcHQsIGNvbnRyb2xsZXJdIG9mIHRoaXMuX2NhbGxzRW5kZWQpIHtcbiAgICAgIGlmIChzdGFnZUF0dGVtcHQgIT09IHVuZGVmaW5lZCAmJiBhdHRlbXB0ICE9PSBzdGFnZUF0dGVtcHQpIGNvbnRpbnVlO1xuICAgICAgaWYgKCFjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjb250cm9sbGVyLmFib3J0KHJlYXNvbiA/PyBjYWxsc0VuZGVkUmVhc29uKCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgbmV4dCBjYWxsJ3Mgb3JkaW5hbCB3aXRoaW4gc3RhZ2UgYXR0ZW1wdCBgc3RhZ2VBdHRlbXB0YCwgMS1iYXNlZCAoYGF0dGVtcHQvY2FsbC50cyDCtyBjYWxsU2VyaWVzYCkuICovXG4gIG5leHRDYWxsT3JkaW5hbChzdGFnZUF0dGVtcHQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgb3JkaW5hbHMgPSAodGhpcy5fY2FsbE9yZGluYWxzID8/PSBuZXcgTWFwKCkpO1xuICAgIGNvbnN0IG5leHQgPSAob3JkaW5hbHMuZ2V0KHN0YWdlQXR0ZW1wdCkgPz8gMCkgKyAxO1xuICAgIG9yZGluYWxzLnNldChzdGFnZUF0dGVtcHQsIG5leHQpO1xuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEEgY2FsbCdzIChvciBhbiBvYnNlcnZlZCkgYXR0ZW1wdCByZWNvcmQ6IGtlcHQgYmVzaWRlIHRoZSBzdGFnZSdzIG93biBhdHRlbXB0cyDigJQgdGhlIGZpcnN0XG4gICAqIHtAbGluayBNQVhfQ0FMTF9SRUNPUkRTfSwgdGhlIHJlc3QgY291bnRlZCDigJQgYW5kIHJlcG9ydGVkIHRvIHRoZSBydW4ncyBgb25BdHRlbXB0YCBlaXRoZXIgd2F5LiBMaWtlIHRoZSBzdGFnZSdzXG4gICAqIHJlY29yZHMsIE5PVCBjbGVhcmVkIGJ5IHtAbGluayBkaXNjYXJkU3RhZ2VkfTogYSBmYWlsZWQgYXR0ZW1wdCdzIGNhbGxzIGFyZSBldmlkZW5jZSB0b28uXG4gICAqL1xuICByZXBvcnRDYWxsQXR0ZW1wdChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQsIHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jYWxsUmVjb3JkcyA8IE1BWF9DQUxMX1JFQ09SRFMpIHtcbiAgICAgIHRoaXMuX2NhbGxSZWNvcmRzICs9IDE7XG4gICAgICAodGhpcy5fYXR0ZW1wdHMgPz89IFtdKS5wdXNoKHJlY29yZCk7XG4gICAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKCkgPT4gdGhpcy5jYXB0dXJlPy5saW1pdCgnYXR0ZW50aW9uLW9taXR0ZWQnKSkpLnJlY29yZEF0dGVtcHQoXG4gICAgICAgIHJlY29yZCxcbiAgICAgICAgdGhpcy5ydW50aW1lU3RhZ2VJZCxcbiAgICAgICk7XG4gICAgICB0aGlzLm5vdGVBdHRlbXB0KHJlY29yZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2F0dGVtcHRzRHJvcHBlZCArPSAxO1xuICAgICAgKHRoaXMuX2F0dGVudGlvbiA/Pz0gbmV3IFN0YWdlQXR0ZW50aW9uKCgpID0+IHRoaXMuY2FwdHVyZT8ubGltaXQoJ2F0dGVudGlvbi1vbWl0dGVkJykpKS5hdHRlbXB0RHJvcHBlZCgpO1xuICAgIH1cbiAgICB0aGlzLl9hdHRlbXB0UmVwb3J0ZXI/LihyZWNvcmQsIHN0cnVjdHVyZWRFcnJvcik7XG4gIH1cblxuICAvLyDilIDilIAgVHJlZSBuYXZpZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgKG9yIHJldHVybikgdGhpcyBjb250ZXh0J3MgbGlua2VkIHN1Y2Nlc3Nvci5cbiAgICpcbiAgICogTUVNT0laRUQ6IHRoZSBmaXJzdCBjYWxsIGNyZWF0ZXMgYHRoaXMubmV4dGA7IGV2ZXJ5IGxhdGVyIGNhbGwgcmV0dXJuc1xuICAgKiB0aGF0IFNBTUUgY29udGV4dCBhbmQgSUdOT1JFUyBpdHMgYXJndW1lbnRzLiBJbiBub3JtYWwgdHJhdmVyc2FsIGVhY2hcbiAgICogY29udGV4dCBhZHZhbmNlcyBleGFjdGx5IG9uY2UsIHNvIHRoZSBtZW1vIG5ldmVyIGJpdGVzIOKAlCBidXQgYSBjYWxsZXJcbiAgICogZXhwZWN0aW5nIGEgZnJlc2ggY29udGV4dCBmb3IgZGlmZmVyZW50IGBzdGFnZU5hbWVgL2BzdGFnZUlkYCBhcmdzIGdldHNcbiAgICogdGhlIG9sZCBvbmUgc2lsZW50bHkuIERldiBtb2RlIChgZW5hYmxlRGV2TW9kZSgpYCkgd2FybnMgb24gdGhhdFxuICAgKiBtaXNtYXRjaCAoYmFja2xvZyBCNCkuXG4gICAqL1xuICBjcmVhdGVOZXh0KHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5uZXh0KSB7XG4gICAgICB0aGlzLm5leHQgPSBuZXcgU3RhZ2VDb250ZXh0KHBhdGgsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5yZWNvcmQuc3RhdGUsICcnLCB0aGlzLnJlY29yZC5sb2csIGlzRGVjaWRlcik7XG4gICAgICB0aGlzLm5leHQucGFyZW50ID0gdGhpcztcbiAgICAgIHRoaXMubmV4dC5pbmhlcml0UnVuKHRoaXMpO1xuICAgICAgdGhpcy5uZXh0LmZhaWx1cmVTdGF0ZSA9IHRoaXMuZmFpbHVyZVN0YXRlO1xuICAgIH0gZWxzZSBpZiAoaXNEZXZNb2RlKCkgJiYgKHRoaXMubmV4dC5zdGFnZUlkICE9PSBzdGFnZUlkIHx8IHRoaXMubmV4dC5zdGFnZU5hbWUgIT09IHN0YWdlTmFtZSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50XSBTdGFnZUNvbnRleHQuY3JlYXRlTmV4dDogbmV4dCBjb250ZXh0IGFscmVhZHkgZXhpc3RzIGFzIFwiJHt0aGlzLm5leHQuc3RhZ2VOYW1lfVwiIGAgK1xuICAgICAgICAgIGAoaWQ6IFwiJHt0aGlzLm5leHQuc3RhZ2VJZH1cIikg4oCUIGFyZ3VtZW50cyBcIiR7c3RhZ2VOYW1lfVwiIChpZDogXCIke3N0YWdlSWR9XCIpIGFyZSBpZ25vcmVkIGAgK1xuICAgICAgICAgICdhbmQgdGhlIGV4aXN0aW5nIGNvbnRleHQgaXMgcmV0dXJuZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5leHQ7XG4gIH1cblxuICBjcmVhdGVDaGlsZChydW5JZDogc3RyaW5nLCBicmFuY2hJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nLCBpc0RlY2lkZXIgPSBmYWxzZSk6IFN0YWdlQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLmNoaWxkcmVuKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkID0gbmV3IFN0YWdlQ29udGV4dChydW5JZCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0aGlzLnJlY29yZC5zdGF0ZSwgYnJhbmNoSWQsIHRoaXMucmVjb3JkLmxvZywgaXNEZWNpZGVyKTtcbiAgICBjaGlsZC5wYXJlbnQgPSB0aGlzO1xuICAgIGNoaWxkLmluaGVyaXRSdW4odGhpcyk7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICBjcmVhdGVEZWNpZGVyKHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZyk6IFN0YWdlQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRydWUpO1xuICB9XG5cbiAgc2V0QXNEZWNpZGVyKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QXNGb3JrKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0ZvcmsgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIERpYWdub3N0aWNzIGRlbGVnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEBpbnRlcm5hbCBSZXRhaW5lZCBpbmNvbWluZyB2YWx1ZSBmb3IgdGhlIGZhY2FkZSdzIGxlZ2FjeSBlbWl0IGNoYW5uZWwuICovXG4gIGFkZERpYWdub3N0aWMoY2hhbm5lbDogRGlhZ25vc3RpY0NoYW5uZWwsIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuZGVidWcuYWRkKGNoYW5uZWwsIGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkTG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0RXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0RXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEVycm9yKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFcnJvcihrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgdHlwZTogRmxvd0NvbnRyb2xUeXBlLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgdGFyZ2V0U3RhZ2U/OiBzdHJpbmcgfCBzdHJpbmdbXTsgcmF0aW9uYWxlPzogc3RyaW5nOyBjb3VudD86IG51bWJlcjsgaXRlcmF0aW9uPzogbnVtYmVyIH0sXG4gICkge1xuICAgIGNvbnN0IGZsb3dNZXNzYWdlOiBGbG93TWVzc2FnZSA9IHsgdHlwZSwgZGVzY3JpcHRpb24sIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgLi4ub3B0aW9ucyB9O1xuICAgIHRoaXMuZGVidWcuYWRkRmxvd01lc3NhZ2UoZmxvd01lc3NhZ2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNuYXBzaG90IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldFN0YWdlSWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucnVuSWQgfHwgdGhpcy5ydW5JZCA9PT0gJycpIHJldHVybiB0aGlzLnN0YWdlTmFtZTtcbiAgICByZXR1cm4gYCR7dGhpcy5ydW5JZH0uJHt0aGlzLnN0YWdlTmFtZX1gO1xuICB9XG5cbiAgZ2V0U25hcHNob3QoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgLy8gSXRlcmF0aXZlIHdhbGsgKGV4cGxpY2l0IHdvcmsgc3RhY2spLCBOT1QgcmVjdXJzaW9uOiB0aGUgZXhlY3V0aW9uXG4gICAgLy8gdHJlZSBkZWVwZW5zIGJ5IG9uZSBsZXZlbCBwZXIgZXhlY3V0ZWQgc3RhZ2UgYWxvbmcgYG5leHRgIGNoYWlucywgYW5kXG4gICAgLy8gdGhlIHRyYW1wb2xpbmVkIHRyYXZlcnNlciBhbGxvd3MgY2hhaW5zL2xvb3BzIG9mIHRlbnMgb2YgdGhvdXNhbmRzIG9mXG4gICAgLy8gc3RhZ2VzIOKAlCBmYXIgZGVlcGVyIHRoYW4gYSByZWN1cnNpdmUgc2VyaWFsaXplciBjYW4gd2FsayBiZWZvcmVcbiAgICAvLyBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuc25hcHNob3RTZWxmKCk7XG4gICAgY29uc3Qgd29yazogQXJyYXk8eyBjdHg6IFN0YWdlQ29udGV4dDsgc25hcDogU3RhZ2VTbmFwc2hvdCB9PiA9IFt7IGN0eDogdGhpcywgc25hcDogcm9vdCB9XTtcbiAgICB3aGlsZSAod29yay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IGN0eCwgc25hcCB9ID0gd29yay5wb3AoKSE7XG4gICAgICBpZiAoY3R4Lm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dFNuYXAgPSBjdHgubmV4dC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgc25hcC5uZXh0ID0gbmV4dFNuYXA7XG4gICAgICAgIHdvcmsucHVzaCh7IGN0eDogY3R4Lm5leHQsIHNuYXA6IG5leHRTbmFwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGN0eC5jaGlsZHJlbikge1xuICAgICAgICBzbmFwLmNoaWxkcmVuID0gY3R4LmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlsZFNuYXAgPSBjaGlsZC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgICB3b3JrLnB1c2goeyBjdHg6IGNoaWxkLCBzbmFwOiBjaGlsZFNuYXAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkU25hcDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IG9mIFRISVMgY29udGV4dCdzIG93biBmaWVsZHMg4oCUIGBuZXh0YC9gY2hpbGRyZW5gIGFyZSBmaWxsZWRcbiAgICogIGluIGJ5IHRoZSBpdGVyYXRpdmUgd2FsayBpbiBgZ2V0U25hcHNob3RgLiAqL1xuICBwcml2YXRlIHNuYXBzaG90U2VsZigpOiBTdGFnZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdDogU3RhZ2VTbmFwc2hvdCA9IHtcbiAgICAgIGlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCB8fCB1bmRlZmluZWQsXG4gICAgICBuYW1lOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIGlzRGVjaWRlcjogdGhpcy5pc0RlY2lkZXIsXG4gICAgICBpc0Zvcms6IHRoaXMuaXNGb3JrLFxuICAgICAgbG9nczogdGhpcy5kZWJ1Zy5sb2dDb250ZXh0LFxuICAgICAgZXJyb3JzOiB0aGlzLmRlYnVnLmVycm9yQ29udGV4dCxcbiAgICAgIG1ldHJpY3M6IHRoaXMuZGVidWcubWV0cmljQ29udGV4dCxcbiAgICAgIGV2YWxzOiB0aGlzLmRlYnVnLmV2YWxDb250ZXh0LFxuICAgIH07XG4gICAgY29uc3Qgc3RhZ2VXcml0ZXMgPSB0aGlzLnJldGFpbmVkV3JpdGVzKCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHN0YWdlV3JpdGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBFeHRyYWN0IHZhbHVlcyBvbmx5IGZvciB0aGUgc25hcHNob3QgKHN0cmlwIG9wZXJhdGlvbiBtZXRhZGF0YSlcbiAgICAgIGNvbnN0IHdyaXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2ssIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhzdGFnZVdyaXRlcykpIHtcbiAgICAgICAgd3JpdGVzW2tdID0gZW50cnkudmFsdWU7XG4gICAgICB9XG4gICAgICBzbmFwc2hvdC5zdGFnZVdyaXRlcyA9IHdyaXRlcztcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN0YWdlUmVhZHMgPSB0aGlzLl9zdGFnZVJlYWRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgc25hcHNob3QuZGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdWJmbG93SWQpIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dJZCA9IHRoaXMuc3ViZmxvd0lkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QuZmxvd01lc3NhZ2VzID0gdGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXM7XG4gICAgfVxuICAgIC8vIEEgY29weSBvZiB0aGUgbGlzdCAodGhlIHJlY29yZHMgdGhlbXNlbHZlcyBhcmUgZnJvemVuKTogYSByZWFkZXIgb2Ygb25lIHNuYXBzaG90IG5ldmVyIHNlZXMgYSBsYXRlclxuICAgIC8vIGF0dGVtcHQgYXJyaXZlIGluIGl0LCBhbmQgbmV2ZXIgZWRpdHMgdGhlIGZyYW1lJ3Mgb3duIGxpc3QuXG4gICAgaWYgKHRoaXMuX2F0dGVtcHRzKSBzbmFwc2hvdC5hdHRlbXB0cyA9IE9iamVjdC5mcmVlemUoWy4uLnRoaXMuX2F0dGVtcHRzXSk7XG4gICAgaWYgKHRoaXMuX2F0dGVtcHRTdW1tYXJ5KSBzbmFwc2hvdC5hdHRlbXB0U3VtbWFyeSA9IHRoaXMuX2F0dGVtcHRTdW1tYXJ5O1xuICAgIGlmICh0aGlzLl9sYXRlV3JpdGVzKSBzbmFwc2hvdC5sYXRlV3JpdGVzID0gT2JqZWN0LmZyZWV6ZShbLi4udGhpcy5fbGF0ZVdyaXRlc10pO1xuICAgIGlmICh0aGlzLl9hdHRlbXB0c0Ryb3BwZWQgPiAwKSBzbmFwc2hvdC5hdHRlbXB0c0Ryb3BwZWQgPSB0aGlzLl9hdHRlbXB0c0Ryb3BwZWQ7XG4gICAgY29uc3QgYXR0ZW50aW9uID0gdGhpcy5fYXR0ZW50aW9uPy5zbmFwc2hvdCgpO1xuICAgIGlmIChhdHRlbnRpb24/Lmxlbmd0aCkgc25hcHNob3QuYXR0ZW50aW9uID0gYXR0ZW50aW9uO1xuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxufVxuIl19
|