footprintjs 9.30.0 → 9.32.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 (149) hide show
  1. package/AGENTS.md +3 -3
  2. package/CLAUDE.md +6 -4
  3. package/dist/esm/index.d.ts +1 -1
  4. package/dist/esm/index.js +2 -2
  5. package/dist/esm/lib/builder/FlowChartBuilder.js +2 -2
  6. package/dist/esm/lib/builder/structure/StructureRecorderDispatcher.js +2 -2
  7. package/dist/esm/lib/capture/circular.d.ts +17 -0
  8. package/dist/esm/lib/capture/circular.js +45 -0
  9. package/dist/esm/lib/capture/envelope.d.ts +1 -1
  10. package/dist/esm/lib/capture/envelope.js +2 -2
  11. package/dist/esm/lib/capture/index.d.ts +7 -1
  12. package/dist/esm/lib/capture/index.js +8 -2
  13. package/dist/esm/lib/capture/invokeHook.d.ts +36 -0
  14. package/dist/esm/lib/capture/invokeHook.js +42 -0
  15. package/dist/esm/lib/capture/summarize.d.ts +13 -0
  16. package/dist/esm/lib/capture/summarize.js +37 -1
  17. package/dist/esm/lib/decide/decide.js +2 -2
  18. package/dist/esm/lib/decide/evaluator.js +5 -4
  19. package/dist/esm/lib/decide/evidence.js +4 -3
  20. package/dist/esm/lib/devMode.d.ts +45 -0
  21. package/dist/esm/lib/devMode.js +96 -0
  22. package/dist/esm/lib/engine/handlers/RuntimeStructureManager.js +2 -2
  23. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
  24. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +2 -2
  25. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +2 -2
  26. package/dist/esm/lib/memory/StageContext.js +5 -4
  27. package/dist/esm/lib/memory/admission.d.ts +1 -1
  28. package/dist/esm/lib/memory/admission.js +2 -2
  29. package/dist/esm/lib/memory/backtrack.d.ts +9 -0
  30. package/dist/esm/lib/memory/backtrack.js +2 -2
  31. package/dist/esm/lib/memory/commitLogUtils.d.ts +21 -3
  32. package/dist/esm/lib/memory/commitLogUtils.js +39 -43
  33. package/dist/esm/lib/memory/equality.d.ts +57 -0
  34. package/dist/esm/lib/memory/equality.js +159 -0
  35. package/dist/esm/lib/memory/honesty.d.ts +88 -0
  36. package/dist/esm/lib/memory/honesty.js +86 -0
  37. package/dist/esm/lib/memory/index.d.ts +5 -1
  38. package/dist/esm/lib/memory/index.js +7 -2
  39. package/dist/esm/lib/memory/merge.d.ts +25 -0
  40. package/dist/esm/lib/memory/merge.js +49 -0
  41. package/dist/esm/lib/memory/paths.d.ts +52 -0
  42. package/dist/esm/lib/memory/paths.js +57 -0
  43. package/dist/esm/lib/memory/placeholders.d.ts +44 -0
  44. package/dist/esm/lib/memory/placeholders.js +45 -0
  45. package/dist/esm/lib/memory/redaction.d.ts +4 -4
  46. package/dist/esm/lib/memory/redaction.js +12 -11
  47. package/dist/esm/lib/memory/utils.d.ts +15 -216
  48. package/dist/esm/lib/memory/utils.js +19 -438
  49. package/dist/esm/lib/memory/verbs.d.ts +289 -0
  50. package/dist/esm/lib/memory/verbs.js +386 -0
  51. package/dist/esm/lib/recorder/BoundaryStateStore.js +2 -2
  52. package/dist/esm/lib/recorder/invokeHook.d.ts +5 -29
  53. package/dist/esm/lib/recorder/invokeHook.js +6 -35
  54. package/dist/esm/lib/runner/DeferredObserverTier.js +3 -3
  55. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +1 -0
  56. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -4
  57. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
  58. package/dist/esm/lib/runner/FlowChartExecutor.js +2 -2
  59. package/dist/esm/lib/runner/getSubtreeSnapshot.js +2 -2
  60. package/dist/esm/lib/scope/ScopeFacade.js +6 -4
  61. package/dist/esm/lib/scope/detectCircular.d.ts +9 -43
  62. package/dist/esm/lib/scope/detectCircular.js +10 -121
  63. package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +3 -5
  64. package/dist/esm/lib/scope/recorders/summarizeValue.js +4 -29
  65. package/dist/esm/lib/slice/elementProvenance.d.ts +13 -9
  66. package/dist/esm/lib/slice/elementProvenance.js +54 -63
  67. package/dist/esm/lib/slice/types.d.ts +40 -27
  68. package/dist/esm/lib/slice/types.js +1 -1
  69. package/dist/esm/lib/time-travel/bundles.js +6 -4
  70. package/dist/esm/lib/time-travel/stateAt.d.ts +3 -2
  71. package/dist/esm/lib/time-travel/stateAt.js +4 -3
  72. package/dist/esm/lib/time-travel/types.d.ts +18 -7
  73. package/dist/esm/lib/time-travel/types.js +1 -1
  74. package/dist/esm/trace.d.ts +3 -0
  75. package/dist/esm/trace.js +7 -1
  76. package/dist/index.js +5 -5
  77. package/dist/lib/builder/FlowChartBuilder.js +3 -3
  78. package/dist/lib/builder/structure/StructureRecorderDispatcher.js +3 -3
  79. package/dist/lib/capture/circular.js +49 -0
  80. package/dist/lib/capture/envelope.js +2 -2
  81. package/dist/lib/capture/index.js +11 -2
  82. package/dist/lib/capture/invokeHook.js +46 -0
  83. package/dist/lib/capture/summarize.js +39 -2
  84. package/dist/lib/decide/decide.js +4 -4
  85. package/dist/lib/decide/evaluator.js +6 -5
  86. package/dist/lib/decide/evidence.js +4 -3
  87. package/dist/lib/devMode.js +102 -0
  88. package/dist/lib/engine/handlers/RuntimeStructureManager.js +5 -5
  89. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +3 -3
  90. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -19
  91. package/dist/lib/memory/StageContext.js +7 -6
  92. package/dist/lib/memory/admission.js +2 -2
  93. package/dist/lib/memory/backtrack.js +3 -3
  94. package/dist/lib/memory/commitLogUtils.js +41 -44
  95. package/dist/lib/memory/equality.js +163 -0
  96. package/dist/lib/memory/honesty.js +89 -0
  97. package/dist/lib/memory/index.js +11 -3
  98. package/dist/lib/memory/merge.js +53 -0
  99. package/dist/lib/memory/paths.js +62 -0
  100. package/dist/lib/memory/placeholders.js +48 -0
  101. package/dist/lib/memory/redaction.js +14 -13
  102. package/dist/lib/memory/utils.js +30 -448
  103. package/dist/lib/memory/verbs.js +403 -0
  104. package/dist/lib/recorder/BoundaryStateStore.js +5 -5
  105. package/dist/lib/recorder/invokeHook.js +8 -37
  106. package/dist/lib/runner/DeferredObserverTier.js +6 -6
  107. package/dist/lib/runner/ExecutionRuntime.js +3 -5
  108. package/dist/lib/runner/FlowChartExecutor.js +4 -4
  109. package/dist/lib/runner/getSubtreeSnapshot.js +3 -3
  110. package/dist/lib/scope/ScopeFacade.js +10 -8
  111. package/dist/lib/scope/detectCircular.js +15 -126
  112. package/dist/lib/scope/recorders/summarizeValue.js +7 -32
  113. package/dist/lib/slice/elementProvenance.js +53 -62
  114. package/dist/lib/slice/types.js +1 -1
  115. package/dist/lib/time-travel/bundles.js +6 -4
  116. package/dist/lib/time-travel/stateAt.js +4 -3
  117. package/dist/lib/time-travel/types.js +1 -1
  118. package/dist/trace.js +35 -27
  119. package/dist/types/index.d.ts +1 -1
  120. package/dist/types/lib/capture/circular.d.ts +17 -0
  121. package/dist/types/lib/capture/envelope.d.ts +1 -1
  122. package/dist/types/lib/capture/index.d.ts +7 -1
  123. package/dist/types/lib/capture/invokeHook.d.ts +36 -0
  124. package/dist/types/lib/capture/summarize.d.ts +13 -0
  125. package/dist/types/lib/devMode.d.ts +45 -0
  126. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +1 -1
  127. package/dist/types/lib/memory/admission.d.ts +1 -1
  128. package/dist/types/lib/memory/backtrack.d.ts +9 -0
  129. package/dist/types/lib/memory/commitLogUtils.d.ts +21 -3
  130. package/dist/types/lib/memory/equality.d.ts +57 -0
  131. package/dist/types/lib/memory/honesty.d.ts +88 -0
  132. package/dist/types/lib/memory/index.d.ts +5 -1
  133. package/dist/types/lib/memory/merge.d.ts +25 -0
  134. package/dist/types/lib/memory/paths.d.ts +52 -0
  135. package/dist/types/lib/memory/placeholders.d.ts +44 -0
  136. package/dist/types/lib/memory/redaction.d.ts +4 -4
  137. package/dist/types/lib/memory/utils.d.ts +15 -216
  138. package/dist/types/lib/memory/verbs.d.ts +289 -0
  139. package/dist/types/lib/recorder/invokeHook.d.ts +5 -29
  140. package/dist/types/lib/runner/ExecutionRuntime.d.ts +1 -0
  141. package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
  142. package/dist/types/lib/scope/detectCircular.d.ts +9 -43
  143. package/dist/types/lib/scope/recorders/summarizeValue.d.ts +3 -5
  144. package/dist/types/lib/slice/elementProvenance.d.ts +13 -9
  145. package/dist/types/lib/slice/types.d.ts +40 -27
  146. package/dist/types/lib/time-travel/stateAt.d.ts +3 -2
  147. package/dist/types/lib/time-travel/types.d.ts +18 -7
  148. package/dist/types/trace.d.ts +3 -0
  149. package/package.json +2 -1
@@ -12,7 +12,7 @@
12
12
  * of touched paths do not fold back. `TransactionBuffer · admit` asks once per
13
13
  * commit that staged a `merge` or a nested op, and lays the rows out again
14
14
  * with those families written as what the stage read. The fold is the one
15
- * verb switch ({@link dryFold}, no clone); the compare is {@link deepEqual}.
15
+ * verb law ({@link dryFold}, no clone); the compare is {@link deepEqual}.
16
16
  */
17
17
  import { isContainer, nativeGet as _get, ownChild } from './pathOps.js';
18
18
  import { deepEqual, DELIM, dryFold } from './utils.js';
@@ -149,4 +149,4 @@ function shallowestIn(path, touched) {
149
149
  }
150
150
  return path;
151
151
  }
