@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,1109 @@
1
+ // @logixjs/core subpath bundles for @logixjs/sandbox
2
+
3
+ import {
4
+ currentLinkId,
5
+ projectJsonValue
6
+ } from "./chunk-SI5OKFFY.js";
7
+
8
+ // ../logix-core/src/internal/runtime/core/DebugSink.record.ts
9
+ import { Cause as Cause2, Effect, FiberRef, Layer, Logger } from "../effect.js";
10
+
11
+ // ../logix-core/src/internal/runtime/core/errorSummary.ts
12
+ import { Cause } from "../effect.js";
13
+ var truncate = (value, maxLen) => {
14
+ if (value.length <= maxLen) return { value, truncated: false };
15
+ return { value: value.slice(0, maxLen), truncated: true };
16
+ };
17
+ var safeStringify = (value) => {
18
+ try {
19
+ return { ok: true, json: JSON.stringify(value) };
20
+ } catch {
21
+ return { ok: false };
22
+ }
23
+ };
24
+ var getMessageFromUnknown = (cause) => {
25
+ if (typeof cause === "string") return cause;
26
+ if (typeof cause === "number" || typeof cause === "boolean" || typeof cause === "bigint") return String(cause);
27
+ if (cause instanceof Error) return cause.message || cause.name || "Error";
28
+ if (cause && typeof cause === "object" && "message" in cause && typeof cause.message === "string") {
29
+ return cause.message;
30
+ }
31
+ try {
32
+ const pretty = Cause.pretty(cause, { renderErrorCause: true });
33
+ if (typeof pretty === "string" && pretty.length > 0) return pretty;
34
+ } catch {
35
+ }
36
+ return "Unknown error";
37
+ };
38
+ var toSerializableErrorSummary = (cause, options) => {
39
+ const maxMessageLength = options?.maxMessageLength ?? 256;
40
+ const messageRaw = getMessageFromUnknown(cause);
41
+ const { value: message, truncated } = truncate(messageRaw, maxMessageLength);
42
+ const summary = {
43
+ message
44
+ };
45
+ if (cause instanceof Error) {
46
+ if (cause.name && cause.name !== "Error") summary.name = cause.name;
47
+ const anyCause = cause;
48
+ if (typeof anyCause.code === "string" && anyCause.code.length > 0) summary.code = anyCause.code;
49
+ else if (typeof anyCause.code === "number" && Number.isFinite(anyCause.code)) summary.code = String(anyCause.code);
50
+ if (typeof anyCause.hint === "string" && anyCause.hint.length > 0) summary.hint = anyCause.hint;
51
+ return {
52
+ errorSummary: summary,
53
+ downgrade: truncated ? "oversized" : void 0
54
+ };
55
+ }
56
+ if (cause && typeof cause === "object") {
57
+ const anyCause = cause;
58
+ if (typeof anyCause.name === "string" && anyCause.name.length > 0) summary.name = anyCause.name;
59
+ if (typeof anyCause.code === "string" && anyCause.code.length > 0) summary.code = anyCause.code;
60
+ if (typeof anyCause.hint === "string" && anyCause.hint.length > 0) summary.hint = anyCause.hint;
61
+ }
62
+ const stringifyResult = safeStringify(cause);
63
+ if (!stringifyResult.ok) {
64
+ return {
65
+ errorSummary: summary,
66
+ downgrade: "non_serializable"
67
+ };
68
+ }
69
+ if (truncated) {
70
+ return {
71
+ errorSummary: summary,
72
+ downgrade: "oversized"
73
+ };
74
+ }
75
+ if (message === "Unknown error") {
76
+ return {
77
+ errorSummary: summary,
78
+ downgrade: "unknown"
79
+ };
80
+ }
81
+ return { errorSummary: summary };
82
+ };
83
+
84
+ // ../logix-core/src/internal/runtime/core/DebugSink.record.ts
85
+ var currentDebugSinks = FiberRef.unsafeMake([]);
86
+ var currentRuntimeLabel = FiberRef.unsafeMake(void 0);
87
+ var currentTxnId = FiberRef.unsafeMake(void 0);
88
+ var currentOpSeq = FiberRef.unsafeMake(void 0);
89
+ var currentDiagnosticsLevel = FiberRef.unsafeMake("off");
90
+ var diagnosticsLevel = (level) => Layer.fiberRefLocallyScopedWith(currentDiagnosticsLevel, () => level);
91
+ var currentTraitConvergeDiagnosticsSampling = FiberRef.unsafeMake({
92
+ sampleEveryN: 32,
93
+ topK: 3
94
+ });
95
+ var traitConvergeDiagnosticsSampling = (config) => Layer.fiberRefLocallyScopedWith(currentTraitConvergeDiagnosticsSampling, () => config);
96
+ var appendSinks = (sinks) => Layer.fiberRefLocallyScopedWith(currentDebugSinks, (current) => [...current, ...sinks]);
97
+ var nextGlobalEventSeq = 0;
98
+ var clearRuntimeDebugEventSeq = () => {
99
+ nextGlobalEventSeq = 0;
100
+ };
101
+ var nextEventSeq = () => {
102
+ nextGlobalEventSeq += 1;
103
+ return nextGlobalEventSeq;
104
+ };
105
+ var makeEventId = (instanceId, eventSeq) => `${instanceId}::e${eventSeq}`;
106
+ var mergeDowngrade = (current, next) => {
107
+ if (!current) return next;
108
+ if (!next) return current;
109
+ if (current === "non_serializable" || next === "non_serializable") return "non_serializable";
110
+ if (current === "oversized" || next === "oversized") return "oversized";
111
+ return "unknown";
112
+ };
113
+ var browserLifecycleSeen = /* @__PURE__ */ new Set();
114
+ var browserDiagnosticSeen = /* @__PURE__ */ new Set();
115
+ var lastTxnByInstance = /* @__PURE__ */ new Map();
116
+ var pendingTxnAlignmentByInstance = /* @__PURE__ */ new Map();
117
+ var enqueuePendingTxnAlignment = (instanceId, ref) => {
118
+ const list = pendingTxnAlignmentByInstance.get(instanceId);
119
+ if (!list) {
120
+ pendingTxnAlignmentByInstance.set(instanceId, [ref]);
121
+ return;
122
+ }
123
+ list.push(ref);
124
+ if (list.length > 64) {
125
+ list.shift();
126
+ }
127
+ };
128
+ var backfillPendingTxnAlignment = (instanceId, txn) => {
129
+ const pending = pendingTxnAlignmentByInstance.get(instanceId);
130
+ if (!pending || pending.length === 0) {
131
+ pendingTxnAlignmentByInstance.delete(instanceId);
132
+ return;
133
+ }
134
+ for (const ref of pending) {
135
+ const anyRef = ref;
136
+ if (anyRef.txnId == null) {
137
+ anyRef.txnId = txn.txnId;
138
+ }
139
+ if (typeof anyRef.txnSeq !== "number" || anyRef.txnSeq <= 0) {
140
+ anyRef.txnSeq = txn.txnSeq;
141
+ }
142
+ }
143
+ pendingTxnAlignmentByInstance.delete(instanceId);
144
+ };
145
+ var lifecycleErrorLog = (event) => {
146
+ const moduleId = event.moduleId ?? "unknown";
147
+ const causePretty = (() => {
148
+ try {
149
+ return Cause2.pretty(event.cause, {
150
+ renderErrorCause: true
151
+ });
152
+ } catch {
153
+ try {
154
+ return JSON.stringify(event.cause, null, 2);
155
+ } catch {
156
+ return String(event.cause);
157
+ }
158
+ }
159
+ })();
160
+ const message = `[Logix][module=${moduleId}] lifecycle:error
161
+ ${causePretty}`;
162
+ return Effect.logError(message).pipe(
163
+ Effect.annotateLogs({
164
+ "logix.moduleId": moduleId,
165
+ "logix.event": "lifecycle:error",
166
+ "logix.cause": causePretty
167
+ })
168
+ );
169
+ };
170
+ var diagnosticLog = (event) => {
171
+ const moduleId = event.moduleId ?? "unknown";
172
+ const header = `[Logix][module=${moduleId}] diagnostic(${event.severity})`;
173
+ const detail = `code=${event.code} message=${event.message}${event.actionTag ? ` action=${event.actionTag}` : ""}${event.hint ? `
174
+ hint: ${event.hint}` : ""}`;
175
+ const msg = `${header}
176
+ ${detail}`;
177
+ const base = event.severity === "warning" ? Effect.logWarning(msg) : event.severity === "info" ? Effect.logInfo(msg) : Effect.logError(msg);
178
+ const annotations = {
179
+ "logix.moduleId": moduleId,
180
+ "logix.event": `diagnostic(${event.severity})`,
181
+ "logix.diagnostic.code": event.code,
182
+ "logix.diagnostic.message": event.message
183
+ };
184
+ if (event.hint) {
185
+ annotations["logix.diagnostic.hint"] = event.hint;
186
+ }
187
+ if (event.actionTag) {
188
+ annotations["logix.diagnostic.actionTag"] = event.actionTag;
189
+ }
190
+ return base.pipe(Effect.annotateLogs(annotations));
191
+ };
192
+ var noopLayer = Layer.locallyScoped(currentDebugSinks, []);
193
+ var errorOnlySink = {
194
+ record: (event) => event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" && event.severity !== "info" ? diagnosticLog(event) : Effect.void
195
+ };
196
+ var errorOnlyLayer = Layer.locallyScoped(currentDebugSinks, [errorOnlySink]);
197
+ var isErrorOnlyOnlySinks = (sinks) => sinks.length === 1 && sinks[0] === errorOnlySink;
198
+ var consoleSink = {
199
+ record: (event) => event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" ? diagnosticLog(event) : Effect.logDebug({ debugEvent: event })
200
+ };
201
+ var consoleLayer = Layer.locallyScoped(currentDebugSinks, [consoleSink]);
202
+ var isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
203
+ var renderBrowserConsoleEvent = (event) => {
204
+ if (typeof event.type === "string" && event.type.startsWith("trace:")) {
205
+ const moduleId = event.moduleId ?? "unknown";
206
+ const type = event.type;
207
+ return Effect.sync(() => {
208
+ console.groupCollapsed(
209
+ "%c[Logix]%c trace %c" + moduleId + "%c " + String(type),
210
+ "color:#6b7280;font-weight:bold",
211
+ // tag
212
+ "color:#3b82f6",
213
+ // label
214
+ "color:#9ca3af",
215
+ // module id
216
+ "color:#6b7280"
217
+ // type
218
+ );
219
+ console.log(event);
220
+ console.groupEnd();
221
+ });
222
+ }
223
+ if (event.type === "lifecycle:error") {
224
+ const moduleId = event.moduleId ?? "unknown";
225
+ const causePretty = (() => {
226
+ try {
227
+ return Cause2.pretty(event.cause, { renderErrorCause: true });
228
+ } catch {
229
+ try {
230
+ return JSON.stringify(event.cause, null, 2);
231
+ } catch {
232
+ return String(event.cause);
233
+ }
234
+ }
235
+ })();
236
+ const key = `${moduleId}|${causePretty}`;
237
+ if (browserLifecycleSeen.has(key)) {
238
+ return Effect.void;
239
+ }
240
+ browserLifecycleSeen.add(key);
241
+ return Effect.sync(() => {
242
+ console.groupCollapsed(
243
+ "%c[Logix]%c lifecycle:error %c" + moduleId,
244
+ "color:#ef4444;font-weight:bold",
245
+ // tag
246
+ "color:#ef4444",
247
+ // label
248
+ "color:#9ca3af"
249
+ // module id
250
+ );
251
+ console.error(causePretty);
252
+ console.groupEnd();
253
+ });
254
+ }
255
+ if (event.type === "diagnostic") {
256
+ const moduleId = event.moduleId ?? "unknown";
257
+ const detail = `code=${event.code} message=${event.message}${event.actionTag ? ` action=${event.actionTag}` : ""}${event.hint ? `
258
+ hint: ${event.hint}` : ""}`;
259
+ const color = event.severity === "warning" ? "color:#d97706" : event.severity === "info" ? "color:#3b82f6" : "color:#ef4444";
260
+ const label = event.severity === "warning" ? "diagnostic(warning)" : event.severity === "info" ? "diagnostic(info)" : "diagnostic(error)";
261
+ const key = `${moduleId}|${event.code}|${event.message}`;
262
+ if (browserDiagnosticSeen.has(key)) {
263
+ return Effect.void;
264
+ }
265
+ browserDiagnosticSeen.add(key);
266
+ return Effect.sync(() => {
267
+ console.groupCollapsed(
268
+ "%c[Logix]%c " + label + "%c module=" + moduleId,
269
+ "color:#6b7280;font-weight:bold",
270
+ color,
271
+ "color:#9ca3af"
272
+ );
273
+ if (event.severity === "warning") {
274
+ console.warn(detail);
275
+ } else if (event.severity === "info") {
276
+ console.info(detail);
277
+ } else {
278
+ console.error(detail);
279
+ }
280
+ console.groupEnd();
281
+ });
282
+ }
283
+ return Effect.void;
284
+ };
285
+ var browserConsoleSink = {
286
+ record: (event) => {
287
+ if (!isBrowser) {
288
+ return event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" ? diagnosticLog(event) : Effect.logDebug({ debugEvent: event });
289
+ }
290
+ return renderBrowserConsoleEvent(event);
291
+ }
292
+ };
293
+ var browserConsoleLayer = Layer.locallyScoped(currentDebugSinks, [browserConsoleSink]);
294
+ var browserDiagnosticConsoleSink = {
295
+ record: (event) => {
296
+ if (!isBrowser) {
297
+ return event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" && event.severity !== "info" ? diagnosticLog(event) : Effect.void;
298
+ }
299
+ return event.type === "lifecycle:error" || event.type === "diagnostic" && event.severity !== "info" ? renderBrowserConsoleEvent(event) : Effect.void;
300
+ }
301
+ };
302
+ var browserDiagnosticConsoleLayer = Layer.locallyScoped(currentDebugSinks, [browserDiagnosticConsoleSink]);
303
+ var browserPrettyLoggerLayer = Logger.replace(
304
+ Logger.defaultLogger,
305
+ Logger.prettyLogger({ mode: "browser", colors: true })
306
+ );
307
+ var record = (event) => Effect.gen(function* () {
308
+ const sinks = yield* FiberRef.get(currentDebugSinks);
309
+ if (isErrorOnlyOnlySinks(sinks)) {
310
+ if (event.type === "lifecycle:error") {
311
+ yield* lifecycleErrorLog(event);
312
+ return;
313
+ }
314
+ if (event.type === "diagnostic") {
315
+ if (event.severity !== "info") {
316
+ yield* diagnosticLog(event);
317
+ } else {
318
+ yield* Effect.void;
319
+ }
320
+ return;
321
+ }
322
+ yield* Effect.void;
323
+ return;
324
+ }
325
+ if (sinks.length === 0) {
326
+ if (isBrowser) {
327
+ if (event.type === "lifecycle:error" || event.type === "diagnostic") {
328
+ yield* renderBrowserConsoleEvent(event);
329
+ return;
330
+ }
331
+ yield* Effect.void;
332
+ return;
333
+ }
334
+ if (event.type === "lifecycle:error") {
335
+ yield* lifecycleErrorLog(event);
336
+ return;
337
+ }
338
+ if (event.type === "diagnostic") {
339
+ yield* diagnosticLog(event);
340
+ return;
341
+ }
342
+ yield* Effect.void;
343
+ return;
344
+ }
345
+ const enriched = event;
346
+ const diagnosticsLevel2 = yield* FiberRef.get(currentDiagnosticsLevel);
347
+ let now;
348
+ const getNow = () => {
349
+ if (now === void 0) now = Date.now();
350
+ return now;
351
+ };
352
+ if (enriched.timestamp === void 0 && (diagnosticsLevel2 !== "off" || enriched.type === "lifecycle:error" || enriched.type === "diagnostic")) {
353
+ ;
354
+ enriched.timestamp = getNow();
355
+ }
356
+ if (diagnosticsLevel2 !== "off" && enriched.runtimeLabel === void 0) {
357
+ const runtimeLabel = yield* FiberRef.get(currentRuntimeLabel);
358
+ if (runtimeLabel) {
359
+ ;
360
+ enriched.runtimeLabel = runtimeLabel;
361
+ }
362
+ }
363
+ if (enriched.type === "diagnostic" && enriched.txnId === void 0) {
364
+ const txnId = yield* FiberRef.get(currentTxnId);
365
+ if (txnId) {
366
+ ;
367
+ enriched.txnId = txnId;
368
+ }
369
+ }
370
+ if (diagnosticsLevel2 !== "off" && enriched.type === "trace:effectop" && enriched.linkId === void 0) {
371
+ const linkId = yield* FiberRef.get(currentLinkId);
372
+ if (linkId) {
373
+ ;
374
+ enriched.linkId = linkId;
375
+ }
376
+ }
377
+ if (sinks.length === 1) {
378
+ yield* sinks[0].record(enriched);
379
+ return;
380
+ }
381
+ yield* Effect.forEach(sinks, (sink) => sink.record(enriched), { discard: true });
382
+ });
383
+ var toRuntimeDebugEventRef = (event, options) => {
384
+ const diagnosticsLevel2 = options?.diagnosticsLevel ?? "full";
385
+ if (diagnosticsLevel2 === "off") {
386
+ return void 0;
387
+ }
388
+ const isLightLike = diagnosticsLevel2 === "light" || diagnosticsLevel2 === "sampled";
389
+ const timestamp = typeof event.timestamp === "number" && Number.isFinite(event.timestamp) ? event.timestamp : Date.now();
390
+ const moduleIdRaw = event.moduleId;
391
+ const moduleId = typeof moduleIdRaw === "string" && moduleIdRaw.length > 0 ? moduleIdRaw : "unknown";
392
+ const instanceIdRaw = event.instanceId;
393
+ const instanceId = typeof instanceIdRaw === "string" && instanceIdRaw.length > 0 ? instanceIdRaw : "unknown";
394
+ const runtimeLabelRaw = event.runtimeLabel;
395
+ const runtimeLabel = typeof runtimeLabelRaw === "string" && runtimeLabelRaw.length > 0 ? runtimeLabelRaw : void 0;
396
+ const txnSeqRaw = event.txnSeq;
397
+ const txnSeq = typeof txnSeqRaw === "number" && Number.isFinite(txnSeqRaw) && txnSeqRaw >= 0 ? Math.floor(txnSeqRaw) : 0;
398
+ const txnIdRaw = event.txnId;
399
+ const txnId = typeof txnIdRaw === "string" && txnIdRaw.length > 0 ? txnIdRaw : txnSeq > 0 ? `${instanceId}::t${txnSeq}` : void 0;
400
+ const linkId = (() => {
401
+ const linkIdRaw = event.linkId;
402
+ if (typeof linkIdRaw === "string" && linkIdRaw.length > 0) return linkIdRaw;
403
+ if (typeof event.type !== "string" || !event.type.startsWith("trace:")) {
404
+ return void 0;
405
+ }
406
+ const data = event.data;
407
+ const meta = data?.meta;
408
+ const linkIdFromMeta = meta?.linkId;
409
+ if (typeof linkIdFromMeta === "string" && linkIdFromMeta.length > 0) return linkIdFromMeta;
410
+ return void 0;
411
+ })();
412
+ const eventSeqRaw = options?.eventSeq;
413
+ const eventSeq = typeof eventSeqRaw === "number" && Number.isFinite(eventSeqRaw) && eventSeqRaw > 0 ? Math.floor(eventSeqRaw) : nextEventSeq();
414
+ const eventId = makeEventId(instanceId, eventSeq);
415
+ const base = {
416
+ eventId,
417
+ eventSeq,
418
+ moduleId,
419
+ instanceId,
420
+ runtimeLabel,
421
+ txnSeq,
422
+ txnId,
423
+ linkId,
424
+ timestamp
425
+ };
426
+ let downgrade;
427
+ const withDowngrade = (ref) => {
428
+ if (!downgrade) return ref;
429
+ return { ...ref, downgrade: { reason: downgrade } };
430
+ };
431
+ switch (event.type) {
432
+ case "module:init":
433
+ return withDowngrade({
434
+ ...base,
435
+ kind: "lifecycle",
436
+ label: "module:init"
437
+ });
438
+ case "module:destroy":
439
+ return withDowngrade({
440
+ ...base,
441
+ kind: "lifecycle",
442
+ label: "module:destroy"
443
+ });
444
+ case "lifecycle:phase": {
445
+ const e = event;
446
+ const metaInput = isLightLike ? { type: "lifecycle:phase", phase: e.phase, name: e.name } : { type: "lifecycle:phase", phase: e.phase, name: e.name, payload: e.payload };
447
+ const metaProjection = projectJsonValue(metaInput);
448
+ options?.onMetaProjection?.({
449
+ stats: metaProjection.stats,
450
+ downgrade: metaProjection.downgrade
451
+ });
452
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
453
+ return withDowngrade({
454
+ ...base,
455
+ kind: "lifecycle",
456
+ label: e.name,
457
+ meta: metaProjection.value
458
+ });
459
+ }
460
+ case "action:dispatch": {
461
+ const action = event.action;
462
+ const actionTagRaw = event.actionTag;
463
+ const tag = typeof actionTagRaw === "string" && actionTagRaw.length > 0 ? actionTagRaw : action?._tag ?? action?.type;
464
+ const label = String(tag ?? "action:dispatch");
465
+ const labelNormalized = label.length > 0 ? label : "unknown";
466
+ const unknownAction = event.unknownAction === true ? true : void 0;
467
+ const metaInput = isLightLike ? { actionTag: labelNormalized, ...unknownAction ? { unknownAction: true } : {} } : { action, ...unknownAction ? { unknownAction: true } : {} };
468
+ const metaProjection = projectJsonValue(metaInput);
469
+ options?.onMetaProjection?.({
470
+ stats: metaProjection.stats,
471
+ downgrade: metaProjection.downgrade
472
+ });
473
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
474
+ if (unknownAction) {
475
+ downgrade = mergeDowngrade(downgrade, "unknown");
476
+ }
477
+ return withDowngrade({
478
+ ...base,
479
+ kind: "action",
480
+ label: labelNormalized,
481
+ meta: metaProjection.value
482
+ });
483
+ }
484
+ case "state:update": {
485
+ const e = event;
486
+ const resolveDirtySetRootPaths = () => {
487
+ const resolve = options?.resolveConvergeStaticIr;
488
+ if (!resolve) return void 0;
489
+ const digest = e.staticIrDigest;
490
+ if (typeof digest !== "string" || digest.length === 0) return void 0;
491
+ const dirtySet = e.dirtySet;
492
+ if (!dirtySet || typeof dirtySet !== "object" || Array.isArray(dirtySet)) return void 0;
493
+ const rootIds = dirtySet.rootIds;
494
+ if (!Array.isArray(rootIds) || rootIds.length === 0) return void 0;
495
+ const ir = resolve(digest);
496
+ const fieldPaths = ir?.fieldPaths;
497
+ if (!Array.isArray(fieldPaths) || fieldPaths.length === 0) return void 0;
498
+ const out = [];
499
+ for (const rawId of rootIds) {
500
+ if (typeof rawId !== "number" || !Number.isFinite(rawId)) continue;
501
+ const id = Math.floor(rawId);
502
+ if (id < 0) continue;
503
+ const path = fieldPaths[id];
504
+ if (!Array.isArray(path) || path.length === 0) continue;
505
+ if (!path.every((seg) => typeof seg === "string" && seg.length > 0)) continue;
506
+ out.push(path);
507
+ }
508
+ return out.length > 0 ? out : void 0;
509
+ };
510
+ const dirtySetWithRootPaths = (() => {
511
+ const rootPaths = resolveDirtySetRootPaths();
512
+ if (!rootPaths) return e.dirtySet;
513
+ const dirtySet = e.dirtySet;
514
+ if (!dirtySet || typeof dirtySet !== "object" || Array.isArray(dirtySet)) return e.dirtySet;
515
+ return { ...dirtySet, rootPaths };
516
+ })();
517
+ const metaInput = isLightLike ? {
518
+ state: e.state,
519
+ dirtySet: dirtySetWithRootPaths,
520
+ patchCount: e.patchCount,
521
+ patchesTruncated: e.patchesTruncated,
522
+ patchesTruncatedReason: e.patchesTruncatedReason,
523
+ staticIrDigest: e.staticIrDigest,
524
+ commitMode: e.commitMode,
525
+ priority: e.priority,
526
+ originKind: e.originKind,
527
+ originName: e.originName
528
+ } : {
529
+ state: e.state,
530
+ dirtySet: dirtySetWithRootPaths,
531
+ patchCount: e.patchCount,
532
+ patchesTruncated: e.patchesTruncated,
533
+ patchesTruncatedReason: e.patchesTruncatedReason,
534
+ staticIrDigest: e.staticIrDigest,
535
+ commitMode: e.commitMode,
536
+ priority: e.priority,
537
+ originKind: e.originKind,
538
+ originName: e.originName,
539
+ traitSummary: e.traitSummary,
540
+ replayEvent: e.replayEvent
541
+ };
542
+ const metaProjection = projectJsonValue(metaInput);
543
+ options?.onMetaProjection?.({
544
+ stats: metaProjection.stats,
545
+ downgrade: metaProjection.downgrade
546
+ });
547
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
548
+ if (txnId) {
549
+ lastTxnByInstance.set(instanceId, { txnId, txnSeq });
550
+ backfillPendingTxnAlignment(instanceId, { txnId, txnSeq });
551
+ }
552
+ return withDowngrade({
553
+ ...base,
554
+ kind: "state",
555
+ label: "state:update",
556
+ meta: metaProjection.value
557
+ });
558
+ }
559
+ case "process:start":
560
+ case "process:stop":
561
+ case "process:restart":
562
+ case "process:trigger":
563
+ case "process:dispatch":
564
+ case "process:error": {
565
+ const e = event;
566
+ const ts2 = typeof e.timestampMs === "number" && Number.isFinite(e.timestampMs) ? e.timestampMs : timestamp;
567
+ const metaInput = {
568
+ identity: e.identity,
569
+ severity: e.severity,
570
+ eventSeq: e.eventSeq,
571
+ timestampMs: e.timestampMs,
572
+ trigger: e.trigger,
573
+ dispatch: e.dispatch,
574
+ error: e.error
575
+ };
576
+ const metaProjection = projectJsonValue(metaInput);
577
+ options?.onMetaProjection?.({
578
+ stats: metaProjection.stats,
579
+ downgrade: metaProjection.downgrade
580
+ });
581
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
582
+ const errorSummary = e.type === "process:error" || e.type === "process:restart" ? e.error : void 0;
583
+ return withDowngrade({
584
+ ...base,
585
+ timestamp: ts2,
586
+ kind: "process",
587
+ label: e.type,
588
+ meta: metaProjection.value,
589
+ errorSummary
590
+ });
591
+ }
592
+ case "lifecycle:error": {
593
+ const e = event;
594
+ const summary = toSerializableErrorSummary(e.cause);
595
+ downgrade = mergeDowngrade(downgrade, summary.downgrade);
596
+ const metaInput = isLightLike ? { type: "lifecycle:error", phase: e.phase, name: e.hook } : {
597
+ type: "lifecycle:error",
598
+ phase: e.phase,
599
+ name: e.hook,
600
+ hook: e.hook,
601
+ taskId: e.taskId,
602
+ origin: e.origin,
603
+ txnSeq: e.txnSeq,
604
+ opSeq: e.opSeq
605
+ };
606
+ const metaProjection = projectJsonValue(metaInput);
607
+ options?.onMetaProjection?.({
608
+ stats: metaProjection.stats,
609
+ downgrade: metaProjection.downgrade
610
+ });
611
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
612
+ return withDowngrade({
613
+ ...base,
614
+ kind: "lifecycle",
615
+ label: "lifecycle:error",
616
+ meta: metaProjection.value,
617
+ errorSummary: summary.errorSummary
618
+ });
619
+ }
620
+ case "diagnostic": {
621
+ const e = event;
622
+ const metaInput = {
623
+ code: e.code,
624
+ severity: e.severity,
625
+ message: e.message,
626
+ hint: e.hint,
627
+ actionTag: e.actionTag,
628
+ kind: e.kind,
629
+ trigger: e.trigger
630
+ };
631
+ const metaProjection = projectJsonValue(metaInput);
632
+ options?.onMetaProjection?.({
633
+ stats: metaProjection.stats,
634
+ downgrade: metaProjection.downgrade
635
+ });
636
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
637
+ return withDowngrade({
638
+ ...base,
639
+ kind: "diagnostic",
640
+ label: e.code,
641
+ meta: metaProjection.value
642
+ });
643
+ }
644
+ case "warn:priority-inversion": {
645
+ const e = event;
646
+ const metaInput = isLightLike ? {
647
+ tickSeq: e.tickSeq,
648
+ reason: e.reason,
649
+ selectorId: e.selectorId
650
+ } : {
651
+ tickSeq: e.tickSeq,
652
+ reason: e.reason,
653
+ selectorId: e.selectorId
654
+ };
655
+ const metaProjection = projectJsonValue(metaInput);
656
+ options?.onMetaProjection?.({
657
+ stats: metaProjection.stats,
658
+ downgrade: metaProjection.downgrade
659
+ });
660
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
661
+ return withDowngrade({
662
+ ...base,
663
+ kind: "diagnostic",
664
+ label: e.type,
665
+ meta: metaProjection.value
666
+ });
667
+ }
668
+ case "warn:microtask-starvation": {
669
+ const e = event;
670
+ const metaInput = isLightLike ? {
671
+ tickSeq: e.tickSeq,
672
+ microtaskChainDepth: e.microtaskChainDepth
673
+ } : {
674
+ tickSeq: e.tickSeq,
675
+ microtaskChainDepth: e.microtaskChainDepth
676
+ };
677
+ const metaProjection = projectJsonValue(metaInput);
678
+ options?.onMetaProjection?.({
679
+ stats: metaProjection.stats,
680
+ downgrade: metaProjection.downgrade
681
+ });
682
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
683
+ return withDowngrade({
684
+ ...base,
685
+ kind: "diagnostic",
686
+ label: e.type,
687
+ meta: metaProjection.value
688
+ });
689
+ }
690
+ default: {
691
+ if (typeof event.type !== "string" || !event.type.startsWith("trace:")) {
692
+ return void 0;
693
+ }
694
+ if (event.type === "trace:tick") {
695
+ const data = event.data;
696
+ const metaInput = isLightLike ? {
697
+ tickSeq: data?.tickSeq,
698
+ phase: data?.phase,
699
+ schedule: data?.schedule,
700
+ triggerSummary: data?.triggerSummary,
701
+ anchors: data?.anchors,
702
+ budget: data?.budget,
703
+ backlog: data?.backlog,
704
+ result: data?.result
705
+ } : {
706
+ data
707
+ };
708
+ const metaProjection2 = projectJsonValue(metaInput);
709
+ options?.onMetaProjection?.({
710
+ stats: metaProjection2.stats,
711
+ downgrade: metaProjection2.downgrade
712
+ });
713
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
714
+ return withDowngrade({
715
+ ...base,
716
+ kind: "devtools",
717
+ label: event.type,
718
+ meta: metaProjection2.value
719
+ });
720
+ }
721
+ if (event.type === "trace:txn-lane") {
722
+ const data = event.data;
723
+ const evidence = data?.evidence ?? data;
724
+ const metaProjection2 = projectJsonValue(evidence);
725
+ options?.onMetaProjection?.({
726
+ stats: metaProjection2.stats,
727
+ downgrade: metaProjection2.downgrade
728
+ });
729
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
730
+ const label = typeof evidence?.kind === "string" && evidence.kind.length > 0 ? String(evidence.kind) : "txn-lane";
731
+ return withDowngrade({
732
+ ...base,
733
+ kind: "txn-lane",
734
+ label,
735
+ meta: metaProjection2.value
736
+ });
737
+ }
738
+ if (event.type === "trace:react-render" || event.type === "trace:react-selector") {
739
+ const data = event.data;
740
+ const metaProjection2 = projectJsonValue(
741
+ isLightLike ? {
742
+ componentLabel: data?.componentLabel,
743
+ selectorKey: data?.selectorKey,
744
+ fieldPaths: data?.fieldPaths,
745
+ selectorId: data?.selectorId,
746
+ lane: data?.lane,
747
+ producer: data?.producer,
748
+ fallbackReason: data?.fallbackReason,
749
+ readsDigest: data?.readsDigest,
750
+ equalsKind: data?.equalsKind,
751
+ strictModePhase: data?.strictModePhase
752
+ } : {
753
+ componentLabel: data?.componentLabel,
754
+ selectorKey: data?.selectorKey,
755
+ fieldPaths: data?.fieldPaths,
756
+ selectorId: data?.selectorId,
757
+ lane: data?.lane,
758
+ producer: data?.producer,
759
+ fallbackReason: data?.fallbackReason,
760
+ readsDigest: data?.readsDigest,
761
+ equalsKind: data?.equalsKind,
762
+ strictModePhase: data?.strictModePhase,
763
+ meta: data?.meta
764
+ }
765
+ );
766
+ options?.onMetaProjection?.({
767
+ stats: metaProjection2.stats,
768
+ downgrade: metaProjection2.downgrade
769
+ });
770
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
771
+ const label = typeof data?.componentLabel === "string" && data.componentLabel.length > 0 ? data.componentLabel : event.type === "trace:react-selector" ? "react-selector" : "react-render";
772
+ const last = lastTxnByInstance.get(instanceId);
773
+ const txnSeqFromMeta = typeof data?.meta?.txnSeq === "number" && Number.isFinite(data.meta.txnSeq) && data.meta.txnSeq >= 0 ? Math.floor(data.meta.txnSeq) : void 0;
774
+ const txnIdFromMeta = typeof data?.meta?.txnId === "string" && data.meta.txnId.length > 0 ? data.meta.txnId : void 0;
775
+ const txnIdAligned = txnIdFromMeta ?? base.txnId ?? last?.txnId;
776
+ const txnSeqAligned = txnSeqFromMeta ?? (base.txnSeq > 0 ? base.txnSeq : last?.txnSeq ?? base.txnSeq);
777
+ const ref = withDowngrade({
778
+ ...base,
779
+ txnId: txnIdAligned,
780
+ txnSeq: txnSeqAligned,
781
+ kind: event.type === "trace:react-selector" ? "react-selector" : "react-render",
782
+ label,
783
+ meta: metaProjection2.value
784
+ });
785
+ if (instanceId !== "unknown" && (ref.txnId == null || ref.txnSeq <= 0)) {
786
+ enqueuePendingTxnAlignment(instanceId, ref);
787
+ }
788
+ return ref;
789
+ }
790
+ if (event.type === "trace:selector:eval") {
791
+ const data = event.data;
792
+ const metaInput = {
793
+ selectorId: data?.selectorId,
794
+ lane: data?.lane,
795
+ producer: data?.producer,
796
+ fallbackReason: data?.fallbackReason,
797
+ readsDigest: data?.readsDigest,
798
+ equalsKind: data?.equalsKind,
799
+ changed: data?.changed,
800
+ evalMs: data?.evalMs
801
+ };
802
+ const metaProjection2 = projectJsonValue(metaInput);
803
+ options?.onMetaProjection?.({
804
+ stats: metaProjection2.stats,
805
+ downgrade: metaProjection2.downgrade
806
+ });
807
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
808
+ return withDowngrade({
809
+ ...base,
810
+ kind: "devtools",
811
+ label: event.type,
812
+ meta: metaProjection2.value
813
+ });
814
+ }
815
+ if (event.type === "trace:exec-vm") {
816
+ const data = event.data;
817
+ const metaInput = {
818
+ version: data?.version,
819
+ stage: data?.stage,
820
+ hit: data?.hit,
821
+ reasonCode: data?.reasonCode ?? data?.reason,
822
+ reasonDetail: data?.reasonDetail,
823
+ execIrVersion: data?.execIrVersion,
824
+ execIrHash: data?.execIrHash,
825
+ serviceId: data?.serviceId,
826
+ implId: data?.implId
827
+ };
828
+ const metaProjection2 = projectJsonValue(metaInput);
829
+ options?.onMetaProjection?.({
830
+ stats: metaProjection2.stats,
831
+ downgrade: metaProjection2.downgrade
832
+ });
833
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
834
+ return withDowngrade({
835
+ ...base,
836
+ kind: "devtools",
837
+ label: event.type,
838
+ meta: metaProjection2.value
839
+ });
840
+ }
841
+ if (event.type === "trace:trait:converge") {
842
+ const resolveDirtyRootPaths = (args) => {
843
+ const resolve = options?.resolveConvergeStaticIr;
844
+ if (!resolve) return void 0;
845
+ const digest = args.staticIrDigest;
846
+ if (typeof digest !== "string" || digest.length === 0) return void 0;
847
+ const rootIds = args.rootIds;
848
+ if (!Array.isArray(rootIds) || rootIds.length === 0) return void 0;
849
+ const ir = resolve(digest);
850
+ const fieldPaths = ir?.fieldPaths;
851
+ if (!Array.isArray(fieldPaths) || fieldPaths.length === 0) return void 0;
852
+ const out = [];
853
+ for (const id of rootIds) {
854
+ if (typeof id !== "number" || !Number.isFinite(id)) continue;
855
+ const idx = Math.floor(id);
856
+ if (idx < 0 || idx >= fieldPaths.length) continue;
857
+ const path = fieldPaths[idx];
858
+ if (Array.isArray(path)) {
859
+ out.push(path);
860
+ }
861
+ }
862
+ return out.length > 0 ? out : void 0;
863
+ };
864
+ const enrichDirtyRootPaths = (value) => {
865
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
866
+ const anyValue = value;
867
+ const dirty = anyValue.dirty;
868
+ if (!dirty || typeof dirty !== "object" || Array.isArray(dirty)) return value;
869
+ const dirtyRootPaths = resolveDirtyRootPaths({
870
+ staticIrDigest: anyValue.staticIrDigest,
871
+ rootIds: dirty?.rootIds
872
+ });
873
+ if (!dirtyRootPaths) return value;
874
+ return {
875
+ ...anyValue,
876
+ dirty: {
877
+ ...dirty,
878
+ rootPaths: dirtyRootPaths
879
+ }
880
+ };
881
+ };
882
+ const stripHeavyLight = (value) => {
883
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
884
+ const anyValue = value;
885
+ const dirty = anyValue.dirty;
886
+ const dirtyRootPaths = resolveDirtyRootPaths({
887
+ staticIrDigest: anyValue.staticIrDigest,
888
+ rootIds: dirty?.rootIds
889
+ });
890
+ const dirtySlim = dirty && typeof dirty === "object" && !Array.isArray(dirty) ? {
891
+ dirtyAll: dirty.dirtyAll,
892
+ ...typeof dirty.reason === "string" ? { reason: dirty.reason } : null,
893
+ ...Array.isArray(dirty.rootIds) ? { rootIds: dirty.rootIds } : null,
894
+ ...typeof dirty.rootIdsTruncated === "boolean" ? { rootIdsTruncated: dirty.rootIdsTruncated } : null,
895
+ ...dirtyRootPaths ? { rootPaths: dirtyRootPaths } : null
896
+ } : void 0;
897
+ const { top3, dirtyRoots, ...rest } = anyValue;
898
+ return dirtySlim ? { ...rest, dirty: dirtySlim } : rest;
899
+ };
900
+ const stripHeavySampled = (value) => {
901
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
902
+ const anyValue = value;
903
+ const dirty = anyValue.dirty;
904
+ const dirtySlim = dirty && typeof dirty === "object" && !Array.isArray(dirty) ? {
905
+ dirtyAll: dirty.dirtyAll,
906
+ ...typeof dirty.reason === "string" ? { reason: dirty.reason } : null
907
+ } : void 0;
908
+ const { dirtyRoots, ...rest } = anyValue;
909
+ return dirtySlim ? { ...rest, dirty: dirtySlim } : rest;
910
+ };
911
+ const data = event.data;
912
+ const metaInput = diagnosticsLevel2 === "light" ? stripHeavyLight(data) : diagnosticsLevel2 === "sampled" ? stripHeavySampled(data) : enrichDirtyRootPaths(data);
913
+ const metaProjection2 = projectJsonValue(metaInput);
914
+ options?.onMetaProjection?.({
915
+ stats: metaProjection2.stats,
916
+ downgrade: metaProjection2.downgrade
917
+ });
918
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
919
+ return withDowngrade({
920
+ ...base,
921
+ kind: "trait:converge",
922
+ label: "trait:converge",
923
+ meta: metaProjection2.value
924
+ });
925
+ }
926
+ if (event.type === "trace:trait:check") {
927
+ const stripHeavy = (value) => {
928
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
929
+ const anyValue = value;
930
+ const degraded = anyValue.degraded;
931
+ const degradedSlim = degraded && typeof degraded === "object" && !Array.isArray(degraded) ? { kind: degraded.kind } : void 0;
932
+ const { degraded: _degraded, ...rest } = anyValue;
933
+ return degradedSlim ? { ...rest, degraded: degradedSlim } : rest;
934
+ };
935
+ const data = event.data;
936
+ const metaInput = isLightLike ? stripHeavy(data) : data;
937
+ const metaProjection2 = projectJsonValue(metaInput);
938
+ options?.onMetaProjection?.({
939
+ stats: metaProjection2.stats,
940
+ downgrade: metaProjection2.downgrade
941
+ });
942
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
943
+ return withDowngrade({
944
+ ...base,
945
+ kind: "trait:check",
946
+ label: "trait:check",
947
+ meta: metaProjection2.value
948
+ });
949
+ }
950
+ if (event.type === "trace:trait:validate") {
951
+ const data = event.data;
952
+ const metaProjection2 = projectJsonValue(data);
953
+ options?.onMetaProjection?.({
954
+ stats: metaProjection2.stats,
955
+ downgrade: metaProjection2.downgrade
956
+ });
957
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
958
+ return withDowngrade({
959
+ ...base,
960
+ kind: "trait:validate",
961
+ label: "trait:validate",
962
+ meta: metaProjection2.value
963
+ });
964
+ }
965
+ if (event.type === "trace:module:traits") {
966
+ const data = event.data;
967
+ const metaInput = isLightLike ? {
968
+ digest: data?.digest,
969
+ count: data?.count
970
+ } : {
971
+ digest: data?.digest,
972
+ count: data?.count,
973
+ traits: data?.traits,
974
+ provenanceIndex: data?.provenanceIndex
975
+ };
976
+ const metaProjection2 = projectJsonValue(metaInput);
977
+ options?.onMetaProjection?.({
978
+ stats: metaProjection2.stats,
979
+ downgrade: metaProjection2.downgrade
980
+ });
981
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
982
+ return withDowngrade({
983
+ ...base,
984
+ kind: "devtools",
985
+ label: event.type,
986
+ meta: metaProjection2.value
987
+ });
988
+ }
989
+ if (event.type === "trace:module:traits:conflict") {
990
+ const data = event.data;
991
+ const metaInput = isLightLike ? {
992
+ conflictCount: data?.conflictCount,
993
+ traitIds: data?.traitIds
994
+ } : {
995
+ conflictCount: data?.conflictCount,
996
+ conflicts: data?.conflicts
997
+ };
998
+ const metaProjection2 = projectJsonValue(metaInput);
999
+ options?.onMetaProjection?.({
1000
+ stats: metaProjection2.stats,
1001
+ downgrade: metaProjection2.downgrade
1002
+ });
1003
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
1004
+ return withDowngrade({
1005
+ ...base,
1006
+ kind: "devtools",
1007
+ label: event.type,
1008
+ meta: metaProjection2.value
1009
+ });
1010
+ }
1011
+ if (event.type === "trace:module:descriptor") {
1012
+ const data = event.data;
1013
+ const metaInput = isLightLike ? {
1014
+ id: data?.id,
1015
+ traits: data?.traits,
1016
+ source: data?.source
1017
+ } : { data };
1018
+ const metaProjection2 = projectJsonValue(metaInput);
1019
+ options?.onMetaProjection?.({
1020
+ stats: metaProjection2.stats,
1021
+ downgrade: metaProjection2.downgrade
1022
+ });
1023
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
1024
+ return withDowngrade({
1025
+ ...base,
1026
+ kind: "devtools",
1027
+ label: event.type,
1028
+ meta: metaProjection2.value
1029
+ });
1030
+ }
1031
+ if (event.type === "trace:effectop") {
1032
+ const data = event.data;
1033
+ const opMeta = data?.meta;
1034
+ const opKind = data?.kind ?? "service";
1035
+ const label = typeof data?.name === "string" ? data.name : "effectop";
1036
+ const moduleId2 = typeof opMeta?.moduleId === "string" ? opMeta.moduleId : moduleId;
1037
+ const txnId2 = typeof opMeta?.txnId === "string" && opMeta.txnId.length > 0 ? opMeta.txnId : base.txnId;
1038
+ const txnSeq2 = typeof opMeta?.txnSeq === "number" && Number.isFinite(opMeta.txnSeq) && opMeta.txnSeq >= 0 ? Math.floor(opMeta.txnSeq) : base.txnSeq;
1039
+ const metaInput = isLightLike ? {
1040
+ id: data?.id,
1041
+ kind: data?.kind,
1042
+ name: data?.name,
1043
+ meta: opMeta
1044
+ } : {
1045
+ id: data?.id,
1046
+ kind: data?.kind,
1047
+ name: data?.name,
1048
+ payload: data?.payload,
1049
+ meta: opMeta
1050
+ };
1051
+ const metaProjection2 = projectJsonValue(metaInput);
1052
+ options?.onMetaProjection?.({
1053
+ stats: metaProjection2.stats,
1054
+ downgrade: metaProjection2.downgrade
1055
+ });
1056
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
1057
+ return withDowngrade({
1058
+ ...base,
1059
+ moduleId: moduleId2,
1060
+ txnId: txnId2,
1061
+ txnSeq: txnSeq2,
1062
+ kind: opKind,
1063
+ label,
1064
+ meta: metaProjection2.value
1065
+ });
1066
+ }
1067
+ const metaProjection = projectJsonValue(
1068
+ isLightLike ? {
1069
+ data: void 0
1070
+ } : {
1071
+ data: event.data
1072
+ }
1073
+ );
1074
+ options?.onMetaProjection?.({
1075
+ stats: metaProjection.stats,
1076
+ downgrade: metaProjection.downgrade
1077
+ });
1078
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
1079
+ return withDowngrade({
1080
+ ...base,
1081
+ kind: "devtools",
1082
+ label: event.type,
1083
+ meta: metaProjection.value
1084
+ });
1085
+ }
1086
+ }
1087
+ };
1088
+
1089
+ export {
1090
+ toSerializableErrorSummary,
1091
+ currentDebugSinks,
1092
+ currentRuntimeLabel,
1093
+ currentTxnId,
1094
+ currentOpSeq,
1095
+ currentDiagnosticsLevel,
1096
+ diagnosticsLevel,
1097
+ currentTraitConvergeDiagnosticsSampling,
1098
+ traitConvergeDiagnosticsSampling,
1099
+ appendSinks,
1100
+ clearRuntimeDebugEventSeq,
1101
+ noopLayer,
1102
+ errorOnlyLayer,
1103
+ isErrorOnlyOnlySinks,
1104
+ browserConsoleLayer,
1105
+ browserDiagnosticConsoleLayer,
1106
+ record,
1107
+ toRuntimeDebugEventRef
1108
+ };
1109
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0RlYnVnU2luay5yZWNvcmQudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL2Vycm9yU3VtbWFyeS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQ2F1c2UsIEVmZmVjdCwgRmliZXJSZWYsIExheWVyLCBMb2dnZXIgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQge1xuICBwcm9qZWN0SnNvblZhbHVlLFxuICB0eXBlIERvd25ncmFkZVJlYXNvbiBhcyBKc29uRG93bmdyYWRlUmVhc29uLFxuICB0eXBlIEpzb25WYWx1ZSxcbiAgdHlwZSBKc29uVmFsdWVQcm9qZWN0aW9uU3RhdHMsXG59IGZyb20gJy4uLy4uL29ic2VydmFiaWxpdHkvanNvblZhbHVlLmpzJ1xuaW1wb3J0IHR5cGUgKiBhcyBSZXBsYXlMb2cgZnJvbSAnLi9SZXBsYXlMb2cuanMnXG5pbXBvcnQge1xuICB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSxcbiAgdHlwZSBEb3duZ3JhZGVSZWFzb24gYXMgRXJyb3JEb3duZ3JhZGVSZWFzb24sXG4gIHR5cGUgU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5LFxufSBmcm9tICcuL2Vycm9yU3VtbWFyeS5qcydcbmltcG9ydCAqIGFzIEVmZmVjdE9wQ29yZSBmcm9tICcuL0VmZmVjdE9wQ29yZS5qcydcbmltcG9ydCB0eXBlICogYXMgUHJvY2Vzc1Byb3RvY29sIGZyb20gJy4vcHJvY2Vzcy9wcm90b2NvbC5qcydcbmltcG9ydCB0eXBlIHsgQ29udmVyZ2VTdGF0aWNJckV4cG9ydCB9IGZyb20gJy4uLy4uL3N0YXRlLXRyYWl0L2NvbnZlcmdlLWlyLmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyaWdnZXJSZWYge1xuICByZWFkb25seSBraW5kOiBzdHJpbmdcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZ1xuICByZWFkb25seSBkZXRhaWxzPzogdW5rbm93blxufVxuXG50eXBlIFRyYWNlRXZlbnRUeXBlID0gYHRyYWNlOiR7c3RyaW5nfWBcbnR5cGUgR2VuZXJpY1RyYWNlRXZlbnRUeXBlID0gRXhjbHVkZTxcbiAgVHJhY2VFdmVudFR5cGUsXG4gICd0cmFjZTp0cmFpdDpjb252ZXJnZScgfCAndHJhY2U6dHJhaXQ6Y2hlY2snIHwgJ3RyYWNlOnRyYWl0OnZhbGlkYXRlJ1xuPlxuXG4vKipcbiAqIFJlcGxheUV2ZW50UmVmXHVGRjFBXG4gKiAtIFJlcGxheSBldmVudCBzdHJ1Y3R1cmUgcmVmZXJlbmNlZCBmcm9tIERlYnVnIGV2ZW50cy5cbiAqIC0gQmFzZWQgb24gUmVwbGF5TG9nLkV2ZW50LCBlbnJpY2hlZCB3aXRoIHR4bi90cmlnZ2VyIGFzc29jaWF0aW9uIGZpZWxkcyBmb3IgRGV2dG9vbHMgYWdncmVnYXRpb24gYW5kIGV4cGxhbmF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBSZXBsYXlFdmVudFJlZiA9IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCAmIHtcbiAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgdHJpZ2dlcj86IFRyaWdnZXJSZWZcbn1cblxuZXhwb3J0IHR5cGUgRXZlbnQgPVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdtb2R1bGU6aW5pdCdcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAnbW9kdWxlOmRlc3Ryb3knXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ2xpZmVjeWNsZTpwaGFzZSdcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBwaGFzZTogJ2luaXQnIHwgJ3J1bicgfCAnZGVzdHJveScgfCAncGxhdGZvcm0nXG4gICAgICByZWFkb25seSBuYW1lOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHBheWxvYWQ/OiB1bmtub3duXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAnYWN0aW9uOmRpc3BhdGNoJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGFjdGlvbjogdW5rbm93blxuICAgICAgcmVhZG9ubHkgYWN0aW9uVGFnPzogc3RyaW5nXG4gICAgICByZWFkb25seSB1bmtub3duQWN0aW9uPzogYm9vbGVhblxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ3N0YXRlOnVwZGF0ZSdcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBzdGF0ZTogdW5rbm93blxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgLyoqXG4gICAgICAgKiBPcHRpb25hbDogU3RhdGljIElSIGRpZ2VzdCBhbGlnbmVkIHdpdGggRmllbGRQYXRoSWQvU3RlcElkIChmb3IgY29uc3VtZXItc2lkZSByZXZlcnNlLW1hcHBpbmcgJiBhbGlnbm1lbnQpLlxuICAgICAgICogLSBXaGVuIG1pc3Npbmcgb3IgbWlzbWF0Y2hlZCwgY29uc3VtZXJzIG11c3Qgbm90IGF0dGVtcHQgdG8gcmV2ZXJzZS1tYXAgcm9vdElkcyAtPiByb290UGF0aHMgKGF2b2lkIHdyb25nIFVJKS5cbiAgICAgICAqIC0gQWxsb3dlZCB0byBiZSBvbWl0dGVkIG9uIG5lYXItemVyby1jb3N0IGRpYWdub3N0aWNzPW9mZiBwYXRocy5cbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgc3RhdGljSXJEaWdlc3Q/OiBzdHJpbmdcbiAgICAgIC8qKlxuICAgICAgICogT3B0aW9uYWw6IHRoZSBhZmZlY3RlZCBzY29wZSBhZ2dyZWdhdGVkIGJ5IHRoaXMgY29tbWl0IChmaWVsZC1sZXZlbCBkaXJ0eS1zZXQpLlxuICAgICAgICogLSBQb3B1bGF0ZWQgYnkgUnVudGltZSBhdCBjb21taXQgdGltZTtcbiAgICAgICAqIC0gTXVzdCBzdGF5IHNsaW0gYW5kIHNlcmlhbGl6YWJsZTtcbiAgICAgICAqIC0gRGV2dG9vbHMgY2FuIHVzZSBpdCB0byBleHBsYWluIFwid2h5IGNvbnZlcmdlL3ZhbGlkYXRlIHJhbiAvIHdoeSBpdCBkZWdyYWRlZCB0byBmdWxsXCIuXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IGRpcnR5U2V0PzogdW5rbm93blxuICAgICAgLyoqXG4gICAgICAgKiBPcHRpb25hbDogcGF0Y2ggY291bnQgYWdncmVnYXRlZCBieSB0aGlzIGNvbW1pdCAoZnJvbSBTdGF0ZVRyYW5zYWN0aW9uKS5cbiAgICAgICAqIC0gUG9wdWxhdGVkIGJ5IFJ1bnRpbWUgb25seSBvbiB0cmFuc2FjdGlvbiBwYXRocy5cbiAgICAgICAqIC0gRGV2dG9vbHMgY2FuIHVzZSBpdCBhcyBhIGxpZ2h0d2VpZ2h0IHRyYW5zYWN0aW9uIHN1bW1hcnkgbWV0cmljLlxuICAgICAgICovXG4gICAgICByZWFkb25seSBwYXRjaENvdW50PzogbnVtYmVyXG4gICAgICAvKipcbiAgICAgICAqIE9wdGlvbmFsOiB3aGV0aGVyIHBhdGNoIHJlY29yZHMgd2VyZSB0cnVuY2F0ZWQgKGJvdW5kZWQpIHVuZGVyIGZ1bGwgaW5zdHJ1bWVudGF0aW9uLlxuICAgICAgICovXG4gICAgICByZWFkb25seSBwYXRjaGVzVHJ1bmNhdGVkPzogYm9vbGVhblxuICAgICAgLyoqXG4gICAgICAgKiBPcHRpb25hbDogdHJ1bmNhdGlvbiByZWFzb24gY29kZSAoc3RhYmxlIGVudW0pLlxuICAgICAgICovXG4gICAgICByZWFkb25seSBwYXRjaGVzVHJ1bmNhdGVkUmVhc29uPzogJ21heF9wYXRjaGVzJ1xuICAgICAgLyoqXG4gICAgICAgKiBPcHRpb25hbDogY29tbWl0IG1vZGUgKG5vcm1hbC9iYXRjaGVkL2xvdy1wcmlvcml0eSwgZXRjKS5cbiAgICAgICAqIC0gUG9wdWxhdGVkIGJ5IFJ1bnRpbWU7XG4gICAgICAgKiAtIERlZmF1bHQgaXMgY2hvc2VuIGJ5IHRoZSBjYWxsZXIgKHR5cGljYWxseSBcIm5vcm1hbFwiKS5cbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgY29tbWl0TW9kZT86IHN0cmluZ1xuICAgICAgLyoqXG4gICAgICAgKiBPcHRpb25hbDogZXh0ZXJuYWwgdmlzaWJpbGl0eSBwcmlvcml0eSAobm9ybWFsL2xvdykuXG4gICAgICAgKiAtIFBvcHVsYXRlZCBieSBSdW50aW1lLlxuICAgICAgICogLSBNYWlubHkgdXNlZCBieSBSZWFjdCBleHRlcm5hbCBzdWJzY3JpcHRpb24gc2NoZWR1bGluZyAoYXZvaWQgdW5uZWNlc3NhcnkgcmVuZGVycykuXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHByaW9yaXR5Pzogc3RyaW5nXG4gICAgICAvKipcbiAgICAgICAqIE9wdGlvbmFsOiB0cmFuc2FjdGlvbiBvcmlnaW4ga2luZCAob3JpZ2luLmtpbmQpIHRoYXQgdHJpZ2dlcmVkIHRoaXMgc3RhdGUgY29tbWl0OlxuICAgICAgICogLSBlLmcuIFwiYWN0aW9uXCIgLyBcInNvdXJjZS1yZWZyZXNoXCIgLyBcInNlcnZpY2UtY2FsbGJhY2tcIiAvIFwiZGV2dG9vbHNcIi5cbiAgICAgICAqIC0gUG9wdWxhdGVkIGJ5IFJ1bnRpbWUgb25seSBvbiBTdGF0ZVRyYW5zYWN0aW9uLWJhc2VkIHBhdGhzLlxuICAgICAgICogLSBEZXZ0b29scyBjYW4gZGlzdGluZ3Vpc2ggYXBwIHRyYW5zYWN0aW9ucyB2cyBkZXZ0b29scyB0aW1lLXRyYXZlbCBvcGVyYXRpb25zLlxuICAgICAgICovXG4gICAgICByZWFkb25seSBvcmlnaW5LaW5kPzogc3RyaW5nXG4gICAgICAvKipcbiAgICAgICAqIE9wdGlvbmFsOiB0cmFuc2FjdGlvbiBvcmlnaW4gbmFtZSAob3JpZ2luLm5hbWUpIHRoYXQgdHJpZ2dlcmVkIHRoaXMgc3RhdGUgY29tbWl0OlxuICAgICAgICogLSBlLmcuIGFjdGlvbiBkaXNwYXRjaCAvIGZpZWxkUGF0aCAvIHRhc2s6c3VjY2Vzcy90YXNrOmZhaWx1cmUsIGV0Yy5cbiAgICAgICAqIC0gUG9wdWxhdGVkIGJ5IFJ1bnRpbWUgb25seSBvbiBTdGF0ZVRyYW5zYWN0aW9uLWJhc2VkIHBhdGhzLlxuICAgICAgICovXG4gICAgICByZWFkb25seSBvcmlnaW5OYW1lPzogc3RyaW5nXG4gICAgICAvKipcbiAgICAgICAqIFJlc2VydmVkOiBUcmFpdCBjb252ZXJnZSBzdW1tYXJ5IChmb3IgRGV2dG9vbHMgd2luZG93LWxldmVsIHN0YXRzIC8gVG9wTiBjb3N0cyAvIGRlZ3JhZGUgcmVhc29ucywgZXRjLikuXG4gICAgICAgKiAtIFBoYXNlIDI6IGZpZWxkIHNsb3Qgb25seTsgc3RydWN0dXJlIGlzIG5vdCBmaXhlZC5cbiAgICAgICAqIC0gTGF0ZXIgcGhhc2VzIHdpbGwgYWxpZ24gd2l0aCB0aGUgVHJhaXQvUmVwbGF5IGV2ZW50IG1vZGVsIGludG8gYW4gZXhwbGFpbmFibGUgc3RydWN0dXJlLlxuICAgICAgICovXG4gICAgICByZWFkb25seSB0cmFpdFN1bW1hcnk/OiB1bmtub3duXG4gICAgICAvKipcbiAgICAgICAqIFJlc2VydmVkOiByZXBsYXkgZXZlbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24gKHJlLWVtaXQgc291cmNlIG9mIHRydXRoIGZyb20gUmVwbGF5TG9nKS5cbiAgICAgICAqIC0gUGhhc2UgMjogZmllbGQgc2xvdCBvbmx5LlxuICAgICAgICogLSBMYXRlciBwaGFzZXMgd2lsbCBhbGlnbiB3aXRoIFJlcGxheUxvZy5FdmVudCBzdHJ1Y3R1cmUuXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHJlcGxheUV2ZW50PzogUmVwbGF5RXZlbnRSZWZcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6XG4gICAgICAgIHwgJ3Byb2Nlc3M6c3RhcnQnXG4gICAgICAgIHwgJ3Byb2Nlc3M6c3RvcCdcbiAgICAgICAgfCAncHJvY2VzczpyZXN0YXJ0J1xuICAgICAgICB8ICdwcm9jZXNzOnRyaWdnZXInXG4gICAgICAgIHwgJ3Byb2Nlc3M6ZGlzcGF0Y2gnXG4gICAgICAgIHwgJ3Byb2Nlc3M6ZXJyb3InXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaWRlbnRpdHk6IFByb2Nlc3NQcm90b2NvbC5Qcm9jZXNzSW5zdGFuY2VJZGVudGl0eVxuICAgICAgcmVhZG9ubHkgc2V2ZXJpdHk6ICdpbmZvJyB8ICd3YXJuaW5nJyB8ICdlcnJvcidcbiAgICAgIHJlYWRvbmx5IGV2ZW50U2VxOiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcE1zOiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHRyaWdnZXI/OiBQcm9jZXNzUHJvdG9jb2wuUHJvY2Vzc1RyaWdnZXJcbiAgICAgIHJlYWRvbmx5IGRpc3BhdGNoPzoge1xuICAgICAgICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gICAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICAgICAgICByZWFkb25seSBhY3Rpb25JZDogc3RyaW5nXG4gICAgICB9XG4gICAgICByZWFkb25seSBlcnJvcj86IFByb2Nlc3NQcm90b2NvbC5TZXJpYWxpemFibGVFcnJvclN1bW1hcnlcbiAgICAgIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdsaWZlY3ljbGU6ZXJyb3InXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgY2F1c2U6IHVua25vd25cbiAgICAgIHJlYWRvbmx5IHBoYXNlPzogJ2luaXQnIHwgJ3J1bicgfCAnZGVzdHJveScgfCAncGxhdGZvcm0nXG4gICAgICByZWFkb25seSBob29rPzogJ2luaXRSZXF1aXJlZCcgfCAnc3RhcnQnIHwgJ2Rlc3Ryb3knIHwgJ3N1c3BlbmQnIHwgJ3Jlc3VtZScgfCAncmVzZXQnIHwgJ3Vua25vd24nXG4gICAgICByZWFkb25seSB0YXNrSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IG9wU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSBvcmlnaW4/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ2RpYWdub3N0aWMnXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgY29kZTogc3RyaW5nXG4gICAgICByZWFkb25seSBzZXZlcml0eTogJ2Vycm9yJyB8ICd3YXJuaW5nJyB8ICdpbmZvJ1xuICAgICAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nXG4gICAgICByZWFkb25seSBoaW50Pzogc3RyaW5nXG4gICAgICByZWFkb25seSBhY3Rpb25UYWc/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGtpbmQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRyaWdnZXI/OiBUcmlnZ2VyUmVmXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAnd2Fybjpwcmlvcml0eS1pbnZlcnNpb24nXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGlja1NlcTogbnVtYmVyXG4gICAgICByZWFkb25seSByZWFzb246ICdkZWZlcnJlZEJhY2tsb2cnIHwgJ3N1YnNjcmliZWROb25VcmdlbnQnXG4gICAgICByZWFkb25seSBzZWxlY3RvcklkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAnd2FybjptaWNyb3Rhc2stc3RhcnZhdGlvbidcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aWNrU2VxOiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IG1pY3JvdGFza0NoYWluRGVwdGg/OiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICAvKipcbiAgICogdHJhY2U6KiBldmVudHM6XG4gICAqIC0gRXh0ZW5zaW9uIGhvb2sgZm9yIHJ1bnRpbWUgdHJhY2luZyAvIFBsYXlncm91bmQgLyBBbGlnbm1lbnQgTGFiLlxuICAgKiAtIE9ubHkgdGhlIHR5cGUgcHJlZml4IGFuZCBtb2R1bGVJZCBhcmUgc3RhbmRhcmRpemVkOyBwYXlsb2FkIHNoYXBlIGlzIGRlZmluZWQgYnkgaGlnaGVyIGxheWVycyAoZS5nLiBzcGFuSWQvYXR0cmlidXRlcyBpbiBkYXRhKS5cbiAgICovXG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ3RyYWNlOnRyYWl0OmNvbnZlcmdlJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGRhdGE6IEpzb25WYWx1ZVxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ3RyYWNlOnRyYWl0OmNoZWNrJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGRhdGE6IEpzb25WYWx1ZVxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ3RyYWNlOnRyYWl0OnZhbGlkYXRlJ1xuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGRhdGE6IEpzb25WYWx1ZVxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogR2VuZXJpY1RyYWNlRXZlbnRUeXBlXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgZGF0YT86IHVua25vd25cbiAgICAgIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpbmsge1xuICByZWFkb25seSByZWNvcmQ6IChldmVudDogRXZlbnQpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZD5cbn1cbmV4cG9ydCBjb25zdCBjdXJyZW50RGVidWdTaW5rcyA9IEZpYmVyUmVmLnVuc2FmZU1ha2U8UmVhZG9ubHlBcnJheTxTaW5rPj4oW10pXG5leHBvcnQgY29uc3QgY3VycmVudFJ1bnRpbWVMYWJlbCA9IEZpYmVyUmVmLnVuc2FmZU1ha2U8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG5leHBvcnQgY29uc3QgY3VycmVudFR4bklkID0gRmliZXJSZWYudW5zYWZlTWFrZTxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbmV4cG9ydCBjb25zdCBjdXJyZW50T3BTZXEgPSBGaWJlclJlZi51bnNhZmVNYWtlPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuZXhwb3J0IHR5cGUgRGlhZ25vc3RpY3NMZXZlbCA9ICdvZmYnIHwgJ2xpZ2h0JyB8ICdzYW1wbGVkJyB8ICdmdWxsJ1xuZXhwb3J0IGNvbnN0IGN1cnJlbnREaWFnbm9zdGljc0xldmVsID0gRmliZXJSZWYudW5zYWZlTWFrZTxEaWFnbm9zdGljc0xldmVsPignb2ZmJylcblxuZXhwb3J0IGNvbnN0IGRpYWdub3N0aWNzTGV2ZWwgPSAobGV2ZWw6IERpYWdub3N0aWNzTGV2ZWwpOiBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj4gPT5cbiAgTGF5ZXIuZmliZXJSZWZMb2NhbGx5U2NvcGVkV2l0aChjdXJyZW50RGlhZ25vc3RpY3NMZXZlbCBhcyBhbnksICgpID0+IGxldmVsKSBhcyBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj5cblxuZXhwb3J0IGludGVyZmFjZSBUcmFpdENvbnZlcmdlRGlhZ25vc3RpY3NTYW1wbGluZ0NvbmZpZyB7XG4gIC8qKlxuICAgKiBTYW1wbGUgb25jZSBldmVyeSBOIHR4bnMgKGRldGVybWluaXN0aWMsIGJhc2VkIG9uIHN0YWJsZSB0eG5TZXEpLlxuICAgKiAtIDE6IHNhbXBsZSBldmVyeSB0eG4gKHRpbWluZyBncmFudWxhcml0eSBzaW1pbGFyIHRvIGZ1bGwsIHdoaWxlIGtlZXBpbmcgcGF5bG9hZCBzbGltKVxuICAgKi9cbiAgcmVhZG9ubHkgc2FtcGxlRXZlcnlOOiBudW1iZXJcbiAgLyoqXG4gICAqIE1heCBudW1iZXIgb2YgVG9wSyBob3RzcG90cyB0byBvdXRwdXQgKHJlY29tbWVuZGVkIFx1MjI2NCAzKS5cbiAgICovXG4gIHJlYWRvbmx5IHRvcEs6IG51bWJlclxufVxuXG5leHBvcnQgY29uc3QgY3VycmVudFRyYWl0Q29udmVyZ2VEaWFnbm9zdGljc1NhbXBsaW5nID0gRmliZXJSZWYudW5zYWZlTWFrZTxUcmFpdENvbnZlcmdlRGlhZ25vc3RpY3NTYW1wbGluZ0NvbmZpZz4oe1xuICBzYW1wbGVFdmVyeU46IDMyLFxuICB0b3BLOiAzLFxufSlcblxuZXhwb3J0IGNvbnN0IHRyYWl0Q29udmVyZ2VEaWFnbm9zdGljc1NhbXBsaW5nID0gKFxuICBjb25maWc6IFRyYWl0Q29udmVyZ2VEaWFnbm9zdGljc1NhbXBsaW5nQ29uZmlnLFxuKTogTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+ID0+XG4gIExheWVyLmZpYmVyUmVmTG9jYWxseVNjb3BlZFdpdGgoY3VycmVudFRyYWl0Q29udmVyZ2VEaWFnbm9zdGljc1NhbXBsaW5nIGFzIGFueSwgKCkgPT4gY29uZmlnKSBhcyBMYXllci5MYXllcjxcbiAgICBhbnksXG4gICAgbmV2ZXIsXG4gICAgbmV2ZXJcbiAgPlxuXG5leHBvcnQgY29uc3QgYXBwZW5kU2lua3MgPSAoc2lua3M6IFJlYWRvbmx5QXJyYXk8U2luaz4pOiBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj4gPT5cbiAgTGF5ZXIuZmliZXJSZWZMb2NhbGx5U2NvcGVkV2l0aChjdXJyZW50RGVidWdTaW5rcywgKGN1cnJlbnQpID0+IFsuLi5jdXJyZW50LCAuLi5zaW5rc10pIGFzIExheWVyLkxheWVyPFxuICAgIGFueSxcbiAgICBuZXZlcixcbiAgICBuZXZlclxuICA+XG5cbmV4cG9ydCB0eXBlIFJ1bnRpbWVEZWJ1Z0V2ZW50S2luZCA9XG4gIHwgJ2FjdGlvbidcbiAgfCAnc3RhdGUnXG4gIHwgJ3NlcnZpY2UnXG4gIHwgJ3Byb2Nlc3MnXG4gIHwgJ3RyYWl0LWNvbXB1dGVkJ1xuICB8ICd0cmFpdC1saW5rJ1xuICB8ICd0cmFpdC1zb3VyY2UnXG4gIHwgJ2xpZmVjeWNsZSdcbiAgfCAncmVhY3QtcmVuZGVyJ1xuICB8ICdkZXZ0b29scydcbiAgfCAnZGlhZ25vc3RpYydcbiAgfCAoc3RyaW5nICYge30pXG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZURlYnVnRXZlbnRSZWYge1xuICByZWFkb25seSBldmVudElkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZXZlbnRTZXE6IG51bWJlclxuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgcmVhZG9ubHkgdHhuU2VxOiBudW1iZXJcbiAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgLyoqXG4gICAqIGxpbmtJZFx1RkYxQVxuICAgKiAtIEN1cnJlbnQgb3BlcmF0aW9uIGNoYWluIGlkIChzaGFyZWQgYnkgYm91bmRhcnkgb3BzIGluIHRoZSBzYW1lIGNoYWluKS5cbiAgICogLSBDcmVhdGVkIGJ5IFJ1bnRpbWUgYXQgdGhlIGJvdW5kYXJ5IHJvb3QgYW5kIHByb3BhZ2F0ZWQgdmlhIEZpYmVyUmVmIGFjcm9zcyBuZXN0ZWQvY3Jvc3MtbW9kdWxlIGNoYWlucy5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtJZD86IHN0cmluZ1xuICByZWFkb25seSB0aW1lc3RhbXA6IG51bWJlclxuICByZWFkb25seSBraW5kOiBSdW50aW1lRGVidWdFdmVudEtpbmRcbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZ1xuICByZWFkb25seSBtZXRhPzogSnNvblZhbHVlXG4gIHJlYWRvbmx5IGVycm9yU3VtbWFyeT86IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxuICByZWFkb25seSBkb3duZ3JhZGU/OiB7XG4gICAgcmVhZG9ubHkgcmVhc29uPzogJ25vbl9zZXJpYWxpemFibGUnIHwgJ292ZXJzaXplZCcgfCAndW5rbm93bidcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBUeG5MYW5lRXZpZGVuY2VSZWFzb24gPVxuICB8ICdkaXNhYmxlZCdcbiAgfCAnZm9yY2VkX29mZidcbiAgfCAnZm9yY2VkX3N5bmMnXG4gIHwgJ3F1ZXVlZF9ub25fdXJnZW50J1xuICB8ICdwcmVlbXB0ZWRfYnlfdXJnZW50J1xuICB8ICdidWRnZXRfeWllbGQnXG4gIHwgJ2NvYWxlc2NlZCdcbiAgfCAnY2FuY2VsZWQnXG4gIHwgJ21heF9sYWdfZm9yY2VkJ1xuICB8ICdzdGFydmF0aW9uX3Byb3RlY3Rpb24nXG5cbmV4cG9ydCB0eXBlIFR4bkxhbmVOb25VcmdlbnRZaWVsZFJlYXNvbiA9ICdub25lJyB8ICdpbnB1dF9wZW5kaW5nJyB8ICdidWRnZXRfZXhjZWVkZWQnIHwgJ2ZvcmNlZF9mcmFtZV95aWVsZCdcblxuZXhwb3J0IHR5cGUgVHhuTGFuZUV2aWRlbmNlID0ge1xuICByZWFkb25seSBhbmNob3I6IHtcbiAgICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gICAgcmVhZG9ubHkgaW5zdGFuY2VJZDogc3RyaW5nXG4gICAgcmVhZG9ubHkgdHhuU2VxOiBudW1iZXJcbiAgICByZWFkb25seSBvcFNlcT86IG51bWJlclxuICB9XG4gIHJlYWRvbmx5IGxhbmU6ICd1cmdlbnQnIHwgJ25vblVyZ2VudCdcbiAgcmVhZG9ubHkga2luZDogc3RyaW5nXG4gIHJlYWRvbmx5IHBvbGljeToge1xuICAgIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW5cbiAgICByZWFkb25seSBvdmVycmlkZU1vZGU/OiAnZm9yY2VkX29mZicgfCAnZm9yY2VkX3N5bmMnXG4gICAgcmVhZG9ubHkgY29uZmlnU2NvcGU6ICdwcm92aWRlcicgfCAncnVudGltZV9tb2R1bGUnIHwgJ3J1bnRpbWVfZGVmYXVsdCcgfCAnYnVpbHRpbidcbiAgICByZWFkb25seSBidWRnZXRNczogbnVtYmVyXG4gICAgcmVhZG9ubHkgZGVib3VuY2VNczogbnVtYmVyXG4gICAgcmVhZG9ubHkgbWF4TGFnTXM6IG51bWJlclxuICAgIHJlYWRvbmx5IGFsbG93Q29hbGVzY2U6IGJvb2xlYW5cbiAgICByZWFkb25seSB5aWVsZFN0cmF0ZWd5PzogJ2Jhc2VsaW5lJyB8ICdpbnB1dFBlbmRpbmcnXG4gICAgcmVhZG9ubHkgcXVldWVNb2RlPzogJ2ZpZm8nIHwgJ2xhbmVzJ1xuICB9XG4gIHJlYWRvbmx5IGJhY2tsb2c6IHtcbiAgICByZWFkb25seSBwZW5kaW5nQ291bnQ6IG51bWJlclxuICAgIHJlYWRvbmx5IGFnZU1zPzogbnVtYmVyXG4gICAgcmVhZG9ubHkgY29hbGVzY2VkQ291bnQ/OiBudW1iZXJcbiAgICByZWFkb25seSBjYW5jZWxlZENvdW50PzogbnVtYmVyXG4gIH1cbiAgcmVhZG9ubHkgYnVkZ2V0Pzoge1xuICAgIHJlYWRvbmx5IGJ1ZGdldE1zPzogbnVtYmVyXG4gICAgcmVhZG9ubHkgc2xpY2VEdXJhdGlvbk1zPzogbnVtYmVyXG4gICAgcmVhZG9ubHkgeWllbGRDb3VudD86IG51bWJlclxuICAgIHJlYWRvbmx5IHlpZWxkZWQ/OiBib29sZWFuXG4gICAgcmVhZG9ubHkgeWllbGRSZWFzb24/OiBUeG5MYW5lTm9uVXJnZW50WWllbGRSZWFzb25cbiAgfVxuICByZWFkb25seSBzdGFydmF0aW9uPzoge1xuICAgIHJlYWRvbmx5IHRyaWdnZXJlZD86IGJvb2xlYW5cbiAgICByZWFkb25seSByZWFzb24/OiBzdHJpbmdcbiAgfVxuICByZWFkb25seSByZWFzb25zOiBSZWFkb25seUFycmF5PFR4bkxhbmVFdmlkZW5jZVJlYXNvbj5cbn1cblxubGV0IG5leHRHbG9iYWxFdmVudFNlcSA9IDBcblxuZXhwb3J0IGNvbnN0IGNsZWFyUnVudGltZURlYnVnRXZlbnRTZXEgPSAoKTogdm9pZCA9PiB7XG4gIG5leHRHbG9iYWxFdmVudFNlcSA9IDBcbn1cblxuY29uc3QgbmV4dEV2ZW50U2VxID0gKCk6IG51bWJlciA9PiB7XG4gIG5leHRHbG9iYWxFdmVudFNlcSArPSAxXG4gIHJldHVybiBuZXh0R2xvYmFsRXZlbnRTZXFcbn1cblxuY29uc3QgbWFrZUV2ZW50SWQgPSAoaW5zdGFuY2VJZDogc3RyaW5nLCBldmVudFNlcTogbnVtYmVyKTogc3RyaW5nID0+IGAke2luc3RhbmNlSWR9OjplJHtldmVudFNlcX1gXG5cbnR5cGUgRG93bmdyYWRlUmVhc29uID0gSnNvbkRvd25ncmFkZVJlYXNvbiB8IEVycm9yRG93bmdyYWRlUmVhc29uXG5cbmNvbnN0IG1lcmdlRG93bmdyYWRlID0gKFxuICBjdXJyZW50OiBEb3duZ3JhZGVSZWFzb24gfCB1bmRlZmluZWQsXG4gIG5leHQ6IERvd25ncmFkZVJlYXNvbiB8IHVuZGVmaW5lZCxcbik6IERvd25ncmFkZVJlYXNvbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghY3VycmVudCkgcmV0dXJuIG5leHRcbiAgaWYgKCFuZXh0KSByZXR1cm4gY3VycmVudFxuICBpZiAoY3VycmVudCA9PT0gJ25vbl9zZXJpYWxpemFibGUnIHx8IG5leHQgPT09ICdub25fc2VyaWFsaXphYmxlJykgcmV0dXJuICdub25fc2VyaWFsaXphYmxlJ1xuICBpZiAoY3VycmVudCA9PT0gJ292ZXJzaXplZCcgfHwgbmV4dCA9PT0gJ292ZXJzaXplZCcpIHJldHVybiAnb3ZlcnNpemVkJ1xuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbi8vIEluIGJyb3dzZXJzLCB0byByZWR1Y2UgZHVwbGljYXRlZCBub2lzZSBjYXVzZWQgYnkgUmVhY3QgU3RyaWN0TW9kZSwgZXRjLixcbi8vIGRlLWR1cGxpY2F0ZSBsaWZlY3ljbGU6ZXJyb3IgYW5kIGRpYWdub3N0aWMgZXZlbnRzOiBwcmludCB0aGUgc2FtZSBtb2R1bGVJZCtwYXlsb2FkIG9ubHkgb25jZS5cbmNvbnN0IGJyb3dzZXJMaWZlY3ljbGVTZWVuID0gbmV3IFNldDxzdHJpbmc+KClcbmNvbnN0IGJyb3dzZXJEaWFnbm9zdGljU2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbi8vIEFsaWduIHRyYWNlOnJlYWN0LXJlbmRlciBldmVudHMgd2l0aCB0aGUgbW9zdCByZWNlbnQgc3RhdGU6dXBkYXRlIHR4biAoVUktb25seSBhc3NvY2lhdGlvbikuXG5jb25zdCBsYXN0VHhuQnlJbnN0YW5jZSA9IG5ldyBNYXA8c3RyaW5nLCB7IHJlYWRvbmx5IHR4bklkOiBzdHJpbmc7IHJlYWRvbmx5IHR4blNlcTogbnVtYmVyIH0+KClcblxuLy8gdHJhY2U6cmVhY3QtcmVuZGVyIC8gdHJhY2U6cmVhY3Qtc2VsZWN0b3IgbWF5IGVudGVyIHRoZSBzaW5rIGJlZm9yZSBzdGF0ZTp1cGRhdGUgKHJlb3JkZXJpbmcgZHVlIHRvIGNvbmN1cnJlbmN5L3NjaGVkdWxpbmcpLlxuLy8gVG8gcHJvdmlkZSB1c2FibGUgdHhuIGFuY2hvcnMgaW4gRGV2dG9vbHMvVUksIHdlIGFsbG93IGEgb25lLXRpbWUgYmFja2ZpbGwgZm9yIHJlZnMgbWlzc2luZyB0eG4gZmllbGRzLlxuY29uc3QgcGVuZGluZ1R4bkFsaWdubWVudEJ5SW5zdGFuY2UgPSBuZXcgTWFwPHN0cmluZywgQXJyYXk8UnVudGltZURlYnVnRXZlbnRSZWY+PigpXG5cbmNvbnN0IGVucXVldWVQZW5kaW5nVHhuQWxpZ25tZW50ID0gKGluc3RhbmNlSWQ6IHN0cmluZywgcmVmOiBSdW50aW1lRGVidWdFdmVudFJlZik6IHZvaWQgPT4ge1xuICBjb25zdCBsaXN0ID0gcGVuZGluZ1R4bkFsaWdubWVudEJ5SW5zdGFuY2UuZ2V0KGluc3RhbmNlSWQpXG4gIGlmICghbGlzdCkge1xuICAgIHBlbmRpbmdUeG5BbGlnbm1lbnRCeUluc3RhbmNlLnNldChpbnN0YW5jZUlkLCBbcmVmXSlcbiAgICByZXR1cm5cbiAgfVxuICBsaXN0LnB1c2gocmVmKVxuICBpZiAobGlzdC5sZW5ndGggPiA2NCkge1xuICAgIGxpc3Quc2hpZnQoKVxuICB9XG59XG5cbmNvbnN0IGJhY2tmaWxsUGVuZGluZ1R4bkFsaWdubWVudCA9IChcbiAgaW5zdGFuY2VJZDogc3RyaW5nLFxuICB0eG46IHsgcmVhZG9ubHkgdHhuSWQ6IHN0cmluZzsgcmVhZG9ubHkgdHhuU2VxOiBudW1iZXIgfSxcbik6IHZvaWQgPT4ge1xuICBjb25zdCBwZW5kaW5nID0gcGVuZGluZ1R4bkFsaWdubWVudEJ5SW5zdGFuY2UuZ2V0KGluc3RhbmNlSWQpXG4gIGlmICghcGVuZGluZyB8fCBwZW5kaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgIHBlbmRpbmdUeG5BbGlnbm1lbnRCeUluc3RhbmNlLmRlbGV0ZShpbnN0YW5jZUlkKVxuICAgIHJldHVyblxuICB9XG5cbiAgZm9yIChjb25zdCByZWYgb2YgcGVuZGluZykge1xuICAgIGNvbnN0IGFueVJlZjogYW55ID0gcmVmIGFzIGFueVxuICAgIGlmIChhbnlSZWYudHhuSWQgPT0gbnVsbCkge1xuICAgICAgYW55UmVmLnR4bklkID0gdHhuLnR4bklkXG4gICAgfVxuICAgIGlmICh0eXBlb2YgYW55UmVmLnR4blNlcSAhPT0gJ251bWJlcicgfHwgYW55UmVmLnR4blNlcSA8PSAwKSB7XG4gICAgICBhbnlSZWYudHhuU2VxID0gdHhuLnR4blNlcVxuICAgIH1cbiAgfVxuXG4gIHBlbmRpbmdUeG5BbGlnbm1lbnRCeUluc3RhbmNlLmRlbGV0ZShpbnN0YW5jZUlkKVxufVxuXG5jb25zdCBsaWZlY3ljbGVFcnJvckxvZyA9IChldmVudDogRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnbGlmZWN5Y2xlOmVycm9yJyB9PikgPT4ge1xuICBjb25zdCBtb2R1bGVJZCA9IGV2ZW50Lm1vZHVsZUlkID8/ICd1bmtub3duJ1xuICBjb25zdCBjYXVzZVByZXR0eSA9ICgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBDYXVzZS5wcmV0dHkoZXZlbnQuY2F1c2UgYXMgQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIHtcbiAgICAgICAgcmVuZGVyRXJyb3JDYXVzZTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSBjYXRjaCB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXZlbnQuY2F1c2UsIG51bGwsIDIpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyhldmVudC5jYXVzZSlcbiAgICAgIH1cbiAgICB9XG4gIH0pKClcblxuICBjb25zdCBtZXNzYWdlID0gYFtMb2dpeF1bbW9kdWxlPSR7bW9kdWxlSWR9XSBsaWZlY3ljbGU6ZXJyb3JcXG4ke2NhdXNlUHJldHR5fWBcblxuICByZXR1cm4gRWZmZWN0LmxvZ0Vycm9yKG1lc3NhZ2UpLnBpcGUoXG4gICAgRWZmZWN0LmFubm90YXRlTG9ncyh7XG4gICAgICAnbG9naXgubW9kdWxlSWQnOiBtb2R1bGVJZCxcbiAgICAgICdsb2dpeC5ldmVudCc6ICdsaWZlY3ljbGU6ZXJyb3InLFxuICAgICAgJ2xvZ2l4LmNhdXNlJzogY2F1c2VQcmV0dHksXG4gICAgfSksXG4gIClcbn1cblxuY29uc3QgZGlhZ25vc3RpY0xvZyA9IChldmVudDogRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnZGlhZ25vc3RpYycgfT4pID0+IHtcbiAgY29uc3QgbW9kdWxlSWQgPSBldmVudC5tb2R1bGVJZCA/PyAndW5rbm93bidcbiAgY29uc3QgaGVhZGVyID0gYFtMb2dpeF1bbW9kdWxlPSR7bW9kdWxlSWR9XSBkaWFnbm9zdGljKCR7ZXZlbnQuc2V2ZXJpdHl9KWBcbiAgY29uc3QgZGV0YWlsID0gYGNvZGU9JHtldmVudC5jb2RlfSBtZXNzYWdlPSR7ZXZlbnQubWVzc2FnZX0ke1xuICAgIGV2ZW50LmFjdGlvblRhZyA/IGAgYWN0aW9uPSR7ZXZlbnQuYWN0aW9uVGFnfWAgOiAnJ1xuICB9JHtldmVudC5oaW50ID8gYFxcbmhpbnQ6ICR7ZXZlbnQuaGludH1gIDogJyd9YFxuICBjb25zdCBtc2cgPSBgJHtoZWFkZXJ9XFxuJHtkZXRhaWx9YFxuXG4gIGNvbnN0IGJhc2UgPVxuICAgIGV2ZW50LnNldmVyaXR5ID09PSAnd2FybmluZydcbiAgICAgID8gRWZmZWN0LmxvZ1dhcm5pbmcobXNnKVxuICAgICAgOiBldmVudC5zZXZlcml0eSA9PT0gJ2luZm8nXG4gICAgICAgID8gRWZmZWN0LmxvZ0luZm8obXNnKVxuICAgICAgICA6IEVmZmVjdC5sb2dFcnJvcihtc2cpXG5cbiAgY29uc3QgYW5ub3RhdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICdsb2dpeC5tb2R1bGVJZCc6IG1vZHVsZUlkLFxuICAgICdsb2dpeC5ldmVudCc6IGBkaWFnbm9zdGljKCR7ZXZlbnQuc2V2ZXJpdHl9KWAsXG4gICAgJ2xvZ2l4LmRpYWdub3N0aWMuY29kZSc6IGV2ZW50LmNvZGUsXG4gICAgJ2xvZ2l4LmRpYWdub3N0aWMubWVzc2FnZSc6IGV2ZW50Lm1lc3NhZ2UsXG4gIH1cbiAgaWYgKGV2ZW50LmhpbnQpIHtcbiAgICBhbm5vdGF0aW9uc1snbG9naXguZGlhZ25vc3RpYy5oaW50J10gPSBldmVudC5oaW50XG4gIH1cbiAgaWYgKGV2ZW50LmFjdGlvblRhZykge1xuICAgIGFubm90YXRpb25zWydsb2dpeC5kaWFnbm9zdGljLmFjdGlvblRhZyddID0gZXZlbnQuYWN0aW9uVGFnXG4gIH1cblxuICByZXR1cm4gYmFzZS5waXBlKEVmZmVjdC5hbm5vdGF0ZUxvZ3MoYW5ub3RhdGlvbnMpKVxufVxuXG4vKipcbiAqIERlZmF1bHQgTGF5ZXIgY29tcG9zaXRpb24gYmFzZWQgb24gRmliZXJSZWYuY3VycmVudERlYnVnU2lua3M6XG4gKiAtIFVzZXMgTGF5ZXIubG9jYWxseVNjb3BlZCB0byBpbmplY3QgRGVidWcgc2lua3MgdmlhIEZpYmVyUmVmIHN0YXRlLlxuICogLSBBdm9pZHMgbWlzdXNpbmcgRmliZXJSZWYgYXMgYSBDb250ZXh0LlRhZy5cbiAqL1xuZXhwb3J0IGNvbnN0IG5vb3BMYXllciA9IExheWVyLmxvY2FsbHlTY29wZWQoY3VycmVudERlYnVnU2lua3MsIFtdKVxuXG4vKipcbiAqIGVycm9yT25seUxheWVyXHVGRjFBXG4gKiAtIERlZmF1bHQgRGVidWdTaW5rIGltcGxlbWVudGF0aW9uIHRoYXQgb25seSBjYXJlcyBhYm91dCBsaWZlY3ljbGU6ZXJyb3IgZXZlbnRzLlxuICogLSBTdWl0YWJsZSBhcyBhIFwibWluaW11bSBvYnNlcnZhYmlsaXR5XCIgbGF5ZXIgc28gZmF0YWwgZXJyb3JzIGRvbid0IHNpbGVudGx5IGRpc2FwcGVhci5cbiAqIC0gT3RoZXIgZXZlbnRzIChtb2R1bGU6aW5pdC9kZXN0cm95LCBhY3Rpb246ZGlzcGF0Y2gsIHN0YXRlOnVwZGF0ZSkgYXJlIG5vdCByZWNvcmRlZCBieSBkZWZhdWx0LlxuICovXG5jb25zdCBlcnJvck9ubHlTaW5rOiBTaW5rID0ge1xuICByZWNvcmQ6IChldmVudDogRXZlbnQpID0+XG4gICAgZXZlbnQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcidcbiAgICAgID8gbGlmZWN5Y2xlRXJyb3JMb2coZXZlbnQpXG4gICAgICA6IGV2ZW50LnR5cGUgPT09ICdkaWFnbm9zdGljJyAmJiBldmVudC5zZXZlcml0eSAhPT0gJ2luZm8nXG4gICAgICAgID8gZGlhZ25vc3RpY0xvZyhldmVudClcbiAgICAgICAgOiBFZmZlY3Qudm9pZCxcbn1cblxuZXhwb3J0IGNvbnN0IGVycm9yT25seUxheWVyID0gTGF5ZXIubG9jYWxseVNjb3BlZChjdXJyZW50RGVidWdTaW5rcywgW2Vycm9yT25seVNpbmtdKVxuXG5leHBvcnQgY29uc3QgaXNFcnJvck9ubHlPbmx5U2lua3MgPSAoc2lua3M6IFJlYWRvbmx5QXJyYXk8U2luaz4pOiBib29sZWFuID0+IHNpbmtzLmxlbmd0aCA9PT0gMSAmJiBzaW5rc1swXSA9PT0gZXJyb3JPbmx5U2lua1xuXG4vKipcbiAqIGNvbnNvbGVMYXllclx1RkYxQVxuICogLSBGdWxsIGRlYnVnIGxheWVyIHRoYXQgbG9ncyBhbGwgRGVidWcgZXZlbnRzIHZpYSBFZmZlY3QgbG9ncyAobG9nZm10IC8gc3RydWN0dXJlZCkuXG4gKiAtIFN1aXRhYmxlIGFzIGFuIG9ic2VydmFiaWxpdHkgbGF5ZXIgZm9yIGdlbmVyYWwgZW52aXJvbm1lbnRzIChOb2RlIC8gdGVzdHMpLlxuICovXG5jb25zdCBjb25zb2xlU2luazogU2luayA9IHtcbiAgcmVjb3JkOiAoZXZlbnQ6IEV2ZW50KSA9PlxuICAgIGV2ZW50LnR5cGUgPT09ICdsaWZlY3ljbGU6ZXJyb3InXG4gICAgICA/IGxpZmVjeWNsZUVycm9yTG9nKGV2ZW50KVxuICAgICAgOiBldmVudC50eXBlID09PSAnZGlhZ25vc3RpYydcbiAgICAgICAgPyBkaWFnbm9zdGljTG9nKGV2ZW50KVxuICAgICAgICA6IEVmZmVjdC5sb2dEZWJ1Zyh7IGRlYnVnRXZlbnQ6IGV2ZW50IH0pLFxufVxuXG5leHBvcnQgY29uc3QgY29uc29sZUxheWVyID0gTGF5ZXIubG9jYWxseVNjb3BlZChjdXJyZW50RGVidWdTaW5rcywgW2NvbnNvbGVTaW5rXSlcblxuY29uc3QgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuXG4vLyBTaGFyZWQgYnJvd3NlciBjb25zb2xlIHJlbmRlcmluZyBsb2dpYyB1c2VkIGJ5IHRoZSBkZWZhdWx0IERlYnVnU2luayBhbmQgYnJvd3NlckNvbnNvbGVMYXllci5cbmNvbnN0IHJlbmRlckJyb3dzZXJDb25zb2xlRXZlbnQgPSAoZXZlbnQ6IEV2ZW50KTogRWZmZWN0LkVmZmVjdDx2b2lkPiA9PiB7XG4gIC8vIHRyYWNlOiogZXZlbnRzOiBzaG93biBhcyBzZXBhcmF0ZSBncm91cHMgaW4gYnJvd3NlcnMgZm9yIFBsYXlncm91bmQgLyBEZXZUb29scyBvYnNlcnZhdGlvbi5cbiAgaWYgKHR5cGVvZiAoZXZlbnQgYXMgYW55KS50eXBlID09PSAnc3RyaW5nJyAmJiAoZXZlbnQgYXMgYW55KS50eXBlLnN0YXJ0c1dpdGgoJ3RyYWNlOicpKSB7XG4gICAgY29uc3QgbW9kdWxlSWQgPSAoZXZlbnQgYXMgYW55KS5tb2R1bGVJZCA/PyAndW5rbm93bidcbiAgICBjb25zdCB0eXBlID0gKGV2ZW50IGFzIGFueSkudHlwZVxuXG4gICAgcmV0dXJuIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgICAgICAnJWNbTG9naXhdJWMgdHJhY2UgJWMnICsgbW9kdWxlSWQgKyAnJWMgJyArIFN0cmluZyh0eXBlKSxcbiAgICAgICAgJ2NvbG9yOiM2YjcyODA7Zm9udC13ZWlnaHQ6Ym9sZCcsIC8vIHRhZ1xuICAgICAgICAnY29sb3I6IzNiODJmNicsIC8vIGxhYmVsXG4gICAgICAgICdjb2xvcjojOWNhM2FmJywgLy8gbW9kdWxlIGlkXG4gICAgICAgICdjb2xvcjojNmI3MjgwJywgLy8gdHlwZVxuICAgICAgKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKGV2ZW50KVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKVxuICAgIH0pXG4gIH1cblxuICBpZiAoZXZlbnQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcicpIHtcbiAgICBjb25zdCBtb2R1bGVJZCA9IGV2ZW50Lm1vZHVsZUlkID8/ICd1bmtub3duJ1xuICAgIGNvbnN0IGNhdXNlUHJldHR5ID0gKCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBDYXVzZS5wcmV0dHkoZXZlbnQuY2F1c2UgYXMgQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIHsgcmVuZGVyRXJyb3JDYXVzZTogdHJ1ZSB9KVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGV2ZW50LmNhdXNlLCBudWxsLCAyKVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKGV2ZW50LmNhdXNlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoKVxuXG4gICAgY29uc3Qga2V5ID0gYCR7bW9kdWxlSWR9fCR7Y2F1c2VQcmV0dHl9YFxuICAgIGlmIChicm93c2VyTGlmZWN5Y2xlU2Vlbi5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gICAgfVxuICAgIGJyb3dzZXJMaWZlY3ljbGVTZWVuLmFkZChrZXkpXG5cbiAgICByZXR1cm4gRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgICAgICclY1tMb2dpeF0lYyBsaWZlY3ljbGU6ZXJyb3IgJWMnICsgbW9kdWxlSWQsXG4gICAgICAgICdjb2xvcjojZWY0NDQ0O2ZvbnQtd2VpZ2h0OmJvbGQnLCAvLyB0YWdcbiAgICAgICAgJ2NvbG9yOiNlZjQ0NDQnLCAvLyBsYWJlbFxuICAgICAgICAnY29sb3I6IzljYTNhZicsIC8vIG1vZHVsZSBpZFxuICAgICAgKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2F1c2VQcmV0dHkpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5ncm91cEVuZCgpXG4gICAgfSlcbiAgfVxuXG4gIGlmIChldmVudC50eXBlID09PSAnZGlhZ25vc3RpYycpIHtcbiAgICBjb25zdCBtb2R1bGVJZCA9IGV2ZW50Lm1vZHVsZUlkID8/ICd1bmtub3duJ1xuICAgIGNvbnN0IGRldGFpbCA9IGBjb2RlPSR7ZXZlbnQuY29kZX0gbWVzc2FnZT0ke2V2ZW50Lm1lc3NhZ2V9JHtcbiAgICAgIGV2ZW50LmFjdGlvblRhZyA/IGAgYWN0aW9uPSR7ZXZlbnQuYWN0aW9uVGFnfWAgOiAnJ1xuICAgIH0ke2V2ZW50LmhpbnQgPyBgXFxuaGludDogJHtldmVudC5oaW50fWAgOiAnJ31gXG5cbiAgICBjb25zdCBjb2xvciA9XG4gICAgICBldmVudC5zZXZlcml0eSA9PT0gJ3dhcm5pbmcnID8gJ2NvbG9yOiNkOTc3MDYnIDogZXZlbnQuc2V2ZXJpdHkgPT09ICdpbmZvJyA/ICdjb2xvcjojM2I4MmY2JyA6ICdjb2xvcjojZWY0NDQ0J1xuXG4gICAgY29uc3QgbGFiZWwgPVxuICAgICAgZXZlbnQuc2V2ZXJpdHkgPT09ICd3YXJuaW5nJ1xuICAgICAgICA/ICdkaWFnbm9zdGljKHdhcm5pbmcpJ1xuICAgICAgICA6IGV2ZW50LnNldmVyaXR5ID09PSAnaW5mbydcbiAgICAgICAgICA/ICdkaWFnbm9zdGljKGluZm8pJ1xuICAgICAgICAgIDogJ2RpYWdub3N0aWMoZXJyb3IpJ1xuXG4gICAgY29uc3Qga2V5ID0gYCR7bW9kdWxlSWR9fCR7ZXZlbnQuY29kZX18JHtldmVudC5tZXNzYWdlfWBcbiAgICBpZiAoYnJvd3NlckRpYWdub3N0aWNTZWVuLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICB9XG4gICAgYnJvd3NlckRpYWdub3N0aWNTZWVuLmFkZChrZXkpXG5cbiAgICByZXR1cm4gRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgICAgICclY1tMb2dpeF0lYyAnICsgbGFiZWwgKyAnJWMgbW9kdWxlPScgKyBtb2R1bGVJZCxcbiAgICAgICAgJ2NvbG9yOiM2YjcyODA7Zm9udC13ZWlnaHQ6Ym9sZCcsXG4gICAgICAgIGNvbG9yLFxuICAgICAgICAnY29sb3I6IzljYTNhZicsXG4gICAgICApXG4gICAgICBpZiAoZXZlbnQuc2V2ZXJpdHkgPT09ICd3YXJuaW5nJykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oZGV0YWlsKVxuICAgICAgfSBlbHNlIGlmIChldmVudC5zZXZlcml0eSA9PT0gJ2luZm8nKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuaW5mbyhkZXRhaWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKGRldGFpbClcbiAgICAgIH1cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmdyb3VwRW5kKClcbiAgICB9KVxuICB9XG5cbiAgLy8gT3RoZXIgZXZlbnRzIGFyZSBub3QgcHJpbnRlZCB0byB0aGUgYnJvd3NlciBjb25zb2xlIGJ5IGRlZmF1bHQgdG8gYXZvaWQgYmVpbmcgdG9vIG5vaXN5IGR1cmluZyBkZXZlbG9wbWVudC5cbiAgLy8gRm9yIGludGVybmFsIGRlYnVnIGV2ZW50cywgdXNlIGEgY3VzdG9tIERlYnVnIHNpbmsgb3IgdXNlIGNvbnNvbGVMYXllciBpbiBOb2RlLlxuICByZXR1cm4gRWZmZWN0LnZvaWRcbn1cblxuLyoqXG4gKiBCcm93c2VyIGNvbnNvbGUgZGVidWcgbGF5ZXI6XG4gKiAtIEluIGJyb3dzZXJzLCB1c2VzIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQgKyBjb2xvcmVkIGxhYmVscyB0byBzaW11bGF0ZSBwcmV0dHkgbG9nZ2VyIGdyb3VwaW5nLlxuICogLSBJbiBub24tYnJvd3NlciBlbnZpcm9ubWVudHMsIGZhbGxzIGJhY2sgdG8gY29uc29sZUxheWVyJ3MgRWZmZWN0IGxvZ2dpbmcgaW1wbGVtZW50YXRpb24uXG4gKi9cbmNvbnN0IGJyb3dzZXJDb25zb2xlU2luazogU2luayA9IHtcbiAgcmVjb3JkOiAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgaWYgKCFpc0Jyb3dzZXIpIHtcbiAgICAgIC8vIE5vbi1icm93c2VyOiBmYWxsIGJhY2sgdG8gY29uc29sZUxheWVyIGJlaGF2aW9yIChFZmZlY3QubG9nKikuXG4gICAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcidcbiAgICAgICAgPyBsaWZlY3ljbGVFcnJvckxvZyhldmVudClcbiAgICAgICAgOiBldmVudC50eXBlID09PSAnZGlhZ25vc3RpYydcbiAgICAgICAgICA/IGRpYWdub3N0aWNMb2coZXZlbnQpXG4gICAgICAgICAgOiBFZmZlY3QubG9nRGVidWcoeyBkZWJ1Z0V2ZW50OiBldmVudCB9KVxuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJCcm93c2VyQ29uc29sZUV2ZW50KGV2ZW50KVxuICB9LFxufVxuXG5leHBvcnQgY29uc3QgYnJvd3NlckNvbnNvbGVMYXllciA9IExheWVyLmxvY2FsbHlTY29wZWQoY3VycmVudERlYnVnU2lua3MsIFticm93c2VyQ29uc29sZVNpbmtdKVxuXG4vKipcbiAqIEJyb3dzZXIgZGlhZ25vc3RpYy1vbmx5IGRlYnVnIGxheWVyOlxuICogLSBJbiBicm93c2VycywgcHJpbnRzIG9ubHkgbGlmZWN5Y2xlOmVycm9yICsgZGlhZ25vc3RpYyh3YXJuaW5nL2Vycm9yKSB2aWEgY29uc29sZS5ncm91cENvbGxhcHNlZC5cbiAqIC0gRHJvcHMgdHJhY2U6KiBhbmQgb3RoZXIgaGlnaC1mcmVxdWVuY3kgZXZlbnRzIGZyb20gdGhlIGJyb3dzZXIgY29uc29sZSAodXNlIERldnRvb2xzSHViIGluc3RlYWQpLlxuICogLSBJbiBub24tYnJvd3NlciBlbnZpcm9ubWVudHMsIGJlaGF2ZXMgbGlrZSBlcnJvck9ubHlTaW5rIChFZmZlY3QubG9nKikuXG4gKi9cbmNvbnN0IGJyb3dzZXJEaWFnbm9zdGljQ29uc29sZVNpbms6IFNpbmsgPSB7XG4gIHJlY29yZDogKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgIGlmICghaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm4gZXZlbnQudHlwZSA9PT0gJ2xpZmVjeWNsZTplcnJvcidcbiAgICAgICAgPyBsaWZlY3ljbGVFcnJvckxvZyhldmVudClcbiAgICAgICAgOiBldmVudC50eXBlID09PSAnZGlhZ25vc3RpYycgJiYgZXZlbnQuc2V2ZXJpdHkgIT09ICdpbmZvJ1xuICAgICAgICAgID8gZGlhZ25vc3RpY0xvZyhldmVudClcbiAgICAgICAgICA6IEVmZmVjdC52b2lkXG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50LnR5cGUgPT09ICdsaWZlY3ljbGU6ZXJyb3InIHx8IChldmVudC50eXBlID09PSAnZGlhZ25vc3RpYycgJiYgZXZlbnQuc2V2ZXJpdHkgIT09ICdpbmZvJylcbiAgICAgID8gcmVuZGVyQnJvd3NlckNvbnNvbGVFdmVudChldmVudClcbiAgICAgIDogRWZmZWN0LnZvaWRcbiAgfSxcbn1cblxuZXhwb3J0IGNvbnN0IGJyb3dzZXJEaWFnbm9zdGljQ29uc29sZUxheWVyID0gTGF5ZXIubG9jYWxseVNjb3BlZChjdXJyZW50RGVidWdTaW5rcywgW2Jyb3dzZXJEaWFnbm9zdGljQ29uc29sZVNpbmtdKVxuXG4vKipcbiAqIEJyb3dzZXItZnJpZW5kbHkgTG9nZ2VyIGxheWVyOiByZXBsYWNlcyB0aGUgZGVmYXVsdCBsb2dnZXIgd2l0aCBFZmZlY3QncyBwcmV0dHkgbG9nZ2VyIChicm93c2VyIG1vZGUpLlxuICogLSBBdm9pZHMgaGFuZC13cml0dGVuIGNvbnNvbGUgc3R5bGVzOyByZXVzZXMgRWZmZWN0J3MgY29sb3JlZC9ncm91cGVkIGZvcm1hdHRpbmcuXG4gKiAtIFNhZmVseSBkZWdyYWRlcyB0byB0aGUgZGVmYXVsdCBsb2dnZXIgaW4gc2VydmVyIGVudmlyb25tZW50cy5cbiAqL1xuZXhwb3J0IGNvbnN0IGJyb3dzZXJQcmV0dHlMb2dnZXJMYXllciA9IExvZ2dlci5yZXBsYWNlKFxuICBMb2dnZXIuZGVmYXVsdExvZ2dlcixcbiAgTG9nZ2VyLnByZXR0eUxvZ2dlcih7IG1vZGU6ICdicm93c2VyJywgY29sb3JzOiB0cnVlIH0pLFxuKVxuXG4vKipcbiAqIGRlZmF1bHRMYXllclx1RkYxQVxuICogLSBQdWJsaWMgZGVmYXVsdCBsYXllcjsgY3VycmVudGx5IGVxdWl2YWxlbnQgdG8gZXJyb3JPbmx5TGF5ZXIuXG4gKiAtIFJlY29yZHMgbGlmZWN5Y2xlOmVycm9yIG9ubHksIGF2b2lkaW5nIGEgbGFyZ2Ugdm9sdW1lIG9mIGFjdGlvbi9zdGF0ZSBsb2dzIGJ5IGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0TGF5ZXIgPSBlcnJvck9ubHlMYXllclxuXG5leHBvcnQgY29uc3QgcmVjb3JkID0gKGV2ZW50OiBFdmVudCkgPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHNpbmtzID0geWllbGQqIEZpYmVyUmVmLmdldChjdXJyZW50RGVidWdTaW5rcylcblxuICAgIC8vIEZhc3QgcGF0aDogcHJvZHVjdGlvbiBkZWZhdWx0IGluc3RhbGxzIGVycm9yT25seUxheWVyIChzaW5rcz0xKS5cbiAgICAvLyBBdm9pZCBwYXlpbmcgZGlhZ25vc3RpY3MgRmliZXJSZWYgKyBlbnJpY2htZW50IGNvc3RzIGZvciBoaWdoLWZyZXF1ZW5jeSBldmVudHMgdGhhdCBhcmUgYWx3YXlzIGRyb3BwZWQgYnkgZXJyb3JPbmx5LlxuICAgIGlmIChpc0Vycm9yT25seU9ubHlTaW5rcyhzaW5rcykpIHtcbiAgICAgIGlmIChldmVudC50eXBlID09PSAnbGlmZWN5Y2xlOmVycm9yJykge1xuICAgICAgICB5aWVsZCogbGlmZWN5Y2xlRXJyb3JMb2coZXZlbnQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdkaWFnbm9zdGljJykge1xuICAgICAgICBpZiAoZXZlbnQuc2V2ZXJpdHkgIT09ICdpbmZvJykge1xuICAgICAgICAgIHlpZWxkKiBkaWFnbm9zdGljTG9nKGV2ZW50KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHlpZWxkKiBFZmZlY3Qudm9pZFxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgeWllbGQqIEVmZmVjdC52b2lkXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBGYXN0IHBhdGg6IHdoZW4gbm8gc2lua3MgYXJlIGluc3RhbGxlZCwgb25seSBhIHNtYWxsIHN1YnNldCBvZiBldmVudHMgYXJlIGV2ZXIgc3VyZmFjZWQuXG4gICAgLy8gQXZvaWQgcGF5aW5nIHBlci1ldmVudCBGaWJlclJlZiArIGVucmljaG1lbnQgY29zdHMgZm9yIGhpZ2gtZnJlcXVlbmN5IGV2ZW50cyBsaWtlIHN0YXRlOnVwZGF0ZS5cbiAgICBpZiAoc2lua3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoaXNCcm93c2VyKSB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSAnbGlmZWN5Y2xlOmVycm9yJyB8fCBldmVudC50eXBlID09PSAnZGlhZ25vc3RpYycpIHtcbiAgICAgICAgICB5aWVsZCogcmVuZGVyQnJvd3NlckNvbnNvbGVFdmVudChldmVudClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnbGlmZWN5Y2xlOmVycm9yJykge1xuICAgICAgICB5aWVsZCogbGlmZWN5Y2xlRXJyb3JMb2coZXZlbnQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdkaWFnbm9zdGljJykge1xuICAgICAgICB5aWVsZCogZGlhZ25vc3RpY0xvZyhldmVudClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGVucmljaGVkID0gZXZlbnQgYXMgRXZlbnRcblxuICAgIGNvbnN0IGRpYWdub3N0aWNzTGV2ZWwgPSB5aWVsZCogRmliZXJSZWYuZ2V0KGN1cnJlbnREaWFnbm9zdGljc0xldmVsKVxuXG4gICAgLy8gRW5yaWNoIERlYnVnLkV2ZW50IHdpdGggYmFzaWMgZmllbGRzIChlbmFibGVkIG9ubHkgd2hlbiBkaWFnbm9zdGljc0xldmVsIT1vZmYpOlxuICAgIC8vIC0gdGltZXN0YW1wOiBmb3IgRGV2dG9vbHMvVGltZWxpbmUvT3ZlcnZpZXcgdGltZSBhZ2dyZWdhdGlvbjsgYXZvaWRzIFVJLXNpZGUgXCJmaXJzdCBvYnNlcnZlZCB0aW1lXCIgZGlzdG9ydGlvbi5cbiAgICAvLyAtIHJ1bnRpbWVMYWJlbDogZnJvbSBGaWJlclJlZiBmb3IgZ3JvdXBpbmcgYnkgcnVudGltZSAoaW5qZWN0ZWQgb25seSB3aGVuIG5vdCBhbHJlYWR5IHByb3ZpZGVkIGJ5IHRoZSBldmVudCkuXG4gICAgbGV0IG5vdzogbnVtYmVyIHwgdW5kZWZpbmVkXG4gICAgY29uc3QgZ2V0Tm93ID0gKCk6IG51bWJlciA9PiB7XG4gICAgICBpZiAobm93ID09PSB1bmRlZmluZWQpIG5vdyA9IERhdGUubm93KClcbiAgICAgIHJldHVybiBub3dcbiAgICB9XG5cbiAgICAvLyBkaWFnbm9zdGljcz1vZmY6IGtlZXAgbmVhci16ZXJvIGNvc3Q7IGRvIG5vdCBhZGQgdGltZXN0YW1wIGZvciBoaWdoLWZyZXF1ZW5jeSBldmVudHMgKGF2b2lkIGV4dHJhIERhdGUubm93KCkpLlxuICAgIC8vIExvdy1mcmVxdWVuY3kgZXZlbnRzIChsaWZlY3ljbGU6ZXJyb3IvZGlhZ25vc3RpYykgbWF5IHN0aWxsIGdldCB0aW1lc3RhbXAgZm9yIGVhc2llciBkZWJ1Z2dpbmcuXG4gICAgaWYgKFxuICAgICAgZW5yaWNoZWQudGltZXN0YW1wID09PSB1bmRlZmluZWQgJiZcbiAgICAgIChkaWFnbm9zdGljc0xldmVsICE9PSAnb2ZmJyB8fCBlbnJpY2hlZC50eXBlID09PSAnbGlmZWN5Y2xlOmVycm9yJyB8fCBlbnJpY2hlZC50eXBlID09PSAnZGlhZ25vc3RpYycpXG4gICAgKSB7XG4gICAgICA7KGVucmljaGVkIGFzIGFueSkudGltZXN0YW1wID0gZ2V0Tm93KClcbiAgICB9XG4gICAgaWYgKGRpYWdub3N0aWNzTGV2ZWwgIT09ICdvZmYnICYmIGVucmljaGVkLnJ1bnRpbWVMYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBydW50aW1lTGFiZWwgPSB5aWVsZCogRmliZXJSZWYuZ2V0KGN1cnJlbnRSdW50aW1lTGFiZWwpXG4gICAgICBpZiAocnVudGltZUxhYmVsKSB7XG4gICAgICAgIDsoZW5yaWNoZWQgYXMgYW55KS5ydW50aW1lTGFiZWwgPSBydW50aW1lTGFiZWxcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW5yaWNoZWQudHlwZSA9PT0gJ2RpYWdub3N0aWMnICYmIChlbnJpY2hlZCBhcyBhbnkpLnR4bklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHR4bklkID0geWllbGQqIEZpYmVyUmVmLmdldChjdXJyZW50VHhuSWQpXG4gICAgICBpZiAodHhuSWQpIHtcbiAgICAgICAgOyhlbnJpY2hlZCBhcyBhbnkpLnR4bklkID0gdHhuSWRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbGlua0lkIGlzIG1lYW5pbmdmdWwgb25seSBmb3IgRWZmZWN0T3AgZXZlbnRzOiBhdm9pZCBleHRyYSBGaWJlclJlZiByZWFkcyBvbiBoaWdoLWZyZXF1ZW5jeSBldmVudHMgKHN0YXRlOnVwZGF0ZSwgZXRjLikuXG4gICAgaWYgKFxuICAgICAgZGlhZ25vc3RpY3NMZXZlbCAhPT0gJ29mZicgJiZcbiAgICAgIChlbnJpY2hlZCBhcyBhbnkpLnR5cGUgPT09ICd0cmFjZTplZmZlY3RvcCcgJiZcbiAgICAgIChlbnJpY2hlZCBhcyBhbnkpLmxpbmtJZCA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICBjb25zdCBsaW5rSWQgPSB5aWVsZCogRmliZXJSZWYuZ2V0KEVmZmVjdE9wQ29yZS5jdXJyZW50TGlua0lkKVxuICAgICAgaWYgKGxpbmtJZCkge1xuICAgICAgICA7KGVucmljaGVkIGFzIGFueSkubGlua0lkID0gbGlua0lkXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpbmtzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgeWllbGQqIHNpbmtzWzBdIS5yZWNvcmQoZW5yaWNoZWQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB5aWVsZCogRWZmZWN0LmZvckVhY2goc2lua3MsIChzaW5rKSA9PiBzaW5rLnJlY29yZChlbnJpY2hlZCksIHsgZGlzY2FyZDogdHJ1ZSB9KVxuICB9KVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgaW50ZXJuYWwgRGVidWcuRXZlbnQgaW50byBSdW50aW1lRGVidWdFdmVudFJlZjpcbiAqIC0gQWxsb3dzIERldnRvb2xzIC8gUnVudGltZSB0byBjb25zdW1lIERlYnVnIGV2ZW50cyB1bmlmb3JtbHkuXG4gKiAtIERvZXMgbm90IGNoYW5nZSBEZWJ1Z1NpbmsgYmVoYXZpb3I7IHByb3ZpZGVzIGEgc3RydWN0dXJlZCB2aWV3IG9ubHkuXG4gKi9cbmV4cG9ydCBjb25zdCB0b1J1bnRpbWVEZWJ1Z0V2ZW50UmVmID0gKFxuICBldmVudDogRXZlbnQsXG4gIG9wdGlvbnM/OiB7XG4gICAgcmVhZG9ubHkgZGlhZ25vc3RpY3NMZXZlbD86IERpYWdub3N0aWNzTGV2ZWxcbiAgICByZWFkb25seSBldmVudFNlcT86IG51bWJlclxuICAgIHJlYWRvbmx5IHJlc29sdmVDb252ZXJnZVN0YXRpY0lyPzogKHN0YXRpY0lyRGlnZXN0OiBzdHJpbmcpID0+IENvbnZlcmdlU3RhdGljSXJFeHBvcnQgfCB1bmRlZmluZWRcbiAgICByZWFkb25seSBvbk1ldGFQcm9qZWN0aW9uPzogKHByb2plY3Rpb246IHtcbiAgICAgIHJlYWRvbmx5IHN0YXRzOiBKc29uVmFsdWVQcm9qZWN0aW9uU3RhdHNcbiAgICAgIHJlYWRvbmx5IGRvd25ncmFkZT86IEpzb25Eb3duZ3JhZGVSZWFzb25cbiAgICB9KSA9PiB2b2lkXG4gIH0sXG4pOiBSdW50aW1lRGVidWdFdmVudFJlZiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGRpYWdub3N0aWNzTGV2ZWwgPSBvcHRpb25zPy5kaWFnbm9zdGljc0xldmVsID8/ICdmdWxsJ1xuICBpZiAoZGlhZ25vc3RpY3NMZXZlbCA9PT0gJ29mZicpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCBpc0xpZ2h0TGlrZSA9IGRpYWdub3N0aWNzTGV2ZWwgPT09ICdsaWdodCcgfHwgZGlhZ25vc3RpY3NMZXZlbCA9PT0gJ3NhbXBsZWQnXG5cbiAgY29uc3QgdGltZXN0YW1wID1cbiAgICB0eXBlb2YgZXZlbnQudGltZXN0YW1wID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoZXZlbnQudGltZXN0YW1wKSA/IGV2ZW50LnRpbWVzdGFtcCA6IERhdGUubm93KClcblxuICBjb25zdCBtb2R1bGVJZFJhdyA9IChldmVudCBhcyBhbnkpLm1vZHVsZUlkXG4gIGNvbnN0IG1vZHVsZUlkID0gdHlwZW9mIG1vZHVsZUlkUmF3ID09PSAnc3RyaW5nJyAmJiBtb2R1bGVJZFJhdy5sZW5ndGggPiAwID8gbW9kdWxlSWRSYXcgOiAndW5rbm93bidcblxuICBjb25zdCBpbnN0YW5jZUlkUmF3ID0gKGV2ZW50IGFzIGFueSkuaW5zdGFuY2VJZFxuICBjb25zdCBpbnN0YW5jZUlkID0gdHlwZW9mIGluc3RhbmNlSWRSYXcgPT09ICdzdHJpbmcnICYmIGluc3RhbmNlSWRSYXcubGVuZ3RoID4gMCA/IGluc3RhbmNlSWRSYXcgOiAndW5rbm93bidcblxuICBjb25zdCBydW50aW1lTGFiZWxSYXcgPSAoZXZlbnQgYXMgYW55KS5ydW50aW1lTGFiZWxcbiAgY29uc3QgcnVudGltZUxhYmVsID0gdHlwZW9mIHJ1bnRpbWVMYWJlbFJhdyA9PT0gJ3N0cmluZycgJiYgcnVudGltZUxhYmVsUmF3Lmxlbmd0aCA+IDAgPyBydW50aW1lTGFiZWxSYXcgOiB1bmRlZmluZWRcblxuICBjb25zdCB0eG5TZXFSYXcgPSAoZXZlbnQgYXMgYW55KS50eG5TZXFcbiAgY29uc3QgdHhuU2VxID1cbiAgICB0eXBlb2YgdHhuU2VxUmF3ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodHhuU2VxUmF3KSAmJiB0eG5TZXFSYXcgPj0gMCA/IE1hdGguZmxvb3IodHhuU2VxUmF3KSA6IDBcblxuICBjb25zdCB0eG5JZFJhdyA9IChldmVudCBhcyBhbnkpLnR4bklkXG4gIGNvbnN0IHR4bklkID1cbiAgICB0eXBlb2YgdHhuSWRSYXcgPT09ICdzdHJpbmcnICYmIHR4bklkUmF3Lmxlbmd0aCA+IDBcbiAgICAgID8gdHhuSWRSYXdcbiAgICAgIDogdHhuU2VxID4gMFxuICAgICAgICA/IGAke2luc3RhbmNlSWR9Ojp0JHt0eG5TZXF9YFxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGxpbmtJZCA9ICgoKSA9PiB7XG4gICAgY29uc3QgbGlua0lkUmF3ID0gKGV2ZW50IGFzIGFueSkubGlua0lkXG4gICAgaWYgKHR5cGVvZiBsaW5rSWRSYXcgPT09ICdzdHJpbmcnICYmIGxpbmtJZFJhdy5sZW5ndGggPiAwKSByZXR1cm4gbGlua0lkUmF3XG5cbiAgICAvLyB0cmFjZToqOiBhbGxvdyBmYWxsYmFjayBleHRyYWN0aW9uIGZyb20gZGF0YS5tZXRhLmxpbmtJZCAoYXZvaWQgVUkgZGl2aW5nIGludG8gZGVlcCBtZXRhKS5cbiAgICBpZiAodHlwZW9mIChldmVudCBhcyBhbnkpLnR5cGUgIT09ICdzdHJpbmcnIHx8ICEoZXZlbnQgYXMgYW55KS50eXBlLnN0YXJ0c1dpdGgoJ3RyYWNlOicpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgIGNvbnN0IG1ldGE6IGFueSA9IGRhdGE/Lm1ldGFcbiAgICBjb25zdCBsaW5rSWRGcm9tTWV0YSA9IG1ldGE/LmxpbmtJZFxuICAgIGlmICh0eXBlb2YgbGlua0lkRnJvbU1ldGEgPT09ICdzdHJpbmcnICYmIGxpbmtJZEZyb21NZXRhLmxlbmd0aCA+IDApIHJldHVybiBsaW5rSWRGcm9tTWV0YVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9KSgpXG5cbiAgY29uc3QgZXZlbnRTZXFSYXcgPSBvcHRpb25zPy5ldmVudFNlcVxuICBjb25zdCBldmVudFNlcSA9XG4gICAgdHlwZW9mIGV2ZW50U2VxUmF3ID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUoZXZlbnRTZXFSYXcpICYmIGV2ZW50U2VxUmF3ID4gMFxuICAgICAgPyBNYXRoLmZsb29yKGV2ZW50U2VxUmF3KVxuICAgICAgOiBuZXh0RXZlbnRTZXEoKVxuICBjb25zdCBldmVudElkID0gbWFrZUV2ZW50SWQoaW5zdGFuY2VJZCwgZXZlbnRTZXEpXG5cbiAgY29uc3QgYmFzZSA9IHtcbiAgICBldmVudElkLFxuICAgIGV2ZW50U2VxLFxuICAgIG1vZHVsZUlkLFxuICAgIGluc3RhbmNlSWQsXG4gICAgcnVudGltZUxhYmVsLFxuICAgIHR4blNlcSxcbiAgICB0eG5JZCxcbiAgICBsaW5rSWQsXG4gICAgdGltZXN0YW1wLFxuICB9IGFzIGNvbnN0XG5cbiAgbGV0IGRvd25ncmFkZTogRG93bmdyYWRlUmVhc29uIHwgdW5kZWZpbmVkXG5cbiAgY29uc3Qgd2l0aERvd25ncmFkZSA9IChyZWY6IE9taXQ8UnVudGltZURlYnVnRXZlbnRSZWYsICdkb3duZ3JhZGUnPik6IFJ1bnRpbWVEZWJ1Z0V2ZW50UmVmID0+IHtcbiAgICBpZiAoIWRvd25ncmFkZSkgcmV0dXJuIHJlZlxuICAgIHJldHVybiB7IC4uLnJlZiwgZG93bmdyYWRlOiB7IHJlYXNvbjogZG93bmdyYWRlIH0gfVxuICB9XG5cbiAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgY2FzZSAnbW9kdWxlOmluaXQnOlxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiAnbGlmZWN5Y2xlJyxcbiAgICAgICAgbGFiZWw6ICdtb2R1bGU6aW5pdCcsXG4gICAgICB9KVxuICAgIGNhc2UgJ21vZHVsZTpkZXN0cm95JzpcbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogJ2xpZmVjeWNsZScsXG4gICAgICAgIGxhYmVsOiAnbW9kdWxlOmRlc3Ryb3knLFxuICAgICAgfSlcbiAgICBjYXNlICdsaWZlY3ljbGU6cGhhc2UnOiB7XG4gICAgICBjb25zdCBlID0gZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnbGlmZWN5Y2xlOnBoYXNlJyB9PlxuICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2VcbiAgICAgICAgPyB7IHR5cGU6ICdsaWZlY3ljbGU6cGhhc2UnLCBwaGFzZTogZS5waGFzZSwgbmFtZTogZS5uYW1lIH1cbiAgICAgICAgOiB7IHR5cGU6ICdsaWZlY3ljbGU6cGhhc2UnLCBwaGFzZTogZS5waGFzZSwgbmFtZTogZS5uYW1lLCBwYXlsb2FkOiBlLnBheWxvYWQgfVxuICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICB9KVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG4gICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIGtpbmQ6ICdsaWZlY3ljbGUnLFxuICAgICAgICBsYWJlbDogZS5uYW1lLFxuICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGNhc2UgJ2FjdGlvbjpkaXNwYXRjaCc6IHtcbiAgICAgIGNvbnN0IGFjdGlvbjogYW55ID0gKGV2ZW50IGFzIGFueSkuYWN0aW9uXG4gICAgICBjb25zdCBhY3Rpb25UYWdSYXcgPSAoZXZlbnQgYXMgYW55KS5hY3Rpb25UYWdcbiAgICAgIGNvbnN0IHRhZyA9IHR5cGVvZiBhY3Rpb25UYWdSYXcgPT09ICdzdHJpbmcnICYmIGFjdGlvblRhZ1Jhdy5sZW5ndGggPiAwID8gYWN0aW9uVGFnUmF3IDogKGFjdGlvbj8uX3RhZyA/PyBhY3Rpb24/LnR5cGUpXG4gICAgICBjb25zdCBsYWJlbCA9IFN0cmluZyh0YWcgPz8gJ2FjdGlvbjpkaXNwYXRjaCcpXG4gICAgICBjb25zdCBsYWJlbE5vcm1hbGl6ZWQgPSBsYWJlbC5sZW5ndGggPiAwID8gbGFiZWwgOiAndW5rbm93bidcbiAgICAgIGNvbnN0IHVua25vd25BY3Rpb24gPSAoZXZlbnQgYXMgYW55KS51bmtub3duQWN0aW9uID09PSB0cnVlID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2VcbiAgICAgICAgPyB7IGFjdGlvblRhZzogbGFiZWxOb3JtYWxpemVkLCAuLi4odW5rbm93bkFjdGlvbiA/IHsgdW5rbm93bkFjdGlvbjogdHJ1ZSB9IDoge30pIH1cbiAgICAgICAgOiB7IGFjdGlvbiwgLi4uKHVua25vd25BY3Rpb24gPyB7IHVua25vd25BY3Rpb246IHRydWUgfSA6IHt9KSB9XG4gICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgIH0pXG4gICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcbiAgICAgIGlmICh1bmtub3duQWN0aW9uKSB7XG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgJ3Vua25vd24nKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiAnYWN0aW9uJyxcbiAgICAgICAgbGFiZWw6IGxhYmVsTm9ybWFsaXplZCxcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICB9KVxuICAgIH1cbiAgICBjYXNlICdzdGF0ZTp1cGRhdGUnOiB7XG4gICAgICBjb25zdCBlID0gZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnc3RhdGU6dXBkYXRlJyB9PlxuXG4gICAgICBjb25zdCByZXNvbHZlRGlydHlTZXRSb290UGF0aHMgPSAoKTogUmVhZG9ubHlBcnJheTxKc29uVmFsdWU+IHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZSA9IG9wdGlvbnM/LnJlc29sdmVDb252ZXJnZVN0YXRpY0lyXG4gICAgICAgIGlmICghcmVzb2x2ZSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICAgIGNvbnN0IGRpZ2VzdCA9IGUuc3RhdGljSXJEaWdlc3RcbiAgICAgICAgaWYgKHR5cGVvZiBkaWdlc3QgIT09ICdzdHJpbmcnIHx8IGRpZ2VzdC5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcblxuICAgICAgICBjb25zdCBkaXJ0eVNldCA9IGUuZGlydHlTZXQgYXMgYW55XG4gICAgICAgIGlmICghZGlydHlTZXQgfHwgdHlwZW9mIGRpcnR5U2V0ICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRpcnR5U2V0KSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICAgIGNvbnN0IHJvb3RJZHMgPSBkaXJ0eVNldC5yb290SWRzXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShyb290SWRzKSB8fCByb290SWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICAgIGNvbnN0IGlyID0gcmVzb2x2ZShkaWdlc3QpIGFzIENvbnZlcmdlU3RhdGljSXJFeHBvcnQgfCB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgZmllbGRQYXRocyA9IChpciBhcyBhbnkpPy5maWVsZFBhdGhzIGFzIHVua25vd25cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGZpZWxkUGF0aHMpIHx8IGZpZWxkUGF0aHMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICAgICAgY29uc3Qgb3V0OiBBcnJheTxKc29uVmFsdWU+ID0gW11cbiAgICAgICAgZm9yIChjb25zdCByYXdJZCBvZiByb290SWRzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByYXdJZCAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0Zpbml0ZShyYXdJZCkpIGNvbnRpbnVlXG4gICAgICAgICAgY29uc3QgaWQgPSBNYXRoLmZsb29yKHJhd0lkKVxuICAgICAgICAgIGlmIChpZCA8IDApIGNvbnRpbnVlXG4gICAgICAgICAgY29uc3QgcGF0aCA9IChmaWVsZFBhdGhzIGFzIGFueSlbaWRdIGFzIHVua25vd25cbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGF0aCkgfHwgcGF0aC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG4gICAgICAgICAgaWYgKCFwYXRoLmV2ZXJ5KChzZWcpID0+IHR5cGVvZiBzZWcgPT09ICdzdHJpbmcnICYmIHNlZy5sZW5ndGggPiAwKSkgY29udGludWVcbiAgICAgICAgICBvdXQucHVzaChwYXRoIGFzIGFueSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvdXQubGVuZ3RoID4gMCA/IG91dCA6IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBjb25zdCBkaXJ0eVNldFdpdGhSb290UGF0aHMgPSAoKCkgPT4ge1xuICAgICAgICBjb25zdCByb290UGF0aHMgPSByZXNvbHZlRGlydHlTZXRSb290UGF0aHMoKVxuICAgICAgICBpZiAoIXJvb3RQYXRocykgcmV0dXJuIGUuZGlydHlTZXRcbiAgICAgICAgY29uc3QgZGlydHlTZXQgPSBlLmRpcnR5U2V0IGFzIGFueVxuICAgICAgICBpZiAoIWRpcnR5U2V0IHx8IHR5cGVvZiBkaXJ0eVNldCAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkaXJ0eVNldCkpIHJldHVybiBlLmRpcnR5U2V0XG4gICAgICAgIHJldHVybiB7IC4uLmRpcnR5U2V0LCByb290UGF0aHMgfVxuICAgICAgfSkoKVxuXG4gICAgICBjb25zdCBtZXRhSW5wdXQgPSBpc0xpZ2h0TGlrZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHN0YXRlOiBlLnN0YXRlLFxuICAgICAgICAgICAgZGlydHlTZXQ6IGRpcnR5U2V0V2l0aFJvb3RQYXRocyxcbiAgICAgICAgICAgIHBhdGNoQ291bnQ6IGUucGF0Y2hDb3VudCxcbiAgICAgICAgICAgIHBhdGNoZXNUcnVuY2F0ZWQ6IGUucGF0Y2hlc1RydW5jYXRlZCxcbiAgICAgICAgICAgIHBhdGNoZXNUcnVuY2F0ZWRSZWFzb246IGUucGF0Y2hlc1RydW5jYXRlZFJlYXNvbixcbiAgICAgICAgICAgIHN0YXRpY0lyRGlnZXN0OiBlLnN0YXRpY0lyRGlnZXN0LFxuICAgICAgICAgICAgY29tbWl0TW9kZTogZS5jb21taXRNb2RlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IGUucHJpb3JpdHksXG4gICAgICAgICAgICBvcmlnaW5LaW5kOiBlLm9yaWdpbktpbmQsXG4gICAgICAgICAgICBvcmlnaW5OYW1lOiBlLm9yaWdpbk5hbWUsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHN0YXRlOiBlLnN0YXRlLFxuICAgICAgICAgICAgZGlydHlTZXQ6IGRpcnR5U2V0V2l0aFJvb3RQYXRocyxcbiAgICAgICAgICAgIHBhdGNoQ291bnQ6IGUucGF0Y2hDb3VudCxcbiAgICAgICAgICAgIHBhdGNoZXNUcnVuY2F0ZWQ6IGUucGF0Y2hlc1RydW5jYXRlZCxcbiAgICAgICAgICAgIHBhdGNoZXNUcnVuY2F0ZWRSZWFzb246IGUucGF0Y2hlc1RydW5jYXRlZFJlYXNvbixcbiAgICAgICAgICAgIHN0YXRpY0lyRGlnZXN0OiBlLnN0YXRpY0lyRGlnZXN0LFxuICAgICAgICAgICAgY29tbWl0TW9kZTogZS5jb21taXRNb2RlLFxuICAgICAgICAgICAgcHJpb3JpdHk6IGUucHJpb3JpdHksXG4gICAgICAgICAgICBvcmlnaW5LaW5kOiBlLm9yaWdpbktpbmQsXG4gICAgICAgICAgICBvcmlnaW5OYW1lOiBlLm9yaWdpbk5hbWUsXG4gICAgICAgICAgICB0cmFpdFN1bW1hcnk6IGUudHJhaXRTdW1tYXJ5LFxuICAgICAgICAgICAgcmVwbGF5RXZlbnQ6IGUucmVwbGF5RXZlbnQsXG4gICAgICAgICAgfVxuICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICB9KVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG4gICAgICBpZiAodHhuSWQpIHtcbiAgICAgICAgbGFzdFR4bkJ5SW5zdGFuY2Uuc2V0KGluc3RhbmNlSWQsIHsgdHhuSWQsIHR4blNlcSB9KVxuICAgICAgICBiYWNrZmlsbFBlbmRpbmdUeG5BbGlnbm1lbnQoaW5zdGFuY2VJZCwgeyB0eG5JZCwgdHhuU2VxIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIGtpbmQ6ICdzdGF0ZScsXG4gICAgICAgIGxhYmVsOiAnc3RhdGU6dXBkYXRlJyxcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICB9KVxuICAgIH1cbiAgICBjYXNlICdwcm9jZXNzOnN0YXJ0JzpcbiAgICBjYXNlICdwcm9jZXNzOnN0b3AnOlxuICAgIGNhc2UgJ3Byb2Nlc3M6cmVzdGFydCc6XG4gICAgY2FzZSAncHJvY2Vzczp0cmlnZ2VyJzpcbiAgICBjYXNlICdwcm9jZXNzOmRpc3BhdGNoJzpcbiAgICBjYXNlICdwcm9jZXNzOmVycm9yJzoge1xuICAgICAgY29uc3QgZSA9IGV2ZW50IGFzIEV4dHJhY3Q8XG4gICAgICAgIEV2ZW50LFxuICAgICAgICB7XG4gICAgICAgICAgcmVhZG9ubHkgdHlwZTpcbiAgICAgICAgICAgIHwgJ3Byb2Nlc3M6c3RhcnQnXG4gICAgICAgICAgICB8ICdwcm9jZXNzOnN0b3AnXG4gICAgICAgICAgICB8ICdwcm9jZXNzOnJlc3RhcnQnXG4gICAgICAgICAgICB8ICdwcm9jZXNzOnRyaWdnZXInXG4gICAgICAgICAgICB8ICdwcm9jZXNzOmRpc3BhdGNoJ1xuICAgICAgICAgICAgfCAncHJvY2VzczplcnJvcidcbiAgICAgICAgfVxuICAgICAgPlxuXG4gICAgICBjb25zdCB0czIgPSB0eXBlb2YgZS50aW1lc3RhbXBNcyA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKGUudGltZXN0YW1wTXMpID8gZS50aW1lc3RhbXBNcyA6IHRpbWVzdGFtcFxuXG4gICAgICBjb25zdCBtZXRhSW5wdXQgPSB7XG4gICAgICAgIGlkZW50aXR5OiBlLmlkZW50aXR5LFxuICAgICAgICBzZXZlcml0eTogZS5zZXZlcml0eSxcbiAgICAgICAgZXZlbnRTZXE6IGUuZXZlbnRTZXEsXG4gICAgICAgIHRpbWVzdGFtcE1zOiBlLnRpbWVzdGFtcE1zLFxuICAgICAgICB0cmlnZ2VyOiBlLnRyaWdnZXIsXG4gICAgICAgIGRpc3BhdGNoOiBlLmRpc3BhdGNoLFxuICAgICAgICBlcnJvcjogZS5lcnJvcixcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgfSlcbiAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICBjb25zdCBlcnJvclN1bW1hcnkgPVxuICAgICAgICBlLnR5cGUgPT09ICdwcm9jZXNzOmVycm9yJyB8fCBlLnR5cGUgPT09ICdwcm9jZXNzOnJlc3RhcnQnXG4gICAgICAgICAgPyAoZS5lcnJvciBhcyBhbnkgYXMgU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5IHwgdW5kZWZpbmVkKVxuICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgdGltZXN0YW1wOiB0czIsXG4gICAgICAgIGtpbmQ6ICdwcm9jZXNzJyxcbiAgICAgICAgbGFiZWw6IGUudHlwZSxcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIGVycm9yU3VtbWFyeSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGNhc2UgJ2xpZmVjeWNsZTplcnJvcic6IHtcbiAgICAgIGNvbnN0IGUgPSBldmVudCBhcyBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6ICdsaWZlY3ljbGU6ZXJyb3InIH0+XG4gICAgICBjb25zdCBzdW1tYXJ5ID0gdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkoZS5jYXVzZSlcbiAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgc3VtbWFyeS5kb3duZ3JhZGUpXG4gICAgICBjb25zdCBtZXRhSW5wdXQgPSBpc0xpZ2h0TGlrZVxuICAgICAgICA/IHsgdHlwZTogJ2xpZmVjeWNsZTplcnJvcicsIHBoYXNlOiBlLnBoYXNlLCBuYW1lOiBlLmhvb2sgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHR5cGU6ICdsaWZlY3ljbGU6ZXJyb3InLFxuICAgICAgICAgICAgcGhhc2U6IGUucGhhc2UsXG4gICAgICAgICAgICBuYW1lOiBlLmhvb2ssXG4gICAgICAgICAgICBob29rOiBlLmhvb2ssXG4gICAgICAgICAgICB0YXNrSWQ6IGUudGFza0lkLFxuICAgICAgICAgICAgb3JpZ2luOiBlLm9yaWdpbixcbiAgICAgICAgICAgIHR4blNlcTogZS50eG5TZXEsXG4gICAgICAgICAgICBvcFNlcTogZS5vcFNlcSxcbiAgICAgICAgICB9XG4gICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgIH0pXG4gICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogJ2xpZmVjeWNsZScsXG4gICAgICAgIGxhYmVsOiAnbGlmZWN5Y2xlOmVycm9yJyxcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIGVycm9yU3VtbWFyeTogc3VtbWFyeS5lcnJvclN1bW1hcnksXG4gICAgICB9KVxuICAgIH1cbiAgICBjYXNlICdkaWFnbm9zdGljJzoge1xuICAgICAgY29uc3QgZSA9IGV2ZW50IGFzIEV4dHJhY3Q8RXZlbnQsIHsgcmVhZG9ubHkgdHlwZTogJ2RpYWdub3N0aWMnIH0+XG4gICAgICBjb25zdCBtZXRhSW5wdXQgPSB7XG4gICAgICAgIGNvZGU6IGUuY29kZSxcbiAgICAgICAgc2V2ZXJpdHk6IGUuc2V2ZXJpdHksXG4gICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSxcbiAgICAgICAgaGludDogZS5oaW50LFxuICAgICAgICBhY3Rpb25UYWc6IGUuYWN0aW9uVGFnLFxuICAgICAgICBraW5kOiBlLmtpbmQsXG4gICAgICAgIHRyaWdnZXI6IGUudHJpZ2dlcixcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgfSlcbiAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiAnZGlhZ25vc3RpYycsXG4gICAgICAgIGxhYmVsOiBlLmNvZGUsXG4gICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgfSlcbiAgICB9XG4gICAgY2FzZSAnd2Fybjpwcmlvcml0eS1pbnZlcnNpb24nOiB7XG4gICAgICBjb25zdCBlID0gZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAnd2Fybjpwcmlvcml0eS1pbnZlcnNpb24nIH0+XG4gICAgICBjb25zdCBtZXRhSW5wdXQgPSBpc0xpZ2h0TGlrZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHRpY2tTZXE6IGUudGlja1NlcSxcbiAgICAgICAgICAgIHJlYXNvbjogZS5yZWFzb24sXG4gICAgICAgICAgICBzZWxlY3RvcklkOiBlLnNlbGVjdG9ySWQsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHRpY2tTZXE6IGUudGlja1NlcSxcbiAgICAgICAgICAgIHJlYXNvbjogZS5yZWFzb24sXG4gICAgICAgICAgICBzZWxlY3RvcklkOiBlLnNlbGVjdG9ySWQsXG4gICAgICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgIH0pXG4gICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiAnZGlhZ25vc3RpYycsXG4gICAgICAgIGxhYmVsOiBlLnR5cGUsXG4gICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgfSlcbiAgICB9XG4gICAgY2FzZSAnd2FybjptaWNyb3Rhc2stc3RhcnZhdGlvbic6IHtcbiAgICAgIGNvbnN0IGUgPSBldmVudCBhcyBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6ICd3YXJuOm1pY3JvdGFzay1zdGFydmF0aW9uJyB9PlxuICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2VcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB0aWNrU2VxOiBlLnRpY2tTZXEsXG4gICAgICAgICAgICBtaWNyb3Rhc2tDaGFpbkRlcHRoOiBlLm1pY3JvdGFza0NoYWluRGVwdGgsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIHRpY2tTZXE6IGUudGlja1NlcSxcbiAgICAgICAgICAgIG1pY3JvdGFza0NoYWluRGVwdGg6IGUubWljcm90YXNrQ2hhaW5EZXB0aCxcbiAgICAgICAgICB9XG5cbiAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgfSlcbiAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIGtpbmQ6ICdkaWFnbm9zdGljJyxcbiAgICAgICAgbGFiZWw6IGUudHlwZSxcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICB9KVxuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBpZiAodHlwZW9mIGV2ZW50LnR5cGUgIT09ICdzdHJpbmcnIHx8ICFldmVudC50eXBlLnN0YXJ0c1dpdGgoJ3RyYWNlOicpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6dGljazogcnVudGltZSB0aWNrIGV2aWRlbmNlOyBrZWVwIFNsaW0gcGF5bG9hZCBldmVuIGluIGxpZ2h0IHRpZXIuXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3RyYWNlOnRpY2snKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IChldmVudCBhcyBhbnkpLmRhdGFcbiAgICAgICAgY29uc3QgbWV0YUlucHV0ID0gaXNMaWdodExpa2VcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgdGlja1NlcTogZGF0YT8udGlja1NlcSxcbiAgICAgICAgICAgICAgcGhhc2U6IGRhdGE/LnBoYXNlLFxuICAgICAgICAgICAgICBzY2hlZHVsZTogZGF0YT8uc2NoZWR1bGUsXG4gICAgICAgICAgICAgIHRyaWdnZXJTdW1tYXJ5OiBkYXRhPy50cmlnZ2VyU3VtbWFyeSxcbiAgICAgICAgICAgICAgYW5jaG9yczogZGF0YT8uYW5jaG9ycyxcbiAgICAgICAgICAgICAgYnVkZ2V0OiBkYXRhPy5idWRnZXQsXG4gICAgICAgICAgICAgIGJhY2tsb2c6IGRhdGE/LmJhY2tsb2csXG4gICAgICAgICAgICAgIHJlc3VsdDogZGF0YT8ucmVzdWx0LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiAnZGV2dG9vbHMnLFxuICAgICAgICAgIGxhYmVsOiBldmVudC50eXBlLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTp0eG4tbGFuZTogc2xpbSBldmlkZW5jZSBmb3IgVHhuIExhbmVzIChsYW5lL2JhY2tsb2cvcmVhc29ucyksIHVzZWQgZm9yIERldnRvb2xzIHN1bW1hcnkgYW5kIG9mZmxpbmUgZXhwb3J0LlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTp0eG4tbGFuZScpIHtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgICAgICBjb25zdCBldmlkZW5jZSA9IGRhdGE/LmV2aWRlbmNlID8/IGRhdGFcblxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUoZXZpZGVuY2UpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICBjb25zdCBsYWJlbCA9XG4gICAgICAgICAgdHlwZW9mIGV2aWRlbmNlPy5raW5kID09PSAnc3RyaW5nJyAmJiBldmlkZW5jZS5raW5kLmxlbmd0aCA+IDAgPyBTdHJpbmcoZXZpZGVuY2Uua2luZCkgOiAndHhuLWxhbmUnXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogJ3R4bi1sYW5lJyxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6cmVhY3QtcmVuZGVyIC8gdHJhY2U6cmVhY3Qtc2VsZWN0b3I6IGtlZXAgc2xpbSBtZXRhIG9ubHkgKGZpZWxkIHRyaW1taW5nIGlzIGhhbmRsZWQgYnkgSnNvblZhbHVlIHByb2plY3Rpb24pLlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTpyZWFjdC1yZW5kZXInIHx8IGV2ZW50LnR5cGUgPT09ICd0cmFjZTpyZWFjdC1zZWxlY3RvcicpIHtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUoXG4gICAgICAgICAgaXNMaWdodExpa2VcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudExhYmVsOiBkYXRhPy5jb21wb25lbnRMYWJlbCxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcktleTogZGF0YT8uc2VsZWN0b3JLZXksXG4gICAgICAgICAgICAgICAgZmllbGRQYXRoczogZGF0YT8uZmllbGRQYXRocyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcklkOiBkYXRhPy5zZWxlY3RvcklkLFxuICAgICAgICAgICAgICAgIGxhbmU6IGRhdGE/LmxhbmUsXG4gICAgICAgICAgICAgICAgcHJvZHVjZXI6IGRhdGE/LnByb2R1Y2VyLFxuICAgICAgICAgICAgICAgIGZhbGxiYWNrUmVhc29uOiBkYXRhPy5mYWxsYmFja1JlYXNvbixcbiAgICAgICAgICAgICAgICByZWFkc0RpZ2VzdDogZGF0YT8ucmVhZHNEaWdlc3QsXG4gICAgICAgICAgICAgICAgZXF1YWxzS2luZDogZGF0YT8uZXF1YWxzS2luZCxcbiAgICAgICAgICAgICAgICBzdHJpY3RNb2RlUGhhc2U6IGRhdGE/LnN0cmljdE1vZGVQaGFzZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50TGFiZWw6IGRhdGE/LmNvbXBvbmVudExhYmVsLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yS2V5OiBkYXRhPy5zZWxlY3RvcktleSxcbiAgICAgICAgICAgICAgICBmaWVsZFBhdGhzOiBkYXRhPy5maWVsZFBhdGhzLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9ySWQ6IGRhdGE/LnNlbGVjdG9ySWQsXG4gICAgICAgICAgICAgICAgbGFuZTogZGF0YT8ubGFuZSxcbiAgICAgICAgICAgICAgICBwcm9kdWNlcjogZGF0YT8ucHJvZHVjZXIsXG4gICAgICAgICAgICAgICAgZmFsbGJhY2tSZWFzb246IGRhdGE/LmZhbGxiYWNrUmVhc29uLFxuICAgICAgICAgICAgICAgIHJlYWRzRGlnZXN0OiBkYXRhPy5yZWFkc0RpZ2VzdCxcbiAgICAgICAgICAgICAgICBlcXVhbHNLaW5kOiBkYXRhPy5lcXVhbHNLaW5kLFxuICAgICAgICAgICAgICAgIHN0cmljdE1vZGVQaGFzZTogZGF0YT8uc3RyaWN0TW9kZVBoYXNlLFxuICAgICAgICAgICAgICAgIG1ldGE6IGRhdGE/Lm1ldGEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuICAgICAgICBjb25zdCBsYWJlbCA9XG4gICAgICAgICAgdHlwZW9mIGRhdGE/LmNvbXBvbmVudExhYmVsID09PSAnc3RyaW5nJyAmJiBkYXRhLmNvbXBvbmVudExhYmVsLmxlbmd0aCA+IDBcbiAgICAgICAgICAgID8gZGF0YS5jb21wb25lbnRMYWJlbFxuICAgICAgICAgICAgOiBldmVudC50eXBlID09PSAndHJhY2U6cmVhY3Qtc2VsZWN0b3InXG4gICAgICAgICAgICAgID8gJ3JlYWN0LXNlbGVjdG9yJ1xuICAgICAgICAgICAgICA6ICdyZWFjdC1yZW5kZXInXG4gICAgICAgIGNvbnN0IGxhc3QgPSBsYXN0VHhuQnlJbnN0YW5jZS5nZXQoaW5zdGFuY2VJZClcbiAgICAgICAgY29uc3QgdHhuU2VxRnJvbU1ldGEgPVxuICAgICAgICAgIHR5cGVvZiBkYXRhPy5tZXRhPy50eG5TZXEgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShkYXRhLm1ldGEudHhuU2VxKSAmJiBkYXRhLm1ldGEudHhuU2VxID49IDBcbiAgICAgICAgICAgID8gTWF0aC5mbG9vcihkYXRhLm1ldGEudHhuU2VxKVxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgdHhuSWRGcm9tTWV0YSA9XG4gICAgICAgICAgdHlwZW9mIGRhdGE/Lm1ldGE/LnR4bklkID09PSAnc3RyaW5nJyAmJiBkYXRhLm1ldGEudHhuSWQubGVuZ3RoID4gMCA/IGRhdGEubWV0YS50eG5JZCA6IHVuZGVmaW5lZFxuICAgICAgICBjb25zdCB0eG5JZEFsaWduZWQgPSB0eG5JZEZyb21NZXRhID8/IGJhc2UudHhuSWQgPz8gbGFzdD8udHhuSWRcbiAgICAgICAgY29uc3QgdHhuU2VxQWxpZ25lZCA9IHR4blNlcUZyb21NZXRhID8/IChiYXNlLnR4blNlcSA+IDAgPyBiYXNlLnR4blNlcSA6IChsYXN0Py50eG5TZXEgPz8gYmFzZS50eG5TZXEpKVxuICAgICAgICBjb25zdCByZWYgPSB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIHR4bklkOiB0eG5JZEFsaWduZWQsXG4gICAgICAgICAgdHhuU2VxOiB0eG5TZXFBbGlnbmVkLFxuICAgICAgICAgIGtpbmQ6IGV2ZW50LnR5cGUgPT09ICd0cmFjZTpyZWFjdC1zZWxlY3RvcicgPyAncmVhY3Qtc2VsZWN0b3InIDogJ3JlYWN0LXJlbmRlcicsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGluc3RhbmNlSWQgIT09ICd1bmtub3duJyAmJiAocmVmLnR4bklkID09IG51bGwgfHwgcmVmLnR4blNlcSA8PSAwKSkge1xuICAgICAgICAgIGVucXVldWVQZW5kaW5nVHhuQWxpZ25tZW50KGluc3RhbmNlSWQsIHJlZilcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWZcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6c2VsZWN0b3I6ZXZhbDogU2VsZWN0b3JHcmFwaCBldmFsdWF0aW9uIGV2aWRlbmNlIHdpdGhpbiBjb21taXQgKHVzZWQgZm9yIHR4blx1MjE5MnNlbGVjdG9yXHUyMTkycmVuZGVyIGNhdXNhbCBjaGFpbikuXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3RyYWNlOnNlbGVjdG9yOmV2YWwnKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IChldmVudCBhcyBhbnkpLmRhdGFcbiAgICAgICAgY29uc3QgbWV0YUlucHV0ID0ge1xuICAgICAgICAgIHNlbGVjdG9ySWQ6IGRhdGE/LnNlbGVjdG9ySWQsXG4gICAgICAgICAgbGFuZTogZGF0YT8ubGFuZSxcbiAgICAgICAgICBwcm9kdWNlcjogZGF0YT8ucHJvZHVjZXIsXG4gICAgICAgICAgZmFsbGJhY2tSZWFzb246IGRhdGE/LmZhbGxiYWNrUmVhc29uLFxuICAgICAgICAgIHJlYWRzRGlnZXN0OiBkYXRhPy5yZWFkc0RpZ2VzdCxcbiAgICAgICAgICBlcXVhbHNLaW5kOiBkYXRhPy5lcXVhbHNLaW5kLFxuICAgICAgICAgIGNoYW5nZWQ6IGRhdGE/LmNoYW5nZWQsXG4gICAgICAgICAgZXZhbE1zOiBkYXRhPy5ldmFsTXMsXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogJ2RldnRvb2xzJyxcbiAgICAgICAgICBsYWJlbDogZXZlbnQudHlwZSxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6ZXhlYy12bTogRXhlYyBWTSBoaXQvbWlzcyBldmlkZW5jZSAoMDQ5KS4gSW4gbGlnaHQgdGllciB3ZSBrZWVwIG1pbmltYWwgc3VtbWFyeSBmaWVsZHMuXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3RyYWNlOmV4ZWMtdm0nKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IChldmVudCBhcyBhbnkpLmRhdGFcbiAgICAgICAgY29uc3QgbWV0YUlucHV0ID0ge1xuICAgICAgICAgIHZlcnNpb246IGRhdGE/LnZlcnNpb24sXG4gICAgICAgICAgc3RhZ2U6IGRhdGE/LnN0YWdlLFxuICAgICAgICAgIGhpdDogZGF0YT8uaGl0LFxuICAgICAgICAgIHJlYXNvbkNvZGU6IGRhdGE/LnJlYXNvbkNvZGUgPz8gZGF0YT8ucmVhc29uLFxuICAgICAgICAgIHJlYXNvbkRldGFpbDogZGF0YT8ucmVhc29uRGV0YWlsLFxuICAgICAgICAgIGV4ZWNJclZlcnNpb246IGRhdGE/LmV4ZWNJclZlcnNpb24sXG4gICAgICAgICAgZXhlY0lySGFzaDogZGF0YT8uZXhlY0lySGFzaCxcbiAgICAgICAgICBzZXJ2aWNlSWQ6IGRhdGE/LnNlcnZpY2VJZCxcbiAgICAgICAgICBpbXBsSWQ6IGRhdGE/LmltcGxJZCxcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiAnZGV2dG9vbHMnLFxuICAgICAgICAgIGxhYmVsOiBldmVudC50eXBlLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTp0cmFpdDpjb252ZXJnZTogY29udmVyZ2UgZXZpZGVuY2UgbXVzdCBiZSBleHBvcnRhYmxlIChKc29uVmFsdWUgaGFyZCBnYXRlKSBhbmQgdHJpbXMgaGVhdnkgZmllbGRzIGluIGxpZ2h0IHRpZXIuXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3RyYWNlOnRyYWl0OmNvbnZlcmdlJykge1xuICAgICAgICBjb25zdCByZXNvbHZlRGlydHlSb290UGF0aHMgPSAoYXJnczoge1xuICAgICAgICAgIHJlYWRvbmx5IHN0YXRpY0lyRGlnZXN0OiB1bmtub3duXG4gICAgICAgICAgcmVhZG9ubHkgcm9vdElkczogdW5rbm93blxuICAgICAgICB9KTogUmVhZG9ubHlBcnJheTxKc29uVmFsdWU+IHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlID0gb3B0aW9ucz8ucmVzb2x2ZUNvbnZlcmdlU3RhdGljSXJcbiAgICAgICAgICBpZiAoIXJlc29sdmUpIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBkaWdlc3QgPSBhcmdzLnN0YXRpY0lyRGlnZXN0XG4gICAgICAgICAgaWYgKHR5cGVvZiBkaWdlc3QgIT09ICdzdHJpbmcnIHx8IGRpZ2VzdC5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcblxuICAgICAgICAgIGNvbnN0IHJvb3RJZHMgPSBhcmdzLnJvb3RJZHNcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocm9vdElkcykgfHwgcm9vdElkcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcblxuICAgICAgICAgIGNvbnN0IGlyID0gcmVzb2x2ZShkaWdlc3QpIGFzIENvbnZlcmdlU3RhdGljSXJFeHBvcnQgfCB1bmRlZmluZWRcbiAgICAgICAgICBjb25zdCBmaWVsZFBhdGhzID0gKGlyIGFzIGFueSk/LmZpZWxkUGF0aHMgYXMgdW5rbm93blxuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShmaWVsZFBhdGhzKSB8fCBmaWVsZFBhdGhzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgICAgICAgY29uc3Qgb3V0OiBBcnJheTxKc29uVmFsdWU+ID0gW11cbiAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHJvb3RJZHMpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNGaW5pdGUoaWQpKSBjb250aW51ZVxuICAgICAgICAgICAgY29uc3QgaWR4ID0gTWF0aC5mbG9vcihpZClcbiAgICAgICAgICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBmaWVsZFBhdGhzLmxlbmd0aCkgY29udGludWVcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBmaWVsZFBhdGhzW2lkeF1cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGgpKSB7XG4gICAgICAgICAgICAgIG91dC5wdXNoKHBhdGggYXMgYW55KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBvdXQubGVuZ3RoID4gMCA/IG91dCA6IHVuZGVmaW5lZFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZW5yaWNoRGlydHlSb290UGF0aHMgPSAodmFsdWU6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSA9PiB7XG4gICAgICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICAgICAgICAgIGNvbnN0IGFueVZhbHVlID0gdmFsdWUgYXMgYW55XG4gICAgICAgICAgY29uc3QgZGlydHkgPSBhbnlWYWx1ZS5kaXJ0eVxuICAgICAgICAgIGlmICghZGlydHkgfHwgdHlwZW9mIGRpcnR5ICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRpcnR5KSkgcmV0dXJuIHZhbHVlXG5cbiAgICAgICAgICBjb25zdCBkaXJ0eVJvb3RQYXRocyA9IHJlc29sdmVEaXJ0eVJvb3RQYXRocyh7XG4gICAgICAgICAgICBzdGF0aWNJckRpZ2VzdDogYW55VmFsdWUuc3RhdGljSXJEaWdlc3QsXG4gICAgICAgICAgICByb290SWRzOiBkaXJ0eT8ucm9vdElkcyxcbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmICghZGlydHlSb290UGF0aHMpIHJldHVybiB2YWx1ZVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmFueVZhbHVlLFxuICAgICAgICAgICAgZGlydHk6IHtcbiAgICAgICAgICAgICAgLi4uKGRpcnR5IGFzIGFueSksXG4gICAgICAgICAgICAgIHJvb3RQYXRoczogZGlydHlSb290UGF0aHMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gYXMgSnNvblZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdHJpcEhlYXZ5TGlnaHQgPSAodmFsdWU6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSA9PiB7XG4gICAgICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICAgICAgICAgIGNvbnN0IGFueVZhbHVlID0gdmFsdWUgYXMgYW55XG4gICAgICAgICAgY29uc3QgZGlydHkgPSBhbnlWYWx1ZS5kaXJ0eVxuICAgICAgICAgIGNvbnN0IGRpcnR5Um9vdFBhdGhzID0gcmVzb2x2ZURpcnR5Um9vdFBhdGhzKHtcbiAgICAgICAgICAgIHN0YXRpY0lyRGlnZXN0OiBhbnlWYWx1ZS5zdGF0aWNJckRpZ2VzdCxcbiAgICAgICAgICAgIHJvb3RJZHM6IGRpcnR5Py5yb290SWRzLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29uc3QgZGlydHlTbGltID1cbiAgICAgICAgICAgIGRpcnR5ICYmIHR5cGVvZiBkaXJ0eSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZGlydHkpXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgZGlydHlBbGw6IChkaXJ0eSBhcyBhbnkpLmRpcnR5QWxsLFxuICAgICAgICAgICAgICAgICAgLi4uKHR5cGVvZiAoZGlydHkgYXMgYW55KS5yZWFzb24gPT09ICdzdHJpbmcnID8geyByZWFzb246IChkaXJ0eSBhcyBhbnkpLnJlYXNvbiB9IDogbnVsbCksXG4gICAgICAgICAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheSgoZGlydHkgYXMgYW55KS5yb290SWRzKSA/IHsgcm9vdElkczogKGRpcnR5IGFzIGFueSkucm9vdElkcyB9IDogbnVsbCksXG4gICAgICAgICAgICAgICAgICAuLi4odHlwZW9mIChkaXJ0eSBhcyBhbnkpLnJvb3RJZHNUcnVuY2F0ZWQgPT09ICdib29sZWFuJ1xuICAgICAgICAgICAgICAgICAgICA/IHsgcm9vdElkc1RydW5jYXRlZDogKGRpcnR5IGFzIGFueSkucm9vdElkc1RydW5jYXRlZCB9XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCksXG4gICAgICAgICAgICAgICAgICAuLi4oZGlydHlSb290UGF0aHMgPyB7IHJvb3RQYXRoczogZGlydHlSb290UGF0aHMgfSA6IG51bGwpLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgICAgIGNvbnN0IHsgdG9wMywgZGlydHlSb290cywgLi4ucmVzdCB9ID0gYW55VmFsdWVcbiAgICAgICAgICByZXR1cm4gKGRpcnR5U2xpbSA/IHsgLi4ucmVzdCwgZGlydHk6IGRpcnR5U2xpbSB9IDogcmVzdCkgYXMgSnNvblZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdHJpcEhlYXZ5U2FtcGxlZCA9ICh2YWx1ZTogSnNvblZhbHVlKTogSnNvblZhbHVlID0+IHtcbiAgICAgICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuXG4gICAgICAgICAgY29uc3QgYW55VmFsdWUgPSB2YWx1ZSBhcyBhbnlcbiAgICAgICAgICBjb25zdCBkaXJ0eSA9IGFueVZhbHVlLmRpcnR5XG4gICAgICAgICAgY29uc3QgZGlydHlTbGltID1cbiAgICAgICAgICAgIGRpcnR5ICYmIHR5cGVvZiBkaXJ0eSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZGlydHkpXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgZGlydHlBbGw6IChkaXJ0eSBhcyBhbnkpLmRpcnR5QWxsLFxuICAgICAgICAgICAgICAgICAgLi4uKHR5cGVvZiAoZGlydHkgYXMgYW55KS5yZWFzb24gPT09ICdzdHJpbmcnID8geyByZWFzb246IChkaXJ0eSBhcyBhbnkpLnJlYXNvbiB9IDogbnVsbCksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICAgICAgY29uc3QgeyBkaXJ0eVJvb3RzLCAuLi5yZXN0IH0gPSBhbnlWYWx1ZVxuICAgICAgICAgIHJldHVybiAoZGlydHlTbGltID8geyAuLi5yZXN0LCBkaXJ0eTogZGlydHlTbGltIH0gOiByZXN0KSBhcyBKc29uVmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSAoZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAndHJhY2U6dHJhaXQ6Y29udmVyZ2UnIH0+KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9XG4gICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCA9PT0gJ2xpZ2h0J1xuICAgICAgICAgICAgPyBzdHJpcEhlYXZ5TGlnaHQoZGF0YSlcbiAgICAgICAgICAgIDogZGlhZ25vc3RpY3NMZXZlbCA9PT0gJ3NhbXBsZWQnXG4gICAgICAgICAgICAgID8gc3RyaXBIZWF2eVNhbXBsZWQoZGF0YSlcbiAgICAgICAgICAgICAgOiBlbnJpY2hEaXJ0eVJvb3RQYXRocyhkYXRhKVxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogJ3RyYWl0OmNvbnZlcmdlJyxcbiAgICAgICAgICBsYWJlbDogJ3RyYWl0OmNvbnZlcmdlJyxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6dHJhaXQ6Y2hlY2s6IHZhbGlkYXRpb24gZGlhZ25vc3RpY3MgbXVzdCBiZSBleHBvcnRhYmxlIGFuZCBzdGF5IHNsaW0gaW4gbGlnaHQgdGllciAoa2VlcCBrZXkgZmllbGRzKS5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6dHJhaXQ6Y2hlY2snKSB7XG4gICAgICAgIGNvbnN0IHN0cmlwSGVhdnkgPSAodmFsdWU6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSA9PiB7XG4gICAgICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWVcbiAgICAgICAgICBjb25zdCBhbnlWYWx1ZSA9IHZhbHVlIGFzIGFueVxuICAgICAgICAgIGNvbnN0IGRlZ3JhZGVkID0gYW55VmFsdWUuZGVncmFkZWRcbiAgICAgICAgICBjb25zdCBkZWdyYWRlZFNsaW0gPVxuICAgICAgICAgICAgZGVncmFkZWQgJiYgdHlwZW9mIGRlZ3JhZGVkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShkZWdyYWRlZClcbiAgICAgICAgICAgICAgPyB7IGtpbmQ6IChkZWdyYWRlZCBhcyBhbnkpLmtpbmQgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgICAgICAgY29uc3QgeyBkZWdyYWRlZDogX2RlZ3JhZGVkLCAuLi5yZXN0IH0gPSBhbnlWYWx1ZVxuICAgICAgICAgIHJldHVybiAoZGVncmFkZWRTbGltID8geyAuLi5yZXN0LCBkZWdyYWRlZDogZGVncmFkZWRTbGltIH0gOiByZXN0KSBhcyBKc29uVmFsdWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGEgPSAoZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAndHJhY2U6dHJhaXQ6Y2hlY2snIH0+KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9IGlzTGlnaHRMaWtlID8gc3RyaXBIZWF2eShkYXRhKSA6IGRhdGFcbiAgICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGtpbmQ6ICd0cmFpdDpjaGVjaycsXG4gICAgICAgICAgbGFiZWw6ICd0cmFpdDpjaGVjaycsXG4gICAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIHRyYWNlOnRyYWl0OnZhbGlkYXRlOiB2YWxpZGF0aW9uIGRlY2lzaW9uIHN1bW1hcnkgbXVzdCBiZSBleHBvcnRhYmxlIGFuZCBzbGltIGluIGxpZ2h0IHRpZXIgKG5vIGhlYXZ5IGZpZWxkcyBieSBkZWZhdWx0KS5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6dHJhaXQ6dmFsaWRhdGUnKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSAoZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiAndHJhY2U6dHJhaXQ6dmFsaWRhdGUnIH0+KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShkYXRhKVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogJ3RyYWl0OnZhbGlkYXRlJyxcbiAgICAgICAgICBsYWJlbDogJ3RyYWl0OnZhbGlkYXRlJyxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6bW9kdWxlOnRyYWl0czogZmluYWwgdHJhaXRzIHNuYXBzaG90IG11c3QgYmUgZXhwb3J0YWJsZSBhbmQgc2xpbSBpbiBsaWdodCB0aWVyIChkaWdlc3QvY291bnQpLlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICd0cmFjZTptb2R1bGU6dHJhaXRzJykge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9IGlzTGlnaHRMaWtlXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGRpZ2VzdDogZGF0YT8uZGlnZXN0LFxuICAgICAgICAgICAgICBjb3VudDogZGF0YT8uY291bnQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGRpZ2VzdDogZGF0YT8uZGlnZXN0LFxuICAgICAgICAgICAgICBjb3VudDogZGF0YT8uY291bnQsXG4gICAgICAgICAgICAgIHRyYWl0czogZGF0YT8udHJhaXRzLFxuICAgICAgICAgICAgICBwcm92ZW5hbmNlSW5kZXg6IGRhdGE/LnByb3ZlbmFuY2VJbmRleCxcbiAgICAgICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogJ2RldnRvb2xzJyxcbiAgICAgICAgICBsYWJlbDogZXZlbnQudHlwZSxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6bW9kdWxlOnRyYWl0czpjb25mbGljdDogY29uZmxpY3QgZGV0YWlscyBtdXN0IGJlIGV4cG9ydGFibGU7IGF2b2lkIHJlbHlpbmcgb24gdHJ1bmNhdGVkIGxpZmVjeWNsZTplcnJvciBtZXNzYWdlcy5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAndHJhY2U6bW9kdWxlOnRyYWl0czpjb25mbGljdCcpIHtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gKGV2ZW50IGFzIGFueSkuZGF0YVxuICAgICAgICBjb25zdCBtZXRhSW5wdXQgPSBpc0xpZ2h0TGlrZVxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjb25mbGljdENvdW50OiBkYXRhPy5jb25mbGljdENvdW50LFxuICAgICAgICAgICAgICB0cmFpdElkczogZGF0YT8udHJhaXRJZHMsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGNvbmZsaWN0Q291bnQ6IGRhdGE/LmNvbmZsaWN0Q291bnQsXG4gICAgICAgICAgICAgIGNvbmZsaWN0czogZGF0YT8uY29uZmxpY3RzLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiAnZGV2dG9vbHMnLFxuICAgICAgICAgIGxhYmVsOiBldmVudC50eXBlLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTptb2R1bGU6ZGVzY3JpcHRvcjoga2VlcCBrZXkgYW5jaG9ycyBldmVuIGluIGxpZ2h0IHRpZXIgKGF2b2lkIGRhdGEgYmVpbmcgZnVsbHkgdHJpbW1lZCkuXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3RyYWNlOm1vZHVsZTpkZXNjcmlwdG9yJykge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9IGlzTGlnaHRMaWtlXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGlkOiBkYXRhPy5pZCxcbiAgICAgICAgICAgICAgdHJhaXRzOiBkYXRhPy50cmFpdHMsXG4gICAgICAgICAgICAgIHNvdXJjZTogZGF0YT8uc291cmNlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogeyBkYXRhIH1cblxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogJ2RldnRvb2xzJyxcbiAgICAgICAgICBsYWJlbDogZXZlbnQudHlwZSxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6ZWZmZWN0b3A6IGtlZXAgc2xpbSBvcCBtZXRhIGFuZCBwcmVmZXIgRWZmZWN0T3AubWV0YS5tb2R1bGVJZCB3aGVuIHByZXNlbnQuXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3RyYWNlOmVmZmVjdG9wJykge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG4gICAgICAgIGNvbnN0IG9wTWV0YTogYW55ID0gZGF0YT8ubWV0YVxuICAgICAgICBjb25zdCBvcEtpbmQgPSAoZGF0YT8ua2luZCA/PyAnc2VydmljZScpIGFzIFJ1bnRpbWVEZWJ1Z0V2ZW50S2luZFxuICAgICAgICBjb25zdCBsYWJlbCA9IHR5cGVvZiBkYXRhPy5uYW1lID09PSAnc3RyaW5nJyA/IGRhdGEubmFtZSA6ICdlZmZlY3RvcCdcbiAgICAgICAgY29uc3QgbW9kdWxlSWQyID0gdHlwZW9mIG9wTWV0YT8ubW9kdWxlSWQgPT09ICdzdHJpbmcnID8gb3BNZXRhLm1vZHVsZUlkIDogbW9kdWxlSWRcbiAgICAgICAgY29uc3QgdHhuSWQyID0gdHlwZW9mIG9wTWV0YT8udHhuSWQgPT09ICdzdHJpbmcnICYmIG9wTWV0YS50eG5JZC5sZW5ndGggPiAwID8gb3BNZXRhLnR4bklkIDogYmFzZS50eG5JZFxuICAgICAgICBjb25zdCB0eG5TZXEyID1cbiAgICAgICAgICB0eXBlb2Ygb3BNZXRhPy50eG5TZXEgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShvcE1ldGEudHhuU2VxKSAmJiBvcE1ldGEudHhuU2VxID49IDBcbiAgICAgICAgICAgID8gTWF0aC5mbG9vcihvcE1ldGEudHhuU2VxKVxuICAgICAgICAgICAgOiBiYXNlLnR4blNlcVxuXG4gICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9IGlzTGlnaHRMaWtlXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGlkOiBkYXRhPy5pZCxcbiAgICAgICAgICAgICAga2luZDogZGF0YT8ua2luZCxcbiAgICAgICAgICAgICAgbmFtZTogZGF0YT8ubmFtZSxcbiAgICAgICAgICAgICAgbWV0YTogb3BNZXRhLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBpZDogZGF0YT8uaWQsXG4gICAgICAgICAgICAgIGtpbmQ6IGRhdGE/LmtpbmQsXG4gICAgICAgICAgICAgIG5hbWU6IGRhdGE/Lm5hbWUsXG4gICAgICAgICAgICAgIHBheWxvYWQ6IGRhdGE/LnBheWxvYWQsXG4gICAgICAgICAgICAgIG1ldGE6IG9wTWV0YSxcbiAgICAgICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgbW9kdWxlSWQ6IG1vZHVsZUlkMixcbiAgICAgICAgICB0eG5JZDogdHhuSWQyLFxuICAgICAgICAgIHR4blNlcTogdHhuU2VxMixcbiAgICAgICAgICBraW5kOiBvcEtpbmQsXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIE90aGVyIHRyYWNlOiogZXZlbnRzOiBjYXRlZ29yaXplIGFzIGRldnRvb2xzIGFuZCB0cmltIG1ldGEgYnkgdGllci5cbiAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShcbiAgICAgICAgaXNMaWdodExpa2VcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBkYXRhOiAoZXZlbnQgYXMgYW55KS5kYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICB9KVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG4gICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIGtpbmQ6ICdkZXZ0b29scycsXG4gICAgICAgIGxhYmVsOiBldmVudC50eXBlLFxuICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgQ2F1c2UgfSBmcm9tICdlZmZlY3QnXG5cbmV4cG9ydCB0eXBlIERvd25ncmFkZVJlYXNvbiA9ICdub25fc2VyaWFsaXphYmxlJyB8ICdvdmVyc2l6ZWQnIHwgJ3Vua25vd24nXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5IHtcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmdcbiAgcmVhZG9ubHkgY29kZT86IHN0cmluZ1xuICByZWFkb25seSBoaW50Pzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JTdW1tYXJ5UmVzdWx0IHtcbiAgcmVhZG9ubHkgZXJyb3JTdW1tYXJ5OiBTZXJpYWxpemFibGVFcnJvclN1bW1hcnlcbiAgcmVhZG9ubHkgZG93bmdyYWRlPzogRG93bmdyYWRlUmVhc29uXG59XG5cbmNvbnN0IHRydW5jYXRlID0gKHZhbHVlOiBzdHJpbmcsIG1heExlbjogbnVtYmVyKTogeyByZWFkb25seSB2YWx1ZTogc3RyaW5nOyByZWFkb25seSB0cnVuY2F0ZWQ6IGJvb2xlYW4gfSA9PiB7XG4gIGlmICh2YWx1ZS5sZW5ndGggPD0gbWF4TGVuKSByZXR1cm4geyB2YWx1ZSwgdHJ1bmNhdGVkOiBmYWxzZSB9XG4gIHJldHVybiB7IHZhbHVlOiB2YWx1ZS5zbGljZSgwLCBtYXhMZW4pLCB0cnVuY2F0ZWQ6IHRydWUgfVxufVxuXG5jb25zdCBzYWZlU3RyaW5naWZ5ID0gKHZhbHVlOiB1bmtub3duKTogeyByZWFkb25seSBvazogdHJ1ZTsgcmVhZG9ubHkganNvbjogc3RyaW5nIH0gfCB7IHJlYWRvbmx5IG9rOiBmYWxzZSB9ID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBvazogdHJ1ZSwganNvbjogSlNPTi5zdHJpbmdpZnkodmFsdWUpIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgb2s6IGZhbHNlIH1cbiAgfVxufVxuXG5jb25zdCBnZXRNZXNzYWdlRnJvbVVua25vd24gPSAoY2F1c2U6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAodHlwZW9mIGNhdXNlID09PSAnc3RyaW5nJykgcmV0dXJuIGNhdXNlXG4gIGlmICh0eXBlb2YgY2F1c2UgPT09ICdudW1iZXInIHx8IHR5cGVvZiBjYXVzZSA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiBjYXVzZSA9PT0gJ2JpZ2ludCcpIHJldHVybiBTdHJpbmcoY2F1c2UpXG4gIGlmIChjYXVzZSBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gY2F1c2UubWVzc2FnZSB8fCBjYXVzZS5uYW1lIHx8ICdFcnJvcidcbiAgaWYgKGNhdXNlICYmIHR5cGVvZiBjYXVzZSA9PT0gJ29iamVjdCcgJiYgJ21lc3NhZ2UnIGluIChjYXVzZSBhcyBhbnkpICYmIHR5cGVvZiAoY2F1c2UgYXMgYW55KS5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAoY2F1c2UgYXMgYW55KS5tZXNzYWdlIGFzIHN0cmluZ1xuICB9XG5cbiAgLy8gVHJ5IEVmZmVjdCBDYXVzZSBwcmV0dHkgKGJlc3QtZWZmb3J0KS4gVGhpcyBtYXkgaW5jbHVkZSBtb3JlIGRldGFpbHMgdGhhbiBuZWVkZWQsXG4gIC8vIHNvIGNhbGxlcnMgTVVTVCBzdGlsbCB0cmVhdCBpdCBhcyBhbiB1bnRydXN0ZWQvb3ZlcnNpemVkIHN0cmluZyBhbmQgdHJ1bmNhdGUuXG4gIHRyeSB7XG4gICAgY29uc3QgcHJldHR5ID0gQ2F1c2UucHJldHR5KGNhdXNlIGFzIENhdXNlLkNhdXNlPHVua25vd24+LCB7IHJlbmRlckVycm9yQ2F1c2U6IHRydWUgfSlcbiAgICBpZiAodHlwZW9mIHByZXR0eSA9PT0gJ3N0cmluZycgJiYgcHJldHR5Lmxlbmd0aCA+IDApIHJldHVybiBwcmV0dHlcbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cblxuICByZXR1cm4gJ1Vua25vd24gZXJyb3InXG59XG5cbmV4cG9ydCBjb25zdCB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSA9IChcbiAgY2F1c2U6IHVua25vd24sXG4gIG9wdGlvbnM/OiB7XG4gICAgcmVhZG9ubHkgbWF4TWVzc2FnZUxlbmd0aD86IG51bWJlclxuICB9LFxuKTogRXJyb3JTdW1tYXJ5UmVzdWx0ID0+IHtcbiAgY29uc3QgbWF4TWVzc2FnZUxlbmd0aCA9IG9wdGlvbnM/Lm1heE1lc3NhZ2VMZW5ndGggPz8gMjU2XG5cbiAgY29uc3QgbWVzc2FnZVJhdyA9IGdldE1lc3NhZ2VGcm9tVW5rbm93bihjYXVzZSlcbiAgY29uc3QgeyB2YWx1ZTogbWVzc2FnZSwgdHJ1bmNhdGVkIH0gPSB0cnVuY2F0ZShtZXNzYWdlUmF3LCBtYXhNZXNzYWdlTGVuZ3RoKVxuXG4gIGNvbnN0IHN1bW1hcnk6IHsgbWVzc2FnZTogc3RyaW5nOyBuYW1lPzogc3RyaW5nOyBjb2RlPzogc3RyaW5nOyBoaW50Pzogc3RyaW5nIH0gPSB7XG4gICAgbWVzc2FnZSxcbiAgfVxuXG4gIGlmIChjYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgaWYgKGNhdXNlLm5hbWUgJiYgY2F1c2UubmFtZSAhPT0gJ0Vycm9yJykgc3VtbWFyeS5uYW1lID0gY2F1c2UubmFtZVxuICAgIGNvbnN0IGFueUNhdXNlID0gY2F1c2UgYXMgYW55XG4gICAgaWYgKHR5cGVvZiBhbnlDYXVzZS5jb2RlID09PSAnc3RyaW5nJyAmJiBhbnlDYXVzZS5jb2RlLmxlbmd0aCA+IDApIHN1bW1hcnkuY29kZSA9IGFueUNhdXNlLmNvZGVcbiAgICBlbHNlIGlmICh0eXBlb2YgYW55Q2F1c2UuY29kZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKGFueUNhdXNlLmNvZGUpKSBzdW1tYXJ5LmNvZGUgPSBTdHJpbmcoYW55Q2F1c2UuY29kZSlcbiAgICBpZiAodHlwZW9mIGFueUNhdXNlLmhpbnQgPT09ICdzdHJpbmcnICYmIGFueUNhdXNlLmhpbnQubGVuZ3RoID4gMCkgc3VtbWFyeS5oaW50ID0gYW55Q2F1c2UuaGludFxuICAgIHJldHVybiB7XG4gICAgICBlcnJvclN1bW1hcnk6IHN1bW1hcnksXG4gICAgICBkb3duZ3JhZGU6IHRydW5jYXRlZCA/ICdvdmVyc2l6ZWQnIDogdW5kZWZpbmVkLFxuICAgIH1cbiAgfVxuXG4gIGlmIChjYXVzZSAmJiB0eXBlb2YgY2F1c2UgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgYW55Q2F1c2UgPSBjYXVzZSBhcyBhbnlcbiAgICBpZiAodHlwZW9mIGFueUNhdXNlLm5hbWUgPT09ICdzdHJpbmcnICYmIGFueUNhdXNlLm5hbWUubGVuZ3RoID4gMCkgc3VtbWFyeS5uYW1lID0gYW55Q2F1c2UubmFtZVxuICAgIGlmICh0eXBlb2YgYW55Q2F1c2UuY29kZSA9PT0gJ3N0cmluZycgJiYgYW55Q2F1c2UuY29kZS5sZW5ndGggPiAwKSBzdW1tYXJ5LmNvZGUgPSBhbnlDYXVzZS5jb2RlXG4gICAgaWYgKHR5cGVvZiBhbnlDYXVzZS5oaW50ID09PSAnc3RyaW5nJyAmJiBhbnlDYXVzZS5oaW50Lmxlbmd0aCA+IDApIHN1bW1hcnkuaGludCA9IGFueUNhdXNlLmhpbnRcbiAgfVxuXG4gIC8vIElmIHRoZSBvcmlnaW5hbCBjYXVzZSBpc24ndCBKU09OLXNlcmlhbGl6YWJsZSwgbWFyayBpdCBleHBsaWNpdGx5LlxuICBjb25zdCBzdHJpbmdpZnlSZXN1bHQgPSBzYWZlU3RyaW5naWZ5KGNhdXNlKVxuICBpZiAoIXN0cmluZ2lmeVJlc3VsdC5vaykge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvclN1bW1hcnk6IHN1bW1hcnksXG4gICAgICBkb3duZ3JhZGU6ICdub25fc2VyaWFsaXphYmxlJyxcbiAgICB9XG4gIH1cblxuICBpZiAodHJ1bmNhdGVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yU3VtbWFyeTogc3VtbWFyeSxcbiAgICAgIGRvd25ncmFkZTogJ292ZXJzaXplZCcsXG4gICAgfVxuICB9XG5cbiAgaWYgKG1lc3NhZ2UgPT09ICdVbmtub3duIGVycm9yJykge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvclN1bW1hcnk6IHN1bW1hcnksXG4gICAgICBkb3duZ3JhZGU6ICd1bmtub3duJyxcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBlcnJvclN1bW1hcnk6IHN1bW1hcnkgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7QUFBQSxTQUFTLFNBQUFBLFFBQU8sUUFBUSxVQUFVLE9BQU8sY0FBYzs7O0FDQXZELFNBQVMsYUFBYTtBQWdCdEIsSUFBTSxXQUFXLENBQUMsT0FBZSxXQUE0RTtBQUMzRyxNQUFJLE1BQU0sVUFBVSxPQUFRLFFBQU8sRUFBRSxPQUFPLFdBQVcsTUFBTTtBQUM3RCxTQUFPLEVBQUUsT0FBTyxNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsV0FBVyxLQUFLO0FBQzFEO0FBRUEsSUFBTSxnQkFBZ0IsQ0FBQyxVQUEwRjtBQUMvRyxNQUFJO0FBQ0YsV0FBTyxFQUFFLElBQUksTUFBTSxNQUFNLEtBQUssVUFBVSxLQUFLLEVBQUU7QUFBQSxFQUNqRCxRQUFRO0FBQ04sV0FBTyxFQUFFLElBQUksTUFBTTtBQUFBLEVBQ3JCO0FBQ0Y7QUFFQSxJQUFNLHdCQUF3QixDQUFDLFVBQTJCO0FBQ3hELE1BQUksT0FBTyxVQUFVLFNBQVUsUUFBTztBQUN0QyxNQUFJLE9BQU8sVUFBVSxZQUFZLE9BQU8sVUFBVSxhQUFhLE9BQU8sVUFBVSxTQUFVLFFBQU8sT0FBTyxLQUFLO0FBQzdHLE1BQUksaUJBQWlCLE1BQU8sUUFBTyxNQUFNLFdBQVcsTUFBTSxRQUFRO0FBQ2xFLE1BQUksU0FBUyxPQUFPLFVBQVUsWUFBWSxhQUFjLFNBQWlCLE9BQVEsTUFBYyxZQUFZLFVBQVU7QUFDbkgsV0FBUSxN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QUNELG9CQUFZLGVBQWUsV0FBV0EsZ0JBQWUsU0FBUztBQUU5RCxlQUFPLGNBQWM7QUFBQSxVQUNuQixHQUFHO0FBQUEsVUFDSCxVQUFVO0FBQUEsVUFDVixPQUFPO0FBQUEsVUFDUCxRQUFRO0FBQUEsVUFDUixNQUFNO0FBQUEsVUFDTjtBQUFBLFVBQ0EsTUFBTUEsZ0JBQWU7QUFBQSxRQUN2QixDQUFDO0FBQUEsTUFDSDtBQUdBLFlBQU0saUJBQWlCO0FBQUEsUUFDckIsY0FDSTtBQUFBLFVBQ0UsTUFBTTtBQUFBLFFBQ1IsSUFDQTtBQUFBLFVBQ0UsTUFBTyxNQUFjO0FBQUEsUUFDdkI7QUFBQSxNQUNOO0FBQ0EsZUFBUyxtQkFBbUI7QUFBQSxRQUMxQixPQUFPLGVBQWU7QUFBQSxRQUN0QixXQUFXLGVBQWU7QUFBQSxNQUM1QixDQUFDO0FBQ0Qsa0JBQVksZUFBZSxXQUFXLGVBQWUsU0FBUztBQUM5RCxhQUFPLGNBQWM7QUFBQSxRQUNuQixHQUFHO0FBQUEsUUFDSCxNQUFNO0FBQUEsUUFDTixPQUFPLE1BQU07QUFBQSxRQUNiLE1BQU0sZUFBZTtBQUFBLE1BQ3ZCLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogWyJDYXVzZSIsICJDYXVzZSIsICJkaWFnbm9zdGljc0xldmVsIiwgIm1ldGFQcm9qZWN0aW9uIl0KfQo=