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,278 +0,0 @@
1
- /**
2
- * slice/serialize.ts — JSON-safe and LLM-safe projections of a slice.
3
- *
4
- * WHY (the failure this prevents): `VariableSlice.root` is an in-memory DAG.
5
- * Nodes are SHARED — a diamond ancestor is one object reached through many
6
- * paths, and each node appears in both `parents` and `parentEdges[].parent`.
7
- * `JSON.stringify` knows nothing about sharing: it re-serializes every shared
8
- * subtree per path, which explodes combinatorially on diamond-heavy slices.
9
- * The two consumers that would naively stringify are exactly the ones this
10
- * library exists for — wire transfer (persist / send a slice) and LLM tools
11
- * (bounded context). Each gets a purpose-built projection:
12
- *
13
- * - {@link sliceToJSON} — flat, id-referenced, LINEAR in node count.
14
- * - {@link formatSlice} — one bounded human/LLM-readable string that also
15
- * renders the honesty envelope (missing reason, reads coverage, truncation)
16
- * a raw `formatCausalChain` doesn't know about.
17
- *
18
- * The FORWARD half has exactly the same hazard and the same two projections:
19
- * {@link forwardSliceToJSON} / {@link formatForwardSlice}. A forward DAG
20
- * shares nodes just as readily — two values read by one stage feed the same
21
- * child write — so a forward root must never be stringified either.
22
- *
23
- * {@link KeyTimeline} is the deliberate exception, stated so nobody adds a
24
- * pointless twin: it is a FLAT list of plain fields holding no live
25
- * references and no sharing, so `JSON.stringify(timeline)` is already
26
- * correct and linear. What it still needs is the bounded LLM projection —
27
- * {@link formatTimeline} — because "the whole life of a key" is unbounded in
28
- * a long run.
29
- */
30
- import { flattenCausalDAG, formatCausalChain } from '../memory/backtrack.js';
31
- /**
32
- * Flat, JSON-safe projection: every DAG node exactly once (keyed by
33
- * runtimeStageId), edges as id references. Linear in node count — safe to
34
- * persist, send, or feed to structured consumers. Lossless for everything
35
- * except the in-memory object graph itself (rebuild adjacency from `edges`).
36
- */
37
- export function sliceToJSON(slice) {
38
- const out = {
39
- key: slice.key,
40
- ...(slice.before !== undefined && { before: slice.before }),
41
- ...(slice.missing !== undefined && { missing: slice.missing }),
42
- keysReadKind: slice.keysReadKind,
43
- ...(slice.readsCoverage !== undefined && { readsCoverage: slice.readsCoverage }),
44
- };
45
- if (!slice.root)
46
- return out;
47
- out.writerId = slice.root.runtimeStageId;
48
- const nodes = {};
49
- const edges = [];
50
- for (const node of flattenCausalDAG(slice.root)) {
51
- nodes[node.runtimeStageId] = {
52
- stageId: node.stageId,
53
- stageName: node.stageName,
54
- keysWritten: node.keysWritten,
55
- depth: node.depth,
56
- ...(node.incompleteSources !== undefined && { incompleteSources: node.incompleteSources }),
57
- ...(node.preRunReads !== undefined && { preRunReads: node.preRunReads }),
58
- };
59
- for (const edge of node.parentEdges) {
60
- edges.push({
61
- from: node.runtimeStageId,
62
- to: edge.parent.runtimeStageId,
63
- kind: edge.kind,
64
- ...(edge.key !== undefined && { key: edge.key }),
65
- weight: edge.weight,
66
- ...(edge.basis !== undefined && { basis: edge.basis }),
67
- });
68
- }
69
- }
70
- out.nodes = nodes;
71
- out.edges = edges;
72
- if (slice.root.truncated)
73
- out.truncated = slice.root.truncated;
74
- if (slice.notes !== undefined)
75
- out.notes = slice.notes;
76
- return out;
77
- }
78
- /**
79
- * One bounded string for LLM triage tools (the `traceToolpack` consumption
80
- * pattern: tools return plain strings, never recursive objects). Wraps
81
- * `formatCausalChain` (which is budget-bounded by causalChain's
82
- * maxDepth/maxNodes and renders shared nodes once as `↳ … (see above)`),
83
- * and adds the honesty envelope the raw chain doesn't carry:
84
- *
85
- * - missing slices render their reason ("value came from initial state /
86
- * frozen args / a closure — the commit log cannot see those"),
87
- * - a reads-less provider (`readTracking: 'off'` signature) renders an
88
- * explicit "⚠ reads were not recorded" instead of silently showing an
89
- * anchor with no dependencies,
90
- * - truncation footers pass through from formatCausalChain.
91
- */
92
- export function formatSlice(slice) {
93
- const lines = [];
94
- const anchor = slice.before !== undefined ? ` (before commit ${slice.before})` : '';
95
- lines.push(`SLICE for '${slice.key}'${anchor} — reads via: ${slice.keysReadKind}`);
96
- if (slice.missing === 'empty-log') {
97
- lines.push('no slice: the commit log is empty (nothing has executed).');
98
- return lines.join('\n');
99
- }
100
- if (slice.missing === 'never-written') {
101
- lines.push(`no slice: '${slice.key}' was never written in range — the value came from ` +
102
- 'initial state, frozen run input (args), or a closure; the commit log cannot see those.');
103
- return lines.join('\n');
104
- }
105
- const cov = slice.readsCoverage;
106
- if (cov && cov.steps > 1 && cov.stepsWithReads === 0) {
107
- lines.push("⚠ reads were not recorded (readTracking may be 'off') — dependencies below are " + 'unknowable, NOT absent.');
108
- }
109
- if (slice.root)
110
- lines.push(formatCausalChain(slice.root));
111
- return [...lines, ...noteLines(slice.notes ?? [])].join('\n');
112
- }
113
- // ── Forward projections ───────────────────────────────────────────────────
114
- /** How many reads one node lists before the renderer says "… and N more". */
115
- const READS_RENDERED = 5;
116
- /** BFS over the forward DAG, each node exactly once (shared nodes included). */
117
- function flattenForwardDAG(root) {
118
- const out = [];
119
- const seen = new Set();
120
- const queue = [root];
121
- while (queue.length > 0) {
122
- const node = queue.shift();
123
- if (seen.has(node))
124
- continue;
125
- seen.add(node);
126
- out.push(node);
127
- for (const edge of node.fedEdges)
128
- if (!seen.has(edge.child))
129
- queue.push(edge.child);
130
- }
131
- return out;
132
- }
133
- /** `⚠ …` lines for the honesty envelope — same rendering for both doors. */
134
- function noteLines(notes) {
135
- return notes.map((n) => `⚠ ${n.detail}`);
136
- }
137
- /** One node's headline: who wrote the value, and how long it lived. */
138
- function nodeHeadline(node) {
139
- const life = node.nextWriteIdx !== undefined ? `live until commit ${node.nextWriteIdx}` : 'live to the end of the run';
140
- if (node.origin === 'pre-run') {
141
- return `'${node.key}' from BEFORE the run (initial state / input / closure) — ${life}`;
142
- }
143
- return `'${node.key}' ${node.verb ?? 'set'} by ${node.stageName} (${node.runtimeStageId}) @${node.commitIdx} — ${life}`;
144
- }
145
- /**
146
- * Flat, JSON-safe projection of a {@link ForwardSlice} — the forward twin of
147
- * {@link sliceToJSON}, linear in node count.
148
- *
149
- * Node ids are OPAQUE (`n0`, `n1`, … in BFS order) rather than
150
- * `runtimeStageId` as in `SliceJSON`, for a structural reason: a forward
151
- * node is a (key, write) pair, so ONE stage that wrote two keys owns two
152
- * nodes and a runtimeStageId cannot key the map. Never parse the ids — join
153
- * on `runtimeStageId` / `commitIdx` / `key`, which every node carries.
154
- */
155
- export function forwardSliceToJSON(slice) {
156
- const out = {
157
- key: slice.key,
158
- ...(slice.before !== undefined && { before: slice.before }),
159
- ...(slice.missing !== undefined && { missing: slice.missing }),
160
- keysReadKind: slice.keysReadKind,
161
- ...(slice.readsCoverage !== undefined && { readsCoverage: slice.readsCoverage }),
162
- notes: slice.notes,
163
- };
164
- if (!slice.root)
165
- return out;
166
- const flat = flattenForwardDAG(slice.root);
167
- const ids = new Map();
168
- flat.forEach((node, i) => ids.set(node, `n${i}`));
169
- out.rootId = ids.get(slice.root);
170
- out.nodes = flat.map((node) => ({
171
- id: ids.get(node),
172
- key: node.key,
173
- origin: node.origin,
174
- ...(node.runtimeStageId !== undefined && { runtimeStageId: node.runtimeStageId }),
175
- ...(node.stageId !== undefined && { stageId: node.stageId }),
176
- ...(node.stageName !== undefined && { stageName: node.stageName }),
177
- ...(node.commitIdx !== undefined && { commitIdx: node.commitIdx }),
178
- ...(node.verb !== undefined && { verb: node.verb }),
179
- ...(node.nextWriteIdx !== undefined && { nextWriteIdx: node.nextWriteIdx }),
180
- depth: node.depth,
181
- reads: node.reads,
182
- ...(node.incompleteSources !== undefined && { incompleteSources: node.incompleteSources }),
183
- }));
184
- out.edges = flat.flatMap((node) => node.fedEdges.map((edge) => ({ from: ids.get(node), to: ids.get(edge.child), basis: edge.basis })));
185
- if (slice.root.truncated)
186
- out.truncated = slice.root.truncated;
187
- if (slice.notes !== undefined)
188
- out.notes = slice.notes;
189
- return out;
190
- }
191
- /**
192
- * One bounded string for LLM triage tools — the forward twin of
193
- * {@link formatSlice}. Shared nodes render once (`↳ … (see above)`, the same
194
- * convention `formatCausalChain` uses), read lists are capped, and every
195
- * honesty note renders as a `⚠` line — including the one that says a `fed`
196
- * edge is conservative, which is why edges print `[exact]` / `[conservative]`
197
- * rather than looking alike.
198
- */
199
- export function formatForwardSlice(slice) {
200
- const lines = [];
201
- const anchor = slice.before !== undefined ? ` (as of before commit ${slice.before})` : '';
202
- lines.push(`FORWARD SLICE for '${slice.key}'${anchor} — reads via: ${slice.keysReadKind}`);
203
- if (slice.missing === 'empty-log') {
204
- lines.push('no forward slice: the commit log is empty (nothing has executed).');
205
- return [...lines, ...noteLines(slice.notes)].join('\n');
206
- }
207
- if (slice.missing === 'never-written') {
208
- lines.push(`no forward slice: '${slice.key}' was never written and never read in this log.`);
209
- return [...lines, ...noteLines(slice.notes)].join('\n');
210
- }
211
- const seen = new Set();
212
- const walk = (node, indent, lead = '') => {
213
- const pad = ' '.repeat(indent);
214
- const head = `${pad}${lead}${nodeHeadline(node)}`;
215
- if (seen.has(node)) {
216
- lines.push(`${head} ↳ (see above)`);
217
- return;
218
- }
219
- seen.add(node);
220
- lines.push(head);
221
- if (node.incompleteSources && node.incompleteSources.length > 0) {
222
- lines.push(`${pad} ⚠ its writer also consumed ${node.incompleteSources.join('/')} — untracked`);
223
- }
224
- if (node.reads.length === 0) {
225
- lines.push(`${pad} (no recorded read of this value)`);
226
- }
227
- for (const read of node.reads.slice(0, READS_RENDERED)) {
228
- lines.push(`${pad} read by ${read.stageName} (${read.runtimeStageId}) @${read.commitIdx}`);
229
- }
230
- if (node.reads.length > READS_RENDERED) {
231
- lines.push(`${pad} … and ${node.reads.length - READS_RENDERED} more reads`);
232
- }
233
- for (const edge of node.fedEdges) {
234
- walk(edge.child, indent + 1, `→ fed ${edge.basis === 'per-write' ? '[exact]' : '[conservative]'} `);
235
- }
236
- };
237
- if (slice.root)
238
- walk(slice.root, 0);
239
- return [...lines, ...noteLines(slice.notes)].join('\n');
240
- }
241
- /** How many moments {@link formatTimeline} renders before it says "… and N more". */
242
- const MOMENTS_RENDERED = 60;
243
- /**
244
- * One bounded string for a {@link KeyTimeline} — the LLM/human projection.
245
- * (The timeline's JSON needs no helper: it is already flat and JSON-safe —
246
- * see the file header.) Truncation is stated, never silent.
247
- */
248
- export function formatTimeline(timeline) {
249
- const lines = [];
250
- const bound = timeline.before !== undefined ? ` (before commit ${timeline.before})` : '';
251
- lines.push(`TIMELINE for '${timeline.key}'${bound} — reads via: ${timeline.keysReadKind}`);
252
- if (timeline.missing === 'empty-log') {
253
- lines.push('no timeline: the commit log is empty (nothing has executed).');
254
- return [...lines, ...noteLines(timeline.notes)].join('\n');
255
- }
256
- if (timeline.missing === 'never-written') {
257
- lines.push(`no timeline: '${timeline.key}' was never written and never read in this log.`);
258
- return [...lines, ...noteLines(timeline.notes)].join('\n');
259
- }
260
- const moments = timeline.moments ?? [];
261
- if (moments.length === 0)
262
- lines.push('(no recorded moment for this key)');
263
- for (const moment of moments.slice(0, MOMENTS_RENDERED)) {
264
- const where = `${moment.stageName} (${moment.runtimeStageId})`;
265
- if (moment.kind === 'write') {
266
- lines.push(`@${moment.commitIdx} write ${moment.verb ?? 'set'} — ${where}`);
267
- }
268
- else {
269
- const from = moment.fromWriteIdx !== undefined ? `value from commit ${moment.fromWriteIdx}` : 'value from BEFORE the run';
270
- lines.push(`@${moment.commitIdx} read — ${where} (${from})`);
271
- }
272
- }
273
- if (moments.length > MOMENTS_RENDERED) {
274
- lines.push(`… and ${moments.length - MOMENTS_RENDERED} more moments (bounded output)`);
275
- }
276
- return [...lines, ...noteLines(timeline.notes)].join('\n');
277
- }
278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zbGljZS9zZXJpYWxpemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVc3RTs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBb0I7SUFDOUMsTUFBTSxHQUFHLEdBQWM7UUFDckIsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1FBQ2QsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzRCxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlELFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWTtRQUNoQyxHQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsS0FBSyxTQUFTLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO0tBQ2pGLENBQUM7SUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUU1QixHQUFHLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUFvQyxFQUFFLENBQUM7SUFDbEQsTUFBTSxLQUFLLEdBQW9DLEVBQUUsQ0FBQztJQUNsRCxLQUFLLE1BQU0sSUFBSSxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2hELEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUc7WUFD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Q0QsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDdEMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLE9BQU8sQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLGdDQUFnQyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLEtBQUssRUFBRSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogc2xpY2Uvc2VyaWFsaXplLnRzIOKAlCBKU09OLXNhZmUgYW5kIExMTS1zYWZlIHByb2plY3Rpb25zIG9mIGEgc2xpY2UuXG4gKlxuICogV0hZICh0aGUgZmFpbHVyZSB0aGlzIHByZXZlbnRzKTogYFZhcmlhYmxlU2xpY2Uucm9vdGAgaXMgYW4gaW4tbWVtb3J5IERBRy5cbiAqIE5vZGVzIGFyZSBTSEFSRUQg4oCUIGEgZGlhbW9uZCBhbmNlc3RvciBpcyBvbmUgb2JqZWN0IHJlYWNoZWQgdGhyb3VnaCBtYW55XG4gKiBwYXRocywgYW5kIGVhY2ggbm9kZSBhcHBlYXJzIGluIGJvdGggYHBhcmVudHNgIGFuZCBgcGFyZW50RWRnZXNbXS5wYXJlbnRgLlxuICogYEpTT04uc3RyaW5naWZ5YCBrbm93cyBub3RoaW5nIGFib3V0IHNoYXJpbmc6IGl0IHJlLXNlcmlhbGl6ZXMgZXZlcnkgc2hhcmVkXG4gKiBzdWJ0cmVlIHBlciBwYXRoLCB3aGljaCBleHBsb2RlcyBjb21iaW5hdG9yaWFsbHkgb24gZGlhbW9uZC1oZWF2eSBzbGljZXMuXG4gKiBUaGUgdHdvIGNvbnN1bWVycyB0aGF0IHdvdWxkIG5haXZlbHkgc3RyaW5naWZ5IGFyZSBleGFjdGx5IHRoZSBvbmVzIHRoaXNcbiAqIGxpYnJhcnkgZXhpc3RzIGZvciDigJQgd2lyZSB0cmFuc2ZlciAocGVyc2lzdCAvIHNlbmQgYSBzbGljZSkgYW5kIExMTSB0b29sc1xuICogKGJvdW5kZWQgY29udGV4dCkuIEVhY2ggZ2V0cyBhIHB1cnBvc2UtYnVpbHQgcHJvamVjdGlvbjpcbiAqXG4gKiAtIHtAbGluayBzbGljZVRvSlNPTn0gICDigJQgZmxhdCwgaWQtcmVmZXJlbmNlZCwgTElORUFSIGluIG5vZGUgY291bnQuXG4gKiAtIHtAbGluayBmb3JtYXRTbGljZX0gICDigJQgb25lIGJvdW5kZWQgaHVtYW4vTExNLXJlYWRhYmxlIHN0cmluZyB0aGF0IGFsc29cbiAqICAgcmVuZGVycyB0aGUgaG9uZXN0eSBlbnZlbG9wZSAobWlzc2luZyByZWFzb24sIHJlYWRzIGNvdmVyYWdlLCB0cnVuY2F0aW9uKVxuICogICBhIHJhdyBgZm9ybWF0Q2F1c2FsQ2hhaW5gIGRvZXNuJ3Qga25vdyBhYm91dC5cbiAqXG4gKiBUaGUgRk9SV0FSRCBoYWxmIGhhcyBleGFjdGx5IHRoZSBzYW1lIGhhemFyZCBhbmQgdGhlIHNhbWUgdHdvIHByb2plY3Rpb25zOlxuICoge0BsaW5rIGZvcndhcmRTbGljZVRvSlNPTn0gLyB7QGxpbmsgZm9ybWF0Rm9yd2FyZFNsaWNlfS4gQSBmb3J3YXJkIERBR1xuICogc2hhcmVzIG5vZGVzIGp1c3QgYXMgcmVhZGlseSDigJQgdHdvIHZhbHVlcyByZWFkIGJ5IG9uZSBzdGFnZSBmZWVkIHRoZSBzYW1lXG4gKiBjaGlsZCB3cml0ZSDigJQgc28gYSBmb3J3YXJkIHJvb3QgbXVzdCBuZXZlciBiZSBzdHJpbmdpZmllZCBlaXRoZXIuXG4gKlxuICoge0BsaW5rIEtleVRpbWVsaW5lfSBpcyB0aGUgZGVsaWJlcmF0ZSBleGNlcHRpb24sIHN0YXRlZCBzbyBub2JvZHkgYWRkcyBhXG4gKiBwb2ludGxlc3MgdHdpbjogaXQgaXMgYSBGTEFUIGxpc3Qgb2YgcGxhaW4gZmllbGRzIGhvbGRpbmcgbm8gbGl2ZVxuICogcmVmZXJlbmNlcyBhbmQgbm8gc2hhcmluZywgc28gYEpTT04uc3RyaW5naWZ5KHRpbWVsaW5lKWAgaXMgYWxyZWFkeVxuICogY29ycmVjdCBhbmQgbGluZWFyLiBXaGF0IGl0IHN0aWxsIG5lZWRzIGlzIHRoZSBib3VuZGVkIExMTSBwcm9qZWN0aW9uIOKAlFxuICoge0BsaW5rIGZvcm1hdFRpbWVsaW5lfSDigJQgYmVjYXVzZSBcInRoZSB3aG9sZSBsaWZlIG9mIGEga2V5XCIgaXMgdW5ib3VuZGVkIGluXG4gKiBhIGxvbmcgcnVuLlxuICovXG5cbmltcG9ydCB7IGZsYXR0ZW5DYXVzYWxEQUcsIGZvcm1hdENhdXNhbENoYWluIH0gZnJvbSAnLi4vbWVtb3J5L2JhY2t0cmFjay5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEZvcndhcmROb2RlLFxuICBGb3J3YXJkU2xpY2UsXG4gIEZvcndhcmRTbGljZUpTT04sXG4gIEhvbmVzdHlOb3RlLFxuICBLZXlUaW1lbGluZSxcbiAgU2xpY2VKU09OLFxuICBWYXJpYWJsZVNsaWNlLFxufSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBGbGF0LCBKU09OLXNhZmUgcHJvamVjdGlvbjogZXZlcnkgREFHIG5vZGUgZXhhY3RseSBvbmNlIChrZXllZCBieVxuICogcnVudGltZVN0YWdlSWQpLCBlZGdlcyBhcyBpZCByZWZlcmVuY2VzLiBMaW5lYXIgaW4gbm9kZSBjb3VudCDigJQgc2FmZSB0b1xuICogcGVyc2lzdCwgc2VuZCwgb3IgZmVlZCB0byBzdHJ1Y3R1cmVkIGNvbnN1bWVycy4gTG9zc2xlc3MgZm9yIGV2ZXJ5dGhpbmdcbiAqIGV4Y2VwdCB0aGUgaW4tbWVtb3J5IG9iamVjdCBncmFwaCBpdHNlbGYgKHJlYnVpbGQgYWRqYWNlbmN5IGZyb20gYGVkZ2VzYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGljZVRvSlNPTihzbGljZTogVmFyaWFibGVTbGljZSk6IFNsaWNlSlNPTiB7XG4gIGNvbnN0IG91dDogU2xpY2VKU09OID0ge1xuICAgIGtleTogc2xpY2Uua2V5LFxuICAgIC4uLihzbGljZS5iZWZvcmUgIT09IHVuZGVmaW5lZCAmJiB7IGJlZm9yZTogc2xpY2UuYmVmb3JlIH0pLFxuICAgIC4uLihzbGljZS5taXNzaW5nICE9PSB1bmRlZmluZWQgJiYgeyBtaXNzaW5nOiBzbGljZS5taXNzaW5nIH0pLFxuICAgIGtleXNSZWFkS2luZDogc2xpY2Uua2V5c1JlYWRLaW5kLFxuICAgIC4uLihzbGljZS5yZWFkc0NvdmVyYWdlICE9PSB1bmRlZmluZWQgJiYgeyByZWFkc0NvdmVyYWdlOiBzbGljZS5yZWFkc0NvdmVyYWdlIH0pLFxuICB9O1xuICBpZiAoIXNsaWNlLnJvb3QpIHJldHVybiBvdXQ7XG5cbiAgb3V0LndyaXRlcklkID0gc2xpY2Uucm9vdC5ydW50aW1lU3RhZ2VJZDtcbiAgY29uc3Qgbm9kZXM6IE5vbk51bGxhYmxlPFNsaWNlSlNPTlsnbm9kZXMnXT4gPSB7fTtcbiAgY29uc3QgZWRnZXM6IE5vbk51bGxhYmxlPFNsaWNlSlNPTlsnZWRnZXMnXT4gPSBbXTtcbiAgZm9yIChjb25zdCBub2RlIG9mIGZsYXR0ZW5DYXVzYWxEQUcoc2xpY2Uucm9vdCkpIHtcbiAgICBub2Rlc1tub2RlLnJ1bnRpbWVTdGFnZUlkXSA9IHtcbiAgICAgIHN0YWdlSWQ6IG5vZGUuc3RhZ2VJZCxcbiAgICAgIHN0YWdlTmFtZTogbm9kZS5zdGFnZU5hbWUsXG4gICAgICBrZXlzV3JpdHRlbjogbm9kZS5rZXlzV3JpdHRlbixcbiAgICAgIGRlcHRoOiBub2RlLmRlcHRoLFxuICAgICAgLi4uKG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMgIT09IHVuZGVmaW5lZCAmJiB7IGluY29tcGxldGVTb3VyY2VzOiBub2RlLmluY29tcGxldGVTb3VyY2VzIH0pLFxuICAgICAgLi4uKG5vZGUucHJlUnVuUmVhZHMgIT09IHVuZGVmaW5lZCAmJiB7IHByZVJ1blJlYWRzOiBub2RlLnByZVJ1blJlYWRzIH0pLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIG5vZGUucGFyZW50RWRnZXMpIHtcbiAgICAgIGVkZ2VzLnB1c2goe1xuICAgICAgICBmcm9tOiBub2RlLnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgICB0bzogZWRnZS5wYXJlbnQucnVudGltZVN0YWdlSWQsXG4gICAgICAgIGtpbmQ6IGVkZ2Uua2luZCxcbiAgICAgICAgLi4uKGVkZ2Uua2V5ICE9PSB1bmRlZmluZWQgJiYgeyBrZXk6IGVkZ2Uua2V5IH0pLFxuICAgICAgICB3ZWlnaHQ6IGVkZ2Uud2VpZ2h0LFxuICAgICAgICAuLi4oZWRnZS5iYXNpcyAhPT0gdW5kZWZpbmVkICYmIHsgYmFzaXM6IGVkZ2UuYmFzaXMgfSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgb3V0Lm5vZGVzID0gbm9kZXM7XG4gIG91dC5lZGdlcyA9IGVkZ2VzO1xuICBpZiAoc2xpY2Uucm9vdC50cnVuY2F0ZWQpIG91dC50cnVuY2F0ZWQgPSBzbGljZS5yb290LnRydW5jYXRlZDtcbiAgaWYgKHNsaWNlLm5vdGVzICE9PSB1bmRlZmluZWQpIG91dC5ub3RlcyA9IHNsaWNlLm5vdGVzO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE9uZSBib3VuZGVkIHN0cmluZyBmb3IgTExNIHRyaWFnZSB0b29scyAodGhlIGB0cmFjZVRvb2xwYWNrYCBjb25zdW1wdGlvblxuICogcGF0dGVybjogdG9vbHMgcmV0dXJuIHBsYWluIHN0cmluZ3MsIG5ldmVyIHJlY3Vyc2l2ZSBvYmplY3RzKS4gV3JhcHNcbiAqIGBmb3JtYXRDYXVzYWxDaGFpbmAgKHdoaWNoIGlzIGJ1ZGdldC1ib3VuZGVkIGJ5IGNhdXNhbENoYWluJ3NcbiAqIG1heERlcHRoL21heE5vZGVzIGFuZCByZW5kZXJzIHNoYXJlZCBub2RlcyBvbmNlIGFzIGDihrMg4oCmIChzZWUgYWJvdmUpYCksXG4gKiBhbmQgYWRkcyB0aGUgaG9uZXN0eSBlbnZlbG9wZSB0aGUgcmF3IGNoYWluIGRvZXNuJ3QgY2Fycnk6XG4gKlxuICogLSBtaXNzaW5nIHNsaWNlcyByZW5kZXIgdGhlaXIgcmVhc29uIChcInZhbHVlIGNhbWUgZnJvbSBpbml0aWFsIHN0YXRlIC9cbiAqICAgZnJvemVuIGFyZ3MgLyBhIGNsb3N1cmUg4oCUIHRoZSBjb21taXQgbG9nIGNhbm5vdCBzZWUgdGhvc2VcIiksXG4gKiAtIGEgcmVhZHMtbGVzcyBwcm92aWRlciAoYHJlYWRUcmFja2luZzogJ29mZidgIHNpZ25hdHVyZSkgcmVuZGVycyBhblxuICogICBleHBsaWNpdCBcIuKaoCByZWFkcyB3ZXJlIG5vdCByZWNvcmRlZFwiIGluc3RlYWQgb2Ygc2lsZW50bHkgc2hvd2luZyBhblxuICogICBhbmNob3Igd2l0aCBubyBkZXBlbmRlbmNpZXMsXG4gKiAtIHRydW5jYXRpb24gZm9vdGVycyBwYXNzIHRocm91Z2ggZnJvbSBmb3JtYXRDYXVzYWxDaGFpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNsaWNlKHNsaWNlOiBWYXJpYWJsZVNsaWNlKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGFuY2hvciA9IHNsaWNlLmJlZm9yZSAhPT0gdW5kZWZpbmVkID8gYCAoYmVmb3JlIGNvbW1pdCAke3NsaWNlLmJlZm9yZX0pYCA6ICcnO1xuICBsaW5lcy5wdXNoKGBTTElDRSBmb3IgJyR7c2xpY2Uua2V5fScke2FuY2hvcn0g4oCUIHJlYWRzIHZpYTogJHtzbGljZS5rZXlzUmVhZEtpbmR9YCk7XG5cbiAgaWYgKHNsaWNlLm1pc3NpbmcgPT09ICdlbXB0eS1sb2cnKSB7XG4gICAgbGluZXMucHVzaCgnbm8gc2xpY2U6IHRoZSBjb21taXQgbG9nIGlzIGVtcHR5IChub3RoaW5nIGhhcyBleGVjdXRlZCkuJyk7XG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG4gIGlmIChzbGljZS5taXNzaW5nID09PSAnbmV2ZXItd3JpdHRlbicpIHtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgYG5vIHNsaWNlOiAnJHtzbGljZS5rZXl9JyB3YXMgbmV2ZXIgd3JpdHRlbiBpbiByYW5nZSDigJQgdGhlIHZhbHVlIGNhbWUgZnJvbSBgICtcbiAgICAgICAgJ2luaXRpYWwgc3RhdGUsIGZyb3plbiBydW4gaW5wdXQgKGFyZ3MpLCBvciBhIGNsb3N1cmU7IHRoZSBjb21taXQgbG9nIGNhbm5vdCBzZWUgdGhvc2UuJyxcbiAgICApO1xuICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIGNvbnN0IGNvdiA9IHNsaWNlLnJlYWRzQ292ZXJhZ2U7XG4gIGlmIChjb3YgJiYgY292LnN0ZXBzID4gMSAmJiBjb3Yuc3RlcHNXaXRoUmVhZHMgPT09IDApIHtcbiAgICBsaW5lcy5wdXNoKFxuICAgICAgXCLimqAgcmVhZHMgd2VyZSBub3QgcmVjb3JkZWQgKHJlYWRUcmFja2luZyBtYXkgYmUgJ29mZicpIOKAlCBkZXBlbmRlbmNpZXMgYmVsb3cgYXJlIFwiICsgJ3Vua25vd2FibGUsIE5PVCBhYnNlbnQuJyxcbiAgICApO1xuICB9XG4gIGlmIChzbGljZS5yb290KSBsaW5lcy5wdXNoKGZvcm1hdENhdXNhbENoYWluKHNsaWNlLnJvb3QpKTtcbiAgcmV0dXJuIFsuLi5saW5lcywgLi4ubm90ZUxpbmVzKHNsaWNlLm5vdGVzID8/IFtdKV0uam9pbignXFxuJyk7XG59XG5cbi8vIOKUgOKUgCBGb3J3YXJkIHByb2plY3Rpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogSG93IG1hbnkgcmVhZHMgb25lIG5vZGUgbGlzdHMgYmVmb3JlIHRoZSByZW5kZXJlciBzYXlzIFwi4oCmIGFuZCBOIG1vcmVcIi4gKi9cbmNvbnN0IFJFQURTX1JFTkRFUkVEID0gNTtcblxuLyoqIEJGUyBvdmVyIHRoZSBmb3J3YXJkIERBRywgZWFjaCBub2RlIGV4YWN0bHkgb25jZSAoc2hhcmVkIG5vZGVzIGluY2x1ZGVkKS4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5Gb3J3YXJkREFHKHJvb3Q6IEZvcndhcmROb2RlKTogRm9yd2FyZE5vZGVbXSB7XG4gIGNvbnN0IG91dDogRm9yd2FyZE5vZGVbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxGb3J3YXJkTm9kZT4oKTtcbiAgY29uc3QgcXVldWU6IEZvcndhcmROb2RlW10gPSBbcm9vdF07XG4gIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3Qgbm9kZSA9IHF1ZXVlLnNoaWZ0KCkhO1xuICAgIGlmIChzZWVuLmhhcyhub2RlKSkgY29udGludWU7XG4gICAgc2Vlbi5hZGQobm9kZSk7XG4gICAgb3V0LnB1c2gobm9kZSk7XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIG5vZGUuZmVkRWRnZXMpIGlmICghc2Vlbi5oYXMoZWRnZS5jaGlsZCkpIHF1ZXVlLnB1c2goZWRnZS5jaGlsZCk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIGDimqAg4oCmYCBsaW5lcyBmb3IgdGhlIGhvbmVzdHkgZW52ZWxvcGUg4oCUIHNhbWUgcmVuZGVyaW5nIGZvciBib3RoIGRvb3JzLiAqL1xuZnVuY3Rpb24gbm90ZUxpbmVzKG5vdGVzOiBIb25lc3R5Tm90ZVtdKTogc3RyaW5nW10ge1xuICByZXR1cm4gbm90ZXMubWFwKChuKSA9PiBg4pqgICR7bi5kZXRhaWx9YCk7XG59XG5cbi8qKiBPbmUgbm9kZSdzIGhlYWRsaW5lOiB3aG8gd3JvdGUgdGhlIHZhbHVlLCBhbmQgaG93IGxvbmcgaXQgbGl2ZWQuICovXG5mdW5jdGlvbiBub2RlSGVhZGxpbmUobm9kZTogRm9yd2FyZE5vZGUpOiBzdHJpbmcge1xuICBjb25zdCBsaWZlID1cbiAgICBub2RlLm5leHRXcml0ZUlkeCAhPT0gdW5kZWZpbmVkID8gYGxpdmUgdW50aWwgY29tbWl0ICR7bm9kZS5uZXh0V3JpdGVJZHh9YCA6ICdsaXZlIHRvIHRoZSBlbmQgb2YgdGhlIHJ1bic7XG4gIGlmIChub2RlLm9yaWdpbiA9PT0gJ3ByZS1ydW4nKSB7XG4gICAgcmV0dXJuIGAnJHtub2RlLmtleX0nIGZyb20gQkVGT1JFIHRoZSBydW4gKGluaXRpYWwgc3RhdGUgLyBpbnB1dCAvIGNsb3N1cmUpIOKAlCAke2xpZmV9YDtcbiAgfVxuICByZXR1cm4gYCcke25vZGUua2V5fScgJHtub2RlLnZlcmIgPz8gJ3NldCd9IGJ5ICR7bm9kZS5zdGFnZU5hbWV9ICgke25vZGUucnVudGltZVN0YWdlSWR9KSBAJHtcbiAgICBub2RlLmNvbW1pdElkeFxuICB9IOKAlCAke2xpZmV9YDtcbn1cblxuLyoqXG4gKiBGbGF0LCBKU09OLXNhZmUgcHJvamVjdGlvbiBvZiBhIHtAbGluayBGb3J3YXJkU2xpY2V9IOKAlCB0aGUgZm9yd2FyZCB0d2luIG9mXG4gKiB7QGxpbmsgc2xpY2VUb0pTT059LCBsaW5lYXIgaW4gbm9kZSBjb3VudC5cbiAqXG4gKiBOb2RlIGlkcyBhcmUgT1BBUVVFIChgbjBgLCBgbjFgLCDigKYgaW4gQkZTIG9yZGVyKSByYXRoZXIgdGhhblxuICogYHJ1bnRpbWVTdGFnZUlkYCBhcyBpbiBgU2xpY2VKU09OYCwgZm9yIGEgc3RydWN0dXJhbCByZWFzb246IGEgZm9yd2FyZFxuICogbm9kZSBpcyBhIChrZXksIHdyaXRlKSBwYWlyLCBzbyBPTkUgc3RhZ2UgdGhhdCB3cm90ZSB0d28ga2V5cyBvd25zIHR3b1xuICogbm9kZXMgYW5kIGEgcnVudGltZVN0YWdlSWQgY2Fubm90IGtleSB0aGUgbWFwLiBOZXZlciBwYXJzZSB0aGUgaWRzIOKAlCBqb2luXG4gKiBvbiBgcnVudGltZVN0YWdlSWRgIC8gYGNvbW1pdElkeGAgLyBga2V5YCwgd2hpY2ggZXZlcnkgbm9kZSBjYXJyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZFNsaWNlVG9KU09OKHNsaWNlOiBGb3J3YXJkU2xpY2UpOiBGb3J3YXJkU2xpY2VKU09OIHtcbiAgY29uc3Qgb3V0OiBGb3J3YXJkU2xpY2VKU09OID0ge1xuICAgIGtleTogc2xpY2Uua2V5LFxuICAgIC4uLihzbGljZS5iZWZvcmUgIT09IHVuZGVmaW5lZCAmJiB7IGJlZm9yZTogc2xpY2UuYmVmb3JlIH0pLFxuICAgIC4uLihzbGljZS5taXNzaW5nICE9PSB1bmRlZmluZWQgJiYgeyBtaXNzaW5nOiBzbGljZS5taXNzaW5nIH0pLFxuICAgIGtleXNSZWFkS2luZDogc2xpY2Uua2V5c1JlYWRLaW5kLFxuICAgIC4uLihzbGljZS5yZWFkc0NvdmVyYWdlICE9PSB1bmRlZmluZWQgJiYgeyByZWFkc0NvdmVyYWdlOiBzbGljZS5yZWFkc0NvdmVyYWdlIH0pLFxuICAgIG5vdGVzOiBzbGljZS5ub3RlcyxcbiAgfTtcbiAgaWYgKCFzbGljZS5yb290KSByZXR1cm4gb3V0O1xuXG4gIGNvbnN0IGZsYXQgPSBmbGF0dGVuRm9yd2FyZERBRyhzbGljZS5yb290KTtcbiAgY29uc3QgaWRzID0gbmV3IE1hcDxGb3J3YXJkTm9kZSwgc3RyaW5nPigpO1xuICBmbGF0LmZvckVhY2goKG5vZGUsIGkpID0+IGlkcy5zZXQobm9kZSwgYG4ke2l9YCkpO1xuXG4gIG91dC5yb290SWQgPSBpZHMuZ2V0KHNsaWNlLnJvb3QpO1xuICBvdXQubm9kZXMgPSBmbGF0Lm1hcCgobm9kZSkgPT4gKHtcbiAgICBpZDogaWRzLmdldChub2RlKSEsXG4gICAga2V5OiBub2RlLmtleSxcbiAgICBvcmlnaW46IG5vZGUub3JpZ2luLFxuICAgIC4uLihub2RlLnJ1bnRpbWVTdGFnZUlkICE9PSB1bmRlZmluZWQgJiYgeyBydW50aW1lU3RhZ2VJZDogbm9kZS5ydW50aW1lU3RhZ2VJZCB9KSxcbiAgICAuLi4obm9kZS5zdGFnZUlkICE9PSB1bmRlZmluZWQgJiYgeyBzdGFnZUlkOiBub2RlLnN0YWdlSWQgfSksXG4gICAgLi4uKG5vZGUuc3RhZ2VOYW1lICE9PSB1bmRlZmluZWQgJiYgeyBzdGFnZU5hbWU6IG5vZGUuc3RhZ2VOYW1lIH0pLFxuICAgIC4uLihub2RlLmNvbW1pdElkeCAhPT0gdW5kZWZpbmVkICYmIHsgY29tbWl0SWR4OiBub2RlLmNvbW1pdElkeCB9KSxcbiAgICAuLi4obm9kZS52ZXJiICE9PSB1bmRlZmluZWQgJiYgeyB2ZXJiOiBub2RlLnZlcmIgfSksXG4gICAgLi4uKG5vZGUubmV4dFdyaXRlSWR4ICE9PSB1bmRlZmluZWQgJiYgeyBuZXh0V3JpdGVJZHg6IG5vZGUubmV4dFdyaXRlSWR4IH0pLFxuICAgIGRlcHRoOiBub2RlLmRlcHRoLFxuICAgIHJlYWRzOiBub2RlLnJlYWRzLFxuICAgIC4uLihub2RlLmluY29tcGxldGVTb3VyY2VzICE9PSB1bmRlZmluZWQgJiYgeyBpbmNvbXBsZXRlU291cmNlczogbm9kZS5pbmNvbXBsZXRlU291cmNlcyB9KSxcbiAgfSkpO1xuICBvdXQuZWRnZXMgPSBmbGF0LmZsYXRNYXAoKG5vZGUpID0+XG4gICAgbm9kZS5mZWRFZGdlcy5tYXAoKGVkZ2UpID0+ICh7IGZyb206IGlkcy5nZXQobm9kZSkhLCB0bzogaWRzLmdldChlZGdlLmNoaWxkKSEsIGJhc2lzOiBlZGdlLmJhc2lzIH0pKSxcbiAgKTtcbiAgaWYgKHNsaWNlLnJvb3QudHJ1bmNhdGVkKSBvdXQudHJ1bmNhdGVkID0gc2xpY2Uucm9vdC50cnVuY2F0ZWQ7XG4gIGlmIChzbGljZS5ub3RlcyAhPT0gdW5kZWZpbmVkKSBvdXQubm90ZXMgPSBzbGljZS5ub3RlcztcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBPbmUgYm91bmRlZCBzdHJpbmcgZm9yIExMTSB0cmlhZ2UgdG9vbHMg4oCUIHRoZSBmb3J3YXJkIHR3aW4gb2ZcbiAqIHtAbGluayBmb3JtYXRTbGljZX0uIFNoYXJlZCBub2RlcyByZW5kZXIgb25jZSAoYOKGsyDigKYgKHNlZSBhYm92ZSlgLCB0aGUgc2FtZVxuICogY29udmVudGlvbiBgZm9ybWF0Q2F1c2FsQ2hhaW5gIHVzZXMpLCByZWFkIGxpc3RzIGFyZSBjYXBwZWQsIGFuZCBldmVyeVxuICogaG9uZXN0eSBub3RlIHJlbmRlcnMgYXMgYSBg4pqgYCBsaW5lIOKAlCBpbmNsdWRpbmcgdGhlIG9uZSB0aGF0IHNheXMgYSBgZmVkYFxuICogZWRnZSBpcyBjb25zZXJ2YXRpdmUsIHdoaWNoIGlzIHdoeSBlZGdlcyBwcmludCBgW2V4YWN0XWAgLyBgW2NvbnNlcnZhdGl2ZV1gXG4gKiByYXRoZXIgdGhhbiBsb29raW5nIGFsaWtlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Rm9yd2FyZFNsaWNlKHNsaWNlOiBGb3J3YXJkU2xpY2UpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgYW5jaG9yID0gc2xpY2UuYmVmb3JlICE9PSB1bmRlZmluZWQgPyBgIChhcyBvZiBiZWZvcmUgY29tbWl0ICR7c2xpY2UuYmVmb3JlfSlgIDogJyc7XG4gIGxpbmVzLnB1c2goYEZPUldBUkQgU0xJQ0UgZm9yICcke3NsaWNlLmtleX0nJHthbmNob3J9IOKAlCByZWFkcyB2aWE6ICR7c2xpY2Uua2V5c1JlYWRLaW5kfWApO1xuXG4gIGlmIChzbGljZS5taXNzaW5nID09PSAnZW1wdHktbG9nJykge1xuICAgIGxpbmVzLnB1c2goJ25vIGZvcndhcmQgc2xpY2U6IHRoZSBjb21taXQgbG9nIGlzIGVtcHR5IChub3RoaW5nIGhhcyBleGVjdXRlZCkuJyk7XG4gICAgcmV0dXJuIFsuLi5saW5lcywgLi4ubm90ZUxpbmVzKHNsaWNlLm5vdGVzKV0uam9pbignXFxuJyk7XG4gIH1cbiAgaWYgKHNsaWNlLm1pc3NpbmcgPT09ICduZXZlci13cml0dGVuJykge1xuICAgIGxpbmVzLnB1c2goYG5vIGZvcndhcmQgc2xpY2U6ICcke3NsaWNlLmtleX0nIHdhcyBuZXZlciB3cml0dGVuIGFuZCBuZXZlciByZWFkIGluIHRoaXMgbG9nLmApO1xuICAgIHJldHVybiBbLi4ubGluZXMsIC4uLm5vdGVMaW5lcyhzbGljZS5ub3RlcyldLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8Rm9yd2FyZE5vZGU+KCk7XG4gIGNvbnN0IHdhbGsgPSAobm9kZTogRm9yd2FyZE5vZGUsIGluZGVudDogbnVtYmVyLCBsZWFkID0gJycpOiB2b2lkID0+IHtcbiAgICBjb25zdCBwYWQgPSAnICAnLnJlcGVhdChpbmRlbnQpO1xuICAgIGNvbnN0IGhlYWQgPSBgJHtwYWR9JHtsZWFkfSR7bm9kZUhlYWRsaW5lKG5vZGUpfWA7XG4gICAgaWYgKHNlZW4uaGFzKG5vZGUpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAke2hlYWR9IOKGsyAoc2VlIGFib3ZlKWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZWVuLmFkZChub2RlKTtcbiAgICBsaW5lcy5wdXNoKGhlYWQpO1xuICAgIGlmIChub2RlLmluY29tcGxldGVTb3VyY2VzICYmIG5vZGUuaW5jb21wbGV0ZVNvdXJjZXMubGVuZ3RoID4gMCkge1xuICAgICAgbGluZXMucHVzaChgJHtwYWR9ICDimqAgaXRzIHdyaXRlciBhbHNvIGNvbnN1bWVkICR7bm9kZS5pbmNvbXBsZXRlU291cmNlcy5qb2luKCcvJyl9IOKAlCB1bnRyYWNrZWRgKTtcbiAgICB9XG4gICAgaWYgKG5vZGUucmVhZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBsaW5lcy5wdXNoKGAke3BhZH0gIChubyByZWNvcmRlZCByZWFkIG9mIHRoaXMgdmFsdWUpYCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVhZCBvZiBub2RlLnJlYWRzLnNsaWNlKDAsIFJFQURTX1JFTkRFUkVEKSkge1xuICAgICAgbGluZXMucHVzaChgJHtwYWR9ICByZWFkIGJ5ICR7cmVhZC5zdGFnZU5hbWV9ICgke3JlYWQucnVudGltZVN0YWdlSWR9KSBAJHtyZWFkLmNvbW1pdElkeH1gKTtcbiAgICB9XG4gICAgaWYgKG5vZGUucmVhZHMubGVuZ3RoID4gUkVBRFNfUkVOREVSRUQpIHtcbiAgICAgIGxpbmVzLnB1c2goYCR7cGFkfSAg4oCmIGFuZCAke25vZGUucmVhZHMubGVuZ3RoIC0gUkVBRFNfUkVOREVSRUR9IG1vcmUgcmVhZHNgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBlZGdlIG9mIG5vZGUuZmVkRWRnZXMpIHtcbiAgICAgIHdhbGsoZWRnZS5jaGlsZCwgaW5kZW50ICsgMSwgYOKGkiBmZWQgJHtlZGdlLmJhc2lzID09PSAncGVyLXdyaXRlJyA/ICdbZXhhY3RdJyA6ICdbY29uc2VydmF0aXZlXSd9IGApO1xuICAgIH1cbiAgfTtcbiAgaWYgKHNsaWNlLnJvb3QpIHdhbGsoc2xpY2Uucm9vdCwgMCk7XG5cbiAgcmV0dXJuIFsuLi5saW5lcywgLi4ubm90ZUxpbmVzKHNsaWNlLm5vdGVzKV0uam9pbignXFxuJyk7XG59XG5cbi8qKiBIb3cgbWFueSBtb21lbnRzIHtAbGluayBmb3JtYXRUaW1lbGluZX0gcmVuZGVycyBiZWZvcmUgaXQgc2F5cyBcIuKApiBhbmQgTiBtb3JlXCIuICovXG5jb25zdCBNT01FTlRTX1JFTkRFUkVEID0gNjA7XG5cbi8qKlxuICogT25lIGJvdW5kZWQgc3RyaW5nIGZvciBhIHtAbGluayBLZXlUaW1lbGluZX0g4oCUIHRoZSBMTE0vaHVtYW4gcHJvamVjdGlvbi5cbiAqIChUaGUgdGltZWxpbmUncyBKU09OIG5lZWRzIG5vIGhlbHBlcjogaXQgaXMgYWxyZWFkeSBmbGF0IGFuZCBKU09OLXNhZmUg4oCUXG4gKiBzZWUgdGhlIGZpbGUgaGVhZGVyLikgVHJ1bmNhdGlvbiBpcyBzdGF0ZWQsIG5ldmVyIHNpbGVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFRpbWVsaW5lKHRpbWVsaW5lOiBLZXlUaW1lbGluZSk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBib3VuZCA9IHRpbWVsaW5lLmJlZm9yZSAhPT0gdW5kZWZpbmVkID8gYCAoYmVmb3JlIGNvbW1pdCAke3RpbWVsaW5lLmJlZm9yZX0pYCA6ICcnO1xuICBsaW5lcy5wdXNoKGBUSU1FTElORSBmb3IgJyR7dGltZWxpbmUua2V5fScke2JvdW5kfSDigJQgcmVhZHMgdmlhOiAke3RpbWVsaW5lLmtleXNSZWFkS2luZH1gKTtcblxuICBpZiAodGltZWxpbmUubWlzc2luZyA9PT0gJ2VtcHR5LWxvZycpIHtcbiAgICBsaW5lcy5wdXNoKCdubyB0aW1lbGluZTogdGhlIGNvbW1pdCBsb2cgaXMgZW1wdHkgKG5vdGhpbmcgaGFzIGV4ZWN1dGVkKS4nKTtcbiAgICByZXR1cm4gWy4uLmxpbmVzLCAuLi5ub3RlTGluZXModGltZWxpbmUubm90ZXMpXS5qb2luKCdcXG4nKTtcbiAgfVxuICBpZiAodGltZWxpbmUubWlzc2luZyA9PT0gJ25ldmVyLXdyaXR0ZW4nKSB7XG4gICAgbGluZXMucHVzaChgbm8gdGltZWxpbmU6ICcke3RpbWVsaW5lLmtleX0nIHdhcyBuZXZlciB3cml0dGVuIGFuZCBuZXZlciByZWFkIGluIHRoaXMgbG9nLmApO1xuICAgIHJldHVybiBbLi4ubGluZXMsIC4uLm5vdGVMaW5lcyh0aW1lbGluZS5ub3RlcyldLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgY29uc3QgbW9tZW50cyA9IHRpbWVsaW5lLm1vbWVudHMgPz8gW107XG4gIGlmIChtb21lbnRzLmxlbmd0aCA9PT0gMCkgbGluZXMucHVzaCgnKG5vIHJlY29yZGVkIG1vbWVudCBmb3IgdGhpcyBrZXkpJyk7XG4gIGZvciAoY29uc3QgbW9tZW50IG9mIG1vbWVudHMuc2xpY2UoMCwgTU9NRU5UU19SRU5ERVJFRCkpIHtcbiAgICBjb25zdCB3aGVyZSA9IGAke21vbWVudC5zdGFnZU5hbWV9ICgke21vbWVudC5ydW50aW1lU3RhZ2VJZH0pYDtcbiAgICBpZiAobW9tZW50LmtpbmQgPT09ICd3cml0ZScpIHtcbiAgICAgIGxpbmVzLnB1c2goYEAke21vbWVudC5jb21taXRJZHh9IHdyaXRlICR7bW9tZW50LnZlcmIgPz8gJ3NldCd9IOKAlCAke3doZXJlfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmcm9tID1cbiAgICAgICAgbW9tZW50LmZyb21Xcml0ZUlkeCAhPT0gdW5kZWZpbmVkID8gYHZhbHVlIGZyb20gY29tbWl0ICR7bW9tZW50LmZyb21Xcml0ZUlkeH1gIDogJ3ZhbHVlIGZyb20gQkVGT1JFIHRoZSBydW4nO1xuICAgICAgbGluZXMucHVzaChgQCR7bW9tZW50LmNvbW1pdElkeH0gcmVhZCAg4oCUICR7d2hlcmV9ICgke2Zyb219KWApO1xuICAgIH1cbiAgfVxuICBpZiAobW9tZW50cy5sZW5ndGggPiBNT01FTlRTX1JFTkRFUkVEKSB7XG4gICAgbGluZXMucHVzaChg4oCmIGFuZCAke21vbWVudHMubGVuZ3RoIC0gTU9NRU5UU19SRU5ERVJFRH0gbW9yZSBtb21lbnRzIChib3VuZGVkIG91dHB1dClgKTtcbiAgfVxuXG4gIHJldHVybiBbLi4ubGluZXMsIC4uLm5vdGVMaW5lcyh0aW1lbGluZS5ub3RlcyldLmpvaW4oJ1xcbicpO1xufVxuIl19
@@ -1,47 +0,0 @@
1
- /**
2
- * slice/sliceForKey.ts — the variable-first backward slice query.
3
- *
4
- * "Why is `key` what it is?" — the ONE question every triage surface asks:
5
- * a human clicking a key in explainable-ui, an LLM calling a `backtrack`
6
- * tool mid-conversation, an offline autopsy agent over a stored run.
7
- *
8
- * WHY this is deliberately a composition and not a new algorithm:
9
- * `findLastWriter` already answers "who made the value what it is" and
10
- * `causalChain` already answers "what influenced that step" (thin backward
11
- * slicing, Weiser 1984). What was missing is the shared CONTRACT — without
12
- * it, every surface hand-rolls the anchor step differently and their answers
13
- * disagree. The value of this function is that they can't.
14
- */
15
- import { type CausalChainOptions, type KeysReadLookup } from '../memory/backtrack.js';
16
- import type { CommitBundle } from '../memory/types.js';
17
- import type { KeysReadSource, StateKey, VariableSlice } from './types.js';
18
- /**
19
- * Normalise a consumer-facing {@link StateKey} to the engine's canonical
20
- * string form (the `TraceEntry.path` space). Path arrays go through the same
21
- * normaliser the engine writes with — the delimiter never leaks into the
22
- * public contract.
23
- */
24
- export declare function normaliseStateKey(key: StateKey): string;
25
- /** Options for {@link sliceForKey} — causalChain's options plus anchoring. */
26
- export interface SliceForKeyOptions extends CausalChainOptions {
27
- /**
28
- * Exclusive commit-array-index upper bound: slice the value as it stood
29
- * BEFORE this idx (time-travel triage — "why was it X at step 12?").
30
- * Same contract as `findLastWriter`'s `beforeIdx`. Omit for the current
31
- * value. Chained-triage idiom: to slice at an {@link ElementBirth}, pass
32
- * `before: birth.commitIdx + 1` (birth idx is inclusive, this bound is
33
- * exclusive — the +1 makes the birth commit itself the anchor).
34
- */
35
- before?: number;
36
- }
37
- /**
38
- * Backward slice for one state key: anchor at the key's last writer, then
39
- * walk read→write (and optional control) dependencies transitively.
40
- *
41
- * Honest-absence contract: a missing slice is a RESULT, not an error —
42
- * `missing: 'never-written'` tells a triage tool (or its LLM caller) that
43
- * the value came from initial state / frozen args / a closure, which is
44
- * itself diagnostic information. See {@link VariableSlice} — including its
45
- * SERIALIZATION WARNING before you stringify the result.
46
- */
47
- export declare function sliceForKey(commitLog: CommitBundle[], key: StateKey, keysRead: KeysReadSource | KeysReadLookup, options?: SliceForKeyOptions): VariableSlice;
@@ -1,88 +0,0 @@
1
- /**
2
- * slice/sliceForKey.ts — the variable-first backward slice query.
3
- *
4
- * "Why is `key` what it is?" — the ONE question every triage surface asks:
5
- * a human clicking a key in explainable-ui, an LLM calling a `backtrack`
6
- * tool mid-conversation, an offline autopsy agent over a stored run.
7
- *
8
- * WHY this is deliberately a composition and not a new algorithm:
9
- * `findLastWriter` already answers "who made the value what it is" and
10
- * `causalChain` already answers "what influenced that step" (thin backward
11
- * slicing, Weiser 1984). What was missing is the shared CONTRACT — without
12
- * it, every surface hand-rolls the anchor step differently and their answers
13
- * disagree. The value of this function is that they can't.
14
- */
15
- import { causalChain } from '../memory/backtrack.js';
16
- import { commitValueAtWithBasis, findLastWriterWithBasis } from '../memory/commitLogUtils.js';
17
- import { normalisePath } from '../memory/utils.js';
18
- import { fromInitialStateNote, nestedRowsNote, redactedValueNote } from './keyIndex.js';
19
- import { resolveKeysReadSource } from './keysReadSources.js';
20
- /**
21
- * Normalise a consumer-facing {@link StateKey} to the engine's canonical
22
- * string form (the `TraceEntry.path` space). Path arrays go through the same
23
- * normaliser the engine writes with — the delimiter never leaks into the
24
- * public contract.
25
- */
26
- export function normaliseStateKey(key) {
27
- return typeof key === 'string' ? key : normalisePath([...key]);
28
- }
29
- /**
30
- * Backward slice for one state key: anchor at the key's last writer, then
31
- * walk read→write (and optional control) dependencies transitively.
32
- *
33
- * Honest-absence contract: a missing slice is a RESULT, not an error —
34
- * `missing: 'never-written'` tells a triage tool (or its LLM caller) that
35
- * the value came from initial state / frozen args / a closure, which is
36
- * itself diagnostic information. See {@link VariableSlice} — including its
37
- * SERIALIZATION WARNING before you stringify the result.
38
- */
39
- export function sliceForKey(commitLog, key, keysRead, options) {
40
- const source = resolveKeysReadSource(keysRead);
41
- const normalisedKey = normaliseStateKey(key);
42
- const base = {
43
- key: normalisedKey,
44
- ...(options?.before !== undefined && { before: options.before }),
45
- keysReadKind: source.kind,
46
- ...(source.coverage !== undefined && { readsCoverage: source.coverage }),
47
- };
48
- if (commitLog.length === 0)
49
- return { ...base, missing: 'empty-log' };
50
- const { writer, basis } = findLastWriterWithBasis(commitLog, normalisedKey, options?.before);
51
- // F4b: what the value at the slice's point rests on, from the value twin — a redaction, the pre-run base.
52
- const end = Math.min(options?.before ?? commitLog.length, commitLog.length) - 1;
53
- const value = end >= 0 ? commitValueAtWithBasis(commitLog, end, normalisedKey).basis : [];
54
- if (!writer) {
55
- // 'never-written' already says the value came from before the run; a redaction that hid the write does not.
56
- return {
57
- ...base,
58
- missing: 'never-written',
59
- ...(value.includes('redacted') && { notes: [redactedValueNote(normalisedKey)] }),
60
- };
61
- }
62
- // A writer that reached the key only through rows inside it made part of the value — say so.
63
- const notes = basis.includes('nested-rows') ? [nestedRowsNote(normalisedKey, [commitLog.indexOf(writer)])] : [];
64
- if (value.includes('from-initial-state'))
65
- notes.push(fromInitialStateNote(normalisedKey));
66
- if (value.includes('redacted'))
67
- notes.push(redactedValueNote(normalisedKey));
68
- // INVARIANT: `writer` came FROM this commitLog, so its runtimeStageId is
69
- // always present in causalChain's index — causalChain cannot return
70
- // undefined here (it only does for ids absent from the log). The non-null
71
- // assertion keeps the VariableSlice contract airtight: `missing` is the
72
- // ONLY absent-root state. Options pass straight through (controlDeps /
73
- // weigh / maxDepth / maxNodes keep their causalChain semantics).
74
- //
75
- // edgeAttribution defaults to 'per-write' HERE (unlike causalChain's
76
- // 'stage' default): a variable-first slice knows exactly which written key
77
- // anchors the question, and per-write attribution is strictly-safe — logs
78
- // without `TraceEntry.readKeys` (the writeProvenance dial off) fall back
79
- // to stage-level expansion per node, byte-identically. Consumers can force
80
- // 'stage' via options.
81
- const root = causalChain(commitLog, writer.runtimeStageId, source.lookup, {
82
- ...options,
83
- edgeAttribution: options?.edgeAttribution ?? 'per-write',
84
- rootLinkKeys: options?.rootLinkKeys ?? [normalisedKey],
85
- });
86
- return { ...base, writer, root, ...(notes.length > 0 && { notes }) };
87
- }
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2VGb3JLZXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NsaWNlL3NsaWNlRm9yS2V5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSCxPQUFPLEVBQWdELFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25HLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTlGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRzdEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQWE7SUFDN0MsT0FBTyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFlRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixTQUF5QixFQUN6QixHQUFhLEVBQ2IsUUFBeUMsRUFDekMsT0FBNEI7SUFFNUIsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsTUFBTSxhQUFhLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0MsTUFBTSxJQUFJLEdBQTZFO1FBQ3JGLEdBQUcsRUFBRSxhQUFhO1FBQ2xCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxLQUFLLFNBQVMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ3pCLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDekUsQ0FBQztJQUVGLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQztJQUVyRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdGLDBHQUEwRztJQUMxRyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hGLE1BQU0sS0FBSyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDMUYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osNEdBQTRHO1FBQzVHLE9BQU87WUFDTCxHQUFHLElBQUk7WUFDUCxPQUFPLEVBQUUsZUFBZTtZQUN4QixHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNqRixDQUFDO0lBQ0osQ0FBQztJQUNELDZGQUE2RjtJQUM3RixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDaEgsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDO1FBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzFGLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFN0UseUVBQXlFO0lBQ3pFLG9FQUFvRTtJQUNwRSwwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ3hFLHVFQUF1RTtJQUN2RSxpRUFBaUU7SUFDakUsRUFBRTtJQUNGLHFFQUFxRTtJQUNyRSwyRUFBMkU7SUFDM0UsMEVBQTBFO0lBQzFFLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsdUJBQXVCO0lBQ3ZCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFO1FBQ3hFLEdBQUcsT0FBTztRQUNWLGVBQWUsRUFBRSxPQUFPLEVBQUUsZUFBZSxJQUFJLFdBQVc7UUFDeEQsWUFBWSxFQUFFLE9BQU8sRUFBRSxZQUFZLElBQUksQ0FBQyxhQUFhLENBQUM7S0FDdkQsQ0FBRSxDQUFDO0lBQ0osT0FBTyxFQUFFLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3ZFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNsaWNlL3NsaWNlRm9yS2V5LnRzIOKAlCB0aGUgdmFyaWFibGUtZmlyc3QgYmFja3dhcmQgc2xpY2UgcXVlcnkuXG4gKlxuICogXCJXaHkgaXMgYGtleWAgd2hhdCBpdCBpcz9cIiDigJQgdGhlIE9ORSBxdWVzdGlvbiBldmVyeSB0cmlhZ2Ugc3VyZmFjZSBhc2tzOlxuICogYSBodW1hbiBjbGlja2luZyBhIGtleSBpbiBleHBsYWluYWJsZS11aSwgYW4gTExNIGNhbGxpbmcgYSBgYmFja3RyYWNrYFxuICogdG9vbCBtaWQtY29udmVyc2F0aW9uLCBhbiBvZmZsaW5lIGF1dG9wc3kgYWdlbnQgb3ZlciBhIHN0b3JlZCBydW4uXG4gKlxuICogV0hZIHRoaXMgaXMgZGVsaWJlcmF0ZWx5IGEgY29tcG9zaXRpb24gYW5kIG5vdCBhIG5ldyBhbGdvcml0aG06XG4gKiBgZmluZExhc3RXcml0ZXJgIGFscmVhZHkgYW5zd2VycyBcIndobyBtYWRlIHRoZSB2YWx1ZSB3aGF0IGl0IGlzXCIgYW5kXG4gKiBgY2F1c2FsQ2hhaW5gIGFscmVhZHkgYW5zd2VycyBcIndoYXQgaW5mbHVlbmNlZCB0aGF0IHN0ZXBcIiAodGhpbiBiYWNrd2FyZFxuICogc2xpY2luZywgV2Vpc2VyIDE5ODQpLiBXaGF0IHdhcyBtaXNzaW5nIGlzIHRoZSBzaGFyZWQgQ09OVFJBQ1Qg4oCUIHdpdGhvdXRcbiAqIGl0LCBldmVyeSBzdXJmYWNlIGhhbmQtcm9sbHMgdGhlIGFuY2hvciBzdGVwIGRpZmZlcmVudGx5IGFuZCB0aGVpciBhbnN3ZXJzXG4gKiBkaXNhZ3JlZS4gVGhlIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhhdCB0aGV5IGNhbid0LlxuICovXG5cbmltcG9ydCB7IHR5cGUgQ2F1c2FsQ2hhaW5PcHRpb25zLCB0eXBlIEtleXNSZWFkTG9va3VwLCBjYXVzYWxDaGFpbiB9IGZyb20gJy4uL21lbW9yeS9iYWNrdHJhY2suanMnO1xuaW1wb3J0IHsgY29tbWl0VmFsdWVBdFdpdGhCYXNpcywgZmluZExhc3RXcml0ZXJXaXRoQmFzaXMgfSBmcm9tICcuLi9tZW1vcnkvY29tbWl0TG9nVXRpbHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUgfSBmcm9tICcuLi9tZW1vcnkvdHlwZXMuanMnO1xuaW1wb3J0IHsgbm9ybWFsaXNlUGF0aCB9IGZyb20gJy4uL21lbW9yeS91dGlscy5qcyc7XG5pbXBvcnQgeyBmcm9tSW5pdGlhbFN0YXRlTm90ZSwgbmVzdGVkUm93c05vdGUsIHJlZGFjdGVkVmFsdWVOb3RlIH0gZnJvbSAnLi9rZXlJbmRleC5qcyc7XG5pbXBvcnQgeyByZXNvbHZlS2V5c1JlYWRTb3VyY2UgfSBmcm9tICcuL2tleXNSZWFkU291cmNlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEtleXNSZWFkU291cmNlLCBTdGF0ZUtleSwgVmFyaWFibGVTbGljZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIE5vcm1hbGlzZSBhIGNvbnN1bWVyLWZhY2luZyB7QGxpbmsgU3RhdGVLZXl9IHRvIHRoZSBlbmdpbmUncyBjYW5vbmljYWxcbiAqIHN0cmluZyBmb3JtICh0aGUgYFRyYWNlRW50cnkucGF0aGAgc3BhY2UpLiBQYXRoIGFycmF5cyBnbyB0aHJvdWdoIHRoZSBzYW1lXG4gKiBub3JtYWxpc2VyIHRoZSBlbmdpbmUgd3JpdGVzIHdpdGgg4oCUIHRoZSBkZWxpbWl0ZXIgbmV2ZXIgbGVha3MgaW50byB0aGVcbiAqIHB1YmxpYyBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGlzZVN0YXRlS2V5KGtleTogU3RhdGVLZXkpOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgPyBrZXkgOiBub3JtYWxpc2VQYXRoKFsuLi5rZXldKTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBzbGljZUZvcktleX0g4oCUIGNhdXNhbENoYWluJ3Mgb3B0aW9ucyBwbHVzIGFuY2hvcmluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2xpY2VGb3JLZXlPcHRpb25zIGV4dGVuZHMgQ2F1c2FsQ2hhaW5PcHRpb25zIHtcbiAgLyoqXG4gICAqIEV4Y2x1c2l2ZSBjb21taXQtYXJyYXktaW5kZXggdXBwZXIgYm91bmQ6IHNsaWNlIHRoZSB2YWx1ZSBhcyBpdCBzdG9vZFxuICAgKiBCRUZPUkUgdGhpcyBpZHggKHRpbWUtdHJhdmVsIHRyaWFnZSDigJQgXCJ3aHkgd2FzIGl0IFggYXQgc3RlcCAxMj9cIikuXG4gICAqIFNhbWUgY29udHJhY3QgYXMgYGZpbmRMYXN0V3JpdGVyYCdzIGBiZWZvcmVJZHhgLiBPbWl0IGZvciB0aGUgY3VycmVudFxuICAgKiB2YWx1ZS4gQ2hhaW5lZC10cmlhZ2UgaWRpb206IHRvIHNsaWNlIGF0IGFuIHtAbGluayBFbGVtZW50QmlydGh9LCBwYXNzXG4gICAqIGBiZWZvcmU6IGJpcnRoLmNvbW1pdElkeCArIDFgIChiaXJ0aCBpZHggaXMgaW5jbHVzaXZlLCB0aGlzIGJvdW5kIGlzXG4gICAqIGV4Y2x1c2l2ZSDigJQgdGhlICsxIG1ha2VzIHRoZSBiaXJ0aCBjb21taXQgaXRzZWxmIHRoZSBhbmNob3IpLlxuICAgKi9cbiAgYmVmb3JlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEJhY2t3YXJkIHNsaWNlIGZvciBvbmUgc3RhdGUga2V5OiBhbmNob3IgYXQgdGhlIGtleSdzIGxhc3Qgd3JpdGVyLCB0aGVuXG4gKiB3YWxrIHJlYWTihpJ3cml0ZSAoYW5kIG9wdGlvbmFsIGNvbnRyb2wpIGRlcGVuZGVuY2llcyB0cmFuc2l0aXZlbHkuXG4gKlxuICogSG9uZXN0LWFic2VuY2UgY29udHJhY3Q6IGEgbWlzc2luZyBzbGljZSBpcyBhIFJFU1VMVCwgbm90IGFuIGVycm9yIOKAlFxuICogYG1pc3Npbmc6ICduZXZlci13cml0dGVuJ2AgdGVsbHMgYSB0cmlhZ2UgdG9vbCAob3IgaXRzIExMTSBjYWxsZXIpIHRoYXRcbiAqIHRoZSB2YWx1ZSBjYW1lIGZyb20gaW5pdGlhbCBzdGF0ZSAvIGZyb3plbiBhcmdzIC8gYSBjbG9zdXJlLCB3aGljaCBpc1xuICogaXRzZWxmIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIFNlZSB7QGxpbmsgVmFyaWFibGVTbGljZX0g4oCUIGluY2x1ZGluZyBpdHNcbiAqIFNFUklBTElaQVRJT04gV0FSTklORyBiZWZvcmUgeW91IHN0cmluZ2lmeSB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xpY2VGb3JLZXkoXG4gIGNvbW1pdExvZzogQ29tbWl0QnVuZGxlW10sXG4gIGtleTogU3RhdGVLZXksXG4gIGtleXNSZWFkOiBLZXlzUmVhZFNvdXJjZSB8IEtleXNSZWFkTG9va3VwLFxuICBvcHRpb25zPzogU2xpY2VGb3JLZXlPcHRpb25zLFxuKTogVmFyaWFibGVTbGljZSB7XG4gIGNvbnN0IHNvdXJjZSA9IHJlc29sdmVLZXlzUmVhZFNvdXJjZShrZXlzUmVhZCk7XG4gIGNvbnN0IG5vcm1hbGlzZWRLZXkgPSBub3JtYWxpc2VTdGF0ZUtleShrZXkpO1xuICBjb25zdCBiYXNlOiBQaWNrPFZhcmlhYmxlU2xpY2UsICdrZXknIHwgJ2JlZm9yZScgfCAna2V5c1JlYWRLaW5kJyB8ICdyZWFkc0NvdmVyYWdlJz4gPSB7XG4gICAga2V5OiBub3JtYWxpc2VkS2V5LFxuICAgIC4uLihvcHRpb25zPy5iZWZvcmUgIT09IHVuZGVmaW5lZCAmJiB7IGJlZm9yZTogb3B0aW9ucy5iZWZvcmUgfSksXG4gICAga2V5c1JlYWRLaW5kOiBzb3VyY2Uua2luZCxcbiAgICAuLi4oc291cmNlLmNvdmVyYWdlICE9PSB1bmRlZmluZWQgJiYgeyByZWFkc0NvdmVyYWdlOiBzb3VyY2UuY292ZXJhZ2UgfSksXG4gIH07XG5cbiAgaWYgKGNvbW1pdExvZy5sZW5ndGggPT09IDApIHJldHVybiB7IC4uLmJhc2UsIG1pc3Npbmc6ICdlbXB0eS1sb2cnIH07XG5cbiAgY29uc3QgeyB3cml0ZXIsIGJhc2lzIH0gPSBmaW5kTGFzdFdyaXRlcldpdGhCYXNpcyhjb21taXRMb2csIG5vcm1hbGlzZWRLZXksIG9wdGlvbnM/LmJlZm9yZSk7XG4gIC8vIEY0Yjogd2hhdCB0aGUgdmFsdWUgYXQgdGhlIHNsaWNlJ3MgcG9pbnQgcmVzdHMgb24sIGZyb20gdGhlIHZhbHVlIHR3aW4g4oCUIGEgcmVkYWN0aW9uLCB0aGUgcHJlLXJ1biBiYXNlLlxuICBjb25zdCBlbmQgPSBNYXRoLm1pbihvcHRpb25zPy5iZWZvcmUgPz8gY29tbWl0TG9nLmxlbmd0aCwgY29tbWl0TG9nLmxlbmd0aCkgLSAxO1xuICBjb25zdCB2YWx1ZSA9IGVuZCA+PSAwID8gY29tbWl0VmFsdWVBdFdpdGhCYXNpcyhjb21taXRMb2csIGVuZCwgbm9ybWFsaXNlZEtleSkuYmFzaXMgOiBbXTtcbiAgaWYgKCF3cml0ZXIpIHtcbiAgICAvLyAnbmV2ZXItd3JpdHRlbicgYWxyZWFkeSBzYXlzIHRoZSB2YWx1ZSBjYW1lIGZyb20gYmVmb3JlIHRoZSBydW47IGEgcmVkYWN0aW9uIHRoYXQgaGlkIHRoZSB3cml0ZSBkb2VzIG5vdC5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uYmFzZSxcbiAgICAgIG1pc3Npbmc6ICduZXZlci13cml0dGVuJyxcbiAgICAgIC4uLih2YWx1ZS5pbmNsdWRlcygncmVkYWN0ZWQnKSAmJiB7IG5vdGVzOiBbcmVkYWN0ZWRWYWx1ZU5vdGUobm9ybWFsaXNlZEtleSldIH0pLFxuICAgIH07XG4gIH1cbiAgLy8gQSB3cml0ZXIgdGhhdCByZWFjaGVkIHRoZSBrZXkgb25seSB0aHJvdWdoIHJvd3MgaW5zaWRlIGl0IG1hZGUgcGFydCBvZiB0aGUgdmFsdWUg4oCUIHNheSBzby5cbiAgY29uc3Qgbm90ZXMgPSBiYXNpcy5pbmNsdWRlcygnbmVzdGVkLXJvd3MnKSA/IFtuZXN0ZWRSb3dzTm90ZShub3JtYWxpc2VkS2V5LCBbY29tbWl0TG9nLmluZGV4T2Yod3JpdGVyKV0pXSA6IFtdO1xuICBpZiAodmFsdWUuaW5jbHVkZXMoJ2Zyb20taW5pdGlhbC1zdGF0ZScpKSBub3Rlcy5wdXNoKGZyb21Jbml0aWFsU3RhdGVOb3RlKG5vcm1hbGlzZWRLZXkpKTtcbiAgaWYgKHZhbHVlLmluY2x1ZGVzKCdyZWRhY3RlZCcpKSBub3Rlcy5wdXNoKHJlZGFjdGVkVmFsdWVOb3RlKG5vcm1hbGlzZWRLZXkpKTtcblxuICAvLyBJTlZBUklBTlQ6IGB3cml0ZXJgIGNhbWUgRlJPTSB0aGlzIGNvbW1pdExvZywgc28gaXRzIHJ1bnRpbWVTdGFnZUlkIGlzXG4gIC8vIGFsd2F5cyBwcmVzZW50IGluIGNhdXNhbENoYWluJ3MgaW5kZXgg4oCUIGNhdXNhbENoYWluIGNhbm5vdCByZXR1cm5cbiAgLy8gdW5kZWZpbmVkIGhlcmUgKGl0IG9ubHkgZG9lcyBmb3IgaWRzIGFic2VudCBmcm9tIHRoZSBsb2cpLiBUaGUgbm9uLW51bGxcbiAgLy8gYXNzZXJ0aW9uIGtlZXBzIHRoZSBWYXJpYWJsZVNsaWNlIGNvbnRyYWN0IGFpcnRpZ2h0OiBgbWlzc2luZ2AgaXMgdGhlXG4gIC8vIE9OTFkgYWJzZW50LXJvb3Qgc3RhdGUuIE9wdGlvbnMgcGFzcyBzdHJhaWdodCB0aHJvdWdoIChjb250cm9sRGVwcyAvXG4gIC8vIHdlaWdoIC8gbWF4RGVwdGggLyBtYXhOb2RlcyBrZWVwIHRoZWlyIGNhdXNhbENoYWluIHNlbWFudGljcykuXG4gIC8vXG4gIC8vIGVkZ2VBdHRyaWJ1dGlvbiBkZWZhdWx0cyB0byAncGVyLXdyaXRlJyBIRVJFICh1bmxpa2UgY2F1c2FsQ2hhaW4nc1xuICAvLyAnc3RhZ2UnIGRlZmF1bHQpOiBhIHZhcmlhYmxlLWZpcnN0IHNsaWNlIGtub3dzIGV4YWN0bHkgd2hpY2ggd3JpdHRlbiBrZXlcbiAgLy8gYW5jaG9ycyB0aGUgcXVlc3Rpb24sIGFuZCBwZXItd3JpdGUgYXR0cmlidXRpb24gaXMgc3RyaWN0bHktc2FmZSDigJQgbG9nc1xuICAvLyB3aXRob3V0IGBUcmFjZUVudHJ5LnJlYWRLZXlzYCAodGhlIHdyaXRlUHJvdmVuYW5jZSBkaWFsIG9mZikgZmFsbCBiYWNrXG4gIC8vIHRvIHN0YWdlLWxldmVsIGV4cGFuc2lvbiBwZXIgbm9kZSwgYnl0ZS1pZGVudGljYWxseS4gQ29uc3VtZXJzIGNhbiBmb3JjZVxuICAvLyAnc3RhZ2UnIHZpYSBvcHRpb25zLlxuICBjb25zdCByb290ID0gY2F1c2FsQ2hhaW4oY29tbWl0TG9nLCB3cml0ZXIucnVudGltZVN0YWdlSWQsIHNvdXJjZS5sb29rdXAsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGVkZ2VBdHRyaWJ1dGlvbjogb3B0aW9ucz8uZWRnZUF0dHJpYnV0aW9uID8/ICdwZXItd3JpdGUnLFxuICAgIHJvb3RMaW5rS2V5czogb3B0aW9ucz8ucm9vdExpbmtLZXlzID8/IFtub3JtYWxpc2VkS2V5XSxcbiAgfSkhO1xuICByZXR1cm4geyAuLi5iYXNlLCB3cml0ZXIsIHJvb3QsIC4uLihub3Rlcy5sZW5ndGggPiAwICYmIHsgbm90ZXMgfSkgfTtcbn1cbiJdfQ==