@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,706 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ projectJsonValue
5
+ } from "./chunk-RYSSJBGX.js";
6
+
7
+ // ../logix-core/src/internal/runtime/core/DebugSink.ts
8
+ import { Cause as Cause2, Effect, FiberRef, Layer, Logger } from "../effect.js";
9
+
10
+ // ../logix-core/src/internal/runtime/core/errorSummary.ts
11
+ import { Cause } from "../effect.js";
12
+ var truncate = (value, maxLen) => {
13
+ if (value.length <= maxLen) return { value, truncated: false };
14
+ return { value: value.slice(0, maxLen), truncated: true };
15
+ };
16
+ var safeStringify = (value) => {
17
+ try {
18
+ return { ok: true, json: JSON.stringify(value) };
19
+ } catch {
20
+ return { ok: false };
21
+ }
22
+ };
23
+ var getMessageFromUnknown = (cause) => {
24
+ if (typeof cause === "string") return cause;
25
+ if (typeof cause === "number" || typeof cause === "boolean" || typeof cause === "bigint") return String(cause);
26
+ if (cause instanceof Error) return cause.message || cause.name || "Error";
27
+ if (cause && typeof cause === "object" && "message" in cause && typeof cause.message === "string") {
28
+ return cause.message;
29
+ }
30
+ try {
31
+ const pretty = Cause.pretty(cause, { renderErrorCause: true });
32
+ if (typeof pretty === "string" && pretty.length > 0) return pretty;
33
+ } catch {
34
+ }
35
+ return "Unknown error";
36
+ };
37
+ var toSerializableErrorSummary = (cause, options) => {
38
+ const maxMessageLength = options?.maxMessageLength ?? 256;
39
+ const messageRaw = getMessageFromUnknown(cause);
40
+ const { value: message, truncated } = truncate(messageRaw, maxMessageLength);
41
+ const summary = {
42
+ message
43
+ };
44
+ if (cause instanceof Error) {
45
+ if (cause.name && cause.name !== "Error") summary.name = cause.name;
46
+ const anyCause = cause;
47
+ if (typeof anyCause.code === "string" && anyCause.code.length > 0) summary.code = anyCause.code;
48
+ else if (typeof anyCause.code === "number" && Number.isFinite(anyCause.code)) summary.code = String(anyCause.code);
49
+ if (typeof anyCause.hint === "string" && anyCause.hint.length > 0) summary.hint = anyCause.hint;
50
+ return {
51
+ errorSummary: summary,
52
+ downgrade: truncated ? "oversized" : void 0
53
+ };
54
+ }
55
+ if (cause && typeof cause === "object") {
56
+ const anyCause = cause;
57
+ if (typeof anyCause.name === "string" && anyCause.name.length > 0) summary.name = anyCause.name;
58
+ if (typeof anyCause.code === "string" && anyCause.code.length > 0) summary.code = anyCause.code;
59
+ if (typeof anyCause.hint === "string" && anyCause.hint.length > 0) summary.hint = anyCause.hint;
60
+ }
61
+ const stringifyResult = safeStringify(cause);
62
+ if (!stringifyResult.ok) {
63
+ return {
64
+ errorSummary: summary,
65
+ downgrade: "non_serializable"
66
+ };
67
+ }
68
+ if (truncated) {
69
+ return {
70
+ errorSummary: summary,
71
+ downgrade: "oversized"
72
+ };
73
+ }
74
+ if (message === "Unknown error") {
75
+ return {
76
+ errorSummary: summary,
77
+ downgrade: "unknown"
78
+ };
79
+ }
80
+ return { errorSummary: summary };
81
+ };
82
+
83
+ // ../logix-core/src/internal/runtime/core/DebugSink.ts
84
+ var currentDebugSinks = FiberRef.unsafeMake([]);
85
+ var currentRuntimeLabel = FiberRef.unsafeMake(void 0);
86
+ var currentTxnId = FiberRef.unsafeMake(void 0);
87
+ var currentDiagnosticsLevel = FiberRef.unsafeMake("off");
88
+ var nextGlobalEventSeq = 0;
89
+ var clearRuntimeDebugEventSeq = () => {
90
+ nextGlobalEventSeq = 0;
91
+ };
92
+ var nextEventSeq = () => {
93
+ nextGlobalEventSeq += 1;
94
+ return nextGlobalEventSeq;
95
+ };
96
+ var makeEventId = (instanceId, eventSeq) => `${instanceId}::e${eventSeq}`;
97
+ var mergeDowngrade = (current, next) => {
98
+ if (!current) return next;
99
+ if (!next) return current;
100
+ if (current === "non_serializable" || next === "non_serializable") return "non_serializable";
101
+ if (current === "oversized" || next === "oversized") return "oversized";
102
+ return "unknown";
103
+ };
104
+ var browserLifecycleSeen = /* @__PURE__ */ new Set();
105
+ var browserDiagnosticSeen = /* @__PURE__ */ new Set();
106
+ var lastTxnByInstance = /* @__PURE__ */ new Map();
107
+ var lifecycleErrorLog = (event) => {
108
+ const moduleId = event.moduleId ?? "unknown";
109
+ const causePretty = (() => {
110
+ try {
111
+ return Cause2.pretty(event.cause, {
112
+ renderErrorCause: true
113
+ });
114
+ } catch {
115
+ try {
116
+ return JSON.stringify(event.cause, null, 2);
117
+ } catch {
118
+ return String(event.cause);
119
+ }
120
+ }
121
+ })();
122
+ const message = `[Logix][module=${moduleId}] lifecycle:error
123
+ ${causePretty}`;
124
+ return Effect.logError(message).pipe(
125
+ Effect.annotateLogs({
126
+ "logix.moduleId": moduleId,
127
+ "logix.event": "lifecycle:error",
128
+ "logix.cause": causePretty
129
+ })
130
+ );
131
+ };
132
+ var diagnosticLog = (event) => {
133
+ const moduleId = event.moduleId ?? "unknown";
134
+ const header = `[Logix][module=${moduleId}] diagnostic(${event.severity})`;
135
+ const detail = `code=${event.code} message=${event.message}${event.actionTag ? ` action=${event.actionTag}` : ""}${event.hint ? `
136
+ hint: ${event.hint}` : ""}`;
137
+ const msg = `${header}
138
+ ${detail}`;
139
+ const base = event.severity === "warning" ? Effect.logWarning(msg) : event.severity === "info" ? Effect.logInfo(msg) : Effect.logError(msg);
140
+ const annotations = {
141
+ "logix.moduleId": moduleId,
142
+ "logix.event": `diagnostic(${event.severity})`,
143
+ "logix.diagnostic.code": event.code,
144
+ "logix.diagnostic.message": event.message
145
+ };
146
+ if (event.hint) {
147
+ annotations["logix.diagnostic.hint"] = event.hint;
148
+ }
149
+ if (event.actionTag) {
150
+ annotations["logix.diagnostic.actionTag"] = event.actionTag;
151
+ }
152
+ return base.pipe(Effect.annotateLogs(annotations));
153
+ };
154
+ var noopLayer = Layer.locallyScoped(currentDebugSinks, []);
155
+ var errorOnlySink = {
156
+ record: (event) => event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" && event.severity !== "info" ? diagnosticLog(event) : Effect.void
157
+ };
158
+ var errorOnlyLayer = Layer.locallyScoped(currentDebugSinks, [errorOnlySink]);
159
+ var consoleSink = {
160
+ record: (event) => event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" ? diagnosticLog(event) : Effect.logDebug({ debugEvent: event })
161
+ };
162
+ var consoleLayer = Layer.locallyScoped(currentDebugSinks, [consoleSink]);
163
+ var isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
164
+ var renderBrowserConsoleEvent = (event) => {
165
+ if (typeof event.type === "string" && event.type.startsWith("trace:")) {
166
+ const moduleId = event.moduleId ?? "unknown";
167
+ const type = event.type;
168
+ return Effect.sync(() => {
169
+ console.groupCollapsed(
170
+ "%c[Logix]%c trace %c" + moduleId + "%c " + String(type),
171
+ "color:#6b7280;font-weight:bold",
172
+ // tag
173
+ "color:#3b82f6",
174
+ // label
175
+ "color:#9ca3af",
176
+ // module id
177
+ "color:#6b7280"
178
+ // type
179
+ );
180
+ console.log(event);
181
+ console.groupEnd();
182
+ });
183
+ }
184
+ if (event.type === "lifecycle:error") {
185
+ const moduleId = event.moduleId ?? "unknown";
186
+ const causePretty = (() => {
187
+ try {
188
+ return Cause2.pretty(event.cause, { renderErrorCause: true });
189
+ } catch {
190
+ try {
191
+ return JSON.stringify(event.cause, null, 2);
192
+ } catch {
193
+ return String(event.cause);
194
+ }
195
+ }
196
+ })();
197
+ const key = `${moduleId}|${causePretty}`;
198
+ if (browserLifecycleSeen.has(key)) {
199
+ return Effect.void;
200
+ }
201
+ browserLifecycleSeen.add(key);
202
+ return Effect.sync(() => {
203
+ console.groupCollapsed(
204
+ "%c[Logix]%c lifecycle:error %c" + moduleId,
205
+ "color:#ef4444;font-weight:bold",
206
+ // tag
207
+ "color:#ef4444",
208
+ // label
209
+ "color:#9ca3af"
210
+ // module id
211
+ );
212
+ console.error(causePretty);
213
+ console.groupEnd();
214
+ });
215
+ }
216
+ if (event.type === "diagnostic") {
217
+ const moduleId = event.moduleId ?? "unknown";
218
+ const detail = `code=${event.code} message=${event.message}${event.actionTag ? ` action=${event.actionTag}` : ""}${event.hint ? `
219
+ hint: ${event.hint}` : ""}`;
220
+ const color = event.severity === "warning" ? "color:#d97706" : event.severity === "info" ? "color:#3b82f6" : "color:#ef4444";
221
+ const label = event.severity === "warning" ? "diagnostic(warning)" : event.severity === "info" ? "diagnostic(info)" : "diagnostic(error)";
222
+ const key = `${moduleId}|${event.code}|${event.message}`;
223
+ if (browserDiagnosticSeen.has(key)) {
224
+ return Effect.void;
225
+ }
226
+ browserDiagnosticSeen.add(key);
227
+ return Effect.sync(() => {
228
+ console.groupCollapsed(
229
+ "%c[Logix]%c " + label + "%c module=" + moduleId,
230
+ "color:#6b7280;font-weight:bold",
231
+ color,
232
+ "color:#9ca3af"
233
+ );
234
+ console.log(detail);
235
+ console.groupEnd();
236
+ });
237
+ }
238
+ return Effect.void;
239
+ };
240
+ var browserConsoleSink = {
241
+ record: (event) => {
242
+ if (!isBrowser) {
243
+ return event.type === "lifecycle:error" ? lifecycleErrorLog(event) : event.type === "diagnostic" ? diagnosticLog(event) : Effect.logDebug({ debugEvent: event });
244
+ }
245
+ return renderBrowserConsoleEvent(event);
246
+ }
247
+ };
248
+ var browserConsoleLayer = Layer.locallyScoped(currentDebugSinks, [browserConsoleSink]);
249
+ var browserPrettyLoggerLayer = Logger.replace(
250
+ Logger.defaultLogger,
251
+ Logger.prettyLogger({ mode: "browser", colors: true })
252
+ );
253
+ var record = (event) => Effect.gen(function* () {
254
+ const sinks = yield* FiberRef.get(currentDebugSinks);
255
+ const runtimeLabel = yield* FiberRef.get(currentRuntimeLabel);
256
+ const txnId = yield* FiberRef.get(currentTxnId);
257
+ const now = Date.now();
258
+ const enriched = event;
259
+ if (enriched.timestamp === void 0) {
260
+ ;
261
+ enriched.timestamp = now;
262
+ }
263
+ if (runtimeLabel && enriched.runtimeLabel === void 0) {
264
+ ;
265
+ enriched.runtimeLabel = runtimeLabel;
266
+ }
267
+ if (txnId && enriched.type === "diagnostic" && enriched.txnId === void 0) {
268
+ ;
269
+ enriched.txnId = txnId;
270
+ }
271
+ if (sinks.length > 0) {
272
+ yield* Effect.forEach(
273
+ sinks,
274
+ (sink) => sink.record(enriched),
275
+ {
276
+ discard: true
277
+ }
278
+ );
279
+ return;
280
+ }
281
+ if (isBrowser) {
282
+ yield* renderBrowserConsoleEvent(enriched);
283
+ return;
284
+ }
285
+ if (enriched.type === "lifecycle:error") {
286
+ yield* lifecycleErrorLog(enriched);
287
+ return;
288
+ }
289
+ if (enriched.type === "diagnostic") {
290
+ yield* diagnosticLog(enriched);
291
+ return;
292
+ }
293
+ yield* Effect.void;
294
+ });
295
+ var toRuntimeDebugEventRef = (event, options) => {
296
+ const diagnosticsLevel = options?.diagnosticsLevel ?? "full";
297
+ if (diagnosticsLevel === "off") {
298
+ return void 0;
299
+ }
300
+ const timestamp = typeof event.timestamp === "number" && Number.isFinite(event.timestamp) ? event.timestamp : Date.now();
301
+ const moduleIdRaw = event.moduleId;
302
+ const moduleId = typeof moduleIdRaw === "string" && moduleIdRaw.length > 0 ? moduleIdRaw : "unknown";
303
+ const instanceIdRaw = event.instanceId;
304
+ const instanceId = typeof instanceIdRaw === "string" && instanceIdRaw.length > 0 ? instanceIdRaw : "unknown";
305
+ const runtimeLabelRaw = event.runtimeLabel;
306
+ const runtimeLabel = typeof runtimeLabelRaw === "string" && runtimeLabelRaw.length > 0 ? runtimeLabelRaw : void 0;
307
+ const txnSeqRaw = event.txnSeq;
308
+ const txnSeq = typeof txnSeqRaw === "number" && Number.isFinite(txnSeqRaw) && txnSeqRaw >= 0 ? Math.floor(txnSeqRaw) : 0;
309
+ const txnIdRaw = event.txnId;
310
+ const txnId = typeof txnIdRaw === "string" && txnIdRaw.length > 0 ? txnIdRaw : txnSeq > 0 ? `${instanceId}::t${txnSeq}` : void 0;
311
+ const eventSeqRaw = options?.eventSeq;
312
+ const eventSeq = typeof eventSeqRaw === "number" && Number.isFinite(eventSeqRaw) && eventSeqRaw > 0 ? Math.floor(eventSeqRaw) : nextEventSeq();
313
+ const eventId = makeEventId(instanceId, eventSeq);
314
+ const base = {
315
+ eventId,
316
+ eventSeq,
317
+ moduleId,
318
+ instanceId,
319
+ runtimeLabel,
320
+ txnSeq,
321
+ txnId,
322
+ timestamp
323
+ };
324
+ let downgrade;
325
+ const withDowngrade = (ref) => {
326
+ if (!downgrade) return ref;
327
+ return { ...ref, downgrade: { reason: downgrade } };
328
+ };
329
+ switch (event.type) {
330
+ case "module:init":
331
+ return withDowngrade({
332
+ ...base,
333
+ kind: "lifecycle",
334
+ label: "module:init"
335
+ });
336
+ case "module:destroy":
337
+ return withDowngrade({
338
+ ...base,
339
+ kind: "lifecycle",
340
+ label: "module:destroy"
341
+ });
342
+ case "lifecycle:phase": {
343
+ const e = event;
344
+ const metaInput = diagnosticsLevel === "light" ? { type: "lifecycle:phase", phase: e.phase, name: e.name } : { type: "lifecycle:phase", phase: e.phase, name: e.name, payload: e.payload };
345
+ const metaProjection = projectJsonValue(metaInput);
346
+ options?.onMetaProjection?.({
347
+ stats: metaProjection.stats,
348
+ downgrade: metaProjection.downgrade
349
+ });
350
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
351
+ return withDowngrade({
352
+ ...base,
353
+ kind: "lifecycle",
354
+ label: e.name,
355
+ meta: metaProjection.value
356
+ });
357
+ }
358
+ case "action:dispatch": {
359
+ const action = event.action;
360
+ const tag = action?._tag ?? action?.type ?? "action:dispatch";
361
+ const label = String(tag);
362
+ const metaInput = diagnosticsLevel === "light" ? { actionTag: label } : { action };
363
+ const metaProjection = projectJsonValue(metaInput);
364
+ options?.onMetaProjection?.({
365
+ stats: metaProjection.stats,
366
+ downgrade: metaProjection.downgrade
367
+ });
368
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
369
+ return withDowngrade({
370
+ ...base,
371
+ kind: "action",
372
+ label,
373
+ meta: metaProjection.value
374
+ });
375
+ }
376
+ case "state:update": {
377
+ const e = event;
378
+ const metaInput = diagnosticsLevel === "light" ? {
379
+ state: e.state,
380
+ dirtySet: e.dirtySet,
381
+ patchCount: e.patchCount,
382
+ commitMode: e.commitMode,
383
+ priority: e.priority,
384
+ originKind: e.originKind,
385
+ originName: e.originName
386
+ } : {
387
+ state: e.state,
388
+ dirtySet: e.dirtySet,
389
+ patchCount: e.patchCount,
390
+ commitMode: e.commitMode,
391
+ priority: e.priority,
392
+ originKind: e.originKind,
393
+ originName: e.originName,
394
+ traitSummary: e.traitSummary,
395
+ replayEvent: e.replayEvent
396
+ };
397
+ const metaProjection = projectJsonValue(metaInput);
398
+ options?.onMetaProjection?.({
399
+ stats: metaProjection.stats,
400
+ downgrade: metaProjection.downgrade
401
+ });
402
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
403
+ if (txnId) {
404
+ lastTxnByInstance.set(instanceId, { txnId, txnSeq });
405
+ }
406
+ return withDowngrade({
407
+ ...base,
408
+ kind: "state",
409
+ label: "state:update",
410
+ meta: metaProjection.value
411
+ });
412
+ }
413
+ case "lifecycle:error": {
414
+ const e = event;
415
+ const summary = toSerializableErrorSummary(e.cause);
416
+ downgrade = mergeDowngrade(downgrade, summary.downgrade);
417
+ const metaInput = diagnosticsLevel === "light" ? { type: "lifecycle:error", phase: e.phase, name: e.hook } : {
418
+ type: "lifecycle:error",
419
+ phase: e.phase,
420
+ name: e.hook,
421
+ hook: e.hook,
422
+ taskId: e.taskId,
423
+ origin: e.origin,
424
+ txnSeq: e.txnSeq,
425
+ opSeq: e.opSeq
426
+ };
427
+ const metaProjection = projectJsonValue(metaInput);
428
+ options?.onMetaProjection?.({
429
+ stats: metaProjection.stats,
430
+ downgrade: metaProjection.downgrade
431
+ });
432
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
433
+ return withDowngrade({
434
+ ...base,
435
+ kind: "lifecycle",
436
+ label: "lifecycle:error",
437
+ meta: metaProjection.value,
438
+ errorSummary: summary.errorSummary
439
+ });
440
+ }
441
+ case "diagnostic": {
442
+ const e = event;
443
+ const metaInput = {
444
+ code: e.code,
445
+ severity: e.severity,
446
+ message: e.message,
447
+ hint: e.hint,
448
+ actionTag: e.actionTag,
449
+ kind: e.kind,
450
+ trigger: e.trigger
451
+ };
452
+ const metaProjection = projectJsonValue(metaInput);
453
+ options?.onMetaProjection?.({
454
+ stats: metaProjection.stats,
455
+ downgrade: metaProjection.downgrade
456
+ });
457
+ downgrade = mergeDowngrade(downgrade, metaProjection.downgrade);
458
+ return withDowngrade({
459
+ ...base,
460
+ kind: "diagnostic",
461
+ label: e.code,
462
+ meta: metaProjection.value
463
+ });
464
+ }
465
+ default: {
466
+ if (typeof event.type !== "string" || !event.type.startsWith("trace:")) {
467
+ return void 0;
468
+ }
469
+ if (event.type === "trace:react-render" || event.type === "trace:react-selector") {
470
+ const data = event.data;
471
+ const metaProjection2 = projectJsonValue(
472
+ diagnosticsLevel === "light" ? {
473
+ componentLabel: data?.componentLabel,
474
+ selectorKey: data?.selectorKey,
475
+ fieldPaths: data?.fieldPaths,
476
+ strictModePhase: data?.strictModePhase
477
+ } : {
478
+ componentLabel: data?.componentLabel,
479
+ selectorKey: data?.selectorKey,
480
+ fieldPaths: data?.fieldPaths,
481
+ strictModePhase: data?.strictModePhase,
482
+ meta: data?.meta
483
+ }
484
+ );
485
+ options?.onMetaProjection?.({
486
+ stats: metaProjection2.stats,
487
+ downgrade: metaProjection2.downgrade
488
+ });
489
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
490
+ const label = typeof data?.componentLabel === "string" && data.componentLabel.length > 0 ? data.componentLabel : event.type === "trace:react-selector" ? "react-selector" : "react-render";
491
+ const last = event.type === "trace:react-render" ? lastTxnByInstance.get(instanceId) : void 0;
492
+ const txnIdAligned = base.txnId ?? last?.txnId;
493
+ const txnSeqAligned = base.txnSeq > 0 ? base.txnSeq : last?.txnSeq ?? base.txnSeq;
494
+ return withDowngrade({
495
+ ...base,
496
+ txnId: txnIdAligned,
497
+ txnSeq: txnSeqAligned,
498
+ kind: event.type === "trace:react-selector" ? "react-selector" : "react-render",
499
+ label,
500
+ meta: metaProjection2.value
501
+ });
502
+ }
503
+ if (event.type === "trace:trait:converge") {
504
+ const stripHeavy = (value) => {
505
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
506
+ const anyValue = value;
507
+ const dirty = anyValue.dirty;
508
+ const dirtySlim = dirty && typeof dirty === "object" && !Array.isArray(dirty) ? {
509
+ dirtyAll: dirty.dirtyAll,
510
+ ...typeof dirty.reason === "string" ? { reason: dirty.reason } : null
511
+ } : void 0;
512
+ const { top3, dirtyRoots, ...rest } = anyValue;
513
+ return dirtySlim ? { ...rest, dirty: dirtySlim } : rest;
514
+ };
515
+ const data = event.data;
516
+ const metaInput = diagnosticsLevel === "light" ? stripHeavy(data) : data;
517
+ const metaProjection2 = projectJsonValue(metaInput);
518
+ options?.onMetaProjection?.({
519
+ stats: metaProjection2.stats,
520
+ downgrade: metaProjection2.downgrade
521
+ });
522
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
523
+ return withDowngrade({
524
+ ...base,
525
+ kind: "trait:converge",
526
+ label: "trait:converge",
527
+ meta: metaProjection2.value
528
+ });
529
+ }
530
+ if (event.type === "trace:trait:check") {
531
+ const stripHeavy = (value) => {
532
+ if (!value || typeof value !== "object" || Array.isArray(value)) return value;
533
+ const anyValue = value;
534
+ const degraded = anyValue.degraded;
535
+ const degradedSlim = degraded && typeof degraded === "object" && !Array.isArray(degraded) ? { kind: degraded.kind } : void 0;
536
+ const { degraded: _degraded, ...rest } = anyValue;
537
+ return degradedSlim ? { ...rest, degraded: degradedSlim } : rest;
538
+ };
539
+ const data = event.data;
540
+ const metaInput = diagnosticsLevel === "light" ? stripHeavy(data) : data;
541
+ const metaProjection2 = projectJsonValue(metaInput);
542
+ options?.onMetaProjection?.({
543
+ stats: metaProjection2.stats,
544
+ downgrade: metaProjection2.downgrade
545
+ });
546
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
547
+ return withDowngrade({
548
+ ...base,
549
+ kind: "trait:check",
550
+ label: "trait:check",
551
+ meta: metaProjection2.value
552
+ });
553
+ }
554
+ if (event.type === "trace:trait:validate") {
555
+ const data = event.data;
556
+ const metaProjection2 = projectJsonValue(data);
557
+ options?.onMetaProjection?.({
558
+ stats: metaProjection2.stats,
559
+ downgrade: metaProjection2.downgrade
560
+ });
561
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
562
+ return withDowngrade({
563
+ ...base,
564
+ kind: "trait:validate",
565
+ label: "trait:validate",
566
+ meta: metaProjection2.value
567
+ });
568
+ }
569
+ if (event.type === "trace:module:traits") {
570
+ const data = event.data;
571
+ const metaInput = diagnosticsLevel === "light" ? {
572
+ digest: data?.digest,
573
+ count: data?.count
574
+ } : {
575
+ digest: data?.digest,
576
+ count: data?.count,
577
+ traits: data?.traits,
578
+ provenanceIndex: data?.provenanceIndex
579
+ };
580
+ const metaProjection2 = projectJsonValue(metaInput);
581
+ options?.onMetaProjection?.({
582
+ stats: metaProjection2.stats,
583
+ downgrade: metaProjection2.downgrade
584
+ });
585
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
586
+ return withDowngrade({
587
+ ...base,
588
+ kind: "devtools",
589
+ label: event.type,
590
+ meta: metaProjection2.value
591
+ });
592
+ }
593
+ if (event.type === "trace:module:traits:conflict") {
594
+ const data = event.data;
595
+ const metaInput = diagnosticsLevel === "light" ? {
596
+ conflictCount: data?.conflictCount,
597
+ traitIds: data?.traitIds
598
+ } : {
599
+ conflictCount: data?.conflictCount,
600
+ conflicts: data?.conflicts
601
+ };
602
+ const metaProjection2 = projectJsonValue(metaInput);
603
+ options?.onMetaProjection?.({
604
+ stats: metaProjection2.stats,
605
+ downgrade: metaProjection2.downgrade
606
+ });
607
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
608
+ return withDowngrade({
609
+ ...base,
610
+ kind: "devtools",
611
+ label: event.type,
612
+ meta: metaProjection2.value
613
+ });
614
+ }
615
+ if (event.type === "trace:module:descriptor") {
616
+ const data = event.data;
617
+ const metaInput = diagnosticsLevel === "light" ? {
618
+ id: data?.id,
619
+ traits: data?.traits,
620
+ source: data?.source
621
+ } : { data };
622
+ const metaProjection2 = projectJsonValue(metaInput);
623
+ options?.onMetaProjection?.({
624
+ stats: metaProjection2.stats,
625
+ downgrade: metaProjection2.downgrade
626
+ });
627
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
628
+ return withDowngrade({
629
+ ...base,
630
+ kind: "devtools",
631
+ label: event.type,
632
+ meta: metaProjection2.value
633
+ });
634
+ }
635
+ if (event.type === "trace:effectop") {
636
+ const data = event.data;
637
+ const opMeta = data?.meta;
638
+ const opKind = data?.kind ?? "service";
639
+ const label = typeof data?.name === "string" ? data.name : "effectop";
640
+ const moduleId2 = typeof opMeta?.moduleId === "string" ? opMeta.moduleId : moduleId;
641
+ const txnId2 = typeof opMeta?.txnId === "string" && opMeta.txnId.length > 0 ? opMeta.txnId : base.txnId;
642
+ const txnSeq2 = typeof opMeta?.txnSeq === "number" && Number.isFinite(opMeta.txnSeq) && opMeta.txnSeq >= 0 ? Math.floor(opMeta.txnSeq) : base.txnSeq;
643
+ const metaInput = diagnosticsLevel === "light" ? {
644
+ id: data?.id,
645
+ kind: data?.kind,
646
+ name: data?.name,
647
+ meta: opMeta
648
+ } : {
649
+ id: data?.id,
650
+ kind: data?.kind,
651
+ name: data?.name,
652
+ payload: data?.payload,
653
+ meta: opMeta
654
+ };
655
+ const metaProjection2 = projectJsonValue(metaInput);
656
+ options?.onMetaProjection?.({
657
+ stats: metaProjection2.stats,
658
+ downgrade: metaProjection2.downgrade
659
+ });
660
+ downgrade = mergeDowngrade(downgrade, metaProjection2.downgrade);
661
+ return withDowngrade({
662
+ ...base,
663
+ moduleId: moduleId2,
664
+ txnId: txnId2,
665
+ txnSeq: txnSeq2,
666
+ kind: opKind,
667
+ label,
668
+ meta: metaProjection2.value
669
+ });
670
+ }
671
+ const metaProjection = projectJsonValue(
672
+ diagnosticsLevel === "light" ? {
673
+ data: void 0
674
+ } : {
675
+ data: event.data
676
+ }
677
+ );
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: "devtools",
686
+ label: event.type,
687
+ meta: metaProjection.value
688
+ });
689
+ }
690
+ }
691
+ };
692
+
693
+ export {
694
+ toSerializableErrorSummary,
695
+ currentDebugSinks,
696
+ currentRuntimeLabel,
697
+ currentTxnId,
698
+ currentDiagnosticsLevel,
699
+ clearRuntimeDebugEventSeq,
700
+ noopLayer,
701
+ errorOnlyLayer,
702
+ browserConsoleLayer,
703
+ record,
704
+ toRuntimeDebugEventRef
705
+ };
706
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0RlYnVnU2luay50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDYXVzZSwgRWZmZWN0LCBGaWJlclJlZiwgTGF5ZXIsIExvZ2dlciB9IGZyb20gXCJlZmZlY3RcIlxuaW1wb3J0IHtcbiAgcHJvamVjdEpzb25WYWx1ZSxcbiAgdHlwZSBEb3duZ3JhZGVSZWFzb24gYXMgSnNvbkRvd25ncmFkZVJlYXNvbixcbiAgdHlwZSBKc29uVmFsdWUsXG4gIHR5cGUgSnNvblZhbHVlUHJvamVjdGlvblN0YXRzLFxufSBmcm9tIFwiLi4vLi4vb2JzZXJ2YWJpbGl0eS9qc29uVmFsdWUuanNcIlxuaW1wb3J0IHR5cGUgKiBhcyBSZXBsYXlMb2cgZnJvbSBcIi4vUmVwbGF5TG9nLmpzXCJcbmltcG9ydCB7XG4gIHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5LFxuICB0eXBlIERvd25ncmFkZVJlYXNvbiBhcyBFcnJvckRvd25ncmFkZVJlYXNvbixcbiAgdHlwZSBTZXJpYWxpemFibGVFcnJvclN1bW1hcnksXG59IGZyb20gXCIuL2Vycm9yU3VtbWFyeS5qc1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJpZ2dlclJlZiB7XG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZ1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nXG4gIHJlYWRvbmx5IGRldGFpbHM/OiB1bmtub3duXG59XG5cbnR5cGUgVHJhY2VFdmVudFR5cGUgPSBgdHJhY2U6JHtzdHJpbmd9YFxudHlwZSBHZW5lcmljVHJhY2VFdmVudFR5cGUgPSBFeGNsdWRlPFxuICBUcmFjZUV2ZW50VHlwZSxcbiAgXCJ0cmFjZTp0cmFpdDpjb252ZXJnZVwiIHwgXCJ0cmFjZTp0cmFpdDpjaGVja1wiIHwgXCJ0cmFjZTp0cmFpdDp2YWxpZGF0ZVwiXG4+XG5cbi8qKlxuICogUmVwbGF5RXZlbnRSZWZcdUZGMUFcbiAqIC0gRGVidWcgXHU0RThCXHU0RUY2XHU0RkE3XHU1RjE1XHU3NTI4XHU3Njg0XHUyMDFDXHU1NkRFXHU2NTNFXHU0RThCXHU0RUY2XHUyMDFEXHU3RUQzXHU2Nzg0XHVGRjFCXG4gKiAtIFx1NTdGQVx1NEU4RSBSZXBsYXlMb2cuRXZlbnRcdUZGMENcdTVFNzZcdTg4NjVcdTlGNTAgdHhuL3RyaWdnZXIgXHU3QjQ5XHU1MTczXHU4MDU0XHU1QjU3XHU2QkI1XHU0RUU1XHU0RkJGXHU0RThFXHU1NzI4IERldnRvb2xzIFx1NEUyRFx1NTA1QVx1ODA1QVx1NTQwOFx1NEUwRVx1ODlFM1x1OTFDQVx1MzAwMlxuICovXG5leHBvcnQgdHlwZSBSZXBsYXlFdmVudFJlZiA9IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCAmIHtcbiAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgdHJpZ2dlcj86IFRyaWdnZXJSZWZcbn1cblxuZXhwb3J0IHR5cGUgRXZlbnQgPVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6IFwibW9kdWxlOmluaXRcIlxuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6IFwibW9kdWxlOmRlc3Ryb3lcIlxuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6IFwibGlmZWN5Y2xlOnBoYXNlXCJcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBwaGFzZTogXCJpbml0XCIgfCBcInJ1blwiIHwgXCJkZXN0cm95XCIgfCBcInBsYXRmb3JtXCJcbiAgICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcGF5bG9hZD86IHVua25vd25cbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6IFwiYWN0aW9uOmRpc3BhdGNoXCJcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBhY3Rpb246IHVua25vd25cbiAgICAgIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuXHQgIHwge1xuXHQgICAgICByZWFkb25seSB0eXBlOiBcInN0YXRlOnVwZGF0ZVwiXG5cdCAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG5cdCAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcblx0ICAgICAgcmVhZG9ubHkgc3RhdGU6IHVua25vd25cbiAgICAgIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgICAgIC8qKlxuICAgICAgICogXHU1M0VGXHU5MDA5XHVGRjFBXHU2NzJDXHU2QjIxXHU2M0QwXHU0RUE0XHU4MDVBXHU1NDA4XHU3Njg0XHU1RjcxXHU1NENEXHU1N0RGXHVGRjA4XHU1QjU3XHU2QkI1XHU3RUE3IGRpcnR5LXNldFx1RkYwOVx1MzAwMlxuICAgICAgICogLSBcdTc1MzEgUnVudGltZSBcdTU3MjggY29tbWl0IFx1NzBCOVx1NTg2Qlx1NTE0NVx1RkYxQlxuICAgICAgICogLSBcdTVGQzVcdTk4N0JcdTRGRERcdTYzMDEgU2xpbSBcdTRFMTRcdTUzRUZcdTVFOEZcdTUyMTdcdTUzMTZcdUZGMUJcbiAgICAgICAqIC0gXHU1M0VGXHU4OEFCIERldnRvb2xzIFx1NzUyOFx1NEU4RSBleHBsYWluIFx1MjAxQ1x1NEUzQVx1NEY1NVx1ODlFNlx1NTNEMSBjb252ZXJnZS92YWxpZGF0ZS9cdTRFM0FcdTRGNTVcdTkwMDBcdTUzMTYgZnVsbFx1MjAxRFx1MzAwMlxuICAgICAgICovXG4gICAgICByZWFkb25seSBkaXJ0eVNldD86IHVua25vd25cbiAgICAgIC8qKlxuICAgICAgICogXHU1M0VGXHU5MDA5XHVGRjFBXHU2NzJDXHU2QjIxXHU2M0QwXHU0RUE0XHU4MDVBXHU1NDA4XHU3Njg0IFBhdGNoIFx1NjU3MFx1OTFDRlx1RkYwOFx1Njc2NVx1ODFFQSBTdGF0ZVRyYW5zYWN0aW9uXHVGRjA5XHVGRjFCXG4gICAgICAgKiAtIFx1NEVDNVx1NTcyOFx1NEU4Qlx1NTJBMVx1OERFRlx1NUY4NFx1NEUwQlx1NzUzMSBSdW50aW1lIFx1NTg2Qlx1NTE0NVx1RkYxQlxuICAgICAgICogLSBEZXZ0b29scyBcdTUzRUZcdTc1MjhcdTRGNUNcdTRFOEJcdTUyQTFcdTY5ODJcdTg5ODFcdTRGRTFcdTYwNkZcdTc2ODRcdThGN0JcdTkxQ0ZcdTYzMDdcdTY4MDdcdTMwMDJcbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgcGF0Y2hDb3VudD86IG51bWJlclxuICAgICAgLyoqXG4gICAgICAgKiBcdTUzRUZcdTkwMDlcdUZGMUFcdTYzRDBcdTRFQTRcdTZBMjFcdTVGMEZcdUZGMDhcdTY2NkVcdTkwMUEvXHU2Mjc5XHU1OTA0XHU3NDA2L1x1NEY0RVx1NEYxOFx1NTE0OFx1N0VBN1x1N0I0OVx1RkYwOVx1MzAwMlxuICAgICAgICogLSBcdTc1MzEgUnVudGltZSBcdTU4NkJcdTUxNDVcdUZGMUJcbiAgICAgICAqIC0gXHU5RUQ4XHU4QkE0XHU1MDNDXHU3NTMxXHU4QzAzXHU3NTI4XHU2NUI5XHU1MUIzXHU1QjlBXHVGRjA4XHU5MDFBXHU1RTM4XHU0RTNBIFwibm9ybWFsXCJcdUZGMDlcdTMwMDJcbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgY29tbWl0TW9kZT86IHN0cmluZ1xuICAgICAgLyoqXG4gICAgICAgKiBcdTUzRUZcdTkwMDlcdUZGMUFcdTVCRjlcdTU5MTZcdTUzRUZcdTg5QzFcdTYwMjdcdTRGMThcdTUxNDhcdTdFQTdcdUZGMDhub3JtYWwvbG93XHVGRjA5XHUzMDAyXG4gICAgICAgKiAtIFx1NzUzMSBSdW50aW1lIFx1NTg2Qlx1NTE0NVx1RkYxQlxuICAgICAgICogLSBcdTRFM0JcdTg5ODFcdTc1MjhcdTRFOEUgUmVhY3QgXHU1OTE2XHU5MEU4XHU4QkEyXHU5NjA1XHU4QzAzXHU1RUE2XHVGRjA4XHU5MDdGXHU1MTREXHU5NzVFXHU1RkM1XHU4OTgxIHJlbmRlclx1RkYwOVx1MzAwMlxuICAgICAgICovXG4gICAgICByZWFkb25seSBwcmlvcml0eT86IHN0cmluZ1xuICAgICAgLyoqXG4gICAgICAgKiBcdTUzRUZcdTkwMDlcdUZGMUFcdTg5RTZcdTUzRDFcdTY3MkNcdTZCMjFcdTcyQjZcdTYwMDFcdTYzRDBcdTRFQTRcdTc2ODRcdTRFOEJcdTUyQTFcdTY3NjVcdTZFOTBcdTc5Q0RcdTdDN0JcdUZGMDhvcmlnaW4ua2luZFx1RkYwOVx1RkYxQVxuICAgICAgICogLSBcdTRGOEJcdTU5ODIgXCJhY3Rpb25cIiAvIFwic291cmNlLXJlZnJlc2hcIiAvIFwic2VydmljZS1jYWxsYmFja1wiIC8gXCJkZXZ0b29sc1wiXHVGRjFCXG4gICAgICAgKiAtIFx1NEVDNVx1NTcyOFx1NTdGQVx1NEU4RSBTdGF0ZVRyYW5zYWN0aW9uIFx1NzY4NFx1OERFRlx1NUY4NFx1NEUwQlx1NzUzMSBSdW50aW1lIFx1NTg2Qlx1NTE0NVx1RkYxQlxuICAgICAgICogLSBEZXZ0b29scyBcdTUzRUZcdTYzNkVcdTZCNjRcdTUzM0FcdTUyMDZcdTRFMUFcdTUyQTFcdTRFOEJcdTUyQTFcdTRFMEUgRGV2dG9vbHMgdGltZS10cmF2ZWwgXHU2NENEXHU0RjVDXHUzMDAyXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IG9yaWdpbktpbmQ/OiBzdHJpbmdcbiAgICAgIC8qKlxuICAgICAgICogXHU1M0VGXHU5MDA5XHVGRjFBXHU4OUU2XHU1M0QxXHU2NzJDXHU2QjIxXHU3MkI2XHU2MDAxXHU2M0QwXHU0RUE0XHU3Njg0XHU0RThCXHU1MkExXHU2NzY1XHU2RTkwXHU1NDBEXHU3OUYwXHVGRjA4b3JpZ2luLm5hbWVcdUZGMDlcdUZGMUFcbiAgICAgICAqIC0gXHU0RjhCXHU1OTgyIGFjdGlvbiBkaXNwYXRjaCAvIGZpZWxkUGF0aCAvIHRhc2s6c3VjY2Vzcy90YXNrOmZhaWx1cmUgXHU3QjQ5XHVGRjFCXG4gICAgICAgKiAtIFx1NEVDNVx1NTcyOFx1NTdGQVx1NEU4RSBTdGF0ZVRyYW5zYWN0aW9uIFx1NzY4NFx1OERFRlx1NUY4NFx1NEUwQlx1NzUzMSBSdW50aW1lIFx1NTg2Qlx1NTE0NVx1MzAwMlxuICAgICAgICovXG4gICAgICByZWFkb25seSBvcmlnaW5OYW1lPzogc3RyaW5nXG4gICAgICAvKipcbiAgICAgICAqIFx1OTg4NFx1NzU1OVx1RkYxQVRyYWl0IFx1NjUzNlx1NjU1Qlx1NjQ1OFx1ODk4MVx1RkYwOFx1NzUyOFx1NEU4RSBEZXZ0b29scyBcdTVDNTVcdTc5M0FcdTdBOTdcdTUzRTNcdTdFQTdcdTdFREZcdThCQTEvVG9wTiBcdTYyMTBcdTY3MkMvXHU5NjREXHU3RUE3XHU1MzlGXHU1NkUwXHU3QjQ5XHVGRjA5XHUzMDAyXG4gICAgICAgKiAtIFBoYXNlIDJcdUZGMUFcdTRFQzVcdTU2RkFcdTUzMTZcdTVCNTdcdTZCQjVcdTRGNERcdUZGMENcdTRFMERcdTk1MDFcdTZCN0JcdTdFRDNcdTY3ODRcdUZGMUJcbiAgICAgICAqIC0gXHU1NDBFXHU3RUVEIFBoYXNlIFx1NEYxQVx1NEUwRSBUcmFpdC9SZXBsYXkgXHU0RThCXHU0RUY2XHU2QTIxXHU1NzhCXHU1QkY5XHU5RjUwXHU0RTNBXHU1M0VGXHU4OUUzXHU5MUNBXHU3RUQzXHU2Nzg0XHUzMDAyXG4gICAgICAgKi9cbiAgICAgIHJlYWRvbmx5IHRyYWl0U3VtbWFyeT86IHVua25vd25cbiAgICAgIC8qKlxuXHQgICAgICAgKiBcdTk4ODRcdTc1NTlcdUZGMUFcdTY3MkNcdTZCMjFcdTRFOEJcdTUyQTFcdTUxNzNcdTgwNTRcdTc2ODRcdTU2REVcdTY1M0VcdTRFOEJcdTRFRjZcdUZGMDhSZXBsYXlMb2cgXHU0RkE3XHU3Njg0IHJlLWVtaXQgXHU0RThCXHU1QjlFXHU2RTkwXHVGRjA5XHUzMDAyXG5cdCAgICAgICAqIC0gUGhhc2UgMlx1RkYxQVx1NEVDNVx1NTZGQVx1NTMxNlx1NUI1N1x1NkJCNVx1NEY0RFx1RkYxQlxuXHQgICAgICAgKiAtIFx1NTQwRVx1N0VFRCBQaGFzZSBcdTRGMUFcdTRFMEUgUmVwbGF5TG9nLkV2ZW50IFx1N0VEM1x1Njc4NFx1NUJGOVx1OUY1MFx1MzAwMlxuXHQgICAgICAgKi9cblx0ICAgICAgcmVhZG9ubHkgcmVwbGF5RXZlbnQ/OiBSZXBsYXlFdmVudFJlZlxuXHQgICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcblx0ICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG5cdCAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogXCJsaWZlY3ljbGU6ZXJyb3JcIlxuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGNhdXNlOiB1bmtub3duXG4gICAgICByZWFkb25seSBwaGFzZT86IFwiaW5pdFwiIHwgXCJydW5cIiB8IFwiZGVzdHJveVwiIHwgXCJwbGF0Zm9ybVwiXG4gICAgICByZWFkb25seSBob29rPzpcbiAgICAgICAgfCBcImluaXRSZXF1aXJlZFwiXG4gICAgICAgIHwgXCJzdGFydFwiXG4gICAgICAgIHwgXCJkZXN0cm95XCJcbiAgICAgICAgfCBcInN1c3BlbmRcIlxuICAgICAgICB8IFwicmVzdW1lXCJcbiAgICAgICAgfCBcInJlc2V0XCJcbiAgICAgICAgfCBcInVua25vd25cIlxuICAgICAgcmVhZG9ubHkgdGFza0lkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBvcFNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgb3JpZ2luPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0eG5TZXE/OiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuXHQgIHwge1xuXHQgICAgICByZWFkb25seSB0eXBlOiBcImRpYWdub3N0aWNcIlxuXHQgICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuXHQgICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG5cdCAgICAgIHJlYWRvbmx5IGNvZGU6IHN0cmluZ1xuXHQgICAgICByZWFkb25seSBzZXZlcml0eTogXCJlcnJvclwiIHwgXCJ3YXJuaW5nXCIgfCBcImluZm9cIlxuXHQgICAgICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmdcblx0ICAgICAgcmVhZG9ubHkgaGludD86IHN0cmluZ1xuXHQgICAgICByZWFkb25seSBhY3Rpb25UYWc/OiBzdHJpbmdcblx0ICAgICAgcmVhZG9ubHkga2luZD86IHN0cmluZ1xuXHQgICAgICByZWFkb25seSB0eG5TZXE/OiBudW1iZXJcblx0ICAgICAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcblx0ICAgICAgcmVhZG9ubHkgdHJpZ2dlcj86IFRyaWdnZXJSZWZcblx0ICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG5cdCAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuXHQgICAgfVxuICAvKipcbiAgICogdHJhY2U6KiBcdTRFOEJcdTRFRjZcdUZGMUFcbiAgICogLSBcdTRGNUNcdTRFM0FcdThGRDBcdTg4NENcdTY1RjYgdHJhY2UgLyBQbGF5Z3JvdW5kIC8gQWxpZ25tZW50IExhYiBcdTc2ODRcdTYyNjlcdTVDNTVcdTk0QTlcdTVCNTBcdUZGMUJcbiAgICogLSBcdTVGNTNcdTUyNERcdTUzRUFcdTdFQTZcdTVCOUEgdHlwZSBcdTUyNERcdTdGMDBcdTRFMEUgbW9kdWxlSWRcdUZGMENcdTUxNzdcdTRGNTMgcGF5bG9hZCBcdTdFRDNcdTY3ODRcdTc1MzFcdTRFMEFcdTVDNDJcdTdFQTZcdTVCOUFcdUZGMDhcdTRGOEJcdTU5ODIgZGF0YSBcdTUxODVcdTYzMDIgc3BhbklkL2F0dHJpYnV0ZXMgXHU3QjQ5XHVGRjA5XHUzMDAyXG4gICAqL1xuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6IFwidHJhY2U6dHJhaXQ6Y29udmVyZ2VcIlxuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGRhdGE6IEpzb25WYWx1ZVxuICAgICAgcmVhZG9ubHkgdHhuU2VxPzogbnVtYmVyXG4gICAgICByZWFkb25seSB0eG5JZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA/OiBudW1iZXJcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogXCJ0cmFjZTp0cmFpdDpjaGVja1wiXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgZGF0YTogSnNvblZhbHVlXG4gICAgICByZWFkb25seSB0eG5TZXE/OiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHR4bklkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBydW50aW1lTGFiZWw/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcD86IG51bWJlclxuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiBcInRyYWNlOnRyYWl0OnZhbGlkYXRlXCJcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBkYXRhOiBKc29uVmFsdWVcbiAgICAgIHJlYWRvbmx5IHR4blNlcT86IG51bWJlclxuICAgICAgcmVhZG9ubHkgdHhuSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6IEdlbmVyaWNUcmFjZUV2ZW50VHlwZVxuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGRhdGE/OiB1bmtub3duXG4gICAgICByZWFkb25seSB0eG5TZXE/OiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IHJ1bnRpbWVMYWJlbD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wPzogbnVtYmVyXG4gICAgfVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpbmsge1xuICByZWFkb25seSByZWNvcmQ6IChldmVudDogRXZlbnQpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZD5cbn1cbmV4cG9ydCBjb25zdCBjdXJyZW50RGVidWdTaW5rcyA9IEZpYmVyUmVmLnVuc2FmZU1ha2U8UmVhZG9ubHlBcnJheTxTaW5rPj4oW10pXG5leHBvcnQgY29uc3QgY3VycmVudFJ1bnRpbWVMYWJlbCA9IEZpYmVyUmVmLnVuc2FmZU1ha2U8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG5leHBvcnQgY29uc3QgY3VycmVudFR4bklkID0gRmliZXJSZWYudW5zYWZlTWFrZTxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZClcbmV4cG9ydCB0eXBlIERpYWdub3N0aWNzTGV2ZWwgPSBcIm9mZlwiIHwgXCJsaWdodFwiIHwgXCJmdWxsXCJcbmV4cG9ydCBjb25zdCBjdXJyZW50RGlhZ25vc3RpY3NMZXZlbCA9IEZpYmVyUmVmLnVuc2FmZU1ha2U8RGlhZ25vc3RpY3NMZXZlbD4oXCJvZmZcIilcblxuZXhwb3J0IHR5cGUgUnVudGltZURlYnVnRXZlbnRLaW5kID1cbiAgfCBcImFjdGlvblwiXG4gIHwgXCJzdGF0ZVwiXG4gIHwgXCJzZXJ2aWNlXCJcbiAgfCBcInRyYWl0LWNvbXB1dGVkXCJcbiAgfCBcInRyYWl0LWxpbmtcIlxuICB8IFwidHJhaXQtc291cmNlXCJcbiAgfCBcImxpZmVjeWNsZVwiXG4gIHwgXCJyZWFjdC1yZW5kZXJcIlxuICB8IFwiZGV2dG9vbHNcIlxuICB8IFwiZGlhZ25vc3RpY1wiXG4gIHwgKHN0cmluZyAmIHt9KVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1bnRpbWVEZWJ1Z0V2ZW50UmVmIHtcbiAgcmVhZG9ubHkgZXZlbnRJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGV2ZW50U2VxOiBudW1iZXJcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgcnVudGltZUxhYmVsPzogc3RyaW5nXG4gIHJlYWRvbmx5IHR4blNlcTogbnVtYmVyXG4gIHJlYWRvbmx5IHR4bklkPzogc3RyaW5nXG4gIHJlYWRvbmx5IHRpbWVzdGFtcDogbnVtYmVyXG4gIHJlYWRvbmx5IGtpbmQ6IFJ1bnRpbWVEZWJ1Z0V2ZW50S2luZFxuICByZWFkb25seSBsYWJlbDogc3RyaW5nXG4gIHJlYWRvbmx5IG1ldGE/OiBKc29uVmFsdWVcbiAgcmVhZG9ubHkgZXJyb3JTdW1tYXJ5PzogU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5XG4gIHJlYWRvbmx5IGRvd25ncmFkZT86IHtcbiAgICByZWFkb25seSByZWFzb24/OiBcIm5vbl9zZXJpYWxpemFibGVcIiB8IFwib3ZlcnNpemVkXCIgfCBcInVua25vd25cIlxuICB9XG59XG5cbmxldCBuZXh0R2xvYmFsRXZlbnRTZXEgPSAwXG5cbmV4cG9ydCBjb25zdCBjbGVhclJ1bnRpbWVEZWJ1Z0V2ZW50U2VxID0gKCk6IHZvaWQgPT4ge1xuICBuZXh0R2xvYmFsRXZlbnRTZXEgPSAwXG59XG5cbmNvbnN0IG5leHRFdmVudFNlcSA9ICgpOiBudW1iZXIgPT4ge1xuICBuZXh0R2xvYmFsRXZlbnRTZXEgKz0gMVxuICByZXR1cm4gbmV4dEdsb2JhbEV2ZW50U2VxXG59XG5cbmNvbnN0IG1ha2VFdmVudElkID0gKGluc3RhbmNlSWQ6IHN0cmluZywgZXZlbnRTZXE6IG51bWJlcik6IHN0cmluZyA9PiBgJHtpbnN0YW5jZUlkfTo6ZSR7ZXZlbnRTZXF9YFxuXG50eXBlIERvd25ncmFkZVJlYXNvbiA9IEpzb25Eb3duZ3JhZGVSZWFzb24gfCBFcnJvckRvd25ncmFkZVJlYXNvblxuXG5jb25zdCBtZXJnZURvd25ncmFkZSA9IChcbiAgY3VycmVudDogRG93bmdyYWRlUmVhc29uIHwgdW5kZWZpbmVkLFxuICBuZXh0OiBEb3duZ3JhZGVSZWFzb24gfCB1bmRlZmluZWQsXG4pOiBEb3duZ3JhZGVSZWFzb24gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWN1cnJlbnQpIHJldHVybiBuZXh0XG4gIGlmICghbmV4dCkgcmV0dXJuIGN1cnJlbnRcbiAgaWYgKGN1cnJlbnQgPT09IFwibm9uX3NlcmlhbGl6YWJsZVwiIHx8IG5leHQgPT09IFwibm9uX3NlcmlhbGl6YWJsZVwiKSByZXR1cm4gXCJub25fc2VyaWFsaXphYmxlXCJcbiAgaWYgKGN1cnJlbnQgPT09IFwib3ZlcnNpemVkXCIgfHwgbmV4dCA9PT0gXCJvdmVyc2l6ZWRcIikgcmV0dXJuIFwib3ZlcnNpemVkXCJcbiAgcmV0dXJuIFwidW5rbm93blwiXG59XG5cbi8vIFx1NkQ0Rlx1ODlDOFx1NTY2OFx1NzNBRlx1NTg4M1x1NEUwQlx1RkYwQ1x1NEUzQVx1NEU4Nlx1NTFDRlx1NUMxMSBSZWFjdCBTdHJpY3RNb2RlIFx1N0I0OVx1NUJGQ1x1ODFGNFx1NzY4NFx1OTFDRFx1NTkwRFx1NjVFNVx1NUZEN1x1NTY2QVx1OTdGM1x1RkYwQ1xuLy8gXHU1QkY5IGxpZmVjeWNsZTplcnJvciBcdTRFMEUgZGlhZ25vc3RpYyBcdTRFOEJcdTRFRjZcdTUwNUFcdTRFMDBcdTZCMjFcdTdCODBcdTUzNTVcdTUzQkJcdTkxQ0RcdUZGMUFcdTU0MENcdTRFMDAgbW9kdWxlSWQrcGF5bG9hZCBcdTUzRUFcdTYyNTNcdTUzNzBcdTRFMDBcdTZCMjFcdTMwMDJcbmNvbnN0IGJyb3dzZXJMaWZlY3ljbGVTZWVuID0gbmV3IFNldDxzdHJpbmc+KClcbmNvbnN0IGJyb3dzZXJEaWFnbm9zdGljU2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbi8vIFx1NzUyOFx1NEU4RVx1NUMwNiB0cmFjZTpyZWFjdC1yZW5kZXIgXHU0RThCXHU0RUY2XHU0RTBFXHU2NzAwXHU4RkQxXHU0RTAwXHU2QjIxIHN0YXRlOnVwZGF0ZSBcdTRFOEJcdTUyQTFcdTVCRjlcdTlGNTBcdUZGMDhcdTRFQzVcdTRGNUNcdTRFM0EgVUkgXHU4Rjg1XHU1MkE5XHU1MTczXHU4MDU0XHVGRjA5XHUzMDAyXG5jb25zdCBsYXN0VHhuQnlJbnN0YW5jZSA9IG5ldyBNYXA8c3RyaW5nLCB7IHJlYWRvbmx5IHR4bklkOiBzdHJpbmc7IHJlYWRvbmx5IHR4blNlcTogbnVtYmVyIH0+KClcblxuY29uc3QgbGlmZWN5Y2xlRXJyb3JMb2cgPSAoZXZlbnQ6IEV4dHJhY3Q8RXZlbnQsIHsgcmVhZG9ubHkgdHlwZTogXCJsaWZlY3ljbGU6ZXJyb3JcIiB9PikgPT4ge1xuICBjb25zdCBtb2R1bGVJZCA9IGV2ZW50Lm1vZHVsZUlkID8/IFwidW5rbm93blwiXG4gIGNvbnN0IGNhdXNlUHJldHR5ID0gKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIENhdXNlLnByZXR0eShldmVudC5jYXVzZSBhcyBDYXVzZS5DYXVzZTx1bmtub3duPiwge1xuICAgICAgICByZW5kZXJFcnJvckNhdXNlOiB0cnVlLFxuICAgICAgfSlcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShldmVudC5jYXVzZSwgbnVsbCwgMilcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGV2ZW50LmNhdXNlKVxuICAgICAgfVxuICAgIH1cbiAgfSkoKVxuXG4gIGNvbnN0IG1lc3NhZ2UgPSBgW0xvZ2l4XVttb2R1bGU9JHttb2R1bGVJZH1dIGxpZmVjeWNsZTplcnJvclxcbiR7Y2F1c2VQcmV0dHl9YFxuXG4gIHJldHVybiBFZmZlY3QubG9nRXJyb3IobWVzc2FnZSkucGlwZShcbiAgICBFZmZlY3QuYW5ub3RhdGVMb2dzKHtcbiAgICAgIFwibG9naXgubW9kdWxlSWRcIjogbW9kdWxlSWQsXG4gICAgICBcImxvZ2l4LmV2ZW50XCI6IFwibGlmZWN5Y2xlOmVycm9yXCIsXG4gICAgICBcImxvZ2l4LmNhdXNlXCI6IGNhdXNlUHJldHR5LFxuICAgIH0pLFxuICApXG59XG5cbmNvbnN0IGRpYWdub3N0aWNMb2cgPSAoZXZlbnQ6IEV4dHJhY3Q8RXZlbnQsIHsgcmVhZG9ubHkgdHlwZTogXCJkaWFnbm9zdGljXCIgfT4pID0+IHtcbiAgY29uc3QgbW9kdWxlSWQgPSBldmVudC5tb2R1bGVJZCA/PyBcInVua25vd25cIlxuICBjb25zdCBoZWFkZXIgPSBgW0xvZ2l4XVttb2R1bGU9JHttb2R1bGVJZH1dIGRpYWdub3N0aWMoJHtldmVudC5zZXZlcml0eX0pYFxuICBjb25zdCBkZXRhaWwgPSBgY29kZT0ke2V2ZW50LmNvZGV9IG1lc3NhZ2U9JHtldmVudC5tZXNzYWdlfSR7XG4gICAgZXZlbnQuYWN0aW9uVGFnID8gYCBhY3Rpb249JHtldmVudC5hY3Rpb25UYWd9YCA6IFwiXCJcbiAgfSR7ZXZlbnQuaGludCA/IGBcXG5oaW50OiAke2V2ZW50LmhpbnR9YCA6IFwiXCJ9YFxuICBjb25zdCBtc2cgPSBgJHtoZWFkZXJ9XFxuJHtkZXRhaWx9YFxuXG4gIGNvbnN0IGJhc2UgPVxuICAgIGV2ZW50LnNldmVyaXR5ID09PSBcIndhcm5pbmdcIlxuICAgICAgPyBFZmZlY3QubG9nV2FybmluZyhtc2cpXG4gICAgICA6IGV2ZW50LnNldmVyaXR5ID09PSBcImluZm9cIlxuICAgICAgICA/IEVmZmVjdC5sb2dJbmZvKG1zZylcbiAgICAgICAgOiBFZmZlY3QubG9nRXJyb3IobXNnKVxuXG4gIGNvbnN0IGFubm90YXRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICBcImxvZ2l4Lm1vZHVsZUlkXCI6IG1vZHVsZUlkLFxuICAgIFwibG9naXguZXZlbnRcIjogYGRpYWdub3N0aWMoJHtldmVudC5zZXZlcml0eX0pYCxcbiAgICBcImxvZ2l4LmRpYWdub3N0aWMuY29kZVwiOiBldmVudC5jb2RlLFxuICAgIFwibG9naXguZGlhZ25vc3RpYy5tZXNzYWdlXCI6IGV2ZW50Lm1lc3NhZ2UsXG4gIH1cbiAgaWYgKGV2ZW50LmhpbnQpIHtcbiAgICBhbm5vdGF0aW9uc1tcImxvZ2l4LmRpYWdub3N0aWMuaGludFwiXSA9IGV2ZW50LmhpbnRcbiAgfVxuICBpZiAoZXZlbnQuYWN0aW9uVGFnKSB7XG4gICAgYW5ub3RhdGlvbnNbXCJsb2dpeC5kaWFnbm9zdGljLmFjdGlvblRhZ1wiXSA9IGV2ZW50LmFjdGlvblRhZ1xuICB9XG5cbiAgcmV0dXJuIGJhc2UucGlwZShFZmZlY3QuYW5ub3RhdGVMb2dzKGFubm90YXRpb25zKSlcbn1cblxuLyoqXG4gKiBcdTU3RkFcdTRFOEUgRmliZXJSZWYuY3VycmVudERlYnVnU2lua3MgXHU3Njg0XHU5RUQ4XHU4QkE0IExheWVyIFx1N0VDNFx1NTQwOFx1RkYxQVxuICogLSBcdTRGN0ZcdTc1MjggTGF5ZXIubG9jYWxseVNjb3BlZCBcdTc4NkVcdTRGREQgRGVidWcgc2lua3MgXHU0RjVDXHU0RTNBIEZpYmVyUmVmIFx1NzJCNlx1NjAwMVx1NkNFOFx1NTE2NVx1RkYwQ1xuICogLSBcdTRFMERcdTUxOERcdTVDMDYgRmliZXJSZWYgXHU4QkVGXHU3NTI4XHU0RTNBIENvbnRleHQuVGFnXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBub29wTGF5ZXIgPSBMYXllci5sb2NhbGx5U2NvcGVkKGN1cnJlbnREZWJ1Z1NpbmtzLCBbXSlcblxuLyoqXG4gKiBlcnJvck9ubHlMYXllclx1RkYxQVxuICogLSBcdTlFRDhcdThCQTRcdTc2ODQgRGVidWdTaW5rIFx1NUI5RVx1NzNCMFx1RkYwQ1x1NEVDNVx1NTE3M1x1NUZDMyBsaWZlY3ljbGU6ZXJyb3IgXHU0RThCXHU0RUY2XHVGRjFCXG4gKiAtIFx1OTAwMlx1NTQwOFx1NEY1Q1x1NEUzQSBSdW50aW1lIFx1NzY4NFx1MjAxQ1x1NjcwMFx1NEY0RVx1OTY1MFx1NUVBNlx1ODlDMlx1NkQ0Qlx1MjAxRFx1NUM0Mlx1RkYwQ1x1NEZERFx1OEJDMVx1ODFGNFx1NTQ3RFx1OTUxOVx1OEJFRlx1NEUwRFx1NEYxQVx1NjA4NFx1NzEzNlx1NkQ4OFx1NTkzMVx1RkYxQlxuICogLSBcdTUxNzZcdTRFRDZcdTRFOEJcdTRFRjZcdUZGMDhtb2R1bGU6aW5pdC9kZXN0cm95XHUzMDAxYWN0aW9uOmRpc3BhdGNoXHUzMDAxc3RhdGU6dXBkYXRlXHVGRjA5XHU5RUQ4XHU4QkE0XHU0RTBEXHU4QkIwXHU1RjU1XHUzMDAyXG4gKi9cbmNvbnN0IGVycm9yT25seVNpbms6IFNpbmsgPSB7XG4gIHJlY29yZDogKGV2ZW50OiBFdmVudCkgPT5cbiAgICBldmVudC50eXBlID09PSBcImxpZmVjeWNsZTplcnJvclwiXG4gICAgICA/IGxpZmVjeWNsZUVycm9yTG9nKGV2ZW50KVxuICAgICAgOiBldmVudC50eXBlID09PSBcImRpYWdub3N0aWNcIiAmJiBldmVudC5zZXZlcml0eSAhPT0gXCJpbmZvXCJcbiAgICAgICAgPyBkaWFnbm9zdGljTG9nKGV2ZW50KVxuICAgICAgICA6IEVmZmVjdC52b2lkLFxufVxuXG5leHBvcnQgY29uc3QgZXJyb3JPbmx5TGF5ZXIgPSBMYXllci5sb2NhbGx5U2NvcGVkKGN1cnJlbnREZWJ1Z1NpbmtzLCBbZXJyb3JPbmx5U2lua10pXG5cbi8qKlxuICogY29uc29sZUxheWVyXHVGRjFBXG4gKiAtIFx1NTE2OFx1OTFDRlx1OEMwM1x1OEJENVx1NUM0Mlx1RkYwQ1x1NUMwNlx1NjI0MFx1NjcwOSBEZWJ1ZyBcdTRFOEJcdTRFRjZcdTRFRTUgRWZmZWN0IFx1NjVFNVx1NUZEN1x1NUY2Mlx1NUYwRlx1OEY5M1x1NTFGQVx1RkYwOGxvZ2ZtdCAvIHN0cnVjdHVyZWRcdUZGMDlcdUZGMENcbiAqIC0gXHU5MDAyXHU1NDA4XHU0RjVDXHU0RTNBXHU5MDFBXHU3NTI4XHU3M0FGXHU1ODgzXHVGRjA4Tm9kZSAvIFx1NkQ0Qlx1OEJENVx1NzNBRlx1NTg4M1x1RkYwOVx1NzY4NFx1ODlDMlx1NkQ0Qlx1NUM0Mlx1MzAwMlxuICovXG5jb25zdCBjb25zb2xlU2luazogU2luayA9IHtcbiAgcmVjb3JkOiAoZXZlbnQ6IEV2ZW50KSA9PlxuICAgIGV2ZW50LnR5cGUgPT09IFwibGlmZWN5Y2xlOmVycm9yXCJcbiAgICAgID8gbGlmZWN5Y2xlRXJyb3JMb2coZXZlbnQpXG4gICAgICA6IGV2ZW50LnR5cGUgPT09IFwiZGlhZ25vc3RpY1wiXG4gICAgICAgID8gZGlhZ25vc3RpY0xvZyhldmVudClcbiAgICAgICAgOiBFZmZlY3QubG9nRGVidWcoeyBkZWJ1Z0V2ZW50OiBldmVudCB9KSxcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnNvbGVMYXllciA9IExheWVyLmxvY2FsbHlTY29wZWQoY3VycmVudERlYnVnU2lua3MsIFtjb25zb2xlU2lua10pXG5cbmNvbnN0IGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSBcInVuZGVmaW5lZFwiXG5cbi8vIFx1NkQ0Rlx1ODlDOFx1NTY2OFx1NzNBRlx1NTg4M1x1NEUwQlx1N0VERlx1NEUwMFx1NzY4NCBDb25zb2xlIFx1NkUzMlx1NjdEM1x1OTAzQlx1OEY5MVx1RkYwQ1x1NzUyOFx1NEU4RSBEZWJ1Z1NpbmsgXHU3RjNBXHU3NzAxXHU1QjlFXHU3M0IwXHU0RTBFIGJyb3dzZXJDb25zb2xlTGF5ZXJcdTMwMDJcbmNvbnN0IHJlbmRlckJyb3dzZXJDb25zb2xlRXZlbnQgPSAoZXZlbnQ6IEV2ZW50KTogRWZmZWN0LkVmZmVjdDx2b2lkPiA9PiB7XG4gIC8vIHRyYWNlOiogXHU0RThCXHU0RUY2XHVGRjFBXHU1NzI4XHU2RDRGXHU4OUM4XHU1NjY4XHU0RTJEXHU0RUU1XHU3MkVDXHU3QUNCXHU1MjA2XHU3RUM0XHU1QzU1XHU3OTNBXHVGRjBDXHU0RkJGXHU0RThFIFBsYXlncm91bmQgLyBEZXZUb29scyBcdTg5QzJcdTZENEJcdTMwMDJcbiAgaWYgKHR5cGVvZiAoZXZlbnQgYXMgYW55KS50eXBlID09PSBcInN0cmluZ1wiICYmIChldmVudCBhcyBhbnkpLnR5cGUuc3RhcnRzV2l0aChcInRyYWNlOlwiKSkge1xuICAgIGNvbnN0IG1vZHVsZUlkID0gKGV2ZW50IGFzIGFueSkubW9kdWxlSWQgPz8gXCJ1bmtub3duXCJcbiAgICBjb25zdCB0eXBlID0gKGV2ZW50IGFzIGFueSkudHlwZVxuXG4gICAgcmV0dXJuIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFxuICAgICAgICBcIiVjW0xvZ2l4XSVjIHRyYWNlICVjXCIgKyBtb2R1bGVJZCArIFwiJWMgXCIgKyBTdHJpbmcodHlwZSksXG4gICAgICAgIFwiY29sb3I6IzZiNzI4MDtmb250LXdlaWdodDpib2xkXCIsIC8vIHRhZ1xuICAgICAgICBcImNvbG9yOiMzYjgyZjZcIiwgLy8gbGFiZWxcbiAgICAgICAgXCJjb2xvcjojOWNhM2FmXCIsIC8vIG1vZHVsZSBpZFxuICAgICAgICBcImNvbG9yOiM2YjcyODBcIiwgLy8gdHlwZVxuICAgICAgKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKGV2ZW50KVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKVxuICAgIH0pXG4gIH1cblxuICBpZiAoZXZlbnQudHlwZSA9PT0gXCJsaWZlY3ljbGU6ZXJyb3JcIikge1xuICAgIGNvbnN0IG1vZHVsZUlkID0gZXZlbnQubW9kdWxlSWQgPz8gXCJ1bmtub3duXCJcbiAgICBjb25zdCBjYXVzZVByZXR0eSA9ICgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gQ2F1c2UucHJldHR5KGV2ZW50LmNhdXNlIGFzIENhdXNlLkNhdXNlPHVua25vd24+LCB7IHJlbmRlckVycm9yQ2F1c2U6IHRydWUgfSlcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShldmVudC5jYXVzZSwgbnVsbCwgMilcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoZXZlbnQuY2F1c2UpXG4gICAgICB9XG4gICAgfVxuICB9KSgpXG5cbiAgICBjb25zdCBrZXkgPSBgJHttb2R1bGVJZH18JHtjYXVzZVByZXR0eX1gXG4gICAgaWYgKGJyb3dzZXJMaWZlY3ljbGVTZWVuLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICB9XG4gICAgYnJvd3NlckxpZmVjeWNsZVNlZW4uYWRkKGtleSlcblxuICAgIHJldHVybiBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChcbiAgICAgICAgXCIlY1tMb2dpeF0lYyBsaWZlY3ljbGU6ZXJyb3IgJWNcIiArIG1vZHVsZUlkLFxuICAgICAgICBcImNvbG9yOiNlZjQ0NDQ7Zm9udC13ZWlnaHQ6Ym9sZFwiLCAvLyB0YWdcbiAgICAgICAgXCJjb2xvcjojZWY0NDQ0XCIsIC8vIGxhYmVsXG4gICAgICAgIFwiY29sb3I6IzljYTNhZlwiLCAvLyBtb2R1bGUgaWRcbiAgICAgIClcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKGNhdXNlUHJldHR5KVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKVxuICAgIH0pXG4gIH1cblxuICBpZiAoZXZlbnQudHlwZSA9PT0gXCJkaWFnbm9zdGljXCIpIHtcbiAgICBjb25zdCBtb2R1bGVJZCA9IGV2ZW50Lm1vZHVsZUlkID8/IFwidW5rbm93blwiXG4gICAgY29uc3QgZGV0YWlsID0gYGNvZGU9JHtldmVudC5jb2RlfSBtZXNzYWdlPSR7ZXZlbnQubWVzc2FnZX0ke1xuICAgICAgZXZlbnQuYWN0aW9uVGFnID8gYCBhY3Rpb249JHtldmVudC5hY3Rpb25UYWd9YCA6IFwiXCJcbiAgICB9JHtldmVudC5oaW50ID8gYFxcbmhpbnQ6ICR7ZXZlbnQuaGludH1gIDogXCJcIn1gXG5cbiAgICBjb25zdCBjb2xvciA9XG4gICAgICBldmVudC5zZXZlcml0eSA9PT0gXCJ3YXJuaW5nXCJcbiAgICAgICAgPyBcImNvbG9yOiNkOTc3MDZcIlxuICAgICAgICA6IGV2ZW50LnNldmVyaXR5ID09PSBcImluZm9cIlxuICAgICAgICAgID8gXCJjb2xvcjojM2I4MmY2XCJcbiAgICAgICAgICA6IFwiY29sb3I6I2VmNDQ0NFwiXG5cbiAgICBjb25zdCBsYWJlbCA9XG4gICAgICBldmVudC5zZXZlcml0eSA9PT0gXCJ3YXJuaW5nXCJcbiAgICAgICAgPyBcImRpYWdub3N0aWMod2FybmluZylcIlxuICAgICAgICA6IGV2ZW50LnNldmVyaXR5ID09PSBcImluZm9cIlxuICAgICAgICAgID8gXCJkaWFnbm9zdGljKGluZm8pXCJcbiAgICAgICAgICA6IFwiZGlhZ25vc3RpYyhlcnJvcilcIlxuXG4gICAgY29uc3Qga2V5ID0gYCR7bW9kdWxlSWR9fCR7ZXZlbnQuY29kZX18JHtldmVudC5tZXNzYWdlfWBcbiAgICBpZiAoYnJvd3NlckRpYWdub3N0aWNTZWVuLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICB9XG4gICAgYnJvd3NlckRpYWdub3N0aWNTZWVuLmFkZChrZXkpXG5cbiAgICByZXR1cm4gRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZ3JvdXBDb2xsYXBzZWQoXG4gICAgICAgIFwiJWNbTG9naXhdJWMgXCIgKyBsYWJlbCArIFwiJWMgbW9kdWxlPVwiICsgbW9kdWxlSWQsXG4gICAgICAgIFwiY29sb3I6IzZiNzI4MDtmb250LXdlaWdodDpib2xkXCIsXG4gICAgICAgIGNvbG9yLFxuICAgICAgICBcImNvbG9yOiM5Y2EzYWZcIixcbiAgICAgIClcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmxvZyhkZXRhaWwpXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5ncm91cEVuZCgpXG4gICAgfSlcbiAgfVxuXG4gIC8vIFx1NTE3Nlx1NEVENlx1NEU4Qlx1NEVGNlx1RkYxQVx1OUVEOFx1OEJBNFx1NEUwRFx1NTcyOFx1NkQ0Rlx1ODlDOFx1NTY2OFx1NjNBN1x1NTIzNlx1NTNGMFx1OEY5M1x1NTFGQVx1RkYwQ1x1NEVFNVx1NTE0RFx1NTcyOFx1NEUxQVx1NTJBMVx1NUYwMFx1NTNEMVx1NTczQVx1NjY2Rlx1NEUyRFx1OEZDN1x1NEU4RVx1NTQzNVx1OTVGOVx1RkYxQlxuICAvLyBcdTU5ODJcdTk3MDBcdTY3RTVcdTc3MEJcdTUxODVcdTkwRThcdThDMDNcdThCRDVcdTRFOEJcdTRFRjZcdUZGMENcdTUzRUZcdTkwMUFcdThGQzdcdTgxRUFcdTVCOUFcdTRFNDkgRGVidWcgU2luayBcdTYyMTZcdTU3MjggTm9kZSBcdTczQUZcdTU4ODNcdTRFMEJcdTRGN0ZcdTc1MjggY29uc29sZUxheWVyXHUzMDAyXG4gIHJldHVybiBFZmZlY3Qudm9pZFxufVxuXG4vKipcbiAqIFx1NkQ0Rlx1ODlDOFx1NTY2OCBDb25zb2xlIFx1OEMwM1x1OEJENVx1NUM0Mlx1RkYxQVxuICogLSBcdTU3MjhcdTZENEZcdTg5QzhcdTU2NjhcdTczQUZcdTU4ODNcdTRFMEJcdTRGN0ZcdTc1MjggY29uc29sZS5ncm91cENvbGxhcHNlZCArIFx1NUY2OVx1ODI3MiBsYWJlbCBcdTZBMjFcdTYyREYgcHJldHR5IGxvZ2dlciBcdTc2ODRcdTUyMDZcdTdFQzRcdTY1NDhcdTY3OUNcdUZGMUJcbiAqIC0gXHU1NzI4XHU5NzVFXHU2RDRGXHU4OUM4XHU1NjY4XHU3M0FGXHU1ODgzXHU0RTBCXHU1NkRFXHU5MDAwXHU1MjMwIGNvbnNvbGVMYXllciBcdTc2ODQgRWZmZWN0IFx1NjVFNVx1NUZEN1x1NUI5RVx1NzNCMFx1MzAwMlxuICovXG5jb25zdCBicm93c2VyQ29uc29sZVNpbms6IFNpbmsgPSB7XG4gIHJlY29yZDogKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgIGlmICghaXNCcm93c2VyKSB7XG4gICAgICAvLyBcdTk3NUVcdTZENEZcdTg5QzhcdTU2NjhcdTczQUZcdTU4ODNcdUZGMUFcdTkwMDBcdTU2REVcdTUyMzAgRWZmZWN0LmxvZyogXHU3Njg0IGNvbnNvbGVMYXllciBcdTg4NENcdTRFM0FcbiAgICAgIHJldHVybiBldmVudC50eXBlID09PSBcImxpZmVjeWNsZTplcnJvclwiXG4gICAgICAgID8gbGlmZWN5Y2xlRXJyb3JMb2coZXZlbnQpXG4gICAgICAgIDogZXZlbnQudHlwZSA9PT0gXCJkaWFnbm9zdGljXCJcbiAgICAgICAgICA/IGRpYWdub3N0aWNMb2coZXZlbnQpXG4gICAgICAgICAgOiBFZmZlY3QubG9nRGVidWcoeyBkZWJ1Z0V2ZW50OiBldmVudCB9KVxuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJCcm93c2VyQ29uc29sZUV2ZW50KGV2ZW50KVxuICB9LFxufVxuXG5leHBvcnQgY29uc3QgYnJvd3NlckNvbnNvbGVMYXllciA9IExheWVyLmxvY2FsbHlTY29wZWQoY3VycmVudERlYnVnU2lua3MsIFticm93c2VyQ29uc29sZVNpbmtdKVxuXG4vKipcbiAqIFx1NkQ0Rlx1ODlDOFx1NTY2OFx1NTNDQlx1NTk3RFx1NzY4NCBMb2dnZXIgXHU1QzQyXHVGRjFBXHU0RjdGXHU3NTI4IEVmZmVjdCBcdTVCOThcdTY1QjlcdTc2ODQgcHJldHR5IGxvZ2dlclx1RkYwOGJyb3dzZXIgXHU2QTIxXHU1RjBGXHVGRjA5XHU2NkZGXHU2MzYyXHU5RUQ4XHU4QkE0IGxvZ2dlclx1MzAwMlxuICogLSBcdTRFMERcdTUxOERcdTYyNEJcdTUxOTkgY29uc29sZSBcdTY4MzdcdTVGMEZcdUZGMENcdTc2RjRcdTYzQTVcdTU5MERcdTc1MjggRWZmZWN0IFx1NzY4NFx1NUY2OVx1ODI3Mi9cdTUyMDZcdTdFQzRcdTY4M0NcdTVGMEZcdUZGMUJcbiAqIC0gXHU1NzI4XHU2NzBEXHU1MkExXHU3QUVGXHU3M0FGXHU1ODgzXHU0RTBCXHU0RTVGXHU4MEZEXHU1Qjg5XHU1MTY4XHU5MDAwXHU1MzE2XHU0RTNBXHU5RUQ4XHU4QkE0IGxvZ2dlclx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgYnJvd3NlclByZXR0eUxvZ2dlckxheWVyID0gTG9nZ2VyLnJlcGxhY2UoXG4gIExvZ2dlci5kZWZhdWx0TG9nZ2VyLFxuICBMb2dnZXIucHJldHR5TG9nZ2VyKHsgbW9kZTogXCJicm93c2VyXCIsIGNvbG9yczogdHJ1ZSB9KVxuKVxuXG4vKipcbiAqIGRlZmF1bHRMYXllclx1RkYxQVxuICogLSBcdTUxNkNcdTUxNzFcdTlFRDhcdThCQTRcdTVDNDJcdUZGMENcdTVGNTNcdTUyNERcdTdCNDlcdTU0MENcdTRFOEUgZXJyb3JPbmx5TGF5ZXJcdUZGMUJcbiAqIC0gXHU0RUM1XHU4QkIwXHU1RjU1IGxpZmVjeWNsZTplcnJvclx1RkYwQ1x1OTA3Rlx1NTE0RFx1NTcyOFx1OUVEOFx1OEJBNFx1NjBDNVx1NTFCNVx1NEUwQlx1NUJGOSBhY3Rpb24vc3RhdGUgXHU2MjUzXHU1MzcwXHU1OTI3XHU5MUNGXHU2NUU1XHU1RkQ3XHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0TGF5ZXIgPSBlcnJvck9ubHlMYXllclxuXG5leHBvcnQgY29uc3QgcmVjb3JkID0gKGV2ZW50OiBFdmVudCkgPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHNpbmtzID0geWllbGQqIEZpYmVyUmVmLmdldChjdXJyZW50RGVidWdTaW5rcylcbiAgICBjb25zdCBydW50aW1lTGFiZWwgPSB5aWVsZCogRmliZXJSZWYuZ2V0KGN1cnJlbnRSdW50aW1lTGFiZWwpXG4gICAgY29uc3QgdHhuSWQgPSB5aWVsZCogRmliZXJSZWYuZ2V0KGN1cnJlbnRUeG5JZClcblxuICAgIC8vIFx1NEUzQSBEZWJ1Zy5FdmVudCBcdTg4NjVcdTUxNjhcdTU3RkFcdTc4NDBcdTVCNTdcdTZCQjVcdUZGMUFcbiAgICAvLyAtIHRpbWVzdGFtcFx1RkYxQVx1NzUyOFx1NEU4RSBEZXZ0b29scy9UaW1lbGluZS9PdmVydmlldyBcdTUwNUFcdTY1RjZcdTk1RjRcdTgwNUFcdTU0MDhcdUZGMENcdTkwN0ZcdTUxNEQgVUkgXHU0RkE3XHU3NTI4IERhdGUubm93KClcdTIwMUNcdTk5OTZcdTZCMjFcdTg5QzJcdTVCREZcdTY1RjZcdTk1RjRcdTIwMURcdTVCRkNcdTgxRjRcdTU5MzFcdTc3MUZcdUZGMUJcbiAgICAvLyAtIHJ1bnRpbWVMYWJlbFx1RkYxQVx1Njc2NVx1ODFFQSBGaWJlclJlZlx1RkYwQ1x1NEZCRlx1NEU4RVx1NjMwOSBydW50aW1lIFx1N0VGNFx1NUVBNlx1NTIwNlx1N0VDNFx1RkYwOFx1NEVDNVx1NTcyOFx1NEU4Qlx1NEVGNlx1NjcyQVx1NjYzRVx1NUYwRlx1NjNEMFx1NEY5Qlx1NjVGNlx1NkNFOFx1NTE2NVx1RkYwOVx1MzAwMlxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICBjb25zdCBlbnJpY2hlZCA9IGV2ZW50IGFzIEV2ZW50XG4gICAgaWYgKGVucmljaGVkLnRpbWVzdGFtcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICA7KGVucmljaGVkIGFzIGFueSkudGltZXN0YW1wID0gbm93XG4gICAgfVxuXHRpZiAocnVudGltZUxhYmVsICYmIGVucmljaGVkLnJ1bnRpbWVMYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgOyhlbnJpY2hlZCBhcyBhbnkpLnJ1bnRpbWVMYWJlbCA9IHJ1bnRpbWVMYWJlbFxuXHR9XG5cdGlmICh0eG5JZCAmJiBlbnJpY2hlZC50eXBlID09PSBcImRpYWdub3N0aWNcIiAmJiAoZW5yaWNoZWQgYXMgYW55KS50eG5JZCA9PT0gdW5kZWZpbmVkKSB7XG5cdCAgOyhlbnJpY2hlZCBhcyBhbnkpLnR4bklkID0gdHhuSWRcblx0fVxuXG4gICAgaWYgKHNpbmtzLmxlbmd0aCA+IDApIHtcbiAgICAgIHlpZWxkKiBFZmZlY3QuZm9yRWFjaChcbiAgICAgICAgc2lua3MsXG4gICAgICAgIChzaW5rKSA9PiBzaW5rLnJlY29yZChlbnJpY2hlZCksXG4gICAgICAgIHtcbiAgICAgICAgICBkaXNjYXJkOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGlzQnJvd3Nlcikge1xuICAgICAgeWllbGQqIHJlbmRlckJyb3dzZXJDb25zb2xlRXZlbnQoZW5yaWNoZWQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGVucmljaGVkLnR5cGUgPT09IFwibGlmZWN5Y2xlOmVycm9yXCIpIHtcbiAgICAgIHlpZWxkKiBsaWZlY3ljbGVFcnJvckxvZyhlbnJpY2hlZClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZW5yaWNoZWQudHlwZSA9PT0gXCJkaWFnbm9zdGljXCIpIHtcbiAgICAgIHlpZWxkKiBkaWFnbm9zdGljTG9nKGVucmljaGVkKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHlpZWxkKiBFZmZlY3Qudm9pZFxuICB9KVxuXG4vKipcbiAqIFx1NUMwNlx1NTE4NVx1OTBFOCBEZWJ1Zy5FdmVudCBcdTVGNTJcdTRFMDBcdTUzMTZcdTRFM0EgUnVudGltZURlYnVnRXZlbnRSZWZcdUZGMUFcbiAqIC0gXHU0RkJGXHU0RThFIERldnRvb2xzIC8gUnVudGltZSBcdTdFREZcdTRFMDBcdTZEODhcdThEMzkgRGVidWcgXHU0RThCXHU0RUY2XHVGRjFCXG4gKiAtIFx1NEUwRFx1NjUzOVx1NTNEOFx1NTM5Rlx1NjcwOSBEZWJ1Z1NpbmsgXHU4ODRDXHU0RTNBXHVGRjBDXHU0RUM1XHU2M0QwXHU0RjlCXHU3RUQzXHU2Nzg0XHU1MzE2XHU4OUM2XHU1NkZFXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCB0b1J1bnRpbWVEZWJ1Z0V2ZW50UmVmID0gKFxuICBldmVudDogRXZlbnQsXG4gIG9wdGlvbnM/OiB7XG4gICAgcmVhZG9ubHkgZGlhZ25vc3RpY3NMZXZlbD86IERpYWdub3N0aWNzTGV2ZWxcbiAgICByZWFkb25seSBldmVudFNlcT86IG51bWJlclxuICAgIHJlYWRvbmx5IG9uTWV0YVByb2plY3Rpb24/OiAocHJvamVjdGlvbjoge1xuICAgICAgcmVhZG9ubHkgc3RhdHM6IEpzb25WYWx1ZVByb2plY3Rpb25TdGF0c1xuICAgICAgcmVhZG9ubHkgZG93bmdyYWRlPzogSnNvbkRvd25ncmFkZVJlYXNvblxuICAgIH0pID0+IHZvaWRcbiAgfSxcbik6IFJ1bnRpbWVEZWJ1Z0V2ZW50UmVmIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZGlhZ25vc3RpY3NMZXZlbCA9IG9wdGlvbnM/LmRpYWdub3N0aWNzTGV2ZWwgPz8gXCJmdWxsXCJcbiAgaWYgKGRpYWdub3N0aWNzTGV2ZWwgPT09IFwib2ZmXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBjb25zdCB0aW1lc3RhbXAgPVxuICAgIHR5cGVvZiBldmVudC50aW1lc3RhbXAgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKGV2ZW50LnRpbWVzdGFtcClcbiAgICAgID8gZXZlbnQudGltZXN0YW1wXG4gICAgICA6IERhdGUubm93KClcblxuICBjb25zdCBtb2R1bGVJZFJhdyA9IChldmVudCBhcyBhbnkpLm1vZHVsZUlkXG4gIGNvbnN0IG1vZHVsZUlkID1cbiAgICB0eXBlb2YgbW9kdWxlSWRSYXcgPT09IFwic3RyaW5nXCIgJiYgbW9kdWxlSWRSYXcubGVuZ3RoID4gMCA/IG1vZHVsZUlkUmF3IDogXCJ1bmtub3duXCJcblxuICBjb25zdCBpbnN0YW5jZUlkUmF3ID0gKGV2ZW50IGFzIGFueSkuaW5zdGFuY2VJZFxuICBjb25zdCBpbnN0YW5jZUlkID1cbiAgICB0eXBlb2YgaW5zdGFuY2VJZFJhdyA9PT0gXCJzdHJpbmdcIiAmJiBpbnN0YW5jZUlkUmF3Lmxlbmd0aCA+IDBcbiAgICAgID8gaW5zdGFuY2VJZFJhd1xuICAgICAgOiBcInVua25vd25cIlxuXG4gIGNvbnN0IHJ1bnRpbWVMYWJlbFJhdyA9IChldmVudCBhcyBhbnkpLnJ1bnRpbWVMYWJlbFxuICBjb25zdCBydW50aW1lTGFiZWwgPVxuICAgIHR5cGVvZiBydW50aW1lTGFiZWxSYXcgPT09IFwic3RyaW5nXCIgJiYgcnVudGltZUxhYmVsUmF3Lmxlbmd0aCA+IDBcbiAgICAgID8gcnVudGltZUxhYmVsUmF3XG4gICAgICA6IHVuZGVmaW5lZFxuXG4gIGNvbnN0IHR4blNlcVJhdyA9IChldmVudCBhcyBhbnkpLnR4blNlcVxuICBjb25zdCB0eG5TZXEgPVxuICAgIHR5cGVvZiB0eG5TZXFSYXcgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHR4blNlcVJhdykgJiYgdHhuU2VxUmF3ID49IDBcbiAgICAgID8gTWF0aC5mbG9vcih0eG5TZXFSYXcpXG4gICAgICA6IDBcblxuICBjb25zdCB0eG5JZFJhdyA9IChldmVudCBhcyBhbnkpLnR4bklkXG4gIGNvbnN0IHR4bklkID1cbiAgICB0eXBlb2YgdHhuSWRSYXcgPT09IFwic3RyaW5nXCIgJiYgdHhuSWRSYXcubGVuZ3RoID4gMFxuICAgICAgPyB0eG5JZFJhd1xuICAgICAgOiB0eG5TZXEgPiAwXG4gICAgICAgID8gYCR7aW5zdGFuY2VJZH06OnQke3R4blNlcX1gXG4gICAgICAgIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgZXZlbnRTZXFSYXcgPSBvcHRpb25zPy5ldmVudFNlcVxuICBjb25zdCBldmVudFNlcSA9XG4gICAgdHlwZW9mIGV2ZW50U2VxUmF3ID09PSBcIm51bWJlclwiICYmXG4gICAgTnVtYmVyLmlzRmluaXRlKGV2ZW50U2VxUmF3KSAmJlxuICAgIGV2ZW50U2VxUmF3ID4gMFxuICAgICAgPyBNYXRoLmZsb29yKGV2ZW50U2VxUmF3KVxuICAgICAgOiBuZXh0RXZlbnRTZXEoKVxuICBjb25zdCBldmVudElkID0gbWFrZUV2ZW50SWQoaW5zdGFuY2VJZCwgZXZlbnRTZXEpXG5cbiAgY29uc3QgYmFzZSA9IHtcbiAgICBldmVudElkLFxuICAgIGV2ZW50U2VxLFxuICAgIG1vZHVsZUlkLFxuICAgIGluc3RhbmNlSWQsXG4gICAgcnVudGltZUxhYmVsLFxuICAgIHR4blNlcSxcbiAgICB0eG5JZCxcbiAgICB0aW1lc3RhbXAsXG4gIH0gYXMgY29uc3RcblxuICBsZXQgZG93bmdyYWRlOiBEb3duZ3JhZGVSZWFzb24gfCB1bmRlZmluZWRcblxuICBjb25zdCB3aXRoRG93bmdyYWRlID0gKHJlZjogT21pdDxSdW50aW1lRGVidWdFdmVudFJlZiwgXCJkb3duZ3JhZGVcIj4pOiBSdW50aW1lRGVidWdFdmVudFJlZiA9PiB7XG4gICAgaWYgKCFkb3duZ3JhZGUpIHJldHVybiByZWZcbiAgICByZXR1cm4geyAuLi5yZWYsIGRvd25ncmFkZTogeyByZWFzb246IGRvd25ncmFkZSB9IH1cbiAgfVxuXG4gIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgIGNhc2UgXCJtb2R1bGU6aW5pdFwiOlxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiBcImxpZmVjeWNsZVwiLFxuICAgICAgICBsYWJlbDogXCJtb2R1bGU6aW5pdFwiLFxuICAgICAgfSlcbiAgICBjYXNlIFwibW9kdWxlOmRlc3Ryb3lcIjpcbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogXCJsaWZlY3ljbGVcIixcbiAgICAgICAgbGFiZWw6IFwibW9kdWxlOmRlc3Ryb3lcIixcbiAgICAgIH0pXG4gICAgY2FzZSBcImxpZmVjeWNsZTpwaGFzZVwiOiB7XG4gICAgICBjb25zdCBlID0gZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiBcImxpZmVjeWNsZTpwaGFzZVwiIH0+XG4gICAgICBjb25zdCBtZXRhSW5wdXQgPVxuICAgICAgICBkaWFnbm9zdGljc0xldmVsID09PSBcImxpZ2h0XCJcbiAgICAgICAgICA/IHsgdHlwZTogXCJsaWZlY3ljbGU6cGhhc2VcIiwgcGhhc2U6IGUucGhhc2UsIG5hbWU6IGUubmFtZSB9XG4gICAgICAgICAgOiB7IHR5cGU6IFwibGlmZWN5Y2xlOnBoYXNlXCIsIHBoYXNlOiBlLnBoYXNlLCBuYW1lOiBlLm5hbWUsIHBheWxvYWQ6IGUucGF5bG9hZCB9XG4gICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgIH0pXG4gICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogXCJsaWZlY3ljbGVcIixcbiAgICAgICAgbGFiZWw6IGUubmFtZSxcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICB9KVxuICAgIH1cbiAgICBjYXNlIFwiYWN0aW9uOmRpc3BhdGNoXCI6IHtcbiAgICAgIGNvbnN0IGFjdGlvbjogYW55ID0gKGV2ZW50IGFzIGFueSkuYWN0aW9uXG4gICAgICBjb25zdCB0YWcgPSBhY3Rpb24/Ll90YWcgPz8gYWN0aW9uPy50eXBlID8/IFwiYWN0aW9uOmRpc3BhdGNoXCJcbiAgICAgIGNvbnN0IGxhYmVsID0gU3RyaW5nKHRhZylcbiAgICAgIGNvbnN0IG1ldGFJbnB1dCA9IGRpYWdub3N0aWNzTGV2ZWwgPT09IFwibGlnaHRcIiA/IHsgYWN0aW9uVGFnOiBsYWJlbCB9IDogeyBhY3Rpb24gfVxuICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICB9KVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG4gICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIGtpbmQ6IFwiYWN0aW9uXCIsXG4gICAgICAgIGxhYmVsLFxuICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGNhc2UgXCJzdGF0ZTp1cGRhdGVcIjoge1xuICAgICAgY29uc3QgZSA9IGV2ZW50IGFzIEV4dHJhY3Q8RXZlbnQsIHsgcmVhZG9ubHkgdHlwZTogXCJzdGF0ZTp1cGRhdGVcIiB9PlxuICAgICAgY29uc3QgbWV0YUlucHV0ID1cbiAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCA9PT0gXCJsaWdodFwiXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHN0YXRlOiBlLnN0YXRlLFxuICAgICAgICAgICAgICBkaXJ0eVNldDogZS5kaXJ0eVNldCxcbiAgICAgICAgICAgICAgcGF0Y2hDb3VudDogZS5wYXRjaENvdW50LFxuICAgICAgICAgICAgICBjb21taXRNb2RlOiBlLmNvbW1pdE1vZGUsXG4gICAgICAgICAgICAgIHByaW9yaXR5OiBlLnByaW9yaXR5LFxuICAgICAgICAgICAgICBvcmlnaW5LaW5kOiBlLm9yaWdpbktpbmQsXG4gICAgICAgICAgICAgIG9yaWdpbk5hbWU6IGUub3JpZ2luTmFtZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgc3RhdGU6IGUuc3RhdGUsXG4gICAgICAgICAgICAgIGRpcnR5U2V0OiBlLmRpcnR5U2V0LFxuICAgICAgICAgICAgICBwYXRjaENvdW50OiBlLnBhdGNoQ291bnQsXG4gICAgICAgICAgICAgIGNvbW1pdE1vZGU6IGUuY29tbWl0TW9kZSxcbiAgICAgICAgICAgICAgcHJpb3JpdHk6IGUucHJpb3JpdHksXG4gICAgICAgICAgICAgIG9yaWdpbktpbmQ6IGUub3JpZ2luS2luZCxcbiAgICAgICAgICAgICAgb3JpZ2luTmFtZTogZS5vcmlnaW5OYW1lLFxuICAgICAgICAgICAgICB0cmFpdFN1bW1hcnk6IGUudHJhaXRTdW1tYXJ5LFxuICAgICAgICAgICAgICByZXBsYXlFdmVudDogZS5yZXBsYXlFdmVudCxcbiAgICAgICAgICAgIH1cbiAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgfSlcbiAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuICAgICAgaWYgKHR4bklkKSB7XG4gICAgICAgIGxhc3RUeG5CeUluc3RhbmNlLnNldChpbnN0YW5jZUlkLCB7IHR4bklkLCB0eG5TZXEgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogXCJzdGF0ZVwiLFxuICAgICAgICBsYWJlbDogXCJzdGF0ZTp1cGRhdGVcIixcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICB9KVxuICAgIH1cbiAgICBjYXNlIFwibGlmZWN5Y2xlOmVycm9yXCI6IHtcbiAgICAgIGNvbnN0IGUgPSBldmVudCBhcyBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6IFwibGlmZWN5Y2xlOmVycm9yXCIgfT5cbiAgICAgIGNvbnN0IHN1bW1hcnkgPSB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeShlLmNhdXNlKVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBzdW1tYXJ5LmRvd25ncmFkZSlcbiAgICAgIGNvbnN0IG1ldGFJbnB1dCA9XG4gICAgICAgIGRpYWdub3N0aWNzTGV2ZWwgPT09IFwibGlnaHRcIlxuICAgICAgICAgID8geyB0eXBlOiBcImxpZmVjeWNsZTplcnJvclwiLCBwaGFzZTogZS5waGFzZSwgbmFtZTogZS5ob29rIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJsaWZlY3ljbGU6ZXJyb3JcIixcbiAgICAgICAgICAgICAgcGhhc2U6IGUucGhhc2UsXG4gICAgICAgICAgICAgIG5hbWU6IGUuaG9vayxcbiAgICAgICAgICAgICAgaG9vazogZS5ob29rLFxuICAgICAgICAgICAgICB0YXNrSWQ6IGUudGFza0lkLFxuICAgICAgICAgICAgICBvcmlnaW46IGUub3JpZ2luLFxuICAgICAgICAgICAgICB0eG5TZXE6IGUudHhuU2VxLFxuICAgICAgICAgICAgICBvcFNlcTogZS5vcFNlcSxcbiAgICAgICAgICAgIH1cbiAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgfSlcbiAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiBcImxpZmVjeWNsZVwiLFxuICAgICAgICBsYWJlbDogXCJsaWZlY3ljbGU6ZXJyb3JcIixcbiAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIGVycm9yU3VtbWFyeTogc3VtbWFyeS5lcnJvclN1bW1hcnksXG4gICAgICB9KVxuICAgIH1cbiAgICBjYXNlIFwiZGlhZ25vc3RpY1wiOiB7XG4gICAgICBjb25zdCBlID0gZXZlbnQgYXMgRXh0cmFjdDxFdmVudCwgeyByZWFkb25seSB0eXBlOiBcImRpYWdub3N0aWNcIiB9PlxuICAgICAgY29uc3QgbWV0YUlucHV0ID0ge1xuICAgICAgICBjb2RlOiBlLmNvZGUsXG4gICAgICAgIHNldmVyaXR5OiBlLnNldmVyaXR5LFxuICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgIGhpbnQ6IGUuaGludCxcbiAgICAgICAgYWN0aW9uVGFnOiBlLmFjdGlvblRhZyxcbiAgICAgICAga2luZDogZS5raW5kLFxuICAgICAgICB0cmlnZ2VyOiBlLnRyaWdnZXIsXG4gICAgICB9XG4gICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgIH0pXG4gICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcbiAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogXCJkaWFnbm9zdGljXCIsXG4gICAgICAgIGxhYmVsOiBlLmNvZGUsXG4gICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgfSlcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgaWYgKHR5cGVvZiBldmVudC50eXBlICE9PSBcInN0cmluZ1wiIHx8ICFldmVudC50eXBlLnN0YXJ0c1dpdGgoXCJ0cmFjZTpcIikpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTpyZWFjdC1yZW5kZXIgLyB0cmFjZTpyZWFjdC1zZWxlY3Rvclx1RkYxQVx1NTNFQVx1NEZERFx1NzU1OSBTbGltIG1ldGFcdUZGMDhcdTVCNTdcdTZCQjVcdTg4QzFcdTUyNkFcdTc1MzEgSnNvblZhbHVlIFx1NjI5NVx1NUY3MVx1NjI3Rlx1NjJDNVx1RkYwOVx1MzAwMlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwidHJhY2U6cmVhY3QtcmVuZGVyXCIgfHwgZXZlbnQudHlwZSA9PT0gXCJ0cmFjZTpyZWFjdC1zZWxlY3RvclwiKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IChldmVudCBhcyBhbnkpLmRhdGFcbiAgICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKFxuICAgICAgICAgIGRpYWdub3N0aWNzTGV2ZWwgPT09IFwibGlnaHRcIlxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50TGFiZWw6IGRhdGE/LmNvbXBvbmVudExhYmVsLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yS2V5OiBkYXRhPy5zZWxlY3RvcktleSxcbiAgICAgICAgICAgICAgICBmaWVsZFBhdGhzOiBkYXRhPy5maWVsZFBhdGhzLFxuICAgICAgICAgICAgICAgIHN0cmljdE1vZGVQaGFzZTogZGF0YT8uc3RyaWN0TW9kZVBoYXNlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRMYWJlbDogZGF0YT8uY29tcG9uZW50TGFiZWwsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3JLZXk6IGRhdGE/LnNlbGVjdG9yS2V5LFxuICAgICAgICAgICAgICAgIGZpZWxkUGF0aHM6IGRhdGE/LmZpZWxkUGF0aHMsXG4gICAgICAgICAgICAgICAgc3RyaWN0TW9kZVBoYXNlOiBkYXRhPy5zdHJpY3RNb2RlUGhhc2UsXG4gICAgICAgICAgICAgICAgbWV0YTogZGF0YT8ubWV0YSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG4gICAgICAgIGNvbnN0IGxhYmVsID1cbiAgICAgICAgICB0eXBlb2YgZGF0YT8uY29tcG9uZW50TGFiZWwgPT09IFwic3RyaW5nXCIgJiYgZGF0YS5jb21wb25lbnRMYWJlbC5sZW5ndGggPiAwXG4gICAgICAgICAgICA/IGRhdGEuY29tcG9uZW50TGFiZWxcbiAgICAgICAgICAgIDogZXZlbnQudHlwZSA9PT0gXCJ0cmFjZTpyZWFjdC1zZWxlY3RvclwiXG4gICAgICAgICAgICAgID8gXCJyZWFjdC1zZWxlY3RvclwiXG4gICAgICAgICAgICAgIDogXCJyZWFjdC1yZW5kZXJcIlxuICAgICAgICBjb25zdCBsYXN0ID1cbiAgICAgICAgICBldmVudC50eXBlID09PSBcInRyYWNlOnJlYWN0LXJlbmRlclwiID8gbGFzdFR4bkJ5SW5zdGFuY2UuZ2V0KGluc3RhbmNlSWQpIDogdW5kZWZpbmVkXG4gICAgICAgIGNvbnN0IHR4bklkQWxpZ25lZCA9IGJhc2UudHhuSWQgPz8gbGFzdD8udHhuSWRcbiAgICAgICAgY29uc3QgdHhuU2VxQWxpZ25lZCA9IGJhc2UudHhuU2VxID4gMCA/IGJhc2UudHhuU2VxIDogKGxhc3Q/LnR4blNlcSA/PyBiYXNlLnR4blNlcSlcbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAgdHhuSWQ6IHR4bklkQWxpZ25lZCxcbiAgICAgICAgICB0eG5TZXE6IHR4blNlcUFsaWduZWQsXG4gICAgICAgICAga2luZDogZXZlbnQudHlwZSA9PT0gXCJ0cmFjZTpyZWFjdC1zZWxlY3RvclwiID8gXCJyZWFjdC1zZWxlY3RvclwiIDogXCJyZWFjdC1yZW5kZXJcIixcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6dHJhaXQ6Y29udmVyZ2VcdUZGMUFcdTY1MzZcdTY1NUJcdThCQzFcdTYzNkVcdTVGQzVcdTk4N0JcdTUzRUZcdTVCRkNcdTUxRkFcdUZGMDhKc29uVmFsdWUgXHU3ODZDXHU5NUU4XHVGRjA5XHVGRjBDXHU1RTc2XHU1NzI4IGxpZ2h0IFx1Njg2M1x1NEY0RFx1ODhDMVx1NTI2QVx1OTFDRFx1NUI1N1x1NkJCNVx1MzAwMlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwidHJhY2U6dHJhaXQ6Y29udmVyZ2VcIikge1xuICAgICAgICBjb25zdCBzdHJpcEhlYXZ5ID0gKHZhbHVlOiBKc29uVmFsdWUpOiBKc29uVmFsdWUgPT4ge1xuICAgICAgICAgIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWVcblxuICAgICAgICAgIGNvbnN0IGFueVZhbHVlID0gdmFsdWUgYXMgYW55XG4gICAgICAgICAgY29uc3QgZGlydHkgPSBhbnlWYWx1ZS5kaXJ0eVxuICAgICAgICAgIGNvbnN0IGRpcnR5U2xpbSA9XG4gICAgICAgICAgICBkaXJ0eSAmJiB0eXBlb2YgZGlydHkgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZGlydHkpXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgZGlydHlBbGw6IChkaXJ0eSBhcyBhbnkpLmRpcnR5QWxsLFxuICAgICAgICAgICAgICAgICAgLi4uKHR5cGVvZiAoZGlydHkgYXMgYW55KS5yZWFzb24gPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgPyB7IHJlYXNvbjogKGRpcnR5IGFzIGFueSkucmVhc29uIH1cbiAgICAgICAgICAgICAgICAgICAgOiBudWxsKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgICAgICBjb25zdCB7IHRvcDMsIGRpcnR5Um9vdHMsIC4uLnJlc3QgfSA9IGFueVZhbHVlXG4gICAgICAgICAgcmV0dXJuIChkaXJ0eVNsaW0gPyB7IC4uLnJlc3QsIGRpcnR5OiBkaXJ0eVNsaW0gfSA6IHJlc3QpIGFzIEpzb25WYWx1ZVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IChldmVudCBhcyBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6IFwidHJhY2U6dHJhaXQ6Y29udmVyZ2VcIiB9PikuZGF0YVxuICAgICAgICBjb25zdCBtZXRhSW5wdXQgPSBkaWFnbm9zdGljc0xldmVsID09PSBcImxpZ2h0XCIgPyBzdHJpcEhlYXZ5KGRhdGEpIDogZGF0YVxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogXCJ0cmFpdDpjb252ZXJnZVwiLFxuICAgICAgICAgIGxhYmVsOiBcInRyYWl0OmNvbnZlcmdlXCIsXG4gICAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIHRyYWNlOnRyYWl0OmNoZWNrXHVGRjFBXHU2ODIxXHU5QThDXHU4QkNBXHU2NUFEXHU1RkM1XHU5ODdCXHU1M0VGXHU1QkZDXHU1MUZBXHVGRjBDXHU1RTc2XHU1NzI4IGxpZ2h0IFx1Njg2M1x1NEY0RFx1NEZERFx1NjMwMSBTbGltXHVGRjA4XHU0RTBEXHU0RTIyXHU1MTczXHU5NTJFXHU1QjU3XHU2QkI1XHVGRjA5XHUzMDAyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJ0cmFjZTp0cmFpdDpjaGVja1wiKSB7XG4gICAgICAgIGNvbnN0IHN0cmlwSGVhdnkgPSAodmFsdWU6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSA9PiB7XG4gICAgICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZVxuICAgICAgICAgIGNvbnN0IGFueVZhbHVlID0gdmFsdWUgYXMgYW55XG4gICAgICAgICAgY29uc3QgZGVncmFkZWQgPSBhbnlWYWx1ZS5kZWdyYWRlZFxuICAgICAgICAgIGNvbnN0IGRlZ3JhZGVkU2xpbSA9XG4gICAgICAgICAgICBkZWdyYWRlZCAmJiB0eXBlb2YgZGVncmFkZWQgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZGVncmFkZWQpXG4gICAgICAgICAgICAgID8geyBraW5kOiAoZGVncmFkZWQgYXMgYW55KS5raW5kIH1cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgICAgIGNvbnN0IHsgZGVncmFkZWQ6IF9kZWdyYWRlZCwgLi4ucmVzdCB9ID0gYW55VmFsdWVcbiAgICAgICAgICByZXR1cm4gKGRlZ3JhZGVkU2xpbSA/IHsgLi4ucmVzdCwgZGVncmFkZWQ6IGRlZ3JhZGVkU2xpbSB9IDogcmVzdCkgYXMgSnNvblZhbHVlXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0gKGV2ZW50IGFzIEV4dHJhY3Q8RXZlbnQsIHsgcmVhZG9ubHkgdHlwZTogXCJ0cmFjZTp0cmFpdDpjaGVja1wiIH0+KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9IGRpYWdub3N0aWNzTGV2ZWwgPT09IFwibGlnaHRcIiA/IHN0cmlwSGVhdnkoZGF0YSkgOiBkYXRhXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiBcInRyYWl0OmNoZWNrXCIsXG4gICAgICAgICAgbGFiZWw6IFwidHJhaXQ6Y2hlY2tcIixcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6dHJhaXQ6dmFsaWRhdGVcdUZGMUFcdTY4MjFcdTlBOENcdTUxQjNcdTdCNTZcdTY0NThcdTg5ODFcdTVGQzVcdTk4N0JcdTUzRUZcdTVCRkNcdTUxRkFcdUZGMENcdTRFMTRcdTU3MjggbGlnaHQgXHU2ODYzXHU0RjREXHU0RkREXHU2MzAxIFNsaW1cdUZGMDhcdTlFRDhcdThCQTRcdTRFMERcdTY0M0FcdTVFMjZcdTkxQ0RcdTVCNTdcdTZCQjVcdUZGMDlcdTMwMDJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBcInRyYWNlOnRyYWl0OnZhbGlkYXRlXCIpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IChldmVudCBhcyBFeHRyYWN0PEV2ZW50LCB7IHJlYWRvbmx5IHR5cGU6IFwidHJhY2U6dHJhaXQ6dmFsaWRhdGVcIiB9PikuZGF0YVxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUoZGF0YSlcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGtpbmQ6IFwidHJhaXQ6dmFsaWRhdGVcIixcbiAgICAgICAgICBsYWJlbDogXCJ0cmFpdDp2YWxpZGF0ZVwiLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTptb2R1bGU6dHJhaXRzXHVGRjFBdHJhaXRzIFx1NjcwMFx1N0VDOFx1NUZFQlx1NzE2N1x1NUZDNVx1OTg3Qlx1NTNFRlx1NUJGQ1x1NTFGQVx1RkYwQ1x1NUU3Nlx1NTcyOCBsaWdodCBcdTY4NjNcdTRGNERcdTRGRERcdTYzMDEgU2xpbVx1RkYwOGRpZ2VzdC9jb3VudFx1RkYwOVx1MzAwMlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwidHJhY2U6bW9kdWxlOnRyYWl0c1wiKSB7XG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IChldmVudCBhcyBhbnkpLmRhdGFcbiAgICAgICAgY29uc3QgbWV0YUlucHV0ID1cbiAgICAgICAgICBkaWFnbm9zdGljc0xldmVsID09PSBcImxpZ2h0XCJcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIGRpZ2VzdDogZGF0YT8uZGlnZXN0LFxuICAgICAgICAgICAgICAgIGNvdW50OiBkYXRhPy5jb3VudCxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgZGlnZXN0OiBkYXRhPy5kaWdlc3QsXG4gICAgICAgICAgICAgICAgY291bnQ6IGRhdGE/LmNvdW50LFxuICAgICAgICAgICAgICAgIHRyYWl0czogZGF0YT8udHJhaXRzLFxuICAgICAgICAgICAgICAgIHByb3ZlbmFuY2VJbmRleDogZGF0YT8ucHJvdmVuYW5jZUluZGV4LFxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKG1ldGFJbnB1dClcbiAgICAgICAgb3B0aW9ucz8ub25NZXRhUHJvamVjdGlvbj8uKHtcbiAgICAgICAgICBzdGF0czogbWV0YVByb2plY3Rpb24uc3RhdHMsXG4gICAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICAgIH0pXG4gICAgICAgIGRvd25ncmFkZSA9IG1lcmdlRG93bmdyYWRlKGRvd25ncmFkZSwgbWV0YVByb2plY3Rpb24uZG93bmdyYWRlKVxuXG4gICAgICAgIHJldHVybiB3aXRoRG93bmdyYWRlKHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGtpbmQ6IFwiZGV2dG9vbHNcIixcbiAgICAgICAgICBsYWJlbDogZXZlbnQudHlwZSxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gdHJhY2U6bW9kdWxlOnRyYWl0czpjb25mbGljdFx1RkYxQVx1NTFCMlx1N0E4MVx1N0VDNlx1ODI4Mlx1NUZDNVx1OTg3Qlx1NTNFRlx1NUJGQ1x1NTFGQVx1RkYwQ1x1OTA3Rlx1NTE0RFx1NEY5RFx1OEQ1NiBsaWZlY3ljbGU6ZXJyb3IgXHU3Njg0XHU2MjJBXHU2NUFEIG1lc3NhZ2VcdTMwMDJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBcInRyYWNlOm1vZHVsZTp0cmFpdHM6Y29uZmxpY3RcIikge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9XG4gICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCA9PT0gXCJsaWdodFwiXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBjb25mbGljdENvdW50OiBkYXRhPy5jb25mbGljdENvdW50LFxuICAgICAgICAgICAgICAgIHRyYWl0SWRzOiBkYXRhPy50cmFpdElkcyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgY29uZmxpY3RDb3VudDogZGF0YT8uY29uZmxpY3RDb3VudCxcbiAgICAgICAgICAgICAgICBjb25mbGljdHM6IGRhdGE/LmNvbmZsaWN0cyxcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBraW5kOiBcImRldnRvb2xzXCIsXG4gICAgICAgICAgbGFiZWw6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgbWV0YTogbWV0YVByb2plY3Rpb24udmFsdWUsXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIHRyYWNlOm1vZHVsZTpkZXNjcmlwdG9yXHVGRjFBXHU1NzI4IGxpZ2h0IFx1Njg2M1x1NEY0RFx1NEU1Rlx1NEZERFx1NzU1OVx1NTE3M1x1OTUyRVx1OTUxQVx1NzBCOVx1RkYwOFx1OTA3Rlx1NTE0RCBkYXRhIFx1ODhBQlx1NUI4Q1x1NTE2OFx1ODhDMVx1NTI2QVx1RkYwOVx1MzAwMlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwidHJhY2U6bW9kdWxlOmRlc2NyaXB0b3JcIikge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG4gICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9XG4gICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCA9PT0gXCJsaWdodFwiXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBpZDogZGF0YT8uaWQsXG4gICAgICAgICAgICAgICAgdHJhaXRzOiBkYXRhPy50cmFpdHMsXG4gICAgICAgICAgICAgICAgc291cmNlOiBkYXRhPy5zb3VyY2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogeyBkYXRhIH1cblxuICAgICAgICBjb25zdCBtZXRhUHJvamVjdGlvbiA9IHByb2plY3RKc29uVmFsdWUobWV0YUlucHV0KVxuICAgICAgICBvcHRpb25zPy5vbk1ldGFQcm9qZWN0aW9uPy4oe1xuICAgICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgICBkb3duZ3JhZGU6IG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSxcbiAgICAgICAgfSlcbiAgICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG5cbiAgICAgICAgcmV0dXJuIHdpdGhEb3duZ3JhZGUoe1xuICAgICAgICAgIC4uLmJhc2UsXG4gICAgICAgICAga2luZDogXCJkZXZ0b29sc1wiLFxuICAgICAgICAgIGxhYmVsOiBldmVudC50eXBlLFxuICAgICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyB0cmFjZTplZmZlY3RvcFx1RkYxQVx1NEZERFx1NzU1OSBTbGltIG9wIG1ldGFcdUZGMENcdTVFNzZcdTRGMThcdTUxNDhcdTRGN0ZcdTc1MjggRWZmZWN0T3AubWV0YS5tb2R1bGVJZFx1RkYwOFx1ODJFNVx1NUI1OFx1NTcyOFx1RkYwOVx1MzAwMlxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwidHJhY2U6ZWZmZWN0b3BcIikge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSAoZXZlbnQgYXMgYW55KS5kYXRhXG4gICAgICAgIGNvbnN0IG9wTWV0YTogYW55ID0gZGF0YT8ubWV0YVxuICAgICAgICBjb25zdCBvcEtpbmQgPSAoZGF0YT8ua2luZCA/PyBcInNlcnZpY2VcIikgYXMgUnVudGltZURlYnVnRXZlbnRLaW5kXG4gICAgICAgIGNvbnN0IGxhYmVsID0gdHlwZW9mIGRhdGE/Lm5hbWUgPT09IFwic3RyaW5nXCIgPyBkYXRhLm5hbWUgOiBcImVmZmVjdG9wXCJcbiAgICAgICAgY29uc3QgbW9kdWxlSWQyID0gdHlwZW9mIG9wTWV0YT8ubW9kdWxlSWQgPT09IFwic3RyaW5nXCIgPyBvcE1ldGEubW9kdWxlSWQgOiBtb2R1bGVJZFxuICAgICAgICBjb25zdCB0eG5JZDIgPSB0eXBlb2Ygb3BNZXRhPy50eG5JZCA9PT0gXCJzdHJpbmdcIiAmJiBvcE1ldGEudHhuSWQubGVuZ3RoID4gMCA/IG9wTWV0YS50eG5JZCA6IGJhc2UudHhuSWRcbiAgICAgICAgY29uc3QgdHhuU2VxMiA9XG4gICAgICAgICAgdHlwZW9mIG9wTWV0YT8udHhuU2VxID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZShvcE1ldGEudHhuU2VxKSAmJiBvcE1ldGEudHhuU2VxID49IDBcbiAgICAgICAgICAgID8gTWF0aC5mbG9vcihvcE1ldGEudHhuU2VxKVxuICAgICAgICAgICAgOiBiYXNlLnR4blNlcVxuXG4gICAgICAgIGNvbnN0IG1ldGFJbnB1dCA9XG4gICAgICAgICAgZGlhZ25vc3RpY3NMZXZlbCA9PT0gXCJsaWdodFwiXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBpZDogZGF0YT8uaWQsXG4gICAgICAgICAgICAgICAga2luZDogZGF0YT8ua2luZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBkYXRhPy5uYW1lLFxuICAgICAgICAgICAgICAgIG1ldGE6IG9wTWV0YSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgaWQ6IGRhdGE/LmlkLFxuICAgICAgICAgICAgICAgIGtpbmQ6IGRhdGE/LmtpbmQsXG4gICAgICAgICAgICAgICAgbmFtZTogZGF0YT8ubmFtZSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBkYXRhPy5wYXlsb2FkLFxuICAgICAgICAgICAgICAgIG1ldGE6IG9wTWV0YSxcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1ldGFQcm9qZWN0aW9uID0gcHJvamVjdEpzb25WYWx1ZShtZXRhSW5wdXQpXG4gICAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgICAgc3RhdHM6IG1ldGFQcm9qZWN0aW9uLnN0YXRzLFxuICAgICAgICAgIGRvd25ncmFkZTogbWV0YVByb2plY3Rpb24uZG93bmdyYWRlLFxuICAgICAgICB9KVxuICAgICAgICBkb3duZ3JhZGUgPSBtZXJnZURvd25ncmFkZShkb3duZ3JhZGUsIG1ldGFQcm9qZWN0aW9uLmRvd25ncmFkZSlcblxuICAgICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBtb2R1bGVJZDogbW9kdWxlSWQyLFxuICAgICAgICAgIHR4bklkOiB0eG5JZDIsXG4gICAgICAgICAgdHhuU2VxOiB0eG5TZXEyLFxuICAgICAgICAgIGtpbmQ6IG9wS2luZCxcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICBtZXRhOiBtZXRhUHJvamVjdGlvbi52YWx1ZSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gXHU1MTc2XHU0RUQ2IHRyYWNlOipcdUZGMUFcdTdFREZcdTRFMDBcdTVGNTJcdTdDN0JcdTRFM0EgZGV2dG9vbHNcdUZGMENcdTVFNzZcdTYzMDlcdTY4NjNcdTRGNERcdTg4QzFcdTUyNkEgbWV0YVx1MzAwMlxuICAgICAgY29uc3QgbWV0YVByb2plY3Rpb24gPSBwcm9qZWN0SnNvblZhbHVlKFxuICAgICAgICBkaWFnbm9zdGljc0xldmVsID09PSBcImxpZ2h0XCJcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBkYXRhOiAoZXZlbnQgYXMgYW55KS5kYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgIClcbiAgICAgIG9wdGlvbnM/Lm9uTWV0YVByb2plY3Rpb24/Lih7XG4gICAgICAgIHN0YXRzOiBtZXRhUHJvamVjdGlvbi5zdGF0cyxcbiAgICAgICAgZG93bmdyYWRlOiBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUsXG4gICAgICB9KVxuICAgICAgZG93bmdyYWRlID0gbWVyZ2VEb3duZ3JhZGUoZG93bmdyYWRlLCBtZXRhUHJvamVjdGlvbi5kb3duZ3JhZGUpXG4gICAgICByZXR1cm4gd2l0aERvd25ncmFkZSh7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIGtpbmQ6IFwiZGV2dG9vbHNcIixcbiAgICAgICAgbGFiZWw6IGV2ZW50LnR5cGUsXG4gICAgICAgIG1ldGE6IG1ldGFQcm9qZWN0aW9uLnZhbHVlLFxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDYXVzZSB9IGZyb20gXCJlZmZlY3RcIlxuXG5leHBvcnQgdHlwZSBEb3duZ3JhZGVSZWFzb24gPSBcIm5vbl9zZXJpYWxpemFibGVcIiB8IFwib3ZlcnNpemVkXCIgfCBcInVua25vd25cIlxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSB7XG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZ1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nXG4gIHJlYWRvbmx5IGNvZGU/OiBzdHJpbmdcbiAgcmVhZG9ubHkgaGludD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yU3VtbWFyeVJlc3VsdCB7XG4gIHJlYWRvbmx5IGVycm9yU3VtbWFyeTogU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5XG4gIHJlYWRvbmx5IGRvd25ncmFkZT86IERvd25ncmFkZVJlYXNvblxufVxuXG5jb25zdCB0cnVuY2F0ZSA9ICh2YWx1ZTogc3RyaW5nLCBtYXhMZW46IG51bWJlcik6IHsgcmVhZG9ubHkgdmFsdWU6IHN0cmluZzsgcmVhZG9ubHkgdHJ1bmNhdGVkOiBib29sZWFuIH0gPT4ge1xuICBpZiAodmFsdWUubGVuZ3RoIDw9IG1heExlbikgcmV0dXJuIHsgdmFsdWUsIHRydW5jYXRlZDogZmFsc2UgfVxuICByZXR1cm4geyB2YWx1ZTogdmFsdWUuc2xpY2UoMCwgbWF4TGVuKSwgdHJ1bmNhdGVkOiB0cnVlIH1cbn1cblxuY29uc3Qgc2FmZVN0cmluZ2lmeSA9ICh2YWx1ZTogdW5rbm93bik6IHsgcmVhZG9ubHkgb2s6IHRydWU7IHJlYWRvbmx5IGpzb246IHN0cmluZyB9IHwgeyByZWFkb25seSBvazogZmFsc2UgfSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgb2s6IHRydWUsIGpzb246IEpTT04uc3RyaW5naWZ5KHZhbHVlKSB9XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IG9rOiBmYWxzZSB9XG4gIH1cbn1cblxuY29uc3QgZ2V0TWVzc2FnZUZyb21Vbmtub3duID0gKGNhdXNlOiB1bmtub3duKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiBjYXVzZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGNhdXNlXG4gIGlmICh0eXBlb2YgY2F1c2UgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGNhdXNlID09PSBcImJvb2xlYW5cIiB8fCB0eXBlb2YgY2F1c2UgPT09IFwiYmlnaW50XCIpIHJldHVybiBTdHJpbmcoY2F1c2UpXG4gIGlmIChjYXVzZSBpbnN0YW5jZW9mIEVycm9yKSByZXR1cm4gY2F1c2UubWVzc2FnZSB8fCBjYXVzZS5uYW1lIHx8IFwiRXJyb3JcIlxuICBpZiAoY2F1c2UgJiYgdHlwZW9mIGNhdXNlID09PSBcIm9iamVjdFwiICYmIFwibWVzc2FnZVwiIGluIChjYXVzZSBhcyBhbnkpICYmIHR5cGVvZiAoY2F1c2UgYXMgYW55KS5tZXNzYWdlID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIChjYXVzZSBhcyBhbnkpLm1lc3NhZ2UgYXMgc3RyaW5nXG4gIH1cblxuICAvLyBUcnkgRWZmZWN0IENhdXNlIHByZXR0eSAoYmVzdC1lZmZvcnQpLiBUaGlzIG1heSBpbmNsdWRlIG1vcmUgZGV0YWlscyB0aGFuIG5lZWRlZCxcbiAgLy8gc28gY2FsbGVycyBNVVNUIHN0aWxsIHRyZWF0IGl0IGFzIGFuIHVudHJ1c3RlZC9vdmVyc2l6ZWQgc3RyaW5nIGFuZCB0cnVuY2F0ZS5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcmV0dHkgPSBDYXVzZS5wcmV0dHkoY2F1c2UgYXMgQ2F1c2UuQ2F1c2U8dW5rbm93bj4sIHsgcmVuZGVyRXJyb3JDYXVzZTogdHJ1ZSB9KVxuICAgIGlmICh0eXBlb2YgcHJldHR5ID09PSBcInN0cmluZ1wiICYmIHByZXR0eS5sZW5ndGggPiAwKSByZXR1cm4gcHJldHR5XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG5cbiAgcmV0dXJuIFwiVW5rbm93biBlcnJvclwiXG59XG5cbmV4cG9ydCBjb25zdCB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSA9IChcbiAgY2F1c2U6IHVua25vd24sXG4gIG9wdGlvbnM/OiB7XG4gICAgcmVhZG9ubHkgbWF4TWVzc2FnZUxlbmd0aD86IG51bWJlclxuICB9LFxuKTogRXJyb3JTdW1tYXJ5UmVzdWx0ID0+IHtcbiAgY29uc3QgbWF4TWVzc2FnZUxlbmd0aCA9IG9wdGlvbnM/Lm1heE1lc3NhZ2VMZW5ndGggPz8gMjU2XG5cbiAgY29uc3QgbWVzc2FnZVJhdyA9IGdldE1lc3NhZ2VGcm9tVW5rbm93bihjYXVzZSlcbiAgY29uc3QgeyB2YWx1ZTogbWVzc2FnZSwgdHJ1bmNhdGVkIH0gPSB0cnVuY2F0ZShtZXNzYWdlUmF3LCBtYXhNZXNzYWdlTGVuZ3RoKVxuXG4gIGNvbnN0IHN1bW1hcnk6IHsgbWVzc2FnZTogc3RyaW5nOyBuYW1lPzogc3RyaW5nOyBjb2RlPzogc3RyaW5nOyBoaW50Pzogc3RyaW5nIH0gPSB7XG4gICAgbWVzc2FnZSxcbiAgfVxuXG4gIGlmIChjYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgaWYgKGNhdXNlLm5hbWUgJiYgY2F1c2UubmFtZSAhPT0gXCJFcnJvclwiKSBzdW1tYXJ5Lm5hbWUgPSBjYXVzZS5uYW1lXG4gICAgY29uc3QgYW55Q2F1c2UgPSBjYXVzZSBhcyBhbnlcbiAgICBpZiAodHlwZW9mIGFueUNhdXNlLmNvZGUgPT09IFwic3RyaW5nXCIgJiYgYW55Q2F1c2UuY29kZS5sZW5ndGggPiAwKSBzdW1tYXJ5LmNvZGUgPSBhbnlDYXVzZS5jb2RlXG4gICAgZWxzZSBpZiAodHlwZW9mIGFueUNhdXNlLmNvZGUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKGFueUNhdXNlLmNvZGUpKSBzdW1tYXJ5LmNvZGUgPSBTdHJpbmcoYW55Q2F1c2UuY29kZSlcbiAgICBpZiAodHlwZW9mIGFueUNhdXNlLmhpbnQgPT09IFwic3RyaW5nXCIgJiYgYW55Q2F1c2UuaGludC5sZW5ndGggPiAwKSBzdW1tYXJ5LmhpbnQgPSBhbnlDYXVzZS5oaW50XG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yU3VtbWFyeTogc3VtbWFyeSxcbiAgICAgIGRvd25ncmFkZTogdHJ1bmNhdGVkID8gXCJvdmVyc2l6ZWRcIiA6IHVuZGVmaW5lZCxcbiAgICB9XG4gIH1cblxuICBpZiAoY2F1c2UgJiYgdHlwZW9mIGNhdXNlID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgYW55Q2F1c2UgPSBjYXVzZSBhcyBhbnlcbiAgICBpZiAodHlwZW9mIGFueUNhdXNlLm5hbWUgPT09IFwic3RyaW5nXCIgJiYgYW55Q2F1c2UubmFtZS5sZW5ndGggPiAwKSBzdW1tYXJ5Lm5hbWUgPSBhbnlDYXVzZS5uYW1lXG4gICAgaWYgKHR5cGVvZiBhbnlDYXVzZS5jb2RlID09PSBcInN0cmluZ1wiICYmIGFueUNhdXNlLmNvZGUubGVuZ3RoID4gMCkgc3VtbWFyeS5jb2RlID0gYW55Q2F1c2UuY29kZVxuICAgIGlmICh0eXBlb2YgYW55Q2F1c2UuaGludCA9PT0gXCJzdHJpbmdcIiAmJiBhbnlDYXVzZS5oaW50Lmxlbmd0aCA+IDApIHN1bW1hcnkuaGludCA9IGFueUNhdXNlLmhpbnRcbiAgfVxuXG4gIC8vIElmIHRoZSBvcmlnaW5hbCBjYXVzZSBpc24ndCBKU09OLXNlcmlhbGl6YWJsZSwgbWFyayBpdCBleHBsaWNpdGx5LlxuICBjb25zdCBzdHJpbmdpZnlSZXN1bHQgPSBzYWZlU3RyaW5naWZ5KGNhdXNlKVxuICBpZiAoIXN0cmluZ2lmeVJlc3VsdC5vaykge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvclN1bW1hcnk6IHN1bW1hcnksXG4gICAgICBkb3duZ3JhZGU6IFwibm9uX3NlcmlhbGl6YWJsZVwiLFxuICAgIH1cbiAgfVxuXG4gIGlmICh0cnVuY2F0ZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3JTdW1tYXJ5OiBzdW1tYXJ5LFxuICAgICAgZG93bmdyYWRlOiBcIm92ZXJzaXplZFwiLFxuICAgIH1cbiAgfVxuXG4gIGlmIChtZXNzYWdlID09PSBcIlVua25vd24gZXJyb3JcIikge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvclN1bW1hcnk6IHN1bW1hcnksXG4gICAgICBkb3duZ3JhZGU6IFwidW5rbm93blwiLFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGVycm9yU3VtbWFyeTogc3VtbWFyeSB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBQUEsU0FBUyxTQUFBQSxRQUFPLFFBQVEsVUFBVSxPQUFPLGNBQWM7OztBQ0F2RCxTQUFTLGFBQWE7QUFnQnRCLElBQU0sV0FBVyxDQUFDLE9BQWUsV0FBNEU7QUFDM0csTUFBSSxNQUFNLFVBQVUsT0FBUSxRQUFPLEVBQUUsT0FBTyxXQUFXLE1BQU07QUFDN0QsU0FBTyxFQUFFLE9BQU8sTUFBTSxNQUFNLEdBQUcsTUFBTSxHQUFHLFdBQVcsS0FBSztBQUMxRDtBQUVBLElBQU0sZ0JBQWdCLENBQUMsVUFBMEY7QUFDL0csTUFBSTtBQUNGLFdBQU8sRUFBRSxJQUFJLE1BQU0sTUFBTSxLQUFLLFVBQVUsS0FBSyxFQUFFO0FBQUEsRUFDakQsUUFBUTtBQUNOLFdBQU8sRUFBRSxJQUFJLE1BQU07QUFBQSxFQUNyQjtBQUNGO0FBRUEsSUFBTSx3QkFBd0IsQ0FBQyxVQUEyQjtBQUN4RCxNQUFJLE9BQU8sVUFBVSxTQUFVLFFBQU87QUFDdEMsTUFBSSxPQUFPLFVBQVUsWUFBWSxPQUFPLFVBQVUsYUFBYSxPQUFPLFVBQVUsU0FBVSxRQUFPLE9BQU8sS0FBSztBQUM3RyxNQUFJLGlCQUFpQixNQUFPLFFBQU8sTUFBTSxXQUFXLE1BQU0sUUFBUTtBQUNsRSxNQUFJLFNBQVMsT0FBTyxVQUFVLFlBQVksYUFBYyxTQUFpQixPQUFRLE1BQWMsWUFBWSxVQUFVO0FBQ25ILFdBQVEsTUFBYztBQUFBLEVBQ3hCO0FBSUEsTUFBSTtBQUNGLFVBQU0sU0FBUyxNQUFNLE9BQU8sT0FBK0IsRUFBRSxrQkFBa0IsS0FBSyxDQUFDO0FBQ3JGLFFBQUksT0FBTyxXQUFXLFlBQVksT0FBTyxTQUFTLEVBQUcsUUFBTztBQUFBLEVBQzlELFFBQVE7QUFBQSxFQUVSO0FBRUEsU0FBTztBQUNUO0FBRU8sSUFBTSw2QkFBNkIsQ0FD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