footprintjs 9.48.2 → 10.0.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 (326) hide show
  1. package/AGENTS.md +12 -10
  2. package/CLAUDE.md +21 -23
  3. package/README.md +1 -1
  4. package/dist/advanced.js +71 -128
  5. package/dist/esm/advanced.d.ts +24 -58
  6. package/dist/esm/advanced.js +13 -51
  7. package/dist/esm/index.d.ts +5 -8
  8. package/dist/esm/index.js +3 -3
  9. package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
  10. package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
  11. package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
  12. package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
  13. package/dist/esm/lib/capture/index.d.ts +0 -1
  14. package/dist/esm/lib/capture/index.js +1 -2
  15. package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
  16. package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  17. package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
  18. package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  19. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
  20. package/dist/esm/lib/engine/index.d.ts +1 -1
  21. package/dist/esm/lib/engine/index.js +1 -1
  22. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  23. package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  24. package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
  25. package/dist/esm/lib/engine/narrative/index.js +1 -1
  26. package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  27. package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
  28. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  29. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
  30. package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
  31. package/dist/esm/lib/engine/traversalContext.js +2 -2
  32. package/dist/esm/lib/engine/types.d.ts +2 -10
  33. package/dist/esm/lib/engine/types.js +1 -1
  34. package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
  35. package/dist/esm/lib/ids/reservedIds.js +2 -2
  36. package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
  37. package/dist/esm/lib/memory/StageContext.d.ts +2 -4
  38. package/dist/esm/lib/memory/StageContext.js +2 -2
  39. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  40. package/dist/esm/lib/memory/index.d.ts +6 -21
  41. package/dist/esm/lib/memory/index.js +4 -22
  42. package/dist/esm/lib/memory/redaction.d.ts +1 -1
  43. package/dist/esm/lib/memory/redaction.js +2 -2
  44. package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
  45. package/dist/esm/lib/memory/runPolicy.js +1 -1
  46. package/dist/esm/lib/reactive/createTypedScope.js +2 -2
  47. package/dist/esm/lib/reactive/writeTraps.js +2 -2
  48. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
  49. package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
  50. package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
  51. package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
  52. package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
  53. package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
  54. package/dist/esm/lib/recorder/qualityTrace.js +2 -2
  55. package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
  56. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
  57. package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
  58. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
  59. package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
  60. package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  61. package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
  62. package/dist/esm/lib/runner/resume.js +2 -2
  63. package/dist/esm/lib/runner/snapshot.js +3 -2
  64. package/dist/esm/lib/scope/ScopeFacade.js +2 -2
  65. package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
  66. package/dist/esm/recorders.d.ts +2 -3
  67. package/dist/esm/recorders.js +1 -1
  68. package/dist/esm/trace.d.ts +11 -57
  69. package/dist/esm/trace.js +10 -68
  70. package/dist/index.js +3 -3
  71. package/dist/lib/builder/FlowChartBuilder.js +5 -5
  72. package/dist/lib/builder/structure/StructureRecorder.js +1 -1
  73. package/dist/lib/capture/index.js +2 -4
  74. package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
  75. package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
  76. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
  77. package/dist/lib/engine/index.js +1 -1
  78. package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
  79. package/dist/lib/engine/narrative/index.js +1 -1
  80. package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
  81. package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
  82. package/dist/lib/engine/traversalContext.js +4 -4
  83. package/dist/lib/engine/types.js +1 -1
  84. package/dist/lib/engine/walkSubflowSpec.js +3 -3
  85. package/dist/lib/ids/reservedIds.js +5 -5
  86. package/dist/lib/memory/DiagnosticCollector.js +3 -3
  87. package/dist/lib/memory/StageContext.js +3 -3
  88. package/dist/lib/memory/borrowedMutation.js +3 -3
  89. package/dist/lib/memory/index.js +7 -42
  90. package/dist/lib/memory/redaction.js +3 -3
  91. package/dist/lib/memory/runPolicy.js +1 -1
  92. package/dist/lib/reactive/createTypedScope.js +3 -3
  93. package/dist/lib/reactive/writeTraps.js +4 -4
  94. package/dist/lib/recorder/ControlDepRecorder.js +3 -2
  95. package/dist/lib/recorder/EmitRecorder.js +1 -1
  96. package/dist/lib/recorder/InOutRecorder.js +3 -3
  97. package/dist/lib/recorder/qualityTrace.js +4 -4
  98. package/dist/lib/runner/DeferredObserverTier.js +3 -3
  99. package/dist/lib/runner/ExecutionRuntime.js +6 -9
  100. package/dist/lib/runner/FlowChartExecutor.js +1 -1
  101. package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
  102. package/dist/lib/runner/resume.js +3 -3
  103. package/dist/lib/runner/snapshot.js +6 -5
  104. package/dist/lib/scope/ScopeFacade.js +3 -3
  105. package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
  106. package/dist/recorders.js +1 -1
  107. package/dist/trace.js +18 -120
  108. package/dist/types/advanced.d.ts +24 -58
  109. package/dist/types/index.d.ts +5 -8
  110. package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
  111. package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
  112. package/dist/types/lib/capture/index.d.ts +0 -1
  113. package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
  114. package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
  115. package/dist/types/lib/engine/index.d.ts +1 -1
  116. package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
  117. package/dist/types/lib/engine/narrative/index.d.ts +1 -1
  118. package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
  119. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
  120. package/dist/types/lib/engine/traversalContext.d.ts +1 -1
  121. package/dist/types/lib/engine/types.d.ts +2 -10
  122. package/dist/types/lib/memory/StageContext.d.ts +2 -4
  123. package/dist/types/lib/memory/index.d.ts +6 -21
  124. package/dist/types/lib/memory/redaction.d.ts +1 -1
  125. package/dist/types/lib/memory/runPolicy.d.ts +3 -2
  126. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
  127. package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
  128. package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
  129. package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
  130. package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
  131. package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
  132. package/dist/types/recorders.d.ts +2 -3
  133. package/dist/types/trace.d.ts +11 -57
  134. package/package.json +6 -15
  135. package/dist/esm/lib/capture/freeze.d.ts +0 -91
  136. package/dist/esm/lib/capture/freeze.js +0 -314
  137. package/dist/esm/lib/capture/ownData.d.ts +0 -7
  138. package/dist/esm/lib/capture/ownData.js +0 -15
  139. package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
  140. package/dist/esm/lib/capture/valueKinds.js +0 -142
  141. package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
  142. package/dist/esm/lib/ids/runtimeStageId.js +0 -194
  143. package/dist/esm/lib/memory/EventLog.d.ts +0 -105
  144. package/dist/esm/lib/memory/EventLog.js +0 -148
  145. package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
  146. package/dist/esm/lib/memory/RecordFrame.js +0 -296
  147. package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
  148. package/dist/esm/lib/memory/SharedMemory.js +0 -88
  149. package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
  150. package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
  151. package/dist/esm/lib/memory/admission.d.ts +0 -81
  152. package/dist/esm/lib/memory/admission.js +0 -153
  153. package/dist/esm/lib/memory/backtrack.d.ts +0 -286
  154. package/dist/esm/lib/memory/backtrack.js +0 -457
  155. package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
  156. package/dist/esm/lib/memory/commitLogUtils.js +0 -384
  157. package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
  158. package/dist/esm/lib/memory/deltaEncoding.js +0 -122
  159. package/dist/esm/lib/memory/equality.d.ts +0 -93
  160. package/dist/esm/lib/memory/equality.js +0 -262
  161. package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
  162. package/dist/esm/lib/memory/eventPosition.js +0 -2
  163. package/dist/esm/lib/memory/honesty.d.ts +0 -93
  164. package/dist/esm/lib/memory/honesty.js +0 -92
  165. package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
  166. package/dist/esm/lib/memory/keyPaths.js +0 -227
  167. package/dist/esm/lib/memory/logModel.d.ts +0 -76
  168. package/dist/esm/lib/memory/logModel.js +0 -364
  169. package/dist/esm/lib/memory/merge.d.ts +0 -26
  170. package/dist/esm/lib/memory/merge.js +0 -60
  171. package/dist/esm/lib/memory/pathOps.d.ts +0 -115
  172. package/dist/esm/lib/memory/pathOps.js +0 -290
  173. package/dist/esm/lib/memory/paths.d.ts +0 -52
  174. package/dist/esm/lib/memory/paths.js +0 -57
  175. package/dist/esm/lib/memory/placeholders.d.ts +0 -39
  176. package/dist/esm/lib/memory/placeholders.js +0 -40
  177. package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
  178. package/dist/esm/lib/memory/recordCommit.js +0 -61
  179. package/dist/esm/lib/memory/scrub.d.ts +0 -53
  180. package/dist/esm/lib/memory/scrub.js +0 -74
  181. package/dist/esm/lib/memory/types.d.ts +0 -209
  182. package/dist/esm/lib/memory/types.js +0 -10
  183. package/dist/esm/lib/memory/utils.d.ts +0 -73
  184. package/dist/esm/lib/memory/utils.js +0 -159
  185. package/dist/esm/lib/memory/verbs.d.ts +0 -333
  186. package/dist/esm/lib/memory/verbs.js +0 -427
  187. package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
  188. package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
  189. package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
  190. package/dist/esm/lib/scope/detectCircular.js +0 -14
  191. package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
  192. package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
  193. package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
  194. package/dist/esm/lib/slice/elementProvenance.js +0 -190
  195. package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
  196. package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
  197. package/dist/esm/lib/slice/index.d.ts +0 -25
  198. package/dist/esm/lib/slice/index.js +0 -25
  199. package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
  200. package/dist/esm/lib/slice/keyIndex.js +0 -293
  201. package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
  202. package/dist/esm/lib/slice/keyTimeline.js +0 -113
  203. package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
  204. package/dist/esm/lib/slice/keysReadSources.js +0 -95
  205. package/dist/esm/lib/slice/serialize.d.ts +0 -78
  206. package/dist/esm/lib/slice/serialize.js +0 -278
  207. package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
  208. package/dist/esm/lib/slice/sliceForKey.js +0 -88
  209. package/dist/esm/lib/slice/types.d.ts +0 -567
  210. package/dist/esm/lib/slice/types.js +0 -25
  211. package/dist/esm/lib/time-travel/axis.d.ts +0 -119
  212. package/dist/esm/lib/time-travel/axis.js +0 -179
  213. package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
  214. package/dist/esm/lib/time-travel/bundles.js +0 -136
  215. package/dist/esm/lib/time-travel/chain.d.ts +0 -93
  216. package/dist/esm/lib/time-travel/chain.js +0 -188
  217. package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
  218. package/dist/esm/lib/time-travel/commitStops.js +0 -202
  219. package/dist/esm/lib/time-travel/index.d.ts +0 -22
  220. package/dist/esm/lib/time-travel/index.js +0 -21
  221. package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
  222. package/dist/esm/lib/time-travel/stateAt.js +0 -153
  223. package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
  224. package/dist/esm/lib/time-travel/tagStops.js +0 -102
  225. package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
  226. package/dist/esm/lib/time-travel/timeTravel.js +0 -360
  227. package/dist/esm/lib/time-travel/types.d.ts +0 -470
  228. package/dist/esm/lib/time-travel/types.js +0 -23
  229. package/dist/esm/write.d.ts +0 -47
  230. package/dist/esm/write.js +0 -46
  231. package/dist/lib/capture/freeze.js +0 -320
  232. package/dist/lib/capture/ownData.js +0 -19
  233. package/dist/lib/capture/valueKinds.js +0 -146
  234. package/dist/lib/ids/runtimeStageId.js +0 -210
  235. package/dist/lib/memory/EventLog.js +0 -152
  236. package/dist/lib/memory/RecordFrame.js +0 -300
  237. package/dist/lib/memory/SharedMemory.js +0 -92
  238. package/dist/lib/memory/TransactionBuffer.js +0 -950
  239. package/dist/lib/memory/admission.js +0 -159
  240. package/dist/lib/memory/backtrack.js +0 -463
  241. package/dist/lib/memory/commitLogUtils.js +0 -399
  242. package/dist/lib/memory/deltaEncoding.js +0 -128
  243. package/dist/lib/memory/equality.js +0 -266
  244. package/dist/lib/memory/eventPosition.js +0 -3
  245. package/dist/lib/memory/honesty.js +0 -95
  246. package/dist/lib/memory/keyPaths.js +0 -243
  247. package/dist/lib/memory/logModel.js +0 -372
  248. package/dist/lib/memory/merge.js +0 -64
  249. package/dist/lib/memory/pathOps.js +0 -306
  250. package/dist/lib/memory/paths.js +0 -62
  251. package/dist/lib/memory/placeholders.js +0 -43
  252. package/dist/lib/memory/recordCommit.js +0 -65
  253. package/dist/lib/memory/scrub.js +0 -79
  254. package/dist/lib/memory/types.js +0 -11
  255. package/dist/lib/memory/utils.js +0 -178
  256. package/dist/lib/memory/verbs.js +0 -444
  257. package/dist/lib/recorder/CommitRangeIndex.js +0 -211
  258. package/dist/lib/scope/detectCircular.js +0 -21
  259. package/dist/lib/scope/recorders/summarizeValue.js +0 -10
  260. package/dist/lib/slice/elementProvenance.js +0 -195
  261. package/dist/lib/slice/forwardSliceForKey.js +0 -247
  262. package/dist/lib/slice/index.js +0 -42
  263. package/dist/lib/slice/keyIndex.js +0 -313
  264. package/dist/lib/slice/keyTimeline.js +0 -117
  265. package/dist/lib/slice/keysReadSources.js +0 -101
  266. package/dist/lib/slice/serialize.js +0 -286
  267. package/dist/lib/slice/sliceForKey.js +0 -93
  268. package/dist/lib/slice/types.js +0 -26
  269. package/dist/lib/time-travel/axis.js +0 -184
  270. package/dist/lib/time-travel/bundles.js +0 -144
  271. package/dist/lib/time-travel/chain.js +0 -193
  272. package/dist/lib/time-travel/commitStops.js +0 -206
  273. package/dist/lib/time-travel/index.js +0 -32
  274. package/dist/lib/time-travel/stateAt.js +0 -160
  275. package/dist/lib/time-travel/tagStops.js +0 -106
  276. package/dist/lib/time-travel/timeTravel.js +0 -364
  277. package/dist/lib/time-travel/types.js +0 -24
  278. package/dist/types/lib/capture/freeze.d.ts +0 -91
  279. package/dist/types/lib/capture/ownData.d.ts +0 -7
  280. package/dist/types/lib/capture/valueKinds.d.ts +0 -57
  281. package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
  282. package/dist/types/lib/memory/EventLog.d.ts +0 -105
  283. package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
  284. package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
  285. package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
  286. package/dist/types/lib/memory/admission.d.ts +0 -81
  287. package/dist/types/lib/memory/backtrack.d.ts +0 -286
  288. package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
  289. package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
  290. package/dist/types/lib/memory/equality.d.ts +0 -93
  291. package/dist/types/lib/memory/eventPosition.d.ts +0 -18
  292. package/dist/types/lib/memory/honesty.d.ts +0 -93
  293. package/dist/types/lib/memory/keyPaths.d.ts +0 -125
  294. package/dist/types/lib/memory/logModel.d.ts +0 -76
  295. package/dist/types/lib/memory/merge.d.ts +0 -26
  296. package/dist/types/lib/memory/pathOps.d.ts +0 -115
  297. package/dist/types/lib/memory/paths.d.ts +0 -52
  298. package/dist/types/lib/memory/placeholders.d.ts +0 -39
  299. package/dist/types/lib/memory/recordCommit.d.ts +0 -45
  300. package/dist/types/lib/memory/scrub.d.ts +0 -53
  301. package/dist/types/lib/memory/types.d.ts +0 -209
  302. package/dist/types/lib/memory/utils.d.ts +0 -73
  303. package/dist/types/lib/memory/verbs.d.ts +0 -333
  304. package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
  305. package/dist/types/lib/scope/detectCircular.d.ts +0 -13
  306. package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
  307. package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
  308. package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
  309. package/dist/types/lib/slice/index.d.ts +0 -25
  310. package/dist/types/lib/slice/keyIndex.d.ts +0 -137
  311. package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
  312. package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
  313. package/dist/types/lib/slice/serialize.d.ts +0 -78
  314. package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
  315. package/dist/types/lib/slice/types.d.ts +0 -567
  316. package/dist/types/lib/time-travel/axis.d.ts +0 -119
  317. package/dist/types/lib/time-travel/bundles.d.ts +0 -77
  318. package/dist/types/lib/time-travel/chain.d.ts +0 -93
  319. package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
  320. package/dist/types/lib/time-travel/index.d.ts +0 -22
  321. package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
  322. package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
  323. package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
  324. package/dist/types/lib/time-travel/types.d.ts +0 -470
  325. package/dist/types/write.d.ts +0 -47
  326. package/dist/write.js +0 -52
