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