@logixjs/sandbox 0.0.1 → 0.0.2

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 (248) hide show
  1. package/LICENSE +201 -0
  2. package/package.json +3 -1
  3. package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
  4. package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
  5. package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
  6. package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
  7. package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
  8. package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
  9. package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
  10. package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
  11. package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
  12. package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
  13. package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
  14. package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
  15. package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
  16. package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
  17. package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
  18. package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
  19. package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
  20. package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
  21. package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
  22. package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
  23. package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
  24. package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
  25. package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
  26. package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
  27. package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
  28. package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
  29. package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
  30. package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
  31. package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
  32. package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
  33. package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
  34. package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
  35. package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
  36. package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
  37. package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
  38. package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
  39. package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
  40. package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
  41. package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
  42. package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
  43. package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
  44. package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
  45. package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
  46. package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
  47. package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
  48. package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
  49. package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
  50. package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
  51. package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
  52. package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
  53. package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
  54. package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
  55. package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
  56. package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
  57. package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
  58. package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
  59. package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
  60. package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
  61. package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
  62. package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
  63. package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
  64. package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
  65. package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
  66. package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
  67. package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
  68. package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
  69. package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
  70. package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
  71. package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
  72. package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
  73. package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
  74. package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
  75. package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
  76. package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
  77. package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
  78. package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
  79. package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
  80. package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
  81. package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
  82. package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
  83. package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
  84. package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
  85. package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
  86. package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
  87. package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
  88. package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
  89. package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
  90. package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
  91. package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
  92. package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
  93. package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
  94. package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
  95. package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
  96. package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
  97. package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
  98. package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
  99. package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
  100. package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
  101. package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
  102. package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
  103. package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
  104. package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
  105. package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
  106. package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
  107. package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
  108. package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
  109. package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
  110. package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
  111. package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
  112. package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
  113. package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
  114. package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
  115. package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
  116. package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
  117. package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
  118. package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
  119. package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
  120. package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
  121. package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
  122. package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
  123. package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
  124. package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
  125. package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
  126. package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
  127. package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
  128. package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
  129. package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
  130. package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
  131. package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
  132. package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
  133. package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
  134. package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
  135. package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
  136. package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
  137. package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
  138. package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
  139. package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
  140. package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
  141. package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
  142. package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
  143. package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
  144. package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
  145. package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
  146. package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
  147. package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
  148. package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
  149. package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
  150. package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
  151. package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
  152. package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
  153. package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
  154. package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
  155. package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
  156. package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
  157. package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
  158. package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
  159. package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
  160. package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
  161. package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
  162. package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
  163. package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
  164. package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
  165. package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
  166. package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
  167. package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
  168. package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
  169. package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
  170. package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
  171. package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
  172. package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
  173. package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
  174. package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
  175. package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
  176. package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
  177. package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
  178. package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
  179. package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
  180. package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
  181. package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
  182. package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
  183. package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
  184. package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
  185. package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
  186. package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
  187. package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
  188. package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
  189. package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
  190. package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
  191. package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
  192. package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
  193. package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
  194. package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
  195. package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
  196. package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
  197. package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
  198. package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
  199. package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
  200. package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
  201. package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
  202. package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
  203. package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
  204. package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
  205. package/public/sandbox/logix-core/Bound.js +14 -14
  206. package/public/sandbox/logix-core/Debug.js +12 -10
  207. package/public/sandbox/logix-core/EffectOp.js +3 -4
  208. package/public/sandbox/logix-core/Env.js +5 -2
  209. package/public/sandbox/logix-core/ExternalStore.js +239 -0
  210. package/public/sandbox/logix-core/Flow.js +7 -8
  211. package/public/sandbox/logix-core/Kernel.js +7 -4
  212. package/public/sandbox/logix-core/Link.js +33 -25
  213. package/public/sandbox/logix-core/Middleware.js +13 -11
  214. package/public/sandbox/logix-core/Module.js +93 -30
  215. package/public/sandbox/logix-core/ModuleTag.js +28 -25
  216. package/public/sandbox/logix-core/Observability.js +21 -19
  217. package/public/sandbox/logix-core/Process.js +27 -22
  218. package/public/sandbox/logix-core/ReadQuery.js +7 -11
  219. package/public/sandbox/logix-core/Reflection.js +173 -53
  220. package/public/sandbox/logix-core/Resource.js +6 -3
  221. package/public/sandbox/logix-core/Root.js +7 -3
  222. package/public/sandbox/logix-core/Runtime.js +54 -40
  223. package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
  224. package/public/sandbox/logix-core/StateTrait.js +17 -14
  225. package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
  226. package/public/sandbox/logix-core/Workflow.js +332 -0
  227. package/public/sandbox/logix-core.js +11133 -6622
  228. package/public/sandbox/logix-core.manifest.json +4 -2
  229. package/public/sandbox/worker.js +3 -3
  230. package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
  231. package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
  232. package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
  233. package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
  234. package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
  235. package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
  236. package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
  237. package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
  238. package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
  239. package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
  240. package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
  241. package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
  242. package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
  243. package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
  244. package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
  245. package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
  246. package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
  247. package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
  248. package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
