@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,1140 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ Snapshot,
5
+ internal,
6
+ keyHash
7
+ } from "./chunk-LIYPPU6I.js";
8
+ import {
9
+ ReplayLog,
10
+ getAtPath,
11
+ parseListItemFieldPath,
12
+ setAtPathMutating,
13
+ toListItemValuePath
14
+ } from "./chunk-PHV4HYHB.js";
15
+ import {
16
+ create
17
+ } from "./chunk-Y5I45PEB.js";
18
+ import {
19
+ forceSourceRefresh,
20
+ inSyncTransactionFiber
21
+ } from "./chunk-LYBBX6WM.js";
22
+ import {
23
+ getBoundInternals
24
+ } from "./chunk-6FKWRVP4.js";
25
+ import {
26
+ ReplayModeConfigTag,
27
+ isDevEnv
28
+ } from "./chunk-GP37MEGJ.js";
29
+ import {
30
+ record
31
+ } from "./chunk-4KIYG5E4.js";
32
+ import {
33
+ EffectOpMiddlewareTag,
34
+ RunSessionTag,
35
+ make,
36
+ run
37
+ } from "./chunk-O57OZBDR.js";
38
+
39
+ // ../logix-core/src/internal/state-trait/source.ts
40
+ import { Effect, Fiber, FiberRef, Option } from "../effect.js";
41
+
42
+ // ../logix-core/src/internal/state-trait/deps-trace.ts
43
+ var isTraceableObject = (value) => {
44
+ if (!value || typeof value !== "object") return false;
45
+ if (Array.isArray(value)) return true;
46
+ if (value instanceof Date) return false;
47
+ if (value instanceof RegExp) return false;
48
+ if (value instanceof Error) return false;
49
+ if (value instanceof Map) return false;
50
+ if (value instanceof Set) return false;
51
+ if (value instanceof WeakMap) return false;
52
+ if (value instanceof WeakSet) return false;
53
+ return true;
54
+ };
55
+ var shouldIgnoreKey = (key) => key === "__proto__" || key === "prototype" || key === "constructor";
56
+ var normalizeReads = (reads) => {
57
+ const all = Array.from(reads).filter((p) => typeof p === "string" && p.length > 0);
58
+ all.sort();
59
+ const isPrefix = (prefix, full) => full !== prefix && full.startsWith(prefix + ".");
60
+ const pruned = [];
61
+ for (const p of all) {
62
+ let hasMoreSpecific = false;
63
+ for (const other of all) {
64
+ if (isPrefix(p, other)) {
65
+ hasMoreSpecific = true;
66
+ break;
67
+ }
68
+ }
69
+ if (!hasMoreSpecific) {
70
+ pruned.push(p);
71
+ }
72
+ }
73
+ pruned.sort();
74
+ return pruned;
75
+ };
76
+ var covers = (declared, read) => declared === read || read.startsWith(declared + ".");
77
+ var diffDeps = (declared, reads) => {
78
+ const declaredList = Array.from(new Set(declared)).filter((p) => typeof p === "string" && p.length > 0);
79
+ declaredList.sort();
80
+ const readList = Array.from(new Set(reads)).filter((p) => typeof p === "string" && p.length > 0);
81
+ readList.sort();
82
+ const missing = readList.filter((r) => declaredList.every((d) => !covers(d, r)));
83
+ const unused = declaredList.filter((d) => readList.every((r) => !covers(d, r)));
84
+ if (missing.length === 0 && unused.length === 0) return void 0;
85
+ return {
86
+ reads: readList,
87
+ declared: declaredList,
88
+ missing,
89
+ unused
90
+ };
91
+ };
92
+ var trace = (fn, state) => {
93
+ if (!isTraceableObject(state)) {
94
+ return { value: fn(state), reads: [] };
95
+ }
96
+ const reads = /* @__PURE__ */ new Set();
97
+ const proxyCache = /* @__PURE__ */ new WeakMap();
98
+ const proxyToTarget = /* @__PURE__ */ new WeakMap();
99
+ const wrap = (value2, path) => {
100
+ if (!isTraceableObject(value2)) return value2;
101
+ return getProxy(value2, path);
102
+ };
103
+ const unwrap = (value2) => {
104
+ if (value2 && (typeof value2 === "object" || typeof value2 === "function")) {
105
+ const target = proxyToTarget.get(value2);
106
+ if (target) return target;
107
+ }
108
+ return value2;
109
+ };
110
+ const getProxy = (target, basePath) => {
111
+ let byPath = proxyCache.get(target);
112
+ if (!byPath) {
113
+ byPath = /* @__PURE__ */ new Map();
114
+ proxyCache.set(target, byPath);
115
+ }
116
+ const cached = byPath.get(basePath);
117
+ if (cached) return cached;
118
+ const record2 = (path) => {
119
+ if (path) reads.add(path);
120
+ };
121
+ const proxy = new Proxy(target, {
122
+ get: (t, prop, receiver) => {
123
+ if (typeof prop === "symbol") {
124
+ return Reflect.get(t, prop, receiver);
125
+ }
126
+ const key = String(prop);
127
+ if (shouldIgnoreKey(key)) {
128
+ return Reflect.get(t, prop, receiver);
129
+ }
130
+ const nextPath = basePath ? `${basePath}.${key}` : key;
131
+ record2(nextPath);
132
+ const value2 = Reflect.get(t, prop, receiver);
133
+ return wrap(value2, nextPath);
134
+ },
135
+ has: (t, prop) => {
136
+ if (typeof prop === "symbol") return Reflect.has(t, prop);
137
+ const key = String(prop);
138
+ if (!shouldIgnoreKey(key)) {
139
+ const nextPath = basePath ? `${basePath}.${key}` : key;
140
+ record2(nextPath);
141
+ }
142
+ return Reflect.has(t, prop);
143
+ },
144
+ ownKeys: (t) => {
145
+ if (basePath) record2(basePath);
146
+ return Reflect.ownKeys(t);
147
+ },
148
+ getOwnPropertyDescriptor: (t, prop) => {
149
+ if (typeof prop === "symbol") {
150
+ return Reflect.getOwnPropertyDescriptor(t, prop);
151
+ }
152
+ const key = String(prop);
153
+ if (!shouldIgnoreKey(key)) {
154
+ const nextPath = basePath ? `${basePath}.${key}` : key;
155
+ record2(nextPath);
156
+ }
157
+ return Reflect.getOwnPropertyDescriptor(t, prop);
158
+ },
159
+ set: () => {
160
+ throw new Error(
161
+ "[deps-trace] Attempted to mutate state during deps tracing (state is readonly in dev-mode diagnostics)."
162
+ );
163
+ },
164
+ defineProperty: () => {
165
+ throw new Error(
166
+ "[deps-trace] Attempted to define property on state during deps tracing (state is readonly in dev-mode diagnostics)."
167
+ );
168
+ },
169
+ deleteProperty: () => {
170
+ throw new Error(
171
+ "[deps-trace] Attempted to delete property on state during deps tracing (state is readonly in dev-mode diagnostics)."
172
+ );
173
+ }
174
+ });
175
+ byPath.set(basePath, proxy);
176
+ proxyToTarget.set(proxy, target);
177
+ return proxy;
178
+ };
179
+ const root = getProxy(state, "");
180
+ const value = unwrap(fn(root));
181
+ return {
182
+ value,
183
+ reads: normalizeReads(reads)
184
+ };
185
+ };
186
+
187
+ // ../logix-core/src/internal/state-trait/source.ts
188
+ var makePatch = (path, from, to, reason, stepId) => ({
189
+ path,
190
+ from,
191
+ to,
192
+ reason,
193
+ stepId
194
+ });
195
+ var onceInRunSession = (key) => Effect.serviceOption(RunSessionTag).pipe(
196
+ Effect.map(
197
+ (maybe) => Option.isSome(maybe) ? maybe.value.local.once(key) : true
198
+ )
199
+ );
200
+ var formatList = (items, limit = 10) => {
201
+ if (items.length === 0) return "";
202
+ if (items.length <= limit) return items.join(", ");
203
+ return `${items.slice(0, limit).join(", ")}, \u2026(+${items.length - limit})`;
204
+ };
205
+ var emitDepsMismatch = (params) => Effect.gen(function* () {
206
+ const key = `${params.instanceId ?? "unknown"}::${params.kind}::${params.fieldPath}`;
207
+ const shouldEmit = yield* onceInRunSession(`deps_mismatch:${key}`);
208
+ if (!shouldEmit) return;
209
+ yield* record({
210
+ type: "diagnostic",
211
+ moduleId: params.moduleId,
212
+ instanceId: params.instanceId,
213
+ code: "state_trait::deps_mismatch",
214
+ severity: "warning",
215
+ message: `[deps] ${params.kind} "${params.fieldPath}" declared=[${formatList(params.diff.declared)}] reads=[${formatList(params.diff.reads)}] missing=[${formatList(params.diff.missing)}] unused=[${formatList(params.diff.unused)}]`,
216
+ hint: 'deps is the single source of truth for dependencies: incremental scheduling / reverse closures / performance optimizations rely on deps only. Keep deps consistent with actual reads; if you really depend on the whole object, declare a coarser-grained dep (e.g. "profile") to cover sub-field reads.',
217
+ kind: `deps_mismatch:${params.kind}`
218
+ });
219
+ });
220
+ var getMiddlewareStack = () => Effect.serviceOption(EffectOpMiddlewareTag).pipe(
221
+ Effect.map(
222
+ (maybe) => Option.isSome(maybe) ? maybe.value.stack : []
223
+ )
224
+ );
225
+ var recordTraitPatch = (bound, patch) => {
226
+ try {
227
+ const internals = getBoundInternals(bound);
228
+ internals.txn.recordStatePatch(patch);
229
+ } catch {
230
+ }
231
+ };
232
+ var recordReplayEvent = (bound, event) => {
233
+ try {
234
+ const internals = getBoundInternals(bound);
235
+ internals.txn.recordReplayEvent(event);
236
+ } catch {
237
+ }
238
+ };
239
+ var getBoundScope = (bound) => {
240
+ try {
241
+ const internals = getBoundInternals(bound);
242
+ return { moduleId: internals.moduleId, instanceId: internals.instanceId };
243
+ } catch {
244
+ return { moduleId: void 0, instanceId: void 0 };
245
+ }
246
+ };
247
+ var setSnapshotInTxn = (bound, fieldPath, next, reason, stepId, traitNodeId) => Effect.gen(function* () {
248
+ let wrote = false;
249
+ yield* bound.state.mutate((draft) => {
250
+ const prev = getAtPath(draft, fieldPath);
251
+ if (Object.is(prev, next)) return;
252
+ wrote = true;
253
+ setAtPathMutating(draft, fieldPath, next);
254
+ recordTraitPatch(bound, {
255
+ path: fieldPath,
256
+ from: prev,
257
+ to: next,
258
+ reason,
259
+ stepId,
260
+ traitNodeId
261
+ });
262
+ });
263
+ return wrote;
264
+ });
265
+ var writebackIfCurrentKeyHash = (bound, fieldPath, keyHash2, next, reason, stepId, traitNodeId, replayEvent) => Effect.gen(function* () {
266
+ let wrote = false;
267
+ yield* bound.state.mutate((draft) => {
268
+ const current = getAtPath(draft, fieldPath);
269
+ const currentKeyHash = current && typeof current === "object" ? current.keyHash : void 0;
270
+ if (currentKeyHash !== keyHash2) return;
271
+ const prev = current;
272
+ if (Object.is(prev, next)) return;
273
+ wrote = true;
274
+ setAtPathMutating(draft, fieldPath, next);
275
+ if (replayEvent) {
276
+ recordReplayEvent(bound, replayEvent);
277
+ }
278
+ recordTraitPatch(bound, {
279
+ path: fieldPath,
280
+ from: prev,
281
+ to: next,
282
+ reason,
283
+ stepId,
284
+ traitNodeId
285
+ });
286
+ });
287
+ return wrote;
288
+ });
289
+ var syncIdleInTransaction = (program, ctx) => Effect.sync(() => {
290
+ const draft = ctx.getDraft();
291
+ const updates = [];
292
+ for (const entry of program.entries) {
293
+ if (entry.kind !== "source") continue;
294
+ const fieldPath = entry.fieldPath;
295
+ const listItem = parseListItemFieldPath(fieldPath);
296
+ if (listItem) {
297
+ const listValue = getAtPath(draft, listItem.listPath);
298
+ const items = Array.isArray(listValue) ? listValue : [];
299
+ for (let index = 0; index < items.length; index++) {
300
+ const item = items[index];
301
+ let key2;
302
+ try {
303
+ key2 = entry.meta.key(item);
304
+ } catch {
305
+ continue;
306
+ }
307
+ if (key2 !== void 0) continue;
308
+ const concretePath = toListItemValuePath(
309
+ listItem.listPath,
310
+ index,
311
+ listItem.itemPath
312
+ );
313
+ const prev2 = getAtPath(draft, concretePath);
314
+ const prevStatus2 = prev2 && typeof prev2 === "object" ? prev2.status : void 0;
315
+ if (prevStatus2 === "idle") {
316
+ const data = prev2?.data;
317
+ const error = prev2?.error;
318
+ if (data === void 0 && error === void 0) {
319
+ continue;
320
+ }
321
+ }
322
+ updates.push({ fieldPath: concretePath, prev: prev2 });
323
+ }
324
+ continue;
325
+ }
326
+ let key;
327
+ try {
328
+ key = entry.meta.key(draft);
329
+ } catch {
330
+ continue;
331
+ }
332
+ if (key !== void 0) continue;
333
+ const prev = getAtPath(draft, fieldPath);
334
+ const prevStatus = prev && typeof prev === "object" ? prev.status : void 0;
335
+ if (prevStatus === "idle") {
336
+ const data = prev?.data;
337
+ const error = prev?.error;
338
+ if (data === void 0 && error === void 0) {
339
+ continue;
340
+ }
341
+ }
342
+ updates.push({ fieldPath, prev });
343
+ }
344
+ if (updates.length === 0) return;
345
+ const reason = "source:idle";
346
+ const nextDraft = create(draft, (next) => {
347
+ for (const u of updates) {
348
+ setAtPathMutating(next, u.fieldPath, Snapshot.idle());
349
+ }
350
+ });
351
+ ctx.setDraft(nextDraft);
352
+ for (const u of updates) {
353
+ ctx.recordPatch(
354
+ makePatch(
355
+ u.fieldPath,
356
+ u.prev,
357
+ Snapshot.idle(),
358
+ reason,
359
+ `source:${u.fieldPath}:idle`
360
+ )
361
+ );
362
+ }
363
+ });
364
+ var installSourceRefresh = (bound, step, entry) => {
365
+ if (!step.targetFieldPath) return Effect.void;
366
+ const fieldPath = step.targetFieldPath;
367
+ const resourceId = step.resourceId ?? entry.meta.resource;
368
+ const listItem = parseListItemFieldPath(fieldPath);
369
+ let internals;
370
+ try {
371
+ internals = getBoundInternals(bound);
372
+ } catch {
373
+ return Effect.void;
374
+ }
375
+ const register = internals.traits.registerSourceRefresh;
376
+ const recordSnapshot = (replayMode, replayLog, input) => {
377
+ if (!replayLog) return Effect.void;
378
+ if (replayMode !== "live") return Effect.void;
379
+ const event = input && typeof input === "object" && input._tag === "ResourceSnapshot" ? input : {
380
+ _tag: "ResourceSnapshot",
381
+ resourceId,
382
+ fieldPath: input.fieldPath,
383
+ keyHash: input.keyHash,
384
+ concurrency: input.concurrency,
385
+ phase: input.phase,
386
+ snapshot: input.snapshot,
387
+ timestamp: Date.now(),
388
+ moduleId: input.moduleId,
389
+ instanceId: input.instanceId
390
+ };
391
+ return replayLog.record(event);
392
+ };
393
+ if (listItem) {
394
+ const store = internals.traits.rowIdStore;
395
+ if (!store) {
396
+ return Effect.void;
397
+ }
398
+ const listPath = listItem.listPath;
399
+ const itemPath = listItem.itemPath;
400
+ if (!itemPath) {
401
+ return Effect.void;
402
+ }
403
+ const concurrency2 = entry.meta.concurrency;
404
+ const mode2 = concurrency2 ?? "switch";
405
+ const inFlight2 = /* @__PURE__ */ new Map();
406
+ const trailing2 = /* @__PURE__ */ new Map();
407
+ let gen2 = 0;
408
+ store.onRemoved(listPath, (rowId) => {
409
+ trailing2.delete(rowId);
410
+ inFlight2.delete(rowId);
411
+ });
412
+ const setSnapshotForRowInTxn = (rowId, next, reason, stepId) => Effect.gen(function* () {
413
+ let wrotePath;
414
+ yield* bound.state.mutate((draft) => {
415
+ const index = store.getIndex(listPath, rowId);
416
+ if (index === void 0) return;
417
+ const concretePath = toListItemValuePath(listPath, index, itemPath);
418
+ const prev = getAtPath(draft, concretePath);
419
+ if (Object.is(prev, next)) return;
420
+ wrotePath = concretePath;
421
+ setAtPathMutating(draft, concretePath, next);
422
+ recordTraitPatch(bound, {
423
+ path: concretePath,
424
+ from: prev,
425
+ to: next,
426
+ reason,
427
+ stepId,
428
+ traitNodeId: step.debugInfo?.graphNodeId
429
+ });
430
+ });
431
+ return wrotePath;
432
+ });
433
+ const writebackIfCurrentKeyHashForRow = (rowId, keyHash2, next, reason, stepId, phase) => Effect.gen(function* () {
434
+ let wrotePath;
435
+ yield* bound.state.mutate((draft) => {
436
+ const index = store.getIndex(listPath, rowId);
437
+ if (index === void 0) return;
438
+ const concretePath = toListItemValuePath(listPath, index, itemPath);
439
+ const current = getAtPath(draft, concretePath);
440
+ const currentKeyHash = current && typeof current === "object" ? current.keyHash : void 0;
441
+ if (currentKeyHash !== keyHash2) return;
442
+ const prev = current;
443
+ if (Object.is(prev, next)) return;
444
+ wrotePath = concretePath;
445
+ setAtPathMutating(draft, concretePath, next);
446
+ if (phase) {
447
+ const { moduleId, instanceId } = getBoundScope(bound);
448
+ recordReplayEvent(bound, {
449
+ _tag: "ResourceSnapshot",
450
+ resourceId,
451
+ fieldPath: concretePath,
452
+ keyHash: keyHash2,
453
+ concurrency: mode2,
454
+ phase,
455
+ snapshot: next,
456
+ timestamp: Date.now(),
457
+ moduleId,
458
+ instanceId
459
+ });
460
+ }
461
+ recordTraitPatch(bound, {
462
+ path: concretePath,
463
+ from: prev,
464
+ to: next,
465
+ reason,
466
+ stepId,
467
+ traitNodeId: step.debugInfo?.graphNodeId
468
+ });
469
+ });
470
+ return wrotePath;
471
+ });
472
+ const startFetch2 = (rowId, key, keyHash2, replayMode, replayLog) => Effect.gen(function* () {
473
+ const { moduleId, instanceId } = getBoundScope(bound);
474
+ const indexForLog = store.getIndex(listPath, rowId);
475
+ const logFieldPath = indexForLog === void 0 ? void 0 : toListItemValuePath(listPath, indexForLog, itemPath);
476
+ let loadingSnapshot = Snapshot.loading({ keyHash: keyHash2 });
477
+ if (replayMode === "replay" && replayLog && logFieldPath) {
478
+ const replayLoading = yield* replayLog.consumeNextResourceSnapshot({
479
+ resourceId,
480
+ fieldPath: logFieldPath,
481
+ keyHash: keyHash2,
482
+ phase: "loading"
483
+ });
484
+ if (replayLoading) {
485
+ loadingSnapshot = replayLoading.snapshot;
486
+ }
487
+ }
488
+ const wroteLoadingPath = yield* setSnapshotForRowInTxn(
489
+ rowId,
490
+ loadingSnapshot,
491
+ "source:loading",
492
+ `source:${fieldPath}:${rowId}:loading`
493
+ );
494
+ if (wroteLoadingPath) {
495
+ const event = {
496
+ _tag: "ResourceSnapshot",
497
+ resourceId,
498
+ fieldPath: wroteLoadingPath,
499
+ keyHash: keyHash2,
500
+ concurrency: mode2,
501
+ phase: "loading",
502
+ snapshot: loadingSnapshot,
503
+ timestamp: Date.now(),
504
+ moduleId,
505
+ instanceId
506
+ };
507
+ recordReplayEvent(bound, event);
508
+ yield* recordSnapshot(replayMode, replayLog, event);
509
+ }
510
+ const io = Effect.gen(function* () {
511
+ if (replayMode === "replay" && replayLog) {
512
+ yield* Effect.yieldNow();
513
+ const consumePath = wroteLoadingPath ?? logFieldPath;
514
+ if (!consumePath) return yield* Effect.void;
515
+ const replayed = yield* replayLog.consumeNextResourceSnapshot({
516
+ resourceId,
517
+ fieldPath: consumePath,
518
+ keyHash: keyHash2
519
+ });
520
+ if (!replayed) return yield* Effect.void;
521
+ if (replayed.phase === "success") {
522
+ yield* writebackIfCurrentKeyHashForRow(
523
+ rowId,
524
+ keyHash2,
525
+ replayed.snapshot,
526
+ "source:success",
527
+ `source:${fieldPath}:${rowId}:success`,
528
+ "success"
529
+ );
530
+ } else if (replayed.phase === "error") {
531
+ yield* writebackIfCurrentKeyHashForRow(
532
+ rowId,
533
+ keyHash2,
534
+ replayed.snapshot,
535
+ "source:error",
536
+ `source:${fieldPath}:${rowId}:error`,
537
+ "error"
538
+ );
539
+ }
540
+ return yield* Effect.void;
541
+ }
542
+ const stack = yield* getMiddlewareStack();
543
+ const registryOpt = yield* Effect.serviceOption(internal.ResourceRegistryTag);
544
+ const registry = Option.isSome(registryOpt) ? registryOpt.value : void 0;
545
+ const spec = registry?.specs.get(resourceId);
546
+ if (!spec) {
547
+ return yield* Effect.void;
548
+ }
549
+ const loadEffect = spec.load(key);
550
+ const meta = {
551
+ moduleId,
552
+ instanceId,
553
+ fieldPath,
554
+ resourceId,
555
+ key,
556
+ keyHash: keyHash2,
557
+ rowId,
558
+ traitNodeId: step.debugInfo?.graphNodeId,
559
+ stepId: step.id
560
+ };
561
+ if (!(typeof meta.opSeq === "number" && Number.isFinite(meta.opSeq))) {
562
+ const sessionOpt = yield* Effect.serviceOption(RunSessionTag);
563
+ if (Option.isSome(sessionOpt)) {
564
+ const seqKey = instanceId ?? "global";
565
+ meta.opSeq = sessionOpt.value.local.nextSeq("opSeq", seqKey);
566
+ }
567
+ }
568
+ const op = make({
569
+ kind: "service",
570
+ name: resourceId,
571
+ effect: loadEffect,
572
+ meta
573
+ });
574
+ const exit = yield* Effect.exit(run(op, stack));
575
+ if (exit._tag === "Success") {
576
+ const successSnapshot = Snapshot.success({ keyHash: keyHash2, data: exit.value });
577
+ const wroteSuccessPath = yield* writebackIfCurrentKeyHashForRow(
578
+ rowId,
579
+ keyHash2,
580
+ successSnapshot,
581
+ "source:success",
582
+ `source:${fieldPath}:${rowId}:success`,
583
+ "success"
584
+ );
585
+ if (wroteSuccessPath) {
586
+ yield* recordSnapshot(replayMode, replayLog, {
587
+ _tag: "ResourceSnapshot",
588
+ resourceId,
589
+ fieldPath: wroteSuccessPath,
590
+ keyHash: keyHash2,
591
+ concurrency: mode2,
592
+ phase: "success",
593
+ snapshot: successSnapshot,
594
+ timestamp: Date.now(),
595
+ moduleId,
596
+ instanceId
597
+ });
598
+ }
599
+ } else {
600
+ const errorSnapshot = Snapshot.error({ keyHash: keyHash2, error: exit.cause });
601
+ const wroteErrorPath = yield* writebackIfCurrentKeyHashForRow(
602
+ rowId,
603
+ keyHash2,
604
+ errorSnapshot,
605
+ "source:error",
606
+ `source:${fieldPath}:${rowId}:error`,
607
+ "error"
608
+ );
609
+ if (wroteErrorPath) {
610
+ yield* recordSnapshot(replayMode, replayLog, {
611
+ _tag: "ResourceSnapshot",
612
+ resourceId,
613
+ fieldPath: wroteErrorPath,
614
+ keyHash: keyHash2,
615
+ concurrency: mode2,
616
+ phase: "error",
617
+ snapshot: errorSnapshot,
618
+ timestamp: Date.now(),
619
+ moduleId,
620
+ instanceId
621
+ });
622
+ }
623
+ }
624
+ }).pipe(Effect.catchAllCause(() => Effect.void));
625
+ const fiber = yield* Effect.forkScoped(
626
+ Effect.locally(inSyncTransactionFiber, false)(io)
627
+ );
628
+ const myGen = gen2 += 1;
629
+ inFlight2.set(rowId, { gen: myGen, fiber, keyHash: keyHash2 });
630
+ yield* Effect.forkScoped(
631
+ Effect.locally(inSyncTransactionFiber, false)(
632
+ Fiber.await(fiber).pipe(
633
+ Effect.zipRight(
634
+ Effect.sync(() => {
635
+ const current = inFlight2.get(rowId);
636
+ if (current && current.gen === myGen) {
637
+ inFlight2.delete(rowId);
638
+ }
639
+ })
640
+ ),
641
+ Effect.zipRight(
642
+ mode2 === "exhaust-trailing" ? Effect.gen(function* () {
643
+ const next = trailing2.get(rowId);
644
+ trailing2.delete(rowId);
645
+ if (next) {
646
+ yield* startFetch2(
647
+ rowId,
648
+ next.key,
649
+ next.keyHash,
650
+ replayMode,
651
+ replayLog
652
+ );
653
+ }
654
+ }) : Effect.void
655
+ ),
656
+ Effect.catchAllCause(() => Effect.void)
657
+ )
658
+ )
659
+ );
660
+ });
661
+ register(
662
+ fieldPath,
663
+ (state) => Effect.gen(function* () {
664
+ const { moduleId, instanceId } = getBoundScope(bound);
665
+ const replayModeOpt = yield* Effect.serviceOption(ReplayModeConfigTag);
666
+ const replayMode = Option.isSome(replayModeOpt) ? replayModeOpt.value.mode : "live";
667
+ const replayLogOpt = yield* Effect.serviceOption(ReplayLog);
668
+ const replayLog = Option.isSome(replayLogOpt) ? replayLogOpt.value : void 0;
669
+ const force = yield* FiberRef.get(forceSourceRefresh);
670
+ const listValue = getAtPath(state, listPath);
671
+ const items = Array.isArray(listValue) ? listValue : [];
672
+ const ids = store.ensureList(listPath, items);
673
+ const traceKey = `${instanceId ?? "unknown"}::source::${fieldPath}`;
674
+ if (isDevEnv() && (yield* onceInRunSession(`deps_trace_settled:${traceKey}`))) {
675
+ try {
676
+ const sample = items[0];
677
+ if (sample !== void 0) {
678
+ const traced = trace((s) => entry.meta.key(s), sample);
679
+ const prefixedReads = traced.reads.map(
680
+ (r) => r ? `${listPath}[].${r}` : `${listPath}[]`
681
+ );
682
+ const diff = diffDeps(
683
+ entry.meta.deps ?? [],
684
+ prefixedReads
685
+ );
686
+ if (diff) {
687
+ yield* emitDepsMismatch({
688
+ moduleId,
689
+ instanceId,
690
+ kind: "source",
691
+ fieldPath,
692
+ diff
693
+ });
694
+ }
695
+ }
696
+ } catch {
697
+ }
698
+ }
699
+ for (let index = 0; index < items.length; index++) {
700
+ const rowId = ids[index];
701
+ if (!rowId) continue;
702
+ const concretePath = toListItemValuePath(listPath, index, itemPath);
703
+ const prevSnapshot = getAtPath(state, concretePath);
704
+ let key;
705
+ try {
706
+ key = entry.meta.key(items[index]);
707
+ } catch {
708
+ key = void 0;
709
+ }
710
+ const current = inFlight2.get(rowId);
711
+ if (key === void 0) {
712
+ trailing2.delete(rowId);
713
+ inFlight2.delete(rowId);
714
+ if (prevSnapshot && typeof prevSnapshot === "object" && prevSnapshot.status === "idle" && prevSnapshot.data === void 0 && prevSnapshot.error === void 0) {
715
+ continue;
716
+ }
717
+ const idleSnapshot = Snapshot.idle();
718
+ const wroteIdlePath = yield* setSnapshotForRowInTxn(
719
+ rowId,
720
+ idleSnapshot,
721
+ "source:idle",
722
+ `source:${fieldPath}:${rowId}:idle`
723
+ );
724
+ if (wroteIdlePath) {
725
+ const event = {
726
+ _tag: "ResourceSnapshot",
727
+ resourceId,
728
+ fieldPath: wroteIdlePath,
729
+ keyHash: void 0,
730
+ concurrency: mode2,
731
+ phase: "idle",
732
+ snapshot: idleSnapshot,
733
+ timestamp: Date.now(),
734
+ moduleId,
735
+ instanceId
736
+ };
737
+ recordReplayEvent(bound, event);
738
+ yield* recordSnapshot(replayMode, replayLog, event);
739
+ }
740
+ continue;
741
+ }
742
+ const h = keyHash(key);
743
+ if (!force && current && current.keyHash === h) {
744
+ continue;
745
+ }
746
+ const prevKeyHash = prevSnapshot && typeof prevSnapshot === "object" ? prevSnapshot.keyHash : void 0;
747
+ if (!force && !current && prevKeyHash === h) {
748
+ continue;
749
+ }
750
+ if (mode2 === "exhaust-trailing" && current) {
751
+ trailing2.set(rowId, { key, keyHash: h });
752
+ const loadingSnapshot = Snapshot.loading({ keyHash: h });
753
+ const wroteLoadingPath = yield* setSnapshotForRowInTxn(
754
+ rowId,
755
+ loadingSnapshot,
756
+ "source:loading",
757
+ `source:${fieldPath}:${rowId}:loading`
758
+ );
759
+ if (wroteLoadingPath) {
760
+ const event = {
761
+ _tag: "ResourceSnapshot",
762
+ resourceId,
763
+ fieldPath: wroteLoadingPath,
764
+ keyHash: h,
765
+ concurrency: mode2,
766
+ phase: "loading",
767
+ snapshot: loadingSnapshot,
768
+ timestamp: Date.now(),
769
+ moduleId,
770
+ instanceId
771
+ };
772
+ recordReplayEvent(bound, event);
773
+ yield* recordSnapshot(replayMode, replayLog, event);
774
+ }
775
+ continue;
776
+ }
777
+ if (mode2 === "switch" && current) {
778
+ trailing2.delete(rowId);
779
+ inFlight2.delete(rowId);
780
+ }
781
+ yield* startFetch2(rowId, key, h, replayMode, replayLog);
782
+ }
783
+ })
784
+ );
785
+ return Effect.void;
786
+ }
787
+ let inFlight;
788
+ let gen = 0;
789
+ let trailing;
790
+ const concurrency = entry.meta.concurrency;
791
+ const mode = concurrency ?? "switch";
792
+ const startFetch = (key, keyHash2, replayMode, replayLog) => Effect.gen(function* () {
793
+ const { moduleId, instanceId } = getBoundScope(bound);
794
+ let loadingSnapshot = Snapshot.loading({ keyHash: keyHash2 });
795
+ if (replayMode === "replay" && replayLog) {
796
+ const replayLoading = yield* replayLog.consumeNextResourceSnapshot({
797
+ resourceId,
798
+ fieldPath,
799
+ keyHash: keyHash2,
800
+ phase: "loading"
801
+ });
802
+ if (replayLoading) {
803
+ loadingSnapshot = replayLoading.snapshot;
804
+ }
805
+ }
806
+ const wroteLoading = yield* setSnapshotInTxn(
807
+ bound,
808
+ fieldPath,
809
+ loadingSnapshot,
810
+ "source:loading",
811
+ `source:${fieldPath}:loading`,
812
+ step.debugInfo?.graphNodeId
813
+ );
814
+ if (wroteLoading) {
815
+ const event = {
816
+ _tag: "ResourceSnapshot",
817
+ resourceId,
818
+ fieldPath,
819
+ keyHash: keyHash2,
820
+ concurrency: mode,
821
+ phase: "loading",
822
+ snapshot: loadingSnapshot,
823
+ timestamp: Date.now(),
824
+ moduleId,
825
+ instanceId
826
+ };
827
+ recordReplayEvent(bound, event);
828
+ yield* recordSnapshot(replayMode, replayLog, event);
829
+ }
830
+ const io = Effect.gen(function* () {
831
+ if (replayMode === "replay" && replayLog) {
832
+ yield* Effect.yieldNow();
833
+ const replayed = yield* replayLog.consumeNextResourceSnapshot({
834
+ resourceId,
835
+ fieldPath,
836
+ keyHash: keyHash2
837
+ });
838
+ if (!replayed) return yield* Effect.void;
839
+ if (replayed.phase === "success") {
840
+ const event = {
841
+ _tag: "ResourceSnapshot",
842
+ resourceId,
843
+ fieldPath,
844
+ keyHash: keyHash2,
845
+ concurrency: mode,
846
+ phase: "success",
847
+ snapshot: replayed.snapshot,
848
+ timestamp: Date.now(),
849
+ moduleId,
850
+ instanceId
851
+ };
852
+ yield* writebackIfCurrentKeyHash(
853
+ bound,
854
+ fieldPath,
855
+ keyHash2,
856
+ replayed.snapshot,
857
+ "source:success",
858
+ `source:${fieldPath}:success`,
859
+ step.debugInfo?.graphNodeId,
860
+ event
861
+ );
862
+ } else if (replayed.phase === "error") {
863
+ const event = {
864
+ _tag: "ResourceSnapshot",
865
+ resourceId,
866
+ fieldPath,
867
+ keyHash: keyHash2,
868
+ concurrency: mode,
869
+ phase: "error",
870
+ snapshot: replayed.snapshot,
871
+ timestamp: Date.now(),
872
+ moduleId,
873
+ instanceId
874
+ };
875
+ yield* writebackIfCurrentKeyHash(
876
+ bound,
877
+ fieldPath,
878
+ keyHash2,
879
+ replayed.snapshot,
880
+ "source:error",
881
+ `source:${fieldPath}:error`,
882
+ step.debugInfo?.graphNodeId,
883
+ event
884
+ );
885
+ }
886
+ return yield* Effect.void;
887
+ }
888
+ const stack = yield* getMiddlewareStack();
889
+ const registryOpt = yield* Effect.serviceOption(
890
+ internal.ResourceRegistryTag
891
+ );
892
+ const registry = Option.isSome(registryOpt) ? registryOpt.value : void 0;
893
+ const spec = registry?.specs.get(resourceId);
894
+ if (!spec) {
895
+ return yield* Effect.void;
896
+ }
897
+ const loadEffect = spec.load(key);
898
+ const meta = {
899
+ moduleId,
900
+ instanceId,
901
+ fieldPath,
902
+ resourceId,
903
+ key,
904
+ keyHash: keyHash2,
905
+ traitNodeId: step.debugInfo?.graphNodeId,
906
+ stepId: step.id
907
+ };
908
+ if (!(typeof meta.opSeq === "number" && Number.isFinite(meta.opSeq))) {
909
+ const sessionOpt = yield* Effect.serviceOption(RunSessionTag);
910
+ if (Option.isSome(sessionOpt)) {
911
+ const seqKey = instanceId ?? "global";
912
+ meta.opSeq = sessionOpt.value.local.nextSeq("opSeq", seqKey);
913
+ }
914
+ }
915
+ const op = make({
916
+ kind: "trait-source",
917
+ name: resourceId,
918
+ effect: loadEffect,
919
+ meta
920
+ });
921
+ const exit = yield* Effect.exit(run(op, stack));
922
+ if (exit._tag === "Success") {
923
+ const successSnapshot = Snapshot.success({ keyHash: keyHash2, data: exit.value });
924
+ const event = {
925
+ _tag: "ResourceSnapshot",
926
+ resourceId,
927
+ fieldPath,
928
+ keyHash: keyHash2,
929
+ concurrency: mode,
930
+ phase: "success",
931
+ snapshot: successSnapshot,
932
+ timestamp: Date.now(),
933
+ moduleId,
934
+ instanceId
935
+ };
936
+ const wroteSuccess = yield* writebackIfCurrentKeyHash(
937
+ bound,
938
+ fieldPath,
939
+ keyHash2,
940
+ successSnapshot,
941
+ "source:success",
942
+ `source:${fieldPath}:success`,
943
+ step.debugInfo?.graphNodeId,
944
+ event
945
+ );
946
+ if (wroteSuccess) {
947
+ yield* recordSnapshot(replayMode, replayLog, event);
948
+ }
949
+ } else {
950
+ const errorSnapshot = Snapshot.error({ keyHash: keyHash2, error: exit.cause });
951
+ const event = {
952
+ _tag: "ResourceSnapshot",
953
+ resourceId,
954
+ fieldPath,
955
+ keyHash: keyHash2,
956
+ concurrency: mode,
957
+ phase: "error",
958
+ snapshot: errorSnapshot,
959
+ timestamp: Date.now(),
960
+ moduleId,
961
+ instanceId
962
+ };
963
+ const wroteError = yield* writebackIfCurrentKeyHash(
964
+ bound,
965
+ fieldPath,
966
+ keyHash2,
967
+ errorSnapshot,
968
+ "source:error",
969
+ `source:${fieldPath}:error`,
970
+ step.debugInfo?.graphNodeId,
971
+ event
972
+ );
973
+ if (wroteError) {
974
+ yield* recordSnapshot(replayMode, replayLog, event);
975
+ }
976
+ }
977
+ }).pipe(
978
+ Effect.catchAllCause(() => Effect.void)
979
+ );
980
+ const fiber = yield* Effect.forkScoped(
981
+ Effect.locally(inSyncTransactionFiber, false)(io)
982
+ );
983
+ const myGen = gen += 1;
984
+ inFlight = { gen: myGen, fiber, keyHash: keyHash2 };
985
+ yield* Effect.forkScoped(
986
+ Effect.locally(inSyncTransactionFiber, false)(
987
+ Fiber.await(fiber).pipe(
988
+ Effect.zipRight(
989
+ Effect.sync(() => {
990
+ if (inFlight && inFlight.gen === myGen) {
991
+ inFlight = void 0;
992
+ }
993
+ })
994
+ ),
995
+ Effect.zipRight(
996
+ mode === "exhaust-trailing" ? Effect.gen(function* () {
997
+ const next = trailing;
998
+ trailing = void 0;
999
+ if (next) {
1000
+ yield* startFetch(
1001
+ next.key,
1002
+ next.keyHash,
1003
+ replayMode,
1004
+ replayLog
1005
+ );
1006
+ }
1007
+ }) : Effect.void
1008
+ ),
1009
+ Effect.catchAllCause(() => Effect.void)
1010
+ )
1011
+ )
1012
+ );
1013
+ });
1014
+ register(
1015
+ fieldPath,
1016
+ (state) => Effect.gen(function* () {
1017
+ const { moduleId, instanceId } = getBoundScope(bound);
1018
+ const replayModeOpt = yield* Effect.serviceOption(ReplayModeConfigTag);
1019
+ const replayMode = Option.isSome(replayModeOpt) ? replayModeOpt.value.mode : "live";
1020
+ const replayLogOpt = yield* Effect.serviceOption(ReplayLog);
1021
+ const replayLog = Option.isSome(replayLogOpt) ? replayLogOpt.value : void 0;
1022
+ const force = yield* FiberRef.get(forceSourceRefresh);
1023
+ let key;
1024
+ try {
1025
+ key = entry.meta.key(state);
1026
+ } catch {
1027
+ key = void 0;
1028
+ }
1029
+ const traceKey = `${instanceId ?? "unknown"}::source::${fieldPath}`;
1030
+ if (isDevEnv() && (yield* onceInRunSession(`deps_trace_settled:${traceKey}`))) {
1031
+ try {
1032
+ const traced = trace((s) => entry.meta.key(s), state);
1033
+ const diff = diffDeps(
1034
+ entry.meta.deps ?? [],
1035
+ traced.reads
1036
+ );
1037
+ if (diff) {
1038
+ yield* emitDepsMismatch({
1039
+ moduleId,
1040
+ instanceId,
1041
+ kind: "source",
1042
+ fieldPath,
1043
+ diff
1044
+ });
1045
+ }
1046
+ } catch {
1047
+ }
1048
+ }
1049
+ if (key === void 0) {
1050
+ if (inFlight) {
1051
+ yield* Fiber.interruptFork(inFlight.fiber);
1052
+ inFlight = void 0;
1053
+ }
1054
+ trailing = void 0;
1055
+ const idleSnapshot = Snapshot.idle();
1056
+ const wroteIdle = yield* setSnapshotInTxn(
1057
+ bound,
1058
+ fieldPath,
1059
+ idleSnapshot,
1060
+ "source:idle",
1061
+ `source:${fieldPath}:idle`,
1062
+ step.debugInfo?.graphNodeId
1063
+ );
1064
+ if (wroteIdle) {
1065
+ const event = {
1066
+ _tag: "ResourceSnapshot",
1067
+ resourceId,
1068
+ fieldPath,
1069
+ keyHash: void 0,
1070
+ concurrency: mode,
1071
+ phase: "idle",
1072
+ snapshot: idleSnapshot,
1073
+ timestamp: Date.now(),
1074
+ moduleId,
1075
+ instanceId
1076
+ };
1077
+ recordReplayEvent(bound, event);
1078
+ yield* recordSnapshot(replayMode, replayLog, event);
1079
+ }
1080
+ return;
1081
+ }
1082
+ const h = keyHash(key);
1083
+ if (!force) {
1084
+ if (inFlight && inFlight.keyHash === h) {
1085
+ return;
1086
+ }
1087
+ const currentSnapshot = getAtPath(state, fieldPath);
1088
+ const currentKeyHash = currentSnapshot && typeof currentSnapshot === "object" ? currentSnapshot.keyHash : void 0;
1089
+ const currentStatus = currentSnapshot && typeof currentSnapshot === "object" ? currentSnapshot.status : void 0;
1090
+ if (currentStatus && currentStatus !== "idle" && currentKeyHash === h) {
1091
+ return;
1092
+ }
1093
+ }
1094
+ if (mode === "exhaust-trailing" && inFlight) {
1095
+ trailing = { key, keyHash: h };
1096
+ const loadingSnapshot = Snapshot.loading({ keyHash: h });
1097
+ const wroteLoading = yield* setSnapshotInTxn(
1098
+ bound,
1099
+ fieldPath,
1100
+ loadingSnapshot,
1101
+ "source:loading",
1102
+ `source:${fieldPath}:loading`,
1103
+ step.debugInfo?.graphNodeId
1104
+ );
1105
+ if (wroteLoading) {
1106
+ const event = {
1107
+ _tag: "ResourceSnapshot",
1108
+ resourceId,
1109
+ fieldPath,
1110
+ keyHash: h,
1111
+ concurrency: mode,
1112
+ phase: "loading",
1113
+ snapshot: loadingSnapshot,
1114
+ timestamp: Date.now(),
1115
+ moduleId,
1116
+ instanceId
1117
+ };
1118
+ recordReplayEvent(bound, event);
1119
+ yield* recordSnapshot(replayMode, replayLog, event);
1120
+ }
1121
+ return;
1122
+ }
1123
+ if (mode === "switch" && inFlight) {
1124
+ yield* Fiber.interruptFork(inFlight.fiber);
1125
+ inFlight = void 0;
1126
+ trailing = void 0;
1127
+ }
1128
+ yield* startFetch(key, h, replayMode, replayLog);
1129
+ })
1130
+ );
1131
+ return Effect.void;
1132
+ };
1133
+
1134
+ export {
1135
+ diffDeps,
1136
+ trace,
1137
+ syncIdleInTransaction,
1138
+ installSourceRefresh
1139
+ };
1140
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvc3RhdGUtdHJhaXQvc291cmNlLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3N0YXRlLXRyYWl0L2RlcHMtdHJhY2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEVmZmVjdCwgRmliZXIsIEZpYmVyUmVmLCBPcHRpb24gfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB7IGNyZWF0ZSB9IGZyb20gXCJtdXRhdGl2ZVwiXG5pbXBvcnQgKiBhcyBFZmZlY3RPcCBmcm9tIFwiLi4vZWZmZWN0LW9wLmpzXCJcbmltcG9ydCB7IFNuYXBzaG90LCBpbnRlcm5hbCBhcyBSZXNvdXJjZUludGVybmFsLCBrZXlIYXNoIGFzIGhhc2hLZXkgfSBmcm9tIFwiLi4vcmVzb3VyY2UuanNcIlxuaW1wb3J0ICogYXMgRWZmZWN0T3BDb3JlIGZyb20gXCIuLi9ydW50aW1lL2NvcmUvRWZmZWN0T3BDb3JlLmpzXCJcbmltcG9ydCAqIGFzIERlYnVnIGZyb20gXCIuLi9ydW50aW1lL2NvcmUvRGVidWdTaW5rLmpzXCJcbmltcG9ydCAqIGFzIFRhc2tSdW5uZXIgZnJvbSBcIi4uL3J1bnRpbWUvY29yZS9UYXNrUnVubmVyLmpzXCJcbmltcG9ydCB7IGlzRGV2RW52LCBSZXBsYXlNb2RlQ29uZmlnVGFnIH0gZnJvbSBcIi4uL3J1bnRpbWUvY29yZS9lbnYuanNcIlxuaW1wb3J0ICogYXMgUmVwbGF5TG9nIGZyb20gXCIuLi9ydW50aW1lL2NvcmUvUmVwbGF5TG9nLmpzXCJcbmltcG9ydCB0eXBlIHsgUGF0Y2hSZWFzb24sIFN0YXRlUGF0Y2ggfSBmcm9tIFwiLi4vcnVudGltZS9jb3JlL1N0YXRlVHJhbnNhY3Rpb24uanNcIlxuaW1wb3J0IHR5cGUgeyBCb3VuZEFwaSB9IGZyb20gXCIuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzXCJcbmltcG9ydCB7IGdldEJvdW5kSW50ZXJuYWxzIH0gZnJvbSBcIi4uL3J1bnRpbWUvY29yZS9ydW50aW1lSW50ZXJuYWxzQWNjZXNzb3IuanNcIlxuaW1wb3J0IHsgUnVuU2Vzc2lvblRhZyB9IGZyb20gXCIuLi9vYnNlcnZhYmlsaXR5L3J1blNlc3Npb24uanNcIlxuaW1wb3J0ICogYXMgRGVwc1RyYWNlIGZyb20gXCIuL2RlcHMtdHJhY2UuanNcIlxuaW1wb3J0ICogYXMgUm93SWQgZnJvbSBcIi4vcm93aWQuanNcIlxuaW1wb3J0IHR5cGUge1xuICBTdGF0ZVRyYWl0RW50cnksXG4gIFN0YXRlVHJhaXRQbGFuU3RlcCxcbiAgU3RhdGVUcmFpdFByb2dyYW0sXG59IGZyb20gXCIuL21vZGVsLmpzXCJcblxuZXhwb3J0IGludGVyZmFjZSBTb3VyY2VTeW5jQ29udGV4dDxTPiB7XG4gIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgZ2V0RHJhZnQ6ICgpID0+IFNcbiAgcmVhZG9ubHkgc2V0RHJhZnQ6IChuZXh0OiBTKSA9PiB2b2lkXG4gIHJlYWRvbmx5IHJlY29yZFBhdGNoOiAocGF0Y2g6IFN0YXRlUGF0Y2gpID0+IHZvaWRcbn1cblxuY29uc3QgbWFrZVBhdGNoID0gKFxuICBwYXRoOiBzdHJpbmcsXG4gIGZyb206IHVua25vd24sXG4gIHRvOiB1bmtub3duLFxuICByZWFzb246IFBhdGNoUmVhc29uLFxuICBzdGVwSWQ6IHN0cmluZyxcbik6IFN0YXRlUGF0Y2ggPT4gKHtcbiAgcGF0aCxcbiAgZnJvbSxcbiAgdG8sXG4gIHJlYXNvbixcbiAgc3RlcElkLFxufSlcblxuY29uc3Qgb25jZUluUnVuU2Vzc2lvbiA9IChrZXk6IHN0cmluZyk6IEVmZmVjdC5FZmZlY3Q8Ym9vbGVhbiwgbmV2ZXIsIGFueT4gPT5cbiAgRWZmZWN0LnNlcnZpY2VPcHRpb24oUnVuU2Vzc2lvblRhZykucGlwZShcbiAgICBFZmZlY3QubWFwKChtYXliZSkgPT5cbiAgICAgIE9wdGlvbi5pc1NvbWUobWF5YmUpID8gbWF5YmUudmFsdWUubG9jYWwub25jZShrZXkpIDogdHJ1ZSxcbiAgICApLFxuICApXG5cbmNvbnN0IGZvcm1hdExpc3QgPSAoaXRlbXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiwgbGltaXQgPSAxMCk6IHN0cmluZyA9PiB7XG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHJldHVybiBcIlwiXG4gIGlmIChpdGVtcy5sZW5ndGggPD0gbGltaXQpIHJldHVybiBpdGVtcy5qb2luKFwiLCBcIilcbiAgcmV0dXJuIGAke2l0ZW1zLnNsaWNlKDAsIGxpbWl0KS5qb2luKFwiLCBcIil9LCBcdTIwMjYoKyR7aXRlbXMubGVuZ3RoIC0gbGltaXR9KWBcbn1cblxuY29uc3QgZW1pdERlcHNNaXNtYXRjaCA9IChcbiAgcGFyYW1zOiB7XG4gICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgcmVhZG9ubHkga2luZDogXCJjb21wdXRlZFwiIHwgXCJzb3VyY2VcIlxuICAgIHJlYWRvbmx5IGZpZWxkUGF0aDogc3RyaW5nXG4gICAgcmVhZG9ubHkgZGlmZjogRGVwc1RyYWNlLkRlcHNEaWZmXG4gIH0sXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBrZXkgPSBgJHtwYXJhbXMuaW5zdGFuY2VJZCA/PyBcInVua25vd25cIn06OiR7cGFyYW1zLmtpbmR9Ojoke3BhcmFtcy5maWVsZFBhdGh9YFxuICAgIGNvbnN0IHNob3VsZEVtaXQgPSB5aWVsZCogb25jZUluUnVuU2Vzc2lvbihgZGVwc19taXNtYXRjaDoke2tleX1gKVxuICAgIGlmICghc2hvdWxkRW1pdCkgcmV0dXJuXG5cbiAgICB5aWVsZCogRGVidWcucmVjb3JkKHtcbiAgICAgIHR5cGU6IFwiZGlhZ25vc3RpY1wiLFxuICAgICAgbW9kdWxlSWQ6IHBhcmFtcy5tb2R1bGVJZCxcbiAgICAgIGluc3RhbmNlSWQ6IHBhcmFtcy5pbnN0YW5jZUlkLFxuICAgICAgY29kZTogXCJzdGF0ZV90cmFpdDo6ZGVwc19taXNtYXRjaFwiLFxuICAgICAgc2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuICAgICAgbWVzc2FnZTpcbiAgICAgICAgYFtkZXBzXSAke3BhcmFtcy5raW5kfSBcIiR7cGFyYW1zLmZpZWxkUGF0aH1cIiBkZWNsYXJlZD1bJHtmb3JtYXRMaXN0KHBhcmFtcy5kaWZmLmRlY2xhcmVkKX1dIGAgK1xuICAgICAgICBgcmVhZHM9WyR7Zm9ybWF0TGlzdChwYXJhbXMuZGlmZi5yZWFkcyl9XSBtaXNzaW5nPVske2Zvcm1hdExpc3QocGFyYW1zLmRpZmYubWlzc2luZyl9XSBgICtcbiAgICAgICAgYHVudXNlZD1bJHtmb3JtYXRMaXN0KHBhcmFtcy5kaWZmLnVudXNlZCl9XWAsXG4gICAgICBoaW50OlxuICAgICAgICBcImRlcHMgaXMgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGRlcGVuZGVuY2llczogaW5jcmVtZW50YWwgc2NoZWR1bGluZyAvIHJldmVyc2UgY2xvc3VyZXMgLyBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIHJlbHkgb24gZGVwcyBvbmx5LiBcIiArXG4gICAgICAgIFwiS2VlcCBkZXBzIGNvbnNpc3RlbnQgd2l0aCBhY3R1YWwgcmVhZHM7IGlmIHlvdSByZWFsbHkgZGVwZW5kIG9uIHRoZSB3aG9sZSBvYmplY3QsIGRlY2xhcmUgYSBjb2Fyc2VyLWdyYWluZWQgZGVwIChlLmcuIFxcXCJwcm9maWxlXFxcIikgdG8gY292ZXIgc3ViLWZpZWxkIHJlYWRzLlwiLFxuICAgICAga2luZDogYGRlcHNfbWlzbWF0Y2g6JHtwYXJhbXMua2luZH1gLFxuICAgIH0pXG4gIH0pXG5cbmNvbnN0IGdldE1pZGRsZXdhcmVTdGFjayA9ICgpOiBFZmZlY3QuRWZmZWN0PFxuICBFZmZlY3RPcC5NaWRkbGV3YXJlU3RhY2ssXG4gIG5ldmVyLFxuICBhbnlcbj4gPT5cbiAgRWZmZWN0LnNlcnZpY2VPcHRpb24oRWZmZWN0T3BDb3JlLkVmZmVjdE9wTWlkZGxld2FyZVRhZykucGlwZShcbiAgICBFZmZlY3QubWFwKChtYXliZSkgPT5cbiAgICAgIE9wdGlvbi5pc1NvbWUobWF5YmUpID8gbWF5YmUudmFsdWUuc3RhY2sgOiBbXSxcbiAgICApLFxuICApXG5cbmNvbnN0IHJlY29yZFRyYWl0UGF0Y2ggPSAoXG4gIGJvdW5kOiBCb3VuZEFwaTxhbnksIGFueT4sXG4gIHBhdGNoOiB7XG4gICAgcmVhZG9ubHkgcGF0aDogc3RyaW5nXG4gICAgcmVhZG9ubHkgZnJvbT86IHVua25vd25cbiAgICByZWFkb25seSB0bz86IHVua25vd25cbiAgICByZWFkb25seSByZWFzb246IFBhdGNoUmVhc29uXG4gICAgcmVhZG9ubHkgdHJhaXROb2RlSWQ/OiBzdHJpbmdcbiAgICByZWFkb25seSBzdGVwSWQ/OiBzdHJpbmdcbiAgfSxcbik6IHZvaWQgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGludGVybmFscyA9IGdldEJvdW5kSW50ZXJuYWxzKGJvdW5kIGFzIGFueSlcbiAgICBpbnRlcm5hbHMudHhuLnJlY29yZFN0YXRlUGF0Y2gocGF0Y2ggYXMgYW55KVxuICB9IGNhdGNoIHtcbiAgICAvLyBuby1vcCBmb3IgbGVnYWN5L21vY2tlZCBib3VuZFxuICB9XG59XG5cbmNvbnN0IHJlY29yZFJlcGxheUV2ZW50ID0gKFxuICBib3VuZDogQm91bmRBcGk8YW55LCBhbnk+LFxuICBldmVudDogUmVwbGF5TG9nLlJlcGxheUxvZ0V2ZW50LFxuKTogdm9pZCA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgaW50ZXJuYWxzID0gZ2V0Qm91bmRJbnRlcm5hbHMoYm91bmQgYXMgYW55KVxuICAgIGludGVybmFscy50eG4ucmVjb3JkUmVwbGF5RXZlbnQoZXZlbnQpXG4gIH0gY2F0Y2gge1xuICAgIC8vIG5vLW9wIGZvciBsZWdhY3kvbW9ja2VkIGJvdW5kXG4gIH1cbn1cblxuY29uc3QgZ2V0Qm91bmRTY29wZSA9IChcbiAgYm91bmQ6IEJvdW5kQXBpPGFueSwgYW55Pixcbik6IHsgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmc7IHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmcgfSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgaW50ZXJuYWxzID0gZ2V0Qm91bmRJbnRlcm5hbHMoYm91bmQgYXMgYW55KVxuICAgIHJldHVybiB7IG1vZHVsZUlkOiBpbnRlcm5hbHMubW9kdWxlSWQsIGluc3RhbmNlSWQ6IGludGVybmFscy5pbnN0YW5jZUlkIH1cbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgbW9kdWxlSWQ6IHVuZGVmaW5lZCwgaW5zdGFuY2VJZDogdW5kZWZpbmVkIH1cbiAgfVxufVxuXG5jb25zdCBzZXRTbmFwc2hvdEluVHhuID0gKFxuICBib3VuZDogQm91bmRBcGk8YW55LCBhbnk+LFxuICBmaWVsZFBhdGg6IHN0cmluZyxcbiAgbmV4dDogdW5rbm93bixcbiAgcmVhc29uOiBQYXRjaFJlYXNvbixcbiAgc3RlcElkOiBzdHJpbmcsXG4gIHRyYWl0Tm9kZUlkPzogc3RyaW5nLFxuKTogRWZmZWN0LkVmZmVjdDxib29sZWFuLCBuZXZlciwgYW55PiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgbGV0IHdyb3RlID0gZmFsc2VcbiAgICB5aWVsZCogKGJvdW5kLnN0YXRlLm11dGF0ZSgoZHJhZnQ6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcHJldiA9IFJvd0lkLmdldEF0UGF0aChkcmFmdCwgZmllbGRQYXRoKVxuICAgICAgaWYgKE9iamVjdC5pcyhwcmV2LCBuZXh0KSkgcmV0dXJuXG4gICAgICB3cm90ZSA9IHRydWVcbiAgICAgIFJvd0lkLnNldEF0UGF0aE11dGF0aW5nKGRyYWZ0LCBmaWVsZFBhdGgsIG5leHQpXG4gICAgICByZWNvcmRUcmFpdFBhdGNoKGJvdW5kLCB7XG4gICAgICAgIHBhdGg6IGZpZWxkUGF0aCxcbiAgICAgICAgZnJvbTogcHJldixcbiAgICAgICAgdG86IG5leHQsXG4gICAgICAgIHJlYXNvbixcbiAgICAgICAgc3RlcElkLFxuICAgICAgICB0cmFpdE5vZGVJZCxcbiAgICAgIH0pXG4gICAgfSkgYXMgRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PilcbiAgICByZXR1cm4gd3JvdGVcbiAgfSlcblxuY29uc3Qgd3JpdGViYWNrSWZDdXJyZW50S2V5SGFzaCA9IChcbiAgYm91bmQ6IEJvdW5kQXBpPGFueSwgYW55PixcbiAgZmllbGRQYXRoOiBzdHJpbmcsXG4gIGtleUhhc2g6IHN0cmluZyxcbiAgbmV4dDogdW5rbm93bixcbiAgcmVhc29uOiBQYXRjaFJlYXNvbixcbiAgc3RlcElkOiBzdHJpbmcsXG4gIHRyYWl0Tm9kZUlkPzogc3RyaW5nLFxuICByZXBsYXlFdmVudD86IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCxcbik6IEVmZmVjdC5FZmZlY3Q8Ym9vbGVhbiwgbmV2ZXIsIGFueT4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGxldCB3cm90ZSA9IGZhbHNlXG4gICAgeWllbGQqIChib3VuZC5zdGF0ZS5tdXRhdGUoKGRyYWZ0OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBSb3dJZC5nZXRBdFBhdGgoZHJhZnQsIGZpZWxkUGF0aClcbiAgICAgIGNvbnN0IGN1cnJlbnRLZXlIYXNoID1cbiAgICAgICAgY3VycmVudCAmJiB0eXBlb2YgY3VycmVudCA9PT0gXCJvYmplY3RcIiA/IChjdXJyZW50IGFzIGFueSkua2V5SGFzaCA6IHVuZGVmaW5lZFxuICAgICAgaWYgKGN1cnJlbnRLZXlIYXNoICE9PSBrZXlIYXNoKSByZXR1cm5cblxuICAgICAgY29uc3QgcHJldiA9IGN1cnJlbnRcbiAgICAgIGlmIChPYmplY3QuaXMocHJldiwgbmV4dCkpIHJldHVyblxuXG4gICAgICB3cm90ZSA9IHRydWVcbiAgICAgIFJvd0lkLnNldEF0UGF0aE11dGF0aW5nKGRyYWZ0LCBmaWVsZFBhdGgsIG5leHQpXG4gICAgICBpZiAocmVwbGF5RXZlbnQpIHtcbiAgICAgICAgcmVjb3JkUmVwbGF5RXZlbnQoYm91bmQsIHJlcGxheUV2ZW50KVxuICAgICAgfVxuICAgICAgcmVjb3JkVHJhaXRQYXRjaChib3VuZCwge1xuICAgICAgICBwYXRoOiBmaWVsZFBhdGgsXG4gICAgICAgIGZyb206IHByZXYsXG4gICAgICAgIHRvOiBuZXh0LFxuICAgICAgICByZWFzb24sXG4gICAgICAgIHN0ZXBJZCxcbiAgICAgICAgdHJhaXROb2RlSWQsXG4gICAgICB9KVxuICAgIH0pIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pXG4gICAgcmV0dXJuIHdyb3RlXG4gIH0pXG5cbi8qKlxuICogc3luY0lkbGVJblRyYW5zYWN0aW9uXHVGRjFBXG4gKiAtIFx1NTcyOFx1NEU4Qlx1NTJBMVx1N0E5N1x1NTNFM1x1NTE4NVx1NTQwQ1x1NkI2NVx1OEJDNFx1NEYzMFx1NjI0MFx1NjcwOSBzb3VyY2Uua2V5KHN0YXRlKVx1RkYxQlxuICogLSBcdTgyRTUga2V5IFx1NTNEOFx1NEUzQVx1N0E3QVx1RkYwOHVuZGVmaW5lZFx1RkYwOVx1RkYwQ1x1NTIxOVx1NTQwQ1x1NkI2NVx1NUMwNlx1NUJGOVx1NUU5NFx1NUI1N1x1NkJCNVx1OTFDRFx1N0Y2RVx1NEUzQSBpZGxlIHNuYXBzaG90XHVGRjA4XHU5MDdGXHU1MTREIHRlYXJpbmdcdUZGMDlcdTMwMDJcbiAqL1xuZXhwb3J0IGNvbnN0IHN5bmNJZGxlSW5UcmFuc2FjdGlvbiA9IDxTIGV4dGVuZHMgb2JqZWN0PihcbiAgcHJvZ3JhbTogU3RhdGVUcmFpdFByb2dyYW08Uz4sXG4gIGN0eDogU291cmNlU3luY0NvbnRleHQ8Uz4sXG4pOiBFZmZlY3QuRWZmZWN0PHZvaWQ+ID0+XG4gIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICBjb25zdCBkcmFmdCA9IGN0eC5nZXREcmFmdCgpIGFzIGFueVxuICAgIGNvbnN0IHVwZGF0ZXM6IEFycmF5PHsgcmVhZG9ubHkgZmllbGRQYXRoOiBzdHJpbmc7IHJlYWRvbmx5IHByZXY6IHVua25vd24gfT4gPSBbXVxuXG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBwcm9ncmFtLmVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyeS5raW5kICE9PSBcInNvdXJjZVwiKSBjb250aW51ZVxuICAgICAgY29uc3QgZmllbGRQYXRoID0gZW50cnkuZmllbGRQYXRoXG4gICAgICBjb25zdCBsaXN0SXRlbSA9IFJvd0lkLnBhcnNlTGlzdEl0ZW1GaWVsZFBhdGgoZmllbGRQYXRoKVxuXG4gICAgICBpZiAobGlzdEl0ZW0pIHtcbiAgICAgICAgLy8gbGlzdC5pdGVtIHNjb3BlXHVGRjFBXHU2MzA5IGluZGV4IFx1OTAxMFx1ODg0Q1x1OEJDNFx1NEYzMCBrZXlcdUZGMENcdTVFNzZcdTVCRjlcdTY3MkFcdTZGQzBcdTZEM0JcdTg4NENcdTU0MENcdTZCNjVcdTUxOTlcdTU2REUgaWRsZVx1MzAwMlxuICAgICAgICBjb25zdCBsaXN0VmFsdWUgPSBSb3dJZC5nZXRBdFBhdGgoZHJhZnQsIGxpc3RJdGVtLmxpc3RQYXRoKVxuICAgICAgICBjb25zdCBpdGVtczogUmVhZG9ubHlBcnJheTx1bmtub3duPiA9IEFycmF5LmlzQXJyYXkobGlzdFZhbHVlKSA/IGxpc3RWYWx1ZSA6IFtdXG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGl0ZW1zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpbmRleF1cblxuICAgICAgICAgIGxldCBrZXk6IHVua25vd25cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAga2V5ID0gKGVudHJ5Lm1ldGEgYXMgYW55KS5rZXkoaXRlbSlcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSBjb250aW51ZVxuXG4gICAgICAgICAgY29uc3QgY29uY3JldGVQYXRoID0gUm93SWQudG9MaXN0SXRlbVZhbHVlUGF0aChcbiAgICAgICAgICAgIGxpc3RJdGVtLmxpc3RQYXRoLFxuICAgICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgICBsaXN0SXRlbS5pdGVtUGF0aCxcbiAgICAgICAgICApXG4gICAgICAgICAgY29uc3QgcHJldiA9IFJvd0lkLmdldEF0UGF0aChkcmFmdCwgY29uY3JldGVQYXRoKVxuICAgICAgICAgIGNvbnN0IHByZXZTdGF0dXMgPVxuICAgICAgICAgICAgcHJldiAmJiB0eXBlb2YgcHJldiA9PT0gXCJvYmplY3RcIiA/IChwcmV2IGFzIGFueSkuc3RhdHVzIDogdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKHByZXZTdGF0dXMgPT09IFwiaWRsZVwiKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gKHByZXYgYXMgYW55KT8uZGF0YVxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSAocHJldiBhcyBhbnkpPy5lcnJvclxuICAgICAgICAgICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdXBkYXRlcy5wdXNoKHsgZmllbGRQYXRoOiBjb25jcmV0ZVBhdGgsIHByZXYgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGxldCBrZXk6IHVua25vd25cbiAgICAgIHRyeSB7XG4gICAgICAgIGtleSA9IChlbnRyeS5tZXRhIGFzIGFueSkua2V5KGRyYWZ0KVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgICAgY29uc3QgcHJldiA9IFJvd0lkLmdldEF0UGF0aChkcmFmdCwgZmllbGRQYXRoKVxuICAgICAgY29uc3QgcHJldlN0YXR1cyA9XG4gICAgICAgIHByZXYgJiYgdHlwZW9mIHByZXYgPT09IFwib2JqZWN0XCIgPyAocHJldiBhcyBhbnkpLnN0YXR1cyA6IHVuZGVmaW5lZFxuICAgICAgaWYgKHByZXZTdGF0dXMgPT09IFwiaWRsZVwiKSB7XG4gICAgICAgIC8vIFx1NEVDRFx1OTcwMFx1Nzg2RVx1NEZERCBkYXRhL2Vycm9yIFx1ODhBQlx1NkUwNVx1N0E3QVxuICAgICAgICBjb25zdCBkYXRhID0gKHByZXYgYXMgYW55KT8uZGF0YVxuICAgICAgICBjb25zdCBlcnJvciA9IChwcmV2IGFzIGFueSk/LmVycm9yXG4gICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgJiYgZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlcy5wdXNoKHsgZmllbGRQYXRoLCBwcmV2IH0pXG4gICAgfVxuXG4gICAgaWYgKHVwZGF0ZXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgIGNvbnN0IHJlYXNvbjogUGF0Y2hSZWFzb24gPSBcInNvdXJjZTppZGxlXCJcblxuICAgIGNvbnN0IG5leHREcmFmdCA9IGNyZWF0ZShkcmFmdCwgKG5leHQ6IGFueSkgPT4ge1xuICAgICAgZm9yIChjb25zdCB1IG9mIHVwZGF0ZXMpIHtcbiAgICAgICAgUm93SWQuc2V0QXRQYXRoTXV0YXRpbmcobmV4dCwgdS5maWVsZFBhdGgsIFNuYXBzaG90LmlkbGUoKSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY3R4LnNldERyYWZ0KG5leHREcmFmdCBhcyBTKVxuXG4gICAgZm9yIChjb25zdCB1IG9mIHVwZGF0ZXMpIHtcbiAgICAgIGN0eC5yZWNvcmRQYXRjaChcbiAgICAgICAgbWFrZVBhdGNoKFxuICAgICAgICAgIHUuZmllbGRQYXRoLFxuICAgICAgICAgIHUucHJldixcbiAgICAgICAgICBTbmFwc2hvdC5pZGxlKCksXG4gICAgICAgICAgcmVhc29uLFxuICAgICAgICAgIGBzb3VyY2U6JHt1LmZpZWxkUGF0aH06aWRsZWAsXG4gICAgICAgICksXG4gICAgICApXG4gICAgfVxuICB9KVxuXG4vKipcbiAqIGluc3RhbGxTb3VyY2VSZWZyZXNoXHVGRjFBXG4gKiAtIFx1NEUzQVx1NTM1NVx1NEUyQSBzb3VyY2UgXHU1QjU3XHU2QkI1XHU2Q0U4XHU1MThDXHU1MjM3XHU2NUIwXHU1QjlFXHU3M0IwXHVGRjA4UmVzb3VyY2VTbmFwc2hvdCArIGtleUhhc2ggZ2F0ZSArIGNvbmN1cnJlbmN5XHVGRjA5XHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBpbnN0YWxsU291cmNlUmVmcmVzaCA9IDxTPihcbiAgYm91bmQ6IEJvdW5kQXBpPGFueSwgYW55PixcbiAgc3RlcDogU3RhdGVUcmFpdFBsYW5TdGVwLFxuICBlbnRyeTogRXh0cmFjdDxTdGF0ZVRyYWl0RW50cnk8Uywgc3RyaW5nPiwgeyByZWFkb25seSBraW5kOiBcInNvdXJjZVwiIH0+LFxuKTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PiA9PiB7XG4gIGlmICghc3RlcC50YXJnZXRGaWVsZFBhdGgpIHJldHVybiBFZmZlY3Qudm9pZFxuXG4gIGNvbnN0IGZpZWxkUGF0aCA9IHN0ZXAudGFyZ2V0RmllbGRQYXRoXG4gIGNvbnN0IHJlc291cmNlSWQgPSBzdGVwLnJlc291cmNlSWQgPz8gZW50cnkubWV0YS5yZXNvdXJjZVxuICBjb25zdCBsaXN0SXRlbSA9IFJvd0lkLnBhcnNlTGlzdEl0ZW1GaWVsZFBhdGgoZmllbGRQYXRoKVxuXG4gIGxldCBpbnRlcm5hbHM6IFJldHVyblR5cGU8dHlwZW9mIGdldEJvdW5kSW50ZXJuYWxzPiB8IHVuZGVmaW5lZFxuICB0cnkge1xuICAgIGludGVybmFscyA9IGdldEJvdW5kSW50ZXJuYWxzKGJvdW5kIGFzIGFueSlcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIEVmZmVjdC52b2lkXG4gIH1cblxuICBjb25zdCByZWdpc3RlciA9IGludGVybmFscy50cmFpdHMucmVnaXN0ZXJTb3VyY2VSZWZyZXNoXG5cbiAgY29uc3QgcmVjb3JkU25hcHNob3QgPSAoXG4gICAgcmVwbGF5TW9kZTogXCJsaXZlXCIgfCBcInJlcGxheVwiLFxuICAgIHJlcGxheUxvZzogUmVwbGF5TG9nLlJlcGxheUxvZ1NlcnZpY2UgfCB1bmRlZmluZWQsXG4gICAgaW5wdXQ6XG4gICAgICB8IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudFxuICAgICAgfCB7XG4gICAgICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICAgICAgcmVhZG9ubHkgZmllbGRQYXRoOiBzdHJpbmdcbiAgICAgICAgICByZWFkb25seSBrZXlIYXNoPzogc3RyaW5nXG4gICAgICAgICAgcmVhZG9ubHkgY29uY3VycmVuY3k/OiBzdHJpbmdcbiAgICAgICAgICByZWFkb25seSBwaGFzZTogUmVwbGF5TG9nLlJlc291cmNlU25hcHNob3RQaGFzZVxuICAgICAgICAgIHJlYWRvbmx5IHNuYXBzaG90OiB1bmtub3duXG4gICAgICAgIH0sXG4gICk6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPT4ge1xuICAgIGlmICghcmVwbGF5TG9nKSByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICBpZiAocmVwbGF5TW9kZSAhPT0gXCJsaXZlXCIpIHJldHVybiBFZmZlY3Qudm9pZFxuICAgIGNvbnN0IGV2ZW50OiBSZXBsYXlMb2cuUmVwbGF5TG9nRXZlbnQgPVxuICAgICAgaW5wdXQgJiYgdHlwZW9mIGlucHV0ID09PSBcIm9iamVjdFwiICYmIChpbnB1dCBhcyBhbnkpLl90YWcgPT09IFwiUmVzb3VyY2VTbmFwc2hvdFwiXG4gICAgICAgID8gKGlucHV0IGFzIFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudClcbiAgICAgICAgOiB7XG4gICAgICAgICAgICBfdGFnOiBcIlJlc291cmNlU25hcHNob3RcIixcbiAgICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAgICBmaWVsZFBhdGg6IChpbnB1dCBhcyBhbnkpLmZpZWxkUGF0aCxcbiAgICAgICAgICAgIGtleUhhc2g6IChpbnB1dCBhcyBhbnkpLmtleUhhc2gsXG4gICAgICAgICAgICBjb25jdXJyZW5jeTogKGlucHV0IGFzIGFueSkuY29uY3VycmVuY3ksXG4gICAgICAgICAgICBwaGFzZTogKGlucHV0IGFzIGFueSkucGhhc2UsXG4gICAgICAgICAgICBzbmFwc2hvdDogKGlucHV0IGFzIGFueSkuc25hcHNob3QsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBtb2R1bGVJZDogKGlucHV0IGFzIGFueSkubW9kdWxlSWQsXG4gICAgICAgICAgICBpbnN0YW5jZUlkOiAoaW5wdXQgYXMgYW55KS5pbnN0YW5jZUlkLFxuICAgICAgICAgIH1cbiAgICByZXR1cm4gcmVwbGF5TG9nLnJlY29yZChldmVudClcbiAgfVxuXG4gIC8vIGxpc3QuaXRlbSBzY29wZVx1RkYxQVx1NjMwOSBSb3dJRCBcdTUwNUEgaW4tZmxpZ2h0IFx1OTVFOFx1NjNBN1x1RkYwOFx1OTA3Rlx1NTE0RCBpbnNlcnQvcmVtb3ZlL3Jlb3JkZXIgXHU0RTBCXHU1MTk5XHU5NTE5XHU4ODRDXHVGRjA5XHUzMDAyXG4gIGlmIChsaXN0SXRlbSkge1xuICAgIGNvbnN0IHN0b3JlID0gaW50ZXJuYWxzLnRyYWl0cy5yb3dJZFN0b3JlIGFzIFJvd0lkLlJvd0lkU3RvcmUgfCB1bmRlZmluZWRcbiAgICBpZiAoIXN0b3JlKSB7XG4gICAgICByZXR1cm4gRWZmZWN0LnZvaWRcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0UGF0aCA9IGxpc3RJdGVtLmxpc3RQYXRoXG4gICAgY29uc3QgaXRlbVBhdGggPSBsaXN0SXRlbS5pdGVtUGF0aFxuICAgIGlmICghaXRlbVBhdGgpIHtcbiAgICAgIC8vIFx1Nzk4MVx1NkI2Mlx1NjI4QSBzbmFwc2hvdCBcdTUxOTlcdTU2REVcdTUyMzBcdTY1NzRcdTRFMkEgaXRlbVx1RkYwOFx1NEYxQVx1ODk4Nlx1NzZENlx1NEUxQVx1NTJBMSB2YWx1ZXNcdUZGMDlcdTMwMDJcbiAgICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICAgIH1cblxuICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gKGVudHJ5Lm1ldGEgYXMgYW55KS5jb25jdXJyZW5jeSBhc1xuICAgICAgfCBcInN3aXRjaFwiXG4gICAgICB8IFwiZXhoYXVzdC10cmFpbGluZ1wiXG4gICAgICB8IHVuZGVmaW5lZFxuICAgIGNvbnN0IG1vZGUgPSBjb25jdXJyZW5jeSA/PyBcInN3aXRjaFwiXG5cbiAgICBjb25zdCBpbkZsaWdodCA9IG5ldyBNYXA8XG4gICAgICBSb3dJZC5Sb3dJZCxcbiAgICAgIHtcbiAgICAgICAgcmVhZG9ubHkgZ2VuOiBudW1iZXJcbiAgICAgICAgcmVhZG9ubHkgZmliZXI6IEZpYmVyLlJ1bnRpbWVGaWJlcjx2b2lkLCBuZXZlcj5cbiAgICAgICAgcmVhZG9ubHkga2V5SGFzaDogc3RyaW5nXG4gICAgICB9XG4gICAgPigpXG4gICAgY29uc3QgdHJhaWxpbmcgPSBuZXcgTWFwPFJvd0lkLlJvd0lkLCB7IHJlYWRvbmx5IGtleTogdW5rbm93bjsgcmVhZG9ubHkga2V5SGFzaDogc3RyaW5nIH0+KClcbiAgICBsZXQgZ2VuID0gMFxuXG4gICAgLy8gcm93IFx1ODhBQlx1NzlGQlx1OTY2NFx1RkYxQVx1NkUwNVx1NzQwNiB0cmFpbGluZy9pbkZsaWdodCBcdTVGMTVcdTc1MjhcdUZGMENcdTkwN0ZcdTUxNERcdTU0MEVcdTdFRURcdTk1MTlcdThCRUZcdTVGNTJcdTVDNUVcdTYyMTZcdTUxODVcdTVCNThcdTZDQzRcdTZGMEZcdTMwMDJcbiAgICBzdG9yZS5vblJlbW92ZWQobGlzdFBhdGgsIChyb3dJZCkgPT4ge1xuICAgICAgdHJhaWxpbmcuZGVsZXRlKHJvd0lkKVxuICAgICAgaW5GbGlnaHQuZGVsZXRlKHJvd0lkKVxuICAgIH0pXG5cbiAgICBjb25zdCBzZXRTbmFwc2hvdEZvclJvd0luVHhuID0gKFxuICAgICAgcm93SWQ6IFJvd0lkLlJvd0lkLFxuICAgICAgbmV4dDogdW5rbm93bixcbiAgICAgIHJlYXNvbjogUGF0Y2hSZWFzb24sXG4gICAgICBzdGVwSWQ6IHN0cmluZyxcbiAgICApOiBFZmZlY3QuRWZmZWN0PHN0cmluZyB8IHVuZGVmaW5lZCwgbmV2ZXIsIGFueT4gPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHdyb3RlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgIHlpZWxkKiAoYm91bmQuc3RhdGUubXV0YXRlKChkcmFmdDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdG9yZS5nZXRJbmRleChsaXN0UGF0aCwgcm93SWQpXG4gICAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHJldHVyblxuICAgICAgICAgIGNvbnN0IGNvbmNyZXRlUGF0aCA9IFJvd0lkLnRvTGlzdEl0ZW1WYWx1ZVBhdGgobGlzdFBhdGgsIGluZGV4LCBpdGVtUGF0aClcbiAgICAgICAgICBjb25zdCBwcmV2ID0gUm93SWQuZ2V0QXRQYXRoKGRyYWZ0LCBjb25jcmV0ZVBhdGgpXG4gICAgICAgICAgaWYgKE9iamVjdC5pcyhwcmV2LCBuZXh0KSkgcmV0dXJuXG4gICAgICAgICAgd3JvdGVQYXRoID0gY29uY3JldGVQYXRoXG4gICAgICAgICAgUm93SWQuc2V0QXRQYXRoTXV0YXRpbmcoZHJhZnQsIGNvbmNyZXRlUGF0aCwgbmV4dClcbiAgICAgICAgICByZWNvcmRUcmFpdFBhdGNoKGJvdW5kLCB7XG4gICAgICAgICAgICBwYXRoOiBjb25jcmV0ZVBhdGgsXG4gICAgICAgICAgICBmcm9tOiBwcmV2LFxuICAgICAgICAgICAgdG86IG5leHQsXG4gICAgICAgICAgICByZWFzb24sXG4gICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICB0cmFpdE5vZGVJZDogc3RlcC5kZWJ1Z0luZm8/LmdyYXBoTm9kZUlkLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pXG4gICAgICAgIHJldHVybiB3cm90ZVBhdGhcbiAgICAgIH0pXG5cbiAgICBjb25zdCB3cml0ZWJhY2tJZkN1cnJlbnRLZXlIYXNoRm9yUm93ID0gKFxuICAgICAgcm93SWQ6IFJvd0lkLlJvd0lkLFxuICAgICAga2V5SGFzaDogc3RyaW5nLFxuICAgICAgbmV4dDogdW5rbm93bixcbiAgICAgIHJlYXNvbjogUGF0Y2hSZWFzb24sXG4gICAgICBzdGVwSWQ6IHN0cmluZyxcbiAgICAgIHBoYXNlPzogUmVwbGF5TG9nLlJlc291cmNlU25hcHNob3RQaGFzZSxcbiAgICApOiBFZmZlY3QuRWZmZWN0PHN0cmluZyB8IHVuZGVmaW5lZCwgbmV2ZXIsIGFueT4gPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgbGV0IHdyb3RlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgIHlpZWxkKiAoYm91bmQuc3RhdGUubXV0YXRlKChkcmFmdDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzdG9yZS5nZXRJbmRleChsaXN0UGF0aCwgcm93SWQpXG4gICAgICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHJldHVyblxuICAgICAgICAgIGNvbnN0IGNvbmNyZXRlUGF0aCA9IFJvd0lkLnRvTGlzdEl0ZW1WYWx1ZVBhdGgobGlzdFBhdGgsIGluZGV4LCBpdGVtUGF0aClcblxuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBSb3dJZC5nZXRBdFBhdGgoZHJhZnQsIGNvbmNyZXRlUGF0aClcbiAgICAgICAgICBjb25zdCBjdXJyZW50S2V5SGFzaCA9XG4gICAgICAgICAgICBjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSBcIm9iamVjdFwiID8gKGN1cnJlbnQgYXMgYW55KS5rZXlIYXNoIDogdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKGN1cnJlbnRLZXlIYXNoICE9PSBrZXlIYXNoKSByZXR1cm5cblxuICAgICAgICAgIGNvbnN0IHByZXYgPSBjdXJyZW50XG4gICAgICAgICAgaWYgKE9iamVjdC5pcyhwcmV2LCBuZXh0KSkgcmV0dXJuXG5cbiAgICAgICAgICB3cm90ZVBhdGggPSBjb25jcmV0ZVBhdGhcbiAgICAgICAgICBSb3dJZC5zZXRBdFBhdGhNdXRhdGluZyhkcmFmdCwgY29uY3JldGVQYXRoLCBuZXh0KVxuICAgICAgICAgIGlmIChwaGFzZSkge1xuICAgICAgICAgICAgY29uc3QgeyBtb2R1bGVJZCwgaW5zdGFuY2VJZCB9ID0gZ2V0Qm91bmRTY29wZShib3VuZClcbiAgICAgICAgICAgIHJlY29yZFJlcGxheUV2ZW50KGJvdW5kLCB7XG4gICAgICAgICAgICAgIF90YWc6IFwiUmVzb3VyY2VTbmFwc2hvdFwiLFxuICAgICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAgICBmaWVsZFBhdGg6IGNvbmNyZXRlUGF0aCxcbiAgICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgICAgY29uY3VycmVuY3k6IG1vZGUsXG4gICAgICAgICAgICAgIHBoYXNlLFxuICAgICAgICAgICAgICBzbmFwc2hvdDogbmV4dCxcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY29yZFRyYWl0UGF0Y2goYm91bmQsIHtcbiAgICAgICAgICAgIHBhdGg6IGNvbmNyZXRlUGF0aCxcbiAgICAgICAgICAgIGZyb206IHByZXYsXG4gICAgICAgICAgICB0bzogbmV4dCxcbiAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgIHRyYWl0Tm9kZUlkOiBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSkgYXMgRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PilcbiAgICAgICAgcmV0dXJuIHdyb3RlUGF0aFxuICAgICAgfSlcblxuICAgIGNvbnN0IHN0YXJ0RmV0Y2ggPSAoXG4gICAgICByb3dJZDogUm93SWQuUm93SWQsXG4gICAgICBrZXk6IHVua25vd24sXG4gICAgICBrZXlIYXNoOiBzdHJpbmcsXG4gICAgICByZXBsYXlNb2RlOiBcImxpdmVcIiB8IFwicmVwbGF5XCIsXG4gICAgICByZXBsYXlMb2c6IFJlcGxheUxvZy5SZXBsYXlMb2dTZXJ2aWNlIHwgdW5kZWZpbmVkLFxuICAgICk6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgeyBtb2R1bGVJZCwgaW5zdGFuY2VJZCB9ID0gZ2V0Qm91bmRTY29wZShib3VuZClcblxuICAgICAgICBjb25zdCBpbmRleEZvckxvZyA9IHN0b3JlLmdldEluZGV4KGxpc3RQYXRoLCByb3dJZClcbiAgICAgICAgY29uc3QgbG9nRmllbGRQYXRoID1cbiAgICAgICAgICBpbmRleEZvckxvZyA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBSb3dJZC50b0xpc3RJdGVtVmFsdWVQYXRoKGxpc3RQYXRoLCBpbmRleEZvckxvZywgaXRlbVBhdGgpXG5cbiAgICAgICAgbGV0IGxvYWRpbmdTbmFwc2hvdDogdW5rbm93biA9IFNuYXBzaG90LmxvYWRpbmcoeyBrZXlIYXNoIH0pXG4gICAgICAgIGlmIChyZXBsYXlNb2RlID09PSBcInJlcGxheVwiICYmIHJlcGxheUxvZyAmJiBsb2dGaWVsZFBhdGgpIHtcbiAgICAgICAgICBjb25zdCByZXBsYXlMb2FkaW5nID0geWllbGQqIHJlcGxheUxvZy5jb25zdW1lTmV4dFJlc291cmNlU25hcHNob3Qoe1xuICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgIGZpZWxkUGF0aDogbG9nRmllbGRQYXRoLFxuICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgIHBoYXNlOiBcImxvYWRpbmdcIixcbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmIChyZXBsYXlMb2FkaW5nKSB7XG4gICAgICAgICAgICBsb2FkaW5nU25hcHNob3QgPSByZXBsYXlMb2FkaW5nLnNuYXBzaG90XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdyb3RlTG9hZGluZ1BhdGggPSB5aWVsZCogc2V0U25hcHNob3RGb3JSb3dJblR4bihcbiAgICAgICAgICByb3dJZCxcbiAgICAgICAgICBsb2FkaW5nU25hcHNob3QsXG4gICAgICAgICAgXCJzb3VyY2U6bG9hZGluZ1wiLFxuICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OiR7cm93SWR9OmxvYWRpbmdgLFxuICAgICAgICApXG4gICAgICAgIGlmICh3cm90ZUxvYWRpbmdQYXRoKSB7XG4gICAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICAgIF90YWc6IFwiUmVzb3VyY2VTbmFwc2hvdFwiLFxuICAgICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICAgIGZpZWxkUGF0aDogd3JvdGVMb2FkaW5nUGF0aCxcbiAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICBjb25jdXJyZW5jeTogbW9kZSxcbiAgICAgICAgICAgIHBoYXNlOiBcImxvYWRpbmdcIixcbiAgICAgICAgICAgIHNuYXBzaG90OiBsb2FkaW5nU25hcHNob3QsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY29yZFJlcGxheUV2ZW50KGJvdW5kLCBldmVudClcbiAgICAgICAgICB5aWVsZCogcmVjb3JkU25hcHNob3QocmVwbGF5TW9kZSwgcmVwbGF5TG9nLCBldmVudClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlvID0gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgIGlmIChyZXBsYXlNb2RlID09PSBcInJlcGxheVwiICYmIHJlcGxheUxvZykge1xuICAgICAgICAgICAgLy8gXHU4QkE5IGxvYWRpbmcgXHU2M0QwXHU0RUE0XHU1MTQ4XHU1M0VGXHU4OUMxXHVGRjBDXHU1MThEXHU5MUNEXHU4RDVCXHU3RUM4XHU2MDAxXHVGRjA4XHU0RkREXHU2MzAxXHUyMDFDXHU1RjAyXHU2QjY1XHU4RDQ0XHU2RTkwXHUyMDFEXHU3Njg0XHU2NUY2XHU5NUY0XHU3RUJGXHU3RUQzXHU2Nzg0XHVGRjA5XHUzMDAyXG4gICAgICAgICAgICB5aWVsZCogRWZmZWN0LnlpZWxkTm93KClcbiAgICAgICAgICAgIGNvbnN0IGNvbnN1bWVQYXRoID0gd3JvdGVMb2FkaW5nUGF0aCA/PyBsb2dGaWVsZFBhdGhcbiAgICAgICAgICAgIGlmICghY29uc3VtZVBhdGgpIHJldHVybiB5aWVsZCogRWZmZWN0LnZvaWRcblxuICAgICAgICAgICAgY29uc3QgcmVwbGF5ZWQgPSB5aWVsZCogcmVwbGF5TG9nLmNvbnN1bWVOZXh0UmVzb3VyY2VTbmFwc2hvdCh7XG4gICAgICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAgICAgIGZpZWxkUGF0aDogY29uc3VtZVBhdGgsXG4gICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYgKCFyZXBsYXllZCkgcmV0dXJuIHlpZWxkKiBFZmZlY3Qudm9pZFxuXG4gICAgICAgICAgICBpZiAocmVwbGF5ZWQucGhhc2UgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICAgIHlpZWxkKiB3cml0ZWJhY2tJZkN1cnJlbnRLZXlIYXNoRm9yUm93KFxuICAgICAgICAgICAgICAgIHJvd0lkLFxuICAgICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICAgICAgcmVwbGF5ZWQuc25hcHNob3QsXG4gICAgICAgICAgICAgICAgXCJzb3VyY2U6c3VjY2Vzc1wiLFxuICAgICAgICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OiR7cm93SWR9OnN1Y2Nlc3NgLFxuICAgICAgICAgICAgICAgIFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlcGxheWVkLnBoYXNlID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgICAgICAgeWllbGQqIHdyaXRlYmFja0lmQ3VycmVudEtleUhhc2hGb3JSb3coXG4gICAgICAgICAgICAgICAgcm93SWQsXG4gICAgICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgICAgICByZXBsYXllZC5zbmFwc2hvdCxcbiAgICAgICAgICAgICAgICBcInNvdXJjZTplcnJvclwiLFxuICAgICAgICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OiR7cm93SWR9OmVycm9yYCxcbiAgICAgICAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3Qudm9pZFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHN0YWNrID0geWllbGQqIGdldE1pZGRsZXdhcmVTdGFjaygpXG5cbiAgICAgICAgICBjb25zdCByZWdpc3RyeU9wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSZXNvdXJjZUludGVybmFsLlJlc291cmNlUmVnaXN0cnlUYWcpXG4gICAgICAgICAgY29uc3QgcmVnaXN0cnkgPSBPcHRpb24uaXNTb21lKHJlZ2lzdHJ5T3B0KSA/IHJlZ2lzdHJ5T3B0LnZhbHVlIDogdW5kZWZpbmVkXG4gICAgICAgICAgY29uc3Qgc3BlYyA9IHJlZ2lzdHJ5Py5zcGVjcy5nZXQocmVzb3VyY2VJZClcblxuICAgICAgICAgIGlmICghc3BlYykge1xuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3Qudm9pZFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGxvYWRFZmZlY3QgPSAoc3BlYy5sb2FkIGFzIGFueSkoa2V5KSBhcyBFZmZlY3QuRWZmZWN0PGFueSwgYW55LCBhbnk+XG5cbiAgICAgICAgICBjb25zdCBtZXRhOiBhbnkgPSB7XG4gICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgIHJvd0lkLFxuICAgICAgICAgICAgdHJhaXROb2RlSWQ6IHN0ZXAuZGVidWdJbmZvPy5ncmFwaE5vZGVJZCxcbiAgICAgICAgICAgIHN0ZXBJZDogc3RlcC5pZCxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoISh0eXBlb2YgbWV0YS5vcFNlcSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUobWV0YS5vcFNlcSkpKSB7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uT3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFJ1blNlc3Npb25UYWcpXG4gICAgICAgICAgICBpZiAoT3B0aW9uLmlzU29tZShzZXNzaW9uT3B0KSkge1xuICAgICAgICAgICAgICBjb25zdCBzZXFLZXkgPSBpbnN0YW5jZUlkID8/IFwiZ2xvYmFsXCJcbiAgICAgICAgICAgICAgbWV0YS5vcFNlcSA9IHNlc3Npb25PcHQudmFsdWUubG9jYWwubmV4dFNlcShcIm9wU2VxXCIsIHNlcUtleSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBvcCA9IEVmZmVjdE9wLm1ha2U8YW55LCBhbnksIGFueT4oe1xuICAgICAgICAgICAga2luZDogXCJzZXJ2aWNlXCIsXG4gICAgICAgICAgICBuYW1lOiByZXNvdXJjZUlkLFxuICAgICAgICAgICAgZWZmZWN0OiBsb2FkRWZmZWN0LFxuICAgICAgICAgICAgbWV0YSxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgY29uc3QgZXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdChFZmZlY3RPcC5ydW4ob3AsIHN0YWNrKSlcblxuICAgICAgICAgIGlmIChleGl0Ll90YWcgPT09IFwiU3VjY2Vzc1wiKSB7XG4gICAgICAgICAgICBjb25zdCBzdWNjZXNzU25hcHNob3QgPSBTbmFwc2hvdC5zdWNjZXNzKHsga2V5SGFzaCwgZGF0YTogZXhpdC52YWx1ZSB9KVxuICAgICAgICAgICAgY29uc3Qgd3JvdGVTdWNjZXNzUGF0aCA9IHlpZWxkKiB3cml0ZWJhY2tJZkN1cnJlbnRLZXlIYXNoRm9yUm93KFxuICAgICAgICAgICAgICByb3dJZCxcbiAgICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgICAgc3VjY2Vzc1NuYXBzaG90LFxuICAgICAgICAgICAgICBcInNvdXJjZTpzdWNjZXNzXCIsXG4gICAgICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OiR7cm93SWR9OnN1Y2Nlc3NgLFxuICAgICAgICAgICAgICBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmICh3cm90ZVN1Y2Nlc3NQYXRoKSB7XG4gICAgICAgICAgICAgIHlpZWxkKiByZWNvcmRTbmFwc2hvdChyZXBsYXlNb2RlLCByZXBsYXlMb2csIHtcbiAgICAgICAgICAgICAgICBfdGFnOiBcIlJlc291cmNlU25hcHNob3RcIixcbiAgICAgICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIGZpZWxkUGF0aDogd3JvdGVTdWNjZXNzUGF0aCxcbiAgICAgICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5OiBtb2RlLFxuICAgICAgICAgICAgICAgIHBoYXNlOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgICAgICBzbmFwc2hvdDogc3VjY2Vzc1NuYXBzaG90LFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvclNuYXBzaG90ID0gU25hcHNob3QuZXJyb3IoeyBrZXlIYXNoLCBlcnJvcjogZXhpdC5jYXVzZSB9KVxuICAgICAgICAgICAgY29uc3Qgd3JvdGVFcnJvclBhdGggPSB5aWVsZCogd3JpdGViYWNrSWZDdXJyZW50S2V5SGFzaEZvclJvdyhcbiAgICAgICAgICAgICAgcm93SWQsXG4gICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICAgIGVycm9yU25hcHNob3QsXG4gICAgICAgICAgICAgIFwic291cmNlOmVycm9yXCIsXG4gICAgICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OiR7cm93SWR9OmVycm9yYCxcbiAgICAgICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKHdyb3RlRXJyb3JQYXRoKSB7XG4gICAgICAgICAgICAgIHlpZWxkKiByZWNvcmRTbmFwc2hvdChyZXBsYXlNb2RlLCByZXBsYXlMb2csIHtcbiAgICAgICAgICAgICAgICBfdGFnOiBcIlJlc291cmNlU25hcHNob3RcIixcbiAgICAgICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIGZpZWxkUGF0aDogd3JvdGVFcnJvclBhdGgsXG4gICAgICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgICAgICBjb25jdXJyZW5jeTogbW9kZSxcbiAgICAgICAgICAgICAgICBwaGFzZTogXCJlcnJvclwiLFxuICAgICAgICAgICAgICAgIHNuYXBzaG90OiBlcnJvclNuYXBzaG90LFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSkucGlwZShFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoKSA9PiBFZmZlY3Qudm9pZCkpXG5cbiAgICAgICAgLy8gbGlzdC5pdGVtXHVGRjFBSU8gZmliZXIgXHU1RkM1XHU5ODdCXHU4MTMxXHU3OUJCXHU1NDBDXHU2QjY1XHU0RThCXHU1MkExIEZpYmVyUmVmXHVGRjBDXHU1NDI2XHU1MjE5XHU0RjFBXHU4OEFCXHU4QkVGXHU1MjI0XHU0RTNBXHUyMDFDXHU0RThCXHU1MkExXHU3QTk3XHU1M0UzXHU1MTg1XHUyMDFEXHVGRjBDXHU0RUNFXHU4MDBDXHU5NjNCXHU2NUFEXHU1NDBFXHU3RUVEXHU1MTk5XHU1NkRFXHU1MTY1XHU1M0UzXHUzMDAyXG4gICAgICAgIGNvbnN0IGZpYmVyID0geWllbGQqIEVmZmVjdC5mb3JrU2NvcGVkKFxuICAgICAgICAgIEVmZmVjdC5sb2NhbGx5KFRhc2tSdW5uZXIuaW5TeW5jVHJhbnNhY3Rpb25GaWJlciwgZmFsc2UpKGlvKSxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBteUdlbiA9IChnZW4gKz0gMSlcbiAgICAgICAgaW5GbGlnaHQuc2V0KHJvd0lkLCB7IGdlbjogbXlHZW4sIGZpYmVyLCBrZXlIYXNoIH0pXG5cbiAgICAgICAgeWllbGQqIEVmZmVjdC5mb3JrU2NvcGVkKFxuICAgICAgICAgIEVmZmVjdC5sb2NhbGx5KFRhc2tSdW5uZXIuaW5TeW5jVHJhbnNhY3Rpb25GaWJlciwgZmFsc2UpKFxuICAgICAgICAgICAgRmliZXIuYXdhaXQoZmliZXIpLnBpcGUoXG4gICAgICAgICAgICAgIEVmZmVjdC56aXBSaWdodChcbiAgICAgICAgICAgICAgICBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gaW5GbGlnaHQuZ2V0KHJvd0lkKVxuICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgJiYgY3VycmVudC5nZW4gPT09IG15R2VuKSB7XG4gICAgICAgICAgICAgICAgICAgIGluRmxpZ2h0LmRlbGV0ZShyb3dJZClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgRWZmZWN0LnppcFJpZ2h0KFxuICAgICAgICAgICAgICAgIG1vZGUgPT09IFwiZXhoYXVzdC10cmFpbGluZ1wiXG4gICAgICAgICAgICAgICAgICA/IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gdHJhaWxpbmcuZ2V0KHJvd0lkKVxuICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nLmRlbGV0ZShyb3dJZClcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQqIHN0YXJ0RmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5rZXlIYXNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlNb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYXlMb2csXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgOiBFZmZlY3Qudm9pZCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKCkgPT4gRWZmZWN0LnZvaWQpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICB9KVxuXG4gICAgcmVnaXN0ZXIoZmllbGRQYXRoLCAoc3RhdGU6IGFueSkgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgeyBtb2R1bGVJZCwgaW5zdGFuY2VJZCB9ID0gZ2V0Qm91bmRTY29wZShib3VuZClcbiAgICAgICAgY29uc3QgcmVwbGF5TW9kZU9wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSZXBsYXlNb2RlQ29uZmlnVGFnKVxuICAgICAgICBjb25zdCByZXBsYXlNb2RlID0gT3B0aW9uLmlzU29tZShyZXBsYXlNb2RlT3B0KSA/IHJlcGxheU1vZGVPcHQudmFsdWUubW9kZSA6IFwibGl2ZVwiXG4gICAgICAgIGNvbnN0IHJlcGxheUxvZ09wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSZXBsYXlMb2cuUmVwbGF5TG9nKVxuICAgICAgICBjb25zdCByZXBsYXlMb2cgPSBPcHRpb24uaXNTb21lKHJlcGxheUxvZ09wdCkgPyByZXBsYXlMb2dPcHQudmFsdWUgOiB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgZm9yY2UgPSB5aWVsZCogRmliZXJSZWYuZ2V0KFRhc2tSdW5uZXIuZm9yY2VTb3VyY2VSZWZyZXNoKVxuXG4gICAgICAgIGNvbnN0IGxpc3RWYWx1ZSA9IFJvd0lkLmdldEF0UGF0aChzdGF0ZSwgbGlzdFBhdGgpXG4gICAgICAgIGNvbnN0IGl0ZW1zOiBSZWFkb25seUFycmF5PHVua25vd24+ID0gQXJyYXkuaXNBcnJheShsaXN0VmFsdWUpID8gbGlzdFZhbHVlIDogW11cbiAgICAgICAgY29uc3QgaWRzID0gc3RvcmUuZW5zdXJlTGlzdChsaXN0UGF0aCwgaXRlbXMpXG5cbiAgICAgICAgLy8gZGV2LW1vZGVcdUZGMUFcdTVCRjlcdTk5OTZcdTg4NENcdTUwNUFcdTRFMDBcdTZCMjEgZGVwcyB0cmFjZVx1RkYwOFx1NTNFQVx1NTA1QVx1OEJDQVx1NjVBRFx1RkYwQ1x1NEUwRFx1NUY3MVx1NTRDRFx1NjI2N1x1ODg0Q1x1OEJFRFx1NEU0OVx1RkYwOVx1MzAwMlxuICAgICAgICBjb25zdCB0cmFjZUtleSA9IGAke2luc3RhbmNlSWQgPz8gXCJ1bmtub3duXCJ9Ojpzb3VyY2U6OiR7ZmllbGRQYXRofWBcbiAgICAgICAgaWYgKGlzRGV2RW52KCkgJiYgKHlpZWxkKiBvbmNlSW5SdW5TZXNzaW9uKGBkZXBzX3RyYWNlX3NldHRsZWQ6JHt0cmFjZUtleX1gKSkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc2FtcGxlID0gaXRlbXNbMF1cbiAgICAgICAgICAgIGlmIChzYW1wbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBjb25zdCB0cmFjZWQgPSBEZXBzVHJhY2UudHJhY2UoKHMpID0+IChlbnRyeS5tZXRhIGFzIGFueSkua2V5KHMpLCBzYW1wbGUgYXMgYW55KVxuICAgICAgICAgICAgICBjb25zdCBwcmVmaXhlZFJlYWRzID0gdHJhY2VkLnJlYWRzLm1hcCgocikgPT5cbiAgICAgICAgICAgICAgICByID8gYCR7bGlzdFBhdGh9W10uJHtyfWAgOiBgJHtsaXN0UGF0aH1bXWAsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IERlcHNUcmFjZS5kaWZmRGVwcyhcbiAgICAgICAgICAgICAgICAoKGVudHJ5Lm1ldGEgYXMgYW55KS5kZXBzID8/IFtdKSBhcyBSZWFkb25seUFycmF5PHN0cmluZz4sXG4gICAgICAgICAgICAgICAgcHJlZml4ZWRSZWFkcyxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgICAgIHlpZWxkKiBlbWl0RGVwc01pc21hdGNoKHtcbiAgICAgICAgICAgICAgICAgIG1vZHVsZUlkLFxuICAgICAgICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICAgICAgICAgIGtpbmQ6IFwic291cmNlXCIsXG4gICAgICAgICAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgICAgICAgICBkaWZmLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIHRyYWNpbmcgZmFpbHVyZSBzaG91bGQgbmV2ZXIgYnJlYWsgcmVmcmVzaCBmbG93XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGl0ZW1zLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGNvbnN0IHJvd0lkID0gaWRzW2luZGV4XVxuICAgICAgICAgIGlmICghcm93SWQpIGNvbnRpbnVlXG5cbiAgICAgICAgICBjb25zdCBjb25jcmV0ZVBhdGggPSBSb3dJZC50b0xpc3RJdGVtVmFsdWVQYXRoKGxpc3RQYXRoLCBpbmRleCwgaXRlbVBhdGgpXG4gICAgICAgICAgY29uc3QgcHJldlNuYXBzaG90ID0gUm93SWQuZ2V0QXRQYXRoKHN0YXRlLCBjb25jcmV0ZVBhdGgpIGFzIGFueVxuXG4gICAgICAgICAgbGV0IGtleTogdW5rbm93blxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBrZXkgPSAoZW50cnkubWV0YSBhcyBhbnkpLmtleShpdGVtc1tpbmRleF0pXG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBrZXkgPSB1bmRlZmluZWRcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gaW5GbGlnaHQuZ2V0KHJvd0lkKVxuXG4gICAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0cmFpbGluZy5kZWxldGUocm93SWQpXG4gICAgICAgICAgICBpbkZsaWdodC5kZWxldGUocm93SWQpXG5cbiAgICAgICAgICAgIC8vIFx1ODJFNVx1NURGMlx1NjYyRiBjbGVhbiBpZGxlXHVGRjBDXHU1MjE5XHU2NUUwXHU5NzAwXHU5MUNEXHU1OTBEXHU1MTk5XHU1NkRFXHVGRjA4XHU5MDdGXHU1MTREXHU2NUUwXHU2MTBGXHU0RTQ5IHBhdGNoIFx1NUJGQ1x1ODFGNCBVSSBcdTYyOTZcdTUyQThcdUZGMDlcdTMwMDJcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcHJldlNuYXBzaG90ICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBwcmV2U25hcHNob3QgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgcHJldlNuYXBzaG90LnN0YXR1cyA9PT0gXCJpZGxlXCIgJiZcbiAgICAgICAgICAgICAgcHJldlNuYXBzaG90LmRhdGEgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICBwcmV2U25hcHNob3QuZXJyb3IgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlkbGVTbmFwc2hvdCA9IFNuYXBzaG90LmlkbGUoKVxuICAgICAgICAgICAgY29uc3Qgd3JvdGVJZGxlUGF0aCA9IHlpZWxkKiBzZXRTbmFwc2hvdEZvclJvd0luVHhuKFxuICAgICAgICAgICAgICByb3dJZCxcbiAgICAgICAgICAgICAgaWRsZVNuYXBzaG90LFxuICAgICAgICAgICAgICBcInNvdXJjZTppZGxlXCIsXG4gICAgICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OiR7cm93SWR9OmlkbGVgLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKHdyb3RlSWRsZVBhdGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICAgICAgICBfdGFnOiBcIlJlc291cmNlU25hcHNob3RcIixcbiAgICAgICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAgICAgIGZpZWxkUGF0aDogd3JvdGVJZGxlUGF0aCxcbiAgICAgICAgICAgICAgICBrZXlIYXNoOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IG1vZGUsXG4gICAgICAgICAgICAgICAgcGhhc2U6IFwiaWRsZVwiLFxuICAgICAgICAgICAgICAgIHNuYXBzaG90OiBpZGxlU25hcHNob3QsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgIG1vZHVsZUlkLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVjb3JkUmVwbGF5RXZlbnQoYm91bmQsIGV2ZW50KVxuICAgICAgICAgICAgICB5aWVsZCogcmVjb3JkU25hcHNob3QocmVwbGF5TW9kZSwgcmVwbGF5TG9nLCBldmVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaCA9IGhhc2hLZXkoa2V5KVxuXG4gICAgICAgICAgLy8ga2V5SGFzaCBcdTY3MkFcdTUzRDhcdTUzMTZcdUZGMUFcdTkwN0ZcdTUxNERcdTY1RTBcdTYxMEZcdTRFNDlcdTkxQ0RcdTU5MERcdTUyMzdcdTY1QjBcdUZGMDhcdTU0MENcdTY1RjZcdTRGRERcdTRGNEYgaW4tZmxpZ2h0XHVGRjA5XHUzMDAyXG4gICAgICAgICAgaWYgKCFmb3JjZSAmJiBjdXJyZW50ICYmIGN1cnJlbnQua2V5SGFzaCA9PT0gaCkge1xuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBcdTk3NUUgaW4tZmxpZ2h0XHVGRjFBXHU4MkU1XHU1RjUzXHU1MjREIHNuYXBzaG90LmtleUhhc2ggXHU1REYyXHU1MzM5XHU5MTREXHVGRjBDXHU1MjE5XHU4OUM2XHU0RTNBXHU1REYyXHU2NjJGXHU2NzAwXHU2NUIwXHU2NTcwXHU2MzZFXHVGRjA4XHU5MDdGXHU1MTREXHU1MTY4XHU5MUNGIHJlZnJlc2ggXHU5MDIwXHU2MjEwXHU2MjQwXHU2NzA5XHU4ODRDXHU2Mjk2XHU1MkE4XHVGRjA5XHUzMDAyXG4gICAgICAgICAgY29uc3QgcHJldktleUhhc2ggPVxuICAgICAgICAgICAgcHJldlNuYXBzaG90ICYmIHR5cGVvZiBwcmV2U25hcHNob3QgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgPyAocHJldlNuYXBzaG90IGFzIGFueSkua2V5SGFzaFxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgIGlmICghZm9yY2UgJiYgIWN1cnJlbnQgJiYgcHJldktleUhhc2ggPT09IGgpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG1vZGUgPT09IFwiZXhoYXVzdC10cmFpbGluZ1wiICYmIGN1cnJlbnQpIHtcbiAgICAgICAgICAgIHRyYWlsaW5nLnNldChyb3dJZCwgeyBrZXksIGtleUhhc2g6IGggfSlcbiAgICAgICAgICAgIGNvbnN0IGxvYWRpbmdTbmFwc2hvdCA9IFNuYXBzaG90LmxvYWRpbmcoeyBrZXlIYXNoOiBoIH0pXG4gICAgICAgICAgICBjb25zdCB3cm90ZUxvYWRpbmdQYXRoID0geWllbGQqIHNldFNuYXBzaG90Rm9yUm93SW5UeG4oXG4gICAgICAgICAgICAgIHJvd0lkLFxuICAgICAgICAgICAgICBsb2FkaW5nU25hcHNob3QsXG4gICAgICAgICAgICAgIFwic291cmNlOmxvYWRpbmdcIixcbiAgICAgICAgICAgICAgYHNvdXJjZToke2ZpZWxkUGF0aH06JHtyb3dJZH06bG9hZGluZ2AsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAod3JvdGVMb2FkaW5nUGF0aCkge1xuICAgICAgICAgICAgICBjb25zdCBldmVudDogUmVwbGF5TG9nLlJlcGxheUxvZ0V2ZW50ID0ge1xuICAgICAgICAgICAgICAgIF90YWc6IFwiUmVzb3VyY2VTbmFwc2hvdFwiLFxuICAgICAgICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAgICAgICAgZmllbGRQYXRoOiB3cm90ZUxvYWRpbmdQYXRoLFxuICAgICAgICAgICAgICAgIGtleUhhc2g6IGgsXG4gICAgICAgICAgICAgICAgY29uY3VycmVuY3k6IG1vZGUsXG4gICAgICAgICAgICAgICAgcGhhc2U6IFwibG9hZGluZ1wiLFxuICAgICAgICAgICAgICAgIHNuYXBzaG90OiBsb2FkaW5nU25hcHNob3QsXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgIG1vZHVsZUlkLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVjb3JkUmVwbGF5RXZlbnQoYm91bmQsIGV2ZW50KVxuICAgICAgICAgICAgICB5aWVsZCogcmVjb3JkU25hcHNob3QocmVwbGF5TW9kZSwgcmVwbGF5TG9nLCBldmVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG1vZGUgPT09IFwic3dpdGNoXCIgJiYgY3VycmVudCkge1xuICAgICAgICAgICAgLy8gXHU0RTBEXHU0RjlEXHU4RDU2XHU1M0Q2XHU2RDg4XHU2QjYzXHU3ODZFXHU2MDI3XHVGRjFBXHU2NUU3XHU3RUQzXHU2NzlDXHU1MTk5XHU1NkRFXHU0RjFBXHU4OEFCIGtleUhhc2ggZ2F0ZSBcdTRFMjJcdTVGMDNcdTMwMDJcbiAgICAgICAgICAgIHRyYWlsaW5nLmRlbGV0ZShyb3dJZClcbiAgICAgICAgICAgIGluRmxpZ2h0LmRlbGV0ZShyb3dJZClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB5aWVsZCogc3RhcnRGZXRjaChyb3dJZCwga2V5LCBoLCByZXBsYXlNb2RlLCByZXBsYXlMb2cpXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgIClcblxuICAgIHJldHVybiBFZmZlY3Qudm9pZFxuICB9XG5cbiAgLy8gaW4tZmxpZ2h0IHN0YXRlIChwZXIgZmllbGQpXG4gIGxldCBpbkZsaWdodDpcbiAgICB8IHtcbiAgICAgICAgcmVhZG9ubHkgZ2VuOiBudW1iZXJcbiAgICAgICAgcmVhZG9ubHkgZmliZXI6IEZpYmVyLlJ1bnRpbWVGaWJlcjx2b2lkLCBuZXZlcj5cbiAgICAgICAgcmVhZG9ubHkga2V5SGFzaDogc3RyaW5nXG4gICAgICB9XG4gICAgfCB1bmRlZmluZWRcbiAgbGV0IGdlbiA9IDBcbiAgbGV0IHRyYWlsaW5nOiB7IHJlYWRvbmx5IGtleTogdW5rbm93bjsgcmVhZG9ubHkga2V5SGFzaDogc3RyaW5nIH0gfCB1bmRlZmluZWRcblxuICBjb25zdCBjb25jdXJyZW5jeSA9IChlbnRyeS5tZXRhIGFzIGFueSkuY29uY3VycmVuY3kgYXNcbiAgICB8IFwic3dpdGNoXCJcbiAgICB8IFwiZXhoYXVzdC10cmFpbGluZ1wiXG4gICAgfCB1bmRlZmluZWRcbiAgY29uc3QgbW9kZSA9IGNvbmN1cnJlbmN5ID8/IFwic3dpdGNoXCJcblxuICBjb25zdCBzdGFydEZldGNoID0gKFxuICAgIGtleTogdW5rbm93bixcbiAgICBrZXlIYXNoOiBzdHJpbmcsXG4gICAgcmVwbGF5TW9kZTogXCJsaXZlXCIgfCBcInJlcGxheVwiLFxuICAgIHJlcGxheUxvZzogUmVwbGF5TG9nLlJlcGxheUxvZ1NlcnZpY2UgfCB1bmRlZmluZWQsXG4gICk6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4gPT5cbiAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCB7IG1vZHVsZUlkLCBpbnN0YW5jZUlkIH0gPSBnZXRCb3VuZFNjb3BlKGJvdW5kKVxuXG4gICAgICAvLyAxKSBwZW5kaW5nXHVGRjFBXHU1NDBDXHU2QjY1XHU1MTk5XHU1MTY1IGxvYWRpbmcgc25hcHNob3RcdUZGMDhcdTg0M0RcdTU3MjhcdTVGNTNcdTUyNERcdTRFOEJcdTUyQTFcdTdBOTdcdTUzRTNcdUZGMDlcdTMwMDJcbiAgICAgIGxldCBsb2FkaW5nU25hcHNob3Q6IHVua25vd24gPSBTbmFwc2hvdC5sb2FkaW5nKHsga2V5SGFzaCB9KVxuICAgICAgaWYgKHJlcGxheU1vZGUgPT09IFwicmVwbGF5XCIgJiYgcmVwbGF5TG9nKSB7XG4gICAgICAgIGNvbnN0IHJlcGxheUxvYWRpbmcgPSB5aWVsZCogcmVwbGF5TG9nLmNvbnN1bWVOZXh0UmVzb3VyY2VTbmFwc2hvdCh7XG4gICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICBwaGFzZTogXCJsb2FkaW5nXCIsXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChyZXBsYXlMb2FkaW5nKSB7XG4gICAgICAgICAgbG9hZGluZ1NuYXBzaG90ID0gcmVwbGF5TG9hZGluZy5zbmFwc2hvdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB3cm90ZUxvYWRpbmcgPSB5aWVsZCogc2V0U25hcHNob3RJblR4bihcbiAgICAgICAgYm91bmQsXG4gICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgbG9hZGluZ1NuYXBzaG90LFxuICAgICAgICBcInNvdXJjZTpsb2FkaW5nXCIsXG4gICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OmxvYWRpbmdgLFxuICAgICAgICBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICApXG4gICAgICBpZiAod3JvdGVMb2FkaW5nKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50OiBSZXBsYXlMb2cuUmVwbGF5TG9nRXZlbnQgPSB7XG4gICAgICAgICAgX3RhZzogXCJSZXNvdXJjZVNuYXBzaG90XCIsXG4gICAgICAgICAgcmVzb3VyY2VJZCxcbiAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICBjb25jdXJyZW5jeTogbW9kZSxcbiAgICAgICAgICBwaGFzZTogXCJsb2FkaW5nXCIsXG4gICAgICAgICAgc25hcHNob3Q6IGxvYWRpbmdTbmFwc2hvdCxcbiAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgfVxuICAgICAgICByZWNvcmRSZXBsYXlFdmVudChib3VuZCwgZXZlbnQpXG4gICAgICAgIHlpZWxkKiByZWNvcmRTbmFwc2hvdChyZXBsYXlNb2RlLCByZXBsYXlMb2csIGV2ZW50KVxuICAgICAgfVxuXG4gICAgICAvLyAyKSBJT1x1RkYxQVx1NTcyOFx1NTQwRVx1NTNGMCBmaWJlciBcdTRFMkRcdThGRDBcdTg4NENcdUZGMDhcdTkwN0ZcdTUxNERcdTk2M0JcdTU4NUVcdTVGNTNcdTUyNERcdTRFOEJcdTUyQTFcdUZGMDlcdTMwMDJcbiAgICAgIGNvbnN0IGlvID0gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBpZiAocmVwbGF5TW9kZSA9PT0gXCJyZXBsYXlcIiAmJiByZXBsYXlMb2cpIHtcbiAgICAgICAgICAvLyBcdThCQTkgbG9hZGluZyBcdTYzRDBcdTRFQTRcdTUxNDhcdTUzRUZcdTg5QzFcdUZGMENcdTUxOERcdTkxQ0RcdThENUJcdTdFQzhcdTYwMDFcdUZGMDhcdTRGRERcdTYzMDFcdTIwMUNcdTVGMDJcdTZCNjVcdThENDRcdTZFOTBcdTIwMURcdTc2ODRcdTY1RjZcdTk1RjRcdTdFQkZcdTdFRDNcdTY3ODRcdUZGMDlcdTMwMDJcbiAgICAgICAgICB5aWVsZCogRWZmZWN0LnlpZWxkTm93KClcbiAgICAgICAgICBjb25zdCByZXBsYXllZCA9IHlpZWxkKiByZXBsYXlMb2cuY29uc3VtZU5leHRSZXNvdXJjZVNuYXBzaG90KHtcbiAgICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgaWYgKCFyZXBsYXllZCkgcmV0dXJuIHlpZWxkKiBFZmZlY3Qudm9pZFxuXG4gICAgICAgICAgaWYgKHJlcGxheWVkLnBoYXNlID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICAgICAgX3RhZzogXCJSZXNvdXJjZVNuYXBzaG90XCIsXG4gICAgICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgICAgY29uY3VycmVuY3k6IG1vZGUsXG4gICAgICAgICAgICAgIHBoYXNlOiBcInN1Y2Nlc3NcIixcbiAgICAgICAgICAgICAgc25hcHNob3Q6IHJlcGxheWVkLnNuYXBzaG90LFxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIG1vZHVsZUlkLFxuICAgICAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeWllbGQqIHdyaXRlYmFja0lmQ3VycmVudEtleUhhc2goXG4gICAgICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICAgIHJlcGxheWVkLnNuYXBzaG90LFxuICAgICAgICAgICAgICBcInNvdXJjZTpzdWNjZXNzXCIsXG4gICAgICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OnN1Y2Nlc3NgLFxuICAgICAgICAgICAgICBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0gZWxzZSBpZiAocmVwbGF5ZWQucGhhc2UgPT09IFwiZXJyb3JcIikge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICAgICAgX3RhZzogXCJSZXNvdXJjZVNuYXBzaG90XCIsXG4gICAgICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgICAgY29uY3VycmVuY3k6IG1vZGUsXG4gICAgICAgICAgICAgIHBoYXNlOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgIHNuYXBzaG90OiByZXBsYXllZC5zbmFwc2hvdCxcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkKiB3cml0ZWJhY2tJZkN1cnJlbnRLZXlIYXNoKFxuICAgICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAgICBrZXlIYXNoLFxuICAgICAgICAgICAgICByZXBsYXllZC5zbmFwc2hvdCxcbiAgICAgICAgICAgICAgXCJzb3VyY2U6ZXJyb3JcIixcbiAgICAgICAgICAgICAgYHNvdXJjZToke2ZpZWxkUGF0aH06ZXJyb3JgLFxuICAgICAgICAgICAgICBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YWNrID0geWllbGQqIGdldE1pZGRsZXdhcmVTdGFjaygpXG5cbiAgICAgICAgY29uc3QgcmVnaXN0cnlPcHQgPSB5aWVsZCogRWZmZWN0LnNlcnZpY2VPcHRpb24oXG4gICAgICAgICAgUmVzb3VyY2VJbnRlcm5hbC5SZXNvdXJjZVJlZ2lzdHJ5VGFnLFxuICAgICAgICApXG4gICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gT3B0aW9uLmlzU29tZShyZWdpc3RyeU9wdCkgPyByZWdpc3RyeU9wdC52YWx1ZSA6IHVuZGVmaW5lZFxuICAgICAgICBjb25zdCBzcGVjID0gcmVnaXN0cnk/LnNwZWNzLmdldChyZXNvdXJjZUlkKVxuXG4gICAgICAgIGlmICghc3BlYykge1xuICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvYWRFZmZlY3QgPSAoc3BlYy5sb2FkIGFzIGFueSkoa2V5KSBhcyBFZmZlY3QuRWZmZWN0PGFueSwgYW55LCBhbnk+XG5cbiAgICAgICAgY29uc3QgbWV0YTogYW55ID0ge1xuICAgICAgICAgIG1vZHVsZUlkLFxuICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgIHJlc291cmNlSWQsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgdHJhaXROb2RlSWQ6IHN0ZXAuZGVidWdJbmZvPy5ncmFwaE5vZGVJZCxcbiAgICAgICAgICBzdGVwSWQ6IHN0ZXAuaWQsXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoISh0eXBlb2YgbWV0YS5vcFNlcSA9PT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUobWV0YS5vcFNlcSkpKSB7XG4gICAgICAgICAgY29uc3Qgc2Vzc2lvbk9wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSdW5TZXNzaW9uVGFnKVxuICAgICAgICAgIGlmIChPcHRpb24uaXNTb21lKHNlc3Npb25PcHQpKSB7XG4gICAgICAgICAgICBjb25zdCBzZXFLZXkgPSBpbnN0YW5jZUlkID8/IFwiZ2xvYmFsXCJcbiAgICAgICAgICAgIG1ldGEub3BTZXEgPSBzZXNzaW9uT3B0LnZhbHVlLmxvY2FsLm5leHRTZXEoXCJvcFNlcVwiLCBzZXFLZXkpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3AgPSBFZmZlY3RPcC5tYWtlPGFueSwgYW55LCBhbnk+KHtcbiAgICAgICAgICBraW5kOiBcInRyYWl0LXNvdXJjZVwiLFxuICAgICAgICAgIG5hbWU6IHJlc291cmNlSWQsXG4gICAgICAgICAgZWZmZWN0OiBsb2FkRWZmZWN0LFxuICAgICAgICAgIG1ldGEsXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdChFZmZlY3RPcC5ydW4ob3AsIHN0YWNrKSlcblxuICAgICAgICAvLyAzKSB3cml0ZWJhY2tcdUZGMUFcdTRFRTUga2V5SGFzaCBnYXRlIFx1OTYzMlx1NkI2Mlx1NjVFN1x1N0VEM1x1Njc5Q1x1NTZERVx1NTE5OVx1NTIzMFx1NjVCMCBrZXkgXHU0RTBBXHUzMDAyXG4gICAgICAgIGlmIChleGl0Ll90YWcgPT09IFwiU3VjY2Vzc1wiKSB7XG4gICAgICAgICAgY29uc3Qgc3VjY2Vzc1NuYXBzaG90ID0gU25hcHNob3Quc3VjY2Vzcyh7IGtleUhhc2gsIGRhdGE6IGV4aXQudmFsdWUgfSlcbiAgICAgICAgICBjb25zdCBldmVudDogUmVwbGF5TG9nLlJlcGxheUxvZ0V2ZW50ID0ge1xuICAgICAgICAgICAgX3RhZzogXCJSZXNvdXJjZVNuYXBzaG90XCIsXG4gICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgIGNvbmN1cnJlbmN5OiBtb2RlLFxuICAgICAgICAgICAgcGhhc2U6IFwic3VjY2Vzc1wiLFxuICAgICAgICAgICAgc25hcHNob3Q6IHN1Y2Nlc3NTbmFwc2hvdCxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIG1vZHVsZUlkLFxuICAgICAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgd3JvdGVTdWNjZXNzID0geWllbGQqIHdyaXRlYmFja0lmQ3VycmVudEtleUhhc2goXG4gICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICBzdWNjZXNzU25hcHNob3QsXG4gICAgICAgICAgICBcInNvdXJjZTpzdWNjZXNzXCIsXG4gICAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofTpzdWNjZXNzYCxcbiAgICAgICAgICAgIHN0ZXAuZGVidWdJbmZvPy5ncmFwaE5vZGVJZCxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIClcbiAgICAgICAgICBpZiAod3JvdGVTdWNjZXNzKSB7XG4gICAgICAgICAgICB5aWVsZCogcmVjb3JkU25hcHNob3QocmVwbGF5TW9kZSwgcmVwbGF5TG9nLCBldmVudClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JTbmFwc2hvdCA9IFNuYXBzaG90LmVycm9yKHsga2V5SGFzaCwgZXJyb3I6IGV4aXQuY2F1c2UgfSlcbiAgICAgICAgICBjb25zdCBldmVudDogUmVwbGF5TG9nLlJlcGxheUxvZ0V2ZW50ID0ge1xuICAgICAgICAgICAgX3RhZzogXCJSZXNvdXJjZVNuYXBzaG90XCIsXG4gICAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAga2V5SGFzaCxcbiAgICAgICAgICAgIGNvbmN1cnJlbmN5OiBtb2RlLFxuICAgICAgICAgICAgcGhhc2U6IFwiZXJyb3JcIixcbiAgICAgICAgICAgIHNuYXBzaG90OiBlcnJvclNuYXBzaG90LFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB3cm90ZUVycm9yID0geWllbGQqIHdyaXRlYmFja0lmQ3VycmVudEtleUhhc2goXG4gICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICAgIGtleUhhc2gsXG4gICAgICAgICAgICBlcnJvclNuYXBzaG90LFxuICAgICAgICAgICAgXCJzb3VyY2U6ZXJyb3JcIixcbiAgICAgICAgICAgIGBzb3VyY2U6JHtmaWVsZFBhdGh9OmVycm9yYCxcbiAgICAgICAgICAgIHN0ZXAuZGVidWdJbmZvPy5ncmFwaE5vZGVJZCxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIClcbiAgICAgICAgICBpZiAod3JvdGVFcnJvcikge1xuICAgICAgICAgICAgeWllbGQqIHJlY29yZFNuYXBzaG90KHJlcGxheU1vZGUsIHJlcGxheUxvZywgZXZlbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KS5waXBlKFxuICAgICAgICBFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoKSA9PiBFZmZlY3Qudm9pZCksXG4gICAgICApXG5cbiAgICAgIC8vIFx1NEUwRFx1N0I0OVx1NUY4NSBJTyBcdTVCOENcdTYyMTBcdUZGMUFmb3JrU2NvcGVkIFx1NjMwMlx1NTIzMCBydW50aW1lIHNjb3BlXHVGRjBDXHU0RkREXHU4QkMxXHU1Mzc4XHU4RjdEXHU2NUY2XHU4MUVBXHU1MkE4IGludGVycnVwdFx1MzAwMlxuICAgICAgY29uc3QgZmliZXIgPSB5aWVsZCogRWZmZWN0LmZvcmtTY29wZWQoXG4gICAgICAgIEVmZmVjdC5sb2NhbGx5KFRhc2tSdW5uZXIuaW5TeW5jVHJhbnNhY3Rpb25GaWJlciwgZmFsc2UpKGlvKSxcbiAgICAgIClcbiAgICAgIGNvbnN0IG15R2VuID0gKGdlbiArPSAxKVxuICAgICAgaW5GbGlnaHQgPSB7IGdlbjogbXlHZW4sIGZpYmVyLCBrZXlIYXNoIH1cblxuICAgICAgLy8gaW4tZmxpZ2h0IFx1N0VEM1x1Njc1Rlx1NTQwRVx1NkUwNVx1NzQwNlx1RkYwQ1x1NUU3Nlx1NTcyOCBleGhhdXN0LXRyYWlsaW5nIFx1NkEyMVx1NUYwRlx1NEUwQlx1ODg2NVx1OEREMVx1NEUwMFx1NkIyMSB0cmFpbGluZ1x1MzAwMlxuICAgICAgeWllbGQqIEVmZmVjdC5mb3JrU2NvcGVkKFxuICAgICAgICBFZmZlY3QubG9jYWxseShUYXNrUnVubmVyLmluU3luY1RyYW5zYWN0aW9uRmliZXIsIGZhbHNlKShcbiAgICAgICAgICBGaWJlci5hd2FpdChmaWJlcikucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC56aXBSaWdodChcbiAgICAgICAgICAgICAgRWZmZWN0LnN5bmMoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpbkZsaWdodCAmJiBpbkZsaWdodC5nZW4gPT09IG15R2VuKSB7XG4gICAgICAgICAgICAgICAgICBpbkZsaWdodCA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgRWZmZWN0LnppcFJpZ2h0KFxuICAgICAgICAgICAgICBtb2RlID09PSBcImV4aGF1c3QtdHJhaWxpbmdcIlxuICAgICAgICAgICAgICAgID8gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gdHJhaWxpbmdcbiAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmcgPSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICB5aWVsZCogc3RhcnRGZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQua2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5rZXlIYXNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGF5TW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxheUxvZyxcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiBFZmZlY3Qudm9pZCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoKSA9PiBFZmZlY3Qudm9pZCksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICB9KVxuXG4gICAgcmVnaXN0ZXIoZmllbGRQYXRoLCAoc3RhdGU6IGFueSkgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgeyBtb2R1bGVJZCwgaW5zdGFuY2VJZCB9ID0gZ2V0Qm91bmRTY29wZShib3VuZClcbiAgICAgICAgY29uc3QgcmVwbGF5TW9kZU9wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSZXBsYXlNb2RlQ29uZmlnVGFnKVxuICAgICAgICBjb25zdCByZXBsYXlNb2RlID0gT3B0aW9uLmlzU29tZShyZXBsYXlNb2RlT3B0KSA/IHJlcGxheU1vZGVPcHQudmFsdWUubW9kZSA6IFwibGl2ZVwiXG4gICAgICAgIGNvbnN0IHJlcGxheUxvZ09wdCA9IHlpZWxkKiBFZmZlY3Quc2VydmljZU9wdGlvbihSZXBsYXlMb2cuUmVwbGF5TG9nKVxuICAgICAgICBjb25zdCByZXBsYXlMb2cgPSBPcHRpb24uaXNTb21lKHJlcGxheUxvZ09wdCkgPyByZXBsYXlMb2dPcHQudmFsdWUgOiB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgZm9yY2UgPSB5aWVsZCogRmliZXJSZWYuZ2V0KFRhc2tSdW5uZXIuZm9yY2VTb3VyY2VSZWZyZXNoKVxuXG4gICAgICAgIGxldCBrZXk6IHVua25vd25cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBrZXkgPSAoZW50cnkubWV0YSBhcyBhbnkpLmtleShzdGF0ZSlcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAga2V5ID0gdW5kZWZpbmVkXG4gICAgICAgIH1cblxuICAgICAgLy8gZGV2LW1vZGVcdUZGMUFcdTRGQTZcdTZENEIga2V5U2VsZWN0b3IgXHU3Njg0XHU1QjlFXHU5NjQ1XHU4QkZCXHU1M0Q2XHU4REVGXHU1Rjg0XHU0RTBFXHU1OEYwXHU2NjBFIGRlcHMgXHU3Njg0XHU1REVFXHU1RjAyXHVGRjA4XHU0RUM1XHU1MDVBXHU4QkNBXHU2NUFEXHVGRjBDXHU0RTBEXHU1RjcxXHU1NENEXHU2MjY3XHU4ODRDXHU4QkVEXHU0RTQ5XHVGRjA5XHUzMDAyXG4gICAgICBjb25zdCB0cmFjZUtleSA9IGAke2luc3RhbmNlSWQgPz8gXCJ1bmtub3duXCJ9Ojpzb3VyY2U6OiR7ZmllbGRQYXRofWBcbiAgICAgIGlmIChpc0RldkVudigpICYmICh5aWVsZCogb25jZUluUnVuU2Vzc2lvbihgZGVwc190cmFjZV9zZXR0bGVkOiR7dHJhY2VLZXl9YCkpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdHJhY2VkID0gRGVwc1RyYWNlLnRyYWNlKChzKSA9PiAoZW50cnkubWV0YSBhcyBhbnkpLmtleShzKSwgc3RhdGUpXG4gICAgICAgICAgY29uc3QgZGlmZiA9IERlcHNUcmFjZS5kaWZmRGVwcyhcbiAgICAgICAgICAgICgoZW50cnkubWV0YSBhcyBhbnkpLmRlcHMgPz8gW10pIGFzIFJlYWRvbmx5QXJyYXk8c3RyaW5nPixcbiAgICAgICAgICAgIHRyYWNlZC5yZWFkcyxcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgIHlpZWxkKiBlbWl0RGVwc01pc21hdGNoKHtcbiAgICAgICAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgICAgIGtpbmQ6IFwic291cmNlXCIsXG4gICAgICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICAgICAgZGlmZixcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyB0cmFjaW5nIGZhaWx1cmUgc2hvdWxkIG5ldmVyIGJyZWFrIHJlZnJlc2ggZmxvd1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGtleSBcdTUzRDhcdTdBN0FcdUZGMUFcdTU0MENcdTZCNjUgaWRsZSBcdTZFMDVcdTdBN0FcdUZGMDhcdTVFNzZcdTRFMkRcdTY1QUQgaW4tZmxpZ2h0XHVGRjA5XHUzMDAyXG4gICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGluRmxpZ2h0KSB7XG4gICAgICAgICAgeWllbGQqIEZpYmVyLmludGVycnVwdEZvcmsoaW5GbGlnaHQuZmliZXIpXG4gICAgICAgICAgaW5GbGlnaHQgPSB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgICB0cmFpbGluZyA9IHVuZGVmaW5lZFxuXG4gICAgICAgIGNvbnN0IGlkbGVTbmFwc2hvdCA9IFNuYXBzaG90LmlkbGUoKVxuICAgICAgICBjb25zdCB3cm90ZUlkbGUgPSB5aWVsZCogc2V0U25hcHNob3RJblR4bihcbiAgICAgICAgICBib3VuZCxcbiAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgaWRsZVNuYXBzaG90LFxuICAgICAgICAgIFwic291cmNlOmlkbGVcIixcbiAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofTppZGxlYCxcbiAgICAgICAgICBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgIClcbiAgICAgIGlmICh3cm90ZUlkbGUpIHtcbiAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICBfdGFnOiBcIlJlc291cmNlU25hcHNob3RcIixcbiAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICBrZXlIYXNoOiB1bmRlZmluZWQsXG4gICAgICAgICAgY29uY3VycmVuY3k6IG1vZGUsXG4gICAgICAgICAgcGhhc2U6IFwiaWRsZVwiLFxuICAgICAgICAgIHNuYXBzaG90OiBpZGxlU25hcHNob3QsXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIG1vZHVsZUlkLFxuICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY29yZFJlcGxheUV2ZW50KGJvdW5kLCBldmVudClcbiAgICAgICAgICB5aWVsZCogcmVjb3JkU25hcHNob3QocmVwbGF5TW9kZSwgcmVwbGF5TG9nLCBldmVudClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgaCA9IGhhc2hLZXkoa2V5KVxuXG4gICAgICAvLyBcdTlFRDhcdThCQTRcdThCRURcdTRFNDlcdUZGMUFcdTU0MENcdTRFMDAga2V5SGFzaCBcdTVERjJcdTY3MDlcdTk3NUUgaWRsZSBcdTVGRUJcdTcxNjdcdTY1RjZcdUZGMENyZWZyZXNoIFx1NUMzRFx1OTFDRiBuby1vcFx1RkYwOFx1OTA3Rlx1NTE0RFx1OTFDRFx1NTkwRCBJTy9cdTUxOTlcdTU2REVcdUZGMDlcdTMwMDJcbiAgICAgIC8vIFx1NjYzRVx1NUYwRiByZWZyZXNoIC8gaW52YWxpZGF0ZSBcdTUzRUZcdTkwMUFcdThGQzcgZm9yY2UgXHU3RUQ1XHU4RkM3XHU4QkU1XHU0RjE4XHU1MzE2XHUzMDAyXG4gICAgICBpZiAoIWZvcmNlKSB7XG4gICAgICAgIGlmIChpbkZsaWdodCAmJiBpbkZsaWdodC5rZXlIYXNoID09PSBoKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50U25hcHNob3QgPSBSb3dJZC5nZXRBdFBhdGgoc3RhdGUsIGZpZWxkUGF0aCkgYXMgYW55XG4gICAgICAgIGNvbnN0IGN1cnJlbnRLZXlIYXNoID1cbiAgICAgICAgICBjdXJyZW50U25hcHNob3QgJiYgdHlwZW9mIGN1cnJlbnRTbmFwc2hvdCA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgPyAoY3VycmVudFNuYXBzaG90IGFzIGFueSkua2V5SGFzaFxuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXR1cyA9XG4gICAgICAgICAgY3VycmVudFNuYXBzaG90ICYmIHR5cGVvZiBjdXJyZW50U25hcHNob3QgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgID8gKGN1cnJlbnRTbmFwc2hvdCBhcyBhbnkpLnN0YXR1c1xuICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgaWYgKGN1cnJlbnRTdGF0dXMgJiYgY3VycmVudFN0YXR1cyAhPT0gXCJpZGxlXCIgJiYgY3VycmVudEtleUhhc2ggPT09IGgpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobW9kZSA9PT0gXCJleGhhdXN0LXRyYWlsaW5nXCIgJiYgaW5GbGlnaHQpIHtcbiAgICAgICAgLy8gXHU1RkQ5XHU3ODhDXHU2NUY2XHVGRjFBXHU4QkIwXHU1RjU1IHRyYWlsaW5nXHVGRjBDXHU1RTc2XHU3QUNCXHU1MzczXHU2NkY0XHU2NUIwXHU1MjMwXHU2NzAwXHU2NUIwIGxvYWRpbmdcdUZGMDhcdTY1RTcgaW4tZmxpZ2h0IFx1NTE5OVx1NTZERVx1NEYxQVx1ODhBQiBrZXlIYXNoIGdhdGUgXHU2MkU2XHU0RjRGXHVGRjA5XHUzMDAyXG4gICAgICAgIHRyYWlsaW5nID0geyBrZXksIGtleUhhc2g6IGggfVxuICAgICAgICBjb25zdCBsb2FkaW5nU25hcHNob3QgPSBTbmFwc2hvdC5sb2FkaW5nKHsga2V5SGFzaDogaCB9KVxuICAgICAgICBjb25zdCB3cm90ZUxvYWRpbmcgPSB5aWVsZCogc2V0U25hcHNob3RJblR4bihcbiAgICAgICAgICBib3VuZCxcbiAgICAgICAgICBmaWVsZFBhdGgsXG4gICAgICAgICAgbG9hZGluZ1NuYXBzaG90LFxuICAgICAgICAgIFwic291cmNlOmxvYWRpbmdcIixcbiAgICAgICAgICBgc291cmNlOiR7ZmllbGRQYXRofTpsb2FkaW5nYCxcbiAgICAgICAgICBzdGVwLmRlYnVnSW5mbz8uZ3JhcGhOb2RlSWQsXG4gICAgICAgIClcbiAgICAgIGlmICh3cm90ZUxvYWRpbmcpIHtcbiAgICAgICAgY29uc3QgZXZlbnQ6IFJlcGxheUxvZy5SZXBsYXlMb2dFdmVudCA9IHtcbiAgICAgICAgICBfdGFnOiBcIlJlc291cmNlU25hcHNob3RcIixcbiAgICAgICAgICByZXNvdXJjZUlkLFxuICAgICAgICAgIGZpZWxkUGF0aCxcbiAgICAgICAgICBrZXlIYXNoOiBoLFxuICAgICAgICAgIGNvbmN1cnJlbmN5OiBtb2RlLFxuICAgICAgICAgIHBoYXNlOiBcImxvYWRpbmdcIixcbiAgICAgICAgICBzbmFwc2hvdDogbG9hZGluZ1NuYXBzaG90LFxuICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICBtb2R1bGVJZCxcbiAgICAgICAgICBpbnN0YW5jZUlkLFxuICAgICAgICAgIH1cbiAgICAgICAgICByZWNvcmRSZXBsYXlFdmVudChib3VuZCwgZXZlbnQpXG4gICAgICAgICAgeWllbGQqIHJlY29yZFNuYXBzaG90KHJlcGxheU1vZGUsIHJlcGxheUxvZywgZXZlbnQpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChtb2RlID09PSBcInN3aXRjaFwiICYmIGluRmxpZ2h0KSB7XG4gICAgICAgIHlpZWxkKiBGaWJlci5pbnRlcnJ1cHRGb3JrKGluRmxpZ2h0LmZpYmVyKVxuICAgICAgICBpbkZsaWdodCA9IHVuZGVmaW5lZFxuICAgICAgICB0cmFpbGluZyA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICAvLyBzdGFydCBmZXRjaCAocGVuZGluZyB0eCArIGZvcmsgSU8pXG4gICAgICB5aWVsZCogc3RhcnRGZXRjaChrZXksIGgsIHJlcGxheU1vZGUsIHJlcGxheUxvZylcbiAgICB9KSxcbiAgKVxuXG4gIHJldHVybiBFZmZlY3Qudm9pZFxufVxuIiwgImV4cG9ydCBpbnRlcmZhY2UgRGVwc1RyYWNlUmVzdWx0PFQ+IHtcbiAgcmVhZG9ubHkgdmFsdWU6IFRcbiAgcmVhZG9ubHkgcmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlcHNEaWZmIHtcbiAgcmVhZG9ubHkgcmVhZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBkZWNsYXJlZDogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IG1pc3Npbmc6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSB1bnVzZWQ6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxufVxuXG5jb25zdCBpc1RyYWNlYWJsZU9iamVjdCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG9iamVjdCA9PiB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2VcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdHJ1ZVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4gZmFsc2VcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSByZXR1cm4gZmFsc2VcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRXJyb3IpIHJldHVybiBmYWxzZVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXApIHJldHVybiBmYWxzZVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHJldHVybiBmYWxzZVxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBXZWFrTWFwKSByZXR1cm4gZmFsc2VcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgV2Vha1NldCkgcmV0dXJuIGZhbHNlXG4gIHJldHVybiB0cnVlXG59XG5cbmNvbnN0IHNob3VsZElnbm9yZUtleSA9IChrZXk6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAga2V5ID09PSBcIl9fcHJvdG9fX1wiIHx8IGtleSA9PT0gXCJwcm90b3R5cGVcIiB8fCBrZXkgPT09IFwiY29uc3RydWN0b3JcIlxuXG5jb25zdCBub3JtYWxpemVSZWFkcyA9IChyZWFkczogUmVhZG9ubHlTZXQ8c3RyaW5nPik6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IGFsbCA9IEFycmF5LmZyb20ocmVhZHMpLmZpbHRlcigocCkgPT4gdHlwZW9mIHAgPT09IFwic3RyaW5nXCIgJiYgcC5sZW5ndGggPiAwKVxuICBhbGwuc29ydCgpXG5cbiAgLy8gXHU1M0JCXHU2Mzg5XHU0RTI1XHU2ODNDXHU1MjREXHU3RjAwXHU4REVGXHU1Rjg0XHVGRjA4XHU0RjhCXHU1OTgyXHU1NDBDXHU2NUY2XHU4QkZCXHU0RTg2IHByb2ZpbGUgXHU0RTBFIHByb2ZpbGUuaWQgXHU2NUY2XHVGRjBDXHU1M0VBXHU0RkREXHU3NTU5XHU2NkY0XHU1MTc3XHU0RjUzXHU3Njg0IHByb2ZpbGUuaWRcdUZGMDlcdTMwMDJcbiAgY29uc3QgaXNQcmVmaXggPSAocHJlZml4OiBzdHJpbmcsIGZ1bGw6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBmdWxsICE9PSBwcmVmaXggJiYgZnVsbC5zdGFydHNXaXRoKHByZWZpeCArIFwiLlwiKVxuXG4gIGNvbnN0IHBydW5lZDogQXJyYXk8c3RyaW5nPiA9IFtdXG4gIGZvciAoY29uc3QgcCBvZiBhbGwpIHtcbiAgICBsZXQgaGFzTW9yZVNwZWNpZmljID0gZmFsc2VcbiAgICBmb3IgKGNvbnN0IG90aGVyIG9mIGFsbCkge1xuICAgICAgaWYgKGlzUHJlZml4KHAsIG90aGVyKSkge1xuICAgICAgICBoYXNNb3JlU3BlY2lmaWMgPSB0cnVlXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzTW9yZVNwZWNpZmljKSB7XG4gICAgICBwcnVuZWQucHVzaChwKVxuICAgIH1cbiAgfVxuXG4gIHBydW5lZC5zb3J0KClcbiAgcmV0dXJuIHBydW5lZFxufVxuXG5jb25zdCBjb3ZlcnMgPSAoZGVjbGFyZWQ6IHN0cmluZywgcmVhZDogc3RyaW5nKTogYm9vbGVhbiA9PlxuICBkZWNsYXJlZCA9PT0gcmVhZCB8fCByZWFkLnN0YXJ0c1dpdGgoZGVjbGFyZWQgKyBcIi5cIilcblxuZXhwb3J0IGNvbnN0IGRpZmZEZXBzID0gKFxuICBkZWNsYXJlZDogUmVhZG9ubHlBcnJheTxzdHJpbmc+LFxuICByZWFkczogUmVhZG9ubHlBcnJheTxzdHJpbmc+LFxuKTogRGVwc0RpZmYgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBkZWNsYXJlZExpc3QgPSBBcnJheS5mcm9tKG5ldyBTZXQoZGVjbGFyZWQpKS5maWx0ZXIoKHApID0+IHR5cGVvZiBwID09PSBcInN0cmluZ1wiICYmIHAubGVuZ3RoID4gMClcbiAgZGVjbGFyZWRMaXN0LnNvcnQoKVxuICBjb25zdCByZWFkTGlzdCA9IEFycmF5LmZyb20obmV3IFNldChyZWFkcykpLmZpbHRlcigocCkgPT4gdHlwZW9mIHAgPT09IFwic3RyaW5nXCIgJiYgcC5sZW5ndGggPiAwKVxuICByZWFkTGlzdC5zb3J0KClcblxuICBjb25zdCBtaXNzaW5nID0gcmVhZExpc3QuZmlsdGVyKChyKSA9PiBkZWNsYXJlZExpc3QuZXZlcnkoKGQpID0+ICFjb3ZlcnMoZCwgcikpKVxuICBjb25zdCB1bnVzZWQgPSBkZWNsYXJlZExpc3QuZmlsdGVyKChkKSA9PiByZWFkTGlzdC5ldmVyeSgocikgPT4gIWNvdmVycyhkLCByKSkpXG5cbiAgaWYgKG1pc3NpbmcubGVuZ3RoID09PSAwICYmIHVudXNlZC5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcblxuICByZXR1cm4ge1xuICAgIHJlYWRzOiByZWFkTGlzdCxcbiAgICBkZWNsYXJlZDogZGVjbGFyZWRMaXN0LFxuICAgIG1pc3NpbmcsXG4gICAgdW51c2VkLFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0cmFjZSA9IDxUPihcbiAgZm46IChzdGF0ZTogYW55KSA9PiBULFxuICBzdGF0ZTogdW5rbm93bixcbik6IERlcHNUcmFjZVJlc3VsdDxUPiA9PiB7XG4gIGlmICghaXNUcmFjZWFibGVPYmplY3Qoc3RhdGUpKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IGZuKHN0YXRlIGFzIGFueSksIHJlYWRzOiBbXSB9XG4gIH1cblxuICBjb25zdCByZWFkcyA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbiAgLy8gcGVyLXRyYWNlIGNhY2hlcyB0byBwcmVzZXJ2ZSByZWZlcmVuY2UgaWRlbnRpdHkgd2l0aGluIHRoZSB0cmFjZWQgY2FsbC5cbiAgY29uc3QgcHJveHlDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgYW55Pj4oKVxuICBjb25zdCBwcm94eVRvVGFyZ2V0ID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBvYmplY3Q+KClcblxuICBjb25zdCB3cmFwID0gKHZhbHVlOiB1bmtub3duLCBwYXRoOiBzdHJpbmcpOiB1bmtub3duID0+IHtcbiAgICBpZiAoIWlzVHJhY2VhYmxlT2JqZWN0KHZhbHVlKSkgcmV0dXJuIHZhbHVlXG4gICAgcmV0dXJuIGdldFByb3h5KHZhbHVlIGFzIGFueSwgcGF0aClcbiAgfVxuXG4gIGNvbnN0IHVud3JhcCA9IDxWPih2YWx1ZTogVik6IFYgPT4ge1xuICAgIGlmICh2YWx1ZSAmJiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gcHJveHlUb1RhcmdldC5nZXQodmFsdWUgYXMgYW55KVxuICAgICAgaWYgKHRhcmdldCkgcmV0dXJuIHRhcmdldCBhcyBhbnkgYXMgVlxuICAgIH1cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIGNvbnN0IGdldFByb3h5ID0gKHRhcmdldDogb2JqZWN0LCBiYXNlUGF0aDogc3RyaW5nKTogYW55ID0+IHtcbiAgICBsZXQgYnlQYXRoID0gcHJveHlDYWNoZS5nZXQodGFyZ2V0KVxuICAgIGlmICghYnlQYXRoKSB7XG4gICAgICBieVBhdGggPSBuZXcgTWFwKClcbiAgICAgIHByb3h5Q2FjaGUuc2V0KHRhcmdldCwgYnlQYXRoKVxuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlZCA9IGJ5UGF0aC5nZXQoYmFzZVBhdGgpXG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZFxuXG4gICAgY29uc3QgcmVjb3JkID0gKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKHBhdGgpIHJlYWRzLmFkZChwYXRoKVxuICAgIH1cblxuICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCBhcyBhbnksIHtcbiAgICAgIGdldDogKHQsIHByb3AsIHJlY2VpdmVyKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0LCBwcm9wLCByZWNlaXZlcilcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSBTdHJpbmcocHJvcClcbiAgICAgICAgaWYgKHNob3VsZElnbm9yZUtleShrZXkpKSB7XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHQsIHByb3AsIHJlY2VpdmVyKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbmV4dFBhdGggPSBiYXNlUGF0aCA/IGAke2Jhc2VQYXRofS4ke2tleX1gIDoga2V5XG4gICAgICAgIHJlY29yZChuZXh0UGF0aClcblxuICAgICAgICBjb25zdCB2YWx1ZSA9IFJlZmxlY3QuZ2V0KHQsIHByb3AsIHJlY2VpdmVyKSBhcyB1bmtub3duXG4gICAgICAgIHJldHVybiB3cmFwKHZhbHVlLCBuZXh0UGF0aClcbiAgICAgIH0sXG4gICAgICBoYXM6ICh0LCBwcm9wKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIFJlZmxlY3QuaGFzKHQsIHByb3ApXG4gICAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwcm9wKVxuICAgICAgICBpZiAoIXNob3VsZElnbm9yZUtleShrZXkpKSB7XG4gICAgICAgICAgY29uc3QgbmV4dFBhdGggPSBiYXNlUGF0aCA/IGAke2Jhc2VQYXRofS4ke2tleX1gIDoga2V5XG4gICAgICAgICAgcmVjb3JkKG5leHRQYXRoKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lmhhcyh0LCBwcm9wKVxuICAgICAgfSxcbiAgICAgIG93bktleXM6ICh0KSA9PiB7XG4gICAgICAgIGlmIChiYXNlUGF0aCkgcmVjb3JkKGJhc2VQYXRoKVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKHQpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAodCwgcHJvcCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcHJvcClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXkgPSBTdHJpbmcocHJvcClcbiAgICAgICAgaWYgKCFzaG91bGRJZ25vcmVLZXkoa2V5KSkge1xuICAgICAgICAgIGNvbnN0IG5leHRQYXRoID0gYmFzZVBhdGggPyBgJHtiYXNlUGF0aH0uJHtrZXl9YCA6IGtleVxuICAgICAgICAgIHJlY29yZChuZXh0UGF0aClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgcHJvcClcbiAgICAgIH0sXG4gICAgICBzZXQ6ICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiW2RlcHMtdHJhY2VdIEF0dGVtcHRlZCB0byBtdXRhdGUgc3RhdGUgZHVyaW5nIGRlcHMgdHJhY2luZyAoc3RhdGUgaXMgcmVhZG9ubHkgaW4gZGV2LW1vZGUgZGlhZ25vc3RpY3MpLlwiLFxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgZGVmaW5lUHJvcGVydHk6ICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiW2RlcHMtdHJhY2VdIEF0dGVtcHRlZCB0byBkZWZpbmUgcHJvcGVydHkgb24gc3RhdGUgZHVyaW5nIGRlcHMgdHJhY2luZyAoc3RhdGUgaXMgcmVhZG9ubHkgaW4gZGV2LW1vZGUgZGlhZ25vc3RpY3MpLlwiLFxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6ICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiW2RlcHMtdHJhY2VdIEF0dGVtcHRlZCB0byBkZWxldGUgcHJvcGVydHkgb24gc3RhdGUgZHVyaW5nIGRlcHMgdHJhY2luZyAoc3RhdGUgaXMgcmVhZG9ubHkgaW4gZGV2LW1vZGUgZGlhZ25vc3RpY3MpLlwiLFxuICAgICAgICApXG4gICAgICB9LFxuICAgIH0pXG5cbiAgICBieVBhdGguc2V0KGJhc2VQYXRoLCBwcm94eSlcbiAgICBwcm94eVRvVGFyZ2V0LnNldChwcm94eSwgdGFyZ2V0KVxuICAgIHJldHVybiBwcm94eVxuICB9XG5cbiAgY29uc3Qgcm9vdCA9IGdldFByb3h5KHN0YXRlIGFzIGFueSwgXCJcIilcbiAgY29uc3QgdmFsdWUgPSB1bndyYXAoZm4ocm9vdCkpXG5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZSxcbiAgICByZWFkczogbm9ybWFsaXplUmVhZHMocmVhZHMpLFxuICB9XG59XG5cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVMsUUFBUSxPQUFPLFVBQVUsY0FBYzs7O0FDWWhELElBQU0sb0JBQW9CLENBQUMsVUFBb0M7QUFDN0QsTUFBSSxDQUFDLFNBQVMsT0FBTyxVQUFVLFNBQVUsUUFBTztBQUNoRCxNQUFJLE1BQU0sUUFBUSxLQUFLLEVBQUcsUUFBTztBQUNqQyxNQUFJLGlCQUFpQixLQUFNLFFBQU87QUFDbEMsTUFBSSxpQkFBaUIsT0FBUSxRQUFPO0FBQ3BDLE1BQUksaUJBQWlCLE1BQU8sUUFBTztBQUNuQyxNQUFJLGlCQUFpQixJQUFLLFFBQU87QUFDakMsTUFB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