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
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ /**
3
+ * runner/recordSink.ts — the run's side of the crash-safe record (design §3.5, packet P6).
4
+ *
5
+ * foottrace owns the port (`RecordSink`, `foottrace/write`): a log built with a sink hands it every entry AS IT
6
+ * LANDS — `opened`, `commit`, `note`, `closed` — and counts what the sink did not take. This file is what the
7
+ * EXECUTOR adds around an app's adapter, one {@link RunRecord} per run:
8
+ *
9
+ * - THE ONE LAW, before any byte leaves: the `opened` base is the run's served form of it (the redaction rule's
10
+ * `retainState`, the mirror's seed — so a policy key seeded by `initialContext` or a checkpoint never reaches
11
+ * the sink), and the `opened` / `closed` meta are boundary records (`retainBoundary`). A commit is the log's own
12
+ * bundle, already scrubbed at commit; an attempt note carries the served `AttemptRecord` (no `raw`).
13
+ * - ACCOUNTING: every entry handed to the adapter is counted, every loss too (`getSnapshot().sink`), with a
14
+ * dev-mode warning on the first loss of a run. The adapter's own `onFailure` hears a dispatched entry's loss
15
+ * with that same served entry and a served error, isolated. A refusal before dispatch is counted without
16
+ * forwarding Foottrace's unserved entry.
17
+ * - THE FAILURE MODE (owner ruling Q3): `'report'` (default) — the run goes on; `'fail'` — the first lost entry
18
+ * aborts the run's signal with a {@link RecordSinkError}, and a run that finished with a loss rejects with it.
19
+ * - FLUSH: `'auto'` (default) — `run()` / `resume()` await the adapter's `flush()` after the closing entry;
20
+ * `'manual'` — the app calls `executor.flushRecord()`.
21
+ *
22
+ * Every adapter method is called synchronously from the log; whatever the adapter throws or rejects with is the
23
+ * log's to count (`EventLog · sinkFailures`), never the run's — so nothing here throws to the engine.
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.RunRecord = exports.resolveRecordSink = exports.RecordSinkError = void 0;
27
+ const write_1 = require("foottrace/write");
28
+ const devMode_js_1 = require("../devMode.js");
29
+ const errorInfo_js_1 = require("../errors/errorInfo.js");
30
+ const redaction_js_1 = require("../memory/redaction.js");
31
+ /**
32
+ * A run with `sink: { onFailure: 'fail' }` lost an entry: the record the app asked to be kept is not whole.
33
+ * `cause` is the adapter's own error.
34
+ */
35
+ class RecordSinkError extends Error {
36
+ cause;
37
+ name = 'RecordSinkError';
38
+ constructor(message, cause) {
39
+ super(message);
40
+ this.cause = cause;
41
+ }
42
+ }
43
+ exports.RecordSinkError = RecordSinkError;
44
+ const METHODS = ['opened', 'commit', 'note', 'closed'];
45
+ function isAdapter(value) {
46
+ if (value === null || typeof value !== 'object')
47
+ return false;
48
+ return METHODS.every((m) => typeof value[m] === 'function');
49
+ }
50
+ /**
51
+ * Resolve the executor's `sink` option, or refuse it with a `TypeError` naming what is wrong — a wiring mistake
52
+ * the app makes once, so it fails at construction, never mid-run.
53
+ */
54
+ function resolveRecordSink(option) {
55
+ if (option === undefined)
56
+ return undefined;
57
+ if (isAdapter(option))
58
+ return { adapter: option, onFailure: 'report', flush: 'auto' };
59
+ if (option !== null && typeof option === 'object' && Object.hasOwn(option, 'adapter')) {
60
+ const { adapter, onFailure = 'report', flush = 'auto' } = option;
61
+ if (!isAdapter(adapter)) {
62
+ throw new TypeError('FlowChartExecutor: sink.adapter must be a RecordSink (opened, commit, note, closed)');
63
+ }
64
+ if (onFailure !== 'report' && onFailure !== 'fail') {
65
+ throw new TypeError("FlowChartExecutor: sink.onFailure must be 'report' or 'fail'");
66
+ }
67
+ if (flush !== 'auto' && flush !== 'manual') {
68
+ throw new TypeError("FlowChartExecutor: sink.flush must be 'auto' or 'manual'");
69
+ }
70
+ return { adapter, onFailure, flush };
71
+ }
72
+ throw new TypeError('FlowChartExecutor: sink must be a RecordSink (opened, commit, note, closed) or { adapter, onFailure?, flush? }');
73
+ }
74
+ exports.resolveRecordSink = resolveRecordSink;
75
+ /**
76
+ * One run's record sink: the sink every log of the run writes to (root and mounts), its accounting and its
77
+ * failure mode. A same-executor resume keeps it (the root log goes on); a fresh run makes a new one.
78
+ */
79
+ class RunRecord {
80
+ resolved;
81
+ /** Hand this to every `EventLog` of the run. */
82
+ sink;
83
+ entries = 0;
84
+ failed = 0;
85
+ lastError;
86
+ warned = false;
87
+ rule;
88
+ /** Aborted at the first loss under `'fail'` — composed into the leg's signal; fresh per leg ({@link beginLeg}). */
89
+ stopper;
90
+ failure;
91
+ /** Opaque error identities only: no raw entry or adapter error is enumerable on the transport error. */
92
+ invocationFailures = new WeakMap();
93
+ constructor(resolved) {
94
+ this.resolved = resolved;
95
+ if (resolved.onFailure === 'fail')
96
+ this.stopper = new AbortController();
97
+ const adapter = resolved.adapter;
98
+ const handed = () => {
99
+ this.entries += 1;
100
+ };
101
+ this.sink = {
102
+ opened: (entry) => {
103
+ handed();
104
+ const rule = this.rule;
105
+ const served = {
106
+ ...entry,
107
+ initialState: rule ? rule.retainState(entry.initialState, write_1.LOG_PLACEHOLDER) : entry.initialState,
108
+ ...(entry.meta === undefined ? {} : { meta: this.serve(entry.meta) }),
109
+ };
110
+ return this.invoke({ ...served, kind: 'opened' }, () => adapter.opened(served), rule);
111
+ },
112
+ commit: (entry) => {
113
+ handed();
114
+ return this.invoke({ ...entry, kind: 'commit' }, () => adapter.commit(entry), this.rule);
115
+ },
116
+ note: (entry) => {
117
+ handed();
118
+ return this.invoke({ address: entry.address, at: entry.at, kind: 'note', note: entry.kind, data: entry.data }, () => adapter.note(entry), this.rule);
119
+ },
120
+ closed: (entry) => {
121
+ handed();
122
+ const served = { ...entry, ...(entry.meta === undefined ? {} : { meta: this.serve(entry.meta) }) };
123
+ return this.invoke({ ...served, kind: 'closed' }, () => adapter.closed(served), this.rule);
124
+ },
125
+ onFailure: (failure) => {
126
+ const invocation = failure.error !== null && (typeof failure.error === 'object' || typeof failure.error === 'function')
127
+ ? this.invocationFailures.get(failure.error)
128
+ : undefined;
129
+ // Before admission (e.g. a meta-copy refusal), no dispatched served entry exists. Count the loss and
130
+ // apply the failure mode, but never hand the adapter Foottrace's original, unserved entry.
131
+ if (invocation === undefined)
132
+ this.lost(failure.error, undefined, this.errorView(failure.error, this.rule));
133
+ else
134
+ this.lost(invocation.cause, invocation.entry, invocation.view);
135
+ },
136
+ };
137
+ }
138
+ /** Capture the served entry now; an asynchronous failure keeps this leg's rule, not a later resume's rule. */
139
+ invoke(entry, call, rule) {
140
+ const failed = (cause) => {
141
+ const envelope = new Error('record sink: adapter invocation failed');
142
+ this.invocationFailures.set(envelope, { entry, cause, view: this.errorView(cause, rule) });
143
+ throw envelope;
144
+ };
145
+ try {
146
+ const returned = call();
147
+ // Void adapters keep their synchronous path; only an object/function can be a thenable. settleOnce
148
+ // observes native promises through Promise.prototype.then and guards hostile thenables too.
149
+ if (returned === null || (typeof returned !== 'object' && typeof returned !== 'function'))
150
+ return returned;
151
+ return settleOnce(returned, () => undefined, failed);
152
+ }
153
+ catch (cause) {
154
+ return failed(cause);
155
+ }
156
+ }
157
+ /** A sink error is the diagnostic errors.recordSinkError; raw causes belong only to the caller's exception. */
158
+ errorView(error, rule) {
159
+ const text = (0, errorInfo_js_1.thrownText)(error);
160
+ const retained = rule
161
+ ? rule.retainStageError(error, text, rule.retainDiagnostic(['errors', 'recordSinkError'], text))
162
+ : { message: text, structuredError: (0, errorInfo_js_1.extractErrorInfo)(error) };
163
+ const served = { ...retained.structuredError };
164
+ Reflect.deleteProperty(served, 'raw');
165
+ return {
166
+ text: retained.message,
167
+ error: served,
168
+ masked: retained.message !== text || retained.structuredError.raw !== error,
169
+ rule,
170
+ };
171
+ }
172
+ /**
173
+ * A same-executor resume starts a new leg on the same record: the counts go on (one log, one record), but the
174
+ * failure mode is the LEG's — a loss in an earlier leg (which already failed that leg) does not stop this one —
175
+ * and the dev-mode warning may fire again.
176
+ */
177
+ beginLeg() {
178
+ if (this.resolved.onFailure === 'fail')
179
+ this.stopper = new AbortController();
180
+ this.failure = undefined;
181
+ this.warned = false;
182
+ }
183
+ /** The leg's redaction rule — a resume builds a new one; the next `opened` / `closed` is served under it. */
184
+ useRule(rule) {
185
+ this.rule = rule;
186
+ }
187
+ /** Aborts at the first loss under `onFailure: 'fail'`; absent otherwise. */
188
+ get stopSignal() {
189
+ return this.stopper?.signal;
190
+ }
191
+ get flushMode() {
192
+ return this.resolved.flush;
193
+ }
194
+ /** The loss that fails the run under `'fail'`; absent while nothing was lost (and always under `'report'`). */
195
+ get fatal() {
196
+ return this.failure;
197
+ }
198
+ stats() {
199
+ return {
200
+ entries: this.entries,
201
+ failed: this.failed,
202
+ ...(this.lastError === undefined ? {} : { lastError: this.lastError }),
203
+ };
204
+ }
205
+ /**
206
+ * Await the adapter's `flush()`, at most `timeoutMs` when given. A flush that throws or rejects is a loss
207
+ * (counted, and fatal under `'fail'`); one still running at the deadline is `pending` and keeps running — and,
208
+ * with `pendingIsLoss` (the run's own flush), counted as a loss too, so a flush that never settles cannot hold a
209
+ * run open, and cannot pass for one that landed. Nothing here throws: a hostile adapter (a throwing `flush`
210
+ * getter, a promise with its own `then`) is a loss, never the run's error.
211
+ */
212
+ async flush(timeoutMs, pendingIsLoss = false) {
213
+ const adapter = this.resolved.adapter;
214
+ const rule = this.rule;
215
+ let settled;
216
+ let givenUp = false; // a flush already counted as a loss at the deadline is not counted again when it rejects
217
+ try {
218
+ const flush = adapter.flush; // read once: a getter runs once, inside the guard
219
+ if (typeof flush !== 'function')
220
+ return { done: true, failed: false, pending: false };
221
+ settled = settleOnce(flush.call(adapter), () => ({ done: true, failed: false, pending: false }), (error) => {
222
+ if (!givenUp)
223
+ this.lost(error, undefined, this.errorView(error, rule));
224
+ return { done: false, failed: true, pending: false };
225
+ });
226
+ }
227
+ catch (error) {
228
+ this.lost(error, undefined, this.errorView(error, rule));
229
+ return { done: false, failed: true, pending: false };
230
+ }
231
+ if (timeoutMs === undefined || !Number.isFinite(timeoutMs))
232
+ return settled;
233
+ let timer;
234
+ const pending = new Promise((resolve) => {
235
+ timer = setTimeout(() => resolve({ done: false, failed: false, pending: true }), Math.max(0, timeoutMs));
236
+ });
237
+ try {
238
+ const result = await Promise.race([settled, pending]);
239
+ if (result.pending && pendingIsLoss) {
240
+ givenUp = true;
241
+ const error = new Error(`record sink: flush() did not settle within ${Math.max(0, timeoutMs)}ms`);
242
+ this.lost(error, undefined, this.errorView(error, rule));
243
+ }
244
+ return result;
245
+ }
246
+ finally {
247
+ clearTimeout(timer);
248
+ }
249
+ }
250
+ /** The meta as served: a boundary record, scrubbed by key name at every depth (an inert rule copies nothing). */
251
+ serve(meta) {
252
+ return this.rule ? this.rule.retainBoundary(meta, write_1.LOG_PLACEHOLDER) : meta;
253
+ }
254
+ /** One loss: counted, warned once per run, told with a safe dispatched entry when available, fatal under 'fail'. */
255
+ lost(error, entry, view) {
256
+ this.failed += 1;
257
+ const text = view.text;
258
+ this.lastError = text;
259
+ if ((0, devMode_js_1.isDevMode)() && !this.warned) {
260
+ this.warned = true;
261
+ // eslint-disable-next-line no-console
262
+ console.warn(`[footprint] record sink: an entry was not stored (${text}). The run goes on; ` +
263
+ 'getSnapshot().sink counts every loss.');
264
+ }
265
+ // The failure mode first: nothing the adapter's own listener does can skip it.
266
+ if (this.stopper !== undefined && this.failure === undefined) {
267
+ this.failure = new RecordSinkError(`record sink: an entry was not stored — ${text}`, error);
268
+ if (view.masked) {
269
+ // The caller keeps the real cause, but observers of this new wrapper must inherit its remembered mask.
270
+ view.rule?.retainStageError(this.failure, this.failure.message, redaction_js_1.SCOPE_PLACEHOLDER);
271
+ if (this.rule !== view.rule)
272
+ this.rule?.retainStageError(this.failure, this.failure.message, redaction_js_1.SCOPE_PLACEHOLDER);
273
+ }
274
+ this.stopper.abort(this.failure);
275
+ }
276
+ if (entry !== undefined)
277
+ tellAdapter(this.resolved.adapter, { entry, error: view.error });
278
+ }
279
+ }
280
+ exports.RunRecord = RunRecord;
281
+ /** The adapter's own `onFailure`, isolated: a throwing getter, a throw or a rejection there changes nothing. */
282
+ function tellAdapter(adapter, failure) {
283
+ try {
284
+ const listener = adapter.onFailure;
285
+ if (typeof listener !== 'function')
286
+ return;
287
+ settleOnce(listener.call(adapter, failure), () => undefined, () => undefined);
288
+ }
289
+ catch {
290
+ // A listener that fails is the adapter's own business: the loss is already counted.
291
+ }
292
+ }
293
+ /**
294
+ * `value`, settled ONCE into `onValue` / `onError` — never through the value's own `then`: a native promise is
295
+ * watched through the real `Promise.prototype.then` (an own `then` on it is not trusted, so its rejection is always
296
+ * handled), any other thenable adopted into a fresh promise. A plain value is a fulfilment.
297
+ */
298
+ function settleOnce(value, onValue, onError) {
299
+ const adopted = value instanceof Promise ? value : new Promise((resolve) => resolve(value));
300
+ return Promise.prototype.then.call(adopted, onValue, onError);
301
+ }
302
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkU2luay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcnVubmVyL3JlY29yZFNpbmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHOzs7QUFJSCwyQ0FBa0Q7QUFFbEQsOENBQTBDO0FBQzFDLHlEQUFzRTtBQUV0RSx5REFBMkQ7QUF1QzNEOzs7R0FHRztBQUNILE1BQWEsZUFBZ0IsU0FBUSxLQUFLO0lBRUY7SUFEcEIsSUFBSSxHQUFHLGlCQUFpQixDQUFDO0lBQzNDLFlBQVksT0FBZSxFQUFXLEtBQWM7UUFDbEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRHFCLFVBQUssR0FBTCxLQUFLLENBQVM7SUFFcEQsQ0FBQztDQUNGO0FBTEQsMENBS0M7QUFTRCxNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBVSxDQUFDO0FBZWhFLFNBQVMsU0FBUyxDQUFDLEtBQWM7SUFDL0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQVEsS0FBaUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUMsQ0FBQztBQUMzRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsTUFBZTtJQUMvQyxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0MsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUM7SUFDdEYsSUFBSSxNQUFNLEtBQUssSUFBSSxJ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QUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDNUYsQ0FBQztDQUNGO0FBaE5ELDhCQWdOQztBQUVELGdIQUFnSDtBQUNoSCxTQUFTLFdBQVcsQ0FBQyxPQUFtQixFQUFFLE9BQWlFO0lBQ3pHLElBQUksQ0FBQztRQUNILE1BQU0sUUFBUSxHQUFZLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDNUMsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVO1lBQUUsT0FBTztRQUMzQyxVQUFVLENBQ1IsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEVBQy9CLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFDZixHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQ2hCLENBQUM7SUFDSixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1Asb0ZBQW9GO0lBQ3RGLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsVUFBVSxDQUFJLEtBQWMsRUFBRSxPQUFnQixFQUFFLE9BQThCO0lBQ3JGLE1BQU0sT0FBTyxHQUFxQixLQUFLLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5RyxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBZSxDQUFDO0FBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJ1bm5lci9yZWNvcmRTaW5rLnRzIOKAlCB0aGUgcnVuJ3Mgc2lkZSBvZiB0aGUgY3Jhc2gtc2FmZSByZWNvcmQgKGRlc2lnbiDCpzMuNSwgcGFja2V0IFA2KS5cbiAqXG4gKiBmb290dHJhY2Ugb3ducyB0aGUgcG9ydCAoYFJlY29yZFNpbmtgLCBgZm9vdHRyYWNlL3dyaXRlYCk6IGEgbG9nIGJ1aWx0IHdpdGggYSBzaW5rIGhhbmRzIGl0IGV2ZXJ5IGVudHJ5IEFTIElUXG4gKiBMQU5EUyDigJQgYG9wZW5lZGAsIGBjb21taXRgLCBgbm90ZWAsIGBjbG9zZWRgIOKAlCBhbmQgY291bnRzIHdoYXQgdGhlIHNpbmsgZGlkIG5vdCB0YWtlLiBUaGlzIGZpbGUgaXMgd2hhdCB0aGVcbiAqIEVYRUNVVE9SIGFkZHMgYXJvdW5kIGFuIGFwcCdzIGFkYXB0ZXIsIG9uZSB7QGxpbmsgUnVuUmVjb3JkfSBwZXIgcnVuOlxuICpcbiAqICAgLSBUSEUgT05FIExBVywgYmVmb3JlIGFueSBieXRlIGxlYXZlczogdGhlIGBvcGVuZWRgIGJhc2UgaXMgdGhlIHJ1bidzIHNlcnZlZCBmb3JtIG9mIGl0ICh0aGUgcmVkYWN0aW9uIHJ1bGUnc1xuICogICAgIGByZXRhaW5TdGF0ZWAsIHRoZSBtaXJyb3IncyBzZWVkIOKAlCBzbyBhIHBvbGljeSBrZXkgc2VlZGVkIGJ5IGBpbml0aWFsQ29udGV4dGAgb3IgYSBjaGVja3BvaW50IG5ldmVyIHJlYWNoZXNcbiAqICAgICB0aGUgc2luayksIGFuZCB0aGUgYG9wZW5lZGAgLyBgY2xvc2VkYCBtZXRhIGFyZSBib3VuZGFyeSByZWNvcmRzIChgcmV0YWluQm91bmRhcnlgKS4gQSBjb21taXQgaXMgdGhlIGxvZydzIG93blxuICogICAgIGJ1bmRsZSwgYWxyZWFkeSBzY3J1YmJlZCBhdCBjb21taXQ7IGFuIGF0dGVtcHQgbm90ZSBjYXJyaWVzIHRoZSBzZXJ2ZWQgYEF0dGVtcHRSZWNvcmRgIChubyBgcmF3YCkuXG4gKiAgIC0gQUNDT1VOVElORzogZXZlcnkgZW50cnkgaGFuZGVkIHRvIHRoZSBhZGFwdGVyIGlzIGNvdW50ZWQsIGV2ZXJ5IGxvc3MgdG9vIChgZ2V0U25hcHNob3QoKS5zaW5rYCksIHdpdGggYVxuICogICAgIGRldi1tb2RlIHdhcm5pbmcgb24gdGhlIGZpcnN0IGxvc3Mgb2YgYSBydW4uIFRoZSBhZGFwdGVyJ3Mgb3duIGBvbkZhaWx1cmVgIGhlYXJzIGEgZGlzcGF0Y2hlZCBlbnRyeSdzIGxvc3NcbiAqICAgICB3aXRoIHRoYXQgc2FtZSBzZXJ2ZWQgZW50cnkgYW5kIGEgc2VydmVkIGVycm9yLCBpc29sYXRlZC4gQSByZWZ1c2FsIGJlZm9yZSBkaXNwYXRjaCBpcyBjb3VudGVkIHdpdGhvdXRcbiAqICAgICBmb3J3YXJkaW5nIEZvb3R0cmFjZSdzIHVuc2VydmVkIGVudHJ5LlxuICogICAtIFRIRSBGQUlMVVJFIE1PREUgKG93bmVyIHJ1bGluZyBRMyk6IGAncmVwb3J0J2AgKGRlZmF1bHQpIOKAlCB0aGUgcnVuIGdvZXMgb247IGAnZmFpbCdgIOKAlCB0aGUgZmlyc3QgbG9zdCBlbnRyeVxuICogICAgIGFib3J0cyB0aGUgcnVuJ3Mgc2lnbmFsIHdpdGggYSB7QGxpbmsgUmVjb3JkU2lua0Vycm9yfSwgYW5kIGEgcnVuIHRoYXQgZmluaXNoZWQgd2l0aCBhIGxvc3MgcmVqZWN0cyB3aXRoIGl0LlxuICogICAtIEZMVVNIOiBgJ2F1dG8nYCAoZGVmYXVsdCkg4oCUIGBydW4oKWAgLyBgcmVzdW1lKClgIGF3YWl0IHRoZSBhZGFwdGVyJ3MgYGZsdXNoKClgIGFmdGVyIHRoZSBjbG9zaW5nIGVudHJ5O1xuICogICAgIGAnbWFudWFsJ2Ag4oCUIHRoZSBhcHAgY2FsbHMgYGV4ZWN1dG9yLmZsdXNoUmVjb3JkKClgLlxuICpcbiAqIEV2ZXJ5IGFkYXB0ZXIgbWV0aG9kIGlzIGNhbGxlZCBzeW5jaHJvbm91c2x5IGZyb20gdGhlIGxvZzsgd2hhdGV2ZXIgdGhlIGFkYXB0ZXIgdGhyb3dzIG9yIHJlamVjdHMgd2l0aCBpcyB0aGVcbiAqIGxvZydzIHRvIGNvdW50IChgRXZlbnRMb2cgwrcgc2lua0ZhaWx1cmVzYCksIG5ldmVyIHRoZSBydW4ncyDigJQgc28gbm90aGluZyBoZXJlIHRocm93cyB0byB0aGUgZW5naW5lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgTWV0YSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5pbXBvcnQgdHlwZSB7IFJlY29yZEVudHJ5LCBSZWNvcmRTaW5rIH0gZnJvbSAnZm9vdHRyYWNlL3dyaXRlJztcbmltcG9ydCB7IExPR19QTEFDRUhPTERFUiB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgdGhyb3duVGV4dCB9IGZyb20gJy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25SdWxlIH0gZnJvbSAnLi4vbWVtb3J5L3JlZGFjdGlvbi5qcyc7XG5pbXBvcnQgeyBTQ09QRV9QTEFDRUhPTERFUiB9IGZyb20gJy4uL21lbW9yeS9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBSZWNvcmRTaW5rU3RhdHMgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUuanMnO1xuXG4vKiogV2hhdCBhIGxvc3QgZW50cnkgZG9lcyB0byB0aGUgcnVuOiBgJ3JlcG9ydCdgIGNvdW50cyBpdCBhbmQgZ29lcyBvbjsgYCdmYWlsJ2AgZmFpbHMgdGhlIHJ1bi4gKi9cbmV4cG9ydCB0eXBlIFJlY29yZFNpbmtGYWlsdXJlTW9kZSA9ICdyZXBvcnQnIHwgJ2ZhaWwnO1xuXG4vKiogV2hlbiB0aGUgYWRhcHRlcidzIGBmbHVzaCgpYCBydW5zOiBhZnRlciBlYWNoIHJ1bidzIGNsb3NpbmcgZW50cnkgKGAnYXV0bydgKSwgb3Igd2hlbiB0aGUgYXBwIGFza3MuICovXG5leHBvcnQgdHlwZSBSZWNvcmRTaW5rRmx1c2hNb2RlID0gJ2F1dG8nIHwgJ21hbnVhbCc7XG5cbi8qKlxuICogVGhlIGV4ZWN1dG9yJ3MgYHNpbmtgIG9wdGlvbiBpbiBpdHMgbG9uZyBmb3JtLiBUaGUgc2hvcnQgZm9ybSBpcyB0aGUgYWRhcHRlciBpdHNlbGYuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzaW5rOiB7IGFkYXB0ZXI6IGZpbGVTaW5rKCcvdmFyL2Zvb3RwcmludC9ydW4uanNvbmwnKSwgb25GYWlsdXJlOiAnZmFpbCcgfSB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZFNpbmtPcHRpb25zIHtcbiAgLyoqIFdoZXJlIHRoZSBlbnRyaWVzIGdvIOKAlCBgZmlsZVNpbmsocGF0aClgIChgZm9vdHByaW50anMvc2lua3NgKSwgYG1lbW9yeVNpbmsoKWAgKGBmb290dHJhY2Uvd3JpdGVgKSwgb3IgeW91cnMuICovXG4gIHJlYWRvbmx5IGFkYXB0ZXI6IFJlY29yZFNpbms7XG4gIC8qKiBgJ3JlcG9ydCdgIChkZWZhdWx0KTogYSBsb3N0IGVudHJ5IGlzIGNvdW50ZWQgYW5kIHRoZSBydW4gZ29lcyBvbi4gYCdmYWlsJ2A6IHRoZSBmaXJzdCBvbmUgZmFpbHMgdGhlIHJ1bi4gKi9cbiAgcmVhZG9ubHkgb25GYWlsdXJlPzogUmVjb3JkU2lua0ZhaWx1cmVNb2RlO1xuICAvKiogYCdhdXRvJ2AgKGRlZmF1bHQpOiBgcnVuKClgIGF3YWl0cyB0aGUgYWRhcHRlcidzIGBmbHVzaCgpYCBhZnRlciB0aGUgY2xvc2luZyBlbnRyeS4gYCdtYW51YWwnYDogYGZsdXNoUmVjb3JkKClgLiAqL1xuICByZWFkb25seSBmbHVzaD86IFJlY29yZFNpbmtGbHVzaE1vZGU7XG59XG5cbi8qKiBUaGUgZXhlY3V0b3IncyBgc2lua2Agb3B0aW9uOiBhbiBhZGFwdGVyLCBvciB7QGxpbmsgUmVjb3JkU2lua09wdGlvbnN9LiAqL1xuZXhwb3J0IHR5cGUgUmVjb3JkU2lua09wdGlvbiA9IFJlY29yZFNpbmsgfCBSZWNvcmRTaW5rT3B0aW9ucztcblxuLyoqIFdoYXQgYGV4ZWN1dG9yLmZsdXNoUmVjb3JkKClgIHJlc29sdmVzIHdpdGgg4oCUIHRoZSBgZHJhaW5PYnNlcnZlcnNgIHNoYXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRGbHVzaFJlc3VsdCB7XG4gIC8qKiBUaGUgYWRhcHRlcidzIGZsdXNoIGZpbmlzaGVkIChvciB0aGVyZSB3YXMgbm90aGluZyB0byBmbHVzaCkuICovXG4gIHJlYWRvbmx5IGRvbmU6IGJvb2xlYW47XG4gIC8qKiBUaGUgYWRhcHRlcidzIGZsdXNoIHRocmV3IG9yIHJlamVjdGVkIOKAlCBjb3VudGVkIG9uIGBnZXRTbmFwc2hvdCgpLnNpbmtgLiAqL1xuICByZWFkb25seSBmYWlsZWQ6IGJvb2xlYW47XG4gIC8qKiBUaGUgZmx1c2ggaGFkIG5vdCBzZXR0bGVkIHdoZW4gYHRpbWVvdXRNc2AgcmFuIG91dC4gKi9cbiAgcmVhZG9ubHkgcGVuZGluZzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIHJ1biB3aXRoIGBzaW5rOiB7IG9uRmFpbHVyZTogJ2ZhaWwnIH1gIGxvc3QgYW4gZW50cnk6IHRoZSByZWNvcmQgdGhlIGFwcCBhc2tlZCB0byBiZSBrZXB0IGlzIG5vdCB3aG9sZS5cbiAqIGBjYXVzZWAgaXMgdGhlIGFkYXB0ZXIncyBvd24gZXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWNvcmRTaW5rRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IG5hbWUgPSAnUmVjb3JkU2lua0Vycm9yJztcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCByZWFkb25seSBjYXVzZTogdW5rbm93bikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKiBUaGUgb3B0aW9uIHJlc29sdmVkIG9uY2UsIGF0IGNvbnN0cnVjdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRSZWNvcmRTaW5rIHtcbiAgcmVhZG9ubHkgYWRhcHRlcjogUmVjb3JkU2luaztcbiAgcmVhZG9ubHkgb25GYWlsdXJlOiBSZWNvcmRTaW5rRmFpbHVyZU1vZGU7XG4gIHJlYWRvbmx5IGZsdXNoOiBSZWNvcmRTaW5rRmx1c2hNb2RlO1xufVxuXG5jb25zdCBNRVRIT0RTID0gWydvcGVuZWQnLCAnY29tbWl0JywgJ25vdGUnLCAnY2xvc2VkJ10gYXMgY29uc3Q7XG5cbmludGVyZmFjZSBTaW5rRXJyb3JWaWV3IHtcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xuICByZWFkb25seSBlcnJvcjogdW5rbm93bjtcbiAgcmVhZG9ubHkgbWFza2VkOiBib29sZWFuO1xuICByZWFkb25seSBydWxlPzogUmVkYWN0aW9uUnVsZTtcbn1cblxuaW50ZXJmYWNlIEludm9jYXRpb25GYWlsdXJlIHtcbiAgcmVhZG9ubHkgZW50cnk6IFJlY29yZEVudHJ5O1xuICByZWFkb25seSBjYXVzZTogdW5rbm93bjtcbiAgcmVhZG9ubHkgdmlldzogU2lua0Vycm9yVmlldztcbn1cblxuZnVuY3Rpb24gaXNBZGFwdGVyKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkU2luayB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBNRVRIT0RTLmV2ZXJ5KChtKSA9PiB0eXBlb2YgKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVttXSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgZXhlY3V0b3IncyBgc2lua2Agb3B0aW9uLCBvciByZWZ1c2UgaXQgd2l0aCBhIGBUeXBlRXJyb3JgIG5hbWluZyB3aGF0IGlzIHdyb25nIOKAlCBhIHdpcmluZyBtaXN0YWtlXG4gKiB0aGUgYXBwIG1ha2VzIG9uY2UsIHNvIGl0IGZhaWxzIGF0IGNvbnN0cnVjdGlvbiwgbmV2ZXIgbWlkLXJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWNvcmRTaW5rKG9wdGlvbjogdW5rbm93bik6IFJlc29sdmVkUmVjb3JkU2luayB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGlzQWRhcHRlcihvcHRpb24pKSByZXR1cm4geyBhZGFwdGVyOiBvcHRpb24sIG9uRmFpbHVyZTogJ3JlcG9ydCcsIGZsdXNoOiAnYXV0bycgfTtcbiAgaWYgKG9wdGlvbiAhPT0gbnVsbCAmJiB0eXBlb2Ygb3B0aW9uID09PSAnb2JqZWN0JyAmJiBPYmplY3QuaGFzT3duKG9wdGlvbiwgJ2FkYXB0ZXInKSkge1xuICAgIGNvbnN0IHsgYWRhcHRlciwgb25GYWlsdXJlID0gJ3JlcG9ydCcsIGZsdXNoID0gJ2F1dG8nIH0gPSBvcHRpb24gYXMgUGFydGlhbDxSZWNvcmRTaW5rT3B0aW9ucz47XG4gICAgaWYgKCFpc0FkYXB0ZXIoYWRhcHRlcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Zsb3dDaGFydEV4ZWN1dG9yOiBzaW5rLmFkYXB0ZXIgbXVzdCBiZSBhIFJlY29yZFNpbmsgKG9wZW5lZCwgY29tbWl0LCBub3RlLCBjbG9zZWQpJyk7XG4gICAgfVxuICAgIGlmIChvbkZhaWx1cmUgIT09ICdyZXBvcnQnICYmIG9uRmFpbHVyZSAhPT0gJ2ZhaWwnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmxvd0NoYXJ0RXhlY3V0b3I6IHNpbmsub25GYWlsdXJlIG11c3QgYmUgJ3JlcG9ydCcgb3IgJ2ZhaWwnXCIpO1xuICAgIH1cbiAgICBpZiAoZmx1c2ggIT09ICdhdXRvJyAmJiBmbHVzaCAhPT0gJ21hbnVhbCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGbG93Q2hhcnRFeGVjdXRvcjogc2luay5mbHVzaCBtdXN0IGJlICdhdXRvJyBvciAnbWFudWFsJ1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYWRhcHRlciwgb25GYWlsdXJlLCBmbHVzaCB9O1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgJ0Zsb3dDaGFydEV4ZWN1dG9yOiBzaW5rIG11c3QgYmUgYSBSZWNvcmRTaW5rIChvcGVuZWQsIGNvbW1pdCwgbm90ZSwgY2xvc2VkKSBvciB7IGFkYXB0ZXIsIG9uRmFpbHVyZT8sIGZsdXNoPyB9JyxcbiAgKTtcbn1cblxuLyoqXG4gKiBPbmUgcnVuJ3MgcmVjb3JkIHNpbms6IHRoZSBzaW5rIGV2ZXJ5IGxvZyBvZiB0aGUgcnVuIHdyaXRlcyB0byAocm9vdCBhbmQgbW91bnRzKSwgaXRzIGFjY291bnRpbmcgYW5kIGl0c1xuICogZmFpbHVyZSBtb2RlLiBBIHNhbWUtZXhlY3V0b3IgcmVzdW1lIGtlZXBzIGl0ICh0aGUgcm9vdCBsb2cgZ29lcyBvbik7IGEgZnJlc2ggcnVuIG1ha2VzIGEgbmV3IG9uZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1blJlY29yZCB7XG4gIC8qKiBIYW5kIHRoaXMgdG8gZXZlcnkgYEV2ZW50TG9nYCBvZiB0aGUgcnVuLiAqL1xuICByZWFkb25seSBzaW5rOiBSZWNvcmRTaW5rO1xuICBwcml2YXRlIGVudHJpZXMgPSAwO1xuICBwcml2YXRlIGZhaWxlZCA9IDA7XG4gIHByaXZhdGUgbGFzdEVycm9yPzogc3RyaW5nO1xuICBwcml2YXRlIHdhcm5lZCA9IGZhbHNlO1xuICBwcml2YXRlIHJ1bGU/OiBSZWRhY3Rpb25SdWxlO1xuICAvKiogQWJvcnRlZCBhdCB0aGUgZmlyc3QgbG9zcyB1bmRlciBgJ2ZhaWwnYCDigJQgY29tcG9zZWQgaW50byB0aGUgbGVnJ3Mgc2lnbmFsOyBmcmVzaCBwZXIgbGVnICh7QGxpbmsgYmVnaW5MZWd9KS4gKi9cbiAgcHJpdmF0ZSBzdG9wcGVyPzogQWJvcnRDb250cm9sbGVyO1xuICBwcml2YXRlIGZhaWx1cmU/OiBSZWNvcmRTaW5rRXJyb3I7XG4gIC8qKiBPcGFxdWUgZXJyb3IgaWRlbnRpdGllcyBvbmx5OiBubyByYXcgZW50cnkgb3IgYWRhcHRlciBlcnJvciBpcyBlbnVtZXJhYmxlIG9uIHRoZSB0cmFuc3BvcnQgZXJyb3IuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW52b2NhdGlvbkZhaWx1cmVzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBJbnZvY2F0aW9uRmFpbHVyZT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJlc29sdmVkOiBSZXNvbHZlZFJlY29yZFNpbmspIHtcbiAgICBpZiAocmVzb2x2ZWQub25GYWlsdXJlID09PSAnZmFpbCcpIHRoaXMuc3RvcHBlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBhZGFwdGVyID0gcmVzb2x2ZWQuYWRhcHRlcjtcbiAgICBjb25zdCBoYW5kZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLmVudHJpZXMgKz0gMTtcbiAgICB9O1xuICAgIHRoaXMuc2luayA9IHtcbiAgICAgIG9wZW5lZDogKGVudHJ5KSA9PiB7XG4gICAgICAgIGhhbmRlZCgpO1xuICAgICAgICBjb25zdCBydWxlID0gdGhpcy5ydWxlO1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPSB7XG4gICAgICAgICAgLi4uZW50cnksXG4gICAgICAgICAgaW5pdGlhbFN0YXRlOiBydWxlID8gcnVsZS5yZXRhaW5TdGF0ZShlbnRyeS5pbml0aWFsU3RhdGUsIExPR19QTEFDRUhPTERFUikgOiBlbnRyeS5pbml0aWFsU3RhdGUsXG4gICAgICAgICAgLi4uKGVudHJ5Lm1ldGEgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBtZXRhOiB0aGlzLnNlcnZlKGVudHJ5Lm1ldGEpIH0pLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2UoeyAuLi5zZXJ2ZWQsIGtpbmQ6ICdvcGVuZWQnIH0sICgpID0+IGFkYXB0ZXIub3BlbmVkKHNlcnZlZCksIHJ1bGUpO1xuICAgICAgfSxcbiAgICAgIGNvbW1pdDogKGVudHJ5KSA9PiB7XG4gICAgICAgIGhhbmRlZCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2UoeyAuLi5lbnRyeSwga2luZDogJ2NvbW1pdCcgfSwgKCkgPT4gYWRhcHRlci5jb21taXQoZW50cnkpLCB0aGlzLnJ1bGUpO1xuICAgICAgfSxcbiAgICAgIG5vdGU6IChlbnRyeSkgPT4ge1xuICAgICAgICBoYW5kZWQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW52b2tlKFxuICAgICAgICAgIHsgYWRkcmVzczogZW50cnkuYWRkcmVzcywgYXQ6IGVudHJ5LmF0LCBraW5kOiAnbm90ZScsIG5vdGU6IGVudHJ5LmtpbmQsIGRhdGE6IGVudHJ5LmRhdGEgfSxcbiAgICAgICAgICAoKSA9PiBhZGFwdGVyLm5vdGUoZW50cnkpLFxuICAgICAgICAgIHRoaXMucnVsZSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBjbG9zZWQ6IChlbnRyeSkgPT4ge1xuICAgICAgICBoYW5kZWQoKTtcbiAgICAgICAgY29uc3Qgc2VydmVkID0geyAuLi5lbnRyeSwgLi4uKGVudHJ5Lm1ldGEgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBtZXRhOiB0aGlzLnNlcnZlKGVudHJ5Lm1ldGEpIH0pIH07XG4gICAgICAgIHJldHVybiB0aGlzLmludm9rZSh7IC4uLnNlcnZlZCwga2luZDogJ2Nsb3NlZCcgfSwgKCkgPT4gYWRhcHRlci5jbG9zZWQoc2VydmVkKSwgdGhpcy5ydWxlKTtcbiAgICAgIH0sXG4gICAgICBvbkZhaWx1cmU6IChmYWlsdXJlKSA9PiB7XG4gICAgICAgIGNvbnN0IGludm9jYXRpb24gPVxuICAgICAgICAgIGZhaWx1cmUuZXJyb3IgIT09IG51bGwgJiYgKHR5cGVvZiBmYWlsdXJlLmVycm9yID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgZmFpbHVyZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgID8gdGhpcy5pbnZvY2F0aW9uRmFpbHVyZXMuZ2V0KGZhaWx1cmUuZXJyb3IpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gQmVmb3JlIGFkbWlzc2lvbiAoZS5nLiBhIG1ldGEtY29weSByZWZ1c2FsKSwgbm8gZGlzcGF0Y2hlZCBzZXJ2ZWQgZW50cnkgZXhpc3RzLiBDb3VudCB0aGUgbG9zcyBhbmRcbiAgICAgICAgLy8gYXBwbHkgdGhlIGZhaWx1cmUgbW9kZSwgYnV0IG5ldmVyIGhhbmQgdGhlIGFkYXB0ZXIgRm9vdHRyYWNlJ3Mgb3JpZ2luYWwsIHVuc2VydmVkIGVudHJ5LlxuICAgICAgICBpZiAoaW52b2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLmxvc3QoZmFpbHVyZS5lcnJvciwgdW5kZWZpbmVkLCB0aGlzLmVycm9yVmlldyhmYWlsdXJlLmVycm9yLCB0aGlzLnJ1bGUpKTtcbiAgICAgICAgZWxzZSB0aGlzLmxvc3QoaW52b2NhdGlvbi5jYXVzZSwgaW52b2NhdGlvbi5lbnRyeSwgaW52b2NhdGlvbi52aWV3KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDYXB0dXJlIHRoZSBzZXJ2ZWQgZW50cnkgbm93OyBhbiBhc3luY2hyb25vdXMgZmFpbHVyZSBrZWVwcyB0aGlzIGxlZydzIHJ1bGUsIG5vdCBhIGxhdGVyIHJlc3VtZSdzIHJ1bGUuICovXG4gIHByaXZhdGUgaW52b2tlKGVudHJ5OiBSZWNvcmRFbnRyeSwgY2FsbDogKCkgPT4gdW5rbm93biwgcnVsZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCk6IHVua25vd24ge1xuICAgIGNvbnN0IGZhaWxlZCA9IChjYXVzZTogdW5rbm93bik6IG5ldmVyID0+IHtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gbmV3IEVycm9yKCdyZWNvcmQgc2luazogYWRhcHRlciBpbnZvY2F0aW9uIGZhaWxlZCcpO1xuICAgICAgdGhpcy5pbnZvY2F0aW9uRmFpbHVyZXMuc2V0KGVudmVsb3BlLCB7IGVudHJ5LCBjYXVzZSwgdmlldzogdGhpcy5lcnJvclZpZXcoY2F1c2UsIHJ1bGUpIH0pO1xuICAgICAgdGhyb3cgZW52ZWxvcGU7XG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmV0dXJuZWQgPSBjYWxsKCk7XG4gICAgICAvLyBWb2lkIGFkYXB0ZXJzIGtlZXAgdGhlaXIgc3luY2hyb25vdXMgcGF0aDsgb25seSBhbiBvYmplY3QvZnVuY3Rpb24gY2FuIGJlIGEgdGhlbmFibGUuIHNldHRsZU9uY2VcbiAgICAgIC8vIG9ic2VydmVzIG5hdGl2ZSBwcm9taXNlcyB0aHJvdWdoIFByb21pc2UucHJvdG90eXBlLnRoZW4gYW5kIGd1YXJkcyBob3N0aWxlIHRoZW5hYmxlcyB0b28uXG4gICAgICBpZiAocmV0dXJuZWQgPT09IG51bGwgfHwgKHR5cGVvZiByZXR1cm5lZCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHJldHVybmVkICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuIHJldHVybmVkO1xuICAgICAgcmV0dXJuIHNldHRsZU9uY2UocmV0dXJuZWQsICgpID0+IHVuZGVmaW5lZCwgZmFpbGVkKTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgcmV0dXJuIGZhaWxlZChjYXVzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEEgc2luayBlcnJvciBpcyB0aGUgZGlhZ25vc3RpYyBlcnJvcnMucmVjb3JkU2lua0Vycm9yOyByYXcgY2F1c2VzIGJlbG9uZyBvbmx5IHRvIHRoZSBjYWxsZXIncyBleGNlcHRpb24uICovXG4gIHByaXZhdGUgZXJyb3JWaWV3KGVycm9yOiB1bmtub3duLCBydWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkKTogU2lua0Vycm9yVmlldyB7XG4gICAgY29uc3QgdGV4dCA9IHRocm93blRleHQoZXJyb3IpO1xuICAgIGNvbnN0IHJldGFpbmVkID0gcnVsZVxuICAgICAgPyBydWxlLnJldGFpblN0YWdlRXJyb3IoZXJyb3IsIHRleHQsIHJ1bGUucmV0YWluRGlhZ25vc3RpYyhbJ2Vycm9ycycsICdyZWNvcmRTaW5rRXJyb3InXSwgdGV4dCkpXG4gICAgICA6IHsgbWVzc2FnZTogdGV4dCwgc3RydWN0dXJlZEVycm9yOiBleHRyYWN0RXJyb3JJbmZvKGVycm9yKSB9O1xuICAgIGNvbnN0IHNlcnZlZCA9IHsgLi4ucmV0YWluZWQuc3RydWN0dXJlZEVycm9yIH07XG4gICAgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShzZXJ2ZWQsICdyYXcnKTtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogcmV0YWluZWQubWVzc2FnZSxcbiAgICAgIGVycm9yOiBzZXJ2ZWQsXG4gICAgICBtYXNrZWQ6IHJldGFpbmVkLm1lc3NhZ2UgIT09IHRleHQgfHwgcmV0YWluZWQuc3RydWN0dXJlZEVycm9yLnJhdyAhPT0gZXJyb3IsXG4gICAgICBydWxlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQSBzYW1lLWV4ZWN1dG9yIHJlc3VtZSBzdGFydHMgYSBuZXcgbGVnIG9uIHRoZSBzYW1lIHJlY29yZDogdGhlIGNvdW50cyBnbyBvbiAob25lIGxvZywgb25lIHJlY29yZCksIGJ1dCB0aGVcbiAgICogZmFpbHVyZSBtb2RlIGlzIHRoZSBMRUcncyDigJQgYSBsb3NzIGluIGFuIGVhcmxpZXIgbGVnICh3aGljaCBhbHJlYWR5IGZhaWxlZCB0aGF0IGxlZykgZG9lcyBub3Qgc3RvcCB0aGlzIG9uZSDigJRcbiAgICogYW5kIHRoZSBkZXYtbW9kZSB3YXJuaW5nIG1heSBmaXJlIGFnYWluLlxuICAgKi9cbiAgYmVnaW5MZWcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzb2x2ZWQub25GYWlsdXJlID09PSAnZmFpbCcpIHRoaXMuc3RvcHBlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLmZhaWx1cmUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy53YXJuZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBUaGUgbGVnJ3MgcmVkYWN0aW9uIHJ1bGUg4oCUIGEgcmVzdW1lIGJ1aWxkcyBhIG5ldyBvbmU7IHRoZSBuZXh0IGBvcGVuZWRgIC8gYGNsb3NlZGAgaXMgc2VydmVkIHVuZGVyIGl0LiAqL1xuICB1c2VSdWxlKHJ1bGU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnJ1bGUgPSBydWxlO1xuICB9XG5cbiAgLyoqIEFib3J0cyBhdCB0aGUgZmlyc3QgbG9zcyB1bmRlciBgb25GYWlsdXJlOiAnZmFpbCdgOyBhYnNlbnQgb3RoZXJ3aXNlLiAqL1xuICBnZXQgc3RvcFNpZ25hbCgpOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcHBlcj8uc2lnbmFsO1xuICB9XG5cbiAgZ2V0IGZsdXNoTW9kZSgpOiBSZWNvcmRTaW5rRmx1c2hNb2RlIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZC5mbHVzaDtcbiAgfVxuXG4gIC8qKiBUaGUgbG9zcyB0aGF0IGZhaWxzIHRoZSBydW4gdW5kZXIgYCdmYWlsJ2A7IGFic2VudCB3aGlsZSBub3RoaW5nIHdhcyBsb3N0IChhbmQgYWx3YXlzIHVuZGVyIGAncmVwb3J0J2ApLiAqL1xuICBnZXQgZmF0YWwoKTogUmVjb3JkU2lua0Vycm9yIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5mYWlsdXJlO1xuICB9XG5cbiAgc3RhdHMoKTogUmVjb3JkU2lua1N0YXRzIHtcbiAgICByZXR1cm4ge1xuICAgICAgZW50cmllczogdGhpcy5lbnRyaWVzLFxuICAgICAgZmFpbGVkOiB0aGlzLmZhaWxlZCxcbiAgICAgIC4uLih0aGlzLmxhc3RFcnJvciA9PT0gdW5kZWZpbmVkID8ge30gOiB7IGxhc3RFcnJvcjogdGhpcy5sYXN0RXJyb3IgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBd2FpdCB0aGUgYWRhcHRlcidzIGBmbHVzaCgpYCwgYXQgbW9zdCBgdGltZW91dE1zYCB3aGVuIGdpdmVuLiBBIGZsdXNoIHRoYXQgdGhyb3dzIG9yIHJlamVjdHMgaXMgYSBsb3NzXG4gICAqIChjb3VudGVkLCBhbmQgZmF0YWwgdW5kZXIgYCdmYWlsJ2ApOyBvbmUgc3RpbGwgcnVubmluZyBhdCB0aGUgZGVhZGxpbmUgaXMgYHBlbmRpbmdgIGFuZCBrZWVwcyBydW5uaW5nIOKAlCBhbmQsXG4gICAqIHdpdGggYHBlbmRpbmdJc0xvc3NgICh0aGUgcnVuJ3Mgb3duIGZsdXNoKSwgY291bnRlZCBhcyBhIGxvc3MgdG9vLCBzbyBhIGZsdXNoIHRoYXQgbmV2ZXIgc2V0dGxlcyBjYW5ub3QgaG9sZCBhXG4gICAqIHJ1biBvcGVuLCBhbmQgY2Fubm90IHBhc3MgZm9yIG9uZSB0aGF0IGxhbmRlZC4gTm90aGluZyBoZXJlIHRocm93czogYSBob3N0aWxlIGFkYXB0ZXIgKGEgdGhyb3dpbmcgYGZsdXNoYFxuICAgKiBnZXR0ZXIsIGEgcHJvbWlzZSB3aXRoIGl0cyBvd24gYHRoZW5gKSBpcyBhIGxvc3MsIG5ldmVyIHRoZSBydW4ncyBlcnJvci5cbiAgICovXG4gIGFzeW5jIGZsdXNoKHRpbWVvdXRNcz86IG51bWJlciwgcGVuZGluZ0lzTG9zcyA9IGZhbHNlKTogUHJvbWlzZTxSZWNvcmRGbHVzaFJlc3VsdD4ge1xuICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLnJlc29sdmVkLmFkYXB0ZXI7XG4gICAgY29uc3QgcnVsZSA9IHRoaXMucnVsZTtcbiAgICBsZXQgc2V0dGxlZDogUHJvbWlzZTxSZWNvcmRGbHVzaFJlc3VsdD47XG4gICAgbGV0IGdpdmVuVXAgPSBmYWxzZTsgLy8gYSBmbHVzaCBhbHJlYWR5IGNvdW50ZWQgYXMgYSBsb3NzIGF0IHRoZSBkZWFkbGluZSBpcyBub3QgY291bnRlZCBhZ2FpbiB3aGVuIGl0IHJlamVjdHNcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmx1c2g6IHVua25vd24gPSBhZGFwdGVyLmZsdXNoOyAvLyByZWFkIG9uY2U6IGEgZ2V0dGVyIHJ1bnMgb25jZSwgaW5zaWRlIHRoZSBndWFyZFxuICAgICAgaWYgKHR5cGVvZiBmbHVzaCAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgZmFpbGVkOiBmYWxzZSwgcGVuZGluZzogZmFsc2UgfTtcbiAgICAgIHNldHRsZWQgPSBzZXR0bGVPbmNlKFxuICAgICAgICBmbHVzaC5jYWxsKGFkYXB0ZXIpLFxuICAgICAgICAoKTogUmVjb3JkRmx1c2hSZXN1bHQgPT4gKHsgZG9uZTogdHJ1ZSwgZmFpbGVkOiBmYWxzZSwgcGVuZGluZzogZmFsc2UgfSksXG4gICAgICAgIChlcnJvcik6IFJlY29yZEZsdXNoUmVzdWx0ID0+IHtcbiAgICAgICAgICBpZiAoIWdpdmVuVXApIHRoaXMubG9zdChlcnJvciwgdW5kZWZpbmVkLCB0aGlzLmVycm9yVmlldyhlcnJvciwgcnVsZSkpO1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCBmYWlsZWQ6IHRydWUsIHBlbmRpbmc6IGZhbHNlIH07XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvc3QoZXJyb3IsIHVuZGVmaW5lZCwgdGhpcy5lcnJvclZpZXcoZXJyb3IsIHJ1bGUpKTtcbiAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCBmYWlsZWQ6IHRydWUsIHBlbmRpbmc6IGZhbHNlIH07XG4gICAgfVxuICAgIGlmICh0aW1lb3V0TXMgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKHRpbWVvdXRNcykpIHJldHVybiBzZXR0bGVkO1xuICAgIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGVuZGluZyA9IG5ldyBQcm9taXNlPFJlY29yZEZsdXNoUmVzdWx0PigocmVzb2x2ZSkgPT4ge1xuICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoeyBkb25lOiBmYWxzZSwgZmFpbGVkOiBmYWxzZSwgcGVuZGluZzogdHJ1ZSB9KSwgTWF0aC5tYXgoMCwgdGltZW91dE1zKSk7XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbc2V0dGxlZCwgcGVuZGluZ10pO1xuICAgICAgaWYgKHJlc3VsdC5wZW5kaW5nICYmIHBlbmRpbmdJc0xvc3MpIHtcbiAgICAgICAgZ2l2ZW5VcCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGByZWNvcmQgc2luazogZmx1c2goKSBkaWQgbm90IHNldHRsZSB3aXRoaW4gJHtNYXRoLm1heCgwLCB0aW1lb3V0TXMpfW1zYCk7XG4gICAgICAgIHRoaXMubG9zdChlcnJvciwgdW5kZWZpbmVkLCB0aGlzLmVycm9yVmlldyhlcnJvciwgcnVsZSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG4gIH1cblxuICAvKiogVGhlIG1ldGEgYXMgc2VydmVkOiBhIGJvdW5kYXJ5IHJlY29yZCwgc2NydWJiZWQgYnkga2V5IG5hbWUgYXQgZXZlcnkgZGVwdGggKGFuIGluZXJ0IHJ1bGUgY29waWVzIG5vdGhpbmcpLiAqL1xuICBzZXJ2ZShtZXRhOiBNZXRhKTogTWV0YSB7XG4gICAgcmV0dXJuIHRoaXMucnVsZSA/IHRoaXMucnVsZS5yZXRhaW5Cb3VuZGFyeShtZXRhLCBMT0dfUExBQ0VIT0xERVIpIDogbWV0YTtcbiAgfVxuXG4gIC8qKiBPbmUgbG9zczogY291bnRlZCwgd2FybmVkIG9uY2UgcGVyIHJ1biwgdG9sZCB3aXRoIGEgc2FmZSBkaXNwYXRjaGVkIGVudHJ5IHdoZW4gYXZhaWxhYmxlLCBmYXRhbCB1bmRlciAnZmFpbCcuICovXG4gIHByaXZhdGUgbG9zdChlcnJvcjogdW5rbm93biwgZW50cnk6IFJlY29yZEVudHJ5IHwgdW5kZWZpbmVkLCB2aWV3OiBTaW5rRXJyb3JWaWV3KTogdm9pZCB7XG4gICAgdGhpcy5mYWlsZWQgKz0gMTtcbiAgICBjb25zdCB0ZXh0ID0gdmlldy50ZXh0O1xuICAgIHRoaXMubGFzdEVycm9yID0gdGV4dDtcbiAgICBpZiAoaXNEZXZNb2RlKCkgJiYgIXRoaXMud2FybmVkKSB7XG4gICAgICB0aGlzLndhcm5lZCA9IHRydWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW2Zvb3RwcmludF0gcmVjb3JkIHNpbms6IGFuIGVudHJ5IHdhcyBub3Qgc3RvcmVkICgke3RleHR9KS4gVGhlIHJ1biBnb2VzIG9uOyBgICtcbiAgICAgICAgICAnZ2V0U25hcHNob3QoKS5zaW5rIGNvdW50cyBldmVyeSBsb3NzLicsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBUaGUgZmFpbHVyZSBtb2RlIGZpcnN0OiBub3RoaW5nIHRoZSBhZGFwdGVyJ3Mgb3duIGxpc3RlbmVyIGRvZXMgY2FuIHNraXAgaXQuXG4gICAgaWYgKHRoaXMuc3RvcHBlciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZmFpbHVyZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZhaWx1cmUgPSBuZXcgUmVjb3JkU2lua0Vycm9yKGByZWNvcmQgc2luazogYW4gZW50cnkgd2FzIG5vdCBzdG9yZWQg4oCUICR7dGV4dH1gLCBlcnJvcik7XG4gICAgICBpZiAodmlldy5tYXNrZWQpIHtcbiAgICAgICAgLy8gVGhlIGNhbGxlciBrZWVwcyB0aGUgcmVhbCBjYXVzZSwgYnV0IG9ic2VydmVycyBvZiB0aGlzIG5ldyB3cmFwcGVyIG11c3QgaW5oZXJpdCBpdHMgcmVtZW1iZXJlZCBtYXNrLlxuICAgICAgICB2aWV3LnJ1bGU/LnJldGFpblN0YWdlRXJyb3IodGhpcy5mYWlsdXJlLCB0aGlzLmZhaWx1cmUubWVzc2FnZSwgU0NPUEVfUExBQ0VIT0xERVIpO1xuICAgICAgICBpZiAodGhpcy5ydWxlICE9PSB2aWV3LnJ1bGUpIHRoaXMucnVsZT8ucmV0YWluU3RhZ2VFcnJvcih0aGlzLmZhaWx1cmUsIHRoaXMuZmFpbHVyZS5tZXNzYWdlLCBTQ09QRV9QTEFDRUhPTERFUik7XG4gICAgICB9XG4gICAgICB0aGlzLnN0b3BwZXIuYWJvcnQodGhpcy5mYWlsdXJlKTtcbiAgICB9XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHRlbGxBZGFwdGVyKHRoaXMucmVzb2x2ZWQuYWRhcHRlciwgeyBlbnRyeSwgZXJyb3I6IHZpZXcuZXJyb3IgfSk7XG4gIH1cbn1cblxuLyoqIFRoZSBhZGFwdGVyJ3Mgb3duIGBvbkZhaWx1cmVgLCBpc29sYXRlZDogYSB0aHJvd2luZyBnZXR0ZXIsIGEgdGhyb3cgb3IgYSByZWplY3Rpb24gdGhlcmUgY2hhbmdlcyBub3RoaW5nLiAqL1xuZnVuY3Rpb24gdGVsbEFkYXB0ZXIoYWRhcHRlcjogUmVjb3JkU2luaywgZmFpbHVyZTogeyByZWFkb25seSBlbnRyeTogUmVjb3JkRW50cnk7IHJlYWRvbmx5IGVycm9yOiB1bmtub3duIH0pOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBsaXN0ZW5lcjogdW5rbm93biA9IGFkYXB0ZXIub25GYWlsdXJlO1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09ICdmdW5jdGlvbicpIHJldHVybjtcbiAgICBzZXR0bGVPbmNlKFxuICAgICAgbGlzdGVuZXIuY2FsbChhZGFwdGVyLCBmYWlsdXJlKSxcbiAgICAgICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICgpID0+IHVuZGVmaW5lZCxcbiAgICApO1xuICB9IGNhdGNoIHtcbiAgICAvLyBBIGxpc3RlbmVyIHRoYXQgZmFpbHMgaXMgdGhlIGFkYXB0ZXIncyBvd24gYnVzaW5lc3M6IHRoZSBsb3NzIGlzIGFscmVhZHkgY291bnRlZC5cbiAgfVxufVxuXG4vKipcbiAqIGB2YWx1ZWAsIHNldHRsZWQgT05DRSBpbnRvIGBvblZhbHVlYCAvIGBvbkVycm9yYCDigJQgbmV2ZXIgdGhyb3VnaCB0aGUgdmFsdWUncyBvd24gYHRoZW5gOiBhIG5hdGl2ZSBwcm9taXNlIGlzXG4gKiB3YXRjaGVkIHRocm91Z2ggdGhlIHJlYWwgYFByb21pc2UucHJvdG90eXBlLnRoZW5gIChhbiBvd24gYHRoZW5gIG9uIGl0IGlzIG5vdCB0cnVzdGVkLCBzbyBpdHMgcmVqZWN0aW9uIGlzIGFsd2F5c1xuICogaGFuZGxlZCksIGFueSBvdGhlciB0aGVuYWJsZSBhZG9wdGVkIGludG8gYSBmcmVzaCBwcm9taXNlLiBBIHBsYWluIHZhbHVlIGlzIGEgZnVsZmlsbWVudC5cbiAqL1xuZnVuY3Rpb24gc2V0dGxlT25jZTxUPih2YWx1ZTogdW5rbm93biwgb25WYWx1ZTogKCkgPT4gVCwgb25FcnJvcjogKGVycm9yOiB1bmtub3duKSA9PiBUKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGFkb3B0ZWQ6IFByb21pc2U8dW5rbm93bj4gPSB2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UgPyB2YWx1ZSA6IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiByZXNvbHZlKHZhbHVlKSk7XG4gIHJldHVybiBQcm9taXNlLnByb3RvdHlwZS50aGVuLmNhbGwoYWRvcHRlZCwgb25WYWx1ZSwgb25FcnJvcikgYXMgUHJvbWlzZTxUPjtcbn1cbiJdfQ==
@@ -21,6 +21,7 @@
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.announceResume = exports.seedCounters = exports.planResume = void 0;
23
23
  const foottrace_1 = require("foottrace");
