footprintjs 10.0.1 → 10.2.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 (368) hide show
  1. package/AGENTS.md +2 -1
  2. package/CLAUDE.md +61 -7
  3. package/README.md +136 -312
  4. package/dist/esm/index.d.ts +62 -2
  5. package/dist/esm/index.js +13 -6
  6. package/dist/esm/lib/attempt/anySignal.d.ts +19 -0
  7. package/dist/esm/lib/attempt/anySignal.js +39 -0
  8. package/dist/esm/lib/attempt/call.d.ts +88 -0
  9. package/dist/esm/lib/attempt/call.js +129 -0
  10. package/dist/esm/lib/attempt/category.d.ts +37 -0
  11. package/dist/esm/lib/attempt/category.js +131 -0
  12. package/dist/esm/lib/attempt/correlation.d.ts +95 -0
  13. package/dist/esm/lib/attempt/correlation.js +178 -0
  14. package/dist/esm/lib/attempt/deadline.d.ts +44 -0
  15. package/dist/esm/lib/attempt/deadline.js +101 -0
  16. package/dist/esm/lib/attempt/decision.d.ts +52 -0
  17. package/dist/esm/lib/attempt/decision.js +134 -0
  18. package/dist/esm/lib/attempt/effect.d.ts +76 -0
  19. package/dist/esm/lib/attempt/effect.js +160 -0
  20. package/dist/esm/lib/attempt/errors.d.ts +41 -0
  21. package/dist/esm/lib/attempt/errors.js +44 -0
  22. package/dist/esm/lib/attempt/index.d.ts +18 -0
  23. package/dist/esm/lib/attempt/index.js +15 -0
  24. package/dist/esm/lib/attempt/name.d.ts +21 -0
  25. package/dist/esm/lib/attempt/name.js +43 -0
  26. package/dist/esm/lib/attempt/observed.d.ts +66 -0
  27. package/dist/esm/lib/attempt/observed.js +171 -0
  28. package/dist/esm/lib/attempt/policy.d.ts +45 -0
  29. package/dist/esm/lib/attempt/policy.js +83 -0
  30. package/dist/esm/lib/attempt/record.d.ts +11 -0
  31. package/dist/esm/lib/attempt/record.js +24 -0
  32. package/dist/esm/lib/attempt/retryLoopContext.d.ts +18 -0
  33. package/dist/esm/lib/attempt/retryLoopContext.js +24 -0
  34. package/dist/esm/lib/attempt/retryLoopTypes.d.ts +18 -0
  35. package/dist/esm/lib/attempt/retryLoopTypes.js +2 -0
  36. package/dist/esm/lib/attempt/runner.d.ts +157 -0
  37. package/dist/esm/lib/attempt/runner.js +523 -0
  38. package/dist/esm/lib/attempt/standalone.d.ts +47 -0
  39. package/dist/esm/lib/attempt/standalone.js +126 -0
  40. package/dist/esm/lib/attempt/types.d.ts +453 -0
  41. package/dist/esm/lib/attempt/types.js +16 -0
  42. package/dist/esm/lib/budget/index.d.ts +9 -0
  43. package/dist/esm/lib/budget/index.js +9 -0
  44. package/dist/esm/lib/budget/timeBudget.d.ts +136 -0
  45. package/dist/esm/lib/budget/timeBudget.js +666 -0
  46. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +88 -3
  47. package/dist/esm/lib/builder/FlowChartBuilder.js +199 -9
  48. package/dist/esm/lib/builder/retryLoop.d.ts +56 -0
  49. package/dist/esm/lib/builder/retryLoop.js +283 -0
  50. package/dist/esm/lib/builder/types.d.ts +35 -1
  51. package/dist/esm/lib/builder/types.js +1 -1
  52. package/dist/esm/lib/decide/decide.js +2 -2
  53. package/dist/esm/lib/decide/index.d.ts +1 -1
  54. package/dist/esm/lib/decide/index.js +2 -2
  55. package/dist/esm/lib/decide/types.d.ts +3 -0
  56. package/dist/esm/lib/decide/types.js +1 -8
  57. package/dist/esm/lib/engine/graph/StageNode.d.ts +11 -1
  58. package/dist/esm/lib/engine/graph/StageNode.js +1 -1
  59. package/dist/esm/lib/engine/graph/prefixNodeTree.js +5 -1
  60. package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
  61. package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
  62. package/dist/esm/lib/engine/handlers/ResumeEntry.js +3 -1
  63. package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
  64. package/dist/esm/lib/engine/handlers/StageRunner.d.ts +8 -1
  65. package/dist/esm/lib/engine/handlers/StageRunner.js +36 -9
  66. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +24 -5
  67. package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
  68. package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
  69. package/dist/esm/lib/engine/handlers/stageError.d.ts +9 -0
  70. package/dist/esm/lib/engine/handlers/stageError.js +23 -1
  71. package/dist/esm/lib/engine/index.d.ts +2 -2
  72. package/dist/esm/lib/engine/index.js +1 -1
  73. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
  74. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +68 -40
  75. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
  76. package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
  77. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
  78. package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +61 -9
  79. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
  80. package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
  81. package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +23 -0
  82. package/dist/esm/lib/engine/narrative/formatting/sentences.js +127 -1
  83. package/dist/esm/lib/engine/narrative/index.d.ts +2 -2
  84. package/dist/esm/lib/engine/narrative/index.js +1 -1
  85. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +27 -21
  86. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  87. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
  88. package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
  89. package/dist/esm/lib/engine/narrative/recorders/index.d.ts +1 -1
  90. package/dist/esm/lib/engine/narrative/recorders/index.js +1 -1
  91. package/dist/esm/lib/engine/narrative/types.d.ts +74 -5
  92. package/dist/esm/lib/engine/narrative/types.js +1 -1
  93. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
  94. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +194 -118
  95. package/dist/esm/lib/engine/traversalContext.d.ts +7 -2
  96. package/dist/esm/lib/engine/traversalContext.js +6 -3
  97. package/dist/esm/lib/engine/types.d.ts +52 -57
  98. package/dist/esm/lib/engine/types.js +1 -1
  99. package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
  100. package/dist/esm/lib/errors/terminalFailure.js +60 -0
  101. package/dist/esm/lib/{decide → filter}/evaluator.d.ts +7 -2
  102. package/dist/esm/lib/filter/evaluator.js +135 -0
  103. package/dist/esm/lib/ids/idempotencyKey.d.ts +14 -0
  104. package/dist/esm/lib/ids/idempotencyKey.js +24 -0
  105. package/dist/esm/lib/memory/StageContext.d.ts +123 -3
  106. package/dist/esm/lib/memory/StageContext.js +245 -4
  107. package/dist/esm/lib/memory/attention.d.ts +26 -0
  108. package/dist/esm/lib/memory/attention.js +171 -0
  109. package/dist/esm/lib/memory/borrowedMutation.d.ts +8 -0
  110. package/dist/esm/lib/memory/borrowedMutation.js +14 -1
  111. package/dist/esm/lib/memory/frameTypes.d.ts +38 -0
  112. package/dist/esm/lib/memory/frameTypes.js +3 -1
  113. package/dist/esm/lib/memory/redaction.d.ts +12 -0
  114. package/dist/esm/lib/memory/redaction.js +54 -5
  115. package/dist/esm/lib/pause/record.js +10 -1
  116. package/dist/esm/lib/pause/types.d.ts +19 -0
  117. package/dist/esm/lib/pause/types.js +17 -1
  118. package/dist/esm/lib/reactive/createTypedScope.js +3 -1
  119. package/dist/esm/lib/reactive/types.d.ts +36 -4
  120. package/dist/esm/lib/reactive/types.js +3 -1
  121. package/dist/esm/lib/recorder/AttemptRecorder.d.ts +141 -0
  122. package/dist/esm/lib/recorder/AttemptRecorder.js +412 -0
  123. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +36 -2
  124. package/dist/esm/lib/recorder/ControlDepRecorder.js +50 -2
  125. package/dist/esm/lib/recorder/EmitRecorder.d.ts +3 -0
  126. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  127. package/dist/esm/lib/recorder/InOutRecorder.d.ts +37 -1
  128. package/dist/esm/lib/recorder/InOutRecorder.js +75 -6
  129. package/dist/esm/lib/recorder/QualityRecorder.d.ts +32 -5
  130. package/dist/esm/lib/recorder/QualityRecorder.js +87 -29
  131. package/dist/esm/lib/recorder/TopologyRecorder.d.ts +35 -5
  132. package/dist/esm/lib/recorder/TopologyRecorder.js +76 -2
  133. package/dist/esm/lib/recorder/attemptMetricRows.d.ts +11 -0
  134. package/dist/esm/lib/recorder/attemptMetricRows.js +202 -0
  135. package/dist/esm/lib/recorder/attemptMetrics.d.ts +7 -0
  136. package/dist/esm/lib/recorder/attemptMetrics.js +165 -0
  137. package/dist/esm/lib/recorder/attemptMetricsTypes.d.ts +114 -0
  138. package/dist/esm/lib/recorder/attemptMetricsTypes.js +2 -0
  139. package/dist/esm/lib/recorder/attemptOTel.d.ts +78 -0
  140. package/dist/esm/lib/recorder/attemptOTel.js +107 -0
  141. package/dist/esm/lib/recorder/attemptSeries.d.ts +81 -0
  142. package/dist/esm/lib/recorder/attemptSeries.js +103 -0
  143. package/dist/esm/lib/recorder/hooks.d.ts +9 -0
  144. package/dist/esm/lib/recorder/hooks.js +4 -1
  145. package/dist/esm/lib/runner/DeferredObserverTier.js +13 -1
  146. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +54 -6
  147. package/dist/esm/lib/runner/ExecutionRuntime.js +57 -5
  148. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +46 -2
  149. package/dist/esm/lib/runner/FlowChartExecutor.js +330 -101
  150. package/dist/esm/lib/runner/RunnableChart.d.ts +6 -0
  151. package/dist/esm/lib/runner/RunnableChart.js +5 -1
  152. package/dist/esm/lib/runner/attach.d.ts +2 -1
  153. package/dist/esm/lib/runner/attach.js +8 -2
  154. package/dist/esm/lib/runner/checkpoint.js +3 -1
  155. package/dist/esm/lib/runner/deadline.d.ts +42 -0
  156. package/dist/esm/lib/runner/deadline.js +90 -0
  157. package/dist/esm/lib/runner/index.d.ts +3 -1
  158. package/dist/esm/lib/runner/index.js +2 -1
  159. package/dist/esm/lib/runner/options.d.ts +17 -0
  160. package/dist/esm/lib/runner/options.js +3 -1
  161. package/dist/esm/lib/runner/recordSink.d.ts +128 -0
  162. package/dist/esm/lib/runner/recordSink.js +296 -0
  163. package/dist/esm/lib/runner/resume.d.ts +3 -0
  164. package/dist/esm/lib/runner/resume.js +22 -2
  165. package/dist/esm/lib/runner/snapshot.d.ts +2 -2
  166. package/dist/esm/lib/runner/snapshot.js +6 -2
  167. package/dist/esm/lib/scope/ScopeFacade.d.ts +118 -4
  168. package/dist/esm/lib/scope/ScopeFacade.js +304 -7
  169. package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +17 -3
  170. package/dist/esm/lib/scope/recorders/DebugRecorder.js +79 -13
  171. package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +10 -0
  172. package/dist/esm/lib/scope/recorders/MetricRecorder.js +15 -2
  173. package/dist/esm/lib/scope/runtime.d.ts +3 -0
  174. package/dist/esm/lib/scope/runtime.js +1 -1
  175. package/dist/esm/lib/scope/types.d.ts +6 -0
  176. package/dist/esm/lib/scope/types.js +1 -1
  177. package/dist/esm/lib/sinks/fileSink.d.ts +135 -0
  178. package/dist/esm/lib/sinks/fileSink.js +387 -0
  179. package/dist/esm/recorders.d.ts +8 -2
  180. package/dist/esm/recorders.js +7 -1
  181. package/dist/esm/sinks.d.ts +23 -0
  182. package/dist/esm/sinks.js +23 -0
  183. package/dist/esm/trace.d.ts +2 -2
  184. package/dist/esm/trace.js +1 -1
  185. package/dist/index.js +77 -60
  186. package/dist/lib/attempt/anySignal.js +43 -0
  187. package/dist/lib/attempt/call.js +134 -0
  188. package/dist/lib/attempt/category.js +136 -0
  189. package/dist/lib/attempt/correlation.js +186 -0
  190. package/dist/lib/attempt/deadline.js +112 -0
  191. package/dist/lib/attempt/decision.js +139 -0
  192. package/dist/lib/attempt/effect.js +174 -0
  193. package/dist/lib/attempt/errors.js +49 -0
  194. package/dist/lib/attempt/index.js +26 -0
  195. package/dist/lib/attempt/name.js +48 -0
  196. package/dist/lib/attempt/observed.js +177 -0
  197. package/dist/lib/attempt/policy.js +92 -0
  198. package/dist/lib/attempt/record.js +29 -0
  199. package/dist/lib/attempt/retryLoopContext.js +31 -0
  200. package/dist/lib/attempt/retryLoopTypes.js +3 -0
  201. package/dist/lib/attempt/runner.js +530 -0
  202. package/dist/lib/attempt/standalone.js +130 -0
  203. package/dist/lib/attempt/types.js +17 -0
  204. package/dist/lib/budget/index.js +17 -0
  205. package/dist/lib/budget/timeBudget.js +674 -0
  206. package/dist/lib/builder/FlowChartBuilder.js +199 -9
  207. package/dist/lib/builder/retryLoop.js +287 -0
  208. package/dist/lib/builder/types.js +1 -1
  209. package/dist/lib/decide/decide.js +2 -2
  210. package/dist/lib/decide/index.js +2 -2
  211. package/dist/lib/decide/types.js +1 -8
  212. package/dist/lib/engine/graph/StageNode.js +1 -1
  213. package/dist/lib/engine/graph/prefixNodeTree.js +5 -1
  214. package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
  215. package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
  216. package/dist/lib/engine/handlers/ResumeEntry.js +3 -1
  217. package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
  218. package/dist/lib/engine/handlers/StageRunner.js +36 -9
  219. package/dist/lib/engine/handlers/SubflowExecutor.js +24 -5
  220. package/dist/lib/engine/handlers/commitStage.js +24 -5
  221. package/dist/lib/engine/handlers/stageError.js +26 -2
  222. package/dist/lib/engine/index.js +1 -1
  223. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +67 -39
  224. package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
  225. package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +60 -8
  226. package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
  227. package/dist/lib/engine/narrative/formatting/sentences.js +131 -2
  228. package/dist/lib/engine/narrative/index.js +1 -1
  229. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  230. package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
  231. package/dist/lib/engine/narrative/recorders/index.js +1 -1
  232. package/dist/lib/engine/narrative/types.js +1 -1
  233. package/dist/lib/engine/traversal/FlowchartTraverser.js +192 -116
  234. package/dist/lib/engine/traversalContext.js +6 -3
  235. package/dist/lib/engine/types.js +1 -1
  236. package/dist/lib/errors/terminalFailure.js +64 -0
  237. package/dist/lib/filter/evaluator.js +139 -0
  238. package/dist/lib/ids/idempotencyKey.js +28 -0
  239. package/dist/lib/memory/StageContext.js +246 -5
  240. package/dist/lib/memory/attention.js +175 -0
  241. package/dist/lib/memory/borrowedMutation.js +16 -2
  242. package/dist/lib/memory/frameTypes.js +3 -1
  243. package/dist/lib/memory/redaction.js +54 -5
  244. package/dist/lib/pause/record.js +10 -1
  245. package/dist/lib/pause/types.js +17 -1
  246. package/dist/lib/reactive/createTypedScope.js +3 -1
  247. package/dist/lib/reactive/types.js +3 -1
  248. package/dist/lib/recorder/AttemptRecorder.js +417 -0
  249. package/dist/lib/recorder/ControlDepRecorder.js +50 -2
  250. package/dist/lib/recorder/EmitRecorder.js +1 -1
  251. package/dist/lib/recorder/InOutRecorder.js +75 -6
  252. package/dist/lib/recorder/QualityRecorder.js +87 -29
  253. package/dist/lib/recorder/TopologyRecorder.js +76 -2
  254. package/dist/lib/recorder/attemptMetricRows.js +209 -0
  255. package/dist/lib/recorder/attemptMetrics.js +174 -0
  256. package/dist/lib/recorder/attemptMetricsTypes.js +3 -0
  257. package/dist/lib/recorder/attemptOTel.js +111 -0
  258. package/dist/lib/recorder/attemptSeries.js +113 -0
  259. package/dist/lib/recorder/hooks.js +4 -1
  260. package/dist/lib/runner/DeferredObserverTier.js +13 -1
  261. package/dist/lib/runner/ExecutionRuntime.js +57 -5
  262. package/dist/lib/runner/FlowChartExecutor.js +330 -101
  263. package/dist/lib/runner/RunnableChart.js +5 -1
  264. package/dist/lib/runner/attach.js +8 -2
  265. package/dist/lib/runner/checkpoint.js +3 -1
  266. package/dist/lib/runner/deadline.js +94 -0
  267. package/dist/lib/runner/index.js +4 -2
  268. package/dist/lib/runner/options.js +3 -1
  269. package/dist/lib/runner/recordSink.js +302 -0
  270. package/dist/lib/runner/resume.js +22 -2
  271. package/dist/lib/runner/snapshot.js +6 -2
  272. package/dist/lib/scope/ScopeFacade.js +303 -6
  273. package/dist/lib/scope/recorders/DebugRecorder.js +79 -13
  274. package/dist/lib/scope/recorders/MetricRecorder.js +15 -2
  275. package/dist/lib/scope/runtime.js +1 -1
  276. package/dist/lib/scope/types.js +1 -1
  277. package/dist/lib/sinks/fileSink.js +392 -0
  278. package/dist/recorders.js +10 -2
  279. package/dist/sinks.js +32 -0
  280. package/dist/trace.js +1 -1
  281. package/dist/types/index.d.ts +62 -2
  282. package/dist/types/lib/attempt/anySignal.d.ts +19 -0
  283. package/dist/types/lib/attempt/call.d.ts +88 -0
  284. package/dist/types/lib/attempt/category.d.ts +37 -0
  285. package/dist/types/lib/attempt/correlation.d.ts +95 -0
  286. package/dist/types/lib/attempt/deadline.d.ts +44 -0
  287. package/dist/types/lib/attempt/decision.d.ts +52 -0
  288. package/dist/types/lib/attempt/effect.d.ts +76 -0
  289. package/dist/types/lib/attempt/errors.d.ts +41 -0
  290. package/dist/types/lib/attempt/index.d.ts +18 -0
  291. package/dist/types/lib/attempt/name.d.ts +21 -0
  292. package/dist/types/lib/attempt/observed.d.ts +66 -0
  293. package/dist/types/lib/attempt/policy.d.ts +45 -0
  294. package/dist/types/lib/attempt/record.d.ts +11 -0
  295. package/dist/types/lib/attempt/retryLoopContext.d.ts +18 -0
  296. package/dist/types/lib/attempt/retryLoopTypes.d.ts +18 -0
  297. package/dist/types/lib/attempt/runner.d.ts +157 -0
  298. package/dist/types/lib/attempt/standalone.d.ts +47 -0
  299. package/dist/types/lib/attempt/types.d.ts +453 -0
  300. package/dist/types/lib/budget/index.d.ts +9 -0
  301. package/dist/types/lib/budget/timeBudget.d.ts +136 -0
  302. package/dist/types/lib/builder/FlowChartBuilder.d.ts +88 -3
  303. package/dist/types/lib/builder/retryLoop.d.ts +56 -0
  304. package/dist/types/lib/builder/types.d.ts +35 -1
  305. package/dist/types/lib/decide/index.d.ts +1 -1
  306. package/dist/types/lib/decide/types.d.ts +3 -0
  307. package/dist/types/lib/engine/graph/StageNode.d.ts +11 -1
  308. package/dist/types/lib/engine/handlers/StageRunner.d.ts +8 -1
  309. package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
  310. package/dist/types/lib/engine/handlers/stageError.d.ts +9 -0
  311. package/dist/types/lib/engine/index.d.ts +2 -2
  312. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
  313. package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
  314. package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
  315. package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
  316. package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +23 -0
  317. package/dist/types/lib/engine/narrative/index.d.ts +2 -2
  318. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +27 -21
  319. package/dist/types/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
  320. package/dist/types/lib/engine/narrative/recorders/index.d.ts +1 -1
  321. package/dist/types/lib/engine/narrative/types.d.ts +74 -5
  322. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
  323. package/dist/types/lib/engine/traversalContext.d.ts +7 -2
  324. package/dist/types/lib/engine/types.d.ts +52 -57
  325. package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
  326. package/dist/types/lib/{decide → filter}/evaluator.d.ts +7 -2
  327. package/dist/types/lib/ids/idempotencyKey.d.ts +14 -0
  328. package/dist/types/lib/memory/StageContext.d.ts +123 -3
  329. package/dist/types/lib/memory/attention.d.ts +26 -0
  330. package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
  331. package/dist/types/lib/memory/frameTypes.d.ts +38 -0
  332. package/dist/types/lib/memory/redaction.d.ts +12 -0
  333. package/dist/types/lib/pause/types.d.ts +19 -0
  334. package/dist/types/lib/reactive/types.d.ts +36 -4
  335. package/dist/types/lib/recorder/AttemptRecorder.d.ts +141 -0
  336. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +36 -2
  337. package/dist/types/lib/recorder/EmitRecorder.d.ts +3 -0
  338. package/dist/types/lib/recorder/InOutRecorder.d.ts +37 -1
  339. package/dist/types/lib/recorder/QualityRecorder.d.ts +32 -5
  340. package/dist/types/lib/recorder/TopologyRecorder.d.ts +35 -5
  341. package/dist/types/lib/recorder/attemptMetricRows.d.ts +11 -0
  342. package/dist/types/lib/recorder/attemptMetrics.d.ts +7 -0
  343. package/dist/types/lib/recorder/attemptMetricsTypes.d.ts +114 -0
  344. package/dist/types/lib/recorder/attemptOTel.d.ts +78 -0
  345. package/dist/types/lib/recorder/attemptSeries.d.ts +81 -0
  346. package/dist/types/lib/recorder/hooks.d.ts +9 -0
  347. package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
  348. package/dist/types/lib/runner/FlowChartExecutor.d.ts +46 -2
  349. package/dist/types/lib/runner/RunnableChart.d.ts +6 -0
  350. package/dist/types/lib/runner/attach.d.ts +2 -1
  351. package/dist/types/lib/runner/deadline.d.ts +42 -0
  352. package/dist/types/lib/runner/index.d.ts +3 -1
  353. package/dist/types/lib/runner/options.d.ts +17 -0
  354. package/dist/types/lib/runner/recordSink.d.ts +128 -0
  355. package/dist/types/lib/runner/resume.d.ts +3 -0
  356. package/dist/types/lib/runner/snapshot.d.ts +2 -2
  357. package/dist/types/lib/scope/ScopeFacade.d.ts +118 -4
  358. package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +17 -3
  359. package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +10 -0
  360. package/dist/types/lib/scope/runtime.d.ts +3 -0
  361. package/dist/types/lib/scope/types.d.ts +6 -0
  362. package/dist/types/lib/sinks/fileSink.d.ts +135 -0
  363. package/dist/types/recorders.d.ts +8 -2
  364. package/dist/types/sinks.d.ts +23 -0
  365. package/dist/types/trace.d.ts +2 -2
  366. package/package.json +20 -6
  367. package/dist/esm/lib/decide/evaluator.js +0 -130
  368. package/dist/lib/decide/evaluator.js +0 -134
@@ -28,6 +28,17 @@
28
28
  * completing consumes its slot via `onError`, so the post-fan-out
29
29
  * convergence stage is never misattributed as a branch entry.
30
30
  *
31
+ * 3. attempt stops (10.1) — `onAttempt`: a stage whose retry series STOPPED
32
+ * (it gave up, or a later attempt paused or was aborted; the shared
33
+ * predicate `recorder/attemptSeries.ts · isRetryEvidence`) made a decision of its
34
+ * own — the retry-or-stop decision, in the shape `decide()` produces. It
35
+ * is recorded beside the deciders as `kind: 'attempt-stop'`
36
+ * (`getDecisions()`, `getAttemptStop(id)`), `chosen: 'stop'`, the stop
37
+ * reason as its `ruleLabel`. It is NOT a branch entry: a control edge in
38
+ * `causalChain` links a stage to ANOTHER execution that governed it, and
39
+ * the stop governs the stage itself — so `lookup` is unchanged, and a
40
+ * reader walking a failed stage reads the stop off its decision record.
41
+ *
31
42
  * `lookup(runtimeStageId)` then walks the ancestor chain from the stage
32
43
  * upward; the first ancestor (or the stage itself) registered as a
33
44
  * branch entry yields its governing decider — the NEAREST decision.
@@ -56,6 +67,7 @@ import { causalChain } from 'foottrace';
56
67
  */
57
68
  Object.defineProperty(exports, "__esModule", { value: true });
58
69
  exports.ControlDepRecorder = exports.controlDepRecorder = void 0;
70
+ const attemptSeries_js_1 = require("./attemptSeries.js");
59
71
  let _counter = 0;
60
72
  /**
61
73
  * Factory — matches the `topologyRecorder()` / `inOutRecorder()` style.
@@ -102,6 +114,20 @@ class ControlDepRecorder {
102
114
  });
103
115
  this.pending.push({ deciderId, remaining: 1 });
104
116
  }
117
+ onAttempt(event) {
118
+ const ctx = event.traversalContext;
119
+ const { record } = event;
120
+ if (!ctx || record.next !== 'stop' || !(0, attemptSeries_js_1.isRetryEvidence)(record))
121
+ return;
122
+ this.resetIfNewRun(ctx.runId);
123
+ this.decisions.set(record.series, {
124
+ kind: 'attempt-stop',
125
+ deciderRuntimeStageId: record.series,
126
+ chosen: 'stop',
127
+ evidence: record.decision,
128
+ ruleLabel: record.reason,
129
+ });
130
+ }
105
131
  onSelected(event) {
106
132
  const ctx = event.traversalContext;
107
133
  if (!ctx)
@@ -175,10 +201,32 @@ class ControlDepRecorder {
175
201
  asLookup() {
176
202
  return (runtimeStageId) => this.lookup(runtimeStageId);
177
203
  }
178
- /** All decisions recorded for the current run, in event order. */
204
+ /** The attempt-stop decision of a stage execution whose retry series stopped, if it did. */
205
+ getAttemptStop(runtimeStageId) {
206
+ const record = this.decisions.get(runtimeStageId);
207
+ return record?.kind === 'attempt-stop' ? record : undefined;
208
+ }
209
+ /** All decisions recorded for the current run, in event order — deciders, selectors and attempt stops. */
179
210
  getDecisions() {
180
211
  return [...this.decisions.values()];
181
212
  }