152
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYWRtaXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBa0N2RDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsU0FBZSxFQUNmLElBQWEsRUFDYixXQUFvQixFQUNwQixHQUF3QixFQUN4QixPQUEwQjtJQUUxQixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEYsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEQsSUFBSSxLQUFzQyxDQUFDO0lBQzNDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUM7WUFBRSxDQUFDLEtBQUssS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckcsQ0FBQztJQUNELE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDdkUsQ0FB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LEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhZG1pc3Npb24udHMg4oCUIHRoZSBhZG1pdHRlZCByZWNvcmQncyBjaGVjayAoOS4zMC4wKTogZG9lcyBhIGNvbW1pdCdzIGJ1bmRsZVxuICogZm9sZCBiYWNrIHRvIHdoYXQgaXRzIHN0YWdlIHJlYWQ/IChkb2NzL2Rlc2lnbi8yMDI2LTEwLWFkbWl0dGVkLXJlY29yZC5tZClcbiAqXG4gKiBUSEUgTEFXOiBhIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUsIHJlcGxheWVkIG9udG8gdGhlIHN0YXRlXG4gKiB0aGUgc3RhZ2UgYmVnYW4gZnJvbSwgZ2l2ZXMgYmFjayB0aGUgc3RhZ2UncyByZWFkLXlvdXItd3JpdGVzIHZpZXcgYXQgZXZlcnlcbiAqIHBhdGggdGhlIHN0YWdlIHRvdWNoZWQg4oCUIGFuZCBhdCBldmVyeSBjb250YWluZXIgYW5kIGFycmF5IHNsb3QgaXRzIHdyaXRlc1xuICogbWFkZSBvbiB0aGUgd2F5IHRoZXJlLCBiZWxvdyB0aGUgc3RhZ2UncyBhZGRyZXNzLlxuICpcbiAqIFB1cmU6IGhhbmRlZCB0aGUgY2FuZGlkYXRlIHJvd3MsIHRoZSBzdGFnZSdzIGRpZmYgYmFzZSwgaXRzIHdvcmtpbmcgY29weSxcbiAqIGl0cyBvcCB0cmFjZSBhbmQgaXRzIGFkZHJlc3MsIHtAbGluayBsb3NzeUZhbWlsaWVzfSBhbnN3ZXJzIHdoaWNoIGZhbWlsaWVzXG4gKiBvZiB0b3VjaGVkIHBhdGhzIGRvIG5vdCBmb2xkIGJhY2suIGBUcmFuc2FjdGlvbkJ1ZmZlciDCtyBhZG1pdGAgYXNrcyBvbmNlIHBlclxuICogY29tbWl0IHRoYXQgc3RhZ2VkIGEgYG1lcmdlYCBvciBhIG5lc3RlZCBvcCwgYW5kIGxheXMgdGhlIHJvd3Mgb3V0IGFnYWluXG4gKiB3aXRoIHRob3NlIGZhbWlsaWVzIHdyaXR0ZW4gYXMgd2hhdCB0aGUgc3RhZ2UgcmVhZC4gVGhlIGZvbGQgaXMgdGhlIG9uZVxuICogdmVyYiBzd2l0Y2ggKHtAbGluayBkcnlGb2xkfSwgbm8gY2xvbmUpOyB0aGUgY29tcGFyZSBpcyB7QGxpbmsgZGVlcEVxdWFsfS5cbiAqL1xuXG5pbXBvcnQgeyBpc0NvbnRhaW5lciwgbmF0aXZlR2V0IGFzIF9nZXQsIG93bkNoaWxkIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgREVMSU0sIGRyeUZvbGQgfSBmcm9tICcuL3V0aWxzLmpzJztcblxuLyoqIFRoZSByb3dzIGEgcGF5bG9hZCBpcyBidWlsdCBmcm9tLCBiZWZvcmUgdGhlIGNvbW1pdCBuYW1lcyBpdHMgcmVkYWN0ZWQgcGF0aHMuICovXG5leHBvcnQgdHlwZSBSb3dzID0geyBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoOyB1cGRhdGVzOiBNZW1vcnlQYXRjaDsgdHJhY2U6IFRyYWNlRW50cnlbXSB9O1xuXG4vKiogT25lIHN0YWdlZCBvcCwgYXMgYFRyYW5zYWN0aW9uQnVmZmVyYCByZWNvcmRzIGl0LiAqL1xuZXhwb3J0IHR5cGUgU3RhZ2VkT3AgPSB7IHBhdGg6IHN0cmluZzsgdmVyYjogc3RyaW5nOyByZWFkS2V5cz86IHN0cmluZ1tdIH07XG5cbi8qKiBBIHN0YWdlZCBwYXRoIGluIGEge0BsaW5rIEZhbWlseX0sIHdpdGggaXRzIGxhc3Qgb3AncyByZWFkIHByZWZpeC4gKi9cbmV4cG9ydCB0eXBlIE1lbWJlciA9IHsgcGF0aDogc3RyaW5nOyByZWFkS2V5cz86IHN0cmluZ1tdIH07XG5cbi8qKlxuICogQSBmYW1pbHkgb2YgVE9VQ0hFRCBwYXRoczogZXZlcnkgc3RhZ2VkIHBhdGggdW5kZXIgaXRzIHNoYWxsb3dlc3Qgc3RhZ2VkXG4gKiBhbmNlc3Rvci1vci1zZWxmIOKAlCB0aGUgdW5pdCB0aGUgY2hlY2sgdmVyaWZpZXMgYW5kLCB3aGVuIGl0IGRvZXMgbm90IGZvbGRcbiAqIGJhY2ssIHRoZSB1bml0IHJlLWVuY29kZWQuIFR3byBmYW1pbGllcyBuZXZlciBvdmVybGFwLlxuICovXG5leHBvcnQgdHlwZSBGYW1pbHkgPSB7XG4gIHJvb3Q6IHN0cmluZztcbiAgcm9vdFNlZ21lbnRzOiBzdHJpbmdbXTtcbiAgLyoqIEl0cyBzdGFnZWQgcGF0aHMsIGJ5IGxhc3QgdG91Y2guICovXG4gIG1lbWJlcnM6IE1lbWJlcltdO1xuICAvKiogSW5kZXggaW4gdGhlIG9wIHRyYWNlIG9mIHRoZSBmYW1pbHkncyBsYXN0IG9wOiB3aGVyZSBpdHMgcmUtZW5jb2RlZCByb3dzIGdvLiAqL1xuICBzbG90OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgcm9vdCdzIHJlYWQtYmFjayBhcyBhIHJlY29yZCBjYW4gaG9sZCBpdCDigJQgaXRzIGBzdHJ1Y3R1cmVkQ2xvbmVgLFxuICAgKiBib3hlZCDigJQgd2hlbiB0aGUgY2hlY2sgdG9vayBvbmUgKHtAbGluayBmb2xkc0JhY2t9KTsgdGhlIHJlLWVuY29kaW5nXG4gICAqIHJldXNlcyBpdC5cbiAgICovXG4gIGhlbGQ/OiB7IHZhbHVlOiB1bmtub3duIH07XG59O1xuXG4vKiogVGhlIGZhbWlsaWVzIHdob3NlIHJvd3MgZGlkIG5vdCBmb2xkIGJhY2ssIGFuZCB3aGljaCBmYW1pbHkgZXZlcnkgc3RhZ2VkIHBhdGggaXMgaW4uICovXG5leHBvcnQgdHlwZSBMb3NzeSA9IHsgcm9vdE9mOiBNYXA8c3RyaW5nLCBzdHJpbmc+OyBmYW1pbGllczogTWFwPHN0cmluZywgRmFtaWx5PiB9O1xuXG4vKipcbiAqIFRoZSBmYW1pbGllcyBvZiBgb3BzYCB3aG9zZSBjYW5kaWRhdGUgcm93cyBkbyBub3QgZm9sZCBiYWNrIHRvIHdoYXQgdGhlXG4gKiBzdGFnZSByZWFkIOKAlCBgdW5kZWZpbmVkYCB3aGVuIGV2ZXJ5IGZhbWlseSBkb2VzLiBFYWNoIGZhbWlseSBST09UIGlzXG4gKiBjb21wYXJlZCAoe0BsaW5rIGZvbGRzQmFja30pOiBpdHMgdmFsdWUgYW5kIHRoZSB3YXkgZG93biB0byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvc3N5RmFtaWxpZXMoXG4gIGNhbmRpZGF0ZTogUm93cyxcbiAgYmFzZTogdW5rbm93bixcbiAgd29ya2luZ0NvcHk6IHVua25vd24sXG4gIG9wczogcmVhZG9ubHkgU3RhZ2VkT3BbXSxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBMb3NzeSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZvbGQgPSBkcnlGb2xkKGJhc2UsIGNhbmRpZGF0ZS51cGRhdGVzLCBjYW5kaWRhdGUub3ZlcndyaXRlLCBjYW5kaWRhdGUudHJhY2UpO1xuICBjb25zdCB7IHJvb3RPZiwgZmFtaWxpZXMgfSA9IHRvdWNoZWRGYW1pbGllcyhvcHMpO1xuICBsZXQgbG9zc3k6IE1hcDxzdHJpbmcsIEZhbWlseT4gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZmFtaWx5IG9mIGZhbWlsaWVzLnZhbHVlcygpKSB7XG4gICAgaWYgKCFmb2xkc0JhY2soZm9sZCwgd29ya2luZ0NvcHksIGZhbWlseSwgYWRkcmVzcykpIChsb3NzeSA/Pz0gbmV3IE1hcCgpKS5zZXQoZmFtaWx5LnJvb3QsIGZhbWlseSk7XG4gIH1cbiAgcmV0dXJuIGxvc3N5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IHJvb3RPZiwgZmFtaWxpZXM6IGxvc3N5IH07XG59XG5cbi8qKlxuICogRG9lcyB0aGUgZm9sZCBnaXZlIGJhY2sgd2hhdCB0aGUgc3RhZ2UgcmVhZCBhdCBhIGZhbWlseSByb290PyBUaGUgd2F5IGRvd25cbiAqICh7QGxpbmsgc3BpbmVIZWxkfSksIHRoZW4gdGhlIHZhbHVlIGJ5IHtAbGluayBkZWVwRXF1YWx9IChhIHJvb3QgY292ZXJzIGV2ZXJ5XG4gKiBkZXNjZW5kYW50OyBhbiBvd24gYHVuZGVmaW5lZGAgaXMgYSBkZWxldGVkIGtleSkg4oCUIGFnYWluc3QgdGhlIHJlYWQtYmFjayBhc1xuICogYSByZWNvcmQgY2FuIGhvbGQgaXQuIEEgcmVjb3JkIGhvbGRzIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB3aGF0IGEgc3RhZ2VcbiAqIHdyb3RlIChzdGF0ZSB2YWx1ZXMgbXVzdCBzdXJ2aXZlIG9uZSksIGFuZCBhIGZldyB2YWx1ZXMgZG8gbm90IHN1cnZpdmUgb25lXG4gKiB3aG9sZTogYW4gYEVycm9yYCdzIG93biBmaWVsZHMgYXJlIGRyb3BwZWQuIFdoZW4gdGhlIGZvbGQgZXF1YWxzIHRoZVxuICogcmVhZC1iYWNrJ3MgY2xvbmUsIG5vIHJvdyBjb3VsZCBob2xkIG1vcmUsIGFuZCB0aGUgZmFtaWx5IGlzIGFkbWl0dGVkIGFzIGl0XG4gKiBpczsgdGhlIGNsb25lLCB0YWtlbiBvbmx5IGZvciBhIHJvb3QgdGhlIGNoZWFwIGNvbXBhcmUgcmVmdXNlZCwgaXMga2VwdCBmb3JcbiAqIHRoZSByZS1lbmNvZGluZy5cbiAqL1xuZnVuY3Rpb24gZm9sZHNCYWNrKGZvbGQ6IHVua25vd24sIHdvcmtpbmdDb3B5OiB1bmtub3duLCBmYW1pbHk6IEZhbWlseSwgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBmYW1pbHkucm9vdFNlZ21lbnRzO1xuICBpZiAoIXNwaW5lSGVsZChmb2xkLCB3b3JraW5nQ29weSwgc2VnbWVudHMsIGFkZHJlc3MpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGZvbGRlZCA9IF9nZXQoZm9sZCwgc2VnbWVudHMpO1xuICBjb25zdCByZWFkID0gX2dldCh3b3JraW5nQ29weSwgc2VnbWVudHMpO1xuICBpZiAoZGVlcEVxdWFsKGZvbGRlZCwgcmVhZCkpIHJldHVybiB0cnVlO1xuICBmYW1pbHkuaGVsZCA9IHsgdmFsdWU6IHN0cnVjdHVyZWRDbG9uZShyZWFkKSB9O1xuICByZXR1cm4gZGVlcEVxdWFsKGZvbGRlZCwgZmFtaWx5LmhlbGQudmFsdWUpO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHN0YWdlZCBwYXRoIGdyb3VwZWQgdW5kZXIgaXRzIFNIQUxMT1dFU1Qgc3RhZ2VkIGFuY2VzdG9yLW9yLXNlbGYg4oCUXG4gKiBvdmVyIFRPVUNIRUQgcGF0aHMsIG5vdCBzdXJ2aXZpbmcgb25lczogYW4gb3AgdGhlIG5ldC1jaGFuZ2UgZmlsdGVyIGRyb3BzXG4gKiBjYW4gc3RpbGwgaGF2ZSBjaGFuZ2VkIHdoYXQgdGhlIHN0YWdlIHJlYWRzIChMLTEpLiBNZW1iZXJzIGFyZSBsaXN0ZWQgYnlcbiAqIGxhc3QgdG91Y2g7IGEgZmFtaWx5J3Mgc2xvdCBpcyBpdHMgbGFzdCBvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoZWRGYW1pbGllcyhvcHM6IHJlYWRvbmx5IFN0YWdlZE9wW10pOiB7XG4gIHJvb3RPZjogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgZmFtaWxpZXM6IE1hcDxzdHJpbmcsIEZhbWlseT47XG59IHtcbiAgY29uc3QgdG91Y2hlcyA9IG5ldyBNYXA8c3RyaW5nLCB7IGxhc3Q6IG51bWJlcjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9PigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykge1xuICAgIHRvdWNoZXMuZGVsZXRlKG9wc1tpXS5wYXRoKTsgLy8gcmUtaW5zZXJ0OiB0aGUgTWFwJ3Mgb3JkZXIgaXMgbGFzdC10b3VjaCBvcmRlclxuICAgIHRvdWNoZXMuc2V0KG9wc1tpXS5wYXRoLCB7IGxhc3Q6IGksIHJlYWRLZXlzOiBvcHNbaV0ucmVhZEtleXMgfSk7XG4gIH1cbiAgY29uc3Qgcm9vdE9mID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgY29uc3QgZmFtaWxpZXMgPSBuZXcgTWFwPHN0cmluZywgRmFtaWx5PigpO1xuICBmb3IgKGNvbnN0IFtwYXRoLCB0b3VjaF0gb2YgdG91Y2hlcykge1xuICAgIGNvbnN0IHJvb3QgPSBzaGFsbG93ZXN0SW4ocGF0aCwgdG91Y2hlcyk7XG4gICAgcm9vdE9mLnNldChwYXRoLCByb290KTtcbiAgICBsZXQgZmFtaWx5ID0gZmFtaWxpZXMuZ2V0KHJvb3QpO1xuICAgIGlmIChmYW1pbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmFtaWx5ID0geyByb290LCByb290U2VnbWVudHM6IHJvb3Quc3BsaXQoREVMSU0pLCBtZW1iZXJzOiBbXSwgc2xvdDogdG91Y2gubGFzdCB9O1xuICAgICAgZmFtaWxpZXMuc2V0KHJvb3QsIGZhbWlseSk7XG4gICAgfVxuICAgIGZhbWlseS5tZW1iZXJzLnB1c2goeyBwYXRoLCByZWFkS2V5czogdG91Y2gucmVhZEtleXMgfSk7XG4gICAgaWYgKHRvdWNoLmxhc3QgPiBmYW1pbHkuc2xvdCkgZmFtaWx5LnNsb3QgPSB0b3VjaC5sYXN0O1xuICB9XG4gIHJldHVybiB7IHJvb3RPZiwgZmFtaWxpZXMgfTtcbn1cblxuLyoqXG4gKiBIb3cgbWFueSBsZWFkaW5nIHNlZ21lbnRzIG9mIGBwYXRoYCBhcmUgdGhlIHN0YWdlJ3MgYGFkZHJlc3NgIOKAlCBpdHMgbGVuZ3RoXG4gKiB3aGVuIGBwYXRoYCBsaWVzIHN0cmljdGx5IGJlbG93IGl0LCBlbHNlIDAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRyZXNzRGVwdGhPZihwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdLCBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IG51bWJlciB7XG4gIGNvbnN0IGRlcHRoID0gYWRkcmVzcy5sZW5ndGg7XG4gIGlmIChkZXB0aCA9PT0gMCB8fCBwYXRoLmxlbmd0aCA8PSBkZXB0aCkgcmV0dXJuIDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgaWYgKFN0cmluZyhwYXRoW2ldKSAhPT0gYWRkcmVzc1tpXSkgcmV0dXJuIDA7XG4gIHJldHVybiBkZXB0aDtcbn1cblxuLyoqXG4gKiBMLTE6IGEgbmVzdGVkIG9wIHRocm91Z2ggYW4gYWJzZW50IG9yIHByaW1pdGl2ZSBwYXJlbnQgbWFrZXMgdGhhdCBwYXJlbnQgYVxuICogY29udGFpbmVyIGluIHRoZSB3b3JraW5nIGNvcHkg4oCUIGFuZCB3aGVuIHRoZSBvcCBpdHNlbGYgY2hhbmdlcyBub3RoaW5nIChhXG4gKiBkZWxldGUgb2YgYSBrZXkgdGhhdCB3YXMgbmV2ZXIgdGhlcmUpIG5vIHJvdyBpcyBsZWZ0IHRvIG1ha2UgaXQgaW4gdGhlXG4gKiBmb2xkLCBzbyB0aGUgc3RhZ2UgcmVhZHMgYmFjayBhIGNvbnRhaW5lciB0aGUgcmVjb3JkIG5ldmVyIG1lbnRpb25zLiBUaGVcbiAqIHNhbWUgb3Agb24gYW4gQVJSQVkgcGFyZW50IHBhc3QgaXRzIGVuZCBncm93cyBpdCAoYGRlbGV0ZSBhLjBgIG9uIGBbXWBcbiAqIHJlYWRzIGJhY2sgYFt1bmRlZmluZWRdYCkuIEV2ZXJ5IGNvbnRhaW5lciB0aGUgd29ya2luZyBjb3B5IGhvbGRzIG9uIHRoZVxuICogd2F5IHRvIGBzZWdtZW50c2AsIGFuZCBldmVyeSBhcnJheSBzbG90IGVhY2ggc3RlcCBsYW5kcyBpbiwgbXVzdCBiZSBvbmUgdGhlXG4gKiBmb2xkIGhvbGRzIHRvbyDigJQgYmVsb3cgdGhlIHN0YWdlJ3MgYWRkcmVzcywgd2hvc2UgY29udGFpbmVycyBhcmUgd2hlcmUgaXRcbiAqIHdyaXRlcywgbm90IGEgdmFsdWUgaXQgcmVhZHMuXG4gKi9cbmZ1bmN0aW9uIHNwaW5lSGVsZChmb2xkOiB1bmtub3duLCB3b3JraW5nQ29weTogdW5rbm93biwgc2VnbWVudHM6IHN0cmluZ1tdLCBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBmcm9tID0gYWRkcmVzc0RlcHRoT2Yoc2VnbWVudHMsIGFkZHJlc3MpO1xuICBsZXQgZjogdW5rbm93biA9IGZvbGQ7XG4gIGxldCB3OiB1bmtub3duID0gd29ya2luZ0NvcHk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaSA+PSBmcm9tICYmICFzbG90SGVsZChmLCB3LCBzZWdtZW50c1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaSA9PT0gc2VnbWVudHMubGVuZ3RoIC0gMSkgcmV0dXJuIHRydWU7XG4gICAgZiA9IG93bkNoaWxkKGYsIHNlZ21lbnRzW2ldKTtcbiAgICB3ID0gb3duQ2hpbGQodywgc2VnbWVudHNbaV0pO1xuICAgIGlmICghaXNDb250YWluZXIodykpIHJldHVybiB0cnVlO1xuICAgIGlmIChpID49IGZyb20gJiYgKCFpc0NvbnRhaW5lcihmKSB8fCBBcnJheS5pc0FycmF5KGYpICE9PSBBcnJheS5pc0FycmF5KHcpKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIERvZXMgdGhlIGZvbGQgaG9sZCBldmVyeSBhcnJheSBzbG90IHRoZSB3b3JraW5nIGNvcHkncyBjb250YWluZXIgYHdgIGhvbGRzXG4gKiBhdCBga2V5YD8gT25seSBhbiBhcnJheSBjYW4gYmUgZ3Jvd24gYnkgYSB3cml0ZSB0aGF0IGNoYW5nZXMgbm90aGluZyBlbHNlXG4gKiAoYW4gaW5kZXggcGFzdCBpdHMgZW5kLCBzZXQgdG8gYHVuZGVmaW5lZGApOyBhbiBvYmplY3QncyBvd24gYHVuZGVmaW5lZGBcbiAqIGtleSBpcyBhIGRlbGV0ZWQga2V5IHRvIGV2ZXJ5IHJlYWRlciwgc28gb2JqZWN0cyBhbHdheXMgcGFzcy5cbiAqL1xuZnVuY3Rpb24gc2xvdEhlbGQoZjogdW5rbm93biwgdzogdW5rbm93biwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHcpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgaW5kZXggPSBOdW1iZXIoa2V5KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSB8fCBpbmRleCA8IDAgfHwgU3RyaW5nKGluZGV4KSAhPT0ga2V5IHx8IGluZGV4ID49IHcubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZikgJiYgaW5kZXggPCBmLmxlbmd0aDtcbn1cblxuLyoqIFRoZSBzaGFsbG93ZXN0IG9mIGBwYXRoYCBhbmQgaXRzIGFuY2VzdG9ycyB0aGF0IGB0b3VjaGVkYCBob2xkcyDigJQgaXRzIGZhbWlseSdzIHJvb3QuICovXG5mdW5jdGlvbiBzaGFsbG93ZXN0SW4ocGF0aDogc3RyaW5nLCB0b3VjaGVkOiBSZWFkb25seU1hcDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgaWYgKHBhdGguaW5kZXhPZihERUxJTSkgPT09IC0xKSByZXR1cm4gcGF0aDtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KERFTElNKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFuY2VzdG9yID0gc2VnbWVudHMuc2xpY2UoMCwgaSkuam9pbihERUxJTSk7XG4gICAgaWYgKHRvdWNoZWQuaGFzKGFuY2VzdG9yKSkgcmV0dXJuIGFuY2VzdG9yO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuIl19
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYWRtaXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFeEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBa0N2RDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsU0FBZSxFQUNmLElBQWEsRUFDYixXQUFvQixFQUNwQixHQUF3QixFQUN4QixPQUEwQjtJQUUxQixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEYsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEQsSUFBSSxLQUFzQyxDQUFDO0lBQzNDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUM7WUFBRSxDQUFDLEtBQUssS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckcsQ0FBQztJQUNELE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDdkUsQ0FB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LEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFBRSxPQUFPLFFBQVEsQ0FBQztJQUM3QyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhZG1pc3Npb24udHMg4oCUIHRoZSBhZG1pdHRlZCByZWNvcmQncyBjaGVjayAoOS4zMC4wKTogZG9lcyBhIGNvbW1pdCdzIGJ1bmRsZVxuICogZm9sZCBiYWNrIHRvIHdoYXQgaXRzIHN0YWdlIHJlYWQ/IChkb2NzL2Rlc2lnbi8yMDI2LTEwLWFkbWl0dGVkLXJlY29yZC5tZClcbiAqXG4gKiBUSEUgTEFXOiBhIGNvbW1pdCBpcyBhZG1pdHRlZCBvbmx5IGlmIGl0cyBidW5kbGUsIHJlcGxheWVkIG9udG8gdGhlIHN0YXRlXG4gKiB0aGUgc3RhZ2UgYmVnYW4gZnJvbSwgZ2l2ZXMgYmFjayB0aGUgc3RhZ2UncyByZWFkLXlvdXItd3JpdGVzIHZpZXcgYXQgZXZlcnlcbiAqIHBhdGggdGhlIHN0YWdlIHRvdWNoZWQg4oCUIGFuZCBhdCBldmVyeSBjb250YWluZXIgYW5kIGFycmF5IHNsb3QgaXRzIHdyaXRlc1xuICogbWFkZSBvbiB0aGUgd2F5IHRoZXJlLCBiZWxvdyB0aGUgc3RhZ2UncyBhZGRyZXNzLlxuICpcbiAqIFB1cmU6IGhhbmRlZCB0aGUgY2FuZGlkYXRlIHJvd3MsIHRoZSBzdGFnZSdzIGRpZmYgYmFzZSwgaXRzIHdvcmtpbmcgY29weSxcbiAqIGl0cyBvcCB0cmFjZSBhbmQgaXRzIGFkZHJlc3MsIHtAbGluayBsb3NzeUZhbWlsaWVzfSBhbnN3ZXJzIHdoaWNoIGZhbWlsaWVzXG4gKiBvZiB0b3VjaGVkIHBhdGhzIGRvIG5vdCBmb2xkIGJhY2suIGBUcmFuc2FjdGlvbkJ1ZmZlciDCtyBhZG1pdGAgYXNrcyBvbmNlIHBlclxuICogY29tbWl0IHRoYXQgc3RhZ2VkIGEgYG1lcmdlYCBvciBhIG5lc3RlZCBvcCwgYW5kIGxheXMgdGhlIHJvd3Mgb3V0IGFnYWluXG4gKiB3aXRoIHRob3NlIGZhbWlsaWVzIHdyaXR0ZW4gYXMgd2hhdCB0aGUgc3RhZ2UgcmVhZC4gVGhlIGZvbGQgaXMgdGhlIG9uZVxuICogdmVyYiBsYXcgKHtAbGluayBkcnlGb2xkfSwgbm8gY2xvbmUpOyB0aGUgY29tcGFyZSBpcyB7QGxpbmsgZGVlcEVxdWFsfS5cbiAqL1xuXG5pbXBvcnQgeyBpc0NvbnRhaW5lciwgbmF0aXZlR2V0IGFzIF9nZXQsIG93bkNoaWxkIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2gsIFRyYWNlRW50cnkgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGRlZXBFcXVhbCwgREVMSU0sIGRyeUZvbGQgfSBmcm9tICcuL3V0aWxzLmpzJztcblxuLyoqIFRoZSByb3dzIGEgcGF5bG9hZCBpcyBidWlsdCBmcm9tLCBiZWZvcmUgdGhlIGNvbW1pdCBuYW1lcyBpdHMgcmVkYWN0ZWQgcGF0aHMuICovXG5leHBvcnQgdHlwZSBSb3dzID0geyBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoOyB1cGRhdGVzOiBNZW1vcnlQYXRjaDsgdHJhY2U6IFRyYWNlRW50cnlbXSB9O1xuXG4vKiogT25lIHN0YWdlZCBvcCwgYXMgYFRyYW5zYWN0aW9uQnVmZmVyYCByZWNvcmRzIGl0LiAqL1xuZXhwb3J0IHR5cGUgU3RhZ2VkT3AgPSB7IHBhdGg6IHN0cmluZzsgdmVyYjogc3RyaW5nOyByZWFkS2V5cz86IHN0cmluZ1tdIH07XG5cbi8qKiBBIHN0YWdlZCBwYXRoIGluIGEge0BsaW5rIEZhbWlseX0sIHdpdGggaXRzIGxhc3Qgb3AncyByZWFkIHByZWZpeC4gKi9cbmV4cG9ydCB0eXBlIE1lbWJlciA9IHsgcGF0aDogc3RyaW5nOyByZWFkS2V5cz86IHN0cmluZ1tdIH07XG5cbi8qKlxuICogQSBmYW1pbHkgb2YgVE9VQ0hFRCBwYXRoczogZXZlcnkgc3RhZ2VkIHBhdGggdW5kZXIgaXRzIHNoYWxsb3dlc3Qgc3RhZ2VkXG4gKiBhbmNlc3Rvci1vci1zZWxmIOKAlCB0aGUgdW5pdCB0aGUgY2hlY2sgdmVyaWZpZXMgYW5kLCB3aGVuIGl0IGRvZXMgbm90IGZvbGRcbiAqIGJhY2ssIHRoZSB1bml0IHJlLWVuY29kZWQuIFR3byBmYW1pbGllcyBuZXZlciBvdmVybGFwLlxuICovXG5leHBvcnQgdHlwZSBGYW1pbHkgPSB7XG4gIHJvb3Q6IHN0cmluZztcbiAgcm9vdFNlZ21lbnRzOiBzdHJpbmdbXTtcbiAgLyoqIEl0cyBzdGFnZWQgcGF0aHMsIGJ5IGxhc3QgdG91Y2guICovXG4gIG1lbWJlcnM6IE1lbWJlcltdO1xuICAvKiogSW5kZXggaW4gdGhlIG9wIHRyYWNlIG9mIHRoZSBmYW1pbHkncyBsYXN0IG9wOiB3aGVyZSBpdHMgcmUtZW5jb2RlZCByb3dzIGdvLiAqL1xuICBzbG90OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgcm9vdCdzIHJlYWQtYmFjayBhcyBhIHJlY29yZCBjYW4gaG9sZCBpdCDigJQgaXRzIGBzdHJ1Y3R1cmVkQ2xvbmVgLFxuICAgKiBib3hlZCDigJQgd2hlbiB0aGUgY2hlY2sgdG9vayBvbmUgKHtAbGluayBmb2xkc0JhY2t9KTsgdGhlIHJlLWVuY29kaW5nXG4gICAqIHJldXNlcyBpdC5cbiAgICovXG4gIGhlbGQ/OiB7IHZhbHVlOiB1bmtub3duIH07XG59O1xuXG4vKiogVGhlIGZhbWlsaWVzIHdob3NlIHJvd3MgZGlkIG5vdCBmb2xkIGJhY2ssIGFuZCB3aGljaCBmYW1pbHkgZXZlcnkgc3RhZ2VkIHBhdGggaXMgaW4uICovXG5leHBvcnQgdHlwZSBMb3NzeSA9IHsgcm9vdE9mOiBNYXA8c3RyaW5nLCBzdHJpbmc+OyBmYW1pbGllczogTWFwPHN0cmluZywgRmFtaWx5PiB9O1xuXG4vKipcbiAqIFRoZSBmYW1pbGllcyBvZiBgb3BzYCB3aG9zZSBjYW5kaWRhdGUgcm93cyBkbyBub3QgZm9sZCBiYWNrIHRvIHdoYXQgdGhlXG4gKiBzdGFnZSByZWFkIOKAlCBgdW5kZWZpbmVkYCB3aGVuIGV2ZXJ5IGZhbWlseSBkb2VzLiBFYWNoIGZhbWlseSBST09UIGlzXG4gKiBjb21wYXJlZCAoe0BsaW5rIGZvbGRzQmFja30pOiBpdHMgdmFsdWUgYW5kIHRoZSB3YXkgZG93biB0byBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvc3N5RmFtaWxpZXMoXG4gIGNhbmRpZGF0ZTogUm93cyxcbiAgYmFzZTogdW5rbm93bixcbiAgd29ya2luZ0NvcHk6IHVua25vd24sXG4gIG9wczogcmVhZG9ubHkgU3RhZ2VkT3BbXSxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBMb3NzeSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGZvbGQgPSBkcnlGb2xkKGJhc2UsIGNhbmRpZGF0ZS51cGRhdGVzLCBjYW5kaWRhdGUub3ZlcndyaXRlLCBjYW5kaWRhdGUudHJhY2UpO1xuICBjb25zdCB7IHJvb3RPZiwgZmFtaWxpZXMgfSA9IHRvdWNoZWRGYW1pbGllcyhvcHMpO1xuICBsZXQgbG9zc3k6IE1hcDxzdHJpbmcsIEZhbWlseT4gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZmFtaWx5IG9mIGZhbWlsaWVzLnZhbHVlcygpKSB7XG4gICAgaWYgKCFmb2xkc0JhY2soZm9sZCwgd29ya2luZ0NvcHksIGZhbWlseSwgYWRkcmVzcykpIChsb3NzeSA/Pz0gbmV3IE1hcCgpKS5zZXQoZmFtaWx5LnJvb3QsIGZhbWlseSk7XG4gIH1cbiAgcmV0dXJuIGxvc3N5ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB7IHJvb3RPZiwgZmFtaWxpZXM6IGxvc3N5IH07XG59XG5cbi8qKlxuICogRG9lcyB0aGUgZm9sZCBnaXZlIGJhY2sgd2hhdCB0aGUgc3RhZ2UgcmVhZCBhdCBhIGZhbWlseSByb290PyBUaGUgd2F5IGRvd25cbiAqICh7QGxpbmsgc3BpbmVIZWxkfSksIHRoZW4gdGhlIHZhbHVlIGJ5IHtAbGluayBkZWVwRXF1YWx9IChhIHJvb3QgY292ZXJzIGV2ZXJ5XG4gKiBkZXNjZW5kYW50OyBhbiBvd24gYHVuZGVmaW5lZGAgaXMgYSBkZWxldGVkIGtleSkg4oCUIGFnYWluc3QgdGhlIHJlYWQtYmFjayBhc1xuICogYSByZWNvcmQgY2FuIGhvbGQgaXQuIEEgcmVjb3JkIGhvbGRzIGBzdHJ1Y3R1cmVkQ2xvbmVgcyBvZiB3aGF0IGEgc3RhZ2VcbiAqIHdyb3RlIChzdGF0ZSB2YWx1ZXMgbXVzdCBzdXJ2aXZlIG9uZSksIGFuZCBhIGZldyB2YWx1ZXMgZG8gbm90IHN1cnZpdmUgb25lXG4gKiB3aG9sZTogYW4gYEVycm9yYCdzIG93biBmaWVsZHMgYXJlIGRyb3BwZWQuIFdoZW4gdGhlIGZvbGQgZXF1YWxzIHRoZVxuICogcmVhZC1iYWNrJ3MgY2xvbmUsIG5vIHJvdyBjb3VsZCBob2xkIG1vcmUsIGFuZCB0aGUgZmFtaWx5IGlzIGFkbWl0dGVkIGFzIGl0XG4gKiBpczsgdGhlIGNsb25lLCB0YWtlbiBvbmx5IGZvciBhIHJvb3QgdGhlIGNoZWFwIGNvbXBhcmUgcmVmdXNlZCwgaXMga2VwdCBmb3JcbiAqIHRoZSByZS1lbmNvZGluZy5cbiAqL1xuZnVuY3Rpb24gZm9sZHNCYWNrKGZvbGQ6IHVua25vd24sIHdvcmtpbmdDb3B5OiB1bmtub3duLCBmYW1pbHk6IEZhbWlseSwgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBmYW1pbHkucm9vdFNlZ21lbnRzO1xuICBpZiAoIXNwaW5lSGVsZChmb2xkLCB3b3JraW5nQ29weSwgc2VnbWVudHMsIGFkZHJlc3MpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGZvbGRlZCA9IF9nZXQoZm9sZCwgc2VnbWVudHMpO1xuICBjb25zdCByZWFkID0gX2dldCh3b3JraW5nQ29weSwgc2VnbWVudHMpO1xuICBpZiAoZGVlcEVxdWFsKGZvbGRlZCwgcmVhZCkpIHJldHVybiB0cnVlO1xuICBmYW1pbHkuaGVsZCA9IHsgdmFsdWU6IHN0cnVjdHVyZWRDbG9uZShyZWFkKSB9O1xuICByZXR1cm4gZGVlcEVxdWFsKGZvbGRlZCwgZmFtaWx5LmhlbGQudmFsdWUpO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHN0YWdlZCBwYXRoIGdyb3VwZWQgdW5kZXIgaXRzIFNIQUxMT1dFU1Qgc3RhZ2VkIGFuY2VzdG9yLW9yLXNlbGYg4oCUXG4gKiBvdmVyIFRPVUNIRUQgcGF0aHMsIG5vdCBzdXJ2aXZpbmcgb25lczogYW4gb3AgdGhlIG5ldC1jaGFuZ2UgZmlsdGVyIGRyb3BzXG4gKiBjYW4gc3RpbGwgaGF2ZSBjaGFuZ2VkIHdoYXQgdGhlIHN0YWdlIHJlYWRzIChMLTEpLiBNZW1iZXJzIGFyZSBsaXN0ZWQgYnlcbiAqIGxhc3QgdG91Y2g7IGEgZmFtaWx5J3Mgc2xvdCBpcyBpdHMgbGFzdCBvcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoZWRGYW1pbGllcyhvcHM6IHJlYWRvbmx5IFN0YWdlZE9wW10pOiB7XG4gIHJvb3RPZjogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgZmFtaWxpZXM6IE1hcDxzdHJpbmcsIEZhbWlseT47XG59IHtcbiAgY29uc3QgdG91Y2hlcyA9IG5ldyBNYXA8c3RyaW5nLCB7IGxhc3Q6IG51bWJlcjsgcmVhZEtleXM/OiBzdHJpbmdbXSB9PigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykge1xuICAgIHRvdWNoZXMuZGVsZXRlKG9wc1tpXS5wYXRoKTsgLy8gcmUtaW5zZXJ0OiB0aGUgTWFwJ3Mgb3JkZXIgaXMgbGFzdC10b3VjaCBvcmRlclxuICAgIHRvdWNoZXMuc2V0KG9wc1tpXS5wYXRoLCB7IGxhc3Q6IGksIHJlYWRLZXlzOiBvcHNbaV0ucmVhZEtleXMgfSk7XG4gIH1cbiAgY29uc3Qgcm9vdE9mID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgY29uc3QgZmFtaWxpZXMgPSBuZXcgTWFwPHN0cmluZywgRmFtaWx5PigpO1xuICBmb3IgKGNvbnN0IFtwYXRoLCB0b3VjaF0gb2YgdG91Y2hlcykge1xuICAgIGNvbnN0IHJvb3QgPSBzaGFsbG93ZXN0SW4ocGF0aCwgdG91Y2hlcyk7XG4gICAgcm9vdE9mLnNldChwYXRoLCByb290KTtcbiAgICBsZXQgZmFtaWx5ID0gZmFtaWxpZXMuZ2V0KHJvb3QpO1xuICAgIGlmIChmYW1pbHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmFtaWx5ID0geyByb290LCByb290U2VnbWVudHM6IHJvb3Quc3BsaXQoREVMSU0pLCBtZW1iZXJzOiBbXSwgc2xvdDogdG91Y2gubGFzdCB9O1xuICAgICAgZmFtaWxpZXMuc2V0KHJvb3QsIGZhbWlseSk7XG4gICAgfVxuICAgIGZhbWlseS5tZW1iZXJzLnB1c2goeyBwYXRoLCByZWFkS2V5czogdG91Y2gucmVhZEtleXMgfSk7XG4gICAgaWYgKHRvdWNoLmxhc3QgPiBmYW1pbHkuc2xvdCkgZmFtaWx5LnNsb3QgPSB0b3VjaC5sYXN0O1xuICB9XG4gIHJldHVybiB7IHJvb3RPZiwgZmFtaWxpZXMgfTtcbn1cblxuLyoqXG4gKiBIb3cgbWFueSBsZWFkaW5nIHNlZ21lbnRzIG9mIGBwYXRoYCBhcmUgdGhlIHN0YWdlJ3MgYGFkZHJlc3NgIOKAlCBpdHMgbGVuZ3RoXG4gKiB3aGVuIGBwYXRoYCBsaWVzIHN0cmljdGx5IGJlbG93IGl0LCBlbHNlIDAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRyZXNzRGVwdGhPZihwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdLCBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IG51bWJlciB7XG4gIGNvbnN0IGRlcHRoID0gYWRkcmVzcy5sZW5ndGg7XG4gIGlmIChkZXB0aCA9PT0gMCB8fCBwYXRoLmxlbmd0aCA8PSBkZXB0aCkgcmV0dXJuIDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgaWYgKFN0cmluZyhwYXRoW2ldKSAhPT0gYWRkcmVzc1tpXSkgcmV0dXJuIDA7XG4gIHJldHVybiBkZXB0aDtcbn1cblxuLyoqXG4gKiBMLTE6IGEgbmVzdGVkIG9wIHRocm91Z2ggYW4gYWJzZW50IG9yIHByaW1pdGl2ZSBwYXJlbnQgbWFrZXMgdGhhdCBwYXJlbnQgYVxuICogY29udGFpbmVyIGluIHRoZSB3b3JraW5nIGNvcHkg4oCUIGFuZCB3aGVuIHRoZSBvcCBpdHNlbGYgY2hhbmdlcyBub3RoaW5nIChhXG4gKiBkZWxldGUgb2YgYSBrZXkgdGhhdCB3YXMgbmV2ZXIgdGhlcmUpIG5vIHJvdyBpcyBsZWZ0IHRvIG1ha2UgaXQgaW4gdGhlXG4gKiBmb2xkLCBzbyB0aGUgc3RhZ2UgcmVhZHMgYmFjayBhIGNvbnRhaW5lciB0aGUgcmVjb3JkIG5ldmVyIG1lbnRpb25zLiBUaGVcbiAqIHNhbWUgb3Agb24gYW4gQVJSQVkgcGFyZW50IHBhc3QgaXRzIGVuZCBncm93cyBpdCAoYGRlbGV0ZSBhLjBgIG9uIGBbXWBcbiAqIHJlYWRzIGJhY2sgYFt1bmRlZmluZWRdYCkuIEV2ZXJ5IGNvbnRhaW5lciB0aGUgd29ya2luZyBjb3B5IGhvbGRzIG9uIHRoZVxuICogd2F5IHRvIGBzZWdtZW50c2AsIGFuZCBldmVyeSBhcnJheSBzbG90IGVhY2ggc3RlcCBsYW5kcyBpbiwgbXVzdCBiZSBvbmUgdGhlXG4gKiBmb2xkIGhvbGRzIHRvbyDigJQgYmVsb3cgdGhlIHN0YWdlJ3MgYWRkcmVzcywgd2hvc2UgY29udGFpbmVycyBhcmUgd2hlcmUgaXRcbiAqIHdyaXRlcywgbm90IGEgdmFsdWUgaXQgcmVhZHMuXG4gKi9cbmZ1bmN0aW9uIHNwaW5lSGVsZChmb2xkOiB1bmtub3duLCB3b3JraW5nQ29weTogdW5rbm93biwgc2VnbWVudHM6IHN0cmluZ1tdLCBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBjb25zdCBmcm9tID0gYWRkcmVzc0RlcHRoT2Yoc2VnbWVudHMsIGFkZHJlc3MpO1xuICBsZXQgZjogdW5rbm93biA9IGZvbGQ7XG4gIGxldCB3OiB1bmtub3duID0gd29ya2luZ0NvcHk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaSA+PSBmcm9tICYmICFzbG90SGVsZChmLCB3LCBzZWdtZW50c1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaSA9PT0gc2VnbWVudHMubGVuZ3RoIC0gMSkgcmV0dXJuIHRydWU7XG4gICAgZiA9IG93bkNoaWxkKGYsIHNlZ21lbnRzW2ldKTtcbiAgICB3ID0gb3duQ2hpbGQodywgc2VnbWVudHNbaV0pO1xuICAgIGlmICghaXNDb250YWluZXIodykpIHJldHVybiB0cnVlO1xuICAgIGlmIChpID49IGZyb20gJiYgKCFpc0NvbnRhaW5lcihmKSB8fCBBcnJheS5pc0FycmF5KGYpICE9PSBBcnJheS5pc0FycmF5KHcpKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIERvZXMgdGhlIGZvbGQgaG9sZCBldmVyeSBhcnJheSBzbG90IHRoZSB3b3JraW5nIGNvcHkncyBjb250YWluZXIgYHdgIGhvbGRzXG4gKiBhdCBga2V5YD8gT25seSBhbiBhcnJheSBjYW4gYmUgZ3Jvd24gYnkgYSB3cml0ZSB0aGF0IGNoYW5nZXMgbm90aGluZyBlbHNlXG4gKiAoYW4gaW5kZXggcGFzdCBpdHMgZW5kLCBzZXQgdG8gYHVuZGVmaW5lZGApOyBhbiBvYmplY3QncyBvd24gYHVuZGVmaW5lZGBcbiAqIGtleSBpcyBhIGRlbGV0ZWQga2V5IHRvIGV2ZXJ5IHJlYWRlciwgc28gb2JqZWN0cyBhbHdheXMgcGFzcy5cbiAqL1xuZnVuY3Rpb24gc2xvdEhlbGQoZjogdW5rbm93biwgdzogdW5rbm93biwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHcpKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgaW5kZXggPSBOdW1iZXIoa2V5KTtcbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSB8fCBpbmRleCA8IDAgfHwgU3RyaW5nKGluZGV4KSAhPT0ga2V5IHx8IGluZGV4ID49IHcubGVuZ3RoKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZikgJiYgaW5kZXggPCBmLmxlbmd0aDtcbn1cblxuLyoqIFRoZSBzaGFsbG93ZXN0IG9mIGBwYXRoYCBhbmQgaXRzIGFuY2VzdG9ycyB0aGF0IGB0b3VjaGVkYCBob2xkcyDigJQgaXRzIGZhbWlseSdzIHJvb3QuICovXG5mdW5jdGlvbiBzaGFsbG93ZXN0SW4ocGF0aDogc3RyaW5nLCB0b3VjaGVkOiBSZWFkb25seU1hcDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgaWYgKHBhdGguaW5kZXhPZihERUxJTSkgPT09IC0xKSByZXR1cm4gcGF0aDtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KERFTElNKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGFuY2VzdG9yID0gc2VnbWVudHMuc2xpY2UoMCwgaSkuam9pbihERUxJTSk7XG4gICAgaWYgKHRvdWNoZWQuaGFzKGFuY2VzdG9yKSkgcmV0dXJuIGFuY2VzdG9yO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuIl19
@@ -90,6 +90,11 @@ export interface CausalNode {
90
90
  * produce no read→write edge to follow. `formatCausalChain` renders this
91
91
  * as a `⚠ … slice may be incomplete here` line. Absent when the stage's
92
92
  * reads were fully tracked.
93
+ *
94
+ * Registry code: `'incomplete-sources'` (`memory/honesty.ts ·
95
+ * HONESTY_CODES`, served on `footprintjs/trace`) says what this field
96
+ * means. The field carries no `code` — its values are the
97
+ * {@link UntrackedSource}s.
93
98
  */
94
99
  incompleteSources?: ReadonlyArray<UntrackedSource>;
95
100
  /**
@@ -100,6 +105,10 @@ export interface CausalNode {
100
105
  * slice is complete. Dev mode (`enableDevMode()`) also warns on
101
106
  * truncation, and `formatCausalChain` appends a `⚠ slice truncated …`
102
107
  * line — a consumer must never mistake a truncated slice for a full one.
108
+ *
109
+ * Registry code: `'truncated'` (`memory/honesty.ts · HONESTY_CODES`, served
110
+ * on `footprintjs/trace`) says what this field means; the field carries no
111
+ * `code`.
103
112
  */
104
113
  truncated?: {
105
114
  byDepth: boolean;
@@ -53,7 +53,7 @@
53
53
  * console.log(formatCausalChain(dag)); // human-readable
54
54
  * ```
55
55
  */
56
- import { isDevMode } from '../scope/detectCircular.js';
56
+ import { isDevMode } from '../devMode.js';
57
57
  import { findLastWriter } from './commitLogUtils.js';
58
58
  // ── Staged optimization: writer lookup strategies ──────────────────────
59
59
  /**
@@ -449,4 +449,4 @@ export function formatCausalChain(root) {
449
449
  // ── Exported for testing (internal) ────────────────────────────────────
450
450
  /** @internal Exposed for testing the strategy selection. */
451
451
  export const _REVERSE_INDEX_THRESHOLD = REVERSE_INDEX_THRESHOLD;
452
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYmFja3RyYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzREc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBcUtyRCwwRUFBMEU7QUFFMUU7Ozs7R0FJRztBQUNILE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBUXBDLGtFQUFrRTtBQUNsRSxTQUFTLGdCQUFnQixDQUFDLFNBQXlCO0lBQ2pELE9BQU8sQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLFNBQXlCO0lBQ25ELGtFQUFrRTtJQUNsRSxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztJQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzFDLEtBQUssTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25DLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDVCxHQUFHLEdBQUcsRUFBRSxDQUFDO2dCQUNULEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxH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QUFDLENBQ3BELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFZCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLGtCQUFrQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLGtCQUFrQixDQUFDO2FBQ3hHLE1BQU0sQ0FBQyxPQUFPLENBQUM7YUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLHNCQUFzQixNQUFNLDRDQUE0QyxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsMEVBQTBFO0FBRTFFLDREQUE0RDtBQUM1RCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYmFja3RyYWNrLnRzIOKAlCBCYWNrd2FyZCBjYXVzYWwgY2hhaW4gYW5hbHlzaXMgb24gdGhlIGNvbW1pdCBsb2cuXG4gKlxuICogSW1wbGVtZW50cyAqKmJhY2t3YXJkIHByb2dyYW0gc2xpY2luZyoqIChXZWlzZXIgMTk4NCwgdGhpbi1zbGljZSB2YXJpYW50KTpcbiAqIGdpdmVuIGEgc3RhcnRpbmcgZXhlY3V0aW9uIHN0ZXAsIHdhbGsgYmFja3dhcmRzIHRocm91Z2ggcmVhZOKGkndyaXRlXG4gKiBkZXBlbmRlbmNpZXMgdG8gYnVpbGQgdGhlIGNhdXNhbCBEQUcgdGhhdCBwcm9kdWNlZCB0aGUgZGF0YSBhdCB0aGF0IHN0ZXAuXG4gKlxuICogIyMgQWxnb3JpdGhtXG4gKlxuICogQkZTIG9uIHRoZSBpbXBsaWNpdCBkZXBlbmRlbmN5IGdyYXBoIHdoZXJlIGVkZ2VzIHJ1biBmcm9tIHJlYWRlciDihpIgd3JpdGVyLlxuICpcbiAqIDEuIExvY2F0ZSBzdGFydElkIGluIGNvbW1pdExvZyDihpIgcm9vdCBub2RlXG4gKiAyLiBHZXQga2V5c1JlYWQgZm9yIHJvb3QgdmlhIGBnZXRLZXlzUmVhZGAgY2FsbGJhY2tcbiAqIDMuIEZvciBlYWNoIGtleSByZWFkLCBmaW5kIHdobyBsYXN0IHdyb3RlIGl0IGJlZm9yZSB0aGlzIHN0ZXAg4oaSIHBhcmVudCBjb21taXRcbiAqIDQuIENyZWF0ZSBwYXJlbnQgQ2F1c2FsTm9kZSwgbGluayB0byByb290LnBhcmVudHNcbiAqIDUuIEVucXVldWUgcGFyZW50LiBSZXBlYXQgdW50aWwgcXVldWUgZW1wdHkgb3IgbGltaXRzIGhpdC5cbiAqXG4gKiBPdXRwdXQgaXMgYSAqKkRBRyoqIChub3QgYSBsaW5rZWQgbGlzdCk6IGEgc3RhZ2UgcmVhZGluZyBgY3JlZGl0U2NvcmVgIEFORCBgZHRpYFxuICogZnJvbSBkaWZmZXJlbnQgd3JpdGVycyBoYXMgdHdvIHBhcmVudHMuXG4gKlxuICogIyMgU3RhZ2VkIE9wdGltaXphdGlvblxuICpcbiAqIFR3byB3cml0ZXItbG9va3VwIHN0cmF0ZWdpZXMsIGNob3NlbiBhdXRvbWF0aWNhbGx5IGJ5IGNvbW1pdCBsb2cgc2l6ZTpcbiAqXG4gKiB8IFN0cmF0ZWd5IHwgV2hlbiB8IENvbXBsZXhpdHkgcGVyIGxvb2t1cCB8XG4gKiB8LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiAqIHwgTGluZWFyIHNjYW4gfCBOIOKJpCAyNTYgfCBPKE4pIOKAlCBzaW1wbGUgYmFja3dhcmQgc2NhbiB8XG4gKiB8IFJldmVyc2UgaW5kZXggfCBOID4gMjU2IHwgTyhLIGxvZyBOKSDigJQgcHJlYnVpbHQga2V54oaSW2luZGljZXNdLCBiaW5hcnkgc2VhcmNoIHxcbiAqXG4gKiBUaGUgdGhyZXNob2xkICgyNTYpIGlzIGNob3NlbiBzbyB0aGUgTyhOKSBidWlsZCBjb3N0IG9mIHRoZSByZXZlcnNlIGluZGV4XG4gKiBpcyBhbW9ydGl6ZWQgb3ZlciB0aGUgQkZTIHRyYXZlcnNhbC4gQmVsb3cgMjU2LCBsaW5lYXIgc2NhbiB3aW5zIGJlY2F1c2VcbiAqIHRoZXJlJ3Mgbm8gaW5kZXggYnVpbGQgb3ZlcmhlYWQuIFRoZSBjb25zdW1lciBuZXZlciBzZWVzIHRoaXMg4oCUIGBjYXVzYWxDaGFpbigpYFxuICogcGlja3MgdGhlIHJpZ2h0IHN0cmF0ZWd5IGludGVybmFsbHkgKGxpa2UgYSBxdWVyeSBvcHRpbWl6ZXIgY2hvb3NpbmcgYmV0d2VlblxuICogc2VxdWVudGlhbCBzY2FuIHZzIGluZGV4IHNjYW4gYmFzZWQgb24gdGFibGUgc2l6ZSkuXG4gKlxuICogIyMgQ29tcGxleGl0eVxuICpcbiAqIC0gKipTbWFsbCBsb2dzIChOIOKJpCAyNTYpOioqIE8oViDDlyBLIMOXIE4pIHRvdGFsLiBWPXZpc2l0ZWQsIEs9YXZnIGtleXMvbm9kZS5cbiAqIC0gKipMYXJnZSBsb2dzIChOID4gMjU2KToqKiBPKE4gw5cgVSkgaW5kZXggYnVpbGQgKyBPKFYgw5cgSyDDlyBsb2cgTikgbG9va3Vwcy5cbiAqICAgVSA9IHVuaXF1ZSBrZXlzLiBBbW9ydGl6ZWQgb3ZlciBhbGwgQkZTIGhvcHMuXG4gKlxuICogIyMgUmVmZXJlbmNlc1xuICpcbiAqIC0gV2Vpc2VyLCBNLiAoMTk4NCkuIFwiUHJvZ3JhbSBTbGljaW5nLlwiIElFRUUgVFNFLlxuICogLSBTcmlkaGFyYW4sIE0uIGV0IGFsLiAoMjAwNykuIFwiVGhpbiBTbGljaW5nLlwiIFBMREkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGNhdXNhbENoYWluLCBmbGF0dGVuQ2F1c2FsREFHLCBmb3JtYXRDYXVzYWxDaGFpbiB9IGZyb20gJ2Zvb3RwcmludGpzL3RyYWNlJztcbiAqXG4gKiBjb25zdCBkYWcgPSBjYXVzYWxDaGFpbihjb21taXRMb2csICdkZWNpZGUjMicsIChpZCkgPT4gcmVjb3JkZXIuZ2V0S2V5c1JlYWQoaWQpKTtcbiAqIGNvbnN0IGZsYXQgPSBmbGF0dGVuQ2F1c2FsREFHKGRhZyk7ICAgICAvLyBCRlMtb3JkZXJlZCBmbGF0IGxpc3RcbiAqIGNvbnNvbGUubG9nKGZvcm1hdENhdXNhbENoYWluKGRhZykpOyAgICAgLy8gaHVtYW4tcmVhZGFibGVcbiAqIGBgYFxuICovXG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcbmltcG9ydCB7IGZpbmRMYXN0V3JpdGVyIH0gZnJvbSAnLi9jb21taXRMb2dVdGlscy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgVW50cmFja2VkU291cmNlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIEEgc2luZ2xlIG5vZGUgaW4gdGhlIGNhdXNhbCBEQUcuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNhbE5vZGUge1xuICAvKiogVW5pcXVlIGV4ZWN1dGlvbiBzdGVwIGlkZW50aWZpZXIuICovXG4gIHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgc3RhZ2UgaWRlbnRpZmllci4gKi9cbiAgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgc3RhZ2UgbmFtZS4gKi9cbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBLZXlzIHRoaXMgc3RhZ2Ugd3JvdGUgKGZyb20gaXRzIENvbW1pdEJ1bmRsZS50cmFjZSkuICovXG4gIGtleXNXcml0dGVuOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBrZXkgd2hvc2UgcmVhZOKGkndyaXRlIGRlcGVuZGVuY3kgbGlua2VkIHRoaXMgbm9kZSB0byBpdHMgY2hpbGQuIEVtcHR5IGZvciB0aGUgcm9vdC4gKi9cbiAgbGlua2VkQnk6IHN0cmluZztcbiAgLyoqIEJGUyBkZXB0aCBmcm9tIHRoZSBzdGFydGluZyBub2RlICgwID0gc3RhcnQpLiAqL1xuICBkZXB0aDogbnVtYmVyO1xuICAvKipcbiAgICogUGFyZW50IG5vZGVzIOKAlCBzdGFnZXMgdGhpcyBub2RlIGRlcGVuZHMgb24uIERBRzogbXVsdGlwbGUgcGFyZW50c1xuICAgKiBwb3NzaWJsZS4gS0VQVCBmb3IgY29tcGF0aWJpbGl0eTsgd2l0aCB0aGUgYGNvbnRyb2xEZXBzYCBvcHRpb25cbiAgICogKFJGQy0wMDMgRDMpIGdvdmVybmluZyBkZWNpZGVycyBhcHBlYXIgaGVyZSB0b28uIEZvciB0eXBlZC9rZXllZC9cbiAgICogd2VpZ2h0ZWQgZGV0YWlsIHVzZSB7QGxpbmsgcGFyZW50RWRnZXN9LlxuICAgKi9cbiAgcGFyZW50czogQ2F1c2FsTm9kZVtdO1xuICAvKipcbiAgICogUkZDLTAwMyBEMyDigJQgb25lIGVkZ2UgcGVyIGRlcGVuZGVuY3kgTElOSyAobm90IHBlciBwYXJlbnQpOiBhIG5vZGVcbiAgICogcmVhZGluZyB0d28ga2V5cyBmcm9tIHRoZSBzYW1lIHdyaXRlciBoYXMgT05FIGVudHJ5IGluIHtAbGluayBwYXJlbnRzfVxuICAgKiBidXQgVFdPIGAnZGF0YSdgIGVkZ2VzIGhlcmUuIENvbnRyb2wgZGVwZW5kZW5jaWVzICh2aWEgdGhlXG4gICAqIGBjb250cm9sRGVwc2Agb3B0aW9uKSBhZGQgYSBgJ2NvbnRyb2wnYCBlZGdlIHRvIHRoZSBnb3Zlcm5pbmcgZGVjaWRlci5cbiAgICovXG4gIHBhcmVudEVkZ2VzOiBDYXVzYWxFZGdlW107XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyIGhvbmVzdHkgbWFya2VyIOKAlCBzdGFtcGVkIGZyb20gdGhlIHN0YWdlJ3NcbiAgICogYENvbW1pdEJ1bmRsZS51bnRyYWNrZWRTb3VyY2VzYC4gUHJlc2VudCB3aGVuIHRoaXMgc3RhZ2UgQUxTTyBjb25zdW1lZFxuICAgKiB1bnRyYWNrZWQgcmVhZCBwYXRocyAoYGFyZ3NgIC8gYGVudmAgLyB1bnNoYWRvd2VkIGBzaWxlbnRgIHJlYWRzKTogdGhlXG4gICAqIGJhY2t3YXJkIHNsaWNlIHRocm91Z2ggdGhpcyBub2RlIG1heSBiZSBpbmNvbXBsZXRlLCBiZWNhdXNlIHRob3NlIHJlYWRzXG4gICAqIHByb2R1Y2Ugbm8gcmVhZOKGkndyaXRlIGVkZ2UgdG8gZm9sbG93LiBgZm9ybWF0Q2F1c2FsQ2hhaW5gIHJlbmRlcnMgdGhpc1xuICAgKiBhcyBhIGDimqAg4oCmIHNsaWNlIG1heSBiZSBpbmNvbXBsZXRlIGhlcmVgIGxpbmUuIEFic2VudCB3aGVuIHRoZSBzdGFnZSdzXG4gICAqIHJlYWRzIHdlcmUgZnVsbHkgdHJhY2tlZC5cbiAgICovXG4gIGluY29tcGxldGVTb3VyY2VzPzogUmVhZG9ubHlBcnJheTxVbnRyYWNrZWRTb3VyY2U+O1xuICAvKipcbiAgICogUkZDLTAwMyBENCB0cnVuY2F0aW9uIHZpc2liaWxpdHkg4oCUIHNldCBvbiB0aGUgUk9PVCBub2RlIG9ubHksIGFuZCBvbmx5XG4gICAqIHdoZW4gYSBsaW1pdCBhY3R1YWxseSBjdXQgdGhlIHNsaWNlOiBgYnlEZXB0aGAgd2hlbiBhIG5vZGUgYXQgdGhlXG4gICAqIGBtYXhEZXB0aGAgaG9yaXpvbiBzdGlsbCBoYWQgZWRnZXMgdG8gZXhwYW5kLCBgYnlOb2Rlc2Agd2hlbiB0aGVcbiAgICogYG1heE5vZGVzYCBidWRnZXQgYmxvY2tlZCBjcmVhdGluZyBhIGRpc2NvdmVyZWQgcGFyZW50LiBBYnNlbnQgd2hlbiB0aGVcbiAgICogc2xpY2UgaXMgY29tcGxldGUuIERldiBtb2RlIChgZW5hYmxlRGV2TW9kZSgpYCkgYWxzbyB3YXJucyBvblxuICAgKiB0cnVuY2F0aW9uLCBhbmQgYGZvcm1hdENhdXNhbENoYWluYCBhcHBlbmRzIGEgYOKaoCBzbGljZSB0cnVuY2F0ZWQg4oCmYFxuICAgKiBsaW5lIOKAlCBhIGNvbnN1bWVyIG11c3QgbmV2ZXIgbWlzdGFrZSBhIHRydW5jYXRlZCBzbGljZSBmb3IgYSBmdWxsIG9uZS5cbiAgICovXG4gIHRydW5jYXRlZD86IHsgYnlEZXB0aDogYm9vbGVhbjsgYnlOb2RlczogYm9vbGVhbiB9O1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgdHlwZWQgZGVwZW5kZW5jeSBlZGdlIGZyb20gYSBjaGlsZCBub2RlIHRvIG9uZSBwYXJlbnQuXG4gKlxuICogLSBga2luZDogJ2RhdGEnYCAgICDigJQgcmVhZOKGkndyaXRlIGRlcGVuZGVuY3k7IGBrZXlgIGlzIHRoZSBzdGF0ZSBrZXkuXG4gKiAtIGBraW5kOiAnY29udHJvbCdgIOKAlCB0aGUgcGFyZW50IGlzIHRoZSBkZWNpZGVyL3NlbGVjdG9yIHdob3NlIGRlY2lzaW9uXG4gKiAgIGFsbG93ZWQgdGhlIGNoaWxkIHRvIHJ1bjsgYGtleWAgaXMgdGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgd2hlbiBwcmVzZW50LlxuICpcbiAqIGB3ZWlnaHRgIGRlZmF1bHRzIHRvIDEuMDsgdGhlIGB3ZWlnaGAgaG9vayAoUkZDLTAwMyBENCkgY2FuIG92ZXJyaWRlIGl0LlxuICogVGhlIGVuZ2luZSBpdHNlbGYgTkVWRVIgY29tcHV0ZXMgd2VpZ2h0cyDigJQgc2VtYW50aWNzIGJlbG9uZyB0byB0aGVcbiAqIGNvbnN1bWVyLWluamVjdGVkIHdlaWdoZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2FsRWRnZSB7XG4gIHBhcmVudDogQ2F1c2FsTm9kZTtcbiAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnO1xuICBrZXk/OiBzdHJpbmc7XG4gIHdlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgY29udHJvbCBkZXBlbmRlbmN5IHJlc29sdmVkIGZvciBvbmUgZXhlY3V0aW9uIHN0ZXA6XG4gKiB3aGljaCBkZWNpZGVyL3NlbGVjdG9yIGV4ZWN1dGlvbiBhbGxvd2VkIHRoaXMgc3RhZ2UgdG8gcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xEZXBlbmRlbmN5IHtcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBnb3Zlcm5pbmcgZGVjaWRlci9zZWxlY3RvciBleGVjdXRpb24gc3RlcC4gKi9cbiAgZGVjaWRlcklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCBmb3IgdGhlIGNob3NlbiBicmFuY2gsIHdoZW4gcHJlc2VudC4gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgY2FsbGJhY2sgcmVzb2x2aW5nIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciBmb3IgYW4gZXhlY3V0aW9uXG4gKiBzdGVwLiBSZXR1cm4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgc3RlcCBpcyBub3QgY29udHJvbC1kZXBlbmRlbnQgb24gYW55XG4gKiByZWNvcmRlZCBkZWNpc2lvbi4gQnVpbGQgb25lIHdpdGggYGNvbnRyb2xEZXBSZWNvcmRlcigpYCBmcm9tXG4gKiBgZm9vdHByaW50anMvdHJhY2VgLCBvciBzdXBwbHkgeW91ciBvd24uXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRyb2xEZXBMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUkZDLTAwMyBENCDigJQgY29uc3VtZXItaW5qZWN0ZWQgZWRnZSB3ZWlnaGVyLiBDYWxsZWQgb25jZSBwZXIgY3JlYXRlZFxuICogZWRnZTsgcmV0dXJuIGEgd2VpZ2h0LCBvciBgdW5kZWZpbmVkYCB0byBrZWVwIHRoZSBkZWZhdWx0IDEuMC4gVGhlXG4gKiBFTkdJTkUgbmV2ZXIgY29tcHV0ZXMgd2VpZ2h0cyAoemVybyBuZXcgZGVwZW5kZW5jaWVzIOKAlCBzZW1hbnRpY3MgbGlrZVxuICogZW1iZWRkaW5nIHNpbWlsYXJpdHkgb3IgRkRMIGluZmx1ZW5jZSBiZWxvbmcgdG8gZG93bnN0cmVhbSBsaWJyYXJpZXMsXG4gKiB0aGUgc2FtZSBwbHVnLWluIHBhdHRlcm4gYXMgYE5hcnJhdGl2ZUZvcm1hdHRlcmApLiBXZWlnaHRzIHJlbmRlciBpblxuICogYGZvcm1hdENhdXNhbENoYWluYCBhcyBg4oaQIHZpYSBzeXN0ZW1Qcm9tcHQgKDAuMTgpYC5cbiAqL1xuZXhwb3J0IHR5cGUgRWRnZVdlaWdoZXIgPSAoXG4gIGNoaWxkOiBDYXVzYWxOb2RlLFxuICBwYXJlbnQ6IENhdXNhbE5vZGUsXG4gIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCcsXG4pID0+IG51bWJlciB8IHVuZGVmaW5lZDtcblxuLyoqIE9wdGlvbnMgZm9yIGNhdXNhbENoYWluKCkuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNhbENoYWluT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIEJGUyBkZXB0aCAoZGVmYXVsdDogMjApLiBQcmV2ZW50cyBydW5hd2F5IHRyYXZlcnNhbC4gKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHRvdGFsIG5vZGVzIHRvIHZpc2l0IChkZWZhdWx0OiAxMDApLiBIYXJkIGNhcCBmb3Igc2FmZXR5LiAqL1xuICBtYXhOb2Rlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSBsb29rdXAuIFdoZW4gcHJvdmlkZWQsIGV4cGFuZGluZyBhIG5vZGVcbiAgICogQUxTTyBsaW5rcyBhIGAnY29udHJvbCdgIGVkZ2UgdG8gaXRzIGdvdmVybmluZyBkZWNpZGVyIChsYWJlbGVkIGJ5IHRoZVxuICAgKiBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudCk7IHRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAqIG5vcm1hbGx5IHRocm91Z2ggaXRzIG93biBkYXRhIHJlYWRzLCBzbyBjaGFpbnMgbGlrZVxuICAgKiBgc3RhdHVzIOKGkCBbY29udHJvbF0gQ2xhc3NpZnlSaXNrIOKGkCBbZGF0YTogY3JlZGl0U2NvcmVdIFB1bGxCdXJlYXVgXG4gICAqIHJlc29sdmUgZW5kLXRvLWVuZC4gV2l0aG91dCB0aGlzIG9wdGlvbiBiZWhhdmlvciBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBjb250cm9sRGVwcz86IENvbnRyb2xEZXBMb29rdXA7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQ0IOKAlCBlZGdlIHdlaWdoZXIuIFN0YW1wcyBgQ2F1c2FsRWRnZS53ZWlnaHRgIGF0IGVkZ2UgY3JlYXRpb247XG4gICAqIGB1bmRlZmluZWRgIChvciBubyB3ZWlnaGVyKSDihpIgMS4wLiBTZWUge0BsaW5rIEVkZ2VXZWlnaGVyfS5cbiAgICovXG4gIHdlaWdoPzogRWRnZVdlaWdoZXI7XG4gIC8qKlxuICAgKiAjUDEg4oCUIGhvdyBhIG5vZGUncyBleHBhbnNpb24gcmVhZC1zZXQgaXMgZGVyaXZlZDpcbiAgICpcbiAgICogLSBgJ3N0YWdlJ2AgKGRlZmF1bHQsIGhpc3RvcmljYWwpIOKAlCBldmVyeSB2aXNpdGVkIG5vZGUgZXhwYW5kcyB0aHJvdWdoXG4gICAqICAgQUxMIG9mIGl0cyBzdGFnZSdzIHJlYWRzIChgZ2V0S2V5c1JlYWRgKS4gQSBzdGFnZSByZWFkaW5nIGBhLGJgIGFuZFxuICAgKiAgIHdyaXRpbmcgYHgseWAgbGlua3MgYm90aCByZWFkcyBhcyBjYXVzZXMgb2YgYm90aCB3cml0ZXMg4oCUIGEgc291bmQgYnV0XG4gICAqICAgY29hcnNlIG92ZXItYXBwcm94aW1hdGlvbi5cbiAgICogLSBgJ3Blci13cml0ZSdgIOKAlCB3aGVuIHRoZSBjb21taXQgbG9nIGNhcnJpZXMgcGVyLXdyaXRlIHJlYWQgcHJvdmVuYW5jZVxuICAgKiAgIChgVHJhY2VFbnRyeS5yZWFkS2V5c2AsIHJlY29yZGVkIHVuZGVyIHRoZSBleGVjdXRvcidzXG4gICAqICAgYHdyaXRlUHJvdmVuYW5jZTogJ3JlYWRzLXByZWZpeCdgIGRpYWwpLCBhIG5vZGUgcmVhY2hlZCB2aWEga2V5IGBrYFxuICAgKiAgIGV4cGFuZHMgdGhyb3VnaCBPTkxZIHRoZSByZWFkcyB0aGF0IHByZWNlZGVkIGl0cyB3cml0ZSBvZiBga2BcbiAgICogICAodGVtcG9yYWwgcHJlZml4KS4gTm9kZXMgbGlua2VkIGxhdGVyIHZpYSBhZGRpdGlvbmFsIGtleXMgYXJlXG4gICAqICAgaW5jcmVtZW50YWxseSByZS1leHBhbmRlZCB3aXRoIGp1c3QgdGhlIG5ldyByZWFkcyAod29ya2xpc3Qg4oCUIHRoZVxuICAgKiAgIHNsaWNlIG9ubHkgZXZlciBHUk9XUyB0b3dhcmQgdGhlIHN0YWdlLWxldmVsIGNlaWxpbmcpLiBIT05FU1RcbiAgICogICBGQUxMQkFDSzogYW55IGxpbmsgd2hvc2UgdHJhY2UgZW50cnkgbGFja3MgYHJlYWRLZXlzYCBleHBhbmRzIHRoYXRcbiAgICogICBub2RlIGF0IHN0YWdlIGxldmVsIOKAlCBtaXhlZCBvciBkaWFsLW9mZiBsb2dzIGRlZ3JhZGUgdG8gYCdzdGFnZSdgXG4gICAqICAgYmVoYXZpb3IgZXhhY3RseSwgbmV2ZXIgdG8gc2lsZW5jZS5cbiAgICovXG4gIGVkZ2VBdHRyaWJ1dGlvbj86ICdzdGFnZScgfCAncGVyLXdyaXRlJztcbiAgLyoqXG4gICAqICNQMSDigJQgdGhlIHdyaXR0ZW4ga2V5cyB0aGF0IGFuY2hvciB0aGUgUk9PVCdzIGV4cGFuc2lvbiB1bmRlclxuICAgKiBgJ3Blci13cml0ZSdgIChlLmcuIGBzbGljZUZvcktleWAgcGFzc2VzIHRoZSBzbGljZWQga2V5LCBzbyB0aGUgcm9vdFxuICAgKiBleHBhbmRzIHRocm91Z2ggdGhlIHJlYWRzIHRoYXQgZmVkIFRIQVQgd3JpdGUsIG5vdCB0aGUgd2hvbGUgc3RhZ2UpLlxuICAgKiBJZ25vcmVkIHVuZGVyIGAnc3RhZ2UnYC4gVW5zZXQg4oaSIHJvb3QgZXhwYW5kcyBhdCBzdGFnZSBsZXZlbC5cbiAgICovXG4gIHJvb3RMaW5rS2V5cz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENhbGxiYWNrIHRoYXQgcmV0dXJucyB0aGUga2V5cyBhIHN0YWdlIHJlYWQgZHVyaW5nIGV4ZWN1dGlvbi5cbiAqIFRoZSBiYWNrdHJhY2tlciBjYWxscyB0aGlzIGZvciBlYWNoIHZpc2l0ZWQgbm9kZSB0byBkZXRlcm1pbmVcbiAqIHdoaWNoIHJlYWTihpJ3cml0ZSBlZGdlcyB0byBmb2xsb3cuXG4gKlxuICogSW1wbGVtZW50b3JzOiBRdWFsaXR5UmVjb3JkZXIgdHJhY2tzIGtleXNSZWFkIHBlciBzdGVwLFxuICogb3IgYnVpbGQgYSBNYXA8cnVudGltZVN0YWdlSWQsIHN0cmluZ1tdPiBmcm9tIFNjb3BlUmVjb3JkZXIub25SZWFkIGV2ZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgS2V5c1JlYWRMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gc3RyaW5nW107XG5cbi8vIOKUgOKUgCBTdGFnZWQgb3B0aW1pemF0aW9uOiB3cml0ZXIgbG9va3VwIHN0cmF0ZWdpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhyZXNob2xkIGZvciBzd2l0Y2hpbmcgZnJvbSBsaW5lYXIgc2NhbiB0byByZXZlcnNlIGluZGV4LlxuICogQmVsb3cgdGhpcywgTyhOKSBzY2FuIGlzIGZhc3RlciAobm8gaW5kZXggYnVpbGQgY29zdCkuXG4gKiBBYm92ZSB0aGlzLCBPKGxvZyBOKSBiaW5hcnkgc2VhcmNoIHdpbnMuXG4gKi9cbmNvbnN0IFJFVkVSU0VfSU5ERVhfVEhSRVNIT0xEID0gMjU2O1xuXG4vKipcbiAqIFdyaXRlciBsb29rdXAgZnVuY3Rpb24gc2lnbmF0dXJlLlxuICogUmV0dXJucyB0aGUgQ29tbWl0QnVuZGxlIHRoYXQgbGFzdCB3cm90ZSBga2V5YCBiZWZvcmUgcG9zaXRpb24gYGJlZm9yZUlkeGAuXG4gKi9cbnR5cGUgV3JpdGVyTG9va3VwID0gKGtleTogc3RyaW5nLCBiZWZvcmVJZHg6IG51bWJlcikgPT4gQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkO1xuXG4vKiogU3RyYXRlZ3kgMTogTGluZWFyIHNjYW4g4oCUIE8oTikgcGVyIGxvb2t1cCwgemVybyBzZXR1cCBjb3N0LiAqL1xuZnVuY3Rpb24gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgcmV0dXJuIChrZXksIGJlZm9yZUlkeCkgPT4gZmluZExhc3RXcml0ZXIoY29tbWl0TG9nLCBrZXksIGJlZm9yZUlkeCk7XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgMjogUmV2ZXJzZSBpbmRleCDigJQgTyhOw5dVKSBidWlsZCwgTyhsb2cgTikgcGVyIGxvb2t1cC5cbiAqIEJ1aWxkcyBhIE1hcDxrZXksIHNvcnRlZEluZGljZXNbXT4gd2hlcmUgaW5kaWNlcyBhcmUgY29tbWl0IHBvc2l0aW9uc1xuICogdGhhdCB3cm90ZSB0aGF0IGtleS4gTG9va3VwIHVzZXMgYmluYXJ5IHNlYXJjaCB0byBmaW5kIHRoZSBsYXN0IHdyaXRlclxuICogYmVmb3JlIGEgZ2l2ZW4gcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2VJbmRleExvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgLy8gQnVpbGQ6IGtleSDihpIgc29ydGVkIGFycmF5IG9mIGNvbW1pdCBpbmRpY2VzIHRoYXQgd3JvdGUgdGhpcyBrZXlcbiAgY29uc3QgaW5kZXggPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWl0TG9nLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChjb25zdCB0IG9mIGNvbW1pdExvZ1tpXS50cmFjZSkge1xuICAgICAgbGV0IGFyciA9IGluZGV4LmdldCh0LnBhdGgpO1xuICAgICAgaWYgKCFhcnIpIHtcbiAgICAgICAgYXJyID0gW107XG4gICAgICAgIGluZGV4LnNldCh0LnBhdGgsIGFycik7XG4gICAgICB9XG4gICAgICBhcnIucHVzaChpKTsgLy8gYWxyZWFkeSBzb3J0ZWQgKHdlIGl0ZXJhdGUgaW4gb3JkZXIpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChrZXk6IHN0cmluZywgYmVmb3JlSWR4OiBudW1iZXIpOiBDb21taXRCdW5kbGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGluZGljZXMgPSBpbmRleC5nZXQoa2V5KTtcbiAgICBpZiAoIWluZGljZXMgfHwgaW5kaWNlcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyBCaW5hcnkgc2VhcmNoOiBmaW5kIGxhcmdlc3QgaW5kZXggPCBiZWZvcmVJZHhcbiAgICBsZXQgbG8gPSAwO1xuICAgIGxldCBoaSA9IGluZGljZXMubGVuZ3RoIC0gMTtcbiAgICBsZXQgcmVzdWx0ID0gLTE7XG5cbiAgICB3aGlsZSAobG8gPD0gaGkpIHtcbiAgICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgIGlmIChpbmRpY2VzW21pZF0gPCBiZWZvcmVJZHgpIHtcbiAgICAgICAgcmVzdWx0ID0gaW5kaWNlc1ttaWRdO1xuICAgICAgICBsbyA9IG1pZCArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoaSA9IG1pZCAtIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdCA+PSAwID8gY29tbWl0TG9nW3Jlc3VsdF0gOiB1bmRlZmluZWQ7XG4gIH07XG59XG5cbi8qKlxuICogU3RhZ2VkIG9wdGltaXphdGlvbjogcGljayB0aGUgcmlnaHQgd3JpdGVyLWxvb2t1cCBzdHJhdGVneSBiYXNlZCBvbiBkYXRhIHNpemUuXG4gKlxuICogTGlrZSBhIGRhdGFiYXNlIHF1ZXJ5IG9wdGltaXplciBjaG9vc2luZyBiZXR3ZWVuIHNlcXVlbnRpYWwgc2NhbiBhbmQgaW5kZXggc2NhbjpcbiAqXG4gKiAtICoqU21hbGwgbG9nICjiiaQgMjU2KToqKiBMaW5lYXIgc2NhbiB3aW5zLiBaZXJvIHNldHVwIGNvc3QsIGdvb2QgY2FjaGUgbG9jYWxpdHkuXG4gKiAgIFRoZSBvdmVyaGVhZCBvZiBidWlsZGluZyBhIHJldmVyc2UgaW5kZXggaXNuJ3Qgd29ydGggaXQgZm9yIHNob3J0IGxvZ3MuXG4gKlxuICogLSAqKkxhcmdlIGxvZyAoPiAyNTYpOioqIFJldmVyc2UgaW5kZXggd2lucy4gTyhOw5dVKSB1cGZyb250IGJ1aWxkIGNvc3QgaXMgYW1vcnRpemVkXG4gKiAgIGFjcm9zcyBhbGwgQkZTIGhvcHMuIEVhY2ggbG9va3VwIGJlY29tZXMgTyhsb2cgTikgdmlhIGJpbmFyeSBzZWFyY2ggaW5zdGVhZCBvZiBPKE4pLlxuICogICBGb3IgYW4gYWdlbnQgbG9vcCB3aXRoIDUwMCBpdGVyYXRpb25zIGFuZCA1IGtleXMgcGVyIGhvcCwgdGhpcyBpcyA1MDDDlzXDl2xvZyg1MDAp4omIMjJLIG9wc1xuICogICB2cyA1MDDDlzXDlzUwMD0xLjI1TSBvcHMgd2l0aCBsaW5lYXIgc2Nhbi5cbiAqXG4gKiBUaGUgY2FsbGVyIG5ldmVyIHNlZXMgdGhpcyDigJQgYGNhdXNhbENoYWluKClgIHBpY2tzIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdyaXRlckxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPD0gUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQpIHtcbiAgICByZXR1cm4gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2cpO1xuICB9XG4gIHJldHVybiByZXZlcnNlSW5kZXhMb29rdXAoY29tbWl0TG9nKTtcbn1cblxuLy8g4pSA4pSAIENvcmUgYWxnb3JpdGhtIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJGQy0wMDMgRDI6IHRoZSBgaW5jb21wbGV0ZVNvdXJjZXNgIG5vZGUgZnJhZ21lbnQgZm9yIGEgY29tbWl0IOKAlCBge31gXG4gKiB3aGVuIHRoZSBzdGFnZSBjb25zdW1lZCBubyB1bnRyYWNrZWQgcmVhZCBwYXRocywga2VlcGluZyB0aGUgZmllbGRcbiAqIEFCU0VOVCAobm90IGVtcHR5LWFycmF5LXZhbHVlZCkgZm9yIGZ1bGx5LXRyYWNrZWQgc3RhZ2VzLlxuICovXG5mdW5jdGlvbiBpbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KGNvbW1pdDogQ29tbWl0QnVuZGxlKTogeyBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPiB9IHtcbiAgaWYgKCFjb21taXQudW50cmFja2VkU291cmNlcyB8fCBjb21taXQudW50cmFja2VkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybiB7fTtcbiAgcmV0dXJuIHsgaW5jb21wbGV0ZVNvdXJjZXM6IGNvbW1pdC51bnRyYWNrZWRTb3VyY2VzIH07XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGNhdXNhbCBEQUcgcm9vdGVkIGF0IGBzdGFydElkYCBieSB3YWxraW5nIGJhY2t3YXJkc1xuICogdGhyb3VnaCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgb3B0aW1hbCB3cml0ZXIgbG9va3VwIHN0cmF0ZWd5OlxuICogLSBMaW5lYXIgc2NhbiBmb3Igc21hbGwgbG9ncyAo4omkIDI1NiBjb21taXRzKVxuICogLSBSZXZlcnNlIGluZGV4IHdpdGggYmluYXJ5IHNlYXJjaCBmb3IgbGFyZ2UgbG9ncyAoPiAyNTYgY29tbWl0cylcbiAqXG4gKiBQcm9kdWNlcyBhIERBRyAobm90IGEgdHJlZSk6IGlmIHR3byBjaGlsZHJlbiBib3RoIHJlYWQgZnJvbSB0aGUgc2FtZVxuICogcGFyZW50LCB0aGUgcGFyZW50IG5vZGUgaXMgc2hhcmVkIChkZWR1cGVkIGJ5IHJ1bnRpbWVTdGFnZUlkKS5cbiAqXG4gKiBAcGFyYW0gY29tbWl0TG9nICAgT3JkZXJlZCBjb21taXQgYnVuZGxlcyBmcm9tIGV4ZWN1dG9yLmdldFNuYXBzaG90KCkuY29tbWl0TG9nXG4gKiBAcGFyYW0gc3RhcnRJZCAgICAgcnVudGltZVN0YWdlSWQgdG8gc3RhcnQgYmFja3RyYWNraW5nIGZyb21cbiAqIEBwYXJhbSBnZXRLZXlzUmVhZCBDYWxsYmFjayByZXR1cm5pbmcga2V5cyByZWFkIGJ5IGEgZ2l2ZW4gZXhlY3V0aW9uIHN0ZXBcbiAqIEBwYXJhbSBvcHRpb25zICAgICBEZXB0aCBhbmQgbm9kZSBsaW1pdHNcbiAqIEByZXR1cm5zIFJvb3QgQ2F1c2FsTm9kZSB3aXRoIC5wYXJlbnRzIGZvcm1pbmcgdGhlIERBRywgb3IgdW5kZWZpbmVkIGlmIHN0YXJ0SWQgbm90IGZvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXVzYWxDaGFpbihcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAgc3RhcnRJZDogc3RyaW5nLFxuICBnZXRLZXlzUmVhZDogS2V5c1JlYWRMb29rdXAsXG4gIG9wdGlvbnM/OiBDYXVzYWxDaGFpbk9wdGlvbnMsXG4pOiBDYXVzYWxOb2RlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF4RGVwdGggPSBvcHRpb25zPy5tYXhEZXB0aCA/PyAyMDtcbiAgY29uc3QgbWF4Tm9kZXMgPSBvcHRpb25zPy5tYXhOb2RlcyA/PyAxMDA7XG4gIGNvbnN0IGNvbnRyb2xEZXBzID0gb3B0aW9ucz8uY29udHJvbERlcHM7XG4gIGNvbnN0IHdlaWdoID0gb3B0aW9ucz8ud2VpZ2g7XG4gIGNvbnN0IHBlcldyaXRlID0gb3B0aW9ucz8uZWRnZUF0dHJpYnV0aW9uID09PSAncGVyLXdyaXRlJztcblxuICAvLyBSRkMtMDAzIEQ0IOKAlCB0cnVuY2F0aW9uIHZpc2liaWxpdHkuIFNldCBvbmx5IHdoZW4gYSBsaW1pdCBhY3R1YWxseVxuICAvLyBjdXRzIHRoZSBzbGljZTsgc3VyZmFjZWQgb24gdGhlIHJvb3QgYXMgYHRydW5jYXRlZGAgc28gYSBjb25zdW1lciBjYW5cbiAgLy8gbmV2ZXIgbWlzdGFrZSBhIHRydW5jYXRlZCBzbGljZSBmb3IgYSBjb21wbGV0ZSBvbmUuXG4gIGxldCB0cnVuY2F0ZWRCeURlcHRoID0gZmFsc2U7XG4gIGxldCB0cnVuY2F0ZWRCeU5vZGVzID0gZmFsc2U7XG5cbiAgLy8gQnVpbGQgcG9zaXRpb24gaW5kZXg6IHJ1bnRpbWVTdGFnZUlkIOKGkiBhcnJheSBwb3NpdGlvbiAoTyhuKSBvbmNlKVxuICBjb25zdCBpZHhNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1pdExvZy5sZW5ndGg7IGkrKykge1xuICAgIGlkeE1hcC5zZXQoY29tbWl0TG9nW2ldLnJ1bnRpbWVTdGFnZUlkLCBpKTtcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0SWR4ID0gaWR4TWFwLmdldChzdGFydElkKTtcbiAgaWYgKHN0YXJ0SWR4ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3RhcnRDb21taXQgPSBjb21taXRMb2dbc3RhcnRJZHhdO1xuXG4gIC8vIFBpY2sgd3JpdGVyIGxvb2t1cCBzdHJhdGVneSBiYXNlZCBvbiBsb2cgc2l6ZVxuICBjb25zdCBmaW5kV3JpdGVyID0gY3JlYXRlV3JpdGVyTG9va3VwKGNvbW1pdExvZyk7XG5cbiAgLy8gTm9kZSBkZWR1cCBtYXA6IHJ1bnRpbWVTdGFnZUlkIOKGkiBDYXVzYWxOb2RlIChlbnN1cmVzIERBRywgbm90IHRyZWUpXG4gIGNvbnN0IG5vZGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2F1c2FsTm9kZT4oKTtcblxuICBjb25zdCByb290OiBDYXVzYWxOb2RlID0ge1xuICAgIHJ1bnRpbWVTdGFnZUlkOiBzdGFydElkLFxuICAgIHN0YWdlSWQ6IHN0YXJ0Q29tbWl0LnN0YWdlSWQsXG4gICAgc3RhZ2VOYW1lOiBzdGFydENvbW1pdC5zdGFnZSxcbiAgICBrZXlzV3JpdHRlbjogc3RhcnRDb21taXQudHJhY2UubWFwKCh0KSA9PiB0LnBhdGgpLFxuICAgIGxpbmtlZEJ5OiAnJyxcbiAgICBkZXB0aDogMCxcbiAgICBwYXJlbnRzOiBbXSxcbiAgICBwYXJlbnRFZGdlczogW10sXG4gICAgLi4uaW5jb21wbGV0ZVNvdXJjZXNGcmFnbWVudChzdGFydENvbW1pdCksXG4gIH07XG4gIG5vZGVNYXAuc2V0KHN0YXJ0SWQsIHJvb3QpO1xuXG4gIC8vIOKUgOKUgCAjUDEgcGVyLXdyaXRlIGF0dHJpYnV0aW9uIG1hY2hpbmVyeSAoaW5lcnQgdW5kZXIgJ3N0YWdlJykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIGV4cGFuZGVkUmVhZHM6IHBlciBub2RlLCB0aGUgcmVhZHMgYWxyZWFkeSBxdWV1ZWQgZm9yIGV4cGFuc2lvbiDigJQgbGF0ZVxuICAvLyBsaW5rcyB2aWEgYWRkaXRpb25hbCBrZXlzIHJlLWVucXVldWUgb25seSB0aGUgREVMVEEsIHNvIHRoZSBzbGljZSBncm93c1xuICAvLyBtb25vdG9uaWNhbGx5IHRvd2FyZCB0aGUgc3RhZ2UtbGV2ZWwgY2VpbGluZyBhbmQgdGVybWluYXRlcyAoZWFjaCBrZXlcbiAgLy8gZXhwYW5kcyBhdCBtb3N0IG9uY2UgcGVyIG5vZGUpLiBmdWxseUV4cGFuZGVkOiBub2RlcyB0aGF0IGZlbGwgYmFjayB0b1xuICAvLyBzdGFnZSBsZXZlbCAobm8gcmVhZEtleXMgb24gYSBsaW5raW5nIGVudHJ5KSDigJQgbm90aGluZyBsZWZ0IHRvIGFkZC5cbiAgY29uc3QgZXhwYW5kZWRSZWFkcyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgY29uc3QgZnVsbHlFeHBhbmRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgbm9kZSdzIGV4cGFuc2lvbiByZWFkLXNldCBmb3IgdGhlIGdpdmVuIGxpbmtpbmcgV1JJVFRFTiBrZXlzLlxuICAgKiBQZXItd3JpdGUgbW9kZSB3aXRoIHByb3ZlbmFuY2UgcHJlc2VudCDihpIgdW5pb24gb2YgdGhlIGxpbmtpbmcgd3JpdGVzJ1xuICAgKiB0ZW1wb3JhbC1wcmVmaXggYHJlYWRLZXlzYC4gQW55IGxpbmtpbmcgZW50cnkgV0lUSE9VVCBgcmVhZEtleXNgIChvciBub1xuICAgKiBsaW5rS2V5cyBhdCBhbGwpIOKGkiBob25lc3Qgc3RhZ2UtbGV2ZWwgZmFsbGJhY2ssIGZsYWdnZWQgdmlhIHRoZSBzZWNvbmRcbiAgICogdHVwbGUgbWVtYmVyIHNvIHRoZSBjYWxsZXIgbWFya3MgdGhlIG5vZGUgZnVsbHkgZXhwYW5kZWQuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkc0ZvckxpbmtzKGNvbW1pdDogQ29tbWl0QnVuZGxlLCBsaW5rS2V5czogc3RyaW5nW10gfCB1bmRlZmluZWQpOiBbc3RyaW5nW10sIGJvb2xlYW5dIHtcbiAgICBpZiAoIXBlcldyaXRlIHx8ICFsaW5rS2V5cyB8fCBsaW5rS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbZ2V0S2V5c1JlYWQoY29tbWl0LnJ1bnRpbWVTdGFnZUlkKSwgdHJ1ZV07XG4gICAgfVxuICAgIGNvbnN0IHVuaW9uID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBsaW5rS2V5IG9mIGxpbmtLZXlzKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGNvbW1pdC50cmFjZS5maW5kKCh0KSA9PiB0LnBhdGggPT09IGxpbmtLZXkpO1xuICAgICAgaWYgKCFlbnRyeSB8fCBlbnRyeS5yZWFkS2V5cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIE1peGVkL2RpYWwtb2ZmIGxvZyDigJQgZGVncmFkZSBUSElTIG5vZGUgdG8gc3RhZ2UgbGV2ZWwsIGhvbmVzdGx5LlxuICAgICAgICByZXR1cm4gW2dldEtleXNSZWFkKGNvbW1pdC5ydW50aW1lU3RhZ2VJZCksIHRydWVdO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCByayBvZiBlbnRyeS5yZWFkS2V5cykgdW5pb24uYWRkKHJrKTtcbiAgICB9XG4gICAgcmV0dXJuIFtbLi4udW5pb25dLCBmYWxzZV07XG4gIH1cblxuICAvLyBCRlMvd29ya2xpc3QgcXVldWU6IFtub2RlLCBjb21taXRJZHgsIGRlcHRoLCBrZXlzVG9FeHBhbmRdXG4gIGNvbnN0IFtyb290UmVhZHMsIHJvb3RJc0Z1bGxdID0gcGVyV3JpdGVcbiAgICA/IHJlYWRzRm9yTGlua3Moc3RhcnRDb21taXQsIG9wdGlvbnM/LnJvb3RMaW5rS2V5cylcbiAgICA6IFtnZXRLZXlzUmVhZChzdGFydElkKSwgdHJ1ZV07XG4gIGV4cGFuZGVkUmVhZHMuc2V0KHN0YXJ0SWQsIG5ldyBTZXQocm9vdFJlYWRzKSk7XG4gIGlmIChyb290SXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChzdGFydElkKTtcbiAgY29uc3QgcXVldWU6IEFycmF5PFtDYXVzYWxOb2RlLCBudW1iZXIsIG51bWJlciwgc3RyaW5nW11dPiA9IFtbcm9vdCwgc3RhcnRJZHgsIDAsIHJvb3RSZWFkc11dO1xuICBsZXQgdmlzaXRlZCA9IDE7XG5cbiAgLyoqXG4gICAqIExpbmsgYG5vZGUg4oaSIHBhcmVudGAgKGNyZWF0aW5nICsgZW5xdWV1ZWluZyB0aGUgcGFyZW50IHdoZW4gbmV3KS5cbiAgICogU2hhcmVkIGJ5IGRhdGEtZWRnZSBleHBhbnNpb24gKHJlYWTihpJ3cml0ZSkgYW5kIGNvbnRyb2wtZWRnZSBleHBhbnNpb25cbiAgICogKEQzKS4gT25lIENhdXNhbEVkZ2UgcGVyIGRpc3RpbmN0IChwYXJlbnQsIGtpbmQsIGtleSkgbGluazsgYHBhcmVudHNgXG4gICAqIGtlZXBzIGl0cyBoaXN0b3JpY2FsIG9uZS1lbnRyeS1wZXItcGFyZW50IGRlZHVwLlxuICAgKi9cbiAgZnVuY3Rpb24gbGlua1BhcmVudChcbiAgICBub2RlOiBDYXVzYWxOb2RlLFxuICAgIHBhcmVudENvbW1pdDogQ29tbWl0QnVuZGxlLFxuICAgIGtpbmQ6ICdkYXRhJyB8ICdjb250cm9sJyxcbiAgICBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBkZXB0aDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRJZCA9IHBhcmVudENvbW1pdC5ydW50aW1lU3RhZ2VJZDtcbiAgICAvLyAjUDE6IHRoZSBwYXJlbnQncyBleHBhbnNpb24gcmVhZHMsIHJlc29sdmVkIExBWklMWSAob25seSBmb3IgbmV3IG5vZGVzXG4gICAgLy8gb3IgcGVyLXdyaXRlIHJlLWV4cGFuc2lvbiDigJQgZHVwbGljYXRlIGxpbmtzIHVuZGVyICdzdGFnZScgcGF5IG5vdGhpbmcpLlxuICAgIC8vIERhdGEgbGlua3MgZXhwYW5kIHRocm91Z2ggdGhlIHJlYWRzIHRoYXQgZmVkIHRoZSBwYXJlbnQncyB3cml0ZSBvZlxuICAgIC8vIGBrZXlgOyBjb250cm9sIGxpbmtzIGV4cGFuZCB0aGUgZGVjaWRlciBhdCBzdGFnZSBsZXZlbCAoYSBkZWNpc2lvblxuICAgIC8vIGRlcGVuZHMgb24gZXZlcnl0aGluZyBpdCByZWFkKS5cbiAgICBjb25zdCByZXNvbHZlTGlua1JlYWRzID0gKCk6IFtzdHJpbmdbXSwgYm9vbGVhbl0gPT5cbiAgICAgIGtpbmQgPT09ICdkYXRhJ1xuICAgICAgICA/IHJlYWRzRm9yTGlua3MocGFyZW50Q29tbWl0LCBrZXkgIT09IHVuZGVmaW5lZCA/IFtrZXldIDogdW5kZWZpbmVkKVxuICAgICAgICA6IFtnZXRLZXlzUmVhZChwYXJlbnRJZCksIHRydWVdO1xuXG4gICAgbGV0IHBhcmVudE5vZGUgPSBub2RlTWFwLmdldChwYXJlbnRJZCk7XG4gICAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgICAvLyBOZXcgbm9kZSDigJQgY3JlYXRlIGFuZCBlbnF1ZXVlIChyZXNwZWN0aW5nIHRoZSBub2RlIGJ1ZGdldClcbiAgICAgIGlmICh2aXNpdGVkID49IG1heE5vZGVzKSB7XG4gICAgICAgIHRydW5jYXRlZEJ5Tm9kZXMgPSB0cnVlOyAvLyBENDogYSBkaXNjb3ZlcmVkIHBhcmVudCB3YXMgZHJvcHBlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudElkeCA9IGlkeE1hcC5nZXQocGFyZW50SWQpO1xuICAgICAgaWYgKHBhcmVudElkeCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIHBhcmVudE5vZGUgPSB7XG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiBwYXJlbnRJZCxcbiAgICAgICAgc3RhZ2VJZDogcGFyZW50Q29tbWl0LnN0YWdlSWQsXG4gICAgICAgIHN0YWdlTmFtZTogcGFyZW50Q29tbWl0LnN0YWdlLFxuICAgICAgICBrZXlzV3JpdHRlbjogcGFyZW50Q29tbWl0LnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSxcbiAgICAgICAgLy8gbGlua2VkQnkgc3RheXMgYSBEQVRBLWtleSBjb25jZXB0IChiYWNrLWNvbXBhdCkg4oCUIGNvbnRyb2wtbGlua2VkXG4gICAgICAgIC8vIG5vZGVzIGNhcnJ5IHRoZWlyIGxhYmVsIG9uIHRoZSBlZGdlIGluc3RlYWQuXG4gICAgICAgIGxpbmtlZEJ5OiBraW5kID09PSAnZGF0YScgPyBrZXkgPz8gJycgOiAnJyxcbiAgICAgICAgZGVwdGg6IGRlcHRoICsgMSxcbiAgICAgICAgcGFyZW50czogW10sXG4gICAgICAgIHBhcmVudEVkZ2VzOiBbXSxcbiAgICAgICAgLi4uaW5jb21wbGV0ZVNvdXJjZXNGcmFnbWVudChwYXJlbnRDb21taXQpLFxuICAgICAgfTtcbiAgICAgIG5vZGVNYXAuc2V0KHBhcmVudElkLCBwYXJlbnROb2RlKTtcbiAgICAgIHZpc2l0ZWQrKztcbiAgICAgIGNvbnN0IFtsaW5rUmVhZHMsIGxpbmtJc0Z1bGxdID0gcmVzb2x2ZUxpbmtSZWFkcygpO1xuICAgICAgZXhwYW5kZWRSZWFkcy5zZXQocGFyZW50SWQsIG5ldyBTZXQobGlua1JlYWRzKSk7XG4gICAgICBpZiAobGlua0lzRnVsbCkgZnVsbHlFeHBhbmRlZC5hZGQocGFyZW50SWQpO1xuICAgICAgcXVldWUucHVzaChbcGFyZW50Tm9kZSwgcGFyZW50SWR4LCBkZXB0aCArIDEsIGxpbmtSZWFkc10pO1xuICAgIH0gZWxzZSBpZiAocGVyV3JpdGUgJiYgIWZ1bGx5RXhwYW5kZWQuaGFzKHBhcmVudElkKSkge1xuICAgICAgLy8gI1AxIHdvcmtsaXN0OiBhbiBFWElTVElORyBub2RlIGxpbmtlZCB2aWEgYW5vdGhlciBrZXkgbWF5IG93ZSBtb3JlXG4gICAgICAvLyBleHBhbnNpb24g4oCUIGVucXVldWUgb25seSB0aGUgcmVhZHMgbm90IHlldCBleHBhbmRlZCAobW9ub3RvbmU7IHRoZVxuICAgICAgLy8gbm9kZSBidWRnZXQgaXMgdW50b3VjaGVkLCBubyBub2RlIGlzIGNyZWF0ZWQpLiBSZS1leHBhbnNpb24ga2VlcHNcbiAgICAgIC8vIHRoZSBub2RlJ3MgT1JJR0lOQUwgZGVwdGggc28gaXRzIHBhcmVudHMgZ2V0IGEgY29uc2lzdGVudCBkZXB0aCsxLlxuICAgICAgY29uc3QgW2xpbmtSZWFkcywgbGlua0lzRnVsbF0gPSByZXNvbHZlTGlua1JlYWRzKCk7XG4gICAgICBjb25zdCBleHBhbmRlZCA9IGV4cGFuZGVkUmVhZHMuZ2V0KHBhcmVudElkKSE7XG4gICAgICBjb25zdCBkZWx0YSA9IGxpbmtSZWFkcy5maWx0ZXIoKGspID0+ICFleHBhbmRlZC5oYXMoaykpO1xuICAgICAgaWYgKGxpbmtJc0Z1bGwpIGZ1bGx5RXhwYW5kZWQuYWRkKHBhcmVudElkKTtcbiAgICAgIGlmIChkZWx0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgayBvZiBkZWx0YSkgZXhwYW5kZWQuYWRkKGspO1xuICAgICAgICBjb25zdCBwYXJlbnRJZHggPSBpZHhNYXAuZ2V0KHBhcmVudElkKTtcbiAgICAgICAgaWYgKHBhcmVudElkeCAhPT0gdW5kZWZpbmVkKSBxdWV1ZS5wdXNoKFtwYXJlbnROb2RlLCBwYXJlbnRJZHgsIHBhcmVudE5vZGUuZGVwdGgsIGRlbHRhXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gREFHIG1lcmdlOiBvbmUgcGFyZW50c1tdIGVudHJ5IHBlciBkaXN0aW5jdCBwYXJlbnQgKGhpc3RvcmljYWwgc2hhcGUpXG4gICAgaWYgKCFub2RlLnBhcmVudHMuc29tZSgocCkgPT4gcC5ydW50aW1lU3RhZ2VJZCA9PT0gcGFyZW50SWQpKSB7XG4gICAgICBub2RlLnBhcmVudHMucHVzaChwYXJlbnROb2RlKTtcbiAgICB9XG4gICAgLy8gT25lIGVkZ2UgcGVyIGRpc3RpbmN0IChwYXJlbnQsIGtpbmQsIGtleSkgbGluay4gVGhlIHdlaWdoZXIgKEQ0KVxuICAgIC8vIHN0YW1wcyB0aGUgd2VpZ2h0IGF0IGNyZWF0aW9uOyBgdW5kZWZpbmVkYCDihpIgMS4wIOKAlCB0aGUgZW5naW5lIG5ldmVyXG4gICAgLy8gY29tcHV0ZXMgd2VpZ2h0cyBpdHNlbGYuXG4gICAgaWYgKCFub2RlLnBhcmVudEVkZ2VzLnNvbWUoKGUpID0+IGUucGFyZW50LnJ1bnRpbWVTdGFnZUlkID09PSBwYXJlbnRJZCAmJiBlLmtpbmQgPT09IGtpbmQgJiYgZS5rZXkgPT09IGtleSkpIHtcbiAgICAgIC8vIEVycm9yIGlzb2xhdGlvbiAocmV2aWV3IGZpbmRpbmcpOiBhIGNvbnN1bWVyIHdlaWdoZXIgdGhhdCB0aHJvd3NcbiAgICAgIC8vIG11c3QgZGVncmFkZSB0byB0aGUgZGVmYXVsdCB3ZWlnaHQsIG5ldmVyIGNyYXNoIHRoZSBzbGljZSDigJQgdGhlXG4gICAgICAvLyBzYW1lIGNvbnRyYWN0IGV2ZXJ5IG90aGVyIGNvbnN1bWVyIGNhbGxiYWNrIGluIHRoZSBsaWJyYXJ5IGdldHMuXG4gICAgICBsZXQgd2VpZ2h0ID0gMS4wO1xuICAgICAgaWYgKHdlaWdoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgd2VpZ2h0ID0gd2VpZ2gobm9kZSwgcGFyZW50Tm9kZSwga2V5LCBraW5kKSA/PyAxLjA7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8qIHdlaWdoZXIgdGhyZXcg4oCUIGtlZXAgMS4wLCB0aGUgc2xpY2Ugc3RheXMgdXNhYmxlICovXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5vZGUucGFyZW50RWRnZXMucHVzaCh7IHBhcmVudDogcGFyZW50Tm9kZSwga2luZCwga2V5LCB3ZWlnaHQgfSk7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBbbm9kZSwgY29tbWl0SWR4LCBkZXB0aCwga2V5c1RvRXhwYW5kXSA9IHF1ZXVlLnNoaWZ0KCkhO1xuXG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoKSB7XG4gICAgICAvLyBENDogb25seSBhIG5vZGUgdGhhdCBzdGlsbCBIQUQgc29tZXRoaW5nIHRvIGV4cGFuZCBjb3VudHMgYXMgYSBjdXRcbiAgICAgIC8vIChhIGxlYWYgYXQgdGhlIGhvcml6b24gdHJ1bmNhdGVzIG5vdGhpbmcpLlxuICAgICAgaWYgKGtleXNUb0V4cGFuZC5sZW5ndGggPiAwIHx8IGNvbnRyb2xEZXBzPy4obm9kZS5ydW50aW1lU3RhZ2VJZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnVuY2F0ZWRCeURlcHRoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERhdGEgZWRnZXM6IGZvciBlYWNoIGtleSBpbiB0aGlzIGV4cGFuc2lvbidzIHJlYWQtc2V0LCBmaW5kIHdobyB3cm90ZVxuICAgIC8vIGl0LiBVbmRlciAnc3RhZ2UnIHRoaXMgaXMgdGhlIG5vZGUncyBmdWxsIHJlYWQtc2V0IChoaXN0b3JpY2FsXG4gICAgLy8gYmVoYXZpb3IpOyB1bmRlciAncGVyLXdyaXRlJyBpdCBpcyB0aGUgbGlua2luZyB3cml0ZXMnIHRlbXBvcmFsIHByZWZpeFxuICAgIC8vIChvciBhIHdvcmtsaXN0IGRlbHRhIG9uIHJlLWV4cGFuc2lvbikuXG4gICAgY29uc3Qga2V5c1JlYWQgPSBrZXlzVG9FeHBhbmQ7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1JlYWQpIHtcbiAgICAgIGNvbnN0IHdyaXRlciA9IGZpbmRXcml0ZXIoa2V5LCBjb21taXRJZHgpO1xuICAgICAgaWYgKCF3cml0ZXIpIGNvbnRpbnVlO1xuICAgICAgbGlua1BhcmVudChub2RlLCB3cml0ZXIsICdkYXRhJywga2V5LCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLy8gQ29udHJvbCBlZGdlIChSRkMtMDAzIEQzKTogbGluayB0aGUgZ292ZXJuaW5nIGRlY2lkZXIsIGxhYmVsZWQgYnkgdGhlXG4gICAgLy8gZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQuIFRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAgLy8gbm9ybWFsbHkgdGhyb3VnaCBpdHMgb3duIGRhdGEgcmVhZHMgKGFuZCBpdHMgb3duIGNvbnRyb2wgcGFyZW50KS5cbiAgICBpZiAoY29udHJvbERlcHMpIHtcbiAgICAgIGNvbnN0IGRlcCA9IGNvbnRyb2xEZXBzKG5vZGUucnVudGltZVN0YWdlSWQpO1xuICAgICAgaWYgKGRlcCkge1xuICAgICAgICBjb25zdCBkZWNpZGVySWR4ID0gaWR4TWFwLmdldChkZXAuZGVjaWRlcklkKTtcbiAgICAgICAgaWYgKGRlY2lkZXJJZHggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxpbmtQYXJlbnQobm9kZSwgY29tbWl0TG9nW2RlY2lkZXJJZHhdLCAnY29udHJvbCcsIGRlcC5sYWJlbCwgZGVwdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUkZDLTAwMyBENCDigJQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5IG9uIHRoZSByb290IChhYnNlbnQgd2hlbiBjb21wbGV0ZSkuXG4gIGlmICh0cnVuY2F0ZWRCeURlcHRoIHx8IHRydW5jYXRlZEJ5Tm9kZXMpIHtcbiAgICByb290LnRydW5jYXRlZCA9IHsgYnlEZXB0aDogdHJ1bmNhdGVkQnlEZXB0aCwgYnlOb2RlczogdHJ1bmNhdGVkQnlOb2RlcyB9O1xuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtmb290cHJpbnRdIGNhdXNhbENoYWluKCcke3N0YXJ0SWR9JykgdHJ1bmNhdGVkIGJ5IGAgK1xuICAgICAgICAgIGAke1t0cnVuY2F0ZWRCeURlcHRoICYmIGBtYXhEZXB0aCAoJHttYXhEZXB0aH0pYCwgdHJ1bmNhdGVkQnlOb2RlcyAmJiBgbWF4Tm9kZXMgKCR7bWF4Tm9kZXN9KWBdXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuam9pbignICsgJyl9IOKAlCB0aGUgc2xpY2UgaXMgaW5jb21wbGV0ZS4gUmFpc2UgdGhlIGxpbWl0cyBvciBuYXJyb3cga2V5c1JlYWQuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmxhdHRlbiB0aGUgY2F1c2FsIERBRyBpbnRvIGEgQkZTLW9yZGVyZWQgbGlzdCBvZiBub2Rlcy5cbiAqIEVhY2ggbm9kZSBhcHBlYXJzIGV4YWN0bHkgb25jZSAoZmlyc3Qgb2NjdXJyZW5jZSBieSBCRlMgb3JkZXIpLlxuICogVXNlZnVsIGZvciBsaW5lYXIgZGlzcGxheSBvciBpdGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuQ2F1c2FsREFHKHJvb3Q6IENhdXNhbE5vZGUpOiBDYXVzYWxOb2RlW10ge1xuICBjb25zdCByZXN1bHQ6IENhdXNhbE5vZGVbXSA9IFtdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHF1ZXVlOiBDYXVzYWxOb2RlW10gPSBbcm9vdF07XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gcXVldWUuc2hpZnQoKSE7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSBjb250aW51ZTtcbiAgICB2aXNpdGVkLmFkZChub2RlLnJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXN1bHQucHVzaChub2RlKTtcblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhwYXJlbnQucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICAgIHF1ZXVlLnB1c2gocGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIGNhdXNhbCBEQUcgYXMgaHVtYW4tcmVhZGFibGUgaW5kZW50ZWQgdGV4dC5cbiAqIFNob3dzIHRoZSBkZXBlbmRlbmN5IGNoYWluIHdpdGggZGVwdGggaW5kZW50YXRpb24gYW5kIGxpbmtlZC1ieSBrZXlzLlxuICpcbiAqIFJGQy0wMDMgRDI6IG5vZGVzIHRoYXQgY29uc3VtZWQgdW50cmFja2VkIHJlYWQgcGF0aHMgcmVuZGVyIGFuIGV4dHJhXG4gKiBg4pqgIGFsc28gY29uc3VtZWQg4oCmIOKAlCBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLCBzbyBhIGNvbnN1bWVyXG4gKiAoaHVtYW4gb3IgTExNKSBkZWJ1Z2dpbmcgZnJvbSB0aGUgc2xpY2UgaXMgVE9MRCB3aGVuIGl0IGlzIGluY29tcGxldGUuXG4gKlxuICogUkZDLTAwMyBEMzogY29udHJvbCBlZGdlcyByZW5kZXIgYXMgYOKGkCBbY29udHJvbDogPHJ1bGUgbGFiZWw+XWBcbiAqIChsYWJlbCBvbWl0dGVkIHdoZW4gdGhlIGRlY2lzaW9uIGNhcnJpZWQgbm9uZSkuIERhdGEgcmVuZGVyaW5nIGlzXG4gKiBieXRlLWlkZW50aWNhbCB0byB0aGUgcHJlLUQzIG91dHB1dCDigJQgYOKGkCB2aWEgPGtleT5gIGZyb20gdGhlIG5vZGUnc1xuICogZGlzY292ZXJ5LXRpbWUgYGxpbmtlZEJ5YC5cbiAqXG4gKiBSRkMtMDAzIEQ0OiBlZGdlIHdlaWdodHMgZnJvbSB0aGUgYHdlaWdoYCBob29rIHJlbmRlciBhcyBhIHN1ZmZpeCDigJRcbiAqIGDihpAgdmlhIHN5c3RlbVByb21wdCAoMC4xOClgIOKAlCBvbmx5IHdoZW4g4omgIDEuMCwgc28gdW53ZWlnaHRlZCBvdXRwdXQgaXNcbiAqIHVuY2hhbmdlZC4gQSB0cnVuY2F0ZWQgc2xpY2UgKHJvb3QudHJ1bmNhdGVkKSBhcHBlbmRzIGEgZmluYWxcbiAqIGDimqAgc2xpY2UgdHJ1bmNhdGVkIOKApmAgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENhdXNhbENoYWluKHJvb3Q6IENhdXNhbE5vZGUpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IHdlaWdodFN1ZmZpeCA9IChlZGdlOiBDYXVzYWxFZGdlIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+XG4gICAgZWRnZSAhPT0gdW5kZWZpbmVkICYmIGVkZ2Uud2VpZ2h0ICE9PSAxID8gYCAoJHtlZGdlLndlaWdodH0pYCA6ICcnO1xuXG4gIGZ1bmN0aW9uIHdhbGsobm9kZTogQ2F1c2FsTm9kZSwgaW5kZW50OiBudW1iZXIsIGVkZ2VzRnJvbUNoaWxkPzogQ2F1c2FsRWRnZVtdKTogdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl94oazICR7bm9kZS5ydW50aW1lU3RhZ2VJZH0gKHNlZSBhYm92ZSlgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmlzaXRlZC5hZGQobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG5cbiAgICBjb25zdCBsaW5rUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5vZGUubGlua2VkQnkpIHtcbiAgICAgIGNvbnN0IGRhdGFFZGdlID0gZWRnZXNGcm9tQ2hpbGQ/LmZpbmQoKGUpID0+IGUua2luZCA9PT0gJ2RhdGEnKTtcbiAgICAgIGxpbmtQYXJ0cy5wdXNoKGB2aWEgJHtub2RlLmxpbmtlZEJ5fSR7d2VpZ2h0U3VmZml4KGRhdGFFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbEVkZ2UgPSBlZGdlc0Zyb21DaGlsZD8uZmluZCgoZSkgPT4gZS5raW5kID09PSAnY29udHJvbCcpO1xuICAgIGlmIChjb250cm9sRWRnZSkge1xuICAgICAgbGlua1BhcnRzLnB1c2goYFtjb250cm9sJHtjb250cm9sRWRnZS5rZXkgPyBgOiAke2NvbnRyb2xFZGdlLmtleX1gIDogJyd9XSR7d2VpZ2h0U3VmZml4KGNvbnRyb2xFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgbGluayA9IGxpbmtQYXJ0cy5sZW5ndGggPiAwID8gYCDihpAgJHtsaW5rUGFydHMuam9pbignIOKGkCAnKX1gIDogJyc7XG5cbiAgICBjb25zdCB3cml0ZXMgPSBub2RlLmtleXNXcml0dGVuLmxlbmd0aCA+IDAgPyBgIFt3cm90ZTogJHtub2RlLmtleXNXcml0dGVuLmpvaW4oJywgJyl9XWAgOiAnJztcbiAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl9JHtub2RlLnN0YWdlTmFtZX0gKCR7bm9kZS5ydW50aW1lU3RhZ2VJZH0pJHtsaW5rfSR7d3JpdGVzfWApO1xuXG4gICAgaWYgKG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMgJiYgbm9kZS5pbmNvbXBsZXRlU291cmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgJHsnICAnLnJlcGVhdChpbmRlbnQgKyAxKX3imqAgYWxzbyBjb25zdW1lZCAke25vZGUuaW5jb21wbGV0ZVNvdXJjZXMuam9pbignLycpfSDigJQgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgd2FsayhcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBpbmRlbnQgKyAxLFxuICAgICAgICBub2RlLnBhcmVudEVkZ2VzLmZpbHRlcigoZSkgPT4gZS5wYXJlbnQgPT09IHBhcmVudCksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHdhbGsocm9vdCwgMCk7XG5cbiAgaWYgKHJvb3QudHJ1bmNhdGVkKSB7XG4gICAgY29uc3QgY2F1c2VzID0gW3Jvb3QudHJ1bmNhdGVkLmJ5RGVwdGggJiYgJ21heERlcHRoIHJlYWNoZWQnLCByb290LnRydW5jYXRlZC5ieU5vZGVzICYmICdtYXhOb2RlcyByZWFjaGVkJ11cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKCcsICcpO1xuICAgIGxpbmVzLnB1c2goYOKaoCBzbGljZSB0cnVuY2F0ZWQgKCR7Y2F1c2VzfSkg4oCUIG9sZGVyIGNhdXNlcyBleGlzdCBiZXlvbmQgdGhpcyBob3Jpem9uYCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8vIOKUgOKUgCBFeHBvcnRlZCBmb3IgdGVzdGluZyAoaW50ZXJuYWwpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQGludGVybmFsIEV4cG9zZWQgZm9yIHRlc3RpbmcgdGhlIHN0cmF0ZWd5IHNlbGVjdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBfUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQgPSBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRDtcbiJdfQ==
452
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvYmFja3RyYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzREc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQThLckQsMEVBQTBFO0FBRTFFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQVFwQyxrRUFBa0U7QUFDbEUsU0FBUyxnQkFBZ0IsQ0FBQyxTQUF5QjtJQUNqRCxPQUFPLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxTQUF5QjtJQUNuRCxrRUFBa0U7SUFDbEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7SUFDMUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMxQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuQyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ1QsR0FBRyxHQUFHLEVBQUUsQ0FBQztnQkFDVCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FB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QyxDQUNwRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQzthQUN4RyxNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsTUFBTSw0Q0FBNEMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVELDBFQUEwRTtBQUUxRSw0REFBNEQ7QUFDNUQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsdUJBQXVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGJhY2t0cmFjay50cyDigJQgQmFja3dhcmQgY2F1c2FsIGNoYWluIGFuYWx5c2lzIG9uIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEltcGxlbWVudHMgKipiYWNrd2FyZCBwcm9ncmFtIHNsaWNpbmcqKiAoV2Vpc2VyIDE5ODQsIHRoaW4tc2xpY2UgdmFyaWFudCk6XG4gKiBnaXZlbiBhIHN0YXJ0aW5nIGV4ZWN1dGlvbiBzdGVwLCB3YWxrIGJhY2t3YXJkcyB0aHJvdWdoIHJlYWTihpJ3cml0ZVxuICogZGVwZW5kZW5jaWVzIHRvIGJ1aWxkIHRoZSBjYXVzYWwgREFHIHRoYXQgcHJvZHVjZWQgdGhlIGRhdGEgYXQgdGhhdCBzdGVwLlxuICpcbiAqICMjIEFsZ29yaXRobVxuICpcbiAqIEJGUyBvbiB0aGUgaW1wbGljaXQgZGVwZW5kZW5jeSBncmFwaCB3aGVyZSBlZGdlcyBydW4gZnJvbSByZWFkZXIg4oaSIHdyaXRlci5cbiAqXG4gKiAxLiBMb2NhdGUgc3RhcnRJZCBpbiBjb21taXRMb2cg4oaSIHJvb3Qgbm9kZVxuICogMi4gR2V0IGtleXNSZWFkIGZvciByb290IHZpYSBgZ2V0S2V5c1JlYWRgIGNhbGxiYWNrXG4gKiAzLiBGb3IgZWFjaCBrZXkgcmVhZCwgZmluZCB3aG8gbGFzdCB3cm90ZSBpdCBiZWZvcmUgdGhpcyBzdGVwIOKGkiBwYXJlbnQgY29tbWl0XG4gKiA0LiBDcmVhdGUgcGFyZW50IENhdXNhbE5vZGUsIGxpbmsgdG8gcm9vdC5wYXJlbnRzXG4gKiA1LiBFbnF1ZXVlIHBhcmVudC4gUmVwZWF0IHVudGlsIHF1ZXVlIGVtcHR5IG9yIGxpbWl0cyBoaXQuXG4gKlxuICogT3V0cHV0IGlzIGEgKipEQUcqKiAobm90IGEgbGlua2VkIGxpc3QpOiBhIHN0YWdlIHJlYWRpbmcgYGNyZWRpdFNjb3JlYCBBTkQgYGR0aWBcbiAqIGZyb20gZGlmZmVyZW50IHdyaXRlcnMgaGFzIHR3byBwYXJlbnRzLlxuICpcbiAqICMjIFN0YWdlZCBPcHRpbWl6YXRpb25cbiAqXG4gKiBUd28gd3JpdGVyLWxvb2t1cCBzdHJhdGVnaWVzLCBjaG9zZW4gYXV0b21hdGljYWxseSBieSBjb21taXQgbG9nIHNpemU6XG4gKlxuICogfCBTdHJhdGVneSB8IFdoZW4gfCBDb21wbGV4aXR5IHBlciBsb29rdXAgfFxuICogfC0tLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IExpbmVhciBzY2FuIHwgTiDiiaQgMjU2IHwgTyhOKSDigJQgc2ltcGxlIGJhY2t3YXJkIHNjYW4gfFxuICogfCBSZXZlcnNlIGluZGV4IHwgTiA+IDI1NiB8IE8oSyBsb2cgTikg4oCUIHByZWJ1aWx0IGtleeKGkltpbmRpY2VzXSwgYmluYXJ5IHNlYXJjaCB8XG4gKlxuICogVGhlIHRocmVzaG9sZCAoMjU2KSBpcyBjaG9zZW4gc28gdGhlIE8oTikgYnVpbGQgY29zdCBvZiB0aGUgcmV2ZXJzZSBpbmRleFxuICogaXMgYW1vcnRpemVkIG92ZXIgdGhlIEJGUyB0cmF2ZXJzYWwuIEJlbG93IDI1NiwgbGluZWFyIHNjYW4gd2lucyBiZWNhdXNlXG4gKiB0aGVyZSdzIG5vIGluZGV4IGJ1aWxkIG92ZXJoZWFkLiBUaGUgY29uc3VtZXIgbmV2ZXIgc2VlcyB0aGlzIOKAlCBgY2F1c2FsQ2hhaW4oKWBcbiAqIHBpY2tzIHRoZSByaWdodCBzdHJhdGVneSBpbnRlcm5hbGx5IChsaWtlIGEgcXVlcnkgb3B0aW1pemVyIGNob29zaW5nIGJldHdlZW5cbiAqIHNlcXVlbnRpYWwgc2NhbiB2cyBpbmRleCBzY2FuIGJhc2VkIG9uIHRhYmxlIHNpemUpLlxuICpcbiAqICMjIENvbXBsZXhpdHlcbiAqXG4gKiAtICoqU21hbGwgbG9ncyAoTiDiiaQgMjU2KToqKiBPKFYgw5cgSyDDlyBOKSB0b3RhbC4gVj12aXNpdGVkLCBLPWF2ZyBrZXlzL25vZGUuXG4gKiAtICoqTGFyZ2UgbG9ncyAoTiA+IDI1Nik6KiogTyhOIMOXIFUpIGluZGV4IGJ1aWxkICsgTyhWIMOXIEsgw5cgbG9nIE4pIGxvb2t1cHMuXG4gKiAgIFUgPSB1bmlxdWUga2V5cy4gQW1vcnRpemVkIG92ZXIgYWxsIEJGUyBob3BzLlxuICpcbiAqICMjIFJlZmVyZW5jZXNcbiAqXG4gKiAtIFdlaXNlciwgTS4gKDE5ODQpLiBcIlByb2dyYW0gU2xpY2luZy5cIiBJRUVFIFRTRS5cbiAqIC0gU3JpZGhhcmFuLCBNLiBldCBhbC4gKDIwMDcpLiBcIlRoaW4gU2xpY2luZy5cIiBQTERJLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjYXVzYWxDaGFpbiwgZmxhdHRlbkNhdXNhbERBRywgZm9ybWF0Q2F1c2FsQ2hhaW4gfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgZGFnID0gY2F1c2FsQ2hhaW4oY29tbWl0TG9nLCAnZGVjaWRlIzInLCAoaWQpID0+IHJlY29yZGVyLmdldEtleXNSZWFkKGlkKSk7XG4gKiBjb25zdCBmbGF0ID0gZmxhdHRlbkNhdXNhbERBRyhkYWcpOyAgICAgLy8gQkZTLW9yZGVyZWQgZmxhdCBsaXN0XG4gKiBjb25zb2xlLmxvZyhmb3JtYXRDYXVzYWxDaGFpbihkYWcpKTsgICAgIC8vIGh1bWFuLXJlYWRhYmxlXG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB7IGZpbmRMYXN0V3JpdGVyIH0gZnJvbSAnLi9jb21taXRMb2dVdGlscy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgVW50cmFja2VkU291cmNlIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIEEgc2luZ2xlIG5vZGUgaW4gdGhlIGNhdXNhbCBEQUcuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNhbE5vZGUge1xuICAvKiogVW5pcXVlIGV4ZWN1dGlvbiBzdGVwIGlkZW50aWZpZXIuICovXG4gIHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBTdGFibGUgc3RhZ2UgaWRlbnRpZmllci4gKi9cbiAgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgc3RhZ2UgbmFtZS4gKi9cbiAgc3RhZ2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBLZXlzIHRoaXMgc3RhZ2Ugd3JvdGUgKGZyb20gaXRzIENvbW1pdEJ1bmRsZS50cmFjZSkuICovXG4gIGtleXNXcml0dGVuOiBzdHJpbmdbXTtcbiAgLyoqIFRoZSBrZXkgd2hvc2UgcmVhZOKGkndyaXRlIGRlcGVuZGVuY3kgbGlua2VkIHRoaXMgbm9kZSB0byBpdHMgY2hpbGQuIEVtcHR5IGZvciB0aGUgcm9vdC4gKi9cbiAgbGlua2VkQnk6IHN0cmluZztcbiAgLyoqIEJGUyBkZXB0aCBmcm9tIHRoZSBzdGFydGluZyBub2RlICgwID0gc3RhcnQpLiAqL1xuICBkZXB0aDogbnVtYmVyO1xuICAvKipcbiAgICogUGFyZW50IG5vZGVzIOKAlCBzdGFnZXMgdGhpcyBub2RlIGRlcGVuZHMgb24uIERBRzogbXVsdGlwbGUgcGFyZW50c1xuICAgKiBwb3NzaWJsZS4gS0VQVCBmb3IgY29tcGF0aWJpbGl0eTsgd2l0aCB0aGUgYGNvbnRyb2xEZXBzYCBvcHRpb25cbiAgICogKFJGQy0wMDMgRDMpIGdvdmVybmluZyBkZWNpZGVycyBhcHBlYXIgaGVyZSB0b28uIEZvciB0eXBlZC9rZXllZC9cbiAgICogd2VpZ2h0ZWQgZGV0YWlsIHVzZSB7QGxpbmsgcGFyZW50RWRnZXN9LlxuICAgKi9cbiAgcGFyZW50czogQ2F1c2FsTm9kZVtdO1xuICAvKipcbiAgICogUkZDLTAwMyBEMyDigJQgb25lIGVkZ2UgcGVyIGRlcGVuZGVuY3kgTElOSyAobm90IHBlciBwYXJlbnQpOiBhIG5vZGVcbiAgICogcmVhZGluZyB0d28ga2V5cyBmcm9tIHRoZSBzYW1lIHdyaXRlciBoYXMgT05FIGVudHJ5IGluIHtAbGluayBwYXJlbnRzfVxuICAgKiBidXQgVFdPIGAnZGF0YSdgIGVkZ2VzIGhlcmUuIENvbnRyb2wgZGVwZW5kZW5jaWVzICh2aWEgdGhlXG4gICAqIGBjb250cm9sRGVwc2Agb3B0aW9uKSBhZGQgYSBgJ2NvbnRyb2wnYCBlZGdlIHRvIHRoZSBnb3Zlcm5pbmcgZGVjaWRlci5cbiAgICovXG4gIHBhcmVudEVkZ2VzOiBDYXVzYWxFZGdlW107XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQyIGhvbmVzdHkgbWFya2VyIOKAlCBzdGFtcGVkIGZyb20gdGhlIHN0YWdlJ3NcbiAgICogYENvbW1pdEJ1bmRsZS51bnRyYWNrZWRTb3VyY2VzYC4gUHJlc2VudCB3aGVuIHRoaXMgc3RhZ2UgQUxTTyBjb25zdW1lZFxuICAgKiB1bnRyYWNrZWQgcmVhZCBwYXRocyAoYGFyZ3NgIC8gYGVudmAgLyB1bnNoYWRvd2VkIGBzaWxlbnRgIHJlYWRzKTogdGhlXG4gICAqIGJhY2t3YXJkIHNsaWNlIHRocm91Z2ggdGhpcyBub2RlIG1heSBiZSBpbmNvbXBsZXRlLCBiZWNhdXNlIHRob3NlIHJlYWRzXG4gICAqIHByb2R1Y2Ugbm8gcmVhZOKGkndyaXRlIGVkZ2UgdG8gZm9sbG93LiBgZm9ybWF0Q2F1c2FsQ2hhaW5gIHJlbmRlcnMgdGhpc1xuICAgKiBhcyBhIGDimqAg4oCmIHNsaWNlIG1heSBiZSBpbmNvbXBsZXRlIGhlcmVgIGxpbmUuIEFic2VudCB3aGVuIHRoZSBzdGFnZSdzXG4gICAqIHJlYWRzIHdlcmUgZnVsbHkgdHJhY2tlZC5cbiAgICpcbiAgICogUmVnaXN0cnkgY29kZTogYCdpbmNvbXBsZXRlLXNvdXJjZXMnYCAoYG1lbW9yeS9ob25lc3R5LnRzIMK3XG4gICAqIEhPTkVTVFlfQ09ERVNgLCBzZXJ2ZWQgb24gYGZvb3RwcmludGpzL3RyYWNlYCkgc2F5cyB3aGF0IHRoaXMgZmllbGRcbiAgICogbWVhbnMuIFRoZSBmaWVsZCBjYXJyaWVzIG5vIGBjb2RlYCDigJQgaXRzIHZhbHVlcyBhcmUgdGhlXG4gICAqIHtAbGluayBVbnRyYWNrZWRTb3VyY2V9cy5cbiAgICovXG4gIGluY29tcGxldGVTb3VyY2VzPzogUmVhZG9ubHlBcnJheTxVbnRyYWNrZWRTb3VyY2U+O1xuICAvKipcbiAgICogUkZDLTAwMyBENCB0cnVuY2F0aW9uIHZpc2liaWxpdHkg4oCUIHNldCBvbiB0aGUgUk9PVCBub2RlIG9ubHksIGFuZCBvbmx5XG4gICAqIHdoZW4gYSBsaW1pdCBhY3R1YWxseSBjdXQgdGhlIHNsaWNlOiBgYnlEZXB0aGAgd2hlbiBhIG5vZGUgYXQgdGhlXG4gICAqIGBtYXhEZXB0aGAgaG9yaXpvbiBzdGlsbCBoYWQgZWRnZXMgdG8gZXhwYW5kLCBgYnlOb2Rlc2Agd2hlbiB0aGVcbiAgICogYG1heE5vZGVzYCBidWRnZXQgYmxvY2tlZCBjcmVhdGluZyBhIGRpc2NvdmVyZWQgcGFyZW50LiBBYnNlbnQgd2hlbiB0aGVcbiAgICogc2xpY2UgaXMgY29tcGxldGUuIERldiBtb2RlIChgZW5hYmxlRGV2TW9kZSgpYCkgYWxzbyB3YXJucyBvblxuICAgKiB0cnVuY2F0aW9uLCBhbmQgYGZvcm1hdENhdXNhbENoYWluYCBhcHBlbmRzIGEgYOKaoCBzbGljZSB0cnVuY2F0ZWQg4oCmYFxuICAgKiBsaW5lIOKAlCBhIGNvbnN1bWVyIG11c3QgbmV2ZXIgbWlzdGFrZSBhIHRydW5jYXRlZCBzbGljZSBmb3IgYSBmdWxsIG9uZS5cbiAgICpcbiAgICogUmVnaXN0cnkgY29kZTogYCd0cnVuY2F0ZWQnYCAoYG1lbW9yeS9ob25lc3R5LnRzIMK3IEhPTkVTVFlfQ09ERVNgLCBzZXJ2ZWRcbiAgICogb24gYGZvb3RwcmludGpzL3RyYWNlYCkgc2F5cyB3aGF0IHRoaXMgZmllbGQgbWVhbnM7IHRoZSBmaWVsZCBjYXJyaWVzIG5vXG4gICAqIGBjb2RlYC5cbiAgICovXG4gIHRydW5jYXRlZD86IHsgYnlEZXB0aDogYm9vbGVhbjsgYnlOb2RlczogYm9vbGVhbiB9O1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgdHlwZWQgZGVwZW5kZW5jeSBlZGdlIGZyb20gYSBjaGlsZCBub2RlIHRvIG9uZSBwYXJlbnQuXG4gKlxuICogLSBga2luZDogJ2RhdGEnYCAgICDigJQgcmVhZOKGkndyaXRlIGRlcGVuZGVuY3k7IGBrZXlgIGlzIHRoZSBzdGF0ZSBrZXkuXG4gKiAtIGBraW5kOiAnY29udHJvbCdgIOKAlCB0aGUgcGFyZW50IGlzIHRoZSBkZWNpZGVyL3NlbGVjdG9yIHdob3NlIGRlY2lzaW9uXG4gKiAgIGFsbG93ZWQgdGhlIGNoaWxkIHRvIHJ1bjsgYGtleWAgaXMgdGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgd2hlbiBwcmVzZW50LlxuICpcbiAqIGB3ZWlnaHRgIGRlZmF1bHRzIHRvIDEuMDsgdGhlIGB3ZWlnaGAgaG9vayAoUkZDLTAwMyBENCkgY2FuIG92ZXJyaWRlIGl0LlxuICogVGhlIGVuZ2luZSBpdHNlbGYgTkVWRVIgY29tcHV0ZXMgd2VpZ2h0cyDigJQgc2VtYW50aWNzIGJlbG9uZyB0byB0aGVcbiAqIGNvbnN1bWVyLWluamVjdGVkIHdlaWdoZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2FsRWRnZSB7XG4gIHBhcmVudDogQ2F1c2FsTm9kZTtcbiAga2luZDogJ2RhdGEnIHwgJ2NvbnRyb2wnO1xuICBrZXk/OiBzdHJpbmc7XG4gIHdlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJGQy0wMDMgRDMg4oCUIGEgY29udHJvbCBkZXBlbmRlbmN5IHJlc29sdmVkIGZvciBvbmUgZXhlY3V0aW9uIHN0ZXA6XG4gKiB3aGljaCBkZWNpZGVyL3NlbGVjdG9yIGV4ZWN1dGlvbiBhbGxvd2VkIHRoaXMgc3RhZ2UgdG8gcnVuLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xEZXBlbmRlbmN5IHtcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBnb3Zlcm5pbmcgZGVjaWRlci9zZWxlY3RvciBleGVjdXRpb24gc3RlcC4gKi9cbiAgZGVjaWRlcklkOiBzdHJpbmc7XG4gIC8qKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCBmb3IgdGhlIGNob3NlbiBicmFuY2gsIHdoZW4gcHJlc2VudC4gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUkZDLTAwMyBEMyDigJQgY2FsbGJhY2sgcmVzb2x2aW5nIHRoZSBnb3Zlcm5pbmcgZGVjaWRlciBmb3IgYW4gZXhlY3V0aW9uXG4gKiBzdGVwLiBSZXR1cm4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgc3RlcCBpcyBub3QgY29udHJvbC1kZXBlbmRlbnQgb24gYW55XG4gKiByZWNvcmRlZCBkZWNpc2lvbi4gQnVpbGQgb25lIHdpdGggYGNvbnRyb2xEZXBSZWNvcmRlcigpYCBmcm9tXG4gKiBgZm9vdHByaW50anMvdHJhY2VgLCBvciBzdXBwbHkgeW91ciBvd24uXG4gKi9cbmV4cG9ydCB0eXBlIENvbnRyb2xEZXBMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUkZDLTAwMyBENCDigJQgY29uc3VtZXItaW5qZWN0ZWQgZWRnZSB3ZWlnaGVyLiBDYWxsZWQgb25jZSBwZXIgY3JlYXRlZFxuICogZWRnZTsgcmV0dXJuIGEgd2VpZ2h0LCBvciBgdW5kZWZpbmVkYCB0byBrZWVwIHRoZSBkZWZhdWx0IDEuMC4gVGhlXG4gKiBFTkdJTkUgbmV2ZXIgY29tcHV0ZXMgd2VpZ2h0cyAoemVybyBuZXcgZGVwZW5kZW5jaWVzIOKAlCBzZW1hbnRpY3MgbGlrZVxuICogZW1iZWRkaW5nIHNpbWlsYXJpdHkgb3IgRkRMIGluZmx1ZW5jZSBiZWxvbmcgdG8gZG93bnN0cmVhbSBsaWJyYXJpZXMsXG4gKiB0aGUgc2FtZSBwbHVnLWluIHBhdHRlcm4gYXMgYE5hcnJhdGl2ZUZvcm1hdHRlcmApLiBXZWlnaHRzIHJlbmRlciBpblxuICogYGZvcm1hdENhdXNhbENoYWluYCBhcyBg4oaQIHZpYSBzeXN0ZW1Qcm9tcHQgKDAuMTgpYC5cbiAqL1xuZXhwb3J0IHR5cGUgRWRnZVdlaWdoZXIgPSAoXG4gIGNoaWxkOiBDYXVzYWxOb2RlLFxuICBwYXJlbnQ6IENhdXNhbE5vZGUsXG4gIGtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBraW5kOiAnZGF0YScgfCAnY29udHJvbCcsXG4pID0+IG51bWJlciB8IHVuZGVmaW5lZDtcblxuLyoqIE9wdGlvbnMgZm9yIGNhdXNhbENoYWluKCkuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNhbENoYWluT3B0aW9ucyB7XG4gIC8qKiBNYXhpbXVtIEJGUyBkZXB0aCAoZGVmYXVsdDogMjApLiBQcmV2ZW50cyBydW5hd2F5IHRyYXZlcnNhbC4gKi9cbiAgbWF4RGVwdGg/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHRvdGFsIG5vZGVzIHRvIHZpc2l0IChkZWZhdWx0OiAxMDApLiBIYXJkIGNhcCBmb3Igc2FmZXR5LiAqL1xuICBtYXhOb2Rlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFJGQy0wMDMgRDMg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSBsb29rdXAuIFdoZW4gcHJvdmlkZWQsIGV4cGFuZGluZyBhIG5vZGVcbiAgICogQUxTTyBsaW5rcyBhIGAnY29udHJvbCdgIGVkZ2UgdG8gaXRzIGdvdmVybmluZyBkZWNpZGVyIChsYWJlbGVkIGJ5IHRoZVxuICAgKiBkZWNpZGUoKSBydWxlIGxhYmVsIHdoZW4gcHJlc2VudCk7IHRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAqIG5vcm1hbGx5IHRocm91Z2ggaXRzIG93biBkYXRhIHJlYWRzLCBzbyBjaGFpbnMgbGlrZVxuICAgKiBgc3RhdHVzIOKGkCBbY29udHJvbF0gQ2xhc3NpZnlSaXNrIOKGkCBbZGF0YTogY3JlZGl0U2NvcmVdIFB1bGxCdXJlYXVgXG4gICAqIHJlc29sdmUgZW5kLXRvLWVuZC4gV2l0aG91dCB0aGlzIG9wdGlvbiBiZWhhdmlvciBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBjb250cm9sRGVwcz86IENvbnRyb2xEZXBMb29rdXA7XG4gIC8qKlxuICAgKiBSRkMtMDAzIEQ0IOKAlCBlZGdlIHdlaWdoZXIuIFN0YW1wcyBgQ2F1c2FsRWRnZS53ZWlnaHRgIGF0IGVkZ2UgY3JlYXRpb247XG4gICAqIGB1bmRlZmluZWRgIChvciBubyB3ZWlnaGVyKSDihpIgMS4wLiBTZWUge0BsaW5rIEVkZ2VXZWlnaGVyfS5cbiAgICovXG4gIHdlaWdoPzogRWRnZVdlaWdoZXI7XG4gIC8qKlxuICAgKiAjUDEg4oCUIGhvdyBhIG5vZGUncyBleHBhbnNpb24gcmVhZC1zZXQgaXMgZGVyaXZlZDpcbiAgICpcbiAgICogLSBgJ3N0YWdlJ2AgKGRlZmF1bHQsIGhpc3RvcmljYWwpIOKAlCBldmVyeSB2aXNpdGVkIG5vZGUgZXhwYW5kcyB0aHJvdWdoXG4gICAqICAgQUxMIG9mIGl0cyBzdGFnZSdzIHJlYWRzIChgZ2V0S2V5c1JlYWRgKS4gQSBzdGFnZSByZWFkaW5nIGBhLGJgIGFuZFxuICAgKiAgIHdyaXRpbmcgYHgseWAgbGlua3MgYm90aCByZWFkcyBhcyBjYXVzZXMgb2YgYm90aCB3cml0ZXMg4oCUIGEgc291bmQgYnV0XG4gICAqICAgY29hcnNlIG92ZXItYXBwcm94aW1hdGlvbi5cbiAgICogLSBgJ3Blci13cml0ZSdgIOKAlCB3aGVuIHRoZSBjb21taXQgbG9nIGNhcnJpZXMgcGVyLXdyaXRlIHJlYWQgcHJvdmVuYW5jZVxuICAgKiAgIChgVHJhY2VFbnRyeS5yZWFkS2V5c2AsIHJlY29yZGVkIHVuZGVyIHRoZSBleGVjdXRvcidzXG4gICAqICAgYHdyaXRlUHJvdmVuYW5jZTogJ3JlYWRzLXByZWZpeCdgIGRpYWwpLCBhIG5vZGUgcmVhY2hlZCB2aWEga2V5IGBrYFxuICAgKiAgIGV4cGFuZHMgdGhyb3VnaCBPTkxZIHRoZSByZWFkcyB0aGF0IHByZWNlZGVkIGl0cyB3cml0ZSBvZiBga2BcbiAgICogICAodGVtcG9yYWwgcHJlZml4KS4gTm9kZXMgbGlua2VkIGxhdGVyIHZpYSBhZGRpdGlvbmFsIGtleXMgYXJlXG4gICAqICAgaW5jcmVtZW50YWxseSByZS1leHBhbmRlZCB3aXRoIGp1c3QgdGhlIG5ldyByZWFkcyAod29ya2xpc3Qg4oCUIHRoZVxuICAgKiAgIHNsaWNlIG9ubHkgZXZlciBHUk9XUyB0b3dhcmQgdGhlIHN0YWdlLWxldmVsIGNlaWxpbmcpLiBIT05FU1RcbiAgICogICBGQUxMQkFDSzogYW55IGxpbmsgd2hvc2UgdHJhY2UgZW50cnkgbGFja3MgYHJlYWRLZXlzYCBleHBhbmRzIHRoYXRcbiAgICogICBub2RlIGF0IHN0YWdlIGxldmVsIOKAlCBtaXhlZCBvciBkaWFsLW9mZiBsb2dzIGRlZ3JhZGUgdG8gYCdzdGFnZSdgXG4gICAqICAgYmVoYXZpb3IgZXhhY3RseSwgbmV2ZXIgdG8gc2lsZW5jZS5cbiAgICovXG4gIGVkZ2VBdHRyaWJ1dGlvbj86ICdzdGFnZScgfCAncGVyLXdyaXRlJztcbiAgLyoqXG4gICAqICNQMSDigJQgdGhlIHdyaXR0ZW4ga2V5cyB0aGF0IGFuY2hvciB0aGUgUk9PVCdzIGV4cGFuc2lvbiB1bmRlclxuICAgKiBgJ3Blci13cml0ZSdgIChlLmcuIGBzbGljZUZvcktleWAgcGFzc2VzIHRoZSBzbGljZWQga2V5LCBzbyB0aGUgcm9vdFxuICAgKiBleHBhbmRzIHRocm91Z2ggdGhlIHJlYWRzIHRoYXQgZmVkIFRIQVQgd3JpdGUsIG5vdCB0aGUgd2hvbGUgc3RhZ2UpLlxuICAgKiBJZ25vcmVkIHVuZGVyIGAnc3RhZ2UnYC4gVW5zZXQg4oaSIHJvb3QgZXhwYW5kcyBhdCBzdGFnZSBsZXZlbC5cbiAgICovXG4gIHJvb3RMaW5rS2V5cz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENhbGxiYWNrIHRoYXQgcmV0dXJucyB0aGUga2V5cyBhIHN0YWdlIHJlYWQgZHVyaW5nIGV4ZWN1dGlvbi5cbiAqIFRoZSBiYWNrdHJhY2tlciBjYWxscyB0aGlzIGZvciBlYWNoIHZpc2l0ZWQgbm9kZSB0byBkZXRlcm1pbmVcbiAqIHdoaWNoIHJlYWTihpJ3cml0ZSBlZGdlcyB0byBmb2xsb3cuXG4gKlxuICogSW1wbGVtZW50b3JzOiBRdWFsaXR5UmVjb3JkZXIgdHJhY2tzIGtleXNSZWFkIHBlciBzdGVwLFxuICogb3IgYnVpbGQgYSBNYXA8cnVudGltZVN0YWdlSWQsIHN0cmluZ1tdPiBmcm9tIFNjb3BlUmVjb3JkZXIub25SZWFkIGV2ZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgS2V5c1JlYWRMb29rdXAgPSAocnVudGltZVN0YWdlSWQ6IHN0cmluZykgPT4gc3RyaW5nW107XG5cbi8vIOKUgOKUgCBTdGFnZWQgb3B0aW1pemF0aW9uOiB3cml0ZXIgbG9va3VwIHN0cmF0ZWdpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogVGhyZXNob2xkIGZvciBzd2l0Y2hpbmcgZnJvbSBsaW5lYXIgc2NhbiB0byByZXZlcnNlIGluZGV4LlxuICogQmVsb3cgdGhpcywgTyhOKSBzY2FuIGlzIGZhc3RlciAobm8gaW5kZXggYnVpbGQgY29zdCkuXG4gKiBBYm92ZSB0aGlzLCBPKGxvZyBOKSBiaW5hcnkgc2VhcmNoIHdpbnMuXG4gKi9cbmNvbnN0IFJFVkVSU0VfSU5ERVhfVEhSRVNIT0xEID0gMjU2O1xuXG4vKipcbiAqIFdyaXRlciBsb29rdXAgZnVuY3Rpb24gc2lnbmF0dXJlLlxuICogUmV0dXJucyB0aGUgQ29tbWl0QnVuZGxlIHRoYXQgbGFzdCB3cm90ZSBga2V5YCBiZWZvcmUgcG9zaXRpb24gYGJlZm9yZUlkeGAuXG4gKi9cbnR5cGUgV3JpdGVyTG9va3VwID0gKGtleTogc3RyaW5nLCBiZWZvcmVJZHg6IG51bWJlcikgPT4gQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkO1xuXG4vKiogU3RyYXRlZ3kgMTogTGluZWFyIHNjYW4g4oCUIE8oTikgcGVyIGxvb2t1cCwgemVybyBzZXR1cCBjb3N0LiAqL1xuZnVuY3Rpb24gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgcmV0dXJuIChrZXksIGJlZm9yZUlkeCkgPT4gZmluZExhc3RXcml0ZXIoY29tbWl0TG9nLCBrZXksIGJlZm9yZUlkeCk7XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgMjogUmV2ZXJzZSBpbmRleCDigJQgTyhOw5dVKSBidWlsZCwgTyhsb2cgTikgcGVyIGxvb2t1cC5cbiAqIEJ1aWxkcyBhIE1hcDxrZXksIHNvcnRlZEluZGljZXNbXT4gd2hlcmUgaW5kaWNlcyBhcmUgY29tbWl0IHBvc2l0aW9uc1xuICogdGhhdCB3cm90ZSB0aGF0IGtleS4gTG9va3VwIHVzZXMgYmluYXJ5IHNlYXJjaCB0byBmaW5kIHRoZSBsYXN0IHdyaXRlclxuICogYmVmb3JlIGEgZ2l2ZW4gcG9zaXRpb24uXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2VJbmRleExvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgLy8gQnVpbGQ6IGtleSDihpIgc29ydGVkIGFycmF5IG9mIGNvbW1pdCBpbmRpY2VzIHRoYXQgd3JvdGUgdGhpcyBrZXlcbiAgY29uc3QgaW5kZXggPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyW10+KCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWl0TG9nLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChjb25zdCB0IG9mIGNvbW1pdExvZ1tpXS50cmFjZSkge1xuICAgICAgbGV0IGFyciA9IGluZGV4LmdldCh0LnBhdGgpO1xuICAgICAgaWYgKCFhcnIpIHtcbiAgICAgICAgYXJyID0gW107XG4gICAgICAgIGluZGV4LnNldCh0LnBhdGgsIGFycik7XG4gICAgICB9XG4gICAgICBhcnIucHVzaChpKTsgLy8gYWxyZWFkeSBzb3J0ZWQgKHdlIGl0ZXJhdGUgaW4gb3JkZXIpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChrZXk6IHN0cmluZywgYmVmb3JlSWR4OiBudW1iZXIpOiBDb21taXRCdW5kbGUgfCB1bmRlZmluZWQgPT4ge1xuICAgIGNvbnN0IGluZGljZXMgPSBpbmRleC5nZXQoa2V5KTtcbiAgICBpZiAoIWluZGljZXMgfHwgaW5kaWNlcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyBCaW5hcnkgc2VhcmNoOiBmaW5kIGxhcmdlc3QgaW5kZXggPCBiZWZvcmVJZHhcbiAgICBsZXQgbG8gPSAwO1xuICAgIGxldCBoaSA9IGluZGljZXMubGVuZ3RoIC0gMTtcbiAgICBsZXQgcmVzdWx0ID0gLTE7XG5cbiAgICB3aGlsZSAobG8gPD0gaGkpIHtcbiAgICAgIGNvbnN0IG1pZCA9IChsbyArIGhpKSA+Pj4gMTtcbiAgICAgIGlmIChpbmRpY2VzW21pZF0gPCBiZWZvcmVJZHgpIHtcbiAgICAgICAgcmVzdWx0ID0gaW5kaWNlc1ttaWRdO1xuICAgICAgICBsbyA9IG1pZCArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoaSA9IG1pZCAtIDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdCA+PSAwID8gY29tbWl0TG9nW3Jlc3VsdF0gOiB1bmRlZmluZWQ7XG4gIH07XG59XG5cbi8qKlxuICogU3RhZ2VkIG9wdGltaXphdGlvbjogcGljayB0aGUgcmlnaHQgd3JpdGVyLWxvb2t1cCBzdHJhdGVneSBiYXNlZCBvbiBkYXRhIHNpemUuXG4gKlxuICogTGlrZSBhIGRhdGFiYXNlIHF1ZXJ5IG9wdGltaXplciBjaG9vc2luZyBiZXR3ZWVuIHNlcXVlbnRpYWwgc2NhbiBhbmQgaW5kZXggc2NhbjpcbiAqXG4gKiAtICoqU21hbGwgbG9nICjiiaQgMjU2KToqKiBMaW5lYXIgc2NhbiB3aW5zLiBaZXJvIHNldHVwIGNvc3QsIGdvb2QgY2FjaGUgbG9jYWxpdHkuXG4gKiAgIFRoZSBvdmVyaGVhZCBvZiBidWlsZGluZyBhIHJldmVyc2UgaW5kZXggaXNuJ3Qgd29ydGggaXQgZm9yIHNob3J0IGxvZ3MuXG4gKlxuICogLSAqKkxhcmdlIGxvZyAoPiAyNTYpOioqIFJldmVyc2UgaW5kZXggd2lucy4gTyhOw5dVKSB1cGZyb250IGJ1aWxkIGNvc3QgaXMgYW1vcnRpemVkXG4gKiAgIGFjcm9zcyBhbGwgQkZTIGhvcHMuIEVhY2ggbG9va3VwIGJlY29tZXMgTyhsb2cgTikgdmlhIGJpbmFyeSBzZWFyY2ggaW5zdGVhZCBvZiBPKE4pLlxuICogICBGb3IgYW4gYWdlbnQgbG9vcCB3aXRoIDUwMCBpdGVyYXRpb25zIGFuZCA1IGtleXMgcGVyIGhvcCwgdGhpcyBpcyA1MDDDlzXDl2xvZyg1MDAp4omIMjJLIG9wc1xuICogICB2cyA1MDDDlzXDlzUwMD0xLjI1TSBvcHMgd2l0aCBsaW5lYXIgc2Nhbi5cbiAqXG4gKiBUaGUgY2FsbGVyIG5ldmVyIHNlZXMgdGhpcyDigJQgYGNhdXNhbENoYWluKClgIHBpY2tzIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVdyaXRlckxvb2t1cChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdKTogV3JpdGVyTG9va3VwIHtcbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPD0gUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQpIHtcbiAgICByZXR1cm4gbGluZWFyU2Nhbkxvb2t1cChjb21taXRMb2cpO1xuICB9XG4gIHJldHVybiByZXZlcnNlSW5kZXhMb29rdXAoY29tbWl0TG9nKTtcbn1cblxuLy8g4pSA4pSAIENvcmUgYWxnb3JpdGhtIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFJGQy0wMDMgRDI6IHRoZSBgaW5jb21wbGV0ZVNvdXJjZXNgIG5vZGUgZnJhZ21lbnQgZm9yIGEgY29tbWl0IOKAlCBge31gXG4gKiB3aGVuIHRoZSBzdGFnZSBjb25zdW1lZCBubyB1bnRyYWNrZWQgcmVhZCBwYXRocywga2VlcGluZyB0aGUgZmllbGRcbiAqIEFCU0VOVCAobm90IGVtcHR5LWFycmF5LXZhbHVlZCkgZm9yIGZ1bGx5LXRyYWNrZWQgc3RhZ2VzLlxuICovXG5mdW5jdGlvbiBpbmNvbXBsZXRlU291cmNlc0ZyYWdtZW50KGNvbW1pdDogQ29tbWl0QnVuZGxlKTogeyBpbmNvbXBsZXRlU291cmNlcz86IFJlYWRvbmx5QXJyYXk8VW50cmFja2VkU291cmNlPiB9IHtcbiAgaWYgKCFjb21taXQudW50cmFja2VkU291cmNlcyB8fCBjb21taXQudW50cmFja2VkU291cmNlcy5sZW5ndGggPT09IDApIHJldHVybiB7fTtcbiAgcmV0dXJuIHsgaW5jb21wbGV0ZVNvdXJjZXM6IGNvbW1pdC51bnRyYWNrZWRTb3VyY2VzIH07XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGNhdXNhbCBEQUcgcm9vdGVkIGF0IGBzdGFydElkYCBieSB3YWxraW5nIGJhY2t3YXJkc1xuICogdGhyb3VnaCByZWFk4oaSd3JpdGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb21taXQgbG9nLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgc2VsZWN0cyB0aGUgb3B0aW1hbCB3cml0ZXIgbG9va3VwIHN0cmF0ZWd5OlxuICogLSBMaW5lYXIgc2NhbiBmb3Igc21hbGwgbG9ncyAo4omkIDI1NiBjb21taXRzKVxuICogLSBSZXZlcnNlIGluZGV4IHdpdGggYmluYXJ5IHNlYXJjaCBmb3IgbGFyZ2UgbG9ncyAoPiAyNTYgY29tbWl0cylcbiAqXG4gKiBQcm9kdWNlcyBhIERBRyAobm90IGEgdHJlZSk6IGlmIHR3byBjaGlsZHJlbiBib3RoIHJlYWQgZnJvbSB0aGUgc2FtZVxuICogcGFyZW50LCB0aGUgcGFyZW50IG5vZGUgaXMgc2hhcmVkIChkZWR1cGVkIGJ5IHJ1bnRpbWVTdGFnZUlkKS5cbiAqXG4gKiBAcGFyYW0gY29tbWl0TG9nICAgT3JkZXJlZCBjb21taXQgYnVuZGxlcyBmcm9tIGV4ZWN1dG9yLmdldFNuYXBzaG90KCkuY29tbWl0TG9nXG4gKiBAcGFyYW0gc3RhcnRJZCAgICAgcnVudGltZVN0YWdlSWQgdG8gc3RhcnQgYmFja3RyYWNraW5nIGZyb21cbiAqIEBwYXJhbSBnZXRLZXlzUmVhZCBDYWxsYmFjayByZXR1cm5pbmcga2V5cyByZWFkIGJ5IGEgZ2l2ZW4gZXhlY3V0aW9uIHN0ZXBcbiAqIEBwYXJhbSBvcHRpb25zICAgICBEZXB0aCBhbmQgbm9kZSBsaW1pdHNcbiAqIEByZXR1cm5zIFJvb3QgQ2F1c2FsTm9kZSB3aXRoIC5wYXJlbnRzIGZvcm1pbmcgdGhlIERBRywgb3IgdW5kZWZpbmVkIGlmIHN0YXJ0SWQgbm90IGZvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXVzYWxDaGFpbihcbiAgY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSxcbiAgc3RhcnRJZDogc3RyaW5nLFxuICBnZXRLZXlzUmVhZDogS2V5c1JlYWRMb29rdXAsXG4gIG9wdGlvbnM/OiBDYXVzYWxDaGFpbk9wdGlvbnMsXG4pOiBDYXVzYWxOb2RlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF4RGVwdGggPSBvcHRpb25zPy5tYXhEZXB0aCA/PyAyMDtcbiAgY29uc3QgbWF4Tm9kZXMgPSBvcHRpb25zPy5tYXhOb2RlcyA/PyAxMDA7XG4gIGNvbnN0IGNvbnRyb2xEZXBzID0gb3B0aW9ucz8uY29udHJvbERlcHM7XG4gIGNvbnN0IHdlaWdoID0gb3B0aW9ucz8ud2VpZ2g7XG4gIGNvbnN0IHBlcldyaXRlID0gb3B0aW9ucz8uZWRnZUF0dHJpYnV0aW9uID09PSAncGVyLXdyaXRlJztcblxuICAvLyBSRkMtMDAzIEQ0IOKAlCB0cnVuY2F0aW9uIHZpc2liaWxpdHkuIFNldCBvbmx5IHdoZW4gYSBsaW1pdCBhY3R1YWxseVxuICAvLyBjdXRzIHRoZSBzbGljZTsgc3VyZmFjZWQgb24gdGhlIHJvb3QgYXMgYHRydW5jYXRlZGAgc28gYSBjb25zdW1lciBjYW5cbiAgLy8gbmV2ZXIgbWlzdGFrZSBhIHRydW5jYXRlZCBzbGljZSBmb3IgYSBjb21wbGV0ZSBvbmUuXG4gIGxldCB0cnVuY2F0ZWRCeURlcHRoID0gZmFsc2U7XG4gIGxldCB0cnVuY2F0ZWRCeU5vZGVzID0gZmFsc2U7XG5cbiAgLy8gQnVpbGQgcG9zaXRpb24gaW5kZXg6IHJ1bnRpbWVTdGFnZUlkIOKGkiBhcnJheSBwb3NpdGlvbiAoTyhuKSBvbmNlKVxuICBjb25zdCBpZHhNYXAgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1pdExvZy5sZW5ndGg7IGkrKykge1xuICAgIGlkeE1hcC5zZXQoY29tbWl0TG9nW2ldLnJ1bnRpbWVTdGFnZUlkLCBpKTtcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0SWR4ID0gaWR4TWFwLmdldChzdGFydElkKTtcbiAgaWYgKHN0YXJ0SWR4ID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3RhcnRDb21taXQgPSBjb21taXRMb2dbc3RhcnRJZHhdO1xuXG4gIC8vIFBpY2sgd3JpdGVyIGxvb2t1cCBzdHJhdGVneSBiYXNlZCBvbiBsb2cgc2l6ZVxuICBjb25zdCBmaW5kV3JpdGVyID0gY3JlYXRlV3JpdGVyTG9va3VwKGNvbW1pdExvZyk7XG5cbiAgLy8gTm9kZSBkZWR1cCBtYXA6IHJ1bnRpbWVTdGFnZUlkIOKGkiBDYXVzYWxOb2RlIChlbnN1cmVzIERBRywgbm90IHRyZWUpXG4gIGNvbnN0IG5vZGVNYXAgPSBuZXcgTWFwPHN0cmluZywgQ2F1c2FsTm9kZT4oKTtcblxuICBjb25zdCByb290OiBDYXVzYWxOb2RlID0ge1xuICAgIHJ1bnRpbWVTdGFnZUlkOiBzdGFydElkLFxuICAgIHN0YWdlSWQ6IHN0YXJ0Q29tbWl0LnN0YWdlSWQsXG4gICAgc3RhZ2VOYW1lOiBzdGFydENvbW1pdC5zdGFnZSxcbiAgICBrZXlzV3JpdHRlbjogc3RhcnRDb21taXQudHJhY2UubWFwKCh0KSA9PiB0LnBhdGgpLFxuICAgIGxpbmtlZEJ5OiAnJyxcbiAgICBkZXB0aDogMCxcbiAgICBwYXJlbnRzOiBbXSxcbiAgICBwYXJlbnRFZGdlczogW10sXG4gICAgLi4uaW5jb21wbGV0ZVNvdXJjZXNGcmFnbWVudChzdGFydENvbW1pdCksXG4gIH07XG4gIG5vZGVNYXAuc2V0KHN0YXJ0SWQsIHJvb3QpO1xuXG4gIC8vIOKUgOKUgCAjUDEgcGVyLXdyaXRlIGF0dHJpYnV0aW9uIG1hY2hpbmVyeSAoaW5lcnQgdW5kZXIgJ3N0YWdlJykg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIGV4cGFuZGVkUmVhZHM6IHBlciBub2RlLCB0aGUgcmVhZHMgYWxyZWFkeSBxdWV1ZWQgZm9yIGV4cGFuc2lvbiDigJQgbGF0ZVxuICAvLyBsaW5rcyB2aWEgYWRkaXRpb25hbCBrZXlzIHJlLWVucXVldWUgb25seSB0aGUgREVMVEEsIHNvIHRoZSBzbGljZSBncm93c1xuICAvLyBtb25vdG9uaWNhbGx5IHRvd2FyZCB0aGUgc3RhZ2UtbGV2ZWwgY2VpbGluZyBhbmQgdGVybWluYXRlcyAoZWFjaCBrZXlcbiAgLy8gZXhwYW5kcyBhdCBtb3N0IG9uY2UgcGVyIG5vZGUpLiBmdWxseUV4cGFuZGVkOiBub2RlcyB0aGF0IGZlbGwgYmFjayB0b1xuICAvLyBzdGFnZSBsZXZlbCAobm8gcmVhZEtleXMgb24gYSBsaW5raW5nIGVudHJ5KSDigJQgbm90aGluZyBsZWZ0IHRvIGFkZC5cbiAgY29uc3QgZXhwYW5kZWRSZWFkcyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgY29uc3QgZnVsbHlFeHBhbmRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgbm9kZSdzIGV4cGFuc2lvbiByZWFkLXNldCBmb3IgdGhlIGdpdmVuIGxpbmtpbmcgV1JJVFRFTiBrZXlzLlxuICAgKiBQZXItd3JpdGUgbW9kZSB3aXRoIHByb3ZlbmFuY2UgcHJlc2VudCDihpIgdW5pb24gb2YgdGhlIGxpbmtpbmcgd3JpdGVzJ1xuICAgKiB0ZW1wb3JhbC1wcmVmaXggYHJlYWRLZXlzYC4gQW55IGxpbmtpbmcgZW50cnkgV0lUSE9VVCBgcmVhZEtleXNgIChvciBub1xuICAgKiBsaW5rS2V5cyBhdCBhbGwpIOKGkiBob25lc3Qgc3RhZ2UtbGV2ZWwgZmFsbGJhY2ssIGZsYWdnZWQgdmlhIHRoZSBzZWNvbmRcbiAgICogdHVwbGUgbWVtYmVyIHNvIHRoZSBjYWxsZXIgbWFya3MgdGhlIG5vZGUgZnVsbHkgZXhwYW5kZWQuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkc0ZvckxpbmtzKGNvbW1pdDogQ29tbWl0QnVuZGxlLCBsaW5rS2V5czogc3RyaW5nW10gfCB1bmRlZmluZWQpOiBbc3RyaW5nW10sIGJvb2xlYW5dIHtcbiAgICBpZiAoIXBlcldyaXRlIHx8ICFsaW5rS2V5cyB8fCBsaW5rS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbZ2V0S2V5c1JlYWQoY29tbWl0LnJ1bnRpbWVTdGFnZUlkKSwgdHJ1ZV07XG4gICAgfVxuICAgIGNvbnN0IHVuaW9uID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBsaW5rS2V5IG9mIGxpbmtLZXlzKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGNvbW1pdC50cmFjZS5maW5kKCh0KSA9PiB0LnBhdGggPT09IGxpbmtLZXkpO1xuICAgICAgaWYgKCFlbnRyeSB8fCBlbnRyeS5yZWFkS2V5cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIE1peGVkL2RpYWwtb2ZmIGxvZyDigJQgZGVncmFkZSBUSElTIG5vZGUgdG8gc3RhZ2UgbGV2ZWwsIGhvbmVzdGx5LlxuICAgICAgICByZXR1cm4gW2dldEtleXNSZWFkKGNvbW1pdC5ydW50aW1lU3RhZ2VJZCksIHRydWVdO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCByayBvZiBlbnRyeS5yZWFkS2V5cykgdW5pb24uYWRkKHJrKTtcbiAgICB9XG4gICAgcmV0dXJuIFtbLi4udW5pb25dLCBmYWxzZV07XG4gIH1cblxuICAvLyBCRlMvd29ya2xpc3QgcXVldWU6IFtub2RlLCBjb21taXRJZHgsIGRlcHRoLCBrZXlzVG9FeHBhbmRdXG4gIGNvbnN0IFtyb290UmVhZHMsIHJvb3RJc0Z1bGxdID0gcGVyV3JpdGVcbiAgICA/IHJlYWRzRm9yTGlua3Moc3RhcnRDb21taXQsIG9wdGlvbnM/LnJvb3RMaW5rS2V5cylcbiAgICA6IFtnZXRLZXlzUmVhZChzdGFydElkKSwgdHJ1ZV07XG4gIGV4cGFuZGVkUmVhZHMuc2V0KHN0YXJ0SWQsIG5ldyBTZXQocm9vdFJlYWRzKSk7XG4gIGlmIChyb290SXNGdWxsKSBmdWxseUV4cGFuZGVkLmFkZChzdGFydElkKTtcbiAgY29uc3QgcXVldWU6IEFycmF5PFtDYXVzYWxOb2RlLCBudW1iZXIsIG51bWJlciwgc3RyaW5nW11dPiA9IFtbcm9vdCwgc3RhcnRJZHgsIDAsIHJvb3RSZWFkc11dO1xuICBsZXQgdmlzaXRlZCA9IDE7XG5cbiAgLyoqXG4gICAqIExpbmsgYG5vZGUg4oaSIHBhcmVudGAgKGNyZWF0aW5nICsgZW5xdWV1ZWluZyB0aGUgcGFyZW50IHdoZW4gbmV3KS5cbiAgICogU2hhcmVkIGJ5IGRhdGEtZWRnZSBleHBhbnNpb24gKHJlYWTihpJ3cml0ZSkgYW5kIGNvbnRyb2wtZWRnZSBleHBhbnNpb25cbiAgICogKEQzKS4gT25lIENhdXNhbEVkZ2UgcGVyIGRpc3RpbmN0IChwYXJlbnQsIGtpbmQsIGtleSkgbGluazsgYHBhcmVudHNgXG4gICAqIGtlZXBzIGl0cyBoaXN0b3JpY2FsIG9uZS1lbnRyeS1wZXItcGFyZW50IGRlZHVwLlxuICAgKi9cbiAgZnVuY3Rpb24gbGlua1BhcmVudChcbiAgICBub2RlOiBDYXVzYWxOb2RlLFxuICAgIHBhcmVudENvbW1pdDogQ29tbWl0QnVuZGxlLFxuICAgIGtpbmQ6ICdkYXRhJyB8ICdjb250cm9sJyxcbiAgICBrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBkZXB0aDogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRJZCA9IHBhcmVudENvbW1pdC5ydW50aW1lU3RhZ2VJZDtcbiAgICAvLyAjUDE6IHRoZSBwYXJlbnQncyBleHBhbnNpb24gcmVhZHMsIHJlc29sdmVkIExBWklMWSAob25seSBmb3IgbmV3IG5vZGVzXG4gICAgLy8gb3IgcGVyLXdyaXRlIHJlLWV4cGFuc2lvbiDigJQgZHVwbGljYXRlIGxpbmtzIHVuZGVyICdzdGFnZScgcGF5IG5vdGhpbmcpLlxuICAgIC8vIERhdGEgbGlua3MgZXhwYW5kIHRocm91Z2ggdGhlIHJlYWRzIHRoYXQgZmVkIHRoZSBwYXJlbnQncyB3cml0ZSBvZlxuICAgIC8vIGBrZXlgOyBjb250cm9sIGxpbmtzIGV4cGFuZCB0aGUgZGVjaWRlciBhdCBzdGFnZSBsZXZlbCAoYSBkZWNpc2lvblxuICAgIC8vIGRlcGVuZHMgb24gZXZlcnl0aGluZyBpdCByZWFkKS5cbiAgICBjb25zdCByZXNvbHZlTGlua1JlYWRzID0gKCk6IFtzdHJpbmdbXSwgYm9vbGVhbl0gPT5cbiAgICAgIGtpbmQgPT09ICdkYXRhJ1xuICAgICAgICA/IHJlYWRzRm9yTGlua3MocGFyZW50Q29tbWl0LCBrZXkgIT09IHVuZGVmaW5lZCA/IFtrZXldIDogdW5kZWZpbmVkKVxuICAgICAgICA6IFtnZXRLZXlzUmVhZChwYXJlbnRJZCksIHRydWVdO1xuXG4gICAgbGV0IHBhcmVudE5vZGUgPSBub2RlTWFwLmdldChwYXJlbnRJZCk7XG4gICAgaWYgKCFwYXJlbnROb2RlKSB7XG4gICAgICAvLyBOZXcgbm9kZSDigJQgY3JlYXRlIGFuZCBlbnF1ZXVlIChyZXNwZWN0aW5nIHRoZSBub2RlIGJ1ZGdldClcbiAgICAgIGlmICh2aXNpdGVkID49IG1heE5vZGVzKSB7XG4gICAgICAgIHRydW5jYXRlZEJ5Tm9kZXMgPSB0cnVlOyAvLyBENDogYSBkaXNjb3ZlcmVkIHBhcmVudCB3YXMgZHJvcHBlZFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudElkeCA9IGlkeE1hcC5nZXQocGFyZW50SWQpO1xuICAgICAgaWYgKHBhcmVudElkeCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIHBhcmVudE5vZGUgPSB7XG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiBwYXJlbnRJZCxcbiAgICAgICAgc3RhZ2VJZDogcGFyZW50Q29tbWl0LnN0YWdlSWQsXG4gICAgICAgIHN0YWdlTmFtZTogcGFyZW50Q29tbWl0LnN0YWdlLFxuICAgICAgICBrZXlzV3JpdHRlbjogcGFyZW50Q29tbWl0LnRyYWNlLm1hcCgodCkgPT4gdC5wYXRoKSxcbiAgICAgICAgLy8gbGlua2VkQnkgc3RheXMgYSBEQVRBLWtleSBjb25jZXB0IChiYWNrLWNvbXBhdCkg4oCUIGNvbnRyb2wtbGlua2VkXG4gICAgICAgIC8vIG5vZGVzIGNhcnJ5IHRoZWlyIGxhYmVsIG9uIHRoZSBlZGdlIGluc3RlYWQuXG4gICAgICAgIGxpbmtlZEJ5OiBraW5kID09PSAnZGF0YScgPyBrZXkgPz8gJycgOiAnJyxcbiAgICAgICAgZGVwdGg6IGRlcHRoICsgMSxcbiAgICAgICAgcGFyZW50czogW10sXG4gICAgICAgIHBhcmVudEVkZ2VzOiBbXSxcbiAgICAgICAgLi4uaW5jb21wbGV0ZVNvdXJjZXNGcmFnbWVudChwYXJlbnRDb21taXQpLFxuICAgICAgfTtcbiAgICAgIG5vZGVNYXAuc2V0KHBhcmVudElkLCBwYXJlbnROb2RlKTtcbiAgICAgIHZpc2l0ZWQrKztcbiAgICAgIGNvbnN0IFtsaW5rUmVhZHMsIGxpbmtJc0Z1bGxdID0gcmVzb2x2ZUxpbmtSZWFkcygpO1xuICAgICAgZXhwYW5kZWRSZWFkcy5zZXQocGFyZW50SWQsIG5ldyBTZXQobGlua1JlYWRzKSk7XG4gICAgICBpZiAobGlua0lzRnVsbCkgZnVsbHlFeHBhbmRlZC5hZGQocGFyZW50SWQpO1xuICAgICAgcXVldWUucHVzaChbcGFyZW50Tm9kZSwgcGFyZW50SWR4LCBkZXB0aCArIDEsIGxpbmtSZWFkc10pO1xuICAgIH0gZWxzZSBpZiAocGVyV3JpdGUgJiYgIWZ1bGx5RXhwYW5kZWQuaGFzKHBhcmVudElkKSkge1xuICAgICAgLy8gI1AxIHdvcmtsaXN0OiBhbiBFWElTVElORyBub2RlIGxpbmtlZCB2aWEgYW5vdGhlciBrZXkgbWF5IG93ZSBtb3JlXG4gICAgICAvLyBleHBhbnNpb24g4oCUIGVucXVldWUgb25seSB0aGUgcmVhZHMgbm90IHlldCBleHBhbmRlZCAobW9ub3RvbmU7IHRoZVxuICAgICAgLy8gbm9kZSBidWRnZXQgaXMgdW50b3VjaGVkLCBubyBub2RlIGlzIGNyZWF0ZWQpLiBSZS1leHBhbnNpb24ga2VlcHNcbiAgICAgIC8vIHRoZSBub2RlJ3MgT1JJR0lOQUwgZGVwdGggc28gaXRzIHBhcmVudHMgZ2V0IGEgY29uc2lzdGVudCBkZXB0aCsxLlxuICAgICAgY29uc3QgW2xpbmtSZWFkcywgbGlua0lzRnVsbF0gPSByZXNvbHZlTGlua1JlYWRzKCk7XG4gICAgICBjb25zdCBleHBhbmRlZCA9IGV4cGFuZGVkUmVhZHMuZ2V0KHBhcmVudElkKSE7XG4gICAgICBjb25zdCBkZWx0YSA9IGxpbmtSZWFkcy5maWx0ZXIoKGspID0+ICFleHBhbmRlZC5oYXMoaykpO1xuICAgICAgaWYgKGxpbmtJc0Z1bGwpIGZ1bGx5RXhwYW5kZWQuYWRkKHBhcmVudElkKTtcbiAgICAgIGlmIChkZWx0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgayBvZiBkZWx0YSkgZXhwYW5kZWQuYWRkKGspO1xuICAgICAgICBjb25zdCBwYXJlbnRJZHggPSBpZHhNYXAuZ2V0KHBhcmVudElkKTtcbiAgICAgICAgaWYgKHBhcmVudElkeCAhPT0gdW5kZWZpbmVkKSBxdWV1ZS5wdXNoKFtwYXJlbnROb2RlLCBwYXJlbnRJZHgsIHBhcmVudE5vZGUuZGVwdGgsIGRlbHRhXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gREFHIG1lcmdlOiBvbmUgcGFyZW50c1tdIGVudHJ5IHBlciBkaXN0aW5jdCBwYXJlbnQgKGhpc3RvcmljYWwgc2hhcGUpXG4gICAgaWYgKCFub2RlLnBhcmVudHMuc29tZSgocCkgPT4gcC5ydW50aW1lU3RhZ2VJZCA9PT0gcGFyZW50SWQpKSB7XG4gICAgICBub2RlLnBhcmVudHMucHVzaChwYXJlbnROb2RlKTtcbiAgICB9XG4gICAgLy8gT25lIGVkZ2UgcGVyIGRpc3RpbmN0IChwYXJlbnQsIGtpbmQsIGtleSkgbGluay4gVGhlIHdlaWdoZXIgKEQ0KVxuICAgIC8vIHN0YW1wcyB0aGUgd2VpZ2h0IGF0IGNyZWF0aW9uOyBgdW5kZWZpbmVkYCDihpIgMS4wIOKAlCB0aGUgZW5naW5lIG5ldmVyXG4gICAgLy8gY29tcHV0ZXMgd2VpZ2h0cyBpdHNlbGYuXG4gICAgaWYgKCFub2RlLnBhcmVudEVkZ2VzLnNvbWUoKGUpID0+IGUucGFyZW50LnJ1bnRpbWVTdGFnZUlkID09PSBwYXJlbnRJZCAmJiBlLmtpbmQgPT09IGtpbmQgJiYgZS5rZXkgPT09IGtleSkpIHtcbiAgICAgIC8vIEVycm9yIGlzb2xhdGlvbiAocmV2aWV3IGZpbmRpbmcpOiBhIGNvbnN1bWVyIHdlaWdoZXIgdGhhdCB0aHJvd3NcbiAgICAgIC8vIG11c3QgZGVncmFkZSB0byB0aGUgZGVmYXVsdCB3ZWlnaHQsIG5ldmVyIGNyYXNoIHRoZSBzbGljZSDigJQgdGhlXG4gICAgICAvLyBzYW1lIGNvbnRyYWN0IGV2ZXJ5IG90aGVyIGNvbnN1bWVyIGNhbGxiYWNrIGluIHRoZSBsaWJyYXJ5IGdldHMuXG4gICAgICBsZXQgd2VpZ2h0ID0gMS4wO1xuICAgICAgaWYgKHdlaWdoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgd2VpZ2h0ID0gd2VpZ2gobm9kZSwgcGFyZW50Tm9kZSwga2V5LCBraW5kKSA/PyAxLjA7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8qIHdlaWdoZXIgdGhyZXcg4oCUIGtlZXAgMS4wLCB0aGUgc2xpY2Ugc3RheXMgdXNhYmxlICovXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5vZGUucGFyZW50RWRnZXMucHVzaCh7IHBhcmVudDogcGFyZW50Tm9kZSwga2luZCwga2V5LCB3ZWlnaHQgfSk7XG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBbbm9kZSwgY29tbWl0SWR4LCBkZXB0aCwga2V5c1RvRXhwYW5kXSA9IHF1ZXVlLnNoaWZ0KCkhO1xuXG4gICAgaWYgKGRlcHRoID49IG1heERlcHRoKSB7XG4gICAgICAvLyBENDogb25seSBhIG5vZGUgdGhhdCBzdGlsbCBIQUQgc29tZXRoaW5nIHRvIGV4cGFuZCBjb3VudHMgYXMgYSBjdXRcbiAgICAgIC8vIChhIGxlYWYgYXQgdGhlIGhvcml6b24gdHJ1bmNhdGVzIG5vdGhpbmcpLlxuICAgICAgaWYgKGtleXNUb0V4cGFuZC5sZW5ndGggPiAwIHx8IGNvbnRyb2xEZXBzPy4obm9kZS5ydW50aW1lU3RhZ2VJZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0cnVuY2F0ZWRCeURlcHRoID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIERhdGEgZWRnZXM6IGZvciBlYWNoIGtleSBpbiB0aGlzIGV4cGFuc2lvbidzIHJlYWQtc2V0LCBmaW5kIHdobyB3cm90ZVxuICAgIC8vIGl0LiBVbmRlciAnc3RhZ2UnIHRoaXMgaXMgdGhlIG5vZGUncyBmdWxsIHJlYWQtc2V0IChoaXN0b3JpY2FsXG4gICAgLy8gYmVoYXZpb3IpOyB1bmRlciAncGVyLXdyaXRlJyBpdCBpcyB0aGUgbGlua2luZyB3cml0ZXMnIHRlbXBvcmFsIHByZWZpeFxuICAgIC8vIChvciBhIHdvcmtsaXN0IGRlbHRhIG9uIHJlLWV4cGFuc2lvbikuXG4gICAgY29uc3Qga2V5c1JlYWQgPSBrZXlzVG9FeHBhbmQ7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5c1JlYWQpIHtcbiAgICAgIGNvbnN0IHdyaXRlciA9IGZpbmRXcml0ZXIoa2V5LCBjb21taXRJZHgpO1xuICAgICAgaWYgKCF3cml0ZXIpIGNvbnRpbnVlO1xuICAgICAgbGlua1BhcmVudChub2RlLCB3cml0ZXIsICdkYXRhJywga2V5LCBkZXB0aCk7XG4gICAgfVxuXG4gICAgLy8gQ29udHJvbCBlZGdlIChSRkMtMDAzIEQzKTogbGluayB0aGUgZ292ZXJuaW5nIGRlY2lkZXIsIGxhYmVsZWQgYnkgdGhlXG4gICAgLy8gZGVjaWRlKCkgcnVsZSBsYWJlbCB3aGVuIHByZXNlbnQuIFRoZSBkZWNpZGVyIG5vZGUgdGhlbiBleHBhbmRzXG4gICAgLy8gbm9ybWFsbHkgdGhyb3VnaCBpdHMgb3duIGRhdGEgcmVhZHMgKGFuZCBpdHMgb3duIGNvbnRyb2wgcGFyZW50KS5cbiAgICBpZiAoY29udHJvbERlcHMpIHtcbiAgICAgIGNvbnN0IGRlcCA9IGNvbnRyb2xEZXBzKG5vZGUucnVudGltZVN0YWdlSWQpO1xuICAgICAgaWYgKGRlcCkge1xuICAgICAgICBjb25zdCBkZWNpZGVySWR4ID0gaWR4TWFwLmdldChkZXAuZGVjaWRlcklkKTtcbiAgICAgICAgaWYgKGRlY2lkZXJJZHggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxpbmtQYXJlbnQobm9kZSwgY29tbWl0TG9nW2RlY2lkZXJJZHhdLCAnY29udHJvbCcsIGRlcC5sYWJlbCwgZGVwdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUkZDLTAwMyBENCDigJQgdHJ1bmNhdGlvbiB2aXNpYmlsaXR5IG9uIHRoZSByb290IChhYnNlbnQgd2hlbiBjb21wbGV0ZSkuXG4gIGlmICh0cnVuY2F0ZWRCeURlcHRoIHx8IHRydW5jYXRlZEJ5Tm9kZXMpIHtcbiAgICByb290LnRydW5jYXRlZCA9IHsgYnlEZXB0aDogdHJ1bmNhdGVkQnlEZXB0aCwgYnlOb2RlczogdHJ1bmNhdGVkQnlOb2RlcyB9O1xuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtmb290cHJpbnRdIGNhdXNhbENoYWluKCcke3N0YXJ0SWR9JykgdHJ1bmNhdGVkIGJ5IGAgK1xuICAgICAgICAgIGAke1t0cnVuY2F0ZWRCeURlcHRoICYmIGBtYXhEZXB0aCAoJHttYXhEZXB0aH0pYCwgdHJ1bmNhdGVkQnlOb2RlcyAmJiBgbWF4Tm9kZXMgKCR7bWF4Tm9kZXN9KWBdXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuam9pbignICsgJyl9IOKAlCB0aGUgc2xpY2UgaXMgaW5jb21wbGV0ZS4gUmFpc2UgdGhlIGxpbWl0cyBvciBuYXJyb3cga2V5c1JlYWQuYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJvb3Q7XG59XG5cbi8vIOKUgOKUgCBVdGlsaXRpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogRmxhdHRlbiB0aGUgY2F1c2FsIERBRyBpbnRvIGEgQkZTLW9yZGVyZWQgbGlzdCBvZiBub2Rlcy5cbiAqIEVhY2ggbm9kZSBhcHBlYXJzIGV4YWN0bHkgb25jZSAoZmlyc3Qgb2NjdXJyZW5jZSBieSBCRlMgb3JkZXIpLlxuICogVXNlZnVsIGZvciBsaW5lYXIgZGlzcGxheSBvciBpdGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuQ2F1c2FsREFHKHJvb3Q6IENhdXNhbE5vZGUpOiBDYXVzYWxOb2RlW10ge1xuICBjb25zdCByZXN1bHQ6IENhdXNhbE5vZGVbXSA9IFtdO1xuICBjb25zdCB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHF1ZXVlOiBDYXVzYWxOb2RlW10gPSBbcm9vdF07XG5cbiAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gcXVldWUuc2hpZnQoKSE7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSBjb250aW51ZTtcbiAgICB2aXNpdGVkLmFkZChub2RlLnJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXN1bHQucHVzaChub2RlKTtcblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgaWYgKCF2aXNpdGVkLmhhcyhwYXJlbnQucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICAgIHF1ZXVlLnB1c2gocGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIGNhdXNhbCBEQUcgYXMgaHVtYW4tcmVhZGFibGUgaW5kZW50ZWQgdGV4dC5cbiAqIFNob3dzIHRoZSBkZXBlbmRlbmN5IGNoYWluIHdpdGggZGVwdGggaW5kZW50YXRpb24gYW5kIGxpbmtlZC1ieSBrZXlzLlxuICpcbiAqIFJGQy0wMDMgRDI6IG5vZGVzIHRoYXQgY29uc3VtZWQgdW50cmFja2VkIHJlYWQgcGF0aHMgcmVuZGVyIGFuIGV4dHJhXG4gKiBg4pqgIGFsc28gY29uc3VtZWQg4oCmIOKAlCBzbGljZSBtYXkgYmUgaW5jb21wbGV0ZSBoZXJlYCBsaW5lLCBzbyBhIGNvbnN1bWVyXG4gKiAoaHVtYW4gb3IgTExNKSBkZWJ1Z2dpbmcgZnJvbSB0aGUgc2xpY2UgaXMgVE9MRCB3aGVuIGl0IGlzIGluY29tcGxldGUuXG4gKlxuICogUkZDLTAwMyBEMzogY29udHJvbCBlZGdlcyByZW5kZXIgYXMgYOKGkCBbY29udHJvbDogPHJ1bGUgbGFiZWw+XWBcbiAqIChsYWJlbCBvbWl0dGVkIHdoZW4gdGhlIGRlY2lzaW9uIGNhcnJpZWQgbm9uZSkuIERhdGEgcmVuZGVyaW5nIGlzXG4gKiBieXRlLWlkZW50aWNhbCB0byB0aGUgcHJlLUQzIG91dHB1dCDigJQgYOKGkCB2aWEgPGtleT5gIGZyb20gdGhlIG5vZGUnc1xuICogZGlzY292ZXJ5LXRpbWUgYGxpbmtlZEJ5YC5cbiAqXG4gKiBSRkMtMDAzIEQ0OiBlZGdlIHdlaWdodHMgZnJvbSB0aGUgYHdlaWdoYCBob29rIHJlbmRlciBhcyBhIHN1ZmZpeCDigJRcbiAqIGDihpAgdmlhIHN5c3RlbVByb21wdCAoMC4xOClgIOKAlCBvbmx5IHdoZW4g4omgIDEuMCwgc28gdW53ZWlnaHRlZCBvdXRwdXQgaXNcbiAqIHVuY2hhbmdlZC4gQSB0cnVuY2F0ZWQgc2xpY2UgKHJvb3QudHJ1bmNhdGVkKSBhcHBlbmRzIGEgZmluYWxcbiAqIGDimqAgc2xpY2UgdHJ1bmNhdGVkIOKApmAgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENhdXNhbENoYWluKHJvb3Q6IENhdXNhbE5vZGUpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IHdlaWdodFN1ZmZpeCA9IChlZGdlOiBDYXVzYWxFZGdlIHwgdW5kZWZpbmVkKTogc3RyaW5nID0+XG4gICAgZWRnZSAhPT0gdW5kZWZpbmVkICYmIGVkZ2Uud2VpZ2h0ICE9PSAxID8gYCAoJHtlZGdlLndlaWdodH0pYCA6ICcnO1xuXG4gIGZ1bmN0aW9uIHdhbGsobm9kZTogQ2F1c2FsTm9kZSwgaW5kZW50OiBudW1iZXIsIGVkZ2VzRnJvbUNoaWxkPzogQ2F1c2FsRWRnZVtdKTogdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUucnVudGltZVN0YWdlSWQpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl94oazICR7bm9kZS5ydW50aW1lU3RhZ2VJZH0gKHNlZSBhYm92ZSlgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmlzaXRlZC5hZGQobm9kZS5ydW50aW1lU3RhZ2VJZCk7XG5cbiAgICBjb25zdCBsaW5rUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5vZGUubGlua2VkQnkpIHtcbiAgICAgIGNvbnN0IGRhdGFFZGdlID0gZWRnZXNGcm9tQ2hpbGQ/LmZpbmQoKGUpID0+IGUua2luZCA9PT0gJ2RhdGEnKTtcbiAgICAgIGxpbmtQYXJ0cy5wdXNoKGB2aWEgJHtub2RlLmxpbmtlZEJ5fSR7d2VpZ2h0U3VmZml4KGRhdGFFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29udHJvbEVkZ2UgPSBlZGdlc0Zyb21DaGlsZD8uZmluZCgoZSkgPT4gZS5raW5kID09PSAnY29udHJvbCcpO1xuICAgIGlmIChjb250cm9sRWRnZSkge1xuICAgICAgbGlua1BhcnRzLnB1c2goYFtjb250cm9sJHtjb250cm9sRWRnZS5rZXkgPyBgOiAke2NvbnRyb2xFZGdlLmtleX1gIDogJyd9XSR7d2VpZ2h0U3VmZml4KGNvbnRyb2xFZGdlKX1gKTtcbiAgICB9XG4gICAgY29uc3QgbGluayA9IGxpbmtQYXJ0cy5sZW5ndGggPiAwID8gYCDihpAgJHtsaW5rUGFydHMuam9pbignIOKGkCAnKX1gIDogJyc7XG5cbiAgICBjb25zdCB3cml0ZXMgPSBub2RlLmtleXNXcml0dGVuLmxlbmd0aCA+IDAgPyBgIFt3cm90ZTogJHtub2RlLmtleXNXcml0dGVuLmpvaW4oJywgJyl9XWAgOiAnJztcbiAgICBsaW5lcy5wdXNoKGAkeycgICcucmVwZWF0KGluZGVudCl9JHtub2RlLnN0YWdlTmFtZX0gKCR7bm9kZS5ydW50aW1lU3RhZ2VJZH0pJHtsaW5rfSR7d3JpdGVzfWApO1xuXG4gICAgaWYgKG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMgJiYgbm9kZS5pbmNvbXBsZXRlU291cmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBsaW5lcy5wdXNoKFxuICAgICAgICBgJHsnICAnLnJlcGVhdChpbmRlbnQgKyAxKX3imqAgYWxzbyBjb25zdW1lZCAke25vZGUuaW5jb21wbGV0ZVNvdXJjZXMuam9pbignLycpfSDigJQgc2xpY2UgbWF5IGJlIGluY29tcGxldGUgaGVyZWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGFyZW50IG9mIG5vZGUucGFyZW50cykge1xuICAgICAgd2FsayhcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBpbmRlbnQgKyAxLFxuICAgICAgICBub2RlLnBhcmVudEVkZ2VzLmZpbHRlcigoZSkgPT4gZS5wYXJlbnQgPT09IHBhcmVudCksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHdhbGsocm9vdCwgMCk7XG5cbiAgaWYgKHJvb3QudHJ1bmNhdGVkKSB7XG4gICAgY29uc3QgY2F1c2VzID0gW3Jvb3QudHJ1bmNhdGVkLmJ5RGVwdGggJiYgJ21heERlcHRoIHJlYWNoZWQnLCByb290LnRydW5jYXRlZC5ieU5vZGVzICYmICdtYXhOb2RlcyByZWFjaGVkJ11cbiAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgIC5qb2luKCcsICcpO1xuICAgIGxpbmVzLnB1c2goYOKaoCBzbGljZSB0cnVuY2F0ZWQgKCR7Y2F1c2VzfSkg4oCUIG9sZGVyIGNhdXNlcyBleGlzdCBiZXlvbmQgdGhpcyBob3Jpem9uYCk7XG4gIH1cblxuICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XG59XG5cbi8vIOKUgOKUgCBFeHBvcnRlZCBmb3IgdGVzdGluZyAoaW50ZXJuYWwpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQGludGVybmFsIEV4cG9zZWQgZm9yIHRlc3RpbmcgdGhlIHN0cmF0ZWd5IHNlbGVjdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBfUkVWRVJTRV9JTkRFWF9USFJFU0hPTEQgPSBSRVZFUlNFX0lOREVYX1RIUkVTSE9MRDtcbiJdfQ==
@@ -5,12 +5,24 @@
5
5
  * These helpers provide type-safe queries without (b: any) casts.
6
6
  */
7
7
  import type { CommitBundle } from './types.js';
8
+ import { type Touch } from './verbs.js';
8
9
  /** Find the first commit by stageId, optionally filtering by a written key. */
9
10
  export declare function findCommit(commitLog: CommitBundle[], stageId: string, key?: string): CommitBundle | undefined;
10
11
  /** Find all commits by stageId. */
11
12
  export declare function findCommits(commitLog: CommitBundle[], stageId: string): CommitBundle[];
12
13
  /** Find the last commit that wrote a specific key (for backtracking). */
13
14
  export declare function findLastWriter(commitLog: CommitBundle[], key: string, beforeIdx?: number): CommitBundle | undefined;
15
+ /**
16
+ * Every row on `key` in `commitLog[0..end]`, in commit order — the touches a
17
+ * per-path fold ({@link foldKey}) runs over. `key` is matched against
18
+ * `TraceEntry.path` exactly (DELIM-joined for nested paths). A row whose verb
19
+ * is not one of the four is refused with {@link UnknownVerbError} naming the
20
+ * row — whether or not the fold would have reached it: the answer must not
21
+ * depend on where an optimisation starts.
22
+ *
23
+ * Internal: `commitValueAt` and `arrayProvenance` are its two readers.
24
+ */
25
+ export declare function keyTouches(commitLog: readonly CommitBundle[], key: string, end: number): Touch[];
14
26
  /**
15
27
  * Reconstruct the FULL value of `key` as of commit array index `idx`
16
28
  * (inclusive) — the migration helper for the "read `bundle.overwrite[key]`
@@ -20,9 +32,12 @@ export declare function findLastWriter(commitLog: CommitBundle[], key: string, b
20
32
  * only the TAIL of the array; this helper folds the verbs back together:
21
33
  * it scans `commitLog[0..idx]` for trace entries on `key`, anchors at the
22
34
  * latest full-value write (`set` — or `delete`, which resets to absent), and
23
- * replays forward (`append` → concat, `merge` → `deepSmartMerge`) — exactly
24
- * the per-key slice of `applySmartMerge`'s replay, O(key's commit span)
25
- * instead of a full `materialise()`.
35
+ * folds forward with the SAME step and clone discipline the replay uses
36
+ * (`verbs.ts` · `foldKey`) — the per-key slice of `applySmartMerge`'s replay,
37
+ * O(key's commit span) instead of a full `materialise()`. Two `merge` rows of
38
+ * one bundle see one copy of the bundle's delta, as the replay's do (a clone per
39
+ * row, as this helper once took, made an array union — which deduplicates by
40
+ * reference — duplicate the elements the first row had placed).
26
41
  *
27
42
  * Works on full-mode logs too (every `set` is its own anchor — equivalent to
28
43
  * `findLastWriter(...).overwrite[key]`).
@@ -40,6 +55,9 @@ export declare function findLastWriter(commitLog: CommitBundle[], key: string, b
40
55
  * `stateAt(snapshot, idx).state[key]` (footprintjs/trace) answers this case
41
56
  * correctly — it folds from `RuntimeSnapshot.initialState`, which this
42
57
  * function never receives.
58
+ * @throws {@link UnknownVerbError} when a row on `key` carries a verb other
59
+ * than `set | merge | append | delete` — a foreign or corrupted log is
60
+ * refused, not folded as a `merge`. Engine-written logs never carry one.
43
61
  */
44
62
  export declare function commitValueAt(commitLog: CommitBundle[], idx: number, key: string): unknown;
45
63
  /**
@@ -4,8 +4,8 @@
4
4
  * The commitLog is an ordered array of CommitBundle — one per stage commit.
5
5
  * These helpers provide type-safe queries without (b: any) casts.
6
6
  */
7
- import { nativeGet } from './pathOps.js';
8
- import { deepSmartMerge, DELIM } from './utils.js';
7
+ import { DELIM } from './paths.js';
8
+ import { foldKey, isVerb, UnknownVerbError } from './verbs.js';
9
9
  /** Find the first commit by stageId, optionally filtering by a written key. */
10
10
  export function findCommit(commitLog, stageId, key) {
11
11
  return commitLog.find((b) => b.stageId === stageId && (!key || b.trace.some((t) => t.path === key)));
@@ -24,6 +24,31 @@ export function findLastWriter(commitLog, key, beforeIdx) {
24
24
  }
25
25
  return undefined;
26
26
  }
27
+ /**
28
+ * Every row on `key` in `commitLog[0..end]`, in commit order — the touches a
29
+ * per-path fold ({@link foldKey}) runs over. `key` is matched against
30
+ * `TraceEntry.path` exactly (DELIM-joined for nested paths). A row whose verb
31
+ * is not one of the four is refused with {@link UnknownVerbError} naming the
32
+ * row — whether or not the fold would have reached it: the answer must not
33
+ * depend on where an optimisation starts.
34
+ *
35
+ * Internal: `commitValueAt` and `arrayProvenance` are its two readers.
36
+ */
37
+ export function keyTouches(commitLog, key, end) {
38
+ const touches = [];
39
+ for (let i = 0; i <= end; i++) {
40
+ const trace = commitLog[i].trace;
41
+ for (let row = 0; row < trace.length; row++) {
42
+ if (trace[row].path !== key)
43
+ continue;
44
+ const verb = trace[row].verb;
45
+ if (!isVerb(verb))
46
+ throw new UnknownVerbError(verb, { path: key, row, commit: i });
47
+ touches.push({ verb, bundle: commitLog[i], commitIdx: i });
48
+ }
49
+ }
50
+ return touches;
51
+ }
27
52
  /**
28
53
  * Reconstruct the FULL value of `key` as of commit array index `idx`
29
54
  * (inclusive) — the migration helper for the "read `bundle.overwrite[key]`
@@ -33,9 +58,12 @@ export function findLastWriter(commitLog, key, beforeIdx) {
33
58
  * only the TAIL of the array; this helper folds the verbs back together:
34
59
  * it scans `commitLog[0..idx]` for trace entries on `key`, anchors at the
35
60
  * latest full-value write (`set` — or `delete`, which resets to absent), and
36
- * replays forward (`append` → concat, `merge` → `deepSmartMerge`) — exactly
37
- * the per-key slice of `applySmartMerge`'s replay, O(key's commit span)
38
- * instead of a full `materialise()`.
61
+ * folds forward with the SAME step and clone discipline the replay uses
62
+ * (`verbs.ts` · `foldKey`) — the per-key slice of `applySmartMerge`'s replay,
63
+ * O(key's commit span) instead of a full `materialise()`. Two `merge` rows of
64
+ * one bundle see one copy of the bundle's delta, as the replay's do (a clone per
65
+ * row, as this helper once took, made an array union — which deduplicates by
66
+ * reference — duplicate the elements the first row had placed).
39
67
  *
40
68
  * Works on full-mode logs too (every `set` is its own anchor — equivalent to
41
69
  * `findLastWriter(...).overwrite[key]`).
@@ -53,47 +81,15 @@ export function findLastWriter(commitLog, key, beforeIdx) {
53
81
  * `stateAt(snapshot, idx).state[key]` (footprintjs/trace) answers this case
54
82
  * correctly — it folds from `RuntimeSnapshot.initialState`, which this
55
83
  * function never receives.
84
+ * @throws {@link UnknownVerbError} when a row on `key` carries a verb other
85
+ * than `set | merge | append | delete` — a foreign or corrupted log is
86
+ * refused, not folded as a `merge`. Engine-written logs never carry one.
56
87
  */
57
88
  export function commitValueAt(commitLog, idx, key) {
58
- const end = Math.min(idx, commitLog.length - 1);
59
- const segs = key.split(DELIM);
60
- // Collect every trace entry touching the key (in order) up to `end`.
61
- const touches = [];
62
- for (let i = 0; i <= end; i++) {
63
- for (const t of commitLog[i].trace) {
64
- if (t.path === key)
65
- touches.push({ verb: t.verb, bundle: commitLog[i] });
66
- }
67
- }
89
+ const touches = keyTouches(commitLog, key, Math.min(idx, commitLog.length - 1));
68
90
  if (touches.length === 0)
69
91
  return undefined;
70
- // Anchor at the latest entry that fully determines the value on its own.
71
- let start = 0;
72
- for (let i = touches.length - 1; i >= 0; i--) {
73
- if (touches[i].verb === 'set' || touches[i].verb === 'delete') {
74
- start = i;
75
- break;
76
- }
77
- }
78
- // Fold forward from the anchor — the per-key slice of applySmartMerge.
79
- let value;
80
- for (let i = start; i < touches.length; i++) {
81
- const { verb, bundle } = touches[i];
82
- if (verb === 'set') {
83
- value = structuredClone(nativeGet(bundle.overwrite, segs));
84
- }
85
- else if (verb === 'delete') {
86
- value = undefined;
87
- }
88
- else if (verb === 'append') {
89
- const tail = structuredClone(nativeGet(bundle.overwrite, segs));
90
- value = Array.isArray(value) && Array.isArray(tail) ? [...value, ...tail] : tail;
91
- }
92
- else {
93
- value = deepSmartMerge(value, structuredClone(nativeGet(bundle.updates, segs)));
94
- }
95
- }
96
- return value;
92
+ return foldKey(touches, key.split(DELIM), { anchored: true });
97
93
  }
98
94
  /**
99
95
  * Position index over a commit log: `runtimeStageId` → the ARRAY INDEX of the
@@ -147,4 +143,4 @@ export function commitIndexOf(commitLog, runtimeStageId) {
147
143
  }
148
144
  return -1;
149
145
  }
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0TG9nVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9jb21taXRMb2dVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFekMsT0FBTyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFbkQsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxVQUFVLENBQUMsU0FBeUIsRUFBRSxPQUFlLEVBQUUsR0FBWTtJQUNqRixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZHLENBQUM7QUFFRCxtQ0FBbUM7QUFDbkMsTUFBTSxVQUFVLFdBQVcsQ0FBQyxTQUF5QixFQUFFLE9BQWU7SUFDcEUsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLGNBQWMsQ0FBQyxTQUF5QixFQUFFLEdBQVcsRUFBRSxTQUFrQjtJQUN2RixNQUFNLEdBQUcsR0FBRyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksU0FBUyxD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QUM7WUFDTixLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFNBQWtDO0lBQ2pFLE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDMUMsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztRQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLFNBQWtDLEVBQUUsY0FBc0I7SUFDdEYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMxQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLEtBQUssY0FBYztZQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ1osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHlwZWQgdXRpbGl0aWVzIGZvciBxdWVyeWluZyB0aGUgY29tbWl0IGxvZy5cbiAqXG4gKiBUaGUgY29tbWl0TG9nIGlzIGFuIG9yZGVyZWQgYXJyYXkgb2YgQ29tbWl0QnVuZGxlIOKAlCBvbmUgcGVyIHN0YWdlIGNvbW1pdC5cbiAqIFRoZXNlIGhlbHBlcnMgcHJvdmlkZSB0eXBlLXNhZmUgcXVlcmllcyB3aXRob3V0IChiOiBhbnkpIGNhc3RzLlxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUdldCB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVlcFNtYXJ0TWVyZ2UsIERFTElNIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8qKiBGaW5kIHRoZSBmaXJzdCBjb21taXQgYnkgc3RhZ2VJZCwgb3B0aW9uYWxseSBmaWx0ZXJpbmcgYnkgYSB3cml0dGVuIGtleS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29tbWl0KGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIHN0YWdlSWQ6IHN0cmluZywga2V5Pzogc3RyaW5nKTogQ29tbWl0QnVuZGxlIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGNvbW1pdExvZy5maW5kKChiKSA9PiBiLnN0YWdlSWQgPT09IHN0YWdlSWQgJiYgKCFrZXkgfHwgYi50cmFjZS5zb21lKCh0KSA9PiB0LnBhdGggPT09IGtleSkpKTtcbn1cblxuLyoqIEZpbmQgYWxsIGNvbW1pdHMgYnkgc3RhZ2VJZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29tbWl0cyhjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLCBzdGFnZUlkOiBzdHJpbmcpOiBDb21taXRCdW5kbGVbXSB7XG4gIHJldHVybiBjb21taXRMb2cuZmlsdGVyKChiKSA9PiBiLnN0YWdlSWQgPT09IHN0YWdlSWQpO1xufVxuXG4vKiogRmluZCB0aGUgbGFzdCBjb21taXQgdGhhdCB3cm90ZSBhIHNwZWNpZmljIGtleSAoZm9yIGJhY2t0cmFja2luZykuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZExhc3RXcml0ZXIoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSwga2V5OiBzdHJpbmcsIGJlZm9yZUlkeD86IG51bWJlcik6IENvbW1pdEJ1bmRsZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVuZCA9IGJlZm9yZUlkeCA/PyBjb21taXRMb2cubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gZW5kIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoY29tbWl0TG9nW2ldLnRyYWNlLnNvbWUoKHQpID0+IHQucGF0aCA9PT0ga2V5KSkge1xuICAgICAgcmV0dXJuIGNvbW1pdExvZ1tpXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWNvbnN0cnVjdCB0aGUgRlVMTCB2YWx1ZSBvZiBga2V5YCBhcyBvZiBjb21taXQgYXJyYXkgaW5kZXggYGlkeGBcbiAqIChpbmNsdXNpdmUpIOKAlCB0aGUgbWlncmF0aW9uIGhlbHBlciBmb3IgdGhlIFwicmVhZCBgYnVuZGxlLm92ZXJ3cml0ZVtrZXldYFxuICogYXMgdGhlIGZ1bGwgdmFsdWUgd3JpdHRlblwiIHBhdHRlcm4gKCMxM2MtQikuXG4gKlxuICogVW5kZXIgYGNvbW1pdFZhbHVlczogJ2RlbHRhJ2AsIGFuIGBhcHBlbmRgIGJ1bmRsZSdzIGBvdmVyd3JpdGVba2V5XWAgaG9sZHNcbiAqIG9ubHkgdGhlIFRBSUwgb2YgdGhlIGFycmF5OyB0aGlzIGhlbHBlciBmb2xkcyB0aGUgdmVyYnMgYmFjayB0b2dldGhlcjpcbiAqIGl0IHNjYW5zIGBjb21taXRMb2dbMC4uaWR4XWAgZm9yIHRyYWNlIGVudHJpZXMgb24gYGtleWAsIGFuY2hvcnMgYXQgdGhlXG4gKiBsYXRlc3QgZnVsbC12YWx1ZSB3cml0ZSAoYHNldGAg4oCUIG9yIGBkZWxldGVgLCB3aGljaCByZXNldHMgdG8gYWJzZW50KSwgYW5kXG4gKiByZXBsYXlzIGZvcndhcmQgKGBhcHBlbmRgIOKGkiBjb25jYXQsIGBtZXJnZWAg4oaSIGBkZWVwU21hcnRNZXJnZWApIOKAlCBleGFjdGx5XG4gKiB0aGUgcGVyLWtleSBzbGljZSBvZiBgYXBwbHlTbWFydE1lcmdlYCdzIHJlcGxheSwgTyhrZXkncyBjb21taXQgc3BhbilcbiAqIGluc3RlYWQgb2YgYSBmdWxsIGBtYXRlcmlhbGlzZSgpYC5cbiAqXG4gKiBXb3JrcyBvbiBmdWxsLW1vZGUgbG9ncyB0b28gKGV2ZXJ5IGBzZXRgIGlzIGl0cyBvd24gYW5jaG9yIOKAlCBlcXVpdmFsZW50IHRvXG4gKiBgZmluZExhc3RXcml0ZXIoLi4uKS5vdmVyd3JpdGVba2V5XWApLlxuICpcbiAqIEBwYXJhbSBrZXkgIE1hdGNoZWQgYWdhaW5zdCBgVHJhY2VFbnRyeS5wYXRoYCBleGFjdGx5IChzYW1lIGNvbnRyYWN0IGFzXG4gKiAgIGBmaW5kTGFzdFdyaXRlcmApIOKAlCBERUxJTS1qb2luZWQgZm9yIG5lc3RlZCBwYXRocy5cbiAqIEBwYXJhbSBpZHggIENvbW1pdEJ1bmRsZSBBUlJBWSBpbmRleCAodGhlIGBidW5kbGUuaWR4YCBwb3NpdGlvbiksXG4gKiAgIGluY2x1c2l2ZS4gTk9UIHRoZSBleGVjdXRpb25JbmRleCBmcm9tIGEgcnVudGltZVN0YWdlSWQuXG4gKiBAcmV0dXJucyBUaGUgcmVjb25zdHJ1Y3RlZCB2YWx1ZSAoYSBkZXRhY2hlZCBjbG9uZSksIG9yIGB1bmRlZmluZWRgIHdoZW5cbiAqICAgdGhlIGtleSB3YXMgbmV2ZXIgd3JpdHRlbiBpbiBgY29tbWl0TG9nWzAuLmlkeF1gIG9yIGl0cyBsYXN0IHdyaXRlIHdhcyBhXG4gKiAgIGRlbGV0ZS4gQ2F2ZWF0OiB2YWx1ZXMgZGVyaXZlZCBwdXJlbHkgZnJvbSB0aGUgcnVuJ3MgSU5JVElBTCBzdGF0ZSAobm9cbiAqICAgYHNldGAgYW5jaG9yIGluIHRoZSBsb2cg4oCUIGUuZy4gbWVyZ2VzIG9udG8gYSBzZWVkZWQga2V5KSBmb2xkIGZyb21cbiAqICAgYWJzZW50OyB0aGUgY29tbWl0IGxvZyBhbG9uZSBjYW5ub3Qgc2VlIHRoZSBwcmUtcnVuIGJhc2UgKHRoZSBzYW1lIGJsaW5kXG4gKiAgIHNwb3QgYGZpbmRMYXN0V3JpdGVyYCBoYXMpLiBTaW5jZSA5LjE3LjAgdGhlIGJhc2UgVFJBVkVMUyB3aXRoIHRoZSBsb2csIHNvXG4gKiAgIGBzdGF0ZUF0KHNuYXBzaG90LCBpZHgpLnN0YXRlW2tleV1gIChmb290cHJpbnRqcy90cmFjZSkgYW5zd2VycyB0aGlzIGNhc2VcbiAqICAgY29ycmVjdGx5IOKAlCBpdCBmb2xkcyBmcm9tIGBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlYCwgd2hpY2ggdGhpc1xuICogICBmdW5jdGlvbiBuZXZlciByZWNlaXZlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdFZhbHVlQXQoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSwgaWR4OiBudW1iZXIsIGtleTogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGVuZCA9IE1hdGgubWluKGlkeCwgY29tbWl0TG9nLmxlbmd0aCAtIDEpO1xuICBjb25zdCBzZWdzID0ga2V5LnNwbGl0KERFTElNKTtcblxuICAvLyBDb2xsZWN0IGV2ZXJ5IHRyYWNlIGVudHJ5IHRvdWNoaW5nIHRoZSBrZXkgKGluIG9yZGVyKSB1cCB0byBgZW5kYC5cbiAgY29uc3QgdG91Y2hlczogeyB2ZXJiOiBzdHJpbmc7IGJ1bmRsZTogQ29tbWl0QnVuZGxlIH1bXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8PSBlbmQ7IGkrKykge1xuICAgIGZvciAoY29uc3QgdCBvZiBjb21taXRMb2dbaV0udHJhY2UpIHtcbiAgICAgIGlmICh0LnBhdGggPT09IGtleSkgdG91Y2hlcy5wdXNoKHsgdmVyYjogdC52ZXJiLCBidW5kbGU6IGNvbW1pdExvZ1tpXSB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKHRvdWNoZXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIC8vIEFuY2hvciBhdCB0aGUgbGF0ZXN0IGVudHJ5IHRoYXQgZnVsbHkgZGV0ZXJtaW5lcyB0aGUgdmFsdWUgb24gaXRzIG93bi5cbiAgbGV0IHN0YXJ0ID0gMDtcbiAgZm9yIChsZXQgaSA9IHRvdWNoZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAodG91Y2hlc1tpXS52ZXJiID09PSAnc2V0JyB8fCB0b3VjaGVzW2ldLnZlcmIgPT09ICdkZWxldGUnKSB7XG4gICAgICBzdGFydCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvLyBGb2xkIGZvcndhcmQgZnJvbSB0aGUgYW5jaG9yIOKAlCB0aGUgcGVyLWtleSBzbGljZSBvZiBhcHBseVNtYXJ0TWVyZ2UuXG4gIGxldCB2YWx1ZTogdW5rbm93bjtcbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgdG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHsgdmVyYiwgYnVuZGxlIH0gPSB0b3VjaGVzW2ldO1xuICAgIGlmICh2ZXJiID09PSAnc2V0Jykge1xuICAgICAgdmFsdWUgPSBzdHJ1Y3R1cmVkQ2xvbmUobmF0aXZlR2V0KGJ1bmRsZS5vdmVyd3JpdGUsIHNlZ3MpKTtcbiAgICB9IGVsc2UgaWYgKHZlcmIgPT09ICdkZWxldGUnKSB7XG4gICAgICB2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHZlcmIgPT09ICdhcHBlbmQnKSB7XG4gICAgICBjb25zdCB0YWlsID0gc3RydWN0dXJlZENsb25lKG5hdGl2ZUdldChidW5kbGUub3ZlcndyaXRlLCBzZWdzKSk7XG4gICAgICB2YWx1ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpICYmIEFycmF5LmlzQXJyYXkodGFpbCkgPyBbLi4udmFsdWUsIC4uLnRhaWxdIDogdGFpbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBkZWVwU21hcnRNZXJnZSh2YWx1ZSwgc3RydWN0dXJlZENsb25lKG5hdGl2ZUdldChidW5kbGUudXBkYXRlcywgc2VncykpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFBvc2l0aW9uIGluZGV4IG92ZXIgYSBjb21taXQgbG9nOiBgcnVudGltZVN0YWdlSWRgIOKGkiB0aGUgQVJSQVkgSU5ERVggb2YgdGhlXG4gKiBGSVJTVCBidW5kbGUgdGhhdCBzdGFnZSBjb21taXR0ZWQuXG4gKlxuICogXCJGaXJzdFwiIGlzIHRoZSBjb250cmFjdCwgYW5kIGl0IGlzIGxvYWQtYmVhcmluZy4gQSBzdGFnZSBub3JtYWxseSBjb21taXRzXG4gKiBleGFjdGx5IG9uZSBidW5kbGUsIGJ1dCBhIHN1YmZsb3cgTU9VTlQgY29tbWl0cyB0d28gdGhhdCBzaGFyZSBvbmVcbiAqIGBydW50aW1lU3RhZ2VJZGAgKHRoZSBvdXRwdXQtbWFwcGluZyBjb21taXQsIHRoZW4gdGhlIG1vdW50LWV4aXQgY29tbWl0KS5cbiAqIEEgY3Vyc29yIGFza3MgXCJ3aGVyZSBkb2VzIHRoaXMgc3RhZ2Ugc3RhcnQ/XCIsIHNvIHRoZSBmaXJzdCB3aW5zIOKAlCB0aGVcbiAqIGdyb3VwaW5nIGEgcmVhZGVyJ3MgYXhpcyB1c2VzIChgY29tbWl0U3RvcHNgKSBhbmNob3JzIGF0IHRoZSBzYW1lIHBsYWNlLlxuICpcbiAqIEJ1aWxkIHRoaXMgT05DRSB3aGVuIHJlc29sdmluZyBtYW55IGlkczsgdXNlIHtAbGluayBjb21taXRJbmRleE9mfSBmb3IgYVxuICogc2luZ2xlIGxvb2t1cC5cbiAqXG4gKiBAcGFyYW0gY29tbWl0TG9nIE9yZGVyZWQgY29tbWl0IGJ1bmRsZXMg4oCUIGBnZXRTbmFwc2hvdCgpLmNvbW1pdExvZ2AuXG4gKiBAcmV0dXJucyBBIGZyZXNoIE1hcCwgb3duZWQgYnkgdGhlIGNhbGxlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29tbWl0SW5kZXgoY29tbWl0TG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBpbmRleCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWl0TG9nLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaWQgPSBjb21taXRMb2dbaV0ucnVudGltZVN0YWdlSWQ7XG4gICAgaWYgKCFpbmRleC5oYXMoaWQpKSBpbmRleC5zZXQoaWQsIGkpO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuLyoqXG4gKiBUaGUgQVJSQVkgSU5ERVggb2YgdGhlIGZpcnN0IGNvbW1pdCBhIGdpdmVuIGBydW50aW1lU3RhZ2VJZGAgcHJvZHVjZWQsIG9yXG4gKiBgLTFgIHdoZW4gdGhhdCBzdGFnZSBpcyBub3QgaW4gdGhpcyBsb2cgKGBpbmRleE9mYCBzZW1hbnRpY3Mg4oCUIHRoZSBuYW1lJ3NcbiAqIHByb21pc2UpLlxuICpcbiAqIFRoaXMgaXMgdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gZXZlcnkgcmVhZGVyIG5lZWRzIGFuZCBub2JvZHkgZXhwb3J0ZWQ6IGFcbiAqIGBydW50aW1lU3RhZ2VJZGAgaXMgdGhlIGlkIGFuIGV2ZW50IGNhcnJpZXMsIGEgY29tbWl0IGluZGV4IGlzIHdoYXRcbiAqIGBjb21taXRWYWx1ZUF0YCAvIGBzdGF0ZUF0YCAvIGBDb21taXRSYW5nZUluZGV4YCBzcGVhay4gTyhuKSDigJQgZm9yIG1hbnlcbiAqIGxvb2t1cHMgYnVpbGQgdGhlIG1hcCBvbmNlIHdpdGgge0BsaW5rIGJ1aWxkQ29tbWl0SW5kZXh9LlxuICpcbiAqIEEgc3RhZ2UgdGhhdCByYW4gaW5zaWRlIGEgU1VCRkxPVyBpcyBub3QgaW4gdGhlIHJ1bi1sZXZlbCBsb2cgKHN1YmZsb3dzXG4gKiBjb21taXQgdG8gdGhlaXIgb3duIGlzb2xhdGVkIGxvZyk7IGxvb2sgaXQgdXAgaW4gdGhhdCBzdWJmbG93J3Mgb3duXG4gKiBgaGlzdG9yeWAgaW5zdGVhZCDigJQgc2VlIGBnZXRTdWJ0cmVlU25hcHNob3RgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBpZHggPSBjb21taXRJbmRleE9mKHNuYXBzaG90LmNvbW1pdExvZywgJ3Njb3JlLXJpc2sjNycpO1xuICogY29uc3QgYmVmb3JlID0gaWR4ID4gMCA/IGNvbW1pdFZhbHVlQXQoc25hcHNob3QuY29tbWl0TG9nLCBpZHggLSAxLCAncmlzaycpIDogdW5kZWZpbmVkO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21taXRJbmRleE9mKGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sIHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBudW1iZXIge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbW1pdExvZy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChjb21taXRMb2dbaV0ucnVudGltZVN0YWdlSWQgPT09IHJ1bnRpbWVTdGFnZUlkKSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG4iXX0=
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0TG9nVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9jb21taXRMb2dVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFM0UsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxVQUFVLENBQUMsU0FBeUIsRUFBRSxPQUFlLEVBQUUsR0FBWTtJQUNqRixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZHLENBQUM7QUFFRCxtQ0FBbUM7QUFDbkMsTUFBTSxVQUFVLFdBQVcsQ0FBQyxTQUF5QixFQUFFLE9BQWU7SUFDcEUsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLGNBQWMsQ0FBQyxTQUF5QixFQUFFLEdBQVcsRUFBRSxTQUFrQjtJQUN2RixNQUFNLEdBQUcsR0FBRyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xD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QyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDMUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxLQUFLLGNBQWM7WUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR5cGVkIHV0aWxpdGllcyBmb3IgcXVlcnlpbmcgdGhlIGNvbW1pdCBsb2cuXG4gKlxuICogVGhlIGNvbW1pdExvZyBpcyBhbiBvcmRlcmVkIGFycmF5IG9mIENvbW1pdEJ1bmRsZSDigJQgb25lIHBlciBzdGFnZSBjb21taXQuXG4gKiBUaGVzZSBoZWxwZXJzIHByb3ZpZGUgdHlwZS1zYWZlIHF1ZXJpZXMgd2l0aG91dCAoYjogYW55KSBjYXN0cy5cbiAqL1xuXG5pbXBvcnQgeyBERUxJTSB9IGZyb20gJy4vcGF0aHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IHR5cGUgVG91Y2gsIGZvbGRLZXksIGlzVmVyYiwgVW5rbm93blZlcmJFcnJvciB9IGZyb20gJy4vdmVyYnMuanMnO1xuXG4vKiogRmluZCB0aGUgZmlyc3QgY29tbWl0IGJ5IHN0YWdlSWQsIG9wdGlvbmFsbHkgZmlsdGVyaW5nIGJ5IGEgd3JpdHRlbiBrZXkuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbW1pdChjb21taXRMb2c6IENvbW1pdEJ1bmRsZVtdLCBzdGFnZUlkOiBzdHJpbmcsIGtleT86IHN0cmluZyk6IENvbW1pdEJ1bmRsZSB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBjb21taXRMb2cuZmluZCgoYikgPT4gYi5zdGFnZUlkID09PSBzdGFnZUlkICYmICgha2V5IHx8IGIudHJhY2Uuc29tZSgodCkgPT4gdC5wYXRoID09PSBrZXkpKSk7XG59XG5cbi8qKiBGaW5kIGFsbCBjb21taXRzIGJ5IHN0YWdlSWQuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbW1pdHMoY29tbWl0TG9nOiBDb21taXRCdW5kbGVbXSwgc3RhZ2VJZDogc3RyaW5nKTogQ29tbWl0QnVuZGxlW10ge1xuICByZXR1cm4gY29tbWl0TG9nLmZpbHRlcigoYikgPT4gYi5zdGFnZUlkID09PSBzdGFnZUlkKTtcbn1cblxuLyoqIEZpbmQgdGhlIGxhc3QgY29tbWl0IHRoYXQgd3JvdGUgYSBzcGVjaWZpYyBrZXkgKGZvciBiYWNrdHJhY2tpbmcpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRMYXN0V3JpdGVyKGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIGtleTogc3RyaW5nLCBiZWZvcmVJZHg/OiBudW1iZXIpOiBDb21taXRCdW5kbGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBlbmQgPSBiZWZvcmVJZHggPz8gY29tbWl0TG9nLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IGVuZCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKGNvbW1pdExvZ1tpXS50cmFjZS5zb21lKCh0KSA9PiB0LnBhdGggPT09IGtleSkpIHtcbiAgICAgIHJldHVybiBjb21taXRMb2dbaV07XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRXZlcnkgcm93IG9uIGBrZXlgIGluIGBjb21taXRMb2dbMC4uZW5kXWAsIGluIGNvbW1pdCBvcmRlciDigJQgdGhlIHRvdWNoZXMgYVxuICogcGVyLXBhdGggZm9sZCAoe0BsaW5rIGZvbGRLZXl9KSBydW5zIG92ZXIuIGBrZXlgIGlzIG1hdGNoZWQgYWdhaW5zdFxuICogYFRyYWNlRW50cnkucGF0aGAgZXhhY3RseSAoREVMSU0tam9pbmVkIGZvciBuZXN0ZWQgcGF0aHMpLiBBIHJvdyB3aG9zZSB2ZXJiXG4gKiBpcyBub3Qgb25lIG9mIHRoZSBmb3VyIGlzIHJlZnVzZWQgd2l0aCB7QGxpbmsgVW5rbm93blZlcmJFcnJvcn0gbmFtaW5nIHRoZVxuICogcm93IOKAlCB3aGV0aGVyIG9yIG5vdCB0aGUgZm9sZCB3b3VsZCBoYXZlIHJlYWNoZWQgaXQ6IHRoZSBhbnN3ZXIgbXVzdCBub3RcbiAqIGRlcGVuZCBvbiB3aGVyZSBhbiBvcHRpbWlzYXRpb24gc3RhcnRzLlxuICpcbiAqIEludGVybmFsOiBgY29tbWl0VmFsdWVBdGAgYW5kIGBhcnJheVByb3ZlbmFuY2VgIGFyZSBpdHMgdHdvIHJlYWRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBrZXlUb3VjaGVzKGNvbW1pdExvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10sIGtleTogc3RyaW5nLCBlbmQ6IG51bWJlcik6IFRvdWNoW10ge1xuICBjb25zdCB0b3VjaGVzOiBUb3VjaFtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgY29uc3QgdHJhY2UgPSBjb21taXRMb2dbaV0udHJhY2U7XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdHJhY2UubGVuZ3RoOyByb3crKykge1xuICAgICAgaWYgKHRyYWNlW3Jvd10ucGF0aCAhPT0ga2V5KSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHZlcmIgPSB0cmFjZVtyb3ddLnZlcmI7XG4gICAgICBpZiAoIWlzVmVyYih2ZXJiKSkgdGhyb3cgbmV3IFVua25vd25WZXJiRXJyb3IodmVyYiwgeyBwYXRoOiBrZXksIHJvdywgY29tbWl0OiBpIH0pO1xuICAgICAgdG91Y2hlcy5wdXNoKHsgdmVyYiwgYnVuZGxlOiBjb21taXRMb2dbaV0sIGNvbW1pdElkeDogaSB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRvdWNoZXM7XG59XG5cbi8qKlxuICogUmVjb25zdHJ1Y3QgdGhlIEZVTEwgdmFsdWUgb2YgYGtleWAgYXMgb2YgY29tbWl0IGFycmF5IGluZGV4IGBpZHhgXG4gKiAoaW5jbHVzaXZlKSDigJQgdGhlIG1pZ3JhdGlvbiBoZWxwZXIgZm9yIHRoZSBcInJlYWQgYGJ1bmRsZS5vdmVyd3JpdGVba2V5XWBcbiAqIGFzIHRoZSBmdWxsIHZhbHVlIHdyaXR0ZW5cIiBwYXR0ZXJuICgjMTNjLUIpLlxuICpcbiAqIFVuZGVyIGBjb21taXRWYWx1ZXM6ICdkZWx0YSdgLCBhbiBgYXBwZW5kYCBidW5kbGUncyBgb3ZlcndyaXRlW2tleV1gIGhvbGRzXG4gKiBvbmx5IHRoZSBUQUlMIG9mIHRoZSBhcnJheTsgdGhpcyBoZWxwZXIgZm9sZHMgdGhlIHZlcmJzIGJhY2sgdG9nZXRoZXI6XG4gKiBpdCBzY2FucyBgY29tbWl0TG9nWzAuLmlkeF1gIGZvciB0cmFjZSBlbnRyaWVzIG9uIGBrZXlgLCBhbmNob3JzIGF0IHRoZVxuICogbGF0ZXN0IGZ1bGwtdmFsdWUgd3JpdGUgKGBzZXRgIOKAlCBvciBgZGVsZXRlYCwgd2hpY2ggcmVzZXRzIHRvIGFic2VudCksIGFuZFxuICogZm9sZHMgZm9yd2FyZCB3aXRoIHRoZSBTQU1FIHN0ZXAgYW5kIGNsb25lIGRpc2NpcGxpbmUgdGhlIHJlcGxheSB1c2VzXG4gKiAoYHZlcmJzLnRzYCDCtyBgZm9sZEtleWApIOKAlCB0aGUgcGVyLWtleSBzbGljZSBvZiBgYXBwbHlTbWFydE1lcmdlYCdzIHJlcGxheSxcbiAqIE8oa2V5J3MgY29tbWl0IHNwYW4pIGluc3RlYWQgb2YgYSBmdWxsIGBtYXRlcmlhbGlzZSgpYC4gVHdvIGBtZXJnZWAgcm93cyBvZlxuICogb25lIGJ1bmRsZSBzZWUgb25lIGNvcHkgb2YgdGhlIGJ1bmRsZSdzIGRlbHRhLCBhcyB0aGUgcmVwbGF5J3MgZG8gKGEgY2xvbmUgcGVyXG4gKiByb3csIGFzIHRoaXMgaGVscGVyIG9uY2UgdG9vaywgbWFkZSBhbiBhcnJheSB1bmlvbiDigJQgd2hpY2ggZGVkdXBsaWNhdGVzIGJ5XG4gKiByZWZlcmVuY2Ug4oCUIGR1cGxpY2F0ZSB0aGUgZWxlbWVudHMgdGhlIGZpcnN0IHJvdyBoYWQgcGxhY2VkKS5cbiAqXG4gKiBXb3JrcyBvbiBmdWxsLW1vZGUgbG9ncyB0b28gKGV2ZXJ5IGBzZXRgIGlzIGl0cyBvd24gYW5jaG9yIOKAlCBlcXVpdmFsZW50IHRvXG4gKiBgZmluZExhc3RXcml0ZXIoLi4uKS5vdmVyd3JpdGVba2V5XWApLlxuICpcbiAqIEBwYXJhbSBrZXkgIE1hdGNoZWQgYWdhaW5zdCBgVHJhY2VFbnRyeS5wYXRoYCBleGFjdGx5IChzYW1lIGNvbnRyYWN0IGFzXG4gKiAgIGBmaW5kTGFzdFdyaXRlcmApIOKAlCBERUxJTS1qb2luZWQgZm9yIG5lc3RlZCBwYXRocy5cbiAqIEBwYXJhbSBpZHggIENvbW1pdEJ1bmRsZSBBUlJBWSBpbmRleCAodGhlIGBidW5kbGUuaWR4YCBwb3NpdGlvbiksXG4gKiAgIGluY2x1c2l2ZS4gTk9UIHRoZSBleGVjdXRpb25JbmRleCBmcm9tIGEgcnVudGltZVN0YWdlSWQuXG4gKiBAcmV0dXJucyBUaGUgcmVjb25zdHJ1Y3RlZCB2YWx1ZSAoYSBkZXRhY2hlZCBjbG9uZSksIG9yIGB1bmRlZmluZWRgIHdoZW5cbiAqICAgdGhlIGtleSB3YXMgbmV2ZXIgd3JpdHRlbiBpbiBgY29tbWl0TG9nWzAuLmlkeF1gIG9yIGl0cyBsYXN0IHdyaXRlIHdhcyBhXG4gKiAgIGRlbGV0ZS4gQ2F2ZWF0OiB2YWx1ZXMgZGVyaXZlZCBwdXJlbHkgZnJvbSB0aGUgcnVuJ3MgSU5JVElBTCBzdGF0ZSAobm9cbiAqICAgYHNldGAgYW5jaG9yIGluIHRoZSBsb2cg4oCUIGUuZy4gbWVyZ2VzIG9udG8gYSBzZWVkZWQga2V5KSBmb2xkIGZyb21cbiAqICAgYWJzZW50OyB0aGUgY29tbWl0IGxvZyBhbG9uZSBjYW5ub3Qgc2VlIHRoZSBwcmUtcnVuIGJhc2UgKHRoZSBzYW1lIGJsaW5kXG4gKiAgIHNwb3QgYGZpbmRMYXN0V3JpdGVyYCBoYXMpLiBTaW5jZSA5LjE3LjAgdGhlIGJhc2UgVFJBVkVMUyB3aXRoIHRoZSBsb2csIHNvXG4gKiAgIGBzdGF0ZUF0KHNuYXBzaG90LCBpZHgpLnN0YXRlW2tleV1gIChmb290cHJpbnRqcy90cmFjZSkgYW5zd2VycyB0aGlzIGNhc2VcbiAqICAgY29ycmVjdGx5IOKAlCBpdCBmb2xkcyBmcm9tIGBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlYCwgd2hpY2ggdGhpc1xuICogICBmdW5jdGlvbiBuZXZlciByZWNlaXZlcy5cbiAqIEB0aHJvd3Mge0BsaW5rIFVua25vd25WZXJiRXJyb3J9IHdoZW4gYSByb3cgb24gYGtleWAgY2FycmllcyBhIHZlcmIgb3RoZXJcbiAqICAgdGhhbiBgc2V0IHwgbWVyZ2UgfCBhcHBlbmQgfCBkZWxldGVgIOKAlCBhIGZvcmVpZ24gb3IgY29ycnVwdGVkIGxvZyBpc1xuICogICByZWZ1c2VkLCBub3QgZm9sZGVkIGFzIGEgYG1lcmdlYC4gRW5naW5lLXdyaXR0ZW4gbG9ncyBuZXZlciBjYXJyeSBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21taXRWYWx1ZUF0KGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sIGlkeDogbnVtYmVyLCBrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICBjb25zdCB0b3VjaGVzID0ga2V5VG91Y2hlcyhjb21taXRMb2csIGtleSwgTWF0aC5taW4oaWR4LCBjb21taXRMb2cubGVuZ3RoIC0gMSkpO1xuICBpZiAodG91Y2hlcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBmb2xkS2V5KHRvdWNoZXMsIGtleS5zcGxpdChERUxJTSksIHsgYW5jaG9yZWQ6IHRydWUgfSk7XG59XG5cbi8qKlxuICogUG9zaXRpb24gaW5kZXggb3ZlciBhIGNvbW1pdCBsb2c6IGBydW50aW1lU3RhZ2VJZGAg4oaSIHRoZSBBUlJBWSBJTkRFWCBvZiB0aGVcbiAqIEZJUlNUIGJ1bmRsZSB0aGF0IHN0YWdlIGNvbW1pdHRlZC5cbiAqXG4gKiBcIkZpcnN0XCIgaXMgdGhlIGNvbnRyYWN0LCBhbmQgaXQgaXMgbG9hZC1iZWFyaW5nLiBBIHN0YWdlIG5vcm1hbGx5IGNvbW1pdHNcbiAqIGV4YWN0bHkgb25lIGJ1bmRsZSwgYnV0IGEgc3ViZmxvdyBNT1VOVCBjb21taXRzIHR3byB0aGF0IHNoYXJlIG9uZVxuICogYHJ1bnRpbWVTdGFnZUlkYCAodGhlIG91dHB1dC1tYXBwaW5nIGNvbW1pdCwgdGhlbiB0aGUgbW91bnQtZXhpdCBjb21taXQpLlxuICogQSBjdXJzb3IgYXNrcyBcIndoZXJlIGRvZXMgdGhpcyBzdGFnZSBzdGFydD9cIiwgc28gdGhlIGZpcnN0IHdpbnMg4oCUIHRoZVxuICogZ3JvdXBpbmcgYSByZWFkZXIncyBheGlzIHVzZXMgKGBjb21taXRTdG9wc2ApIGFuY2hvcnMgYXQgdGhlIHNhbWUgcGxhY2UuXG4gKlxuICogQnVpbGQgdGhpcyBPTkNFIHdoZW4gcmVzb2x2aW5nIG1hbnkgaWRzOyB1c2Uge0BsaW5rIGNvbW1pdEluZGV4T2Z9IGZvciBhXG4gKiBzaW5nbGUgbG9va3VwLlxuICpcbiAqIEBwYXJhbSBjb21taXRMb2cgT3JkZXJlZCBjb21taXQgYnVuZGxlcyDigJQgYGdldFNuYXBzaG90KCkuY29tbWl0TG9nYC5cbiAqIEByZXR1cm5zIEEgZnJlc2ggTWFwLCBvd25lZCBieSB0aGUgY2FsbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21taXRJbmRleChjb21taXRMb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gIGNvbnN0IGluZGV4ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21taXRMb2cubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpZCA9IGNvbW1pdExvZ1tpXS5ydW50aW1lU3RhZ2VJZDtcbiAgICBpZiAoIWluZGV4LmhhcyhpZCkpIGluZGV4LnNldChpZCwgaSk7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIFRoZSBBUlJBWSBJTkRFWCBvZiB0aGUgZmlyc3QgY29tbWl0IGEgZ2l2ZW4gYHJ1bnRpbWVTdGFnZUlkYCBwcm9kdWNlZCwgb3JcbiAqIGAtMWAgd2hlbiB0aGF0IHN0YWdlIGlzIG5vdCBpbiB0aGlzIGxvZyAoYGluZGV4T2ZgIHNlbWFudGljcyDigJQgdGhlIG5hbWUnc1xuICogcHJvbWlzZSkuXG4gKlxuICogVGhpcyBpcyB0aGUgYWRkcmVzcyB0cmFuc2xhdGlvbiBldmVyeSByZWFkZXIgbmVlZHMgYW5kIG5vYm9keSBleHBvcnRlZDogYVxuICogYHJ1bnRpbWVTdGFnZUlkYCBpcyB0aGUgaWQgYW4gZXZlbnQgY2FycmllcywgYSBjb21taXQgaW5kZXggaXMgd2hhdFxuICogYGNvbW1pdFZhbHVlQXRgIC8gYHN0YXRlQXRgIC8gYENvbW1pdFJhbmdlSW5kZXhgIHNwZWFrLiBPKG4pIOKAlCBmb3IgbWFueVxuICogbG9va3VwcyBidWlsZCB0aGUgbWFwIG9uY2Ugd2l0aCB7QGxpbmsgYnVpbGRDb21taXRJbmRleH0uXG4gKlxuICogQSBzdGFnZSB0aGF0IHJhbiBpbnNpZGUgYSBTVUJGTE9XIGlzIG5vdCBpbiB0aGUgcnVuLWxldmVsIGxvZyAoc3ViZmxvd3NcbiAqIGNvbW1pdCB0byB0aGVpciBvd24gaXNvbGF0ZWQgbG9nKTsgbG9vayBpdCB1cCBpbiB0aGF0IHN1YmZsb3cncyBvd25cbiAqIGBoaXN0b3J5YCBpbnN0ZWFkIOKAlCBzZWUgYGdldFN1YnRyZWVTbmFwc2hvdGAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGlkeCA9IGNvbW1pdEluZGV4T2Yoc25hcHNob3QuY29tbWl0TG9nLCAnc2NvcmUtcmlzayM3Jyk7XG4gKiBjb25zdCBiZWZvcmUgPSBpZHggPiAwID8gY29tbWl0VmFsdWVBdChzbmFwc2hvdC5jb21taXRMb2csIGlkeCAtIDEsICdyaXNrJykgOiB1bmRlZmluZWQ7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdEluZGV4T2YoY29tbWl0TG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSwgcnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29tbWl0TG9nLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNvbW1pdExvZ1tpXS5ydW50aW1lU3RhZ2VJZCA9PT0gcnVudGltZVN0YWdlSWQpIHJldHVybiBpO1xuICB9XG4gIHJldHVybiAtMTtcbn1cbiJdfQ==