24
+ const effect_js_1 = require("../attempt/effect.js");
24
25
  const ResumeEntry_js_1 = require("../engine/handlers/ResumeEntry.js");
25
26
  const traversalContext_js_1 = require("../engine/traversalContext.js");
26
27
  const interrupt_js_1 = require("../pause/interrupt.js");
@@ -60,6 +61,17 @@ function planResume(fc, stored, resumeInput) {
60
61
  throw new Error(`Cannot resume: stage '${pausedNode.name}' (${pausedNode.id}) has no resumeFn. ` +
61
62
  'Only stages created with addPausableFunction(), or stages that paused via interrupt(), can be resumed.');
62
63
  }
64
+ // A keyless touching stage is never re-run (P3) — a checkpoint from another version of the chart included.
65
+ const rerunRefusal = isInterruptResume ? (0, effect_js_1.interruptProblem)(pausedNode.touches) : undefined;
66
+ if (rerunRefusal !== undefined) {
67
+ throw new Error(`Cannot resume: stage '${pausedNode.name}' (${pausedNode.id}) ${rerunRefusal}`);
68
+ }
69
+ // A carried key is adopted only by a stage that declares a key rule (P3): a checkpoint must not hand a key to a
70
+ // stage that makes none — a key replayed into another operation. Named by field, never quoted.
71
+ if (checkpoint.idempotencyKey !== undefined && pausedNode.touches?.idempotencyKey === undefined) {
72
+ throw new Error(`Cannot resume: the checkpoint carries an idempotencyKey, but stage '${pausedNode.name}' (${pausedNode.id}) ` +
73
+ 'declares no idempotency key rule — the chart may have changed since the checkpoint was created.');
74
+ }
63
75
  const resumeStageFn = resumeHalfOf(fc, pausedNode, isInterruptResume, resumeInput);
