@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
@@ -1,408 +0,0 @@
1
- // @logixjs/core subpath bundles for @logixjs/sandbox
2
-
3
- import {
4
- ProcessRuntimeTag,
5
- layer
6
- } from "./chunk-4LRLOTMA.js";
7
- import {
8
- make
9
- } from "./chunk-JIXTOQXJ.js";
10
- import {
11
- RootContextTag
12
- } from "./chunk-RJQ4PG2F.js";
13
- import {
14
- ConcurrencyPolicyTag,
15
- ReadQueryStrictGateConfigTag,
16
- StateTransactionConfigTag
17
- } from "./chunk-CZRI7MHA.js";
18
-
19
- // ../logix-core/src/internal/runtime/core/runner/ProgramRunner.errors.ts
20
- var summarizeCause = (cause) => {
21
- if (cause instanceof Error) {
22
- return { name: cause.name, message: cause.message };
23
- }
24
- return { message: typeof cause === "string" ? cause : void 0 };
25
- };
26
- var ProgramRunnerErrorBase = class extends Error {
27
- constructor(params) {
28
- super(params.message);
29
- this.moduleId = params.identity.moduleId;
30
- this.instanceId = params.identity.instanceId;
31
- this.entrypoint = params.entrypoint;
32
- this.hint = params.hint;
33
- }
34
- toJSON() {
35
- return {
36
- _tag: this._tag,
37
- name: this.name,
38
- message: this.message,
39
- moduleId: this.moduleId,
40
- instanceId: this.instanceId,
41
- entrypoint: this.entrypoint,
42
- hint: this.hint
43
- };
44
- }
45
- };
46
- var BootError = class extends ProgramRunnerErrorBase {
47
- constructor(identity, cause) {
48
- super({
49
- message: "[Logix] Program boot failed",
50
- identity,
51
- entrypoint: "boot",
52
- hint: "Check that options.layer / imports / providers are complete, and that no dependencies are missing during assembly."
53
- });
54
- this._tag = "BootError";
55
- this.name = "BootError";
56
- this.cause = summarizeCause(cause);
57
- }
58
- toJSON() {
59
- return { ...super.toJSON(), cause: this.cause };
60
- }
61
- };
62
- var MainError = class extends ProgramRunnerErrorBase {
63
- constructor(identity, cause) {
64
- super({
65
- message: "[Logix] Program main failed",
66
- identity,
67
- entrypoint: "main",
68
- hint: "Main failed: ensure main handles domain errors explicitly, and check for interruption or missing dependencies."
69
- });
70
- this._tag = "MainError";
71
- this.name = "MainError";
72
- this.cause = summarizeCause(cause);
73
- }
74
- toJSON() {
75
- return { ...super.toJSON(), cause: this.cause };
76
- }
77
- };
78
- var DisposeError = class extends ProgramRunnerErrorBase {
79
- constructor(identity, cause) {
80
- super({
81
- message: "[Logix] Program dispose failed",
82
- identity,
83
- entrypoint: "dispose",
84
- hint: "Dispose failed: a finalizer may have thrown, or scope/resource handles may be invalid; check onError/logs."
85
- });
86
- this._tag = "DisposeError";
87
- this.name = "DisposeError";
88
- this.cause = summarizeCause(cause);
89
- }
90
- toJSON() {
91
- return { ...super.toJSON(), cause: this.cause };
92
- }
93
- };
94
- var DisposeTimeoutError = class extends ProgramRunnerErrorBase {
95
- constructor(identity, params) {
96
- super({
97
- message: "[Logix] Program dispose timed out",
98
- identity,
99
- entrypoint: "dispose",
100
- hint: "Dispose timed out: if the program cannot exit naturally, resources may not be released or background fibers are still running."
101
- });
102
- this._tag = "DisposeTimeout";
103
- this.name = "DisposeTimeoutError";
104
- this.timeoutMs = params.timeoutMs;
105
- this.elapsedMs = params.elapsedMs;
106
- this.suggestions = [
107
- "Check for event listeners that were not unregistered (e.g. process.on / emitter.on).",
108
- "Check for fibers that were not joined/interrupt (long-lived watchers / Stream.run*).",
109
- "Check for resource handles that were not closed (timer / socket / file handle)."
110
- ];
111
- }
112
- toJSON() {
113
- return {
114
- ...super.toJSON(),
115
- timeoutMs: this.timeoutMs,
116
- elapsedMs: this.elapsedMs,
117
- suggestions: this.suggestions
118
- };
119
- }
120
- };
121
-
122
- // ../logix-core/src/internal/runtime/AppRuntime.ts
123
- import { Context, Deferred, Effect, Layer, ManagedRuntime } from "../effect.js";
124
- var getTagKey = (tag) => {
125
- const anyTag = tag;
126
- if (typeof anyTag.key === "string") {
127
- return anyTag.key;
128
- }
129
- if (typeof anyTag._id === "string") {
130
- return anyTag._id;
131
- }
132
- if (typeof anyTag.toString === "function") {
133
- return anyTag.toString();
134
- }
135
- return "[unknown-tag]";
136
- };
137
- var buildTagIndex = (entries) => {
138
- const index = /* @__PURE__ */ new Map();
139
- for (const entry of entries) {
140
- const ownerId = String(entry.module.id);
141
- const moduleTag = entry.module;
142
- const moduleKey = getTagKey(moduleTag);
143
- const moduleInfo = {
144
- key: moduleKey,
145
- tag: moduleTag,
146
- ownerModuleId: ownerId,
147
- source: "module"
148
- };
149
- const existingModuleInfos = index.get(moduleKey);
150
- if (existingModuleInfos) {
151
- existingModuleInfos.push(moduleInfo);
152
- } else {
153
- index.set(moduleKey, [moduleInfo]);
154
- }
155
- if (entry.serviceTags && entry.serviceTags.length > 0) {
156
- for (const tag of entry.serviceTags) {
157
- const key = getTagKey(tag);
158
- const info = {
159
- key,
160
- tag,
161
- ownerModuleId: ownerId,
162
- source: "service"
163
- };
164
- const existingInfos = index.get(key);
165
- if (existingInfos) {
166
- existingInfos.push(info);
167
- } else {
168
- index.set(key, [info]);
169
- }
170
- }
171
- }
172
- }
173
- return index;
174
- };
175
- var validateTags = (entries) => {
176
- const index = buildTagIndex(entries);
177
- const collisions = [];
178
- for (const [key, infos] of index) {
179
- if (infos.length <= 1) {
180
- continue;
181
- }
182
- const owners = /* @__PURE__ */ new Set();
183
- for (const info of infos) {
184
- owners.add(info.ownerModuleId);
185
- }
186
- if (owners.size > 1) {
187
- collisions.push({ key, conflicts: infos });
188
- }
189
- }
190
- if (collisions.length === 0) {
191
- return;
192
- }
193
- const message = "[Logix] Tag collision detected:\n" + collisions.map((c) => {
194
- const header = `- key: ${c.key}`;
195
- const lines = c.conflicts.map((i) => ` - owner: ${i.ownerModuleId}, source: ${i.source}`);
196
- return [header, ...lines].join("\n");
197
- }).join("\n");
198
- const error = Object.assign(new Error(message), {
199
- _tag: "TagCollisionError",
200
- collisions
201
- });
202
- throw error;
203
- };
204
- var makeApp = (config) => {
205
- const seenIds = /* @__PURE__ */ new Set();
206
- for (const entry of config.modules) {
207
- const id = String(entry.module.id);
208
- if (seenIds.has(id)) {
209
- throw new Error(
210
- `[Logix] Duplicate Module ID/Tag detected: "${id}".
211
- Ensure all modules in the application Runtime have unique IDs.`
212
- );
213
- }
214
- seenIds.add(id);
215
- }
216
- validateTags(config.modules);
217
- const stateTxnLayer = config.stateTransaction ? Layer.succeed(StateTransactionConfigTag, config.stateTransaction) : Layer.empty;
218
- const concurrencyPolicyLayer = config.concurrencyPolicy ? Layer.succeed(ConcurrencyPolicyTag, config.concurrencyPolicy) : Layer.empty;
219
- const readQueryStrictGateLayer = config.readQueryStrictGate ? Layer.succeed(ReadQueryStrictGateConfigTag, config.readQueryStrictGate) : Layer.empty;
220
- const appModuleIds = config.modules.map((entry) => String(entry.module.id));
221
- const appId = appModuleIds.length === 1 ? appModuleIds[0] : appModuleIds.slice().sort().join("~");
222
- const baseLayer = Layer.mergeAll(
223
- config.layer,
224
- stateTxnLayer,
225
- concurrencyPolicyLayer,
226
- readQueryStrictGateLayer,
227
- layer(),
228
- Layer.effect(
229
- RootContextTag,
230
- Effect.gen(function* () {
231
- const ready = yield* Deferred.make();
232
- return { context: void 0, ready, appId, appModuleIds };
233
- })
234
- )
235
- );
236
- const moduleLayers = config.modules.map(
237
- (entry) => (
238
- // Ensure each module layer can see the app Env (baseLayer) to avoid missing root env during initialization.
239
- Layer.provide(entry.layer, baseLayer)
240
- )
241
- );
242
- const envLayer = moduleLayers.length > 0 ? Layer.mergeAll(baseLayer, ...moduleLayers) : baseLayer;
243
- const finalLayer = Layer.unwrapScoped(
244
- Effect.gen(function* () {
245
- const scope = yield* Effect.scope;
246
- const [patch, env] = yield* Effect.diffFiberRefs(Layer.buildWithScope(envLayer, scope));
247
- const rootContext = Context.get(env, RootContextTag);
248
- rootContext.context = env;
249
- yield* Deferred.succeed(rootContext.ready, env);
250
- const processRuntime = Context.get(
251
- env,
252
- ProcessRuntimeTag
253
- );
254
- yield* Effect.forEach(
255
- config.processes,
256
- (process) => Effect.gen(function* () {
257
- const installation = yield* Effect.provide(
258
- processRuntime.install(process, {
259
- scope: { type: "app", appId },
260
- enabled: true,
261
- installedAt: "appRuntime"
262
- }),
263
- env
264
- );
265
- if (installation === void 0) {
266
- yield* Effect.forkScoped(
267
- Effect.provide(config.onError ? Effect.catchAllCause(process, config.onError) : process, env)
268
- );
269
- }
270
- }),
271
- { discard: true }
272
- );
273
- const fiberRefsLayer = Layer.scopedDiscard(Effect.patchFiberRefs(patch));
274
- return Layer.mergeAll(Layer.succeedContext(env), fiberRefsLayer);
275
- })
276
- );
277
- return {
278
- definition: config,
279
- layer: finalLayer,
280
- makeRuntime: () => ManagedRuntime.make(finalLayer)
281
- };
282
- };
283
- var provide = (module, resource) => {
284
- const layer2 = isLayer(resource) ? resource : Layer.succeed(module, resource);
285
- return { module, layer: layer2 };
286
- };
287
- var isLayer = (value) => typeof value === "object" && value !== null && Layer.LayerTypeId in value;
288
-
289
- // ../logix-core/src/internal/runtime/core/runner/ProgramRunner.closeScope.ts
290
- import { Cause, Effect as Effect2, Exit, Fiber, Option, Scope } from "../effect.js";
291
- var closeProgramScope = (params) => {
292
- return Effect2.gen(function* () {
293
- const start = Date.now();
294
- const fiber = yield* Effect2.forkDaemon(Scope.close(params.scope, Exit.void));
295
- while (true) {
296
- const exitOpt = yield* Fiber.poll(fiber);
297
- if (Option.isSome(exitOpt)) {
298
- const exit = exitOpt.value;
299
- if (exit._tag === "Success") {
300
- return;
301
- }
302
- return yield* Effect2.die(new DisposeError(params.identity, exit.cause));
303
- }
304
- const elapsedMs = Date.now() - start;
305
- if (elapsedMs >= params.timeoutMs) {
306
- const error = new DisposeTimeoutError(params.identity, {
307
- timeoutMs: params.timeoutMs,
308
- elapsedMs
309
- });
310
- if (typeof params.onError === "function") {
311
- yield* params.onError(Cause.die(error)).pipe(Effect2.catchAllCause(() => Effect2.void));
312
- }
313
- yield* Fiber.interruptFork(fiber);
314
- return yield* Effect2.die(error);
315
- }
316
- yield* Effect2.promise(() => new Promise((r) => queueMicrotask(r)));
317
- }
318
- });
319
- };
320
-
321
- // ../logix-core/src/internal/runtime/core/runner/ProgramRunner.signals.ts
322
- import { Effect as Effect3, Exit as Exit2, Scope as Scope2 } from "../effect.js";
323
- var getProcess = () => globalThis.process;
324
- var isNodeProcess = (value) => typeof value === "object" && value !== null && typeof value.on === "function";
325
- var removeListener = (proc, event, handler) => {
326
- if (typeof proc.off === "function") {
327
- proc.off(event, handler);
328
- return;
329
- }
330
- if (typeof proc.removeListener === "function") {
331
- proc.removeListener(event, handler);
332
- }
333
- };
334
- var installGracefulShutdownHandlers = (params) => {
335
- if (!params.enabled) {
336
- return Effect3.void;
337
- }
338
- const proc = getProcess();
339
- if (!isNodeProcess(proc)) {
340
- return Effect3.void;
341
- }
342
- const handler = () => {
343
- void Effect3.runPromise(Scope2.close(params.scope, Exit2.void));
344
- };
345
- return Effect3.gen(function* () {
346
- yield* Scope2.addFinalizer(
347
- params.scope,
348
- Effect3.sync(() => {
349
- removeListener(proc, "SIGINT", handler);
350
- removeListener(proc, "SIGTERM", handler);
351
- })
352
- );
353
- yield* Effect3.sync(() => {
354
- proc.on("SIGINT", handler);
355
- proc.on("SIGTERM", handler);
356
- });
357
- });
358
- };
359
-
360
- // ../logix-core/src/internal/runtime/core/runner/ProgramRunner.kernel.ts
361
- import { Effect as Effect4, Scope as Scope3 } from "../effect.js";
362
- var makeProgramRunnerKernel = (makeRuntime, rootImpl, options) => Effect4.gen(function* () {
363
- const identity = {
364
- moduleId: String(rootImpl.module.id),
365
- instanceId: "unknown"
366
- };
367
- const scope = yield* Scope3.make();
368
- const runtime = makeRuntime(rootImpl, options);
369
- yield* Scope3.addFinalizer(scope, Effect4.promise(() => runtime.dispose()).pipe(Effect4.asVoid));
370
- const setInstanceId = (value) => {
371
- identity.instanceId = typeof value === "string" && value.length > 0 ? value : String(value ?? "unknown");
372
- };
373
- const close = (params) => closeProgramScope({
374
- scope,
375
- timeoutMs: params.timeoutMs,
376
- identity,
377
- onError: params.onError
378
- });
379
- const installSignals = (enabled) => installGracefulShutdownHandlers({ scope, enabled });
380
- const toContext = (moduleRuntime) => ({
381
- scope,
382
- runtime,
383
- module: moduleRuntime,
384
- $: make(rootImpl.module.shape, moduleRuntime)
385
- });
386
- return {
387
- scope,
388
- runtime,
389
- identity,
390
- installSignals,
391
- close,
392
- setInstanceId,
393
- toContext
394
- };
395
- });
396
-
397
- export {
398
- BootError,
399
- MainError,
400
- DisposeError,
401
- DisposeTimeoutError,
402
- closeProgramScope,
403
- installGracefulShutdownHandlers,
404
- makeProgramRunnerKernel,
405
- makeApp,
406
- provide
407
- };
408
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL3J1bm5lci9Qcm9ncmFtUnVubmVyLmVycm9ycy50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL0FwcFJ1bnRpbWUudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL3J1bm5lci9Qcm9ncmFtUnVubmVyLmNsb3NlU2NvcGUudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL3J1bm5lci9Qcm9ncmFtUnVubmVyLnNpZ25hbHMudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL3J1bm5lci9Qcm9ncmFtUnVubmVyLmtlcm5lbC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHR5cGUgUHJvZ3JhbVJ1bm5lckVycm9yVGFnID0gJ0Jvb3RFcnJvcicgfCAnTWFpbkVycm9yJyB8ICdEaXNwb3NlRXJyb3InIHwgJ0Rpc3Bvc2VUaW1lb3V0J1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyYW1JZGVudGl0eSB7XG4gIG1vZHVsZUlkOiBzdHJpbmdcbiAgaW5zdGFuY2VJZDogc3RyaW5nXG59XG5cbmNvbnN0IHN1bW1hcml6ZUNhdXNlID0gKGNhdXNlOiB1bmtub3duKTogeyBuYW1lPzogc3RyaW5nOyBtZXNzYWdlPzogc3RyaW5nIH0gPT4ge1xuICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiB7IG5hbWU6IGNhdXNlLm5hbWUsIG1lc3NhZ2U6IGNhdXNlLm1lc3NhZ2UgfVxuICB9XG4gIHJldHVybiB7IG1lc3NhZ2U6IHR5cGVvZiBjYXVzZSA9PT0gJ3N0cmluZycgPyBjYXVzZSA6IHVuZGVmaW5lZCB9XG59XG5cbmFic3RyYWN0IGNsYXNzIFByb2dyYW1SdW5uZXJFcnJvckJhc2UgZXh0ZW5kcyBFcnJvciB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IF90YWc6IFByb2dyYW1SdW5uZXJFcnJvclRhZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSBlbnRyeXBvaW50OiAnYm9vdCcgfCAnbWFpbicgfCAnZGlzcG9zZSdcbiAgcmVhZG9ubHkgaGludD86IHN0cmluZ1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwYXJhbXM6IHtcbiAgICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmdcbiAgICByZWFkb25seSBpZGVudGl0eTogUHJvZ3JhbUlkZW50aXR5XG4gICAgcmVhZG9ubHkgZW50cnlwb2ludDogJ2Jvb3QnIHwgJ21haW4nIHwgJ2Rpc3Bvc2UnXG4gICAgcmVhZG9ubHkgaGludD86IHN0cmluZ1xuICB9KSB7XG4gICAgc3VwZXIocGFyYW1zLm1lc3NhZ2UpXG4gICAgdGhpcy5tb2R1bGVJZCA9IHBhcmFtcy5pZGVudGl0eS5tb2R1bGVJZFxuICAgIHRoaXMuaW5zdGFuY2VJZCA9IHBhcmFtcy5pZGVudGl0eS5pbnN0YW5jZUlkXG4gICAgdGhpcy5lbnRyeXBvaW50ID0gcGFyYW1zLmVudHJ5cG9pbnRcbiAgICB0aGlzLmhpbnQgPSBwYXJhbXMuaGludFxuICB9XG5cbiAgdG9KU09OKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgX3RhZzogdGhpcy5fdGFnLFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAgbW9kdWxlSWQ6IHRoaXMubW9kdWxlSWQsXG4gICAgICBpbnN0YW5jZUlkOiB0aGlzLmluc3RhbmNlSWQsXG4gICAgICBlbnRyeXBvaW50OiB0aGlzLmVudHJ5cG9pbnQsXG4gICAgICBoaW50OiB0aGlzLmhpbnQsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCb290RXJyb3IgZXh0ZW5kcyBQcm9ncmFtUnVubmVyRXJyb3JCYXNlIHtcbiAgcmVhZG9ubHkgX3RhZyA9ICdCb290RXJyb3InIGFzIGNvbnN0XG4gIHJlYWRvbmx5IGNhdXNlPzogeyBuYW1lPzogc3RyaW5nOyBtZXNzYWdlPzogc3RyaW5nIH1cblxuICBjb25zdHJ1Y3RvcihpZGVudGl0eTogUHJvZ3JhbUlkZW50aXR5LCBjYXVzZTogdW5rbm93bikge1xuICAgIHN1cGVyKHtcbiAgICAgIG1lc3NhZ2U6ICdbTG9naXhdIFByb2dyYW0gYm9vdCBmYWlsZWQnLFxuICAgICAgaWRlbnRpdHksXG4gICAgICBlbnRyeXBvaW50OiAnYm9vdCcsXG4gICAgICBoaW50OiAnQ2hlY2sgdGhhdCBvcHRpb25zLmxheWVyIC8gaW1wb3J0cyAvIHByb3ZpZGVycyBhcmUgY29tcGxldGUsIGFuZCB0aGF0IG5vIGRlcGVuZGVuY2llcyBhcmUgbWlzc2luZyBkdXJpbmcgYXNzZW1ibHkuJyxcbiAgICB9KVxuICAgIHRoaXMubmFtZSA9ICdCb290RXJyb3InXG4gICAgdGhpcy5jYXVzZSA9IHN1bW1hcml6ZUNhdXNlKGNhdXNlKVxuICB9XG5cbiAgb3ZlcnJpZGUgdG9KU09OKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4geyAuLi5zdXBlci50b0pTT04oKSwgY2F1c2U6IHRoaXMuY2F1c2UgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYWluRXJyb3IgZXh0ZW5kcyBQcm9ncmFtUnVubmVyRXJyb3JCYXNlIHtcbiAgcmVhZG9ubHkgX3RhZyA9ICdNYWluRXJyb3InIGFzIGNvbnN0XG4gIHJlYWRvbmx5IGNhdXNlPzogeyBuYW1lPzogc3RyaW5nOyBtZXNzYWdlPzogc3RyaW5nIH1cblxuICBjb25zdHJ1Y3RvcihpZGVudGl0eTogUHJvZ3JhbUlkZW50aXR5LCBjYXVzZTogdW5rbm93bikge1xuICAgIHN1cGVyKHtcbiAgICAgIG1lc3NhZ2U6ICdbTG9naXhdIFByb2dyYW0gbWFpbiBmYWlsZWQnLFxuICAgICAgaWRlbnRpdHksXG4gICAgICBlbnRyeXBvaW50OiAnbWFpbicsXG4gICAgICBoaW50OiAnTWFpbiBmYWlsZWQ6IGVuc3VyZSBtYWluIGhhbmRsZXMgZG9tYWluIGVycm9ycyBleHBsaWNpdGx5LCBhbmQgY2hlY2sgZm9yIGludGVycnVwdGlvbiBvciBtaXNzaW5nIGRlcGVuZGVuY2llcy4nLFxuICAgIH0pXG4gICAgdGhpcy5uYW1lID0gJ01haW5FcnJvcidcbiAgICB0aGlzLmNhdXNlID0gc3VtbWFyaXplQ2F1c2UoY2F1c2UpXG4gIH1cblxuICBvdmVycmlkZSB0b0pTT04oKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7IC4uLnN1cGVyLnRvSlNPTigpLCBjYXVzZTogdGhpcy5jYXVzZSB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpc3Bvc2VFcnJvciBleHRlbmRzIFByb2dyYW1SdW5uZXJFcnJvckJhc2Uge1xuICByZWFkb25seSBfdGFnID0gJ0Rpc3Bvc2VFcnJvcicgYXMgY29uc3RcbiAgcmVhZG9ubHkgY2F1c2U/OiB7IG5hbWU/OiBzdHJpbmc7IG1lc3NhZ2U/OiBzdHJpbmcgfVxuXG4gIGNvbnN0cnVjdG9yKGlkZW50aXR5OiBQcm9ncmFtSWRlbnRpdHksIGNhdXNlOiB1bmtub3duKSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogJ1tMb2dpeF0gUHJvZ3JhbSBkaXNwb3NlIGZhaWxlZCcsXG4gICAgICBpZGVudGl0eSxcbiAgICAgIGVudHJ5cG9pbnQ6ICdkaXNwb3NlJyxcbiAgICAgIGhpbnQ6ICdEaXNwb3NlIGZhaWxlZDogYSBmaW5hbGl6ZXIgbWF5IGhhdmUgdGhyb3duLCBvciBzY29wZS9yZXNvdXJjZSBoYW5kbGVzIG1heSBiZSBpbnZhbGlkOyBjaGVjayBvbkVycm9yL2xvZ3MuJyxcbiAgICB9KVxuICAgIHRoaXMubmFtZSA9ICdEaXNwb3NlRXJyb3InXG4gICAgdGhpcy5jYXVzZSA9IHN1bW1hcml6ZUNhdXNlKGNhdXNlKVxuICB9XG5cbiAgb3ZlcnJpZGUgdG9KU09OKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4geyAuLi5zdXBlci50b0pTT04oKSwgY2F1c2U6IHRoaXMuY2F1c2UgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NlVGltZW91dEVycm9yIGV4dGVuZHMgUHJvZ3JhbVJ1bm5lckVycm9yQmFzZSB7XG4gIHJlYWRvbmx5IF90YWcgPSAnRGlzcG9zZVRpbWVvdXQnIGFzIGNvbnN0XG4gIHJlYWRvbmx5IHRpbWVvdXRNczogbnVtYmVyXG4gIHJlYWRvbmx5IGVsYXBzZWRNczogbnVtYmVyXG4gIHJlYWRvbmx5IHN1Z2dlc3Rpb25zOiBSZWFkb25seUFycmF5PHN0cmluZz5cblxuICBjb25zdHJ1Y3RvcihpZGVudGl0eTogUHJvZ3JhbUlkZW50aXR5LCBwYXJhbXM6IHsgcmVhZG9ubHkgdGltZW91dE1zOiBudW1iZXI7IHJlYWRvbmx5IGVsYXBzZWRNczogbnVtYmVyIH0pIHtcbiAgICBzdXBlcih7XG4gICAgICBtZXNzYWdlOiAnW0xvZ2l4XSBQcm9ncmFtIGRpc3Bvc2UgdGltZWQgb3V0JyxcbiAgICAgIGlkZW50aXR5LFxuICAgICAgZW50cnlwb2ludDogJ2Rpc3Bvc2UnLFxuICAgICAgaGludDogJ0Rpc3Bvc2UgdGltZWQgb3V0OiBpZiB0aGUgcHJvZ3JhbSBjYW5ub3QgZXhpdCBuYXR1cmFsbHksIHJlc291cmNlcyBtYXkgbm90IGJlIHJlbGVhc2VkIG9yIGJhY2tncm91bmQgZmliZXJzIGFyZSBzdGlsbCBydW5uaW5nLicsXG4gICAgfSlcbiAgICB0aGlzLm5hbWUgPSAnRGlzcG9zZVRpbWVvdXRFcnJvcidcbiAgICB0aGlzLnRpbWVvdXRNcyA9IHBhcmFtcy50aW1lb3V0TXNcbiAgICB0aGlzLmVsYXBzZWRNcyA9IHBhcmFtcy5lbGFwc2VkTXNcbiAgICB0aGlzLnN1Z2dlc3Rpb25zID0gW1xuICAgICAgJ0NoZWNrIGZvciBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZXJlIG5vdCB1bnJlZ2lzdGVyZWQgKGUuZy4gcHJvY2Vzcy5vbiAvIGVtaXR0ZXIub24pLicsXG4gICAgICAnQ2hlY2sgZm9yIGZpYmVycyB0aGF0IHdlcmUgbm90IGpvaW5lZC9pbnRlcnJ1cHQgKGxvbmctbGl2ZWQgd2F0Y2hlcnMgLyBTdHJlYW0ucnVuKikuJyxcbiAgICAgICdDaGVjayBmb3IgcmVzb3VyY2UgaGFuZGxlcyB0aGF0IHdlcmUgbm90IGNsb3NlZCAodGltZXIgLyBzb2NrZXQgLyBmaWxlIGhhbmRsZSkuJyxcbiAgICBdXG4gIH1cblxuICBvdmVycmlkZSB0b0pTT04oKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci50b0pTT04oKSxcbiAgICAgIHRpbWVvdXRNczogdGhpcy50aW1lb3V0TXMsXG4gICAgICBlbGFwc2VkTXM6IHRoaXMuZWxhcHNlZE1zLFxuICAgICAgc3VnZ2VzdGlvbnM6IHRoaXMuc3VnZ2VzdGlvbnMsXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgQ29udGV4dCwgRGVmZXJyZWQsIEVmZmVjdCwgTGF5ZXIsIE1hbmFnZWRSdW50aW1lIH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0IHtcbiAgQ29uY3VycmVuY3lQb2xpY3lUYWcsXG4gIFJlYWRRdWVyeVN0cmljdEdhdGVDb25maWdUYWcsXG4gIFN0YXRlVHJhbnNhY3Rpb25Db25maWdUYWcsXG4gIHR5cGUgQ29uY3VycmVuY3lQb2xpY3ksXG4gIHR5cGUgUmVhZFF1ZXJ5U3RyaWN0R2F0ZVJ1bnRpbWVDb25maWcsXG4gIHR5cGUgU3RhdGVUcmFuc2FjdGlvblJ1bnRpbWVDb25maWcsXG59IGZyb20gJy4vY29yZS9lbnYuanMnXG5pbXBvcnQgeyBSb290Q29udGV4dFRhZywgdHlwZSBSb290Q29udGV4dCB9IGZyb20gJy4vY29yZS9Sb290Q29udGV4dC5qcydcbmltcG9ydCAqIGFzIFByb2Nlc3NSdW50aW1lIGZyb20gJy4vY29yZS9wcm9jZXNzL1Byb2Nlc3NSdW50aW1lLmpzJ1xuaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlVGFnLCBNb2R1bGVSdW50aW1lLCBTdGF0ZU9mLCBBY3Rpb25PZiB9IGZyb20gJy4vY29yZS9tb2R1bGUuanMnXG5cbi8qKlxuICogQXBwTW9kdWxlRW50cnk6IGEgbW9kdWxlIGVudHJ5IHByb2R1Y2VkIGJ5IExvZ2l4LnByb3ZpZGUuXG4gKlxuICogLSBtb2R1bGU6IHRoZSBNb2R1bGUgZGVmaW5pdGlvbiBvYmplY3QgKGJvdGggYSBUYWcgYW5kIGEgY2FycmllciBvZiBzaGFwZSBpbmZvICsgZmFjdG9yeSBjYXBhYmlsaXR5KS5cbiAqIC0gbGF5ZXI6IHRoZSBydW50aW1lIExheWVyIGZvciB0aGUgTW9kdWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcE1vZHVsZUVudHJ5IHtcbiAgcmVhZG9ubHkgbW9kdWxlOiBNb2R1bGVUYWc8YW55LCBhbnk+XG4gIHJlYWRvbmx5IGxheWVyOiBMYXllci5MYXllcjxhbnksIGFueSwgYW55PlxuICAvKipcbiAgICogT3B0aW9uYWw6IGxpc3Qgb2YgU2VydmljZSBUYWdzIHByb3ZpZGVkIGJ5IHRoaXMgbW9kdWxlJ3MgbGF5ZXIuXG4gICAqXG4gICAqIC0gVXNlZCBvbmx5IGR1cmluZyBhcHAgYXNzZW1ibHkgZm9yIHRhZyBjb2xsaXNpb24gZGV0ZWN0aW9uIGFuZCBFbnYgdG9wb2xvZ3kgYW5hbHlzaXMuXG4gICAqIC0gSW50ZXJuYWxseSwgQXBwUnVudGltZSBhc3NlbWJseSBjYW4gZGVjbGFyZSB0aGlzIGV4cGxpY2l0bHkgdmlhIHByb3ZpZGVXaXRoVGFncy5cbiAgICogLSBEb2VzIG5vdCBhZmZlY3QgcnVudGltZSBiZWhhdmlvcjsgaWYgb21pdHRlZCwgdGhlIG1vZHVsZSBsYXllciBpcyB0cmVhdGVkIGFzIFwibm8gZXhwbGljaXQgc2VydmljZSB0YWdzIGRlY2xhcmVkXCIuXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlVGFncz86IFJlYWRvbmx5QXJyYXk8Q29udGV4dC5UYWc8YW55LCBhbnk+PlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2l4QXBwQ29uZmlnPFI+IHtcbiAgcmVhZG9ubHkgbGF5ZXI6IExheWVyLkxheWVyPFIsIG5ldmVyLCBuZXZlcj5cbiAgcmVhZG9ubHkgbW9kdWxlczogUmVhZG9ubHlBcnJheTxBcHBNb2R1bGVFbnRyeT5cbiAgcmVhZG9ubHkgcHJvY2Vzc2VzOiBSZWFkb25seUFycmF5PEVmZmVjdC5FZmZlY3Q8dm9pZCwgYW55LCBhbnk+PlxuICByZWFkb25seSBvbkVycm9yPzogKGNhdXNlOiBpbXBvcnQoJ2VmZmVjdCcpLkNhdXNlLkNhdXNlPHVua25vd24+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQ+XG4gIC8qKlxuICAgKiBSdW50aW1lLWxldmVsIGRlZmF1bHQgU3RhdGVUcmFuc2FjdGlvbiBjb25maWc6XG4gICAqIC0gSWYgbm90IHByb3ZpZGVkLCBlYWNoIE1vZHVsZVJ1bnRpbWUgZmFsbHMgYmFjayB0byBOT0RFX0VOVi1iYXNlZCBkZWZhdWx0IGluc3RydW1lbnRhdGlvbi5cbiAgICogLSBJZiBpbnN0cnVtZW50YXRpb24gaXMgcHJvdmlkZWQsIGl0IGJlY29tZXMgdGhlIGRlZmF1bHQgaW5zdHJ1bWVudGF0aW9uIGZvciBtb2R1bGVzIHVuZGVyIHRoaXMgUnVudGltZTtcbiAgICogICBpbmRpdmlkdWFsIG1vZHVsZXMgbWF5IHN0aWxsIG92ZXJyaWRlIGl0IHZpYSBNb2R1bGVJbXBsLnN0YXRlVHJhbnNhY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBzdGF0ZVRyYW5zYWN0aW9uPzogU3RhdGVUcmFuc2FjdGlvblJ1bnRpbWVDb25maWdcbiAgLyoqXG4gICAqIFJ1bnRpbWUtbGV2ZWwgY29uY3VycmVuY3kgcG9saWN5OlxuICAgKiAtIElmIG5vdCBwcm92aWRlZCwgZWFjaCBlbnRyeXBvaW50IGZhbGxzIGJhY2sgdG8gYnVpbHRpbiBkZWZhdWx0cyAoZS5nLiBjb25jdXJyZW5jeUxpbWl0PTE2KS5cbiAgICogLSBJZiBwcm92aWRlZCwgaXQgYmVjb21lcyB0aGUgZGVmYXVsdCBwb2xpY3kgZm9yIG1vZHVsZXMgdW5kZXIgdGhpcyBSdW50aW1lO1xuICAgKiAgIGluZGl2aWR1YWwgbW9kdWxlcyBtYXkgc3RpbGwgb3ZlcnJpZGUgdmlhIHJ1bnRpbWVfbW9kdWxlL3Byb3ZpZGVyIChtZXJnZWQgYnkgTW9kdWxlUnVudGltZSByZXNvbHZlcikuXG4gICAqL1xuICByZWFkb25seSBjb25jdXJyZW5jeVBvbGljeT86IENvbmN1cnJlbmN5UG9saWN5XG4gIC8qKlxuICAgKiBSZWFkUXVlcnkgc3RyaWN0IGdhdGUgKDA1Nyk6XG4gICAqIC0gVXNlZCBpbiBDSS9wZXJmIGdhdGVzIHRvIHVwZ3JhZGUgZHluYW1pYyBmYWxsYmFja3MgaW50byBmYWlsdXJlcyBvciB3YXJuaW5ncy5cbiAgICogLSBOb3QgcHJvdmlkZWQgYnkgZGVmYXVsdCAocHJlc2VydmUgdXNhYmlsaXR5KS5cbiAgICovXG4gIHJlYWRvbmx5IHJlYWRRdWVyeVN0cmljdEdhdGU/OiBSZWFkUXVlcnlTdHJpY3RHYXRlUnVudGltZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcERlZmluaXRpb248Uj4ge1xuICByZWFkb25seSBkZWZpbml0aW9uOiBMb2dpeEFwcENvbmZpZzxSPlxuICByZWFkb25seSBsYXllcjogTGF5ZXIuTGF5ZXI8UiwgbmV2ZXIsIG5ldmVyPlxuICByZWFkb25seSBtYWtlUnVudGltZTogKCkgPT4gTWFuYWdlZFJ1bnRpbWUuTWFuYWdlZFJ1bnRpbWU8UiwgbmV2ZXI+XG59XG5cbmludGVyZmFjZSBUYWdJbmZvIHtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmdcbiAgcmVhZG9ubHkgdGFnOiBDb250ZXh0LlRhZzxhbnksIGFueT5cbiAgcmVhZG9ubHkgb3duZXJNb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IHNvdXJjZTogJ21vZHVsZScgfCAnc2VydmljZSdcbn1cblxuaW50ZXJmYWNlIFRhZ0NvbGxpc2lvbiB7XG4gIHJlYWRvbmx5IGtleTogc3RyaW5nXG4gIHJlYWRvbmx5IGNvbmZsaWN0czogUmVhZG9ubHlBcnJheTxUYWdJbmZvPlxufVxuXG5pbnRlcmZhY2UgVGFnQ29sbGlzaW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IF90YWc6ICdUYWdDb2xsaXNpb25FcnJvcidcbiAgcmVhZG9ubHkgY29sbGlzaW9uczogUmVhZG9ubHlBcnJheTxUYWdDb2xsaXNpb24+XG59XG5cbmNvbnN0IGdldFRhZ0tleSA9ICh0YWc6IENvbnRleHQuVGFnPGFueSwgYW55Pik6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGFueVRhZyA9IHRhZyBhcyBhbnlcbiAgaWYgKHR5cGVvZiBhbnlUYWcua2V5ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBhbnlUYWcua2V5XG4gIH1cbiAgaWYgKHR5cGVvZiBhbnlUYWcuX2lkID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBhbnlUYWcuX2lkXG4gIH1cbiAgaWYgKHR5cGVvZiBhbnlUYWcudG9TdHJpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYW55VGFnLnRvU3RyaW5nKClcbiAgfVxuICByZXR1cm4gJ1t1bmtub3duLXRhZ10nXG59XG5cbmNvbnN0IGJ1aWxkVGFnSW5kZXggPSAoZW50cmllczogUmVhZG9ubHlBcnJheTxBcHBNb2R1bGVFbnRyeT4pOiBNYXA8c3RyaW5nLCBUYWdJbmZvW10+ID0+IHtcbiAgY29uc3QgaW5kZXggPSBuZXcgTWFwPHN0cmluZywgVGFnSW5mb1tdPigpXG5cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3Qgb3duZXJJZCA9IFN0cmluZyhlbnRyeS5tb2R1bGUuaWQpXG5cbiAgICAvLyBSZWNvcmQgdGhlIE1vZHVsZSB0YWcgaXRzZWxmLlxuICAgIGNvbnN0IG1vZHVsZVRhZyA9IGVudHJ5Lm1vZHVsZSBhcyB1bmtub3duIGFzIENvbnRleHQuVGFnPGFueSwgYW55PlxuICAgIGNvbnN0IG1vZHVsZUtleSA9IGdldFRhZ0tleShtb2R1bGVUYWcpXG4gICAgY29uc3QgbW9kdWxlSW5mbzogVGFnSW5mbyA9IHtcbiAgICAgIGtleTogbW9kdWxlS2V5LFxuICAgICAgdGFnOiBtb2R1bGVUYWcsXG4gICAgICBvd25lck1vZHVsZUlkOiBvd25lcklkLFxuICAgICAgc291cmNlOiAnbW9kdWxlJyxcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdNb2R1bGVJbmZvcyA9IGluZGV4LmdldChtb2R1bGVLZXkpXG4gICAgaWYgKGV4aXN0aW5nTW9kdWxlSW5mb3MpIHtcbiAgICAgIGV4aXN0aW5nTW9kdWxlSW5mb3MucHVzaChtb2R1bGVJbmZvKVxuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleC5zZXQobW9kdWxlS2V5LCBbbW9kdWxlSW5mb10pXG4gICAgfVxuXG4gICAgLy8gUmVjb3JkIGV4cGxpY2l0bHkgZGVjbGFyZWQgc2VydmljZSB0YWdzIChpZiBhbnkpLlxuICAgIGlmIChlbnRyeS5zZXJ2aWNlVGFncyAmJiBlbnRyeS5zZXJ2aWNlVGFncy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHRhZyBvZiBlbnRyeS5zZXJ2aWNlVGFncykge1xuICAgICAgICBjb25zdCBrZXkgPSBnZXRUYWdLZXkodGFnKVxuICAgICAgICBjb25zdCBpbmZvOiBUYWdJbmZvID0ge1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICB0YWcsXG4gICAgICAgICAgb3duZXJNb2R1bGVJZDogb3duZXJJZCxcbiAgICAgICAgICBzb3VyY2U6ICdzZXJ2aWNlJyxcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGlzdGluZ0luZm9zID0gaW5kZXguZ2V0KGtleSlcbiAgICAgICAgaWYgKGV4aXN0aW5nSW5mb3MpIHtcbiAgICAgICAgICBleGlzdGluZ0luZm9zLnB1c2goaW5mbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbmRleC5zZXQoa2V5LCBbaW5mb10pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5kZXhcbn1cblxuY29uc3QgdmFsaWRhdGVUYWdzID0gKGVudHJpZXM6IFJlYWRvbmx5QXJyYXk8QXBwTW9kdWxlRW50cnk+KTogdm9pZCA9PiB7XG4gIGNvbnN0IGluZGV4ID0gYnVpbGRUYWdJbmRleChlbnRyaWVzKVxuICBjb25zdCBjb2xsaXNpb25zOiBUYWdDb2xsaXNpb25bXSA9IFtdXG5cbiAgZm9yIChjb25zdCBba2V5LCBpbmZvc10gb2YgaW5kZXgpIHtcbiAgICBpZiAoaW5mb3MubGVuZ3RoIDw9IDEpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGNvbnN0IG93bmVycyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gICAgZm9yIChjb25zdCBpbmZvIG9mIGluZm9zKSB7XG4gICAgICBvd25lcnMuYWRkKGluZm8ub3duZXJNb2R1bGVJZClcbiAgICB9XG4gICAgLy8gVHJlYXQgaXQgYXMgYSBjb2xsaXNpb24gb25seSB3aGVuIHRoZSBzYW1lIGtleSBhcHBlYXJzIHVuZGVyIG11bHRpcGxlIGRpZmZlcmVudCBtb2R1bGVzLlxuICAgIC8vIER1cGxpY2F0ZXMgd2l0aGluIGEgc2luZ2xlIG1vZHVsZSBhcmUgbm90IGNvbnNpZGVyZWQgYW4gZXJyb3IgKG1heSBjb21lIGZyb20gbXVsdGktbGF5ZXIgY29tcG9zaXRpb24pLlxuICAgIGlmIChvd25lcnMuc2l6ZSA+IDEpIHtcbiAgICAgIGNvbGxpc2lvbnMucHVzaCh7IGtleSwgY29uZmxpY3RzOiBpbmZvcyB9KVxuICAgIH1cbiAgfVxuXG4gIGlmIChjb2xsaXNpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9XG4gICAgJ1tMb2dpeF0gVGFnIGNvbGxpc2lvbiBkZXRlY3RlZDpcXG4nICtcbiAgICBjb2xsaXNpb25zXG4gICAgICAubWFwKChjKSA9PiB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IGAtIGtleTogJHtjLmtleX1gXG4gICAgICAgIGNvbnN0IGxpbmVzID0gYy5jb25mbGljdHMubWFwKChpKSA9PiBgICAtIG93bmVyOiAke2kub3duZXJNb2R1bGVJZH0sIHNvdXJjZTogJHtpLnNvdXJjZX1gKVxuICAgICAgICByZXR1cm4gW2hlYWRlciwgLi4ubGluZXNdLmpvaW4oJ1xcbicpXG4gICAgICB9KVxuICAgICAgLmpvaW4oJ1xcbicpXG5cbiAgY29uc3QgZXJyb3I6IFRhZ0NvbGxpc2lvbkVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IobWVzc2FnZSksIHtcbiAgICBfdGFnOiAnVGFnQ29sbGlzaW9uRXJyb3InIGFzIGNvbnN0LFxuICAgIGNvbGxpc2lvbnMsXG4gIH0pXG5cbiAgdGhyb3cgZXJyb3Jcbn1cblxuZXhwb3J0IGNvbnN0IG1ha2VBcHAgPSA8Uj4oY29uZmlnOiBMb2dpeEFwcENvbmZpZzxSPik6IEFwcERlZmluaXRpb248Uj4gPT4ge1xuICBjb25zdCBzZWVuSWRzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBjb25maWcubW9kdWxlcykge1xuICAgIGNvbnN0IGlkID0gU3RyaW5nKGVudHJ5Lm1vZHVsZS5pZClcblxuICAgIGlmIChzZWVuSWRzLmhhcyhpZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFtMb2dpeF0gRHVwbGljYXRlIE1vZHVsZSBJRC9UYWcgZGV0ZWN0ZWQ6IFwiJHtpZH1cIi4gXFxuRW5zdXJlIGFsbCBtb2R1bGVzIGluIHRoZSBhcHBsaWNhdGlvbiBSdW50aW1lIGhhdmUgdW5pcXVlIElEcy5gLFxuICAgICAgKVxuICAgIH1cbiAgICBzZWVuSWRzLmFkZChpZClcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHRhZyBjb2xsaXNpb25zIGJlZm9yZSBtZXJnaW5nIGxheWVycy5cbiAgLy8gVGhpcyBleHBvc2VzIFwidGhlIHNhbWUgU2VydmljZVRhZyBpbXBsZW1lbnRlZCBieSBtdWx0aXBsZSBtb2R1bGVzXCIgZWFybHksIGF2b2lkaW5nIHNpbGVudCBFbnYgb3ZlcnJpZGVzLlxuICB2YWxpZGF0ZVRhZ3MoY29uZmlnLm1vZHVsZXMpXG5cbiAgLy8gSWYgdGhlIFJ1bnRpbWUgcHJvdmlkZXMgYSB1bmlmaWVkIFN0YXRlVHJhbnNhY3Rpb24gY29uZmlnLCBhdHRhY2ggdGhlIGNvcnJlc3BvbmRpbmcgc2VydmljZSB0byB0aGUgYXBwIEVudi5cbiAgY29uc3Qgc3RhdGVUeG5MYXllcjogTGF5ZXIuTGF5ZXI8UiwgbmV2ZXIsIG5ldmVyPiA9IGNvbmZpZy5zdGF0ZVRyYW5zYWN0aW9uXG4gICAgPyAoTGF5ZXIuc3VjY2VlZChTdGF0ZVRyYW5zYWN0aW9uQ29uZmlnVGFnLCBjb25maWcuc3RhdGVUcmFuc2FjdGlvbikgYXMgTGF5ZXIuTGF5ZXI8UiwgbmV2ZXIsIG5ldmVyPilcbiAgICA6IChMYXllci5lbXB0eSBhcyBMYXllci5MYXllcjxSLCBuZXZlciwgbmV2ZXI+KVxuXG4gIC8vIElmIHRoZSBSdW50aW1lIHByb3ZpZGVzIGEgdW5pZmllZCBDb25jdXJyZW5jeVBvbGljeSwgYXR0YWNoIHRoZSBjb3JyZXNwb25kaW5nIHNlcnZpY2UgdG8gdGhlIGFwcCBFbnYuXG4gIGNvbnN0IGNvbmN1cnJlbmN5UG9saWN5TGF5ZXI6IExheWVyLkxheWVyPFIsIG5ldmVyLCBuZXZlcj4gPSBjb25maWcuY29uY3VycmVuY3lQb2xpY3lcbiAgICA/IChMYXllci5zdWNjZWVkKENvbmN1cnJlbmN5UG9saWN5VGFnLCBjb25maWcuY29uY3VycmVuY3lQb2xpY3kpIGFzIExheWVyLkxheWVyPFIsIG5ldmVyLCBuZXZlcj4pXG4gICAgOiAoTGF5ZXIuZW1wdHkgYXMgTGF5ZXIuTGF5ZXI8UiwgbmV2ZXIsIG5ldmVyPilcblxuICAvLyBJZiB0aGUgUnVudGltZSBwcm92aWRlcyBhIFJlYWRRdWVyeSBzdHJpY3QgZ2F0ZSwgYXR0YWNoIHRoZSBjb3JyZXNwb25kaW5nIHNlcnZpY2UgdG8gdGhlIGFwcCBFbnYuXG4gIGNvbnN0IHJlYWRRdWVyeVN0cmljdEdhdGVMYXllcjogTGF5ZXIuTGF5ZXI8UiwgbmV2ZXIsIG5ldmVyPiA9IGNvbmZpZy5yZWFkUXVlcnlTdHJpY3RHYXRlXG4gICAgPyAoTGF5ZXIuc3VjY2VlZChSZWFkUXVlcnlTdHJpY3RHYXRlQ29uZmlnVGFnLCBjb25maWcucmVhZFF1ZXJ5U3RyaWN0R2F0ZSkgYXMgTGF5ZXIuTGF5ZXI8UiwgbmV2ZXIsIG5ldmVyPilcbiAgICA6IChMYXllci5lbXB0eSBhcyBMYXllci5MYXllcjxSLCBuZXZlciwgbmV2ZXI+KVxuXG4gIGNvbnN0IGFwcE1vZHVsZUlkcyA9IGNvbmZpZy5tb2R1bGVzLm1hcCgoZW50cnkpID0+IFN0cmluZyhlbnRyeS5tb2R1bGUuaWQpKVxuICBjb25zdCBhcHBJZCA9IGFwcE1vZHVsZUlkcy5sZW5ndGggPT09IDEgPyBhcHBNb2R1bGVJZHNbMF0hIDogYXBwTW9kdWxlSWRzLnNsaWNlKCkuc29ydCgpLmpvaW4oJ34nKVxuXG4gIGNvbnN0IGJhc2VMYXllciA9IExheWVyLm1lcmdlQWxsKFxuICAgIGNvbmZpZy5sYXllcixcbiAgICBzdGF0ZVR4bkxheWVyLFxuICAgIGNvbmN1cnJlbmN5UG9saWN5TGF5ZXIsXG4gICAgcmVhZFF1ZXJ5U3RyaWN0R2F0ZUxheWVyLFxuICAgIFByb2Nlc3NSdW50aW1lLmxheWVyKCksXG4gICAgTGF5ZXIuZWZmZWN0KFxuICAgICAgUm9vdENvbnRleHRUYWcsXG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHJlYWR5ID0geWllbGQqIERlZmVycmVkLm1ha2U8Q29udGV4dC5Db250ZXh0PGFueT4+KClcbiAgICAgICAgcmV0dXJuIHsgY29udGV4dDogdW5kZWZpbmVkLCByZWFkeSwgYXBwSWQsIGFwcE1vZHVsZUlkcyB9IHNhdGlzZmllcyBSb290Q29udGV4dFxuICAgICAgfSksXG4gICAgKSxcbiAgKSBhcyBMYXllci5MYXllcjxSLCBuZXZlciwgbmV2ZXI+XG5cbiAgY29uc3QgbW9kdWxlTGF5ZXJzID0gY29uZmlnLm1vZHVsZXMubWFwKChlbnRyeSkgPT5cbiAgICAvLyBFbnN1cmUgZWFjaCBtb2R1bGUgbGF5ZXIgY2FuIHNlZSB0aGUgYXBwIEVudiAoYmFzZUxheWVyKSB0byBhdm9pZCBtaXNzaW5nIHJvb3QgZW52IGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAgICBMYXllci5wcm92aWRlKGVudHJ5LmxheWVyLCBiYXNlTGF5ZXIpLFxuICApXG4gIGNvbnN0IGVudkxheWVyID0gbW9kdWxlTGF5ZXJzLmxlbmd0aCA+IDAgPyBMYXllci5tZXJnZUFsbChiYXNlTGF5ZXIsIC4uLm1vZHVsZUxheWVycykgOiBiYXNlTGF5ZXJcblxuICBjb25zdCBmaW5hbExheWVyID0gTGF5ZXIudW53cmFwU2NvcGVkKFxuICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IHNjb3BlID0geWllbGQqIEVmZmVjdC5zY29wZVxuXG4gICAgICAvLyBidWlsZFdpdGhTY29wZSBidWlsZHMgZW52TGF5ZXIgd2l0aGluIHRoZSBjdXJyZW50IHNjb3BlIGFuZCBwYXRjaGVzIEZpYmVyUmVmcyAoZS5nLiBEZWJ1ZyBzaW5rcykuXG4gICAgICAvLyBXZSB3cmFwIGl0IHdpdGggZGlmZkZpYmVyUmVmcyB0byBjYXB0dXJlIEZpYmVyUmVmIHBhdGNoIGNoYW5nZXMsIHRoZW4gZmVlZCB0aGUgcGF0Y2ggYmFjayBhcyBhIExheWVyLFxuICAgICAgLy8gc28gRmliZXJSZWYgbW9kaWZpY2F0aW9ucyBhcmUgbm90IFwid2FzaGVkIG91dFwiIGR1cmluZyBhc3NlbWJseS5cbiAgICAgIGNvbnN0IFtwYXRjaCwgZW52XSA9IHlpZWxkKiBFZmZlY3QuZGlmZkZpYmVyUmVmcyhMYXllci5idWlsZFdpdGhTY29wZShlbnZMYXllciwgc2NvcGUpKVxuXG4gICAgICAvLyBBZnRlciBlbnZMYXllciBpcyBidWlsdCwgY29tcGxldGUgUm9vdENvbnRleHQgKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSByb290IHByb3ZpZGVyKS5cbiAgICAgIC8vIE5vdGU6IG1vZHVsZSBsb2dpY3MgbWF5IGFscmVhZHkgYmUgZm9ya2VkIGFuZCB3YWl0aW5nIGZvciBSb290Q29udGV4dCBpbiB0aGUgcnVuIHBoYXNlOyBjb21wbGV0aW5nIGl0IGhlcmUgdW5ibG9ja3MgdGhlbS5cbiAgICAgIC8vIFJvb3RDb250ZXh0VGFnIGlzIGFuIGludGVybmFsIHNlcnZpY2UgaW5qZWN0ZWQgYnkgQXBwUnVudGltZSAoc2hvdWxkIG5vdCBsZWFrIGludG8gZXh0ZXJuYWwgUiB0eXBlcyk7XG4gICAgICAvLyBrZWVwIHR5cGVzIG1pbmltYWwgdG8gYXZvaWQgaW5jb3JyZWN0IGdlbmVyaWMgaW5mZXJlbmNlIGluIENvbnRleHQuZ2V0LlxuICAgICAgY29uc3Qgcm9vdENvbnRleHQgPSBDb250ZXh0LmdldChlbnYgYXMgQ29udGV4dC5Db250ZXh0PGFueT4sIFJvb3RDb250ZXh0VGFnIGFzIGFueSkgYXMgUm9vdENvbnRleHRcblxuICAgICAgcm9vdENvbnRleHQuY29udGV4dCA9IGVudiBhcyBDb250ZXh0LkNvbnRleHQ8YW55PlxuICAgICAgeWllbGQqIERlZmVycmVkLnN1Y2NlZWQocm9vdENvbnRleHQucmVhZHksIGVudiBhcyBDb250ZXh0LkNvbnRleHQ8YW55PilcblxuICAgICAgY29uc3QgcHJvY2Vzc1J1bnRpbWUgPSBDb250ZXh0LmdldChcbiAgICAgICAgZW52IGFzIENvbnRleHQuQ29udGV4dDxhbnk+LFxuICAgICAgICBQcm9jZXNzUnVudGltZS5Qcm9jZXNzUnVudGltZVRhZyBhcyBhbnksXG4gICAgICApIGFzIFByb2Nlc3NSdW50aW1lLlByb2Nlc3NSdW50aW1lXG5cbiAgICAgIC8vIEFmdGVyIEVudiBpcyBmdWxseSByZWFkeSwgc3RhcnQgYXBwLWxldmVsIGxvbmctbGl2ZWQgcHJvY2Vzc2VzIChQcm9jZXNzIC8gTGluayAvIHdhdGNoZXJzIC8gaG9zdCBicmlkZ2VzLCBldGMuKS5cbiAgICAgIHlpZWxkKiBFZmZlY3QuZm9yRWFjaChcbiAgICAgICAgY29uZmlnLnByb2Nlc3NlcyxcbiAgICAgICAgKHByb2Nlc3MpID0+XG4gICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgaW5zdGFsbGF0aW9uID0geWllbGQqIEVmZmVjdC5wcm92aWRlKFxuICAgICAgICAgICAgICBwcm9jZXNzUnVudGltZS5pbnN0YWxsKHByb2Nlc3MgYXMgYW55LCB7XG4gICAgICAgICAgICAgICAgc2NvcGU6IHsgdHlwZTogJ2FwcCcsIGFwcElkIH0sXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbnN0YWxsZWRBdDogJ2FwcFJ1bnRpbWUnLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAvLyBMZWdhY3kgZmFsbGJhY2s6IGEgcmF3IEVmZmVjdCBpcyBzdGlsbCBhbGxvd2VkIGFzIGEgcHJvY2VzcyBob3N0LCBidXQgaXQgaGFzIG5vIFByb2Nlc3Mgc3RhdGljIHN1cmZhY2UvZGlhZ25vc3RpY3MuXG4gICAgICAgICAgICBpZiAoaW5zdGFsbGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgeWllbGQqIEVmZmVjdC5mb3JrU2NvcGVkKFxuICAgICAgICAgICAgICAgIEVmZmVjdC5wcm92aWRlKGNvbmZpZy5vbkVycm9yID8gRWZmZWN0LmNhdGNoQWxsQ2F1c2UocHJvY2VzcywgY29uZmlnLm9uRXJyb3IpIDogcHJvY2VzcywgZW52KSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICB7IGRpc2NhcmQ6IHRydWUgfSxcbiAgICAgIClcblxuICAgICAgY29uc3QgZmliZXJSZWZzTGF5ZXIgPSBMYXllci5zY29wZWREaXNjYXJkKEVmZmVjdC5wYXRjaEZpYmVyUmVmcyhwYXRjaCkpXG5cbiAgICAgIHJldHVybiBMYXllci5tZXJnZUFsbChMYXllci5zdWNjZWVkQ29udGV4dChlbnYpLCBmaWJlclJlZnNMYXllcilcbiAgICB9KSxcbiAgKSBhcyBMYXllci5MYXllcjxSLCBuZXZlciwgbmV2ZXI+XG5cbiAgcmV0dXJuIHtcbiAgICBkZWZpbml0aW9uOiBjb25maWcsXG4gICAgbGF5ZXI6IGZpbmFsTGF5ZXIsXG4gICAgbWFrZVJ1bnRpbWU6ICgpID0+IE1hbmFnZWRSdW50aW1lLm1ha2UoZmluYWxMYXllciksXG4gIH1cbn1cblxuLyoqXG4gKiBTdWdhcjogcGFpciBhIE1vZHVsZSB3aXRoIGEgcnVudGltZSBpbnN0YW5jZSBvciBsYXllciBmb3IgQXBwUnVudGltZSdzIG1vZHVsZXMgY29uZmlnLlxuICovXG5leHBvcnQgY29uc3QgcHJvdmlkZSA9IDxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlLCBSLCBFPihcbiAgbW9kdWxlOiBNb2R1bGVUYWc8YW55LCBTaD4sXG4gIHJlc291cmNlOiBMYXllci5MYXllcjxNb2R1bGVSdW50aW1lPFN0YXRlT2Y8U2g+LCBBY3Rpb25PZjxTaD4+LCBFLCBSPiB8IE1vZHVsZVJ1bnRpbWU8U3RhdGVPZjxTaD4sIEFjdGlvbk9mPFNoPj4sXG4pOiBBcHBNb2R1bGVFbnRyeSA9PiB7XG4gIGNvbnN0IGxheWVyID0gaXNMYXllcihyZXNvdXJjZSlcbiAgICA/IHJlc291cmNlXG4gICAgOiBMYXllci5zdWNjZWVkKG1vZHVsZSwgcmVzb3VyY2UgYXMgTW9kdWxlUnVudGltZTxTdGF0ZU9mPFNoPiwgQWN0aW9uT2Y8U2g+PilcblxuICByZXR1cm4geyBtb2R1bGUsIGxheWVyIH1cbn1cblxuLyoqXG4gKiBTdWdhcjogYXR0YWNoIGV4cGxpY2l0IFNlcnZpY2VUYWcgbWV0YWRhdGEgdG8gYW4gYXBwIG1vZHVsZSBlbnRyeSBmb3IgdGFnIGNvbGxpc2lvbiBkZXRlY3Rpb24uXG4gKlxuICogLSBzZXJ2aWNlVGFncyBzaG91bGQgaW5jbHVkZSBvbmx5IHNlcnZpY2VzIGltcGxlbWVudGVkIGJ5IHRoaXMgbW9kdWxlJ3MgbGF5ZXIuXG4gKiAtIEludGVybmFsLW9ubHkgaGVscGVyOiBgQGxvZ2l4anMvY29yZWAgYmxvY2tzIGAuL2ludGVybmFsLypgIGluIHBhY2thZ2UgZXhwb3J0cywgc28gdGhpcyBpcyBub3QgYSBwdWJsaWMgQVBJIHN1cmZhY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBwcm92aWRlV2l0aFRhZ3MgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZSwgUiwgRT4oXG4gIG1vZHVsZTogTW9kdWxlVGFnPGFueSwgU2g+LFxuICByZXNvdXJjZTogTGF5ZXIuTGF5ZXI8TW9kdWxlUnVudGltZTxTdGF0ZU9mPFNoPiwgQWN0aW9uT2Y8U2g+PiwgRSwgUj4gfCBNb2R1bGVSdW50aW1lPFN0YXRlT2Y8U2g+LCBBY3Rpb25PZjxTaD4+LFxuICBzZXJ2aWNlVGFnczogUmVhZG9ubHlBcnJheTxDb250ZXh0LlRhZzxhbnksIGFueT4+LFxuKTogQXBwTW9kdWxlRW50cnkgPT4ge1xuICBjb25zdCBiYXNlID0gcHJvdmlkZShtb2R1bGUsIHJlc291cmNlKVxuICByZXR1cm4ge1xuICAgIC4uLmJhc2UsXG4gICAgc2VydmljZVRhZ3MsXG4gIH1cbn1cblxuY29uc3QgaXNMYXllciA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIExheWVyLkxheWVyPGFueSwgYW55LCBhbnk+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgTGF5ZXIuTGF5ZXJUeXBlSWQgaW4gdmFsdWVcbiIsICJpbXBvcnQgeyBDYXVzZSwgRWZmZWN0LCBFeGl0LCBGaWJlciwgT3B0aW9uLCBTY29wZSB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB7IERpc3Bvc2VFcnJvciwgRGlzcG9zZVRpbWVvdXRFcnJvciwgdHlwZSBQcm9ncmFtSWRlbnRpdHkgfSBmcm9tICcuL1Byb2dyYW1SdW5uZXIuZXJyb3JzLmpzJ1xuXG5leHBvcnQgY29uc3QgY2xvc2VQcm9ncmFtU2NvcGUgPSAocGFyYW1zOiB7XG4gIHJlYWRvbmx5IHNjb3BlOiBTY29wZS5DbG9zZWFibGVTY29wZVxuICByZWFkb25seSB0aW1lb3V0TXM6IG51bWJlclxuICByZWFkb25seSBpZGVudGl0eTogUHJvZ3JhbUlkZW50aXR5XG4gIHJlYWRvbmx5IG9uRXJyb3I/OiAoY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBuZXZlcj5cbn0pOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBuZXZlcj4gPT4ge1xuICByZXR1cm4gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKVxuXG4gICAgY29uc3QgZmliZXIgPSB5aWVsZCogRWZmZWN0LmZvcmtEYWVtb24oU2NvcGUuY2xvc2UocGFyYW1zLnNjb3BlLCBFeGl0LnZvaWQpKVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IGV4aXRPcHQgPSB5aWVsZCogRmliZXIucG9sbChmaWJlcilcbiAgICAgIGlmIChPcHRpb24uaXNTb21lKGV4aXRPcHQpKSB7XG4gICAgICAgIGNvbnN0IGV4aXQgPSBleGl0T3B0LnZhbHVlXG4gICAgICAgIGlmIChleGl0Ll90YWcgPT09ICdTdWNjZXNzJykge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmRpZShuZXcgRGlzcG9zZUVycm9yKHBhcmFtcy5pZGVudGl0eSwgZXhpdC5jYXVzZSkpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsYXBzZWRNcyA9IERhdGUubm93KCkgLSBzdGFydFxuICAgICAgaWYgKGVsYXBzZWRNcyA+PSBwYXJhbXMudGltZW91dE1zKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IERpc3Bvc2VUaW1lb3V0RXJyb3IocGFyYW1zLmlkZW50aXR5LCB7XG4gICAgICAgICAgdGltZW91dE1zOiBwYXJhbXMudGltZW91dE1zLFxuICAgICAgICAgIGVsYXBzZWRNcyxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodHlwZW9mIHBhcmFtcy5vbkVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgeWllbGQqIHBhcmFtcy5vbkVycm9yKENhdXNlLmRpZShlcnJvcikpLnBpcGUoRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKCkgPT4gRWZmZWN0LnZvaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgeWllbGQqIEZpYmVyLmludGVycnVwdEZvcmsoZmliZXIpXG4gICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmRpZShlcnJvcilcbiAgICAgIH1cblxuICAgICAgLy8gTk9URTogVXNlIGEgbWljcm90YXNrIHlpZWxkIChub3QgVGVzdENsb2NrLWJhc2VkKSB0byBhdm9pZCBiZWluZyBibG9ja2VkIGJ5IFRlc3RDbG9jayxcbiAgICAgIC8vIHdoaWxlIGtlZXBpbmcgdGhlIFwic3VjY2Vzc2Z1bCBjbG9zZVwiIGZhc3QgcGF0aCBjaGVhcCAocGVyZi1jcml0aWNhbCBmb3IgdGlnaHQgbG9vcHMpLlxuICAgICAgeWllbGQqIEVmZmVjdC5wcm9taXNlKCgpID0+IG5ldyBQcm9taXNlPHZvaWQ+KChyKSA9PiBxdWV1ZU1pY3JvdGFzayhyKSkpXG4gICAgfVxuICB9KVxufVxuIiwgImltcG9ydCB7IEVmZmVjdCwgRXhpdCwgU2NvcGUgfSBmcm9tICdlZmZlY3QnXG5cbmNvbnN0IGdldFByb2Nlc3MgPSAoKTogYW55ID0+IChnbG9iYWxUaGlzIGFzIGFueSkucHJvY2Vzc1xuXG5jb25zdCBpc05vZGVQcm9jZXNzID0gKFxuICB2YWx1ZTogdW5rbm93bixcbik6IHZhbHVlIGlzIHtcbiAgb246IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiAoKSA9PiB2b2lkKSA9PiB2b2lkXG4gIG9mZj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiAoKSA9PiB2b2lkKSA9PiB2b2lkXG4gIHJlbW92ZUxpc3RlbmVyPzogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6ICgpID0+IHZvaWQpID0+IHZvaWRcbn0gPT4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgKHZhbHVlIGFzIGFueSkub24gPT09ICdmdW5jdGlvbidcblxuY29uc3QgcmVtb3ZlTGlzdGVuZXIgPSAocHJvYzogYW55LCBldmVudDogc3RyaW5nLCBoYW5kbGVyOiAoKSA9PiB2b2lkKTogdm9pZCA9PiB7XG4gIGlmICh0eXBlb2YgcHJvYy5vZmYgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9jLm9mZihldmVudCwgaGFuZGxlcilcbiAgICByZXR1cm5cbiAgfVxuICBpZiAodHlwZW9mIHByb2MucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBwcm9jLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBoYW5kbGVyKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBpbnN0YWxsR3JhY2VmdWxTaHV0ZG93bkhhbmRsZXJzID0gKHBhcmFtczoge1xuICByZWFkb25seSBzY29wZTogU2NvcGUuQ2xvc2VhYmxlU2NvcGVcbiAgcmVhZG9ubHkgZW5hYmxlZDogYm9vbGVhblxufSk6IEVmZmVjdC5FZmZlY3Q8dm9pZD4gPT4ge1xuICBpZiAoIXBhcmFtcy5lbmFibGVkKSB7XG4gICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gIH1cblxuICBjb25zdCBwcm9jID0gZ2V0UHJvY2VzcygpXG4gIGlmICghaXNOb2RlUHJvY2Vzcyhwcm9jKSkge1xuICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICB9XG5cbiAgY29uc3QgaGFuZGxlciA9ICgpOiB2b2lkID0+IHtcbiAgICB2b2lkIEVmZmVjdC5ydW5Qcm9taXNlKFNjb3BlLmNsb3NlKHBhcmFtcy5zY29wZSwgRXhpdC52b2lkKSlcbiAgfVxuXG4gIHJldHVybiBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgeWllbGQqIFNjb3BlLmFkZEZpbmFsaXplcihcbiAgICAgIHBhcmFtcy5zY29wZSxcbiAgICAgIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgICAgcmVtb3ZlTGlzdGVuZXIocHJvYywgJ1NJR0lOVCcsIGhhbmRsZXIpXG4gICAgICAgIHJlbW92ZUxpc3RlbmVyKHByb2MsICdTSUdURVJNJywgaGFuZGxlcilcbiAgICAgIH0pLFxuICAgIClcblxuICAgIHlpZWxkKiBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICBwcm9jLm9uKCdTSUdJTlQnLCBoYW5kbGVyKVxuICAgICAgcHJvYy5vbignU0lHVEVSTScsIGhhbmRsZXIpXG4gICAgfSlcbiAgfSlcbn1cbiIsICJpbXBvcnQgeyBFZmZlY3QsIFNjb3BlIH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0IHR5cGUgeyBNYW5hZ2VkUnVudGltZSB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuLi9tb2R1bGUuanMnXG5pbXBvcnQgeyBtYWtlIGFzIG1ha2VCb3VuZEFwaSB9IGZyb20gJy4uL0JvdW5kQXBpUnVudGltZS5qcydcbmltcG9ydCB7IGNsb3NlUHJvZ3JhbVNjb3BlIH0gZnJvbSAnLi9Qcm9ncmFtUnVubmVyLmNsb3NlU2NvcGUuanMnXG5pbXBvcnQgdHlwZSB7IFByb2dyYW1JZGVudGl0eSB9IGZyb20gJy4vUHJvZ3JhbVJ1bm5lci5lcnJvcnMuanMnXG5pbXBvcnQgeyBpbnN0YWxsR3JhY2VmdWxTaHV0ZG93bkhhbmRsZXJzIH0gZnJvbSAnLi9Qcm9ncmFtUnVubmVyLnNpZ25hbHMuanMnXG5pbXBvcnQgdHlwZSB7IFByb2dyYW1SdW5Db250ZXh0IH0gZnJvbSAnLi9Qcm9ncmFtUnVubmVyLmNvbnRleHQuanMnXG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVGYWN0b3J5ID0gKFxuICByb290SW1wbDogTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+LFxuICBvcHRpb25zPzogdW5rbm93bixcbikgPT4gTWFuYWdlZFJ1bnRpbWUuTWFuYWdlZFJ1bnRpbWU8YW55LCBuZXZlcj5cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmFtUnVubmVyS2VybmVsPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGU+IHtcbiAgcmVhZG9ubHkgc2NvcGU6IFNjb3BlLkNsb3NlYWJsZVNjb3BlXG4gIHJlYWRvbmx5IHJ1bnRpbWU6IE1hbmFnZWRSdW50aW1lLk1hbmFnZWRSdW50aW1lPGFueSwgbmV2ZXI+XG4gIHJlYWRvbmx5IGlkZW50aXR5OiBQcm9ncmFtSWRlbnRpdHlcbiAgcmVhZG9ubHkgaW5zdGFsbFNpZ25hbHM6IChlbmFibGVkOiBib29sZWFuKSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQ+XG4gIHJlYWRvbmx5IGNsb3NlOiAocGFyYW1zOiB7XG4gICAgcmVhZG9ubHkgdGltZW91dE1zOiBudW1iZXJcbiAgICByZWFkb25seSBvbkVycm9yPzogKGNhdXNlOiBpbXBvcnQoJ2VmZmVjdCcpLkNhdXNlLkNhdXNlPHVua25vd24+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBuZXZlcj5cbiAgfSkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgbmV2ZXI+XG4gIHJlYWRvbmx5IHNldEluc3RhbmNlSWQ6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZFxuICByZWFkb25seSB0b0NvbnRleHQ6IChtb2R1bGVSdW50aW1lOiB1bmtub3duKSA9PiBQcm9ncmFtUnVuQ29udGV4dDxTaD5cbn1cblxuZXhwb3J0IGNvbnN0IG1ha2VQcm9ncmFtUnVubmVyS2VybmVsID0gPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGU+KFxuICBtYWtlUnVudGltZTogUnVudGltZUZhY3RvcnksXG4gIHJvb3RJbXBsOiBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4sXG4gIG9wdGlvbnM/OiB1bmtub3duLFxuKTogRWZmZWN0LkVmZmVjdDxQcm9ncmFtUnVubmVyS2VybmVsPFNoPj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IGlkZW50aXR5OiBQcm9ncmFtSWRlbnRpdHkgPSB7XG4gICAgICBtb2R1bGVJZDogU3RyaW5nKHJvb3RJbXBsLm1vZHVsZS5pZCksXG4gICAgICBpbnN0YW5jZUlkOiAndW5rbm93bicsXG4gICAgfVxuXG4gICAgY29uc3Qgc2NvcGUgPSB5aWVsZCogU2NvcGUubWFrZSgpXG4gICAgY29uc3QgcnVudGltZSA9IG1ha2VSdW50aW1lKHJvb3RJbXBsIGFzIHVua25vd24gYXMgTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+LCBvcHRpb25zKVxuXG4gICAgeWllbGQqIFNjb3BlLmFkZEZpbmFsaXplcihzY29wZSwgRWZmZWN0LnByb21pc2UoKCkgPT4gcnVudGltZS5kaXNwb3NlKCkpLnBpcGUoRWZmZWN0LmFzVm9pZCkpXG5cbiAgICBjb25zdCBzZXRJbnN0YW5jZUlkID0gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICBpZGVudGl0eS5pbnN0YW5jZUlkID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUgOiBTdHJpbmcodmFsdWUgPz8gJ3Vua25vd24nKVxuICAgIH1cblxuICAgIGNvbnN0IGNsb3NlID0gKHBhcmFtczoge1xuICAgICAgcmVhZG9ubHkgdGltZW91dE1zOiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IG9uRXJyb3I/OiAoY2F1c2U6IGltcG9ydCgnZWZmZWN0JykuQ2F1c2UuQ2F1c2U8dW5rbm93bj4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIG5ldmVyPlxuICAgIH0pID0+XG4gICAgICBjbG9zZVByb2dyYW1TY29wZSh7XG4gICAgICAgIHNjb3BlLFxuICAgICAgICB0aW1lb3V0TXM6IHBhcmFtcy50aW1lb3V0TXMsXG4gICAgICAgIGlkZW50aXR5LFxuICAgICAgICBvbkVycm9yOiBwYXJhbXMub25FcnJvcixcbiAgICAgIH0pXG5cbiAgICBjb25zdCBpbnN0YWxsU2lnbmFscyA9IChlbmFibGVkOiBib29sZWFuKSA9PiBpbnN0YWxsR3JhY2VmdWxTaHV0ZG93bkhhbmRsZXJzKHsgc2NvcGUsIGVuYWJsZWQgfSlcblxuICAgIGNvbnN0IHRvQ29udGV4dCA9IChtb2R1bGVSdW50aW1lOiB1bmtub3duKSA9PlxuICAgICAgKHtcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIHJ1bnRpbWUsXG4gICAgICAgIG1vZHVsZTogbW9kdWxlUnVudGltZSBhcyBhbnksXG4gICAgICAgICQ6IG1ha2VCb3VuZEFwaShyb290SW1wbC5tb2R1bGUuc2hhcGUgYXMgYW55LCBtb2R1bGVSdW50aW1lIGFzIGFueSkgYXMgYW55LFxuICAgICAgfSkgc2F0aXNmaWVzIFByb2dyYW1SdW5Db250ZXh0PFNoPlxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNjb3BlLFxuICAgICAgcnVudGltZSxcbiAgICAgIGlkZW50aXR5LFxuICAgICAgaW5zdGFsbFNpZ25hbHMsXG4gICAgICBjbG9zZSxcbiAgICAgIHNldEluc3RhbmNlSWQsXG4gICAgICB0b0NvbnRleHQsXG4gICAgfVxuICB9KVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9BLElBQU0saUJBQWlCLENBQUMsVUFBd0Q7QUFDOUUsTUFBSSxpQkFBaUIsT0FBTztBQUMxQixXQUFPLEVBQUUsTUFBTSxNQUFNLE1BQU0sU0FBUyxNQUFNLFFBQVE7QUFBQSxFQUNwRDtBQUNBLFNBQU8sRUFBRSxTQUFTLE9BQU8sVUFBVSxXQUFXLFFBQVEsT0FBVTtBQUNsRTtBQUVBLElBQWUseUJBQWYsY0FBOEMsTUFBTTtBQUFBLEVBT3hDLFlBQVksUUFLbkI7QUFDRCxVQUFNLE9BQU8sT0FBTztBQUNwQixTQUFLLFdBQVcsT0FBTyxTQUFTO0FBQ2hDLFNBQUssYUFBYSxPQUFPLFNBQVM7QUFDbEMsU0FBSyxhQUFhLE9BQU87QUFDekIsU0FBSyxPQUFPLE9BQU87QUFBQSxFQUNyQjtBQUFBLEVBRUEsU0FBa0M7QUFDaEMsV0FBTztBQUFBLE1BQ0wsTUFBTSxLQUFLO0FB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QUFNLFFBQVEsUUFBUSxDQUFDLEVBQUUsS0FBS0EsUUFBTyxNQUFNLENBQUM7QUFFNUYsUUFBTSxnQkFBZ0IsQ0FBQyxVQUFtQjtBQUN4QyxhQUFTLGFBQWEsT0FBTyxVQUFVLFlBQVksTUFBTSxTQUFTLElBQUksUUFBUSxPQUFPLFNBQVMsU0FBUztBQUFBLEVBQ3pHO0FBRUEsUUFBTSxRQUFRLENBQUMsV0FJYixrQkFBa0I7QUFBQSxJQUNoQjtBQUFBLElBQ0EsV0FBVyxPQUFPO0FBQUEsSUFDbEI7QUFBQSxJQUNBLFNBQVMsT0FBTztBQUFBLEVBQ2xCLENBQUM7QUFFSCxRQUFNLGlCQUFpQixDQUFDLFlBQXFCLGdDQUFnQyxFQUFFLE9BQU8sUUFBUSxDQUFDO0FBRS9GLFFBQU0sWUFBWSxDQUFDLG1CQUNoQjtBQUFBLElBQ0M7QUFBQSxJQUNBO0FBQUEsSUFDQSxRQUFRO0FBQUEsSUFDUixHQUFHLEtBQWEsU0FBUyxPQUFPLE9BQWMsYUFBb0I7QUFBQSxFQUNwRTtBQUVGLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGLENBQUM7IiwKICAibmFtZXMiOiBbImxheWVyIiwgIkVmZmVjdCIsICJFZmZlY3QiLCAiRWZmZWN0IiwgIkV4aXQiLCAiU2NvcGUiLCAiRWZmZWN0IiwgIlNjb3BlIiwgIkVmZmVjdCIsICJTY29wZSJdCn0K