@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,164 @@
1
+ // @logix/core subpath bundles for @logix/sandbox
2
+
3
+ import {
4
+ record
5
+ } from "./chunk-CVZPRIDB.js";
6
+ import {
7
+ EffectOpMiddlewareTag,
8
+ RunSessionTag,
9
+ make,
10
+ run
11
+ } from "./chunk-A7HLOSO6.js";
12
+
13
+ // ../logix-core/src/internal/runtime/core/FlowRuntime.ts
14
+ import { Effect, Stream, Ref, Option } from "../effect.js";
15
+ var getMiddlewareStack = () => Effect.serviceOption(EffectOpMiddlewareTag).pipe(
16
+ Effect.map((maybe) => Option.isSome(maybe) ? maybe.value.stack : [])
17
+ );
18
+ var getRuntimeScope = (runtime) => {
19
+ if (!runtime) return {};
20
+ if (typeof runtime !== "object" && typeof runtime !== "function") return {};
21
+ const scope = runtime;
22
+ return {
23
+ moduleId: typeof scope.moduleId === "string" ? scope.moduleId : void 0,
24
+ instanceId: typeof scope.instanceId === "string" ? scope.instanceId : void 0
25
+ };
26
+ };
27
+ var resolveEffect = (eff, payload) => typeof eff === "function" ? eff(payload) : eff;
28
+ var make2 = (runtime, runtimeInternals) => {
29
+ const scope = getRuntimeScope(runtime);
30
+ const resolveConcurrencyLimit = () => runtimeInternals ? runtimeInternals.concurrency.resolveConcurrencyPolicy().pipe(
31
+ Effect.map((p) => p.concurrencyLimit)
32
+ ) : Effect.succeed(16);
33
+ const runAsFlowOp = (name, payload, eff, options) => Effect.gen(function* () {
34
+ const stack = yield* getMiddlewareStack();
35
+ const meta = {
36
+ ...options?.meta ?? {},
37
+ policy: options?.policy,
38
+ tags: options?.tags,
39
+ trace: options?.trace,
40
+ moduleId: scope.moduleId,
41
+ instanceId: scope.instanceId
42
+ };
43
+ if (!(typeof meta.opSeq === "number" && Number.isFinite(meta.opSeq))) {
44
+ const sessionOpt = yield* Effect.serviceOption(RunSessionTag);
45
+ if (Option.isSome(sessionOpt)) {
46
+ const key = meta.instanceId ?? "global";
47
+ meta.opSeq = sessionOpt.value.local.nextSeq("opSeq", key);
48
+ }
49
+ }
50
+ const op = make({
51
+ kind: "flow",
52
+ name,
53
+ payload,
54
+ effect: eff,
55
+ meta
56
+ });
57
+ return yield* run(op, stack);
58
+ });
59
+ const runEffect = (eff) => (payload) => resolveEffect(eff, payload);
60
+ const runStreamSequential = (eff, options) => (stream) => Stream.runForEach(
61
+ stream,
62
+ (payload) => runAsFlowOp(
63
+ "flow.run",
64
+ payload,
65
+ runEffect(eff)(payload),
66
+ options
67
+ )
68
+ );
69
+ const runStreamParallel = (eff, options) => (stream) => Effect.gen(function* () {
70
+ const concurrency = yield* resolveConcurrencyLimit();
71
+ return yield* Stream.runDrain(
72
+ stream.pipe(
73
+ Stream.mapEffect(
74
+ (payload) => runAsFlowOp(
75
+ "flow.runParallel",
76
+ payload,
77
+ runEffect(eff)(payload),
78
+ options
79
+ ),
80
+ { concurrency }
81
+ )
82
+ )
83
+ ).pipe(
84
+ Effect.catchAllCause(
85
+ (cause) => record({
86
+ type: "diagnostic",
87
+ moduleId: scope.moduleId,
88
+ instanceId: scope.instanceId,
89
+ code: "flow::unhandled_failure",
90
+ severity: "error",
91
+ message: "Flow watcher (runParallel) failed with an unhandled error.",
92
+ hint: "\u5728 watcher \u5185\u663E\u5F0F\u5904\u7406\u9519\u8BEF\uFF08catch/catchAll\uFF09\u6216\u7528 TaskRunner \u7684 failure \u5199\u56DE\uFF1B\u907F\u514D silent failure\u3002",
93
+ kind: "flow_unhandled_failure",
94
+ trigger: {
95
+ kind: "flow",
96
+ name: "runParallel"
97
+ }
98
+ }).pipe(Effect.zipRight(Effect.failCause(cause)))
99
+ )
100
+ );
101
+ });
102
+ return {
103
+ fromAction: (predicate) => runtime.actions$.pipe(Stream.filter(predicate)),
104
+ fromState: (selector) => runtime.changes(selector),
105
+ debounce: (ms) => (stream) => Stream.debounce(stream, ms),
106
+ throttle: (ms) => (stream) => Stream.throttle(stream, {
107
+ cost: () => 1,
108
+ units: 1,
109
+ duration: ms,
110
+ strategy: "enforce"
111
+ }),
112
+ filter: (predicate) => (stream) => Stream.filter(stream, predicate),
113
+ run: (eff, options) => (stream) => runStreamSequential(eff, options)(stream),
114
+ runParallel: (eff, options) => (stream) => runStreamParallel(eff, options)(stream),
115
+ runLatest: (eff, options) => (stream) => Stream.runDrain(
116
+ Stream.map(
117
+ stream,
118
+ (payload) => runAsFlowOp(
119
+ "flow.runLatest",
120
+ payload,
121
+ runEffect(eff)(payload),
122
+ options
123
+ )
124
+ ).pipe(
125
+ Stream.flatMap((effect) => Stream.fromEffect(effect), {
126
+ switch: true
127
+ })
128
+ )
129
+ ),
130
+ runExhaust: (eff, options) => (stream) => Effect.gen(function* () {
131
+ const concurrency = yield* resolveConcurrencyLimit();
132
+ const busyRef = yield* Ref.make(false);
133
+ const mapper = (payload) => Effect.gen(function* () {
134
+ const acquired = yield* Ref.modify(
135
+ busyRef,
136
+ (busy) => busy ? [false, busy] : [true, true]
137
+ );
138
+ if (!acquired) {
139
+ return;
140
+ }
141
+ try {
142
+ yield* runAsFlowOp(
143
+ "flow.runExhaust",
144
+ payload,
145
+ runEffect(eff)(payload),
146
+ options
147
+ );
148
+ } finally {
149
+ yield* Ref.set(busyRef, false);
150
+ }
151
+ });
152
+ return yield* Stream.runDrain(
153
+ stream.pipe(
154
+ Stream.mapEffect(mapper, { concurrency })
155
+ )
156
+ );
157
+ })
158
+ };
159
+ };
160
+
161
+ export {
162
+ make2 as make
163
+ };
164
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL0Zsb3dSdW50aW1lLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBFZmZlY3QsIFN0cmVhbSwgUmVmLCBPcHRpb24gfSBmcm9tIFwiZWZmZWN0XCJcbmltcG9ydCB0eXBlIHtcbiAgQW55TW9kdWxlU2hhcGUsXG4gIE1vZHVsZVJ1bnRpbWUsXG4gIFN0YXRlT2YsXG4gIEFjdGlvbk9mLFxuICBNb2R1bGVTaGFwZSxcbn0gZnJvbSBcIi4vbW9kdWxlLmpzXCJcbmltcG9ydCB0eXBlICogYXMgTG9naWMgZnJvbSBcIi4vTG9naWNNaWRkbGV3YXJlLmpzXCJcbmltcG9ydCAqIGFzIEVmZmVjdE9wIGZyb20gXCIuLi8uLi8uLi9FZmZlY3RPcC5qc1wiXG5pbXBvcnQgKiBhcyBFZmZlY3RPcENvcmUgZnJvbSBcIi4uL0VmZmVjdE9wQ29yZS5qc1wiXG5pbXBvcnQgeyBSdW5TZXNzaW9uVGFnIH0gZnJvbSBcIi4uLy4uL29ic2VydmFiaWxpdHkvcnVuU2Vzc2lvbi5qc1wiXG5pbXBvcnQgdHlwZSB7IFJ1bnRpbWVJbnRlcm5hbHMgfSBmcm9tIFwiLi9SdW50aW1lSW50ZXJuYWxzLmpzXCJcbmltcG9ydCAqIGFzIERlYnVnIGZyb20gXCIuL0RlYnVnU2luay5qc1wiXG5cbmNvbnN0IGdldE1pZGRsZXdhcmVTdGFjayA9ICgpOiBFZmZlY3QuRWZmZWN0PFxuICBFZmZlY3RPcC5NaWRkbGV3YXJlU3RhY2ssXG4gIG5ldmVyLFxuICBhbnlcbj4gPT5cbiAgRWZmZWN0LnNlcnZpY2VPcHRpb24oRWZmZWN0T3BDb3JlLkVmZmVjdE9wTWlkZGxld2FyZVRhZykucGlwZShcbiAgICBFZmZlY3QubWFwKChtYXliZSkgPT4gKE9wdGlvbi5pc1NvbWUobWF5YmUpID8gbWF5YmUudmFsdWUuc3RhY2sgOiBbXSkpLFxuICApXG5cbmNvbnN0IGdldFJ1bnRpbWVTY29wZSA9IChcbiAgcnVudGltZTogdW5rbm93bixcbik6IHsgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmc7IHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmcgfSA9PiB7XG4gIGlmICghcnVudGltZSkgcmV0dXJuIHt9XG4gIGlmICh0eXBlb2YgcnVudGltZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcnVudGltZSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4ge31cbiAgY29uc3Qgc2NvcGUgPSBydW50aW1lIGFzIHsgcmVhZG9ubHkgbW9kdWxlSWQ/OiB1bmtub3duOyByZWFkb25seSBpbnN0YW5jZUlkPzogdW5rbm93biB9XG4gIHJldHVybiB7XG4gICAgbW9kdWxlSWQ6IHR5cGVvZiBzY29wZS5tb2R1bGVJZCA9PT0gXCJzdHJpbmdcIiA/IHNjb3BlLm1vZHVsZUlkIDogdW5kZWZpbmVkLFxuICAgIGluc3RhbmNlSWQ6IHR5cGVvZiBzY29wZS5pbnN0YW5jZUlkID09PSBcInN0cmluZ1wiID8gc2NvcGUuaW5zdGFuY2VJZCA6IHVuZGVmaW5lZCxcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwaTxTaCBleHRlbmRzIE1vZHVsZVNoYXBlPGFueSwgYW55PiwgUiA9IG5ldmVyPiB7XG4gIHJlYWRvbmx5IGZyb21BY3Rpb246IDxUIGV4dGVuZHMgQWN0aW9uT2Y8U2g+PihcbiAgICBwcmVkaWNhdGU6IChhOiBBY3Rpb25PZjxTaD4pID0+IGEgaXMgVFxuICApID0+IFN0cmVhbS5TdHJlYW08VD5cblxuICByZWFkb25seSBmcm9tU3RhdGU6IDxWPihcbiAgICBzZWxlY3RvcjogKHM6IFN0YXRlT2Y8U2g+KSA9PiBWXG4gICkgPT4gU3RyZWFtLlN0cmVhbTxWPlxuXG4gIHJlYWRvbmx5IGRlYm91bmNlOiA8Vj4oXG4gICAgbXM6IG51bWJlclxuICApID0+IChzdHJlYW06IFN0cmVhbS5TdHJlYW08Vj4pID0+IFN0cmVhbS5TdHJlYW08Vj5cblxuICByZWFkb25seSB0aHJvdHRsZTogPFY+KFxuICAgIG1zOiBudW1iZXJcbiAgKSA9PiAoc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFY+KSA9PiBTdHJlYW0uU3RyZWFtPFY+XG5cbiAgcmVhZG9ubHkgZmlsdGVyOiA8Vj4oXG4gICAgcHJlZGljYXRlOiAodmFsdWU6IFYpID0+IGJvb2xlYW5cbiAgKSA9PiAoc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFY+KSA9PiBTdHJlYW0uU3RyZWFtPFY+XG5cbiAgcmVhZG9ubHkgcnVuOiA8ViwgQSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICBlZmY6XG4gICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICB8ICgocGF5bG9hZDogVikgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICApID0+IChzdHJlYW06IFN0cmVhbS5TdHJlYW08Vj4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgRSwgTG9naWMuRW52PFNoLCBSICYgUjI+PlxuXG4gIHJlYWRvbmx5IHJ1blBhcmFsbGVsOiA8ViwgQSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICBlZmY6XG4gICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICB8ICgocGF5bG9hZDogVikgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICApID0+IChzdHJlYW06IFN0cmVhbS5TdHJlYW08Vj4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgRSwgTG9naWMuRW52PFNoLCBSICYgUjI+PlxuXG4gIHJlYWRvbmx5IHJ1bkxhdGVzdDogPFYsIEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgZWZmOlxuICAgICAgfCBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPlxuICAgICAgfCAoKHBheWxvYWQ6IFYpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICBvcHRpb25zPzogTG9naWMuT3BlcmF0aW9uT3B0aW9ucyxcbiAgKSA9PiAoc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFY+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIEUsIExvZ2ljLkVudjxTaCwgUiAmIFIyPj5cblxuICByZWFkb25seSBydW5FeGhhdXN0OiA8ViwgQSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICBlZmY6XG4gICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICB8ICgocGF5bG9hZDogVikgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICApID0+IChzdHJlYW06IFN0cmVhbS5TdHJlYW08Vj4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgRSwgTG9naWMuRW52PFNoLCBSICYgUjI+PlxufVxuXG5jb25zdCByZXNvbHZlRWZmZWN0ID0gPFQsIFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGUsIFIsIEEsIEU+KFxuICBlZmY6XG4gICAgfCBMb2dpYy5PZjxTaCwgUiwgQSwgRT5cbiAgICB8ICgocGF5bG9hZDogVCkgPT4gTG9naWMuT2Y8U2gsIFIsIEEsIEU+KSxcbiAgcGF5bG9hZDogVFxuKTogTG9naWMuT2Y8U2gsIFIsIEEsIEU+ID0+XG4gIHR5cGVvZiBlZmYgPT09IFwiZnVuY3Rpb25cIlxuICAgID8gKGVmZiBhcyAocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIsIEEsIEU+KShwYXlsb2FkKVxuICAgIDogZWZmXG5cbmV4cG9ydCBjb25zdCBtYWtlID0gPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGUsIFIgPSBuZXZlcj4oXG4gIHJ1bnRpbWU6IE1vZHVsZVJ1bnRpbWU8U3RhdGVPZjxTaD4sIEFjdGlvbk9mPFNoPj4sXG4gIHJ1bnRpbWVJbnRlcm5hbHM/OiBSdW50aW1lSW50ZXJuYWxzLFxuKTogQXBpPFNoLCBSPiA9PiB7XG4gIGNvbnN0IHNjb3BlID0gZ2V0UnVudGltZVNjb3BlKHJ1bnRpbWUpXG4gIGNvbnN0IHJlc29sdmVDb25jdXJyZW5jeUxpbWl0ID0gKCk6IEVmZmVjdC5FZmZlY3Q8XG4gICAgbnVtYmVyIHwgXCJ1bmJvdW5kZWRcIixcbiAgICBuZXZlcixcbiAgICBhbnlcbiAgPiA9PlxuICAgIHJ1bnRpbWVJbnRlcm5hbHNcbiAgICAgID8gcnVudGltZUludGVybmFscy5jb25jdXJyZW5jeS5yZXNvbHZlQ29uY3VycmVuY3lQb2xpY3koKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5tYXAoKHApID0+IHAuY29uY3VycmVuY3lMaW1pdCksXG4gICAgICAgIClcbiAgICAgIDogRWZmZWN0LnN1Y2NlZWQoMTYpXG5cbiAgY29uc3QgcnVuQXNGbG93T3AgPSA8QSwgRSwgUjIsIFY+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXlsb2FkOiBWLFxuICAgIGVmZjogRWZmZWN0LkVmZmVjdDxBLCBFLCBMb2dpYy5FbnY8U2gsIFIgJiBSMj4+LFxuICAgIG9wdGlvbnM/OiBMb2dpYy5PcGVyYXRpb25PcHRpb25zLFxuICApOiBFZmZlY3QuRWZmZWN0PEEsIEUsIExvZ2ljLkVudjxTaCwgUiAmIFIyPj4gPT5cbiAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCBzdGFjayA9IHlpZWxkKiBnZXRNaWRkbGV3YXJlU3RhY2soKVxuICAgICAgY29uc3QgbWV0YTogYW55ID0ge1xuICAgICAgICAuLi4ob3B0aW9ucz8ubWV0YSA/PyB7fSksXG4gICAgICAgIHBvbGljeTogb3B0aW9ucz8ucG9saWN5LFxuICAgICAgICB0YWdzOiBvcHRpb25zPy50YWdzLFxuICAgICAgICB0cmFjZTogb3B0aW9ucz8udHJhY2UsXG4gICAgICAgIG1vZHVsZUlkOiBzY29wZS5tb2R1bGVJZCxcbiAgICAgICAgaW5zdGFuY2VJZDogc2NvcGUuaW5zdGFuY2VJZCxcbiAgICAgIH1cblxuICAgICAgaWYgKCEodHlwZW9mIG1ldGEub3BTZXEgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKG1ldGEub3BTZXEpKSkge1xuICAgICAgICBjb25zdCBzZXNzaW9uT3B0ID0geWllbGQqIEVmZmVjdC5zZXJ2aWNlT3B0aW9uKFJ1blNlc3Npb25UYWcpXG4gICAgICAgIGlmIChPcHRpb24uaXNTb21lKHNlc3Npb25PcHQpKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gbWV0YS5pbnN0YW5jZUlkID8/IFwiZ2xvYmFsXCJcbiAgICAgICAgICBtZXRhLm9wU2VxID0gc2Vzc2lvbk9wdC52YWx1ZS5sb2NhbC5uZXh0U2VxKFwib3BTZXFcIiwga2V5KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wID0gRWZmZWN0T3AubWFrZTxBLCBFLCBhbnk+KHtcbiAgICAgICAga2luZDogXCJmbG93XCIsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGVmZmVjdDogZWZmIGFzIGFueSxcbiAgICAgICAgbWV0YSxcbiAgICAgIH0pXG4gICAgICByZXR1cm4geWllbGQqIEVmZmVjdE9wLnJ1bihvcCwgc3RhY2spXG4gICAgfSkgYXMgYW55XG5cbiAgY29uc3QgcnVuRWZmZWN0ID1cbiAgICA8VCwgQSwgRSwgUjI+KFxuICAgICAgZWZmOlxuICAgICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICAgIHwgKChwYXlsb2FkOiBUKSA9PiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPilcbiAgICApID0+XG4gICAgICAocGF5bG9hZDogVCkgPT5cbiAgICAgICAgcmVzb2x2ZUVmZmVjdDxULCBTaCwgUiAmIFIyLCBBLCBFPihlZmYsIHBheWxvYWQpXG5cbiAgY29uc3QgcnVuU3RyZWFtU2VxdWVudGlhbCA9IDxULCBBLCBFLCBSMj4oXG4gICAgZWZmOlxuICAgICAgfCBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPlxuICAgICAgfCAoKHBheWxvYWQ6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICBvcHRpb25zPzogTG9naWMuT3BlcmF0aW9uT3B0aW9ucyxcbiAgKSA9PiAoc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFQ+KTogRWZmZWN0LkVmZmVjdDx2b2lkLCBFLCBMb2dpYy5FbnY8U2gsIFIgJiBSMj4+ID0+XG4gICAgU3RyZWFtLnJ1bkZvckVhY2goc3RyZWFtLCAocGF5bG9hZCkgPT5cbiAgICAgIHJ1bkFzRmxvd09wPEEsIEUsIFIyLCBUPihcbiAgICAgICAgXCJmbG93LnJ1blwiLFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBydW5FZmZlY3Q8VCwgQSwgRSwgUjI+KGVmZikocGF5bG9hZCksXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApLFxuICAgIClcblxuICBjb25zdCBydW5TdHJlYW1QYXJhbGxlbCA9IDxULCBBLCBFLCBSMj4oXG4gICAgZWZmOlxuICAgICAgfCBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPlxuICAgICAgfCAoKHBheWxvYWQ6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICBvcHRpb25zPzogTG9naWMuT3BlcmF0aW9uT3B0aW9ucyxcbiAgKSA9PiAoc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFQ+KTogRWZmZWN0LkVmZmVjdDx2b2lkLCBFLCBMb2dpYy5FbnY8U2gsIFIgJiBSMj4+ID0+XG4gICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgY29uY3VycmVuY3kgPSB5aWVsZCogcmVzb2x2ZUNvbmN1cnJlbmN5TGltaXQoKVxuXG4gICAgICByZXR1cm4geWllbGQqIFN0cmVhbS5ydW5EcmFpbihcbiAgICAgICAgc3RyZWFtLnBpcGUoXG4gICAgICAgICAgU3RyZWFtLm1hcEVmZmVjdChcbiAgICAgICAgICAgIChwYXlsb2FkKSA9PlxuICAgICAgICAgICAgICBydW5Bc0Zsb3dPcDxBLCBFLCBSMiwgVD4oXG4gICAgICAgICAgICAgICAgXCJmbG93LnJ1blBhcmFsbGVsXCIsXG4gICAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICAgICBydW5FZmZlY3Q8VCwgQSwgRSwgUjI+KGVmZikocGF5bG9hZCksXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHsgY29uY3VycmVuY3kgfSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKS5waXBlKFxuICAgICAgICBFZmZlY3QuY2F0Y2hBbGxDYXVzZSgoY2F1c2UpID0+XG4gICAgICAgICAgRGVidWcucmVjb3JkKHtcbiAgICAgICAgICAgIHR5cGU6IFwiZGlhZ25vc3RpY1wiLFxuICAgICAgICAgICAgbW9kdWxlSWQ6IHNjb3BlLm1vZHVsZUlkLFxuICAgICAgICAgICAgaW5zdGFuY2VJZDogc2NvcGUuaW5zdGFuY2VJZCxcbiAgICAgICAgICAgIGNvZGU6IFwiZmxvdzo6dW5oYW5kbGVkX2ZhaWx1cmVcIixcbiAgICAgICAgICAgIHNldmVyaXR5OiBcImVycm9yXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBcIkZsb3cgd2F0Y2hlciAocnVuUGFyYWxsZWwpIGZhaWxlZCB3aXRoIGFuIHVuaGFuZGxlZCBlcnJvci5cIixcbiAgICAgICAgICAgIGhpbnQ6XG4gICAgICAgICAgICAgIFwiXHU1NzI4IHdhdGNoZXIgXHU1MTg1XHU2NjNFXHU1RjBGXHU1OTA0XHU3NDA2XHU5NTE5XHU4QkVGXHVGRjA4Y2F0Y2gvY2F0Y2hBbGxcdUZGMDlcdTYyMTZcdTc1MjggVGFza1J1bm5lciBcdTc2ODQgZmFpbHVyZSBcdTUxOTlcdTU2REVcdUZGMUJcdTkwN0ZcdTUxNEQgc2lsZW50IGZhaWx1cmVcdTMwMDJcIixcbiAgICAgICAgICAgIGtpbmQ6IFwiZmxvd191bmhhbmRsZWRfZmFpbHVyZVwiLFxuICAgICAgICAgICAgdHJpZ2dlcjoge1xuICAgICAgICAgICAgICBraW5kOiBcImZsb3dcIixcbiAgICAgICAgICAgICAgbmFtZTogXCJydW5QYXJhbGxlbFwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KS5waXBlKEVmZmVjdC56aXBSaWdodChFZmZlY3QuZmFpbENhdXNlKGNhdXNlKSkpLFxuICAgICAgICApLFxuICAgICAgKVxuICAgIH0pIGFzIGFueVxuXG4gIHJldHVybiB7XG4gICAgZnJvbUFjdGlvbjogPFQgZXh0ZW5kcyBBY3Rpb25PZjxTaD4+KFxuICAgICAgcHJlZGljYXRlOiAoYTogQWN0aW9uT2Y8U2g+KSA9PiBhIGlzIFRcbiAgICApID0+IHJ1bnRpbWUuYWN0aW9ucyQucGlwZShTdHJlYW0uZmlsdGVyKHByZWRpY2F0ZSkpLFxuXG4gICAgZnJvbVN0YXRlOiA8Vj4oc2VsZWN0b3I6IChzOiBTdGF0ZU9mPFNoPikgPT4gVikgPT5cbiAgICAgIHJ1bnRpbWUuY2hhbmdlcyhzZWxlY3RvciksXG5cbiAgICBkZWJvdW5jZTogKG1zOiBudW1iZXIpID0+IChzdHJlYW0pID0+IFN0cmVhbS5kZWJvdW5jZShzdHJlYW0sIG1zKSxcblxuICAgIHRocm90dGxlOiAobXM6IG51bWJlcikgPT4gKHN0cmVhbSkgPT5cbiAgICAgIFN0cmVhbS50aHJvdHRsZShzdHJlYW0sIHtcbiAgICAgICAgY29zdDogKCkgPT4gMSxcbiAgICAgICAgdW5pdHM6IDEsXG4gICAgICAgIGR1cmF0aW9uOiBtcyxcbiAgICAgICAgc3RyYXRlZ3k6IFwiZW5mb3JjZVwiLFxuICAgICAgfSksXG5cbiAgICBmaWx0ZXI6IChwcmVkaWNhdGU6ICh2YWx1ZTogYW55KSA9PiBib29sZWFuKSA9PiAoc3RyZWFtKSA9PlxuICAgICAgU3RyZWFtLmZpbHRlcihzdHJlYW0sIHByZWRpY2F0ZSksXG5cbiAgICBydW46IChlZmYsIG9wdGlvbnMpID0+IChzdHJlYW0pID0+XG4gICAgICBydW5TdHJlYW1TZXF1ZW50aWFsPGFueSwgYW55LCBhbnksIGFueT4oZWZmLCBvcHRpb25zKShzdHJlYW0pLFxuXG4gICAgcnVuUGFyYWxsZWw6IChlZmYsIG9wdGlvbnMpID0+IChzdHJlYW0pID0+XG4gICAgICBydW5TdHJlYW1QYXJhbGxlbDxhbnksIGFueSwgYW55LCBhbnk+KGVmZiwgb3B0aW9ucykoc3RyZWFtKSxcblxuICAgIHJ1bkxhdGVzdDogKGVmZiwgb3B0aW9ucykgPT4gKHN0cmVhbSkgPT5cbiAgICAgIFN0cmVhbS5ydW5EcmFpbihcbiAgICAgICAgU3RyZWFtLm1hcChzdHJlYW0sIChwYXlsb2FkKSA9PlxuICAgICAgICAgIHJ1bkFzRmxvd09wPGFueSwgYW55LCBhbnksIGFueT4oXG4gICAgICAgICAgICBcImZsb3cucnVuTGF0ZXN0XCIsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgcnVuRWZmZWN0PGFueSwgYW55LCBhbnksIGFueT4oZWZmKShwYXlsb2FkKSxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgKVxuICAgICAgICApLnBpcGUoXG4gICAgICAgICAgU3RyZWFtLmZsYXRNYXAoKGVmZmVjdCkgPT4gU3RyZWFtLmZyb21FZmZlY3QoZWZmZWN0KSwge1xuICAgICAgICAgICAgc3dpdGNoOiB0cnVlLFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICksXG5cbiAgICBydW5FeGhhdXN0OiAoZWZmLCBvcHRpb25zKSA9PiAoc3RyZWFtKSA9PlxuICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBjb25jdXJyZW5jeSA9IHlpZWxkKiByZXNvbHZlQ29uY3VycmVuY3lMaW1pdCgpXG4gICAgICAgIGNvbnN0IGJ1c3lSZWYgPSB5aWVsZCogUmVmLm1ha2UoZmFsc2UpXG4gICAgICAgIGNvbnN0IG1hcHBlciA9IChwYXlsb2FkOiBhbnkpID0+XG4gICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgYWNxdWlyZWQgPSB5aWVsZCogUmVmLm1vZGlmeShidXN5UmVmLCAoYnVzeSkgPT5cbiAgICAgICAgICAgICAgYnVzeSA/IChbZmFsc2UsIGJ1c3ldIGFzIGNvbnN0KSA6IChbdHJ1ZSwgdHJ1ZV0gYXMgY29uc3QpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoIWFjcXVpcmVkKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgeWllbGQqIHJ1bkFzRmxvd09wPGFueSwgYW55LCBhbnksIGFueT4oXG4gICAgICAgICAgICAgICAgXCJmbG93LnJ1bkV4aGF1c3RcIixcbiAgICAgICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgICAgIHJ1bkVmZmVjdDxhbnksIGFueSwgYW55LCBhbnk+KGVmZikocGF5bG9hZCksXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgeWllbGQqIFJlZi5zZXQoYnVzeVJlZiwgZmFsc2UpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4geWllbGQqIFN0cmVhbS5ydW5EcmFpbihcbiAgICAgICAgICBzdHJlYW0ucGlwZShcbiAgICAgICAgICAgIFN0cmVhbS5tYXBFZmZlY3QobWFwcGVyLCB7IGNvbmN1cnJlbmN5IH0pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICB9KSxcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7OztBQUFBLFNBQVMsUUFBUSxRQUFRLEtBQUssY0FBYztBQWU1QyxJQUFNLHFCQUFxQixNQUt6QixPQUFPLGNBQTJCLHFCQUFxQixFQUFFO0FBQUEsRUFDdkQsT0FBTyxJQUFJLENBQUMsVUFBVyxPQUFPLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxRQUFRLENBQUMsQ0FBRTtBQUN2RTtBQUVGLElBQU0sa0JBQWtCLENBQ3RCLFlBQ2lFO0FBQ2pFLE1BQUksQ0FBQyxRQUFTLFFBQU8sQ0FBQztBQUN0QixNQUFJLE9BQU8sWUFBWSxZQUFZLE9BQU8sWUFBWSxXQUFZLFFBQU8sQ0FBQztBQUMxRSxRQUFNLFFBQVE7QUFDZCxTQUFPO0FBQUEsSUFDTCxVQUFVLE9BQU8sTUFBTSxhQUFhLFdBQVcsTUFBTSxXQUFXO0FBQUEsSUFDaEUsWUFBWSxPQUFPLE1BQU0sZUFBZSxXQUFXLE1BQU0sYUFBYTtBQUFBLEVBQ3hFO0FBQ0Y7QUFvREEsSUFBTSxnQkFBZ0IsQ0FDcEIsS0FHQSxZQUVBLE9BQU8sUUFBUSxhQUNWLElBQXdDLE9BQU8sSUFDaEQ7QUFFQyxJQUFNQSxRQUFPLENBQ2xCLFNBQ0EscUJBQ2U7QUFDZixRQUFNLFFBQVEsZ0JBQWdCLE9BQU87QUFDckMsUUFBTSwwQkFBMEIsTUFLOUIsbUJBQ0ksaUJBQWlCLFlBQVkseUJBQXlCLEVBQUU7QUFBQSxJQUN0RCxPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCO0FBQUEsRUFDdEMsSUFDQSxPQUFPLFFBQVEsRUFBRTtBQUV2QixRQUFNLGNBQWMsQ0FDbEIsTUFDQSxTQUNBLEtBQ0EsWUFFQSxPQUFPLElBQUksYUFBYTtBQUN0QixVQUFNLFFBQVEsT0FBTyxtQkFBbUI7QUFDeEMsVUFBTSxPQUFZO0FBQUEsTUFDaEIsR0FBSSxTQUFTLFFBQVEsQ0FBQztBQUFBLE1BQ3RCLFFBQVEsU0FBUztBQUFBLE1BQ2pCLE1BQU0sU0FBUztBQUFBLE1BQ2YsT0FBTyxTQUFTO0FBQUEsTUFDaEIsVUFBVSxNQUFNO0FBQUEsTUFDaEIsWUFBWSxNQUFNO0FBQUEsSUFDcEI7QUFFQSxRQUFJLEVBQUUsT0FBTyxLQUFLLFVBQVUsWUFBWSxPQUFPLFNBQVMsS0FBSyxLQUFLLElBQUk7QUFDcEUsWUFBTSxhQUFhLE9BQU8sT0FBTyxjQUFjLGFBQWE7QUFDNUQsVUFBSSxPQUFPLE9BQU8sVUFBVSxHQUFHO0FBQzdCLGNBQU0sTUFBTSxLQUFLLGNBQWM7QUFDL0IsYUFBSyxRQUFRLFdBQVcsTUFBTSxNQUFNLFFBQVEsU0FBUyxHQUFHO0FBQUEsTUFDMUQ7QUFBQSxJQUNGO0FBRUEsVUFBTSxLQUFjLEtBQWdCO0FBQUEsTUFDbEMsTUFBTTtBQUFBLE1BQ047QUFBQSxNQUNBO0FBQUEsTUFDQSxRQUFRO0FBQUEsTUFDUjtBQUFBLElBQ0YsQ0FBQztBQUNELFdBQU8sT0FBZ0IsSUFBSSxJQUFJLEtBQUs7QUFBQSxFQUN0QyxDQUFDO0FBRUgsUUFBTSxZQUNKLENBQ0UsUUFJQSxDQUFDLFlBQ0MsY0FBbUMsS0FBSyxPQUFPO0FBRXJELFFBQU0sc0JBQXNCLENBQzFCLEtBR0EsWUFDRyxDQUFDLFdBQ0osT0FBTztBQUFBLElBQVc7QUFBQSxJQUFRLENBQUMsWUFDekI7QUFBQSxNQUNFO0FBQUEsTUFDQTtBQUFBLE1BQ0EsVUFBdUIsR0FBRyxFQUFFLE9BQU87QUFBQSxNQUNuQztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUYsUUFBTSxvQkFBb0IsQ0FDeEIsS0FHQSxZQUNHLENBQUMsV0FDSixPQUFPLElBQUksYUFBYTtBQUN0QixVQUFNLGNBQWMsT0FBTyx3QkFBd0I7QUFFbkQsV0FBTyxPQUFPLE9BQU87QUFBQSxNQUNuQixPQUFPO0FBQUEsUUFDTCxPQUFPO0FBQUEsVUFDTCxDQUFDLFlBQ0M7QUFBQSxZQUNFO0FBQUEsWUFDQTtBQUFBLFlBQ0EsVUFBdUIsR0FBRyxFQUFFLE9BQU87QUFBQSxZQUNuQztBQUFBLFVBQ0Y7QUFBQSxVQUNGLEVBQUUsWUFBWTtBQUFBLFFBQ2hCO0FBQUEsTUFDRjtBQUFBLElBQ0YsRUFBRTtBQUFBLE1BQ0EsT0FBTztBQUFBLFFBQWMsQ0FBQyxVQUNkLE9BQU87QUFBQSxVQUNYLE1BQU07QUFBQSxVQUNOLFVBQVUsTUFBTTtBQUFBLFVBQ2hCLFlBQVksTUFBTTtBQUFBLFVBQ2xCLE1BQU07QUFBQSxVQUNOLFVBQVU7QUFBQSxVQUNWLFNBQVM7QUFBQSxVQUNULE1BQ0U7QUFBQSxVQUNGLE1BQU07QUFBQSxVQUNOLFNBQVM7QUFBQSxZQUNQLE1BQU07QUFBQSxZQUNOLE1BQU07QUFBQSxVQUNSO0FBQUEsUUFDRixDQUFDLEVBQUUsS0FBSyxPQUFPLFNBQVMsT0FBTyxVQUFVLEtBQUssQ0FBQyxDQUFDO0FBQUEsTUFDbEQ7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBRUgsU0FBTztBQUFBLElBQ0wsWUFBWSxDQUNWLGNBQ0csUUFBUSxTQUFTLEtBQUssT0FBTyxPQUFPLFNBQVMsQ0FBQztBQUFBLElBRW5ELFdBQVcsQ0FBSSxhQUNiLFFBQVEsUUFBUSxRQUFRO0FBQUEsSUFFMUIsVUFBVSxDQUFDLE9BQWUsQ0FBQyxXQUFXLE9BQU8sU0FBUyxRQUFRLEVBQUU7QUFBQSxJQUVoRSxVQUFVLENBQUMsT0FBZSxDQUFDLFdBQ3pCLE9BQU8sU0FBUyxRQUFRO0FBQUEsTUFDdEIsTUFBTSxNQUFNO0FBQUEsTUFDWixPQUFPO0FBQUEsTUFDUCxVQUFVO0FBQUEsTUFDVixVQUFVO0FBQUEsSUFDWixDQUFDO0FBQUEsSUFFSCxRQUFRLENBQUMsY0FBdUMsQ0FBQyxXQUMvQyxPQUFPLE9BQU8sUUFBUSxTQUFTO0FBQUEsSUFFakMsS0FBSyxDQUFDLEtBQUssWUFBWSxDQUFDLFdBQ3RCLG9CQUF3QyxLQUFLLE9BQU8sRUFBRSxNQUFNO0FBQUEsSUFFOUQsYUFBYSxDQUFDLEtBQUssWUFBWSxDQUFDLFdBQzlCLGtCQUFzQyxLQUFLLE9BQU8sRUFBRSxNQUFNO0FBQUEsSUFFNUQsV0FBVyxDQUFDLEtBQUssWUFBWSxDQUFDLFdBQzVCLE9BQU87QUFBQSxNQUNMLE9BQU87QUFBQSxRQUFJO0FBQUEsUUFBUSxDQUFDLFlBQ2xCO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxVQUNBLFVBQThCLEdBQUcsRUFBRSxPQUFPO0FBQUEsVUFDMUM7QUFBQSxRQUNGO0FBQUEsTUFDRixFQUFFO0FBQUEsUUFDQSxPQUFPLFFBQVEsQ0FBQyxXQUFXLE9BQU8sV0FBVyxNQUFNLEdBQUc7QUFBQSxVQUNwRCxRQUFRO0FBQUEsUUFDVixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFBQSxJQUVGLFlBQVksQ0FBQyxLQUFLLFlBQVksQ0FBQyxXQUM3QixPQUFPLElBQUksYUFBYTtBQUN0QixZQUFNLGNBQWMsT0FBTyx3QkFBd0I7QUFDbkQsWUFBTSxVQUFVLE9BQU8sSUFBSSxLQUFLLEtBQUs7QUFDckMsWUFBTSxTQUFTLENBQUMsWUFDZCxPQUFPLElBQUksYUFBYTtBQUN0QixjQUFNLFdBQVcsT0FBTyxJQUFJO0FBQUEsVUFBTztBQUFBLFVBQVMsQ0FBQyxTQUMzQyxPQUFRLENBQUMsT0FBTyxJQUFJLElBQWUsQ0FBQyxNQUFNLElBQUk7QUFBQSxRQUNoRDtBQUNBLFlBQUksQ0FBQyxVQUFVO0FBQ2I7QUFBQSxRQUNGO0FBQ0EsWUFBSTtBQUNGLGlCQUFPO0FBQUEsWUFDTDtBQUFBLFlBQ0E7QUFBQSxZQUNBLFVBQThCLEdBQUcsRUFBRSxPQUFPO0FBQUEsWUFDMUM7QUFBQSxVQUNGO0FBQUEsUUFDRixVQUFFO0FBQ0EsaUJBQU8sSUFBSSxJQUFJLFNBQVMsS0FBSztBQUFBLFFBQy9CO0FBQUEsTUFDRixDQUFDO0FBRUgsYUFBTyxPQUFPLE9BQU87QUFBQSxRQUNuQixPQUFPO0FBQUEsVUFDTCxPQUFPLFVBQVUsUUFBUSxFQUFFLFlBQVksQ0FBQztBQUFBLFFBQzFDO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0w7QUFDRjsiLAogICJuYW1lcyI6IFsibWFrZSJdCn0K
@@ -323,12 +323,12 @@ var RowIdStore = class {
323
323
  list.push(path);
324
324
  childrenByParent.set(parent, list);
325
325
  }