64
76
  // The paused stage's STAND-IN: the stage's OWN node — id, name,
65
77
  // description, tags, and its shape (a decider's branches, a selector's, a
@@ -74,6 +86,12 @@ function planResume(fc, stored, resumeInput) {
74
86
  // own `next`, else its dispatcher's continuation — is attached by
75
87
  // `ResumeEntry.plan`, from the chart.
76
88
  const standIn = standInFor(pausedNode, resumeStageFn, isInterruptResume);
89
+ // A touching stage resumes under the key it paused under (P3), carried by the checkpoint — never one its rule
90
+ // would recompute from this leg's input (the input does not cross a resume).
91
+ // The key is the operational value only: served under the run's rule like a key of unknown sources.
92
+ const carriedKey = checkpoint.idempotencyKey;
93
+ if (standIn.touches && carriedKey !== undefined)
94
+ standIn.touches = (0, effect_js_1.carriedTouches)(standIn.touches.system, carriedKey);
77
95
  // Where the resume re-enters, planned against the chart as built:
78
96
  //
79
97
  // • TOP-LEVEL PAUSE (subflowPath empty): the resumed traversal starts
@@ -156,7 +174,7 @@ exports.seedCounters = seedCounters;
156
174
  */
157
175
  function announceResume(plan, resumeInput, run) {
158
176
  const { checkpoint, pausedNode, entry } = plan;
159
- const { observers } = run;
177
+ const { observers, correlation } = run;
160
178
  const hasInput = resumeInput !== undefined;
161
179
  const stepsBeforeStandIn = entry.stepsBeforeStandIn ?? checkpoint.subflowPath.length;
162
180
  const resumeRuntimeStageId = (0, foottrace_1.buildRuntimeStageId)(pausedNode.id, run.executionCount + stepsBeforeStandIn);
@@ -172,6 +190,7 @@ function announceResume(plan, resumeInput, run) {
172
190
  runtimeStageId: resumeRuntimeStageId,
173
191
  subflowPath: checkpoint.subflowPath,
174
192
  resumedFrom,
193
+ correlation,
175
194
  }),
176
195
  channel: 'flow',
177
196
  };