@@ -1,364 +0,0 @@
1
- "use strict";
2
- /**
3
- * timeTravel — a reader's cursor over a finished trace.
4
- *
5
- * The five laws this file implements (and the folder README states with an
6
- * example each):
7
- *
8
- * 1. ONE cursor. This object holds the only position. `drill()` returns a
9
- * separate cursor over a separate log, never a second position here.
10
- * 2. A miss never moves. Every refusal returns the reason and leaves the
11
- * cursor exactly where it was.
12
- * 3. A fold result is detached. `stateAt` returns frozen, cloned state that
13
- * shares nothing with the engine.
14
- * 4. Marks live beside the log. They are the reader's notes, never written
15
- * into the run's record.
16
- * 5. Stops are DERIVED from the recorded log — read-time queries over
17
- * collected data, never a re-walk that invents what was not recorded.
18
- *
19
- * A CHAIN (9.18.0) does not add a sixth law and does not bend these five: it
20
- * is still one cursor, over sources that are still only read. What it adds is
21
- * that the STEPS run across a pause/resume — see `chain.ts` for the ordering
22
- * and lineage checks, and for why commit indices stay run-local.
23
- */
24
- Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.timeTravel = void 0;
26
- const runtimeStageId_js_1 = require("../ids/runtimeStageId.js");
27
- const bundles_js_1 = require("./bundles.js");
28
- const chain_js_1 = require("./chain.js");
29
- const commitStops_js_1 = require("./commitStops.js");
30
- const stateAt_js_1 = require("./stateAt.js");
31
- class Cursor {
32
- stops;
33
- path;
34
- mountRuntimeStageId;
35
- parent;
36
- sourceCount;
37
- legs;
38
- sources;
39
- options;
40
- _marks;
41
- step;
42
- /** The last fold's working copy, so a step forward applies one bundle (9.25.0). */
43
- foldMemo;
44
- constructor(sources, options, path, parent, mountRuntimeStageId) {
45
- this.sources = sources;
46
- this.options = options;
47
- this.path = path;
48
- this.parent = parent;
49
- this.mountRuntimeStageId = mountRuntimeStageId;
50
- this.legs = sources.map((source) => (0, stateAt_js_1.readSource)(source));
51
- this.sourceCount = sources.length;
52
- // The shipped strategy has no vocabulary of its own (`meta` is never set),
53
- // so it serves any `TMeta` a caller asked for.
54
- const strategy = options.strategy ?? commitStops_js_1.commitStopsStrategy;
55
- // ONE CALL PER SOURCE, with that source's own log and tree: a strategy
56
- // never has to know it is part of a chain, and its indices stay local to
57
- // the leg it was handed.
58
- const perSource = this.legs.map((leg, i) => strategy.stopsFor(leg.log, (0, bundles_js_1.readTree)(sources[i].executionTree), sources[i].subflowResults));
59
- this.stops = Object.freeze(sources.length === 1 ? perSource[0] : chainStops(perSource));
60
- this._marks = [...(options.marks ?? [])];
61
- this.step = 0;
62
- }
63
- // ── Position ─────────────────────────────────────────────────────────────
64
- at() {
65
- return this.stops[this.step];
66
- }
67
- moveTo(step) {
68
- const from = this.at();
69
- this.step = step;
70
- return { moved: true, from, to: this.stops[step] };
71
- }
72
- /** Law 2: a refusal never touches `this.step`. */
73
- refuse(reason, nearest) {
74
- const at = this.at();
75
- return nearest ? { moved: false, reason, at, nearest } : { moved: false, reason, at };
76
- }
77
- first() {
78
- if (this.stops.length === 0)
79
- return this.refuse('empty');
80
- if (this.step === 0)
81
- return this.refuse('clamped');
82
- return this.moveTo(0);
83
- }
84
- last() {
85
- if (this.stops.length === 0)
86
- return this.refuse('empty');
87
- const end = this.stops.length - 1;
88
- if (this.step === end)
89
- return this.refuse('clamped');
90
- return this.moveTo(end);
91
- }
92
- prev() {
93
- if (this.stops.length === 0)
94
- return this.refuse('empty');
95
- if (this.step === 0)
96
- return this.refuse('clamped');
97
- return this.moveTo(this.step - 1);
98
- }
99
- next() {
100
- if (this.stops.length === 0)
101
- return this.refuse('empty');
102
- if (this.step >= this.stops.length - 1)
103
- return this.refuse('clamped');
104
- return this.moveTo(this.step + 1);
105
- }
106
- jumpTo(target) {
107
- if (this.stops.length === 0)
108
- return this.refuse('empty');
109
- if (typeof target === 'number') {
110
- const step = Math.trunc(target);
111
- if (Number.isNaN(step))
112
- return this.refuse('miss');
113
- if (step < 0)
114
- return this.refuse('clamped', this.stops[0]);
115
- if (step > this.stops.length - 1)
116
- return this.refuse('clamped', this.stops[this.stops.length - 1]);
117
- if (step === this.step)
118
- return this.refuse('clamped');
119
- return this.moveTo(step);
120
- }
121
- // `''` is not an address: it is what the bookends and any pre-stage
122
- // root commit carry. Those are reached by step, never by id.
123
- if (target === '')
124
- return this.refuse('miss');
125
- const hit = this.stops.find((stop) => stop.runtimeStageId === target);
126
- if (!hit)
127
- return this.refuse('miss', this.nearestTo(target));
128
- if (hit.step === this.step)
129
- return this.refuse('clamped');
130
- return this.moveTo(hit.step);
131
- }
132
- /**
133
- * The closest namable stop for a `runtimeStageId` that is not on this axis:
134
- * the last stop of the same STAGE (a different iteration of the same node),
135
- * else the last stop whose commit precedes the missed id's execution index.
136
- * Naming a neighbour is a courtesy for the UI — it never moves the cursor.
137
- */
138
- nearestTo(runtimeStageId) {
139
- if (!(0, runtimeStageId_js_1.isExecutionKey)(runtimeStageId))
140
- return undefined;
141
- const stagePart = (0, runtimeStageId_js_1.stageIdOf)(runtimeStageId);
142
- const wanted = (0, runtimeStageId_js_1.executionIndexOf)(runtimeStageId);
143
- let sameStage;
144
- let byIndex;
145
- for (const stop of this.stops) {
146
- if (!(0, runtimeStageId_js_1.isExecutionKey)(stop.runtimeStageId))
147
- continue;
148
- if ((0, runtimeStageId_js_1.stageIdOf)(stop.runtimeStageId) === stagePart)
149
- sameStage = stop;
150
- if (!Number.isNaN(wanted)) {
151
- const idx = (0, runtimeStageId_js_1.executionIndexOf)(stop.runtimeStageId);
152
- if (!Number.isNaN(idx) && idx <= wanted)
153
- byIndex = stop;
154
- }
155
- }
156
- return sameStage ?? byIndex;
157
- }
158
- // ── Reading ──────────────────────────────────────────────────────────────
159
- stateAt(stop) {
160
- const target = stop ?? this.at();
161
- const leg = target?.sourceIdx ?? 0;
162
- const fold = (0, stateAt_js_1.foldLegsFrom)(this.legs, leg, target ? target.lastCommitIdx : -1, this.foldMemo);
163
- this.foldMemo = fold.memo;
164
- const folded = fold.folded;
165
- // Which leg the index belongs to, but only when there is more than one —
166
- // a single-source fold keeps the 9.17.0 shape exactly.
167
- return this.legs.length > 1 ? { ...folded, sourceIdx: leg } : folded;
168
- }
169
- changedSince(from) {
170
- const to = this.at();
171
- if (!to)
172
- return Object.freeze([]);
173
- const start = from ?? this.stops[this.step - 1];
174
- // No earlier stop (we are at `'start'`) ⇒ everything up to here: nothing
175
- // on a run cursor, and the subflow's `inputMapper` seed on a drilled one
176
- // (the start bookend covers the seed that precedes stage one — `commitStops`).
177
- const toLeg = to.sourceIdx ?? 0;
178
- const fromLeg = start ? start.sourceIdx ?? 0 : toLeg;
179
- const afterIdx = start ? start.lastCommitIdx : -1;
180
- const keys = new Set();
181
- // A range that crosses a chain seam is walked leg by leg: the tail of the
182
- // leg it started in, every leg in between whole, then the head of the leg
183
- // it ends in. Backwards ranges walk nothing and give `[]`, as before.
184
- for (let leg = fromLeg; leg <= toLeg && leg < this.legs.length; leg++) {
185
- const log = this.legs[leg].log;
186
- const lo = leg === fromLeg ? afterIdx + 1 : 0;
187
- const hi = leg === toLeg ? to.lastCommitIdx : log.length - 1;
188
- for (let i = lo; i <= hi; i++) {
189
- const bundle = log[i];
190
- if (!bundle)
191
- continue;
192
- for (const entry of bundle.trace)
193
- keys.add(entry.path);
194
- }
195
- }
196
- return Object.freeze([...keys].sort());
197
- }
198
- // ── Marks (law 4: beside the log, never in it) ───────────────────────────
199
- mark(name, stop) {
200
- const target = stop ?? this.at();
201
- if (!target)
202
- return undefined;
203
- const entry = Object.freeze({ name, runtimeStageId: target.runtimeStageId, step: target.step });
204
- const existing = this._marks.findIndex((m) => m.name === name);
205
- if (existing >= 0)
206
- this._marks[existing] = entry;
207
- else
208
- this._marks.push(entry);
209
- return entry;
210
- }
211
- marks() {
212
- return Object.freeze([...this._marks]);
213
- }
214
- jumpToMark(name) {
215
- if (this.stops.length === 0)
216
- return this.refuse('empty');
217
- const entry = this._marks.find((m) => m.name === name);
218
- if (!entry)
219
- return this.refuse('miss');
220
- // Resolve by runtimeStageId first — the address that survives a change of
221
- // strategy — and fall back to the remembered step only for the bookends,
222
- // which have no stage id of their own.
223
- const byId = entry.runtimeStageId
224
- ? this.stops.find((stop) => stop.runtimeStageId === entry.runtimeStageId)
225
- : this.stops[entry.step];
226
- if (!byId)
227
- return this.refuse('miss', this.nearestTo(entry.runtimeStageId));
228
- if (byId.step === this.step)
229
- return this.refuse('clamped');
230
- return this.moveTo(byId.step);
231
- }
232
- // ── Drilling (law 1: a separate cursor, not a second position) ───────────
233
- drill(mountRuntimeStageId) {
234
- // On a chain, the mount is looked for in every leg — a subflow that ran
235
- // before the pause is in the first snapshot's results, one that ran after
236
- // is in the second's. Ids are unique across a sound chain (chain.ts
237
- // refuses one where they are not), so the first hit is the only hit.
238
- let results;
239
- let result;
240
- for (const source of this.sources) {
241
- // A stored recording's results are parsed JSON: read them as a map only
242
- // when they are one, and as "no subflows" otherwise.
243
- if (!(0, bundles_js_1.isPlainish)(source.subflowResults))
244
- continue;
245
- const hit = source.subflowResults[mountRuntimeStageId];
246
- if (hit) {
247
- results = source.subflowResults;
248
- result = hit;
249
- break;
250
- }
251
- }
252
- const tree = result?.treeContext;
253
- if (!results || !result || !tree || !Array.isArray(tree.history))
254
- return undefined;
255
- // `path` is the subflow PATH — the same string for every iteration of a
256
- // mount inside a loop. `mountRuntimeStageId` is the iteration actually
257
- // opened, so a UI can label and key three drill panels over `sfx#2`,
258
- // `sfx#8`, `sfx#14` apart instead of calling all three 'sfx'.
259
- const childPath = result.subflowId ?? mountRuntimeStageId;
260
- const child = {
261
- // Rows are narrowed per bundle when the child reads them — a stored
262
- // recording's inner history needs no cast either.
263
- commitLog: tree.history,
264
- initialState: tree.initialState,
265
- executionTree: tree.stageContexts,
266
- // Nested subflow results are merged UP into one flat, dual-keyed map, so
267
- // the child can drill further through the same map.
268
- subflowResults: results,
269
- };
270
- return new Cursor([child], { strategy: this.options.strategy }, childPath, this, mountRuntimeStageId);
271
- }
272
- }
273
- /**
274
- * Re-step per-source stops into ONE axis.
275
- *
276
- * The INTERIOR bookends go: a `'start'` on any leg but the first, and an
277
- * `'end'` on any leg but the last, are bookends of a leg and not of the run —
278
- * keeping them would put "the run is over" in the middle of the axis. The
279
- * commits they covered are not orphaned: a fold always replays its leg from
280
- * that leg's own base, and `changedSince` walks a seam-crossing range leg by
281
- * leg (including the head of the leg it ends in). The stops' `commitIdx` /
282
- * `lastCommitIdx` ranges PARTITION EACH LEG, never span the seam: a stop's
283
- * range ends at its own leg's last index, and the next leg's first stop opens
284
- * at that leg's 0.
285
- */
286
- function chainStops(perSource) {
287
- // "Interior" is measured against the legs that actually CONTRIBUTE stops: a
288
- // leg whose log was empty has no bookends to drop and must not make its
289
- // neighbour's `'start'` or `'end'` interior — the chained axis still opens
290
- // with the first stop that exists and closes with the last.
291
- const contributing = perSource.map((stops) => stops.length > 0);
292
- const firstLeg = contributing.indexOf(true);
293
- const lastLeg = contributing.lastIndexOf(true);
294
- const out = [];
295
- for (const [sourceIdx, stops] of perSource.entries()) {
296
- for (const stop of stops) {
297
- if (sourceIdx > firstLeg && stop.kind === 'start')
298
- continue;
299
- if (sourceIdx < lastLeg && stop.kind === 'end')
300
- continue;
301
- out.push({ ...stop, step: out.length, sourceIdx });
302
- }
303
- }
304
- return out;
305
- }
306
- /**
307
- * Open a reader's cursor over a finished run.
308
- *
309
- * Nothing here executes anything: `snapshot` is a record of a run that already
310
- * happened, and every question is answered by reading it. A stored JSON
311
- * snapshot works exactly like a live one — since 9.18.0 its `commitLog` may be
312
- * an unvalidated `unknown[]`, narrowed per bundle where the fold reads it, so
313
- * a replayed recording needs no cast.
314
- *
315
- * @param snapshot `executor.getSnapshot()`, or any object with the same
316
- * shape — including one round-tripped through JSON, or a subflow subtree
317
- * (`getSubtreeSnapshot()`, whose log is spelled `history`). An ARRAY of them
318
- * is a CHAIN: a pause and its resume read as one axis (see below).
319
- * @param options `strategy` chooses how stops are derived (default:
320
- * `commitStops`, one stop per executed stage); `marks` seeds the cursor with
321
- * bookmarks, e.g. restored from a saved reading session.
322
- *
323
- * @throws when a chain is not in run order, or its legs are not from one
324
- * lineage — three checks, each with its own reason (see `chain.ts`):
325
- * no `runtimeStageId` may appear in two legs; each leg's first execution
326
- * index must be past the previous leg's last (the engine never resets the
327
- * counter across a resume); and each leg's `initialState` must deep-equal
328
- * the state the legs before it fold to — on a resume that base IS the state
329
- * at the pause, so a foreign leg whose indices merely happen to be higher
330
- * is refused too. The third check runs only where the record allows it: the
331
- * later leg must carry an `initialState` and the earlier legs must fold from
332
- * a real base with no unreadable rows; otherwise (an older recording with
333
- * no base) the chain rests on the two index checks alone, and the fold's
334
- * `basis` says what it stood on.
335
- *
336
- * @example
337
- * ```typescript
338
- * const tt = timeTravel(executor.getSnapshot());
339
- * tt.jumpTo('score-risk#4');
340
- * console.log(tt.changedSince()); // ['riskScore', 'tier']
341
- * console.log(tt.stateAt().state); // state as that stage left it
342
- * tt.mark('the bad one');
343
- * const inner = tt.drill('sf-payment#7'); // a separate cursor, its own log
344
- *
345
- * // A pause and its resume, read as ONE axis:
346
- * const chained = timeTravel([pausedSnapshot, resumedSnapshot]);
347
- * chained.last(); // the run's real end
348
- * chained.at()!.sourceIdx; // 1 — which leg the indices are in
349
- * chained.jumpTo('approve#3'); // finds it in either leg
350
- * ```
351
- */
352
- function timeTravel(snapshot, options = {}) {
353
- const sources = Array.isArray(snapshot) ? snapshot : [snapshot];
354
- // A one-element array is not a chain: it is the plain cursor, and skips the
355
- // lineage checks a single source cannot fail.
356
- if (sources.length !== 1) {
357
- const refusal = (0, chain_js_1.refuseChain)(sources.map((source) => (0, stateAt_js_1.readSource)(source)));
358
- if (refusal)
359
- throw new Error(refusal);
360
- }
361
- return new Cursor(sources, options);
362
- }
363
- exports.timeTravel = timeTravel;
364
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZVRyYXZlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdGltZS10cmF2ZWwvdGltZVRyYXZlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRzs7O0FBRUgsZ0VBQXVGO0FBQ3ZGLDZDQUFvRDtBQUNwRCx5Q0FBeUM7QUFDekMscURBQXVEO0FBQ3ZELDZDQUF3RjtBQXNCeEYsTUFBTSxNQUFNO0lBQ0QsS0FBSyxDQUF5QjtJQUM5QixJQUFJLENBQXFCO0lBQ3pCLG1CQUFtQixDQUFxQjtJQUN4QyxNQUFNLENBQWdDO0lBQ3RDLFdBQVcsQ0FBUztJQUVaLElBQUksQ0FBd0I7SUFDNUIsT0FBTyxDQUE4QjtJQUNyQyxPQUFPLENBQTJCO0lBQ2xDLE1BQU0sQ0FBUztJQUN4QixJQUFJLENBQVM7SUFDckIsbUZBQW1GO0lBQzNFLFFBQVEsQ0FBdUI7SUFFdkMsWUFDRSxPQUFvQyxFQUNwQyxPQUFpQyxFQUNqQyxJQUFhLEVBQ2IsTUFBMEIsRUFDMUIsbUJBQTRCO1FBRTVCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztRQUMvQyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUEsdUJBQVUsRUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUVsQywyRUFBMkU7UUFDM0UsK0NBQStDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FB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SUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUs7Z0JBQUUsU0FBUztZQUN6RCxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q0c7QUFDSCxTQUFnQixVQUFVLENBQ3hCLFFBQXdELEVBQ3hELFVBQW9DLEVBQUU7SUFFdEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUUsUUFBd0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUE0QixDQUFDLENBQUM7SUFDckgsNEVBQTRFO0lBQzVFLDhDQUE4QztJQUM5QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBQSxzQkFBVyxFQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUEsdUJBQVUsRUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxPQUFPO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsT0FBTyxJQUFJLE1BQU0sQ0FBUSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQVpELGdDQVlDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB0aW1lVHJhdmVsIOKAlCBhIHJlYWRlcidzIGN1cnNvciBvdmVyIGEgZmluaXNoZWQgdHJhY2UuXG4gKlxuICogVGhlIGZpdmUgbGF3cyB0aGlzIGZpbGUgaW1wbGVtZW50cyAoYW5kIHRoZSBmb2xkZXIgUkVBRE1FIHN0YXRlcyB3aXRoIGFuXG4gKiBleGFtcGxlIGVhY2gpOlxuICpcbiAqICAgMS4gT05FIGN1cnNvci4gVGhpcyBvYmplY3QgaG9sZHMgdGhlIG9ubHkgcG9zaXRpb24uIGBkcmlsbCgpYCByZXR1cm5zIGFcbiAqICAgICAgc2VwYXJhdGUgY3Vyc29yIG92ZXIgYSBzZXBhcmF0ZSBsb2csIG5ldmVyIGEgc2Vjb25kIHBvc2l0aW9uIGhlcmUuXG4gKiAgIDIuIEEgbWlzcyBuZXZlciBtb3Zlcy4gRXZlcnkgcmVmdXNhbCByZXR1cm5zIHRoZSByZWFzb24gYW5kIGxlYXZlcyB0aGVcbiAqICAgICAgY3Vyc29yIGV4YWN0bHkgd2hlcmUgaXQgd2FzLlxuICogICAzLiBBIGZvbGQgcmVzdWx0IGlzIGRldGFjaGVkLiBgc3RhdGVBdGAgcmV0dXJucyBmcm96ZW4sIGNsb25lZCBzdGF0ZSB0aGF0XG4gKiAgICAgIHNoYXJlcyBub3RoaW5nIHdpdGggdGhlIGVuZ2luZS5cbiAqICAgNC4gTWFya3MgbGl2ZSBiZXNpZGUgdGhlIGxvZy4gVGhleSBhcmUgdGhlIHJlYWRlcidzIG5vdGVzLCBuZXZlciB3cml0dGVuXG4gKiAgICAgIGludG8gdGhlIHJ1bidzIHJlY29yZC5cbiAqICAgNS4gU3RvcHMgYXJlIERFUklWRUQgZnJvbSB0aGUgcmVjb3JkZWQgbG9nIOKAlCByZWFkLXRpbWUgcXVlcmllcyBvdmVyXG4gKiAgICAgIGNvbGxlY3RlZCBkYXRhLCBuZXZlciBhIHJlLXdhbGsgdGhhdCBpbnZlbnRzIHdoYXQgd2FzIG5vdCByZWNvcmRlZC5cbiAqXG4gKiBBIENIQUlOICg5LjE4LjApIGRvZXMgbm90IGFkZCBhIHNpeHRoIGxhdyBhbmQgZG9lcyBub3QgYmVuZCB0aGVzZSBmaXZlOiBpdFxuICogaXMgc3RpbGwgb25lIGN1cnNvciwgb3ZlciBzb3VyY2VzIHRoYXQgYXJlIHN0aWxsIG9ubHkgcmVhZC4gV2hhdCBpdCBhZGRzIGlzXG4gKiB0aGF0IHRoZSBTVEVQUyBydW4gYWNyb3NzIGEgcGF1c2UvcmVzdW1lIOKAlCBzZWUgYGNoYWluLnRzYCBmb3IgdGhlIG9yZGVyaW5nXG4gKiBhbmQgbGluZWFnZSBjaGVja3MsIGFuZCBmb3Igd2h5IGNvbW1pdCBpbmRpY2VzIHN0YXkgcnVuLWxvY2FsLlxuICovXG5cbmltcG9ydCB7IGV4ZWN1dGlvbkluZGV4T2YsIGlzRXhlY3V0aW9uS2V5LCBzdGFnZUlkT2YgfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHsgaXNQbGFpbmlzaCwgcmVhZFRyZWUgfSBmcm9tICcuL2J1bmRsZXMuanMnO1xuaW1wb3J0IHsgcmVmdXNlQ2hhaW4gfSBmcm9tICcuL2NoYWluLmpzJztcbmltcG9ydCB7IGNvbW1pdFN0b3BzU3RyYXRlZ3kgfSBmcm9tICcuL2NvbW1pdFN0b3BzLmpzJztcbmltcG9ydCB7IHR5cGUgRm9sZE1lbW8sIHR5cGUgUmVhZFNvdXJjZSwgZm9sZExlZ3NGcm9tLCByZWFkU291cmNlIH0gZnJvbSAnLi9zdGF0ZUF0LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRm9sZGVkU3RhdGUsXG4gIE1hcmssXG4gIE1vdmUsXG4gIFN0b3AsXG4gIFRpbWVUcmF2ZWwsXG4gIFRpbWVUcmF2ZWxPcHRpb25zLFxuICBUaW1lVHJhdmVsU291cmNlLFxuICBUaW1lVHJhdmVsU3RyYXRlZ3ksXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogQSBzdWJmbG93IHJlc3VsdCBhcyB0aGlzIG1vZHVsZSBuZWVkcyB0byByZWFkIGl0IOKAlCBkdWNrLXR5cGVkIG9uIHB1cnBvc2UuICovXG5pbnRlcmZhY2UgU3ViZmxvd1Jlc3VsdFNoYXBlIHtcbiAgc3ViZmxvd0lkPzogc3RyaW5nO1xuICB0cmVlQ29udGV4dD86IHtcbiAgICBoaXN0b3J5PzogdW5rbm93bltdO1xuICAgIGluaXRpYWxTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHN0YWdlQ29udGV4dHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfTtcbn1cblxuY2xhc3MgQ3Vyc29yPFRNZXRhPiBpbXBsZW1lbnRzIFRpbWVUcmF2ZWw8VE1ldGE+IHtcbiAgcmVhZG9ubHkgc3RvcHM6IHJlYWRvbmx5IFN0b3A8VE1ldGE+W107XG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgbW91bnRSdW50aW1lU3RhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBwYXJlbnQ6IFRpbWVUcmF2ZWw8VE1ldGE+IHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBzb3VyY2VDb3VudDogbnVtYmVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbGVnczogcmVhZG9ubHkgUmVhZFNvdXJjZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZXM6IHJlYWRvbmx5IFRpbWVUcmF2ZWxTb3VyY2VbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBUaW1lVHJhdmVsT3B0aW9uczxUTWV0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgX21hcmtzOiBNYXJrW107XG4gIHByaXZhdGUgc3RlcDogbnVtYmVyO1xuICAvKiogVGhlIGxhc3QgZm9sZCdzIHdvcmtpbmcgY29weSwgc28gYSBzdGVwIGZvcndhcmQgYXBwbGllcyBvbmUgYnVuZGxlICg5LjI1LjApLiAqL1xuICBwcml2YXRlIGZvbGRNZW1vOiBGb2xkTWVtbyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzb3VyY2VzOiByZWFkb25seSBUaW1lVHJhdmVsU291cmNlW10sXG4gICAgb3B0aW9uczogVGltZVRyYXZlbE9wdGlvbnM8VE1ldGE+LFxuICAgIHBhdGg/OiBzdHJpbmcsXG4gICAgcGFyZW50PzogVGltZVRyYXZlbDxUTWV0YT4sXG4gICAgbW91bnRSdW50aW1lU3RhZ2VJZD86IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5zb3VyY2VzID0gc291cmNlcztcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5tb3VudFJ1bnRpbWVTdGFnZUlkID0gbW91bnRSdW50aW1lU3RhZ2VJZDtcbiAgICB0aGlzLmxlZ3MgPSBzb3VyY2VzLm1hcCgoc291cmNlKSA9PiByZWFkU291cmNlKHNvdXJjZSkpO1xuICAgIHRoaXMuc291cmNlQ291bnQgPSBzb3VyY2VzLmxlbmd0aDtcblxuICAgIC8vIFRoZSBzaGlwcGVkIHN0cmF0ZWd5IGhhcyBubyB2b2NhYnVsYXJ5IG9mIGl0cyBvd24gKGBtZXRhYCBpcyBuZXZlciBzZXQpLFxuICAgIC8vIHNvIGl0IHNlcnZlcyBhbnkgYFRNZXRhYCBhIGNhbGxlciBhc2tlZCBmb3IuXG4gICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zLnN0cmF0ZWd5ID8/IChjb21taXRTdG9wc1N0cmF0ZWd5IGFzIFRpbWVUcmF2ZWxTdHJhdGVneTxUTWV0YT4pO1xuICAgIC8vIE9ORSBDQUxMIFBFUiBTT1VSQ0UsIHdpdGggdGhhdCBzb3VyY2UncyBvd24gbG9nIGFuZCB0cmVlOiBhIHN0cmF0ZWd5XG4gICAgLy8gbmV2ZXIgaGFzIHRvIGtub3cgaXQgaXMgcGFydCBvZiBhIGNoYWluLCBhbmQgaXRzIGluZGljZXMgc3RheSBsb2NhbCB0b1xuICAgIC8vIHRoZSBsZWcgaXQgd2FzIGhhbmRlZC5cbiAgICBjb25zdCBwZXJTb3VyY2UgPSB0aGlzLmxlZ3MubWFwKChsZWcsIGkpID0+XG4gICAgICBzdHJhdGVneS5zdG9wc0ZvcihsZWcubG9nLCByZWFkVHJlZShzb3VyY2VzW2ldLmV4ZWN1dGlvblRyZWUpLCBzb3VyY2VzW2ldLnN1YmZsb3dSZXN1bHRzKSxcbiAgICApO1xuICAgIHRoaXMuc3RvcHMgPSBPYmplY3QuZnJlZXplKHNvdXJjZXMubGVuZ3RoID09PSAxID8gcGVyU291cmNlWzBdIDogY2hhaW5TdG9wcyhwZXJTb3VyY2UpKTtcbiAgICB0aGlzLl9tYXJrcyA9IFsuLi4ob3B0aW9ucy5tYXJrcyA/PyBbXSldO1xuICAgIHRoaXMuc3RlcCA9IDA7XG4gIH1cblxuICAvLyDilIDilIAgUG9zaXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXQoKTogU3RvcDxUTWV0YT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0b3BzW3RoaXMuc3RlcF07XG4gIH1cblxuICBwcml2YXRlIG1vdmVUbyhzdGVwOiBudW1iZXIpOiBNb3ZlPFRNZXRhPiB7XG4gICAgY29uc3QgZnJvbSA9IHRoaXMuYXQoKTtcbiAgICB0aGlzLnN0ZXAgPSBzdGVwO1xuICAgIHJldHVybiB7IG1vdmVkOiB0cnVlLCBmcm9tLCB0bzogdGhpcy5zdG9wc1tzdGVwXSB9O1xuICB9XG5cbiAgLyoqIExhdyAyOiBhIHJlZnVzYWwgbmV2ZXIgdG91Y2hlcyBgdGhpcy5zdGVwYC4gKi9cbiAgcHJpdmF0ZSByZWZ1c2UocmVhc29uOiAnY2xhbXBlZCcgfCAnbWlzcycgfCAnZW1wdHknLCBuZWFyZXN0PzogU3RvcDxUTWV0YT4pOiBNb3ZlPFRNZXRhPiB7XG4gICAgY29uc3QgYXQgPSB0aGlzLmF0KCk7XG4gICAgcmV0dXJuIG5lYXJlc3QgPyB7IG1vdmVkOiBmYWxzZSwgcmVhc29uLCBhdCwgbmVhcmVzdCB9IDogeyBtb3ZlZDogZmFsc2UsIHJlYXNvbiwgYXQgfTtcbiAgfVxuXG4gIGZpcnN0KCk6IE1vdmU8VE1ldGE+IHtcbiAgICBpZiAodGhpcy5zdG9wcy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLnJlZnVzZSgnZW1wdHknKTtcbiAgICBpZiAodGhpcy5zdGVwID09PSAwKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ2NsYW1wZWQnKTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG8oMCk7XG4gIH1cblxuICBsYXN0KCk6IE1vdmU8VE1ldGE+IHtcbiAgICBpZiAodGhpcy5zdG9wcy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLnJlZnVzZSgnZW1wdHknKTtcbiAgICBjb25zdCBlbmQgPSB0aGlzLnN0b3BzLmxlbmd0aCAtIDE7XG4gICAgaWYgKHRoaXMuc3RlcCA9PT0gZW5kKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ2NsYW1wZWQnKTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG8oZW5kKTtcbiAgfVxuXG4gIHByZXYoKTogTW92ZTxUTWV0YT4ge1xuICAgIGlmICh0aGlzLnN0b3BzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMucmVmdXNlKCdlbXB0eScpO1xuICAgIGlmICh0aGlzLnN0ZXAgPT09IDApIHJldHVybiB0aGlzLnJlZnVzZSgnY2xhbXBlZCcpO1xuICAgIHJldHVybiB0aGlzLm1vdmVUbyh0aGlzLnN0ZXAgLSAxKTtcbiAgfVxuXG4gIG5leHQoKTogTW92ZTxUTWV0YT4ge1xuICAgIGlmICh0aGlzLnN0b3BzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMucmVmdXNlKCdlbXB0eScpO1xuICAgIGlmICh0aGlzLnN0ZXAgPj0gdGhpcy5zdG9wcy5sZW5ndGggLSAxKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ2NsYW1wZWQnKTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG8odGhpcy5zdGVwICsgMSk7XG4gIH1cblxuICBqdW1wVG8odGFyZ2V0OiBudW1iZXIgfCBzdHJpbmcpOiBNb3ZlPFRNZXRhPiB7XG4gICAgaWYgKHRoaXMuc3RvcHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ2VtcHR5Jyk7XG5cbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBNYXRoLnRydW5jKHRhcmdldCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHN0ZXApKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ21pc3MnKTtcbiAgICAgIGlmIChzdGVwIDwgMCkgcmV0dXJuIHRoaXMucmVmdXNlKCdjbGFtcGVkJywgdGhpcy5zdG9wc1swXSk7XG4gICAgICBpZiAoc3RlcCA+IHRoaXMuc3RvcHMubGVuZ3RoIC0gMSkgcmV0dXJuIHRoaXMucmVmdXNlKCdjbGFtcGVkJywgdGhpcy5zdG9wc1t0aGlzLnN0b3BzLmxlbmd0aCAtIDFdKTtcbiAgICAgIGlmIChzdGVwID09PSB0aGlzLnN0ZXApIHJldHVybiB0aGlzLnJlZnVzZSgnY2xhbXBlZCcpO1xuICAgICAgcmV0dXJuIHRoaXMubW92ZVRvKHN0ZXApO1xuICAgIH1cblxuICAgIC8vIGAnJ2AgaXMgbm90IGFuIGFkZHJlc3M6IGl0IGlzIHdoYXQgdGhlIGJvb2tlbmRzIGFuZCBhbnkgcHJlLXN0YWdlXG4gICAgLy8gcm9vdCBjb21taXQgY2FycnkuIFRob3NlIGFyZSByZWFjaGVkIGJ5IHN0ZXAsIG5ldmVyIGJ5IGlkLlxuICAgIGlmICh0YXJnZXQgPT09ICcnKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ21pc3MnKTtcbiAgICBjb25zdCBoaXQgPSB0aGlzLnN0b3BzLmZpbmQoKHN0b3ApID0+IHN0b3AucnVudGltZVN0YWdlSWQgPT09IHRhcmdldCk7XG4gICAgaWYgKCFoaXQpIHJldHVybiB0aGlzLnJlZnVzZSgnbWlzcycsIHRoaXMubmVhcmVzdFRvKHRhcmdldCkpO1xuICAgIGlmIChoaXQuc3RlcCA9PT0gdGhpcy5zdGVwKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ2NsYW1wZWQnKTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG8oaGl0LnN0ZXApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjbG9zZXN0IG5hbWFibGUgc3RvcCBmb3IgYSBgcnVudGltZVN0YWdlSWRgIHRoYXQgaXMgbm90IG9uIHRoaXMgYXhpczpcbiAgICogdGhlIGxhc3Qgc3RvcCBvZiB0aGUgc2FtZSBTVEFHRSAoYSBkaWZmZXJlbnQgaXRlcmF0aW9uIG9mIHRoZSBzYW1lIG5vZGUpLFxuICAgKiBlbHNlIHRoZSBsYXN0IHN0b3Agd2hvc2UgY29tbWl0IHByZWNlZGVzIHRoZSBtaXNzZWQgaWQncyBleGVjdXRpb24gaW5kZXguXG4gICAqIE5hbWluZyBhIG5laWdoYm91ciBpcyBhIGNvdXJ0ZXN5IGZvciB0aGUgVUkg4oCUIGl0IG5ldmVyIG1vdmVzIHRoZSBjdXJzb3IuXG4gICAqL1xuICBwcml2YXRlIG5lYXJlc3RUbyhydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogU3RvcDxUTWV0YT4gfCB1bmRlZmluZWQge1xuICAgIGlmICghaXNFeGVjdXRpb25LZXkocnVudGltZVN0YWdlSWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN0YWdlUGFydCA9IHN0YWdlSWRPZihydW50aW1lU3RhZ2VJZCk7XG4gICAgY29uc3Qgd2FudGVkID0gZXhlY3V0aW9uSW5kZXhPZihydW50aW1lU3RhZ2VJZCk7XG5cbiAgICBsZXQgc2FtZVN0YWdlOiBTdG9wPFRNZXRhPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYnlJbmRleDogU3RvcDxUTWV0YT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBzdG9wIG9mIHRoaXMuc3RvcHMpIHtcbiAgICAgIGlmICghaXNFeGVjdXRpb25LZXkoc3RvcC5ydW50aW1lU3RhZ2VJZCkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHN0YWdlSWRPZihzdG9wLnJ1bnRpbWVTdGFnZUlkKSA9PT0gc3RhZ2VQYXJ0KSBzYW1lU3RhZ2UgPSBzdG9wO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4od2FudGVkKSkge1xuICAgICAgICBjb25zdCBpZHggPSBleGVjdXRpb25JbmRleE9mKHN0b3AucnVudGltZVN0YWdlSWQpO1xuICAgICAgICBpZiAoIU51bWJlci5pc05hTihpZHgpICYmIGlkeCA8PSB3YW50ZWQpIGJ5SW5kZXggPSBzdG9wO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2FtZVN0YWdlID8/IGJ5SW5kZXg7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBzdGF0ZUF0KHN0b3A/OiBTdG9wPFRNZXRhPik6IEZvbGRlZFN0YXRlIHtcbiAgICBjb25zdCB0YXJnZXQgPSBzdG9wID8/IHRoaXMuYXQoKTtcbiAgICBjb25zdCBsZWcgPSB0YXJnZXQ/LnNvdXJjZUlkeCA/PyAwO1xuICAgIGNvbnN0IGZvbGQgPSBmb2xkTGVnc0Zyb20odGhpcy5sZWdzLCBsZWcsIHRhcmdldCA/IHRhcmdldC5sYXN0Q29tbWl0SWR4IDogLTEsIHRoaXMuZm9sZE1lbW8pO1xuICAgIHRoaXMuZm9sZE1lbW8gPSBmb2xkLm1lbW87XG4gICAgY29uc3QgZm9sZGVkID0gZm9sZC5mb2xkZWQ7XG4gICAgLy8gV2hpY2ggbGVnIHRoZSBpbmRleCBiZWxvbmdzIHRvLCBidXQgb25seSB3aGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUg4oCUXG4gICAgLy8gYSBzaW5nbGUtc291cmNlIGZvbGQga2VlcHMgdGhlIDkuMTcuMCBzaGFwZSBleGFjdGx5LlxuICAgIHJldHVybiB0aGlzLmxlZ3MubGVuZ3RoID4gMSA/IHsgLi4uZm9sZGVkLCBzb3VyY2VJZHg6IGxlZyB9IDogZm9sZGVkO1xuICB9XG5cbiAgY2hhbmdlZFNpbmNlKGZyb20/OiBTdG9wPFRNZXRhPik6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICBjb25zdCB0byA9IHRoaXMuYXQoKTtcbiAgICBpZiAoIXRvKSByZXR1cm4gT2JqZWN0LmZyZWV6ZShbXSk7XG4gICAgY29uc3Qgc3RhcnQgPSBmcm9tID8/IHRoaXMuc3RvcHNbdGhpcy5zdGVwIC0gMV07XG4gICAgLy8gTm8gZWFybGllciBzdG9wICh3ZSBhcmUgYXQgYCdzdGFydCdgKSDih5IgZXZlcnl0aGluZyB1cCB0byBoZXJlOiBub3RoaW5nXG4gICAgLy8gb24gYSBydW4gY3Vyc29yLCBhbmQgdGhlIHN1YmZsb3cncyBgaW5wdXRNYXBwZXJgIHNlZWQgb24gYSBkcmlsbGVkIG9uZVxuICAgIC8vICh0aGUgc3RhcnQgYm9va2VuZCBjb3ZlcnMgdGhlIHNlZWQgdGhhdCBwcmVjZWRlcyBzdGFnZSBvbmUg4oCUIGBjb21taXRTdG9wc2ApLlxuICAgIGNvbnN0IHRvTGVnID0gdG8uc291cmNlSWR4ID8/IDA7XG4gICAgY29uc3QgZnJvbUxlZyA9IHN0YXJ0ID8gc3RhcnQuc291cmNlSWR4ID8/IDAgOiB0b0xlZztcbiAgICBjb25zdCBhZnRlcklkeCA9IHN0YXJ0ID8gc3RhcnQubGFzdENvbW1pdElkeCA6IC0xO1xuICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAvLyBBIHJhbmdlIHRoYXQgY3Jvc3NlcyBhIGNoYWluIHNlYW0gaXMgd2Fsa2VkIGxlZyBieSBsZWc6IHRoZSB0YWlsIG9mIHRoZVxuICAgIC8vIGxlZyBpdCBzdGFydGVkIGluLCBldmVyeSBsZWcgaW4gYmV0d2VlbiB3aG9sZSwgdGhlbiB0aGUgaGVhZCBvZiB0aGUgbGVnXG4gICAgLy8gaXQgZW5kcyBpbi4gQmFja3dhcmRzIHJhbmdlcyB3YWxrIG5vdGhpbmcgYW5kIGdpdmUgYFtdYCwgYXMgYmVmb3JlLlxuICAgIGZvciAobGV0IGxlZyA9IGZyb21MZWc7IGxlZyA8PSB0b0xlZyAmJiBsZWcgPCB0aGlzLmxlZ3MubGVuZ3RoOyBsZWcrKykge1xuICAgICAgY29uc3QgbG9nID0gdGhpcy5sZWdzW2xlZ10ubG9nO1xuICAgICAgY29uc3QgbG8gPSBsZWcgPT09IGZyb21MZWcgPyBhZnRlcklkeCArIDEgOiAwO1xuICAgICAgY29uc3QgaGkgPSBsZWcgPT09IHRvTGVnID8gdG8ubGFzdENvbW1pdElkeCA6IGxvZy5sZW5ndGggLSAxO1xuICAgICAgZm9yIChsZXQgaSA9IGxvOyBpIDw9IGhpOyBpKyspIHtcbiAgICAgICAgY29uc3QgYnVuZGxlID0gbG9nW2ldO1xuICAgICAgICBpZiAoIWJ1bmRsZSkgY29udGludWU7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgYnVuZGxlLnRyYWNlKSBrZXlzLmFkZChlbnRyeS5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoWy4uLmtleXNdLnNvcnQoKSk7XG4gIH1cblxuICAvLyDilIDilIAgTWFya3MgKGxhdyA0OiBiZXNpZGUgdGhlIGxvZywgbmV2ZXIgaW4gaXQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIG1hcmsobmFtZTogc3RyaW5nLCBzdG9wPzogU3RvcDxUTWV0YT4pOiBNYXJrIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBzdG9wID8/IHRoaXMuYXQoKTtcbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBlbnRyeTogTWFyayA9IE9iamVjdC5mcmVlemUoeyBuYW1lLCBydW50aW1lU3RhZ2VJZDogdGFyZ2V0LnJ1bnRpbWVTdGFnZUlkLCBzdGVwOiB0YXJnZXQuc3RlcCB9KTtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX21hcmtzLmZpbmRJbmRleCgobSkgPT4gbS5uYW1lID09PSBuYW1lKTtcbiAgICBpZiAoZXhpc3RpbmcgPj0gMCkgdGhpcy5fbWFya3NbZXhpc3RpbmddID0gZW50cnk7XG4gICAgZWxzZSB0aGlzLl9tYXJrcy5wdXNoKGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICBtYXJrcygpOiByZWFkb25seSBNYXJrW10ge1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKFsuLi50aGlzLl9tYXJrc10pO1xuICB9XG5cbiAganVtcFRvTWFyayhuYW1lOiBzdHJpbmcpOiBNb3ZlPFRNZXRhPiB7XG4gICAgaWYgKHRoaXMuc3RvcHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ2VtcHR5Jyk7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLl9tYXJrcy5maW5kKChtKSA9PiBtLm5hbWUgPT09IG5hbWUpO1xuICAgIGlmICghZW50cnkpIHJldHVybiB0aGlzLnJlZnVzZSgnbWlzcycpO1xuICAgIC8vIFJlc29sdmUgYnkgcnVudGltZVN0YWdlSWQgZmlyc3Qg4oCUIHRoZSBhZGRyZXNzIHRoYXQgc3Vydml2ZXMgYSBjaGFuZ2Ugb2ZcbiAgICAvLyBzdHJhdGVneSDigJQgYW5kIGZhbGwgYmFjayB0byB0aGUgcmVtZW1iZXJlZCBzdGVwIG9ubHkgZm9yIHRoZSBib29rZW5kcyxcbiAgICAvLyB3aGljaCBoYXZlIG5vIHN0YWdlIGlkIG9mIHRoZWlyIG93bi5cbiAgICBjb25zdCBieUlkID0gZW50cnkucnVudGltZVN0YWdlSWRcbiAgICAgID8gdGhpcy5zdG9wcy5maW5kKChzdG9wKSA9PiBzdG9wLnJ1bnRpbWVTdGFnZUlkID09PSBlbnRyeS5ydW50aW1lU3RhZ2VJZClcbiAgICAgIDogdGhpcy5zdG9wc1tlbnRyeS5zdGVwXTtcbiAgICBpZiAoIWJ5SWQpIHJldHVybiB0aGlzLnJlZnVzZSgnbWlzcycsIHRoaXMubmVhcmVzdFRvKGVudHJ5LnJ1bnRpbWVTdGFnZUlkKSk7XG4gICAgaWYgKGJ5SWQuc3RlcCA9PT0gdGhpcy5zdGVwKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ2NsYW1wZWQnKTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG8oYnlJZC5zdGVwKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBEcmlsbGluZyAobGF3IDE6IGEgc2VwYXJhdGUgY3Vyc29yLCBub3QgYSBzZWNvbmQgcG9zaXRpb24pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGRyaWxsKG1vdW50UnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IFRpbWVUcmF2ZWw8VE1ldGE+IHwgdW5kZWZpbmVkIHtcbiAgICAvLyBPbiBhIGNoYWluLCB0aGUgbW91bnQgaXMgbG9va2VkIGZvciBpbiBldmVyeSBsZWcg4oCUIGEgc3ViZmxvdyB0aGF0IHJhblxuICAgIC8vIGJlZm9yZSB0aGUgcGF1c2UgaXMgaW4gdGhlIGZpcnN0IHNuYXBzaG90J3MgcmVzdWx0cywgb25lIHRoYXQgcmFuIGFmdGVyXG4gICAgLy8gaXMgaW4gdGhlIHNlY29uZCdzLiBJZHMgYXJlIHVuaXF1ZSBhY3Jvc3MgYSBzb3VuZCBjaGFpbiAoY2hhaW4udHNcbiAgICAvLyByZWZ1c2VzIG9uZSB3aGVyZSB0aGV5IGFyZSBub3QpLCBzbyB0aGUgZmlyc3QgaGl0IGlzIHRoZSBvbmx5IGhpdC5cbiAgICBsZXQgcmVzdWx0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlc3VsdDogU3ViZmxvd1Jlc3VsdFNoYXBlIHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHRoaXMuc291cmNlcykge1xuICAgICAgLy8gQSBzdG9yZWQgcmVjb3JkaW5nJ3MgcmVzdWx0cyBhcmUgcGFyc2VkIEpTT046IHJlYWQgdGhlbSBhcyBhIG1hcCBvbmx5XG4gICAgICAvLyB3aGVuIHRoZXkgYXJlIG9uZSwgYW5kIGFzIFwibm8gc3ViZmxvd3NcIiBvdGhlcndpc2UuXG4gICAgICBpZiAoIWlzUGxhaW5pc2goc291cmNlLnN1YmZsb3dSZXN1bHRzKSkgY29udGludWU7XG4gICAgICBjb25zdCBoaXQgPSBzb3VyY2Uuc3ViZmxvd1Jlc3VsdHNbbW91bnRSdW50aW1lU3RhZ2VJZF0gYXMgU3ViZmxvd1Jlc3VsdFNoYXBlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGhpdCkge1xuICAgICAgICByZXN1bHRzID0gc291cmNlLnN1YmZsb3dSZXN1bHRzO1xuICAgICAgICByZXN1bHQgPSBoaXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB0cmVlID0gcmVzdWx0Py50cmVlQ29udGV4dDtcbiAgICBpZiAoIXJlc3VsdHMgfHwgIXJlc3VsdCB8fCAhdHJlZSB8fCAhQXJyYXkuaXNBcnJheSh0cmVlLmhpc3RvcnkpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gYHBhdGhgIGlzIHRoZSBzdWJmbG93IFBBVEgg4oCUIHRoZSBzYW1lIHN0cmluZyBmb3IgZXZlcnkgaXRlcmF0aW9uIG9mIGFcbiAgICAvLyBtb3VudCBpbnNpZGUgYSBsb29wLiBgbW91bnRSdW50aW1lU3RhZ2VJZGAgaXMgdGhlIGl0ZXJhdGlvbiBhY3R1YWxseVxuICAgIC8vIG9wZW5lZCwgc28gYSBVSSBjYW4gbGFiZWwgYW5kIGtleSB0aHJlZSBkcmlsbCBwYW5lbHMgb3ZlciBgc2Z4IzJgLFxuICAgIC8vIGBzZngjOGAsIGBzZngjMTRgIGFwYXJ0IGluc3RlYWQgb2YgY2FsbGluZyBhbGwgdGhyZWUgJ3NmeCcuXG4gICAgY29uc3QgY2hpbGRQYXRoID0gcmVzdWx0LnN1YmZsb3dJZCA/PyBtb3VudFJ1bnRpbWVTdGFnZUlkO1xuICAgIGNvbnN0IGNoaWxkOiBUaW1lVHJhdmVsU291cmNlID0ge1xuICAgICAgLy8gUm93cyBhcmUgbmFycm93ZWQgcGVyIGJ1bmRsZSB3aGVuIHRoZSBjaGlsZCByZWFkcyB0aGVtIOKAlCBhIHN0b3JlZFxuICAgICAgLy8gcmVjb3JkaW5nJ3MgaW5uZXIgaGlzdG9yeSBuZWVkcyBubyBjYXN0IGVpdGhlci5cbiAgICAgIGNvbW1pdExvZzogdHJlZS5oaXN0b3J5LFxuICAgICAgaW5pdGlhbFN0YXRlOiB0cmVlLmluaXRpYWxTdGF0ZSxcbiAgICAgIGV4ZWN1dGlvblRyZWU6IHRyZWUuc3RhZ2VDb250ZXh0cyxcbiAgICAgIC8vIE5lc3RlZCBzdWJmbG93IHJlc3VsdHMgYXJlIG1lcmdlZCBVUCBpbnRvIG9uZSBmbGF0LCBkdWFsLWtleWVkIG1hcCwgc29cbiAgICAgIC8vIHRoZSBjaGlsZCBjYW4gZHJpbGwgZnVydGhlciB0aHJvdWdoIHRoZSBzYW1lIG1hcC5cbiAgICAgIHN1YmZsb3dSZXN1bHRzOiByZXN1bHRzLFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBDdXJzb3I8VE1ldGE+KFtjaGlsZF0sIHsgc3RyYXRlZ3k6IHRoaXMub3B0aW9ucy5zdHJhdGVneSB9LCBjaGlsZFBhdGgsIHRoaXMsIG1vdW50UnVudGltZVN0YWdlSWQpO1xuICB9XG59XG5cbi8qKlxuICogUmUtc3RlcCBwZXItc291cmNlIHN0b3BzIGludG8gT05FIGF4aXMuXG4gKlxuICogVGhlIElOVEVSSU9SIGJvb2tlbmRzIGdvOiBhIGAnc3RhcnQnYCBvbiBhbnkgbGVnIGJ1dCB0aGUgZmlyc3QsIGFuZCBhblxuICogYCdlbmQnYCBvbiBhbnkgbGVnIGJ1dCB0aGUgbGFzdCwgYXJlIGJvb2tlbmRzIG9mIGEgbGVnIGFuZCBub3Qgb2YgdGhlIHJ1biDigJRcbiAqIGtlZXBpbmcgdGhlbSB3b3VsZCBwdXQgXCJ0aGUgcnVuIGlzIG92ZXJcIiBpbiB0aGUgbWlkZGxlIG9mIHRoZSBheGlzLiBUaGVcbiAqIGNvbW1pdHMgdGhleSBjb3ZlcmVkIGFyZSBub3Qgb3JwaGFuZWQ6IGEgZm9sZCBhbHdheXMgcmVwbGF5cyBpdHMgbGVnIGZyb21cbiAqIHRoYXQgbGVnJ3Mgb3duIGJhc2UsIGFuZCBgY2hhbmdlZFNpbmNlYCB3YWxrcyBhIHNlYW0tY3Jvc3NpbmcgcmFuZ2UgbGVnIGJ5XG4gKiBsZWcgKGluY2x1ZGluZyB0aGUgaGVhZCBvZiB0aGUgbGVnIGl0IGVuZHMgaW4pLiBUaGUgc3RvcHMnIGBjb21taXRJZHhgIC9cbiAqIGBsYXN0Q29tbWl0SWR4YCByYW5nZXMgUEFSVElUSU9OIEVBQ0ggTEVHLCBuZXZlciBzcGFuIHRoZSBzZWFtOiBhIHN0b3Anc1xuICogcmFuZ2UgZW5kcyBhdCBpdHMgb3duIGxlZydzIGxhc3QgaW5kZXgsIGFuZCB0aGUgbmV4dCBsZWcncyBmaXJzdCBzdG9wIG9wZW5zXG4gKiBhdCB0aGF0IGxlZydzIDAuXG4gKi9cbmZ1bmN0aW9uIGNoYWluU3RvcHM8VE1ldGE+KHBlclNvdXJjZTogcmVhZG9ubHkgU3RvcDxUTWV0YT5bXVtdKTogU3RvcDxUTWV0YT5bXSB7XG4gIC8vIFwiSW50ZXJpb3JcIiBpcyBtZWFzdXJlZCBhZ2FpbnN0IHRoZSBsZWdzIHRoYXQgYWN0dWFsbHkgQ09OVFJJQlVURSBzdG9wczogYVxuICAvLyBsZWcgd2hvc2UgbG9nIHdhcyBlbXB0eSBoYXMgbm8gYm9va2VuZHMgdG8gZHJvcCBhbmQgbXVzdCBub3QgbWFrZSBpdHNcbiAgLy8gbmVpZ2hib3VyJ3MgYCdzdGFydCdgIG9yIGAnZW5kJ2AgaW50ZXJpb3Ig4oCUIHRoZSBjaGFpbmVkIGF4aXMgc3RpbGwgb3BlbnNcbiAgLy8gd2l0aCB0aGUgZmlyc3Qgc3RvcCB0aGF0IGV4aXN0cyBhbmQgY2xvc2VzIHdpdGggdGhlIGxhc3QuXG4gIGNvbnN0IGNvbnRyaWJ1dGluZyA9IHBlclNvdXJjZS5tYXAoKHN0b3BzKSA9PiBzdG9wcy5sZW5ndGggPiAwKTtcbiAgY29uc3QgZmlyc3RMZWcgPSBjb250cmlidXRpbmcuaW5kZXhPZih0cnVlKTtcbiAgY29uc3QgbGFzdExlZyA9IGNvbnRyaWJ1dGluZy5sYXN0SW5kZXhPZih0cnVlKTtcbiAgY29uc3Qgb3V0OiBTdG9wPFRNZXRhPltdID0gW107XG4gIGZvciAoY29uc3QgW3NvdXJjZUlkeCwgc3RvcHNdIG9mIHBlclNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBmb3IgKGNvbnN0IHN0b3Agb2Ygc3RvcHMpIHtcbiAgICAgIGlmIChzb3VyY2VJZHggPiBmaXJzdExlZyAmJiBzdG9wLmtpbmQgPT09ICdzdGFydCcpIGNvbnRpbnVlO1xuICAgICAgaWYgKHNvdXJjZUlkeCA8IGxhc3RMZWcgJiYgc3RvcC5raW5kID09PSAnZW5kJykgY29udGludWU7XG4gICAgICBvdXQucHVzaCh7IC4uLnN0b3AsIHN0ZXA6IG91dC5sZW5ndGgsIHNvdXJjZUlkeCB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBPcGVuIGEgcmVhZGVyJ3MgY3Vyc29yIG92ZXIgYSBmaW5pc2hlZCBydW4uXG4gKlxuICogTm90aGluZyBoZXJlIGV4ZWN1dGVzIGFueXRoaW5nOiBgc25hcHNob3RgIGlzIGEgcmVjb3JkIG9mIGEgcnVuIHRoYXQgYWxyZWFkeVxuICogaGFwcGVuZWQsIGFuZCBldmVyeSBxdWVzdGlvbiBpcyBhbnN3ZXJlZCBieSByZWFkaW5nIGl0LiBBIHN0b3JlZCBKU09OXG4gKiBzbmFwc2hvdCB3b3JrcyBleGFjdGx5IGxpa2UgYSBsaXZlIG9uZSDigJQgc2luY2UgOS4xOC4wIGl0cyBgY29tbWl0TG9nYCBtYXkgYmVcbiAqIGFuIHVudmFsaWRhdGVkIGB1bmtub3duW11gLCBuYXJyb3dlZCBwZXIgYnVuZGxlIHdoZXJlIHRoZSBmb2xkIHJlYWRzIGl0LCBzb1xuICogYSByZXBsYXllZCByZWNvcmRpbmcgbmVlZHMgbm8gY2FzdC5cbiAqXG4gKiBAcGFyYW0gc25hcHNob3QgYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgLCBvciBhbnkgb2JqZWN0IHdpdGggdGhlIHNhbWVcbiAqICAgc2hhcGUg4oCUIGluY2x1ZGluZyBvbmUgcm91bmQtdHJpcHBlZCB0aHJvdWdoIEpTT04sIG9yIGEgc3ViZmxvdyBzdWJ0cmVlXG4gKiAgIChgZ2V0U3VidHJlZVNuYXBzaG90KClgLCB3aG9zZSBsb2cgaXMgc3BlbGxlZCBgaGlzdG9yeWApLiBBbiBBUlJBWSBvZiB0aGVtXG4gKiAgIGlzIGEgQ0hBSU46IGEgcGF1c2UgYW5kIGl0cyByZXN1bWUgcmVhZCBhcyBvbmUgYXhpcyAoc2VlIGJlbG93KS5cbiAqIEBwYXJhbSBvcHRpb25zIGBzdHJhdGVneWAgY2hvb3NlcyBob3cgc3RvcHMgYXJlIGRlcml2ZWQgKGRlZmF1bHQ6XG4gKiAgIGBjb21taXRTdG9wc2AsIG9uZSBzdG9wIHBlciBleGVjdXRlZCBzdGFnZSk7IGBtYXJrc2Agc2VlZHMgdGhlIGN1cnNvciB3aXRoXG4gKiAgIGJvb2ttYXJrcywgZS5nLiByZXN0b3JlZCBmcm9tIGEgc2F2ZWQgcmVhZGluZyBzZXNzaW9uLlxuICpcbiAqIEB0aHJvd3Mgd2hlbiBhIGNoYWluIGlzIG5vdCBpbiBydW4gb3JkZXIsIG9yIGl0cyBsZWdzIGFyZSBub3QgZnJvbSBvbmVcbiAqICAgbGluZWFnZSDigJQgdGhyZWUgY2hlY2tzLCBlYWNoIHdpdGggaXRzIG93biByZWFzb24gKHNlZSBgY2hhaW4udHNgKTpcbiAqICAgbm8gYHJ1bnRpbWVTdGFnZUlkYCBtYXkgYXBwZWFyIGluIHR3byBsZWdzOyBlYWNoIGxlZydzIGZpcnN0IGV4ZWN1dGlvblxuICogICBpbmRleCBtdXN0IGJlIHBhc3QgdGhlIHByZXZpb3VzIGxlZydzIGxhc3QgKHRoZSBlbmdpbmUgbmV2ZXIgcmVzZXRzIHRoZVxuICogICBjb3VudGVyIGFjcm9zcyBhIHJlc3VtZSk7IGFuZCBlYWNoIGxlZydzIGBpbml0aWFsU3RhdGVgIG11c3QgZGVlcC1lcXVhbFxuICogICB0aGUgc3RhdGUgdGhlIGxlZ3MgYmVmb3JlIGl0IGZvbGQgdG8g4oCUIG9uIGEgcmVzdW1lIHRoYXQgYmFzZSBJUyB0aGUgc3RhdGVcbiAqICAgYXQgdGhlIHBhdXNlLCBzbyBhIGZvcmVpZ24gbGVnIHdob3NlIGluZGljZXMgbWVyZWx5IGhhcHBlbiB0byBiZSBoaWdoZXJcbiAqICAgaXMgcmVmdXNlZCB0b28uIFRoZSB0aGlyZCBjaGVjayBydW5zIG9ubHkgd2hlcmUgdGhlIHJlY29yZCBhbGxvd3MgaXQ6IHRoZVxuICogICBsYXRlciBsZWcgbXVzdCBjYXJyeSBhbiBgaW5pdGlhbFN0YXRlYCBhbmQgdGhlIGVhcmxpZXIgbGVncyBtdXN0IGZvbGQgZnJvbVxuICogICBhIHJlYWwgYmFzZSB3aXRoIG5vIHVucmVhZGFibGUgcm93czsgb3RoZXJ3aXNlIChhbiBvbGRlciByZWNvcmRpbmcgd2l0aFxuICogICBubyBiYXNlKSB0aGUgY2hhaW4gcmVzdHMgb24gdGhlIHR3byBpbmRleCBjaGVja3MgYWxvbmUsIGFuZCB0aGUgZm9sZCdzXG4gKiAgIGBiYXNpc2Agc2F5cyB3aGF0IGl0IHN0b29kIG9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB0dCA9IHRpbWVUcmF2ZWwoZXhlY3V0b3IuZ2V0U25hcHNob3QoKSk7XG4gKiB0dC5qdW1wVG8oJ3Njb3JlLXJpc2sjNCcpO1xuICogY29uc29sZS5sb2codHQuY2hhbmdlZFNpbmNlKCkpOyAgICAgICAgLy8gWydyaXNrU2NvcmUnLCAndGllciddXG4gKiBjb25zb2xlLmxvZyh0dC5zdGF0ZUF0KCkuc3RhdGUpOyAgICAgICAvLyBzdGF0ZSBhcyB0aGF0IHN0YWdlIGxlZnQgaXRcbiAqIHR0Lm1hcmsoJ3RoZSBiYWQgb25lJyk7XG4gKiBjb25zdCBpbm5lciA9IHR0LmRyaWxsKCdzZi1wYXltZW50IzcnKTsgLy8gYSBzZXBhcmF0ZSBjdXJzb3IsIGl0cyBvd24gbG9nXG4gKlxuICogLy8gQSBwYXVzZSBhbmQgaXRzIHJlc3VtZSwgcmVhZCBhcyBPTkUgYXhpczpcbiAqIGNvbnN0IGNoYWluZWQgPSB0aW1lVHJhdmVsKFtwYXVzZWRTbmFwc2hvdCwgcmVzdW1lZFNuYXBzaG90XSk7XG4gKiBjaGFpbmVkLmxhc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1bidzIHJlYWwgZW5kXG4gKiBjaGFpbmVkLmF0KCkhLnNvdXJjZUlkeDsgICAgICAgICAgICAgICAgLy8gMSDigJQgd2hpY2ggbGVnIHRoZSBpbmRpY2VzIGFyZSBpblxuICogY2hhaW5lZC5qdW1wVG8oJ2FwcHJvdmUjMycpOyAgICAgICAgICAgIC8vIGZpbmRzIGl0IGluIGVpdGhlciBsZWdcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZVRyYXZlbDxUTWV0YSA9IHVua25vd24+KFxuICBzbmFwc2hvdDogVGltZVRyYXZlbFNvdXJjZSB8IHJlYWRvbmx5IFRpbWVUcmF2ZWxTb3VyY2VbXSxcbiAgb3B0aW9uczogVGltZVRyYXZlbE9wdGlvbnM8VE1ldGE+ID0ge30sXG4pOiBUaW1lVHJhdmVsPFRNZXRhPiB7XG4gIGNvbnN0IHNvdXJjZXMgPSBBcnJheS5pc0FycmF5KHNuYXBzaG90KSA/IChzbmFwc2hvdCBhcyByZWFkb25seSBUaW1lVHJhdmVsU291cmNlW10pIDogW3NuYXBzaG90IGFzIFRpbWVUcmF2ZWxTb3VyY2VdO1xuICAvLyBBIG9uZS1lbGVtZW50IGFycmF5IGlzIG5vdCBhIGNoYWluOiBpdCBpcyB0aGUgcGxhaW4gY3Vyc29yLCBhbmQgc2tpcHMgdGhlXG4gIC8vIGxpbmVhZ2UgY2hlY2tzIGEgc2luZ2xlIHNvdXJjZSBjYW5ub3QgZmFpbC5cbiAgaWYgKHNvdXJjZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgY29uc3QgcmVmdXNhbCA9IHJlZnVzZUNoYWluKHNvdXJjZXMubWFwKChzb3VyY2UpID0+IHJlYWRTb3VyY2Uoc291cmNlKSkpO1xuICAgIGlmIChyZWZ1c2FsKSB0aHJvdyBuZXcgRXJyb3IocmVmdXNhbCk7XG4gIH1cbiAgcmV0dXJuIG5ldyBDdXJzb3I8VE1ldGE+KHNvdXJjZXMsIG9wdGlvbnMpO1xufVxuIl19
@@ -1,24 +0,0 @@
1
- "use strict";
2
- /**
3
- * time-travel/types.ts — the shapes of the reader's cursor.
4
- *
5
- * WHY THIS MODULE EXISTS (context for future readers, human or LLM):
6
- * Time travel in footprintjs is a READER'S cursor over a FINISHED trace, with
7
- * a fold at each stop. It is not the Walker — the engine's traversal — and it
8
- * must never become a second live cursor: nothing here can move, re-run or
9
- * mutate an execution. Every consumer (a why-panel, a flow view, a chart
10
- * dashboard) was writing the same commit-index arithmetic by hand, from the
11
- * same commit log, and disagreeing about the answers. This is that arithmetic,
12
- * once, in the library that owns the substrate.
13
- *
14
- * DAG position: memory ← time-travel. Every file here is a record file
15
- * (`RECORD_FILES`, scripts/layering.config.cjs, C6): it may import only record
16
- * files — memory/, the id grammar (`ids/runtimeStageId`), and the record's two
17
- * capture/ leaves (`freeze`, `valueKinds`). Recorders, traversal and runner
18
- * must never be imported here; the snapshot arrives as a plain structural
19
- * shape ({@link FoldSource}, {@link TimeTravelSource}, the record's own
20
- * `ExecutionTree` for the tree) so a stored JSON trace works exactly like a
21
- * live `getSnapshot()`.
22
- */
23
- Object.defineProperty(exports, "__esModule", { value: true });
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWUtdHJhdmVsL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHRpbWUtdHJhdmVsL3R5cGVzLnRzIOKAlCB0aGUgc2hhcGVzIG9mIHRoZSByZWFkZXIncyBjdXJzb3IuXG4gKlxuICogV0hZIFRISVMgTU9EVUxFIEVYSVNUUyAoY29udGV4dCBmb3IgZnV0dXJlIHJlYWRlcnMsIGh1bWFuIG9yIExMTSk6XG4gKiBUaW1lIHRyYXZlbCBpbiBmb290cHJpbnRqcyBpcyBhIFJFQURFUidTIGN1cnNvciBvdmVyIGEgRklOSVNIRUQgdHJhY2UsIHdpdGhcbiAqIGEgZm9sZCBhdCBlYWNoIHN0b3AuIEl0IGlzIG5vdCB0aGUgV2Fsa2VyIOKAlCB0aGUgZW5naW5lJ3MgdHJhdmVyc2FsIOKAlCBhbmQgaXRcbiAqIG11c3QgbmV2ZXIgYmVjb21lIGEgc2Vjb25kIGxpdmUgY3Vyc29yOiBub3RoaW5nIGhlcmUgY2FuIG1vdmUsIHJlLXJ1biBvclxuICogbXV0YXRlIGFuIGV4ZWN1dGlvbi4gRXZlcnkgY29uc3VtZXIgKGEgd2h5LXBhbmVsLCBhIGZsb3cgdmlldywgYSBjaGFydFxuICogZGFzaGJvYXJkKSB3YXMgd3JpdGluZyB0aGUgc2FtZSBjb21taXQtaW5kZXggYXJpdGhtZXRpYyBieSBoYW5kLCBmcm9tIHRoZVxuICogc2FtZSBjb21taXQgbG9nLCBhbmQgZGlzYWdyZWVpbmcgYWJvdXQgdGhlIGFuc3dlcnMuIFRoaXMgaXMgdGhhdCBhcml0aG1ldGljLFxuICogb25jZSwgaW4gdGhlIGxpYnJhcnkgdGhhdCBvd25zIHRoZSBzdWJzdHJhdGUuXG4gKlxuICogREFHIHBvc2l0aW9uOiBtZW1vcnkg4oaQIHRpbWUtdHJhdmVsLiBFdmVyeSBmaWxlIGhlcmUgaXMgYSByZWNvcmQgZmlsZVxuICogKGBSRUNPUkRfRklMRVNgLCBzY3JpcHRzL2xheWVyaW5nLmNvbmZpZy5janMsIEM2KTogaXQgbWF5IGltcG9ydCBvbmx5IHJlY29yZFxuICogZmlsZXMg4oCUIG1lbW9yeS8sIHRoZSBpZCBncmFtbWFyIChgaWRzL3J1bnRpbWVTdGFnZUlkYCksIGFuZCB0aGUgcmVjb3JkJ3MgdHdvXG4gKiBjYXB0dXJlLyBsZWF2ZXMgKGBmcmVlemVgLCBgdmFsdWVLaW5kc2ApLiBSZWNvcmRlcnMsIHRyYXZlcnNhbCBhbmQgcnVubmVyXG4gKiBtdXN0IG5ldmVyIGJlIGltcG9ydGVkIGhlcmU7IHRoZSBzbmFwc2hvdCBhcnJpdmVzIGFzIGEgcGxhaW4gc3RydWN0dXJhbFxuICogc2hhcGUgKHtAbGluayBGb2xkU291cmNlfSwge0BsaW5rIFRpbWVUcmF2ZWxTb3VyY2V9LCB0aGUgcmVjb3JkJ3Mgb3duXG4gKiBgRXhlY3V0aW9uVHJlZWAgZm9yIHRoZSB0cmVlKSBzbyBhIHN0b3JlZCBKU09OIHRyYWNlIHdvcmtzIGV4YWN0bHkgbGlrZSBhXG4gKiBsaXZlIGBnZXRTbmFwc2hvdCgpYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlZ2lzdGVyZWRDb2RlIH0gZnJvbSAnLi4vbWVtb3J5L2hvbmVzdHkuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUsIEV4ZWN1dGlvblRyZWUgfSBmcm9tICcuLi9tZW1vcnkvdHlwZXMuanMnO1xuXG4vLyDilIDilIAgU291cmNlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBBbnl0aGluZyB0aGF0IGNhcnJpZXMgYSBjb21taXQgbG9nIGFuZCAoaWRlYWxseSkgaXRzIGZvbGQgYmFzZS5cbiAqXG4gKiBUd28gZmllbGQgc3BlbGxpbmdzLCBiZWNhdXNlIHRoZSBsaWJyYXJ5IGFscmVhZHkgaGFzIHR3bzogdGhlIHJ1bidzIGxvZyBpc1xuICogYGNvbW1pdExvZ2AgKGBnZXRTbmFwc2hvdCgpYCksIGEgc3ViZmxvdydzIGlzIGBoaXN0b3J5YFxuICogKGBnZXRTdWJ0cmVlU25hcHNob3QoKWAgLyBgc3ViZmxvd1Jlc3VsdHNbLi4uXS50cmVlQ29udGV4dGApLiBCb3RoIGFyZVxuICogYWNjZXB0ZWQgc28gYSBjYWxsZXIgbmV2ZXIgaGFzIHRvIHJlc2hhcGUgYSBzbmFwc2hvdCB0byBhc2sgYSBxdWVzdGlvbi5cbiAqXG4gKiBCT1RIIFNQRUxMSU5HUyBUQUtFIGByZWFkb25seSB1bmtub3duW11gICg5LjE4LjApLiBBIGxpdmUgc25hcHNob3QgaGFuZHNcbiAqIG92ZXIgcmVhbCB7QGxpbmsgQ29tbWl0QnVuZGxlfXMgYW5kIGlzIGFzc2lnbmFibGUgZXhhY3RseSBhcyBiZWZvcmU7IGFcbiAqIFNUT1JFRCByZWNvcmRpbmcgaXMgcGFyc2VkIEpTT04sIGFuZCBhIGNhcmVmdWwgY29uc3VtZXIgd2lsbCBub3QgY2xhaW0gdGhhdFxuICogd2hhdCBjYW1lIGJhY2sgb2ZmIGRpc2sgaXMgYSBgQ29tbWl0QnVuZGxlYC4gVGhlIG5hcnJvd2luZyB0aGVyZWZvcmUgaGFwcGVuc1xuICogSEVSRSwgcGVyIGJ1bmRsZSwgd2hlcmUgdGhlIGZvbGQgYWN0dWFsbHkgcmVhZHMgb25lIOKAlCB0aGUgb25seSBwbGFjZSB0aGF0XG4gKiBjYW4gaG9uZXN0bHkgZG8gaXQuIEFuIGVudHJ5IHRoYXQgaXMgbm90IGEgYnVuZGxlIGJlY29tZXMgYSBHQVA6IGl0IGtlZXBzXG4gKiBpdHMgaW5kZXggKHNvIGV2ZXJ5IGBjb21taXRJZHhgIHN0aWxsIGFkZHJlc3NlcyB0aGUgc2FtZSBwb3NpdGlvbiksIGl0XG4gKiBjb250cmlidXRlcyBubyBzdGF0ZSwgaXQgZ2V0cyBubyBzdG9wLCBhbmQgYW55IGZvbGQgdGhhdCBjcm9zc2VzIGl0IHJlcG9ydHNcbiAqIGl0IGluIHtAbGluayBGb2xkZWRTdGF0ZS5za2lwcGVkfSB3aXRoIHRoZSBpbmRleCBhbmQgdGhlIHJlYXNvbi5cbiAqXG4gKiBFVkVSWSBGSUVMRCBJUyBPUFRJT05BTCwgZGVsaWJlcmF0ZWx5IHRoZSBzYW1lIHNoYXBlIHtAbGluayBUaW1lVHJhdmVsU291cmNlfVxuICogaGFzOiBhIGNvbnN1bWVyJ3Mgc3RvcmVkLXJlY29yZGluZyB0eXBlIChgY29tbWl0TG9nPzogcmVhZG9ubHkgdW5rbm93bltdYClcbiAqIGRyaXZlcyBgc3RhdGVBdGAgYW5kIGB0aW1lVHJhdmVsYCBhbGlrZSwgd2l0aCBubyBjYXN0IGF0IGVpdGhlci4gQSBzb3VyY2VcbiAqIHdpdGggbmVpdGhlciBzcGVsbGluZyBwcmVzZW50IGZvbGRzIHRvIGl0cyBiYXNlIGFuZCByZXBvcnRzXG4gKiBgdGhyb3VnaENvbW1pdElkeDogLTFgIOKAlCB0aGUgdHJ1dGhmdWwgYW5zd2VyIGZvciBhIGxvZyB0aGF0IHdhcyBub3QgdGhlcmUuXG4gKlxuICogVEhJUyBJUyBBTiBJTlBVVCBTSEFQRS4gTm90aGluZyB0eXBlZCBhcyBhIGBGb2xkU291cmNlYCBwcm9taXNlcyB0aGF0IGl0c1xuICogcm93cyBhcmUgYnVuZGxlczsgY29kZSB0aGF0IHdhbnRzIHRvIHJlYWQgYENvbW1pdEJ1bmRsZWAgZmllbGRzIGJhY2sgT1VUIG9mXG4gKiBvbmUgbXVzdCBuYXJyb3cgZWFjaCByb3cgd2l0aCBgaXNDb21taXRCdW5kbGVgIGZpcnN0LlxuICovXG5leHBvcnQgdHlwZSBGb2xkU291cmNlID0ge1xuICAvKiogVGhlIHJ1bidzIGNvbW1pdCBsb2cuIE1heSBiZSBBQlNFTlQgKGEgc3RvcmVkIHJlY29yZGluZydzIG9wdGlvbmFsIGZpZWxkKTogYW4gYWJzZW50IGxvZyBmb2xkcyB0byB0aGUgYmFzZS4gKi9cbiAgcmVhZG9ubHkgY29tbWl0TG9nPzogcmVhZG9ubHkgdW5rbm93bltdO1xuICAvKiogQSBzdWJmbG93IHN1YnRyZWUncyBvd24gbG9nIOKAlCB0aGUgc2FtZSB0aGluZyB1bmRlciBpdHMgb3RoZXIgbmFtZS4gKi9cbiAgcmVhZG9ubHkgaGlzdG9yeT86IHJlYWRvbmx5IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xuXG4vKipcbiAqIEEgc25hcHNob3Qtc2hhcGVkIHNvdXJjZSBmb3Ige0BsaW5rIHRpbWVUcmF2ZWx9LlxuICpcbiAqIEV2ZXJ5IGZpZWxkIGlzIG9wdGlvbmFsIGFuZCB0aGUgc3RydWN0dXJhbCBvbmVzIGFyZSBgdW5rbm93bmAgKDkuMTguMCksIHNvXG4gKiBhIGxpdmUgYGdldFNuYXBzaG90KClgIGlzIGFzc2lnbmFibGUgZXhhY3RseSBhcyBpdCB3YXMgQU5EIHNvIGlzIGEgc3RvcmVkXG4gKiByZWNvcmRpbmcgYSBjb25zdW1lciB0eXBlZCBob25lc3RseSDigJQgYGNvbW1pdExvZzogcmVhZG9ubHkgdW5rbm93bltdYCxcbiAqIGBleGVjdXRpb25UcmVlOiB1bmtub3duYCDigJQgYmVjYXVzZSBwYXJzZWQgSlNPTiBpcyBub3QgYW4gZXhlY3V0aW9uIHRyZWVcbiAqIHVudGlsIHNvbWV0aGluZyBzYXlzIHNvLiBUaGUgbmFycm93aW5nIGhhcHBlbnMgaW5zaWRlOiByb3dzIHBlciBidW5kbGVcbiAqIChzZWUge0BsaW5rIEZvbGRTb3VyY2V9KSwgdGhlIHRyZWUgYW5kIHRoZSBzdWJmbG93IHJlc3VsdHMgYXMgcGxhaW5cbiAqIG9iamVjdHMsIGFueXRoaW5nIGVsc2UgcmVhZCBhcyBhYnNlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVRyYXZlbFNvdXJjZSB7XG4gIC8qKiBUaGUgcnVuJ3MgY29tbWl0IGxvZy4gU2VlIHtAbGluayBGb2xkU291cmNlfSBvbiB3aHkgdGhpcyBpcyBgdW5rbm93bltdYC4gKi9cbiAgcmVhZG9ubHkgY29tbWl0TG9nPzogcmVhZG9ubHkgdW5rbm93bltdO1xuICAvKiogQSBzdWJmbG93IHN1YnRyZWUncyBvd24gbG9nIOKAlCB0aGUgc2FtZSB0aGluZyB1bmRlciBpdHMgb3RoZXIgbmFtZS4gKi9cbiAgcmVhZG9ubHkgaGlzdG9yeT86IHJlYWRvbmx5IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgZXhlY3V0aW9uIHRyZWUgKGBnZXRTbmFwc2hvdCgpLmV4ZWN1dGlvblRyZWVgKSDigJQgd2hhdCBtYWtlcyBhXG4gICAqIG1vdW50IHN0b3Agc2F5IGBraW5kOiAnbW91bnQnYCBhdXRob3JpdGF0aXZlbHkgaW5zdGVhZCBvZiBieSBzaGFwZS4gQSBsaXZlXG4gICAqIHNuYXBzaG90IGhhbmRzIGl0cyBgU3RhZ2VTbmFwc2hvdGAgdHJlZSwgd2hpY2ggaXMgYW4ge0BsaW5rIEV4ZWN1dGlvblRyZWV9O1xuICAgKiBhIHN0b3JlZCBvbmUgaGFuZHMgcGFyc2VkIEpTT04sIHdoaWNoIGlzIHJlYWQgYXMgYSB0cmVlIHdoZW4gaXQgaXMgYSBwbGFpblxuICAgKiBvYmplY3QgYW5kIGlnbm9yZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uVHJlZT86IEV4ZWN1dGlvblRyZWUgfCB1bmtub3duO1xuICAvKipcbiAgICogRHVhbC1rZXllZCBzdWJmbG93IHJlc3VsdHMgKGBnZXRTbmFwc2hvdCgpLnN1YmZsb3dSZXN1bHRzYCkg4oCUIHdoYXRcbiAgICoge0BsaW5rIFRpbWVUcmF2ZWwuZHJpbGx9IG5hdmlnYXRlcy4gQWJzZW50LCBvciBub3QgYSBwbGFpbiBvYmplY3Qg4oeSXG4gICAqIGBkcmlsbGAgYWx3YXlzIHJldHVybnMgYHVuZGVmaW5lZGAsIHdoaWNoIGlzIHRoZSBob25lc3QgYW5zd2VyIGZvciBhIHJ1blxuICAgKiB3aXRoIG5vIHN1YmZsb3dzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1Jlc3VsdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd247XG59XG5cbi8qKlxuICogT25lIGVudHJ5IG9mIGEgc291cmNlJ3MgbG9nIHRoYXQgY291bGQgbm90IGJlIHJlYWQgYXMgYSB7QGxpbmsgQ29tbWl0QnVuZGxlfS5cbiAqXG4gKiBSZXBvcnRlZCByYXRoZXIgdGhhbiB0aHJvd246IGEgc3RvcmVkIHJlY29yZGluZyB3aXRoIG9uZSBjb3JydXB0IHJvdyBpc1xuICogc3RpbGwgd29ydGggcmVhZGluZywgYW5kIGEgcmVhZGVyIHRoYXQgaXMgdG9sZCBXSElDSCBpbmRleCBpdCBsb3N0IGNhbiBzYXlcbiAqIHNvIG9uIHNjcmVlbi4gYGluZGV4YCBpcyB0aGUgcG9zaXRpb24gaW4gdGhhdCBzb3VyY2UncyBvd24gbG9nLlxuICpcbiAqIFJlZ2lzdHJ5IGNvZGU6IGAnbG9nLWdhcCdgIChgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AsIHNlcnZlZCBvblxuICogYGZvb3RwcmludGpzL3RyYWNlYCkgc2F5cyB3aGF0IGEgZ2FwIG1lYW5zLiBBIGdhcCBjYXJyaWVzIG5vIGBjb2RlYCBmaWVsZCDigJRcbiAqIGl0IGlzIHJlZ2lzdGVyZWQgc28gYSByZWFkZXIgZXhwbGFpbnMgaXQgZnJvbSB0aGUgc2FtZSBwbGFjZSBhcyB0aGUgb3RoZXJcbiAqIGhvbmVzdHkgc2lnbmFscy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dHYXAge1xuICAvKiogQVJSQVkgSU5ERVggaW4gdGhlIHNvdXJjZSdzIGxvZyDigJQgdGhlIGFkZHJlc3MgdGhlIGdhcCBvY2N1cGllcy4gKi9cbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcbiAgLyoqIFdoeSBpdCBpcyBub3QgYSBidW5kbGUsIGluIHdvcmRzIGEgVUkgY2FuIHByaW50LiAqL1xuICByZWFkb25seSByZWFzb246IHN0cmluZztcbn1cblxuLy8g4pSA4pSAIFN0b3BzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFdoYXQga2luZCBvZiBwb3NpdGlvbiBhIHN0b3AgaXMuXG4gKlxuICogLSBgJ2NvbW1pdCdgIOKAlCBvbmUgZXhlY3V0ZWQgc3RhZ2UuXG4gKiAtIGAnbW91bnQnYCAg4oCUIGEgc3ViZmxvdyBtb3VudDogdGhlIGJvdW5kYXJ5IHdob3NlIGlubmVyIHN0YWdlcyBsaXZlIGluIHRoZVxuICogICBzdWJmbG93J3MgT1dOIGxvZyAoZHJpbGwgaW50byBpdCB3aXRoIHtAbGluayBUaW1lVHJhdmVsLmRyaWxsfSkuXG4gKiAtIGAnc3RhcnQnYCAg4oCUIHRoZSBib29rZW5kIEJFRk9SRSB0aGUgZmlyc3Qgc3RvcCBvZiBUSElTIGF4aXMuIFdoYXQgaXQgZm9sZHNcbiAqICAgZGVwZW5kcyBvbiB0aGUgc3RyYXRlZ3ksIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyBsb2FkLWJlYXJpbmc6XG4gKiAgIC0gb24gYSBzdHJhdGVneSB0aGF0IGtlZXBzIGV2ZXJ5IHN0YWdlIChgY29tbWl0U3RvcHNgLCB0aGUgb25lIHNoaXBwZWQpXG4gKiAgICAgaXQgaXMgdGhlIHJ1bidzIGZvbGQgQkFTRSDigJQgdGhlIHN0YXRlIG5vIGNvbW1pdCBpbmRleCBjYW4gcmVhY2gg4oCUIHBsdXNcbiAqICAgICB0aGUgc3ViZmxvdydzIGBpbnB1dE1hcHBlcmAgc2VlZCB3aGVuIHRoZSBsb2cgb3BlbnMgd2l0aCBvbmUgKHRoZVxuICogICAgIG1vdW50J3MgY29tbWl0LCBzdGFtcGVkIHdpdGggdGhlIG1vdW50J3MgcnVudGltZVN0YWdlSWQgc2luY2UgUjEzIGFuZFxuICogICAgIHdpdGggYCcnYCB0aHJvdWdoIDkuMzMuMCkuIFNvIG9uIGEgZHJpbGxlZCBjdXJzb3IgaXQgaXMgZXhhY3RseSBcInRoZVxuICogICAgIGlucHV0IHRoaXMgc3ViZmxvdyBiZWdhbiB3aXRoXCIuXG4gKiAgIC0gb24gYSBzdHJhdGVneSB0aGF0IEZJTFRFUlMgc3RhZ2VzIG91dCwgdGhlIGNvbW1pdHMgb2YgdGhlIGRyb3BwZWRcbiAqICAgICBzdGFnZXMgdGhhdCByYW4gQkVGT1JFIHRoZSBmaXJzdCBzdXJ2aXZpbmcgc3RvcCBoYXZlIHRvIGZvbGQgc29tZXdoZXJlLFxuICogICAgIGFuZCBgJ3N0YXJ0J2AgaXMgdGhlIG9ubHkgcGxhY2UgdGhleSBjYW4gZ28gd2l0aG91dCBvcnBoYW5pbmcgdGhlbS4gSXRzXG4gKiAgICAgZm9sZCBpcyB0aGVuIHRoZSBiYXNlIFBMVVMgdGhhdCBwcm9sb2d1ZSDigJQgdGhlIHN0YXRlIHRoZSBmaXJzdCBzdG9wXG4gKiAgICAgUkVBRCwgbm90IHRoZSBydW4ncyByYXcgYmFzZS4gU3VjaCBhIHN0YXJ0IE1VU1Qgc2F5IHNvIGJ5IHNldHRpbmdcbiAqICAgICB7QGxpbmsgU3RvcC5wcm9sb2d1ZX07IGEgcmVuZGVyZXIgdGhhdCBtZWFucyBcInRoZSBydW4ncyByYXcgYmFzZVwiIHJlYWRzXG4gKiAgICAgYGtpbmQgPT09ICdzdGFydCcgJiYgIXN0b3AucHJvbG9ndWVgLCBhbmQgZ2V0cyBhIHRydWUgYW5zd2VyIG9uIGV2ZXJ5XG4gKiAgICAgYXhpcyBpbnN0ZWFkIG9mIG9uZSB0aGF0IGlzIHRydWUgb25seSBvbiB0aGUgbGlicmFyeSdzIG93bi5cbiAqIC0gYCdlbmQnYCAgICDigJQgdGhlIGJvb2tlbmQgYWZ0ZXIgdGhlIGxhc3QgY29tbWl0OiBcInRoZSBydW4gaXMgb3ZlclwiLiBJdHNcbiAqICAgZm9sZCBlcXVhbHMgdGhlIGZpbmFsIHN0YWdlJ3MgYnkgY29uc3RydWN0aW9uOyB0aGUgdHdvIGFyZSBkaWZmZXJlbnRcbiAqICAgcXVlc3Rpb25zLCBub3QgYSBkdXBsaWNhdGVkIGFuc3dlci5cbiAqXG4gKiBOT1QgV0lERU5FRCwgREVMSUJFUkFURUxZLiBBIGZpbHRlcmluZyBzdHJhdGVneSdzIHN0YXJ0IGNvdWxkIGhhdmUgYmVlbiBhXG4gKiBmaWZ0aCBraW5kIChgJ3Byb2xvZ3VlJ2ApLCBidXQgYWRkaW5nIGEgbWVtYmVyIHRvIHRoaXMgdW5pb24gYnJlYWtzIGV2ZXJ5XG4gKiBjb25zdW1lciB3aXRoIGFuIGV4aGF1c3RpdmUgYHN3aXRjaGAgb3ZlciBpdCDigJQgYSBjb21waWxlIGVycm9yIGhhbmRlZCB0b1xuICogcmVhZGVycyB3aG8gZGlkIG5vdGhpbmcgd3JvbmcuIEEgZmxhZyBvbiB0aGUgc3RvcCBzYXlzIHRoZSBzYW1lIHRoaW5nIGFuZFxuICogY29zdHMgYW4gZXhpc3RpbmcgcmVhZGVyIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCB0eXBlIFN0b3BLaW5kID0gJ2NvbW1pdCcgfCAnbW91bnQnIHwgJ3N0YXJ0JyB8ICdlbmQnO1xuXG4vKipcbiAqIE9uZSBwb3NpdGlvbiBhIHJlYWRlcidzIGN1cnNvciBjYW4gcmVzdCBhdC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRNZXRhIHRoZSBTVFJBVEVHWSdTIG93biB2b2NhYnVsYXJ5LCBjYXJyaWVkIG9wYXF1ZWx5IGluXG4gKiAgIHtAbGluayBTdG9wLm1ldGF9LiBEZWZhdWx0cyB0byBgdW5rbm93bmAsIHNvIGV2ZXJ5IHByZS05LjE4IGBTdG9wYCBzdGlsbFxuICogICBtZWFucyB3aGF0IGl0IG1lYW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0b3A8VE1ldGEgPSB1bmtub3duPiB7XG4gIC8qKiBQb3NpdGlvbiBpbiBgVGltZVRyYXZlbC5zdG9wc2Ag4oCUIDAtYmFzZWQsIHRoZSBjdXJzb3IncyBzdGVwIG51bWJlci4gKi9cbiAgcmVhZG9ubHkgc3RlcDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHN0YWdlIHRoaXMgc3RvcCBpczogYFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleGAuXG4gICAqIGAnJ2AgZm9yIHRoZSBgJ3N0YXJ0J2AgLyBgJ2VuZCdgIGJvb2tlbmRzLCB3aGljaCBhcmUgbm90IHN0YWdlcy5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBUlJBWSBJTkRFWCBvZiB0aGlzIHN0b3AncyBGSVJTVCBjb21taXQgYnVuZGxlOyBgLTFgIGF0IGAnc3RhcnQnYC5cbiAgICogVGhpcyBpcyB0aGUgc3RvcCdzIGFkZHJlc3Mgb24gdGhlIGNvbW1pdCBheGlzLlxuICAgKlxuICAgKiBJbmRpY2VzIGFyZSBTT1VSQ0UtTE9DQUwuIE9uIGEgY2hhaW5lZCBjdXJzb3IgKHNlZVxuICAgKiB7QGxpbmsgdGltZVRyYXZlbH0pIHRoZXkgaW5kZXggdGhlIGxvZyBvZiB7QGxpbmsgU3RvcC5zb3VyY2VJZHh9LCBuZXZlciBhXG4gICAqIGNvbmNhdGVuYXRpb24g4oCUIGNvbW1pdCBpbmRpY2VzIGFyZSBydW4tbG9jYWwgYW5kIHRoZSBsaWJyYXJ5IHdpbGwgbm90XG4gICAqIGludmVudCBhIGdsb2JhbCBvbmUuXG4gICAqL1xuICByZWFkb25seSBjb21taXRJZHg6IG51bWJlcjtcbiAgLyoqXG4gICAqIEFSUkFZIElOREVYIG9mIHRoZSBMQVNUIGNvbW1pdCBidW5kbGUgZm9sZGVkIGF0IHRoaXMgc3RvcCDigJQgdGhlIGVuZCBvZlxuICAgKiB0aGlzIHN0b3AncyBzbGljZSBvZiB0aGUgbG9nLiBTdG9wcyBQQVJUSVRJT04gdGhlIGxvZywgc28gdGhpcyBpcyB0aGVcbiAgICogaW5kZXgganVzdCBiZWZvcmUgdGhlIG5leHQgc3RvcCBiZWdpbnM7IGl0IGlzIGdyZWF0ZXIgdGhhblxuICAgKiB7QGxpbmsgY29tbWl0SWR4fSB3aGVuZXZlciBhIHN0YWdlIGNvbW1pdHRlZCBtb3JlIHRoYW4gb25lIGJ1bmRsZSAoYVxuICAgKiBzdWJmbG93IG1vdW50J3Mgb3V0cHV0LW1hcHBpbmcgKyBleGl0IHBhaXIsIGEgZm9yayBjaGlsZCdzIGVtcHR5IHJlcGVhdCksXG4gICAqIGFuZCBncmVhdGVyIGFnYWluIG9uIGEgZmlsdGVyaW5nIHN0cmF0ZWd5LCB3aGljaCBhYnNvcmJzIHRoZSBjb21taXRzIG9mXG4gICAqIHRoZSBzdGFnZXMgaXQgZHJvcHBlZC4gRm9sZGluZyB0aHJvdWdoIHRoaXMgaW5kZXgg4oCUIG5vdCB0aHJvdWdoXG4gICAqIGBjb21taXRJZHhgIOKAlCBpcyB3aGF0IG1ha2VzIGBzdGF0ZUF0KHN0b3ApYCBlcXVhbCB0aGUgc3RhdGUgdGhlIG5leHRcbiAgICogc3RhZ2Ugc3RhcnRlZCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdENvbW1pdElkeDogbnVtYmVyO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkIGZyb20gdGhlIGJ1aWxkZXIgKHRoZSBwb3N0LW1vdW50LCBwcmVmaXhlZCBmb3JtKS4gKi9cbiAgcmVhZG9ubHkgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogU3ViZmxvdyBwYXRoIHRoaXMgc3RhZ2UgcmFuIHVuZGVyLCB3aGVuIGl0IHJhbiBpbnNpZGUgb25lLiAqL1xuICByZWFkb25seSBzdWJmbG93UGF0aD86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUg4oCUIHdoYXQgYSBVSSBwdXRzIG9uIHRoZSBheGlzIHRpY2suICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGtpbmQ6IFN0b3BLaW5kO1xuICAvKipcbiAgICogVEhFIFNUUkFURUdZJ1MgT1dOIFZPQ0FCVUxBUlksIGNhcnJpZWQgdmVyYmF0aW0uIFRoZSBwb3J0IGFzc2lnbnMgaXQgTk9cbiAgICogbWVhbmluZzogaXQgbmV2ZXIgcmVhZHMgaXQsIG5ldmVyIHZhbGlkYXRlcyBpdCwgbmV2ZXIgYnJhbmNoZXMgb24gaXQsIGFuZFxuICAgKiBwYXNzZXMgaXQgdGhyb3VnaCBgdGltZVRyYXZlbGAsIGBqdW1wVG9gLCBgZHJpbGxgIGFuZCBtYXJrcyBCWSBSRUZFUkVOQ0VcbiAgICog4oCUIG5ldmVyIGNsb25lZCwgbmV2ZXIgZnJvemVuLiBUaGUgc3RvcCBob2xkcyB0aGUgdmVyeSBvYmplY3QgdGhlIHN0cmF0ZWd5XG4gICAqIHB1dCB0aGVyZSwgc28gYSBtdXRhdGlvbiB0aHJvdWdoIG9uZSBob2xkZXIgaXMgdmlzaWJsZSB0byBldmVyeSBvdGhlci5cbiAgICpcbiAgICogV0hZIElUIEVYSVNUUy4ge0BsaW5rIGtpbmR9IGlzIHRoZSBQT1JUJ3Mgdm9jYWJ1bGFyeSDigJQgdGhlIGZvdXIgcG9zaXRpb25zXG4gICAqIHRoZSBzdWJzdHJhdGUgaXRzZWxmIGtub3dzLiBBIGRvbWFpbiBzdHJhdGVneSBjbGFzc2lmaWVzIHN0YWdlcyBpbiBpdHMgb3duXG4gICAqIHRlcm1zIChhIG1pbGVzdG9uZSwgYSB0dXJuLCBhIHRvb2wgY2FsbCwgYSBiZWF0KSBhbmQgaGFkIG5vd2hlcmUgdG8gcHV0XG4gICAqIHRoYXQsIHNvIHRoZSBhbnN3ZXIgdHJhdmVsbGVkIGJ5IHJlLWRlcml2aW5nIGl0IGZyb20gYHJ1bnRpbWVTdGFnZUlkYCBhdFxuICAgKiBldmVyeSByZWFkOiBhIHNlY29uZCBydW4gb2YgdGhlIGNsYXNzaWZpZXIgdGhhdCBqdXN0IHJhbiwgYW5kIGEgc2Vjb25kXG4gICAqIGNoYW5jZSB0byBkaXNhZ3JlZSB3aXRoIGl0LiBBIHN0b3Agbm93IGNhcnJpZXMgd2hhdCBpdHMgc3RyYXRlZ3kga25ldy5cbiAgICpcbiAgICogQWJzZW50IG9uIGV2ZXJ5IHN0b3AgYGNvbW1pdFN0b3BzYCBwcm9kdWNlcyDigJQgdGhlIHNoaXBwZWQgc3RyYXRlZ3kgaGFzIG5vXG4gICAqIHZvY2FidWxhcnkgYmV5b25kIGBraW5kYCwgYW5kIHNheXMgc28gYnkgb21pc3Npb24gcmF0aGVyIHRoYW4gYnkgYG51bGxgLlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0YT86IFRNZXRhO1xuICAvKipcbiAgICogT25seSBtZWFuaW5nZnVsIG9uIGBraW5kOiAnc3RhcnQnYC4gYHRydWVgIHdoZW4gdGhpcyBzdGFydCBmb2xkcyB0aGVcbiAgICogY29tbWl0cyBvZiBTVEFHRVMgVEhJUyBBWElTIERPRVMgTk9UIFNIT1cg4oCUIHRoZSBwcm9sb2d1ZSBhIGZpbHRlcmluZ1xuICAgKiBzdHJhdGVneSBtdXN0IHB1dCBzb21ld2hlcmUuIEFic2VudCAobmV2ZXIgYGZhbHNlYCkgb24gYW4gYXhpcyB3aG9zZSBzdGFydFxuICAgKiBpcyB0aGUgcnVuJ3MgcmF3IGZvbGQgYmFzZS5cbiAgICpcbiAgICogQSByZWFkZXIgdGhhdCB3YW50cyBcInRoZSBzdGF0ZSBiZWZvcmUgYW55dGhpbmcgcmFuXCIgY2hlY2tzXG4gICAqIGBraW5kID09PSAnc3RhcnQnICYmICFwcm9sb2d1ZWA7IG9uZSB0aGF0IHdhbnRzIFwidGhlIHN0YXRlIHRoZSBmaXJzdCBzdG9wXG4gICAqIHJlYWRcIiBqdXN0IGZvbGRzIHRoZSBzdGFydC4gU2VlIHtAbGluayBTdG9wS2luZH0uXG4gICAqL1xuICByZWFkb25seSBwcm9sb2d1ZT86IHRydWU7XG4gIC8qKlxuICAgKiBXaGljaCBTT1VSQ0UgdGhpcyBzdG9wJ3MgY29tbWl0IGluZGljZXMgYmVsb25nIHRvLCBvbiBhIGNoYWluZWQgY3Vyc29yIOKAlFxuICAgKiB0aGUgcG9zaXRpb24gaW4gdGhlIGFycmF5IGhhbmRlZCB0byB7QGxpbmsgdGltZVRyYXZlbH0uIEFic2VudCBvbiBhIGN1cnNvclxuICAgKiBvdmVyIGEgc2luZ2xlIHNvdXJjZSwgd2hpY2ggaXMgZXZlcnkgY3Vyc29yIGJ1aWx0IGJlZm9yZSA5LjE4LjAuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VJZHg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGBbc3RhcnQsIOKApnN0YWdlcywgZW5kXWAgc2hhcGUgYGNvbW1pdFN0b3BzYCByZXR1cm5zIGZvciBhIE5PTi1FTVBUWSBsb2dcbiAqIOKAlCBzcGxpdCBvdXQsIHNvIGEgc3RyYXRlZ3kgdGhhdCBjb21wb3NlcyBpdCBzdG9wcyB3cml0aW5nIGl0cyBvd24gZ3VhcmQuXG4gKlxuICogU2VlIHtAbGluayBzcGxpdEF4aXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJvb2tlbmRlZEF4aXM8VE1ldGEgPSB1bmtub3duPiB7XG4gIC8qKiBUaGUgYCdzdGFydCdgIGJvb2tlbmQg4oCUIHRoZSBvbmx5IHN0b3AgdGhhdCBtYXkgb3BlbiBhdCBgY29tbWl0SWR4OiAtMWAuICovXG4gIHJlYWRvbmx5IHN0YXJ0OiBTdG9wPFRNZXRhPjtcbiAgLyoqIEV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUgYm9va2VuZHMsIGluIGV4ZWN1dGlvbiBvcmRlci4gTWF5IGJlIGVtcHR5LiAqL1xuICByZWFkb25seSBzdGFnZXM6IHJlYWRvbmx5IFN0b3A8VE1ldGE+W107XG4gIC8qKiBUaGUgYCdlbmQnYCBib29rZW5kIOKAlCB0aGUgb25seSBzdG9wIHRoYXQgZm9sZHMgdGhlIHdob2xlIGxvZy4gKi9cbiAgcmVhZG9ubHkgZW5kOiBTdG9wPFRNZXRhPjtcbn1cblxuLyoqXG4gKiBXaGF0IHtAbGluayBzcGxpdEF4aXN9IGFuc3dlcnMgd2hlbiB0aGVyZSBpcyBubyBib29rZW5kZWQgYXhpcyB0byBzcGxpdC5cbiAqXG4gKiAtIGAnZW1wdHknYCDigJQgbm8gc3RvcHMgYXQgYWxsLiBUaGUgbG9nIGl0c2VsZiB3YXMgZW1wdHk7IGEgdHJ1dGhmdWwgYXhpc1xuICogICB3aXRoIG5vd2hlcmUgdG8gc3RhbmQsIE5PVCBhIGJyb2tlbiBvbmUuXG4gKiAtIGAnbm90LWJvb2tlbmRlZCdgIOKAlCBzdG9wcyBleGlzdCBidXQgdGhlIGZpcnN0IGlzIG5vdCBhIGAnc3RhcnQnYCBvciB0aGVcbiAqICAgbGFzdCBpcyBub3QgYW4gYCdlbmQnYC4gT25seSBhIHN0cmF0ZWd5IGNhbiBjYXVzZSB0aGlzOyBhIHJ1biBjYW5ub3QuXG4gKi9cbmV4cG9ydCB0eXBlIEF4aXNSZWZ1c2FsID0gJ2VtcHR5JyB8ICdub3QtYm9va2VuZGVkJztcblxuLyoqIFRoZSByZXN1bHQgb2Yge0BsaW5rIHNwbGl0QXhpc306IHRoZSBheGlzLCBvciB3aHkgdGhlcmUgaXMgbm9uZS4gKi9cbmV4cG9ydCB0eXBlIEF4aXNTcGxpdDxUTWV0YSA9IHVua25vd24+ID1cbiAgfCAoeyByZWFkb25seSBvazogdHJ1ZSB9ICYgQm9va2VuZGVkQXhpczxUTWV0YT4pXG4gIHwge1xuICAgICAgcmVhZG9ubHkgb2s6IGZhbHNlO1xuICAgICAgcmVhZG9ubHkgcmVhc29uOiBBeGlzUmVmdXNhbDtcbiAgICAgIC8qKiBUaGUga2luZHMgdGhhdCB3ZXJlIGFjdHVhbGx5IHRoZXJlIOKAlCB3aGF0IHRvIHByaW50IGluIHRoZSByZWZ1c2FsLiAqL1xuICAgICAgcmVhZG9ubHkga2luZHM6IHJlYWRvbmx5IFN0b3BLaW5kW107XG4gICAgfTtcblxuLy8g4pSA4pSAIFRoZSBmb2xkIHJlc3VsdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBIb3cgYSBmb2xkZWQgc3RhdGUgd2FzIGRlcml2ZWQg4oCUIHRoZSBob25lc3R5IGZpZWxkIChgJ2luaXRpYWwrbG9nJ2Agb3JcbiAqIGAnbG9nLW9ubHknYCkuIEEgcGFydGlhbCBhbnN3ZXIgc2F5cyBpdCBpcyBwYXJ0aWFsLCBuZXZlciBhIHNpbGVudCBvbmUuXG4gKlxuICogV2hhdCBlYWNoIHZhbHVlIG1lYW5zIGlzIHJlZ2lzdGVyZWQgT05DRSwgd2l0aCB0aGUgb3RoZXIgaG9uZXN0eSBzaWduYWxzLCBpblxuICogYG1lbW9yeS9ob25lc3R5LnRzIMK3IEhPTkVTVFlfQ09ERVNgIChzZXJ2ZWQgYXMgYEhPTkVTVFlfQ09ERVNgIG9uXG4gKiBgZm9vdHByaW50anMvdHJhY2VgKTsgdGhpcyB1bmlvbiBkZWNsYXJlcyBpdHMgbWVtYmVycyB0aHJvdWdoXG4gKiBgUmVnaXN0ZXJlZENvZGVgLCBzbyBhIGNvZGUgdGhlIHJlZ2lzdHJ5IGRvZXMgbm90IGhvbGQgZG9lcyBub3QgY29tcGlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgRm9sZEJhc2lzID0gUmVnaXN0ZXJlZENvZGU8J2luaXRpYWwrbG9nJyB8ICdsb2ctb25seSc+O1xuXG4vKiogQSBkZXRhY2hlZCBmb2xkIG9mIHRoZSBsb2cgdXAgdG8gb25lIHN0b3AuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvbGRlZFN0YXRlIHtcbiAgLyoqIFRoZSBzdGF0ZSwgZGVlcGx5IGZyb3plbiBhbmQgZnVsbHkgZGV0YWNoZWQgZnJvbSB0aGUgZW5naW5lLiAqL1xuICByZWFkb25seSBzdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBIb3cgaXQgd2FzIGRlcml2ZWQg4oCUIHNlZSB7QGxpbmsgRm9sZEJhc2lzfS4gKi9cbiAgcmVhZG9ubHkgYmFzaXM6IEZvbGRCYXNpcztcbiAgLyoqXG4gICAqIGB0cnVlYCB3aGVuIGFueSBjb21taXQgZm9sZGVkIGluIGRlY2xhcmVkIHJlZGFjdGVkIHBhdGhzLCBzbyB0aGlzIHN0YXRlXG4gICAqIGNhcnJpZXMgYCdSRURBQ1RFRCdgIHBsYWNlaG9sZGVycyB3aGVyZSB0aGUgZW5naW5lIHNjcnViYmVkIHZhbHVlcyBhdFxuICAgKiB3cml0ZSB0aW1lLiBUaGUgbG9nIGlzIHJlZGFjdGVkIHdoZXJlIGl0IHdhcyB3cml0dGVuOyBhIGZvbGQgbXVzdCBTQVkgc29cbiAgICogcmF0aGVyIHRoYW4gcHJlc2VudCBhIHNjcnViYmVkIHZhbHVlIGFzIHRoZSByZWFsIG9uZS5cbiAgICpcbiAgICogUmVnaXN0cnkgY29kZTogYCdyZWRhY3RlZCdgIChgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AsIHNlcnZlZCBvblxuICAgKiBgZm9vdHByaW50anMvdHJhY2VgKSBzYXlzIHdoYXQgdGhpcyBmaWVsZCBhbmQge0BsaW5rIEZvbGRlZFN0YXRlLnJlZGFjdGVkUGF0aHN9IG1lYW47XG4gICAqIG5laXRoZXIgY2FycmllcyBhIGBjb2RlYC4gVGhlIHBsYWNlaG9sZGVyIGlzIHRoZSBsb2cncyBzdHJpbmcsXG4gICAqIGBtZW1vcnkvcGxhY2Vob2xkZXJzLnRzIMK3IExPR19QTEFDRUhPTERFUmAuXG4gICAqL1xuICByZWFkb25seSByZWRhY3RlZDogYm9vbGVhbjtcbiAgLyoqIFRoZSByZWRhY3RlZCBwYXRocyBzZWVuIGFjcm9zcyB0aGUgZm9sZGVkIHByZWZpeCDigJQgc29ydGVkLCBkZWR1cGVkLiAqL1xuICByZWFkb25seSByZWRhY3RlZFBhdGhzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIFRoZSBsYXN0IGNvbW1pdCBpbmRleCBmb2xkZWQgaW47IGAtMWAgd2hlbiBub3RoaW5nIHdhcyBmb2xkZWQuICovXG4gIHJlYWRvbmx5IHRocm91Z2hDb21taXRJZHg6IG51bWJlcjtcbiAgLyoqXG4gICAqIEVudHJpZXMgb2YgdGhlIGZvbGRlZCBwcmVmaXggdGhhdCB3ZXJlIG5vdCBjb21taXQgYnVuZGxlcywgd2l0aCB0aGUgaW5kZXhcbiAgICogYW5kIHRoZSByZWFzb24uIEFCU0VOVCB3aGVuIG5vdGhpbmcgd2FzIHNraXBwZWQsIHdoaWNoIGlzIGV2ZXJ5IGZvbGQgb3ZlclxuICAgKiBhIGxpdmUgc25hcHNob3Qg4oCUIGEgY2xlYW4gZm9sZCdzIHNoYXBlIGlzIGJ5dGUtaWRlbnRpY2FsIHRvIDkuMTcuMCdzLlxuICAgKlxuICAgKiBBIGdhcCBjb250cmlidXRlcyBubyBzdGF0ZSwgc28gYSBmb2xkIHRoYXQgcmVwb3J0cyBvbmUgaXMgSU5DT01QTEVURSBhdFxuICAgKiBleGFjdGx5IHRoZSBwbGFjZXMgaXQgbmFtZXMuXG4gICAqL1xuICByZWFkb25seSBza2lwcGVkPzogcmVhZG9ubHkgTG9nR2FwW107XG4gIC8qKlxuICAgKiBXaGljaCBzb3VyY2Ugb2YgYSBDSEFJTiB0aGlzIGZvbGQgZW5kZWQgaW4g4oCUIGB0aHJvdWdoQ29tbWl0SWR4YCBpbmRleGVzXG4gICAqIHRoYXQgc291cmNlJ3MgbG9nLiBBYnNlbnQgb24gYSBzaW5nbGUtc291cmNlIGN1cnNvci5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUlkeD86IG51bWJlcjtcbn1cblxuLy8g4pSA4pSAIE1vdmVtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFdoeSBhIG1vdmUgZGlkIG5vdCBoYXBwZW4uXG4gKlxuICogLSBgJ2NsYW1wZWQnYCDigJQgdGhlIG1vdmUgd291bGQgbGFuZCBPVVRTSURFIHRoZSBheGlzIChgcHJldigpYCBhdCB0aGUgZmlyc3RcbiAqICAgc3RvcCwgYG5leHQoKWAgYXQgdGhlIGxhc3QsIGEgc3RlcCBudW1iZXIgYmVsb3cgMCBvciBwYXN0IHRoZSBlbmQpLCBvciBvblxuICogICB0aGUgdmVyeSBzdG9wIHRoZSBjdXJzb3IgYWxyZWFkeSBzdGFuZHMgb24uIEVpdGhlciB3YXkgbm90aGluZyBtb3ZlZC4gV2hlblxuICogICB0aGUgdGFyZ2V0IHdhcyBvdXQgb2YgcmFuZ2UsIGBuZWFyZXN0YCBuYW1lcyB0aGUgZW5kIHRoYXQgd2FzIGhpdCDigJQgdGhlXG4gKiAgIGN1cnNvciBpdHNlbGYgbWF5IGJlIG5vd2hlcmUgbmVhciBpdC5cbiAqIC0gYCdtaXNzJ2Ag4oCUIHRoZSB0YXJnZXQgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBheGlzLlxuICogLSBgJ2VtcHR5J2Ag4oCUIHRoaXMgY3Vyc29yIGhhcyBubyBzdG9wcyBhdCBhbGwgKGFuIGVtcHR5IGxvZykuXG4gKi9cbmV4cG9ydCB0eXBlIE1vdmVSZWZ1c2FsID0gJ2NsYW1wZWQnIHwgJ21pc3MnIHwgJ2VtcHR5JztcblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIGFza2luZyB0aGUgY3Vyc29yIHRvIG1vdmUuXG4gKlxuICogQSByZWZ1c2VkIG1vdmUgTkVWRVIgbW92ZXMgdGhlIGN1cnNvci4gVGhhdCBpcyB0aGUgbGF3IGEgcmVhZGVyJ3MgVUkgcmVzdHNcbiAqIG9uOiBhIG1pc3R5cGVkIGlkIG9yIGEgc3RlcCBwYXN0IHRoZSBlbmQgbGVhdmVzIHRoZSBwYW5lbCBzaG93aW5nIGV4YWN0bHlcbiAqIHdoYXQgaXQgc2hvd2VkIGJlZm9yZSwgd2l0aCBhIHJlYXNvbiB0byBkaXNwbGF5IOKAlCBuZXZlciBhIHNpbGVudCBqdW1wIHRvXG4gKiBzb21ld2hlcmUgdGhlIHVzZXIgZGlkIG5vdCBhc2sgZm9yLlxuICovXG5leHBvcnQgdHlwZSBNb3ZlPFRNZXRhID0gdW5rbm93bj4gPVxuICB8IHsgcmVhZG9ubHkgbW92ZWQ6IHRydWU7IHJlYWRvbmx5IGZyb206IFN0b3A8VE1ldGE+IHwgdW5kZWZpbmVkOyByZWFkb25seSB0bzogU3RvcDxUTWV0YT4gfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IG1vdmVkOiBmYWxzZTtcbiAgICAgIHJlYWRvbmx5IHJlYXNvbjogTW92ZVJlZnVzYWw7XG4gICAgICAvKiogV2hlcmUgdGhlIGN1cnNvciBzdGlsbCBpcyAoYWJzZW50IG9ubHkgd2hlbiB0aGVyZSBhcmUgbm8gc3RvcHMpLiAqL1xuICAgICAgcmVhZG9ubHkgYXQ/OiBTdG9wPFRNZXRhPjtcbiAgICAgIC8qKiBUaGUgY2xvc2VzdCBzdG9wIHRvIHdoYXQgd2FzIGFza2VkIGZvciwgd2hlbiBvbmUgY2FuIGJlIG5hbWVkLiAqL1xuICAgICAgcmVhZG9ubHkgbmVhcmVzdD86IFN0b3A8VE1ldGE+O1xuICAgIH07XG5cbi8vIOKUgOKUgCBNYXJrcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBBIHJlYWRlcidzIGJvb2ttYXJrLiBMaXZlcyBCRVNJREUgdGhlIGxvZywgaW4gdGhlIHtAbGluayBUaW1lVHJhdmVsfVxuICogaW5zdGFuY2Ug4oCUIG5ldmVyIHdyaXR0ZW4gaW50byB0aGUgY29tbWl0IGxvZyBvciB0aGUgc25hcHNob3QsIHdoaWNoIGFyZSB0aGVcbiAqIHJ1bidzIHJlY29yZCBhbmQgbm90IHRoZSByZWFkZXIncyBub3Rlcy5cbiAqXG4gKiBBIG1hcmsgbmFtZXMgaXRzIHN0b3AgYnkgYHJ1bnRpbWVTdGFnZUlkYCwgbm90IGJ5IHN0ZXAgbnVtYmVyOiBzdGVwIG51bWJlcnNcbiAqIGJlbG9uZyB0byBvbmUgc3RyYXRlZ3kncyBheGlzLCBgcnVudGltZVN0YWdlSWRgIGlzIHRoZSBzYW1lIHN0YWdlIG9uIGV2ZXJ5XG4gKiBheGlzLCBzbyBhIG1hcmsgc3Vydml2ZXMgYSBjaGFuZ2Ugb2Ygc3RyYXRlZ3kgYW5kIGEgcmUtZGVyaXZhdGlvbiBvZiBzdG9wcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXJrIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVGhlIHN0ZXAgdGhlIG1hcmsgd2FzIHBsYWNlZCBhdCwgb24gdGhlIGF4aXMgaW4gZm9yY2UgYXQgdGhlIHRpbWUuICovXG4gIHJlYWRvbmx5IHN0ZXA6IG51bWJlcjtcbn1cblxuLy8g4pSA4pSAIFRoZSBzdHJhdGVneSBzZWFtIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEhvdyBzdG9wcyBhcmUgREVSSVZFRCBmcm9tIGEgcmVjb3JkZWQgbG9nLiBUaGUgc2VhbS5cbiAqXG4gKiBmb290cHJpbnRqcyBzaGlwcyBvbmUgc3RyYXRlZ3kg4oCUIGBjb21taXRTdG9wc2AsIG9uZSBzdG9wIHBlciBleGVjdXRlZCBzdGFnZVxuICog4oCUIGJlY2F1c2UgdGhhdCBpcyB0aGUgb25seSBzdG9wIGdyYW1tYXIgdGhlIHN1YnN0cmF0ZSBpdHNlbGYga25vd3MuIEFcbiAqIGNvbnN1bWVyIHdpdGggYSByaWNoZXIgdm9jYWJ1bGFyeSAobWlsZXN0b25lcywgdG9vbCBjYWxscywgdHVybnMpIHN1cHBsaWVzXG4gKiBpdHMgb3duIGFuZCBnZXRzIHRoZSBzYW1lIGN1cnNvciBvdmVyIGl0LCBhbmQgcHV0cyB0aGF0IHZvY2FidWxhcnkgb25cbiAqIHtAbGluayBTdG9wLm1ldGF9IHJhdGhlciB0aGFuIHJlLWRlcml2aW5nIGl0IGF0IGV2ZXJ5IHJlYWQuXG4gKlxuICogVGhlIGxhdyBhIHN0cmF0ZWd5IG11c3Qga2VlcDogc3RvcHMgYXJlIERFUklWRUQgRlJPTSBUSEUgUkVDT1JERUQgTE9HLlxuICogQSBzdHJhdGVneSBtYXkgZ3JvdXAsIGZpbHRlciwgbGFiZWwgYW5kIG9yZGVyIHdoYXQgd2FzIHJlY29yZGVkLiBJdCBtYXkgbm90XG4gKiByZS13YWxrIHRoZSBleGVjdXRpb24gdHJlZSB0byBzeW50aGVzaXplIGEgc3RvcCBmb3Igc29tZXRoaW5nIHRoYXQgd2FzIG5ldmVyXG4gKiBjb21taXR0ZWQg4oCUIGEgY3Vyc29yIHRoYXQgc3RvcHMgd2hlcmUgbm8gZXZpZGVuY2UgZXhpc3RzIGlzIHRlbGxpbmcgYSBzdG9yeSxcbiAqIG5vdCByZWFkaW5nIG9uZS5cbiAqXG4gKiBPTiBBIENIQUlOLCBgc3RvcHNGb3JgIGlzIGNhbGxlZCBPTkNFIFBFUiBTT1VSQ0Ugd2l0aCB0aGF0IHNvdXJjZSdzIG93biBsb2dcbiAqIGFuZCB0cmVlLCBhbmQgdGhlIGN1cnNvciByZS1zdGVwcyB0aGUgcmVzdWx0cyBpbnRvIG9uZSBheGlzLiBTbyBhIHN0cmF0ZWd5XG4gKiBuZXZlciBoYXMgdG8ga25vdyBpdCBpcyBwYXJ0IG9mIGEgY2hhaW4sIGFuZCBpdHMgYGNvbW1pdElkeGAvYGxhc3RDb21taXRJZHhgXG4gKiBzdGF5IHNvdXJjZS1sb2NhbCDigJQgd2hpY2ggaXMgd2hhdCB0aGV5IGFsd2F5cyB3ZXJlLlxuICpcbiAqIGBzdWJmbG93UmVzdWx0c2AgKDkuMzkuMCkgaXMgdGhlIHNvdXJjZSdzIG93biBgc3ViZmxvd1Jlc3VsdHNgLCBhcyBzdG9yZWRcbiAqICh1bnR5cGVkKSDigJQgYSBtb3VudCdzIHBlci1leGVjdXRpb24ga2V5IG5hbWVzIGl0IGEgbW91bnQgd2hlbiBubyB0cmVlIGNhbWVcbiAqIHdpdGggdGhlIGxvZy4gQSBzdHJhdGVneSBtYXkgaWdub3JlIGl0LlxuICpcbiAqIGBleGVjdXRpb25UcmVlYCBpcyBhbiB7QGxpbmsgRXhlY3V0aW9uVHJlZX0gKDkuNDguMDsgYSBgU3RhZ2VTbmFwc2hvdGBcbiAqIGJlZm9yZSk6IHRoZSBmaWVsZHMgdGhlIHJlY29yZCdzIHJlYWRlcnMgcmVhZC4gQSBzdHJhdGVneSB3cml0dGVuIGJlZm9yZVxuICogOS40OC4wIHRoYXQgYW5ub3RhdGVzIHRoZSBwYXJhbWV0ZXIgYFN0YWdlU25hcHNob3RgIHN0aWxsIGNvbXBpbGVzIOKAlCBhXG4gKiBtZXRob2QncyBwYXJhbWV0ZXJzIGFyZSBjb21wYXJlZCBib3RoIHdheXMg4oCUIGJ1dCB0aGUgYW5ub3RhdGlvbiBpcyBhIGNsYWltXG4gKiBub3RoaW5nIGNoZWNrczogYHRpbWVUcmF2ZWxgIGhhbmRzIGEgc3RvcmVkIHJlY29yZGluZydzIHRyZWUgb3ZlciBhcyBwYXJzZWQsXG4gKiBzbyBhIGZpZWxkIGJleW9uZCB0aGVzZSBpcyByZWFkIGRlZmVuc2l2ZWx5LiBPbmUgbGVmdCB1bmFubm90YXRlZCBpcyB0eXBlZFxuICogYnkgdGhpcyBzaWduYXR1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVRyYXZlbFN0cmF0ZWd5PFRNZXRhID0gdW5rbm93bj4ge1xuICBzdG9wc0Zvcihjb21taXRMb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLCBleGVjdXRpb25UcmVlPzogRXhlY3V0aW9uVHJlZSwgc3ViZmxvd1Jlc3VsdHM/OiB1bmtub3duKTogU3RvcDxUTWV0YT5bXTtcbn1cblxuLy8g4pSA4pSAIFRoZSBjdXJzb3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQSByZWFkZXIncyBjdXJzb3Igb3ZlciBvbmUgZmluaXNoZWQgbG9nLCB3aXRoIGEgZm9sZCBhdCBlYWNoIHN0b3AuXG4gKlxuICogT05FIGN1cnNvcjogdGhpcyBvYmplY3QgaG9sZHMgdGhlIG9ubHkgcG9zaXRpb24uIEV2ZXJ5IHF1ZXN0aW9uIGEgcmVhZGVyXG4gKiBhc2tzIOKAlCB3aGF0IGNoYW5nZWQgaGVyZSwgd2hhdCBkaWQgc3RhdGUgbG9vayBsaWtlLCB3aGF0IGlzIGluc2lkZSB0aGlzXG4gKiBtb3VudCDigJQgaXMgYW5zd2VyZWQgcmVsYXRpdmUgdG8gaXQuIGBkcmlsbCgpYCByZXR1cm5zIGEgU0VQQVJBVEUgY3Vyc29yIG92ZXJcbiAqIGEgc2VwYXJhdGUgbG9nIChhIHN1YmZsb3cncyBvd24pLCBuZXZlciBhIHNlY29uZCBwb3NpdGlvbiBvbiB0aGlzIG9uZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lVHJhdmVsPFRNZXRhID0gdW5rbm93bj4ge1xuICAvKiogVGhlIGF4aXMsIGluIGV4ZWN1dGlvbiBvcmRlci4gRW1wdHkgd2hlbiB0aGUgbG9nIGlzIGVtcHR5LiAqL1xuICByZWFkb25seSBzdG9wczogcmVhZG9ubHkgU3RvcDxUTWV0YT5bXTtcbiAgLyoqIFRoZSBzdWJmbG93IHBhdGggdGhpcyBjdXJzb3IgY292ZXJzOyBgdW5kZWZpbmVkYCBmb3IgdGhlIHJ1biBpdHNlbGYuICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBtb3VudCB0aGlzIGN1cnNvciB3YXMgZHJpbGxlZCBvdXQgb2Yg4oCUIGBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjaWR4YC5cbiAgICogYHVuZGVmaW5lZGAgb24gYSBydW4ncyBvd24gY3Vyc29yLlxuICAgKlxuICAgKiBXSFkgQk9USDogYSBzdWJmbG93IG1vdW50ZWQgaW5zaWRlIGEgbG9vcCBydW5zIHNldmVyYWwgdGltZXMsIGFuZCBldmVyeVxuICAgKiBpdGVyYXRpb24gc2hhcmVzIG9uZSB7QGxpbmsgcGF0aH0uIFRoaXMgaXMgdGhlIGl0ZXJhdGlvbiB0aGF0IHdhcyBhY3R1YWxseVxuICAgKiBvcGVuZWQsIHNvIHRocmVlIGRyaWxsIHBhbmVscyBvdmVyIGBzZngjMmAsIGBzZngjOGAgYW5kIGBzZngjMTRgIGNhbiBiZVxuICAgKiBsYWJlbGxlZCBhbmQga2V5ZWQgYXBhcnQgaW5zdGVhZCBvZiBhbGwgcmVhZGluZyBgc2Z4YC5cbiAgICovXG4gIHJlYWRvbmx5IG1vdW50UnVudGltZVN0YWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSBjdXJzb3IgdGhpcyBvbmUgd2FzIGRyaWxsZWQgb3V0IG9mLCBpZiBhbnkuICovXG4gIHJlYWRvbmx5IHBhcmVudDogVGltZVRyYXZlbDxUTWV0YT4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBIb3cgbWFueSBTT1VSQ0VTIHRoaXMgY3Vyc29yIHJlYWRzIOKAlCBgMWAgZm9yIGEgbm9ybWFsIGN1cnNvciwgbW9yZSBmb3IgYVxuICAgKiBjaGFpbmVkIG9uZSAoYSBwYXVzZS9yZXN1bWUgcmVhZCBhcyBvbmUgYXhpcykuIEV2ZXJ5IHN0b3Agb2YgYSBjaGFpbmVkXG4gICAqIGN1cnNvciBjYXJyaWVzIHRoZSB7QGxpbmsgU3RvcC5zb3VyY2VJZHh9IGl0cyBpbmRpY2VzIGJlbG9uZyB0by5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUNvdW50OiBudW1iZXI7XG5cbiAgLyoqIFdoZXJlIHRoZSBjdXJzb3IgaXM7IGB1bmRlZmluZWRgIG9ubHkgd2hlbiB0aGVyZSBhcmUgbm8gc3RvcHMuICovXG4gIGF0KCk6IFN0b3A8VE1ldGE+IHwgdW5kZWZpbmVkO1xuXG4gIGZpcnN0KCk6IE1vdmU8VE1ldGE+O1xuICBsYXN0KCk6IE1vdmU8VE1ldGE+O1xuICBwcmV2KCk6IE1vdmU8VE1ldGE+O1xuICBuZXh0KCk6IE1vdmU8VE1ldGE+O1xuXG4gIC8qKlxuICAgKiBNb3ZlIHRvIGEgc3RlcCBudW1iZXIgb3IgdG8gYSBgcnVudGltZVN0YWdlSWRgLlxuICAgKiBBIG1pc3MgcmVmdXNlcyBhbmQgbmFtZXMgdGhlIGBuZWFyZXN0YCBzdG9wIGl0IGNvdWxkIGZpbmQuXG4gICAqL1xuICBqdW1wVG8odGFyZ2V0OiBudW1iZXIgfCBzdHJpbmcpOiBNb3ZlPFRNZXRhPjtcblxuICAvKipcbiAgICogRm9sZCBvZiB0aGUgbG9nIHRocm91Z2ggYHN0b3BgIChkZWZhdWx0OiB0aGUgY3VycmVudCBzdG9wKS4gRGV0YWNoZWQuXG4gICAqXG4gICAqIGBzdG9wYCBtdXN0IGNvbWUgZnJvbSBUSElTIGN1cnNvcidzIGF4aXM6IGl0cyBgbGFzdENvbW1pdElkeGAgYW5kXG4gICAqIGBzb3VyY2VJZHhgIGFyZSByZWFkIGFzIGFkZHJlc3NlcyBpbnRvIHRoaXMgY3Vyc29yJ3Mgb3duIGxlZ3MsIHNvIGEgc3RvcFxuICAgKiBmcm9tIGFub3RoZXIgY3Vyc29yIGlzIGZvbGRlZCBhdCB3aGF0ZXZlciB0aG9zZSBudW1iZXJzIG1lYW4gaGVyZSDigJQgb24gYVxuICAgKiBjaGFpbiwgYSBmb3JlaWduIHN0b3Agd2l0aCBubyBgc291cmNlSWR4YCBmb2xkcyBsZWcgMC5cbiAgICovXG4gIHN0YXRlQXQoc3RvcD86IFN0b3A8VE1ldGE+KTogRm9sZGVkU3RhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0ZSBrZXlzIHdyaXR0ZW4gYmV0d2VlbiB0d28gc3RvcHMg4oCUIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBidW5kbGVzJ1xuICAgKiB0cmFjZXMsIHNvIGl0IGNvc3RzIG5vIGZvbGQgYXQgYWxsLlxuICAgKlxuICAgKiBXaXRoIG5vIGFyZ3VtZW50OiB3aGF0IHRoZSBDVVJSRU5UIHN0b3AgY2hhbmdlZCAoaS5lLiBzaW5jZSB0aGUgc3RvcFxuICAgKiBiZWZvcmUgaXQpLiBXaXRoIGEgYGZyb21gIHN0b3A6IGV2ZXJ5dGhpbmcgd3JpdHRlbiBhZnRlciBgZnJvbWAgdXAgdG8gYW5kXG4gICAqIGluY2x1ZGluZyB0aGUgY3VycmVudCBzdG9wLiBCYWNrd2FyZHMgb3IgZXF1YWwgcmFuZ2VzIGdpdmUgYFtdYC4gT24gYVxuICAgKiBjaGFpbmVkIGN1cnNvciBhIHJhbmdlIHRoYXQgY3Jvc3NlcyB0aGUgc2VhbSBpcyB3YWxrZWQgc291cmNlIGJ5IHNvdXJjZS5cbiAgICovXG4gIGNoYW5nZWRTaW5jZShmcm9tPzogU3RvcDxUTWV0YT4pOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogQm9va21hcmsgYSBzdG9wIChkZWZhdWx0OiB0aGUgY3VycmVudCBvbmUpLiBSZXR1cm5zIHRoZSBtYXJrLCBvclxuICAgKiAgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBubyBzdG9wIHRvIG5hbWUuICovXG4gIG1hcmsobmFtZTogc3RyaW5nLCBzdG9wPzogU3RvcDxUTWV0YT4pOiBNYXJrIHwgdW5kZWZpbmVkO1xuICAvKiogQSBkZXRhY2hlZCBjb3B5IG9mIHRoaXMgY3Vyc29yJ3MgbWFya3MsIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgcGxhY2VkLiAqL1xuICBtYXJrcygpOiByZWFkb25seSBNYXJrW107XG4gIC8qKiBNb3ZlIHRvIGEgbWFyaydzIHN0b3AuIEEgbWFyayB3aG9zZSBzdGFnZSBpcyBub3Qgb24gdGhpcyBheGlzIG1pc3Nlcy4gKi9cbiAganVtcFRvTWFyayhuYW1lOiBzdHJpbmcpOiBNb3ZlPFRNZXRhPjtcblxuICAvKipcbiAgICogQSBjdXJzb3Igb3ZlciB0aGUgc3ViZmxvdyBtb3VudGVkIGF0IGBtb3VudFJ1bnRpbWVTdGFnZUlkYCDigJQgdGhlIHNhbWVcbiAgICogaW50ZXJmYWNlLCBpdHMgb3duIGxvZywgaXRzIG93biBmb2xkIGJhc2UuIGB1bmRlZmluZWRgIHdoZW4gdGhhdCBtb3VudCBpc1xuICAgKiBub3QgaW4gdGhpcyBydW4ncyBzdWJmbG93IHJlc3VsdHMuXG4gICAqXG4gICAqIEEgc3RvcCBpbnNpZGUgYSBzdWJmbG93IGlzIE5PVCBhIHN0b3Agb2YgdGhpcyBjdXJzb3I6IHN1YmZsb3dzIHJ1biBpblxuICAgKiBpc29sYXRlZCBydW50aW1lcyBhbmQgY29tbWl0IHRvIHRoZWlyIG93biBsb2csIHNvIHRoZSBvdXRlciBheGlzIGhvbGRzXG4gICAqIG9ubHkgdGhlIG1vdW50IGJvdW5kYXJ5LiBEcmlsbGluZyBpcyBob3cgeW91IGdldCBpbnNpZGU7IHRoZXJlIGlzIG5vIHdheVxuICAgKiB0byBiZSBpbiB0d28gcGxhY2VzIGF0IG9uY2UuXG4gICAqL1xuICBkcmlsbChtb3VudFJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBUaW1lVHJhdmVsPFRNZXRhPiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayB0aW1lVHJhdmVsfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVRyYXZlbE9wdGlvbnM8VE1ldGEgPSB1bmtub3duPiB7XG4gIC8qKiBIb3cgc3RvcHMgYXJlIGRlcml2ZWQuIERlZmF1bHQ6IGBjb21taXRTdG9wc2AuICovXG4gIHJlYWRvbmx5IHN0cmF0ZWd5PzogVGltZVRyYXZlbFN0cmF0ZWd5PFRNZXRhPjtcbiAgLyoqIE1hcmtzIHRvIHNlZWQgdGhlIGN1cnNvciB3aXRoIOKAlCBlLmcuIHJlc3RvcmVkIGZyb20gYSBzYXZlZCBzZXNzaW9uLiAqL1xuICByZWFkb25seSBtYXJrcz86IHJlYWRvbmx5IE1hcmtbXTtcbn1cbiJdfQ==
@@ -1,91 +0,0 @@
1
- /**
2
- * freeze.ts — the ONE deep-freeze walk (moved here from `scope/protection/readonlyInput.ts` in F3),
3
- * and the serve-time law for the commit log (9.44.2).
4
- *
5
- * WHY HERE. Saved trees freeze through this walk: the fold base served as
6
- * `initialState` (`ExecutionRuntime · getFoldBase`), the
7
- * dev-mode snapshot (`runner/snapshot.ts · servedSnapshot`), every state `stateAt` hands out
8
- * (`time-travel/stateAt.ts`) and, since F3, every commit bundle (`EventLog · record`). `memory/` must
9
- * not import `scope/` (that edge closed the memory ⇄ scope ⇄ recorder module cycle F0 removed), so the
10
- * walk lives in this leaf folder, which imports nothing outside itself. Args use an ownership snapshot
11
- * instead (`scope/protection/readonlyInput.ts · createFrozenArgs`): never freeze borrowed caller values.
12
- *
13
- * FREEZE WHAT CAN BE FROZEN, COPY WHAT CAN'T (9.44.2). `Object.freeze` cannot seal a Date's time, a
14
- * Map's or Set's entries, a buffer's bytes, a RegExp (`compile()` rewrites a frozen one) or an Error
15
- * (V8's own `stack` accessor writes through a frozen one). A fresh tree handed to one caller (a `stateAt`
16
- * state, the dev-mode snapshot) is that caller's own, so freezing it is a guard and nothing more. The
17
- * COMMIT LOG — each bundle, and the fold base — is served to every reader, so {@link freezeRecord}
18
- * remembers that a record holds such a value, its first serve maps the containers on the way to each
19
- * one (its open PATHS), and {@link serveRecord} hands a reader a copy of those paths only: a fresh copy
20
- * of each such value, fresh frozen containers on the way to it, and every other part shared, frozen, as
21
- * it is. Until 9.44.2 `snapshot.commitLog[i].overwrite.when.setTime(0)` rewrote every later snapshot,
22
- * `stateAt`, `commitValueAt`, slice and cursor answer.
23
- *
24
- * Every walk here is ITERATIVE (an explicit stack): a record's depth is not bounded by the call stack.
25
- *
26
- * @example
27
- * ```typescript
28
- * import { deepFreeze, freezeRecord, serveRecord } from './freeze.js';
29
- *
30
- * const args = deepFreeze({ order: { lines: [{ sku: 'A' }] }, bytes: new Uint8Array([1]) });
31
- * Object.isFrozen(args.order.lines[0]); // true
32
- * Object.isFrozen(args.bytes); // false — a typed array cannot be frozen; it is skipped
33
- *
34
- * const record = freezeRecord({ when: new Date(0), tags: ['a'] });
35
- * const served = serveRecord(record);
36
- * served.when.setTime(5); // changes the reader's copy
37
- * serveRecord(record).when.getTime(); // 0 — every serve is the record as recorded
38
- * served.tags === record.tags; // true — the sealed part is shared, not copied
39
- * serveRecord(freezeRecord({ n: 1 })); // a record freezing sealed whole: served as itself
40
- * ```
41
- */
42
- /**
43
- * How {@link deepFreeze} walks an ARRAY.
44
- *
45
- * - `'every-key'` (the default) — every own property, as for any other object: the index elements
46
- * AND any expando (`arr.note = { … }`). The dev-mode snapshot relies on this contract.
47
- * - `'indices'` — the index elements only, so no key string is allocated per element; this is what
48
- * keeps freezing a 10,000-element commit inside its budget (`bench/element-writes.ts`). An object
49
- * hung on an array EXPANDO is then left unfrozen, and unseen by {@link serveRecord} — the commit
50
- * log's named hole (`EventLog · record`; an array expando is out of contract for state).
51
- */
52
- export type ArrayWalk = 'every-key' | 'indices';
53
- /**
54
- * Freezes `obj` and every object reachable through its own properties, and returns `obj`.
55
- *
56
- * - An object that is ALREADY frozen is left as it is, and not descended — 9.32.0's contract, kept:
57
- * args may hold a caller's frozen object with live parts inside (a class instance a stage calls),
58
- * and freezing past it would break them. It is also what ends a cycle. The commit log never meets
59
- * one: its payloads are fresh `structuredClone`s.
60
- * - ArrayBuffer views (typed arrays, `DataView`) are skipped: `Object.freeze` throws on a non-empty
61
- * typed array, so a `Uint8Array` in state, args or the fold base used to fail the run or the
62
- * snapshot here.
63
- * - What `Object.freeze` cannot reach stays mutable — Map and Set contents, a Date's time, the
64
- * bytes behind a buffer. A frozen RegExp's `lastIndex` is read-only, so a `/g` or `/y` regex
65
- * taken from a frozen tree throws when `exec` or `replace` advance it. The commit log goes through
66
- * {@link freezeRecord} and {@link serveRecord} instead.
67
- * - Functions are not descended (they are not values the engine stores).
68
- */
69
- export declare function deepFreeze<T>(obj: T, arrays?: ArrayWalk): T;
70
- /**
71
- * {@link deepFreeze} for a record many readers are SERVED (a commit bundle, the fold base), and two more
72
- * things on the same walk:
73
- *
74
- * - it remembers THAT the record holds a value freezing cannot seal — one flag; the record's first
75
- * serve maps WHERE (the containers on the way to each such value, its open paths), so the run pays
76
- * nothing more and {@link serveRecord} copies those paths and nothing else;
77
- * - a typed array or `DataView` that views a SLICE of a bigger buffer (a Node `Buffer` views its
78
- * shared pool) is replaced, in the record, by a copy of the bytes it views — the record keeps the
79
- * view's bytes, never the rest of the buffer (a resizable or shared buffer is kept as it is).
80
- *
81
- * A part frozen before is not frozen past (deepFreeze's contract) but is looked through, so a value
82
- * freezing cannot seal inside it still opens the record. Returns `record`.
83
- */
84
- export declare function freezeRecord<T extends object>(record: T, arrays?: ArrayWalk): T;
85
- /**
86
- * The record as a reader may hold it — THE serve-time law: a record freezing sealed whole is served as
87
- * itself (shared, no cost); any other as a copy of its open paths ({@link freezeRecord}): fresh frozen
88
- * containers down to each value freezing cannot seal, a fresh copy of that value, and every other part
89
- * shared, frozen, as it is. A copy is served the same way again.
90
- */
91
- export declare function serveRecord<T>(record: T): T;
@@ -1,7 +0,0 @@
1
- /**
2
- * `target[name] = value`, preserving existing own-slot behavior while making
3
- * a missing inherited name an OWN data property. Payload names such as
4
- * `__proto__` are data, not setters or selector instructions. Shared by the
5
- * record-serving and copy-on-write copies; this is not a public helper.
6
- */
7
- export declare function putOwn(target: Record<string, unknown>, name: string, value: unknown): void;