@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,1101 @@
1
+ // @logixjs/core subpath bundles for @logixjs/sandbox
2
+
3
+ import {
4
+ create
5
+ } from "./chunk-KE2H62D6.js";
6
+ import {
7
+ Tag
8
+ } from "./chunk-CTSYKMM6.js";
9
+ import {
10
+ resolve
11
+ } from "./chunk-NWCJJZNQ.js";
12
+ import {
13
+ makeMatch,
14
+ makeMatchTag
15
+ } from "./chunk-GFOF7NCX.js";
16
+ import {
17
+ isActionToken
18
+ } from "./chunk-DOBF6YTQ.js";
19
+ import {
20
+ isFieldPathSegment
21
+ } from "./chunk-ASVMK364.js";
22
+ import {
23
+ getRuntimeInternals,
24
+ setBoundInternals
25
+ } from "./chunk-7GPAF2UK.js";
26
+ import {
27
+ forceSourceRefresh,
28
+ inSyncTransactionFiber,
29
+ isDevEnv,
30
+ makeTaskRunner
31
+ } from "./chunk-YMVMZA3U.js";
32
+ import {
33
+ make
34
+ } from "./chunk-2XVE7F26.js";
35
+ import {
36
+ RunSessionTag
37
+ } from "./chunk-W365QUZ5.js";
38
+ import {
39
+ currentDiagnosticsLevel,
40
+ record,
41
+ toSerializableErrorSummary
42
+ } from "./chunk-SH7TP5CJ.js";
43
+
44
+ // ../logix-core/src/internal/runtime/core/mutativePatches.ts
45
+ var mutateWithoutPatches = (base, mutator) => {
46
+ return create(base, mutator);
47
+ };
48
+ var toPatchFieldPath = (path) => {
49
+ if (typeof path === "string") {
50
+ const trimmed = path.trim();
51
+ return trimmed.length > 0 ? "*" : void 0;
52
+ }
53
+ if (!Array.isArray(path)) return void 0;
54
+ const parts = [];
55
+ for (const seg of path) {
56
+ if (typeof seg === "string") {
57
+ if (isFieldPathSegment(seg)) parts.push(seg);
58
+ continue;
59
+ }
60
+ }
61
+ if (parts.length === 0) return "*";
62
+ return parts;
63
+ };
64
+ var mutateWithPatchPaths = (base, mutator) => {
65
+ const out = create(base, mutator, {
66
+ enablePatches: {
67
+ pathAsArray: true,
68
+ arrayLengthAssignment: false
69
+ }
70
+ });
71
+ if (!Array.isArray(out)) {
72
+ return { nextState: out, patchPaths: [] };
73
+ }
74
+ const nextState = out[0];
75
+ const patches = out[1] ?? [];
76
+ const dedup = /* @__PURE__ */ new Map();
77
+ for (const patch of patches) {
78
+ const p = toPatchFieldPath(patch?.path);
79
+ if (!p) continue;
80
+ const key = p === "*" ? "*" : JSON.stringify(p);
81
+ if (!dedup.has(key)) dedup.set(key, p);
82
+ }
83
+ return {
84
+ nextState,
85
+ patchPaths: Array.from(dedup.values())
86
+ };
87
+ };
88
+
89
+ // ../logix-core/src/internal/runtime/core/BoundApiRuntime.ts
90
+ import { Context as Context3, Effect as Effect3, FiberRef, Option, Schema, Stream } from "../effect.js";
91
+
92
+ // ../logix-core/src/internal/runtime/core/Lifecycle.ts
93
+ import { Cause, Context, Effect, Ref } from "../effect.js";
94
+ var LifecycleContext = Context.GenericTag("@logixjs/LifecycleManager");
95
+ var safeRun = (label, eff) => eff.pipe(
96
+ Effect.matchCauseEffect({
97
+ onSuccess: () => Effect.void,
98
+ onFailure: (cause) => Effect.logError(`[${label}] failed: ${Cause.pretty(cause)}`)
99
+ })
100
+ );
101
+ var makeTaskId = (kind, order) => `${kind}:${order}`;
102
+ var makeLifecycleManager = (identity) => Effect.gen(function* () {
103
+ const budgets = {
104
+ maxEventsPerInstance: 20,
105
+ maxEventBytes: 4 * 1024
106
+ };
107
+ const statusRef = yield* Ref.make({
108
+ identity,
109
+ status: "creating"
110
+ });
111
+ const initRequired = [];
112
+ const start = [];
113
+ const destroy = [];
114
+ const platformSuspend = [];
115
+ const platformResume = [];
116
+ const platformReset = [];
117
+ const onErrorHandlers = [];
118
+ const getStatus = Ref.get(statusRef);
119
+ const recordPhase = (phase, name, payload) => record({
120
+ type: "lifecycle:phase",
121
+ moduleId: identity.moduleId,
122
+ instanceId: identity.instanceId,
123
+ phase,
124
+ name,
125
+ payload
126
+ });
127
+ const setStatus = (status, patch) => Ref.update(statusRef, (prev) => ({
128
+ ...prev,
129
+ identity: {
130
+ ...prev.identity,
131
+ ...patch?.runtimeLabel ? { runtimeLabel: patch.runtimeLabel } : null
132
+ },
133
+ status,
134
+ ...patch?.initOutcome !== void 0 ? { initOutcome: patch.initOutcome } : null,
135
+ ...patch?.initProgress !== void 0 ? { initProgress: patch.initProgress } : null
136
+ }));
137
+ const registerInitRequired = (effect, options) => {
138
+ const order = initRequired.length;
139
+ initRequired.push({
140
+ taskId: makeTaskId("initRequired", order),
141
+ kind: "initRequired",
142
+ order,
143
+ name: options?.name,
144
+ effect
145
+ });
146
+ };
147
+ const registerStart = (effect, options) => {
148
+ const order = start.length;
149
+ start.push({
150
+ taskId: makeTaskId("start", order),
151
+ kind: "start",
152
+ order,
153
+ name: options?.name,
154
+ fatalOnFailure: options?.fatalOnFailure,
155
+ effect
156
+ });
157
+ };
158
+ const registerDestroy = (effect, options) => {
159
+ const order = destroy.length;
160
+ destroy.push({
161
+ taskId: makeTaskId("destroy", order),
162
+ kind: "destroy",
163
+ order,
164
+ name: options?.name,
165
+ effect
166
+ });
167
+ };
168
+ const registerOnError = (handler) => {
169
+ onErrorHandlers.push(handler);
170
+ };
171
+ const registerPlatformSuspend = (effect, options) => {
172
+ const order = platformSuspend.length;
173
+ platformSuspend.push({
174
+ taskId: makeTaskId("platformSuspend", order),
175
+ kind: "platformSuspend",
176
+ order,
177
+ name: options?.name,
178
+ effect
179
+ });
180
+ };
181
+ const registerPlatformResume = (effect, options) => {
182
+ const order = platformResume.length;
183
+ platformResume.push({
184
+ taskId: makeTaskId("platformResume", order),
185
+ kind: "platformResume",
186
+ order,
187
+ name: options?.name,
188
+ effect
189
+ });
190
+ };
191
+ const registerPlatformReset = (effect, options) => {
192
+ const order = platformReset.length;
193
+ platformReset.push({
194
+ taskId: makeTaskId("platformReset", order),
195
+ kind: "platformReset",
196
+ order,
197
+ name: options?.name,
198
+ effect
199
+ });
200
+ };
201
+ const notifyError = (cause, context) => {
202
+ if (Cause.isInterrupted(cause)) {
203
+ return Effect.void;
204
+ }
205
+ return record({
206
+ type: "lifecycle:error",
207
+ moduleId: context.moduleId,
208
+ instanceId: context.instanceId,
209
+ cause,
210
+ phase: context.phase,
211
+ hook: context.hook,
212
+ taskId: context.taskId,
213
+ txnSeq: context.txnSeq,
214
+ opSeq: context.opSeq,
215
+ origin: context.origin
216
+ }).pipe(
217
+ Effect.zipRight(
218
+ Effect.forEach(
219
+ onErrorHandlers,
220
+ (handler) => handler(cause, context).pipe(
221
+ Effect.catchAllCause((inner) => Effect.logError(`[lifecycle.onError] failed: ${Cause.pretty(inner)}`))
222
+ ),
223
+ { discard: true }
224
+ )
225
+ )
226
+ );
227
+ };
228
+ const runInitRequired = Effect.gen(function* () {
229
+ const total = initRequired.length;
230
+ if (total === 0) {
231
+ yield* setStatus("ready", {
232
+ initProgress: { total: 0, completed: 0 },
233
+ initOutcome: { status: "success" }
234
+ });
235
+ return;
236
+ }
237
+ const startedAt = Date.now();
238
+ yield* recordPhase("init", "initRequired:start", { total });
239
+ yield* setStatus("initializing", {
240
+ initProgress: { total, completed: 0, current: 0, startedAt }
241
+ });
242
+ let completed = 0;
243
+ for (let i = 0; i < initRequired.length; i++) {
244
+ yield* setStatus("initializing", {
245
+ initProgress: { total, completed, current: i, startedAt }
246
+ });
247
+ const task = initRequired[i];
248
+ const exit = yield* Effect.exit(task.effect);
249
+ if (exit._tag === "Success") {
250
+ completed += 1;
251
+ yield* setStatus("initializing", {
252
+ initProgress: { total, completed, current: i + 1, startedAt }
253
+ });
254
+ continue;
255
+ }
256
+ const summary = toSerializableErrorSummary(exit.cause);
257
+ yield* notifyError(exit.cause, {
258
+ phase: "init",
259
+ hook: "initRequired",
260
+ moduleId: identity.moduleId,
261
+ instanceId: identity.instanceId,
262
+ taskId: task.taskId,
263
+ origin: "initRequired"
264
+ });
265
+ yield* setStatus("failed", {
266
+ initProgress: { total, completed, current: i, startedAt },
267
+ initOutcome: { status: "failure", error: summary.errorSummary }
268
+ });
269
+ return yield* Effect.failCause(exit.cause);
270
+ }
271
+ yield* recordPhase("init", "initRequired:success", { total });
272
+ yield* setStatus("ready", {
273
+ initProgress: { total, completed, current: total, startedAt },
274
+ initOutcome: { status: "success" }
275
+ });
276
+ });
277
+ const runStart = recordPhase("run", "start:schedule", {
278
+ total: start.length
279
+ }).pipe(
280
+ Effect.zipRight(
281
+ Effect.forEach(
282
+ start,
283
+ (task) => Effect.forkScoped(
284
+ task.effect.pipe(
285
+ Effect.catchAllCause(
286
+ (cause) => notifyError(cause, {
287
+ phase: "run",
288
+ hook: "start",
289
+ moduleId: identity.moduleId,
290
+ instanceId: identity.instanceId,
291
+ taskId: task.taskId,
292
+ origin: "start"
293
+ })
294
+ )
295
+ )
296
+ ).pipe(Effect.asVoid),
297
+ { discard: true, concurrency: "unbounded" }
298
+ )
299
+ )
300
+ );
301
+ const runDestroy = Effect.gen(function* () {
302
+ yield* recordPhase("destroy", "destroy:start", { total: destroy.length });
303
+ yield* setStatus("terminating");
304
+ for (let i = destroy.length - 1; i >= 0; i--) {
305
+ const task = destroy[i];
306
+ yield* safeRun(
307
+ "lifecycle.onDestroy",
308
+ task.effect.pipe(
309
+ Effect.catchAllCause(
310
+ (cause) => notifyError(cause, {
311
+ phase: "destroy",
312
+ hook: "destroy",
313
+ moduleId: identity.moduleId,
314
+ instanceId: identity.instanceId,
315
+ taskId: task.taskId,
316
+ origin: "destroy"
317
+ })
318
+ )
319
+ )
320
+ );
321
+ }
322
+ yield* setStatus("terminated");
323
+ yield* recordPhase("destroy", "destroy:done", { total: destroy.length });
324
+ });
325
+ const runPlatformSuspend = Effect.gen(function* () {
326
+ if (platformSuspend.length === 0) return;
327
+ yield* recordPhase("platform", "signal:suspend", { total: platformSuspend.length });
328
+ for (const task of platformSuspend) {
329
+ yield* safeRun(
330
+ "lifecycle.onSuspend",
331
+ task.effect.pipe(
332
+ Effect.catchAllCause(
333
+ (cause) => notifyError(cause, {
334
+ phase: "platform",
335
+ hook: "suspend",
336
+ moduleId: identity.moduleId,
337
+ instanceId: identity.instanceId,
338
+ taskId: task.taskId,
339
+ origin: "platform.suspend"
340
+ })
341
+ )
342
+ )
343
+ );
344
+ }
345
+ });
346
+ const runPlatformResume = Effect.gen(function* () {
347
+ if (platformResume.length === 0) return;
348
+ yield* recordPhase("platform", "signal:resume", { total: platformResume.length });
349
+ for (const task of platformResume) {
350
+ yield* safeRun(
351
+ "lifecycle.onResume",
352
+ task.effect.pipe(
353
+ Effect.catchAllCause(
354
+ (cause) => notifyError(cause, {
355
+ phase: "platform",
356
+ hook: "resume",
357
+ moduleId: identity.moduleId,
358
+ instanceId: identity.instanceId,
359
+ taskId: task.taskId,
360
+ origin: "platform.resume"
361
+ })
362
+ )
363
+ )
364
+ );
365
+ }
366
+ });
367
+ const runPlatformReset = Effect.gen(function* () {
368
+ if (platformReset.length === 0) return;
369
+ yield* recordPhase("platform", "signal:reset", { total: platformReset.length });
370
+ for (const task of platformReset) {
371
+ yield* safeRun(
372
+ "lifecycle.onReset",
373
+ task.effect.pipe(
374
+ Effect.catchAllCause(
375
+ (cause) => notifyError(cause, {
376
+ phase: "platform",
377
+ hook: "reset",
378
+ moduleId: identity.moduleId,
379
+ instanceId: identity.instanceId,
380
+ taskId: task.taskId,
381
+ origin: "platform.reset"
382
+ })
383
+ )
384
+ )
385
+ );
386
+ }
387
+ });
388
+ const getTaskSnapshot = Effect.sync(() => ({
389
+ initRequired: initRequired.map(({ effect: _eff, ...rest }) => rest),
390
+ start: start.map(({ effect: _eff, ...rest }) => rest),
391
+ destroy: destroy.map(({ effect: _eff, ...rest }) => rest),
392
+ platformSuspend: platformSuspend.map(({ effect: _eff, ...rest }) => rest),
393
+ platformResume: platformResume.map(({ effect: _eff, ...rest }) => rest),
394
+ platformReset: platformReset.map(({ effect: _eff, ...rest }) => rest)
395
+ }));
396
+ const hasOnErrorHandlers = Effect.sync(() => onErrorHandlers.length > 0);
397
+ return {
398
+ identity,
399
+ budgets,
400
+ registerPlatformSuspend,
401
+ registerPlatformResume,
402
+ registerPlatformReset,
403
+ registerInitRequired,
404
+ registerStart,
405
+ registerDestroy,
406
+ registerOnError,
407
+ getStatus,
408
+ setStatus,
409
+ notifyError,
410
+ runPlatformSuspend,
411
+ runPlatformResume,
412
+ runPlatformReset,
413
+ runInitRequired,
414
+ runStart,
415
+ runDestroy,
416
+ hasOnErrorHandlers,
417
+ getTaskSnapshot
418
+ };
419
+ });
420
+
421
+ // ../logix-core/src/internal/runtime/core/LogicDiagnostics.ts
422
+ import { Cause as Cause2, Context as Context2, Effect as Effect2 } from "../effect.js";
423
+ var phaseDiagnosticsEnabled = () => isDevEnv();
424
+ var SERVICE_NOT_FOUND_PREFIX = "Service not found:";
425
+ var emitEnvServiceNotFoundDiagnosticIfNeeded = (cause, moduleId) => Effect2.gen(function* () {
426
+ let pretty;
427
+ try {
428
+ pretty = Cause2.pretty(cause, { renderErrorCause: true });
429
+ } catch {
430
+ return;
431
+ }
432
+ if (!pretty.includes(SERVICE_NOT_FOUND_PREFIX)) {
433
+ return;
434
+ }
435
+ yield* record({
436
+ type: "diagnostic",
437
+ moduleId,
438
+ code: "logic::env_service_not_found",
439
+ severity: "warning",
440
+ message: pretty,
441
+ hint: "Logic attempted to access an Env service before it was provided. This is a known initialization timing noise in Runtime/React integration. If it happens once during early startup and everything works afterward, it's likely harmless; if it persists or correlates with app issues, verify Runtime.make / RuntimeProvider.layer provides the service."
442
+ });
443
+ yield* record({
444
+ type: "diagnostic",
445
+ moduleId,
446
+ code: "logic::invalid_phase",
447
+ severity: "error",
448
+ message: "$.use is not allowed before Env is fully ready.",
449
+ hint: "Avoid reading services during setup or before Env is ready; move Env access to the Logic run section, or wrap init via $.lifecycle.onInitRequired.",
450
+ kind: "env_service_not_ready"
451
+ });
452
+ });
453
+ var LogicPhaseServiceTag = Context2.GenericTag("@logixjs/LogicPhaseService");
454
+ var LogicUnitServiceTag = class extends Context2.Tag("@logixjs/LogicUnitService")() {
455
+ };
456
+ var makeLogicPhaseError = (kind, api, phase, moduleId) => Object.assign(new Error(`[LogicPhaseError] ${api} is not allowed in ${phase} phase (kind=${kind}).`), {
457
+ _tag: "LogicPhaseError",
458
+ kind,
459
+ api,
460
+ phase,
461
+ moduleId
462
+ });
463
+ var emitInvalidPhaseDiagnosticIfNeeded = (cause, moduleId) => Effect2.gen(function* () {
464
+ if (!phaseDiagnosticsEnabled()) {
465
+ return;
466
+ }
467
+ const allErrors = [...Cause2.failures(cause), ...Cause2.defects(cause)];
468
+ for (const err of allErrors) {
469
+ const logicErr = err;
470
+ if (logicErr && logicErr._tag === "LogicPhaseError") {
471
+ const phaseErr = logicErr;
472
+ const hint = phaseErr.kind === "use_in_setup" || phaseErr.kind === "lifecycle_in_setup" ? "The setup phase must not read Env/services or run long-lived logic; move the relevant calls to the run phase." : phaseErr.kind === "lifecycle_in_run" ? "Do not register $.lifecycle.* in the run phase (setup-only). Move lifecycle registrations to the synchronous part of Module.logic builder (before return)." : phaseErr.kind === "traits_in_run" || phaseErr.kind === "traits_declare_in_run" ? "Traits are frozen after setup; move $.traits.declare to LogicPlan.setup or the setup registration phase of Module.logic builder." : "Move logic to the run phase; keep setup for registrations only.";
473
+ yield* record({
474
+ type: "diagnostic",
475
+ moduleId: phaseErr.moduleId ?? moduleId,
476
+ code: "logic::invalid_phase",
477
+ severity: "error",
478
+ message: `${phaseErr.api ?? phaseErr.kind} is not allowed in ${phaseErr.phase} phase.`,
479
+ hint,
480
+ kind: phaseErr.kind
481
+ });
482
+ return;
483
+ }
484
+ }
485
+ });
486
+
487
+ // ../logix-core/src/internal/runtime/core/BoundApiRuntime.ts
488
+ var LogicBuilderFactory = (runtime, runtimeInternals) => {
489
+ const flowApi = make(runtime, runtimeInternals);
490
+ return (stream, triggerName) => {
491
+ const runWithStateTransaction = (origin, body) => runtimeInternals.txn.runWithStateTransaction(origin, body);
492
+ const taskRunnerRuntime = {
493
+ moduleId: runtime.moduleId,
494
+ instanceId: runtimeInternals.instanceId,
495
+ runWithStateTransaction,
496
+ resolveConcurrencyPolicy: runtimeInternals.concurrency.resolveConcurrencyPolicy
497
+ };
498
+ const builder = {
499
+ debounce: (ms) => LogicBuilderFactory(runtime, runtimeInternals)(flowApi.debounce(ms)(stream), triggerName),
500
+ throttle: (ms) => LogicBuilderFactory(runtime, runtimeInternals)(flowApi.throttle(ms)(stream), triggerName),
501
+ filter: (predicate) => LogicBuilderFactory(runtime, runtimeInternals)(flowApi.filter(predicate)(stream), triggerName),
502
+ map: (f) => LogicBuilderFactory(runtime, runtimeInternals)(stream.pipe(Stream.map(f)), triggerName),
503
+ run(eff, options) {
504
+ return flowApi.run(eff, options)(stream);
505
+ },
506
+ runLatest(eff, options) {
507
+ return flowApi.runLatest(eff, options)(stream);
508
+ },
509
+ runExhaust(eff, options) {
510
+ return flowApi.runExhaust(eff, options)(stream);
511
+ },
512
+ runParallel(eff, options) {
513
+ return flowApi.runParallel(eff, options)(stream);
514
+ },
515
+ runFork: (eff) => Effect3.forkScoped(flowApi.run(eff)(stream)).pipe(Effect3.asVoid),
516
+ runParallelFork: (eff) => Effect3.forkScoped(flowApi.runParallel(eff)(stream)).pipe(Effect3.asVoid),
517
+ runTask: (config) => makeTaskRunner(stream, "task", taskRunnerRuntime, {
518
+ ...config,
519
+ triggerName: config.triggerName ?? triggerName
520
+ }),
521
+ runParallelTask: (config) => makeTaskRunner(stream, "parallel", taskRunnerRuntime, {
522
+ ...config,
523
+ triggerName: config.triggerName ?? triggerName
524
+ }),
525
+ runLatestTask: (config) => makeTaskRunner(stream, "latest", taskRunnerRuntime, {
526
+ ...config,
527
+ triggerName: config.triggerName ?? triggerName
528
+ }),
529
+ runExhaustTask: (config) => makeTaskRunner(stream, "exhaust", taskRunnerRuntime, {
530
+ ...config,
531
+ triggerName: config.triggerName ?? triggerName
532
+ }),
533
+ toStream: () => stream,
534
+ update: (reducer) => Stream.runForEach(
535
+ stream,
536
+ (payload) => taskRunnerRuntime.runWithStateTransaction(
537
+ {
538
+ kind: "watcher:update",
539
+ name: triggerName
540
+ },
541
+ () => Effect3.gen(function* () {
542
+ const prev = yield* runtime.getState;
543
+ const next = reducer(prev, payload);
544
+ if (Effect3.isEffect(next)) {
545
+ const exit = yield* Effect3.exit(next);
546
+ if (exit._tag === "Failure") {
547
+ yield* Effect3.logError("Flow error", exit.cause);
548
+ return;
549
+ }
550
+ yield* runtime.setState(exit.value);
551
+ return;
552
+ }
553
+ yield* runtime.setState(next);
554
+ })
555
+ )
556
+ ).pipe(Effect3.catchAllCause((cause) => Effect3.logError("Flow error", cause))),
557
+ mutate: (reducer) => Stream.runForEach(
558
+ stream,
559
+ (payload) => taskRunnerRuntime.runWithStateTransaction(
560
+ {
561
+ kind: "watcher:mutate",
562
+ name: triggerName
563
+ },
564
+ () => Effect3.gen(function* () {
565
+ const prev = yield* runtime.getState;
566
+ const recordPatch = runtimeInternals.txn.recordStatePatch;
567
+ const updateDraft = runtimeInternals.txn.updateDraft;
568
+ const { nextState, patchPaths } = mutateWithPatchPaths(prev, (draft) => {
569
+ reducer(draft, payload);
570
+ });
571
+ for (const path of patchPaths) {
572
+ recordPatch(path, "unknown");
573
+ }
574
+ updateDraft(nextState);
575
+ })
576
+ )
577
+ ).pipe(Effect3.catchAllCause((cause) => Effect3.logError("Flow error", cause)))
578
+ };
579
+ const pipe = function() {
580
+ const fns = arguments;
581
+ let acc = builder;
582
+ for (let i = 0; i < fns.length; i++) {
583
+ acc = fns[i](acc);
584
+ }
585
+ return acc;
586
+ };
587
+ return Object.assign(builder, { pipe });
588
+ };
589
+ };
590
+ function make2(shape, runtime, options) {
591
+ const runtimeInternals = getRuntimeInternals(runtime);
592
+ const getPhase = options?.getPhase ?? (() => "run");
593
+ const getCurrentPhase = () => {
594
+ const phaseService = options?.phaseService;
595
+ const phase = phaseService?.current ?? getPhase();
596
+ return phase === "setup" ? "setup" : "run";
597
+ };
598
+ const guardRunOnly = (kind, api2) => {
599
+ const phaseService = options?.phaseService;
600
+ const phase = phaseService?.current ?? getPhase();
601
+ if (phase === "setup") {
602
+ throw makeLogicPhaseError(kind, api2, "setup", options?.moduleId);
603
+ }
604
+ };
605
+ const flowApi = make(runtime, runtimeInternals);
606
+ const makeIntentBuilder = (runtime_) => LogicBuilderFactory(runtime_, runtimeInternals);
607
+ const withLifecycle = (available, missing) => Effect3.serviceOption(LifecycleContext).pipe(
608
+ Effect3.flatMap(
609
+ (maybe) => Option.match(maybe, {
610
+ onSome: available,
611
+ onNone: missing
612
+ })
613
+ )
614
+ );
615
+ const withPlatform = (invoke) => Effect3.serviceOption(Tag).pipe(
616
+ Effect3.flatMap(
617
+ (maybe) => Option.match(maybe, {
618
+ onSome: invoke,
619
+ onNone: () => Effect3.void
620
+ })
621
+ )
622
+ );
623
+ const emitSetupOnlyViolation = (api2) => record({
624
+ type: "diagnostic",
625
+ moduleId: runtime.moduleId,
626
+ instanceId: runtime.instanceId,
627
+ code: "logic::invalid_phase",
628
+ severity: "error",
629
+ message: `${api2} is setup-only and is not allowed in run phase.`,
630
+ hint: "Move $.lifecycle.* calls to the synchronous part of Module.logic builder (before return) for registration; for dynamic resource cleanup in the run phase, use Effect.acquireRelease / Scope finalizer instead of registering onDestroy late.",
631
+ kind: "lifecycle_in_run"
632
+ });
633
+ const createIntentBuilder = (stream, triggerName) => makeIntentBuilder(runtime)(stream, triggerName);
634
+ const onceInRunSession = (key) => Effect3.serviceOption(RunSessionTag).pipe(
635
+ Effect3.map((maybe) => Option.isSome(maybe) ? maybe.value.local.once(key) : true)
636
+ );
637
+ let cachedDiagnosticsLevel;
638
+ const isModuleLike = (value) => Boolean(
639
+ value && typeof value === "object" && (value._kind === "ModuleDef" || value._kind === "Module") && "tag" in value && Context3.isTag(value.tag)
640
+ );
641
+ const buildModuleHandle = (tag, rt) => {
642
+ const actionsProxy = new Proxy(
643
+ {},
644
+ {
645
+ get: (_target, prop) => (payload) => rt.dispatch({
646
+ _tag: prop,
647
+ payload
648
+ })
649
+ }
650
+ );
651
+ const handle = {
652
+ read: (selector) => Effect3.map(rt.getState, selector),
653
+ changes: rt.changes,
654
+ dispatch: rt.dispatch,
655
+ actions$: rt.actions$,
656
+ actions: actionsProxy
657
+ };
658
+ const EXTEND_HANDLE = /* @__PURE__ */ Symbol.for("logix.module.handle.extend");
659
+ const extend = tag?.[EXTEND_HANDLE];
660
+ return typeof extend === "function" ? extend(rt, handle) ?? handle : handle;
661
+ };
662
+ const emitModuleDescriptorOnce = (module, rt) => Effect3.gen(function* () {
663
+ if (cachedDiagnosticsLevel === "off") return;
664
+ const key = `module_descriptor:${String(rt.instanceId ?? "unknown")}`;
665
+ const shouldEmit = yield* onceInRunSession(key);
666
+ if (!shouldEmit) return;
667
+ const actionKeys = Object.keys(module.tag?.shape?.actionMap ?? {});
668
+ const internalSymbol = /* @__PURE__ */ Symbol.for("logix.module.internal");
669
+ const internal = module[internalSymbol];
670
+ const logicUnits = (internal?.mounted ?? []).map((u) => ({
671
+ kind: String(u?.kind ?? "user"),
672
+ id: String(u?.id ?? ""),
673
+ derived: u?.derived ? true : void 0,
674
+ name: typeof u?.name === "string" ? u.name : void 0
675
+ }));
676
+ const schemaKeys = module.schemas && typeof module.schemas === "object" ? Object.keys(module.schemas) : void 0;
677
+ const meta = module.meta && typeof module.meta === "object" ? module.meta : void 0;
678
+ const source = module.dev?.source;
679
+ const traitsSnapshot = runtimeInternals.traits.getModuleTraitsSnapshot();
680
+ const traits = traitsSnapshot ? {
681
+ digest: traitsSnapshot.digest,
682
+ count: traitsSnapshot.traits.length
683
+ } : void 0;
684
+ const data = {
685
+ id: module.id,
686
+ moduleId: String(rt.moduleId),
687
+ instanceId: String(rt.instanceId),
688
+ actionKeys,
689
+ logicUnits,
690
+ schemaKeys,
691
+ meta,
692
+ source,
693
+ traits
694
+ };
695
+ yield* record({
696
+ type: "trace:module:descriptor",
697
+ moduleId: rt.moduleId,
698
+ instanceId: rt.instanceId,
699
+ data
700
+ });
701
+ });
702
+ const resolveModuleRuntime = (tag) => Effect3.gen(function* () {
703
+ const requestedModuleId = typeof tag?.id === "string" ? tag.id : void 0;
704
+ const fromModuleId = typeof options?.moduleId === "string" ? options.moduleId : runtime.moduleId;
705
+ if (requestedModuleId && requestedModuleId === runtime.moduleId) {
706
+ return runtime;
707
+ }
708
+ const fromImports = runtimeInternals.imports.get(tag);
709
+ if (fromImports) {
710
+ return fromImports;
711
+ }
712
+ if (typeof options?.moduleId !== "string") {
713
+ const fromEnv = yield* Effect3.serviceOption(tag);
714
+ if (Option.isSome(fromEnv)) {
715
+ return fromEnv.value;
716
+ }
717
+ }
718
+ const tokenId = requestedModuleId ?? "<unknown module id>";
719
+ const fix = isDevEnv() ? [
720
+ "- Provide the child implementation in the same scope (imports).",
721
+ ` Example: ${fromModuleId ?? "ParentModule"}.implement({ imports: [${requestedModuleId ?? "ChildModule"}.impl], ... })`,
722
+ "- If you intentionally want a root singleton, provide it at app root (Runtime.make(...,{ layer }) / root imports),",
723
+ " and use Root.resolve(ModuleTag) (instead of $.use) at the callsite."
724
+ ] : [];
725
+ const err = new Error(
726
+ isDevEnv() ? [
727
+ "[MissingModuleRuntimeError] Cannot resolve ModuleRuntime for ModuleTag.",
728
+ "",
729
+ `tokenId: ${tokenId}`,
730
+ "entrypoint: logic.$.use",
731
+ "mode: strict",
732
+ `from: ${fromModuleId ?? "<unknown module id>"}`,
733
+ `startScope: moduleId=${fromModuleId ?? "<unknown>"}, instanceId=${String(runtime.instanceId ?? "<unknown>")}`,
734
+ "",
735
+ "fix:",
736
+ ...fix
737
+ ].join("\n") : "[MissingModuleRuntimeError] module runtime not found"
738
+ );
739
+ err.tokenId = tokenId;
740
+ err.entrypoint = "logic.$.use";
741
+ err.mode = "strict";
742
+ err.from = fromModuleId;
743
+ err.startScope = {
744
+ moduleId: fromModuleId,
745
+ instanceId: String(runtime.instanceId ?? "<unknown>")
746
+ };
747
+ err.fix = fix;
748
+ err.name = "MissingModuleRuntimeError";
749
+ return yield* Effect3.die(err);
750
+ });
751
+ const stateApi = {
752
+ read: runtime.getState,
753
+ update: (f) => Effect3.gen(function* () {
754
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
755
+ if (inTxn) {
756
+ const prev = yield* runtime.getState;
757
+ return yield* runtime.setState(f(prev));
758
+ }
759
+ const body = () => Effect3.flatMap(runtime.getState, (prev) => runtime.setState(f(prev)));
760
+ return yield* runtimeInternals ? runtimeInternals.txn.runWithStateTransaction({ kind: "state", name: "update" }, body) : body();
761
+ }),
762
+ mutate: (f) => Effect3.gen(function* () {
763
+ const recordPatch = runtimeInternals?.txn.recordStatePatch;
764
+ const updateDraft = runtimeInternals?.txn.updateDraft;
765
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
766
+ if (inTxn) {
767
+ const prev = yield* runtime.getState;
768
+ const { nextState, patchPaths } = mutateWithPatchPaths(prev, (draft) => {
769
+ f(draft);
770
+ });
771
+ for (const path of patchPaths) {
772
+ recordPatch?.(path, "unknown");
773
+ }
774
+ updateDraft?.(nextState);
775
+ return;
776
+ }
777
+ const body = () => Effect3.gen(function* () {
778
+ const prev = yield* runtime.getState;
779
+ const { nextState, patchPaths } = mutateWithPatchPaths(prev, (draft) => {
780
+ f(draft);
781
+ });
782
+ for (const path of patchPaths) {
783
+ recordPatch?.(path, "unknown");
784
+ }
785
+ updateDraft?.(nextState);
786
+ });
787
+ return yield* runtimeInternals ? runtimeInternals.txn.runWithStateTransaction({ kind: "state", name: "mutate" }, body) : body();
788
+ }),
789
+ ref: runtime.ref
790
+ };
791
+ const actions = shape.actionMap;
792
+ const dispatcherCache = /* @__PURE__ */ new Map();
793
+ const hasAction = (key) => Object.prototype.hasOwnProperty.call(actions, key);
794
+ const dispatchers = new Proxy({}, {
795
+ get: (_target, prop) => {
796
+ if (typeof prop !== "string") return void 0;
797
+ if (!hasAction(prop)) return void 0;
798
+ const cached = dispatcherCache.get(prop);
799
+ if (cached) return cached;
800
+ const token = actions[prop];
801
+ const fn = (...args) => runtime.dispatch(token(...args));
802
+ dispatcherCache.set(prop, fn);
803
+ return fn;
804
+ },
805
+ has: (_target, prop) => typeof prop === "string" && hasAction(prop),
806
+ ownKeys: () => Object.keys(actions),
807
+ getOwnPropertyDescriptor: (_target, prop) => {
808
+ if (typeof prop !== "string") return void 0;
809
+ if (!hasAction(prop)) return void 0;
810
+ return { enumerable: true, configurable: true };
811
+ }
812
+ });
813
+ const dispatch = (...args) => {
814
+ const [first, second] = args;
815
+ if (typeof first === "string") {
816
+ return runtime.dispatch({ _tag: first, payload: second });
817
+ }
818
+ if (isActionToken(first)) {
819
+ return runtime.dispatch(first(second));
820
+ }
821
+ return runtime.dispatch(first);
822
+ };
823
+ const matchApi = (value) => makeMatch(value);
824
+ const matchTagApi = (value) => makeMatchTag(value);
825
+ const reducer = (tag, fn) => {
826
+ return Effect3.sync(() => {
827
+ runtimeInternals.txn.registerReducer(String(tag), fn);
828
+ });
829
+ };
830
+ const effect = (token, handler) => Effect3.gen(function* () {
831
+ if (!isActionToken(token)) {
832
+ return yield* Effect3.dieMessage("[BoundApi.effect] token must be an ActionToken");
833
+ }
834
+ const phase = getCurrentPhase();
835
+ const logicUnit = options?.logicUnit;
836
+ yield* runtimeInternals.effects.registerEffect({
837
+ actionTag: token.tag,
838
+ handler,
839
+ phase,
840
+ ...logicUnit ? {
841
+ logicUnit: {
842
+ logicUnitId: logicUnit.logicUnitId,
843
+ logicUnitLabel: logicUnit.logicUnitLabel,
844
+ path: logicUnit.path
845
+ }
846
+ } : {}
847
+ });
848
+ });
849
+ const api = {
850
+ root: {
851
+ resolve: (tag) => {
852
+ guardRunOnly("root_resolve_in_setup", "$.root.resolve");
853
+ return resolve(tag, {
854
+ entrypoint: "logic.$.root.resolve",
855
+ waitForReady: true
856
+ });
857
+ }
858
+ },
859
+ state: stateApi,
860
+ actions,
861
+ dispatchers,
862
+ dispatch,
863
+ flow: flowApi,
864
+ match: matchApi,
865
+ matchTag: matchTagApi,
866
+ lifecycle: {
867
+ onInitRequired: (eff) => {
868
+ if (getCurrentPhase() === "run") {
869
+ return emitSetupOnlyViolation("$.lifecycle.onInitRequired");
870
+ }
871
+ runtimeInternals.lifecycle.registerInitRequired(eff);
872
+ return Effect3.void;
873
+ },
874
+ onStart: (eff) => {
875
+ if (getCurrentPhase() === "run") {
876
+ return emitSetupOnlyViolation("$.lifecycle.onStart");
877
+ }
878
+ runtimeInternals.lifecycle.registerStart(eff);
879
+ return Effect3.void;
880
+ },
881
+ onInit: (eff) => {
882
+ if (getCurrentPhase() === "run") {
883
+ return emitSetupOnlyViolation("$.lifecycle.onInit");
884
+ }
885
+ runtimeInternals.lifecycle.registerInitRequired(eff);
886
+ return Effect3.void;
887
+ },
888
+ onDestroy: (eff) => {
889
+ if (getCurrentPhase() === "run") {
890
+ return emitSetupOnlyViolation("$.lifecycle.onDestroy");
891
+ }
892
+ runtimeInternals.lifecycle.registerDestroy(eff);
893
+ return Effect3.void;
894
+ },
895
+ onError: (handler) => {
896
+ if (getCurrentPhase() === "run") {
897
+ return emitSetupOnlyViolation("$.lifecycle.onError");
898
+ }
899
+ runtimeInternals.lifecycle.registerOnError(handler);
900
+ return Effect3.void;
901
+ },
902
+ onSuspend: (eff) => {
903
+ if (getCurrentPhase() === "run") {
904
+ return emitSetupOnlyViolation("$.lifecycle.onSuspend");
905
+ }
906
+ runtimeInternals.lifecycle.registerPlatformSuspend(Effect3.asVoid(eff));
907
+ return Effect3.void;
908
+ },
909
+ onResume: (eff) => {
910
+ if (getCurrentPhase() === "run") {
911
+ return emitSetupOnlyViolation("$.lifecycle.onResume");
912
+ }
913
+ runtimeInternals.lifecycle.registerPlatformResume(Effect3.asVoid(eff));
914
+ return Effect3.void;
915
+ },
916
+ onReset: (eff) => {
917
+ if (getCurrentPhase() === "run") {
918
+ return emitSetupOnlyViolation("$.lifecycle.onReset");
919
+ }
920
+ runtimeInternals.lifecycle.registerPlatformReset(Effect3.asVoid(eff));
921
+ return Effect3.void;
922
+ }
923
+ },
924
+ traits: {
925
+ declare: (traits) => {
926
+ if (getCurrentPhase() === "run") {
927
+ throw makeLogicPhaseError(
928
+ "traits_declare_in_run",
929
+ "$.traits.declare",
930
+ "run",
931
+ options?.moduleId
932
+ );
933
+ }
934
+ if (!traits || typeof traits !== "object") {
935
+ throw new Error("[InvalidTraitsDeclaration] $.traits.declare expects an object.");
936
+ }
937
+ const logicUnit = options?.logicUnit ?? {
938
+ logicUnitId: "unknown",
939
+ logicUnitIdKind: "derived",
940
+ logicUnitLabel: "logicUnit:unknown",
941
+ path: void 0
942
+ };
943
+ runtimeInternals.traits.registerModuleTraitsContribution({
944
+ traits,
945
+ provenance: {
946
+ originType: "logicUnit",
947
+ originId: logicUnit.logicUnitId,
948
+ originIdKind: logicUnit.logicUnitIdKind,
949
+ originLabel: logicUnit.logicUnitLabel,
950
+ path: logicUnit.path
951
+ }
952
+ });
953
+ },
954
+ source: {
955
+ refresh: (fieldPath, options2) => Effect3.gen(function* () {
956
+ const handler = runtimeInternals.traits.getSourceRefreshHandler(fieldPath);
957
+ if (!handler) {
958
+ return yield* Effect3.void;
959
+ }
960
+ const force = options2?.force === true;
961
+ const runHandler = (state) => force ? Effect3.locally(forceSourceRefresh, true)(handler(state)) : handler(state);
962
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
963
+ if (inTxn) {
964
+ const state = yield* runtime.getState;
965
+ return yield* runHandler(state);
966
+ }
967
+ return yield* runtimeInternals.txn.runWithStateTransaction(
968
+ {
969
+ kind: "source-refresh",
970
+ name: fieldPath
971
+ },
972
+ () => Effect3.gen(function* () {
973
+ const state = yield* runtime.getState;
974
+ return yield* runHandler(state);
975
+ })
976
+ );
977
+ })
978
+ }
979
+ },
980
+ reducer,
981
+ effect,
982
+ use: new Proxy(() => {
983
+ }, {
984
+ apply: (_target, _thisArg, [arg]) => {
985
+ guardRunOnly("use_in_setup", "$.use");
986
+ if (isModuleLike(arg)) {
987
+ const domain = arg;
988
+ const tag = domain.tag;
989
+ const resolveAndBuild = resolveModuleRuntime(tag).pipe(Effect3.map((rt) => buildModuleHandle(tag, rt)));
990
+ const resolveWithDescriptor = resolveModuleRuntime(tag).pipe(
991
+ Effect3.tap((rt) => emitModuleDescriptorOnce(domain, rt)),
992
+ Effect3.map((rt) => buildModuleHandle(tag, rt))
993
+ );
994
+ const detectAndSelect = FiberRef.get(currentDiagnosticsLevel).pipe(
995
+ Effect3.tap((level) => {
996
+ cachedDiagnosticsLevel = level;
997
+ }),
998
+ Effect3.flatMap((level) => level === "off" ? resolveAndBuild : resolveWithDescriptor)
999
+ );
1000
+ return Effect3.suspend(() => {
1001
+ if (cachedDiagnosticsLevel === "off") {
1002
+ return resolveAndBuild;
1003
+ }
1004
+ if (cachedDiagnosticsLevel !== void 0) {
1005
+ return resolveWithDescriptor;
1006
+ }
1007
+ return detectAndSelect;
1008
+ });
1009
+ }
1010
+ if (Context3.isTag(arg)) {
1011
+ const candidate = arg;
1012
+ if (candidate._kind === "ModuleTag") {
1013
+ return resolveModuleRuntime(arg).pipe(
1014
+ Effect3.map((rt) => buildModuleHandle(arg, rt))
1015
+ );
1016
+ }
1017
+ return arg;
1018
+ }
1019
+ return Effect3.die("BoundApi.use: unsupported argument");
1020
+ }
1021
+ }),
1022
+ onAction: new Proxy(() => {
1023
+ }, {
1024
+ apply: (_target, _thisArg, args) => {
1025
+ guardRunOnly("use_in_setup", "$.onAction");
1026
+ const arg = args[0];
1027
+ if (isActionToken(arg)) {
1028
+ const tag = arg.tag;
1029
+ return createIntentBuilder(
1030
+ runtime.actions$.pipe(
1031
+ Stream.filter((a) => a._tag === tag || a.type === tag),
1032
+ Stream.map((a) => a.payload)
1033
+ ),
1034
+ tag
1035
+ );
1036
+ }
1037
+ if (typeof arg === "function") {
1038
+ return createIntentBuilder(runtime.actions$.pipe(Stream.filter(arg)));
1039
+ }
1040
+ if (typeof arg === "string") {
1041
+ return createIntentBuilder(
1042
+ runtime.actions$.pipe(Stream.filter((a) => a._tag === arg || a.type === arg)),
1043
+ arg
1044
+ );
1045
+ }
1046
+ if (typeof arg === "object" && arg !== null) {
1047
+ if ("_tag" in arg) {
1048
+ return createIntentBuilder(
1049
+ runtime.actions$.pipe(Stream.filter((a) => a._tag === arg._tag)),
1050
+ String(arg._tag)
1051
+ );
1052
+ }
1053
+ if (Schema.isSchema(arg)) {
1054
+ return createIntentBuilder(
1055
+ runtime.actions$.pipe(
1056
+ Stream.filter((a) => {
1057
+ const result = Schema.decodeUnknownSync(arg)(a);
1058
+ return !!result;
1059
+ })
1060
+ )
1061
+ );
1062
+ }
1063
+ }
1064
+ return createIntentBuilder(runtime.actions$);
1065
+ },
1066
+ get: (_target, prop) => {
1067
+ guardRunOnly("use_in_setup", "$.onAction");
1068
+ if (typeof prop === "string") {
1069
+ return createIntentBuilder(
1070
+ runtime.actions$.pipe(Stream.filter((a) => a._tag === prop || a.type === prop)),
1071
+ prop
1072
+ );
1073
+ }
1074
+ return void 0;
1075
+ }
1076
+ }),
1077
+ onState: (selector) => {
1078
+ guardRunOnly("use_in_setup", "$.onState");
1079
+ return createIntentBuilder(runtime.changes(selector));
1080
+ },
1081
+ on: (stream) => {
1082
+ guardRunOnly("use_in_setup", "$.on");
1083
+ return createIntentBuilder(stream);
1084
+ }
1085
+ };
1086
+ setBoundInternals(api, runtimeInternals);
1087
+ return api;
1088
+ }
1089
+
1090
+ export {
1091
+ mutateWithoutPatches,
1092
+ mutateWithPatchPaths,
1093
+ LifecycleContext,
1094
+ makeLifecycleManager,
1095
+ emitEnvServiceNotFoundDiagnosticIfNeeded,
1096
+ LogicPhaseServiceTag,
1097
+ LogicUnitServiceTag,
1098
+ emitInvalidPhaseDiagnosticIfNeeded,
1099
+ make2 as make
1100
+ };
1101
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL211dGF0aXZlUGF0Y2hlcy50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL2NvcmUvQm91bmRBcGlSdW50aW1lLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3J1bnRpbWUvY29yZS9MaWZlY3ljbGUudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0xvZ2ljRGlhZ25vc3RpY3MudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IGNyZWF0ZSwgdHlwZSBQYXRjaGVzIH0gZnJvbSAnbXV0YXRpdmUnXG5pbXBvcnQgdHlwZSB7IEZpZWxkUGF0aCB9IGZyb20gJy4uLy4uL2ZpZWxkLXBhdGguanMnXG5pbXBvcnQgeyBpc0ZpZWxkUGF0aFNlZ21lbnQgfSBmcm9tICcuLi8uLi9maWVsZC1wYXRoLmpzJ1xuXG5leHBvcnQgdHlwZSBQYXRjaFBhdGggPSBGaWVsZFBhdGhcblxuZXhwb3J0IGNvbnN0IG11dGF0ZVdpdGhvdXRQYXRjaGVzID0gPFM+KGJhc2U6IFMsIG11dGF0b3I6IChkcmFmdDogUykgPT4gdm9pZCk6IFMgPT4ge1xuICByZXR1cm4gY3JlYXRlKGJhc2UsIG11dGF0b3IgYXMgYW55KSBhcyB1bmtub3duIGFzIFNcbn1cblxuY29uc3QgdG9QYXRjaEZpZWxkUGF0aCA9IChwYXRoOiB1bmtub3duKTogUGF0Y2hQYXRoIHwgJyonIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSBwYXRoLnRyaW0oKVxuICAgIHJldHVybiB0cmltbWVkLmxlbmd0aCA+IDAgPyAnKicgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShwYXRoKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IHBhcnRzOiBBcnJheTxzdHJpbmc+ID0gW11cbiAgZm9yIChjb25zdCBzZWcgb2YgcGF0aCkge1xuICAgIGlmICh0eXBlb2Ygc2VnID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGlzRmllbGRQYXRoU2VnbWVudChzZWcpKSBwYXJ0cy5wdXNoKHNlZylcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICB9XG5cbiAgaWYgKHBhcnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcqJ1xuICByZXR1cm4gcGFydHNcbn1cblxuZXhwb3J0IGNvbnN0IG11dGF0ZVdpdGhQYXRjaFBhdGhzID0gPFM+KFxuICBiYXNlOiBTLFxuICBtdXRhdG9yOiAoZHJhZnQ6IFMpID0+IHZvaWQsXG4pOiB7IHJlYWRvbmx5IG5leHRTdGF0ZTogUzsgcmVhZG9ubHkgcGF0Y2hQYXRoczogUmVhZG9ubHlBcnJheTxQYXRjaFBhdGggfCAnKic+IH0gPT4ge1xuICBjb25zdCBvdXQgPSBjcmVhdGUoYmFzZSwgbXV0YXRvciBhcyBhbnksIHtcbiAgICBlbmFibGVQYXRjaGVzOiB7XG4gICAgICBwYXRoQXNBcnJheTogdHJ1ZSxcbiAgICAgIGFycmF5TGVuZ3RoQXNzaWdubWVudDogZmFsc2UsXG4gICAgfSxcbiAgfSkgYXMgdW5rbm93blxuXG4gIGlmICghQXJyYXkuaXNBcnJheShvdXQpKSB7XG4gICAgcmV0dXJuIHsgbmV4dFN0YXRlOiBvdXQgYXMgUywgcGF0Y2hQYXRoczogW10gfVxuICB9XG5cbiAgY29uc3QgbmV4dFN0YXRlID0gb3V0WzBdIGFzIFNcbiAgY29uc3QgcGF0Y2hlcyA9IChvdXRbMV0gPz8gW10pIGFzIFBhdGNoZXM8eyBwYXRoQXNBcnJheTogdHJ1ZTsgYXJyYXlMZW5ndGhBc3NpZ25tZW50OiBmYWxzZSB9PlxuXG4gIGNvbnN0IGRlZHVwID0gbmV3IE1hcDxzdHJpbmcsIFBhdGNoUGF0aCB8ICcqJz4oKVxuICBmb3IgKGNvbnN0IHBhdGNoIG9mIHBhdGNoZXMpIHtcbiAgICBjb25zdCBwID0gdG9QYXRjaEZpZWxkUGF0aCgocGF0Y2ggYXMgYW55KT8ucGF0aClcbiAgICBpZiAoIXApIGNvbnRpbnVlXG4gICAgY29uc3Qga2V5ID0gcCA9PT0gJyonID8gJyonIDogSlNPTi5zdHJpbmdpZnkocClcbiAgICBpZiAoIWRlZHVwLmhhcyhrZXkpKSBkZWR1cC5zZXQoa2V5LCBwKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuZXh0U3RhdGUsXG4gICAgcGF0Y2hQYXRoczogQXJyYXkuZnJvbShkZWR1cC52YWx1ZXMoKSksXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDb250ZXh0LCBFZmZlY3QsIEZpYmVyUmVmLCBPcHRpb24sIFNjaGVtYSwgU3RyZWFtLCBTdWJzY3JpcHRpb25SZWYgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tICdtdXRhdGl2ZSdcbmltcG9ydCB0eXBlICogYXMgTG9naXggZnJvbSAnLi9tb2R1bGUuanMnXG5pbXBvcnQgKiBhcyBMb2dpYyBmcm9tICcuL0xvZ2ljTWlkZGxld2FyZS5qcydcbmltcG9ydCAqIGFzIEFjdGlvbiBmcm9tICcuLi8uLi9hY3Rpb24uanMnXG5pbXBvcnQgKiBhcyBUYXNrUnVubmVyIGZyb20gJy4vVGFza1J1bm5lci5qcydcbmltcG9ydCB7IG11dGF0ZVdpdGhQYXRjaFBhdGhzIH0gZnJvbSAnLi9tdXRhdGl2ZVBhdGNoZXMuanMnXG5pbXBvcnQgKiBhcyBGbG93UnVudGltZSBmcm9tICcuL0Zsb3dSdW50aW1lLmpzJ1xuaW1wb3J0ICogYXMgTWF0Y2hCdWlsZGVyIGZyb20gJy4vTWF0Y2hCdWlsZGVyLmpzJ1xuaW1wb3J0ICogYXMgUGxhdGZvcm0gZnJvbSAnLi9QbGF0Zm9ybS5qcydcbmltcG9ydCAqIGFzIExpZmVjeWNsZSBmcm9tICcuL0xpZmVjeWNsZS5qcydcbmltcG9ydCAqIGFzIERlYnVnIGZyb20gJy4vRGVidWdTaW5rLmpzJ1xuaW1wb3J0ICogYXMgTG9naWNEaWFnbm9zdGljcyBmcm9tICcuL0xvZ2ljRGlhZ25vc3RpY3MuanMnXG5pbXBvcnQgeyBpc0RldkVudiB9IGZyb20gJy4vZW52LmpzJ1xuaW1wb3J0IHR5cGUgeyBKc29uVmFsdWUgfSBmcm9tICcuLi8uLi9vYnNlcnZhYmlsaXR5L2pzb25WYWx1ZS5qcydcbmltcG9ydCB7IFJ1blNlc3Npb25UYWcgfSBmcm9tICcuLi8uLi9vYnNlcnZhYmlsaXR5L3J1blNlc3Npb24uanMnXG5pbXBvcnQgKiBhcyBSb290IGZyb20gJy4uLy4uL3Jvb3QuanMnXG5pbXBvcnQgdHlwZSB7IFJ1bnRpbWVJbnRlcm5hbHMgfSBmcm9tICcuL1J1bnRpbWVJbnRlcm5hbHMuanMnXG5pbXBvcnQgdHlwZSAqIGFzIE1vZHVsZVRyYWl0cyBmcm9tICcuL01vZHVsZVRyYWl0cy5qcydcbmltcG9ydCB7IGdldFJ1bnRpbWVJbnRlcm5hbHMsIHNldEJvdW5kSW50ZXJuYWxzIH0gZnJvbSAnLi9ydW50aW1lSW50ZXJuYWxzQWNjZXNzb3IuanMnXG5pbXBvcnQgdHlwZSB7IEFueU1vZHVsZVNoYXBlLCBNb2R1bGVSdW50aW1lLCBTdGF0ZU9mLCBBY3Rpb25PZiB9IGZyb20gJy4vbW9kdWxlLmpzJ1xuXG4vLyBMb2NhbCBJbnRlbnRCdWlsZGVyIGZhY3Rvcnk7IGVxdWl2YWxlbnQgdG8gdGhlIG9sZCBpbnRlcm5hbC9kc2wvTG9naWNCdWlsZGVyLm1ha2VJbnRlbnRCdWlsZGVyRmFjdG9yeS5cbmNvbnN0IExvZ2ljQnVpbGRlckZhY3RvcnkgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZSwgUiA9IG5ldmVyPihcbiAgcnVudGltZTogTW9kdWxlUnVudGltZTxTdGF0ZU9mPFNoPiwgQWN0aW9uT2Y8U2g+PixcbiAgcnVudGltZUludGVybmFsczogUnVudGltZUludGVybmFscyxcbikgPT4ge1xuICBjb25zdCBmbG93QXBpID0gRmxvd1J1bnRpbWUubWFrZTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscylcblxuICByZXR1cm4gPFQ+KHN0cmVhbTogU3RyZWFtLlN0cmVhbTxUPiwgdHJpZ2dlck5hbWU/OiBzdHJpbmcpOiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPiA9PiB7XG4gICAgY29uc3QgcnVuV2l0aFN0YXRlVHJhbnNhY3Rpb246IFRhc2tSdW5uZXIuVGFza1J1bm5lclJ1bnRpbWVbJ3J1bldpdGhTdGF0ZVRyYW5zYWN0aW9uJ10gPSAob3JpZ2luLCBib2R5KSA9PlxuICAgICAgcnVudGltZUludGVybmFscy50eG4ucnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24ob3JpZ2luIGFzIGFueSwgYm9keSlcblxuICAgIGNvbnN0IHRhc2tSdW5uZXJSdW50aW1lOiBUYXNrUnVubmVyLlRhc2tSdW5uZXJSdW50aW1lID0ge1xuICAgICAgbW9kdWxlSWQ6IHJ1bnRpbWUubW9kdWxlSWQsXG4gICAgICBpbnN0YW5jZUlkOiBydW50aW1lSW50ZXJuYWxzLmluc3RhbmNlSWQsXG4gICAgICBydW5XaXRoU3RhdGVUcmFuc2FjdGlvbixcbiAgICAgIHJlc29sdmVDb25jdXJyZW5jeVBvbGljeTogcnVudGltZUludGVybmFscy5jb25jdXJyZW5jeS5yZXNvbHZlQ29uY3VycmVuY3lQb2xpY3ksXG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRlciA9IHtcbiAgICAgIGRlYm91bmNlOiAobXM6IG51bWJlcikgPT5cbiAgICAgICAgTG9naWNCdWlsZGVyRmFjdG9yeTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscykoZmxvd0FwaS5kZWJvdW5jZTxUPihtcykoc3RyZWFtKSwgdHJpZ2dlck5hbWUpLFxuICAgICAgdGhyb3R0bGU6IChtczogbnVtYmVyKSA9PlxuICAgICAgICBMb2dpY0J1aWxkZXJGYWN0b3J5PFNoLCBSPihydW50aW1lLCBydW50aW1lSW50ZXJuYWxzKShmbG93QXBpLnRocm90dGxlPFQ+KG1zKShzdHJlYW0pLCB0cmlnZ2VyTmFtZSksXG4gICAgICBmaWx0ZXI6IChwcmVkaWNhdGU6ICh2YWx1ZTogVCkgPT4gYm9vbGVhbikgPT5cbiAgICAgICAgTG9naWNCdWlsZGVyRmFjdG9yeTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscykoZmxvd0FwaS5maWx0ZXIocHJlZGljYXRlKShzdHJlYW0pLCB0cmlnZ2VyTmFtZSksXG4gICAgICBtYXA6IDxVPihmOiAodmFsdWU6IFQpID0+IFUpID0+XG4gICAgICAgIExvZ2ljQnVpbGRlckZhY3Rvcnk8U2gsIFI+KHJ1bnRpbWUsIHJ1bnRpbWVJbnRlcm5hbHMpKHN0cmVhbS5waXBlKFN0cmVhbS5tYXAoZikpLCB0cmlnZ2VyTmFtZSksXG4gICAgICBydW48QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgZWZmOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiB8ICgocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgICAgICBvcHRpb25zPzogTG9naWMuT3BlcmF0aW9uT3B0aW9ucyxcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+IHtcbiAgICAgICAgcmV0dXJuIGZsb3dBcGkucnVuPFQsIEEsIEUsIFIyPihlZmYsIG9wdGlvbnMpKHN0cmVhbSlcbiAgICAgIH0sXG4gICAgICBydW5MYXRlc3Q8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgZWZmOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiB8ICgocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgICAgICBvcHRpb25zPzogTG9naWMuT3BlcmF0aW9uT3B0aW9ucyxcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+IHtcbiAgICAgICAgcmV0dXJuIGZsb3dBcGkucnVuTGF0ZXN0PFQsIEEsIEUsIFIyPihlZmYsIG9wdGlvbnMpKHN0cmVhbSlcbiAgICAgIH0sXG4gICAgICBydW5FeGhhdXN0PEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjogTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4gfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICAgICAgb3B0aW9ucz86IExvZ2ljLk9wZXJhdGlvbk9wdGlvbnMsXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiB7XG4gICAgICAgIHJldHVybiBmbG93QXBpLnJ1bkV4aGF1c3Q8VCwgQSwgRSwgUjI+KGVmZiwgb3B0aW9ucykoc3RyZWFtKVxuICAgICAgfSxcbiAgICAgIHJ1blBhcmFsbGVsPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjogTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4gfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICAgICAgb3B0aW9ucz86IExvZ2ljLk9wZXJhdGlvbk9wdGlvbnMsXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiB7XG4gICAgICAgIHJldHVybiBmbG93QXBpLnJ1blBhcmFsbGVsPFQsIEEsIEUsIFIyPihlZmYsIG9wdGlvbnMpKHN0cmVhbSlcbiAgICAgIH0sXG4gICAgICBydW5Gb3JrOiA8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgZWZmOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPiB8ICgocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4gPT5cbiAgICAgICAgRWZmZWN0LmZvcmtTY29wZWQoZmxvd0FwaS5ydW48VCwgQSwgRSwgUjI+KGVmZikoc3RyZWFtKSkucGlwZShFZmZlY3QuYXNWb2lkKSBhcyBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPixcbiAgICAgIHJ1blBhcmFsbGVsRm9yazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjogTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4gfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+ID0+XG4gICAgICAgIEVmZmVjdC5mb3JrU2NvcGVkKGZsb3dBcGkucnVuUGFyYWxsZWw8VCwgQSwgRSwgUjI+KGVmZikoc3RyZWFtKSkucGlwZShFZmZlY3QuYXNWb2lkKSBhcyBMb2dpYy5PZjxcbiAgICAgICAgICBTaCxcbiAgICAgICAgICBSICYgUjIsXG4gICAgICAgICAgdm9pZCxcbiAgICAgICAgICBFXG4gICAgICAgID4sXG4gICAgICBydW5UYXNrOiA8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgY29uZmlnOiBUYXNrUnVubmVyLlRhc2tSdW5uZXJDb25maWc8VCwgU2gsIFIgJiBSMiwgQSwgRT4sXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4gPT5cbiAgICAgICAgVGFza1J1bm5lci5tYWtlVGFza1J1bm5lcjxULCBTaCwgUiAmIFIyLCBBLCBFPihzdHJlYW0sICd0YXNrJywgdGFza1J1bm5lclJ1bnRpbWUsIHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgdHJpZ2dlck5hbWU6IGNvbmZpZy50cmlnZ2VyTmFtZSA/PyB0cmlnZ2VyTmFtZSxcbiAgICAgICAgfSkgYXMgTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+LFxuICAgICAgcnVuUGFyYWxsZWxUYXNrOiA8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgY29uZmlnOiBUYXNrUnVubmVyLlRhc2tSdW5uZXJDb25maWc8VCwgU2gsIFIgJiBSMiwgQSwgRT4sXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4gPT5cbiAgICAgICAgVGFza1J1bm5lci5tYWtlVGFza1J1bm5lcjxULCBTaCwgUiAmIFIyLCBBLCBFPihzdHJlYW0sICdwYXJhbGxlbCcsIHRhc2tSdW5uZXJSdW50aW1lLCB7XG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIHRyaWdnZXJOYW1lOiBjb25maWcudHJpZ2dlck5hbWUgPz8gdHJpZ2dlck5hbWUsXG4gICAgICAgIH0pIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPixcbiAgICAgIHJ1bkxhdGVzdFRhc2s6IDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBjb25maWc6IFRhc2tSdW5uZXIuVGFza1J1bm5lckNvbmZpZzxULCBTaCwgUiAmIFIyLCBBLCBFPixcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPiA9PlxuICAgICAgICBUYXNrUnVubmVyLm1ha2VUYXNrUnVubmVyPFQsIFNoLCBSICYgUjIsIEEsIEU+KHN0cmVhbSwgJ2xhdGVzdCcsIHRhc2tSdW5uZXJSdW50aW1lLCB7XG4gICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgIHRyaWdnZXJOYW1lOiBjb25maWcudHJpZ2dlck5hbWUgPz8gdHJpZ2dlck5hbWUsXG4gICAgICAgIH0pIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPixcbiAgICAgIHJ1bkV4aGF1c3RUYXNrOiA8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgY29uZmlnOiBUYXNrUnVubmVyLlRhc2tSdW5uZXJDb25maWc8VCwgU2gsIFIgJiBSMiwgQSwgRT4sXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4gPT5cbiAgICAgICAgVGFza1J1bm5lci5tYWtlVGFza1J1bm5lcjxULCBTaCwgUiAmIFIyLCBBLCBFPihzdHJlYW0sICdleGhhdXN0JywgdGFza1J1bm5lclJ1bnRpbWUsIHtcbiAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgdHJpZ2dlck5hbWU6IGNvbmZpZy50cmlnZ2VyTmFtZSA/PyB0cmlnZ2VyTmFtZSxcbiAgICAgICAgfSkgYXMgTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+LFxuICAgICAgdG9TdHJlYW06ICgpID0+IHN0cmVhbSxcbiAgICAgIHVwZGF0ZTogKFxuICAgICAgICByZWR1Y2VyOiAocHJldjogU3RhdGVPZjxTaD4sIHBheWxvYWQ6IFQpID0+IFN0YXRlT2Y8U2g+IHwgRWZmZWN0LkVmZmVjdDxTdGF0ZU9mPFNoPiwgYW55LCBhbnk+LFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPiA9PlxuICAgICAgICBTdHJlYW0ucnVuRm9yRWFjaChzdHJlYW0sIChwYXlsb2FkKSA9PlxuICAgICAgICAgIHRhc2tSdW5uZXJSdW50aW1lLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBraW5kOiAnd2F0Y2hlcjp1cGRhdGUnLFxuICAgICAgICAgICAgICBuYW1lOiB0cmlnZ2VyTmFtZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldiA9ICh5aWVsZCogcnVudGltZS5nZXRTdGF0ZSkgYXMgU3RhdGVPZjxTaD5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gcmVkdWNlcihwcmV2LCBwYXlsb2FkKVxuICAgICAgICAgICAgICAgIGlmIChFZmZlY3QuaXNFZmZlY3QobmV4dCkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXQgPSB5aWVsZCogRWZmZWN0LmV4aXQobmV4dCBhcyBFZmZlY3QuRWZmZWN0PFN0YXRlT2Y8U2g+LCBhbnksIGFueT4pXG4gICAgICAgICAgICAgICAgICBpZiAoZXhpdC5fdGFnID09PSAnRmFpbHVyZScpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQqIEVmZmVjdC5sb2dFcnJvcignRmxvdyBlcnJvcicsIGV4aXQuY2F1c2UpXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgeWllbGQqIHJ1bnRpbWUuc2V0U3RhdGUoZXhpdC52YWx1ZSBhcyBTdGF0ZU9mPFNoPilcbiAgICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB5aWVsZCogcnVudGltZS5zZXRTdGF0ZShuZXh0IGFzIFN0YXRlT2Y8U2g+KVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApLnBpcGUoRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PiBFZmZlY3QubG9nRXJyb3IoJ0Zsb3cgZXJyb3InLCBjYXVzZSkpKSBhcyBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+LFxuICAgICAgbXV0YXRlOiAocmVkdWNlcjogKGRyYWZ0OiBMb2dpYy5EcmFmdDxTdGF0ZU9mPFNoPj4sIHBheWxvYWQ6IFQpID0+IHZvaWQpOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+ID0+XG4gICAgICAgIFN0cmVhbS5ydW5Gb3JFYWNoKHN0cmVhbSwgKHBheWxvYWQpID0+XG4gICAgICAgICAgdGFza1J1bm5lclJ1bnRpbWUucnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGtpbmQ6ICd3YXRjaGVyOm11dGF0ZScsXG4gICAgICAgICAgICAgIG5hbWU6IHRyaWdnZXJOYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gKHlpZWxkKiBydW50aW1lLmdldFN0YXRlKSBhcyBTdGF0ZU9mPFNoPlxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZFBhdGNoID0gcnVudGltZUludGVybmFscy50eG4ucmVjb3JkU3RhdGVQYXRjaFxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZURyYWZ0ID0gcnVudGltZUludGVybmFscy50eG4udXBkYXRlRHJhZnRcblxuICAgICAgICAgICAgICAgIGNvbnN0IHsgbmV4dFN0YXRlLCBwYXRjaFBhdGhzIH0gPSBtdXRhdGVXaXRoUGF0Y2hQYXRocyhwcmV2IGFzIFN0YXRlT2Y8U2g+LCAoZHJhZnQpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlZHVjZXIoZHJhZnQgYXMgTG9naWMuRHJhZnQ8U3RhdGVPZjxTaD4+LCBwYXlsb2FkKVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0Y2hQYXRocykge1xuICAgICAgICAgICAgICAgICAgcmVjb3JkUGF0Y2gocGF0aCwgJ3Vua25vd24nKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHVwZGF0ZURyYWZ0KG5leHRTdGF0ZSlcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKS5waXBlKEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT4gRWZmZWN0LmxvZ0Vycm9yKCdGbG93IGVycm9yJywgY2F1c2UpKSkgYXMgTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPixcbiAgICB9IGFzIE9taXQ8TG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj4sICdwaXBlJz5cblxuICAgIGNvbnN0IHBpcGU6IExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+WydwaXBlJ10gPSBmdW5jdGlvbiAodGhpczogdW5rbm93bikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgY29uc3QgZm5zID0gYXJndW1lbnRzIGFzIHVua25vd24gYXMgUmVhZG9ubHlBcnJheTxcbiAgICAgICAgKHNlbGY6IExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+KSA9PiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPlxuICAgICAgPlxuICAgICAgbGV0IGFjYzogTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj4gPSBidWlsZGVyIGFzIExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhY2MgPSBmbnNbaV0oYWNjKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGJ1aWxkZXIsIHsgcGlwZSB9KSBhcyBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPlxuICB9XG59XG5pbXBvcnQgdHlwZSB7IEJvdW5kQXBpIH0gZnJvbSAnLi9tb2R1bGUuanMnXG5cbi8qKlxuICogQm91bmRBcGkgaW1wbGVtZW50YXRpb246IGNyZWF0ZXMgYSBwcmUtYm91bmQgYCRgIGZvciBhIGdpdmVuIFN0b3JlIHNoYXBlICsgcnVudGltZS5cbiAqXG4gKiBOb3RlOiBwdWJsaWMgdHlwZXMgYW5kIGVudHJ5cG9pbnQgc2lnbmF0dXJlcyBsaXZlIGluIGFwaS9Cb3VuZEFwaS50czsgdGhpcyBmaWxlIG9ubHkgaG9zdHMgdGhlIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZTxTaCBleHRlbmRzIExvZ2l4LkFueU1vZHVsZVNoYXBlLCBSID0gbmV2ZXI+KFxuICBzaGFwZTogU2gsXG4gIHJ1bnRpbWU6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8TG9naXguU3RhdGVPZjxTaD4sIExvZ2l4LkFjdGlvbk9mPFNoPj4sXG4gIG9wdGlvbnM/OiB7XG4gICAgcmVhZG9ubHkgZ2V0UGhhc2U/OiAoKSA9PiAnc2V0dXAnIHwgJ3J1bidcbiAgICByZWFkb25seSBwaGFzZVNlcnZpY2U/OiBMb2dpY0RpYWdub3N0aWNzLkxvZ2ljUGhhc2VTZXJ2aWNlXG4gICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICByZWFkb25seSBsb2dpY1VuaXQ/OiBMb2dpY0RpYWdub3N0aWNzLkxvZ2ljVW5pdFNlcnZpY2VcbiAgfSxcbik6IEJvdW5kQXBpPFNoLCBSPiB7XG4gIGNvbnN0IHJ1bnRpbWVJbnRlcm5hbHMgPSBnZXRSdW50aW1lSW50ZXJuYWxzKHJ1bnRpbWUgYXMgYW55KVxuXG4gIGNvbnN0IGdldFBoYXNlID0gb3B0aW9ucz8uZ2V0UGhhc2UgPz8gKCgpID0+ICdydW4nKVxuICBjb25zdCBnZXRDdXJyZW50UGhhc2UgPSAoKTogJ3NldHVwJyB8ICdydW4nID0+IHtcbiAgICBjb25zdCBwaGFzZVNlcnZpY2UgPSBvcHRpb25zPy5waGFzZVNlcnZpY2VcbiAgICBjb25zdCBwaGFzZSA9IHBoYXNlU2VydmljZT8uY3VycmVudCA/PyBnZXRQaGFzZSgpXG4gICAgcmV0dXJuIHBoYXNlID09PSAnc2V0dXAnID8gJ3NldHVwJyA6ICdydW4nXG4gIH1cbiAgY29uc3QgZ3VhcmRSdW5Pbmx5ID0gKGtpbmQ6IHN0cmluZywgYXBpOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwaGFzZVNlcnZpY2UgPSBvcHRpb25zPy5waGFzZVNlcnZpY2VcbiAgICBjb25zdCBwaGFzZSA9IHBoYXNlU2VydmljZT8uY3VycmVudCA/PyBnZXRQaGFzZSgpXG4gICAgaWYgKHBoYXNlID09PSAnc2V0dXAnKSB7XG4gICAgICB0aHJvdyBMb2dpY0RpYWdub3N0aWNzLm1ha2VMb2dpY1BoYXNlRXJyb3Ioa2luZCwgYXBpLCAnc2V0dXAnLCBvcHRpb25zPy5tb2R1bGVJZClcbiAgICB9XG4gIH1cbiAgY29uc3QgZmxvd0FwaSA9IEZsb3dSdW50aW1lLm1ha2U8U2gsIFI+KHJ1bnRpbWUsIHJ1bnRpbWVJbnRlcm5hbHMpXG5cbiAgY29uc3QgbWFrZUludGVudEJ1aWxkZXIgPSAocnVudGltZV86IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+KSA9PlxuICAgIExvZ2ljQnVpbGRlckZhY3Rvcnk8U2gsIFI+KHJ1bnRpbWVfLCBydW50aW1lSW50ZXJuYWxzKVxuICBjb25zdCB3aXRoTGlmZWN5Y2xlID0gPEE+KFxuICAgIGF2YWlsYWJsZTogKG1hbmFnZXI6IExpZmVjeWNsZS5MaWZlY3ljbGVNYW5hZ2VyKSA9PiBFZmZlY3QuRWZmZWN0PEEsIG5ldmVyLCBhbnk+LFxuICAgIG1pc3Npbmc6ICgpID0+IEVmZmVjdC5FZmZlY3Q8QSwgbmV2ZXIsIGFueT4sXG4gICkgPT5cbiAgICBFZmZlY3Quc2VydmljZU9wdGlvbihMaWZlY3ljbGUuTGlmZWN5Y2xlQ29udGV4dCkucGlwZShcbiAgICAgIEVmZmVjdC5mbGF0TWFwKChtYXliZSkgPT5cbiAgICAgICAgT3B0aW9uLm1hdGNoKG1heWJlLCB7XG4gICAgICAgICAgb25Tb21lOiBhdmFpbGFibGUsXG4gICAgICAgICAgb25Ob25lOiBtaXNzaW5nLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKVxuICBjb25zdCB3aXRoUGxhdGZvcm0gPSAoaW52b2tlOiAocGxhdGZvcm06IFBsYXRmb3JtLlNlcnZpY2UpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pID0+XG4gICAgRWZmZWN0LnNlcnZpY2VPcHRpb24oUGxhdGZvcm0uVGFnKS5waXBlKFxuICAgICAgRWZmZWN0LmZsYXRNYXAoKG1heWJlKSA9PlxuICAgICAgICBPcHRpb24ubWF0Y2gobWF5YmUsIHtcbiAgICAgICAgICBvblNvbWU6IGludm9rZSxcbiAgICAgICAgICBvbk5vbmU6ICgpID0+IEVmZmVjdC52b2lkLFxuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKVxuXG4gIGNvbnN0IGVtaXRTZXR1cE9ubHlWaW9sYXRpb24gPSAoYXBpOiBzdHJpbmcpOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+XG4gICAgRGVidWcucmVjb3JkKHtcbiAgICAgIHR5cGU6ICdkaWFnbm9zdGljJyxcbiAgICAgIG1vZHVsZUlkOiBydW50aW1lLm1vZHVsZUlkLFxuICAgICAgaW5zdGFuY2VJZDogcnVudGltZS5pbnN0YW5jZUlkLFxuICAgICAgY29kZTogJ2xvZ2ljOjppbnZhbGlkX3BoYXNlJyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogYCR7YXBpfSBpcyBzZXR1cC1vbmx5IGFuZCBpcyBub3QgYWxsb3dlZCBpbiBydW4gcGhhc2UuYCxcbiAgICAgIGhpbnQ6XG4gICAgICAgICdNb3ZlICQubGlmZWN5Y2xlLiogY2FsbHMgdG8gdGhlIHN5bmNocm9ub3VzIHBhcnQgb2YgTW9kdWxlLmxvZ2ljIGJ1aWxkZXIgKGJlZm9yZSByZXR1cm4pIGZvciByZWdpc3RyYXRpb247ICcgK1xuICAgICAgICAnZm9yIGR5bmFtaWMgcmVzb3VyY2UgY2xlYW51cCBpbiB0aGUgcnVuIHBoYXNlLCB1c2UgRWZmZWN0LmFjcXVpcmVSZWxlYXNlIC8gU2NvcGUgZmluYWxpemVyIGluc3RlYWQgb2YgcmVnaXN0ZXJpbmcgb25EZXN0cm95IGxhdGUuJyxcbiAgICAgIGtpbmQ6ICdsaWZlY3ljbGVfaW5fcnVuJyxcbiAgICB9KVxuXG4gIGNvbnN0IGNyZWF0ZUludGVudEJ1aWxkZXIgPSA8VD4oc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFQ+LCB0cmlnZ2VyTmFtZT86IHN0cmluZykgPT5cbiAgICBtYWtlSW50ZW50QnVpbGRlcihydW50aW1lKShzdHJlYW0sIHRyaWdnZXJOYW1lKVxuXG4gIGNvbnN0IG9uY2VJblJ1blNlc3Npb24gPSAoa2V5OiBzdHJpbmcpOiBFZmZlY3QuRWZmZWN0PGJvb2xlYW4sIG5ldmVyLCBhbnk+ID0+XG4gICAgRWZmZWN0LnNlcnZpY2VPcHRpb24oUnVuU2Vzc2lvblRhZykucGlwZShcbiAgICAgIEVmZmVjdC5tYXAoKG1heWJlKSA9PiAoT3B0aW9uLmlzU29tZShtYXliZSkgPyBtYXliZS52YWx1ZS5sb2NhbC5vbmNlKGtleSkgOiB0cnVlKSksXG4gICAgKVxuXG4gIGxldCBjYWNoZWREaWFnbm9zdGljc0xldmVsOiBEZWJ1Zy5EaWFnbm9zdGljc0xldmVsIHwgdW5kZWZpbmVkXG5cbiAgY29uc3QgaXNNb2R1bGVMaWtlID0gKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICApOiB2YWx1ZSBpcyB7XG4gICAgcmVhZG9ubHkgX2tpbmQ6ICdNb2R1bGVEZWYnIHwgJ01vZHVsZSdcbiAgICByZWFkb25seSBpZDogc3RyaW5nXG4gICAgcmVhZG9ubHkgdGFnOiBDb250ZXh0LlRhZzxhbnksIExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+PlxuICAgIHJlYWRvbmx5IHNjaGVtYXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIHJlYWRvbmx5IG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+XG4gICAgcmVhZG9ubHkgZGV2PzogeyByZWFkb25seSBzb3VyY2U/OiB7IHJlYWRvbmx5IGZpbGU6IHN0cmluZzsgcmVhZG9ubHkgbGluZTogbnVtYmVyOyByZWFkb25seSBjb2x1bW46IG51bWJlciB9IH1cbiAgfSA9PlxuICAgIEJvb2xlYW4oXG4gICAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgKCh2YWx1ZSBhcyBhbnkpLl9raW5kID09PSAnTW9kdWxlRGVmJyB8fCAodmFsdWUgYXMgYW55KS5fa2luZCA9PT0gJ01vZHVsZScpICYmXG4gICAgICAndGFnJyBpbiAodmFsdWUgYXMgb2JqZWN0KSAmJlxuICAgICAgQ29udGV4dC5pc1RhZygodmFsdWUgYXMgYW55KS50YWcpLFxuICAgIClcblxuICBjb25zdCBidWlsZE1vZHVsZUhhbmRsZSA9IChcbiAgICB0YWc6IENvbnRleHQuVGFnPGFueSwgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4+LFxuICAgIHJ0OiBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PixcbiAgKTogdW5rbm93biA9PiB7XG4gICAgY29uc3QgYWN0aW9uc1Byb3h5OiBMb2dpeC5Nb2R1bGVIYW5kbGU8YW55PlsnYWN0aW9ucyddID0gbmV3IFByb3h5KFxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IChwYXlsb2FkOiB1bmtub3duKSA9PlxuICAgICAgICAgIHJ0LmRpc3BhdGNoKHtcbiAgICAgICAgICAgIF90YWc6IHByb3AgYXMgc3RyaW5nLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgKSBhcyBMb2dpeC5Nb2R1bGVIYW5kbGU8YW55PlsnYWN0aW9ucyddXG5cbiAgICBjb25zdCBoYW5kbGU6IExvZ2l4Lk1vZHVsZUhhbmRsZTxhbnk+ID0ge1xuICAgICAgcmVhZDogKHNlbGVjdG9yKSA9PiBFZmZlY3QubWFwKHJ0LmdldFN0YXRlLCBzZWxlY3RvciksXG4gICAgICBjaGFuZ2VzOiBydC5jaGFuZ2VzLFxuICAgICAgZGlzcGF0Y2g6IHJ0LmRpc3BhdGNoLFxuICAgICAgYWN0aW9ucyQ6IHJ0LmFjdGlvbnMkLFxuICAgICAgYWN0aW9uczogYWN0aW9uc1Byb3h5LFxuICAgIH1cblxuICAgIGNvbnN0IEVYVEVORF9IQU5ETEUgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUuaGFuZGxlLmV4dGVuZCcpXG4gICAgY29uc3QgZXh0ZW5kID0gKHRhZyBhcyBhbnkpPy5bRVhURU5EX0hBTkRMRV0gYXNcbiAgICAgIHwgKChydW50aW1lOiBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PiwgYmFzZTogTG9naXguTW9kdWxlSGFuZGxlPGFueT4pID0+IHVua25vd24pXG4gICAgICB8IHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHR5cGVvZiBleHRlbmQgPT09ICdmdW5jdGlvbicgPyAoZXh0ZW5kKHJ0LCBoYW5kbGUpID8/IGhhbmRsZSkgOiBoYW5kbGVcbiAgfVxuXG4gIGNvbnN0IGVtaXRNb2R1bGVEZXNjcmlwdG9yT25jZSA9IChcbiAgICBtb2R1bGU6IHtcbiAgICAgIHJlYWRvbmx5IGlkOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRhZzogYW55XG4gICAgICByZWFkb25seSBzY2hlbWFzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgIHJlYWRvbmx5IG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+XG4gICAgICByZWFkb25seSBkZXY/OiB7IHJlYWRvbmx5IHNvdXJjZT86IHsgcmVhZG9ubHkgZmlsZTogc3RyaW5nOyByZWFkb25seSBsaW5lOiBudW1iZXI7IHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyIH0gfVxuICAgIH0sXG4gICAgcnQ6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+LFxuICApOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0+XG4gICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgLy8gSG90LXBhdGggZ3VhcmQ6IG5ldmVyIGVtaXQgZXZlbnRzIHdoZW4gZGlhZ25vc3RpY3MgYXJlIG9mZi5cbiAgICAgIGlmIChjYWNoZWREaWFnbm9zdGljc0xldmVsID09PSAnb2ZmJykgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGtleSA9IGBtb2R1bGVfZGVzY3JpcHRvcjoke1N0cmluZyhydC5pbnN0YW5jZUlkID8/ICd1bmtub3duJyl9YFxuICAgICAgY29uc3Qgc2hvdWxkRW1pdCA9IHlpZWxkKiBvbmNlSW5SdW5TZXNzaW9uKGtleSlcbiAgICAgIGlmICghc2hvdWxkRW1pdCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGFjdGlvbktleXMgPSBPYmplY3Qua2V5cygobW9kdWxlLnRhZyBhcyBhbnkpPy5zaGFwZT8uYWN0aW9uTWFwID8/IHt9KVxuXG4gICAgICBjb25zdCBpbnRlcm5hbFN5bWJvbCA9IFN5bWJvbC5mb3IoJ2xvZ2l4Lm1vZHVsZS5pbnRlcm5hbCcpXG4gICAgICBjb25zdCBpbnRlcm5hbCA9IChtb2R1bGUgYXMgYW55KVtpbnRlcm5hbFN5bWJvbF0gYXMgeyByZWFkb25seSBtb3VudGVkPzogUmVhZG9ubHlBcnJheTxhbnk+IH0gfCB1bmRlZmluZWRcblxuICAgICAgY29uc3QgbG9naWNVbml0cyA9IChpbnRlcm5hbD8ubW91bnRlZCA/PyBbXSkubWFwKCh1OiBhbnkpID0+ICh7XG4gICAgICAgIGtpbmQ6IFN0cmluZyh1Py5raW5kID8/ICd1c2VyJyksXG4gICAgICAgIGlkOiBTdHJpbmcodT8uaWQgPz8gJycpLFxuICAgICAgICBkZXJpdmVkOiB1Py5kZXJpdmVkID8gdHJ1ZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgbmFtZTogdHlwZW9mIHU/Lm5hbWUgPT09ICdzdHJpbmcnID8gdS5uYW1lIDogdW5kZWZpbmVkLFxuICAgICAgfSkpXG5cbiAgICAgIGNvbnN0IHNjaGVtYUtleXMgPSBtb2R1bGUuc2NoZW1hcyAmJiB0eXBlb2YgbW9kdWxlLnNjaGVtYXMgPT09ICdvYmplY3QnID8gT2JqZWN0LmtleXMobW9kdWxlLnNjaGVtYXMpIDogdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IG1ldGEgPSBtb2R1bGUubWV0YSAmJiB0eXBlb2YgbW9kdWxlLm1ldGEgPT09ICdvYmplY3QnID8gbW9kdWxlLm1ldGEgOiB1bmRlZmluZWRcblxuICAgICAgY29uc3Qgc291cmNlID0gbW9kdWxlLmRldj8uc291cmNlXG5cbiAgICAgIGNvbnN0IHRyYWl0c1NuYXBzaG90ID0gcnVudGltZUludGVybmFscy50cmFpdHMuZ2V0TW9kdWxlVHJhaXRzU25hcHNob3QoKVxuICAgICAgY29uc3QgdHJhaXRzID0gdHJhaXRzU25hcHNob3RcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBkaWdlc3Q6IHRyYWl0c1NuYXBzaG90LmRpZ2VzdCxcbiAgICAgICAgICAgIGNvdW50OiB0cmFpdHNTbmFwc2hvdC50cmFpdHMubGVuZ3RoLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgaWQ6IG1vZHVsZS5pZCxcbiAgICAgICAgbW9kdWxlSWQ6IFN0cmluZyhydC5tb2R1bGVJZCksXG4gICAgICAgIGluc3RhbmNlSWQ6IFN0cmluZyhydC5pbnN0YW5jZUlkKSxcbiAgICAgICAgYWN0aW9uS2V5cyxcbiAgICAgICAgbG9naWNVbml0cyxcbiAgICAgICAgc2NoZW1hS2V5cyxcbiAgICAgICAgbWV0YSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICB0cmFpdHMsXG4gICAgICB9XG5cbiAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICB0eXBlOiAndHJhY2U6bW9kdWxlOmRlc2NyaXB0b3InLFxuICAgICAgICBtb2R1bGVJZDogcnQubW9kdWxlSWQsXG4gICAgICAgIGluc3RhbmNlSWQ6IHJ0Lmluc3RhbmNlSWQsXG4gICAgICAgIGRhdGEsXG4gICAgICB9IGFzIGFueSlcbiAgICB9KVxuXG4gIC8qKlxuICAgKiBzdHJpY3Q6IHJlc29sdmUgYSBNb2R1bGUgcnVudGltZSBvbmx5IGZyb20gdGhlIGN1cnJlbnQgRWZmZWN0IGVudmlyb25tZW50LlxuICAgKlxuICAgKiBOb3RlczpcbiAgICogLSBXaXRoIG11bHRpcGxlIHJvb3RzIC8gaW5zdGFuY2VzLCBhbnkgcHJvY2Vzcy13aWRlIHJlZ2lzdHJ5IGNhbm5vdCBleHByZXNzIHRoZSBjb3JyZWN0IHNlbWFudGljcy5cbiAgICogLSBBIG1pc3NpbmcgcHJvdmlkZXIgaXMgYSB3aXJpbmcgZXJyb3I6IGZhaWwgZGV0ZXJtaW5pc3RpY2FsbHkgYW5kIHByb3ZpZGUgYWN0aW9uYWJsZSBoaW50cyAobW9yZSBkZXRhaWxzIGluIGRldi90ZXN0KS5cbiAgICovXG4gIGNvbnN0IHJlc29sdmVNb2R1bGVSdW50aW1lID0gKFxuICAgIHRhZzogQ29udGV4dC5UYWc8YW55LCBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55Pj4sXG4gICk6IEVmZmVjdC5FZmZlY3Q8TG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4sIG5ldmVyLCBhbnk+ID0+XG4gICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgcmVxdWVzdGVkTW9kdWxlSWQgPSB0eXBlb2YgKHRhZyBhcyBhbnkpPy5pZCA9PT0gJ3N0cmluZycgPyAoKHRhZyBhcyBhbnkpLmlkIGFzIHN0cmluZykgOiB1bmRlZmluZWRcbiAgICAgIGNvbnN0IGZyb21Nb2R1bGVJZCA9IHR5cGVvZiBvcHRpb25zPy5tb2R1bGVJZCA9PT0gJ3N0cmluZycgPyBvcHRpb25zLm1vZHVsZUlkIDogcnVudGltZS5tb2R1bGVJZFxuXG4gICAgICAvLyBzZWxmOiBhbHdheXMgYWxsb3cgcmVzb2x2aW5nIHRoZSBjdXJyZW50IE1vZHVsZVJ1bnRpbWUgKGJvdGggQm91bmQubWFrZSBhbmQgcnVudGltZSBpbmplY3Rpb24gcGF0aHMpLlxuICAgICAgaWYgKHJlcXVlc3RlZE1vZHVsZUlkICYmIHJlcXVlc3RlZE1vZHVsZUlkID09PSBydW50aW1lLm1vZHVsZUlkKSB7XG4gICAgICAgIHJldHVybiBydW50aW1lIGFzIHVua25vd24gYXMgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT5cbiAgICAgIH1cblxuICAgICAgY29uc3QgZnJvbUltcG9ydHMgPSBydW50aW1lSW50ZXJuYWxzLmltcG9ydHMuZ2V0KHRhZyBhcyB1bmtub3duIGFzIENvbnRleHQuVGFnPGFueSwgYW55PilcbiAgICAgIGlmIChmcm9tSW1wb3J0cykge1xuICAgICAgICByZXR1cm4gZnJvbUltcG9ydHMgYXMgdW5rbm93biBhcyBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PlxuICAgICAgfVxuXG4gICAgICAvLyBCb3VuZC5tYWtlIChubyBtb2R1bGVJZCBjb250ZXh0KTogYWxsb3cgcmVzb2x2aW5nIGZyb20gdGhlIGN1cnJlbnQgRWZmZWN0IGVudiAodXNlZnVsIGZvciB0ZXN0cy9zY2FmZm9sZGluZykuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnM/Lm1vZHVsZUlkICE9PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBmcm9tRW52ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKHRhZyBhcyBhbnkpXG4gICAgICAgIGlmIChPcHRpb24uaXNTb21lKGZyb21FbnYpKSB7XG4gICAgICAgICAgcmV0dXJuIGZyb21FbnYudmFsdWUgYXMgdW5rbm93biBhcyBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDIpIE5vdCBmb3VuZDogZGllIGltbWVkaWF0ZWx5IFx1MjAxNCB0aGlzIGlzIGEgd2lyaW5nIGVycm9yOyBndWlkZSB0aGUgY2FsbGVyIHRvIGZpeCB0aGUgY29tcG9zaXRpb24uXG4gICAgICBjb25zdCB0b2tlbklkID0gcmVxdWVzdGVkTW9kdWxlSWQgPz8gJzx1bmtub3duIG1vZHVsZSBpZD4nXG4gICAgICBjb25zdCBmaXg6IHN0cmluZ1tdID0gaXNEZXZFbnYoKVxuICAgICAgICA/IFtcbiAgICAgICAgICAgICctIFByb3ZpZGUgdGhlIGNoaWxkIGltcGxlbWVudGF0aW9uIGluIHRoZSBzYW1lIHNjb3BlIChpbXBvcnRzKS4nLFxuICAgICAgICAgICAgYCAgRXhhbXBsZTogJHtmcm9tTW9kdWxlSWQgPz8gJ1BhcmVudE1vZHVsZSd9LmltcGxlbWVudCh7IGltcG9ydHM6IFske3JlcXVlc3RlZE1vZHVsZUlkID8/ICdDaGlsZE1vZHVsZSd9LmltcGxdLCAuLi4gfSlgLFxuICAgICAgICAgICAgJy0gSWYgeW91IGludGVudGlvbmFsbHkgd2FudCBhIHJvb3Qgc2luZ2xldG9uLCBwcm92aWRlIGl0IGF0IGFwcCByb290IChSdW50aW1lLm1ha2UoLi4uLHsgbGF5ZXIgfSkgLyByb290IGltcG9ydHMpLCcsXG4gICAgICAgICAgICAnICBhbmQgdXNlIFJvb3QucmVzb2x2ZShNb2R1bGVUYWcpIChpbnN0ZWFkIG9mICQudXNlKSBhdCB0aGUgY2FsbHNpdGUuJyxcbiAgICAgICAgICBdXG4gICAgICAgIDogW11cblxuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICBpc0RldkVudigpXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICdbTWlzc2luZ01vZHVsZVJ1bnRpbWVFcnJvcl0gQ2Fubm90IHJlc29sdmUgTW9kdWxlUnVudGltZSBmb3IgTW9kdWxlVGFnLicsXG4gICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICBgdG9rZW5JZDogJHt0b2tlbklkfWAsXG4gICAgICAgICAgICAgICdlbnRyeXBvaW50OiBsb2dpYy4kLnVzZScsXG4gICAgICAgICAgICAgICdtb2RlOiBzdHJpY3QnLFxuICAgICAgICAgICAgICBgZnJvbTogJHtmcm9tTW9kdWxlSWQgPz8gJzx1bmtub3duIG1vZHVsZSBpZD4nfWAsXG4gICAgICAgICAgICAgIGBzdGFydFNjb3BlOiBtb2R1bGVJZD0ke2Zyb21Nb2R1bGVJZCA/PyAnPHVua25vd24+J30sIGluc3RhbmNlSWQ9JHtTdHJpbmcocnVudGltZS5pbnN0YW5jZUlkID8/ICc8dW5rbm93bj4nKX1gLFxuICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgJ2ZpeDonLFxuICAgICAgICAgICAgICAuLi5maXgsXG4gICAgICAgICAgICBdLmpvaW4oJ1xcbicpXG4gICAgICAgICAgOiAnW01pc3NpbmdNb2R1bGVSdW50aW1lRXJyb3JdIG1vZHVsZSBydW50aW1lIG5vdCBmb3VuZCcsXG4gICAgICApXG5cbiAgICAgIDsoZXJyIGFzIGFueSkudG9rZW5JZCA9IHRva2VuSWRcbiAgICAgIDsoZXJyIGFzIGFueSkuZW50cnlwb2ludCA9ICdsb2dpYy4kLnVzZSdcbiAgICAgIDsoZXJyIGFzIGFueSkubW9kZSA9ICdzdHJpY3QnXG4gICAgICA7KGVyciBhcyBhbnkpLmZyb20gPSBmcm9tTW9kdWxlSWRcbiAgICAgIDsoZXJyIGFzIGFueSkuc3RhcnRTY29wZSA9IHtcbiAgICAgICAgbW9kdWxlSWQ6IGZyb21Nb2R1bGVJZCxcbiAgICAgICAgaW5zdGFuY2VJZDogU3RyaW5nKHJ1bnRpbWUuaW5zdGFuY2VJZCA/PyAnPHVua25vd24+JyksXG4gICAgICB9XG4gICAgICA7KGVyciBhcyBhbnkpLmZpeCA9IGZpeFxuXG4gICAgICBlcnIubmFtZSA9ICdNaXNzaW5nTW9kdWxlUnVudGltZUVycm9yJ1xuICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZGllKGVycilcbiAgICB9KVxuXG4gIGNvbnN0IHN0YXRlQXBpOiBCb3VuZEFwaTxTaCwgUj5bJ3N0YXRlJ10gPSB7XG4gICAgcmVhZDogcnVudGltZS5nZXRTdGF0ZSxcbiAgICB1cGRhdGU6IChmKSA9PlxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBpblR4biA9IHlpZWxkKiBGaWJlclJlZi5nZXQoVGFza1J1bm5lci5pblN5bmNUcmFuc2FjdGlvbkZpYmVyKVxuICAgICAgICBpZiAoaW5UeG4pIHtcbiAgICAgICAgICBjb25zdCBwcmV2ID0geWllbGQqIHJ1bnRpbWUuZ2V0U3RhdGVcbiAgICAgICAgICByZXR1cm4geWllbGQqIHJ1bnRpbWUuc2V0U3RhdGUoZihwcmV2KSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSAoKSA9PiBFZmZlY3QuZmxhdE1hcChydW50aW1lLmdldFN0YXRlLCAocHJldikgPT4gcnVudGltZS5zZXRTdGF0ZShmKHByZXYpKSlcblxuICAgICAgICByZXR1cm4geWllbGQqIHJ1bnRpbWVJbnRlcm5hbHNcbiAgICAgICAgICA/IHJ1bnRpbWVJbnRlcm5hbHMudHhuLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKHsga2luZDogJ3N0YXRlJywgbmFtZTogJ3VwZGF0ZScgfSBhcyBhbnksIGJvZHkpXG4gICAgICAgICAgOiBib2R5KClcbiAgICAgIH0pLFxuICAgIG11dGF0ZTogKGYpID0+XG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZFBhdGNoID0gcnVudGltZUludGVybmFscz8udHhuLnJlY29yZFN0YXRlUGF0Y2hcbiAgICAgICAgY29uc3QgdXBkYXRlRHJhZnQgPSBydW50aW1lSW50ZXJuYWxzPy50eG4udXBkYXRlRHJhZnRcblxuICAgICAgICBjb25zdCBpblR4biA9IHlpZWxkKiBGaWJlclJlZi5nZXQoVGFza1J1bm5lci5pblN5bmNUcmFuc2FjdGlvbkZpYmVyKVxuICAgICAgICBpZiAoaW5UeG4pIHtcbiAgICAgICAgICBjb25zdCBwcmV2ID0geWllbGQqIHJ1bnRpbWUuZ2V0U3RhdGVcbiAgICAgICAgICBjb25zdCB7IG5leHRTdGF0ZSwgcGF0Y2hQYXRocyB9ID0gbXV0YXRlV2l0aFBhdGNoUGF0aHMocHJldiBhcyBMb2dpeC5TdGF0ZU9mPFNoPiwgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgICBmKGRyYWZ0IGFzIExvZ2ljLkRyYWZ0PExvZ2l4LlN0YXRlT2Y8U2g+PilcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGNoUGF0aHMpIHtcbiAgICAgICAgICAgIHJlY29yZFBhdGNoPy4ocGF0aCwgJ3Vua25vd24nKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHVwZGF0ZURyYWZ0Py4obmV4dFN0YXRlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm9keSA9ICgpID0+XG4gICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgcHJldiA9IHlpZWxkKiBydW50aW1lLmdldFN0YXRlXG4gICAgICAgICAgICBjb25zdCB7IG5leHRTdGF0ZSwgcGF0Y2hQYXRocyB9ID0gbXV0YXRlV2l0aFBhdGNoUGF0aHMocHJldiBhcyBMb2dpeC5TdGF0ZU9mPFNoPiwgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgICAgIGYoZHJhZnQgYXMgTG9naWMuRHJhZnQ8TG9naXguU3RhdGVPZjxTaD4+KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGNoUGF0aHMpIHtcbiAgICAgICAgICAgICAgcmVjb3JkUGF0Y2g/LihwYXRoLCAndW5rbm93bicpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVwZGF0ZURyYWZ0Py4obmV4dFN0YXRlKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHlpZWxkKiBydW50aW1lSW50ZXJuYWxzXG4gICAgICAgICAgPyBydW50aW1lSW50ZXJuYWxzLnR4bi5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbih7IGtpbmQ6ICdzdGF0ZScsIG5hbWU6ICdtdXRhdGUnIH0gYXMgYW55LCBib2R5KVxuICAgICAgICAgIDogYm9keSgpXG4gICAgICB9KSxcbiAgICByZWY6IHJ1bnRpbWUucmVmLFxuICB9XG5cbiAgY29uc3QgYWN0aW9ucyA9IHNoYXBlLmFjdGlvbk1hcCBhcyBCb3VuZEFwaTxTaCwgUj5bJ2FjdGlvbnMnXVxuXG4gIGNvbnN0IGRpc3BhdGNoZXJDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCAoLi4uYXJnczogYW55W10pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgYW55LCBhbnk+PigpXG5cbiAgY29uc3QgaGFzQWN0aW9uID0gKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYWN0aW9ucyBhcyBhbnksIGtleSlcblxuICBjb25zdCBkaXNwYXRjaGVyczogQm91bmRBcGk8U2gsIFI+WydkaXNwYXRjaGVycyddID0gbmV3IFByb3h5KHt9IGFzIGFueSwge1xuICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGlmICghaGFzQWN0aW9uKHByb3ApKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IGNhY2hlZCA9IGRpc3BhdGNoZXJDYWNoZS5nZXQocHJvcClcbiAgICAgIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWRcblxuICAgICAgY29uc3QgdG9rZW4gPSAoYWN0aW9ucyBhcyBhbnkpW3Byb3BdIGFzIEFjdGlvbi5BbnlBY3Rpb25Ub2tlblxuICAgICAgY29uc3QgZm4gPSAoLi4uYXJnczogYW55W10pID0+IHJ1bnRpbWUuZGlzcGF0Y2goKHRva2VuIGFzIGFueSkoLi4uYXJncykpXG5cbiAgICAgIGRpc3BhdGNoZXJDYWNoZS5zZXQocHJvcCwgZm4pXG4gICAgICByZXR1cm4gZm5cbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIHByb3ApID0+IHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBoYXNBY3Rpb24ocHJvcCksXG4gICAgb3duS2V5czogKCkgPT4gT2JqZWN0LmtleXMoYWN0aW9ucyBhcyBhbnkpLFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gJ3N0cmluZycpIHJldHVybiB1bmRlZmluZWRcbiAgICAgIGlmICghaGFzQWN0aW9uKHByb3ApKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgICByZXR1cm4geyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfVxuICAgIH0sXG4gIH0pIGFzIHVua25vd24gYXMgQm91bmRBcGk8U2gsIFI+WydkaXNwYXRjaGVycyddXG5cbiAgY29uc3QgZGlzcGF0Y2g6IEJvdW5kQXBpPFNoLCBSPlsnZGlzcGF0Y2gnXSA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgIGNvbnN0IFtmaXJzdCwgc2Vjb25kXSA9IGFyZ3NcblxuICAgIGlmICh0eXBlb2YgZmlyc3QgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcnVudGltZS5kaXNwYXRjaCh7IF90YWc6IGZpcnN0LCBwYXlsb2FkOiBzZWNvbmQgfSBhcyBMb2dpeC5BY3Rpb25PZjxTaD4pXG4gICAgfVxuXG4gICAgaWYgKEFjdGlvbi5pc0FjdGlvblRva2VuKGZpcnN0KSkge1xuICAgICAgcmV0dXJuIHJ1bnRpbWUuZGlzcGF0Y2goKGZpcnN0IGFzIGFueSkoc2Vjb25kKSlcbiAgICB9XG5cbiAgICByZXR1cm4gcnVudGltZS5kaXNwYXRjaChmaXJzdCBhcyBMb2dpeC5BY3Rpb25PZjxTaD4pXG4gIH1cblxuICBjb25zdCBtYXRjaEFwaSA9IDxWPih2YWx1ZTogVik6IExvZ2ljLkZsdWVudE1hdGNoPFY+ID0+IE1hdGNoQnVpbGRlci5tYWtlTWF0Y2godmFsdWUpXG5cbiAgY29uc3QgbWF0Y2hUYWdBcGkgPSA8ViBleHRlbmRzIHsgX3RhZzogc3RyaW5nIH0+KHZhbHVlOiBWKTogTG9naWMuRmx1ZW50TWF0Y2hUYWc8Vj4gPT5cbiAgICBNYXRjaEJ1aWxkZXIubWFrZU1hdGNoVGFnKHZhbHVlKVxuXG4gIC8vIFByaW1hcnkgcmVkdWNlciByZWdpc3RyYXRpb246IHdyaXRlIGludG8gdGhlIHJlZHVjZXIgbWFwIHZpYSB0aGUgcnVudGltZSdzIGludGVybmFsIHJlZ2lzdHJhci5cbiAgY29uc3QgcmVkdWNlcjogQm91bmRBcGk8U2gsIFI+WydyZWR1Y2VyJ10gPSAodGFnLCBmbikgPT4ge1xuICAgIHJldHVybiBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICBydW50aW1lSW50ZXJuYWxzLnR4bi5yZWdpc3RlclJlZHVjZXIoU3RyaW5nKHRhZyksIGZuIGFzIGFueSlcbiAgICB9KSBhcyBhbnlcbiAgfVxuXG4gIGNvbnN0IGVmZmVjdDogQm91bmRBcGk8U2gsIFI+WydlZmZlY3QnXSA9ICh0b2tlbiwgaGFuZGxlcikgPT5cbiAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBpZiAoIUFjdGlvbi5pc0FjdGlvblRva2VuKHRva2VuKSkge1xuICAgICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5kaWVNZXNzYWdlKCdbQm91bmRBcGkuZWZmZWN0XSB0b2tlbiBtdXN0IGJlIGFuIEFjdGlvblRva2VuJylcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGhhc2UgPSBnZXRDdXJyZW50UGhhc2UoKVxuICAgICAgY29uc3QgbG9naWNVbml0ID0gb3B0aW9ucz8ubG9naWNVbml0XG5cbiAgICAgIHlpZWxkKiBydW50aW1lSW50ZXJuYWxzLmVmZmVjdHMucmVnaXN0ZXJFZmZlY3Qoe1xuICAgICAgICBhY3Rpb25UYWc6IHRva2VuLnRhZyxcbiAgICAgICAgaGFuZGxlcjogaGFuZGxlciBhcyBhbnksXG4gICAgICAgIHBoYXNlLFxuICAgICAgICAuLi4obG9naWNVbml0XG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGxvZ2ljVW5pdDoge1xuICAgICAgICAgICAgICAgIGxvZ2ljVW5pdElkOiBsb2dpY1VuaXQubG9naWNVbml0SWQsXG4gICAgICAgICAgICAgICAgbG9naWNVbml0TGFiZWw6IGxvZ2ljVW5pdC5sb2dpY1VuaXRMYWJlbCxcbiAgICAgICAgICAgICAgICBwYXRoOiBsb2dpY1VuaXQucGF0aCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pXG4gICAgfSkgYXMgYW55XG5cbiAgY29uc3QgYXBpOiBCb3VuZEFwaTxTaCwgUj4gPSB7XG4gICAgcm9vdDoge1xuICAgICAgcmVzb2x2ZTogKHRhZzogYW55KSA9PiB7XG4gICAgICAgIGd1YXJkUnVuT25seSgncm9vdF9yZXNvbHZlX2luX3NldHVwJywgJyQucm9vdC5yZXNvbHZlJylcbiAgICAgICAgcmV0dXJuIFJvb3QucmVzb2x2ZSh0YWcsIHtcbiAgICAgICAgICBlbnRyeXBvaW50OiAnbG9naWMuJC5yb290LnJlc29sdmUnLFxuICAgICAgICAgIHdhaXRGb3JSZWFkeTogdHJ1ZSxcbiAgICAgICAgfSkgYXMgYW55XG4gICAgICB9LFxuICAgIH0sXG4gICAgc3RhdGU6IHN0YXRlQXBpLFxuICAgIGFjdGlvbnMsXG4gICAgZGlzcGF0Y2hlcnMsXG4gICAgZGlzcGF0Y2gsXG4gICAgZmxvdzogZmxvd0FwaSxcbiAgICBtYXRjaDogbWF0Y2hBcGksXG4gICAgbWF0Y2hUYWc6IG1hdGNoVGFnQXBpLFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25Jbml0UmVxdWlyZWQ6IChlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4pID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSAncnVuJykge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKCckLmxpZmVjeWNsZS5vbkluaXRSZXF1aXJlZCcpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVySW5pdFJlcXVpcmVkKGVmZiBhcyBhbnkpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvblN0YXJ0OiAoZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gJ3J1bicpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbignJC5saWZlY3ljbGUub25TdGFydCcpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyU3RhcnQoZWZmIGFzIGFueSlcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICAgIG9uSW5pdDogKGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPikgPT4ge1xuICAgICAgICAvLyBMZWdhY3kgYWxpYXM6IHNhbWUgc2VtYW50aWNzIGFzIG9uSW5pdFJlcXVpcmVkICh0byByZWR1Y2UgbWlncmF0aW9uIGZyaWN0aW9uKS5cbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSAncnVuJykge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKCckLmxpZmVjeWNsZS5vbkluaXQnKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlckluaXRSZXF1aXJlZChlZmYgYXMgYW55KVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25EZXN0cm95OiAoZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gJ3J1bicpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbignJC5saWZlY3ljbGUub25EZXN0cm95JykgYXMgYW55XG4gICAgICAgIH1cbiAgICAgICAgcnVudGltZUludGVybmFscy5saWZlY3ljbGUucmVnaXN0ZXJEZXN0cm95KGVmZiBhcyBhbnkpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoXG4gICAgICAgIGhhbmRsZXI6IChcbiAgICAgICAgICBjYXVzZTogaW1wb3J0KCdlZmZlY3QnKS5DYXVzZS5DYXVzZTx1bmtub3duPixcbiAgICAgICAgICBjb250ZXh0OiBMaWZlY3ljbGUuRXJyb3JDb250ZXh0LFxuICAgICAgICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIFI+LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gJ3J1bicpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbignJC5saWZlY3ljbGUub25FcnJvcicpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyT25FcnJvcihoYW5kbGVyIGFzIGFueSlcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICAgIG9uU3VzcGVuZDogKGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPikgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09ICdydW4nKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oJyQubGlmZWN5Y2xlLm9uU3VzcGVuZCcpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyUGxhdGZvcm1TdXNwZW5kKEVmZmVjdC5hc1ZvaWQoZWZmIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pKVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25SZXN1bWU6IChlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4pID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSAncnVuJykge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKCckLmxpZmVjeWNsZS5vblJlc3VtZScpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyUGxhdGZvcm1SZXN1bWUoRWZmZWN0LmFzVm9pZChlZmYgYXMgRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PikpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvblJlc2V0OiAoZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gJ3J1bicpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbignJC5saWZlY3ljbGUub25SZXNldCcpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyUGxhdGZvcm1SZXNldChFZmZlY3QuYXNWb2lkKGVmZiBhcyBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+KSlcbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICB9LFxuICAgIHRyYWl0czoge1xuICAgICAgZGVjbGFyZTogKHRyYWl0czogTW9kdWxlVHJhaXRzLlRyYWl0U3BlYykgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09ICdydW4nKSB7XG4gICAgICAgICAgdGhyb3cgTG9naWNEaWFnbm9zdGljcy5tYWtlTG9naWNQaGFzZUVycm9yKFxuICAgICAgICAgICAgJ3RyYWl0c19kZWNsYXJlX2luX3J1bicsXG4gICAgICAgICAgICAnJC50cmFpdHMuZGVjbGFyZScsXG4gICAgICAgICAgICAncnVuJyxcbiAgICAgICAgICAgIG9wdGlvbnM/Lm1vZHVsZUlkLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdHJhaXRzIHx8IHR5cGVvZiB0cmFpdHMgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbSW52YWxpZFRyYWl0c0RlY2xhcmF0aW9uXSAkLnRyYWl0cy5kZWNsYXJlIGV4cGVjdHMgYW4gb2JqZWN0LicpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2dpY1VuaXQgPSBvcHRpb25zPy5sb2dpY1VuaXQgPz8ge1xuICAgICAgICAgIGxvZ2ljVW5pdElkOiAndW5rbm93bicsXG4gICAgICAgICAgbG9naWNVbml0SWRLaW5kOiAnZGVyaXZlZCcgYXMgY29uc3QsXG4gICAgICAgICAgbG9naWNVbml0TGFiZWw6ICdsb2dpY1VuaXQ6dW5rbm93bicsXG4gICAgICAgICAgcGF0aDogdW5kZWZpbmVkIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMudHJhaXRzLnJlZ2lzdGVyTW9kdWxlVHJhaXRzQ29udHJpYnV0aW9uKHtcbiAgICAgICAgICB0cmFpdHMsXG4gICAgICAgICAgcHJvdmVuYW5jZToge1xuICAgICAgICAgICAgb3JpZ2luVHlwZTogJ2xvZ2ljVW5pdCcsXG4gICAgICAgICAgICBvcmlnaW5JZDogbG9naWNVbml0LmxvZ2ljVW5pdElkLFxuICAgICAgICAgICAgb3JpZ2luSWRLaW5kOiBsb2dpY1VuaXQubG9naWNVbml0SWRLaW5kLFxuICAgICAgICAgICAgb3JpZ2luTGFiZWw6IGxvZ2ljVW5pdC5sb2dpY1VuaXRMYWJlbCxcbiAgICAgICAgICAgIHBhdGg6IGxvZ2ljVW5pdC5wYXRoLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgc291cmNlOiB7XG4gICAgICAgIHJlZnJlc2g6IChmaWVsZFBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgcmVhZG9ubHkgZm9yY2U/OiBib29sZWFuIH0pID0+XG4gICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHJ1bnRpbWVJbnRlcm5hbHMudHJhaXRzLmdldFNvdXJjZVJlZnJlc2hIYW5kbGVyKGZpZWxkUGF0aCkgYXNcbiAgICAgICAgICAgICAgfCAoKHN0YXRlOiBMb2dpeC5TdGF0ZU9mPFNoPikgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PilcbiAgICAgICAgICAgICAgfCB1bmRlZmluZWRcbiAgICAgICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgICAvLyBJZiBubyByZWZyZXNoIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCwgdHJlYXQgaXQgYXMgYSBuby1vcCB0byBhdm9pZCB0aHJvd2luZyB3aGVuIFN0YXRlVHJhaXRQcm9ncmFtIGlzIG5vdCBpbnN0YWxsZWQuXG4gICAgICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZm9yY2UgPSBvcHRpb25zPy5mb3JjZSA9PT0gdHJ1ZVxuICAgICAgICAgICAgY29uc3QgcnVuSGFuZGxlciA9IChzdGF0ZTogTG9naXguU3RhdGVPZjxTaD4pID0+XG4gICAgICAgICAgICAgIGZvcmNlID8gRWZmZWN0LmxvY2FsbHkoVGFza1J1bm5lci5mb3JjZVNvdXJjZVJlZnJlc2gsIHRydWUpKGhhbmRsZXIoc3RhdGUpKSA6IGhhbmRsZXIoc3RhdGUpXG5cbiAgICAgICAgICAgIC8vIE5ldmVyIGNhbGwgZW5xdWV1ZVRyYW5zYWN0aW9uIGluc2lkZSB0aGUgdHJhbnNhY3Rpb24gd2luZG93IChpdCBjYW4gZGVhZGxvY2spOlxuICAgICAgICAgICAgLy8gLSBSdW4gdGhlIGhhbmRsZXIgaW5zaWRlIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIHNvIGl0IHdyaXRlcyB0byB0aGUgZHJhZnQgdmlhIGJvdW5kLnN0YXRlLm11dGF0ZS5cbiAgICAgICAgICAgIC8vIC0gVGhlIG91dGVyIHRyYW5zYWN0aW9uIHdpbmRvdyBpcyByZXNwb25zaWJsZSBmb3IgY29tbWl0ICsgZGVidWcgYWdncmVnYXRpb24uXG4gICAgICAgICAgICBjb25zdCBpblR4biA9IHlpZWxkKiBGaWJlclJlZi5nZXQoVGFza1J1bm5lci5pblN5bmNUcmFuc2FjdGlvbkZpYmVyKVxuICAgICAgICAgICAgaWYgKGluVHhuKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gKHlpZWxkKiBydW50aW1lLmdldFN0YXRlKSBhcyBMb2dpeC5TdGF0ZU9mPFNoPlxuICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHJ1bkhhbmRsZXIoc3RhdGUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRyZWF0IG9uZSBzb3VyY2UtcmVmcmVzaCBhcyBhIGRlZGljYXRlZCB0cmFuc2FjdGlvbiBlbnRyeS5cbiAgICAgICAgICAgIHJldHVybiB5aWVsZCogcnVudGltZUludGVybmFscy50eG4ucnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBraW5kOiAnc291cmNlLXJlZnJlc2gnLFxuICAgICAgICAgICAgICAgIG5hbWU6IGZpZWxkUGF0aCxcbiAgICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSAoeWllbGQqIHJ1bnRpbWUuZ2V0U3RhdGUpIGFzIExvZ2l4LlN0YXRlT2Y8U2g+XG4gICAgICAgICAgICAgICAgICByZXR1cm4geWllbGQqIHJ1bkhhbmRsZXIoc3RhdGUpXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVkdWNlcixcbiAgICBlZmZlY3QsXG4gICAgdXNlOiBuZXcgUHJveHkoKCkgPT4ge30sIHtcbiAgICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIFthcmddKSA9PiB7XG4gICAgICAgIGd1YXJkUnVuT25seSgndXNlX2luX3NldHVwJywgJyQudXNlJylcbiAgICAgICAgaWYgKGlzTW9kdWxlTGlrZShhcmcpKSB7XG4gICAgICAgICAgY29uc3QgZG9tYWluID0gYXJnXG4gICAgICAgICAgY29uc3QgdGFnID0gZG9tYWluLnRhZyBhcyB1bmtub3duIGFzIENvbnRleHQuVGFnPGFueSwgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4+XG5cbiAgICAgICAgICBjb25zdCByZXNvbHZlQW5kQnVpbGQgPSByZXNvbHZlTW9kdWxlUnVudGltZSh0YWcpLnBpcGUoRWZmZWN0Lm1hcCgocnQpID0+IGJ1aWxkTW9kdWxlSGFuZGxlKHRhZywgcnQpKSlcblxuICAgICAgICAgIGNvbnN0IHJlc29sdmVXaXRoRGVzY3JpcHRvciA9IHJlc29sdmVNb2R1bGVSdW50aW1lKHRhZykucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC50YXAoKHJ0KSA9PiBlbWl0TW9kdWxlRGVzY3JpcHRvck9uY2UoZG9tYWluLCBydCkpLFxuICAgICAgICAgICAgRWZmZWN0Lm1hcCgocnQpID0+IGJ1aWxkTW9kdWxlSGFuZGxlKHRhZywgcnQpKSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBjb25zdCBkZXRlY3RBbmRTZWxlY3QgPSBGaWJlclJlZi5nZXQoRGVidWcuY3VycmVudERpYWdub3N0aWNzTGV2ZWwpLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QudGFwKChsZXZlbCkgPT4ge1xuICAgICAgICAgICAgICBjYWNoZWREaWFnbm9zdGljc0xldmVsID0gbGV2ZWxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgRWZmZWN0LmZsYXRNYXAoKGxldmVsKSA9PiAobGV2ZWwgPT09ICdvZmYnID8gcmVzb2x2ZUFuZEJ1aWxkIDogcmVzb2x2ZVdpdGhEZXNjcmlwdG9yKSksXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgLy8gMDIyIHBlcmYgZ2F0ZTogd2hlbiBkaWFnbm9zdGljcyBhcmUgb2ZmLCAkLnVzZShtb2R1bGUpIGFuZCAkLnVzZShtb2R1bGUudGFnKSBtdXN0IGJlIGVxdWl2YWxlbnQgd2l0aCB6ZXJvIGV4dHJhIG92ZXJoZWFkLlxuICAgICAgICAgIC8vIENvbnN0cmFpbnQ6IEVmZmVjdCBpcyBhIHZhbHVlIChyZXVzYWJsZSksIHNvIHdlIG11c3Qgb25lLXRpbWUgY2FjaGUgYXQgZXhlY3V0aW9uIHRpbWUgaW5zdGVhZCBvZiBicmFuY2hpbmcgYXQgY29uc3RydWN0aW9uIHRpbWUuXG4gICAgICAgICAgcmV0dXJuIEVmZmVjdC5zdXNwZW5kKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChjYWNoZWREaWFnbm9zdGljc0xldmVsID09PSAnb2ZmJykge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUFuZEJ1aWxkXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjYWNoZWREaWFnbm9zdGljc0xldmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVXaXRoRGVzY3JpcHRvclxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGV0ZWN0QW5kU2VsZWN0XG4gICAgICAgICAgfSkgYXMgdW5rbm93biBhcyBMb2dpYy5PZjxTaCwgUiwgYW55LCBuZXZlcj5cbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29udGV4dC5pc1RhZyhhcmcpKSB7XG4gICAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gYXJnIGFzIHsgX2tpbmQ/OiB1bmtub3duIH1cblxuICAgICAgICAgIC8vIE1vZHVsZTogcmV0dXJuIGEgcmVhZC1vbmx5IE1vZHVsZUhhbmRsZSB2aWV3LlxuICAgICAgICAgIGlmIChjYW5kaWRhdGUuX2tpbmQgPT09ICdNb2R1bGVUYWcnKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZU1vZHVsZVJ1bnRpbWUoYXJnIGFzIGFueSkucGlwZShcbiAgICAgICAgICAgICAgRWZmZWN0Lm1hcCgocnQ6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+KSA9PiBidWlsZE1vZHVsZUhhbmRsZShhcmcgYXMgYW55LCBydCkpLFxuICAgICAgICAgICAgKSBhcyB1bmtub3duIGFzIExvZ2ljLk9mPFNoLCBSLCBhbnksIG5ldmVyPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlZ3VsYXIgc2VydmljZSB0YWc6IHJlYWQgdGhlIHNlcnZpY2UgZnJvbSBFbnYuXG4gICAgICAgICAgcmV0dXJuIGFyZyBhcyB1bmtub3duIGFzIExvZ2ljLk9mPFNoLCBSLCBhbnksIG5ldmVyPlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFZmZlY3QuZGllKCdCb3VuZEFwaS51c2U6IHVuc3VwcG9ydGVkIGFyZ3VtZW50JykgYXMgdW5rbm93biBhcyBMb2dpYy5PZjxTaCwgUiwgYW55LCBuZXZlcj5cbiAgICAgIH0sXG4gICAgfSkgYXMgdW5rbm93biBhcyBCb3VuZEFwaTxTaCwgUj5bJ3VzZSddLFxuICAgIG9uQWN0aW9uOiBuZXcgUHJveHkoKCkgPT4ge30sIHtcbiAgICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIGFyZ3MpID0+IHtcbiAgICAgICAgZ3VhcmRSdW5Pbmx5KCd1c2VfaW5fc2V0dXAnLCAnJC5vbkFjdGlvbicpXG4gICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NbMF1cbiAgICAgICAgaWYgKEFjdGlvbi5pc0FjdGlvblRva2VuKGFyZykpIHtcbiAgICAgICAgICBjb25zdCB0YWcgPSBhcmcudGFnXG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIoXG4gICAgICAgICAgICBydW50aW1lLmFjdGlvbnMkLnBpcGUoXG4gICAgICAgICAgICAgIFN0cmVhbS5maWx0ZXIoKGE6IGFueSkgPT4gYS5fdGFnID09PSB0YWcgfHwgYS50eXBlID09PSB0YWcpLFxuICAgICAgICAgICAgICBTdHJlYW0ubWFwKChhOiBhbnkpID0+IGEucGF5bG9hZCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGFnLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKHJ1bnRpbWUuYWN0aW9ucyQucGlwZShTdHJlYW0uZmlsdGVyKGFyZykpKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKFxuICAgICAgICAgICAgcnVudGltZS5hY3Rpb25zJC5waXBlKFN0cmVhbS5maWx0ZXIoKGE6IGFueSkgPT4gYS5fdGFnID09PSBhcmcgfHwgYS50eXBlID09PSBhcmcpKSxcbiAgICAgICAgICAgIGFyZyxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmICgnX3RhZycgaW4gYXJnKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihcbiAgICAgICAgICAgICAgcnVudGltZS5hY3Rpb25zJC5waXBlKFN0cmVhbS5maWx0ZXIoKGE6IGFueSkgPT4gYS5fdGFnID09PSAoYXJnIGFzIGFueSkuX3RhZykpLFxuICAgICAgICAgICAgICBTdHJpbmcoKGFyZyBhcyBhbnkpLl90YWcpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoU2NoZW1hLmlzU2NoZW1hKGFyZykpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKFxuICAgICAgICAgICAgICBydW50aW1lLmFjdGlvbnMkLnBpcGUoXG4gICAgICAgICAgICAgICAgU3RyZWFtLmZpbHRlcigoYTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBTY2hlbWEuZGVjb2RlVW5rbm93blN5bmMoYXJnIGFzIFNjaGVtYS5TY2hlbWE8YW55LCBhbnksIG5ldmVyPikoYSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiAhIXJlc3VsdFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihydW50aW1lLmFjdGlvbnMkKVxuICAgICAgfSxcbiAgICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IHtcbiAgICAgICAgZ3VhcmRSdW5Pbmx5KCd1c2VfaW5fc2V0dXAnLCAnJC5vbkFjdGlvbicpXG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihcbiAgICAgICAgICAgIHJ1bnRpbWUuYWN0aW9ucyQucGlwZShTdHJlYW0uZmlsdGVyKChhOiBhbnkpID0+IGEuX3RhZyA9PT0gcHJvcCB8fCBhLnR5cGUgPT09IHByb3ApKSxcbiAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH0sXG4gICAgfSkgYXMgdW5rbm93biBhcyBCb3VuZEFwaTxTaCwgUj5bJ29uQWN0aW9uJ10sXG4gICAgb25TdGF0ZTogKHNlbGVjdG9yOiAoczogTG9naXguU3RhdGVPZjxTaD4pID0+IGFueSkgPT4ge1xuICAgICAgZ3VhcmRSdW5Pbmx5KCd1c2VfaW5fc2V0dXAnLCAnJC5vblN0YXRlJylcbiAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKHJ1bnRpbWUuY2hhbmdlcyhzZWxlY3RvcikpXG4gICAgfSxcbiAgICBvbjogKHN0cmVhbTogU3RyZWFtLlN0cmVhbTxhbnk+KSA9PiB7XG4gICAgICBndWFyZFJ1bk9ubHkoJ3VzZV9pbl9zZXR1cCcsICckLm9uJylcbiAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKHN0cmVhbSlcbiAgICB9LFxuICB9IGFzIGFueVxuXG4gIHNldEJvdW5kSW50ZXJuYWxzKGFwaSBhcyBhbnksIHJ1bnRpbWVJbnRlcm5hbHMpXG5cbiAgcmV0dXJuIGFwaVxufVxuIiwgImltcG9ydCB7IENhdXNlLCBDb250ZXh0LCBFZmZlY3QsIFJlZiB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB7IHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5IH0gZnJvbSAnLi9lcnJvclN1bW1hcnkuanMnXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tICcuL0RlYnVnU2luay5qcydcblxuZXhwb3J0IHR5cGUgUGhhc2UgPSAnaW5pdCcgfCAncnVuJyB8ICdkZXN0cm95JyB8ICdwbGF0Zm9ybSdcblxuZXhwb3J0IHR5cGUgSG9vayA9ICdpbml0UmVxdWlyZWQnIHwgJ3N0YXJ0JyB8ICdkZXN0cm95JyB8ICdzdXNwZW5kJyB8ICdyZXN1bWUnIHwgJ3Jlc2V0JyB8ICd1bmtub3duJ1xuXG5leHBvcnQgdHlwZSBUYXNrS2luZCA9ICdpbml0UmVxdWlyZWQnIHwgJ3N0YXJ0JyB8ICdkZXN0cm95JyB8ICdwbGF0Zm9ybVN1c3BlbmQnIHwgJ3BsYXRmb3JtUmVzdW1lJyB8ICdwbGF0Zm9ybVJlc2V0J1xuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yQ29udGV4dCB7XG4gIHJlYWRvbmx5IHBoYXNlOiBQaGFzZVxuICByZWFkb25seSBob29rOiBIb29rXG4gIHJlYWRvbmx5IG1vZHVsZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IHRhc2tJZD86IHN0cmluZ1xuICByZWFkb25seSB0eG5TZXE/OiBudW1iZXJcbiAgcmVhZG9ubHkgb3BTZXE/OiBudW1iZXJcbiAgLyoqXG4gICAqIEZvciBkaWFnbm9zdGljcyBvbmx5OiBhbiBpbXBsZW1lbnRhdGlvbi1zaWRlIG1hcmtlciBpbmRpY2F0aW5nIHdoZXJlIHRoZSBlcnJvciBvcmlnaW5hdGVkLFxuICAgKiBlLmcuIFwibG9naWMuZm9ya1wiIC8gXCJpbml0UmVxdWlyZWRcIiAvIFwic3RhcnRcIi5cbiAgICpcbiAgICogTm90ZTogdGhpcyBmaWVsZCBtdXN0IGJlIHNlcmlhbGl6YWJsZSBhbmQgbXVzdCBub3QgYmVjb21lIGEgcHJvdG9jb2wgYW5jaG9yLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlUnVudGltZUlkZW50aXR5IHtcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIEluc3RhbmNlU3RhdHVzID0gJ2NyZWF0aW5nJyB8ICdpbml0aWFsaXppbmcnIHwgJ3JlYWR5JyB8ICdmYWlsZWQnIHwgJ3Rlcm1pbmF0aW5nJyB8ICd0ZXJtaW5hdGVkJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEluaXRQcm9ncmVzcyB7XG4gIHJlYWRvbmx5IHRvdGFsOiBudW1iZXJcbiAgcmVhZG9ubHkgY29tcGxldGVkOiBudW1iZXJcbiAgcmVhZG9ubHkgY3VycmVudD86IG51bWJlclxuICByZWFkb25seSBzdGFydGVkQXQ/OiBudW1iZXJcbn1cblxuZXhwb3J0IHR5cGUgTGlmZWN5Y2xlT3V0Y29tZSA9XG4gIHwgeyByZWFkb25seSBzdGF0dXM6ICdzdWNjZXNzJyB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgc3RhdHVzOiAnZmFpbHVyZSdcbiAgICAgIHJlYWRvbmx5IGVycm9yOiBpbXBvcnQoJy4vZXJyb3JTdW1tYXJ5LmpzJykuU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5XG4gICAgfVxuXG5leHBvcnQgaW50ZXJmYWNlIExpZmVjeWNsZVN0YXR1cyB7XG4gIHJlYWRvbmx5IGlkZW50aXR5OiBNb2R1bGVSdW50aW1lSWRlbnRpdHlcbiAgcmVhZG9ubHkgc3RhdHVzOiBJbnN0YW5jZVN0YXR1c1xuICByZWFkb25seSBpbml0T3V0Y29tZT86IExpZmVjeWNsZU91dGNvbWVcbiAgcmVhZG9ubHkgaW5pdFByb2dyZXNzPzogSW5pdFByb2dyZXNzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFza1JlZiB7XG4gIHJlYWRvbmx5IHRhc2tJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGtpbmQ6IFRhc2tLaW5kXG4gIHJlYWRvbmx5IG9yZGVyOiBudW1iZXJcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZ1xuICByZWFkb25seSBmYXRhbE9uRmFpbHVyZT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaWZlY3ljbGVUYXNrIGV4dGVuZHMgVGFza1JlZiB7XG4gIHJlYWRvbmx5IGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1ZGdldHMge1xuICAvKiogUGVyLWluc3RhbmNlIGxpZmVjeWNsZSBldmVudCBidWRnZXQgKGFsaWduZWQgd2l0aCBzcGVjcy8wMTEgZGF0YS1tb2RlbDsgZGVmYXVsdCBcdTIyNjQgMjApLiAqL1xuICByZWFkb25seSBtYXhFdmVudHNQZXJJbnN0YW5jZTogbnVtYmVyXG4gIC8qKiBQZXItZXZlbnQgc2l6ZSBidWRnZXQgKGFsaWduZWQgd2l0aCBzcGVjcy8wMTEgZGF0YS1tb2RlbDsgZGVmYXVsdCBcdTIyNjQgNEtCKS4gKi9cbiAgcmVhZG9ubHkgbWF4RXZlbnRCeXRlczogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlmZWN5Y2xlTWFuYWdlciB7XG4gIHJlYWRvbmx5IGlkZW50aXR5OiBNb2R1bGVSdW50aW1lSWRlbnRpdHlcbiAgcmVhZG9ubHkgYnVkZ2V0czogQnVkZ2V0c1xuXG4gIHJlYWRvbmx5IHJlZ2lzdGVyUGxhdGZvcm1TdXNwZW5kOiAoXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfSxcbiAgKSA9PiB2b2lkXG4gIHJlYWRvbmx5IHJlZ2lzdGVyUGxhdGZvcm1SZXN1bWU6IChcbiAgICBlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sXG4gICAgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9LFxuICApID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVnaXN0ZXJQbGF0Zm9ybVJlc2V0OiAoXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfSxcbiAgKSA9PiB2b2lkXG5cbiAgcmVhZG9ubHkgcmVnaXN0ZXJJbml0UmVxdWlyZWQ6IChlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfSkgPT4gdm9pZFxuICByZWFkb25seSByZWdpc3RlclN0YXJ0OiAoXG4gICAgZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7IHJlYWRvbmx5IGZhdGFsT25GYWlsdXJlPzogYm9vbGVhbiB9LFxuICApID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVnaXN0ZXJEZXN0cm95OiAoZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LCBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH0pID0+IHZvaWRcbiAgcmVhZG9ubHkgcmVnaXN0ZXJPbkVycm9yOiAoXG4gICAgaGFuZGxlcjogKGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPiwgY29udGV4dDogRXJyb3JDb250ZXh0KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LFxuICApID0+IHZvaWRcblxuICByZWFkb25seSBnZXRTdGF0dXM6IEVmZmVjdC5FZmZlY3Q8TGlmZWN5Y2xlU3RhdHVzPlxuICByZWFkb25seSBzZXRTdGF0dXM6IChcbiAgICBzdGF0dXM6IEluc3RhbmNlU3RhdHVzLFxuICAgIHBhdGNoPzoge1xuICAgICAgcmVhZG9ubHkgaW5pdE91dGNvbWU/OiBMaWZlY3ljbGVPdXRjb21lIHwgdW5kZWZpbmVkXG4gICAgICByZWFkb25seSBpbml0UHJvZ3Jlc3M/OiBJbml0UHJvZ3Jlc3MgfCB1bmRlZmluZWRcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgIH0sXG4gICkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPlxuXG4gIHJlYWRvbmx5IG5vdGlmeUVycm9yOiAoY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LCBjb250ZXh0OiBFcnJvckNvbnRleHQpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cblxuICByZWFkb25seSBydW5QbGF0Zm9ybVN1c3BlbmQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgcmVhZG9ubHkgcnVuUGxhdGZvcm1SZXN1bWU6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cbiAgcmVhZG9ubHkgcnVuUGxhdGZvcm1SZXNldDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuXG4gIHJlYWRvbmx5IHJ1bkluaXRSZXF1aXJlZDogRWZmZWN0LkVmZmVjdDx2b2lkLCB1bmtub3duLCBhbnk+XG4gIHJlYWRvbmx5IHJ1blN0YXJ0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gIHJlYWRvbmx5IHJ1bkRlc3Ryb3k6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT5cblxuICAvKiogRGlhZ25vc3RpY3Mgb25seTogd2hldGhlciBhbnkgb25FcnJvciBoYW5kbGVyIGhhcyBiZWVuIHJlZ2lzdGVyZWQuICovXG4gIHJlYWRvbmx5IGhhc09uRXJyb3JIYW5kbGVyczogRWZmZWN0LkVmZmVjdDxib29sZWFuPlxuXG4gIC8qKiBUZXN0cy9kaWFnbm9zdGljcyBvbmx5OiByZWFkIGEgc25hcHNob3Qgb2YgcmVnaXN0ZXJlZCB0YXNrcyAoaW1tdXRhYmxlIHZpZXcpLiAqL1xuICByZWFkb25seSBnZXRUYXNrU25hcHNob3Q6IEVmZmVjdC5FZmZlY3Q8XG4gICAgUmVhZG9ubHk8e1xuICAgICAgcmVhZG9ubHkgaW5pdFJlcXVpcmVkOiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgICByZWFkb25seSBzdGFydDogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgICAgcmVhZG9ubHkgZGVzdHJveTogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgICAgcmVhZG9ubHkgcGxhdGZvcm1TdXNwZW5kOiBSZWFkb25seUFycmF5PFRhc2tSZWY+XG4gICAgICByZWFkb25seSBwbGF0Zm9ybVJlc3VtZTogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgICAgcmVhZG9ubHkgcGxhdGZvcm1SZXNldDogUmVhZG9ubHlBcnJheTxUYXNrUmVmPlxuICAgIH0+LFxuICAgIG5ldmVyLFxuICAgIG5ldmVyXG4gID5cbn1cblxuZXhwb3J0IGNvbnN0IExpZmVjeWNsZUNvbnRleHQgPSBDb250ZXh0LkdlbmVyaWNUYWc8TGlmZWN5Y2xlTWFuYWdlcj4oJ0Bsb2dpeGpzL0xpZmVjeWNsZU1hbmFnZXInKVxuXG5jb25zdCBzYWZlUnVuID0gKGxhYmVsOiBzdHJpbmcsIGVmZjogRWZmZWN0LkVmZmVjdDx2b2lkLCBhbnksIGFueT4pID0+XG4gIGVmZi5waXBlKFxuICAgIEVmZmVjdC5tYXRjaENhdXNlRWZmZWN0KHtcbiAgICAgIG9uU3VjY2VzczogKCkgPT4gRWZmZWN0LnZvaWQsXG4gICAgICBvbkZhaWx1cmU6IChjYXVzZSkgPT4gRWZmZWN0LmxvZ0Vycm9yKGBbJHtsYWJlbH1dIGZhaWxlZDogJHtDYXVzZS5wcmV0dHkoY2F1c2UpfWApLFxuICAgIH0pLFxuICApXG5cbmNvbnN0IG1ha2VUYXNrSWQgPSAoa2luZDogVGFza0tpbmQsIG9yZGVyOiBudW1iZXIpOiBzdHJpbmcgPT4gYCR7a2luZH06JHtvcmRlcn1gXG5cbmV4cG9ydCBjb25zdCBtYWtlTGlmZWN5Y2xlTWFuYWdlciA9IChpZGVudGl0eTogTW9kdWxlUnVudGltZUlkZW50aXR5KTogRWZmZWN0LkVmZmVjdDxMaWZlY3ljbGVNYW5hZ2VyPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgYnVkZ2V0czogQnVkZ2V0cyA9IHtcbiAgICAgIG1heEV2ZW50c1Blckluc3RhbmNlOiAyMCxcbiAgICAgIG1heEV2ZW50Qnl0ZXM6IDQgKiAxMDI0LFxuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1c1JlZiA9IHlpZWxkKiBSZWYubWFrZTxMaWZlY3ljbGVTdGF0dXM+KHtcbiAgICAgIGlkZW50aXR5LFxuICAgICAgc3RhdHVzOiAnY3JlYXRpbmcnLFxuICAgIH0pXG5cbiAgICBjb25zdCBpbml0UmVxdWlyZWQ6IExpZmVjeWNsZVRhc2tbXSA9IFtdXG4gICAgY29uc3Qgc3RhcnQ6IExpZmVjeWNsZVRhc2tbXSA9IFtdXG4gICAgY29uc3QgZGVzdHJveTogTGlmZWN5Y2xlVGFza1tdID0gW11cbiAgICBjb25zdCBwbGF0Zm9ybVN1c3BlbmQ6IExpZmVjeWNsZVRhc2tbXSA9IFtdXG4gICAgY29uc3QgcGxhdGZvcm1SZXN1bWU6IExpZmVjeWNsZVRhc2tbXSA9IFtdXG4gICAgY29uc3QgcGxhdGZvcm1SZXNldDogTGlmZWN5Y2xlVGFza1tdID0gW11cbiAgICBjb25zdCBvbkVycm9ySGFuZGxlcnM6IEFycmF5PFxuICAgICAgKGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPiwgY29udGV4dDogRXJyb3JDb250ZXh0KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+XG4gICAgPiA9IFtdXG5cbiAgICBjb25zdCBnZXRTdGF0dXM6IEVmZmVjdC5FZmZlY3Q8TGlmZWN5Y2xlU3RhdHVzPiA9IFJlZi5nZXQoc3RhdHVzUmVmKVxuXG4gICAgY29uc3QgcmVjb3JkUGhhc2UgPSAocGhhc2U6IFBoYXNlLCBuYW1lOiBzdHJpbmcsIHBheWxvYWQ/OiB1bmtub3duKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PlxuICAgICAgRGVidWcucmVjb3JkKHtcbiAgICAgICAgdHlwZTogJ2xpZmVjeWNsZTpwaGFzZScsXG4gICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgcGhhc2UsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHBheWxvYWQsXG4gICAgICB9KVxuXG4gICAgY29uc3Qgc2V0U3RhdHVzID0gKFxuICAgICAgc3RhdHVzOiBJbnN0YW5jZVN0YXR1cyxcbiAgICAgIHBhdGNoPzoge1xuICAgICAgICByZWFkb25seSBpbml0T3V0Y29tZT86IExpZmVjeWNsZU91dGNvbWUgfCB1bmRlZmluZWRcbiAgICAgICAgcmVhZG9ubHkgaW5pdFByb2dyZXNzPzogSW5pdFByb2dyZXNzIHwgdW5kZWZpbmVkXG4gICAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgfSxcbiAgICApID0+XG4gICAgICBSZWYudXBkYXRlKHN0YXR1c1JlZiwgKHByZXYpID0+ICh7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGlkZW50aXR5OiB7XG4gICAgICAgICAgLi4ucHJldi5pZGVudGl0eSxcbiAgICAgICAgICAuLi4ocGF0Y2g/LnJ1bnRpbWVMYWJlbCA/IHsgcnVudGltZUxhYmVsOiBwYXRjaC5ydW50aW1lTGFiZWwgfSA6IG51bGwpLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIC4uLihwYXRjaD8uaW5pdE91dGNvbWUgIT09IHVuZGVmaW5lZCA/IHsgaW5pdE91dGNvbWU6IHBhdGNoLmluaXRPdXRjb21lIH0gOiBudWxsKSxcbiAgICAgICAgLi4uKHBhdGNoPy5pbml0UHJvZ3Jlc3MgIT09IHVuZGVmaW5lZCA/IHsgaW5pdFByb2dyZXNzOiBwYXRjaC5pbml0UHJvZ3Jlc3MgfSA6IG51bGwpLFxuICAgICAgfSkpXG5cbiAgICBjb25zdCByZWdpc3RlckluaXRSZXF1aXJlZCA9IChlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgY29uc3Qgb3JkZXIgPSBpbml0UmVxdWlyZWQubGVuZ3RoXG4gICAgICBpbml0UmVxdWlyZWQucHVzaCh7XG4gICAgICAgIHRhc2tJZDogbWFrZVRhc2tJZCgnaW5pdFJlcXVpcmVkJywgb3JkZXIpLFxuICAgICAgICBraW5kOiAnaW5pdFJlcXVpcmVkJyxcbiAgICAgICAgb3JkZXIsXG4gICAgICAgIG5hbWU6IG9wdGlvbnM/Lm5hbWUsXG4gICAgICAgIGVmZmVjdCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJTdGFydCA9IChcbiAgICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICAgIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7IHJlYWRvbmx5IGZhdGFsT25GYWlsdXJlPzogYm9vbGVhbiB9LFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3JkZXIgPSBzdGFydC5sZW5ndGhcbiAgICAgIHN0YXJ0LnB1c2goe1xuICAgICAgICB0YXNrSWQ6IG1ha2VUYXNrSWQoJ3N0YXJ0Jywgb3JkZXIpLFxuICAgICAgICBraW5kOiAnc3RhcnQnLFxuICAgICAgICBvcmRlcixcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSxcbiAgICAgICAgZmF0YWxPbkZhaWx1cmU6IG9wdGlvbnM/LmZhdGFsT25GYWlsdXJlLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyRGVzdHJveSA9IChlZmZlY3Q6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4sIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG5hbWU/OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgY29uc3Qgb3JkZXIgPSBkZXN0cm95Lmxlbmd0aFxuICAgICAgZGVzdHJveS5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKCdkZXN0cm95Jywgb3JkZXIpLFxuICAgICAgICBraW5kOiAnZGVzdHJveScsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyT25FcnJvciA9IChcbiAgICAgIGhhbmRsZXI6IChjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIGNvbnRleHQ6IEVycm9yQ29udGV4dCkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PixcbiAgICApID0+IHtcbiAgICAgIG9uRXJyb3JIYW5kbGVycy5wdXNoKGhhbmRsZXIpXG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJQbGF0Zm9ybVN1c3BlbmQgPSAoZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LCBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH0pID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gcGxhdGZvcm1TdXNwZW5kLmxlbmd0aFxuICAgICAgcGxhdGZvcm1TdXNwZW5kLnB1c2goe1xuICAgICAgICB0YXNrSWQ6IG1ha2VUYXNrSWQoJ3BsYXRmb3JtU3VzcGVuZCcsIG9yZGVyKSxcbiAgICAgICAga2luZDogJ3BsYXRmb3JtU3VzcGVuZCcsXG4gICAgICAgIG9yZGVyLFxuICAgICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgICBlZmZlY3QsXG4gICAgICB9KVxuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lzdGVyUGxhdGZvcm1SZXN1bWUgPSAoZWZmZWN0OiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+LCBvcHRpb25zPzogeyByZWFkb25seSBuYW1lPzogc3RyaW5nIH0pID0+IHtcbiAgICAgIGNvbnN0IG9yZGVyID0gcGxhdGZvcm1SZXN1bWUubGVuZ3RoXG4gICAgICBwbGF0Zm9ybVJlc3VtZS5wdXNoKHtcbiAgICAgICAgdGFza0lkOiBtYWtlVGFza0lkKCdwbGF0Zm9ybVJlc3VtZScsIG9yZGVyKSxcbiAgICAgICAga2luZDogJ3BsYXRmb3JtUmVzdW1lJyxcbiAgICAgICAgb3JkZXIsXG4gICAgICAgIG5hbWU6IG9wdGlvbnM/Lm5hbWUsXG4gICAgICAgIGVmZmVjdCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJQbGF0Zm9ybVJlc2V0ID0gKGVmZmVjdDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55Piwgb3B0aW9ucz86IHsgcmVhZG9ubHkgbmFtZT86IHN0cmluZyB9KSA9PiB7XG4gICAgICBjb25zdCBvcmRlciA9IHBsYXRmb3JtUmVzZXQubGVuZ3RoXG4gICAgICBwbGF0Zm9ybVJlc2V0LnB1c2goe1xuICAgICAgICB0YXNrSWQ6IG1ha2VUYXNrSWQoJ3BsYXRmb3JtUmVzZXQnLCBvcmRlciksXG4gICAgICAgIGtpbmQ6ICdwbGF0Zm9ybVJlc2V0JyxcbiAgICAgICAgb3JkZXIsXG4gICAgICAgIG5hbWU6IG9wdGlvbnM/Lm5hbWUsXG4gICAgICAgIGVmZmVjdCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgbm90aWZ5RXJyb3IgPSAoY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LCBjb250ZXh0OiBFcnJvckNvbnRleHQpID0+IHtcbiAgICAgIC8vIEludGVycnVwdC9jYW5jZWwgc2hvdWxkIG5vdCBiZSByZXBvcnRlZCBhcyBhbiBlcnJvci5cbiAgICAgIGlmIChDYXVzZS5pc0ludGVycnVwdGVkKGNhdXNlKSkge1xuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIERlYnVnLnJlY29yZCh7XG4gICAgICAgIHR5cGU6ICdsaWZlY3ljbGU6ZXJyb3InLFxuICAgICAgICBtb2R1bGVJZDogY29udGV4dC5tb2R1bGVJZCxcbiAgICAgICAgaW5zdGFuY2VJZDogY29udGV4dC5pbnN0YW5jZUlkLFxuICAgICAgICBjYXVzZSxcbiAgICAgICAgcGhhc2U6IGNvbnRleHQucGhhc2UsXG4gICAgICAgIGhvb2s6IGNvbnRleHQuaG9vayxcbiAgICAgICAgdGFza0lkOiBjb250ZXh0LnRhc2tJZCxcbiAgICAgICAgdHhuU2VxOiBjb250ZXh0LnR4blNlcSxcbiAgICAgICAgb3BTZXE6IGNvbnRleHQub3BTZXEsXG4gICAgICAgIG9yaWdpbjogY29udGV4dC5vcmlnaW4sXG4gICAgICB9KS5waXBlKFxuICAgICAgICBFZmZlY3QuemlwUmlnaHQoXG4gICAgICAgICAgRWZmZWN0LmZvckVhY2goXG4gICAgICAgICAgICBvbkVycm9ySGFuZGxlcnMsXG4gICAgICAgICAgICAoaGFuZGxlcikgPT5cbiAgICAgICAgICAgICAgaGFuZGxlcihjYXVzZSwgY29udGV4dCkucGlwZShcbiAgICAgICAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoaW5uZXIpID0+IEVmZmVjdC5sb2dFcnJvcihgW2xpZmVjeWNsZS5vbkVycm9yXSBmYWlsZWQ6ICR7Q2F1c2UucHJldHR5KGlubmVyKX1gKSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB7IGRpc2NhcmQ6IHRydWUgfSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IHJ1bkluaXRSZXF1aXJlZDogRWZmZWN0LkVmZmVjdDx2b2lkLCB1bmtub3duLCBhbnk+ID0gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgdG90YWwgPSBpbml0UmVxdWlyZWQubGVuZ3RoXG4gICAgICBpZiAodG90YWwgPT09IDApIHtcbiAgICAgICAgeWllbGQqIHNldFN0YXR1cygncmVhZHknLCB7XG4gICAgICAgICAgaW5pdFByb2dyZXNzOiB7IHRvdGFsOiAwLCBjb21wbGV0ZWQ6IDAgfSxcbiAgICAgICAgICBpbml0T3V0Y29tZTogeyBzdGF0dXM6ICdzdWNjZXNzJyB9LFxuICAgICAgICB9KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKVxuICAgICAgeWllbGQqIHJlY29yZFBoYXNlKCdpbml0JywgJ2luaXRSZXF1aXJlZDpzdGFydCcsIHsgdG90YWwgfSlcbiAgICAgIHlpZWxkKiBzZXRTdGF0dXMoJ2luaXRpYWxpemluZycsIHtcbiAgICAgICAgaW5pdFByb2dyZXNzOiB7IHRvdGFsLCBjb21wbGV0ZWQ6IDAsIGN1cnJlbnQ6IDAsIHN0YXJ0ZWRBdCB9LFxuICAgICAgfSlcblxuICAgICAgbGV0IGNvbXBsZXRlZCA9IDBcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5pdFJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHlpZWxkKiBzZXRTdGF0dXMoJ2luaXRpYWxpemluZycsIHtcbiAgICAgICAgICBpbml0UHJvZ3Jlc3M6IHsgdG90YWwsIGNvbXBsZXRlZCwgY3VycmVudDogaSwgc3RhcnRlZEF0IH0sXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgdGFzayA9IGluaXRSZXF1aXJlZFtpXVxuICAgICAgICBjb25zdCBleGl0ID0geWllbGQqIEVmZmVjdC5leGl0KHRhc2suZWZmZWN0KVxuXG4gICAgICAgIGlmIChleGl0Ll90YWcgPT09ICdTdWNjZXNzJykge1xuICAgICAgICAgIGNvbXBsZXRlZCArPSAxXG4gICAgICAgICAgeWllbGQqIHNldFN0YXR1cygnaW5pdGlhbGl6aW5nJywge1xuICAgICAgICAgICAgaW5pdFByb2dyZXNzOiB7IHRvdGFsLCBjb21wbGV0ZWQsIGN1cnJlbnQ6IGkgKyAxLCBzdGFydGVkQXQgfSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdW1tYXJ5ID0gdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkoZXhpdC5jYXVzZSlcbiAgICAgICAgeWllbGQqIG5vdGlmeUVycm9yKGV4aXQuY2F1c2UsIHtcbiAgICAgICAgICBwaGFzZTogJ2luaXQnLFxuICAgICAgICAgIGhvb2s6ICdpbml0UmVxdWlyZWQnLFxuICAgICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgIHRhc2tJZDogdGFzay50YXNrSWQsXG4gICAgICAgICAgb3JpZ2luOiAnaW5pdFJlcXVpcmVkJyxcbiAgICAgICAgfSlcblxuICAgICAgICB5aWVsZCogc2V0U3RhdHVzKCdmYWlsZWQnLCB7XG4gICAgICAgICAgaW5pdFByb2dyZXNzOiB7IHRvdGFsLCBjb21wbGV0ZWQsIGN1cnJlbnQ6IGksIHN0YXJ0ZWRBdCB9LFxuICAgICAgICAgIGluaXRPdXRjb21lOiB7IHN0YXR1czogJ2ZhaWx1cmUnLCBlcnJvcjogc3VtbWFyeS5lcnJvclN1bW1hcnkgfSxcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4geWllbGQqIEVmZmVjdC5mYWlsQ2F1c2UoZXhpdC5jYXVzZSlcbiAgICAgIH1cblxuICAgICAgeWllbGQqIHJlY29yZFBoYXNlKCdpbml0JywgJ2luaXRSZXF1aXJlZDpzdWNjZXNzJywgeyB0b3RhbCB9KVxuICAgICAgeWllbGQqIHNldFN0YXR1cygncmVhZHknLCB7XG4gICAgICAgIGluaXRQcm9ncmVzczogeyB0b3RhbCwgY29tcGxldGVkLCBjdXJyZW50OiB0b3RhbCwgc3RhcnRlZEF0IH0sXG4gICAgICAgIGluaXRPdXRjb21lOiB7IHN0YXR1czogJ3N1Y2Nlc3MnIH0sXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICBjb25zdCBydW5TdGFydDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9IHJlY29yZFBoYXNlKCdydW4nLCAnc3RhcnQ6c2NoZWR1bGUnLCB7XG4gICAgICB0b3RhbDogc3RhcnQubGVuZ3RoLFxuICAgIH0pLnBpcGUoXG4gICAgICBFZmZlY3QuemlwUmlnaHQoXG4gICAgICAgIEVmZmVjdC5mb3JFYWNoKFxuICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICh0YXNrKSA9PlxuICAgICAgICAgICAgRWZmZWN0LmZvcmtTY29wZWQoXG4gICAgICAgICAgICAgIHRhc2suZWZmZWN0LnBpcGUoXG4gICAgICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICAgICAgcGhhc2U6ICdydW4nLFxuICAgICAgICAgICAgICAgICAgICBob29rOiAnc3RhcnQnLFxuICAgICAgICAgICAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IGlkZW50aXR5Lmluc3RhbmNlSWQsXG4gICAgICAgICAgICAgICAgICAgIHRhc2tJZDogdGFzay50YXNrSWQsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbjogJ3N0YXJ0JyxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLnBpcGUoRWZmZWN0LmFzVm9pZCksXG4gICAgICAgICAgeyBkaXNjYXJkOiB0cnVlLCBjb25jdXJyZW5jeTogJ3VuYm91bmRlZCcgfSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKVxuXG4gICAgY29uc3QgcnVuRGVzdHJveTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZSgnZGVzdHJveScsICdkZXN0cm95OnN0YXJ0JywgeyB0b3RhbDogZGVzdHJveS5sZW5ndGggfSlcbiAgICAgIHlpZWxkKiBzZXRTdGF0dXMoJ3Rlcm1pbmF0aW5nJylcblxuICAgICAgLy8gZGVzdHJveTogcnVuIGluIHJldmVyc2UgcmVnaXN0cmF0aW9uIG9yZGVyIChMSUZPKSwgYmVzdC1lZmZvcnQgKG9uZSBmYWlsdXJlIGRvZXMgbm90IGJsb2NrIG90aGVycykuXG4gICAgICBmb3IgKGxldCBpID0gZGVzdHJveS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBjb25zdCB0YXNrID0gZGVzdHJveVtpXVxuICAgICAgICB5aWVsZCogc2FmZVJ1bihcbiAgICAgICAgICAnbGlmZWN5Y2xlLm9uRGVzdHJveScsXG4gICAgICAgICAgdGFzay5lZmZlY3QucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICBwaGFzZTogJ2Rlc3Ryb3knLFxuICAgICAgICAgICAgICAgIGhvb2s6ICdkZXN0cm95JyxcbiAgICAgICAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogJ2Rlc3Ryb3knLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgfVxuXG4gICAgICB5aWVsZCogc2V0U3RhdHVzKCd0ZXJtaW5hdGVkJylcbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZSgnZGVzdHJveScsICdkZXN0cm95OmRvbmUnLCB7IHRvdGFsOiBkZXN0cm95Lmxlbmd0aCB9KVxuICAgIH0pXG5cbiAgICBjb25zdCBydW5QbGF0Zm9ybVN1c3BlbmQ6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBpZiAocGxhdGZvcm1TdXNwZW5kLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZSgncGxhdGZvcm0nLCAnc2lnbmFsOnN1c3BlbmQnLCB7IHRvdGFsOiBwbGF0Zm9ybVN1c3BlbmQubGVuZ3RoIH0pXG4gICAgICBmb3IgKGNvbnN0IHRhc2sgb2YgcGxhdGZvcm1TdXNwZW5kKSB7XG4gICAgICAgIHlpZWxkKiBzYWZlUnVuKFxuICAgICAgICAgICdsaWZlY3ljbGUub25TdXNwZW5kJyxcbiAgICAgICAgICB0YXNrLmVmZmVjdC5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgICBub3RpZnlFcnJvcihjYXVzZSwge1xuICAgICAgICAgICAgICAgIHBoYXNlOiAncGxhdGZvcm0nLFxuICAgICAgICAgICAgICAgIGhvb2s6ICdzdXNwZW5kJyxcbiAgICAgICAgICAgICAgICBtb2R1bGVJZDogaWRlbnRpdHkubW9kdWxlSWQsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VJZDogaWRlbnRpdHkuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2sudGFza0lkLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogJ3BsYXRmb3JtLnN1c3BlbmQnLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBydW5QbGF0Zm9ybVJlc3VtZTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGlmIChwbGF0Zm9ybVJlc3VtZS5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgICB5aWVsZCogcmVjb3JkUGhhc2UoJ3BsYXRmb3JtJywgJ3NpZ25hbDpyZXN1bWUnLCB7IHRvdGFsOiBwbGF0Zm9ybVJlc3VtZS5sZW5ndGggfSlcbiAgICAgIGZvciAoY29uc3QgdGFzayBvZiBwbGF0Zm9ybVJlc3VtZSkge1xuICAgICAgICB5aWVsZCogc2FmZVJ1bihcbiAgICAgICAgICAnbGlmZWN5Y2xlLm9uUmVzdW1lJyxcbiAgICAgICAgICB0YXNrLmVmZmVjdC5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgICBub3RpZnlFcnJvcihjYXVzZSwge1xuICAgICAgICAgICAgICAgIHBoYXNlOiAncGxhdGZvcm0nLFxuICAgICAgICAgICAgICAgIGhvb2s6ICdyZXN1bWUnLFxuICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgIHRhc2tJZDogdGFzay50YXNrSWQsXG4gICAgICAgICAgICAgICAgb3JpZ2luOiAncGxhdGZvcm0ucmVzdW1lJyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgcnVuUGxhdGZvcm1SZXNldDogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGlmIChwbGF0Zm9ybVJlc2V0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICAgIHlpZWxkKiByZWNvcmRQaGFzZSgncGxhdGZvcm0nLCAnc2lnbmFsOnJlc2V0JywgeyB0b3RhbDogcGxhdGZvcm1SZXNldC5sZW5ndGggfSlcbiAgICAgIGZvciAoY29uc3QgdGFzayBvZiBwbGF0Zm9ybVJlc2V0KSB7XG4gICAgICAgIHlpZWxkKiBzYWZlUnVuKFxuICAgICAgICAgICdsaWZlY3ljbGUub25SZXNldCcsXG4gICAgICAgICAgdGFzay5lZmZlY3QucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5jYXRjaEFsbENhdXNlKChjYXVzZSkgPT5cbiAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoY2F1c2UsIHtcbiAgICAgICAgICAgICAgICBwaGFzZTogJ3BsYXRmb3JtJyxcbiAgICAgICAgICAgICAgICBob29rOiAncmVzZXQnLFxuICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBpZGVudGl0eS5tb2R1bGVJZCxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkOiBpZGVudGl0eS5pbnN0YW5jZUlkLFxuICAgICAgICAgICAgICAgIHRhc2tJZDogdGFzay50YXNrSWQsXG4gICAgICAgICAgICAgICAgb3JpZ2luOiAncGxhdGZvcm0ucmVzZXQnLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBnZXRUYXNrU25hcHNob3Q6IExpZmVjeWNsZU1hbmFnZXJbJ2dldFRhc2tTbmFwc2hvdCddID0gRWZmZWN0LnN5bmMoKCkgPT4gKHtcbiAgICAgIGluaXRSZXF1aXJlZDogaW5pdFJlcXVpcmVkLm1hcCgoeyBlZmZlY3Q6IF9lZmYsIC4uLnJlc3QgfSkgPT4gcmVzdCksXG4gICAgICBzdGFydDogc3RhcnQubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIGRlc3Ryb3k6IGRlc3Ryb3kubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIHBsYXRmb3JtU3VzcGVuZDogcGxhdGZvcm1TdXNwZW5kLm1hcCgoeyBlZmZlY3Q6IF9lZmYsIC4uLnJlc3QgfSkgPT4gcmVzdCksXG4gICAgICBwbGF0Zm9ybVJlc3VtZTogcGxhdGZvcm1SZXN1bWUubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICAgIHBsYXRmb3JtUmVzZXQ6IHBsYXRmb3JtUmVzZXQubWFwKCh7IGVmZmVjdDogX2VmZiwgLi4ucmVzdCB9KSA9PiByZXN0KSxcbiAgICB9KSlcblxuICAgIGNvbnN0IGhhc09uRXJyb3JIYW5kbGVyczogTGlmZWN5Y2xlTWFuYWdlclsnaGFzT25FcnJvckhhbmRsZXJzJ10gPSBFZmZlY3Quc3luYygoKSA9PiBvbkVycm9ySGFuZGxlcnMubGVuZ3RoID4gMClcblxuICAgIHJldHVybiB7XG4gICAgICBpZGVudGl0eSxcbiAgICAgIGJ1ZGdldHMsXG4gICAgICByZWdpc3RlclBsYXRmb3JtU3VzcGVuZCxcbiAgICAgIHJlZ2lzdGVyUGxhdGZvcm1SZXN1bWUsXG4gICAgICByZWdpc3RlclBsYXRmb3JtUmVzZXQsXG4gICAgICByZWdpc3RlckluaXRSZXF1aXJlZCxcbiAgICAgIHJlZ2lzdGVyU3RhcnQsXG4gICAgICByZWdpc3RlckRlc3Ryb3ksXG4gICAgICByZWdpc3Rlck9uRXJyb3IsXG4gICAgICBnZXRTdGF0dXMsXG4gICAgICBzZXRTdGF0dXMsXG4gICAgICBub3RpZnlFcnJvcixcbiAgICAgIHJ1blBsYXRmb3JtU3VzcGVuZCxcbiAgICAgIHJ1blBsYXRmb3JtUmVzdW1lLFxuICAgICAgcnVuUGxhdGZvcm1SZXNldCxcbiAgICAgIHJ1bkluaXRSZXF1aXJlZCxcbiAgICAgIHJ1blN0YXJ0LFxuICAgICAgcnVuRGVzdHJveSxcbiAgICAgIGhhc09uRXJyb3JIYW5kbGVycyxcbiAgICAgIGdldFRhc2tTbmFwc2hvdCxcbiAgICB9XG4gIH0pXG4iLCAiaW1wb3J0IHsgQ2F1c2UsIENvbnRleHQsIEVmZmVjdCB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCAqIGFzIERlYnVnIGZyb20gJy4vRGVidWdTaW5rLmpzJ1xuaW1wb3J0IHsgaXNEZXZFbnYgfSBmcm9tICcuL2Vudi5qcydcblxuY29uc3QgcGhhc2VEaWFnbm9zdGljc0VuYWJsZWQgPSAoKTogYm9vbGVhbiA9PiBpc0RldkVudigpXG5cbi8qKlxuICogTG9naWMgZGlhZ25vc3RpY3M6XG4gKiAtIEN1cnJlbnRseSBmb2N1c2VzIG9uIGluaXRpYWxpemF0aW9uIG5vaXNlIGNhdXNlZCBieSBtaXNzaW5nIEVudiBzZXJ2aWNlcyAoXCJTZXJ2aWNlIG5vdCBmb3VuZFwiKS5cbiAqXG4gKiBEZXNpZ24gaW50ZW50OlxuICogLSBJbiByZWNvbW1lbmRlZCB1c2FnZSwgUnVudGltZSAvIFJlYWN0IGxheWVycyBwcm92aWRlIEVudiBjb3JyZWN0bHkuXG4gKiAtIEluIHNvbWUgc3RhcnR1cCB0aW1pbmcgd2luZG93cywgTG9naWMgbWF5IHRyeSB0byByZWFkIHNlcnZpY2VzIGJlZm9yZSBFbnYgaXMgZnVsbHkgcHJvdmlkZWQuXG4gKiAtIFN1Y2ggZXJyb3JzIG9mdGVuIG9jY3VyIG9uY2UsIGRvIG5vdCBjaGFuZ2UgZmluYWwgc2VtYW50aWNzLCBidXQgcG9sbHV0ZSBsb2dzLlxuICpcbiAqIFRoZXJlZm9yZSB3ZSBlbWl0IGEgd2FybmluZyBkaWFnbm9zdGljIHZpYSBEZWJ1ZywgZXhwbGFpbmluZyBsaWtlbHkgY2F1c2VzIGFuZCBpbnZlc3RpZ2F0aW9uIHBhdGhzLlxuICogVGhlIHJlYWwgZXJyb3Igc2VtYW50aWNzIGFyZSBzdGlsbCBoYW5kbGVkIGJ5IGxpZmVjeWNsZS5vbkVycm9yIC8gQXBwUnVudGltZS5vbkVycm9yLlxuICovXG5cbmNvbnN0IFNFUlZJQ0VfTk9UX0ZPVU5EX1BSRUZJWCA9ICdTZXJ2aWNlIG5vdCBmb3VuZDonXG5cbi8qKlxuICogSWYgdGhlIENhdXNlIGNvbnRhaW5zIGEgYFNlcnZpY2Ugbm90IGZvdW5kOiAuLi5gIGVycm9yLCBlbWl0IGEgd2FybmluZyBkaWFnbm9zdGljOlxuICogLSBjb2RlOiBsb2dpYzo6ZW52X3NlcnZpY2Vfbm90X2ZvdW5kXG4gKiAtIG1lc3NhZ2U6IHRoZSBvcmlnaW5hbCBlcnJvciBtZXNzYWdlXG4gKiAtIGhpbnQ6IGV4cGxhaW5zIHRoaXMgaXMga25vd24gc3RhcnR1cCB0aW1pbmcgbm9pc2UgYW5kIHN1Z2dlc3RzIHdoYXQgdG8gY2hlY2tcbiAqL1xuZXhwb3J0IGNvbnN0IGVtaXRFbnZTZXJ2aWNlTm90Rm91bmREaWFnbm9zdGljSWZOZWVkZWQgPSAoXG4gIGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPixcbiAgbW9kdWxlSWQ/OiBzdHJpbmcsXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBsZXQgcHJldHR5OiBzdHJpbmdcbiAgICB0cnkge1xuICAgICAgcHJldHR5ID0gQ2F1c2UucHJldHR5KGNhdXNlLCB7IHJlbmRlckVycm9yQ2F1c2U6IHRydWUgfSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghcHJldHR5LmluY2x1ZGVzKFNFUlZJQ0VfTk9UX0ZPVU5EX1BSRUZJWCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIDEpIFdhcm5pbmcgZGlhZ25vc3RpYyBmb3IgdGhlIG1pc3NpbmcgRW52IHNlcnZpY2UgaXRzZWxmXG4gICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICB0eXBlOiAnZGlhZ25vc3RpYycsXG4gICAgICBtb2R1bGVJZCxcbiAgICAgIGNvZGU6ICdsb2dpYzo6ZW52X3NlcnZpY2Vfbm90X2ZvdW5kJyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiBwcmV0dHksXG4gICAgICBoaW50OlxuICAgICAgICAnTG9naWMgYXR0ZW1wdGVkIHRvIGFjY2VzcyBhbiBFbnYgc2VydmljZSBiZWZvcmUgaXQgd2FzIHByb3ZpZGVkLiBUaGlzIGlzIGEga25vd24gaW5pdGlhbGl6YXRpb24gdGltaW5nIG5vaXNlIGluIFJ1bnRpbWUvUmVhY3QgaW50ZWdyYXRpb24uICcgK1xuICAgICAgICBcIklmIGl0IGhhcHBlbnMgb25jZSBkdXJpbmcgZWFybHkgc3RhcnR1cCBhbmQgZXZlcnl0aGluZyB3b3JrcyBhZnRlcndhcmQsIGl0J3MgbGlrZWx5IGhhcm1sZXNzOyBcIiArXG4gICAgICAgICdpZiBpdCBwZXJzaXN0cyBvciBjb3JyZWxhdGVzIHdpdGggYXBwIGlzc3VlcywgdmVyaWZ5IFJ1bnRpbWUubWFrZSAvIFJ1bnRpbWVQcm92aWRlci5sYXllciBwcm92aWRlcyB0aGUgc2VydmljZS4nLFxuICAgIH0pXG5cbiAgICAvLyAyKSBJbiBzb21lIGNhc2VzIChlLmcuIGFjY2Vzc2luZyBFbnYgdG9vIGVhcmx5IGR1cmluZyBMb2dpYyBzZXR1cCksIHdlIGFsc28gd2FudCB0byBzdXJmYWNlXG4gICAgLy8gICAgbG9naWM6OmludmFsaWRfcGhhc2UgdG8gc3VnZ2VzdCBtb3ZpbmcgRW52IGFjY2VzcyB0byB0aGUgcnVuIHNlY3Rpb24uXG4gICAgLy9cbiAgICAvLyBCZWNhdXNlIHdlIGNhbm5vdCByZWxpYWJseSBkZXRlcm1pbmUgdGhlIHBoYXNlIGF0IHRoaXMgcG9pbnQsIHRoaXMgaXMgb25seSBhIHN1cHBsZW1lbnRhbCBzaWduYWwuXG4gICAgLy8gVGhlIHJlYWwgcGhhc2UgZ3VhcmQgaXMgc3RpbGwgaGFuZGxlZCBieSBMb2dpY1BoYXNlRXJyb3IgKyBlbWl0SW52YWxpZFBoYXNlRGlhZ25vc3RpY0lmTmVlZGVkLlxuICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgdHlwZTogJ2RpYWdub3N0aWMnLFxuICAgICAgbW9kdWxlSWQsXG4gICAgICBjb2RlOiAnbG9naWM6OmludmFsaWRfcGhhc2UnLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnJC51c2UgaXMgbm90IGFsbG93ZWQgYmVmb3JlIEVudiBpcyBmdWxseSByZWFkeS4nLFxuICAgICAgaGludDpcbiAgICAgICAgJ0F2b2lkIHJlYWRpbmcgc2VydmljZXMgZHVyaW5nIHNldHVwIG9yIGJlZm9yZSBFbnYgaXMgcmVhZHk7ICcgK1xuICAgICAgICAnbW92ZSBFbnYgYWNjZXNzIHRvIHRoZSBMb2dpYyBydW4gc2VjdGlvbiwgb3Igd3JhcCBpbml0IHZpYSAkLmxpZmVjeWNsZS5vbkluaXRSZXF1aXJlZC4nLFxuICAgICAga2luZDogJ2Vudl9zZXJ2aWNlX25vdF9yZWFkeScsXG4gICAgfSlcbiAgfSlcblxuZXhwb3J0IGludGVyZmFjZSBMb2dpY1BoYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IF90YWc6ICdMb2dpY1BoYXNlRXJyb3InXG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZ1xuICByZWFkb25seSBhcGk/OiBzdHJpbmdcbiAgcmVhZG9ubHkgcGhhc2U6ICdzZXR1cCcgfCAncnVuJ1xuICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2ljUGhhc2VTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgY3VycmVudDogJ3NldHVwJyB8ICdydW4nXG59XG5cbmV4cG9ydCBjb25zdCBMb2dpY1BoYXNlU2VydmljZVRhZyA9IENvbnRleHQuR2VuZXJpY1RhZzxMb2dpY1BoYXNlU2VydmljZT4oJ0Bsb2dpeGpzL0xvZ2ljUGhhc2VTZXJ2aWNlJylcblxuLyoqXG4gKiBMb2dpY1VuaXRTZXJ2aWNlOlxuICogLSBJbmplY3RlZCB3aGlsZSBleGVjdXRpbmcgZWFjaCBtb3VudGVkIGxvZ2ljIHVuaXQgKHNjb3BlID0gdGhlIGxvZ2ljIHVuaXQncyBzZXR1cC9ydW4gZmliZXIpLlxuICogLSBVc2VkIGZvciB0cmFpdCBwcm92ZW5hbmNlIGFuZCBvdGhlciBcImJvdW5kIHRvIHRoZSBjdXJyZW50IGxvZ2ljIHVuaXRcIiBpbmZvcm1hdGlvbiAoYWxpZ25lZCB3aXRoIDAyMi1tb2R1bGUgbG9naWNVbml0SWQpLlxuICpcbiAqIENvbnN0cmFpbnRzOlxuICogLSBSZWFkLW9ubHkgKG11c3Qgbm90IG11dGF0ZSBydW50aW1lIHN0YXRlKTsgb25seSBhIHByb3ZlbmFuY2UvZGlhZ25vc3RpY3MgYW5jaG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2ljVW5pdFNlcnZpY2Uge1xuICByZWFkb25seSBsb2dpY1VuaXRJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGxvZ2ljVW5pdElkS2luZDogJ2V4cGxpY2l0JyB8ICdkZXJpdmVkJ1xuICByZWFkb25seSBsb2dpY1VuaXRMYWJlbDogc3RyaW5nXG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIExvZ2ljVW5pdFNlcnZpY2VUYWcgZXh0ZW5kcyBDb250ZXh0LlRhZygnQGxvZ2l4anMvTG9naWNVbml0U2VydmljZScpPFxuICBMb2dpY1VuaXRTZXJ2aWNlVGFnLFxuICBMb2dpY1VuaXRTZXJ2aWNlXG4+KCkge31cblxuZXhwb3J0IGNvbnN0IG1ha2VMb2dpY1BoYXNlRXJyb3IgPSAoXG4gIGtpbmQ6IHN0cmluZyxcbiAgYXBpOiBzdHJpbmcsXG4gIHBoYXNlOiAnc2V0dXAnIHwgJ3J1bicsXG4gIG1vZHVsZUlkPzogc3RyaW5nLFxuKTogTG9naWNQaGFzZUVycm9yID0+XG4gIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBbTG9naWNQaGFzZUVycm9yXSAke2FwaX0gaXMgbm90IGFsbG93ZWQgaW4gJHtwaGFzZX0gcGhhc2UgKGtpbmQ9JHtraW5kfSkuYCksIHtcbiAgICBfdGFnOiAnTG9naWNQaGFzZUVycm9yJyxcbiAgICBraW5kLFxuICAgIGFwaSxcbiAgICBwaGFzZSxcbiAgICBtb2R1bGVJZCxcbiAgfSkgYXMgTG9naWNQaGFzZUVycm9yXG5cbi8qKlxuICogRXh0cmFjdHMgTG9naWNQaGFzZUVycm9yIGZyb20gYSBDYXVzZSBhbmQgZW1pdHMgaXQgYXMgYSBkaWFnbm9zdGljOlxuICogLSBjb2RlOiBsb2dpYzo6aW52YWxpZF9waGFzZVxuICogLSBraW5kOiBjb25jcmV0ZSB2aW9sYXRpb24ga2luZCAoZS5nLiB1c2VfaW5fc2V0dXApXG4gKi9cbmV4cG9ydCBjb25zdCBlbWl0SW52YWxpZFBoYXNlRGlhZ25vc3RpY0lmTmVlZGVkID0gKFxuICBjYXVzZTogQ2F1c2UuQ2F1c2U8dW5rbm93bj4sXG4gIG1vZHVsZUlkPzogc3RyaW5nLFxuKTogRWZmZWN0LkVmZmVjdDx2b2lkPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgaWYgKCFwaGFzZURpYWdub3N0aWNzRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhbGxFcnJvcnMgPSBbLi4uQ2F1c2UuZmFpbHVyZXMoY2F1c2UpLCAuLi5DYXVzZS5kZWZlY3RzKGNhdXNlKV1cblxuICAgIGZvciAoY29uc3QgZXJyIG9mIGFsbEVycm9ycykge1xuICAgICAgY29uc3QgbG9naWNFcnIgPSBlcnIgYXMgYW55XG4gICAgICBpZiAobG9naWNFcnIgJiYgbG9naWNFcnIuX3RhZyA9PT0gJ0xvZ2ljUGhhc2VFcnJvcicpIHtcbiAgICAgICAgY29uc3QgcGhhc2VFcnIgPSBsb2dpY0VyciBhcyBMb2dpY1BoYXNlRXJyb3JcbiAgICAgICAgY29uc3QgaGludCA9XG4gICAgICAgICAgcGhhc2VFcnIua2luZCA9PT0gJ3VzZV9pbl9zZXR1cCcgfHwgcGhhc2VFcnIua2luZCA9PT0gJ2xpZmVjeWNsZV9pbl9zZXR1cCdcbiAgICAgICAgICAgID8gJ1RoZSBzZXR1cCBwaGFzZSBtdXN0IG5vdCByZWFkIEVudi9zZXJ2aWNlcyBvciBydW4gbG9uZy1saXZlZCBsb2dpYzsgbW92ZSB0aGUgcmVsZXZhbnQgY2FsbHMgdG8gdGhlIHJ1biBwaGFzZS4nXG4gICAgICAgICAgICA6IHBoYXNlRXJyLmtpbmQgPT09ICdsaWZlY3ljbGVfaW5fcnVuJ1xuICAgICAgICAgICAgICA/ICdEbyBub3QgcmVnaXN0ZXIgJC5saWZlY3ljbGUuKiBpbiB0aGUgcnVuIHBoYXNlIChzZXR1cC1vbmx5KS4gTW92ZSBsaWZlY3ljbGUgcmVnaXN0cmF0aW9ucyB0byB0aGUgc3luY2hyb25vdXMgcGFydCBvZiBNb2R1bGUubG9naWMgYnVpbGRlciAoYmVmb3JlIHJldHVybikuJ1xuICAgICAgICAgICAgICA6IHBoYXNlRXJyLmtpbmQgPT09ICd0cmFpdHNfaW5fcnVuJyB8fCBwaGFzZUVyci5raW5kID09PSAndHJhaXRzX2RlY2xhcmVfaW5fcnVuJ1xuICAgICAgICAgICAgICAgID8gJ1RyYWl0cyBhcmUgZnJvemVuIGFmdGVyIHNldHVwOyBtb3ZlICQudHJhaXRzLmRlY2xhcmUgdG8gTG9naWNQbGFuLnNldHVwIG9yIHRoZSBzZXR1cCByZWdpc3RyYXRpb24gcGhhc2Ugb2YgTW9kdWxlLmxvZ2ljIGJ1aWxkZXIuJ1xuICAgICAgICAgICAgICAgIDogJ01vdmUgbG9naWMgdG8gdGhlIHJ1biBwaGFzZTsga2VlcCBzZXR1cCBmb3IgcmVnaXN0cmF0aW9ucyBvbmx5LidcblxuICAgICAgICB5aWVsZCogRGVidWcucmVjb3JkKHtcbiAgICAgICAgICB0eXBlOiAnZGlhZ25vc3RpYycsXG4gICAgICAgICAgbW9kdWxlSWQ6IHBoYXNlRXJyLm1vZHVsZUlkID8/IG1vZHVsZUlkLFxuICAgICAgICAgIGNvZGU6ICdsb2dpYzo6aW52YWxpZF9waGFzZScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgbWVzc2FnZTogYCR7cGhhc2VFcnIuYXBpID8/IHBoYXNlRXJyLmtpbmR9IGlzIG5vdCBhbGxvd2VkIGluICR7cGhhc2VFcnIucGhhc2V9IHBoYXNlLmAsXG4gICAgICAgICAgaGludCxcbiAgICAgICAgICBraW5kOiBwaGFzZUVyci5raW5kLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFJldHVybiBhZnRlciB0aGUgZmlyc3QgTG9naWNQaGFzZUVycm9yIG1hdGNoLlxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9XG4gIH0pXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1PLElBQU0sdUJBQXVCLENBQUksTUFBUyxZQUFtQztBQUNsRixTQUFPLE9BQU8sTUFBTSxPQUFjO0FBQ3BDO0FBRUEsSUFBTSxtQkFBbUIsQ0FBQyxTQUErQztBQUN2RSxNQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLFVBQU0sVUFBVSxLQUFLLEtBQUs7QUFDMUIsV0FBTyxRQUFRLFNBQVMsSUFBSSxNQUFNO0FBQUEsRUFDcEM7QUFFQSxNQUFJLENBQUMsTUFBTSxRQUFRLElBQUksRUFBRyxRQUFPO0FBRWpDLFFBQU0sUUFBdUIsQ0FBQztBQUM5QixhQUFXLE9BQU8sTUFBTTtBQUN0QixRQUFJLE9BQU8sUUFBUSxVQUFVO0FBQzNCLFVBQUksbUJBQW1CLEdBQUcsRUFBRyxPQUFNLEtBQUssR0FBRztBQUMzQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxNQUFNLFdBQVcsRUFBRyxRQUFPO0FBQy9CLFNBQU87QUFDVDtBQUVPLElBQU0sdUJBQXVCLENBQ2xDLE1BQ0EsWUFDbUY7QUFDbkYsUUFBTSxNQUFNLE9BQU8sTUFBTSxTQUFnQjtBQUFBLElBQ3ZDLGVBQWU7QUFBQSxNQUNiLGFBQWE7QUFBQSxNQUNiLHVCQUF1QjtBQUFBLElBQ3pCO0FBQUEsRUFDRixDQUFDO0FBRUQsTUFBSSxDQUFDLE1BQU0s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SyxPQUFPLE9BQU8sQ0FBQyxNQUFXLEVBQUUsU0FBUyxPQUFPLEVBQUUsU0FBUyxHQUFHLENBQUM7QUFBQSxZQUNqRjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQ0EsWUFBSSxPQUFPLFFBQVEsWUFBWSxRQUFRLE1BQU07QUFDM0MsY0FBSSxVQUFVLEtBQUs7QUFDakIsbUJBQU87QUFBQSxjQUNMLFFBQVEsU0FBUyxLQUFLLE9BQU8sT0FBTyxDQUFDLE1BQVcsRUFBRSxTQUFVLElBQVksSUFBSSxDQUFDO0FBQUEsY0FDN0UsT0FBUSxJQUFZLElBQUk7QUFBQSxZQUMxQjtBQUFBLFVBQ0Y7QUFDQSxjQUFJLE9BQU8sU0FBUyxHQUFHLEdBQUc7QUFDeEIsbUJBQU87QUFBQSxjQUNMLFFBQVEsU0FBUztBQUFBLGdCQUNmLE9BQU8sT0FBTyxDQUFDLE1BQVc7QUFDeEIsd0JBQU0sU0FBUyxPQUFPLGtCQUFrQixHQUFxQyxFQUFFLENBQUM7QUFDaEYseUJBQU8sQ0FBQyxDQUFDO0FBQUEsZ0JBQ1gsQ0FBQztBQUFBLGNBQ0g7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFDQSxlQUFPLG9CQUFvQixRQUFRLFFBQVE7QUFBQSxNQUM3QztBQUFBLE1BQ0EsS0FBSyxDQUFDLFNBQVMsU0FBUztBQUN0QixxQkFBYSxnQkFBZ0IsWUFBWTtBQUN6QyxZQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLGlCQUFPO0FBQUEsWUFDTCxRQUFRLFNBQVMsS0FBSyxPQUFPLE9BQU8sQ0FBQyxNQUFXLEVBQUUsU0FBUyxRQUFRLEVBQUUsU0FBUyxJQUFJLENBQUM7QUFBQSxZQUNuRjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUNELFNBQVMsQ0FBQyxhQUE0QztBQUNwRCxtQkFBYSxnQkFBZ0IsV0FBVztBQUN4QyxhQUFPLG9CQUFvQixRQUFRLFFBQVEsUUFBUSxDQUFDO0FBQUEsSUFDdEQ7QUFBQSxJQUNBLElBQUksQ0FBQyxXQUErQjtBQUNsQyxtQkFBYSxnQkFBZ0IsTUFBTTtBQUNuQyxhQUFPLG9CQUFvQixNQUFNO0FBQUEsSUFDbkM7QUFBQSxFQUNGO0FBRUEsb0JBQWtCLEtBQVksZ0JBQWdCO0FBRTlDLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFsiQ29udGV4dCIsICJFZmZlY3QiLCAiQ2F1c2UiLCAiQ29udGV4dCIsICJFZmZlY3QiLCAiRWZmZWN0IiwgIkNhdXNlIiwgIkNvbnRleHQiLCAiRWZmZWN0IiwgIm1ha2UiLCAiYXBpIiwgIkNvbnRleHQiLCAib3B0aW9ucyJdCn0K