@@ -187,6 +206,7 @@ function announceResume(plan, resumeInput, run) {
187
206
  pipelineId: '',
188
207
  timestamp: Date.now(),
189
208
  channel: 'scope',
209
+ ...(correlation && { correlation }),
190
210
  };
191
211
  (0, hooks_js_1.fire)(observers.scopeRecorders, 'onResume', scopeResumeEvent, (error, _recorder, hook) =>
192
212
  // The scope channel's policy (as `ScopeFacade` routes a stage's hook failure): the throw
@@ -304,4 +324,4 @@ function dfsFind(node, targetId, visited = new Set()) {
304
324
  return dfsFind(node.next, targetId, visited);
305
325
  return undefined;
306
326
  }
307
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ydW5uZXIvcmVzdW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHOzs7QUFFSCx5Q0FBZ0Q7QUFHaEQsc0VBQWdFO0FBRWhFLHVFQUF1RTtBQUV2RSx3REFBK0Q7QUFDL0Qsa0RBQXNEO0FBRXRELGdEQUFzRDtBQUN0RCxtREFBaUY7QUFhakYsbUdBQW1HO0FBQ25HLE1BQU0sbUJBQW1CLEdBQUcsSUFBQSx3QkFBYSxFQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFL0Q7Ozs7R0FJRztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsRUFBMkIsRUFDM0IsTUFBMkIsRUFDM0IsV0FBb0I7SUFFcEIsd0VBQXdFO0lBQ3hFLHVFQUF1RTtJQUN2RSxNQUFNLFVBQVUsR0FBRyxJQUFBLDRCQUFnQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTVDLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQ2IseUJBQXlCLFVBQVUsQ0FBQyxhQUFhLDRCQUE0QjtZQUMzRSw4REFBOEQsQ0FDakUsQ0FBQztJQUNKLENBQUM7SUFDRCwyREFBMkQ7SUFDM0QsRUFBRTtJQUNGLHVFQUF1RTtJQUN2RSw0RUFBNEU7SUFDNUUsMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUM1RSx5RUFBeUU7SUFDekUsMERBQTBEO0lBQzFELHlEQUF5RDtJQUN6RCxFQUFFO0lBQ0Ysc0VBQXNFO0lBQ3RFLDhFQUE4RTtJQUM5RSxNQUFNLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxRQUFRLEtBQUssV0FBVyxDQUFDO0lBQzlELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxJQUFJLENB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QUFFLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3RDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELElBQUksS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZXN1bWUg4oCUIGhvdyBgRmxvd0NoYXJ0RXhlY3V0b3IucmVzdW1lKClgIHBsYW5zIGFuZCBhbm5vdW5jZXMgYSByZS1lbnRyeSAoRjkpLlxuICpcbiAqIFRocmVlIHN0ZXBzLCBpbiB0aGUgb3JkZXIgdGhlIGV4ZWN1dG9yIHRha2VzIHRoZW06XG4gKlxuICogICAxLiB7QGxpbmsgcGxhblJlc3VtZX0g4oCUIGRlY29kZSB0aGUgY2hlY2twb2ludCAodGhlIE9ORSBjb2RlYyxcbiAqICAgICAgYHBhdXNlL3JlY29yZC50c2ApLCBmaW5kIHRoZSBwYXVzZWQgc3RhZ2UgaW4gdGhlIGNoYXJ0IGFzIGJ1aWx0LCBidWlsZFxuICogICAgICB0aGUgcmVzdW1lIGhhbGYgYW5kIHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiwgYW5kIHBsYW4gdGhlIG9uZS1zaG90XG4gKiAgICAgIHJlLWVudHJ5IChgUmVzdW1lRW50cnkucGxhbmApLiBFdmVyeSByZWZ1c2FsIGhhcHBlbnMgSEVSRSwgYmVmb3JlIGFueVxuICogICAgICBleGVjdXRvciBzdGF0ZSBpcyB0b3VjaGVkLlxuICogICAyLiB7QGxpbmsgc2VlZENvdW50ZXJzfSDigJQgY2FycnkgdGhlIHBhdXNlLXRpbWUgZXhlY3V0aW9uIGNvdW50ZXIgYW5kIHZpc2l0XG4gKiAgICAgIGNvdW50cyBpbnRvIHRoZSBydW4ncyBzaGFyZWQgY291bnRlcnMgKG11dGF0ZWQsIG5ldmVyIHJlcGxhY2VkKS5cbiAqICAgMy4ge0BsaW5rIGFubm91bmNlUmVzdW1lfSDigJQgZmlyZSB0aGUgZXhlY3V0b3ItbWFkZSBgb25SZXN1bWVgIG9uIHRoZSBmbG93XG4gKiAgICAgIGFuZCBzY29wZSBjaGFubmVscyAoYW5kIGNhcHR1cmUgaXQgZm9yIHRoZSBkZWZlcnJlZCB0aWVyKSwgQkVGT1JFIHRoZVxuICogICAgICB0cmF2ZXJzYWwgc28gaXQgcHJlY2VkZXMgYG9uUnVuU3RhcnRgLlxuICpcbiAqIFRoZSBleGVjdXRvciBvd25zIHRoZSBwZXItcnVuIHN0YXRlIGJldHdlZW4gdGhlIHN0ZXBzICh0aGUgcnVuSWQsIHRoZVxuICogcnVudGltZSwgdGhlIHRyYXZlcnNlcik7IHRoaXMgbW9kdWxlIG5ldmVyIGhvbGRzIGFueS5cbiAqL1xuXG5pbXBvcnQgeyBidWlsZFJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBGbG93Q2hhcnQgfSBmcm9tICcuLi9idWlsZGVyL3R5cGVzLmpzJztcbmltcG9ydCB7IFJlc3VtZUVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL2hhbmRsZXJzL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB0eXBlIHsgUmVzdW1lTGluayB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgcmVzdW1lVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL2VuZ2luZS90cmF2ZXJzYWxDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VGdW5jdGlvbiwgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB7IHByb3ZpZGVJbnRlcnJ1cHRBbnN3ZXIgfSBmcm9tICcuLi9wYXVzZS9pbnRlcnJ1cHQuanMnO1xuaW1wb3J0IHsgZGVjb2RlQ2hlY2twb2ludCB9IGZyb20gJy4uL3BhdXNlL3JlY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlZEV4ZWN1dGlvbiB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IGZpcmUsIHJlY29yZGVyRmFpbHVyZUV2ZW50LCB3YXJuSW5EZXZNb2RlIH0gZnJvbSAnLi4vcmVjb3JkZXIvaG9va3MuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5PYnNlcnZlcnMgfSBmcm9tICcuL2F0dGFjaC5qcyc7XG5cbi8qKiBFdmVyeXRoaW5nIGEgcmVzdW1lIGRlY2lkZWQgYmVmb3JlIGFueSBleGVjdXRvciBzdGF0ZSB3YXMgdG91Y2hlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdW1lUGxhbjxUT3V0LCBUU2NvcGU+IHtcbiAgLyoqIFRoZSBkZWNvZGVkIGNoZWNrcG9pbnQgKHVwY2FzdCBhbmQgY2hlY2tlZCkuICovXG4gIHJlYWRvbmx5IGNoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQ7XG4gIC8qKiBUaGUgcGF1c2VkIHN0YWdlJ3MgUkVBTCBub2RlIGluIHRoZSBjaGFydC4gKi9cbiAgcmVhZG9ubHkgcGF1c2VkTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKiBXaGVyZSB0aGUgcmVzdW1lZCB0cmF2ZXJzYWwgc3RhcnRzLCBhbmQgd2hhdCBlYWNoIHN1YmZsb3cgb24gdGhlIHBhdGggdGFrZXMgb24gaXRzIGZpcnN0IGVudHJ5LiAqL1xuICByZWFkb25seSBlbnRyeTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPjtcbn1cblxuLyoqIFRoZSBmbG93IGNoYW5uZWwncyBpc29sYXRpb24gZm9yIHRoZSBleGVjdXRvci1tYWRlIGBvblJlc3VtZWAgKGRldi1tb2RlIHdhcm5pbmcsIHRoZW4gc2tpcCkuICovXG5jb25zdCBSRVNVTUVfRkxPV19GQUlMVVJFID0gd2FybkluRGV2TW9kZSgnRmxvd0NoYXJ0RXhlY3V0b3InKTtcblxuLyoqXG4gKiBQbGFuIHRoZSByZXN1bWUgYWdhaW5zdCB0aGUgY2hhcnQgYXMgYnVpbHQuIFRocm93cyDigJQgbGVhdmluZyB0aGUgZXhlY3V0b3JcbiAqIHVudG91Y2hlZCDigJQgd2hlbiB0aGUgY2hlY2twb2ludCBpcyBtYWxmb3JtZWQsIHRoZSBwYXVzZWQgc3RhZ2UgaXMgZ29uZSwgaXRcbiAqIGNhbm5vdCBiZSByZXN1bWVkLCBvciBpdHMgcGF0aCBkb2VzIG5vdCBmaXQgdGhpcyBjaGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsYW5SZXN1bWU8VE91dCwgVFNjb3BlPihcbiAgZmM6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICBzdG9yZWQ6IEZsb3djaGFydENoZWNrcG9pbnQsXG4gIHJlc3VtZUlucHV0OiB1bmtub3duLFxuKTogUmVzdW1lUGxhbjxUT3V0LCBUU2NvcGU+IHtcbiAgLy8gRGVjb2RlIHRoZSBjaGVja3BvaW50IChtYXkgY29tZSBmcm9tIHVudHJ1c3RlZCBleHRlcm5hbCBzdG9yYWdlLCBmcm9tXG4gIC8vIGFueSByZWxlYXNlKSDigJQgdGhlIE9ORSBjb2RlYzogdXBjYXN0LCB0aGVuIGNoZWNrIGV2ZXJ5IHBhdXNlIHJlY29yZC5cbiAgY29uc3QgY2hlY2twb2ludCA9IGRlY29kZUNoZWNrcG9pbnQoc3RvcmVkKTtcblxuICBjb25zdCBwYXVzZWROb2RlID0gZmluZE5vZGVJbkdyYXBoKGZjLCBjaGVja3BvaW50LnBhdXNlZFN0YWdlSWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpO1xuICBpZiAoIXBhdXNlZE5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7Y2hlY2twb2ludC5wYXVzZWRTdGFnZUlkfScgbm90IGZvdW5kIGluIGZsb3djaGFydC4gYCArXG4gICAgICAgICdUaGUgY2hhcnQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgY2hlY2twb2ludCB3YXMgY3JlYXRlZC4nLFxuICAgICk7XG4gIH1cbiAgLy8gVHdvIHJlLWVudHJ5IHNoYXBlcywgY2hvc2VuIGJ5IEhPVyB0aGUgcGF1c2Ugd2FzIHJhaXNlZDpcbiAgLy9cbiAgLy8gICDigKIgaW50ZXJydXB0KCkgICAgICDihpIgUkUtUlVOIFRIRSBTVEFHRSdTIE9XTiBGVU5DVElPTiBGUk9NIElUUyBUT1AuXG4gIC8vICAgICBTdGFnZXMgYXJlIGF0b21pYyAodGhlIHNhbWUgbGF3IGByZXN1bWVPbkVycm9yYCBzdGF0ZXMpOiBhIHN0YWdlIHRoYXRcbiAgLy8gICAgIHN0b3BwZWQgbWlkLWJvZHkgaGFzIG5vIGhhbGYgdG8gcmVzdW1lIGludG8sIHNvIHRoZSB3aG9sZSBib2R5IHJ1bnNcbiAgLy8gICAgIGFnYWluIGFuZCB0aGUgYW5zd2VyIGNvbWVzIGJhY2sgb3V0IG9mIHRoZSBgaW50ZXJydXB0KClgIGNhbGwgaXRzZWxmLlxuICAvLyAgICAgRXZlcnl0aGluZyB0aGUgYm9keSBkaWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQgaXMgcmUtZG9uZSDigJQgd2hpY2ggaXNcbiAgLy8gICAgIHdoeSB0aGUgZG9jcyB0ZWxsIHlvdSB0byBrZWVwIHRoYXQgaGFsZiBpZGVtcG90ZW50LlxuICAvLyAgIOKAoiBhZGRQYXVzYWJsZUZ1bmN0aW9uIOKGkiBydW4gdGhlIGRlY2xhcmVkIGByZXN1bWVGbmAuXG4gIC8vXG4gIC8vIFRoZSBkaXNjcmltaW5hbnQgaXMgb24gdGhlIGNoZWNrcG9pbnQsIHNvIHRoaXMgd29ya3MgY3Jvc3MtZXhlY3V0b3JcbiAgLy8gKGEgY2hlY2twb2ludCByZXN0b3JlZCBmcm9tIFJlZGlzIG9uIGEgZnJlc2ggcHJvY2VzcyByZXN1bWVzIHRoZSBzYW1lIHdheSkuXG4gIGNvbnN0IGlzSW50ZXJydXB0UmVzdW1lID0gY2hlY2twb2ludC5wYXVzZWRCeSA9PT0gJ2ludGVycnVwdCc7XG4gIGlmICghcGF1c2VkTm9kZS5yZXN1bWVGbiAmJiAhaXNJbnRlcnJ1cHRSZXN1bWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7cGF1c2VkTm9kZS5uYW1lfScgKCR7cGF1c2VkTm9kZS5pZH0pIGhhcyBubyByZXN1bWVGbi4gYCArXG4gICAgICAgICdPbmx5IHN0YWdlcyBjcmVhdGVkIHdpdGggYWRkUGF1c2FibGVGdW5jdGlvbigpLCBvciBzdGFnZXMgdGhhdCBwYXVzZWQgdmlhIGludGVycnVwdCgpLCBjYW4gYmUgcmVzdW1lZC4nLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmVzdW1lU3RhZ2VGbiA9IHJlc3VtZUhhbGZPZihmYywgcGF1c2VkTm9kZSwgaXNJbnRlcnJ1cHRSZXN1bWUsIHJlc3VtZUlucHV0KTtcblxuICAvLyBUaGUgcGF1c2VkIHN0YWdlJ3MgU1RBTkQtSU46IHRoZSBzdGFnZSdzIE9XTiBub2RlIOKAlCBpZCwgbmFtZSxcbiAgLy8gZGVzY3JpcHRpb24sIHRhZ3MsIGFuZCBpdHMgc2hhcGUgKGEgZGVjaWRlcidzIGJyYW5jaGVzLCBhIHNlbGVjdG9yJ3MsIGFcbiAgLy8gZm9yayBwYXJlbnQncyBjaGlsZHJlbiwgaXRzIGBuZXh0YCkg4oCUIHdpdGggaXRzIGZ1bmN0aW9uIHN3YXBwZWQgZm9yIHRoZVxuICAvLyByZXN1bWUgaGFsZi4gQnVpbHQgZnJvbSB0aGUgd2hvbGUgbm9kZSBzbyBhbiBgaW50ZXJydXB0KClgIHJhaXNlZCBpbnNpZGVcbiAgLy8gYSBkZWNpZGVyLCBzZWxlY3RvciBvciBmb3JrLXBhcmVudCBmdW5jdGlvbiBESVNQQVRDSEVTIG9uIHJlc3VtZSwgYXMgdGhlXG4gIC8vIHN0YWdlIGRpZCBvbiB0aGUgcnVuIChiZWZvcmUgOS4yOC4wIG9ubHkgZm4vbmV4dC90YWdzL3JldHJ5IHdlcmUgY29waWVkXG4gIC8vIGFuZCB0aGUgZGlzcGF0Y2ggd2FzIHNpbGVudGx5IHNraXBwZWQpLiBJdCBpcyB3aGVyZSB0aGUgcmVzdW1lZFxuICAvLyB0cmF2ZXJzYWwgc3RhcnRzIOKAlCBhbmQgbm90aGluZyBlbHNlOiBpdCBpcyBuZXZlciBpbiBhIG5vZGUgbWFwIG9yIHRoZVxuICAvLyBzdWJmbG93IGRpY3Rpb25hcnksIHNvIGEgbG9vcCBiYWNrIHRvIHRoZSBwYXVzZWQgaWQgZmluZHMgdGhlIFJFQUxcbiAgLy8gc3RhZ2UsIHdoaWNoIHBhdXNlcyBhZ2FpbiAoc2VlIFJlc3VtZUVudHJ5KS4gV2hhdCBydW5zIGFmdGVyIGl0IOKAlCBpdHNcbiAgLy8gb3duIGBuZXh0YCwgZWxzZSBpdHMgZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvbiDigJQgaXMgYXR0YWNoZWQgYnlcbiAgLy8gYFJlc3VtZUVudHJ5LnBsYW5gLCBmcm9tIHRoZSBjaGFydC5cbiAgY29uc3Qgc3RhbmRJbiA9IHN0YW5kSW5Gb3IocGF1c2VkTm9kZSwgcmVzdW1lU3RhZ2VGbiwgaXNJbnRlcnJ1cHRSZXN1bWUpO1xuXG4gIC8vIFdoZXJlIHRoZSByZXN1bWUgcmUtZW50ZXJzLCBwbGFubmVkIGFnYWluc3QgdGhlIGNoYXJ0IGFzIGJ1aWx0OlxuICAvL1xuICAvLyAgIOKAoiBUT1AtTEVWRUwgUEFVU0UgKHN1YmZsb3dQYXRoIGVtcHR5KTogdGhlIHJlc3VtZWQgdHJhdmVyc2FsIHN0YXJ0c1xuICAvLyAgICAgYXQgdGhlIHN0YW5kLWluLlxuICAvLyAgIOKAoiBQQVVTRSBJTlNJREUgU1VCRkxPV1M6IGl0IHN0YXJ0cyBhdCB0aGUgbW91bnQgb2YgdGhlIGZpcnN0IHN1YmZsb3dcbiAgLy8gICAgIG9uIHRoZSBwYXRoLCBzbyB0aGUgb3V0cHV0TWFwcGVycyBhbmQgdGhlIHBhcmVudCdzIGNvbnRpbnVhdGlvblxuICAvLyAgICAgcnVuLiBFYWNoIHN1YmZsb3cgb24gdGhlIHBhdGggaXMgZW50ZXJlZCBPTkNFIHRocm91Z2ggaXRzIGhvcDogaXRzXG4gIC8vICAgICBuZXN0ZWQgcnVudGltZSBpcyBzZWVkZWQgZnJvbSBpdHMgY2FwdHVyZSAoaW4gcGxhY2Ugb2YgdGhlXG4gIC8vICAgICBpbnB1dE1hcHBlcidzIHZhbHVlcykgYW5kIGl0cyB0cmF2ZXJzYWwgc3RhcnRzIGF0IHRoZSBtb3VudCBvZiB0aGVcbiAgLy8gICAgIG5leHQgc3ViZmxvdyDigJQgb3IsIGF0IHRoZSBsZWFmLCBhdCB0aGUgc3RhbmQtaW4uIEFuIG91dGVyIHN1YmZsb3cnc1xuICAvLyAgICAgc3RhZ2VzIGJlZm9yZSB0aGF0IG1vdW50IGRvIG5vdCBydW4gYWdhaW4uXG4gIC8vICAg4oCiIEFUIEVWRVJZIExFVkVMIHRoZSBlbnRyeSBjYXJyaWVzIHdoYXQgaXRzIGRpc3BhdGNoZXIgd291bGQgaGF2ZSBydW5cbiAgLy8gICAgIGFmdGVyIGl0IOKAlCBhIGRlY2lkZXIncyBgbmV4dGAsIGEgc2VsZWN0b3IncywgYSBmb3JrJ3Mgam9pbiDigJQgc28gYVxuICAvLyAgICAgc3ViZmxvdyBtb3VudGVkIGFzIGEgYnJhbmNoIG9yIGEgZm9yayBjaGlsZCBoYW5kcyBjb250cm9sIGJhY2sgdG9cbiAgLy8gICAgIGl0cyBwYXJlbnQncyBjb250aW51YXRpb24gYXQgdGhlIHBhcmVudCdzIGxldmVsLlxuICAvLyAgIOKAoiBQYXJhbGxlbCBzaWJsaW5ncyB0aGF0IHBhdXNlZCBpbiB0aGUgc2FtZSBmYW4tb3V0IHdhaXQgaW5cbiAgLy8gICAgIGBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNgOiBlYWNoIGlzIHJhaXNlZCBhZ2FpbiBpbiB0dXJuLCBhbmQgdGhlXG4gIC8vICAgICBqb2luIHJ1bnMgb25seSBvbmNlIHRoZSBsYXN0IG9uZSBpcyByZXN1bWVkLlxuICAvL1xuICAvLyBFdmVyeXRoaW5nIGVsc2Ugd2Fsa3MgdGhlIFJFQUwgY2hhcnQ6IGBmYy5yb290YCBhbmQgYGZjLnN1YmZsb3dzYCBhcmVcbiAgLy8gdW50b3VjaGVkLCBzbyBldmVyeSBsYXRlciBsb29wIHRhcmdldCBhbmQgZXZlcnkgbGF0ZXIgc3ViZmxvdyBlbnRyeVxuICAvLyAocmVhbCByb290LCBpbnB1dE1hcHBlcikgcmVzb2x2ZXMgYXMgaXQgd291bGQgb24gYSBydW4uIFJlZnVzZWQgSEVSRSDigJRcbiAgLy8gYmVmb3JlIGFueSBzdGF0ZSBpcyB0b3VjaGVkIOKAlCB3aGVuIHRoZSBjaGVja3BvaW50J3MgcGF0aCBkb2VzIG5vdCBmaXRcbiAgLy8gdGhpcyBjaGFydC5cbiAgLy9cbiAgLy8gQ2xvbmUtaW46IHRoZSBjYXB0dXJlcyBzZWVkIG5lc3RlZCBydW50aW1lcyAoc2hhbGxvdy1tZXJnZWQgaW50byBlYWNoXG4gIC8vIG5lc3RlZCBTaGFyZWRNZW1vcnkpLCBzbyB3aXRob3V0IGEgY29weSB0aGUgZW5naW5lIHdvdWxkIGhvbGQgbGl2ZVxuICAvLyByZWZlcmVuY2VzIGludG8gdGhlIGNhbGxlcidzIGNoZWNrcG9pbnQgb2JqZWN0IOKAlCBjYWxsZXIgbXV0YXRpb25zIHdvdWxkXG4gIC8vIGJsZWVkIGludG8gdGhlIHJlc3VtZWQgcnVuIGFuZCBlbmdpbmUgd3JpdGVzIHdvdWxkIHJlYWNoIGEgY2hlY2twb2ludFxuICAvLyB0aGUgY2FsbGVyIG1heSBoYXZlIGFscmVhZHkgcGVyc2lzdGVkLiBUaGUgc2FtZSBmb3IgdGhlIHdhaXRpbmdcbiAgLy8gc2libGluZ3MnIGNhcHR1cmVzLlxuICBjb25zdCBlbnRyeSA9IFJlc3VtZUVudHJ5LnBsYW48VE91dCwgVFNjb3BlPih7XG4gICAgcm9vdDogZmMucm9vdCxcbiAgICBzdWJmbG93czogZmMuc3ViZmxvd3MsXG4gICAgcGF0aDogY2hlY2twb2ludC5zdWJmbG93UGF0aCxcbiAgICBjYXB0dXJlczogc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQuc3ViZmxvd1N0YXRlcyksXG4gICAgc3RhbmRJbixcbiAgICAuLi4oY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzICE9PSB1bmRlZmluZWQgJiYgeyBwZW5kaW5nUGF1c2VzOiBzdHJ1Y3R1cmVkQ2xvbmUoY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzKSB9KSxcbiAgfSk7XG4gIHJldHVybiB7IGNoZWNrcG9pbnQsIHBhdXNlZE5vZGUsIGVudHJ5IH07XG59XG5cbi8qKlxuICogU2VlZCB0aGUgcnVuJ3Mgc2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyICsgcGVyLXN0YWdlIHZpc2l0IGNvdW50cyBmcm9tIHRoZVxuICogY2hlY2twb2ludCwgc28gcnVudGltZVN0YWdlSWRzIHN0YXkgdW5pcXVlIGFuZCBsb29wSXRlcmF0aW9uIG1vbm90b25pY1xuICogYWNyb3NzIGEgQ1JPU1MtZXhlY3V0b3IgcmVzdW1lIChhIGZyZXNoIGV4ZWN1dG9yIHN0YXJ0cyBib3RoIGF0IDAvZW1wdHkpLlxuICpcbiAqIE1VVEFURSwgbmV2ZXIgUkVQTEFDRTogYm90aCBhcmUgc2hhcmVkIGJ5IHJlZmVyZW5jZSBpbnRvIHRoZSB0cmF2ZXJzZXJcbiAqIChhbmQsIHRyYW5zaXRpdmVseSwgZXZlcnkgc3ViZmxvdyB0cmF2ZXJzZXIpLiBCb3RoIGZpZWxkcyBhcmUgb3B0aW9uYWwgb25cbiAqIHRoZSBjaGVja3BvaW50IChvbGRlciBwZXJzaXN0ZWQgY2hlY2twb2ludHMgb21pdCB0aGVtKSDigJQgc2VlZGluZyBpcyBza2lwcGVkXG4gKiB3aGVuIGFic2VudC4gU2FtZS1leGVjdXRvciByZXN1bWUgaXMgaWRlbXBvdGVudDogYXQgcGF1c2UgdGhlIHZhbHVlc1xuICogYWxyZWFkeSBlcXVhbCB0aGUgY2hlY2twb2ludCdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VlZENvdW50ZXJzKFxuICBjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50LFxuICBleGVjdXRpb25Db3VudGVyOiB7IHZhbHVlOiBudW1iZXIgfSxcbiAgdmlzaXRDb3VudHM6IE1hcDxzdHJpbmcsIG51bWJlcj4sXG4pOiB2b2lkIHtcbiAgaWYgKGNoZWNrcG9pbnQuZXhlY3V0aW9uQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZWN1dGlvbkNvdW50ZXIudmFsdWUgPSBjaGVja3BvaW50LmV4ZWN1dGlvbkNvdW50O1xuICB9XG4gIGlmIChjaGVja3BvaW50LnZpc2l0Q291bnRzKSB7XG4gICAgdmlzaXRDb3VudHMuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IFtzdGFnZUlkLCBjb3VudF0gb2YgT2JqZWN0LmVudHJpZXMoY2hlY2twb2ludC52aXNpdENvdW50cykpIHtcbiAgICAgIHZpc2l0Q291bnRzLnNldChzdGFnZUlkLCBjb3VudCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRmlyZSB0aGUgZXhlY3V0b3ItbWFkZSBgb25SZXN1bWVgIG9uIGV2ZXJ5IHJlY29yZGVyIChmbG93ICsgc2NvcGUpLCBzdGFtcGVkXG4gKiB3aXRoIHRoZSByZXN1bWVkIGxlZydzIE5FVyBydW5JZCDigJQgY29uc3VtZXJzIGRldGVjdCBcImEgZnJlc2ggbG9naWNhbCBydW5cIlxuICogYnkgdGhlIHNhbWUgcnVuSWQgY2hhbmdlIHRoZXkgdXNlIGZvciBgb25SdW5TdGFydGAuIFRoZSBzdGFtcCBpcyBidWlsdCBieVxuICogdGhlIG9uZSBjb25zdHJ1Y3RvciAoYGVuZ2luZS90cmF2ZXJzYWxDb250ZXh0LnRzYCk6IGl0IG5hbWVzIHRoZSBSRUFMXG4gKiBzdWJmbG93IHRoZSBzdGFuZC1pbiBydW5zIGluIGFuZCBpdHMgZGVwdGgsIGFuZCBMSU5LUyB0byB0aGUgcGF1c2VkXG4gKiBleGVjdXRpb24gKGByZXN1bWVkRnJvbWAsIHJlYWQgb2ZmIGBjaGVja3BvaW50LnBhdXNlZEV4ZWN1dGlvbmApIOKAlCA5LjM3LjAuXG4gKlxuICogVGhlIHJ1bnRpbWVTdGFnZUlkIGlzIHRoZSBTVEFORC1JTidzIG93bjogaXQgcnVucyBhZnRlciBvbmUgbW91bnQgcGVyXG4gKiBzdWJmbG93IG9uIHRoZSBwYXRoIChlYWNoIGVudGVyZWQgYXQgaXRzIG1vdW50KSwgc28gaXRzIGV4ZWN1dGlvbiBpbmRleCBpc1xuICogdGhlIGNvdW50ZXIgcGx1cyB0aGUgcGF0aCdzIGxlbmd0aCDigJQgdGhlIGV2ZW50IGFuZCB0aGUgc3RhbmQtaW4ncyBjb21taXRcbiAqIG5hbWUgdGhlIHNhbWUgZXhlY3V0aW9uLiBUaGUgb25lIHNoYXBlIHdoZXJlIHRoZSBpbmRleCBjYW5ub3QgYmUga25vd24gdXBcbiAqIGZyb250IOKAlCBhIGRlZ3JhZGVkIGNoZWNrcG9pbnQgbWlzc2luZyBhbiBPVVRFUiBzdWJmbG93J3MgY2FwdHVyZSwgd2hvc2VcbiAqIG9wZW5pbmcgc3RhZ2VzIHRoZW4gcmUtcnVuIOKAlCBuYW1lcyB0aGUgcGxhbm5lZCBwb3NpdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFubm91bmNlUmVzdW1lPFRPdXQsIFRTY29wZT4oXG4gIHBsYW46IFJlc3VtZVBsYW48VE91dCwgVFNjb3BlPixcbiAgcmVzdW1lSW5wdXQ6IHVua25vd24sXG4gIHJ1bjogeyByZWFkb25seSBydW5JZDogc3RyaW5nOyByZWFkb25seSBleGVjdXRpb25Db3VudDogbnVtYmVyOyByZWFkb25seSBvYnNlcnZlcnM6IFJ1bk9ic2VydmVycyB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IHsgY2hlY2twb2ludCwgcGF1c2VkTm9kZSwgZW50cnkgfSA9IHBsYW47XG4gIGNvbnN0IHsgb2JzZXJ2ZXJzIH0gPSBydW47XG4gIGNvbnN0IGhhc0lucHV0ID0gcmVzdW1lSW5wdXQgIT09IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RlcHNCZWZvcmVTdGFuZEluID0gZW50cnkuc3RlcHNCZWZvcmVTdGFuZEluID8/IGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgubGVuZ3RoO1xuICBjb25zdCByZXN1bWVSdW50aW1lU3RhZ2VJZCA9IGJ1aWxkUnVudGltZVN0YWdlSWQocGF1c2VkTm9kZS5pZCwgcnVuLmV4ZWN1dGlvbkNvdW50ICsgc3RlcHNCZWZvcmVTdGFuZEluKTtcbiAgY29uc3QgcmVzdW1lZEZyb20gPSByZXN1bWVMaW5rT2YoY2hlY2twb2ludCk7XG4gIGNvbnN0IGZsb3dSZXN1bWVFdmVudCA9IHtcbiAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgIGhhc0lucHV0LFxuICAgIHRyYXZlcnNhbENvbnRleHQ6IHJlc3VtZVRyYXZlcnNhbENvbnRleHQoe1xuICAgICAgcnVuSWQ6IHJ1bi5ydW5JZCxcbiAgICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiByZXN1bWVSdW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiBjaGVja3BvaW50LnN1YmZsb3dQYXRoLFxuICAgICAgcmVzdW1lZEZyb20sXG4gICAgfSksXG4gICAgY2hhbm5lbDogJ2Zsb3cnIGFzIGNvbnN0LFxuICB9O1xuICAvLyBFeGVjdXRvci1tYWRlIChgSE9PS1Mub25SZXN1bWUuZXhlY3V0b3JNYWRlYCk6IGZpcmVkIHRocm91Z2ggdGhlIHNhbWUgYGZpcmVgIGxvb3AgYXMgZXZlcnlcbiAgLy8gZW5naW5lIGV2ZW50LCBzbyBhIHRocm93aW5nIHJlY29yZGVyIGlzIGlzb2xhdGVkIGluc3RlYWQgb2YgcmVqZWN0aW5nIGByZXN1bWUoKWAgKFIxMCkuXG4gIGZpcmUob2JzZXJ2ZXJzLmlubGluZUZsb3dMaXN0ZW5lcnMoKSwgJ29uUmVzdW1lJywgZmxvd1Jlc3VtZUV2ZW50LCBSRVNVTUVfRkxPV19GQUlMVVJFKTtcblxuICBjb25zdCBzY29wZVJlc3VtZUV2ZW50ID0ge1xuICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgcnVudGltZVN0YWdlSWQ6IHJlc3VtZVJ1bnRpbWVTdGFnZUlkLFxuICAgIGhhc0lucHV0LFxuICAgIC4uLihyZXN1bWVkRnJvbSAmJiB7IHJlc3VtZWRGcm9tIH0pLFxuICAgIHBpcGVsaW5lSWQ6ICcnLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICBjaGFubmVsOiAnc2NvcGUnIGFzIGNvbnN0LFxuICB9O1xuICBmaXJlKG9ic2VydmVycy5zY29wZVJlY29yZGVycywgJ29uUmVzdW1lJywgc2NvcGVSZXN1bWVFdmVudCwgKGVycm9yLCBfcmVjb3JkZXIsIGhvb2spID0+XG4gICAgLy8gVGhlIHNjb3BlIGNoYW5uZWwncyBwb2xpY3kgKGFzIGBTY29wZUZhY2FkZWAgcm91dGVzIGEgc3RhZ2UncyBob29rIGZhaWx1cmUpOiB0aGUgdGhyb3dcbiAgICAvLyBiZWNvbWVzIGFuIGBvbkVycm9yYCBvbiBldmVyeSBzY29wZSByZWNvcmRlciwgd2hvc2Ugb3duIHRocm93IGlzIGRyb3BwZWQuXG4gICAgZmlyZShvYnNlcnZlcnMuc2NvcGVSZWNvcmRlcnMsICdvbkVycm9yJywgcmVjb3JkZXJGYWlsdXJlRXZlbnQoc2NvcGVSZXN1bWVFdmVudCwgZXJyb3IsIGhvb2spKSxcbiAgKTtcblxuICAvLyBEZWZlcnJlZCB0aWVyIChSRkMtMDAxKTogdGhlc2UgZXhlY3V0b3Itc3ludGhlc2l6ZWQgb25SZXN1bWUgZXZlbnRzXG4gIC8vIGJ5cGFzcyB0aGUgcGVyLXN0YWdlIGRpc3BhdGNoIHNpdGVzLCBzbyBjYXB0dXJlIHRoZW0gZGlyZWN0bHkuXG4gIGlmIChvYnNlcnZlcnMuZGVmZXJyZWRUaWVyKSB7XG4gICAgb2JzZXJ2ZXJzLmRlZmVycmVkVGllci5jYXB0dXJlKCdmbG93JywgJ29uUmVzdW1lJywgcmVzdW1lUnVudGltZVN0YWdlSWQsIHJ1bi5ydW5JZCwgZmxvd1Jlc3VtZUV2ZW50KTtcbiAgICBvYnNlcnZlcnMuZGVmZXJyZWRUaWVyLmNhcHR1cmUoXG4gICAgICAnc2NvcGUnLFxuICAgICAgJ29uUmVzdW1lJyxcbiAgICAgIHNjb3BlUmVzdW1lRXZlbnQucnVudGltZVN0YWdlSWQsXG4gICAgICBzY29wZVJlc3VtZUV2ZW50LnBpcGVsaW5lSWQsXG4gICAgICBzY29wZVJlc3VtZUV2ZW50LFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcmVzdW1lIGhhbGYg4oCUIHdoYXQgdGhlIHBhdXNlZCBzdGFnZSdzIHN0YW5kLWluIHJ1bnMuIGBpbnRlcnJ1cHQoKWA6XG4gKiB0aGUgc3RhZ2UncyBvd24gZnVuY3Rpb24sIHdpdGggdGhlIGFuc3dlciBkZXBvc2l0ZWQgZm9yIFRISVMgc2NvcGUgZmlyc3RcbiAqIChrZXllZCBieSBzY29wZSBpZGVudGl0eSDigJQgc2FmZSB3aGVuIHNldmVyYWwgYnJhbmNoZXMgcmVzdW1lIGF0IG9uY2UpLlxuICogYGFkZFBhdXNhYmxlRnVuY3Rpb25gOiB0aGUgZGVjbGFyZWQgYHJlc3VtZUZuKHNjb3BlLCBpbnB1dClgLCB3cmFwcGVkIHRvXG4gKiB0aGUgYFN0YWdlRnVuY3Rpb25gIHNoYXBlLlxuICovXG5mdW5jdGlvbiByZXN1bWVIYWxmT2Y8VE91dCwgVFNjb3BlPihcbiAgZmM6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICBwYXVzZWROb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgaXNJbnRlcnJ1cHRSZXN1bWU6IGJvb2xlYW4sXG4gIHJlc3VtZUlucHV0OiB1bmtub3duLFxuKTogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHtcbiAgaWYgKGlzSW50ZXJydXB0UmVzdW1lKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxGbiA9IHBhdXNlZE5vZGUuZm4gPz8gZmMuc3RhZ2VNYXAuZ2V0KHBhdXNlZE5vZGUuaWQpID8/IGZjLnN0YWdlTWFwLmdldChwYXVzZWROb2RlLm5hbWUpO1xuICAgIGlmICghb3JpZ2luYWxGbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7cGF1c2VkTm9kZS5uYW1lfScgKCR7cGF1c2VkTm9kZS5pZH0pIHBhdXNlZCB2aWEgaW50ZXJydXB0KCkgYnV0IGl0cyBgICtcbiAgICAgICAgICAnc3RhZ2UgZnVuY3Rpb24gaXMgbm8gbG9uZ2VyIGluIHRoZSBjaGFydC4gVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgJyArXG4gICAgICAgICAgJ3dhcyBjcmVhdGVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKHNjb3BlLCBicmVha0ZuLCBzdHJlYW1DYWxsYmFjaykgPT4ge1xuICAgICAgcHJvdmlkZUludGVycnVwdEFuc3dlcihzY29wZSwgcmVzdW1lSW5wdXQpO1xuICAgICAgcmV0dXJuIG9yaWdpbmFsRm4oc2NvcGUsIGJyZWFrRm4sIHN0cmVhbUNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG4gIGNvbnN0IHJlc3VtZUZuID0gcGF1c2VkTm9kZS5yZXN1bWVGbiE7XG4gIHJldHVybiAoc2NvcGU6IFRTY29wZSkgPT4ge1xuICAgIHJldHVybiByZXN1bWVGbihzY29wZSwgcmVzdW1lSW5wdXQpIGFzIFRPdXQgfCBQcm9taXNlPFRPdXQ+O1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiBmb3IgYSByZXN1bWU6IHRoZSBzdGFnZSdzIE9XTiBub2RlIOKAlCBzbyBpdCBrZWVwc1xuICogaXRzIHNoYXBlIChhIGRlY2lkZXIncyBvciBzZWxlY3RvcidzIGJyYW5jaGVzLCBhIGZvcmsgcGFyZW50J3MgY2hpbGRyZW4sXG4gKiBpdHMgYG5leHRgKSBhbmQgaXRzIG5hbWUsIGRlc2NyaXB0aW9uIGFuZCBkZWNsYXJlZCB0YWdzIOKAlCB3aXRoIGBmbmAgc3dhcHBlZFxuICogZm9yIHRoZSByZXN1bWUgaGFsZi5cbiAqXG4gKiBEcm9wcGVkOiBgcmVzdW1lRm5gIGFuZCBgaXNQYXVzYWJsZWAgKHRoZSByZXN1bWUgaGFsZiBtdXN0IG5vdCBwYXVzZVxuICogYmVjYXVzZSBpdCByZXR1cm5lZCBhIHZhbHVlIOKAlCB0aGUgb3JpZ2luYWwgcGF1c2FibGUgY29udHJhY3QpOyBhbmQsIG9uIHRoZVxuICogYGFkZFBhdXNhYmxlRnVuY3Rpb25gIHJlLWVudHJ5LCB0aGUgcG9saWNpZXMgZGVjbGFyZWQgZm9yIHRoZSBzdGFnZSdzIE9XTlxuICogZnVuY3Rpb24gKGByZXRyeWAsIHN0cmVhbWluZykg4oCUIHRoYXQgcmUtZW50cnkgcnVucyBhIGRpZmZlcmVudCBmdW5jdGlvblxuICogKGByZXN1bWVGbmApIHVuZGVyIGEgZGlmZmVyZW50IGNvbnRyYWN0LiBUaGUgYGludGVycnVwdCgpYCByZS1lbnRyeSByZS1ydW5zXG4gKiB0aGUgc3RhZ2UncyBvd24gZnVuY3Rpb24sIHNvIGl0IGtlZXBzIHRoZW0uXG4gKlxuICogVGFncyBmb2xsb3cgdGhlIHN0YWdlIG9uIEJPVEggcmUtZW50cmllcyAoOS4yMS4wKTogYSB0YWcgaXMgdGhlIHN0YWdlJ3NcbiAqIE5BTUUsIG5vdCBhIHBvbGljeSBvdmVyIGl0cyBmdW5jdGlvbiwgYW5kIHRoZSByZXN1bWVkIGV4ZWN1dGlvbiBpcyB0aGF0XG4gKiBzdGFnZSBydW5uaW5nIGFnYWluIOKAlCBpdHMgYnVuZGxlIG11c3QgY2FycnkgaXQsIG9yIGEgY2hhaW5lZCBheGlzIHdvdWxkXG4gKiBzaG93IHRoZSBwYXVzZWQgbGVnIHRhZ2dlZCBhbmQgdGhlIHJlc3VtZWQgbGVnIHNpbGVudGx5IG5vdC5cbiAqL1xuZnVuY3Rpb24gc3RhbmRJbkZvcjxUT3V0LCBUU2NvcGU+KFxuICBwYXVzZWROb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgaXNJbnRlcnJ1cHRSZXN1bWU6IGJvb2xlYW4sXG4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gIGNvbnN0IHN0YW5kSW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5wYXVzZWROb2RlLCBmbiB9O1xuICBkZWxldGUgc3RhbmRJbi5yZXN1bWVGbjtcbiAgZGVsZXRlIHN0YW5kSW4uaXNQYXVzYWJsZTtcbiAgaWYgKCFpc0ludGVycnVwdFJlc3VtZSkge1xuICAgIGRlbGV0ZSBzdGFuZEluLnJldHJ5O1xuICAgIGRlbGV0ZSBzdGFuZEluLmlzU3RyZWFtaW5nO1xuICAgIGRlbGV0ZSBzdGFuZEluLnN0cmVhbUlkO1xuICB9XG4gIHJldHVybiBzdGFuZEluO1xufVxuXG4vKipcbiAqIFRoZSByZXN1bWUgZXZlbnQncyBsaW5rLCByZWFkIG9mZiB0aGUgY2hlY2twb2ludCBpdHNlbGYg4oCUIHNvIGEgcmVzdW1lIHJlY29yZHNcbiAqIHRoZSBzYW1lIHdoZXJldmVyIGl0cyBjaGVja3BvaW50IGNhbWUgZnJvbS4gYHVuZGVmaW5lZGAgZm9yIGEgY2hlY2twb2ludFxuICogd2l0aG91dCBgcGF1c2VkRXhlY3V0aW9uYCAobWFkZSBiZWZvcmUgOS4zNy4wKSBvciB3aXRoIGEgbWFsZm9ybWVkIG9uZTogdGhlXG4gKiBsaW5rIGlzIGEgcmVjb3JkLCBuZXZlciB1c2VkIHRvIHBsYW4gdGhlIHJlLWVudHJ5LCBzbyBpdCBpcyBsZWZ0IG91dCByYXRoZXJcbiAqIHRoYW4gZ3Vlc3NlZC5cbiAqL1xuZnVuY3Rpb24gcmVzdW1lTGlua09mKGNoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQpOiBSZXN1bWVMaW5rIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGF1c2VkOiB1bmtub3duID0gY2hlY2twb2ludC5wYXVzZWRFeGVjdXRpb247XG4gIHJldHVybiBpc1BhdXNlZEV4ZWN1dGlvbihwYXVzZWQpID8geyBydW5JZDogcGF1c2VkLnJ1bklkLCBydW50aW1lU3RhZ2VJZDogcGF1c2VkLnJ1bnRpbWVTdGFnZUlkIH0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRmluZCBhIFN0YWdlTm9kZSBpbiB0aGUgY29tcGlsZWQgZ3JhcGggYnkgSUQsIGRyaWxsaW5nIGludG8gcmVnaXN0ZXJlZFxuICogc3ViZmxvd3MgYWxvbmcgYHN1YmZsb3dQYXRoYCBhbmQgc2VhcmNoaW5nIGZyb20gdGhlIGxhc3Qgc3ViZmxvdydzIHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGZpbmROb2RlSW5HcmFwaDxUT3V0LCBUU2NvcGU+KFxuICBmYzogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gIHN0YWdlSWQ6IHN0cmluZyxcbiAgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICBpZiAoc3ViZmxvd1BhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gZGZzRmluZChmYy5yb290LCBzdGFnZUlkKTtcbiAgbGV0IHN1YmZsb3dSb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBzZklkIG9mIHN1YmZsb3dQYXRoKSB7XG4gICAgY29uc3Qgc3ViZmxvdyA9IGZjLnN1YmZsb3dzPy5bc2ZJZF07XG4gICAgaWYgKCFzdWJmbG93KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHN1YmZsb3dSb290ID0gc3ViZmxvdy5yb290O1xuICB9XG4gIGlmICghc3ViZmxvd1Jvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBkZnNGaW5kKHN1YmZsb3dSb290LCBzdGFnZUlkKTtcbn1cblxuLyoqIERGUyBzZWFyY2ggZm9yIGEgbm9kZSBieSBJRCBpbiB0aGUgU3RhZ2VOb2RlIGdyYXBoLiBDeWNsZS1zYWZlIHZpYSB2aXNpdGVkIHNldC4gKi9cbmZ1bmN0aW9uIGRmc0ZpbmQ8VE91dCwgVFNjb3BlPihcbiAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIHRhcmdldElkOiBzdHJpbmcsXG4gIHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKSxcbik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgLy8gU2tpcCBsb29wIGJhY2stZWRnZSByZWZlcmVuY2VzICh0aGV5IHNoYXJlIHRoZSB0YXJnZXQncyBJRCBidXQgaGF2ZSBubyBmbi9yZXN1bWVGbilcbiAgaWYgKG5vZGUuaXNMb29wUmVmKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmlzaXRlZC5oYXMobm9kZS5pZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHZpc2l0ZWQuYWRkKG5vZGUuaWQpO1xuICBpZiAobm9kZS5pZCA9PT0gdGFyZ2V0SWQpIHJldHVybiBub2RlO1xuICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgY29uc3QgZm91bmQgPSBkZnNGaW5kKGNoaWxkLCB0YXJnZXRJZCwgdmlzaXRlZCk7XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH1cbiAgaWYgKG5vZGUubmV4dCkgcmV0dXJuIGRmc0ZpbmQobm9kZS5uZXh0LCB0YXJnZXRJZCwgdmlzaXRlZCk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
327
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ydW5uZXIvcmVzdW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHOzs7QUFFSCx5Q0FBZ0Q7QUFFaEQsb0RBQXdFO0FBR3hFLHNFQUFnRTtBQUVoRSx1RUFBdUU7QUFFdkUsd0RBQStEO0FBQy9ELGtEQUFzRDtBQUV0RCxnREFBc0Q7QUFDdEQsbURBQWlGO0FBYWpGLG1HQUFtRztBQUNuRyxNQUFNLG1CQUFtQixHQUFHLElBQUEsd0JBQWEsRUFBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBRS9EOzs7O0dBSUc7QUFDSCxTQUFnQixVQUFVLENBQ3hCLEVBQTJCLEVBQzNCLE1BQTJCLEVBQzNCLFdBQW9CO0lBRXBCLHdFQUF3RTtJQUN4RSx1RUFBdUU7SUFDdkUsTUFBTSxVQUFVLEdBQUcsSUFBQSw0QkFBZ0IsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUU1QyxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3pGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixNQUFNLElBQUksS0FBSyxDQUNiLHlCQUF5QixVQUFVLENBQUMsYUFBYSw0QkFBNEI7WUFDM0UsOERBQThELENBQ2pFLENBQUM7SUFDSixDQUFDO0lBQ0QsMkRBQTJEO0lBQzNELEVBQUU7SUFDRix1RUFBdUU7SUFDdkUsNEVBQTRFO0lBQzVFLDBFQUEwRTtJQUMxRSw0RUFBNEU7SUFDNUUseUVBQXlFO0lBQ3pFLDBEQUEwRDtJQUMxRCx5REFBeUQ7SUFDekQsRUFBRTtJQUNGLHNFQUFzRTtJQUN0RSw4RUFBOEU7SUFDOUUsTUFBTSxpQkFBaUIsR0FBRyxVQUFVLENBQUMsUUFBUSxLQUFLLFdBQVcsQ0FBQztJQUM5RCxJQUFJLENBQUMsVUFBVSxDQUFD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LEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEQsSUFBSSxLQUFLO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlc3VtZSDigJQgaG93IGBGbG93Q2hhcnRFeGVjdXRvci5yZXN1bWUoKWAgcGxhbnMgYW5kIGFubm91bmNlcyBhIHJlLWVudHJ5IChGOSkuXG4gKlxuICogVGhyZWUgc3RlcHMsIGluIHRoZSBvcmRlciB0aGUgZXhlY3V0b3IgdGFrZXMgdGhlbTpcbiAqXG4gKiAgIDEuIHtAbGluayBwbGFuUmVzdW1lfSDigJQgZGVjb2RlIHRoZSBjaGVja3BvaW50ICh0aGUgT05FIGNvZGVjLFxuICogICAgICBgcGF1c2UvcmVjb3JkLnRzYCksIGZpbmQgdGhlIHBhdXNlZCBzdGFnZSBpbiB0aGUgY2hhcnQgYXMgYnVpbHQsIGJ1aWxkXG4gKiAgICAgIHRoZSByZXN1bWUgaGFsZiBhbmQgdGhlIHBhdXNlZCBzdGFnZSdzIHN0YW5kLWluLCBhbmQgcGxhbiB0aGUgb25lLXNob3RcbiAqICAgICAgcmUtZW50cnkgKGBSZXN1bWVFbnRyeS5wbGFuYCkuIEV2ZXJ5IHJlZnVzYWwgaGFwcGVucyBIRVJFLCBiZWZvcmUgYW55XG4gKiAgICAgIGV4ZWN1dG9yIHN0YXRlIGlzIHRvdWNoZWQuXG4gKiAgIDIuIHtAbGluayBzZWVkQ291bnRlcnN9IOKAlCBjYXJyeSB0aGUgcGF1c2UtdGltZSBleGVjdXRpb24gY291bnRlciBhbmQgdmlzaXRcbiAqICAgICAgY291bnRzIGludG8gdGhlIHJ1bidzIHNoYXJlZCBjb3VudGVycyAobXV0YXRlZCwgbmV2ZXIgcmVwbGFjZWQpLlxuICogICAzLiB7QGxpbmsgYW5ub3VuY2VSZXN1bWV9IOKAlCBmaXJlIHRoZSBleGVjdXRvci1tYWRlIGBvblJlc3VtZWAgb24gdGhlIGZsb3dcbiAqICAgICAgYW5kIHNjb3BlIGNoYW5uZWxzIChhbmQgY2FwdHVyZSBpdCBmb3IgdGhlIGRlZmVycmVkIHRpZXIpLCBCRUZPUkUgdGhlXG4gKiAgICAgIHRyYXZlcnNhbCBzbyBpdCBwcmVjZWRlcyBgb25SdW5TdGFydGAuXG4gKlxuICogVGhlIGV4ZWN1dG9yIG93bnMgdGhlIHBlci1ydW4gc3RhdGUgYmV0d2VlbiB0aGUgc3RlcHMgKHRoZSBydW5JZCwgdGhlXG4gKiBydW50aW1lLCB0aGUgdHJhdmVyc2VyKTsgdGhpcyBtb2R1bGUgbmV2ZXIgaG9sZHMgYW55LlxuICovXG5cbmltcG9ydCB7IGJ1aWxkUnVudGltZVN0YWdlSWQgfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgeyBjYXJyaWVkVG91Y2hlcywgaW50ZXJydXB0UHJvYmxlbSB9IGZyb20gJy4uL2F0dGVtcHQvZWZmZWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUnVuQ29ycmVsYXRpb24gfSBmcm9tICcuLi9hdHRlbXB0L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0IH0gZnJvbSAnLi4vYnVpbGRlci90eXBlcy5qcyc7XG5pbXBvcnQgeyBSZXN1bWVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlc3VtZUxpbmsgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IHJlc3VtZVRyYXZlcnNhbENvbnRleHQgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsQ29udGV4dC5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlRnVuY3Rpb24sIFN0YWdlTm9kZSB9IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBwcm92aWRlSW50ZXJydXB0QW5zd2VyIH0gZnJvbSAnLi4vcGF1c2UvaW50ZXJydXB0LmpzJztcbmltcG9ydCB7IGRlY29kZUNoZWNrcG9pbnQgfSBmcm9tICcuLi9wYXVzZS9yZWNvcmQuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Y2hhcnRDaGVja3BvaW50IH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZWRFeGVjdXRpb24gfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBmaXJlLCByZWNvcmRlckZhaWx1cmVFdmVudCwgd2FybkluRGV2TW9kZSB9IGZyb20gJy4uL3JlY29yZGVyL2hvb2tzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuT2JzZXJ2ZXJzIH0gZnJvbSAnLi9hdHRhY2guanMnO1xuXG4vKiogRXZlcnl0aGluZyBhIHJlc3VtZSBkZWNpZGVkIGJlZm9yZSBhbnkgZXhlY3V0b3Igc3RhdGUgd2FzIHRvdWNoZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VtZVBsYW48VE91dCwgVFNjb3BlPiB7XG4gIC8qKiBUaGUgZGVjb2RlZCBjaGVja3BvaW50ICh1cGNhc3QgYW5kIGNoZWNrZWQpLiAqL1xuICByZWFkb25seSBjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50O1xuICAvKiogVGhlIHBhdXNlZCBzdGFnZSdzIFJFQUwgbm9kZSBpbiB0aGUgY2hhcnQuICovXG4gIHJlYWRvbmx5IHBhdXNlZE5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKiogV2hlcmUgdGhlIHJlc3VtZWQgdHJhdmVyc2FsIHN0YXJ0cywgYW5kIHdoYXQgZWFjaCBzdWJmbG93IG9uIHRoZSBwYXRoIHRha2VzIG9uIGl0cyBmaXJzdCBlbnRyeS4gKi9cbiAgcmVhZG9ubHkgZW50cnk6IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT47XG59XG5cbi8qKiBUaGUgZmxvdyBjaGFubmVsJ3MgaXNvbGF0aW9uIGZvciB0aGUgZXhlY3V0b3ItbWFkZSBgb25SZXN1bWVgIChkZXYtbW9kZSB3YXJuaW5nLCB0aGVuIHNraXApLiAqL1xuY29uc3QgUkVTVU1FX0ZMT1dfRkFJTFVSRSA9IHdhcm5JbkRldk1vZGUoJ0Zsb3dDaGFydEV4ZWN1dG9yJyk7XG5cbi8qKlxuICogUGxhbiB0aGUgcmVzdW1lIGFnYWluc3QgdGhlIGNoYXJ0IGFzIGJ1aWx0LiBUaHJvd3Mg4oCUIGxlYXZpbmcgdGhlIGV4ZWN1dG9yXG4gKiB1bnRvdWNoZWQg4oCUIHdoZW4gdGhlIGNoZWNrcG9pbnQgaXMgbWFsZm9ybWVkLCB0aGUgcGF1c2VkIHN0YWdlIGlzIGdvbmUsIGl0XG4gKiBjYW5ub3QgYmUgcmVzdW1lZCwgb3IgaXRzIHBhdGggZG9lcyBub3QgZml0IHRoaXMgY2hhcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbGFuUmVzdW1lPFRPdXQsIFRTY29wZT4oXG4gIGZjOiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgc3RvcmVkOiBGbG93Y2hhcnRDaGVja3BvaW50LFxuICByZXN1bWVJbnB1dDogdW5rbm93bixcbik6IFJlc3VtZVBsYW48VE91dCwgVFNjb3BlPiB7XG4gIC8vIERlY29kZSB0aGUgY2hlY2twb2ludCAobWF5IGNvbWUgZnJvbSB1bnRydXN0ZWQgZXh0ZXJuYWwgc3RvcmFnZSwgZnJvbVxuICAvLyBhbnkgcmVsZWFzZSkg4oCUIHRoZSBPTkUgY29kZWM6IHVwY2FzdCwgdGhlbiBjaGVjayBldmVyeSBwYXVzZSByZWNvcmQuXG4gIGNvbnN0IGNoZWNrcG9pbnQgPSBkZWNvZGVDaGVja3BvaW50KHN0b3JlZCk7XG5cbiAgY29uc3QgcGF1c2VkTm9kZSA9IGZpbmROb2RlSW5HcmFwaChmYywgY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkLCBjaGVja3BvaW50LnN1YmZsb3dQYXRoKTtcbiAgaWYgKCFwYXVzZWROb2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke2NoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZH0nIG5vdCBmb3VuZCBpbiBmbG93Y2hhcnQuIGAgK1xuICAgICAgICAnVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuJyxcbiAgICApO1xuICB9XG4gIC8vIFR3byByZS1lbnRyeSBzaGFwZXMsIGNob3NlbiBieSBIT1cgdGhlIHBhdXNlIHdhcyByYWlzZWQ6XG4gIC8vXG4gIC8vICAg4oCiIGludGVycnVwdCgpICAgICAg4oaSIFJFLVJVTiBUSEUgU1RBR0UnUyBPV04gRlVOQ1RJT04gRlJPTSBJVFMgVE9QLlxuICAvLyAgICAgU3RhZ2VzIGFyZSBhdG9taWMgKHRoZSBzYW1lIGxhdyBgcmVzdW1lT25FcnJvcmAgc3RhdGVzKTogYSBzdGFnZSB0aGF0XG4gIC8vICAgICBzdG9wcGVkIG1pZC1ib2R5IGhhcyBubyBoYWxmIHRvIHJlc3VtZSBpbnRvLCBzbyB0aGUgd2hvbGUgYm9keSBydW5zXG4gIC8vICAgICBhZ2FpbiBhbmQgdGhlIGFuc3dlciBjb21lcyBiYWNrIG91dCBvZiB0aGUgYGludGVycnVwdCgpYCBjYWxsIGl0c2VsZi5cbiAgLy8gICAgIEV2ZXJ5dGhpbmcgdGhlIGJvZHkgZGlkIGJlZm9yZSB0aGUgaW50ZXJydXB0IGlzIHJlLWRvbmUg4oCUIHdoaWNoIGlzXG4gIC8vICAgICB3aHkgdGhlIGRvY3MgdGVsbCB5b3UgdG8ga2VlcCB0aGF0IGhhbGYgaWRlbXBvdGVudC5cbiAgLy8gICDigKIgYWRkUGF1c2FibGVGdW5jdGlvbiDihpIgcnVuIHRoZSBkZWNsYXJlZCBgcmVzdW1lRm5gLlxuICAvL1xuICAvLyBUaGUgZGlzY3JpbWluYW50IGlzIG9uIHRoZSBjaGVja3BvaW50LCBzbyB0aGlzIHdvcmtzIGNyb3NzLWV4ZWN1dG9yXG4gIC8vIChhIGNoZWNrcG9pbnQgcmVzdG9yZWQgZnJvbSBSZWRpcyBvbiBhIGZyZXNoIHByb2Nlc3MgcmVzdW1lcyB0aGUgc2FtZSB3YXkpLlxuICBjb25zdCBpc0ludGVycnVwdFJlc3VtZSA9IGNoZWNrcG9pbnQucGF1c2VkQnkgPT09ICdpbnRlcnJ1cHQnO1xuICBpZiAoIXBhdXNlZE5vZGUucmVzdW1lRm4gJiYgIWlzSW50ZXJydXB0UmVzdW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke3BhdXNlZE5vZGUubmFtZX0nICgke3BhdXNlZE5vZGUuaWR9KSBoYXMgbm8gcmVzdW1lRm4uIGAgK1xuICAgICAgICAnT25seSBzdGFnZXMgY3JlYXRlZCB3aXRoIGFkZFBhdXNhYmxlRnVuY3Rpb24oKSwgb3Igc3RhZ2VzIHRoYXQgcGF1c2VkIHZpYSBpbnRlcnJ1cHQoKSwgY2FuIGJlIHJlc3VtZWQuJyxcbiAgICApO1xuICB9XG4gIC8vIEEga2V5bGVzcyB0b3VjaGluZyBzdGFnZSBpcyBuZXZlciByZS1ydW4gKFAzKSDigJQgYSBjaGVja3BvaW50IGZyb20gYW5vdGhlciB2ZXJzaW9uIG9mIHRoZSBjaGFydCBpbmNsdWRlZC5cbiAgY29uc3QgcmVydW5SZWZ1c2FsID0gaXNJbnRlcnJ1cHRSZXN1bWUgPyBpbnRlcnJ1cHRQcm9ibGVtKHBhdXNlZE5vZGUudG91Y2hlcykgOiB1bmRlZmluZWQ7XG4gIGlmIChyZXJ1blJlZnVzYWwgIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7cGF1c2VkTm9kZS5uYW1lfScgKCR7cGF1c2VkTm9kZS5pZH0pICR7cmVydW5SZWZ1c2FsfWApO1xuICB9XG4gIC8vIEEgY2FycmllZCBrZXkgaXMgYWRvcHRlZCBvbmx5IGJ5IGEgc3RhZ2UgdGhhdCBkZWNsYXJlcyBhIGtleSBydWxlIChQMyk6IGEgY2hlY2twb2ludCBtdXN0IG5vdCBoYW5kIGEga2V5IHRvIGFcbiAgLy8gc3RhZ2UgdGhhdCBtYWtlcyBub25lIOKAlCBhIGtleSByZXBsYXllZCBpbnRvIGFub3RoZXIgb3BlcmF0aW9uLiBOYW1lZCBieSBmaWVsZCwgbmV2ZXIgcXVvdGVkLlxuICBpZiAoY2hlY2twb2ludC5pZGVtcG90ZW5jeUtleSAhPT0gdW5kZWZpbmVkICYmIHBhdXNlZE5vZGUudG91Y2hlcz8uaWRlbXBvdGVuY3lLZXkgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBDYW5ub3QgcmVzdW1lOiB0aGUgY2hlY2twb2ludCBjYXJyaWVzIGFuIGlkZW1wb3RlbmN5S2V5LCBidXQgc3RhZ2UgJyR7cGF1c2VkTm9kZS5uYW1lfScgKCR7cGF1c2VkTm9kZS5pZH0pIGAgK1xuICAgICAgICAnZGVjbGFyZXMgbm8gaWRlbXBvdGVuY3kga2V5IHJ1bGUg4oCUIHRoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkLicsXG4gICAgKTtcbiAgfVxuICBjb25zdCByZXN1bWVTdGFnZUZuID0gcmVzdW1lSGFsZk9mKGZjLCBwYXVzZWROb2RlLCBpc0ludGVycnVwdFJlc3VtZSwgcmVzdW1lSW5wdXQpO1xuXG4gIC8vIFRoZSBwYXVzZWQgc3RhZ2UncyBTVEFORC1JTjogdGhlIHN0YWdlJ3MgT1dOIG5vZGUg4oCUIGlkLCBuYW1lLFxuICAvLyBkZXNjcmlwdGlvbiwgdGFncywgYW5kIGl0cyBzaGFwZSAoYSBkZWNpZGVyJ3MgYnJhbmNoZXMsIGEgc2VsZWN0b3IncywgYVxuICAvLyBmb3JrIHBhcmVudCdzIGNoaWxkcmVuLCBpdHMgYG5leHRgKSDigJQgd2l0aCBpdHMgZnVuY3Rpb24gc3dhcHBlZCBmb3IgdGhlXG4gIC8vIHJlc3VtZSBoYWxmLiBCdWlsdCBmcm9tIHRoZSB3aG9sZSBub2RlIHNvIGFuIGBpbnRlcnJ1cHQoKWAgcmFpc2VkIGluc2lkZVxuICAvLyBhIGRlY2lkZXIsIHNlbGVjdG9yIG9yIGZvcmstcGFyZW50IGZ1bmN0aW9uIERJU1BBVENIRVMgb24gcmVzdW1lLCBhcyB0aGVcbiAgLy8gc3RhZ2UgZGlkIG9uIHRoZSBydW4gKGJlZm9yZSA5LjI4LjAgb25seSBmbi9uZXh0L3RhZ3MvcmV0cnkgd2VyZSBjb3BpZWRcbiAgLy8gYW5kIHRoZSBkaXNwYXRjaCB3YXMgc2lsZW50bHkgc2tpcHBlZCkuIEl0IGlzIHdoZXJlIHRoZSByZXN1bWVkXG4gIC8vIHRyYXZlcnNhbCBzdGFydHMg4oCUIGFuZCBub3RoaW5nIGVsc2U6IGl0IGlzIG5ldmVyIGluIGEgbm9kZSBtYXAgb3IgdGhlXG4gIC8vIHN1YmZsb3cgZGljdGlvbmFyeSwgc28gYSBsb29wIGJhY2sgdG8gdGhlIHBhdXNlZCBpZCBmaW5kcyB0aGUgUkVBTFxuICAvLyBzdGFnZSwgd2hpY2ggcGF1c2VzIGFnYWluIChzZWUgUmVzdW1lRW50cnkpLiBXaGF0IHJ1bnMgYWZ0ZXIgaXQg4oCUIGl0c1xuICAvLyBvd24gYG5leHRgLCBlbHNlIGl0cyBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uIOKAlCBpcyBhdHRhY2hlZCBieVxuICAvLyBgUmVzdW1lRW50cnkucGxhbmAsIGZyb20gdGhlIGNoYXJ0LlxuICBjb25zdCBzdGFuZEluID0gc3RhbmRJbkZvcihwYXVzZWROb2RlLCByZXN1bWVTdGFnZUZuLCBpc0ludGVycnVwdFJlc3VtZSk7XG4gIC8vIEEgdG91Y2hpbmcgc3RhZ2UgcmVzdW1lcyB1bmRlciB0aGUga2V5IGl0IHBhdXNlZCB1bmRlciAoUDMpLCBjYXJyaWVkIGJ5IHRoZSBjaGVja3BvaW50IOKAlCBuZXZlciBvbmUgaXRzIHJ1bGVcbiAgLy8gd291bGQgcmVjb21wdXRlIGZyb20gdGhpcyBsZWcncyBpbnB1dCAodGhlIGlucHV0IGRvZXMgbm90IGNyb3NzIGEgcmVzdW1lKS5cbiAgLy8gVGhlIGtleSBpcyB0aGUgb3BlcmF0aW9uYWwgdmFsdWUgb25seTogc2VydmVkIHVuZGVyIHRoZSBydW4ncyBydWxlIGxpa2UgYSBrZXkgb2YgdW5rbm93biBzb3VyY2VzLlxuICBjb25zdCBjYXJyaWVkS2V5ID0gY2hlY2twb2ludC5pZGVtcG90ZW5jeUtleTtcbiAgaWYgKHN0YW5kSW4udG91Y2hlcyAmJiBjYXJyaWVkS2V5ICE9PSB1bmRlZmluZWQpIHN0YW5kSW4udG91Y2hlcyA9IGNhcnJpZWRUb3VjaGVzKHN0YW5kSW4udG91Y2hlcy5zeXN0ZW0sIGNhcnJpZWRLZXkpO1xuXG4gIC8vIFdoZXJlIHRoZSByZXN1bWUgcmUtZW50ZXJzLCBwbGFubmVkIGFnYWluc3QgdGhlIGNoYXJ0IGFzIGJ1aWx0OlxuICAvL1xuICAvLyAgIOKAoiBUT1AtTEVWRUwgUEFVU0UgKHN1YmZsb3dQYXRoIGVtcHR5KTogdGhlIHJlc3VtZWQgdHJhdmVyc2FsIHN0YXJ0c1xuICAvLyAgICAgYXQgdGhlIHN0YW5kLWluLlxuICAvLyAgIOKAoiBQQVVTRSBJTlNJREUgU1VCRkxPV1M6IGl0IHN0YXJ0cyBhdCB0aGUgbW91bnQgb2YgdGhlIGZpcnN0IHN1YmZsb3dcbiAgLy8gICAgIG9uIHRoZSBwYXRoLCBzbyB0aGUgb3V0cHV0TWFwcGVycyBhbmQgdGhlIHBhcmVudCdzIGNvbnRpbnVhdGlvblxuICAvLyAgICAgcnVuLiBFYWNoIHN1YmZsb3cgb24gdGhlIHBhdGggaXMgZW50ZXJlZCBPTkNFIHRocm91Z2ggaXRzIGhvcDogaXRzXG4gIC8vICAgICBuZXN0ZWQgcnVudGltZSBpcyBzZWVkZWQgZnJvbSBpdHMgY2FwdHVyZSAoaW4gcGxhY2Ugb2YgdGhlXG4gIC8vICAgICBpbnB1dE1hcHBlcidzIHZhbHVlcykgYW5kIGl0cyB0cmF2ZXJzYWwgc3RhcnRzIGF0IHRoZSBtb3VudCBvZiB0aGVcbiAgLy8gICAgIG5leHQgc3ViZmxvdyDigJQgb3IsIGF0IHRoZSBsZWFmLCBhdCB0aGUgc3RhbmQtaW4uIEFuIG91dGVyIHN1YmZsb3cnc1xuICAvLyAgICAgc3RhZ2VzIGJlZm9yZSB0aGF0IG1vdW50IGRvIG5vdCBydW4gYWdhaW4uXG4gIC8vICAg4oCiIEFUIEVWRVJZIExFVkVMIHRoZSBlbnRyeSBjYXJyaWVzIHdoYXQgaXRzIGRpc3BhdGNoZXIgd291bGQgaGF2ZSBydW5cbiAgLy8gICAgIGFmdGVyIGl0IOKAlCBhIGRlY2lkZXIncyBgbmV4dGAsIGEgc2VsZWN0b3IncywgYSBmb3JrJ3Mgam9pbiDigJQgc28gYVxuICAvLyAgICAgc3ViZmxvdyBtb3VudGVkIGFzIGEgYnJhbmNoIG9yIGEgZm9yayBjaGlsZCBoYW5kcyBjb250cm9sIGJhY2sgdG9cbiAgLy8gICAgIGl0cyBwYXJlbnQncyBjb250aW51YXRpb24gYXQgdGhlIHBhcmVudCdzIGxldmVsLlxuICAvLyAgIOKAoiBQYXJhbGxlbCBzaWJsaW5ncyB0aGF0IHBhdXNlZCBpbiB0aGUgc2FtZSBmYW4tb3V0IHdhaXQgaW5cbiAgLy8gICAgIGBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNgOiBlYWNoIGlzIHJhaXNlZCBhZ2FpbiBpbiB0dXJuLCBhbmQgdGhlXG4gIC8vICAgICBqb2luIHJ1bnMgb25seSBvbmNlIHRoZSBsYXN0IG9uZSBpcyByZXN1bWVkLlxuICAvL1xuICAvLyBFdmVyeXRoaW5nIGVsc2Ugd2Fsa3MgdGhlIFJFQUwgY2hhcnQ6IGBmYy5yb290YCBhbmQgYGZjLnN1YmZsb3dzYCBhcmVcbiAgLy8gdW50b3VjaGVkLCBzbyBldmVyeSBsYXRlciBsb29wIHRhcmdldCBhbmQgZXZlcnkgbGF0ZXIgc3ViZmxvdyBlbnRyeVxuICAvLyAocmVhbCByb290LCBpbnB1dE1hcHBlcikgcmVzb2x2ZXMgYXMgaXQgd291bGQgb24gYSBydW4uIFJlZnVzZWQgSEVSRSDigJRcbiAgLy8gYmVmb3JlIGFueSBzdGF0ZSBpcyB0b3VjaGVkIOKAlCB3aGVuIHRoZSBjaGVja3BvaW50J3MgcGF0aCBkb2VzIG5vdCBmaXRcbiAgLy8gdGhpcyBjaGFydC5cbiAgLy9cbiAgLy8gQ2xvbmUtaW46IHRoZSBjYXB0dXJlcyBzZWVkIG5lc3RlZCBydW50aW1lcyAoc2hhbGxvdy1tZXJnZWQgaW50byBlYWNoXG4gIC8vIG5lc3RlZCBTaGFyZWRNZW1vcnkpLCBzbyB3aXRob3V0IGEgY29weSB0aGUgZW5naW5lIHdvdWxkIGhvbGQgbGl2ZVxuICAvLyByZWZlcmVuY2VzIGludG8gdGhlIGNhbGxlcidzIGNoZWNrcG9pbnQgb2JqZWN0IOKAlCBjYWxsZXIgbXV0YXRpb25zIHdvdWxkXG4gIC8vIGJsZWVkIGludG8gdGhlIHJlc3VtZWQgcnVuIGFuZCBlbmdpbmUgd3JpdGVzIHdvdWxkIHJlYWNoIGEgY2hlY2twb2ludFxuICAvLyB0aGUgY2FsbGVyIG1heSBoYXZlIGFscmVhZHkgcGVyc2lzdGVkLiBUaGUgc2FtZSBmb3IgdGhlIHdhaXRpbmdcbiAgLy8gc2libGluZ3MnIGNhcHR1cmVzLlxuICBjb25zdCBlbnRyeSA9IFJlc3VtZUVudHJ5LnBsYW48VE91dCwgVFNjb3BlPih7XG4gICAgcm9vdDogZmMucm9vdCxcbiAgICBzdWJmbG93czogZmMuc3ViZmxvd3MsXG4gICAgcGF0aDogY2hlY2twb2ludC5zdWJmbG93UGF0aCxcbiAgICBjYXB0dXJlczogc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQuc3ViZmxvd1N0YXRlcyksXG4gICAgc3RhbmRJbixcbiAgICAuLi4oY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzICE9PSB1bmRlZmluZWQgJiYgeyBwZW5kaW5nUGF1c2VzOiBzdHJ1Y3R1cmVkQ2xvbmUoY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzKSB9KSxcbiAgfSk7XG4gIHJldHVybiB7IGNoZWNrcG9pbnQsIHBhdXNlZE5vZGUsIGVudHJ5IH07XG59XG5cbi8qKlxuICogU2VlZCB0aGUgcnVuJ3Mgc2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyICsgcGVyLXN0YWdlIHZpc2l0IGNvdW50cyBmcm9tIHRoZVxuICogY2hlY2twb2ludCwgc28gcnVudGltZVN0YWdlSWRzIHN0YXkgdW5pcXVlIGFuZCBsb29wSXRlcmF0aW9uIG1vbm90b25pY1xuICogYWNyb3NzIGEgQ1JPU1MtZXhlY3V0b3IgcmVzdW1lIChhIGZyZXNoIGV4ZWN1dG9yIHN0YXJ0cyBib3RoIGF0IDAvZW1wdHkpLlxuICpcbiAqIE1VVEFURSwgbmV2ZXIgUkVQTEFDRTogYm90aCBhcmUgc2hhcmVkIGJ5IHJlZmVyZW5jZSBpbnRvIHRoZSB0cmF2ZXJzZXJcbiAqIChhbmQsIHRyYW5zaXRpdmVseSwgZXZlcnkgc3ViZmxvdyB0cmF2ZXJzZXIpLiBCb3RoIGZpZWxkcyBhcmUgb3B0aW9uYWwgb25cbiAqIHRoZSBjaGVja3BvaW50IChvbGRlciBwZXJzaXN0ZWQgY2hlY2twb2ludHMgb21pdCB0aGVtKSDigJQgc2VlZGluZyBpcyBza2lwcGVkXG4gKiB3aGVuIGFic2VudC4gU2FtZS1leGVjdXRvciByZXN1bWUgaXMgaWRlbXBvdGVudDogYXQgcGF1c2UgdGhlIHZhbHVlc1xuICogYWxyZWFkeSBlcXVhbCB0aGUgY2hlY2twb2ludCdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VlZENvdW50ZXJzKFxuICBjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50LFxuICBleGVjdXRpb25Db3VudGVyOiB7IHZhbHVlOiBudW1iZXIgfSxcbiAgdmlzaXRDb3VudHM6IE1hcDxzdHJpbmcsIG51bWJlcj4sXG4pOiB2b2lkIHtcbiAgaWYgKGNoZWNrcG9pbnQuZXhlY3V0aW9uQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZWN1dGlvbkNvdW50ZXIudmFsdWUgPSBjaGVja3BvaW50LmV4ZWN1dGlvbkNvdW50O1xuICB9XG4gIGlmIChjaGVja3BvaW50LnZpc2l0Q291bnRzKSB7XG4gICAgdmlzaXRDb3VudHMuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IFtzdGFnZUlkLCBjb3VudF0gb2YgT2JqZWN0LmVudHJpZXMoY2hlY2twb2ludC52aXNpdENvdW50cykpIHtcbiAgICAgIHZpc2l0Q291bnRzLnNldChzdGFnZUlkLCBjb3VudCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRmlyZSB0aGUgZXhlY3V0b3ItbWFkZSBgb25SZXN1bWVgIG9uIGV2ZXJ5IHJlY29yZGVyIChmbG93ICsgc2NvcGUpLCBzdGFtcGVkXG4gKiB3aXRoIHRoZSByZXN1bWVkIGxlZydzIE5FVyBydW5JZCDigJQgY29uc3VtZXJzIGRldGVjdCBcImEgZnJlc2ggbG9naWNhbCBydW5cIlxuICogYnkgdGhlIHNhbWUgcnVuSWQgY2hhbmdlIHRoZXkgdXNlIGZvciBgb25SdW5TdGFydGAuIFRoZSBzdGFtcCBpcyBidWlsdCBieVxuICogdGhlIG9uZSBjb25zdHJ1Y3RvciAoYGVuZ2luZS90cmF2ZXJzYWxDb250ZXh0LnRzYCk6IGl0IG5hbWVzIHRoZSBSRUFMXG4gKiBzdWJmbG93IHRoZSBzdGFuZC1pbiBydW5zIGluIGFuZCBpdHMgZGVwdGgsIGFuZCBMSU5LUyB0byB0aGUgcGF1c2VkXG4gKiBleGVjdXRpb24gKGByZXN1bWVkRnJvbWAsIHJlYWQgb2ZmIGBjaGVja3BvaW50LnBhdXNlZEV4ZWN1dGlvbmApIOKAlCA5LjM3LjAuXG4gKlxuICogVGhlIHJ1bnRpbWVTdGFnZUlkIGlzIHRoZSBTVEFORC1JTidzIG93bjogaXQgcnVucyBhZnRlciBvbmUgbW91bnQgcGVyXG4gKiBzdWJmbG93IG9uIHRoZSBwYXRoIChlYWNoIGVudGVyZWQgYXQgaXRzIG1vdW50KSwgc28gaXRzIGV4ZWN1dGlvbiBpbmRleCBpc1xuICogdGhlIGNvdW50ZXIgcGx1cyB0aGUgcGF0aCdzIGxlbmd0aCDigJQgdGhlIGV2ZW50IGFuZCB0aGUgc3RhbmQtaW4ncyBjb21taXRcbiAqIG5hbWUgdGhlIHNhbWUgZXhlY3V0aW9uLiBUaGUgb25lIHNoYXBlIHdoZXJlIHRoZSBpbmRleCBjYW5ub3QgYmUga25vd24gdXBcbiAqIGZyb250IOKAlCBhIGRlZ3JhZGVkIGNoZWNrcG9pbnQgbWlzc2luZyBhbiBPVVRFUiBzdWJmbG93J3MgY2FwdHVyZSwgd2hvc2VcbiAqIG9wZW5pbmcgc3RhZ2VzIHRoZW4gcmUtcnVuIOKAlCBuYW1lcyB0aGUgcGxhbm5lZCBwb3NpdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFubm91bmNlUmVzdW1lPFRPdXQsIFRTY29wZT4oXG4gIHBsYW46IFJlc3VtZVBsYW48VE91dCwgVFNjb3BlPixcbiAgcmVzdW1lSW5wdXQ6IHVua25vd24sXG4gIHJ1bjoge1xuICAgIHJlYWRvbmx5IHJ1bklkOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZXhlY3V0aW9uQ291bnQ6IG51bWJlcjtcbiAgICByZWFkb25seSBvYnNlcnZlcnM6IFJ1bk9ic2VydmVycztcbiAgICAvKiogVGhlIFJFU1VNRUQgbGVnJ3MgY29ycmVsYXRpb24gKGZyb20gYHJlc3VtZSgpYCdzIGVudikg4oCUIG9uIGJvdGggZXZlbnRzLCBsaWtlIGV2ZXJ5IGV2ZW50IG9mIHRoZSBsZWcuICovXG4gICAgcmVhZG9ubHkgY29ycmVsYXRpb24/OiBSdW5Db3JyZWxhdGlvbjtcbiAgfSxcbik6IHZvaWQge1xuICBjb25zdCB7IGNoZWNrcG9pbnQsIHBhdXNlZE5vZGUsIGVudHJ5IH0gPSBwbGFuO1xuICBjb25zdCB7IG9ic2VydmVycywgY29ycmVsYXRpb24gfSA9IHJ1bjtcbiAgY29uc3QgaGFzSW5wdXQgPSByZXN1bWVJbnB1dCAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBzdGVwc0JlZm9yZVN0YW5kSW4gPSBlbnRyeS5zdGVwc0JlZm9yZVN0YW5kSW4gPz8gY2hlY2twb2ludC5zdWJmbG93UGF0aC5sZW5ndGg7XG4gIGNvbnN0IHJlc3VtZVJ1bnRpbWVTdGFnZUlkID0gYnVpbGRSdW50aW1lU3RhZ2VJZChwYXVzZWROb2RlLmlkLCBydW4uZXhlY3V0aW9uQ291bnQgKyBzdGVwc0JlZm9yZVN0YW5kSW4pO1xuICBjb25zdCByZXN1bWVkRnJvbSA9IHJlc3VtZUxpbmtPZihjaGVja3BvaW50KTtcbiAgY29uc3QgZmxvd1Jlc3VtZUV2ZW50ID0ge1xuICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgaGFzSW5wdXQsXG4gICAgdHJhdmVyc2FsQ29udGV4dDogcmVzdW1lVHJhdmVyc2FsQ29udGV4dCh7XG4gICAgICBydW5JZDogcnVuLnJ1bklkLFxuICAgICAgc3RhZ2VJZDogcGF1c2VkTm9kZS5pZCxcbiAgICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IHJlc3VtZVJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc3ViZmxvd1BhdGg6IGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgsXG4gICAgICByZXN1bWVkRnJvbSxcbiAgICAgIGNvcnJlbGF0aW9uLFxuICAgIH0pLFxuICAgIGNoYW5uZWw6ICdmbG93JyBhcyBjb25zdCxcbiAgfTtcbiAgLy8gRXhlY3V0b3ItbWFkZSAoYEhPT0tTLm9uUmVzdW1lLmV4ZWN1dG9yTWFkZWApOiBmaXJlZCB0aHJvdWdoIHRoZSBzYW1lIGBmaXJlYCBsb29wIGFzIGV2ZXJ5XG4gIC8vIGVuZ2luZSBldmVudCwgc28gYSB0aHJvd2luZyByZWNvcmRlciBpcyBpc29sYXRlZCBpbnN0ZWFkIG9mIHJlamVjdGluZyBgcmVzdW1lKClgIChSMTApLlxuICBmaXJlKG9ic2VydmVycy5pbmxpbmVGbG93TGlzdGVuZXJzKCksICdvblJlc3VtZScsIGZsb3dSZXN1bWVFdmVudCwgUkVTVU1FX0ZMT1dfRkFJTFVSRSk7XG5cbiAgY29uc3Qgc2NvcGVSZXN1bWVFdmVudCA9IHtcbiAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgIHJ1bnRpbWVTdGFnZUlkOiByZXN1bWVSdW50aW1lU3RhZ2VJZCxcbiAgICBoYXNJbnB1dCxcbiAgICAuLi4ocmVzdW1lZEZyb20gJiYgeyByZXN1bWVkRnJvbSB9KSxcbiAgICBwaXBlbGluZUlkOiAnJyxcbiAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgICAuLi4oY29ycmVsYXRpb24gJiYgeyBjb3JyZWxhdGlvbiB9KSxcbiAgfTtcbiAgZmlyZShvYnNlcnZlcnMuc2NvcGVSZWNvcmRlcnMsICdvblJlc3VtZScsIHNjb3BlUmVzdW1lRXZlbnQsIChlcnJvciwgX3JlY29yZGVyLCBob29rKSA9PlxuICAgIC8vIFRoZSBzY29wZSBjaGFubmVsJ3MgcG9saWN5IChhcyBgU2NvcGVGYWNhZGVgIHJvdXRlcyBhIHN0YWdlJ3MgaG9vayBmYWlsdXJlKTogdGhlIHRocm93XG4gICAgLy8gYmVjb21lcyBhbiBgb25FcnJvcmAgb24gZXZlcnkgc2NvcGUgcmVjb3JkZXIsIHdob3NlIG93biB0aHJvdyBpcyBkcm9wcGVkLlxuICAgIGZpcmUob2JzZXJ2ZXJzLnNjb3BlUmVjb3JkZXJzLCAnb25FcnJvcicsIHJlY29yZGVyRmFpbHVyZUV2ZW50KHNjb3BlUmVzdW1lRXZlbnQsIGVycm9yLCBob29rKSksXG4gICk7XG5cbiAgLy8gRGVmZXJyZWQgdGllciAoUkZDLTAwMSk6IHRoZXNlIGV4ZWN1dG9yLXN5bnRoZXNpemVkIG9uUmVzdW1lIGV2ZW50c1xuICAvLyBieXBhc3MgdGhlIHBlci1zdGFnZSBkaXNwYXRjaCBzaXRlcywgc28gY2FwdHVyZSB0aGVtIGRpcmVjdGx5LlxuICBpZiAob2JzZXJ2ZXJzLmRlZmVycmVkVGllcikge1xuICAgIG9ic2VydmVycy5kZWZlcnJlZFRpZXIuY2FwdHVyZSgnZmxvdycsICdvblJlc3VtZScsIHJlc3VtZVJ1bnRpbWVTdGFnZUlkLCBydW4ucnVuSWQsIGZsb3dSZXN1bWVFdmVudCk7XG4gICAgb2JzZXJ2ZXJzLmRlZmVycmVkVGllci5jYXB0dXJlKFxuICAgICAgJ3Njb3BlJyxcbiAgICAgICdvblJlc3VtZScsXG4gICAgICBzY29wZVJlc3VtZUV2ZW50LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc2NvcGVSZXN1bWVFdmVudC5waXBlbGluZUlkLFxuICAgICAgc2NvcGVSZXN1bWVFdmVudCxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogVGhlIHJlc3VtZSBoYWxmIOKAlCB3aGF0IHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiBydW5zLiBgaW50ZXJydXB0KClgOlxuICogdGhlIHN0YWdlJ3Mgb3duIGZ1bmN0aW9uLCB3aXRoIHRoZSBhbnN3ZXIgZGVwb3NpdGVkIGZvciBUSElTIHNjb3BlIGZpcnN0XG4gKiAoa2V5ZWQgYnkgc2NvcGUgaWRlbnRpdHkg4oCUIHNhZmUgd2hlbiBzZXZlcmFsIGJyYW5jaGVzIHJlc3VtZSBhdCBvbmNlKS5cbiAqIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYDogdGhlIGRlY2xhcmVkIGByZXN1bWVGbihzY29wZSwgaW5wdXQpYCwgd3JhcHBlZCB0b1xuICogdGhlIGBTdGFnZUZ1bmN0aW9uYCBzaGFwZS5cbiAqL1xuZnVuY3Rpb24gcmVzdW1lSGFsZk9mPFRPdXQsIFRTY29wZT4oXG4gIGZjOiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgcGF1c2VkTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIGlzSW50ZXJydXB0UmVzdW1lOiBib29sZWFuLFxuICByZXN1bWVJbnB1dDogdW5rbm93bixcbik6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB7XG4gIGlmIChpc0ludGVycnVwdFJlc3VtZSkge1xuICAgIGNvbnN0IG9yaWdpbmFsRm4gPSBwYXVzZWROb2RlLmZuID8/IGZjLnN0YWdlTWFwLmdldChwYXVzZWROb2RlLmlkKSA/PyBmYy5zdGFnZU1hcC5nZXQocGF1c2VkTm9kZS5uYW1lKTtcbiAgICBpZiAoIW9yaWdpbmFsRm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke3BhdXNlZE5vZGUubmFtZX0nICgke3BhdXNlZE5vZGUuaWR9KSBwYXVzZWQgdmlhIGludGVycnVwdCgpIGJ1dCBpdHMgYCArXG4gICAgICAgICAgJ3N0YWdlIGZ1bmN0aW9uIGlzIG5vIGxvbmdlciBpbiB0aGUgY2hhcnQuIFRoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50ICcgK1xuICAgICAgICAgICd3YXMgY3JlYXRlZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIChzY29wZSwgYnJlYWtGbiwgc3RyZWFtQ2FsbGJhY2spID0+IHtcbiAgICAgIHByb3ZpZGVJbnRlcnJ1cHRBbnN3ZXIoc2NvcGUsIHJlc3VtZUlucHV0KTtcbiAgICAgIHJldHVybiBvcmlnaW5hbEZuKHNjb3BlLCBicmVha0ZuLCBzdHJlYW1DYWxsYmFjayk7XG4gICAgfTtcbiAgfVxuICBjb25zdCByZXN1bWVGbiA9IHBhdXNlZE5vZGUucmVzdW1lRm4hO1xuICByZXR1cm4gKHNjb3BlOiBUU2NvcGUpID0+IHtcbiAgICByZXR1cm4gcmVzdW1lRm4oc2NvcGUsIHJlc3VtZUlucHV0KSBhcyBUT3V0IHwgUHJvbWlzZTxUT3V0PjtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4gZm9yIGEgcmVzdW1lOiB0aGUgc3RhZ2UncyBPV04gbm9kZSDigJQgc28gaXQga2VlcHNcbiAqIGl0cyBzaGFwZSAoYSBkZWNpZGVyJ3Mgb3Igc2VsZWN0b3IncyBicmFuY2hlcywgYSBmb3JrIHBhcmVudCdzIGNoaWxkcmVuLFxuICogaXRzIGBuZXh0YCkgYW5kIGl0cyBuYW1lLCBkZXNjcmlwdGlvbiBhbmQgZGVjbGFyZWQgdGFncyDigJQgd2l0aCBgZm5gIHN3YXBwZWRcbiAqIGZvciB0aGUgcmVzdW1lIGhhbGYuXG4gKlxuICogRHJvcHBlZDogYHJlc3VtZUZuYCBhbmQgYGlzUGF1c2FibGVgICh0aGUgcmVzdW1lIGhhbGYgbXVzdCBub3QgcGF1c2VcbiAqIGJlY2F1c2UgaXQgcmV0dXJuZWQgYSB2YWx1ZSDigJQgdGhlIG9yaWdpbmFsIHBhdXNhYmxlIGNvbnRyYWN0KTsgYW5kLCBvbiB0aGVcbiAqIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYCByZS1lbnRyeSwgdGhlIHBvbGljaWVzIGRlY2xhcmVkIGZvciB0aGUgc3RhZ2UncyBPV05cbiAqIGZ1bmN0aW9uIChgcmV0cnlgLCBzdHJlYW1pbmcpIOKAlCB0aGF0IHJlLWVudHJ5IHJ1bnMgYSBkaWZmZXJlbnQgZnVuY3Rpb25cbiAqIChgcmVzdW1lRm5gKSB1bmRlciBhIGRpZmZlcmVudCBjb250cmFjdC4gVGhlIGBpbnRlcnJ1cHQoKWAgcmUtZW50cnkgcmUtcnVuc1xuICogdGhlIHN0YWdlJ3Mgb3duIGZ1bmN0aW9uLCBzbyBpdCBrZWVwcyB0aGVtLlxuICpcbiAqIFRhZ3MgZm9sbG93IHRoZSBzdGFnZSBvbiBCT1RIIHJlLWVudHJpZXMgKDkuMjEuMCk6IGEgdGFnIGlzIHRoZSBzdGFnZSdzXG4gKiBOQU1FLCBub3QgYSBwb2xpY3kgb3ZlciBpdHMgZnVuY3Rpb24sIGFuZCB0aGUgcmVzdW1lZCBleGVjdXRpb24gaXMgdGhhdFxuICogc3RhZ2UgcnVubmluZyBhZ2FpbiDigJQgaXRzIGJ1bmRsZSBtdXN0IGNhcnJ5IGl0LCBvciBhIGNoYWluZWQgYXhpcyB3b3VsZFxuICogc2hvdyB0aGUgcGF1c2VkIGxlZyB0YWdnZWQgYW5kIHRoZSByZXN1bWVkIGxlZyBzaWxlbnRseSBub3QuXG4gKi9cbmZ1bmN0aW9uIHN0YW5kSW5Gb3I8VE91dCwgVFNjb3BlPihcbiAgcGF1c2VkTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gIGlzSW50ZXJydXB0UmVzdW1lOiBib29sZWFuLFxuKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICBjb25zdCBzdGFuZEluOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgLi4ucGF1c2VkTm9kZSwgZm4gfTtcbiAgZGVsZXRlIHN0YW5kSW4ucmVzdW1lRm47XG4gIGRlbGV0ZSBzdGFuZEluLmlzUGF1c2FibGU7XG4gIGlmICghaXNJbnRlcnJ1cHRSZXN1bWUpIHtcbiAgICBkZWxldGUgc3RhbmRJbi5yZXRyeTtcbiAgICBkZWxldGUgc3RhbmRJbi5pc1N0cmVhbWluZztcbiAgICBkZWxldGUgc3RhbmRJbi5zdHJlYW1JZDtcbiAgfVxuICByZXR1cm4gc3RhbmRJbjtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdW1lIGV2ZW50J3MgbGluaywgcmVhZCBvZmYgdGhlIGNoZWNrcG9pbnQgaXRzZWxmIOKAlCBzbyBhIHJlc3VtZSByZWNvcmRzXG4gKiB0aGUgc2FtZSB3aGVyZXZlciBpdHMgY2hlY2twb2ludCBjYW1lIGZyb20uIGB1bmRlZmluZWRgIGZvciBhIGNoZWNrcG9pbnRcbiAqIHdpdGhvdXQgYHBhdXNlZEV4ZWN1dGlvbmAgKG1hZGUgYmVmb3JlIDkuMzcuMCkgb3Igd2l0aCBhIG1hbGZvcm1lZCBvbmU6IHRoZVxuICogbGluayBpcyBhIHJlY29yZCwgbmV2ZXIgdXNlZCB0byBwbGFuIHRoZSByZS1lbnRyeSwgc28gaXQgaXMgbGVmdCBvdXQgcmF0aGVyXG4gKiB0aGFuIGd1ZXNzZWQuXG4gKi9cbmZ1bmN0aW9uIHJlc3VtZUxpbmtPZihjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50KTogUmVzdW1lTGluayB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhdXNlZDogdW5rbm93biA9IGNoZWNrcG9pbnQucGF1c2VkRXhlY3V0aW9uO1xuICByZXR1cm4gaXNQYXVzZWRFeGVjdXRpb24ocGF1c2VkKSA/IHsgcnVuSWQ6IHBhdXNlZC5ydW5JZCwgcnVudGltZVN0YWdlSWQ6IHBhdXNlZC5ydW50aW1lU3RhZ2VJZCB9IDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZpbmQgYSBTdGFnZU5vZGUgaW4gdGhlIGNvbXBpbGVkIGdyYXBoIGJ5IElELCBkcmlsbGluZyBpbnRvIHJlZ2lzdGVyZWRcbiAqIHN1YmZsb3dzIGFsb25nIGBzdWJmbG93UGF0aGAgYW5kIHNlYXJjaGluZyBmcm9tIHRoZSBsYXN0IHN1YmZsb3cncyByb290LlxuICovXG5mdW5jdGlvbiBmaW5kTm9kZUluR3JhcGg8VE91dCwgVFNjb3BlPihcbiAgZmM6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICBzdGFnZUlkOiBzdHJpbmcsXG4gIHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHN1YmZsb3dQYXRoLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGRmc0ZpbmQoZmMucm9vdCwgc3RhZ2VJZCk7XG4gIGxldCBzdWJmbG93Um9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3Qgc2ZJZCBvZiBzdWJmbG93UGF0aCkge1xuICAgIGNvbnN0IHN1YmZsb3cgPSBmYy5zdWJmbG93cz8uW3NmSWRdO1xuICAgIGlmICghc3ViZmxvdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzdWJmbG93Um9vdCA9IHN1YmZsb3cucm9vdDtcbiAgfVxuICBpZiAoIXN1YmZsb3dSb290KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZGZzRmluZChzdWJmbG93Um9vdCwgc3RhZ2VJZCk7XG59XG5cbi8qKiBERlMgc2VhcmNoIGZvciBhIG5vZGUgYnkgSUQgaW4gdGhlIFN0YWdlTm9kZSBncmFwaC4gQ3ljbGUtc2FmZSB2aWEgdmlzaXRlZCBzZXQuICovXG5mdW5jdGlvbiBkZnNGaW5kPFRPdXQsIFRTY29wZT4oXG4gIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICB0YXJnZXRJZDogc3RyaW5nLFxuICB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCksXG4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gIC8vIFNraXAgbG9vcCBiYWNrLWVkZ2UgcmVmZXJlbmNlcyAodGhleSBzaGFyZSB0aGUgdGFyZ2V0J3MgSUQgYnV0IGhhdmUgbm8gZm4vcmVzdW1lRm4pXG4gIGlmIChub2RlLmlzTG9vcFJlZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUuaWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICB2aXNpdGVkLmFkZChub2RlLmlkKTtcbiAgaWYgKG5vZGUuaWQgPT09IHRhcmdldElkKSByZXR1cm4gbm9kZTtcbiAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gZGZzRmluZChjaGlsZCwgdGFyZ2V0SWQsIHZpc2l0ZWQpO1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICB9XG4gIGlmIChub2RlLm5leHQpIHJldHVybiBkZnNGaW5kKG5vZGUubmV4dCwgdGFyZ2V0SWQsIHZpc2l0ZWQpO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19