footprintjs 10.4.0 → 10.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +63 -25
  2. package/dist/esm/index.d.ts +1 -0
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/lib/capture/historyData.d.ts +6 -2
  5. package/dist/esm/lib/capture/historyData.js +18 -1
  6. package/dist/esm/lib/capture/historyNote.d.ts +2 -2
  7. package/dist/esm/lib/capture/historyNote.js +11 -6
  8. package/dist/esm/lib/capture/historyTypes.d.ts +1 -1
  9. package/dist/esm/lib/capture/historyTypes.js +1 -1
  10. package/dist/esm/lib/capture/nativeSourceAddress.d.ts +3 -0
  11. package/dist/esm/lib/capture/nativeSourceAddress.js +15 -0
  12. package/dist/esm/lib/capture/readSources.d.ts +20 -3
  13. package/dist/esm/lib/capture/readSources.js +41 -12
  14. package/dist/esm/lib/capture/sinkSettlement.d.ts +6 -0
  15. package/dist/esm/lib/capture/sinkSettlement.js +10 -0
  16. package/dist/esm/lib/capture/sourceOwnership.d.ts +21 -0
  17. package/dist/esm/lib/capture/sourceOwnership.js +133 -0
  18. package/dist/esm/lib/capture/sourceOwnershipFormat.d.ts +35 -0
  19. package/dist/esm/lib/capture/sourceOwnershipFormat.js +31 -0
  20. package/dist/esm/lib/capture/sourceReadCounts.d.ts +18 -0
  21. package/dist/esm/lib/capture/sourceReadCounts.js +27 -0
  22. package/dist/esm/lib/capture/sourceReferenceBudget.d.ts +10 -0
  23. package/dist/esm/lib/capture/sourceReferenceBudget.js +21 -0
  24. package/dist/esm/lib/capture/storedReadSourceCounts.d.ts +7 -0
  25. package/dist/esm/lib/capture/storedReadSourceCounts.js +82 -0
  26. package/dist/esm/lib/capture/storedReadSources.d.ts +4 -0
  27. package/dist/esm/lib/capture/storedReadSources.js +120 -0
  28. package/dist/esm/lib/capture/storedSourceOwnership.d.ts +8 -0
  29. package/dist/esm/lib/capture/storedSourceOwnership.js +100 -0
  30. package/dist/esm/lib/engine/handlers/StageRunner.js +2 -1
  31. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +11 -2
  32. package/dist/esm/lib/engine/handlers/servedSubflowResults.js +13 -2
  33. package/dist/esm/lib/engine/types.d.ts +2 -1
  34. package/dist/esm/lib/engine/types.js +1 -1
  35. package/dist/esm/lib/memory/StageContext.d.ts +4 -0
  36. package/dist/esm/lib/memory/StageContext.js +40 -7
  37. package/dist/esm/lib/memory/frameTypes.d.ts +5 -0
  38. package/dist/esm/lib/memory/frameTypes.js +1 -1
  39. package/dist/esm/lib/memory/logAddress.d.ts +3 -0
  40. package/dist/esm/lib/memory/logAddress.js +7 -0
  41. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +2 -0
  42. package/dist/esm/lib/runner/ExecutionRuntime.js +65 -8
  43. package/dist/esm/lib/runner/FlowChartExecutor.js +4 -2
  44. package/dist/esm/lib/runner/captureHistory.js +16 -10
  45. package/dist/esm/lib/runner/readStoredCapture.d.ts +4 -2
  46. package/dist/esm/lib/runner/readStoredCapture.js +3 -3
  47. package/dist/esm/lib/runner/recordSink.js +2 -10
  48. package/dist/esm/lib/runner/storedCaptureAdmission.js +10 -8
  49. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  50. package/dist/esm/lib/sinks/indexedAdmission.d.ts +14 -0
  51. package/dist/esm/lib/sinks/indexedAdmission.js +77 -0
  52. package/dist/esm/lib/sinks/indexedIO.d.ts +14 -0
  53. package/dist/esm/lib/sinks/indexedIO.js +96 -0
  54. package/dist/esm/lib/sinks/indexedRecordFile.d.ts +3 -0
  55. package/dist/esm/lib/sinks/indexedRecordFile.js +120 -0
  56. package/dist/esm/lib/sinks/indexedScan.d.ts +6 -0
  57. package/dist/esm/lib/sinks/indexedScan.js +73 -0
  58. package/dist/esm/lib/sinks/indexedTypes.d.ts +60 -0
  59. package/dist/esm/lib/sinks/indexedTypes.js +2 -0
  60. package/dist/esm/sinks.d.ts +2 -0
  61. package/dist/esm/sinks.js +2 -1
  62. package/dist/index.js +1 -1
  63. package/dist/lib/capture/historyData.js +21 -2
  64. package/dist/lib/capture/historyNote.js +9 -4
  65. package/dist/lib/capture/historyTypes.js +1 -1
  66. package/dist/lib/capture/nativeSourceAddress.js +19 -0
  67. package/dist/lib/capture/readSources.js +44 -13
  68. package/dist/lib/capture/sinkSettlement.js +14 -0
  69. package/dist/lib/capture/sourceOwnership.js +138 -0
  70. package/dist/lib/capture/sourceOwnershipFormat.js +35 -0
  71. package/dist/lib/capture/sourceReadCounts.js +31 -0
  72. package/dist/lib/capture/sourceReferenceBudget.js +25 -0
  73. package/dist/lib/capture/storedReadSourceCounts.js +86 -0
  74. package/dist/lib/capture/storedReadSources.js +124 -0
  75. package/dist/lib/capture/storedSourceOwnership.js +104 -0
  76. package/dist/lib/engine/handlers/StageRunner.js +2 -1
  77. package/dist/lib/engine/handlers/SubflowExecutor.js +11 -2
  78. package/dist/lib/engine/handlers/servedSubflowResults.js +13 -2
  79. package/dist/lib/engine/types.js +1 -1
  80. package/dist/lib/memory/StageContext.js +40 -7
  81. package/dist/lib/memory/frameTypes.js +1 -1
  82. package/dist/lib/memory/logAddress.js +11 -0
  83. package/dist/lib/runner/ExecutionRuntime.js +65 -8
  84. package/dist/lib/runner/FlowChartExecutor.js +4 -2
  85. package/dist/lib/runner/captureHistory.js +15 -9
  86. package/dist/lib/runner/readStoredCapture.js +2 -2
  87. package/dist/lib/runner/recordSink.js +6 -14
  88. package/dist/lib/runner/storedCaptureAdmission.js +9 -7
  89. package/dist/lib/scope/ScopeFacade.js +2 -2
  90. package/dist/lib/sinks/indexedAdmission.js +85 -0
  91. package/dist/lib/sinks/indexedIO.js +106 -0
  92. package/dist/lib/sinks/indexedRecordFile.js +124 -0
  93. package/dist/lib/sinks/indexedScan.js +77 -0
  94. package/dist/lib/sinks/indexedTypes.js +3 -0
  95. package/dist/sinks.js +4 -2
  96. package/dist/types/index.d.ts +1 -0
  97. package/dist/types/lib/capture/historyData.d.ts +6 -2
  98. package/dist/types/lib/capture/historyNote.d.ts +2 -2
  99. package/dist/types/lib/capture/historyTypes.d.ts +1 -1
  100. package/dist/types/lib/capture/nativeSourceAddress.d.ts +3 -0
  101. package/dist/types/lib/capture/readSources.d.ts +20 -3
  102. package/dist/types/lib/capture/sinkSettlement.d.ts +6 -0
  103. package/dist/types/lib/capture/sourceOwnership.d.ts +21 -0
  104. package/dist/types/lib/capture/sourceOwnershipFormat.d.ts +35 -0
  105. package/dist/types/lib/capture/sourceReadCounts.d.ts +18 -0
  106. package/dist/types/lib/capture/sourceReferenceBudget.d.ts +10 -0
  107. package/dist/types/lib/capture/storedReadSourceCounts.d.ts +7 -0
  108. package/dist/types/lib/capture/storedReadSources.d.ts +4 -0
  109. package/dist/types/lib/capture/storedSourceOwnership.d.ts +8 -0
  110. package/dist/types/lib/engine/types.d.ts +2 -1
  111. package/dist/types/lib/memory/StageContext.d.ts +4 -0
  112. package/dist/types/lib/memory/frameTypes.d.ts +5 -0
  113. package/dist/types/lib/memory/logAddress.d.ts +3 -0
  114. package/dist/types/lib/runner/ExecutionRuntime.d.ts +2 -0
  115. package/dist/types/lib/runner/readStoredCapture.d.ts +4 -2
  116. package/dist/types/lib/sinks/indexedAdmission.d.ts +14 -0
  117. package/dist/types/lib/sinks/indexedIO.d.ts +14 -0
  118. package/dist/types/lib/sinks/indexedRecordFile.d.ts +3 -0
  119. package/dist/types/lib/sinks/indexedScan.d.ts +6 -0
  120. package/dist/types/lib/sinks/indexedTypes.d.ts +60 -0
  121. package/dist/types/sinks.d.ts +2 -0
  122. package/package.json +1 -1
@@ -14,6 +14,7 @@
14
14
  */
15
15
  import { LOG_PLACEHOLDER } from 'foottrace/write';
16
16
  import { thrownText } from '../../errors/errorInfo.js';
17
+ import { childLogAddress } from '../../memory/logAddress.js';
17
18
  import { isPauseSignal } from '../../pause/types.js';
18
19
  import { commitStageWrites } from './commitStage.js';
19
20
  import { rememberRedactedSubflowState } from './servedSubflowResults.js';
@@ -164,11 +165,19 @@ export class SubflowExecutor {
164
165
  // parent log's address plus this mount's runtimeStageId — opened here, its seed and every commit as they land,
165
166
  // closed at the mount's exit (or its pause, or its failure). Without a sink: undefined, the plain log.
166
167
  const mountRuntimeStageId = parentTraversalContext?.runtimeStageId;
168
+ const parentLogAddress = this.deps.executionRuntime.executionHistory.address;
169
+ // Identity follows the same native log address as storage, even for an in-memory child.
170
+ // A missing native parent/mount identity cannot be replaced with a path/name guess.
171
+ const sourceAddress = policy.readSources ? childLogAddress(parentLogAddress, mountRuntimeStageId) : undefined;
167
172
  const record = mountRuntimeStageId === undefined
168
173
  ? undefined
169
174
  : this.deps.executionRuntime.recordFor?.(mountRuntimeStageId, { subflowId });
170
175
  const nestedRuntime = new ExecutionRuntimeClass(firstNode.name, firstNode.id, undefined, undefined, policy, record, parentTraversalContext?.runId
171
- ? { runId: parentTraversalContext.runId, unavailable: 'child-source-ownership' }
176
+ ? {
177
+ runId: parentTraversalContext.runId,
178
+ ...(sourceAddress ? { address: sourceAddress } : { unavailable: 'child-source-ownership' }),
179
+ ...(isResumeForThisSubflow && { historyOmitted: true }),
180
+ }
172
181
  : undefined);
173
182
  // Seed GlobalStore with the right shape for the path:
174
183
  // • Resume into THIS subflow → seed from the captured pre-pause
@@ -419,4 +428,4 @@ export class SubflowExecutor {
419
428
  return subflowOutput;
420
429
  }
421
430
  }
422
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQVVyRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUVyRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUc1Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQThCO0lBQ3ZELElBQUksR0FBd0MsQ0FBQztJQUM3QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQUUsU0FBUztRQUNuQyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQztBQUN0QixDQUFDO0FBRUQseUdBQXlHO0FBQ3pHLFNBQVMsWUFBWSxDQUFDLEtBQWM7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QUN4RixpR0FBaUc7UUFDakcscURBQXFEO1FBQ3JELElBQUksbUJBQW1CLElBQUksbUJBQW1CLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0QsaUJBQWlCLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxhQUFhLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFdBQVcsV0FBVyxVQUFVLEVBQUU7WUFDN0UsV0FBVyxFQUFFLFNBQVM7U0FDdkIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUV0RywyRUFBMkU7UUFDM0Usc0VBQXNFO1FBQ3RFLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV6QyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xHLE1BQU0sWUFBWSxDQUFDLEtBQUssQ0FBQztRQUMzQixDQUFDO1FBRUQsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUV2RCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN1YmZsb3dFeGVjdXRvciDigJQgSXNvbGF0aW9uIGJvdW5kYXJ5IGZvciBzdWJmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBSZXNwb25zaWJpbGl0aWVzOlxuICogLSBDcmVhdGUgaXNvbGF0ZWQgRXhlY3V0aW9uUnVudGltZSBmb3IgZWFjaCBzdWJmbG93XG4gKiAtIEFwcGx5IGlucHV0L291dHB1dCBtYXBwaW5nIHZpYSBTdWJmbG93SW5wdXRNYXBwZXJcbiAqIC0gRGVsZWdhdGUgdHJhdmVyc2FsIHRvIGEgZmFjdG9yeS1jcmVhdGVkIEZsb3djaGFydFRyYXZlcnNlclxuICogLSBUcmFjayBzdWJmbG93IHJlc3VsdHMgZm9yIGRlYnVnZ2luZy92aXN1YWxpemF0aW9uXG4gKlxuICogRWFjaCBzdWJmbG93IGdldHMgaXRzIG93biBHbG9iYWxTdG9yZSBmb3IgaXNvbGF0aW9uLlxuICogVHJhdmVyc2FsIHVzZXMgdGhlIFNBTUUgNy1waGFzZSBhbGdvcml0aG0gYXMgdGhlIHRvcC1sZXZlbCB0cmF2ZXJzZXJcbiAqICh2aWEgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkpLCBzbyBkZWNpZGVycywgc2VsZWN0b3JzLCBsb29wcywgbGF6eSBzdWJmbG93cyxcbiAqIGFuZCBhYm9ydCBzaWduYWxzIGFsbCB3b3JrIGluc2lkZSBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LlxuICovXG5cbmltcG9ydCB7IExPR19QTEFDRUhPTERFUiB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB7IHRocm93blRleHQgfSBmcm9tICcuLi8uLi9lcnJvcnMvZXJyb3JJbmZvLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuUG9saWN5IH0gZnJvbSAnLi4vLi4vbWVtb3J5L3J1blBvbGljeS5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uLy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uLy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZ3JhcGgvU3RhZ2VOb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEhhbmRsZXJEZXBzLFxuICBJRXhlY3V0aW9uUnVudGltZSxcbiAgU3ViZmxvd1Jlc3VsdCxcbiAgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnksXG4gIFN1YmZsb3dUcmF2ZXJzZXJIYW5kbGUsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IGNvbW1pdFN0YWdlV3JpdGVzIH0gZnJvbSAnLi9jb21taXRTdGFnZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc3VtZUVudHJ5IH0gZnJvbSAnLi9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgeyByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlIH0gZnJvbSAnLi9zZXJ2ZWRTdWJmbG93UmVzdWx0cy5qcyc7XG5pbXBvcnQgeyBsb2dnYWJsZVN0YWdlRXJyb3IgfSBmcm9tICcuL3N0YWdlRXJyb3IuanMnO1xuaW1wb3J0IHsgYXBwbHlPdXRwdXRNYXBwaW5nLCBnZXRJbml0aWFsU2NvcGVWYWx1ZXMsIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUgfSBmcm9tICcuL1N1YmZsb3dJbnB1dE1hcHBlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEJyZWFrRmxhZyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSBtYXBwZWQgaW5wdXQsIGRldGFjaGVkIGZyb20gdGhlIHBhcmVudCdzIHN0YXRlIE9OQ0UgcGVyIG1vdW50IChEMSxcbiAqIDkuMjkuMCDigJQgZG9jcy9kZXNpZ24vMjAyNi0xMC1jb3B5LW9uLXdyaXRlLWNvbW1pdC5tZCkuXG4gKlxuICogVGhlIGlucHV0TWFwcGVyIHJlYWRzIHRoZSBwYXJlbnQncyBMSVZFIHN0YXRlIChgZ2V0U2NvcGUoKWApLCBzbyBhIHZhbHVlIGl0XG4gKiBwYXNzZXMgdGhyb3VnaCAoYChwKSA9PiAoeyBjZmc6IHAuY2ZnIH0pYCkgaXMgdGhlIHBhcmVudCdzIGNvbW1pdHRlZFxuICogb2JqZWN0IOKAlCBhbmQgdGhlIHN1YmZsb3cncyBhcmdzIGFyZSBkZWVwLUZST1pFTiBpbiBwbGFjZVxuICogKGByZWFkb25seUlucHV0IMK3IGNyZWF0ZUZyb3plbkFyZ3NgKS4gVGhlIHR5cGVkIHNjb3BlIGRvZXMgbm90IHByb3h5IGFcbiAqIGZyb3plbiB2YWx1ZSAoYGFsbG93bGlzdCDCtyBzaG91bGRXcmFwV2l0aFByb3h5YCksIHNvIGEgbGF0ZXJcbiAqIGBzY29wZS5jZmcueCA9IDFgIGluIHRoZSBwYXJlbnQgbWV0IHRoZSByYXcgZnJvemVuIG9iamVjdDogYSBUeXBlRXJyb3IgaW5cbiAqIHN0cmljdCBjb2RlLiBCZWZvcmUgOS4yOS4wIHRoZSBwYXJlbnQncyBuZXh0IHdob2xlLXN0YXRlIGNsb25lIHJlcGxhY2VkIHRoZVxuICogZnJvemVuIG9iamVjdCAoYSBtb3VudCB0aGF0IGNvbW1pdHRlZCBub3RoaW5nIGxlZnQgaXQgaW4gcGxhY2Ug4oCUIHRoZSBidWdcbiAqIGV4aXN0ZWQsIGl0IHdhcyBvbmx5IHNob3J0LWxpdmVkKTsgdW5kZXIgY29weS1vbi13cml0ZSBub3RoaW5nIHJlLWNsb25lcyxcbiAqIHNvIHRoZSBmcmVlemUgd291bGQgbGFzdCB1bnRpbCB0aGUga2V5IGlzIHJld3JpdHRlbi4gQSBtb3VudCBtdXN0IG5ldmVyXG4gKiBlZGl0IOKAlCBvciBmcmVlemUg4oCUIHRoZSBwYXJlbnQncyBjb21taXR0ZWQgb2JqZWN0czogZXZlcnkgcGxhaW4gb2JqZWN0LFxuICogYXJyYXksIGBEYXRlYCwgYE1hcGAgYW5kIGBTZXRgIHRoZSBtYXBwZXIgcmV0dXJucyBpcyBjbG9uZWQgaGVyZSwgYmVmb3JlIGl0XG4gKiBiZWNvbWVzIHRoZSBhcmdzLiBBIGNsYXNzIGluc3RhbmNlIHBhc3NlcyBieSByZWZlcmVuY2UsIGFzIGJlZm9yZSAoaXRcbiAqIGNhbm5vdCBjb21lIGZyb20gY29tbWl0dGVkIHN0YXRlLCBhbmQgYSBjbG9uZSB3b3VsZCBkcm9wIGl0cyBwcm90b3R5cGUpLlxuICogVGhlIHNlZWQgaXMgY2xvbmVkIGFnYWluIGF0IGl0cyBjb21taXQsIHNvIHRoZSBzdWJmbG93J3Mgc3RhdGUgaXNcbiAqIHVuY2hhbmdlZC5cbiAqL1xuZnVuY3Rpb24gZGV0YWNoTWFwcGVkSW5wdXQoaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBsZXQgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaW5wdXQpKSB7XG4gICAgaWYgKCFpc0RldGFjaGFibGUodmFsdWUpKSBjb250aW51ZTtcbiAgICAob3V0ID8/PSB7IC4uLmlucHV0IH0pW2tleV0gPSBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpO1xuICB9XG4gIHJldHVybiBvdXQgPz8gaW5wdXQ7XG59XG5cbi8qKiBBIHZhbHVlIGBzdHJ1Y3R1cmVkQ2xvbmVgIHJlcHJvZHVjZXMgd2l0aCBpdHMgb3duIHR5cGU6IHBsYWluIG9iamVjdCwgYXJyYXksIGBEYXRlYCwgYE1hcGAsIGBTZXRgLiAqL1xuZnVuY3Rpb24gaXNEZXRhY2hhYmxlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHwgdmFsdWUgaW5zdGFuY2VvZiBNYXAgfHwgdmFsdWUgaW5zdGFuY2VvZiBTZXQpIHJldHVybiB0cnVlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIFN1YmZsb3dFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgLyoqXG4gICAqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSAoYGRlcHMucmVzdW1lYCkuIFVuZGVmaW5lZCBvbiBhIG5vcm1hbFxuICAgKiBydW4uIEFza2VkIG9uY2UgcGVyIHN1YmZsb3cgZW50cnkg4oCUIHNlZSB7QGxpbmsgUmVzdW1lRW50cnl9LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZXN1bWU6IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkZXBzOiBIYW5kbGVyRGVwczxUT3V0LCBUU2NvcGU+LFxuICAgIHByaXZhdGUgdHJhdmVyc2VyRmFjdG9yeTogU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnk8VE91dCwgVFNjb3BlPixcbiAgKSB7XG4gICAgdGhpcy5yZXN1bWUgPSBkZXBzLnJlc3VtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgc3ViZmxvdyB3aXRoIGlzb2xhdGVkIGNvbnRleHQuXG4gICAqXG4gICAqIDEuIENyZWF0ZXMgYSBmcmVzaCBFeGVjdXRpb25SdW50aW1lIGZvciB0aGUgc3ViZmxvd1xuICAgKiAyLiBBcHBsaWVzIGlucHV0IG1hcHBpbmcgdG8gc2VlZCB0aGUgc3ViZmxvdydzIEdsb2JhbFN0b3JlXG4gICAqIDMuIERlbGVnYXRlcyB0cmF2ZXJzYWwgdG8gYSBmYWN0b3J5LWNyZWF0ZWQgRmxvd2NoYXJ0VHJhdmVyc2VyXG4gICAqIDQuIEFwcGxpZXMgb3V0cHV0IG1hcHBpbmcgdG8gd3JpdGUgcmVzdWx0cyBiYWNrIHRvIHBhcmVudCBzY29wZVxuICAgKiA1LiBTdG9yZXMgZXhlY3V0aW9uIGRhdGEgZm9yIGRlYnVnZ2luZy92aXN1YWxpemF0aW9uXG4gICAqL1xuICBhc3luYyBleGVjdXRlU3ViZmxvdyhcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBwYXJlbnRDb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gICAgYnJlYWtGbGFnOiBCcmVha0ZsYWcsXG4gICAgYnJhbmNoUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHN1YmZsb3dSZXN1bHRzTWFwOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PixcbiAgICBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0PzogVHJhdmVyc2FsQ29udGV4dCxcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzdWJmbG93SWQgPSBub2RlLnN1YmZsb3dJZCE7XG4gICAgY29uc3Qgc3ViZmxvd05hbWUgPSBub2RlLnN1YmZsb3dOYW1lID8/IG5vZGUubmFtZTtcblxuICAgIHBhcmVudENvbnRleHQuYWRkRmxvd0RlYnVnTWVzc2FnZSgnc3ViZmxvdycsIGBFbnRlcmluZyAke3N1YmZsb3dOYW1lfSBzdWJmbG93YCwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IHN1YmZsb3dJZCxcbiAgICB9KTtcblxuICAgIC8vIOKUgOKUgOKUgCBSZXN1bWUgcmUtZW50cnkgKG9uZS1zaG90KSDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFdoZW4gdGhpcyBlbnRyeSBpcyB0aGUgcmVzdW1lJ3Mgd2F5IGJhY2sgaW50byBhIHBhdXNlZCBzdWJmbG93LCB0aGVcbiAgICAvLyBob3AgbmFtZXMgd2hlcmUgdGhlIHN1YmZsb3cncyB0cmF2ZXJzYWwgc3RhcnRzICh0aGUgbmV4dCBtb3VudCBvbiB0aGVcbiAgICAvLyBwYXVzZSBwYXRoLCBvciB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4pLCBjYXJyaWVzIHRoZSBzdWJmbG93J3NcbiAgICAvLyBjYXB0dXJlZCBwcmUtcGF1c2Ugc3RhdGUsIGFuZCBhbnkgc2libGluZyBwYXVzZXMgd2FpdGluZyBpbiBpdC4gVGFrZW5cbiAgICAvLyBPTkNFOiBhbnkgbGF0ZXIgZW50cnkgaW50byB0aGlzIHN1YmZsb3cg4oCUIGEgbG9vcCBwYXNzaW5nIGl0cyBtb3VudFxuICAgIC8vIGFnYWluIOKAlCBnZXRzIGB1bmRlZmluZWRgIGFuZCBydW5zIHRoZSByZWFsIHN1YmZsb3cgZnJvbSBpdHMgcmVhbCByb290LFxuICAgIC8vIGlucHV0TWFwcGVyIGFuZCBhbGwuXG4gICAgY29uc3QgcmVzdW1lSG9wID0gdGhpcy5yZXN1bWU/LmVudGVyU3ViZmxvdyhzdWJmbG93SWQpO1xuXG4gICAgLy8g4pSA4pSA4pSAIElucHV0IE1hcHBpbmcg4pSA4pSA4pSAXG4gICAgLy9cbiAgICAvLyBUaGUgbWFwcGVyIHJ1bnMgb24gRVZFUlkgZW50cnk6IGl0cyByZXN1bHQgaXMgdGhlIHN0YWdlcycgcmVhZC1vbmx5XG4gICAgLy8gYXJncyAoYCRnZXRBcmdzKClgKSwgYW5kIGEgcmUtZW50ZXJlZCBzdWJmbG93J3Mgc3RhZ2VzIHJlYWQgdGhlIHNhbWVcbiAgICAvLyBhcmdzIHRoZXkgcmVhZCBiZWZvcmUgdGhlIHBhdXNlICh0aGUgcGFyZW50J3MgdmlldyBpcyB0aGUgc2FtZSBvbmUg4oCUXG4gICAgLy8gaXQgd2FzIGJsb2NrZWQgaW4gdGhpcyBtb3VudCkuIFdoYXQgYSByZXN1bWUgY2hhbmdlcyBpcyBvbmx5IHRoZSBTRUVEOlxuICAgIC8vIHdoZW4gdGhlIGhvcCBjYXJyaWVzIGEgY2FwdHVyZSwgdGhlIG5lc3RlZCBtZW1vcnkgaXMgc2VlZGVkIGZyb20gdGhlXG4gICAgLy8gY2FwdHVyZSwgbm90IGZyb20gdGhlIG1hcHBlciDigJQgdGhlIGNhcHR1cmUgaXMgdGhlIHBvc3QtaW5wdXQgcHJlLXBhdXNlXG4gICAgLy8gbWVtb3J5LCBhbmQgc2VlZGluZyB0aGUgbWFwcGVyJ3MgdmFsdWVzIHdvdWxkIGNsb2JiZXIgcG9zdC1pbnB1dFxuICAgIC8vIHdyaXRlcyAoaGlzdG9yeSwgcGF1c2VkVG9vbENhbGxJZCwgZXRjLikgd2l0aCB0aGUgc3RhcnQtb2Ytc3ViZmxvdyB2aWV3LlxuICAgIGNvbnN0IG1vdW50T3B0aW9ucyA9IG5vZGUuc3ViZmxvd01vdW50T3B0aW9ucztcbiAgICBsZXQgbWFwcGVkSW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgY29uc3QgcmVzdW1lQ2FwdHVyZSA9IHJlc3VtZUhvcD8uc2VlZDtcbiAgICBjb25zdCBpc1Jlc3VtZUZvclRoaXNTdWJmbG93ID0gcmVzdW1lQ2FwdHVyZSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgLy8gVGhlIHJ1bidzIHBvbGljeSAoRjUpIOKAlCB0aGUgZm91ciBkaWFscywgdGhlIHJlZGFjdGlvbiBydWxlLCB0aGUgbWlycm9yXG4gICAgLy8gZmxhZyDigJQgcmVhZCBvZmYgdGhlIHBhcmVudC1tb3VudCBmcmFtZSwgd2hpY2ggaG9sZHMgaXQgYnkgcmVmZXJlbmNlLlxuICAgIC8vIFRoZSBuZXN0ZWQgcnVudGltZSBpcyBjb25zdHJ1Y3RlZCBXSVRIIGl0LCBzbyB0aGUgc2VlZCBjb21taXQgYmVsb3dcbiAgICAvLyAoYGhpc3RvcnlbMF1gKSBhbmQgZXZlcnkgbGF0ZXIgY29tbWl0IG9mIHRoZSBzdWJmbG93IHJ1biB1bmRlciB0aGUgc2FtZVxuICAgIC8vIG9iamVjdCwgYW5kIHRoZSBuZXN0ZWQgcnVudGltZSBrZWVwcyBhIG1pcnJvciBvZiBpdHMgb3duIGV4YWN0bHkgd2hlblxuICAgIC8vIHRoZSBydW4gZG9lcyAoaXRzIFNFUlZFRCBzdGF0ZSBpcyB0aGVuIHRoZSBmb2xkIG9mIGl0cyBvd24gc2NydWJiZWRcbiAgICAvLyBsb2csIG5ldmVyIGEgc2Vjb25kIHNjcnViKS5cbiAgICBjb25zdCBwb2xpY3k6IFJ1blBvbGljeSA9IHBhcmVudENvbnRleHQuZ2V0UG9saWN5KCk7XG4gICAgY29uc3QgcmVkYWN0aW9uUnVsZSA9IHBvbGljeS5yZWRhY3Rpb247XG5cbiAgICBpZiAobW91bnRPcHRpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJlbnRTY29wZSA9IHBhcmVudENvbnRleHQuZ2V0U2NvcGUoKTtcbiAgICAgICAgLy8gVGhlIHJ1bGUgcmlkZXMgYWxvbmc6IGEga2V5IHRoZSBtYXBwZXIgY29waWVzIGEgc2VsZWN0ZWQgdmFsdWUgaW50b1xuICAgICAgICAvLyBpbmhlcml0cyBpdHMgcmVkYWN0aW9uIGJlZm9yZSB0aGUgc2VlZCBpcyB3cml0dGVuICh0aGUgdGFpbnQgcnVsZSkuXG4gICAgICAgIG1hcHBlZElucHV0ID0gZGV0YWNoTWFwcGVkSW5wdXQoZ2V0SW5pdGlhbFNjb3BlVmFsdWVzKHBhcmVudFNjb3BlLCBtb3VudE9wdGlvbnMsIHJlZGFjdGlvblJ1bGUpKTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcHBlZElucHV0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgLy8gbWFwcGVkSW5wdXQgaXMgY2FwdHVyZWQgaW4gU3ViZmxvd1Jlc3VsdC50cmVlQ29udGV4dCBmb3IgZGVidWdnaW5nXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignaW5wdXRNYXBwZXJFcnJvcicsIHRocm93blRleHQoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gaW5wdXRNYXBwZXIgZm9yIHN1YmZsb3cgKCR7c3ViZmxvd0lkfSk6YCwge1xuICAgICAgICAgIGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IocGFyZW50Q29udGV4dCwgZXJyb3IpLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTmFycmF0aXZlIHJlY2VpdmVzIHRoZSBSRVRBSU5FRCBmb3JtIG9mIHRoZSBtYXBwZWQgaW5wdXQg4oCUIGFuXG4gICAgLy8gaW5wdXRNYXBwZXIgbWF5IGluamVjdCB2YWx1ZXMgZnJvbSBhbnl3aGVyZSwgc28gdGhlIHNlZWQgaXMgc2NydWJiZWRcbiAgICAvLyB1bmRlciB0aGUgcG9saWN5IGJlZm9yZSBhbnkgcmVjb3JkZXIgc2VlcyBpdC4gU2FtZSBvYmplY3Qgd2hlbiBub3RoaW5nXG4gICAgLy8gaW4gaXQgaXMgcmVkYWN0ZWQgKHRoZSBuby1wb2xpY3kgcGF0aCBhbGxvY2F0ZXMgbm90aGluZykuXG4gICAgY29uc3QgbmFycmF0aXZlSW5wdXQgPSByZWRhY3Rpb25SdWxlID8gcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeShtYXBwZWRJbnB1dCkgOiBtYXBwZWRJbnB1dDtcbiAgICAvLyBgRmxvd1N1YmZsb3dFdmVudC5kZXNjcmlwdGlvbmAgaXMgc2VtYW50aWNhbGx5IFwid2hhdCB0aGlzIHN1YmZsb3cgZG9lc1wiIOKAlCBzb3VyY2VkIGZyb21cbiAgICAvLyB0aGUgc3ViZmxvdydzIG93biByb290IHN0YWdlLCBub3QgdGhlIHBhcmVudCBtb3VudCBwb2ludC4gVGhlIG1vdW50IG5vZGUgbmV2ZXIgY2Fycmllc1xuICAgIC8vIGEgZGVzY3JpcHRpb24gKGJ1aWxkZXJzIGRvbid0IGNvcHkgaXQpLCBzbyByZWFkaW5nIGBub2RlLmRlc2NyaXB0aW9uYCBoZXJlIHJldHVybnNcbiAgICAvLyBgdW5kZWZpbmVkYCBhbmQgdGF4b25vbXkgbWFya2VycyBzZXQgb24gdGhlIHN1YmZsb3cgcm9vdCAoZS5nLiBhZ2VudGZvb3RwcmludCdzXG4gICAgLy8gYCdBZ2VudDogUmVBY3QgbG9vcCdgIC8gYCdMTE1DYWxsOiBvbmUtc2hvdCdgKSBuZXZlciByZWFjaCBkb3duc3RyZWFtIGNvbnN1bWVycy5cbiAgICBjb25zdCByb290RGVzY3JpcHRpb24gPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdPy5yb290Py5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0VudHJ5KFxuICAgICAgc3ViZmxvd05hbWUsXG4gICAgICBzdWJmbG93SWQsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICBuYXJyYXRpdmVJbnB1dCxcbiAgICApO1xuICAgIC8vIFByb3Bvc2FsICMwMDM6IGZpcmUgb25TdGFnZUV4ZWN1dGVkIGZvciB0aGUgbW91bnQgbm9kZSBBRlRFUlxuICAgIC8vIG9uU3ViZmxvd0VudHJ5IHNvIGNvbnN1bWVycyB0cmFja2luZyBcImRpZCB0aGlzIHN0YWdlIHJ1blwiIHdvcmtcbiAgICAvLyB1bmlmb3JtbHkgYWNyb3NzIGxpbmVhciAvIGRlY2lkZXIgLyBmb3JrIC8gc2VsZWN0b3IgLyBzdWJmbG93LW1vdW50LlxuICAgIC8vIEZpcmVzIG9uIEVOVFJZIChub3QgZXhpdCkg4oCUIGVudHJ5ID0gXCJ0aGlzIG1vdW50IHJhblwiOyB0aGVcbiAgICAvLyBzdWJmbG93J3MgY2hpbGRyZW4gZXhlY3V0ZSBhZnRlciBhcyBzZXBhcmF0ZSBzdGFnZXMuXG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN0YWdlRXhlY3V0ZWQoXG4gICAgICBub2RlLm5hbWUsXG4gICAgICByb290RGVzY3JpcHRpb24gPz8gbm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQsXG4gICAgICAnc3ViZmxvdy1tb3VudCcsXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBpc29sYXRlZCBydW50aW1lIHZpYSBkeW5hbWljIGNvbnN0cnVjdGlvbiAoYXZvaWRzIGNpcmN1bGFyIGltcG9ydCkuXG4gICAgLy8gSXRzIHJvb3QgY29udGV4dCBpcyB0aGUgZmlyc3Qgc3RhZ2UgdGhlIHN1YmZsb3cgdHJhdmVyc2FsIHJ1bnMg4oCUIHRoZVxuICAgIC8vIHJlc3VtZSBob3AncyBlbnRyeSBvbiBhIHJlLWVudHJ5LCB0aGUgc3ViZmxvdydzIHJvb3Qgb3RoZXJ3aXNlLlxuICAgIGNvbnN0IEV4ZWN1dGlvblJ1bnRpbWVDbGFzcyA9IHRoaXMuZGVwcy5leGVjdXRpb25SdW50aW1lLmNvbnN0cnVjdG9yIGFzIG5ldyAoXG4gICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICBpZDogc3RyaW5nLFxuICAgICAgZGVmYXVsdFZhbHVlczogdW5kZWZpbmVkLFxuICAgICAgaW5pdGlhbFN0YXRlOiB1bmRlZmluZWQsXG4gICAgICBwb2xpY3k6IFJ1blBvbGljeSxcbiAgICAgIHJlY29yZD86IHVua25vd24sXG4gICAgICBzb3VyY2U/OiB7IHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7IHJlYWRvbmx5IHVuYXZhaWxhYmxlOiAnY2hpbGQtc291cmNlLW93bmVyc2hpcCcgfSxcbiAgICApID0+IElFeGVjdXRpb25SdW50aW1lO1xuICAgIGNvbnN0IGZpcnN0Tm9kZSA9IHJlc3VtZUhvcD8uZW50cnkgPz8gbm9kZTtcbiAgICAvLyBUaGUgY3Jhc2gtc2FmZSByZWNvcmQgKDEwLjEsIFA2KTogd2hlbiB0aGUgcnVuIHdyaXRlcyB0byBhIHNpbmssIHRoZSBtb3VudCdzIG93biBsb2cgZG9lcyB0b28sIGF0IHRoZVxuICAgIC8vIHBhcmVudCBsb2cncyBhZGRyZXNzIHBsdXMgdGhpcyBtb3VudCdzIHJ1bnRpbWVTdGFnZUlkIOKAlCBvcGVuZWQgaGVyZSwgaXRzIHNlZWQgYW5kIGV2ZXJ5IGNvbW1pdCBhcyB0aGV5IGxhbmQsXG4gICAgLy8gY2xvc2VkIGF0IHRoZSBtb3VudCdzIGV4aXQgKG9yIGl0cyBwYXVzZSwgb3IgaXRzIGZhaWx1cmUpLiBXaXRob3V0IGEgc2luazogdW5kZWZpbmVkLCB0aGUgcGxhaW4gbG9nLlxuICAgIGNvbnN0IG1vdW50UnVudGltZVN0YWdlSWQgPSBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCByZWNvcmQgPVxuICAgICAgbW91bnRSdW50aW1lU3RhZ2VJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogdGhpcy5kZXBzLmV4ZWN1dGlvblJ1bnRpbWUucmVjb3JkRm9yPy4obW91bnRSdW50aW1lU3RhZ2VJZCwgeyBzdWJmbG93SWQgfSk7XG4gICAgY29uc3QgbmVzdGVkUnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lQ2xhc3MoXG4gICAgICBmaXJzdE5vZGUubmFtZSxcbiAgICAgIGZpcnN0Tm9kZS5pZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHBvbGljeSxcbiAgICAgIHJlY29yZCxcbiAgICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQ/LnJ1bklkXG4gICAgICAgID8geyBydW5JZDogcGFyZW50VHJhdmVyc2FsQ29udGV4dC5ydW5JZCwgdW5hdmFpbGFibGU6ICdjaGlsZC1zb3VyY2Utb3duZXJzaGlwJyB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICk7XG5cbiAgICAvLyBTZWVkIEdsb2JhbFN0b3JlIHdpdGggdGhlIHJpZ2h0IHNoYXBlIGZvciB0aGUgcGF0aDpcbiAgICAvLyAgIOKAoiBSZXN1bWUgaW50byBUSElTIHN1YmZsb3cg4oaSIHNlZWQgZnJvbSB0aGUgY2FwdHVyZWQgcHJlLXBhdXNlXG4gICAgLy8gICAgIHNjb3BlIHNvIHJlc3VtZSBoYW5kbGVycyBzZWUgaGlzdG9yeSwgcGF1c2VkVG9vbENhbGxJZCwgZXRjLlxuICAgIC8vICAgICAoYG1hcHBlZElucHV0YCBzdGlsbCByZWFjaGVzIHRoZSBzdGFnZXMsIGFzIHRoZWlyIHJlYWQtb25seSBhcmdzLilcbiAgICAvLyAgIOKAoiBOb3JtYWwgZW50cnkg4oaSIHNlZWQgZnJvbSB0aGUgaW5wdXRNYXBwZXIncyBtYXBwZWRJbnB1dC5cbiAgICBjb25zdCBzZWVkVmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPyByZXN1bWVDYXB0dXJlISA6IG1hcHBlZElucHV0O1xuICAgIGlmIChPYmplY3Qua2V5cyhzZWVkVmFsdWVzKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBUaGUgc2VlZCBpcyBjb21taXR0ZWQgYXMgdGhlIHN1YmZsb3cncyBgaGlzdG9yeVswXWAgYnkgaXRzIHJvb3RcbiAgICAgIC8vIGNvbnRleHQsIG5vdCBieSBhIGZhY2FkZSDigJQgdGhhdCBmcmFtZSBhbHJlYWR5IGhvbGRzIHRoZSBydW4ncyBwb2xpY3lcbiAgICAgIC8vICh0aGUgcnVudGltZSB3YXMgY29uc3RydWN0ZWQgd2l0aCBpdCksIHNvIHRoZSBzZWVkIHJldGFpbnMgdW5kZXIgdGhlXG4gICAgICAvLyBydWxlLCBsYW5kcyBpbiB0aGUgbWlycm9yIGFzIHRoZSBwbGFjZWhvbGRlciwgYW5kIGNvbW1pdHMgdW5kZXIgdGhlXG4gICAgICAvLyBydW4ncyBkaWFscyBsaWtlIGV2ZXJ5IG90aGVyIHdyaXRlIChDLUY1OiB1bmRlciBgd3JpdGVQcm92ZW5hbmNlOlxuICAgICAgLy8gJ3JlYWRzLXByZWZpeCdgIGl0cyByb3dzIGNhcnJ5IGByZWFkS2V5czogW11gKS5cbiAgICAgIC8vIFRoZSBzZWVkIGlzIHRoZSBtb3VudCdzIGFjdCB0b286IGl0cyBidW5kbGUg4oCUIGBoaXN0b3J5WzBdYCBvZiB0aGVcbiAgICAgIC8vIHN1YmZsb3cncyBvd24gbG9nIOKAlCBjYXJyaWVzIHRoZSBtb3VudCdzIHN0YWdlLCBzdGFnZUlkIGFuZFxuICAgICAgLy8gcnVudGltZVN0YWdlSWQgKFIxMzsgdGhyb3VnaCA5LjMzLjAgaXQgY2FycmllZCBydW50aW1lU3RhZ2VJZCAnJyBhbmRcbiAgICAgIC8vIHRoZSBmaXJzdCBzdGFnZSdzIG5hbWVzLCB3aGljaCBvbiBhIHJlc3VtZSB3YXMgdGhlIHJlLWVudHJ5IHBvaW50KS5cbiAgICAgIHRyeSB7XG4gICAgICAgIHNlZWRTdWJmbG93R2xvYmFsU3RvcmUobmVzdGVkUnVudGltZSwgc2VlZFZhbHVlcywgcGFyZW50Q29udGV4dCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBUaGUgbW91bnQncyBvd24gbG9nIG9wZW5lZCBhYm92ZTogYSBzZWVkIHRoYXQgZmFpbHMgY2xvc2VzIGl0LCBuZXZlciBsZWF2ZXMgaXQgbG9va2luZyBjcmFzaGVkLlxuICAgICAgICBuZXN0ZWRSdW50aW1lLmNsb3NlUmVjb3JkPy4oJ2ZhaWxlZCcpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vIFJlZnJlc2ggcm9vdFN0YWdlQ29udGV4dCBzbyBXcml0ZUJ1ZmZlciBzZWVzIGNvbW1pdHRlZCBkYXRhLiBOYW1lZFxuICAgICAgLy8gYWZ0ZXIgdGhlIGZpcnN0IG5vZGUgYWdhaW4g4oCUIHRoZSBzZWVkIGNvbnRleHQgbm93IGNhcnJpZXMgdGhlIG1vdW50J3NcbiAgICAgIC8vIG5hbWVzIChSMTMpLCB3aGljaCBiZWxvbmcgdG8gdGhlIHNlZWQgYnVuZGxlIG9ubHkuIGBuZXdSb290YCBnaXZlcyBpdFxuICAgICAgLy8gdGhlIHNhbWUgcG9saWN5IGFuZCBtaXJyb3IuXG4gICAgICBuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQgPSBuZXN0ZWRSdW50aW1lLm5ld1Jvb3QoZmlyc3ROb2RlLm5hbWUsIGZpcnN0Tm9kZS5pZCk7XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBzdWJmbG93IHJvb3Qgbm9kZSDigJQgc3RyaXAgaXNTdWJmbG93Um9vdCB0byBwcmV2ZW50IHJlLWRlbGVnYXRpb24uXG4gICAgLy9cbiAgICAvLyBQUkVTRVJWRSBgbmV4dGAuIEVhcmxpZXIgcmV2aXNpb25zIHN0cmlwcGVkIGBuZXh0YCB3aGVuZXZlciB0aGVcbiAgICAvLyBzdWJmbG93IHJvb3QgaGFkIGNoaWxkcmVuLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGBuZXh0YCB3YXNcbiAgICAvLyBhbHdheXMgdGhlIE9VVEVSIG1vdW50J3MgY29udGludWF0aW9uIGxlYWtpbmcgaW50byB0aGUgaW5uZXJcbiAgICAvLyB0cmVlLiBUaGF0IGFzc3VtcHRpb24gd2FzIHdyb25nOiB0aGUgcmVzb2x2ZWQgc3ViZmxvdyByb290J3NcbiAgICAvLyBgbmV4dGAgaXMgdGhlIElOTkVSIGpvaW4gc3RhZ2UgKGUuZy4sIFBhcmFsbGVsJ3MgTWVyZ2UgYWZ0ZXIgYVxuICAgIC8vIGZhbi1vdXQsIFRvVCdzIFBydW5lcikuIFN0cmlwcGluZyBpdCBicm9rZSBjb21wb3NpdGUgc3ViZmxvd3Mg4oCUXG4gICAgLy8gdGhlIGpvaW4gc3RhZ2UgbmV2ZXIgcmFuLCBzbyB0aGUgc3ViZmxvdyByZXR1cm5lZCBwYXJ0aWFsIHN0YXRlLlxuICAgIC8vXG4gICAgLy8gVGhlIG91dGVyIG1vdW50J3MgcG9zdC1zdWJmbG93IGNvbnRpbnVhdGlvbiBpcyBoYW5kbGVkIHNlcGFyYXRlbHlcbiAgICAvLyBieSB0aGUgcGFyZW50IHRyYXZlcnNlciB2aWEgYHBhcmVudENvbnRleHQubmV4dE5vZGVgIGFuZCBpcyBuZXZlclxuICAgIC8vIGNvbmZsYXRlZCB3aXRoIHRoZSBpbm5lciBzdWJmbG93J3MgYG5leHRgIGNoYWluLlxuICAgIGNvbnN0IHN1YmZsb3dOb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIC4uLm5vZGUsXG4gICAgICBpc1N1YmZsb3dSb290OiBmYWxzZSxcbiAgICB9O1xuXG4gICAgLy8g4pSA4pSA4pSAIEV4ZWN1dGUgdmlhIGZhY3RvcnkgdHJhdmVyc2VyIOKUgOKUgOKUgFxuICAgIC8vIFRoZSBmYWN0b3J5IGNyZWF0ZXMgYSBmdWxsIEZsb3djaGFydFRyYXZlcnNlciB3aXRoIHRoZSBzYW1lIDctcGhhc2UgYWxnb3JpdGhtLFxuICAgIC8vIHNoYXJpbmcgdGhlIHBhcmVudCdzIHN0YWdlTWFwLCBzdWJmbG93cyBkaWN0LCBhbmQgbmFycmF0aXZlIGdlbmVyYXRvci5cbiAgICBsZXQgc3ViZmxvd091dHB1dDogYW55O1xuICAgIC8vIEJveGVkOiBhIHN0YWdlIG1heSB0aHJvdyBBTlkgdmFsdWUsIGBudWxsYCBhbmQgYHVuZGVmaW5lZGAgaW5jbHVkZWQg4oCUXG4gICAgLy8gYSBmYWxzeSB0aHJvd24gdmFsdWUgbXVzdCBzdGlsbCBmYWlsIHRoZSBtb3VudC5cbiAgICBsZXQgc3ViZmxvd0Vycm9yOiB7IGVycm9yOiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRyYXZlcnNlckhhbmRsZTogU3ViZmxvd1RyYXZlcnNlckhhbmRsZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRyYXZlcnNlckhhbmRsZSA9IHRoaXMudHJhdmVyc2VyRmFjdG9yeSh7XG4gICAgICAgIC8vIFRoZSBSRUFMIHN1YmZsb3cgZ3JhcGgg4oCUIGV2ZXJ5IGlkIGluc2lkZSB0aGUgc3ViZmxvdyAobG9vcCB0YXJnZXRzLFxuICAgICAgICAvLyBhIHJlLXZpc2l0IG9mIHRoZSBwYXVzZWQgc3RhZ2UpIHJlc29sdmVzIGFnYWluc3QgaXQsIHJlLWVudHJ5IG9yIG5vdC5cbiAgICAgICAgcm9vdDogc3ViZmxvd05vZGUsXG4gICAgICAgIC8vIFdoZXJlIHRoaXMgdHJhdmVyc2FsIHN0YXJ0cyBvbiBhIHJlc3VtZSByZS1lbnRyeTsgdmlzaXRlZCBvbmNlIOKAlFxuICAgICAgICAvLyBhbmQgdGhlIHNpYmxpbmcgcGF1c2VzIGl0IHJhaXNlcyBvbmNlIHRoYXQgZW50cnkncyBjaGFpbiBlbmRzLlxuICAgICAgICAuLi4ocmVzdW1lSG9wPy5lbnRyeSAmJiB7IGVudHJ5OiByZXN1bWVIb3AuZW50cnkgfSksXG4gICAgICAgIC4uLihyZXN1bWVIb3A/LnBlbmRpbmdQYXVzZXMgJiYgeyBwZW5kaW5nUGF1c2VzOiByZXN1bWVIb3AucGVuZGluZ1BhdXNlcyB9KSxcbiAgICAgICAgZXhlY3V0aW9uUnVudGltZTogbmVzdGVkUnVudGltZSxcbiAgICAgICAgcmVhZE9ubHlDb250ZXh0OiBtYXBwZWRJbnB1dCxcbiAgICAgICAgc3ViZmxvd0lkLFxuICAgICAgICAvLyBSRkMtMDAzIEQxOiB0aGUgbW91bnQgc3RhZ2UncyBydW50aW1lU3RhZ2VJZCDigJQgdGhlIHN1YmZsb3cgcm9vdFxuICAgICAgICAvLyBzdGFnZSdzIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgc28gYW5jZXN0b3IgY2hhaW5zIGNyb3NzIHRoZSBtb3VudC5cbiAgICAgICAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZDogcGFyZW50VHJhdmVyc2FsQ29udGV4dD8ucnVudGltZVN0YWdlSWQsXG4gICAgICB9KTtcblxuICAgICAgc3ViZmxvd091dHB1dCA9IGF3YWl0IHRyYXZlcnNlckhhbmRsZS5leGVjdXRlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgLy8gUGF1c2VTaWduYWwgaXMgbm90IGFuIGVycm9yIOKAlCBwcmVwZW5kIHN1YmZsb3cgSUQgYW5kIHJlLXRocm93XG4gICAgICAvLyBpbW1lZGlhdGVseS4gTm8gZXJyb3IgbG9nZ2luZywgbm8gc3ViZmxvd1Jlc3VsdCByZWNvcmRpbmcg4oCUXG4gICAgICAvLyB0aGUgcGF1c2UgaXMgY29udHJvbCBmbG93LlxuICAgICAgLy9cbiAgICAgIC8vIEJFRk9SRSByZS10aHJvdywgY2FwdHVyZSB0aGUgbmVzdGVkIHJ1bnRpbWUncyBzdGF0ZSBvbnRvIHRoZVxuICAgICAgLy8gc2lnbmFsLiBUaGlzIGlzIHRoZSBvbmx5IGNoYW5jZSDigJQgb25jZSB3ZSByZS10aHJvdywgdGhlIG91dGVyXG4gICAgICAvLyB0cmF2ZXJzZXIgdW53aW5kcyBhbmQgdGhlIG5lc3RlZCBydW50aW1lIGlzIEdDJ2QuIE9uIHJlc3VtZSwgd2UnbGxcbiAgICAgIC8vIHJlLXNlZWQgYSBmcmVzaCBuZXN0ZWQgcnVudGltZSBmcm9tIHRoaXMgY2FwdHVyZSBzbyByZXN1bWUgaGFuZGxlcnNcbiAgICAgIC8vIGNhbiByZWFkIHRoZSBwcmUtcGF1c2Ugc3ViZmxvdyBzY29wZS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgU1RBVEUgb25seSDigJQgdGhlIHN1YmZsb3cncyB3b3JraW5nIG1lbW9yeSBhdCBwYXVzZSB0aW1lIChldmVyeVxuICAgICAgLy8gY29tbWl0dGVkIHdyaXRlIHVwIHRvIHRoZSBwYXVzZSksIHJlYWQgc3RyYWlnaHQgb2ZmIGl0cyBzdG9yZS4gTm9cbiAgICAgIC8vIHNuYXBzaG90IGlzIGJ1aWx0OiBhIHNuYXBzaG90IHdvdWxkIGFsc28gYnVpbGQgdGhlIHN1YmZsb3cnc1xuICAgICAgLy8gZXhlY3V0aW9uIHRyZWUgYW5kIGNvcHkgaXRzIGNvbW1pdCBsb2cg4oCUIHdvcmsgcHJvcG9ydGlvbmFsIHRvIGhvd1xuICAgICAgLy8gbG9uZyB0aGUgc3ViZmxvdyByYW4g4oCUIHRoYXQgdGhlIGxlYW4gY2hlY2twb2ludCBuZXZlciBjYXJyaWVzXG4gICAgICAvLyAoYHJ1bm5lci9jaGVja3BvaW50LnRzYCkuXG4gICAgICAvL1xuICAgICAgLy8gQ2FwdHVyZSBpcyBrZXllZCBieSB0aGUgU0FNRSBwYXRoLXByZWZpeGVkIGBzdWJmbG93SWRgIHVzZWQgaW5cbiAgICAgIC8vIGBzdWJmbG93UGF0aGAsIHNvIHJlc3VtZSBjYW4gbG9vayB1cCBcInNjb3BlIGZvciBzZi1mb29cIiBieSBpZC5cbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICBlcnJvci5jYXB0dXJlU3ViZmxvd1Njb3BlKHN1YmZsb3dJZCwgbmVzdGVkUnVudGltZS5nbG9iYWxTdG9yZS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgZXJyb3IucHJlcGVuZFN1YmZsb3coc3ViZmxvd0lkKTtcbiAgICAgICAgbmVzdGVkUnVudGltZS5jbG9zZVJlY29yZD8uKCdwYXVzZWQnKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBzdWJmbG93RXJyb3IgPSB7IGVycm9yIH07XG4gICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdzdWJmbG93RXJyb3InLCB0aHJvd25UZXh0KGVycm9yKSk7XG4gICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHsgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihwYXJlbnRDb250ZXh0LCBlcnJvcikgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhlIG1vdW50J3Mgb3duIGxvZyBlbmRlZCDigJQgYmVmb3JlIHRoZSBtZXJnZS1iYWNrLCB3aGljaCBjb21taXRzIG9uIHRoZSBQQVJFTlQncyBsb2cuXG4gICAgbmVzdGVkUnVudGltZS5jbG9zZVJlY29yZD8uKHN1YmZsb3dFcnJvciA/ICdmYWlsZWQnIDogJ29rJyk7XG5cbiAgICAvLyBBbHdheXMgbWVyZ2UgbmVzdGVkIHN1YmZsb3cgcmVzdWx0cyAoZXZlbiBvbiBlcnJvciDigJQgcGFydGlhbCByZXN1bHRzIGFpZCBkZWJ1Z2dpbmcpXG4gICAgaWYgKHRyYXZlcnNlckhhbmRsZSkge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdHJhdmVyc2VySGFuZGxlLmdldFN1YmZsb3dSZXN1bHRzKCkpIHtcbiAgICAgICAgc3ViZmxvd1Jlc3VsdHNNYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOKUgOKUgOKUgCBCcmVhayBwcm9wYWdhdGlvbiAob3B0LWluIHZpYSBTdWJmbG93TW91bnRPcHRpb25zLnByb3BhZ2F0ZUJyZWFrKSDilIDilIBcbiAgICAvL1xuICAgIC8vIElmIHRoZSBzdWJmbG93J3MgaW5uZXIgdHJhdmVyc2FsIGJyb2tlIChiZWNhdXNlIGEgc3RhZ2UgY2FsbGVkXG4gICAgLy8gYHNjb3BlLiRicmVhayhyZWFzb24pYCkgQU5EIHRoZSBtb3VudCBkZWNsYXJlZCBgcHJvcGFnYXRlQnJlYWs6IHRydWVgLFxuICAgIC8vIGZvcndhcmQgdGhlIGJyZWFrIHN0YXRlIHRvIHRoZSBQQVJFTlQncyBicmVha0ZsYWcuIFRoZSBwYXJlbnRcbiAgICAvLyB0cmF2ZXJzZXIgd2lsbCBzZWUgYHNob3VsZEJyZWFrYCBvbiBpdHMgbmV4dCBzdGVwIGFuZCBzdG9wLlxuICAgIC8vXG4gICAgLy8gV2l0aG91dCB0aGlzLCBpbm5lciBicmVha3MgYXJlIGxvY2FsbHkgc2NvcGVkIHRvIHRoZSBzdWJmbG93IOKAlCB0aGVcbiAgICAvLyBwYXJlbnQgY29udGludWVzIGFzIGlmIHRoZSBzdWJmbG93IHJldHVybmVkIG5vcm1hbGx5LlxuICAgIC8vXG4gICAgLy8gSU1QT1JUQU5UOiB0aGlzIHJ1bnMgQkVGT1JFIGBvdXRwdXRNYXBwaW5nYCBiZWxvdywgaW50ZW50aW9uYWxseS4gVGhlXG4gICAgLy8gb3V0cHV0TWFwcGVyIHN0aWxsIGV4ZWN1dGVzLCBzbyB0aGUgc3ViZmxvdydzIHBhcnRpYWwgcmVzdWx0IHN0aWxsXG4gICAgLy8gbGFuZHMgaW4gdGhlIHBhcmVudCBzY29wZS4gQ29uc3VtZXJzIHdobyBuZWVkIHRvIHN1cHByZXNzIG91dHB1dCBvblxuICAgIC8vIGJyZWFrIGNoZWNrIHRoZSBicmVhayBzdGF0ZSBpbnNpZGUgdGhlaXIgb3V0cHV0TWFwcGVyIGFuZCBlYXJseS1yZXR1cm4uXG4gICAgLy8gU2VlIGBTdWJmbG93TW91bnRPcHRpb25zLnByb3BhZ2F0ZUJyZWFrYCBKU0RvYyBmb3IgcmF0aW9uYWxlLlxuICAgIGlmICh0cmF2ZXJzZXJIYW5kbGUgJiYgbW91bnRPcHRpb25zPy5wcm9wYWdhdGVCcmVhayA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaW5uZXJCcmVhayA9IHRyYXZlcnNlckhhbmRsZS5nZXRCcmVha1N0YXRlKCk7XG4gICAgICBpZiAoaW5uZXJCcmVhay5zaG91bGRCcmVhaykge1xuICAgICAgICBicmVha0ZsYWcuc2hvdWxkQnJlYWsgPSB0cnVlO1xuICAgICAgICBpZiAoaW5uZXJCcmVhay5yZWFzb24gIT09IHVuZGVmaW5lZCAmJiBicmVha0ZsYWcucmVhc29uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBicmVha0ZsYWcucmVhc29uID0gaW5uZXJCcmVhay5yZWFzb247XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmFpc2UgYSBwYXJlbnQtbGV2ZWwgb25CcmVhayBldmVudCBzbyByZWNvcmRlcnMgY2FuIGRpc3Rpbmd1aXNoXG4gICAgICAgIC8vIHRoZSBpbm5lciBvcmlnaW5hdGluZyBicmVhayAoZmlyZWQgaW5zaWRlIHRoZSBzdWJmbG93KSBmcm9tIHRoaXNcbiAgICAgICAgLy8gcHJvcGFnYXRlZCBvbmUgKGZpcmVkIGF0IHRoZSBtb3VudCBsZXZlbCBvbiB0aGUgcGFyZW50KS5cbiAgICAgICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vbkJyZWFrKHN1YmZsb3dOYW1lLCBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0LCBpbm5lckJyZWFrLnJlYXNvbiwgc3ViZmxvd0lkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzdWJmbG93VHJlZUNvbnRleHQgPSBuZXN0ZWRSdW50aW1lLmdldFNuYXBzaG90KCk7XG5cbiAgICAvLyDilIDilIDilIAgT3V0cHV0IE1hcHBpbmcg4pSA4pSA4pSAXG4gICAgaWYgKCFzdWJmbG93RXJyb3IgJiYgbW91bnRPcHRpb25zPy5vdXRwdXRNYXBwZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoZSBtZXJnZS1iYWNrIGlzIHRoZSBNT1VOVCdzIGFjdCwgc28gdGhlIG1vdW50J3MgZnJhbWUgc3RhZ2VzIGFuZFxuICAgICAgICAvLyBjb21taXRzIGl0IOKAlCBpdHMgYnVuZGxlIGNhcnJpZXMgdGhlIG1vdW50J3MgcnVudGltZVN0YWdlSWQgKFIxMykuXG4gICAgICAgIC8vIEEgYnJhbmNoIG9yIGZvcmstY2hpbGQgbW91bnQgc3RpbGwgbGFuZHMgaXRzIHZhbHVlcyB3aGVyZSBpdHNcbiAgICAgICAgLy8gcGFyZW50IHdyaXRlcyAodGhlIHBhcmVudCdzIHJ1biBuYW1lc3BhY2UpLCBhcyBiZWZvcmU7IHVudGlsIDkuMzMuMFxuICAgICAgICAvLyBpdCBjb21taXR0ZWQgT04gdGhlIHBhcmVudCdzIGZyYW1lLCBzbyB0aGUgYnVuZGxlIG5hbWVkIHRoZSBzdGFnZVxuICAgICAgICAvLyBiZWZvcmUgdGhlIG1vdW50LCBvciB0aGUgYnJhbmNoaW5nIGRlY2lkZXIuXG4gICAgICAgIGNvbnN0IG91dHB1dENvbnRleHQgPSBwYXJlbnRDb250ZXh0O1xuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5icmFuY2hJZCAmJiBwYXJlbnRDb250ZXh0LnBhcmVudCkge1xuICAgICAgICAgIG91dHB1dENvbnRleHQudXNlQWRkcmVzc09mKHBhcmVudENvbnRleHQucGFyZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gb3V0cHV0Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICAvLyBGb3IgVHlwZWRTY29wZSBzdWJmbG93cywgc3RhZ2UgZnVuY3Rpb25zIHJldHVybiB2b2lkIOKAlCBmYWxsIGJhY2sgdG8gYSBzaGFsbG93IGNsb25lXG4gICAgICAgIC8vIG9mIHRoZSBzdWJmbG93J3Mgc2hhcmVkIHN0YXRlIHNvIG91dHB1dE1hcHBlciBjYW4gYWNjZXNzIGFsbCBzY29wZSB2YWx1ZXMgd3JpdHRlblxuICAgICAgICAvLyBkdXJpbmcgdGhlIHN1YmZsb3cuIFdlIHNoYWxsb3ctY2xvbmUgdG8gYXZvaWQgYWxpYXNpbmcgdGhlIGxpdmUgU2hhcmVkTWVtb3J5IGNvbnRleHQuXG4gICAgICAgIC8vIE5PVEU6IHRoZSBmdWxsIHNjb3BlIGlzIHBhc3NlZCAobm90IGp1c3QgZGVjbGFyZWQgb3V0cHV0cykg4oCUIG91dHB1dE1hcHBlciBtdXN0XG4gICAgICAgIC8vIGV4cGxpY2l0bHkgc2VsZWN0IHdoYXQgdG8gcHJvcGFnYXRlIHRvIHRoZSBwYXJlbnQuXG4gICAgICAgIC8vIFJlZGFjdGlvbjogYGFwcGx5T3V0cHV0TWFwcGluZ2Agd3JpdGVzIHRocm91Z2ggYG91dHB1dENvbnRleHRgIChhXG4gICAgICAgIC8vIFN0YWdlQ29udGV4dCwgbm90IGEgZmFjYWRlKS4gVGhlIGNvbnRleHQncyB3cml0ZSBmdW5uZWwgYXNrcyB0aGVcbiAgICAgICAgLy8gcnVuJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIHNoYXJlZCB3aXRoIHRoZSBzdWJmbG93J3MgY29udGV4dHMsIHNvIGEga2V5XG4gICAgICAgIC8vIHRoZSBwb2xpY3kgbmFtZXMgT1IgYSBrZXkgbWFya2VkIHBlci1jYWxsIGluc2lkZSB0aGUgc3ViZmxvdyBpc1xuICAgICAgICAvLyBzY3J1YmJlZCBpbiB0aGUgUEFSRU5UJ3MgbG9nIGFuZCBtaXJyb3IgdG9vICg5LjE5LjA7IGJlZm9yZSwgdGhpc1xuICAgICAgICAvLyBtZXJnZS1iYWNrIHJldGFpbmVkIHBsYWludGV4dCkuXG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZU91dHB1dCA9IHN1YmZsb3dPdXRwdXQgPz8geyAuLi5zdWJmbG93VHJlZUNvbnRleHQuc2hhcmVkU3RhdGUgfTtcbiAgICAgICAgY29uc3QgbWFwcGVkT3V0cHV0ID0gYXBwbHlPdXRwdXRNYXBwaW5nKFxuICAgICAgICAgIGVmZmVjdGl2ZU91dHB1dCxcbiAgICAgICAgICBwYXJlbnRTY29wZSxcbiAgICAgICAgICBvdXRwdXRDb250ZXh0LFxuICAgICAgICAgIG1vdW50T3B0aW9ucyxcbiAgICAgICAgICByZWRhY3Rpb25SdWxlLFxuICAgICAgICApO1xuXG4gICAgICAgIG91dHB1dENvbnRleHQuY29tbWl0KCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIC8vIEEgbWVyZ2UtYmFjayB0aGF0IGZhaWxlZCB0byBjb21taXQgKGFuIHVuY2xvbmVhYmxlIHZhbHVlKSBsZWF2ZXMgaXRzXG4gICAgICAgIC8vIHdyaXRlcyBzdGFnZWQgb24gdGhlIG1vdW50J3MgZnJhbWU7IHRoZSBtb3VudCdzIGV4aXQgY29tbWl0IGJlbG93XG4gICAgICAgIC8vIHdvdWxkIHRocm93IHRoZW0gYWdhaW4sIG91dHNpZGUgdGhpcyBjYXRjaC4gVGhyb3VnaCA5LjMzLjAgdGhleVxuICAgICAgICAvLyB3ZXJlIHN0YWdlZCBvbiB0aGUgcGFyZW50J3MgZnJhbWUsIHdoaWNoIHdhcyBub3QgY29tbWl0dGVkIGFnYWluLFxuICAgICAgICAvLyBzbyB0aGUgcnVuIHdlbnQgb24g4oCUIGRyb3AgdGhlbSwgYXMgaXQgZGlkLiBBIGxpbmVhciBtb3VudCdzIGZyYW1lXG4gICAgICAgIC8vIGlzIGxlZnQgYXMgaXQgYWx3YXlzIHdhcy5cbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQuYnJhbmNoSWQgJiYgcGFyZW50Q29udGV4dC5wYXJlbnQpIHBhcmVudENvbnRleHQuZGlzY2FyZFN0YWdlZCgpO1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdvdXRwdXRNYXBwZXJFcnJvcicsIHRocm93blRleHQoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gb3V0cHV0TWFwcGVyIGZvciBzdWJmbG93ICgke3N1YmZsb3dJZH0pOmAsIHtcbiAgICAgICAgICBlcnJvcjogbG9nZ2FibGVTdGFnZUVycm9yKHBhcmVudENvbnRleHQsIGVycm9yKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd1Jlc3VsdDogU3ViZmxvd1Jlc3VsdCA9IHtcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHN1YmZsb3dOYW1lLFxuICAgICAgdHJlZUNvbnRleHQ6IHtcbiAgICAgICAgZ2xvYmFsQ29udGV4dDogc3ViZmxvd1RyZWVDb250ZXh0LnNoYXJlZFN0YXRlLFxuICAgICAgICBzdGFnZUNvbnRleHRzOiBzdWJmbG93VHJlZUNvbnRleHQuZXhlY3V0aW9uVHJlZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICBoaXN0b3J5OiBzdWJmbG93VHJlZUNvbnRleHQuY29tbWl0TG9nLFxuICAgICAgICAuLi4oc3ViZmxvd1RyZWVDb250ZXh0LnJlYWRTb3VyY2VzICYmIHsgcmVhZFNvdXJjZXM6IHN1YmZsb3dUcmVlQ29udGV4dC5yZWFkU291cmNlcyB9KSxcbiAgICAgICAgLi4uKHN1YmZsb3dUcmVlQ29udGV4dC5sb2dBZGRyZXNzID09PSB1bmRlZmluZWQgPyB7fSA6IHsgbG9nQWRkcmVzczogc3ViZmxvd1RyZWVDb250ZXh0LmxvZ0FkZHJlc3MgfSksXG4gICAgICAgIC8vIFRoZSBzdWJmbG93J3Mgb3duIGZvbGQgYmFzZSB0cmF2ZWxzIHdpdGggaXRzIG93biBsb2cg4oCUIHNhbWVcbiAgICAgICAgLy8gY29udHJhY3QgYXMgdGhlIHJ1bi1sZXZlbCBgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZWAuXG4gICAgICAgIGluaXRpYWxTdGF0ZTogc3ViZmxvd1RyZWVDb250ZXh0LmluaXRpYWxTdGF0ZSxcbiAgICAgIH0sXG4gICAgICBwYXJlbnRTdGFnZUlkOiBwYXJlbnRDb250ZXh0LmdldFN0YWdlSWQoKSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc3ViZmxvd0RlZiA9IHRoaXMuZGVwcy5zdWJmbG93cz8uW3N1YmZsb3dJZF07XG4gICAgaWYgKHN1YmZsb3dEZWYgJiYgKHN1YmZsb3dEZWYgYXMgYW55KS5idWlsZFRpbWVTdHJ1Y3R1cmUpIHtcbiAgICAgIHN1YmZsb3dSZXN1bHQucGlwZWxpbmVTdHJ1Y3R1cmUgPSAoc3ViZmxvd0RlZiBhcyBhbnkpLmJ1aWxkVGltZVN0cnVjdHVyZTtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2VydmVkIHN0YXRlICg5LjIwLjApOiB0aGUgbmVzdGVkIG1pcnJvcidzIGZpbmFsIHN0YXRlLCByZW1lbWJlcmVkXG4gICAgLy8gQkVTSURFIHRoZSByZXN1bHQg4oCUIGB0cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0YCBzdGF5cyB0aGUgbGl2ZSBoZWFwIGZvclxuICAgIC8vIHRoZSBwbGFpbiBzbmFwc2hvdCBhbmQgdGhlIGNoZWNrcG9pbnQ7IGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWBcbiAgICAvLyBzdWJzdGl0dXRlcyB0aGUgbWlycm9yIHRocm91Z2ggYHNlcnZlZFN1YmZsb3dSZXN1bHRzYC4gQWJzZW50IHdpdGhvdXRcbiAgICAvLyBhIHBvbGljeS4gVGhlIGV4aXQgZXZlbnQgYmVsb3cgY2FycmllcyB0aGUgc2FtZSBzZXJ2ZWQgdmlldzsgd2l0aG91dCBhXG4gICAgLy8gbWlycm9yIGl0IGNhcnJpZXMgdGhlIGhlYXAgcmV0YWluZWQgdW5kZXIgdGhlIHJ1bGUgKHBlci1jYWxsIG1hcmtzXG4gICAgLy8gYWxvbmUga2VlcCBubyBtaXJyb3IpIOKAlCB0aGUgc2FtZSBvYmplY3Qgd2hlbiBub3RoaW5nIGlzIHJlZGFjdGVkLlxuICAgIGNvbnN0IHJhd1N0YXRlID0gc3ViZmxvd1Jlc3VsdC50cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0O1xuICAgIGNvbnN0IG1pcnJvclN0YXRlID0gbmVzdGVkUnVudGltZS5yZWRhY3RlZFN0b3JlPy5nZXRTdGF0ZSgpO1xuICAgIGlmIChtaXJyb3JTdGF0ZSAhPT0gdW5kZWZpbmVkKSByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlKHN1YmZsb3dSZXN1bHQsIG1pcnJvclN0YXRlKTtcbiAgICAvLyBIYW5kZWQgb3V0IHdob2xlLCBzbyBpdCBpcyBhIGJvdW5kYXJ5IHJlY29yZDogbmVzdGVkIHBvbGljeSBrZXlzIGFyZSBzY3J1YmJlZCB0b29cbiAgICAvLyAodGhlIG1pcnJvcidzIG93biBwbGFjZWhvbGRlciwgc28gaXRzIHRvcCBrZXlzIGtlZXAgdGhlaXIgYnl0ZXMpLlxuICAgIGNvbnN0IGV4aXRTdGF0ZSA9ICFyZWRhY3Rpb25SdWxlXG4gICAgICA/IG1pcnJvclN0YXRlID8/IHJhd1N0YXRlXG4gICAgICA6IG1pcnJvclN0YXRlICE9PSB1bmRlZmluZWRcbiAgICAgID8gcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeShtaXJyb3JTdGF0ZSwgTE9HX1BMQUNFSE9MREVSKVxuICAgICAgOiByZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5KHJhd1N0YXRlKTtcblxuICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChzdWJmbG93SWQsIHN1YmZsb3dSZXN1bHQpO1xuICAgIC8vIEFkZGl0aXZlIHBlci1leGVjdXRpb24ga2V5IChkZXNpZ246IGRvY3MvZGVzaWduL3N1YmZsb3ctY29tbWl0LXZpc2liaWxpdHkubWQpLiBBIExPT1BJTkdcbiAgICAvLyBzdWJmbG93IHJlLWVudGVycyB3aXRoIHRoZSBTQU1FIHN1YmZsb3dJZCwgc28gdGhlIHBhdGgga2V5IGFib3ZlIGlzIE9WRVJXUklUVEVOIGVhY2hcbiAgICAvLyBpdGVyYXRpb24gKGJhY2stY29tcGF0OiBpdCBob2xkcyB0aGUgTEFTVCBpdGVyYXRpb24g4oCUIHdoYXQgZ2V0U3VidHJlZVNuYXBzaG90L2xpc3RTdWJmbG93UGF0aHNcbiAgICAvLyBhbmQgdGhlIGV1aSBmYWxsYmFjayBzZWUsIHVuY2hhbmdlZCkuIEFMU08ga2V5IGJ5IHRoZSBtb3VudCdzIFVOSVFVRSBydW50aW1lU3RhZ2VJZCBzbyBFVkVSWVxuICAgIC8vIGl0ZXJhdGlvbidzIHJlc3VsdCBpcyByZXRhaW5lZCBhbmQgYWRkcmVzc2FibGUgKGV1aSBwZXItbG9vcCBkcmlsbC1kb3duLCBwZXItc2NvcGUgbG9jYWxpemF0aW9uKS5cbiAgICAvLyBydW50aW1lU3RhZ2VJZCBhbHdheXMgY29udGFpbnMgJyMnOyBzdWJmbG93SWQgbmV2ZXIgZG9lcyDigJQgc28gdGhleSBuZXZlciBjb2xsaWRlLCBhbmRcbiAgICAvLyBsaXN0U3ViZmxvd1BhdGhzIGZpbHRlcnMgJyMnIGtleXMgdG8ga2VlcCBpdHMgcGF0aC1vbmx5IGNvbnRyYWN0LiBUaGUgcGF1c2UgY2hlY2twb2ludCBmaWx0ZXJzXG4gICAgLy8gdGhlc2Ugb3V0IChidWlsZFBhdXNlQ2hlY2twb2ludCkgc28gaXQgc3RheXMgbGVhbi5cbiAgICBpZiAobW91bnRSdW50aW1lU3RhZ2VJZCAmJiBtb3VudFJ1bnRpbWVTdGFnZUlkICE9PSBzdWJmbG93SWQpIHtcbiAgICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChtb3VudFJ1bnRpbWVTdGFnZUlkLCBzdWJmbG93UmVzdWx0KTtcbiAgICB9XG5cbiAgICBwYXJlbnRDb250ZXh0LmFkZEZsb3dEZWJ1Z01lc3NhZ2UoJ3N1YmZsb3cnLCBgRXhpdGluZyAke3N1YmZsb3dOYW1lfSBzdWJmbG93YCwge1xuICAgICAgdGFyZ2V0U3RhZ2U6IHN1YmZsb3dJZCxcbiAgICB9KTtcbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3ViZmxvd0V4aXQoc3ViZmxvd05hbWUsIHN1YmZsb3dJZCwgcGFyZW50VHJhdmVyc2FsQ29udGV4dCwgZXhpdFN0YXRlKTtcblxuICAgIC8vIFRoZSBtb3VudCdzIEVYSVQg4oCUIGEgY29udGludWF0aW9uIG9mIHRoZSBtb3VudCdzIGV4ZWN1dGlvbiwgbmFtZWQgYXMgb25lXG4gICAgLy8gb24gdGhlIHJlY29yZCAoOS4zOS4wKSBzbyBubyByZWFkZXIgaW5mZXJzIGl0IGZyb20gdGhlIGxvZydzIHNoYXBlLlxuICAgIGNvbW1pdFN0YWdlV3JpdGVzKHBhcmVudENvbnRleHQsICdleGl0Jyk7XG5cbiAgICBpZiAoc3ViZmxvd0Vycm9yKSB7XG4gICAgICBwYXJlbnRDb250ZXh0LmZhaWx1cmVTdGF0ZS5hZG9wdChuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQuZmFpbHVyZVN0YXRlLCBzdWJmbG93RXJyb3IuZXJyb3IpO1xuICAgICAgdGhyb3cgc3ViZmxvd0Vycm9yLmVycm9yO1xuICAgIH1cblxuICAgIG5lc3RlZFJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dC5mYWlsdXJlU3RhdGUuY29tcGxldGUoKTtcblxuICAgIHJldHVybiBzdWJmbG93T3V0cHV0O1xuICB9XG59XG4iXX0=
431
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViZmxvd0V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9lbmdpbmUvaGFuZGxlcnMvU3ViZmxvd0V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFHSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUc3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFVckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFckQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHNUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxLQUE4QjtJQUN2RCxJQUFJLEdBQXdDLENBQUM7SUFDN0MsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUFFLFNBQVM7UUFDbkMsQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFDRCxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUM7QUFDdEIs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Q0FBQyxLQUFLLENBQUMsQ0FBQztZQUNsRyxNQUFNLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDM0IsQ0FBQztRQUVELGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFdkQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdWJmbG93RXhlY3V0b3Ig4oCUIElzb2xhdGlvbiBib3VuZGFyeSBmb3Igc3ViZmxvdyBleGVjdXRpb24uXG4gKlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gQ3JlYXRlIGlzb2xhdGVkIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIGVhY2ggc3ViZmxvd1xuICogLSBBcHBseSBpbnB1dC9vdXRwdXQgbWFwcGluZyB2aWEgU3ViZmxvd0lucHV0TWFwcGVyXG4gKiAtIERlbGVnYXRlIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAqIC0gVHJhY2sgc3ViZmxvdyByZXN1bHRzIGZvciBkZWJ1Z2dpbmcvdmlzdWFsaXphdGlvblxuICpcbiAqIEVhY2ggc3ViZmxvdyBnZXRzIGl0cyBvd24gR2xvYmFsU3RvcmUgZm9yIGlzb2xhdGlvbi5cbiAqIFRyYXZlcnNhbCB1c2VzIHRoZSBTQU1FIDctcGhhc2UgYWxnb3JpdGhtIGFzIHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2VyXG4gKiAodmlhIFN1YmZsb3dUcmF2ZXJzZXJGYWN0b3J5KSwgc28gZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGxhenkgc3ViZmxvd3MsXG4gKiBhbmQgYWJvcnQgc2lnbmFscyBhbGwgd29yayBpbnNpZGUgc3ViZmxvd3MgYXV0b21hdGljYWxseS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExvZ0FkZHJlc3MgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHsgTE9HX1BMQUNFSE9MREVSIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcblxuaW1wb3J0IHsgdGhyb3duVGV4dCB9IGZyb20gJy4uLy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgY2hpbGRMb2dBZGRyZXNzIH0gZnJvbSAnLi4vLi4vbWVtb3J5L2xvZ0FkZHJlc3MuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5Qb2xpY3kgfSBmcm9tICcuLi8uLi9tZW1vcnkvcnVuUG9saWN5LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZU5vZGUgfSBmcm9tICcuLi9ncmFwaC9TdGFnZU5vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHtcbiAgSGFuZGxlckRlcHMsXG4gIElFeGVjdXRpb25SdW50aW1lLFxuICBTdWJmbG93UmVzdWx0LFxuICBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeSxcbiAgU3ViZmxvd1RyYXZlcnNlckhhbmRsZSxcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgY29tbWl0U3RhZ2VXcml0ZXMgfSBmcm9tICcuL2NvbW1pdFN0YWdlLmpzJztcbmltcG9ydCB0eXBlIHsgUmVzdW1lRW50cnkgfSBmcm9tICcuL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB7IHJlbWVtYmVyUmVkYWN0ZWRTdWJmbG93U3RhdGUgfSBmcm9tICcuL3NlcnZlZFN1YmZsb3dSZXN1bHRzLmpzJztcbmltcG9ydCB7IGxvZ2dhYmxlU3RhZ2VFcnJvciB9IGZyb20gJy4vc3RhZ2VFcnJvci5qcyc7XG5pbXBvcnQgeyBhcHBseU91dHB1dE1hcHBpbmcsIGdldEluaXRpYWxTY29wZVZhbHVlcywgc2VlZFN1YmZsb3dHbG9iYWxTdG9yZSB9IGZyb20gJy4vU3ViZmxvd0lucHV0TWFwcGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQnJlYWtGbGFnIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogVGhlIG1hcHBlZCBpbnB1dCwgZGV0YWNoZWQgZnJvbSB0aGUgcGFyZW50J3Mgc3RhdGUgT05DRSBwZXIgbW91bnQgKEQxLFxuICogOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKS5cbiAqXG4gKiBUaGUgaW5wdXRNYXBwZXIgcmVhZHMgdGhlIHBhcmVudCdzIExJVkUgc3RhdGUgKGBnZXRTY29wZSgpYCksIHNvIGEgdmFsdWUgaXRcbiAqIHBhc3NlcyB0aHJvdWdoIChgKHApID0+ICh7IGNmZzogcC5jZmcgfSlgKSBpcyB0aGUgcGFyZW50J3MgY29tbWl0dGVkXG4gKiBvYmplY3Qg4oCUIGFuZCB0aGUgc3ViZmxvdydzIGFyZ3MgYXJlIGRlZXAtRlJPWkVOIGluIHBsYWNlXG4gKiAoYHJlYWRvbmx5SW5wdXQgwrcgY3JlYXRlRnJvemVuQXJnc2ApLiBUaGUgdHlwZWQgc2NvcGUgZG9lcyBub3QgcHJveHkgYVxuICogZnJvemVuIHZhbHVlIChgYWxsb3dsaXN0IMK3IHNob3VsZFdyYXBXaXRoUHJveHlgKSwgc28gYSBsYXRlclxuICogYHNjb3BlLmNmZy54ID0gMWAgaW4gdGhlIHBhcmVudCBtZXQgdGhlIHJhdyBmcm96ZW4gb2JqZWN0OiBhIFR5cGVFcnJvciBpblxuICogc3RyaWN0IGNvZGUuIEJlZm9yZSA5LjI5LjAgdGhlIHBhcmVudCdzIG5leHQgd2hvbGUtc3RhdGUgY2xvbmUgcmVwbGFjZWQgdGhlXG4gKiBmcm96ZW4gb2JqZWN0IChhIG1vdW50IHRoYXQgY29tbWl0dGVkIG5vdGhpbmcgbGVmdCBpdCBpbiBwbGFjZSDigJQgdGhlIGJ1Z1xuICogZXhpc3RlZCwgaXQgd2FzIG9ubHkgc2hvcnQtbGl2ZWQpOyB1bmRlciBjb3B5LW9uLXdyaXRlIG5vdGhpbmcgcmUtY2xvbmVzLFxuICogc28gdGhlIGZyZWV6ZSB3b3VsZCBsYXN0IHVudGlsIHRoZSBrZXkgaXMgcmV3cml0dGVuLiBBIG1vdW50IG11c3QgbmV2ZXJcbiAqIGVkaXQg4oCUIG9yIGZyZWV6ZSDigJQgdGhlIHBhcmVudCdzIGNvbW1pdHRlZCBvYmplY3RzOiBldmVyeSBwbGFpbiBvYmplY3QsXG4gKiBhcnJheSwgYERhdGVgLCBgTWFwYCBhbmQgYFNldGAgdGhlIG1hcHBlciByZXR1cm5zIGlzIGNsb25lZCBoZXJlLCBiZWZvcmUgaXRcbiAqIGJlY29tZXMgdGhlIGFyZ3MuIEEgY2xhc3MgaW5zdGFuY2UgcGFzc2VzIGJ5IHJlZmVyZW5jZSwgYXMgYmVmb3JlIChpdFxuICogY2Fubm90IGNvbWUgZnJvbSBjb21taXR0ZWQgc3RhdGUsIGFuZCBhIGNsb25lIHdvdWxkIGRyb3AgaXRzIHByb3RvdHlwZSkuXG4gKiBUaGUgc2VlZCBpcyBjbG9uZWQgYWdhaW4gYXQgaXRzIGNvbW1pdCwgc28gdGhlIHN1YmZsb3cncyBzdGF0ZSBpc1xuICogdW5jaGFuZ2VkLlxuICovXG5mdW5jdGlvbiBkZXRhY2hNYXBwZWRJbnB1dChpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICBpZiAoIWlzRGV0YWNoYWJsZSh2YWx1ZSkpIGNvbnRpbnVlO1xuICAgIChvdXQgPz89IHsgLi4uaW5wdXQgfSlba2V5XSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIG91dCA/PyBpbnB1dDtcbn1cblxuLyoqIEEgdmFsdWUgYHN0cnVjdHVyZWRDbG9uZWAgcmVwcm9kdWNlcyB3aXRoIGl0cyBvd24gdHlwZTogcGxhaW4gb2JqZWN0LCBhcnJheSwgYERhdGVgLCBgTWFwYCwgYFNldGAuICovXG5mdW5jdGlvbiBpc0RldGFjaGFibGUodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSB8fCB2YWx1ZSBpbnN0YW5jZW9mIE1hcCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFNldCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgU3ViZmxvd0V4ZWN1dG9yPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChgZGVwcy5yZXN1bWVgKS4gVW5kZWZpbmVkIG9uIGEgbm9ybWFsXG4gICAqIHJ1bi4gQXNrZWQgb25jZSBwZXIgc3ViZmxvdyBlbnRyeSDigJQgc2VlIHtAbGluayBSZXN1bWVFbnRyeX0uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc3VtZTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlcHM6IEhhbmRsZXJEZXBzPFRPdXQsIFRTY29wZT4sXG4gICAgcHJpdmF0ZSB0cmF2ZXJzZXJGYWN0b3J5OiBTdWJmbG93VHJhdmVyc2VyRmFjdG9yeTxUT3V0LCBUU2NvcGU+LFxuICApIHtcbiAgICB0aGlzLnJlc3VtZSA9IGRlcHMucmVzdW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzdWJmbG93IHdpdGggaXNvbGF0ZWQgY29udGV4dC5cbiAgICpcbiAgICogMS4gQ3JlYXRlcyBhIGZyZXNoIEV4ZWN1dGlvblJ1bnRpbWUgZm9yIHRoZSBzdWJmbG93XG4gICAqIDIuIEFwcGxpZXMgaW5wdXQgbWFwcGluZyB0byBzZWVkIHRoZSBzdWJmbG93J3MgR2xvYmFsU3RvcmVcbiAgICogMy4gRGVsZWdhdGVzIHRyYXZlcnNhbCB0byBhIGZhY3RvcnktY3JlYXRlZCBGbG93Y2hhcnRUcmF2ZXJzZXJcbiAgICogNC4gQXBwbGllcyBvdXRwdXQgbWFwcGluZyB0byB3cml0ZSByZXN1bHRzIGJhY2sgdG8gcGFyZW50IHNjb3BlXG4gICAqIDUuIFN0b3JlcyBleGVjdXRpb24gZGF0YSBmb3IgZGVidWdnaW5nL3Zpc3VhbGl6YXRpb25cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJmbG93KFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHBhcmVudENvbnRleHQ6IFN0YWdlQ29udGV4dCxcbiAgICBicmVha0ZsYWc6IEJyZWFrRmxhZyxcbiAgICBicmFuY2hQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3ViZmxvd1Jlc3VsdHNNYXA6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+LFxuICAgIHBhcmVudFRyYXZlcnNhbENvbnRleHQ/OiBUcmF2ZXJzYWxDb250ZXh0LFxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHN1YmZsb3dJZCA9IG5vZGUuc3ViZmxvd0lkITtcbiAgICBjb25zdCBzdWJmbG93TmFtZSA9IG5vZGUuc3ViZmxvd05hbWUgPz8gbm9kZS5uYW1lO1xuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEVudGVyaW5nICR7c3ViZmxvd05hbWV9IHN1YmZsb3dgLCB7XG4gICAgICB0YXJnZXRTdGFnZTogc3ViZmxvd0lkLFxuICAgIH0pO1xuXG4gICAgLy8g4pSA4pSA4pSAIFJlc3VtZSByZS1lbnRyeSAob25lLXNob3QpIOKUgOKUgOKUgFxuICAgIC8vXG4gICAgLy8gV2hlbiB0aGlzIGVudHJ5IGlzIHRoZSByZXN1bWUncyB3YXkgYmFjayBpbnRvIGEgcGF1c2VkIHN1YmZsb3csIHRoZVxuICAgIC8vIGhvcCBuYW1lcyB3aGVyZSB0aGUgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgKHRoZSBuZXh0IG1vdW50IG9uIHRoZVxuICAgIC8vIHBhdXNlIHBhdGgsIG9yIHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiksIGNhcnJpZXMgdGhlIHN1YmZsb3cnc1xuICAgIC8vIGNhcHR1cmVkIHByZS1wYXVzZSBzdGF0ZSwgYW5kIGFueSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIGluIGl0LiBUYWtlblxuICAgIC8vIE9OQ0U6IGFueSBsYXRlciBlbnRyeSBpbnRvIHRoaXMgc3ViZmxvdyDigJQgYSBsb29wIHBhc3NpbmcgaXRzIG1vdW50XG4gICAgLy8gYWdhaW4g4oCUIGdldHMgYHVuZGVmaW5lZGAgYW5kIHJ1bnMgdGhlIHJlYWwgc3ViZmxvdyBmcm9tIGl0cyByZWFsIHJvb3QsXG4gICAgLy8gaW5wdXRNYXBwZXIgYW5kIGFsbC5cbiAgICBjb25zdCByZXN1bWVIb3AgPSB0aGlzLnJlc3VtZT8uZW50ZXJTdWJmbG93KHN1YmZsb3dJZCk7XG5cbiAgICAvLyDilIDilIDilIAgSW5wdXQgTWFwcGluZyDilIDilIDilIBcbiAgICAvL1xuICAgIC8vIFRoZSBtYXBwZXIgcnVucyBvbiBFVkVSWSBlbnRyeTogaXRzIHJlc3VsdCBpcyB0aGUgc3RhZ2VzJyByZWFkLW9ubHlcbiAgICAvLyBhcmdzIChgJGdldEFyZ3MoKWApLCBhbmQgYSByZS1lbnRlcmVkIHN1YmZsb3cncyBzdGFnZXMgcmVhZCB0aGUgc2FtZVxuICAgIC8vIGFyZ3MgdGhleSByZWFkIGJlZm9yZSB0aGUgcGF1c2UgKHRoZSBwYXJlbnQncyB2aWV3IGlzIHRoZSBzYW1lIG9uZSDigJRcbiAgICAvLyBpdCB3YXMgYmxvY2tlZCBpbiB0aGlzIG1vdW50KS4gV2hhdCBhIHJlc3VtZSBjaGFuZ2VzIGlzIG9ubHkgdGhlIFNFRUQ6XG4gICAgLy8gd2hlbiB0aGUgaG9wIGNhcnJpZXMgYSBjYXB0dXJlLCB0aGUgbmVzdGVkIG1lbW9yeSBpcyBzZWVkZWQgZnJvbSB0aGVcbiAgICAvLyBjYXB0dXJlLCBub3QgZnJvbSB0aGUgbWFwcGVyIOKAlCB0aGUgY2FwdHVyZSBpcyB0aGUgcG9zdC1pbnB1dCBwcmUtcGF1c2VcbiAgICAvLyBtZW1vcnksIGFuZCBzZWVkaW5nIHRoZSBtYXBwZXIncyB2YWx1ZXMgd291bGQgY2xvYmJlciBwb3N0LWlucHV0XG4gICAgLy8gd3JpdGVzIChoaXN0b3J5LCBwYXVzZWRUb29sQ2FsbElkLCBldGMuKSB3aXRoIHRoZSBzdGFydC1vZi1zdWJmbG93IHZpZXcuXG4gICAgY29uc3QgbW91bnRPcHRpb25zID0gbm9kZS5zdWJmbG93TW91bnRPcHRpb25zO1xuICAgIGxldCBtYXBwZWRJbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBjb25zdCByZXN1bWVDYXB0dXJlID0gcmVzdW1lSG9wPy5zZWVkO1xuICAgIGNvbnN0IGlzUmVzdW1lRm9yVGhpc1N1YmZsb3cgPSByZXN1bWVDYXB0dXJlICE9PSB1bmRlZmluZWQ7XG5cbiAgICAvLyBUaGUgcnVuJ3MgcG9saWN5IChGNSkg4oCUIHRoZSBmb3VyIGRpYWxzLCB0aGUgcmVkYWN0aW9uIHJ1bGUsIHRoZSBtaXJyb3JcbiAgICAvLyBmbGFnIOKAlCByZWFkIG9mZiB0aGUgcGFyZW50LW1vdW50IGZyYW1lLCB3aGljaCBob2xkcyBpdCBieSByZWZlcmVuY2UuXG4gICAgLy8gVGhlIG5lc3RlZCBydW50aW1lIGlzIGNvbnN0cnVjdGVkIFdJVEggaXQsIHNvIHRoZSBzZWVkIGNvbW1pdCBiZWxvd1xuICAgIC8vIChgaGlzdG9yeVswXWApIGFuZCBldmVyeSBsYXRlciBjb21taXQgb2YgdGhlIHN1YmZsb3cgcnVuIHVuZGVyIHRoZSBzYW1lXG4gICAgLy8gb2JqZWN0LCBhbmQgdGhlIG5lc3RlZCBydW50aW1lIGtlZXBzIGEgbWlycm9yIG9mIGl0cyBvd24gZXhhY3RseSB3aGVuXG4gICAgLy8gdGhlIHJ1biBkb2VzIChpdHMgU0VSVkVEIHN0YXRlIGlzIHRoZW4gdGhlIGZvbGQgb2YgaXRzIG93biBzY3J1YmJlZFxuICAgIC8vIGxvZywgbmV2ZXIgYSBzZWNvbmQgc2NydWIpLlxuICAgIGNvbnN0IHBvbGljeTogUnVuUG9saWN5ID0gcGFyZW50Q29udGV4dC5nZXRQb2xpY3koKTtcbiAgICBjb25zdCByZWRhY3Rpb25SdWxlID0gcG9saWN5LnJlZGFjdGlvbjtcblxuICAgIGlmIChtb3VudE9wdGlvbnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcmVudFNjb3BlID0gcGFyZW50Q29udGV4dC5nZXRTY29wZSgpO1xuICAgICAgICAvLyBUaGUgcnVsZSByaWRlcyBhbG9uZzogYSBrZXkgdGhlIG1hcHBlciBjb3BpZXMgYSBzZWxlY3RlZCB2YWx1ZSBpbnRvXG4gICAgICAgIC8vIGluaGVyaXRzIGl0cyByZWRhY3Rpb24gYmVmb3JlIHRoZSBzZWVkIGlzIHdyaXR0ZW4gKHRoZSB0YWludCBydWxlKS5cbiAgICAgICAgbWFwcGVkSW5wdXQgPSBkZXRhY2hNYXBwZWRJbnB1dChnZXRJbml0aWFsU2NvcGVWYWx1ZXMocGFyZW50U2NvcGUsIG1vdW50T3B0aW9ucywgcmVkYWN0aW9uUnVsZSkpO1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFwcGVkSW5wdXQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBtYXBwZWRJbnB1dCBpcyBjYXB0dXJlZCBpbiBTdWJmbG93UmVzdWx0LnRyZWVDb250ZXh0IGZvciBkZWJ1Z2dpbmdcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICBwYXJlbnRDb250ZXh0LmFkZEVycm9yKCdpbnB1dE1hcHBlckVycm9yJywgdGhyb3duVGV4dChlcnJvcikpO1xuICAgICAgICB0aGlzLmRlcHMubG9nZ2VyLmVycm9yKGBFcnJvciBpbiBpbnB1dE1hcHBlciBmb3Igc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7XG4gICAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihwYXJlbnRDb250ZXh0LCBlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOYXJyYXRpdmUgcmVjZWl2ZXMgdGhlIFJFVEFJTkVEIGZvcm0gb2YgdGhlIG1hcHBlZCBpbnB1dCDigJQgYW5cbiAgICAvLyBpbnB1dE1hcHBlciBtYXkgaW5qZWN0IHZhbHVlcyBmcm9tIGFueXdoZXJlLCBzbyB0aGUgc2VlZCBpcyBzY3J1YmJlZFxuICAgIC8vIHVuZGVyIHRoZSBwb2xpY3kgYmVmb3JlIGFueSByZWNvcmRlciBzZWVzIGl0LiBTYW1lIG9iamVjdCB3aGVuIG5vdGhpbmdcbiAgICAvLyBpbiBpdCBpcyByZWRhY3RlZCAodGhlIG5vLXBvbGljeSBwYXRoIGFsbG9jYXRlcyBub3RoaW5nKS5cbiAgICBjb25zdCBuYXJyYXRpdmVJbnB1dCA9IHJlZGFjdGlvblJ1bGUgPyByZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5KG1hcHBlZElucHV0KSA6IG1hcHBlZElucHV0O1xuICAgIC8vIGBGbG93U3ViZmxvd0V2ZW50LmRlc2NyaXB0aW9uYCBpcyBzZW1hbnRpY2FsbHkgXCJ3aGF0IHRoaXMgc3ViZmxvdyBkb2VzXCIg4oCUIHNvdXJjZWQgZnJvbVxuICAgIC8vIHRoZSBzdWJmbG93J3Mgb3duIHJvb3Qgc3RhZ2UsIG5vdCB0aGUgcGFyZW50IG1vdW50IHBvaW50LiBUaGUgbW91bnQgbm9kZSBuZXZlciBjYXJyaWVzXG4gICAgLy8gYSBkZXNjcmlwdGlvbiAoYnVpbGRlcnMgZG9uJ3QgY29weSBpdCksIHNvIHJlYWRpbmcgYG5vZGUuZGVzY3JpcHRpb25gIGhlcmUgcmV0dXJuc1xuICAgIC8vIGB1bmRlZmluZWRgIGFuZCB0YXhvbm9teSBtYXJrZXJzIHNldCBvbiB0aGUgc3ViZmxvdyByb290IChlLmcuIGFnZW50Zm9vdHByaW50J3NcbiAgICAvLyBgJ0FnZW50OiBSZUFjdCBsb29wJ2AgLyBgJ0xMTUNhbGw6IG9uZS1zaG90J2ApIG5ldmVyIHJlYWNoIGRvd25zdHJlYW0gY29uc3VtZXJzLlxuICAgIGNvbnN0IHJvb3REZXNjcmlwdGlvbiA9IHRoaXMuZGVwcy5zdWJmbG93cz8uW3N1YmZsb3dJZF0/LnJvb3Q/LmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25TdWJmbG93RW50cnkoXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHN1YmZsb3dJZCxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgIG5hcnJhdGl2ZUlucHV0LFxuICAgICk7XG4gICAgLy8gUHJvcG9zYWwgIzAwMzogZmlyZSBvblN0YWdlRXhlY3V0ZWQgZm9yIHRoZSBtb3VudCBub2RlIEFGVEVSXG4gICAgLy8gb25TdWJmbG93RW50cnkgc28gY29uc3VtZXJzIHRyYWNraW5nIFwiZGlkIHRoaXMgc3RhZ2UgcnVuXCIgd29ya1xuICAgIC8vIHVuaWZvcm1seSBhY3Jvc3MgbGluZWFyIC8gZGVjaWRlciAvIGZvcmsgLyBzZWxlY3RvciAvIHN1YmZsb3ctbW91bnQuXG4gICAgLy8gRmlyZXMgb24gRU5UUlkgKG5vdCBleGl0KSDigJQgZW50cnkgPSBcInRoaXMgbW91bnQgcmFuXCI7IHRoZVxuICAgIC8vIHN1YmZsb3cncyBjaGlsZHJlbiBleGVjdXRlIGFmdGVyIGFzIHNlcGFyYXRlIHN0YWdlcy5cbiAgICB0aGlzLmRlcHMubmFycmF0aXZlR2VuZXJhdG9yLm9uU3RhZ2VFeGVjdXRlZChcbiAgICAgIG5vZGUubmFtZSxcbiAgICAgIHJvb3REZXNjcmlwdGlvbiA/PyBub2RlLmRlc2NyaXB0aW9uLFxuICAgICAgcGFyZW50VHJhdmVyc2FsQ29udGV4dCxcbiAgICAgICdzdWJmbG93LW1vdW50JyxcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGlzb2xhdGVkIHJ1bnRpbWUgdmlhIGR5bmFtaWMgY29uc3RydWN0aW9uIChhdm9pZHMgY2lyY3VsYXIgaW1wb3J0KS5cbiAgICAvLyBJdHMgcm9vdCBjb250ZXh0IGlzIHRoZSBmaXJzdCBzdGFnZSB0aGUgc3ViZmxvdyB0cmF2ZXJzYWwgcnVucyDigJQgdGhlXG4gICAgLy8gcmVzdW1lIGhvcCdzIGVudHJ5IG9uIGEgcmUtZW50cnksIHRoZSBzdWJmbG93J3Mgcm9vdCBvdGhlcndpc2UuXG4gICAgY29uc3QgRXhlY3V0aW9uUnVudGltZUNsYXNzID0gdGhpcy5kZXBzLmV4ZWN1dGlvblJ1bnRpbWUuY29uc3RydWN0b3IgYXMgbmV3IChcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIGlkOiBzdHJpbmcsXG4gICAgICBkZWZhdWx0VmFsdWVzOiB1bmRlZmluZWQsXG4gICAgICBpbml0aWFsU3RhdGU6IHVuZGVmaW5lZCxcbiAgICAgIHBvbGljeTogUnVuUG9saWN5LFxuICAgICAgcmVjb3JkPzogdW5rbm93bixcbiAgICAgIHNvdXJjZT86IHtcbiAgICAgICAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZztcbiAgICAgICAgcmVhZG9ubHkgYWRkcmVzcz86IExvZ0FkZHJlc3M7XG4gICAgICAgIHJlYWRvbmx5IHVuYXZhaWxhYmxlPzogJ2NoaWxkLXNvdXJjZS1vd25lcnNoaXAnO1xuICAgICAgICByZWFkb25seSBoaXN0b3J5T21pdHRlZD86IGJvb2xlYW47XG4gICAgICB9LFxuICAgICkgPT4gSUV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgY29uc3QgZmlyc3ROb2RlID0gcmVzdW1lSG9wPy5lbnRyeSA/PyBub2RlO1xuICAgIC8vIFRoZSBjcmFzaC1zYWZlIHJlY29yZCAoMTAuMSwgUDYpOiB3aGVuIHRoZSBydW4gd3JpdGVzIHRvIGEgc2luaywgdGhlIG1vdW50J3Mgb3duIGxvZyBkb2VzIHRvbywgYXQgdGhlXG4gICAgLy8gcGFyZW50IGxvZydzIGFkZHJlc3MgcGx1cyB0aGlzIG1vdW50J3MgcnVudGltZVN0YWdlSWQg4oCUIG9wZW5lZCBoZXJlLCBpdHMgc2VlZCBhbmQgZXZlcnkgY29tbWl0IGFzIHRoZXkgbGFuZCxcbiAgICAvLyBjbG9zZWQgYXQgdGhlIG1vdW50J3MgZXhpdCAob3IgaXRzIHBhdXNlLCBvciBpdHMgZmFpbHVyZSkuIFdpdGhvdXQgYSBzaW5rOiB1bmRlZmluZWQsIHRoZSBwbGFpbiBsb2cuXG4gICAgY29uc3QgbW91bnRSdW50aW1lU3RhZ2VJZCA9IHBhcmVudFRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkO1xuICAgIGNvbnN0IHBhcmVudExvZ0FkZHJlc3MgPSB0aGlzLmRlcHMuZXhlY3V0aW9uUnVudGltZS5leGVjdXRpb25IaXN0b3J5LmFkZHJlc3M7XG4gICAgLy8gSWRlbnRpdHkgZm9sbG93cyB0aGUgc2FtZSBuYXRpdmUgbG9nIGFkZHJlc3MgYXMgc3RvcmFnZSwgZXZlbiBmb3IgYW4gaW4tbWVtb3J5IGNoaWxkLlxuICAgIC8vIEEgbWlzc2luZyBuYXRpdmUgcGFyZW50L21vdW50IGlkZW50aXR5IGNhbm5vdCBiZSByZXBsYWNlZCB3aXRoIGEgcGF0aC9uYW1lIGd1ZXNzLlxuICAgIGNvbnN0IHNvdXJjZUFkZHJlc3MgPSBwb2xpY3kucmVhZFNvdXJjZXMgPyBjaGlsZExvZ0FkZHJlc3MocGFyZW50TG9nQWRkcmVzcywgbW91bnRSdW50aW1lU3RhZ2VJZCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVjb3JkID1cbiAgICAgIG1vdW50UnVudGltZVN0YWdlSWQgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IHRoaXMuZGVwcy5leGVjdXRpb25SdW50aW1lLnJlY29yZEZvcj8uKG1vdW50UnVudGltZVN0YWdlSWQsIHsgc3ViZmxvd0lkIH0pO1xuICAgIGNvbnN0IG5lc3RlZFJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZUNsYXNzKFxuICAgICAgZmlyc3ROb2RlLm5hbWUsXG4gICAgICBmaXJzdE5vZGUuaWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBwb2xpY3ksXG4gICAgICByZWNvcmQsXG4gICAgICBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0Py5ydW5JZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHJ1bklkOiBwYXJlbnRUcmF2ZXJzYWxDb250ZXh0LnJ1bklkLFxuICAgICAgICAgICAgLi4uKHNvdXJjZUFkZHJlc3MgPyB7IGFkZHJlc3M6IHNvdXJjZUFkZHJlc3MgfSA6IHsgdW5hdmFpbGFibGU6ICdjaGlsZC1zb3VyY2Utb3duZXJzaGlwJyBhcyBjb25zdCB9KSxcbiAgICAgICAgICAgIC4uLihpc1Jlc3VtZUZvclRoaXNTdWJmbG93ICYmIHsgaGlzdG9yeU9taXR0ZWQ6IHRydWUgfSksXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICApO1xuXG4gICAgLy8gU2VlZCBHbG9iYWxTdG9yZSB3aXRoIHRoZSByaWdodCBzaGFwZSBmb3IgdGhlIHBhdGg6XG4gICAgLy8gICDigKIgUmVzdW1lIGludG8gVEhJUyBzdWJmbG93IOKGkiBzZWVkIGZyb20gdGhlIGNhcHR1cmVkIHByZS1wYXVzZVxuICAgIC8vICAgICBzY29wZSBzbyByZXN1bWUgaGFuZGxlcnMgc2VlIGhpc3RvcnksIHBhdXNlZFRvb2xDYWxsSWQsIGV0Yy5cbiAgICAvLyAgICAgKGBtYXBwZWRJbnB1dGAgc3RpbGwgcmVhY2hlcyB0aGUgc3RhZ2VzLCBhcyB0aGVpciByZWFkLW9ubHkgYXJncy4pXG4gICAgLy8gICDigKIgTm9ybWFsIGVudHJ5IOKGkiBzZWVkIGZyb20gdGhlIGlucHV0TWFwcGVyJ3MgbWFwcGVkSW5wdXQuXG4gICAgY29uc3Qgc2VlZFZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBpc1Jlc3VtZUZvclRoaXNTdWJmbG93ID8gcmVzdW1lQ2FwdHVyZSEgOiBtYXBwZWRJbnB1dDtcbiAgICBpZiAoT2JqZWN0LmtleXMoc2VlZFZhbHVlcykubGVuZ3RoID4gMCkge1xuICAgICAgLy8gVGhlIHNlZWQgaXMgY29tbWl0dGVkIGFzIHRoZSBzdWJmbG93J3MgYGhpc3RvcnlbMF1gIGJ5IGl0cyByb290XG4gICAgICAvLyBjb250ZXh0LCBub3QgYnkgYSBmYWNhZGUg4oCUIHRoYXQgZnJhbWUgYWxyZWFkeSBob2xkcyB0aGUgcnVuJ3MgcG9saWN5XG4gICAgICAvLyAodGhlIHJ1bnRpbWUgd2FzIGNvbnN0cnVjdGVkIHdpdGggaXQpLCBzbyB0aGUgc2VlZCByZXRhaW5zIHVuZGVyIHRoZVxuICAgICAgLy8gcnVsZSwgbGFuZHMgaW4gdGhlIG1pcnJvciBhcyB0aGUgcGxhY2Vob2xkZXIsIGFuZCBjb21taXRzIHVuZGVyIHRoZVxuICAgICAgLy8gcnVuJ3MgZGlhbHMgbGlrZSBldmVyeSBvdGhlciB3cml0ZSAoQy1GNTogdW5kZXIgYHdyaXRlUHJvdmVuYW5jZTpcbiAgICAgIC8vICdyZWFkcy1wcmVmaXgnYCBpdHMgcm93cyBjYXJyeSBgcmVhZEtleXM6IFtdYCkuXG4gICAgICAvLyBUaGUgc2VlZCBpcyB0aGUgbW91bnQncyBhY3QgdG9vOiBpdHMgYnVuZGxlIOKAlCBgaGlzdG9yeVswXWAgb2YgdGhlXG4gICAgICAvLyBzdWJmbG93J3Mgb3duIGxvZyDigJQgY2FycmllcyB0aGUgbW91bnQncyBzdGFnZSwgc3RhZ2VJZCBhbmRcbiAgICAgIC8vIHJ1bnRpbWVTdGFnZUlkIChSMTM7IHRocm91Z2ggOS4zMy4wIGl0IGNhcnJpZWQgcnVudGltZVN0YWdlSWQgJycgYW5kXG4gICAgICAvLyB0aGUgZmlyc3Qgc3RhZ2UncyBuYW1lcywgd2hpY2ggb24gYSByZXN1bWUgd2FzIHRoZSByZS1lbnRyeSBwb2ludCkuXG4gICAgICB0cnkge1xuICAgICAgICBzZWVkU3ViZmxvd0dsb2JhbFN0b3JlKG5lc3RlZFJ1bnRpbWUsIHNlZWRWYWx1ZXMsIHBhcmVudENvbnRleHQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gVGhlIG1vdW50J3Mgb3duIGxvZyBvcGVuZWQgYWJvdmU6IGEgc2VlZCB0aGF0IGZhaWxzIGNsb3NlcyBpdCwgbmV2ZXIgbGVhdmVzIGl0IGxvb2tpbmcgY3Jhc2hlZC5cbiAgICAgICAgbmVzdGVkUnVudGltZS5jbG9zZVJlY29yZD8uKCdmYWlsZWQnKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICAvLyBSZWZyZXNoIHJvb3RTdGFnZUNvbnRleHQgc28gV3JpdGVCdWZmZXIgc2VlcyBjb21taXR0ZWQgZGF0YS4gTmFtZWRcbiAgICAgIC8vIGFmdGVyIHRoZSBmaXJzdCBub2RlIGFnYWluIOKAlCB0aGUgc2VlZCBjb250ZXh0IG5vdyBjYXJyaWVzIHRoZSBtb3VudCdzXG4gICAgICAvLyBuYW1lcyAoUjEzKSwgd2hpY2ggYmVsb25nIHRvIHRoZSBzZWVkIGJ1bmRsZSBvbmx5LiBgbmV3Um9vdGAgZ2l2ZXMgaXRcbiAgICAgIC8vIHRoZSBzYW1lIHBvbGljeSBhbmQgbWlycm9yLlxuICAgICAgbmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0ID0gbmVzdGVkUnVudGltZS5uZXdSb290KGZpcnN0Tm9kZS5uYW1lLCBmaXJzdE5vZGUuaWQpO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgc3ViZmxvdyByb290IG5vZGUg4oCUIHN0cmlwIGlzU3ViZmxvd1Jvb3QgdG8gcHJldmVudCByZS1kZWxlZ2F0aW9uLlxuICAgIC8vXG4gICAgLy8gUFJFU0VSVkUgYG5leHRgLiBFYXJsaWVyIHJldmlzaW9ucyBzdHJpcHBlZCBgbmV4dGAgd2hlbmV2ZXIgdGhlXG4gICAgLy8gc3ViZmxvdyByb290IGhhZCBjaGlsZHJlbiwgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBgbmV4dGAgd2FzXG4gICAgLy8gYWx3YXlzIHRoZSBPVVRFUiBtb3VudCdzIGNvbnRpbnVhdGlvbiBsZWFraW5nIGludG8gdGhlIGlubmVyXG4gICAgLy8gdHJlZS4gVGhhdCBhc3N1bXB0aW9uIHdhcyB3cm9uZzogdGhlIHJlc29sdmVkIHN1YmZsb3cgcm9vdCdzXG4gICAgLy8gYG5leHRgIGlzIHRoZSBJTk5FUiBqb2luIHN0YWdlIChlLmcuLCBQYXJhbGxlbCdzIE1lcmdlIGFmdGVyIGFcbiAgICAvLyBmYW4tb3V0LCBUb1QncyBQcnVuZXIpLiBTdHJpcHBpbmcgaXQgYnJva2UgY29tcG9zaXRlIHN1YmZsb3dzIOKAlFxuICAgIC8vIHRoZSBqb2luIHN0YWdlIG5ldmVyIHJhbiwgc28gdGhlIHN1YmZsb3cgcmV0dXJuZWQgcGFydGlhbCBzdGF0ZS5cbiAgICAvL1xuICAgIC8vIFRoZSBvdXRlciBtb3VudCdzIHBvc3Qtc3ViZmxvdyBjb250aW51YXRpb24gaXMgaGFuZGxlZCBzZXBhcmF0ZWx5XG4gICAgLy8gYnkgdGhlIHBhcmVudCB0cmF2ZXJzZXIgdmlhIGBwYXJlbnRDb250ZXh0Lm5leHROb2RlYCBhbmQgaXMgbmV2ZXJcbiAgICAvLyBjb25mbGF0ZWQgd2l0aCB0aGUgaW5uZXIgc3ViZmxvdydzIGBuZXh0YCBjaGFpbi5cbiAgICBjb25zdCBzdWJmbG93Tm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSB7XG4gICAgICAuLi5ub2RlLFxuICAgICAgaXNTdWJmbG93Um9vdDogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIOKUgOKUgOKUgCBFeGVjdXRlIHZpYSBmYWN0b3J5IHRyYXZlcnNlciDilIDilIDilIBcbiAgICAvLyBUaGUgZmFjdG9yeSBjcmVhdGVzIGEgZnVsbCBGbG93Y2hhcnRUcmF2ZXJzZXIgd2l0aCB0aGUgc2FtZSA3LXBoYXNlIGFsZ29yaXRobSxcbiAgICAvLyBzaGFyaW5nIHRoZSBwYXJlbnQncyBzdGFnZU1hcCwgc3ViZmxvd3MgZGljdCwgYW5kIG5hcnJhdGl2ZSBnZW5lcmF0b3IuXG4gICAgbGV0IHN1YmZsb3dPdXRwdXQ6IGFueTtcbiAgICAvLyBCb3hlZDogYSBzdGFnZSBtYXkgdGhyb3cgQU5ZIHZhbHVlLCBgbnVsbGAgYW5kIGB1bmRlZmluZWRgIGluY2x1ZGVkIOKAlFxuICAgIC8vIGEgZmFsc3kgdGhyb3duIHZhbHVlIG11c3Qgc3RpbGwgZmFpbCB0aGUgbW91bnQuXG4gICAgbGV0IHN1YmZsb3dFcnJvcjogeyBlcnJvcjogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgIGxldCB0cmF2ZXJzZXJIYW5kbGU6IFN1YmZsb3dUcmF2ZXJzZXJIYW5kbGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcblxuICAgIHRyeSB7XG4gICAgICB0cmF2ZXJzZXJIYW5kbGUgPSB0aGlzLnRyYXZlcnNlckZhY3Rvcnkoe1xuICAgICAgICAvLyBUaGUgUkVBTCBzdWJmbG93IGdyYXBoIOKAlCBldmVyeSBpZCBpbnNpZGUgdGhlIHN1YmZsb3cgKGxvb3AgdGFyZ2V0cyxcbiAgICAgICAgLy8gYSByZS12aXNpdCBvZiB0aGUgcGF1c2VkIHN0YWdlKSByZXNvbHZlcyBhZ2FpbnN0IGl0LCByZS1lbnRyeSBvciBub3QuXG4gICAgICAgIHJvb3Q6IHN1YmZsb3dOb2RlLFxuICAgICAgICAvLyBXaGVyZSB0aGlzIHRyYXZlcnNhbCBzdGFydHMgb24gYSByZXN1bWUgcmUtZW50cnk7IHZpc2l0ZWQgb25jZSDigJRcbiAgICAgICAgLy8gYW5kIHRoZSBzaWJsaW5nIHBhdXNlcyBpdCByYWlzZXMgb25jZSB0aGF0IGVudHJ5J3MgY2hhaW4gZW5kcy5cbiAgICAgICAgLi4uKHJlc3VtZUhvcD8uZW50cnkgJiYgeyBlbnRyeTogcmVzdW1lSG9wLmVudHJ5IH0pLFxuICAgICAgICAuLi4ocmVzdW1lSG9wPy5wZW5kaW5nUGF1c2VzICYmIHsgcGVuZGluZ1BhdXNlczogcmVzdW1lSG9wLnBlbmRpbmdQYXVzZXMgfSksXG4gICAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IG5lc3RlZFJ1bnRpbWUsXG4gICAgICAgIHJlYWRPbmx5Q29udGV4dDogbWFwcGVkSW5wdXQsXG4gICAgICAgIHN1YmZsb3dJZCxcbiAgICAgICAgLy8gUkZDLTAwMyBEMTogdGhlIG1vdW50IHN0YWdlJ3MgcnVudGltZVN0YWdlSWQg4oCUIHRoZSBzdWJmbG93IHJvb3RcbiAgICAgICAgLy8gc3RhZ2UncyBgcGFyZW50UnVudGltZVN0YWdlSWRgIHNvIGFuY2VzdG9yIGNoYWlucyBjcm9zcyB0aGUgbW91bnQuXG4gICAgICAgIHBhcmVudE1vdW50UnVudGltZVN0YWdlSWQ6IHBhcmVudFRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgfSk7XG5cbiAgICAgIHN1YmZsb3dPdXRwdXQgPSBhd2FpdCB0cmF2ZXJzZXJIYW5kbGUuZXhlY3V0ZSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIC8vIFBhdXNlU2lnbmFsIGlzIG5vdCBhbiBlcnJvciDigJQgcHJlcGVuZCBzdWJmbG93IElEIGFuZCByZS10aHJvd1xuICAgICAgLy8gaW1tZWRpYXRlbHkuIE5vIGVycm9yIGxvZ2dpbmcsIG5vIHN1YmZsb3dSZXN1bHQgcmVjb3JkaW5nIOKAlFxuICAgICAgLy8gdGhlIHBhdXNlIGlzIGNvbnRyb2wgZmxvdy5cbiAgICAgIC8vXG4gICAgICAvLyBCRUZPUkUgcmUtdGhyb3csIGNhcHR1cmUgdGhlIG5lc3RlZCBydW50aW1lJ3Mgc3RhdGUgb250byB0aGVcbiAgICAgIC8vIHNpZ25hbC4gVGhpcyBpcyB0aGUgb25seSBjaGFuY2Ug4oCUIG9uY2Ugd2UgcmUtdGhyb3csIHRoZSBvdXRlclxuICAgICAgLy8gdHJhdmVyc2VyIHVud2luZHMgYW5kIHRoZSBuZXN0ZWQgcnVudGltZSBpcyBHQydkLiBPbiByZXN1bWUsIHdlJ2xsXG4gICAgICAvLyByZS1zZWVkIGEgZnJlc2ggbmVzdGVkIHJ1bnRpbWUgZnJvbSB0aGlzIGNhcHR1cmUgc28gcmVzdW1lIGhhbmRsZXJzXG4gICAgICAvLyBjYW4gcmVhZCB0aGUgcHJlLXBhdXNlIHN1YmZsb3cgc2NvcGUuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIFNUQVRFIG9ubHkg4oCUIHRoZSBzdWJmbG93J3Mgd29ya2luZyBtZW1vcnkgYXQgcGF1c2UgdGltZSAoZXZlcnlcbiAgICAgIC8vIGNvbW1pdHRlZCB3cml0ZSB1cCB0byB0aGUgcGF1c2UpLCByZWFkIHN0cmFpZ2h0IG9mZiBpdHMgc3RvcmUuIE5vXG4gICAgICAvLyBzbmFwc2hvdCBpcyBidWlsdDogYSBzbmFwc2hvdCB3b3VsZCBhbHNvIGJ1aWxkIHRoZSBzdWJmbG93J3NcbiAgICAgIC8vIGV4ZWN1dGlvbiB0cmVlIGFuZCBjb3B5IGl0cyBjb21taXQgbG9nIOKAlCB3b3JrIHByb3BvcnRpb25hbCB0byBob3dcbiAgICAgIC8vIGxvbmcgdGhlIHN1YmZsb3cgcmFuIOKAlCB0aGF0IHRoZSBsZWFuIGNoZWNrcG9pbnQgbmV2ZXIgY2Fycmllc1xuICAgICAgLy8gKGBydW5uZXIvY2hlY2twb2ludC50c2ApLlxuICAgICAgLy9cbiAgICAgIC8vIENhcHR1cmUgaXMga2V5ZWQgYnkgdGhlIFNBTUUgcGF0aC1wcmVmaXhlZCBgc3ViZmxvd0lkYCB1c2VkIGluXG4gICAgICAvLyBgc3ViZmxvd1BhdGhgLCBzbyByZXN1bWUgY2FuIGxvb2sgdXAgXCJzY29wZSBmb3Igc2YtZm9vXCIgYnkgaWQuXG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgZXJyb3IuY2FwdHVyZVN1YmZsb3dTY29wZShzdWJmbG93SWQsIG5lc3RlZFJ1bnRpbWUuZ2xvYmFsU3RvcmUuZ2V0U3RhdGUoKSk7XG4gICAgICAgIGVycm9yLnByZXBlbmRTdWJmbG93KHN1YmZsb3dJZCk7XG4gICAgICAgIG5lc3RlZFJ1bnRpbWUuY2xvc2VSZWNvcmQ/LigncGF1c2VkJyk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgc3ViZmxvd0Vycm9yID0geyBlcnJvciB9O1xuICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignc3ViZmxvd0Vycm9yJywgdGhyb3duVGV4dChlcnJvcikpO1xuICAgICAgdGhpcy5kZXBzLmxvZ2dlci5lcnJvcihgRXJyb3IgaW4gc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7IGVycm9yOiBsb2dnYWJsZVN0YWdlRXJyb3IocGFyZW50Q29udGV4dCwgZXJyb3IpIH0pO1xuICAgIH1cblxuICAgIC8vIFRoZSBtb3VudCdzIG93biBsb2cgZW5kZWQg4oCUIGJlZm9yZSB0aGUgbWVyZ2UtYmFjaywgd2hpY2ggY29tbWl0cyBvbiB0aGUgUEFSRU5UJ3MgbG9nLlxuICAgIG5lc3RlZFJ1bnRpbWUuY2xvc2VSZWNvcmQ/LihzdWJmbG93RXJyb3IgPyAnZmFpbGVkJyA6ICdvaycpO1xuXG4gICAgLy8gQWx3YXlzIG1lcmdlIG5lc3RlZCBzdWJmbG93IHJlc3VsdHMgKGV2ZW4gb24gZXJyb3Ig4oCUIHBhcnRpYWwgcmVzdWx0cyBhaWQgZGVidWdnaW5nKVxuICAgIGlmICh0cmF2ZXJzZXJIYW5kbGUpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRyYXZlcnNlckhhbmRsZS5nZXRTdWJmbG93UmVzdWx0cygpKSB7XG4gICAgICAgIHN1YmZsb3dSZXN1bHRzTWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDilIDilIDilIAgQnJlYWsgcHJvcGFnYXRpb24gKG9wdC1pbiB2aWEgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVhaykg4pSA4pSAXG4gICAgLy9cbiAgICAvLyBJZiB0aGUgc3ViZmxvdydzIGlubmVyIHRyYXZlcnNhbCBicm9rZSAoYmVjYXVzZSBhIHN0YWdlIGNhbGxlZFxuICAgIC8vIGBzY29wZS4kYnJlYWsocmVhc29uKWApIEFORCB0aGUgbW91bnQgZGVjbGFyZWQgYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCxcbiAgICAvLyBmb3J3YXJkIHRoZSBicmVhayBzdGF0ZSB0byB0aGUgUEFSRU5UJ3MgYnJlYWtGbGFnLiBUaGUgcGFyZW50XG4gICAgLy8gdHJhdmVyc2VyIHdpbGwgc2VlIGBzaG91bGRCcmVha2Agb24gaXRzIG5leHQgc3RlcCBhbmQgc3RvcC5cbiAgICAvL1xuICAgIC8vIFdpdGhvdXQgdGhpcywgaW5uZXIgYnJlYWtzIGFyZSBsb2NhbGx5IHNjb3BlZCB0byB0aGUgc3ViZmxvdyDigJQgdGhlXG4gICAgLy8gcGFyZW50IGNvbnRpbnVlcyBhcyBpZiB0aGUgc3ViZmxvdyByZXR1cm5lZCBub3JtYWxseS5cbiAgICAvL1xuICAgIC8vIElNUE9SVEFOVDogdGhpcyBydW5zIEJFRk9SRSBgb3V0cHV0TWFwcGluZ2AgYmVsb3csIGludGVudGlvbmFsbHkuIFRoZVxuICAgIC8vIG91dHB1dE1hcHBlciBzdGlsbCBleGVjdXRlcywgc28gdGhlIHN1YmZsb3cncyBwYXJ0aWFsIHJlc3VsdCBzdGlsbFxuICAgIC8vIGxhbmRzIGluIHRoZSBwYXJlbnQgc2NvcGUuIENvbnN1bWVycyB3aG8gbmVlZCB0byBzdXBwcmVzcyBvdXRwdXQgb25cbiAgICAvLyBicmVhayBjaGVjayB0aGUgYnJlYWsgc3RhdGUgaW5zaWRlIHRoZWlyIG91dHB1dE1hcHBlciBhbmQgZWFybHktcmV0dXJuLlxuICAgIC8vIFNlZSBgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVha2AgSlNEb2MgZm9yIHJhdGlvbmFsZS5cbiAgICBpZiAodHJhdmVyc2VySGFuZGxlICYmIG1vdW50T3B0aW9ucz8ucHJvcGFnYXRlQnJlYWsgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGlubmVyQnJlYWsgPSB0cmF2ZXJzZXJIYW5kbGUuZ2V0QnJlYWtTdGF0ZSgpO1xuICAgICAgaWYgKGlubmVyQnJlYWsuc2hvdWxkQnJlYWspIHtcbiAgICAgICAgYnJlYWtGbGFnLnNob3VsZEJyZWFrID0gdHJ1ZTtcbiAgICAgICAgaWYgKGlubmVyQnJlYWsucmVhc29uICE9PSB1bmRlZmluZWQgJiYgYnJlYWtGbGFnLnJlYXNvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWtGbGFnLnJlYXNvbiA9IGlubmVyQnJlYWsucmVhc29uO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJhaXNlIGEgcGFyZW50LWxldmVsIG9uQnJlYWsgZXZlbnQgc28gcmVjb3JkZXJzIGNhbiBkaXN0aW5ndWlzaFxuICAgICAgICAvLyB0aGUgaW5uZXIgb3JpZ2luYXRpbmcgYnJlYWsgKGZpcmVkIGluc2lkZSB0aGUgc3ViZmxvdykgZnJvbSB0aGlzXG4gICAgICAgIC8vIHByb3BhZ2F0ZWQgb25lIChmaXJlZCBhdCB0aGUgbW91bnQgbGV2ZWwgb24gdGhlIHBhcmVudCkuXG4gICAgICAgIHRoaXMuZGVwcy5uYXJyYXRpdmVHZW5lcmF0b3Iub25CcmVhayhzdWJmbG93TmFtZSwgcGFyZW50VHJhdmVyc2FsQ29udGV4dCwgaW5uZXJCcmVhay5yZWFzb24sIHN1YmZsb3dJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ViZmxvd1RyZWVDb250ZXh0ID0gbmVzdGVkUnVudGltZS5nZXRTbmFwc2hvdCgpO1xuXG4gICAgLy8g4pSA4pSA4pSAIE91dHB1dCBNYXBwaW5nIOKUgOKUgOKUgFxuICAgIGlmICghc3ViZmxvd0Vycm9yICYmIG1vdW50T3B0aW9ucz8ub3V0cHV0TWFwcGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGUgbWVyZ2UtYmFjayBpcyB0aGUgTU9VTlQncyBhY3QsIHNvIHRoZSBtb3VudCdzIGZyYW1lIHN0YWdlcyBhbmRcbiAgICAgICAgLy8gY29tbWl0cyBpdCDigJQgaXRzIGJ1bmRsZSBjYXJyaWVzIHRoZSBtb3VudCdzIHJ1bnRpbWVTdGFnZUlkIChSMTMpLlxuICAgICAgICAvLyBBIGJyYW5jaCBvciBmb3JrLWNoaWxkIG1vdW50IHN0aWxsIGxhbmRzIGl0cyB2YWx1ZXMgd2hlcmUgaXRzXG4gICAgICAgIC8vIHBhcmVudCB3cml0ZXMgKHRoZSBwYXJlbnQncyBydW4gbmFtZXNwYWNlKSwgYXMgYmVmb3JlOyB1bnRpbCA5LjMzLjBcbiAgICAgICAgLy8gaXQgY29tbWl0dGVkIE9OIHRoZSBwYXJlbnQncyBmcmFtZSwgc28gdGhlIGJ1bmRsZSBuYW1lZCB0aGUgc3RhZ2VcbiAgICAgICAgLy8gYmVmb3JlIHRoZSBtb3VudCwgb3IgdGhlIGJyYW5jaGluZyBkZWNpZGVyLlxuICAgICAgICBjb25zdCBvdXRwdXRDb250ZXh0ID0gcGFyZW50Q29udGV4dDtcbiAgICAgICAgaWYgKHBhcmVudENvbnRleHQuYnJhbmNoSWQgJiYgcGFyZW50Q29udGV4dC5wYXJlbnQpIHtcbiAgICAgICAgICBvdXRwdXRDb250ZXh0LnVzZUFkZHJlc3NPZihwYXJlbnRDb250ZXh0LnBhcmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJlbnRTY29wZSA9IG91dHB1dENvbnRleHQuZ2V0U2NvcGUoKTtcbiAgICAgICAgLy8gRm9yIFR5cGVkU2NvcGUgc3ViZmxvd3MsIHN0YWdlIGZ1bmN0aW9ucyByZXR1cm4gdm9pZCDigJQgZmFsbCBiYWNrIHRvIGEgc2hhbGxvdyBjbG9uZVxuICAgICAgICAvLyBvZiB0aGUgc3ViZmxvdydzIHNoYXJlZCBzdGF0ZSBzbyBvdXRwdXRNYXBwZXIgY2FuIGFjY2VzcyBhbGwgc2NvcGUgdmFsdWVzIHdyaXR0ZW5cbiAgICAgICAgLy8gZHVyaW5nIHRoZSBzdWJmbG93LiBXZSBzaGFsbG93LWNsb25lIHRvIGF2b2lkIGFsaWFzaW5nIHRoZSBsaXZlIFNoYXJlZE1lbW9yeSBjb250ZXh0LlxuICAgICAgICAvLyBOT1RFOiB0aGUgZnVsbCBzY29wZSBpcyBwYXNzZWQgKG5vdCBqdXN0IGRlY2xhcmVkIG91dHB1dHMpIOKAlCBvdXRwdXRNYXBwZXIgbXVzdFxuICAgICAgICAvLyBleHBsaWNpdGx5IHNlbGVjdCB3aGF0IHRvIHByb3BhZ2F0ZSB0byB0aGUgcGFyZW50LlxuICAgICAgICAvLyBSZWRhY3Rpb246IGBhcHBseU91dHB1dE1hcHBpbmdgIHdyaXRlcyB0aHJvdWdoIGBvdXRwdXRDb250ZXh0YCAoYVxuICAgICAgICAvLyBTdGFnZUNvbnRleHQsIG5vdCBhIGZhY2FkZSkuIFRoZSBjb250ZXh0J3Mgd3JpdGUgZnVubmVsIGFza3MgdGhlXG4gICAgICAgIC8vIHJ1bidzIHJlZGFjdGlvbiBydWxlIOKAlCBzaGFyZWQgd2l0aCB0aGUgc3ViZmxvdydzIGNvbnRleHRzLCBzbyBhIGtleVxuICAgICAgICAvLyB0aGUgcG9saWN5IG5hbWVzIE9SIGEga2V5IG1hcmtlZCBwZXItY2FsbCBpbnNpZGUgdGhlIHN1YmZsb3cgaXNcbiAgICAgICAgLy8gc2NydWJiZWQgaW4gdGhlIFBBUkVOVCdzIGxvZyBhbmQgbWlycm9yIHRvbyAoOS4xOS4wOyBiZWZvcmUsIHRoaXNcbiAgICAgICAgLy8gbWVyZ2UtYmFjayByZXRhaW5lZCBwbGFpbnRleHQpLlxuICAgICAgICBjb25zdCBlZmZlY3RpdmVPdXRwdXQgPSBzdWJmbG93T3V0cHV0ID8/IHsgLi4uc3ViZmxvd1RyZWVDb250ZXh0LnNoYXJlZFN0YXRlIH07XG4gICAgICAgIGNvbnN0IG1hcHBlZE91dHB1dCA9IGFwcGx5T3V0cHV0TWFwcGluZyhcbiAgICAgICAgICBlZmZlY3RpdmVPdXRwdXQsXG4gICAgICAgICAgcGFyZW50U2NvcGUsXG4gICAgICAgICAgb3V0cHV0Q29udGV4dCxcbiAgICAgICAgICBtb3VudE9wdGlvbnMsXG4gICAgICAgICAgcmVkYWN0aW9uUnVsZSxcbiAgICAgICAgKTtcblxuICAgICAgICBvdXRwdXRDb250ZXh0LmNvbW1pdCgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAvLyBBIG1lcmdlLWJhY2sgdGhhdCBmYWlsZWQgdG8gY29tbWl0IChhbiB1bmNsb25lYWJsZSB2YWx1ZSkgbGVhdmVzIGl0c1xuICAgICAgICAvLyB3cml0ZXMgc3RhZ2VkIG9uIHRoZSBtb3VudCdzIGZyYW1lOyB0aGUgbW91bnQncyBleGl0IGNvbW1pdCBiZWxvd1xuICAgICAgICAvLyB3b3VsZCB0aHJvdyB0aGVtIGFnYWluLCBvdXRzaWRlIHRoaXMgY2F0Y2guIFRocm91Z2ggOS4zMy4wIHRoZXlcbiAgICAgICAgLy8gd2VyZSBzdGFnZWQgb24gdGhlIHBhcmVudCdzIGZyYW1lLCB3aGljaCB3YXMgbm90IGNvbW1pdHRlZCBhZ2FpbixcbiAgICAgICAgLy8gc28gdGhlIHJ1biB3ZW50IG9uIOKAlCBkcm9wIHRoZW0sIGFzIGl0IGRpZC4gQSBsaW5lYXIgbW91bnQncyBmcmFtZVxuICAgICAgICAvLyBpcyBsZWZ0IGFzIGl0IGFsd2F5cyB3YXMuXG4gICAgICAgIGlmIChwYXJlbnRDb250ZXh0LmJyYW5jaElkICYmIHBhcmVudENvbnRleHQucGFyZW50KSBwYXJlbnRDb250ZXh0LmRpc2NhcmRTdGFnZWQoKTtcbiAgICAgICAgcGFyZW50Q29udGV4dC5hZGRFcnJvcignb3V0cHV0TWFwcGVyRXJyb3InLCB0aHJvd25UZXh0KGVycm9yKSk7XG4gICAgICAgIHRoaXMuZGVwcy5sb2dnZXIuZXJyb3IoYEVycm9yIGluIG91dHB1dE1hcHBlciBmb3Igc3ViZmxvdyAoJHtzdWJmbG93SWR9KTpgLCB7XG4gICAgICAgICAgZXJyb3I6IGxvZ2dhYmxlU3RhZ2VFcnJvcihwYXJlbnRDb250ZXh0LCBlcnJvciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN1YmZsb3dSZXN1bHQ6IFN1YmZsb3dSZXN1bHQgPSB7XG4gICAgICBzdWJmbG93SWQsXG4gICAgICBzdWJmbG93TmFtZSxcbiAgICAgIHRyZWVDb250ZXh0OiB7XG4gICAgICAgIGdsb2JhbENvbnRleHQ6IHN1YmZsb3dUcmVlQ29udGV4dC5zaGFyZWRTdGF0ZSxcbiAgICAgICAgc3RhZ2VDb250ZXh0czogc3ViZmxvd1RyZWVDb250ZXh0LmV4ZWN1dGlvblRyZWUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgICAgaGlzdG9yeTogc3ViZmxvd1RyZWVDb250ZXh0LmNvbW1pdExvZyxcbiAgICAgICAgLi4uKHN1YmZsb3dUcmVlQ29udGV4dC5yZWFkU291cmNlcyAmJiB7IHJlYWRTb3VyY2VzOiBzdWJmbG93VHJlZUNvbnRleHQucmVhZFNvdXJjZXMgfSksXG4gICAgICAgIC4uLihzdWJmbG93VHJlZUNvbnRleHQubG9nQWRkcmVzcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxvZ0FkZHJlc3M6IHN1YmZsb3dUcmVlQ29udGV4dC5sb2dBZGRyZXNzIH0pLFxuICAgICAgICAvLyBUaGUgc3ViZmxvdydzIG93biBmb2xkIGJhc2UgdHJhdmVscyB3aXRoIGl0cyBvd24gbG9nIOKAlCBzYW1lXG4gICAgICAgIC8vIGNvbnRyYWN0IGFzIHRoZSBydW4tbGV2ZWwgYFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGVgLlxuICAgICAgICBpbml0aWFsU3RhdGU6IHN1YmZsb3dUcmVlQ29udGV4dC5pbml0aWFsU3RhdGUsXG4gICAgICB9LFxuICAgICAgcGFyZW50U3RhZ2VJZDogcGFyZW50Q29udGV4dC5nZXRTdGFnZUlkKCksXG4gICAgfTtcblxuICAgIGNvbnN0IHN1YmZsb3dEZWYgPSB0aGlzLmRlcHMuc3ViZmxvd3M/LltzdWJmbG93SWRdO1xuICAgIGlmIChzdWJmbG93RGVmICYmIChzdWJmbG93RGVmIGFzIGFueSkuYnVpbGRUaW1lU3RydWN0dXJlKSB7XG4gICAgICBzdWJmbG93UmVzdWx0LnBpcGVsaW5lU3RydWN0dXJlID0gKHN1YmZsb3dEZWYgYXMgYW55KS5idWlsZFRpbWVTdHJ1Y3R1cmU7XG4gICAgfVxuXG4gICAgLy8gVGhlIHNlcnZlZCBzdGF0ZSAoOS4yMC4wKTogdGhlIG5lc3RlZCBtaXJyb3IncyBmaW5hbCBzdGF0ZSwgcmVtZW1iZXJlZFxuICAgIC8vIEJFU0lERSB0aGUgcmVzdWx0IOKAlCBgdHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dGAgc3RheXMgdGhlIGxpdmUgaGVhcCBmb3JcbiAgICAvLyB0aGUgcGxhaW4gc25hcHNob3QgYW5kIHRoZSBjaGVja3BvaW50OyBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgXG4gICAgLy8gc3Vic3RpdHV0ZXMgdGhlIG1pcnJvciB0aHJvdWdoIGBzZXJ2ZWRTdWJmbG93UmVzdWx0c2AuIEFic2VudCB3aXRob3V0XG4gICAgLy8gYSBwb2xpY3kuIFRoZSBleGl0IGV2ZW50IGJlbG93IGNhcnJpZXMgdGhlIHNhbWUgc2VydmVkIHZpZXc7IHdpdGhvdXQgYVxuICAgIC8vIG1pcnJvciBpdCBjYXJyaWVzIHRoZSBoZWFwIHJldGFpbmVkIHVuZGVyIHRoZSBydWxlIChwZXItY2FsbCBtYXJrc1xuICAgIC8vIGFsb25lIGtlZXAgbm8gbWlycm9yKSDigJQgdGhlIHNhbWUgb2JqZWN0IHdoZW4gbm90aGluZyBpcyByZWRhY3RlZC5cbiAgICBjb25zdCByYXdTdGF0ZSA9IHN1YmZsb3dSZXN1bHQudHJlZUNvbnRleHQuZ2xvYmFsQ29udGV4dDtcbiAgICBjb25zdCBtaXJyb3JTdGF0ZSA9IG5lc3RlZFJ1bnRpbWUucmVkYWN0ZWRTdG9yZT8uZ2V0U3RhdGUoKTtcbiAgICBpZiAobWlycm9yU3RhdGUgIT09IHVuZGVmaW5lZCkgcmVtZW1iZXJSZWRhY3RlZFN1YmZsb3dTdGF0ZShzdWJmbG93UmVzdWx0LCBtaXJyb3JTdGF0ZSk7XG4gICAgLy8gSGFuZGVkIG91dCB3aG9sZSwgc28gaXQgaXMgYSBib3VuZGFyeSByZWNvcmQ6IG5lc3RlZCBwb2xpY3kga2V5cyBhcmUgc2NydWJiZWQgdG9vXG4gICAgLy8gKHRoZSBtaXJyb3IncyBvd24gcGxhY2Vob2xkZXIsIHNvIGl0cyB0b3Aga2V5cyBrZWVwIHRoZWlyIGJ5dGVzKS5cbiAgICBjb25zdCBleGl0U3RhdGUgPSAhcmVkYWN0aW9uUnVsZVxuICAgICAgPyBtaXJyb3JTdGF0ZSA/PyByYXdTdGF0ZVxuICAgICAgOiBtaXJyb3JTdGF0ZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnkobWlycm9yU3RhdGUsIExPR19QTEFDRUhPTERFUilcbiAgICAgIDogcmVkYWN0aW9uUnVsZS5yZXRhaW5Cb3VuZGFyeShyYXdTdGF0ZSk7XG5cbiAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQoc3ViZmxvd0lkLCBzdWJmbG93UmVzdWx0KTtcbiAgICAvLyBBZGRpdGl2ZSBwZXItZXhlY3V0aW9uIGtleSAoZGVzaWduOiBkb2NzL2Rlc2lnbi9zdWJmbG93LWNvbW1pdC12aXNpYmlsaXR5Lm1kKS4gQSBMT09QSU5HXG4gICAgLy8gc3ViZmxvdyByZS1lbnRlcnMgd2l0aCB0aGUgU0FNRSBzdWJmbG93SWQsIHNvIHRoZSBwYXRoIGtleSBhYm92ZSBpcyBPVkVSV1JJVFRFTiBlYWNoXG4gICAgLy8gaXRlcmF0aW9uIChiYWNrLWNvbXBhdDogaXQgaG9sZHMgdGhlIExBU1QgaXRlcmF0aW9uIOKAlCB3aGF0IGdldFN1YnRyZWVTbmFwc2hvdC9saXN0U3ViZmxvd1BhdGhzXG4gICAgLy8gYW5kIHRoZSBldWkgZmFsbGJhY2sgc2VlLCB1bmNoYW5nZWQpLiBBTFNPIGtleSBieSB0aGUgbW91bnQncyBVTklRVUUgcnVudGltZVN0YWdlSWQgc28gRVZFUllcbiAgICAvLyBpdGVyYXRpb24ncyByZXN1bHQgaXMgcmV0YWluZWQgYW5kIGFkZHJlc3NhYmxlIChldWkgcGVyLWxvb3AgZHJpbGwtZG93biwgcGVyLXNjb3BlIGxvY2FsaXphdGlvbikuXG4gICAgLy8gcnVudGltZVN0YWdlSWQgYWx3YXlzIGNvbnRhaW5zICcjJzsgc3ViZmxvd0lkIG5ldmVyIGRvZXMg4oCUIHNvIHRoZXkgbmV2ZXIgY29sbGlkZSwgYW5kXG4gICAgLy8gbGlzdFN1YmZsb3dQYXRocyBmaWx0ZXJzICcjJyBrZXlzIHRvIGtlZXAgaXRzIHBhdGgtb25seSBjb250cmFjdC4gVGhlIHBhdXNlIGNoZWNrcG9pbnQgZmlsdGVyc1xuICAgIC8vIHRoZXNlIG91dCAoYnVpbGRQYXVzZUNoZWNrcG9pbnQpIHNvIGl0IHN0YXlzIGxlYW4uXG4gICAgaWYgKG1vdW50UnVudGltZVN0YWdlSWQgJiYgbW91bnRSdW50aW1lU3RhZ2VJZCAhPT0gc3ViZmxvd0lkKSB7XG4gICAgICBzdWJmbG93UmVzdWx0c01hcC5zZXQobW91bnRSdW50aW1lU3RhZ2VJZCwgc3ViZmxvd1Jlc3VsdCk7XG4gICAgfVxuXG4gICAgcGFyZW50Q29udGV4dC5hZGRGbG93RGVidWdNZXNzYWdlKCdzdWJmbG93JywgYEV4aXRpbmcgJHtzdWJmbG93TmFtZX0gc3ViZmxvd2AsIHtcbiAgICAgIHRhcmdldFN0YWdlOiBzdWJmbG93SWQsXG4gICAgfSk7XG4gICAgdGhpcy5kZXBzLm5hcnJhdGl2ZUdlbmVyYXRvci5vblN1YmZsb3dFeGl0KHN1YmZsb3dOYW1lLCBzdWJmbG93SWQsIHBhcmVudFRyYXZlcnNhbENvbnRleHQsIGV4aXRTdGF0ZSk7XG5cbiAgICAvLyBUaGUgbW91bnQncyBFWElUIOKAlCBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgbW91bnQncyBleGVjdXRpb24sIG5hbWVkIGFzIG9uZVxuICAgIC8vIG9uIHRoZSByZWNvcmQgKDkuMzkuMCkgc28gbm8gcmVhZGVyIGluZmVycyBpdCBmcm9tIHRoZSBsb2cncyBzaGFwZS5cbiAgICBjb21taXRTdGFnZVdyaXRlcyhwYXJlbnRDb250ZXh0LCAnZXhpdCcpO1xuXG4gICAgaWYgKHN1YmZsb3dFcnJvcikge1xuICAgICAgcGFyZW50Q29udGV4dC5mYWlsdXJlU3RhdGUuYWRvcHQobmVzdGVkUnVudGltZS5yb290U3RhZ2VDb250ZXh0LmZhaWx1cmVTdGF0ZSwgc3ViZmxvd0Vycm9yLmVycm9yKTtcbiAgICAgIHRocm93IHN1YmZsb3dFcnJvci5lcnJvcjtcbiAgICB9XG5cbiAgICBuZXN0ZWRSdW50aW1lLnJvb3RTdGFnZUNvbnRleHQuZmFpbHVyZVN0YXRlLmNvbXBsZXRlKCk7XG5cbiAgICByZXR1cm4gc3ViZmxvd091dHB1dDtcbiAgfVxufVxuIl19
@@ -17,6 +17,7 @@
17
17
  * key and the `#n` twin of one mount point at ONE raw result and are served
18
18
  * as ONE substituted result.
19
19
  */
20
+ import { redactReadSources } from '../../capture/readSources.js';
20
21
  /** The nested mirror's final state, keyed by the raw result it belongs to. */
21
22
  const redactedStates = new WeakMap();
22
23
  /** Remember the served (mirror) state of a subflow result. Absent without a policy. */
@@ -39,12 +40,22 @@ export function servedSubflowResults(results, redact) {
39
40
  let entry = servedByRaw.get(result);
40
41
  if (entry === undefined) {
41
42
  const mirror = redactedStates.get(result);
43
+ const sources = result.treeContext.readSources;
42
44
  entry =
43
- mirror === undefined ? result : { ...result, treeContext: { ...result.treeContext, globalContext: mirror } };
45
+ mirror === undefined && sources === undefined
46
+ ? result
47
+ : {
48
+ ...result,
49
+ treeContext: {
50
+ ...result.treeContext,
51
+ ...(mirror !== undefined && { globalContext: mirror }),
52
+ ...(sources && { readSources: redactReadSources(sources) }),
53
+ },
54
+ };
44
55
  servedByRaw.set(result, entry);
45
56
  }
46
57
  served[key] = entry;
47
58
  }
48
59
  return served;
49
60
  }
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVkU3ViZmxvd1Jlc3VsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBSUgsOEVBQThFO0FBQzlFLE1BQU0sY0FBYyxHQUFHLElBQUksT0FBTyxFQUEwQyxDQUFDO0FBRTdFLHVGQUF1RjtBQUN2RixNQUFNLFVBQVUsNEJBQTRCLENBQUMsTUFBcUIsRUFBRSxLQUE4QjtJQUNoRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxPQUEyQyxFQUMzQyxNQUFlO0lBRWYsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFDNUQsTUFBTSxNQUFNLEdBQWtDLEVBQUUsQ0FBQztJQUNqRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDcEMsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLEtBQUs7Z0JBQ0gsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLFdBQVcsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUMvRyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogc2VydmVkU3ViZmxvd1Jlc3VsdHMg4oCUIHRoZSBPTkUgcGxhY2UgdGhhdCBkZWNpZGVzIHdoaWNoIHN0YXRlIGEgc3ViZmxvdydzXG4gKiByZXN1bHQgc2VydmVzIHVuZGVyIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgKDkuMjAuMCkuXG4gKlxuICogQSBgU3ViZmxvd1Jlc3VsdGAgaXMgYnVpbHQgb25jZSBieSBgU3ViZmxvd0V4ZWN1dG9yYCB3aXRoIHRoZSBzdWJmbG93J3MgcmF3XG4gKiBoZWFwIGFzIGB0cmVlQ29udGV4dC5nbG9iYWxDb250ZXh0YCDigJQgdGhlIGxpdmUgdmlldyB0aGUgcGxhaW4gc25hcHNob3RcbiAqIGtlZXBzICh0aGUgcGF1c2UgY2hlY2twb2ludCBrZWVwcyBubyBzdWJmbG93IHJlc3VsdDogZm9ybWF0IDIpLiBXaGVuIHRoZVxuICogcnVuIGtlZXBzIGEgcmVkYWN0ZWQgbWlycm9yLCB0aGUgbmVzdGVkXG4gKiBydW50aW1lIGtlZXBzIG9uZSB0b28gKGVuYWJsZWQgYnkgYFN1YmZsb3dFeGVjdXRvcmAgdGhlIHdheSB0aGUgcm9vdCBkb2VzKSxcbiAqIGFuZCBpdHMgZmluYWwgc3RhdGUgaXMgUkVNRU1CRVJFRCBoZXJlIGJlc2lkZSB0aGUgcmVzdWx0IOKAlCBuZXZlciB3cml0dGVuXG4gKiBpbnRvIHRoZSByZXN1bHQsIHNvIHRoZSBwbGFpbiBzbmFwc2hvdCBzdGF5cyBieXRlLWlkZW50aWNhbCwgYW5kIG5ldmVyXG4gKiBzY3J1YmJlZCBhIHNlY29uZCB0aW1lOiB0aGUgbWlycm9yIGFscmVhZHkgaG9sZHMgZXhhY3RseSB3aGF0IHRoZSBzdWJmbG93J3NcbiAqIGxvZyBob2xkcyAoYHN0YXRlQXRgIG92ZXIgYHRyZWVDb250ZXh0Lmhpc3RvcnlgIGZvbGRzIHRvIGl0KS5cbiAqXG4gKiBUaGUgYXNzb2NpYXRpb24gaXMgYnkgb2JqZWN0IGlkZW50aXR5LCBzbyBpdCBzdXJ2aXZlcyB0aGUgdXB3YXJkIG1lcmdlIG9mXG4gKiBuZXN0ZWQgdHJhdmVyc2VycycgcmVzdWx0IG1hcHMgYW5kIGtlZXBzIHRoZSBkdWFsIGtleWluZyBob25lc3Q6IHRoZSBwYXRoXG4gKiBrZXkgYW5kIHRoZSBgI25gIHR3aW4gb2Ygb25lIG1vdW50IHBvaW50IGF0IE9ORSByYXcgcmVzdWx0IGFuZCBhcmUgc2VydmVkXG4gKiBhcyBPTkUgc3Vic3RpdHV0ZWQgcmVzdWx0LlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3ViZmxvd1Jlc3VsdCB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuLyoqIFRoZSBuZXN0ZWQgbWlycm9yJ3MgZmluYWwgc3RhdGUsIGtleWVkIGJ5IHRoZSByYXcgcmVzdWx0IGl0IGJlbG9uZ3MgdG8uICovXG5jb25zdCByZWRhY3RlZFN0YXRlcyA9IG5ldyBXZWFrTWFwPFN1YmZsb3dSZXN1bHQsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuXG4vKiogUmVtZW1iZXIgdGhlIHNlcnZlZCAobWlycm9yKSBzdGF0ZSBvZiBhIHN1YmZsb3cgcmVzdWx0LiBBYnNlbnQgd2l0aG91dCBhIHBvbGljeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlKHJlc3VsdDogU3ViZmxvd1Jlc3VsdCwgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIHJlZGFjdGVkU3RhdGVzLnNldChyZXN1bHQsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBUaGUgYHN1YmZsb3dSZXN1bHRzYCByZWNvcmQgYSBzbmFwc2hvdCBzZXJ2ZXMuIFBsYWluOiB0aGUgdHJhdmVyc2VyJ3Mgb3duXG4gKiByZWNvcmRzLCBhcyB0aGV5IGFyZS4gUmVkYWN0ZWQ6IGVhY2ggcmVzdWx0IHRoYXQgcmVtZW1iZXJzIGEgbWlycm9yIGlzXG4gKiBzZXJ2ZWQgYXMgYSBjb3B5IHdob3NlIGBnbG9iYWxDb250ZXh0YCBJUyB0aGF0IG1pcnJvciDigJQgb25lIGNvcHkgcGVyIHJhd1xuICogcmVzdWx0LCBzbyBhIG1vdW50J3MgdHdvIGtleXMgc3RpbGwgcG9pbnQgYXQgb25lIG9iamVjdCDigJQgYW5kIGEgcmVzdWx0XG4gKiB3aXRob3V0IGEgbWlycm9yIChubyBwb2xpY3kpIGlzIHNlcnZlZCBhcyBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZWRTdWJmbG93UmVzdWx0cyhcbiAgcmVzdWx0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PixcbiAgcmVkYWN0OiBib29sZWFuLFxuKTogUmVjb3JkPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICBpZiAoIXJlZGFjdCkgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhyZXN1bHRzKTtcbiAgY29uc3Qgc2VydmVkQnlSYXcgPSBuZXcgTWFwPFN1YmZsb3dSZXN1bHQsIFN1YmZsb3dSZXN1bHQ+KCk7XG4gIGNvbnN0IHNlcnZlZDogUmVjb3JkPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCByZXN1bHRdIG9mIHJlc3VsdHMpIHtcbiAgICBsZXQgZW50cnkgPSBzZXJ2ZWRCeVJhdy5nZXQocmVzdWx0KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbWlycm9yID0gcmVkYWN0ZWRTdGF0ZXMuZ2V0KHJlc3VsdCk7XG4gICAgICBlbnRyeSA9XG4gICAgICAgIG1pcnJvciA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogeyAuLi5yZXN1bHQsIHRyZWVDb250ZXh0OiB7IC4uLnJlc3VsdC50cmVlQ29udGV4dCwgZ2xvYmFsQ29udGV4dDogbWlycm9yIH0gfTtcbiAgICAgIHNlcnZlZEJ5UmF3LnNldChyZXN1bHQsIGVudHJ5KTtcbiAgICB9XG4gICAgc2VydmVkW2tleV0gPSBlbnRyeTtcbiAgfVxuICByZXR1cm4gc2VydmVkO1xufVxuIl19
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVkU3ViZmxvd1Jlc3VsdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHakUsOEVBQThFO0FBQzlFLE1BQU0sY0FBYyxHQUFHLElBQUksT0FBTyxFQUEwQyxDQUFDO0FBRTdFLHVGQUF1RjtBQUN2RixNQUFNLFVBQVUsNEJBQTRCLENBQUMsTUFBcUIsRUFBRSxLQUE4QjtJQUNoRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxPQUEyQyxFQUMzQyxNQUFlO0lBRWYsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWdDLENBQUM7SUFDNUQsTUFBTSxNQUFNLEdBQWtDLEVBQUUsQ0FBQztJQUNqRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDcEMsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDO1lBQy9DLEtBQUs7Z0JBQ0gsTUFBTSxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssU0FBUztvQkFDM0MsQ0FBQyxDQUFDLE1BQU07b0JBQ1IsQ0FBQyxDQUFDO3dCQUNFLEdBQUcsTUFBTTt3QkFDVCxXQUFXLEVBQUU7NEJBQ1gsR0FBRyxNQUFNLENBQUMsV0FBVzs0QkFDckIsR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLENBQUM7NEJBQ3RELEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxXQUFXLEVBQUUsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt5QkFDNUQ7cUJBQ0YsQ0FBQztZQUNSLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBzZXJ2ZWRTdWJmbG93UmVzdWx0cyDigJQgdGhlIE9ORSBwbGFjZSB0aGF0IGRlY2lkZXMgd2hpY2ggc3RhdGUgYSBzdWJmbG93J3NcbiAqIHJlc3VsdCBzZXJ2ZXMgdW5kZXIgYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCAoOS4yMC4wKS5cbiAqXG4gKiBBIGBTdWJmbG93UmVzdWx0YCBpcyBidWlsdCBvbmNlIGJ5IGBTdWJmbG93RXhlY3V0b3JgIHdpdGggdGhlIHN1YmZsb3cncyByYXdcbiAqIGhlYXAgYXMgYHRyZWVDb250ZXh0Lmdsb2JhbENvbnRleHRgIOKAlCB0aGUgbGl2ZSB2aWV3IHRoZSBwbGFpbiBzbmFwc2hvdFxuICoga2VlcHMgKHRoZSBwYXVzZSBjaGVja3BvaW50IGtlZXBzIG5vIHN1YmZsb3cgcmVzdWx0OiBmb3JtYXQgMikuIFdoZW4gdGhlXG4gKiBydW4ga2VlcHMgYSByZWRhY3RlZCBtaXJyb3IsIHRoZSBuZXN0ZWRcbiAqIHJ1bnRpbWUga2VlcHMgb25lIHRvbyAoZW5hYmxlZCBieSBgU3ViZmxvd0V4ZWN1dG9yYCB0aGUgd2F5IHRoZSByb290IGRvZXMpLFxuICogYW5kIGl0cyBmaW5hbCBzdGF0ZSBpcyBSRU1FTUJFUkVEIGhlcmUgYmVzaWRlIHRoZSByZXN1bHQg4oCUIG5ldmVyIHdyaXR0ZW5cbiAqIGludG8gdGhlIHJlc3VsdCwgc28gdGhlIHBsYWluIHNuYXBzaG90IHN0YXlzIGJ5dGUtaWRlbnRpY2FsLCBhbmQgbmV2ZXJcbiAqIHNjcnViYmVkIGEgc2Vjb25kIHRpbWU6IHRoZSBtaXJyb3IgYWxyZWFkeSBob2xkcyBleGFjdGx5IHdoYXQgdGhlIHN1YmZsb3cnc1xuICogbG9nIGhvbGRzIChgc3RhdGVBdGAgb3ZlciBgdHJlZUNvbnRleHQuaGlzdG9yeWAgZm9sZHMgdG8gaXQpLlxuICpcbiAqIFRoZSBhc3NvY2lhdGlvbiBpcyBieSBvYmplY3QgaWRlbnRpdHksIHNvIGl0IHN1cnZpdmVzIHRoZSB1cHdhcmQgbWVyZ2Ugb2ZcbiAqIG5lc3RlZCB0cmF2ZXJzZXJzJyByZXN1bHQgbWFwcyBhbmQga2VlcHMgdGhlIGR1YWwga2V5aW5nIGhvbmVzdDogdGhlIHBhdGhcbiAqIGtleSBhbmQgdGhlIGAjbmAgdHdpbiBvZiBvbmUgbW91bnQgcG9pbnQgYXQgT05FIHJhdyByZXN1bHQgYW5kIGFyZSBzZXJ2ZWRcbiAqIGFzIE9ORSBzdWJzdGl0dXRlZCByZXN1bHQuXG4gKi9cblxuaW1wb3J0IHsgcmVkYWN0UmVhZFNvdXJjZXMgfSBmcm9tICcuLi8uLi9jYXB0dXJlL3JlYWRTb3VyY2VzLmpzJztcbmltcG9ydCB0eXBlIHsgU3ViZmxvd1Jlc3VsdCB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuLyoqIFRoZSBuZXN0ZWQgbWlycm9yJ3MgZmluYWwgc3RhdGUsIGtleWVkIGJ5IHRoZSByYXcgcmVzdWx0IGl0IGJlbG9uZ3MgdG8uICovXG5jb25zdCByZWRhY3RlZFN0YXRlcyA9IG5ldyBXZWFrTWFwPFN1YmZsb3dSZXN1bHQsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuXG4vKiogUmVtZW1iZXIgdGhlIHNlcnZlZCAobWlycm9yKSBzdGF0ZSBvZiBhIHN1YmZsb3cgcmVzdWx0LiBBYnNlbnQgd2l0aG91dCBhIHBvbGljeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1lbWJlclJlZGFjdGVkU3ViZmxvd1N0YXRlKHJlc3VsdDogU3ViZmxvd1Jlc3VsdCwgc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIHJlZGFjdGVkU3RhdGVzLnNldChyZXN1bHQsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBUaGUgYHN1YmZsb3dSZXN1bHRzYCByZWNvcmQgYSBzbmFwc2hvdCBzZXJ2ZXMuIFBsYWluOiB0aGUgdHJhdmVyc2VyJ3Mgb3duXG4gKiByZWNvcmRzLCBhcyB0aGV5IGFyZS4gUmVkYWN0ZWQ6IGVhY2ggcmVzdWx0IHRoYXQgcmVtZW1iZXJzIGEgbWlycm9yIGlzXG4gKiBzZXJ2ZWQgYXMgYSBjb3B5IHdob3NlIGBnbG9iYWxDb250ZXh0YCBJUyB0aGF0IG1pcnJvciDigJQgb25lIGNvcHkgcGVyIHJhd1xuICogcmVzdWx0LCBzbyBhIG1vdW50J3MgdHdvIGtleXMgc3RpbGwgcG9pbnQgYXQgb25lIG9iamVjdCDigJQgYW5kIGEgcmVzdWx0XG4gKiB3aXRob3V0IGEgbWlycm9yIChubyBwb2xpY3kpIGlzIHNlcnZlZCBhcyBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZWRTdWJmbG93UmVzdWx0cyhcbiAgcmVzdWx0czogUmVhZG9ubHlNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PixcbiAgcmVkYWN0OiBib29sZWFuLFxuKTogUmVjb3JkPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICBpZiAoIXJlZGFjdCkgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhyZXN1bHRzKTtcbiAgY29uc3Qgc2VydmVkQnlSYXcgPSBuZXcgTWFwPFN1YmZsb3dSZXN1bHQsIFN1YmZsb3dSZXN1bHQ+KCk7XG4gIGNvbnN0IHNlcnZlZDogUmVjb3JkPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4gPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCByZXN1bHRdIG9mIHJlc3VsdHMpIHtcbiAgICBsZXQgZW50cnkgPSBzZXJ2ZWRCeVJhdy5nZXQocmVzdWx0KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbWlycm9yID0gcmVkYWN0ZWRTdGF0ZXMuZ2V0KHJlc3VsdCk7XG4gICAgICBjb25zdCBzb3VyY2VzID0gcmVzdWx0LnRyZWVDb250ZXh0LnJlYWRTb3VyY2VzO1xuICAgICAgZW50cnkgPVxuICAgICAgICBtaXJyb3IgPT09IHVuZGVmaW5lZCAmJiBzb3VyY2VzID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHJlc3VsdFxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgICAgIHRyZWVDb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgLi4ucmVzdWx0LnRyZWVDb250ZXh0LFxuICAgICAgICAgICAgICAgIC4uLihtaXJyb3IgIT09IHVuZGVmaW5lZCAmJiB7IGdsb2JhbENvbnRleHQ6IG1pcnJvciB9KSxcbiAgICAgICAgICAgICAgICAuLi4oc291cmNlcyAmJiB7IHJlYWRTb3VyY2VzOiByZWRhY3RSZWFkU291cmNlcyhzb3VyY2VzKSB9KSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICBzZXJ2ZWRCeVJhdy5zZXQocmVzdWx0LCBlbnRyeSk7XG4gICAgfVxuICAgIHNlcnZlZFtrZXldID0gZW50cnk7XG4gIH1cbiAgcmV0dXJuIHNlcnZlZDtcbn1cbiJdfQ==
@@ -261,7 +261,7 @@ export interface SubflowResult {
261
261
  globalContext: Record<string, unknown>;
262
262
  stageContexts: Record<string, unknown>;
263
263
  history: unknown[];
264
- /** Unknown until each child invocation has its own source ownership protocol. */
264
+ /** Native source book for this invocation's own log. Memory observation only; no parent receipt applies. */
265
265
  readonly readSources?: import('../capture/readSources.js').EngineReadSources;
266
266
  /** Identity of the local history, not its parent's log. */
267
267
  readonly logAddress?: LogAddress;
@@ -363,6 +363,7 @@ export interface IExecutionRuntime {
363
363
  rootStageContext: StageContext;
364
364
  executionHistory: {
365
365
  list(): unknown[];
366
+ readonly address?: LogAddress;
366
367
  };
367
368
  /**
368
369
  * A fresh root frame on this runtime — its store, its log, the run's policy
@@ -27,4 +27,4 @@ export var ArrayMergeMode;
27
27
  /** Overwrite parent array with subflow output. Use for Dynamic loops. */
28
28
  ArrayMergeMode["Replace"] = "replace";
29
29
  })(ArrayMergeMode || (ArrayMergeMode = {}));
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQWlCSCxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQWU5RSxvQ0FBb0M7QUFDcEMsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBWTtJQUNwQyxJQUFJLEVBQUUsQ0FBQyxPQUFhLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3ZFLEdBQUcsRUFBRSxDQUFDLE9BQWEsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDckUsS0FBSyxFQUFFLENBQUMsT0FBYSxFQUFFLEdBQUcsSUFBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQztJQUN6RSxLQUFLLEVBQUUsQ0FBQyxPQUFhLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3pFLElBQUksRUFBRSxDQUFDLE9BQWEsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7Q0FDeEUsQ0FBQztBQXVIRiw4RUFBOEU7QUFDOUUsVUFBVTtBQUNWLDhFQUE4RTtBQUU5RTs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGNBS1g7QUFMRCxXQUFZLGNBQWM7SUFDeEIsd0ZBQXdGO0lBQ3hGLG1DQUFpQixDQUFBO0lBQ2pCLHlFQUF5RTtJQUN6RSxxQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsY0FBYyxLQUFkLGNBQWMsUUFLekIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHR5cGVzLnRzIOKAlCBBbGwgdHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIGVuZ2luZSBsaWJyYXJ5LlxuICpcbiAqIENlbnRyYWxpemVzIHR5cGUgZGVmaW5pdGlvbnMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLlxuICogRXZlcnkgaGFuZGxlciByZWNlaXZlcyBIYW5kbGVyRGVwcyAodGhlIERJIGJhZykgaW5zdGVhZCBvZiBpbXBvcnRpbmcgdGhlIHRyYXZlcnNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExvZ0FkZHJlc3MsIExvZ091dGNvbWUsIE1ldGEgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHR5cGUgeyBTaGFyZWRNZW1vcnkgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dDb250cm9sVHlwZSwgRmxvd01lc3NhZ2UgfSBmcm9tICcuLi9tZW1vcnkvZnJhbWVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IERlY2lkZXIsIFNlbGVjdG9yLCBTdGFnZU5vZGUgfSBmcm9tICcuL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlZFBhdXNlLCBSZXN1bWVFbnRyeSB9IGZyb20gJy4vaGFuZGxlcnMvUmVzdW1lRW50cnkuanMnO1xuaW1wb3J0IHR5cGUgeyBJQ29udHJvbEZsb3dOYXJyYXRpdmUgfSBmcm9tICcuL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5cbi8vIFJlLWV4cG9ydCBTdGFnZU5vZGUgdHlwZXMgZm9yIGNvbnZlbmllbmNlXG5leHBvcnQgdHlwZSB7IERlY2lkZXIsIFNlbGVjdG9yLCBTdGFnZU5vZGUgfSBmcm9tICcuL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5cbi8vIFJlLWV4cG9ydCBwYXVzZSB0eXBlcyBmcm9tIHBhdXNlLyBsaWJyYXJ5XG5leHBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFBhdXNhYmxlSGFuZGxlciwgUGF1c2VSZXN1bHQgfSBmcm9tICcuLi9wYXVzZS9pbmRleC5qcyc7XG5leHBvcnQgeyBpc1BhdXNlUmVzdWx0LCBpc1BhdXNlU2lnbmFsLCBQYXVzZVNpZ25hbCB9IGZyb20gJy4uL3BhdXNlL2luZGV4LmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb2dnZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTWluaW1hbCBsb2dnaW5nIGNvbnRyYWN0LiBNaXJyb3JzIENvbnNvbGUgQVBJIHN1YnNldC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ2dlciB7XG4gIGluZm8obWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgbG9nKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGRlYnVnKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGVycm9yKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbn1cblxuLyoqIERlZmF1bHQgY29uc29sZS1iYXNlZCBsb2dnZXIuICovXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtLSB0cml2aWFsIGNvbnNvbGUgZGVsZWdhdGlvbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRMb2dnZXI6IElMb2dnZXIgPSB7XG4gIGluZm86IChtZXNzYWdlPzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gY29uc29sZS5pbmZvKG1lc3NhZ2UsIC4uLmFyZ3MpLFxuICBsb2c6IChtZXNzYWdlPzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gY29uc29sZS5sb2cobWVzc2FnZSwgLi4uYXJncyksXG4gIGRlYnVnOiAobWVzc2FnZT86IGFueSwgLi4uYXJnczogYW55W10pID0+IGNvbnNvbGUuZGVidWcobWVzc2FnZSwgLi4uYXJncyksXG4gIGVycm9yOiAobWVzc2FnZT86IGFueSwgLi4uYXJnczogYW55W10pID0+IGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgLi4uYXJncyksXG4gIHdhcm46IChtZXNzYWdlPzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gY29uc29sZS53YXJuKG1lc3NhZ2UsIC4uLmFyZ3MpLFxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdGFnZSBGdW5jdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBDYWxsYmFjayB0aGF0IHJlY2VpdmVzIHRva2VucyBkdXJpbmcgc3RyZWFtaW5nLiAqL1xuZXhwb3J0IHR5cGUgU3RyZWFtQ2FsbGJhY2sgPSAodG9rZW46IHN0cmluZykgPT4gdm9pZDtcblxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIGZvciBzdGFnZSBoYW5kbGVycy5cbiAqIC0gVE91dDogcmV0dXJuIHR5cGUgcHJvZHVjZWQgYnkgdGhlIHN0YWdlXG4gKiAtIFRTY29wZTogdGhlIHNjb3BlIG9iamVjdCBwYXNzZWQgdG8gdGhlIHN0YWdlXG4gKiAtIE9wdGlvbmFsIDNyZCBwYXJhbWV0ZXIgYHN0cmVhbUNhbGxiYWNrYCBpbmplY3RlZCBmb3Igc3RyZWFtaW5nIHN0YWdlcy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhZ2VGdW5jdGlvbjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+ID0gKFxuICBzY29wZTogVFNjb3BlLFxuICBicmVha1BpcGVsaW5lOiAoKSA9PiB2b2lkLFxuICBzdHJlYW1DYWxsYmFjaz86IFN0cmVhbUNhbGxiYWNrLFxuKSA9PiBQcm9taXNlPFRPdXQgfCB2b2lkPiB8IFRPdXQgfCB2b2lkO1xuXG4vKipcbiAqIFN0YWdlIGZ1bmN0aW9uIGZvciBwYXVzYWJsZSBzdGFnZXMg4oCUIHJldHVybiB2YWx1ZSBpcyB0aGUgcGF1c2UgZGF0YSAoYW55IHR5cGUpLlxuICogUmV0dXJuIG5vbi12b2lkIHRvIHBhdXNlLCByZXR1cm4gdm9pZCB0byBjb250aW51ZSBub3JtYWxseS5cbiAqL1xuZXhwb3J0IHR5cGUgUGF1c2FibGVTdGFnZUZ1bmN0aW9uPFRTY29wZSA9IGFueT4gPSAoXG4gIHNjb3BlOiBUU2NvcGUsXG4gIGJyZWFrUGlwZWxpbmU6ICgpID0+IHZvaWQsXG4pID0+IFByb21pc2U8dW5rbm93bj4gfCB1bmtub3duO1xuXG4vKiogRmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSBzY29wZSBpbnN0YW5jZSBmb3IgZWFjaCBzdGFnZS4gKi9cbmV4cG9ydCB0eXBlIFNjb3BlRmFjdG9yeTxUU2NvcGUgPSBhbnk+ID0gKFxuICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gIHN0YWdlTmFtZTogc3RyaW5nLFxuICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duLFxuICBleGVjdXRpb25FbnY/OiBFeGVjdXRpb25FbnYsXG4pID0+IFRTY29wZTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHJlYW1pbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgdHlwZSBTdHJlYW1Ub2tlbkhhbmRsZXIgPSAoc3RyZWFtSWQ6IHN0cmluZywgdG9rZW46IHN0cmluZykgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIFN0cmVhbUxpZmVjeWNsZUhhbmRsZXIgPSAoc3RyZWFtSWQ6IHN0cmluZywgZnVsbFRleHQ/OiBzdHJpbmcpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtSGFuZGxlcnMge1xuICBvblRva2VuPzogU3RyZWFtVG9rZW5IYW5kbGVyO1xuICBvblN0YXJ0PzogU3RyZWFtTGlmZWN5Y2xlSGFuZGxlcjtcbiAgb25FbmQ/OiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhcmFsbGVsLWZvci1lYWNoIChkeW5hbWljIGZhbi1vdXQpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBBIGJ1aWx0IGNoYXJ0LCBhcyBgYWRkUGFyYWxsZWxGb3JFYWNoYCdzIGBicmFuY2hgIGZhY3RvcnkgcmV0dXJucyBpdC5cbiAqXG4gKiBTdHJ1Y3R1cmFsbHkgdGhlIHN1YnNldCBvZiBgRmxvd0NoYXJ0YCB0aGUgZW5naW5lIG5lZWRzIHRvIG1vdW50IGEgYnJhbmNoIOKAlFxuICogZGVjbGFyZWQgaGVyZSByYXRoZXIgdGhhbiBpbXBvcnRlZCBzbyBgZW5naW5lL2Aga2VlcHMgaXRzIG9uZS13YXkgZGVwZW5kZW5jeVxuICogb24gYGJ1aWxkZXIvYC4gQW55IGBmbG93Q2hhcnQoLi4uKS5idWlsZCgpYCByZXN1bHQgc2F0aXNmaWVzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyYW5jaENoYXJ0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgYnVpbGRUaW1lU3RydWN0dXJlPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBSdW50aW1lIGZhbi1vdXQgY29uZmlnIOKAlCBvbmUgYnJhbmNoIHBlciBpdGVtLCBicmFuY2ggQ09VTlQgZGVjaWRlZCBhdFxuICogcnVudGltZSBmcm9tIHRoZSBwYXlsb2FkLiBEZXNpZ246IGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kIChEMikuXG4gKlxuICogRWFjaCBicmFuY2ggcnVucyBhcyBhIGdlbmVyYXRlZCBTVUJGTE9XIChpc29sYXRlZCBydW50aW1lLCBvd24gY29tbWl0IGxvZyxcbiAqIGFkZHJlc3NhYmxlIGF0IGA8c3RhZ2VJZD5+PGluZGV4PmAgaW4gZXZlcnkgdHJhY2UgcXVlcnkpLCB3aGljaCBpcyB3aGF0XG4gKiBtYWtlcyBicmFuY2hlcyB1bmFibGUgdG8gY29ycnVwdCBlYWNoIG90aGVyJ3MgaW4tZmxpZ2h0IHN0YXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFsbGVsRm9yRWFjaENvbmZpZzxUSXRlbSA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKlxuICAgKiBQaWNrcyB0aGUgaXRlbXMgdG8gZmFuIG91dCBvdmVyLCBmcm9tIHRoZSBsaXZlIHNjb3BlLiBSZWFkcyBoZXJlIGFyZVxuICAgKiB0cmFja2VkIGxpa2UgYW55IG90aGVyIHN0YWdlIHJlYWQsIHNvIHRoZSBmYW4tb3V0J3Mgb3duIGlucHV0cyBzaG93IHVwIGluXG4gICAqIHRoZSB0cmFjZSBhbmQgaW4gYSBiYWNrd2FyZCBzbGljZS5cbiAgICovXG4gIGl0ZW1zOiAoc2NvcGU6IFRTY29wZSkgPT4gcmVhZG9ubHkgVEl0ZW1bXTtcbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgY2hhcnQgZm9yIE9ORSBpdGVtLiBDYWxsZWQgb25jZSBwZXIgZXhlY3V0ZWQgYnJhbmNoLCB3aXRoIHRoZVxuICAgKiBpdGVtIGFuZCBpdHMgaW5kZXgg4oCUIGNsb3NlIG92ZXIgdGhlbSwgb3IgcmVhZCB0aGUgYGl0ZW1gIC8gYGluZGV4YCB2YWx1ZXNcbiAgICogc2VlZGVkIGludG8gdGhlIGJyYW5jaCdzIG93biBzY29wZS5cbiAgICovXG4gIGJyYW5jaDogKGl0ZW06IFRJdGVtLCBpbmRleDogbnVtYmVyKSA9PiBCcmFuY2hDaGFydDtcbiAgLyoqXG4gICAqIEhhcmQgY2VpbGluZyBvbiBicmFuY2hlcyBwZXIgZXhlY3V0aW9uLiBSRVFVSVJFRDogYW4gdW5ib3VuZGVkIGZhbi1vdXRcbiAgICogZHJpdmVuIGJ5IG1vZGVsIG91dHB1dCBpcyBhIHJlc291cmNlIGF0dGFjaywgc28gdGhlcmUgaXMgbm8gZGVmYXVsdCB0b1xuICAgKiBmb3JnZXQuIEV4dHJhIGl0ZW1zIGRvIG5vdCBydW4g4oCUIHRoZSB0cnVuY2F0aW9uIGlzIHJlY29yZGVkLCBuZXZlciBzaWxlbnQuXG4gICAqL1xuICBtYXhCcmFuY2hlczogbnVtYmVyO1xuICAvKipcbiAgICogU3RhdGUga2V5IHRoZSBvcmRlcmVkIHJlc3VsdHMgYXJyYXkgaXMgd3JpdHRlbiB0byBvbiB0aGUgcGFyZW50IHNjb3BlLlxuICAgKiBSRVFVSVJFRCDigJQgYSBrZXkgZGVyaXZlZCBmcm9tIHRoZSBzdGFnZSBpZCBjb3VsZCBzaWxlbnRseSBvdmVyd3JpdGUgc3RhdGVcbiAgICogdGhlIGNoYXJ0IGFscmVhZHkgb3ducy5cbiAgICovXG4gIGludG86IHN0cmluZztcbiAgLyoqXG4gICAqIEZhbi1vdXQgZXJyb3IgcG9saWN5IOKAlCB0aGUgU0FNRSBwb2xpY3kgdGhlIGV4aXN0aW5nIHBhcmFsbGVsIGZhbi1vdXQgdXNlcy5cbiAgICogYHRydWVgID0gYFByb21pc2UuYWxsYCAodGhlIGZpcnN0IGZhaWxpbmcgYnJhbmNoIHJlamVjdHMgdGhlIHN0YWdlKTtcbiAgICogb21pdHRlZC9mYWxzZSA9IGJlc3QtZWZmb3J0IGBQcm9taXNlLmFsbFNldHRsZWRgIChldmVyeSBicmFuY2ggcnVuczsgYVxuICAgKiBmYWlsZWQgYnJhbmNoJ3Mgc2xvdCBpbiB0aGUgcmVzdWx0cyBhcnJheSBpcyBgdW5kZWZpbmVkYCkuXG4gICAqL1xuICBmYWlsRmFzdD86IGJvb2xlYW47XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmV0cnkgKHBlci1zdGFnZSBkZWNsYXJhdGl2ZSBwb2xpY3kpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gVGhlIHBvbGljeSB0aGUgYXR0ZW1wdCBydW5uZXIgcnVuczogZGVjbGFyZWQgb25jZSwgaW4gdGhlIGF0dGVtcHQgbGVhZiAoYGF0dGVtcHQvdHlwZXMudHNgLCAxMC4xKSwgYW5kIG5hbWVkXG4vLyBoZXJlIHNvIGV2ZXJ5IGVuZ2luZSBhbmQgYnVpbGRlciBzaXRlIGtlZXBzIGl0cyBpbXBvcnQuXG5leHBvcnQgdHlwZSB7IFJldHJ5UG9saWN5LCBTdGFnZVRvdWNoZXMgfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdWJmbG93XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb250cm9scyBob3cgYXJyYXkgdmFsdWVzIGZyb20gb3V0cHV0TWFwcGVyIGFyZSBtZXJnZWQgaW50byBwYXJlbnQgc2NvcGUuXG4gKi9cbmV4cG9ydCBlbnVtIEFycmF5TWVyZ2VNb2RlIHtcbiAgLyoqIEFwcGVuZCBzdWJmbG93IG91dHB1dCB0byBleGlzdGluZyBwYXJlbnQgYXJyYXk6IFsuLi5leGlzdGluZywgLi4udmFsdWVdLiBEZWZhdWx0LiAqL1xuICBDb25jYXQgPSAnY29uY2F0JyxcbiAgLyoqIE92ZXJ3cml0ZSBwYXJlbnQgYXJyYXkgd2l0aCBzdWJmbG93IG91dHB1dC4gVXNlIGZvciBEeW5hbWljIGxvb3BzLiAqL1xuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1YmZsb3dNb3VudE9wdGlvbnM8VFBhcmVudFNjb3BlID0gYW55LCBUU3ViZmxvd0lucHV0ID0gYW55LCBUU3ViZmxvd091dHB1dCA9IGFueT4ge1xuICBpbnB1dE1hcHBlcj86IChwYXJlbnRTY29wZTogVFBhcmVudFNjb3BlKSA9PiBUU3ViZmxvd0lucHV0O1xuICAvKipcbiAgICogTWFwcyBzdWJmbG93IG91dHB1dCBiYWNrIGludG8gcGFyZW50IHNjb3BlLlxuICAgKlxuICAgKiAqKkFycmF5IG1lcmdlIGJlaGF2aW9yKiogaXMgY29udHJvbGxlZCBieSBgYXJyYXlNZXJnZWA6XG4gICAqIC0gYCdjb25jYXQnYCAoZGVmYXVsdCk6IGBbLi4uZXhpc3RpbmcsIC4uLnZhbHVlXWAg4oCUIHJldHVybiBvbmx5ICoqZGVsdGEqKiBpdGVtc1xuICAgKiAtIGAncmVwbGFjZSdgOiBvdmVyd3JpdGVzIHRoZSBwYXJlbnQgdmFsdWUg4oCUIHJldHVybiB0aGUgZnVsbCBhcnJheVxuICAgKlxuICAgKiBTY2FsYXIgdmFsdWVzIGFyZSBhbHdheXMgcmVwbGFjZWQgcmVnYXJkbGVzcyBvZiBgYXJyYXlNZXJnZWAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRGVsdGEgbW9kZSAoZGVmYXVsdCkg4oCUIHJldHVybiBvbmx5IG5ldyBpdGVtcywgY29uY2F0IGFwcGVuZHNcbiAgICogb3V0cHV0TWFwcGVyOiAoc2YpID0+ICh7IG1lc3NhZ2VzOiBzZi5uZXdNZXNzYWdlcyB9KVxuICAgKlxuICAgKiAvLyBSZXBsYWNlIG1vZGUg4oCUIHJldHVybiBmdWxsIGFycmF5LCBwYXJlbnQgdmFsdWUgaXMgb3ZlcndyaXR0ZW5cbiAgICogLy8gVXNlZnVsIGluIER5bmFtaWMgbG9vcHMgd2hlcmUgdGhlIHN1YmZsb3cgcmVjb21wdXRlcyB0aGUgZnVsbCB2YWx1ZSBlYWNoIGl0ZXJhdGlvblxuICAgKiBvdXRwdXRNYXBwZXI6IChzZikgPT4gKHsgdG9vbERlc2NyaXB0aW9uczogc2YudG9vbERlc2NyaXB0aW9ucyB9KSxcbiAgICogYXJyYXlNZXJnZTogQXJyYXlNZXJnZU1vZGUuUmVwbGFjZSxcbiAgICpcbiAgICogLy8gU2NhbGFycyBhcmUgZmluZSBpbiBib3RoIG1vZGVzIOKAlCBhbHdheXMgcmVwbGFjZWRcbiAgICogb3V0cHV0TWFwcGVyOiAoc2YpID0+ICh7IHN0YXR1czogc2YucmVzdWx0LCBjb3VudDogc2YudG90YWwgfSlcbiAgICogYGBgXG4gICAqL1xuICBvdXRwdXRNYXBwZXI/OiAoc3ViZmxvd091dHB1dDogVFN1YmZsb3dPdXRwdXQsIHBhcmVudFNjb3BlOiBUUGFyZW50U2NvcGUpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogQ29udHJvbHMgaG93IGFycmF5IHZhbHVlcyBmcm9tIG91dHB1dE1hcHBlciBhcmUgbWVyZ2VkIGludG8gcGFyZW50IHNjb3BlLlxuICAgKiBBcHBsaWVzIG9ubHkgdG8gdG9wLWxldmVsIGFycmF5IGtleXMuIE5lc3RlZCBhcnJheXMgaW5zaWRlIG9iamVjdHNcbiAgICogYWx3YXlzIHVzZSBhcHBlbmQgKGFwcGVuZFRvQXJyYXkpIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcnJheU1lcmdlTW9kZS5Db25jYXRcbiAgICovXG4gIGFycmF5TWVyZ2U/OiBBcnJheU1lcmdlTW9kZTtcblxuICAvKipcbiAgICogU1RSVUNUVVJFLU9OTFk6IHRoZSBkb3duc3RyZWFtIHN0YWdlIGlkIHRoaXMgYnJhbmNoJ3MgY29udmVyZ2VuY2UgZWRnZVxuICAgKiBwb2ludHMgdG8sIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgXCJjb252ZXJnZSBhdCB0aGUgbmV4dCBsaW5lYXIgc3RhZ2UuXCJcbiAgICpcbiAgICogV2hlbiBhIGZvcmsvc2VsZWN0b3IvZGVjaWRlciBicmFuY2ggY2FycmllcyBgY29udmVyZ2VBdGAsIGl0cyB2aXN1YWxpemVkXG4gICAqIGBuZXh0YCBlZGdlIGlzIGZpcmVkIHRvIHRoZSBuYW1lZCBzdGFnZSBpbnN0ZWFkIG9mIHRvIHRoZSBzaGFyZWRcbiAgICogY29udmVyZ2VuY2Ugbm9kZSBpdHMgc2libGluZ3MgdXNlLiBUaGlzIGV4cHJlc3NlcyBhbiB1bmVxdWFsLWRlcHRoIG1lcmdlXG4gICAqIOKAlCBlLmcuIGEgYHRvb2xzYCBzbG90IHRoYXQgYnlwYXNzZXMgdGhlIGBtZXNzYWdlQVBJYCBhc3NlbWJseSBub2RlIGFuZFxuICAgKiBwYWlycyB3aXRoIGl0cyBvdXRwdXQgYXQgYGNhbGwtbGxtYCAoc28gYGNhbGwtbGxtYCByZWFkcyBhcyBhIDItcGFyZW50XG4gICAqIG1lcmdlKSwgZmFpdGhmdWwgdG8gdGhlIEFudGhyb3BpYyB3aXJlIHByb3RvY29sIChzeXN0ZW0rbWVzc2FnZXMgPSB0aGVcbiAgICogbWVzc2FnZSBwYXlsb2FkOyB0b29scyA9IGEgc2VwYXJhdGUgdG9wLWxldmVsIGZpZWxkKS5cbiAgICpcbiAgICogKipUaGlzIGFmZmVjdHMgdGhlIFNUUlVDVFVSRS90b3BvbG9neSBncmFwaCBvbmx5Kiog4oCUIHRoZSBydW50aW1lIGlzXG4gICAqIHVuY2hhbmdlZCAodGhlIGJyYW5jaCdzIG91dHB1dHMgcmlkZSBzaGFyZWQgc2NvcGU7IHRoZSBuYW1lZCB0YXJnZXQgcmVhZHNcbiAgICogdGhlbSB3aGVuIGl0IHJ1bnMpLiBJdCBkb2VzIE5PVCBpbnRyb2R1Y2UgYSBqb2luIGJhcnJpZXIuIFRoZSB0YXJnZXQgaXMgYVxuICAgKiBGT1JXQVJEIHN0YWdlIChhZGRlZCBsYXRlciBpbiB0aGUgY2hhaW4pLCBzbyBpdCBpcyBub3QgdmFsaWRhdGVkIGF0XG4gICAqIGJyYW5jaC1kZWNsYXJhdGlvbiB0aW1lLlxuICAgKi9cbiAgY29udmVyZ2VBdD86IHN0cmluZztcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGFuIGlubmVyIGBzY29wZS4kYnJlYWsocmVhc29uKWAgY2FsbCBpbnNpZGUgdGhpcyBzdWJmbG93XG4gICAqIHByb3BhZ2F0ZXMgdXAgdG8gdGhlIHBhcmVudCDigJQgaS5lLiwgdGhlIHBhcmVudCdzIGBicmVha0ZsYWdgIGlzIHNldFxuICAgKiBhZnRlciB0aGUgc3ViZmxvdyBleGl0cywgdGVybWluYXRpbmcgdGhlIHBhcmVudCdzIG91dGVyIGxvb3AgdG9vLlxuICAgKlxuICAgKiAqKkRlZmF1bHQ6IGBmYWxzZWAqKiAoY3VycmVudCBiZWhhdmlvdXIg4oCUIGlubmVyIGJyZWFrIHN0b3BzIG9ubHkgdGhlXG4gICAqIHN1YmZsb3c7IHBhcmVudCBjb250aW51ZXMpLlxuICAgKlxuICAgKiAjIyBXaGVuIHRvIHVzZVxuICAgKlxuICAgKiBTZXQgYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCBvbiBzdWJmbG93IG1vdW50cyB0aGF0IHJlcHJlc2VudFxuICAgKiAqKnRlcm1pbmFsKiogYnJhbmNoZXMg4oCUIFwiaWYgdGhpcyBzdWJmbG93IGZpcmVzLCB0aGUgb3V0ZXIgbG9vcCBpc1xuICAgKiBkb25lXCIuIEV4YW1wbGVzOlxuICAgKlxuICAgKiAtIEEgaHVtYW4tcmV2aWV3IHJ1bm5lciB0aGF0IHRha2VzIG92ZXIgZnJvbSBhbiBhZ2VudCdzIHRvb2wtY2FsbGluZ1xuICAgKiAgIGxvb3AgYW5kIHByb2R1Y2VzIHRoZSBmaW5hbCByZXNwb25zZS5cbiAgICogLSBBIHNhZmV0eS1nYXRlIHN1YmZsb3cgdGhhdCBoYWx0cyB0aGUgb3V0ZXIgd29ya2Zsb3cgd2hlbiBhIHBvbGljeVxuICAgKiAgIHZpb2xhdGlvbiBpcyBkZXRlY3RlZC5cbiAgICogLSBBbiBlcnJvci1yZWNvdmVyeSBzdWJmbG93IHRoYXQgcmVzdG9yZXMgc3RhdGUgYW5kIHRoZW4gdGVybWluYXRlcy5cbiAgICpcbiAgICogIyMgU2VtYW50aWNzXG4gICAqXG4gICAqIDEuIEluc2lkZSB0aGUgc3ViZmxvdywgYSBzdGFnZSBjYWxscyBgc2NvcGUuJGJyZWFrKHJlYXNvbilgLlxuICAgKiAyLiBUaGUgc3ViZmxvdydzIG93biBleGVjdXRpb24gc3RvcHMgKG5vcm1hbCBgJGJyZWFrYCBiZWhhdmlvdXIpLlxuICAgKiAzLiBgU3ViZmxvd0V4ZWN1dG9yYCBpbnNwZWN0cyB0aGUgc3ViZmxvdydzIGV4aXQgc3RhdGUuIElmXG4gICAqICAgIGBwcm9wYWdhdGVCcmVhayA9PT0gdHJ1ZWAgQU5EIHRoZSBpbm5lciBicmVhayBmaXJlZCwgaXQgZm9yd2FyZHNcbiAgICogICAgdGhlIGJyZWFrIChhbmQgaXRzIHJlYXNvbikgdG8gdGhlIHBhcmVudCdzIGBicmVha0ZsYWdgLlxuICAgKiA0LiBUaGUgcGFyZW50IHRyYXZlcnNlciBzZWVzIGBzaG91bGRCcmVha2Agb24gaXRzIG5leHQgc3RlcCBhbmQgZXhpdHMuXG4gICAqIDUuIEEgYEZsb3dSZWNvcmRlci5vbkJyZWFrYCBldmVudCBmaXJlcyBhdCB0aGUgcGFyZW50LW1vdW50IGxldmVsIHdpdGhcbiAgICogICAgYHByb3BhZ2F0ZWRGcm9tU3ViZmxvd2AgPSB0aGUgc3ViZmxvdydzIGlkIGFuZCB0aGUgaW5uZXIgcmVhc29uLlxuICAgKlxuICAgKiAjIyBQYXJhbGxlbC9mYW4tb3V0XG4gICAqXG4gICAqIEZvbGxvd3MgdGhlIGV4aXN0aW5nIGxpYnJhcnkgcnVsZSBpbiBgQ2hpbGRyZW5FeGVjdXRvcmA6IHRoZSBwYXJlbnRcbiAgICogYnJlYWtzIG9ubHkgd2hlbiAqKmV2ZXJ5KiogY2hpbGQgb2YgYSBmb3JrIGJyb2tlLiBBIHNpbmdsZVxuICAgKiBgcHJvcGFnYXRlQnJlYWs6IHRydWVgIHN1YmZsb3cgY29udHJpYnV0aW5nIGl0cyBicmVhayB0byB0aGUgY291bnRcbiAgICogZG9lcyBub3Qgb24gaXRzIG93biB0ZXJtaW5hdGUgdGhlIHBhcmVudCBmYW4tb3V0LlxuICAgKlxuICAgKiAjIyBvdXRwdXRNYXBwZXIgc3RpbGwgcnVuc1xuICAgKlxuICAgKiBUaGUgc3ViZmxvdydzIGBvdXRwdXRNYXBwZXJgIChpZiBzdXBwbGllZCkgQUxXQVlTIHJ1bnMgYmVmb3JlIHRoZVxuICAgKiBicmVhayBwcm9wYWdhdGVzLCBzbyB0aGUgc3ViZmxvdydzIHBhcnRpYWwgc3RhdGUgaXMgc3RpbGwgd3JpdHRlbiB0b1xuICAgKiB0aGUgcGFyZW50IHNjb3BlLiBUaGlzIGlzIGludGVudGlvbmFsIOKAlCB0aGUgdHlwaWNhbCB1c2UgY2FzZSBpcyBhblxuICAgKiBcImVzY2FsYXRpb25cIiBzdWJmbG93IHdob3NlIG91dHB1dCBJUyB0aGUgZmluYWwgYW5zd2VyIHRoYXQgbmVlZHMgdG9cbiAgICogbGFuZCBpbiB0aGUgcGFyZW50IHNjb3BlIGJlZm9yZSB0aGUgb3V0ZXIgbG9vcCB0ZXJtaW5hdGVzLiBJZiB5b3VcbiAgICogd2FudCB0byBzdXBwcmVzcyBvdXRwdXQgbWFwcGluZyBvbiBicmVhaywgY2hlY2sgdGhlIGJyZWFrIHN0YXRlXG4gICAqIGluc2lkZSB5b3VyIGBvdXRwdXRNYXBwZXJgIGFuZCByZXR1cm4gYHt9YCBlYXJseS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHByb3BhZ2F0ZUJyZWFrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVjbGFyZWQgdGFncyAoOS4yMS4xKSBmb3IgdGhlIE1PVU5UIGl0c2VsZiDigJQgdGhlIE5BTUVTIHRoZSBhdXRob3IgcHV0c1xuICAgKiBvbiB0aGlzIG1vdW50IGF0IGJ1aWxkIHRpbWUsIGxhbmRlZCBieSB0aGUgc2FtZSBgYXBwbHlUYWdzYCBldmVyeSBvdGhlclxuICAgKiBgb3B0aW9ucy50YWdzYCBzaXRlIHVzZXMsIHdpdGggdGhlIHNhbWUgcmVmdXNhbHMgKGVtcHR5LCBub24tc3RyaW5nLCB0aGVcbiAgICogcmVzZXJ2ZWQgYH5gIG1hcmtlciwgYSBkdXBsaWNhdGUsIGEgc2Vjb25kIGRlY2xhcmF0aW9uKS5cbiAgICpcbiAgICogQSBtb3VudCBpcyBhIHN0YWdlIHRoYXQgY29tbWl0czogaXRzIGZpcnN0IGJ1bmRsZSBpbiB0aGUgUEFSRU5UIGxvZyBpcyBhXG4gICAqIHN0b3AgaW4gYGNvbW1pdFN0b3BzYCwgc28gYHRhZ1N0b3BzYCBrZWVwcyBpdCBsaWtlIGFueSB0YWdnZWQgc3RhZ2UgYW5kXG4gICAqIGNhcnJpZXMgdGhlc2UgbmFtZXMgYXMgYFN0b3AubWV0YWAuIFN0YW1wZWQgb24gdGhhdCBmaXJzdCBidW5kbGUgb25seVxuICAgKiAodGhlIG1vdW50J3MgZXhpdCBidW5kbGUgY2FycmllcyBub25lIOKAlCB0aGUgb25jZS1wZXItZXhlY3V0aW9uIGxhdykuXG4gICAqIFRoZSBzdWJmbG93J3MgT1dOIGxvZyBpcyB1bnRvdWNoZWQ6IGl0cyBpbm5lciBzdGFnZXMgZGVjbGFyZSB0aGVpciBvd25cbiAgICogdGFncywgYW5kIGBkcmlsbChtb3VudClgIHJlYWRzIHRob3NlIG9mZiB0aGUgaW5uZXIgbG9nLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBPTkxZIHRhZyBzaXRlIGZvciBhIGZvcmstY2hpbGQgbW91bnQgKGBhZGRTdWJGbG93Q2hhcnRgKSBvclxuICAgKiBhIGJyYW5jaCBtb3VudCAoYGFkZFN1YkZsb3dDaGFydEJyYW5jaGApIOKAlCBhZnRlciB0aG9zZSB0aGUgY3Vyc29yIHN0aWxsXG4gICAqIHBvaW50cyBhdCB0aGUgcGFyZW50LCBzbyBgLnRhZygpYCByZWZ1c2VzIHJhdGhlciB0aGFuIG1pcy1hdHRyaWJ1dGUuIEFcbiAgICogbGluZWFyIG1vdW50IChgYWRkU3ViRmxvd0NoYXJ0TmV4dGApIG1vdmVzIHRoZSBjdXJzb3IsIHNvIGAudGFnKClgIHdvcmtzXG4gICAqIHRoZXJlIHRvbzsgZGVjbGFyZSBpbiBvbmUgcGxhY2UsIG5vdCBib3RoLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC5hZGRTZWxlY3RvckZ1bmN0aW9uKCdTbG90cycsIHBpY2tTbG90cywgJ3Nsb3RzJylcbiAgICogICAuYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKCdtZW1vcnknLCBtZW1vcnlDaGFydCwgJ01lbW9yeScsIHsgdGFnczogWydzbG90Om1lbW9yeSddIH0pXG4gICAqICAgLmFkZFN1YkZsb3dDaGFydEJyYW5jaCgndG9vbHMnLCB0b29sc0NoYXJ0LCAnVG9vbHMnLCB7IHRhZ3M6IFsnc2xvdDp0b29scyddIH0pXG4gICAqIC5lbmQoKVxuICAgKiBgYGBcbiAgICovXG4gIHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJmbG93UmVzdWx0IHtcbiAgc3ViZmxvd0lkOiBzdHJpbmc7XG4gIHN1YmZsb3dOYW1lOiBzdHJpbmc7XG4gIHRyZWVDb250ZXh0OiB7XG4gICAgLyoqXG4gICAgICogVGhlIHN1YmZsb3cncyBmaW5hbCBzdGF0ZS4gVGhlIHRyYXZlcnNlcidzIHJlY29yZCBob2xkcyB0aGUgTElWRSBoZWFwXG4gICAgICog4oCUIHdoYXQgYSBwbGFpbiBgZ2V0U25hcHNob3QoKWAgYW5kIHRoZSBjaGVja3BvaW50IHNlZS4gVW5kZXJcbiAgICAgKiBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIHRoZSBleGVjdXRvciBzZXJ2ZXMgdGhlIHN1YmZsb3cncyBvd25cbiAgICAgKiByZWRhY3RlZCBtaXJyb3IgaGVyZSBpbnN0ZWFkICg5LjIwLjA7IGBoYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0c2ApLFxuICAgICAqIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCBgc3RhdGVBdGAgZm9sZHMgYGhpc3RvcnlgIHRvLlxuICAgICAqL1xuICAgIGdsb2JhbENvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHN0YWdlQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGhpc3Rvcnk6IHVua25vd25bXTtcbiAgICAvKiogVW5rbm93biB1bnRpbCBlYWNoIGNoaWxkIGludm9jYXRpb24gaGFzIGl0cyBvd24gc291cmNlIG93bmVyc2hpcCBwcm90b2NvbC4gKi9cbiAgICByZWFkb25seSByZWFkU291cmNlcz86IGltcG9ydCgnLi4vY2FwdHVyZS9yZWFkU291cmNlcy5qcycpLkVuZ2luZVJlYWRTb3VyY2VzO1xuICAgIC8qKiBJZGVudGl0eSBvZiB0aGUgbG9jYWwgaGlzdG9yeSwgbm90IGl0cyBwYXJlbnQncyBsb2cuICovXG4gICAgcmVhZG9ubHkgbG9nQWRkcmVzcz86IExvZ0FkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIHN1YmZsb3cncyBPV04gZm9sZCBiYXNlIOKAlCB0aGUgc3RhdGUgaXRzIGlzb2xhdGVkIHJ1bnRpbWUgc3RhcnRlZFxuICAgICAqIGZyb20sIGJlZm9yZSBpdHMgZmlyc3QgY29tbWl0LiBUaGUgc2libGluZyBvZlxuICAgICAqIGBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlYCwgY2FycmllZCBoZXJlIHNvIGEgc3ViZmxvdydzIGBoaXN0b3J5YFxuICAgICAqIGNhbiBiZSBmb2xkZWQgb2ZmbGluZSBleGFjdGx5IGxpa2UgdGhlIHJ1bidzIGxvZyAoYHN0YXRlQXRgLFxuICAgICAqIGB0aW1lVHJhdmVsKC4uLikuZHJpbGwobW91bnQpYCkuIEZyb3plbiBhbmQgZGV0YWNoZWQuXG4gICAgICpcbiAgICAgKiBOb3JtYWxseSBge31gOiBhIHN1YmZsb3cncyBgaW5wdXRNYXBwZXJgIHNlZWQgaXMgaXRzZWxmIHRoZSBmaXJzdFxuICAgICAqIENPTU1JVCBpbiBgaGlzdG9yeWAgKHRoZSByb290IGNvbnRleHQgY29tbWl0cyBpdCksIG5vdCBhIHByZS1ydW4gYmFzZS5cbiAgICAgKi9cbiAgICBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfTtcbiAgcGFyZW50U3RhZ2VJZDogc3RyaW5nO1xuICBwaXBlbGluZVN0cnVjdHVyZT86IHVua25vd247XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3ViZmxvdyBUcmF2ZXJzZXIgRmFjdG9yeVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnkg4oCUIENyZWF0ZXMgYSBGbG93Y2hhcnRUcmF2ZXJzZXIgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICpcbiAqIEluamVjdGVkIGludG8gU3ViZmxvd0V4ZWN1dG9yIHRvIGJyZWFrIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5OlxuICogRmxvd2NoYXJ0VHJhdmVyc2VyIOKGkiBTdWJmbG93RXhlY3V0b3Ig4oaSIEZsb3djaGFydFRyYXZlcnNlci5cbiAqXG4gKiBUaGUgZmFjdG9yeSBjYXB0dXJlcyBwYXJlbnQgdHJhdmVyc2VyIGNvbmZpZyAoc3RhZ2VNYXAsIHNjb3BlRmFjdG9yeSwgbmFycmF0aXZlLCBldGMuKVxuICogaW4gYSBjbG9zdXJlLiBTdWJmbG93RXhlY3V0b3IgY2FsbHMgaXQgd2l0aCBzdWJmbG93LXNwZWNpZmljIG92ZXJyaWRlcyAocm9vdCwgcnVudGltZSwgaW5wdXQpLlxuICogVGhlIHJldHVybmVkIHRyYXZlcnNlciB1c2VzIHRoZSBTQU1FIDctcGhhc2UgYWxnb3JpdGhtIGFzIHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2VyLFxuICogc28gZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGxhenkgc3ViZmxvd3MsIGFuZCBhYm9ydCBzaWduYWxzIGFsbCB3b3JrIGluc2lkZSBzdWJmbG93cy5cbiAqL1xuZXhwb3J0IHR5cGUgU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnk8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiA9IChvcHRpb25zOiB7XG4gIC8qKiBSb290IG5vZGUgb2YgdGhlIHN1YmZsb3cgKHdpdGggaXNTdWJmbG93Um9vdCBzdHJpcHBlZCkg4oCUIHRoZSBncmFwaCBldmVyeSBpZCBpbnNpZGUgdGhlIHN1YmZsb3cgcmVzb2x2ZXMgYWdhaW5zdC4gKi9cbiAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgd2hlbiBub3QgYXQgYHJvb3RgIOKAlCBhIHJlc3VtZSdzXG4gICAqIG9uZS1zaG90IHJlLWVudHJ5IChgUmVzdW1lSG9wLmVudHJ5YCk6IHRoZSBuZXh0IG1vdW50IG9uIHRoZSBwYXVzZSBwYXRoLFxuICAgKiBvciB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4sIGVhY2ggd2l0aCBpdHMgZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvblxuICAgKiBhdHRhY2hlZC4gVmlzaXRlZCBvbmNlLCBmaXJzdDsgbmV2ZXIgcmVzb2x2YWJsZSBieSBpZC5cbiAgICovXG4gIGVudHJ5PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRpbmcgaW4gdGhpcyBzdWJmbG93IChgUmVzdW1lSG9wLnBlbmRpbmdQYXVzZXNgLFxuICAgKiA5LjI4LjApIOKAlCByYWlzZWQgaW4gb3JkZXIgb25jZSBgZW50cnlgJ3MgY2hhaW4gZW5kcy5cbiAgICovXG4gIHBlbmRpbmdQYXVzZXM/OiByZWFkb25seSBRdWV1ZWRQYXVzZVtdO1xuICAvKiogSXNvbGF0ZWQgZXhlY3V0aW9uIHJ1bnRpbWUgZm9yIHRoZSBzdWJmbG93LiAqL1xuICBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgLyoqIE1hcHBlZCBpbnB1dCBmcm9tIHBhcmVudCBzY29wZSAoYmVjb21lcyByZWFkT25seUNvbnRleHQgZm9yIHN0YWdlcykuICovXG4gIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIg4oCUIHVzZWQgYXMgYnJhbmNoUGF0aCBmb3IgbmFycmF0aXZlIGNvbnRleHQuICovXG4gIHN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDE6IHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBzdWJmbG93IE1PVU5UIHN0YWdlIGluIHRoZSBwYXJlbnRcbiAgICogdHJhdmVyc2VyLiBCZWNvbWVzIHRoZSBgcGFyZW50UnVudGltZVN0YWdlSWRgIGZhbGxiYWNrIGZvciB0aGUgc3ViZmxvdydzXG4gICAqIHJvb3Qgc3RhZ2Ugc28gcnVudGltZSBhbmNlc3RvciBjaGFpbnMgY3Jvc3Mgc3ViZmxvdyBib3VuZGFyaWVzLlxuICAgKi9cbiAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZD86IHN0cmluZztcbn0pID0+IFN1YmZsb3dUcmF2ZXJzZXJIYW5kbGU8VE91dCwgVFNjb3BlPjtcblxuLyoqXG4gKiBIYW5kbGUgcmV0dXJuZWQgYnkgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkuXG4gKiBQcm92aWRlcyBleGVjdXRlKCkgKyBhY2Nlc3MgdG8gbmVzdGVkIHN1YmZsb3cgcmVzdWx0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWJmbG93VHJhdmVyc2VySGFuZGxlPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKiogRXhlY3V0ZSB0aGUgc3ViZmxvdydzIGdyYXBoIHVzaW5nIHRoZSBmdWxsIDctcGhhc2UgdHJhdmVyc2FsIGFsZ29yaXRobS4gKi9cbiAgZXhlY3V0ZSgpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD47XG4gIC8qKiBDb2xsZWN0IG5lc3RlZCBzdWJmbG93IHJlc3VsdHMgKGZyb20gc3ViZmxvd3MgbW91bnRlZCBpbnNpZGUgdGhpcyBzdWJmbG93KS4gKi9cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD47XG4gIC8qKlxuICAgKiBGaW5hbCBicmVhayBzdGF0ZSBvZiB0aGUgc3ViZmxvdyBhZnRlciBgZXhlY3V0ZSgpYCByZXR1cm5zLlxuICAgKlxuICAgKiAgIC0gYHNob3VsZEJyZWFrOiB0cnVlYCAg4oaSIGEgc3RhZ2UgaW5zaWRlIHRoZSBzdWJmbG93IGNhbGxlZFxuICAgKiAgICAgYHNjb3BlLiRicmVhayhyZWFzb24pYCwgc3RvcHBpbmcgdGhlIHN1YmZsb3cncyBvd24gdHJhdmVyc2FsLlxuICAgKiAgIC0gYHJlYXNvbmAgICAgICAgICAgICAg4oaSIHRoZSBvcHRpb25hbCBzdHJpbmcgcGFzc2VkIHRvIGAkYnJlYWtgLlxuICAgKlxuICAgKiBVc2VkIGJ5IGBTdWJmbG93RXhlY3V0b3JgIHRvIGltcGxlbWVudCBgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVha2A6XG4gICAqIGlmIHRoZSBtb3VudCBvcHRzIGluIEFORCB0aGUgc3ViZmxvdyBicm9rZSwgdGhlIHBhcmVudCdzIGJyZWFrIGZsYWcgaXNcbiAgICogZm9yd2FyZGVkLlxuICAgKi9cbiAgZ2V0QnJlYWtTdGF0ZSgpOiB7IHNob3VsZEJyZWFrOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeGVjdXRpb24gUnVudGltZSBJbnRlcmZhY2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIElFeGVjdXRpb25SdW50aW1lIOKAlCBJbnRlcmZhY2UgZm9yIHRoZSBydW50aW1lIGVudmlyb25tZW50LlxuICpcbiAqIERlZmluZXMgdGhlIGNvbnRyYWN0IHRoYXQgZW5naW5lIGhhbmRsZXJzIG5lZWQgZnJvbSB0aGUgcnVubmVyIGxheWVyLFxuICogYXZvaWRpbmcgY2lyY3VsYXIgaW1wb3J0cyBiZXR3ZWVuIGVuZ2luZS8gYW5kIHJ1bm5lci8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4ZWN1dGlvblJ1bnRpbWUge1xuICBnbG9iYWxTdG9yZTogeyBnZXRTdGF0ZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuICAvKipcbiAgICogVGhlIHJlZGFjdGVkIG1pcnJvciBvZiBgZ2xvYmFsU3RvcmVgIOKAlCBwcmVzZW50IHdoZW4gdGhlIHJ1bidzIHBvbGljeVxuICAgKiBrZWVwcyBvbmUgKGBSdW5Qb2xpY3kubWlycm9yYDogYSBydW4gd2l0aCBhIHJlZGFjdGlvbiBwb2xpY3kpLCBlbHNlIGFic2VudC5cbiAgICogYFN1YmZsb3dFeGVjdXRvcmAgcmVhZHMgaXQgdG8gc2VydmUgYSBzdWJmbG93J3Mgc3RhdGUgKDkuMjAuMCkuXG4gICAqL1xuICByZWRhY3RlZFN0b3JlPzogU2hhcmVkTWVtb3J5O1xuICByb290U3RhZ2VDb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIGV4ZWN1dGlvbkhpc3Rvcnk6IHsgbGlzdCgpOiB1bmtub3duW10gfTtcbiAgLyoqXG4gICAqIEEgZnJlc2ggcm9vdCBmcmFtZSBvbiB0aGlzIHJ1bnRpbWUg4oCUIGl0cyBzdG9yZSwgaXRzIGxvZywgdGhlIHJ1bidzIHBvbGljeVxuICAgKiBhbmQgbWlycm9yIChgRXhlY3V0aW9uUnVudGltZS5uZXdSb290YCkuIGBTdWJmbG93RXhlY3V0b3JgIHN3YXBzIGFcbiAgICogc3ViZmxvdydzIHNlZWQgZnJhbWUgZm9yIHRoZSBmcmFtZSBpdHMgZmlyc3Qgc3RhZ2UgcnVucyBvbiB3aXRoIGl0LlxuICAgKi9cbiAgbmV3Um9vdChuYW1lOiBzdHJpbmcsIGlkOiBzdHJpbmcpOiBTdGFnZUNvbnRleHQ7XG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSk6IHtcbiAgICBzaGFyZWRTdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZXhlY3V0aW9uVHJlZTogdW5rbm93bjtcbiAgICAvKiogVGhlIGNvbW1pdCBsb2cncyBmb2xkIGJhc2Ug4oCUIHNlZSBgUnVudGltZVNuYXBzaG90LmluaXRpYWxTdGF0ZWAuICovXG4gICAgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29tbWl0TG9nOiB1bmtub3duW107XG4gICAgcmVhZG9ubHkgcmVhZFNvdXJjZXM/OiBpbXBvcnQoJy4uL2NhcHR1cmUvcmVhZFNvdXJjZXMuanMnKS5FbmdpbmVSZWFkU291cmNlcztcbiAgICByZWFkb25seSBsb2dBZGRyZXNzPzogTG9nQWRkcmVzcztcbiAgICAvKiogRHVhbC1rZXllZCBieSBzdWJmbG93IHBhdGggKGxhc3QgaXRlcmF0aW9uKSBBTkQgcGVyLWV4ZWN1dGlvbiBtb3VudCBydW50aW1lU3RhZ2VJZFxuICAgICAqICAoZWFjaCBpdGVyYXRpb24pIOKAlCBzZWUgUnVudGltZVNuYXBzaG90LnN1YmZsb3dSZXN1bHRzIC8gc3ViZmxvdy1jb21taXQtdmlzaWJpbGl0eS4gKi9cbiAgICBzdWJmbG93UmVzdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJlY29yZGVycz86IEFycmF5PHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBkYXRhOiB1bmtub3duIH0+O1xuICB9O1xuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkO1xuICBnZXRQaXBlbGluZXMoKTogc3RyaW5nW107XG4gIC8qKlxuICAgKiBXaGVyZSBhIG1vdW50J3Mgb3duIGxvZyB3cml0ZXMgYXMgaXQgbGFuZHMgKDEwLjEsIFA2KSDigJQgdGhlIHJ1bidzIHNpbmsgYXQgdGhpcyBsb2cncyBhZGRyZXNzIHBsdXMgdGhlIG1vdW50J3NcbiAgICogYHJ1bnRpbWVTdGFnZUlkYC4gYHVuZGVmaW5lZGAgd2hlbiB0aGlzIHJ1bnRpbWUncyBsb2cgd3JpdGVzIHRvIG5vIHNpbmsuIGBTdWJmbG93RXhlY3V0b3JgIGhhbmRzIGl0IHRvIHRoZVxuICAgKiBuZXN0ZWQgcnVudGltZSBpdCBjb25zdHJ1Y3RzLlxuICAgKi9cbiAgcmVjb3JkRm9yPyhtb3VudFJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIG1ldGE/OiBNZXRhKTogdW5rbm93bjtcbiAgLyoqIFRlbGwgdGhlIHNpbmsgdGhpcyBydW50aW1lJ3MgbG9nIGVuZGVkICgxMC4xLCBQNikg4oCUIGEgbW91bnQncyBhdCBpdHMgZXhpdC4gTm8tb3Agd2l0aG91dCBhIHNpbmsuICovXG4gIGNsb3NlUmVjb3JkPyhvdXRjb21lOiBMb2dPdXRjb21lLCBtZXRhPzogTWV0YSk6IHZvaWQ7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXhlY3V0aW9uIEVudmlyb25tZW50IOKAlCByZWFkLW9ubHksIHByb3BhZ2F0ZXMgdGhyb3VnaCBuZXN0ZWQgZXhlY3V0b3JzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBFeGVjdXRpb25FbnYg4oCUIGluZnJhc3RydWN0dXJlIHZhbHVlcyB0aGF0IHByb3BhZ2F0ZSB0aHJvdWdoIG5lc3RlZCBleGVjdXRvcnMuXG4gKlxuICogTGlrZSBgcHJvY2Vzcy5lbnZgIGZvciBmbG93Y2hhcnRzOiByZWFkLW9ubHksIGluaGVyaXRlZCBieSBjaGlsZCBleGVjdXRvcnMsXG4gKiBpbmZyYXN0cnVjdHVyZS1vbmx5IChub3QgYnVzaW5lc3MgbG9naWMpLlxuICpcbiAqIExpdG11cyB0ZXN0OiBDcmVhdGVkIGV4dGVybmFsIHRvIHRoZSBmbG93Y2hhcnQgKyBwYXNzZWQgaW4gZm9yIGV4ZWN1dGlvbiA9IGVudi5cbiAqIEJ1c2luZXNzIGNvbmZpZyBmb3IgYSBzcGVjaWZpYyBmbG93Y2hhcnQgPSBhcmdzIChnZXRBcmdzKCkpLlxuICpcbiAqIEludGVudGlvbmFsbHkgYSBjbG9zZWQgdHlwZSDigJQgbm90IGV4dGVuc2libGUgdG8gcHJldmVudCBjb3VwbGluZyBiZXR3ZWVuXG4gKiBwYXJlbnQgYW5kIGNoaWxkIGZsb3djaGFydHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uRW52IHtcbiAgLyoqXG4gICAqIEFib3J0U2lnbmFsIGZvciBjb29wZXJhdGl2ZSBjYW5jZWxsYXRpb24gYWNyb3NzIG5lc3RlZCBleGVjdXRvcnMuIEhvbm91cmVkIGJ5IHRoZSBlbmdpbmUgKDEwLjEpOiBpdCBlbmRzIHRoZVxuICAgKiBydW4gbGlrZSBgUnVuT3B0aW9ucy5zaWduYWxgLiBVbmRlciBhIHJ1biB0aGF0IGhhcyBhIHNpZ25hbCBvciBhIGRlYWRsaW5lIEFORCBhbiBlbnYsIGEgc3RhZ2UgcmVhZHMgdGhlIHJ1bidzXG4gICAqIE9ORSBlZmZlY3RpdmUgc2lnbmFsIGhlcmUg4oCUIGBSdW5PcHRpb25zLnNpZ25hbGAsIHRoaXMgb25lIGFuZCB0aGUgZGVhZGxpbmUncyB0aW1lciwgY29tcG9zZWQuXG4gICAqL1xuICByZWFkb25seSBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqIFRpbWVvdXQgYnVkZ2V0IGluIG1pbGxpc2Vjb25kcy4gUmVhZGFibGUgb25seSDigJQgdGhlIHJ1bidzIGRlYWRsaW5lIGlzIHtAbGluayBkZWFkbGluZX0uICovXG4gIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRyYWNlIGlkZW50aWZpZXIgZm9yIGRpc3RyaWJ1dGVkIHRyYWNpbmcgLyBvYnNlcnZhYmlsaXR5LiBXaXRoIGBvcGVyYXRpb25JZGAgKG9yIGFsb25lKSBpdCBiZWNvbWVzIHRoZSBydW4nc1xuICAgKiBgUnVuQ29ycmVsYXRpb25gOyBpdCB3aW5zIG92ZXIgdGhlIHRyYWNlIGlkIG9mIGB0cmFjZXBhcmVudGAuIDHigJMyNTYgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlcnMgd2l0aCBubyBzcGFjZVxuICAgKiAoc2luY2UgMTAuMSBhbnl0aGluZyBlbHNlIHJlamVjdHMgdGhlIHJ1biB3aXRoIGEgYFR5cGVFcnJvcmAgbmFtaW5nIHRoZSBmaWVsZCDigJQgdGhlIGlkIHJpZGVzIGV2ZXJ5IGV2ZW50KTtcbiAgICogYW4gZW1wdHkgc3RyaW5nIGlzIG5vIGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhY2VJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjYWxsZXIncyB1bml0IG9mIHdvcmsgKFczQydzIHBhcmVudC1pZCkg4oCUIHBhcnQgb2YgdGhlIHJ1bidzIGBSdW5Db3JyZWxhdGlvbmA7IHdpbnMgb3ZlciB0aGUgaGVhZGVyJ3NcbiAgICogcGFyZW50LWlkLiBOZWVkcyBhIHRyYWNlOiBgdHJhY2VJZGAgb3IgYHRyYWNlcGFyZW50YCAocmVmdXNlZCBhbG9uZSkuIFNhbWUgY2hhcmFjdGVyIHJ1bGUgYXMgYHRyYWNlSWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIFczQyBgdHJhY2VwYXJlbnRgIGhlYWRlciwgdXN1YWxseSBzdHJhaWdodCBmcm9tIGFuIGluYm91bmQgcmVxdWVzdC4gUGFyc2VkIFNUUklDVExZIG9uY2UgcGVyIHJ1biDigJQgYVxuICAgKiBtYWxmb3JtZWQgb25lIHJlZnVzZXMgdGhlIHJ1biB3aXRoIGEgYFRyYWNlcGFyZW50RXJyb3JgIG5hbWluZyB0aGUgcmVhc29uIChuZXZlciB0aGUgaGVhZGVyKS4gU3RhZ2VzIHJlYWRcbiAgICogYmFjayAoYCRnZXRFbnYoKWApIGV4YWN0bHkgYFJ1bkNvcnJlbGF0aW9uLnRyYWNlcGFyZW50YCDigJQgdGhlIGNhbm9uaWNhbCBoZWFkZXIgb2YgdGhlIGVmZmVjdGl2ZSBpZHMg4oCUIG9yIG5vXG4gICAqIGtleSB3aGVuIHRoZSBydW4ncyBjb3JyZWxhdGlvbiBjYXJyaWVzIG5vbmUuIENvcnJlbGF0aW9uIG9ubHk6IG5ldmVyIGlkZW50aXR5IG9yIGF1dGhvcmlzYXRpb24uXG4gICAqL1xuICByZWFkb25seSB0cmFjZXBhcmVudD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBydW4ncyBkZWFkbGluZSwgZXBvY2ggbWlsbGlzZWNvbmRzICgxMC4xKSDigJQgdGhlIGVhcmxpZXN0IG9mIGBSdW5PcHRpb25zLmRlYWRsaW5lYCwgYG5vdyArIFJ1bk9wdGlvbnMudGltZW91dE1zYFxuICAgKiBhbmQgYSBkZWFkbGluZSBnaXZlbiBoZXJlLiBUaGUgcnVuJ3Mgc2lnbmFsIGFib3J0cyB3aGVuIGl0IHBhc3NlczsgZXZlcnkgYXR0ZW1wdCBpcyBjYXBwZWQgYnkgdGhlIHRpbWUgbGVmdC5cbiAgICogSW5oZXJpdGVkIGJ5IHN1YmZsb3dzLiBSZWFkIGl0IHRocm91Z2ggYHNjb3BlLiRhdHRlbXB0KCkudGltZUxlZnRNcygpYC5cbiAgICovXG4gIHJlYWRvbmx5IGRlYWRsaW5lPzogbnVtYmVyO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhhbmRsZXIgRGVwZW5kZW5jaWVzIChESSBiYWcpIOKAlCB3YXMgUGlwZWxpbmVDb250ZXh0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIYW5kbGVyRGVwcyDigJQgRGVwZW5kZW5jeSBpbmplY3Rpb24gYmFnIHBhc3NlZCB0byBhbGwgaGFuZGxlciBtb2R1bGVzLlxuICpcbiAqIFByb3ZpZGVzIHNoYXJlZCBzdGF0ZSAoc3RhZ2VNYXAsIHJ1bnRpbWUsIHNjb3BlRmFjdG9yeSwgZXRjLikgd2l0aG91dFxuICogaGFuZGxlcnMgbmVlZGluZyB0byBpbXBvcnQgdGhlIHRyYXZlcnNlciBkaXJlY3RseS4gQXZvaWRzIGNpcmN1bGFyIGRlcHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGFuZGxlckRlcHM8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHN0YWdlTWFwOiBNYXA8c3RyaW5nLCBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4+O1xuICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgZXhlY3V0aW9uUnVudGltZTogSUV4ZWN1dGlvblJ1bnRpbWU7XG4gIHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT47XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgc2NvcGVQcm90ZWN0aW9uTW9kZTogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcHJvcGFnYXRlcyB0byBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LiAqL1xuICBleGVjdXRpb25FbnY/OiBFeGVjdXRpb25FbnY7XG4gIG5hcnJhdGl2ZUdlbmVyYXRvcjogSUNvbnRyb2xGbG93TmFycmF0aXZlO1xuICBsb2dnZXI6IElMb2dnZXI7XG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChNMikg4oCUIHNoYXJlZCBieSByZWZlcmVuY2Ugd2l0aCBldmVyeVxuICAgKiBuZXN0ZWQgdHJhdmVyc2VyLCBsaWtlIHRoZSBleGVjdXRpb24gY291bnRlci4gYFN1YmZsb3dFeGVjdXRvcmAgYXNrcyBpdFxuICAgKiBhdCBlYWNoIHN1YmZsb3cgZW50cnk6IHRoZSBGSVJTVCBlbnRyeSBpbnRvIGEgc3ViZmxvdyBvbiB0aGUgcGF1c2UgcGF0aFxuICAgKiB0YWtlcyB0aGF0IHN1YmZsb3cncyBjYXB0dXJlZCBzdGF0ZSAoc2VlZGluZyB0aGUgbmVzdGVkIHJ1bnRpbWUgaW4gcGxhY2VcbiAgICogb2YgdGhlIGlucHV0TWFwcGVyJ3MgdmFsdWVzIOKAlCB0aGUgbWFwcGVyIHN0aWxsIHJ1bnMgZm9yIHRoZSByZWFkLW9ubHlcbiAgICogYXJncyksIGl0cyBlbnRyeSBwb2ludCBhbmQgYW55IHNpYmxpbmcgcGF1c2VzIHdhaXRpbmcgdGhlcmU7IGV2ZXJ5IGxhdGVyXG4gICAqIGVudHJ5IGlzIGFuIG9yZGluYXJ5IG9uZS4gU2VlIGBSZXN1bWVFbnRyeWAuIFVuZGVmaW5lZCBvbiBub3JtYWwgYHJ1bigpYFxuICAgKiBwYXRocy5cbiAgICovXG4gIHJlc3VtZT86IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT47XG59XG5cbi8qKiBPcHRpb25zIGZvciBGbG93Q2hhcnRFeGVjdXRvci5ydW4oKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuT3B0aW9ucyB7XG4gIC8qKiBBYm9ydFNpZ25hbCBmb3IgY29vcGVyYXRpdmUgY2FuY2VsbGF0aW9uLiBDb21wb3NlZCB3aXRoIGBlbnYuc2lnbmFsYCBhbmQgdGhlIGRlYWRsaW5lICgxMC4xKS4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKlxuICAgKiBUaW1lb3V0IGluIG1pbGxpc2Vjb25kczogdGhlIHJ1bidzIGRlYWRsaW5lIGlzIGBub3cgKyB0aW1lb3V0TXNgLiBUaGUgcnVuIGFib3J0cyB3aGVuIGl0IHBhc3NlcyAocmVqZWN0aW5nIHdpdGhcbiAgICogYEV4ZWN1dGlvbiB0aW1lZCBvdXQgYWZ0ZXIgPHRpbWVvdXRNcz5tc2ApLCBzdGFnZXMgcmVhZCBpdCBhcyBgZW52LmRlYWRsaW5lYCwgYW5kIGV2ZXJ5IHN0YWdlIHJlY29yZHMgaXRzXG4gICAqIGF0dGVtcHQgKGBTdGFnZVNuYXBzaG90LmF0dGVtcHRzYCkuIEhvbm91cmVkIGJlc2lkZSBhIGBzaWduYWxgIHNpbmNlIDEwLjEgKGl0IHVzZWQgdG8gYmUgaWdub3JlZCB0aGVyZSkuXG4gICAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgZGVhZGxpbmUsIGVwb2NoIG1pbGxpc2Vjb25kcyAoMTAuMSkg4oCUIGBEYXRlLm5vdygpICsgMTIwXzAwMGAuIFNhbWUgZWZmZWN0IGFzIGB0aW1lb3V0TXNgOyB3aGVuIGJvdGhcbiAgICogYXJlIGdpdmVuLCB0aGUgZWFybGllciB3aW5zLiBBIGRlYWRsaW5lIGFscmVhZHkgcGFzdCBzdG9wcyB0aGUgcnVuIGJlZm9yZSBpdHMgZmlyc3Qgc3RhZ2UuIEEgcmVzdW1lZCBsZWcgaGFzXG4gICAqIGl0cyBvd246IHBhc3MgaXQgYWdhaW4gdG8gYHJlc3VtZSgpYC5cbiAgICovXG4gIGRlYWRsaW5lPzogbnVtYmVyO1xuICAvKipcbiAgICogUnVudGltZSBpbnB1dCBkYXRhIGZvciB0aGUgcGlwZWxpbmUuXG4gICAqIEJlY29tZXMgdGhlIHJlYWRPbmx5Q29udGV4dCBhY2Nlc3NpYmxlIHZpYSBgc2NvcGUuZ2V0QXJncygpYC5cbiAgICogU3RhZ2VzIGNhbm5vdCBvdmVyd3JpdGUgdGhlc2Uga2V5cyB3aXRoIGBzZXRWYWx1ZSgpYC5cbiAgICovXG4gIGlucHV0PzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV4ZWN1dGlvbiBlbnZpcm9ubWVudCDigJQgcmVhZC1vbmx5IGluZnJhc3RydWN0dXJlIHZhbHVlcyB0aGF0IHByb3BhZ2F0ZVxuICAgKiB0aHJvdWdoIG5lc3RlZCBleGVjdXRvcnMgKGxpa2UgYHByb2Nlc3MuZW52YCBmb3IgZmxvd2NoYXJ0cykuXG4gICAqIEFjY2Vzc2libGUgdmlhIGBzY29wZS5nZXRFbnYoKWAuIEluaGVyaXRlZCBieSBzdWJmbG93cyBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgZW52PzogRXhlY3V0aW9uRW52O1xuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIG1heGltdW0gbmVzdGVkIGBleGVjdXRlTm9kZWAgZGVwdGggZm9yIHRoaXMgcnVuLlxuICAgKiBEZWZhdWx0cyB0byBgRmxvd2NoYXJ0VHJhdmVyc2VyLk1BWF9FWEVDVVRFX0RFUFRIYCAoNTAwKS5cbiAgICpcbiAgICogRGVwdGggY291bnRzIFRSRUUgbmVzdGluZyBvbmx5IOKAlCBmb3JrIGNoaWxkcmVuLCBkZWNpZGVyL3NlbGVjdG9yIGJyYW5jaFxuICAgKiBkaXNwYXRjaCwgcmVjdXJzaXZlIGNvbXBvc2l0aW9uLiBMaW5lYXIgY2hhaW5zIGFuZCBsb29wIGl0ZXJhdGlvbnMgcnVuXG4gICAqIG9uIGEgZmxhdCB0cmFtcG9saW5lIGFuZCBuZXZlciBjb25zdW1lIGRlcHRoLCBzbyB0aGlzIHJhcmVseSBuZWVkc1xuICAgKiByYWlzaW5nLiBNdXN0IGJlID49IDEuXG4gICAqL1xuICBtYXhEZXB0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBtYXhpbXVtIGxvb3AgaXRlcmF0aW9ucyBwZXIgbm9kZSBmb3IgdGhpcyBydW4gKHRoZVxuICAgKiBgQ29udGludWF0aW9uUmVzb2x2ZXJgIGluZmluaXRlLWxvb3AgZ3VhcmQpLiBEZWZhdWx0cyB0byAxMDAwLlxuICAgKiBUaGlzIGlzIHRoZSBiaW5kaW5nIGNvbnN0cmFpbnQgZm9yIGxvb3AtaGVhdnkgcGlwZWxpbmVzIOKAlCByYWlzZSBpdCBmb3JcbiAgICogbGVnaXRpbWF0ZWx5IGxvbmcgbG9vcHMgKGBsb29wVG9gIGNoYWlucyBydW4gd2l0aCBhIGZsYXQgc3RhY2ssIHNvIGhpZ2hcbiAgICogdmFsdWVzIGFyZSBzYWZlOyBtZW1vcnkgZm9yIHN0YXRlL25hcnJhdGl2ZSBzdGlsbCBncm93cyBwZXIgaXRlcmF0aW9uKS5cbiAgICogQWxzbyBib3VuZHMgdGhlIHJ1bi10b3RhbCBjaGFpbiBvZiBmdW5jdGlvbi1iZWFyaW5nIGR5bmFtaWMgYG5leHRgXG4gICAqIGNvbnRpbnVhdGlvbnMgKGZyZXNoIG5vZGVzIHJldHVybmVkIGZyb20gc3RhZ2VzKSDigJQgYSBydW5hd2F5IGR5bmFtaWNcbiAgICogY2hhaW4gZXJyb3JzIGluc3RlYWQgb2YgcnVubmluZyBmb3JldmVyLlxuICAgKiBQcm9wYWdhdGVzIHRvIHN1YmZsb3dzLiBNdXN0IGJlID49IDEuXG4gICAqL1xuICBtYXhJdGVyYXRpb25zPzogbnVtYmVyO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZsb3cgQ29udHJvbCBOYXJyYXRpdmUg4oCUIGNhbm9uaWNhbCBkZWZpbml0aW9ucyBsaXZlIGluIG1lbW9yeS90eXBlcy50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIHsgRmxvd0NvbnRyb2xUeXBlLCBGbG93TWVzc2FnZSB9O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJ1bnRpbWUgU3RydWN0dXJlIE1ldGFkYXRhICh1c2VkIGJ5IFJ1bnRpbWVTdHJ1Y3R1cmVNYW5hZ2VyKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZVN0cnVjdHVyZU1ldGFkYXRhIHtcbiAgdHlwZTogJ3N0YWdlJyB8ICdkZWNpZGVyJyB8ICdzZWxlY3RvcicgfCAnZm9yaycgfCAnc3RyZWFtaW5nJyB8ICdzdWJmbG93JyB8ICdsb29wJztcbiAgc3ViZmxvd0lkPzogc3RyaW5nO1xuICBpc1N1YmZsb3dSb290PzogYm9vbGVhbjtcbiAgc3ViZmxvd05hbWU/OiBzdHJpbmc7XG4gIC8qKiBUcnVlIGZvciBhbiBgYWRkUGFyYWxsZWxGb3JFYWNoYCBmYW4tb3V0ICh0eXBlIHN0YXlzIGAnZm9yaydgKS4gKi9cbiAgaXNEeW5hbWljUGFyYWxsZWw/OiBib29sZWFuO1xuICBpc1BhcmFsbGVsQ2hpbGQ/OiBib29sZWFuO1xuICBwYXJhbGxlbEdyb3VwSWQ/OiBzdHJpbmc7XG4gIGxvb3BUYXJnZXQ/OiBzdHJpbmc7XG4gIGlzRHluYW1pYz86IGJvb2xlYW47XG4gIGlzTG9vcFJlZmVyZW5jZT86IGJvb2xlYW47XG4gIHN0cmVhbUlkPzogc3RyaW5nO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE5vZGUgUmVzdWx0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IHR5cGUgTm9kZVJlc3VsdFR5cGUgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIHJlc3VsdDogdW5rbm93bjtcbiAgaXNFcnJvcj86IGJvb2xlYW47XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4ZWN1dGlvbiBSZXNwb25zZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIEJyYW5jaFJlc3VsdCA9IHtcbiAgcmVzdWx0OiBzdHJpbmcgfCBFcnJvcjtcbiAgaXNFcnJvcjogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEJyYW5jaFJlc3VsdHMgPSB7IFticmFuY2hJZDogc3RyaW5nXTogQnJhbmNoUmVzdWx0IH07XG5leHBvcnQgdHlwZSBUcmF2ZXJzYWxSZXN1bHQgPSBCcmFuY2hSZXN1bHRzIHwgc3RyaW5nIHwgRXJyb3I7XG5cbi8qKiBSZXR1cm5lZCBieSBydW4oKS9yZXN1bWUoKSB3aGVuIGV4ZWN1dGlvbiBwYXVzZXMuICovXG5leHBvcnQgdHlwZSBQYXVzZWRSZXN1bHQgPSB7XG4gIHJlYWRvbmx5IHBhdXNlZDogdHJ1ZTtcbiAgcmVhZG9ubHkgY2hlY2twb2ludDogaW1wb3J0KCcuLi9wYXVzZS90eXBlcy5qcycpLkZsb3djaGFydENoZWNrcG9pbnQ7XG59O1xuXG4vKiogRnVsbCByZXR1cm4gdHlwZSBvZiBGbG93Q2hhcnRFeGVjdXRvci5ydW4oKSBhbmQgcmVzdW1lKCkuICovXG5leHBvcnQgdHlwZSBFeGVjdXRvclJlc3VsdCA9IFRyYXZlcnNhbFJlc3VsdCB8IFBhdXNlZFJlc3VsdDtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXJpYWxpemVkIFBpcGVsaW5lIFN0cnVjdHVyZSAoZm9yIHZpc3VhbGl6YXRpb24pXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkUGlwZWxpbmVOb2RlIHtcbiAgbmFtZTogc3RyaW5nO1xuICBpZDogc3RyaW5nO1xuICB0eXBlPzpcbiAgICB8ICdzdGFnZSdcbiAgICB8ICdkZWNpZGVyJ1xuICAgIHwgJ3NlbGVjdG9yJ1xuICAgIHwgJ2ZvcmsnXG4gICAgfCAnc3RyZWFtaW5nJ1xuICAgIHwgJ3N1YmZsb3cnXG4gICAgfCAnbG9vcCdcbiAgICB8ICd1c2VyJ1xuICAgIHwgJ3Rvb2wnXG4gICAgfCAnZnVuY3Rpb24nXG4gICAgfCAnc2VxdWVuY2UnO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgY2hpbGRyZW4/OiBTZXJpYWxpemVkUGlwZWxpbmVOb2RlW107XG4gIG5leHQ/OiBTZXJpYWxpemVkUGlwZWxpbmVOb2RlO1xuICBicmFuY2hlcz86IFJlY29yZDxzdHJpbmcsIFNlcmlhbGl6ZWRQaXBlbGluZU5vZGU+O1xuICBoYXNEZWNpZGVyPzogYm9vbGVhbjtcbiAgaGFzU2VsZWN0b3I/OiBib29sZWFuO1xuICBoYXNTdWJ0cmVlPzogYm9vbGVhbjtcbiAgaXNTdHJlYW1pbmc/OiBib29sZWFuO1xuICBzdHJlYW1JZD86IHN0cmluZztcbiAgaXNTdWJmbG93Um9vdD86IGJvb2xlYW47XG4gIHN1YmZsb3dJZD86IHN0cmluZztcbiAgc3ViZmxvd05hbWU/OiBzdHJpbmc7XG4gIGxvb3BUYXJnZXQ/OiBzdHJpbmc7XG4gIGlzTG9vcFJlZmVyZW5jZT86IGJvb2xlYW47XG4gIGlzUGFyYWxsZWxDaGlsZD86IGJvb2xlYW47XG4gIHBhcmFsbGVsR3JvdXBJZD86IHN0cmluZztcbiAgaXNEeW5hbWljPzogYm9vbGVhbjtcbiAgLyoqIFdoZW4gdHJ1ZSwgdGhpcyBzdGFnZSBjYW4gcGF1c2UgZXhlY3V0aW9uIChQYXVzYWJsZUhhbmRsZXIgcGF0dGVybikuICovXG4gIGlzUGF1c2FibGU/OiBib29sZWFuO1xuICAvKipcbiAgICogVHJ1ZSBmb3IgYW4gYGFkZFBhcmFsbGVsRm9yRWFjaGAgZmFuLW91dCDigJQgYnJhbmNoIENPVU5UIGRlY2lkZWQgYXQgcnVudGltZVxuICAgKiBmcm9tIHRoZSBwYXlsb2FkLiBBIGZsYWcsIG5vdCBhIHR5cGU6IGB0eXBlYCBzdGF5cyBgJ2ZvcmsnYCBzbyBldmVyeVxuICAgKiBleGlzdGluZyBjb25zdW1lciByZW5kZXJzIGl0IGNvcnJlY3RseSAoaXQgSVMgYSBmYW4tb3V0KSwgYW5kIGEgY29uc3VtZXJcbiAgICogdGhhdCB3YW50cyB0byBzYXkgXCJvbmUgYnJhbmNoIHBlciBpdGVtXCIgY2FuIHJlYWQgdGhpcy5cbiAgICovXG4gIGlzRHluYW1pY1BhcmFsbGVsPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRvdGFsIGF0dGVtcHRzIHRoaXMgc3RhZ2UncyBmdW5jdGlvbiBtYXkgcnVuLCBmcm9tIGl0cyBkZWNsYXJlZFxuICAgKiB7QGxpbmsgUmV0cnlQb2xpY3l9LiBQcmVzZW50IG9ubHkgd2hlbiBhIHBvbGljeSB3YXMgZGVjbGFyZWQuIFRoZSBDT1VOVFxuICAgKiBvbmx5IOKAlCBgYmFja29mZk1zYCBhbmQgYHJldHJ5T25gIGNhbiBiZSBmdW5jdGlvbnMsIHdoaWNoIGEgSlNPTi1zYWZlIHNwZWNcbiAgICogY2Fubm90IGNhcnJ5LlxuICAgKi9cbiAgcmV0cnlBdHRlbXB0cz86IG51bWJlcjtcbiAgLyoqXG4gICAqIERlY2xhcmVkIHRhZ3MgKDkuMjEuMCkg4oCUIHRoZSBuYW1lcyB0aGUgYXV0aG9yIHB1dCBvbiB0aGlzIHN0YWdlIGF0IGJ1aWxkXG4gICAqIHRpbWUsIGNvcGllZCBhcy1pcy4gRnJlZSBzdHJpbmdzOyBmb290cHJpbnRqcyBhc3NpZ25zIHRoZW0gbm8gbWVhbmluZy5cbiAgICogQWJzZW50IHdoZW4gdGhlIHN0YWdlIGRlY2xhcmVzIG5vbmUuXG4gICAqL1xuICB0YWdzPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmxvd0NoYXJ0IGlzIGRlZmluZWQgaW4gYC4uL2J1aWxkZXIvdHlwZXMudHNgLiBUaGUgZW5naW5lIGxheWVyIGNvbnN1bWVzIGl0XG4vLyB2aWEgaW1wb3J0IGZyb20gdGhlcmUuIEEgZHVwbGljYXRlIG1pbmltYWwgZGVmaW5pdGlvbiBwcmV2aW91c2x5IGxpdmVkIGhlcmVcbi8vIGFuZCBjYXVzZWQgVFMgY29uZnVzaW9uIGF0IGNvbXBvc2l0aW9uIGJvdW5kYXJpZXMgKENvbXBvc2FibGVSdW5uZXIgdnNcbi8vIGFkZFN1YkZsb3dDaGFydCBwYXJhbWV0ZXIpLiBTaW5nbGUgc291cmNlIG9mIHRydXRoIG5vdyBsaXZlcyBpbiBidWlsZGVyLy5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQWxpYXMgZm9yIFNlcmlhbGl6ZWRQaXBlbGluZU5vZGUgdXNlZCBhcyBmdWxsIHN0cnVjdHVyZSAqL1xuZXhwb3J0IHR5cGUgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlID0gU2VyaWFsaXplZFBpcGVsaW5lTm9kZSAmIHtcbiAgYnJhbmNoSWRzPzogc3RyaW5nW107XG4gIHN1YmZsb3dTdHJ1Y3R1cmU/OiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmU7XG4gIGl0ZXJhdGlvbkNvdW50PzogbnVtYmVyO1xufTtcbiJdfQ==
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQWlCSCxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQWU5RSxvQ0FBb0M7QUFDcEMsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBWTtJQUNwQyxJQUFJLEVBQUUsQ0FBQyxPQUFhLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3ZFLEdBQUcsRUFBRSxDQUFDLE9BQWEsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDckUsS0FBSyxFQUFFLENBQUMsT0FBYSxFQUFFLEdBQUcsSUFBVyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQztJQUN6RSxLQUFLLEVBQUUsQ0FBQyxPQUFhLEVBQUUsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBQ3pFLElBQUksRUFBRSxDQUFDLE9BQWEsRUFBRSxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7Q0FDeEUsQ0FBQztBQXVIRiw4RUFBOEU7QUFDOUUsVUFBVTtBQUNWLDhFQUE4RTtBQUU5RTs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGNBS1g7QUFMRCxXQUFZLGNBQWM7SUFDeEIsd0ZBQXdGO0lBQ3hGLG1DQUFpQixDQUFBO0lBQ2pCLHlFQUF5RTtJQUN6RSxxQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsY0FBYyxLQUFkLGNBQWMsUUFLekIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHR5cGVzLnRzIOKAlCBBbGwgdHlwZSBkZWZpbml0aW9ucyBmb3IgdGhlIGVuZ2luZSBsaWJyYXJ5LlxuICpcbiAqIENlbnRyYWxpemVzIHR5cGUgZGVmaW5pdGlvbnMgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLlxuICogRXZlcnkgaGFuZGxlciByZWNlaXZlcyBIYW5kbGVyRGVwcyAodGhlIERJIGJhZykgaW5zdGVhZCBvZiBpbXBvcnRpbmcgdGhlIHRyYXZlcnNlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IExvZ0FkZHJlc3MsIExvZ091dGNvbWUsIE1ldGEgfSBmcm9tICdmb290dHJhY2UnO1xuaW1wb3J0IHR5cGUgeyBTaGFyZWRNZW1vcnkgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dDb250cm9sVHlwZSwgRmxvd01lc3NhZ2UgfSBmcm9tICcuLi9tZW1vcnkvZnJhbWVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlQ29udGV4dCB9IGZyb20gJy4uL21lbW9yeS9TdGFnZUNvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IERlY2lkZXIsIFNlbGVjdG9yLCBTdGFnZU5vZGUgfSBmcm9tICcuL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlZFBhdXNlLCBSZXN1bWVFbnRyeSB9IGZyb20gJy4vaGFuZGxlcnMvUmVzdW1lRW50cnkuanMnO1xuaW1wb3J0IHR5cGUgeyBJQ29udHJvbEZsb3dOYXJyYXRpdmUgfSBmcm9tICcuL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5cbi8vIFJlLWV4cG9ydCBTdGFnZU5vZGUgdHlwZXMgZm9yIGNvbnZlbmllbmNlXG5leHBvcnQgdHlwZSB7IERlY2lkZXIsIFNlbGVjdG9yLCBTdGFnZU5vZGUgfSBmcm9tICcuL2dyYXBoL1N0YWdlTm9kZS5qcyc7XG5cbi8vIFJlLWV4cG9ydCBwYXVzZSB0eXBlcyBmcm9tIHBhdXNlLyBsaWJyYXJ5XG5leHBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFBhdXNhYmxlSGFuZGxlciwgUGF1c2VSZXN1bHQgfSBmcm9tICcuLi9wYXVzZS9pbmRleC5qcyc7XG5leHBvcnQgeyBpc1BhdXNlUmVzdWx0LCBpc1BhdXNlU2lnbmFsLCBQYXVzZVNpZ25hbCB9IGZyb20gJy4uL3BhdXNlL2luZGV4LmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMb2dnZXJcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTWluaW1hbCBsb2dnaW5nIGNvbnRyYWN0LiBNaXJyb3JzIENvbnNvbGUgQVBJIHN1YnNldC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ2dlciB7XG4gIGluZm8obWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbiAgbG9nKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGRlYnVnKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIGVycm9yKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSk6IHZvaWQ7XG4gIHdhcm4obWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogdm9pZDtcbn1cblxuLyoqIERlZmF1bHQgY29uc29sZS1iYXNlZCBsb2dnZXIuICovXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtLSB0cml2aWFsIGNvbnNvbGUgZGVsZWdhdGlvbiAqL1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRMb2dnZXI6IElMb2dnZXIgPSB7XG4gIGluZm86IChtZXNzYWdlPzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gY29uc29sZS5pbmZvKG1lc3NhZ2UsIC4uLmFyZ3MpLFxuICBsb2c6IChtZXNzYWdlPzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gY29uc29sZS5sb2cobWVzc2FnZSwgLi4uYXJncyksXG4gIGRlYnVnOiAobWVzc2FnZT86IGFueSwgLi4uYXJnczogYW55W10pID0+IGNvbnNvbGUuZGVidWcobWVzc2FnZSwgLi4uYXJncyksXG4gIGVycm9yOiAobWVzc2FnZT86IGFueSwgLi4uYXJnczogYW55W10pID0+IGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgLi4uYXJncyksXG4gIHdhcm46IChtZXNzYWdlPzogYW55LCAuLi5hcmdzOiBhbnlbXSkgPT4gY29uc29sZS53YXJuKG1lc3NhZ2UsIC4uLmFyZ3MpLFxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdGFnZSBGdW5jdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBDYWxsYmFjayB0aGF0IHJlY2VpdmVzIHRva2VucyBkdXJpbmcgc3RyZWFtaW5nLiAqL1xuZXhwb3J0IHR5cGUgU3RyZWFtQ2FsbGJhY2sgPSAodG9rZW46IHN0cmluZykgPT4gdm9pZDtcblxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gc2lnbmF0dXJlIGZvciBzdGFnZSBoYW5kbGVycy5cbiAqIC0gVE91dDogcmV0dXJuIHR5cGUgcHJvZHVjZWQgYnkgdGhlIHN0YWdlXG4gKiAtIFRTY29wZTogdGhlIHNjb3BlIG9iamVjdCBwYXNzZWQgdG8gdGhlIHN0YWdlXG4gKiAtIE9wdGlvbmFsIDNyZCBwYXJhbWV0ZXIgYHN0cmVhbUNhbGxiYWNrYCBpbmplY3RlZCBmb3Igc3RyZWFtaW5nIHN0YWdlcy5cbiAqL1xuZXhwb3J0IHR5cGUgU3RhZ2VGdW5jdGlvbjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+ID0gKFxuICBzY29wZTogVFNjb3BlLFxuICBicmVha1BpcGVsaW5lOiAoKSA9PiB2b2lkLFxuICBzdHJlYW1DYWxsYmFjaz86IFN0cmVhbUNhbGxiYWNrLFxuKSA9PiBQcm9taXNlPFRPdXQgfCB2b2lkPiB8IFRPdXQgfCB2b2lkO1xuXG4vKipcbiAqIFN0YWdlIGZ1bmN0aW9uIGZvciBwYXVzYWJsZSBzdGFnZXMg4oCUIHJldHVybiB2YWx1ZSBpcyB0aGUgcGF1c2UgZGF0YSAoYW55IHR5cGUpLlxuICogUmV0dXJuIG5vbi12b2lkIHRvIHBhdXNlLCByZXR1cm4gdm9pZCB0byBjb250aW51ZSBub3JtYWxseS5cbiAqL1xuZXhwb3J0IHR5cGUgUGF1c2FibGVTdGFnZUZ1bmN0aW9uPFRTY29wZSA9IGFueT4gPSAoXG4gIHNjb3BlOiBUU2NvcGUsXG4gIGJyZWFrUGlwZWxpbmU6ICgpID0+IHZvaWQsXG4pID0+IFByb21pc2U8dW5rbm93bj4gfCB1bmtub3duO1xuXG4vKiogRmFjdG9yeSB0aGF0IGNyZWF0ZXMgYSBzY29wZSBpbnN0YW5jZSBmb3IgZWFjaCBzdGFnZS4gKi9cbmV4cG9ydCB0eXBlIFNjb3BlRmFjdG9yeTxUU2NvcGUgPSBhbnk+ID0gKFxuICBjb250ZXh0OiBTdGFnZUNvbnRleHQsXG4gIHN0YWdlTmFtZTogc3RyaW5nLFxuICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duLFxuICBleGVjdXRpb25FbnY/OiBFeGVjdXRpb25FbnYsXG4pID0+IFRTY29wZTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHJlYW1pbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgdHlwZSBTdHJlYW1Ub2tlbkhhbmRsZXIgPSAoc3RyZWFtSWQ6IHN0cmluZywgdG9rZW46IHN0cmluZykgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIFN0cmVhbUxpZmVjeWNsZUhhbmRsZXIgPSAoc3RyZWFtSWQ6IHN0cmluZywgZnVsbFRleHQ/OiBzdHJpbmcpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtSGFuZGxlcnMge1xuICBvblRva2VuPzogU3RyZWFtVG9rZW5IYW5kbGVyO1xuICBvblN0YXJ0PzogU3RyZWFtTGlmZWN5Y2xlSGFuZGxlcjtcbiAgb25FbmQ/OiBTdHJlYW1MaWZlY3ljbGVIYW5kbGVyO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhcmFsbGVsLWZvci1lYWNoIChkeW5hbWljIGZhbi1vdXQpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBBIGJ1aWx0IGNoYXJ0LCBhcyBgYWRkUGFyYWxsZWxGb3JFYWNoYCdzIGBicmFuY2hgIGZhY3RvcnkgcmV0dXJucyBpdC5cbiAqXG4gKiBTdHJ1Y3R1cmFsbHkgdGhlIHN1YnNldCBvZiBgRmxvd0NoYXJ0YCB0aGUgZW5naW5lIG5lZWRzIHRvIG1vdW50IGEgYnJhbmNoIOKAlFxuICogZGVjbGFyZWQgaGVyZSByYXRoZXIgdGhhbiBpbXBvcnRlZCBzbyBgZW5naW5lL2Aga2VlcHMgaXRzIG9uZS13YXkgZGVwZW5kZW5jeVxuICogb24gYGJ1aWxkZXIvYC4gQW55IGBmbG93Q2hhcnQoLi4uKS5idWlsZCgpYCByZXN1bHQgc2F0aXNmaWVzIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyYW5jaENoYXJ0PFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgc3RhZ2VNYXA6IE1hcDxzdHJpbmcsIFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPj47XG4gIHN1YmZsb3dzPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgYnVpbGRUaW1lU3RydWN0dXJlPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBSdW50aW1lIGZhbi1vdXQgY29uZmlnIOKAlCBvbmUgYnJhbmNoIHBlciBpdGVtLCBicmFuY2ggQ09VTlQgZGVjaWRlZCBhdFxuICogcnVudGltZSBmcm9tIHRoZSBwYXlsb2FkLiBEZXNpZ246IGRvY3MvZGVzaWduL2V4ZWN1dGlvbi1jb250cm9sLm1kIChEMikuXG4gKlxuICogRWFjaCBicmFuY2ggcnVucyBhcyBhIGdlbmVyYXRlZCBTVUJGTE9XIChpc29sYXRlZCBydW50aW1lLCBvd24gY29tbWl0IGxvZyxcbiAqIGFkZHJlc3NhYmxlIGF0IGA8c3RhZ2VJZD5+PGluZGV4PmAgaW4gZXZlcnkgdHJhY2UgcXVlcnkpLCB3aGljaCBpcyB3aGF0XG4gKiBtYWtlcyBicmFuY2hlcyB1bmFibGUgdG8gY29ycnVwdCBlYWNoIG90aGVyJ3MgaW4tZmxpZ2h0IHN0YXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFsbGVsRm9yRWFjaENvbmZpZzxUSXRlbSA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIC8qKlxuICAgKiBQaWNrcyB0aGUgaXRlbXMgdG8gZmFuIG91dCBvdmVyLCBmcm9tIHRoZSBsaXZlIHNjb3BlLiBSZWFkcyBoZXJlIGFyZVxuICAgKiB0cmFja2VkIGxpa2UgYW55IG90aGVyIHN0YWdlIHJlYWQsIHNvIHRoZSBmYW4tb3V0J3Mgb3duIGlucHV0cyBzaG93IHVwIGluXG4gICAqIHRoZSB0cmFjZSBhbmQgaW4gYSBiYWNrd2FyZCBzbGljZS5cbiAgICovXG4gIGl0ZW1zOiAoc2NvcGU6IFRTY29wZSkgPT4gcmVhZG9ubHkgVEl0ZW1bXTtcbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgY2hhcnQgZm9yIE9ORSBpdGVtLiBDYWxsZWQgb25jZSBwZXIgZXhlY3V0ZWQgYnJhbmNoLCB3aXRoIHRoZVxuICAgKiBpdGVtIGFuZCBpdHMgaW5kZXgg4oCUIGNsb3NlIG92ZXIgdGhlbSwgb3IgcmVhZCB0aGUgYGl0ZW1gIC8gYGluZGV4YCB2YWx1ZXNcbiAgICogc2VlZGVkIGludG8gdGhlIGJyYW5jaCdzIG93biBzY29wZS5cbiAgICovXG4gIGJyYW5jaDogKGl0ZW06IFRJdGVtLCBpbmRleDogbnVtYmVyKSA9PiBCcmFuY2hDaGFydDtcbiAgLyoqXG4gICAqIEhhcmQgY2VpbGluZyBvbiBicmFuY2hlcyBwZXIgZXhlY3V0aW9uLiBSRVFVSVJFRDogYW4gdW5ib3VuZGVkIGZhbi1vdXRcbiAgICogZHJpdmVuIGJ5IG1vZGVsIG91dHB1dCBpcyBhIHJlc291cmNlIGF0dGFjaywgc28gdGhlcmUgaXMgbm8gZGVmYXVsdCB0b1xuICAgKiBmb3JnZXQuIEV4dHJhIGl0ZW1zIGRvIG5vdCBydW4g4oCUIHRoZSB0cnVuY2F0aW9uIGlzIHJlY29yZGVkLCBuZXZlciBzaWxlbnQuXG4gICAqL1xuICBtYXhCcmFuY2hlczogbnVtYmVyO1xuICAvKipcbiAgICogU3RhdGUga2V5IHRoZSBvcmRlcmVkIHJlc3VsdHMgYXJyYXkgaXMgd3JpdHRlbiB0byBvbiB0aGUgcGFyZW50IHNjb3BlLlxuICAgKiBSRVFVSVJFRCDigJQgYSBrZXkgZGVyaXZlZCBmcm9tIHRoZSBzdGFnZSBpZCBjb3VsZCBzaWxlbnRseSBvdmVyd3JpdGUgc3RhdGVcbiAgICogdGhlIGNoYXJ0IGFscmVhZHkgb3ducy5cbiAgICovXG4gIGludG86IHN0cmluZztcbiAgLyoqXG4gICAqIEZhbi1vdXQgZXJyb3IgcG9saWN5IOKAlCB0aGUgU0FNRSBwb2xpY3kgdGhlIGV4aXN0aW5nIHBhcmFsbGVsIGZhbi1vdXQgdXNlcy5cbiAgICogYHRydWVgID0gYFByb21pc2UuYWxsYCAodGhlIGZpcnN0IGZhaWxpbmcgYnJhbmNoIHJlamVjdHMgdGhlIHN0YWdlKTtcbiAgICogb21pdHRlZC9mYWxzZSA9IGJlc3QtZWZmb3J0IGBQcm9taXNlLmFsbFNldHRsZWRgIChldmVyeSBicmFuY2ggcnVuczsgYVxuICAgKiBmYWlsZWQgYnJhbmNoJ3Mgc2xvdCBpbiB0aGUgcmVzdWx0cyBhcnJheSBpcyBgdW5kZWZpbmVkYCkuXG4gICAqL1xuICBmYWlsRmFzdD86IGJvb2xlYW47XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUmV0cnkgKHBlci1zdGFnZSBkZWNsYXJhdGl2ZSBwb2xpY3kpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gVGhlIHBvbGljeSB0aGUgYXR0ZW1wdCBydW5uZXIgcnVuczogZGVjbGFyZWQgb25jZSwgaW4gdGhlIGF0dGVtcHQgbGVhZiAoYGF0dGVtcHQvdHlwZXMudHNgLCAxMC4xKSwgYW5kIG5hbWVkXG4vLyBoZXJlIHNvIGV2ZXJ5IGVuZ2luZSBhbmQgYnVpbGRlciBzaXRlIGtlZXBzIGl0cyBpbXBvcnQuXG5leHBvcnQgdHlwZSB7IFJldHJ5UG9saWN5LCBTdGFnZVRvdWNoZXMgfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdWJmbG93XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb250cm9scyBob3cgYXJyYXkgdmFsdWVzIGZyb20gb3V0cHV0TWFwcGVyIGFyZSBtZXJnZWQgaW50byBwYXJlbnQgc2NvcGUuXG4gKi9cbmV4cG9ydCBlbnVtIEFycmF5TWVyZ2VNb2RlIHtcbiAgLyoqIEFwcGVuZCBzdWJmbG93IG91dHB1dCB0byBleGlzdGluZyBwYXJlbnQgYXJyYXk6IFsuLi5leGlzdGluZywgLi4udmFsdWVdLiBEZWZhdWx0LiAqL1xuICBDb25jYXQgPSAnY29uY2F0JyxcbiAgLyoqIE92ZXJ3cml0ZSBwYXJlbnQgYXJyYXkgd2l0aCBzdWJmbG93IG91dHB1dC4gVXNlIGZvciBEeW5hbWljIGxvb3BzLiAqL1xuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1YmZsb3dNb3VudE9wdGlvbnM8VFBhcmVudFNjb3BlID0gYW55LCBUU3ViZmxvd0lucHV0ID0gYW55LCBUU3ViZmxvd091dHB1dCA9IGFueT4ge1xuICBpbnB1dE1hcHBlcj86IChwYXJlbnRTY29wZTogVFBhcmVudFNjb3BlKSA9PiBUU3ViZmxvd0lucHV0O1xuICAvKipcbiAgICogTWFwcyBzdWJmbG93IG91dHB1dCBiYWNrIGludG8gcGFyZW50IHNjb3BlLlxuICAgKlxuICAgKiAqKkFycmF5IG1lcmdlIGJlaGF2aW9yKiogaXMgY29udHJvbGxlZCBieSBgYXJyYXlNZXJnZWA6XG4gICAqIC0gYCdjb25jYXQnYCAoZGVmYXVsdCk6IGBbLi4uZXhpc3RpbmcsIC4uLnZhbHVlXWAg4oCUIHJldHVybiBvbmx5ICoqZGVsdGEqKiBpdGVtc1xuICAgKiAtIGAncmVwbGFjZSdgOiBvdmVyd3JpdGVzIHRoZSBwYXJlbnQgdmFsdWUg4oCUIHJldHVybiB0aGUgZnVsbCBhcnJheVxuICAgKlxuICAgKiBTY2FsYXIgdmFsdWVzIGFyZSBhbHdheXMgcmVwbGFjZWQgcmVnYXJkbGVzcyBvZiBgYXJyYXlNZXJnZWAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRGVsdGEgbW9kZSAoZGVmYXVsdCkg4oCUIHJldHVybiBvbmx5IG5ldyBpdGVtcywgY29uY2F0IGFwcGVuZHNcbiAgICogb3V0cHV0TWFwcGVyOiAoc2YpID0+ICh7IG1lc3NhZ2VzOiBzZi5uZXdNZXNzYWdlcyB9KVxuICAgKlxuICAgKiAvLyBSZXBsYWNlIG1vZGUg4oCUIHJldHVybiBmdWxsIGFycmF5LCBwYXJlbnQgdmFsdWUgaXMgb3ZlcndyaXR0ZW5cbiAgICogLy8gVXNlZnVsIGluIER5bmFtaWMgbG9vcHMgd2hlcmUgdGhlIHN1YmZsb3cgcmVjb21wdXRlcyB0aGUgZnVsbCB2YWx1ZSBlYWNoIGl0ZXJhdGlvblxuICAgKiBvdXRwdXRNYXBwZXI6IChzZikgPT4gKHsgdG9vbERlc2NyaXB0aW9uczogc2YudG9vbERlc2NyaXB0aW9ucyB9KSxcbiAgICogYXJyYXlNZXJnZTogQXJyYXlNZXJnZU1vZGUuUmVwbGFjZSxcbiAgICpcbiAgICogLy8gU2NhbGFycyBhcmUgZmluZSBpbiBib3RoIG1vZGVzIOKAlCBhbHdheXMgcmVwbGFjZWRcbiAgICogb3V0cHV0TWFwcGVyOiAoc2YpID0+ICh7IHN0YXR1czogc2YucmVzdWx0LCBjb3VudDogc2YudG90YWwgfSlcbiAgICogYGBgXG4gICAqL1xuICBvdXRwdXRNYXBwZXI/OiAoc3ViZmxvd091dHB1dDogVFN1YmZsb3dPdXRwdXQsIHBhcmVudFNjb3BlOiBUUGFyZW50U2NvcGUpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogQ29udHJvbHMgaG93IGFycmF5IHZhbHVlcyBmcm9tIG91dHB1dE1hcHBlciBhcmUgbWVyZ2VkIGludG8gcGFyZW50IHNjb3BlLlxuICAgKiBBcHBsaWVzIG9ubHkgdG8gdG9wLWxldmVsIGFycmF5IGtleXMuIE5lc3RlZCBhcnJheXMgaW5zaWRlIG9iamVjdHNcbiAgICogYWx3YXlzIHVzZSBhcHBlbmQgKGFwcGVuZFRvQXJyYXkpIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcnJheU1lcmdlTW9kZS5Db25jYXRcbiAgICovXG4gIGFycmF5TWVyZ2U/OiBBcnJheU1lcmdlTW9kZTtcblxuICAvKipcbiAgICogU1RSVUNUVVJFLU9OTFk6IHRoZSBkb3duc3RyZWFtIHN0YWdlIGlkIHRoaXMgYnJhbmNoJ3MgY29udmVyZ2VuY2UgZWRnZVxuICAgKiBwb2ludHMgdG8sIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgXCJjb252ZXJnZSBhdCB0aGUgbmV4dCBsaW5lYXIgc3RhZ2UuXCJcbiAgICpcbiAgICogV2hlbiBhIGZvcmsvc2VsZWN0b3IvZGVjaWRlciBicmFuY2ggY2FycmllcyBgY29udmVyZ2VBdGAsIGl0cyB2aXN1YWxpemVkXG4gICAqIGBuZXh0YCBlZGdlIGlzIGZpcmVkIHRvIHRoZSBuYW1lZCBzdGFnZSBpbnN0ZWFkIG9mIHRvIHRoZSBzaGFyZWRcbiAgICogY29udmVyZ2VuY2Ugbm9kZSBpdHMgc2libGluZ3MgdXNlLiBUaGlzIGV4cHJlc3NlcyBhbiB1bmVxdWFsLWRlcHRoIG1lcmdlXG4gICAqIOKAlCBlLmcuIGEgYHRvb2xzYCBzbG90IHRoYXQgYnlwYXNzZXMgdGhlIGBtZXNzYWdlQVBJYCBhc3NlbWJseSBub2RlIGFuZFxuICAgKiBwYWlycyB3aXRoIGl0cyBvdXRwdXQgYXQgYGNhbGwtbGxtYCAoc28gYGNhbGwtbGxtYCByZWFkcyBhcyBhIDItcGFyZW50XG4gICAqIG1lcmdlKSwgZmFpdGhmdWwgdG8gdGhlIEFudGhyb3BpYyB3aXJlIHByb3RvY29sIChzeXN0ZW0rbWVzc2FnZXMgPSB0aGVcbiAgICogbWVzc2FnZSBwYXlsb2FkOyB0b29scyA9IGEgc2VwYXJhdGUgdG9wLWxldmVsIGZpZWxkKS5cbiAgICpcbiAgICogKipUaGlzIGFmZmVjdHMgdGhlIFNUUlVDVFVSRS90b3BvbG9neSBncmFwaCBvbmx5Kiog4oCUIHRoZSBydW50aW1lIGlzXG4gICAqIHVuY2hhbmdlZCAodGhlIGJyYW5jaCdzIG91dHB1dHMgcmlkZSBzaGFyZWQgc2NvcGU7IHRoZSBuYW1lZCB0YXJnZXQgcmVhZHNcbiAgICogdGhlbSB3aGVuIGl0IHJ1bnMpLiBJdCBkb2VzIE5PVCBpbnRyb2R1Y2UgYSBqb2luIGJhcnJpZXIuIFRoZSB0YXJnZXQgaXMgYVxuICAgKiBGT1JXQVJEIHN0YWdlIChhZGRlZCBsYXRlciBpbiB0aGUgY2hhaW4pLCBzbyBpdCBpcyBub3QgdmFsaWRhdGVkIGF0XG4gICAqIGJyYW5jaC1kZWNsYXJhdGlvbiB0aW1lLlxuICAgKi9cbiAgY29udmVyZ2VBdD86IHN0cmluZztcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGFuIGlubmVyIGBzY29wZS4kYnJlYWsocmVhc29uKWAgY2FsbCBpbnNpZGUgdGhpcyBzdWJmbG93XG4gICAqIHByb3BhZ2F0ZXMgdXAgdG8gdGhlIHBhcmVudCDigJQgaS5lLiwgdGhlIHBhcmVudCdzIGBicmVha0ZsYWdgIGlzIHNldFxuICAgKiBhZnRlciB0aGUgc3ViZmxvdyBleGl0cywgdGVybWluYXRpbmcgdGhlIHBhcmVudCdzIG91dGVyIGxvb3AgdG9vLlxuICAgKlxuICAgKiAqKkRlZmF1bHQ6IGBmYWxzZWAqKiAoY3VycmVudCBiZWhhdmlvdXIg4oCUIGlubmVyIGJyZWFrIHN0b3BzIG9ubHkgdGhlXG4gICAqIHN1YmZsb3c7IHBhcmVudCBjb250aW51ZXMpLlxuICAgKlxuICAgKiAjIyBXaGVuIHRvIHVzZVxuICAgKlxuICAgKiBTZXQgYHByb3BhZ2F0ZUJyZWFrOiB0cnVlYCBvbiBzdWJmbG93IG1vdW50cyB0aGF0IHJlcHJlc2VudFxuICAgKiAqKnRlcm1pbmFsKiogYnJhbmNoZXMg4oCUIFwiaWYgdGhpcyBzdWJmbG93IGZpcmVzLCB0aGUgb3V0ZXIgbG9vcCBpc1xuICAgKiBkb25lXCIuIEV4YW1wbGVzOlxuICAgKlxuICAgKiAtIEEgaHVtYW4tcmV2aWV3IHJ1bm5lciB0aGF0IHRha2VzIG92ZXIgZnJvbSBhbiBhZ2VudCdzIHRvb2wtY2FsbGluZ1xuICAgKiAgIGxvb3AgYW5kIHByb2R1Y2VzIHRoZSBmaW5hbCByZXNwb25zZS5cbiAgICogLSBBIHNhZmV0eS1nYXRlIHN1YmZsb3cgdGhhdCBoYWx0cyB0aGUgb3V0ZXIgd29ya2Zsb3cgd2hlbiBhIHBvbGljeVxuICAgKiAgIHZpb2xhdGlvbiBpcyBkZXRlY3RlZC5cbiAgICogLSBBbiBlcnJvci1yZWNvdmVyeSBzdWJmbG93IHRoYXQgcmVzdG9yZXMgc3RhdGUgYW5kIHRoZW4gdGVybWluYXRlcy5cbiAgICpcbiAgICogIyMgU2VtYW50aWNzXG4gICAqXG4gICAqIDEuIEluc2lkZSB0aGUgc3ViZmxvdywgYSBzdGFnZSBjYWxscyBgc2NvcGUuJGJyZWFrKHJlYXNvbilgLlxuICAgKiAyLiBUaGUgc3ViZmxvdydzIG93biBleGVjdXRpb24gc3RvcHMgKG5vcm1hbCBgJGJyZWFrYCBiZWhhdmlvdXIpLlxuICAgKiAzLiBgU3ViZmxvd0V4ZWN1dG9yYCBpbnNwZWN0cyB0aGUgc3ViZmxvdydzIGV4aXQgc3RhdGUuIElmXG4gICAqICAgIGBwcm9wYWdhdGVCcmVhayA9PT0gdHJ1ZWAgQU5EIHRoZSBpbm5lciBicmVhayBmaXJlZCwgaXQgZm9yd2FyZHNcbiAgICogICAgdGhlIGJyZWFrIChhbmQgaXRzIHJlYXNvbikgdG8gdGhlIHBhcmVudCdzIGBicmVha0ZsYWdgLlxuICAgKiA0LiBUaGUgcGFyZW50IHRyYXZlcnNlciBzZWVzIGBzaG91bGRCcmVha2Agb24gaXRzIG5leHQgc3RlcCBhbmQgZXhpdHMuXG4gICAqIDUuIEEgYEZsb3dSZWNvcmRlci5vbkJyZWFrYCBldmVudCBmaXJlcyBhdCB0aGUgcGFyZW50LW1vdW50IGxldmVsIHdpdGhcbiAgICogICAgYHByb3BhZ2F0ZWRGcm9tU3ViZmxvd2AgPSB0aGUgc3ViZmxvdydzIGlkIGFuZCB0aGUgaW5uZXIgcmVhc29uLlxuICAgKlxuICAgKiAjIyBQYXJhbGxlbC9mYW4tb3V0XG4gICAqXG4gICAqIEZvbGxvd3MgdGhlIGV4aXN0aW5nIGxpYnJhcnkgcnVsZSBpbiBgQ2hpbGRyZW5FeGVjdXRvcmA6IHRoZSBwYXJlbnRcbiAgICogYnJlYWtzIG9ubHkgd2hlbiAqKmV2ZXJ5KiogY2hpbGQgb2YgYSBmb3JrIGJyb2tlLiBBIHNpbmdsZVxuICAgKiBgcHJvcGFnYXRlQnJlYWs6IHRydWVgIHN1YmZsb3cgY29udHJpYnV0aW5nIGl0cyBicmVhayB0byB0aGUgY291bnRcbiAgICogZG9lcyBub3Qgb24gaXRzIG93biB0ZXJtaW5hdGUgdGhlIHBhcmVudCBmYW4tb3V0LlxuICAgKlxuICAgKiAjIyBvdXRwdXRNYXBwZXIgc3RpbGwgcnVuc1xuICAgKlxuICAgKiBUaGUgc3ViZmxvdydzIGBvdXRwdXRNYXBwZXJgIChpZiBzdXBwbGllZCkgQUxXQVlTIHJ1bnMgYmVmb3JlIHRoZVxuICAgKiBicmVhayBwcm9wYWdhdGVzLCBzbyB0aGUgc3ViZmxvdydzIHBhcnRpYWwgc3RhdGUgaXMgc3RpbGwgd3JpdHRlbiB0b1xuICAgKiB0aGUgcGFyZW50IHNjb3BlLiBUaGlzIGlzIGludGVudGlvbmFsIOKAlCB0aGUgdHlwaWNhbCB1c2UgY2FzZSBpcyBhblxuICAgKiBcImVzY2FsYXRpb25cIiBzdWJmbG93IHdob3NlIG91dHB1dCBJUyB0aGUgZmluYWwgYW5zd2VyIHRoYXQgbmVlZHMgdG9cbiAgICogbGFuZCBpbiB0aGUgcGFyZW50IHNjb3BlIGJlZm9yZSB0aGUgb3V0ZXIgbG9vcCB0ZXJtaW5hdGVzLiBJZiB5b3VcbiAgICogd2FudCB0byBzdXBwcmVzcyBvdXRwdXQgbWFwcGluZyBvbiBicmVhaywgY2hlY2sgdGhlIGJyZWFrIHN0YXRlXG4gICAqIGluc2lkZSB5b3VyIGBvdXRwdXRNYXBwZXJgIGFuZCByZXR1cm4gYHt9YCBlYXJseS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHByb3BhZ2F0ZUJyZWFrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVjbGFyZWQgdGFncyAoOS4yMS4xKSBmb3IgdGhlIE1PVU5UIGl0c2VsZiDigJQgdGhlIE5BTUVTIHRoZSBhdXRob3IgcHV0c1xuICAgKiBvbiB0aGlzIG1vdW50IGF0IGJ1aWxkIHRpbWUsIGxhbmRlZCBieSB0aGUgc2FtZSBgYXBwbHlUYWdzYCBldmVyeSBvdGhlclxuICAgKiBgb3B0aW9ucy50YWdzYCBzaXRlIHVzZXMsIHdpdGggdGhlIHNhbWUgcmVmdXNhbHMgKGVtcHR5LCBub24tc3RyaW5nLCB0aGVcbiAgICogcmVzZXJ2ZWQgYH5gIG1hcmtlciwgYSBkdXBsaWNhdGUsIGEgc2Vjb25kIGRlY2xhcmF0aW9uKS5cbiAgICpcbiAgICogQSBtb3VudCBpcyBhIHN0YWdlIHRoYXQgY29tbWl0czogaXRzIGZpcnN0IGJ1bmRsZSBpbiB0aGUgUEFSRU5UIGxvZyBpcyBhXG4gICAqIHN0b3AgaW4gYGNvbW1pdFN0b3BzYCwgc28gYHRhZ1N0b3BzYCBrZWVwcyBpdCBsaWtlIGFueSB0YWdnZWQgc3RhZ2UgYW5kXG4gICAqIGNhcnJpZXMgdGhlc2UgbmFtZXMgYXMgYFN0b3AubWV0YWAuIFN0YW1wZWQgb24gdGhhdCBmaXJzdCBidW5kbGUgb25seVxuICAgKiAodGhlIG1vdW50J3MgZXhpdCBidW5kbGUgY2FycmllcyBub25lIOKAlCB0aGUgb25jZS1wZXItZXhlY3V0aW9uIGxhdykuXG4gICAqIFRoZSBzdWJmbG93J3MgT1dOIGxvZyBpcyB1bnRvdWNoZWQ6IGl0cyBpbm5lciBzdGFnZXMgZGVjbGFyZSB0aGVpciBvd25cbiAgICogdGFncywgYW5kIGBkcmlsbChtb3VudClgIHJlYWRzIHRob3NlIG9mZiB0aGUgaW5uZXIgbG9nLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBPTkxZIHRhZyBzaXRlIGZvciBhIGZvcmstY2hpbGQgbW91bnQgKGBhZGRTdWJGbG93Q2hhcnRgKSBvclxuICAgKiBhIGJyYW5jaCBtb3VudCAoYGFkZFN1YkZsb3dDaGFydEJyYW5jaGApIOKAlCBhZnRlciB0aG9zZSB0aGUgY3Vyc29yIHN0aWxsXG4gICAqIHBvaW50cyBhdCB0aGUgcGFyZW50LCBzbyBgLnRhZygpYCByZWZ1c2VzIHJhdGhlciB0aGFuIG1pcy1hdHRyaWJ1dGUuIEFcbiAgICogbGluZWFyIG1vdW50IChgYWRkU3ViRmxvd0NoYXJ0TmV4dGApIG1vdmVzIHRoZSBjdXJzb3IsIHNvIGAudGFnKClgIHdvcmtzXG4gICAqIHRoZXJlIHRvbzsgZGVjbGFyZSBpbiBvbmUgcGxhY2UsIG5vdCBib3RoLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC5hZGRTZWxlY3RvckZ1bmN0aW9uKCdTbG90cycsIHBpY2tTbG90cywgJ3Nsb3RzJylcbiAgICogICAuYWRkU3ViRmxvd0NoYXJ0QnJhbmNoKCdtZW1vcnknLCBtZW1vcnlDaGFydCwgJ01lbW9yeScsIHsgdGFnczogWydzbG90Om1lbW9yeSddIH0pXG4gICAqICAgLmFkZFN1YkZsb3dDaGFydEJyYW5jaCgndG9vbHMnLCB0b29sc0NoYXJ0LCAnVG9vbHMnLCB7IHRhZ3M6IFsnc2xvdDp0b29scyddIH0pXG4gICAqIC5lbmQoKVxuICAgKiBgYGBcbiAgICovXG4gIHRhZ3M/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJmbG93UmVzdWx0IHtcbiAgc3ViZmxvd0lkOiBzdHJpbmc7XG4gIHN1YmZsb3dOYW1lOiBzdHJpbmc7XG4gIHRyZWVDb250ZXh0OiB7XG4gICAgLyoqXG4gICAgICogVGhlIHN1YmZsb3cncyBmaW5hbCBzdGF0ZS4gVGhlIHRyYXZlcnNlcidzIHJlY29yZCBob2xkcyB0aGUgTElWRSBoZWFwXG4gICAgICog4oCUIHdoYXQgYSBwbGFpbiBgZ2V0U25hcHNob3QoKWAgYW5kIHRoZSBjaGVja3BvaW50IHNlZS4gVW5kZXJcbiAgICAgKiBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIHRoZSBleGVjdXRvciBzZXJ2ZXMgdGhlIHN1YmZsb3cncyBvd25cbiAgICAgKiByZWRhY3RlZCBtaXJyb3IgaGVyZSBpbnN0ZWFkICg5LjIwLjA7IGBoYW5kbGVycy9zZXJ2ZWRTdWJmbG93UmVzdWx0c2ApLFxuICAgICAqIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCBgc3RhdGVBdGAgZm9sZHMgYGhpc3RvcnlgIHRvLlxuICAgICAqL1xuICAgIGdsb2JhbENvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHN0YWdlQ29udGV4dHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGhpc3Rvcnk6IHVua25vd25bXTtcbiAgICAvKiogTmF0aXZlIHNvdXJjZSBib29rIGZvciB0aGlzIGludm9jYXRpb24ncyBvd24gbG9nLiBNZW1vcnkgb2JzZXJ2YXRpb24gb25seTsgbm8gcGFyZW50IHJlY2VpcHQgYXBwbGllcy4gKi9cbiAgICByZWFkb25seSByZWFkU291cmNlcz86IGltcG9ydCgnLi4vY2FwdHVyZS9yZWFkU291cmNlcy5qcycpLkVuZ2luZVJlYWRTb3VyY2VzO1xuICAgIC8qKiBJZGVudGl0eSBvZiB0aGUgbG9jYWwgaGlzdG9yeSwgbm90IGl0cyBwYXJlbnQncyBsb2cuICovXG4gICAgcmVhZG9ubHkgbG9nQWRkcmVzcz86IExvZ0FkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIHN1YmZsb3cncyBPV04gZm9sZCBiYXNlIOKAlCB0aGUgc3RhdGUgaXRzIGlzb2xhdGVkIHJ1bnRpbWUgc3RhcnRlZFxuICAgICAqIGZyb20sIGJlZm9yZSBpdHMgZmlyc3QgY29tbWl0LiBUaGUgc2libGluZyBvZlxuICAgICAqIGBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlYCwgY2FycmllZCBoZXJlIHNvIGEgc3ViZmxvdydzIGBoaXN0b3J5YFxuICAgICAqIGNhbiBiZSBmb2xkZWQgb2ZmbGluZSBleGFjdGx5IGxpa2UgdGhlIHJ1bidzIGxvZyAoYHN0YXRlQXRgLFxuICAgICAqIGB0aW1lVHJhdmVsKC4uLikuZHJpbGwobW91bnQpYCkuIEZyb3plbiBhbmQgZGV0YWNoZWQuXG4gICAgICpcbiAgICAgKiBOb3JtYWxseSBge31gOiBhIHN1YmZsb3cncyBgaW5wdXRNYXBwZXJgIHNlZWQgaXMgaXRzZWxmIHRoZSBmaXJzdFxuICAgICAqIENPTU1JVCBpbiBgaGlzdG9yeWAgKHRoZSByb290IGNvbnRleHQgY29tbWl0cyBpdCksIG5vdCBhIHByZS1ydW4gYmFzZS5cbiAgICAgKi9cbiAgICBpbml0aWFsU3RhdGU/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfTtcbiAgcGFyZW50U3RhZ2VJZDogc3RyaW5nO1xuICBwaXBlbGluZVN0cnVjdHVyZT86IHVua25vd247XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3ViZmxvdyBUcmF2ZXJzZXIgRmFjdG9yeVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnkg4oCUIENyZWF0ZXMgYSBGbG93Y2hhcnRUcmF2ZXJzZXIgZm9yIHN1YmZsb3cgZXhlY3V0aW9uLlxuICpcbiAqIEluamVjdGVkIGludG8gU3ViZmxvd0V4ZWN1dG9yIHRvIGJyZWFrIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5OlxuICogRmxvd2NoYXJ0VHJhdmVyc2VyIOKGkiBTdWJmbG93RXhlY3V0b3Ig4oaSIEZsb3djaGFydFRyYXZlcnNlci5cbiAqXG4gKiBUaGUgZmFjdG9yeSBjYXB0dXJlcyBwYXJlbnQgdHJhdmVyc2VyIGNvbmZpZyAoc3RhZ2VNYXAsIHNjb3BlRmFjdG9yeSwgbmFycmF0aXZlLCBldGMuKVxuICogaW4gYSBjbG9zdXJlLiBTdWJmbG93RXhlY3V0b3IgY2FsbHMgaXQgd2l0aCBzdWJmbG93LXNwZWNpZmljIG92ZXJyaWRlcyAocm9vdCwgcnVudGltZSwgaW5wdXQpLlxuICogVGhlIHJldHVybmVkIHRyYXZlcnNlciB1c2VzIHRoZSBTQU1FIDctcGhhc2UgYWxnb3JpdGhtIGFzIHRoZSB0b3AtbGV2ZWwgdHJhdmVyc2VyLFxuICogc28gZGVjaWRlcnMsIHNlbGVjdG9ycywgbG9vcHMsIGxhenkgc3ViZmxvd3MsIGFuZCBhYm9ydCBzaWduYWxzIGFsbCB3b3JrIGluc2lkZSBzdWJmbG93cy5cbiAqL1xuZXhwb3J0IHR5cGUgU3ViZmxvd1RyYXZlcnNlckZhY3Rvcnk8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiA9IChvcHRpb25zOiB7XG4gIC8qKiBSb290IG5vZGUgb2YgdGhlIHN1YmZsb3cgKHdpdGggaXNTdWJmbG93Um9vdCBzdHJpcHBlZCkg4oCUIHRoZSBncmFwaCBldmVyeSBpZCBpbnNpZGUgdGhlIHN1YmZsb3cgcmVzb2x2ZXMgYWdhaW5zdC4gKi9cbiAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgc3ViZmxvdydzIHRyYXZlcnNhbCBzdGFydHMgd2hlbiBub3QgYXQgYHJvb3RgIOKAlCBhIHJlc3VtZSdzXG4gICAqIG9uZS1zaG90IHJlLWVudHJ5IChgUmVzdW1lSG9wLmVudHJ5YCk6IHRoZSBuZXh0IG1vdW50IG9uIHRoZSBwYXVzZSBwYXRoLFxuICAgKiBvciB0aGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4sIGVhY2ggd2l0aCBpdHMgZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvblxuICAgKiBhdHRhY2hlZC4gVmlzaXRlZCBvbmNlLCBmaXJzdDsgbmV2ZXIgcmVzb2x2YWJsZSBieSBpZC5cbiAgICovXG4gIGVudHJ5PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKlxuICAgKiBQYXJhbGxlbCBzaWJsaW5ncycgcGF1c2VzIHdhaXRpbmcgaW4gdGhpcyBzdWJmbG93IChgUmVzdW1lSG9wLnBlbmRpbmdQYXVzZXNgLFxuICAgKiA5LjI4LjApIOKAlCByYWlzZWQgaW4gb3JkZXIgb25jZSBgZW50cnlgJ3MgY2hhaW4gZW5kcy5cbiAgICovXG4gIHBlbmRpbmdQYXVzZXM/OiByZWFkb25seSBRdWV1ZWRQYXVzZVtdO1xuICAvKiogSXNvbGF0ZWQgZXhlY3V0aW9uIHJ1bnRpbWUgZm9yIHRoZSBzdWJmbG93LiAqL1xuICBleGVjdXRpb25SdW50aW1lOiBJRXhlY3V0aW9uUnVudGltZTtcbiAgLyoqIE1hcHBlZCBpbnB1dCBmcm9tIHBhcmVudCBzY29wZSAoYmVjb21lcyByZWFkT25seUNvbnRleHQgZm9yIHN0YWdlcykuICovXG4gIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gIC8qKiBTdWJmbG93IGlkZW50aWZpZXIg4oCUIHVzZWQgYXMgYnJhbmNoUGF0aCBmb3IgbmFycmF0aXZlIGNvbnRleHQuICovXG4gIHN1YmZsb3dJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDE6IHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBzdWJmbG93IE1PVU5UIHN0YWdlIGluIHRoZSBwYXJlbnRcbiAgICogdHJhdmVyc2VyLiBCZWNvbWVzIHRoZSBgcGFyZW50UnVudGltZVN0YWdlSWRgIGZhbGxiYWNrIGZvciB0aGUgc3ViZmxvdydzXG4gICAqIHJvb3Qgc3RhZ2Ugc28gcnVudGltZSBhbmNlc3RvciBjaGFpbnMgY3Jvc3Mgc3ViZmxvdyBib3VuZGFyaWVzLlxuICAgKi9cbiAgcGFyZW50TW91bnRSdW50aW1lU3RhZ2VJZD86IHN0cmluZztcbn0pID0+IFN1YmZsb3dUcmF2ZXJzZXJIYW5kbGU8VE91dCwgVFNjb3BlPjtcblxuLyoqXG4gKiBIYW5kbGUgcmV0dXJuZWQgYnkgU3ViZmxvd1RyYXZlcnNlckZhY3RvcnkuXG4gKiBQcm92aWRlcyBleGVjdXRlKCkgKyBhY2Nlc3MgdG8gbmVzdGVkIHN1YmZsb3cgcmVzdWx0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWJmbG93VHJhdmVyc2VySGFuZGxlPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICAvKiogRXhlY3V0ZSB0aGUgc3ViZmxvdydzIGdyYXBoIHVzaW5nIHRoZSBmdWxsIDctcGhhc2UgdHJhdmVyc2FsIGFsZ29yaXRobS4gKi9cbiAgZXhlY3V0ZSgpOiBQcm9taXNlPFRyYXZlcnNhbFJlc3VsdD47XG4gIC8qKiBDb2xsZWN0IG5lc3RlZCBzdWJmbG93IHJlc3VsdHMgKGZyb20gc3ViZmxvd3MgbW91bnRlZCBpbnNpZGUgdGhpcyBzdWJmbG93KS4gKi9cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD47XG4gIC8qKlxuICAgKiBGaW5hbCBicmVhayBzdGF0ZSBvZiB0aGUgc3ViZmxvdyBhZnRlciBgZXhlY3V0ZSgpYCByZXR1cm5zLlxuICAgKlxuICAgKiAgIC0gYHNob3VsZEJyZWFrOiB0cnVlYCAg4oaSIGEgc3RhZ2UgaW5zaWRlIHRoZSBzdWJmbG93IGNhbGxlZFxuICAgKiAgICAgYHNjb3BlLiRicmVhayhyZWFzb24pYCwgc3RvcHBpbmcgdGhlIHN1YmZsb3cncyBvd24gdHJhdmVyc2FsLlxuICAgKiAgIC0gYHJlYXNvbmAgICAgICAgICAgICAg4oaSIHRoZSBvcHRpb25hbCBzdHJpbmcgcGFzc2VkIHRvIGAkYnJlYWtgLlxuICAgKlxuICAgKiBVc2VkIGJ5IGBTdWJmbG93RXhlY3V0b3JgIHRvIGltcGxlbWVudCBgU3ViZmxvd01vdW50T3B0aW9ucy5wcm9wYWdhdGVCcmVha2A6XG4gICAqIGlmIHRoZSBtb3VudCBvcHRzIGluIEFORCB0aGUgc3ViZmxvdyBicm9rZSwgdGhlIHBhcmVudCdzIGJyZWFrIGZsYWcgaXNcbiAgICogZm9yd2FyZGVkLlxuICAgKi9cbiAgZ2V0QnJlYWtTdGF0ZSgpOiB7IHNob3VsZEJyZWFrOiBib29sZWFuOyByZWFzb24/OiBzdHJpbmcgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeGVjdXRpb24gUnVudGltZSBJbnRlcmZhY2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIElFeGVjdXRpb25SdW50aW1lIOKAlCBJbnRlcmZhY2UgZm9yIHRoZSBydW50aW1lIGVudmlyb25tZW50LlxuICpcbiAqIERlZmluZXMgdGhlIGNvbnRyYWN0IHRoYXQgZW5naW5lIGhhbmRsZXJzIG5lZWQgZnJvbSB0aGUgcnVubmVyIGxheWVyLFxuICogYXZvaWRpbmcgY2lyY3VsYXIgaW1wb3J0cyBiZXR3ZWVuIGVuZ2luZS8gYW5kIHJ1bm5lci8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4ZWN1dGlvblJ1bnRpbWUge1xuICBnbG9iYWxTdG9yZTogeyBnZXRTdGF0ZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9O1xuICAvKipcbiAgICogVGhlIHJlZGFjdGVkIG1pcnJvciBvZiBgZ2xvYmFsU3RvcmVgIOKAlCBwcmVzZW50IHdoZW4gdGhlIHJ1bidzIHBvbGljeVxuICAgKiBrZWVwcyBvbmUgKGBSdW5Qb2xpY3kubWlycm9yYDogYSBydW4gd2l0aCBhIHJlZGFjdGlvbiBwb2xpY3kpLCBlbHNlIGFic2VudC5cbiAgICogYFN1YmZsb3dFeGVjdXRvcmAgcmVhZHMgaXQgdG8gc2VydmUgYSBzdWJmbG93J3Mgc3RhdGUgKDkuMjAuMCkuXG4gICAqL1xuICByZWRhY3RlZFN0b3JlPzogU2hhcmVkTWVtb3J5O1xuICByb290U3RhZ2VDb250ZXh0OiBTdGFnZUNvbnRleHQ7XG4gIGV4ZWN1dGlvbkhpc3Rvcnk6IHsgbGlzdCgpOiB1bmtub3duW107IHJlYWRvbmx5IGFkZHJlc3M/OiBMb2dBZGRyZXNzIH07XG4gIC8qKlxuICAgKiBBIGZyZXNoIHJvb3QgZnJhbWUgb24gdGhpcyBydW50aW1lIOKAlCBpdHMgc3RvcmUsIGl0cyBsb2csIHRoZSBydW4ncyBwb2xpY3lcbiAgICogYW5kIG1pcnJvciAoYEV4ZWN1dGlvblJ1bnRpbWUubmV3Um9vdGApLiBgU3ViZmxvd0V4ZWN1dG9yYCBzd2FwcyBhXG4gICAqIHN1YmZsb3cncyBzZWVkIGZyYW1lIGZvciB0aGUgZnJhbWUgaXRzIGZpcnN0IHN0YWdlIHJ1bnMgb24gd2l0aCBpdC5cbiAgICovXG4gIG5ld1Jvb3QobmFtZTogc3RyaW5nLCBpZDogc3RyaW5nKTogU3RhZ2VDb250ZXh0O1xuICBnZXRTbmFwc2hvdChvcHRpb25zPzogeyByZWRhY3Q/OiBib29sZWFuIH0pOiB7XG4gICAgc2hhcmVkU3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGV4ZWN1dGlvblRyZWU6IHVua25vd247XG4gICAgLyoqIFRoZSBjb21taXQgbG9nJ3MgZm9sZCBiYXNlIOKAlCBzZWUgYFJ1bnRpbWVTbmFwc2hvdC5pbml0aWFsU3RhdGVgLiAqL1xuICAgIGluaXRpYWxTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbW1pdExvZzogdW5rbm93bltdO1xuICAgIHJlYWRvbmx5IHJlYWRTb3VyY2VzPzogaW1wb3J0KCcuLi9jYXB0dXJlL3JlYWRTb3VyY2VzLmpzJykuRW5naW5lUmVhZFNvdXJjZXM7XG4gICAgcmVhZG9ubHkgbG9nQWRkcmVzcz86IExvZ0FkZHJlc3M7XG4gICAgLyoqIER1YWwta2V5ZWQgYnkgc3ViZmxvdyBwYXRoIChsYXN0IGl0ZXJhdGlvbikgQU5EIHBlci1leGVjdXRpb24gbW91bnQgcnVudGltZVN0YWdlSWRcbiAgICAgKiAgKGVhY2ggaXRlcmF0aW9uKSDigJQgc2VlIFJ1bnRpbWVTbmFwc2hvdC5zdWJmbG93UmVzdWx0cyAvIHN1YmZsb3ctY29tbWl0LXZpc2liaWxpdHkuICovXG4gICAgc3ViZmxvd1Jlc3VsdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICByZWNvcmRlcnM/OiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZGF0YTogdW5rbm93biB9PjtcbiAgfTtcbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgZ2V0UGlwZWxpbmVzKCk6IHN0cmluZ1tdO1xuICAvKipcbiAgICogV2hlcmUgYSBtb3VudCdzIG93biBsb2cgd3JpdGVzIGFzIGl0IGxhbmRzICgxMC4xLCBQNikg4oCUIHRoZSBydW4ncyBzaW5rIGF0IHRoaXMgbG9nJ3MgYWRkcmVzcyBwbHVzIHRoZSBtb3VudCdzXG4gICAqIGBydW50aW1lU3RhZ2VJZGAuIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBydW50aW1lJ3MgbG9nIHdyaXRlcyB0byBubyBzaW5rLiBgU3ViZmxvd0V4ZWN1dG9yYCBoYW5kcyBpdCB0byB0aGVcbiAgICogbmVzdGVkIHJ1bnRpbWUgaXQgY29uc3RydWN0cy5cbiAgICovXG4gIHJlY29yZEZvcj8obW91bnRSdW50aW1lU3RhZ2VJZDogc3RyaW5nLCBtZXRhPzogTWV0YSk6IHVua25vd247XG4gIC8qKiBUZWxsIHRoZSBzaW5rIHRoaXMgcnVudGltZSdzIGxvZyBlbmRlZCAoMTAuMSwgUDYpIOKAlCBhIG1vdW50J3MgYXQgaXRzIGV4aXQuIE5vLW9wIHdpdGhvdXQgYSBzaW5rLiAqL1xuICBjbG9zZVJlY29yZD8ob3V0Y29tZTogTG9nT3V0Y29tZSwgbWV0YT86IE1ldGEpOiB2b2lkO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4ZWN1dGlvbiBFbnZpcm9ubWVudCDigJQgcmVhZC1vbmx5LCBwcm9wYWdhdGVzIHRocm91Z2ggbmVzdGVkIGV4ZWN1dG9yc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRXhlY3V0aW9uRW52IOKAlCBpbmZyYXN0cnVjdHVyZSB2YWx1ZXMgdGhhdCBwcm9wYWdhdGUgdGhyb3VnaCBuZXN0ZWQgZXhlY3V0b3JzLlxuICpcbiAqIExpa2UgYHByb2Nlc3MuZW52YCBmb3IgZmxvd2NoYXJ0czogcmVhZC1vbmx5LCBpbmhlcml0ZWQgYnkgY2hpbGQgZXhlY3V0b3JzLFxuICogaW5mcmFzdHJ1Y3R1cmUtb25seSAobm90IGJ1c2luZXNzIGxvZ2ljKS5cbiAqXG4gKiBMaXRtdXMgdGVzdDogQ3JlYXRlZCBleHRlcm5hbCB0byB0aGUgZmxvd2NoYXJ0ICsgcGFzc2VkIGluIGZvciBleGVjdXRpb24gPSBlbnYuXG4gKiBCdXNpbmVzcyBjb25maWcgZm9yIGEgc3BlY2lmaWMgZmxvd2NoYXJ0ID0gYXJncyAoZ2V0QXJncygpKS5cbiAqXG4gKiBJbnRlbnRpb25hbGx5IGEgY2xvc2VkIHR5cGUg4oCUIG5vdCBleHRlbnNpYmxlIHRvIHByZXZlbnQgY291cGxpbmcgYmV0d2VlblxuICogcGFyZW50IGFuZCBjaGlsZCBmbG93Y2hhcnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkVudiB7XG4gIC8qKlxuICAgKiBBYm9ydFNpZ25hbCBmb3IgY29vcGVyYXRpdmUgY2FuY2VsbGF0aW9uIGFjcm9zcyBuZXN0ZWQgZXhlY3V0b3JzLiBIb25vdXJlZCBieSB0aGUgZW5naW5lICgxMC4xKTogaXQgZW5kcyB0aGVcbiAgICogcnVuIGxpa2UgYFJ1bk9wdGlvbnMuc2lnbmFsYC4gVW5kZXIgYSBydW4gdGhhdCBoYXMgYSBzaWduYWwgb3IgYSBkZWFkbGluZSBBTkQgYW4gZW52LCBhIHN0YWdlIHJlYWRzIHRoZSBydW4nc1xuICAgKiBPTkUgZWZmZWN0aXZlIHNpZ25hbCBoZXJlIOKAlCBgUnVuT3B0aW9ucy5zaWduYWxgLCB0aGlzIG9uZSBhbmQgdGhlIGRlYWRsaW5lJ3MgdGltZXIsIGNvbXBvc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIC8qKiBUaW1lb3V0IGJ1ZGdldCBpbiBtaWxsaXNlY29uZHMuIFJlYWRhYmxlIG9ubHkg4oCUIHRoZSBydW4ncyBkZWFkbGluZSBpcyB7QGxpbmsgZGVhZGxpbmV9LiAqL1xuICByZWFkb25seSB0aW1lb3V0TXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUcmFjZSBpZGVudGlmaWVyIGZvciBkaXN0cmlidXRlZCB0cmFjaW5nIC8gb2JzZXJ2YWJpbGl0eS4gV2l0aCBgb3BlcmF0aW9uSWRgIChvciBhbG9uZSkgaXQgYmVjb21lcyB0aGUgcnVuJ3NcbiAgICogYFJ1bkNvcnJlbGF0aW9uYDsgaXQgd2lucyBvdmVyIHRoZSB0cmFjZSBpZCBvZiBgdHJhY2VwYXJlbnRgLiAx4oCTMjU2IHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzIHdpdGggbm8gc3BhY2VcbiAgICogKHNpbmNlIDEwLjEgYW55dGhpbmcgZWxzZSByZWplY3RzIHRoZSBydW4gd2l0aCBhIGBUeXBlRXJyb3JgIG5hbWluZyB0aGUgZmllbGQg4oCUIHRoZSBpZCByaWRlcyBldmVyeSBldmVudCk7XG4gICAqIGFuIGVtcHR5IHN0cmluZyBpcyBubyBpZC5cbiAgICovXG4gIHJlYWRvbmx5IHRyYWNlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY2FsbGVyJ3MgdW5pdCBvZiB3b3JrIChXM0MncyBwYXJlbnQtaWQpIOKAlCBwYXJ0IG9mIHRoZSBydW4ncyBgUnVuQ29ycmVsYXRpb25gOyB3aW5zIG92ZXIgdGhlIGhlYWRlcidzXG4gICAqIHBhcmVudC1pZC4gTmVlZHMgYSB0cmFjZTogYHRyYWNlSWRgIG9yIGB0cmFjZXBhcmVudGAgKHJlZnVzZWQgYWxvbmUpLiBTYW1lIGNoYXJhY3RlciBydWxlIGFzIGB0cmFjZUlkYC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbklkPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBXM0MgYHRyYWNlcGFyZW50YCBoZWFkZXIsIHVzdWFsbHkgc3RyYWlnaHQgZnJvbSBhbiBpbmJvdW5kIHJlcXVlc3QuIFBhcnNlZCBTVFJJQ1RMWSBvbmNlIHBlciBydW4g4oCUIGFcbiAgICogbWFsZm9ybWVkIG9uZSByZWZ1c2VzIHRoZSBydW4gd2l0aCBhIGBUcmFjZXBhcmVudEVycm9yYCBuYW1pbmcgdGhlIHJlYXNvbiAobmV2ZXIgdGhlIGhlYWRlcikuIFN0YWdlcyByZWFkXG4gICAqIGJhY2sgKGAkZ2V0RW52KClgKSBleGFjdGx5IGBSdW5Db3JyZWxhdGlvbi50cmFjZXBhcmVudGAg4oCUIHRoZSBjYW5vbmljYWwgaGVhZGVyIG9mIHRoZSBlZmZlY3RpdmUgaWRzIOKAlCBvciBub1xuICAgKiBrZXkgd2hlbiB0aGUgcnVuJ3MgY29ycmVsYXRpb24gY2FycmllcyBub25lLiBDb3JyZWxhdGlvbiBvbmx5OiBuZXZlciBpZGVudGl0eSBvciBhdXRob3Jpc2F0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdHJhY2VwYXJlbnQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgZGVhZGxpbmUsIGVwb2NoIG1pbGxpc2Vjb25kcyAoMTAuMSkg4oCUIHRoZSBlYXJsaWVzdCBvZiBgUnVuT3B0aW9ucy5kZWFkbGluZWAsIGBub3cgKyBSdW5PcHRpb25zLnRpbWVvdXRNc2BcbiAgICogYW5kIGEgZGVhZGxpbmUgZ2l2ZW4gaGVyZS4gVGhlIHJ1bidzIHNpZ25hbCBhYm9ydHMgd2hlbiBpdCBwYXNzZXM7IGV2ZXJ5IGF0dGVtcHQgaXMgY2FwcGVkIGJ5IHRoZSB0aW1lIGxlZnQuXG4gICAqIEluaGVyaXRlZCBieSBzdWJmbG93cy4gUmVhZCBpdCB0aHJvdWdoIGBzY29wZS4kYXR0ZW1wdCgpLnRpbWVMZWZ0TXMoKWAuXG4gICAqL1xuICByZWFkb25seSBkZWFkbGluZT86IG51bWJlcjtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIYW5kbGVyIERlcGVuZGVuY2llcyAoREkgYmFnKSDigJQgd2FzIFBpcGVsaW5lQ29udGV4dFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogSGFuZGxlckRlcHMg4oCUIERlcGVuZGVuY3kgaW5qZWN0aW9uIGJhZyBwYXNzZWQgdG8gYWxsIGhhbmRsZXIgbW9kdWxlcy5cbiAqXG4gKiBQcm92aWRlcyBzaGFyZWQgc3RhdGUgKHN0YWdlTWFwLCBydW50aW1lLCBzY29wZUZhY3RvcnksIGV0Yy4pIHdpdGhvdXRcbiAqIGhhbmRsZXJzIG5lZWRpbmcgdG8gaW1wb3J0IHRoZSB0cmF2ZXJzZXIgZGlyZWN0bHkuIEF2b2lkcyBjaXJjdWxhciBkZXBzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRsZXJEZXBzPFRPdXQgPSBhbnksIFRTY29wZSA9IGFueT4ge1xuICBzdGFnZU1hcDogTWFwPHN0cmluZywgU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+PjtcbiAgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIGV4ZWN1dGlvblJ1bnRpbWU6IElFeGVjdXRpb25SdW50aW1lO1xuICBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICBzdWJmbG93cz86IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT47XG4gIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIHN0cmVhbUhhbmRsZXJzPzogU3RyZWFtSGFuZGxlcnM7XG4gIHNjb3BlUHJvdGVjdGlvbk1vZGU6IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gIC8qKiBFeGVjdXRpb24gZW52aXJvbm1lbnQg4oCUIHByb3BhZ2F0ZXMgdG8gc3ViZmxvd3MgYXV0b21hdGljYWxseS4gKi9cbiAgZXhlY3V0aW9uRW52PzogRXhlY3V0aW9uRW52O1xuICBuYXJyYXRpdmVHZW5lcmF0b3I6IElDb250cm9sRmxvd05hcnJhdGl2ZTtcbiAgbG9nZ2VyOiBJTG9nZ2VyO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgLyoqXG4gICAqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSAoTTIpIOKAlCBzaGFyZWQgYnkgcmVmZXJlbmNlIHdpdGggZXZlcnlcbiAgICogbmVzdGVkIHRyYXZlcnNlciwgbGlrZSB0aGUgZXhlY3V0aW9uIGNvdW50ZXIuIGBTdWJmbG93RXhlY3V0b3JgIGFza3MgaXRcbiAgICogYXQgZWFjaCBzdWJmbG93IGVudHJ5OiB0aGUgRklSU1QgZW50cnkgaW50byBhIHN1YmZsb3cgb24gdGhlIHBhdXNlIHBhdGhcbiAgICogdGFrZXMgdGhhdCBzdWJmbG93J3MgY2FwdHVyZWQgc3RhdGUgKHNlZWRpbmcgdGhlIG5lc3RlZCBydW50aW1lIGluIHBsYWNlXG4gICAqIG9mIHRoZSBpbnB1dE1hcHBlcidzIHZhbHVlcyDigJQgdGhlIG1hcHBlciBzdGlsbCBydW5zIGZvciB0aGUgcmVhZC1vbmx5XG4gICAqIGFyZ3MpLCBpdHMgZW50cnkgcG9pbnQgYW5kIGFueSBzaWJsaW5nIHBhdXNlcyB3YWl0aW5nIHRoZXJlOyBldmVyeSBsYXRlclxuICAgKiBlbnRyeSBpcyBhbiBvcmRpbmFyeSBvbmUuIFNlZSBgUmVzdW1lRW50cnlgLiBVbmRlZmluZWQgb24gbm9ybWFsIGBydW4oKWBcbiAgICogcGF0aHMuXG4gICAqL1xuICByZXN1bWU/OiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+O1xufVxuXG4vKiogT3B0aW9ucyBmb3IgRmxvd0NoYXJ0RXhlY3V0b3IucnVuKCkuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bk9wdGlvbnMge1xuICAvKiogQWJvcnRTaWduYWwgZm9yIGNvb3BlcmF0aXZlIGNhbmNlbGxhdGlvbi4gQ29tcG9zZWQgd2l0aCBgZW52LnNpZ25hbGAgYW5kIHRoZSBkZWFkbGluZSAoMTAuMSkuICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHM6IHRoZSBydW4ncyBkZWFkbGluZSBpcyBgbm93ICsgdGltZW91dE1zYC4gVGhlIHJ1biBhYm9ydHMgd2hlbiBpdCBwYXNzZXMgKHJlamVjdGluZyB3aXRoXG4gICAqIGBFeGVjdXRpb24gdGltZWQgb3V0IGFmdGVyIDx0aW1lb3V0TXM+bXNgKSwgc3RhZ2VzIHJlYWQgaXQgYXMgYGVudi5kZWFkbGluZWAsIGFuZCBldmVyeSBzdGFnZSByZWNvcmRzIGl0c1xuICAgKiBhdHRlbXB0IChgU3RhZ2VTbmFwc2hvdC5hdHRlbXB0c2ApLiBIb25vdXJlZCBiZXNpZGUgYSBgc2lnbmFsYCBzaW5jZSAxMC4xIChpdCB1c2VkIHRvIGJlIGlnbm9yZWQgdGhlcmUpLlxuICAgKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHJ1bidzIGRlYWRsaW5lLCBlcG9jaCBtaWxsaXNlY29uZHMgKDEwLjEpIOKAlCBgRGF0ZS5ub3coKSArIDEyMF8wMDBgLiBTYW1lIGVmZmVjdCBhcyBgdGltZW91dE1zYDsgd2hlbiBib3RoXG4gICAqIGFyZSBnaXZlbiwgdGhlIGVhcmxpZXIgd2lucy4gQSBkZWFkbGluZSBhbHJlYWR5IHBhc3Qgc3RvcHMgdGhlIHJ1biBiZWZvcmUgaXRzIGZpcnN0IHN0YWdlLiBBIHJlc3VtZWQgbGVnIGhhc1xuICAgKiBpdHMgb3duOiBwYXNzIGl0IGFnYWluIHRvIGByZXN1bWUoKWAuXG4gICAqL1xuICBkZWFkbGluZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJ1bnRpbWUgaW5wdXQgZGF0YSBmb3IgdGhlIHBpcGVsaW5lLlxuICAgKiBCZWNvbWVzIHRoZSByZWFkT25seUNvbnRleHQgYWNjZXNzaWJsZSB2aWEgYHNjb3BlLmdldEFyZ3MoKWAuXG4gICAqIFN0YWdlcyBjYW5ub3Qgb3ZlcndyaXRlIHRoZXNlIGtleXMgd2l0aCBgc2V0VmFsdWUoKWAuXG4gICAqL1xuICBpbnB1dD86IHVua25vd247XG4gIC8qKlxuICAgKiBFeGVjdXRpb24gZW52aXJvbm1lbnQg4oCUIHJlYWQtb25seSBpbmZyYXN0cnVjdHVyZSB2YWx1ZXMgdGhhdCBwcm9wYWdhdGVcbiAgICogdGhyb3VnaCBuZXN0ZWQgZXhlY3V0b3JzIChsaWtlIGBwcm9jZXNzLmVudmAgZm9yIGZsb3djaGFydHMpLlxuICAgKiBBY2Nlc3NpYmxlIHZpYSBgc2NvcGUuZ2V0RW52KClgLiBJbmhlcml0ZWQgYnkgc3ViZmxvd3MgYXV0b21hdGljYWxseS5cbiAgICovXG4gIGVudj86IEV4ZWN1dGlvbkVudjtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBtYXhpbXVtIG5lc3RlZCBgZXhlY3V0ZU5vZGVgIGRlcHRoIGZvciB0aGlzIHJ1bi5cbiAgICogRGVmYXVsdHMgdG8gYEZsb3djaGFydFRyYXZlcnNlci5NQVhfRVhFQ1VURV9ERVBUSGAgKDUwMCkuXG4gICAqXG4gICAqIERlcHRoIGNvdW50cyBUUkVFIG5lc3Rpbmcgb25seSDigJQgZm9yayBjaGlsZHJlbiwgZGVjaWRlci9zZWxlY3RvciBicmFuY2hcbiAgICogZGlzcGF0Y2gsIHJlY3Vyc2l2ZSBjb21wb3NpdGlvbi4gTGluZWFyIGNoYWlucyBhbmQgbG9vcCBpdGVyYXRpb25zIHJ1blxuICAgKiBvbiBhIGZsYXQgdHJhbXBvbGluZSBhbmQgbmV2ZXIgY29uc3VtZSBkZXB0aCwgc28gdGhpcyByYXJlbHkgbmVlZHNcbiAgICogcmFpc2luZy4gTXVzdCBiZSA+PSAxLlxuICAgKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgbWF4aW11bSBsb29wIGl0ZXJhdGlvbnMgcGVyIG5vZGUgZm9yIHRoaXMgcnVuICh0aGVcbiAgICogYENvbnRpbnVhdGlvblJlc29sdmVyYCBpbmZpbml0ZS1sb29wIGd1YXJkKS4gRGVmYXVsdHMgdG8gMTAwMC5cbiAgICogVGhpcyBpcyB0aGUgYmluZGluZyBjb25zdHJhaW50IGZvciBsb29wLWhlYXZ5IHBpcGVsaW5lcyDigJQgcmFpc2UgaXQgZm9yXG4gICAqIGxlZ2l0aW1hdGVseSBsb25nIGxvb3BzIChgbG9vcFRvYCBjaGFpbnMgcnVuIHdpdGggYSBmbGF0IHN0YWNrLCBzbyBoaWdoXG4gICAqIHZhbHVlcyBhcmUgc2FmZTsgbWVtb3J5IGZvciBzdGF0ZS9uYXJyYXRpdmUgc3RpbGwgZ3Jvd3MgcGVyIGl0ZXJhdGlvbikuXG4gICAqIEFsc28gYm91bmRzIHRoZSBydW4tdG90YWwgY2hhaW4gb2YgZnVuY3Rpb24tYmVhcmluZyBkeW5hbWljIGBuZXh0YFxuICAgKiBjb250aW51YXRpb25zIChmcmVzaCBub2RlcyByZXR1cm5lZCBmcm9tIHN0YWdlcykg4oCUIGEgcnVuYXdheSBkeW5hbWljXG4gICAqIGNoYWluIGVycm9ycyBpbnN0ZWFkIG9mIHJ1bm5pbmcgZm9yZXZlci5cbiAgICogUHJvcGFnYXRlcyB0byBzdWJmbG93cy4gTXVzdCBiZSA+PSAxLlxuICAgKi9cbiAgbWF4SXRlcmF0aW9ucz86IG51bWJlcjtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGbG93IENvbnRyb2wgTmFycmF0aXZlIOKAlCBjYW5vbmljYWwgZGVmaW5pdGlvbnMgbGl2ZSBpbiBtZW1vcnkvdHlwZXMudHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgdHlwZSB7IEZsb3dDb250cm9sVHlwZSwgRmxvd01lc3NhZ2UgfTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSdW50aW1lIFN0cnVjdHVyZSBNZXRhZGF0YSAodXNlZCBieSBSdW50aW1lU3RydWN0dXJlTWFuYWdlcilcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVTdHJ1Y3R1cmVNZXRhZGF0YSB7XG4gIHR5cGU6ICdzdGFnZScgfCAnZGVjaWRlcicgfCAnc2VsZWN0b3InIHwgJ2ZvcmsnIHwgJ3N0cmVhbWluZycgfCAnc3ViZmxvdycgfCAnbG9vcCc7XG4gIHN1YmZsb3dJZD86IHN0cmluZztcbiAgaXNTdWJmbG93Um9vdD86IGJvb2xlYW47XG4gIHN1YmZsb3dOYW1lPzogc3RyaW5nO1xuICAvKiogVHJ1ZSBmb3IgYW4gYGFkZFBhcmFsbGVsRm9yRWFjaGAgZmFuLW91dCAodHlwZSBzdGF5cyBgJ2ZvcmsnYCkuICovXG4gIGlzRHluYW1pY1BhcmFsbGVsPzogYm9vbGVhbjtcbiAgaXNQYXJhbGxlbENoaWxkPzogYm9vbGVhbjtcbiAgcGFyYWxsZWxHcm91cElkPzogc3RyaW5nO1xuICBsb29wVGFyZ2V0Pzogc3RyaW5nO1xuICBpc0R5bmFtaWM/OiBib29sZWFuO1xuICBpc0xvb3BSZWZlcmVuY2U/OiBib29sZWFuO1xuICBzdHJlYW1JZD86IHN0cmluZztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBOb2RlIFJlc3VsdFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIE5vZGVSZXN1bHRUeXBlID0ge1xuICBpZDogc3RyaW5nO1xuICByZXN1bHQ6IHVua25vd247XG4gIGlzRXJyb3I/OiBib29sZWFuO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeGVjdXRpb24gUmVzcG9uc2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgdHlwZSBCcmFuY2hSZXN1bHQgPSB7XG4gIHJlc3VsdDogc3RyaW5nIHwgRXJyb3I7XG4gIGlzRXJyb3I6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBCcmFuY2hSZXN1bHRzID0geyBbYnJhbmNoSWQ6IHN0cmluZ106IEJyYW5jaFJlc3VsdCB9O1xuZXhwb3J0IHR5cGUgVHJhdmVyc2FsUmVzdWx0ID0gQnJhbmNoUmVzdWx0cyB8IHN0cmluZyB8IEVycm9yO1xuXG4vKiogUmV0dXJuZWQgYnkgcnVuKCkvcmVzdW1lKCkgd2hlbiBleGVjdXRpb24gcGF1c2VzLiAqL1xuZXhwb3J0IHR5cGUgUGF1c2VkUmVzdWx0ID0ge1xuICByZWFkb25seSBwYXVzZWQ6IHRydWU7XG4gIHJlYWRvbmx5IGNoZWNrcG9pbnQ6IGltcG9ydCgnLi4vcGF1c2UvdHlwZXMuanMnKS5GbG93Y2hhcnRDaGVja3BvaW50O1xufTtcblxuLyoqIEZ1bGwgcmV0dXJuIHR5cGUgb2YgRmxvd0NoYXJ0RXhlY3V0b3IucnVuKCkgYW5kIHJlc3VtZSgpLiAqL1xuZXhwb3J0IHR5cGUgRXhlY3V0b3JSZXN1bHQgPSBUcmF2ZXJzYWxSZXN1bHQgfCBQYXVzZWRSZXN1bHQ7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU2VyaWFsaXplZCBQaXBlbGluZSBTdHJ1Y3R1cmUgKGZvciB2aXN1YWxpemF0aW9uKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplZFBpcGVsaW5lTm9kZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgdHlwZT86XG4gICAgfCAnc3RhZ2UnXG4gICAgfCAnZGVjaWRlcidcbiAgICB8ICdzZWxlY3RvcidcbiAgICB8ICdmb3JrJ1xuICAgIHwgJ3N0cmVhbWluZydcbiAgICB8ICdzdWJmbG93J1xuICAgIHwgJ2xvb3AnXG4gICAgfCAndXNlcidcbiAgICB8ICd0b29sJ1xuICAgIHwgJ2Z1bmN0aW9uJ1xuICAgIHwgJ3NlcXVlbmNlJztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGNoaWxkcmVuPzogU2VyaWFsaXplZFBpcGVsaW5lTm9kZVtdO1xuICBuZXh0PzogU2VyaWFsaXplZFBpcGVsaW5lTm9kZTtcbiAgYnJhbmNoZXM/OiBSZWNvcmQ8c3RyaW5nLCBTZXJpYWxpemVkUGlwZWxpbmVOb2RlPjtcbiAgaGFzRGVjaWRlcj86IGJvb2xlYW47XG4gIGhhc1NlbGVjdG9yPzogYm9vbGVhbjtcbiAgaGFzU3VidHJlZT86IGJvb2xlYW47XG4gIGlzU3RyZWFtaW5nPzogYm9vbGVhbjtcbiAgc3RyZWFtSWQ/OiBzdHJpbmc7XG4gIGlzU3ViZmxvd1Jvb3Q/OiBib29sZWFuO1xuICBzdWJmbG93SWQ/OiBzdHJpbmc7XG4gIHN1YmZsb3dOYW1lPzogc3RyaW5nO1xuICBsb29wVGFyZ2V0Pzogc3RyaW5nO1xuICBpc0xvb3BSZWZlcmVuY2U/OiBib29sZWFuO1xuICBpc1BhcmFsbGVsQ2hpbGQ/OiBib29sZWFuO1xuICBwYXJhbGxlbEdyb3VwSWQ/OiBzdHJpbmc7XG4gIGlzRHluYW1pYz86IGJvb2xlYW47XG4gIC8qKiBXaGVuIHRydWUsIHRoaXMgc3RhZ2UgY2FuIHBhdXNlIGV4ZWN1dGlvbiAoUGF1c2FibGVIYW5kbGVyIHBhdHRlcm4pLiAqL1xuICBpc1BhdXNhYmxlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRydWUgZm9yIGFuIGBhZGRQYXJhbGxlbEZvckVhY2hgIGZhbi1vdXQg4oCUIGJyYW5jaCBDT1VOVCBkZWNpZGVkIGF0IHJ1bnRpbWVcbiAgICogZnJvbSB0aGUgcGF5bG9hZC4gQSBmbGFnLCBub3QgYSB0eXBlOiBgdHlwZWAgc3RheXMgYCdmb3JrJ2Agc28gZXZlcnlcbiAgICogZXhpc3RpbmcgY29uc3VtZXIgcmVuZGVycyBpdCBjb3JyZWN0bHkgKGl0IElTIGEgZmFuLW91dCksIGFuZCBhIGNvbnN1bWVyXG4gICAqIHRoYXQgd2FudHMgdG8gc2F5IFwib25lIGJyYW5jaCBwZXIgaXRlbVwiIGNhbiByZWFkIHRoaXMuXG4gICAqL1xuICBpc0R5bmFtaWNQYXJhbGxlbD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUb3RhbCBhdHRlbXB0cyB0aGlzIHN0YWdlJ3MgZnVuY3Rpb24gbWF5IHJ1biwgZnJvbSBpdHMgZGVjbGFyZWRcbiAgICoge0BsaW5rIFJldHJ5UG9saWN5fS4gUHJlc2VudCBvbmx5IHdoZW4gYSBwb2xpY3kgd2FzIGRlY2xhcmVkLiBUaGUgQ09VTlRcbiAgICogb25seSDigJQgYGJhY2tvZmZNc2AgYW5kIGByZXRyeU9uYCBjYW4gYmUgZnVuY3Rpb25zLCB3aGljaCBhIEpTT04tc2FmZSBzcGVjXG4gICAqIGNhbm5vdCBjYXJyeS5cbiAgICovXG4gIHJldHJ5QXR0ZW1wdHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBEZWNsYXJlZCB0YWdzICg5LjIxLjApIOKAlCB0aGUgbmFtZXMgdGhlIGF1dGhvciBwdXQgb24gdGhpcyBzdGFnZSBhdCBidWlsZFxuICAgKiB0aW1lLCBjb3BpZWQgYXMtaXMuIEZyZWUgc3RyaW5nczsgZm9vdHByaW50anMgYXNzaWducyB0aGVtIG5vIG1lYW5pbmcuXG4gICAqIEFic2VudCB3aGVuIHRoZSBzdGFnZSBkZWNsYXJlcyBub25lLlxuICAgKi9cbiAgdGFncz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZsb3dDaGFydCBpcyBkZWZpbmVkIGluIGAuLi9idWlsZGVyL3R5cGVzLnRzYC4gVGhlIGVuZ2luZSBsYXllciBjb25zdW1lcyBpdFxuLy8gdmlhIGltcG9ydCBmcm9tIHRoZXJlLiBBIGR1cGxpY2F0ZSBtaW5pbWFsIGRlZmluaXRpb24gcHJldmlvdXNseSBsaXZlZCBoZXJlXG4vLyBhbmQgY2F1c2VkIFRTIGNvbmZ1c2lvbiBhdCBjb21wb3NpdGlvbiBib3VuZGFyaWVzIChDb21wb3NhYmxlUnVubmVyIHZzXG4vLyBhZGRTdWJGbG93Q2hhcnQgcGFyYW1ldGVyKS4gU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBub3cgbGl2ZXMgaW4gYnVpbGRlci8uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIEFsaWFzIGZvciBTZXJpYWxpemVkUGlwZWxpbmVOb2RlIHVzZWQgYXMgZnVsbCBzdHJ1Y3R1cmUgKi9cbmV4cG9ydCB0eXBlIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSA9IFNlcmlhbGl6ZWRQaXBlbGluZU5vZGUgJiB7XG4gIGJyYW5jaElkcz86IHN0cmluZ1tdO1xuICBzdWJmbG93U3RydWN0dXJlPzogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlO1xuICBpdGVyYXRpb25Db3VudD86IG51bWJlcjtcbn07XG4iXX0=
@@ -63,7 +63,9 @@ export declare class StageContext {
63
63
  capture?: NativeCapture;
64
64
  /** Source coverage, shared only by frames of this runtime. */
65
65
  readSources?: EngineReadSourceCapture;
66
+ private sourceReadCounter?;
66
67
  private sourceAttempt?;
68
+ private sourceInvocations;
67
69
  stageName: string;
68
70
  /** Unique stage identifier from the builder (matches spec node id). */
69
71
  stageId: string;
@@ -525,6 +527,8 @@ export declare class StageContext {
525
527
  get attemptSummary(): AttemptSummary | undefined;
526
528
  /** The attempt about to run (and the run's signal) — `StageRunner` sets both before it builds the scope. */
527
529
  useAttempt(attempt: AttemptContext | undefined, runSignal: AbortSignal | undefined): void;
530
+ /** Native function-entry fact, including the direct one-call path with no retry runner. */
531
+ beginSourceInvocation(attempt: AttemptContext | undefined): void;
528
532
  /** The attempt now running; `undefined` for a stage the attempt runner does not run. */
529
533
  get attempt(): AttemptContext | undefined;
530
534
  /** The run's signal, as `StageRunner` last saw it. */