footprintjs 9.32.0 → 9.34.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 (124) hide show
  1. package/AGENTS.md +670 -194
  2. package/dist/esm/lib/capture/freeze.d.ts +47 -0
  3. package/dist/esm/lib/capture/freeze.js +60 -0
  4. package/dist/esm/lib/capture/index.d.ts +1 -0
  5. package/dist/esm/lib/capture/index.js +2 -1
  6. package/dist/esm/lib/detach/drivers/immediate.d.ts +25 -24
  7. package/dist/esm/lib/detach/drivers/immediate.js +26 -25
  8. package/dist/esm/lib/detach/drivers/microtaskBatch.d.ts +5 -4
  9. package/dist/esm/lib/detach/drivers/microtaskBatch.js +6 -5
  10. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +27 -7
  11. package/dist/esm/lib/engine/handlers/SubflowInputMapper.d.ts +4 -1
  12. package/dist/esm/lib/engine/handlers/SubflowInputMapper.js +15 -2
  13. package/dist/esm/lib/memory/EventLog.d.ts +28 -3
  14. package/dist/esm/lib/memory/EventLog.js +31 -4
  15. package/dist/esm/lib/memory/StageContext.d.ts +20 -0
  16. package/dist/esm/lib/memory/StageContext.js +36 -10
  17. package/dist/esm/lib/memory/TransactionBuffer.d.ts +2 -2
  18. package/dist/esm/lib/memory/TransactionBuffer.js +6 -4
  19. package/dist/esm/lib/memory/backtrack.d.ts +24 -0
  20. package/dist/esm/lib/memory/backtrack.js +52 -41
  21. package/dist/esm/lib/memory/commitLogUtils.d.ts +129 -38
  22. package/dist/esm/lib/memory/commitLogUtils.js +252 -59
  23. package/dist/esm/lib/memory/deltaEncoding.d.ts +1 -1
  24. package/dist/esm/lib/memory/deltaEncoding.js +2 -2
  25. package/dist/esm/lib/memory/honesty.d.ts +5 -1
  26. package/dist/esm/lib/memory/honesty.js +11 -6
  27. package/dist/esm/lib/memory/index.d.ts +2 -2
  28. package/dist/esm/lib/memory/index.js +3 -3
  29. package/dist/esm/lib/memory/keyPaths.d.ts +125 -0
  30. package/dist/esm/lib/memory/keyPaths.js +227 -0
  31. package/dist/esm/lib/memory/logModel.d.ts +76 -0
  32. package/dist/esm/lib/memory/logModel.js +357 -0
  33. package/dist/esm/lib/memory/placeholders.d.ts +3 -3
  34. package/dist/esm/lib/memory/placeholders.js +4 -4
  35. package/dist/esm/lib/memory/redaction.d.ts +34 -1
  36. package/dist/esm/lib/memory/redaction.js +55 -4
  37. package/dist/esm/lib/memory/utils.d.ts +2 -6
  38. package/dist/esm/lib/memory/utils.js +4 -21
  39. package/dist/esm/lib/memory/verbs.d.ts +65 -22
  40. package/dist/esm/lib/memory/verbs.js +64 -23
  41. package/dist/esm/lib/runner/ExecutionRuntime.js +5 -3
  42. package/dist/esm/lib/runner/FlowChartExecutor.js +5 -5
  43. package/dist/esm/lib/scope/protection/readonlyInput.d.ts +2 -6
  44. package/dist/esm/lib/scope/protection/readonlyInput.js +4 -18
  45. package/dist/esm/lib/slice/elementProvenance.d.ts +4 -1
  46. package/dist/esm/lib/slice/elementProvenance.js +33 -15
  47. package/dist/esm/lib/slice/forwardSliceForKey.d.ts +4 -0
  48. package/dist/esm/lib/slice/forwardSliceForKey.js +32 -9
  49. package/dist/esm/lib/slice/keyIndex.d.ts +50 -8
  50. package/dist/esm/lib/slice/keyIndex.js +97 -16
  51. package/dist/esm/lib/slice/keyTimeline.js +11 -6
  52. package/dist/esm/lib/slice/serialize.js +8 -2
  53. package/dist/esm/lib/slice/sliceForKey.js +22 -6
  54. package/dist/esm/lib/slice/types.d.ts +53 -7
  55. package/dist/esm/lib/slice/types.js +1 -1
  56. package/dist/esm/lib/time-travel/commitStops.js +46 -8
  57. package/dist/esm/lib/time-travel/stateAt.js +4 -14
  58. package/dist/esm/lib/time-travel/timeTravel.js +2 -2
  59. package/dist/esm/lib/time-travel/types.d.ts +4 -3
  60. package/dist/esm/lib/time-travel/types.js +1 -1
  61. package/dist/esm/trace.d.ts +2 -1
  62. package/dist/esm/trace.js +2 -6
  63. package/dist/lib/capture/freeze.js +64 -0
  64. package/dist/lib/capture/index.js +4 -2
  65. package/dist/lib/detach/drivers/immediate.js +26 -25
  66. package/dist/lib/detach/drivers/microtaskBatch.js +6 -5
  67. package/dist/lib/engine/handlers/SubflowExecutor.js +27 -7
  68. package/dist/lib/engine/handlers/SubflowInputMapper.js +15 -2
  69. package/dist/lib/memory/EventLog.js +31 -4
  70. package/dist/lib/memory/StageContext.js +35 -9
  71. package/dist/lib/memory/TransactionBuffer.js +6 -4
  72. package/dist/lib/memory/backtrack.js +52 -41
  73. package/dist/lib/memory/commitLogUtils.js +257 -61
  74. package/dist/lib/memory/deltaEncoding.js +2 -2
  75. package/dist/lib/memory/honesty.js +11 -6
  76. package/dist/lib/memory/index.js +3 -3
  77. package/dist/lib/memory/keyPaths.js +243 -0
  78. package/dist/lib/memory/logModel.js +365 -0
  79. package/dist/lib/memory/placeholders.js +4 -4
  80. package/dist/lib/memory/redaction.js +56 -3
  81. package/dist/lib/memory/utils.js +8 -26
  82. package/dist/lib/memory/verbs.js +64 -23
  83. package/dist/lib/runner/ExecutionRuntime.js +6 -4
  84. package/dist/lib/runner/FlowChartExecutor.js +6 -6
  85. package/dist/lib/scope/protection/readonlyInput.js +6 -21
  86. package/dist/lib/slice/elementProvenance.js +32 -14
  87. package/dist/lib/slice/forwardSliceForKey.js +31 -8
  88. package/dist/lib/slice/keyIndex.js +103 -17
  89. package/dist/lib/slice/keyTimeline.js +10 -5
  90. package/dist/lib/slice/serialize.js +8 -2
  91. package/dist/lib/slice/sliceForKey.js +21 -5
  92. package/dist/lib/slice/types.js +1 -1
  93. package/dist/lib/time-travel/commitStops.js +46 -8
  94. package/dist/lib/time-travel/stateAt.js +4 -14
  95. package/dist/lib/time-travel/timeTravel.js +2 -2
  96. package/dist/lib/time-travel/types.js +1 -1
  97. package/dist/trace.js +5 -7
  98. package/dist/types/lib/capture/freeze.d.ts +47 -0
  99. package/dist/types/lib/capture/index.d.ts +1 -0
  100. package/dist/types/lib/detach/drivers/immediate.d.ts +25 -24
  101. package/dist/types/lib/detach/drivers/microtaskBatch.d.ts +5 -4
  102. package/dist/types/lib/engine/handlers/SubflowInputMapper.d.ts +4 -1
  103. package/dist/types/lib/memory/EventLog.d.ts +28 -3
  104. package/dist/types/lib/memory/StageContext.d.ts +20 -0
  105. package/dist/types/lib/memory/TransactionBuffer.d.ts +2 -2
  106. package/dist/types/lib/memory/backtrack.d.ts +24 -0
  107. package/dist/types/lib/memory/commitLogUtils.d.ts +129 -38
  108. package/dist/types/lib/memory/deltaEncoding.d.ts +1 -1
  109. package/dist/types/lib/memory/honesty.d.ts +5 -1
  110. package/dist/types/lib/memory/index.d.ts +2 -2
  111. package/dist/types/lib/memory/keyPaths.d.ts +125 -0
  112. package/dist/types/lib/memory/logModel.d.ts +76 -0
  113. package/dist/types/lib/memory/placeholders.d.ts +3 -3
  114. package/dist/types/lib/memory/redaction.d.ts +34 -1
  115. package/dist/types/lib/memory/utils.d.ts +2 -6
  116. package/dist/types/lib/memory/verbs.d.ts +65 -22
  117. package/dist/types/lib/scope/protection/readonlyInput.d.ts +2 -6
  118. package/dist/types/lib/slice/elementProvenance.d.ts +4 -1
  119. package/dist/types/lib/slice/forwardSliceForKey.d.ts +4 -0
  120. package/dist/types/lib/slice/keyIndex.d.ts +50 -8
  121. package/dist/types/lib/slice/types.d.ts +53 -7
  122. package/dist/types/lib/time-travel/types.d.ts +4 -3
  123. package/dist/types/trace.d.ts +2 -1
  124. package/package.json +2 -1
@@ -13,9 +13,8 @@ import { borrowedMutationMessage, committedMutationMessage, firstDifferingPath }
13
13
  import { DiagnosticCollector } from './DiagnosticCollector.js';
14
14
  import { nativeGet } from './pathOps.js';
15
15
  import { SCOPE_PLACEHOLDER } from './placeholders.js';
16
- import { CLEAR, RedactionRule } from './redaction.js';
16
+ import { CLEAR, RedactionRule, scrubPatch } from './redaction.js';
17
17
  import { TransactionBuffer } from './TransactionBuffer.js';
18
- import { redactPatch } from './utils.js';
19
18
  /** The user-level key of a write or read — dotted only for a nested path (a
20
19
  * subflow seed's `['profile'] + 'auth'`); no allocation for the common
21
20
  * single-segment case. */
@@ -63,6 +62,14 @@ export class StageContext {
63
62
  */
64
63
  tags;
65
64
  runId;
65
+ /**
66
+ * The run namespace this frame writes and reads in when that is not its own
67
+ * `runId` — set once, before the frame's first write, by
68
+ * {@link useAddressOf}. Its one user is a subflow mount's merge-back (R13):
69
+ * the record names the mount, the values land where the mount's parent
70
+ * writes. Absent → `runId`, so every other frame is untouched.
71
+ */
72
+ addressRunId;
66
73
  branchId;
67
74
  isDecider;
68
75
  isFork;
@@ -479,17 +486,36 @@ export class StageContext {
479
486
  // The stage's address — where `withNamespace` puts its writes (9.30.0:
480
487
  // the admitted record reads the containers there as where the stage
481
488
  // writes, never as a value it read).
482
- const address = this.runId ? ['runs', this.runId] : [];
489
+ const address = this.namespaceId ? ['runs', this.namespaceId] : [];
483
490
  this.buffer = new TransactionBuffer(this.firstTouchState(), this.commitValues, readKeysProvider, address);
484
491
  }
485
492
  return this.buffer;
486
493
  }
487
494
  /** Builds an absolute path inside the shared memory (run namespace). */