213
+ /**
214
+ * Current-run control evidence for the native snapshot. Project only the
215
+ * stage identities collected during traversal; never walk the execution tree.
216
+ * Parentless roots cannot have a governing control edge.
217
+ */
218
+ toSnapshot() {
219
+ const dependencies = [];
220
+ for (const runtimeStageId of this.parentOf.keys()) {
221
+ const dependency = this.lookup(runtimeStageId);
222
+ if (dependency)
223
+ dependencies.push([runtimeStageId, dependency]);
224
+ }
225
+ return {
226
+ name: 'control-dependencies',
227
+ data: { decisions: this.getDecisions(), controlDeps: Object.fromEntries(dependencies) },
228
+ };
229
+ }
182
230
  /** Reset all state (also happens automatically on runId change). */
183
231
  clear() {
184
232
  this.parentOf.clear();
@@ -231,4 +279,4 @@ function matchedRuleLabel(evidence) {
231
279
  const rule = evidence.rules.find((r) => r.matched && r.branch === evidence.chosen) ?? evidence.rules.find((r) => r.matched);
232
280
  return rule?.label;
233
281
  }
234
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbERlcFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9Db250cm9sRGVwUmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzREc7OztBQXlDSCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxVQUFxQyxFQUFFO0lBQ3hFLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRkQsZ0RBRUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBYSxrQkFBa0I7SUFDcEIsRUFBRSxDQUFTO0lBRXBCLDBFQUEwRTtJQUN6RCxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDdEQsMkRBQTJEO0lBQzFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztJQUN0RSxzRUFBc0U7SUFDckQscUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDbkUsaUVBQWlFO0lBQ3pELE9BQU8sR0FBc0IsRUFBRSxDQUFDO0lBQ3hDLHVFQUF1RTtJQUN0RCxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNuRCxnRUFBZ0U7SUFDeEQsU0FBUyxDQUFVO0lBRTNCLFlBQVksVUFBcUMsRUFBRTtRQUNqRCxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVELHlFQUF5RTtJQUV6RSxVQUFVLENBQUMsS0FBd0I7UUFDakMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1FBQ25DLElBQUksQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUNqQixJQUFJLENBQUMs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QUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQztnQkFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEQsT0FBTztRQUNULENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUEvSkQsZ0RBK0pDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxRQUFzQztJQUM5RCxJQUFJLENBQUMsUUFBUTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ2hDLE1BQU0sSUFBSSxHQUNSLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakgsT0FBTyxJQUFJLEVBQUUsS0FBSyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnRyb2xEZXBSZWNvcmRlciDigJQgY29udHJvbC1kZXBlbmRlbmNlIHRyYWNraW5nIGZyb20gZmxvdyBldmVudHMgKFJGQy0wMDMgRDUpLlxuICpcbiAqIFRoZSBnYXAgdGhpcyBmaWxsczpcbiAqICAgVGhlIGJhY2t0cmFja2VyJ3MgYGNvbnRyb2xEZXBzYCBvcHRpb24gKEQzKSBuZWVkcyBhIGBDb250cm9sRGVwTG9va3VwYDpcbiAqICAgXCJ3aGljaCBkZWNpZGVyIGV4ZWN1dGlvbiBhbGxvd2VkIHRoaXMgc3RhZ2UgdG8gcnVuP1wiIFRoZSBlbmdpbmUga25vd3NcbiAqICAgdGhpcyBkdXJpbmcgdHJhdmVyc2FsIGJ1dCB0aGUgY29tbWl0IGxvZyBkb2Vzbid0IHJlY29yZCBpdCDigJQgY29udHJvbFxuICogICBmbG93IGlzIGEgRmxvd1JlY29yZGVyIGNvbmNlcm4uIFRoaXMgcmVjb3JkZXIgaXMgdGhlIHN0YW5kYXJkIHByb2R1Y2VyOlxuICogICBvbmUgc3Vic2NyaXB0aW9uLCBvbmUgbG9va3VwLCBwbHVnIGl0IHN0cmFpZ2h0IGludG8gYGNhdXNhbENoYWluYC5cbiAqXG4gKiBIb3cgaXQgd29ya3Mg4oCUIHR3byBjb3JyZWxhdGlvbiBzdHJ1Y3R1cmVzIGJ1aWx0IGR1cmluZyB0cmF2ZXJzYWw6XG4gKlxuICogICAxLiBgcGFyZW50T2ZgIOKAlCB0aGUgcnVudGltZSBhbmNlc3RvciBjaGFpbiwgZnJvbSBldmVyeSBzdGFnZSBldmVudCdzXG4gKiAgICAgIGB0cmF2ZXJzYWxDb250ZXh0LnBhcmVudFJ1bnRpbWVTdGFnZUlkYCAoUkZDLTAwMyBEMSkuIENyb3NzZXNcbiAqICAgICAgc3ViZmxvdyBib3VuZGFyaWVzOyBsb29wIHJlLWVudHJpZXMgc3RheSB1bmFtYmlndW91cyBiZWNhdXNlXG4gKiAgICAgIHJ1bnRpbWUgaWRzIGRpZmZlciBwZXIgaXRlcmF0aW9uLlxuICpcbiAqICAgMi4gYGJyYW5jaEVudHJ5VG9EZWNpc2lvbmAg4oCUIG9uIGBvbkRlY2lzaW9uYC9gb25TZWxlY3RlZGAgdGhlIGRlY2lzaW9uXG4gKiAgICAgIGlzIHJlY29yZGVkIGFzIFBFTkRJTkc7IHRoZSBuZXh0IHN0YWdlKHMpIGV4ZWN1dGVkIHdob3NlXG4gKiAgICAgIGBwYXJlbnRSdW50aW1lU3RhZ2VJZGAgSVMgdGhlIGRlY2lkZXIncyBydW50aW1lU3RhZ2VJZCBhcmUgaXRzXG4gKiAgICAgIGJyYW5jaCBlbnRyaWVzICgxIGZvciBhIGRlY2lkZXIsIE4gPSBzZWxlY3RlZC5sZW5ndGggZm9yIGFcbiAqICAgICAgc2VsZWN0b3IpLiBDb3JyZWxhdGlvbiBpcyBieSBwYXJlbnQtaWQgKyBjb3VudCwgTk9UIGJ5IHN0YWdlIG5hbWUg4oCUXG4gKiAgICAgIHN1YmZsb3ctbW91bnQgZXZlbnRzIGNhcnJ5IHBhdGgtcHJlZml4ZWQgaW5uZXItcm9vdCBuYW1lcyB0aGF0XG4gKiAgICAgIGRvbid0IG1hdGNoIGBGbG93RGVjaXNpb25FdmVudC5jaG9zZW5gLCBhbmQgc2VsZWN0b3JzIGVtaXQgYVxuICogICAgICBzeW50aGV0aWMgZm9yayBldmVudCBzaGFyaW5nIHRoZSBzZWxlY3RvcidzIG93biBydW50aW1lU3RhZ2VJZFxuICogICAgICAoZXhjbHVkZWQgdmlhIHRoZSBzZWxmLWlkIGd1YXJkKS4gQSBicmFuY2ggdGhhdCBUSFJPV1MgYmVmb3JlXG4gKiAgICAgIGNvbXBsZXRpbmcgY29uc3VtZXMgaXRzIHNsb3QgdmlhIGBvbkVycm9yYCwgc28gdGhlIHBvc3QtZmFuLW91dFxuICogICAgICBjb252ZXJnZW5jZSBzdGFnZSBpcyBuZXZlciBtaXNhdHRyaWJ1dGVkIGFzIGEgYnJhbmNoIGVudHJ5LlxuICpcbiAqICAgYGxvb2t1cChydW50aW1lU3RhZ2VJZClgIHRoZW4gd2Fsa3MgdGhlIGFuY2VzdG9yIGNoYWluIGZyb20gdGhlIHN0YWdlXG4gKiAgIHVwd2FyZDsgdGhlIGZpcnN0IGFuY2VzdG9yIChvciB0aGUgc3RhZ2UgaXRzZWxmKSByZWdpc3RlcmVkIGFzIGFcbiAqICAgYnJhbmNoIGVudHJ5IHlpZWxkcyBpdHMgZ292ZXJuaW5nIGRlY2lkZXIg4oCUIHRoZSBORUFSRVNUIGRlY2lzaW9uLlxuICogICBOZXN0ZWQgZGVjaXNpb25zIGNvbXBvc2UgbmF0dXJhbGx5OiB0aGUgYmFja3RyYWNrZXIgZXhwYW5kcyB0aGVcbiAqICAgZGVjaWRlciBub2RlIGFuZCBhc2tzIGFnYWluLlxuICpcbiAqIENvbnZlbnRpb24gNDogc3RhdGUgcmVzZXRzIHdoZW4gYHRyYXZlcnNhbENvbnRleHQucnVuSWRgIGNoYW5nZXMg4oCUIGVhY2hcbiAqIHJ1biAoYW5kIGVhY2ggcmVzdW1lLCB3aGljaCBtaW50cyBhIGZyZXNoIHJ1bklkKSBzdGFydHMgY2xlYW4uIENvbnRyb2xcbiAqIGNoYWlucyB0aGVyZWZvcmUgZG8gTk9UIHN1cnZpdmUgYSBwYXVzZS9yZXN1bWUgYm91bmRhcnk6IHBvc3QtcmVzdW1lXG4gKiBzdGFnZXMgY2Fubm90IHJlc29sdmUgcHJlLXBhdXNlIGRlY2lzaW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgY29udHJvbERlcFJlY29yZGVyIH0gZnJvbSAnZm9vdHByaW50anMvdHJhY2UnO1xuaW1wb3J0IHsgY2F1c2FsQ2hhaW4gfSBmcm9tICdmb290dHJhY2UnO1xuICpcbiAqIGNvbnN0IGN0cmwgPSBjb250cm9sRGVwUmVjb3JkZXIoKTtcbiAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIoY3RybCk7IC8vIGF1dG8tcm91dGVzIHRvIEZsb3dSZWNvcmRlciBjaGFubmVsXG4gKlxuICogYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gKlxuICogY29uc3QgZGFnID0gY2F1c2FsQ2hhaW4oY29tbWl0TG9nLCAnYXBwcm92ZSMyJywga2V5c1JlYWQsIHtcbiAqICAgY29udHJvbERlcHM6IGN0cmwuYXNMb29rdXAoKSxcbiAqIH0pO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb250cm9sRGVwZW5kZW5jeSwgQ29udHJvbERlcExvb2t1cCB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB0eXBlIHsgRGVjaXNpb25FdmlkZW5jZSwgU2VsZWN0aW9uRXZpZGVuY2UgfSBmcm9tICcuLi9kZWNpZGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUge1xuICBGbG93RGVjaXNpb25FdmVudCxcbiAgRmxvd0Vycm9yRXZlbnQsXG4gIEZsb3dSZWNvcmRlcixcbiAgRmxvd1NlbGVjdGVkRXZlbnQsXG4gIEZsb3dTdGFnZUV2ZW50LFxufSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcblxuLyoqIE9uZSByZWNvcmRlZCBkZWNpc2lvbi9zZWxlY3Rpb24gZXZlbnQgKFJGQy0wMDMgRDUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVjaXNpb25SZWNvcmQge1xuICAvKiogcnVudGltZVN0YWdlSWQgb2YgdGhlIGRlY2lkZXIvc2VsZWN0b3IgZXhlY3V0aW9uIHN0ZXAuICovXG4gIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogQ2hvc2VuIGJyYW5jaCBkaXNwbGF5IG5hbWUgKGRlY2lkZXIpIG9yIHNlbGVjdGVkIG5hbWVzIChzZWxlY3RvcikuICovXG4gIGNob3Nlbjogc3RyaW5nIHwgcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBTdHJ1Y3R1cmVkIGV2aWRlbmNlIGZyb20gZGVjaWRlKCkvc2VsZWN0KCksIHdoZW4gdGhlIHN0YWdlIHVzZWQgdGhlbS4gKi9cbiAgZXZpZGVuY2U/OiBEZWNpc2lvbkV2aWRlbmNlIHwgU2VsZWN0aW9uRXZpZGVuY2U7XG4gIC8qKlxuICAgKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCB0aGF0IHByb2R1Y2VkIHRoZSBkZWNpc2lvbiAoZS5nLiAnR29vZCBjcmVkaXQnKS5cbiAgICogRGVjaWRlcnMgb25seSDigJQgYSBzZWxlY3RvciBwaWNrcyBOIGJyYW5jaGVzIGFuZCBubyBzaW5nbGUgbGFiZWxcbiAgICogYXR0cmlidXRlcyB0byBhbGwgb2YgdGhlbSAoaW5zcGVjdCBgZXZpZGVuY2VgIGluc3RlYWQpLlxuICAgKi9cbiAgcnVsZUxhYmVsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyb2xEZXBSZWNvcmRlck9wdGlvbnMge1xuICAvKiogUmVjb3JkZXIgaWQuIERlZmF1bHRzIHRvIGBjb250cm9sLWRlcHMtTmAgKGF1dG8taW5jcmVtZW50ZWQpLiAqL1xuICBpZD86IHN0cmluZztcbn1cblxuLyoqIEEgZGVjaXNpb24gYXdhaXRpbmcgYnJhbmNoLWVudHJ5IGNvcnJlbGF0aW9uLiAqL1xuaW50ZXJmYWNlIFBlbmRpbmdEZWNpc2lvbiB7XG4gIGRlY2lkZXJJZDogc3RyaW5nO1xuICAvKiogSG93IG1hbnkgYnJhbmNoIGVudHJpZXMgYXJlIHN0aWxsIGV4cGVjdGVkIChkZWNpZGVyOiAxLCBzZWxlY3RvcjogTikuICovXG4gIHJlbWFpbmluZzogbnVtYmVyO1xufVxuXG5sZXQgX2NvdW50ZXIgPSAwO1xuXG4vKipcbiAqIEZhY3Rvcnkg4oCUIG1hdGNoZXMgdGhlIGB0b3BvbG9neVJlY29yZGVyKClgIC8gYGluT3V0UmVjb3JkZXIoKWAgc3R5bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cm9sRGVwUmVjb3JkZXIob3B0aW9uczogQ29udHJvbERlcFJlY29yZGVyT3B0aW9ucyA9IHt9KTogQ29udHJvbERlcFJlY29yZGVyIHtcbiAgcmV0dXJuIG5ldyBDb250cm9sRGVwUmVjb3JkZXIob3B0aW9ucyk7XG59XG5cbi8qKlxuICogU3RhdGVmdWwgYWNjdW11bGF0b3IgdGhhdCB3YXRjaGVzIEZsb3dSZWNvcmRlciBldmVudHMgYW5kIGFuc3dlcnNcbiAqIFwid2hpY2ggZGVjaXNpb24gYWxsb3dlZCB0aGlzIHN0YWdlIHRvIHJ1bj9cIiBBdHRhY2ggdmlhXG4gKiBgZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcilgIChvciBgYXR0YWNoRmxvd1JlY29yZGVyYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250cm9sRGVwUmVjb3JkZXIgaW1wbGVtZW50cyBGbG93UmVjb3JkZXIge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKiBSdW50aW1lIGFuY2VzdG9yIGNoYWluOiBydW50aW1lU3RhZ2VJZCDihpIgcGFyZW50UnVudGltZVN0YWdlSWQgKEQxKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRPZiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBSZWNvcmRlZCBkZWNpc2lvbnMsIGtleWVkIGJ5IGRlY2lkZXIgcnVudGltZVN0YWdlSWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVjaXNpb25zID0gbmV3IE1hcDxzdHJpbmcsIENvbnRyb2xEZWNpc2lvblJlY29yZD4oKTtcbiAgLyoqIEJyYW5jaC1lbnRyeSBydW50aW1lU3RhZ2VJZCDihpIgZ292ZXJuaW5nIGRlY2lkZXIgcnVudGltZVN0YWdlSWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYnJhbmNoRW50cnlUb0RlY2lzaW9uID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgLyoqIERlY2lzaW9ucyB3aG9zZSBicmFuY2ggZW50cmllcyBoYXZlIG5vdCBhbGwgYmVlbiBzZWVuIHlldC4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nOiBQZW5kaW5nRGVjaXNpb25bXSA9IFtdO1xuICAvKiogU3RhZ2UgaWRzIHRoYXQgYWxyZWFkeSBjb25zdW1lZCBhIHBlbmRpbmcgc2xvdCAoZW50cnkgT1IgZXJyb3IpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnN1bWVkU2xvdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgLyoqIENvbnZlbnRpb24gNCDigJQgcnVuSWQgb2YgdGhlIHJ1biBjdXJyZW50bHkgYmVpbmcgcmVjb3JkZWQuICovXG4gIHByaXZhdGUgbGFzdFJ1bklkPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IENvbnRyb2xEZXBSZWNvcmRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkID8/IGBjb250cm9sLWRlcHMtJHsrK19jb3VudGVyfWA7XG4gIH1cblxuICAvLyDilIDilIAgRmxvd1JlY29yZGVyIGhvb2tzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIG9uRGVjaXNpb24oZXZlbnQ6IEZsb3dEZWNpc2lvbkV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dDtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuXG4gICAgY29uc3QgZGVjaWRlcklkID0gY3R4LnJ1bnRpbWVTdGFnZUlkO1xuICAgIGNvbnN0IHJ1bGVMYWJlbCA9IG1hdGNoZWRSdWxlTGFiZWwoZXZlbnQuZXZpZGVuY2UpO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChkZWNpZGVySWQsIHtcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogZGVjaWRlcklkLFxuICAgICAgY2hvc2VuOiBldmVudC5jaG9zZW4sXG4gICAgICAuLi4oZXZlbnQuZXZpZGVuY2UgJiYgeyBldmlkZW5jZTogZXZlbnQuZXZpZGVuY2UgfSksXG4gICAgICAuLi4ocnVsZUxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBydWxlTGFiZWwgfSksXG4gICAgfSk7XG4gICAgdGhpcy5wZW5kaW5nLnB1c2goeyBkZWNpZGVySWQsIHJlbWFpbmluZzogMSB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWQoZXZlbnQ6IEZsb3dTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dDtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuICAgIGlmIChldmVudC5zZWxlY3RlZC5sZW5ndGggPT09IDApIHJldHVybjsgLy8gbm90aGluZyBzZWxlY3RlZCDihpIgbm90aGluZyBnb3Zlcm5lZFxuXG4gICAgY29uc3QgZGVjaWRlcklkID0gY3R4LnJ1bnRpbWVTdGFnZUlkO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChkZWNpZGVySWQsIHtcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogZGVjaWRlcklkLFxuICAgICAgY2hvc2VuOiBbLi4uZXZlbnQuc2VsZWN0ZWRdLFxuICAgICAgLi4uKGV2ZW50LmV2aWRlbmNlICYmIHsgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlIH0pLFxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZy5wdXNoKHsgZGVjaWRlcklkLCByZW1haW5pbmc6IGV2ZW50LnNlbGVjdGVkLmxlbmd0aCB9KTtcbiAgfVxuXG4gIG9uU3RhZ2VFeGVjdXRlZChldmVudDogRmxvd1N0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSBldmVudC50cmF2ZXJzYWxDb250ZXh0O1xuICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgdGhpcy5yZXNldElmTmV3UnVuKGN0eC5ydW5JZCk7XG5cbiAgICBjb25zdCB7IHJ1bnRpbWVTdGFnZUlkLCBwYXJlbnRSdW50aW1lU3RhZ2VJZCB9ID0gY3R4O1xuICAgIGlmIChwYXJlbnRSdW50aW1lU3RhZ2VJZCkge1xuICAgICAgdGhpcy5wYXJlbnRPZi5zZXQocnVudGltZVN0YWdlSWQsIHBhcmVudFJ1bnRpbWVTdGFnZUlkKTtcbiAgICAgIHRoaXMuY29uc3VtZVBlbmRpbmdTbG90KHJ1bnRpbWVTdGFnZUlkLCBwYXJlbnRSdW50aW1lU3RhZ2VJZCwgLyogcmVnaXN0ZXIgKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgYnJhbmNoIHRoYXQgdGhyb3dzIG5ldmVyIGZpcmVzIGBvblN0YWdlRXhlY3V0ZWRgIOKAlCB3aXRob3V0IHRoaXMgaG9va1xuICAgKiBpdHMgcGVuZGluZyBzbG90IHdvdWxkIGxlYWsgYW5kIHRoZSBwb3N0LWZhbi1vdXQgY29udmVyZ2VuY2Ugc3RhZ2VcbiAgICogKHdob3NlIGNvbnRleHQgYWxzbyBjaGFpbnMgdG8gdGhlIHNlbGVjdG9yKSB3b3VsZCBiZSBtaXNhdHRyaWJ1dGVkIGFzXG4gICAqIGEgYnJhbmNoIGVudHJ5IHVuZGVyIGJlc3QtZWZmb3J0IChgZmFpbEZhc3Q6IGZhbHNlYCkgZmFuLW91dHMuXG4gICAqL1xuICBvbkVycm9yKGV2ZW50OiBGbG93RXJyb3JFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0SWZOZXdSdW4oY3R4LnJ1bklkKTtcbiAgICBpZiAoY3R4LnBhcmVudFJ1bnRpbWVTdGFnZUlkKSB7XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYWluIEFORCBhdHRyaWJ1dGUgdGhlIGZhaWxlZCBzdGFnZSB0byBpdHMgZGVjaXNpb24g4oCUXG4gICAgICAvLyB0aGUgc3RhZ2UgUkFOIChhbmQgbWF5IGhhdmUgY29tbWl0dGVkIHBhcnRpYWwgd3JpdGVzKSBiZWNhdXNlIHRoZVxuICAgICAgLy8gZGVjaXNpb24gY2hvc2UgaXQ7IGZhaWxpbmcgYWZ0ZXJ3YXJkcyBkb2Vzbid0IHVuZG8gdGhlIGRlcGVuZGVuY3kuXG4gICAgICB0aGlzLnBhcmVudE9mLnNldChjdHgucnVudGltZVN0YWdlSWQsIGN0eC5wYXJlbnRSdW50aW1lU3RhZ2VJZCk7XG4gICAgICB0aGlzLmNvbnN1bWVQZW5kaW5nU2xvdChjdHgucnVudGltZVN0YWdlSWQsIGN0eC5wYXJlbnRSdW50aW1lU3RhZ2VJZCwgLyogcmVnaXN0ZXIgKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXJpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIE5FQVJFU1QgZ292ZXJuaW5nIGRlY2lzaW9uIGZvciBhbiBleGVjdXRpb24gc3RlcDogd2Fsa3MgdGhlXG4gICAqIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW4gKHRoZSBzdGVwIGl0c2VsZiBmaXJzdCkgdW50aWwgaXQgaGl0cyBhXG4gICAqIHJlZ2lzdGVyZWQgYnJhbmNoIGVudHJ5LiBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzdGVwIGlzIG5vdCBkb3duc3RyZWFtIG9mXG4gICAqIGFueSByZWNvcmRlZCBkZWNpc2lvbi5cbiAgICovXG4gIGxvb2t1cChydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgY3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBydW50aW1lU3RhZ2VJZDtcbiAgICB3aGlsZSAoY3VyICE9PSB1bmRlZmluZWQgJiYgIXNlZW4uaGFzKGN1cikpIHtcbiAgICAgIHNlZW4uYWRkKGN1cik7XG4gICAgICBjb25zdCBkZWNpZGVySWQgPSB0aGlzLmJyYW5jaEVudHJ5VG9EZWNpc2lvbi5nZXQoY3VyKTtcbiAgICAgIGlmIChkZWNpZGVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmRlY2lzaW9ucy5nZXQoZGVjaWRlcklkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkZWNpZGVySWQsXG4gICAgICAgICAgLi4uKHJlY29yZD8ucnVsZUxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBsYWJlbDogcmVjb3JkLnJ1bGVMYWJlbCB9KSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGN1ciA9IHRoaXMucGFyZW50T2YuZ2V0KGN1cik7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVGhlIGxvb2t1cCBhcyBhIGJhcmUgZnVuY3Rpb24g4oCUIHBsdWcgaW50byBgY2F1c2FsQ2hhaW4oLi4uLCB7IGNvbnRyb2xEZXBzIH0pYC4gKi9cbiAgYXNMb29rdXAoKTogQ29udHJvbERlcExvb2t1cCB7XG4gICAgcmV0dXJuIChydW50aW1lU3RhZ2VJZCkgPT4gdGhpcy5sb29rdXAocnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIEFsbCBkZWNpc2lvbnMgcmVjb3JkZWQgZm9yIHRoZSBjdXJyZW50IHJ1biwgaW4gZXZlbnQgb3JkZXIuICovXG4gIGdldERlY2lzaW9ucygpOiBDb250cm9sRGVjaXNpb25SZWNvcmRbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmRlY2lzaW9ucy52YWx1ZXMoKV07XG4gIH1cblxuICAvKiogUmVzZXQgYWxsIHN0YXRlIChhbHNvIGhhcHBlbnMgYXV0b21hdGljYWxseSBvbiBydW5JZCBjaGFuZ2UpLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnBhcmVudE9mLmNsZWFyKCk7XG4gICAgdGhpcy5kZWNpc2lvbnMuY2xlYXIoKTtcbiAgICB0aGlzLmJyYW5jaEVudHJ5VG9EZWNpc2lvbi5jbGVhcigpO1xuICAgIHRoaXMucGVuZGluZyA9IFtdO1xuICAgIHRoaXMuY29uc3VtZWRTbG90cy5jbGVhcigpO1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVybmFscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQ29udmVudGlvbiA0OiBhIG5ldyBydW5JZCBtZWFucyBhIG5ldyBydW4g4oCUIHJlc2V0IHRyYW5zaWVudCBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSByZXNldElmTmV3UnVuKHJ1bklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAocnVuSWQgPT09IHRoaXMubGFzdFJ1bklkKSByZXR1cm47XG4gICAgdGhpcy5jbGVhcigpO1xuICAgIHRoaXMubGFzdFJ1bklkID0gcnVuSWQ7XG4gIH1cblxuICAvKipcbiAgICogSWYgYHBhcmVudFJ1bnRpbWVTdGFnZUlkYCBpcyBhIGRlY2lkZXIgd2l0aCBhbiB1bm1hdGNoZWQgcGVuZGluZyBzbG90LFxuICAgKiBjb25zdW1lIG9uZS4gYHJlZ2lzdGVyYCBjb250cm9scyB3aGV0aGVyIHRoZSBzdGFnZSBpcyByZWNvcmRlZCBhcyBhXG4gICAqIGJyYW5jaCBlbnRyeSAoc3RhZ2UgZXhlY3V0ZWQvZXJyb3JlZCkg4oCUIGJvdGggcGF0aHMgY29uc3VtZSB0aGUgc2xvdCBzb1xuICAgKiBjb3VudHMgc3RheSBleGFjdCBldmVuIHdoZW4gYSBzdGFnZSBwcm9kdWNlcyBib3RoIGV2ZW50cy5cbiAgICovXG4gIHByaXZhdGUgY29uc3VtZVBlbmRpbmdTbG90KHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIHBhcmVudFJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcsIHJlZ2lzdGVyOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHJ1bnRpbWVTdGFnZUlkID09PSBwYXJlbnRSdW50aW1lU3RhZ2VJZCkgcmV0dXJuOyAvLyBzeW50aGV0aWMgc2VsZi1ldmVudHNcbiAgICBpZiAodGhpcy5jb25zdW1lZFNsb3RzLmhhcyhydW50aW1lU3RhZ2VJZCkpIHJldHVybjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wZW5kaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwID0gdGhpcy5wZW5kaW5nW2ldO1xuICAgICAgaWYgKHAuZGVjaWRlcklkICE9PSBwYXJlbnRSdW50aW1lU3RhZ2VJZCkgY29udGludWU7XG5cbiAgICAgIHRoaXMuY29uc3VtZWRTbG90cy5hZGQocnVudGltZVN0YWdlSWQpO1xuICAgICAgaWYgKHJlZ2lzdGVyKSB0aGlzLmJyYW5jaEVudHJ5VG9EZWNpc2lvbi5zZXQocnVudGltZVN0YWdlSWQsIHAuZGVjaWRlcklkKTtcbiAgICAgIHAucmVtYWluaW5nLS07XG4gICAgICBpZiAocC5yZW1haW5pbmcgPD0gMCkgdGhpcy5wZW5kaW5nLnNwbGljZShpLCAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgZGVjaWRlKCkgcnVsZSBsYWJlbCB0aGF0IHByb2R1Y2VkIHRoZSBkZWNpc2lvbjogdGhlIG1hdGNoZWQgcnVsZVxuICogbWFwcGluZyB0byB0aGUgY2hvc2VuIGJyYW5jaCAoZmlyc3QgbWF0Y2hlZCBydWxlIGFzIGZhbGxiYWNrKS5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hlZFJ1bGVMYWJlbChldmlkZW5jZTogRGVjaXNpb25FdmlkZW5jZSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghZXZpZGVuY2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJ1bGUgPVxuICAgIGV2aWRlbmNlLnJ1bGVzLmZpbmQoKHIpID0+IHIubWF0Y2hlZCAmJiByLmJyYW5jaCA9PT0gZXZpZGVuY2UuY2hvc2VuKSA/PyBldmlkZW5jZS5ydWxlcy5maW5kKChyKSA9PiByLm1hdGNoZWQpO1xuICByZXR1cm4gcnVsZT8ubGFiZWw7XG59XG4iXX0=
282
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbERlcFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9Db250cm9sRGVwUmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlFRzs7O0FBYUgseURBQXFEO0FBb0NyRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFFakI7O0dBRUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxVQUFxQyxFQUFFO0lBQ3hFLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRkQsZ0RBRUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBYSxrQkFBa0I7SUFDcEIsRUFBRSxDQUFTO0lBRXBCLDBFQUEwRTtJQUN6RCxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDdEQsMkRBQTJEO0lBQzFDLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztJQUN0RSxzRUFBc0U7SUFDckQscUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFDbkUsaUVBQWlFO0lBQ3pELE9BQU8sR0FBc0IsRUFBRSxDQUFDO0lBQ3hDLHVFQUF1RTtJQUN0RCxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNuRCxnRUFBZ0U7SUFDeEQsU0FBUyxDQUFVO0lBRTNCLFlBQVksVUFBcUMsRUFBRTtRQUNqRCxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVELHlFQUF5RTtJQUV6RSxVQUFVLENBQUMsS0FBd0I7UUFDakMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDO1FBQ25DLElBQUksQ0FBQyxHQUFHO1lB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QUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLG9CQUFvQjtnQkFBRSxTQUFTO1lBRW5ELElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksUUFBUTtnQkFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUM7Z0JBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hELE9BQU87UUFDVCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBcE1ELGdEQW9NQztBQUVEOzs7R0FHRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsUUFBc0M7SUFDOUQsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNoQyxNQUFNLElBQUksR0FDUixRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pILE9BQU8sSUFBSSxFQUFFLEtBQUssQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250cm9sRGVwUmVjb3JkZXIg4oCUIGNvbnRyb2wtZGVwZW5kZW5jZSB0cmFja2luZyBmcm9tIGZsb3cgZXZlbnRzIChSRkMtMDAzIEQ1KS5cbiAqXG4gKiBUaGUgZ2FwIHRoaXMgZmlsbHM6XG4gKiAgIFRoZSBiYWNrdHJhY2tlcidzIGBjb250cm9sRGVwc2Agb3B0aW9uIChEMykgbmVlZHMgYSBgQ29udHJvbERlcExvb2t1cGA6XG4gKiAgIFwid2hpY2ggZGVjaWRlciBleGVjdXRpb24gYWxsb3dlZCB0aGlzIHN0YWdlIHRvIHJ1bj9cIiBUaGUgZW5naW5lIGtub3dzXG4gKiAgIHRoaXMgZHVyaW5nIHRyYXZlcnNhbCBidXQgdGhlIGNvbW1pdCBsb2cgZG9lc24ndCByZWNvcmQgaXQg4oCUIGNvbnRyb2xcbiAqICAgZmxvdyBpcyBhIEZsb3dSZWNvcmRlciBjb25jZXJuLiBUaGlzIHJlY29yZGVyIGlzIHRoZSBzdGFuZGFyZCBwcm9kdWNlcjpcbiAqICAgb25lIHN1YnNjcmlwdGlvbiwgb25lIGxvb2t1cCwgcGx1ZyBpdCBzdHJhaWdodCBpbnRvIGBjYXVzYWxDaGFpbmAuXG4gKlxuICogSG93IGl0IHdvcmtzIOKAlCB0d28gY29ycmVsYXRpb24gc3RydWN0dXJlcyBidWlsdCBkdXJpbmcgdHJhdmVyc2FsOlxuICpcbiAqICAgMS4gYHBhcmVudE9mYCDigJQgdGhlIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW4sIGZyb20gZXZlcnkgc3RhZ2UgZXZlbnQnc1xuICogICAgICBgdHJhdmVyc2FsQ29udGV4dC5wYXJlbnRSdW50aW1lU3RhZ2VJZGAgKFJGQy0wMDMgRDEpLiBDcm9zc2VzXG4gKiAgICAgIHN1YmZsb3cgYm91bmRhcmllczsgbG9vcCByZS1lbnRyaWVzIHN0YXkgdW5hbWJpZ3VvdXMgYmVjYXVzZVxuICogICAgICBydW50aW1lIGlkcyBkaWZmZXIgcGVyIGl0ZXJhdGlvbi5cbiAqXG4gKiAgIDIuIGBicmFuY2hFbnRyeVRvRGVjaXNpb25gIOKAlCBvbiBgb25EZWNpc2lvbmAvYG9uU2VsZWN0ZWRgIHRoZSBkZWNpc2lvblxuICogICAgICBpcyByZWNvcmRlZCBhcyBQRU5ESU5HOyB0aGUgbmV4dCBzdGFnZShzKSBleGVjdXRlZCB3aG9zZVxuICogICAgICBgcGFyZW50UnVudGltZVN0YWdlSWRgIElTIHRoZSBkZWNpZGVyJ3MgcnVudGltZVN0YWdlSWQgYXJlIGl0c1xuICogICAgICBicmFuY2ggZW50cmllcyAoMSBmb3IgYSBkZWNpZGVyLCBOID0gc2VsZWN0ZWQubGVuZ3RoIGZvciBhXG4gKiAgICAgIHNlbGVjdG9yKS4gQ29ycmVsYXRpb24gaXMgYnkgcGFyZW50LWlkICsgY291bnQsIE5PVCBieSBzdGFnZSBuYW1lIOKAlFxuICogICAgICBzdWJmbG93LW1vdW50IGV2ZW50cyBjYXJyeSBwYXRoLXByZWZpeGVkIGlubmVyLXJvb3QgbmFtZXMgdGhhdFxuICogICAgICBkb24ndCBtYXRjaCBgRmxvd0RlY2lzaW9uRXZlbnQuY2hvc2VuYCwgYW5kIHNlbGVjdG9ycyBlbWl0IGFcbiAqICAgICAgc3ludGhldGljIGZvcmsgZXZlbnQgc2hhcmluZyB0aGUgc2VsZWN0b3IncyBvd24gcnVudGltZVN0YWdlSWRcbiAqICAgICAgKGV4Y2x1ZGVkIHZpYSB0aGUgc2VsZi1pZCBndWFyZCkuIEEgYnJhbmNoIHRoYXQgVEhST1dTIGJlZm9yZVxuICogICAgICBjb21wbGV0aW5nIGNvbnN1bWVzIGl0cyBzbG90IHZpYSBgb25FcnJvcmAsIHNvIHRoZSBwb3N0LWZhbi1vdXRcbiAqICAgICAgY29udmVyZ2VuY2Ugc3RhZ2UgaXMgbmV2ZXIgbWlzYXR0cmlidXRlZCBhcyBhIGJyYW5jaCBlbnRyeS5cbiAqXG4gKiAgIDMuIGF0dGVtcHQgc3RvcHMgKDEwLjEpIOKAlCBgb25BdHRlbXB0YDogYSBzdGFnZSB3aG9zZSByZXRyeSBzZXJpZXMgU1RPUFBFRFxuICogICAgICAoaXQgZ2F2ZSB1cCwgb3IgYSBsYXRlciBhdHRlbXB0IHBhdXNlZCBvciB3YXMgYWJvcnRlZDsgdGhlIHNoYXJlZFxuICogICAgICBwcmVkaWNhdGUgYHJlY29yZGVyL2F0dGVtcHRTZXJpZXMudHMgwrcgaXNSZXRyeUV2aWRlbmNlYCkgbWFkZSBhIGRlY2lzaW9uIG9mIGl0c1xuICogICAgICBvd24g4oCUIHRoZSByZXRyeS1vci1zdG9wIGRlY2lzaW9uLCBpbiB0aGUgc2hhcGUgYGRlY2lkZSgpYCBwcm9kdWNlcy4gSXRcbiAqICAgICAgaXMgcmVjb3JkZWQgYmVzaWRlIHRoZSBkZWNpZGVycyBhcyBga2luZDogJ2F0dGVtcHQtc3RvcCdgXG4gKiAgICAgIChgZ2V0RGVjaXNpb25zKClgLCBgZ2V0QXR0ZW1wdFN0b3AoaWQpYCksIGBjaG9zZW46ICdzdG9wJ2AsIHRoZSBzdG9wXG4gKiAgICAgIHJlYXNvbiBhcyBpdHMgYHJ1bGVMYWJlbGAuIEl0IGlzIE5PVCBhIGJyYW5jaCBlbnRyeTogYSBjb250cm9sIGVkZ2UgaW5cbiAqICAgICAgYGNhdXNhbENoYWluYCBsaW5rcyBhIHN0YWdlIHRvIEFOT1RIRVIgZXhlY3V0aW9uIHRoYXQgZ292ZXJuZWQgaXQsIGFuZFxuICogICAgICB0aGUgc3RvcCBnb3Zlcm5zIHRoZSBzdGFnZSBpdHNlbGYg4oCUIHNvIGBsb29rdXBgIGlzIHVuY2hhbmdlZCwgYW5kIGFcbiAqICAgICAgcmVhZGVyIHdhbGtpbmcgYSBmYWlsZWQgc3RhZ2UgcmVhZHMgdGhlIHN0b3Agb2ZmIGl0cyBkZWNpc2lvbiByZWNvcmQuXG4gKlxuICogICBgbG9va3VwKHJ1bnRpbWVTdGFnZUlkKWAgdGhlbiB3YWxrcyB0aGUgYW5jZXN0b3IgY2hhaW4gZnJvbSB0aGUgc3RhZ2VcbiAqICAgdXB3YXJkOyB0aGUgZmlyc3QgYW5jZXN0b3IgKG9yIHRoZSBzdGFnZSBpdHNlbGYpIHJlZ2lzdGVyZWQgYXMgYVxuICogICBicmFuY2ggZW50cnkgeWllbGRzIGl0cyBnb3Zlcm5pbmcgZGVjaWRlciDigJQgdGhlIE5FQVJFU1QgZGVjaXNpb24uXG4gKiAgIE5lc3RlZCBkZWNpc2lvbnMgY29tcG9zZSBuYXR1cmFsbHk6IHRoZSBiYWNrdHJhY2tlciBleHBhbmRzIHRoZVxuICogICBkZWNpZGVyIG5vZGUgYW5kIGFza3MgYWdhaW4uXG4gKlxuICogQ29udmVudGlvbiA0OiBzdGF0ZSByZXNldHMgd2hlbiBgdHJhdmVyc2FsQ29udGV4dC5ydW5JZGAgY2hhbmdlcyDigJQgZWFjaFxuICogcnVuIChhbmQgZWFjaCByZXN1bWUsIHdoaWNoIG1pbnRzIGEgZnJlc2ggcnVuSWQpIHN0YXJ0cyBjbGVhbi4gQ29udHJvbFxuICogY2hhaW5zIHRoZXJlZm9yZSBkbyBOT1Qgc3Vydml2ZSBhIHBhdXNlL3Jlc3VtZSBib3VuZGFyeTogcG9zdC1yZXN1bWVcbiAqIHN0YWdlcyBjYW5ub3QgcmVzb2x2ZSBwcmUtcGF1c2UgZGVjaXNpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBjb250cm9sRGVwUmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG5pbXBvcnQgeyBjYXVzYWxDaGFpbiB9IGZyb20gJ2Zvb3R0cmFjZSc7XG4gKlxuICogY29uc3QgY3RybCA9IGNvbnRyb2xEZXBSZWNvcmRlcigpO1xuICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihjdHJsKTsgLy8gYXV0by1yb3V0ZXMgdG8gRmxvd1JlY29yZGVyIGNoYW5uZWxcbiAqXG4gKiBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAqXG4gKiBjb25zdCBkYWcgPSBjYXVzYWxDaGFpbihjb21taXRMb2csICdhcHByb3ZlIzInLCBrZXlzUmVhZCwge1xuICogICBjb250cm9sRGVwczogY3RybC5hc0xvb2t1cCgpLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbnRyb2xEZXBlbmRlbmN5LCBDb250cm9sRGVwTG9va3VwIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBEZWNpc2lvbkV2aWRlbmNlLCBTZWxlY3Rpb25FdmlkZW5jZSB9IGZyb20gJy4uL2RlY2lkZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZsb3dBdHRlbXB0RXZlbnQsXG4gIEZsb3dEZWNpc2lvbkV2ZW50LFxuICBGbG93RXJyb3JFdmVudCxcbiAgRmxvd1JlY29yZGVyLFxuICBGbG93U2VsZWN0ZWRFdmVudCxcbiAgRmxvd1N0YWdlRXZlbnQsXG59IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNSZXRyeUV2aWRlbmNlIH0gZnJvbSAnLi9hdHRlbXB0U2VyaWVzLmpzJztcblxuLyoqIE9uZSByZWNvcmRlZCBkZWNpc2lvbi9zZWxlY3Rpb24gZXZlbnQgKFJGQy0wMDMgRDUpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVjaXNpb25SZWNvcmQge1xuICAvKipcbiAgICogYCdhdHRlbXB0LXN0b3AnYCBmb3IgYSBzdGFnZSdzIG93biByZXRyeS1vci1zdG9wIGRlY2lzaW9uIHRoYXQgU1RPUFBFRCBpdHMgc2VyaWVzICgxMC4xKSDigJQgdGhlblxuICAgKiBgZGVjaWRlclJ1bnRpbWVTdGFnZUlkYCBpcyB0aGUgc3RhZ2UncyBleGVjdXRpb24sIGBjaG9zZW5gIGlzIGAnc3RvcCdgLCBgZXZpZGVuY2VgIHRoZSBhdHRlbXB0J3MgZGVjaXNpb24gYW5kXG4gICAqIGBydWxlTGFiZWxgIHRoZSBzdG9wIHJlYXNvbi4gQWJzZW50IGZvciBhIGRlY2lkZXIgLyBzZWxlY3Rvci5cbiAgICovXG4gIGtpbmQ/OiAnYXR0ZW1wdC1zdG9wJztcbiAgLyoqIHJ1bnRpbWVTdGFnZUlkIG9mIHRoZSBkZWNpZGVyL3NlbGVjdG9yIGV4ZWN1dGlvbiBzdGVwLiAqL1xuICBkZWNpZGVyUnVudGltZVN0YWdlSWQ6IHN0cmluZztcbiAgLyoqIENob3NlbiBicmFuY2ggZGlzcGxheSBuYW1lIChkZWNpZGVyKSBvciBzZWxlY3RlZCBuYW1lcyAoc2VsZWN0b3IpLiAqL1xuICBjaG9zZW46IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogU3RydWN0dXJlZCBldmlkZW5jZSBmcm9tIGRlY2lkZSgpL3NlbGVjdCgpLCB3aGVuIHRoZSBzdGFnZSB1c2VkIHRoZW0uICovXG4gIGV2aWRlbmNlPzogRGVjaXNpb25FdmlkZW5jZSB8IFNlbGVjdGlvbkV2aWRlbmNlO1xuICAvKipcbiAgICogVGhlIGRlY2lkZSgpIHJ1bGUgbGFiZWwgdGhhdCBwcm9kdWNlZCB0aGUgZGVjaXNpb24gKGUuZy4gJ0dvb2QgY3JlZGl0JykuXG4gICAqIERlY2lkZXJzIG9ubHkg4oCUIGEgc2VsZWN0b3IgcGlja3MgTiBicmFuY2hlcyBhbmQgbm8gc2luZ2xlIGxhYmVsXG4gICAqIGF0dHJpYnV0ZXMgdG8gYWxsIG9mIHRoZW0gKGluc3BlY3QgYGV2aWRlbmNlYCBpbnN0ZWFkKS5cbiAgICovXG4gIHJ1bGVMYWJlbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250cm9sRGVwUmVjb3JkZXJPcHRpb25zIHtcbiAgLyoqIFJlY29yZGVyIGlkLiBEZWZhdWx0cyB0byBgY29udHJvbC1kZXBzLU5gIChhdXRvLWluY3JlbWVudGVkKS4gKi9cbiAgaWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBBIGRlY2lzaW9uIGF3YWl0aW5nIGJyYW5jaC1lbnRyeSBjb3JyZWxhdGlvbi4gKi9cbmludGVyZmFjZSBQZW5kaW5nRGVjaXNpb24ge1xuICBkZWNpZGVySWQ6IHN0cmluZztcbiAgLyoqIEhvdyBtYW55IGJyYW5jaCBlbnRyaWVzIGFyZSBzdGlsbCBleHBlY3RlZCAoZGVjaWRlcjogMSwgc2VsZWN0b3I6IE4pLiAqL1xuICByZW1haW5pbmc6IG51bWJlcjtcbn1cblxubGV0IF9jb3VudGVyID0gMDtcblxuLyoqXG4gKiBGYWN0b3J5IOKAlCBtYXRjaGVzIHRoZSBgdG9wb2xvZ3lSZWNvcmRlcigpYCAvIGBpbk91dFJlY29yZGVyKClgIHN0eWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJvbERlcFJlY29yZGVyKG9wdGlvbnM6IENvbnRyb2xEZXBSZWNvcmRlck9wdGlvbnMgPSB7fSk6IENvbnRyb2xEZXBSZWNvcmRlciB7XG4gIHJldHVybiBuZXcgQ29udHJvbERlcFJlY29yZGVyKG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFN0YXRlZnVsIGFjY3VtdWxhdG9yIHRoYXQgd2F0Y2hlcyBGbG93UmVjb3JkZXIgZXZlbnRzIGFuZCBhbnN3ZXJzXG4gKiBcIndoaWNoIGRlY2lzaW9uIGFsbG93ZWQgdGhpcyBzdGFnZSB0byBydW4/XCIgQXR0YWNoIHZpYVxuICogYGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIocmVjb3JkZXIpYCAob3IgYGF0dGFjaEZsb3dSZWNvcmRlcmApLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbERlcFJlY29yZGVyIGltcGxlbWVudHMgRmxvd1JlY29yZGVyIHtcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcblxuICAvKiogUnVudGltZSBhbmNlc3RvciBjaGFpbjogcnVudGltZVN0YWdlSWQg4oaSIHBhcmVudFJ1bnRpbWVTdGFnZUlkIChEMSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50T2YgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAvKiogUmVjb3JkZWQgZGVjaXNpb25zLCBrZXllZCBieSBkZWNpZGVyIHJ1bnRpbWVTdGFnZUlkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRlY2lzaW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBDb250cm9sRGVjaXNpb25SZWNvcmQ+KCk7XG4gIC8qKiBCcmFuY2gtZW50cnkgcnVudGltZVN0YWdlSWQg4oaSIGdvdmVybmluZyBkZWNpZGVyIHJ1bnRpbWVTdGFnZUlkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaEVudHJ5VG9EZWNpc2lvbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIC8qKiBEZWNpc2lvbnMgd2hvc2UgYnJhbmNoIGVudHJpZXMgaGF2ZSBub3QgYWxsIGJlZW4gc2VlbiB5ZXQuICovXG4gIHByaXZhdGUgcGVuZGluZzogUGVuZGluZ0RlY2lzaW9uW10gPSBbXTtcbiAgLyoqIFN0YWdlIGlkcyB0aGF0IGFscmVhZHkgY29uc3VtZWQgYSBwZW5kaW5nIHNsb3QgKGVudHJ5IE9SIGVycm9yKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjb25zdW1lZFNsb3RzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIC8qKiBDb252ZW50aW9uIDQg4oCUIHJ1bklkIG9mIHRoZSBydW4gY3VycmVudGx5IGJlaW5nIHJlY29yZGVkLiAqL1xuICBwcml2YXRlIGxhc3RSdW5JZD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb250cm9sRGVwUmVjb3JkZXJPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLmlkID0gb3B0aW9ucy5pZCA/PyBgY29udHJvbC1kZXBzLSR7KytfY291bnRlcn1gO1xuICB9XG5cbiAgLy8g4pSA4pSAIEZsb3dSZWNvcmRlciBob29rcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBvbkRlY2lzaW9uKGV2ZW50OiBGbG93RGVjaXNpb25FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0SWZOZXdSdW4oY3R4LnJ1bklkKTtcblxuICAgIGNvbnN0IGRlY2lkZXJJZCA9IGN0eC5ydW50aW1lU3RhZ2VJZDtcbiAgICBjb25zdCBydWxlTGFiZWwgPSBtYXRjaGVkUnVsZUxhYmVsKGV2ZW50LmV2aWRlbmNlKTtcbiAgICB0aGlzLmRlY2lzaW9ucy5zZXQoZGVjaWRlcklkLCB7XG4gICAgICBkZWNpZGVyUnVudGltZVN0YWdlSWQ6IGRlY2lkZXJJZCxcbiAgICAgIGNob3NlbjogZXZlbnQuY2hvc2VuLFxuICAgICAgLi4uKGV2ZW50LmV2aWRlbmNlICYmIHsgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlIH0pLFxuICAgICAgLi4uKHJ1bGVMYWJlbCAhPT0gdW5kZWZpbmVkICYmIHsgcnVsZUxhYmVsIH0pLFxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZy5wdXNoKHsgZGVjaWRlcklkLCByZW1haW5pbmc6IDEgfSk7XG4gIH1cblxuICBvbkF0dGVtcHQoZXZlbnQ6IEZsb3dBdHRlbXB0RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSBldmVudC50cmF2ZXJzYWxDb250ZXh0O1xuICAgIGNvbnN0IHsgcmVjb3JkIH0gPSBldmVudDtcbiAgICBpZiAoIWN0eCB8fCByZWNvcmQubmV4dCAhPT0gJ3N0b3AnIHx8ICFpc1JldHJ5RXZpZGVuY2UocmVjb3JkKSkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChyZWNvcmQuc2VyaWVzLCB7XG4gICAgICBraW5kOiAnYXR0ZW1wdC1zdG9wJyxcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogcmVjb3JkLnNlcmllcyxcbiAgICAgIGNob3NlbjogJ3N0b3AnLFxuICAgICAgZXZpZGVuY2U6IHJlY29yZC5kZWNpc2lvbixcbiAgICAgIHJ1bGVMYWJlbDogcmVjb3JkLnJlYXNvbixcbiAgICB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0ZWQoZXZlbnQ6IEZsb3dTZWxlY3RlZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gZXZlbnQudHJhdmVyc2FsQ29udGV4dDtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIHRoaXMucmVzZXRJZk5ld1J1bihjdHgucnVuSWQpO1xuICAgIGlmIChldmVudC5zZWxlY3RlZC5sZW5ndGggPT09IDApIHJldHVybjsgLy8gbm90aGluZyBzZWxlY3RlZCDihpIgbm90aGluZyBnb3Zlcm5lZFxuXG4gICAgY29uc3QgZGVjaWRlcklkID0gY3R4LnJ1bnRpbWVTdGFnZUlkO1xuICAgIHRoaXMuZGVjaXNpb25zLnNldChkZWNpZGVySWQsIHtcbiAgICAgIGRlY2lkZXJSdW50aW1lU3RhZ2VJZDogZGVjaWRlcklkLFxuICAgICAgY2hvc2VuOiBbLi4uZXZlbnQuc2VsZWN0ZWRdLFxuICAgICAgLi4uKGV2ZW50LmV2aWRlbmNlICYmIHsgZXZpZGVuY2U6IGV2ZW50LmV2aWRlbmNlIH0pLFxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZy5wdXNoKHsgZGVjaWRlcklkLCByZW1haW5pbmc6IGV2ZW50LnNlbGVjdGVkLmxlbmd0aCB9KTtcbiAgfVxuXG4gIG9uU3RhZ2VFeGVjdXRlZChldmVudDogRmxvd1N0YWdlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdHggPSBldmVudC50cmF2ZXJzYWxDb250ZXh0O1xuICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgdGhpcy5yZXNldElmTmV3UnVuKGN0eC5ydW5JZCk7XG5cbiAgICBjb25zdCB7IHJ1bnRpbWVTdGFnZUlkLCBwYXJlbnRSdW50aW1lU3RhZ2VJZCB9ID0gY3R4O1xuICAgIGlmIChwYXJlbnRSdW50aW1lU3RhZ2VJZCkge1xuICAgICAgdGhpcy5wYXJlbnRPZi5zZXQocnVudGltZVN0YWdlSWQsIHBhcmVudFJ1bnRpbWVTdGFnZUlkKTtcbiAgICAgIHRoaXMuY29uc3VtZVBlbmRpbmdTbG90KHJ1bnRpbWVTdGFnZUlkLCBwYXJlbnRSdW50aW1lU3RhZ2VJZCwgLyogcmVnaXN0ZXIgKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgYnJhbmNoIHRoYXQgdGhyb3dzIG5ldmVyIGZpcmVzIGBvblN0YWdlRXhlY3V0ZWRgIOKAlCB3aXRob3V0IHRoaXMgaG9va1xuICAgKiBpdHMgcGVuZGluZyBzbG90IHdvdWxkIGxlYWsgYW5kIHRoZSBwb3N0LWZhbi1vdXQgY29udmVyZ2VuY2Ugc3RhZ2VcbiAgICogKHdob3NlIGNvbnRleHQgYWxzbyBjaGFpbnMgdG8gdGhlIHNlbGVjdG9yKSB3b3VsZCBiZSBtaXNhdHRyaWJ1dGVkIGFzXG4gICAqIGEgYnJhbmNoIGVudHJ5IHVuZGVyIGJlc3QtZWZmb3J0IChgZmFpbEZhc3Q6IGZhbHNlYCkgZmFuLW91dHMuXG4gICAqL1xuICBvbkVycm9yKGV2ZW50OiBGbG93RXJyb3JFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGN0eCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ7XG4gICAgaWYgKCFjdHgpIHJldHVybjtcbiAgICB0aGlzLnJlc2V0SWZOZXdSdW4oY3R4LnJ1bklkKTtcbiAgICBpZiAoY3R4LnBhcmVudFJ1bnRpbWVTdGFnZUlkKSB7XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYWluIEFORCBhdHRyaWJ1dGUgdGhlIGZhaWxlZCBzdGFnZSB0byBpdHMgZGVjaXNpb24g4oCUXG4gICAgICAvLyB0aGUgc3RhZ2UgUkFOIChhbmQgbWF5IGhhdmUgY29tbWl0dGVkIHBhcnRpYWwgd3JpdGVzKSBiZWNhdXNlIHRoZVxuICAgICAgLy8gZGVjaXNpb24gY2hvc2UgaXQ7IGZhaWxpbmcgYWZ0ZXJ3YXJkcyBkb2Vzbid0IHVuZG8gdGhlIGRlcGVuZGVuY3kuXG4gICAgICB0aGlzLnBhcmVudE9mLnNldChjdHgucnVudGltZVN0YWdlSWQsIGN0eC5wYXJlbnRSdW50aW1lU3RhZ2VJZCk7XG4gICAgICB0aGlzLmNvbnN1bWVQZW5kaW5nU2xvdChjdHgucnVudGltZVN0YWdlSWQsIGN0eC5wYXJlbnRSdW50aW1lU3RhZ2VJZCwgLyogcmVnaXN0ZXIgKi8gdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFF1ZXJpZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIE5FQVJFU1QgZ292ZXJuaW5nIGRlY2lzaW9uIGZvciBhbiBleGVjdXRpb24gc3RlcDogd2Fsa3MgdGhlXG4gICAqIHJ1bnRpbWUgYW5jZXN0b3IgY2hhaW4gKHRoZSBzdGVwIGl0c2VsZiBmaXJzdCkgdW50aWwgaXQgaGl0cyBhXG4gICAqIHJlZ2lzdGVyZWQgYnJhbmNoIGVudHJ5LiBgdW5kZWZpbmVkYCB3aGVuIHRoZSBzdGVwIGlzIG5vdCBkb3duc3RyZWFtIG9mXG4gICAqIGFueSByZWNvcmRlZCBkZWNpc2lvbi5cbiAgICovXG4gIGxvb2t1cChydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogQ29udHJvbERlcGVuZGVuY3kgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgY3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBydW50aW1lU3RhZ2VJZDtcbiAgICB3aGlsZSAoY3VyICE9PSB1bmRlZmluZWQgJiYgIXNlZW4uaGFzKGN1cikpIHtcbiAgICAgIHNlZW4uYWRkKGN1cik7XG4gICAgICBjb25zdCBkZWNpZGVySWQgPSB0aGlzLmJyYW5jaEVudHJ5VG9EZWNpc2lvbi5nZXQoY3VyKTtcbiAgICAgIGlmIChkZWNpZGVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmRlY2lzaW9ucy5nZXQoZGVjaWRlcklkKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkZWNpZGVySWQsXG4gICAgICAgICAgLi4uKHJlY29yZD8ucnVsZUxhYmVsICE9PSB1bmRlZmluZWQgJiYgeyBsYWJlbDogcmVjb3JkLnJ1bGVMYWJlbCB9KSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGN1ciA9IHRoaXMucGFyZW50T2YuZ2V0KGN1cik7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVGhlIGxvb2t1cCBhcyBhIGJhcmUgZnVuY3Rpb24g4oCUIHBsdWcgaW50byBgY2F1c2FsQ2hhaW4oLi4uLCB7IGNvbnRyb2xEZXBzIH0pYC4gKi9cbiAgYXNMb29rdXAoKTogQ29udHJvbERlcExvb2t1cCB7XG4gICAgcmV0dXJuIChydW50aW1lU3RhZ2VJZCkgPT4gdGhpcy5sb29rdXAocnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIFRoZSBhdHRlbXB0LXN0b3AgZGVjaXNpb24gb2YgYSBzdGFnZSBleGVjdXRpb24gd2hvc2UgcmV0cnkgc2VyaWVzIHN0b3BwZWQsIGlmIGl0IGRpZC4gKi9cbiAgZ2V0QXR0ZW1wdFN0b3AocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IENvbnRyb2xEZWNpc2lvblJlY29yZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5kZWNpc2lvbnMuZ2V0KHJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXR1cm4gcmVjb3JkPy5raW5kID09PSAnYXR0ZW1wdC1zdG9wJyA/IHJlY29yZCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBBbGwgZGVjaXNpb25zIHJlY29yZGVkIGZvciB0aGUgY3VycmVudCBydW4sIGluIGV2ZW50IG9yZGVyIOKAlCBkZWNpZGVycywgc2VsZWN0b3JzIGFuZCBhdHRlbXB0IHN0b3BzLiAqL1xuICBnZXREZWNpc2lvbnMoKTogQ29udHJvbERlY2lzaW9uUmVjb3JkW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5kZWNpc2lvbnMudmFsdWVzKCldO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQtcnVuIGNvbnRyb2wgZXZpZGVuY2UgZm9yIHRoZSBuYXRpdmUgc25hcHNob3QuIFByb2plY3Qgb25seSB0aGVcbiAgICogc3RhZ2UgaWRlbnRpdGllcyBjb2xsZWN0ZWQgZHVyaW5nIHRyYXZlcnNhbDsgbmV2ZXIgd2FsayB0aGUgZXhlY3V0aW9uIHRyZWUuXG4gICAqIFBhcmVudGxlc3Mgcm9vdHMgY2Fubm90IGhhdmUgYSBnb3Zlcm5pbmcgY29udHJvbCBlZGdlLlxuICAgKi9cbiAgdG9TbmFwc2hvdCgpIHtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXM6IFtzdHJpbmcsIENvbnRyb2xEZXBlbmRlbmN5XVtdID0gW107XG4gICAgZm9yIChjb25zdCBydW50aW1lU3RhZ2VJZCBvZiB0aGlzLnBhcmVudE9mLmtleXMoKSkge1xuICAgICAgY29uc3QgZGVwZW5kZW5jeSA9IHRoaXMubG9va3VwKHJ1bnRpbWVTdGFnZUlkKTtcbiAgICAgIGlmIChkZXBlbmRlbmN5KSBkZXBlbmRlbmNpZXMucHVzaChbcnVudGltZVN0YWdlSWQsIGRlcGVuZGVuY3ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdjb250cm9sLWRlcGVuZGVuY2llcycsXG4gICAgICBkYXRhOiB7IGRlY2lzaW9uczogdGhpcy5nZXREZWNpc2lvbnMoKSwgY29udHJvbERlcHM6IE9iamVjdC5mcm9tRW50cmllcyhkZXBlbmRlbmNpZXMpIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBSZXNldCBhbGwgc3RhdGUgKGFsc28gaGFwcGVucyBhdXRvbWF0aWNhbGx5IG9uIHJ1bklkIGNoYW5nZSkuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucGFyZW50T2YuY2xlYXIoKTtcbiAgICB0aGlzLmRlY2lzaW9ucy5jbGVhcigpO1xuICAgIHRoaXMuYnJhbmNoRW50cnlUb0RlY2lzaW9uLmNsZWFyKCk7XG4gICAgdGhpcy5wZW5kaW5nID0gW107XG4gICAgdGhpcy5jb25zdW1lZFNsb3RzLmNsZWFyKCk7XG4gIH1cblxuICAvLyDilIDilIAgSW50ZXJuYWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDb252ZW50aW9uIDQ6IGEgbmV3IHJ1bklkIG1lYW5zIGEgbmV3IHJ1biDigJQgcmVzZXQgdHJhbnNpZW50IHN0YXRlLiAqL1xuICBwcml2YXRlIHJlc2V0SWZOZXdSdW4ocnVuSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChydW5JZCA9PT0gdGhpcy5sYXN0UnVuSWQpIHJldHVybjtcbiAgICB0aGlzLmNsZWFyKCk7XG4gICAgdGhpcy5sYXN0UnVuSWQgPSBydW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBgcGFyZW50UnVudGltZVN0YWdlSWRgIGlzIGEgZGVjaWRlciB3aXRoIGFuIHVubWF0Y2hlZCBwZW5kaW5nIHNsb3QsXG4gICAqIGNvbnN1bWUgb25lLiBgcmVnaXN0ZXJgIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHN0YWdlIGlzIHJlY29yZGVkIGFzIGFcbiAgICogYnJhbmNoIGVudHJ5IChzdGFnZSBleGVjdXRlZC9lcnJvcmVkKSDigJQgYm90aCBwYXRocyBjb25zdW1lIHRoZSBzbG90IHNvXG4gICAqIGNvdW50cyBzdGF5IGV4YWN0IGV2ZW4gd2hlbiBhIHN0YWdlIHByb2R1Y2VzIGJvdGggZXZlbnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdW1lUGVuZGluZ1Nsb3QocnVudGltZVN0YWdlSWQ6IHN0cmluZywgcGFyZW50UnVudGltZVN0YWdlSWQ6IHN0cmluZywgcmVnaXN0ZXI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAocnVudGltZVN0YWdlSWQgPT09IHBhcmVudFJ1bnRpbWVTdGFnZUlkKSByZXR1cm47IC8vIHN5bnRoZXRpYyBzZWxmLWV2ZW50c1xuICAgIGlmICh0aGlzLmNvbnN1bWVkU2xvdHMuaGFzKHJ1bnRpbWVTdGFnZUlkKSkgcmV0dXJuO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBlbmRpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHAgPSB0aGlzLnBlbmRpbmdbaV07XG4gICAgICBpZiAocC5kZWNpZGVySWQgIT09IHBhcmVudFJ1bnRpbWVTdGFnZUlkKSBjb250aW51ZTtcblxuICAgICAgdGhpcy5jb25zdW1lZFNsb3RzLmFkZChydW50aW1lU3RhZ2VJZCk7XG4gICAgICBpZiAocmVnaXN0ZXIpIHRoaXMuYnJhbmNoRW50cnlUb0RlY2lzaW9uLnNldChydW50aW1lU3RhZ2VJZCwgcC5kZWNpZGVySWQpO1xuICAgICAgcC5yZW1haW5pbmctLTtcbiAgICAgIGlmIChwLnJlbWFpbmluZyA8PSAwKSB0aGlzLnBlbmRpbmcuc3BsaWNlKGksIDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZSBkZWNpZGUoKSBydWxlIGxhYmVsIHRoYXQgcHJvZHVjZWQgdGhlIGRlY2lzaW9uOiB0aGUgbWF0Y2hlZCBydWxlXG4gKiBtYXBwaW5nIHRvIHRoZSBjaG9zZW4gYnJhbmNoIChmaXJzdCBtYXRjaGVkIHJ1bGUgYXMgZmFsbGJhY2spLlxuICovXG5mdW5jdGlvbiBtYXRjaGVkUnVsZUxhYmVsKGV2aWRlbmNlOiBEZWNpc2lvbkV2aWRlbmNlIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFldmlkZW5jZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcnVsZSA9XG4gICAgZXZpZGVuY2UucnVsZXMuZmluZCgocikgPT4gci5tYXRjaGVkICYmIHIuYnJhbmNoID09PSBldmlkZW5jZS5jaG9zZW4pID8/IGV2aWRlbmNlLnJ1bGVzLmZpbmQoKHIpID0+IHIubWF0Y2hlZCk7XG4gIHJldHVybiBydWxlPy5sYWJlbDtcbn1cbiJdfQ==
@@ -60,4 +60,4 @@
60
60
  * ```
61
61
  */
62
62
  Object.defineProperty(exports, "__esModule", { value: true });
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW1pdFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9FbWl0UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJERyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW1pdFJlY29yZGVyIOKAlCB0aGUgdGhpcmQgb2JzZXJ2ZXIgY2hhbm5lbCwgYWxvbmdzaWRlIGBTY29wZVJlY29yZGVyYFxuICogKHNjb3BlIGRhdGEtZmxvdykgYW5kIGBGbG93UmVjb3JkZXJgIChjb250cm9sLWZsb3cpLlxuICpcbiAqICMjIFdoeSB0aGlzIGV4aXN0c1xuICpcbiAqIFRoZSBmaXJzdCB0d28gY2hhbm5lbHMgY2FwdHVyZSB3aGF0IHRoZSBMSUJSQVJZIGtub3dzIGFib3V0IOKAlCBzY29wZVxuICogcmVhZHMvd3JpdGVzIGZpcmVkIGJ5IGBzZXRWYWx1ZWAsIGFuZCBjb250cm9sLWZsb3cgZXZlbnRzIGZpcmVkIGJ5IHRoZVxuICogdHJhdmVyc2VyLiBCdXQgKip1c2VyLWVtaXR0ZWQgc3RydWN0dXJlZCBldmVudHMqKiDigJQgdGhpbmdzIGEgc3RhZ2VcbiAqIGZ1bmN0aW9uIHdhbnRzIHRvIHN1cmZhY2UgZm9yIG9ic2VydmFiaWxpdHkgKExMTSB0b2tlbnMsIGJpbGxpbmcgbWV0cmljcyxcbiAqIGF1dGggZGVjaXNpb25zLCBkb21haW4gbWlsZXN0b25lcykg4oCUIGhhdmUgbm93aGVyZSB0byBnbyB0b2RheS4gVGhleSBsYW5kXG4gKiBpbiB1bm9ic2VydmVkIGBEaWFnbm9zdGljQ29sbGVjdG9yYCBzaWRlIGJhZ3MgdGhhdCBubyByZWNvcmRlciB3YXRjaGVzLlxuICpcbiAqIFRoaXMgY2hhbm5lbCBjbG9zZXMgdGhhdCBnYXAuIENvbnN1bWVyIGNhbGxzIGBzY29wZS4kZW1pdChuYW1lLCBwYXlsb2FkKWBcbiAqIGZyb20gaW5zaWRlIGEgc3RhZ2U7IHRoZSBsaWJyYXJ5IGVucmljaGVzIHRoZSBldmVudCB3aXRoIHN0YWdlIGNvbnRleHRcbiAqIGFuZCBkaXNwYXRjaGVzIGl0IHN5bmNocm9ub3VzbHkgdG8gZXZlcnkgYXR0YWNoZWQgYEVtaXRSZWNvcmRlcmAuXG4gKlxuICogIyMgRGVzaWduIHByb3BlcnRpZXNcbiAqXG4gKiAtICoqUGFzcy10aHJvdWdoLCBub3QgYnVmZmVyZWQuKiogWmVybyBhbGxvY2F0aW9uIHdoZW4gbm8gcmVjb3JkZXIgaXNcbiAqICAgYXR0YWNoZWQuIEV2ZW50cyBkZWxpdmVyZWQgc3luY2hyb25vdXNseSwgaW4tb3JkZXIsIGF0IGNhbGwgdGltZS5cbiAqICAgU2FtZSBzZW1hbnRpY3MgYXMgYG9uUmVhZGAvYG9uV3JpdGVgIGFscmVhZHkgdXNlLlxuICogLSAqKkxpYnJhcnktYWdub3N0aWMgdm9jYWJ1bGFyeS4qKiBFdmVudCBuYW1lcyBhcmUgY29uc3VtZXItY2hvc2VuIHN0cmluZ3MuXG4gKiAgIENvbnZlbnRpb246IGhpZXJhcmNoaWNhbCBkb3R0ZWQgbmFtZXMsIGUuZy4gYCdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJ2AsXG4gKiAgIGAnbXlhcHAuYmlsbGluZy5zcGVuZCdgLiBMaWJyYXJ5IGVuZm9yY2VzIG5vIHJlZ2lzdHJ5LlxuICogLSAqKkF1dG8tZW5yaWNoZWQgY29udGV4dC4qKiBFdmVyeSBldmVudCBjYXJyaWVzIGBzdGFnZU5hbWVgLFxuICogICBgcnVudGltZVN0YWdlSWRgLCBgc3ViZmxvd1BhdGhgLCBgcGlwZWxpbmVJZGAsIGB0aW1lc3RhbXBgLiBDb25zdW1lcnNcbiAqICAgbmV2ZXIgbmVlZCB0byB0aHJlYWQgZXhlY3V0aW9uIGNvbnRleHQgdGhyb3VnaCB0aGVpciBlbWl0IHBheWxvYWRzLlxuICogLSAqKlJlZGFjdGlvbi1hd2FyZS4qKiBgUmVkYWN0aW9uUG9saWN5LmVtaXRQYXR0ZXJuc2AgbWF0Y2hlcyBldmVudCBuYW1lc1xuICogICBiZWZvcmUgZGlzcGF0Y2gg4oCUIG1hdGNoZWQgZXZlbnRzIGhhdmUgdGhlaXIgcGF5bG9hZCByZXBsYWNlZCB3aXRoXG4gKiAgIGAnW1JFREFDVEVEXSdgIHNvIHNlY3JldHMgY2FuJ3QgbGVhayB2aWEgZW1pdC5cbiAqXG4gKiAjIyBSZWxhdGlvbnNoaXAgdG8gZXhpc3RpbmcgY2hhbm5lbHNcbiAqXG4gKiB8IENoYW5uZWwgICAgICAgICB8IEZpcmVzIHdoZW4gICAgICAgICAgICAgICAgICAgICAgICAgfCBCdWlsdC1pbiBjb25zdW1lcnMgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCBgU2NvcGVSZWNvcmRlcmAgICAgICB8IHNjb3BlIHJlYWQvd3JpdGUvY29tbWl0ICAgICAgICAgICAgfCBEZWJ1Z1JlY29yZGVyLCBNZXRyaWNSZWNvcmRlciB8XG4gKiB8IGBGbG93UmVjb3JkZXJgICB8IHRyYXZlcnNhbCB0cmFuc2l0aW9ucyAgICAgICAgICAgICAgfCBOYXJyYXRpdmVGbG93UmVjb3JkZXIsIGV0Yy4gfFxuICogfCBgRW1pdFJlY29yZGVyYCAgfCBjb25zdW1lciBjYWxscyBgc2NvcGUuJGVtaXQoLi4uKWAgIHwgKG5vbmUgc2hpcHMgdG9kYXk7IFBoYXNlIDMuWCBhZGRzIE1lbW9yeUVtaXRSZWNvcmRlcikgfFxuICpcbiAqIGBDb21iaW5lZFJlY29yZGVyYCAoZnJvbSBgLi9Db21iaW5lZFJlY29yZGVyLnRzYCkgaW50ZXJzZWN0cyBhbGwgdGhyZWVcbiAqIHZpYSBgUGFydGlhbDwuLi4+YC4gQSBjb25zdW1lciBjYW4gd3JpdGUgT05FIG9iamVjdCBpbXBsZW1lbnRpbmcgYW55XG4gKiBjb21iaW5hdGlvbjsgYGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIocilgIGR1Y2stdHlwZXMgYW5kIHJvdXRlc1xuICogdG8gdGhlIHJpZ2h0IGNoYW5uZWwocykuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHRva2VuTWV0ZXI6IEVtaXRSZWNvcmRlciA9IHtcbiAqICAgaWQ6ICd0b2tlbi1tZXRlcicsXG4gKiAgIG9uRW1pdChldmVudCkge1xuICogICAgIGlmIChldmVudC5uYW1lID09PSAnYWdlbnRmb290cHJpbnQubGxtLnRva2VucycpIHtcbiAqICAgICAgIHRoaXMudG90YWwgKz0gKGV2ZW50LnBheWxvYWQgYXMgeyBpbnB1dDogbnVtYmVyOyBvdXRwdXQ6IG51bWJlciB9KS5pbnB1dDtcbiAqICAgICB9XG4gKiAgIH0sXG4gKiAgIHRvdGFsOiAwLFxuICogfSBhcyBhbnk7XG4gKlxuICogZXhlY3V0b3IuYXR0YWNoRW1pdFJlY29yZGVyKHRva2VuTWV0ZXIpO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFbWl0U291cmNlUG9zaXRpb24gfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgdHlwZSB7IFJlY29yZGVyQnVuZGxlIH0gZnJvbSAnLi9zbmFwc2hvdC5qcyc7XG5cbi8qKlxuICogRXZlbnQgZGVsaXZlcmVkIHRvIGBFbWl0UmVjb3JkZXIub25FbWl0YC5cbiAqXG4gKiBOYW1lICsgcGF5bG9hZCBhcmUgY29uc3VtZXItc3VwcGxpZWQgdmlhIGBzY29wZS4kZW1pdChuYW1lLCBwYXlsb2FkKWAuXG4gKiBFdmVyeXRoaW5nIGVsc2UgaXMgbGlicmFyeS1lbnJpY2hlZCBhdCBkaXNwYXRjaCB0aW1lIGZyb20gdGhlIGN1cnJlbnRcbiAqIHN0YWdlJ3MgZXhlY3V0aW9uIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1pdEV2ZW50IHtcbiAgLyoqXG4gICAqIENvbnN1bWVyLXN1cHBsaWVkIGV2ZW50IG5hbWUuIENvbnZlbnRpb246IGhpZXJhcmNoaWNhbCBkb3R0ZWQgbmFtZXNwYWNlXG4gICAqIChlLmcuIGAnYWdlbnRmb290cHJpbnQubGxtLnRva2VucydgLCBgJ215YXBwLmJpbGxpbmcuc3BlbmQnYCkuIEtlZXBzXG4gICAqIHZvY2FidWxhcmllcyBjb2xsaXNpb24tZnJlZSBhY3Jvc3MgbGlicmFyaWVzL2FwcHMgd2l0aG91dCByZXF1aXJpbmcgYVxuICAgKiBjZW50cmFsIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb25zdW1lci1zdXBwbGllZCBwYXlsb2FkLiBTaGFwZSBpcyB1cCB0byB0aGUgY29uc3VtZXIgYW5kIHRoZWlyXG4gICAqIGNvbnZlbnRpb247IGxpYnJhcnkgdHJlYXRzIGl0IGFzIG9wYXF1ZSBhbmQgcGFzc2VzIHRocm91Z2ggdW5jaGFuZ2VkXG4gICAqIChtb2R1bG8gcmVkYWN0aW9uIOKAlCBzZWUgYFJlZGFjdGlvblBvbGljeS5lbWl0UGF0dGVybnNgKS5cbiAgICpcbiAgICogV2hlbiByZWRhY3RlZCwgcmVwbGFjZWQgd2l0aCB0aGUgc3RyaW5nIGAnW1JFREFDVEVEXSdgLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZDogdW5rbm93bjtcblxuICAvKiogTmFtZSBvZiB0aGUgc3RhZ2UgdGhhdCBlbWl0dGVkIHRoaXMgZXZlbnQuICovXG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIg4oCUIHRoZSBzYW1lIHZhbHVlIHJlY29yZGVyIGV2ZW50c1xuICAgKiBhbmQgY29tbWl0LWxvZyBlbnRyaWVzIGNhcnJ5LiBTZWUgYHJ1bnRpbWVTdGFnZUlkLnRzYCBmb3IgZm9ybWF0LlxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogU3ViZmxvdyBwYXRoIGZyb20gdGhlIG91dGVybW9zdCBwYXJlbnQgZG93biB0byB0aGUgc3ViZmxvdyB0aGF0IGVtaXR0ZWRcbiAgICogdGhpcyBldmVudC4gRW1wdHkgYXJyYXkgd2hlbiB0aGUgZW1pdCBjYW1lIGZyb20gdGhlIHJvb3QgZmxvd2NoYXJ0LlxuICAgKiBNYXRjaGVzIHRoZSBjb252ZW50aW9uIHVzZWQgYnkgYEZsb3dQYXVzZUV2ZW50LnN1YmZsb3dQYXRoYCxcbiAgICogYEZsb3djaGFydENoZWNrcG9pbnQuc3ViZmxvd1BhdGhgLCBldGMuXG4gICAqL1xuICByZWFkb25seSBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqIFBpcGVsaW5lL3J1biBpZGVudGlmaWVyIChtYXRjaGVzIGBSZWNvcmRlckNvbnRleHQucGlwZWxpbmVJZGApLiAqL1xuICByZWFkb25seSBwaXBlbGluZUlkOiBzdHJpbmc7XG5cbiAgLyoqIEVtaXNzaW9uIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2ggKGBEYXRlLm5vdygpYCkuICovXG4gIHJlYWRvbmx5IHRpbWVzdGFtcDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTb3VyY2UtdGltZSBjb21taXR0ZWQgcHJlZml4IGluIHRoaXMgc3RhZ2UncyBvd24gbG9nLCBjYXB0dXJlZCBiZWZvcmVcbiAgICogb2JzZXJ2ZXIgZGlzcGF0Y2guIE5vdCB0aGlzIHN0YWdlJ3MgZnV0dXJlIGNvbW1pdCBvciB1bmNvbW1pdHRlZCBzdGF0ZS5cbiAgICogTWF0Y2ggbG9nUnVuSWQgKyBkcmlsbFBhdGggYWdhaW5zdCB0aGUgc291cmNlJ3MgbG9nQWRkcmVzcyBiZWZvcmUgZm9sZGluZztcbiAgICogYSBuYW1lZCBuZXN0ZWQgaGlzdG9yeSBjYW4gYmUgdW5hdmFpbGFibGUgKGUuZy4gYSBwYXVzZWQgc3ViZmxvdykuXG4gICAqIEFic2VudCBvbiBvbGQvbWFudWFsIGV2ZW50cyBhbmQgc2NvcGVzIHdpdGhvdXQgYSBib3VuZCBlbmdpbmUgbG9nLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUG9zaXRpb24/OiBFbWl0U291cmNlUG9zaXRpb247XG59XG5cbi8qKlxuICogUGx1Z2dhYmxlIG9ic2VydmVyIGZvciBjb25zdW1lci1lbWl0dGVkIHN0cnVjdHVyZWQgZXZlbnRzLlxuICpcbiAqIEFsbCBtZXRob2RzIGFyZSBvcHRpb25hbDsgaW1wbGVtZW50IG9ubHkgd2hhdCB5b3UgY2FyZSBhYm91dC4gUmVjb3JkZXJzXG4gKiBhcmUgaW52b2tlZCBzeW5jaHJvbm91c2x5IGluIGF0dGFjaG1lbnQgb3JkZXIuIElmIGEgcmVjb3JkZXIgdGhyb3dzLCB0aGVcbiAqIGVycm9yIGlzIGNhdWdodCBhbmQgaXNvbGF0ZWQg4oCUIG90aGVyIHJlY29yZGVycyBjb250aW51ZSB0byByZWNlaXZlIHRoZVxuICogZXZlbnQgYW5kIHRoZSBlbWl0dGluZyBzdGFnZSBpcyB1bmFmZmVjdGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtaXRSZWNvcmRlciB7XG4gIC8qKlxuICAgKiBTdGFibGUgaWRlbnRpZmllciBmb3IgaWRlbXBvdGVudCBhdHRhY2gvZGV0YWNoLiBSZS1hdHRhY2hpbmcgd2l0aCB0aGVcbiAgICogc2FtZSBpZCByZXBsYWNlcyB0aGUgcHJldmlvdXMgcmVnaXN0cmF0aW9uIG9uIHRoZSBleGVjdXRvci5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqIENhbGxlZCBmb3IgZXZlcnkgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYCBjYWxsIGluIGFueSBzdGFnZS4gKi9cbiAgb25FbWl0PyhldmVudDogRW1pdEV2ZW50KTogdm9pZDtcblxuICAvKipcbiAgICogT3B0aW9uYWw6IHJlc2V0IHJlY29yZGVyLWludGVybmFsIHN0YXRlIGJldHdlZW4gcnVucy4gQ2FsbGVkIGJ5IHRoZVxuICAgKiBleGVjdXRvciBiZWZvcmUgZWFjaCBgcnVuKClgLlxuICAgKi9cbiAgY2xlYXI/KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsOiBleHBvc2UgY29sbGVjdGVkIGRhdGEgZm9yIGluY2x1c2lvbiBpblxuICAgKiBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKS5yZWNvcmRlcnNgLlxuICAgKi9cbiAgdG9TbmFwc2hvdD8oKTogUmVjb3JkZXJCdW5kbGU7XG59XG4iXX0=
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW1pdFJlY29yZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWNvcmRlci9FbWl0UmVjb3JkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJERyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW1pdFJlY29yZGVyIOKAlCB0aGUgdGhpcmQgb2JzZXJ2ZXIgY2hhbm5lbCwgYWxvbmdzaWRlIGBTY29wZVJlY29yZGVyYFxuICogKHNjb3BlIGRhdGEtZmxvdykgYW5kIGBGbG93UmVjb3JkZXJgIChjb250cm9sLWZsb3cpLlxuICpcbiAqICMjIFdoeSB0aGlzIGV4aXN0c1xuICpcbiAqIFRoZSBmaXJzdCB0d28gY2hhbm5lbHMgY2FwdHVyZSB3aGF0IHRoZSBMSUJSQVJZIGtub3dzIGFib3V0IOKAlCBzY29wZVxuICogcmVhZHMvd3JpdGVzIGZpcmVkIGJ5IGBzZXRWYWx1ZWAsIGFuZCBjb250cm9sLWZsb3cgZXZlbnRzIGZpcmVkIGJ5IHRoZVxuICogdHJhdmVyc2VyLiBCdXQgKip1c2VyLWVtaXR0ZWQgc3RydWN0dXJlZCBldmVudHMqKiDigJQgdGhpbmdzIGEgc3RhZ2VcbiAqIGZ1bmN0aW9uIHdhbnRzIHRvIHN1cmZhY2UgZm9yIG9ic2VydmFiaWxpdHkgKExMTSB0b2tlbnMsIGJpbGxpbmcgbWV0cmljcyxcbiAqIGF1dGggZGVjaXNpb25zLCBkb21haW4gbWlsZXN0b25lcykg4oCUIGhhdmUgbm93aGVyZSB0byBnbyB0b2RheS4gVGhleSBsYW5kXG4gKiBpbiB1bm9ic2VydmVkIGBEaWFnbm9zdGljQ29sbGVjdG9yYCBzaWRlIGJhZ3MgdGhhdCBubyByZWNvcmRlciB3YXRjaGVzLlxuICpcbiAqIFRoaXMgY2hhbm5lbCBjbG9zZXMgdGhhdCBnYXAuIENvbnN1bWVyIGNhbGxzIGBzY29wZS4kZW1pdChuYW1lLCBwYXlsb2FkKWBcbiAqIGZyb20gaW5zaWRlIGEgc3RhZ2U7IHRoZSBsaWJyYXJ5IGVucmljaGVzIHRoZSBldmVudCB3aXRoIHN0YWdlIGNvbnRleHRcbiAqIGFuZCBkaXNwYXRjaGVzIGl0IHN5bmNocm9ub3VzbHkgdG8gZXZlcnkgYXR0YWNoZWQgYEVtaXRSZWNvcmRlcmAuXG4gKlxuICogIyMgRGVzaWduIHByb3BlcnRpZXNcbiAqXG4gKiAtICoqUGFzcy10aHJvdWdoLCBub3QgYnVmZmVyZWQuKiogWmVybyBhbGxvY2F0aW9uIHdoZW4gbm8gcmVjb3JkZXIgaXNcbiAqICAgYXR0YWNoZWQuIEV2ZW50cyBkZWxpdmVyZWQgc3luY2hyb25vdXNseSwgaW4tb3JkZXIsIGF0IGNhbGwgdGltZS5cbiAqICAgU2FtZSBzZW1hbnRpY3MgYXMgYG9uUmVhZGAvYG9uV3JpdGVgIGFscmVhZHkgdXNlLlxuICogLSAqKkxpYnJhcnktYWdub3N0aWMgdm9jYWJ1bGFyeS4qKiBFdmVudCBuYW1lcyBhcmUgY29uc3VtZXItY2hvc2VuIHN0cmluZ3MuXG4gKiAgIENvbnZlbnRpb246IGhpZXJhcmNoaWNhbCBkb3R0ZWQgbmFtZXMsIGUuZy4gYCdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJ2AsXG4gKiAgIGAnbXlhcHAuYmlsbGluZy5zcGVuZCdgLiBMaWJyYXJ5IGVuZm9yY2VzIG5vIHJlZ2lzdHJ5LlxuICogLSAqKkF1dG8tZW5yaWNoZWQgY29udGV4dC4qKiBFdmVyeSBldmVudCBjYXJyaWVzIGBzdGFnZU5hbWVgLFxuICogICBgcnVudGltZVN0YWdlSWRgLCBgc3ViZmxvd1BhdGhgLCBgcGlwZWxpbmVJZGAsIGB0aW1lc3RhbXBgLiBDb25zdW1lcnNcbiAqICAgbmV2ZXIgbmVlZCB0byB0aHJlYWQgZXhlY3V0aW9uIGNvbnRleHQgdGhyb3VnaCB0aGVpciBlbWl0IHBheWxvYWRzLlxuICogLSAqKlJlZGFjdGlvbi1hd2FyZS4qKiBgUmVkYWN0aW9uUG9saWN5LmVtaXRQYXR0ZXJuc2AgbWF0Y2hlcyBldmVudCBuYW1lc1xuICogICBiZWZvcmUgZGlzcGF0Y2gg4oCUIG1hdGNoZWQgZXZlbnRzIGhhdmUgdGhlaXIgcGF5bG9hZCByZXBsYWNlZCB3aXRoXG4gKiAgIGAnW1JFREFDVEVEXSdgIHNvIHNlY3JldHMgY2FuJ3QgbGVhayB2aWEgZW1pdC5cbiAqXG4gKiAjIyBSZWxhdGlvbnNoaXAgdG8gZXhpc3RpbmcgY2hhbm5lbHNcbiAqXG4gKiB8IENoYW5uZWwgICAgICAgICB8IEZpcmVzIHdoZW4gICAgICAgICAgICAgICAgICAgICAgICAgfCBCdWlsdC1pbiBjb25zdW1lcnMgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCBgU2NvcGVSZWNvcmRlcmAgICAgICB8IHNjb3BlIHJlYWQvd3JpdGUvY29tbWl0ICAgICAgICAgICAgfCBEZWJ1Z1JlY29yZGVyLCBNZXRyaWNSZWNvcmRlciB8XG4gKiB8IGBGbG93UmVjb3JkZXJgICB8IHRyYXZlcnNhbCB0cmFuc2l0aW9ucyAgICAgICAgICAgICAgfCBOYXJyYXRpdmVGbG93UmVjb3JkZXIsIGV0Yy4gfFxuICogfCBgRW1pdFJlY29yZGVyYCAgfCBjb25zdW1lciBjYWxscyBgc2NvcGUuJGVtaXQoLi4uKWAgIHwgKG5vbmUgc2hpcHMgdG9kYXk7IFBoYXNlIDMuWCBhZGRzIE1lbW9yeUVtaXRSZWNvcmRlcikgfFxuICpcbiAqIGBDb21iaW5lZFJlY29yZGVyYCAoZnJvbSBgLi9Db21iaW5lZFJlY29yZGVyLnRzYCkgaW50ZXJzZWN0cyBhbGwgdGhyZWVcbiAqIHZpYSBgUGFydGlhbDwuLi4+YC4gQSBjb25zdW1lciBjYW4gd3JpdGUgT05FIG9iamVjdCBpbXBsZW1lbnRpbmcgYW55XG4gKiBjb21iaW5hdGlvbjsgYGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIocilgIGR1Y2stdHlwZXMgYW5kIHJvdXRlc1xuICogdG8gdGhlIHJpZ2h0IGNoYW5uZWwocykuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHRva2VuTWV0ZXI6IEVtaXRSZWNvcmRlciA9IHtcbiAqICAgaWQ6ICd0b2tlbi1tZXRlcicsXG4gKiAgIG9uRW1pdChldmVudCkge1xuICogICAgIGlmIChldmVudC5uYW1lID09PSAnYWdlbnRmb290cHJpbnQubGxtLnRva2VucycpIHtcbiAqICAgICAgIHRoaXMudG90YWwgKz0gKGV2ZW50LnBheWxvYWQgYXMgeyBpbnB1dDogbnVtYmVyOyBvdXRwdXQ6IG51bWJlciB9KS5pbnB1dDtcbiAqICAgICB9XG4gKiAgIH0sXG4gKiAgIHRvdGFsOiAwLFxuICogfSBhcyBhbnk7XG4gKlxuICogZXhlY3V0b3IuYXR0YWNoRW1pdFJlY29yZGVyKHRva2VuTWV0ZXIpO1xuICogYGBgXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFbWl0U291cmNlUG9zaXRpb24gfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgdHlwZSB7IFJ1bkNvcnJlbGF0aW9uIH0gZnJvbSAnLi4vYXR0ZW1wdC90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlY29yZGVyQnVuZGxlIH0gZnJvbSAnLi9zbmFwc2hvdC5qcyc7XG5cbi8qKlxuICogRXZlbnQgZGVsaXZlcmVkIHRvIGBFbWl0UmVjb3JkZXIub25FbWl0YC5cbiAqXG4gKiBOYW1lICsgcGF5bG9hZCBhcmUgY29uc3VtZXItc3VwcGxpZWQgdmlhIGBzY29wZS4kZW1pdChuYW1lLCBwYXlsb2FkKWAuXG4gKiBFdmVyeXRoaW5nIGVsc2UgaXMgbGlicmFyeS1lbnJpY2hlZCBhdCBkaXNwYXRjaCB0aW1lIGZyb20gdGhlIGN1cnJlbnRcbiAqIHN0YWdlJ3MgZXhlY3V0aW9uIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1pdEV2ZW50IHtcbiAgLyoqXG4gICAqIENvbnN1bWVyLXN1cHBsaWVkIGV2ZW50IG5hbWUuIENvbnZlbnRpb246IGhpZXJhcmNoaWNhbCBkb3R0ZWQgbmFtZXNwYWNlXG4gICAqIChlLmcuIGAnYWdlbnRmb290cHJpbnQubGxtLnRva2VucydgLCBgJ215YXBwLmJpbGxpbmcuc3BlbmQnYCkuIEtlZXBzXG4gICAqIHZvY2FidWxhcmllcyBjb2xsaXNpb24tZnJlZSBhY3Jvc3MgbGlicmFyaWVzL2FwcHMgd2l0aG91dCByZXF1aXJpbmcgYVxuICAgKiBjZW50cmFsIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb25zdW1lci1zdXBwbGllZCBwYXlsb2FkLiBTaGFwZSBpcyB1cCB0byB0aGUgY29uc3VtZXIgYW5kIHRoZWlyXG4gICAqIGNvbnZlbnRpb247IGxpYnJhcnkgdHJlYXRzIGl0IGFzIG9wYXF1ZSBhbmQgcGFzc2VzIHRocm91Z2ggdW5jaGFuZ2VkXG4gICAqIChtb2R1bG8gcmVkYWN0aW9uIOKAlCBzZWUgYFJlZGFjdGlvblBvbGljeS5lbWl0UGF0dGVybnNgKS5cbiAgICpcbiAgICogV2hlbiByZWRhY3RlZCwgcmVwbGFjZWQgd2l0aCB0aGUgc3RyaW5nIGAnW1JFREFDVEVEXSdgLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZDogdW5rbm93bjtcblxuICAvKiogTmFtZSBvZiB0aGUgc3RhZ2UgdGhhdCBlbWl0dGVkIHRoaXMgZXZlbnQuICovXG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBVbmlxdWUgcGVyLWV4ZWN1dGlvbi1zdGVwIGlkZW50aWZpZXIg4oCUIHRoZSBzYW1lIHZhbHVlIHJlY29yZGVyIGV2ZW50c1xuICAgKiBhbmQgY29tbWl0LWxvZyBlbnRyaWVzIGNhcnJ5LiBTZWUgYHJ1bnRpbWVTdGFnZUlkLnRzYCBmb3IgZm9ybWF0LlxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZVN0YWdlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogU3ViZmxvdyBwYXRoIGZyb20gdGhlIG91dGVybW9zdCBwYXJlbnQgZG93biB0byB0aGUgc3ViZmxvdyB0aGF0IGVtaXR0ZWRcbiAgICogdGhpcyBldmVudC4gRW1wdHkgYXJyYXkgd2hlbiB0aGUgZW1pdCBjYW1lIGZyb20gdGhlIHJvb3QgZmxvd2NoYXJ0LlxuICAgKiBNYXRjaGVzIHRoZSBjb252ZW50aW9uIHVzZWQgYnkgYEZsb3dQYXVzZUV2ZW50LnN1YmZsb3dQYXRoYCxcbiAgICogYEZsb3djaGFydENoZWNrcG9pbnQuc3ViZmxvd1BhdGhgLCBldGMuXG4gICAqL1xuICByZWFkb25seSBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqIFBpcGVsaW5lL3J1biBpZGVudGlmaWVyIChtYXRjaGVzIGBSZWNvcmRlckNvbnRleHQucGlwZWxpbmVJZGApLiAqL1xuICByZWFkb25seSBwaXBlbGluZUlkOiBzdHJpbmc7XG5cbiAgLyoqIEVtaXNzaW9uIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2ggKGBEYXRlLm5vdygpYCkuICovXG4gIHJlYWRvbmx5IHRpbWVzdGFtcDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTb3VyY2UtdGltZSBjb21taXR0ZWQgcHJlZml4IGluIHRoaXMgc3RhZ2UncyBvd24gbG9nLCBjYXB0dXJlZCBiZWZvcmVcbiAgICogb2JzZXJ2ZXIgZGlzcGF0Y2guIE5vdCB0aGlzIHN0YWdlJ3MgZnV0dXJlIGNvbW1pdCBvciB1bmNvbW1pdHRlZCBzdGF0ZS5cbiAgICogTWF0Y2ggbG9nUnVuSWQgKyBkcmlsbFBhdGggYWdhaW5zdCB0aGUgc291cmNlJ3MgbG9nQWRkcmVzcyBiZWZvcmUgZm9sZGluZztcbiAgICogYSBuYW1lZCBuZXN0ZWQgaGlzdG9yeSBjYW4gYmUgdW5hdmFpbGFibGUgKGUuZy4gYSBwYXVzZWQgc3ViZmxvdykuXG4gICAqIEFic2VudCBvbiBvbGQvbWFudWFsIGV2ZW50cyBhbmQgc2NvcGVzIHdpdGhvdXQgYSBib3VuZCBlbmdpbmUgbG9nLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUG9zaXRpb24/OiBFbWl0U291cmNlUG9zaXRpb247XG5cbiAgLyoqIFRoZSBydW4ncyBjb3JyZWxhdGlvbiAoMTAuMSkg4oCUIGFzIG9uIGV2ZXJ5IHNjb3BlIGV2ZW50IChgUmVjb3JkZXJDb250ZXh0LmNvcnJlbGF0aW9uYCkuIEFic2VudCB3aGVuIG5vbmUuICovXG4gIHJlYWRvbmx5IGNvcnJlbGF0aW9uPzogUnVuQ29ycmVsYXRpb247XG59XG5cbi8qKlxuICogUGx1Z2dhYmxlIG9ic2VydmVyIGZvciBjb25zdW1lci1lbWl0dGVkIHN0cnVjdHVyZWQgZXZlbnRzLlxuICpcbiAqIEFsbCBtZXRob2RzIGFyZSBvcHRpb25hbDsgaW1wbGVtZW50IG9ubHkgd2hhdCB5b3UgY2FyZSBhYm91dC4gUmVjb3JkZXJzXG4gKiBhcmUgaW52b2tlZCBzeW5jaHJvbm91c2x5IGluIGF0dGFjaG1lbnQgb3JkZXIuIElmIGEgcmVjb3JkZXIgdGhyb3dzLCB0aGVcbiAqIGVycm9yIGlzIGNhdWdodCBhbmQgaXNvbGF0ZWQg4oCUIG90aGVyIHJlY29yZGVycyBjb250aW51ZSB0byByZWNlaXZlIHRoZVxuICogZXZlbnQgYW5kIHRoZSBlbWl0dGluZyBzdGFnZSBpcyB1bmFmZmVjdGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtaXRSZWNvcmRlciB7XG4gIC8qKlxuICAgKiBTdGFibGUgaWRlbnRpZmllciBmb3IgaWRlbXBvdGVudCBhdHRhY2gvZGV0YWNoLiBSZS1hdHRhY2hpbmcgd2l0aCB0aGVcbiAgICogc2FtZSBpZCByZXBsYWNlcyB0aGUgcHJldmlvdXMgcmVnaXN0cmF0aW9uIG9uIHRoZSBleGVjdXRvci5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqIENhbGxlZCBmb3IgZXZlcnkgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYCBjYWxsIGluIGFueSBzdGFnZS4gKi9cbiAgb25FbWl0PyhldmVudDogRW1pdEV2ZW50KTogdm9pZDtcblxuICAvKipcbiAgICogT3B0aW9uYWw6IHJlc2V0IHJlY29yZGVyLWludGVybmFsIHN0YXRlIGJldHdlZW4gcnVucy4gQ2FsbGVkIGJ5IHRoZVxuICAgKiBleGVjdXRvciBiZWZvcmUgZWFjaCBgcnVuKClgLlxuICAgKi9cbiAgY2xlYXI/KCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsOiBleHBvc2UgY29sbGVjdGVkIGRhdGEgZm9yIGluY2x1c2lvbiBpblxuICAgKiBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKS5yZWNvcmRlcnNgLlxuICAgKi9cbiAgdG9TbmFwc2hvdD8oKTogUmVjb3JkZXJCdW5kbGU7XG59XG4iXX0=
@@ -34,6 +34,18 @@
34
34
  * (it means "in progress" or "paused"). The `getBoundary()` helper
35
35
  * returns `{ entry, exit: undefined }` in that case.
36
36
  *
37
+ * Attempts (10.1):
38
+ * An `exit` entry carries `attempts` — the count of attempts made inside
39
+ * the boundary, at any depth, by outcome, and how many series gave up —
40
+ * and `failedAttempts`, the failed / timed-out / aborted ones by name. Only
41
+ * series that retried, gave up or timed out count (`recorder/attemptSeries.ts ·
42
+ * isRetryEvidence`), so both fields are absent when nothing retried, and a
43
+ * boundary pair says what it cost to get through. An `entry` never carries
44
+ * them: the cost is known only at the exit — so a boundary that never
45
+ * exits (a run or subflow that failed, e.g. because a stage gave up, or a
46
+ * pause) carries no count; the attempts are then on the execution tree and
47
+ * the attempt-aware recorders (Topology, Debug, Quality).
48
+ *
37
49
  * Redaction:
38
50
  * Payload redaction is the engine's responsibility (`RedactionPolicy`).
39
51
  * By the time payloads reach this recorder via `FlowSubflowEvent` or
@@ -67,11 +79,36 @@
67
79
  Object.defineProperty(exports, "__esModule", { value: true });
68
80
  exports.InOutRecorder = exports.inOutRecorder = exports.ROOT_RUNTIME_STAGE_ID = exports.ROOT_SUBFLOW_ID = void 0;
69
81
  const foottrace_1 = require("foottrace");
82
+ const attemptSeries_js_1 = require("./attemptSeries.js");
70
83
  const SequenceStore_js_1 = require("./SequenceStore.js");
71
84
  /** Synthetic id for the top-level run's boundary pair. */
72
85
  exports.ROOT_SUBFLOW_ID = '__root__';
73
86
  /** Synthetic runtimeStageId for the top-level run boundary pair. */
74
87
  exports.ROOT_RUNTIME_STAGE_ID = '__root__#0';
88
+ /** Attempts accumulated inside one open boundary. */
89
+ class BoundaryAttempts {
90
+ count = 0;
91
+ byOutcome = (0, attemptSeries_js_1.emptyOutcomeCounts)();
92
+ gaveUp = 0;
93
+ failed = [];
94
+ add(outcome, gave, failed) {
95
+ this.count += 1;
96
+ this.byOutcome[outcome] += 1;
97
+ if (gave)
98
+ this.gaveUp += 1;
99
+ if (failed)
100
+ this.failed.push(failed);
101
+ }
102
+ /** The exit entry's fields — none when nothing retried inside. */
103
+ fields() {
104
+ if (this.count === 0)
105
+ return {};
106
+ return {
107
+ attempts: { count: this.count, byOutcome: { ...this.byOutcome }, gaveUp: this.gaveUp },
108
+ failedAttempts: [...this.failed],
109
+ };
110
+ }
111
+ }
75
112
  let _counter = 0;
76
113
  /**
77
114
  * Factory — matches the `topologyRecorder()` / `narrative()` style.
@@ -92,25 +129,55 @@ class InOutRecorder {
92
129
  id;
93
130
  /** 1:N ordered storage with per-step index (Convention 1 — composed). */
94
131
  store = new SequenceStore_js_1.SequenceStore();
132
+ /** The root run's attempts — every attempt is inside it. */
133
+ rootAttempts = new BoundaryAttempts();
134
+ /** Open subflow boundaries' attempts, by path-prefixed subflowId. */
135
+ openAttempts = new Map();
95
136
  constructor(options = {}) {
96
137
  this.id = options.id ?? `inout-${++_counter}`;
97
138
  }
98
139
  // ── FlowRecorder hooks ────────────────────────────────────────────────
99
140
  onRunStart(event) {
141
+ this.rootAttempts = new BoundaryAttempts();
142
+ this.openAttempts.clear();
100
143
  this.store.push(buildRootEntry('entry', event.payload));
101
144
  }
102
145
  onRunEnd(event) {
103
- this.store.push(buildRootEntry('exit', event.payload));
146
+ this.store.push({ ...buildRootEntry('exit', event.payload), ...this.rootAttempts.fields() });
104
147
  }
105
148
  onSubflowEntry(event) {
106
149
  const entry = buildSubflowEntry(event, 'entry');
107
- if (entry)
108
- this.store.push(entry);
150
+ if (!entry)
151
+ return;
152
+ this.openAttempts.set(entry.subflowId, new BoundaryAttempts());
153
+ this.store.push(entry);
109
154
  }
110
155
  onSubflowExit(event) {
111
156
  const entry = buildSubflowEntry(event, 'exit');
112
- if (entry)
113
- this.store.push(entry);
157
+ if (!entry)
158
+ return;
159
+ const attempts = this.openAttempts.get(entry.subflowId);
160
+ this.openAttempts.delete(entry.subflowId);
161
+ this.store.push(attempts ? { ...entry, ...attempts.fields() } : entry);
162
+ }
163
+ /**
164
+ * Counts an attempt in the root boundary and in every open subflow boundary that contains the stage — the
165
+ * subflow the stage ran in is that subflow's id or below it.
166
+ */
167
+ onAttempt(event) {
168
+ const { record } = event;
169
+ if (!(0, attemptSeries_js_1.isRetryEvidence)(record))
170
+ return;
171
+ const gave = (0, attemptSeries_js_1.gaveUp)(record);
172
+ const failed = (0, attemptSeries_js_1.attemptFailed)(record) ? (0, attemptSeries_js_1.attemptRef)(record) : undefined;
173
+ this.rootAttempts.add(record.outcome, gave, failed);
174
+ const path = (0, attemptSeries_js_1.subflowOfAttempt)(event);
175
+ if (path === undefined)
176
+ return;
177
+ for (const [subflowId, attempts] of this.openAttempts) {
178
+ if (path === subflowId || path.startsWith(`${subflowId}/`))
179
+ attempts.add(record.outcome, gave, failed);
180
+ }
114
181
  }
115
182
  // ── Query API ─────────────────────────────────────────────────────────
116
183
  /** All entries in execution order (entry+exit interleaved). */
@@ -154,6 +221,8 @@ class InOutRecorder {
154
221
  /** Clear all stored boundaries — called by the executor before each run(). */
155
222
  clear() {
156
223
  this.store.clear();
224
+ this.rootAttempts = new BoundaryAttempts();
225
+ this.openAttempts.clear();
157
226
  }
158
227
  /** The root run's entry/exit pair, if the run has started.
159
228
  * Convenience for consumers that want to bracket the timeline by the
@@ -227,4 +296,4 @@ function buildSubflowEntry(event, phase) {
227
296
  isRoot: false,
228
297
  };
229
298
  }
230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5PdXRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvSW5PdXRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnRUc7OztBQUVILHlDQUEyRDtBQUczRCx5REFBbUQ7QUFNbkQsMERBQTBEO0FBQzdDLFFBQUEsZUFBZSxHQUFHLFVBQVUsQ0FBQztBQUUxQyxvRUFBb0U7QUFDdkQsUUFBQSxxQkFBcUIsR0FBRyxZQUFZLENBQUM7QUFtRGxELElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztBQUVqQjs7R0FFRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxVQUFnQyxFQUFFO0lBQzlELE9BQU8sSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUZELHNDQUVDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQWEsYUFBYTtJQUNmLEVBQUUsQ0FBUztJQUNwQix5RUFBeUU7SUFDeEQsS0FBSyxHQUFHLElBQUksZ0NBQWEsRUFBYyxDQUFDO0lBRXpELFlBQVksVUFBZ0MsRUFBRTtRQUM1QyxJQUFJLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLElBQUksU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRCx5RUFBeUU7SUFFekUsVUFBVSxDQUFDLEtBQW1CO1FBQzVCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFtQjtRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxD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UUFDUixLQUFLO1FBQ0wsT0FBTztRQUNQLE1BQU0sRUFBRSxJQUFJO0tBQ2IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLGlCQUFpQixDQUFDLEtBQXVCLEVBQUUsS0FBaUI7SUFDbkUsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUNsQyxJQUFJLENBQUMsU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRWpDLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO0lBQ3BFLE1BQU0sUUFBUSxHQUFHLElBQUEsMEJBQVksRUFBQyxTQUFTLENBQUMsQ0FBQztJQUN6QyxNQUFNLFdBQVcsR0FBc0IsQ0FBQyx1QkFBZSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDdEUsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDckMsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO0lBQ2xFLE1BQU0sT0FBTyxHQUFHLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7SUFFMUUsT0FBTztRQUNMLGNBQWM7UUFDZCxTQUFTO1FBQ1QsY0FBYztRQUNkLFdBQVcsRUFBRSxLQUFLLENBQUMsSUFBSTtRQUN2QixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7UUFDOUIsV0FBVztRQUNYLEtBQUs7UUFDTCxLQUFLO1FBQ0wsT0FBTztRQUNQLE1BQU0sRUFBRSxLQUFLO0tBQ2QsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEluT3V0UmVjb3JkZXIg4oCUIGNhcHR1cmVzIGV2ZXJ5IGNoYXJ0J3MgaW5wdXQvb3V0cHV0IGFzIGVudHJ5L2V4aXQgcGFpcnMuXG4gKlxuICogVGhlIGdhcCB0aGlzIGZpbGxzOlxuICogICBFdmVyeSBjaGFydCBpbiBmb290cHJpbnRqcyBoYXMgdHdvIG5hdHVyYWwgZGF0YSBib3VuZGFyaWVzOlxuICogICAgIC0gdGhlICoqaW5wdXQqKiB0aGF0IGZsb3dlZCBpbiAodG9wLWxldmVsOiBgcnVuKHtpbnB1dH0pYDtcbiAqICAgICAgIHN1YmZsb3c6IGBpbnB1dE1hcHBlcmAgcmVzdWx0KVxuICogICAgIC0gdGhlICoqb3V0cHV0KiogdGhhdCBmbG93ZWQgb3V0ICh0b3AtbGV2ZWw6IGNoYXJ0IHJldHVybiB2YWx1ZTtcbiAqICAgICAgIHN1YmZsb3c6IHNoYXJlZCBzdGF0ZSBhdCBleGl0IC8gYG91dHB1dE1hcHBlcmAgcmVzdWx0KVxuICpcbiAqICAgVG9nZXRoZXIgd2l0aCBgVG9wb2xvZ3lSZWNvcmRlcmAgKGNvbXBvc2l0aW9uIHNoYXBlKSB0aGlzIGlzIHRoZVxuICogICB1bml2ZXJzYWwgXCJzdGVwXCIgcHJpbWl0aXZlIHRoYXQgZG93bnN0cmVhbSBsYXllcnMgcHJvamVjdCDigJQgYSBMZW5zXG4gKiAgIFN0ZXBHcmFwaCwgYSBUcmFjZSB2aWV3LCBjdXN0b20gZGFzaGJvYXJkcy4gQWxsIGJpbmQgYnkgYHJ1bnRpbWVTdGFnZUlkYC5cbiAqXG4gKiAgIFRoZSByb290IGNoYXJ0IGlzIHRyZWF0ZWQgaWRlbnRpY2FsbHkgdG8gYW55IHN1YmZsb3c6IGFuIGBlbnRyeWBcbiAqICAgYm91bmRhcnkgb24gYG9uUnVuU3RhcnRgIGFuZCBhbiBgZXhpdGAgYm91bmRhcnkgb24gYG9uUnVuRW5kYCwgd2l0aFxuICogICBgc3ViZmxvd0lkOiAnX19yb290X18nYC4gU28gY29uc3VtZXJzIGJ1aWxkaW5nIFwiZXZlcnkgc3RlcCBoYXMgYW5cbiAqICAgaW4vb3V0IGFycm93XCIgdmlld3MgY2FuIGNsb3NlIHRoZSBjaGFpbiBhdCB0aGUgdG9wIGxldmVsIOKAlCBub1xuICogICBzcGVjaWFsLWNhc2UgcmVuZGVyaW5nIHJlcXVpcmVkLlxuICpcbiAqIFR3byBib3VuZGFyeSBwaGFzZXMgcGVyIGNoYXJ0IGV4ZWN1dGlvbjpcbiAqICAgMS4gYHBoYXNlOiAnZW50cnknYCDigJQgcGF5bG9hZCA9IHRoZSBpbnB1dCBjcm9zc2luZyB0aGUgYm91bmRhcnkgSU5cbiAqICAgMi4gYHBoYXNlOiAnZXhpdCdgICDigJQgcGF5bG9hZCA9IHRoZSBvdXRwdXQgY3Jvc3NpbmcgdGhlIGJvdW5kYXJ5IE9VVFxuICpcbiAqICAgTG9vcHMgcmUtZW50ZXJpbmcgdGhlIHNhbWUgc3ViZmxvdyBnZXQgZGlzdGluY3QgYHJ1bnRpbWVTdGFnZUlkYHNcbiAqICAgYXV0b21hdGljYWxseSAocGFyZW50IHN0YWdlJ3MgZXhlY3V0aW9uSW5kZXggaW5jcmVtZW50cyBwZXIgaXRlcmF0aW9uKS5cbiAqXG4gKiBQYXVzZSBzZW1hbnRpY3M6XG4gKiAgIFdoZW4gYSBzdGFnZSBwYXVzZXMgaW5zaWRlIGEgc3ViZmxvdywgdGhlIGVuZ2luZSByZS10aHJvd3MgdGhlIHBhdXNlXG4gKiAgIHNpZ25hbCB3aXRob3V0IGZpcmluZyBgb25TdWJmbG93RXhpdGAgKG9yIGBvblJ1bkVuZGApLiBUaGUgc3ViZmxvd1xuICogICBoYXMgYW4gYGVudHJ5YCB3aXRoIG5vIG1hdGNoaW5nIGBleGl0YCB1bnRpbCB0aGUgcnVuIHJlc3VtZXMgYW5kXG4gKiAgIGV4aXRzIGNsZWFubHkuIENvbnN1bWVycyBzaG91bGQgaGFuZGxlIGVudHJ5LXdpdGhvdXQtZXhpdCBncmFjZWZ1bGx5XG4gKiAgIChpdCBtZWFucyBcImluIHByb2dyZXNzXCIgb3IgXCJwYXVzZWRcIikuIFRoZSBgZ2V0Qm91bmRhcnkoKWAgaGVscGVyXG4gKiAgIHJldHVybnMgYHsgZW50cnksIGV4aXQ6IHVuZGVmaW5lZCB9YCBpbiB0aGF0IGNhc2UuXG4gKlxuICogUmVkYWN0aW9uOlxuICogICBQYXlsb2FkIHJlZGFjdGlvbiBpcyB0aGUgZW5naW5lJ3MgcmVzcG9uc2liaWxpdHkgKGBSZWRhY3Rpb25Qb2xpY3lgKS5cbiAqICAgQnkgdGhlIHRpbWUgcGF5bG9hZHMgcmVhY2ggdGhpcyByZWNvcmRlciB2aWEgYEZsb3dTdWJmbG93RXZlbnRgIG9yXG4gKiAgIGBGbG93UnVuRXZlbnRgLCBuYW1lZCB2YWx1ZXMgaGF2ZSBwYXNzZWQgdGhlIHJ1bidzIHJ1bGUuIFJvb3QgcnVuXG4gKiAgIHBheWxvYWRzIGFyZSB3YWxrZWQgYXQgZXZlcnkgZGVwdGggKGEgbmVzdGVkIGtleSBieSBpdHMgb3duIG5hbWUgb3JcbiAqICAgZG90dGVkIHBhdGgpIHBsdXMgZXhwbGljaXQgbmVzdGVkIGZpZWxkczsgc2NhbGFycyBwYXNzIHRocm91Z2gsIGFuZCBmb3JrXG4gKiAgIGNoaWxkLUlEIGVudmVsb3BlcyBuZWVkIGV4cGxpY2l0IHJlc3VsdCBwYXRocy4gVGhpcyBpcyBub3QgY29udGVudCBzY2FubmluZy4gVGhlIHJlY29yZGVyXG4gKiAgIGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCkgcmUtcmVkYWN0IG9yIHJlY29uc3RydWN0IHRoZSBydW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGluT3V0UmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgaW5PdXQgPSBpbk91dFJlY29yZGVyKCk7XG4gKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKGluT3V0KTtcbiAqIGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0IH0pO1xuICpcbiAqIGluT3V0LmdldFN0ZXBzKCk7ICAgICAgICAgICAgICAgICAgICAvLyBlbnRyeSBib3VuZGFyaWVzIOKAlCB0aW1lbGluZSBwcm9qZWN0aW9uXG4gKiBpbk91dC5nZXRCb3VuZGFyeShydW50aW1lU3RhZ2VJZCk7ICAgLy8geyBlbnRyeSwgZXhpdCB9IHBhaXIgZm9yIG9uZSBleGVjdXRpb25cbiAqIGluT3V0LmdldEJvdW5kYXJpZXMoKTsgICAgICAgICAgICAgICAvLyBmbGF0IGxpc3QgKGVudHJ5K2V4aXQgaW50ZXJsZWF2ZWQpXG4gKiBpbk91dC5nZXRSb290Qm91bmRhcnkoKTsgICAgICAgICAgICAgLy8geyBlbnRyeSwgZXhpdCB9IGZvciB0aGUgdG9wLWxldmVsIHJ1blxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgRmlsdGVyaW5nIGJ5IHN1YmZsb3cgcGF0aFxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYWdlbnRTdGVwcyA9IGluT3V0XG4gKiAgIC5nZXRTdGVwcygpXG4gKiAgIC5maWx0ZXIoKGIpID0+IGIuc3ViZmxvd1BhdGhbMV0gPT09ICdzZi1hZ2VudCcpOyAgLy8gcGF0aFswXSBpcyB0aGUgcm9vdFxuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgaWRQYXRoU2VnbWVudHMgYXMgcGF0aFNlZ21lbnRzIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIsIEZsb3dSdW5FdmVudCwgRmxvd1N1YmZsb3dFdmVudCB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgU2VxdWVuY2VTdG9yZSB9IGZyb20gJy4vU2VxdWVuY2VTdG9yZS5qcyc7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IHR5cGUgSW5PdXRQaGFzZSA9ICdlbnRyeScgfCAnZXhpdCc7XG5cbi8qKiBTeW50aGV0aWMgaWQgZm9yIHRoZSB0b3AtbGV2ZWwgcnVuJ3MgYm91bmRhcnkgcGFpci4gKi9cbmV4cG9ydCBjb25zdCBST09UX1NVQkZMT1dfSUQgPSAnX19yb290X18nO1xuXG4vKiogU3ludGhldGljIHJ1bnRpbWVTdGFnZUlkIGZvciB0aGUgdG9wLWxldmVsIHJ1biBib3VuZGFyeSBwYWlyLiAqL1xuZXhwb3J0IGNvbnN0IFJPT1RfUlVOVElNRV9TVEFHRV9JRCA9ICdfX3Jvb3RfXyMwJztcblxuLyoqXG4gKiBPbmUgaGFsZiBvZiBhIGNoYXJ0IGV4ZWN1dGlvbiBib3VuZGFyeS4gRW50cnkvZXhpdCBwYWlycyBzaGFyZSBgcnVudGltZVN0YWdlSWRgLlxuICpcbiAqIE5hbWluZyBmb2xsb3dzIHRoZSBlbmdpbmU6IGBzdWJmbG93SWRgIGlzIHRoZSBwYXRoLXByZWZpeGVkIGlkZW50aWZpZXIgdGhlXG4gKiBlbmdpbmUgZW1pdHMgKGUuZy4gYCdzZi1vdXRlci9zZi1pbm5lcidgIGZvciBuZXN0ZWQgc3ViZmxvd3MpLiBGb3IgdGhlXG4gKiB0b3AtbGV2ZWwgcnVuLCBpdCdzIHRoZSBzeW50aGV0aWMgYCdfX3Jvb3RfXydgLiBgc3ViZmxvd1BhdGhgIGlzIHRoZVxuICogZGVjb21wb3NpdGlvbiBpbnRvIHNlZ21lbnRzIOKAlCBwcm92aWRlZCBhcyBhIGNvbnZlbmllbmNlIGJlY2F1c2UgY29uc3VtZXJzXG4gKiBvZnRlbiBxdWVyeSAvIGdyb3VwIGJ5IHRoZSBwYXRoIHRyZWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5PdXRFbnRyeSB7XG4gIC8qKiBydW50aW1lU3RhZ2VJZCDigJQgc2FtZSB2YWx1ZSBmb3IgdGhlIGVudHJ5L2V4aXQgcGFpciBvZiBvbmUgZXhlY3V0aW9uLlxuICAgKiAgVG9wLWxldmVsIHJ1biB1c2VzIHRoZSBzeW50aGV0aWMgYFJPT1RfUlVOVElNRV9TVEFHRV9JRGAuICovXG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBQYXRoLXByZWZpeGVkIHN1YmZsb3cgaWRlbnRpZmllciAobWF0Y2hlcyB0aGUgZW5naW5lJ3MgYEZsb3dTdWJmbG93RXZlbnQuc3ViZmxvd0lkYCkuXG4gICAqICBUb3AtbGV2ZWwg4oaSIGAnX19yb290X18nYC4gU3ViZmxvdyDihpIgYCdzZi1vdXRlcidgIG9yIGAnc2Ytb3V0ZXIvc2YtaW5uZXInYC4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd0lkOiBzdHJpbmc7XG4gIC8qKiBMYXN0IHNlZ21lbnQgb2YgYHN1YmZsb3dJZGAg4oCUIGNvbnZlbmllbmNlIGZvciBjb25zdW1lcnMgdGhhdCBncm91cCBieSBsZWFmIG5hbWUuXG4gICAqICBUb3AtbGV2ZWwg4oaSIGAnX19yb290X18nYC4gKi9cbiAgcmVhZG9ubHkgbG9jYWxTdWJmbG93SWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRpc3BsYXkgbmFtZSAoZnJvbSB0aGUgYnVpbGRlcjsgYCdSdW4nYCBmb3IgdGhlIHRvcC1sZXZlbCBydW4pLiAqL1xuICByZWFkb25seSBzdWJmbG93TmFtZTogc3RyaW5nO1xuICAvKiogQnVpbGQtdGltZSBkZXNjcmlwdGlvbiBmcm9tIHRoZSBzdWJmbG93J3Mgcm9vdCBzdGFnZS5cbiAgICogIENhcnJpZXMgdGF4b25vbXkgbWFya2VycyAoZS5nLiBgJ0FnZW50OiBSZUFjdCBsb29wJ2ApLiBVbmRlZmluZWQgZm9yIHJvb3QuICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogRGVjb21wb3NpdGlvbiBvZiBgc3ViZmxvd0lkYCBpbnRvIHNlZ21lbnRzLiBUb3AtbGV2ZWwg4oaSIGBbJ19fcm9vdF9fJ11gLlxuICAgKiAgU3ViZmxvd3MgbGl2ZSBVTkRFUiB0aGUgcm9vdDogYSB0b3AtbGV2ZWwgc3ViZmxvdyBoYXMgcGF0aCBgWydfX3Jvb3RfXycsICdzZi14J11gLiAqL1xuICByZWFkb25seSBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBEZXB0aCBpbiB0aGUgc3ViZmxvdyB0cmVlLiBSb290IOKGkiAwLiBGaXJzdC1sZXZlbCBzdWJmbG93IOKGkiAxLiAqL1xuICByZWFkb25seSBkZXB0aDogbnVtYmVyO1xuICAvKiogV2hpY2ggc2lkZSBvZiB0aGUgYm91bmRhcnkgdGhpcyBlbnRyeSByZXByZXNlbnRzLiAqL1xuICByZWFkb25seSBwaGFzZTogSW5PdXRQaGFzZTtcbiAgLyoqIERhdGEgY3Jvc3NpbmcgdGhlIGJvdW5kYXJ5LlxuICAgKiAgLSBgcGhhc2U6ICdlbnRyeSdgIOKGkiBgaW5wdXRNYXBwZXJgIHJlc3VsdCAoc3ViZmxvdykgb3IgYHJ1bih7aW5wdXR9KWAgKHJvb3QpXG4gICAqICAtIGBwaGFzZTogJ2V4aXQnYCAg4oaSIHN1YmZsb3cgc2hhcmVkIHN0YXRlIGF0IGV4aXQgKHN1YmZsb3cpIG9yIGNoYXJ0IHJldHVybiB2YWx1ZSAocm9vdClcbiAgICpcbiAgICogIFVuZGVmaW5lZCB3aGVuIG5vIG1hcHBlciAvIG5vIGlucHV0IHdhcyBwcm92aWRlZC4gKi9cbiAgcmVhZG9ubHkgcGF5bG9hZD86IHVua25vd247XG4gIC8qKiBUcnVlIHdoZW4gdGhpcyBlbnRyeSBjYW1lIGZyb20gdGhlIHRvcC1sZXZlbCBydW4gKGBvblJ1blN0YXJ0YCAvIGBvblJ1bkVuZGApXG4gICAqICByYXRoZXIgdGhhbiBmcm9tIGEgc3ViZmxvdyAoYG9uU3ViZmxvd0VudHJ5YCAvIGBvblN1YmZsb3dFeGl0YCkuXG4gICAqICBMZW5zIHVzZXMgdGhpcyB0byByZW5kZXIgdGhlIHJvb3QgcGFpciBhcyBgdXNlciDihpIgcnVuIOKGkiB1c2VyYCBpbnN0ZWFkIG9mXG4gICAqICB0aGUgcmVndWxhciBzdWJmbG93IHNoYXBlLiAqL1xuICByZWFkb25seSBpc1Jvb3Q6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5PdXRSZWNvcmRlck9wdGlvbnMge1xuICAvKiogU2NvcGVSZWNvcmRlciBpZC4gRGVmYXVsdHMgdG8gYGlub3V0LU5gIChhdXRvLWluY3JlbWVudGVkKS4gKi9cbiAgaWQ/OiBzdHJpbmc7XG59XG5cbmxldCBfY291bnRlciA9IDA7XG5cbi8qKlxuICogRmFjdG9yeSDigJQgbWF0Y2hlcyB0aGUgYHRvcG9sb2d5UmVjb3JkZXIoKWAgLyBgbmFycmF0aXZlKClgIHN0eWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5PdXRSZWNvcmRlcihvcHRpb25zOiBJbk91dFJlY29yZGVyT3B0aW9ucyA9IHt9KTogSW5PdXRSZWNvcmRlciB7XG4gIHJldHVybiBuZXcgSW5PdXRSZWNvcmRlcihvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBTdGF0ZWZ1bCBhY2N1bXVsYXRvciB0aGF0IHdhdGNoZXMgYEZsb3dSZWNvcmRlcmAgY2hhcnQtYm91bmRhcnkgZXZlbnRzXG4gKiAocnVuIHN0YXJ0L2VuZCArIHN1YmZsb3cgZW50cnkvZXhpdCkgYW5kIHB1c2hlcyBgSW5PdXRFbnRyeWAgcmVjb3JkcyB0b1xuICogaXRzIGNvbXBvc2VkIGBTZXF1ZW5jZVN0b3JlYCAoQ29udmVudGlvbiAxIOKAlCBvbmUgcHVycG9zZSBwZXIgcmVjb3JkZXIpLlxuICpcbiAqIEF0dGFjaCB2aWEgYGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIocmVjb3JkZXIpYCDigJQgZm9vdHByaW50anNcbiAqIGRldGVjdHMgdGhlIGBGbG93UmVjb3JkZXJgIG1ldGhvZCBzaGFwZSBhbmQgcm91dGVzIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEluT3V0UmVjb3JkZXIgaW1wbGVtZW50cyBGbG93UmVjb3JkZXIge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogMTpOIG9yZGVyZWQgc3RvcmFnZSB3aXRoIHBlci1zdGVwIGluZGV4IChDb252ZW50aW9uIDEg4oCUIGNvbXBvc2VkKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZSA9IG5ldyBTZXF1ZW5jZVN0b3JlPEluT3V0RW50cnk+KCk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSW5PdXRSZWNvcmRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkID8/IGBpbm91dC0keysrX2NvdW50ZXJ9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBGbG93UmVjb3JkZXIgaG9va3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgb25SdW5TdGFydChldmVudDogRmxvd1J1bkV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5wdXNoKGJ1aWxkUm9vdEVudHJ5KCdlbnRyeScsIGV2ZW50LnBheWxvYWQpKTtcbiAgfVxuXG4gIG9uUnVuRW5kKGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnB1c2goYnVpbGRSb290RW50cnkoJ2V4aXQnLCBldmVudC5wYXlsb2FkKSk7XG4gIH1cblxuICBvblN1YmZsb3dFbnRyeShldmVudDogRmxvd1N1YmZsb3dFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJ5ID0gYnVpbGRTdWJmbG93RW50cnkoZXZlbnQsICdlbnRyeScpO1xuICAgIGlmIChlbnRyeSkgdGhpcy5zdG9yZS5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIG9uU3ViZmxvd0V4aXQoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyeSA9IGJ1aWxkU3ViZmxvd0VudHJ5KGV2ZW50LCAnZXhpdCcpO1xuICAgIGlmIChlbnRyeSkgdGhpcy5zdG9yZS5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBRdWVyeSBBUEkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEFsbCBlbnRyaWVzIGluIGV4ZWN1dGlvbiBvcmRlciAoZW50cnkrZXhpdCBpbnRlcmxlYXZlZCkuICovXG4gIGdldEJvdW5kYXJpZXMoKTogSW5PdXRFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRBbGwoKTtcbiAgfVxuXG4gIC8qKiBFbnRyeS9leGl0IHBhaXIgZm9yIG9uZSBjaGFydCBleGVjdXRpb24uXG4gICAqICBSZXR1cm5zIGB7IGVudHJ5LCBleGl0IH1gIOKAlCBgZXhpdGAgaXMgYHVuZGVmaW5lZGAgZm9yIGluLXByb2dyZXNzIC8gcGF1c2VkXG4gICAqICBjaGFydHMgb3IgaWYgYHJ1bnRpbWVTdGFnZUlkYCBpcyB1bmtub3duLiAqL1xuICBnZXRCb3VuZGFyeShydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogeyBlbnRyeT86IEluT3V0RW50cnk7IGV4aXQ/OiBJbk91dEVudHJ5IH0ge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLnN0b3JlLmdldEJ5S2V5KHJ1bnRpbWVTdGFnZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgZW50cnk6IGVudHJpZXMuZmluZCgoZSkgPT4gZS5waGFzZSA9PT0gJ2VudHJ5JyksXG4gICAgICBleGl0OiBlbnRyaWVzLmZpbmQoKGUpID0+IGUucGhhc2UgPT09ICdleGl0JyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBKdXN0IHRoZSBgZW50cnlgLXBoYXNlIGJvdW5kYXJpZXMg4oCUIHRoZSBcInN0ZXAgbGlzdFwiIHByb2plY3Rpb24gaW5cbiAgICogIGV4ZWN1dGlvbiBvcmRlci4gVGhpcyBpcyB0aGUgbmF0dXJhbCB0aW1lbGluZSBvZiBjaGFydCBleGVjdXRpb25zXG4gICAqICBmb3Igc2xpZGVyIC8gc2NydWJiaW5nIFVJcy4gVGhlIHRvcC1sZXZlbCBydW4ncyBlbnRyeSBpcyB0aGUgZmlyc3RcbiAgICogIHN0ZXAgKGRlcHRoIDApLiAqL1xuICBnZXRTdGVwcygpOiBJbk91dEVudHJ5W10ge1xuICAgIGNvbnN0IHN0ZXBzOiBJbk91dEVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGIgb2YgdGhpcy5zdG9yZS5nZXRBbGwoKSkge1xuICAgICAgaWYgKGIucGhhc2UgPT09ICdlbnRyeScpIHN0ZXBzLnB1c2goYik7XG4gICAgfVxuICAgIHJldHVybiBzdGVwcztcbiAgfVxuXG4gIC8qKiBPKDEpIGxvb2t1cDogYWxsIGJvdW5kYXJ5IGVudHJpZXMgKGJvdGggcGhhc2VzKSBmb3Igb25lIHJ1bnRpbWVTdGFnZUlkLiAqL1xuICBnZXRFbnRyaWVzRm9yU3RlcChydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogSW5PdXRFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRCeUtleShydW50aW1lU3RhZ2VJZCk7XG4gIH1cblxuICAvKiogUHJlLWJ1aWx0IHBlci1zdGVwIHJhbmdlIGluZGV4IOKAlCBPKDEpIGxvb2t1cHMgZm9yIHRpbWUtdHJhdmVsIHNjcnViYmluZy4gKi9cbiAgZ2V0RW50cnlSYW5nZXMoKTogUmVhZG9ubHlNYXA8c3RyaW5nLCB7IHJlYWRvbmx5IGZpcnN0SWR4OiBudW1iZXI7IHJlYWRvbmx5IGVuZElkeDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRFbnRyeVJhbmdlcygpO1xuICB9XG5cbiAgLyoqIFByb2dyZXNzaXZlIHJldmVhbDogYm91bmRhcmllcyB3aG9zZSBydW50aW1lU3RhZ2VJZCBpcyBpbiB0aGUgdmlzaWJsZSBzZXQuICovXG4gIGdldEVudHJpZXNVcFRvKHZpc2libGVJZHM6IFJlYWRvbmx5U2V0PHN0cmluZz4pOiBJbk91dEVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEVudHJpZXNVcFRvKHZpc2libGVJZHMpO1xuICB9XG5cbiAgLyoqIENsZWFyIGFsbCBzdG9yZWQgYm91bmRhcmllcyDigJQgY2FsbGVkIGJ5IHRoZSBleGVjdXRvciBiZWZvcmUgZWFjaCBydW4oKS4gKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5jbGVhcigpO1xuICB9XG5cbiAgLyoqIFRoZSByb290IHJ1bidzIGVudHJ5L2V4aXQgcGFpciwgaWYgdGhlIHJ1biBoYXMgc3RhcnRlZC5cbiAgICogIENvbnZlbmllbmNlIGZvciBjb25zdW1lcnMgdGhhdCB3YW50IHRvIGJyYWNrZXQgdGhlIHRpbWVsaW5lIGJ5IHRoZVxuICAgKiAgb3V0ZXJtb3N0IGluL291dC4gKi9cbiAgZ2V0Um9vdEJvdW5kYXJ5KCk6IHsgZW50cnk/OiBJbk91dEVudHJ5OyBleGl0PzogSW5PdXRFbnRyeSB9IHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb3VuZGFyeShST09UX1JVTlRJTUVfU1RBR0VfSUQpO1xuICB9XG5cbiAgLyoqIFNuYXBzaG90IGJ1bmRsZSBmb3IgaW5jbHVzaW9uIGluIGBleGVjdXRvci5nZXRTbmFwc2hvdCgpYC4gKi9cbiAgdG9TbmFwc2hvdCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJ0luT3V0JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2hhcnQgaW4vb3V0IHN0cmVhbSDigJQgZW50cnkvZXhpdCBwYWlycyBhdCBldmVyeSBjaGFydCBib3VuZGFyeSAocm9vdCArIHN1YmZsb3dzKScsXG4gICAgICBwcmVmZXJyZWRPcGVyYXRpb246ICd0cmFuc2xhdGUnIGFzIGNvbnN0LFxuICAgICAgZGF0YTogdGhpcy5nZXRCb3VuZGFyaWVzKCksXG4gICAgfTtcbiAgfVxufVxuXG4vLyDilIDilIAgSW50ZXJuYWwgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBCdWlsZCB0aGUgc3ludGhldGljIHJvb3QgZW50cnkvZXhpdC4gRGVwdGggaXMgYDBgIGFuZCB0aGUgcGF0aCBpc1xuICogYFtST09UX1NVQkZMT1dfSURdYCBzbyBjb25zdW1lcnMgZ3JvdXBpbmcgYnkgcGF0aCBzZWUgdGhlIHJvb3QgYXMgYVxuICogcmVndWxhciB0b3AtbGV2ZWwgY29udGFpbmVyLlxuICovXG5mdW5jdGlvbiBidWlsZFJvb3RFbnRyeShwaGFzZTogSW5PdXRQaGFzZSwgcGF5bG9hZDogdW5rbm93bik6IEluT3V0RW50cnkge1xuICByZXR1cm4ge1xuICAgIHJ1bnRpbWVTdGFnZUlkOiBST09UX1JVTlRJTUVfU1RBR0VfSUQsXG4gICAgc3ViZmxvd0lkOiBST09UX1NVQkZMT1dfSUQsXG4gICAgbG9jYWxTdWJmbG93SWQ6IFJPT1RfU1VCRkxPV19JRCxcbiAgICBzdWJmbG93TmFtZTogJ1J1bicsXG4gICAgc3ViZmxvd1BhdGg6IFtST09UX1NVQkZMT1dfSURdLFxuICAgIGRlcHRoOiAwLFxuICAgIHBoYXNlLFxuICAgIHBheWxvYWQsXG4gICAgaXNSb290OiB0cnVlLFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgc3ViZmxvdyBgSW5PdXRFbnRyeWAgZnJvbSBhIGBGbG93U3ViZmxvd0V2ZW50YC5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIGV2ZW50IGxhY2tzIGEgYHN1YmZsb3dJZGAgKGFub255bW91cyAvXG4gKiBtYWxmb3JtZWQgc3ViZmxvdyBldmVudHMg4oCUIHNhbWUgZGVmZW5zaXZlIHBvbGljeSBhcyBgVG9wb2xvZ3lSZWNvcmRlcmApLlxuICpcbiAqIFBhdGggZGVyaXZhdGlvbjogdGhlIGVuZ2luZSBlbWl0cyBgc3ViZmxvd0lkYCBhbHJlYWR5IHByZWZpeGVkIHdpdGggdGhlXG4gKiBmdWxsIHBhdGggb2YgcGFyZW50IHN1YmZsb3dzIChlLmcuIGAnc2Ytb3V0ZXIvc2YtaW5uZXInYCkuIFdlIGRlY29tcG9zZVxuICogdGhhdCBpbnRvIHNlZ21lbnRzIHRvIHBvcHVsYXRlIGBzdWJmbG93UGF0aGAgYW5kIGNvbXB1dGUgYGRlcHRoYC5cbiAqXG4gKiBTdWJmbG93cyBuZXN0IFVOREVSIHRoZSBzeW50aGV0aWMgcm9vdCBpbiBgc3ViZmxvd1BhdGhgIHNvIHRoZSB0cmVlIGlzXG4gKiBjb21wbGV0ZTogYSB0b3AtbGV2ZWwgc3ViZmxvdyBoYXMgcGF0aCBgWydfX3Jvb3RfXycsICdzZi14J11gIGFuZCBkZXB0aCAxLlxuICovXG5mdW5jdGlvbiBidWlsZFN1YmZsb3dFbnRyeShldmVudDogRmxvd1N1YmZsb3dFdmVudCwgcGhhc2U6IEluT3V0UGhhc2UpOiBJbk91dEVudHJ5IHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3ViZmxvd0lkID0gZXZlbnQuc3ViZmxvd0lkO1xuICBpZiAoIXN1YmZsb3dJZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBydW50aW1lU3RhZ2VJZCA9IGV2ZW50LnRyYXZlcnNhbENvbnRleHQ/LnJ1bnRpbWVTdGFnZUlkID8/ICcnO1xuICBjb25zdCBzZWdtZW50cyA9IHBhdGhTZWdtZW50cyhzdWJmbG93SWQpO1xuICBjb25zdCBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW10gPSBbUk9PVF9TVUJGTE9XX0lELCAuLi5zZWdtZW50c107XG4gIGNvbnN0IGRlcHRoID0gc3ViZmxvd1BhdGgubGVuZ3RoIC0gMTtcbiAgY29uc3QgbG9jYWxTdWJmbG93SWQgPSBzZWdtZW50c1tzZWdtZW50cy5sZW5ndGggLSAxXSA/PyBzdWJmbG93SWQ7XG4gIGNvbnN0IHBheWxvYWQgPSBwaGFzZSA9PT0gJ2VudHJ5JyA/IGV2ZW50Lm1hcHBlZElucHV0IDogZXZlbnQub3V0cHV0U3RhdGU7XG5cbiAgcmV0dXJuIHtcbiAgICBydW50aW1lU3RhZ2VJZCxcbiAgICBzdWJmbG93SWQsXG4gICAgbG9jYWxTdWJmbG93SWQsXG4gICAgc3ViZmxvd05hbWU6IGV2ZW50Lm5hbWUsXG4gICAgZGVzY3JpcHRpb246IGV2ZW50LmRlc2NyaXB0aW9uLFxuICAgIHN1YmZsb3dQYXRoLFxuICAgIGRlcHRoLFxuICAgIHBoYXNlLFxuICAgIHBheWxvYWQsXG4gICAgaXNSb290OiBmYWxzZSxcbiAgfTtcbn1cbiJdfQ==
299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5PdXRSZWNvcmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVjb3JkZXIvSW5PdXRSZWNvcmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0RUc7OztBQUVILHlDQUEyRDtBQUszRCx5REFPNEI7QUFDNUIseURBQW1EO0FBTW5ELDBEQUEwRDtBQUM3QyxRQUFBLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFFMUMsb0VBQW9FO0FBQ3ZELFFBQUEscUJBQXFCLEdBQUcsWUFBWSxDQUFDO0FBa0RsRCxxREFBcUQ7QUFDckQsTUFBTSxnQkFBZ0I7SUFDWixLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ0QsU0FBUyxHQUFHLElBQUEscUNBQWtCLEdBQUUsQ0FBQztJQUMxQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ0YsTUFBTSxHQUFpQixFQUFFLENBQUM7SUFFM0MsR0FBRyxDQUFDLE9BQXVCLEVBQUUsSUFBYSxFQUFFLE1BQThCO1FBQ3hFLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLElBQUksSUFBSTtZQUFFLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDaEMsT0FBTztZQUNMLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMs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QUFjO1FBQ2QsU0FBUztRQUNULGNBQWM7UUFDZCxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUk7UUFDdkIsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1FBQzlCLFdBQVc7UUFDWCxLQUFLO1FBQ0wsS0FBSztRQUNMLE9BQU87UUFDUCxNQUFNLEVBQUUsS0FBSztLQUNkLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBJbk91dFJlY29yZGVyIOKAlCBjYXB0dXJlcyBldmVyeSBjaGFydCdzIGlucHV0L291dHB1dCBhcyBlbnRyeS9leGl0IHBhaXJzLlxuICpcbiAqIFRoZSBnYXAgdGhpcyBmaWxsczpcbiAqICAgRXZlcnkgY2hhcnQgaW4gZm9vdHByaW50anMgaGFzIHR3byBuYXR1cmFsIGRhdGEgYm91bmRhcmllczpcbiAqICAgICAtIHRoZSAqKmlucHV0KiogdGhhdCBmbG93ZWQgaW4gKHRvcC1sZXZlbDogYHJ1bih7aW5wdXR9KWA7XG4gKiAgICAgICBzdWJmbG93OiBgaW5wdXRNYXBwZXJgIHJlc3VsdClcbiAqICAgICAtIHRoZSAqKm91dHB1dCoqIHRoYXQgZmxvd2VkIG91dCAodG9wLWxldmVsOiBjaGFydCByZXR1cm4gdmFsdWU7XG4gKiAgICAgICBzdWJmbG93OiBzaGFyZWQgc3RhdGUgYXQgZXhpdCAvIGBvdXRwdXRNYXBwZXJgIHJlc3VsdClcbiAqXG4gKiAgIFRvZ2V0aGVyIHdpdGggYFRvcG9sb2d5UmVjb3JkZXJgIChjb21wb3NpdGlvbiBzaGFwZSkgdGhpcyBpcyB0aGVcbiAqICAgdW5pdmVyc2FsIFwic3RlcFwiIHByaW1pdGl2ZSB0aGF0IGRvd25zdHJlYW0gbGF5ZXJzIHByb2plY3Qg4oCUIGEgTGVuc1xuICogICBTdGVwR3JhcGgsIGEgVHJhY2UgdmlldywgY3VzdG9tIGRhc2hib2FyZHMuIEFsbCBiaW5kIGJ5IGBydW50aW1lU3RhZ2VJZGAuXG4gKlxuICogICBUaGUgcm9vdCBjaGFydCBpcyB0cmVhdGVkIGlkZW50aWNhbGx5IHRvIGFueSBzdWJmbG93OiBhbiBgZW50cnlgXG4gKiAgIGJvdW5kYXJ5IG9uIGBvblJ1blN0YXJ0YCBhbmQgYW4gYGV4aXRgIGJvdW5kYXJ5IG9uIGBvblJ1bkVuZGAsIHdpdGhcbiAqICAgYHN1YmZsb3dJZDogJ19fcm9vdF9fJ2AuIFNvIGNvbnN1bWVycyBidWlsZGluZyBcImV2ZXJ5IHN0ZXAgaGFzIGFuXG4gKiAgIGluL291dCBhcnJvd1wiIHZpZXdzIGNhbiBjbG9zZSB0aGUgY2hhaW4gYXQgdGhlIHRvcCBsZXZlbCDigJQgbm9cbiAqICAgc3BlY2lhbC1jYXNlIHJlbmRlcmluZyByZXF1aXJlZC5cbiAqXG4gKiBUd28gYm91bmRhcnkgcGhhc2VzIHBlciBjaGFydCBleGVjdXRpb246XG4gKiAgIDEuIGBwaGFzZTogJ2VudHJ5J2Ag4oCUIHBheWxvYWQgPSB0aGUgaW5wdXQgY3Jvc3NpbmcgdGhlIGJvdW5kYXJ5IElOXG4gKiAgIDIuIGBwaGFzZTogJ2V4aXQnYCAg4oCUIHBheWxvYWQgPSB0aGUgb3V0cHV0IGNyb3NzaW5nIHRoZSBib3VuZGFyeSBPVVRcbiAqXG4gKiAgIExvb3BzIHJlLWVudGVyaW5nIHRoZSBzYW1lIHN1YmZsb3cgZ2V0IGRpc3RpbmN0IGBydW50aW1lU3RhZ2VJZGBzXG4gKiAgIGF1dG9tYXRpY2FsbHkgKHBhcmVudCBzdGFnZSdzIGV4ZWN1dGlvbkluZGV4IGluY3JlbWVudHMgcGVyIGl0ZXJhdGlvbikuXG4gKlxuICogUGF1c2Ugc2VtYW50aWNzOlxuICogICBXaGVuIGEgc3RhZ2UgcGF1c2VzIGluc2lkZSBhIHN1YmZsb3csIHRoZSBlbmdpbmUgcmUtdGhyb3dzIHRoZSBwYXVzZVxuICogICBzaWduYWwgd2l0aG91dCBmaXJpbmcgYG9uU3ViZmxvd0V4aXRgIChvciBgb25SdW5FbmRgKS4gVGhlIHN1YmZsb3dcbiAqICAgaGFzIGFuIGBlbnRyeWAgd2l0aCBubyBtYXRjaGluZyBgZXhpdGAgdW50aWwgdGhlIHJ1biByZXN1bWVzIGFuZFxuICogICBleGl0cyBjbGVhbmx5LiBDb25zdW1lcnMgc2hvdWxkIGhhbmRsZSBlbnRyeS13aXRob3V0LWV4aXQgZ3JhY2VmdWxseVxuICogICAoaXQgbWVhbnMgXCJpbiBwcm9ncmVzc1wiIG9yIFwicGF1c2VkXCIpLiBUaGUgYGdldEJvdW5kYXJ5KClgIGhlbHBlclxuICogICByZXR1cm5zIGB7IGVudHJ5LCBleGl0OiB1bmRlZmluZWQgfWAgaW4gdGhhdCBjYXNlLlxuICpcbiAqIEF0dGVtcHRzICgxMC4xKTpcbiAqICAgQW4gYGV4aXRgIGVudHJ5IGNhcnJpZXMgYGF0dGVtcHRzYCDigJQgdGhlIGNvdW50IG9mIGF0dGVtcHRzIG1hZGUgaW5zaWRlXG4gKiAgIHRoZSBib3VuZGFyeSwgYXQgYW55IGRlcHRoLCBieSBvdXRjb21lLCBhbmQgaG93IG1hbnkgc2VyaWVzIGdhdmUgdXAg4oCUXG4gKiAgIGFuZCBgZmFpbGVkQXR0ZW1wdHNgLCB0aGUgZmFpbGVkIC8gdGltZWQtb3V0IC8gYWJvcnRlZCBvbmVzIGJ5IG5hbWUuIE9ubHlcbiAqICAgc2VyaWVzIHRoYXQgcmV0cmllZCwgZ2F2ZSB1cCBvciB0aW1lZCBvdXQgY291bnQgKGByZWNvcmRlci9hdHRlbXB0U2VyaWVzLnRzIMK3XG4gKiAgIGlzUmV0cnlFdmlkZW5jZWApLCBzbyBib3RoIGZpZWxkcyBhcmUgYWJzZW50IHdoZW4gbm90aGluZyByZXRyaWVkLCBhbmQgYVxuICogICBib3VuZGFyeSBwYWlyIHNheXMgd2hhdCBpdCBjb3N0IHRvIGdldCB0aHJvdWdoLiBBbiBgZW50cnlgIG5ldmVyIGNhcnJpZXNcbiAqICAgdGhlbTogdGhlIGNvc3QgaXMga25vd24gb25seSBhdCB0aGUgZXhpdCDigJQgc28gYSBib3VuZGFyeSB0aGF0IG5ldmVyXG4gKiAgIGV4aXRzIChhIHJ1biBvciBzdWJmbG93IHRoYXQgZmFpbGVkLCBlLmcuIGJlY2F1c2UgYSBzdGFnZSBnYXZlIHVwLCBvciBhXG4gKiAgIHBhdXNlKSBjYXJyaWVzIG5vIGNvdW50OyB0aGUgYXR0ZW1wdHMgYXJlIHRoZW4gb24gdGhlIGV4ZWN1dGlvbiB0cmVlIGFuZFxuICogICB0aGUgYXR0ZW1wdC1hd2FyZSByZWNvcmRlcnMgKFRvcG9sb2d5LCBEZWJ1ZywgUXVhbGl0eSkuXG4gKlxuICogUmVkYWN0aW9uOlxuICogICBQYXlsb2FkIHJlZGFjdGlvbiBpcyB0aGUgZW5naW5lJ3MgcmVzcG9uc2liaWxpdHkgKGBSZWRhY3Rpb25Qb2xpY3lgKS5cbiAqICAgQnkgdGhlIHRpbWUgcGF5bG9hZHMgcmVhY2ggdGhpcyByZWNvcmRlciB2aWEgYEZsb3dTdWJmbG93RXZlbnRgIG9yXG4gKiAgIGBGbG93UnVuRXZlbnRgLCBuYW1lZCB2YWx1ZXMgaGF2ZSBwYXNzZWQgdGhlIHJ1bidzIHJ1bGUuIFJvb3QgcnVuXG4gKiAgIHBheWxvYWRzIGFyZSB3YWxrZWQgYXQgZXZlcnkgZGVwdGggKGEgbmVzdGVkIGtleSBieSBpdHMgb3duIG5hbWUgb3JcbiAqICAgZG90dGVkIHBhdGgpIHBsdXMgZXhwbGljaXQgbmVzdGVkIGZpZWxkczsgc2NhbGFycyBwYXNzIHRocm91Z2gsIGFuZCBmb3JrXG4gKiAgIGNoaWxkLUlEIGVudmVsb3BlcyBuZWVkIGV4cGxpY2l0IHJlc3VsdCBwYXRocy4gVGhpcyBpcyBub3QgY29udGVudCBzY2FubmluZy4gVGhlIHJlY29yZGVyXG4gKiAgIGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCkgcmUtcmVkYWN0IG9yIHJlY29uc3RydWN0IHRoZSBydW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGluT3V0UmVjb3JkZXIgfSBmcm9tICdmb290cHJpbnRqcy90cmFjZSc7XG4gKlxuICogY29uc3QgaW5PdXQgPSBpbk91dFJlY29yZGVyKCk7XG4gKiBleGVjdXRvci5hdHRhY2hDb21iaW5lZFJlY29yZGVyKGluT3V0KTtcbiAqIGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0IH0pO1xuICpcbiAqIGluT3V0LmdldFN0ZXBzKCk7ICAgICAgICAgICAgICAgICAgICAvLyBlbnRyeSBib3VuZGFyaWVzIOKAlCB0aW1lbGluZSBwcm9qZWN0aW9uXG4gKiBpbk91dC5nZXRCb3VuZGFyeShydW50aW1lU3RhZ2VJZCk7ICAgLy8geyBlbnRyeSwgZXhpdCB9IHBhaXIgZm9yIG9uZSBleGVjdXRpb25cbiAqIGluT3V0LmdldEJvdW5kYXJpZXMoKTsgICAgICAgICAgICAgICAvLyBmbGF0IGxpc3QgKGVudHJ5K2V4aXQgaW50ZXJsZWF2ZWQpXG4gKiBpbk91dC5nZXRSb290Qm91bmRhcnkoKTsgICAgICAgICAgICAgLy8geyBlbnRyeSwgZXhpdCB9IGZvciB0aGUgdG9wLWxldmVsIHJ1blxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgRmlsdGVyaW5nIGJ5IHN1YmZsb3cgcGF0aFxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgYWdlbnRTdGVwcyA9IGluT3V0XG4gKiAgIC5nZXRTdGVwcygpXG4gKiAgIC5maWx0ZXIoKGIpID0+IGIuc3ViZmxvd1BhdGhbMV0gPT09ICdzZi1hZ2VudCcpOyAgLy8gcGF0aFswXSBpcyB0aGUgcm9vdFxuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgaWRQYXRoU2VnbWVudHMgYXMgcGF0aFNlZ21lbnRzIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBBdHRlbXB0T3V0Y29tZSB9IGZyb20gJy4uL2F0dGVtcHQvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93QXR0ZW1wdEV2ZW50LCBGbG93UmVjb3JkZXIsIEZsb3dSdW5FdmVudCwgRmxvd1N1YmZsb3dFdmVudCB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBBdHRlbXB0T3V0Y29tZUNvdW50cywgQXR0ZW1wdFJlZiB9IGZyb20gJy4vYXR0ZW1wdFNlcmllcy5qcyc7XG5pbXBvcnQge1xuICBhdHRlbXB0RmFpbGVkLFxuICBhdHRlbXB0UmVmLFxuICBlbXB0eU91dGNvbWVDb3VudHMsXG4gIGdhdmVVcCxcbiAgaXNSZXRyeUV2aWRlbmNlLFxuICBzdWJmbG93T2ZBdHRlbXB0LFxufSBmcm9tICcuL2F0dGVtcHRTZXJpZXMuanMnO1xuaW1wb3J0IHsgU2VxdWVuY2VTdG9yZSB9IGZyb20gJy4vU2VxdWVuY2VTdG9yZS5qcyc7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IHR5cGUgSW5PdXRQaGFzZSA9ICdlbnRyeScgfCAnZXhpdCc7XG5cbi8qKiBTeW50aGV0aWMgaWQgZm9yIHRoZSB0b3AtbGV2ZWwgcnVuJ3MgYm91bmRhcnkgcGFpci4gKi9cbmV4cG9ydCBjb25zdCBST09UX1NVQkZMT1dfSUQgPSAnX19yb290X18nO1xuXG4vKiogU3ludGhldGljIHJ1bnRpbWVTdGFnZUlkIGZvciB0aGUgdG9wLWxldmVsIHJ1biBib3VuZGFyeSBwYWlyLiAqL1xuZXhwb3J0IGNvbnN0IFJPT1RfUlVOVElNRV9TVEFHRV9JRCA9ICdfX3Jvb3RfXyMwJztcblxuLyoqXG4gKiBPbmUgaGFsZiBvZiBhIGNoYXJ0IGV4ZWN1dGlvbiBib3VuZGFyeS4gRW50cnkvZXhpdCBwYWlycyBzaGFyZSBgcnVudGltZVN0YWdlSWRgLlxuICpcbiAqIE5hbWluZyBmb2xsb3dzIHRoZSBlbmdpbmU6IGBzdWJmbG93SWRgIGlzIHRoZSBwYXRoLXByZWZpeGVkIGlkZW50aWZpZXIgdGhlXG4gKiBlbmdpbmUgZW1pdHMgKGUuZy4gYCdzZi1vdXRlci9zZi1pbm5lcidgIGZvciBuZXN0ZWQgc3ViZmxvd3MpLiBGb3IgdGhlXG4gKiB0b3AtbGV2ZWwgcnVuLCBpdCdzIHRoZSBzeW50aGV0aWMgYCdfX3Jvb3RfXydgLiBgc3ViZmxvd1BhdGhgIGlzIHRoZVxuICogZGVjb21wb3NpdGlvbiBpbnRvIHNlZ21lbnRzIOKAlCBwcm92aWRlZCBhcyBhIGNvbnZlbmllbmNlIGJlY2F1c2UgY29uc3VtZXJzXG4gKiBvZnRlbiBxdWVyeSAvIGdyb3VwIGJ5IHRoZSBwYXRoIHRyZWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5PdXRFbnRyeSB7XG4gIC8qKiBydW50aW1lU3RhZ2VJZCDigJQgc2FtZSB2YWx1ZSBmb3IgdGhlIGVudHJ5L2V4aXQgcGFpciBvZiBvbmUgZXhlY3V0aW9uLlxuICAgKiAgVG9wLWxldmVsIHJ1biB1c2VzIHRoZSBzeW50aGV0aWMgYFJPT1RfUlVOVElNRV9TVEFHRV9JRGAuICovXG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKiBQYXRoLXByZWZpeGVkIHN1YmZsb3cgaWRlbnRpZmllciAobWF0Y2hlcyB0aGUgZW5naW5lJ3MgYEZsb3dTdWJmbG93RXZlbnQuc3ViZmxvd0lkYCkuXG4gICAqICBUb3AtbGV2ZWwg4oaSIGAnX19yb290X18nYC4gU3ViZmxvdyDihpIgYCdzZi1vdXRlcidgIG9yIGAnc2Ytb3V0ZXIvc2YtaW5uZXInYC4gKi9cbiAgcmVhZG9ubHkgc3ViZmxvd0lkOiBzdHJpbmc7XG4gIC8qKiBMYXN0IHNlZ21lbnQgb2YgYHN1YmZsb3dJZGAg4oCUIGNvbnZlbmllbmNlIGZvciBjb25zdW1lcnMgdGhhdCBncm91cCBieSBsZWFmIG5hbWUuXG4gICAqICBUb3AtbGV2ZWwg4oaSIGAnX19yb290X18nYC4gKi9cbiAgcmVhZG9ubHkgbG9jYWxTdWJmbG93SWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGRpc3BsYXkgbmFtZSAoZnJvbSB0aGUgYnVpbGRlcjsgYCdSdW4nYCBmb3IgdGhlIHRvcC1sZXZlbCBydW4pLiAqL1xuICByZWFkb25seSBzdWJmbG93TmFtZTogc3RyaW5nO1xuICAvKiogQnVpbGQtdGltZSBkZXNjcmlwdGlvbiBmcm9tIHRoZSBzdWJmbG93J3Mgcm9vdCBzdGFnZS5cbiAgICogIENhcnJpZXMgdGF4b25vbXkgbWFya2VycyAoZS5nLiBgJ0FnZW50OiBSZUFjdCBsb29wJ2ApLiBVbmRlZmluZWQgZm9yIHJvb3QuICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKiogRGVjb21wb3NpdGlvbiBvZiBgc3ViZmxvd0lkYCBpbnRvIHNlZ21lbnRzLiBUb3AtbGV2ZWwg4oaSIGBbJ19fcm9vdF9fJ11gLlxuICAgKiAgU3ViZmxvd3MgbGl2ZSBVTkRFUiB0aGUgcm9vdDogYSB0b3AtbGV2ZWwgc3ViZmxvdyBoYXMgcGF0aCBgWydfX3Jvb3RfXycsICdzZi14J11gLiAqL1xuICByZWFkb25seSBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBEZXB0aCBpbiB0aGUgc3ViZmxvdyB0cmVlLiBSb290IOKGkiAwLiBGaXJzdC1sZXZlbCBzdWJmbG93IOKGkiAxLiAqL1xuICByZWFkb25seSBkZXB0aDogbnVtYmVyO1xuICAvKiogV2hpY2ggc2lkZSBvZiB0aGUgYm91bmRhcnkgdGhpcyBlbnRyeSByZXByZXNlbnRzLiAqL1xuICByZWFkb25seSBwaGFzZTogSW5PdXRQaGFzZTtcbiAgLyoqIERhdGEgY3Jvc3NpbmcgdGhlIGJvdW5kYXJ5LlxuICAgKiAgLSBgcGhhc2U6ICdlbnRyeSdgIOKGkiBgaW5wdXRNYXBwZXJgIHJlc3VsdCAoc3ViZmxvdykgb3IgYHJ1bih7aW5wdXR9KWAgKHJvb3QpXG4gICAqICAtIGBwaGFzZTogJ2V4aXQnYCAg4oaSIHN1YmZsb3cgc2hhcmVkIHN0YXRlIGF0IGV4aXQgKHN1YmZsb3cpIG9yIGNoYXJ0IHJldHVybiB2YWx1ZSAocm9vdClcbiAgICpcbiAgICogIFVuZGVmaW5lZCB3aGVuIG5vIG1hcHBlciAvIG5vIGlucHV0IHdhcyBwcm92aWRlZC4gKi9cbiAgcmVhZG9ubHkgcGF5bG9hZD86IHVua25vd247XG4gIC8qKiBUcnVlIHdoZW4gdGhpcyBlbnRyeSBjYW1lIGZyb20gdGhlIHRvcC1sZXZlbCBydW4gKGBvblJ1blN0YXJ0YCAvIGBvblJ1bkVuZGApXG4gICAqICByYXRoZXIgdGhhbiBmcm9tIGEgc3ViZmxvdyAoYG9uU3ViZmxvd0VudHJ5YCAvIGBvblN1YmZsb3dFeGl0YCkuXG4gICAqICBMZW5zIHVzZXMgdGhpcyB0byByZW5kZXIgdGhlIHJvb3QgcGFpciBhcyBgdXNlciDihpIgcnVuIOKGkiB1c2VyYCBpbnN0ZWFkIG9mXG4gICAqICB0aGUgcmVndWxhciBzdWJmbG93IHNoYXBlLiAqL1xuICByZWFkb25seSBpc1Jvb3Q6IGJvb2xlYW47XG4gIC8qKiBgcGhhc2U6ICdleGl0J2Agb25seSwgYW5kIG9ubHkgd2hlbiBzb21ldGhpbmcgaW5zaWRlIHJldHJpZWQsIGdhdmUgdXAgb3IgdGltZWQgb3V0IOKAlCBzZWUge0BsaW5rIEluT3V0QXR0ZW1wdHN9LiAqL1xuICByZWFkb25seSBhdHRlbXB0cz86IEluT3V0QXR0ZW1wdHM7XG4gIC8qKiBXaXRoIGBhdHRlbXB0c2A6IHRoZSBhdHRlbXB0cyBpbnNpZGUgdGhhdCBmYWlsZWQsIHRpbWVkIG91dCBvciB3ZXJlIGFib3J0ZWQsIGluIHRoZSBvcmRlciB0aGV5IGVuZGVkLiAqL1xuICByZWFkb25seSBmYWlsZWRBdHRlbXB0cz86IHJlYWRvbmx5IEF0dGVtcHRSZWZbXTtcbn1cblxuLyoqIEF0dGVtcHRzIGFjY3VtdWxhdGVkIGluc2lkZSBvbmUgb3BlbiBib3VuZGFyeS4gKi9cbmNsYXNzIEJvdW5kYXJ5QXR0ZW1wdHMge1xuICBwcml2YXRlIGNvdW50ID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBieU91dGNvbWUgPSBlbXB0eU91dGNvbWVDb3VudHMoKTtcbiAgcHJpdmF0ZSBnYXZlVXAgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IGZhaWxlZDogQXR0ZW1wdFJlZltdID0gW107XG5cbiAgYWRkKG91dGNvbWU6IEF0dGVtcHRPdXRjb21lLCBnYXZlOiBib29sZWFuLCBmYWlsZWQ6IEF0dGVtcHRSZWYgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLmNvdW50ICs9IDE7XG4gICAgdGhpcy5ieU91dGNvbWVbb3V0Y29tZV0gKz0gMTtcbiAgICBpZiAoZ2F2ZSkgdGhpcy5nYXZlVXAgKz0gMTtcbiAgICBpZiAoZmFpbGVkKSB0aGlzLmZhaWxlZC5wdXNoKGZhaWxlZCk7XG4gIH1cblxuICAvKiogVGhlIGV4aXQgZW50cnkncyBmaWVsZHMg4oCUIG5vbmUgd2hlbiBub3RoaW5nIHJldHJpZWQgaW5zaWRlLiAqL1xuICBmaWVsZHMoKTogUGljazxJbk91dEVudHJ5LCAnYXR0ZW1wdHMnIHwgJ2ZhaWxlZEF0dGVtcHRzJz4ge1xuICAgIGlmICh0aGlzLmNvdW50ID09PSAwKSByZXR1cm4ge307XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dGVtcHRzOiB7IGNvdW50OiB0aGlzLmNvdW50LCBieU91dGNvbWU6IHsgLi4udGhpcy5ieU91dGNvbWUgfSwgZ2F2ZVVwOiB0aGlzLmdhdmVVcCB9LFxuICAgICAgZmFpbGVkQXR0ZW1wdHM6IFsuLi50aGlzLmZhaWxlZF0sXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFdoYXQgaXQgY29zdCB0byBnZXQgdGhyb3VnaCBhIGJvdW5kYXJ5OiB0aGUgYXR0ZW1wdHMgbWFkZSBpbnNpZGUgaXQgKGF0IGFueSBkZXB0aCkgYnkgc2VyaWVzIHRoYXQgcmV0cmllZCwgZ2F2ZVxuICogdXAgb3IgdGltZWQgb3V0IOKAlCBgY291bnRgLCBwZXIgb3V0Y29tZSAoYHRpbWVvdXRgIGluY2x1ZGVkKSwgYW5kIGhvdyBtYW55IG9mIHRob3NlIHNlcmllcyBnYXZlIHVwIChgZXhoYXVzdGVkYCxcbiAqIGBkZWNsaW5lZGAsIGBuby10aW1lLWxlZnRgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbk91dEF0dGVtcHRzIHtcbiAgcmVhZG9ubHkgY291bnQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgYnlPdXRjb21lOiBBdHRlbXB0T3V0Y29tZUNvdW50cztcbiAgcmVhZG9ubHkgZ2F2ZVVwOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5PdXRSZWNvcmRlck9wdGlvbnMge1xuICAvKiogU2NvcGVSZWNvcmRlciBpZC4gRGVmYXVsdHMgdG8gYGlub3V0LU5gIChhdXRvLWluY3JlbWVudGVkKS4gKi9cbiAgaWQ/OiBzdHJpbmc7XG59XG5cbmxldCBfY291bnRlciA9IDA7XG5cbi8qKlxuICogRmFjdG9yeSDigJQgbWF0Y2hlcyB0aGUgYHRvcG9sb2d5UmVjb3JkZXIoKWAgLyBgbmFycmF0aXZlKClgIHN0eWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5PdXRSZWNvcmRlcihvcHRpb25zOiBJbk91dFJlY29yZGVyT3B0aW9ucyA9IHt9KTogSW5PdXRSZWNvcmRlciB7XG4gIHJldHVybiBuZXcgSW5PdXRSZWNvcmRlcihvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBTdGF0ZWZ1bCBhY2N1bXVsYXRvciB0aGF0IHdhdGNoZXMgYEZsb3dSZWNvcmRlcmAgY2hhcnQtYm91bmRhcnkgZXZlbnRzXG4gKiAocnVuIHN0YXJ0L2VuZCArIHN1YmZsb3cgZW50cnkvZXhpdCkgYW5kIHB1c2hlcyBgSW5PdXRFbnRyeWAgcmVjb3JkcyB0b1xuICogaXRzIGNvbXBvc2VkIGBTZXF1ZW5jZVN0b3JlYCAoQ29udmVudGlvbiAxIOKAlCBvbmUgcHVycG9zZSBwZXIgcmVjb3JkZXIpLlxuICpcbiAqIEF0dGFjaCB2aWEgYGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIocmVjb3JkZXIpYCDigJQgZm9vdHByaW50anNcbiAqIGRldGVjdHMgdGhlIGBGbG93UmVjb3JkZXJgIG1ldGhvZCBzaGFwZSBhbmQgcm91dGVzIGV2ZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEluT3V0UmVjb3JkZXIgaW1wbGVtZW50cyBGbG93UmVjb3JkZXIge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogMTpOIG9yZGVyZWQgc3RvcmFnZSB3aXRoIHBlci1zdGVwIGluZGV4IChDb252ZW50aW9uIDEg4oCUIGNvbXBvc2VkKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzdG9yZSA9IG5ldyBTZXF1ZW5jZVN0b3JlPEluT3V0RW50cnk+KCk7XG4gIC8qKiBUaGUgcm9vdCBydW4ncyBhdHRlbXB0cyDigJQgZXZlcnkgYXR0ZW1wdCBpcyBpbnNpZGUgaXQuICovXG4gIHByaXZhdGUgcm9vdEF0dGVtcHRzID0gbmV3IEJvdW5kYXJ5QXR0ZW1wdHMoKTtcbiAgLyoqIE9wZW4gc3ViZmxvdyBib3VuZGFyaWVzJyBhdHRlbXB0cywgYnkgcGF0aC1wcmVmaXhlZCBzdWJmbG93SWQuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgb3BlbkF0dGVtcHRzID0gbmV3IE1hcDxzdHJpbmcsIEJvdW5kYXJ5QXR0ZW1wdHM+KCk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSW5PdXRSZWNvcmRlck9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkID8/IGBpbm91dC0keysrX2NvdW50ZXJ9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBGbG93UmVjb3JkZXIgaG9va3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgb25SdW5TdGFydChldmVudDogRmxvd1J1bkV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5yb290QXR0ZW1wdHMgPSBuZXcgQm91bmRhcnlBdHRlbXB0cygpO1xuICAgIHRoaXMub3BlbkF0dGVtcHRzLmNsZWFyKCk7XG4gICAgdGhpcy5zdG9yZS5wdXNoKGJ1aWxkUm9vdEVudHJ5KCdlbnRyeScsIGV2ZW50LnBheWxvYWQpKTtcbiAgfVxuXG4gIG9uUnVuRW5kKGV2ZW50OiBGbG93UnVuRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnB1c2goeyAuLi5idWlsZFJvb3RFbnRyeSgnZXhpdCcsIGV2ZW50LnBheWxvYWQpLCAuLi50aGlzLnJvb3RBdHRlbXB0cy5maWVsZHMoKSB9KTtcbiAgfVxuXG4gIG9uU3ViZmxvd0VudHJ5KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSBidWlsZFN1YmZsb3dFbnRyeShldmVudCwgJ2VudHJ5Jyk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuICAgIHRoaXMub3BlbkF0dGVtcHRzLnNldChlbnRyeS5zdWJmbG93SWQsIG5ldyBCb3VuZGFyeUF0dGVtcHRzKCkpO1xuICAgIHRoaXMuc3RvcmUucHVzaChlbnRyeSk7XG4gIH1cblxuICBvblN1YmZsb3dFeGl0KGV2ZW50OiBGbG93U3ViZmxvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZW50cnkgPSBidWlsZFN1YmZsb3dFbnRyeShldmVudCwgJ2V4aXQnKTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm47XG4gICAgY29uc3QgYXR0ZW1wdHMgPSB0aGlzLm9wZW5BdHRlbXB0cy5nZXQoZW50cnkuc3ViZmxvd0lkKTtcbiAgICB0aGlzLm9wZW5BdHRlbXB0cy5kZWxldGUoZW50cnkuc3ViZmxvd0lkKTtcbiAgICB0aGlzLnN0b3JlLnB1c2goYXR0ZW1wdHMgPyB7IC4uLmVudHJ5LCAuLi5hdHRlbXB0cy5maWVsZHMoKSB9IDogZW50cnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyBhbiBhdHRlbXB0IGluIHRoZSByb290IGJvdW5kYXJ5IGFuZCBpbiBldmVyeSBvcGVuIHN1YmZsb3cgYm91bmRhcnkgdGhhdCBjb250YWlucyB0aGUgc3RhZ2Ug4oCUIHRoZVxuICAgKiBzdWJmbG93IHRoZSBzdGFnZSByYW4gaW4gaXMgdGhhdCBzdWJmbG93J3MgaWQgb3IgYmVsb3cgaXQuXG4gICAqL1xuICBvbkF0dGVtcHQoZXZlbnQ6IEZsb3dBdHRlbXB0RXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCB7IHJlY29yZCB9ID0gZXZlbnQ7XG4gICAgaWYgKCFpc1JldHJ5RXZpZGVuY2UocmVjb3JkKSkgcmV0dXJuO1xuICAgIGNvbnN0IGdhdmUgPSBnYXZlVXAocmVjb3JkKTtcbiAgICBjb25zdCBmYWlsZWQgPSBhdHRlbXB0RmFpbGVkKHJlY29yZCkgPyBhdHRlbXB0UmVmKHJlY29yZCkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5yb290QXR0ZW1wdHMuYWRkKHJlY29yZC5vdXRjb21lLCBnYXZlLCBmYWlsZWQpO1xuICAgIGNvbnN0IHBhdGggPSBzdWJmbG93T2ZBdHRlbXB0KGV2ZW50KTtcbiAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgZm9yIChjb25zdCBbc3ViZmxvd0lkLCBhdHRlbXB0c10gb2YgdGhpcy5vcGVuQXR0ZW1wdHMpIHtcbiAgICAgIGlmIChwYXRoID09PSBzdWJmbG93SWQgfHwgcGF0aC5zdGFydHNXaXRoKGAke3N1YmZsb3dJZH0vYCkpIGF0dGVtcHRzLmFkZChyZWNvcmQub3V0Y29tZSwgZ2F2ZSwgZmFpbGVkKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgUXVlcnkgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBBbGwgZW50cmllcyBpbiBleGVjdXRpb24gb3JkZXIgKGVudHJ5K2V4aXQgaW50ZXJsZWF2ZWQpLiAqL1xuICBnZXRCb3VuZGFyaWVzKCk6IEluT3V0RW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0QWxsKCk7XG4gIH1cblxuICAvKiogRW50cnkvZXhpdCBwYWlyIGZvciBvbmUgY2hhcnQgZXhlY3V0aW9uLlxuICAgKiAgUmV0dXJucyBgeyBlbnRyeSwgZXhpdCB9YCDigJQgYGV4aXRgIGlzIGB1bmRlZmluZWRgIGZvciBpbi1wcm9ncmVzcyAvIHBhdXNlZFxuICAgKiAgY2hhcnRzIG9yIGlmIGBydW50aW1lU3RhZ2VJZGAgaXMgdW5rbm93bi4gKi9cbiAgZ2V0Qm91bmRhcnkocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IHsgZW50cnk/OiBJbk91dEVudHJ5OyBleGl0PzogSW5PdXRFbnRyeSB9IHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5zdG9yZS5nZXRCeUtleShydW50aW1lU3RhZ2VJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVudHJ5OiBlbnRyaWVzLmZpbmQoKGUpID0+IGUucGhhc2UgPT09ICdlbnRyeScpLFxuICAgICAgZXhpdDogZW50cmllcy5maW5kKChlKSA9PiBlLnBoYXNlID09PSAnZXhpdCcpLFxuICAgIH07XG4gIH1cblxuICAvKiogSnVzdCB0aGUgYGVudHJ5YC1waGFzZSBib3VuZGFyaWVzIOKAlCB0aGUgXCJzdGVwIGxpc3RcIiBwcm9qZWN0aW9uIGluXG4gICAqICBleGVjdXRpb24gb3JkZXIuIFRoaXMgaXMgdGhlIG5hdHVyYWwgdGltZWxpbmUgb2YgY2hhcnQgZXhlY3V0aW9uc1xuICAgKiAgZm9yIHNsaWRlciAvIHNjcnViYmluZyBVSXMuIFRoZSB0b3AtbGV2ZWwgcnVuJ3MgZW50cnkgaXMgdGhlIGZpcnN0XG4gICAqICBzdGVwIChkZXB0aCAwKS4gKi9cbiAgZ2V0U3RlcHMoKTogSW5PdXRFbnRyeVtdIHtcbiAgICBjb25zdCBzdGVwczogSW5PdXRFbnRyeVtdID0gW107XG4gICAgZm9yIChjb25zdCBiIG9mIHRoaXMuc3RvcmUuZ2V0QWxsKCkpIHtcbiAgICAgIGlmIChiLnBoYXNlID09PSAnZW50cnknKSBzdGVwcy5wdXNoKGIpO1xuICAgIH1cbiAgICByZXR1cm4gc3RlcHM7XG4gIH1cblxuICAvKiogTygxKSBsb29rdXA6IGFsbCBib3VuZGFyeSBlbnRyaWVzIChib3RoIHBoYXNlcykgZm9yIG9uZSBydW50aW1lU3RhZ2VJZC4gKi9cbiAgZ2V0RW50cmllc0ZvclN0ZXAocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IEluT3V0RW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0QnlLZXkocnVudGltZVN0YWdlSWQpO1xuICB9XG5cbiAgLyoqIFByZS1idWlsdCBwZXItc3RlcCByYW5nZSBpbmRleCDigJQgTygxKSBsb29rdXBzIGZvciB0aW1lLXRyYXZlbCBzY3J1YmJpbmcuICovXG4gIGdldEVudHJ5UmFuZ2VzKCk6IFJlYWRvbmx5TWFwPHN0cmluZywgeyByZWFkb25seSBmaXJzdElkeDogbnVtYmVyOyByZWFkb25seSBlbmRJZHg6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0RW50cnlSYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBQcm9ncmVzc2l2ZSByZXZlYWw6IGJvdW5kYXJpZXMgd2hvc2UgcnVudGltZVN0YWdlSWQgaXMgaW4gdGhlIHZpc2libGUgc2V0LiAqL1xuICBnZXRFbnRyaWVzVXBUbyh2aXNpYmxlSWRzOiBSZWFkb25seVNldDxzdHJpbmc+KTogSW5PdXRFbnRyeVtdIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRFbnRyaWVzVXBUbyh2aXNpYmxlSWRzKTtcbiAgfVxuXG4gIC8qKiBDbGVhciBhbGwgc3RvcmVkIGJvdW5kYXJpZXMg4oCUIGNhbGxlZCBieSB0aGUgZXhlY3V0b3IgYmVmb3JlIGVhY2ggcnVuKCkuICovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUuY2xlYXIoKTtcbiAgICB0aGlzLnJvb3RBdHRlbXB0cyA9IG5ldyBCb3VuZGFyeUF0dGVtcHRzKCk7XG4gICAgdGhpcy5vcGVuQXR0ZW1wdHMuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKiBUaGUgcm9vdCBydW4ncyBlbnRyeS9leGl0IHBhaXIsIGlmIHRoZSBydW4gaGFzIHN0YXJ0ZWQuXG4gICAqICBDb252ZW5pZW5jZSBmb3IgY29uc3VtZXJzIHRoYXQgd2FudCB0byBicmFja2V0IHRoZSB0aW1lbGluZSBieSB0aGVcbiAgICogIG91dGVybW9zdCBpbi9vdXQuICovXG4gIGdldFJvb3RCb3VuZGFyeSgpOiB7IGVudHJ5PzogSW5PdXRFbnRyeTsgZXhpdD86IEluT3V0RW50cnkgfSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm91bmRhcnkoUk9PVF9SVU5USU1FX1NUQUdFX0lEKTtcbiAgfVxuXG4gIC8qKiBTbmFwc2hvdCBidW5kbGUgZm9yIGluY2x1c2lvbiBpbiBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWAuICovXG4gIHRvU25hcHNob3QoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdJbk91dCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NoYXJ0IGluL291dCBzdHJlYW0g4oCUIGVudHJ5L2V4aXQgcGFpcnMgYXQgZXZlcnkgY2hhcnQgYm91bmRhcnkgKHJvb3QgKyBzdWJmbG93cyknLFxuICAgICAgcHJlZmVycmVkT3BlcmF0aW9uOiAndHJhbnNsYXRlJyBhcyBjb25zdCxcbiAgICAgIGRhdGE6IHRoaXMuZ2V0Qm91bmRhcmllcygpLFxuICAgIH07XG4gIH1cbn1cblxuLy8g4pSA4pSAIEludGVybmFsIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQnVpbGQgdGhlIHN5bnRoZXRpYyByb290IGVudHJ5L2V4aXQuIERlcHRoIGlzIGAwYCBhbmQgdGhlIHBhdGggaXNcbiAqIGBbUk9PVF9TVUJGTE9XX0lEXWAgc28gY29uc3VtZXJzIGdyb3VwaW5nIGJ5IHBhdGggc2VlIHRoZSByb290IGFzIGFcbiAqIHJlZ3VsYXIgdG9wLWxldmVsIGNvbnRhaW5lci5cbiAqL1xuZnVuY3Rpb24gYnVpbGRSb290RW50cnkocGhhc2U6IEluT3V0UGhhc2UsIHBheWxvYWQ6IHVua25vd24pOiBJbk91dEVudHJ5IHtcbiAgcmV0dXJuIHtcbiAgICBydW50aW1lU3RhZ2VJZDogUk9PVF9SVU5USU1FX1NUQUdFX0lELFxuICAgIHN1YmZsb3dJZDogUk9PVF9TVUJGTE9XX0lELFxuICAgIGxvY2FsU3ViZmxvd0lkOiBST09UX1NVQkZMT1dfSUQsXG4gICAgc3ViZmxvd05hbWU6ICdSdW4nLFxuICAgIHN1YmZsb3dQYXRoOiBbUk9PVF9TVUJGTE9XX0lEXSxcbiAgICBkZXB0aDogMCxcbiAgICBwaGFzZSxcbiAgICBwYXlsb2FkLFxuICAgIGlzUm9vdDogdHJ1ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIHN1YmZsb3cgYEluT3V0RW50cnlgIGZyb20gYSBgRmxvd1N1YmZsb3dFdmVudGAuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBldmVudCBsYWNrcyBhIGBzdWJmbG93SWRgIChhbm9ueW1vdXMgL1xuICogbWFsZm9ybWVkIHN1YmZsb3cgZXZlbnRzIOKAlCBzYW1lIGRlZmVuc2l2ZSBwb2xpY3kgYXMgYFRvcG9sb2d5UmVjb3JkZXJgKS5cbiAqXG4gKiBQYXRoIGRlcml2YXRpb246IHRoZSBlbmdpbmUgZW1pdHMgYHN1YmZsb3dJZGAgYWxyZWFkeSBwcmVmaXhlZCB3aXRoIHRoZVxuICogZnVsbCBwYXRoIG9mIHBhcmVudCBzdWJmbG93cyAoZS5nLiBgJ3NmLW91dGVyL3NmLWlubmVyJ2ApLiBXZSBkZWNvbXBvc2VcbiAqIHRoYXQgaW50byBzZWdtZW50cyB0byBwb3B1bGF0ZSBgc3ViZmxvd1BhdGhgIGFuZCBjb21wdXRlIGBkZXB0aGAuXG4gKlxuICogU3ViZmxvd3MgbmVzdCBVTkRFUiB0aGUgc3ludGhldGljIHJvb3QgaW4gYHN1YmZsb3dQYXRoYCBzbyB0aGUgdHJlZSBpc1xuICogY29tcGxldGU6IGEgdG9wLWxldmVsIHN1YmZsb3cgaGFzIHBhdGggYFsnX19yb290X18nLCAnc2YteCddYCBhbmQgZGVwdGggMS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTdWJmbG93RW50cnkoZXZlbnQ6IEZsb3dTdWJmbG93RXZlbnQsIHBoYXNlOiBJbk91dFBoYXNlKTogSW5PdXRFbnRyeSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHN1YmZsb3dJZCA9IGV2ZW50LnN1YmZsb3dJZDtcbiAgaWYgKCFzdWJmbG93SWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgcnVudGltZVN0YWdlSWQgPSBldmVudC50cmF2ZXJzYWxDb250ZXh0Py5ydW50aW1lU3RhZ2VJZCA/PyAnJztcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoU2VnbWVudHMoc3ViZmxvd0lkKTtcbiAgY29uc3Qgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1JPT1RfU1VCRkxPV19JRCwgLi4uc2VnbWVudHNdO1xuICBjb25zdCBkZXB0aCA9IHN1YmZsb3dQYXRoLmxlbmd0aCAtIDE7XG4gIGNvbnN0IGxvY2FsU3ViZmxvd0lkID0gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0gPz8gc3ViZmxvd0lkO1xuICBjb25zdCBwYXlsb2FkID0gcGhhc2UgPT09ICdlbnRyeScgPyBldmVudC5tYXBwZWRJbnB1dCA6IGV2ZW50Lm91dHB1dFN0YXRlO1xuXG4gIHJldHVybiB7XG4gICAgcnVudGltZVN0YWdlSWQsXG4gICAgc3ViZmxvd0lkLFxuICAgIGxvY2FsU3ViZmxvd0lkLFxuICAgIHN1YmZsb3dOYW1lOiBldmVudC5uYW1lLFxuICAgIGRlc2NyaXB0aW9uOiBldmVudC5kZXNjcmlwdGlvbixcbiAgICBzdWJmbG93UGF0aCxcbiAgICBkZXB0aCxcbiAgICBwaGFzZSxcbiAgICBwYXlsb2FkLFxuICAgIGlzUm9vdDogZmFsc2UsXG4gIH07XG59XG4iXX0=