@@ -0,0 +1,214 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ OBSERVABILITY_PROTOCOL_VERSION,
5
+ exportEvidencePackage
6
+ } from "./chunk-Z5L7EZXS.js";
7
+
8
+ // ../logix-core/src/internal/runtime/core/EffectOpCore.ts
9
+ import { Context, Effect, FiberRef } from "../effect.js";
10
+ var currentLinkId = FiberRef.unsafeMake(void 0);
11
+ var makeOperationRejected = (params) => ({
12
+ _tag: "OperationRejected",
13
+ message: params.message,
14
+ kind: params.kind,
15
+ name: params.name,
16
+ linkId: params.linkId,
17
+ details: params.details
18
+ });
19
+ var EffectOpMiddlewareTag = class extends Context.Tag(
20
+ "Logix/EffectOpMiddleware"
21
+ )() {
22
+ };
23
+ var composeMiddleware = (stack) => {
24
+ return (op) => stack.reduceRight(
25
+ (eff, mw) => mw({ ...op, effect: eff }),
26
+ op.effect
27
+ );
28
+ };
29
+ var runWithMiddleware = (op, stack) => {
30
+ return Effect.gen(function* () {
31
+ const existing = yield* FiberRef.get(currentLinkId);
32
+ const metaLinkId = op.meta?.linkId;
33
+ const linkId = typeof metaLinkId === "string" && metaLinkId.length > 0 ? metaLinkId : existing ?? op.id;
34
+ const nextOp = {
35
+ ...op,
36
+ meta: {
37
+ ...op.meta ?? {},
38
+ linkId
39
+ }
40
+ };
41
+ const program = stack.length ? composeMiddleware(stack)(nextOp) : nextOp.effect;
42
+ return yield* Effect.locally(currentLinkId, linkId)(program);
43
+ });
44
+ };
45
+
46
+ // ../logix-core/src/internal/observability/runSession.ts
47
+ import { Context as Context2, Layer } from "../effect.js";
48
+ var RunSessionTagImpl = class extends Context2.Tag(
49
+ "@logix/core/RunSession"
50
+ )() {
51
+ };
52
+ var RunSessionTag = RunSessionTagImpl;
53
+ var NEXT_RUN_SEQ_KEY = /* @__PURE__ */ Symbol.for("@logix/core/runSession/nextRunSeq");
54
+ var fallbackNextRunSeq = 0;
55
+ var nextRunSeq = () => {
56
+ try {
57
+ const g = globalThis;
58
+ const prev = typeof g[NEXT_RUN_SEQ_KEY] === "number" ? g[NEXT_RUN_SEQ_KEY] : 0;
59
+ const next = prev + 1;
60
+ g[NEXT_RUN_SEQ_KEY] = next;
61
+ return next;
62
+ } catch {
63
+ fallbackNextRunSeq += 1;
64
+ return fallbackNextRunSeq;
65
+ }
66
+ };
67
+ var makeRunId = (startedAt) => `run-${startedAt}.${nextRunSeq()}`;
68
+ var makeRunSessionLocalState = () => {
69
+ const onceKeys = /* @__PURE__ */ new Set();
70
+ const seqByNamespace = /* @__PURE__ */ new Map();
71
+ return {
72
+ once: (key) => {
73
+ if (onceKeys.has(key)) return false;
74
+ onceKeys.add(key);
75
+ return true;
76
+ },
77
+ nextSeq: (namespace, key) => {
78
+ const byKey = seqByNamespace.get(namespace) ?? /* @__PURE__ */ new Map();
79
+ if (!seqByNamespace.has(namespace)) seqByNamespace.set(namespace, byKey);
80
+ const prev = byKey.get(key) ?? 0;
81
+ const next = prev + 1;
82
+ byKey.set(key, next);
83
+ return next;
84
+ },
85
+ clear: () => {
86
+ onceKeys.clear();
87
+ seqByNamespace.clear();
88
+ }
89
+ };
90
+ };
91
+ var makeRunSession = (options) => {
92
+ const startedAt = options?.startedAt ?? Date.now();
93
+ return {
94
+ runId: options?.runId ?? makeRunId(startedAt),
95
+ source: options?.source ?? { host: "unknown" },
96
+ startedAt,
97
+ local: options?.local ?? makeRunSessionLocalState()
98
+ };
99
+ };
100
+ var makeEvidenceSink = (session) => {
101
+ const events = [];
102
+ let nextSeq = 1;
103
+ return {
104
+ record: (type, payload, options) => {
105
+ events.push({
106
+ protocolVersion: OBSERVABILITY_PROTOCOL_VERSION,
107
+ runId: session.runId,
108
+ seq: nextSeq++,
109
+ timestamp: options?.timestamp ?? Date.now(),
110
+ type,
111
+ payload
112
+ });
113
+ },
114
+ export: (options) => {
115
+ const protocolVersion = options?.protocolVersion ?? OBSERVABILITY_PROTOCOL_VERSION;
116
+ const maxEvents = options?.maxEvents;
117
+ const selected = typeof maxEvents === "number" && Number.isFinite(maxEvents) && maxEvents > 0 ? events.slice(Math.max(0, events.length - Math.floor(maxEvents))) : events.slice();
118
+ return exportEvidencePackage({
119
+ protocolVersion,
120
+ runId: session.runId,
121
+ source: session.source,
122
+ createdAt: options?.createdAt,
123
+ events: selected,
124
+ summary: options?.summary
125
+ });
126
+ },
127
+ clear: () => {
128
+ events.length = 0;
129
+ nextSeq = 1;
130
+ }
131
+ };
132
+ };
133
+ var runSessionLayer = (session) => Layer.succeed(RunSessionTag, session ?? makeRunSession());
134
+
135
+ // ../logix-core/src/internal/effect-op.ts
136
+ import { Effect as Effect2, Option } from "../effect.js";
137
+ var composeMiddleware2 = composeMiddleware;
138
+ var makeOperationRejected2 = makeOperationRejected;
139
+ var nextGlobalOpSeq = 0;
140
+ var nextOpSeq = () => {
141
+ nextGlobalOpSeq += 1;
142
+ return nextGlobalOpSeq;
143
+ };
144
+ var makeId = (instanceId, opSeq) => instanceId ? `${instanceId}::o${opSeq}` : `o${opSeq}`;
145
+ var make = (params) => ({
146
+ ...params.id ? { id: params.id, meta: params.meta } : (() => {
147
+ const meta = params.meta ?? {};
148
+ const instanceId = meta.instanceId;
149
+ const opSeq = typeof meta.opSeq === "number" && Number.isFinite(meta.opSeq) ? Math.floor(meta.opSeq) : nextOpSeq();
150
+ return {
151
+ id: makeId(instanceId, opSeq),
152
+ meta: meta.opSeq === opSeq ? meta : { ...meta, opSeq }
153
+ };
154
+ })(),
155
+ kind: params.kind,
156
+ name: params.name,
157
+ payload: params.payload,
158
+ effect: params.effect
159
+ });
160
+ var makeInRunSession = (params) => Effect2.gen(function* () {
161
+ if (params.id) {
162
+ return {
163
+ id: params.id,
164
+ kind: params.kind,
165
+ name: params.name,
166
+ payload: params.payload,
167
+ meta: params.meta,
168
+ effect: params.effect
169
+ };
170
+ }
171
+ const meta = params.meta ?? {};
172
+ const instanceId = meta.instanceId;
173
+ let opSeq;
174
+ if (typeof meta.opSeq === "number" && Number.isFinite(meta.opSeq)) {
175
+ opSeq = Math.floor(meta.opSeq);
176
+ } else {
177
+ const sessionOpt = yield* Effect2.serviceOption(RunSessionTag);
178
+ if (Option.isSome(sessionOpt)) {
179
+ const key = instanceId ?? "global";
180
+ opSeq = sessionOpt.value.local.nextSeq("opSeq", key);
181
+ } else {
182
+ opSeq = nextOpSeq();
183
+ }
184
+ }
185
+ return {
186
+ id: makeId(instanceId, opSeq),
187
+ kind: params.kind,
188
+ name: params.name,
189
+ payload: params.payload,
190
+ meta: meta.opSeq === opSeq ? meta : { ...meta, opSeq },
191
+ effect: params.effect
192
+ };
193
+ });
194
+ var withMeta = (op, meta) => ({
195
+ ...op,
196
+ meta: { ...op.meta ?? {}, ...meta }
197
+ });
198
+ var run = (op, stack) => runWithMiddleware(op, stack);
199
+
200
+ export {
201
+ currentLinkId,
202
+ EffectOpMiddlewareTag,
203
+ RunSessionTag,
204
+ makeRunSession,
205
+ makeEvidenceSink,
206
+ runSessionLayer,
207
+ composeMiddleware2 as composeMiddleware,
208
+ makeOperationRejected2 as makeOperationRejected,
209
+ make,
210
+ makeInRunSession,
211
+ withMeta,
212
+ run
213
+ };
214
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0VmZmVjdE9wQ29yZS50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9vYnNlcnZhYmlsaXR5L3J1blNlc3Npb24udHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvZWZmZWN0LW9wLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBFZmZlY3RPcCBcdTY4MzhcdTVGQzNcdTZBMjFcdTU3OEJcdTRFMEUgTWlkZGxld2FyZSBcdTdFQzRcdTU0MDhcdTkwM0JcdThGOTFcdTMwMDJcbi8vIFx1NjZGNFx1OUFEOFx1NUM0Mlx1NzY4NCBSdW50aW1lIC8gRGV2dG9vbHMgXHU1QkY5XHU2M0E1XHU4OUMxXHVGRjFBXG4vLyBzcGVjcy8wMDAtbW9kdWxlLXRyYWl0cy1ydW50aW1lL3JlZmVyZW5jZXMvZWZmZWN0b3AtYW5kLW1pZGRsZXdhcmUubWRcblxuaW1wb3J0IHsgQ29udGV4dCwgRWZmZWN0LCBGaWJlclJlZiB9IGZyb20gXCJlZmZlY3RcIlxuXG4vKipcbiAqIGN1cnJlbnRMaW5rSWRcdUZGMUFcbiAqIC0gXHU0RUU1IEZpYmVyUmVmIFx1NUY2Mlx1NUYwRlx1NjI3Rlx1OEY3RFx1NUY1M1x1NTI0RFx1NjRDRFx1NEY1Q1x1OTRGRVx1OERFRiBpZFx1RkYwOGxpbmtJZFx1RkYwOVx1RkYxQlxuICogLSBcdTc1MjhcdTRFOEVcdTVDMDZcdTU0MENcdTRFMDBcdTk0RkVcdThERUZcdTRFMEJcdTc2ODRcdTU5MUFcdTZCNjVcdThGQjlcdTc1NENcdTY0Q0RcdTRGNUNcdTUxNzNcdTgwNTRcdThENzdcdTY3NjVcdUZGMDhcdThERThcdTZBMjFcdTU3NTdcdTRFNUZcdTUzRUZcdTU5MERcdTc1MjhcdTU0MENcdTRFMDAgRmliZXJSZWZcdUZGMDlcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IGN1cnJlbnRMaW5rSWQgPSBGaWJlclJlZi51bnNhZmVNYWtlPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuXG4vKipcbiAqIE9wZXJhdGlvblBvbGljeVx1RkYxQVxuICogLSBcdTVDNDBcdTkwRThcdTdCNTZcdTc1NjVcdTY4MDdcdTZDRThcdUZGMDhcdTRFQzVcdTg4NjhcdThGQkVcdTYxMEZcdTU2RkVcdUZGMENcdTRFMERcdTY0M0FcdTVFMjZcdTg5QzRcdTUyMTlcdTkwM0JcdThGOTFcdUZGMDlcdTMwMDJcbiAqXG4gKiBcdTdFQTZcdTY3NUZcdUZGMDhcdTc1MzEgUnVudGltZS9taWRkbGV3YXJlIFx1NTE3MVx1NTQwQ1x1NEZERFx1OEJDMVx1RkYwOVx1RkYxQVxuICogLSBcdTUzRUFcdTgwRkRcdTUxNzNcdTk1RURcdTdFQUZcdTg5QzJcdTZENEJcdTdDN0JcdTgwRkRcdTUyOUJcdUZGMDhPYnNlcnZlclx1RkYwOVx1RkYxQlx1NEUwRFx1NUY5N1x1NTE3M1x1OTVFRFx1NTE2OFx1NUM0MFx1NUI4OFx1NTM2Qlx1MzAwMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvblBvbGljeSB7XG4gIHJlYWRvbmx5IGRpc2FibGVPYnNlcnZlcnM/OiBib29sZWFuXG59XG5cbi8qKlxuICogT3BlcmF0aW9uUmVqZWN0ZWRcdUZGMUFcbiAqIC0gXHU1Qjg4XHU1MzZCXHU2MkQyXHU3RUREXHU2MjY3XHU4ODRDXHU2NUY2XHU3Njg0XHU3RURGXHU0RTAwXHU1OTMxXHU4RDI1XHU3RUQzXHU2NzlDXHVGRjFCXG4gKiAtIFx1OEJFRFx1NEU0OVx1RkYxQVx1NjYzRVx1NUYwRlx1NTkzMVx1OEQyNSArIFx1NjVFMFx1NEUxQVx1NTJBMVx1NTI2Rlx1NEY1Q1x1NzUyOFx1RkYwOFx1NjJEMlx1N0VERFx1NUZDNVx1OTg3Qlx1NTNEMVx1NzUxRlx1NTcyOFx1NzUyOFx1NjIzN1x1N0EwQlx1NUU4Rlx1NjI2N1x1ODg0Q1x1NTI0RFx1RkYwOVx1MzAwMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvblJlamVjdGVkIHtcbiAgcmVhZG9ubHkgX3RhZzogXCJPcGVyYXRpb25SZWplY3RlZFwiXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZ1xuICByZWFkb25seSBraW5kPzogRWZmZWN0T3BbXCJraW5kXCJdXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmdcbiAgcmVhZG9ubHkgbGlua0lkPzogc3RyaW5nXG4gIHJlYWRvbmx5IGRldGFpbHM/OiB1bmtub3duXG59XG5cbi8qKlxuICogT3BlcmF0aW9uRXJyb3JcdUZGMUFcbiAqIC0gXHU0RUZCXHU0RjU1XHU5MDFBXHU4RkM3IEVmZmVjdE9wIFx1NjAzQlx1N0VCRlx1NjI2N1x1ODg0Q1x1NzY4NFx1OEZCOVx1NzU0Q1x1NjRDRFx1NEY1Q1x1RkYwQ1x1OTBGRFx1NTNFRlx1ODBGRFx1ODhBQiBHdWFyZCBtaWRkbGV3YXJlIFx1NjYzRVx1NUYwRlx1NjJEMlx1N0VERFx1RkYxQlxuICogLSBcdTU2RTBcdTZCNjQgbWlkZGxld2FyZSBcdTc2ODRcdTk1MTlcdThCRUZcdTkwMUFcdTkwNTNcdTVGQzVcdTk4N0JcdTUxNDFcdThCQjhcdTUzRTBcdTUyQTAgT3BlcmF0aW9uUmVqZWN0ZWRcdTMwMDJcbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uRXJyb3I8RT4gPSBFIHwgT3BlcmF0aW9uUmVqZWN0ZWRcblxuZXhwb3J0IGNvbnN0IG1ha2VPcGVyYXRpb25SZWplY3RlZCA9IChwYXJhbXM6IHtcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nXG4gIHJlYWRvbmx5IGtpbmQ/OiBFZmZlY3RPcFtcImtpbmRcIl1cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZ1xuICByZWFkb25seSBsaW5rSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgZGV0YWlscz86IHVua25vd25cbn0pOiBPcGVyYXRpb25SZWplY3RlZCA9PiAoe1xuICBfdGFnOiBcIk9wZXJhdGlvblJlamVjdGVkXCIsXG4gIG1lc3NhZ2U6IHBhcmFtcy5tZXNzYWdlLFxuICBraW5kOiBwYXJhbXMua2luZCxcbiAgbmFtZTogcGFyYW1zLm5hbWUsXG4gIGxpbmtJZDogcGFyYW1zLmxpbmtJZCxcbiAgZGV0YWlsczogcGFyYW1zLmRldGFpbHMsXG59KVxuXG4vKipcbiAqIEVmZmVjdE9wXHVGRjFBXHU3RURGXHU0RTAwXHU4ODY4XHU3OTNBXHU0RTAwXHU2QjIxXHUyMDFDXHU1M0VGXHU4OUMyXHU2RDRCXHU4RkI5XHU3NTRDXHUyMDFEXHU3Njg0IEVmZmVjdCBcdTYyNjdcdTg4NENcdTMwMDJcbiAqXG4gKiAtIE91dCAvIEVyciAvIEVudiBcdTRFM0FcdTUxODVcdTkwRTggRWZmZWN0IFx1NzY4NFx1NkNEQlx1NTc4Qlx1NTNDMlx1NjU3MFx1RkYxQlxuICogLSBtZXRhIFx1NzUyOFx1NEU4RVx1NjI3Rlx1OEY3RCBEZXZ0b29scyAvIE1pZGRsZXdhcmUgXHU2MjQwXHU5NzAwXHU3Njg0XHU3RUQzXHU2Nzg0XHU1MzE2XHU0RTBBXHU0RTBCXHU2NTg3XHU0RkUxXHU2MDZGXHUzMDAyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWZmZWN0T3A8T3V0ID0gdW5rbm93biwgRXJyID0gdW5rbm93biwgRW52ID0gdW5rbm93bj4ge1xuICByZWFkb25seSBpZDogc3RyaW5nXG4gIHJlYWRvbmx5IGtpbmQ6XG4gICAgfCBcImFjdGlvblwiXG4gICAgfCBcImZsb3dcIlxuICAgIHwgXCJzdGF0ZVwiXG4gICAgfCBcInNlcnZpY2VcIlxuICAgIHwgXCJsaWZlY3ljbGVcIlxuICAgIHwgXCJ0cmFpdC1jb21wdXRlZFwiXG4gICAgfCBcInRyYWl0LWxpbmtcIlxuICAgIHwgXCJ0cmFpdC1zb3VyY2VcIlxuICAgIHwgXCJkZXZ0b29sc1wiXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZ1xuICByZWFkb25seSBwYXlsb2FkPzogdW5rbm93blxuICByZWFkb25seSBtZXRhPzoge1xuICAgIC8qKlxuICAgICAqIGxpbmtJZFx1RkYxQVxuICAgICAqIC0gXHU2NENEXHU0RjVDXHU5NEZFXHU4REVGIGlkXHVGRjFBXHU1NDBDXHU0RTAwXHU5NEZFXHU4REVGXHU0RTBCXHU3Njg0XHU1OTFBXHU2QjY1XHU4RkI5XHU3NTRDXHU2NENEXHU0RjVDXHU1RkM1XHU5ODdCXHU1MTcxXHU0RUFCXHVGRjFCXG4gICAgICogLSBSdW50aW1lIFx1NEZERFx1OEJDMVx1NTcyOFx1NjI0MFx1NjcwOVx1OEZCOVx1NzU0Q1x1NjRDRFx1NEY1Q1x1NEUwQVx1OTBGRFx1NEYxQVx1ODg2NVx1OUY1MFx1OEJFNVx1NUI1N1x1NkJCNVx1MzAwMlxuICAgICAqL1xuICAgIGxpbmtJZD86IHN0cmluZ1xuICAgIG1vZHVsZUlkPzogc3RyaW5nXG4gICAgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgIHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgIHR4bklkPzogc3RyaW5nXG4gICAgdHhuU2VxPzogbnVtYmVyXG4gICAgb3BTZXE/OiBudW1iZXJcbiAgICBmaWVsZFBhdGg/OiBzdHJpbmdcbiAgICBkZXBzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gICAgZnJvbT86IHN0cmluZ1xuICAgIHRvPzogc3RyaW5nXG4gICAgdHJhaXROb2RlSWQ/OiBzdHJpbmdcbiAgICBzdGVwSWQ/OiBzdHJpbmdcbiAgICByZXNvdXJjZUlkPzogc3RyaW5nXG4gICAga2V5PzogdW5rbm93blxuICAgIHRyYWNlPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gICAgdGFncz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICAgIHBvbGljeT86IE9wZXJhdGlvblBvbGljeVxuICAgIC8vIFx1OTg4NFx1NzU1OVx1NjI2OVx1NUM1NVx1NEY0RFx1RkYwQ1x1NEY5Qlx1NEUyRFx1OTVGNFx1NEVGNlx1NEUwRSBEZXZ0b29scyBcdTYzMDJcdThGN0RcdTk4OURcdTU5MTZcdTRGRTFcdTYwNkZcdTMwMDJcbiAgICByZWFkb25seSBbazogc3RyaW5nXTogdW5rbm93blxuICB9XG4gIHJlYWRvbmx5IGVmZmVjdDogRWZmZWN0LkVmZmVjdDxPdXQsIEVyciwgRW52PlxufVxuXG4vKipcbiAqIE1pZGRsZXdhcmVcdUZGMUFcdTVCRjkgRWZmZWN0T3AgXHU4RkRCXHU4ODRDXHU4OUMyXHU1QkRGIC8gXHU1MzA1XHU4OEM1IC8gXHU1Qjg4XHU1MzZCXHU3Njg0XHU5MDFBXHU3NTI4XHU0RTJEXHU5NUY0XHU0RUY2XHU2QTIxXHU1NzhCXHUzMDAyXG4gKi9cbmV4cG9ydCB0eXBlIE1pZGRsZXdhcmUgPSA8QSwgRSwgUj4oXG4gIG9wOiBFZmZlY3RPcDxBLCBFLCBSPixcbikgPT4gRWZmZWN0LkVmZmVjdDxBLCBPcGVyYXRpb25FcnJvcjxFPiwgUj5cblxuZXhwb3J0IHR5cGUgTWlkZGxld2FyZVN0YWNrID0gUmVhZG9ubHlBcnJheTxNaWRkbGV3YXJlPlxuXG4vKipcbiAqIEVmZmVjdE9wTWlkZGxld2FyZUVudlx1RkYxQVxuICogLSBcdTRGNUNcdTRFM0EgRWZmZWN0IEVudiBcdTRFMkRcdTc2ODRcdTRFMDBcdTk4NzkgU2VydmljZVx1RkYwQ1x1NjI3Rlx1OEY3RFx1NUY1M1x1NTI0RCBSdW50aW1lIFx1NzY4NCBNaWRkbGV3YXJlU3RhY2tcdUZGMUJcbiAqIC0gXHU3NTMxIFJ1bnRpbWUudHMgXHU1NzI4XHU2Nzg0XHU5MDIwIE1hbmFnZWRSdW50aW1lIFx1NjVGNlx1NkNFOFx1NTE2NVx1RkYxQlxuICogLSBTdGF0ZVRyYWl0Lmluc3RhbGwgXHU3QjQ5XHU4RkQwXHU4ODRDXHU2NUY2XHU0RUUzXHU3ODAxXHU5MDFBXHU4RkM3XHU4QkU1IFNlcnZpY2UgXHU1MUIzXHU1QjlBXHU1QjlFXHU5NjQ1XHU0RjdGXHU3NTI4XHU3Njg0IE1pZGRsZXdhcmVTdGFja1x1MzAwMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVmZmVjdE9wTWlkZGxld2FyZUVudiB7XG4gIHJlYWRvbmx5IHN0YWNrOiBNaWRkbGV3YXJlU3RhY2tcbn1cblxuZXhwb3J0IGNsYXNzIEVmZmVjdE9wTWlkZGxld2FyZVRhZyBleHRlbmRzIENvbnRleHQuVGFnKFxuICBcIkxvZ2l4L0VmZmVjdE9wTWlkZGxld2FyZVwiLFxuKTxFZmZlY3RPcE1pZGRsZXdhcmVUYWcsIEVmZmVjdE9wTWlkZGxld2FyZUVudj4oKSB7fVxuXG4vKipcbiAqIGNvbXBvc2VNaWRkbGV3YXJlXHVGRjFBXG4gKiAtIFx1NjMwOVx1MzAwQ1x1NThGMFx1NjYwRVx1OTg3QVx1NUU4Rlx1NEVDRVx1NTkxNlx1NTIzMFx1NTE4NVx1MzAwRFx1N0VDNFx1NTQwOCBNaWRkbGV3YXJlXHVGRjFBXG4gKiAgIC0gc3RhY2sgPSBbbXcxLCBtdzJdID0+IFx1NUI5RVx1OTY0NVx1NjI2N1x1ODg0Q1x1OTg3QVx1NUU4Rlx1RkYxQW13MSAtPiBtdzIgLT4gZWZmZWN0IC0+IG13MiAtPiBtdzFcdUZGMUJcbiAqIC0gXHU0RTBFIHJlZmVyZW5jZSBcdTY1ODdcdTY4NjNcdTRFMkRcdTc2ODQgcmVkdWNlUmlnaHQgXHU3OTNBXHU0RjhCXHU0RkREXHU2MzAxXHU0RTAwXHU4MUY0XHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wb3NlTWlkZGxld2FyZSA9IChzdGFjazogTWlkZGxld2FyZVN0YWNrKTogTWlkZGxld2FyZSA9PiB7XG4gIHJldHVybiA8QSwgRSwgUj4ob3A6IEVmZmVjdE9wPEEsIEUsIFI+KTogRWZmZWN0LkVmZmVjdDxBLCBPcGVyYXRpb25FcnJvcjxFPiwgUj4gPT5cbiAgICBzdGFjay5yZWR1Y2VSaWdodDxFZmZlY3QuRWZmZWN0PEEsIE9wZXJhdGlvbkVycm9yPEU+LCBSPj4oXG4gICAgICAoZWZmLCBtdykgPT4gbXcoeyAuLi5vcCwgZWZmZWN0OiBlZmYgfSBhcyBhbnkpIGFzIGFueSxcbiAgICAgIG9wLmVmZmVjdCBhcyBFZmZlY3QuRWZmZWN0PEEsIE9wZXJhdGlvbkVycm9yPEU+LCBSPixcbiAgICApXG59XG5cbi8qKlxuICogcnVuV2l0aE1pZGRsZXdhcmVcdUZGMUFcbiAqIC0gXHU3RUQ5XHU1QjlBXHU0RTAwXHU2NzYxIEVmZmVjdE9wIFx1NEUwRSBNaWRkbGV3YXJlU3RhY2tcdUZGMENcdTYzMDlcdTdFQzRcdTU0MDhcdTg5QzRcdTUyMTlcdTYyNjdcdTg4NENcdUZGMUJcbiAqIC0gXHU4MkU1IHN0YWNrIFx1NEUzQVx1N0E3QVx1RkYwQ1x1NTIxOVx1NzZGNFx1NjNBNVx1OEZENFx1NTZERSBvcC5lZmZlY3RcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IHJ1bldpdGhNaWRkbGV3YXJlID0gPEEsIEUsIFI+KFxuICBvcDogRWZmZWN0T3A8QSwgRSwgUj4sXG4gIHN0YWNrOiBNaWRkbGV3YXJlU3RhY2ssXG4pOiBFZmZlY3QuRWZmZWN0PEEsIEUsIFI+ID0+IHtcbiAgcmV0dXJuIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHlpZWxkKiBGaWJlclJlZi5nZXQoY3VycmVudExpbmtJZClcbiAgICBjb25zdCBtZXRhTGlua0lkID0gKG9wLm1ldGEgYXMgYW55KT8ubGlua0lkXG4gICAgY29uc3QgbGlua0lkID1cbiAgICAgIHR5cGVvZiBtZXRhTGlua0lkID09PSBcInN0cmluZ1wiICYmIG1ldGFMaW5rSWQubGVuZ3RoID4gMFxuICAgICAgICA/IG1ldGFMaW5rSWRcbiAgICAgICAgOiBleGlzdGluZyA/PyBvcC5pZFxuXG4gICAgY29uc3QgbmV4dE9wOiBFZmZlY3RPcDxBLCBFLCBSPiA9IHtcbiAgICAgIC4uLm9wLFxuICAgICAgbWV0YToge1xuICAgICAgICAuLi4ob3AubWV0YSA/PyB7fSksXG4gICAgICAgIGxpbmtJZCxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcHJvZ3JhbSA9IHN0YWNrLmxlbmd0aCA/IGNvbXBvc2VNaWRkbGV3YXJlKHN0YWNrKShuZXh0T3ApIDogbmV4dE9wLmVmZmVjdFxuXG4gICAgLy8gbGlua0lkXHVGRjFBXHU4RkI5XHU3NTRDXHU4RDc3XHU3MEI5XHU1MjFCXHU1RUZBXHVGRjBDXHU1RDRDXHU1OTU3XHU1OTBEXHU3NTI4XHVGRjA4XHU1NDBDXHU0RTAwIEZpYmVyUmVmIFx1NEUzQVx1NTE2OFx1NUM0MFx1NTM1NVx1NEUwMFx1NEU4Qlx1NUI5RVx1NkU5MFx1RkYwOVx1MzAwMlxuICAgIC8vIE5PVEU6IG1pZGRsZXdhcmUgXHU1MTQxXHU4QkI4XHU0RUU1IE9wZXJhdGlvblJlamVjdGVkIFx1NjYzRVx1NUYwRlx1NjJEMlx1N0VERFx1MzAwMlxuICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmxvY2FsbHkoY3VycmVudExpbmtJZCwgbGlua0lkKShwcm9ncmFtIGFzIGFueSlcbiAgfSkgYXMgRWZmZWN0LkVmZmVjdDxBLCBFLCBSPlxufVxuIiwgImltcG9ydCB7IENvbnRleHQsIExheWVyIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gXCIuL2pzb25WYWx1ZS5qc1wiXG5pbXBvcnQgdHlwZSB7IEV2aWRlbmNlUGFja2FnZSwgRXZpZGVuY2VQYWNrYWdlU291cmNlLCBPYnNlcnZhdGlvbkVudmVsb3BlIH0gZnJvbSBcIi4vZXZpZGVuY2UuanNcIlxuaW1wb3J0IHsgZXhwb3J0RXZpZGVuY2VQYWNrYWdlLCBPQlNFUlZBQklMSVRZX1BST1RPQ09MX1ZFUlNJT04gfSBmcm9tIFwiLi9ldmlkZW5jZS5qc1wiXG5cbmV4cG9ydCB0eXBlIFJ1bklkID0gc3RyaW5nXG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuU2Vzc2lvbkxvY2FsU3RhdGUge1xuICAvKipcbiAgICogb25jZVx1RkYxQVx1NzUyOFx1NEU4RVx1MjAxQ1x1NTNFQVx1NTNEMVx1NEUwMFx1NkIyMVx1MjAxRFx1NzY4NFx1NTNCQlx1OTFDRFx1OTUyRVx1OTZDNlx1NTQwOFx1RkYwOFx1NUZDNVx1OTg3Qlx1NjMwOVx1NEYxQVx1OEJERFx1OTY5NFx1NzlCQlx1RkYwQ1x1OTA3Rlx1NTE0RFx1OERFOFx1NEYxQVx1OEJERFx1NkM2MVx1NjdEM1x1RkYwOVx1MzAwMlxuICAgKiBcdThGRDRcdTU2REUgdHJ1ZSBcdTg4NjhcdTc5M0FcdTk5OTZcdTZCMjFcdTUxRkFcdTczQjBcdUZGMENmYWxzZSBcdTg4NjhcdTc5M0FcdTVERjJcdTUxRkFcdTczQjBcdThGQzdcdTMwMDJcbiAgICovXG4gIHJlYWRvbmx5IG9uY2U6IChrZXk6IHN0cmluZykgPT4gYm9vbGVhblxuXG4gIC8qKlxuICAgKiBzZXFcdUZGMUFcdTc1MjhcdTRFOEVcdTYzMDkga2V5IFx1NTIwNlx1OTE0RFx1NTM1NVx1OEMwM1x1NUU4Rlx1NTNGN1x1RkYwOFx1NEY4Qlx1NTk4MiBvcFNlcS9ldmVudFNlcSBcdTdCNDlcdUZGMDlcdUZGMENcdTVGQzVcdTk4N0JcdTYzMDlcdTRGMUFcdThCRERcdTk2OTRcdTc5QkJcdTMwMDJcbiAgICovXG4gIHJlYWRvbmx5IG5leHRTZXE6IChuYW1lc3BhY2U6IHN0cmluZywga2V5OiBzdHJpbmcpID0+IG51bWJlclxuXG4gIC8qKiBcdTRFQzVcdTc1MjhcdTRFOEVcdTZENEJcdThCRDUvXHU1OTBEXHU0RjREXHVGRjFBXHU2RTA1XHU3QTdBXHU2NzJDXHU0RjFBXHU4QkREXHU3Njg0XHU2NzJDXHU1NzMwXHU3MkI2XHU2MDAxXHUzMDAyICovXG4gIHJlYWRvbmx5IGNsZWFyOiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVuU2Vzc2lvbiB7XG4gIHJlYWRvbmx5IHJ1bklkOiBSdW5JZFxuICByZWFkb25seSBzb3VyY2U6IEV2aWRlbmNlUGFja2FnZVNvdXJjZVxuICByZWFkb25seSBzdGFydGVkQXQ6IG51bWJlclxuICByZWFkb25seSBsb2NhbDogUnVuU2Vzc2lvbkxvY2FsU3RhdGVcbn1cblxuY2xhc3MgUnVuU2Vzc2lvblRhZ0ltcGwgZXh0ZW5kcyBDb250ZXh0LlRhZyhcbiAgXCJAbG9naXgvY29yZS9SdW5TZXNzaW9uXCIsXG4pPFJ1blNlc3Npb25UYWdJbXBsLCBSdW5TZXNzaW9uPigpIHt9XG5cbmV4cG9ydCBjb25zdCBSdW5TZXNzaW9uVGFnID0gUnVuU2Vzc2lvblRhZ0ltcGxcblxuZXhwb3J0IGludGVyZmFjZSBFdmlkZW5jZVNpbmsge1xuICByZWFkb25seSByZWNvcmQ6ICh0eXBlOiBzdHJpbmcsIHBheWxvYWQ6IEpzb25WYWx1ZSwgb3B0aW9ucz86IHsgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyIH0pID0+IHZvaWRcbiAgcmVhZG9ubHkgZXhwb3J0OiAob3B0aW9ucz86IHtcbiAgICByZWFkb25seSBwcm90b2NvbFZlcnNpb24/OiBzdHJpbmdcbiAgICByZWFkb25seSBjcmVhdGVkQXQ/OiBudW1iZXJcbiAgICByZWFkb25seSBzdW1tYXJ5PzogSnNvblZhbHVlXG4gICAgcmVhZG9ubHkgbWF4RXZlbnRzPzogbnVtYmVyXG4gIH0pID0+IEV2aWRlbmNlUGFja2FnZVxuICByZWFkb25seSBjbGVhcjogKCkgPT4gdm9pZFxufVxuXG5jb25zdCBORVhUX1JVTl9TRVFfS0VZID0gU3ltYm9sLmZvcihcIkBsb2dpeC9jb3JlL3J1blNlc3Npb24vbmV4dFJ1blNlcVwiKVxubGV0IGZhbGxiYWNrTmV4dFJ1blNlcSA9IDBcblxuY29uc3QgbmV4dFJ1blNlcSA9ICgpOiBudW1iZXIgPT4ge1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgZzogYW55ID0gZ2xvYmFsVGhpcyBhcyBhbnlcbiAgICBjb25zdCBwcmV2ID0gdHlwZW9mIGdbTkVYVF9SVU5fU0VRX0tFWV0gPT09IFwibnVtYmVyXCIgPyAoZ1tORVhUX1JVTl9TRVFfS0VZXSBhcyBudW1iZXIpIDogMFxuICAgIGNvbnN0IG5leHQgPSBwcmV2ICsgMVxuICAgIGdbTkVYVF9SVU5fU0VRX0tFWV0gPSBuZXh0XG4gICAgcmV0dXJuIG5leHRcbiAgfSBjYXRjaCB7XG4gICAgZmFsbGJhY2tOZXh0UnVuU2VxICs9IDFcbiAgICByZXR1cm4gZmFsbGJhY2tOZXh0UnVuU2VxXG4gIH1cbn1cblxuY29uc3QgbWFrZVJ1bklkID0gKHN0YXJ0ZWRBdDogbnVtYmVyKTogUnVuSWQgPT4gYHJ1bi0ke3N0YXJ0ZWRBdH0uJHtuZXh0UnVuU2VxKCl9YFxuXG5leHBvcnQgY29uc3QgbWFrZVJ1blNlc3Npb25Mb2NhbFN0YXRlID0gKCk6IFJ1blNlc3Npb25Mb2NhbFN0YXRlID0+IHtcbiAgY29uc3Qgb25jZUtleXMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICBjb25zdCBzZXFCeU5hbWVzcGFjZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBudW1iZXI+PigpXG5cbiAgcmV0dXJuIHtcbiAgICBvbmNlOiAoa2V5KSA9PiB7XG4gICAgICBpZiAob25jZUtleXMuaGFzKGtleSkpIHJldHVybiBmYWxzZVxuICAgICAgb25jZUtleXMuYWRkKGtleSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSxcbiAgICBuZXh0U2VxOiAobmFtZXNwYWNlLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGJ5S2V5ID0gc2VxQnlOYW1lc3BhY2UuZ2V0KG5hbWVzcGFjZSkgPz8gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuICAgICAgaWYgKCFzZXFCeU5hbWVzcGFjZS5oYXMobmFtZXNwYWNlKSkgc2VxQnlOYW1lc3BhY2Uuc2V0KG5hbWVzcGFjZSwgYnlLZXkpXG4gICAgICBjb25zdCBwcmV2ID0gYnlLZXkuZ2V0KGtleSkgPz8gMFxuICAgICAgY29uc3QgbmV4dCA9IHByZXYgKyAxXG4gICAgICBieUtleS5zZXQoa2V5LCBuZXh0KVxuICAgICAgcmV0dXJuIG5leHRcbiAgICB9LFxuICAgIGNsZWFyOiAoKSA9PiB7XG4gICAgICBvbmNlS2V5cy5jbGVhcigpXG4gICAgICBzZXFCeU5hbWVzcGFjZS5jbGVhcigpXG4gICAgfSxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgbWFrZVJ1blNlc3Npb24gPSAob3B0aW9ucz86IHtcbiAgcmVhZG9ubHkgcnVuSWQ/OiBSdW5JZFxuICByZWFkb25seSBzb3VyY2U/OiBFdmlkZW5jZVBhY2thZ2VTb3VyY2VcbiAgcmVhZG9ubHkgc3RhcnRlZEF0PzogbnVtYmVyXG4gIHJlYWRvbmx5IGxvY2FsPzogUnVuU2Vzc2lvbkxvY2FsU3RhdGVcbn0pOiBSdW5TZXNzaW9uID0+IHtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gb3B0aW9ucz8uc3RhcnRlZEF0ID8/IERhdGUubm93KClcbiAgcmV0dXJuIHtcbiAgICBydW5JZDogb3B0aW9ucz8ucnVuSWQgPz8gbWFrZVJ1bklkKHN0YXJ0ZWRBdCksXG4gICAgc291cmNlOiBvcHRpb25zPy5zb3VyY2UgPz8geyBob3N0OiBcInVua25vd25cIiB9LFxuICAgIHN0YXJ0ZWRBdCxcbiAgICBsb2NhbDogb3B0aW9ucz8ubG9jYWwgPz8gbWFrZVJ1blNlc3Npb25Mb2NhbFN0YXRlKCksXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IG1ha2VFdmlkZW5jZVNpbmsgPSAoc2Vzc2lvbjogUnVuU2Vzc2lvbik6IEV2aWRlbmNlU2luayA9PiB7XG4gIGNvbnN0IGV2ZW50czogT2JzZXJ2YXRpb25FbnZlbG9wZVtdID0gW11cbiAgbGV0IG5leHRTZXEgPSAxXG5cbiAgcmV0dXJuIHtcbiAgICByZWNvcmQ6ICh0eXBlLCBwYXlsb2FkLCBvcHRpb25zKSA9PiB7XG4gICAgICBldmVudHMucHVzaCh7XG4gICAgICAgIHByb3RvY29sVmVyc2lvbjogT0JTRVJWQUJJTElUWV9QUk9UT0NPTF9WRVJTSU9OLFxuICAgICAgICBydW5JZDogc2Vzc2lvbi5ydW5JZCxcbiAgICAgICAgc2VxOiBuZXh0U2VxKyssXG4gICAgICAgIHRpbWVzdGFtcDogb3B0aW9ucz8udGltZXN0YW1wID8/IERhdGUubm93KCksXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHBheWxvYWQsXG4gICAgICB9KVxuICAgIH0sXG4gICAgZXhwb3J0OiAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgcHJvdG9jb2xWZXJzaW9uID0gb3B0aW9ucz8ucHJvdG9jb2xWZXJzaW9uID8/IE9CU0VSVkFCSUxJVFlfUFJPVE9DT0xfVkVSU0lPTlxuICAgICAgY29uc3QgbWF4RXZlbnRzID0gb3B0aW9ucz8ubWF4RXZlbnRzXG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkID1cbiAgICAgICAgdHlwZW9mIG1heEV2ZW50cyA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUobWF4RXZlbnRzKSAmJiBtYXhFdmVudHMgPiAwXG4gICAgICAgICAgPyBldmVudHMuc2xpY2UoTWF0aC5tYXgoMCwgZXZlbnRzLmxlbmd0aCAtIE1hdGguZmxvb3IobWF4RXZlbnRzKSkpXG4gICAgICAgICAgOiBldmVudHMuc2xpY2UoKVxuXG4gICAgICByZXR1cm4gZXhwb3J0RXZpZGVuY2VQYWNrYWdlKHtcbiAgICAgICAgcHJvdG9jb2xWZXJzaW9uLFxuICAgICAgICBydW5JZDogc2Vzc2lvbi5ydW5JZCxcbiAgICAgICAgc291cmNlOiBzZXNzaW9uLnNvdXJjZSxcbiAgICAgICAgY3JlYXRlZEF0OiBvcHRpb25zPy5jcmVhdGVkQXQsXG4gICAgICAgIGV2ZW50czogc2VsZWN0ZWQsXG4gICAgICAgIHN1bW1hcnk6IG9wdGlvbnM/LnN1bW1hcnksXG4gICAgICB9KVxuICAgIH0sXG4gICAgY2xlYXI6ICgpID0+IHtcbiAgICAgIGV2ZW50cy5sZW5ndGggPSAwXG4gICAgICBuZXh0U2VxID0gMVxuICAgIH0sXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJ1blNlc3Npb25MYXllciA9IChcbiAgc2Vzc2lvbj86IFJ1blNlc3Npb24sXG4pOiBMYXllci5MYXllcjxSdW5TZXNzaW9uVGFnSW1wbCwgbmV2ZXIsIG5ldmVyPiA9PlxuICBMYXllci5zdWNjZWVkKFJ1blNlc3Npb25UYWcsIHNlc3Npb24gPz8gbWFrZVJ1blNlc3Npb24oKSkgYXMgTGF5ZXIuTGF5ZXI8XG4gICAgUnVuU2Vzc2lvblRhZ0ltcGwsXG4gICAgbmV2ZXIsXG4gICAgbmV2ZXJcbiAgPlxuIiwgIi8vIEludGVybmFsIEVmZmVjdE9wIEFQSSAoZm9yIGludGVybmFsIGltcGxlbWVudGF0aW9uIGNvZGUpLlxuLy9cbi8vIEdvYWw6XG4vLyAtIEludGVybmFsIG1vZHVsZXMgbXVzdCBuZXZlciBpbXBvcnQgcm9vdCBwdWJsaWMgc3VibW9kdWxlcyAoZS5nLiBgLi4vRWZmZWN0T3BgKS5cbi8vIC0gVGhpcyBmaWxlIGhvc3RzIHRoZSBzaGFyZWQgaW1wbGVtZW50YXRpb247IHB1YmxpYyBgc3JjL0VmZmVjdE9wLnRzYCBkZWxlZ2F0ZXMgdG8gaXQuXG5cbmltcG9ydCB7IEVmZmVjdCwgT3B0aW9uIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgKiBhcyBDb3JlIGZyb20gXCIuL3J1bnRpbWUvY29yZS9FZmZlY3RPcENvcmUuanNcIlxuaW1wb3J0IHsgUnVuU2Vzc2lvblRhZyB9IGZyb20gXCIuL29ic2VydmFiaWxpdHkvcnVuU2Vzc2lvbi5qc1wiXG5cbmV4cG9ydCB0eXBlIEVmZmVjdE9wPE91dCA9IHVua25vd24sIEVyciA9IHVua25vd24sIEVudiA9IHVua25vd24+ID1cbiAgQ29yZS5FZmZlY3RPcDxPdXQsIEVyciwgRW52PlxuXG5leHBvcnQgdHlwZSBPcGVyYXRpb25Qb2xpY3kgPSBDb3JlLk9wZXJhdGlvblBvbGljeVxuXG5leHBvcnQgdHlwZSBPcGVyYXRpb25SZWplY3RlZCA9IENvcmUuT3BlcmF0aW9uUmVqZWN0ZWRcblxuZXhwb3J0IHR5cGUgT3BlcmF0aW9uRXJyb3I8RT4gPSBDb3JlLk9wZXJhdGlvbkVycm9yPEU+XG5cbmV4cG9ydCB0eXBlIE1pZGRsZXdhcmUgPSBDb3JlLk1pZGRsZXdhcmVcblxuZXhwb3J0IHR5cGUgTWlkZGxld2FyZVN0YWNrID0gQ29yZS5NaWRkbGV3YXJlU3RhY2tcblxuZXhwb3J0IGNvbnN0IGNvbXBvc2VNaWRkbGV3YXJlID0gQ29yZS5jb21wb3NlTWlkZGxld2FyZVxuXG5leHBvcnQgY29uc3QgbWFrZU9wZXJhdGlvblJlamVjdGVkID0gQ29yZS5tYWtlT3BlcmF0aW9uUmVqZWN0ZWRcblxuLyoqXG4gKiBcdTc1MUZcdTYyMTBcdTdBMzNcdTVCOUEgaWRcdUZGMENcdTc1MjhcdTRFOEVcdTY4MDdcdThCQzZcdTRFMDBcdTZCMjEgRWZmZWN0T3BcdTMwMDJcbiAqIC0gXHU5RUQ4XHU4QkE0XHU0RjdGXHU3NTI4XHU1MzU1XHU4QzAzXHU1RThGXHU1M0Y3XHVGRjBDXHU5MDdGXHU1MTREXHU5NjhGXHU2NzNBL1x1NjVGNlx1OTVGNFx1NUUyNlx1Njc2NVx1NzY4NFx1NEUwRFx1NTNFRlx1OTFDRFx1NjUzRVx1NjAyN1x1RkYxQlxuICogLSBcdTgyRTUgbWV0YS5pbnN0YW5jZUlkIFx1NTNFRlx1NzUyOFx1RkYwQ1x1NTIxOVx1NEYxOFx1NTE0OFx1NkQzRVx1NzUxRlx1NEUzQSBgJHtpbnN0YW5jZUlkfTo6byR7b3BTZXF9YFx1MzAwMlxuICovXG5sZXQgbmV4dEdsb2JhbE9wU2VxID0gMFxuXG5jb25zdCBuZXh0T3BTZXEgPSAoKTogbnVtYmVyID0+IHtcbiAgbmV4dEdsb2JhbE9wU2VxICs9IDFcbiAgcmV0dXJuIG5leHRHbG9iYWxPcFNlcVxufVxuXG5jb25zdCBtYWtlSWQgPSAoaW5zdGFuY2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcFNlcTogbnVtYmVyKTogc3RyaW5nID0+XG4gIGluc3RhbmNlSWQgPyBgJHtpbnN0YW5jZUlkfTo6byR7b3BTZXF9YCA6IGBvJHtvcFNlcX1gXG5cbi8qKlxuICogRWZmZWN0T3AubWFrZVx1RkYxQVxuICogLSBcdTUyMUJcdTVFRkFcdTRFMDBcdTY3NjFcdTVFMjZcdTU3RkFcdTY3MkMgbWV0YSBcdTc2ODQgRWZmZWN0T3BcdUZGMUJcbiAqIC0gXHU5RUQ4XHU4QkE0XHU3NTFGXHU2MjEwXHU3QTMzXHU1QjlBIGlkXHVGRjA4XHU1N0ZBXHU0RThFIGBpbnN0YW5jZUlkYCArIFx1NTM1NVx1OEMwMyBgb3BTZXFgXHVGRjA5XHVGRjBDXHU4QzAzXHU3NTI4XHU2NUI5XHU0RTVGXHU1M0VGXHU1NzI4XHU1OTE2XHU1QzQyXHU4OTg2XHU1MTk5XHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBtYWtlID0gPEEsIEUsIFI+KHBhcmFtczoge1xuICByZWFkb25seSBraW5kOiBFZmZlY3RPcFtcImtpbmRcIl1cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG4gIHJlYWRvbmx5IGVmZmVjdDogRWZmZWN0LkVmZmVjdDxBLCBFLCBSPlxuICByZWFkb25seSBwYXlsb2FkPzogdW5rbm93blxuICByZWFkb25seSBtZXRhPzogRWZmZWN0T3BbXCJtZXRhXCJdXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nXG59KTogRWZmZWN0T3A8QSwgRSwgUj4gPT4gKHtcbiAgLi4uKHBhcmFtcy5pZFxuICAgID8geyBpZDogcGFyYW1zLmlkLCBtZXRhOiBwYXJhbXMubWV0YSB9XG4gICAgOiAoKCkgPT4ge1xuICAgICAgICBjb25zdCBtZXRhOiBhbnkgPSBwYXJhbXMubWV0YSA/PyB7fVxuICAgICAgICBjb25zdCBpbnN0YW5jZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBtZXRhLmluc3RhbmNlSWRcbiAgICAgICAgY29uc3Qgb3BTZXE6IG51bWJlciA9XG4gICAgICAgICAgdHlwZW9mIG1ldGEub3BTZXEgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKG1ldGEub3BTZXEpXG4gICAgICAgICAgICA/IE1hdGguZmxvb3IobWV0YS5vcFNlcSlcbiAgICAgICAgICAgIDogbmV4dE9wU2VxKClcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogbWFrZUlkKGluc3RhbmNlSWQsIG9wU2VxKSxcbiAgICAgICAgICBtZXRhOiBtZXRhLm9wU2VxID09PSBvcFNlcSA/IG1ldGEgOiB7IC4uLm1ldGEsIG9wU2VxIH0sXG4gICAgICAgIH1cbiAgICAgIH0pKCkpLFxuICBraW5kOiBwYXJhbXMua2luZCxcbiAgbmFtZTogcGFyYW1zLm5hbWUsXG4gIHBheWxvYWQ6IHBhcmFtcy5wYXlsb2FkLFxuICBlZmZlY3Q6IHBhcmFtcy5lZmZlY3QsXG59KVxuXG4vKipcbiAqIEVmZmVjdE9wLm1ha2VJblJ1blNlc3Npb25cdUZGMUFcbiAqIC0gXHU1NzI4IFJ1blNlc3Npb24gXHU0RjVDXHU3NTI4XHU1N0RGXHU1MTg1XHU1MjA2XHU5MTREXHU3QTMzXHU1QjlBIGBvcFNlcWBcdUZGMDhwZXItc2Vzc2lvbiArIHBlci1pbnN0YW5jZVx1RkYwOVx1RkYxQlxuICogLSBcdTgyRTUgRW52IFx1NEUyRFx1NjVFMCBSdW5TZXNzaW9uXHVGRjBDXHU1MjE5XHU1NkRFXHU5MDAwXHU1MjMwXHU4RkRCXHU3QTBCXHU3RUE3XHU1MzU1XHU4QzAzXHU1RThGXHU1M0Y3XHVGRjA4XHU0RTBEXHU1MThEXHU0RjdGXHU3NTI4XHU4RkRCXHU3QTBCXHU3RUE3IE1hcFx1RkYwOVx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgbWFrZUluUnVuU2Vzc2lvbiA9IDxBLCBFLCBSPihwYXJhbXM6IHtcbiAgcmVhZG9ubHkga2luZDogRWZmZWN0T3BbXCJraW5kXCJdXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZ1xuICByZWFkb25seSBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8QSwgRSwgUj5cbiAgcmVhZG9ubHkgcGF5bG9hZD86IHVua25vd25cbiAgcmVhZG9ubHkgbWV0YT86IEVmZmVjdE9wW1wibWV0YVwiXVxuICByZWFkb25seSBpZD86IHN0cmluZ1xufSk6IEVmZmVjdC5FZmZlY3Q8RWZmZWN0T3A8QSwgRSwgUj4sIG5ldmVyLCBhbnk+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBpZiAocGFyYW1zLmlkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogcGFyYW1zLmlkLFxuICAgICAgICBraW5kOiBwYXJhbXMua2luZCxcbiAgICAgICAgbmFtZTogcGFyYW1zLm5hbWUsXG4gICAgICAgIHBheWxvYWQ6IHBhcmFtcy5wYXlsb2FkLFxuICAgICAgICBtZXRhOiBwYXJhbXMubWV0YSxcbiAgICAgICAgZWZmZWN0OiBwYXJhbXMuZWZmZWN0LFxuICAgICAgfSBzYXRpc2ZpZXMgRWZmZWN0T3A8QSwgRSwgUj5cbiAgICB9XG5cbiAgICBjb25zdCBtZXRhOiBhbnkgPSBwYXJhbXMubWV0YSA/PyB7fVxuICAgIGNvbnN0IGluc3RhbmNlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG1ldGEuaW5zdGFuY2VJZFxuXG4gICAgbGV0IG9wU2VxOiBudW1iZXJcbiAgICBpZiAodHlwZW9mIG1ldGEub3BTZXEgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKG1ldGEub3BTZXEpKSB7XG4gICAgICBvcFNlcSA9IE1hdGguZmxvb3IobWV0YS5vcFNlcSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2Vzc2lvbk9wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSdW5TZXNzaW9uVGFnKVxuICAgICAgaWYgKE9wdGlvbi5pc1NvbWUoc2Vzc2lvbk9wdCkpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gaW5zdGFuY2VJZCA/PyBcImdsb2JhbFwiXG4gICAgICAgIG9wU2VxID0gc2Vzc2lvbk9wdC52YWx1ZS5sb2NhbC5uZXh0U2VxKFwib3BTZXFcIiwga2V5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BTZXEgPSBuZXh0T3BTZXEoKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogbWFrZUlkKGluc3RhbmNlSWQsIG9wU2VxKSxcbiAgICAgIGtpbmQ6IHBhcmFtcy5raW5kLFxuICAgICAgbmFtZTogcGFyYW1zLm5hbWUsXG4gICAgICBwYXlsb2FkOiBwYXJhbXMucGF5bG9hZCxcbiAgICAgIG1ldGE6IG1ldGEub3BTZXEgPT09IG9wU2VxID8gbWV0YSA6IHsgLi4ubWV0YSwgb3BTZXEgfSxcbiAgICAgIGVmZmVjdDogcGFyYW1zLmVmZmVjdCxcbiAgICB9IHNhdGlzZmllcyBFZmZlY3RPcDxBLCBFLCBSPlxuICB9KVxuXG4vKipcbiAqIEVmZmVjdE9wLndpdGhNZXRhXHVGRjFBXG4gKiAtIFx1NTcyOFx1NzNCMFx1NjcwOSBFZmZlY3RPcCBcdTRFMEFcdThGRkRcdTUyQTBcdTYyMTZcdTg5ODZcdTc2RDYgbWV0YSBcdTVCNTdcdTZCQjVcdUZGMUJcbiAqIC0gXHU0RTBEXHU2NTM5XHU1M0Q4IGVmZmVjdCBcdTY3MkNcdThFQUJcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhNZXRhID0gPEEsIEUsIFI+KFxuICBvcDogRWZmZWN0T3A8QSwgRSwgUj4sXG4gIG1ldGE6IFBhcnRpYWw8Tm9uTnVsbGFibGU8RWZmZWN0T3BbXCJtZXRhXCJdPj4sXG4pOiBFZmZlY3RPcDxBLCBFLCBSPiA9PiAoe1xuICAuLi5vcCxcbiAgbWV0YTogeyAuLi4ob3AubWV0YSA/PyB7fSksIC4uLm1ldGEgfSxcbn0pXG5cbi8qKlxuICogRWZmZWN0T3AucnVuXHVGRjFBXG4gKiAtIFx1NEY3Rlx1NzUyOFx1N0VEOVx1NUI5QSBNaWRkbGV3YXJlU3RhY2sgXHU2MjY3XHU4ODRDXHU0RTAwXHU2NzYxIEVmZmVjdE9wXHVGRjFCXG4gKiAtIFx1ODJFNSBzdGFjayBcdTRFM0FcdTdBN0FcdUZGMENcdTUyMTlcdTc2RjRcdTYzQTVcdThGRDRcdTU2REUgb3AuZWZmZWN0XHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBydW4gPSA8QSwgRSwgUj4oXG4gIG9wOiBFZmZlY3RPcDxBLCBFLCBSPixcbiAgc3RhY2s6IE1pZGRsZXdhcmVTdGFjayxcbik6IEVmZmVjdC5FZmZlY3Q8QSwgRSwgUj4gPT4gQ29yZS5ydW5XaXRoTWlkZGxld2FyZShvcCwgc3RhY2spXG5cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7O0FBSUEsU0FBUyxTQUFTLFFBQVEsZ0JBQWdCO0FBT25DLElBQU0sZ0JBQWdCLFNBQVMsV0FBK0IsTUFBUztBQWtDdkUsSUFBTSx3QkFBd0IsQ0FBQyxZQU1aO0FBQUEsRUFDeEIsTUFBTTtBQUFBLEVBQ04sU0FBUyxPQUFPO0FBQUEsRUFDaEIsTUFBTSxPQUFPO0FBQUEsRUFDYixNQUFNLE9BQU87QUFBQSxFQUNiLFFBQVEsT0FBTztBQUFBLEVBQ2YsU0FBUyxPQUFPO0FBQ2xCO0FBdUVPLElBQU0sd0JBQU4sY0FBb0MsUUFBUTtBQUFBLEVBQ2pEO0FBQ0YsRUFBZ0QsRUFBRTtBQUFDO0FBUTVDLElBQU0sb0JBQW9CLENBQUMsVUFBdUM7QUFDdkUsU0FBTyxDQUFVLE9B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Q3JELE9BQU87QUFDTCxjQUFRLFVBQVU7QUFBQSxJQUNwQjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQUEsSUFDTCxJQUFJLE9BQU8sWUFBWSxLQUFLO0FBQUEsSUFDNUIsTUFBTSxPQUFPO0FBQUEsSUFDYixNQUFNLE9BQU87QUFBQSxJQUNiLFNBQVMsT0FBTztBQUFBLElBQ2hCLE1BQU0sS0FBSyxVQUFVLFFBQVEsT0FBTyxFQUFFLEdBQUcsTUFBTSxNQUFNO0FBQUEsSUFDckQsUUFBUSxPQUFPO0FBQUEsRUFDakI7QUFDRixDQUFDO0FBT0ksSUFBTSxXQUFXLENBQ3RCLElBQ0EsVUFDdUI7QUFBQSxFQUN2QixHQUFHO0FBQUEsRUFDSCxNQUFNLEVBQUUsR0FBSSxHQUFHLFFBQVEsQ0FBQyxHQUFJLEdBQUcsS0FBSztBQUN0QztBQU9PLElBQU0sTUFBTSxDQUNqQixJQUNBLFVBQ2dDLGtCQUFrQixJQUFJLEtBQUs7IiwKICAibmFtZXMiOiBbIkNvbnRleHQiLCAiQ29udGV4dCIsICJFZmZlY3QiLCAiY29tcG9zZU1pZGRsZXdhcmUiLCAibWFrZU9wZXJhdGlvblJlamVjdGVkIiwgIkVmZmVjdCJdCn0K