488
495
  withNamespace(path, key) {
489
- if (!this.runId || this.runId === '') {
496
+ if (!this.namespaceId) {
490
497
  return [...path, key];
491
498
  }
492
- return ['runs', this.runId, ...path, key];
499
+ return ['runs', this.namespaceId, ...path, key];
500
+ }
501
+ /** The run namespace writes and reads go to: {@link addressRunId}, else `runId`. */
502
+ get namespaceId() {
503
+ return this.addressRunId ?? this.runId;
504
+ }
505
+ /**
506
+ * Write and read at ANOTHER frame's address (its run namespace) while this
507
+ * frame keeps its own identity on the record — `stage`, `stageId`,
508
+ * `runtimeStageId`, tags. A subflow mount's merge-back is the one caller
509
+ * (`SubflowExecutor · executeSubflow`, R13): the mount frame of a branch or
510
+ * fork child lands its values where its parent writes, as before, and its
511
+ * bundle now names the mount instead of the stage before it. Refused once
512
+ * the frame has staged anything — its buffer's address is fixed then.
513
+ */
514
+ useAddressOf(frame) {
515
+ if (this.buffer && frame.namespaceId !== this.namespaceId) {
516
+ throw new Error(`[footprint] StageContext.useAddressOf: '${this.stageId}' has already staged writes at its own address.`);
517
+ }
518
+ this.addressRunId = frame.namespaceId;
493
519
  }
494
520
  // ── Write operations ───────────────────────────────────────────────────
495
521
  patch(path, key, value, shouldRedact = false) {
@@ -578,7 +604,7 @@ export class StageContext {
578
604
  const fromSnapshot = this.buffer ? this.buffer.get(namespaced) : nativeGet(this.firstTouchState(), namespaced);
579
605
  if (typeof fromSnapshot !== 'undefined')
580
606
  return fromSnapshot;
581
- const live = this.sharedMemory.getValue(this.runId, path, key);
607
+ const live = this.sharedMemory.getValue(this.namespaceId, path, key);
582
608
  // Tier 2 after the first write: keep the diff base exact (see above).
583
609
  if (this.buffer && live !== null && typeof live === 'object')
584
610
  this.buffer.detachBase(namespaced);
@@ -627,7 +653,7 @@ export class StageContext {
627
653
  return this.readState(path, key);
628
654
  }
629
655
  getRoot(key) {
630
- return this.sharedMemory.getValue(this.runId, [], key);
656
+ return this.sharedMemory.getValue(this.namespaceId, [], key);
631
657
  }
632
658
  getGlobal(key) {
633
659
  return this.sharedMemory.getValue('', [], key);
@@ -844,8 +870,8 @@ export class StageContext {
844
870
  // 2. the event log (persisted trace)
845
871
  // 3. (future) anything else that wants a scrubbed view at commit time
846
872
  // Computing once keeps cost linear in the commit size; no post-pass walk.
847
- const redactedOverwrite = redactPatch(commitBundle.overwrite, commitBundle.redactedPaths);
848
- const redactedUpdates = redactPatch(commitBundle.updates, commitBundle.redactedPaths);
873
+ const redactedOverwrite = scrubPatch(commitBundle.overwrite, commitBundle.redactedPaths);
874
+ const redactedUpdates = scrubPatch(commitBundle.updates, commitBundle.redactedPaths);
849
875
  this.redactedSharedMemory?.applyPatch(redactedOverwrite, redactedUpdates, commitBundle.trace);
850
876
  this.eventLog?.record({
851
877
  ...commitBundle,
@@ -1068,4 +1094,4 @@ export class StageContext {
1068
1094
  return snapshot;
1069
1095
  }
1070
1096
  }
1071
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUvRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRELE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFXM0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV6Qzs7MkJBRTJCO0FBQzNCLFNBQVMsU0FBUyxDQUFDLElBQWMsRUFBRSxHQUFXO0lBQzVDLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sT0FBTyxZQUFZO0lBQ2YsWUFBWSxDQUFlO0lBQ25DOzs7Ozs7Ozs7OztPQVdHO0lBQ0ssb0JBQW9CLENBQWdCO0lBQzVDLCtEQUErRDtJQUN2RCxhQUFhLENBQWlCO0lBQzlCLE1BQU0sQ0FBcUI7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YWdlQ29udGV4dCDigJQgRXhlY3V0aW9uIGNvbnRleHQgZm9yIGEgc2luZ2xlIHN0YWdlIGluIGEgZmxvd2NoYXJ0IHJ1blxuICpcbiAqIExpa2UgYSBzdGFjayBmcmFtZSBpbiBhIGNvbXBpbGVyL3J1bnRpbWU6XG4gKiAtIFJlZmVyZW5jZSB0byBTaGFyZWRNZW1vcnkgKGFjY2Vzc2luZyBoZWFwIG1lbW9yeSlcbiAqIC0gVHJhbnNhY3Rpb25CdWZmZXIgZm9yIHN0YWdpbmcgbXV0YXRpb25zICh0cmFuc2FjdGlvbiBidWZmZXIpXG4gKiAtIExpbmtzIHRvIHBhcmVudC9jaGlsZC9uZXh0IGNvbnRleHRzIChjYWxsIHN0YWNrIGZyYW1lcylcbiAqIC0gRGlhZ25vc3RpY0NvbGxlY3RvciBmb3IgbG9ncywgZXJyb3JzLCBtZXRyaWNzXG4gKi9cblxuaW1wb3J0IHsgc3VtbWFyaXplUmVhZFZhbHVlLCBzdW1tYXJpemVXcml0ZVZhbHVlIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgeyBib3Jyb3dlZE11dGF0aW9uTWVzc2FnZSwgY29tbWl0dGVkTXV0YXRpb25NZXNzYWdlLCBmaXJzdERpZmZlcmluZ1BhdGggfSBmcm9tICcuL2JvcnJvd2VkTXV0YXRpb24uanMnO1xuaW1wb3J0IHsgRGlhZ25vc3RpY0NvbGxlY3RvciB9IGZyb20gJy4vRGlhZ25vc3RpY0NvbGxlY3Rvci5qcyc7XG5pbXBvcnQgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IFNDT1BFX1BMQUNFSE9MREVSIH0gZnJvbSAnLi9wbGFjZWhvbGRlcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25WZXJkaWN0IH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHsgQ0xFQVIsIFJlZGFjdGlvblJ1bGUgfSBmcm9tICcuL3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBTaGFyZWRNZW1vcnkgfSBmcm9tICcuL1NoYXJlZE1lbW9yeS5qcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1ZmZlciB9IGZyb20gJy4vVHJhbnNhY3Rpb25CdWZmZXIuanMnO1xuaW1wb3J0IHR5cGUge1xuICBDb21taXRWYWx1ZXNNb2RlLFxuICBGbG93Q29udHJvbFR5cGUsXG4gIEZsb3dNZXNzYWdlLFxuICBSZWFkVHJhY2tpbmdNb2RlLFxuICBTdGFnZVNuYXBzaG90LFxuICBVbnRyYWNrZWRTb3VyY2UsXG4gIFdyaXRlUHJvdmVuYW5jZU1vZGUsXG4gIFdyaXRlVHJhY2tpbmdNb2RlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IHJlZGFjdFBhdGNoIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8qKiBUaGUgdXNlci1sZXZlbCBrZXkgb2YgYSB3cml0ZSBvciByZWFkIOKAlCBkb3R0ZWQgb25seSBmb3IgYSBuZXN0ZWQgcGF0aCAoYVxuICogIHN1YmZsb3cgc2VlZCdzIGBbJ3Byb2ZpbGUnXSArICdhdXRoJ2ApOyBubyBhbGxvY2F0aW9uIGZvciB0aGUgY29tbW9uXG4gKiAgc2luZ2xlLXNlZ21lbnQgY2FzZS4gKi9cbmZ1bmN0aW9uIHVzZXJLZXlPZihwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5sZW5ndGggPiAwID8gWy4uLnBhdGgsIGtleV0uam9pbignLicpIDoga2V5O1xufVxuXG5leHBvcnQgY2xhc3MgU3RhZ2VDb250ZXh0IHtcbiAgcHJpdmF0ZSBzaGFyZWRNZW1vcnk6IFNoYXJlZE1lbW9yeTtcbiAgLyoqXG4gICAqIFBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciBvZiBgc2hhcmVkTWVtb3J5YC4gUG9wdWxhdGVkIGluIGBjb21taXQoKWAgd2l0aFxuICAgKiB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzICh0aGUgc2FtZSBvbmVzIGZlZCB0byBgZXZlbnRMb2dgKS5cbiAgICogUHJlc2VudCAqKm9ubHkqKiB3aGVuIHRoZSBleGVjdXRvciBoYXMgYmVlbiB0b2xkIHRvIG1haW50YWluIGEgcmVkYWN0ZWRcbiAgICogdmlldyDigJQgaS5lLiB3aGVuIGEgYFJlZGFjdGlvblBvbGljeWAgaXMgY29uZmlndXJlZC4gT3RoZXJ3aXNlIHVuZGVmaW5lZCxcbiAgICogemVybyBleHRyYSB3b3JrIHBlciBjb21taXQuXG4gICAqXG4gICAqIFRoZSBtaXJyb3IgaXMgcmVhZCB2aWEgYEZsb3dDaGFydEV4ZWN1dG9yLmdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYFxuICAgKiBhbmQgaXMgdGhlIGZvdW5kYXRpb24gZm9yIHRoZSBcImV4cG9ydCB0cmFjZVwiIC8gcGFzdGUtaW50by12aWV3ZXIgZmVhdHVyZVxuICAgKiDigJQgY29uc3VtZXJzIHNoYXJlIHRoZSByZWRhY3RlZCB2aWV3IGV4dGVybmFsbHkgd2l0aG91dCBsZWFraW5nIHJhdyBQSUlcbiAgICogdGhyb3VnaCBgc2hhcmVkU3RhdGVgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWRhY3RlZFNoYXJlZE1lbW9yeT86IFNoYXJlZE1lbW9yeTtcbiAgLyoqIFRoZSBydW4ncyByZWRhY3Rpb24gcnVsZSDigJQgc2VlIHtAbGluayB1c2VSZWRhY3Rpb25SdWxlfS4gKi9cbiAgcHJpdmF0ZSByZWRhY3Rpb25SdWxlPzogUmVkYWN0aW9uUnVsZTtcbiAgcHJpdmF0ZSBidWZmZXI/OiBUcmFuc2FjdGlvbkJ1ZmZlcjtcbiAgLyoqXG4gICAqIENvbW1pdHRlZC1zdGF0ZSB2aWV3IGNhcHR1cmVkIGF0IHRoaXMgc3RhZ2UncyBGSVJTVCB0b3VjaCAoZmlyc3QgcmVhZCBPUlxuICAgKiBmaXJzdCB3cml0ZSkg4oCUIGhlbGQgYnkgUkVGRVJFTkNFLCBuZXZlciBjbG9uZWQuIFNlZVxuICAgKiB7QGxpbmsgZmlyc3RUb3VjaFN0YXRlfSBmb3IgdGhlIGFsZ29yaXRobSBhbmQgdGhlIGltbXV0YWJpbGl0eSBpbnZhcmlhbnRcbiAgICogdGhhdCBtYWtlcyBhIGJhcmUgcmVmZXJlbmNlIHNhZmUuXG4gICAqL1xuICBwcml2YXRlIHN0YXRlVmlldz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwcml2YXRlIGV2ZW50TG9nPzogRXZlbnRMb2c7XG5cbiAgcHVibGljIHN0YWdlTmFtZSA9ICcnO1xuICAvKiogVW5pcXVlIHN0YWdlIGlkZW50aWZpZXIgZnJvbSB0aGUgYnVpbGRlciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBwdWJsaWMgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBTZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBzdGFnZSBleGVjdXRpb24uICovXG4gIHB1YmxpYyBydW50aW1lU3RhZ2VJZCA9ICcnO1xuICAvKipcbiAgICogRGVjbGFyZWQgdGFncyAoOS4yMS4wKSBmb3IgdGhlIHN0YWdlIHRoaXMgY29udGV4dCBpcyBleGVjdXRpbmcuIFNldCBieVxuICAgKiB0aGUgdHJhdmVyc2VyIGJlc2lkZSBgcnVudGltZVN0YWdlSWRgIChwZXItbm9kZSBpZGVudGl0eSDigJQgTk9UIGluaGVyaXRlZFxuICAgKiBieSBgY3JlYXRlTmV4dGAgLyBgY3JlYXRlQ2hpbGRgKSwgcmVjb3JkZWQgb24gdGhlIGZpcnN0IGJ1bmRsZVxuICAgKiBgY29tbWl0KClgIHdyaXRlcywgdGhlbiByZWxlYXNlZCBzbyBhIHJvdXRpbmUgc2Vjb25kIGNvbW1pdCBvbiB0aGUgc2FtZVxuICAgKiBjb250ZXh0IChhIGZvcmsgY2hpbGQncyBmYW4tb3V0IHJlcGVhdCwgYSBtb3VudCdzIGV4aXQgYnVuZGxlKSBjYXJyaWVzXG4gICAqIG5vbmUg4oCUIHRoZSBzYW1lIG9uY2UtcGVyLWV4ZWN1dGlvbiBsYXcgYF91bnRyYWNrZWRTb3VyY2VzYCBrZWVwcy5cbiAgICovXG4gIHB1YmxpYyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHB1YmxpYyBydW5JZDogc3RyaW5nO1xuICBwdWJsaWMgYnJhbmNoSWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBpc0RlY2lkZXI6IGJvb2xlYW47XG4gIHB1YmxpYyBpc0Zvcms6IGJvb2xlYW47XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBmcm9tIGJ1aWxkZXIgKHNldCBieSB0cmF2ZXJzZXIgYmVmb3JlIGV4ZWN1dGlvbikuICovXG4gIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN1YmZsb3cgaWRlbnRpZmllciAoc2V0IGJ5IHRyYXZlcnNlciB3aGVuIHRoaXMgaXMgYSBzdWJmbG93IGVudHJ5IHBvaW50KS4gKi9cbiAgcHVibGljIHN1YmZsb3dJZD86IHN0cmluZztcblxuICBwdWJsaWMgcGFyZW50PzogU3RhZ2VDb250ZXh0O1xuICBwdWJsaWMgbmV4dD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIGNoaWxkcmVuPzogU3RhZ2VDb250ZXh0W107XG5cbiAgcHVibGljIGRlYnVnOiBEaWFnbm9zdGljQ29sbGVjdG9yID0gbmV3IERpYWdub3N0aWNDb2xsZWN0b3IoKTtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgd3JpdGVzIChwcmUtbmFtZXNwYWNlKSBmb3IgdGhlIG1lbW9yeSB2aWV3IGFuZCBvbkNvbW1pdFxuICAgKiAg4oCUIGluIHRoZWlyIFJFVEFJTkVEIGZvcm0gKGNsb25lZCAvIHN1bW1hcmlzZWQgLyByZWRhY3RlZCkuIEZpbGxlZCBmcm9tXG4gICAqICB7QGxpbmsgX3BlbmRpbmdXcml0ZXN9IGJ5IHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30gYXQgY29tbWl0LiAqL1xuICBwcml2YXRlIF9zdGFnZVdyaXRlczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4gPSB7fTtcblxuICAvKipcbiAgICogVGhlIHdyaXRlcyBvZiB0aGUgQ1VSUkVOVCBleGVjdXRpb24sIGhlbGQgYnkgcmVmZXJlbmNlIHdpdGggdGhlIHZlcmRpY3RcbiAgICogdGhleSB3ZXJlIHN0YWdlZCB1bmRlciAoOS4yMy4wKS4gQSBrZXkgd3JpdHRlbiBrIHRpbWVzIGhvbGRzIGl0cyBMQVNUXG4gICAqIHZhbHVlOyB0aGUgcmV0YWluZWQgZm9ybSAodGhlIGB3cml0ZVRyYWNraW5nYCBjbG9uZSBvciBzdW1tYXJ5LCB0aGVcbiAgICogcmVkYWN0aW9uIHBsYWNlaG9sZGVyIG9yIGZpZWxkIHNjcnViKSBpcyB0YWtlbiBPTkNFIHBlciBrZXkgYXQgY29tbWl0IOKAlFxuICAgKiBzZWUge0BsaW5rIG1hdGVyaWFsaXNlV3JpdGVzfS4gU2FtZSBsYXcgYXMgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzXG4gICAqIHBhdGNoIHRyZWVzOiB0aGUgY29weSB0aGUgcmVjb3JkIG5lZWRzIGlzIHBhaWQgYXQgdGhlIGJvdW5kYXJ5LCBub3QgYXRcbiAgICogZXZlcnkgd3JpdGUuIExhemlseSBhbGxvY2F0ZWQ7IGEgc3RhZ2UgdGhhdCBuZXZlciB3cml0ZXMgcGF5cyBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfcGVuZGluZ1dyaXRlcz86IE1hcDxcbiAgICBzdHJpbmcsXG4gICAgeyB2YWx1ZTogdW5rbm93bjsgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdDsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfVxuICA+O1xuXG4gIC8qKiBUcmFja3MgdXNlci1sZXZlbCByZWFkcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldy4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VSZWFkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKipcbiAgICogVGhlIGBfc3RhZ2VSZWFkc2Aga2V5cyB0aGF0IHdlcmUgcmVhZCBhdCBhIE5FU1RFRCBwYXRoIChgZ2V0VmFsdWUocGF0aCxcbiAgICoga2V5KWAgd2l0aCBhIG5vbi1lbXB0eSBgcGF0aGApLiBPbmx5IHRoZSBlbmdpbmUgcmVhZHMgdGhhdCB3YXkg4oCUIHRoZVxuICAgKiBmYWNhZGUgcmVhZHMgcm9vdHMg4oCUIHNvIHRoZXNlIGFyZSBub3QgdXNlciByZWFkcyBhbmQgdGhlIGJvcnJvd2VkLXJlYWRcbiAgICogZ3VhcmQgc2tpcHMgdGhlbSBieSB0aGlzIG1hcmtlciwgbmV2ZXIgYnkgZ3Vlc3NpbmcgZnJvbSBhIGRvdCBpbiB0aGUga2V5XG4gICAqIChhIHVzZXIncyB0b3AtbGV2ZWwga2V5IG1heSBpdHNlbGYgY29udGFpbiBvbmUpLiBMYXppbHkgY3JlYXRlZDsgdGhlXG4gICAqIGZhY2FkZSBwYXRoIG5ldmVyIGFsbG9jYXRlcyBpdC5cbiAgICovXG4gIHByaXZhdGUgX25lc3RlZFJlYWRzPzogU2V0PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIERldiBtb2RlIG9ubHk6IHRoZSByb290IGtleXMgd2hvc2UgTEFTVCB0cmFja2VkIHJlYWQgd2FzIHNlcnZlZCBmcm9tXG4gICAqIGNvbW1pdHRlZCBzdGF0ZSDigJQgYmVmb3JlIHRoaXMgc3RhZ2UncyBmaXJzdCB3cml0ZSwgd2hlbiBubyB0cmFuc2FjdGlvblxuICAgKiBidWZmZXIgZXhpc3RzIHlldC4gU3VjaCBhIHJlYWQgaXMgdGhlIGNvbW1pdHRlZCBvYmplY3QgaXRzZWxmLCBzbyBhblxuICAgKiBpbi1wbGFjZSBlZGl0IG9mIGl0IG1vdmVzIHRoZSBidWZmZXIncyBkaWZmIGJhc2UgdG9vIChjb3B5LW9uLXdyaXRlLFxuICAgKiA5LjI5LjApOyB7QGxpbmsgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbn0gY2hlY2tzIHRoZXNlIGtleXMgZXZlbiB3aGVuIHRoZVxuICAgKiBzdGFnZSB3cm90ZSB0aGVtLiBOZXZlciBhbGxvY2F0ZWQgb3V0c2lkZSBgZW5hYmxlRGV2TW9kZSgpYC5cbiAgICovXG4gIHByaXZhdGUgX3ZpZXdSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBIYXMgdGhpcyBmcmFtZSBjb21taXR0ZWQgYXQgbGVhc3Qgb25jZT8gVGhlIGJvcnJvd2VkLXJlYWQgZ3VhcmQgcnVucyBvblxuICAgKiB0aGUgRklSU1QgY29tbWl0IG9ubHkg4oCUIHNlZSB7QGxpbmsgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbn0uIFRoZSBmcmFtZVxuICAgKiBpdHNlbGYgc3RheXMgcmUtdXNhYmxlIGFmdGVyIGNvbW1pdCAoIzEzYik6IHRoZSBlbmdpbmUncyBkb3VibGUtY29tbWl0XG4gICAqIHBhdGhzIGFuZCB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBicmFuY2ggcGFyZW50IHJlbHkgb24gaXQuIFRoZVxuICAgKiB1c2VyLWxldmVsIHJlZnVzYWwgb2YgYSBoYW5kbGUgaGVsZCBwYXN0IGl0cyBzdGFnZSBsaXZlcyBhdCB0aGUgc2NvcGVcbiAgICogdGllciAoYFNjb3BlRmFjYWRlYCwgb25lIHBlciBzdGFnZSBleGVjdXRpb24pLCBub3QgaGVyZS5cbiAgICovXG4gIHByaXZhdGUgX2NvbW1pdHRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBIb3cgdHJhY2tlZCByZWFkcyBhcmUgcmVjb3JkZWQgaW50byBgX3N0YWdlUmVhZHNgICgjMTQpLiBEZWZhdWx0IGAnZnVsbCdgXG4gICAqIHByZXNlcnZlcyB0aGUgaGlzdG9yaWNhbCBwZXItcmVhZCBgc3RydWN0dXJlZENsb25lYC4gSW5oZXJpdGVkIGJ5IGV2ZXJ5XG4gICAqIGNvbnRleHQgY3JlYXRlZCB2aWEge0BsaW5rIGNyZWF0ZU5leHR9IC8ge0BsaW5rIGNyZWF0ZUNoaWxkfSAoc2FtZVxuICAgKiBwcm9wYWdhdGlvbiBwYXR0ZXJuIGFzIHRoZSByZWRhY3RlZCBtaXJyb3IpLCBhbmQgcHVzaGVkIGludG8gc3ViZmxvd1xuICAgKiByb290IGNvbnRleHRzIGJ5IGBTdWJmbG93RXhlY3V0b3JgLiBBZmZlY3RzIE9OTFkgdGhlIHNuYXBzaG90J3NcbiAgICogYHN0YWdlUmVhZHNgIHBheWxvYWQg4oCUIGBTY29wZVJlY29yZGVyLm9uUmVhZGAgKGFuZCB0aGVyZWZvcmUgbmFycmF0aXZlKVxuICAgKiBpcyBkaXNwYXRjaGVkIGF0IHRoZSBzY29wZSB0aWVyIGFuZCBuZXZlciBjbG9uZWQsIHNvIGl0IGlzIGlkZW50aWNhbCBpblxuICAgKiBldmVyeSBtb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkVHJhY2tpbmc6IFJlYWRUcmFja2luZ01vZGUgPSAnZnVsbCc7XG5cbiAgLyoqXG4gICAqIEhvdyB0cmFja2VkIHdyaXRlcyBhcmUgcmVjb3JkZWQgaW50byBgX3N0YWdlV3JpdGVzYCAoIzEzYy1BKSDigJQgdGhlXG4gICAqIHNpYmxpbmcgb2Yge0BsaW5rIHJlYWRUcmFja2luZ30sIHdpdGggdGhlIHNhbWUgcHJvcGFnYXRpb24gcGF0dGVyblxuICAgKiAoaW5oZXJpdGVkIHZpYSB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfSwgcHVzaGVkIGludG9cbiAgICogc3ViZmxvdyByb290IGNvbnRleHRzIGJ5IGBTdWJmbG93RXhlY3V0b3JgKS4gR292ZXJucyB0aGUgcmV0YWluZWQgZm9ybVxuICAgKiB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9IHRha2VzIGF0IGNvbW1pdCBmb3IgdGhlIHdyaXRlcyBvZlxuICAgKiB7QGxpbmsgc2V0T2JqZWN0fS97QGxpbmsgdXBkYXRlT2JqZWN0fSAoYSBjbG9uZSB1bmRlciBgJ2Z1bGwnYCwgdGFrZW5cbiAgICogb25jZSBwZXIga2V5IOKAlCA5LjIzLjApLiBBZmZlY3RzIHRoZVxuICAgKiBzbmFwc2hvdCdzIGBzdGFnZVdyaXRlc2AgcGF5bG9hZCBBTkQgdGhlIGNvbW1pdCBvYnNlcnZlcidzIG11dGF0aW9uc1xuICAgKiBwYXlsb2FkICh3aGljaCBpcyBhIHNwcmVhZCBvZiBgX3N0YWdlV3JpdGVzYCkg4oCUIGJ1dCBOT1QgdGhlIHdyaXRlXG4gICAqIGl0c2VsZjogdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciwgdGhlIGNvbW1pdCBsb2csIGFuZCBzaGFyZWQgc3RhdGUgYXJlXG4gICAqIGlkZW50aWNhbCBpbiBldmVyeSBtb2RlLCBhbmQgYFNjb3BlUmVjb3JkZXIub25Xcml0ZWAgYWx3YXlzIGZpcmVzIHdpdGhcbiAgICogdGhlIGxpdmUgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIHdyaXRlVHJhY2tpbmc6IFdyaXRlVHJhY2tpbmdNb2RlID0gJ2Z1bGwnO1xuXG4gIC8qKlxuICAgKiBIb3cgY29tbWl0LWJ1bmRsZSB2YWx1ZXMgYXJlIGVuY29kZWQgaW50byB0aGUgY29tbWl0IGxvZyAoIzEzYy1CKSDigJQgdGhlXG4gICAqIHRoaXJkIGRpYWwgb2YgdGhlIGZhbWlseSwgd2l0aCB0aGUgc2FtZSBwcm9wYWdhdGlvbiBwYXR0ZXJuIGFzXG4gICAqIHtAbGluayByZWFkVHJhY2tpbmd9L3tAbGluayB3cml0ZVRyYWNraW5nfSAoaW5oZXJpdGVkIHZpYVxuICAgKiB7QGxpbmsgY3JlYXRlTmV4dH0ve0BsaW5rIGNyZWF0ZUNoaWxkfSwgcHVzaGVkIGludG8gc3ViZmxvdyByb290XG4gICAqIGNvbnRleHRzIGJ5IGBTdWJmbG93RXhlY3V0b3JgLCByZS1hcHBsaWVkIG9uIHRoZSByZXN1bWUgcGF0aCkuIFBhc3NlZFxuICAgKiBpbnRvIGVhY2gge0BsaW5rIFRyYW5zYWN0aW9uQnVmZmVyfSBhdCBjb25zdHJ1Y3Rpb247IGAnZnVsbCdgIChkZWZhdWx0KVxuICAgKiBpcyBieXRlLWlkZW50aWNhbCB0byBoaXN0b3J5LCBgJ2RlbHRhJ2AgZW5hYmxlcyBhcHBlbmQvZGVsZXRlIHZlcmJzICtcbiAgICogb25lLXRyYWNlLWVudHJ5LXBlci1wYXRoIGRlZHVwLiBMb3NzbGVzcyBpbiBib3RoIG1vZGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGUgPSAnZnVsbCc7XG5cbiAgLyoqXG4gICAqIFBlci13cml0ZSByZWFkLXByb3ZlbmFuY2UgcG9saWN5ICgjUDEpIOKAlCB0aGUgZm91cnRoIGRpYWwgb2YgdGhlIGZhbWlseSxcbiAgICogc2FtZSBwcm9wYWdhdGlvbiBwYXR0ZXJuIGFzIHtAbGluayByZWFkVHJhY2tpbmd9L3tAbGluayB3cml0ZVRyYWNraW5nfS9cbiAgICoge0BsaW5rIGNvbW1pdFZhbHVlc30uIFVuZGVyIGAncmVhZHMtcHJlZml4J2AgdGhpcyBjb250ZXh0IGtlZXBzIGFcbiAgICogbGlnaHR3ZWlnaHQgb3JkZXJlZCBzZXQgb2YgdGhlIGtleXMgdHJhY2tlZC1yZWFkIHNvIGZhciwgYW5kIHRoZVxuICAgKiB0cmFuc2FjdGlvbiBidWZmZXIgc3RhbXBzIHRoYXQgcHJlZml4IG9udG8gZXZlcnkgc3RhZ2VkIHdyaXRlXG4gICAqICh7QGxpbmsgVHJhY2VFbnRyeS5yZWFkS2V5c30pLiBJTkRFUEVOREVOVCBvZiByZWFkVHJhY2tpbmc6IHByb3ZlbmFuY2VcbiAgICogbmVlZHMgb25seSB0aGUga2V5IFNUUklOR1MsIHNvIGl0IHdvcmtzIGV2ZW4gdW5kZXIgcmVhZFRyYWNraW5nICdvZmYnXG4gICAqIChhbmQgY29zdHMgbm90aGluZyB3aGVuIGl0IGlzIGl0c2VsZiAnb2ZmJyDigJQgdGhlIGRlZmF1bHQpLlxuICAgKi9cbiAgcHJpdmF0ZSB3cml0ZVByb3ZlbmFuY2U6IFdyaXRlUHJvdmVuYW5jZU1vZGUgPSAnb2ZmJztcblxuICAvKiogTGF6aWx5LWFsbG9jYXRlZCBvcmRlcmVkIHJlZ2lzdHJ5IG9mIGtleXMgdHJhY2tlZC1yZWFkIGluIFRISVMgc3RhZ2Ug4oCUXG4gICAqICB0aGUgc291cmNlIG9mIHRoZSBwZXItd3JpdGUgcHJlZml4LiBPbmx5IGFsbG9jYXRlZCB1bmRlciB0aGVcbiAgICogIGAncmVhZHMtcHJlZml4J2AgZGlhbDsgaW5zZXJ0aW9uLW9yZGVyZWQgKGEgU2V0KSBhbmQgbW9ub3RvbmljLCB3aGljaFxuICAgKiAgaXMgd2hhdCBtYWtlcyBcImxhc3Qgd3JpdGUncyBwcmVmaXggPT0gdW5pb25cIiBob2xkIGluIGRlbHRhIG1vZGUuICovXG4gIHByaXZhdGUgX3Byb3ZlbmFuY2VSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyIGhvbmVzdHkgbWFya2VycyDigJQgdW50cmFja2VkIHJlYWQgcGF0aHMgdXNlZCBkdXJpbmcgVEhJU1xuICAgKiBzdGFnZSdzIGV4ZWN1dGlvbiAoYCdhcmdzJ2AgLyBgJ2VudidgIC8gYCdzaWxlbnQnYCkuIE1hcmtlZCBieVxuICAgKiBgU2NvcGVGYWNhZGVgLCBzdXJmYWNlZCBvbiB0aGUgc3RhZ2UncyBDb21taXRCdW5kbGUgYXNcbiAgICogYHVudHJhY2tlZFNvdXJjZXNgLCB0aGVuIFJFTEVBU0VEIHdpdGggdGhlIHN0YWdpbmcgc3RhdGUgYXQgY29tbWl0IGVuZFxuICAgKiAoc28gdGhlIHJvdXRpbmUgZG91YmxlLWNvbW1pdCBwYXRocyDigJQgZm9yayBjaGlsZHJlbiwgc3ViZmxvdyBtb3VudHMg4oCUXG4gICAqIHJlY29yZCB0aGUgZmllbGQgZXhhY3RseSBvbmNlLCBvbiB0aGUgZmlyc3QgY29tbWl0KS4gTGF6aWx5IGFsbG9jYXRlZDpcbiAgICogc3RhZ2VzIHRoYXQgbmV2ZXIgdG91Y2ggYW4gdW50cmFja2VkIHBhdGggcGF5IG5vdGhpbmcuXG4gICAqL1xuICBwcml2YXRlIF91bnRyYWNrZWRTb3VyY2VzPzogU2V0PFVudHJhY2tlZFNvdXJjZT47XG5cbiAgLyoqIE9ic2VydmVyIGNhbGxlZCBhZnRlciBjb21taXQoKSDigJQgdXNlZCBieSBTY29wZUZhY2FkZSB0byBmaXJlIFNjb3BlUmVjb3JkZXIub25Db21taXQuICovXG4gIHByaXZhdGUgX2NvbW1pdE9ic2VydmVyPzogKFxuICAgIG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4sXG4gICkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBydW5JZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBzdGFnZUlkOiBzdHJpbmcsXG4gICAgc2hhcmVkTWVtb3J5OiBTaGFyZWRNZW1vcnksXG4gICAgYnJhbmNoSWQ/OiBzdHJpbmcsXG4gICAgZXZlbnRMb2c/OiBFdmVudExvZyxcbiAgICBpc0RlY2lkZXI/OiBib29sZWFuLFxuICApIHtcbiAgICB0aGlzLnJ1bklkID0gcnVuSWQ7XG4gICAgdGhpcy5zdGFnZU5hbWUgPSBuYW1lO1xuICAgIHRoaXMuc3RhZ2VJZCA9IHN0YWdlSWQ7XG4gICAgdGhpcy5zaGFyZWRNZW1vcnkgPSBzaGFyZWRNZW1vcnk7XG4gICAgdGhpcy5icmFuY2hJZCA9IGJyYW5jaElkO1xuICAgIHRoaXMuZXZlbnRMb2cgPSBldmVudExvZztcbiAgICB0aGlzLmlzRGVjaWRlciA9ICEhaXNEZWNpZGVyO1xuICAgIHRoaXMuaXNGb3JrID0gZmFsc2U7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgU2hhcmVkTWVtb3J5IGluc3RhbmNlIChuZWVkZWQgYnkgc2NvcGUgbGF5ZXIpLiAqL1xuICBnZXRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCBhIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvci4gU3Vic2VxdWVudCBgY29tbWl0KClgIGNhbGxzIHdpbGxcbiAgICogYXBwbHkgdGhlIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyB0byB0aGlzIG1pcnJvciBpbiBhZGRpdGlvblxuICAgKiB0byB0aGUgcmF3IGBzaGFyZWRNZW1vcnlgICsgYGV2ZW50TG9nYC4gQ2hpbGQgLyBuZXh0IGNvbnRleHRzIGluaGVyaXRcbiAgICogdGhlIG1pcnJvciB2aWEgYGNyZWF0ZU5leHRgIC8gYGNyZWF0ZUNoaWxkYC5cbiAgICpcbiAgICogQ2FsbGVkIG9uY2UgYXQgdGhlIHJvb3QgY29udGV4dCBieSBgRXhlY3V0aW9uUnVudGltZS5lbmFibGVSZWRhY3RlZE1pcnJvcigpYC5cbiAgICovXG4gIHVzZVJlZGFjdGVkTWlycm9yKG1pcnJvcjogU2hhcmVkTWVtb3J5KTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeSA9IG1pcnJvcjtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSByZWRhY3RlZCBtaXJyb3IgaWYgaW5zdGFsbGVkLCBlbHNlIHVuZGVmaW5lZC4gKi9cbiAgZ2V0UmVkYWN0ZWRTaGFyZWRNZW1vcnkoKTogU2hhcmVkTWVtb3J5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnN0YWxsIHRoZSBydW4ncyByZWRhY3Rpb24gcnVsZSDigJQgdGhlIE9ORSBvd25lciBvZiBcIndoYXQgZG9lcyB0aGUgcG9saWN5XG4gICAqIHNheSBhYm91dCB0aGlzIHBhdGhcIiAoYG1lbW9yeS9yZWRhY3Rpb24udHNgKS4gU2FtZSBwbHVtYmluZyBhcyB0aGUgbWlycm9yXG4gICAqIGFuZCB0aGUgZm91ciBkaWFsczogc2V0IG9uY2UgYXQgdGhlIHJvb3QgYnkgYEV4ZWN1dGlvblJ1bnRpbWUudXNlUmVkYWN0aW9uYFxuICAgKiAoZnJvbSBgRmxvd0NoYXJ0RXhlY3V0b3JgLCBldmVyeSBydW4gYW5kIHJlc3VtZSksIGluaGVyaXRlZCB2aWFcbiAgICoge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH0sIHB1c2hlZCBpbnRvIHN1YmZsb3cgcm9vdCBjb250ZXh0c1xuICAgKiBieSBgU3ViZmxvd0V4ZWN1dG9yYC4gRXZlcnkgc3RhZ2VkIHdyaXRlIGFuZCBldmVyeSB0cmFja2VkIHJlYWQgYXNrcyBpdCxcbiAgICogc28gYSB3cml0ZSB0aGF0IG5ldmVyIHBhc3NlcyBhIGBTY29wZUZhY2FkZWAg4oCUIGEgc3ViZmxvdyBzZWVkLCBhblxuICAgKiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCBhIHJlc3VtZSByZS1zZWVkIOKAlCBpcyByZXRhaW5lZCB1bmRlciB0aGUgc2FtZVxuICAgKiB2ZXJkaWN0IGFzIGEgZmFjYWRlIHdyaXRlLiBBYnNlbnQgKGJhcmUgY29udGV4dHMgaW4gdW5pdCB0ZXN0cyk6IGV2ZXJ5XG4gICAqIHZlcmRpY3QgaXMgYCdjbGVhcidgIHVubGVzcyB0aGUgY2FsbGVyIHBhc3NlZCBhbiBleHBsaWNpdCBmbGFnLlxuICAgKi9cbiAgdXNlUmVkYWN0aW9uUnVsZShydWxlOiBSZWRhY3Rpb25SdWxlKTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3Rpb25SdWxlID0gcnVsZTtcbiAgfVxuXG4gIC8qKiBUaGUgaW5zdGFsbGVkIHJlZGFjdGlvbiBydWxlLCBpZiBhbnkgKGZhY2FkZSBsb29rdXAsIHN1YmZsb3cgcHJvcGFnYXRpb24pLiAqL1xuICBnZXRSZWRhY3Rpb25SdWxlKCk6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJlZGFjdGlvblJ1bGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSByZWFkLXRyYWNraW5nIHBvbGljeSBmb3IgdGhpcyBjb250ZXh0ICgjMTQpLiBDYWxsZWQgYXQgdGhlIHJvb3RcbiAgICogYnkgYEV4ZWN1dGlvblJ1bnRpbWUudXNlUmVhZFRyYWNraW5nKClgIChwbHVtYmVkIGZyb21cbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yYCk7IGRlc2NlbmRhbnRzIGluaGVyaXQgdmlhIGBjcmVhdGVOZXh0YC9gY3JlYXRlQ2hpbGRgLFxuICAgKiBhbmQgYFN1YmZsb3dFeGVjdXRvcmAgcHVzaGVzIHRoZSBwYXJlbnQgY29udGV4dCdzIG1vZGUgaW50byBlYWNoIHN1YmZsb3dcbiAgICogcm9vdCBzbyBuZXN0ZWQgY2hhcnRzIGluaGVyaXQgdG9vLlxuICAgKi9cbiAgdXNlUmVhZFRyYWNraW5nKG1vZGU6IFJlYWRUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLnJlYWRUcmFja2luZyA9IG1vZGU7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgYWN0aXZlIHJlYWQtdHJhY2tpbmcgcG9saWN5ICh1c2VkIGZvciBzdWJmbG93IHByb3BhZ2F0aW9uKS4gKi9cbiAgZ2V0UmVhZFRyYWNraW5nKCk6IFJlYWRUcmFja2luZ01vZGUge1xuICAgIHJldHVybiB0aGlzLnJlYWRUcmFja2luZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHdyaXRlLXRyYWNraW5nIHBvbGljeSBmb3IgdGhpcyBjb250ZXh0ICgjMTNjLUEpLiBTYW1lIHBsdW1iaW5nXG4gICAqIGFzIHtAbGluayB1c2VSZWFkVHJhY2tpbmd9OiBjYWxsZWQgYXQgdGhlIHJvb3QgYnlcbiAgICogYEV4ZWN1dGlvblJ1bnRpbWUudXNlV3JpdGVUcmFja2luZygpYCAocGx1bWJlZCBmcm9tIGBGbG93Q2hhcnRFeGVjdXRvcmApO1xuICAgKiBkZXNjZW5kYW50cyBpbmhlcml0IHZpYSBgY3JlYXRlTmV4dGAvYGNyZWF0ZUNoaWxkYCwgYW5kIGBTdWJmbG93RXhlY3V0b3JgXG4gICAqIHB1c2hlcyB0aGUgcGFyZW50IGNvbnRleHQncyBtb2RlIGludG8gZWFjaCBzdWJmbG93IHJvb3QuXG4gICAqL1xuICB1c2VXcml0ZVRyYWNraW5nKG1vZGU6IFdyaXRlVHJhY2tpbmdNb2RlKTogdm9pZCB7XG4gICAgdGhpcy53cml0ZVRyYWNraW5nID0gbW9kZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBhY3RpdmUgd3JpdGUtdHJhY2tpbmcgcG9saWN5ICh1c2VkIGZvciBzdWJmbG93IHByb3BhZ2F0aW9uKS4gKi9cbiAgZ2V0V3JpdGVUcmFja2luZygpOiBXcml0ZVRyYWNraW5nTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMud3JpdGVUcmFja2luZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbW1pdC12YWx1ZXMgZW5jb2RpbmcgcG9saWN5IGZvciB0aGlzIGNvbnRleHQgKCMxM2MtQikuIFNhbWVcbiAgICogcGx1bWJpbmcgYXMge0BsaW5rIHVzZVJlYWRUcmFja2luZ30ve0BsaW5rIHVzZVdyaXRlVHJhY2tpbmd9OiBjYWxsZWQgYXRcbiAgICogdGhlIHJvb3QgYnkgYEV4ZWN1dGlvblJ1bnRpbWUudXNlQ29tbWl0VmFsdWVzKClgIChwbHVtYmVkIGZyb21cbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yYCk7IGRlc2NlbmRhbnRzIGluaGVyaXQgdmlhIGBjcmVhdGVOZXh0YC9gY3JlYXRlQ2hpbGRgLFxuICAgKiBhbmQgYFN1YmZsb3dFeGVjdXRvcmAgcHVzaGVzIHRoZSBwYXJlbnQgY29udGV4dCdzIG1vZGUgaW50byBlYWNoIHN1YmZsb3dcbiAgICogcm9vdC5cbiAgICovXG4gIHVzZUNvbW1pdFZhbHVlcyhtb2RlOiBDb21taXRWYWx1ZXNNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5jb21taXRWYWx1ZXMgPSBtb2RlO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIGFjdGl2ZSBjb21taXQtdmFsdWVzIHBvbGljeSAodXNlZCBmb3Igc3ViZmxvdyBwcm9wYWdhdGlvbikuICovXG4gIGdldENvbW1pdFZhbHVlcygpOiBDb21taXRWYWx1ZXNNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5jb21taXRWYWx1ZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBwZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIHBvbGljeSAoI1AxKS4gU2FtZSBwbHVtYmluZyBhcyB0aGVcbiAgICogb3RoZXIgdGhyZWUgZGlhbHM6IGNhbGxlZCBhdCB0aGUgcm9vdCBieVxuICAgKiBgRXhlY3V0aW9uUnVudGltZS51c2VXcml0ZVByb3ZlbmFuY2UoKWAgKHBsdW1iZWQgZnJvbVxuICAgKiBgRmxvd0NoYXJ0RXhlY3V0b3JgKTsgZGVzY2VuZGFudHMgaW5oZXJpdCB2aWEgYGNyZWF0ZU5leHRgL2BjcmVhdGVDaGlsZGAsXG4gICAqIGFuZCBgU3ViZmxvd0V4ZWN1dG9yYCBwdXNoZXMgdGhlIHBhcmVudCBjb250ZXh0J3MgbW9kZSBpbnRvIGVhY2ggc3ViZmxvd1xuICAgKiByb290IHNvIG5lc3RlZCBjaGFydHMgaW5oZXJpdCB0b28uXG4gICAqL1xuICB1c2VXcml0ZVByb3ZlbmFuY2UobW9kZTogV3JpdGVQcm92ZW5hbmNlTW9kZSk6IHZvaWQge1xuICAgIHRoaXMud3JpdGVQcm92ZW5hbmNlID0gbW9kZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBhY3RpdmUgd3JpdGUtcHJvdmVuYW5jZSBwb2xpY3kgKHVzZWQgZm9yIHN1YmZsb3cgcHJvcGFnYXRpb24pLiAqL1xuICBnZXRXcml0ZVByb3ZlbmFuY2UoKTogV3JpdGVQcm92ZW5hbmNlTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMud3JpdGVQcm92ZW5hbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCBhIHRyYWNrZWQgdXNlci1sZXZlbCB3cml0ZSwgcG9saWN5LWdhdGVkICgjMTNjLUEpIOKAlCB0aGUgc2luZ2xlXG4gICAqIGJvb2trZWVwaW5nIHBhdGggZm9yIHtAbGluayBzZXRPYmplY3R9IGFuZCB7QGxpbmsgdXBkYXRlT2JqZWN0fS4gSG9sZHNcbiAgICogdGhlIFJFRkVSRU5DRSBhbmQgdGhlIHZlcmRpY3QgKDkuMjMuMCk7IHRoZSByZXRhaW5lZCBmb3JtIGlzIHRha2VuIGF0XG4gICAqIGNvbW1pdCBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9LCBvbmNlIHBlciBrZXkuXG4gICAqXG4gICAqIFJlZGFjdGlvbiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIGRpYWwgaW4gRVZFUlkgbW9kZTogYSByZWRhY3RlZFxuICAgKiB3cml0ZSBzdG9yZXMgdGhlIGAnW1JFREFDVEVEXSdgIHBsYWNlaG9sZGVyIHVuZGVyIGAnZnVsbCdgIEFORFxuICAgKiBgJ3N1bW1hcnknYCAoYSBzdW1tYXJ5IG1hcmtlciB3b3VsZCBsZWFrIHRoZSB2YWx1ZSdzIHByZXZpZXcvc2l6ZSksXG4gICAqIGFuZCBzdG9yZXMgbm90aGluZyB1bmRlciBgJ29mZidgIChlbnRyeSBza2lwcGVkIGVudGlyZWx5IOKAlCBub3RoaW5nIHRvXG4gICAqIGxlYWspLiBBIGZpZWxkLWxldmVsIHZlcmRpY3Qgc2NydWJzIGEgY2xvbmUgQkVGT1JFIHRoZSBkaWFsIHNlZXMgaXQsIHNvXG4gICAqIGEgc3VtbWFyeSBwcmV2aWV3IGNhbiBuZXZlciBzaG93IHRoZSBzZWNyZXQgZWl0aGVyLiBUaGUgdmVyZGljdCBpcyB0aGVcbiAgICogb25lIGBzdGFnZVdyaXRlYCBhc2tlZCB0aGUgcnVsZSBmb3IgQkVGT1JFIHN0YWdpbmcsIGNhcnJpZWQgdG8gY29tbWl0XG4gICAqIHdpdGggdGhlIHZhbHVlLiBUaGUgc3RhZ2VkIHdyaXRlIGl0c2VsZiBpcyB1bmFmZmVjdGVkIOKAlCByZWRhY3Rpb24gb2ZcbiAgICogdGhlIGNvbW1pdHRlZCBwYXlsb2FkIGlzIGhhbmRsZWQgYnkgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzXG4gICAqIGByZWRhY3RlZFBhdGhzYC5cbiAgICovXG4gIHByaXZhdGUgdHJhY2tXcml0ZShcbiAgICB1c2VyS2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgICBvcGVyYXRpb246ICdzZXQnIHwgJ3VwZGF0ZScgfCAnZGVsZXRlJyxcbiAgKSB7XG4gICAgaWYgKHRoaXMud3JpdGVUcmFja2luZyA9PT0gJ29mZicpIHJldHVybjtcbiAgICAodGhpcy5fcGVuZGluZ1dyaXRlcyA/Pz0gbmV3IE1hcCgpKS5zZXQodXNlcktleSwgeyB2YWx1ZSwgdmVyZGljdCwgb3BlcmF0aW9uIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBfc3RhZ2VXcml0ZXNgIHdpdGggZXZlcnkgcGVuZGluZyB3cml0ZSBmb2xkZWQgaW4gYXMgaXRzIHJldGFpbmVkIGZvcm1cbiAgICog4oCUIHRoZSByZWNvcmQgYSByZWFkZXIgc2Vlcy4gQ29uc3VtZXMgbm90aGluZzogYSBtaWQtcnVuIHNuYXBzaG90IHJlYWRzXG4gICAqIHRoZSB3cml0ZXMgc28gZmFyLCBhbmQgY29tbWl0IHN0aWxsIG1hdGVyaWFsaXNlcyB0aGUgZmluYWwgdmFsdWVzLlxuICAgKiBSZXR1cm5zIGBfc3RhZ2VXcml0ZXNgIGl0c2VsZiB3aGVuIG5vdGhpbmcgaXMgcGVuZGluZy5cbiAgICovXG4gIHByaXZhdGUgcmV0YWluZWRXcml0ZXMoKTogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4ge1xuICAgIGlmICghdGhpcy5fcGVuZGluZ1dyaXRlcykgcmV0dXJuIHRoaXMuX3N0YWdlV3JpdGVzO1xuICAgIGNvbnN0IG91dCA9IHsgLi4udGhpcy5fc3RhZ2VXcml0ZXMgfTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHddIG9mIHRoaXMuX3BlbmRpbmdXcml0ZXMpIHtcbiAgICAgIG91dFtrZXldID0ge1xuICAgICAgICB2YWx1ZTogdGhpcy5yZXRhaW5lZEZvcm0ody52ZXJkaWN0LCB3LnZhbHVlLCB0aGlzLndyaXRlVHJhY2tpbmcsIHN1bW1hcml6ZVdyaXRlVmFsdWUpLFxuICAgICAgICBvcGVyYXRpb246IHcub3BlcmF0aW9uLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlIHRoZSByZXRhaW5lZCBmb3JtIG9mIGV2ZXJ5IHBlbmRpbmcgd3JpdGUg4oCUIE9OQ0UgcGVyIGtleSwgZnJvbSB0aGVcbiAgICogdmFsdWUgYXMgaXQgc3RhbmRzIGF0IGNvbW1pdCAoOS4yMy4wKSDigJQgYW5kIHJlbGVhc2UgdGhlIHJlZmVyZW5jZXMuIFRoZVxuICAgKiBmaXJzdCB0aGluZyBgY29tbWl0KClgIGRvZXMsIHNvIHRoZSBib3Jyb3dlZC1tdXRhdGlvbiBndWFyZCBhbmQgdGhlXG4gICAqIGNvbW1pdCBvYnNlcnZlciBzZWUgdGhlIGZpbmlzaGVkIHJlY29yZC5cbiAgICovXG4gIHByaXZhdGUgbWF0ZXJpYWxpc2VXcml0ZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9wZW5kaW5nV3JpdGVzKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3N0YWdlV3JpdGVzID0gdGhpcy5yZXRhaW5lZFdyaXRlcygpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZWxlYXNlZCBldmVuIHdoZW4gYSByZXRhaW5lZCBmb3JtIGNhbm5vdCBiZSB0YWtlbiDigJQgYW4gdW5jbG9uZWFibGVcbiAgICAgIC8vIHZhbHVlIChhIGZ1bmN0aW9uLCBhIFByb3h5KSBpcyBhIGNvbnRyYWN0IHZpb2xhdGlvbiAoXCJzdGF0ZSB2YWx1ZXNcbiAgICAgIC8vIG11c3Qgc3Vydml2ZSBzdHJ1Y3R1cmVkQ2xvbmVcIikgdGhhdCBub3cgc3VyZmFjZXMgSEVSRSwgYXQgY29tbWl0LFxuICAgICAgLy8gYW5kIGZhaWxzIHRoZSBydW4gbG91ZGx5OyBhIGxhdGVyIHNuYXBzaG90IG9mIHRoZSBmYWlsZWQgcnVuIG11c3RcbiAgICAgIC8vIG5vdCB0aHJvdyB0aGUgc2FtZSBlcnJvciBhZ2Fpbi5cbiAgICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIG9mIGEgdmFsdWUgdGhlIGVuZ2luZSBSRVRBSU5TIChyZWFkcyBhbmQgd3JpdGVzIHJldGVudGlvbik6XG4gICAqIHRoZSBwbGFjZWhvbGRlciBiZWF0cyBldmVyeSBkaWFsOyBhIGZpZWxkLWxldmVsIHNjcnViIGhhcHBlbnMgYmVmb3JlIHRoZVxuICAgKiBkaWFsIHNlZXMgdGhlIHZhbHVlOyBhIGNsZWFyIHZhbHVlIGlzIHN1bW1hcml6ZWQgb3IgY2xvbmVkIGFzIHRoZSBkaWFsXG4gICAqIHNheXMuIENhbGxlcnMgaGFuZGxlIGB1bmRlZmluZWRgIGJlZm9yZSBhc2tpbmcuXG4gICAqL1xuICBwcml2YXRlIHJldGFpbmVkRm9ybShcbiAgICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIG1vZGU6IFJlYWRUcmFja2luZ01vZGUgfCBXcml0ZVRyYWNraW5nTW9kZSxcbiAgICBzdW1tYXJpemU6ICh2YWx1ZTogdW5rbm93bikgPT4gdW5rbm93bixcbiAgKTogdW5rbm93biB7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIFNDT1BFX1BMQUNFSE9MREVSO1xuICAgIGNvbnN0IHNjcnViYmVkID0gdmVyZGljdC5raW5kID09PSAnZmllbGRzJyA/IFJlZGFjdGlvblJ1bGUuc2NydWJGaWVsZHModmFsdWUsIHZlcmRpY3QucGF0aHMpIDogdW5kZWZpbmVkO1xuICAgIGlmIChtb2RlID09PSAnc3VtbWFyeScpIHJldHVybiBzdW1tYXJpemUoc2NydWJiZWQgPz8gdmFsdWUpO1xuICAgIHJldHVybiBzY3J1YmJlZCA/PyBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBydWxlIHdpdGggc29tZXRoaW5nIHRvIHNheSDigJQgYHVuZGVmaW5lZGAgb24gdGhlIG5vLXBvbGljeSBwYXRoIChub1xuICAgKiBydWxlIGluc3RhbGxlZCwgb3IgYSBydWxlIHdpdGggbm8gcG9saWN5IGVudHJpZXMgYW5kIG5vIG1hcmtlZCBrZXlzKSwgc29cbiAgICogYSB0cmFja2VkIHJlYWQgb3IgYSBzdGFnZWQgd3JpdGUgdGhlcmUgcGF5cyBubyB2ZXJkaWN0IGNhbGwgYW5kIG5vIHBhdGhcbiAgICogYWxsb2NhdGlvbi4gVGhlIGRlZmF1bHQgcnVuIGlzIGJ5dGUtaWRlbnRpY2FsIEFORCBjb3N0LWlkZW50aWNhbC5cbiAgICovXG4gIHByaXZhdGUgYWN0aXZlUnVsZSgpOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBydWxlID0gdGhpcy5yZWRhY3Rpb25SdWxlO1xuICAgIHJldHVybiBydWxlICE9PSB1bmRlZmluZWQgJiYgIXJ1bGUuaXNJbmVydCgpID8gcnVsZSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUSEUgT05FIEZVTk5FTCBldmVyeSBzdGFnZWQgd3JpdGUgcGFzc2VzIHRocm91Z2gg4oCUIGZhY2FkZSB3cml0ZXMgQU5EXG4gICAqIHRoZSBwYXRocyB0aGF0IGJ5cGFzcyB0aGUgZmFjYWRlIChzdWJmbG93IHNlZWQsIGBvdXRwdXRNYXBwZXJgXG4gICAqIG1lcmdlLWJhY2ssIHJlc3VtZSByZS1zZWVkKS4gVGhlIE9ORSBkZWNpc2lvbiBpcyBtYWRlIGhlcmU6IGFuIGV4cGxpY2l0XG4gICAqIHBlci1jYWxsIGZsYWcgbWFrZXMgdGhlIHZhbHVlIHNlY3JldCBvdXRyaWdodCAoYW5kIG1hcmtzIHRoZSBrZXkgZm9yIHRoZVxuICAgKiByZXN0IG9mIHRoZSBydW4sIHRoZSBkZWNsYXJlLW9uY2UgY29udHJhY3QpOyBvdGhlcndpc2UgdGhlIGluc3RhbGxlZFxuICAgKiBydWxlIGRlY2lkZXMgZnJvbSB0aGUgdXNlci1sZXZlbCBwYXRoLiBJdCBzdGFnZXMgdGhlIHdyaXRlLCByZWdpc3RlcnNcbiAgICogdGhlIHJlZGFjdGVkIHBhdGhzIHRoZSBjb21taXQgbG9nIGFuZCBtaXJyb3Igd2lsbCBzY3J1YiAod2hvbGUga2V5LCBvclxuICAgKiB0aGUgZmllbGRzIGluc2lkZSB0aGUgdmFsdWUpLCBhbmQga2VlcHMgdGhlIHJ1bidzIG1hcmtlZC1rZXlzIHNldCBpblxuICAgKiBzdGVwIChhIHdob2xlIHZlcmRpY3QgbWFya3MgaXRzIGtleTsgYSBkZWxldGUgY2xlYXJzIHRoZSBtYXJrKS4gUmV0dXJuc1xuICAgKiB0aGUgdmVyZGljdCBzbyB0aGUgY2FsbGVyIHJldGFpbnMgYW5kIHJlcG9ydHMgdW5kZXIgdGhlIHNhbWUgZGVjaXNpb24uXG4gICAqL1xuICBwcml2YXRlIHN0YWdlV3JpdGUoXG4gICAgbnNQYXRoOiBzdHJpbmdbXSxcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBleHBsaWNpdDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbiAgICB2ZXJiOiAnc2V0JyB8ICdtZXJnZScgfCAnZGVsZXRlJyxcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgcnVsZSA9IHRoaXMuYWN0aXZlUnVsZSgpO1xuICAgIGNvbnN0IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgPSBleHBsaWNpdFxuICAgICAgPyB7IGtpbmQ6ICd3aG9sZScsIGtleTogdXNlcktleU9mKHBhdGgsIGtleSkgfVxuICAgICAgOiBydWxlICE9PSB1bmRlZmluZWRcbiAgICAgID8gcnVsZS52ZXJkaWN0QXQocGF0aCwga2V5KVxuICAgICAgOiBDTEVBUjtcbiAgICBjb25zdCB3aG9sZSA9IHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJztcbiAgICBjb25zdCBidWZmZXIgPSB0aGlzLmdldFRyYW5zYWN0aW9uQnVmZmVyKCk7XG4gICAgaWYgKHZlcmIgPT09ICdtZXJnZScpIGJ1ZmZlci5tZXJnZShuc1BhdGgsIHZhbHVlLCB3aG9sZSk7XG4gICAgZWxzZSBpZiAodmVyYiA9PT0gJ2RlbGV0ZScpIGJ1ZmZlci5kZWxldGUobnNQYXRoLCB3aG9sZSk7XG4gICAgZWxzZSBidWZmZXIuc2V0KG5zUGF0aCwgdmFsdWUsIHdob2xlKTtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykgYnVmZmVyLm1hcmtSZWRhY3RlZEZpZWxkcyhuc1BhdGgsIHZlcmRpY3QucGF0aHMpO1xuICAgIGlmICh2ZXJiID09PSAnZGVsZXRlJykge1xuICAgICAgcnVsZT8udW5tYXJrKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgICB9IGVsc2UgaWYgKHdob2xlKSB7XG4gICAgICAvLyBUaGUgUkVBTCBydWxlLCBub3QgdGhlIGFjdGl2ZSBvbmU6IGFuIGV4cGxpY2l0IG1hcmsgb24gYW4gaW5lcnQgcnVsZVxuICAgICAgLy8gaXMgZXhhY3RseSB3aGF0IG1ha2VzIGl0IGFjdGl2ZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1bi5cbiAgICAgIHRoaXMucmVkYWN0aW9uUnVsZT8ubWFyayh2ZXJkaWN0LmtleSk7XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIOKUgOKUgCBUaGUgZmlyc3QtdG91Y2ggc3RhdGUgdmlldyAoIzEzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICpcbiAgICogV0hBVDogcmV0dXJucyB0aGUgY29tbWl0dGVkIHNoYXJlZCBzdGF0ZSBhcyBpdCB3YXMgYXQgdGhpcyBzdGFnZSdzIEZJUlNUXG4gICAqIHRvdWNoIChmaXJzdCByZWFkIG9yIGZpcnN0IHdyaXRlKSwgY2FwdHVyaW5nIHRoZSByZWZlcmVuY2Ugb24gZmlyc3QgY2FsbC5cbiAgICogU2VydmVzIHR3byBjb25zdW1lcnM6IHJlYWRzIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGUgKHtAbGluayByZWFkU3RhdGV9KVxuICAgKiBhbmQgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzIGRpZmYgYmFzZSAoe0BsaW5rIGdldFRyYW5zYWN0aW9uQnVmZmVyfSkuXG4gICAqXG4gICAqIFdIWSBBIEJBUkUgUkVGRVJFTkNFIElTIFNBRkUg4oCUIHRoZSBpbnZhcmlhbnQgdGhpcyByZXN0cyBvbjogY29tbWl0dGVkXG4gICAqIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwLiBFdmVyeSB3cml0ZSB0byBgU2hhcmVkTWVtb3J5YCBidWlsZHMgdGhlXG4gICAqIE5FWFQgZ2VuZXJhdGlvbiBhbmQgc3dhcHMgaXQgaW4gKGNvcHktb24td3JpdGUsIDkuMjkuMDogYGFwcGx5UGF0Y2hgIHZpYVxuICAgKiBgbmV4dEdlbmVyYXRpb25gLCBhbmQgYHNldFZhbHVlYC9gdXBkYXRlVmFsdWVgIHRvbykg4oCUIGl0IGNvcGllcyB0aGUgcm9vdFxuICAgKiBhbmQgdGhlIGNvbnRhaW5lcnMgb24gZWFjaCB3cml0dGVuIHBhdGgsIHNoYXJlcyB0aGUgcmVzdCwgYW5kIG5ldmVyXG4gICAqIGVkaXRzIGEgY29udGFpbmVyIG9mIHRoZSBnZW5lcmF0aW9uIGEgc3RhZ2UgY2FwdHVyZWQgaGVyZS4gSG9sZGluZyB0aGVcbiAgICogcmVmZXJlbmNlIHRoZXJlZm9yZSBnaXZlcyB0aGlzIHN0YWdlIGEgc3RhYmxlIHNuYXBzaG90IGF0IHplcm8gY29zdCDigJQgbm9cbiAgICogY2xvbmUsIHdoaWNoIGlzIHRoZSBlbnRpcmUgcG9pbnQgb2YgIzEzLiBUaGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3NcbiAgICogbmV0LWNoYW5nZSBkaWZmIGJhc2UgcmVzdHMgb24gdGhlIHNhbWUgZ3VhcmFudGVlOiBpdCBJUyB0aGlzIHZpZXcuXG4gICAqXG4gICAqIFdIWSBGSVJTVCBUT1VDSCwgbm90IGZpcnN0IHdyaXRlOiB0aGUgcHJlLSMxMyBlYWdlciBlbmdpbmUgY2xvbmVkIHRoZVxuICAgKiBzdGF0ZSBpbnRvIHRoZSBidWZmZXIgYXQgdGhlIHN0YWdlJ3MgZmlyc3QgQUNDRVNTLCBhbmNob3JpbmcgYm90aCBpdHNcbiAgICogc25hcHNob3QgcmVhZHMgYW5kIGl0cyBjb21taXQgYmFzZWxpbmUgKHRoZSBuZXQtY2hhbmdlIGRpZmYgYmFzZSkgdGhlcmUuXG4gICAqICMxMydzIGZpcnN0IGN1dCBhbmNob3JlZCB0aGUgbGF6eSBidWZmZXIgYXQgZmlyc3QgV1JJVEUg4oCUIG9ic2VydmFibHlcbiAgICogZGlmZmVyZW50IHdoZW4gc29tZXRoaW5nIGVsc2UgY29tbWl0cyBpbiB0aGUgZ2FwIGJldHdlZW4gdGhpcyBzdGFnZSdzXG4gICAqIGZpcnN0IHJlYWQgYW5kIGl0cyBmaXJzdCB3cml0ZS4gVGhhdCBnYXAgaXMgUkVBQ0hBQkxFOiBmb3JrIHNpYmxpbmdzIGFyZVxuICAgKiBuYW1lc3BhY2UtaXNvbGF0ZWQgZm9yIHJ1bi1zY29wZWQga2V5cyAoZWFjaCBjaGlsZCB3cml0ZXMgdW5kZXJcbiAgICogYHJ1bnMvPGNoaWxkSWQ+L2ApLCBidXQgUk9PVC1sZXZlbCBrZXlzIGFyZSBzaGFyZWQg4oCUIHdyaXR0ZW4gdmlhXG4gICAqIGBzZXRHbG9iYWxgIGZyb20gY29uc3VtZXIgc2NvcGUgY29kZSBhbmQsIGNyaXRpY2FsbHksIGJ5XG4gICAqIGBTdWJmbG93SW5wdXRNYXBwZXJgJ3Mgb3V0cHV0IG1hcHBpbmcgKGBwYXJlbnRDb250ZXh0LnNldEdsb2JhbGApLCB3aGljaFxuICAgKiBpcyBleGFjdGx5IHdoYXQgcnVucyB3aGVuIGEgc3ViZmxvdyBpcyBhIGZvcmsgYnJhbmNoLiBBIHNpYmxpbmcnc1xuICAgKiByb290LWtleSBjb21taXQgbGFuZGluZyBpbiB0aGUgZ2FwIHdvdWxkIHNoaWZ0IHRoaXMgc3RhZ2UncyBkaWZmIGJhc2UsXG4gICAqIG1ha2luZyBpdHMgQ29tbWl0QnVuZGxlIHJlY29yZCBhIHBoYW50b20gY2hhbmdlIChvciBzd2FsbG93IGEgcmVhbCBvbmUpXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBlYWdlciBlbmdpbmUuIEFuY2hvcmluZyB0aGUgdmlldyBhdCBmaXJzdCB0b3VjaCByZXN0b3Jlc1xuICAgKiB0aGUgRVhBQ1QgZWFnZXIgc2VtYW50aWNzIOKAlCBzZXF1ZW50aWFsIEFORCBwYXJhbGxlbCDigJQgYXQgemVybyBjbG9uZSBjb3N0LlxuICAgKlxuICAgKiBSZWFkIHZpc2liaWxpdHkgaXMgdHdvLXRpZXIsIG1hdGNoaW5nIGVhZ2VyIGJ5dGUtZm9yLWJ5dGU6IGtleXMgcHJlc2VudFxuICAgKiBpbiB0aGUgdmlldyBhdCBmaXJzdCB0b3VjaCByZWFkIHJlcGVhdGFibHkgZnJvbSBpdDsga2V5cyBBQlNFTlQgZnJvbSBpdFxuICAgKiBmYWxsIGJhY2sgdG8gTElWRSBzdGF0ZSAodGhlIGVhZ2VyIGVuZ2luZSdzIGV4YWN0IGZhbGxiYWNrIOKAlCBhXG4gICAqIG1pZC1mbGlnaHQgc2libGluZyByb290LWtleSB3cml0ZSB3YXMgYWx3YXlzIHZpc2libGUgdG8gcmVhZHMsIGFuZFxuICAgKiBzdGF5cyB2aXNpYmxlOyBvbmx5IHRoZSBESUZGIEJBU0UgaXMgcGlubmVkKS5cbiAgICovXG4gIHByaXZhdGUgZmlyc3RUb3VjaFN0YXRlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBpZiAoIXRoaXMuc3RhdGVWaWV3KSB7XG4gICAgICB0aGlzLnN0YXRlVmlldyA9IHRoaXMuc2hhcmVkTWVtb3J5LmdldFN0YXRlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlVmlldztcbiAgfVxuXG4gIC8qKiBMYXppbHkgY3JlYXRlcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyIG9uIHRoZSBzdGFnZSdzIEZJUlNUIFdSSVRFICgjMTMpLlxuICAgKlxuICAgKiAgUmVhZHMgTkVWRVIgY29uc3RydWN0IGl0OiByZWFkLXlvdXItd3JpdGVzIG9ubHkgbWF0dGVycyBvbmNlIGEgc3RhZ2VkXG4gICAqICB3cml0ZSBleGlzdHMsIHNvIGJlZm9yZSB0aGF0IHtAbGluayBnZXRWYWx1ZX0ve0BsaW5rIGdldFZhbHVlRGlyZWN0fVxuICAgKiAgc2VydmUgZnJvbSB0aGUgZmlyc3QtdG91Y2ggc3RhdGUgdmlldyBhbmQge0BsaW5rIGNvbW1pdH0gcmVjb3JkcyBhblxuICAgKiAgZW1wdHkgYnVuZGxlIOKAlCBhbGwgd2l0aCBaRVJPIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB0aGUgc2hhcmVkIHN0YXRlLlxuICAgKlxuICAgKiAgVGhlIGJ1ZmZlcidzIGJhc2UgaXMgdGhlIEZJUlNULVRPVUNIIHZpZXcsIE5PVCB0aGUgbGl2ZSBzdGF0ZSBhdCB3cml0ZVxuICAgKiAgdGltZTogdW5kZXIgcGFyYWxsZWwgZm9ya3MgYSBzaWJsaW5nIG1heSBoYXZlIGNvbW1pdHRlZCBiZXR3ZWVuIHRoaXNcbiAgICogIHN0YWdlJ3MgZmlyc3QgcmVhZCBhbmQgdGhpcyB3cml0ZSwgYW5kIHRoZSBuZXQtY2hhbmdlIGRpZmYgYmFzZSBtdXN0XG4gICAqICBzdGF5IGFuY2hvcmVkIGF0IGZpcnN0IHRvdWNoIHRvIG1hdGNoIHRoZSBlYWdlciBlbmdpbmUg4oCUIHNlZVxuICAgKiAge0BsaW5rIGZpcnN0VG91Y2hTdGF0ZX0uICovXG4gIGdldFRyYW5zYWN0aW9uQnVmZmVyKCk6IFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuYnVmZmVyKSB7XG4gICAgICAvLyBQZXItd3JpdGUgcHJvdmVuYW5jZSAoI1AxKTogaGFuZCB0aGUgYnVmZmVyIGEgbGl2ZSB2aWV3IG9mIHRoaXNcbiAgICAgIC8vIHN0YWdlJ3MgcmVhZCBwcmVmaXgg4oCUIGV2YWx1YXRlZCBBVCBFQUNIIFdSSVRFLCBzbyBlYWNoIHN0YWdlZCBvcFxuICAgICAgLy8gY2FwdHVyZXMgZXhhY3RseSB0aGUgcmVhZHMgdGhhdCBwcmVjZWRlZCBpdCAodGVtcG9yYWwgcHJlZml4KS5cbiAgICAgIGNvbnN0IHJlYWRLZXlzUHJvdmlkZXIgPVxuICAgICAgICB0aGlzLndyaXRlUHJvdmVuYW5jZSA9PT0gJ3JlYWRzLXByZWZpeCcgPyAoKSA9PiBbLi4uKHRoaXMuX3Byb3ZlbmFuY2VSZWFkcyA/PyBbXSldIDogdW5kZWZpbmVkO1xuICAgICAgLy8gVGhlIHN0YWdlJ3MgYWRkcmVzcyDigJQgd2hlcmUgYHdpdGhOYW1lc3BhY2VgIHB1dHMgaXRzIHdyaXRlcyAoOS4zMC4wOlxuICAgICAgLy8gdGhlIGFkbWl0dGVkIHJlY29yZCByZWFkcyB0aGUgY29udGFpbmVycyB0aGVyZSBhcyB3aGVyZSB0aGUgc3RhZ2VcbiAgICAgIC8vIHdyaXRlcywgbmV2ZXIgYXMgYSB2YWx1ZSBpdCByZWFkKS5cbiAgICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLnJ1bklkID8gWydydW5zJywgdGhpcy5ydW5JZF0gOiBbXTtcbiAgICAgIHRoaXMuYnVmZmVyID0gbmV3IFRyYW5zYWN0aW9uQnVmZmVyKHRoaXMuZmlyc3RUb3VjaFN0YXRlKCksIHRoaXMuY29tbWl0VmFsdWVzLCByZWFkS2V5c1Byb3ZpZGVyLCBhZGRyZXNzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICB9XG5cbiAgLyoqIEJ1aWxkcyBhbiBhYnNvbHV0ZSBwYXRoIGluc2lkZSB0aGUgc2hhcmVkIG1lbW9yeSAocnVuIG5hbWVzcGFjZSkuICovXG4gIHByaXZhdGUgd2l0aE5hbWVzcGFjZShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLnJ1bklkIHx8IHRoaXMucnVuSWQgPT09ICcnKSB7XG4gICAgICByZXR1cm4gWy4uLnBhdGgsIGtleV07XG4gICAgfVxuICAgIHJldHVybiBbJ3J1bnMnLCB0aGlzLnJ1bklkLCAuLi5wYXRoLCBrZXldO1xuICB9XG5cbiAgLy8g4pSA4pSAIFdyaXRlIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcGF0Y2gocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgc2hvdWxkUmVkYWN0ID0gZmFsc2UpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gdGhpcy5zdGFnZVdyaXRlKHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdzZXQnKTtcbiAgfVxuXG4gIHNldChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIG1lcmdlKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdD86IGJvb2xlYW4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICByZXR1cm4gdGhpcy5zdGFnZVdyaXRlKHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHZhbHVlLCBzaG91bGRSZWRhY3QsICdtZXJnZScpO1xuICB9XG5cbiAgc2V0T2JqZWN0KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uT3ZlcnJpZGU/OiAnc2V0JyB8ICdkZWxldGUnLFxuICApOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICAvLyBFeHBsaWNpdCBkZWxldGlvbiAoU2NvcGVGYWNhZGUuZGVsZXRlVmFsdWUpIHN0YWdlcyBhIGRpc3RpbmN0IG9wIHNvXG4gICAgLy8gZGVsdGEtbW9kZSBjb21taXRzICgjMTNjLUIpIGNhbiBlbWl0IGEgcmVhbCBgZGVsZXRlYCB0cmFjZSBlbnRyeS5cbiAgICAvLyBVbmRlciB0aGUgZGVmYXVsdCAnZnVsbCcgbW9kZSB0aGUgYnVmZmVyIGNvbW1pdHMgaXQgYXMgYVxuICAgIC8vIHNldC1vZi11bmRlZmluZWQg4oCUIGJ5dGUtaWRlbnRpY2FsIHRvIHRoZSBoaXN0b3JpY2FsIGZsYXR0ZW5pbmcuXG4gICAgY29uc3QgdmVyZGljdCA9XG4gICAgICBvcGVyYXRpb25PdmVycmlkZSA9PT0gJ2RlbGV0ZSdcbiAgICAgICAgPyB0aGlzLnN0YWdlV3JpdGUodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSksIHBhdGgsIGtleSwgdW5kZWZpbmVkLCBzaG91bGRSZWRhY3QsICdkZWxldGUnKVxuICAgICAgICA6IHRoaXMuc3RhZ2VXcml0ZSh0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCBvcGVyYXRpb25PdmVycmlkZSA/PyAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCB0YWdnZWQgPSBkZXNjcmlwdGlvbi5zdGFydHNXaXRoKCdbJykgPyBkZXNjcmlwdGlvbiA6IGBbV1JJVEVdICR7ZGVzY3JpcHRpb259YDtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgdGFnZ2VkKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICB1cGRhdGVPYmplY3QoXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgc2hvdWxkUmVkYWN0PzogYm9vbGVhbixcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgdmVyZGljdCA9IHRoaXMubWVyZ2UocGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0KTtcbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHdyaXRlIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcgKyBvbkNvbW1pdCDigJRcbiAgICAvLyBwb2xpY3ktZ2F0ZWQgKCMxM2MtQSksIHNlZSB0cmFja1dyaXRlLlxuICAgIHRoaXMudHJhY2tXcml0ZSh1c2VyS2V5T2YocGF0aCwga2V5KSwgdmFsdWUsIHZlcmRpY3QsICd1cGRhdGUnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIHNldFJvb3Qoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5wYXRjaChbXSwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogUm9vdC1sZXZlbCAodW4tbmFtZXNwYWNlZCkgd3JpdGUg4oCUIHRoZSBzdWJmbG93IHNlZWQgYW5kIG1lcmdlLWJhY2sgcGF0aC4gKi9cbiAgc2V0R2xvYmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0YWdlV3JpdGUoW2tleV0sIFtdLCBrZXksIHZhbHVlLCB1bmRlZmluZWQsICdzZXQnKTtcbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVidWcuYWRkTG9nKCdtZXNzYWdlJywgZGVzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUdsb2JhbENvbnRleHQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gIH1cblxuICBhcHBlbmRUb0FycmF5KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgaXRlbXM6IHVua25vd25bXSwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPSBBcnJheS5pc0FycmF5KGV4aXN0aW5nKSA/IFsuLi5leGlzdGluZywgLi4uaXRlbXNdIDogWy4uLml0ZW1zXTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIG1lcmdlT2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgZGVzY3JpcHRpb24/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuZ2V0VmFsdWUocGF0aCwga2V5KTtcbiAgICBjb25zdCBtZXJnZWQgPVxuICAgICAgZXhpc3RpbmcgJiYgdHlwZW9mIGV4aXN0aW5nID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShleGlzdGluZylcbiAgICAgICAgPyB7IC4uLihleGlzdGluZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksIC4uLm9iaiB9XG4gICAgICAgIDogeyAuLi5vYmogfTtcbiAgICB0aGlzLnNldE9iamVjdChwYXRoLCBrZXksIG1lcmdlZCwgZmFsc2UsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSZWFkIG9wZXJhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEJ1ZmZlci1hd2FyZSByZWFkLCBtaXJyb3JpbmcgdGhlIGVhZ2VyIGVuZ2luZSdzIHJlYWQgb3JkZXIgYnl0ZS1mb3ItYnl0ZTpcbiAgICpcbiAgICogICAgMS4gc3RhZ2VkIHdyaXRlcyArIGZpcnN0LXRvdWNoIHNuYXBzaG90IOKAlCBgYnVmZmVyLmdldGAgb3ZlciBpdHNcbiAgICogICAgICAgd29ya2luZ0NvcHkgd2hlbiB0aGUgYnVmZmVyIGV4aXN0cywgZWxzZSBgbmF0aXZlR2V0YCBvdmVyIHRoZVxuICAgKiAgICAgICB6ZXJvLWNsb25lIHN0YXRlIHZpZXcgKHRoZSBidWZmZXIncyBiYXNlIElTIHRoYXQgdmlldywgc28gdGhlIHR3b1xuICAgKiAgICAgICB0aWVycyBhZ3JlZSBvbiBjb250ZW50KTtcbiAgICogICAgMi4gTElWRSBzdGF0ZSB2aWEgYHNoYXJlZE1lbW9yeS5nZXRWYWx1ZWAgZm9yIGtleXMgYWJzZW50IGZyb20gdGhlXG4gICAqICAgICAgIHNuYXBzaG90IOKAlCBpbmNsdWRpbmcgaXRzIHJ1buKGkmdsb2JhbCBuYW1lc3BhY2UgZmFsbGJhY2suIFRoZSBlYWdlclxuICAgKiAgICAgICBlbmdpbmUgaGFkIHRoaXMgZXhhY3QgbGl2ZSBmYWxsYmFjayBmb3Igc25hcHNob3QtbWlzc2luZyBrZXlzO1xuICAgKiAgICAgICBieXRlLWlkZW50aXR5IG92ZXIgcHVyaXR5LiBBZnRlciB0aGUgc3RhZ2UncyBmaXJzdCB3cml0ZSBzdWNoIGFcbiAgICogICAgICAgdmFsdWUgY2FuIGJlIHRoZSB2ZXJ5IGNvbnRhaW5lciB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIGhvbGRzIGF0XG4gICAqICAgICAgIHRoZSBwYXRoICh0aGUgc3RhZ2UgZGVsZXRlZCBvciB1bnNldCBpdCwgb3IgcmVwbGFjZWQgYSBjb250YWluZXJcbiAgICogICAgICAgYWJvdmUgaXQpLCBzbyB0aGUgYmFzZSBpcyBkZXRhY2hlZCB0aGVyZSBmaXJzdFxuICAgKiAgICAgICAoYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGRldGFjaEJhc2VgKTogYW4gaW4tcGxhY2UgZWRpdCBvZiB0aGUgdmFsdWVcbiAgICogICAgICAgKG91dCBvZiBjb250cmFjdCkgd3JpdHRlbiBiYWNrIGlzIHJlY29yZGVkLCBhcyBvbiA5LjI4LjAsIHdob3NlXG4gICAqICAgICAgIGJhc2Ugd2FzIGEgY2xvbmUgdGFrZW4gYXQgdGhlIGZpcnN0IHdyaXRlLlxuICAgKlxuICAgKiAgUmVhZHMgbmV2ZXIgY29uc3RydWN0IHRoZSBidWZmZXIgKCMxMyk6IGEgc3RhZ2UgdGhhdCBuZXZlciB3cml0ZXNcbiAgICogIHBlcmZvcm1zIHplcm8gY2xvbmVzIG9mIHRoZSBzaGFyZWQgc3RhdGUuICovXG4gIHByaXZhdGUgcmVhZFN0YXRlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICBjb25zdCBuYW1lc3BhY2VkID0gdGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSBhcyBzdHJpbmcpO1xuICAgIGNvbnN0IGZyb21TbmFwc2hvdCA9IHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIuZ2V0KG5hbWVzcGFjZWQpIDogbmF0aXZlR2V0KHRoaXMuZmlyc3RUb3VjaFN0YXRlKCksIG5hbWVzcGFjZWQpO1xuICAgIGlmICh0eXBlb2YgZnJvbVNuYXBzaG90ICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIGZyb21TbmFwc2hvdDtcbiAgICBjb25zdCBsaXZlID0gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0VmFsdWUodGhpcy5ydW5JZCwgcGF0aCwga2V5KTtcbiAgICAvLyBUaWVyIDIgYWZ0ZXIgdGhlIGZpcnN0IHdyaXRlOiBrZWVwIHRoZSBkaWZmIGJhc2UgZXhhY3QgKHNlZSBhYm92ZSkuXG4gICAgaWYgKHRoaXMuYnVmZmVyICYmIGxpdmUgIT09IG51bGwgJiYgdHlwZW9mIGxpdmUgPT09ICdvYmplY3QnKSB0aGlzLmJ1ZmZlci5kZXRhY2hCYXNlKG5hbWVzcGFjZWQpO1xuICAgIHJldHVybiBsaXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrZWQgcmVhZC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIEJPUlJPV0VEIOKAlCBzZWUgdGhlIGNvbnRyYWN0IG9uXG4gICAqIGBTY29wZUZhY2FkZS5nZXRWYWx1ZWAuIFJlYWQtdHJhY2tpbmcgY29zdCBpcyBwb2xpY3ktZ2F0ZWQgKCMxNCk6XG4gICAqIGAnZnVsbCdgIGNsb25lcyB0aGUgdmFsdWUgaW50byBgX3N0YWdlUmVhZHNgIChoaXN0b3JpY2FsIGRlZmF1bHQpLFxuICAgKiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXAgbWFya2VyLCBgJ29mZidgIHJlY29yZHMgbm90aGluZy5cbiAgICovXG4gIGdldFZhbHVlKHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcsIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlYWRTdGF0ZShwYXRoLCBrZXkpO1xuICAgIC8vIFBlci13cml0ZSBwcm92ZW5hbmNlIHJlZ2lzdHJ5ICgjUDEpIOKAlCBrZXkgc3RyaW5ncyBvbmx5LCBpbmRlcGVuZGVudCBvZlxuICAgIC8vIHRoZSByZWFkVHJhY2tpbmcgcmV0ZW50aW9uIGRpYWwgKHdoaWNoIGdvdmVybnMgVkFMVUUgcmV0ZW50aW9uIGJlbG93KS5cbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgdGhpcy53cml0ZVByb3ZlbmFuY2UgPT09ICdyZWFkcy1wcmVmaXgnKSB7XG4gICAgICAodGhpcy5fcHJvdmVuYW5jZVJlYWRzID8/PSBuZXcgU2V0KCkpLmFkZChwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXkpO1xuICAgIH1cbiAgICAvLyBUcmFjayB1c2VyLWxldmVsIHJlYWQgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyDigJQgcmV0YWluZWQgdW5kZXJcbiAgICAvLyB0aGUgcnVsZSdzIHZlcmRpY3QgKDkuMTkuMCk6IGEgcmVkYWN0ZWQga2V5IGlzIHJldGFpbmVkIGFzIHRoZVxuICAgIC8vIHBsYWNlaG9sZGVyLCBhIGZpZWxkLWxldmVsIGtleSBhcyBhIHNjcnViYmVkIGNsb25lLCBuZXZlciB0aGUgc2VjcmV0LlxuICAgIC8vIE5vIHBvbGljeSBhbmQgbm8gbWFya3Mg4oaSIG5vIHZlcmRpY3QgY2FsbCwgbm8gYWxsb2NhdGlvbiAoYWN0aXZlUnVsZSkuXG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmVhZFRyYWNraW5nICE9PSAnb2ZmJykge1xuICAgICAgY29uc3QgcnVsZSA9IHRoaXMuYWN0aXZlUnVsZSgpO1xuICAgICAgaWYgKHBhdGgubGVuZ3RoID4gMCkgKHRoaXMuX25lc3RlZFJlYWRzID8/PSBuZXcgU2V0KCkpLmFkZCh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gICAgICBlbHNlIGlmICh0aGlzLnJlYWRUcmFja2luZyA9PT0gJ2Z1bGwnICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5fdmlld1JlYWRzPy5kZWxldGUoa2V5KTtcbiAgICAgICAgZWxzZSAodGhpcy5fdmlld1JlYWRzID8/PSBuZXcgU2V0KCkpLmFkZChrZXkpO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3RhZ2VSZWFkc1t1c2VyS2V5T2YocGF0aCwga2V5KV0gPVxuICAgICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IHRoaXMucmV0YWluZWRGb3JtKFxuICAgICAgICAgICAgICBydWxlICE9PSB1bmRlZmluZWQgPyBydWxlLnZlcmRpY3RBdChwYXRoLCBrZXkpIDogQ0xFQVIsXG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICB0aGlzLnJlYWRUcmFja2luZyxcbiAgICAgICAgICAgICAgc3VtbWFyaXplUmVhZFZhbHVlLFxuICAgICAgICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGBbUkVBRF0gJHtkZXNjcmlwdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqIFJlYWQgc3RhdGUgd2l0aG91dCB0cmFja2luZyBpbiBfc3RhZ2VSZWFkcyBvciBwYXlpbmcgc3RydWN0dXJlZENsb25lIGNvc3QuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlLmdldFZhbHVlU2lsZW50KCkgZm9yIGFycmF5IHByb3h5IGludGVybmFsIG9wZXJhdGlvbnMuICovXG4gIGdldFZhbHVlRGlyZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkU3RhdGUocGF0aCwga2V5KTtcbiAgfVxuXG4gIGdldFJvb3Qoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0VmFsdWUodGhpcy5ydW5JZCwgW10sIGtleSk7XG4gIH1cblxuICBnZXRHbG9iYWwoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0VmFsdWUoJycsIFtdLCBrZXkpO1xuICB9XG5cbiAgZ2V0U2NvcGUoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLnNoYXJlZE1lbW9yeS5nZXRTdGF0ZSgpO1xuICB9XG5cbiAgZ2V0UnVuSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5ydW5JZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBDb21taXQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDI6IHJlY29yZCB0aGF0IHRoaXMgc3RhZ2UgY29uc3VtZWQgYW4gdW50cmFja2VkIHJlYWQgcGF0aC5cbiAgICogQ2FsbGVkIGJ5IGBTY29wZUZhY2FkZWAgKGBnZXRBcmdzYC9gZ2V0RW52YC91bnNoYWRvd2VkIGBnZXRWYWx1ZVNpbGVudGApO1xuICAgKiBzdXJmYWNlZCBhcyBgQ29tbWl0QnVuZGxlLnVudHJhY2tlZFNvdXJjZXNgIG9uIHRoaXMgc3RhZ2UncyBjb21taXQuXG4gICAqL1xuICBtYXJrVW50cmFja2VkU291cmNlKHNvdXJjZTogVW50cmFja2VkU291cmNlKTogdm9pZCB7XG4gICAgKHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPz89IG5ldyBTZXQoKSkuYWRkKHNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogUkZDLTAwMyBEMjogdGhlIGB1bnRyYWNrZWRTb3VyY2VzYCBidW5kbGUgZnJhZ21lbnQgZm9yIGNvbW1pdCgpIOKAlCBge31gXG4gICAqIHdoZW4gbm90aGluZyB3YXMgbWFya2VkLCBzbyB0aGUgc3ByZWFkIGtlZXBzIHRoZSBmaWVsZCBBQlNFTlQgKG5vdFxuICAgKiBlbXB0eS1hcnJheS12YWx1ZWQpIGFuZCB1bnRvdWNoZWQgY2hhcnRzIHN0YXkgYnl0ZS1pZGVudGljYWwuXG4gICAqL1xuICBwcml2YXRlIHVudHJhY2tlZFNvdXJjZXNGcmFnbWVudCgpOiB7IHVudHJhY2tlZFNvdXJjZXM/OiBVbnRyYWNrZWRTb3VyY2VbXSB9IHtcbiAgICBpZiAoIXRoaXMuX3VudHJhY2tlZFNvdXJjZXMgfHwgdGhpcy5fdW50cmFja2VkU291cmNlcy5zaXplID09PSAwKSByZXR1cm4ge307XG4gICAgcmV0dXJuIHsgdW50cmFja2VkU291cmNlczogWy4uLnRoaXMuX3VudHJhY2tlZFNvdXJjZXNdIH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIGB0YWdzYCBidW5kbGUgZnJhZ21lbnQgZm9yIGNvbW1pdCgpIOKAlCBge31gIHdoZW4gdGhlIHN0YWdlIGRlY2xhcmVzXG4gICAqIG5vbmUsIHNvIGFuIHVudGFnZ2VkIGNoYXJ0J3MgbG9nIGlzIGJ5dGUtaWRlbnRpY2FsIHRvIDkuMjAuMC4gQWRkZWQgYWZ0ZXJcbiAgICogdGhlIHBheWxvYWQgZW5jb2RpbmcsIHNvIGl0IGlzIGluZGVwZW5kZW50IG9mIGBjb21taXRWYWx1ZXNgOyBuYW1lcywgc29cbiAgICogcmVkYWN0aW9uIG5ldmVyIHNlZXMgaXQuXG4gICAqL1xuICBwcml2YXRlIHRhZ3NGcmFnbWVudCgpOiB7IHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXSB9IHtcbiAgICBpZiAoIXRoaXMudGFncyB8fCB0aGlzLnRhZ3MubGVuZ3RoID09PSAwKSByZXR1cm4ge307XG4gICAgcmV0dXJuIHsgdGFnczogdGhpcy50YWdzIH07XG4gIH1cblxuICAvKiogUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgdGhhdCBmaXJlcyBhZnRlciBjb21taXQoKSBhcHBsaWVzIHBhdGNoZXMuXG4gICAqICBVc2VkIGJ5IFNjb3BlRmFjYWRlIHRvIGRpc3BhdGNoIFNjb3BlUmVjb3JkZXIub25Db21taXQgZXZlbnRzLiAqL1xuICBzZXRDb21taXRPYnNlcnZlcihcbiAgICBvYnNlcnZlcjogKG11dGF0aW9uczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogdW5rbm93bjsgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScgfT4pID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIHRoaXMuX2NvbW1pdE9ic2VydmVyID0gb2JzZXJ2ZXI7XG4gIH1cblxuICAvKipcbiAgICogRGV2LW1vZGUgb25seTogZGlkIHRoaXMgc3RhZ2UgY2hhbmdlLCBJTiBQTEFDRSwgYSB2YWx1ZSBpdCBtZXJlbHkgUkVBRD9cbiAgICpcbiAgICogVGhlIHR5cGVkIHNjb3BlIGludGVyY2VwdHMgZXZlcnkgd3JpdGUgaXQgY2FuIHJlYWNoIOKAlCBhIHByb3BlcnR5IGF0IGFueVxuICAgKiBkZXB0aCwgYW4gaW5kZXhlZCBlbGVtZW50LCBhbiBhcnJheSBtZXRob2QuIFdoYXQgaXQgY2Fubm90IHJlYWNoIGlzIGFuXG4gICAqIGVsZW1lbnQgaGFuZGVkIG91dCBieSBhIHJlYWQgbWV0aG9kIChgZmluZGAsIGBmaWx0ZXJgLCBgZm9y4oCmb2ZgLFxuICAgKiBgZm9yRWFjaGAsIGRlc3RydWN0dXJpbmcpOiB3cmFwcGluZyB0aG9zZSB3b3VsZCBtZWFuIHJldHVybmluZyBwcm94aWVzIG91dFxuICAgKiBvZiBldmVyeSByZWFkLCB3aGljaCBpcyBhIGNvc3QgdGhlIGxpYnJhcnkgc2hvdWxkIG5vdCBwYXkuIFNvIHRoYXQgZmFtaWx5XG4gICAqIGlzIFdBUk5FRCBBQk9VVCByYXRoZXIgdGhhbiBpbnRlcmNlcHRlZCDigJQgbG91ZGx5LCBoZXJlLCBpbnN0ZWFkIG9mIGVuZGluZ1xuICAgKiB0aGUgcnVuIHdpdGggYSBjb21taXQgbG9nIHRoYXQgc2lsZW50bHkgZGlzYWdyZWVzIHdpdGggZmluYWwgc3RhdGUuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBSRVBPUlQgYWZ0ZXIgdGhlIGZhY3QsIG5vdCBhIHJlZnVzYWwgYXQgdGhlIHdyaXRlOiB0aGUgd3JpdGUgaGFzXG4gICAqIGFscmVhZHkgaGFwcGVuZWQgaW4gcGxhY2UgYW5kIHRoZXJlIGlzIG5vdGhpbmcgdG8gaW50ZXJjZXB0LiBJdCBydW5zIHVuZGVyXG4gICAqIFRXTyBwcmVjb25kaXRpb25zLCBib3RoIG5hbWVkIGluIHRoZSBSRUFETUUg4oCUIGBlbmFibGVEZXZNb2RlKClgLCBhbmRcbiAgICogYHJlYWRUcmFja2luZzogJ2Z1bGwnYCAodGhlIGRlZmF1bHQpLCBiZWNhdXNlIHRoZSBjb21wYXJpc29uIG5lZWRzIHRoZVxuICAgKiBjbG9uZSBvZiB0aGUgdmFsdWUgdGhhdCBtb2RlIHJldGFpbnMgYXQgcmVhZCB0aW1lLiBBIGtleSB0aGUgc3RhZ2UgbmV2ZXJcbiAgICogc3RhZ2VkIG11c3Qgc3RpbGwgaG9sZCB0aGF0IGNsb25lIOKAlCBjb21taXR0ZWQgc3RhdGUgaXMgaW1tdXRhYmxlLWFmdGVyLXN3YXBcbiAgICogYW5kIHRoZSBidWZmZXIncyB3b3JraW5nIGNvcHkgaXMgcHJpdmF0ZSB0byB0aGlzIHN0YWdlLiBLZXlzIHRoZSBzdGFnZSBESURcbiAgICogc3RhZ2UgYXJlIHNraXBwZWQgKHRoZXkgYXJlIGV4cGVjdGVkIHRvIGRpZmZlciwgYW5kIHRoZXkgYXJlIGluIHRoZSByZWNvcmQpLFxuICAgKiBzbyBhcmUga2V5cyB1bmRlciBhIHJlZGFjdGlvbiB2ZXJkaWN0LCB3aG9zZSByZXRhaW5lZCBmb3JtIGlzIGRlbGliZXJhdGVseVxuICAgKiBub3QgdGhlIHZhbHVlLCBhbmQgc28gYXJlIGtleXMgcmVhZCBhdCBhIG5lc3RlZCBwYXRoIChgX25lc3RlZFJlYWRzYCkg4oCUXG4gICAqIHRob3NlIGFyZSBlbmdpbmUgcmVhZHMgKHRoZSBzdWJmbG93IG1lcmdlLWJhY2spLCBub3QgdXNlciByZWFkcy5cbiAgICpcbiAgICogSXQgYWxzbyBvbmx5IGxvb2tzIGF0IGtleXMgc2VydmVkIGZyb20gdGhlIFBJTk5FRCBzb3VyY2Ug4oCUIHRoZSBmaXJzdC10b3VjaFxuICAgKiB2aWV3IG9yIHRoaXMgc3RhZ2UncyBvd24gYnVmZmVyLiBBIGtleSBhYnNlbnQgZnJvbSBib3RoIHdhcyBzZXJ2ZWQgYnlcbiAgICogYHJlYWRTdGF0ZWAncyBsaXZlIGZhbGxiYWNrLCB3aGljaCBhIHBhcmFsbGVsIHNpYmxpbmcncyByb290LWtleSBjb21taXQgY2FuXG4gICAqIGxlZ2l0aW1hdGVseSBtb3ZlOyBhY2N1c2luZyB0aGUgc3RhZ2UgdGhlcmUgd291bGQgYmUgYSBmYWxzZSBhbGFybS4gRm9yXG4gICAqIHRoZSBzYW1lIHJlYXNvbiBpdCBydW5zIG9uIHRoZSBmcmFtZSdzIEZJUlNUIGNvbW1pdCBvbmx5OiB0aGUgcmVhZHMgYmVsb25nXG4gICAqIHRvIHRoYXQgcm91bmQsIGFuZCBieSB0aGUgZW5naW5lJ3Mgc2Vjb25kIHJvdW5kIChhIGZvcmsgZG91YmxlLWNvbW1pdCwgYVxuICAgKiBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGNvbW1pdHRlZCBicmFuY2ggcGFyZW50KSBvdGhlciBzdGFnZXMgaGF2ZVxuICAgKiBsZWdpdGltYXRlbHkgbW92ZWQgdGhlIHN0YXRlIHRoZXkgd2VyZSBjb21wYXJlZCBhZ2FpbnN0LlxuICAgKlxuICAgKiBBIGtleSB0aGUgc3RhZ2UgRElEIHN0YWdlIGlzIHN0aWxsIGNoZWNrZWQgd2hlbiBpdHMgbGFzdCByZWFkIGNhbWUgZnJvbVxuICAgKiBjb21taXR0ZWQgc3RhdGUgKHtAbGluayBfdmlld1JlYWRzfSDigJQgcmVhZCBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlKTpcbiAgICogdGhhdCByZWFkIHdhcyB0aGUgY29tbWl0dGVkIG9iamVjdCBpdHNlbGYsIGFuZCB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIElTXG4gICAqIHRoYXQgb2JqZWN0IChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLCBzbyBhbiBpbi1wbGFjZSBlZGl0IGZvbGxvd2VkIGJ5IGFcbiAgICogd3JpdGUgb2YgdGhlIGtleSBjb21taXRzIE5PIGNoYW5nZSDigJQgbGl2ZSBzdGF0ZSBrZWVwcyB0aGUgZWRpdCwgdGhlIGxvZ1xuICAgKiBkb2VzIG5vdC4gQ29tcGFyZWQgYWdhaW5zdCBjb21taXR0ZWQgc3RhdGUsIG5vdCB0aGUgd3JpdHRlbiB2YWx1ZSwgc28gYVxuICAgKiBsZWdpdGltYXRlIHdyaXRlIG5ldmVyIHRyaXBzIGl0LlxuICAgKlxuICAgKiBDb3N0cyBub3RoaW5nIG91dHNpZGUgYGVuYWJsZURldk1vZGUoKWAuXG4gICAqL1xuICBwcml2YXRlIHdhcm5PbkJvcnJvd2VkTXV0YXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCFpc0Rldk1vZGUoKSB8fCB0aGlzLnJlYWRUcmFja2luZyAhPT0gJ2Z1bGwnIHx8IHRoaXMuX2NvbW1pdHRlZCkgcmV0dXJuO1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLl9zdGFnZVJlYWRzKSkge1xuICAgICAgY29uc3QgcmV0YWluZWQgPSB0aGlzLl9zdGFnZVJlYWRzW2tleV07XG4gICAgICAvLyBPbmx5IGEgY29udGFpbmVyIGNhbiBiZSBtdXRhdGVkIGluIHBsYWNlOyBhIHByaW1pdGl2ZSByZWFkIGNhbm5vdC5cbiAgICAgIGlmIChyZXRhaW5lZCA9PT0gbnVsbCB8fCB0eXBlb2YgcmV0YWluZWQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLl9uZXN0ZWRSZWFkcz8uaGFzKGtleSkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHJ1bGUgIT09IHVuZGVmaW5lZCAmJiBydWxlLnZlcmRpY3RBdChbXSwga2V5KS5raW5kICE9PSAnY2xlYXInKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZWQgPSB0aGlzLndpdGhOYW1lc3BhY2UoW10sIGtleSk7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3N0YWdlV3JpdGVzLCBrZXkpIHx8IHRoaXMuYnVmZmVyPy53YXNTdGFnZWQobmFtZXNwYWNlZCkpIHtcbiAgICAgICAgdGhpcy53YXJuT25Db21taXR0ZWRNdXRhdGlvbihrZXksIG5hbWVzcGFjZWQsIHJldGFpbmVkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBwaW5uZWQgc291cmNlIG9ubHkg4oCUIHNlZSB0aGUgbm90ZSBvbiB0aGUgbGl2ZSBmYWxsYmFjayBhYm92ZS5cbiAgICAgIC8vIGBwZWVrYCwgbm90IGBnZXRgOiBhIHJlcG9ydCBjb21wYXJlcywgYW5kIG11c3Qgbm90IHRha2UgdGhlIHByaXZhdGVcbiAgICAgIC8vIGNvcHkgYSBzdGFnZSdzIHJlYWQgd291bGQgKGNvcHktb24td3JpdGUsIDkuMjkuMCkuXG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5idWZmZXIgPyB0aGlzLmJ1ZmZlci5wZWVrKG5hbWVzcGFjZWQpIDogbmF0aXZlR2V0KHRoaXMuZmlyc3RUb3VjaFN0YXRlKCksIG5hbWVzcGFjZWQpO1xuICAgICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHBhdGggPSBmaXJzdERpZmZlcmluZ1BhdGgocmV0YWluZWQsIGN1cnJlbnQpO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKGJvcnJvd2VkTXV0YXRpb25NZXNzYWdlKHRoaXMuc3RhZ2VOYW1lLCBrZXksIHBhdGgpKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIHN0YWdlZC1rZXkgaGFsZiBvZiB7QGxpbmsgd2Fybk9uQm9ycm93ZWRNdXRhdGlvbn06IGRpZCBjb21taXR0ZWQgc3RhdGUgaXRzZWxmIG1vdmUgdW5kZXIgYSByZWFkPyAqL1xuICBwcml2YXRlIHdhcm5PbkNvbW1pdHRlZE11dGF0aW9uKGtleTogc3RyaW5nLCBuYW1lc3BhY2VkOiBzdHJpbmdbXSwgcmV0YWluZWQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3ZpZXdSZWFkcz8uaGFzKGtleSkpIHJldHVybjtcbiAgICBjb25zdCBjb21taXR0ZWQgPSBuYXRpdmVHZXQodGhpcy5maXJzdFRvdWNoU3RhdGUoKSwgbmFtZXNwYWNlZCk7XG4gICAgaWYgKGNvbW1pdHRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgY29uc3QgcGF0aCA9IGZpcnN0RGlmZmVyaW5nUGF0aChyZXRhaW5lZCwgY29tbWl0dGVkKTtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oY29tbWl0dGVkTXV0YXRpb25NZXNzYWdlKHRoaXMuc3RhZ2VOYW1lLCBrZXksIHBhdGgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGbHVzaCBzdGFnZWQgd3JpdGVzIHRvIHNoYXJlZCBtZW1vcnkgYW5kIFJFTEVBU0UgdGhlIHBlci1zdGFnZSBzdGFnaW5nXG4gICAqIHN0YXRlICgjMTNiKS5cbiAgICpcbiAgICogQ29tbWl0IGlzIHRoZSBzdGFnZSdzIGxpZmVjeWNsZSBlbmQ6IGBidWZmZXJgIChpdHMgd29ya2luZyBjb3B5IGFuZFxuICAgKiB3aGF0ZXZlciBwcml2YXRlIGNvcGllcyBpdHMgcmVhZHMgdG9vaykgYW5kIGBzdGF0ZVZpZXdgIChhIHJlZmVyZW5jZSB0aGF0XG4gICAqIHBpbnMgb25lIGNvbW1pdHRlZC1zdGF0ZSBHRU5FUkFUSU9OKSBhcmUgb25seSBuZWVkZWQgRFVSSU5HIGV4ZWN1dGlvbixcbiAgICogYXMgdGhlIHJlYWQgc25hcHNob3QgKyBuZXQtY2hhbmdlIGRpZmYgYmFzZS4gVGhlIGV4ZWN1dGlvbiB0cmVlIHJldGFpbnNcbiAgICogZXZlcnkgU3RhZ2VDb250ZXh0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHJ1biwgc28gV0lUSE9VVCB0aGUgcmVsZWFzZSBhXG4gICAqIGxvbmcgbG9vcCByZXRhaW5zIG9uZSBzdGF0ZSBnZW5lcmF0aW9uIHBlciBleGVjdXRlZCBzdGFnZSDigJQgbWVhc3VyZWRcbiAgICogTyhOwrIpIGJlZm9yZSBjb3B5LW9uLXdyaXRlICg5LjI5LjApLCB3aGVuIGVhY2ggZ2VuZXJhdGlvbiBhbmQgZWFjaFxuICAgKiBidWZmZXIgd2FzIGEgd2hvbGUtc3RhdGUgY2xvbmU6IDU2My44TUIgYXQgTj0yMDAgb24gYW4gYWdlbnQtc3R5bGVcbiAgICogY2hhcnQ7IGEgNTAwLWl0ZXJhdGlvbiBhZ2VudCBPT01lZCBhIGRlZmF1bHQgTm9kZSBoZWFwIChiYWNrbG9nICMxOCkuXG4gICAqIEdlbmVyYXRpb25zIG5vdyBzaGFyZSBldmVyeSB1bmNoYW5nZWQgc3VidHJlZSwgYnV0IGEgcGlubmVkIG9uZSBzdGlsbFxuICAgKiBrZWVwcyB0aGUgY29udGFpbmVycyBsYXRlciBjb21taXRzIHJlcGxhY2VkIGFsaXZlLlxuICAgKlxuICAgKiBSRS1VU0UgQUZURVIgQ09NTUlUIHN0YXlzIGNvcnJlY3QgYmVjYXVzZSBib3RoIGZpZWxkcyByZS1jcmVhdGUgbGF6aWx5OlxuICAgKiAtIGEgbGF0ZXIgUkVBRCByZS1hbmNob3JzIHZpYSB7QGxpbmsgZmlyc3RUb3VjaFN0YXRlfSBvbiB0aGUgQ1VSUkVOVFxuICAgKiAgIGNvbW1pdHRlZCBzdGF0ZSAod2hpY2ggaW5jbHVkZXMgdGhpcyBzdGFnZSdzIG93biBmbHVzaGVkIHdyaXRlcyk7XG4gICAqIC0gYSBsYXRlciBXUklURSBjb25zdHJ1Y3RzIGEgZnJlc2ggYnVmZmVyIG9uIHRoYXQgcmUtYW5jaG9yZWQgdmlldywgc28gYVxuICAgKiAgIHNlY29uZCBjb21taXQgZGlmZnMgYWdhaW5zdCBwb3N0LWZpcnN0LWNvbW1pdCBzdGF0ZS4gVGhlIHByZS1yZWxlYXNlXG4gICAqICAgYnVmZmVyIGJlaGF2ZWQgdGhlIHNhbWUgZm9yIFZBTFVFUyAoaXRzIGB3b3JraW5nQ29weWAgd2FzIHJlc2V0IG9uXG4gICAqICAgY29tbWl0LCBmYWxsaW5nIHJlYWRzIHRocm91Z2ggdG8gbGl2ZSBzdGF0ZSkgYnV0IGtlcHQgdGhlIE9SSUdJTkFMXG4gICAqICAgYGJhc2VTbmFwc2hvdGAgYXMgZGlmZiBiYXNlIOKAlCB1bnJlYWNoYWJsZSBpbiBwcmFjdGljZTogdGhlIGVuZ2luZSdzXG4gICAqICAgb25seSB3cml0ZXMgYWZ0ZXIgYSBjb21taXQgYXJlIHRoZSBzdWJmbG93IG1lcmdlLWJhY2sgaW50byBhIGNvbW1pdHRlZFxuICAgKiAgIGJyYW5jaCBwYXJlbnQgKGEgZGVjaWRlciBvciBmb3JrIGZyYW1lIGNvbW1pdHMgYmVmb3JlIGl0cyBicmFuY2ggcnVucylcbiAgICogICBhbmQgdGhlIGZvcmsgY2hpbGQncyB0aHJvdHRsZSBtYXJrZXI7IHRoZSBvdGhlciBcIndyaXRlIGFmdGVyIGNvbW1pdFwiXG4gICAqICAgc2l0ZXMgKFN1YmZsb3dFeGVjdXRvciBzZWVkIOKGkiByZXBsYWNlcyB0aGUgY29udGV4dDsgcmVzdW1lIOKGkiBmcmVzaFxuICAgKiAgIGNvbnRleHQgdmlhIGBsZWFmLmNyZWF0ZU5leHRgKSBuZXZlciByZS11c2UgYSBjb21taXR0ZWQgY29udGV4dC5cbiAgICogLSBBIFVTRVIgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgaXMgYSBkaWZmZXJlbnQgbWF0dGVyOiBpdHMgd3JpdGVzXG4gICAqICAgd291bGQgbGFuZCBpbiBhIGJ1ZmZlciBub3RoaW5nIGV2ZXIgY29tbWl0cy4gVGhhdCByZWZ1c2FsIGxpdmVzIG9uIHRoZVxuICAgKiAgIHNjb3BlIHRpZXIgKGBTY29wZUZhY2FkZWAsIHNlYWxlZCBieSB0aGUgY29tbWl0IG9ic2VydmVyIOKAlCA5LjIyLjApLFxuICAgKiAgIGJlY2F1c2UgdGhlIGZyYW1lJ3MgcmUtdXNhYmlsaXR5IGlzIGV4YWN0bHkgd2hhdCB0aGUgZW5naW5lIHBhdGhzXG4gICAqICAgYWJvdmUgbmVlZC5cbiAgICogLSBgX3N0YWdlV3JpdGVzYCAvIGBfc3RhZ2VSZWFkc2AgYXJlIE5PVCByZWxlYXNlZCDigJQgYHNuYXBzaG90U2VsZigpYFxuICAgKiAgIHJlYWRzIHRoZW0gcG9zdC1ydW4gZm9yIHRoZSBleGVjdXRpb24tdHJlZSBzbmFwc2hvdC5cbiAgICovXG4gIGNvbW1pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1hdGVyaWFsaXNlV3JpdGVzKCk7XG4gICAgdGhpcy53YXJuT25Cb3Jyb3dlZE11dGF0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmJ1ZmZlcikge1xuICAgICAgLy8gVHJ1bHktbGF6eSBmYXN0IHBhdGggKCMxMyk6IG5vIHdyaXRlIGV2ZXIgY29uc3RydWN0ZWQgdGhlIGJ1ZmZlciwgc29cbiAgICAgIC8vIHRoZSBzdGFnZSdzIG5ldCBjaGFuZ2UgaXMgZW1wdHkgQlkgQ09OU1RSVUNUSU9OLiBTYW1lIG9ic2VydmFibGVcbiAgICAgIC8vIG91dGNvbWUgYXMgYW4gZW1wdHkgY29tbWl0IOKAlCB0aGUgKGVtcHR5KSBidW5kbGUgaXMgc3RpbGwgcmVjb3JkZWQgc29cbiAgICAgIC8vIGV2ZXJ5IGV4ZWN1dGVkIHN0YWdlIHJlbWFpbnMgYSB0aW1lLXRyYXZlbCBjdXJzb3Igc3RvcCDigJQgYnV0IHdpdGhcbiAgICAgIC8vIFpFUk8gY2xvbmVzOiBubyBidWZmZXIgY29uc3RydWN0aW9uLCBubyBhcHBseVBhdGNoIHJlcGxheS5cbiAgICAgIHRoaXMuZXZlbnRMb2c/LnJlY29yZCh7XG4gICAgICAgIG92ZXJ3cml0ZToge30sXG4gICAgICAgIHVwZGF0ZXM6IHt9LFxuICAgICAgICByZWRhY3RlZFBhdGhzOiBbXSxcbiAgICAgICAgdHJhY2U6IFtdLFxuICAgICAgICBzdGFnZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICAgIHN0YWdlSWQ6IHRoaXMuc3RhZ2VJZCxcbiAgICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgICAgIC4uLnRoaXMudW50cmFja2VkU291cmNlc0ZyYWdtZW50KCksXG4gICAgICAgIC4uLnRoaXMudGFnc0ZyYWdtZW50KCksXG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLl9jb21taXRPYnNlcnZlcikge1xuICAgICAgICB0aGlzLl9jb21taXRPYnNlcnZlcih7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH0pO1xuICAgICAgfVxuICAgICAgLy8gIzEzYjogZHJvcCB0aGUgZmlyc3QtdG91Y2ggdmlldyDigJQgYSByZWFkLW9ubHkgc3RhZ2Ugc3RpbGwgcGlubmVkIG9uZVxuICAgICAgLy8gZnVsbCBzdGF0ZSBnZW5lcmF0aW9uIHRocm91Z2ggaXQuIEQyIG1hcmtlcnMgcmVsZWFzZSB3aXRoIGl0LCBhbmQgc29cbiAgICAgIC8vIGRvIHRoZSBkZWNsYXJlZCB0YWdzIChhbiBlbXB0eSBjb21taXQgaXMgYSBkZWxpYmVyYXRlLCB0YWdnZWQgc3RvcCDigJRcbiAgICAgIC8vIG9uY2UpLlxuICAgICAgdGhpcy5zdGF0ZVZpZXcgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl91bnRyYWNrZWRTb3VyY2VzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy50YWdzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fY29tbWl0dGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBidW5kbGUgPSB0aGlzLmJ1ZmZlci5jb21taXQoKTtcbiAgICBjb25zdCBjb21taXRCdW5kbGUgPSB7XG4gICAgICAuLi5idW5kbGUsXG4gICAgICBzdGFnZTogdGhpcy5zdGFnZU5hbWUsXG4gICAgICBzdGFnZUlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCxcbiAgICAgIC4uLnRoaXMudW50cmFja2VkU291cmNlc0ZyYWdtZW50KCksXG4gICAgICAuLi50aGlzLnRhZ3NGcmFnbWVudCgpLFxuICAgIH07XG5cbiAgICB0aGlzLnNoYXJlZE1lbW9yeS5hcHBseVBhdGNoKGNvbW1pdEJ1bmRsZS5vdmVyd3JpdGUsIGNvbW1pdEJ1bmRsZS51cGRhdGVzLCBjb21taXRCdW5kbGUudHJhY2UpO1xuXG4gICAgLy8gQWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzIGZlZWQgdGhyZWUgY29uc3VtZXJzOlxuICAgIC8vICAgMS4gdGhlIHBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciAoaWYgZW5hYmxlZClcbiAgICAvLyAgIDIuIHRoZSBldmVudCBsb2cgKHBlcnNpc3RlZCB0cmFjZSlcbiAgICAvLyAgIDMuIChmdXR1cmUpIGFueXRoaW5nIGVsc2UgdGhhdCB3YW50cyBhIHNjcnViYmVkIHZpZXcgYXQgY29tbWl0IHRpbWVcbiAgICAvLyBDb21wdXRpbmcgb25jZSBrZWVwcyBjb3N0IGxpbmVhciBpbiB0aGUgY29tbWl0IHNpemU7IG5vIHBvc3QtcGFzcyB3YWxrLlxuICAgIGNvbnN0IHJlZGFjdGVkT3ZlcndyaXRlID0gcmVkYWN0UGF0Y2goY29tbWl0QnVuZGxlLm92ZXJ3cml0ZSwgY29tbWl0QnVuZGxlLnJlZGFjdGVkUGF0aHMpO1xuICAgIGNvbnN0IHJlZGFjdGVkVXBkYXRlcyA9IHJlZGFjdFBhdGNoKGNvbW1pdEJ1bmRsZS51cGRhdGVzLCBjb21taXRCdW5kbGUucmVkYWN0ZWRQYXRocyk7XG5cbiAgICB0aGlzLnJlZGFjdGVkU2hhcmVkTWVtb3J5Py5hcHBseVBhdGNoKHJlZGFjdGVkT3ZlcndyaXRlLCByZWRhY3RlZFVwZGF0ZXMsIGNvbW1pdEJ1bmRsZS50cmFjZSk7XG5cbiAgICB0aGlzLmV2ZW50TG9nPy5yZWNvcmQoe1xuICAgICAgLi4uY29tbWl0QnVuZGxlLFxuICAgICAgcmVkYWN0ZWRQYXRoczogQXJyYXkuZnJvbShjb21taXRCdW5kbGUucmVkYWN0ZWRQYXRocy52YWx1ZXMoKSksXG4gICAgICBvdmVyd3JpdGU6IHJlZGFjdGVkT3ZlcndyaXRlLFxuICAgICAgdXBkYXRlczogcmVkYWN0ZWRVcGRhdGVzLFxuICAgIH0pO1xuXG4gICAgLy8gTm90aWZ5IG9ic2VydmVyIChTY29wZUZhY2FkZSkgd2l0aCB0cmFja2VkIG11dGF0aW9uc1xuICAgIGlmICh0aGlzLl9jb21taXRPYnNlcnZlcikge1xuICAgICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIoeyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9KTtcbiAgICB9XG5cbiAgICAvLyAjMTNiOiByZWxlYXNlIHRoZSBzdGFnaW5nIHN0YXRlIOKAlCBzZWUgdGhlIG1ldGhvZCBKU0RvYy4gRG9uZSBMQVNUIHNvXG4gICAgLy8gdGhlIGNvbW1pdCBvYnNlcnZlciBzZWVzIHRoZSBleGFjdCBzYW1lIHdvcmxkIGFzIGJlZm9yZSB0aGUgcmVsZWFzZS5cbiAgICAvLyBEMidzIHVudHJhY2tlZC1zb3VyY2UgbWFya2VycyByZWxlYXNlIHdpdGggaXQ6IHRoZSByb3V0aW5lXG4gICAgLy8gZG91YmxlLWNvbW1pdCBwYXRocyB0aGVuIHJlY29yZCB0aGUgZmllbGQgZXhhY3RseSBvbmNlLiBEZWNsYXJlZCB0YWdzXG4gICAgLy8gcmVsZWFzZSBvbiB0aGUgc2FtZSBsYXc6IG9uZSBzdGFtcCBwZXIgZXhlY3V0aW9uIG9mIHRoZSBzdGFnZS5cbiAgICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnN0YXRlVmlldyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl91bnRyYWNrZWRTb3VyY2VzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMudGFncyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9jb21taXR0ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93IGF3YXkgZXZlcnl0aGluZyB0aGlzIHN0YWdlIGhhcyBTVEFHRUQsIHdpdGhvdXQgY29tbWl0dGluZyBhbnkgb2YgaXQuXG4gICAqXG4gICAqIFRoZSBpc29sYXRpb24gcHJpbWl0aXZlIGJlaGluZCBkZWNsYXJhdGl2ZSByZXRyeTogd2hlbiBhIG5vbi1maW5hbCBhdHRlbXB0XG4gICAqIGZhaWxzLCB0aGUgd3JpdGVzIGl0IHN0YWdlZCBtdXN0IG5vdCBiZSB2aXNpYmxlIHRvIHRoZSBuZXh0IGF0dGVtcHQsIG11c3RcbiAgICogbm90IHJlYWNoIHNoYXJlZCBzdGF0ZSwgYW5kIG11c3Qgbm90IGFwcGVhciBpbiB0aGUgY29tbWl0IGxvZyBvciBpbiB0aGlzXG4gICAqIHN0YWdlJ3Mgc25hcHNob3QuIERyb3BwaW5nIHRoZSBzdGFnaW5nIHN0YXRlIGFjaGlldmVzIGFsbCBmb3VyIGF0IG9uY2Ug4oCUXG4gICAqIHRoZXJlIGlzIG5vIHJvbGxiYWNrIG1hY2hpbmVyeSB0byBpbnZva2UgYmVjYXVzZSBub3RoaW5nIHdhcyBldmVyIGFwcGxpZWRcbiAgICogKE0xOiB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyIGhvbGRzIHdyaXRlcyB1bnRpbCBgY29tbWl0KClgIGZsdXNoZXMgdGhlbSkuXG4gICAqXG4gICAqIFdoYXQgaXMgcmVsZWFzZWQsIGFuZCB3aHkgZWFjaCBvbmUgbWF0dGVycyBmb3IgdGhlIG5leHQgYXR0ZW1wdDpcbiAgICogIC0gYGJ1ZmZlcmAgICAgICDigJQgdGhlIHN0YWdlZCB3cml0ZXMgdGhlbXNlbHZlczsgdGhlIG5leHQgYXR0ZW1wdCBzdGFydHNcbiAgICogICAgICAgICAgICAgICAgICAgIHdpdGggbm90aGluZyBzdGFnZWQ7XG4gICAqICAtIGBzdGF0ZVZpZXdgICAg4oCUIHRoZSBmaXJzdC10b3VjaCBhbmNob3I7IHRoZSBuZXh0IGF0dGVtcHQgcmUtYW5jaG9ycyBvblxuICAgKiAgICAgICAgICAgICAgICAgICAgY29tbWl0dGVkIHN0YXRlIGFzIGl0IHN0YW5kcyBOT1cgKGEgc2libGluZyBmb3JrIGJyYW5jaFxuICAgKiAgICAgICAgICAgICAgICAgICAgbWF5IGxlZ2l0aW1hdGVseSBoYXZlIGNvbW1pdHRlZCBpbiBiZXR3ZWVuKTtcbiAgICogIC0gYF9zdGFnZVdyaXRlc2AgLyBgX3BlbmRpbmdXcml0ZXNgIC8gYF9zdGFnZVJlYWRzYCDigJQgdGhlIHNuYXBzaG90XG4gICAqICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOyB3aXRob3V0IHRoZSByZXNldCB0aGUgZXhlY3V0aW9uIHRyZWUgd291bGRcbiAgICogICAgICAgICAgICAgICAgICAgIHJlcG9ydCB3cml0ZXMgdGhhdCB3ZXJlIGRpc2NhcmRlZCwgd2hpY2ggaXMgdGhlIGV4YWN0XG4gICAqICAgICAgICAgICAgICAgICAgICBsaWUgdGhpcyBmZWF0dXJlIGV4aXN0cyB0byBwcmV2ZW50ICh0aGUgcGVuZGluZyBtYXBcbiAgICogICAgICAgICAgICAgICAgICAgIGhvbGRzIGJhcmUgcmVmZXJlbmNlcyDigJQgZHJvcHBpbmcgaXQgdW4tY2xvbmVzIG5vdGhpbmcpO1xuICAgKiAgLSBgX3Byb3ZlbmFuY2VSZWFkc2Ag4oCUIHRoZSBwZXItd3JpdGUgcmVhZCBwcmVmaXggKCNQMSk7IGEgZGlzY2FyZGVkXG4gICAqICAgICAgICAgICAgICAgICAgICBhdHRlbXB0J3MgcmVhZHMgbXVzdCBuZXZlciBhcHBlYXIgaW4gdGhlIG5leHQgYXR0ZW1wdCdzXG4gICAqICAgICAgICAgICAgICAgICAgICBgVHJhY2VFbnRyeS5yZWFkS2V5c2AsIG9yIGEgYmFja3dhcmQgc2xpY2Ugd291bGQgZm9sbG93XG4gICAqICAgICAgICAgICAgICAgICAgICBhbiBlZGdlIHRoYXQgbm8gY29tbWl0dGVkIHdyaXRlIGV2ZXIgaGFkO1xuICAgKiAgLSBgX3VudHJhY2tlZFNvdXJjZXNgIOKAlCB0aGUgRDIgaG9uZXN0eSBtYXJrZXJzLCByZWxlYXNlZCB3aXRoIHRoZSByZXN0LlxuICAgKlxuICAgKiBXaGF0IGlzIGRlbGliZXJhdGVseSBLRVBUOiBgZGVidWdgIChsb2dzLCBtZXRyaWNzLCBlcnJvcnMsIGZsb3cgbWVzc2FnZXMpLlxuICAgKiBEaWFnbm9zdGljcyBhcmUgdGhlIGFwcGVuZC1vbmx5IHJlY29yZCBvZiB3aGF0IGV2ZXJ5IGF0dGVtcHQgZGlkLCBhbmQgdGhlXG4gICAqIHJldHJ5IGZlYXR1cmUncyB3aG9sZSBwb2ludCBpcyB0aGF0IHRoZSBlYXJsaWVyIGF0dGVtcHRzIHN0YXkgdmlzaWJsZS5cbiAgICpcbiAgICogTm8gY29tbWl0IGlzIHJlY29yZGVkIGFuZCBubyBvYnNlcnZlciBmaXJlcyDigJQgYSBkaXNjYXJkZWQgYXR0ZW1wdCBpcyBub3QgYVxuICAgKiBjdXJzb3Igc3RvcCwgYmVjYXVzZSBmcm9tIHNoYXJlZCBzdGF0ZSdzIHBvaW50IG9mIHZpZXcgaXQgbmV2ZXIgaGFwcGVuZWQuXG4gICAqL1xuICBkaXNjYXJkU3RhZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3RhdGVWaWV3ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcHJvdmVuYW5jZVJlYWRzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3BlbmRpbmdXcml0ZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3RhZ2VXcml0ZXMgPSB7fTtcbiAgICB0aGlzLl9zdGFnZVJlYWRzID0ge307XG4gICAgdGhpcy5fbmVzdGVkUmVhZHMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdmlld1JlYWRzID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8g4pSA4pSAIFRyZWUgbmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3JlYXRlIChvciByZXR1cm4pIHRoaXMgY29udGV4dCdzIGxpbmtlZCBzdWNjZXNzb3IuXG4gICAqXG4gICAqIE1FTU9JWkVEOiB0aGUgZmlyc3QgY2FsbCBjcmVhdGVzIGB0aGlzLm5leHRgOyBldmVyeSBsYXRlciBjYWxsIHJldHVybnNcbiAgICogdGhhdCBTQU1FIGNvbnRleHQgYW5kIElHTk9SRVMgaXRzIGFyZ3VtZW50cy4gSW4gbm9ybWFsIHRyYXZlcnNhbCBlYWNoXG4gICAqIGNvbnRleHQgYWR2YW5jZXMgZXhhY3RseSBvbmNlLCBzbyB0aGUgbWVtbyBuZXZlciBiaXRlcyDigJQgYnV0IGEgY2FsbGVyXG4gICAqIGV4cGVjdGluZyBhIGZyZXNoIGNvbnRleHQgZm9yIGRpZmZlcmVudCBgc3RhZ2VOYW1lYC9gc3RhZ2VJZGAgYXJncyBnZXRzXG4gICAqIHRoZSBvbGQgb25lIHNpbGVudGx5LiBEZXYgbW9kZSAoYGVuYWJsZURldk1vZGUoKWApIHdhcm5zIG9uIHRoYXRcbiAgICogbWlzbWF0Y2ggKGJhY2tsb2cgQjQpLlxuICAgKi9cbiAgY3JlYXRlTmV4dChwYXRoOiBzdHJpbmcsIHN0YWdlTmFtZTogc3RyaW5nLCBzdGFnZUlkOiBzdHJpbmcsIGlzRGVjaWRlciA9IGZhbHNlKTogU3RhZ2VDb250ZXh0IHtcbiAgICBpZiAoIXRoaXMubmV4dCkge1xuICAgICAgdGhpcy5uZXh0ID0gbmV3IFN0YWdlQ29udGV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRoaXMuc2hhcmVkTWVtb3J5LCAnJywgdGhpcy5ldmVudExvZywgaXNEZWNpZGVyKTtcbiAgICAgIHRoaXMubmV4dC5wYXJlbnQgPSB0aGlzO1xuICAgICAgLy8gUHJvcGFnYXRlIHRoZSByZWRhY3RlZCBtaXJyb3IgZG93biB0aGUgY29udGV4dCB0cmVlIHNvIGV2ZXJ5IGNvbW1pdFxuICAgICAgLy8gaW4gdGhlIHJ1biB3cml0ZXMgdG8gYm90aCB2aWV3cy5cbiAgICAgIGlmICh0aGlzLnJlZGFjdGVkU2hhcmVkTWVtb3J5KSB0aGlzLm5leHQucmVkYWN0ZWRTaGFyZWRNZW1vcnkgPSB0aGlzLnJlZGFjdGVkU2hhcmVkTWVtb3J5O1xuICAgICAgdGhpcy5uZXh0LnJlZGFjdGlvblJ1bGUgPSB0aGlzLnJlZGFjdGlvblJ1bGU7XG4gICAgICB0aGlzLm5leHQucmVhZFRyYWNraW5nID0gdGhpcy5yZWFkVHJhY2tpbmc7XG4gICAgICB0aGlzLm5leHQud3JpdGVUcmFja2luZyA9IHRoaXMud3JpdGVUcmFja2luZztcbiAgICAgIHRoaXMubmV4dC5jb21taXRWYWx1ZXMgPSB0aGlzLmNvbW1pdFZhbHVlcztcbiAgICAgIHRoaXMubmV4dC53cml0ZVByb3ZlbmFuY2UgPSB0aGlzLndyaXRlUHJvdmVuYW5jZTtcbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpICYmICh0aGlzLm5leHQuc3RhZ2VJZCAhPT0gc3RhZ2VJZCB8fCB0aGlzLm5leHQuc3RhZ2VOYW1lICE9PSBzdGFnZU5hbWUpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gU3RhZ2VDb250ZXh0LmNyZWF0ZU5leHQ6IG5leHQgY29udGV4dCBhbHJlYWR5IGV4aXN0cyBhcyBcIiR7dGhpcy5uZXh0LnN0YWdlTmFtZX1cIiBgICtcbiAgICAgICAgICBgKGlkOiBcIiR7dGhpcy5uZXh0LnN0YWdlSWR9XCIpIOKAlCBhcmd1bWVudHMgXCIke3N0YWdlTmFtZX1cIiAoaWQ6IFwiJHtzdGFnZUlkfVwiKSBhcmUgaWdub3JlZCBgICtcbiAgICAgICAgICAnYW5kIHRoZSBleGlzdGluZyBjb250ZXh0IGlzIHJldHVybmVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5uZXh0O1xuICB9XG5cbiAgY3JlYXRlQ2hpbGQocnVuSWQ6IHN0cmluZywgYnJhbmNoSWQ6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5jaGlsZHJlbikge1xuICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZCA9IG5ldyBTdGFnZUNvbnRleHQocnVuSWQsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5zaGFyZWRNZW1vcnksIGJyYW5jaElkLCB0aGlzLmV2ZW50TG9nLCBpc0RlY2lkZXIpO1xuICAgIGNoaWxkLnBhcmVudCA9IHRoaXM7XG4gICAgaWYgKHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnkpIGNoaWxkLnJlZGFjdGVkU2hhcmVkTWVtb3J5ID0gdGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeTtcbiAgICBjaGlsZC5yZWRhY3Rpb25SdWxlID0gdGhpcy5yZWRhY3Rpb25SdWxlO1xuICAgIGNoaWxkLnJlYWRUcmFja2luZyA9IHRoaXMucmVhZFRyYWNraW5nO1xuICAgIGNoaWxkLndyaXRlVHJhY2tpbmcgPSB0aGlzLndyaXRlVHJhY2tpbmc7XG4gICAgY2hpbGQuY29tbWl0VmFsdWVzID0gdGhpcy5jb21taXRWYWx1ZXM7XG4gICAgY2hpbGQud3JpdGVQcm92ZW5hbmNlID0gdGhpcy53cml0ZVByb3ZlbmFuY2U7XG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKTtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH1cblxuICBjcmVhdGVEZWNpZGVyKHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZyk6IFN0YWdlQ29udGV4dCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTmV4dChwYXRoLCBzdGFnZU5hbWUsIHN0YWdlSWQsIHRydWUpO1xuICB9XG5cbiAgc2V0QXNEZWNpZGVyKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0QXNGb3JrKCk6IFN0YWdlQ29udGV4dCB7XG4gICAgdGhpcy5pc0ZvcmsgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8g4pSA4pSAIERpYWdub3N0aWNzIGRlbGVnYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYWRkTG9nKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRMb2coa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZE1ldHJpYyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuYWRkTWV0cmljKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0TWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBhZGRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgc2V0RXZhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0RXZhbChrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEVycm9yKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRFcnJvcihrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEZsb3dEZWJ1Z01lc3NhZ2UoXG4gICAgdHlwZTogRmxvd0NvbnRyb2xUeXBlLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgdGFyZ2V0U3RhZ2U/OiBzdHJpbmcgfCBzdHJpbmdbXTsgcmF0aW9uYWxlPzogc3RyaW5nOyBjb3VudD86IG51bWJlcjsgaXRlcmF0aW9uPzogbnVtYmVyIH0sXG4gICkge1xuICAgIGNvbnN0IGZsb3dNZXNzYWdlOiBGbG93TWVzc2FnZSA9IHsgdHlwZSwgZGVzY3JpcHRpb24sIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgLi4ub3B0aW9ucyB9O1xuICAgIHRoaXMuZGVidWcuYWRkRmxvd01lc3NhZ2UoZmxvd01lc3NhZ2UpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFNuYXBzaG90IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGdldFN0YWdlSWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMucnVuSWQgfHwgdGhpcy5ydW5JZCA9PT0gJycpIHJldHVybiB0aGlzLnN0YWdlTmFtZTtcbiAgICByZXR1cm4gYCR7dGhpcy5ydW5JZH0uJHt0aGlzLnN0YWdlTmFtZX1gO1xuICB9XG5cbiAgZ2V0U25hcHNob3QoKTogU3RhZ2VTbmFwc2hvdCB7XG4gICAgLy8gSXRlcmF0aXZlIHdhbGsgKGV4cGxpY2l0IHdvcmsgc3RhY2spLCBOT1QgcmVjdXJzaW9uOiB0aGUgZXhlY3V0aW9uXG4gICAgLy8gdHJlZSBkZWVwZW5zIGJ5IG9uZSBsZXZlbCBwZXIgZXhlY3V0ZWQgc3RhZ2UgYWxvbmcgYG5leHRgIGNoYWlucywgYW5kXG4gICAgLy8gdGhlIHRyYW1wb2xpbmVkIHRyYXZlcnNlciBhbGxvd3MgY2hhaW5zL2xvb3BzIG9mIHRlbnMgb2YgdGhvdXNhbmRzIG9mXG4gICAgLy8gc3RhZ2VzIOKAlCBmYXIgZGVlcGVyIHRoYW4gYSByZWN1cnNpdmUgc2VyaWFsaXplciBjYW4gd2FsayBiZWZvcmVcbiAgICAvLyBcIk1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gICAgY29uc3Qgcm9vdCA9IHRoaXMuc25hcHNob3RTZWxmKCk7XG4gICAgY29uc3Qgd29yazogQXJyYXk8eyBjdHg6IFN0YWdlQ29udGV4dDsgc25hcDogU3RhZ2VTbmFwc2hvdCB9PiA9IFt7IGN0eDogdGhpcywgc25hcDogcm9vdCB9XTtcbiAgICB3aGlsZSAod29yay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCB7IGN0eCwgc25hcCB9ID0gd29yay5wb3AoKSE7XG4gICAgICBpZiAoY3R4Lm5leHQpIHtcbiAgICAgICAgY29uc3QgbmV4dFNuYXAgPSBjdHgubmV4dC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgc25hcC5uZXh0ID0gbmV4dFNuYXA7XG4gICAgICAgIHdvcmsucHVzaCh7IGN0eDogY3R4Lm5leHQsIHNuYXA6IG5leHRTbmFwIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGN0eC5jaGlsZHJlbikge1xuICAgICAgICBzbmFwLmNoaWxkcmVuID0gY3R4LmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlsZFNuYXAgPSBjaGlsZC5zbmFwc2hvdFNlbGYoKTtcbiAgICAgICAgICB3b3JrLnB1c2goeyBjdHg6IGNoaWxkLCBzbmFwOiBjaGlsZFNuYXAgfSk7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkU25hcDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IG9mIFRISVMgY29udGV4dCdzIG93biBmaWVsZHMg4oCUIGBuZXh0YC9gY2hpbGRyZW5gIGFyZSBmaWxsZWRcbiAgICogIGluIGJ5IHRoZSBpdGVyYXRpdmUgd2FsayBpbiBgZ2V0U25hcHNob3RgLiAqL1xuICBwcml2YXRlIHNuYXBzaG90U2VsZigpOiBTdGFnZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdDogU3RhZ2VTbmFwc2hvdCA9IHtcbiAgICAgIGlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogdGhpcy5ydW50aW1lU3RhZ2VJZCB8fCB1bmRlZmluZWQsXG4gICAgICBuYW1lOiB0aGlzLnN0YWdlTmFtZSxcbiAgICAgIGlzRGVjaWRlcjogdGhpcy5pc0RlY2lkZXIsXG4gICAgICBpc0Zvcms6IHRoaXMuaXNGb3JrLFxuICAgICAgbG9nczogdGhpcy5kZWJ1Zy5sb2dDb250ZXh0LFxuICAgICAgZXJyb3JzOiB0aGlzLmRlYnVnLmVycm9yQ29udGV4dCxcbiAgICAgIG1ldHJpY3M6IHRoaXMuZGVidWcubWV0cmljQ29udGV4dCxcbiAgICAgIGV2YWxzOiB0aGlzLmRlYnVnLmV2YWxDb250ZXh0LFxuICAgIH07XG4gICAgY29uc3Qgc3RhZ2VXcml0ZXMgPSB0aGlzLnJldGFpbmVkV3JpdGVzKCk7XG4gICAgaWYgKE9iamVjdC5rZXlzKHN0YWdlV3JpdGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBFeHRyYWN0IHZhbHVlcyBvbmx5IGZvciB0aGUgc25hcHNob3QgKHN0cmlwIG9wZXJhdGlvbiBtZXRhZGF0YSlcbiAgICAgIGNvbnN0IHdyaXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW2ssIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhzdGFnZVdyaXRlcykpIHtcbiAgICAgICAgd3JpdGVzW2tdID0gZW50cnkudmFsdWU7XG4gICAgICB9XG4gICAgICBzbmFwc2hvdC5zdGFnZVdyaXRlcyA9IHdyaXRlcztcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N0YWdlUmVhZHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN0YWdlUmVhZHMgPSB0aGlzLl9zdGFnZVJlYWRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZXNjcmlwdGlvbikge1xuICAgICAgc25hcHNob3QuZGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdWJmbG93SWQpIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dJZCA9IHRoaXMuc3ViZmxvd0lkO1xuICAgIH1cbiAgICBpZiAodGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QuZmxvd01lc3NhZ2VzID0gdGhpcy5kZWJ1Zy5mbG93TWVzc2FnZXM7XG4gICAgfVxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxufVxuIl19
1097
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhZ2VDb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU3RhZ2VDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsd0JBQXdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUUvRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRELE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBWTNEOzsyQkFFMkI7QUFDM0IsU0FBUyxTQUFTLENBQUMsSUFBYyxFQUFFLEdBQVc7SUFDNUMsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUMxRCxDQUFDO0FBRUQsTUFBTSxPQUFPLFlBQVk7SUFDZixZQUFZLENBQWU7SUFDbkM7Ozs7Ozs7Ozs7O09BV0c7SUFDSyxvQkFBb0IsQ0FBZ0I7SUFDNUMsK0RBQStEO0lBQ3ZELGFBQWEsQ0FBaUI7SUFDOUIsTUFBTSxDQUFxQjtJQUNuQzs7Ozs7T0FLRztJQUNLLFNBQVMsQ0FBMkI7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LENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsUUFBUSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUNsRCxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdGFnZUNvbnRleHQg4oCUIEV4ZWN1dGlvbiBjb250ZXh0IGZvciBhIHNpbmdsZSBzdGFnZSBpbiBhIGZsb3djaGFydCBydW5cbiAqXG4gKiBMaWtlIGEgc3RhY2sgZnJhbWUgaW4gYSBjb21waWxlci9ydW50aW1lOlxuICogLSBSZWZlcmVuY2UgdG8gU2hhcmVkTWVtb3J5IChhY2Nlc3NpbmcgaGVhcCBtZW1vcnkpXG4gKiAtIFRyYW5zYWN0aW9uQnVmZmVyIGZvciBzdGFnaW5nIG11dGF0aW9ucyAodHJhbnNhY3Rpb24gYnVmZmVyKVxuICogLSBMaW5rcyB0byBwYXJlbnQvY2hpbGQvbmV4dCBjb250ZXh0cyAoY2FsbCBzdGFjayBmcmFtZXMpXG4gKiAtIERpYWdub3N0aWNDb2xsZWN0b3IgZm9yIGxvZ3MsIGVycm9ycywgbWV0cmljc1xuICovXG5cbmltcG9ydCB7IHN1bW1hcml6ZVJlYWRWYWx1ZSwgc3VtbWFyaXplV3JpdGVWYWx1ZSB9IGZyb20gJy4uL2NhcHR1cmUvc3VtbWFyaXplLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHsgYm9ycm93ZWRNdXRhdGlvbk1lc3NhZ2UsIGNvbW1pdHRlZE11dGF0aW9uTWVzc2FnZSwgZmlyc3REaWZmZXJpbmdQYXRoIH0gZnJvbSAnLi9ib3Jyb3dlZE11dGF0aW9uLmpzJztcbmltcG9ydCB7IERpYWdub3N0aWNDb2xsZWN0b3IgfSBmcm9tICcuL0RpYWdub3N0aWNDb2xsZWN0b3IuanMnO1xuaW1wb3J0IHsgRXZlbnRMb2cgfSBmcm9tICcuL0V2ZW50TG9nLmpzJztcbmltcG9ydCB7IG5hdGl2ZUdldCB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgeyBTQ09QRV9QTEFDRUhPTERFUiB9IGZyb20gJy4vcGxhY2Vob2xkZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uVmVyZGljdCB9IGZyb20gJy4vcmVkYWN0aW9uLmpzJztcbmltcG9ydCB7IENMRUFSLCBSZWRhY3Rpb25SdWxlLCBzY3J1YlBhdGNoIH0gZnJvbSAnLi9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWZmZXIgfSBmcm9tICcuL1RyYW5zYWN0aW9uQnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQ29tbWl0VmFsdWVzTW9kZSxcbiAgRmxvd0NvbnRyb2xUeXBlLFxuICBGbG93TWVzc2FnZSxcbiAgUmVhZFRyYWNraW5nTW9kZSxcbiAgU3RhZ2VTbmFwc2hvdCxcbiAgVW50cmFja2VkU291cmNlLFxuICBXcml0ZVByb3ZlbmFuY2VNb2RlLFxuICBXcml0ZVRyYWNraW5nTW9kZSxcbn0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKiBUaGUgdXNlci1sZXZlbCBrZXkgb2YgYSB3cml0ZSBvciByZWFkIOKAlCBkb3R0ZWQgb25seSBmb3IgYSBuZXN0ZWQgcGF0aCAoYVxuICogIHN1YmZsb3cgc2VlZCdzIGBbJ3Byb2ZpbGUnXSArICdhdXRoJ2ApOyBubyBhbGxvY2F0aW9uIGZvciB0aGUgY29tbW9uXG4gKiAgc2luZ2xlLXNlZ21lbnQgY2FzZS4gKi9cbmZ1bmN0aW9uIHVzZXJLZXlPZihwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5sZW5ndGggPiAwID8gWy4uLnBhdGgsIGtleV0uam9pbignLicpIDoga2V5O1xufVxuXG5leHBvcnQgY2xhc3MgU3RhZ2VDb250ZXh0IHtcbiAgcHJpdmF0ZSBzaGFyZWRNZW1vcnk6IFNoYXJlZE1lbW9yeTtcbiAgLyoqXG4gICAqIFBhcmFsbGVsIHJlZGFjdGVkIG1pcnJvciBvZiBgc2hhcmVkTWVtb3J5YC4gUG9wdWxhdGVkIGluIGBjb21taXQoKWAgd2l0aFxuICAgKiB0aGUgYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzICh0aGUgc2FtZSBvbmVzIGZlZCB0byBgZXZlbnRMb2dgKS5cbiAgICogUHJlc2VudCAqKm9ubHkqKiB3aGVuIHRoZSBleGVjdXRvciBoYXMgYmVlbiB0b2xkIHRvIG1haW50YWluIGEgcmVkYWN0ZWRcbiAgICogdmlldyDigJQgaS5lLiB3aGVuIGEgYFJlZGFjdGlvblBvbGljeWAgaXMgY29uZmlndXJlZC4gT3RoZXJ3aXNlIHVuZGVmaW5lZCxcbiAgICogemVybyBleHRyYSB3b3JrIHBlciBjb21taXQuXG4gICAqXG4gICAqIFRoZSBtaXJyb3IgaXMgcmVhZCB2aWEgYEZsb3dDaGFydEV4ZWN1dG9yLmdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYFxuICAgKiBhbmQgaXMgdGhlIGZvdW5kYXRpb24gZm9yIHRoZSBcImV4cG9ydCB0cmFjZVwiIC8gcGFzdGUtaW50by12aWV3ZXIgZmVhdHVyZVxuICAgKiDigJQgY29uc3VtZXJzIHNoYXJlIHRoZSByZWRhY3RlZCB2aWV3IGV4dGVybmFsbHkgd2l0aG91dCBsZWFraW5nIHJhdyBQSUlcbiAgICogdGhyb3VnaCBgc2hhcmVkU3RhdGVgLlxuICAgKi9cbiAgcHJpdmF0ZSByZWRhY3RlZFNoYXJlZE1lbW9yeT86IFNoYXJlZE1lbW9yeTtcbiAgLyoqIFRoZSBydW4ncyByZWRhY3Rpb24gcnVsZSDigJQgc2VlIHtAbGluayB1c2VSZWRhY3Rpb25SdWxlfS4gKi9cbiAgcHJpdmF0ZSByZWRhY3Rpb25SdWxlPzogUmVkYWN0aW9uUnVsZTtcbiAgcHJpdmF0ZSBidWZmZXI/OiBUcmFuc2FjdGlvbkJ1ZmZlcjtcbiAgLyoqXG4gICAqIENvbW1pdHRlZC1zdGF0ZSB2aWV3IGNhcHR1cmVkIGF0IHRoaXMgc3RhZ2UncyBGSVJTVCB0b3VjaCAoZmlyc3QgcmVhZCBPUlxuICAgKiBmaXJzdCB3cml0ZSkg4oCUIGhlbGQgYnkgUkVGRVJFTkNFLCBuZXZlciBjbG9uZWQuIFNlZVxuICAgKiB7QGxpbmsgZmlyc3RUb3VjaFN0YXRlfSBmb3IgdGhlIGFsZ29yaXRobSBhbmQgdGhlIGltbXV0YWJpbGl0eSBpbnZhcmlhbnRcbiAgICogdGhhdCBtYWtlcyBhIGJhcmUgcmVmZXJlbmNlIHNhZmUuXG4gICAqL1xuICBwcml2YXRlIHN0YXRlVmlldz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwcml2YXRlIGV2ZW50TG9nPzogRXZlbnRMb2c7XG5cbiAgcHVibGljIHN0YWdlTmFtZSA9ICcnO1xuICAvKiogVW5pcXVlIHN0YWdlIGlkZW50aWZpZXIgZnJvbSB0aGUgYnVpbGRlciAobWF0Y2hlcyBzcGVjIG5vZGUgaWQpLiAqL1xuICBwdWJsaWMgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVW5pcXVlIHBlci1leGVjdXRpb24tc3RlcCBpZGVudGlmaWVyLiBTZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBzdGFnZSBleGVjdXRpb24uICovXG4gIHB1YmxpYyBydW50aW1lU3RhZ2VJZCA9ICcnO1xuICAvKipcbiAgICogRGVjbGFyZWQgdGFncyAoOS4yMS4wKSBmb3IgdGhlIHN0YWdlIHRoaXMgY29udGV4dCBpcyBleGVjdXRpbmcuIFNldCBieVxuICAgKiB0aGUgdHJhdmVyc2VyIGJlc2lkZSBgcnVudGltZVN0YWdlSWRgIChwZXItbm9kZSBpZGVudGl0eSDigJQgTk9UIGluaGVyaXRlZFxuICAgKiBieSBgY3JlYXRlTmV4dGAgLyBgY3JlYXRlQ2hpbGRgKSwgcmVjb3JkZWQgb24gdGhlIGZpcnN0IGJ1bmRsZVxuICAgKiBgY29tbWl0KClgIHdyaXRlcywgdGhlbiByZWxlYXNlZCBzbyBhIHJvdXRpbmUgc2Vjb25kIGNvbW1pdCBvbiB0aGUgc2FtZVxuICAgKiBjb250ZXh0IChhIGZvcmsgY2hpbGQncyBmYW4tb3V0IHJlcGVhdCwgYSBtb3VudCdzIGV4aXQgYnVuZGxlKSBjYXJyaWVzXG4gICAqIG5vbmUg4oCUIHRoZSBzYW1lIG9uY2UtcGVyLWV4ZWN1dGlvbiBsYXcgYF91bnRyYWNrZWRTb3VyY2VzYCBrZWVwcy5cbiAgICovXG4gIHB1YmxpYyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHB1YmxpYyBydW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1biBuYW1lc3BhY2UgdGhpcyBmcmFtZSB3cml0ZXMgYW5kIHJlYWRzIGluIHdoZW4gdGhhdCBpcyBub3QgaXRzIG93blxuICAgKiBgcnVuSWRgIOKAlCBzZXQgb25jZSwgYmVmb3JlIHRoZSBmcmFtZSdzIGZpcnN0IHdyaXRlLCBieVxuICAgKiB7QGxpbmsgdXNlQWRkcmVzc09mfS4gSXRzIG9uZSB1c2VyIGlzIGEgc3ViZmxvdyBtb3VudCdzIG1lcmdlLWJhY2sgKFIxMyk6XG4gICAqIHRoZSByZWNvcmQgbmFtZXMgdGhlIG1vdW50LCB0aGUgdmFsdWVzIGxhbmQgd2hlcmUgdGhlIG1vdW50J3MgcGFyZW50XG4gICAqIHdyaXRlcy4gQWJzZW50IOKGkiBgcnVuSWRgLCBzbyBldmVyeSBvdGhlciBmcmFtZSBpcyB1bnRvdWNoZWQuXG4gICAqL1xuICBwcml2YXRlIGFkZHJlc3NSdW5JZD86IHN0cmluZztcbiAgcHVibGljIGJyYW5jaElkPzogc3RyaW5nO1xuICBwdWJsaWMgaXNEZWNpZGVyOiBib29sZWFuO1xuICBwdWJsaWMgaXNGb3JrOiBib29sZWFuO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZnJvbSBidWlsZGVyIChzZXQgYnkgdHJhdmVyc2VyIGJlZm9yZSBleGVjdXRpb24pLiAqL1xuICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIgKHNldCBieSB0cmF2ZXJzZXIgd2hlbiB0aGlzIGlzIGEgc3ViZmxvdyBlbnRyeSBwb2ludCkuICovXG4gIHB1YmxpYyBzdWJmbG93SWQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHBhcmVudD86IFN0YWdlQ29udGV4dDtcbiAgcHVibGljIG5leHQ/OiBTdGFnZUNvbnRleHQ7XG4gIHB1YmxpYyBjaGlsZHJlbj86IFN0YWdlQ29udGV4dFtdO1xuXG4gIHB1YmxpYyBkZWJ1ZzogRGlhZ25vc3RpY0NvbGxlY3RvciA9IG5ldyBEaWFnbm9zdGljQ29sbGVjdG9yKCk7XG5cbiAgLyoqIFRyYWNrcyB1c2VyLWxldmVsIHdyaXRlcyAocHJlLW5hbWVzcGFjZSkgZm9yIHRoZSBtZW1vcnkgdmlldyBhbmQgb25Db21taXRcbiAgICogIOKAlCBpbiB0aGVpciBSRVRBSU5FRCBmb3JtIChjbG9uZWQgLyBzdW1tYXJpc2VkIC8gcmVkYWN0ZWQpLiBGaWxsZWQgZnJvbVxuICAgKiAge0BsaW5rIF9wZW5kaW5nV3JpdGVzfSBieSB7QGxpbmsgbWF0ZXJpYWxpc2VXcml0ZXN9IGF0IGNvbW1pdC4gKi9cbiAgcHJpdmF0ZSBfc3RhZ2VXcml0ZXM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSB3cml0ZXMgb2YgdGhlIENVUlJFTlQgZXhlY3V0aW9uLCBoZWxkIGJ5IHJlZmVyZW5jZSB3aXRoIHRoZSB2ZXJkaWN0XG4gICAqIHRoZXkgd2VyZSBzdGFnZWQgdW5kZXIgKDkuMjMuMCkuIEEga2V5IHdyaXR0ZW4gayB0aW1lcyBob2xkcyBpdHMgTEFTVFxuICAgKiB2YWx1ZTsgdGhlIHJldGFpbmVkIGZvcm0gKHRoZSBgd3JpdGVUcmFja2luZ2AgY2xvbmUgb3Igc3VtbWFyeSwgdGhlXG4gICAqIHJlZGFjdGlvbiBwbGFjZWhvbGRlciBvciBmaWVsZCBzY3J1YikgaXMgdGFrZW4gT05DRSBwZXIga2V5IGF0IGNvbW1pdCDigJRcbiAgICogc2VlIHtAbGluayBtYXRlcmlhbGlzZVdyaXRlc30uIFNhbWUgbGF3IGFzIHRoZSB0cmFuc2FjdGlvbiBidWZmZXInc1xuICAgKiBwYXRjaCB0cmVlczogdGhlIGNvcHkgdGhlIHJlY29yZCBuZWVkcyBpcyBwYWlkIGF0IHRoZSBib3VuZGFyeSwgbm90IGF0XG4gICAqIGV2ZXJ5IHdyaXRlLiBMYXppbHkgYWxsb2NhdGVkOyBhIHN0YWdlIHRoYXQgbmV2ZXIgd3JpdGVzIHBheXMgbm90aGluZy5cbiAgICovXG4gIHByaXZhdGUgX3BlbmRpbmdXcml0ZXM/OiBNYXA8XG4gICAgc3RyaW5nLFxuICAgIHsgdmFsdWU6IHVua25vd247IHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3Q7IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH1cbiAgPjtcblxuICAvKiogVHJhY2tzIHVzZXItbGV2ZWwgcmVhZHMgKHByZS1uYW1lc3BhY2UpIGZvciB0aGUgbWVtb3J5IHZpZXcuICovXG4gIHByaXZhdGUgX3N0YWdlUmVhZHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgLyoqXG4gICAqIFRoZSBgX3N0YWdlUmVhZHNgIGtleXMgdGhhdCB3ZXJlIHJlYWQgYXQgYSBORVNURUQgcGF0aCAoYGdldFZhbHVlKHBhdGgsXG4gICAqIGtleSlgIHdpdGggYSBub24tZW1wdHkgYHBhdGhgKS4gT25seSB0aGUgZW5naW5lIHJlYWRzIHRoYXQgd2F5IOKAlCB0aGVcbiAgICogZmFjYWRlIHJlYWRzIHJvb3RzIOKAlCBzbyB0aGVzZSBhcmUgbm90IHVzZXIgcmVhZHMgYW5kIHRoZSBib3Jyb3dlZC1yZWFkXG4gICAqIGd1YXJkIHNraXBzIHRoZW0gYnkgdGhpcyBtYXJrZXIsIG5ldmVyIGJ5IGd1ZXNzaW5nIGZyb20gYSBkb3QgaW4gdGhlIGtleVxuICAgKiAoYSB1c2VyJ3MgdG9wLWxldmVsIGtleSBtYXkgaXRzZWxmIGNvbnRhaW4gb25lKS4gTGF6aWx5IGNyZWF0ZWQ7IHRoZVxuICAgKiBmYWNhZGUgcGF0aCBuZXZlciBhbGxvY2F0ZXMgaXQuXG4gICAqL1xuICBwcml2YXRlIF9uZXN0ZWRSZWFkcz86IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBEZXYgbW9kZSBvbmx5OiB0aGUgcm9vdCBrZXlzIHdob3NlIExBU1QgdHJhY2tlZCByZWFkIHdhcyBzZXJ2ZWQgZnJvbVxuICAgKiBjb21taXR0ZWQgc3RhdGUg4oCUIGJlZm9yZSB0aGlzIHN0YWdlJ3MgZmlyc3Qgd3JpdGUsIHdoZW4gbm8gdHJhbnNhY3Rpb25cbiAgICogYnVmZmVyIGV4aXN0cyB5ZXQuIFN1Y2ggYSByZWFkIGlzIHRoZSBjb21taXR0ZWQgb2JqZWN0IGl0c2VsZiwgc28gYW5cbiAgICogaW4tcGxhY2UgZWRpdCBvZiBpdCBtb3ZlcyB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIHRvbyAoY29weS1vbi13cml0ZSxcbiAgICogOS4yOS4wKTsge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259IGNoZWNrcyB0aGVzZSBrZXlzIGV2ZW4gd2hlbiB0aGVcbiAgICogc3RhZ2Ugd3JvdGUgdGhlbS4gTmV2ZXIgYWxsb2NhdGVkIG91dHNpZGUgYGVuYWJsZURldk1vZGUoKWAuXG4gICAqL1xuICBwcml2YXRlIF92aWV3UmVhZHM/OiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogSGFzIHRoaXMgZnJhbWUgY29tbWl0dGVkIGF0IGxlYXN0IG9uY2U/IFRoZSBib3Jyb3dlZC1yZWFkIGd1YXJkIHJ1bnMgb25cbiAgICogdGhlIEZJUlNUIGNvbW1pdCBvbmx5IOKAlCBzZWUge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259LiBUaGUgZnJhbWVcbiAgICogaXRzZWxmIHN0YXlzIHJlLXVzYWJsZSBhZnRlciBjb21taXQgKCMxM2IpOiB0aGUgZW5naW5lJ3MgZG91YmxlLWNvbW1pdFxuICAgKiBwYXRocyBhbmQgdGhlIHN1YmZsb3cgbWVyZ2UtYmFjayBpbnRvIGEgYnJhbmNoIHBhcmVudCByZWx5IG9uIGl0LiBUaGVcbiAgICogdXNlci1sZXZlbCByZWZ1c2FsIG9mIGEgaGFuZGxlIGhlbGQgcGFzdCBpdHMgc3RhZ2UgbGl2ZXMgYXQgdGhlIHNjb3BlXG4gICAqIHRpZXIgKGBTY29wZUZhY2FkZWAsIG9uZSBwZXIgc3RhZ2UgZXhlY3V0aW9uKSwgbm90IGhlcmUuXG4gICAqL1xuICBwcml2YXRlIF9jb21taXR0ZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogSG93IHRyYWNrZWQgcmVhZHMgYXJlIHJlY29yZGVkIGludG8gYF9zdGFnZVJlYWRzYCAoIzE0KS4gRGVmYXVsdCBgJ2Z1bGwnYFxuICAgKiBwcmVzZXJ2ZXMgdGhlIGhpc3RvcmljYWwgcGVyLXJlYWQgYHN0cnVjdHVyZWRDbG9uZWAuIEluaGVyaXRlZCBieSBldmVyeVxuICAgKiBjb250ZXh0IGNyZWF0ZWQgdmlhIHtAbGluayBjcmVhdGVOZXh0fSAvIHtAbGluayBjcmVhdGVDaGlsZH0gKHNhbWVcbiAgICogcHJvcGFnYXRpb24gcGF0dGVybiBhcyB0aGUgcmVkYWN0ZWQgbWlycm9yKSwgYW5kIHB1c2hlZCBpbnRvIHN1YmZsb3dcbiAgICogcm9vdCBjb250ZXh0cyBieSBgU3ViZmxvd0V4ZWN1dG9yYC4gQWZmZWN0cyBPTkxZIHRoZSBzbmFwc2hvdCdzXG4gICAqIGBzdGFnZVJlYWRzYCBwYXlsb2FkIOKAlCBgU2NvcGVSZWNvcmRlci5vblJlYWRgIChhbmQgdGhlcmVmb3JlIG5hcnJhdGl2ZSlcbiAgICogaXMgZGlzcGF0Y2hlZCBhdCB0aGUgc2NvcGUgdGllciBhbmQgbmV2ZXIgY2xvbmVkLCBzbyBpdCBpcyBpZGVudGljYWwgaW5cbiAgICogZXZlcnkgbW9kZS5cbiAgICovXG4gIHByaXZhdGUgcmVhZFRyYWNraW5nOiBSZWFkVHJhY2tpbmdNb2RlID0gJ2Z1bGwnO1xuXG4gIC8qKlxuICAgKiBIb3cgdHJhY2tlZCB3cml0ZXMgYXJlIHJlY29yZGVkIGludG8gYF9zdGFnZVdyaXRlc2AgKCMxM2MtQSkg4oCUIHRoZVxuICAgKiBzaWJsaW5nIG9mIHtAbGluayByZWFkVHJhY2tpbmd9LCB3aXRoIHRoZSBzYW1lIHByb3BhZ2F0aW9uIHBhdHRlcm5cbiAgICogKGluaGVyaXRlZCB2aWEge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH0sIHB1c2hlZCBpbnRvXG4gICAqIHN1YmZsb3cgcm9vdCBjb250ZXh0cyBieSBgU3ViZmxvd0V4ZWN1dG9yYCkuIEdvdmVybnMgdGhlIHJldGFpbmVkIGZvcm1cbiAgICoge0BsaW5rIG1hdGVyaWFsaXNlV3JpdGVzfSB0YWtlcyBhdCBjb21taXQgZm9yIHRoZSB3cml0ZXMgb2ZcbiAgICoge0BsaW5rIHNldE9iamVjdH0ve0BsaW5rIHVwZGF0ZU9iamVjdH0gKGEgY2xvbmUgdW5kZXIgYCdmdWxsJ2AsIHRha2VuXG4gICAqIG9uY2UgcGVyIGtleSDigJQgOS4yMy4wKS4gQWZmZWN0cyB0aGVcbiAgICogc25hcHNob3QncyBgc3RhZ2VXcml0ZXNgIHBheWxvYWQgQU5EIHRoZSBjb21taXQgb2JzZXJ2ZXIncyBtdXRhdGlvbnNcbiAgICogcGF5bG9hZCAod2hpY2ggaXMgYSBzcHJlYWQgb2YgYF9zdGFnZVdyaXRlc2ApIOKAlCBidXQgTk9UIHRoZSB3cml0ZVxuICAgKiBpdHNlbGY6IHRoZSB0cmFuc2FjdGlvbiBidWZmZXIsIHRoZSBjb21taXQgbG9nLCBhbmQgc2hhcmVkIHN0YXRlIGFyZVxuICAgKiBpZGVudGljYWwgaW4gZXZlcnkgbW9kZSwgYW5kIGBTY29wZVJlY29yZGVyLm9uV3JpdGVgIGFsd2F5cyBmaXJlcyB3aXRoXG4gICAqIHRoZSBsaXZlIHZhbHVlLlxuICAgKi9cbiAgcHJpdmF0ZSB3cml0ZVRyYWNraW5nOiBXcml0ZVRyYWNraW5nTW9kZSA9ICdmdWxsJztcblxuICAvKipcbiAgICogSG93IGNvbW1pdC1idW5kbGUgdmFsdWVzIGFyZSBlbmNvZGVkIGludG8gdGhlIGNvbW1pdCBsb2cgKCMxM2MtQikg4oCUIHRoZVxuICAgKiB0aGlyZCBkaWFsIG9mIHRoZSBmYW1pbHksIHdpdGggdGhlIHNhbWUgcHJvcGFnYXRpb24gcGF0dGVybiBhc1xuICAgKiB7QGxpbmsgcmVhZFRyYWNraW5nfS97QGxpbmsgd3JpdGVUcmFja2luZ30gKGluaGVyaXRlZCB2aWFcbiAgICoge0BsaW5rIGNyZWF0ZU5leHR9L3tAbGluayBjcmVhdGVDaGlsZH0sIHB1c2hlZCBpbnRvIHN1YmZsb3cgcm9vdFxuICAgKiBjb250ZXh0cyBieSBgU3ViZmxvd0V4ZWN1dG9yYCwgcmUtYXBwbGllZCBvbiB0aGUgcmVzdW1lIHBhdGgpLiBQYXNzZWRcbiAgICogaW50byBlYWNoIHtAbGluayBUcmFuc2FjdGlvbkJ1ZmZlcn0gYXQgY29uc3RydWN0aW9uOyBgJ2Z1bGwnYCAoZGVmYXVsdClcbiAgICogaXMgYnl0ZS1pZGVudGljYWwgdG8gaGlzdG9yeSwgYCdkZWx0YSdgIGVuYWJsZXMgYXBwZW5kL2RlbGV0ZSB2ZXJicyArXG4gICAqIG9uZS10cmFjZS1lbnRyeS1wZXItcGF0aCBkZWR1cC4gTG9zc2xlc3MgaW4gYm90aCBtb2Rlcy5cbiAgICovXG4gIHByaXZhdGUgY29tbWl0VmFsdWVzOiBDb21taXRWYWx1ZXNNb2RlID0gJ2Z1bGwnO1xuXG4gIC8qKlxuICAgKiBQZXItd3JpdGUgcmVhZC1wcm92ZW5hbmNlIHBvbGljeSAoI1AxKSDigJQgdGhlIGZvdXJ0aCBkaWFsIG9mIHRoZSBmYW1pbHksXG4gICAqIHNhbWUgcHJvcGFnYXRpb24gcGF0dGVybiBhcyB7QGxpbmsgcmVhZFRyYWNraW5nfS97QGxpbmsgd3JpdGVUcmFja2luZ30vXG4gICAqIHtAbGluayBjb21taXRWYWx1ZXN9LiBVbmRlciBgJ3JlYWRzLXByZWZpeCdgIHRoaXMgY29udGV4dCBrZWVwcyBhXG4gICAqIGxpZ2h0d2VpZ2h0IG9yZGVyZWQgc2V0IG9mIHRoZSBrZXlzIHRyYWNrZWQtcmVhZCBzbyBmYXIsIGFuZCB0aGVcbiAgICogdHJhbnNhY3Rpb24gYnVmZmVyIHN0YW1wcyB0aGF0IHByZWZpeCBvbnRvIGV2ZXJ5IHN0YWdlZCB3cml0ZVxuICAgKiAoe0BsaW5rIFRyYWNlRW50cnkucmVhZEtleXN9KS4gSU5ERVBFTkRFTlQgb2YgcmVhZFRyYWNraW5nOiBwcm92ZW5hbmNlXG4gICAqIG5lZWRzIG9ubHkgdGhlIGtleSBTVFJJTkdTLCBzbyBpdCB3b3JrcyBldmVuIHVuZGVyIHJlYWRUcmFja2luZyAnb2ZmJ1xuICAgKiAoYW5kIGNvc3RzIG5vdGhpbmcgd2hlbiBpdCBpcyBpdHNlbGYgJ29mZicg4oCUIHRoZSBkZWZhdWx0KS5cbiAgICovXG4gIHByaXZhdGUgd3JpdGVQcm92ZW5hbmNlOiBXcml0ZVByb3ZlbmFuY2VNb2RlID0gJ29mZic7XG5cbiAgLyoqIExhemlseS1hbGxvY2F0ZWQgb3JkZXJlZCByZWdpc3RyeSBvZiBrZXlzIHRyYWNrZWQtcmVhZCBpbiBUSElTIHN0YWdlIOKAlFxuICAgKiAgdGhlIHNvdXJjZSBvZiB0aGUgcGVyLXdyaXRlIHByZWZpeC4gT25seSBhbGxvY2F0ZWQgdW5kZXIgdGhlXG4gICAqICBgJ3JlYWRzLXByZWZpeCdgIGRpYWw7IGluc2VydGlvbi1vcmRlcmVkIChhIFNldCkgYW5kIG1vbm90b25pYywgd2hpY2hcbiAgICogIGlzIHdoYXQgbWFrZXMgXCJsYXN0IHdyaXRlJ3MgcHJlZml4ID09IHVuaW9uXCIgaG9sZCBpbiBkZWx0YSBtb2RlLiAqL1xuICBwcml2YXRlIF9wcm92ZW5hbmNlUmVhZHM/OiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogUkZDLTAwMyBEMiBob25lc3R5IG1hcmtlcnMg4oCUIHVudHJhY2tlZCByZWFkIHBhdGhzIHVzZWQgZHVyaW5nIFRISVNcbiAgICogc3RhZ2UncyBleGVjdXRpb24gKGAnYXJncydgIC8gYCdlbnYnYCAvIGAnc2lsZW50J2ApLiBNYXJrZWQgYnlcbiAgICogYFNjb3BlRmFjYWRlYCwgc3VyZmFjZWQgb24gdGhlIHN0YWdlJ3MgQ29tbWl0QnVuZGxlIGFzXG4gICAqIGB1bnRyYWNrZWRTb3VyY2VzYCwgdGhlbiBSRUxFQVNFRCB3aXRoIHRoZSBzdGFnaW5nIHN0YXRlIGF0IGNvbW1pdCBlbmRcbiAgICogKHNvIHRoZSByb3V0aW5lIGRvdWJsZS1jb21taXQgcGF0aHMg4oCUIGZvcmsgY2hpbGRyZW4sIHN1YmZsb3cgbW91bnRzIOKAlFxuICAgKiByZWNvcmQgdGhlIGZpZWxkIGV4YWN0bHkgb25jZSwgb24gdGhlIGZpcnN0IGNvbW1pdCkuIExhemlseSBhbGxvY2F0ZWQ6XG4gICAqIHN0YWdlcyB0aGF0IG5ldmVyIHRvdWNoIGFuIHVudHJhY2tlZCBwYXRoIHBheSBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfdW50cmFja2VkU291cmNlcz86IFNldDxVbnRyYWNrZWRTb3VyY2U+O1xuXG4gIC8qKiBPYnNlcnZlciBjYWxsZWQgYWZ0ZXIgY29tbWl0KCkg4oCUIHVzZWQgYnkgU2NvcGVGYWNhZGUgdG8gZmlyZSBTY29wZVJlY29yZGVyLm9uQ29tbWl0LiAqL1xuICBwcml2YXRlIF9jb21taXRPYnNlcnZlcj86IChcbiAgICBtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+LFxuICApID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcnVuSWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RhZ2VJZDogc3RyaW5nLFxuICAgIHNoYXJlZE1lbW9yeTogU2hhcmVkTWVtb3J5LFxuICAgIGJyYW5jaElkPzogc3RyaW5nLFxuICAgIGV2ZW50TG9nPzogRXZlbnRMb2csXG4gICAgaXNEZWNpZGVyPzogYm9vbGVhbixcbiAgKSB7XG4gICAgdGhpcy5ydW5JZCA9IHJ1bklkO1xuICAgIHRoaXMuc3RhZ2VOYW1lID0gbmFtZTtcbiAgICB0aGlzLnN0YWdlSWQgPSBzdGFnZUlkO1xuICAgIHRoaXMuc2hhcmVkTWVtb3J5ID0gc2hhcmVkTWVtb3J5O1xuICAgIHRoaXMuYnJhbmNoSWQgPSBicmFuY2hJZDtcbiAgICB0aGlzLmV2ZW50TG9nID0gZXZlbnRMb2c7XG4gICAgdGhpcy5pc0RlY2lkZXIgPSAhIWlzRGVjaWRlcjtcbiAgICB0aGlzLmlzRm9yayA9IGZhbHNlO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIFNoYXJlZE1lbW9yeSBpbnN0YW5jZSAobmVlZGVkIGJ5IHNjb3BlIGxheWVyKS4gKi9cbiAgZ2V0U2hhcmVkTWVtb3J5KCk6IFNoYXJlZE1lbW9yeSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5O1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGwgYSBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IuIFN1YnNlcXVlbnQgYGNvbW1pdCgpYCBjYWxscyB3aWxsXG4gICAqIGFwcGx5IHRoZSBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMgdG8gdGhpcyBtaXJyb3IgaW4gYWRkaXRpb25cbiAgICogdG8gdGhlIHJhdyBgc2hhcmVkTWVtb3J5YCArIGBldmVudExvZ2AuIENoaWxkIC8gbmV4dCBjb250ZXh0cyBpbmhlcml0XG4gICAqIHRoZSBtaXJyb3IgdmlhIGBjcmVhdGVOZXh0YCAvIGBjcmVhdGVDaGlsZGAuXG4gICAqXG4gICAqIENhbGxlZCBvbmNlIGF0IHRoZSByb290IGNvbnRleHQgYnkgYEV4ZWN1dGlvblJ1bnRpbWUuZW5hYmxlUmVkYWN0ZWRNaXJyb3IoKWAuXG4gICAqL1xuICB1c2VSZWRhY3RlZE1pcnJvcihtaXJyb3I6IFNoYXJlZE1lbW9yeSk6IHZvaWQge1xuICAgIHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnkgPSBtaXJyb3I7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgcmVkYWN0ZWQgbWlycm9yIGlmIGluc3RhbGxlZCwgZWxzZSB1bmRlZmluZWQuICovXG4gIGdldFJlZGFjdGVkU2hhcmVkTWVtb3J5KCk6IFNoYXJlZE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdGFsbCB0aGUgcnVuJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIHRoZSBPTkUgb3duZXIgb2YgXCJ3aGF0IGRvZXMgdGhlIHBvbGljeVxuICAgKiBzYXkgYWJvdXQgdGhpcyBwYXRoXCIgKGBtZW1vcnkvcmVkYWN0aW9uLnRzYCkuIFNhbWUgcGx1bWJpbmcgYXMgdGhlIG1pcnJvclxuICAgKiBhbmQgdGhlIGZvdXIgZGlhbHM6IHNldCBvbmNlIGF0IHRoZSByb290IGJ5IGBFeGVjdXRpb25SdW50aW1lLnVzZVJlZGFjdGlvbmBcbiAgICogKGZyb20gYEZsb3dDaGFydEV4ZWN1dG9yYCwgZXZlcnkgcnVuIGFuZCByZXN1bWUpLCBpbmhlcml0ZWQgdmlhXG4gICAqIHtAbGluayBjcmVhdGVOZXh0fS97QGxpbmsgY3JlYXRlQ2hpbGR9LCBwdXNoZWQgaW50byBzdWJmbG93IHJvb3QgY29udGV4dHNcbiAgICogYnkgYFN1YmZsb3dFeGVjdXRvcmAuIEV2ZXJ5IHN0YWdlZCB3cml0ZSBhbmQgZXZlcnkgdHJhY2tlZCByZWFkIGFza3MgaXQsXG4gICAqIHNvIGEgd3JpdGUgdGhhdCBuZXZlciBwYXNzZXMgYSBgU2NvcGVGYWNhZGVgIOKAlCBhIHN1YmZsb3cgc2VlZCwgYW5cbiAgICogYG91dHB1dE1hcHBlcmAgbWVyZ2UtYmFjaywgYSByZXN1bWUgcmUtc2VlZCDigJQgaXMgcmV0YWluZWQgdW5kZXIgdGhlIHNhbWVcbiAgICogdmVyZGljdCBhcyBhIGZhY2FkZSB3cml0ZS4gQWJzZW50IChiYXJlIGNvbnRleHRzIGluIHVuaXQgdGVzdHMpOiBldmVyeVxuICAgKiB2ZXJkaWN0IGlzIGAnY2xlYXInYCB1bmxlc3MgdGhlIGNhbGxlciBwYXNzZWQgYW4gZXhwbGljaXQgZmxhZy5cbiAgICovXG4gIHVzZVJlZGFjdGlvblJ1bGUocnVsZTogUmVkYWN0aW9uUnVsZSk6IHZvaWQge1xuICAgIHRoaXMucmVkYWN0aW9uUnVsZSA9IHJ1bGU7XG4gIH1cblxuICAvKiogVGhlIGluc3RhbGxlZCByZWRhY3Rpb24gcnVsZSwgaWYgYW55IChmYWNhZGUgbG9va3VwLCBzdWJmbG93IHByb3BhZ2F0aW9uKS4gKi9cbiAgZ2V0UmVkYWN0aW9uUnVsZSgpOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWRhY3Rpb25SdWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcmVhZC10cmFja2luZyBwb2xpY3kgZm9yIHRoaXMgY29udGV4dCAoIzE0KS4gQ2FsbGVkIGF0IHRoZSByb290XG4gICAqIGJ5IGBFeGVjdXRpb25SdW50aW1lLnVzZVJlYWRUcmFja2luZygpYCAocGx1bWJlZCBmcm9tXG4gICAqIGBGbG93Q2hhcnRFeGVjdXRvcmApOyBkZXNjZW5kYW50cyBpbmhlcml0IHZpYSBgY3JlYXRlTmV4dGAvYGNyZWF0ZUNoaWxkYCxcbiAgICogYW5kIGBTdWJmbG93RXhlY3V0b3JgIHB1c2hlcyB0aGUgcGFyZW50IGNvbnRleHQncyBtb2RlIGludG8gZWFjaCBzdWJmbG93XG4gICAqIHJvb3Qgc28gbmVzdGVkIGNoYXJ0cyBpbmhlcml0IHRvby5cbiAgICovXG4gIHVzZVJlYWRUcmFja2luZyhtb2RlOiBSZWFkVHJhY2tpbmdNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5yZWFkVHJhY2tpbmcgPSBtb2RlO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIGFjdGl2ZSByZWFkLXRyYWNraW5nIHBvbGljeSAodXNlZCBmb3Igc3ViZmxvdyBwcm9wYWdhdGlvbikuICovXG4gIGdldFJlYWRUcmFja2luZygpOiBSZWFkVHJhY2tpbmdNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkVHJhY2tpbmc7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB3cml0ZS10cmFja2luZyBwb2xpY3kgZm9yIHRoaXMgY29udGV4dCAoIzEzYy1BKS4gU2FtZSBwbHVtYmluZ1xuICAgKiBhcyB7QGxpbmsgdXNlUmVhZFRyYWNraW5nfTogY2FsbGVkIGF0IHRoZSByb290IGJ5XG4gICAqIGBFeGVjdXRpb25SdW50aW1lLnVzZVdyaXRlVHJhY2tpbmcoKWAgKHBsdW1iZWQgZnJvbSBgRmxvd0NoYXJ0RXhlY3V0b3JgKTtcbiAgICogZGVzY2VuZGFudHMgaW5oZXJpdCB2aWEgYGNyZWF0ZU5leHRgL2BjcmVhdGVDaGlsZGAsIGFuZCBgU3ViZmxvd0V4ZWN1dG9yYFxuICAgKiBwdXNoZXMgdGhlIHBhcmVudCBjb250ZXh0J3MgbW9kZSBpbnRvIGVhY2ggc3ViZmxvdyByb290LlxuICAgKi9cbiAgdXNlV3JpdGVUcmFja2luZyhtb2RlOiBXcml0ZVRyYWNraW5nTW9kZSk6IHZvaWQge1xuICAgIHRoaXMud3JpdGVUcmFja2luZyA9IG1vZGU7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgYWN0aXZlIHdyaXRlLXRyYWNraW5nIHBvbGljeSAodXNlZCBmb3Igc3ViZmxvdyBwcm9wYWdhdGlvbikuICovXG4gIGdldFdyaXRlVHJhY2tpbmcoKTogV3JpdGVUcmFja2luZ01vZGUge1xuICAgIHJldHVybiB0aGlzLndyaXRlVHJhY2tpbmc7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjb21taXQtdmFsdWVzIGVuY29kaW5nIHBvbGljeSBmb3IgdGhpcyBjb250ZXh0ICgjMTNjLUIpLiBTYW1lXG4gICAqIHBsdW1iaW5nIGFzIHtAbGluayB1c2VSZWFkVHJhY2tpbmd9L3tAbGluayB1c2VXcml0ZVRyYWNraW5nfTogY2FsbGVkIGF0XG4gICAqIHRoZSByb290IGJ5IGBFeGVjdXRpb25SdW50aW1lLnVzZUNvbW1pdFZhbHVlcygpYCAocGx1bWJlZCBmcm9tXG4gICAqIGBGbG93Q2hhcnRFeGVjdXRvcmApOyBkZXNjZW5kYW50cyBpbmhlcml0IHZpYSBgY3JlYXRlTmV4dGAvYGNyZWF0ZUNoaWxkYCxcbiAgICogYW5kIGBTdWJmbG93RXhlY3V0b3JgIHB1c2hlcyB0aGUgcGFyZW50IGNvbnRleHQncyBtb2RlIGludG8gZWFjaCBzdWJmbG93XG4gICAqIHJvb3QuXG4gICAqL1xuICB1c2VDb21taXRWYWx1ZXMobW9kZTogQ29tbWl0VmFsdWVzTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuY29tbWl0VmFsdWVzID0gbW9kZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBhY3RpdmUgY29tbWl0LXZhbHVlcyBwb2xpY3kgKHVzZWQgZm9yIHN1YmZsb3cgcHJvcGFnYXRpb24pLiAqL1xuICBnZXRDb21taXRWYWx1ZXMoKTogQ29tbWl0VmFsdWVzTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWl0VmFsdWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcGVyLXdyaXRlIHJlYWQtcHJvdmVuYW5jZSBwb2xpY3kgKCNQMSkuIFNhbWUgcGx1bWJpbmcgYXMgdGhlXG4gICAqIG90aGVyIHRocmVlIGRpYWxzOiBjYWxsZWQgYXQgdGhlIHJvb3QgYnlcbiAgICogYEV4ZWN1dGlvblJ1bnRpbWUudXNlV3JpdGVQcm92ZW5hbmNlKClgIChwbHVtYmVkIGZyb21cbiAgICogYEZsb3dDaGFydEV4ZWN1dG9yYCk7IGRlc2NlbmRhbnRzIGluaGVyaXQgdmlhIGBjcmVhdGVOZXh0YC9gY3JlYXRlQ2hpbGRgLFxuICAgKiBhbmQgYFN1YmZsb3dFeGVjdXRvcmAgcHVzaGVzIHRoZSBwYXJlbnQgY29udGV4dCdzIG1vZGUgaW50byBlYWNoIHN1YmZsb3dcbiAgICogcm9vdCBzbyBuZXN0ZWQgY2hhcnRzIGluaGVyaXQgdG9vLlxuICAgKi9cbiAgdXNlV3JpdGVQcm92ZW5hbmNlKG1vZGU6IFdyaXRlUHJvdmVuYW5jZU1vZGUpOiB2b2lkIHtcbiAgICB0aGlzLndyaXRlUHJvdmVuYW5jZSA9IG1vZGU7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgYWN0aXZlIHdyaXRlLXByb3ZlbmFuY2UgcG9saWN5ICh1c2VkIGZvciBzdWJmbG93IHByb3BhZ2F0aW9uKS4gKi9cbiAgZ2V0V3JpdGVQcm92ZW5hbmNlKCk6IFdyaXRlUHJvdmVuYW5jZU1vZGUge1xuICAgIHJldHVybiB0aGlzLndyaXRlUHJvdmVuYW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmQgYSB0cmFja2VkIHVzZXItbGV2ZWwgd3JpdGUsIHBvbGljeS1nYXRlZCAoIzEzYy1BKSDigJQgdGhlIHNpbmdsZVxuICAgKiBib29ra2VlcGluZyBwYXRoIGZvciB7QGxpbmsgc2V0T2JqZWN0fSBhbmQge0BsaW5rIHVwZGF0ZU9iamVjdH0uIEhvbGRzXG4gICAqIHRoZSBSRUZFUkVOQ0UgYW5kIHRoZSB2ZXJkaWN0ICg5LjIzLjApOyB0aGUgcmV0YWluZWQgZm9ybSBpcyB0YWtlbiBhdFxuICAgKiBjb21taXQgYnkge0BsaW5rIG1hdGVyaWFsaXNlV3JpdGVzfSwgb25jZSBwZXIga2V5LlxuICAgKlxuICAgKiBSZWRhY3Rpb24gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBkaWFsIGluIEVWRVJZIG1vZGU6IGEgcmVkYWN0ZWRcbiAgICogd3JpdGUgc3RvcmVzIHRoZSBgJ1tSRURBQ1RFRF0nYCBwbGFjZWhvbGRlciB1bmRlciBgJ2Z1bGwnYCBBTkRcbiAgICogYCdzdW1tYXJ5J2AgKGEgc3VtbWFyeSBtYXJrZXIgd291bGQgbGVhayB0aGUgdmFsdWUncyBwcmV2aWV3L3NpemUpLFxuICAgKiBhbmQgc3RvcmVzIG5vdGhpbmcgdW5kZXIgYCdvZmYnYCAoZW50cnkgc2tpcHBlZCBlbnRpcmVseSDigJQgbm90aGluZyB0b1xuICAgKiBsZWFrKS4gQSBmaWVsZC1sZXZlbCB2ZXJkaWN0IHNjcnVicyBhIGNsb25lIEJFRk9SRSB0aGUgZGlhbCBzZWVzIGl0LCBzb1xuICAgKiBhIHN1bW1hcnkgcHJldmlldyBjYW4gbmV2ZXIgc2hvdyB0aGUgc2VjcmV0IGVpdGhlci4gVGhlIHZlcmRpY3QgaXMgdGhlXG4gICAqIG9uZSBgc3RhZ2VXcml0ZWAgYXNrZWQgdGhlIHJ1bGUgZm9yIEJFRk9SRSBzdGFnaW5nLCBjYXJyaWVkIHRvIGNvbW1pdFxuICAgKiB3aXRoIHRoZSB2YWx1ZS4gVGhlIHN0YWdlZCB3cml0ZSBpdHNlbGYgaXMgdW5hZmZlY3RlZCDigJQgcmVkYWN0aW9uIG9mXG4gICAqIHRoZSBjb21taXR0ZWQgcGF5bG9hZCBpcyBoYW5kbGVkIGJ5IHRoZSB0cmFuc2FjdGlvbiBidWZmZXInc1xuICAgKiBgcmVkYWN0ZWRQYXRoc2AuXG4gICAqL1xuICBwcml2YXRlIHRyYWNrV3JpdGUoXG4gICAgdXNlcktleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gICAgb3BlcmF0aW9uOiAnc2V0JyB8ICd1cGRhdGUnIHwgJ2RlbGV0ZScsXG4gICkge1xuICAgIGlmICh0aGlzLndyaXRlVHJhY2tpbmcgPT09ICdvZmYnKSByZXR1cm47XG4gICAgKHRoaXMuX3BlbmRpbmdXcml0ZXMgPz89IG5ldyBNYXAoKSkuc2V0KHVzZXJLZXksIHsgdmFsdWUsIHZlcmRpY3QsIG9wZXJhdGlvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBgX3N0YWdlV3JpdGVzYCB3aXRoIGV2ZXJ5IHBlbmRpbmcgd3JpdGUgZm9sZGVkIGluIGFzIGl0cyByZXRhaW5lZCBmb3JtXG4gICAqIOKAlCB0aGUgcmVjb3JkIGEgcmVhZGVyIHNlZXMuIENvbnN1bWVzIG5vdGhpbmc6IGEgbWlkLXJ1biBzbmFwc2hvdCByZWFkc1xuICAgKiB0aGUgd3JpdGVzIHNvIGZhciwgYW5kIGNvbW1pdCBzdGlsbCBtYXRlcmlhbGlzZXMgdGhlIGZpbmFsIHZhbHVlcy5cbiAgICogUmV0dXJucyBgX3N0YWdlV3JpdGVzYCBpdHNlbGYgd2hlbiBub3RoaW5nIGlzIHBlbmRpbmcuXG4gICAqL1xuICBwcml2YXRlIHJldGFpbmVkV3JpdGVzKCk6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+IHtcbiAgICBpZiAoIXRoaXMuX3BlbmRpbmdXcml0ZXMpIHJldHVybiB0aGlzLl9zdGFnZVdyaXRlcztcbiAgICBjb25zdCBvdXQgPSB7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB3XSBvZiB0aGlzLl9wZW5kaW5nV3JpdGVzKSB7XG4gICAgICBvdXRba2V5XSA9IHtcbiAgICAgICAgdmFsdWU6IHRoaXMucmV0YWluZWRGb3JtKHcudmVyZGljdCwgdy52YWx1ZSwgdGhpcy53cml0ZVRyYWNraW5nLCBzdW1tYXJpemVXcml0ZVZhbHVlKSxcbiAgICAgICAgb3BlcmF0aW9uOiB3Lm9wZXJhdGlvbixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKipcbiAgICogVGFrZSB0aGUgcmV0YWluZWQgZm9ybSBvZiBldmVyeSBwZW5kaW5nIHdyaXRlIOKAlCBPTkNFIHBlciBrZXksIGZyb20gdGhlXG4gICAqIHZhbHVlIGFzIGl0IHN0YW5kcyBhdCBjb21taXQgKDkuMjMuMCkg4oCUIGFuZCByZWxlYXNlIHRoZSByZWZlcmVuY2VzLiBUaGVcbiAgICogZmlyc3QgdGhpbmcgYGNvbW1pdCgpYCBkb2VzLCBzbyB0aGUgYm9ycm93ZWQtbXV0YXRpb24gZ3VhcmQgYW5kIHRoZVxuICAgKiBjb21taXQgb2JzZXJ2ZXIgc2VlIHRoZSBmaW5pc2hlZCByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIG1hdGVyaWFsaXNlV3JpdGVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcGVuZGluZ1dyaXRlcykgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9zdGFnZVdyaXRlcyA9IHRoaXMucmV0YWluZWRXcml0ZXMoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmVsZWFzZWQgZXZlbiB3aGVuIGEgcmV0YWluZWQgZm9ybSBjYW5ub3QgYmUgdGFrZW4g4oCUIGFuIHVuY2xvbmVhYmxlXG4gICAgICAvLyB2YWx1ZSAoYSBmdW5jdGlvbiwgYSBQcm94eSkgaXMgYSBjb250cmFjdCB2aW9sYXRpb24gKFwic3RhdGUgdmFsdWVzXG4gICAgICAvLyBtdXN0IHN1cnZpdmUgc3RydWN0dXJlZENsb25lXCIpIHRoYXQgbm93IHN1cmZhY2VzIEhFUkUsIGF0IGNvbW1pdCxcbiAgICAgIC8vIGFuZCBmYWlscyB0aGUgcnVuIGxvdWRseTsgYSBsYXRlciBzbmFwc2hvdCBvZiB0aGUgZmFpbGVkIHJ1biBtdXN0XG4gICAgICAvLyBub3QgdGhyb3cgdGhlIHNhbWUgZXJyb3IgYWdhaW4uXG4gICAgICB0aGlzLl9wZW5kaW5nV3JpdGVzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZm9ybSBvZiBhIHZhbHVlIHRoZSBlbmdpbmUgUkVUQUlOUyAocmVhZHMgYW5kIHdyaXRlcyByZXRlbnRpb24pOlxuICAgKiB0aGUgcGxhY2Vob2xkZXIgYmVhdHMgZXZlcnkgZGlhbDsgYSBmaWVsZC1sZXZlbCBzY3J1YiBoYXBwZW5zIGJlZm9yZSB0aGVcbiAgICogZGlhbCBzZWVzIHRoZSB2YWx1ZTsgYSBjbGVhciB2YWx1ZSBpcyBzdW1tYXJpemVkIG9yIGNsb25lZCBhcyB0aGUgZGlhbFxuICAgKiBzYXlzLiBDYWxsZXJzIGhhbmRsZSBgdW5kZWZpbmVkYCBiZWZvcmUgYXNraW5nLlxuICAgKi9cbiAgcHJpdmF0ZSByZXRhaW5lZEZvcm0oXG4gICAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBtb2RlOiBSZWFkVHJhY2tpbmdNb2RlIHwgV3JpdGVUcmFja2luZ01vZGUsXG4gICAgc3VtbWFyaXplOiAodmFsdWU6IHVua25vd24pID0+IHVua25vd24sXG4gICk6IHVua25vd24ge1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBTQ09QRV9QTEFDRUhPTERFUjtcbiAgICBjb25zdCBzY3J1YmJlZCA9IHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycgPyBSZWRhY3Rpb25SdWxlLnNjcnViRmllbGRzKHZhbHVlLCB2ZXJkaWN0LnBhdGhzKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAobW9kZSA9PT0gJ3N1bW1hcnknKSByZXR1cm4gc3VtbWFyaXplKHNjcnViYmVkID8/IHZhbHVlKTtcbiAgICByZXR1cm4gc2NydWJiZWQgPz8gc3RydWN0dXJlZENsb25lKHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcnVsZSB3aXRoIHNvbWV0aGluZyB0byBzYXkg4oCUIGB1bmRlZmluZWRgIG9uIHRoZSBuby1wb2xpY3kgcGF0aCAobm9cbiAgICogcnVsZSBpbnN0YWxsZWQsIG9yIGEgcnVsZSB3aXRoIG5vIHBvbGljeSBlbnRyaWVzIGFuZCBubyBtYXJrZWQga2V5cyksIHNvXG4gICAqIGEgdHJhY2tlZCByZWFkIG9yIGEgc3RhZ2VkIHdyaXRlIHRoZXJlIHBheXMgbm8gdmVyZGljdCBjYWxsIGFuZCBubyBwYXRoXG4gICAqIGFsbG9jYXRpb24uIFRoZSBkZWZhdWx0IHJ1biBpcyBieXRlLWlkZW50aWNhbCBBTkQgY29zdC1pZGVudGljYWwuXG4gICAqL1xuICBwcml2YXRlIGFjdGl2ZVJ1bGUoKTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcnVsZSA9IHRoaXMucmVkYWN0aW9uUnVsZTtcbiAgICByZXR1cm4gcnVsZSAhPT0gdW5kZWZpbmVkICYmICFydWxlLmlzSW5lcnQoKSA/IHJ1bGUgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVEhFIE9ORSBGVU5ORUwgZXZlcnkgc3RhZ2VkIHdyaXRlIHBhc3NlcyB0aHJvdWdoIOKAlCBmYWNhZGUgd3JpdGVzIEFORFxuICAgKiB0aGUgcGF0aHMgdGhhdCBieXBhc3MgdGhlIGZhY2FkZSAoc3ViZmxvdyBzZWVkLCBgb3V0cHV0TWFwcGVyYFxuICAgKiBtZXJnZS1iYWNrLCByZXN1bWUgcmUtc2VlZCkuIFRoZSBPTkUgZGVjaXNpb24gaXMgbWFkZSBoZXJlOiBhbiBleHBsaWNpdFxuICAgKiBwZXItY2FsbCBmbGFnIG1ha2VzIHRoZSB2YWx1ZSBzZWNyZXQgb3V0cmlnaHQgKGFuZCBtYXJrcyB0aGUga2V5IGZvciB0aGVcbiAgICogcmVzdCBvZiB0aGUgcnVuLCB0aGUgZGVjbGFyZS1vbmNlIGNvbnRyYWN0KTsgb3RoZXJ3aXNlIHRoZSBpbnN0YWxsZWRcbiAgICogcnVsZSBkZWNpZGVzIGZyb20gdGhlIHVzZXItbGV2ZWwgcGF0aC4gSXQgc3RhZ2VzIHRoZSB3cml0ZSwgcmVnaXN0ZXJzXG4gICAqIHRoZSByZWRhY3RlZCBwYXRocyB0aGUgY29tbWl0IGxvZyBhbmQgbWlycm9yIHdpbGwgc2NydWIgKHdob2xlIGtleSwgb3JcbiAgICogdGhlIGZpZWxkcyBpbnNpZGUgdGhlIHZhbHVlKSwgYW5kIGtlZXBzIHRoZSBydW4ncyBtYXJrZWQta2V5cyBzZXQgaW5cbiAgICogc3RlcCAoYSB3aG9sZSB2ZXJkaWN0IG1hcmtzIGl0cyBrZXk7IGEgZGVsZXRlIGNsZWFycyB0aGUgbWFyaykuIFJldHVybnNcbiAgICogdGhlIHZlcmRpY3Qgc28gdGhlIGNhbGxlciByZXRhaW5zIGFuZCByZXBvcnRzIHVuZGVyIHRoZSBzYW1lIGRlY2lzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGFnZVdyaXRlKFxuICAgIG5zUGF0aDogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgZXhwbGljaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4gICAgdmVyYjogJ3NldCcgfCAnbWVyZ2UnIHwgJ2RlbGV0ZScsXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICBjb25zdCB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0ID0gZXhwbGljaXRcbiAgICAgID8geyBraW5kOiAnd2hvbGUnLCBrZXk6IHVzZXJLZXlPZihwYXRoLCBrZXkpIH1cbiAgICAgIDogcnVsZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHJ1bGUudmVyZGljdEF0KHBhdGgsIGtleSlcbiAgICAgIDogQ0xFQVI7XG4gICAgY29uc3Qgd2hvbGUgPSB2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZSc7XG4gICAgY29uc3QgYnVmZmVyID0gdGhpcy5nZXRUcmFuc2FjdGlvbkJ1ZmZlcigpO1xuICAgIGlmICh2ZXJiID09PSAnbWVyZ2UnKSBidWZmZXIubWVyZ2UobnNQYXRoLCB2YWx1ZSwgd2hvbGUpO1xuICAgIGVsc2UgaWYgKHZlcmIgPT09ICdkZWxldGUnKSBidWZmZXIuZGVsZXRlKG5zUGF0aCwgd2hvbGUpO1xuICAgIGVsc2UgYnVmZmVyLnNldChuc1BhdGgsIHZhbHVlLCB3aG9sZSk7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycpIGJ1ZmZlci5tYXJrUmVkYWN0ZWRGaWVsZHMobnNQYXRoLCB2ZXJkaWN0LnBhdGhzKTtcbiAgICBpZiAodmVyYiA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgIHJ1bGU/LnVubWFyayh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gICAgfSBlbHNlIGlmICh3aG9sZSkge1xuICAgICAgLy8gVGhlIFJFQUwgcnVsZSwgbm90IHRoZSBhY3RpdmUgb25lOiBhbiBleHBsaWNpdCBtYXJrIG9uIGFuIGluZXJ0IHJ1bGVcbiAgICAgIC8vIGlzIGV4YWN0bHkgd2hhdCBtYWtlcyBpdCBhY3RpdmUgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4uXG4gICAgICB0aGlzLnJlZGFjdGlvblJ1bGU/Lm1hcmsodmVyZGljdC5rZXkpO1xuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDilIDilIAgVGhlIGZpcnN0LXRvdWNoIHN0YXRlIHZpZXcgKCMxMykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAqXG4gICAqIFdIQVQ6IHJldHVybnMgdGhlIGNvbW1pdHRlZCBzaGFyZWQgc3RhdGUgYXMgaXQgd2FzIGF0IHRoaXMgc3RhZ2UncyBGSVJTVFxuICAgKiB0b3VjaCAoZmlyc3QgcmVhZCBvciBmaXJzdCB3cml0ZSksIGNhcHR1cmluZyB0aGUgcmVmZXJlbmNlIG9uIGZpcnN0IGNhbGwuXG4gICAqIFNlcnZlcyB0d28gY29uc3VtZXJzOiByZWFkcyBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlICh7QGxpbmsgcmVhZFN0YXRlfSlcbiAgICogYW5kIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBkaWZmIGJhc2UgKHtAbGluayBnZXRUcmFuc2FjdGlvbkJ1ZmZlcn0pLlxuICAgKlxuICAgKiBXSFkgQSBCQVJFIFJFRkVSRU5DRSBJUyBTQUZFIOKAlCB0aGUgaW52YXJpYW50IHRoaXMgcmVzdHMgb246IGNvbW1pdHRlZFxuICAgKiBzdGF0ZSBpcyBpbW11dGFibGUtYWZ0ZXItc3dhcC4gRXZlcnkgd3JpdGUgdG8gYFNoYXJlZE1lbW9yeWAgYnVpbGRzIHRoZVxuICAgKiBORVhUIGdlbmVyYXRpb24gYW5kIHN3YXBzIGl0IGluIChjb3B5LW9uLXdyaXRlLCA5LjI5LjA6IGBhcHBseVBhdGNoYCB2aWFcbiAgICogYG5leHRHZW5lcmF0aW9uYCwgYW5kIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYCB0b28pIOKAlCBpdCBjb3BpZXMgdGhlIHJvb3RcbiAgICogYW5kIHRoZSBjb250YWluZXJzIG9uIGVhY2ggd3JpdHRlbiBwYXRoLCBzaGFyZXMgdGhlIHJlc3QsIGFuZCBuZXZlclxuICAgKiBlZGl0cyBhIGNvbnRhaW5lciBvZiB0aGUgZ2VuZXJhdGlvbiBhIHN0YWdlIGNhcHR1cmVkIGhlcmUuIEhvbGRpbmcgdGhlXG4gICAqIHJlZmVyZW5jZSB0aGVyZWZvcmUgZ2l2ZXMgdGhpcyBzdGFnZSBhIHN0YWJsZSBzbmFwc2hvdCBhdCB6ZXJvIGNvc3Qg4oCUIG5vXG4gICAqIGNsb25lLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mICMxMy4gVGhlIHRyYW5zYWN0aW9uIGJ1ZmZlcidzXG4gICAqIG5ldC1jaGFuZ2UgZGlmZiBiYXNlIHJlc3RzIG9uIHRoZSBzYW1lIGd1YXJhbnRlZTogaXQgSVMgdGhpcyB2aWV3LlxuICAgKlxuICAgKiBXSFkgRklSU1QgVE9VQ0gsIG5vdCBmaXJzdCB3cml0ZTogdGhlIHByZS0jMTMgZWFnZXIgZW5naW5lIGNsb25lZCB0aGVcbiAgICogc3RhdGUgaW50byB0aGUgYnVmZmVyIGF0IHRoZSBzdGFnZSdzIGZpcnN0IEFDQ0VTUywgYW5jaG9yaW5nIGJvdGggaXRzXG4gICAqIHNuYXBzaG90IHJlYWRzIGFuZCBpdHMgY29tbWl0IGJhc2VsaW5lICh0aGUgbmV0LWNoYW5nZSBkaWZmIGJhc2UpIHRoZXJlLlxuICAgKiAjMTMncyBmaXJzdCBjdXQgYW5jaG9yZWQgdGhlIGxhenkgYnVmZmVyIGF0IGZpcnN0IFdSSVRFIOKAlCBvYnNlcnZhYmx5XG4gICAqIGRpZmZlcmVudCB3aGVuIHNvbWV0aGluZyBlbHNlIGNvbW1pdHMgaW4gdGhlIGdhcCBiZXR3ZWVuIHRoaXMgc3RhZ2Unc1xuICAgKiBmaXJzdCByZWFkIGFuZCBpdHMgZmlyc3Qgd3JpdGUuIFRoYXQgZ2FwIGlzIFJFQUNIQUJMRTogZm9yayBzaWJsaW5ncyBhcmVcbiAgICogbmFtZXNwYWNlLWlzb2xhdGVkIGZvciBydW4tc2NvcGVkIGtleXMgKGVhY2ggY2hpbGQgd3JpdGVzIHVuZGVyXG4gICAqIGBydW5zLzxjaGlsZElkPi9gKSwgYnV0IFJPT1QtbGV2ZWwga2V5cyBhcmUgc2hhcmVkIOKAlCB3cml0dGVuIHZpYVxuICAgKiBgc2V0R2xvYmFsYCBmcm9tIGNvbnN1bWVyIHNjb3BlIGNvZGUgYW5kLCBjcml0aWNhbGx5LCBieVxuICAgKiBgU3ViZmxvd0lucHV0TWFwcGVyYCdzIG91dHB1dCBtYXBwaW5nIChgcGFyZW50Q29udGV4dC5zZXRHbG9iYWxgKSwgd2hpY2hcbiAgICogaXMgZXhhY3RseSB3aGF0IHJ1bnMgd2hlbiBhIHN1YmZsb3cgaXMgYSBmb3JrIGJyYW5jaC4gQSBzaWJsaW5nJ3NcbiAgICogcm9vdC1rZXkgY29tbWl0IGxhbmRpbmcgaW4gdGhlIGdhcCB3b3VsZCBzaGlmdCB0aGlzIHN0YWdlJ3MgZGlmZiBiYXNlLFxuICAgKiBtYWtpbmcgaXRzIENvbW1pdEJ1bmRsZSByZWNvcmQgYSBwaGFudG9tIGNoYW5nZSAob3Igc3dhbGxvdyBhIHJlYWwgb25lKVxuICAgKiByZWxhdGl2ZSB0byB0aGUgZWFnZXIgZW5naW5lLiBBbmNob3JpbmcgdGhlIHZpZXcgYXQgZmlyc3QgdG91Y2ggcmVzdG9yZXNcbiAgICogdGhlIEVYQUNUIGVhZ2VyIHNlbWFudGljcyDigJQgc2VxdWVudGlhbCBBTkQgcGFyYWxsZWwg4oCUIGF0IHplcm8gY2xvbmUgY29zdC5cbiAgICpcbiAgICogUmVhZCB2aXNpYmlsaXR5IGlzIHR3by10aWVyLCBtYXRjaGluZyBlYWdlciBieXRlLWZvci1ieXRlOiBrZXlzIHByZXNlbnRcbiAgICogaW4gdGhlIHZpZXcgYXQgZmlyc3QgdG91Y2ggcmVhZCByZXBlYXRhYmx5IGZyb20gaXQ7IGtleXMgQUJTRU5UIGZyb20gaXRcbiAgICogZmFsbCBiYWNrIHRvIExJVkUgc3RhdGUgKHRoZSBlYWdlciBlbmdpbmUncyBleGFjdCBmYWxsYmFjayDigJQgYVxuICAgKiBtaWQtZmxpZ2h0IHNpYmxpbmcgcm9vdC1rZXkgd3JpdGUgd2FzIGFsd2F5cyB2aXNpYmxlIHRvIHJlYWRzLCBhbmRcbiAgICogc3RheXMgdmlzaWJsZTsgb25seSB0aGUgRElGRiBCQVNFIGlzIHBpbm5lZCkuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0VG91Y2hTdGF0ZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgaWYgKCF0aGlzLnN0YXRlVmlldykge1xuICAgICAgdGhpcy5zdGF0ZVZpZXcgPSB0aGlzLnNoYXJlZE1lbW9yeS5nZXRTdGF0ZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zdGF0ZVZpZXc7XG4gIH1cblxuICAvKiogTGF6aWx5IGNyZWF0ZXMgdGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciBvbiB0aGUgc3RhZ2UncyBGSVJTVCBXUklURSAoIzEzKS5cbiAgICpcbiAgICogIFJlYWRzIE5FVkVSIGNvbnN0cnVjdCBpdDogcmVhZC15b3VyLXdyaXRlcyBvbmx5IG1hdHRlcnMgb25jZSBhIHN0YWdlZFxuICAgKiAgd3JpdGUgZXhpc3RzLCBzbyBiZWZvcmUgdGhhdCB7QGxpbmsgZ2V0VmFsdWV9L3tAbGluayBnZXRWYWx1ZURpcmVjdH1cbiAgICogIHNlcnZlIGZyb20gdGhlIGZpcnN0LXRvdWNoIHN0YXRlIHZpZXcgYW5kIHtAbGluayBjb21taXR9IHJlY29yZHMgYW5cbiAgICogIGVtcHR5IGJ1bmRsZSDigJQgYWxsIHdpdGggWkVSTyBgc3RydWN0dXJlZENsb25lYHMgb2YgdGhlIHNoYXJlZCBzdGF0ZS5cbiAgICpcbiAgICogIFRoZSBidWZmZXIncyBiYXNlIGlzIHRoZSBGSVJTVC1UT1VDSCB2aWV3LCBOT1QgdGhlIGxpdmUgc3RhdGUgYXQgd3JpdGVcbiAgICogIHRpbWU6IHVuZGVyIHBhcmFsbGVsIGZvcmtzIGEgc2libGluZyBtYXkgaGF2ZSBjb21taXR0ZWQgYmV0d2VlbiB0aGlzXG4gICAqICBzdGFnZSdzIGZpcnN0IHJlYWQgYW5kIHRoaXMgd3JpdGUsIGFuZCB0aGUgbmV0LWNoYW5nZSBkaWZmIGJhc2UgbXVzdFxuICAgKiAgc3RheSBhbmNob3JlZCBhdCBmaXJzdCB0b3VjaCB0byBtYXRjaCB0aGUgZWFnZXIgZW5naW5lIOKAlCBzZWVcbiAgICogIHtAbGluayBmaXJzdFRvdWNoU3RhdGV9LiAqL1xuICBnZXRUcmFuc2FjdGlvbkJ1ZmZlcigpOiBUcmFuc2FjdGlvbkJ1ZmZlciB7XG4gICAgaWYgKCF0aGlzLmJ1ZmZlcikge1xuICAgICAgLy8gUGVyLXdyaXRlIHByb3ZlbmFuY2UgKCNQMSk6IGhhbmQgdGhlIGJ1ZmZlciBhIGxpdmUgdmlldyBvZiB0aGlzXG4gICAgICAvLyBzdGFnZSdzIHJlYWQgcHJlZml4IOKAlCBldmFsdWF0ZWQgQVQgRUFDSCBXUklURSwgc28gZWFjaCBzdGFnZWQgb3BcbiAgICAgIC8vIGNhcHR1cmVzIGV4YWN0bHkgdGhlIHJlYWRzIHRoYXQgcHJlY2VkZWQgaXQgKHRlbXBvcmFsIHByZWZpeCkuXG4gICAgICBjb25zdCByZWFkS2V5c1Byb3ZpZGVyID1cbiAgICAgICAgdGhpcy53cml0ZVByb3ZlbmFuY2UgPT09ICdyZWFkcy1wcmVmaXgnID8gKCkgPT4gWy4uLih0aGlzLl9wcm92ZW5hbmNlUmVhZHMgPz8gW10pXSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFRoZSBzdGFnZSdzIGFkZHJlc3Mg4oCUIHdoZXJlIGB3aXRoTmFtZXNwYWNlYCBwdXRzIGl0cyB3cml0ZXMgKDkuMzAuMDpcbiAgICAgIC8vIHRoZSBhZG1pdHRlZCByZWNvcmQgcmVhZHMgdGhlIGNvbnRhaW5lcnMgdGhlcmUgYXMgd2hlcmUgdGhlIHN0YWdlXG4gICAgICAvLyB3cml0ZXMsIG5ldmVyIGFzIGEgdmFsdWUgaXQgcmVhZCkuXG4gICAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5uYW1lc3BhY2VJZCA/IFsncnVucycsIHRoaXMubmFtZXNwYWNlSWRdIDogW107XG4gICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBUcmFuc2FjdGlvbkJ1ZmZlcih0aGlzLmZpcnN0VG91Y2hTdGF0ZSgpLCB0aGlzLmNvbW1pdFZhbHVlcywgcmVhZEtleXNQcm92aWRlciwgYWRkcmVzcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJ1ZmZlcjtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgYW4gYWJzb2x1dGUgcGF0aCBpbnNpZGUgdGhlIHNoYXJlZCBtZW1vcnkgKHJ1biBuYW1lc3BhY2UpLiAqL1xuICBwcml2YXRlIHdpdGhOYW1lc3BhY2UocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5uYW1lc3BhY2VJZCkge1xuICAgICAgcmV0dXJuIFsuLi5wYXRoLCBrZXldO1xuICAgIH1cbiAgICByZXR1cm4gWydydW5zJywgdGhpcy5uYW1lc3BhY2VJZCwgLi4ucGF0aCwga2V5XTtcbiAgfVxuXG4gIC8qKiBUaGUgcnVuIG5hbWVzcGFjZSB3cml0ZXMgYW5kIHJlYWRzIGdvIHRvOiB7QGxpbmsgYWRkcmVzc1J1bklkfSwgZWxzZSBgcnVuSWRgLiAqL1xuICBwcml2YXRlIGdldCBuYW1lc3BhY2VJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFkZHJlc3NSdW5JZCA/PyB0aGlzLnJ1bklkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGFuZCByZWFkIGF0IEFOT1RIRVIgZnJhbWUncyBhZGRyZXNzIChpdHMgcnVuIG5hbWVzcGFjZSkgd2hpbGUgdGhpc1xuICAgKiBmcmFtZSBrZWVwcyBpdHMgb3duIGlkZW50aXR5IG9uIHRoZSByZWNvcmQg4oCUIGBzdGFnZWAsIGBzdGFnZUlkYCxcbiAgICogYHJ1bnRpbWVTdGFnZUlkYCwgdGFncy4gQSBzdWJmbG93IG1vdW50J3MgbWVyZ2UtYmFjayBpcyB0aGUgb25lIGNhbGxlclxuICAgKiAoYFN1YmZsb3dFeGVjdXRvciDCtyBleGVjdXRlU3ViZmxvd2AsIFIxMyk6IHRoZSBtb3VudCBmcmFtZSBvZiBhIGJyYW5jaCBvclxuICAgKiBmb3JrIGNoaWxkIGxhbmRzIGl0cyB2YWx1ZXMgd2hlcmUgaXRzIHBhcmVudCB3cml0ZXMsIGFzIGJlZm9yZSwgYW5kIGl0c1xuICAgKiBidW5kbGUgbm93IG5hbWVzIHRoZSBtb3VudCBpbnN0ZWFkIG9mIHRoZSBzdGFnZSBiZWZvcmUgaXQuIFJlZnVzZWQgb25jZVxuICAgKiB0aGUgZnJhbWUgaGFzIHN0YWdlZCBhbnl0aGluZyDigJQgaXRzIGJ1ZmZlcidzIGFkZHJlc3MgaXMgZml4ZWQgdGhlbi5cbiAgICovXG4gIHVzZUFkZHJlc3NPZihmcmFtZTogU3RhZ2VDb250ZXh0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYnVmZmVyICYmIGZyYW1lLm5hbWVzcGFjZUlkICE9PSB0aGlzLm5hbWVzcGFjZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbZm9vdHByaW50XSBTdGFnZUNvbnRleHQudXNlQWRkcmVzc09mOiAnJHt0aGlzLnN0YWdlSWR9JyBoYXMgYWxyZWFkeSBzdGFnZWQgd3JpdGVzIGF0IGl0cyBvd24gYWRkcmVzcy5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5hZGRyZXNzUnVuSWQgPSBmcmFtZS5uYW1lc3BhY2VJZDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBXcml0ZSBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHBhdGNoKHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHNob3VsZFJlZGFjdCA9IGZhbHNlKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnc2V0Jyk7XG4gIH1cblxuICBzZXQocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2gocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICBtZXJnZShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBzaG91bGRSZWRhY3Q/OiBib29sZWFuKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhZ2VXcml0ZSh0aGlzLndpdGhOYW1lc3BhY2UocGF0aCwga2V5KSwgcGF0aCwga2V5LCB2YWx1ZSwgc2hvdWxkUmVkYWN0LCAnbWVyZ2UnKTtcbiAgfVxuXG4gIHNldE9iamVjdChcbiAgICBwYXRoOiBzdHJpbmdbXSxcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBzaG91bGRSZWRhY3Q/OiBib29sZWFuLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIG9wZXJhdGlvbk92ZXJyaWRlPzogJ3NldCcgfCAnZGVsZXRlJyxcbiAgKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgLy8gRXhwbGljaXQgZGVsZXRpb24gKFNjb3BlRmFjYWRlLmRlbGV0ZVZhbHVlKSBzdGFnZXMgYSBkaXN0aW5jdCBvcCBzb1xuICAgIC8vIGRlbHRhLW1vZGUgY29tbWl0cyAoIzEzYy1CKSBjYW4gZW1pdCBhIHJlYWwgYGRlbGV0ZWAgdHJhY2UgZW50cnkuXG4gICAgLy8gVW5kZXIgdGhlIGRlZmF1bHQgJ2Z1bGwnIG1vZGUgdGhlIGJ1ZmZlciBjb21taXRzIGl0IGFzIGFcbiAgICAvLyBzZXQtb2YtdW5kZWZpbmVkIOKAlCBieXRlLWlkZW50aWNhbCB0byB0aGUgaGlzdG9yaWNhbCBmbGF0dGVuaW5nLlxuICAgIGNvbnN0IHZlcmRpY3QgPVxuICAgICAgb3BlcmF0aW9uT3ZlcnJpZGUgPT09ICdkZWxldGUnXG4gICAgICAgID8gdGhpcy5zdGFnZVdyaXRlKHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkpLCBwYXRoLCBrZXksIHVuZGVmaW5lZCwgc2hvdWxkUmVkYWN0LCAnZGVsZXRlJylcbiAgICAgICAgOiB0aGlzLnN0YWdlV3JpdGUodGhpcy53aXRoTmFtZXNwYWNlKHBhdGgsIGtleSksIHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCwgJ3NldCcpO1xuICAgIC8vIFRyYWNrIHVzZXItbGV2ZWwgd3JpdGUgKHByZS1uYW1lc3BhY2UpIGZvciBtZW1vcnkgdmlldyArIG9uQ29tbWl0IOKAlFxuICAgIC8vIHBvbGljeS1nYXRlZCAoIzEzYy1BKSwgc2VlIHRyYWNrV3JpdGUuXG4gICAgdGhpcy50cmFja1dyaXRlKHVzZXJLZXlPZihwYXRoLCBrZXkpLCB2YWx1ZSwgdmVyZGljdCwgb3BlcmF0aW9uT3ZlcnJpZGUgPz8gJ3NldCcpO1xuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgY29uc3QgdGFnZ2VkID0gZGVzY3JpcHRpb24uc3RhcnRzV2l0aCgnWycpID8gZGVzY3JpcHRpb24gOiBgW1dSSVRFXSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIHRhZ2dlZCk7XG4gICAgfVxuICAgIHJldHVybiB2ZXJkaWN0O1xuICB9XG5cbiAgdXBkYXRlT2JqZWN0KFxuICAgIHBhdGg6IHN0cmluZ1tdLFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICAgIHNob3VsZFJlZGFjdD86IGJvb2xlYW4sXG4gICk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLm1lcmdlKHBhdGgsIGtleSwgdmFsdWUsIHNob3VsZFJlZGFjdCk7XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCB3cml0ZSAocHJlLW5hbWVzcGFjZSkgZm9yIG1lbW9yeSB2aWV3ICsgb25Db21taXQg4oCUXG4gICAgLy8gcG9saWN5LWdhdGVkICgjMTNjLUEpLCBzZWUgdHJhY2tXcml0ZS5cbiAgICB0aGlzLnRyYWNrV3JpdGUodXNlcktleU9mKHBhdGgsIGtleSksIHZhbHVlLCB2ZXJkaWN0LCAndXBkYXRlJyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICBzZXRSb290KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMucGF0Y2goW10sIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIFJvb3QtbGV2ZWwgKHVuLW5hbWVzcGFjZWQpIHdyaXRlIOKAlCB0aGUgc3ViZmxvdyBzZWVkIGFuZCBtZXJnZS1iYWNrIHBhdGguICovXG4gIHNldEdsb2JhbChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgdGhpcy5zdGFnZVdyaXRlKFtrZXldLCBbXSwga2V5LCB2YWx1ZSwgdW5kZWZpbmVkLCAnc2V0Jyk7XG4gICAgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmRlYnVnLmFkZExvZygnbWVzc2FnZScsIGRlc2NyaXB0aW9uKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVHbG9iYWxDb250ZXh0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIHRoaXMuc3RhZ2VXcml0ZShba2V5XSwgW10sIGtleSwgdmFsdWUsIHVuZGVmaW5lZCwgJ3NldCcpO1xuICB9XG5cbiAgYXBwZW5kVG9BcnJheShwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIGl0ZW1zOiB1bmtub3duW10sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID0gQXJyYXkuaXNBcnJheShleGlzdGluZykgPyBbLi4uZXhpc3RpbmcsIC4uLml0ZW1zXSA6IFsuLi5pdGVtc107XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICBtZXJnZU9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGRlc2NyaXB0aW9uPzogc3RyaW5nKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFZhbHVlKHBhdGgsIGtleSk7XG4gICAgY29uc3QgbWVyZ2VkID1cbiAgICAgIGV4aXN0aW5nICYmIHR5cGVvZiBleGlzdGluZyA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZXhpc3RpbmcpXG4gICAgICAgID8geyAuLi4oZXhpc3RpbmcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLCAuLi5vYmogfVxuICAgICAgICA6IHsgLi4ub2JqIH07XG4gICAgdGhpcy5zZXRPYmplY3QocGF0aCwga2V5LCBtZXJnZWQsIGZhbHNlLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZCBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBCdWZmZXItYXdhcmUgcmVhZCwgbWlycm9yaW5nIHRoZSBlYWdlciBlbmdpbmUncyByZWFkIG9yZGVyIGJ5dGUtZm9yLWJ5dGU6XG4gICAqXG4gICAqICAgIDEuIHN0YWdlZCB3cml0ZXMgKyBmaXJzdC10b3VjaCBzbmFwc2hvdCDigJQgYGJ1ZmZlci5nZXRgIG92ZXIgaXRzXG4gICAqICAgICAgIHdvcmtpbmdDb3B5IHdoZW4gdGhlIGJ1ZmZlciBleGlzdHMsIGVsc2UgYG5hdGl2ZUdldGAgb3ZlciB0aGVcbiAgICogICAgICAgemVyby1jbG9uZSBzdGF0ZSB2aWV3ICh0aGUgYnVmZmVyJ3MgYmFzZSBJUyB0aGF0IHZpZXcsIHNvIHRoZSB0d29cbiAgICogICAgICAgdGllcnMgYWdyZWUgb24gY29udGVudCk7XG4gICAqICAgIDIuIExJVkUgc3RhdGUgdmlhIGBzaGFyZWRNZW1vcnkuZ2V0VmFsdWVgIGZvciBrZXlzIGFic2VudCBmcm9tIHRoZVxuICAgKiAgICAgICBzbmFwc2hvdCDigJQgaW5jbHVkaW5nIGl0cyBydW7ihpJnbG9iYWwgbmFtZXNwYWNlIGZhbGxiYWNrLiBUaGUgZWFnZXJcbiAgICogICAgICAgZW5naW5lIGhhZCB0aGlzIGV4YWN0IGxpdmUgZmFsbGJhY2sgZm9yIHNuYXBzaG90LW1pc3Npbmcga2V5cztcbiAgICogICAgICAgYnl0ZS1pZGVudGl0eSBvdmVyIHB1cml0eS4gQWZ0ZXIgdGhlIHN0YWdlJ3MgZmlyc3Qgd3JpdGUgc3VjaCBhXG4gICAqICAgICAgIHZhbHVlIGNhbiBiZSB0aGUgdmVyeSBjb250YWluZXIgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSBob2xkcyBhdFxuICAgKiAgICAgICB0aGUgcGF0aCAodGhlIHN0YWdlIGRlbGV0ZWQgb3IgdW5zZXQgaXQsIG9yIHJlcGxhY2VkIGEgY29udGFpbmVyXG4gICAqICAgICAgIGFib3ZlIGl0KSwgc28gdGhlIGJhc2UgaXMgZGV0YWNoZWQgdGhlcmUgZmlyc3RcbiAgICogICAgICAgKGBUcmFuc2FjdGlvbkJ1ZmZlciDCtyBkZXRhY2hCYXNlYCk6IGFuIGluLXBsYWNlIGVkaXQgb2YgdGhlIHZhbHVlXG4gICAqICAgICAgIChvdXQgb2YgY29udHJhY3QpIHdyaXR0ZW4gYmFjayBpcyByZWNvcmRlZCwgYXMgb24gOS4yOC4wLCB3aG9zZVxuICAgKiAgICAgICBiYXNlIHdhcyBhIGNsb25lIHRha2VuIGF0IHRoZSBmaXJzdCB3cml0ZS5cbiAgICpcbiAgICogIFJlYWRzIG5ldmVyIGNvbnN0cnVjdCB0aGUgYnVmZmVyICgjMTMpOiBhIHN0YWdlIHRoYXQgbmV2ZXIgd3JpdGVzXG4gICAqICBwZXJmb3JtcyB6ZXJvIGNsb25lcyBvZiB0aGUgc2hhcmVkIHN0YXRlLiAqL1xuICBwcml2YXRlIHJlYWRTdGF0ZShwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgbmFtZXNwYWNlZCA9IHRoaXMud2l0aE5hbWVzcGFjZShwYXRoLCBrZXkgYXMgc3RyaW5nKTtcbiAgICBjb25zdCBmcm9tU25hcHNob3QgPSB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyLmdldChuYW1lc3BhY2VkKSA6IG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2hTdGF0ZSgpLCBuYW1lc3BhY2VkKTtcbiAgICBpZiAodHlwZW9mIGZyb21TbmFwc2hvdCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmcm9tU25hcHNob3Q7XG4gICAgY29uc3QgbGl2ZSA9IHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKHRoaXMubmFtZXNwYWNlSWQsIHBhdGgsIGtleSk7XG4gICAgLy8gVGllciAyIGFmdGVyIHRoZSBmaXJzdCB3cml0ZToga2VlcCB0aGUgZGlmZiBiYXNlIGV4YWN0IChzZWUgYWJvdmUpLlxuICAgIGlmICh0aGlzLmJ1ZmZlciAmJiBsaXZlICE9PSBudWxsICYmIHR5cGVvZiBsaXZlID09PSAnb2JqZWN0JykgdGhpcy5idWZmZXIuZGV0YWNoQmFzZShuYW1lc3BhY2VkKTtcbiAgICByZXR1cm4gbGl2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFja2VkIHJlYWQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBCT1JST1dFRCDigJQgc2VlIHRoZSBjb250cmFjdCBvblxuICAgKiBgU2NvcGVGYWNhZGUuZ2V0VmFsdWVgLiBSZWFkLXRyYWNraW5nIGNvc3QgaXMgcG9saWN5LWdhdGVkICgjMTQpOlxuICAgKiBgJ2Z1bGwnYCBjbG9uZXMgdGhlIHZhbHVlIGludG8gYF9zdGFnZVJlYWRzYCAoaGlzdG9yaWNhbCBkZWZhdWx0KSxcbiAgICogYCdzdW1tYXJ5J2AgcmVjb3JkcyBhIGNoZWFwIG1hcmtlciwgYCdvZmYnYCByZWNvcmRzIG5vdGhpbmcuXG4gICAqL1xuICBnZXRWYWx1ZShwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nLCBkZXNjcmlwdGlvbj86IHN0cmluZykge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5yZWFkU3RhdGUocGF0aCwga2V5KTtcbiAgICAvLyBQZXItd3JpdGUgcHJvdmVuYW5jZSByZWdpc3RyeSAoI1AxKSDigJQga2V5IHN0cmluZ3Mgb25seSwgaW5kZXBlbmRlbnQgb2ZcbiAgICAvLyB0aGUgcmVhZFRyYWNraW5nIHJldGVudGlvbiBkaWFsICh3aGljaCBnb3Zlcm5zIFZBTFVFIHJldGVudGlvbiBiZWxvdykuXG4gICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMud3JpdGVQcm92ZW5hbmNlID09PSAncmVhZHMtcHJlZml4Jykge1xuICAgICAgKHRoaXMuX3Byb3ZlbmFuY2VSZWFkcyA/Pz0gbmV3IFNldCgpKS5hZGQocGF0aC5sZW5ndGggPiAwID8gWy4uLnBhdGgsIGtleV0uam9pbignLicpIDoga2V5KTtcbiAgICB9XG4gICAgLy8gVHJhY2sgdXNlci1sZXZlbCByZWFkIChwcmUtbmFtZXNwYWNlKSBmb3IgbWVtb3J5IHZpZXcg4oCUIHJldGFpbmVkIHVuZGVyXG4gICAgLy8gdGhlIHJ1bGUncyB2ZXJkaWN0ICg5LjE5LjApOiBhIHJlZGFjdGVkIGtleSBpcyByZXRhaW5lZCBhcyB0aGVcbiAgICAvLyBwbGFjZWhvbGRlciwgYSBmaWVsZC1sZXZlbCBrZXkgYXMgYSBzY3J1YmJlZCBjbG9uZSwgbmV2ZXIgdGhlIHNlY3JldC5cbiAgICAvLyBObyBwb2xpY3kgYW5kIG5vIG1hcmtzIOKGkiBubyB2ZXJkaWN0IGNhbGwsIG5vIGFsbG9jYXRpb24gKGFjdGl2ZVJ1bGUpLlxuICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJlYWRUcmFja2luZyAhPT0gJ29mZicpIHtcbiAgICAgIGNvbnN0IHJ1bGUgPSB0aGlzLmFjdGl2ZVJ1bGUoKTtcbiAgICAgIGlmIChwYXRoLmxlbmd0aCA+IDApICh0aGlzLl9uZXN0ZWRSZWFkcyA/Pz0gbmV3IFNldCgpKS5hZGQodXNlcktleU9mKHBhdGgsIGtleSkpO1xuICAgICAgZWxzZSBpZiAodGhpcy5yZWFkVHJhY2tpbmcgPT09ICdmdWxsJyAmJiBpc0Rldk1vZGUoKSkge1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHRoaXMuX3ZpZXdSZWFkcz8uZGVsZXRlKGtleSk7XG4gICAgICAgIGVsc2UgKHRoaXMuX3ZpZXdSZWFkcyA/Pz0gbmV3IFNldCgpKS5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YWdlUmVhZHNbdXNlcktleU9mKHBhdGgsIGtleSldID1cbiAgICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB0aGlzLnJldGFpbmVkRm9ybShcbiAgICAgICAgICAgICAgcnVsZSAhPT0gdW5kZWZpbmVkID8gcnVsZS52ZXJkaWN0QXQocGF0aCwga2V5KSA6IENMRUFSLFxuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgdGhpcy5yZWFkVHJhY2tpbmcsXG4gICAgICAgICAgICAgIHN1bW1hcml6ZVJlYWRWYWx1ZSxcbiAgICAgICAgICAgICk7XG4gICAgfVxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZWJ1Zy5hZGRMb2coJ21lc3NhZ2UnLCBgW1JFQURdICR7ZGVzY3JpcHRpb259YCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBSZWFkIHN0YXRlIHdpdGhvdXQgdHJhY2tpbmcgaW4gX3N0YWdlUmVhZHMgb3IgcGF5aW5nIHN0cnVjdHVyZWRDbG9uZSBjb3N0LlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZS5nZXRWYWx1ZVNpbGVudCgpIGZvciBhcnJheSBwcm94eSBpbnRlcm5hbCBvcGVyYXRpb25zLiAqL1xuICBnZXRWYWx1ZURpcmVjdChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMucmVhZFN0YXRlKHBhdGgsIGtleSk7XG4gIH1cblxuICBnZXRSb290KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKHRoaXMubmFtZXNwYWNlSWQsIFtdLCBrZXkpO1xuICB9XG5cbiAgZ2V0R2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhcmVkTWVtb3J5LmdldFZhbHVlKCcnLCBbXSwga2V5KTtcbiAgfVxuXG4gIGdldFNjb3BlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5zaGFyZWRNZW1vcnkuZ2V0U3RhdGUoKTtcbiAgfVxuXG4gIGdldFJ1bklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucnVuSWQ7XG4gIH1cblxuICAvLyDilIDilIAgQ29tbWl0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyOiByZWNvcmQgdGhhdCB0aGlzIHN0YWdlIGNvbnN1bWVkIGFuIHVudHJhY2tlZCByZWFkIHBhdGguXG4gICAqIENhbGxlZCBieSBgU2NvcGVGYWNhZGVgIChgZ2V0QXJnc2AvYGdldEVudmAvdW5zaGFkb3dlZCBgZ2V0VmFsdWVTaWxlbnRgKTtcbiAgICogc3VyZmFjZWQgYXMgYENvbW1pdEJ1bmRsZS51bnRyYWNrZWRTb3VyY2VzYCBvbiB0aGlzIHN0YWdlJ3MgY29tbWl0LlxuICAgKi9cbiAgbWFya1VudHJhY2tlZFNvdXJjZShzb3VyY2U6IFVudHJhY2tlZFNvdXJjZSk6IHZvaWQge1xuICAgICh0aGlzLl91bnRyYWNrZWRTb3VyY2VzID8/PSBuZXcgU2V0KCkpLmFkZChzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJGQy0wMDMgRDI6IHRoZSBgdW50cmFja2VkU291cmNlc2AgYnVuZGxlIGZyYWdtZW50IGZvciBjb21taXQoKSDigJQgYHt9YFxuICAgKiB3aGVuIG5vdGhpbmcgd2FzIG1hcmtlZCwgc28gdGhlIHNwcmVhZCBrZWVwcyB0aGUgZmllbGQgQUJTRU5UIChub3RcbiAgICogZW1wdHktYXJyYXktdmFsdWVkKSBhbmQgdW50b3VjaGVkIGNoYXJ0cyBzdGF5IGJ5dGUtaWRlbnRpY2FsLlxuICAgKi9cbiAgcHJpdmF0ZSB1bnRyYWNrZWRTb3VyY2VzRnJhZ21lbnQoKTogeyB1bnRyYWNrZWRTb3VyY2VzPzogVW50cmFja2VkU291cmNlW10gfSB7XG4gICAgaWYgKCF0aGlzLl91bnRyYWNrZWRTb3VyY2VzIHx8IHRoaXMuX3VudHJhY2tlZFNvdXJjZXMuc2l6ZSA9PT0gMCkgcmV0dXJuIHt9O1xuICAgIHJldHVybiB7IHVudHJhY2tlZFNvdXJjZXM6IFsuLi50aGlzLl91bnRyYWNrZWRTb3VyY2VzXSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBgdGFnc2AgYnVuZGxlIGZyYWdtZW50IGZvciBjb21taXQoKSDigJQgYHt9YCB3aGVuIHRoZSBzdGFnZSBkZWNsYXJlc1xuICAgKiBub25lLCBzbyBhbiB1bnRhZ2dlZCBjaGFydCdzIGxvZyBpcyBieXRlLWlkZW50aWNhbCB0byA5LjIwLjAuIEFkZGVkIGFmdGVyXG4gICAqIHRoZSBwYXlsb2FkIGVuY29kaW5nLCBzbyBpdCBpcyBpbmRlcGVuZGVudCBvZiBgY29tbWl0VmFsdWVzYDsgbmFtZXMsIHNvXG4gICAqIHJlZGFjdGlvbiBuZXZlciBzZWVzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSB0YWdzRnJhZ21lbnQoKTogeyB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW10gfSB7XG4gICAgaWYgKCF0aGlzLnRhZ3MgfHwgdGhpcy50YWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHt9O1xuICAgIHJldHVybiB7IHRhZ3M6IHRoaXMudGFncyB9O1xuICB9XG5cbiAgLyoqIFJlZ2lzdGVyIGFuIG9ic2VydmVyIHRoYXQgZmlyZXMgYWZ0ZXIgY29tbWl0KCkgYXBwbGllcyBwYXRjaGVzLlxuICAgKiAgVXNlZCBieSBTY29wZUZhY2FkZSB0byBkaXNwYXRjaCBTY29wZVJlY29yZGVyLm9uQ29tbWl0IGV2ZW50cy4gKi9cbiAgc2V0Q29tbWl0T2JzZXJ2ZXIoXG4gICAgb2JzZXJ2ZXI6IChtdXRhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgdmFsdWU6IHVua25vd247IG9wZXJhdGlvbjogJ3NldCcgfCAndXBkYXRlJyB8ICdkZWxldGUnIH0+KSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLl9jb21taXRPYnNlcnZlciA9IG9ic2VydmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIERldi1tb2RlIG9ubHk6IGRpZCB0aGlzIHN0YWdlIGNoYW5nZSwgSU4gUExBQ0UsIGEgdmFsdWUgaXQgbWVyZWx5IFJFQUQ/XG4gICAqXG4gICAqIFRoZSB0eXBlZCBzY29wZSBpbnRlcmNlcHRzIGV2ZXJ5IHdyaXRlIGl0IGNhbiByZWFjaCDigJQgYSBwcm9wZXJ0eSBhdCBhbnlcbiAgICogZGVwdGgsIGFuIGluZGV4ZWQgZWxlbWVudCwgYW4gYXJyYXkgbWV0aG9kLiBXaGF0IGl0IGNhbm5vdCByZWFjaCBpcyBhblxuICAgKiBlbGVtZW50IGhhbmRlZCBvdXQgYnkgYSByZWFkIG1ldGhvZCAoYGZpbmRgLCBgZmlsdGVyYCwgYGZvcuKApm9mYCxcbiAgICogYGZvckVhY2hgLCBkZXN0cnVjdHVyaW5nKTogd3JhcHBpbmcgdGhvc2Ugd291bGQgbWVhbiByZXR1cm5pbmcgcHJveGllcyBvdXRcbiAgICogb2YgZXZlcnkgcmVhZCwgd2hpY2ggaXMgYSBjb3N0IHRoZSBsaWJyYXJ5IHNob3VsZCBub3QgcGF5LiBTbyB0aGF0IGZhbWlseVxuICAgKiBpcyBXQVJORUQgQUJPVVQgcmF0aGVyIHRoYW4gaW50ZXJjZXB0ZWQg4oCUIGxvdWRseSwgaGVyZSwgaW5zdGVhZCBvZiBlbmRpbmdcbiAgICogdGhlIHJ1biB3aXRoIGEgY29tbWl0IGxvZyB0aGF0IHNpbGVudGx5IGRpc2FncmVlcyB3aXRoIGZpbmFsIHN0YXRlLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgUkVQT1JUIGFmdGVyIHRoZSBmYWN0LCBub3QgYSByZWZ1c2FsIGF0IHRoZSB3cml0ZTogdGhlIHdyaXRlIGhhc1xuICAgKiBhbHJlYWR5IGhhcHBlbmVkIGluIHBsYWNlIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGludGVyY2VwdC4gSXQgcnVucyB1bmRlclxuICAgKiBUV08gcHJlY29uZGl0aW9ucywgYm90aCBuYW1lZCBpbiB0aGUgUkVBRE1FIOKAlCBgZW5hYmxlRGV2TW9kZSgpYCwgYW5kXG4gICAqIGByZWFkVHJhY2tpbmc6ICdmdWxsJ2AgKHRoZSBkZWZhdWx0KSwgYmVjYXVzZSB0aGUgY29tcGFyaXNvbiBuZWVkcyB0aGVcbiAgICogY2xvbmUgb2YgdGhlIHZhbHVlIHRoYXQgbW9kZSByZXRhaW5zIGF0IHJlYWQgdGltZS4gQSBrZXkgdGhlIHN0YWdlIG5ldmVyXG4gICAqIHN0YWdlZCBtdXN0IHN0aWxsIGhvbGQgdGhhdCBjbG9uZSDigJQgY29tbWl0dGVkIHN0YXRlIGlzIGltbXV0YWJsZS1hZnRlci1zd2FwXG4gICAqIGFuZCB0aGUgYnVmZmVyJ3Mgd29ya2luZyBjb3B5IGlzIHByaXZhdGUgdG8gdGhpcyBzdGFnZS4gS2V5cyB0aGUgc3RhZ2UgRElEXG4gICAqIHN0YWdlIGFyZSBza2lwcGVkICh0aGV5IGFyZSBleHBlY3RlZCB0byBkaWZmZXIsIGFuZCB0aGV5IGFyZSBpbiB0aGUgcmVjb3JkKSxcbiAgICogc28gYXJlIGtleXMgdW5kZXIgYSByZWRhY3Rpb24gdmVyZGljdCwgd2hvc2UgcmV0YWluZWQgZm9ybSBpcyBkZWxpYmVyYXRlbHlcbiAgICogbm90IHRoZSB2YWx1ZSwgYW5kIHNvIGFyZSBrZXlzIHJlYWQgYXQgYSBuZXN0ZWQgcGF0aCAoYF9uZXN0ZWRSZWFkc2ApIOKAlFxuICAgKiB0aG9zZSBhcmUgZW5naW5lIHJlYWRzICh0aGUgc3ViZmxvdyBtZXJnZS1iYWNrKSwgbm90IHVzZXIgcmVhZHMuXG4gICAqXG4gICAqIEl0IGFsc28gb25seSBsb29rcyBhdCBrZXlzIHNlcnZlZCBmcm9tIHRoZSBQSU5ORUQgc291cmNlIOKAlCB0aGUgZmlyc3QtdG91Y2hcbiAgICogdmlldyBvciB0aGlzIHN0YWdlJ3Mgb3duIGJ1ZmZlci4gQSBrZXkgYWJzZW50IGZyb20gYm90aCB3YXMgc2VydmVkIGJ5XG4gICAqIGByZWFkU3RhdGVgJ3MgbGl2ZSBmYWxsYmFjaywgd2hpY2ggYSBwYXJhbGxlbCBzaWJsaW5nJ3Mgcm9vdC1rZXkgY29tbWl0IGNhblxuICAgKiBsZWdpdGltYXRlbHkgbW92ZTsgYWNjdXNpbmcgdGhlIHN0YWdlIHRoZXJlIHdvdWxkIGJlIGEgZmFsc2UgYWxhcm0uIEZvclxuICAgKiB0aGUgc2FtZSByZWFzb24gaXQgcnVucyBvbiB0aGUgZnJhbWUncyBGSVJTVCBjb21taXQgb25seTogdGhlIHJlYWRzIGJlbG9uZ1xuICAgKiB0byB0aGF0IHJvdW5kLCBhbmQgYnkgdGhlIGVuZ2luZSdzIHNlY29uZCByb3VuZCAoYSBmb3JrIGRvdWJsZS1jb21taXQsIGFcbiAgICogc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBjb21taXR0ZWQgYnJhbmNoIHBhcmVudCkgb3RoZXIgc3RhZ2VzIGhhdmVcbiAgICogbGVnaXRpbWF0ZWx5IG1vdmVkIHRoZSBzdGF0ZSB0aGV5IHdlcmUgY29tcGFyZWQgYWdhaW5zdC5cbiAgICpcbiAgICogQSBrZXkgdGhlIHN0YWdlIERJRCBzdGFnZSBpcyBzdGlsbCBjaGVja2VkIHdoZW4gaXRzIGxhc3QgcmVhZCBjYW1lIGZyb21cbiAgICogY29tbWl0dGVkIHN0YXRlICh7QGxpbmsgX3ZpZXdSZWFkc30g4oCUIHJlYWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSk6XG4gICAqIHRoYXQgcmVhZCB3YXMgdGhlIGNvbW1pdHRlZCBvYmplY3QgaXRzZWxmLCBhbmQgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSBJU1xuICAgKiB0aGF0IG9iamVjdCAoY29weS1vbi13cml0ZSwgOS4yOS4wKSwgc28gYW4gaW4tcGxhY2UgZWRpdCBmb2xsb3dlZCBieSBhXG4gICAqIHdyaXRlIG9mIHRoZSBrZXkgY29tbWl0cyBOTyBjaGFuZ2Ug4oCUIGxpdmUgc3RhdGUga2VlcHMgdGhlIGVkaXQsIHRoZSBsb2dcbiAgICogZG9lcyBub3QuIENvbXBhcmVkIGFnYWluc3QgY29tbWl0dGVkIHN0YXRlLCBub3QgdGhlIHdyaXR0ZW4gdmFsdWUsIHNvIGFcbiAgICogbGVnaXRpbWF0ZSB3cml0ZSBuZXZlciB0cmlwcyBpdC5cbiAgICpcbiAgICogQ29zdHMgbm90aGluZyBvdXRzaWRlIGBlbmFibGVEZXZNb2RlKClgLlxuICAgKi9cbiAgcHJpdmF0ZSB3YXJuT25Cb3Jyb3dlZE11dGF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghaXNEZXZNb2RlKCkgfHwgdGhpcy5yZWFkVHJhY2tpbmcgIT09ICdmdWxsJyB8fCB0aGlzLl9jb21taXR0ZWQpIHJldHVybjtcbiAgICBjb25zdCBydWxlID0gdGhpcy5hY3RpdmVSdWxlKCk7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5fc3RhZ2VSZWFkcykpIHtcbiAgICAgIGNvbnN0IHJldGFpbmVkID0gdGhpcy5fc3RhZ2VSZWFkc1trZXldO1xuICAgICAgLy8gT25seSBhIGNvbnRhaW5lciBjYW4gYmUgbXV0YXRlZCBpbiBwbGFjZTsgYSBwcmltaXRpdmUgcmVhZCBjYW5ub3QuXG4gICAgICBpZiAocmV0YWluZWQgPT09IG51bGwgfHwgdHlwZW9mIHJldGFpbmVkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICBpZiAodGhpcy5fbmVzdGVkUmVhZHM/LmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGlmIChydWxlICE9PSB1bmRlZmluZWQgJiYgcnVsZS52ZXJkaWN0QXQoW10sIGtleSkua2luZCAhPT0gJ2NsZWFyJykgY29udGludWU7XG4gICAgICBjb25zdCBuYW1lc3BhY2VkID0gdGhpcy53aXRoTmFtZXNwYWNlKFtdLCBrZXkpO1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9zdGFnZVdyaXRlcywga2V5KSB8fCB0aGlzLmJ1ZmZlcj8ud2FzU3RhZ2VkKG5hbWVzcGFjZWQpKSB7XG4gICAgICAgIHRoaXMud2Fybk9uQ29tbWl0dGVkTXV0YXRpb24oa2V5LCBuYW1lc3BhY2VkLCByZXRhaW5lZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgcGlubmVkIHNvdXJjZSBvbmx5IOKAlCBzZWUgdGhlIG5vdGUgb24gdGhlIGxpdmUgZmFsbGJhY2sgYWJvdmUuXG4gICAgICAvLyBgcGVla2AsIG5vdCBgZ2V0YDogYSByZXBvcnQgY29tcGFyZXMsIGFuZCBtdXN0IG5vdCB0YWtlIHRoZSBwcml2YXRlXG4gICAgICAvLyBjb3B5IGEgc3RhZ2UncyByZWFkIHdvdWxkIChjb3B5LW9uLXdyaXRlLCA5LjI5LjApLlxuICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIucGVlayhuYW1lc3BhY2VkKSA6IG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2hTdGF0ZSgpLCBuYW1lc3BhY2VkKTtcbiAgICAgIGlmIChjdXJyZW50ID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBwYXRoID0gZmlyc3REaWZmZXJpbmdQYXRoKHJldGFpbmVkLCBjdXJyZW50KTtcbiAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2Fybihib3Jyb3dlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBzdGFnZWQta2V5IGhhbGYgb2Yge0BsaW5rIHdhcm5PbkJvcnJvd2VkTXV0YXRpb259OiBkaWQgY29tbWl0dGVkIHN0YXRlIGl0c2VsZiBtb3ZlIHVuZGVyIGEgcmVhZD8gKi9cbiAgcHJpdmF0ZSB3YXJuT25Db21taXR0ZWRNdXRhdGlvbihrZXk6IHN0cmluZywgbmFtZXNwYWNlZDogc3RyaW5nW10sIHJldGFpbmVkOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl92aWV3UmVhZHM/LmhhcyhrZXkpKSByZXR1cm47XG4gICAgY29uc3QgY29tbWl0dGVkID0gbmF0aXZlR2V0KHRoaXMuZmlyc3RUb3VjaFN0YXRlKCksIG5hbWVzcGFjZWQpO1xuICAgIGlmIChjb21taXR0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhdGggPSBmaXJzdERpZmZlcmluZ1BhdGgocmV0YWluZWQsIGNvbW1pdHRlZCk7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKGNvbW1pdHRlZE11dGF0aW9uTWVzc2FnZSh0aGlzLnN0YWdlTmFtZSwga2V5LCBwYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggc3RhZ2VkIHdyaXRlcyB0byBzaGFyZWQgbWVtb3J5IGFuZCBSRUxFQVNFIHRoZSBwZXItc3RhZ2Ugc3RhZ2luZ1xuICAgKiBzdGF0ZSAoIzEzYikuXG4gICAqXG4gICAqIENvbW1pdCBpcyB0aGUgc3RhZ2UncyBsaWZlY3ljbGUgZW5kOiBgYnVmZmVyYCAoaXRzIHdvcmtpbmcgY29weSBhbmRcbiAgICogd2hhdGV2ZXIgcHJpdmF0ZSBjb3BpZXMgaXRzIHJlYWRzIHRvb2spIGFuZCBgc3RhdGVWaWV3YCAoYSByZWZlcmVuY2UgdGhhdFxuICAgKiBwaW5zIG9uZSBjb21taXR0ZWQtc3RhdGUgR0VORVJBVElPTikgYXJlIG9ubHkgbmVlZGVkIERVUklORyBleGVjdXRpb24sXG4gICAqIGFzIHRoZSByZWFkIHNuYXBzaG90ICsgbmV0LWNoYW5nZSBkaWZmIGJhc2UuIFRoZSBleGVjdXRpb24gdHJlZSByZXRhaW5zXG4gICAqIGV2ZXJ5IFN0YWdlQ29udGV4dCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBydW4sIHNvIFdJVEhPVVQgdGhlIHJlbGVhc2UgYVxuICAgKiBsb25nIGxvb3AgcmV0YWlucyBvbmUgc3RhdGUgZ2VuZXJhdGlvbiBwZXIgZXhlY3V0ZWQgc3RhZ2Ug4oCUIG1lYXN1cmVkXG4gICAqIE8oTsKyKSBiZWZvcmUgY29weS1vbi13cml0ZSAoOS4yOS4wKSwgd2hlbiBlYWNoIGdlbmVyYXRpb24gYW5kIGVhY2hcbiAgICogYnVmZmVyIHdhcyBhIHdob2xlLXN0YXRlIGNsb25lOiA1NjMuOE1CIGF0IE49MjAwIG9uIGFuIGFnZW50LXN0eWxlXG4gICAqIGNoYXJ0OyBhIDUwMC1pdGVyYXRpb24gYWdlbnQgT09NZWQgYSBkZWZhdWx0IE5vZGUgaGVhcCAoYmFja2xvZyAjMTgpLlxuICAgKiBHZW5lcmF0aW9ucyBub3cgc2hhcmUgZXZlcnkgdW5jaGFuZ2VkIHN1YnRyZWUsIGJ1dCBhIHBpbm5lZCBvbmUgc3RpbGxcbiAgICoga2VlcHMgdGhlIGNvbnRhaW5lcnMgbGF0ZXIgY29tbWl0cyByZXBsYWNlZCBhbGl2ZS5cbiAgICpcbiAgICogUkUtVVNFIEFGVEVSIENPTU1JVCBzdGF5cyBjb3JyZWN0IGJlY2F1c2UgYm90aCBmaWVsZHMgcmUtY3JlYXRlIGxhemlseTpcbiAgICogLSBhIGxhdGVyIFJFQUQgcmUtYW5jaG9ycyB2aWEge0BsaW5rIGZpcnN0VG91Y2hTdGF0ZX0gb24gdGhlIENVUlJFTlRcbiAgICogICBjb21taXR0ZWQgc3RhdGUgKHdoaWNoIGluY2x1ZGVzIHRoaXMgc3RhZ2UncyBvd24gZmx1c2hlZCB3cml0ZXMpO1xuICAgKiAtIGEgbGF0ZXIgV1JJVEUgY29uc3RydWN0cyBhIGZyZXNoIGJ1ZmZlciBvbiB0aGF0IHJlLWFuY2hvcmVkIHZpZXcsIHNvIGFcbiAgICogICBzZWNvbmQgY29tbWl0IGRpZmZzIGFnYWluc3QgcG9zdC1maXJzdC1jb21taXQgc3RhdGUuIFRoZSBwcmUtcmVsZWFzZVxuICAgKiAgIGJ1ZmZlciBiZWhhdmVkIHRoZSBzYW1lIGZvciBWQUxVRVMgKGl0cyBgd29ya2luZ0NvcHlgIHdhcyByZXNldCBvblxuICAgKiAgIGNvbW1pdCwgZmFsbGluZyByZWFkcyB0aHJvdWdoIHRvIGxpdmUgc3RhdGUpIGJ1dCBrZXB0IHRoZSBPUklHSU5BTFxuICAgKiAgIGBiYXNlU25hcHNob3RgIGFzIGRpZmYgYmFzZSDigJQgdW5yZWFjaGFibGUgaW4gcHJhY3RpY2U6IHRoZSBlbmdpbmUnc1xuICAgKiAgIG9ubHkgd3JpdGVzIGFmdGVyIGEgY29tbWl0IGFyZSB0aGUgc3ViZmxvdyBtZXJnZS1iYWNrIGludG8gYSBjb21taXR0ZWRcbiAgICogICBicmFuY2ggcGFyZW50IChhIGRlY2lkZXIgb3IgZm9yayBmcmFtZSBjb21taXRzIGJlZm9yZSBpdHMgYnJhbmNoIHJ1bnMpXG4gICAqICAgYW5kIHRoZSBmb3JrIGNoaWxkJ3MgdGhyb3R0bGUgbWFya2VyOyB0aGUgb3RoZXIgXCJ3cml0ZSBhZnRlciBjb21taXRcIlxuICAgKiAgIHNpdGVzIChTdWJmbG93RXhlY3V0b3Igc2VlZCDihpIgcmVwbGFjZXMgdGhlIGNvbnRleHQ7IHJlc3VtZSDihpIgZnJlc2hcbiAgICogICBjb250ZXh0IHZpYSBgbGVhZi5jcmVhdGVOZXh0YCkgbmV2ZXIgcmUtdXNlIGEgY29tbWl0dGVkIGNvbnRleHQuXG4gICAqIC0gQSBVU0VSIGhhbmRsZSBoZWxkIHBhc3QgaXRzIHN0YWdlIGlzIGEgZGlmZmVyZW50IG1hdHRlcjogaXRzIHdyaXRlc1xuICAgKiAgIHdvdWxkIGxhbmQgaW4gYSBidWZmZXIgbm90aGluZyBldmVyIGNvbW1pdHMuIFRoYXQgcmVmdXNhbCBsaXZlcyBvbiB0aGVcbiAgICogICBzY29wZSB0aWVyIChgU2NvcGVGYWNhZGVgLCBzZWFsZWQgYnkgdGhlIGNvbW1pdCBvYnNlcnZlciDigJQgOS4yMi4wKSxcbiAgICogICBiZWNhdXNlIHRoZSBmcmFtZSdzIHJlLXVzYWJpbGl0eSBpcyBleGFjdGx5IHdoYXQgdGhlIGVuZ2luZSBwYXRoc1xuICAgKiAgIGFib3ZlIG5lZWQuXG4gICAqIC0gYF9zdGFnZVdyaXRlc2AgLyBgX3N0YWdlUmVhZHNgIGFyZSBOT1QgcmVsZWFzZWQg4oCUIGBzbmFwc2hvdFNlbGYoKWBcbiAgICogICByZWFkcyB0aGVtIHBvc3QtcnVuIGZvciB0aGUgZXhlY3V0aW9uLXRyZWUgc25hcHNob3QuXG4gICAqL1xuICBjb21taXQoKTogdm9pZCB7XG4gICAgdGhpcy5tYXRlcmlhbGlzZVdyaXRlcygpO1xuICAgIHRoaXMud2Fybk9uQm9ycm93ZWRNdXRhdGlvbigpO1xuICAgIGlmICghdGhpcy5idWZmZXIpIHtcbiAgICAgIC8vIFRydWx5LWxhenkgZmFzdCBwYXRoICgjMTMpOiBubyB3cml0ZSBldmVyIGNvbnN0cnVjdGVkIHRoZSBidWZmZXIsIHNvXG4gICAgICAvLyB0aGUgc3RhZ2UncyBuZXQgY2hhbmdlIGlzIGVtcHR5IEJZIENPTlNUUlVDVElPTi4gU2FtZSBvYnNlcnZhYmxlXG4gICAgICAvLyBvdXRjb21lIGFzIGFuIGVtcHR5IGNvbW1pdCDigJQgdGhlIChlbXB0eSkgYnVuZGxlIGlzIHN0aWxsIHJlY29yZGVkIHNvXG4gICAgICAvLyBldmVyeSBleGVjdXRlZCBzdGFnZSByZW1haW5zIGEgdGltZS10cmF2ZWwgY3Vyc29yIHN0b3Ag4oCUIGJ1dCB3aXRoXG4gICAgICAvLyBaRVJPIGNsb25lczogbm8gYnVmZmVyIGNvbnN0cnVjdGlvbiwgbm8gYXBwbHlQYXRjaCByZXBsYXkuXG4gICAgICB0aGlzLmV2ZW50TG9nPy5yZWNvcmQoe1xuICAgICAgICBvdmVyd3JpdGU6IHt9LFxuICAgICAgICB1cGRhdGVzOiB7fSxcbiAgICAgICAgcmVkYWN0ZWRQYXRoczogW10sXG4gICAgICAgIHRyYWNlOiBbXSxcbiAgICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgICBzdGFnZUlkOiB0aGlzLnN0YWdlSWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICAuLi50aGlzLnVudHJhY2tlZFNvdXJjZXNGcmFnbWVudCgpLFxuICAgICAgICAuLi50aGlzLnRhZ3NGcmFnbWVudCgpLFxuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5fY29tbWl0T2JzZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5fY29tbWl0T2JzZXJ2ZXIoeyAuLi50aGlzLl9zdGFnZVdyaXRlcyB9KTtcbiAgICAgIH1cbiAgICAgIC8vICMxM2I6IGRyb3AgdGhlIGZpcnN0LXRvdWNoIHZpZXcg4oCUIGEgcmVhZC1vbmx5IHN0YWdlIHN0aWxsIHBpbm5lZCBvbmVcbiAgICAgIC8vIGZ1bGwgc3RhdGUgZ2VuZXJhdGlvbiB0aHJvdWdoIGl0LiBEMiBtYXJrZXJzIHJlbGVhc2Ugd2l0aCBpdCwgYW5kIHNvXG4gICAgICAvLyBkbyB0aGUgZGVjbGFyZWQgdGFncyAoYW4gZW1wdHkgY29tbWl0IGlzIGEgZGVsaWJlcmF0ZSwgdGFnZ2VkIHN0b3Ag4oCUXG4gICAgICAvLyBvbmNlKS5cbiAgICAgIHRoaXMuc3RhdGVWaWV3ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMudGFncyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NvbW1pdHRlZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYnVuZGxlID0gdGhpcy5idWZmZXIuY29tbWl0KCk7XG4gICAgY29uc3QgY29tbWl0QnVuZGxlID0ge1xuICAgICAgLi4uYnVuZGxlLFxuICAgICAgc3RhZ2U6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgc3RhZ2VJZDogdGhpcy5zdGFnZUlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHRoaXMucnVudGltZVN0YWdlSWQsXG4gICAgICAuLi50aGlzLnVudHJhY2tlZFNvdXJjZXNGcmFnbWVudCgpLFxuICAgICAgLi4udGhpcy50YWdzRnJhZ21lbnQoKSxcbiAgICB9O1xuXG4gICAgdGhpcy5zaGFyZWRNZW1vcnkuYXBwbHlQYXRjaChjb21taXRCdW5kbGUub3ZlcndyaXRlLCBjb21taXRCdW5kbGUudXBkYXRlcywgY29tbWl0QnVuZGxlLnRyYWNlKTtcblxuICAgIC8vIEFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyBmZWVkIHRocmVlIGNvbnN1bWVyczpcbiAgICAvLyAgIDEuIHRoZSBwYXJhbGxlbCByZWRhY3RlZCBtaXJyb3IgKGlmIGVuYWJsZWQpXG4gICAgLy8gICAyLiB0aGUgZXZlbnQgbG9nIChwZXJzaXN0ZWQgdHJhY2UpXG4gICAgLy8gICAzLiAoZnV0dXJlKSBhbnl0aGluZyBlbHNlIHRoYXQgd2FudHMgYSBzY3J1YmJlZCB2aWV3IGF0IGNvbW1pdCB0aW1lXG4gICAgLy8gQ29tcHV0aW5nIG9uY2Uga2VlcHMgY29zdCBsaW5lYXIgaW4gdGhlIGNvbW1pdCBzaXplOyBubyBwb3N0LXBhc3Mgd2Fsay5cbiAgICBjb25zdCByZWRhY3RlZE92ZXJ3cml0ZSA9IHNjcnViUGF0Y2goY29tbWl0QnVuZGxlLm92ZXJ3cml0ZSwgY29tbWl0QnVuZGxlLnJlZGFjdGVkUGF0aHMpO1xuICAgIGNvbnN0IHJlZGFjdGVkVXBkYXRlcyA9IHNjcnViUGF0Y2goY29tbWl0QnVuZGxlLnVwZGF0ZXMsIGNvbW1pdEJ1bmRsZS5yZWRhY3RlZFBhdGhzKTtcblxuICAgIHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnk/LmFwcGx5UGF0Y2gocmVkYWN0ZWRPdmVyd3JpdGUsIHJlZGFjdGVkVXBkYXRlcywgY29tbWl0QnVuZGxlLnRyYWNlKTtcblxuICAgIHRoaXMuZXZlbnRMb2c/LnJlY29yZCh7XG4gICAgICAuLi5jb21taXRCdW5kbGUsXG4gICAgICByZWRhY3RlZFBhdGhzOiBBcnJheS5mcm9tKGNvbW1pdEJ1bmRsZS5yZWRhY3RlZFBhdGhzLnZhbHVlcygpKSxcbiAgICAgIG92ZXJ3cml0ZTogcmVkYWN0ZWRPdmVyd3JpdGUsXG4gICAgICB1cGRhdGVzOiByZWRhY3RlZFVwZGF0ZXMsXG4gICAgfSk7XG5cbiAgICAvLyBOb3RpZnkgb2JzZXJ2ZXIgKFNjb3BlRmFjYWRlKSB3aXRoIHRyYWNrZWQgbXV0YXRpb25zXG4gICAgaWYgKHRoaXMuX2NvbW1pdE9ic2VydmVyKSB7XG4gICAgICB0aGlzLl9jb21taXRPYnNlcnZlcih7IC4uLnRoaXMuX3N0YWdlV3JpdGVzIH0pO1xuICAgIH1cblxuICAgIC8vICMxM2I6IHJlbGVhc2UgdGhlIHN0YWdpbmcgc3RhdGUg4oCUIHNlZSB0aGUgbWV0aG9kIEpTRG9jLiBEb25lIExBU1Qgc29cbiAgICAvLyB0aGUgY29tbWl0IG9ic2VydmVyIHNlZXMgdGhlIGV4YWN0IHNhbWUgd29ybGQgYXMgYmVmb3JlIHRoZSByZWxlYXNlLlxuICAgIC8vIEQyJ3MgdW50cmFja2VkLXNvdXJjZSBtYXJrZXJzIHJlbGVhc2Ugd2l0aCBpdDogdGhlIHJvdXRpbmVcbiAgICAvLyBkb3VibGUtY29tbWl0IHBhdGhzIHRoZW4gcmVjb3JkIHRoZSBmaWVsZCBleGFjdGx5IG9uY2UuIERlY2xhcmVkIHRhZ3NcbiAgICAvLyByZWxlYXNlIG9uIHRoZSBzYW1lIGxhdzogb25lIHN0YW1wIHBlciBleGVjdXRpb24gb2YgdGhlIHN0YWdlLlxuICAgIHRoaXMuYnVmZmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc3RhdGVWaWV3ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3VudHJhY2tlZFNvdXJjZXMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50YWdzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NvbW1pdHRlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3cgYXdheSBldmVyeXRoaW5nIHRoaXMgc3RhZ2UgaGFzIFNUQUdFRCwgd2l0aG91dCBjb21taXR0aW5nIGFueSBvZiBpdC5cbiAgICpcbiAgICogVGhlIGlzb2xhdGlvbiBwcmltaXRpdmUgYmVoaW5kIGRlY2xhcmF0aXZlIHJldHJ5OiB3aGVuIGEgbm9uLWZpbmFsIGF0dGVtcHRcbiAgICogZmFpbHMsIHRoZSB3cml0ZXMgaXQgc3RhZ2VkIG11c3Qgbm90IGJlIHZpc2libGUgdG8gdGhlIG5leHQgYXR0ZW1wdCwgbXVzdFxuICAgKiBub3QgcmVhY2ggc2hhcmVkIHN0YXRlLCBhbmQgbXVzdCBub3QgYXBwZWFyIGluIHRoZSBjb21taXQgbG9nIG9yIGluIHRoaXNcbiAgICogc3RhZ2UncyBzbmFwc2hvdC4gRHJvcHBpbmcgdGhlIHN0YWdpbmcgc3RhdGUgYWNoaWV2ZXMgYWxsIGZvdXIgYXQgb25jZSDigJRcbiAgICogdGhlcmUgaXMgbm8gcm9sbGJhY2sgbWFjaGluZXJ5IHRvIGludm9rZSBiZWNhdXNlIG5vdGhpbmcgd2FzIGV2ZXIgYXBwbGllZFxuICAgKiAoTTE6IHRoZSB0cmFuc2FjdGlvbiBidWZmZXIgaG9sZHMgd3JpdGVzIHVudGlsIGBjb21taXQoKWAgZmx1c2hlcyB0aGVtKS5cbiAgICpcbiAgICogV2hhdCBpcyByZWxlYXNlZCwgYW5kIHdoeSBlYWNoIG9uZSBtYXR0ZXJzIGZvciB0aGUgbmV4dCBhdHRlbXB0OlxuICAgKiAgLSBgYnVmZmVyYCAgICAgIOKAlCB0aGUgc3RhZ2VkIHdyaXRlcyB0aGVtc2VsdmVzOyB0aGUgbmV4dCBhdHRlbXB0IHN0YXJ0c1xuICAgKiAgICAgICAgICAgICAgICAgICAgd2l0aCBub3RoaW5nIHN0YWdlZDtcbiAgICogIC0gYHN0YXRlVmlld2AgICDigJQgdGhlIGZpcnN0LXRvdWNoIGFuY2hvcjsgdGhlIG5leHQgYXR0ZW1wdCByZS1hbmNob3JzIG9uXG4gICAqICAgICAgICAgICAgICAgICAgICBjb21taXR0ZWQgc3RhdGUgYXMgaXQgc3RhbmRzIE5PVyAoYSBzaWJsaW5nIGZvcmsgYnJhbmNoXG4gICAqICAgICAgICAgICAgICAgICAgICBtYXkgbGVnaXRpbWF0ZWx5IGhhdmUgY29tbWl0dGVkIGluIGJldHdlZW4pO1xuICAgKiAgLSBgX3N0YWdlV3JpdGVzYCAvIGBfcGVuZGluZ1dyaXRlc2AgLyBgX3N0YWdlUmVhZHNgIOKAlCB0aGUgc25hcHNob3RcbiAgICogICAgICAgICAgICAgICAgICAgIHBheWxvYWQ7IHdpdGhvdXQgdGhlIHJlc2V0IHRoZSBleGVjdXRpb24gdHJlZSB3b3VsZFxuICAgKiAgICAgICAgICAgICAgICAgICAgcmVwb3J0IHdyaXRlcyB0aGF0IHdlcmUgZGlzY2FyZGVkLCB3aGljaCBpcyB0aGUgZXhhY3RcbiAgICogICAgICAgICAgICAgICAgICAgIGxpZSB0aGlzIGZlYXR1cmUgZXhpc3RzIHRvIHByZXZlbnQgKHRoZSBwZW5kaW5nIG1hcFxuICAgKiAgICAgICAgICAgICAgICAgICAgaG9sZHMgYmFyZSByZWZlcmVuY2VzIOKAlCBkcm9wcGluZyBpdCB1bi1jbG9uZXMgbm90aGluZyk7XG4gICAqICAtIGBfcHJvdmVuYW5jZVJlYWRzYCDigJQgdGhlIHBlci13cml0ZSByZWFkIHByZWZpeCAoI1AxKTsgYSBkaXNjYXJkZWRcbiAgICogICAgICAgICAgICAgICAgICAgIGF0dGVtcHQncyByZWFkcyBtdXN0IG5ldmVyIGFwcGVhciBpbiB0aGUgbmV4dCBhdHRlbXB0J3NcbiAgICogICAgICAgICAgICAgICAgICAgIGBUcmFjZUVudHJ5LnJlYWRLZXlzYCwgb3IgYSBiYWNrd2FyZCBzbGljZSB3b3VsZCBmb2xsb3dcbiAgICogICAgICAgICAgICAgICAgICAgIGFuIGVkZ2UgdGhhdCBubyBjb21taXR0ZWQgd3JpdGUgZXZlciBoYWQ7XG4gICAqICAtIGBfdW50cmFja2VkU291cmNlc2Ag4oCUIHRoZSBEMiBob25lc3R5IG1hcmtlcnMsIHJlbGVhc2VkIHdpdGggdGhlIHJlc3QuXG4gICAqXG4gICAqIFdoYXQgaXMgZGVsaWJlcmF0ZWx5IEtFUFQ6IGBkZWJ1Z2AgKGxvZ3MsIG1ldHJpY3MsIGVycm9ycywgZmxvdyBtZXNzYWdlcykuXG4gICAqIERpYWdub3N0aWNzIGFyZSB0aGUgYXBwZW5kLW9ubHkgcmVjb3JkIG9mIHdoYXQgZXZlcnkgYXR0ZW1wdCBkaWQsIGFuZCB0aGVcbiAgICogcmV0cnkgZmVhdHVyZSdzIHdob2xlIHBvaW50IGlzIHRoYXQgdGhlIGVhcmxpZXIgYXR0ZW1wdHMgc3RheSB2aXNpYmxlLlxuICAgKlxuICAgKiBObyBjb21taXQgaXMgcmVjb3JkZWQgYW5kIG5vIG9ic2VydmVyIGZpcmVzIOKAlCBhIGRpc2NhcmRlZCBhdHRlbXB0IGlzIG5vdCBhXG4gICAqIGN1cnNvciBzdG9wLCBiZWNhdXNlIGZyb20gc2hhcmVkIHN0YXRlJ3MgcG9pbnQgb2YgdmlldyBpdCBuZXZlciBoYXBwZW5lZC5cbiAgICovXG4gIGRpc2NhcmRTdGFnZWQoKTogdm9pZCB7XG4gICAgdGhpcy5idWZmZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zdGF0ZVZpZXcgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdW50cmFja2VkU291cmNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9wcm92ZW5hbmNlUmVhZHMgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcGVuZGluZ1dyaXRlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zdGFnZVdyaXRlcyA9IHt9O1xuICAgIHRoaXMuX3N0YWdlUmVhZHMgPSB7fTtcbiAgICB0aGlzLl9uZXN0ZWRSZWFkcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl92aWV3UmVhZHMgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIAgVHJlZSBuYXZpZ2F0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBDcmVhdGUgKG9yIHJldHVybikgdGhpcyBjb250ZXh0J3MgbGlua2VkIHN1Y2Nlc3Nvci5cbiAgICpcbiAgICogTUVNT0laRUQ6IHRoZSBmaXJzdCBjYWxsIGNyZWF0ZXMgYHRoaXMubmV4dGA7IGV2ZXJ5IGxhdGVyIGNhbGwgcmV0dXJuc1xuICAgKiB0aGF0IFNBTUUgY29udGV4dCBhbmQgSUdOT1JFUyBpdHMgYXJndW1lbnRzLiBJbiBub3JtYWwgdHJhdmVyc2FsIGVhY2hcbiAgICogY29udGV4dCBhZHZhbmNlcyBleGFjdGx5IG9uY2UsIHNvIHRoZSBtZW1vIG5ldmVyIGJpdGVzIOKAlCBidXQgYSBjYWxsZXJcbiAgICogZXhwZWN0aW5nIGEgZnJlc2ggY29udGV4dCBmb3IgZGlmZmVyZW50IGBzdGFnZU5hbWVgL2BzdGFnZUlkYCBhcmdzIGdldHNcbiAgICogdGhlIG9sZCBvbmUgc2lsZW50bHkuIERldiBtb2RlIChgZW5hYmxlRGV2TW9kZSgpYCkgd2FybnMgb24gdGhhdFxuICAgKiBtaXNtYXRjaCAoYmFja2xvZyBCNCkuXG4gICAqL1xuICBjcmVhdGVOZXh0KHBhdGg6IHN0cmluZywgc3RhZ2VOYW1lOiBzdHJpbmcsIHN0YWdlSWQ6IHN0cmluZywgaXNEZWNpZGVyID0gZmFsc2UpOiBTdGFnZUNvbnRleHQge1xuICAgIGlmICghdGhpcy5uZXh0KSB7XG4gICAgICB0aGlzLm5leHQgPSBuZXcgU3RhZ2VDb250ZXh0KHBhdGgsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdGhpcy5zaGFyZWRNZW1vcnksICcnLCB0aGlzLmV2ZW50TG9nLCBpc0RlY2lkZXIpO1xuICAgICAgdGhpcy5uZXh0LnBhcmVudCA9IHRoaXM7XG4gICAgICAvLyBQcm9wYWdhdGUgdGhlIHJlZGFjdGVkIG1pcnJvciBkb3duIHRoZSBjb250ZXh0IHRyZWUgc28gZXZlcnkgY29tbWl0XG4gICAgICAvLyBpbiB0aGUgcnVuIHdyaXRlcyB0byBib3RoIHZpZXdzLlxuICAgICAgaWYgKHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnkpIHRoaXMubmV4dC5yZWRhY3RlZFNoYXJlZE1lbW9yeSA9IHRoaXMucmVkYWN0ZWRTaGFyZWRNZW1vcnk7XG4gICAgICB0aGlzLm5leHQucmVkYWN0aW9uUnVsZSA9IHRoaXMucmVkYWN0aW9uUnVsZTtcbiAgICAgIHRoaXMubmV4dC5yZWFkVHJhY2tpbmcgPSB0aGlzLnJlYWRUcmFja2luZztcbiAgICAgIHRoaXMubmV4dC53cml0ZVRyYWNraW5nID0gdGhpcy53cml0ZVRyYWNraW5nO1xuICAgICAgdGhpcy5uZXh0LmNvbW1pdFZhbHVlcyA9IHRoaXMuY29tbWl0VmFsdWVzO1xuICAgICAgdGhpcy5uZXh0LndyaXRlUHJvdmVuYW5jZSA9IHRoaXMud3JpdGVQcm92ZW5hbmNlO1xuICAgIH0gZWxzZSBpZiAoaXNEZXZNb2RlKCkgJiYgKHRoaXMubmV4dC5zdGFnZUlkICE9PSBzdGFnZUlkIHx8IHRoaXMubmV4dC5zdGFnZU5hbWUgIT09IHN0YWdlTmFtZSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50XSBTdGFnZUNvbnRleHQuY3JlYXRlTmV4dDogbmV4dCBjb250ZXh0IGFscmVhZHkgZXhpc3RzIGFzIFwiJHt0aGlzLm5leHQuc3RhZ2VOYW1lfVwiIGAgK1xuICAgICAgICAgIGAoaWQ6IFwiJHt0aGlzLm5leHQuc3RhZ2VJZH1cIikg4oCUIGFyZ3VtZW50cyBcIiR7c3RhZ2VOYW1lfVwiIChpZDogXCIke3N0YWdlSWR9XCIpIGFyZSBpZ25vcmVkIGAgK1xuICAgICAgICAgICdhbmQgdGhlIGV4aXN0aW5nIGNvbnRleHQgaXMgcmV0dXJuZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5leHQ7XG4gIH1cblxuICBjcmVhdGVDaGlsZChydW5JZDogc3RyaW5nLCBicmFuY2hJZDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nLCBpc0RlY2lkZXIgPSBmYWxzZSk6IFN0YWdlQ29udGV4dCB7XG4gICAgaWYgKCF0aGlzLmNoaWxkcmVuKSB7XG4gICAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkID0gbmV3IFN0YWdlQ29udGV4dChydW5JZCwgc3RhZ2VOYW1lLCBzdGFnZUlkLCB0aGlzLnNoYXJlZE1lbW9yeSwgYnJhbmNoSWQsIHRoaXMuZXZlbnRMb2csIGlzRGVjaWRlcik7XG4gICAgY2hpbGQucGFyZW50ID0gdGhpcztcbiAgICBpZiAodGhpcy5yZWRhY3RlZFNoYXJlZE1lbW9yeSkgY2hpbGQucmVkYWN0ZWRTaGFyZWRNZW1vcnkgPSB0aGlzLnJlZGFjdGVkU2hhcmVkTWVtb3J5O1xuICAgIGNoaWxkLnJlZGFjdGlvblJ1bGUgPSB0aGlzLnJlZGFjdGlvblJ1bGU7XG4gICAgY2hpbGQucmVhZFRyYWNraW5nID0gdGhpcy5yZWFkVHJhY2tpbmc7XG4gICAgY2hpbGQud3JpdGVUcmFja2luZyA9IHRoaXMud3JpdGVUcmFja2luZztcbiAgICBjaGlsZC5jb21taXRWYWx1ZXMgPSB0aGlzLmNvbW1pdFZhbHVlcztcbiAgICBjaGlsZC53cml0ZVByb3ZlbmFuY2UgPSB0aGlzLndyaXRlUHJvdmVuYW5jZTtcbiAgICB0aGlzLmNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIHJldHVybiBjaGlsZDtcbiAgfVxuXG4gIGNyZWF0ZURlY2lkZXIocGF0aDogc3RyaW5nLCBzdGFnZU5hbWU6IHN0cmluZywgc3RhZ2VJZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXh0KHBhdGgsIHN0YWdlTmFtZSwgc3RhZ2VJZCwgdHJ1ZSk7XG4gIH1cblxuICBzZXRBc0RlY2lkZXIoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRGVjaWRlciA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBc0ZvcmsoKTogU3RhZ2VDb250ZXh0IHtcbiAgICB0aGlzLmlzRm9yayA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDilIDilIAgRGlhZ25vc3RpY3MgZGVsZWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhZGRMb2coa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZExvZyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIHNldExvZyhrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24sIHBhdGg/OiBzdHJpbmdbXSkge1xuICAgIHRoaXMuZGVidWcuc2V0TG9nKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkTWV0cmljKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5hZGRNZXRyaWMoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRNZXRyaWMoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLnNldE1ldHJpYyhrZXksIHZhbHVlLCBwYXRoKTtcbiAgfVxuXG4gIGFkZEV2YWwoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEV2YWwoa2V5LCB2YWx1ZSwgcGF0aCk7XG4gIH1cblxuICBzZXRFdmFsKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93biwgcGF0aD86IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5kZWJ1Zy5zZXRFdmFsKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRXJyb3Ioa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duLCBwYXRoPzogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRlYnVnLmFkZEVycm9yKGtleSwgdmFsdWUsIHBhdGgpO1xuICB9XG5cbiAgYWRkRmxvd0RlYnVnTWVzc2FnZShcbiAgICB0eXBlOiBGbG93Q29udHJvbFR5cGUsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyB0YXJnZXRTdGFnZT86IHN0cmluZyB8IHN0cmluZ1tdOyByYXRpb25hbGU/OiBzdHJpbmc7IGNvdW50PzogbnVtYmVyOyBpdGVyYXRpb24/OiBudW1iZXIgfSxcbiAgKSB7XG4gICAgY29uc3QgZmxvd01lc3NhZ2U6IEZsb3dNZXNzYWdlID0geyB0eXBlLCBkZXNjcmlwdGlvbiwgdGltZXN0YW1wOiBEYXRlLm5vdygpLCAuLi5vcHRpb25zIH07XG4gICAgdGhpcy5kZWJ1Zy5hZGRGbG93TWVzc2FnZShmbG93TWVzc2FnZSk7XG4gIH1cblxuICAvLyDilIDilIAgU25hcHNob3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgZ2V0U3RhZ2VJZCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5ydW5JZCB8fCB0aGlzLnJ1bklkID09PSAnJykgcmV0dXJuIHRoaXMuc3RhZ2VOYW1lO1xuICAgIHJldHVybiBgJHt0aGlzLnJ1bklkfS4ke3RoaXMuc3RhZ2VOYW1lfWA7XG4gIH1cblxuICBnZXRTbmFwc2hvdCgpOiBTdGFnZVNuYXBzaG90IHtcbiAgICAvLyBJdGVyYXRpdmUgd2FsayAoZXhwbGljaXQgd29yayBzdGFjayksIE5PVCByZWN1cnNpb246IHRoZSBleGVjdXRpb25cbiAgICAvLyB0cmVlIGRlZXBlbnMgYnkgb25lIGxldmVsIHBlciBleGVjdXRlZCBzdGFnZSBhbG9uZyBgbmV4dGAgY2hhaW5zLCBhbmRcbiAgICAvLyB0aGUgdHJhbXBvbGluZWQgdHJhdmVyc2VyIGFsbG93cyBjaGFpbnMvbG9vcHMgb2YgdGVucyBvZiB0aG91c2FuZHMgb2ZcbiAgICAvLyBzdGFnZXMg4oCUIGZhciBkZWVwZXIgdGhhbiBhIHJlY3Vyc2l2ZSBzZXJpYWxpemVyIGNhbiB3YWxrIGJlZm9yZVxuICAgIC8vIFwiTWF4aW11bSBjYWxsIHN0YWNrIHNpemUgZXhjZWVkZWRcIi5cbiAgICBjb25zdCByb290ID0gdGhpcy5zbmFwc2hvdFNlbGYoKTtcbiAgICBjb25zdCB3b3JrOiBBcnJheTx7IGN0eDogU3RhZ2VDb250ZXh0OyBzbmFwOiBTdGFnZVNuYXBzaG90IH0+ID0gW3sgY3R4OiB0aGlzLCBzbmFwOiByb290IH1dO1xuICAgIHdoaWxlICh3b3JrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHsgY3R4LCBzbmFwIH0gPSB3b3JrLnBvcCgpITtcbiAgICAgIGlmIChjdHgubmV4dCkge1xuICAgICAgICBjb25zdCBuZXh0U25hcCA9IGN0eC5uZXh0LnNuYXBzaG90U2VsZigpO1xuICAgICAgICBzbmFwLm5leHQgPSBuZXh0U25hcDtcbiAgICAgICAgd29yay5wdXNoKHsgY3R4OiBjdHgubmV4dCwgc25hcDogbmV4dFNuYXAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoY3R4LmNoaWxkcmVuKSB7XG4gICAgICAgIHNuYXAuY2hpbGRyZW4gPSBjdHguY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNoaWxkU25hcCA9IGNoaWxkLnNuYXBzaG90U2VsZigpO1xuICAgICAgICAgIHdvcmsucHVzaCh7IGN0eDogY2hpbGQsIHNuYXA6IGNoaWxkU25hcCB9KTtcbiAgICAgICAgICByZXR1cm4gY2hpbGRTbmFwO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKiogU25hcHNob3Qgb2YgVEhJUyBjb250ZXh0J3Mgb3duIGZpZWxkcyDigJQgYG5leHRgL2BjaGlsZHJlbmAgYXJlIGZpbGxlZFxuICAgKiAgaW4gYnkgdGhlIGl0ZXJhdGl2ZSB3YWxrIGluIGBnZXRTbmFwc2hvdGAuICovXG4gIHByaXZhdGUgc25hcHNob3RTZWxmKCk6IFN0YWdlU25hcHNob3Qge1xuICAgIGNvbnN0IHNuYXBzaG90OiBTdGFnZVNuYXBzaG90ID0ge1xuICAgICAgaWQ6IHRoaXMuc3RhZ2VJZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiB0aGlzLnJ1bnRpbWVTdGFnZUlkIHx8IHVuZGVmaW5lZCxcbiAgICAgIG5hbWU6IHRoaXMuc3RhZ2VOYW1lLFxuICAgICAgaXNEZWNpZGVyOiB0aGlzLmlzRGVjaWRlcixcbiAgICAgIGlzRm9yazogdGhpcy5pc0ZvcmssXG4gICAgICBsb2dzOiB0aGlzLmRlYnVnLmxvZ0NvbnRleHQsXG4gICAgICBlcnJvcnM6IHRoaXMuZGVidWcuZXJyb3JDb250ZXh0LFxuICAgICAgbWV0cmljczogdGhpcy5kZWJ1Zy5tZXRyaWNDb250ZXh0LFxuICAgICAgZXZhbHM6IHRoaXMuZGVidWcuZXZhbENvbnRleHQsXG4gICAgfTtcbiAgICBjb25zdCBzdGFnZVdyaXRlcyA9IHRoaXMucmV0YWluZWRXcml0ZXMoKTtcbiAgICBpZiAoT2JqZWN0LmtleXMoc3RhZ2VXcml0ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEV4dHJhY3QgdmFsdWVzIG9ubHkgZm9yIHRoZSBzbmFwc2hvdCAoc3RyaXAgb3BlcmF0aW9uIG1ldGFkYXRhKVxuICAgICAgY29uc3Qgd3JpdGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaywgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKHN0YWdlV3JpdGVzKSkge1xuICAgICAgICB3cml0ZXNba10gPSBlbnRyeS52YWx1ZTtcbiAgICAgIH1cbiAgICAgIHNuYXBzaG90LnN0YWdlV3JpdGVzID0gd3JpdGVzO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fc3RhZ2VSZWFkcykubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3Quc3RhZ2VSZWFkcyA9IHRoaXMuX3N0YWdlUmVhZHM7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlc2NyaXB0aW9uKSB7XG4gICAgICBzbmFwc2hvdC5kZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLnN1YmZsb3dJZCkge1xuICAgICAgc25hcHNob3Quc3ViZmxvd0lkID0gdGhpcy5zdWJmbG93SWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmRlYnVnLmZsb3dNZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5mbG93TWVzc2FnZXMgPSB0aGlzLmRlYnVnLmZsb3dNZXNzYWdlcztcbiAgICB9XG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG59XG4iXX0=
@@ -196,10 +196,10 @@ export declare class TransactionBuffer {
196
196
  merge(path: (string | number)[], value: any, shouldRedact?: boolean): void;
197
197
  /**
198
198
  * Field-level redaction (9.19.0): mark dot-paths INSIDE the value staged at
199
- * `path` as secret, so `redactPatch` scrubs them in the commit log and the
199
+ * `path` as secret, so `scrubPatch` scrubs them in the commit log and the
200
200
  * mirror the same way a whole-key redaction is scrubbed. A field is
201
201
  * registered as a literal key AND, when dotted, as the nested path it
202
- * names — whichever exists in the patch is the one `redactPatch` finds.
202
+ * names — whichever exists in the patch is the one `scrubPatch` finds.
203
203
  * Marked paths survive commit only while the op path they sit under does
204
204
  * (see {@link survivingRedactedPaths}).
205
205
  */