footprintjs 10.4.0 → 10.6.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.
Files changed (122) hide show
  1. package/README.md +63 -25
  2. package/dist/esm/index.d.ts +1 -0
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/lib/capture/historyData.d.ts +6 -2
  5. package/dist/esm/lib/capture/historyData.js +18 -1
  6. package/dist/esm/lib/capture/historyNote.d.ts +2 -2
  7. package/dist/esm/lib/capture/historyNote.js +11 -6
  8. package/dist/esm/lib/capture/historyTypes.d.ts +1 -1
  9. package/dist/esm/lib/capture/historyTypes.js +1 -1
  10. package/dist/esm/lib/capture/nativeSourceAddress.d.ts +3 -0
  11. package/dist/esm/lib/capture/nativeSourceAddress.js +15 -0
  12. package/dist/esm/lib/capture/readSources.d.ts +20 -3
  13. package/dist/esm/lib/capture/readSources.js +41 -12
  14. package/dist/esm/lib/capture/sinkSettlement.d.ts +6 -0
  15. package/dist/esm/lib/capture/sinkSettlement.js +10 -0
  16. package/dist/esm/lib/capture/sourceOwnership.d.ts +21 -0
  17. package/dist/esm/lib/capture/sourceOwnership.js +133 -0
  18. package/dist/esm/lib/capture/sourceOwnershipFormat.d.ts +35 -0
  19. package/dist/esm/lib/capture/sourceOwnershipFormat.js +31 -0
  20. package/dist/esm/lib/capture/sourceReadCounts.d.ts +18 -0
  21. package/dist/esm/lib/capture/sourceReadCounts.js +27 -0
  22. package/dist/esm/lib/capture/sourceReferenceBudget.d.ts +10 -0
  23. package/dist/esm/lib/capture/sourceReferenceBudget.js +21 -0
  24. package/dist/esm/lib/capture/storedReadSourceCounts.d.ts +7 -0
  25. package/dist/esm/lib/capture/storedReadSourceCounts.js +82 -0
  26. package/dist/esm/lib/capture/storedReadSources.d.ts +4 -0
  27. package/dist/esm/lib/capture/storedReadSources.js +120 -0
  28. package/dist/esm/lib/capture/storedSourceOwnership.d.ts +8 -0
  29. package/dist/esm/lib/capture/storedSourceOwnership.js +100 -0
  30. package/dist/esm/lib/engine/handlers/StageRunner.js +2 -1
  31. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +11 -2
  32. package/dist/esm/lib/engine/handlers/servedSubflowResults.js +13 -2
  33. package/dist/esm/lib/engine/types.d.ts +2 -1
  34. package/dist/esm/lib/engine/types.js +1 -1
  35. package/dist/esm/lib/memory/StageContext.d.ts +4 -0
  36. package/dist/esm/lib/memory/StageContext.js +40 -7
  37. package/dist/esm/lib/memory/frameTypes.d.ts +5 -0
  38. package/dist/esm/lib/memory/frameTypes.js +1 -1
  39. package/dist/esm/lib/memory/logAddress.d.ts +3 -0
  40. package/dist/esm/lib/memory/logAddress.js +7 -0
  41. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +2 -0
  42. package/dist/esm/lib/runner/ExecutionRuntime.js +65 -8
  43. package/dist/esm/lib/runner/FlowChartExecutor.js +4 -2
  44. package/dist/esm/lib/runner/captureHistory.js +16 -10
  45. package/dist/esm/lib/runner/readStoredCapture.d.ts +4 -2
  46. package/dist/esm/lib/runner/readStoredCapture.js +3 -3
  47. package/dist/esm/lib/runner/recordSink.js +2 -10
  48. package/dist/esm/lib/runner/storedCaptureAdmission.js +10 -8
  49. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  50. package/dist/esm/lib/sinks/indexedAdmission.d.ts +14 -0
  51. package/dist/esm/lib/sinks/indexedAdmission.js +77 -0
  52. package/dist/esm/lib/sinks/indexedIO.d.ts +14 -0
  53. package/dist/esm/lib/sinks/indexedIO.js +96 -0
  54. package/dist/esm/lib/sinks/indexedRecordFile.d.ts +3 -0
  55. package/dist/esm/lib/sinks/indexedRecordFile.js +120 -0
  56. package/dist/esm/lib/sinks/indexedScan.d.ts +6 -0
  57. package/dist/esm/lib/sinks/indexedScan.js +73 -0
  58. package/dist/esm/lib/sinks/indexedTypes.d.ts +60 -0
  59. package/dist/esm/lib/sinks/indexedTypes.js +2 -0
  60. package/dist/esm/sinks.d.ts +2 -0
  61. package/dist/esm/sinks.js +2 -1
  62. package/dist/index.js +1 -1
  63. package/dist/lib/capture/historyData.js +21 -2
  64. package/dist/lib/capture/historyNote.js +9 -4
  65. package/dist/lib/capture/historyTypes.js +1 -1
  66. package/dist/lib/capture/nativeSourceAddress.js +19 -0
  67. package/dist/lib/capture/readSources.js +44 -13
  68. package/dist/lib/capture/sinkSettlement.js +14 -0
  69. package/dist/lib/capture/sourceOwnership.js +138 -0
  70. package/dist/lib/capture/sourceOwnershipFormat.js +35 -0
  71. package/dist/lib/capture/sourceReadCounts.js +31 -0
  72. package/dist/lib/capture/sourceReferenceBudget.js +25 -0
  73. package/dist/lib/capture/storedReadSourceCounts.js +86 -0
  74. package/dist/lib/capture/storedReadSources.js +124 -0
  75. package/dist/lib/capture/storedSourceOwnership.js +104 -0
  76. package/dist/lib/engine/handlers/StageRunner.js +2 -1
  77. package/dist/lib/engine/handlers/SubflowExecutor.js +11 -2
  78. package/dist/lib/engine/handlers/servedSubflowResults.js +13 -2
  79. package/dist/lib/engine/types.js +1 -1
  80. package/dist/lib/memory/StageContext.js +40 -7
  81. package/dist/lib/memory/frameTypes.js +1 -1
  82. package/dist/lib/memory/logAddress.js +11 -0
  83. package/dist/lib/runner/ExecutionRuntime.js +65 -8
  84. package/dist/lib/runner/FlowChartExecutor.js +4 -2
  85. package/dist/lib/runner/captureHistory.js +15 -9
  86. package/dist/lib/runner/readStoredCapture.js +2 -2
  87. package/dist/lib/runner/recordSink.js +6 -14
  88. package/dist/lib/runner/storedCaptureAdmission.js +9 -7
  89. package/dist/lib/scope/ScopeFacade.js +2 -2
  90. package/dist/lib/sinks/indexedAdmission.js +85 -0
  91. package/dist/lib/sinks/indexedIO.js +106 -0
  92. package/dist/lib/sinks/indexedRecordFile.js +124 -0
  93. package/dist/lib/sinks/indexedScan.js +77 -0
  94. package/dist/lib/sinks/indexedTypes.js +3 -0
  95. package/dist/sinks.js +4 -2
  96. package/dist/types/index.d.ts +1 -0
  97. package/dist/types/lib/capture/historyData.d.ts +6 -2
  98. package/dist/types/lib/capture/historyNote.d.ts +2 -2
  99. package/dist/types/lib/capture/historyTypes.d.ts +1 -1
  100. package/dist/types/lib/capture/nativeSourceAddress.d.ts +3 -0
  101. package/dist/types/lib/capture/readSources.d.ts +20 -3
  102. package/dist/types/lib/capture/sinkSettlement.d.ts +6 -0
  103. package/dist/types/lib/capture/sourceOwnership.d.ts +21 -0
  104. package/dist/types/lib/capture/sourceOwnershipFormat.d.ts +35 -0
  105. package/dist/types/lib/capture/sourceReadCounts.d.ts +18 -0
  106. package/dist/types/lib/capture/sourceReferenceBudget.d.ts +10 -0
  107. package/dist/types/lib/capture/storedReadSourceCounts.d.ts +7 -0
  108. package/dist/types/lib/capture/storedReadSources.d.ts +4 -0
  109. package/dist/types/lib/capture/storedSourceOwnership.d.ts +8 -0
  110. package/dist/types/lib/engine/types.d.ts +2 -1
  111. package/dist/types/lib/memory/StageContext.d.ts +4 -0
  112. package/dist/types/lib/memory/frameTypes.d.ts +5 -0
  113. package/dist/types/lib/memory/logAddress.d.ts +3 -0
  114. package/dist/types/lib/runner/ExecutionRuntime.d.ts +2 -0
  115. package/dist/types/lib/runner/readStoredCapture.d.ts +4 -2
  116. package/dist/types/lib/sinks/indexedAdmission.d.ts +14 -0
  117. package/dist/types/lib/sinks/indexedIO.d.ts +14 -0
  118. package/dist/types/lib/sinks/indexedRecordFile.d.ts +3 -0
  119. package/dist/types/lib/sinks/indexedScan.d.ts +6 -0
  120. package/dist/types/lib/sinks/indexedTypes.d.ts +60 -0
  121. package/dist/types/sinks.d.ts +2 -0
  122. package/package.json +1 -1
@@ -11,8 +11,8 @@
11
11
  * frame writes (`runAddress.ts`), the dev-mode warnings, the commit observer
12
12
  * - DiagnosticCollector for logs, errors, metrics
13
13
  */
14
- import { buildAttemptId } from 'foottrace';
15
14
  import { RecordFrame } from 'foottrace/write';
15
+ import { EMPTY_SOURCE_READ_COUNTS, SourceReadCounter } from '../capture/sourceReadCounts.js';
16
16
  import { summarizeReadValue, summarizeWriteValue } from '../capture/summarize.js';
17
17
  import { isDevMode } from '../devMode.js';
18
18
  import { NativeFailureState } from '../errors/terminalFailure.js';
@@ -46,6 +46,9 @@ export class StageContext {
46
46
  /** @internal Stamped before observers; never inherited by another frame or persisted. */
47
47
  bindFailureIdentity(runId, runtimeStageId) {
48
48
  this.#failureIdentity = Object.freeze({ runId, runtimeStageId });
49
+ this.sourceInvocations = 0;
50
+ if (this.readSources?.active)
51
+ this.readSources.ownership?.begin(runId, runtimeStageId, runAddress(this.namespaceId));
49
52
  }
50
53
  /**
51
54
  * The record half of this frame (`RecordFrame.ts`, L3, C3): the heap and,
@@ -73,7 +76,9 @@ export class StageContext {
73
76
  capture;
74
77
  /** Source coverage, shared only by frames of this runtime. */
75
78
  readSources;
79
+ sourceReadCounter;
76
80
  sourceAttempt;
81
+ sourceInvocations = 0;
77
82
  stageName = '';
78
83
  /** Unique stage identifier from the builder (matches spec node id). */
79
84
  stageId;
@@ -434,6 +439,8 @@ export class StageContext {
434
439
  if (this.record.hasStaged && frame.namespaceId !== this.namespaceId) {
435
440
  throw new Error(`[footprint] StageContext.useAddressOf: '${this.stageId}' has already staged writes at its own address.`);
436
441
  }
442
+ if (this.readSources?.active && this.#failureIdentity && frame.namespaceId !== this.namespaceId)
443
+ this.readSources.ownership?.limit('namespace-changed');
437
444
  this.addressRunId = frame.namespaceId;
438
445
  this.record.useAddress(runAddress(this.namespaceId));
439
446
  }
@@ -584,10 +591,15 @@ export class StageContext {
584
591
  }
585
592
  readWithNativeSource(path, key, privacy) {
586
593
  const identity = this.#failureIdentity;
594
+ const counts = this.readSources?.active && identity && key !== undefined
595
+ ? (this.sourceReadCounter ??= new SourceReadCounter())
596
+ : undefined;
587
597
  let judged = false;
588
598
  let hidden = false;
589
599
  const verdict = () => {
590
600
  judged = true;
601
+ if (counts && !counts.observe())
602
+ this.readSources?.limit('source-capture-failed');
591
603
  const result = privacy();
592
604
  hidden = result !== 'visible';
593
605
  return result;
@@ -600,7 +612,14 @@ export class StageContext {
600
612
  verdict();
601
613
  }
602
614
  else {
603
- value = this.record.readWithSource(path, key, { runtimeStageId: identity.runtimeStageId, ...(this.sourceAttempt && { attemptId: this.sourceAttempt }) }, verdict).value;
615
+ if (!this.sourceAttempt)
616
+ this.readSources?.ownership?.limit('attempt-unavailable');
617
+ const read = this.record.readWithSource(path, key, { runtimeStageId: identity.runtimeStageId, ...(this.sourceAttempt && { attemptId: this.sourceAttempt }) }, verdict);
618
+ value = read.value;
619
+ if (read.occurrence && this.readSources?.active) {
620
+ counts?.retain(read.occurrence.source.kind);
621
+ this.readSources.ownership?.checkSelectedAddress(identity.runtimeStageId, read.occurrence.stateAddress);
622
+ }
604
623
  }
605
624
  }
606
625
  catch (error) {
@@ -807,6 +826,7 @@ export class StageContext {
807
826
  // The record's half (`RecordFrame · commit` → `recordCommit.ts`). No buffer
808
827
  // = no write ever built one (#13): the commit is empty by construction,
809
828
  // recorded with ZERO clones. The names are read once the payload is built.
829
+ const commitIndex = this.record.log?.length;
810
830
  this.record.commit(() => ({
811
831
  stage: this.stageName,
812
832
  stageId: this.stageId,
@@ -815,6 +835,8 @@ export class StageContext {
815
835
  tags: this.tags,
816
836
  phase: continuation,
817
837
  }));
838
+ if (this.readSources?.active && this.#failureIdentity && commitIndex !== undefined)
839
+ this.readSources.ownership?.commit(this.#failureIdentity.runtimeStageId, commitIndex);
818
840
  // The observer (ScopeFacade) sees the tracked mutations, THEN the staging
819
841
  // state is released (#13b), so it sees the world as it was. D2's markers
820
842
  // and the declared tags release with it — one stamp per execution, so the
@@ -918,13 +940,20 @@ export class StageContext {
918
940
  }
919
941
  /** The attempt about to run (and the run's signal) — `StageRunner` sets both before it builds the scope. */
920
942
  useAttempt(attempt, runSignal) {
921
- this.sourceAttempt =
922
- attempt && this.#failureIdentity
923
- ? buildAttemptId(this.#failureIdentity.runtimeStageId, attempt.attempt)
924
- : undefined;
943
+ // Scope preparation can read or throw before the function is entered. Only the actual-entry
944
+ // funnel may grant source identity; the real retry context still belongs to the scope.
945
+ this.sourceAttempt = undefined;
925
946
  this._attempt = attempt;
926
947
  this._runSignal = runSignal;
927
948
  }
949
+ /** Native function-entry fact, including the direct one-call path with no retry runner. */
950
+ beginSourceInvocation(attempt) {
951
+ if (!this.readSources?.active || !this.#failureIdentity)
952
+ return;
953
+ this.sourceInvocations++;
954
+ // This is the engine observing the call it is about to make, not a reader guessing an old attempt.
955
+ this.sourceAttempt = this.readSources.ownership?.attempt(this.#failureIdentity.runtimeStageId, attempt?.attempt ?? 1);
956
+ }
928
957
  /** The attempt now running; `undefined` for a stage the attempt runner does not run. */
929
958
  get attempt() {
930
959
  return this._attempt;
@@ -1162,6 +1191,10 @@ export class StageContext {
1162
1191
  metrics: this.debug.metricContext,
1163
1192
  evals: this.debug.evalContext,
1164
1193
  };
1194
+ if (this.readSources?.observing) {
1195
+ snapshot.readSourceCounts = this.sourceReadCounter?.snapshot() ?? EMPTY_SOURCE_READ_COUNTS;
1196
+ snapshot.readSourceInvocations = this.sourceInvocations;
1197
+ }
1165
1198
  const stageWrites = this.retainedWrites();
1166
1199
  if (Object.keys(stageWrites).length > 0) {
1167
1200
  // Extract values only for the snapshot (strip operation metadata)
@@ -1199,4 +1232,4 @@ export class StageContext {
1199
1232
  return snapshot;
1200
1233
  }
1201
1234
  }
1202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUdILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSzlDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUErQixrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9GLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RyxPQUFPLEVBQTBCLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHdkYsT0FBTyxFQUNMLEtBQUssRUFDTCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5FLG1IQUFtSDtBQUNuSCxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFFNUI7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQztBQUVyQyx1SEFBdUg7QUFDdkgsU0FBUyxnQkFBZ0I7SUFDdkIsT0FBTyxJ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R0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ2xELENBQUM7UUFDRCxzR0FBc0c7UUFDdEcsOERBQThEO1FBQzlELElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxRQUFRLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksSUFBSSxDQUFDLGVBQWU7WUFBRSxRQUFRLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDekUsSUFBSSxJQUFJLENBQUMsV0FBVztZQUFFLFFBQVEsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDakYsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQztZQUFFLFFBQVEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ2hGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDOUMsSUFBSSxTQUFTLEVBQUUsTUFBTTtZQUFFLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3RELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RhZ2VDb250ZXh0IOKAlCBFeGVjdXRpb24gY29udGV4dCBmb3IgYSBzaW5nbGUgc3RhZ2UgaW4gYSBmbG93Y2hhcnQgcnVuXG4gKlxuICogTGlrZSBhIHN0YWNrIGZyYW1lIGluIGEgY29tcGlsZXIvcnVudGltZTpcbiAqIC0gQSBSZWNvcmRGcmFtZSDigJQgdGhlIHJlY29yZCBoYWxmIChDMyk6IHRoZSBoZWFwLCB0aGUgYWRkcmVzcywgdGhlXG4gKiAgIGZpcnN0LXRvdWNoIGJhc2UsIHRoZSBsYXp5IHRyYW5zYWN0aW9uIGJ1ZmZlciBhbmQgZXZlcnkgd3JpdGUncyBzY3J1YlxuICogICAoQzQpLCB0aGUgcmVhZEtleXMgbGlzdFxuICogLSBMaW5rcyB0byBwYXJlbnQvY2hpbGQvbmV4dCBjb250ZXh0cyAoY2FsbCBzdGFjayBmcmFtZXMpXG4gKiAtIFdoYXQgYmVsb25ncyB0byBhIHN0YWdlIGluc2lkZSBhIHJ1bjogcmV0ZW50aW9uIG9mIHJlYWRzIGFuZCB3cml0ZXMsIHRoZVxuICogICByZWRhY3Rpb24gZGVjaXNpb24gcGVyIHdyaXRlIChgcmVkYWN0aW9uLnRzIMK3IGRlY2lkZVdyaXRlYCkgYW5kIHdoZXJlIHRoZVxuICogICBmcmFtZSB3cml0ZXMgKGBydW5BZGRyZXNzLnRzYCksIHRoZSBkZXYtbW9kZSB3YXJuaW5ncywgdGhlIGNvbW1pdCBvYnNlcnZlclxuICogLSBEaWFnbm9zdGljQ29sbGVjdG9yIGZvciBsb2dzLCBlcnJvcnMsIG1ldHJpY3NcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdFBoYXNlLCBFbWl0U291cmNlUG9zaXRpb24sIFVudHJhY2tlZFNvdXJjZSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgeyBidWlsZEF0dGVtcHRJZCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50TG9nLCBTaGFyZWRNZW1vcnksIFdyaXRlVmVyYiB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5pbXBvcnQgeyBSZWNvcmRGcmFtZSB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgQXR0ZW1wdENvbnRleHQsIEF0dGVtcHRSZWNvcmQsIEF0dGVtcHRTdW1tYXJ5LCBMYXRlV3JpdGUgfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTmF0aXZlQ2FwdHVyZSB9IGZyb20gJy4uL2NhcHR1cmUvbmF0aXZlQ292ZXJhZ2UuanMnO1xuaW1wb3J0IHR5cGUgeyBFbmdpbmVSZWFkU291cmNlQ2FwdHVyZSB9IGZyb20gJy4uL2NhcHR1cmUvcmVhZFNvdXJjZXMuanMnO1xuaW1wb3J0IHsgc3VtbWFyaXplUmVhZFZhbHVlLCBzdW1tYXJpemVXcml0ZVZhbHVlIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0cnVjdHVyZWRFcnJvckluZm8gfSBmcm9tICcuLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB7IHR5cGUgVGVybWluYWxGYWlsdXJlQ29udGV4dCwgTmF0aXZlRmFpbHVyZVN0YXRlIH0gZnJvbSAnLi4vZXJyb3JzL3Rlcm1pbmFsRmFpbHVyZS5qcyc7XG5pbXBvcnQgeyBTdGFnZUF0dGVudGlvbiB9IGZyb20gJy4vYXR0ZW50aW9uLmpzJztcbmltcG9ydCB7IGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlLCBjb21taXR0ZWRNdXRhdGlvbk1lc3NhZ2UsIGZpcnN0RGlmZmVyaW5nUGF0aCB9IGZyb20gJy4vYm9ycm93ZWRNdXRhdGlvbi5qcyc7XG5pbXBvcnQgeyB0eXBlIERpYWdub3N0aWNDaGFubmVsLCBEaWFnbm9zdGljQ29sbGVjdG9yIH0gZnJvbSAnLi9EaWFnbm9zdGljQ29sbGVjdG9yLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd0NvbnRyb2xUeXBlLCBGbG93TWVzc2FnZSwgUmVhZFRyYWNraW5nTW9kZSwgU3RhZ2VTbmFwc2hvdCwgV3JpdGVUcmFja2luZ01vZGUgfSBmcm9tICcuL2ZyYW1lVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25WZXJkaWN0IH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHtcbiAgQ0xFQVIsXG4gIGRlY2lkZVdyaXRlLFxuICBpbmhlcml0QnlJZGVudGl0eSxcbiAgbWFya1N0YWdlZFdyaXRlLFxuICBSZWRhY3Rpb25SdWxlLFxuICBTQ09QRV9QTEFDRUhPTERFUixcbiAgc2NydWJPZixcbiAgdXNlcktleU9mLFxufSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBydW5BZGRyZXNzIH0gZnJvbSAnLi9ydW5BZGRyZXNzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHsgREVGQVVMVF9SVU5fUE9MSUNZLCB3aXRoUmVkYWN0aW9uIH0gZnJvbSAnLi9ydW5Qb2xpY3kuanMnO1xuXG4vKiogSG93IG1hbnkgbGF0ZSB3cml0ZXMgYSBzdGFnZSBrZWVwcyDigJQgYW4gYWJhbmRvbmVkIGF0dGVtcHQgdGhhdCBsb29wcyBtdXN0IG5vdCBncm93IHRoZSByZWNvcmQgd2l0aG91dCBib3VuZC4gKi9cbmNvbnN0IE1BWF9MQVRFX1dSSVRFUyA9IDEwMDtcblxuLyoqXG4gKiBIb3cgbWFueSBjYWxsIGFuZCBvYnNlcnZlZCBhdHRlbXB0IHJlY29yZHMgb25lIHN0YWdlIGV4ZWN1dGlvbiBrZWVwcyAoUDIpIOKAlCBhIHN0YWdlIHRoYXQgY2FsbHMgaW4gYSBsb29wIG11c3RcbiAqIG5vdCBncm93IHRoZSBleGVjdXRpb24gdHJlZSB3aXRob3V0IGJvdW5kLiBUaGUgcmVzdCBhcmUgY291bnRlZCAoYFN0YWdlU25hcHNob3QuYXR0ZW1wdHNEcm9wcGVkYCkgYW5kIHN0aWxsXG4gKiBmaXJlZCBvbiBgb25BdHRlbXB0YC4gQSBzdGFnZSdzIE9XTiBhdHRlbXB0IHJlY29yZHMgYXJlIG5ldmVyIGRpc3BsYWNlZDogaXRzIHBvbGljeSdzIGNlaWxpbmcgYm91bmRzIHRoZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfQ0FMTF9SRUNPUkRTID0gMTAwMDtcblxuLyoqIFdoeSBhIGNhbGwgc3RvcHBlZCB3aGVuIHRoZSBzdGFnZSBhdHRlbXB0IHRoYXQgbWFkZSBpdCBlbmRlZCB3aXRob3V0IGEgcmVhc29uIG9mIGl0cyBvd24gKGl0IHJldHVybmVkIG9yIHRocmV3KS4gKi9cbmZ1bmN0aW9uIGNhbGxzRW5kZWRSZWFzb24oKTogRXJyb3Ige1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgICdbZm9vdHByaW50XSAkY2FsbDogdGhlIHN0YWdlIGF0dGVtcHQgdGhhdCBtYWRlIHRoaXMgY2FsbCBoYXMgZW5kZWQg4oCUIHRoZSBjYWxsIHN0b3BzLCBhbmQgbm90aGluZyBpdCByZWNvcmRzICcgK1xuICAgICAgJ2xhbmRzIG9uIHRoZSBzdGFnZS4gQXdhaXQgZXZlcnkgY2FsbCB0aGUgc3RhZ2UgbWFrZXMuJyxcbiAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIFN0YWdlQ29udGV4dCB7XG4gIC8qKiBAaW50ZXJuYWwgT3duZXJzaGlwIG9mIGFuIGVzY2FwaW5nIGZhaWx1cmUuIFNoYXJlZCBvbmx5IGJ5IHNlcXVlbnRpYWwgZnJhbWVzLCBuZXZlciBzZXJpYWxpemVkLiAqL1xuICBmYWlsdXJlU3RhdGUgPSBuZXcgTmF0aXZlRmFpbHVyZVN0YXRlKCk7XG4gICNmYWlsdXJlSWRlbnRpdHk/OiBOb25OdWxsYWJsZTxUZXJtaW5hbEZhaWx1cmVDb250ZXh0WydzdGFnZSddPjtcblxuICAvKiogQGludGVybmFsIFRoZSBuYXRpdmUgZnJhbWUgc3RhbXAsIGluZGVwZW5kZW50IG9mIG11dGFibGUgcmVjb3JkZXIgZXZlbnQgY29udGV4dC4gKi9cbiAgZ2V0IGZhaWx1cmVJZGVudGl0eSgpOiBOb25OdWxsYWJsZTxUZXJtaW5hbEZhaWx1cmVDb250ZXh0WydzdGFnZSddPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2ZhaWx1cmVJZGVudGl0eTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgU3RhbXBlZCBiZWZvcmUgb2JzZXJ2ZXJzOyBuZXZlciBpbmhlcml0ZWQgYnkgYW5vdGhlciBmcmFtZSBvciBwZXJzaXN0ZWQuICovXG4gIGJpbmRGYWlsdXJlSWRlbnRpdHkocnVuSWQ6IHN0cmluZywgcnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuI2ZhaWx1cmVJZGVudGl0eSA9IE9iamVjdC5mcmVlemUoeyBydW5JZCwgcnVudGltZVN0YWdlSWQgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlY29yZCBoYWxmIG9mIHRoaXMgZnJhbWUgKGBSZWNvcmRGcmFtZS50c2AsIEwzLCBDMyk6IHRoZSBoZWFwIGFuZCxcbiAgICogd2hlbiB0aGUgcnVuIGtlZXBzIHRoZW0sIHRoZSByZWRhY3RlZCBtaXJyb3IgYW5kIHRoZSBsb2c7IHRoZSBhZGRyZXNzO1xuICAgKiB0aGUgZmlyc3QtdG91Y2ggYmFzZTsgdGhlIGxhenkgdHJhbnNhY3Rpb24gYnVmZmVyOyB0aGUgcmVhZEtleXMgbGlzdC5cbiAgICogRXZlcnkgc3RhdGUgcmVhZCBvZiB0aGlzIGZyYW1lIGdvZXMgdGhyb3VnaCBpdCwgYW5kIHNvIGRvZXMgZXZlcnlcbiAgICogY29tbWl0LiBUaGUgbWlycm9yIGlzIHByZXNlbnQgKipvbmx5Kiogd2hlbiB0aGUgcnVuJ3MgcG9saWN5IGtlZXBzIGFcbiAgICogcmVkYWN0ZWQgdmlldyAoYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkKSDigJQgcmVhZCB2aWFcbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yLmdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCwgdGhlIGZvdW5kYXRpb24gZm9yXG4gICAqIHNoYXJpbmcgYSB0cmFjZSB3aXRob3V0IGxlYWtpbmcgcmF3IFBJSSB0aHJvdWdoIGBzaGFyZWRTdGF0ZWAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlY29yZDogUmVjb3JkRnJhbWU7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgcG9saWN5IOKAlCB0aGUgZm91ciBkaWFscywgdGhlIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yIGZsYWdcbiAgICogKGBydW5Qb2xpY3kudHNgLCBGNSkuIEhlbGQgQlkgUkVGRVJFTkNFOiBvbmUgZnJvemVuIG9iamVjdCBwZXIgcnVuIChhbmRcbiAgICogcGVyIHJlc3VtZSksIHNoYXJlZCBieSBldmVyeSBmcmFtZSBvZiB0aGUgcnVuLCBhIHN1YmZsb3cncyBpbmNsdWRlZCDigJRcbiAgICoge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH0gcGFzcyB0aGUgcmVmZXJlbmNlXG4gICAqICh7QGxpbmsgaW5oZXJpdFJ1bn0pLCB0aGUgcnVudGltZSBpbnN0YWxscyBpdCBvbiBpdHMgcm9vdFxuICAgKiAoe0BsaW5rIHVzZVBvbGljeX0pLiBOZXZlciBlZGl0ZWQ7IGEgY2hhbmdlIGlzIGEgbmV3IG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgcG9saWN5OiBSdW5Qb2xpY3kgPSBERUZBVUxUX1JVTl9QT0xJQ1k7XG4gIC8qKiBUaGUgZW1pdHRpbmcgZnJhbWUncyBsb2dpY2FsIGxlZywgbmV2ZXIgdGhlIG11dGFibGUgZXhlY3V0b3IncyBjdXJyZW50IGxlZy4gKi9cbiAgcHJpdmF0ZSBlbWl0UnVuSWQ/OiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBuYXRpdmUgcm9vdC1sb2cgY29sbGVjdG9yOyBjb3BpZWQgdG8gc2FtZS1sb2cgZnJhbWVzLCBuZXZlciBjaGlsZCBydW50aW1lcy4gKi9cbiAgY2FwdHVyZT86IE5hdGl2ZUNhcHR1cmU7XG4gIC8qKiBTb3VyY2UgY292ZXJhZ2UsIHNoYXJlZCBvbmx5IGJ5IGZyYW1lcyBvZiB0aGlzIHJ1bnRpbWUuICovXG4gIHJlYWRTb3VyY2VzPzogRW5naW5lUmVhZFNvdXJjZUNhcHR1cmU7XG4gIHByaXZhdGUgc291cmNlQXR0ZW1wdD86IHN0cmluZztcblxuICBwdWJsaWMgc3RhZ2VOYW1lID0gJyc7XG4gIC8qKiBVbmlxdWUgc3RhZ2UgaWRlbnRpZmllciBmcm9tIHRoZSBidWlsZGVyIChtYXRjaGVzIHNwZWMgbm9kZSBpZCkuICovXG4gIHB1YmxpYyBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIFNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIHN0YWdlIGV4ZWN1dGlvbi4gKi9cbiAgcHVibGljIHJ1bnRpbWVTdGFnZUlkID0gJyc7XG4gIC8qKlxuICAgKiBEZWNsYXJlZCB0YWdzICg5LjIxLjApIGZvciB0aGUgc3RhZ2UgdGhpcyBjb250ZXh0IGlzIGV4ZWN1dGluZy4gU2V0IGJ5XG4gICAqIHRoZSB0cmF2ZXJzZXIgYmVzaWRlIGBydW50aW1lU3RhZ2VJZGAgKHBlci1ub2RlIGlkZW50aXR5IOKAlCBOT1QgaW5oZXJpdGVkXG4gICAqIGJ5IGBjcmVhdGVOZXh0YCAvIGBjcmVhdGVDaGlsZGApLCByZWNvcmRlZCBvbiB0aGUgZmlyc3QgYnVuZGxlXG4gICAqIGBjb21taXQoKWAgd3JpdGVzLCB0aGVuIHJlbGVhc2VkIHNvIGEgcm91dGluZSBzZWNvbmQgY29tbWl0IG9uIHRoZSBzYW1lXG4gICAqIGNvbnRleHQgKGEgZm9yayBjaGlsZCdzIGZhbi1vdXQgcmVwZWF0LCBhIG1vdW50J3MgZXhpdCBidW5kbGUpIGNhcnJpZXNcbiAgICogbm9uZSDigJQgdGhlIHNhbWUgb25jZS1wZXItZXhlY3V0aW9uIGxhdyBgX3VudHJhY2tlZFNvdXJjZXNgIGtlZXBzLlxuICAgKi9cbiAgcHVibGljIHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBydW4gdGhpcyBmcmFtZSBiZWxvbmdzIHRvIOKAlCBpdHMgaWRlbnRpdHkgb24gZXZlcnkgZXZlbnQsIGFuZCB0aGUgcnVuXG4gICAqIG5hbWVzcGFjZSBpdCByZWFkcyBhbmQgd3JpdGVzIGluICh7QGxpbmsgcnVuQWRkcmVzc30pLCByZWFkIG9uY2UsIHdoZW4gdGhlXG4gICAqIGZyYW1lIGlzIGJ1aWx0IChDMykuIE9ubHkge0BsaW5rIHVzZUFkZHJlc3NPZn0gbW92ZXMgdGhlIGFkZHJlc3MgYWZ0ZXJcbiAgICogdGhhdCwgYW5kIG9ubHkgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1biBuYW1lc3BhY2UgdGhpcyBmcmFtZSB3cml0ZXMgYW5kIHJlYWRzIGluIHdoZW4gdGhhdCBpcyBub3QgaXRzIG93blxuICAgKiBgcnVuSWRgIOKAlCBzZXQgb25jZSwgYmVmb3JlIHRoZSBmcmFtZSdzIGZpcnN0IHdyaXRlLCBieVxuICAgKiB7QGxpbmsgdXNlQWRkcmVzc09mfS4gSXRzIG9uZSB1c2VyIGlzIGEgc3ViZmxvdyBtb3VudCdzIG1lcmdlLWJhY2sgKFIxMyk6XG4gICAqIHRoZSByZWNvcmQgbmFtZXMgdGhlIG1vdW50LCB0aGUgdmFsdWVzIGxhbmQgd2hlcmUgdGhlIG1vdW50J3MgcGFyZW50XG4gICAqIHdyaXRlcy4gQWJzZW50IOKGkiBgcnVuSWRgLCBzbyBldmVyeSBvdGhlciBmcmFtZSBpcyB1bnRvdWNoZWQuXG4gICAqL1xuICBwcml2YXRlIGFkZHJlc3NSdW5JZD86IHN0cmluZztcbiAgcHVibGljIGJyYW5jaElkPzogc3RyaW5nO1xuICBwdWJsaWMgaXNEZWNpZGVyOiBib29sZWFuO1xuICBwdWJsaWMgaXNGb3JrOiBib29sZWFuO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZnJvbSBidWlsZGVyIChzZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBleGVjdXRpb24pLiAqL1xuICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIgKHNldCBieSB0cmF2ZXJzZXIgd2hlbiB0aGlzIGlzIGEgc3ViZmxvdyBlbnRyeSBwb2ludCkuICovXG4gIHB1YmxpYyBzdWJmbG93SWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHBhcmVudD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIG5leHQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBjaGlsZHJlbj86IFN0YWdlQ29udGV4dFtdO1xuXG4gIHB1YmxpYyBkZWJ1ZzogRGlhZ25vc3RpY0NvbGxlY3RvciA9IG5ldyBEaWFnbm9zdGljQ29sbGVjdG9yKCgpID0+IHRoaXMucG9saWN5LnJlZGFjdGlvbik7XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHdyaXRlcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldyBhbmQgb25Db21taXRcbiAgICogIOKAlCBpbiB0aGVpciBSRVRBSU5FRCBmb3JtIChjbG9uZWQgLyBzdW1tYXJpc2VkIC8gcmVkYWN0ZWQpLiBGaWxsZWQgZnJvbVxuICAgKiAge0BsaW5rIF9wZW5kaW5nV3JpdGVzfSBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9IGF0IGNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VXcml0ZXM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSB3cml0ZXMgb2YgdGhlIENVUlJFTlQgZXhlY3V0aW9uLCBoZWxkIGJ5IHJlZmVyZW5jZSB3aXRoIHRoZSB2ZXJkaWN0XG4gICAqIHRoZXkgd2VyZSBzdGFnZWQgdW5kZXIgKDkuMjMuMCkuIEEga2V5IHdyaXR0ZW4gayB0aW1lcyBob2xkcyBpdHMgTEFTVFxuICAgKiB2YWx1ZTsgdGhlIHJldGFpbmVkIGZvcm0gKHRoZSBgd3JpdGVUcmFja2luZ2AgY2xvbmUgb3Igc3VtbWFyeSwgdGhlXG4gICAqIHJlZGFjdGlvbiBwbGFjZWhvbGRlciBvciBmaWVsZCBzY3J1YikgaXMgdGFrZW4gT05DRSBwZXIga2V5IGF0IGNvbW1pdCDigJRcbiAgICogc2VlIHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30uIFNhbWUgbGF3IGFzIHRoZSB0cmFuc2FjdGlvbiBidWZmZXInc1xuICAgKiBwYXRjaCB0cmVlczogdGhlIGNvcHkgdGhlIHJlY29yZCBuZWVkcyBpcyBwYWlkIGF0IHRoZSBib3VuZGFyeSwgbm90IGF0XG4gICAqIGV2ZXJ5IHdyaXRlLiBMYXppbHkgYWxsb2NhdGVkOyBhIHN0YWdlIHRoYXQgbmV2ZXIgd3JpdGVzIHBheXMgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX3BlbmRpbmdXcml0ZXM/OiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHsgdmFsdWU6IHVua25vd247IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3Q7IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH1cbiAgPjtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgcmVhZHMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcuICovXG4gIHByaXZhdGUgX3N0YWdlUmVhZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBgX3N0YWdlUmVhZHNgIGtleXMgdGhhdCB3ZXJlIHJlYWQgYXQgYSBORVNURUQgcGF0aCAoYGdldFZhbHVlKHBhdGgsXG4gICAqIGtleSlgIHdpdGggYSBub24tZW1wdHkgYHBhdGhgKS4gT25seSB0aGUgZW5naW5lIHJlYWRzIHRoYXQgd2F5IOKAlCB0aGVcbiAgICogZmFjYWRlIHJlYWRzIHJvb3RzIOKAlCBzbyB0aGVzZSBhcmUgbm90IHVzZXIgcmVhZHMgYW5kIHRoZSBib3Jyb3dlZC1yZWFkXG4gICAqIGd1YXJkIHNraXBzIHRoZW0gYnkgdGhpcyBtYXJrZXIsIG5ldmVyIGJ5IGd1ZXNzaW5nIGZyb20gYSBkb3QgaW4gdGhlIGtleVxuICAgKiAoYSB1c2VyJ3MgdG9wLWxldmVsIGtleSBtYXkgaXRzZWxmIGNvbnRhaW4gb25lKS4gTGF6aWx5IGNyZWF0ZWQ7IHRoZVxuICAgKiBmYWNhZGUgcGF0aCBuZXZlciBhbGxvY2F0ZXMgaXQuXG4gICAqL1xuICBwcml2YXRlIF9uZXN0ZWRSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBEZXYgbW9kZSBvbmx5OiB0aGUgcm9vdCBrZXlzIHdob3NlIExBU1QgdHJhY2tlZCByZWFkIHdhcyBzZXJ2ZWQgZnJvbVxuICAgKiBjb21taXR0ZWQgc3RhdGUg4oCUIGJlZm9yZSB0aGlzIHN0YWdlJ3MgZmlyc3Qgd3JpdGUsIHdoZW4gbm8gdHJhbnNhY3Rpb25cbiAgICogYnVmZmVyIGV4aXN0cyB5ZXQuIFN1Y2ggYSByZWFkIGlzIHRoZSBjb21taXR0ZWQgb2JqZWN0IGl0c2VsZiwgc28gYW5cbiAgICogaW4tcGxhY2UgZWRpdCBvZiBpdCBtb3ZlcyB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIHRvbyAoY29weS1vbi13cml0ZSxcbiAgICogOS4yOS4wKTsge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259IGNoZWNrcyB0aGVzZSBrZXlzIGV2ZW4gd2hlbiB0aGVcbiAgICogc3RhZ2Ugd3JvdGUgdGhlbS4gTmV2ZXIgYWxsb2NhdGVkIG91dHNpZGUgYGVuYWJsZURldk1vZGUoKWAuXG4gICAqL1xuICBwcml2YXRlIF92aWV3UmVhZHM/OiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogSGFzIHRoaXMgZnJhbWUgY29tbWl0dGVkIGF0IGxlYXN0IG9uY2U/IFRoZSBib3Jyb3dlZC1yZWFkIGd1YXJkIHJ1bnMgb25cbiAgICogdGhlIEZJUlNUIGNvbW1pdCBvbmx5IOKAlCBzZWUge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259LiBUaGUgZnJhbWVcbiAgICogaXRzZWxmIHN0YXlzIHJlLXVzYWJsZSBhZnRlciBjb21taXQgKCMxM2IpOiB0aGUgZW5naW5lJ3MgZG91YmxlLWNvbW1pdFxuICAgKiBwYXRocyBhbmQgdGhlIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgYnJhbmNoIHBhcmVudCByZWx5IG9uIGl0LiBUaGVcbiAgICogdXNlci1sZXZlbCByZWZ1c2FsIG9mIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgbGl2ZXMgYXQgdGhlIHNjb3BlXG4gICAqIHRpZXIgKGBTY29wZUZhY2FkZWAsIG9uZSBwZXIgc3RhZ2UgZXhlY3V0aW9uKSwgbm90IGhlcmUuXG4gICAqL1xuICBwcml2YXRlIF9jb21taXR0ZWQgPSBmYWxzZTtcblxuICAvKiogVHJhY2tlZCByZWFkcyBvZiBhIHNlbGVjdGVkIHZhbHVlICh7QGxpbmsgc2VsZWN0ZWRSZWFkc30pLiAqL1xuICBwcml2YXRlIF9zZWxlY3RlZFJlYWRzID0gMDtcbiAgLyoqIEVhY2ggb2JqZWN0IHRoaXMgZnJhbWUgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUg4oaSIHRoYXQgcmVhZCdzIHZlcmRpY3QgKGBzdGFnZVdyaXRlYCBoYW5kcyBpdCBvbikuICovXG4gIHByaXZhdGUgX3NlbGVjdGVkT2JqZWN0cz86IFdlYWtNYXA8b2JqZWN0LCBSZWRhY3Rpb25WZXJkaWN0PjtcblxuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlcnMg4oCUIHVudHJhY2tlZCByZWFkIHBhdGhzIHVzZWQgZHVyaW5nIFRISVNcbiAgICogc3RhZ2UncyBleGVjdXRpb24gKGAnYXJncydgIC8gYCdlbnYnYCAvIGAnc2lsZW50J2ApLiBNYXJrZWQgYnlcbiAgICogYFNjb3BlRmFjYWRlYCwgc3VyZmFjZWQgb24gdGhlIHN0YWdlJ3MgQ29tbWl0QnVuZGxlIGFzXG4gICAqIGB1bnRyYWNrZWRTb3VyY2VzYCwgdGhlbiBSRUxFQVNFRCB3aXRoIHRoZSBzdGFnaW5nIHN0YXRlIGF0IGNvbW1pdCBlbmRcbiAgICogKHNvIHRoZSByb3V0aW5lIGRvdWJsZS1jb21taXQgcGF0aHMg4oCUIGZvcmsgY2hpbGRyZW4sIHN1YmZsb3cgbW91bnRzIOKAlFxuICAgKiByZWNvcmQgdGhlIGZpZWxkIGV4YWN0bHkgb25jZSwgb24gdGhlIGZpcnN0IGNvbW1pdCkuIExhemlseSBhbGxvY2F0ZWQ6XG4gICAqIHN0YWdlcyB0aGF0IG5ldmVyIHRvdWNoIGFuIHVudHJhY2tlZCBwYXRoIHBheSBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfdW50cmFja2VkU291cmNlcz86IFNldDxVbnRyYWNrZWRTb3VyY2U+O1xuXG4gIC8qKlxuICAgKiBUaGUgYXR0ZW1wdHMgb2YgdGhpcyBmcmFtZSdzIGV4ZWN1dGlvbiAoMTAuMSkg4oCUIGl0cyBvd24gdW5kZXIgdGhlIGF0dGVtcHQgcnVubmVyLCBhcHBlbmRlZCBhcyBlYWNoIGF0dGVtcHQgZW5kc1xuICAgKiAoYEZsb3djaGFydFRyYXZlcnNlciDCtyBleGVjdXRlU3RhZ2VgKSwgYW5kIHRob3NlIG9mIHRoZSBjYWxscyBpdCBtYWRlIChQMiwge0BsaW5rIHJlcG9ydENhbGxBdHRlbXB0fSkg4oCUIHJlYWRcbiAgICogYnkge0BsaW5rIHNuYXBzaG90U2VsZn0uIEFwcGVuZC1vbmx5XG4gICAqIGV2aWRlbmNlIGxpa2UgYGRlYnVnYDogTk9UIGNsZWFyZWQgYnkge0BsaW5rIGRpc2NhcmRTdGFnZWR9ICh0aGUgZWFybGllciBhdHRlbXB0cyBhcmUgdGhlIHBvaW50KSBhbmQgbmV2ZXJcbiAgICogcGFydCBvZiBhIGNvbW1pdCBidW5kbGUuIExhemlseSBhbGxvY2F0ZWQ6IGEgc3RhZ2Ugd2l0aG91dCBhIHBvbGljeSBwYXlzIG5vdGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF9hdHRlbXB0cz86IEF0dGVtcHRSZWNvcmRbXTtcbiAgLyoqIFRoZSBhdHRlbXB0IHNlcmllcyBhdCBhIGdsYW5jZSwgc3RhbXBlZCBvbmNlIHdoZW4gaXQgZW5kcy4gKi9cbiAgcHJpdmF0ZSBfYXR0ZW1wdFN1bW1hcnk/OiBBdHRlbXB0U3VtbWFyeTtcbiAgLyoqIEZhY3RzIGNvbGxlY3RlZCBmb3IgdGhpcyBleGVjdXRpb24gb25seTsgcmV0cnkgZGlzY2FyZHMgZGVsaWJlcmF0ZWx5IGtlZXAgdGhlbS4gKi9cbiAgcHJpdmF0ZSBfYXR0ZW50aW9uPzogU3RhZ2VBdHRlbnRpb247XG4gIC8qKlxuICAgKiBUaGUgYXR0ZW1wdCBub3cgcnVubmluZyAoUDFiKSDigJQgc2V0IGJ5IGBTdGFnZVJ1bm5lcmAgYmVmb3JlIHRoZSBzY29wZSBpcyBidWlsdCwgc28gdGhlIGZhY2FkZSBjYW4gaGFuZCBpdCBvdXRcbiAgICogKGBzY29wZS4kYXR0ZW1wdCgpYCkgYW5kIGZlbmNlIGl0cyBvd24gYXR0ZW1wdC4gQWJzZW50IGZvciBhIHN0YWdlIHRoZSBhdHRlbXB0IHJ1bm5lciBkb2VzIG5vdCBydW4uXG4gICAqL1xuICBwcml2YXRlIF9hdHRlbXB0PzogQXR0ZW1wdENvbnRleHQ7XG4gIC8qKiBUaGUgcnVuJ3Mgc2lnbmFsLCBmb3IgdGhlIGF0dGVtcHQgYSBzdGFnZSBvdXRzaWRlIHRoZSBydW5uZXIgcmVwb3J0cyAoYXR0ZW1wdCAxIG9mIDEpLiAqL1xuICBwcml2YXRlIF9ydW5TaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIEV2ZXJ5IGF0dGVtcHQgdXAgdG8gdGhpcyBudW1iZXIgaGFzIEVOREVEIHdpdGhvdXQgYW4gYW5zd2VyIOKAlCBpdHMgc2NvcGUgaXMgZmVuY2VkICgwID0gbm9uZSkuICovXG4gIHByaXZhdGUgX2VuZGVkVGhyb3VnaCA9IDA7XG4gIC8qKiBXcml0ZXMgYW4gYXR0ZW1wdCB0cmllZCBhZnRlciBpdCBlbmRlZCDigJQgZHJvcHBlZCBhdCB0aGUgc2NvcGUsIGtlcHQgaGVyZSBhcyBuYW1lcy4gTGF6aWx5IGFsbG9jYXRlZC4gKi9cbiAgcHJpdmF0ZSBfbGF0ZVdyaXRlcz86IExhdGVXcml0ZVtdO1xuICAvKipcbiAgICogV2hlcmUgYSBjYWxsJ3MgYXR0ZW1wdCByZWNvcmRzIGFyZSByZXBvcnRlZCAoUDIpIOKAlCB0aGUgZW5naW5lJ3MgYG9uQXR0ZW1wdGAgZm9yIHRoaXMgc3RhZ2UgZXhlY3V0aW9uLCBzZXQgYnlcbiAgICogYEZsb3djaGFydFRyYXZlcnNlciDCtyBleGVjdXRlU3RhZ2VgIHdpdGggdGhlIHN0YWdlJ3Mgb3duIHRyYXZlcnNhbCBjb250ZXh0IChhbmQgaXRzIGNvcnJlbGF0aW9uKS5cbiAgICovXG4gIHByaXZhdGUgX2F0dGVtcHRSZXBvcnRlcj86IChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQsIHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcblxuICAvKiogQ2FsbHMgbWFkZSBzbyBmYXIsIHBlciBzdGFnZSBhdHRlbXB0IOKAlCB0aGUgYGtgIG9mIGEgY2FsbCdzIHNlcmllcy4gTGF6aWx5IGFsbG9jYXRlZC4gKi9cbiAgcHJpdmF0ZSBfY2FsbE9yZGluYWxzPzogTWFwPG51bWJlciwgbnVtYmVyPjtcbiAgLyoqIFBlciBzdGFnZSBhdHRlbXB0LCB0aGUgc2lnbmFsIGl0cyBjYWxscyBzdG9wIGJ5IChgY2FsbHNFbmRlZFNpZ25hbGApLiBMYXppbHkgYWxsb2NhdGVkLiAqL1xuICBwcml2YXRlIF9jYWxsc0VuZGVkPzogTWFwPG51bWJlciwgQWJvcnRDb250cm9sbGVyPjtcbiAgLyoqIENhbGwgYW5kIG9ic2VydmVkIHJlY29yZHMga2VwdCBvbiB0aGUgZnJhbWUsIGFuZCB0aG9zZSBwYXN0IHtAbGluayBNQVhfQ0FMTF9SRUNPUkRTfS4gKi9cbiAgcHJpdmF0ZSBfY2FsbFJlY29yZHMgPSAwO1xuICBwcml2YXRlIF9hdHRlbXB0c0Ryb3BwZWQgPSAwO1xuXG4gIC8qKiBPYnNlcnZlciBjYWxsZWQgYWZ0ZXIgY29tbWl0KCkg4oCUIHVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZmlyZSBTY29wZVJlY29yZGVyLm9uQ29tbWl0LiAqL1xuICBwcml2YXRlIF9jb21taXRPYnNlcnZlcj86IChcbiAgICBtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+LFxuICApID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICAgIHNoYXJlZE1lbW9yeTogU2hhcmVkTWVtb3J5LFxuICAgIGJyYW5jaElkPzogc3RyaW5nLFxuICAgIGV2ZW50TG9nPzogRXZlbnRMb2csXG4gICAgaXNEZWNpZGVyPzogYm9vbGVhbixcbiAgKSB7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICAgIHRoaXMuc3RhZ2VOYW1lID0gbmFtZTtcbiAgICB0aGlzLnN0YWdlSWQgPSBzdGFnZUlkO1xuICAgIHRoaXMucmVjb3JkID0gbmV3IFJlY29yZEZyYW1lKHNoYXJlZE1lbW9yeSwgZXZlbnRMb2csIHJ1bkFkZHJlc3MocnVuSWQpKTtcbiAgICB0aGlzLnJlY29yZC51c2VFbmNvZGluZyh0aGlzLnBvbGljeSk7XG4gICAgdGhpcy5icmFuY2hJZCA9IGJyYW5jaElkO1xuICAgIHRoaXMuaXNEZWNpZGVyID0gISFpc0RlY2lkZXI7XG4gICAgdGhpcy5pc0ZvcmsgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBTaGFyZWRNZW1vcnkgaW5zdGFuY2UgKG5lZWRlZCBieSBzY29wZSBsYXllcikuICovXG4gIGdldFNoYXJlZE1lbW9yeSgpOiBTaGFyZWRNZW1vcnkge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5zdGF0ZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgU3RhbXBlZCBiZXNpZGUgcnVudGltZVN0YWdlSWQsIGJlZm9yZSBzY29wZSBjb25zdHJ1Y3Rpb24uICovXG4gIGJpbmRFbWl0T3JpZ2luKHJ1bklkOiBzdHJpbmcsIGRyaWxsUGF0aDogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXRSdW5JZCA9IGRyaWxsUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcnVuSWQ7XG4gICAgaWYgKGRyaWxsUGF0aCAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5sb2c/LmJpbmRBZGRyZXNzKHJ1bklkLCBkcmlsbFBhdGgpO1xuICB9XG5cbiAgLyoqIENhcHR1cmUgZnJvbSB0aGlzIGZyYW1lJ3MgT1dOIGxvZy4gQSBtYW51YWwvdW5hZGRyZXNzYWJsZSBmcmFtZSBzdGF5cyB1bmtub3duLiAqL1xuICBjYXB0dXJlRW1pdFBvc2l0aW9uKCk6IEVtaXRTb3VyY2VQb3NpdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdFJ1bklkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLnJlY29yZC5sb2c/LmNhcHR1cmVQb3NpdGlvbih0aGlzLmVtaXRSdW5JZCk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvci4gU3Vic2VxdWVudCBgY29tbWl0KClgIGNhbGxzIGFwcGx5XG4gICAqIHRoZSBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMg4oCUIHRoZSBvbmVzIHRoZSBsb2cgcmVjb3JkcyDigJQgdG9cbiAgICogdGhpcyBtaXJyb3IsIGJlc2lkZSB0aGUgcmF3IHBhdGNoZXMgb24gdGhlIGhlYXAgKGByZWNvcmRDb21taXRgKS5cbiAgICogQ2hpbGQgLyBuZXh0IGNvbnRleHRzIGluaGVyaXQgdGhlIG1pcnJvciB2aWEgYGNyZWF0ZU5leHRgIC8gYGNyZWF0ZUNoaWxkYC5cbiAgICpcbiAgICogQ2FsbGVkIG9uIGEgcnVudGltZSdzIHJvb3QgZnJhbWUgYnkgYEV4ZWN1dGlvblJ1bnRpbWVgIHdoZW4gdGhlIHJ1bidzIHBvbGljeSBrZWVwcyBhIG1pcnJvci5cbiAgICovXG4gIHVzZVJlZGFjdGVkTWlycm9yKG1pcnJvcjogU2hhcmVkTWVtb3J5KTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmQudXNlTWlycm9yKG1pcnJvcik7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgcmVkYWN0ZWQgbWlycm9yIGlmIGluc3RhbGxlZCwgZWxzZSB1bmRlZmluZWQuICovXG4gIGdldFJlZGFjdGVkU2hhcmVkTWVtb3J5KCk6IFNoYXJlZE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLm1pcnJvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyBwb2xpY3kgKGBydW5Qb2xpY3kudHNgKSBvbiB0aGlzIGZyYW1lIOKAlCBjYWxsZWQgb24gYVxuICAgKiBydW50aW1lJ3Mgcm9vdCBieSBgRXhlY3V0aW9uUnVudGltZWAgKGF0IGNvbnN0cnVjdGlvbiwgYW5kIGJ5XG4gICAqIGBFeGVjdXRpb25SdW50aW1lLnVzZVBvbGljeWAgb24gYSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSkuIERlc2NlbmRhbnRzIGdldFxuICAgKiB0aGUgc2FtZSByZWZlcmVuY2UgdGhyb3VnaCB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfTsgYVxuICAgKiBzdWJmbG93J3MgcnVudGltZSBpcyBjb25zdHJ1Y3RlZCB3aXRoIGl0LCBzbyBpdHMgc2VlZCBmcmFtZSBhbmQgZXZlcnlcbiAgICogZnJhbWUgYWZ0ZXIgY29tbWl0IHVuZGVyIHRoZSBydW4ncyBkaWFscyB0b28uXG4gICAqL1xuICB1c2VQb2xpY3kocG9saWN5OiBSdW5Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLmFkb3B0UG9saWN5KHBvbGljeSk7XG4gIH1cblxuICAvKiogVGhlIHJ1bidzIHBvbGljeSB0aGlzIGZyYW1lIHJldGFpbnMsIGVuY29kZXMgYW5kIHNjcnVicyB1bmRlci4gKi9cbiAgZ2V0UG9saWN5KCk6IFJ1blBvbGljeSB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYSByZWRhY3Rpb24gcnVsZSDigJQgdGhlIE9ORSBvd25lciBvZiBcIndoYXQgZG9lcyB0aGUgcG9saWN5IHNheVxuICAgKiBhYm91dCB0aGlzIHBhdGhcIiAoYG1lbW9yeS9yZWRhY3Rpb24udHNgKSDigJQgYXMgYSBORVcgcG9saWN5IGZvciB0aGlzIGZyYW1lXG4gICAqICh0aGUgc2hhcmVkIG9uZSBpcyBuZXZlciBlZGl0ZWQpLiBVbmRlciBhbiBleGVjdXRvciB0aGUgcnVsZSBhcnJpdmVzXG4gICAqIHdpdGggdGhlIHJ1bidzIHBvbGljeTsgdGhpcyBkb29yIGlzIGZvciBhIGBTY29wZUZhY2FkZWAgb24gYSBiYXJlIGZyYW1lXG4gICAqICh1bml0IHRlc3RzLCBoYW5kLWJ1aWx0IHNjb3BlcyksIHdoaWNoIGJyaW5ncyBpdHMgb3duIHJ1bGUuIEV2ZXJ5IHN0YWdlZFxuICAgKiB3cml0ZSBhbmQgZXZlcnkgdHJhY2tlZCByZWFkIGFza3MgaXQsIHNvIGEgd3JpdGUgdGhhdCBuZXZlciBwYXNzZXMgYVxuICAgKiBmYWNhZGUg4oCUIGEgc3ViZmxvdyBzZWVkLCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCBhIHJlc3VtZSByZS1zZWVkIOKAlFxuICAgKiBpcyByZXRhaW5lZCB1bmRlciB0aGUgc2FtZSB2ZXJkaWN0IGFzIGEgZmFjYWRlIHdyaXRlLiBBYnNlbnQ6IGV2ZXJ5XG4gICAqIHZlcmRpY3QgaXMgYCdjbGVhcidgIHVubGVzcyB0aGUgY2FsbGVyIHBhc3NlZCBhbiBleHBsaWNpdCBmbGFnLlxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUnVsZShydWxlOiBSZWRhY3Rpb25SdWxlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9saWN5LnJlZGFjdGlvbiAhPT0gcnVsZSkgdGhpcy5hZG9wdFBvbGljeSh3aXRoUmVkYWN0aW9uKHRoaXMucG9saWN5LCBydWxlKSk7XG4gIH1cblxuICAvKiogVGhlIGluc3RhbGxlZCByZWRhY3Rpb24gcnVsZSwgaWYgYW55ICh0aGUgZmFjYWRlJ3MgbG9va3VwKS4gKi9cbiAgZ2V0UmVkYWN0aW9uUnVsZSgpOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wb2xpY3kucmVkYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgdGhlIHJ1biBmcm9tIGBmcm9tYDogdGhlIHBvbGljeSAoYnkgcmVmZXJlbmNlKSBhbmQgdGhlIHJ1bidzIG1pcnJvclxuICAgKiBzdG9yZS4gVGhlIE9ORSBpbmhlcml0YW5jZSBzdGVwIOKAlCB7QGxpbmsgY3JlYXRlTmV4dH0gYW5kXG4gICAqIHtAbGluayBjcmVhdGVDaGlsZH0gYm90aCBjYWxsIGl0LCBhbmQgaXQgbmFtZXMgbm8gZGlhbC5cbiAgICovXG4gIHByaXZhdGUgaW5oZXJpdFJ1bihmcm9tOiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRTb3VyY2VzID0gZnJvbS5yZWFkU291cmNlcztcbiAgICB0aGlzLmFkb3B0UG9saWN5KGZyb20ucG9saWN5KTtcbiAgICB0aGlzLmNhcHR1cmUgPSBmcm9tLmNhcHR1cmU7XG4gICAgdGhpcy5yZWNvcmQudXNlTWlycm9yKGZyb20ucmVjb3JkLm1pcnJvcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIE9ORSBwbGFjZSB0aGlzIGZyYW1lJ3MgcG9saWN5IGNoYW5nZXM6IHRoZSBmcmFtZSBob2xkcyBpdCwgYW5kIGl0c1xuICAgKiByZWNvcmQgZnJhbWUgZW5jb2RlcyB1bmRlciB0aGUgc2FtZSByZWZlcmVuY2UgKGBjb21taXRWYWx1ZXNgLFxuICAgKiBgd3JpdGVQcm92ZW5hbmNlYCDigJQgYFJlY29yZEZyYW1lIMK3IHVzZUVuY29kaW5nYCksIHNvIHRoZSB0d28gbmV2ZXIgZGlmZmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhZG9wdFBvbGljeShwb2xpY3k6IFJ1blBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMucmVjb3JkLnVzZUVuY29kaW5nKHBvbGljeSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgdHJhY2tlZCB1c2VyLWxldmVsIHdyaXRlLCBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSkg4oCUIHRoZSBzaW5nbGVcbiAgICogYm9va2tlZXBpbmcgcGF0aCBmb3Ige0BsaW5rIHNldE9iamVjdH0gYW5kIHtAbGluayB1cGRhdGVPYmplY3R9LiBIb2xkc1xuICAgKiB0aGUgUkVGRVJFTkNFIGFuZCB0aGUgdmVyZGljdCAoOS4yMy4wKTsgdGhlIHJldGFpbmVkIGZvcm0gaXMgdGFrZW4gYXRcbiAgICogY29tbWl0IGJ5IHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30sIG9uY2UgcGVyIGtleS5cbiAgICpcbiAgICogUmVkYWN0aW9uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZGlhbCBpbiBFVkVSWSBtb2RlOiBhIHJlZGFjdGVkXG4gICAqIHdyaXRlIHN0b3JlcyB0aGUgYCdbUkVEQUNURURdJ2AgcGxhY2Vob2xkZXIgdW5kZXIgYCdmdWxsJ2AgQU5EXG4gICAqIGAnc3VtbWFyeSdgIChhIHN1bW1hcnkgbWFya2VyIHdvdWxkIGxlYWsgdGhlIHZhbHVlJ3MgcHJldmlldy9zaXplKSxcbiAgICogYW5kIHN0b3JlcyBub3RoaW5nIHVuZGVyIGAnb2ZmJ2AgKGVudHJ5IHNraXBwZWQgZW50aXJlbHkg4oCUIG5vdGhpbmcgdG9cbiAgICogbGVhaykuIEEgZmllbGQtbGV2ZWwgdmVyZGljdCBzY3J1YnMgYSBjbG9uZSBCRUZPUkUgdGhlIGRpYWwgc2VlcyBpdCwgc29cbiAgICogYSBzdW1tYXJ5IHByZXZpZXcgY2FuIG5ldmVyIHNob3cgdGhlIHNlY3JldCBlaXRoZXIuIFRoZSB2ZXJkaWN0IGlzIHRoZVxuICAgKiBvbmUgYHN0YWdlV3JpdGVgIGRlY2lkZWQgQkVGT1JFIHN0YWdpbmcsIGNhcnJpZWQgdG8gY29tbWl0IHdpdGggdGhlXG4gICAqIHZhbHVlLiBUaGUgc3RhZ2VkIHdyaXRlIGl0c2VsZiBpcyB1bmFmZmVjdGVkIOKAlCByZWRhY3Rpb24gb2YgdGhlXG4gICAqIGNvbW1pdHRlZCBwYXlsb2FkIGlzIHRoZSByZWNvcmQgZnJhbWUncyBzY3J1YiBvZiB0aGF0IHdyaXRlXG4gICAqIChgUmVjb3JkRnJhbWUgwrcgd3JpdGVgLCB0aGVuIGBzY3J1Yi50c2AgYXQgY29tbWl0KS5cbiAgICovXG4gIHByaXZhdGUgdHJhY2tXcml0ZShcbiAgICB1c2VyS2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgICBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyxcbiAgKSB7XG4gICAgaWYgKHRoaXMucG9saWN5LndyaXRlVHJhY2tpbmcgPT09ICdvZmYnKSByZXR1cm47XG4gICAgKHRoaXMuX3BlbmRpbmdXcml0ZXMgPz89IG5ldyBNYXAoKSkuc2V0KHVzZXJLZXksIHsgdmFsdWUsIHZlcmRpY3QsIG9wZXJhdGlvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgX3N0YWdlV3JpdGVzYCB3aXRoIGV2ZXJ5IHBlbmRpbmcgd3JpdGUgZm9sZGVkIGluIGFzIGl0cyByZXRhaW5lZCBmb3JtXG4gICAqIOKAlCB0aGUgcmVjb3JkIGEgcmVhZGVyIHNlZXMuIENvbnN1bWVzIG5vdGhpbmc6IGEgbWlkLXJ1biBzbmFwc2hvdCByZWFkc1xuICAgKiB0aGUgd3JpdGVzIHNvIGZhciwgYW5kIGNvbW1pdCBzdGlsbCBtYXRlcmlhbGlzZXMgdGhlIGZpbmFsIHZhbHVlcy5cbiAgICogUmV0dXJucyBgX3N0YWdlV3JpdGVzYCBpdHNlbGYgd2hlbiBub3RoaW5nIGlzIHBlbmRpbmcuXG4gICAqL1xuICBwcml2YXRlIHJldGFpbmVkV3JpdGVzKCk6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+IHtcbiAgICBpZiAoIXRoaXMuX3BlbmRpbmdXcml0ZXMpIHJldHVybiB0aGlzLl9zdGFnZVdyaXRlcztcbiAgICBjb25zdCBvdXQgPSB7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB3XSBvZiB0aGlzLl9wZW5kaW5nV3JpdGVzKSB7XG4gICAgICBvdXRba2V5XSA9IHtcbiAgICAgICAgdmFsdWU6IHRoaXMucmV0YWluZWRGb3JtKHcudmVyZGljdCwgdy52YWx1ZSwgdGhpcy5wb2xpY3kud3JpdGVUcmFja2luZywgc3VtbWFyaXplV3JpdGVWYWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogdy5vcGVyYXRpb24sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgdGhlIHJldGFpbmVkIGZvcm0gb2YgZXZlcnkgcGVuZGluZyB3cml0ZSDigJQgT05DRSBwZXIga2V5LCBmcm9tIHRoZVxuICAgKiB2YWx1ZSBhcyBpdCBzdGFuZHMgYXQgY29tbWl0ICg5LjIzLjApIOKAlCBhbmQgcmVsZWFzZSB0aGUgcmVmZXJlbmNlcy4gVGhlXG4gICAqIGZpcnN0IHRoaW5nIGBjb21taXQoKWAgZG9lcywgc28gdGhlIGJvcnJvd2VkLW11dGF0aW9uIGd1YXJkIGFuZCB0aGVcbiAgICogY29tbWl0IG9ic2VydmVyIHNlZSB0aGUgZmluaXNoZWQgcmVjb3JkLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXRlcmlhbGlzZVdyaXRlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3BlbmRpbmdXcml0ZXMpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fc3RhZ2VXcml0ZXMgPSB0aGlzLnJldGFpbmVkV3JpdGVzKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlbGVhc2VkIGV2ZW4gd2hlbiBhIHJldGFpbmVkIGZvcm0gY2Fubm90IGJlIHRha2VuIOKAlCBhbiB1bmNsb25lYWJsZVxuICAgICAgLy8gdmFsdWUgKGEgZnVuY3Rpb24sIGEgUHJveHkpIGlzIGEgY29udHJhY3QgdmlvbGF0aW9uIChcInN0YXRlIHZhbHVlc1xuICAgICAgLy8gbXVzdCBzdXJ2aXZlIHN0cnVjdHVyZWRDbG9uZVwiKSB0aGF0IG5vdyBzdXJmYWNlcyBIRVJFLCBhdCBjb21taXQsXG4gICAgICAvLyBhbmQgZmFpbHMgdGhlIHJ1biBsb3VkbHk7IGEgbGF0ZXIgc25hcHNob3Qgb2YgdGhlIGZhaWxlZCBydW4gbXVzdFxuICAgICAgLy8gbm90IHRocm93IHRoZSBzYW1lIGVycm9yIGFnYWluLlxuICAgICAgdGhpcy5fcGVuZGluZ1dyaXRlcyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZvcm0gb2YgYSB2YWx1ZSB0aGUgZW5naW5lIFJFVEFJTlMgKHJlYWRzIGFuZCB3cml0ZXMgcmV0ZW50aW9uKTpcbiAgICogdGhlIHBsYWNlaG9sZGVyIGJlYXRzIGV2ZXJ5IGRpYWw7IGEgZmllbGQtbGV2ZWwgc2NydWIgaGFwcGVucyBiZWZvcmUgdGhlXG4gICAqIGRpYWwgc2VlcyB0aGUgdmFsdWU7IGEgY2xlYXIgdmFsdWUgaXMgc3VtbWFyaXplZCBvciBjbG9uZWQgYXMgdGhlIGRpYWxcbiAgICogc2F5cy4gQ2FsbGVycyBoYW5kbGUgYHVuZGVmaW5lZGAgYmVmb3JlIGFza2luZy5cbiAgICovXG4gIHByaXZhdGUgcmV0YWluZWRGb3JtKFxuICAgIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgbW9kZTogUmVhZFRyYWNraW5nTW9kZSB8IFdyaXRlVHJhY2tpbmdNb2RlLFxuICAgIHN1bW1hcml6ZTogKHZhbHVlOiB1bmtub3duKSA9PiB1bmtub3duLFxuICApOiB1bmtub3duIHtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gU0NPUEVfUExBQ0VIT0xERVI7XG4gICAgY29uc3Qgc2NydWJiZWQgPSB2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnID8gUmVkYWN0aW9uUnVsZS5zY3J1YkZpZWxkcyh2YWx1ZSwgdmVyZGljdC5wYXRocykgOiB1bmRlZmluZWQ7XG4gICAgaWYgKG1vZGUgPT09ICdzdW1tYXJ5JykgcmV0dXJuIHN1bW1hcml6ZShzY3J1YmJlZCA/PyB2YWx1ZSk7XG4gICAgcmV0dXJuIHNjcnViYmVkID8/IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJ1bGUgd2l0aCBzb21ldGhpbmcgdG8gc2F5IOKAlCBgdW5kZWZpbmVkYCBvbiB0aGUgbm8tcG9saWN5IHBhdGggKG5vXG4gICAqIHJ1bGUgaW5zdGFsbGVkLCBvciBhIHJ1bGUgd2l0aCBubyBwb2xpY3kgZW50cmllcyBhbmQgbm8gbWFya2VkIGtleXMpLCBzb1xuICAgKiBhIHRyYWNrZWQgcmVhZCBvciBhIHN0YWdlZCB3cml0ZSB0aGVyZSBwYXlzIG5vIHZlcmRpY3QgY2FsbCBhbmQgbm8gcGF0aFxuICAgKiBhbGxvY2F0aW9uLiBUaGUgZGVmYXVsdCBydW4gaXMgYnl0ZS1pZGVudGljYWwgQU5EIGNvc3QtaWRlbnRpY2FsLlxuICAgKi9cbiAgcHJpdmF0ZSBhY3RpdmVSdWxlKCk6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLnBvbGljeS5yZWRhY3Rpb247XG4gICAgcmV0dXJuIHJ1bGUgIT09IHVuZGVmaW5lZCAmJiAhcnVsZS5pc0luZXJ0KCkgPyBydWxlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRIRSBPTkUgRlVOTkVMIGV2ZXJ5IHN0YWdlZCB3cml0ZSBwYXNzZXMgdGhyb3VnaCDigJQgZmFjYWRlIHdyaXRlcyBBTkRcbiAgICogdGhlIHBhdGhzIHRoYXQgYnlwYXNzIHRoZSBmYWNhZGUgKHN1YmZsb3cgc2VlZCwgYG91dHB1dE1hcHBlcmBcbiAgICogbWVyZ2UtYmFjaywgcmVzdW1lIHJlLXNlZWQpLiBUd28gb3duZXJzIChDNCk6IHRoZSBydW4ncyBydWxlIERFQ0lERVMsXG4gICAqIHRoZSByZWNvcmQgZnJhbWUgV1JJVEVTIHRoZSB2ZXJkaWN0J3MgYnl0ZXMsIGluIGZvdXIgc3RlcHNcbiAgICogKGByZWRhY3Rpb24udHNgLCBcIlRoZSB3cml0ZSBkZWNpc2lvblwiKTpcbiAgICogICAxLiB0aGUgdmVyZGljdCDigJQgYGRlY2lkZVdyaXRlYCwgdW5kZXIgdGhlIHJ1bGUgYWN0aXZlIGFzIHRoZSB3cml0ZSBiZWdpbnM7XG4gICAqICAgMi4gaWRlbnRpdHkgaW5oZXJpdGFuY2Ug4oCUIGBpbmhlcml0QnlJZGVudGl0eWAsIGFnYWluc3QgdGhpcyBmcmFtZSdzXG4gICAqICAgICAgc2VsZWN0ZWQgcmVhZHMgYXMgdGhleSBzdGFuZCBhZnRlciBzdGVwIDE7XG4gICAqICAgMy4gdGhlIGJ5dGVzIOKAlCBgUmVjb3JkRnJhbWUgwrcgd3JpdGVgLCB0aGUgb3AgYW5kIGl0cyBzY3J1YiAodGhlIHdob2xlXG4gICAqICAgICAgdmFsdWUsIG9yIHRoZSBmaWVsZHMgaW5zaWRlIGl0KTtcbiAgICogICA0LiB0aGUgbWFya3Mg4oCUIGBtYXJrU3RhZ2VkV3JpdGVgLCBvbmx5IG9uY2UgdGhlIHdyaXRlIHN0YWdlZCwgc28gYVxuICAgKiAgICAgIHdyaXRlIHRoYXQgZmFpbHMgdG8gc3RhZ2UgbWFya3Mgbm90aGluZy5cbiAgICogRWFjaCBzdGVwIHJlYWRzIHRoZSBydWxlIChhbmQgdGhlIHNlbGVjdGVkIHJlYWRzKSB3aGVuIGl0IGFjdHMsIGFzIHRoaXNcbiAgICogZnVubmVsIGFsd2F5cyBkaWQuIFJldHVybnMgdGhlIHZlcmRpY3Qgc28gdGhlIGNhbGxlciByZXRhaW5zIGFuZCByZXBvcnRzXG4gICAqIHVuZGVyIHRoZSBzYW1lIGRlY2lzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZVdyaXRlKFxuICAgIG5zUGF0aDogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZXhwbGljaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgdmVyYjogV3JpdGVWZXJiLFxuICApOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICBpZiAoYWN0aXZlID09PSB1bmRlZmluZWQgJiYgIWV4cGxpY2l0KSB7XG4gICAgICAvLyBUaGUgbm8tcG9saWN5IGZhc3QgcGF0aCwgdGhlIHNhbWUgZm91ciBzdGVwcyB3aXRoIG5vdGhpbmcgdG8gZG86IG5vIHJ1bGUgd2l0aCBhbnl0aGluZyB0byBzYXlcbiAgICAgIC8vIGFuZCBubyBmbGFnIGlzIGNsZWFyIChzdGVwIDEpLCBub3RoaW5nIHRvIGluaGVyaXQgd2l0aG91dCBhIHJ1bGUgKHN0ZXAgMiksIG5vIHNjcnViIChzdGVwIDMpLFxuICAgICAgLy8gYW5kIG5vdGhpbmcgdG8gbWFyayDigJQgYSBjbGVhciB2ZXJkaWN0IG1hcmtzIG5vdGhpbmcsIGFuZCBhIGRlbGV0ZSB1bm1hcmtzIG9ubHkgb24gdGhlIHJ1bGVcbiAgICAgIC8vIGFjdGl2ZSBhcyBpdCBiZWdhbiAoc3RlcCA0KS4gVGhlIGRlZmF1bHQgcnVuIHBheXMgdGhlIHJlY29yZCdzIHdyaXRlIGFuZCBub3RoaW5nIGVsc2UuXG4gICAgICB0aGlzLnJlY29yZC53cml0ZShuc1BhdGgsIHZhbHVlLCB2ZXJiKTtcbiAgICAgIHJldHVybiBDTEVBUjtcbiAgICB9XG4gICAgY29uc3QgYXNrZWQgPSBkZWNpZGVXcml0ZShhY3RpdmUsIHBhdGgsIGtleSwgZXhwbGljaXQpO1xuICAgIGNvbnN0IHZlcmRpY3QgPSBpbmhlcml0QnlJZGVudGl0eShhY3RpdmUsIGFza2VkLCB0aGlzLl9zZWxlY3RlZE9iamVjdHMsIHBhdGgsIGtleSwgdmFsdWUpO1xuICAgIHRoaXMucmVjb3JkLndyaXRlKG5zUGF0aCwgdmFsdWUsIHZlcmIsIHNjcnViT2YodmVyZGljdCkpO1xuICAgIG1hcmtTdGFnZWRXcml0ZShhY3RpdmUsIHRoaXMucG9saWN5LnJlZGFjdGlvbiwgdmVyZGljdCwgcGF0aCwga2V5LCB2ZXJiKTtcbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBhbmQgcmVhZCBhdCBBTk9USEVSIGZyYW1lJ3MgYWRkcmVzcyAoaXRzIHJ1biBuYW1lc3BhY2UpIHdoaWxlIHRoaXNcbiAgICogZnJhbWUga2VlcHMgaXRzIG93biBpZGVudGl0eSBvbiB0aGUgcmVjb3JkIOKAlCBgc3RhZ2VgLCBgc3RhZ2VJZGAsXG4gICAqIGBydW50aW1lU3RhZ2VJZGAsIHRhZ3MuIEEgc3ViZmxvdyBtb3VudCdzIG1lcmdlLWJhY2sgaXMgdGhlIG9uZSBjYWxsZXJcbiAgICogKGBTdWJmbG93RXhlY3V0b3IgwrcgZXhlY3V0ZVN1YmZsb3dgLCBSMTMpOiB0aGUgbW91bnQgZnJhbWUgb2YgYSBicmFuY2ggb3JcbiAgICogZm9yayBjaGlsZCBsYW5kcyBpdHMgdmFsdWVzIHdoZXJlIGl0cyBwYXJlbnQgd3JpdGVzLCBhcyBiZWZvcmUsIGFuZCBpdHNcbiAgICogYnVuZGxlIG5vdyBuYW1lcyB0aGUgbW91bnQgaW5zdGVhZCBvZiB0aGUgc3RhZ2UgYmVmb3JlIGl0LiBSZWZ1c2VkIG9uY2VcbiAgICogdGhlIGZyYW1lIGhhcyBzdGFnZWQgYW55dGhpbmcg4oCUIGl0cyBidWZmZXIncyBhZGRyZXNzIGlzIGZpeGVkIHRoZW4uIFRoZVxuICAgKiBkZWNpc2lvbiBpcyB0aGUgZW5naW5lJ3MgKG5hbWVzcGFjZSBpZHMsIGFzIHNpbmNlIFIxMyk7IHRoZSByZWNvcmQgZnJhbWVcbiAgICogdGFrZXMgdGhlIGFkZHJlc3MgaXQgY29tZXMgdG8gKGBSZWNvcmRGcmFtZSDCtyB1c2VBZGRyZXNzYCkuXG4gICAqL1xuICB1c2VBZGRyZXNzT2YoZnJhbWU6IFN0YWdlQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZC5oYXNTdGFnZWQgJiYgZnJhbWUubmFtZXNwYWNlSWQgIT09IHRoaXMubmFtZXNwYWNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtmb290cHJpbnRdIFN0YWdlQ29udGV4dC51c2VBZGRyZXNzT2Y6ICcke3RoaXMuc3RhZ2VJZH0nIGhhcyBhbHJlYWR5IHN0YWdlZCB3cml0ZXMgYXQgaXRzIG93biBhZGRyZXNzLmAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFkZHJlc3NSdW5JZCA9IGZyYW1lLm5hbWVzcGFjZUlkO1xuICAgIHRoaXMucmVjb3JkLnVzZUFkZHJlc3MocnVuQWRkcmVzcyh0aGlzLm5hbWVzcGFjZUlkKSk7XG4gIH1cblxuICAvKiogVGhlIHJ1biBuYW1lc3BhY2Ugd3JpdGVzIGFuZCByZWFkcyBnbyB0bzoge0BsaW5rIGFkZHJlc3NSdW5JZH0sIGVsc2UgYHJ1bklkYC4gKi9cbiAgcHJpdmF0ZSBnZXQgbmFtZXNwYWNlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hZGRyZXNzUnVuSWQgPz8gdGhpcy5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBXcml0ZSBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBhdGNoKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdzZXQnKTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIG1lcmdlKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gdGhpcy5zdGFnZVdyaXRlKHRoaXMucmVjb3JkLmF0KHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ21lcmdlJyk7XG4gIH1cblxuICBzZXRPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBvcGVyYXRpb25PdmVycmlkZT86ICdzZXQnIHwgJ2RlbGV0ZScsXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIC8vIEV4cGxpY2l0IGRlbGV0aW9uIChTY29wZUZhY2FkZS5kZWxldGVWYWx1ZSkgc3RhZ2VzIGEgZGlzdGluY3Qgb3Agc29cbiAgICAvLyBkZWx0YS1tb2RlIGNvbW1pdHMgKCMxM2MtQikgY2FuIGVtaXQgYSByZWFsIGBkZWxldGVgIHRyYWNlIGVudHJ5LlxuICAgIC8vIFVuZGVyIHRoZSBkZWZhdWx0ICdmdWxsJyBtb2RlIHRoZSBidWZmZXIgY29tbWl0cyBpdCBhcyBhXG4gICAgLy8gc2V0LW9mLXVuZGVmaW5lZCDigJQgYnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICBjb25zdCB2ZXJkaWN0ID1cbiAgICAgIG9wZXJhdGlvbk92ZXJyaWRlID09PSAnZGVsZXRlJ1xuICAgICAgICA/IHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHVuZGVmaW5lZCwgc2hvdWxkUmVkYWN0LCAnZGVsZXRlJylcbiAgICAgICAgOiB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCBvcGVyYXRpb25PdmVycmlkZSA/PyAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCB0YWdnZWQgPSBkZXNjcmlwdGlvbi5zdGFydHNXaXRoKCdbJykgPyBkZXNjcmlwdGlvbiA6IGBbV1JJVEVdICR7ZGVzY3JpcHRpb259YDtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgdGFnZ2VkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICB1cGRhdGVPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMubWVyZ2UocGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0KTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdCDigJRcbiAgICAvLyBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSksIHNlZSB0cmFja1dyaXRlLlxuICAgIHRoaXMudHJhY2tXcml0ZSh1c2VyS2V5T2YocGF0aCwga2V5KSwgdmFsdWUsIHZlcmRpY3QsICd1cGRhdGUnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIHNldFJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChbXSwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogUm9vdC1sZXZlbCAodW4tbmFtZXNwYWNlZCkgd3JpdGUg4oCUIHRoZSBzdWJmbG93IHNlZWQgYW5kIG1lcmdlLWJhY2sgcGF0aC4gKi9cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0YWdlV3JpdGUoW2tleV0sIFtdLCBrZXksIHZhbHVlLCB1bmRlZmluZWQsICdzZXQnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUdsb2JhbENvbnRleHQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gIH1cblxuICBhcHBlbmRUb0FycmF5KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgaXRlbXM6IHVua25vd25bXSwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPSBBcnJheS5pc0FycmF5KGV4aXN0aW5nKSA/IFsuLi5leGlzdGluZywgLi4uaXRlbXNdIDogWy4uLml0ZW1zXTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIG1lcmdlT2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPVxuICAgICAgZXhpc3RpbmcgJiYgdHlwZW9mIGV4aXN0aW5nID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShleGlzdGluZylcbiAgICAgICAgPyB7IC4uLihleGlzdGluZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksIC4uLm9iaiB9XG4gICAgICAgIDogeyAuLi5vYmogfTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIEJPUlJPV0VEIOKAlCBzZWUgdGhlIGNvbnRyYWN0IG9uXG4gICAqIGBTY29wZUZhY2FkZS5nZXRWYWx1ZWAuIFJlYWQtdHJhY2tpbmcgY29zdCBpcyBwb2xpY3ktZ2F0ZWQgKCMxNCk6XG4gICAqIGAnZnVsbCdgIGNsb25lcyB0aGUgdmFsdWUgaW50byBgX3N0YWdlUmVhZHNgIChoaXN0b3JpY2FsIGRlZmF1bHQpLFxuICAgKiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXAgbWFya2VyLCBgJ29mZidgIHJlY29yZHMgbm90aGluZy5cbiAgICovXG4gIGdldFZhbHVlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRSZXRhaW5lZFZhbHVlKHBhdGgsIGtleSwgZGVzY3JpcHRpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNhcHR1cmU/LmxpbWl0KCdyZWFkLXJldGVudGlvbi1mYWlsZWQnKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVhZFJldGFpbmVkVmFsdWUocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICAvLyBUaGUgcmVjb3JkIGZyYW1lIHNlcnZlcyB0aGUgdmFsdWUgKHR3byB0aWVycykgYW5kIGtlZXBzIHRoZSBwZXItd3JpdGVcbiAgICAvLyBwcm92ZW5hbmNlIHJlZ2lzdHJ5ICgjUDEpIOKAlCBrZXkgc3RyaW5ncyBvbmx5LCBpbmRlcGVuZGVudCBvZiB0aGVcbiAgICAvLyByZWFkVHJhY2tpbmcgcmV0ZW50aW9uIGRpYWwgKHdoaWNoIGdvdmVybnMgVkFMVUUgcmV0ZW50aW9uIGJlbG93KS5cbiAgICBsZXQgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCA9IENMRUFSO1xuICAgIGNvbnN0IHZhbHVlID1cbiAgICAgIHRoaXMucG9saWN5LnJlYWRTb3VyY2VzICYmIHRoaXMucmVhZFNvdXJjZXNcbiAgICAgICAgPyB0aGlzLnJlYWRXaXRoTmF0aXZlU291cmNlKHBhdGgsIGtleSwgKCkgPT4ge1xuICAgICAgICAgICAgdmVyZGljdCA9IHRoaXMuanVkZ2VSZWFkKHBhdGgsIGtleSk7XG4gICAgICAgICAgICByZXR1cm4gdmVyZGljdC5raW5kID09PSAnY2xlYXInID8gJ3Zpc2libGUnIDogJ3JlZGFjdGVkJztcbiAgICAgICAgICB9KVxuICAgICAgICA6IHRoaXMucmVjb3JkLnJlYWQocGF0aCwga2V5KTtcbiAgICAvLyBEZWZhdWx0LW9mZiByZXRhaW5zIGl0cyBvcmlnaW5hbCByZWFkIC0+IG5vdGVSZWFkIC0+IE9ORSB2ZXJkaWN0IG9yZGVyLlxuICAgIC8vIEVuYWJsZWQgY2FwdHVyZSB1c2VzIGEgcHVyZSBwb3N0LXJlYWQgdmVyZGljdDsgcHJlZml4IGJvb2trZWVwaW5nIGZvbGxvd3MgaXRcbiAgICAvLyBiZWZvcmUgcmV0dXJuaW5nIHRvIHN0YWdlIGNvZGUuIEEgcHVyZSwgbmFtZS1vbmx5IHZlcmRpY3QgY2Fubm90IG9ic2VydmUgdGhlIHByZWZpeC5cbiAgICBpZiAoIXRoaXMucG9saWN5LnJlYWRTb3VyY2VzIHx8ICF0aGlzLnJlYWRTb3VyY2VzKSB2ZXJkaWN0ID0gdGhpcy5ub3RlQW5kSnVkZ2VSZWFkKHBhdGgsIGtleSk7XG4gICAgaWYgKHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJlYWRzICs9IDE7XG4gICAgICAvLyBBbiBvYmplY3QgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUsIHdyaXR0ZW4gYmFjayB1bmRlciBhbm90aGVyLCBrZWVwcyBpdHMgcnVsZSAoc3RhZ2VXcml0ZSkuXG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgKHRoaXMuX3NlbGVjdGVkT2JqZWN0cyA/Pz0gbmV3IFdlYWtNYXAoKSkuc2V0KHZhbHVlLCB2ZXJkaWN0KTtcbiAgICB9XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCByZWFkIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcg4oCUIHJldGFpbmVkIHVuZGVyXG4gICAgLy8gdGhlIHJ1bGUncyB2ZXJkaWN0ICg5LjE5LjApOiBhIHJlZGFjdGVkIGtleSBpcyByZXRhaW5lZCBhcyB0aGVcbiAgICAvLyBwbGFjZWhvbGRlciwgYSBmaWVsZC1sZXZlbCBrZXkgYXMgYSBzY3J1YmJlZCBjbG9uZSwgbmV2ZXIgdGhlIHNlY3JldC5cbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nICE9PSAnb2ZmJykge1xuICAgICAgaWYgKHBhdGgubGVuZ3RoID4gMCkgKHRoaXMuX25lc3RlZFJlYWRzID8/PSBuZXcgU2V0KCkpLmFkZCh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gICAgICBlbHNlIGlmICh0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgPT09ICdmdWxsJyAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgICBpZiAodGhpcy5yZWNvcmQuaGFzU3RhZ2VkKSB0aGlzLl92aWV3UmVhZHM/LmRlbGV0ZShrZXkpO1xuICAgICAgICBlbHNlICh0aGlzLl92aWV3UmVhZHMgPz89IG5ldyBTZXQoKSkuYWRkKGtleSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFnZVJlYWRzW3VzZXJLZXlPZihwYXRoLCBrZXkpXSA9XG4gICAgICAgIHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogdGhpcy5yZXRhaW5lZEZvcm0odmVyZGljdCwgdmFsdWUsIHRoaXMucG9saWN5LnJlYWRUcmFja2luZywgc3VtbWFyaXplUmVhZFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGBbUkVBRF0gJHtkZXNjcmlwdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRyYWNrZWQgcmVhZHMgb2YgdGhpcyBmcmFtZSByZWFkIGEgdmFsdWUgdGhlIHJ1bidzIHJ1bGUgc2VsZWN0c1xuICAgKiAoYSBrZXkgaXQgbWFza3Mgd2hvbGUsIG9yIG9uZSB3aXRoIHNlY3JldCBmaWVsZHMpLiBBIGJvdW5kYXJ5IHRoYXQgbWFwc1xuICAgKiB3aGF0IGEgc3RhZ2UgZnVuY3Rpb24gUkVBRCBpbnRvIGEgbmV3IG5hbWUg4oCUIHRoZSBgcGFyYWxsZWxGb3JFYWNoYCBpdGVtc1xuICAgKiBzZWxlY3RvciDigJQgY29tcGFyZXMgaXQgYmVmb3JlIGFuZCBhZnRlciwgYXMgYSBzdWJmbG93IG1hcHBlcidzIHRhaW50IGRvZXNcbiAgICogKGBtZW1vcnkvcmVkYWN0aW9uLnRzIMK3IE1hcHBlclRhaW50YCkuIEFsd2F5cyAwIHdpdGhvdXQgYSBwb2xpY3kgb3IgYSBtYXJrLlxuICAgKi9cbiAgZ2V0IHNlbGVjdGVkUmVhZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRSZWFkcztcbiAgfVxuXG4gIHByaXZhdGUgbm90ZUFuZEp1ZGdlUmVhZChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5ub3RlUmVhZChwYXRoLCBrZXkpO1xuICAgIHJldHVybiB0aGlzLmp1ZGdlUmVhZChwYXRoLCBrZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBqdWRnZVJlYWQocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHJ1bGUgPSBrZXkgIT09IHVuZGVmaW5lZCA/IHRoaXMuYWN0aXZlUnVsZSgpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBydWxlICE9PSB1bmRlZmluZWQgPyBydWxlLnZlcmRpY3RBdChwYXRoLCBrZXkgYXMgc3RyaW5nKSA6IENMRUFSO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkV2l0aE5hdGl2ZVNvdXJjZShcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YWN5OiAoKSA9PiAndmlzaWJsZScgfCAncmVkYWN0ZWQnLFxuICApOiB1bmtub3duIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMuI2ZhaWx1cmVJZGVudGl0eTtcbiAgICBsZXQganVkZ2VkID0gZmFsc2U7XG4gICAgbGV0IGhpZGRlbiA9IGZhbHNlO1xuICAgIGNvbnN0IHZlcmRpY3QgPSAoKSA9PiB7XG4gICAgICBqdWRnZWQgPSB0cnVlO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcHJpdmFjeSgpO1xuICAgICAgaGlkZGVuID0gcmVzdWx0ICE9PSAndmlzaWJsZSc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgbGV0IHZhbHVlOiB1bmtub3duO1xuICAgIHRyeSB7XG4gICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwgIWlkZW50aXR5KSB7XG4gICAgICAgIHRoaXMucmVhZFNvdXJjZXM/LmxpbWl0KGtleSA9PT0gdW5kZWZpbmVkID8gJ3VudHJhY2tlZC1yZWFkJyA6ICdpZGVudGl0eS11bmF2YWlsYWJsZScpO1xuICAgICAgICB2YWx1ZSA9IHRoaXMucmVjb3JkLnJlYWQocGF0aCwga2V5KTtcbiAgICAgICAgdmVyZGljdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLnJlY29yZC5yZWFkV2l0aFNvdXJjZShcbiAgICAgICAgICBwYXRoLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICB7IHJ1bnRpbWVTdGFnZUlkOiBpZGVudGl0eS5ydW50aW1lU3RhZ2VJZCwgLi4uKHRoaXMuc291cmNlQXR0ZW1wdCAmJiB7IGF0dGVtcHRJZDogdGhpcy5zb3VyY2VBdHRlbXB0IH0pIH0sXG4gICAgICAgICAgdmVyZGljdCxcbiAgICAgICAgKS52YWx1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gQSBzdWNjZXNzZnVsIG5hdGl2ZSByZWFkIGtlZXBzIGl0cyBwcmVmaXggZXZlbiB3aGVuIHRoZSB2ZXJkaWN0IHRocm93cy5cbiAgICAgIC8vIEEgbmF0aXZlIGZhaWx1cmUgbmV2ZXIgZW50ZXJzIHRoZSB2ZXJkaWN0IGFuZCBtdXN0IG5vdCBpbnZlbnQgYSByZWFkLlxuICAgICAgaWYgKGp1ZGdlZCkgdGhpcy5ub3RlU291cmNlUmVhZChwYXRoLCBrZXksIGhpZGRlbiwgZmFsc2UpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGlmIChqdWRnZWQpIHRoaXMubm90ZVNvdXJjZVJlYWQocGF0aCwga2V5LCBoaWRkZW4sIHRydWUpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgbm90ZVNvdXJjZVJlYWQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLCBoaWRkZW46IGJvb2xlYW4sIHByb3BhZ2F0ZUZhaWx1cmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5ub3RlUmVhZChwYXRoLCBrZXkpO1xuICAgICAgaWYgKGhpZGRlbikgdGhpcy5yZWFkU291cmNlcz8ubGltaXQoJ3ByaXZhY3ktYWN0aXZlJyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMucmVhZFNvdXJjZXM/LmxpbWl0KCdzb3VyY2UtY2FwdHVyZS1mYWlsZWQnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBDb2xsZWN0b3IgZmFpbHVyZXMgbXVzdCBub3QgcmVwbGFjZSB0aGUgb3JpZ2luYWwgcmVhZC92ZXJkaWN0IGVycm9yLlxuICAgICAgfVxuICAgICAgaWYgKHByb3BhZ2F0ZUZhaWx1cmUpIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgdHJhY2tpbmcgaW4gX3N0YWdlUmVhZHMgb3IgcGF5aW5nIHN0cnVjdHVyZWRDbG9uZSBjb3N0LlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZS5nZXRWYWx1ZVNpbGVudCgpIGZvciBhcnJheSBwcm94eSBpbnRlcm5hbCBvcGVyYXRpb25zLiAqL1xuICBnZXRWYWx1ZURpcmVjdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnJlYWQocGF0aCwga2V5KTtcbiAgfVxuXG4gIGdldFJvb3Qoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQucmVhZExpdmUoa2V5KTtcbiAgfVxuXG4gIGdldEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5yZWFkR2xvYmFsKGtleSk7XG4gIH1cblxuICBnZXRTY29wZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnN0YXRlLmdldFN0YXRlKCk7XG4gIH1cblxuICBnZXRSdW5JZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJ1bklkO1xuICB9XG5cbiAgLy8g4pSA4pSAIENvbW1pdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUkZDLTAwMyBEMjogcmVjb3JkIHRoYXQgdGhpcyBzdGFnZSBjb25zdW1lZCBhbiB1bnRyYWNrZWQgcmVhZCBwYXRoLlxuICAgKiBDYWxsZWQgYnkgYFNjb3BlRmFjYWRlYCAoYGdldEFyZ3NgL2BnZXRFbnZgL3Vuc2hhZG93ZWQgYGdldFZhbHVlU2lsZW50YCk7XG4gICAqIHN1cmZhY2VkIGFzIGBDb21taXRCdW5kbGUudW50cmFja2VkU291cmNlc2Agb24gdGhpcyBzdGFnZSdzIGNvbW1pdC5cbiAgICovXG4gIG1hcmtVbnRyYWNrZWRTb3VyY2Uoc291cmNlOiBVbnRyYWNrZWRTb3VyY2UpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRTb3VyY2VzPy5saW1pdCgndW50cmFja2VkLXJlYWQnKTtcbiAgICAodGhpcy5fdW50cmFja2VkU291cmNlcyA/Pz0gbmV3IFNldCgpKS5hZGQoc291cmNlKTtcbiAgfVxuXG4gIC8qKiBSZWdpc3RlciBhbiBvYnNlcnZlciB0aGF0IGZpcmVzIGFmdGVyIGNvbW1pdCgpIGFwcGxpZXMgcGF0Y2hlcy5cbiAgICogIFVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZGlzcGF0Y2ggU2NvcGVSZWNvcmRlci5vbkNvbW1pdCBldmVudHMuICovXG4gIHNldENvbW1pdE9ic2VydmVyKFxuICAgIG9ic2VydmVyOiAobXV0YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiB1bmtub3duOyBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyB9PikgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIgPSBvYnNlcnZlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXYtbW9kZSBvbmx5OiBkaWQgdGhpcyBzdGFnZSBjaGFuZ2UsIElOIFBMQUNFLCBhIHZhbHVlIGl0IG1lcmVseSBSRUFEP1xuICAgKlxuICAgKiBUaGUgdHlwZWQgc2NvcGUgaW50ZXJjZXB0cyBldmVyeSB3cml0ZSBpdCBjYW4gcmVhY2gg4oCUIGEgcHJvcGVydHkgYXQgYW55XG4gICAqIGRlcHRoLCBhbiBpbmRleGVkIGVsZW1lbnQsIGFuIGFycmF5IG1ldGhvZC4gV2hhdCBpdCBjYW5ub3QgcmVhY2ggaXMgYW5cbiAgICogZWxlbWVudCBoYW5kZWQgb3V0IGJ5IGEgcmVhZCBtZXRob2QgKGBmaW5kYCwgYGZpbHRlcmAsIGBmb3LigKZvZmAsXG4gICAqIGBmb3JFYWNoYCwgZGVzdHJ1Y3R1cmluZyk6IHdyYXBwaW5nIHRob3NlIHdvdWxkIG1lYW4gcmV0dXJuaW5nIHByb3hpZXMgb3V0XG4gICAqIG9mIGV2ZXJ5IHJlYWQsIHdoaWNoIGlzIGEgY29zdCB0aGUgbGlicmFyeSBzaG91bGQgbm90IHBheS4gU28gdGhhdCBmYW1pbHlcbiAgICogaXMgV0FSTkVEIEFCT1VUIHJhdGhlciB0aGFuIGludGVyY2VwdGVkIOKAlCBsb3VkbHksIGhlcmUsIGluc3RlYWQgb2YgZW5kaW5nXG4gICAqIHRoZSBydW4gd2l0aCBhIGNvbW1pdCBsb2cgdGhhdCBzaWxlbnRseSBkaXNhZ3JlZXMgd2l0aCBmaW5hbCBzdGF0ZS5cbiAgICpcbiAgICogVGhpcyBpcyBhIFJFUE9SVCBhZnRlciB0aGUgZmFjdCwgbm90IGEgcmVmdXNhbCBhdCB0aGUgd3JpdGU6IHRoZSB3cml0ZSBoYXNcbiAgICogYWxyZWFkeSBoYXBwZW5lZCBpbiBwbGFjZSBhbmQgdGhlcmUgaXMgbm90aGluZyB0byBpbnRlcmNlcHQuIEl0IHJ1bnMgdW5kZXJcbiAgICogVFdPIHByZWNvbmRpdGlvbnMsIGJvdGggbmFtZWQgaW4gdGhlIFJFQURNRSDigJQgYGVuYWJsZURldk1vZGUoKWAsIGFuZFxuICAgKiBgcmVhZFRyYWNraW5nOiAnZnVsbCdgICh0aGUgZGVmYXVsdCksIGJlY2F1c2UgdGhlIGNvbXBhcmlzb24gbmVlZHMgdGhlXG4gICAqIGNsb25lIG9mIHRoZSB2YWx1ZSB0aGF0IG1vZGUgcmV0YWlucyBhdCByZWFkIHRpbWUuIEEga2V5IHRoZSBzdGFnZSBuZXZlclxuICAgKiBzdGFnZWQgbXVzdCBzdGlsbCBob2xkIHRoYXQgY2xvbmUg4oCUIGNvbW1pdHRlZCBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcFxuICAgKiBhbmQgdGhlIGJ1ZmZlcidzIHdvcmtpbmcgY29weSBpcyBwcml2YXRlIHRvIHRoaXMgc3RhZ2UuIEtleXMgdGhlIHN0YWdlIERJRFxuICAgKiBzdGFnZSBhcmUgc2tpcHBlZCAodGhleSBhcmUgZXhwZWN0ZWQgdG8gZGlmZmVyLCBhbmQgdGhleSBhcmUgaW4gdGhlIHJlY29yZCksXG4gICAqIHNvIGFyZSBrZXlzIHVuZGVyIGEgcmVkYWN0aW9uIHZlcmRpY3QsIHdob3NlIHJldGFpbmVkIGZvcm0gaXMgZGVsaWJlcmF0ZWx5XG4gICAqIG5vdCB0aGUgdmFsdWUsIGFuZCBzbyBhcmUga2V5cyByZWFkIGF0IGEgbmVzdGVkIHBhdGggKGBfbmVzdGVkUmVhZHNgKSDigJRcbiAgICogdGhvc2UgYXJlIGVuZ2luZSByZWFkcyAodGhlIHN1YmZsb3cgbWVyZ2UtYmFjayksIG5vdCB1c2VyIHJlYWRzLlxuICAgKlxuICAgKiBJdCBhbHNvIG9ubHkgbG9va3MgYXQga2V5cyBzZXJ2ZWQgZnJvbSB0aGUgUElOTkVEIHNvdXJjZSDigJQgdGhlIGZpcnN0LXRvdWNoXG4gICAqIHZpZXcgb3IgdGhpcyBzdGFnZSdzIG93biBidWZmZXIuIEEga2V5IGFic2VudCBmcm9tIGJvdGggd2FzIHNlcnZlZCBieSB0aGVcbiAgICogcmVhZCdzIGxpdmUgZmFsbGJhY2sgKGBSZWNvcmRGcmFtZSDCtyByZWFkYCwgdGllciAyKSwgd2hpY2ggYSBwYXJhbGxlbCBzaWJsaW5nJ3Mgcm9vdC1rZXkgY29tbWl0IGNhblxuICAgKiBsZWdpdGltYXRlbHkgbW92ZTsgYWNjdXNpbmcgdGhlIHN0YWdlIHRoZXJlIHdvdWxkIGJlIGEgZmFsc2UgYWxhcm0uIEZvclxuICAgKiB0aGUgc2FtZSByZWFzb24gaXQgcnVucyBvbiB0aGUgZnJhbWUncyBGSVJTVCBjb21taXQgb25seTogdGhlIHJlYWRzIGJlbG9uZ1xuICAgKiB0byB0aGF0IHJvdW5kLCBhbmQgYnkgdGhlIGVuZ2luZSdzIHNlY29uZCByb3VuZCAoYSBmb3JrIGRvdWJsZS1jb21taXQsIGFcbiAgICogc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBjb21taXR0ZWQgYnJhbmNoIHBhcmVudCkgb3RoZXIgc3RhZ2VzIGhhdmVcbiAgICogbGVnaXRpbWF0ZWx5IG1vdmVkIHRoZSBzdGF0ZSB0aGV5IHdlcmUgY29tcGFyZWQgYWdhaW5zdC5cbiAgICpcbiAgICogQSBrZXkgdGhlIHN0YWdlIERJRCBzdGFnZSBpcyBzdGlsbCBjaGVja2VkIHdoZW4gaXRzIGxhc3QgcmVhZCBjYW1lIGZyb21cbiAgICogY29tbWl0dGVkIHN0YXRlICh7QGxpbmsgX3ZpZXdSZWFkc30g4oCUIHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSk6XG4gICAqIHRoYXQgcmVhZCB3YXMgdGhlIGNvbW1pdHRlZCBvYmplY3QgaXRzZWxmLCBhbmQgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSBJU1xuICAgKiB0aGF0IG9iamVjdCAoY29weS1vbi13cml0ZSwgOS4yOS4wKSwgc28gYW4gaW4tcGxhY2UgZWRpdCBmb2xsb3dlZCBieSBhXG4gICAqIHdyaXRlIG9mIHRoZSBrZXkgY29tbWl0cyBOTyBjaGFuZ2Ug4oCUIGxpdmUgc3RhdGUga2VlcHMgdGhlIGVkaXQsIHRoZSBsb2dcbiAgICogZG9lcyBub3QuIENvbXBhcmVkIGFnYWluc3QgY29tbWl0dGVkIHN0YXRlLCBub3QgdGhlIHdyaXR0ZW4gdmFsdWUsIHNvIGFcbiAgICogbGVnaXRpbWF0ZSB3cml0ZSBuZXZlciB0cmlwcyBpdC5cbiAgICpcbiAgICogQ29zdHMgbm90aGluZyBvdXRzaWRlIGBlbmFibGVEZXZNb2RlKClgLlxuICAgKi9cbiAgcHJpdmF0ZSB3YXJuT25Cb3Jyb3dlZE11dGF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghaXNEZXZNb2RlKCkgfHwgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nICE9PSAnZnVsbCcgfHwgdGhpcy5fY29tbWl0dGVkKSByZXR1cm47XG4gICAgY29uc3QgcnVsZSA9IHRoaXMuYWN0aXZlUnVsZSgpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpKSB7XG4gICAgICBjb25zdCByZXRhaW5lZCA9IHRoaXMuX3N0YWdlUmVhZHNba2V5XTtcbiAgICAgIC8vIE9ubHkgYSBjb250YWluZXIgY2FuIGJlIG11dGF0ZWQgaW4gcGxhY2U7IGEgcHJpbWl0aXZlIHJlYWQgY2Fubm90LlxuICAgICAgaWYgKHJldGFpbmVkID09PSBudWxsIHx8IHR5cGVvZiByZXRhaW5lZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMuX25lc3RlZFJlYWRzPy5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICBpZiAocnVsZSAhPT0gdW5kZWZpbmVkICYmIHJ1bGUudmVyZGljdEF0KFtdLCBrZXkpLmtpbmQgIT09ICdjbGVhcicpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbmFtZXNwYWNlZCA9IHRoaXMucmVjb3JkLmF0KFtdLCBrZXkpO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9zdGFnZVdyaXRlcywga2V5KSB8fCB0aGlzLnJlY29yZC53YXNTdGFnZWQobmFtZXNwYWNlZCkpIHtcbiAgICAgICAgdGhpcy53YXJuT25Db21taXR0ZWRNdXRhdGlvbihrZXksIG5hbWVzcGFjZWQsIHJldGFpbmVkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBwaW5uZWQgc291cmNlIG9ubHkg4oCUIHNlZSB0aGUgbm90ZSBvbiB0aGUgbGl2ZSBmYWxsYmFjayBhYm92ZS5cbiAgICAgIC8vIGBwZWVrYCwgbm90IGBnZXRgOiBhIHJlcG9ydCBjb21wYXJlcywgYW5kIG11c3Qgbm90IHRha2UgdGhlIHByaXZhdGVcbiAgICAgIC8vIGNvcHkgYSBzdGFnZSdzIHJlYWQgd291bGQgKGNvcHktb24td3JpdGUsIDkuMjkuMCkuXG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5yZWNvcmQucGVlayhuYW1lc3BhY2VkKTtcbiAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYXRoID0gZmlyc3REaWZmZXJpbmdQYXRoKHJldGFpbmVkLCBjdXJyZW50KTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2Fybihib3Jyb3dlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBzdGFnZWQta2V5IGhhbGYgb2Yge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259OiBkaWQgY29tbWl0dGVkIHN0YXRlIGl0c2VsZiBtb3ZlIHVuZGVyIGEgcmVhZD8gKi9cbiAgcHJpdmF0ZSB3YXJuT25Db21taXR0ZWRNdXRhdGlvbihrZXk6IHN0cmluZywgbmFtZXNwYWNlZDogc3RyaW5nW10sIHJldGFpbmVkOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl92aWV3UmVhZHM/LmhhcyhrZXkpKSByZXR1cm47XG4gICAgY29uc3QgY29tbWl0dGVkID0gdGhpcy5yZWNvcmQuYmFzZUF0KG5hbWVzcGFjZWQpO1xuICAgIGlmIChjb21taXR0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhdGggPSBmaXJzdERpZmZlcmluZ1BhdGgocmV0YWluZWQsIGNvbW1pdHRlZCk7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKGNvbW1pdHRlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggc3RhZ2VkIHdyaXRlcyB0byBzaGFyZWQgbWVtb3J5IGFuZCBSRUxFQVNFIHRoZSBwZXItc3RhZ2Ugc3RhZ2luZ1xuICAgKiBzdGF0ZSAoIzEzYikuXG4gICAqXG4gICAqIGBwaGFzZWAgKDkuMzkuMCkgaXMgdGhlIGNhbGxlcidzIHN0YXRlbWVudCBvZiB3aGF0IGEgQ09OVElOVUFUSU9OIGNvbW1pdFxuICAgKiBpcyDigJQgYCdleGl0J2AgZnJvbSBhIHN1YmZsb3cgbW91bnQncyBleGl0LCBgJ3JlcGVhdCdgIGZyb20gYSBmb3JrXG4gICAqIGZhbi1vdXQncyBzZXR0bGUuIEl0IGlzIHN0YW1wZWQgb24gdGhlIGJ1bmRsZSAoYENvbW1pdEJ1bmRsZS5waGFzZWApIG9ubHlcbiAgICogd2hlbiB0aGlzIGZyYW1lIGhhcyBBTFJFQURZIGNvbW1pdHRlZDogdGhlIEZJUlNUIGJ1bmRsZSBvZiBhbiBleGVjdXRpb25cbiAgICogaXMgdGhlIHN0YWdlJ3Mgb3duIGFuZCBuZXZlciBjYXJyaWVzIGEgYHBoYXNlYCDigJQgc28gYSBtb3VudCB3aXRob3V0IGFuXG4gICAqIGBvdXRwdXRNYXBwZXJgIChhIGxhenkgbW91bnQsIGV2ZXJ5IGBwYXJhbGxlbEZvckVhY2hgIGJyYW5jaCksIHdob3NlIGV4aXRcbiAgICogaXMgaXRzIG9ubHkgYnVuZGxlLCByZWNvcmRzIHRoYXQgYnVuZGxlIGFzIGl0cyBvd24sIHRhZ3MgYW5kIGFsbC5cbiAgICpcbiAgICogQ29tbWl0IGlzIHRoZSBzdGFnZSdzIGxpZmVjeWNsZSBlbmQ6IHRoZSByZWNvcmQgZnJhbWUncyBidWZmZXIgYW5kXG4gICAqIGZpcnN0LXRvdWNoIGJhc2UgYXJlIG9ubHkgbmVlZGVkIERVUklORyBleGVjdXRpb24sIGFzIHRoZSByZWFkIHNuYXBzaG90ICtcbiAgICogbmV0LWNoYW5nZSBkaWZmIGJhc2UsIHNvIHRoZSByZWNvcmQgZnJhbWUgcmVsZWFzZXMgdGhlbSBvbmNlIHRoZSBjb21taXRcbiAgICogaGFzIGxhbmRlZCBhbmQgdGhlIG9ic2VydmVyIGhhcyBzZWVuIGl0IChgUmVjb3JkRnJhbWUgwrcgcmVsZWFzZWAg4oCUIHdoeSBhXG4gICAqIGZyYW1lIHRoYXQga2VwdCB0aGVtIHdvdWxkIHJldGFpbiBvbmUgc3RhdGUgZ2VuZXJhdGlvbiBwZXIgZXhlY3V0ZWRcbiAgICogc3RhZ2UsIGFuZCB3aHkgYSByZS11c2VkIGZyYW1lIHJlLWFuY2hvcnMgb24gY3VycmVudCBzdGF0ZSwgaXMgdGhlcmUpLlxuICAgKlxuICAgKiBSRS1VU0UgQUZURVIgQ09NTUlUIHN0YXlzIGNvcnJlY3QgYmVjYXVzZSBib3RoIHJlLWNyZWF0ZSBsYXppbHk6XG4gICAqIC0gYSBsYXRlciBSRUFEIHJlLWFuY2hvcnMgb24gdGhlIENVUlJFTlQgY29tbWl0dGVkIHN0YXRlICh3aGljaCBpbmNsdWRlc1xuICAgKiAgIHRoaXMgc3RhZ2UncyBvd24gZmx1c2hlZCB3cml0ZXMpO1xuICAgKiAtIGEgbGF0ZXIgV1JJVEUgY29uc3RydWN0cyBhIGZyZXNoIGJ1ZmZlciBvbiB0aGF0IHJlLWFuY2hvcmVkIHZpZXcsIHNvIGFcbiAgICogICBzZWNvbmQgY29tbWl0IGRpZmZzIGFnYWluc3QgcG9zdC1maXJzdC1jb21taXQgc3RhdGUuIFRoZSBwcmUtcmVsZWFzZVxuICAgKiAgIGJ1ZmZlciBiZWhhdmVkIHRoZSBzYW1lIGZvciBWQUxVRVMgKGl0cyBgd29ya2luZ0NvcHlgIHdhcyByZXNldCBvblxuICAgKiAgIGNvbW1pdCwgZmFsbGluZyByZWFkcyB0aHJvdWdoIHRvIGxpdmUgc3RhdGUpIGJ1dCBrZXB0IHRoZSBPUklHSU5BTFxuICAgKiAgIGBiYXNlU25hcHNob3RgIGFzIGRpZmYgYmFzZSDigJQgdW5yZWFjaGFibGUgaW4gcHJhY3RpY2U6IHRoZSBlbmdpbmUnc1xuICAgKiAgIG9ubHkgd3JpdGVzIGFmdGVyIGEgY29tbWl0IGFyZSB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBjb21taXR0ZWRcbiAgICogICBicmFuY2ggcGFyZW50IChhIGRlY2lkZXIgb3IgZm9yayBmcmFtZSBjb21taXRzIGJlZm9yZSBpdHMgYnJhbmNoIHJ1bnMpO1xuICAgKiAgIHRoZSBvdGhlciBcIndyaXRlIGFmdGVyIGNvbW1pdFwiXG4gICAqICAgc2l0ZXMgKFN1YmZsb3dFeGVjdXRvciBzZWVkIOKGkiByZXBsYWNlcyB0aGUgY29udGV4dDsgcmVzdW1lIOKGkiBmcmVzaFxuICAgKiAgIGNvbnRleHQgdmlhIGBsZWFmLmNyZWF0ZU5leHRgKSBuZXZlciByZS11c2UgYSBjb21taXR0ZWQgY29udGV4dC5cbiAgICogLSBBIFVTRVIgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgaXMgYSBkaWZmZXJlbnQgbWF0dGVyOiBpdHMgd3JpdGVzXG4gICAqICAgd291bGQgbGFuZCBpbiBhIGJ1ZmZlciBub3RoaW5nIGV2ZXIgY29tbWl0cy4gVGhhdCByZWZ1c2FsIGxpdmVzIG9uIHRoZVxuICAgKiAgIHNjb3BlIHRpZXIgKGBTY29wZUZhY2FkZWAsIHNlYWxlZCBieSB0aGUgY29tbWl0IG9ic2VydmVyIOKAlCA5LjIyLjApLFxuICAgKiAgIGJlY2F1c2UgdGhlIGZyYW1lJ3MgcmUtdXNhYmlsaXR5IGlzIGV4YWN0bHkgd2hhdCB0aGUgZW5naW5lIHBhdGhzXG4gICAqICAgYWJvdmUgbmVlZC5cbiAgICogLSBgX3N0YWdlV3JpdGVzYCAvIGBfc3RhZ2VSZWFkc2AgYXJlIE5PVCByZWxlYXNlZCDigJQgYHNuYXBzaG90U2VsZigpYFxuICAgKiAgIHJlYWRzIHRoZW0gcG9zdC1ydW4gZm9yIHRoZSBleGVjdXRpb24tdHJlZSBzbmFwc2hvdC5cbiAgICovXG4gIGNvbW1pdChwaGFzZT86IENvbW1pdFBoYXNlKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY29tbWl0UmV0YWluZWQocGhhc2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNhcHR1cmU/LmxpbWl0KCdjb21taXQtcmV0ZW50aW9uLWZhaWxlZCcpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb21taXRSZXRhaW5lZChwaGFzZT86IENvbW1pdFBoYXNlKTogdm9pZCB7XG4gICAgLy8gQSBjb250aW51YXRpb24gb25seSBBRlRFUiB0aGUgZXhlY3V0aW9uJ3Mgb3duIGJ1bmRsZSAoc2VlIGFib3ZlKS5cbiAgICBjb25zdCBjb250aW51YXRpb24gPSB0aGlzLl9jb21taXR0ZWQgPyBwaGFzZSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1hdGVyaWFsaXNlV3JpdGVzKCk7XG4gICAgdGhpcy53YXJuT25Cb3Jyb3dlZE11dGF0aW9uKCk7XG4gICAgLy8gVGhlIHJlY29yZCdzIGhhbGYgKGBSZWNvcmRGcmFtZSDCtyBjb21taXRgIOKGkiBgcmVjb3JkQ29tbWl0LnRzYCkuIE5vIGJ1ZmZlclxuICAgIC8vID0gbm8gd3JpdGUgZXZlciBidWlsdCBvbmUgKCMxMyk6IHRoZSBjb21taXQgaXMgZW1wdHkgYnkgY29uc3RydWN0aW9uLFxuICAgIC8vIHJlY29yZGVkIHdpdGggWkVSTyBjbG9uZXMuIFRoZSBuYW1lcyBhcmUgcmVhZCBvbmNlIHRoZSBwYXlsb2FkIGlzIGJ1aWx0LlxuICAgIHRoaXMucmVjb3JkLmNvbW1pdCgoKSA9PiAoe1xuICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgICB1bnRyYWNrZWRTb3VyY2VzOiB0aGlzLl91bnRyYWNrZWRTb3VyY2VzLFxuICAgICAgdGFnczogdGhpcy50YWdzLFxuICAgICAgcGhhc2U6IGNvbnRpbnVhdGlvbixcbiAgICB9KSk7XG4gICAgLy8gVGhlIG9ic2VydmVyIChTY29wZUZhY2FkZSkgc2VlcyB0aGUgdHJhY2tlZCBtdXRhdGlvbnMsIFRIRU4gdGhlIHN0YWdpbmdcbiAgICAvLyBzdGF0ZSBpcyByZWxlYXNlZCAoIzEzYiksIHNvIGl0IHNlZXMgdGhlIHdvcmxkIGFzIGl0IHdhcy4gRDIncyBtYXJrZXJzXG4gICAgLy8gYW5kIHRoZSBkZWNsYXJlZCB0YWdzIHJlbGVhc2Ugd2l0aCBpdCDigJQgb25lIHN0YW1wIHBlciBleGVjdXRpb24sIHNvIHRoZVxuICAgIC8vIGVuZ2luZSdzIGRvdWJsZS1jb21taXQgcGF0aHMgcmVjb3JkIHRoZW0gZXhhY3RseSBvbmNlLlxuICAgIGlmICh0aGlzLl9jb21taXRPYnNlcnZlcikge1xuICAgICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIoeyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9KTtcbiAgICB9XG4gICAgdGhpcy5yZWNvcmQucmVsZWFzZSgpO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50YWdzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NvbW1pdHRlZCA9IHRydWU7XG4gICAgLy8gVGhlIHN0YWdlIGlzIG92ZXI6IGV2ZXJ5IGNhbGwgaXQgbWFkZSB0aGF0IGlzIHN0aWxsIHJ1bm5pbmcgc3RvcHMgKFAyKSwgYW5kIG5vdGhpbmcgcmVwb3J0cyB0aHJvdWdoIHRoZVxuICAgIC8vIGVuZ2luZSBhbnkgbW9yZSDigJQgYSBsYXRlIHJlY29yZCBpcyByZWZ1c2VkIGJlZm9yZSBpdCB3b3VsZCByZWFjaCBpdC5cbiAgICB0aGlzLmVuZENhbGxzKHVuZGVmaW5lZCk7XG4gICAgdGhpcy5fYXR0ZW1wdFJlcG9ydGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBmcmFtZSBoYXMgY29tbWl0dGVkIOKAlCBhIGNhbGwncyByZWNvcmQgYXJyaXZpbmcgYWZ0ZXIgaXQgaXMgbGF0ZSAoUDIsIGBTY29wZUZhY2FkZSDCtyBjYWxsYCkuICovXG4gIGdldCBjb21taXR0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbW1pdHRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvdyBhd2F5IGV2ZXJ5dGhpbmcgdGhpcyBzdGFnZSBoYXMgU1RBR0VELCB3aXRob3V0IGNvbW1pdHRpbmcgYW55IG9mIGl0LlxuICAgKlxuICAgKiBUaGUgaXNvbGF0aW9uIHByaW1pdGl2ZSBiZWhpbmQgZGVjbGFyYXRpdmUgcmV0cnk6IHdoZW4gYSBub24tZmluYWwgYXR0ZW1wdFxuICAgKiBmYWlscywgdGhlIHdyaXRlcyBpdCBzdGFnZWQgbXVzdCBub3QgYmUgdmlzaWJsZSB0byB0aGUgbmV4dCBhdHRlbXB0LCBtdXN0XG4gICAqIG5vdCByZWFjaCBzaGFyZWQgc3RhdGUsIGFuZCBtdXN0IG5vdCBhcHBlYXIgaW4gdGhlIGNvbW1pdCBsb2cgb3IgaW4gdGhpc1xuICAgKiBzdGFnZSdzIHNuYXBzaG90LiBEcm9wcGluZyB0aGUgc3RhZ2luZyBzdGF0ZSBhY2hpZXZlcyBhbGwgZm91ciBhdCBvbmNlIOKAlFxuICAgKiB0aGVyZSBpcyBubyByb2xsYmFjayBtYWNoaW5lcnkgdG8gaW52b2tlIGJlY2F1c2Ugbm90aGluZyB3YXMgZXZlciBhcHBsaWVkXG4gICAqIChNMTogdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciBob2xkcyB3cml0ZXMgdW50aWwgYGNvbW1pdCgpYCBmbHVzaGVzIHRoZW0pLlxuICAgKlxuICAgKiBXaGF0IGlzIHJlbGVhc2VkLCBhbmQgd2h5IGVhY2ggb25lIG1hdHRlcnMgZm9yIHRoZSBuZXh0IGF0dGVtcHQ6XG4gICAqICAtIHRoZSByZWNvcmQgZnJhbWUncyBzdGFnZWQgc3RhdGUgKGBSZWNvcmRGcmFtZSDCtyBkaXNjYXJkYCkg4oCUIHRoZSBidWZmZXJcbiAgICogICAgICAgICAgICAgICAgICAgICh0aGUgbmV4dCBhdHRlbXB0IHN0YXJ0cyB3aXRoIG5vdGhpbmcgc3RhZ2VkKSwgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICBmaXJzdC10b3VjaCBiYXNlIChpdCByZS1hbmNob3JzIG9uIGNvbW1pdHRlZCBzdGF0ZSBhc1xuICAgKiAgICAgICAgICAgICAgICAgICAgaXQgc3RhbmRzIE5PVyDigJQgYSBzaWJsaW5nIGZvcmsgYnJhbmNoIG1heSBsZWdpdGltYXRlbHlcbiAgICogICAgICAgICAgICAgICAgICAgIGhhdmUgY29tbWl0dGVkIGluIGJldHdlZW4pIGFuZCB0aGUgcmVhZEtleXMgbGlzdCAoI1AxOlxuICAgKiAgICAgICAgICAgICAgICAgICAgYSBkaXNjYXJkZWQgYXR0ZW1wdCdzIHJlYWRzIG11c3QgbmV2ZXIgcmVhY2ggdGhlIG5leHRcbiAgICogICAgICAgICAgICAgICAgICAgIGF0dGVtcHQncyBgVHJhY2VFbnRyeS5yZWFkS2V5c2ApO1xuICAgKiAgLSBgX3N0YWdlV3JpdGVzYCAvIGBfcGVuZGluZ1dyaXRlc2AgLyBgX3N0YWdlUmVhZHNgIOKAlCB0aGUgc25hcHNob3RcbiAgICogICAgICAgICAgICAgICAgICAgIHBheWxvYWQ7IHdpdGhvdXQgdGhlIHJlc2V0IHRoZSBleGVjdXRpb24gdHJlZSB3b3VsZFxuICAgKiAgICAgICAgICAgICAgICAgICAgcmVwb3J0IHdyaXRlcyB0aGF0IHdlcmUgZGlzY2FyZGVkLCB3aGljaCBpcyB0aGUgZXhhY3RcbiAgICogICAgICAgICAgICAgICAgICAgIGxpZSB0aGlzIGZlYXR1cmUgZXhpc3RzIHRvIHByZXZlbnQgKHRoZSBwZW5kaW5nIG1hcFxuICAgKiAgICAgICAgICAgICAgICAgICAgaG9sZHMgYmFyZSByZWZlcmVuY2VzIOKAlCBkcm9wcGluZyBpdCB1bi1jbG9uZXMgbm90aGluZyk7XG4gICAqICAtIGBfdW50cmFja2VkU291cmNlc2Ag4oCUIHRoZSBEMiBob25lc3R5IG1hcmtlcnMsIHJlbGVhc2VkIHdpdGggdGhlIHJlc3QuXG4gICAqXG4gICAqIFdoYXQgaXMgZGVsaWJlcmF0ZWx5IEtFUFQ6IGBkZWJ1Z2AgKGxvZ3MsIG1ldHJpY3MsIGVycm9ycywgZmxvdyBtZXNzYWdlcylcbiAgICogYW5kIHRoZSBhdHRlbXB0IHJlY29yZHMgKDEwLjEpLiBCb3RoIGFyZSB0aGUgYXBwZW5kLW9ubHkgcmVjb3JkIG9mIHdoYXRcbiAgICogZXZlcnkgYXR0ZW1wdCBkaWQsIGFuZCB0aGUgcmV0cnkgZmVhdHVyZSdzIHdob2xlIHBvaW50IGlzIHRoYXQgdGhlIGVhcmxpZXJcbiAgICogYXR0ZW1wdHMgc3RheSB2aXNpYmxlLlxuICAgKlxuICAgKiBObyBjb21taXQgaXMgcmVjb3JkZWQgYW5kIG5vIG9ic2VydmVyIGZpcmVzIOKAlCBhIGRpc2NhcmRlZCBhdHRlbXB0IGlzIG5vdCBhXG4gICAqIGN1cnNvciBzdG9wLCBiZWNhdXNlIGZyb20gc2hhcmVkIHN0YXRlJ3MgcG9pbnQgb2YgdmlldyBpdCBuZXZlciBoYXBwZW5lZC5cbiAgICovXG4gIGRpc2NhcmRTdGFnZWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmQuZGlzY2FyZCgpO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGVuZGluZ1dyaXRlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zdGFnZVdyaXRlcyA9IHt9O1xuICAgIHRoaXMuX3N0YWdlUmVhZHMgPSB7fTtcbiAgICB0aGlzLl9uZXN0ZWRSZWFkcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl92aWV3UmVhZHMgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIAgQXR0ZW1wdHMgKDEwLjEpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBBcHBlbmQgb25lIGF0dGVtcHQncyByZWNvcmQg4oCUIHRoZSBhdHRlbXB0IHJ1bm5lciBjYWxscyB0aGlzIGFzIGVhY2ggYXR0ZW1wdCBlbmRzLiAqL1xuICByZWNvcmRBdHRlbXB0KHJlY29yZDogQXR0ZW1wdFJlY29yZCk6IHZvaWQge1xuICAgICh0aGlzLl9hdHRlbXB0cyA/Pz0gW10pLnB1c2gocmVjb3JkKTtcbiAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKCkgPT4gdGhpcy5jYXB0dXJlPy5saW1pdCgnYXR0ZW50aW9uLW9taXR0ZWQnKSkpLnJlY29yZEF0dGVtcHQoXG4gICAgICByZWNvcmQsXG4gICAgICB0aGlzLnJ1bnRpbWVTdGFnZUlkLFxuICAgICk7XG4gICAgdGhpcy5ub3RlQXR0ZW1wdChyZWNvcmQpO1xuICAgIC8vIFRoZSBzdGFnZSBhdHRlbXB0IGlzIG92ZXIsIGhvd2V2ZXIgaXQgZW5kZWQ6IHRoZSBjYWxscyBpdCBtYWRlIHN0b3AgKFAyKS5cbiAgICB0aGlzLmVuZENhbGxzKHJlY29yZC5hdHRlbXB0KTtcbiAgfVxuXG4gIC8qKiBTdGFtcCB0aGUgc2VyaWVzJyBzdW1tYXJ5IOKAlCBvbmNlLCB3aGVuIHRoZSBydW5uZXIgZW5kcyB0aGUgc2VyaWVzLiAqL1xuICBlbmRBdHRlbXB0cyhzdW1tYXJ5OiBBdHRlbXB0U3VtbWFyeSk6IHZvaWQge1xuICAgIHRoaXMuX2F0dGVtcHRTdW1tYXJ5ID0gc3VtbWFyeTtcbiAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKCkgPT4gdGhpcy5jYXB0dXJlPy5saW1pdCgnYXR0ZW50aW9uLW9taXR0ZWQnKSkpLnJlY29yZFN1bW1hcnkoc3VtbWFyeSk7XG4gIH1cblxuICAvKiogUmVzZXQgb25seSBhdCB0aGUgbm9kZSdzIGV4ZWN1dGlvbiBzdGFtcCwgbmV2ZXIgYmV0d2VlbiBhdHRlbXB0cy4gKi9cbiAgYmVnaW5BdHRlbnRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fYXR0ZW50aW9uPy5iZWdpbigpO1xuICB9XG5cbiAgLyoqIERlbGVnYXRlIHRoZSBleHBsaWNpdCByZXRhaW5lZC1lcnJvciBmYWN0OyBhdHRlbnRpb24gb3ducyB2YWxpZGF0aW9uIG9mIGl0cyBwcm9vZi4gKi9cbiAgbWFya1N0YWdlRmFpbHVyZSgpOiB2b2lkIHtcbiAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKCkgPT4gdGhpcy5jYXB0dXJlPy5saW1pdCgnYXR0ZW50aW9uLW9taXR0ZWQnKSkpLnN0YWdlRmFpbGVkKFxuICAgICAgdGhpcy5kZWJ1Zy5lcnJvckNvbnRleHQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3Jhc2gtc2FmZSByZWNvcmQgKDEwLjEsIFA2KTogYW4gYXR0ZW1wdCB0aGF0IGVuZGVkIGlzIG5vdGVkIGluIHRoZSBydW4ncyBzaW5rIEFUIE9OQ0UsIGJlc2lkZSB0aGlzIGZyYW1lJ3NcbiAgICogbG9nIOKAlCBzbyBhIHByb2Nlc3Mga2lsbGVkIGJlZm9yZSB0aGUgc3RhZ2UgY29tbWl0cyAobWlkLXJldHJ5KSBzdGlsbCBsZWF2ZXMgZXZlcnkgYXR0ZW1wdCB0aGF0IGVuZGVkLiBUaGVcbiAgICogcmVjb3JkIGlzIHRoZSBvbmUgdGhlIHRyZWUga2VlcHM6IGZyb3plbiwgYHN0cnVjdHVyZWRDbG9uZWAtc2FmZSwgaXRzIGVycm9yIHRoZSBTRVJWRUQgZm9ybSAobm8gYHJhd2ApLCBzbyB0aGVcbiAgICogbm90ZSBuZWVkcyBubyBzZWNvbmQgcmVkYWN0aW9uIHBhc3MuIFdpdGhvdXQgYSBzaW5rIHRoZSBsb2cgZG9lcyBub3RoaW5nIChgRXZlbnRMb2cgwrcgbm90ZWApLlxuICAgKi9cbiAgcHJpdmF0ZSBub3RlQXR0ZW1wdChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZC5sb2c/Lm5vdGUoJ2F0dGVtcHQnLCB7IHJlY29yZCB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgYXR0ZW1wdHMgb2YgdGhpcyBleGVjdXRpb24gc28gZmFyLCBpbiBvcmRlciDigJQgaXRzIG93biBhbmQgaXRzIGNhbGxzJzsgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZS4gKi9cbiAgZ2V0IGF0dGVtcHRzKCk6IHJlYWRvbmx5IEF0dGVtcHRSZWNvcmRbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dGVtcHRzO1xuICB9XG5cbiAgLyoqIFRoZSBlbmRlZCBzZXJpZXMnIHN1bW1hcnk7IGB1bmRlZmluZWRgIHdoaWxlIGl0IHJ1bnMgYW5kIHdpdGhvdXQgYSBwb2xpY3kuICovXG4gIGdldCBhdHRlbXB0U3VtbWFyeSgpOiBBdHRlbXB0U3VtbWFyeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dGVtcHRTdW1tYXJ5O1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0IGFib3V0IHRvIHJ1biAoYW5kIHRoZSBydW4ncyBzaWduYWwpIOKAlCBgU3RhZ2VSdW5uZXJgIHNldHMgYm90aCBiZWZvcmUgaXQgYnVpbGRzIHRoZSBzY29wZS4gKi9cbiAgdXNlQXR0ZW1wdChhdHRlbXB0OiBBdHRlbXB0Q29udGV4dCB8IHVuZGVmaW5lZCwgcnVuU2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMuc291cmNlQXR0ZW1wdCA9XG4gICAgICBhdHRlbXB0ICYmIHRoaXMuI2ZhaWx1cmVJZGVudGl0eVxuICAgICAgICA/IGJ1aWxkQXR0ZW1wdElkKHRoaXMuI2ZhaWx1cmVJZGVudGl0eS5ydW50aW1lU3RhZ2VJZCwgYXR0ZW1wdC5hdHRlbXB0KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9hdHRlbXB0ID0gYXR0ZW1wdDtcbiAgICB0aGlzLl9ydW5TaWduYWwgPSBydW5TaWduYWw7XG4gIH1cblxuICAvKiogVGhlIGF0dGVtcHQgbm93IHJ1bm5pbmc7IGB1bmRlZmluZWRgIGZvciBhIHN0YWdlIHRoZSBhdHRlbXB0IHJ1bm5lciBkb2VzIG5vdCBydW4uICovXG4gIGdldCBhdHRlbXB0KCk6IEF0dGVtcHRDb250ZXh0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYXR0ZW1wdDtcbiAgfVxuXG4gIC8qKiBUaGUgcnVuJ3Mgc2lnbmFsLCBhcyBgU3RhZ2VSdW5uZXJgIGxhc3Qgc2F3IGl0LiAqL1xuICBnZXQgcnVuU2lnbmFsKCk6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuU2lnbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgYGF0dGVtcHRgIGVuZGVkIHdpdGhvdXQgYW4gYW5zd2VyOiBmcm9tIG5vdyBvbiBpdHMgc2NvcGUgaXMgZmVuY2VkIOKAlCBhIHdyaXRlLCBhbiBlbWl0IG9yIGEgcmVhZFxuICAgKiB0aHJvdWdoIGl0IGlzIHJlZnVzZWQgKGBTY29wZUZhY2FkZWApLiBUaGUgcnVubmVyIGNhbGxzIHRoaXMgdGhlIG1vbWVudCB0aGUgYXR0ZW1wdCdzIHNpZ25hbCBhYm9ydHMuXG4gICAqL1xuICBlbmRBdHRlbXB0KGF0dGVtcHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9hdHRlbXB0Py5hdHRlbXB0ID09PSBhdHRlbXB0KSB0aGlzLnNvdXJjZUF0dGVtcHQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGF0dGVtcHQgPiB0aGlzLl9lbmRlZFRocm91Z2gpIHRoaXMuX2VuZGVkVGhyb3VnaCA9IGF0dGVtcHQ7XG4gICAgLy8gSXRzIGNhbGxzIHN0b3AgYXQgdGhlIHNhbWUgbW9tZW50LCB3aXRoIHRoZSBhdHRlbXB0J3Mgb3duIHJlYXNvbiB3aGVuIGl0cyBzaWduYWwgYWJvcnRlZCAoYSBjYXAgb3IgdGhlXG4gICAgLy8gZGVhZGxpbmUgaXMgYSB0aW1lIGxpbWl0OiBhIGNhbGwgaXQgY3V0cyB0aW1lZCBvdXQpIOKAlCBzeW5jaHJvbm91cywgYWhlYWQgb2YgdGhlIGNhbGxzJyBvd24gbGlzdGVuZXJzLlxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9hdHRlbXB0O1xuICAgIGNvbnN0IHNpZ25hbCA9IGN1cnJlbnQgIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50LmF0dGVtcHQgPT09IGF0dGVtcHQgPyBjdXJyZW50LnNpZ25hbCA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVuZENhbGxzKGF0dGVtcHQsIHNpZ25hbD8uYWJvcnRlZCA/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYXR0ZW1wdCBgYXR0ZW1wdGAgaGFzIGVuZGVkIOKAlCBpdHMgc2NvcGUgbWF5IG5vIGxvbmdlciB0b3VjaCB0aGUgc3RhZ2UuICovXG4gIGhhc0F0dGVtcHRFbmRlZChhdHRlbXB0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gYXR0ZW1wdCA8PSB0aGlzLl9lbmRlZFRocm91Z2g7XG4gIH1cblxuICAvKiogUmVjb3JkIGEgd3JpdGUgYW4gZW5kZWQgYXR0ZW1wdCB0cmllZCDigJQgYSBuYW1lLCBuZXZlciB0aGUgdmFsdWUuIEFwcGVuZC1vbmx5IGV2aWRlbmNlIGxpa2UgdGhlIGF0dGVtcHRzLiAqL1xuICByZWNvcmRMYXRlV3JpdGUod3JpdGU6IExhdGVXcml0ZSk6IHZvaWQge1xuICAgIGNvbnN0IHdyaXRlcyA9ICh0aGlzLl9sYXRlV3JpdGVzID8/PSBbXSk7XG4gICAgLy8gQm91bmRlZDogdGhlIGZpcnN0IG9uZXMgc2F5IHdoYXQgdGhlIGFiYW5kb25lZCBhdHRlbXB0IGtlcHQgZG9pbmc7IGEgbG9vcCBvZiB0aGVtIGFkZHMgbm90aGluZy5cbiAgICBpZiAod3JpdGVzLmxlbmd0aCA8IE1BWF9MQVRFX1dSSVRFUykgd3JpdGVzLnB1c2goT2JqZWN0LmZyZWV6ZSh7IC4uLndyaXRlIH0pKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTaWRlIGVmZmVjdHMgKFAzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogVGhpcyBleGVjdXRpb24ncyBvd24gaWRlbXBvdGVuY3kga2V5IG1heSBiZSBtYWRlIG9mIGEgc2VsZWN0ZWQgdmFsdWUgKG9yIHdhcyBjYXJyaWVkIGJ5IGEgY2hlY2twb2ludCkuICovXG4gIHByaXZhdGUgX2VmZmVjdEtleVRhaW50ZWQgPSBmYWxzZTtcbiAgLyoqIEEgdG91Y2hpbmcgYCRjYWxsYCB3aXRoIE5PIGtleSBzdGFydGVkIGluIHRoaXMgZXhlY3V0aW9uIOKAlCB0aGUgc3RhZ2UgbWF5IG5vdCBiZSByZS1ydW4gYnkgYSByZXN1bWUuICovXG4gIHByaXZhdGUgX2tleWxlc3NFZmZlY3QgPSBmYWxzZTtcblxuICAvKipcbiAgICogU3RhcnQgYW4gZXhlY3V0aW9uJ3Mgc2lkZS1lZmZlY3QgYm9va2tlZXBpbmcgKGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgZXhlY3V0ZVN0YWdlYCwgYmVmb3JlIGF0dGVtcHQgMSkg4oCUIHJlc2V0LFxuICAgKiBiZWNhdXNlIGEgZnJhbWUgY2FuIGJlIHJlLXVzZWQgYnkgYSBsYXRlciBleGVjdXRpb24uIGBrZXlUYWludGVkYDogdGhlIHN0YWdlJ3Mgb3duIGtleSBtYXkgYmUgbWFkZSBvZiBhIHNlbGVjdGVkXG4gICAqIHZhbHVlLCBzbyBhIGtleSBhIGAkY2FsbGAgcGFzc2VzIG9uIChgJGF0dGVtcHQoKS5pZGVtcG90ZW5jeUtleWApIGlzIHNlcnZlZCB0aGUgc2FtZSB3YXkuXG4gICAqL1xuICBiZWdpbkVmZmVjdHMoa2V5VGFpbnRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2VmZmVjdEtleVRhaW50ZWQgPSBrZXlUYWludGVkO1xuICAgIHRoaXMuX2tleWxlc3NFZmZlY3QgPSBmYWxzZTtcbiAgfVxuXG4gIGdldCBlZmZlY3RLZXlUYWludGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9lZmZlY3RLZXlUYWludGVkO1xuICB9XG5cbiAgLyoqIEEga2V5bGVzcyB0b3VjaGluZyBgJGNhbGxgIHN0YXJ0ZWQ6IGFuIGBpbnRlcnJ1cHQoKWAgYWZ0ZXIgaXQgd291bGQgcmUtc2VuZCBpdCBvbiByZXN1bWUgKGBTdGFnZVJ1bm5lcmApLiAqL1xuICBtYXJrS2V5bGVzc0VmZmVjdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9rZXlsZXNzRWZmZWN0ID0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBoYXNLZXlsZXNzRWZmZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9rZXlsZXNzRWZmZWN0O1xuICB9XG5cbiAgLy8g4pSA4pSAIENhbGxzIG1hZGUgaW5zaWRlIHRoZSBzdGFnZSAoUDIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBXaGVyZSB0aGlzIGV4ZWN1dGlvbidzIGNhbGwgcmVjb3JkcyBhcmUgcmVwb3J0ZWQg4oCUIHRoZSBlbmdpbmUgc2V0cyBpdCBiZWZvcmUgdGhlIHN0YWdlIHJ1bnMuICovXG4gIHVzZUF0dGVtcHRSZXBvcnRlcihcbiAgICByZXBvcnQ6ICgocmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8gfCB1bmRlZmluZWQpID0+IHZvaWQpIHwgdW5kZWZpbmVkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9hdHRlbXB0UmVwb3J0ZXIgPSByZXBvcnQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNpZ25hbCB0aGUgY2FsbHMgb2Ygc3RhZ2UgYXR0ZW1wdCBgc3RhZ2VBdHRlbXB0YCBydW4gdW5kZXIgYmVzaWRlcyBpdHMgb3duIChQMik6IGFib3J0ZWQgd2hlbiB0aGF0IGF0dGVtcHQgaXNcbiAgICogb3ZlciDigJQgaG93ZXZlciBpdCBlbmRlZCDigJQgYW5kIHdoZW4gdGhlIGZyYW1lIGNvbW1pdHMsIHNvIG5vIGNhbGwgb3V0bGl2ZXMgdGhlIGF0dGVtcHQgdGhhdCBtYWRlIGl0IChub1xuICAgKiBiYWNrZ3JvdW5kIHJldHJ5LCBubyB3YWl0LCBubyBsaXN0ZW5lciBsZWZ0IG9uIHRoZSBydW4ncyBzaWduYWwpLiBBbHJlYWR5IGFib3J0ZWQgYWZ0ZXIgdGhlIGNvbW1pdC5cbiAgICovXG4gIGNhbGxzRW5kZWRTaWduYWwoc3RhZ2VBdHRlbXB0OiBudW1iZXIpOiBBYm9ydFNpZ25hbCB7XG4gICAgY29uc3QgZW5kZWQgPSAodGhpcy5fY2FsbHNFbmRlZCA/Pz0gbmV3IE1hcCgpKTtcbiAgICBsZXQgY29udHJvbGxlciA9IGVuZGVkLmdldChzdGFnZUF0dGVtcHQpO1xuICAgIGlmIChjb250cm9sbGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBlbmRlZC5zZXQoc3RhZ2VBdHRlbXB0LCBjb250cm9sbGVyKTtcbiAgICAgIGlmICh0aGlzLl9jb21taXR0ZWQpIGNvbnRyb2xsZXIuYWJvcnQoY2FsbHNFbmRlZFJlYXNvbigpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuc2lnbmFsO1xuICB9XG5cbiAgLyoqIEVuZCB0aGUgY2FsbHMgb2YgYHN0YWdlQXR0ZW1wdGAgKGV2ZXJ5IGF0dGVtcHQncyB3aGVuIGB1bmRlZmluZWRgKSDigJQgYHJlYXNvbmAgd2hlbiB0aGUgYXR0ZW1wdCdzIHNpZ25hbCBnYXZlIG9uZS4gKi9cbiAgcHJpdmF0ZSBlbmRDYWxscyhzdGFnZUF0dGVtcHQ6IG51bWJlciB8IHVuZGVmaW5lZCwgcmVhc29uPzogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9jYWxsc0VuZGVkID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IFthdHRlbXB0LCBjb250cm9sbGVyXSBvZiB0aGlzLl9jYWxsc0VuZGVkKSB7XG4gICAgICBpZiAoc3RhZ2VBdHRlbXB0ICE9PSB1bmRlZmluZWQgJiYgYXR0ZW1wdCAhPT0gc3RhZ2VBdHRlbXB0KSBjb250aW51ZTtcbiAgICAgIGlmICghY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY29udHJvbGxlci5hYm9ydChyZWFzb24gPz8gY2FsbHNFbmRlZFJlYXNvbigpKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIG5leHQgY2FsbCdzIG9yZGluYWwgd2l0aGluIHN0YWdlIGF0dGVtcHQgYHN0YWdlQXR0ZW1wdGAsIDEtYmFzZWQgKGBhdHRlbXB0L2NhbGwudHMgwrcgY2FsbFNlcmllc2ApLiAqL1xuICBuZXh0Q2FsbE9yZGluYWwoc3RhZ2VBdHRlbXB0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG9yZGluYWxzID0gKHRoaXMuX2NhbGxPcmRpbmFscyA/Pz0gbmV3IE1hcCgpKTtcbiAgICBjb25zdCBuZXh0ID0gKG9yZGluYWxzLmdldChzdGFnZUF0dGVtcHQpID8/IDApICsgMTtcbiAgICBvcmRpbmFscy5zZXQoc3RhZ2VBdHRlbXB0LCBuZXh0KTtcbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNhbGwncyAob3IgYW4gb2JzZXJ2ZWQpIGF0dGVtcHQgcmVjb3JkOiBrZXB0IGJlc2lkZSB0aGUgc3RhZ2UncyBvd24gYXR0ZW1wdHMg4oCUIHRoZSBmaXJzdFxuICAgKiB7QGxpbmsgTUFYX0NBTExfUkVDT1JEU30sIHRoZSByZXN0IGNvdW50ZWQg4oCUIGFuZCByZXBvcnRlZCB0byB0aGUgcnVuJ3MgYG9uQXR0ZW1wdGAgZWl0aGVyIHdheS4gTGlrZSB0aGUgc3RhZ2Unc1xuICAgKiByZWNvcmRzLCBOT1QgY2xlYXJlZCBieSB7QGxpbmsgZGlzY2FyZFN0YWdlZH06IGEgZmFpbGVkIGF0dGVtcHQncyBjYWxscyBhcmUgZXZpZGVuY2UgdG9vLlxuICAgKi9cbiAgcmVwb3J0Q2FsbEF0dGVtcHQocmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3I6IFN0cnVjdHVyZWRFcnJvckluZm8gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2FsbFJlY29yZHMgPCBNQVhfQ0FMTF9SRUNPUkRTKSB7XG4gICAgICB0aGlzLl9jYWxsUmVjb3JkcyArPSAxO1xuICAgICAgKHRoaXMuX2F0dGVtcHRzID8/PSBbXSkucHVzaChyZWNvcmQpO1xuICAgICAgKHRoaXMuX2F0dGVudGlvbiA/Pz0gbmV3IFN0YWdlQXR0ZW50aW9uKCgpID0+IHRoaXMuY2FwdHVyZT8ubGltaXQoJ2F0dGVudGlvbi1vbWl0dGVkJykpKS5yZWNvcmRBdHRlbXB0KFxuICAgICAgICByZWNvcmQsXG4gICAgICAgIHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgICApO1xuICAgICAgdGhpcy5ub3RlQXR0ZW1wdChyZWNvcmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hdHRlbXB0c0Ryb3BwZWQgKz0gMTtcbiAgICAgICh0aGlzLl9hdHRlbnRpb24gPz89IG5ldyBTdGFnZUF0dGVudGlvbigoKSA9PiB0aGlzLmNhcHR1cmU/LmxpbWl0KCdhdHRlbnRpb24tb21pdHRlZCcpKSkuYXR0ZW1wdERyb3BwZWQoKTtcbiAgICB9XG4gICAgdGhpcy5fYXR0ZW1wdFJlcG9ydGVyPy4ocmVjb3JkLCBzdHJ1Y3R1cmVkRXJyb3IpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRyZWUgbmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3JlYXRlIChvciByZXR1cm4pIHRoaXMgY29udGV4dCdzIGxpbmtlZCBzdWNjZXNzb3IuXG4gICAqXG4gICAqIE1FTU9JWkVEOiB0aGUgZmlyc3QgY2FsbCBjcmVhdGVzIGB0aGlzLm5leHRgOyBldmVyeSBsYXRlciBjYWxsIHJldHVybnNcbiAgICogdGhhdCBTQU1FIGNvbnRleHQgYW5kIElHTk9SRVMgaXRzIGFyZ3VtZW50cy4gSW4gbm9ybWFsIHRyYXZlcnNhbCBlYWNoXG4gICAqIGNvbnRleHQgYWR2YW5jZXMgZXhhY3RseSBvbmNlLCBzbyB0aGUgbWVtbyBuZXZlciBiaXRlcyDigJQgYnV0IGEgY2FsbGVyXG4gICAqIGV4cGVjdGluZyBhIGZyZXNoIGNvbnRleHQgZm9yIGRpZmZlcmVudCBgc3RhZ2VOYW1lYC9gc3RhZ2VJZGAgYXJncyBnZXRzXG4gICAqIHRoZSBvbGQgb25lIHNpbGVudGx5LiBEZXYgbW9kZSAoYGVuYWJsZURldk1vZGUoKWApIHdhcm5zIG9uIHRoYXRcbiAgICogbWlzbWF0Y2ggKGJhY2tsb2cgQjQpLlxuICAgKi9cbiAgY3JlYXRlTmV4dChwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMubmV4dCkge1xuICAgICAgdGhpcy5uZXh0ID0gbmV3IFN0YWdlQ29udGV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMucmVjb3JkLnN0YXRlLCAnJywgdGhpcy5yZWNvcmQubG9nLCBpc0RlY2lkZXIpO1xuICAgICAgdGhpcy5uZXh0LnBhcmVudCA9IHRoaXM7XG4gICAgICB0aGlzLm5leHQuaW5oZXJpdFJ1bih0aGlzKTtcbiAgICAgIHRoaXMubmV4dC5mYWlsdXJlU3RhdGUgPSB0aGlzLmZhaWx1cmVTdGF0ZTtcbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpICYmICh0aGlzLm5leHQuc3RhZ2VJZCAhPT0gc3RhZ2VJZCB8fCB0aGlzLm5leHQuc3RhZ2VOYW1lICE9PSBzdGFnZU5hbWUpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gU3RhZ2VDb250ZXh0LmNyZWF0ZU5leHQ6IG5leHQgY29udGV4dCBhbHJlYWR5IGV4aXN0cyBhcyBcIiR7dGhpcy5uZXh0LnN0YWdlTmFtZX1cIiBgICtcbiAgICAgICAgICBgKGlkOiBcIiR7dGhpcy5uZXh0LnN0YWdlSWR9XCIpIOKAlCBhcmd1bWVudHMgXCIke3N0YWdlTmFtZX1cIiAoaWQ6IFwiJHtzdGFnZUlkfVwiKSBhcmUgaWdub3JlZCBgICtcbiAgICAgICAgICAnYW5kIHRoZSBleGlzdGluZyBjb250ZXh0IGlzIHJldHVybmVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZXh0O1xuICB9XG5cbiAgY3JlYXRlQ2hpbGQocnVuSWQ6IHN0cmluZywgYnJhbmNoSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5jaGlsZHJlbikge1xuICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IG5ldyBTdGFnZUNvbnRleHQocnVuSWQsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5yZWNvcmQuc3RhdGUsIGJyYW5jaElkLCB0aGlzLnJlY29yZC5sb2csIGlzRGVjaWRlcik7XG4gICAgY2hpbGQucGFyZW50ID0gdGhpcztcbiAgICBjaGlsZC5pbmhlcml0UnVuKHRoaXMpO1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgcmV0dXJuIGNoaWxkO1xuICB9XG5cbiAgY3JlYXRlRGVjaWRlcihwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcpOiBTdGFnZUNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZU5leHQocGF0aCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0cnVlKTtcbiAgfVxuXG4gIHNldEFzRGVjaWRlcigpOiBTdGFnZUNvbnRleHQge1xuICAgIHRoaXMuaXNEZWNpZGVyID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEFzRm9yaygpOiBTdGFnZUNvbnRleHQge1xuICAgIHRoaXMuaXNGb3JrID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIOKUgOKUgCBEaWFnbm9zdGljcyBkZWxlZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBAaW50ZXJuYWwgUmV0YWluZWQgaW5jb21pbmcgdmFsdWUgZm9yIHRoZSBmYWNhZGUncyBsZWdhY3kgZW1pdCBjaGFubmVsLiAqL1xuICBhZGREaWFnbm9zdGljKGNoYW5uZWw6IERpYWdub3N0aWNDaGFubmVsLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLmRlYnVnLmFkZChjaGFubmVsLCBrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZExvZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTG9nKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRNZXRyaWMoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZE1ldHJpYyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0TWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkRXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldEV2YWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldEV2YWwoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFcnJvcihrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkRXJyb3Ioa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRGbG93RGVidWdNZXNzYWdlKFxuICAgIHR5cGU6IEZsb3dDb250cm9sVHlwZSxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IHRhcmdldFN0YWdlPzogc3RyaW5nIHwgc3RyaW5nW107IHJhdGlvbmFsZT86IHN0cmluZzsgY291bnQ/OiBudW1iZXI7IGl0ZXJhdGlvbj86IG51bWJlciB9LFxuICApIHtcbiAgICBjb25zdCBmbG93TWVzc2FnZTogRmxvd01lc3NhZ2UgPSB7IHR5cGUsIGRlc2NyaXB0aW9uLCB0aW1lc3RhbXA6IERhdGUubm93KCksIC4uLm9wdGlvbnMgfTtcbiAgICB0aGlzLmRlYnVnLmFkZEZsb3dNZXNzYWdlKGZsb3dNZXNzYWdlKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTbmFwc2hvdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBnZXRTdGFnZUlkKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnJ1bklkIHx8IHRoaXMucnVuSWQgPT09ICcnKSByZXR1cm4gdGhpcy5zdGFnZU5hbWU7XG4gICAgcmV0dXJuIGAke3RoaXMucnVuSWR9LiR7dGhpcy5zdGFnZU5hbWV9YDtcbiAgfVxuXG4gIGdldFNuYXBzaG90KCk6IFN0YWdlU25hcHNob3Qge1xuICAgIC8vIEl0ZXJhdGl2ZSB3YWxrIChleHBsaWNpdCB3b3JrIHN0YWNrKSwgTk9UIHJlY3Vyc2lvbjogdGhlIGV4ZWN1dGlvblxuICAgIC8vIHRyZWUgZGVlcGVucyBieSBvbmUgbGV2ZWwgcGVyIGV4ZWN1dGVkIHN0YWdlIGFsb25nIGBuZXh0YCBjaGFpbnMsIGFuZFxuICAgIC8vIHRoZSB0cmFtcG9saW5lZCB0cmF2ZXJzZXIgYWxsb3dzIGNoYWlucy9sb29wcyBvZiB0ZW5zIG9mIHRob3VzYW5kcyBvZlxuICAgIC8vIHN0YWdlcyDigJQgZmFyIGRlZXBlciB0aGFuIGEgcmVjdXJzaXZlIHNlcmlhbGl6ZXIgY2FuIHdhbGsgYmVmb3JlXG4gICAgLy8gXCJNYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnNuYXBzaG90U2VsZigpO1xuICAgIGNvbnN0IHdvcms6IEFycmF5PHsgY3R4OiBTdGFnZUNvbnRleHQ7IHNuYXA6IFN0YWdlU25hcHNob3QgfT4gPSBbeyBjdHg6IHRoaXMsIHNuYXA6IHJvb3QgfV07XG4gICAgd2hpbGUgKHdvcmsubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgeyBjdHgsIHNuYXAgfSA9IHdvcmsucG9wKCkhO1xuICAgICAgaWYgKGN0eC5uZXh0KSB7XG4gICAgICAgIGNvbnN0IG5leHRTbmFwID0gY3R4Lm5leHQuc25hcHNob3RTZWxmKCk7XG4gICAgICAgIHNuYXAubmV4dCA9IG5leHRTbmFwO1xuICAgICAgICB3b3JrLnB1c2goeyBjdHg6IGN0eC5uZXh0LCBzbmFwOiBuZXh0U25hcCB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChjdHguY2hpbGRyZW4pIHtcbiAgICAgICAgc25hcC5jaGlsZHJlbiA9IGN0eC5jaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGRTbmFwID0gY2hpbGQuc25hcHNob3RTZWxmKCk7XG4gICAgICAgICAgd29yay5wdXNoKHsgY3R4OiBjaGlsZCwgc25hcDogY2hpbGRTbmFwIH0pO1xuICAgICAgICAgIHJldHVybiBjaGlsZFNuYXA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuXG4gIC8qKiBTbmFwc2hvdCBvZiBUSElTIGNvbnRleHQncyBvd24gZmllbGRzIOKAlCBgbmV4dGAvYGNoaWxkcmVuYCBhcmUgZmlsbGVkXG4gICAqICBpbiBieSB0aGUgaXRlcmF0aXZlIHdhbGsgaW4gYGdldFNuYXBzaG90YC4gKi9cbiAgcHJpdmF0ZSBzbmFwc2hvdFNlbGYoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3Q6IFN0YWdlU25hcHNob3QgPSB7XG4gICAgICBpZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQgfHwgdW5kZWZpbmVkLFxuICAgICAgbmFtZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBpc0RlY2lkZXI6IHRoaXMuaXNEZWNpZGVyLFxuICAgICAgaXNGb3JrOiB0aGlzLmlzRm9yayxcbiAgICAgIGxvZ3M6IHRoaXMuZGVidWcubG9nQ29udGV4dCxcbiAgICAgIGVycm9yczogdGhpcy5kZWJ1Zy5lcnJvckNvbnRleHQsXG4gICAgICBtZXRyaWNzOiB0aGlzLmRlYnVnLm1ldHJpY0NvbnRleHQsXG4gICAgICBldmFsczogdGhpcy5kZWJ1Zy5ldmFsQ29udGV4dCxcbiAgICB9O1xuICAgIGNvbnN0IHN0YWdlV3JpdGVzID0gdGhpcy5yZXRhaW5lZFdyaXRlcygpO1xuICAgIGlmIChPYmplY3Qua2V5cyhzdGFnZVdyaXRlcykubGVuZ3RoID4gMCkge1xuICAgICAgLy8gRXh0cmFjdCB2YWx1ZXMgb25seSBmb3IgdGhlIHNuYXBzaG90IChzdHJpcCBvcGVyYXRpb24gbWV0YWRhdGEpXG4gICAgICBjb25zdCB3cml0ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtrLCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoc3RhZ2VXcml0ZXMpKSB7XG4gICAgICAgIHdyaXRlc1trXSA9IGVudHJ5LnZhbHVlO1xuICAgICAgfVxuICAgICAgc25hcHNob3Quc3RhZ2VXcml0ZXMgPSB3cml0ZXM7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zdGFnZVJlYWRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5zdGFnZVJlYWRzID0gdGhpcy5fc3RhZ2VSZWFkcztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24pIHtcbiAgICAgIHNuYXBzaG90LmRlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3ViZmxvd0lkKSB7XG4gICAgICBzbmFwc2hvdC5zdWJmbG93SWQgPSB0aGlzLnN1YmZsb3dJZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVidWcuZmxvd01lc3NhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LmZsb3dNZXNzYWdlcyA9IHRoaXMuZGVidWcuZmxvd01lc3NhZ2VzO1xuICAgIH1cbiAgICAvLyBBIGNvcHkgb2YgdGhlIGxpc3QgKHRoZSByZWNvcmRzIHRoZW1zZWx2ZXMgYXJlIGZyb3plbik6IGEgcmVhZGVyIG9mIG9uZSBzbmFwc2hvdCBuZXZlciBzZWVzIGEgbGF0ZXJcbiAgICAvLyBhdHRlbXB0IGFycml2ZSBpbiBpdCwgYW5kIG5ldmVyIGVkaXRzIHRoZSBmcmFtZSdzIG93biBsaXN0LlxuICAgIGlmICh0aGlzLl9hdHRlbXB0cykgc25hcHNob3QuYXR0ZW1wdHMgPSBPYmplY3QuZnJlZXplKFsuLi50aGlzLl9hdHRlbXB0c10pO1xuICAgIGlmICh0aGlzLl9hdHRlbXB0U3VtbWFyeSkgc25hcHNob3QuYXR0ZW1wdFN1bW1hcnkgPSB0aGlzLl9hdHRlbXB0U3VtbWFyeTtcbiAgICBpZiAodGhpcy5fbGF0ZVdyaXRlcykgc25hcHNob3QubGF0ZVdyaXRlcyA9IE9iamVjdC5mcmVlemUoWy4uLnRoaXMuX2xhdGVXcml0ZXNdKTtcbiAgICBpZiAodGhpcy5fYXR0ZW1wdHNEcm9wcGVkID4gMCkgc25hcHNob3QuYXR0ZW1wdHNEcm9wcGVkID0gdGhpcy5fYXR0ZW1wdHNEcm9wcGVkO1xuICAgIGNvbnN0IGF0dGVudGlvbiA9IHRoaXMuX2F0dGVudGlvbj8uc25hcHNob3QoKTtcbiAgICBpZiAoYXR0ZW50aW9uPy5sZW5ndGgpIHNuYXBzaG90LmF0dGVudGlvbiA9IGF0dGVudGlvbjtcbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cbn1cbiJdfQ==
1235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUlILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUs5QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFBK0Isa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUcsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3ZGLE9BQU8sRUFDTCxLQUFLLEVBQ0wsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixPQUFPLEVBQ1AsU0FBUyxHQUNWLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRSxtSEFBbUg7QUFDbkgsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDO0FBRTVCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFFckMsdUhBQXVIO0FBQ3ZILFNBQVMsZ0JB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SSxDQUFDLFNBQVM7WUFBRSxRQUFRLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksSUFBSSxDQUFDLGVBQWU7WUFBRSxRQUFRLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDekUsSUFBSSxJQUFJLENBQUMsV0FBVztZQUFFLFFBQVEsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDakYsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQztZQUFFLFFBQVEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQ2hGLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDOUMsSUFBSSxTQUFTLEVBQUUsTUFBTTtZQUFFLFFBQVEsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3RELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RhZ2VDb250ZXh0IOKAlCBFeGVjdXRpb24gY29udGV4dCBmb3IgYSBzaW5nbGUgc3RhZ2UgaW4gYSBmbG93Y2hhcnQgcnVuXG4gKlxuICogTGlrZSBhIHN0YWNrIGZyYW1lIGluIGEgY29tcGlsZXIvcnVudGltZTpcbiAqIC0gQSBSZWNvcmRGcmFtZSDigJQgdGhlIHJlY29yZCBoYWxmIChDMyk6IHRoZSBoZWFwLCB0aGUgYWRkcmVzcywgdGhlXG4gKiAgIGZpcnN0LXRvdWNoIGJhc2UsIHRoZSBsYXp5IHRyYW5zYWN0aW9uIGJ1ZmZlciBhbmQgZXZlcnkgd3JpdGUncyBzY3J1YlxuICogICAoQzQpLCB0aGUgcmVhZEtleXMgbGlzdFxuICogLSBMaW5rcyB0byBwYXJlbnQvY2hpbGQvbmV4dCBjb250ZXh0cyAoY2FsbCBzdGFjayBmcmFtZXMpXG4gKiAtIFdoYXQgYmVsb25ncyB0byBhIHN0YWdlIGluc2lkZSBhIHJ1bjogcmV0ZW50aW9uIG9mIHJlYWRzIGFuZCB3cml0ZXMsIHRoZVxuICogICByZWRhY3Rpb24gZGVjaXNpb24gcGVyIHdyaXRlIChgcmVkYWN0aW9uLnRzIMK3IGRlY2lkZVdyaXRlYCkgYW5kIHdoZXJlIHRoZVxuICogICBmcmFtZSB3cml0ZXMgKGBydW5BZGRyZXNzLnRzYCksIHRoZSBkZXYtbW9kZSB3YXJuaW5ncywgdGhlIGNvbW1pdCBvYnNlcnZlclxuICogLSBEaWFnbm9zdGljQ29sbGVjdG9yIGZvciBsb2dzLCBlcnJvcnMsIG1ldHJpY3NcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdFBoYXNlLCBFbWl0U291cmNlUG9zaXRpb24sIFVudHJhY2tlZFNvdXJjZSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50TG9nLCBTaGFyZWRNZW1vcnksIFdyaXRlVmVyYiB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5pbXBvcnQgeyBSZWNvcmRGcmFtZSB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgQXR0ZW1wdENvbnRleHQsIEF0dGVtcHRSZWNvcmQsIEF0dGVtcHRTdW1tYXJ5LCBMYXRlV3JpdGUgfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTmF0aXZlQ2FwdHVyZSB9IGZyb20gJy4uL2NhcHR1cmUvbmF0aXZlQ292ZXJhZ2UuanMnO1xuaW1wb3J0IHR5cGUgeyBFbmdpbmVSZWFkU291cmNlQ2FwdHVyZSB9IGZyb20gJy4uL2NhcHR1cmUvcmVhZFNvdXJjZXMuanMnO1xuaW1wb3J0IHsgRU1QVFlfU09VUkNFX1JFQURfQ09VTlRTLCBTb3VyY2VSZWFkQ291bnRlciB9IGZyb20gJy4uL2NhcHR1cmUvc291cmNlUmVhZENvdW50cy5qcyc7XG5pbXBvcnQgeyBzdW1tYXJpemVSZWFkVmFsdWUsIHN1bW1hcml6ZVdyaXRlVmFsdWUgfSBmcm9tICcuLi9jYXB0dXJlL3N1bW1hcml6ZS5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgU3RydWN0dXJlZEVycm9ySW5mbyB9IGZyb20gJy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgdHlwZSBUZXJtaW5hbEZhaWx1cmVDb250ZXh0LCBOYXRpdmVGYWlsdXJlU3RhdGUgfSBmcm9tICcuLi9lcnJvcnMvdGVybWluYWxGYWlsdXJlLmpzJztcbmltcG9ydCB7IFN0YWdlQXR0ZW50aW9uIH0gZnJvbSAnLi9hdHRlbnRpb24uanMnO1xuaW1wb3J0IHsgYm9ycm93ZWRNdXRhdGlvbk1lc3NhZ2UsIGNvbW1pdHRlZE11dGF0aW9uTWVzc2FnZSwgZmlyc3REaWZmZXJpbmdQYXRoIH0gZnJvbSAnLi9ib3Jyb3dlZE11dGF0aW9uLmpzJztcbmltcG9ydCB7IHR5cGUgRGlhZ25vc3RpY0NoYW5uZWwsIERpYWdub3N0aWNDb2xsZWN0b3IgfSBmcm9tICcuL0RpYWdub3N0aWNDb2xsZWN0b3IuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Q29udHJvbFR5cGUsIEZsb3dNZXNzYWdlLCBSZWFkVHJhY2tpbmdNb2RlLCBTdGFnZVNuYXBzaG90LCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4vZnJhbWVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblZlcmRpY3QgfSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQge1xuICBDTEVBUixcbiAgZGVjaWRlV3JpdGUsXG4gIGluaGVyaXRCeUlkZW50aXR5LFxuICBtYXJrU3RhZ2VkV3JpdGUsXG4gIFJlZGFjdGlvblJ1bGUsXG4gIFNDT1BFX1BMQUNFSE9MREVSLFxuICBzY3J1Yk9mLFxuICB1c2VyS2V5T2YsXG59IGZyb20gJy4vcmVkYWN0aW9uLmpzJztcbmltcG9ydCB7IHJ1bkFkZHJlc3MgfSBmcm9tICcuL3J1bkFkZHJlc3MuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuL3J1blBvbGljeS5qcyc7XG5pbXBvcnQgeyBERUZBVUxUX1JVTl9QT0xJQ1ksIHdpdGhSZWRhY3Rpb24gfSBmcm9tICcuL3J1blBvbGljeS5qcyc7XG5cbi8qKiBIb3cgbWFueSBsYXRlIHdyaXRlcyBhIHN0YWdlIGtlZXBzIOKAlCBhbiBhYmFuZG9uZWQgYXR0ZW1wdCB0aGF0IGxvb3BzIG11c3Qgbm90IGdyb3cgdGhlIHJlY29yZCB3aXRob3V0IGJvdW5kLiAqL1xuY29uc3QgTUFYX0xBVEVfV1JJVEVTID0gMTAwO1xuXG4vKipcbiAqIEhvdyBtYW55IGNhbGwgYW5kIG9ic2VydmVkIGF0dGVtcHQgcmVjb3JkcyBvbmUgc3RhZ2UgZXhlY3V0aW9uIGtlZXBzIChQMikg4oCUIGEgc3RhZ2UgdGhhdCBjYWxscyBpbiBhIGxvb3AgbXVzdFxuICogbm90IGdyb3cgdGhlIGV4ZWN1dGlvbiB0cmVlIHdpdGhvdXQgYm91bmQuIFRoZSByZXN0IGFyZSBjb3VudGVkIChgU3RhZ2VTbmFwc2hvdC5hdHRlbXB0c0Ryb3BwZWRgKSBhbmQgc3RpbGxcbiAqIGZpcmVkIG9uIGBvbkF0dGVtcHRgLiBBIHN0YWdlJ3MgT1dOIGF0dGVtcHQgcmVjb3JkcyBhcmUgbmV2ZXIgZGlzcGxhY2VkOiBpdHMgcG9saWN5J3MgY2VpbGluZyBib3VuZHMgdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9DQUxMX1JFQ09SRFMgPSAxMDAwO1xuXG4vKiogV2h5IGEgY2FsbCBzdG9wcGVkIHdoZW4gdGhlIHN0YWdlIGF0dGVtcHQgdGhhdCBtYWRlIGl0IGVuZGVkIHdpdGhvdXQgYSByZWFzb24gb2YgaXRzIG93biAoaXQgcmV0dXJuZWQgb3IgdGhyZXcpLiAqL1xuZnVuY3Rpb24gY2FsbHNFbmRlZFJlYXNvbigpOiBFcnJvciB7XG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgJ1tmb290cHJpbnRdICRjYWxsOiB0aGUgc3RhZ2UgYXR0ZW1wdCB0aGF0IG1hZGUgdGhpcyBjYWxsIGhhcyBlbmRlZCDigJQgdGhlIGNhbGwgc3RvcHMsIGFuZCBub3RoaW5nIGl0IHJlY29yZHMgJyArXG4gICAgICAnbGFuZHMgb24gdGhlIHN0YWdlLiBBd2FpdCBldmVyeSBjYWxsIHRoZSBzdGFnZSBtYWtlcy4nLFxuICApO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhZ2VDb250ZXh0IHtcbiAgLyoqIEBpbnRlcm5hbCBPd25lcnNoaXAgb2YgYW4gZXNjYXBpbmcgZmFpbHVyZS4gU2hhcmVkIG9ubHkgYnkgc2VxdWVudGlhbCBmcmFtZXMsIG5ldmVyIHNlcmlhbGl6ZWQuICovXG4gIGZhaWx1cmVTdGF0ZSA9IG5ldyBOYXRpdmVGYWlsdXJlU3RhdGUoKTtcbiAgI2ZhaWx1cmVJZGVudGl0eT86IE5vbk51bGxhYmxlPFRlcm1pbmFsRmFpbHVyZUNvbnRleHRbJ3N0YWdlJ10+O1xuXG4gIC8qKiBAaW50ZXJuYWwgVGhlIG5hdGl2ZSBmcmFtZSBzdGFtcCwgaW5kZXBlbmRlbnQgb2YgbXV0YWJsZSByZWNvcmRlciBldmVudCBjb250ZXh0LiAqL1xuICBnZXQgZmFpbHVyZUlkZW50aXR5KCk6IE5vbk51bGxhYmxlPFRlcm1pbmFsRmFpbHVyZUNvbnRleHRbJ3N0YWdlJ10+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jZmFpbHVyZUlkZW50aXR5O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCBTdGFtcGVkIGJlZm9yZSBvYnNlcnZlcnM7IG5ldmVyIGluaGVyaXRlZCBieSBhbm90aGVyIGZyYW1lIG9yIHBlcnNpc3RlZC4gKi9cbiAgYmluZEZhaWx1cmVJZGVudGl0eShydW5JZDogc3RyaW5nLCBydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jZmFpbHVyZUlkZW50aXR5ID0gT2JqZWN0LmZyZWV6ZSh7IHJ1bklkLCBydW50aW1lU3RhZ2VJZCB9KTtcbiAgICB0aGlzLnNvdXJjZUludm9jYXRpb25zID0gMDtcbiAgICBpZiAodGhpcy5yZWFkU291cmNlcz8uYWN0aXZlKVxuICAgICAgdGhpcy5yZWFkU291cmNlcy5vd25lcnNoaXA/LmJlZ2luKHJ1bklkLCBydW50aW1lU3RhZ2VJZCwgcnVuQWRkcmVzcyh0aGlzLm5hbWVzcGFjZUlkKSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlY29yZCBoYWxmIG9mIHRoaXMgZnJhbWUgKGBSZWNvcmRGcmFtZS50c2AsIEwzLCBDMyk6IHRoZSBoZWFwIGFuZCxcbiAgICogd2hlbiB0aGUgcnVuIGtlZXBzIHRoZW0sIHRoZSByZWRhY3RlZCBtaXJyb3IgYW5kIHRoZSBsb2c7IHRoZSBhZGRyZXNzO1xuICAgKiB0aGUgZmlyc3QtdG91Y2ggYmFzZTsgdGhlIGxhenkgdHJhbnNhY3Rpb24gYnVmZmVyOyB0aGUgcmVhZEtleXMgbGlzdC5cbiAgICogRXZlcnkgc3RhdGUgcmVhZCBvZiB0aGlzIGZyYW1lIGdvZXMgdGhyb3VnaCBpdCwgYW5kIHNvIGRvZXMgZXZlcnlcbiAgICogY29tbWl0LiBUaGUgbWlycm9yIGlzIHByZXNlbnQgKipvbmx5Kiogd2hlbiB0aGUgcnVuJ3MgcG9saWN5IGtlZXBzIGFcbiAgICogcmVkYWN0ZWQgdmlldyAoYSBgUmVkYWN0aW9uUG9saWN5YCBpcyBjb25maWd1cmVkKSDigJQgcmVhZCB2aWFcbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yLmdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCwgdGhlIGZvdW5kYXRpb24gZm9yXG4gICAqIHNoYXJpbmcgYSB0cmFjZSB3aXRob3V0IGxlYWtpbmcgcmF3IFBJSSB0aHJvdWdoIGBzaGFyZWRTdGF0ZWAuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlY29yZDogUmVjb3JkRnJhbWU7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgcG9saWN5IOKAlCB0aGUgZm91ciBkaWFscywgdGhlIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yIGZsYWdcbiAgICogKGBydW5Qb2xpY3kudHNgLCBGNSkuIEhlbGQgQlkgUkVGRVJFTkNFOiBvbmUgZnJvemVuIG9iamVjdCBwZXIgcnVuIChhbmRcbiAgICogcGVyIHJlc3VtZSksIHNoYXJlZCBieSBldmVyeSBmcmFtZSBvZiB0aGUgcnVuLCBhIHN1YmZsb3cncyBpbmNsdWRlZCDigJRcbiAgICoge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH0gcGFzcyB0aGUgcmVmZXJlbmNlXG4gICAqICh7QGxpbmsgaW5oZXJpdFJ1bn0pLCB0aGUgcnVudGltZSBpbnN0YWxscyBpdCBvbiBpdHMgcm9vdFxuICAgKiAoe0BsaW5rIHVzZVBvbGljeX0pLiBOZXZlciBlZGl0ZWQ7IGEgY2hhbmdlIGlzIGEgbmV3IG9iamVjdC5cbiAgICovXG4gIHByaXZhdGUgcG9saWN5OiBSdW5Qb2xpY3kgPSBERUZBVUxUX1JVTl9QT0xJQ1k7XG4gIC8qKiBUaGUgZW1pdHRpbmcgZnJhbWUncyBsb2dpY2FsIGxlZywgbmV2ZXIgdGhlIG11dGFibGUgZXhlY3V0b3IncyBjdXJyZW50IGxlZy4gKi9cbiAgcHJpdmF0ZSBlbWl0UnVuSWQ/OiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBuYXRpdmUgcm9vdC1sb2cgY29sbGVjdG9yOyBjb3BpZWQgdG8gc2FtZS1sb2cgZnJhbWVzLCBuZXZlciBjaGlsZCBydW50aW1lcy4gKi9cbiAgY2FwdHVyZT86IE5hdGl2ZUNhcHR1cmU7XG4gIC8qKiBTb3VyY2UgY292ZXJhZ2UsIHNoYXJlZCBvbmx5IGJ5IGZyYW1lcyBvZiB0aGlzIHJ1bnRpbWUuICovXG4gIHJlYWRTb3VyY2VzPzogRW5naW5lUmVhZFNvdXJjZUNhcHR1cmU7XG4gIHByaXZhdGUgc291cmNlUmVhZENvdW50ZXI/OiBTb3VyY2VSZWFkQ291bnRlcjtcbiAgcHJpdmF0ZSBzb3VyY2VBdHRlbXB0Pzogc3RyaW5nO1xuICBwcml2YXRlIHNvdXJjZUludm9jYXRpb25zID0gMDtcblxuICBwdWJsaWMgc3RhZ2VOYW1lID0gJyc7XG4gIC8qKiBVbmlxdWUgc3RhZ2UgaWRlbnRpZmllciBmcm9tIHRoZSBidWlsZGVyIChtYXRjaGVzIHNwZWMgbm9kZSBpZCkuICovXG4gIHB1YmxpYyBzdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIuIFNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIHN0YWdlIGV4ZWN1dGlvbi4gKi9cbiAgcHVibGljIHJ1bnRpbWVTdGFnZUlkID0gJyc7XG4gIC8qKlxuICAgKiBEZWNsYXJlZCB0YWdzICg5LjIxLjApIGZvciB0aGUgc3RhZ2UgdGhpcyBjb250ZXh0IGlzIGV4ZWN1dGluZy4gU2V0IGJ5XG4gICAqIHRoZSB0cmF2ZXJzZXIgYmVzaWRlIGBydW50aW1lU3RhZ2VJZGAgKHBlci1ub2RlIGlkZW50aXR5IOKAlCBOT1QgaW5oZXJpdGVkXG4gICAqIGJ5IGBjcmVhdGVOZXh0YCAvIGBjcmVhdGVDaGlsZGApLCByZWNvcmRlZCBvbiB0aGUgZmlyc3QgYnVuZGxlXG4gICAqIGBjb21taXQoKWAgd3JpdGVzLCB0aGVuIHJlbGVhc2VkIHNvIGEgcm91dGluZSBzZWNvbmQgY29tbWl0IG9uIHRoZSBzYW1lXG4gICAqIGNvbnRleHQgKGEgZm9yayBjaGlsZCdzIGZhbi1vdXQgcmVwZWF0LCBhIG1vdW50J3MgZXhpdCBidW5kbGUpIGNhcnJpZXNcbiAgICogbm9uZSDigJQgdGhlIHNhbWUgb25jZS1wZXItZXhlY3V0aW9uIGxhdyBgX3VudHJhY2tlZFNvdXJjZXNgIGtlZXBzLlxuICAgKi9cbiAgcHVibGljIHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBydW4gdGhpcyBmcmFtZSBiZWxvbmdzIHRvIOKAlCBpdHMgaWRlbnRpdHkgb24gZXZlcnkgZXZlbnQsIGFuZCB0aGUgcnVuXG4gICAqIG5hbWVzcGFjZSBpdCByZWFkcyBhbmQgd3JpdGVzIGluICh7QGxpbmsgcnVuQWRkcmVzc30pLCByZWFkIG9uY2UsIHdoZW4gdGhlXG4gICAqIGZyYW1lIGlzIGJ1aWx0IChDMykuIE9ubHkge0BsaW5rIHVzZUFkZHJlc3NPZn0gbW92ZXMgdGhlIGFkZHJlc3MgYWZ0ZXJcbiAgICogdGhhdCwgYW5kIG9ubHkgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBydW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1biBuYW1lc3BhY2UgdGhpcyBmcmFtZSB3cml0ZXMgYW5kIHJlYWRzIGluIHdoZW4gdGhhdCBpcyBub3QgaXRzIG93blxuICAgKiBgcnVuSWRgIOKAlCBzZXQgb25jZSwgYmVmb3JlIHRoZSBmcmFtZSdzIGZpcnN0IHdyaXRlLCBieVxuICAgKiB7QGxpbmsgdXNlQWRkcmVzc09mfS4gSXRzIG9uZSB1c2VyIGlzIGEgc3ViZmxvdyBtb3VudCdzIG1lcmdlLWJhY2sgKFIxMyk6XG4gICAqIHRoZSByZWNvcmQgbmFtZXMgdGhlIG1vdW50LCB0aGUgdmFsdWVzIGxhbmQgd2hlcmUgdGhlIG1vdW50J3MgcGFyZW50XG4gICAqIHdyaXRlcy4gQWJzZW50IOKGkiBgcnVuSWRgLCBzbyBldmVyeSBvdGhlciBmcmFtZSBpcyB1bnRvdWNoZWQuXG4gICAqL1xuICBwcml2YXRlIGFkZHJlc3NSdW5JZD86IHN0cmluZztcbiAgcHVibGljIGJyYW5jaElkPzogc3RyaW5nO1xuICBwdWJsaWMgaXNEZWNpZGVyOiBib29sZWFuO1xuICBwdWJsaWMgaXNGb3JrOiBib29sZWFuO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZnJvbSBidWlsZGVyIChzZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBleGVjdXRpb24pLiAqL1xuICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIgKHNldCBieSB0cmF2ZXJzZXIgd2hlbiB0aGlzIGlzIGEgc3ViZmxvdyBlbnRyeSBwb2ludCkuICovXG4gIHB1YmxpYyBzdWJmbG93SWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHBhcmVudD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIG5leHQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBjaGlsZHJlbj86IFN0YWdlQ29udGV4dFtdO1xuXG4gIHB1YmxpYyBkZWJ1ZzogRGlhZ25vc3RpY0NvbGxlY3RvciA9IG5ldyBEaWFnbm9zdGljQ29sbGVjdG9yKCgpID0+IHRoaXMucG9saWN5LnJlZGFjdGlvbik7XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHdyaXRlcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldyBhbmQgb25Db21taXRcbiAgICogIOKAlCBpbiB0aGVpciBSRVRBSU5FRCBmb3JtIChjbG9uZWQgLyBzdW1tYXJpc2VkIC8gcmVkYWN0ZWQpLiBGaWxsZWQgZnJvbVxuICAgKiAge0BsaW5rIF9wZW5kaW5nV3JpdGVzfSBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9IGF0IGNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VXcml0ZXM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSB3cml0ZXMgb2YgdGhlIENVUlJFTlQgZXhlY3V0aW9uLCBoZWxkIGJ5IHJlZmVyZW5jZSB3aXRoIHRoZSB2ZXJkaWN0XG4gICAqIHRoZXkgd2VyZSBzdGFnZWQgdW5kZXIgKDkuMjMuMCkuIEEga2V5IHdyaXR0ZW4gayB0aW1lcyBob2xkcyBpdHMgTEFTVFxuICAgKiB2YWx1ZTsgdGhlIHJldGFpbmVkIGZvcm0gKHRoZSBgd3JpdGVUcmFja2luZ2AgY2xvbmUgb3Igc3VtbWFyeSwgdGhlXG4gICAqIHJlZGFjdGlvbiBwbGFjZWhvbGRlciBvciBmaWVsZCBzY3J1YikgaXMgdGFrZW4gT05DRSBwZXIga2V5IGF0IGNvbW1pdCDigJRcbiAgICogc2VlIHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30uIFNhbWUgbGF3IGFzIHRoZSB0cmFuc2FjdGlvbiBidWZmZXInc1xuICAgKiBwYXRjaCB0cmVlczogdGhlIGNvcHkgdGhlIHJlY29yZCBuZWVkcyBpcyBwYWlkIGF0IHRoZSBib3VuZGFyeSwgbm90IGF0XG4gICAqIGV2ZXJ5IHdyaXRlLiBMYXppbHkgYWxsb2NhdGVkOyBhIHN0YWdlIHRoYXQgbmV2ZXIgd3JpdGVzIHBheXMgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX3BlbmRpbmdXcml0ZXM/OiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHsgdmFsdWU6IHVua25vd247IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3Q7IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH1cbiAgPjtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgcmVhZHMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcuICovXG4gIHByaXZhdGUgX3N0YWdlUmVhZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBgX3N0YWdlUmVhZHNgIGtleXMgdGhhdCB3ZXJlIHJlYWQgYXQgYSBORVNURUQgcGF0aCAoYGdldFZhbHVlKHBhdGgsXG4gICAqIGtleSlgIHdpdGggYSBub24tZW1wdHkgYHBhdGhgKS4gT25seSB0aGUgZW5naW5lIHJlYWRzIHRoYXQgd2F5IOKAlCB0aGVcbiAgICogZmFjYWRlIHJlYWRzIHJvb3RzIOKAlCBzbyB0aGVzZSBhcmUgbm90IHVzZXIgcmVhZHMgYW5kIHRoZSBib3Jyb3dlZC1yZWFkXG4gICAqIGd1YXJkIHNraXBzIHRoZW0gYnkgdGhpcyBtYXJrZXIsIG5ldmVyIGJ5IGd1ZXNzaW5nIGZyb20gYSBkb3QgaW4gdGhlIGtleVxuICAgKiAoYSB1c2VyJ3MgdG9wLWxldmVsIGtleSBtYXkgaXRzZWxmIGNvbnRhaW4gb25lKS4gTGF6aWx5IGNyZWF0ZWQ7IHRoZVxuICAgKiBmYWNhZGUgcGF0aCBuZXZlciBhbGxvY2F0ZXMgaXQuXG4gICAqL1xuICBwcml2YXRlIF9uZXN0ZWRSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBEZXYgbW9kZSBvbmx5OiB0aGUgcm9vdCBrZXlzIHdob3NlIExBU1QgdHJhY2tlZCByZWFkIHdhcyBzZXJ2ZWQgZnJvbVxuICAgKiBjb21taXR0ZWQgc3RhdGUg4oCUIGJlZm9yZSB0aGlzIHN0YWdlJ3MgZmlyc3Qgd3JpdGUsIHdoZW4gbm8gdHJhbnNhY3Rpb25cbiAgICogYnVmZmVyIGV4aXN0cyB5ZXQuIFN1Y2ggYSByZWFkIGlzIHRoZSBjb21taXR0ZWQgb2JqZWN0IGl0c2VsZiwgc28gYW5cbiAgICogaW4tcGxhY2UgZWRpdCBvZiBpdCBtb3ZlcyB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIHRvbyAoY29weS1vbi13cml0ZSxcbiAgICogOS4yOS4wKTsge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259IGNoZWNrcyB0aGVzZSBrZXlzIGV2ZW4gd2hlbiB0aGVcbiAgICogc3RhZ2Ugd3JvdGUgdGhlbS4gTmV2ZXIgYWxsb2NhdGVkIG91dHNpZGUgYGVuYWJsZURldk1vZGUoKWAuXG4gICAqL1xuICBwcml2YXRlIF92aWV3UmVhZHM/OiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogSGFzIHRoaXMgZnJhbWUgY29tbWl0dGVkIGF0IGxlYXN0IG9uY2U/IFRoZSBib3Jyb3dlZC1yZWFkIGd1YXJkIHJ1bnMgb25cbiAgICogdGhlIEZJUlNUIGNvbW1pdCBvbmx5IOKAlCBzZWUge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259LiBUaGUgZnJhbWVcbiAgICogaXRzZWxmIHN0YXlzIHJlLXVzYWJsZSBhZnRlciBjb21taXQgKCMxM2IpOiB0aGUgZW5naW5lJ3MgZG91YmxlLWNvbW1pdFxuICAgKiBwYXRocyBhbmQgdGhlIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgYnJhbmNoIHBhcmVudCByZWx5IG9uIGl0LiBUaGVcbiAgICogdXNlci1sZXZlbCByZWZ1c2FsIG9mIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgbGl2ZXMgYXQgdGhlIHNjb3BlXG4gICAqIHRpZXIgKGBTY29wZUZhY2FkZWAsIG9uZSBwZXIgc3RhZ2UgZXhlY3V0aW9uKSwgbm90IGhlcmUuXG4gICAqL1xuICBwcml2YXRlIF9jb21taXR0ZWQgPSBmYWxzZTtcblxuICAvKiogVHJhY2tlZCByZWFkcyBvZiBhIHNlbGVjdGVkIHZhbHVlICh7QGxpbmsgc2VsZWN0ZWRSZWFkc30pLiAqL1xuICBwcml2YXRlIF9zZWxlY3RlZFJlYWRzID0gMDtcbiAgLyoqIEVhY2ggb2JqZWN0IHRoaXMgZnJhbWUgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUg4oaSIHRoYXQgcmVhZCdzIHZlcmRpY3QgKGBzdGFnZVdyaXRlYCBoYW5kcyBpdCBvbikuICovXG4gIHByaXZhdGUgX3NlbGVjdGVkT2JqZWN0cz86IFdlYWtNYXA8b2JqZWN0LCBSZWRhY3Rpb25WZXJkaWN0PjtcblxuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlcnMg4oCUIHVudHJhY2tlZCByZWFkIHBhdGhzIHVzZWQgZHVyaW5nIFRISVNcbiAgICogc3RhZ2UncyBleGVjdXRpb24gKGAnYXJncydgIC8gYCdlbnYnYCAvIGAnc2lsZW50J2ApLiBNYXJrZWQgYnlcbiAgICogYFNjb3BlRmFjYWRlYCwgc3VyZmFjZWQgb24gdGhlIHN0YWdlJ3MgQ29tbWl0QnVuZGxlIGFzXG4gICAqIGB1bnRyYWNrZWRTb3VyY2VzYCwgdGhlbiBSRUxFQVNFRCB3aXRoIHRoZSBzdGFnaW5nIHN0YXRlIGF0IGNvbW1pdCBlbmRcbiAgICogKHNvIHRoZSByb3V0aW5lIGRvdWJsZS1jb21taXQgcGF0aHMg4oCUIGZvcmsgY2hpbGRyZW4sIHN1YmZsb3cgbW91bnRzIOKAlFxuICAgKiByZWNvcmQgdGhlIGZpZWxkIGV4YWN0bHkgb25jZSwgb24gdGhlIGZpcnN0IGNvbW1pdCkuIExhemlseSBhbGxvY2F0ZWQ6XG4gICAqIHN0YWdlcyB0aGF0IG5ldmVyIHRvdWNoIGFuIHVudHJhY2tlZCBwYXRoIHBheSBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfdW50cmFja2VkU291cmNlcz86IFNldDxVbnRyYWNrZWRTb3VyY2U+O1xuXG4gIC8qKlxuICAgKiBUaGUgYXR0ZW1wdHMgb2YgdGhpcyBmcmFtZSdzIGV4ZWN1dGlvbiAoMTAuMSkg4oCUIGl0cyBvd24gdW5kZXIgdGhlIGF0dGVtcHQgcnVubmVyLCBhcHBlbmRlZCBhcyBlYWNoIGF0dGVtcHQgZW5kc1xuICAgKiAoYEZsb3djaGFydFRyYXZlcnNlciDCtyBleGVjdXRlU3RhZ2VgKSwgYW5kIHRob3NlIG9mIHRoZSBjYWxscyBpdCBtYWRlIChQMiwge0BsaW5rIHJlcG9ydENhbGxBdHRlbXB0fSkg4oCUIHJlYWRcbiAgICogYnkge0BsaW5rIHNuYXBzaG90U2VsZn0uIEFwcGVuZC1vbmx5XG4gICAqIGV2aWRlbmNlIGxpa2UgYGRlYnVnYDogTk9UIGNsZWFyZWQgYnkge0BsaW5rIGRpc2NhcmRTdGFnZWR9ICh0aGUgZWFybGllciBhdHRlbXB0cyBhcmUgdGhlIHBvaW50KSBhbmQgbmV2ZXJcbiAgICogcGFydCBvZiBhIGNvbW1pdCBidW5kbGUuIExhemlseSBhbGxvY2F0ZWQ6IGEgc3RhZ2Ugd2l0aG91dCBhIHBvbGljeSBwYXlzIG5vdGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF9hdHRlbXB0cz86IEF0dGVtcHRSZWNvcmRbXTtcbiAgLyoqIFRoZSBhdHRlbXB0IHNlcmllcyBhdCBhIGdsYW5jZSwgc3RhbXBlZCBvbmNlIHdoZW4gaXQgZW5kcy4gKi9cbiAgcHJpdmF0ZSBfYXR0ZW1wdFN1bW1hcnk/OiBBdHRlbXB0U3VtbWFyeTtcbiAgLyoqIEZhY3RzIGNvbGxlY3RlZCBmb3IgdGhpcyBleGVjdXRpb24gb25seTsgcmV0cnkgZGlzY2FyZHMgZGVsaWJlcmF0ZWx5IGtlZXAgdGhlbS4gKi9cbiAgcHJpdmF0ZSBfYXR0ZW50aW9uPzogU3RhZ2VBdHRlbnRpb247XG4gIC8qKlxuICAgKiBUaGUgYXR0ZW1wdCBub3cgcnVubmluZyAoUDFiKSDigJQgc2V0IGJ5IGBTdGFnZVJ1bm5lcmAgYmVmb3JlIHRoZSBzY29wZSBpcyBidWlsdCwgc28gdGhlIGZhY2FkZSBjYW4gaGFuZCBpdCBvdXRcbiAgICogKGBzY29wZS4kYXR0ZW1wdCgpYCkgYW5kIGZlbmNlIGl0cyBvd24gYXR0ZW1wdC4gQWJzZW50IGZvciBhIHN0YWdlIHRoZSBhdHRlbXB0IHJ1bm5lciBkb2VzIG5vdCBydW4uXG4gICAqL1xuICBwcml2YXRlIF9hdHRlbXB0PzogQXR0ZW1wdENvbnRleHQ7XG4gIC8qKiBUaGUgcnVuJ3Mgc2lnbmFsLCBmb3IgdGhlIGF0dGVtcHQgYSBzdGFnZSBvdXRzaWRlIHRoZSBydW5uZXIgcmVwb3J0cyAoYXR0ZW1wdCAxIG9mIDEpLiAqL1xuICBwcml2YXRlIF9ydW5TaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIEV2ZXJ5IGF0dGVtcHQgdXAgdG8gdGhpcyBudW1iZXIgaGFzIEVOREVEIHdpdGhvdXQgYW4gYW5zd2VyIOKAlCBpdHMgc2NvcGUgaXMgZmVuY2VkICgwID0gbm9uZSkuICovXG4gIHByaXZhdGUgX2VuZGVkVGhyb3VnaCA9IDA7XG4gIC8qKiBXcml0ZXMgYW4gYXR0ZW1wdCB0cmllZCBhZnRlciBpdCBlbmRlZCDigJQgZHJvcHBlZCBhdCB0aGUgc2NvcGUsIGtlcHQgaGVyZSBhcyBuYW1lcy4gTGF6aWx5IGFsbG9jYXRlZC4gKi9cbiAgcHJpdmF0ZSBfbGF0ZVdyaXRlcz86IExhdGVXcml0ZVtdO1xuICAvKipcbiAgICogV2hlcmUgYSBjYWxsJ3MgYXR0ZW1wdCByZWNvcmRzIGFyZSByZXBvcnRlZCAoUDIpIOKAlCB0aGUgZW5naW5lJ3MgYG9uQXR0ZW1wdGAgZm9yIHRoaXMgc3RhZ2UgZXhlY3V0aW9uLCBzZXQgYnlcbiAgICogYEZsb3djaGFydFRyYXZlcnNlciDCtyBleGVjdXRlU3RhZ2VgIHdpdGggdGhlIHN0YWdlJ3Mgb3duIHRyYXZlcnNhbCBjb250ZXh0IChhbmQgaXRzIGNvcnJlbGF0aW9uKS5cbiAgICovXG4gIHByaXZhdGUgX2F0dGVtcHRSZXBvcnRlcj86IChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQsIHN0cnVjdHVyZWRFcnJvcjogU3RydWN0dXJlZEVycm9ySW5mbyB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcblxuICAvKiogQ2FsbHMgbWFkZSBzbyBmYXIsIHBlciBzdGFnZSBhdHRlbXB0IOKAlCB0aGUgYGtgIG9mIGEgY2FsbCdzIHNlcmllcy4gTGF6aWx5IGFsbG9jYXRlZC4gKi9cbiAgcHJpdmF0ZSBfY2FsbE9yZGluYWxzPzogTWFwPG51bWJlciwgbnVtYmVyPjtcbiAgLyoqIFBlciBzdGFnZSBhdHRlbXB0LCB0aGUgc2lnbmFsIGl0cyBjYWxscyBzdG9wIGJ5IChgY2FsbHNFbmRlZFNpZ25hbGApLiBMYXppbHkgYWxsb2NhdGVkLiAqL1xuICBwcml2YXRlIF9jYWxsc0VuZGVkPzogTWFwPG51bWJlciwgQWJvcnRDb250cm9sbGVyPjtcbiAgLyoqIENhbGwgYW5kIG9ic2VydmVkIHJlY29yZHMga2VwdCBvbiB0aGUgZnJhbWUsIGFuZCB0aG9zZSBwYXN0IHtAbGluayBNQVhfQ0FMTF9SRUNPUkRTfS4gKi9cbiAgcHJpdmF0ZSBfY2FsbFJlY29yZHMgPSAwO1xuICBwcml2YXRlIF9hdHRlbXB0c0Ryb3BwZWQgPSAwO1xuXG4gIC8qKiBPYnNlcnZlciBjYWxsZWQgYWZ0ZXIgY29tbWl0KCkg4oCUIHVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZmlyZSBTY29wZVJlY29yZGVyLm9uQ29tbWl0LiAqL1xuICBwcml2YXRlIF9jb21taXRPYnNlcnZlcj86IChcbiAgICBtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+LFxuICApID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICAgIHNoYXJlZE1lbW9yeTogU2hhcmVkTWVtb3J5LFxuICAgIGJyYW5jaElkPzogc3RyaW5nLFxuICAgIGV2ZW50TG9nPzogRXZlbnRMb2csXG4gICAgaXNEZWNpZGVyPzogYm9vbGVhbixcbiAgKSB7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICAgIHRoaXMuc3RhZ2VOYW1lID0gbmFtZTtcbiAgICB0aGlzLnN0YWdlSWQgPSBzdGFnZUlkO1xuICAgIHRoaXMucmVjb3JkID0gbmV3IFJlY29yZEZyYW1lKHNoYXJlZE1lbW9yeSwgZXZlbnRMb2csIHJ1bkFkZHJlc3MocnVuSWQpKTtcbiAgICB0aGlzLnJlY29yZC51c2VFbmNvZGluZyh0aGlzLnBvbGljeSk7XG4gICAgdGhpcy5icmFuY2hJZCA9IGJyYW5jaElkO1xuICAgIHRoaXMuaXNEZWNpZGVyID0gISFpc0RlY2lkZXI7XG4gICAgdGhpcy5pc0ZvcmsgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBTaGFyZWRNZW1vcnkgaW5zdGFuY2UgKG5lZWRlZCBieSBzY29wZSBsYXllcikuICovXG4gIGdldFNoYXJlZE1lbW9yeSgpOiBTaGFyZWRNZW1vcnkge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5zdGF0ZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgU3RhbXBlZCBiZXNpZGUgcnVudGltZVN0YWdlSWQsIGJlZm9yZSBzY29wZSBjb25zdHJ1Y3Rpb24uICovXG4gIGJpbmRFbWl0T3JpZ2luKHJ1bklkOiBzdHJpbmcsIGRyaWxsUGF0aDogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXRSdW5JZCA9IGRyaWxsUGF0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcnVuSWQ7XG4gICAgaWYgKGRyaWxsUGF0aCAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5sb2c/LmJpbmRBZGRyZXNzKHJ1bklkLCBkcmlsbFBhdGgpO1xuICB9XG5cbiAgLyoqIENhcHR1cmUgZnJvbSB0aGlzIGZyYW1lJ3MgT1dOIGxvZy4gQSBtYW51YWwvdW5hZGRyZXNzYWJsZSBmcmFtZSBzdGF5cyB1bmtub3duLiAqL1xuICBjYXB0dXJlRW1pdFBvc2l0aW9uKCk6IEVtaXRTb3VyY2VQb3NpdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW1pdFJ1bklkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLnJlY29yZC5sb2c/LmNhcHR1cmVQb3NpdGlvbih0aGlzLmVtaXRSdW5JZCk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvci4gU3Vic2VxdWVudCBgY29tbWl0KClgIGNhbGxzIGFwcGx5XG4gICAqIHRoZSBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMg4oCUIHRoZSBvbmVzIHRoZSBsb2cgcmVjb3JkcyDigJQgdG9cbiAgICogdGhpcyBtaXJyb3IsIGJlc2lkZSB0aGUgcmF3IHBhdGNoZXMgb24gdGhlIGhlYXAgKGByZWNvcmRDb21taXRgKS5cbiAgICogQ2hpbGQgLyBuZXh0IGNvbnRleHRzIGluaGVyaXQgdGhlIG1pcnJvciB2aWEgYGNyZWF0ZU5leHRgIC8gYGNyZWF0ZUNoaWxkYC5cbiAgICpcbiAgICogQ2FsbGVkIG9uIGEgcnVudGltZSdzIHJvb3QgZnJhbWUgYnkgYEV4ZWN1dGlvblJ1bnRpbWVgIHdoZW4gdGhlIHJ1bidzIHBvbGljeSBrZWVwcyBhIG1pcnJvci5cbiAgICovXG4gIHVzZVJlZGFjdGVkTWlycm9yKG1pcnJvcjogU2hhcmVkTWVtb3J5KTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmQudXNlTWlycm9yKG1pcnJvcik7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgcmVkYWN0ZWQgbWlycm9yIGlmIGluc3RhbGxlZCwgZWxzZSB1bmRlZmluZWQuICovXG4gIGdldFJlZGFjdGVkU2hhcmVkTWVtb3J5KCk6IFNoYXJlZE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLm1pcnJvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyBwb2xpY3kgKGBydW5Qb2xpY3kudHNgKSBvbiB0aGlzIGZyYW1lIOKAlCBjYWxsZWQgb24gYVxuICAgKiBydW50aW1lJ3Mgcm9vdCBieSBgRXhlY3V0aW9uUnVudGltZWAgKGF0IGNvbnN0cnVjdGlvbiwgYW5kIGJ5XG4gICAqIGBFeGVjdXRpb25SdW50aW1lLnVzZVBvbGljeWAgb24gYSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSkuIERlc2NlbmRhbnRzIGdldFxuICAgKiB0aGUgc2FtZSByZWZlcmVuY2UgdGhyb3VnaCB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfTsgYVxuICAgKiBzdWJmbG93J3MgcnVudGltZSBpcyBjb25zdHJ1Y3RlZCB3aXRoIGl0LCBzbyBpdHMgc2VlZCBmcmFtZSBhbmQgZXZlcnlcbiAgICogZnJhbWUgYWZ0ZXIgY29tbWl0IHVuZGVyIHRoZSBydW4ncyBkaWFscyB0b28uXG4gICAqL1xuICB1c2VQb2xpY3kocG9saWN5OiBSdW5Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLmFkb3B0UG9saWN5KHBvbGljeSk7XG4gIH1cblxuICAvKiogVGhlIHJ1bidzIHBvbGljeSB0aGlzIGZyYW1lIHJldGFpbnMsIGVuY29kZXMgYW5kIHNjcnVicyB1bmRlci4gKi9cbiAgZ2V0UG9saWN5KCk6IFJ1blBvbGljeSB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYSByZWRhY3Rpb24gcnVsZSDigJQgdGhlIE9ORSBvd25lciBvZiBcIndoYXQgZG9lcyB0aGUgcG9saWN5IHNheVxuICAgKiBhYm91dCB0aGlzIHBhdGhcIiAoYG1lbW9yeS9yZWRhY3Rpb24udHNgKSDigJQgYXMgYSBORVcgcG9saWN5IGZvciB0aGlzIGZyYW1lXG4gICAqICh0aGUgc2hhcmVkIG9uZSBpcyBuZXZlciBlZGl0ZWQpLiBVbmRlciBhbiBleGVjdXRvciB0aGUgcnVsZSBhcnJpdmVzXG4gICAqIHdpdGggdGhlIHJ1bidzIHBvbGljeTsgdGhpcyBkb29yIGlzIGZvciBhIGBTY29wZUZhY2FkZWAgb24gYSBiYXJlIGZyYW1lXG4gICAqICh1bml0IHRlc3RzLCBoYW5kLWJ1aWx0IHNjb3BlcyksIHdoaWNoIGJyaW5ncyBpdHMgb3duIHJ1bGUuIEV2ZXJ5IHN0YWdlZFxuICAgKiB3cml0ZSBhbmQgZXZlcnkgdHJhY2tlZCByZWFkIGFza3MgaXQsIHNvIGEgd3JpdGUgdGhhdCBuZXZlciBwYXNzZXMgYVxuICAgKiBmYWNhZGUg4oCUIGEgc3ViZmxvdyBzZWVkLCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCBhIHJlc3VtZSByZS1zZWVkIOKAlFxuICAgKiBpcyByZXRhaW5lZCB1bmRlciB0aGUgc2FtZSB2ZXJkaWN0IGFzIGEgZmFjYWRlIHdyaXRlLiBBYnNlbnQ6IGV2ZXJ5XG4gICAqIHZlcmRpY3QgaXMgYCdjbGVhcidgIHVubGVzcyB0aGUgY2FsbGVyIHBhc3NlZCBhbiBleHBsaWNpdCBmbGFnLlxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUnVsZShydWxlOiBSZWRhY3Rpb25SdWxlKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9saWN5LnJlZGFjdGlvbiAhPT0gcnVsZSkgdGhpcy5hZG9wdFBvbGljeSh3aXRoUmVkYWN0aW9uKHRoaXMucG9saWN5LCBydWxlKSk7XG4gIH1cblxuICAvKiogVGhlIGluc3RhbGxlZCByZWRhY3Rpb24gcnVsZSwgaWYgYW55ICh0aGUgZmFjYWRlJ3MgbG9va3VwKS4gKi9cbiAgZ2V0UmVkYWN0aW9uUnVsZSgpOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wb2xpY3kucmVkYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgdGhlIHJ1biBmcm9tIGBmcm9tYDogdGhlIHBvbGljeSAoYnkgcmVmZXJlbmNlKSBhbmQgdGhlIHJ1bidzIG1pcnJvclxuICAgKiBzdG9yZS4gVGhlIE9ORSBpbmhlcml0YW5jZSBzdGVwIOKAlCB7QGxpbmsgY3JlYXRlTmV4dH0gYW5kXG4gICAqIHtAbGluayBjcmVhdGVDaGlsZH0gYm90aCBjYWxsIGl0LCBhbmQgaXQgbmFtZXMgbm8gZGlhbC5cbiAgICovXG4gIHByaXZhdGUgaW5oZXJpdFJ1bihmcm9tOiBTdGFnZUNvbnRleHQpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRTb3VyY2VzID0gZnJvbS5yZWFkU291cmNlcztcbiAgICB0aGlzLmFkb3B0UG9saWN5KGZyb20ucG9saWN5KTtcbiAgICB0aGlzLmNhcHR1cmUgPSBmcm9tLmNhcHR1cmU7XG4gICAgdGhpcy5yZWNvcmQudXNlTWlycm9yKGZyb20ucmVjb3JkLm1pcnJvcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIE9ORSBwbGFjZSB0aGlzIGZyYW1lJ3MgcG9saWN5IGNoYW5nZXM6IHRoZSBmcmFtZSBob2xkcyBpdCwgYW5kIGl0c1xuICAgKiByZWNvcmQgZnJhbWUgZW5jb2RlcyB1bmRlciB0aGUgc2FtZSByZWZlcmVuY2UgKGBjb21taXRWYWx1ZXNgLFxuICAgKiBgd3JpdGVQcm92ZW5hbmNlYCDigJQgYFJlY29yZEZyYW1lIMK3IHVzZUVuY29kaW5nYCksIHNvIHRoZSB0d28gbmV2ZXIgZGlmZmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhZG9wdFBvbGljeShwb2xpY3k6IFJ1blBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMucmVjb3JkLnVzZUVuY29kaW5nKHBvbGljeSk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIGEgdHJhY2tlZCB1c2VyLWxldmVsIHdyaXRlLCBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSkg4oCUIHRoZSBzaW5nbGVcbiAgICogYm9va2tlZXBpbmcgcGF0aCBmb3Ige0BsaW5rIHNldE9iamVjdH0gYW5kIHtAbGluayB1cGRhdGVPYmplY3R9LiBIb2xkc1xuICAgKiB0aGUgUkVGRVJFTkNFIGFuZCB0aGUgdmVyZGljdCAoOS4yMy4wKTsgdGhlIHJldGFpbmVkIGZvcm0gaXMgdGFrZW4gYXRcbiAgICogY29tbWl0IGJ5IHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30sIG9uY2UgcGVyIGtleS5cbiAgICpcbiAgICogUmVkYWN0aW9uIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZGlhbCBpbiBFVkVSWSBtb2RlOiBhIHJlZGFjdGVkXG4gICAqIHdyaXRlIHN0b3JlcyB0aGUgYCdbUkVEQUNURURdJ2AgcGxhY2Vob2xkZXIgdW5kZXIgYCdmdWxsJ2AgQU5EXG4gICAqIGAnc3VtbWFyeSdgIChhIHN1bW1hcnkgbWFya2VyIHdvdWxkIGxlYWsgdGhlIHZhbHVlJ3MgcHJldmlldy9zaXplKSxcbiAgICogYW5kIHN0b3JlcyBub3RoaW5nIHVuZGVyIGAnb2ZmJ2AgKGVudHJ5IHNraXBwZWQgZW50aXJlbHkg4oCUIG5vdGhpbmcgdG9cbiAgICogbGVhaykuIEEgZmllbGQtbGV2ZWwgdmVyZGljdCBzY3J1YnMgYSBjbG9uZSBCRUZPUkUgdGhlIGRpYWwgc2VlcyBpdCwgc29cbiAgICogYSBzdW1tYXJ5IHByZXZpZXcgY2FuIG5ldmVyIHNob3cgdGhlIHNlY3JldCBlaXRoZXIuIFRoZSB2ZXJkaWN0IGlzIHRoZVxuICAgKiBvbmUgYHN0YWdlV3JpdGVgIGRlY2lkZWQgQkVGT1JFIHN0YWdpbmcsIGNhcnJpZWQgdG8gY29tbWl0IHdpdGggdGhlXG4gICAqIHZhbHVlLiBUaGUgc3RhZ2VkIHdyaXRlIGl0c2VsZiBpcyB1bmFmZmVjdGVkIOKAlCByZWRhY3Rpb24gb2YgdGhlXG4gICAqIGNvbW1pdHRlZCBwYXlsb2FkIGlzIHRoZSByZWNvcmQgZnJhbWUncyBzY3J1YiBvZiB0aGF0IHdyaXRlXG4gICAqIChgUmVjb3JkRnJhbWUgwrcgd3JpdGVgLCB0aGVuIGBzY3J1Yi50c2AgYXQgY29tbWl0KS5cbiAgICovXG4gIHByaXZhdGUgdHJhY2tXcml0ZShcbiAgICB1c2VyS2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgICBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyxcbiAgKSB7XG4gICAgaWYgKHRoaXMucG9saWN5LndyaXRlVHJhY2tpbmcgPT09ICdvZmYnKSByZXR1cm47XG4gICAgKHRoaXMuX3BlbmRpbmdXcml0ZXMgPz89IG5ldyBNYXAoKSkuc2V0KHVzZXJLZXksIHsgdmFsdWUsIHZlcmRpY3QsIG9wZXJhdGlvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgX3N0YWdlV3JpdGVzYCB3aXRoIGV2ZXJ5IHBlbmRpbmcgd3JpdGUgZm9sZGVkIGluIGFzIGl0cyByZXRhaW5lZCBmb3JtXG4gICAqIOKAlCB0aGUgcmVjb3JkIGEgcmVhZGVyIHNlZXMuIENvbnN1bWVzIG5vdGhpbmc6IGEgbWlkLXJ1biBzbmFwc2hvdCByZWFkc1xuICAgKiB0aGUgd3JpdGVzIHNvIGZhciwgYW5kIGNvbW1pdCBzdGlsbCBtYXRlcmlhbGlzZXMgdGhlIGZpbmFsIHZhbHVlcy5cbiAgICogUmV0dXJucyBgX3N0YWdlV3JpdGVzYCBpdHNlbGYgd2hlbiBub3RoaW5nIGlzIHBlbmRpbmcuXG4gICAqL1xuICBwcml2YXRlIHJldGFpbmVkV3JpdGVzKCk6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+IHtcbiAgICBpZiAoIXRoaXMuX3BlbmRpbmdXcml0ZXMpIHJldHVybiB0aGlzLl9zdGFnZVdyaXRlcztcbiAgICBjb25zdCBvdXQgPSB7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB3XSBvZiB0aGlzLl9wZW5kaW5nV3JpdGVzKSB7XG4gICAgICBvdXRba2V5XSA9IHtcbiAgICAgICAgdmFsdWU6IHRoaXMucmV0YWluZWRGb3JtKHcudmVyZGljdCwgdy52YWx1ZSwgdGhpcy5wb2xpY3kud3JpdGVUcmFja2luZywgc3VtbWFyaXplV3JpdGVWYWx1ZSksXG4gICAgICAgIG9wZXJhdGlvbjogdy5vcGVyYXRpb24sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRha2UgdGhlIHJldGFpbmVkIGZvcm0gb2YgZXZlcnkgcGVuZGluZyB3cml0ZSDigJQgT05DRSBwZXIga2V5LCBmcm9tIHRoZVxuICAgKiB2YWx1ZSBhcyBpdCBzdGFuZHMgYXQgY29tbWl0ICg5LjIzLjApIOKAlCBhbmQgcmVsZWFzZSB0aGUgcmVmZXJlbmNlcy4gVGhlXG4gICAqIGZpcnN0IHRoaW5nIGBjb21taXQoKWAgZG9lcywgc28gdGhlIGJvcnJvd2VkLW11dGF0aW9uIGd1YXJkIGFuZCB0aGVcbiAgICogY29tbWl0IG9ic2VydmVyIHNlZSB0aGUgZmluaXNoZWQgcmVjb3JkLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXRlcmlhbGlzZVdyaXRlcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3BlbmRpbmdXcml0ZXMpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fc3RhZ2VXcml0ZXMgPSB0aGlzLnJldGFpbmVkV3JpdGVzKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlbGVhc2VkIGV2ZW4gd2hlbiBhIHJldGFpbmVkIGZvcm0gY2Fubm90IGJlIHRha2VuIOKAlCBhbiB1bmNsb25lYWJsZVxuICAgICAgLy8gdmFsdWUgKGEgZnVuY3Rpb24sIGEgUHJveHkpIGlzIGEgY29udHJhY3QgdmlvbGF0aW9uIChcInN0YXRlIHZhbHVlc1xuICAgICAgLy8gbXVzdCBzdXJ2aXZlIHN0cnVjdHVyZWRDbG9uZVwiKSB0aGF0IG5vdyBzdXJmYWNlcyBIRVJFLCBhdCBjb21taXQsXG4gICAgICAvLyBhbmQgZmFpbHMgdGhlIHJ1biBsb3VkbHk7IGEgbGF0ZXIgc25hcHNob3Qgb2YgdGhlIGZhaWxlZCBydW4gbXVzdFxuICAgICAgLy8gbm90IHRocm93IHRoZSBzYW1lIGVycm9yIGFnYWluLlxuICAgICAgdGhpcy5fcGVuZGluZ1dyaXRlcyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZvcm0gb2YgYSB2YWx1ZSB0aGUgZW5naW5lIFJFVEFJTlMgKHJlYWRzIGFuZCB3cml0ZXMgcmV0ZW50aW9uKTpcbiAgICogdGhlIHBsYWNlaG9sZGVyIGJlYXRzIGV2ZXJ5IGRpYWw7IGEgZmllbGQtbGV2ZWwgc2NydWIgaGFwcGVucyBiZWZvcmUgdGhlXG4gICAqIGRpYWwgc2VlcyB0aGUgdmFsdWU7IGEgY2xlYXIgdmFsdWUgaXMgc3VtbWFyaXplZCBvciBjbG9uZWQgYXMgdGhlIGRpYWxcbiAgICogc2F5cy4gQ2FsbGVycyBoYW5kbGUgYHVuZGVmaW5lZGAgYmVmb3JlIGFza2luZy5cbiAgICovXG4gIHByaXZhdGUgcmV0YWluZWRGb3JtKFxuICAgIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgbW9kZTogUmVhZFRyYWNraW5nTW9kZSB8IFdyaXRlVHJhY2tpbmdNb2RlLFxuICAgIHN1bW1hcml6ZTogKHZhbHVlOiB1bmtub3duKSA9PiB1bmtub3duLFxuICApOiB1bmtub3duIHtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gU0NPUEVfUExBQ0VIT0xERVI7XG4gICAgY29uc3Qgc2NydWJiZWQgPSB2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnID8gUmVkYWN0aW9uUnVsZS5zY3J1YkZpZWxkcyh2YWx1ZSwgdmVyZGljdC5wYXRocykgOiB1bmRlZmluZWQ7XG4gICAgaWYgKG1vZGUgPT09ICdzdW1tYXJ5JykgcmV0dXJuIHN1bW1hcml6ZShzY3J1YmJlZCA/PyB2YWx1ZSk7XG4gICAgcmV0dXJuIHNjcnViYmVkID8/IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJ1bGUgd2l0aCBzb21ldGhpbmcgdG8gc2F5IOKAlCBgdW5kZWZpbmVkYCBvbiB0aGUgbm8tcG9saWN5IHBhdGggKG5vXG4gICAqIHJ1bGUgaW5zdGFsbGVkLCBvciBhIHJ1bGUgd2l0aCBubyBwb2xpY3kgZW50cmllcyBhbmQgbm8gbWFya2VkIGtleXMpLCBzb1xuICAgKiBhIHRyYWNrZWQgcmVhZCBvciBhIHN0YWdlZCB3cml0ZSB0aGVyZSBwYXlzIG5vIHZlcmRpY3QgY2FsbCBhbmQgbm8gcGF0aFxuICAgKiBhbGxvY2F0aW9uLiBUaGUgZGVmYXVsdCBydW4gaXMgYnl0ZS1pZGVudGljYWwgQU5EIGNvc3QtaWRlbnRpY2FsLlxuICAgKi9cbiAgcHJpdmF0ZSBhY3RpdmVSdWxlKCk6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLnBvbGljeS5yZWRhY3Rpb247XG4gICAgcmV0dXJuIHJ1bGUgIT09IHVuZGVmaW5lZCAmJiAhcnVsZS5pc0luZXJ0KCkgPyBydWxlIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRIRSBPTkUgRlVOTkVMIGV2ZXJ5IHN0YWdlZCB3cml0ZSBwYXNzZXMgdGhyb3VnaCDigJQgZmFjYWRlIHdyaXRlcyBBTkRcbiAgICogdGhlIHBhdGhzIHRoYXQgYnlwYXNzIHRoZSBmYWNhZGUgKHN1YmZsb3cgc2VlZCwgYG91dHB1dE1hcHBlcmBcbiAgICogbWVyZ2UtYmFjaywgcmVzdW1lIHJlLXNlZWQpLiBUd28gb3duZXJzIChDNCk6IHRoZSBydW4ncyBydWxlIERFQ0lERVMsXG4gICAqIHRoZSByZWNvcmQgZnJhbWUgV1JJVEVTIHRoZSB2ZXJkaWN0J3MgYnl0ZXMsIGluIGZvdXIgc3RlcHNcbiAgICogKGByZWRhY3Rpb24udHNgLCBcIlRoZSB3cml0ZSBkZWNpc2lvblwiKTpcbiAgICogICAxLiB0aGUgdmVyZGljdCDigJQgYGRlY2lkZVdyaXRlYCwgdW5kZXIgdGhlIHJ1bGUgYWN0aXZlIGFzIHRoZSB3cml0ZSBiZWdpbnM7XG4gICAqICAgMi4gaWRlbnRpdHkgaW5oZXJpdGFuY2Ug4oCUIGBpbmhlcml0QnlJZGVudGl0eWAsIGFnYWluc3QgdGhpcyBmcmFtZSdzXG4gICAqICAgICAgc2VsZWN0ZWQgcmVhZHMgYXMgdGhleSBzdGFuZCBhZnRlciBzdGVwIDE7XG4gICAqICAgMy4gdGhlIGJ5dGVzIOKAlCBgUmVjb3JkRnJhbWUgwrcgd3JpdGVgLCB0aGUgb3AgYW5kIGl0cyBzY3J1YiAodGhlIHdob2xlXG4gICAqICAgICAgdmFsdWUsIG9yIHRoZSBmaWVsZHMgaW5zaWRlIGl0KTtcbiAgICogICA0LiB0aGUgbWFya3Mg4oCUIGBtYXJrU3RhZ2VkV3JpdGVgLCBvbmx5IG9uY2UgdGhlIHdyaXRlIHN0YWdlZCwgc28gYVxuICAgKiAgICAgIHdyaXRlIHRoYXQgZmFpbHMgdG8gc3RhZ2UgbWFya3Mgbm90aGluZy5cbiAgICogRWFjaCBzdGVwIHJlYWRzIHRoZSBydWxlIChhbmQgdGhlIHNlbGVjdGVkIHJlYWRzKSB3aGVuIGl0IGFjdHMsIGFzIHRoaXNcbiAgICogZnVubmVsIGFsd2F5cyBkaWQuIFJldHVybnMgdGhlIHZlcmRpY3Qgc28gdGhlIGNhbGxlciByZXRhaW5zIGFuZCByZXBvcnRzXG4gICAqIHVuZGVyIHRoZSBzYW1lIGRlY2lzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZVdyaXRlKFxuICAgIG5zUGF0aDogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZXhwbGljaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgdmVyYjogV3JpdGVWZXJiLFxuICApOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCBhY3RpdmUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICBpZiAoYWN0aXZlID09PSB1bmRlZmluZWQgJiYgIWV4cGxpY2l0KSB7XG4gICAgICAvLyBUaGUgbm8tcG9saWN5IGZhc3QgcGF0aCwgdGhlIHNhbWUgZm91ciBzdGVwcyB3aXRoIG5vdGhpbmcgdG8gZG86IG5vIHJ1bGUgd2l0aCBhbnl0aGluZyB0byBzYXlcbiAgICAgIC8vIGFuZCBubyBmbGFnIGlzIGNsZWFyIChzdGVwIDEpLCBub3RoaW5nIHRvIGluaGVyaXQgd2l0aG91dCBhIHJ1bGUgKHN0ZXAgMiksIG5vIHNjcnViIChzdGVwIDMpLFxuICAgICAgLy8gYW5kIG5vdGhpbmcgdG8gbWFyayDigJQgYSBjbGVhciB2ZXJkaWN0IG1hcmtzIG5vdGhpbmcsIGFuZCBhIGRlbGV0ZSB1bm1hcmtzIG9ubHkgb24gdGhlIHJ1bGVcbiAgICAgIC8vIGFjdGl2ZSBhcyBpdCBiZWdhbiAoc3RlcCA0KS4gVGhlIGRlZmF1bHQgcnVuIHBheXMgdGhlIHJlY29yZCdzIHdyaXRlIGFuZCBub3RoaW5nIGVsc2UuXG4gICAgICB0aGlzLnJlY29yZC53cml0ZShuc1BhdGgsIHZhbHVlLCB2ZXJiKTtcbiAgICAgIHJldHVybiBDTEVBUjtcbiAgICB9XG4gICAgY29uc3QgYXNrZWQgPSBkZWNpZGVXcml0ZShhY3RpdmUsIHBhdGgsIGtleSwgZXhwbGljaXQpO1xuICAgIGNvbnN0IHZlcmRpY3QgPSBpbmhlcml0QnlJZGVudGl0eShhY3RpdmUsIGFza2VkLCB0aGlzLl9zZWxlY3RlZE9iamVjdHMsIHBhdGgsIGtleSwgdmFsdWUpO1xuICAgIHRoaXMucmVjb3JkLndyaXRlKG5zUGF0aCwgdmFsdWUsIHZlcmIsIHNjcnViT2YodmVyZGljdCkpO1xuICAgIG1hcmtTdGFnZWRXcml0ZShhY3RpdmUsIHRoaXMucG9saWN5LnJlZGFjdGlvbiwgdmVyZGljdCwgcGF0aCwga2V5LCB2ZXJiKTtcbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZSBhbmQgcmVhZCBhdCBBTk9USEVSIGZyYW1lJ3MgYWRkcmVzcyAoaXRzIHJ1biBuYW1lc3BhY2UpIHdoaWxlIHRoaXNcbiAgICogZnJhbWUga2VlcHMgaXRzIG93biBpZGVudGl0eSBvbiB0aGUgcmVjb3JkIOKAlCBgc3RhZ2VgLCBgc3RhZ2VJZGAsXG4gICAqIGBydW50aW1lU3RhZ2VJZGAsIHRhZ3MuIEEgc3ViZmxvdyBtb3VudCdzIG1lcmdlLWJhY2sgaXMgdGhlIG9uZSBjYWxsZXJcbiAgICogKGBTdWJmbG93RXhlY3V0b3IgwrcgZXhlY3V0ZVN1YmZsb3dgLCBSMTMpOiB0aGUgbW91bnQgZnJhbWUgb2YgYSBicmFuY2ggb3JcbiAgICogZm9yayBjaGlsZCBsYW5kcyBpdHMgdmFsdWVzIHdoZXJlIGl0cyBwYXJlbnQgd3JpdGVzLCBhcyBiZWZvcmUsIGFuZCBpdHNcbiAgICogYnVuZGxlIG5vdyBuYW1lcyB0aGUgbW91bnQgaW5zdGVhZCBvZiB0aGUgc3RhZ2UgYmVmb3JlIGl0LiBSZWZ1c2VkIG9uY2VcbiAgICogdGhlIGZyYW1lIGhhcyBzdGFnZWQgYW55dGhpbmcg4oCUIGl0cyBidWZmZXIncyBhZGRyZXNzIGlzIGZpeGVkIHRoZW4uIFRoZVxuICAgKiBkZWNpc2lvbiBpcyB0aGUgZW5naW5lJ3MgKG5hbWVzcGFjZSBpZHMsIGFzIHNpbmNlIFIxMyk7IHRoZSByZWNvcmQgZnJhbWVcbiAgICogdGFrZXMgdGhlIGFkZHJlc3MgaXQgY29tZXMgdG8gKGBSZWNvcmRGcmFtZSDCtyB1c2VBZGRyZXNzYCkuXG4gICAqL1xuICB1c2VBZGRyZXNzT2YoZnJhbWU6IFN0YWdlQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlY29yZC5oYXNTdGFnZWQgJiYgZnJhbWUubmFtZXNwYWNlSWQgIT09IHRoaXMubmFtZXNwYWNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtmb290cHJpbnRdIFN0YWdlQ29udGV4dC51c2VBZGRyZXNzT2Y6ICcke3RoaXMuc3RhZ2VJZH0nIGhhcyBhbHJlYWR5IHN0YWdlZCB3cml0ZXMgYXQgaXRzIG93biBhZGRyZXNzLmAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZWFkU291cmNlcz8uYWN0aXZlICYmIHRoaXMuI2ZhaWx1cmVJZGVudGl0eSAmJiBmcmFtZS5uYW1lc3BhY2VJZCAhPT0gdGhpcy5uYW1lc3BhY2VJZClcbiAgICAgIHRoaXMucmVhZFNvdXJjZXMub3duZXJzaGlwPy5saW1pdCgnbmFtZXNwYWNlLWNoYW5nZWQnKTtcbiAgICB0aGlzLmFkZHJlc3NSdW5JZCA9IGZyYW1lLm5hbWVzcGFjZUlkO1xuICAgIHRoaXMucmVjb3JkLnVzZUFkZHJlc3MocnVuQWRkcmVzcyh0aGlzLm5hbWVzcGFjZUlkKSk7XG4gIH1cblxuICAvKiogVGhlIHJ1biBuYW1lc3BhY2Ugd3JpdGVzIGFuZCByZWFkcyBnbyB0bzoge0BsaW5rIGFkZHJlc3NSdW5JZH0sIGVsc2UgYHJ1bklkYC4gKi9cbiAgcHJpdmF0ZSBnZXQgbmFtZXNwYWNlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hZGRyZXNzUnVuSWQgPz8gdGhpcy5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBXcml0ZSBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBhdGNoKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdzZXQnKTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIG1lcmdlKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gdGhpcy5zdGFnZVdyaXRlKHRoaXMucmVjb3JkLmF0KHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ21lcmdlJyk7XG4gIH1cblxuICBzZXRPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAgICBvcGVyYXRpb25PdmVycmlkZT86ICdzZXQnIHwgJ2RlbGV0ZScsXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIC8vIEV4cGxpY2l0IGRlbGV0aW9uIChTY29wZUZhY2FkZS5kZWxldGVWYWx1ZSkgc3RhZ2VzIGEgZGlzdGluY3Qgb3Agc29cbiAgICAvLyBkZWx0YS1tb2RlIGNvbW1pdHMgKCMxM2MtQikgY2FuIGVtaXQgYSByZWFsIGBkZWxldGVgIHRyYWNlIGVudHJ5LlxuICAgIC8vIFVuZGVyIHRoZSBkZWZhdWx0ICdmdWxsJyBtb2RlIHRoZSBidWZmZXIgY29tbWl0cyBpdCBhcyBhXG4gICAgLy8gc2V0LW9mLXVuZGVmaW5lZCDigJQgYnl0ZS1pZGVudGljYWwgdG8gdGhlIGhpc3RvcmljYWwgZmxhdHRlbmluZy5cbiAgICBjb25zdCB2ZXJkaWN0ID1cbiAgICAgIG9wZXJhdGlvbk92ZXJyaWRlID09PSAnZGVsZXRlJ1xuICAgICAgICA/IHRoaXMuc3RhZ2VXcml0ZSh0aGlzLnJlY29yZC5hdChwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHVuZGVmaW5lZCwgc2hvdWxkUmVkYWN0LCAnZGVsZXRlJylcbiAgICAgICAgOiB0aGlzLnN0YWdlV3JpdGUodGhpcy5yZWNvcmQuYXQocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCBvcGVyYXRpb25PdmVycmlkZSA/PyAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCB0YWdnZWQgPSBkZXNjcmlwdGlvbi5zdGFydHNXaXRoKCdbJykgPyBkZXNjcmlwdGlvbiA6IGBbV1JJVEVdICR7ZGVzY3JpcHRpb259YDtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgdGFnZ2VkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICB1cGRhdGVPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMubWVyZ2UocGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0KTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdCDigJRcbiAgICAvLyBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSksIHNlZSB0cmFja1dyaXRlLlxuICAgIHRoaXMudHJhY2tXcml0ZSh1c2VyS2V5T2YocGF0aCwga2V5KSwgdmFsdWUsIHZlcmRpY3QsICd1cGRhdGUnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIHNldFJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChbXSwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogUm9vdC1sZXZlbCAodW4tbmFtZXNwYWNlZCkgd3JpdGUg4oCUIHRoZSBzdWJmbG93IHNlZWQgYW5kIG1lcmdlLWJhY2sgcGF0aC4gKi9cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0YWdlV3JpdGUoW2tleV0sIFtdLCBrZXksIHZhbHVlLCB1bmRlZmluZWQsICdzZXQnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUdsb2JhbENvbnRleHQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gIH1cblxuICBhcHBlbmRUb0FycmF5KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgaXRlbXM6IHVua25vd25bXSwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPSBBcnJheS5pc0FycmF5KGV4aXN0aW5nKSA/IFsuLi5leGlzdGluZywgLi4uaXRlbXNdIDogWy4uLml0ZW1zXTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIG1lcmdlT2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPVxuICAgICAgZXhpc3RpbmcgJiYgdHlwZW9mIGV4aXN0aW5nID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShleGlzdGluZylcbiAgICAgICAgPyB7IC4uLihleGlzdGluZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksIC4uLm9iaiB9XG4gICAgICAgIDogeyAuLi5vYmogfTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIEJPUlJPV0VEIOKAlCBzZWUgdGhlIGNvbnRyYWN0IG9uXG4gICAqIGBTY29wZUZhY2FkZS5nZXRWYWx1ZWAuIFJlYWQtdHJhY2tpbmcgY29zdCBpcyBwb2xpY3ktZ2F0ZWQgKCMxNCk6XG4gICAqIGAnZnVsbCdgIGNsb25lcyB0aGUgdmFsdWUgaW50byBgX3N0YWdlUmVhZHNgIChoaXN0b3JpY2FsIGRlZmF1bHQpLFxuICAgKiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXAgbWFya2VyLCBgJ29mZidgIHJlY29yZHMgbm90aGluZy5cbiAgICovXG4gIGdldFZhbHVlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWRSZXRhaW5lZFZhbHVlKHBhdGgsIGtleSwgZGVzY3JpcHRpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNhcHR1cmU/LmxpbWl0KCdyZWFkLXJldGVudGlvbi1mYWlsZWQnKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVhZFJldGFpbmVkVmFsdWUocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICAvLyBUaGUgcmVjb3JkIGZyYW1lIHNlcnZlcyB0aGUgdmFsdWUgKHR3byB0aWVycykgYW5kIGtlZXBzIHRoZSBwZXItd3JpdGVcbiAgICAvLyBwcm92ZW5hbmNlIHJlZ2lzdHJ5ICgjUDEpIOKAlCBrZXkgc3RyaW5ncyBvbmx5LCBpbmRlcGVuZGVudCBvZiB0aGVcbiAgICAvLyByZWFkVHJhY2tpbmcgcmV0ZW50aW9uIGRpYWwgKHdoaWNoIGdvdmVybnMgVkFMVUUgcmV0ZW50aW9uIGJlbG93KS5cbiAgICBsZXQgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCA9IENMRUFSO1xuICAgIGNvbnN0IHZhbHVlID1cbiAgICAgIHRoaXMucG9saWN5LnJlYWRTb3VyY2VzICYmIHRoaXMucmVhZFNvdXJjZXNcbiAgICAgICAgPyB0aGlzLnJlYWRXaXRoTmF0aXZlU291cmNlKHBhdGgsIGtleSwgKCkgPT4ge1xuICAgICAgICAgICAgdmVyZGljdCA9IHRoaXMuanVkZ2VSZWFkKHBhdGgsIGtleSk7XG4gICAgICAgICAgICByZXR1cm4gdmVyZGljdC5raW5kID09PSAnY2xlYXInID8gJ3Zpc2libGUnIDogJ3JlZGFjdGVkJztcbiAgICAgICAgICB9KVxuICAgICAgICA6IHRoaXMucmVjb3JkLnJlYWQocGF0aCwga2V5KTtcbiAgICAvLyBEZWZhdWx0LW9mZiByZXRhaW5zIGl0cyBvcmlnaW5hbCByZWFkIC0+IG5vdGVSZWFkIC0+IE9ORSB2ZXJkaWN0IG9yZGVyLlxuICAgIC8vIEVuYWJsZWQgY2FwdHVyZSB1c2VzIGEgcHVyZSBwb3N0LXJlYWQgdmVyZGljdDsgcHJlZml4IGJvb2trZWVwaW5nIGZvbGxvd3MgaXRcbiAgICAvLyBiZWZvcmUgcmV0dXJuaW5nIHRvIHN0YWdlIGNvZGUuIEEgcHVyZSwgbmFtZS1vbmx5IHZlcmRpY3QgY2Fubm90IG9ic2VydmUgdGhlIHByZWZpeC5cbiAgICBpZiAoIXRoaXMucG9saWN5LnJlYWRTb3VyY2VzIHx8ICF0aGlzLnJlYWRTb3VyY2VzKSB2ZXJkaWN0ID0gdGhpcy5ub3RlQW5kSnVkZ2VSZWFkKHBhdGgsIGtleSk7XG4gICAgaWYgKHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZFJlYWRzICs9IDE7XG4gICAgICAvLyBBbiBvYmplY3QgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUsIHdyaXR0ZW4gYmFjayB1bmRlciBhbm90aGVyLCBrZWVwcyBpdHMgcnVsZSAoc3RhZ2VXcml0ZSkuXG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgKHRoaXMuX3NlbGVjdGVkT2JqZWN0cyA/Pz0gbmV3IFdlYWtNYXAoKSkuc2V0KHZhbHVlLCB2ZXJkaWN0KTtcbiAgICB9XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCByZWFkIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcg4oCUIHJldGFpbmVkIHVuZGVyXG4gICAgLy8gdGhlIHJ1bGUncyB2ZXJkaWN0ICg5LjE5LjApOiBhIHJlZGFjdGVkIGtleSBpcyByZXRhaW5lZCBhcyB0aGVcbiAgICAvLyBwbGFjZWhvbGRlciwgYSBmaWVsZC1sZXZlbCBrZXkgYXMgYSBzY3J1YmJlZCBjbG9uZSwgbmV2ZXIgdGhlIHNlY3JldC5cbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy5wb2xpY3kucmVhZFRyYWNraW5nICE9PSAnb2ZmJykge1xuICAgICAgaWYgKHBhdGgubGVuZ3RoID4gMCkgKHRoaXMuX25lc3RlZFJlYWRzID8/PSBuZXcgU2V0KCkpLmFkZCh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gICAgICBlbHNlIGlmICh0aGlzLnBvbGljeS5yZWFkVHJhY2tpbmcgPT09ICdmdWxsJyAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgICBpZiAodGhpcy5yZWNvcmQuaGFzU3RhZ2VkKSB0aGlzLl92aWV3UmVhZHM/LmRlbGV0ZShrZXkpO1xuICAgICAgICBlbHNlICh0aGlzLl92aWV3UmVhZHMgPz89IG5ldyBTZXQoKSkuYWRkKGtleSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zdGFnZVJlYWRzW3VzZXJLZXlPZihwYXRoLCBrZXkpXSA9XG4gICAgICAgIHZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogdGhpcy5yZXRhaW5lZEZvcm0odmVyZGljdCwgdmFsdWUsIHRoaXMucG9saWN5LnJlYWRUcmFja2luZywgc3VtbWFyaXplUmVhZFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGBbUkVBRF0gJHtkZXNjcmlwdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRyYWNrZWQgcmVhZHMgb2YgdGhpcyBmcmFtZSByZWFkIGEgdmFsdWUgdGhlIHJ1bidzIHJ1bGUgc2VsZWN0c1xuICAgKiAoYSBrZXkgaXQgbWFza3Mgd2hvbGUsIG9yIG9uZSB3aXRoIHNlY3JldCBmaWVsZHMpLiBBIGJvdW5kYXJ5IHRoYXQgbWFwc1xuICAgKiB3aGF0IGEgc3RhZ2UgZnVuY3Rpb24gUkVBRCBpbnRvIGEgbmV3IG5hbWUg4oCUIHRoZSBgcGFyYWxsZWxGb3JFYWNoYCBpdGVtc1xuICAgKiBzZWxlY3RvciDigJQgY29tcGFyZXMgaXQgYmVmb3JlIGFuZCBhZnRlciwgYXMgYSBzdWJmbG93IG1hcHBlcidzIHRhaW50IGRvZXNcbiAgICogKGBtZW1vcnkvcmVkYWN0aW9uLnRzIMK3IE1hcHBlclRhaW50YCkuIEFsd2F5cyAwIHdpdGhvdXQgYSBwb2xpY3kgb3IgYSBtYXJrLlxuICAgKi9cbiAgZ2V0IHNlbGVjdGVkUmVhZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRSZWFkcztcbiAgfVxuXG4gIHByaXZhdGUgbm90ZUFuZEp1ZGdlUmVhZChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB0aGlzLnJlY29yZC5ub3RlUmVhZChwYXRoLCBrZXkpO1xuICAgIHJldHVybiB0aGlzLmp1ZGdlUmVhZChwYXRoLCBrZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBqdWRnZVJlYWQocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHJ1bGUgPSBrZXkgIT09IHVuZGVmaW5lZCA/IHRoaXMuYWN0aXZlUnVsZSgpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBydWxlICE9PSB1bmRlZmluZWQgPyBydWxlLnZlcmRpY3RBdChwYXRoLCBrZXkgYXMgc3RyaW5nKSA6IENMRUFSO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkV2l0aE5hdGl2ZVNvdXJjZShcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwcml2YWN5OiAoKSA9PiAndmlzaWJsZScgfCAncmVkYWN0ZWQnLFxuICApOiB1bmtub3duIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMuI2ZhaWx1cmVJZGVudGl0eTtcbiAgICBjb25zdCBjb3VudHMgPVxuICAgICAgdGhpcy5yZWFkU291cmNlcz8uYWN0aXZlICYmIGlkZW50aXR5ICYmIGtleSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gKHRoaXMuc291cmNlUmVhZENvdW50ZXIgPz89IG5ldyBTb3VyY2VSZWFkQ291bnRlcigpKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBsZXQganVkZ2VkID0gZmFsc2U7XG4gICAgbGV0IGhpZGRlbiA9IGZhbHNlO1xuICAgIGNvbnN0IHZlcmRpY3QgPSAoKSA9PiB7XG4gICAgICBqdWRnZWQgPSB0cnVlO1xuICAgICAgaWYgKGNvdW50cyAmJiAhY291bnRzLm9ic2VydmUoKSkgdGhpcy5yZWFkU291cmNlcz8ubGltaXQoJ3NvdXJjZS1jYXB0dXJlLWZhaWxlZCcpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcHJpdmFjeSgpO1xuICAgICAgaGlkZGVuID0gcmVzdWx0ICE9PSAndmlzaWJsZSc7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgbGV0IHZhbHVlOiB1bmtub3duO1xuICAgIHRyeSB7XG4gICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwgIWlkZW50aXR5KSB7XG4gICAgICAgIHRoaXMucmVhZFNvdXJjZXM/LmxpbWl0KGtleSA9PT0gdW5kZWZpbmVkID8gJ3VudHJhY2tlZC1yZWFkJyA6ICdpZGVudGl0eS11bmF2YWlsYWJsZScpO1xuICAgICAgICB2YWx1ZSA9IHRoaXMucmVjb3JkLnJlYWQocGF0aCwga2V5KTtcbiAgICAgICAgdmVyZGljdCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZUF0dGVtcHQpIHRoaXMucmVhZFNvdXJjZXM/Lm93bmVyc2hpcD8ubGltaXQoJ2F0dGVtcHQtdW5hdmFpbGFibGUnKTtcbiAgICAgICAgY29uc3QgcmVhZCA9IHRoaXMucmVjb3JkLnJlYWRXaXRoU291cmNlKFxuICAgICAgICAgIHBhdGgsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHsgcnVudGltZVN0YWdlSWQ6IGlkZW50aXR5LnJ1bnRpbWVTdGFnZUlkLCAuLi4odGhpcy5zb3VyY2VBdHRlbXB0ICYmIHsgYXR0ZW1wdElkOiB0aGlzLnNvdXJjZUF0dGVtcHQgfSkgfSxcbiAgICAgICAgICB2ZXJkaWN0LFxuICAgICAgICApO1xuICAgICAgICB2YWx1ZSA9IHJlYWQudmFsdWU7XG4gICAgICAgIGlmIChyZWFkLm9jY3VycmVuY2UgJiYgdGhpcy5yZWFkU291cmNlcz8uYWN0aXZlKSB7XG4gICAgICAgICAgY291bnRzPy5yZXRhaW4ocmVhZC5vY2N1cnJlbmNlLnNvdXJjZS5raW5kKTtcbiAgICAgICAgICB0aGlzLnJlYWRTb3VyY2VzLm93bmVyc2hpcD8uY2hlY2tTZWxlY3RlZEFkZHJlc3MoaWRlbnRpdHkucnVudGltZVN0YWdlSWQsIHJlYWQub2NjdXJyZW5jZS5zdGF0ZUFkZHJlc3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEEgc3VjY2Vzc2Z1bCBuYXRpdmUgcmVhZCBrZWVwcyBpdHMgcHJlZml4IGV2ZW4gd2hlbiB0aGUgdmVyZGljdCB0aHJvd3MuXG4gICAgICAvLyBBIG5hdGl2ZSBmYWlsdXJlIG5ldmVyIGVudGVycyB0aGUgdmVyZGljdCBhbmQgbXVzdCBub3QgaW52ZW50IGEgcmVhZC5cbiAgICAgIGlmIChqdWRnZWQpIHRoaXMubm90ZVNvdXJjZVJlYWQocGF0aCwga2V5LCBoaWRkZW4sIGZhbHNlKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICBpZiAoanVkZ2VkKSB0aGlzLm5vdGVTb3VyY2VSZWFkKHBhdGgsIGtleSwgaGlkZGVuLCB0cnVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIG5vdGVTb3VyY2VSZWFkKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCwgaGlkZGVuOiBib29sZWFuLCBwcm9wYWdhdGVGYWlsdXJlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgdGhpcy5yZWNvcmQubm90ZVJlYWQocGF0aCwga2V5KTtcbiAgICAgIGlmIChoaWRkZW4pIHRoaXMucmVhZFNvdXJjZXM/LmxpbWl0KCdwcml2YWN5LWFjdGl2ZScpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnJlYWRTb3VyY2VzPy5saW1pdCgnc291cmNlLWNhcHR1cmUtZmFpbGVkJyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQ29sbGVjdG9yIGZhaWx1cmVzIG11c3Qgbm90IHJlcGxhY2UgdGhlIG9yaWdpbmFsIHJlYWQvdmVyZGljdCBlcnJvci5cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wYWdhdGVGYWlsdXJlKSB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKiogUmVhZCBzdGF0ZSB3aXRob3V0IHRyYWNraW5nIGluIF9zdGFnZVJlYWRzIG9yIHBheWluZyBzdHJ1Y3R1cmVkQ2xvbmUgY29zdC5cbiAgICogIFVzZWQgYnkgU2NvcGVGYWNhZGUuZ2V0VmFsdWVTaWxlbnQoKSBmb3IgYXJyYXkgcHJveHkgaW50ZXJuYWwgb3BlcmF0aW9ucy4gKi9cbiAgZ2V0VmFsdWVEaXJlY3QocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5yZWFkKHBhdGgsIGtleSk7XG4gIH1cblxuICBnZXRSb290KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkLnJlYWRMaXZlKGtleSk7XG4gIH1cblxuICBnZXRHbG9iYWwoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5yZWNvcmQucmVhZEdsb2JhbChrZXkpO1xuICB9XG5cbiAgZ2V0U2NvcGUoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLnJlY29yZC5zdGF0ZS5nZXRTdGF0ZSgpO1xuICB9XG5cbiAgZ2V0UnVuSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDb21taXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDI6IHJlY29yZCB0aGF0IHRoaXMgc3RhZ2UgY29uc3VtZWQgYW4gdW50cmFja2VkIHJlYWQgcGF0aC5cbiAgICogQ2FsbGVkIGJ5IGBTY29wZUZhY2FkZWAgKGBnZXRBcmdzYC9gZ2V0RW52YC91bnNoYWRvd2VkIGBnZXRWYWx1ZVNpbGVudGApO1xuICAgKiBzdXJmYWNlZCBhcyBgQ29tbWl0QnVuZGxlLnVudHJhY2tlZFNvdXJjZXNgIG9uIHRoaXMgc3RhZ2UncyBjb21taXQuXG4gICAqL1xuICBtYXJrVW50cmFja2VkU291cmNlKHNvdXJjZTogVW50cmFja2VkU291cmNlKTogdm9pZCB7XG4gICAgdGhpcy5yZWFkU291cmNlcz8ubGltaXQoJ3VudHJhY2tlZC1yZWFkJyk7XG4gICAgKHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPz89IG5ldyBTZXQoKSkuYWRkKHNvdXJjZSk7XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgdGhhdCBmaXJlcyBhZnRlciBjb21taXQoKSBhcHBsaWVzIHBhdGNoZXMuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGRpc3BhdGNoIFNjb3BlUmVjb3JkZXIub25Db21taXQgZXZlbnRzLiAqL1xuICBzZXRDb21taXRPYnNlcnZlcihcbiAgICBvYnNlcnZlcjogKG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4pID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyID0gb2JzZXJ2ZXI7XG4gIH1cblxuICAvKipcbiAgICogRGV2LW1vZGUgb25seTogZGlkIHRoaXMgc3RhZ2UgY2hhbmdlLCBJTiBQTEFDRSwgYSB2YWx1ZSBpdCBtZXJlbHkgUkVBRD9cbiAgICpcbiAgICogVGhlIHR5cGVkIHNjb3BlIGludGVyY2VwdHMgZXZlcnkgd3JpdGUgaXQgY2FuIHJlYWNoIOKAlCBhIHByb3BlcnR5IGF0IGFueVxuICAgKiBkZXB0aCwgYW4gaW5kZXhlZCBlbGVtZW50LCBhbiBhcnJheSBtZXRob2QuIFdoYXQgaXQgY2Fubm90IHJlYWNoIGlzIGFuXG4gICAqIGVsZW1lbnQgaGFuZGVkIG91dCBieSBhIHJlYWQgbWV0aG9kIChgZmluZGAsIGBmaWx0ZXJgLCBgZm9y4oCmb2ZgLFxuICAgKiBgZm9yRWFjaGAsIGRlc3RydWN0dXJpbmcpOiB3cmFwcGluZyB0aG9zZSB3b3VsZCBtZWFuIHJldHVybmluZyBwcm94aWVzIG91dFxuICAgKiBvZiBldmVyeSByZWFkLCB3aGljaCBpcyBhIGNvc3QgdGhlIGxpYnJhcnkgc2hvdWxkIG5vdCBwYXkuIFNvIHRoYXQgZmFtaWx5XG4gICAqIGlzIFdBUk5FRCBBQk9VVCByYXRoZXIgdGhhbiBpbnRlcmNlcHRlZCDigJQgbG91ZGx5LCBoZXJlLCBpbnN0ZWFkIG9mIGVuZGluZ1xuICAgKiB0aGUgcnVuIHdpdGggYSBjb21taXQgbG9nIHRoYXQgc2lsZW50bHkgZGlzYWdyZWVzIHdpdGggZmluYWwgc3RhdGUuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBSRVBPUlQgYWZ0ZXIgdGhlIGZhY3QsIG5vdCBhIHJlZnVzYWwgYXQgdGhlIHdyaXRlOiB0aGUgd3JpdGUgaGFzXG4gICAqIGFscmVhZHkgaGFwcGVuZWQgaW4gcGxhY2UgYW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW50ZXJjZXB0LiBJdCBydW5zIHVuZGVyXG4gICAqIFRXTyBwcmVjb25kaXRpb25zLCBib3RoIG5hbWVkIGluIHRoZSBSRUFETUUg4oCUIGBlbmFibGVEZXZNb2RlKClgLCBhbmRcbiAgICogYHJlYWRUcmFja2luZzogJ2Z1bGwnYCAodGhlIGRlZmF1bHQpLCBiZWNhdXNlIHRoZSBjb21wYXJpc29uIG5lZWRzIHRoZVxuICAgKiBjbG9uZSBvZiB0aGUgdmFsdWUgdGhhdCBtb2RlIHJldGFpbnMgYXQgcmVhZCB0aW1lLiBBIGtleSB0aGUgc3RhZ2UgbmV2ZXJcbiAgICogc3RhZ2VkIG11c3Qgc3RpbGwgaG9sZCB0aGF0IGNsb25lIOKAlCBjb21taXR0ZWQgc3RhdGUgaXMgaW1tdXRhYmxlLWFmdGVyLXN3YXBcbiAgICogYW5kIHRoZSBidWZmZXIncyB3b3JraW5nIGNvcHkgaXMgcHJpdmF0ZSB0byB0aGlzIHN0YWdlLiBLZXlzIHRoZSBzdGFnZSBESURcbiAgICogc3RhZ2UgYXJlIHNraXBwZWQgKHRoZXkgYXJlIGV4cGVjdGVkIHRvIGRpZmZlciwgYW5kIHRoZXkgYXJlIGluIHRoZSByZWNvcmQpLFxuICAgKiBzbyBhcmUga2V5cyB1bmRlciBhIHJlZGFjdGlvbiB2ZXJkaWN0LCB3aG9zZSByZXRhaW5lZCBmb3JtIGlzIGRlbGliZXJhdGVseVxuICAgKiBub3QgdGhlIHZhbHVlLCBhbmQgc28gYXJlIGtleXMgcmVhZCBhdCBhIG5lc3RlZCBwYXRoIChgX25lc3RlZFJlYWRzYCkg4oCUXG4gICAqIHRob3NlIGFyZSBlbmdpbmUgcmVhZHMgKHRoZSBzdWJmbG93IG1lcmdlLWJhY2spLCBub3QgdXNlciByZWFkcy5cbiAgICpcbiAgICogSXQgYWxzbyBvbmx5IGxvb2tzIGF0IGtleXMgc2VydmVkIGZyb20gdGhlIFBJTk5FRCBzb3VyY2Ug4oCUIHRoZSBmaXJzdC10b3VjaFxuICAgKiB2aWV3IG9yIHRoaXMgc3RhZ2UncyBvd24gYnVmZmVyLiBBIGtleSBhYnNlbnQgZnJvbSBib3RoIHdhcyBzZXJ2ZWQgYnkgdGhlXG4gICAqIHJlYWQncyBsaXZlIGZhbGxiYWNrIChgUmVjb3JkRnJhbWUgwrcgcmVhZGAsIHRpZXIgMiksIHdoaWNoIGEgcGFyYWxsZWwgc2libGluZydzIHJvb3Qta2V5IGNvbW1pdCBjYW5cbiAgICogbGVnaXRpbWF0ZWx5IG1vdmU7IGFjY3VzaW5nIHRoZSBzdGFnZSB0aGVyZSB3b3VsZCBiZSBhIGZhbHNlIGFsYXJtLiBGb3JcbiAgICogdGhlIHNhbWUgcmVhc29uIGl0IHJ1bnMgb24gdGhlIGZyYW1lJ3MgRklSU1QgY29tbWl0IG9ubHk6IHRoZSByZWFkcyBiZWxvbmdcbiAgICogdG8gdGhhdCByb3VuZCwgYW5kIGJ5IHRoZSBlbmdpbmUncyBzZWNvbmQgcm91bmQgKGEgZm9yayBkb3VibGUtY29tbWl0LCBhXG4gICAqIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgY29tbWl0dGVkIGJyYW5jaCBwYXJlbnQpIG90aGVyIHN0YWdlcyBoYXZlXG4gICAqIGxlZ2l0aW1hdGVseSBtb3ZlZCB0aGUgc3RhdGUgdGhleSB3ZXJlIGNvbXBhcmVkIGFnYWluc3QuXG4gICAqXG4gICAqIEEga2V5IHRoZSBzdGFnZSBESUQgc3RhZ2UgaXMgc3RpbGwgY2hlY2tlZCB3aGVuIGl0cyBsYXN0IHJlYWQgY2FtZSBmcm9tXG4gICAqIGNvbW1pdHRlZCBzdGF0ZSAoe0BsaW5rIF92aWV3UmVhZHN9IOKAlCByZWFkIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUpOlxuICAgKiB0aGF0IHJlYWQgd2FzIHRoZSBjb21taXR0ZWQgb2JqZWN0IGl0c2VsZiwgYW5kIHRoZSBidWZmZXIncyBkaWZmIGJhc2UgSVNcbiAgICogdGhhdCBvYmplY3QgKGNvcHktb24td3JpdGUsIDkuMjkuMCksIHNvIGFuIGluLXBsYWNlIGVkaXQgZm9sbG93ZWQgYnkgYVxuICAgKiB3cml0ZSBvZiB0aGUga2V5IGNvbW1pdHMgTk8gY2hhbmdlIOKAlCBsaXZlIHN0YXRlIGtlZXBzIHRoZSBlZGl0LCB0aGUgbG9nXG4gICAqIGRvZXMgbm90LiBDb21wYXJlZCBhZ2FpbnN0IGNvbW1pdHRlZCBzdGF0ZSwgbm90IHRoZSB3cml0dGVuIHZhbHVlLCBzbyBhXG4gICAqIGxlZ2l0aW1hdGUgd3JpdGUgbmV2ZXIgdHJpcHMgaXQuXG4gICAqXG4gICAqIENvc3RzIG5vdGhpbmcgb3V0c2lkZSBgZW5hYmxlRGV2TW9kZSgpYC5cbiAgICovXG4gIHByaXZhdGUgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIWlzRGV2TW9kZSgpIHx8IHRoaXMucG9saWN5LnJlYWRUcmFja2luZyAhPT0gJ2Z1bGwnIHx8IHRoaXMuX2NvbW1pdHRlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLl9zdGFnZVJlYWRzKSkge1xuICAgICAgY29uc3QgcmV0YWluZWQgPSB0aGlzLl9zdGFnZVJlYWRzW2tleV07XG4gICAgICAvLyBPbmx5IGEgY29udGFpbmVyIGNhbiBiZSBtdXRhdGVkIGluIHBsYWNlOyBhIHByaW1pdGl2ZSByZWFkIGNhbm5vdC5cbiAgICAgIGlmIChyZXRhaW5lZCA9PT0gbnVsbCB8fCB0eXBlb2YgcmV0YWluZWQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLl9uZXN0ZWRSZWFkcz8uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHJ1bGUgIT09IHVuZGVmaW5lZCAmJiBydWxlLnZlcmRpY3RBdChbXSwga2V5KS5raW5kICE9PSAnY2xlYXInKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZWQgPSB0aGlzLnJlY29yZC5hdChbXSwga2V5KTtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5fc3RhZ2VXcml0ZXMsIGtleSkgfHwgdGhpcy5yZWNvcmQud2FzU3RhZ2VkKG5hbWVzcGFjZWQpKSB7XG4gICAgICAgIHRoaXMud2Fybk9uQ29tbWl0dGVkTXV0YXRpb24oa2V5LCBuYW1lc3BhY2VkLCByZXRhaW5lZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgcGlubmVkIHNvdXJjZSBvbmx5IOKAlCBzZWUgdGhlIG5vdGUgb24gdGhlIGxpdmUgZmFsbGJhY2sgYWJvdmUuXG4gICAgICAvLyBgcGVla2AsIG5vdCBgZ2V0YDogYSByZXBvcnQgY29tcGFyZXMsIGFuZCBtdXN0IG5vdCB0YWtlIHRoZSBwcml2YXRlXG4gICAgICAvLyBjb3B5IGEgc3RhZ2UncyByZWFkIHdvdWxkIChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLlxuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMucmVjb3JkLnBlZWsobmFtZXNwYWNlZCk7XG4gICAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcGF0aCA9IGZpcnN0RGlmZmVyaW5nUGF0aChyZXRhaW5lZCwgY3VycmVudCk7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oYm9ycm93ZWRNdXRhdGlvbk1lc3NhZ2UodGhpcy5zdGFnZU5hbWUsIGtleSwgcGF0aCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgc3RhZ2VkLWtleSBoYWxmIG9mIHtAbGluayB3YXJuT25Cb3Jyb3dlZE11dGF0aW9ufTogZGlkIGNvbW1pdHRlZCBzdGF0ZSBpdHNlbGYgbW92ZSB1bmRlciBhIHJlYWQ/ICovXG4gIHByaXZhdGUgd2Fybk9uQ29tbWl0dGVkTXV0YXRpb24oa2V5OiBzdHJpbmcsIG5hbWVzcGFjZWQ6IHN0cmluZ1tdLCByZXRhaW5lZDogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fdmlld1JlYWRzPy5oYXMoa2V5KSkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbW1pdHRlZCA9IHRoaXMucmVjb3JkLmJhc2VBdChuYW1lc3BhY2VkKTtcbiAgICBpZiAoY29tbWl0dGVkID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBjb25zdCBwYXRoID0gZmlyc3REaWZmZXJpbmdQYXRoKHJldGFpbmVkLCBjb21taXR0ZWQpO1xuICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2Fybihjb21taXR0ZWRNdXRhdGlvbk1lc3NhZ2UodGhpcy5zdGFnZU5hbWUsIGtleSwgcGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHN0YWdlZCB3cml0ZXMgdG8gc2hhcmVkIG1lbW9yeSBhbmQgUkVMRUFTRSB0aGUgcGVyLXN0YWdlIHN0YWdpbmdcbiAgICogc3RhdGUgKCMxM2IpLlxuICAgKlxuICAgKiBgcGhhc2VgICg5LjM5LjApIGlzIHRoZSBjYWxsZXIncyBzdGF0ZW1lbnQgb2Ygd2hhdCBhIENPTlRJTlVBVElPTiBjb21taXRcbiAgICogaXMg4oCUIGAnZXhpdCdgIGZyb20gYSBzdWJmbG93IG1vdW50J3MgZXhpdCwgYCdyZXBlYXQnYCBmcm9tIGEgZm9ya1xuICAgKiBmYW4tb3V0J3Mgc2V0dGxlLiBJdCBpcyBzdGFtcGVkIG9uIHRoZSBidW5kbGUgKGBDb21taXRCdW5kbGUucGhhc2VgKSBvbmx5XG4gICAqIHdoZW4gdGhpcyBmcmFtZSBoYXMgQUxSRUFEWSBjb21taXR0ZWQ6IHRoZSBGSVJTVCBidW5kbGUgb2YgYW4gZXhlY3V0aW9uXG4gICAqIGlzIHRoZSBzdGFnZSdzIG93biBhbmQgbmV2ZXIgY2FycmllcyBhIGBwaGFzZWAg4oCUIHNvIGEgbW91bnQgd2l0aG91dCBhblxuICAgKiBgb3V0cHV0TWFwcGVyYCAoYSBsYXp5IG1vdW50LCBldmVyeSBgcGFyYWxsZWxGb3JFYWNoYCBicmFuY2gpLCB3aG9zZSBleGl0XG4gICAqIGlzIGl0cyBvbmx5IGJ1bmRsZSwgcmVjb3JkcyB0aGF0IGJ1bmRsZSBhcyBpdHMgb3duLCB0YWdzIGFuZCBhbGwuXG4gICAqXG4gICAqIENvbW1pdCBpcyB0aGUgc3RhZ2UncyBsaWZlY3ljbGUgZW5kOiB0aGUgcmVjb3JkIGZyYW1lJ3MgYnVmZmVyIGFuZFxuICAgKiBmaXJzdC10b3VjaCBiYXNlIGFyZSBvbmx5IG5lZWRlZCBEVVJJTkcgZXhlY3V0aW9uLCBhcyB0aGUgcmVhZCBzbmFwc2hvdCArXG4gICAqIG5ldC1jaGFuZ2UgZGlmZiBiYXNlLCBzbyB0aGUgcmVjb3JkIGZyYW1lIHJlbGVhc2VzIHRoZW0gb25jZSB0aGUgY29tbWl0XG4gICAqIGhhcyBsYW5kZWQgYW5kIHRoZSBvYnNlcnZlciBoYXMgc2VlbiBpdCAoYFJlY29yZEZyYW1lIMK3IHJlbGVhc2VgIOKAlCB3aHkgYVxuICAgKiBmcmFtZSB0aGF0IGtlcHQgdGhlbSB3b3VsZCByZXRhaW4gb25lIHN0YXRlIGdlbmVyYXRpb24gcGVyIGV4ZWN1dGVkXG4gICAqIHN0YWdlLCBhbmQgd2h5IGEgcmUtdXNlZCBmcmFtZSByZS1hbmNob3JzIG9uIGN1cnJlbnQgc3RhdGUsIGlzIHRoZXJlKS5cbiAgICpcbiAgICogUkUtVVNFIEFGVEVSIENPTU1JVCBzdGF5cyBjb3JyZWN0IGJlY2F1c2UgYm90aCByZS1jcmVhdGUgbGF6aWx5OlxuICAgKiAtIGEgbGF0ZXIgUkVBRCByZS1hbmNob3JzIG9uIHRoZSBDVVJSRU5UIGNvbW1pdHRlZCBzdGF0ZSAod2hpY2ggaW5jbHVkZXNcbiAgICogICB0aGlzIHN0YWdlJ3Mgb3duIGZsdXNoZWQgd3JpdGVzKTtcbiAgICogLSBhIGxhdGVyIFdSSVRFIGNvbnN0cnVjdHMgYSBmcmVzaCBidWZmZXIgb24gdGhhdCByZS1hbmNob3JlZCB2aWV3LCBzbyBhXG4gICAqICAgc2Vjb25kIGNvbW1pdCBkaWZmcyBhZ2FpbnN0IHBvc3QtZmlyc3QtY29tbWl0IHN0YXRlLiBUaGUgcHJlLXJlbGVhc2VcbiAgICogICBidWZmZXIgYmVoYXZlZCB0aGUgc2FtZSBmb3IgVkFMVUVTIChpdHMgYHdvcmtpbmdDb3B5YCB3YXMgcmVzZXQgb25cbiAgICogICBjb21taXQsIGZhbGxpbmcgcmVhZHMgdGhyb3VnaCB0byBsaXZlIHN0YXRlKSBidXQga2VwdCB0aGUgT1JJR0lOQUxcbiAgICogICBgYmFzZVNuYXBzaG90YCBhcyBkaWZmIGJhc2Ug4oCUIHVucmVhY2hhYmxlIGluIHByYWN0aWNlOiB0aGUgZW5naW5lJ3NcbiAgICogICBvbmx5IHdyaXRlcyBhZnRlciBhIGNvbW1pdCBhcmUgdGhlIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgY29tbWl0dGVkXG4gICAqICAgYnJhbmNoIHBhcmVudCAoYSBkZWNpZGVyIG9yIGZvcmsgZnJhbWUgY29tbWl0cyBiZWZvcmUgaXRzIGJyYW5jaCBydW5zKTtcbiAgICogICB0aGUgb3RoZXIgXCJ3cml0ZSBhZnRlciBjb21taXRcIlxuICAgKiAgIHNpdGVzIChTdWJmbG93RXhlY3V0b3Igc2VlZCDihpIgcmVwbGFjZXMgdGhlIGNvbnRleHQ7IHJlc3VtZSDihpIgZnJlc2hcbiAgICogICBjb250ZXh0IHZpYSBgbGVhZi5jcmVhdGVOZXh0YCkgbmV2ZXIgcmUtdXNlIGEgY29tbWl0dGVkIGNvbnRleHQuXG4gICAqIC0gQSBVU0VSIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIGlzIGEgZGlmZmVyZW50IG1hdHRlcjogaXRzIHdyaXRlc1xuICAgKiAgIHdvdWxkIGxhbmQgaW4gYSBidWZmZXIgbm90aGluZyBldmVyIGNvbW1pdHMuIFRoYXQgcmVmdXNhbCBsaXZlcyBvbiB0aGVcbiAgICogICBzY29wZSB0aWVyIChgU2NvcGVGYWNhZGVgLCBzZWFsZWQgYnkgdGhlIGNvbW1pdCBvYnNlcnZlciDigJQgOS4yMi4wKSxcbiAgICogICBiZWNhdXNlIHRoZSBmcmFtZSdzIHJlLXVzYWJpbGl0eSBpcyBleGFjdGx5IHdoYXQgdGhlIGVuZ2luZSBwYXRoc1xuICAgKiAgIGFib3ZlIG5lZWQuXG4gICAqIC0gYF9zdGFnZVdyaXRlc2AgLyBgX3N0YWdlUmVhZHNgIGFyZSBOT1QgcmVsZWFzZWQg4oCUIGBzbmFwc2hvdFNlbGYoKWBcbiAgICogICByZWFkcyB0aGVtIHBvc3QtcnVuIGZvciB0aGUgZXhlY3V0aW9uLXRyZWUgc25hcHNob3QuXG4gICAqL1xuICBjb21taXQocGhhc2U/OiBDb21taXRQaGFzZSk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNvbW1pdFJldGFpbmVkKHBoYXNlKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5jYXB0dXJlPy5saW1pdCgnY29tbWl0LXJldGVudGlvbi1mYWlsZWQnKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29tbWl0UmV0YWluZWQocGhhc2U/OiBDb21taXRQaGFzZSk6IHZvaWQge1xuICAgIC8vIEEgY29udGludWF0aW9uIG9ubHkgQUZURVIgdGhlIGV4ZWN1dGlvbidzIG93biBidW5kbGUgKHNlZSBhYm92ZSkuXG4gICAgY29uc3QgY29udGludWF0aW9uID0gdGhpcy5fY29tbWl0dGVkID8gcGhhc2UgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5tYXRlcmlhbGlzZVdyaXRlcygpO1xuICAgIHRoaXMud2Fybk9uQm9ycm93ZWRNdXRhdGlvbigpO1xuICAgIC8vIFRoZSByZWNvcmQncyBoYWxmIChgUmVjb3JkRnJhbWUgwrcgY29tbWl0YCDihpIgYHJlY29yZENvbW1pdC50c2ApLiBObyBidWZmZXJcbiAgICAvLyA9IG5vIHdyaXRlIGV2ZXIgYnVpbHQgb25lICgjMTMpOiB0aGUgY29tbWl0IGlzIGVtcHR5IGJ5IGNvbnN0cnVjdGlvbixcbiAgICAvLyByZWNvcmRlZCB3aXRoIFpFUk8gY2xvbmVzLiBUaGUgbmFtZXMgYXJlIHJlYWQgb25jZSB0aGUgcGF5bG9hZCBpcyBidWlsdC5cbiAgICBjb25zdCBjb21taXRJbmRleCA9IHRoaXMucmVjb3JkLmxvZz8ubGVuZ3RoO1xuICAgIHRoaXMucmVjb3JkLmNvbW1pdCgoKSA9PiAoe1xuICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgICB1bnRyYWNrZWRTb3VyY2VzOiB0aGlzLl91bnRyYWNrZWRTb3VyY2VzLFxuICAgICAgdGFnczogdGhpcy50YWdzLFxuICAgICAgcGhhc2U6IGNvbnRpbnVhdGlvbixcbiAgICB9KSk7XG4gICAgaWYgKHRoaXMucmVhZFNvdXJjZXM/LmFjdGl2ZSAmJiB0aGlzLiNmYWlsdXJlSWRlbnRpdHkgJiYgY29tbWl0SW5kZXggIT09IHVuZGVmaW5lZClcbiAgICAgIHRoaXMucmVhZFNvdXJjZXMub3duZXJzaGlwPy5jb21taXQodGhpcy4jZmFpbHVyZUlkZW50aXR5LnJ1bnRpbWVTdGFnZUlkLCBjb21taXRJbmRleCk7XG4gICAgLy8gVGhlIG9ic2VydmVyIChTY29wZUZhY2FkZSkgc2VlcyB0aGUgdHJhY2tlZCBtdXRhdGlvbnMsIFRIRU4gdGhlIHN0YWdpbmdcbiAgICAvLyBzdGF0ZSBpcyByZWxlYXNlZCAoIzEzYiksIHNvIGl0IHNlZXMgdGhlIHdvcmxkIGFzIGl0IHdhcy4gRDIncyBtYXJrZXJzXG4gICAgLy8gYW5kIHRoZSBkZWNsYXJlZCB0YWdzIHJlbGVhc2Ugd2l0aCBpdCDigJQgb25lIHN0YW1wIHBlciBleGVjdXRpb24sIHNvIHRoZVxuICAgIC8vIGVuZ2luZSdzIGRvdWJsZS1jb21taXQgcGF0aHMgcmVjb3JkIHRoZW0gZXhhY3RseSBvbmNlLlxuICAgIGlmICh0aGlzLl9jb21taXRPYnNlcnZlcikge1xuICAgICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIoeyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9KTtcbiAgICB9XG4gICAgdGhpcy5yZWNvcmQucmVsZWFzZSgpO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50YWdzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NvbW1pdHRlZCA9IHRydWU7XG4gICAgLy8gVGhlIHN0YWdlIGlzIG92ZXI6IGV2ZXJ5IGNhbGwgaXQgbWFkZSB0aGF0IGlzIHN0aWxsIHJ1bm5pbmcgc3RvcHMgKFAyKSwgYW5kIG5vdGhpbmcgcmVwb3J0cyB0aHJvdWdoIHRoZVxuICAgIC8vIGVuZ2luZSBhbnkgbW9yZSDigJQgYSBsYXRlIHJlY29yZCBpcyByZWZ1c2VkIGJlZm9yZSBpdCB3b3VsZCByZWFjaCBpdC5cbiAgICB0aGlzLmVuZENhbGxzKHVuZGVmaW5lZCk7XG4gICAgdGhpcy5fYXR0ZW1wdFJlcG9ydGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhpcyBmcmFtZSBoYXMgY29tbWl0dGVkIOKAlCBhIGNhbGwncyByZWNvcmQgYXJyaXZpbmcgYWZ0ZXIgaXQgaXMgbGF0ZSAoUDIsIGBTY29wZUZhY2FkZSDCtyBjYWxsYCkuICovXG4gIGdldCBjb21taXR0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbW1pdHRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvdyBhd2F5IGV2ZXJ5dGhpbmcgdGhpcyBzdGFnZSBoYXMgU1RBR0VELCB3aXRob3V0IGNvbW1pdHRpbmcgYW55IG9mIGl0LlxuICAgKlxuICAgKiBUaGUgaXNvbGF0aW9uIHByaW1pdGl2ZSBiZWhpbmQgZGVjbGFyYXRpdmUgcmV0cnk6IHdoZW4gYSBub24tZmluYWwgYXR0ZW1wdFxuICAgKiBmYWlscywgdGhlIHdyaXRlcyBpdCBzdGFnZWQgbXVzdCBub3QgYmUgdmlzaWJsZSB0byB0aGUgbmV4dCBhdHRlbXB0LCBtdXN0XG4gICAqIG5vdCByZWFjaCBzaGFyZWQgc3RhdGUsIGFuZCBtdXN0IG5vdCBhcHBlYXIgaW4gdGhlIGNvbW1pdCBsb2cgb3IgaW4gdGhpc1xuICAgKiBzdGFnZSdzIHNuYXBzaG90LiBEcm9wcGluZyB0aGUgc3RhZ2luZyBzdGF0ZSBhY2hpZXZlcyBhbGwgZm91ciBhdCBvbmNlIOKAlFxuICAgKiB0aGVyZSBpcyBubyByb2xsYmFjayBtYWNoaW5lcnkgdG8gaW52b2tlIGJlY2F1c2Ugbm90aGluZyB3YXMgZXZlciBhcHBsaWVkXG4gICAqIChNMTogdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciBob2xkcyB3cml0ZXMgdW50aWwgYGNvbW1pdCgpYCBmbHVzaGVzIHRoZW0pLlxuICAgKlxuICAgKiBXaGF0IGlzIHJlbGVhc2VkLCBhbmQgd2h5IGVhY2ggb25lIG1hdHRlcnMgZm9yIHRoZSBuZXh0IGF0dGVtcHQ6XG4gICAqICAtIHRoZSByZWNvcmQgZnJhbWUncyBzdGFnZWQgc3RhdGUgKGBSZWNvcmRGcmFtZSDCtyBkaXNjYXJkYCkg4oCUIHRoZSBidWZmZXJcbiAgICogICAgICAgICAgICAgICAgICAgICh0aGUgbmV4dCBhdHRlbXB0IHN0YXJ0cyB3aXRoIG5vdGhpbmcgc3RhZ2VkKSwgdGhlXG4gICAqICAgICAgICAgICAgICAgICAgICBmaXJzdC10b3VjaCBiYXNlIChpdCByZS1hbmNob3JzIG9uIGNvbW1pdHRlZCBzdGF0ZSBhc1xuICAgKiAgICAgICAgICAgICAgICAgICAgaXQgc3RhbmRzIE5PVyDigJQgYSBzaWJsaW5nIGZvcmsgYnJhbmNoIG1heSBsZWdpdGltYXRlbHlcbiAgICogICAgICAgICAgICAgICAgICAgIGhhdmUgY29tbWl0dGVkIGluIGJldHdlZW4pIGFuZCB0aGUgcmVhZEtleXMgbGlzdCAoI1AxOlxuICAgKiAgICAgICAgICAgICAgICAgICAgYSBkaXNjYXJkZWQgYXR0ZW1wdCdzIHJlYWRzIG11c3QgbmV2ZXIgcmVhY2ggdGhlIG5leHRcbiAgICogICAgICAgICAgICAgICAgICAgIGF0dGVtcHQncyBgVHJhY2VFbnRyeS5yZWFkS2V5c2ApO1xuICAgKiAgLSBgX3N0YWdlV3JpdGVzYCAvIGBfcGVuZGluZ1dyaXRlc2AgLyBgX3N0YWdlUmVhZHNgIOKAlCB0aGUgc25hcHNob3RcbiAgICogICAgICAgICAgICAgICAgICAgIHBheWxvYWQ7IHdpdGhvdXQgdGhlIHJlc2V0IHRoZSBleGVjdXRpb24gdHJlZSB3b3VsZFxuICAgKiAgICAgICAgICAgICAgICAgICAgcmVwb3J0IHdyaXRlcyB0aGF0IHdlcmUgZGlzY2FyZGVkLCB3aGljaCBpcyB0aGUgZXhhY3RcbiAgICogICAgICAgICAgICAgICAgICAgIGxpZSB0aGlzIGZlYXR1cmUgZXhpc3RzIHRvIHByZXZlbnQgKHRoZSBwZW5kaW5nIG1hcFxuICAgKiAgICAgICAgICAgICAgICAgICAgaG9sZHMgYmFyZSByZWZlcmVuY2VzIOKAlCBkcm9wcGluZyBpdCB1bi1jbG9uZXMgbm90aGluZyk7XG4gICAqICAtIGBfdW50cmFja2VkU291cmNlc2Ag4oCUIHRoZSBEMiBob25lc3R5IG1hcmtlcnMsIHJlbGVhc2VkIHdpdGggdGhlIHJlc3QuXG4gICAqXG4gICAqIFdoYXQgaXMgZGVsaWJlcmF0ZWx5IEtFUFQ6IGBkZWJ1Z2AgKGxvZ3MsIG1ldHJpY3MsIGVycm9ycywgZmxvdyBtZXNzYWdlcylcbiAgICogYW5kIHRoZSBhdHRlbXB0IHJlY29yZHMgKDEwLjEpLiBCb3RoIGFyZSB0aGUgYXBwZW5kLW9ubHkgcmVjb3JkIG9mIHdoYXRcbiAgICogZXZlcnkgYXR0ZW1wdCBkaWQsIGFuZCB0aGUgcmV0cnkgZmVhdHVyZSdzIHdob2xlIHBvaW50IGlzIHRoYXQgdGhlIGVhcmxpZXJcbiAgICogYXR0ZW1wdHMgc3RheSB2aXNpYmxlLlxuICAgKlxuICAgKiBObyBjb21taXQgaXMgcmVjb3JkZWQgYW5kIG5vIG9ic2VydmVyIGZpcmVzIOKAlCBhIGRpc2NhcmRlZCBhdHRlbXB0IGlzIG5vdCBhXG4gICAqIGN1cnNvciBzdG9wLCBiZWNhdXNlIGZyb20gc2hhcmVkIHN0YXRlJ3MgcG9pbnQgb2YgdmlldyBpdCBuZXZlciBoYXBwZW5lZC5cbiAgICovXG4gIGRpc2NhcmRTdGFnZWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWNvcmQuZGlzY2FyZCgpO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGVuZGluZ1dyaXRlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zdGFnZVdyaXRlcyA9IHt9O1xuICAgIHRoaXMuX3N0YWdlUmVhZHMgPSB7fTtcbiAgICB0aGlzLl9uZXN0ZWRSZWFkcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl92aWV3UmVhZHMgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIAgQXR0ZW1wdHMgKDEwLjEpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBBcHBlbmQgb25lIGF0dGVtcHQncyByZWNvcmQg4oCUIHRoZSBhdHRlbXB0IHJ1bm5lciBjYWxscyB0aGlzIGFzIGVhY2ggYXR0ZW1wdCBlbmRzLiAqL1xuICByZWNvcmRBdHRlbXB0KHJlY29yZDogQXR0ZW1wdFJlY29yZCk6IHZvaWQge1xuICAgICh0aGlzLl9hdHRlbXB0cyA/Pz0gW10pLnB1c2gocmVjb3JkKTtcbiAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKCkgPT4gdGhpcy5jYXB0dXJlPy5saW1pdCgnYXR0ZW50aW9uLW9taXR0ZWQnKSkpLnJlY29yZEF0dGVtcHQoXG4gICAgICByZWNvcmQsXG4gICAgICB0aGlzLnJ1bnRpbWVTdGFnZUlkLFxuICAgICk7XG4gICAgdGhpcy5ub3RlQXR0ZW1wdChyZWNvcmQpO1xuICAgIC8vIFRoZSBzdGFnZSBhdHRlbXB0IGlzIG92ZXIsIGhvd2V2ZXIgaXQgZW5kZWQ6IHRoZSBjYWxscyBpdCBtYWRlIHN0b3AgKFAyKS5cbiAgICB0aGlzLmVuZENhbGxzKHJlY29yZC5hdHRlbXB0KTtcbiAgfVxuXG4gIC8qKiBTdGFtcCB0aGUgc2VyaWVzJyBzdW1tYXJ5IOKAlCBvbmNlLCB3aGVuIHRoZSBydW5uZXIgZW5kcyB0aGUgc2VyaWVzLiAqL1xuICBlbmRBdHRlbXB0cyhzdW1tYXJ5OiBBdHRlbXB0U3VtbWFyeSk6IHZvaWQge1xuICAgIHRoaXMuX2F0dGVtcHRTdW1tYXJ5ID0gc3VtbWFyeTtcbiAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKCkgPT4gdGhpcy5jYXB0dXJlPy5saW1pdCgnYXR0ZW50aW9uLW9taXR0ZWQnKSkpLnJlY29yZFN1bW1hcnkoc3VtbWFyeSk7XG4gIH1cblxuICAvKiogUmVzZXQgb25seSBhdCB0aGUgbm9kZSdzIGV4ZWN1dGlvbiBzdGFtcCwgbmV2ZXIgYmV0d2VlbiBhdHRlbXB0cy4gKi9cbiAgYmVnaW5BdHRlbnRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fYXR0ZW50aW9uPy5iZWdpbigpO1xuICB9XG5cbiAgLyoqIERlbGVnYXRlIHRoZSBleHBsaWNpdCByZXRhaW5lZC1lcnJvciBmYWN0OyBhdHRlbnRpb24gb3ducyB2YWxpZGF0aW9uIG9mIGl0cyBwcm9vZi4gKi9cbiAgbWFya1N0YWdlRmFpbHVyZSgpOiB2b2lkIHtcbiAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKCkgPT4gdGhpcy5jYXB0dXJlPy5saW1pdCgnYXR0ZW50aW9uLW9taXR0ZWQnKSkpLnN0YWdlRmFpbGVkKFxuICAgICAgdGhpcy5kZWJ1Zy5lcnJvckNvbnRleHQsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3Jhc2gtc2FmZSByZWNvcmQgKDEwLjEsIFA2KTogYW4gYXR0ZW1wdCB0aGF0IGVuZGVkIGlzIG5vdGVkIGluIHRoZSBydW4ncyBzaW5rIEFUIE9OQ0UsIGJlc2lkZSB0aGlzIGZyYW1lJ3NcbiAgICogbG9nIOKAlCBzbyBhIHByb2Nlc3Mga2lsbGVkIGJlZm9yZSB0aGUgc3RhZ2UgY29tbWl0cyAobWlkLXJldHJ5KSBzdGlsbCBsZWF2ZXMgZXZlcnkgYXR0ZW1wdCB0aGF0IGVuZGVkLiBUaGVcbiAgICogcmVjb3JkIGlzIHRoZSBvbmUgdGhlIHRyZWUga2VlcHM6IGZyb3plbiwgYHN0cnVjdHVyZWRDbG9uZWAtc2FmZSwgaXRzIGVycm9yIHRoZSBTRVJWRUQgZm9ybSAobm8gYHJhd2ApLCBzbyB0aGVcbiAgICogbm90ZSBuZWVkcyBubyBzZWNvbmQgcmVkYWN0aW9uIHBhc3MuIFdpdGhvdXQgYSBzaW5rIHRoZSBsb2cgZG9lcyBub3RoaW5nIChgRXZlbnRMb2cgwrcgbm90ZWApLlxuICAgKi9cbiAgcHJpdmF0ZSBub3RlQXR0ZW1wdChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQpOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZC5sb2c/Lm5vdGUoJ2F0dGVtcHQnLCB7IHJlY29yZCB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgYXR0ZW1wdHMgb2YgdGhpcyBleGVjdXRpb24gc28gZmFyLCBpbiBvcmRlciDigJQgaXRzIG93biBhbmQgaXRzIGNhbGxzJzsgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZS4gKi9cbiAgZ2V0IGF0dGVtcHRzKCk6IHJlYWRvbmx5IEF0dGVtcHRSZWNvcmRbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dGVtcHRzO1xuICB9XG5cbiAgLyoqIFRoZSBlbmRlZCBzZXJpZXMnIHN1bW1hcnk7IGB1bmRlZmluZWRgIHdoaWxlIGl0IHJ1bnMgYW5kIHdpdGhvdXQgYSBwb2xpY3kuICovXG4gIGdldCBhdHRlbXB0U3VtbWFyeSgpOiBBdHRlbXB0U3VtbWFyeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dGVtcHRTdW1tYXJ5O1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0IGFib3V0IHRvIHJ1biAoYW5kIHRoZSBydW4ncyBzaWduYWwpIOKAlCBgU3RhZ2VSdW5uZXJgIHNldHMgYm90aCBiZWZvcmUgaXQgYnVpbGRzIHRoZSBzY29wZS4gKi9cbiAgdXNlQXR0ZW1wdChhdHRlbXB0OiBBdHRlbXB0Q29udGV4dCB8IHVuZGVmaW5lZCwgcnVuU2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIC8vIFNjb3BlIHByZXBhcmF0aW9uIGNhbiByZWFkIG9yIHRocm93IGJlZm9yZSB0aGUgZnVuY3Rpb24gaXMgZW50ZXJlZC4gT25seSB0aGUgYWN0dWFsLWVudHJ5XG4gICAgLy8gZnVubmVsIG1heSBncmFudCBzb3VyY2UgaWRlbnRpdHk7IHRoZSByZWFsIHJldHJ5IGNvbnRleHQgc3RpbGwgYmVsb25ncyB0byB0aGUgc2NvcGUuXG4gICAgdGhpcy5zb3VyY2VBdHRlbXB0ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2F0dGVtcHQgPSBhdHRlbXB0O1xuICAgIHRoaXMuX3J1blNpZ25hbCA9IHJ1blNpZ25hbDtcbiAgfVxuXG4gIC8qKiBOYXRpdmUgZnVuY3Rpb24tZW50cnkgZmFjdCwgaW5jbHVkaW5nIHRoZSBkaXJlY3Qgb25lLWNhbGwgcGF0aCB3aXRoIG5vIHJldHJ5IHJ1bm5lci4gKi9cbiAgYmVnaW5Tb3VyY2VJbnZvY2F0aW9uKGF0dGVtcHQ6IEF0dGVtcHRDb250ZXh0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlYWRTb3VyY2VzPy5hY3RpdmUgfHwgIXRoaXMuI2ZhaWx1cmVJZGVudGl0eSkgcmV0dXJuO1xuICAgIHRoaXMuc291cmNlSW52b2NhdGlvbnMrKztcbiAgICAvLyBUaGlzIGlzIHRoZSBlbmdpbmUgb2JzZXJ2aW5nIHRoZSBjYWxsIGl0IGlzIGFib3V0IHRvIG1ha2UsIG5vdCBhIHJlYWRlciBndWVzc2luZyBhbiBvbGQgYXR0ZW1wdC5cbiAgICB0aGlzLnNvdXJjZUF0dGVtcHQgPSB0aGlzLnJlYWRTb3VyY2VzLm93bmVyc2hpcD8uYXR0ZW1wdChcbiAgICAgIHRoaXMuI2ZhaWx1cmVJZGVudGl0eS5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIGF0dGVtcHQ/LmF0dGVtcHQgPz8gMSxcbiAgICApO1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0IG5vdyBydW5uaW5nOyBgdW5kZWZpbmVkYCBmb3IgYSBzdGFnZSB0aGUgYXR0ZW1wdCBydW5uZXIgZG9lcyBub3QgcnVuLiAqL1xuICBnZXQgYXR0ZW1wdCgpOiBBdHRlbXB0Q29udGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dGVtcHQ7XG4gIH1cblxuICAvKiogVGhlIHJ1bidzIHNpZ25hbCwgYXMgYFN0YWdlUnVubmVyYCBsYXN0IHNhdyBpdC4gKi9cbiAgZ2V0IHJ1blNpZ25hbCgpOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3J1blNpZ25hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0IGBhdHRlbXB0YCBlbmRlZCB3aXRob3V0IGFuIGFuc3dlcjogZnJvbSBub3cgb24gaXRzIHNjb3BlIGlzIGZlbmNlZCDigJQgYSB3cml0ZSwgYW4gZW1pdCBvciBhIHJlYWRcbiAgICogdGhyb3VnaCBpdCBpcyByZWZ1c2VkIChgU2NvcGVGYWNhZGVgKS4gVGhlIHJ1bm5lciBjYWxscyB0aGlzIHRoZSBtb21lbnQgdGhlIGF0dGVtcHQncyBzaWduYWwgYWJvcnRzLlxuICAgKi9cbiAgZW5kQXR0ZW1wdChhdHRlbXB0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fYXR0ZW1wdD8uYXR0ZW1wdCA9PT0gYXR0ZW1wdCkgdGhpcy5zb3VyY2VBdHRlbXB0ID0gdW5kZWZpbmVkO1xuICAgIGlmIChhdHRlbXB0ID4gdGhpcy5fZW5kZWRUaHJvdWdoKSB0aGlzLl9lbmRlZFRocm91Z2ggPSBhdHRlbXB0O1xuICAgIC8vIEl0cyBjYWxscyBzdG9wIGF0IHRoZSBzYW1lIG1vbWVudCwgd2l0aCB0aGUgYXR0ZW1wdCdzIG93biByZWFzb24gd2hlbiBpdHMgc2lnbmFsIGFib3J0ZWQgKGEgY2FwIG9yIHRoZVxuICAgIC8vIGRlYWRsaW5lIGlzIGEgdGltZSBsaW1pdDogYSBjYWxsIGl0IGN1dHMgdGltZWQgb3V0KSDigJQgc3luY2hyb25vdXMsIGFoZWFkIG9mIHRoZSBjYWxscycgb3duIGxpc3RlbmVycy5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fYXR0ZW1wdDtcbiAgICBjb25zdCBzaWduYWwgPSBjdXJyZW50ICE9PSB1bmRlZmluZWQgJiYgY3VycmVudC5hdHRlbXB0ID09PSBhdHRlbXB0ID8gY3VycmVudC5zaWduYWwgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbmRDYWxscyhhdHRlbXB0LCBzaWduYWw/LmFib3J0ZWQgPyBzaWduYWwucmVhc29uIDogdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGF0dGVtcHQgYGF0dGVtcHRgIGhhcyBlbmRlZCDigJQgaXRzIHNjb3BlIG1heSBubyBsb25nZXIgdG91Y2ggdGhlIHN0YWdlLiAqL1xuICBoYXNBdHRlbXB0RW5kZWQoYXR0ZW1wdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGF0dGVtcHQgPD0gdGhpcy5fZW5kZWRUaHJvdWdoO1xuICB9XG5cbiAgLyoqIFJlY29yZCBhIHdyaXRlIGFuIGVuZGVkIGF0dGVtcHQgdHJpZWQg4oCUIGEgbmFtZSwgbmV2ZXIgdGhlIHZhbHVlLiBBcHBlbmQtb25seSBldmlkZW5jZSBsaWtlIHRoZSBhdHRlbXB0cy4gKi9cbiAgcmVjb3JkTGF0ZVdyaXRlKHdyaXRlOiBMYXRlV3JpdGUpOiB2b2lkIHtcbiAgICBjb25zdCB3cml0ZXMgPSAodGhpcy5fbGF0ZVdyaXRlcyA/Pz0gW10pO1xuICAgIC8vIEJvdW5kZWQ6IHRoZSBmaXJzdCBvbmVzIHNheSB3aGF0IHRoZSBhYmFuZG9uZWQgYXR0ZW1wdCBrZXB0IGRvaW5nOyBhIGxvb3Agb2YgdGhlbSBhZGRzIG5vdGhpbmcuXG4gICAgaWYgKHdyaXRlcy5sZW5ndGggPCBNQVhfTEFURV9XUklURVMpIHdyaXRlcy5wdXNoKE9iamVjdC5mcmVlemUoeyAuLi53cml0ZSB9KSk7XG4gIH1cblxuICAvLyDilIDilIAgU2lkZSBlZmZlY3RzIChQMykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIFRoaXMgZXhlY3V0aW9uJ3Mgb3duIGlkZW1wb3RlbmN5IGtleSBtYXkgYmUgbWFkZSBvZiBhIHNlbGVjdGVkIHZhbHVlIChvciB3YXMgY2FycmllZCBieSBhIGNoZWNrcG9pbnQpLiAqL1xuICBwcml2YXRlIF9lZmZlY3RLZXlUYWludGVkID0gZmFsc2U7XG4gIC8qKiBBIHRvdWNoaW5nIGAkY2FsbGAgd2l0aCBOTyBrZXkgc3RhcnRlZCBpbiB0aGlzIGV4ZWN1dGlvbiDigJQgdGhlIHN0YWdlIG1heSBub3QgYmUgcmUtcnVuIGJ5IGEgcmVzdW1lLiAqL1xuICBwcml2YXRlIF9rZXlsZXNzRWZmZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGFuIGV4ZWN1dGlvbidzIHNpZGUtZWZmZWN0IGJvb2trZWVwaW5nIChgRmxvd2NoYXJ0VHJhdmVyc2VyIMK3IGV4ZWN1dGVTdGFnZWAsIGJlZm9yZSBhdHRlbXB0IDEpIOKAlCByZXNldCxcbiAgICogYmVjYXVzZSBhIGZyYW1lIGNhbiBiZSByZS11c2VkIGJ5IGEgbGF0ZXIgZXhlY3V0aW9uLiBga2V5VGFpbnRlZGA6IHRoZSBzdGFnZSdzIG93biBrZXkgbWF5IGJlIG1hZGUgb2YgYSBzZWxlY3RlZFxuICAgKiB2YWx1ZSwgc28gYSBrZXkgYSBgJGNhbGxgIHBhc3NlcyBvbiAoYCRhdHRlbXB0KCkuaWRlbXBvdGVuY3lLZXlgKSBpcyBzZXJ2ZWQgdGhlIHNhbWUgd2F5LlxuICAgKi9cbiAgYmVnaW5FZmZlY3RzKGtleVRhaW50ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9lZmZlY3RLZXlUYWludGVkID0ga2V5VGFpbnRlZDtcbiAgICB0aGlzLl9rZXlsZXNzRWZmZWN0ID0gZmFsc2U7XG4gIH1cblxuICBnZXQgZWZmZWN0S2V5VGFpbnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZWZmZWN0S2V5VGFpbnRlZDtcbiAgfVxuXG4gIC8qKiBBIGtleWxlc3MgdG91Y2hpbmcgYCRjYWxsYCBzdGFydGVkOiBhbiBgaW50ZXJydXB0KClgIGFmdGVyIGl0IHdvdWxkIHJlLXNlbmQgaXQgb24gcmVzdW1lIChgU3RhZ2VSdW5uZXJgKS4gKi9cbiAgbWFya0tleWxlc3NFZmZlY3QoKTogdm9pZCB7XG4gICAgdGhpcy5fa2V5bGVzc0VmZmVjdCA9IHRydWU7XG4gIH1cblxuICBnZXQgaGFzS2V5bGVzc0VmZmVjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fa2V5bGVzc0VmZmVjdDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDYWxscyBtYWRlIGluc2lkZSB0aGUgc3RhZ2UgKFAyKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogV2hlcmUgdGhpcyBleGVjdXRpb24ncyBjYWxsIHJlY29yZHMgYXJlIHJlcG9ydGVkIOKAlCB0aGUgZW5naW5lIHNldHMgaXQgYmVmb3JlIHRoZSBzdGFnZSBydW5zLiAqL1xuICB1c2VBdHRlbXB0UmVwb3J0ZXIoXG4gICAgcmVwb3J0OiAoKHJlY29yZDogQXR0ZW1wdFJlY29yZCwgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHwgdW5kZWZpbmVkKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5fYXR0ZW1wdFJlcG9ydGVyID0gcmVwb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaWduYWwgdGhlIGNhbGxzIG9mIHN0YWdlIGF0dGVtcHQgYHN0YWdlQXR0ZW1wdGAgcnVuIHVuZGVyIGJlc2lkZXMgaXRzIG93biAoUDIpOiBhYm9ydGVkIHdoZW4gdGhhdCBhdHRlbXB0IGlzXG4gICAqIG92ZXIg4oCUIGhvd2V2ZXIgaXQgZW5kZWQg4oCUIGFuZCB3aGVuIHRoZSBmcmFtZSBjb21taXRzLCBzbyBubyBjYWxsIG91dGxpdmVzIHRoZSBhdHRlbXB0IHRoYXQgbWFkZSBpdCAobm9cbiAgICogYmFja2dyb3VuZCByZXRyeSwgbm8gd2FpdCwgbm8gbGlzdGVuZXIgbGVmdCBvbiB0aGUgcnVuJ3Mgc2lnbmFsKS4gQWxyZWFkeSBhYm9ydGVkIGFmdGVyIHRoZSBjb21taXQuXG4gICAqL1xuICBjYWxsc0VuZGVkU2lnbmFsKHN0YWdlQXR0ZW1wdDogbnVtYmVyKTogQWJvcnRTaWduYWwge1xuICAgIGNvbnN0IGVuZGVkID0gKHRoaXMuX2NhbGxzRW5kZWQgPz89IG5ldyBNYXAoKSk7XG4gICAgbGV0IGNvbnRyb2xsZXIgPSBlbmRlZC5nZXQoc3RhZ2VBdHRlbXB0KTtcbiAgICBpZiAoY29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgZW5kZWQuc2V0KHN0YWdlQXR0ZW1wdCwgY29udHJvbGxlcik7XG4gICAgICBpZiAodGhpcy5fY29tbWl0dGVkKSBjb250cm9sbGVyLmFib3J0KGNhbGxzRW5kZWRSZWFzb24oKSk7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyLnNpZ25hbDtcbiAgfVxuXG4gIC8qKiBFbmQgdGhlIGNhbGxzIG9mIGBzdGFnZUF0dGVtcHRgIChldmVyeSBhdHRlbXB0J3Mgd2hlbiBgdW5kZWZpbmVkYCkg4oCUIGByZWFzb25gIHdoZW4gdGhlIGF0dGVtcHQncyBzaWduYWwgZ2F2ZSBvbmUuICovXG4gIHByaXZhdGUgZW5kQ2FsbHMoc3RhZ2VBdHRlbXB0OiBudW1iZXIgfCB1bmRlZmluZWQsIHJlYXNvbj86IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fY2FsbHNFbmRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBbYXR0ZW1wdCwgY29udHJvbGxlcl0gb2YgdGhpcy5fY2FsbHNFbmRlZCkge1xuICAgICAgaWYgKHN0YWdlQXR0ZW1wdCAhPT0gdW5kZWZpbmVkICYmIGF0dGVtcHQgIT09IHN0YWdlQXR0ZW1wdCkgY29udGludWU7XG4gICAgICBpZiAoIWNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGNvbnRyb2xsZXIuYWJvcnQocmVhc29uID8/IGNhbGxzRW5kZWRSZWFzb24oKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBuZXh0IGNhbGwncyBvcmRpbmFsIHdpdGhpbiBzdGFnZSBhdHRlbXB0IGBzdGFnZUF0dGVtcHRgLCAxLWJhc2VkIChgYXR0ZW1wdC9jYWxsLnRzIMK3IGNhbGxTZXJpZXNgKS4gKi9cbiAgbmV4dENhbGxPcmRpbmFsKHN0YWdlQXR0ZW1wdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBvcmRpbmFscyA9ICh0aGlzLl9jYWxsT3JkaW5hbHMgPz89IG5ldyBNYXAoKSk7XG4gICAgY29uc3QgbmV4dCA9IChvcmRpbmFscy5nZXQoc3RhZ2VBdHRlbXB0KSA/PyAwKSArIDE7XG4gICAgb3JkaW5hbHMuc2V0KHN0YWdlQXR0ZW1wdCwgbmV4dCk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBjYWxsJ3MgKG9yIGFuIG9ic2VydmVkKSBhdHRlbXB0IHJlY29yZDoga2VwdCBiZXNpZGUgdGhlIHN0YWdlJ3Mgb3duIGF0dGVtcHRzIOKAlCB0aGUgZmlyc3RcbiAgICoge0BsaW5rIE1BWF9DQUxMX1JFQ09SRFN9LCB0aGUgcmVzdCBjb3VudGVkIOKAlCBhbmQgcmVwb3J0ZWQgdG8gdGhlIHJ1bidzIGBvbkF0dGVtcHRgIGVpdGhlciB3YXkuIExpa2UgdGhlIHN0YWdlJ3NcbiAgICogcmVjb3JkcywgTk9UIGNsZWFyZWQgYnkge0BsaW5rIGRpc2NhcmRTdGFnZWR9OiBhIGZhaWxlZCBhdHRlbXB0J3MgY2FsbHMgYXJlIGV2aWRlbmNlIHRvby5cbiAgICovXG4gIHJlcG9ydENhbGxBdHRlbXB0KHJlY29yZDogQXR0ZW1wdFJlY29yZCwgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2NhbGxSZWNvcmRzIDwgTUFYX0NBTExfUkVDT1JEUykge1xuICAgICAgdGhpcy5fY2FsbFJlY29yZHMgKz0gMTtcbiAgICAgICh0aGlzLl9hdHRlbXB0cyA/Pz0gW10pLnB1c2gocmVjb3JkKTtcbiAgICAgICh0aGlzLl9hdHRlbnRpb24gPz89IG5ldyBTdGFnZUF0dGVudGlvbigoKSA9PiB0aGlzLmNhcHR1cmU/LmxpbWl0KCdhdHRlbnRpb24tb21pdHRlZCcpKSkucmVjb3JkQXR0ZW1wdChcbiAgICAgICAgcmVjb3JkLFxuICAgICAgICB0aGlzLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgKTtcbiAgICAgIHRoaXMubm90ZUF0dGVtcHQocmVjb3JkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fYXR0ZW1wdHNEcm9wcGVkICs9IDE7XG4gICAgICAodGhpcy5fYXR0ZW50aW9uID8/PSBuZXcgU3RhZ2VBdHRlbnRpb24oKCkgPT4gdGhpcy5jYXB0dXJlPy5saW1pdCgnYXR0ZW50aW9uLW9taXR0ZWQnKSkpLmF0dGVtcHREcm9wcGVkKCk7XG4gICAgfVxuICAgIHRoaXMuX2F0dGVtcHRSZXBvcnRlcj8uKHJlY29yZCwgc3RydWN0dXJlZEVycm9yKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBUcmVlIG5hdmlnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIENyZWF0ZSAob3IgcmV0dXJuKSB0aGlzIGNvbnRleHQncyBsaW5rZWQgc3VjY2Vzc29yLlxuICAgKlxuICAgKiBNRU1PSVpFRDogdGhlIGZpcnN0IGNhbGwgY3JlYXRlcyBgdGhpcy5uZXh0YDsgZXZlcnkgbGF0ZXIgY2FsbCByZXR1cm5zXG4gICAqIHRoYXQgU0FNRSBjb250ZXh0IGFuZCBJR05PUkVTIGl0cyBhcmd1bWVudHMuIEluIG5vcm1hbCB0cmF2ZXJzYWwgZWFjaFxuICAgKiBjb250ZXh0IGFkdmFuY2VzIGV4YWN0bHkgb25jZSwgc28gdGhlIG1lbW8gbmV2ZXIgYml0ZXMg4oCUIGJ1dCBhIGNhbGxlclxuICAgKiBleHBlY3RpbmcgYSBmcmVzaCBjb250ZXh0IGZvciBkaWZmZXJlbnQgYHN0YWdlTmFtZWAvYHN0YWdlSWRgIGFyZ3MgZ2V0c1xuICAgKiB0aGUgb2xkIG9uZSBzaWxlbnRseS4gRGV2IG1vZGUgKGBlbmFibGVEZXZNb2RlKClgKSB3YXJucyBvbiB0aGF0XG4gICAqIG1pc21hdGNoIChiYWNrbG9nIEI0KS5cbiAgICovXG4gIGNyZWF0ZU5leHQocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nLCBpc0RlY2lkZXIgPSBmYWxzZSk6IFN0YWdlQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLm5leHQpIHtcbiAgICAgIHRoaXMubmV4dCA9IG5ldyBTdGFnZUNvbnRleHQocGF0aCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0aGlzLnJlY29yZC5zdGF0ZSwgJycsIHRoaXMucmVjb3JkLmxvZywgaXNEZWNpZGVyKTtcbiAgICAgIHRoaXMubmV4dC5wYXJlbnQgPSB0aGlzO1xuICAgICAgdGhpcy5uZXh0LmluaGVyaXRSdW4odGhpcyk7XG4gICAgICB0aGlzLm5leHQuZmFpbHVyZVN0YXRlID0gdGhpcy5mYWlsdXJlU3RhdGU7XG4gICAgfSBlbHNlIGlmIChpc0Rldk1vZGUoKSAmJiAodGhpcy5uZXh0LnN0YWdlSWQgIT09IHN0YWdlSWQgfHwgdGhpcy5uZXh0LnN0YWdlTmFtZSAhPT0gc3RhZ2VOYW1lKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtmb290cHJpbnRdIFN0YWdlQ29udGV4dC5jcmVhdGVOZXh0OiBuZXh0IGNvbnRleHQgYWxyZWFkeSBleGlzdHMgYXMgXCIke3RoaXMubmV4dC5zdGFnZU5hbWV9XCIgYCArXG4gICAgICAgICAgYChpZDogXCIke3RoaXMubmV4dC5zdGFnZUlkfVwiKSDigJQgYXJndW1lbnRzIFwiJHtzdGFnZU5hbWV9XCIgKGlkOiBcIiR7c3RhZ2VJZH1cIikgYXJlIGlnbm9yZWQgYCArXG4gICAgICAgICAgJ2FuZCB0aGUgZXhpc3RpbmcgY29udGV4dCBpcyByZXR1cm5lZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubmV4dDtcbiAgfVxuXG4gIGNyZWF0ZUNoaWxkKHJ1bklkOiBzdHJpbmcsIGJyYW5jaElkOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB9XG4gICAgY29uc3QgY2hpbGQgPSBuZXcgU3RhZ2VDb250ZXh0KHJ1bklkLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMucmVjb3JkLnN0YXRlLCBicmFuY2hJZCwgdGhpcy5yZWNvcmQubG9nLCBpc0RlY2lkZXIpO1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgY2hpbGQuaW5oZXJpdFJ1bih0aGlzKTtcbiAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIGNyZWF0ZURlY2lkZXIocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXh0KHBhdGgsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdHJ1ZSk7XG4gIH1cblxuICBzZXRBc0RlY2lkZXIoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRGVjaWRlciA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBc0ZvcmsoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRm9yayA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgRGlhZ25vc3RpY3MgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQGludGVybmFsIFJldGFpbmVkIGluY29taW5nIHZhbHVlIGZvciB0aGUgZmFjYWRlJ3MgbGVnYWN5IGVtaXQgY2hhbm5lbC4gKi9cbiAgYWRkRGlhZ25vc3RpYyhjaGFubmVsOiBEaWFnbm9zdGljQ2hhbm5lbCwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5kZWJ1Zy5hZGQoY2hhbm5lbCwga2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldExvZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0TG9nKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkTWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRNZXRyaWMoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldE1ldHJpYyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEV2YWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEV2YWwoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRXJyb3Ioa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEVycm9yKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRmxvd0RlYnVnTWVzc2FnZShcbiAgICB0eXBlOiBGbG93Q29udHJvbFR5cGUsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyB0YXJnZXRTdGFnZT86IHN0cmluZyB8IHN0cmluZ1tdOyByYXRpb25hbGU/OiBzdHJpbmc7IGNvdW50PzogbnVtYmVyOyBpdGVyYXRpb24/OiBudW1iZXIgfSxcbiAgKSB7XG4gICAgY29uc3QgZmxvd01lc3NhZ2U6IEZsb3dNZXNzYWdlID0geyB0eXBlLCBkZXNjcmlwdGlvbiwgdGltZXN0YW1wOiBEYXRlLm5vdygpLCAuLi5vcHRpb25zIH07XG4gICAgdGhpcy5kZWJ1Zy5hZGRGbG93TWVzc2FnZShmbG93TWVzc2FnZSk7XG4gIH1cblxuICAvLyDilIDilIAgU25hcHNob3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0U3RhZ2VJZCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5ydW5JZCB8fCB0aGlzLnJ1bklkID09PSAnJykgcmV0dXJuIHRoaXMuc3RhZ2VOYW1lO1xuICAgIHJldHVybiBgJHt0aGlzLnJ1bklkfS4ke3RoaXMuc3RhZ2VOYW1lfWA7XG4gIH1cblxuICBnZXRTbmFwc2hvdCgpOiBTdGFnZVNuYXBzaG90IHtcbiAgICAvLyBJdGVyYXRpdmUgd2FsayAoZXhwbGljaXQgd29yayBzdGFjayksIE5PVCByZWN1cnNpb246IHRoZSBleGVjdXRpb25cbiAgICAvLyB0cmVlIGRlZXBlbnMgYnkgb25lIGxldmVsIHBlciBleGVjdXRlZCBzdGFnZSBhbG9uZyBgbmV4dGAgY2hhaW5zLCBhbmRcbiAgICAvLyB0aGUgdHJhbXBvbGluZWQgdHJhdmVyc2VyIGFsbG93cyBjaGFpbnMvbG9vcHMgb2YgdGVucyBvZiB0aG91c2FuZHMgb2ZcbiAgICAvLyBzdGFnZXMg4oCUIGZhciBkZWVwZXIgdGhhbiBhIHJlY3Vyc2l2ZSBzZXJpYWxpemVyIGNhbiB3YWxrIGJlZm9yZVxuICAgIC8vIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgICBjb25zdCByb290ID0gdGhpcy5zbmFwc2hvdFNlbGYoKTtcbiAgICBjb25zdCB3b3JrOiBBcnJheTx7IGN0eDogU3RhZ2VDb250ZXh0OyBzbmFwOiBTdGFnZVNuYXBzaG90IH0+ID0gW3sgY3R4OiB0aGlzLCBzbmFwOiByb290IH1dO1xuICAgIHdoaWxlICh3b3JrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgY3R4LCBzbmFwIH0gPSB3b3JrLnBvcCgpITtcbiAgICAgIGlmIChjdHgubmV4dCkge1xuICAgICAgICBjb25zdCBuZXh0U25hcCA9IGN0eC5uZXh0LnNuYXBzaG90U2VsZigpO1xuICAgICAgICBzbmFwLm5leHQgPSBuZXh0U25hcDtcbiAgICAgICAgd29yay5wdXNoKHsgY3R4OiBjdHgubmV4dCwgc25hcDogbmV4dFNuYXAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY3R4LmNoaWxkcmVuKSB7XG4gICAgICAgIHNuYXAuY2hpbGRyZW4gPSBjdHguY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoaWxkU25hcCA9IGNoaWxkLnNuYXBzaG90U2VsZigpO1xuICAgICAgICAgIHdvcmsucHVzaCh7IGN0eDogY2hpbGQsIHNuYXA6IGNoaWxkU25hcCB9KTtcbiAgICAgICAgICByZXR1cm4gY2hpbGRTbmFwO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKiogU25hcHNob3Qgb2YgVEhJUyBjb250ZXh0J3Mgb3duIGZpZWxkcyDigJQgYG5leHRgL2BjaGlsZHJlbmAgYXJlIGZpbGxlZFxuICAgKiAgaW4gYnkgdGhlIGl0ZXJhdGl2ZSB3YWxrIGluIGBnZXRTbmFwc2hvdGAuICovXG4gIHByaXZhdGUgc25hcHNob3RTZWxmKCk6IFN0YWdlU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90OiBTdGFnZVNuYXBzaG90ID0ge1xuICAgICAgaWQ6IHRoaXMuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLnJ1bnRpbWVTdGFnZUlkIHx8IHVuZGVmaW5lZCxcbiAgICAgIG5hbWU6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgaXNEZWNpZGVyOiB0aGlzLmlzRGVjaWRlcixcbiAgICAgIGlzRm9yazogdGhpcy5pc0ZvcmssXG4gICAgICBsb2dzOiB0aGlzLmRlYnVnLmxvZ0NvbnRleHQsXG4gICAgICBlcnJvcnM6IHRoaXMuZGVidWcuZXJyb3JDb250ZXh0LFxuICAgICAgbWV0cmljczogdGhpcy5kZWJ1Zy5tZXRyaWNDb250ZXh0LFxuICAgICAgZXZhbHM6IHRoaXMuZGVidWcuZXZhbENvbnRleHQsXG4gICAgfTtcbiAgICBpZiAodGhpcy5yZWFkU291cmNlcz8ub2JzZXJ2aW5nKSB7XG4gICAgICBzbmFwc2hvdC5yZWFkU291cmNlQ291bnRzID0gdGhpcy5zb3VyY2VSZWFkQ291bnRlcj8uc25hcHNob3QoKSA/PyBFTVBUWV9TT1VSQ0VfUkVBRF9DT1VOVFM7XG4gICAgICBzbmFwc2hvdC5yZWFkU291cmNlSW52b2NhdGlvbnMgPSB0aGlzLnNvdXJjZUludm9jYXRpb25zO1xuICAgIH1cbiAgICBjb25zdCBzdGFnZVdyaXRlcyA9IHRoaXMucmV0YWluZWRXcml0ZXMoKTtcbiAgICBpZiAoT2JqZWN0LmtleXMoc3RhZ2VXcml0ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEV4dHJhY3QgdmFsdWVzIG9ubHkgZm9yIHRoZSBzbmFwc2hvdCAoc3RyaXAgb3BlcmF0aW9uIG1ldGFkYXRhKVxuICAgICAgY29uc3Qgd3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaywgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHN0YWdlV3JpdGVzKSkge1xuICAgICAgICB3cml0ZXNba10gPSBlbnRyeS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHNuYXBzaG90LnN0YWdlV3JpdGVzID0gd3JpdGVzO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fc3RhZ2VSZWFkcykubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3Quc3RhZ2VSZWFkcyA9IHRoaXMuX3N0YWdlUmVhZHM7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICBzbmFwc2hvdC5kZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLnN1YmZsb3dJZCkge1xuICAgICAgc25hcHNob3Quc3ViZmxvd0lkID0gdGhpcy5zdWJmbG93SWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlYnVnLmZsb3dNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5mbG93TWVzc2FnZXMgPSB0aGlzLmRlYnVnLmZsb3dNZXNzYWdlcztcbiAgICB9XG4gICAgLy8gQSBjb3B5IG9mIHRoZSBsaXN0ICh0aGUgcmVjb3JkcyB0aGVtc2VsdmVzIGFyZSBmcm96ZW4pOiBhIHJlYWRlciBvZiBvbmUgc25hcHNob3QgbmV2ZXIgc2VlcyBhIGxhdGVyXG4gICAgLy8gYXR0ZW1wdCBhcnJpdmUgaW4gaXQsIGFuZCBuZXZlciBlZGl0cyB0aGUgZnJhbWUncyBvd24gbGlzdC5cbiAgICBpZiAodGhpcy5fYXR0ZW1wdHMpIHNuYXBzaG90LmF0dGVtcHRzID0gT2JqZWN0LmZyZWV6ZShbLi4udGhpcy5fYXR0ZW1wdHNdKTtcbiAgICBpZiAodGhpcy5fYXR0ZW1wdFN1bW1hcnkpIHNuYXBzaG90LmF0dGVtcHRTdW1tYXJ5ID0gdGhpcy5fYXR0ZW1wdFN1bW1hcnk7XG4gICAgaWYgKHRoaXMuX2xhdGVXcml0ZXMpIHNuYXBzaG90LmxhdGVXcml0ZXMgPSBPYmplY3QuZnJlZXplKFsuLi50aGlzLl9sYXRlV3JpdGVzXSk7XG4gICAgaWYgKHRoaXMuX2F0dGVtcHRzRHJvcHBlZCA+IDApIHNuYXBzaG90LmF0dGVtcHRzRHJvcHBlZCA9IHRoaXMuX2F0dGVtcHRzRHJvcHBlZDtcbiAgICBjb25zdCBhdHRlbnRpb24gPSB0aGlzLl9hdHRlbnRpb24/LnNuYXBzaG90KCk7XG4gICAgaWYgKGF0dGVudGlvbj8ubGVuZ3RoKSBzbmFwc2hvdC5hdHRlbnRpb24gPSBhdHRlbnRpb247XG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG59XG4iXX0=