@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,431 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ isDevEnv
5
+ } from "./chunk-GP37MEGJ.js";
6
+ import {
7
+ record,
8
+ toSerializableErrorSummary
9
+ } from "./chunk-CVZPRIDB.js";
10
+
11
+ // ../logix-core/src/internal/runtime/core/Lifecycle.ts
12
+ import { Cause, Context, Effect, Ref } from "../effect.js";
13
+ var LifecycleContext = Context.GenericTag(
14
+ "@logix/LifecycleManager"
15
+ );
16
+ var safeRun = (label, eff) => eff.pipe(
17
+ Effect.matchCauseEffect({
18
+ onSuccess: () => Effect.void,
19
+ onFailure: (cause) => Effect.logError(`[${label}] failed: ${Cause.pretty(cause)}`)
20
+ })
21
+ );
22
+ var makeTaskId = (kind, order) => `${kind}:${order}`;
23
+ var makeLifecycleManager = (identity) => Effect.gen(function* () {
24
+ const budgets = {
25
+ maxEventsPerInstance: 20,
26
+ maxEventBytes: 4 * 1024
27
+ };
28
+ const statusRef = yield* Ref.make({
29
+ identity,
30
+ status: "creating"
31
+ });
32
+ const initRequired = [];
33
+ const start = [];
34
+ const destroy = [];
35
+ const platformSuspend = [];
36
+ const platformResume = [];
37
+ const platformReset = [];
38
+ const onErrorHandlers = [];
39
+ const getStatus = Ref.get(statusRef);
40
+ const recordPhase = (phase, name, payload) => record({
41
+ type: "lifecycle:phase",
42
+ moduleId: identity.moduleId,
43
+ instanceId: identity.instanceId,
44
+ phase,
45
+ name,
46
+ payload
47
+ });
48
+ const setStatus = (status, patch) => Ref.update(statusRef, (prev) => ({
49
+ ...prev,
50
+ identity: {
51
+ ...prev.identity,
52
+ ...patch?.runtimeLabel ? { runtimeLabel: patch.runtimeLabel } : null
53
+ },
54
+ status,
55
+ ...patch?.initOutcome !== void 0 ? { initOutcome: patch.initOutcome } : null,
56
+ ...patch?.initProgress !== void 0 ? { initProgress: patch.initProgress } : null
57
+ }));
58
+ const registerInitRequired = (effect, options) => {
59
+ const order = initRequired.length;
60
+ initRequired.push({
61
+ taskId: makeTaskId("initRequired", order),
62
+ kind: "initRequired",
63
+ order,
64
+ name: options?.name,
65
+ effect
66
+ });
67
+ };
68
+ const registerStart = (effect, options) => {
69
+ const order = start.length;
70
+ start.push({
71
+ taskId: makeTaskId("start", order),
72
+ kind: "start",
73
+ order,
74
+ name: options?.name,
75
+ fatalOnFailure: options?.fatalOnFailure,
76
+ effect
77
+ });
78
+ };
79
+ const registerDestroy = (effect, options) => {
80
+ const order = destroy.length;
81
+ destroy.push({
82
+ taskId: makeTaskId("destroy", order),
83
+ kind: "destroy",
84
+ order,
85
+ name: options?.name,
86
+ effect
87
+ });
88
+ };
89
+ const registerOnError = (handler) => {
90
+ onErrorHandlers.push(handler);
91
+ };
92
+ const registerPlatformSuspend = (effect, options) => {
93
+ const order = platformSuspend.length;
94
+ platformSuspend.push({
95
+ taskId: makeTaskId("platformSuspend", order),
96
+ kind: "platformSuspend",
97
+ order,
98
+ name: options?.name,
99
+ effect
100
+ });
101
+ };
102
+ const registerPlatformResume = (effect, options) => {
103
+ const order = platformResume.length;
104
+ platformResume.push({
105
+ taskId: makeTaskId("platformResume", order),
106
+ kind: "platformResume",
107
+ order,
108
+ name: options?.name,
109
+ effect
110
+ });
111
+ };
112
+ const registerPlatformReset = (effect, options) => {
113
+ const order = platformReset.length;
114
+ platformReset.push({
115
+ taskId: makeTaskId("platformReset", order),
116
+ kind: "platformReset",
117
+ order,
118
+ name: options?.name,
119
+ effect
120
+ });
121
+ };
122
+ const notifyError = (cause, context) => {
123
+ if (Cause.isInterrupted(cause)) {
124
+ return Effect.void;
125
+ }
126
+ return record({
127
+ type: "lifecycle:error",
128
+ moduleId: context.moduleId,
129
+ instanceId: context.instanceId,
130
+ cause,
131
+ phase: context.phase,
132
+ hook: context.hook,
133
+ taskId: context.taskId,
134
+ txnSeq: context.txnSeq,
135
+ opSeq: context.opSeq,
136
+ origin: context.origin
137
+ }).pipe(
138
+ Effect.zipRight(
139
+ Effect.forEach(
140
+ onErrorHandlers,
141
+ (handler) => handler(cause, context).pipe(
142
+ Effect.catchAllCause(
143
+ (inner) => Effect.logError(
144
+ `[lifecycle.onError] failed: ${Cause.pretty(inner)}`
145
+ )
146
+ )
147
+ ),
148
+ { discard: true }
149
+ )
150
+ )
151
+ );
152
+ };
153
+ const runInitRequired = Effect.gen(function* () {
154
+ const total = initRequired.length;
155
+ if (total === 0) {
156
+ yield* setStatus("ready", {
157
+ initProgress: { total: 0, completed: 0 },
158
+ initOutcome: { status: "success" }
159
+ });
160
+ return;
161
+ }
162
+ const startedAt = Date.now();
163
+ yield* recordPhase("init", "initRequired:start", { total });
164
+ yield* setStatus("initializing", {
165
+ initProgress: { total, completed: 0, current: 0, startedAt }
166
+ });
167
+ let completed = 0;
168
+ for (let i = 0; i < initRequired.length; i++) {
169
+ yield* setStatus("initializing", {
170
+ initProgress: { total, completed, current: i, startedAt }
171
+ });
172
+ const task = initRequired[i];
173
+ const exit = yield* Effect.exit(task.effect);
174
+ if (exit._tag === "Success") {
175
+ completed += 1;
176
+ yield* setStatus("initializing", {
177
+ initProgress: { total, completed, current: i + 1, startedAt }
178
+ });
179
+ continue;
180
+ }
181
+ const summary = toSerializableErrorSummary(exit.cause);
182
+ yield* notifyError(exit.cause, {
183
+ phase: "init",
184
+ hook: "initRequired",
185
+ moduleId: identity.moduleId,
186
+ instanceId: identity.instanceId,
187
+ taskId: task.taskId,
188
+ origin: "initRequired"
189
+ });
190
+ yield* setStatus("failed", {
191
+ initProgress: { total, completed, current: i, startedAt },
192
+ initOutcome: { status: "failure", error: summary.errorSummary }
193
+ });
194
+ return yield* Effect.failCause(exit.cause);
195
+ }
196
+ yield* recordPhase("init", "initRequired:success", { total });
197
+ yield* setStatus("ready", {
198
+ initProgress: { total, completed, current: total, startedAt },
199
+ initOutcome: { status: "success" }
200
+ });
201
+ });
202
+ const runStart = recordPhase("run", "start:schedule", {
203
+ total: start.length
204
+ }).pipe(
205
+ Effect.zipRight(
206
+ Effect.forEach(
207
+ start,
208
+ (task) => Effect.forkScoped(
209
+ task.effect.pipe(
210
+ Effect.catchAllCause(
211
+ (cause) => notifyError(cause, {
212
+ phase: "run",
213
+ hook: "start",
214
+ moduleId: identity.moduleId,
215
+ instanceId: identity.instanceId,
216
+ taskId: task.taskId,
217
+ origin: "start"
218
+ })
219
+ )
220
+ )
221
+ ).pipe(Effect.asVoid),
222
+ { discard: true, concurrency: "unbounded" }
223
+ )
224
+ )
225
+ );
226
+ const runDestroy = Effect.gen(function* () {
227
+ yield* recordPhase("destroy", "destroy:start", { total: destroy.length });
228
+ yield* setStatus("terminating");
229
+ for (let i = destroy.length - 1; i >= 0; i--) {
230
+ const task = destroy[i];
231
+ yield* safeRun(
232
+ "lifecycle.onDestroy",
233
+ task.effect.pipe(
234
+ Effect.catchAllCause(
235
+ (cause) => notifyError(cause, {
236
+ phase: "destroy",
237
+ hook: "destroy",
238
+ moduleId: identity.moduleId,
239
+ instanceId: identity.instanceId,
240
+ taskId: task.taskId,
241
+ origin: "destroy"
242
+ })
243
+ )
244
+ )
245
+ );
246
+ }
247
+ yield* setStatus("terminated");
248
+ yield* recordPhase("destroy", "destroy:done", { total: destroy.length });
249
+ });
250
+ const runPlatformSuspend = Effect.gen(function* () {
251
+ if (platformSuspend.length === 0) return;
252
+ yield* recordPhase("platform", "signal:suspend", { total: platformSuspend.length });
253
+ for (const task of platformSuspend) {
254
+ yield* safeRun(
255
+ "lifecycle.onSuspend",
256
+ task.effect.pipe(
257
+ Effect.catchAllCause(
258
+ (cause) => notifyError(cause, {
259
+ phase: "platform",
260
+ hook: "suspend",
261
+ moduleId: identity.moduleId,
262
+ instanceId: identity.instanceId,
263
+ taskId: task.taskId,
264
+ origin: "platform.suspend"
265
+ })
266
+ )
267
+ )
268
+ );
269
+ }
270
+ });
271
+ const runPlatformResume = Effect.gen(function* () {
272
+ if (platformResume.length === 0) return;
273
+ yield* recordPhase("platform", "signal:resume", { total: platformResume.length });
274
+ for (const task of platformResume) {
275
+ yield* safeRun(
276
+ "lifecycle.onResume",
277
+ task.effect.pipe(
278
+ Effect.catchAllCause(
279
+ (cause) => notifyError(cause, {
280
+ phase: "platform",
281
+ hook: "resume",
282
+ moduleId: identity.moduleId,
283
+ instanceId: identity.instanceId,
284
+ taskId: task.taskId,
285
+ origin: "platform.resume"
286
+ })
287
+ )
288
+ )
289
+ );
290
+ }
291
+ });
292
+ const runPlatformReset = Effect.gen(function* () {
293
+ if (platformReset.length === 0) return;
294
+ yield* recordPhase("platform", "signal:reset", { total: platformReset.length });
295
+ for (const task of platformReset) {
296
+ yield* safeRun(
297
+ "lifecycle.onReset",
298
+ task.effect.pipe(
299
+ Effect.catchAllCause(
300
+ (cause) => notifyError(cause, {
301
+ phase: "platform",
302
+ hook: "reset",
303
+ moduleId: identity.moduleId,
304
+ instanceId: identity.instanceId,
305
+ taskId: task.taskId,
306
+ origin: "platform.reset"
307
+ })
308
+ )
309
+ )
310
+ );
311
+ }
312
+ });
313
+ const getTaskSnapshot = Effect.sync(() => ({
314
+ initRequired: initRequired.map(({ effect: _eff, ...rest }) => rest),
315
+ start: start.map(({ effect: _eff, ...rest }) => rest),
316
+ destroy: destroy.map(({ effect: _eff, ...rest }) => rest),
317
+ platformSuspend: platformSuspend.map(({ effect: _eff, ...rest }) => rest),
318
+ platformResume: platformResume.map(({ effect: _eff, ...rest }) => rest),
319
+ platformReset: platformReset.map(({ effect: _eff, ...rest }) => rest)
320
+ }));
321
+ const hasOnErrorHandlers = Effect.sync(() => onErrorHandlers.length > 0);
322
+ return {
323
+ identity,
324
+ budgets,
325
+ registerPlatformSuspend,
326
+ registerPlatformResume,
327
+ registerPlatformReset,
328
+ registerInitRequired,
329
+ registerStart,
330
+ registerDestroy,
331
+ registerOnError,
332
+ getStatus,
333
+ setStatus,
334
+ notifyError,
335
+ runPlatformSuspend,
336
+ runPlatformResume,
337
+ runPlatformReset,
338
+ runInitRequired,
339
+ runStart,
340
+ runDestroy,
341
+ hasOnErrorHandlers,
342
+ getTaskSnapshot
343
+ };
344
+ });
345
+
346
+ // ../logix-core/src/internal/runtime/core/LogicDiagnostics.ts
347
+ import { Cause as Cause2, Context as Context2, Effect as Effect2 } from "../effect.js";
348
+ var phaseDiagnosticsEnabled = () => isDevEnv();
349
+ var SERVICE_NOT_FOUND_PREFIX = "Service not found:";
350
+ var emitEnvServiceNotFoundDiagnosticIfNeeded = (cause, moduleId) => Effect2.gen(function* () {
351
+ let pretty;
352
+ try {
353
+ pretty = Cause2.pretty(cause, { renderErrorCause: true });
354
+ } catch {
355
+ return;
356
+ }
357
+ if (!pretty.includes(SERVICE_NOT_FOUND_PREFIX)) {
358
+ return;
359
+ }
360
+ yield* record({
361
+ type: "diagnostic",
362
+ moduleId,
363
+ code: "logic::env_service_not_found",
364
+ severity: "warning",
365
+ message: pretty,
366
+ hint: "Logic \u5728\u521D\u59CB\u5316\u9636\u6BB5\u5C1D\u8BD5\u8BBF\u95EE\u5C1A\u672A\u63D0\u4F9B\u7684 Env Service\uFF0C\u901A\u5E38\u662F Runtime / React \u96C6\u6210\u4E2D\u7684\u5DF2\u77E5\u521D\u59CB\u5316\u566A\u97F3\u3002\u82E5\u53EA\u5728\u5E94\u7528\u542F\u52A8\u65E9\u671F\u51FA\u73B0\u4E00\u6B21\u4E14\u540E\u7EED\u72B6\u6001\u4E0E Env \u5747\u6B63\u5E38\uFF0C\u53EF\u6682\u89C6\u4E3A\u65E0\u5BB3\uFF1B\u82E5\u6301\u7EED\u51FA\u73B0\u6216\u4F34\u968F\u4E1A\u52A1\u5F02\u5E38\uFF0C\u8BF7\u68C0\u67E5 Runtime.make / RuntimeProvider.layer \u662F\u5426\u6B63\u786E\u63D0\u4F9B\u4E86\u5BF9\u5E94 Service\u3002"
367
+ });
368
+ yield* record({
369
+ type: "diagnostic",
370
+ moduleId,
371
+ code: "logic::invalid_phase",
372
+ severity: "error",
373
+ message: "$.use is not allowed before Env is fully ready.",
374
+ hint: "setup \u6BB5\u6216 Env \u672A\u5B8C\u5168\u5C31\u7EEA\u65F6\u8BF7\u907F\u514D\u76F4\u63A5\u8BFB\u53D6 Service\uFF1B\u5EFA\u8BAE\u5C06\u5BF9 Env \u7684\u8BBF\u95EE\u79FB\u52A8\u5230 Logic \u7684 run \u6BB5\uFF0C\u6216\u901A\u8FC7 $.lifecycle.onInitRequired \u5305\u88C5\u521D\u59CB\u5316\u6D41\u7A0B\u3002",
375
+ kind: "env_service_not_ready"
376
+ });
377
+ });
378
+ var LogicPhaseServiceTag = Context2.GenericTag(
379
+ "@logix/LogicPhaseService"
380
+ );
381
+ var LogicUnitServiceTag = class extends Context2.Tag("@logix/LogicUnitService")() {
382
+ };
383
+ var makeLogicPhaseError = (kind, api, phase, moduleId) => Object.assign(
384
+ new Error(
385
+ `[LogicPhaseError] ${api} is not allowed in ${phase} phase (kind=${kind}).`
386
+ ),
387
+ {
388
+ _tag: "LogicPhaseError",
389
+ kind,
390
+ api,
391
+ phase,
392
+ moduleId
393
+ }
394
+ );
395
+ var emitInvalidPhaseDiagnosticIfNeeded = (cause, moduleId) => Effect2.gen(function* () {
396
+ if (!phaseDiagnosticsEnabled()) {
397
+ return;
398
+ }
399
+ const allErrors = [
400
+ ...Cause2.failures(cause),
401
+ ...Cause2.defects(cause)
402
+ ];
403
+ for (const err of allErrors) {
404
+ const logicErr = err;
405
+ if (logicErr && logicErr._tag === "LogicPhaseError") {
406
+ const phaseErr = logicErr;
407
+ const hint = phaseErr.kind === "use_in_setup" || phaseErr.kind === "lifecycle_in_setup" ? "setup \u6BB5\u7981\u6B62\u8BFB\u53D6 Env/Service \u6216\u6267\u884C\u957F\u751F\u547D\u5468\u671F\u903B\u8F91\uFF0C\u8BF7\u5C06\u76F8\u5173\u8C03\u7528\u79FB\u52A8\u5230 run \u6BB5\u3002" : phaseErr.kind === "lifecycle_in_run" ? "run \u6BB5\u7981\u6B62\u6CE8\u518C $.lifecycle.*\uFF08setup-only\uFF09\u3002\u8BF7\u5C06\u751F\u547D\u5468\u671F\u6CE8\u518C\u79FB\u52A8\u5230 Module.logic builder \u7684\u540C\u6B65\u90E8\u5206\uFF08return \u4E4B\u524D\uFF09\u3002" : phaseErr.kind === "traits_in_run" || phaseErr.kind === "traits_declare_in_run" ? "setup \u7ED3\u675F\u540E traits \u5DF2\u51BB\u7ED3\uFF1B\u8BF7\u5C06 $.traits.declare \u79FB\u52A8\u5230 LogicPlan.setup \u6216 Module.logic builder \u7684 setup \u6CE8\u518C\u9636\u6BB5\u3002" : "\u8C03\u6574\u903B\u8F91\u5230 run \u6BB5\uFF0Csetup \u4EC5\u505A\u6CE8\u518C\u7C7B\u64CD\u4F5C\u3002";
408
+ yield* record({
409
+ type: "diagnostic",
410
+ moduleId: phaseErr.moduleId ?? moduleId,
411
+ code: "logic::invalid_phase",
412
+ severity: "error",
413
+ message: `${phaseErr.api ?? phaseErr.kind} is not allowed in ${phaseErr.phase} phase.`,
414
+ hint,
415
+ kind: phaseErr.kind
416
+ });
417
+ return;
418
+ }
419
+ }
420
+ });
421
+
422
+ export {
423
+ LifecycleContext,
424
+ makeLifecycleManager,
425
+ emitEnvServiceNotFoundDiagnosticIfNeeded,
426
+ LogicPhaseServiceTag,
427
+ LogicUnitServiceTag,
428
+ makeLogicPhaseError,
429
+ emitInvalidPhaseDiagnosticIfNeeded
430
+ };
431
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0xpZmVjeWNsZS50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL2NvcmUvTG9naWNEaWFnbm9zdGljcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQ2F1c2UsIENvbnRleHQsIEVmZmVjdCwgUmVmIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgeyB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSB9IGZyb20gXCIuL2Vycm9yU3VtbWFyeS5qc1wiXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tIFwiLi9EZWJ1Z1NpbmsuanNcIlxuXG5leHBvcnQgdHlwZSBQaGFzZSA9IFwiaW5pdFwiIHwgXCJydW5cIiB8IFwiZGVzdHJveVwiIHwgXCJwbGF0Zm9ybVwiXG5cbmV4cG9ydCB0eXBlIEhvb2sgPVxuICB8IFwiaW5pdFJlcXVpcmVkXCJcbiAgfCBcInN0YXJ0XCJcbiAgfCBcImRlc3Ryb3lcIlxuICB8IFwic3VzcGVuZFwiXG4gIHwgXCJyZXN1bWVcIlxuICB8IFwicmVzZXRcIlxuICB8IFwidW5rbm93blwiXG5cbmV4cG9ydCB0eXBlIFRhc2tLaW5kID1cbiAgfCBcImluaXRSZXF1aXJlZFwiXG4gIHwgXCJzdGFydFwiXG4gIHwgXCJkZXN0cm95XCJcbiAgfCBcInBsYXRmb3JtU3VzcGVuZFwiXG4gIHwgXCJwbGF0Zm9ybVJlc3VtZVwiXG4gIHwgXCJwbGF0Zm9ybVJlc2V0XCJcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckNvbnRleHQge1xuICByZWFkb25seSBwaGFzZTogUGhhc2VcbiAgcmVhZG9ubHkgaG9vazogSG9va1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSB0YXNrSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gIHJlYWRvbmx5IG9wU2VxPzogbnVtYmVyXG4gIC8qKlxuICAgKiBcdTRFQzVcdTc1MjhcdTRFOEVcdThCQ0FcdTY1QURcdTg5RTNcdTkxQ0FcdUZGMUFcdThCQjBcdTVGNTVcdTIwMUNcdTk1MTlcdThCRUZcdTRFQ0VcdTU0RUFcdTkxQ0NcdTUxOTJcdTUxRkFcdTY3NjVcdTIwMURcdTc2ODRcdTVCOUVcdTczQjBcdTRGQTdcdTY4MDdcdThCQzZcdUZGMENcbiAgICogXHU0RjhCXHU1OTgyIFwibG9naWMuZm9ya1wiIC8gXCJpbml0UmVxdWlyZWRcIiAvIFwic3RhcnRcIlx1MzAwMlxuICAgKlxuICAgKiBcdTZDRThcdTYxMEZcdUZGMUFcdThCRTVcdTVCNTdcdTZCQjVcdTVGQzVcdTk4N0JcdTUzRUZcdTVFOEZcdTUyMTdcdTUzMTZcdUZGMENcdTRFMTRcdTRFMERcdTVFOTRcdTYyMTBcdTRFM0FcdTUzNEZcdThCQUVcdTk1MUFcdTcwQjlcdTMwMDJcbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbj86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZVJ1bnRpbWVJZGVudGl0eSB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJbnN0YW5jZVN0YXR1cyA9XG4gIHwgXCJjcmVhdGluZ1wiXG4gIHwgXCJpbml0aWFsaXppbmdcIlxuICB8IFwicmVhZHlcIlxuICB8IFwiZmFpbGVkXCJcbiAgfCBcInRlcm1pbmF0aW5nXCJcbiAgfCBcInRlcm1pbmF0ZWRcIlxuXG5leHBvcnQgaW50ZXJmYWNlIEluaXRQcm9ncmVzcyB7XG4gIHJlYWRvbmx5IHRvdGFsOiBudW1iZXJcbiAgcmVhZG9ubHkgY29tcGxldGVkOiBudW1iZXJcbiAgcmVhZG9ubHkgY3VycmVudD86IG51bWJlclxuICByZWFkb25seSBzdGFydGVkQXQ/OiBudW1iZXJcbn1cblxuZXhwb3J0IHR5cGUgTGlmZWN5Y2xlT3V0Y29tZSA9XG4gIHwgeyByZWFkb25seSBzdGF0dXM6IFwic3VjY2Vzc1wiIH1cbiAgfCB7XG4gICAgICByZWFkb25seSBzdGF0dXM6IFwiZmFpbHVyZVwiXG4gICAgICByZWFkb25seSBlcnJvcjogaW1wb3J0KFwiLi9lcnJvclN1bW1hcnkuanNcIikuU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5XG4gICAgfVxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZVN0YXR1cyB7XG4gIHJlYWRvbmx5IGlkZW50aXR5OiBNb2R1bGVSdW50aW1lSWRlbnRpdHlcbiAgcmVhZG9ubHkgc3RhdHVzOiBJbnN0YW5jZVN0YXR1c1xuICByZWFkb25seSBpbml0T3V0Y29tZT86IExpZmVjeWNsZU91dGNvbWVcbiAgcmVhZG9ubHkgaW5pdFByb2dyZXNzPzogSW5pdFByb2dyZXNzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza1JlZiB7XG4gIHJlYWRvbmx5IHRhc2tJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGtpbmQ6IFRhc2tLaW5kXG4gIHJlYWRvbmx5IG9yZGVyOiBudW1iZXJcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZ1xuICByZWFkb25seSBmYXRhbE9uRmFpbHVyZT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVUYXNrIGV4dGVuZHMgVGFza1JlZiB7XG4gIHJlYWRvbmx5IGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1ZGdldHMge1xuICAvKiogXHU1MzU1XHU1QjlFXHU0RjhCXHU3NTFGXHU1NDdEXHU1NDY4XHU2NzFGXHU0RThCXHU0RUY2XHU5ODg0XHU3Qjk3XHVGRjFBXHU1QkY5XHU5RjUwIHNwZWNzLzAxMSBkYXRhLW1vZGVsXHVGRjA4XHU5RUQ4XHU4QkE0IFx1MjI2NDIwXHVGRjA5XHUzMDAyICovXG4gIHJlYWRvbmx5IG1heEV2ZW50c1Blckluc3RhbmNlOiBudW1iZXJcbiAgLyoqIFx1NTM1NVx1NEU4Qlx1NEVGNlx1NEY1M1x1NzlFRlx1OTg4NFx1N0I5N1x1RkYxQVx1NUJGOVx1OUY1MCBzcGVjcy8wMTEgZGF0YS1tb2RlbFx1RkYwOFx1OUVEOFx1OEJBNCBcdTIyNjQ0S0JcdUZGMDlcdTMwMDIgKi9cbiAgcmVhZG9ubHkgbWF4RXZlbnRCeXRlczogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlTWFuYWdlciB7XG4gIHJlYWRvbmx5IGlkZW50aXR5OiBNb2R1bGVSdW50aW1lSWRlbnRpdHlcbiAgcmVhZG9ubHkgYnVkZ2V0czogQnVkZ2V0c1xuXG4gIHJlYWRvbmx5IHJlZ2lzdGVyUGxhdGZvcm1TdXNwZW5kOiAoXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfVxuICApID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVnaXN0ZXJQbGF0Zm9ybVJlc3VtZTogKFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH1cbiAgKSA9PiB2b2lkXG4gIHJlYWRvbmx5IHJlZ2lzdGVyUGxhdGZvcm1SZXNldDogKFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH1cbiAgKSA9PiB2b2lkXG5cbiAgcmVhZG9ubHkgcmVnaXN0ZXJJbml0UmVxdWlyZWQ6IChcbiAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9XG4gICkgPT4gdm9pZFxuICByZWFkb25seSByZWdpc3RlclN0YXJ0OiAoXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7IHJlYWRvbmx5IGZhdGFsT25GYWlsdXJlPzogYm9vbGVhbiB9XG4gICkgPT4gdm9pZFxuICByZWFkb25seSByZWdpc3RlckRlc3Ryb3k6IChcbiAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9XG4gICkgPT4gdm9pZFxuICByZWFkb25seSByZWdpc3Rlck9uRXJyb3I6IChcbiAgICBoYW5kbGVyOiAoXG4gICAgICBjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sXG4gICAgICBjb250ZXh0OiBFcnJvckNvbnRleHRcbiAgICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgKSA9PiB2b2lkXG5cbiAgcmVhZG9ubHkgZ2V0U3RhdHVzOiBFZmZlY3QuRWZmZWN0PExpZmVjeWNsZVN0YXR1cz5cbiAgcmVhZG9ubHkgc2V0U3RhdHVzOiAoXG4gICAgc3RhdHVzOiBJbnN0YW5jZVN0YXR1cyxcbiAgICBwYXRjaD86IHtcbiAgICAgIHJlYWRvbmx5IGluaXRPdXRjb21lPzogTGlmZWN5Y2xlT3V0Y29tZSB8IHVuZGVmaW5lZFxuICAgICAgcmVhZG9ubHkgaW5pdFByb2dyZXNzPzogSW5pdFByb2dyZXNzIHwgdW5kZWZpbmVkXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgICB9XG4gICkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPlxuXG4gIHJlYWRvbmx5IG5vdGlmeUVycm9yOiAoXG4gICAgY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LFxuICAgIGNvbnRleHQ6IEVycm9yQ29udGV4dFxuICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cblxuICByZWFkb25seSBydW5QbGF0Zm9ybVN1c3BlbmQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgcmVhZG9ubHkgcnVuUGxhdGZvcm1SZXN1bWU6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgcmVhZG9ubHkgcnVuUGxhdGZvcm1SZXNldDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuXG4gIHJlYWRvbmx5IHJ1bkluaXRSZXF1aXJlZDogRWZmZWN0LkVmZmVjdDx2b2lkLCB1bmtub3duLCBhbnk+XG4gIHJlYWRvbmx5IHJ1blN0YXJ0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gIHJlYWRvbmx5IHJ1bkRlc3Ryb3k6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cblxuICAvKiogXHU0RUM1XHU3NTI4XHU0RThFXHU4QkNBXHU2NUFEXHU3NkVFXHU3Njg0XHVGRjFBXHU2NjJGXHU1NDI2XHU1REYyXHU2Q0U4XHU1MThDXHU0RUZCXHU2MTBGIG9uRXJyb3IgXHU1OTA0XHU3NDA2XHU1NjY4XHUzMDAyICovXG4gIHJlYWRvbmx5IGhhc09uRXJyb3JIYW5kbGVyczogRWZmZWN0LkVmZmVjdDxib29sZWFuPlxuXG4gIC8qKiBcdTRFQzVcdTc1MjhcdTRFOEVcdTZENEJcdThCRDUvXHU4QkNBXHU2NUFEXHVGRjFBXHU4QkZCXHU1M0Q2XHU1REYyXHU2Q0U4XHU1MThDXHU3Njg0XHU0RUZCXHU1MkExXHU1RkVCXHU3MTY3XHVGRjA4XHU0RTBEXHU1M0VGXHU1M0Q4XHU4OUM2XHU1NkZFXHVGRjA5XHUzMDAyICovXG4gIHJlYWRvbmx5IGdldFRhc2tTbmFwc2hvdDogRWZmZWN0LkVmZmVjdDxcbiAgICBSZWFkb25seTx7XG4gICAgICByZWFkb25seSBpbml0UmVxdWlyZWQ6IFJlYWRvbmx5QXJyYXk8VGFza1JlZj5cbiAgICAgIHJlYWRvbmx5IHN0YXJ0OiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgICByZWFkb25seSBkZXN0cm95OiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgICByZWFkb25seSBwbGF0Zm9ybVN1c3BlbmQ6IFJlYWRvbmx5QXJyYXk8VGFza1JlZj5cbiAgICAgIHJlYWRvbmx5IHBsYXRmb3JtUmVzdW1lOiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgICByZWFkb25seSBwbGF0Zm9ybVJlc2V0OiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgfT4sXG4gICAgbmV2ZXIsXG4gICAgbmV2ZXJcbiAgPlxufVxuXG5leHBvcnQgY29uc3QgTGlmZWN5Y2xlQ29udGV4dCA9IENvbnRleHQuR2VuZXJpY1RhZzxMaWZlY3ljbGVNYW5hZ2VyPihcbiAgXCJAbG9naXgvTGlmZWN5Y2xlTWFuYWdlclwiXG4pXG5cbmNvbnN0IHNhZmVSdW4gPSAobGFiZWw6IHN0cmluZywgZWZmOiBFZmZlY3QuRWZmZWN0PHZvaWQsIGFueSwgYW55PikgPT5cbiAgZWZmLnBpcGUoXG4gICAgRWZmZWN0Lm1hdGNoQ2F1c2VFZmZlY3Qoe1xuICAgICAgb25TdWNjZXNzOiAoKSA9PiBFZmZlY3Qudm9pZCxcbiAgICAgIG9uRmFpbHVyZTogKGNhdXNlKSA9PlxuICAgICAgICBFZmZlY3QubG9nRXJyb3IoYFske2xhYmVsfV0gZmFpbGVkOiAke0NhdXNlLnByZXR0eShjYXVzZSl9YCksXG4gICAgfSlcbiAgKVxuXG5jb25zdCBtYWtlVGFza0lkID0gKGtpbmQ6IFRhc2tLaW5kLCBvcmRlcjogbnVtYmVyKTogc3RyaW5nID0+IGAke2tpbmR9OiR7b3JkZXJ9YFxuXG5leHBvcnQgY29uc3QgbWFrZUxpZmVjeWNsZU1hbmFnZXIgPSAoXG4gIGlkZW50aXR5OiBNb2R1bGVSdW50aW1lSWRlbnRpdHksXG4pOiBFZmZlY3QuRWZmZWN0PExpZmVjeWNsZU1hbmFnZXI+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBidWRnZXRzOiBCdWRnZXRzID0ge1xuICAgICAgbWF4RXZlbnRzUGVySW5zdGFuY2U6IDIwLFxuICAgICAgbWF4RXZlbnRCeXRlczogNCAqIDEwMjQsXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdHVzUmVmID0geWllbGQqIFJlZi5tYWtlPExpZmVjeWNsZVN0YXR1cz4oe1xuICAgICAgaWRlbnRpdHksXG4gICAgICBzdGF0dXM6IFwiY3JlYXRpbmdcIixcbiAgICB9KVxuXG4gICAgY29uc3QgaW5pdFJlcXVpcmVkOiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IHN0YXJ0OiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IGRlc3Ryb3k6IExpZmVjeWNsZVRhc2tbXSA9IFtdXG4gICAgY29uc3QgcGxhdGZvcm1TdXNwZW5kOiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IHBsYXRmb3JtUmVzdW1lOiBMaWZlY3ljbGVUYXNrW10gPSBbXVxuICAgIGNvbnN0IHBsYXRmb3JtUmVzZXQ6IExpZmVjeWNsZVRhc2tbXSA9IFtdXG4gICAgY29uc3Qgb25FcnJvckhhbmRsZXJzOiBBcnJheTxcbiAgICAgIChcbiAgICAgICAgY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LFxuICAgICAgICBjb250ZXh0OiBFcnJvckNvbnRleHRcbiAgICAgICkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICAgID4gPSBbXVxuXG4gICAgY29uc3QgZ2V0U3RhdHVzOiBFZmZlY3QuRWZmZWN0PExpZmVjeWNsZVN0YXR1cz4gPSBSZWYuZ2V0KHN0YXR1c1JlZilcblxuICAgIGNvbnN0IHJlY29yZFBoYXNlID0gKFxuICAgICAgcGhhc2U6IFBoYXNlLFxuICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgcGF5bG9hZD86IHVua25vd24sXG4gICAgKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PlxuICAgICAgRGVidWcucmVjb3JkKHtcbiAgICAgICAgdHlwZTogXCJsaWZlY3ljbGU6cGhhc2VcIixcbiAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICBwaGFzZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgIH0pXG5cbiAgICBjb25zdCBzZXRTdGF0dXMgPSAoXG4gICAgICBzdGF0dXM6IEluc3RhbmNlU3RhdHVzLFxuICAgICAgcGF0Y2g/OiB7XG4gICAgICAgIHJlYWRvbmx5IGluaXRPdXRjb21lPzogTGlmZWN5Y2xlT3V0Y29tZSB8IHVuZGVmaW5lZFxuICAgICAgICByZWFkb25seSBpbml0UHJvZ3Jlc3M/OiBJbml0UHJvZ3Jlc3MgfCB1bmRlZmluZWRcbiAgICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICB9XG4gICAgKSA9PlxuICAgICAgUmVmLnVwZGF0ZShzdGF0dXNSZWYsIChwcmV2KSA9PiAoe1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBpZGVudGl0eToge1xuICAgICAgICAgIC4uLnByZXYuaWRlbnRpdHksXG4gICAgICAgICAgLi4uKHBhdGNoPy5ydW50aW1lTGFiZWwgPyB7IHJ1bnRpbWVMYWJlbDogcGF0Y2gucnVudGltZUxhYmVsIH0gOiBudWxsKSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICAuLi4ocGF0Y2g/LmluaXRPdXRjb21lICE9PSB1bmRlZmluZWQgPyB7IGluaXRPdXRjb21lOiBwYXRjaC5pbml0T3V0Y29tZSB9IDogbnVsbCksXG4gICAgICAgIC4uLihwYXRjaD8uaW5pdFByb2dyZXNzICE9PSB1bmRlZmluZWQgPyB7IGluaXRQcm9ncmVzczogcGF0Y2guaW5pdFByb2dyZXNzIH0gOiBudWxsKSxcbiAgICAgIH0pKVxuXG4gICAgY29uc3QgcmVnaXN0ZXJJbml0UmVxdWlyZWQgPSAoXG4gICAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH1cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gaW5pdFJlcXVpcmVkLmxlbmd0aFxuICAgICAgaW5pdFJlcXVpcmVkLnB1c2goe1xuICAgICAgICB0YXNrSWQ6IG1ha2VUYXNrSWQoXCJpbml0UmVxdWlyZWRcIiwgb3JkZXIpLFxuICAgICAgICBraW5kOiBcImluaXRSZXF1aXJlZFwiLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlclN0YXJ0ID0gKFxuICAgICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZzsgcmVhZG9ubHkgZmF0YWxPbkZhaWx1cmU/OiBib29sZWFuIH1cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gc3RhcnQubGVuZ3RoXG4gICAgICBzdGFydC5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKFwic3RhcnRcIiwgb3JkZXIpLFxuICAgICAgICBraW5kOiBcInN0YXJ0XCIsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBmYXRhbE9uRmFpbHVyZTogb3B0aW9ucz8uZmF0YWxPbkZhaWx1cmUsXG4gICAgICAgIGVmZmVjdCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJEZXN0cm95ID0gKFxuICAgICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcmRlciA9IGRlc3Ryb3kubGVuZ3RoXG4gICAgICBkZXN0cm95LnB1c2goe1xuICAgICAgICB0YXNrSWQ6IG1ha2VUYXNrSWQoXCJkZXN0cm95XCIsIG9yZGVyKSxcbiAgICAgICAga2luZDogXCJkZXN0cm95XCIsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyT25FcnJvciA9IChcbiAgICAgIGhhbmRsZXI6IChcbiAgICAgICAgY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LFxuICAgICAgICBjb250ZXh0OiBFcnJvckNvbnRleHRcbiAgICAgICkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICAgICkgPT4ge1xuICAgICAgb25FcnJvckhhbmRsZXJzLnB1c2goaGFuZGxlcilcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RlclBsYXRmb3JtU3VzcGVuZCA9IChcbiAgICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfVxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3JkZXIgPSBwbGF0Zm9ybVN1c3BlbmQubGVuZ3RoXG4gICAgICBwbGF0Zm9ybVN1c3BlbmQucHVzaCh7XG4gICAgICAgIHRhc2tJZDogbWFrZVRhc2tJZChcInBsYXRmb3JtU3VzcGVuZFwiLCBvcmRlciksXG4gICAgICAgIGtpbmQ6IFwicGxhdGZvcm1TdXNwZW5kXCIsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyUGxhdGZvcm1SZXN1bWUgPSAoXG4gICAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgICBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH1cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gcGxhdGZvcm1SZXN1bWUubGVuZ3RoXG4gICAgICBwbGF0Zm9ybVJlc3VtZS5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKFwicGxhdGZvcm1SZXN1bWVcIiwgb3JkZXIpLFxuICAgICAgICBraW5kOiBcInBsYXRmb3JtUmVzdW1lXCIsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyUGxhdGZvcm1SZXNldCA9IChcbiAgICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfVxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3JkZXIgPSBwbGF0Zm9ybVJlc2V0Lmxlbmd0aFxuICAgICAgcGxhdGZvcm1SZXNldC5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKFwicGxhdGZvcm1SZXNldFwiLCBvcmRlciksXG4gICAgICAgIGtpbmQ6IFwicGxhdGZvcm1SZXNldFwiLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZWZmZWN0LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBjb25zdCBub3RpZnlFcnJvciA9IChjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIGNvbnRleHQ6IEVycm9yQ29udGV4dCkgPT4ge1xuICAgICAgLy8gXHU0RTJEXHU2NUFEL1x1NTNENlx1NkQ4OFx1NEUwRFx1NUU5NFx1ODhBQlx1NUY1M1x1NEY1Q1x1OTUxOVx1OEJFRlx1NEUwQVx1NjJBNVx1MzAwMlxuICAgICAgaWYgKENhdXNlLmlzSW50ZXJydXB0ZWQoY2F1c2UpKSB7XG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gRGVidWcucmVjb3JkKHtcbiAgICAgICAgdHlwZTogXCJsaWZlY3ljbGU6ZXJyb3JcIixcbiAgICAgICAgbW9kdWxlSWQ6IGNvbnRleHQubW9kdWxlSWQsXG4gICAgICAgIGluc3RhbmNlSWQ6IGNvbnRleHQuaW5zdGFuY2VJZCxcbiAgICAgICAgY2F1c2UsXG4gICAgICAgIHBoYXNlOiBjb250ZXh0LnBoYXNlLFxuICAgICAgICBob29rOiBjb250ZXh0Lmhvb2ssXG4gICAgICAgIHRhc2tJZDogY29udGV4dC50YXNrSWQsXG4gICAgICAgIHR4blNlcTogY29udGV4dC50eG5TZXEsXG4gICAgICAgIG9wU2VxOiBjb250ZXh0Lm9wU2VxLFxuICAgICAgICBvcmlnaW46IGNvbnRleHQub3JpZ2luLFxuICAgICAgfSkucGlwZShcbiAgICAgICAgRWZmZWN0LnppcFJpZ2h0KFxuICAgICAgICAgIEVmZmVjdC5mb3JFYWNoKFxuICAgICAgICAgICAgb25FcnJvckhhbmRsZXJzLFxuICAgICAgICAgICAgKGhhbmRsZXIpID0+XG4gICAgICAgICAgICAgIGhhbmRsZXIoY2F1c2UsIGNvbnRleHQpLnBpcGUoXG4gICAgICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGlubmVyKSA9PlxuICAgICAgICAgICAgICAgICAgRWZmZWN0LmxvZ0Vycm9yKFxuICAgICAgICAgICAgICAgICAgICBgW2xpZmVjeWNsZS5vbkVycm9yXSBmYWlsZWQ6ICR7Q2F1c2UucHJldHR5KGlubmVyKX1gXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgeyBkaXNjYXJkOiB0cnVlIH1cbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBydW5Jbml0UmVxdWlyZWQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgdW5rbm93biwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IHRvdGFsID0gaW5pdFJlcXVpcmVkLmxlbmd0aFxuICAgICAgaWYgKHRvdGFsID09PSAwKSB7XG4gICAgICAgIHlpZWxkKiBzZXRTdGF0dXMoXCJyZWFkeVwiLCB7XG4gICAgICAgICAgaW5pdFByb2dyZXNzOiB7IHRvdGFsOiAwLCBjb21wbGV0ZWQ6IDAgfSxcbiAgICAgICAgICBpbml0T3V0Y29tZTogeyBzdGF0dXM6IFwic3VjY2Vzc1wiIH0sXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpXG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoXCJpbml0XCIsIFwiaW5pdFJlcXVpcmVkOnN0YXJ0XCIsIHsgdG90YWwgfSlcbiAgICAgIHlpZWxkKiBzZXRTdGF0dXMoXCJpbml0aWFsaXppbmdcIiwge1xuICAgICAgICBpbml0UHJvZ3Jlc3M6IHsgdG90YWwsIGNvbXBsZXRlZDogMCwgY3VycmVudDogMCwgc3RhcnRlZEF0IH0sXG4gICAgICB9KVxuXG4gICAgICBsZXQgY29tcGxldGVkID0gMFxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbml0UmVxdWlyZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgeWllbGQqIHNldFN0YXR1cyhcImluaXRpYWxpemluZ1wiLCB7XG4gICAgICAgICAgaW5pdFByb2dyZXNzOiB7IHRvdGFsLCBjb21wbGV0ZWQsIGN1cnJlbnQ6IGksIHN0YXJ0ZWRBdCB9LFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHRhc2sgPSBpbml0UmVxdWlyZWRbaV1cbiAgICAgICAgY29uc3QgZXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdCh0YXNrLmVmZmVjdClcblxuICAgICAgICBpZiAoZXhpdC5fdGFnID09PSBcIlN1Y2Nlc3NcIikge1xuICAgICAgICAgIGNvbXBsZXRlZCArPSAxXG4gICAgICAgICAgeWllbGQqIHNldFN0YXR1cyhcImluaXRpYWxpemluZ1wiLCB7XG4gICAgICAgICAgICBpbml0UHJvZ3Jlc3M6IHsgdG90YWwsIGNvbXBsZXRlZCwgY3VycmVudDogaSArIDEsIHN0YXJ0ZWRBdCB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPSB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeShleGl0LmNhdXNlKVxuICAgICAgICB5aWVsZCogbm90aWZ5RXJyb3IoZXhpdC5jYXVzZSwge1xuICAgICAgICAgIHBoYXNlOiBcImluaXRcIixcbiAgICAgICAgICBob29rOiBcImluaXRSZXF1aXJlZFwiLFxuICAgICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgIHRhc2tJZDogdGFzay50YXNrSWQsXG4gICAgICAgICAgb3JpZ2luOiBcImluaXRSZXF1aXJlZFwiLFxuICAgICAgICB9KVxuXG4gICAgICAgIHlpZWxkKiBzZXRTdGF0dXMoXCJmYWlsZWRcIiwge1xuICAgICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbCwgY29tcGxldGVkLCBjdXJyZW50OiBpLCBzdGFydGVkQXQgfSxcbiAgICAgICAgICBpbml0T3V0Y29tZTogeyBzdGF0dXM6IFwiZmFpbHVyZVwiLCBlcnJvcjogc3VtbWFyeS5lcnJvclN1bW1hcnkgfSxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5mYWlsQ2F1c2UoZXhpdC5jYXVzZSlcbiAgICAgIH1cblxuICAgICAgeWllbGQqIHJlY29yZFBoYXNlKFwiaW5pdFwiLCBcImluaXRSZXF1aXJlZDpzdWNjZXNzXCIsIHsgdG90YWwgfSlcbiAgICAgIHlpZWxkKiBzZXRTdGF0dXMoXCJyZWFkeVwiLCB7XG4gICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbCwgY29tcGxldGVkLCBjdXJyZW50OiB0b3RhbCwgc3RhcnRlZEF0IH0sXG4gICAgICAgIGluaXRPdXRjb21lOiB7IHN0YXR1czogXCJzdWNjZXNzXCIgfSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGNvbnN0IHJ1blN0YXJ0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0gcmVjb3JkUGhhc2UoXCJydW5cIiwgXCJzdGFydDpzY2hlZHVsZVwiLCB7XG4gICAgICB0b3RhbDogc3RhcnQubGVuZ3RoLFxuICAgIH0pLnBpcGUoXG4gICAgICBFZmZlY3QuemlwUmlnaHQoXG4gICAgICAgIEVmZmVjdC5mb3JFYWNoKFxuICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICh0YXNrKSA9PlxuICAgICAgICAgICAgRWZmZWN0LmZvcmtTY29wZWQoXG4gICAgICAgICAgICAgIHRhc2suZWZmZWN0LnBpcGUoXG4gICAgICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICAgICAgcGhhc2U6IFwicnVuXCIsXG4gICAgICAgICAgICAgICAgICAgIGhvb2s6IFwic3RhcnRcIixcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgICAgICBvcmlnaW46IFwic3RhcnRcIixcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLnBpcGUoRWZmZWN0LmFzVm9pZCksXG4gICAgICAgICAgeyBkaXNjYXJkOiB0cnVlLCBjb25jdXJyZW5jeTogXCJ1bmJvdW5kZWRcIiB9XG4gICAgICAgIClcbiAgICAgIClcbiAgICApXG5cbiAgICBjb25zdCBydW5EZXN0cm95OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgeWllbGQqIHJlY29yZFBoYXNlKFwiZGVzdHJveVwiLCBcImRlc3Ryb3k6c3RhcnRcIiwgeyB0b3RhbDogZGVzdHJveS5sZW5ndGggfSlcbiAgICAgIHlpZWxkKiBzZXRTdGF0dXMoXCJ0ZXJtaW5hdGluZ1wiKVxuXG4gICAgICAvLyBkZXN0cm95XHVGRjFBXHU1NDBFXHU2Q0U4XHU1MThDXHU1MTQ4XHU2MjY3XHU4ODRDXHVGRjA4TElGT1x1RkYwOVx1RkYwQ1x1NEUxNCBiZXN0LWVmZm9ydFx1RkYwOFx1NTM1NVx1NEUyQVx1NTkzMVx1OEQyNVx1NEUwRFx1OTYzQlx1NTg1RVx1NTQwRVx1N0VFRFx1RkYwOVx1MzAwMlxuICAgICAgZm9yIChsZXQgaSA9IGRlc3Ryb3kubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgdGFzayA9IGRlc3Ryb3lbaV1cbiAgICAgICAgeWllbGQqIHNhZmVSdW4oXG4gICAgICAgICAgXCJsaWZlY3ljbGUub25EZXN0cm95XCIsXG4gICAgICAgICAgdGFzay5lZmZlY3QucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICBwaGFzZTogXCJkZXN0cm95XCIsXG4gICAgICAgICAgICAgICAgaG9vazogXCJkZXN0cm95XCIsXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGlkZW50aXR5Lmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgdGFza0lkOiB0YXNrLnRhc2tJZCxcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwiZGVzdHJveVwiLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICB5aWVsZCogc2V0U3RhdHVzKFwidGVybWluYXRlZFwiKVxuICAgICAgeWllbGQqIHJlY29yZFBoYXNlKFwiZGVzdHJveVwiLCBcImRlc3Ryb3k6ZG9uZVwiLCB7IHRvdGFsOiBkZXN0cm95Lmxlbmd0aCB9KVxuICAgIH0pXG5cbiAgICBjb25zdCBydW5QbGF0Zm9ybVN1c3BlbmQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBpZiAocGxhdGZvcm1TdXNwZW5kLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZShcInBsYXRmb3JtXCIsIFwic2lnbmFsOnN1c3BlbmRcIiwgeyB0b3RhbDogcGxhdGZvcm1TdXNwZW5kLmxlbmd0aCB9KVxuICAgICAgZm9yIChjb25zdCB0YXNrIG9mIHBsYXRmb3JtU3VzcGVuZCkge1xuICAgICAgICB5aWVsZCogc2FmZVJ1bihcbiAgICAgICAgICBcImxpZmVjeWNsZS5vblN1c3BlbmRcIixcbiAgICAgICAgICB0YXNrLmVmZmVjdC5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgICBub3RpZnlFcnJvcihjYXVzZSwge1xuICAgICAgICAgICAgICAgIHBoYXNlOiBcInBsYXRmb3JtXCIsXG4gICAgICAgICAgICAgICAgaG9vazogXCJzdXNwZW5kXCIsXG4gICAgICAgICAgICAgICAgbW9kdWxlSWQ6IGlkZW50aXR5Lm1vZHVsZUlkLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGlkZW50aXR5Lmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgdGFza0lkOiB0YXNrLnRhc2tJZCxcbiAgICAgICAgICAgICAgICBvcmlnaW46IFwicGxhdGZvcm0uc3VzcGVuZFwiLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBydW5QbGF0Zm9ybVJlc3VtZTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGlmIChwbGF0Zm9ybVJlc3VtZS5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoXCJwbGF0Zm9ybVwiLCBcInNpZ25hbDpyZXN1bWVcIiwgeyB0b3RhbDogcGxhdGZvcm1SZXN1bWUubGVuZ3RoIH0pXG4gICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgcGxhdGZvcm1SZXN1bWUpIHtcbiAgICAgICAgeWllbGQqIHNhZmVSdW4oXG4gICAgICAgICAgXCJsaWZlY3ljbGUub25SZXN1bWVcIixcbiAgICAgICAgICB0YXNrLmVmZmVjdC5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgICBub3RpZnlFcnJvcihjYXVzZSwge1xuICAgICAgICAgICAgICAgIHBoYXNlOiBcInBsYXRmb3JtXCIsXG4gICAgICAgICAgICAgICAgaG9vazogXCJyZXN1bWVcIixcbiAgICAgICAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJwbGF0Zm9ybS5yZXN1bWVcIixcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgcnVuUGxhdGZvcm1SZXNldDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGlmIChwbGF0Zm9ybVJlc2V0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZShcInBsYXRmb3JtXCIsIFwic2lnbmFsOnJlc2V0XCIsIHsgdG90YWw6IHBsYXRmb3JtUmVzZXQubGVuZ3RoIH0pXG4gICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgcGxhdGZvcm1SZXNldCkge1xuICAgICAgICB5aWVsZCogc2FmZVJ1bihcbiAgICAgICAgICBcImxpZmVjeWNsZS5vblJlc2V0XCIsXG4gICAgICAgICAgdGFzay5lZmZlY3QucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICBwaGFzZTogXCJwbGF0Zm9ybVwiLFxuICAgICAgICAgICAgICAgIGhvb2s6IFwicmVzZXRcIixcbiAgICAgICAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogXCJwbGF0Zm9ybS5yZXNldFwiLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBnZXRUYXNrU25hcHNob3Q6IExpZmVjeWNsZU1hbmFnZXJbXCJnZXRUYXNrU25hcHNob3RcIl0gPSBFZmZlY3Quc3luYygoKSA9PiAoe1xuICAgICAgaW5pdFJlcXVpcmVkOiBpbml0UmVxdWlyZWQubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIHN0YXJ0OiBzdGFydC5tYXAoKHsgZWZmZWN0OiBfZWZmLCAuLi5yZXN0IH0pID0+IHJlc3QpLFxuICAgICAgZGVzdHJveTogZGVzdHJveS5tYXAoKHsgZWZmZWN0OiBfZWZmLCAuLi5yZXN0IH0pID0+IHJlc3QpLFxuICAgICAgcGxhdGZvcm1TdXNwZW5kOiBwbGF0Zm9ybVN1c3BlbmQubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIHBsYXRmb3JtUmVzdW1lOiBwbGF0Zm9ybVJlc3VtZS5tYXAoKHsgZWZmZWN0OiBfZWZmLCAuLi5yZXN0IH0pID0+IHJlc3QpLFxuICAgICAgcGxhdGZvcm1SZXNldDogcGxhdGZvcm1SZXNldC5tYXAoKHsgZWZmZWN0OiBfZWZmLCAuLi5yZXN0IH0pID0+IHJlc3QpLFxuICAgIH0pKVxuXG4gICAgY29uc3QgaGFzT25FcnJvckhhbmRsZXJzOiBMaWZlY3ljbGVNYW5hZ2VyW1wiaGFzT25FcnJvckhhbmRsZXJzXCJdID0gRWZmZWN0LnN5bmMoKCkgPT4gb25FcnJvckhhbmRsZXJzLmxlbmd0aCA+IDApXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWRlbnRpdHksXG4gICAgICBidWRnZXRzLFxuICAgICAgcmVnaXN0ZXJQbGF0Zm9ybVN1c3BlbmQsXG4gICAgICByZWdpc3RlclBsYXRmb3JtUmVzdW1lLFxuICAgICAgcmVnaXN0ZXJQbGF0Zm9ybVJlc2V0LFxuICAgICAgcmVnaXN0ZXJJbml0UmVxdWlyZWQsXG4gICAgICByZWdpc3RlclN0YXJ0LFxuICAgICAgcmVnaXN0ZXJEZXN0cm95LFxuICAgICAgcmVnaXN0ZXJPbkVycm9yLFxuICAgICAgZ2V0U3RhdHVzLFxuICAgICAgc2V0U3RhdHVzLFxuICAgICAgbm90aWZ5RXJyb3IsXG4gICAgICBydW5QbGF0Zm9ybVN1c3BlbmQsXG4gICAgICBydW5QbGF0Zm9ybVJlc3VtZSxcbiAgICAgIHJ1blBsYXRmb3JtUmVzZXQsXG4gICAgICBydW5Jbml0UmVxdWlyZWQsXG4gICAgICBydW5TdGFydCxcbiAgICAgIHJ1bkRlc3Ryb3ksXG4gICAgICBoYXNPbkVycm9ySGFuZGxlcnMsXG4gICAgICBnZXRUYXNrU25hcHNob3QsXG4gICAgfVxuICB9KVxuIiwgImltcG9ydCB7IENhdXNlLCBDb250ZXh0LCBFZmZlY3QgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCAqIGFzIERlYnVnIGZyb20gXCIuL0RlYnVnU2luay5qc1wiXG5pbXBvcnQgeyBpc0RldkVudiB9IGZyb20gXCIuL2Vudi5qc1wiXG5cbmNvbnN0IHBoYXNlRGlhZ25vc3RpY3NFbmFibGVkID0gKCk6IGJvb2xlYW4gPT4gaXNEZXZFbnYoKVxuXG4vKipcbiAqIExvZ2ljIFx1NzZGOFx1NTE3M1x1OEJDQVx1NjVBRFx1RkYxQVxuICogLSBcdTVGNTNcdTUyNERcdTgwNUFcdTcxMjZcdTRFOEUgRW52IFNlcnZpY2UgXHU3RjNBXHU1OTMxXHU1QkZDXHU4MUY0XHU3Njg0XHU1MjFEXHU1OUNCXHU1MzE2XHU1NjZBXHU5N0YzXHVGRjA4U2VydmljZSBub3QgZm91bmRcdUZGMDlcdTMwMDJcbiAqXG4gKiBcdThCQkVcdThCQTFcdTYxMEZcdTU2RkVcdUZGMUFcbiAqIC0gXHU1NzI4XHU2M0E4XHU4MzUwXHU3NTI4XHU2Q0Q1XHU0RTBCXHVGRjBDUnVudGltZSAvIFJlYWN0IFx1NUM0Mlx1NEYxQVx1NkI2M1x1Nzg2RVx1NjNEMFx1NEY5QiBFbnZcdUZGMUJcbiAqIC0gXHU0RjQ2XHU1NzI4XHU2N0QwXHU0RTlCXHU1MjFEXHU1OUNCXHU1MzE2XHU2NUY2XHU1RThGXHU0RTBCXHVGRjBDTG9naWMgXHU1M0VGXHU4MEZEXHU1NzI4IEVudiBcdTk0RkFcdTZFRTFcdTUyNERcdTVDMzFcdTVDMURcdThCRDVcdThCRkJcdTUzRDYgU2VydmljZVx1RkYxQlxuICogLSBcdThGRDlcdTdDN0JcdTk1MTlcdThCRUZcdTkwMUFcdTVFMzhcdTUzRUFcdTUxRkFcdTczQjBcdTRFMDBcdTZCMjFcdUZGMENcdTRFMERcdTY1MzlcdTUzRDhcdTY3MDBcdTdFQzhcdThCRURcdTRFNDlcdUZGMENcdTUzNzRcdTRGMUFcdTZDNjFcdTY3RDNcdTY1RTVcdTVGRDdcdTMwMDJcbiAqXG4gKiBcdTU2RTBcdTZCNjRcdThGRDlcdTkxQ0NcdTU3MjggRGVidWcgXHU0RkE3XHU1M0QxXHU1MUZBXHU0RTAwXHU2NzYxIHdhcm5pbmcgXHU3RUE3IGRpYWdub3N0aWNcdUZGMENcdTg5RTNcdTkxQ0FcdTUzRUZcdTgwRkRcdTUzOUZcdTU2RTBcdTRFMEVcdTYzOTJcdTY3RTVcdThERUZcdTVGODRcdUZGMENcbiAqIFx1NzcxRlx1NkI2M1x1NzY4NFx1OTUxOVx1OEJFRlx1OEJFRFx1NEU0OVx1NEVDRFx1NzUzMSBsaWZlY3ljbGUub25FcnJvciAvIEFwcFJ1bnRpbWUub25FcnJvciBcdTU5MDRcdTc0MDZcdTMwMDJcbiAqL1xuXG5jb25zdCBTRVJWSUNFX05PVF9GT1VORF9QUkVGSVggPSBcIlNlcnZpY2Ugbm90IGZvdW5kOlwiXG5cbi8qKlxuICogXHU4MkU1IENhdXNlIFx1NEUyRFx1NTMwNVx1NTQyQiBgU2VydmljZSBub3QgZm91bmQ6IC4uLmAgXHU5NTE5XHU4QkVGXHVGRjBDXHU1MjE5XHU1M0QxXHU1MUZBXHU0RTAwXHU2NzYxIHdhcm5pbmcgXHU3RUE3IGRpYWdub3N0aWNcdUZGMUFcbiAqIC0gY29kZTogbG9naWM6OmVudl9zZXJ2aWNlX25vdF9mb3VuZFxuICogLSBtZXNzYWdlOiBcdTUzOUZcdTU5Q0JcdTk1MTlcdThCRUYgbWVzc2FnZVx1RkYxQlxuICogLSBoaW50OiBcdThCRjRcdTY2MEVcdThGRDlcdTY2MkZcdTVERjJcdTc3RTVcdTc2ODRcdTUyMURcdTU5Q0JcdTUzMTZcdTY1RjZcdTVFOEZcdTU2NkFcdTk3RjNcdUZGMENcdTVFNzZcdTdFRDlcdTUxRkFcdTYzOTJcdTY3RTVcdTVFRkFcdThCQUVcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IGVtaXRFbnZTZXJ2aWNlTm90Rm91bmREaWFnbm9zdGljSWZOZWVkZWQgPSAoXG4gIGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPixcbiAgbW9kdWxlSWQ/OiBzdHJpbmdcbik6IEVmZmVjdC5FZmZlY3Q8dm9pZD4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGxldCBwcmV0dHk6IHN0cmluZ1xuICAgIHRyeSB7XG4gICAgICBwcmV0dHkgPSBDYXVzZS5wcmV0dHkoY2F1c2UsIHsgcmVuZGVyRXJyb3JDYXVzZTogdHJ1ZSB9KVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFwcmV0dHkuaW5jbHVkZXMoU0VSVklDRV9OT1RfRk9VTkRfUFJFRklYKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gMSkgRW52IFNlcnZpY2UgXHU3RjNBXHU1OTMxXHU2NzJDXHU4RUFCXHU3Njg0IHdhcm5pbmcgXHU4QkNBXHU2NUFEXG4gICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICB0eXBlOiBcImRpYWdub3N0aWNcIixcbiAgICAgIG1vZHVsZUlkLFxuICAgICAgY29kZTogXCJsb2dpYzo6ZW52X3NlcnZpY2Vfbm90X2ZvdW5kXCIsXG4gICAgICBzZXZlcml0eTogXCJ3YXJuaW5nXCIsXG4gICAgICBtZXNzYWdlOiBwcmV0dHksXG4gICAgICBoaW50OlxuICAgICAgICBcIkxvZ2ljIFx1NTcyOFx1NTIxRFx1NTlDQlx1NTMxNlx1OTYzNlx1NkJCNVx1NUMxRFx1OEJENVx1OEJCRlx1OTVFRVx1NUMxQVx1NjcyQVx1NjNEMFx1NEY5Qlx1NzY4NCBFbnYgU2VydmljZVx1RkYwQ1x1OTAxQVx1NUUzOFx1NjYyRiBSdW50aW1lIC8gUmVhY3QgXHU5NkM2XHU2MjEwXHU0RTJEXHU3Njg0XHU1REYyXHU3N0U1XHU1MjFEXHU1OUNCXHU1MzE2XHU1NjZBXHU5N0YzXHUzMDAyXCIgK1xuICAgICAgICBcIlx1ODJFNVx1NTNFQVx1NTcyOFx1NUU5NFx1NzUyOFx1NTQyRlx1NTJBOFx1NjVFOVx1NjcxRlx1NTFGQVx1NzNCMFx1NEUwMFx1NkIyMVx1NEUxNFx1NTQwRVx1N0VFRFx1NzJCNlx1NjAwMVx1NEUwRSBFbnYgXHU1NzQ3XHU2QjYzXHU1RTM4XHVGRjBDXHU1M0VGXHU2NjgyXHU4OUM2XHU0RTNBXHU2NUUwXHU1QkIzXHVGRjFCXCIgK1xuICAgICAgICBcIlx1ODJFNVx1NjMwMVx1N0VFRFx1NTFGQVx1NzNCMFx1NjIxNlx1NEYzNFx1OTY4Rlx1NEUxQVx1NTJBMVx1NUYwMlx1NUUzOFx1RkYwQ1x1OEJGN1x1NjhDMFx1NjdFNSBSdW50aW1lLm1ha2UgLyBSdW50aW1lUHJvdmlkZXIubGF5ZXIgXHU2NjJGXHU1NDI2XHU2QjYzXHU3ODZFXHU2M0QwXHU0RjlCXHU0RTg2XHU1QkY5XHU1RTk0IFNlcnZpY2VcdTMwMDJcIixcbiAgICB9KVxuXG4gICAgLy8gMikgXHU1NzI4XHU2N0QwXHU0RTlCXHU1NzNBXHU2NjZGXHU0RTBCXHVGRjA4XHU0RjhCXHU1OTgyIExvZ2ljIHNldHVwIFx1NkJCNVx1OEZDN1x1NjVFOVx1OEJCRlx1OTVFRSBFbnZcdUZGMDlcdUZGMENcdTYyMTFcdTRFRUNcdTRFNUZcdTVFMENcdTY3MUJcdTkwMUFcdThGQzdcbiAgICAvLyAgICBsb2dpYzo6aW52YWxpZF9waGFzZSBcdTYzRDBcdTkxOTJcdTIwMUNcdThCRjdcdTVDMDYgRW52IFx1OEJCRlx1OTVFRVx1NzlGQlx1NTJBOFx1NTIzMCBydW4gXHU2QkI1XHUyMDFEXHUzMDAyXG4gICAgLy9cbiAgICAvLyBcdTc1MzFcdTRFOEVcdTVGNTNcdTUyNERcdTVCOUVcdTczQjBcdTY1RTBcdTZDRDVcdTU3MjhcdTZCNjRcdTU5MDRcdTUzRUZcdTk3NjBcdTUyMjRcdTY1QURcdThDMDNcdTc1MjhcdTUzRDFcdTc1MUZcdTc2ODQgcGhhc2VcdUZGMENcdThGRDlcdTkxQ0NcdTUzRUFcdTY2MkZcdTYzRDBcdTRGOUJcdTRFMDBcdTRFMkFcdTg4NjVcdTUxNDVcdTYwMjdcdTc2ODRcbiAgICAvLyBcdThCQ0FcdTY1QURcdTRGRTFcdTUzRjdcdUZGMENcdTc3MUZcdTZCNjNcdTc2ODQgcGhhc2UgXHU1Qjg4XHU1MzZCXHU0RUNEXHU3NTMxIExvZ2ljUGhhc2VFcnJvciArIGVtaXRJbnZhbGlkUGhhc2VEaWFnbm9zdGljSWZOZWVkZWQgXHU2MjdGXHU2MkM1XHUzMDAyXG4gICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICB0eXBlOiBcImRpYWdub3N0aWNcIixcbiAgICAgIG1vZHVsZUlkLFxuICAgICAgY29kZTogXCJsb2dpYzo6aW52YWxpZF9waGFzZVwiLFxuICAgICAgc2V2ZXJpdHk6IFwiZXJyb3JcIixcbiAgICAgIG1lc3NhZ2U6IFwiJC51c2UgaXMgbm90IGFsbG93ZWQgYmVmb3JlIEVudiBpcyBmdWxseSByZWFkeS5cIixcbiAgICAgIGhpbnQ6XG4gICAgICAgIFwic2V0dXAgXHU2QkI1XHU2MjE2IEVudiBcdTY3MkFcdTVCOENcdTUxNjhcdTVDMzFcdTdFRUFcdTY1RjZcdThCRjdcdTkwN0ZcdTUxNERcdTc2RjRcdTYzQTVcdThCRkJcdTUzRDYgU2VydmljZVx1RkYxQlwiICtcbiAgICAgICAgXCJcdTVFRkFcdThCQUVcdTVDMDZcdTVCRjkgRW52IFx1NzY4NFx1OEJCRlx1OTVFRVx1NzlGQlx1NTJBOFx1NTIzMCBMb2dpYyBcdTc2ODQgcnVuIFx1NkJCNVx1RkYwQ1x1NjIxNlx1OTAxQVx1OEZDNyAkLmxpZmVjeWNsZS5vbkluaXRSZXF1aXJlZCBcdTUzMDVcdTg4QzVcdTUyMURcdTU5Q0JcdTUzMTZcdTZENDFcdTdBMEJcdTMwMDJcIixcbiAgICAgIGtpbmQ6IFwiZW52X3NlcnZpY2Vfbm90X3JlYWR5XCIsXG4gICAgfSlcbiAgfSlcblxuZXhwb3J0IGludGVyZmFjZSBMb2dpY1BoYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IF90YWc6IFwiTG9naWNQaGFzZUVycm9yXCJcbiAgcmVhZG9ubHkga2luZDogc3RyaW5nXG4gIHJlYWRvbmx5IGFwaT86IHN0cmluZ1xuICByZWFkb25seSBwaGFzZTogXCJzZXR1cFwiIHwgXCJydW5cIlxuICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2ljUGhhc2VTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgY3VycmVudDogXCJzZXR1cFwiIHwgXCJydW5cIlxufVxuXG5leHBvcnQgY29uc3QgTG9naWNQaGFzZVNlcnZpY2VUYWcgPSBDb250ZXh0LkdlbmVyaWNUYWc8TG9naWNQaGFzZVNlcnZpY2U+KFxuICBcIkBsb2dpeC9Mb2dpY1BoYXNlU2VydmljZVwiXG4pXG5cbi8qKlxuICogTG9naWNVbml0U2VydmljZVx1RkYxQVxuICogLSBcdTU3MjhcdTYyNjdcdTg4NENcdTZCQ0ZcdTRFMkEgbW91bnRlZCBsb2dpYyBcdTY1RjZcdTZDRThcdTUxNjVcdUZGMDhzY29wZSA9IFx1NTM1NVx1NEUyQSBsb2dpYyBcdTc2ODQgc2V0dXAvcnVuIGZpYmVyXHVGRjA5XHVGRjFCXG4gKiAtIFx1NzUyOFx1NEU4RSB0cmFpdHMgcHJvdmVuYW5jZSBcdTdCNDlcdTIwMUNcdTRFMEVcdTVGNTNcdTUyNERcdTkwM0JcdThGOTFcdTUzNTVcdTUxNDNcdTdFRDFcdTVCOUFcdTIwMURcdTc2ODRcdTRGRTFcdTYwNkZcdUZGMDhcdTVCRjlcdTlGNTAgMDIyLW1vZHVsZSBcdTc2ODQgbG9naWNVbml0SWRcdUZGMDlcdTMwMDJcbiAqXG4gKiBcdTdFQTZcdTY3NUZcdUZGMUFcbiAqIC0gXHU3RUFGXHU1M0VBXHU4QkZCXHVGRjA4XHU0RTBEXHU1Rjk3XHU1MTk5XHU1MTY1IHJ1bnRpbWUgc3RhdGVcdUZGMDlcdUZGMUJcdTRFQzVcdTRGNUNcdTRFM0EgcHJvdmVuYW5jZS9cdThCQ0FcdTY1QURcdTk1MUFcdTcwQjlcdTMwMDJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpY1VuaXRTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgbG9naWNVbml0SWQ6IHN0cmluZ1xuICByZWFkb25seSBsb2dpY1VuaXRJZEtpbmQ6IFwiZXhwbGljaXRcIiB8IFwiZGVyaXZlZFwiXG4gIHJlYWRvbmx5IGxvZ2ljVW5pdExhYmVsOiBzdHJpbmdcbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgTG9naWNVbml0U2VydmljZVRhZyBleHRlbmRzIENvbnRleHQuVGFnKFwiQGxvZ2l4L0xvZ2ljVW5pdFNlcnZpY2VcIik8XG4gIExvZ2ljVW5pdFNlcnZpY2VUYWcsXG4gIExvZ2ljVW5pdFNlcnZpY2Vcbj4oKSB7fVxuXG5leHBvcnQgY29uc3QgbWFrZUxvZ2ljUGhhc2VFcnJvciA9IChcbiAga2luZDogc3RyaW5nLFxuICBhcGk6IHN0cmluZyxcbiAgcGhhc2U6IFwic2V0dXBcIiB8IFwicnVuXCIsXG4gIG1vZHVsZUlkPzogc3RyaW5nXG4pOiBMb2dpY1BoYXNlRXJyb3IgPT5cbiAgT2JqZWN0LmFzc2lnbihcbiAgICBuZXcgRXJyb3IoXG4gICAgICBgW0xvZ2ljUGhhc2VFcnJvcl0gJHthcGl9IGlzIG5vdCBhbGxvd2VkIGluICR7cGhhc2V9IHBoYXNlIChraW5kPSR7a2luZH0pLmBcbiAgICApLFxuICAgIHtcbiAgICAgIF90YWc6IFwiTG9naWNQaGFzZUVycm9yXCIsXG4gICAgICBraW5kLFxuICAgICAgYXBpLFxuICAgICAgcGhhc2UsXG4gICAgICBtb2R1bGVJZCxcbiAgICB9XG4gICkgYXMgTG9naWNQaGFzZUVycm9yXG5cbi8qKlxuICogXHU0RUNFIENhdXNlIFx1NEUyRFx1NjNEMFx1NTNENiBMb2dpY1BoYXNlRXJyb3JcdUZGMENcdTVFNzZcdTRFRTUgZGlhZ25vc3RpYyBcdTVGNjJcdTVGMEZcdTUzRDFcdTUxRkFcdUZGMUFcbiAqIC0gY29kZTogbG9naWM6OmludmFsaWRfcGhhc2VcbiAqIC0ga2luZDogXHU1MTc3XHU0RjUzXHU4RkREXHU4OUM0XHU3QzdCXHU1NzhCXHVGRjA4XHU1OTgyIHVzZV9pbl9zZXR1cFx1RkYwOVxuICovXG5leHBvcnQgY29uc3QgZW1pdEludmFsaWRQaGFzZURpYWdub3N0aWNJZk5lZWRlZCA9IChcbiAgY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LFxuICBtb2R1bGVJZD86IHN0cmluZ1xuKTogRWZmZWN0LkVmZmVjdDx2b2lkPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgaWYgKCFwaGFzZURpYWdub3N0aWNzRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhbGxFcnJvcnMgPSBbXG4gICAgICAuLi5DYXVzZS5mYWlsdXJlcyhjYXVzZSksXG4gICAgICAuLi5DYXVzZS5kZWZlY3RzKGNhdXNlKSxcbiAgICBdXG5cbiAgICBmb3IgKGNvbnN0IGVyciBvZiBhbGxFcnJvcnMpIHtcbiAgICAgIGNvbnN0IGxvZ2ljRXJyID0gZXJyIGFzIGFueVxuICAgICAgaWYgKGxvZ2ljRXJyICYmIGxvZ2ljRXJyLl90YWcgPT09IFwiTG9naWNQaGFzZUVycm9yXCIpIHtcbiAgICAgICAgY29uc3QgcGhhc2VFcnIgPSBsb2dpY0VyciBhcyBMb2dpY1BoYXNlRXJyb3JcbiAgICAgICAgY29uc3QgaGludCA9XG4gICAgICAgICAgcGhhc2VFcnIua2luZCA9PT0gXCJ1c2VfaW5fc2V0dXBcIiB8fFxuICAgICAgICAgIHBoYXNlRXJyLmtpbmQgPT09IFwibGlmZWN5Y2xlX2luX3NldHVwXCJcbiAgICAgICAgICAgID8gXCJzZXR1cCBcdTZCQjVcdTc5ODFcdTZCNjJcdThCRkJcdTUzRDYgRW52L1NlcnZpY2UgXHU2MjE2XHU2MjY3XHU4ODRDXHU5NTdGXHU3NTFGXHU1NDdEXHU1NDY4XHU2NzFGXHU5MDNCXHU4RjkxXHVGRjBDXHU4QkY3XHU1QzA2XHU3NkY4XHU1MTczXHU4QzAzXHU3NTI4XHU3OUZCXHU1MkE4XHU1MjMwIHJ1biBcdTZCQjVcdTMwMDJcIlxuICAgICAgICAgICAgOiBwaGFzZUVyci5raW5kID09PSBcImxpZmVjeWNsZV9pbl9ydW5cIlxuICAgICAgICAgICAgICA/IFwicnVuIFx1NkJCNVx1Nzk4MVx1NkI2Mlx1NkNFOFx1NTE4QyAkLmxpZmVjeWNsZS4qXHVGRjA4c2V0dXAtb25seVx1RkYwOVx1MzAwMlx1OEJGN1x1NUMwNlx1NzUxRlx1NTQ3RFx1NTQ2OFx1NjcxRlx1NkNFOFx1NTE4Q1x1NzlGQlx1NTJBOFx1NTIzMCBNb2R1bGUubG9naWMgYnVpbGRlciBcdTc2ODRcdTU0MENcdTZCNjVcdTkwRThcdTUyMDZcdUZGMDhyZXR1cm4gXHU0RTRCXHU1MjREXHVGRjA5XHUzMDAyXCJcbiAgICAgICAgICAgIDogcGhhc2VFcnIua2luZCA9PT0gXCJ0cmFpdHNfaW5fcnVuXCIgfHwgcGhhc2VFcnIua2luZCA9PT0gXCJ0cmFpdHNfZGVjbGFyZV9pbl9ydW5cIlxuICAgICAgICAgICAgICA/IFwic2V0dXAgXHU3RUQzXHU2NzVGXHU1NDBFIHRyYWl0cyBcdTVERjJcdTUxQkJcdTdFRDNcdUZGMUJcdThCRjdcdTVDMDYgJC50cmFpdHMuZGVjbGFyZSBcdTc5RkJcdTUyQThcdTUyMzAgTG9naWNQbGFuLnNldHVwIFx1NjIxNiBNb2R1bGUubG9naWMgYnVpbGRlciBcdTc2ODQgc2V0dXAgXHU2Q0U4XHU1MThDXHU5NjM2XHU2QkI1XHUzMDAyXCJcbiAgICAgICAgICAgIDogXCJcdThDMDNcdTY1NzRcdTkwM0JcdThGOTFcdTUyMzAgcnVuIFx1NkJCNVx1RkYwQ3NldHVwIFx1NEVDNVx1NTA1QVx1NkNFOFx1NTE4Q1x1N0M3Qlx1NjRDRFx1NEY1Q1x1MzAwMlwiXG5cbiAgICAgICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICAgICAgdHlwZTogXCJkaWFnbm9zdGljXCIsXG4gICAgICAgICAgbW9kdWxlSWQ6IHBoYXNlRXJyLm1vZHVsZUlkID8/IG1vZHVsZUlkLFxuICAgICAgICAgIGNvZGU6IFwibG9naWM6OmludmFsaWRfcGhhc2VcIixcbiAgICAgICAgICBzZXZlcml0eTogXCJlcnJvclwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGAke3BoYXNlRXJyLmFwaSA/PyBwaGFzZUVyci5raW5kfSBpcyBub3QgYWxsb3dlZCBpbiAke3BoYXNlRXJyLnBoYXNlfSBwaGFzZS5gLFxuICAgICAgICAgIGhpbnQsXG4gICAgICAgICAga2luZDogcGhhc2VFcnIua2luZCxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBcdTU0N0RcdTRFMkRcdTk5OTZcdTRFMkEgTG9naWNQaGFzZUVycm9yIFx1NTM3M1x1NTNFRlx1OEZENFx1NTZERVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gIH0pXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7OztBQUFBLFNBQVMsT0FBTyxTQUFTLFFBQVEsV0FBVztBQTJLckMsSUFBTSxtQkFBbUIsUUFBUTtBQUFBLEVBQ3RDO0FBQ0Y7QUFFQSxJQUFNLFVBQVUsQ0FBQyxPQUFlLFFBQzlCLElBQUk7QUFBQSxFQUNGLE9BQU8saUJBQWlCO0FBQUEsSUFDdEIsV0FBVyxNQUFNLE9BQU87QUFBQSxJQUN4QixXQUFXLENBQUMsVUFDVixPQUFPLFNBQVMsSUFBSSxLQUFLLGFBQWEsTUFBTSxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQUEsRUFDL0QsQ0FBQztBQUNIO0FBRUYsSUFBTSxhQUFhLENBQUMsTUFBZ0IsVUFBMEIsR0FBRyxJQUFJLElBQUksS0FBSztBQUV2RSxJQUFNLHVCQUF1QixDQUNsQyxhQUVBLE9BQU8sSUFBSSxhQUFhO0FBQ3RCLFFBQU0sVUFBbUI7QUFBQSxJQUN2QixzQkFBc0I7QUFBQSxJQUN0QixlQUFlLElBQUk7QUFBQSxFQUNyQjtBQUVBLFFBQU0sWUFBWSxPQUFPLElBQUksS0FBc0I7QUFBQSxJQUNqRDtBQUFBLElBQ0EsUUFBUTtBQUFBLEVBQ1YsQ0FBQztBQUVELFFBQU0sZUFBZ0MsQ0FBQztBQUN2QyxRQUFNLFFBQXlCLENBQUM7QUFDaEMsUUFBTSxVQUEyQixDQUFDO0FBQ2xDLFFBQU0sa0JBQW1DLENBQUM7QUFDMUMsUUFBTSxpQkFBa0MsQ0FBQztBQUN6QyxRQUFNLGdCQUFpQyxDQUFDO0FBQ3hDLFFBQU0sa0JBS0YsQ0FBQztBQUVMLFFBQU0sWUFBNEMsSUFBSSxJQUFJLFNBQVM7QUFFbkUsUUFBTSxjQUFjLENBQ2xCLE9BQ0EsTUFDQSxZQUVNLE9BQU87QUFBQSxJQUNY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QUF3QixHQUFHO0FBQzlCO0FBQUEsRUFDRjtBQUVBLFFBQU0sWUFBWTtBQUFBLElBQ2hCLEdBQUdDLE9BQU0sU0FBUyxLQUFLO0FBQUEsSUFDdkIsR0FBR0EsT0FBTSxRQUFRLEtBQUs7QUFBQSxFQUN4QjtBQUVBLGFBQVcsT0FBTyxXQUFXO0FBQzNCLFVBQU0sV0FBVztBQUNqQixRQUFJLFlBQVksU0FBUyxTQUFTLG1CQUFtQjtBQUNuRCxZQUFNLFdBQVc7QUFDakIsWUFBTSxPQUNKLFNBQVMsU0FBUyxrQkFDbEIsU0FBUyxTQUFTLHVCQUNkLCtMQUNBLFNBQVMsU0FBUyxxQkFDaEIsNE9BQ0YsU0FBUyxTQUFTLG1CQUFtQixTQUFTLFNBQVMsMEJBQ3JELHFNQUNGO0FBRU4sYUFBYSxPQUFPO0FBQUEsUUFDbEIsTUFBTTtBQUFBLFFBQ04sVUFBVSxTQUFTLFlBQVk7QUFBQSxRQUMvQixNQUFNO0FBQUEsUUFDTixVQUFVO0FBQUEsUUFDVixTQUFTLEdBQUcsU0FBUyxPQUFPLFNBQVMsSUFBSSxzQkFBc0IsU0FBUyxLQUFLO0FBQUEsUUFDN0U7QUFBQSxRQUNBLE1BQU0sU0FBUztBQUFBLE1BQ2pCLENBQUM7QUFHRDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFsiQ2F1c2UiLCAiQ29udGV4dCIsICJFZmZlY3QiLCAiRWZmZWN0IiwgIkNhdXNlIiwgIkNvbnRleHQiXQp9Cg==
@@ -0,0 +1,11 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+
4
+ // ../logix-core/src/internal/runtime/core/Platform.ts
5
+ import { Context } from "../effect.js";
6
+ var Tag = Context.GenericTag("@logix/Platform");
7
+
8
+ export {
9
+ Tag
10
+ };
11
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL1BsYXRmb3JtLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDb250ZXh0LCBFZmZlY3QgfSBmcm9tICdlZmZlY3QnXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZSB7XG4gIHJlYWRvbmx5IGxpZmVjeWNsZToge1xuICAgIHJlYWRvbmx5IG9uU3VzcGVuZDogKGVmZjogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PikgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICAgIHJlYWRvbmx5IG9uUmVzdW1lOiAoZWZmOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gICAgcmVhZG9ubHkgb25SZXNldD86IChlZmY6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgfVxuXG4gIC8qKlxuICAgKiBcdTVFNzNcdTUzRjBcdTRGRTFcdTUzRjdcdTVFN0ZcdTY0QURcdTUxNjVcdTUzRTNcdUZGMDhcdTc1MjhcdTRFOEVcdTVCQkZcdTRFM0JcdTk2QzZcdTYyMTBcdTRFMEVcdTZENEJcdThCRDVcdUZGMDlcdUZGMUFcdTg5RTZcdTUzRDFcdTVERjJcdTZDRThcdTUxOENcdTc2ODQgbGlmZWN5Y2xlIGhhbmRsZXJzXHUzMDAyXG4gICAqXG4gICAqIFx1OEJGNFx1NjYwRVx1RkYxQVxuICAgKiAtIFx1OUVEOFx1OEJBNFx1NUI5RVx1NzNCMFx1NUU5NFx1NEUzQVx1NUI4OVx1NTE2OCBuby1vcFx1RkYxQlxuICAgKiAtIFx1NTkzMVx1OEQyNVx1N0I1Nlx1NzU2NVx1NzUzMVx1NUU3M1x1NTNGMFx1NUI5RVx1NzNCMFx1NTFCM1x1NUI5QVx1RkYxQlx1OEZEMFx1ODg0Q1x1NjVGNlx1NEZBN1x1NUU5NFx1NEZERFx1OEJDMVx1MjAxQ1x1OUVEOFx1OEJBNFx1NEUwRFx1N0VDOFx1NkI2Mlx1NUI5RVx1NEY4Qlx1MjAxRFx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgZW1pdFN1c3BlbmQ6ICgpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgcmVhZG9ubHkgZW1pdFJlc3VtZTogKCkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICByZWFkb25seSBlbWl0UmVzZXQ6ICgpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbn1cblxuZXhwb3J0IGNvbnN0IFRhZyA9IENvbnRleHQuR2VuZXJpY1RhZzxTZXJ2aWNlPignQGxvZ2l4L1BsYXRmb3JtJylcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7QUFBQSxTQUFTLGVBQXVCO0FBcUJ6QixJQUFNLE1BQU0sUUFBUSxXQUFvQixpQkFBaUI7IiwKICAibmFtZXMiOiBbXQp9Cg==