@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,1025 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ withDebug
5
+ } from "./chunk-SZ4KQUJU.js";
6
+ import {
7
+ devtoolsHubLayer,
8
+ runtimeLabel
9
+ } from "./chunk-OQ4SYV5D.js";
10
+ import {
11
+ getRuntimeByModuleAndInstance,
12
+ normalizeBoolean,
13
+ normalizePositiveInt,
14
+ normalizePositiveNumber
15
+ } from "./chunk-GXL5QCMF.js";
16
+ import {
17
+ make
18
+ } from "./chunk-4CPONKWY.js";
19
+ import {
20
+ RootContextTag
21
+ } from "./chunk-EGUYL2ER.js";
22
+ import {
23
+ inSyncTransactionFiber
24
+ } from "./chunk-E7BIWMQQ.js";
25
+ import {
26
+ getRuntimeInternals
27
+ } from "./chunk-6FKWRVP4.js";
28
+ import {
29
+ ConcurrencyPolicyOverridesTag,
30
+ ConcurrencyPolicyTag,
31
+ StateTransactionConfigTag,
32
+ StateTransactionOverridesTag,
33
+ isDevEnv
34
+ } from "./chunk-GP37MEGJ.js";
35
+ import {
36
+ EffectOpMiddlewareTag,
37
+ runSessionLayer
38
+ } from "./chunk-A7HLOSO6.js";
39
+
40
+ // ../logix-core/src/Runtime.ts
41
+ import { Effect as Effect5, Layer as Layer2, Option as Option3 } from "../effect.js";
42
+
43
+ // ../logix-core/src/internal/runtime/AppRuntime.ts
44
+ import { Context, Deferred, Effect, Layer, ManagedRuntime } from "../effect.js";
45
+ var getTagKey = (tag) => {
46
+ const anyTag = tag;
47
+ if (typeof anyTag.key === "string") {
48
+ return anyTag.key;
49
+ }
50
+ if (typeof anyTag._id === "string") {
51
+ return anyTag._id;
52
+ }
53
+ if (typeof anyTag.toString === "function") {
54
+ return anyTag.toString();
55
+ }
56
+ return "[unknown-tag]";
57
+ };
58
+ var buildTagIndex = (entries) => {
59
+ const index = /* @__PURE__ */ new Map();
60
+ for (const entry of entries) {
61
+ const ownerId = String(entry.module.id);
62
+ const moduleTag = entry.module;
63
+ const moduleKey = getTagKey(moduleTag);
64
+ const moduleInfo = {
65
+ key: moduleKey,
66
+ tag: moduleTag,
67
+ ownerModuleId: ownerId,
68
+ source: "module"
69
+ };
70
+ const existingModuleInfos = index.get(moduleKey);
71
+ if (existingModuleInfos) {
72
+ existingModuleInfos.push(moduleInfo);
73
+ } else {
74
+ index.set(moduleKey, [moduleInfo]);
75
+ }
76
+ if (entry.serviceTags && entry.serviceTags.length > 0) {
77
+ for (const tag of entry.serviceTags) {
78
+ const key = getTagKey(tag);
79
+ const info = {
80
+ key,
81
+ tag,
82
+ ownerModuleId: ownerId,
83
+ source: "service"
84
+ };
85
+ const existingInfos = index.get(key);
86
+ if (existingInfos) {
87
+ existingInfos.push(info);
88
+ } else {
89
+ index.set(key, [info]);
90
+ }
91
+ }
92
+ }
93
+ }
94
+ return index;
95
+ };
96
+ var validateTags = (entries) => {
97
+ const index = buildTagIndex(entries);
98
+ const collisions = [];
99
+ for (const [key, infos] of index) {
100
+ if (infos.length <= 1) {
101
+ continue;
102
+ }
103
+ const owners = /* @__PURE__ */ new Set();
104
+ for (const info of infos) {
105
+ owners.add(info.ownerModuleId);
106
+ }
107
+ if (owners.size > 1) {
108
+ collisions.push({ key, conflicts: infos });
109
+ }
110
+ }
111
+ if (collisions.length === 0) {
112
+ return;
113
+ }
114
+ const message = "[Logix] Tag collision detected:\n" + collisions.map((c) => {
115
+ const header = `- key: ${c.key}`;
116
+ const lines = c.conflicts.map((i) => ` - owner: ${i.ownerModuleId}, source: ${i.source}`);
117
+ return [header, ...lines].join("\n");
118
+ }).join("\n");
119
+ const error = Object.assign(new Error(message), {
120
+ _tag: "TagCollisionError",
121
+ collisions
122
+ });
123
+ throw error;
124
+ };
125
+ var makeApp = (config) => {
126
+ const seenIds = /* @__PURE__ */ new Set();
127
+ for (const entry of config.modules) {
128
+ const id = String(entry.module.id);
129
+ if (seenIds.has(id)) {
130
+ throw new Error(
131
+ `[Logix] Duplicate Module ID/Tag detected: "${id}".
132
+ Ensure all modules in the application Runtime have unique IDs.`
133
+ );
134
+ }
135
+ seenIds.add(id);
136
+ }
137
+ validateTags(config.modules);
138
+ const stateTxnLayer = config.stateTransaction ? Layer.succeed(StateTransactionConfigTag, config.stateTransaction) : Layer.empty;
139
+ const concurrencyPolicyLayer = config.concurrencyPolicy ? Layer.succeed(ConcurrencyPolicyTag, config.concurrencyPolicy) : Layer.empty;
140
+ const baseLayer = Layer.mergeAll(
141
+ config.layer,
142
+ stateTxnLayer,
143
+ concurrencyPolicyLayer,
144
+ Layer.effect(
145
+ RootContextTag,
146
+ Effect.gen(function* () {
147
+ const ready = yield* Deferred.make();
148
+ return { context: void 0, ready };
149
+ })
150
+ )
151
+ );
152
+ const moduleLayers = config.modules.map(
153
+ (entry) => (
154
+ // 确保每个模块层都能看到 App 级 Env(baseLayer),避免在初始化阶段找不到 Root Env。
155
+ Layer.provide(entry.layer, baseLayer)
156
+ )
157
+ );
158
+ const envLayer = moduleLayers.length > 0 ? Layer.mergeAll(baseLayer, ...moduleLayers) : baseLayer;
159
+ const finalLayer = Layer.unwrapScoped(
160
+ Effect.gen(function* () {
161
+ const scope = yield* Effect.scope;
162
+ const [patch, env] = yield* Effect.diffFiberRefs(Layer.buildWithScope(envLayer, scope));
163
+ const rootContext = Context.get(
164
+ env,
165
+ RootContextTag
166
+ );
167
+ rootContext.context = env;
168
+ yield* Deferred.succeed(rootContext.ready, env);
169
+ yield* Effect.forEach(
170
+ config.processes,
171
+ (process) => Effect.forkScoped(
172
+ Effect.provide(
173
+ config.onError ? Effect.catchAllCause(process, config.onError) : process,
174
+ env
175
+ )
176
+ ),
177
+ { discard: true }
178
+ );
179
+ const fiberRefsLayer = Layer.scopedDiscard(Effect.patchFiberRefs(patch));
180
+ return Layer.mergeAll(
181
+ Layer.succeedContext(env),
182
+ fiberRefsLayer
183
+ );
184
+ })
185
+ );
186
+ return {
187
+ definition: config,
188
+ layer: finalLayer,
189
+ makeRuntime: () => ManagedRuntime.make(finalLayer)
190
+ };
191
+ };
192
+ var provide = (module, resource) => {
193
+ const layer = isLayer(resource) ? resource : Layer.succeed(module, resource);
194
+ return { module, layer };
195
+ };
196
+ var isLayer = (value) => typeof value === "object" && value !== null && Layer.LayerTypeId in value;
197
+
198
+ // ../logix-core/src/internal/runtime/core/configValidation.ts
199
+ import { Schema } from "../effect.js";
200
+ var PositiveIntSchema = Schema.Int.pipe(Schema.positive());
201
+ var PositiveNumberSchema = Schema.Number.pipe(Schema.positive());
202
+ var ConvergeModeSchema = Schema.Union(
203
+ Schema.Literal("auto"),
204
+ Schema.Literal("full"),
205
+ Schema.Literal("dirty")
206
+ );
207
+ var InstrumentationSchema = Schema.Union(
208
+ Schema.Literal("full"),
209
+ Schema.Literal("light")
210
+ );
211
+ var ConcurrencyLimitSchema = Schema.Union(
212
+ Schema.Literal("unbounded"),
213
+ PositiveIntSchema
214
+ );
215
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
216
+ var warnDevOnly = (label, issues) => {
217
+ if (!isDevEnv()) return;
218
+ if (issues.length === 0) return;
219
+ console.warn(
220
+ ["[Logix] Invalid runtime config detected.", `context: ${label}`, "issues:"].concat(issues.map((i) => `- ${i}`)).join("\n")
221
+ );
222
+ };
223
+ var collectUnknownKeys = (obj, allowed, prefix) => {
224
+ const issues = [];
225
+ for (const key of Object.keys(obj)) {
226
+ if (!allowed.has(key)) {
227
+ issues.push(`${prefix}${key}: unknown key`);
228
+ }
229
+ }
230
+ return issues;
231
+ };
232
+ var validateConcurrencyPolicyPatch = (obj, prefix) => {
233
+ const issues = [];
234
+ if ("concurrencyLimit" in obj && obj.concurrencyLimit != null) {
235
+ if (!Schema.is(ConcurrencyLimitSchema)(obj.concurrencyLimit)) {
236
+ issues.push(`${prefix}concurrencyLimit: expected positive int | "unbounded"`);
237
+ }
238
+ }
239
+ if ("losslessBackpressureCapacity" in obj && obj.losslessBackpressureCapacity != null) {
240
+ if (normalizePositiveInt(obj.losslessBackpressureCapacity) == null) {
241
+ issues.push(`${prefix}losslessBackpressureCapacity: expected positive int`);
242
+ }
243
+ }
244
+ if ("allowUnbounded" in obj && obj.allowUnbounded != null) {
245
+ if (normalizeBoolean(obj.allowUnbounded) == null) {
246
+ issues.push(`${prefix}allowUnbounded: expected boolean`);
247
+ }
248
+ }
249
+ if ("pressureWarningThreshold" in obj && obj.pressureWarningThreshold != null) {
250
+ const threshold = obj.pressureWarningThreshold;
251
+ if (!isRecord(threshold)) {
252
+ issues.push(`${prefix}pressureWarningThreshold: expected object`);
253
+ } else {
254
+ const backlogCount = threshold["backlogCount"];
255
+ if (backlogCount != null) {
256
+ if (normalizePositiveInt(backlogCount) == null) {
257
+ issues.push(`${prefix}pressureWarningThreshold.backlogCount: expected positive int`);
258
+ }
259
+ }
260
+ const backlogDurationMs = threshold["backlogDurationMs"];
261
+ if (backlogDurationMs != null) {
262
+ if (normalizePositiveNumber(backlogDurationMs) == null) {
263
+ issues.push(`${prefix}pressureWarningThreshold.backlogDurationMs: expected positive number`);
264
+ }
265
+ }
266
+ }
267
+ }
268
+ if ("warningCooldownMs" in obj && obj.warningCooldownMs != null) {
269
+ if (normalizePositiveNumber(obj.warningCooldownMs) == null) {
270
+ issues.push(`${prefix}warningCooldownMs: expected positive number`);
271
+ }
272
+ }
273
+ return issues;
274
+ };
275
+ var warnInvalidConcurrencyPolicyDevOnly = (value, label) => {
276
+ if (!isDevEnv()) return;
277
+ if (value == null) return;
278
+ if (!isRecord(value)) {
279
+ warnDevOnly(label, ["expected object"]);
280
+ return;
281
+ }
282
+ const policy = value;
283
+ const issues = [];
284
+ issues.push(
285
+ ...collectUnknownKeys(
286
+ policy,
287
+ /* @__PURE__ */ new Set([
288
+ "concurrencyLimit",
289
+ "losslessBackpressureCapacity",
290
+ "allowUnbounded",
291
+ "pressureWarningThreshold",
292
+ "warningCooldownMs",
293
+ "overridesByModuleId"
294
+ ]),
295
+ ""
296
+ )
297
+ );
298
+ issues.push(...validateConcurrencyPolicyPatch(policy, ""));
299
+ const overridesByModuleId = policy.overridesByModuleId;
300
+ if (overridesByModuleId != null) {
301
+ if (!isRecord(overridesByModuleId)) {
302
+ issues.push(`overridesByModuleId: expected record`);
303
+ } else {
304
+ for (const [moduleId, patch] of Object.entries(overridesByModuleId)) {
305
+ const prefix = `overridesByModuleId.${moduleId}.`;
306
+ if (patch == null) continue;
307
+ if (!isRecord(patch)) {
308
+ issues.push(`${prefix}<value>: expected object`);
309
+ continue;
310
+ }
311
+ issues.push(
312
+ ...collectUnknownKeys(
313
+ patch,
314
+ /* @__PURE__ */ new Set([
315
+ "concurrencyLimit",
316
+ "losslessBackpressureCapacity",
317
+ "allowUnbounded",
318
+ "pressureWarningThreshold",
319
+ "warningCooldownMs"
320
+ ]),
321
+ prefix
322
+ )
323
+ );
324
+ issues.push(...validateConcurrencyPolicyPatch(patch, prefix));
325
+ }
326
+ }
327
+ }
328
+ warnDevOnly(label, issues);
329
+ };
330
+ var warnInvalidConcurrencyPolicyPatchDevOnly = (value, label) => {
331
+ if (!isDevEnv()) return;
332
+ if (value == null) return;
333
+ if (!isRecord(value)) {
334
+ warnDevOnly(label, ["expected object"]);
335
+ return;
336
+ }
337
+ const issues = [];
338
+ issues.push(
339
+ ...collectUnknownKeys(
340
+ value,
341
+ /* @__PURE__ */ new Set([
342
+ "concurrencyLimit",
343
+ "losslessBackpressureCapacity",
344
+ "allowUnbounded",
345
+ "pressureWarningThreshold",
346
+ "warningCooldownMs"
347
+ ]),
348
+ ""
349
+ )
350
+ );
351
+ issues.push(...validateConcurrencyPolicyPatch(value, ""));
352
+ warnDevOnly(label, issues);
353
+ };
354
+ var validateStateTransactionTraitOverrides = (obj, prefix) => {
355
+ const issues = [];
356
+ if ("traitConvergeMode" in obj && obj.traitConvergeMode != null) {
357
+ if (!Schema.is(ConvergeModeSchema)(obj.traitConvergeMode)) {
358
+ issues.push(`${prefix}traitConvergeMode: expected "auto" | "full" | "dirty"`);
359
+ }
360
+ }
361
+ if ("traitConvergeBudgetMs" in obj && obj.traitConvergeBudgetMs != null) {
362
+ if (normalizePositiveNumber(obj.traitConvergeBudgetMs) == null) {
363
+ issues.push(`${prefix}traitConvergeBudgetMs: expected positive number`);
364
+ }
365
+ }
366
+ if ("traitConvergeDecisionBudgetMs" in obj && obj.traitConvergeDecisionBudgetMs != null) {
367
+ if (normalizePositiveNumber(obj.traitConvergeDecisionBudgetMs) == null) {
368
+ issues.push(`${prefix}traitConvergeDecisionBudgetMs: expected positive number`);
369
+ }
370
+ }
371
+ return issues;
372
+ };
373
+ var warnInvalidStateTransactionTraitConvergeOverridesDevOnly = (value, label) => {
374
+ if (!isDevEnv()) return;
375
+ if (value == null) return;
376
+ if (!isRecord(value)) {
377
+ warnDevOnly(label, ["expected object"]);
378
+ return;
379
+ }
380
+ const issues = [];
381
+ issues.push(
382
+ ...collectUnknownKeys(
383
+ value,
384
+ /* @__PURE__ */ new Set([
385
+ "traitConvergeBudgetMs",
386
+ "traitConvergeDecisionBudgetMs",
387
+ "traitConvergeMode"
388
+ ]),
389
+ ""
390
+ )
391
+ );
392
+ issues.push(...validateStateTransactionTraitOverrides(value, ""));
393
+ warnDevOnly(label, issues);
394
+ };
395
+ var warnInvalidStateTransactionRuntimeConfigDevOnly = (value, label) => {
396
+ if (!isDevEnv()) return;
397
+ if (value == null) return;
398
+ if (!isRecord(value)) {
399
+ warnDevOnly(label, ["expected object"]);
400
+ return;
401
+ }
402
+ const issues = [];
403
+ issues.push(
404
+ ...collectUnknownKeys(
405
+ value,
406
+ /* @__PURE__ */ new Set([
407
+ "instrumentation",
408
+ "traitConvergeBudgetMs",
409
+ "traitConvergeDecisionBudgetMs",
410
+ "traitConvergeMode",
411
+ "traitConvergeOverridesByModuleId"
412
+ ]),
413
+ ""
414
+ )
415
+ );
416
+ if ("instrumentation" in value && value.instrumentation != null) {
417
+ if (!Schema.is(InstrumentationSchema)(value.instrumentation)) {
418
+ issues.push(`instrumentation: expected "full" | "light"`);
419
+ }
420
+ }
421
+ issues.push(...validateStateTransactionTraitOverrides(value, ""));
422
+ const overridesByModuleId = value.traitConvergeOverridesByModuleId;
423
+ if (overridesByModuleId != null) {
424
+ if (!isRecord(overridesByModuleId)) {
425
+ issues.push(`traitConvergeOverridesByModuleId: expected record`);
426
+ } else {
427
+ for (const [moduleId, patch] of Object.entries(overridesByModuleId)) {
428
+ const prefix = `traitConvergeOverridesByModuleId.${moduleId}.`;
429
+ if (patch == null) continue;
430
+ if (!isRecord(patch)) {
431
+ issues.push(`${prefix}<value>: expected object`);
432
+ continue;
433
+ }
434
+ issues.push(
435
+ ...collectUnknownKeys(
436
+ patch,
437
+ /* @__PURE__ */ new Set([
438
+ "traitConvergeMode",
439
+ "traitConvergeBudgetMs",
440
+ "traitConvergeDecisionBudgetMs"
441
+ ]),
442
+ prefix
443
+ )
444
+ );
445
+ issues.push(...validateStateTransactionTraitOverrides(patch, prefix));
446
+ }
447
+ }
448
+ }
449
+ warnDevOnly(label, issues);
450
+ };
451
+ var warnInvalidStateTransactionOverridesDevOnly = (value, label) => {
452
+ if (!isDevEnv()) return;
453
+ if (value == null) return;
454
+ if (!isRecord(value)) {
455
+ warnDevOnly(label, ["expected object"]);
456
+ return;
457
+ }
458
+ const issues = [];
459
+ issues.push(
460
+ ...collectUnknownKeys(
461
+ value,
462
+ /* @__PURE__ */ new Set([
463
+ "traitConvergeBudgetMs",
464
+ "traitConvergeDecisionBudgetMs",
465
+ "traitConvergeMode",
466
+ "traitConvergeOverridesByModuleId"
467
+ ]),
468
+ ""
469
+ )
470
+ );
471
+ issues.push(...validateStateTransactionTraitOverrides(value, ""));
472
+ const overridesByModuleId = value.traitConvergeOverridesByModuleId;
473
+ if (overridesByModuleId != null) {
474
+ if (!isRecord(overridesByModuleId)) {
475
+ issues.push(`traitConvergeOverridesByModuleId: expected record`);
476
+ } else {
477
+ for (const [moduleId, patch] of Object.entries(overridesByModuleId)) {
478
+ const prefix = `traitConvergeOverridesByModuleId.${moduleId}.`;
479
+ if (patch == null) continue;
480
+ if (!isRecord(patch)) {
481
+ issues.push(`${prefix}<value>: expected object`);
482
+ continue;
483
+ }
484
+ issues.push(
485
+ ...collectUnknownKeys(
486
+ patch,
487
+ /* @__PURE__ */ new Set([
488
+ "traitConvergeMode",
489
+ "traitConvergeBudgetMs",
490
+ "traitConvergeDecisionBudgetMs"
491
+ ]),
492
+ prefix
493
+ )
494
+ );
495
+ issues.push(...validateStateTransactionTraitOverrides(patch, prefix));
496
+ }
497
+ }
498
+ }
499
+ warnDevOnly(label, issues);
500
+ };
501
+
502
+ // ../logix-core/src/internal/runtime/runner/ProgramRunner.ts
503
+ import { Cause as Cause2, Effect as Effect4, FiberRef, Option as Option2, Scope as Scope3 } from "../effect.js";
504
+
505
+ // ../logix-core/src/internal/runtime/runner/ProgramRunner.closeScope.ts
506
+ import { Cause, Effect as Effect2, Exit, Fiber, Option, Scope } from "../effect.js";
507
+
508
+ // ../logix-core/src/internal/runtime/runner/ProgramRunner.errors.ts
509
+ var summarizeCause = (cause) => {
510
+ if (cause instanceof Error) {
511
+ return { name: cause.name, message: cause.message };
512
+ }
513
+ return { message: typeof cause === "string" ? cause : void 0 };
514
+ };
515
+ var ProgramRunnerErrorBase = class extends Error {
516
+ constructor(params) {
517
+ super(params.message);
518
+ this.moduleId = params.identity.moduleId;
519
+ this.instanceId = params.identity.instanceId;
520
+ this.entrypoint = params.entrypoint;
521
+ this.hint = params.hint;
522
+ }
523
+ toJSON() {
524
+ return {
525
+ _tag: this._tag,
526
+ name: this.name,
527
+ message: this.message,
528
+ moduleId: this.moduleId,
529
+ instanceId: this.instanceId,
530
+ entrypoint: this.entrypoint,
531
+ hint: this.hint
532
+ };
533
+ }
534
+ };
535
+ var BootError = class extends ProgramRunnerErrorBase {
536
+ constructor(identity, cause) {
537
+ super({
538
+ message: "[Logix] Program boot failed",
539
+ identity,
540
+ entrypoint: "boot",
541
+ hint: "\u68C0\u67E5 options.layer / imports / providers \u662F\u5426\u9F50\u5168\uFF1B\u4EE5\u53CA\u662F\u5426\u5B58\u5728\u88C5\u914D\u9636\u6BB5\u7F3A\u5931\u4F9D\u8D56\u3002"
542
+ });
543
+ this._tag = "BootError";
544
+ this.name = "BootError";
545
+ this.cause = summarizeCause(cause);
546
+ }
547
+ toJSON() {
548
+ return { ...super.toJSON(), cause: this.cause };
549
+ }
550
+ };
551
+ var MainError = class extends ProgramRunnerErrorBase {
552
+ constructor(identity, cause) {
553
+ super({
554
+ message: "[Logix] Program main failed",
555
+ identity,
556
+ entrypoint: "main",
557
+ hint: "\u4E3B\u6D41\u7A0B\u5931\u8D25\uFF1A\u786E\u8BA4 main \u662F\u5426\u663E\u5F0F\u5904\u7406\u4E1A\u52A1\u9519\u8BEF\uFF0C\u6216\u662F\u5426\u88AB\u4E2D\u65AD/\u7F3A\u5931\u4F9D\u8D56\u5BFC\u81F4\u5931\u8D25\u3002"
558
+ });
559
+ this._tag = "MainError";
560
+ this.name = "MainError";
561
+ this.cause = summarizeCause(cause);
562
+ }
563
+ toJSON() {
564
+ return { ...super.toJSON(), cause: this.cause };
565
+ }
566
+ };
567
+ var DisposeError = class extends ProgramRunnerErrorBase {
568
+ constructor(identity, cause) {
569
+ super({
570
+ message: "[Logix] Program dispose failed",
571
+ identity,
572
+ entrypoint: "dispose",
573
+ hint: "\u91CA\u653E\u5931\u8D25\uFF1A\u53EF\u80FD\u6709 finalizer \u629B\u9519\u6216 scope/\u8D44\u6E90\u53E5\u67C4\u5F02\u5E38\uFF0C\u5EFA\u8BAE\u67E5\u770B onError/\u65E5\u5FD7\u3002"
574
+ });
575
+ this._tag = "DisposeError";
576
+ this.name = "DisposeError";
577
+ this.cause = summarizeCause(cause);
578
+ }
579
+ toJSON() {
580
+ return { ...super.toJSON(), cause: this.cause };
581
+ }
582
+ };
583
+ var DisposeTimeoutError = class extends ProgramRunnerErrorBase {
584
+ constructor(identity, params) {
585
+ super({
586
+ message: "[Logix] Program dispose timed out",
587
+ identity,
588
+ entrypoint: "dispose",
589
+ hint: "\u91CA\u653E\u8D85\u65F6\uFF1A\u811A\u672C\u65E0\u6CD5\u81EA\u7136\u9000\u51FA\u901A\u5E38\u610F\u5473\u7740\u8D44\u6E90\u672A\u91CA\u653E\u6216\u540E\u53F0 fiber \u672A\u6536\u675F\u3002"
590
+ });
591
+ this._tag = "DisposeTimeout";
592
+ this.name = "DisposeTimeoutError";
593
+ this.timeoutMs = params.timeoutMs;
594
+ this.elapsedMs = params.elapsedMs;
595
+ this.suggestions = [
596
+ "\u68C0\u67E5\u662F\u5426\u6709\u672A unregister \u7684 event listener\uFF08\u5982 process.on / emitter.on\uFF09\u3002",
597
+ "\u68C0\u67E5\u662F\u5426\u6709\u672A join/\u672A interrupt \u7684 fiber\uFF08\u957F\u9A7B watcher / Stream.run*\uFF09\u3002",
598
+ "\u68C0\u67E5\u662F\u5426\u6709\u672A\u5173\u95ED\u7684\u8D44\u6E90\u53E5\u67C4\uFF08timer / socket / file handle\uFF09\u3002"
599
+ ];
600
+ }
601
+ toJSON() {
602
+ return {
603
+ ...super.toJSON(),
604
+ timeoutMs: this.timeoutMs,
605
+ elapsedMs: this.elapsedMs,
606
+ suggestions: this.suggestions
607
+ };
608
+ }
609
+ };
610
+
611
+ // ../logix-core/src/internal/runtime/runner/ProgramRunner.closeScope.ts
612
+ var closeProgramScope = (params) => {
613
+ return Effect2.gen(function* () {
614
+ const start = Date.now();
615
+ const fiber = yield* Effect2.forkDaemon(Scope.close(params.scope, Exit.void));
616
+ while (true) {
617
+ const exitOpt = yield* Fiber.poll(fiber);
618
+ if (Option.isSome(exitOpt)) {
619
+ const exit = exitOpt.value;
620
+ if (exit._tag === "Success") {
621
+ return;
622
+ }
623
+ return yield* Effect2.die(new DisposeError(params.identity, exit.cause));
624
+ }
625
+ const elapsedMs = Date.now() - start;
626
+ if (elapsedMs >= params.timeoutMs) {
627
+ const error = new DisposeTimeoutError(params.identity, {
628
+ timeoutMs: params.timeoutMs,
629
+ elapsedMs
630
+ });
631
+ if (typeof params.onError === "function") {
632
+ yield* params.onError(Cause.die(error)).pipe(Effect2.catchAllCause(() => Effect2.void));
633
+ }
634
+ yield* Fiber.interruptFork(fiber);
635
+ return yield* Effect2.die(error);
636
+ }
637
+ yield* Effect2.promise(() => new Promise((r) => queueMicrotask(r)));
638
+ }
639
+ });
640
+ };
641
+
642
+ // ../logix-core/src/internal/runtime/runner/ProgramRunner.exitCode.ts
643
+ var isRecord2 = (value) => typeof value === "object" && value !== null;
644
+ var getProcess = () => globalThis.process;
645
+ var setExitCodeIfEnabled = (enabled, value) => {
646
+ if (!enabled) return;
647
+ const proc = getProcess();
648
+ if (!isRecord2(proc)) return;
649
+ const next = typeof value === "number" && Number.isInteger(value) ? value : 0;
650
+ proc.exitCode = next;
651
+ };
652
+ var setFailureExitCodeIfEnabled = (enabled) => {
653
+ if (!enabled) return;
654
+ const proc = getProcess();
655
+ if (!isRecord2(proc)) return;
656
+ proc.exitCode = 1;
657
+ };
658
+ var reportErrorIfEnabled = (enabled, error) => {
659
+ if (!enabled) return;
660
+ console.error(error);
661
+ };
662
+
663
+ // ../logix-core/src/internal/runtime/runner/ProgramRunner.signals.ts
664
+ import { Effect as Effect3, Exit as Exit2, Scope as Scope2 } from "../effect.js";
665
+ var getProcess2 = () => globalThis.process;
666
+ var isNodeProcess = (value) => typeof value === "object" && value !== null && typeof value.on === "function";
667
+ var removeListener = (proc, event, handler) => {
668
+ if (typeof proc.off === "function") {
669
+ proc.off(event, handler);
670
+ return;
671
+ }
672
+ if (typeof proc.removeListener === "function") {
673
+ proc.removeListener(event, handler);
674
+ }
675
+ };
676
+ var installGracefulShutdownHandlers = (params) => {
677
+ if (!params.enabled) {
678
+ return Effect3.void;
679
+ }
680
+ const proc = getProcess2();
681
+ if (!isNodeProcess(proc)) {
682
+ return Effect3.void;
683
+ }
684
+ const handler = () => {
685
+ void Effect3.runPromise(Scope2.close(params.scope, Exit2.void));
686
+ };
687
+ return Effect3.gen(function* () {
688
+ yield* Scope2.addFinalizer(
689
+ params.scope,
690
+ Effect3.sync(() => {
691
+ removeListener(proc, "SIGINT", handler);
692
+ removeListener(proc, "SIGTERM", handler);
693
+ })
694
+ );
695
+ yield* Effect3.sync(() => {
696
+ proc.on("SIGINT", handler);
697
+ proc.on("SIGTERM", handler);
698
+ });
699
+ });
700
+ };
701
+
702
+ // ../logix-core/src/internal/runtime/runner/ProgramRunner.options.ts
703
+ var isRecord3 = (value) => typeof value === "object" && value !== null;
704
+ var resolveProgramRunnerOptions = (options) => {
705
+ const record = isRecord3(options) ? options : void 0;
706
+ const closeScopeTimeout = typeof record?.closeScopeTimeout === "number" ? record.closeScopeTimeout : 1e3;
707
+ const handleSignals = typeof record?.handleSignals === "boolean" ? record.handleSignals : true;
708
+ const exitCode = typeof record?.exitCode === "boolean" ? record.exitCode : false;
709
+ const reportError = typeof record?.reportError === "boolean" ? record.reportError : true;
710
+ const args = record?.args ?? void 0;
711
+ return {
712
+ closeScopeTimeout,
713
+ handleSignals,
714
+ args,
715
+ exitCode,
716
+ reportError
717
+ };
718
+ };
719
+
720
+ // ../logix-core/src/internal/runtime/runner/ProgramRunner.ts
721
+ var openProgram = (makeRuntime, rootImpl, options) => Effect4.gen(function* () {
722
+ const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
723
+ if (inTxn) {
724
+ return yield* Effect4.dieMessage(
725
+ "[Logix] Runtime.openProgram/runProgram is not allowed inside a synchronous StateTransaction body"
726
+ );
727
+ }
728
+ const runnerOptions = resolveProgramRunnerOptions(options);
729
+ const identity = {
730
+ moduleId: String(rootImpl.module.id),
731
+ instanceId: "unknown"
732
+ };
733
+ const scope = yield* Scope3.make();
734
+ const runtime = makeRuntime(rootImpl, options);
735
+ yield* Scope3.addFinalizer(
736
+ scope,
737
+ Effect4.promise(() => runtime.dispose()).pipe(Effect4.asVoid)
738
+ );
739
+ yield* Effect4.addFinalizer(
740
+ () => closeProgramScope({
741
+ scope,
742
+ timeoutMs: runnerOptions.closeScopeTimeout,
743
+ identity,
744
+ onError: options?.onError
745
+ })
746
+ );
747
+ yield* installGracefulShutdownHandlers({
748
+ scope,
749
+ enabled: runnerOptions.handleSignals
750
+ });
751
+ const moduleRuntime = yield* Effect4.tryPromise({
752
+ try: () => runtime.runPromise(rootImpl.module),
753
+ catch: (error) => new BootError(identity, error)
754
+ });
755
+ identity.instanceId = String(moduleRuntime.instanceId ?? "unknown");
756
+ const $ = make(rootImpl.module.shape, moduleRuntime);
757
+ return {
758
+ scope,
759
+ runtime,
760
+ module: moduleRuntime,
761
+ $
762
+ };
763
+ });
764
+ var runProgram = async (makeRuntime, rootImpl, main, options) => {
765
+ const runnerOptions = resolveProgramRunnerOptions(options);
766
+ const identity = {
767
+ moduleId: String(rootImpl.module.id),
768
+ instanceId: "unknown"
769
+ };
770
+ const scope = Effect4.runSync(Scope3.make());
771
+ const runtime = makeRuntime(rootImpl, options);
772
+ let ctx;
773
+ let mainError;
774
+ let closeError;
775
+ let result;
776
+ try {
777
+ Effect4.runSync(
778
+ Scope3.addFinalizer(
779
+ scope,
780
+ Effect4.promise(() => runtime.dispose()).pipe(Effect4.asVoid)
781
+ )
782
+ );
783
+ if (runnerOptions.handleSignals) {
784
+ Effect4.runSync(
785
+ installGracefulShutdownHandlers({
786
+ scope,
787
+ enabled: true
788
+ })
789
+ );
790
+ }
791
+ let moduleRuntime;
792
+ try {
793
+ moduleRuntime = await runtime.runPromise(rootImpl.module);
794
+ } catch (error) {
795
+ setFailureExitCodeIfEnabled(runnerOptions.exitCode);
796
+ reportErrorIfEnabled(
797
+ runnerOptions.exitCode && runnerOptions.reportError,
798
+ error
799
+ );
800
+ result = {
801
+ _tag: "failure",
802
+ error: new BootError(identity, error)
803
+ };
804
+ }
805
+ if (result?._tag !== "failure") {
806
+ identity.instanceId = String(moduleRuntime.instanceId ?? "unknown");
807
+ ctx = {
808
+ scope,
809
+ runtime,
810
+ module: moduleRuntime,
811
+ $: make(rootImpl.module.shape, moduleRuntime)
812
+ };
813
+ }
814
+ if (ctx) {
815
+ try {
816
+ const value = await ctx.runtime.runPromise(
817
+ main(ctx, runnerOptions.args)
818
+ );
819
+ setExitCodeIfEnabled(runnerOptions.exitCode, value);
820
+ result = { _tag: "success", value };
821
+ } catch (error) {
822
+ mainError = error;
823
+ setFailureExitCodeIfEnabled(runnerOptions.exitCode);
824
+ reportErrorIfEnabled(runnerOptions.exitCode && runnerOptions.reportError, error);
825
+ result = { _tag: "failure", error: new MainError(identity, error) };
826
+ }
827
+ }
828
+ } finally {
829
+ const exit = await Effect4.runPromiseExit(
830
+ closeProgramScope({
831
+ scope,
832
+ timeoutMs: runnerOptions.closeScopeTimeout,
833
+ identity,
834
+ onError: options?.onError
835
+ })
836
+ );
837
+ if (exit._tag === "Failure") {
838
+ const failureOpt = Cause2.failureOption(exit.cause);
839
+ if (Option2.isSome(failureOpt)) {
840
+ const error = failureOpt.value;
841
+ if (mainError !== void 0 && error && typeof error === "object") {
842
+ error.mainError = mainError;
843
+ }
844
+ closeError = error;
845
+ } else {
846
+ const defectOpt = Cause2.dieOption(exit.cause);
847
+ if (Option2.isSome(defectOpt) && defectOpt.value instanceof Error) {
848
+ const error = defectOpt.value;
849
+ if (mainError !== void 0 && error && typeof error === "object") {
850
+ error.mainError = mainError;
851
+ }
852
+ closeError = error;
853
+ } else {
854
+ closeError = new Error(String(exit.cause));
855
+ }
856
+ }
857
+ }
858
+ }
859
+ if (closeError !== void 0) {
860
+ setFailureExitCodeIfEnabled(runnerOptions.exitCode);
861
+ reportErrorIfEnabled(runnerOptions.exitCode && runnerOptions.reportError, closeError);
862
+ throw closeError;
863
+ }
864
+ if (!result) {
865
+ setFailureExitCodeIfEnabled(runnerOptions.exitCode);
866
+ throw new Error("[Logix] ProgramRunner.runProgram: missing result");
867
+ }
868
+ if (result._tag === "failure") {
869
+ throw result.error;
870
+ }
871
+ return result.value;
872
+ };
873
+
874
+ // ../logix-core/src/Runtime.ts
875
+ var resolveRootImpl = (root) => root?._tag === "ModuleImpl" ? root : root?.impl;
876
+ var make2 = (root, options) => {
877
+ const rootImpl = resolveRootImpl(root);
878
+ warnInvalidConcurrencyPolicyDevOnly(
879
+ options?.concurrencyPolicy,
880
+ "Runtime.make options.concurrencyPolicy"
881
+ );
882
+ warnInvalidStateTransactionRuntimeConfigDevOnly(
883
+ options?.stateTransaction,
884
+ "Runtime.make options.stateTransaction"
885
+ );
886
+ const userLayer = options?.layer ?? Layer2.empty;
887
+ let middlewareStack = options?.middleware ?? [];
888
+ const devtoolsOptions = options?.devtools === true ? {} : options?.devtools;
889
+ if (options?.devtools) {
890
+ const observerConfig = devtoolsOptions?.observer === false ? false : devtoolsOptions?.observer;
891
+ middlewareStack = withDebug(middlewareStack, {
892
+ logger: false,
893
+ observer: observerConfig
894
+ });
895
+ }
896
+ const effectOpLayer = middlewareStack.length > 0 ? Layer2.succeed(EffectOpMiddlewareTag, {
897
+ stack: middlewareStack
898
+ }) : Layer2.empty;
899
+ const baseLayer = options?.label != null ? Layer2.mergeAll(
900
+ runtimeLabel(options.label),
901
+ userLayer
902
+ ) : userLayer;
903
+ const baseWithDevtools = options?.devtools ? devtoolsHubLayer(baseLayer, {
904
+ bufferSize: devtoolsOptions?.bufferSize
905
+ }) : baseLayer;
906
+ const appLayer = Layer2.mergeAll(
907
+ runSessionLayer(),
908
+ baseWithDevtools,
909
+ effectOpLayer
910
+ );
911
+ const appConfig = {
912
+ layer: appLayer,
913
+ modules: [provide(rootImpl.module, rootImpl.layer)],
914
+ processes: rootImpl.processes ?? [],
915
+ onError: options?.onError,
916
+ stateTransaction: options?.stateTransaction,
917
+ concurrencyPolicy: options?.concurrencyPolicy
918
+ };
919
+ const app = makeApp(appConfig);
920
+ return app.makeRuntime();
921
+ };
922
+ var openProgram2 = (root, options) => openProgram(
923
+ (rootImpl, runtimeOptions) => make2(rootImpl, runtimeOptions),
924
+ resolveRootImpl(root),
925
+ options
926
+ );
927
+ var runProgram2 = async (root, main, options) => runProgram(
928
+ (rootImpl, runtimeOptions) => make2(rootImpl, runtimeOptions),
929
+ resolveRootImpl(root),
930
+ main,
931
+ options
932
+ );
933
+ var stateTransactionOverridesLayer = (overrides) => {
934
+ warnInvalidStateTransactionOverridesDevOnly(
935
+ overrides,
936
+ "Runtime.stateTransactionOverridesLayer"
937
+ );
938
+ return Layer2.succeed(StateTransactionOverridesTag, overrides);
939
+ };
940
+ var concurrencyPolicyOverridesLayer = (overrides) => {
941
+ warnInvalidConcurrencyPolicyDevOnly(
942
+ overrides,
943
+ "Runtime.concurrencyPolicyOverridesLayer"
944
+ );
945
+ return Layer2.succeed(ConcurrencyPolicyOverridesTag, overrides);
946
+ };
947
+ var setTraitConvergeOverride = (runtime, moduleId, overrides) => {
948
+ warnInvalidStateTransactionTraitConvergeOverridesDevOnly(
949
+ overrides,
950
+ `Runtime.setTraitConvergeOverride(${moduleId})`
951
+ );
952
+ runtime.runSync(
953
+ Effect5.gen(function* () {
954
+ const runtimeConfigOpt = yield* Effect5.serviceOption(StateTransactionConfigTag);
955
+ if (Option3.isNone(runtimeConfigOpt)) {
956
+ return;
957
+ }
958
+ const runtimeConfig = runtimeConfigOpt.value;
959
+ const next = {
960
+ ...runtimeConfig.traitConvergeOverridesByModuleId ?? {}
961
+ };
962
+ if (overrides) {
963
+ next[moduleId] = overrides;
964
+ } else {
965
+ delete next[moduleId];
966
+ }
967
+ runtimeConfig.traitConvergeOverridesByModuleId = next;
968
+ })
969
+ );
970
+ };
971
+ var setConcurrencyPolicyOverride = (runtime, moduleId, patch) => {
972
+ warnInvalidConcurrencyPolicyPatchDevOnly(
973
+ patch,
974
+ `Runtime.setConcurrencyPolicyOverride(${moduleId})`
975
+ );
976
+ runtime.runSync(
977
+ Effect5.gen(function* () {
978
+ const runtimeConfigOpt = yield* Effect5.serviceOption(ConcurrencyPolicyTag);
979
+ if (Option3.isNone(runtimeConfigOpt)) {
980
+ return;
981
+ }
982
+ const runtimeConfig = runtimeConfigOpt.value;
983
+ const next = {
984
+ ...runtimeConfig.overridesByModuleId ?? {}
985
+ };
986
+ if (patch) {
987
+ next[moduleId] = patch;
988
+ } else {
989
+ delete next[moduleId];
990
+ }
991
+ runtimeConfig.overridesByModuleId = next;
992
+ })
993
+ );
994
+ };
995
+ var applyTransactionSnapshot = (moduleId, instanceId, txnId, mode) => Effect5.gen(function* () {
996
+ const runtime = getRuntimeByModuleAndInstance(
997
+ moduleId,
998
+ instanceId
999
+ );
1000
+ if (!runtime) {
1001
+ return;
1002
+ }
1003
+ try {
1004
+ yield* getRuntimeInternals(runtime).txn.applyTransactionSnapshot(txnId, mode);
1005
+ } catch {
1006
+ return;
1007
+ }
1008
+ });
1009
+
1010
+ export {
1011
+ BootError,
1012
+ MainError,
1013
+ DisposeError,
1014
+ DisposeTimeoutError,
1015
+ closeProgramScope,
1016
+ make2 as make,
1017
+ openProgram2 as openProgram,
1018
+ runProgram2 as runProgram,
1019
+ stateTransactionOverridesLayer,
1020
+ concurrencyPolicyOverridesLayer,
1021
+ setTraitConvergeOverride,
1022
+ setConcurrencyPolicyOverride,
1023
+ applyTransactionSnapshot
1024
+ };
1025
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvUnVudGltZS50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL0FwcFJ1bnRpbWUudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL2NvbmZpZ1ZhbGlkYXRpb24udHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9ydW5uZXIvUHJvZ3JhbVJ1bm5lci50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL3J1bm5lci9Qcm9ncmFtUnVubmVyLmNsb3NlU2NvcGUudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9ydW5uZXIvUHJvZ3JhbVJ1bm5lci5lcnJvcnMudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9ydW5uZXIvUHJvZ3JhbVJ1bm5lci5leGl0Q29kZS50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL3J1bm5lci9Qcm9ncmFtUnVubmVyLnNpZ25hbHMudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9ydW5uZXIvUHJvZ3JhbVJ1bm5lci5vcHRpb25zLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBFZmZlY3QsIExheWVyLCBNYW5hZ2VkUnVudGltZSwgT3B0aW9uLCBTY29wZSB9IGZyb20gXCJlZmZlY3RcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlSW1wbCB9IGZyb20gXCIuL2ludGVybmFsL21vZHVsZS5qc1wiXG5pbXBvcnQgdHlwZSB7IEFueU1vZHVsZSB9IGZyb20gXCIuL01vZHVsZS5qc1wiXG5pbXBvcnQgKiBhcyBBcHBSdW50aW1lSW1wbCBmcm9tIFwiLi9pbnRlcm5hbC9ydW50aW1lL0FwcFJ1bnRpbWUuanNcIlxuaW1wb3J0ICogYXMgTW9kdWxlUnVudGltZSBmcm9tIFwiLi9pbnRlcm5hbC9ydW50aW1lL01vZHVsZVJ1bnRpbWUuanNcIlxuaW1wb3J0ICogYXMgRGVidWcgZnJvbSBcIi4vRGVidWcuanNcIlxuaW1wb3J0IHR5cGUgKiBhcyBFZmZlY3RPcCBmcm9tIFwiLi9FZmZlY3RPcC5qc1wiXG5pbXBvcnQgKiBhcyBFZmZlY3RPcENvcmUgZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9FZmZlY3RPcENvcmUuanNcIlxuaW1wb3J0ICogYXMgUnVuU2Vzc2lvbiBmcm9tIFwiLi9pbnRlcm5hbC9vYnNlcnZhYmlsaXR5L3J1blNlc3Npb24uanNcIlxuaW1wb3J0IHtcbiAgQ29uY3VycmVuY3lQb2xpY3lUYWcsXG4gIENvbmN1cnJlbmN5UG9saWN5T3ZlcnJpZGVzVGFnLFxuICBTdGF0ZVRyYW5zYWN0aW9uQ29uZmlnVGFnLFxuICBTdGF0ZVRyYW5zYWN0aW9uT3ZlcnJpZGVzVGFnLFxuICB0eXBlIENvbmN1cnJlbmN5UG9saWN5LFxuICB0eXBlIENvbmN1cnJlbmN5UG9saWN5T3ZlcnJpZGVzLFxuICB0eXBlIENvbmN1cnJlbmN5UG9saWN5UGF0Y2gsXG4gIHR5cGUgU3RhdGVUcmFuc2FjdGlvbk92ZXJyaWRlcyxcbiAgdHlwZSBTdGF0ZVRyYW5zYWN0aW9uSW5zdHJ1bWVudGF0aW9uLFxuICB0eXBlIFN0YXRlVHJhbnNhY3Rpb25UcmFpdENvbnZlcmdlT3ZlcnJpZGVzLFxufSBmcm9tIFwiLi9pbnRlcm5hbC9ydW50aW1lL2NvcmUvZW52LmpzXCJcbmltcG9ydCAqIGFzIE1pZGRsZXdhcmUgZnJvbSBcIi4vTWlkZGxld2FyZS5qc1wiXG5pbXBvcnQgeyBnZXRSdW50aW1lSW50ZXJuYWxzIH0gZnJvbSBcIi4vaW50ZXJuYWwvcnVudGltZS9jb3JlL3J1bnRpbWVJbnRlcm5hbHNBY2Nlc3Nvci5qc1wiXG5pbXBvcnQge1xuICB3YXJuSW52YWxpZENvbmN1cnJlbmN5UG9saWN5RGV2T25seSxcbiAgd2FybkludmFsaWRDb25jdXJyZW5jeVBvbGljeVBhdGNoRGV2T25seSxcbiAgd2FybkludmFsaWRTdGF0ZVRyYW5zYWN0aW9uT3ZlcnJpZGVzRGV2T25seSxcbiAgd2FybkludmFsaWRTdGF0ZVRyYW5zYWN0aW9uUnVudGltZUNvbmZpZ0Rldk9ubHksXG4gIHdhcm5JbnZhbGlkU3RhdGVUcmFuc2FjdGlvblRyYWl0Q29udmVyZ2VPdmVycmlkZXNEZXZPbmx5LFxufSBmcm9tIFwiLi9pbnRlcm5hbC9ydW50aW1lL2NvcmUvY29uZmlnVmFsaWRhdGlvbi5qc1wiXG5pbXBvcnQgKiBhcyBQcm9ncmFtUnVubmVyIGZyb20gXCIuL2ludGVybmFsL3J1bnRpbWUvcnVubmVyL1Byb2dyYW1SdW5uZXIuanNcIlxuaW1wb3J0IHR5cGUgeyBQcm9ncmFtUnVuQ29udGV4dCB9IGZyb20gXCIuL2ludGVybmFsL3J1bnRpbWUvcnVubmVyL1Byb2dyYW1SdW5uZXIuY29udGV4dC5qc1wiXG5cbmV4cG9ydCB0eXBlIHsgUHJvZ3JhbVJ1bkNvbnRleHQgfSBmcm9tIFwiLi9pbnRlcm5hbC9ydW50aW1lL3J1bm5lci9Qcm9ncmFtUnVubmVyLmNvbnRleHQuanNcIlxuZXhwb3J0IHtcbiAgQm9vdEVycm9yLFxuICBEaXNwb3NlRXJyb3IsXG4gIERpc3Bvc2VUaW1lb3V0RXJyb3IsXG4gIE1haW5FcnJvcixcbiAgdHlwZSBQcm9ncmFtSWRlbnRpdHksXG4gIHR5cGUgUHJvZ3JhbVJ1bm5lckVycm9yVGFnLFxufSBmcm9tIFwiLi9pbnRlcm5hbC9ydW50aW1lL3J1bm5lci9Qcm9ncmFtUnVubmVyLmVycm9ycy5qc1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlblByb2dyYW1PcHRpb25zIGV4dGVuZHMgUnVudGltZU9wdGlvbnMge1xuICByZWFkb25seSBjbG9zZVNjb3BlVGltZW91dD86IG51bWJlclxuICByZWFkb25seSBoYW5kbGVTaWduYWxzPzogYm9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1blByb2dyYW1PcHRpb25zPEFyZ3MgPSB1bmtub3duPiBleHRlbmRzIE9wZW5Qcm9ncmFtT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFyZ3M/OiBBcmdzXG4gIHJlYWRvbmx5IGV4aXRDb2RlPzogYm9vbGVhblxuICByZWFkb25seSByZXBvcnRFcnJvcj86IGJvb2xlYW5cbn1cblxuY29uc3QgcmVzb2x2ZVJvb3RJbXBsID0gPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGU+KFxuICByb290OiBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4gfCBBbnlNb2R1bGUsXG4pOiBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4gPT5cbiAgKChyb290IGFzIGFueSk/Ll90YWcgPT09IFwiTW9kdWxlSW1wbFwiXG4gICAgPyAocm9vdCBhcyBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4pXG4gICAgOiAoKHJvb3QgYXMgYW55KT8uaW1wbCBhcyBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4pKSBzYXRpc2ZpZXMgTW9kdWxlSW1wbDxcbiAgICBhbnksXG4gICAgU2gsXG4gICAgYW55XG4gID5cblxuLyoqXG4gKiBSdW50aW1lIFx1OTE0RFx1N0Y2RVx1RkYxQVxuICogLSBsYXllclx1RkYxQVx1OTg5RFx1NTkxNlx1NzY4NFx1OTg3Nlx1NUM0MiBFbnZcdUZGMDhcdTU5ODIgQ29uZmlnIC8gXHU1RTczXHU1M0YwXHU2NzBEXHU1MkExXHVGRjA5XHVGRjBDXHU0RjFBXHU0RTBFIFJvb3QgTW9kdWxlSW1wbC5sYXllciBcdTU0MDhcdTVFNzZcdUZGMUJcbiAqIC0gb25FcnJvclx1RkYxQUFwcCBcdTdFQTdcdTk1MTlcdThCRUZcdTU5MDRcdTc0MDZcdTUxNjVcdTUzRTNcdUZGMENcdTc1MjhcdTRFOEVcdTU3MjggUnVudGltZSBcdTdFQTdcdTdFREZcdTRFMDBcdTRFMEFcdTYyQTVcdTY3MkFcdTYzNTVcdTgzQjdcdTk1MTlcdThCRUZcdTMwMDJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lU3RhdGVUcmFuc2FjdGlvbk9wdGlvbnMge1xuICByZWFkb25seSBpbnN0cnVtZW50YXRpb24/OiBTdGF0ZVRyYW5zYWN0aW9uSW5zdHJ1bWVudGF0aW9uXG4gIHJlYWRvbmx5IHRyYWl0Q29udmVyZ2VCdWRnZXRNcz86IG51bWJlclxuICByZWFkb25seSB0cmFpdENvbnZlcmdlRGVjaXNpb25CdWRnZXRNcz86IG51bWJlclxuICByZWFkb25seSB0cmFpdENvbnZlcmdlTW9kZT86IFwiYXV0b1wiIHwgXCJmdWxsXCIgfCBcImRpcnR5XCJcbiAgcmVhZG9ubHkgdHJhaXRDb252ZXJnZU92ZXJyaWRlc0J5TW9kdWxlSWQ/OiBSZWFkb25seTxcbiAgICBSZWNvcmQ8c3RyaW5nLCBTdGF0ZVRyYW5zYWN0aW9uVHJhaXRDb252ZXJnZU92ZXJyaWRlcz5cbiAgPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVPcHRpb25zIHtcbiAgcmVhZG9ubHkgbGF5ZXI/OiBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj5cbiAgcmVhZG9ubHkgb25FcnJvcj86IChjYXVzZTogaW1wb3J0KCdlZmZlY3QnKS5DYXVzZS5DYXVzZTx1bmtub3duPikgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPlxuICAvKipcbiAgICogXHU1M0VGXHU5MDA5XHVGRjFBXHU0RTNBXHU1RjUzXHU1MjREIE1hbmFnZWRSdW50aW1lIFx1NjMwN1x1NUI5QVx1NEUwMFx1NEUyQVx1OTAzQlx1OEY5MVx1NjgwN1x1OEJDNlx1RkYwOFx1NEY4Qlx1NTk4MiBcIkFwcERlbW9SdW50aW1lXCJcdUZGMDlcdUZGMENcbiAgICogXHU3NTI4XHU0RThFIERlYnVnIC8gRGV2VG9vbHMgXHU1MjA2XHU3RUM0XHU1QzU1XHU3OTNBXHUzMDAyXG4gICAqL1xuICByZWFkb25seSBsYWJlbD86IHN0cmluZ1xuICByZWFkb25seSBtaWRkbGV3YXJlPzogRWZmZWN0T3AuTWlkZGxld2FyZVN0YWNrXG4gIC8qKlxuICAgKiBcdTRFMDBcdTk1MkVcdTU0MkZcdTc1MjggRGV2dG9vbHNcdUZGMDhcdTY2M0VcdTVGMEYgb3ZlcnJpZGVcdUZGMDlcdUZGMUFcbiAgICogLSB0cnVlXHVGRjFBXHU0RjdGXHU3NTI4XHU5RUQ4XHU4QkE0IERldnRvb2xzUnVudGltZU9wdGlvbnNcdUZGMUJcbiAgICogLSBEZXZ0b29sc1J1bnRpbWVPcHRpb25zXHVGRjFBXHU1M0VGXHU1QjlBXHU1MjM2IEh1YiBidWZmZXJTaXplIC8gRGVidWdPYnNlcnZlciBmaWx0ZXIgXHU3QjQ5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBkZXZ0b29scz86IHRydWUgfCBEZXZ0b29sc1J1bnRpbWVPcHRpb25zXG4gIC8qKlxuICAgKiBSdW50aW1lIFx1N0VBNyBTdGF0ZVRyYW5zYWN0aW9uIFx1OUVEOFx1OEJBNFx1OTE0RFx1N0Y2RVx1RkYxQVxuICAgKiAtIGluc3RydW1lbnRhdGlvbiBcdTY3MkFcdTYzRDBcdTRGOUJcdTY1RjZcdUZGMENcdTU0MDQgTW9kdWxlUnVudGltZSBcdTkwMDBcdTU2REVcdTUyMzBcdTU3RkFcdTRFOEUgTk9ERV9FTlYgXHU3Njg0XHU5RUQ4XHU4QkE0XHU1MDNDXHVGRjFCXG4gICAqIC0gaW5zdHJ1bWVudGF0aW9uIFx1NjNEMFx1NEY5Qlx1NjVGNlx1RkYwQ1x1NEY1Q1x1NEUzQVx1NjU3NFx1OTg5NyBSdW50aW1lIFx1NEUwQlx1NkEyMVx1NTc1N1x1NzY4NFx1OUVEOFx1OEJBNFx1ODlDMlx1NkQ0Qlx1N0VBN1x1NTIyQlx1RkYwQ1xuICAgKiAgIFx1NTE3N1x1NEY1M1x1NkEyMVx1NTc1N1x1NEVDRFx1NTNFRlx1OTAxQVx1OEZDNyBNb2R1bGUuaW1wbGVtZW50KHN0YXRlVHJhbnNhY3Rpb24pIFx1ODk4Nlx1NTE5OVx1MzAwMlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGVUcmFuc2FjdGlvbj86IFJ1bnRpbWVTdGF0ZVRyYW5zYWN0aW9uT3B0aW9uc1xuICAvKipcbiAgICogUnVudGltZSBcdTdFQTdcdTVFNzZcdTUzRDFcdTYzQTdcdTUyMzZcdTk3NjJcdUZGMUFcbiAgICogLSBcdTlFRDhcdThCQTRcdTVFNzZcdTg4NEMgd2F0Y2hlci90YXNrIFx1NzUzMSB1bmJvdW5kZWQgXHU2NTM2XHU2NTVCXHU0RTNBIGJvdW5kZWRcdUZGMDhcdTlFRDhcdThCQTQgMTZcdUZGMDlcdUZGMUJcbiAgICogLSBcdTY1MkZcdTYzMDEgcnVudGltZV9tb2R1bGUgXHU3MEVEXHU1MjA3XHU2MzYyXHU0RTBFIHByb3ZpZGVyIG92ZXJyaWRlc1x1RkYwOFx1NEUwRSAwMTMgXHU2M0E3XHU1MjM2XHU5NzYyXHU0RTAwXHU4MUY0XHVGRjA5XHUzMDAyXG4gICAqL1xuICByZWFkb25seSBjb25jdXJyZW5jeVBvbGljeT86IENvbmN1cnJlbmN5UG9saWN5XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGV2dG9vbHNSdW50aW1lT3B0aW9ucyB7XG4gIC8qKiBIdWIgcmluZyBidWZmZXIgXHU1QkI5XHU5MUNGXHVGRjA4XHU2NzYxXHU2NTcwXHVGRjA5XHVGRjBDXHU5RUQ4XHU4QkE0IDUwMFx1MzAwMiAqL1xuICByZWFkb25seSBidWZmZXJTaXplPzogbnVtYmVyXG4gIC8qKiBEZWJ1Z09ic2VydmVyIFx1OTE0RFx1N0Y2RVx1RkYwOFx1NzUyOFx1NEU4RSB0cmFjZTplZmZlY3RvcFx1RkYwOVx1RkYxQnVuZGVmaW5lZCBcdTg4NjhcdTc5M0FcdTlFRDhcdThCQTRcdTUxNjhcdTkxQ0ZcdTg5QzJcdTZENEJcdTMwMDIgKi9cbiAgcmVhZG9ubHkgb2JzZXJ2ZXI/OiBNaWRkbGV3YXJlLkRlYnVnT2JzZXJ2ZXJDb25maWcgfCBmYWxzZVxuICAvKiogXHU5ODg0XHU3NTU5XHVGRjFBUmVhY3QgXHU2RTMyXHU2N0QzXHU5MUM3XHU2ODM3L1x1OTY1MFx1OTg5MVx1OTE0RFx1N0Y2RVx1RkYwQ1x1NTQwRVx1N0VFRFx1NzUzMSBAbG9naXgvcmVhY3QgXHU4QkZCXHU1M0Q2XHUzMDAyICovXG4gIHJlYWRvbmx5IHNhbXBsaW5nPzoge1xuICAgIHJlYWRvbmx5IHJlYWN0UmVuZGVyU2FtcGxlUmF0ZT86IG51bWJlclxuICB9XG59XG5cbi8qKlxuICogUnVudGltZS5tYWtlXG4gKlxuICogXHU1NzI4XHU3RUQ5XHU1QjlBIFJvb3QgTW9kdWxlSW1wbCBcdTc2ODRcdTUyNERcdTYzRDBcdTRFMEJcdUZGMENcdTY3ODRcdTkwMjBcdTRFMDBcdTk4OTdcdTVFOTRcdTc1MjhcdTdFQTcgUnVudGltZVx1RkYxQVxuICpcbiAqIC0gXHU0RjdGXHU3NTI4IFJvb3RJbXBsLm1vZHVsZSArIFJvb3RJbXBsLmxheWVyIFx1NEY1Q1x1NEUzQVx1NTUyRlx1NEUwMFx1NzY4NFx1NTE2OFx1NUM0MFx1NkEyMVx1NTc1N1x1RkYxQlxuICogLSBcdTVDMDYgUm9vdEltcGwucHJvY2Vzc2VzIFx1NEY1Q1x1NEUzQVx1OTU3Rlx1NjcxRlx1OEZEQlx1N0EwQlx1NTcyOCBSdW50aW1lIFNjb3BlIFx1NTE4NVx1N0VERlx1NEUwMCBmb3JrXHVGRjFCXG4gKiAtIFx1NTkwRFx1NzUyOFx1NzNCMFx1NjcwOSBBcHBSdW50aW1lIFx1NUI5RVx1NzNCMFx1NEY1Q1x1NEUzQVx1NUU5NVx1NUM0Mlx1NUJCOVx1NTY2OFx1RkYwQ1x1NUJGOVx1NTkxNlx1NEVDNVx1NjZCNFx1OTczMiBNYW5hZ2VkUnVudGltZVx1MzAwMlxuICpcbiAqIFx1OEJGNFx1NjYwRVx1RkYxQVxuICogLSBcdTdDN0JcdTU3OEJcdTVDNDJcdTk3NjJcdTRGN0ZcdTc1MjhcdTVCQkRcdTZDREJcdTc2ODQgYW55L25ldmVyXHVGRjBDXHU0RUU1XHU5MDdGXHU1MTREXHU1NzI4XHU2QjY0XHU1OTA0XHU1RjE1XHU1MTY1XHU1OTBEXHU2NzQyXHU3Njg0IEVudiBcdTYzQThcdTVCRkNcdUZGMUJcbiAqIC0gXHU0RTFBXHU1MkExXHU0RUUzXHU3ODAxXHU1M0VBXHU5NzAwXHU4OTgxXHU0RkREXHU4QkMxIFJvb3RJbXBsLmxheWVyIFx1NEUwRSBvcHRpb25zLmxheWVyIFx1NEUwMFx1OEQ3N1x1ODBGRFx1Njc4NFx1OTAyMFx1NUI4Q1x1NjU3NCBFbnZcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IG1ha2UgPSAoXG4gIHJvb3Q6IE1vZHVsZUltcGw8YW55LCBBbnlNb2R1bGVTaGFwZSwgYW55PiB8IEFueU1vZHVsZSxcbiAgb3B0aW9ucz86IFJ1bnRpbWVPcHRpb25zLFxuKTogTWFuYWdlZFJ1bnRpbWUuTWFuYWdlZFJ1bnRpbWU8YW55LCBuZXZlcj4gPT4ge1xuICBjb25zdCByb290SW1wbCA9IHJlc29sdmVSb290SW1wbChyb290KVxuXG4gIHdhcm5JbnZhbGlkQ29uY3VycmVuY3lQb2xpY3lEZXZPbmx5KFxuICAgIG9wdGlvbnM/LmNvbmN1cnJlbmN5UG9saWN5LFxuICAgIFwiUnVudGltZS5tYWtlIG9wdGlvbnMuY29uY3VycmVuY3lQb2xpY3lcIixcbiAgKVxuICB3YXJuSW52YWxpZFN0YXRlVHJhbnNhY3Rpb25SdW50aW1lQ29uZmlnRGV2T25seShcbiAgICBvcHRpb25zPy5zdGF0ZVRyYW5zYWN0aW9uLFxuICAgIFwiUnVudGltZS5tYWtlIG9wdGlvbnMuc3RhdGVUcmFuc2FjdGlvblwiLFxuICApXG5cbiAgLy8gXHU1N0ZBXHU3ODQwIEVudlx1RkYxQVx1NUI4Q1x1NTE2OFx1NzUzMVx1OEMwM1x1NzUyOFx1NjVCOVx1NjNEMFx1NEY5Qlx1NzY4NCBMYXllciBcdTUxQjNcdTVCOUFcdUZGMDhcdTU5ODIgQ29uZmlnIC8gXHU1RTczXHU1M0YwXHU2NzBEXHU1MkExIC8gRGVidWdMYXllciBcdTdCNDlcdUZGMDlcdUZGMENcbiAgLy8gXHU4MkU1XHU5NzAwXHU4OTgxXHU1NDJGXHU3NTI4XHU5RUQ4XHU4QkE0IERlYnVnIFx1ODBGRFx1NTI5Qlx1RkYwQ1x1NjNBOFx1ODM1MFx1NjYzRVx1NUYwRlx1NEY3Rlx1NzUyOCBMb2dpeC5EZWJ1Zy53aXRoRGVmYXVsdExheWVyKC4uLikgXHU4RkRCXHU4ODRDXHU3RUM0XHU1NDA4XHUzMDAyXG4gIGNvbnN0IHVzZXJMYXllciA9IChvcHRpb25zPy5sYXllciA/PyBMYXllci5lbXB0eSkgYXMgTGF5ZXIuTGF5ZXI8XG4gICAgYW55LFxuICAgIG5ldmVyLFxuICAgIG5ldmVyXG4gID5cblxuICBsZXQgbWlkZGxld2FyZVN0YWNrOiBFZmZlY3RPcC5NaWRkbGV3YXJlU3RhY2sgPSBvcHRpb25zPy5taWRkbGV3YXJlID8/IFtdXG5cbiAgLy8gXHU4MkU1XHU2NjNFXHU1RjBGXHU1NDJGXHU3NTI4IGRldnRvb2xzXHVGRjBDXHU1MjE5XHU4MUVBXHU1MkE4XHVGRjFBXG4gIC8vIDEpIFx1OEZGRFx1NTJBMCBEZWJ1Z09ic2VydmVyXHVGRjA4dHJhY2U6ZWZmZWN0b3BcdUZGMDlcdUZGMUJcbiAgLy8gMikgXHU1NzI4IGFwcExheWVyIFx1NEUyRFx1NjMwMlx1NTE2NSBEZXZ0b29sc0h1YiBTaW5rXHVGRjA4XHU4RkRCXHU3QTBCXHU3RUE3XHU0RThCXHU0RUY2XHU4MDVBXHU1NDA4XHVGRjA5XHUzMDAyXG4gIGNvbnN0IGRldnRvb2xzT3B0aW9uczogRGV2dG9vbHNSdW50aW1lT3B0aW9ucyB8IHVuZGVmaW5lZCA9XG4gICAgb3B0aW9ucz8uZGV2dG9vbHMgPT09IHRydWVcbiAgICAgID8ge31cbiAgICAgIDogb3B0aW9ucz8uZGV2dG9vbHNcblxuICBpZiAob3B0aW9ucz8uZGV2dG9vbHMpIHtcbiAgICBjb25zdCBvYnNlcnZlckNvbmZpZyA9XG4gICAgICBkZXZ0b29sc09wdGlvbnM/Lm9ic2VydmVyID09PSBmYWxzZSA/IGZhbHNlIDogZGV2dG9vbHNPcHRpb25zPy5vYnNlcnZlclxuICAgIG1pZGRsZXdhcmVTdGFjayA9IE1pZGRsZXdhcmUud2l0aERlYnVnKG1pZGRsZXdhcmVTdGFjaywge1xuICAgICAgbG9nZ2VyOiBmYWxzZSxcbiAgICAgIG9ic2VydmVyOiBvYnNlcnZlckNvbmZpZyxcbiAgICB9KVxuICB9XG5cbiAgLy8gXHU1M0VGXHU5MDA5XHVGRjFBXHU0RTNBXHU1RjUzXHU1MjREIFJ1bnRpbWUgXHU2Q0U4XHU1MTY1IEVmZmVjdE9wIE1pZGRsZXdhcmVTdGFjayBTZXJ2aWNlXHVGRjBDXG4gIC8vIFx1NEY5QiBTdGF0ZVRyYWl0Lmluc3RhbGwgXHU3QjQ5XHU4RkQwXHU4ODRDXHU2NUY2XHU0RUUzXHU3ODAxXHU0RUNFIEVudiBcdTRFMkRcdTg5RTNcdTY3OTBcdTdFREZcdTRFMDBcdTc2ODQgRWZmZWN0T3AgXHU2MDNCXHU3RUJGXHU5MTREXHU3RjZFXHUzMDAyXG4gIGNvbnN0IGVmZmVjdE9wTGF5ZXI6IExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPiA9XG4gICAgbWlkZGxld2FyZVN0YWNrLmxlbmd0aCA+IDBcbiAgICAgID8gKExheWVyLnN1Y2NlZWQoRWZmZWN0T3BDb3JlLkVmZmVjdE9wTWlkZGxld2FyZVRhZywge1xuICAgICAgICAgIHN0YWNrOiBtaWRkbGV3YXJlU3RhY2ssXG4gICAgICAgIH0pIGFzIExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPilcbiAgICAgIDogKExheWVyLmVtcHR5IGFzIExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPilcblxuICBjb25zdCBiYXNlTGF5ZXIgPVxuICAgIG9wdGlvbnM/LmxhYmVsICE9IG51bGxcbiAgICAgID8gKExheWVyLm1lcmdlQWxsKFxuICAgICAgICAgIERlYnVnLnJ1bnRpbWVMYWJlbChvcHRpb25zLmxhYmVsKSxcbiAgICAgICAgICB1c2VyTGF5ZXIsXG4gICAgICAgICkgYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+KVxuICAgICAgOiB1c2VyTGF5ZXJcblxuICBjb25zdCBiYXNlV2l0aERldnRvb2xzID1cbiAgICBvcHRpb25zPy5kZXZ0b29sc1xuICAgICAgPyAoRGVidWcuZGV2dG9vbHNIdWJMYXllcihiYXNlTGF5ZXIsIHtcbiAgICAgICAgICBidWZmZXJTaXplOiBkZXZ0b29sc09wdGlvbnM/LmJ1ZmZlclNpemUsXG4gICAgICAgIH0pIGFzIExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPilcbiAgICAgIDogYmFzZUxheWVyXG5cbiAgLy8gTk9URTogcnVuU2Vzc2lvbiBcdTlFRDhcdThCQTRcdTVFOTRcdTUzRUZcdTg4QUJcdThDMDNcdTc1MjhcdTY1QjlcdTg5ODZcdTc2RDZcdUZGMDhcdTRGOEJcdTU5ODIgQ0kvdHJpYWwtcnVuIFx1NkNFOFx1NTE2NVx1N0EzM1x1NUI5QSBydW5JZFx1RkYwOVx1MzAwMlxuICAvLyBMYXllci5tZXJnZUFsbCBcdTRFMkRcdTU0MEVcdTgwMDVcdTRGMUFcdTg5ODZcdTc2RDZcdTUyNERcdTgwMDVcdUZGMENcdTU2RTBcdTZCNjRcdTlFRDhcdThCQTRcdTVDNDJcdTY1M0VcdTU3MjhcdTY3MDBcdTUyNERcdTMwMDJcbiAgY29uc3QgYXBwTGF5ZXIgPSBMYXllci5tZXJnZUFsbChcbiAgICBSdW5TZXNzaW9uLnJ1blNlc3Npb25MYXllcigpLFxuICAgIGJhc2VXaXRoRGV2dG9vbHMsXG4gICAgZWZmZWN0T3BMYXllcixcbiAgKSBhcyBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj5cblxuICBjb25zdCBhcHBDb25maWc6IEFwcFJ1bnRpbWVJbXBsLkxvZ2l4QXBwQ29uZmlnPGFueT4gPSB7XG4gICAgbGF5ZXI6IGFwcExheWVyLFxuICAgIG1vZHVsZXM6IFtBcHBSdW50aW1lSW1wbC5wcm92aWRlKHJvb3RJbXBsLm1vZHVsZSwgcm9vdEltcGwubGF5ZXIgYXMgTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT4pXSxcbiAgICBwcm9jZXNzZXM6IHJvb3RJbXBsLnByb2Nlc3NlcyA/PyBbXSxcbiAgICBvbkVycm9yOiBvcHRpb25zPy5vbkVycm9yLFxuICAgIHN0YXRlVHJhbnNhY3Rpb246IG9wdGlvbnM/LnN0YXRlVHJhbnNhY3Rpb24sXG4gICAgY29uY3VycmVuY3lQb2xpY3k6IG9wdGlvbnM/LmNvbmN1cnJlbmN5UG9saWN5LFxuICB9XG5cbiAgY29uc3QgYXBwID0gQXBwUnVudGltZUltcGwubWFrZUFwcChhcHBDb25maWcpXG4gIHJldHVybiBhcHAubWFrZVJ1bnRpbWUoKSBhcyBNYW5hZ2VkUnVudGltZS5NYW5hZ2VkUnVudGltZTxhbnksIG5ldmVyPlxufVxuXG4vKipcbiAqIFJ1bnRpbWUub3BlblByb2dyYW1cbiAqXG4gKiBcdThENDRcdTZFOTBcdTUzMTZcdTUxNjVcdTUzRTNcdUZGMUFcdThGRDRcdTU2REUgc2NvcGUtYm91bmQgXHU3Njg0IFByb2dyYW1SdW5Db250ZXh0XHVGRjA4XHU1REYyXHU1QjhDXHU2MjEwIGJvb3RcdUZGMENcdTUzRUZcdTdBQ0JcdTUzNzNcdTRFQTRcdTRFOTJcdTRGN0ZcdTc1MjhcdUZGMDlcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IG9wZW5Qcm9ncmFtID0gPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGU+KFxuICByb290OiBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4gfCBBbnlNb2R1bGUsXG4gIG9wdGlvbnM/OiBPcGVuUHJvZ3JhbU9wdGlvbnMsXG4pOiBFZmZlY3QuRWZmZWN0PFByb2dyYW1SdW5Db250ZXh0PFNoPiwgdW5rbm93biwgU2NvcGUuU2NvcGU+ID0+XG4gIFByb2dyYW1SdW5uZXIub3BlblByb2dyYW0oXG4gICAgKHJvb3RJbXBsLCBydW50aW1lT3B0aW9ucykgPT4gbWFrZShyb290SW1wbCwgcnVudGltZU9wdGlvbnMgYXMgUnVudGltZU9wdGlvbnMpLFxuICAgIHJlc29sdmVSb290SW1wbChyb290KSxcbiAgICBvcHRpb25zLFxuICApXG5cbi8qKlxuICogUnVudGltZS5ydW5Qcm9ncmFtXG4gKlxuICogXHU0RTAwXHU2QjIxXHU2MDI3XHU1MTY1XHU1M0UzXHVGRjFBXHU1QzAxXHU4OEM1XHUyMDFDXHU1NDJGXHU1MkE4IFx1MjE5MiBtYWluKGN0eCxhcmdzKSBcdTIxOTIgXHU5MUNBXHU2NTNFXHUyMDFEXHVGRjBDXHU1RTc2XHU2NTJGXHU2MzAxIENMSSBcdTUzQ0JcdTU5N0RcdTc2ODRcdTUzRUZcdTkwMDlcdTg4NENcdTRFM0FcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IHJ1blByb2dyYW0gPSBhc3luYyA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZSwgQXJncywgQSwgRSwgUj4oXG4gIHJvb3Q6IE1vZHVsZUltcGw8YW55LCBTaCwgYW55PiB8IEFueU1vZHVsZSxcbiAgbWFpbjogKFxuICAgIGN0eDogUHJvZ3JhbVJ1bkNvbnRleHQ8U2g+LFxuICAgIGFyZ3M6IEFyZ3MsXG4gICkgPT4gRWZmZWN0LkVmZmVjdDxBLCBFLCBSPixcbiAgb3B0aW9ucz86IFJ1blByb2dyYW1PcHRpb25zPEFyZ3M+LFxuKTogUHJvbWlzZTxBPiA9PlxuICBQcm9ncmFtUnVubmVyLnJ1blByb2dyYW0oXG4gICAgKHJvb3RJbXBsLCBydW50aW1lT3B0aW9ucykgPT4gbWFrZShyb290SW1wbCwgcnVudGltZU9wdGlvbnMgYXMgUnVudGltZU9wdGlvbnMpLFxuICAgIHJlc29sdmVSb290SW1wbChyb290KSxcbiAgICBtYWluLFxuICAgIG9wdGlvbnMsXG4gIClcblxuLyoqXG4gKiBzdGF0ZVRyYW5zYWN0aW9uT3ZlcnJpZGVzTGF5ZXJcdUZGMUFcbiAqIC0gXHU0RkJGXHU2Mzc3XHU2Nzg0XHU5MDIwXHU0RTAwXHU0RTJBIFByb3ZpZGVyIFx1ODMwM1x1NTZGNFx1NzY4NCBTdGF0ZVRyYW5zYWN0aW9uT3ZlcnJpZGVzIExheWVyXHVGRjFCXG4gKiAtIFx1NzUyOFx1NEU4RVx1NTcyOFx1N0VFN1x1NjI3Rlx1NTE2OFx1NUM0MCBydW50aW1lIFx1OTE0RFx1N0Y2RVx1NzY4NFx1NTdGQVx1Nzg0MFx1NEUwQVx1RkYwQ1x1NjMwOVx1NUM0MFx1OTBFOFx1NUI1MFx1NjgxMVx1NkNFOFx1NTE2NVx1NURFRVx1OTFDRlx1ODk4Nlx1NzZENlx1MzAwMlxuICovXG5leHBvcnQgY29uc3Qgc3RhdGVUcmFuc2FjdGlvbk92ZXJyaWRlc0xheWVyID0gKFxuICBvdmVycmlkZXM6IFN0YXRlVHJhbnNhY3Rpb25PdmVycmlkZXMsXG4pOiBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj4gPT4ge1xuICB3YXJuSW52YWxpZFN0YXRlVHJhbnNhY3Rpb25PdmVycmlkZXNEZXZPbmx5KFxuICAgIG92ZXJyaWRlcyxcbiAgICBcIlJ1bnRpbWUuc3RhdGVUcmFuc2FjdGlvbk92ZXJyaWRlc0xheWVyXCIsXG4gIClcbiAgcmV0dXJuIExheWVyLnN1Y2NlZWQoU3RhdGVUcmFuc2FjdGlvbk92ZXJyaWRlc1RhZywgb3ZlcnJpZGVzKSBhcyBMYXllci5MYXllcjxcbiAgICBhbnksXG4gICAgbmV2ZXIsXG4gICAgbmV2ZXJcbiAgPlxufVxuXG4vKipcbiAqIGNvbmN1cnJlbmN5UG9saWN5T3ZlcnJpZGVzTGF5ZXJcdUZGMUFcbiAqIC0gXHU0RkJGXHU2Mzc3XHU2Nzg0XHU5MDIwXHU0RTAwXHU0RTJBIFByb3ZpZGVyIFx1ODMwM1x1NTZGNFx1NzY4NCBDb25jdXJyZW5jeVBvbGljeU92ZXJyaWRlcyBMYXllclx1RkYxQlxuICogLSBcdTc1MjhcdTRFOEVcdTU3MjhcdTdFRTdcdTYyN0ZcdTUxNjhcdTVDNDAgcnVudGltZSBcdTkxNERcdTdGNkVcdTc2ODRcdTU3RkFcdTc4NDBcdTRFMEFcdUZGMENcdTYzMDlcdTVDNDBcdTkwRThcdTVCNTBcdTY4MTFcdTZDRThcdTUxNjVcdTVERUVcdTkxQ0ZcdTg5ODZcdTc2RDZcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbmN1cnJlbmN5UG9saWN5T3ZlcnJpZGVzTGF5ZXIgPSAoXG4gIG92ZXJyaWRlczogQ29uY3VycmVuY3lQb2xpY3lPdmVycmlkZXMsXG4pOiBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj4gPT4ge1xuICB3YXJuSW52YWxpZENvbmN1cnJlbmN5UG9saWN5RGV2T25seShcbiAgICBvdmVycmlkZXMsXG4gICAgXCJSdW50aW1lLmNvbmN1cnJlbmN5UG9saWN5T3ZlcnJpZGVzTGF5ZXJcIixcbiAgKVxuICByZXR1cm4gTGF5ZXIuc3VjY2VlZChDb25jdXJyZW5jeVBvbGljeU92ZXJyaWRlc1RhZywgb3ZlcnJpZGVzKSBhcyBMYXllci5MYXllcjxcbiAgICBhbnksXG4gICAgbmV2ZXIsXG4gICAgbmV2ZXJcbiAgPlxufVxuXG4vKipcbiAqIHNldFRyYWl0Q29udmVyZ2VPdmVycmlkZVx1RkYxQVxuICogLSBcdThGRDBcdTg4NENcdTY1RjZcdTcwRURcdTUyMDdcdTYzNjJcdTY3RDBcdTRFMkEgbW9kdWxlSWQgXHU3Njg0IGNvbnZlcmdlIFx1OTE0RFx1N0Y2RVx1RkYwOFx1NkI2Mlx1ODg0MFx1OERFRlx1NUY4NFx1RkYwOVx1RkYxQlx1NEYxOFx1NTE0OFx1N0VBN1x1NEY0RVx1NEU4RSBQcm92aWRlciBvdmVycmlkZVx1RkYxQlxuICogLSBcdThCRTUgQVBJIFx1NEVDNVx1NjUzOVx1NTNEOCBydW50aW1lIGNvbmZpZyBcdTc2ODQgbW9kdWxlSWQgcGF0Y2hcdUZGMENcdTRFMERcdTRGMUFcdTRGRUVcdTY1MzkgcnVudGltZV9kZWZhdWx0XHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRUcmFpdENvbnZlcmdlT3ZlcnJpZGUgPSAoXG4gIHJ1bnRpbWU6IE1hbmFnZWRSdW50aW1lLk1hbmFnZWRSdW50aW1lPGFueSwgbmV2ZXI+LFxuICBtb2R1bGVJZDogc3RyaW5nLFxuICBvdmVycmlkZXM6IFN0YXRlVHJhbnNhY3Rpb25UcmFpdENvbnZlcmdlT3ZlcnJpZGVzIHwgdW5kZWZpbmVkLFxuKTogdm9pZCA9PiB7XG4gIHdhcm5JbnZhbGlkU3RhdGVUcmFuc2FjdGlvblRyYWl0Q29udmVyZ2VPdmVycmlkZXNEZXZPbmx5KFxuICAgIG92ZXJyaWRlcyxcbiAgICBgUnVudGltZS5zZXRUcmFpdENvbnZlcmdlT3ZlcnJpZGUoJHttb2R1bGVJZH0pYCxcbiAgKVxuXG4gIHJ1bnRpbWUucnVuU3luYyhcbiAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCBydW50aW1lQ29uZmlnT3B0ID1cbiAgICAgICAgeWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFN0YXRlVHJhbnNhY3Rpb25Db25maWdUYWcpXG5cbiAgICAgIGlmIChPcHRpb24uaXNOb25lKHJ1bnRpbWVDb25maWdPcHQpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBOT1RFOiBydW50aW1lIGNvbmZpZyBcdTRGNUNcdTRFM0EgU2VydmljZSBcdTVCNThcdTU3MjhcdTRFOEUgRW52IFx1NEUyRFx1RkYxQlx1OEZEOVx1OTFDQ1x1OTAxQVx1OEZDN1x1MjAxQ1x1NjZGRlx1NjM2MiBtb2R1bGVJZCBwYXRjaCBtYXBcdTIwMURcdTc2ODRcdTY1QjlcdTVGMEZcdTcwRURcdTUyMDdcdTYzNjJcdTMwMDJcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBjb25zdCBydW50aW1lQ29uZmlnOiBhbnkgPSBydW50aW1lQ29uZmlnT3B0LnZhbHVlXG4gICAgICBjb25zdCBuZXh0ID0ge1xuICAgICAgICAuLi4ocnVudGltZUNvbmZpZy50cmFpdENvbnZlcmdlT3ZlcnJpZGVzQnlNb2R1bGVJZCA/PyB7fSksXG4gICAgICB9XG5cbiAgICAgIGlmIChvdmVycmlkZXMpIHtcbiAgICAgICAgbmV4dFttb2R1bGVJZF0gPSBvdmVycmlkZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSBuZXh0W21vZHVsZUlkXVxuICAgICAgfVxuXG4gICAgICBydW50aW1lQ29uZmlnLnRyYWl0Q29udmVyZ2VPdmVycmlkZXNCeU1vZHVsZUlkID0gbmV4dFxuICAgIH0pLFxuICApXG59XG5cbi8qKlxuICogc2V0Q29uY3VycmVuY3lQb2xpY3lPdmVycmlkZVx1RkYxQVxuICogLSBcdThGRDBcdTg4NENcdTY1RjZcdTcwRURcdTUyMDdcdTYzNjJcdTY3RDBcdTRFMkEgbW9kdWxlSWQgXHU3Njg0XHU1RTc2XHU1M0QxXHU3QjU2XHU3NTY1XHVGRjA4XHU2QjYyXHU4ODQwXHU4REVGXHU1Rjg0XHVGRjA5XHVGRjFCXHU0RjE4XHU1MTQ4XHU3RUE3XHU0RjRFXHU0RThFIFByb3ZpZGVyIG92ZXJyaWRlXHVGRjFCXG4gKiAtIFx1OEJFNSBBUEkgXHU0RUM1XHU2NTM5XHU1M0Q4IHJ1bnRpbWUgY29uZmlnIFx1NzY4NCBtb2R1bGVJZCBwYXRjaFx1RkYwQ1x1NEUwRFx1NEYxQVx1NEZFRVx1NjUzOSBydW50aW1lX2RlZmF1bHRcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IHNldENvbmN1cnJlbmN5UG9saWN5T3ZlcnJpZGUgPSAoXG4gIHJ1bnRpbWU6IE1hbmFnZWRSdW50aW1lLk1hbmFnZWRSdW50aW1lPGFueSwgbmV2ZXI+LFxuICBtb2R1bGVJZDogc3RyaW5nLFxuICBwYXRjaDogQ29uY3VycmVuY3lQb2xpY3lQYXRjaCB8IHVuZGVmaW5lZCxcbik6IHZvaWQgPT4ge1xuICB3YXJuSW52YWxpZENvbmN1cnJlbmN5UG9saWN5UGF0Y2hEZXZPbmx5KFxuICAgIHBhdGNoLFxuICAgIGBSdW50aW1lLnNldENvbmN1cnJlbmN5UG9saWN5T3ZlcnJpZGUoJHttb2R1bGVJZH0pYCxcbiAgKVxuXG4gIHJ1bnRpbWUucnVuU3luYyhcbiAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCBydW50aW1lQ29uZmlnT3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKENvbmN1cnJlbmN5UG9saWN5VGFnKVxuXG4gICAgICBpZiAoT3B0aW9uLmlzTm9uZShydW50aW1lQ29uZmlnT3B0KSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gTk9URTogcnVudGltZSBjb25maWcgXHU0RjVDXHU0RTNBIFNlcnZpY2UgXHU1QjU4XHU1NzI4XHU0RThFIEVudiBcdTRFMkRcdUZGMUJcdThGRDlcdTkxQ0NcdTkwMUFcdThGQzdcdTIwMUNcdTY2RkZcdTYzNjIgbW9kdWxlSWQgcGF0Y2ggbWFwXHUyMDFEXHU3Njg0XHU2NUI5XHU1RjBGXHU3MEVEXHU1MjA3XHU2MzYyXHUzMDAyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgY29uc3QgcnVudGltZUNvbmZpZzogYW55ID0gcnVudGltZUNvbmZpZ09wdC52YWx1ZVxuICAgICAgY29uc3QgbmV4dCA9IHtcbiAgICAgICAgLi4uKHJ1bnRpbWVDb25maWcub3ZlcnJpZGVzQnlNb2R1bGVJZCA/PyB7fSksXG4gICAgICB9XG5cbiAgICAgIGlmIChwYXRjaCkge1xuICAgICAgICBuZXh0W21vZHVsZUlkXSA9IHBhdGNoXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbmV4dFttb2R1bGVJZF1cbiAgICAgIH1cblxuICAgICAgcnVudGltZUNvbmZpZy5vdmVycmlkZXNCeU1vZHVsZUlkID0gbmV4dFxuICAgIH0pLFxuICApXG59XG5cbi8qKlxuICogYXBwbHlUcmFuc2FjdGlvblNuYXBzaG90XHVGRjFBXG4gKiAtIERldnRvb2xzIFx1MjE5NCBSdW50aW1lIFx1NTk1MVx1N0VBNlx1NzY4NFx1NEUwMFx1OTBFOFx1NTIwNlx1RkYwQ1x1NzUyOFx1NEU4RVx1NTcyOCBkZXYvdGVzdCBcdTczQUZcdTU4ODNcdTRFMEJcdTYzMDlcdTRFOEJcdTUyQTFcdTU2REVcdTY1M0VcdTY3RDBcdTRFMkFcdTZBMjFcdTU3NTdcdTVCOUVcdTRGOEJcdTc2ODRcdTcyQjZcdTYwMDFcdUZGMUJcbiAqIC0gbW9kdWxlSWQgLyBpbnN0YW5jZUlkIFx1NUJGOVx1NUU5NCBEZWJ1ZyBcdTRFOEJcdTRFRjZcdTRFMkRcdTc2ODQgbW9kdWxlSWQgLyBpbnN0YW5jZUlkXHVGRjFCXG4gKiAtIG1vZGUgPSBcImJlZm9yZVwiIFx1NTZERVx1NjUzRVx1NTIzMFx1NEU4Qlx1NTJBMVx1NUYwMFx1NTlDQlx1NTI0RFx1NzY4NFx1NzJCNlx1NjAwMVx1RkYwQ1wiYWZ0ZXJcIiBcdTU2REVcdTY1M0VcdTUyMzBcdTRFOEJcdTUyQTFcdTYzRDBcdTRFQTRcdTU0MEVcdTc2ODRcdTcyQjZcdTYwMDFcdTMwMDJcbiAqXG4gKiBcdThCRjRcdTY2MEVcdUZGMUFcbiAqIC0gXHU1QjlFXHU5NjQ1XHU1NkRFXHU2NTNFXHU5MDNCXHU4RjkxXHU3NTMxIE1vZHVsZVJ1bnRpbWUgXHU1MTg1XHU5MEU4XHU3Njg0IGRldi1vbmx5IEFQSSBcdTYyN0ZcdTYyQzVcdUZGMUJcbiAqIC0gXHU4MkU1XHU2MjdFXHU0RTBEXHU1MjMwXHU1QkY5XHU1RTk0IFJ1bnRpbWUgXHU2MjE2XHU1RjUzXHU1MjREXHU1QjlFXHU0RjhCXHU2NzJBXHU1NDJGXHU3NTI4XHU2NUY2XHU5NUY0XHU2NUM1XHU4ODRDXHU4MEZEXHU1MjlCXHVGRjBDXHU1MjE5XHU0RTNBIG5vLW9wXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBseVRyYW5zYWN0aW9uU25hcHNob3QgPSAoXG4gIG1vZHVsZUlkOiBzdHJpbmcsXG4gIGluc3RhbmNlSWQ6IHN0cmluZyxcbiAgdHhuSWQ6IHN0cmluZyxcbiAgbW9kZTogXCJiZWZvcmVcIiB8IFwiYWZ0ZXJcIixcbik6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHJ1bnRpbWUgPVxuICAgICAgTW9kdWxlUnVudGltZS5nZXRSdW50aW1lQnlNb2R1bGVBbmRJbnN0YW5jZTxhbnksIGFueT4oXG4gICAgICAgIG1vZHVsZUlkLFxuICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgKVxuXG4gICAgaWYgKCFydW50aW1lKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgeWllbGQqIGdldFJ1bnRpbWVJbnRlcm5hbHMocnVudGltZSBhcyBhbnkpLnR4bi5hcHBseVRyYW5zYWN0aW9uU25hcHNob3QodHhuSWQsIG1vZGUpXG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gIH0pXG4iLCAiaW1wb3J0IHsgQ29udGV4dCwgRGVmZXJyZWQsIEVmZmVjdCwgTGF5ZXIsIE1hbmFnZWRSdW50aW1lIH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0IHtcbiAgQ29uY3VycmVuY3lQb2xpY3lUYWcsXG4gIFN0YXRlVHJhbnNhY3Rpb25Db25maWdUYWcsXG4gIHR5cGUgQ29uY3VycmVuY3lQb2xpY3ksXG4gIHR5cGUgU3RhdGVUcmFuc2FjdGlvblJ1bnRpbWVDb25maWcsXG59IGZyb20gJy4vY29yZS9lbnYuanMnXG5pbXBvcnQgeyBSb290Q29udGV4dFRhZywgdHlwZSBSb290Q29udGV4dCB9IGZyb20gXCIuL2NvcmUvUm9vdENvbnRleHQuanNcIlxuaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlVGFnLCBNb2R1bGVSdW50aW1lLCBTdGF0ZU9mLCBBY3Rpb25PZiB9IGZyb20gJy4vY29yZS9tb2R1bGUuanMnXG5cbi8qKlxuICogQXBwTW9kdWxlRW50cnlcdUZGMUFcdTc1MzEgTG9naXgucHJvdmlkZSBcdTc1MUZcdTYyMTBcdTc2ODRcdTZBMjFcdTU3NTdcdTY3NjFcdTc2RUVcdTMwMDJcbiAqXG4gKiAtIG1vZHVsZVx1RkYxQU1vZHVsZSBcdTVCOUFcdTRFNDlcdTVCRjlcdThDNjFcdUZGMDhcdTY1RTJcdTY2MkYgVGFnXHVGRjBDXHU1M0M4XHU2NDNBXHU1RTI2IFNoYXBlIFx1NEZFMVx1NjA2Rlx1NEUwRVx1NURFNVx1NTM4Mlx1ODBGRFx1NTI5Qlx1RkYwOVx1RkYxQlxuICogLSBsYXllclx1RkYxQVx1OEJFNSBNb2R1bGUgXHU1QkY5XHU1RTk0XHU3Njg0IFJ1bnRpbWUgTGF5ZXJcdTMwMDJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBNb2R1bGVFbnRyeSB7XG4gIHJlYWRvbmx5IG1vZHVsZTogTW9kdWxlVGFnPGFueSwgQW55TW9kdWxlU2hhcGU+XG4gIHJlYWRvbmx5IGxheWVyOiBMYXllci5MYXllcjxhbnksIGFueSwgYW55PlxuICAvKipcbiAgICogXHU1M0VGXHU5MDA5XHVGRjFBXHU3NTMxXHU4QkU1XHU2QTIxXHU1NzU3XHU1QkY5XHU1RTk0IExheWVyIFx1NjNEMFx1NEY5Qlx1NzY4NCBTZXJ2aWNlIFRhZyBcdTUyMTdcdTg4NjhcdTMwMDJcbiAgICpcbiAgICogLSBcdTRFQzVcdTc1MjhcdTRFOEUgQXBwIFx1Njc4NFx1NUVGQVx1OTYzNlx1NkJCNVx1NzY4NCBUYWcgXHU1MUIyXHU3QTgxXHU2OEMwXHU2RDRCXHU0RTBFIEVudiBcdTYyRDNcdTYyNTFcdTUyMDZcdTY3OTBcdUZGMUJcbiAgICogLSBcdTUxODVcdTkwRThcdTU3MjhcdTRGN0ZcdTc1MjggQXBwUnVudGltZSBcdTdFQzRcdTg4QzVcdTVFOTRcdTc1MjhcdTg0RERcdTU2RkVcdTY1RjZcdUZGMENcdTUzRUZcdTkwMUFcdThGQzcgcHJvdmlkZVdpdGhUYWdzIFx1NjYzRVx1NUYwRlx1NThGMFx1NjYwRVx1RkYxQlxuICAgKiAtIFx1NEUwRFx1NUY3MVx1NTRDRFx1OEZEMFx1ODg0Q1x1NjVGNlx1ODg0Q1x1NEUzQVx1RkYwQ1x1NEUwRFx1NThGMFx1NjYwRVx1NTIxOVx1ODlDNlx1NEUzQVx1MjAxQ1x1OEJFNSBNb2R1bGUgTGF5ZXIgXHU2NzJBXHU2NjNFXHU1RjBGXHU2M0QwXHU0RjlCIFNlcnZpY2UgVGFnXHUyMDFEXHUzMDAyXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlVGFncz86IFJlYWRvbmx5QXJyYXk8Q29udGV4dC5UYWc8YW55LCBhbnk+PlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2l4QXBwQ29uZmlnPFI+IHtcbiAgcmVhZG9ubHkgbGF5ZXI6IExheWVyLkxheWVyPFIsIG5ldmVyLCBuZXZlcj5cbiAgcmVhZG9ubHkgbW9kdWxlczogUmVhZG9ubHlBcnJheTxBcHBNb2R1bGVFbnRyeT5cbiAgcmVhZG9ubHkgcHJvY2Vzc2VzOiBSZWFkb25seUFycmF5PEVmZmVjdC5FZmZlY3Q8dm9pZCwgYW55LCBhbnk+PlxuICByZWFkb25seSBvbkVycm9yPzogKGNhdXNlOiBpbXBvcnQoJ2VmZmVjdCcpLkNhdXNlLkNhdXNlPHVua25vd24+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQ+XG4gIC8qKlxuICAgKiBSdW50aW1lIFx1N0VBNyBTdGF0ZVRyYW5zYWN0aW9uIFx1OUVEOFx1OEJBNFx1OTE0RFx1N0Y2RVx1RkYxQVxuICAgKiAtIFx1ODJFNVx1NjcyQVx1NjNEMFx1NEY5Qlx1RkYwQ1x1NTIxOVx1NTQwNCBNb2R1bGVSdW50aW1lIFx1OTAwMFx1NTZERVx1NTIzMFx1NTdGQVx1NEU4RSBOT0RFX0VOViBcdTc2ODRcdTlFRDhcdThCQTRcdTg5QzJcdTZENEJcdTdCNTZcdTc1NjVcdUZGMUJcbiAgICogLSBcdTgyRTVcdTYzRDBcdTRGOUIgaW5zdHJ1bWVudGF0aW9uXHVGRjBDXHU1MjE5XHU0RjVDXHU0RTNBIFJ1bnRpbWUgXHU0RTBCXHU2MjQwXHU2NzA5XHU2QTIxXHU1NzU3XHU3Njg0XHU5RUQ4XHU4QkE0XHU4OUMyXHU2RDRCXHU3RUE3XHU1MjJCXHVGRjBDXG4gICAqICAgXHU1MTc3XHU0RjUzXHU2QTIxXHU1NzU3XHU0RUNEXHU1M0VGXHU5MDFBXHU4RkM3IE1vZHVsZUltcGwuc3RhdGVUcmFuc2FjdGlvbiBcdTg5ODZcdTUxOTlcdTMwMDJcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlVHJhbnNhY3Rpb24/OiBTdGF0ZVRyYW5zYWN0aW9uUnVudGltZUNvbmZpZ1xuICAvKipcbiAgICogUnVudGltZSBcdTdFQTdcdTVFNzZcdTUzRDFcdTYzQTdcdTUyMzZcdTk3NjJcdUZGMUFcbiAgICogLSBcdTgyRTVcdTY3MkFcdTYzRDBcdTRGOUJcdUZGMENcdTUyMTlcdTU0MDRcdTUxNjVcdTUzRTNcdTkwMDBcdTU2REVcdTUyMzAgYnVpbHRpbiBcdTlFRDhcdThCQTRcdUZGMDhcdTRGOEJcdTU5ODIgY29uY3VycmVuY3lMaW1pdD0xNlx1RkYwOVx1MzAwMlxuICAgKiAtIFx1ODJFNVx1NjNEMFx1NEY5Qlx1RkYwQ1x1NTIxOVx1NEY1Q1x1NEUzQSBSdW50aW1lIFx1NEUwQlx1NjI0MFx1NjcwOVx1NkEyMVx1NTc1N1x1NzY4NFx1OUVEOFx1OEJBNFx1N0I1Nlx1NzU2NVx1RkYxQlxuICAgKiAgIFx1NTE3N1x1NEY1M1x1NkEyMVx1NTc1N1x1NEVDRFx1NTNFRlx1OTAxQVx1OEZDNyBydW50aW1lX21vZHVsZS9wcm92aWRlciBcdTg5ODZcdTUxOTlcdUZGMDhcdTc1MzEgTW9kdWxlUnVudGltZSByZXNvbHZlciBcdTU0MDhcdTVFNzZcdUZGMDlcdTMwMDJcbiAgICovXG4gIHJlYWRvbmx5IGNvbmN1cnJlbmN5UG9saWN5PzogQ29uY3VycmVuY3lQb2xpY3lcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBEZWZpbml0aW9uPFI+IHtcbiAgcmVhZG9ubHkgZGVmaW5pdGlvbjogTG9naXhBcHBDb25maWc8Uj5cbiAgcmVhZG9ubHkgbGF5ZXI6IExheWVyLkxheWVyPFIsIG5ldmVyLCBuZXZlcj5cbiAgcmVhZG9ubHkgbWFrZVJ1bnRpbWU6ICgpID0+IE1hbmFnZWRSdW50aW1lLk1hbmFnZWRSdW50aW1lPFIsIG5ldmVyPlxufVxuXG5pbnRlcmZhY2UgVGFnSW5mbyB7XG4gIHJlYWRvbmx5IGtleTogc3RyaW5nXG4gIHJlYWRvbmx5IHRhZzogQ29udGV4dC5UYWc8YW55LCBhbnk+XG4gIHJlYWRvbmx5IG93bmVyTW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBzb3VyY2U6ICdtb2R1bGUnIHwgJ3NlcnZpY2UnXG59XG5cbmludGVyZmFjZSBUYWdDb2xsaXNpb24ge1xuICByZWFkb25seSBrZXk6IHN0cmluZ1xuICByZWFkb25seSBjb25mbGljdHM6IFJlYWRvbmx5QXJyYXk8VGFnSW5mbz5cbn1cblxuaW50ZXJmYWNlIFRhZ0NvbGxpc2lvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICByZWFkb25seSBfdGFnOiAnVGFnQ29sbGlzaW9uRXJyb3InXG4gIHJlYWRvbmx5IGNvbGxpc2lvbnM6IFJlYWRvbmx5QXJyYXk8VGFnQ29sbGlzaW9uPlxufVxuXG5jb25zdCBnZXRUYWdLZXkgPSAodGFnOiBDb250ZXh0LlRhZzxhbnksIGFueT4pOiBzdHJpbmcgPT4ge1xuICBjb25zdCBhbnlUYWcgPSB0YWcgYXMgYW55XG4gIGlmICh0eXBlb2YgYW55VGFnLmtleSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gYW55VGFnLmtleVxuICB9XG4gIGlmICh0eXBlb2YgYW55VGFnLl9pZCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gYW55VGFnLl9pZFxuICB9XG4gIGlmICh0eXBlb2YgYW55VGFnLnRvU3RyaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGFueVRhZy50b1N0cmluZygpXG4gIH1cbiAgcmV0dXJuICdbdW5rbm93bi10YWddJ1xufVxuXG5jb25zdCBidWlsZFRhZ0luZGV4ID0gKGVudHJpZXM6IFJlYWRvbmx5QXJyYXk8QXBwTW9kdWxlRW50cnk+KTogTWFwPHN0cmluZywgVGFnSW5mb1tdPiA9PiB7XG4gIGNvbnN0IGluZGV4ID0gbmV3IE1hcDxzdHJpbmcsIFRhZ0luZm9bXT4oKVxuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGNvbnN0IG93bmVySWQgPSBTdHJpbmcoZW50cnkubW9kdWxlLmlkKVxuXG4gICAgLy8gXHU4QkIwXHU1RjU1IE1vZHVsZSBcdTgxRUFcdThFQUIgVGFnXG4gICAgY29uc3QgbW9kdWxlVGFnID0gZW50cnkubW9kdWxlIGFzIHVua25vd24gYXMgQ29udGV4dC5UYWc8YW55LCBhbnk+XG4gICAgY29uc3QgbW9kdWxlS2V5ID0gZ2V0VGFnS2V5KG1vZHVsZVRhZylcbiAgICBjb25zdCBtb2R1bGVJbmZvOiBUYWdJbmZvID0ge1xuICAgICAga2V5OiBtb2R1bGVLZXksXG4gICAgICB0YWc6IG1vZHVsZVRhZyxcbiAgICAgIG93bmVyTW9kdWxlSWQ6IG93bmVySWQsXG4gICAgICBzb3VyY2U6ICdtb2R1bGUnLFxuICAgIH1cbiAgICBjb25zdCBleGlzdGluZ01vZHVsZUluZm9zID0gaW5kZXguZ2V0KG1vZHVsZUtleSlcbiAgICBpZiAoZXhpc3RpbmdNb2R1bGVJbmZvcykge1xuICAgICAgZXhpc3RpbmdNb2R1bGVJbmZvcy5wdXNoKG1vZHVsZUluZm8pXG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGV4LnNldChtb2R1bGVLZXksIFttb2R1bGVJbmZvXSlcbiAgICB9XG5cbiAgICAvLyBcdThCQjBcdTVGNTVcdTY2M0VcdTVGMEZcdTU4RjBcdTY2MEVcdTc2ODQgU2VydmljZSBUYWdcdUZGMDhcdTU5ODJcdTY3MDlcdUZGMDlcbiAgICBpZiAoZW50cnkuc2VydmljZVRhZ3MgJiYgZW50cnkuc2VydmljZVRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCB0YWcgb2YgZW50cnkuc2VydmljZVRhZ3MpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0VGFnS2V5KHRhZylcbiAgICAgICAgY29uc3QgaW5mbzogVGFnSW5mbyA9IHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgdGFnLFxuICAgICAgICAgIG93bmVyTW9kdWxlSWQ6IG93bmVySWQsXG4gICAgICAgICAgc291cmNlOiAnc2VydmljZScsXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXhpc3RpbmdJbmZvcyA9IGluZGV4LmdldChrZXkpXG4gICAgICAgIGlmIChleGlzdGluZ0luZm9zKSB7XG4gICAgICAgICAgZXhpc3RpbmdJbmZvcy5wdXNoKGluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5kZXguc2V0KGtleSwgW2luZm9dKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGluZGV4XG59XG5cbmNvbnN0IHZhbGlkYXRlVGFncyA9IChlbnRyaWVzOiBSZWFkb25seUFycmF5PEFwcE1vZHVsZUVudHJ5Pik6IHZvaWQgPT4ge1xuICBjb25zdCBpbmRleCA9IGJ1aWxkVGFnSW5kZXgoZW50cmllcylcbiAgY29uc3QgY29sbGlzaW9uczogVGFnQ29sbGlzaW9uW10gPSBbXVxuXG4gIGZvciAoY29uc3QgW2tleSwgaW5mb3NdIG9mIGluZGV4KSB7XG4gICAgaWYgKGluZm9zLmxlbmd0aCA8PSAxKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCBvd25lcnMgPSBuZXcgU2V0PHN0cmluZz4oKVxuICAgIGZvciAoY29uc3QgaW5mbyBvZiBpbmZvcykge1xuICAgICAgb3duZXJzLmFkZChpbmZvLm93bmVyTW9kdWxlSWQpXG4gICAgfVxuICAgIC8vIFx1NEVDNVx1NUY1M1x1NTQwQ1x1NEUwMCBrZXkgXHU1MUZBXHU3M0IwXHU1NzI4XHU1OTFBXHU0RTJBXHU0RTBEXHU1NDBDXHU2QTIxXHU1NzU3XHU0RTBCXHU2NUY2XHU4OUM2XHU0RTNBXHU1MUIyXHU3QTgxXHVGRjFCXG4gICAgLy8gXHU1MzU1XHU2QTIxXHU1NzU3XHU1MTg1XHU5MUNEXHU1OTBEXHU3NjdCXHU4QkIwXHU1NDBDXHU0RTAwIFRhZyBcdTRFMERcdTRGNUNcdTRFM0FcdTk1MTlcdThCRUZcdTU5MDRcdTc0MDZcdUZGMDhcdTUzRUZcdTgwRkRcdTY3NjVcdTgxRUFcdTU5MUFcdTVDNDJcdTdFQzRcdTU0MDhcdUZGMDlcdTMwMDJcbiAgICBpZiAob3duZXJzLnNpemUgPiAxKSB7XG4gICAgICBjb2xsaXNpb25zLnB1c2goeyBrZXksIGNvbmZsaWN0czogaW5mb3MgfSlcbiAgICB9XG4gIH1cblxuICBpZiAoY29sbGlzaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2UgPVxuICAgICdbTG9naXhdIFRhZyBjb2xsaXNpb24gZGV0ZWN0ZWQ6XFxuJyArXG4gICAgY29sbGlzaW9uc1xuICAgICAgLm1hcCgoYykgPT4ge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBgLSBrZXk6ICR7Yy5rZXl9YFxuICAgICAgICBjb25zdCBsaW5lcyA9IGMuY29uZmxpY3RzLm1hcCgoaSkgPT4gYCAgLSBvd25lcjogJHtpLm93bmVyTW9kdWxlSWR9LCBzb3VyY2U6ICR7aS5zb3VyY2V9YClcbiAgICAgICAgcmV0dXJuIFtoZWFkZXIsIC4uLmxpbmVzXS5qb2luKCdcXG4nKVxuICAgICAgfSlcbiAgICAgIC5qb2luKCdcXG4nKVxuXG4gIGNvbnN0IGVycm9yOiBUYWdDb2xsaXNpb25FcnJvciA9IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKG1lc3NhZ2UpLCB7XG4gICAgX3RhZzogJ1RhZ0NvbGxpc2lvbkVycm9yJyBhcyBjb25zdCxcbiAgICBjb2xsaXNpb25zLFxuICB9KVxuXG4gIHRocm93IGVycm9yXG59XG5cbmV4cG9ydCBjb25zdCBtYWtlQXBwID0gPFI+KGNvbmZpZzogTG9naXhBcHBDb25maWc8Uj4pOiBBcHBEZWZpbml0aW9uPFI+ID0+IHtcbiAgY29uc3Qgc2VlbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGZvciAoY29uc3QgZW50cnkgb2YgY29uZmlnLm1vZHVsZXMpIHtcbiAgICBjb25zdCBpZCA9IFN0cmluZyhlbnRyeS5tb2R1bGUuaWQpXG5cbiAgICBpZiAoc2Vlbklkcy5oYXMoaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBbTG9naXhdIER1cGxpY2F0ZSBNb2R1bGUgSUQvVGFnIGRldGVjdGVkOiBcIiR7aWR9XCIuIFxcbkVuc3VyZSBhbGwgbW9kdWxlcyBpbiB0aGUgYXBwbGljYXRpb24gUnVudGltZSBoYXZlIHVuaXF1ZSBJRHMuYCxcbiAgICAgIClcbiAgICB9XG4gICAgc2Vlbklkcy5hZGQoaWQpXG4gIH1cblxuICAvLyBcdTU3MjhcdTU0MDhcdTVFNzYgTGF5ZXIgXHU0RTRCXHU1MjREXHVGRjBDXHU1QkY5IE1vZHVsZSBUYWcgXHU0RTBFXHU2NjNFXHU1RjBGXHU2M0QwXHU0RjlCXHU3Njg0IFNlcnZpY2UgVGFnIFx1NTA1QVx1NEUwMFx1NkIyMVx1NTFCMlx1N0E4MVx1NjgyMVx1OUE4Q1x1MzAwMlxuICAvLyBcdThGRDlcdTUzRUZcdTRFRTVcdTYzRDBcdTUyNERcdTY2QjRcdTk3MzJcdTIwMUNcdTU0MENcdTRFMDAgU2VydmljZVRhZyBcdTc1MzFcdTU5MUFcdTRFMkFcdTZBMjFcdTU3NTdcdTVCOUVcdTczQjBcdTIwMURcdTc2ODRcdTk1RUVcdTk4OThcdUZGMENcdTkwN0ZcdTUxNEQgRW52IFx1ODhBQlx1OTc1OVx1OUVEOFx1ODk4Nlx1NzZENlx1MzAwMlxuICB2YWxpZGF0ZVRhZ3MoY29uZmlnLm1vZHVsZXMpXG5cbiAgLy8gXHU4MkU1IFJ1bnRpbWUgXHU1QzQyXHU2M0QwXHU0RjlCXHU0RTg2XHU3RURGXHU0RTAwXHU3Njg0IFN0YXRlVHJhbnNhY3Rpb24gXHU5MTREXHU3RjZFXHVGRjBDXHU1MjE5XHU1NzI4IEFwcCBcdTdFQTcgRW52IFx1NEUwQVx1OEZGRFx1NTJBMFx1NUJGOVx1NUU5NCBTZXJ2aWNlXHUzMDAyXG4gIGNvbnN0IHN0YXRlVHhuTGF5ZXI6IExheWVyLkxheWVyPFIsIG5ldmVyLCBuZXZlcj4gPVxuICAgIGNvbmZpZy5zdGF0ZVRyYW5zYWN0aW9uXG4gICAgICA/IChMYXllci5zdWNjZWVkKFN0YXRlVHJhbnNhY3Rpb25Db25maWdUYWcsIGNvbmZpZy5zdGF0ZVRyYW5zYWN0aW9uKSBhcyBMYXllci5MYXllcjxSLCBuZXZlciwgbmV2ZXI+KVxuICAgICAgOiAoTGF5ZXIuZW1wdHkgYXMgTGF5ZXIuTGF5ZXI8UiwgbmV2ZXIsIG5ldmVyPilcblxuICAvLyBcdTgyRTUgUnVudGltZSBcdTVDNDJcdTYzRDBcdTRGOUJcdTRFODZcdTdFREZcdTRFMDBcdTc2ODQgQ29uY3VycmVuY3lQb2xpY3lcdUZGMENcdTUyMTlcdTU3MjggQXBwIFx1N0VBNyBFbnYgXHU0RTBBXHU4RkZEXHU1MkEwXHU1QkY5XHU1RTk0IFNlcnZpY2VcdTMwMDJcbiAgY29uc3QgY29uY3VycmVuY3lQb2xpY3lMYXllcjogTGF5ZXIuTGF5ZXI8UiwgbmV2ZXIsIG5ldmVyPiA9XG4gICAgY29uZmlnLmNvbmN1cnJlbmN5UG9saWN5XG4gICAgICA/IChMYXllci5zdWNjZWVkKENvbmN1cnJlbmN5UG9saWN5VGFnLCBjb25maWcuY29uY3VycmVuY3lQb2xpY3kpIGFzIExheWVyLkxheWVyPFIsIG5ldmVyLCBuZXZlcj4pXG4gICAgICA6IChMYXllci5lbXB0eSBhcyBMYXllci5MYXllcjxSLCBuZXZlciwgbmV2ZXI+KVxuXG4gIGNvbnN0IGJhc2VMYXllciA9IExheWVyLm1lcmdlQWxsKFxuICAgIGNvbmZpZy5sYXllcixcbiAgICBzdGF0ZVR4bkxheWVyLFxuICAgIGNvbmN1cnJlbmN5UG9saWN5TGF5ZXIsXG4gICAgTGF5ZXIuZWZmZWN0KFxuICAgICAgUm9vdENvbnRleHRUYWcsXG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IHJlYWR5ID0geWllbGQqIERlZmVycmVkLm1ha2U8Q29udGV4dC5Db250ZXh0PGFueT4+KClcbiAgICAgICAgcmV0dXJuIHsgY29udGV4dDogdW5kZWZpbmVkLCByZWFkeSB9IHNhdGlzZmllcyBSb290Q29udGV4dFxuICAgICAgfSksXG4gICAgKSxcbiAgKSBhcyBMYXllci5MYXllcjxSLCBuZXZlciwgbmV2ZXI+XG5cbiAgY29uc3QgbW9kdWxlTGF5ZXJzID0gY29uZmlnLm1vZHVsZXMubWFwKChlbnRyeSkgPT5cbiAgICAvLyBcdTc4NkVcdTRGRERcdTZCQ0ZcdTRFMkFcdTZBMjFcdTU3NTdcdTVDNDJcdTkwRkRcdTgwRkRcdTc3MEJcdTUyMzAgQXBwIFx1N0VBNyBFbnZcdUZGMDhiYXNlTGF5ZXJcdUZGMDlcdUZGMENcdTkwN0ZcdTUxNERcdTU3MjhcdTUyMURcdTU5Q0JcdTUzMTZcdTk2MzZcdTZCQjVcdTYyN0VcdTRFMERcdTUyMzAgUm9vdCBFbnZcdTMwMDJcbiAgICBMYXllci5wcm92aWRlKGVudHJ5LmxheWVyLCBiYXNlTGF5ZXIpLFxuICApXG4gIGNvbnN0IGVudkxheWVyID0gbW9kdWxlTGF5ZXJzLmxlbmd0aCA+IDAgPyBMYXllci5tZXJnZUFsbChiYXNlTGF5ZXIsIC4uLm1vZHVsZUxheWVycykgOiBiYXNlTGF5ZXJcblxuICBjb25zdCBmaW5hbExheWVyID0gTGF5ZXIudW53cmFwU2NvcGVkKFxuICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IHNjb3BlID0geWllbGQqIEVmZmVjdC5zY29wZVxuXG4gICAgICAvLyBidWlsZFdpdGhTY29wZSBcdTRGMUFcdTU3MjhcdTVGNTNcdTUyNEQgc2NvcGUgXHU1MTg1XHU2Nzg0XHU1RUZBIGVudkxheWVyXHVGRjBDXHU1RTc2XHU1NzI4IEZpYmVyUmVmcyBcdTRFMEFcdTYyNTNcdTg4NjVcdTRFMDFcdUZGMDhcdTRGOEJcdTU5ODIgRGVidWcgc2lua3NcdUZGMDlcdTMwMDJcbiAgICAgIC8vIFx1OEZEOVx1OTFDQ1x1NzUyOCBkaWZmRmliZXJSZWZzIFx1NTMwNVx1ODhGOSBidWlsZFdpdGhTY29wZVx1RkYwQ1x1NjM1NVx1ODNCNyBGaWJlclJlZnMgXHU3Njg0XHU1M0Q4XHU2NkY0IHBhdGNoXHVGRjBDXG4gICAgICAvLyBcdTUxOERcdTYyOEEgcGF0Y2ggXHU0RjVDXHU0RTNBXHU0RTAwXHU1QzQyIExheWVyIFx1NTZERVx1NzA0Q1x1NTIzMFx1NjcwMFx1N0VDOCBSdW50aW1lXHVGRjBDXHU5MDdGXHU1MTREIEZpYmVyUmVmIFx1NEZFRVx1NjUzOVx1NTcyOFx1N0VDNFx1ODhDNVx1OTYzNlx1NkJCNVx1ODhBQlx1MjAxQ1x1NkQxN1x1NjM4OVx1MjAxRFx1MzAwMlxuICAgICAgY29uc3QgW3BhdGNoLCBlbnZdID0geWllbGQqIEVmZmVjdC5kaWZmRmliZXJSZWZzKExheWVyLmJ1aWxkV2l0aFNjb3BlKGVudkxheWVyLCBzY29wZSkpXG5cbiAgICAgIC8vIEVudkxheWVyIGJ1aWxkIFx1NUI4Q1x1NjIxMFx1NTQwRVx1RkYwQ1x1ODg2NVx1OUY1MCBSb290Q29udGV4dFx1RkYwOFx1NEY1Q1x1NEUzQSByb290IHByb3ZpZGVyIFx1NzY4NFx1NTM1NVx1NEUwMFx1NEU4Qlx1NUI5RVx1NkU5MFx1RkYwOVx1MzAwMlxuICAgICAgLy8gXHU2Q0U4XHU2MTBGXHVGRjFBTW9kdWxlIGxvZ2ljcyBcdTUzRUZcdTgwRkRcdTVERjIgZm9yayBcdTVFNzZcdTU3MjggcnVuIFx1OTYzNlx1NkJCNVx1N0I0OVx1NUY4NSBSb290Q29udGV4dFx1RkYxQlx1OEZEOVx1OTFDQ1x1NUI4Q1x1NjIxMFx1NTQwRVx1NTM3M1x1NTNFRlx1ODlFM1x1OTUwMVx1MzAwMlxuICAgICAgLy8gUm9vdENvbnRleHRUYWcgXHU1QzVFXHU0RThFIEFwcFJ1bnRpbWUgXHU1MTg1XHU5MEU4XHU2Q0U4XHU1MTY1XHU3Njg0XHU2NzBEXHU1MkExXHVGRjA4XHU0RTBEXHU1RTk0XHU2Q0M0XHU2RjBGXHU1MjMwXHU1OTE2XHU5MEU4IFIgXHU3QzdCXHU1NzhCXHVGRjA5XHVGRjBDXG4gICAgICAvLyBcdThGRDlcdTkxQ0NcdTc1MjhcdTY3MDBcdTVDMEZcdTc2ODRcdTdDN0JcdTU3OEJcdTY1MzZcdTdBODRcdTkwN0ZcdTUxNEQgQ29udGV4dC5nZXQgXHU3Njg0XHU2Q0RCXHU1NzhCXHU3RUE2XHU2NzVGXHU4QkVGXHU1MjI0XHUzMDAyXG4gICAgICBjb25zdCByb290Q29udGV4dCA9IENvbnRleHQuZ2V0KFxuICAgICAgICBlbnYgYXMgQ29udGV4dC5Db250ZXh0PGFueT4sXG4gICAgICAgIFJvb3RDb250ZXh0VGFnIGFzIGFueSxcbiAgICAgICkgYXMgUm9vdENvbnRleHRcblxuICAgICAgcm9vdENvbnRleHQuY29udGV4dCA9IGVudiBhcyBDb250ZXh0LkNvbnRleHQ8YW55PlxuICAgICAgeWllbGQqIERlZmVycmVkLnN1Y2NlZWQocm9vdENvbnRleHQucmVhZHksIGVudiBhcyBDb250ZXh0LkNvbnRleHQ8YW55PilcblxuICAgICAgLy8gXHU1NzI4IEVudiBcdTVCOENcdTUxNjhcdTVDMzFcdTdFRUFcdTU0MEVcdUZGMENcdTUxOEQgZm9yayBBcHAgXHU3RUE3XHU5NTdGXHU2NzFGXHU4RkRCXHU3QTBCXHVGRjA4TGluayAvIHdhdGNoZXIgLyBob3N0IGJyaWRnZSBcdTdCNDlcdUZGMDlcdTMwMDJcbiAgICAgIHlpZWxkKiBFZmZlY3QuZm9yRWFjaChcbiAgICAgICAgY29uZmlnLnByb2Nlc3NlcyxcbiAgICAgICAgKHByb2Nlc3MpID0+XG4gICAgICAgICAgRWZmZWN0LmZvcmtTY29wZWQoXG4gICAgICAgICAgICBFZmZlY3QucHJvdmlkZShcbiAgICAgICAgICAgICAgY29uZmlnLm9uRXJyb3IgPyBFZmZlY3QuY2F0Y2hBbGxDYXVzZShwcm9jZXNzLCBjb25maWcub25FcnJvcikgOiBwcm9jZXNzLFxuICAgICAgICAgICAgICBlbnYsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIHsgZGlzY2FyZDogdHJ1ZSB9LFxuICAgICAgKVxuXG4gICAgICBjb25zdCBmaWJlclJlZnNMYXllciA9IExheWVyLnNjb3BlZERpc2NhcmQoRWZmZWN0LnBhdGNoRmliZXJSZWZzKHBhdGNoKSlcblxuICAgICAgcmV0dXJuIExheWVyLm1lcmdlQWxsKFxuICAgICAgICBMYXllci5zdWNjZWVkQ29udGV4dChlbnYpLFxuICAgICAgICBmaWJlclJlZnNMYXllcixcbiAgICAgIClcbiAgICB9KSxcbiAgKSBhcyBMYXllci5MYXllcjxSLCBuZXZlciwgbmV2ZXI+XG5cbiAgcmV0dXJuIHtcbiAgICBkZWZpbml0aW9uOiBjb25maWcsXG4gICAgbGF5ZXI6IGZpbmFsTGF5ZXIsXG4gICAgbWFrZVJ1bnRpbWU6ICgpID0+IE1hbmFnZWRSdW50aW1lLm1ha2UoZmluYWxMYXllciksXG4gIH1cbn1cblxuLyoqXG4gKiBcdThCRURcdTZDRDVcdTdDRDZcdUZGMUFcdTVDMDYgTW9kdWxlIFx1NEUwRSBSdW50aW1lIFx1NUI5RVx1NEY4Qlx1NjIxNiBMYXllciBcdTkxNERcdTVCRjlcdUZGMENcdTc1MjhcdTRFOEUgQXBwUnVudGltZSBcdTc2ODQgbW9kdWxlcyBcdTkxNERcdTdGNkVcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IHByb3ZpZGUgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZSwgUiwgRT4oXG4gIG1vZHVsZTogTW9kdWxlVGFnPGFueSwgU2g+LFxuICByZXNvdXJjZTogTGF5ZXIuTGF5ZXI8TW9kdWxlUnVudGltZTxTdGF0ZU9mPFNoPiwgQWN0aW9uT2Y8U2g+PiwgRSwgUj4gfCBNb2R1bGVSdW50aW1lPFN0YXRlT2Y8U2g+LCBBY3Rpb25PZjxTaD4+LFxuKTogQXBwTW9kdWxlRW50cnkgPT4ge1xuICBjb25zdCBsYXllciA9IGlzTGF5ZXIocmVzb3VyY2UpXG4gICAgPyByZXNvdXJjZVxuICAgIDogTGF5ZXIuc3VjY2VlZChtb2R1bGUsIHJlc291cmNlIGFzIE1vZHVsZVJ1bnRpbWU8U3RhdGVPZjxTaD4sIEFjdGlvbk9mPFNoPj4pXG5cbiAgcmV0dXJuIHsgbW9kdWxlLCBsYXllciB9XG59XG5cbi8qKlxuICogXHU4QkVEXHU2Q0Q1XHU3Q0Q2XHVGRjFBXHU1NzI4IEFwcCBcdTZBMjFcdTU3NTdcdTY3NjFcdTc2RUVcdTRFMEFcdTk2NDRcdTUyQTBcdTY2M0VcdTVGMEYgU2VydmljZSBUYWcgXHU1MTQzXHU0RkUxXHU2MDZGXHVGRjBDXHU3NTI4XHU0RThFIFRhZyBcdTUxQjJcdTdBODFcdTY4QzBcdTZENEJcdTMwMDJcbiAqXG4gKiAtIHNlcnZpY2VUYWdzIFx1NUU5NFx1NEVDNVx1NTMwNVx1NTQyQlx1MjAxQ1x1NzUzMVx1OEJFNVx1NkEyMVx1NTc1N1x1NUJGOVx1NUU5NCBMYXllciBcdTYzRDBcdTRGOUJcdTVCOUVcdTczQjBcdTIwMURcdTc2ODQgU2VydmljZVx1RkYxQlxuICogLSBcdTkwMUFcdThGQzcgTG9naXgucHJvdmlkZVdpdGhUYWdzIFx1NjZCNFx1OTczMlx1N0VEOVx1NEUxQVx1NTJBMVx1NEVFM1x1NzgwMVx1RkYwQ1x1NTcyOCBBcHAgXHU2Nzg0XHU1RUZBXHU5NjM2XHU2QkI1XHU2M0QwXHU1MjREXHU1M0QxXHU3M0IwIFRhZyBLZXkgXHU1MUIyXHU3QTgxXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBwcm92aWRlV2l0aFRhZ3MgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZSwgUiwgRT4oXG4gIG1vZHVsZTogTW9kdWxlVGFnPGFueSwgU2g+LFxuICByZXNvdXJjZTogTGF5ZXIuTGF5ZXI8TW9kdWxlUnVudGltZTxTdGF0ZU9mPFNoPiwgQWN0aW9uT2Y8U2g+PiwgRSwgUj4gfCBNb2R1bGVSdW50aW1lPFN0YXRlT2Y8U2g+LCBBY3Rpb25PZjxTaD4+LFxuICBzZXJ2aWNlVGFnczogUmVhZG9ubHlBcnJheTxDb250ZXh0LlRhZzxhbnksIGFueT4+LFxuKTogQXBwTW9kdWxlRW50cnkgPT4ge1xuICBjb25zdCBiYXNlID0gcHJvdmlkZShtb2R1bGUsIHJlc291cmNlKVxuICByZXR1cm4ge1xuICAgIC4uLmJhc2UsXG4gICAgc2VydmljZVRhZ3MsXG4gIH1cbn1cblxuY29uc3QgaXNMYXllciA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIExheWVyLkxheWVyPGFueSwgYW55LCBhbnk+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgTGF5ZXIuTGF5ZXJUeXBlSWQgaW4gdmFsdWVcbiIsICJpbXBvcnQgeyBTY2hlbWEgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7IGlzRGV2RW52IH0gZnJvbSBcIi4vZW52LmpzXCJcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZUJvb2xlYW4sXG4gIG5vcm1hbGl6ZVBvc2l0aXZlSW50LFxuICBub3JtYWxpemVQb3NpdGl2ZU51bWJlcixcbn0gZnJvbSBcIi4vbm9ybWFsaXplLmpzXCJcblxuY29uc3QgUG9zaXRpdmVJbnRTY2hlbWEgPSBTY2hlbWEuSW50LnBpcGUoU2NoZW1hLnBvc2l0aXZlKCkpXG5jb25zdCBQb3NpdGl2ZU51bWJlclNjaGVtYSA9IFNjaGVtYS5OdW1iZXIucGlwZShTY2hlbWEucG9zaXRpdmUoKSlcbmNvbnN0IENvbnZlcmdlTW9kZVNjaGVtYSA9IFNjaGVtYS5VbmlvbihcbiAgU2NoZW1hLkxpdGVyYWwoXCJhdXRvXCIpLFxuICBTY2hlbWEuTGl0ZXJhbChcImZ1bGxcIiksXG4gIFNjaGVtYS5MaXRlcmFsKFwiZGlydHlcIiksXG4pXG5jb25zdCBJbnN0cnVtZW50YXRpb25TY2hlbWEgPSBTY2hlbWEuVW5pb24oXG4gIFNjaGVtYS5MaXRlcmFsKFwiZnVsbFwiKSxcbiAgU2NoZW1hLkxpdGVyYWwoXCJsaWdodFwiKSxcbilcbmNvbnN0IENvbmN1cnJlbmN5TGltaXRTY2hlbWEgPSBTY2hlbWEuVW5pb24oXG4gIFNjaGVtYS5MaXRlcmFsKFwidW5ib3VuZGVkXCIpLFxuICBQb3NpdGl2ZUludFNjaGVtYSxcbilcblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IHdhcm5EZXZPbmx5ID0gKGxhYmVsOiBzdHJpbmcsIGlzc3VlczogUmVhZG9ubHlBcnJheTxzdHJpbmc+KTogdm9pZCA9PiB7XG4gIGlmICghaXNEZXZFbnYoKSkgcmV0dXJuXG4gIGlmIChpc3N1ZXMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS53YXJuKFxuICAgIFtcIltMb2dpeF0gSW52YWxpZCBydW50aW1lIGNvbmZpZyBkZXRlY3RlZC5cIiwgYGNvbnRleHQ6ICR7bGFiZWx9YCwgXCJpc3N1ZXM6XCJdXG4gICAgICAuY29uY2F0KGlzc3Vlcy5tYXAoKGkpID0+IGAtICR7aX1gKSlcbiAgICAgIC5qb2luKFwiXFxuXCIpLFxuICApXG59XG5cbmNvbnN0IGNvbGxlY3RVbmtub3duS2V5cyA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgYWxsb3dlZDogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbiAgcHJlZml4OiBzdHJpbmcsXG4pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgIGlmICghYWxsb3dlZC5oYXMoa2V5KSkge1xuICAgICAgaXNzdWVzLnB1c2goYCR7cHJlZml4fSR7a2V5fTogdW5rbm93biBrZXlgKVxuICAgIH1cbiAgfVxuICByZXR1cm4gaXNzdWVzXG59XG5cbmNvbnN0IHZhbGlkYXRlQ29uY3VycmVuY3lQb2xpY3lQYXRjaCA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcHJlZml4OiBzdHJpbmcsXG4pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW11cblxuICBpZiAoXCJjb25jdXJyZW5jeUxpbWl0XCIgaW4gb2JqICYmIG9iai5jb25jdXJyZW5jeUxpbWl0ICE9IG51bGwpIHtcbiAgICBpZiAoIVNjaGVtYS5pcyhDb25jdXJyZW5jeUxpbWl0U2NoZW1hKShvYmouY29uY3VycmVuY3lMaW1pdCkpIHtcbiAgICAgIGlzc3Vlcy5wdXNoKGAke3ByZWZpeH1jb25jdXJyZW5jeUxpbWl0OiBleHBlY3RlZCBwb3NpdGl2ZSBpbnQgfCBcInVuYm91bmRlZFwiYClcbiAgICB9XG4gIH1cblxuICBpZiAoXCJsb3NzbGVzc0JhY2twcmVzc3VyZUNhcGFjaXR5XCIgaW4gb2JqICYmIG9iai5sb3NzbGVzc0JhY2twcmVzc3VyZUNhcGFjaXR5ICE9IG51bGwpIHtcbiAgICBpZiAobm9ybWFsaXplUG9zaXRpdmVJbnQob2JqLmxvc3NsZXNzQmFja3ByZXNzdXJlQ2FwYWNpdHkpID09IG51bGwpIHtcbiAgICAgIGlzc3Vlcy5wdXNoKGAke3ByZWZpeH1sb3NzbGVzc0JhY2twcmVzc3VyZUNhcGFjaXR5OiBleHBlY3RlZCBwb3NpdGl2ZSBpbnRgKVxuICAgIH1cbiAgfVxuXG4gIGlmIChcImFsbG93VW5ib3VuZGVkXCIgaW4gb2JqICYmIG9iai5hbGxvd1VuYm91bmRlZCAhPSBudWxsKSB7XG4gICAgaWYgKG5vcm1hbGl6ZUJvb2xlYW4ob2JqLmFsbG93VW5ib3VuZGVkKSA9PSBudWxsKSB7XG4gICAgICBpc3N1ZXMucHVzaChgJHtwcmVmaXh9YWxsb3dVbmJvdW5kZWQ6IGV4cGVjdGVkIGJvb2xlYW5gKVxuICAgIH1cbiAgfVxuXG4gIGlmIChcInByZXNzdXJlV2FybmluZ1RocmVzaG9sZFwiIGluIG9iaiAmJiBvYmoucHJlc3N1cmVXYXJuaW5nVGhyZXNob2xkICE9IG51bGwpIHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSBvYmoucHJlc3N1cmVXYXJuaW5nVGhyZXNob2xkXG4gICAgaWYgKCFpc1JlY29yZCh0aHJlc2hvbGQpKSB7XG4gICAgICBpc3N1ZXMucHVzaChgJHtwcmVmaXh9cHJlc3N1cmVXYXJuaW5nVGhyZXNob2xkOiBleHBlY3RlZCBvYmplY3RgKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBiYWNrbG9nQ291bnQgPSB0aHJlc2hvbGRbXCJiYWNrbG9nQ291bnRcIl1cbiAgICAgIGlmIChiYWNrbG9nQ291bnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAobm9ybWFsaXplUG9zaXRpdmVJbnQoYmFja2xvZ0NvdW50KSA9PSBudWxsKSB7XG4gICAgICAgICAgaXNzdWVzLnB1c2goYCR7cHJlZml4fXByZXNzdXJlV2FybmluZ1RocmVzaG9sZC5iYWNrbG9nQ291bnQ6IGV4cGVjdGVkIHBvc2l0aXZlIGludGApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2tsb2dEdXJhdGlvbk1zID0gdGhyZXNob2xkW1wiYmFja2xvZ0R1cmF0aW9uTXNcIl1cbiAgICAgIGlmIChiYWNrbG9nRHVyYXRpb25NcyAhPSBudWxsKSB7XG4gICAgICAgIGlmIChub3JtYWxpemVQb3NpdGl2ZU51bWJlcihiYWNrbG9nRHVyYXRpb25NcykgPT0gbnVsbCkge1xuICAgICAgICAgIGlzc3Vlcy5wdXNoKGAke3ByZWZpeH1wcmVzc3VyZVdhcm5pbmdUaHJlc2hvbGQuYmFja2xvZ0R1cmF0aW9uTXM6IGV4cGVjdGVkIHBvc2l0aXZlIG51bWJlcmApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoXCJ3YXJuaW5nQ29vbGRvd25Nc1wiIGluIG9iaiAmJiBvYmoud2FybmluZ0Nvb2xkb3duTXMgIT0gbnVsbCkge1xuICAgIGlmIChub3JtYWxpemVQb3NpdGl2ZU51bWJlcihvYmoud2FybmluZ0Nvb2xkb3duTXMpID09IG51bGwpIHtcbiAgICAgIGlzc3Vlcy5wdXNoKGAke3ByZWZpeH13YXJuaW5nQ29vbGRvd25NczogZXhwZWN0ZWQgcG9zaXRpdmUgbnVtYmVyYClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNzdWVzXG59XG5cbmV4cG9ydCBjb25zdCB3YXJuSW52YWxpZENvbmN1cnJlbmN5UG9saWN5RGV2T25seSA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIGxhYmVsOiBzdHJpbmcsXG4pOiB2b2lkID0+IHtcbiAgaWYgKCFpc0RldkVudigpKSByZXR1cm5cbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVyblxuXG4gIGlmICghaXNSZWNvcmQodmFsdWUpKSB7XG4gICAgd2FybkRldk9ubHkobGFiZWwsIFtcImV4cGVjdGVkIG9iamVjdFwiXSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHBvbGljeSA9IHZhbHVlXG4gIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXVxuXG4gIGlzc3Vlcy5wdXNoKFxuICAgIC4uLmNvbGxlY3RVbmtub3duS2V5cyhcbiAgICAgIHBvbGljeSxcbiAgICAgIG5ldyBTZXQoW1xuICAgICAgICBcImNvbmN1cnJlbmN5TGltaXRcIixcbiAgICAgICAgXCJsb3NzbGVzc0JhY2twcmVzc3VyZUNhcGFjaXR5XCIsXG4gICAgICAgIFwiYWxsb3dVbmJvdW5kZWRcIixcbiAgICAgICAgXCJwcmVzc3VyZVdhcm5pbmdUaHJlc2hvbGRcIixcbiAgICAgICAgXCJ3YXJuaW5nQ29vbGRvd25Nc1wiLFxuICAgICAgICBcIm92ZXJyaWRlc0J5TW9kdWxlSWRcIixcbiAgICAgIF0pLFxuICAgICAgXCJcIixcbiAgICApLFxuICApXG5cbiAgaXNzdWVzLnB1c2goLi4udmFsaWRhdGVDb25jdXJyZW5jeVBvbGljeVBhdGNoKHBvbGljeSwgXCJcIikpXG5cbiAgY29uc3Qgb3ZlcnJpZGVzQnlNb2R1bGVJZCA9IHBvbGljeS5vdmVycmlkZXNCeU1vZHVsZUlkXG4gIGlmIChvdmVycmlkZXNCeU1vZHVsZUlkICE9IG51bGwpIHtcbiAgICBpZiAoIWlzUmVjb3JkKG92ZXJyaWRlc0J5TW9kdWxlSWQpKSB7XG4gICAgICBpc3N1ZXMucHVzaChgb3ZlcnJpZGVzQnlNb2R1bGVJZDogZXhwZWN0ZWQgcmVjb3JkYClcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBbbW9kdWxlSWQsIHBhdGNoXSBvZiBPYmplY3QuZW50cmllcyhvdmVycmlkZXNCeU1vZHVsZUlkKSkge1xuICAgICAgICBjb25zdCBwcmVmaXggPSBgb3ZlcnJpZGVzQnlNb2R1bGVJZC4ke21vZHVsZUlkfS5gXG4gICAgICAgIGlmIChwYXRjaCA9PSBudWxsKSBjb250aW51ZVxuICAgICAgICBpZiAoIWlzUmVjb3JkKHBhdGNoKSkge1xuICAgICAgICAgIGlzc3Vlcy5wdXNoKGAke3ByZWZpeH08dmFsdWU+OiBleHBlY3RlZCBvYmplY3RgKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgaXNzdWVzLnB1c2goXG4gICAgICAgICAgLi4uY29sbGVjdFVua25vd25LZXlzKFxuICAgICAgICAgICAgcGF0Y2gsXG4gICAgICAgICAgICBuZXcgU2V0KFtcbiAgICAgICAgICAgICAgXCJjb25jdXJyZW5jeUxpbWl0XCIsXG4gICAgICAgICAgICAgIFwibG9zc2xlc3NCYWNrcHJlc3N1cmVDYXBhY2l0eVwiLFxuICAgICAgICAgICAgICBcImFsbG93VW5ib3VuZGVkXCIsXG4gICAgICAgICAgICAgIFwicHJlc3N1cmVXYXJuaW5nVGhyZXNob2xkXCIsXG4gICAgICAgICAgICAgIFwid2FybmluZ0Nvb2xkb3duTXNcIixcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgcHJlZml4LFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgICAgaXNzdWVzLnB1c2goLi4udmFsaWRhdGVDb25jdXJyZW5jeVBvbGljeVBhdGNoKHBhdGNoLCBwcmVmaXgpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHdhcm5EZXZPbmx5KGxhYmVsLCBpc3N1ZXMpXG59XG5cbmV4cG9ydCBjb25zdCB3YXJuSW52YWxpZENvbmN1cnJlbmN5UG9saWN5UGF0Y2hEZXZPbmx5ID0gKFxuICB2YWx1ZTogdW5rbm93bixcbiAgbGFiZWw6IHN0cmluZyxcbik6IHZvaWQgPT4ge1xuICBpZiAoIWlzRGV2RW52KCkpIHJldHVyblxuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuXG4gIGlmICghaXNSZWNvcmQodmFsdWUpKSB7XG4gICAgd2FybkRldk9ubHkobGFiZWwsIFtcImV4cGVjdGVkIG9iamVjdFwiXSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXVxuICBpc3N1ZXMucHVzaChcbiAgICAuLi5jb2xsZWN0VW5rbm93bktleXMoXG4gICAgICB2YWx1ZSxcbiAgICAgIG5ldyBTZXQoW1xuICAgICAgICBcImNvbmN1cnJlbmN5TGltaXRcIixcbiAgICAgICAgXCJsb3NzbGVzc0JhY2twcmVzc3VyZUNhcGFjaXR5XCIsXG4gICAgICAgIFwiYWxsb3dVbmJvdW5kZWRcIixcbiAgICAgICAgXCJwcmVzc3VyZVdhcm5pbmdUaHJlc2hvbGRcIixcbiAgICAgICAgXCJ3YXJuaW5nQ29vbGRvd25Nc1wiLFxuICAgICAgXSksXG4gICAgICBcIlwiLFxuICAgICksXG4gIClcbiAgaXNzdWVzLnB1c2goLi4udmFsaWRhdGVDb25jdXJyZW5jeVBvbGljeVBhdGNoKHZhbHVlLCBcIlwiKSlcblxuICB3YXJuRGV2T25seShsYWJlbCwgaXNzdWVzKVxufVxuXG5jb25zdCB2YWxpZGF0ZVN0YXRlVHJhbnNhY3Rpb25UcmFpdE92ZXJyaWRlcyA9IChcbiAgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcHJlZml4OiBzdHJpbmcsXG4pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW11cblxuICBpZiAoXCJ0cmFpdENvbnZlcmdlTW9kZVwiIGluIG9iaiAmJiBvYmoudHJhaXRDb252ZXJnZU1vZGUgIT0gbnVsbCkge1xuICAgIGlmICghU2NoZW1hLmlzKENvbnZlcmdlTW9kZVNjaGVtYSkob2JqLnRyYWl0Q29udmVyZ2VNb2RlKSkge1xuICAgICAgaXNzdWVzLnB1c2goYCR7cHJlZml4fXRyYWl0Q29udmVyZ2VNb2RlOiBleHBlY3RlZCBcImF1dG9cIiB8IFwiZnVsbFwiIHwgXCJkaXJ0eVwiYClcbiAgICB9XG4gIH1cbiAgaWYgKFwidHJhaXRDb252ZXJnZUJ1ZGdldE1zXCIgaW4gb2JqICYmIG9iai50cmFpdENvbnZlcmdlQnVkZ2V0TXMgIT0gbnVsbCkge1xuICAgIGlmIChub3JtYWxpemVQb3NpdGl2ZU51bWJlcihvYmoudHJhaXRDb252ZXJnZUJ1ZGdldE1zKSA9PSBudWxsKSB7XG4gICAgICBpc3N1ZXMucHVzaChgJHtwcmVmaXh9dHJhaXRDb252ZXJnZUJ1ZGdldE1zOiBleHBlY3RlZCBwb3NpdGl2ZSBudW1iZXJgKVxuICAgIH1cbiAgfVxuICBpZiAoXCJ0cmFpdENvbnZlcmdlRGVjaXNpb25CdWRnZXRNc1wiIGluIG9iaiAmJiBvYmoudHJhaXRDb252ZXJnZURlY2lzaW9uQnVkZ2V0TXMgIT0gbnVsbCkge1xuICAgIGlmIChub3JtYWxpemVQb3NpdGl2ZU51bWJlcihvYmoudHJhaXRDb252ZXJnZURlY2lzaW9uQnVkZ2V0TXMpID09IG51bGwpIHtcbiAgICAgIGlzc3Vlcy5wdXNoKGAke3ByZWZpeH10cmFpdENvbnZlcmdlRGVjaXNpb25CdWRnZXRNczogZXhwZWN0ZWQgcG9zaXRpdmUgbnVtYmVyYClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNzdWVzXG59XG5cbmV4cG9ydCBjb25zdCB3YXJuSW52YWxpZFN0YXRlVHJhbnNhY3Rpb25UcmFpdENvbnZlcmdlT3ZlcnJpZGVzRGV2T25seSA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIGxhYmVsOiBzdHJpbmcsXG4pOiB2b2lkID0+IHtcbiAgaWYgKCFpc0RldkVudigpKSByZXR1cm5cbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVyblxuICBpZiAoIWlzUmVjb3JkKHZhbHVlKSkge1xuICAgIHdhcm5EZXZPbmx5KGxhYmVsLCBbXCJleHBlY3RlZCBvYmplY3RcIl0pXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW11cbiAgaXNzdWVzLnB1c2goXG4gICAgLi4uY29sbGVjdFVua25vd25LZXlzKFxuICAgICAgdmFsdWUsXG4gICAgICBuZXcgU2V0KFtcbiAgICAgICAgXCJ0cmFpdENvbnZlcmdlQnVkZ2V0TXNcIixcbiAgICAgICAgXCJ0cmFpdENvbnZlcmdlRGVjaXNpb25CdWRnZXRNc1wiLFxuICAgICAgICBcInRyYWl0Q29udmVyZ2VNb2RlXCIsXG4gICAgICBdKSxcbiAgICAgIFwiXCIsXG4gICAgKSxcbiAgKVxuICBpc3N1ZXMucHVzaCguLi52YWxpZGF0ZVN0YXRlVHJhbnNhY3Rpb25UcmFpdE92ZXJyaWRlcyh2YWx1ZSwgXCJcIikpXG5cbiAgd2FybkRldk9ubHkobGFiZWwsIGlzc3Vlcylcbn1cblxuZXhwb3J0IGNvbnN0IHdhcm5JbnZhbGlkU3RhdGVUcmFuc2FjdGlvblJ1bnRpbWVDb25maWdEZXZPbmx5ID0gKFxuICB2YWx1ZTogdW5rbm93bixcbiAgbGFiZWw6IHN0cmluZyxcbik6IHZvaWQgPT4ge1xuICBpZiAoIWlzRGV2RW52KCkpIHJldHVyblxuICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuXG4gIGlmICghaXNSZWNvcmQodmFsdWUpKSB7XG4gICAgd2FybkRldk9ubHkobGFiZWwsIFtcImV4cGVjdGVkIG9iamVjdFwiXSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXVxuICBpc3N1ZXMucHVzaChcbiAgICAuLi5jb2xsZWN0VW5rbm93bktleXMoXG4gICAgICB2YWx1ZSxcbiAgICAgIG5ldyBTZXQoW1xuICAgICAgICBcImluc3RydW1lbnRhdGlvblwiLFxuICAgICAgICBcInRyYWl0Q29udmVyZ2VCdWRnZXRNc1wiLFxuICAgICAgICBcInRyYWl0Q29udmVyZ2VEZWNpc2lvbkJ1ZGdldE1zXCIsXG4gICAgICAgIFwidHJhaXRDb252ZXJnZU1vZGVcIixcbiAgICAgICAgXCJ0cmFpdENvbnZlcmdlT3ZlcnJpZGVzQnlNb2R1bGVJZFwiLFxuICAgICAgXSksXG4gICAgICBcIlwiLFxuICAgICksXG4gIClcblxuICBpZiAoXCJpbnN0cnVtZW50YXRpb25cIiBpbiB2YWx1ZSAmJiB2YWx1ZS5pbnN0cnVtZW50YXRpb24gIT0gbnVsbCkge1xuICAgIGlmICghU2NoZW1hLmlzKEluc3RydW1lbnRhdGlvblNjaGVtYSkodmFsdWUuaW5zdHJ1bWVudGF0aW9uKSkge1xuICAgICAgaXNzdWVzLnB1c2goYGluc3RydW1lbnRhdGlvbjogZXhwZWN0ZWQgXCJmdWxsXCIgfCBcImxpZ2h0XCJgKVxuICAgIH1cbiAgfVxuXG4gIGlzc3Vlcy5wdXNoKC4uLnZhbGlkYXRlU3RhdGVUcmFuc2FjdGlvblRyYWl0T3ZlcnJpZGVzKHZhbHVlLCBcIlwiKSlcblxuICBjb25zdCBvdmVycmlkZXNCeU1vZHVsZUlkID0gdmFsdWUudHJhaXRDb252ZXJnZU92ZXJyaWRlc0J5TW9kdWxlSWRcbiAgaWYgKG92ZXJyaWRlc0J5TW9kdWxlSWQgIT0gbnVsbCkge1xuICAgIGlmICghaXNSZWNvcmQob3ZlcnJpZGVzQnlNb2R1bGVJZCkpIHtcbiAgICAgIGlzc3Vlcy5wdXNoKGB0cmFpdENvbnZlcmdlT3ZlcnJpZGVzQnlNb2R1bGVJZDogZXhwZWN0ZWQgcmVjb3JkYClcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBbbW9kdWxlSWQsIHBhdGNoXSBvZiBPYmplY3QuZW50cmllcyhvdmVycmlkZXNCeU1vZHVsZUlkKSkge1xuICAgICAgICBjb25zdCBwcmVmaXggPSBgdHJhaXRDb252ZXJnZU92ZXJyaWRlc0J5TW9kdWxlSWQuJHttb2R1bGVJZH0uYFxuICAgICAgICBpZiAocGF0Y2ggPT0gbnVsbCkgY29udGludWVcbiAgICAgICAgaWYgKCFpc1JlY29yZChwYXRjaCkpIHtcbiAgICAgICAgICBpc3N1ZXMucHVzaChgJHtwcmVmaXh9PHZhbHVlPjogZXhwZWN0ZWQgb2JqZWN0YClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGlzc3Vlcy5wdXNoKFxuICAgICAgICAgIC4uLmNvbGxlY3RVbmtub3duS2V5cyhcbiAgICAgICAgICAgIHBhdGNoLFxuICAgICAgICAgICAgbmV3IFNldChbXG4gICAgICAgICAgICAgIFwidHJhaXRDb252ZXJnZU1vZGVcIixcbiAgICAgICAgICAgICAgXCJ0cmFpdENvbnZlcmdlQnVkZ2V0TXNcIixcbiAgICAgICAgICAgICAgXCJ0cmFpdENvbnZlcmdlRGVjaXNpb25CdWRnZXRNc1wiLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICBwcmVmaXgsXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgICBpc3N1ZXMucHVzaCguLi52YWxpZGF0ZVN0YXRlVHJhbnNhY3Rpb25UcmFpdE92ZXJyaWRlcyhwYXRjaCwgcHJlZml4KSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB3YXJuRGV2T25seShsYWJlbCwgaXNzdWVzKVxufVxuXG5leHBvcnQgY29uc3Qgd2FybkludmFsaWRTdGF0ZVRyYW5zYWN0aW9uT3ZlcnJpZGVzRGV2T25seSA9IChcbiAgdmFsdWU6IHVua25vd24sXG4gIGxhYmVsOiBzdHJpbmcsXG4pOiB2b2lkID0+IHtcbiAgaWYgKCFpc0RldkVudigpKSByZXR1cm5cbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVyblxuICBpZiAoIWlzUmVjb3JkKHZhbHVlKSkge1xuICAgIHdhcm5EZXZPbmx5KGxhYmVsLCBbXCJleHBlY3RlZCBvYmplY3RcIl0pXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW11cbiAgaXNzdWVzLnB1c2goXG4gICAgLi4uY29sbGVjdFVua25vd25LZXlzKFxuICAgICAgdmFsdWUsXG4gICAgICBuZXcgU2V0KFtcbiAgICAgICAgXCJ0cmFpdENvbnZlcmdlQnVkZ2V0TXNcIixcbiAgICAgICAgXCJ0cmFpdENvbnZlcmdlRGVjaXNpb25CdWRnZXRNc1wiLFxuICAgICAgICBcInRyYWl0Q29udmVyZ2VNb2RlXCIsXG4gICAgICAgIFwidHJhaXRDb252ZXJnZU92ZXJyaWRlc0J5TW9kdWxlSWRcIixcbiAgICAgIF0pLFxuICAgICAgXCJcIixcbiAgICApLFxuICApXG5cbiAgaXNzdWVzLnB1c2goLi4udmFsaWRhdGVTdGF0ZVRyYW5zYWN0aW9uVHJhaXRPdmVycmlkZXModmFsdWUsIFwiXCIpKVxuXG4gIGNvbnN0IG92ZXJyaWRlc0J5TW9kdWxlSWQgPSB2YWx1ZS50cmFpdENvbnZlcmdlT3ZlcnJpZGVzQnlNb2R1bGVJZFxuICBpZiAob3ZlcnJpZGVzQnlNb2R1bGVJZCAhPSBudWxsKSB7XG4gICAgaWYgKCFpc1JlY29yZChvdmVycmlkZXNCeU1vZHVsZUlkKSkge1xuICAgICAgaXNzdWVzLnB1c2goYHRyYWl0Q29udmVyZ2VPdmVycmlkZXNCeU1vZHVsZUlkOiBleHBlY3RlZCByZWNvcmRgKVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IFttb2R1bGVJZCwgcGF0Y2hdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlc0J5TW9kdWxlSWQpKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGB0cmFpdENvbnZlcmdlT3ZlcnJpZGVzQnlNb2R1bGVJZC4ke21vZHVsZUlkfS5gXG4gICAgICAgIGlmIChwYXRjaCA9PSBudWxsKSBjb250aW51ZVxuICAgICAgICBpZiAoIWlzUmVjb3JkKHBhdGNoKSkge1xuICAgICAgICAgIGlzc3Vlcy5wdXNoKGAke3ByZWZpeH08dmFsdWU+OiBleHBlY3RlZCBvYmplY3RgKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgaXNzdWVzLnB1c2goXG4gICAgICAgICAgLi4uY29sbGVjdFVua25vd25LZXlzKFxuICAgICAgICAgICAgcGF0Y2gsXG4gICAgICAgICAgICBuZXcgU2V0KFtcbiAgICAgICAgICAgICAgXCJ0cmFpdENvbnZlcmdlTW9kZVwiLFxuICAgICAgICAgICAgICBcInRyYWl0Q29udmVyZ2VCdWRnZXRNc1wiLFxuICAgICAgICAgICAgICBcInRyYWl0Q29udmVyZ2VEZWNpc2lvbkJ1ZGdldE1zXCIsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICAgIGlzc3Vlcy5wdXNoKC4uLnZhbGlkYXRlU3RhdGVUcmFuc2FjdGlvblRyYWl0T3ZlcnJpZGVzKHBhdGNoLCBwcmVmaXgpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHdhcm5EZXZPbmx5KGxhYmVsLCBpc3N1ZXMpXG59XG4iLCAiaW1wb3J0IHsgQ2F1c2UsIEVmZmVjdCwgRmliZXJSZWYsIE9wdGlvbiwgU2NvcGUgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB0eXBlIHsgTWFuYWdlZFJ1bnRpbWUgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tIFwiLi4vLi4vbW9kdWxlLmpzXCJcbmltcG9ydCB7IG1ha2UgYXMgbWFrZUJvdW5kQXBpIH0gZnJvbSBcIi4uL0JvdW5kQXBpUnVudGltZS5qc1wiXG5pbXBvcnQgKiBhcyBUYXNrUnVubmVyIGZyb20gXCIuLi9jb3JlL1Rhc2tSdW5uZXIuanNcIlxuaW1wb3J0IHsgY2xvc2VQcm9ncmFtU2NvcGUgfSBmcm9tIFwiLi9Qcm9ncmFtUnVubmVyLmNsb3NlU2NvcGUuanNcIlxuaW1wb3J0IHtcbiAgQm9vdEVycm9yLFxuICBNYWluRXJyb3IsXG4gIHR5cGUgUHJvZ3JhbUlkZW50aXR5LFxufSBmcm9tIFwiLi9Qcm9ncmFtUnVubmVyLmVycm9ycy5qc1wiXG5pbXBvcnQge1xuICByZXBvcnRFcnJvcklmRW5hYmxlZCxcbiAgc2V0RXhpdENvZGVJZkVuYWJsZWQsXG4gIHNldEZhaWx1cmVFeGl0Q29kZUlmRW5hYmxlZCxcbn0gZnJvbSBcIi4vUHJvZ3JhbVJ1bm5lci5leGl0Q29kZS5qc1wiXG5pbXBvcnQgeyBpbnN0YWxsR3JhY2VmdWxTaHV0ZG93bkhhbmRsZXJzIH0gZnJvbSBcIi4vUHJvZ3JhbVJ1bm5lci5zaWduYWxzLmpzXCJcbmltcG9ydCB0eXBlIHsgUHJvZ3JhbVJ1bkNvbnRleHQgfSBmcm9tIFwiLi9Qcm9ncmFtUnVubmVyLmNvbnRleHQuanNcIlxuaW1wb3J0IHsgcmVzb2x2ZVByb2dyYW1SdW5uZXJPcHRpb25zIH0gZnJvbSBcIi4vUHJvZ3JhbVJ1bm5lci5vcHRpb25zLmpzXCJcblxuZXhwb3J0IHR5cGUgUnVudGltZUZhY3RvcnkgPSAoXG4gIHJvb3RJbXBsOiBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4sXG4gIG9wdGlvbnM/OiB1bmtub3duLFxuKSA9PiBNYW5hZ2VkUnVudGltZS5NYW5hZ2VkUnVudGltZTxhbnksIG5ldmVyPlxuXG5leHBvcnQgY29uc3Qgb3BlblByb2dyYW0gPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZT4oXG4gIG1ha2VSdW50aW1lOiBSdW50aW1lRmFjdG9yeSxcbiAgcm9vdEltcGw6IE1vZHVsZUltcGw8YW55LCBTaCwgYW55PixcbiAgb3B0aW9ucz86IHVua25vd24sXG4pOiBFZmZlY3QuRWZmZWN0PFByb2dyYW1SdW5Db250ZXh0PFNoPiwgdW5rbm93biwgU2NvcGUuU2NvcGU+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBpblR4biA9IHlpZWxkKiBGaWJlclJlZi5nZXQoVGFza1J1bm5lci5pblN5bmNUcmFuc2FjdGlvbkZpYmVyKVxuICAgIGlmIChpblR4bikge1xuICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZGllTWVzc2FnZShcbiAgICAgICAgXCJbTG9naXhdIFJ1bnRpbWUub3BlblByb2dyYW0vcnVuUHJvZ3JhbSBpcyBub3QgYWxsb3dlZCBpbnNpZGUgYSBzeW5jaHJvbm91cyBTdGF0ZVRyYW5zYWN0aW9uIGJvZHlcIixcbiAgICAgIClcbiAgICB9XG5cbiAgICBjb25zdCBydW5uZXJPcHRpb25zID0gcmVzb2x2ZVByb2dyYW1SdW5uZXJPcHRpb25zKG9wdGlvbnMpXG4gICAgY29uc3QgaWRlbnRpdHk6IFByb2dyYW1JZGVudGl0eSA9IHtcbiAgICAgIG1vZHVsZUlkOiBTdHJpbmcocm9vdEltcGwubW9kdWxlLmlkKSxcbiAgICAgIGluc3RhbmNlSWQ6IFwidW5rbm93blwiLFxuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlID0geWllbGQqIFNjb3BlLm1ha2UoKVxuICAgIGNvbnN0IHJ1bnRpbWUgPSBtYWtlUnVudGltZShyb290SW1wbCBhcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4sIG9wdGlvbnMpXG5cbiAgICAvLyBcdThGRDBcdTg4NENcdThENDRcdTZFOTBcdTkxQ0FcdTY1M0VcdUZGMUFcdTYyOEEgcnVudGltZS5kaXNwb3NlIFx1N0VEMVx1NUI5QVx1NTIzMCBjdHguc2NvcGUgXHU0RTBBXG4gICAgeWllbGQqIFNjb3BlLmFkZEZpbmFsaXplcihcbiAgICAgIHNjb3BlLFxuICAgICAgRWZmZWN0LnByb21pc2UoKCkgPT4gcnVudGltZS5kaXNwb3NlKCkpLnBpcGUoRWZmZWN0LmFzVm9pZCksXG4gICAgKVxuXG4gICAgLy8gXHU1QzA2IGN0eC5zY29wZSBcdTc2ODRcdTkxQ0FcdTY1M0VcdTdFRDFcdTVCOUFcdTUyMzBcdTU5MTZcdTVDNDIgc2NvcGVcdUZGMDhvcGVuUHJvZ3JhbSBcdTY2MkYgc2NvcGUtYm91bmRcdUZGMDlcbiAgICB5aWVsZCogRWZmZWN0LmFkZEZpbmFsaXplcigoKSA9PlxuICAgICAgY2xvc2VQcm9ncmFtU2NvcGUoe1xuICAgICAgICBzY29wZSxcbiAgICAgICAgdGltZW91dE1zOiBydW5uZXJPcHRpb25zLmNsb3NlU2NvcGVUaW1lb3V0LFxuICAgICAgICBpZGVudGl0eSxcbiAgICAgICAgb25FcnJvcjogKG9wdGlvbnMgYXMgYW55KT8ub25FcnJvcixcbiAgICAgIH0pLFxuICAgIClcblxuICAgIC8vIE5vZGUtb25seVx1RkYxQVx1NEZFMVx1NTNGN1x1ODlFNlx1NTNEMSBncmFjZWZ1bCBzaHV0ZG93blx1RkYwOFx1NTE3M1x1OTVFRCBjdHguc2NvcGVcdUZGMDlcbiAgICB5aWVsZCogaW5zdGFsbEdyYWNlZnVsU2h1dGRvd25IYW5kbGVycyh7XG4gICAgICBzY29wZSxcbiAgICAgIGVuYWJsZWQ6IHJ1bm5lck9wdGlvbnMuaGFuZGxlU2lnbmFscyxcbiAgICB9KVxuXG4gICAgLy8gYm9vdFx1RkYxQVx1ODlFNlx1NzhCMCBwcm9ncmFtIG1vZHVsZSB0YWdcdUZGMENcdTc4NkVcdTRGRERcdTVCOUVcdTRGOEJcdTUzMTZcdTRFMEUgbG9naWNzL3Byb2Nlc3NlcyBcdTU0MkZcdTUyQThcbiAgICBjb25zdCBtb2R1bGVSdW50aW1lID0geWllbGQqIEVmZmVjdC50cnlQcm9taXNlKHtcbiAgICAgIHRyeTogKCkgPT4gcnVudGltZS5ydW5Qcm9taXNlKHJvb3RJbXBsLm1vZHVsZSBhcyBhbnkpLFxuICAgICAgY2F0Y2g6IChlcnJvcikgPT4gbmV3IEJvb3RFcnJvcihpZGVudGl0eSwgZXJyb3IpLFxuICAgIH0pXG5cbiAgICBpZGVudGl0eS5pbnN0YW5jZUlkID0gU3RyaW5nKChtb2R1bGVSdW50aW1lIGFzIGFueSkuaW5zdGFuY2VJZCA/PyBcInVua25vd25cIilcblxuICAgIGNvbnN0ICQgPSBtYWtlQm91bmRBcGkocm9vdEltcGwubW9kdWxlLnNoYXBlIGFzIGFueSwgbW9kdWxlUnVudGltZSBhcyBhbnkpIGFzIGFueVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNjb3BlLFxuICAgICAgcnVudGltZSxcbiAgICAgIG1vZHVsZTogbW9kdWxlUnVudGltZSBhcyBhbnksXG4gICAgICAkLFxuICAgIH0gc2F0aXNmaWVzIFByb2dyYW1SdW5Db250ZXh0PFNoPlxuICB9KVxuXG5leHBvcnQgY29uc3QgcnVuUHJvZ3JhbSA9IGFzeW5jIDxcbiAgU2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZSxcbiAgQXJncyxcbiAgQSxcbiAgRSxcbiAgUixcbj4oXG4gIG1ha2VSdW50aW1lOiBSdW50aW1lRmFjdG9yeSxcbiAgcm9vdEltcGw6IE1vZHVsZUltcGw8YW55LCBTaCwgYW55PixcbiAgbWFpbjogKGN0eDogUHJvZ3JhbVJ1bkNvbnRleHQ8U2g+LCBhcmdzOiBBcmdzKSA9PiBFZmZlY3QuRWZmZWN0PEEsIEUsIFI+LFxuICBvcHRpb25zPzogdW5rbm93bixcbik6IFByb21pc2U8QT4gPT4ge1xuICBjb25zdCBydW5uZXJPcHRpb25zID0gcmVzb2x2ZVByb2dyYW1SdW5uZXJPcHRpb25zPEFyZ3M+KG9wdGlvbnMpXG4gIGNvbnN0IGlkZW50aXR5OiBQcm9ncmFtSWRlbnRpdHkgPSB7XG4gICAgbW9kdWxlSWQ6IFN0cmluZyhyb290SW1wbC5tb2R1bGUuaWQpLFxuICAgIGluc3RhbmNlSWQ6IFwidW5rbm93blwiLFxuICB9XG5cbiAgY29uc3Qgc2NvcGUgPSBFZmZlY3QucnVuU3luYyhTY29wZS5tYWtlKCkpXG4gIGNvbnN0IHJ1bnRpbWUgPSBtYWtlUnVudGltZShyb290SW1wbCBhcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4sIG9wdGlvbnMpXG5cbiAgbGV0IGN0eDpcbiAgICB8IChQcm9ncmFtUnVuQ29udGV4dDxTaD4gJiB7XG4gICAgICAgIHJlYWRvbmx5IG1vZHVsZTogeyByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmcgfVxuICAgICAgfSlcbiAgICB8IHVuZGVmaW5lZFxuICBsZXQgbWFpbkVycm9yOiB1bmtub3duIHwgdW5kZWZpbmVkXG4gIGxldCBjbG9zZUVycm9yOiB1bmtub3duIHwgdW5kZWZpbmVkXG4gIGxldCByZXN1bHQ6XG4gICAgfCB7IHJlYWRvbmx5IF90YWc6IFwic3VjY2Vzc1wiOyByZWFkb25seSB2YWx1ZTogQSB9XG4gICAgfCB7IHJlYWRvbmx5IF90YWc6IFwiZmFpbHVyZVwiOyByZWFkb25seSBlcnJvcjogdW5rbm93biB9XG4gICAgfCB1bmRlZmluZWRcblxuICB0cnkge1xuICAgIC8vIFx1OEZEMFx1ODg0Q1x1OEQ0NFx1NkU5MFx1OTFDQVx1NjUzRVx1RkYxQVx1NjI4QSBydW50aW1lLmRpc3Bvc2UgXHU3RUQxXHU1QjlBXHU1MjMwIGN0eC5zY29wZSBcdTRFMEFcbiAgICBFZmZlY3QucnVuU3luYyhcbiAgICAgIFNjb3BlLmFkZEZpbmFsaXplcihcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIEVmZmVjdC5wcm9taXNlKCgpID0+IHJ1bnRpbWUuZGlzcG9zZSgpKS5waXBlKEVmZmVjdC5hc1ZvaWQpLFxuICAgICAgKSxcbiAgICApXG5cbiAgICAvLyBOb2RlLW9ubHlcdUZGMUFcdTRGRTFcdTUzRjdcdTg5RTZcdTUzRDEgZ3JhY2VmdWwgc2h1dGRvd25cdUZGMDhcdTUxNzNcdTk1RUQgY3R4LnNjb3BlXHVGRjA5XG4gICAgaWYgKHJ1bm5lck9wdGlvbnMuaGFuZGxlU2lnbmFscykge1xuICAgICAgRWZmZWN0LnJ1blN5bmMoXG4gICAgICAgIGluc3RhbGxHcmFjZWZ1bFNodXRkb3duSGFuZGxlcnMoe1xuICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgIH1cblxuICAgIC8vIGJvb3RcdUZGMUFcdTg5RTZcdTc4QjAgcHJvZ3JhbSBtb2R1bGUgdGFnXHVGRjBDXHU3ODZFXHU0RkREXHU1QjlFXHU0RjhCXHU1MzE2XHU0RTBFIGxvZ2ljcy9wcm9jZXNzZXMgXHU1NDJGXHU1MkE4XG4gICAgbGV0IG1vZHVsZVJ1bnRpbWU6IGFueVxuICAgIHRyeSB7XG4gICAgICBtb2R1bGVSdW50aW1lID0gYXdhaXQgcnVudGltZS5ydW5Qcm9taXNlKHJvb3RJbXBsLm1vZHVsZSBhcyBhbnkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNldEZhaWx1cmVFeGl0Q29kZUlmRW5hYmxlZChydW5uZXJPcHRpb25zLmV4aXRDb2RlKVxuICAgICAgcmVwb3J0RXJyb3JJZkVuYWJsZWQoXG4gICAgICAgIHJ1bm5lck9wdGlvbnMuZXhpdENvZGUgJiYgcnVubmVyT3B0aW9ucy5yZXBvcnRFcnJvcixcbiAgICAgICAgZXJyb3IsXG4gICAgICApXG4gICAgICByZXN1bHQgPSB7XG4gICAgICAgIF90YWc6IFwiZmFpbHVyZVwiLFxuICAgICAgICBlcnJvcjogbmV3IEJvb3RFcnJvcihpZGVudGl0eSwgZXJyb3IpLFxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXN1bHQ/Ll90YWcgIT09IFwiZmFpbHVyZVwiKSB7XG4gICAgICBpZGVudGl0eS5pbnN0YW5jZUlkID0gU3RyaW5nKG1vZHVsZVJ1bnRpbWUuaW5zdGFuY2VJZCA/PyBcInVua25vd25cIilcblxuICAgICAgY3R4ID0ge1xuICAgICAgICBzY29wZSxcbiAgICAgICAgcnVudGltZSxcbiAgICAgICAgbW9kdWxlOiBtb2R1bGVSdW50aW1lLFxuICAgICAgICAkOiBtYWtlQm91bmRBcGkocm9vdEltcGwubW9kdWxlLnNoYXBlIGFzIGFueSwgbW9kdWxlUnVudGltZSBhcyBhbnkpIGFzIGFueSxcbiAgICAgIH0gc2F0aXNmaWVzIFByb2dyYW1SdW5Db250ZXh0PFNoPiBhcyBhbnlcbiAgICB9XG5cbiAgICBpZiAoY3R4KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChhd2FpdCBjdHgucnVudGltZS5ydW5Qcm9taXNlKFxuICAgICAgICAgIG1haW4oY3R4LCBydW5uZXJPcHRpb25zLmFyZ3MgYXMgQXJncykgYXMgYW55LFxuICAgICAgICApKSBhcyBBXG4gICAgICAgIHNldEV4aXRDb2RlSWZFbmFibGVkKHJ1bm5lck9wdGlvbnMuZXhpdENvZGUsIHZhbHVlKVxuICAgICAgICByZXN1bHQgPSB7IF90YWc6IFwic3VjY2Vzc1wiLCB2YWx1ZSB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBtYWluRXJyb3IgPSBlcnJvclxuICAgICAgICBzZXRGYWlsdXJlRXhpdENvZGVJZkVuYWJsZWQocnVubmVyT3B0aW9ucy5leGl0Q29kZSlcbiAgICAgICAgcmVwb3J0RXJyb3JJZkVuYWJsZWQocnVubmVyT3B0aW9ucy5leGl0Q29kZSAmJiBydW5uZXJPcHRpb25zLnJlcG9ydEVycm9yLCBlcnJvcilcbiAgICAgICAgcmVzdWx0ID0geyBfdGFnOiBcImZhaWx1cmVcIiwgZXJyb3I6IG5ldyBNYWluRXJyb3IoaWRlbnRpdHksIGVycm9yKSB9XG4gICAgICB9XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIGNvbnN0IGV4aXQgPSBhd2FpdCBFZmZlY3QucnVuUHJvbWlzZUV4aXQoXG4gICAgICBjbG9zZVByb2dyYW1TY29wZSh7XG4gICAgICAgIHNjb3BlLFxuICAgICAgICB0aW1lb3V0TXM6IHJ1bm5lck9wdGlvbnMuY2xvc2VTY29wZVRpbWVvdXQsXG4gICAgICAgIGlkZW50aXR5LFxuICAgICAgICBvbkVycm9yOiAob3B0aW9ucyBhcyBhbnkpPy5vbkVycm9yLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgaWYgKGV4aXQuX3RhZyA9PT0gXCJGYWlsdXJlXCIpIHtcbiAgICAgIGNvbnN0IGZhaWx1cmVPcHQgPSBDYXVzZS5mYWlsdXJlT3B0aW9uKGV4aXQuY2F1c2UpXG4gICAgICBpZiAoT3B0aW9uLmlzU29tZShmYWlsdXJlT3B0KSkge1xuICAgICAgICBjb25zdCBlcnJvcjogYW55ID0gZmFpbHVyZU9wdC52YWx1ZVxuICAgICAgICBpZiAobWFpbkVycm9yICE9PSB1bmRlZmluZWQgJiYgZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgZXJyb3IubWFpbkVycm9yID0gbWFpbkVycm9yXG4gICAgICAgIH1cbiAgICAgICAgY2xvc2VFcnJvciA9IGVycm9yXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBkZWZlY3RPcHQgPSBDYXVzZS5kaWVPcHRpb24oZXhpdC5jYXVzZSlcbiAgICAgICAgaWYgKE9wdGlvbi5pc1NvbWUoZGVmZWN0T3B0KSAmJiBkZWZlY3RPcHQudmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGNvbnN0IGVycm9yOiBhbnkgPSBkZWZlY3RPcHQudmFsdWVcbiAgICAgICAgICBpZiAobWFpbkVycm9yICE9PSB1bmRlZmluZWQgJiYgZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBlcnJvci5tYWluRXJyb3IgPSBtYWluRXJyb3JcbiAgICAgICAgICB9XG4gICAgICAgICAgY2xvc2VFcnJvciA9IGVycm9yXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2xvc2VFcnJvciA9IG5ldyBFcnJvcihTdHJpbmcoZXhpdC5jYXVzZSkpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY2xvc2VFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2V0RmFpbHVyZUV4aXRDb2RlSWZFbmFibGVkKHJ1bm5lck9wdGlvbnMuZXhpdENvZGUpXG4gICAgcmVwb3J0RXJyb3JJZkVuYWJsZWQocnVubmVyT3B0aW9ucy5leGl0Q29kZSAmJiBydW5uZXJPcHRpb25zLnJlcG9ydEVycm9yLCBjbG9zZUVycm9yKVxuICAgIHRocm93IGNsb3NlRXJyb3JcbiAgfVxuXG4gIGlmICghcmVzdWx0KSB7XG4gICAgc2V0RmFpbHVyZUV4aXRDb2RlSWZFbmFibGVkKHJ1bm5lck9wdGlvbnMuZXhpdENvZGUpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiW0xvZ2l4XSBQcm9ncmFtUnVubmVyLnJ1blByb2dyYW06IG1pc3NpbmcgcmVzdWx0XCIpXG4gIH1cblxuICBpZiAocmVzdWx0Ll90YWcgPT09IFwiZmFpbHVyZVwiKSB7XG4gICAgdGhyb3cgcmVzdWx0LmVycm9yXG4gIH1cblxuICByZXR1cm4gcmVzdWx0LnZhbHVlXG59XG4iLCAiaW1wb3J0IHsgQ2F1c2UsIEVmZmVjdCwgRXhpdCwgRmliZXIsIE9wdGlvbiwgU2NvcGUgfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7XG4gIERpc3Bvc2VFcnJvcixcbiAgRGlzcG9zZVRpbWVvdXRFcnJvcixcbiAgdHlwZSBQcm9ncmFtSWRlbnRpdHksXG59IGZyb20gXCIuL1Byb2dyYW1SdW5uZXIuZXJyb3JzLmpzXCJcblxuZXhwb3J0IGNvbnN0IGNsb3NlUHJvZ3JhbVNjb3BlID0gKHBhcmFtczoge1xuICByZWFkb25seSBzY29wZTogU2NvcGUuQ2xvc2VhYmxlU2NvcGVcbiAgcmVhZG9ubHkgdGltZW91dE1zOiBudW1iZXJcbiAgcmVhZG9ubHkgaWRlbnRpdHk6IFByb2dyYW1JZGVudGl0eVxuICByZWFkb25seSBvbkVycm9yPzogKGNhdXNlOiBDYXVzZS5DYXVzZTx1bmtub3duPikgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgbmV2ZXI+XG59KTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgbmV2ZXI+ID0+IHtcbiAgcmV0dXJuIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KClcblxuICAgIGNvbnN0IGZpYmVyID0geWllbGQqIEVmZmVjdC5mb3JrRGFlbW9uKFNjb3BlLmNsb3NlKHBhcmFtcy5zY29wZSwgRXhpdC52b2lkKSlcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBleGl0T3B0ID0geWllbGQqIEZpYmVyLnBvbGwoZmliZXIpXG4gICAgICBpZiAoT3B0aW9uLmlzU29tZShleGl0T3B0KSkge1xuICAgICAgICBjb25zdCBleGl0ID0gZXhpdE9wdC52YWx1ZVxuICAgICAgICBpZiAoZXhpdC5fdGFnID09PSBcIlN1Y2Nlc3NcIikge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmRpZShuZXcgRGlzcG9zZUVycm9yKHBhcmFtcy5pZGVudGl0eSwgZXhpdC5jYXVzZSkpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsYXBzZWRNcyA9IERhdGUubm93KCkgLSBzdGFydFxuICAgICAgaWYgKGVsYXBzZWRNcyA+PSBwYXJhbXMudGltZW91dE1zKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IERpc3Bvc2VUaW1lb3V0RXJyb3IocGFyYW1zLmlkZW50aXR5LCB7XG4gICAgICAgICAgdGltZW91dE1zOiBwYXJhbXMudGltZW91dE1zLFxuICAgICAgICAgIGVsYXBzZWRNcyxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAodHlwZW9mIHBhcmFtcy5vbkVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB5aWVsZCogcGFyYW1zXG4gICAgICAgICAgICAub25FcnJvcihDYXVzZS5kaWUoZXJyb3IpKVxuICAgICAgICAgICAgLnBpcGUoRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKCkgPT4gRWZmZWN0LnZvaWQpKVxuICAgICAgICB9XG5cbiAgICAgICAgeWllbGQqIEZpYmVyLmludGVycnVwdEZvcmsoZmliZXIpXG4gICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LmRpZShlcnJvcilcbiAgICAgIH1cblxuICAgICAgLy8gTk9URTogVXNlIGEgbWljcm90YXNrIHlpZWxkIChub3QgVGVzdENsb2NrLWJhc2VkKSB0byBhdm9pZCBiZWluZyBibG9ja2VkIGJ5IFRlc3RDbG9jayxcbiAgICAgIC8vIHdoaWxlIGtlZXBpbmcgdGhlIFwic3VjY2Vzc2Z1bCBjbG9zZVwiIGZhc3QgcGF0aCBjaGVhcCAocGVyZi1jcml0aWNhbCBmb3IgdGlnaHQgbG9vcHMpLlxuICAgICAgeWllbGQqIEVmZmVjdC5wcm9taXNlKCgpID0+IG5ldyBQcm9taXNlPHZvaWQ+KChyKSA9PiBxdWV1ZU1pY3JvdGFzayhyKSkpXG4gICAgfVxuICB9KVxufVxuIiwgImV4cG9ydCB0eXBlIFByb2dyYW1SdW5uZXJFcnJvclRhZyA9XG4gIHwgXCJCb290RXJyb3JcIlxuICB8IFwiTWFpbkVycm9yXCJcbiAgfCBcIkRpc3Bvc2VFcnJvclwiXG4gIHwgXCJEaXNwb3NlVGltZW91dFwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZ3JhbUlkZW50aXR5IHtcbiAgbW9kdWxlSWQ6IHN0cmluZ1xuICBpbnN0YW5jZUlkOiBzdHJpbmdcbn1cblxuY29uc3Qgc3VtbWFyaXplQ2F1c2UgPSAoY2F1c2U6IHVua25vd24pOiB7IG5hbWU/OiBzdHJpbmc7IG1lc3NhZ2U/OiBzdHJpbmcgfSA9PiB7XG4gIGlmIChjYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIHsgbmFtZTogY2F1c2UubmFtZSwgbWVzc2FnZTogY2F1c2UubWVzc2FnZSB9XG4gIH1cbiAgcmV0dXJuIHsgbWVzc2FnZTogdHlwZW9mIGNhdXNlID09PSBcInN0cmluZ1wiID8gY2F1c2UgOiB1bmRlZmluZWQgfVxufVxuXG5hYnN0cmFjdCBjbGFzcyBQcm9ncmFtUnVubmVyRXJyb3JCYXNlIGV4dGVuZHMgRXJyb3Ige1xuICBhYnN0cmFjdCByZWFkb25seSBfdGFnOiBQcm9ncmFtUnVubmVyRXJyb3JUYWdcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZW50cnlwb2ludDogXCJib290XCIgfCBcIm1haW5cIiB8IFwiZGlzcG9zZVwiXG4gIHJlYWRvbmx5IGhpbnQ/OiBzdHJpbmdcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocGFyYW1zOiB7XG4gICAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nXG4gICAgcmVhZG9ubHkgaWRlbnRpdHk6IFByb2dyYW1JZGVudGl0eVxuICAgIHJlYWRvbmx5IGVudHJ5cG9pbnQ6IFwiYm9vdFwiIHwgXCJtYWluXCIgfCBcImRpc3Bvc2VcIlxuICAgIHJlYWRvbmx5IGhpbnQ/OiBzdHJpbmdcbiAgfSkge1xuICAgIHN1cGVyKHBhcmFtcy5tZXNzYWdlKVxuICAgIHRoaXMubW9kdWxlSWQgPSBwYXJhbXMuaWRlbnRpdHkubW9kdWxlSWRcbiAgICB0aGlzLmluc3RhbmNlSWQgPSBwYXJhbXMuaWRlbnRpdHkuaW5zdGFuY2VJZFxuICAgIHRoaXMuZW50cnlwb2ludCA9IHBhcmFtcy5lbnRyeXBvaW50XG4gICAgdGhpcy5oaW50ID0gcGFyYW1zLmhpbnRcbiAgfVxuXG4gIHRvSlNPTigpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF90YWc6IHRoaXMuX3RhZyxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIG1vZHVsZUlkOiB0aGlzLm1vZHVsZUlkLFxuICAgICAgaW5zdGFuY2VJZDogdGhpcy5pbnN0YW5jZUlkLFxuICAgICAgZW50cnlwb2ludDogdGhpcy5lbnRyeXBvaW50LFxuICAgICAgaGludDogdGhpcy5oaW50LFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQm9vdEVycm9yIGV4dGVuZHMgUHJvZ3JhbVJ1bm5lckVycm9yQmFzZSB7XG4gIHJlYWRvbmx5IF90YWcgPSBcIkJvb3RFcnJvclwiIGFzIGNvbnN0XG4gIHJlYWRvbmx5IGNhdXNlPzogeyBuYW1lPzogc3RyaW5nOyBtZXNzYWdlPzogc3RyaW5nIH1cblxuICBjb25zdHJ1Y3RvcihpZGVudGl0eTogUHJvZ3JhbUlkZW50aXR5LCBjYXVzZTogdW5rbm93bikge1xuICAgIHN1cGVyKHtcbiAgICAgIG1lc3NhZ2U6IFwiW0xvZ2l4XSBQcm9ncmFtIGJvb3QgZmFpbGVkXCIsXG4gICAgICBpZGVudGl0eSxcbiAgICAgIGVudHJ5cG9pbnQ6IFwiYm9vdFwiLFxuICAgICAgaGludDogXCJcdTY4QzBcdTY3RTUgb3B0aW9ucy5sYXllciAvIGltcG9ydHMgLyBwcm92aWRlcnMgXHU2NjJGXHU1NDI2XHU5RjUwXHU1MTY4XHVGRjFCXHU0RUU1XHU1M0NBXHU2NjJGXHU1NDI2XHU1QjU4XHU1NzI4XHU4OEM1XHU5MTREXHU5NjM2XHU2QkI1XHU3RjNBXHU1OTMxXHU0RjlEXHU4RDU2XHUzMDAyXCIsXG4gICAgfSlcbiAgICB0aGlzLm5hbWUgPSBcIkJvb3RFcnJvclwiXG4gICAgdGhpcy5jYXVzZSA9IHN1bW1hcml6ZUNhdXNlKGNhdXNlKVxuICB9XG5cbiAgb3ZlcnJpZGUgdG9KU09OKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4geyAuLi5zdXBlci50b0pTT04oKSwgY2F1c2U6IHRoaXMuY2F1c2UgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYWluRXJyb3IgZXh0ZW5kcyBQcm9ncmFtUnVubmVyRXJyb3JCYXNlIHtcbiAgcmVhZG9ubHkgX3RhZyA9IFwiTWFpbkVycm9yXCIgYXMgY29uc3RcbiAgcmVhZG9ubHkgY2F1c2U/OiB7IG5hbWU/OiBzdHJpbmc7IG1lc3NhZ2U/OiBzdHJpbmcgfVxuXG4gIGNvbnN0cnVjdG9yKGlkZW50aXR5OiBQcm9ncmFtSWRlbnRpdHksIGNhdXNlOiB1bmtub3duKSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogXCJbTG9naXhdIFByb2dyYW0gbWFpbiBmYWlsZWRcIixcbiAgICAgIGlkZW50aXR5LFxuICAgICAgZW50cnlwb2ludDogXCJtYWluXCIsXG4gICAgICBoaW50OiBcIlx1NEUzQlx1NkQ0MVx1N0EwQlx1NTkzMVx1OEQyNVx1RkYxQVx1Nzg2RVx1OEJBNCBtYWluIFx1NjYyRlx1NTQyNlx1NjYzRVx1NUYwRlx1NTkwNFx1NzQwNlx1NEUxQVx1NTJBMVx1OTUxOVx1OEJFRlx1RkYwQ1x1NjIxNlx1NjYyRlx1NTQyNlx1ODhBQlx1NEUyRFx1NjVBRC9cdTdGM0FcdTU5MzFcdTRGOURcdThENTZcdTVCRkNcdTgxRjRcdTU5MzFcdThEMjVcdTMwMDJcIixcbiAgICB9KVxuICAgIHRoaXMubmFtZSA9IFwiTWFpbkVycm9yXCJcbiAgICB0aGlzLmNhdXNlID0gc3VtbWFyaXplQ2F1c2UoY2F1c2UpXG4gIH1cblxuICBvdmVycmlkZSB0b0pTT04oKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7IC4uLnN1cGVyLnRvSlNPTigpLCBjYXVzZTogdGhpcy5jYXVzZSB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpc3Bvc2VFcnJvciBleHRlbmRzIFByb2dyYW1SdW5uZXJFcnJvckJhc2Uge1xuICByZWFkb25seSBfdGFnID0gXCJEaXNwb3NlRXJyb3JcIiBhcyBjb25zdFxuICByZWFkb25seSBjYXVzZT86IHsgbmFtZT86IHN0cmluZzsgbWVzc2FnZT86IHN0cmluZyB9XG5cbiAgY29uc3RydWN0b3IoaWRlbnRpdHk6IFByb2dyYW1JZGVudGl0eSwgY2F1c2U6IHVua25vd24pIHtcbiAgICBzdXBlcih7XG4gICAgICBtZXNzYWdlOiBcIltMb2dpeF0gUHJvZ3JhbSBkaXNwb3NlIGZhaWxlZFwiLFxuICAgICAgaWRlbnRpdHksXG4gICAgICBlbnRyeXBvaW50OiBcImRpc3Bvc2VcIixcbiAgICAgIGhpbnQ6IFwiXHU5MUNBXHU2NTNFXHU1OTMxXHU4RDI1XHVGRjFBXHU1M0VGXHU4MEZEXHU2NzA5IGZpbmFsaXplciBcdTYyOUJcdTk1MTlcdTYyMTYgc2NvcGUvXHU4RDQ0XHU2RTkwXHU1M0U1XHU2N0M0XHU1RjAyXHU1RTM4XHVGRjBDXHU1RUZBXHU4QkFFXHU2N0U1XHU3NzBCIG9uRXJyb3IvXHU2NUU1XHU1RkQ3XHUzMDAyXCIsXG4gICAgfSlcbiAgICB0aGlzLm5hbWUgPSBcIkRpc3Bvc2VFcnJvclwiXG4gICAgdGhpcy5jYXVzZSA9IHN1bW1hcml6ZUNhdXNlKGNhdXNlKVxuICB9XG5cbiAgb3ZlcnJpZGUgdG9KU09OKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4geyAuLi5zdXBlci50b0pTT04oKSwgY2F1c2U6IHRoaXMuY2F1c2UgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NlVGltZW91dEVycm9yIGV4dGVuZHMgUHJvZ3JhbVJ1bm5lckVycm9yQmFzZSB7XG4gIHJlYWRvbmx5IF90YWcgPSBcIkRpc3Bvc2VUaW1lb3V0XCIgYXMgY29uc3RcbiAgcmVhZG9ubHkgdGltZW91dE1zOiBudW1iZXJcbiAgcmVhZG9ubHkgZWxhcHNlZE1zOiBudW1iZXJcbiAgcmVhZG9ubHkgc3VnZ2VzdGlvbnM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGlkZW50aXR5OiBQcm9ncmFtSWRlbnRpdHksXG4gICAgcGFyYW1zOiB7IHJlYWRvbmx5IHRpbWVvdXRNczogbnVtYmVyOyByZWFkb25seSBlbGFwc2VkTXM6IG51bWJlciB9LFxuICApIHtcbiAgICBzdXBlcih7XG4gICAgICBtZXNzYWdlOiBcIltMb2dpeF0gUHJvZ3JhbSBkaXNwb3NlIHRpbWVkIG91dFwiLFxuICAgICAgaWRlbnRpdHksXG4gICAgICBlbnRyeXBvaW50OiBcImRpc3Bvc2VcIixcbiAgICAgIGhpbnQ6IFwiXHU5MUNBXHU2NTNFXHU4RDg1XHU2NUY2XHVGRjFBXHU4MTFBXHU2NzJDXHU2NUUwXHU2Q0Q1XHU4MUVBXHU3MTM2XHU5MDAwXHU1MUZBXHU5MDFBXHU1RTM4XHU2MTBGXHU1NDczXHU3NzQwXHU4RDQ0XHU2RTkwXHU2NzJBXHU5MUNBXHU2NTNFXHU2MjE2XHU1NDBFXHU1M0YwIGZpYmVyIFx1NjcyQVx1NjUzNlx1Njc1Rlx1MzAwMlwiLFxuICAgIH0pXG4gICAgdGhpcy5uYW1lID0gXCJEaXNwb3NlVGltZW91dEVycm9yXCJcbiAgICB0aGlzLnRpbWVvdXRNcyA9IHBhcmFtcy50aW1lb3V0TXNcbiAgICB0aGlzLmVsYXBzZWRNcyA9IHBhcmFtcy5lbGFwc2VkTXNcbiAgICB0aGlzLnN1Z2dlc3Rpb25zID0gW1xuICAgICAgXCJcdTY4QzBcdTY3RTVcdTY2MkZcdTU0MjZcdTY3MDlcdTY3MkEgdW5yZWdpc3RlciBcdTc2ODQgZXZlbnQgbGlzdGVuZXJcdUZGMDhcdTU5ODIgcHJvY2Vzcy5vbiAvIGVtaXR0ZXIub25cdUZGMDlcdTMwMDJcIixcbiAgICAgIFwiXHU2OEMwXHU2N0U1XHU2NjJGXHU1NDI2XHU2NzA5XHU2NzJBIGpvaW4vXHU2NzJBIGludGVycnVwdCBcdTc2ODQgZmliZXJcdUZGMDhcdTk1N0ZcdTlBN0Igd2F0Y2hlciAvIFN0cmVhbS5ydW4qXHVGRjA5XHUzMDAyXCIsXG4gICAgICBcIlx1NjhDMFx1NjdFNVx1NjYyRlx1NTQyNlx1NjcwOVx1NjcyQVx1NTE3M1x1OTVFRFx1NzY4NFx1OEQ0NFx1NkU5MFx1NTNFNVx1NjdDNFx1RkYwOHRpbWVyIC8gc29ja2V0IC8gZmlsZSBoYW5kbGVcdUZGMDlcdTMwMDJcIixcbiAgICBdXG4gIH1cblxuICBvdmVycmlkZSB0b0pTT04oKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci50b0pTT04oKSxcbiAgICAgIHRpbWVvdXRNczogdGhpcy50aW1lb3V0TXMsXG4gICAgICBlbGFwc2VkTXM6IHRoaXMuZWxhcHNlZE1zLFxuICAgICAgc3VnZ2VzdGlvbnM6IHRoaXMuc3VnZ2VzdGlvbnMsXG4gICAgfVxuICB9XG59XG4iLCAiY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGxcblxuY29uc3QgZ2V0UHJvY2VzcyA9ICgpOiBhbnkgPT4gKGdsb2JhbFRoaXMgYXMgYW55KS5wcm9jZXNzXG5cbmV4cG9ydCBjb25zdCBzZXRFeGl0Q29kZUlmRW5hYmxlZCA9IChcbiAgZW5hYmxlZDogYm9vbGVhbixcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2b2lkID0+IHtcbiAgaWYgKCFlbmFibGVkKSByZXR1cm5cblxuICBjb25zdCBwcm9jID0gZ2V0UHJvY2VzcygpXG4gIGlmICghaXNSZWNvcmQocHJvYykpIHJldHVyblxuXG4gIGNvbnN0IG5leHQgPVxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSA/IHZhbHVlIDogMFxuXG4gIHByb2MuZXhpdENvZGUgPSBuZXh0XG59XG5cbmV4cG9ydCBjb25zdCBzZXRGYWlsdXJlRXhpdENvZGVJZkVuYWJsZWQgPSAoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQgPT4ge1xuICBpZiAoIWVuYWJsZWQpIHJldHVyblxuXG4gIGNvbnN0IHByb2MgPSBnZXRQcm9jZXNzKClcbiAgaWYgKCFpc1JlY29yZChwcm9jKSkgcmV0dXJuXG5cbiAgcHJvYy5leGl0Q29kZSA9IDFcbn1cblxuZXhwb3J0IGNvbnN0IHJlcG9ydEVycm9ySWZFbmFibGVkID0gKFxuICBlbmFibGVkOiBib29sZWFuLFxuICBlcnJvcjogdW5rbm93bixcbik6IHZvaWQgPT4ge1xuICBpZiAoIWVuYWJsZWQpIHJldHVyblxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG59XG5cbiIsICJpbXBvcnQgeyBFZmZlY3QsIEV4aXQsIFNjb3BlIH0gZnJvbSBcImVmZmVjdFwiXG5cbmNvbnN0IGdldFByb2Nlc3MgPSAoKTogYW55ID0+IChnbG9iYWxUaGlzIGFzIGFueSkucHJvY2Vzc1xuXG5jb25zdCBpc05vZGVQcm9jZXNzID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMge1xuICBvbjogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6ICgpID0+IHZvaWQpID0+IHZvaWRcbiAgb2ZmPzogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6ICgpID0+IHZvaWQpID0+IHZvaWRcbiAgcmVtb3ZlTGlzdGVuZXI/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKCkgPT4gdm9pZCkgPT4gdm9pZFxufSA9PlxuICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgdmFsdWUgIT09IG51bGwgJiZcbiAgdHlwZW9mICh2YWx1ZSBhcyBhbnkpLm9uID09PSBcImZ1bmN0aW9uXCJcblxuY29uc3QgcmVtb3ZlTGlzdGVuZXIgPSAocHJvYzogYW55LCBldmVudDogc3RyaW5nLCBoYW5kbGVyOiAoKSA9PiB2b2lkKTogdm9pZCA9PiB7XG4gIGlmICh0eXBlb2YgcHJvYy5vZmYgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHByb2Mub2ZmKGV2ZW50LCBoYW5kbGVyKVxuICAgIHJldHVyblxuICB9XG4gIGlmICh0eXBlb2YgcHJvYy5yZW1vdmVMaXN0ZW5lciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgcHJvYy5yZW1vdmVMaXN0ZW5lcihldmVudCwgaGFuZGxlcilcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgaW5zdGFsbEdyYWNlZnVsU2h1dGRvd25IYW5kbGVycyA9IChwYXJhbXM6IHtcbiAgcmVhZG9ubHkgc2NvcGU6IFNjb3BlLkNsb3NlYWJsZVNjb3BlXG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW5cbn0pOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+IHtcbiAgaWYgKCFwYXJhbXMuZW5hYmxlZCkge1xuICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICB9XG5cbiAgY29uc3QgcHJvYyA9IGdldFByb2Nlc3MoKVxuICBpZiAoIWlzTm9kZVByb2Nlc3MocHJvYykpIHtcbiAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgdm9pZCBFZmZlY3QucnVuUHJvbWlzZShTY29wZS5jbG9zZShwYXJhbXMuc2NvcGUsIEV4aXQudm9pZCkpXG4gIH1cblxuICByZXR1cm4gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIHlpZWxkKiBTY29wZS5hZGRGaW5hbGl6ZXIoXG4gICAgICBwYXJhbXMuc2NvcGUsXG4gICAgICBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICAgIHJlbW92ZUxpc3RlbmVyKHByb2MsIFwiU0lHSU5UXCIsIGhhbmRsZXIpXG4gICAgICAgIHJlbW92ZUxpc3RlbmVyKHByb2MsIFwiU0lHVEVSTVwiLCBoYW5kbGVyKVxuICAgICAgfSksXG4gICAgKVxuXG4gICAgeWllbGQqIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgIHByb2Mub24oXCJTSUdJTlRcIiwgaGFuZGxlcilcbiAgICAgIHByb2Mub24oXCJTSUdURVJNXCIsIGhhbmRsZXIpXG4gICAgfSlcbiAgfSlcbn1cblxuIiwgImV4cG9ydCBpbnRlcmZhY2UgUHJvZ3JhbVJ1bm5lck9wdGlvbnM8QXJncyA9IHVua25vd24+IHtcbiAgcmVhZG9ubHkgY2xvc2VTY29wZVRpbWVvdXQ6IG51bWJlclxuICByZWFkb25seSBoYW5kbGVTaWduYWxzOiBib29sZWFuXG4gIHJlYWRvbmx5IGFyZ3M6IEFyZ3MgfCB1bmRlZmluZWRcbiAgcmVhZG9ubHkgZXhpdENvZGU6IGJvb2xlYW5cbiAgcmVhZG9ubHkgcmVwb3J0RXJyb3I6IGJvb2xlYW5cbn1cblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGxcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVQcm9ncmFtUnVubmVyT3B0aW9ucyA9IDxBcmdzID0gdW5rbm93bj4oXG4gIG9wdGlvbnM6IHVua25vd24sXG4pOiBQcm9ncmFtUnVubmVyT3B0aW9uczxBcmdzPiA9PiB7XG4gIGNvbnN0IHJlY29yZCA9IGlzUmVjb3JkKG9wdGlvbnMpID8gb3B0aW9ucyA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGNsb3NlU2NvcGVUaW1lb3V0ID1cbiAgICB0eXBlb2YgcmVjb3JkPy5jbG9zZVNjb3BlVGltZW91dCA9PT0gXCJudW1iZXJcIlxuICAgICAgPyByZWNvcmQuY2xvc2VTY29wZVRpbWVvdXRcbiAgICAgIDogMTAwMFxuXG4gIGNvbnN0IGhhbmRsZVNpZ25hbHMgPVxuICAgIHR5cGVvZiByZWNvcmQ/LmhhbmRsZVNpZ25hbHMgPT09IFwiYm9vbGVhblwiID8gcmVjb3JkLmhhbmRsZVNpZ25hbHMgOiB0cnVlXG5cbiAgY29uc3QgZXhpdENvZGUgPSB0eXBlb2YgcmVjb3JkPy5leGl0Q29kZSA9PT0gXCJib29sZWFuXCIgPyByZWNvcmQuZXhpdENvZGUgOiBmYWxzZVxuXG4gIGNvbnN0IHJlcG9ydEVycm9yID1cbiAgICB0eXBlb2YgcmVjb3JkPy5yZXBvcnRFcnJvciA9PT0gXCJib29sZWFuXCIgPyByZWNvcmQucmVwb3J0RXJyb3IgOiB0cnVlXG5cbiAgY29uc3QgYXJncyA9IChyZWNvcmQ/LmFyZ3MgYXMgQXJncyB8IHVuZGVmaW5lZCkgPz8gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIHtcbiAgICBjbG9zZVNjb3BlVGltZW91dCxcbiAgICBoYW5kbGVTaWduYWxzLFxuICAgIGFyZ3MsXG4gICAgZXhpdENvZGUsXG4gICAgcmVwb3J0RXJyb3IsXG4gIH1cbn1cblxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVMsVUFBQUEsU0FBUSxTQUFBQyxRQUF1QixVQUFBQyxlQUFxQjs7O0FDQTdELFNBQVMsU0FBUyxVQUFVLFFBQVEsT0FBTyxzQkFBc0I7QUF5RWpFLElBQU0sWUFBWSxDQUFDLFFBQXVDO0FBQ3hELFFBQU0sU0FBUztBQUNmLE1BQUksT0FBTyxPQUFPLFFBQVEsVUFBVTtBQUNsQyxXQUFPLE9BQU87QUFBQSxFQUNoQjtBQUNBLE1BQUksT0FBTyxPQUFPLFFBQVEsVUFBVTtBQUNsQyxXQUFPLE9BQU87QUFBQSxFQUNoQjtBQUNBLE1BQUksT0FBTyxPQUFPLGFBQWEsWUFBWTtBQUN6QyxXQUFPLE9BQU8sU0FBUztBQUFBLEVBQ3pCO0FBQ0EsU0FBTztBQUNUO0FBRUEsSUFBTSxnQkFBZ0IsQ0FBQyxZQUFtRTtBQUN4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Q0FBQztBQUFBLEVBQ0g7QUFDRjtBQVlPLElBQU0sMkJBQTJCLENBQ3RDLFVBQ0EsWUFDQSxPQUNBLFNBRUFELFFBQU8sSUFBSSxhQUFhO0FBQ3RCLFFBQU0sVUFDVTtBQUFBLElBQ1o7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUVGLE1BQUksQ0FBQyxTQUFTO0FBQ1o7QUFBQSxFQUNGO0FBRUEsTUFBSTtBQUNGLFdBQU8sb0JBQW9CLE9BQWMsRUFBRSxJQUFJLHlCQUF5QixPQUFPLElBQUk7QUFBQSxFQUNyRixRQUFRO0FBQ047QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFsiRWZmZWN0IiwgIkxheWVyIiwgIk9wdGlvbiIsICJDYXVzZSIsICJFZmZlY3QiLCAiT3B0aW9uIiwgIlNjb3BlIiwgIkVmZmVjdCIsICJFZmZlY3QiLCAiaXNSZWNvcmQiLCAiRWZmZWN0IiwgIkV4aXQiLCAiU2NvcGUiLCAiZ2V0UHJvY2VzcyIsICJpc1JlY29yZCIsICJFZmZlY3QiLCAiU2NvcGUiLCAiQ2F1c2UiLCAiT3B0aW9uIiwgIm1ha2UiLCAiTGF5ZXIiLCAib3BlblByb2dyYW0iLCAicnVuUHJvZ3JhbSIsICJFZmZlY3QiLCAiT3B0aW9uIl0KfQo=