326
- const roots = (childrenByParent.get(void 0) ?? []).slice().sort((a, b) => a.localeCompare(b));
326
+ const roots = (childrenByParent.get(void 0) ?? []).slice().sort();
327
327
  const visit = (listPath, parentRowId, listValue) => {
328
328
  const cfg = cfgByPath.get(listPath);
329
329
  const items = Array.isArray(listValue) ? listValue : [];
330
330
  const ids = this.ensureList(listPath, items, cfg?.trackBy, parentRowId);
331
- const children = (childrenByParent.get(listPath) ?? []).slice().sort((a, b) => a.localeCompare(b));
331
+ const children = (childrenByParent.get(listPath) ?? []).slice().sort();
332
332
  if (children.length === 0) return;
333
333
  for (let i = 0; i < items.length; i++) {
334
334
  const row = items[i];
@@ -387,4 +387,4 @@ export {
387
387
  RowIdStore,
388
388
  collectListConfigs
389
389
  };
390
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvc3RhdGUtdHJhaXQvcm93aWQudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL1JlcGxheUxvZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHR5cGUgUm93SWQgPSBzdHJpbmdcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0Q29uZmlnIHtcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nXG4gIHJlYWRvbmx5IHRyYWNrQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgTGlzdFJlbW92YWxMaXN0ZW5lciA9IChyb3dJZDogUm93SWQpID0+IHZvaWRcblxudHlwZSBTZWdtZW50ID0gc3RyaW5nIHwgbnVtYmVyXG5cbmNvbnN0IHBhcnNlU2VnbWVudHMgPSAocGF0aDogc3RyaW5nKTogUmVhZG9ubHlBcnJheTxTZWdtZW50PiA9PiB7XG4gIGlmICghcGF0aCkgcmV0dXJuIFtdXG4gIHJldHVybiBwYXRoLnNwbGl0KCcuJykubWFwKChzZWcpID0+ICgvXlswLTldKyQvLnRlc3Qoc2VnKSA/IE51bWJlcihzZWcpIDogc2VnKSlcbn1cblxuZXhwb3J0IGNvbnN0IGdldEF0UGF0aCA9IChzdGF0ZTogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkgPT4ge1xuICBpZiAoIXBhdGggfHwgc3RhdGUgPT0gbnVsbCkgcmV0dXJuIHN0YXRlXG4gIGNvbnN0IHNlZ21lbnRzID0gcGFyc2VTZWdtZW50cyhwYXRoKVxuICBsZXQgY3VycmVudDogYW55ID0gc3RhdGVcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2VnbWVudHMpIHtcbiAgICBpZiAoY3VycmVudCA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgaWYgKHR5cGVvZiBzZWcgPT09ICdudW1iZXInKSB7XG4gICAgICBjdXJyZW50ID0gQXJyYXkuaXNBcnJheShjdXJyZW50KSA/IGN1cnJlbnRbc2VnXSA6IGN1cnJlbnRbU3RyaW5nKHNlZyldXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtzZWddXG4gIH1cbiAgcmV0dXJuIGN1cnJlbnRcbn1cblxuZXhwb3J0IGNvbnN0IHNldEF0UGF0aE11dGF0aW5nID0gKGRyYWZ0OiB1bmtub3duLCBwYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gIGlmICghcGF0aCkgcmV0dXJuXG4gIGNvbnN0IHNlZ21lbnRzID0gcGFyc2VTZWdtZW50cyhwYXRoKVxuICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBsZXQgY3VycmVudDogYW55ID0gZHJhZnRcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBzZWdtZW50c1tpXSFcbiAgICBjb25zdCBuZXh0S2V5ID0gc2VnbWVudHNbaSArIDFdIVxuXG4gICAgY29uc3QgbmV4dCA9IGN1cnJlbnQ/LltrZXkgYXMgYW55XVxuICAgIGlmIChuZXh0ID09IG51bGwgfHwgdHlwZW9mIG5leHQgIT09ICdvYmplY3QnKSB7XG4gICAgICBjdXJyZW50W2tleSBhcyBhbnldID0gdHlwZW9mIG5leHRLZXkgPT09ICdudW1iZXInID8gW10gOiB7fVxuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXkgYXMgYW55XVxuICB9XG5cbiAgY29uc3QgbGFzdCA9IHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdIVxuICBjdXJyZW50W2xhc3QgYXMgYW55XSA9IHZhbHVlXG59XG5cbmV4cG9ydCBjb25zdCB1bnNldEF0UGF0aE11dGF0aW5nID0gKGRyYWZ0OiB1bmtub3duLCBwYXRoOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgaWYgKCFwYXRoKSByZXR1cm5cbiAgY29uc3Qgc2VnbWVudHMgPSBwYXJzZVNlZ21lbnRzKHBhdGgpXG4gIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGxldCBjdXJyZW50OiBhbnkgPSBkcmFmdFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IHNlZ21lbnRzW2ldIVxuICAgIGNvbnN0IG5leHQgPSBjdXJyZW50Py5ba2V5IGFzIGFueV1cbiAgICBpZiAobmV4dCA9PSBudWxsIHx8IHR5cGVvZiBuZXh0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGN1cnJlbnQgPSBuZXh0XG4gIH1cblxuICBjb25zdCBsYXN0ID0gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0hXG4gIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpICYmIHR5cGVvZiBsYXN0ID09PSAnbnVtYmVyJykge1xuICAgIGN1cnJlbnRbbGFzdF0gPSB1bmRlZmluZWRcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSAnb2JqZWN0Jykge1xuICAgIGRlbGV0ZSBjdXJyZW50W2xhc3QgYXMgYW55XVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBqb2luUGF0aCA9IChwcmVmaXg6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXByZWZpeCkgcmV0dXJuIHN1ZmZpeFxuICBpZiAoIXN1ZmZpeCkgcmV0dXJuIHByZWZpeFxuICByZXR1cm4gYCR7cHJlZml4fS4ke3N1ZmZpeH1gXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEl0ZW1GaWVsZFBhdGgge1xuICByZWFkb25seSBsaXN0UGF0aDogc3RyaW5nXG4gIHJlYWRvbmx5IGl0ZW1QYXRoOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBwYXJzZUxpc3RJdGVtRmllbGRQYXRoXHVGRjFBXG4gKiAtIFJlY29nbml6ZSBhIGxpc3QuaXRlbSBmaWVsZCBwYXRoIGxpa2UgXCJpdGVtc1tdLnByb2ZpbGVSZXNvdXJjZVwiLlxuICogLSBTdXBwb3J0cyBuZXN0ZWQgYXJyYXlzOiByZXR1cm5zIGxpc3RQYXRoL2l0ZW1QYXRoIGZvciB0aGUgaW5uZXJtb3N0IGxpc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZUxpc3RJdGVtRmllbGRQYXRoID0gKGZpZWxkUGF0aDogc3RyaW5nKTogTGlzdEl0ZW1GaWVsZFBhdGggfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCByYXcgPSB0eXBlb2YgZmllbGRQYXRoID09PSAnc3RyaW5nJyA/IGZpZWxkUGF0aC50cmltKCkgOiAnJ1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IHNlZ21lbnRzID0gcmF3LnNwbGl0KCcuJykuZmlsdGVyKEJvb2xlYW4pXG4gIGxldCBsYXN0TGlzdFNlZyA9IC0xXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc2VnbWVudHNbaV0hLmVuZHNXaXRoKCdbXScpKSBsYXN0TGlzdFNlZyA9IGlcbiAgfVxuICBpZiAobGFzdExpc3RTZWcgPCAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3Qgc3RyaXAgPSAoc2VnOiBzdHJpbmcpOiBzdHJpbmcgPT4gKHNlZy5lbmRzV2l0aCgnW10nKSA/IHNlZy5zbGljZSgwLCAtMikgOiBzZWcpXG5cbiAgY29uc3QgbGlzdFBhdGggPSBzZWdtZW50c1xuICAgIC5zbGljZSgwLCBsYXN0TGlzdFNlZyArIDEpXG4gICAgLm1hcChzdHJpcClcbiAgICAuam9pbignLicpXG5cbiAgY29uc3QgaXRlbVBhdGggPSBzZWdtZW50c1xuICAgIC5zbGljZShsYXN0TGlzdFNlZyArIDEpXG4gICAgLm1hcChzdHJpcClcbiAgICAuam9pbignLicpXG5cbiAgcmV0dXJuIHsgbGlzdFBhdGgsIGl0ZW1QYXRoIH1cbn1cblxuZXhwb3J0IGNvbnN0IHRvTGlzdEl0ZW1WYWx1ZVBhdGggPSAobGlzdFBhdGg6IHN0cmluZywgaW5kZXg6IG51bWJlciwgaXRlbVBhdGg6IHN0cmluZyk6IHN0cmluZyA9PlxuICBpdGVtUGF0aCA/IGAke2xpc3RQYXRofS4ke2luZGV4fS4ke2l0ZW1QYXRofWAgOiBgJHtsaXN0UGF0aH0uJHtpbmRleH1gXG5cbnR5cGUgTGlzdFN0YXRlID0ge1xuICByZWFkb25seSBsaXN0UGF0aDogc3RyaW5nXG4gIHJlYWRvbmx5IHBhcmVudFJvd0lkPzogUm93SWRcbiAgcmVhZG9ubHkgaXRlbXNSZWY6IFJlYWRvbmx5QXJyYXk8dW5rbm93bj5cbiAgcmVhZG9ubHkgaWRzOiBSZWFkb25seUFycmF5PFJvd0lkPlxuICByZWFkb25seSBpbmRleEJ5SWQ6IFJlYWRvbmx5TWFwPFJvd0lkLCBudW1iZXI+XG4gIHJlYWRvbmx5IHRyYWNrQnk/OiBzdHJpbmdcbn1cblxuY29uc3QgcmVhZFRyYWNrQnkgPSAoaXRlbTogdW5rbm93biwgdHJhY2tCeTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gIGlmICghaXRlbSB8fCB0eXBlb2YgaXRlbSAhPT0gJ29iamVjdCcpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3Qgc2VnbWVudHMgPSB0cmFja0J5LnNwbGl0KCcuJylcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IGl0ZW1cbiAgZm9yIChjb25zdCBzZWcgb2Ygc2VnbWVudHMpIHtcbiAgICBpZiAoY3VycmVudCA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgY3VycmVudCA9IGN1cnJlbnRbc2VnIGFzIGFueV1cbiAgfVxuICByZXR1cm4gY3VycmVudFxufVxuXG5jb25zdCBkaWRSZW9yZGVyQnlSZWZlcmVuY2UgPSAocHJldkl0ZW1zOiBSZWFkb25seUFycmF5PHVua25vd24+LCBuZXh0SXRlbXM6IFJlYWRvbmx5QXJyYXk8dW5rbm93bj4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8dW5rbm93biwgQXJyYXk8bnVtYmVyPj4oKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGl0ZW0gPSBwcmV2SXRlbXNbaV1cbiAgICBjb25zdCBsaXN0ID0gYnVja2V0cy5nZXQoaXRlbSkgPz8gW11cbiAgICBsaXN0LnB1c2goaSlcbiAgICBidWNrZXRzLnNldChpdGVtLCBsaXN0KVxuICB9XG5cbiAgZm9yIChsZXQgbmV4dEluZGV4ID0gMDsgbmV4dEluZGV4IDwgbmV4dEl0ZW1zLmxlbmd0aDsgbmV4dEluZGV4KyspIHtcbiAgICBjb25zdCBpdGVtID0gbmV4dEl0ZW1zW25leHRJbmRleF1cbiAgICBjb25zdCBxID0gYnVja2V0cy5nZXQoaXRlbSlcbiAgICBpZiAoIXEgfHwgcS5sZW5ndGggPT09IDApIGNvbnRpbnVlXG4gICAgY29uc3QgcHJldkluZGV4ID0gcS5zaGlmdCgpIVxuICAgIGlmIChwcmV2SW5kZXggIT09IG5leHRJbmRleCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgaGFzU3RhYmxlVHJhY2tCeUtleXMgPSAoaXRlbXM6IFJlYWRvbmx5QXJyYXk8dW5rbm93bj4sIHRyYWNrQnk6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgaXRlbXMuZXZlcnkoKGl0ZW0pID0+IHJlYWRUcmFja0J5KGl0ZW0sIHRyYWNrQnkpICE9PSB1bmRlZmluZWQpXG5cbmNvbnN0IGlzU2FtZVRyYWNrQnlTZXF1ZW5jZSA9IChcbiAgcHJldkl0ZW1zOiBSZWFkb25seUFycmF5PHVua25vd24+LFxuICBuZXh0SXRlbXM6IFJlYWRvbmx5QXJyYXk8dW5rbm93bj4sXG4gIHRyYWNrQnk6IHN0cmluZyxcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAocHJldkl0ZW1zLmxlbmd0aCAhPT0gbmV4dEl0ZW1zLmxlbmd0aCkgcmV0dXJuIGZhbHNlXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldkl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFPYmplY3QuaXMocmVhZFRyYWNrQnkocHJldkl0ZW1zW2ldLCB0cmFja0J5KSwgcmVhZFRyYWNrQnkobmV4dEl0ZW1zW2ldLCB0cmFja0J5KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5jb25zdCByZWNvbmNpbGVJZHMgPSAoXG4gIHByZXY6IExpc3RTdGF0ZSB8IHVuZGVmaW5lZCxcbiAgbmV4dEl0ZW1zOiBSZWFkb25seUFycmF5PHVua25vd24+LFxuICB0cmFja0J5Pzogc3RyaW5nLFxuICBtYWtlUm93SWQ/OiAoKSA9PiBSb3dJZCxcbik6IHsgcmVhZG9ubHkgaWRzOiBSZWFkb25seUFycmF5PFJvd0lkPjsgcmVhZG9ubHkgcmVtb3ZlZDogUmVhZG9ubHlBcnJheTxSb3dJZD4gfSA9PiB7XG4gIGNvbnN0IG5leHRSb3dJZCA9XG4gICAgbWFrZVJvd0lkID8/XG4gICAgKCgpID0+IHtcbiAgICAgIGxldCByb3dTZXEgPSAwXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICByb3dTZXEgKz0gMVxuICAgICAgICByZXR1cm4gYHIke3Jvd1NlcX1gXG4gICAgICB9XG4gICAgfSkoKVxuXG4gIGlmICghcHJldikge1xuICAgIHJldHVybiB7XG4gICAgICBpZHM6IG5leHRJdGVtcy5tYXAoKCkgPT4gbmV4dFJvd0lkKCkpLFxuICAgICAgcmVtb3ZlZDogW10sXG4gICAgfVxuICB9XG5cbiAgaWYgKHByZXYuaXRlbXNSZWYgPT09IG5leHRJdGVtcykge1xuICAgIHJldHVybiB7XG4gICAgICBpZHM6IHByZXYuaWRzLFxuICAgICAgcmVtb3ZlZDogW10sXG4gICAgfVxuICB9XG5cbiAgLy8gSW1wb3J0YW50OiBrZWVwIFJvd0lkIHN0YWJsZSB1bmRlciBcIm5vbi1zdHJ1Y3R1cmFsIGNoYW5nZXNcIiAoZmllbGQgdXBkYXRlcyAvIG9iamVjdCBjbG9uZXMgb25seSksXG4gIC8vIG90aGVyd2lzZSBpbi1mbGlnaHQgc3RhdGUgYW5kIGNhY2hlcyB3b3VsZCBiZSBpbnZhbGlkYXRlZCBuZWVkbGVzc2x5LlxuICBjb25zdCBzYW1lTGVuZ3RoID0gcHJldi5pdGVtc1JlZi5sZW5ndGggPT09IG5leHRJdGVtcy5sZW5ndGhcbiAgaWYgKHNhbWVMZW5ndGgpIHtcbiAgICAvLyB0cmFja0J5IGNhc2U6IGlmIHRoZSBrZXkgc2VxdWVuY2UgaXMgaWRlbnRpY2FsLCB3ZSBjYW4gcmV1c2Ugb2xkIGlkcztcbiAgICAvLyBvdGhlcndpc2Ugd2UgbXVzdCByZWNvbmNpbGUgYnkga2V5IChhdm9pZCBtaXNjbGFzc2lmeWluZyBjbG9uZStyZW9yZGVyIGFzIFwibm8gcmVvcmRlclwiKS5cbiAgICBpZiAodHJhY2tCeSkge1xuICAgICAgY29uc3QgY2FuVXNlS2V5cyA9IGhhc1N0YWJsZVRyYWNrQnlLZXlzKHByZXYuaXRlbXNSZWYsIHRyYWNrQnkpICYmIGhhc1N0YWJsZVRyYWNrQnlLZXlzKG5leHRJdGVtcywgdHJhY2tCeSlcbiAgICAgIGlmIChjYW5Vc2VLZXlzKSB7XG4gICAgICAgIGlmIChpc1NhbWVUcmFja0J5U2VxdWVuY2UocHJldi5pdGVtc1JlZiwgbmV4dEl0ZW1zLCB0cmFja0J5KSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZHM6IHByZXYuaWRzLFxuICAgICAgICAgICAgcmVtb3ZlZDogW10sXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0cmFja0J5IGtleXMgYXJlIG5vdCBhdmFpbGFibGUsIGZhbGwgYmFjayB0byByZWZlcmVuY2UtbGV2ZWwgZGV0ZWN0aW9uIChrZWVwIHN0YWJpbGl0eSBmb3IgXCJjbG9uZWQgYnV0IG5vdCByZW9yZGVyZWRcIikuXG4gICAgICAgIGlmICghZGlkUmVvcmRlckJ5UmVmZXJlbmNlKHByZXYuaXRlbXNSZWYsIG5leHRJdGVtcykpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWRzOiBwcmV2LmlkcyxcbiAgICAgICAgICAgIHJlbW92ZWQ6IFtdLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWRpZFJlb3JkZXJCeVJlZmVyZW5jZShwcmV2Lml0ZW1zUmVmLCBuZXh0SXRlbXMpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZHM6IHByZXYuaWRzLFxuICAgICAgICByZW1vdmVkOiBbXSxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBrZXlPZiA9IChpdGVtOiB1bmtub3duKTogdW5rbm93biA9PiB7XG4gICAgaWYgKCF0cmFja0J5KSByZXR1cm4gaXRlbVxuICAgIGNvbnN0IGsgPSByZWFkVHJhY2tCeShpdGVtLCB0cmFja0J5KVxuICAgIHJldHVybiBrICE9PSB1bmRlZmluZWQgPyBrIDogaXRlbVxuICB9XG5cbiAgY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8dW5rbm93biwgQXJyYXk8Um93SWQ+PigpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldi5pdGVtc1JlZi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleU9mKHByZXYuaXRlbXNSZWZbaV0pXG4gICAgY29uc3QgbGlzdCA9IGJ1Y2tldHMuZ2V0KGtleSkgPz8gW11cbiAgICBsaXN0LnB1c2gocHJldi5pZHNbaV0hKVxuICAgIGJ1Y2tldHMuc2V0KGtleSwgbGlzdClcbiAgfVxuXG4gIGNvbnN0IGlkczogQXJyYXk8Um93SWQ+ID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXh0SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBrZXlPZihuZXh0SXRlbXNbaV0pXG4gICAgY29uc3QgbGlzdCA9IGJ1Y2tldHMuZ2V0KGtleSlcbiAgICBpZiAobGlzdCAmJiBsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGlkcy5wdXNoKGxpc3Quc2hpZnQoKSEpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlkcy5wdXNoKG5leHRSb3dJZCgpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlbW92ZWQ6IEFycmF5PFJvd0lkPiA9IFtdXG4gIGZvciAoY29uc3QgbGlzdCBvZiBidWNrZXRzLnZhbHVlcygpKSB7XG4gICAgcmVtb3ZlZC5wdXNoKC4uLmxpc3QpXG4gIH1cblxuICByZXR1cm4geyBpZHMsIHJlbW92ZWQgfVxufVxuXG5jb25zdCBidWlsZEluZGV4QnlJZCA9IChpZHM6IFJlYWRvbmx5QXJyYXk8Um93SWQ+KTogUmVhZG9ubHlNYXA8Um93SWQsIG51bWJlcj4gPT4ge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPFJvd0lkLCBudW1iZXI+KClcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICBtYXAuc2V0KGlkc1tpXSEsIGkpXG4gIH1cbiAgcmV0dXJuIG1hcFxufVxuXG5leHBvcnQgY2xhc3MgUm93SWRTdG9yZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdHMgPSBuZXcgTWFwPHN0cmluZywgTGlzdFN0YXRlPigpXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3ZhbExpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8TGlzdFJlbW92YWxMaXN0ZW5lcj4+KClcbiAgcHJpdmF0ZSByZWFkb25seSByb3dJZEluZGV4ID0gbmV3IE1hcDxcbiAgICBSb3dJZCxcbiAgICB7IHJlYWRvbmx5IGtleTogc3RyaW5nOyByZWFkb25seSBsaXN0UGF0aDogc3RyaW5nOyByZWFkb25seSBpbmRleDogbnVtYmVyIH1cbiAgPigpXG4gIHByaXZhdGUgbmV4dFJvd1NlcSA9IDBcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmcpIHt9XG5cbiAgcHJpdmF0ZSBsaXN0S2V5ID0gKGxpc3RQYXRoOiBzdHJpbmcsIHBhcmVudFJvd0lkPzogUm93SWQpOiBzdHJpbmcgPT5cbiAgICBwYXJlbnRSb3dJZCA/IGAke2xpc3RQYXRofUBAJHtwYXJlbnRSb3dJZH1gIDogbGlzdFBhdGhcblxuICBwcml2YXRlIG1ha2VSb3dJZCA9ICgpOiBSb3dJZCA9PiB7XG4gICAgdGhpcy5uZXh0Um93U2VxICs9IDFcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZUlkID8gYCR7dGhpcy5pbnN0YW5jZUlkfTo6ciR7dGhpcy5uZXh0Um93U2VxfWAgOiBgciR7dGhpcy5uZXh0Um93U2VxfWBcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5UmVtb3ZlZChsaXN0UGF0aDogc3RyaW5nLCByb3dJZDogUm93SWQpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLnJlbW92YWxMaXN0ZW5lcnMuZ2V0KGxpc3RQYXRoKVxuICAgIGlmICghbGlzdGVuZXJzIHx8IGxpc3RlbmVycy5zaXplID09PSAwKSByZXR1cm5cbiAgICBmb3IgKGNvbnN0IGZuIG9mIGxpc3RlbmVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4ocm93SWQpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbGlzdGVuZXIgZmFpbHVyZXMgc2hvdWxkIG5ldmVyIGJyZWFrIHJ1bnRpbWUgYmVoYXZpb3JcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURlc2NlbmRhbnRzKHBhcmVudFJvd0lkOiBSb3dJZCk6IHZvaWQge1xuICAgIGNvbnN0IGtleXM6IEFycmF5PHN0cmluZz4gPSBbXVxuICAgIGZvciAoY29uc3QgW2ssIHN0XSBvZiB0aGlzLmxpc3RzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHN0LnBhcmVudFJvd0lkID09PSBwYXJlbnRSb3dJZCkga2V5cy5wdXNoKGspXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3Qgc3QgPSB0aGlzLmxpc3RzLmdldChrZXkpXG4gICAgICBpZiAoIXN0KSBjb250aW51ZVxuICAgICAgdGhpcy5saXN0cy5kZWxldGUoa2V5KVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdC5pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm93SWQgPSBzdC5pZHNbaV0hXG4gICAgICAgIHRoaXMucm93SWRJbmRleC5kZWxldGUocm93SWQpXG4gICAgICAgIHRoaXMubm90aWZ5UmVtb3ZlZChzdC5saXN0UGF0aCwgcm93SWQpXG4gICAgICAgIHRoaXMucmVtb3ZlRGVzY2VuZGFudHMocm93SWQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25SZW1vdmVkKGxpc3RQYXRoOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0UmVtb3ZhbExpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgY29uc3Qgc2V0ID0gdGhpcy5yZW1vdmFsTGlzdGVuZXJzLmdldChsaXN0UGF0aCkgPz8gbmV3IFNldDxMaXN0UmVtb3ZhbExpc3RlbmVyPigpXG4gICAgc2V0LmFkZChsaXN0ZW5lcilcbiAgICB0aGlzLnJlbW92YWxMaXN0ZW5lcnMuc2V0KGxpc3RQYXRoLCBzZXQpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJlbW92YWxMaXN0ZW5lcnMuZ2V0KGxpc3RQYXRoKVxuICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm5cbiAgICAgIGN1cnJlbnQuZGVsZXRlKGxpc3RlbmVyKVxuICAgICAgaWYgKGN1cnJlbnQuc2l6ZSA9PT0gMCkgdGhpcy5yZW1vdmFsTGlzdGVuZXJzLmRlbGV0ZShsaXN0UGF0aClcbiAgICB9XG4gIH1cblxuICBnZXRSb3dJZChsaXN0UGF0aDogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBwYXJlbnRSb3dJZD86IFJvd0lkKTogUm93SWQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5saXN0cy5nZXQodGhpcy5saXN0S2V5KGxpc3RQYXRoLCBwYXJlbnRSb3dJZCkpXG4gICAgcmV0dXJuIHN0YXRlID8gc3RhdGUuaWRzW2luZGV4XSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0SW5kZXgobGlzdFBhdGg6IHN0cmluZywgcm93SWQ6IFJvd0lkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5yb3dJZEluZGV4LmdldChyb3dJZClcbiAgICBpZiAoIWluZm8pIHJldHVybiB1bmRlZmluZWRcbiAgICBpZiAoaW5mby5saXN0UGF0aCAhPT0gbGlzdFBhdGgpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gaW5mby5pbmRleFxuICB9XG5cbiAgLyoqXG4gICAqIGVuc3VyZUxpc3RcdUZGMUFcbiAgICogLSBBbGlnbiBSb3dJRCBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gbGlzdFBhdGggd2l0aCB0aGUgY3VycmVudCBpdGVtcy5cbiAgICogLSBSZXR1cm5zIHRoZSBsYXRlc3QgaWRzIChpbmRleCAtPiBSb3dJZCkuXG4gICAqL1xuICBlbnN1cmVMaXN0KFxuICAgIGxpc3RQYXRoOiBzdHJpbmcsXG4gICAgaXRlbXM6IFJlYWRvbmx5QXJyYXk8dW5rbm93bj4sXG4gICAgdHJhY2tCeT86IHN0cmluZyxcbiAgICBwYXJlbnRSb3dJZD86IFJvd0lkLFxuICApOiBSZWFkb25seUFycmF5PFJvd0lkPiB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5saXN0S2V5KGxpc3RQYXRoLCBwYXJlbnRSb3dJZClcbiAgICBjb25zdCBwcmV2ID0gdGhpcy5saXN0cy5nZXQoa2V5KVxuICAgIGNvbnN0IHsgaWRzLCByZW1vdmVkIH0gPSByZWNvbmNpbGVJZHMocHJldiwgaXRlbXMsIHRyYWNrQnkgPz8gcHJldj8udHJhY2tCeSwgdGhpcy5tYWtlUm93SWQpXG5cbiAgICBjb25zdCBuZXh0OiBMaXN0U3RhdGUgPSB7XG4gICAgICBsaXN0UGF0aCxcbiAgICAgIHBhcmVudFJvd0lkLFxuICAgICAgaXRlbXNSZWY6IGl0ZW1zLFxuICAgICAgaWRzLFxuICAgICAgaW5kZXhCeUlkOiBidWlsZEluZGV4QnlJZChpZHMpLFxuICAgICAgdHJhY2tCeTogdHJhY2tCeSA/PyBwcmV2Py50cmFja0J5LFxuICAgIH1cbiAgICB0aGlzLmxpc3RzLnNldChrZXksIG5leHQpXG5cbiAgICBpZiAocmVtb3ZlZC5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHJvd0lkIG9mIHJlbW92ZWQpIHtcbiAgICAgICAgdGhpcy5yb3dJZEluZGV4LmRlbGV0ZShyb3dJZClcbiAgICAgICAgdGhpcy5ub3RpZnlSZW1vdmVkKGxpc3RQYXRoLCByb3dJZClcbiAgICAgICAgdGhpcy5yZW1vdmVEZXNjZW5kYW50cyhyb3dJZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWZyZXNoIHRoZSByZXZlcnNlIHJvd0lkIC0+IGluZGV4IG1hcHBpbmcgKGluZGV4IGNoYW5nZXMgYXJlIGFsbG93ZWQpLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByb3dJZCA9IGlkc1tpXSFcbiAgICAgIHRoaXMucm93SWRJbmRleC5zZXQocm93SWQsIHsga2V5LCBsaXN0UGF0aCwgaW5kZXg6IGkgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gaWRzXG4gIH1cblxuICAvKipcbiAgICogdXBkYXRlQWxsXHVGRjFBXG4gICAqIC0gQWZ0ZXIgZWFjaCBjb21taXQsIGFsaWduIFJvd0lEIG1hcHBpbmdzIGZvciBhbGwga25vd24gbGlzdHMuXG4gICAqIC0gY29uZmlncyBjb21lIGZyb20gbGlzdCBkZWNsYXJhdGlvbnMgaW4gU3RhdGVUcmFpdFByb2dyYW0uc3BlYyAobWF5IGluY2x1ZGUgdHJhY2tCeSkuXG4gICAqL1xuICB1cGRhdGVBbGwoc3RhdGU6IHVua25vd24sIGNvbmZpZ3M6IFJlYWRvbmx5QXJyYXk8TGlzdENvbmZpZz4pOiB2b2lkIHtcbiAgICBjb25zdCBjZmdCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgTGlzdENvbmZpZz4oKVxuICAgIGNvbnN0IHBhdGhzOiBBcnJheTxzdHJpbmc+ID0gW11cbiAgICBmb3IgKGNvbnN0IGNmZyBvZiBjb25maWdzKSB7XG4gICAgICBpZiAoIWNmZyB8fCB0eXBlb2YgY2ZnLnBhdGggIT09ICdzdHJpbmcnKSBjb250aW51ZVxuICAgICAgY29uc3QgcCA9IGNmZy5wYXRoLnRyaW0oKVxuICAgICAgaWYgKCFwKSBjb250aW51ZVxuICAgICAgY2ZnQnlQYXRoLnNldChwLCBjZmcpXG4gICAgICBwYXRocy5wdXNoKHApXG4gICAgfVxuXG4gICAgY29uc3QgcGF0aFNldCA9IG5ldyBTZXQocGF0aHMpXG5cbiAgICBjb25zdCBwYXJlbnRPZiA9IChwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcuJykuZmlsdGVyKEJvb2xlYW4pXG4gICAgICBsZXQgYmVzdDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHNlZ21lbnRzLnNsaWNlKDAsIGkpLmpvaW4oJy4nKVxuICAgICAgICBpZiAocGF0aFNldC5oYXMocHJlZml4KSkgYmVzdCA9IHByZWZpeFxuICAgICAgfVxuICAgICAgcmV0dXJuIGJlc3RcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPigpXG4gICAgY29uc3Qgc3VmZml4QnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICAgIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBuZXcgTWFwPHN0cmluZyB8IHVuZGVmaW5lZCwgQXJyYXk8c3RyaW5nPj4oKVxuXG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRPZihwYXRoKVxuICAgICAgcGFyZW50QnlQYXRoLnNldChwYXRoLCBwYXJlbnQpXG4gICAgICBjb25zdCBzdWZmaXggPSBwYXJlbnQgPyBwYXRoLnNsaWNlKHBhcmVudC5sZW5ndGggKyAxKSA6IHBhdGhcbiAgICAgIHN1ZmZpeEJ5UGF0aC5zZXQocGF0aCwgc3VmZml4KVxuICAgICAgY29uc3QgbGlzdCA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudCkgPz8gW11cbiAgICAgIGxpc3QucHVzaChwYXRoKVxuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50LCBsaXN0KVxuICAgIH1cblxuICAgIC8vIHJvb3RzIGZpcnN0IChhbmQgZGV0ZXJtaW5pc3RpYyB0cmF2ZXJzYWwpXG4gICAgY29uc3Qgcm9vdHMgPSAoY2hpbGRyZW5CeVBhcmVudC5nZXQodW5kZWZpbmVkKSA/PyBbXSkuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG5cbiAgICBjb25zdCB2aXNpdCA9IChsaXN0UGF0aDogc3RyaW5nLCBwYXJlbnRSb3dJZDogUm93SWQgfCB1bmRlZmluZWQsIGxpc3RWYWx1ZTogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgY2ZnID0gY2ZnQnlQYXRoLmdldChsaXN0UGF0aClcbiAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheShsaXN0VmFsdWUpID8gKGxpc3RWYWx1ZSBhcyBSZWFkb25seUFycmF5PHVua25vd24+KSA6IFtdXG4gICAgICBjb25zdCBpZHMgPSB0aGlzLmVuc3VyZUxpc3QobGlzdFBhdGgsIGl0ZW1zLCBjZmc/LnRyYWNrQnksIHBhcmVudFJvd0lkKVxuXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IChjaGlsZHJlbkJ5UGFyZW50LmdldChsaXN0UGF0aCkgPz8gW10pLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm93ID0gaXRlbXNbaV1cbiAgICAgICAgY29uc3Qgcm93SWQgPSBpZHNbaV1cbiAgICAgICAgaWYgKCFyb3dJZCkgY29udGludWVcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZFBhdGggb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICBjb25zdCBzdWZmaXggPSBzdWZmaXhCeVBhdGguZ2V0KGNoaWxkUGF0aCkgPz8gJydcbiAgICAgICAgICBjb25zdCBjaGlsZFZhbHVlID0gc3VmZml4ID8gZ2V0QXRQYXRoKHJvdyBhcyBhbnksIHN1ZmZpeCkgOiB1bmRlZmluZWRcbiAgICAgICAgICB2aXNpdChjaGlsZFBhdGgsIHJvd0lkLCBjaGlsZFZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByb290IG9mIHJvb3RzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGdldEF0UGF0aChzdGF0ZSBhcyBhbnksIHJvb3QpXG4gICAgICB2aXNpdChyb290LCB1bmRlZmluZWQsIHZhbHVlKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY29sbGVjdExpc3RDb25maWdzID0gKHNwZWM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVhZG9ubHlBcnJheTxMaXN0Q29uZmlnPiA9PiB7XG4gIGNvbnN0IGNvbmZpZ3M6IEFycmF5PExpc3RDb25maWc+ID0gW11cbiAgZm9yIChjb25zdCBrZXkgaW4gc3BlYykge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNwZWMsIGtleSkpIGNvbnRpbnVlXG4gICAgY29uc3QgcmF3ID0gc3BlY1trZXldXG4gICAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gJ29iamVjdCcpIGNvbnRpbnVlXG4gICAgY29uc3QgdGFnID0gKHJhdyBhcyBhbnkpLl90YWdcbiAgICBpZiAodGFnICE9PSAnU3RhdGVUcmFpdExpc3QnKSBjb250aW51ZVxuICAgIGNvbnN0IHRyYWNrQnkgPSAocmF3IGFzIGFueSkuaWRlbnRpdHlIaW50Py50cmFja0J5XG4gICAgY29uZmlncy5wdXNoKHtcbiAgICAgIHBhdGg6IGtleSxcbiAgICAgIHRyYWNrQnk6IHR5cGVvZiB0cmFja0J5ID09PSAnc3RyaW5nJyA/IHRyYWNrQnkgOiB1bmRlZmluZWQsXG4gICAgfSlcbiAgfVxuICByZXR1cm4gY29uZmlnc1xufVxuIiwgImltcG9ydCB7IENvbnRleHQsIEVmZmVjdCwgTGF5ZXIgfSBmcm9tICdlZmZlY3QnXG5cbmV4cG9ydCB0eXBlIFJlc291cmNlU25hcHNob3RQaGFzZSA9ICdpZGxlJyB8ICdsb2FkaW5nJyB8ICdzdWNjZXNzJyB8ICdlcnJvcidcblxuZXhwb3J0IHR5cGUgUmVwbGF5TG9nRXZlbnQgPVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IF90YWc6ICdSZXNvdXJjZVNuYXBzaG90J1xuICAgICAgcmVhZG9ubHkgcmVzb3VyY2VJZDogc3RyaW5nXG4gICAgICByZWFkb25seSBmaWVsZFBhdGg6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkga2V5SGFzaD86IHN0cmluZ1xuICAgICAgLyoqXG4gICAgICAgKiBPcHRpb25hbDogc291cmNlIGNvbmN1cnJlbmN5IHBvbGljeSAoZS5nLiBcInN3aXRjaFwiIC8gXCJleGhhdXN0LXRyYWlsaW5nXCIpLlxuICAgICAgICogLSBNdXN0IHJlbWFpbiBzbGltICYgc2VyaWFsaXphYmxlLlxuICAgICAgICogLSBVc2VkIGJ5IERldnRvb2xzL3JlcGxheSB0byBleHBsYWluIHdoeSBvbGQgcmVzdWx0cyBhcmUgZHJvcHBlZCAvIHdoeSB0cmFpbGluZyBoYXBwZW5zLlxuICAgICAgICovXG4gICAgICByZWFkb25seSBjb25jdXJyZW5jeT86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgcGhhc2U6IFJlc291cmNlU25hcHNob3RQaGFzZVxuICAgICAgcmVhZG9ubHkgc25hcHNob3Q6IHVua25vd25cbiAgICAgIHJlYWRvbmx5IHRpbWVzdGFtcDogbnVtYmVyXG4gICAgICByZWFkb25seSBtb2R1bGVJZD86IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgaW5zdGFuY2VJZD86IHN0cmluZ1xuICAgIH1cbiAgfCB7XG4gICAgICByZWFkb25seSBfdGFnOiAnSW52YWxpZGF0ZVJlcXVlc3QnXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA6IG51bWJlclxuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGtpbmQ6ICdyZXNvdXJjZScgfCAncXVlcnknXG4gICAgICByZWFkb25seSB0YXJnZXQ6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgbWV0YT86IHVua25vd25cbiAgICB9XG5cbmV4cG9ydCB0eXBlIFJlc291cmNlU25hcHNob3RFdmVudCA9IEV4dHJhY3Q8UmVwbGF5TG9nRXZlbnQsIHsgcmVhZG9ubHkgX3RhZzogJ1Jlc291cmNlU25hcHNob3QnIH0+XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwbGF5TG9nU2VydmljZSB7XG4gIHJlYWRvbmx5IHJlY29yZDogKGV2ZW50OiBSZXBsYXlMb2dFdmVudCkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPlxuICByZWFkb25seSBzbmFwc2hvdDogRWZmZWN0LkVmZmVjdDxSZWFkb25seUFycmF5PFJlcGxheUxvZ0V2ZW50Pj5cbiAgcmVhZG9ubHkgcmVzZXRDdXJzb3I6IEVmZmVjdC5FZmZlY3Q8dm9pZD5cbiAgcmVhZG9ubHkgY29uc3VtZU5leHQ6IChwcmVkaWNhdGU6IChldmVudDogUmVwbGF5TG9nRXZlbnQpID0+IGJvb2xlYW4pID0+IEVmZmVjdC5FZmZlY3Q8UmVwbGF5TG9nRXZlbnQgfCB1bmRlZmluZWQ+XG4gIHJlYWRvbmx5IGNvbnN1bWVOZXh0UmVzb3VyY2VTbmFwc2hvdDogKHBhcmFtczoge1xuICAgIHJlYWRvbmx5IHJlc291cmNlSWQ6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGZpZWxkUGF0aDogc3RyaW5nXG4gICAgcmVhZG9ubHkga2V5SGFzaD86IHN0cmluZ1xuICAgIHJlYWRvbmx5IHBoYXNlPzogUmVzb3VyY2VTbmFwc2hvdFBoYXNlXG4gIH0pID0+IEVmZmVjdC5FZmZlY3Q8UmVzb3VyY2VTbmFwc2hvdEV2ZW50IHwgdW5kZWZpbmVkPlxufVxuXG5leHBvcnQgY2xhc3MgUmVwbGF5TG9nIGV4dGVuZHMgQ29udGV4dC5UYWcoJ0Bsb2dpeGpzL2NvcmUvUmVwbGF5TG9nJyk8UmVwbGF5TG9nLCBSZXBsYXlMb2dTZXJ2aWNlPigpIHt9XG5cbmV4cG9ydCBjb25zdCBtYWtlID0gKGluaXRpYWw/OiBSZWFkb25seUFycmF5PFJlcGxheUxvZ0V2ZW50Pik6IFJlcGxheUxvZ1NlcnZpY2UgPT4ge1xuICBjb25zdCBldmVudHM6IEFycmF5PFJlcGxheUxvZ0V2ZW50PiA9IGluaXRpYWwgPyBBcnJheS5mcm9tKGluaXRpYWwpIDogW11cbiAgbGV0IGN1cnNvciA9IDBcblxuICBjb25zdCBjb25zdW1lTmV4dCA9IChwcmVkaWNhdGU6IChldmVudDogUmVwbGF5TG9nRXZlbnQpID0+IGJvb2xlYW4pOiBFZmZlY3QuRWZmZWN0PFJlcGxheUxvZ0V2ZW50IHwgdW5kZWZpbmVkPiA9PlxuICAgIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSBjdXJzb3I7IGkgPCBldmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaV1cbiAgICAgICAgaWYgKCFwcmVkaWNhdGUoZXZlbnQpKSBjb250aW51ZVxuICAgICAgICBjdXJzb3IgPSBpICsgMVxuICAgICAgICByZXR1cm4gZXZlbnRcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9KVxuXG4gIGNvbnN0IGNvbnN1bWVOZXh0UmVzb3VyY2VTbmFwc2hvdCA9IChwYXJhbXM6IHtcbiAgICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmdcbiAgICByZWFkb25seSBmaWVsZFBhdGg6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGtleUhhc2g/OiBzdHJpbmdcbiAgICByZWFkb25seSBwaGFzZT86IFJlc291cmNlU25hcHNob3RQaGFzZVxuICB9KTogRWZmZWN0LkVmZmVjdDxSZXNvdXJjZVNuYXBzaG90RXZlbnQgfCB1bmRlZmluZWQ+ID0+XG4gICAgY29uc3VtZU5leHQoKGV2ZW50KTogZXZlbnQgaXMgUmVzb3VyY2VTbmFwc2hvdEV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC5fdGFnICE9PSAnUmVzb3VyY2VTbmFwc2hvdCcpIHJldHVybiBmYWxzZVxuICAgICAgaWYgKGV2ZW50LnJlc291cmNlSWQgIT09IHBhcmFtcy5yZXNvdXJjZUlkKSByZXR1cm4gZmFsc2VcbiAgICAgIGlmIChldmVudC5maWVsZFBhdGggIT09IHBhcmFtcy5maWVsZFBhdGgpIHJldHVybiBmYWxzZVxuICAgICAgaWYgKHBhcmFtcy5rZXlIYXNoICE9PSB1bmRlZmluZWQgJiYgZXZlbnQua2V5SGFzaCAhPT0gcGFyYW1zLmtleUhhc2gpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLnBoYXNlICE9PSB1bmRlZmluZWQgJiYgZXZlbnQucGhhc2UgIT09IHBhcmFtcy5waGFzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSkucGlwZShFZmZlY3QubWFwKChldmVudCkgPT4gZXZlbnQgYXMgUmVzb3VyY2VTbmFwc2hvdEV2ZW50IHwgdW5kZWZpbmVkKSlcblxuICByZXR1cm4ge1xuICAgIHJlY29yZDogKGV2ZW50KSA9PiBFZmZlY3Quc3luYygoKSA9PiBldmVudHMucHVzaChldmVudCkpLFxuICAgIHNuYXBzaG90OiBFZmZlY3Quc3luYygoKSA9PiBldmVudHMuc2xpY2UoKSksXG4gICAgcmVzZXRDdXJzb3I6IEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgIGN1cnNvciA9IDBcbiAgICB9KSxcbiAgICBjb25zdW1lTmV4dCxcbiAgICBjb25zdW1lTmV4dFJlc291cmNlU25hcHNob3QsXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxheWVyID0gKGluaXRpYWw/OiBSZWFkb25seUFycmF5PFJlcGxheUxvZ0V2ZW50Pik6IExheWVyLkxheWVyPFJlcGxheUxvZywgbmV2ZXIsIG5ldmVyPiA9PlxuICBMYXllci5zdWNjZWVkKFJlcGxheUxvZywgbWFrZShpbml0aWFsKSlcblxuZXhwb3J0IGNvbnN0IHJlY29yZCA9IChldmVudDogUmVwbGF5TG9nRXZlbnQpOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBSZXBsYXlMb2c+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBsb2cgPSB5aWVsZCogUmVwbGF5TG9nXG4gICAgeWllbGQqIGxvZy5yZWNvcmQoZXZlbnQpXG4gIH0pXG5cbmV4cG9ydCBjb25zdCBzbmFwc2hvdDogRWZmZWN0LkVmZmVjdDxSZWFkb25seUFycmF5PFJlcGxheUxvZ0V2ZW50PiwgbmV2ZXIsIFJlcGxheUxvZz4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gIGNvbnN0IGxvZyA9IHlpZWxkKiBSZXBsYXlMb2dcbiAgcmV0dXJuIHlpZWxkKiBsb2cuc25hcHNob3Rcbn0pXG5cbmV4cG9ydCBjb25zdCByZXNldEN1cnNvcjogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgUmVwbGF5TG9nPiA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgY29uc3QgbG9nID0geWllbGQqIFJlcGxheUxvZ1xuICB5aWVsZCogbG9nLnJlc2V0Q3Vyc29yXG59KVxuXG5leHBvcnQgY29uc3QgY29uc3VtZU5leHRSZXNvdXJjZVNuYXBzaG90ID0gKHBhcmFtczoge1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgZmllbGRQYXRoOiBzdHJpbmdcbiAgcmVhZG9ubHkga2V5SGFzaD86IHN0cmluZ1xuICByZWFkb25seSBwaGFzZT86IFJlc291cmNlU25hcHNob3RQaGFzZVxufSk6IEVmZmVjdC5FZmZlY3Q8UmVzb3VyY2VTbmFwc2hvdEV2ZW50IHwgdW5kZWZpbmVkLCBuZXZlciwgUmVwbGF5TG9nPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgbG9nID0geWllbGQqIFJlcGxheUxvZ1xuICAgIHJldHVybiB5aWVsZCogbG9nLmNvbnN1bWVOZXh0UmVzb3VyY2VTbmFwc2hvdChwYXJhbXMpXG4gIH0pXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7O0FBV0EsSUFBTSxnQkFBZ0IsQ0FBQyxTQUF5QztBQUM5RCxNQUFJLENBQUMsS0FBTSxRQUFPLENBQUM7QUFDbkIsU0FBTyxLQUFLLE1BQU0sR0FBRyxFQUFFLElBQUksQ0FBQyxRQUFTLFdBQVcsS0FBSyxHQUFHLElBQUksT0FBTyxHQUFHLElBQUksR0FBSTtBQUNoRjtBQUVPLElBQU0sWUFBWSxDQUFDLE9BQVksU0FBc0I7QUFDMUQsTUFBSSxDQUFDLFFBQVEsU0FBUyxLQUFNLFFBQU87QUFDbkMsUUFBTSxXQUFXLGNBQWMsSUFBSTtBQUNuQyxNQUFJLFVBQWU7QUFDbkIsYUFBVyxPQUFPLFVBQVU7QUFDMUIsUUFBSSxXQUFXLEtBQU0sUUFBTztBQUM1QixRQUFJLE9BQU8sUUFBUSxVQUFVO0FBQzNCLGdCQUFVLE1BQU0sUUFBUSxPQUFPLElBQUksUUFBUSxHQUFHLElBQUksUUFBUSxPQUFPLEdBQUcsQ0FBQztBQUNyRTtBQUFBLElBQ0Y7QUFDQSxjQUFVLFFBQVEsR0FBRztBQUFBLEVBQ3ZCO0FBQ0EsU0FBTztBQUNUO0FBRU8sSUFBTSxvQkFBb0IsQ0FBQyxPQUFnQixNQUFjLFVBQXlCO0FBQ3ZGLE1BQUksQ0FBQyxLQUFNO0FBQ1gsUUFBTSxXQUFXLGNBQWMsSUFBSTtBQUNuQyxNQUFJLFNBQVMsV0FBVyxFQUFHO0FBRTNCLE1BQUksVUFBZTtBQUNuQixXQUFTLElBQUksR0FBRyxJQUFJLFNBQVMsU0FBUyxHQUFHLEtBQUs7QUFDNUMsVUFBTSxNQUFNLFNBQVMsQ0FBQztBQUN0QixVQUFNLFVBQVUsU0FBUyxJQUFJLENBQUM7QUFFOUIsVUFBTSxPQUFPLFVBQVUsR0FBVTtBQUNqQyxRQUFJLFFBQVEsUUFBUSxPQUFPLFNBQVMsVUFBVTtBQUM1QyxjQUFRLEdBQVUsSUFBSSxPQUFPLFlBQVksV0FBVyxDQUFD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
390
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvc3RhdGUtdHJhaXQvcm93aWQudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL1JlcGxheUxvZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHR5cGUgUm93SWQgPSBzdHJpbmdcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0Q29uZmlnIHtcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nXG4gIHJlYWRvbmx5IHRyYWNrQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgTGlzdFJlbW92YWxMaXN0ZW5lciA9IChyb3dJZDogUm93SWQpID0+IHZvaWRcblxudHlwZSBTZWdtZW50ID0gc3RyaW5nIHwgbnVtYmVyXG5cbmNvbnN0IHBhcnNlU2VnbWVudHMgPSAocGF0aDogc3RyaW5nKTogUmVhZG9ubHlBcnJheTxTZWdtZW50PiA9PiB7XG4gIGlmICghcGF0aCkgcmV0dXJuIFtdXG4gIHJldHVybiBwYXRoLnNwbGl0KCcuJykubWFwKChzZWcpID0+ICgvXlswLTldKyQvLnRlc3Qoc2VnKSA/IE51bWJlcihzZWcpIDogc2VnKSlcbn1cblxuZXhwb3J0IGNvbnN0IGdldEF0UGF0aCA9IChzdGF0ZTogYW55LCBwYXRoOiBzdHJpbmcpOiBhbnkgPT4ge1xuICBpZiAoIXBhdGggfHwgc3RhdGUgPT0gbnVsbCkgcmV0dXJuIHN0YXRlXG4gIGNvbnN0IHNlZ21lbnRzID0gcGFyc2VTZWdtZW50cyhwYXRoKVxuICBsZXQgY3VycmVudDogYW55ID0gc3RhdGVcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2VnbWVudHMpIHtcbiAgICBpZiAoY3VycmVudCA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgaWYgKHR5cGVvZiBzZWcgPT09ICdudW1iZXInKSB7XG4gICAgICBjdXJyZW50ID0gQXJyYXkuaXNBcnJheShjdXJyZW50KSA/IGN1cnJlbnRbc2VnXSA6IGN1cnJlbnRbU3RyaW5nKHNlZyldXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtzZWddXG4gIH1cbiAgcmV0dXJuIGN1cnJlbnRcbn1cblxuZXhwb3J0IGNvbnN0IHNldEF0UGF0aE11dGF0aW5nID0gKGRyYWZ0OiB1bmtub3duLCBwYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gIGlmICghcGF0aCkgcmV0dXJuXG4gIGNvbnN0IHNlZ21lbnRzID0gcGFyc2VTZWdtZW50cyhwYXRoKVxuICBpZiAoc2VnbWVudHMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBsZXQgY3VycmVudDogYW55ID0gZHJhZnRcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBzZWdtZW50c1tpXSFcbiAgICBjb25zdCBuZXh0S2V5ID0gc2VnbWVudHNbaSArIDFdIVxuXG4gICAgY29uc3QgbmV4dCA9IGN1cnJlbnQ/LltrZXkgYXMgYW55XVxuICAgIGlmIChuZXh0ID09IG51bGwgfHwgdHlwZW9mIG5leHQgIT09ICdvYmplY3QnKSB7XG4gICAgICBjdXJyZW50W2tleSBhcyBhbnldID0gdHlwZW9mIG5leHRLZXkgPT09ICdudW1iZXInID8gW10gOiB7fVxuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtrZXkgYXMgYW55XVxuICB9XG5cbiAgY29uc3QgbGFzdCA9IHNlZ21lbnRzW3NlZ21lbnRzLmxlbmd0aCAtIDFdIVxuICBjdXJyZW50W2xhc3QgYXMgYW55XSA9IHZhbHVlXG59XG5cbmV4cG9ydCBjb25zdCB1bnNldEF0UGF0aE11dGF0aW5nID0gKGRyYWZ0OiB1bmtub3duLCBwYXRoOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgaWYgKCFwYXRoKSByZXR1cm5cbiAgY29uc3Qgc2VnbWVudHMgPSBwYXJzZVNlZ21lbnRzKHBhdGgpXG4gIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGxldCBjdXJyZW50OiBhbnkgPSBkcmFmdFxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IHNlZ21lbnRzW2ldIVxuICAgIGNvbnN0IG5leHQgPSBjdXJyZW50Py5ba2V5IGFzIGFueV1cbiAgICBpZiAobmV4dCA9PSBudWxsIHx8IHR5cGVvZiBuZXh0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGN1cnJlbnQgPSBuZXh0XG4gIH1cblxuICBjb25zdCBsYXN0ID0gc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV0hXG4gIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpICYmIHR5cGVvZiBsYXN0ID09PSAnbnVtYmVyJykge1xuICAgIGN1cnJlbnRbbGFzdF0gPSB1bmRlZmluZWRcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSAnb2JqZWN0Jykge1xuICAgIGRlbGV0ZSBjdXJyZW50W2xhc3QgYXMgYW55XVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBqb2luUGF0aCA9IChwcmVmaXg6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIXByZWZpeCkgcmV0dXJuIHN1ZmZpeFxuICBpZiAoIXN1ZmZpeCkgcmV0dXJuIHByZWZpeFxuICByZXR1cm4gYCR7cHJlZml4fS4ke3N1ZmZpeH1gXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEl0ZW1GaWVsZFBhdGgge1xuICByZWFkb25seSBsaXN0UGF0aDogc3RyaW5nXG4gIHJlYWRvbmx5IGl0ZW1QYXRoOiBzdHJpbmdcbn1cblxuLyoqXG4gKiBwYXJzZUxpc3RJdGVtRmllbGRQYXRoXHVGRjFBXG4gKiAtIFJlY29nbml6ZSBhIGxpc3QuaXRlbSBmaWVsZCBwYXRoIGxpa2UgXCJpdGVtc1tdLnByb2ZpbGVSZXNvdXJjZVwiLlxuICogLSBTdXBwb3J0cyBuZXN0ZWQgYXJyYXlzOiByZXR1cm5zIGxpc3RQYXRoL2l0ZW1QYXRoIGZvciB0aGUgaW5uZXJtb3N0IGxpc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZUxpc3RJdGVtRmllbGRQYXRoID0gKGZpZWxkUGF0aDogc3RyaW5nKTogTGlzdEl0ZW1GaWVsZFBhdGggfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCByYXcgPSB0eXBlb2YgZmllbGRQYXRoID09PSAnc3RyaW5nJyA/IGZpZWxkUGF0aC50cmltKCkgOiAnJ1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IHNlZ21lbnRzID0gcmF3LnNwbGl0KCcuJykuZmlsdGVyKEJvb2xlYW4pXG4gIGxldCBsYXN0TGlzdFNlZyA9IC0xXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc2VnbWVudHNbaV0hLmVuZHNXaXRoKCdbXScpKSBsYXN0TGlzdFNlZyA9IGlcbiAgfVxuICBpZiAobGFzdExpc3RTZWcgPCAwKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3Qgc3RyaXAgPSAoc2VnOiBzdHJpbmcpOiBzdHJpbmcgPT4gKHNlZy5lbmRzV2l0aCgnW10nKSA/IHNlZy5zbGljZSgwLCAtMikgOiBzZWcpXG5cbiAgY29uc3QgbGlzdFBhdGggPSBzZWdtZW50c1xuICAgIC5zbGljZSgwLCBsYXN0TGlzdFNlZyArIDEpXG4gICAgLm1hcChzdHJpcClcbiAgICAuam9pbignLicpXG5cbiAgY29uc3QgaXRlbVBhdGggPSBzZWdtZW50c1xuICAgIC5zbGljZShsYXN0TGlzdFNlZyArIDEpXG4gICAgLm1hcChzdHJpcClcbiAgICAuam9pbignLicpXG5cbiAgcmV0dXJuIHsgbGlzdFBhdGgsIGl0ZW1QYXRoIH1cbn1cblxuZXhwb3J0IGNvbnN0IHRvTGlzdEl0ZW1WYWx1ZVBhdGggPSAobGlzdFBhdGg6IHN0cmluZywgaW5kZXg6IG51bWJlciwgaXRlbVBhdGg6IHN0cmluZyk6IHN0cmluZyA9PlxuICBpdGVtUGF0aCA/IGAke2xpc3RQYXRofS4ke2luZGV4fS4ke2l0ZW1QYXRofWAgOiBgJHtsaXN0UGF0aH0uJHtpbmRleH1gXG5cbnR5cGUgTGlzdFN0YXRlID0ge1xuICByZWFkb25seSBsaXN0UGF0aDogc3RyaW5nXG4gIHJlYWRvbmx5IHBhcmVudFJvd0lkPzogUm93SWRcbiAgcmVhZG9ubHkgaXRlbXNSZWY6IFJlYWRvbmx5QXJyYXk8dW5rbm93bj5cbiAgcmVhZG9ubHkgaWRzOiBSZWFkb25seUFycmF5PFJvd0lkPlxuICByZWFkb25seSBpbmRleEJ5SWQ6IFJlYWRvbmx5TWFwPFJvd0lkLCBudW1iZXI+XG4gIHJlYWRvbmx5IHRyYWNrQnk/OiBzdHJpbmdcbn1cblxuY29uc3QgcmVhZFRyYWNrQnkgPSAoaXRlbTogdW5rbm93biwgdHJhY2tCeTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gIGlmICghaXRlbSB8fCB0eXBlb2YgaXRlbSAhPT0gJ29iamVjdCcpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3Qgc2VnbWVudHMgPSB0cmFja0J5LnNwbGl0KCcuJylcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IGl0ZW1cbiAgZm9yIChjb25zdCBzZWcgb2Ygc2VnbWVudHMpIHtcbiAgICBpZiAoY3VycmVudCA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgY3VycmVudCA9IGN1cnJlbnRbc2VnIGFzIGFueV1cbiAgfVxuICByZXR1cm4gY3VycmVudFxufVxuXG5jb25zdCBkaWRSZW9yZGVyQnlSZWZlcmVuY2UgPSAocHJldkl0ZW1zOiBSZWFkb25seUFycmF5PHVua25vd24+LCBuZXh0SXRlbXM6IFJlYWRvbmx5QXJyYXk8dW5rbm93bj4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8dW5rbm93biwgQXJyYXk8bnVtYmVyPj4oKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGl0ZW0gPSBwcmV2SXRlbXNbaV1cbiAgICBjb25zdCBsaXN0ID0gYnVja2V0cy5nZXQoaXRlbSkgPz8gW11cbiAgICBsaXN0LnB1c2goaSlcbiAgICBidWNrZXRzLnNldChpdGVtLCBsaXN0KVxuICB9XG5cbiAgZm9yIChsZXQgbmV4dEluZGV4ID0gMDsgbmV4dEluZGV4IDwgbmV4dEl0ZW1zLmxlbmd0aDsgbmV4dEluZGV4KyspIHtcbiAgICBjb25zdCBpdGVtID0gbmV4dEl0ZW1zW25leHRJbmRleF1cbiAgICBjb25zdCBxID0gYnVja2V0cy5nZXQoaXRlbSlcbiAgICBpZiAoIXEgfHwgcS5sZW5ndGggPT09IDApIGNvbnRpbnVlXG4gICAgY29uc3QgcHJldkluZGV4ID0gcS5zaGlmdCgpIVxuICAgIGlmIChwcmV2SW5kZXggIT09IG5leHRJbmRleCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgaGFzU3RhYmxlVHJhY2tCeUtleXMgPSAoaXRlbXM6IFJlYWRvbmx5QXJyYXk8dW5rbm93bj4sIHRyYWNrQnk6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgaXRlbXMuZXZlcnkoKGl0ZW0pID0+IHJlYWRUcmFja0J5KGl0ZW0sIHRyYWNrQnkpICE9PSB1bmRlZmluZWQpXG5cbmNvbnN0IGlzU2FtZVRyYWNrQnlTZXF1ZW5jZSA9IChcbiAgcHJldkl0ZW1zOiBSZWFkb25seUFycmF5PHVua25vd24+LFxuICBuZXh0SXRlbXM6IFJlYWRvbmx5QXJyYXk8dW5rbm93bj4sXG4gIHRyYWNrQnk6IHN0cmluZyxcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAocHJldkl0ZW1zLmxlbmd0aCAhPT0gbmV4dEl0ZW1zLmxlbmd0aCkgcmV0dXJuIGZhbHNlXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldkl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFPYmplY3QuaXMocmVhZFRyYWNrQnkocHJldkl0ZW1zW2ldLCB0cmFja0J5KSwgcmVhZFRyYWNrQnkobmV4dEl0ZW1zW2ldLCB0cmFja0J5KSkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5jb25zdCByZWNvbmNpbGVJZHMgPSAoXG4gIHByZXY6IExpc3RTdGF0ZSB8IHVuZGVmaW5lZCxcbiAgbmV4dEl0ZW1zOiBSZWFkb25seUFycmF5PHVua25vd24+LFxuICB0cmFja0J5Pzogc3RyaW5nLFxuICBtYWtlUm93SWQ/OiAoKSA9PiBSb3dJZCxcbik6IHsgcmVhZG9ubHkgaWRzOiBSZWFkb25seUFycmF5PFJvd0lkPjsgcmVhZG9ubHkgcmVtb3ZlZDogUmVhZG9ubHlBcnJheTxSb3dJZD4gfSA9PiB7XG4gIGNvbnN0IG5leHRSb3dJZCA9XG4gICAgbWFrZVJvd0lkID8/XG4gICAgKCgpID0+IHtcbiAgICAgIGxldCByb3dTZXEgPSAwXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICByb3dTZXEgKz0gMVxuICAgICAgICByZXR1cm4gYHIke3Jvd1NlcX1gXG4gICAgICB9XG4gICAgfSkoKVxuXG4gIGlmICghcHJldikge1xuICAgIHJldHVybiB7XG4gICAgICBpZHM6IG5leHRJdGVtcy5tYXAoKCkgPT4gbmV4dFJvd0lkKCkpLFxuICAgICAgcmVtb3ZlZDogW10sXG4gICAgfVxuICB9XG5cbiAgaWYgKHByZXYuaXRlbXNSZWYgPT09IG5leHRJdGVtcykge1xuICAgIHJldHVybiB7XG4gICAgICBpZHM6IHByZXYuaWRzLFxuICAgICAgcmVtb3ZlZDogW10sXG4gICAgfVxuICB9XG5cbiAgLy8gSW1wb3J0YW50OiBrZWVwIFJvd0lkIHN0YWJsZSB1bmRlciBcIm5vbi1zdHJ1Y3R1cmFsIGNoYW5nZXNcIiAoZmllbGQgdXBkYXRlcyAvIG9iamVjdCBjbG9uZXMgb25seSksXG4gIC8vIG90aGVyd2lzZSBpbi1mbGlnaHQgc3RhdGUgYW5kIGNhY2hlcyB3b3VsZCBiZSBpbnZhbGlkYXRlZCBuZWVkbGVzc2x5LlxuICBjb25zdCBzYW1lTGVuZ3RoID0gcHJldi5pdGVtc1JlZi5sZW5ndGggPT09IG5leHRJdGVtcy5sZW5ndGhcbiAgaWYgKHNhbWVMZW5ndGgpIHtcbiAgICAvLyB0cmFja0J5IGNhc2U6IGlmIHRoZSBrZXkgc2VxdWVuY2UgaXMgaWRlbnRpY2FsLCB3ZSBjYW4gcmV1c2Ugb2xkIGlkcztcbiAgICAvLyBvdGhlcndpc2Ugd2UgbXVzdCByZWNvbmNpbGUgYnkga2V5IChhdm9pZCBtaXNjbGFzc2lmeWluZyBjbG9uZStyZW9yZGVyIGFzIFwibm8gcmVvcmRlclwiKS5cbiAgICBpZiAodHJhY2tCeSkge1xuICAgICAgY29uc3QgY2FuVXNlS2V5cyA9IGhhc1N0YWJsZVRyYWNrQnlLZXlzKHByZXYuaXRlbXNSZWYsIHRyYWNrQnkpICYmIGhhc1N0YWJsZVRyYWNrQnlLZXlzKG5leHRJdGVtcywgdHJhY2tCeSlcbiAgICAgIGlmIChjYW5Vc2VLZXlzKSB7XG4gICAgICAgIGlmIChpc1NhbWVUcmFja0J5U2VxdWVuY2UocHJldi5pdGVtc1JlZiwgbmV4dEl0ZW1zLCB0cmFja0J5KSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZHM6IHByZXYuaWRzLFxuICAgICAgICAgICAgcmVtb3ZlZDogW10sXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0cmFja0J5IGtleXMgYXJlIG5vdCBhdmFpbGFibGUsIGZhbGwgYmFjayB0byByZWZlcmVuY2UtbGV2ZWwgZGV0ZWN0aW9uIChrZWVwIHN0YWJpbGl0eSBmb3IgXCJjbG9uZWQgYnV0IG5vdCByZW9yZGVyZWRcIikuXG4gICAgICAgIGlmICghZGlkUmVvcmRlckJ5UmVmZXJlbmNlKHByZXYuaXRlbXNSZWYsIG5leHRJdGVtcykpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWRzOiBwcmV2LmlkcyxcbiAgICAgICAgICAgIHJlbW92ZWQ6IFtdLFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWRpZFJlb3JkZXJCeVJlZmVyZW5jZShwcmV2Lml0ZW1zUmVmLCBuZXh0SXRlbXMpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZHM6IHByZXYuaWRzLFxuICAgICAgICByZW1vdmVkOiBbXSxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBrZXlPZiA9IChpdGVtOiB1bmtub3duKTogdW5rbm93biA9PiB7XG4gICAgaWYgKCF0cmFja0J5KSByZXR1cm4gaXRlbVxuICAgIGNvbnN0IGsgPSByZWFkVHJhY2tCeShpdGVtLCB0cmFja0J5KVxuICAgIHJldHVybiBrICE9PSB1bmRlZmluZWQgPyBrIDogaXRlbVxuICB9XG5cbiAgY29uc3QgYnVja2V0cyA9IG5ldyBNYXA8dW5rbm93biwgQXJyYXk8Um93SWQ+PigpXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJldi5pdGVtc1JlZi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGtleSA9IGtleU9mKHByZXYuaXRlbXNSZWZbaV0pXG4gICAgY29uc3QgbGlzdCA9IGJ1Y2tldHMuZ2V0KGtleSkgPz8gW11cbiAgICBsaXN0LnB1c2gocHJldi5pZHNbaV0hKVxuICAgIGJ1Y2tldHMuc2V0KGtleSwgbGlzdClcbiAgfVxuXG4gIGNvbnN0IGlkczogQXJyYXk8Um93SWQ+ID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXh0SXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBrZXlPZihuZXh0SXRlbXNbaV0pXG4gICAgY29uc3QgbGlzdCA9IGJ1Y2tldHMuZ2V0KGtleSlcbiAgICBpZiAobGlzdCAmJiBsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGlkcy5wdXNoKGxpc3Quc2hpZnQoKSEpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlkcy5wdXNoKG5leHRSb3dJZCgpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlbW92ZWQ6IEFycmF5PFJvd0lkPiA9IFtdXG4gIGZvciAoY29uc3QgbGlzdCBvZiBidWNrZXRzLnZhbHVlcygpKSB7XG4gICAgcmVtb3ZlZC5wdXNoKC4uLmxpc3QpXG4gIH1cblxuICByZXR1cm4geyBpZHMsIHJlbW92ZWQgfVxufVxuXG5jb25zdCBidWlsZEluZGV4QnlJZCA9IChpZHM6IFJlYWRvbmx5QXJyYXk8Um93SWQ+KTogUmVhZG9ubHlNYXA8Um93SWQsIG51bWJlcj4gPT4ge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPFJvd0lkLCBudW1iZXI+KClcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICBtYXAuc2V0KGlkc1tpXSEsIGkpXG4gIH1cbiAgcmV0dXJuIG1hcFxufVxuXG5leHBvcnQgY2xhc3MgUm93SWRTdG9yZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdHMgPSBuZXcgTWFwPHN0cmluZywgTGlzdFN0YXRlPigpXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVtb3ZhbExpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8TGlzdFJlbW92YWxMaXN0ZW5lcj4+KClcbiAgcHJpdmF0ZSByZWFkb25seSByb3dJZEluZGV4ID0gbmV3IE1hcDxcbiAgICBSb3dJZCxcbiAgICB7IHJlYWRvbmx5IGtleTogc3RyaW5nOyByZWFkb25seSBsaXN0UGF0aDogc3RyaW5nOyByZWFkb25seSBpbmRleDogbnVtYmVyIH1cbiAgPigpXG4gIHByaXZhdGUgbmV4dFJvd1NlcSA9IDBcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmcpIHt9XG5cbiAgcHJpdmF0ZSBsaXN0S2V5ID0gKGxpc3RQYXRoOiBzdHJpbmcsIHBhcmVudFJvd0lkPzogUm93SWQpOiBzdHJpbmcgPT5cbiAgICBwYXJlbnRSb3dJZCA/IGAke2xpc3RQYXRofUBAJHtwYXJlbnRSb3dJZH1gIDogbGlzdFBhdGhcblxuICBwcml2YXRlIG1ha2VSb3dJZCA9ICgpOiBSb3dJZCA9PiB7XG4gICAgdGhpcy5uZXh0Um93U2VxICs9IDFcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZUlkID8gYCR7dGhpcy5pbnN0YW5jZUlkfTo6ciR7dGhpcy5uZXh0Um93U2VxfWAgOiBgciR7dGhpcy5uZXh0Um93U2VxfWBcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5UmVtb3ZlZChsaXN0UGF0aDogc3RyaW5nLCByb3dJZDogUm93SWQpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLnJlbW92YWxMaXN0ZW5lcnMuZ2V0KGxpc3RQYXRoKVxuICAgIGlmICghbGlzdGVuZXJzIHx8IGxpc3RlbmVycy5zaXplID09PSAwKSByZXR1cm5cbiAgICBmb3IgKGNvbnN0IGZuIG9mIGxpc3RlbmVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4ocm93SWQpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbGlzdGVuZXIgZmFpbHVyZXMgc2hvdWxkIG5ldmVyIGJyZWFrIHJ1bnRpbWUgYmVoYXZpb3JcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURlc2NlbmRhbnRzKHBhcmVudFJvd0lkOiBSb3dJZCk6IHZvaWQge1xuICAgIGNvbnN0IGtleXM6IEFycmF5PHN0cmluZz4gPSBbXVxuICAgIGZvciAoY29uc3QgW2ssIHN0XSBvZiB0aGlzLmxpc3RzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHN0LnBhcmVudFJvd0lkID09PSBwYXJlbnRSb3dJZCkga2V5cy5wdXNoKGspXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3Qgc3QgPSB0aGlzLmxpc3RzLmdldChrZXkpXG4gICAgICBpZiAoIXN0KSBjb250aW51ZVxuICAgICAgdGhpcy5saXN0cy5kZWxldGUoa2V5KVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdC5pZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm93SWQgPSBzdC5pZHNbaV0hXG4gICAgICAgIHRoaXMucm93SWRJbmRleC5kZWxldGUocm93SWQpXG4gICAgICAgIHRoaXMubm90aWZ5UmVtb3ZlZChzdC5saXN0UGF0aCwgcm93SWQpXG4gICAgICAgIHRoaXMucmVtb3ZlRGVzY2VuZGFudHMocm93SWQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25SZW1vdmVkKGxpc3RQYXRoOiBzdHJpbmcsIGxpc3RlbmVyOiBMaXN0UmVtb3ZhbExpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgY29uc3Qgc2V0ID0gdGhpcy5yZW1vdmFsTGlzdGVuZXJzLmdldChsaXN0UGF0aCkgPz8gbmV3IFNldDxMaXN0UmVtb3ZhbExpc3RlbmVyPigpXG4gICAgc2V0LmFkZChsaXN0ZW5lcilcbiAgICB0aGlzLnJlbW92YWxMaXN0ZW5lcnMuc2V0KGxpc3RQYXRoLCBzZXQpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJlbW92YWxMaXN0ZW5lcnMuZ2V0KGxpc3RQYXRoKVxuICAgICAgaWYgKCFjdXJyZW50KSByZXR1cm5cbiAgICAgIGN1cnJlbnQuZGVsZXRlKGxpc3RlbmVyKVxuICAgICAgaWYgKGN1cnJlbnQuc2l6ZSA9PT0gMCkgdGhpcy5yZW1vdmFsTGlzdGVuZXJzLmRlbGV0ZShsaXN0UGF0aClcbiAgICB9XG4gIH1cblxuICBnZXRSb3dJZChsaXN0UGF0aDogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBwYXJlbnRSb3dJZD86IFJvd0lkKTogUm93SWQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5saXN0cy5nZXQodGhpcy5saXN0S2V5KGxpc3RQYXRoLCBwYXJlbnRSb3dJZCkpXG4gICAgcmV0dXJuIHN0YXRlID8gc3RhdGUuaWRzW2luZGV4XSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgZ2V0SW5kZXgobGlzdFBhdGg6IHN0cmluZywgcm93SWQ6IFJvd0lkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5yb3dJZEluZGV4LmdldChyb3dJZClcbiAgICBpZiAoIWluZm8pIHJldHVybiB1bmRlZmluZWRcbiAgICBpZiAoaW5mby5saXN0UGF0aCAhPT0gbGlzdFBhdGgpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gaW5mby5pbmRleFxuICB9XG5cbiAgLyoqXG4gICAqIGVuc3VyZUxpc3RcdUZGMUFcbiAgICogLSBBbGlnbiBSb3dJRCBtYXBwaW5nIGZvciB0aGUgZ2l2ZW4gbGlzdFBhdGggd2l0aCB0aGUgY3VycmVudCBpdGVtcy5cbiAgICogLSBSZXR1cm5zIHRoZSBsYXRlc3QgaWRzIChpbmRleCAtPiBSb3dJZCkuXG4gICAqL1xuICBlbnN1cmVMaXN0KFxuICAgIGxpc3RQYXRoOiBzdHJpbmcsXG4gICAgaXRlbXM6IFJlYWRvbmx5QXJyYXk8dW5rbm93bj4sXG4gICAgdHJhY2tCeT86IHN0cmluZyxcbiAgICBwYXJlbnRSb3dJZD86IFJvd0lkLFxuICApOiBSZWFkb25seUFycmF5PFJvd0lkPiB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5saXN0S2V5KGxpc3RQYXRoLCBwYXJlbnRSb3dJZClcbiAgICBjb25zdCBwcmV2ID0gdGhpcy5saXN0cy5nZXQoa2V5KVxuICAgIGNvbnN0IHsgaWRzLCByZW1vdmVkIH0gPSByZWNvbmNpbGVJZHMocHJldiwgaXRlbXMsIHRyYWNrQnkgPz8gcHJldj8udHJhY2tCeSwgdGhpcy5tYWtlUm93SWQpXG5cbiAgICBjb25zdCBuZXh0OiBMaXN0U3RhdGUgPSB7XG4gICAgICBsaXN0UGF0aCxcbiAgICAgIHBhcmVudFJvd0lkLFxuICAgICAgaXRlbXNSZWY6IGl0ZW1zLFxuICAgICAgaWRzLFxuICAgICAgaW5kZXhCeUlkOiBidWlsZEluZGV4QnlJZChpZHMpLFxuICAgICAgdHJhY2tCeTogdHJhY2tCeSA/PyBwcmV2Py50cmFja0J5LFxuICAgIH1cbiAgICB0aGlzLmxpc3RzLnNldChrZXksIG5leHQpXG5cbiAgICBpZiAocmVtb3ZlZC5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHJvd0lkIG9mIHJlbW92ZWQpIHtcbiAgICAgICAgdGhpcy5yb3dJZEluZGV4LmRlbGV0ZShyb3dJZClcbiAgICAgICAgdGhpcy5ub3RpZnlSZW1vdmVkKGxpc3RQYXRoLCByb3dJZClcbiAgICAgICAgdGhpcy5yZW1vdmVEZXNjZW5kYW50cyhyb3dJZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWZyZXNoIHRoZSByZXZlcnNlIHJvd0lkIC0+IGluZGV4IG1hcHBpbmcgKGluZGV4IGNoYW5nZXMgYXJlIGFsbG93ZWQpLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByb3dJZCA9IGlkc1tpXSFcbiAgICAgIHRoaXMucm93SWRJbmRleC5zZXQocm93SWQsIHsga2V5LCBsaXN0UGF0aCwgaW5kZXg6IGkgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gaWRzXG4gIH1cblxuICAvKipcbiAgICogdXBkYXRlQWxsXHVGRjFBXG4gICAqIC0gQWZ0ZXIgZWFjaCBjb21taXQsIGFsaWduIFJvd0lEIG1hcHBpbmdzIGZvciBhbGwga25vd24gbGlzdHMuXG4gICAqIC0gY29uZmlncyBjb21lIGZyb20gbGlzdCBkZWNsYXJhdGlvbnMgaW4gU3RhdGVUcmFpdFByb2dyYW0uc3BlYyAobWF5IGluY2x1ZGUgdHJhY2tCeSkuXG4gICAqL1xuICB1cGRhdGVBbGwoc3RhdGU6IHVua25vd24sIGNvbmZpZ3M6IFJlYWRvbmx5QXJyYXk8TGlzdENvbmZpZz4pOiB2b2lkIHtcbiAgICBjb25zdCBjZmdCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgTGlzdENvbmZpZz4oKVxuICAgIGNvbnN0IHBhdGhzOiBBcnJheTxzdHJpbmc+ID0gW11cbiAgICBmb3IgKGNvbnN0IGNmZyBvZiBjb25maWdzKSB7XG4gICAgICBpZiAoIWNmZyB8fCB0eXBlb2YgY2ZnLnBhdGggIT09ICdzdHJpbmcnKSBjb250aW51ZVxuICAgICAgY29uc3QgcCA9IGNmZy5wYXRoLnRyaW0oKVxuICAgICAgaWYgKCFwKSBjb250aW51ZVxuICAgICAgY2ZnQnlQYXRoLnNldChwLCBjZmcpXG4gICAgICBwYXRocy5wdXNoKHApXG4gICAgfVxuXG4gICAgY29uc3QgcGF0aFNldCA9IG5ldyBTZXQocGF0aHMpXG5cbiAgICBjb25zdCBwYXJlbnRPZiA9IChwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcuJykuZmlsdGVyKEJvb2xlYW4pXG4gICAgICBsZXQgYmVzdDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHNlZ21lbnRzLnNsaWNlKDAsIGkpLmpvaW4oJy4nKVxuICAgICAgICBpZiAocGF0aFNldC5oYXMocHJlZml4KSkgYmVzdCA9IHByZWZpeFxuICAgICAgfVxuICAgICAgcmV0dXJuIGJlc3RcbiAgICB9XG5cbiAgICBjb25zdCBwYXJlbnRCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPigpXG4gICAgY29uc3Qgc3VmZml4QnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKVxuICAgIGNvbnN0IGNoaWxkcmVuQnlQYXJlbnQgPSBuZXcgTWFwPHN0cmluZyB8IHVuZGVmaW5lZCwgQXJyYXk8c3RyaW5nPj4oKVxuXG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRPZihwYXRoKVxuICAgICAgcGFyZW50QnlQYXRoLnNldChwYXRoLCBwYXJlbnQpXG4gICAgICBjb25zdCBzdWZmaXggPSBwYXJlbnQgPyBwYXRoLnNsaWNlKHBhcmVudC5sZW5ndGggKyAxKSA6IHBhdGhcbiAgICAgIHN1ZmZpeEJ5UGF0aC5zZXQocGF0aCwgc3VmZml4KVxuICAgICAgY29uc3QgbGlzdCA9IGNoaWxkcmVuQnlQYXJlbnQuZ2V0KHBhcmVudCkgPz8gW11cbiAgICAgIGxpc3QucHVzaChwYXRoKVxuICAgICAgY2hpbGRyZW5CeVBhcmVudC5zZXQocGFyZW50LCBsaXN0KVxuICAgIH1cblxuICAgIC8vIHJvb3RzIGZpcnN0IChhbmQgZGV0ZXJtaW5pc3RpYyB0cmF2ZXJzYWwpXG4gICAgY29uc3Qgcm9vdHMgPSAoY2hpbGRyZW5CeVBhcmVudC5nZXQodW5kZWZpbmVkKSA/PyBbXSkuc2xpY2UoKS5zb3J0KClcblxuICAgIGNvbnN0IHZpc2l0ID0gKGxpc3RQYXRoOiBzdHJpbmcsIHBhcmVudFJvd0lkOiBSb3dJZCB8IHVuZGVmaW5lZCwgbGlzdFZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBjZmcgPSBjZmdCeVBhdGguZ2V0KGxpc3RQYXRoKVxuICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5pc0FycmF5KGxpc3RWYWx1ZSkgPyAobGlzdFZhbHVlIGFzIFJlYWRvbmx5QXJyYXk8dW5rbm93bj4pIDogW11cbiAgICAgIGNvbnN0IGlkcyA9IHRoaXMuZW5zdXJlTGlzdChsaXN0UGF0aCwgaXRlbXMsIGNmZz8udHJhY2tCeSwgcGFyZW50Um93SWQpXG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gKGNoaWxkcmVuQnlQYXJlbnQuZ2V0KGxpc3RQYXRoKSA/PyBbXSkuc2xpY2UoKS5zb3J0KClcbiAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHJvdyA9IGl0ZW1zW2ldXG4gICAgICAgIGNvbnN0IHJvd0lkID0gaWRzW2ldXG4gICAgICAgIGlmICghcm93SWQpIGNvbnRpbnVlXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGRQYXRoIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgY29uc3Qgc3VmZml4ID0gc3VmZml4QnlQYXRoLmdldChjaGlsZFBhdGgpID8/ICcnXG4gICAgICAgICAgY29uc3QgY2hpbGRWYWx1ZSA9IHN1ZmZpeCA/IGdldEF0UGF0aChyb3cgYXMgYW55LCBzdWZmaXgpIDogdW5kZWZpbmVkXG4gICAgICAgICAgdmlzaXQoY2hpbGRQYXRoLCByb3dJZCwgY2hpbGRWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgcm9vdCBvZiByb290cykge1xuICAgICAgY29uc3QgdmFsdWUgPSBnZXRBdFBhdGgoc3RhdGUgYXMgYW55LCByb290KVxuICAgICAgdmlzaXQocm9vdCwgdW5kZWZpbmVkLCB2YWx1ZSlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbGxlY3RMaXN0Q29uZmlncyA9IChzcGVjOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlYWRvbmx5QXJyYXk8TGlzdENvbmZpZz4gPT4ge1xuICBjb25zdCBjb25maWdzOiBBcnJheTxMaXN0Q29uZmlnPiA9IFtdXG4gIGZvciAoY29uc3Qga2V5IGluIHNwZWMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzcGVjLCBrZXkpKSBjb250aW51ZVxuICAgIGNvbnN0IHJhdyA9IHNwZWNba2V5XVxuICAgIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09ICdvYmplY3QnKSBjb250aW51ZVxuICAgIGNvbnN0IHRhZyA9IChyYXcgYXMgYW55KS5fdGFnXG4gICAgaWYgKHRhZyAhPT0gJ1N0YXRlVHJhaXRMaXN0JykgY29udGludWVcbiAgICBjb25zdCB0cmFja0J5ID0gKHJhdyBhcyBhbnkpLmlkZW50aXR5SGludD8udHJhY2tCeVxuICAgIGNvbmZpZ3MucHVzaCh7XG4gICAgICBwYXRoOiBrZXksXG4gICAgICB0cmFja0J5OiB0eXBlb2YgdHJhY2tCeSA9PT0gJ3N0cmluZycgPyB0cmFja0J5IDogdW5kZWZpbmVkLFxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIGNvbmZpZ3Ncbn1cbiIsICJpbXBvcnQgeyBDb250ZXh0LCBFZmZlY3QsIExheWVyIH0gZnJvbSAnZWZmZWN0J1xuXG5leHBvcnQgdHlwZSBSZXNvdXJjZVNuYXBzaG90UGhhc2UgPSAnaWRsZScgfCAnbG9hZGluZycgfCAnc3VjY2VzcycgfCAnZXJyb3InXG5cbmV4cG9ydCB0eXBlIFJlcGxheUxvZ0V2ZW50ID1cbiAgfCB7XG4gICAgICByZWFkb25seSBfdGFnOiAnUmVzb3VyY2VTbmFwc2hvdCdcbiAgICAgIHJlYWRvbmx5IHJlc291cmNlSWQ6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgZmllbGRQYXRoOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGtleUhhc2g/OiBzdHJpbmdcbiAgICAgIC8qKlxuICAgICAgICogT3B0aW9uYWw6IHNvdXJjZSBjb25jdXJyZW5jeSBwb2xpY3kgKGUuZy4gXCJzd2l0Y2hcIiAvIFwiZXhoYXVzdC10cmFpbGluZ1wiKS5cbiAgICAgICAqIC0gTXVzdCByZW1haW4gc2xpbSAmIHNlcmlhbGl6YWJsZS5cbiAgICAgICAqIC0gVXNlZCBieSBEZXZ0b29scy9yZXBsYXkgdG8gZXhwbGFpbiB3aHkgb2xkIHJlc3VsdHMgYXJlIGRyb3BwZWQgLyB3aHkgdHJhaWxpbmcgaGFwcGVucy5cbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgY29uY3VycmVuY3k/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHBoYXNlOiBSZXNvdXJjZVNuYXBzaG90UGhhc2VcbiAgICAgIHJlYWRvbmx5IHNuYXBzaG90OiB1bmtub3duXG4gICAgICByZWFkb25seSB0aW1lc3RhbXA6IG51bWJlclxuICAgICAgcmVhZG9ubHkgbW9kdWxlSWQ/OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGluc3RhbmNlSWQ/OiBzdHJpbmdcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgX3RhZzogJ0ludmFsaWRhdGVSZXF1ZXN0J1xuICAgICAgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXJcbiAgICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBpbnN0YW5jZUlkPzogc3RyaW5nXG4gICAgICByZWFkb25seSBraW5kOiAncmVzb3VyY2UnIHwgJ3F1ZXJ5J1xuICAgICAgcmVhZG9ubHkgdGFyZ2V0OiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IG1ldGE/OiB1bmtub3duXG4gICAgfVxuXG5leHBvcnQgdHlwZSBSZXNvdXJjZVNuYXBzaG90RXZlbnQgPSBFeHRyYWN0PFJlcGxheUxvZ0V2ZW50LCB7IHJlYWRvbmx5IF90YWc6ICdSZXNvdXJjZVNuYXBzaG90JyB9PlxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcGxheUxvZ1NlcnZpY2Uge1xuICByZWFkb25seSByZWNvcmQ6IChldmVudDogUmVwbGF5TG9nRXZlbnQpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZD5cbiAgcmVhZG9ubHkgc25hcHNob3Q6IEVmZmVjdC5FZmZlY3Q8UmVhZG9ubHlBcnJheTxSZXBsYXlMb2dFdmVudD4+XG4gIHJlYWRvbmx5IHJlc2V0Q3Vyc29yOiBFZmZlY3QuRWZmZWN0PHZvaWQ+XG4gIHJlYWRvbmx5IGNvbnN1bWVOZXh0OiAocHJlZGljYXRlOiAoZXZlbnQ6IFJlcGxheUxvZ0V2ZW50KSA9PiBib29sZWFuKSA9PiBFZmZlY3QuRWZmZWN0PFJlcGxheUxvZ0V2ZW50IHwgdW5kZWZpbmVkPlxuICByZWFkb25seSBjb25zdW1lTmV4dFJlc291cmNlU25hcHNob3Q6IChwYXJhbXM6IHtcbiAgICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmdcbiAgICByZWFkb25seSBmaWVsZFBhdGg6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGtleUhhc2g/OiBzdHJpbmdcbiAgICByZWFkb25seSBwaGFzZT86IFJlc291cmNlU25hcHNob3RQaGFzZVxuICB9KSA9PiBFZmZlY3QuRWZmZWN0PFJlc291cmNlU25hcHNob3RFdmVudCB8IHVuZGVmaW5lZD5cbn1cblxuZXhwb3J0IGNsYXNzIFJlcGxheUxvZyBleHRlbmRzIENvbnRleHQuVGFnKCdAbG9naXhqcy9jb3JlL1JlcGxheUxvZycpPFJlcGxheUxvZywgUmVwbGF5TG9nU2VydmljZT4oKSB7fVxuXG5leHBvcnQgY29uc3QgbWFrZSA9IChpbml0aWFsPzogUmVhZG9ubHlBcnJheTxSZXBsYXlMb2dFdmVudD4pOiBSZXBsYXlMb2dTZXJ2aWNlID0+IHtcbiAgY29uc3QgZXZlbnRzOiBBcnJheTxSZXBsYXlMb2dFdmVudD4gPSBpbml0aWFsID8gQXJyYXkuZnJvbShpbml0aWFsKSA6IFtdXG4gIGxldCBjdXJzb3IgPSAwXG5cbiAgY29uc3QgY29uc3VtZU5leHQgPSAocHJlZGljYXRlOiAoZXZlbnQ6IFJlcGxheUxvZ0V2ZW50KSA9PiBib29sZWFuKTogRWZmZWN0LkVmZmVjdDxSZXBsYXlMb2dFdmVudCB8IHVuZGVmaW5lZD4gPT5cbiAgICBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gY3Vyc29yOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRzW2ldXG4gICAgICAgIGlmICghcHJlZGljYXRlKGV2ZW50KSkgY29udGludWVcbiAgICAgICAgY3Vyc29yID0gaSArIDFcbiAgICAgICAgcmV0dXJuIGV2ZW50XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSlcblxuICBjb25zdCBjb25zdW1lTmV4dFJlc291cmNlU25hcHNob3QgPSAocGFyYW1zOiB7XG4gICAgcmVhZG9ubHkgcmVzb3VyY2VJZDogc3RyaW5nXG4gICAgcmVhZG9ubHkgZmllbGRQYXRoOiBzdHJpbmdcbiAgICByZWFkb25seSBrZXlIYXNoPzogc3RyaW5nXG4gICAgcmVhZG9ubHkgcGhhc2U/OiBSZXNvdXJjZVNuYXBzaG90UGhhc2VcbiAgfSk6IEVmZmVjdC5FZmZlY3Q8UmVzb3VyY2VTbmFwc2hvdEV2ZW50IHwgdW5kZWZpbmVkPiA9PlxuICAgIGNvbnN1bWVOZXh0KChldmVudCk6IGV2ZW50IGlzIFJlc291cmNlU25hcHNob3RFdmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQuX3RhZyAhPT0gJ1Jlc291cmNlU25hcHNob3QnKSByZXR1cm4gZmFsc2VcbiAgICAgIGlmIChldmVudC5yZXNvdXJjZUlkICE9PSBwYXJhbXMucmVzb3VyY2VJZCkgcmV0dXJuIGZhbHNlXG4gICAgICBpZiAoZXZlbnQuZmllbGRQYXRoICE9PSBwYXJhbXMuZmllbGRQYXRoKSByZXR1cm4gZmFsc2VcbiAgICAgIGlmIChwYXJhbXMua2V5SGFzaCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LmtleUhhc2ggIT09IHBhcmFtcy5rZXlIYXNoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgaWYgKHBhcmFtcy5waGFzZSAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LnBoYXNlICE9PSBwYXJhbXMucGhhc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0pLnBpcGUoRWZmZWN0Lm1hcCgoZXZlbnQpID0+IGV2ZW50IGFzIFJlc291cmNlU25hcHNob3RFdmVudCB8IHVuZGVmaW5lZCkpXG5cbiAgcmV0dXJuIHtcbiAgICByZWNvcmQ6IChldmVudCkgPT4gRWZmZWN0LnN5bmMoKCkgPT4gZXZlbnRzLnB1c2goZXZlbnQpKSxcbiAgICBzbmFwc2hvdDogRWZmZWN0LnN5bmMoKCkgPT4gZXZlbnRzLnNsaWNlKCkpLFxuICAgIHJlc2V0Q3Vyc29yOiBFZmZlY3Quc3luYygoKSA9PiB7XG4gICAgICBjdXJzb3IgPSAwXG4gICAgfSksXG4gICAgY29uc3VtZU5leHQsXG4gICAgY29uc3VtZU5leHRSZXNvdXJjZVNuYXBzaG90LFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsYXllciA9IChpbml0aWFsPzogUmVhZG9ubHlBcnJheTxSZXBsYXlMb2dFdmVudD4pOiBMYXllci5MYXllcjxSZXBsYXlMb2csIG5ldmVyLCBuZXZlcj4gPT5cbiAgTGF5ZXIuc3VjY2VlZChSZXBsYXlMb2csIG1ha2UoaW5pdGlhbCkpXG5cbmV4cG9ydCBjb25zdCByZWNvcmQgPSAoZXZlbnQ6IFJlcGxheUxvZ0V2ZW50KTogRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgUmVwbGF5TG9nPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3QgbG9nID0geWllbGQqIFJlcGxheUxvZ1xuICAgIHlpZWxkKiBsb2cucmVjb3JkKGV2ZW50KVxuICB9KVxuXG5leHBvcnQgY29uc3Qgc25hcHNob3Q6IEVmZmVjdC5FZmZlY3Q8UmVhZG9ubHlBcnJheTxSZXBsYXlMb2dFdmVudD4sIG5ldmVyLCBSZXBsYXlMb2c+ID0gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICBjb25zdCBsb2cgPSB5aWVsZCogUmVwbGF5TG9nXG4gIHJldHVybiB5aWVsZCogbG9nLnNuYXBzaG90XG59KVxuXG5leHBvcnQgY29uc3QgcmVzZXRDdXJzb3I6IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIFJlcGxheUxvZz4gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gIGNvbnN0IGxvZyA9IHlpZWxkKiBSZXBsYXlMb2dcbiAgeWllbGQqIGxvZy5yZXNldEN1cnNvclxufSlcblxuZXhwb3J0IGNvbnN0IGNvbnN1bWVOZXh0UmVzb3VyY2VTbmFwc2hvdCA9IChwYXJhbXM6IHtcbiAgcmVhZG9ubHkgcmVzb3VyY2VJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGZpZWxkUGF0aDogc3RyaW5nXG4gIHJlYWRvbmx5IGtleUhhc2g/OiBzdHJpbmdcbiAgcmVhZG9ubHkgcGhhc2U/OiBSZXNvdXJjZVNuYXBzaG90UGhhc2Vcbn0pOiBFZmZlY3QuRWZmZWN0PFJlc291cmNlU25hcHNob3RFdmVudCB8IHVuZGVmaW5lZCwgbmV2ZXIsIFJlcGxheUxvZz4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IGxvZyA9IHlpZWxkKiBSZXBsYXlMb2dcbiAgICByZXR1cm4geWllbGQqIGxvZy5jb25zdW1lTmV4dFJlc291cmNlU25hcHNob3QocGFyYW1zKVxuICB9KVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7OztBQVdBLElBQU0sZ0JBQWdCLENBQUMsU0FBeUM7QUFDOUQsTUFBSSxDQUFDLEtBQU0sUUFBTyxDQUFDO0FBQ25CLFNBQU8sS0FBSyxNQUFNLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUyxXQUFXLEtBQUssR0FBRyxJQUFJLE9BQU8sR0FBRyxJQUFJLEdBQUk7QUFDaEY7QUFFTyxJQUFNLFlBQVksQ0FBQyxPQUFZLFNBQXNCO0FBQzFELE1BQUksQ0FBQyxRQUFRLFNBQVMsS0FBTSxRQUFPO0FBQ25DLFFBQU0sV0FBVyxjQUFjLElBQUk7QUFDbkMsTUFBSSxVQUFlO0FBQ25CLGFBQVcsT0FBTyxVQUFVO0FBQzFCLFFBQUksV0FBVyxLQUFNLFFBQU87QUFDNUIsUUFBSSxPQUFPLFFBQVEsVUFBVTtBQUMzQixnQkFBVSxNQUFNLFFBQVEsT0FBTyxJQUFJLFFBQVEsR0FBRyxJQUFJLFFBQVEsT0FBTyxHQUFHLENBQUM7QUFDckU7QUFBQSxJQUNGO0FBQ0EsY0FBVSxRQUFRLEdBQUc7QUFBQSxFQUN2QjtBQUNBLFNBQU87QUFDVDtBQUVPLElBQU0sb0JBQW9CLENBQUMsT0FBZ0IsTUFBYyxVQUF5QjtBQUN2RixNQUFJLENBQUMsS0FBTTtBQUNYLFFBQU0sV0FBVyxjQUFjLElBQUk7QUFDbkMsTUFBSSxTQUFTLFdBQVcsRUFBRztBQUUzQixNQUFJLFVBQWU7QUFDbkIsV0FBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLFNBQVMsR0FBRyxLQUFLO0FBQzVDLFVBQU0sTUFBTSxTQUFTLENBQUM7QUFDdEIsVUFBTSxVQUFVLFNBQVMsSUFBSSxDQUFDO0FBRTlCLFVBQU0sT0FBTyxVQUFVLEdBQVU7QUFDakMsUUFBSSxRQUFRLFFBQVEsT0FBTyxTQUFTLFVBQVU7QUFDNUMsY0FBUSxHQUFVLElBQUksT0FBTyxZQUFZLFdBQVcsQ0FBQyxJQUFJLENBQUM7QUFBQSxJQUM1RDtBQUNBLGNBQVUsUUFBUSxHQUFVO0FBQUEsRUFDOUI7QUFFQSxRQUFNLE9BQU8sU0FBUyxTQUFTLFNBQVMsQ0FBQztBQUN6QyxVQUFRLElBQVcsSUFBSTtBQUN6QjtBQUVPLElBQU0sc0JBQXNCLENBQUMsT0FBZ0IsU0FBdUI7QUFDekUsTUFBSSxDQUFDLEtBQU07QUFDWCxRQUFNLFdBQVcsY0FBYyxJQUFJO0FBQ25DLE1BQUksU0FBUyxXQUFXLEVBQUc7QUFFM0IsTUFBSSxVQUFlO0FBQ25CLFdBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxTQUFTLEdBQUcsS0FBSztBQUM1QyxVQUFNLE1BQU0sU0FBUyxDQUFDO0FBQ3RCLFVBQU0sT0FBTyxVQUFVLEdBQVU7QUFDakMsUUFBSSxRQUFRLFFBQVEsT0FBTyxTQUFTLFVBQVU7QUFDNUM7QUFBQSxJQUNGO0FBQ0EsY0FBVTtBQUFBLEVBQ1o7QUFFQSxRQUFNLE9BQU8sU0FBUyxTQUFTLFNBQVMsQ0FBQztBQUN6QyxNQUFJLE1BQU0sUUFBUSxPQUFPLEtBQUssT0FBTyxTQUFTLFVBQVU7QUFDdEQsWUFBUSxJQUFJLElBQUk7QUFDaEI7QUFBQSxFQUNGO0FBRUEsTUFBSSxXQUFXLE9BQU8sWUFBWSxVQUFVO0FBQzFDLFdBQU8sUUFBUSxJQUFXO0FBQUEsRUFDNUI7QUFDRjtBQWtCTyxJQUFNLHlCQUF5QixDQUFDLGNBQXFEO0FBQzFGLFFBQU0sTUFBTSxPQUFPLGNBQWMsV0FBVyxVQUFVLEtBQUssSUFBSTtBQUMvRCxNQUFJLENBQUMsSUFBSyxRQUFPO0FBRWpCLFFBQU0sV0FBVyxJQUFJLE1BQU0sR0FBRyxFQUFFLE9BQU8sT0FBTztBQUM5QyxNQUFJLGNBQWM7QUFDbEIsV0FBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLFFBQVEsS0FBSztBQUN4QyxRQUFJLFNBQVMsQ0FBQyxFQUFHLFNBQVMsSUFBSSxFQUFHLGVBQWM7QUFBQSxFQUNqRDtBQUNBLE1BQUksY0FBYyxFQUFHLFFBQU87QUFFNUIsUUFBTSxRQUFRLENBQUMsUUFBeUIsSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLE1BQU0sR0FBRyxFQUFFLElBQUk7QUFFaEYsUUFBTSxXQUFXLFNBQ2QsTUFBTSxHQUFHLGNBQWMsQ0FBQyxFQUN4QixJQUFJLEtBQUssRUFDVCxLQUFLLEdBQUc7QUFFWCxRQUFNLFdBQVcsU0FDZCxNQUFNLGNBQWMsQ0FBQyxFQUNyQixJQUFJLEtBQUssRUFDVCxLQUFLLEdBQUc7QUFFWCxTQUFPLEVBQUUsVUFBVSxTQUFTO0FBQzlCO0FBRU8sSUFBTSxzQkFBc0IsQ0FBQyxVQUFrQixPQUFlLGFBQ25FLFdBQVcsR0FBRyxRQUFRLElBQUksS0FBSyxJQUFJLFFBQVEsS0FBSyxHQUFHLFFBQVEsSUFBSSxLQUFLO0FBV3RFLElBQU0sY0FBYyxDQUFDLE1BQWUsWUFBNkI7QUFDL0QsTUFBSSxDQUFDLFFBQVEsT0FBTyxTQUFTLFNBQVUsUUFBTztBQUM5QyxRQUFNLFdBQVcsUUFBUSxNQUFNLEdBQUc7QUFDbEMsTUFBSSxVQUFlO0FBQ25CLGFBQVcsT0FBTyxVQUFVO0FBQzFCLFFBQUksV0FBVyxLQUFNLFFBQU87QUFDNUIsY0FBVSxRQUFRLEdBQVU7QUFBQSxFQUM5QjtBQUNBLFNBQU87QUFDVDtBQUVBLElBQU0sd0JBQXdCLENBQUMsV0FBbUMsY0FBK0M7QUFDL0csUUFBTSxVQUFVLG9CQUFJLElBQTRCO0FBQ2hELFdBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEtBQUs7QUFDekMsVUFBTSxPQUFPLFVBQVUsQ0FBQztBQUN4QixVQUFNLE9BQU8sUUFBUSxJQUFJLElBQUksS0FBSyxDQUFDO0FBQ25DLFNBQUssS0FBSyxDQUFDO0FBQ1gsWUFBUSxJQUFJLE1BQU0sSUFBSTtBQUFBLEVBQ3hCO0FBRUEsV0FBUyxZQUFZLEdBQUcsWUFBWSxVQUFVLFFBQVEsYUFBYTtBQUNqRSxVQUFNLE9BQU8sVUFBVSxTQUFTO0FBQ2hDLFVBQU0sSUFBSSxRQUFRLElBQUksSUFBSTtBQUMxQixRQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRztBQUMxQixVQUFNLFlBQVksRUFBRSxNQUFNO0FBQzFCLFFBQUksY0FBYyxXQUFXO0FBQzNCLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQUVBLElBQU0sdUJBQXVCLENBQUMsT0FBK0IsWUFDM0QsTUFBTSxNQUFNLENBQUMsU0FBUyxZQUFZLE1BQU0sT0FBTyxNQUFNLE1BQVM7QUFFaEUsSUFBTSx3QkFBd0IsQ0FDNUIsV0FDQSxXQUNBLFlBQ1k7QUFDWixNQUFJLFVBQVUsV0FBVyxVQUFVLE9BQVEsUUFBTztBQUNsRCxXQUFTLElBQUksR0FBRyxJQUFJLFVBQVUsUUFBUSxLQUFLO0FBQ3pDLFFBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxVQUFVLENBQUMsR0FBRyxPQUFPLEdBQUcsWUFBWSxVQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRztBQUN0RixhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7QUFFQSxJQUFNLGVBQWUsQ0FDbkIsTUFDQSxXQUNBLFNBQ0EsY0FDbUY7QUFDbkYsUUFBTSxZQUNKLGFBQ0MsdUJBQU07QUFDTCxRQUFJLFNBQVM7QUFDYixXQUFPLE1BQU07QUFDWCxnQkFBVTtBQUNWLGFBQU8sSUFBSSxNQUFNO0FBQUEsSUFDbkI7QUFBQSxFQUNGLEdBQUc7QUFFTCxNQUFJLENBQUMsTUFBTTtBQUNULFdBQU87QUFBQSxNQUNMLEtBQUssVUFBVSxJQUFJLE1BQU0sVUFBVSxDQUFDO0FBQUEsTUFDcEMsU0FBUyxDQUFDO0FBQUEsSUFDWjtBQUFBLEVBQ0Y7QUFFQSxNQUFJLEtBQUssYUFBYSxXQUFXO0FBQy9CLFdBQU87QUFBQSxNQUNMLEtBQUssS0FBSztBQUFBLE1BQ1YsU0FBUyxDQUFDO0FBQUEsSUFDWjtBQUFBLEVBQ0Y7QUFJQSxRQUFNLGFBQWEsS0FBSyxTQUFTLFdBQVcsVUFBVTtBQUN0RCxNQUFJLFlBQVk7QUFHZCxRQUFJLFNBQVM7QUFDWCxZQUFNLGFBQWEscUJBQXFCLEtBQUssVUFBVSxPQUFPLEtBQUsscUJBQXFCLFdBQVcsT0FBTztBQUMxRyxVQUFJLFlBQVk7QUFDZCxZQUFJLHNCQUFzQixLQUFLLFVBQVUsV0FBVyxPQUFPLEdBQUc7QUFDNUQsaUJBQU87QUFBQSxZQUNMLEtBQUssS0FBSztBQUFBLFlBQ1YsU0FBUyxDQUFDO0FBQUEsVUFDWjtBQUFBLFFBQ0Y7QUFBQSxNQUNGLE9BQU87QUFFTCxZQUFJLENBQUMsc0JBQXNCLEtBQUssVUFBVSxTQUFTLEdBQUc7QUFDcEQsaUJBQU87QUFBQSxZQUNMLEtBQUssS0FBSztBQUFBLFlBQ1YsU0FBUyxDQUFDO0FBQUEsVUFDWjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRixXQUFXLENBQUMsc0JBQXNCLEtBQUssVUFBVSxTQUFTLEdBQUc7QUFDM0QsYUFBTztBQUFBLFFBQ0wsS0FBSyxLQUFLO0FBQUEsUUFDVixTQUFTLENBQUM7QUFBQSxNQUNaO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFFBQVEsQ0FBQyxTQUEyQjtBQUN4QyxRQUFJLENBQUMsUUFBUyxRQUFPO0FBQ3JCLFVBQU0sSUFBSSxZQUFZLE1BQU0sT0FBTztBQUNuQyxXQUFPLE1BQU0sU0FBWSxJQUFJO0FBQUEsRUFDL0I7QUFFQSxRQUFNLFVBQVUsb0JBQUksSUFBMkI7QUFDL0MsV0FBUyxJQUFJLEdBQUcsSUFBSSxLQUFLLFNBQVMsUUFBUSxLQUFLO0FBQzdDLFVBQU0sTUFBTSxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUM7QUFDbEMsVUFBTSxPQUFPLFFBQVEsSUFBSSxHQUFHLEtBQUssQ0FBQztBQUNsQyxTQUFLLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBRTtBQUN0QixZQUFRLElBQUksS0FBSyxJQUFJO0FBQUEsRUFDdkI7QUFFQSxRQUFNLE1BQW9CLENBQUM7QUFDM0IsV0FBUyxJQUFJLEdBQUcsSUFBSSxVQUFVLFFBQVEsS0FBSztBQUN6QyxVQUFNLE1BQU0sTUFBTSxVQUFVLENBQUMsQ0FBQztBQUM5QixVQUFNLE9BQU8sUUFBUSxJQUFJLEdBQUc7QUFDNUIsUUFBSSxRQUFRLEtBQUssU0FBUyxHQUFHO0FBQzNCLFVBQUksS0FBSyxLQUFLLE1BQU0sQ0FBRTtBQUFBLElBQ3hCLE9BQU87QUFDTCxVQUFJLEtBQUssVUFBVSxDQUFDO0FBQUEsSUFDdEI7QUFBQSxFQUNGO0FBRUEsUUFBTSxVQUF3QixDQUFDO0FBQy9CLGFBQVcsUUFBUSxRQUFRLE9BQU8sR0FBRztBQUNuQyxZQUFRLEtBQUssR0FBRyxJQUFJO0FBQUEsRUFDdEI7QUFFQSxTQUFPLEVBQUUsS0FBSyxRQUFRO0FBQ3hCO0FBRUEsSUFBTSxpQkFBaUIsQ0FBQyxRQUEwRDtBQUNoRixRQUFNLE1BQU0sb0JBQUksSUFBbUI7QUFDbkMsV0FBUyxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztBQUNuQyxRQUFJLElBQUksSUFBSSxDQUFDLEdBQUksQ0FBQztBQUFBLEVBQ3BCO0FBQ0EsU0FBTztBQUNUO0FBRU8sSUFBTSxhQUFOLE1BQWlCO0FBQUEsRUFTdEIsWUFBNkIsWUFBcUI7QUFBckI7QUFSN0IsU0FBaUIsUUFBUSxvQkFBSSxJQUF1QjtBQUNwRCxTQUFpQixtQkFBbUIsb0JBQUksSUFBc0M7QUFDOUUsU0FBaUIsYUFBYSxvQkFBSSxJQUdoQztBQUNGLFNBQVEsYUFBYTtBQUlyQixTQUFRLFVBQVUsQ0FBQyxVQUFrQixnQkFDbkMsY0FBYyxHQUFHLFFBQVEsS0FBSyxXQUFXLEtBQUs7QUFFaEQsU0FBUSxZQUFZLE1BQWE7QUFDL0IsV0FBSyxjQUFjO0FBQ25CLGFBQU8sS0FBSyxhQUFhLEdBQUcsS0FBSyxVQUFVLE1BQU0sS0FBSyxVQUFVLEtBQUssSUFBSSxLQUFLLFVBQVU7QUFBQSxJQUMxRjtBQUFBLEVBUm1EO0FBQUEsRUFVM0MsY0FBYyxVQUFrQixPQUFvQjtBQUMxRCxVQUFNLFlBQVksS0FBSyxpQkFBaUIsSUFBSSxRQUFRO0FBQ3BELFFBQUksQ0FBQyxhQUFhLFVBQVUsU0FBUyxFQUFHO0FBQ3hDLGVBQVcsTUFBTSxXQUFXO0FBQzFCLFVBQUk7QUFDRixXQUFHLEtBQUs7QUFBQSxNQUNWLFFBQVE7QUFBQSxNQUVSO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLGtCQUFrQixhQUEwQjtBQUNsRCxVQUFNLE9BQXNCLENBQUM7QUFDN0IsZUFBVyxDQUFDLEdBQUcsRUFBRSxLQUFLLEtBQUssTUFBTSxRQUFRLEdBQUc7QUFDMUMsVUFBSSxHQUFHLGdCQUFnQixZQUFhLE1BQUssS0FBSyxDQUFDO0FBQUEsSUFDakQ7QUFFQSxlQUFXLE9BQU8sTUFBTTtBQUN0QixZQUFNLEtBQUssS0FBSyxNQUFNLElBQUksR0FBRztBQUM3QixVQUFJLENBQUMsR0FBSTtBQUNULFdBQUssTUFBTSxPQUFPLEdBQUc7QUFDckIsZUFBUyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksUUFBUSxLQUFLO0FBQ3RDLGNBQU0sUUFBUSxHQUFHLElBQUksQ0FBQztBQUN0QixhQUFLLFdBQVcsT0FBTyxLQUFLO0FBQzVCLGFBQUssY0FBYyxHQUFHLFVBQVUsS0FBSztBQUNyQyxhQUFLLGtCQUFrQixLQUFLO0FBQUEsTUFDOUI7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUFBLEVBRUEsVUFBVSxVQUFrQixVQUEyQztBQUNyRSxVQUFNLE1BQU0sS0FBSyxpQkFBaUIsSUFBSSxRQUFRLEtBQUssb0JBQUksSUFBeUI7QUFDaEYsUUFBSSxJQUFJLFFBQVE7QUFDaEIsU0FBSyxpQkFBaUIsSUFBSSxVQUFVLEdBQUc7QUFDdkMsV0FBTyxNQUFNO0FBQ1gsWUFBTSxVQUFVLEtBQUssaUJBQWlCLElBQUksUUFBUTtBQUNsRCxVQUFJLENBQUMsUUFBUztBQUNkLGNBQVEsT0FBTyxRQUFRO0FBQ3ZCLFVBQUksUUFBUSxTQUFTLEVBQUcsTUFBSyxpQkFBaUIsT0FBTyxRQUFRO0FBQUEsSUFDL0Q7QUFBQSxFQUNGO0FBQUEsRUFFQSxTQUFTLFVBQWtCLE9BQWUsYUFBd0M7QUFDaEYsVUFBTSxRQUFRLEtBQUssTUFBTSxJQUFJLEtBQUssUUFBUSxVQUFVLFdBQVcsQ0FBQztBQUNoRSxXQUFPLFFBQVEsTUFBTSxJQUFJLEtBQUssSUFBSTtBQUFBLEVBQ3BDO0FBQUEsRUFFQSxTQUFTLFVBQWtCLE9BQWtDO0FBQzNELFVBQU0sT0FBTyxLQUFLLFdBQVcsSUFBSSxLQUFLO0FBQ3RDLFFBQUksQ0FBQyxLQUFNLFFBQU87QUFDbEIsUUFBSSxLQUFLLGFBQWEsU0FBVSxRQUFPO0FBQ3ZDLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxXQUNFLFVBQ0EsT0FDQSxTQUNBLGFBQ3NCO0FBQ3RCLFVBQU0sTUFBTSxLQUFLLFFBQVEsVUFBVSxXQUFXO0FBQzlDLFVBQU0sT0FBTyxLQUFLLE1BQU0sSUFBSSxHQUFHO0FBQy9CLFVBQU0sRUFBRSxLQUFLLFFBQVEsSUFBSSxhQUFhLE1BQU0sT0FBTyxXQUFXLE1BQU0sU0FBUyxLQUFLLFNBQVM7QUFFM0YsVUFBTSxPQUFrQjtBQUFBLE1BQ3RCO0FBQUEsTUFDQTtBQUFBLE1BQ0EsVUFBVTtBQUFBLE1BQ1Y7QUFBQSxNQUNBLFdBQVcsZUFBZSxHQUFHO0FBQUEsTUFDN0IsU0FBUyxXQUFXLE1BQU07QUFBQSxJQUM1QjtBQUNBLFNBQUssTUFBTSxJQUFJLEtBQUssSUFBSTtBQUV4QixRQUFJLFFBQVEsU0FBUyxHQUFHO0FBQ3RCLGlCQUFXLFNBQVMsU0FBUztBQUMzQixhQUFLLFdBQVcsT0FBTyxLQUFLO0FBQzVCLGFBQUssY0FBYyxVQUFVLEtBQUs7QUFDbEMsYUFBSyxrQkFBa0IsS0FBSztBQUFBLE1BQzlCO0FBQUEsSUFDRjtBQUdBLGFBQVMsSUFBSSxHQUFHLElBQUksSUFBSSxRQUFRLEtBQUs7QUFDbkMsWUFBTSxRQUFRLElBQUksQ0FBQztBQUNuQixXQUFLLFdBQVcsSUFBSSxPQUFPLEVBQUUsS0FBSyxVQUFVLE9BQU8sRUFBRSxDQUFDO0FBQUEsSUFDeEQ7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLFVBQVUsT0FBZ0IsU0FBMEM7QUFDbEUsVUFBTSxZQUFZLG9CQUFJLElBQXdCO0FBQzlDLFVBQU0sUUFBdUIsQ0FBQztBQUM5QixlQUFXLE9BQU8sU0FBUztBQUN6QixVQUFJLENBQUMsT0FBTyxPQUFPLElBQUksU0FBUyxTQUFVO0FBQzFDLFlBQU0sSUFBSSxJQUFJLEtBQUssS0FBSztBQUN4QixVQUFJLENBQUMsRUFBRztBQUNSLGdCQUFVLElBQUksR0FBRyxHQUFHO0FBQ3BCLFlBQU0sS0FBSyxDQUFDO0FBQUEsSUFDZDtBQUVBLFVBQU0sVUFBVSxJQUFJLElBQUksS0FBSztBQUU3QixVQUFNLFdBQVcsQ0FBQyxTQUFxQztBQUNyRCxZQUFNLFdBQVcsS0FBSyxNQUFNLEdBQUcsRUFBRSxPQUFPLE9BQU87QUFDL0MsVUFBSTtBQUNKLGVBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxRQUFRLEtBQUs7QUFDeEMsY0FBTSxTQUFTLFNBQVMsTUFBTSxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFDNUMsWUFBSSxRQUFRLElBQUksTUFBTSxFQUFHLFFBQU87QUFBQSxNQUNsQztBQUNBLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSxlQUFlLG9CQUFJLElBQWdDO0FBQ3pELFVBQU0sZUFBZSxvQkFBSSxJQUFvQjtBQUM3QyxVQUFNLG1CQUFtQixvQkFBSSxJQUF1QztBQUVwRSxlQUFXLFFBQVEsT0FBTztBQUN4QixZQUFNLFNBQVMsU0FBUyxJQUFJO0FBQzVCLG1CQUFhLElBQUksTUFBTSxNQUFNO0FBQzdCLFlBQU0sU0FBUyxTQUFTLEtBQUssTUFBTSxPQUFPLFNBQVMsQ0FBQyxJQUFJO0FBQ3hELG1CQUFhLElBQUksTUFBTSxNQUFNO0FBQzdCLFlBQU0sT0FBTyxpQkFBaUIsSUFBSSxNQUFNLEtBQUssQ0FBQztBQUM5QyxXQUFLLEtBQUssSUFBSTtBQUNkLHVCQUFpQixJQUFJLFFBQVEsSUFBSTtBQUFBLElBQ25DO0FBR0EsVUFBTSxTQUFTLGlCQUFpQixJQUFJLE1BQVMsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLEtBQUs7QUFFbkUsVUFBTSxRQUFRLENBQUMsVUFBa0IsYUFBZ0MsY0FBNkI7QUFDNUYsWUFBTSxNQUFNLFVBQVUsSUFBSSxRQUFRO0FBQ2xDLFlBQU0sUUFBUSxNQUFNLFFBQVEsU0FBUyxJQUFLLFlBQXVDLENBQUM7QUFDbEYsWUFBTSxNQUFNLEtBQUssV0FBVyxVQUFVLE9BQU8sS0FBSyxTQUFTLFdBQVc7QUFFdEUsWUFBTSxZQUFZLGlCQUFpQixJQUFJLFFBQVEsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLEtBQUs7QUFDckUsVUFBSSxTQUFTLFdBQVcsRUFBRztBQUUzQixlQUFTLElBQUksR0FBRyxJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQ3JDLGNBQU0sTUFBTSxNQUFNLENBQUM7QUFDbkIsY0FBTSxRQUFRLElBQUksQ0FBQztBQUNuQixZQUFJLENBQUMsTUFBTztBQUNaLG1CQUFXLGFBQWEsVUFBVTtBQUNoQyxnQkFBTSxTQUFTLGFBQWEsSUFBSSxTQUFTLEtBQUs7QUFDOUMsZ0JBQU0sYUFBYSxTQUFTLFVBQVUsS0FBWSxNQUFNLElBQUk7QUFDNUQsZ0JBQU0sV0FBVyxPQUFPLFVBQVU7QUFBQSxRQUNwQztBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUEsZUFBVyxRQUFRLE9BQU87QUFDeEIsWUFBTSxRQUFRLFVBQVUsT0FBYyxJQUFJO0FBQzFDLFlBQU0sTUFBTSxRQUFXLEtBQUs7QUFBQSxJQUM5QjtBQUFBLEVBQ0Y7QUFDRjtBQUVPLElBQU0scUJBQXFCLENBQUMsU0FBNkQ7QUFDOUYsUUFBTSxVQUE2QixDQUFDO0FBQ3BDLGFBQVcsT0FBTyxNQUFNO0FBQ3RCLFFBQUksQ0FBQyxPQUFPLFVBQVUsZUFBZSxLQUFLLE1BQU0sR0FBRyxFQUFHO0FBQ3RELFVBQU0sTUFBTSxLQUFLLEdBQUc7QUFDcEIsUUFBSSxDQUFDLE9BQU8sT0FBTyxRQUFRLFNBQVU7QUFDckMsVUFBTSxNQUFPLElBQVk7QUFDekIsUUFBSSxRQUFRLGlCQUFrQjtBQUM5QixVQUFNLFVBQVcsSUFBWSxjQUFjO0FBQzNDLFlBQVEsS0FBSztBQUFBLE1BQ1gsTUFBTTtBQUFBLE1BQ04sU0FBUyxPQUFPLFlBQVksV0FBVyxVQUFVO0FBQUEsSUFDbkQsQ0FBQztBQUFBLEVBQ0g7QUFDQSxTQUFPO0FBQ1Q7OztBQ3hlQSxTQUFTLFNBQVMsUUFBUSxhQUFhO0FBK0NoQyxJQUFNLFlBQU4sY0FBd0IsUUFBUSxJQUFJLHlCQUF5QixFQUErQixFQUFFO0FBQUM7QUF3RC9GLElBQU0sV0FBMkUsT0FBTyxJQUFJLGFBQWE7QUFDOUcsUUFBTSxNQUFNLE9BQU87QUFDbkIsU0FBTyxPQUFPLElBQUk7QUFDcEIsQ0FBQztBQUVNLElBQU0sY0FBcUQsT0FBTyxJQUFJLGFBQWE7QUFDeEYsUUFBTSxNQUFNLE9BQU87QUFDbkIsU0FBTyxJQUFJO0FBQ2IsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K