@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.
- package/LICENSE +201 -0
- package/package.json +3 -1
- package/public/sandbox/chunks/chunk-2AUQRESB.js +1114 -0
- package/public/sandbox/chunks/chunk-2F72LQKW.js +194 -0
- package/public/sandbox/chunks/chunk-2PYDGDD3.js +4071 -0
- package/public/sandbox/chunks/chunk-2UGKSXDZ.js +16 -0
- package/public/sandbox/chunks/chunk-2XVE7F26.js +153 -0
- package/public/sandbox/chunks/chunk-3A7TFNZN.js +219 -0
- package/public/sandbox/chunks/chunk-3BHC6JAV.js +1070 -0
- package/public/sandbox/chunks/chunk-3U4CAKCX.js +61 -0
- package/public/sandbox/chunks/chunk-3VU3JLZO.js +272 -0
- package/public/sandbox/chunks/chunk-4CPONKWY.js +1170 -0
- package/public/sandbox/chunks/chunk-4GMUQTWH.js +850 -0
- package/public/sandbox/chunks/chunk-4KIYG5E4.js +749 -0
- package/public/sandbox/chunks/chunk-4MY35XR3.js +175 -0
- package/public/sandbox/chunks/chunk-5DNHJMHA.js +69 -0
- package/public/sandbox/chunks/chunk-5EC4S7X6.js +42 -0
- package/public/sandbox/chunks/chunk-5FB7QFSH.js +227 -0
- package/public/sandbox/chunks/chunk-5GEYCJW2.js +206 -0
- package/public/sandbox/chunks/chunk-5PT7Q5SS.js +373 -0
- package/public/sandbox/chunks/chunk-5WN5IGKA.js +166 -0
- package/public/sandbox/chunks/chunk-5XOBKSOT.js +213 -0
- package/public/sandbox/chunks/chunk-67RVISUC.js +313 -0
- package/public/sandbox/chunks/chunk-6ELJEKZS.js +12 -0
- package/public/sandbox/chunks/chunk-6FKWRVP4.js +85 -0
- package/public/sandbox/chunks/chunk-6JRP52YT.js +34 -0
- package/public/sandbox/chunks/chunk-6JYAC3G6.js +42 -0
- package/public/sandbox/chunks/chunk-6TUOP63Q.js +86 -0
- package/public/sandbox/chunks/{chunk-A6JFUNQQ.js → chunk-74C5VW7Z.js} +2 -2
- package/public/sandbox/chunks/chunk-75DQFC5M.js +16 -0
- package/public/sandbox/chunks/{chunk-UCFEP3BH.js → chunk-7GPAF2UK.js} +1 -1
- package/public/sandbox/chunks/chunk-7KQFTS2Y.js +135 -0
- package/public/sandbox/chunks/chunk-7POKWYE3.js +112 -0
- package/public/sandbox/chunks/chunk-7VUEF5F3.js +395 -0
- package/public/sandbox/chunks/chunk-7W5APZS2.js +77 -0
- package/public/sandbox/chunks/chunk-A6OFCXDQ.js +397 -0
- package/public/sandbox/chunks/chunk-A7HLOSO6.js +216 -0
- package/public/sandbox/chunks/chunk-AGF4RRCB.js +408 -0
- package/public/sandbox/chunks/chunk-ASJSJAAL.js +122 -0
- package/public/sandbox/chunks/chunk-ASVMK364.js +283 -0
- package/public/sandbox/chunks/chunk-AUDTI2BQ.js +895 -0
- package/public/sandbox/chunks/chunk-B2SZTA3M.js +16 -0
- package/public/sandbox/chunks/chunk-B6YS2UMV.js +372 -0
- package/public/sandbox/chunks/chunk-BCEO3MGD.js +244 -0
- package/public/sandbox/chunks/chunk-BCOO65D4.js +373 -0
- package/public/sandbox/chunks/chunk-BJOWSSEL.js +38 -0
- package/public/sandbox/chunks/chunk-BS2WBFW4.js +373 -0
- package/public/sandbox/chunks/chunk-BUVHG3NJ.js +439 -0
- package/public/sandbox/chunks/chunk-BVE33AN6.js +42 -0
- package/public/sandbox/chunks/chunk-BWTGJZVP.js +19 -0
- package/public/sandbox/chunks/chunk-BXD7GZC3.js +1025 -0
- package/public/sandbox/chunks/chunk-BZH4EUUD.js +164 -0
- package/public/sandbox/chunks/{chunk-HFV5GJPK.js → chunk-C2MYMMO4.js} +3 -3
- package/public/sandbox/chunks/chunk-CRE4NJJ6.js +271 -0
- package/public/sandbox/chunks/chunk-CVZPRIDB.js +706 -0
- package/public/sandbox/chunks/chunk-CWOXD5NG.js +991 -0
- package/public/sandbox/chunks/chunk-D6DOC3BJ.js +373 -0
- package/public/sandbox/chunks/chunk-DEPSGFSY.js +1698 -0
- package/public/sandbox/chunks/chunk-DM7C5NP5.js +819 -0
- package/public/sandbox/chunks/chunk-DN33LMOF.js +1112 -0
- package/public/sandbox/chunks/{chunk-S46P7MC6.js → chunk-DT7YIIWE.js} +2 -2
- package/public/sandbox/chunks/chunk-DVB5WRCI.js +260 -0
- package/public/sandbox/chunks/{chunk-TOHCFMQS.js → chunk-E3EVW7NR.js} +11 -18
- package/public/sandbox/chunks/chunk-E5BV567Q.js +417 -0
- package/public/sandbox/chunks/chunk-E7BIWMQQ.js +203 -0
- package/public/sandbox/chunks/chunk-EAKGPSOQ.js +83 -0
- package/public/sandbox/chunks/chunk-EGUYL2ER.js +75 -0
- package/public/sandbox/chunks/chunk-EP5GQYZ5.js +85 -0
- package/public/sandbox/chunks/chunk-ET6CJEHC.js +221 -0
- package/public/sandbox/chunks/chunk-EU67YZHZ.js +1070 -0
- package/public/sandbox/chunks/{chunk-PTSJJANP.js → chunk-EYNDQLSB.js} +1 -1
- package/public/sandbox/chunks/{chunk-CEGSWZ5S.js → chunk-EZTMVCJF.js} +1 -1
- package/public/sandbox/chunks/chunk-F5CLVIS6.js +907 -0
- package/public/sandbox/chunks/chunk-F743SKYD.js +85 -0
- package/public/sandbox/chunks/chunk-FEGFZ5OX.js +86 -0
- package/public/sandbox/chunks/chunk-FG5B7ZX3.js +373 -0
- package/public/sandbox/chunks/chunk-FKZPYMDG.js +373 -0
- package/public/sandbox/chunks/chunk-FNLXHWIU.js +220 -0
- package/public/sandbox/chunks/chunk-FQRUTYAD.js +1991 -0
- package/public/sandbox/chunks/{chunk-VLYP4WUS.js → chunk-FY5A73NK.js} +5 -5
- package/public/sandbox/chunks/chunk-G7FAOG3O.js +221 -0
- package/public/sandbox/chunks/chunk-GFXHUC7Y.js +73 -0
- package/public/sandbox/chunks/chunk-GIPXUIZQ.js +534 -0
- package/public/sandbox/chunks/chunk-GP37MEGJ.js +52 -0
- package/public/sandbox/chunks/chunk-GXL5QCMF.js +4511 -0
- package/public/sandbox/chunks/chunk-GZ2NSE6A.js +177 -0
- package/public/sandbox/chunks/chunk-GZATW4YD.js +69 -0
- package/public/sandbox/chunks/chunk-H4EBXROQ.js +166 -0
- package/public/sandbox/chunks/chunk-HETCPK6Z.js +153 -0
- package/public/sandbox/chunks/chunk-HGUFQ2QC.js +4431 -0
- package/public/sandbox/chunks/chunk-HGV3VNH3.js +255 -0
- package/public/sandbox/chunks/chunk-HIJ67QWR.js +5397 -0
- package/public/sandbox/chunks/chunk-IDHERBKW.js +1114 -0
- package/public/sandbox/chunks/chunk-IDTK4FIY.js +102 -0
- package/public/sandbox/chunks/chunk-ILFVY7H5.js +164 -0
- package/public/sandbox/chunks/chunk-ISGSRYGO.js +57 -0
- package/public/sandbox/chunks/chunk-J45VPU24.js +408 -0
- package/public/sandbox/chunks/chunk-JAUIM3O5.js +42 -0
- package/public/sandbox/chunks/chunk-JB7OQEM6.js +373 -0
- package/public/sandbox/chunks/chunk-JCKW6NHD.js +15 -0
- package/public/sandbox/chunks/chunk-JMA7GY7Z.js +221 -0
- package/public/sandbox/chunks/chunk-JY46J6IL.js +836 -0
- package/public/sandbox/chunks/{chunk-X72PZOFA.js → chunk-K2MQ66O7.js} +1 -1
- package/public/sandbox/chunks/chunk-KA7PZA6F.js +464 -0
- package/public/sandbox/chunks/chunk-KDEQTUID.js +102 -0
- package/public/sandbox/chunks/chunk-KDJR27JV.js +1696 -0
- package/public/sandbox/chunks/chunk-KFE3JO6N.js +77 -0
- package/public/sandbox/chunks/chunk-KLDSYWT5.js +536 -0
- package/public/sandbox/chunks/chunk-KQWWFYBF.js +203 -0
- package/public/sandbox/chunks/chunk-KTFZSXOW.js +6473 -0
- package/public/sandbox/chunks/chunk-KXVIC55U.js +108 -0
- package/public/sandbox/chunks/{chunk-HNEDTEGQ.js → chunk-L4PNO2H6.js} +1 -1
- package/public/sandbox/chunks/{chunk-WE4STGO2.js → chunk-L4ZNW5DI.js} +2 -2
- package/public/sandbox/chunks/chunk-LBUINGZ4.js +836 -0
- package/public/sandbox/chunks/chunk-LIYPPU6I.js +112 -0
- package/public/sandbox/chunks/chunk-LJHTOJXW.js +221 -0
- package/public/sandbox/chunks/{chunk-BWSNPKO5.js → chunk-LQL23SWJ.js} +2 -2
- package/public/sandbox/chunks/chunk-LTFCYZQ6.js +46 -0
- package/public/sandbox/chunks/chunk-LTWLVCKQ.js +166 -0
- package/public/sandbox/chunks/chunk-LWI7BXFN.js +395 -0
- package/public/sandbox/chunks/chunk-LYBBX6WM.js +225 -0
- package/public/sandbox/chunks/chunk-MXE7HIBM.js +474 -0
- package/public/sandbox/chunks/chunk-MYBDYNK4.js +6004 -0
- package/public/sandbox/chunks/chunk-NC2MIWZX.js +732 -0
- package/public/sandbox/chunks/chunk-NE447XAF.js +597 -0
- package/public/sandbox/chunks/chunk-NEAYV5C2.js +255 -0
- package/public/sandbox/chunks/chunk-NMGFJZ4I.js +26 -0
- package/public/sandbox/chunks/chunk-NWCJJZNQ.js +71 -0
- package/public/sandbox/chunks/chunk-O57OZBDR.js +214 -0
- package/public/sandbox/chunks/chunk-OJJT664Q.js +731 -0
- package/public/sandbox/chunks/chunk-OKTBUTCH.js +1175 -0
- package/public/sandbox/chunks/chunk-OQ4SYV5D.js +534 -0
- package/public/sandbox/chunks/chunk-OTVVIHJD.js +219 -0
- package/public/sandbox/chunks/chunk-OWTMSCF7.js +1052 -0
- package/public/sandbox/chunks/chunk-P5ZQNFC3.js +122 -0
- package/public/sandbox/chunks/chunk-PBPT2U2N.js +1698 -0
- package/public/sandbox/chunks/chunk-PHBJLCP3.js +836 -0
- package/public/sandbox/chunks/chunk-PHV4HYHB.js +397 -0
- package/public/sandbox/chunks/chunk-PIXQ6SOX.js +4071 -0
- package/public/sandbox/chunks/chunk-PKJL6YLK.js +73 -0
- package/public/sandbox/chunks/chunk-PKPOITIU.js +221 -0
- package/public/sandbox/chunks/{chunk-NQW73ACJ.js → chunk-PMXBOYQI.js} +1 -1
- package/public/sandbox/chunks/chunk-PQLZD7NR.js +836 -0
- package/public/sandbox/chunks/chunk-QEESVOZU.js +16 -0
- package/public/sandbox/chunks/chunk-QGIM3FQK.js +159 -0
- package/public/sandbox/chunks/chunk-QL5JNEDO.js +69 -0
- package/public/sandbox/chunks/chunk-QQOZ3RMH.js +867 -0
- package/public/sandbox/chunks/chunk-QUMEVT2F.js +194 -0
- package/public/sandbox/chunks/chunk-QVZBXYVY.js +102 -0
- package/public/sandbox/chunks/chunk-R5HQS6RB.js +135 -0
- package/public/sandbox/chunks/chunk-R75Q2CTT.js +900 -0
- package/public/sandbox/chunks/chunk-RBB6SHW2.js +253 -0
- package/public/sandbox/chunks/chunk-RDHNRWQP.js +383 -0
- package/public/sandbox/chunks/chunk-RIWOEI3T.js +1101 -0
- package/public/sandbox/chunks/chunk-RS5FFPUV.js +103 -0
- package/public/sandbox/chunks/chunk-RYSSJBGX.js +203 -0
- package/public/sandbox/chunks/chunk-S3KBAE5Z.js +1114 -0
- package/public/sandbox/chunks/chunk-S6ZZHV6G.js +244 -0
- package/public/sandbox/chunks/chunk-SFXJ24HY.js +499 -0
- package/public/sandbox/chunks/chunk-SH7TP5CJ.js +1109 -0
- package/public/sandbox/chunks/chunk-SI5OKFFY.js +317 -0
- package/public/sandbox/chunks/chunk-SIXNQNIR.js +86 -0
- package/public/sandbox/chunks/chunk-ST353BOX.js +42 -0
- package/public/sandbox/chunks/chunk-SYEHKMLP.js +1140 -0
- package/public/sandbox/chunks/chunk-SZ4KQUJU.js +69 -0
- package/public/sandbox/chunks/{chunk-5SOP6EKV.js → chunk-SZI65PSP.js} +5 -10
- package/public/sandbox/chunks/chunk-T7RLTSMX.js +78 -0
- package/public/sandbox/chunks/chunk-TJ2RLUTW.js +57 -0
- package/public/sandbox/chunks/chunk-TJB73XPN.js +4071 -0
- package/public/sandbox/chunks/chunk-TXJCYO56.js +4046 -0
- package/public/sandbox/chunks/chunk-U5J3LCYI.js +731 -0
- package/public/sandbox/chunks/chunk-UABFN3NH.js +208 -0
- package/public/sandbox/chunks/chunk-UBMUY7WO.js +13 -0
- package/public/sandbox/chunks/chunk-UC27CE32.js +69 -0
- package/public/sandbox/chunks/chunk-UJGVDFZN.js +147 -0
- package/public/sandbox/chunks/chunk-UNVLTK4N.js +122 -0
- package/public/sandbox/chunks/chunk-UQKQ6V3V.js +208 -0
- package/public/sandbox/chunks/chunk-UZZBHWIO.js +703 -0
- package/public/sandbox/chunks/chunk-VKZIJERL.js +1114 -0
- package/public/sandbox/chunks/chunk-VQQEAGID.js +372 -0
- package/public/sandbox/chunks/{chunk-3LX3KIQQ.js → chunk-W365QUZ5.js} +3 -5
- package/public/sandbox/chunks/chunk-WJY2LSWG.js +1052 -0
- package/public/sandbox/chunks/chunk-WNOBN3DX.js +391 -0
- package/public/sandbox/chunks/chunk-X2Z5VYG3.js +245 -0
- package/public/sandbox/chunks/chunk-X74KU74D.js +959 -0
- package/public/sandbox/chunks/chunk-XE7ULSGQ.js +46 -0
- package/public/sandbox/chunks/chunk-XRXUJZ3X.js +431 -0
- package/public/sandbox/chunks/chunk-XWHIN7CC.js +85 -0
- package/public/sandbox/chunks/chunk-Y2TVGGVL.js +527 -0
- package/public/sandbox/chunks/chunk-YMVMZA3U.js +1395 -0
- package/public/sandbox/chunks/chunk-YOBLFWDV.js +431 -0
- package/public/sandbox/chunks/chunk-YR2RFEZA.js +11 -0
- package/public/sandbox/chunks/chunk-YTD6A35P.js +836 -0
- package/public/sandbox/chunks/chunk-Z5L7EZXS.js +81 -0
- package/public/sandbox/chunks/chunk-Z65I5ET2.js +108 -0
- package/public/sandbox/chunks/chunk-Z6LV34RO.js +390 -0
- package/public/sandbox/chunks/chunk-ZAKUP6QG.js +1634 -0
- package/public/sandbox/chunks/chunk-ZHNYE2YH.js +731 -0
- package/public/sandbox/chunks/chunk-ZHQX3B3Y.js +867 -0
- package/public/sandbox/chunks/chunk-ZIXDFRHJ.js +731 -0
- package/public/sandbox/chunks/chunk-ZPZ2MZ4D.js +528 -0
- package/public/sandbox/chunks/chunk-ZQD6NZXB.js +373 -0
- package/public/sandbox/chunks/chunk-ZVVBP7ON.js +16 -0
- package/public/sandbox/chunks/chunk-ZWE3P6X2.js +11 -0
- package/public/sandbox/logix-core/Bound.js +14 -14
- package/public/sandbox/logix-core/Debug.js +12 -10
- package/public/sandbox/logix-core/EffectOp.js +3 -4
- package/public/sandbox/logix-core/Env.js +5 -2
- package/public/sandbox/logix-core/ExternalStore.js +239 -0
- package/public/sandbox/logix-core/Flow.js +7 -8
- package/public/sandbox/logix-core/Kernel.js +7 -4
- package/public/sandbox/logix-core/Link.js +33 -25
- package/public/sandbox/logix-core/Middleware.js +13 -11
- package/public/sandbox/logix-core/Module.js +93 -30
- package/public/sandbox/logix-core/ModuleTag.js +28 -25
- package/public/sandbox/logix-core/Observability.js +21 -19
- package/public/sandbox/logix-core/Process.js +27 -22
- package/public/sandbox/logix-core/ReadQuery.js +7 -11
- package/public/sandbox/logix-core/Reflection.js +173 -53
- package/public/sandbox/logix-core/Resource.js +6 -3
- package/public/sandbox/logix-core/Root.js +7 -3
- package/public/sandbox/logix-core/Runtime.js +54 -40
- package/public/sandbox/logix-core/ScopeRegistry.js +6 -3
- package/public/sandbox/logix-core/StateTrait.js +17 -14
- package/public/sandbox/logix-core/TraitLifecycle.js +8 -8
- package/public/sandbox/logix-core/Workflow.js +332 -0
- package/public/sandbox/logix-core.js +11133 -6622
- package/public/sandbox/logix-core.manifest.json +4 -2
- package/public/sandbox/worker.js +3 -3
- package/public/sandbox/chunks/chunk-4LRLOTMA.js +0 -1698
- package/public/sandbox/chunks/chunk-CDLXJHXY.js +0 -120
- package/public/sandbox/chunks/chunk-CZRI7MHA.js +0 -46
- package/public/sandbox/chunks/chunk-EJDFUZ4B.js +0 -408
- package/public/sandbox/chunks/chunk-IP63FME6.js +0 -282
- package/public/sandbox/chunks/chunk-JIXTOQXJ.js +0 -1103
- package/public/sandbox/chunks/chunk-MPUSOFJ3.js +0 -1928
- package/public/sandbox/chunks/chunk-ON2LY6HJ.js +0 -135
- package/public/sandbox/chunks/chunk-POIBXAH5.js +0 -995
- package/public/sandbox/chunks/chunk-PQ652ULI.js +0 -6359
- package/public/sandbox/chunks/chunk-RJQ4PG2F.js +0 -77
- package/public/sandbox/chunks/chunk-S4EXG3OS.js +0 -533
- package/public/sandbox/chunks/chunk-SUXDGXVE.js +0 -390
- package/public/sandbox/chunks/chunk-TOQ6SJ6O.js +0 -244
- package/public/sandbox/chunks/chunk-UKYAF3NL.js +0 -1036
- package/public/sandbox/chunks/chunk-UMVN3AWO.js +0 -395
- package/public/sandbox/chunks/chunk-WFV5PPWJ.js +0 -194
- package/public/sandbox/chunks/chunk-YF6IO732.js +0 -206
- package/public/sandbox/chunks/chunk-ZUBABAAO.js +0 -86
|
@@ -1,52 +1,170 @@
|
|
|
1
1
|
// @logixjs/core subpath bundles for @logixjs/sandbox
|
|
2
2
|
|
|
3
|
+
import {
|
|
4
|
+
exportStaticIr,
|
|
5
|
+
extractManifest,
|
|
6
|
+
trialRun
|
|
7
|
+
} from "../chunks/chunk-CWOXD5NG.js";
|
|
8
|
+
import "../chunks/chunk-BUVHG3NJ.js";
|
|
3
9
|
import {
|
|
4
10
|
KernelContractMetaAllowlist,
|
|
5
11
|
evaluateFullCutoverGate,
|
|
6
12
|
getKernelImplementationRef,
|
|
7
13
|
getRuntimeServicesEvidence
|
|
8
|
-
} from "../chunks/chunk-
|
|
9
|
-
import "../chunks/chunk-ZUBABAAO.js";
|
|
14
|
+
} from "../chunks/chunk-L4ZNW5DI.js";
|
|
10
15
|
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
import "../chunks/chunk-EJDFUZ4B.js";
|
|
16
|
-
import "../chunks/chunk-4LRLOTMA.js";
|
|
16
|
+
compileWorkflowStaticIrV1
|
|
17
|
+
} from "../chunks/chunk-UZZBHWIO.js";
|
|
18
|
+
import "../chunks/chunk-KDJR27JV.js";
|
|
19
|
+
import "../chunks/chunk-6TUOP63Q.js";
|
|
17
20
|
import {
|
|
18
21
|
normalizeKernelImplementationRef
|
|
19
|
-
} from "../chunks/chunk-
|
|
20
|
-
import "../chunks/chunk-
|
|
22
|
+
} from "../chunks/chunk-L4PNO2H6.js";
|
|
23
|
+
import "../chunks/chunk-RIWOEI3T.js";
|
|
21
24
|
import "../chunks/chunk-KE2H62D6.js";
|
|
22
|
-
import "../chunks/chunk-WFV5PPWJ.js";
|
|
23
25
|
import "../chunks/chunk-CTSYKMM6.js";
|
|
24
|
-
import "../chunks/chunk-
|
|
26
|
+
import "../chunks/chunk-NWCJJZNQ.js";
|
|
27
|
+
import "../chunks/chunk-UBMUY7WO.js";
|
|
25
28
|
import "../chunks/chunk-GFOF7NCX.js";
|
|
26
29
|
import "../chunks/chunk-DOBF6YTQ.js";
|
|
27
|
-
import "../chunks/chunk-
|
|
30
|
+
import "../chunks/chunk-4MY35XR3.js";
|
|
28
31
|
import "../chunks/chunk-2LZ43SWS.js";
|
|
29
|
-
import "../chunks/chunk-
|
|
30
|
-
import "../chunks/chunk-
|
|
31
|
-
import "../chunks/chunk-
|
|
32
|
-
import "../chunks/chunk-
|
|
33
|
-
import "../chunks/chunk-
|
|
32
|
+
import "../chunks/chunk-X2Z5VYG3.js";
|
|
33
|
+
import "../chunks/chunk-ASVMK364.js";
|
|
34
|
+
import "../chunks/chunk-7GPAF2UK.js";
|
|
35
|
+
import "../chunks/chunk-YMVMZA3U.js";
|
|
36
|
+
import "../chunks/chunk-NMGFJZ4I.js";
|
|
37
|
+
import "../chunks/chunk-UJGVDFZN.js";
|
|
38
|
+
import "../chunks/chunk-2XVE7F26.js";
|
|
39
|
+
import "../chunks/chunk-W365QUZ5.js";
|
|
34
40
|
import {
|
|
35
41
|
record
|
|
36
|
-
} from "../chunks/chunk-
|
|
42
|
+
} from "../chunks/chunk-SH7TP5CJ.js";
|
|
43
|
+
import {
|
|
44
|
+
EffectOpMiddlewareTag
|
|
45
|
+
} from "../chunks/chunk-SI5OKFFY.js";
|
|
46
|
+
import "../chunks/chunk-LWI7BXFN.js";
|
|
37
47
|
import {
|
|
38
48
|
fnv1a32,
|
|
39
49
|
stableStringify
|
|
40
|
-
} from "../chunks/chunk-
|
|
41
|
-
import "../chunks/chunk-3LX3KIQQ.js";
|
|
42
|
-
import "../chunks/chunk-BWSNPKO5.js";
|
|
43
|
-
import {
|
|
44
|
-
EffectOpMiddlewareTag
|
|
45
|
-
} from "../chunks/chunk-TOQ6SJ6O.js";
|
|
50
|
+
} from "../chunks/chunk-DT7YIIWE.js";
|
|
46
51
|
|
|
47
52
|
// ../logix-core/src/Reflection.ts
|
|
48
53
|
import { Context as Context2, Effect as Effect2, Exit as Exit2, Layer as Layer2 } from "../effect.js";
|
|
49
54
|
|
|
55
|
+
// ../logix-core/src/internal/observability/controlSurfaceManifest.ts
|
|
56
|
+
var makeDigest = (value) => `control_surface_v1:${fnv1a32(stableStringify(value))}`;
|
|
57
|
+
var exportEffectsIndexDigest = (entries) => `effects_index_v1:${fnv1a32(stableStringify(entries))}`;
|
|
58
|
+
var exportWorkflowEffectsIndex = (args) => {
|
|
59
|
+
const moduleId = args.moduleId;
|
|
60
|
+
return Array.from(args.workflowSurface).sort((a, b) => a.programId < b.programId ? -1 : a.programId > b.programId ? 1 : 0).map((ir) => {
|
|
61
|
+
const localId = ir.programId.startsWith(`${moduleId}.`) ? ir.programId.slice(moduleId.length + 1) : ir.programId;
|
|
62
|
+
const triggerNode = ir.nodes.find((n) => n.kind === "trigger");
|
|
63
|
+
const trigger = triggerNode?.kind === "trigger" && triggerNode.trigger.kind === "action" ? { kind: "action", action: { moduleId, actionTag: triggerNode.trigger.actionTag } } : {
|
|
64
|
+
kind: "lifecycle",
|
|
65
|
+
phase: triggerNode?.kind === "trigger" && triggerNode.trigger.kind === "lifecycle" ? triggerNode.trigger.phase : "onStart"
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
kind: "workflow",
|
|
69
|
+
effectId: `${moduleId}::workflow:${localId}`,
|
|
70
|
+
trigger,
|
|
71
|
+
programId: ir.programId,
|
|
72
|
+
programDigest: ir.digest
|
|
73
|
+
};
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
var exportControlSurfaceManifest = (input) => {
|
|
77
|
+
const modules = Array.from(input.modules).sort((a, b) => a.moduleId < b.moduleId ? -1 : a.moduleId > b.moduleId ? 1 : 0);
|
|
78
|
+
const meta = input.meta;
|
|
79
|
+
const base = {
|
|
80
|
+
version: 1,
|
|
81
|
+
modules,
|
|
82
|
+
...meta ? { meta } : null
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
...base,
|
|
86
|
+
digest: makeDigest(base)
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// ../logix-core/src/internal/observability/workflowSurface.ts
|
|
91
|
+
var makeDigest2 = (value) => `workflow_surface_v1:${fnv1a32(stableStringify(value))}`;
|
|
92
|
+
var exportWorkflowSurface = (programs) => {
|
|
93
|
+
const sorted = Array.from(programs).sort(
|
|
94
|
+
(a, b) => a.programId < b.programId ? -1 : a.programId > b.programId ? 1 : 0
|
|
95
|
+
);
|
|
96
|
+
const base = { version: 1, programs: sorted };
|
|
97
|
+
return { ...base, digest: makeDigest2(base) };
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
// ../logix-core/src/internal/reflection/controlSurface.ts
|
|
101
|
+
var MODULE_INTERNAL = /* @__PURE__ */ Symbol.for("logix.module.internal");
|
|
102
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
103
|
+
var isObjectLike = (value) => typeof value === "object" && value !== null || typeof value === "function";
|
|
104
|
+
var asNonEmptyString = (value) => typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
|
|
105
|
+
var resolveTagId = (tag) => {
|
|
106
|
+
if (!isObjectLike(tag)) return void 0;
|
|
107
|
+
return asNonEmptyString(tag.id);
|
|
108
|
+
};
|
|
109
|
+
var resolveModuleIdOrThrow = (module) => {
|
|
110
|
+
if (isRecord(module) && module._tag === "ModuleImpl") {
|
|
111
|
+
const id = resolveTagId(module.module);
|
|
112
|
+
if (id) return id;
|
|
113
|
+
throw new Error(
|
|
114
|
+
"[ControlSurfaceManifest] Failed to resolve moduleId from ModuleImpl.module.id.\nFix: pass a configured Module/ModuleImpl (has .id/.tag.id/.module.id), not a read-only handle."
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
if (isRecord(module)) {
|
|
118
|
+
const id = asNonEmptyString(module.id);
|
|
119
|
+
if (id) return id;
|
|
120
|
+
const tagId = resolveTagId(module.tag);
|
|
121
|
+
if (tagId) return tagId;
|
|
122
|
+
}
|
|
123
|
+
throw new Error(
|
|
124
|
+
"[ControlSurfaceManifest] Failed to resolve moduleId.\nFix: pass a configured Module/ModuleImpl (has .id/.tag.id/.module.id), not a read-only handle."
|
|
125
|
+
);
|
|
126
|
+
};
|
|
127
|
+
var resolveWorkflowDefs = (module) => {
|
|
128
|
+
if (!isObjectLike(module)) return [];
|
|
129
|
+
const internal = module[MODULE_INTERNAL];
|
|
130
|
+
const defs = isRecord(internal) ? internal.workflowDefs : void 0;
|
|
131
|
+
return Array.isArray(defs) ? defs : [];
|
|
132
|
+
};
|
|
133
|
+
var exportControlSurface = (modules, options) => {
|
|
134
|
+
const entries = [];
|
|
135
|
+
const workflowSurfaces = [];
|
|
136
|
+
const seen = /* @__PURE__ */ new Set();
|
|
137
|
+
for (const module of modules) {
|
|
138
|
+
const moduleId = resolveModuleIdOrThrow(module);
|
|
139
|
+
if (seen.has(moduleId)) {
|
|
140
|
+
throw new Error(`[ControlSurfaceManifest] Duplicate moduleId "${moduleId}".`);
|
|
141
|
+
}
|
|
142
|
+
seen.add(moduleId);
|
|
143
|
+
const defs = resolveWorkflowDefs(module);
|
|
144
|
+
if (defs.length === 0) {
|
|
145
|
+
entries.push({ moduleId, effectsIndex: [] });
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const workflowIrs = defs.map((def) => compileWorkflowStaticIrV1({ moduleId, def }));
|
|
149
|
+
const surface = exportWorkflowSurface(workflowIrs);
|
|
150
|
+
workflowSurfaces.push({ moduleId, surface });
|
|
151
|
+
const effectsIndex = exportWorkflowEffectsIndex({ moduleId, workflowSurface: surface.programs });
|
|
152
|
+
const effectsIndexDigest = effectsIndex.length > 0 ? exportEffectsIndexDigest(effectsIndex) : void 0;
|
|
153
|
+
entries.push({
|
|
154
|
+
moduleId,
|
|
155
|
+
workflowSurface: { digest: surface.digest },
|
|
156
|
+
effectsIndex,
|
|
157
|
+
...effectsIndexDigest ? { effectsIndexDigest } : null
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
const manifest = exportControlSurfaceManifest({
|
|
161
|
+
version: 1,
|
|
162
|
+
modules: entries,
|
|
163
|
+
...options?.meta ? { meta: options.meta } : null
|
|
164
|
+
});
|
|
165
|
+
return { manifest, workflowSurfaces };
|
|
166
|
+
};
|
|
167
|
+
|
|
50
168
|
// ../logix-core/src/internal/reflection/diff.ts
|
|
51
169
|
var SEVERITY_RANK = {
|
|
52
170
|
BREAKING: 0,
|
|
@@ -55,7 +173,7 @@ var SEVERITY_RANK = {
|
|
|
55
173
|
};
|
|
56
174
|
var uniqSorted = (input) => {
|
|
57
175
|
const out = Array.from(new Set(input.filter((x) => typeof x === "string" && x.length > 0)));
|
|
58
|
-
out.sort(
|
|
176
|
+
out.sort();
|
|
59
177
|
return out;
|
|
60
178
|
};
|
|
61
179
|
var diffStringKeys = (before, after) => {
|
|
@@ -65,12 +183,12 @@ var diffStringKeys = (before, after) => {
|
|
|
65
183
|
for (const k of beforeSet) {
|
|
66
184
|
if (!afterSet.has(k)) removed.push(k);
|
|
67
185
|
}
|
|
68
|
-
removed.sort(
|
|
186
|
+
removed.sort();
|
|
69
187
|
const added = [];
|
|
70
188
|
for (const k of afterSet) {
|
|
71
189
|
if (!beforeSet.has(k)) added.push(k);
|
|
72
190
|
}
|
|
73
|
-
added.sort(
|
|
191
|
+
added.sort();
|
|
74
192
|
return { removed, added };
|
|
75
193
|
};
|
|
76
194
|
var eqJsonValue = (a, b) => stableStringify(a) === stableStringify(b);
|
|
@@ -147,8 +265,8 @@ var diffManifest = (before, after, options) => {
|
|
|
147
265
|
for (const id of afterById.keys()) {
|
|
148
266
|
if (!beforeById.has(id)) added.push(id);
|
|
149
267
|
}
|
|
150
|
-
removed.sort(
|
|
151
|
-
added.sort(
|
|
268
|
+
removed.sort();
|
|
269
|
+
added.sort();
|
|
152
270
|
for (const id of beforeById.keys()) {
|
|
153
271
|
const b = beforeById.get(id);
|
|
154
272
|
const a = afterById.get(id);
|
|
@@ -162,8 +280,8 @@ var diffManifest = (before, after, options) => {
|
|
|
162
280
|
if (b.derived !== a.derived) fields.push("derived");
|
|
163
281
|
if (fields.length > 0) riskyChanged.push({ id, fields });
|
|
164
282
|
}
|
|
165
|
-
kindChanged.sort((x, y) => x.id.
|
|
166
|
-
riskyChanged.sort((x, y) => x.id.
|
|
283
|
+
kindChanged.sort((x, y) => x.id < y.id ? -1 : x.id > y.id ? 1 : 0);
|
|
284
|
+
riskyChanged.sort((x, y) => x.id < y.id ? -1 : x.id > y.id ? 1 : 0);
|
|
167
285
|
if (removed.length > 0) {
|
|
168
286
|
changes.push({
|
|
169
287
|
severity: "BREAKING",
|
|
@@ -267,11 +385,11 @@ var diffManifest = (before, after, options) => {
|
|
|
267
385
|
const ra = SEVERITY_RANK[a.severity];
|
|
268
386
|
const rb = SEVERITY_RANK[b.severity];
|
|
269
387
|
if (ra !== rb) return ra - rb;
|
|
270
|
-
|
|
271
|
-
if (ca !== 0) return ca;
|
|
388
|
+
if (a.code !== b.code) return a.code < b.code ? -1 : 1;
|
|
272
389
|
const pa = a.pointer ?? "";
|
|
273
390
|
const pb = b.pointer ?? "";
|
|
274
|
-
return pa
|
|
391
|
+
if (pa !== pb) return pa < pb ? -1 : 1;
|
|
392
|
+
return 0;
|
|
275
393
|
});
|
|
276
394
|
const summary = {
|
|
277
395
|
breaking: changes.filter((c) => c.severity === "BREAKING").length,
|
|
@@ -299,13 +417,13 @@ var diffManifest = (before, after, options) => {
|
|
|
299
417
|
// ../logix-core/src/internal/reflection/kernelContract.ts
|
|
300
418
|
import { Context, Effect, Exit, Layer } from "../effect.js";
|
|
301
419
|
var resolveRootImpl = (root) => root?._tag === "ModuleImpl" ? root : root?.impl;
|
|
302
|
-
var
|
|
420
|
+
var asNonEmptyString2 = (value) => typeof value === "string" && value.length > 0 ? value : void 0;
|
|
303
421
|
var asNonNegInt = (value, fallback = 0) => {
|
|
304
422
|
if (typeof value !== "number" || !Number.isFinite(value)) return fallback;
|
|
305
423
|
const n = Math.floor(value);
|
|
306
424
|
return n >= 0 ? n : fallback;
|
|
307
425
|
};
|
|
308
|
-
var
|
|
426
|
+
var isRecord2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
309
427
|
var makeTraceEffectOpObserver = () => {
|
|
310
428
|
return (op) => Effect.gen(function* () {
|
|
311
429
|
if (op.meta?.policy?.disableObservers) {
|
|
@@ -342,12 +460,12 @@ var extractRuntimeSummary = (evidence) => {
|
|
|
342
460
|
};
|
|
343
461
|
};
|
|
344
462
|
var canonicalizeOpMeta = (opMetaRaw) => {
|
|
345
|
-
if (!
|
|
463
|
+
if (!isRecord2(opMetaRaw)) return void 0;
|
|
346
464
|
const out = {};
|
|
347
465
|
for (const [k, v] of Object.entries(opMetaRaw)) {
|
|
348
466
|
if (k === "instanceId" || k === "txnId" || k === "runtimeLabel" || k === "linkId") continue;
|
|
349
467
|
if ((k === "deps" || k === "trace" || k === "tags") && Array.isArray(v) && v.every((x) => typeof x === "string")) {
|
|
350
|
-
out[k] = v.slice().sort(
|
|
468
|
+
out[k] = v.slice().sort();
|
|
351
469
|
continue;
|
|
352
470
|
}
|
|
353
471
|
out[k] = v;
|
|
@@ -370,17 +488,17 @@ var extractKernelContractTraceOps = (evidence) => {
|
|
|
370
488
|
for (const e of evidence.events) {
|
|
371
489
|
if (e.type !== "debug:event") continue;
|
|
372
490
|
const payload = e.payload;
|
|
373
|
-
if (!
|
|
491
|
+
if (!isRecord2(payload)) continue;
|
|
374
492
|
const meta = payload.meta;
|
|
375
493
|
const opMeta = meta?.meta;
|
|
376
494
|
const opSeq = asNonNegInt(opMeta?.opSeq, -1);
|
|
377
495
|
if (opSeq < 0) continue;
|
|
378
|
-
const instanceIdRaw =
|
|
496
|
+
const instanceIdRaw = asNonEmptyString2(payload.instanceId) ?? "unknown";
|
|
379
497
|
const instanceId = mapInstanceId(instanceIdRaw);
|
|
380
498
|
const txnSeq = asNonNegInt(payload.txnSeq, 0);
|
|
381
|
-
const moduleId =
|
|
382
|
-
const kind =
|
|
383
|
-
const name =
|
|
499
|
+
const moduleId = asNonEmptyString2(payload.moduleId) ?? "unknown";
|
|
500
|
+
const kind = asNonEmptyString2(meta?.kind) ?? asNonEmptyString2(payload.kind) ?? "unknown";
|
|
501
|
+
const name = asNonEmptyString2(meta?.name) ?? asNonEmptyString2(payload.label) ?? "effectop";
|
|
384
502
|
ops.push({
|
|
385
503
|
anchor: { instanceId, txnSeq, opSeq },
|
|
386
504
|
moduleId,
|
|
@@ -390,7 +508,7 @@ var extractKernelContractTraceOps = (evidence) => {
|
|
|
390
508
|
});
|
|
391
509
|
}
|
|
392
510
|
ops.sort((a, b) => {
|
|
393
|
-
if (a.anchor.instanceId !== b.anchor.instanceId) return a.anchor.instanceId
|
|
511
|
+
if (a.anchor.instanceId !== b.anchor.instanceId) return a.anchor.instanceId < b.anchor.instanceId ? -1 : 1;
|
|
394
512
|
if (a.anchor.txnSeq !== b.anchor.txnSeq) return a.anchor.txnSeq - b.anchor.txnSeq;
|
|
395
513
|
return a.anchor.opSeq - b.anchor.opSeq;
|
|
396
514
|
});
|
|
@@ -407,7 +525,7 @@ var diffKernelContractTraceOps = (before, after) => {
|
|
|
407
525
|
for (const op of after) {
|
|
408
526
|
afterByKey.set(anchorKey(op.anchor), op);
|
|
409
527
|
}
|
|
410
|
-
const allKeys = Array.from(/* @__PURE__ */ new Set([...beforeByKey.keys(), ...afterByKey.keys()])).sort(
|
|
528
|
+
const allKeys = Array.from(/* @__PURE__ */ new Set([...beforeByKey.keys(), ...afterByKey.keys()])).sort();
|
|
411
529
|
for (const key of allKeys) {
|
|
412
530
|
const b = beforeByKey.get(key);
|
|
413
531
|
const a = afterByKey.get(key);
|
|
@@ -516,12 +634,12 @@ var verifyKernelContract = (root, options) => Effect.gen(function* () {
|
|
|
516
634
|
|
|
517
635
|
// ../logix-core/src/Reflection.ts
|
|
518
636
|
var resolveRootImpl2 = (root) => root?._tag === "ModuleImpl" ? root : root?.impl;
|
|
519
|
-
var
|
|
637
|
+
var isRecord3 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
520
638
|
var stableJson = (value) => JSON.stringify(value) ?? "";
|
|
521
639
|
var diffMetaKeys = (before, after) => {
|
|
522
|
-
const b =
|
|
523
|
-
const a =
|
|
524
|
-
const keys = Array.from(/* @__PURE__ */ new Set([...Object.keys(b), ...Object.keys(a)])).sort(
|
|
640
|
+
const b = isRecord3(before) ? before : {};
|
|
641
|
+
const a = isRecord3(after) ? after : {};
|
|
642
|
+
const keys = Array.from(/* @__PURE__ */ new Set([...Object.keys(b), ...Object.keys(a)])).sort();
|
|
525
643
|
const changed = [];
|
|
526
644
|
for (const k of keys) {
|
|
527
645
|
if (stableJson(b[k]) !== stableJson(a[k])) {
|
|
@@ -545,7 +663,7 @@ var tryAllowlistKernelContractDiff = (args) => {
|
|
|
545
663
|
}
|
|
546
664
|
const before = change.before;
|
|
547
665
|
const after = change.after;
|
|
548
|
-
if (!
|
|
666
|
+
if (!isRecord3(before) || !isRecord3(after)) {
|
|
549
667
|
return { verdict: "FAIL", allowedDiffs: [] };
|
|
550
668
|
}
|
|
551
669
|
const anchorBefore = before.anchor;
|
|
@@ -574,12 +692,13 @@ var tryAllowlistKernelContractDiff = (args) => {
|
|
|
574
692
|
metaKey,
|
|
575
693
|
count,
|
|
576
694
|
...allow.get(metaKey) ? { reason: allow.get(metaKey) } : {}
|
|
577
|
-
})).sort((a, b) => a.metaKey.
|
|
695
|
+
})).sort((a, b) => a.metaKey < b.metaKey ? -1 : a.metaKey > b.metaKey ? 1 : 0);
|
|
578
696
|
return { verdict: "PASS", allowedDiffs };
|
|
579
697
|
};
|
|
580
698
|
var extractManifest2 = (module, options) => extractManifest(module, options);
|
|
581
699
|
var diffManifest2 = (before, after, options) => diffManifest(before, after, options);
|
|
582
700
|
var exportStaticIr2 = (module) => exportStaticIr(module);
|
|
701
|
+
var exportControlSurface2 = (modules, options) => exportControlSurface(modules, options);
|
|
583
702
|
var verifyKernelContract2 = (module, options) => verifyKernelContract(module, options);
|
|
584
703
|
var verifyFullCutoverGate = (module, options) => Effect2.gen(function* () {
|
|
585
704
|
const rootImpl = resolveRootImpl2(module);
|
|
@@ -632,9 +751,10 @@ var verifyFullCutoverGate = (module, options) => Effect2.gen(function* () {
|
|
|
632
751
|
});
|
|
633
752
|
export {
|
|
634
753
|
diffManifest2 as diffManifest,
|
|
754
|
+
exportControlSurface2 as exportControlSurface,
|
|
635
755
|
exportStaticIr2 as exportStaticIr,
|
|
636
756
|
extractManifest2 as extractManifest,
|
|
637
757
|
verifyFullCutoverGate,
|
|
638
758
|
verifyKernelContract2 as verifyKernelContract
|
|
639
759
|
};
|
|
640
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvUmVmbGVjdGlvbi50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9yZWZsZWN0aW9uL2RpZmYudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcmVmbGVjdGlvbi9rZXJuZWxDb250cmFjdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQ29udGV4dCwgRWZmZWN0LCBFeGl0LCBMYXllciB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuL2ludGVybmFsL21vZHVsZS5qcydcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlIH0gZnJvbSAnLi9Nb2R1bGUuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRpY0lyIH0gZnJvbSAnLi9pbnRlcm5hbC9zdGF0ZS10cmFpdC9pci5qcydcbmltcG9ydCB0eXBlIHsgRXh0cmFjdE1hbmlmZXN0T3B0aW9ucywgTW9kdWxlTWFuaWZlc3QgfSBmcm9tICcuL2ludGVybmFsL3JlZmxlY3Rpb24vbWFuaWZlc3QuanMnXG5pbXBvcnQgKiBhcyBNYW5pZmVzdCBmcm9tICcuL2ludGVybmFsL3JlZmxlY3Rpb24vbWFuaWZlc3QuanMnXG5pbXBvcnQgKiBhcyBTdGF0aWNJckV4cG9ydCBmcm9tICcuL2ludGVybmFsL3JlZmxlY3Rpb24vc3RhdGljSXIuanMnXG5pbXBvcnQgdHlwZSB7IERpZmZNYW5pZmVzdE9wdGlvbnMsIE1vZHVsZU1hbmlmZXN0RGlmZiB9IGZyb20gJy4vaW50ZXJuYWwvcmVmbGVjdGlvbi9kaWZmLmpzJ1xuaW1wb3J0ICogYXMgTWFuaWZlc3REaWZmIGZyb20gJy4vaW50ZXJuYWwvcmVmbGVjdGlvbi9kaWZmLmpzJ1xuaW1wb3J0IHR5cGUge1xuICBLZXJuZWxDb250cmFjdFZlcmlmaWNhdGlvblJlc3VsdCxcbiAgVmVyaWZ5S2VybmVsQ29udHJhY3RPcHRpb25zLFxufSBmcm9tICcuL2ludGVybmFsL3JlZmxlY3Rpb24va2VybmVsQ29udHJhY3QuanMnXG5pbXBvcnQgeyB2ZXJpZnlLZXJuZWxDb250cmFjdCBhcyB2ZXJpZnlLZXJuZWxDb250cmFjdEludGVybmFsIH0gZnJvbSAnLi9pbnRlcm5hbC9yZWZsZWN0aW9uL2tlcm5lbENvbnRyYWN0LmpzJ1xuaW1wb3J0IHsgdHJpYWxSdW4gfSBmcm9tICcuL2ludGVybmFsL29ic2VydmFiaWxpdHkvdHJpYWxSdW4uanMnXG5pbXBvcnQgdHlwZSB7IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlcyB9IGZyb20gJy4vS2VybmVsLmpzJ1xuaW1wb3J0ICogYXMgS2VybmVsIGZyb20gJy4vS2VybmVsLmpzJ1xuaW1wb3J0IHR5cGUgKiBhcyBEZWJ1ZyBmcm9tICcuL2ludGVybmFsL3J1bnRpbWUvY29yZS9EZWJ1Z1NpbmsuanMnXG5cbmV4cG9ydCB0eXBlIHtcbiAgTW9kdWxlTWFuaWZlc3QsXG4gIEV4dHJhY3RNYW5pZmVzdE9wdGlvbnMsXG4gIE1vZHVsZU1hbmlmZXN0RGlmZixcbiAgRGlmZk1hbmlmZXN0T3B0aW9ucyxcbiAgS2VybmVsQ29udHJhY3RWZXJpZmljYXRpb25SZXN1bHQsXG4gIFZlcmlmeUtlcm5lbENvbnRyYWN0T3B0aW9ucyxcbn1cblxudHlwZSBBbnlNb2R1bGVMaWtlID0geyByZWFkb25seSBpbXBsOiBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gfVxudHlwZSBSb290TGlrZTxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPiA9IE1vZHVsZUltcGw8YW55LCBTaCwgYW55PiB8IEFueU1vZHVsZUxpa2VcblxuY29uc3QgcmVzb2x2ZVJvb3RJbXBsID0gPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGU+KHJvb3Q6IFJvb3RMaWtlPFNoPik6IE1vZHVsZUltcGw8YW55LCBTaCwgYW55PiA9PlxuICAoKHJvb3QgYXMgYW55KT8uX3RhZyA9PT0gJ01vZHVsZUltcGwnXG4gICAgPyAocm9vdCBhcyBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4pXG4gICAgOiAoKHJvb3QgYXMgYW55KT8uaW1wbCBhcyBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4pKSBzYXRpc2ZpZXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+XG5cbmNvbnN0IGlzUmVjb3JkID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcblxuY29uc3Qgc3RhYmxlSnNvbiA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgPz8gJydcblxuY29uc3QgZGlmZk1ldGFLZXlzID0gKGJlZm9yZTogdW5rbm93biwgYWZ0ZXI6IHVua25vd24pOiBSZWFkb25seUFycmF5PHN0cmluZz4gPT4ge1xuICBjb25zdCBiID0gaXNSZWNvcmQoYmVmb3JlKSA/IGJlZm9yZSA6IHt9XG4gIGNvbnN0IGEgPSBpc1JlY29yZChhZnRlcikgPyBhZnRlciA6IHt9XG4gIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGIpLCAuLi5PYmplY3Qua2V5cyhhKV0pKS5zb3J0KCh4LCB5KSA9PiB4LmxvY2FsZUNvbXBhcmUoeSkpXG4gIGNvbnN0IGNoYW5nZWQ6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBrIG9mIGtleXMpIHtcbiAgICBpZiAoc3RhYmxlSnNvbigoYiBhcyBhbnkpW2tdKSAhPT0gc3RhYmxlSnNvbigoYSBhcyBhbnkpW2tdKSkge1xuICAgICAgY2hhbmdlZC5wdXNoKGspXG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2VybmVsQ29udHJhY3RBbGxvd2VkRGlmZiB7XG4gIHJlYWRvbmx5IG1ldGFLZXk6IHN0cmluZ1xuICByZWFkb25seSBjb3VudDogbnVtYmVyXG4gIHJlYWRvbmx5IHJlYXNvbj86IHN0cmluZ1xufVxuXG5jb25zdCB0cnlBbGxvd2xpc3RLZXJuZWxDb250cmFjdERpZmYgPSAoYXJnczoge1xuICByZWFkb25seSByZXN1bHQ6IEtlcm5lbENvbnRyYWN0VmVyaWZpY2F0aW9uUmVzdWx0XG4gIHJlYWRvbmx5IGFsbG93bGlzdDogUmVhZG9ubHlBcnJheTxLZXJuZWwuS2VybmVsQ29udHJhY3RNZXRhQWxsb3dsaXN0SXRlbT5cbn0pOiB7IHJlYWRvbmx5IHZlcmRpY3Q6ICdQQVNTJyB8ICdGQUlMJzsgcmVhZG9ubHkgYWxsb3dlZERpZmZzOiBSZWFkb25seUFycmF5PEtlcm5lbENvbnRyYWN0QWxsb3dlZERpZmY+IH0gPT4ge1xuICBpZiAoYXJncy5hbGxvd2xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgdmVyZGljdDogYXJncy5yZXN1bHQudmVyZGljdCwgYWxsb3dlZERpZmZzOiBbXSB9XG4gIH1cblxuICBjb25zdCBhbGxvdyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KClcbiAgZm9yIChjb25zdCBpdGVtIG9mIGFyZ3MuYWxsb3dsaXN0KSB7XG4gICAgYWxsb3cuc2V0KGl0ZW0ubWV0YUtleSwgaXRlbS5yZWFzb24pXG4gIH1cblxuICBjb25zdCBhbGxvd2VkQ291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4gIGZvciAoY29uc3QgY2hhbmdlIG9mIGFyZ3MucmVzdWx0LmNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlLmNvZGUgIT09ICdvcC5jaGFuZ2VkJykge1xuICAgICAgcmV0dXJuIHsgdmVyZGljdDogJ0ZBSUwnLCBhbGxvd2VkRGlmZnM6IFtdIH1cbiAgICB9XG5cbiAgICBjb25zdCBiZWZvcmUgPSBjaGFuZ2UuYmVmb3JlIGFzIGFueVxuICAgIGNvbnN0IGFmdGVyID0gY2hhbmdlLmFmdGVyIGFzIGFueVxuICAgIGlmICghaXNSZWNvcmQoYmVmb3JlKSB8fCAhaXNSZWNvcmQoYWZ0ZXIpKSB7XG4gICAgICByZXR1cm4geyB2ZXJkaWN0OiAnRkFJTCcsIGFsbG93ZWREaWZmczogW10gfVxuICAgIH1cblxuICAgIGNvbnN0IGFuY2hvckJlZm9yZSA9IGJlZm9yZS5hbmNob3JcbiAgICBjb25zdCBhbmNob3JBZnRlciA9IGFmdGVyLmFuY2hvclxuICAgIGlmIChzdGFibGVKc29uKGFuY2hvckJlZm9yZSkgIT09IHN0YWJsZUpzb24oYW5jaG9yQWZ0ZXIpKSB7XG4gICAgICByZXR1cm4geyB2ZXJkaWN0OiAnRkFJTCcsIGFsbG93ZWREaWZmczogW10gfVxuICAgIH1cbiAgICBpZiAoc3RhYmxlSnNvbihiZWZvcmUubW9kdWxlSWQpICE9PSBzdGFibGVKc29uKGFmdGVyLm1vZHVsZUlkKSkge1xuICAgICAgcmV0dXJuIHsgdmVyZGljdDogJ0ZBSUwnLCBhbGxvd2VkRGlmZnM6IFtdIH1cbiAgICB9XG4gICAgaWYgKHN0YWJsZUpzb24oYmVmb3JlLmtpbmQpICE9PSBzdGFibGVKc29uKGFmdGVyLmtpbmQpKSB7XG4gICAgICByZXR1cm4geyB2ZXJkaWN0OiAnRkFJTCcsIGFsbG93ZWREaWZmczogW10gfVxuICAgIH1cbiAgICBpZiAoc3RhYmxlSnNvbihiZWZvcmUubmFtZSkgIT09IHN0YWJsZUpzb24oYWZ0ZXIubmFtZSkpIHtcbiAgICAgIHJldHVybiB7IHZlcmRpY3Q6ICdGQUlMJywgYWxsb3dlZERpZmZzOiBbXSB9XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbmdlZCA9IGRpZmZNZXRhS2V5cyhiZWZvcmUubWV0YSwgYWZ0ZXIubWV0YSlcbiAgICBmb3IgKGNvbnN0IG1ldGFLZXkgb2YgY2hhbmdlZCkge1xuICAgICAgaWYgKCFhbGxvdy5oYXMobWV0YUtleSkpIHtcbiAgICAgICAgcmV0dXJuIHsgdmVyZGljdDogJ0ZBSUwnLCBhbGxvd2VkRGlmZnM6IFtdIH1cbiAgICAgIH1cbiAgICAgIGFsbG93ZWRDb3VudHMuc2V0KG1ldGFLZXksIChhbGxvd2VkQ291bnRzLmdldChtZXRhS2V5KSA/PyAwKSArIDEpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYWxsb3dlZERpZmZzID0gQXJyYXkuZnJvbShhbGxvd2VkQ291bnRzLmVudHJpZXMoKSlcbiAgICAubWFwKChbbWV0YUtleSwgY291bnRdKSA9PiAoe1xuICAgICAgbWV0YUtleSxcbiAgICAgIGNvdW50LFxuICAgICAgLi4uKGFsbG93LmdldChtZXRhS2V5KSA/IHsgcmVhc29uOiBhbGxvdy5nZXQobWV0YUtleSkgfSA6IHt9KSxcbiAgICB9KSlcbiAgICAuc29ydCgoYSwgYikgPT4gYS5tZXRhS2V5LmxvY2FsZUNvbXBhcmUoYi5tZXRhS2V5KSlcblxuICByZXR1cm4geyB2ZXJkaWN0OiAnUEFTUycsIGFsbG93ZWREaWZmcyB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVsbEN1dG92ZXJHYXRlVHJpYWxSdW5PcHRpb25zPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGU+IHtcbiAgcmVhZG9ubHkgcnVuSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgbGF5ZXI/OiBMYXllci5MYXllcjxhbnksIGFueSwgYW55PlxuICByZWFkb25seSBydW50aW1lU2VydmljZXNJbnN0YW5jZU92ZXJyaWRlcz86IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlc1xuICByZWFkb25seSBpbnRlcmFjdGlvbj86IChydW50aW1lOiBhbnkpID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgYW55LCBhbnk+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5RnVsbEN1dG92ZXJHYXRlT3B0aW9uczxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPiBleHRlbmRzIFZlcmlmeUtlcm5lbENvbnRyYWN0T3B0aW9uczxTaD4ge1xuICByZWFkb25seSBtb2RlPzogS2VybmVsLkZ1bGxDdXRvdmVyR2F0ZU1vZGVcbiAgLyoqXG4gICAqIEV2aWRlbmNlIHRyaW1taW5nIGxldmVsIGZvciBnYXRlIGV2YWx1YXRpb246XG4gICAqIC0gYG9mZmA6IG1pbmltYWwgc3VtbWFyeSAobXVzdCBzdGlsbCBiZSBydW5uYWJsZSlcbiAgICogLSBgbGlnaHRgIC8gYGZ1bGxgOiBhZGQgZXhwbGFpbmFibGUgZGV0YWlsc1xuICAgKi9cbiAgcmVhZG9ubHkgZ2F0ZURpYWdub3N0aWNzTGV2ZWw/OiBEZWJ1Zy5EaWFnbm9zdGljc0xldmVsXG4gIC8qKlxuICAgKiBDb250cmFjdCBkaWZmIGFsbG93bGlzdCAoZGlzYWJsZWQgYnkgZGVmYXVsdCkuXG4gICAqIC0gT25seSBhbGxvd3Mgc3BlY2lmaWMgb3AgbWV0YSBrZXlzIChieSBtZXRhS2V5KTsgdGhlIFNTb1QgaXMgY29kZSAoS2VybmVsQ29udHJhY3RNZXRhQWxsb3dsaXN0KS5cbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUNvbnRyYWN0TWV0YUFsbG93bGlzdD86IGJvb2xlYW5cbiAgLyoqXG4gICAqIEFmdGVyLXJ1biBvcHRpb25zIHVzZWQgZm9yIGdhdGUgZXZhbHVhdGlvbjsgZGVmYXVsdHMgdG8gYG9wdGlvbnMuYWZ0ZXJgLlxuICAgKlxuICAgKiBPbmx5IHVzZWQgdG8gcmVhZCBydW50aW1lU2VydmljZXNFdmlkZW5jZS9rZXJuZWxSZWY7IGRvZXMgbm90IHJlbHkgb24gZGVidWcgbG9ncy5cbiAgICovXG4gIHJlYWRvbmx5IGdhdGVBZnRlcj86IEZ1bGxDdXRvdmVyR2F0ZVRyaWFsUnVuT3B0aW9uczxTaD5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdWxsQ3V0b3ZlckdhdGVWZXJpZmljYXRpb25SZXN1bHQge1xuICByZWFkb25seSB2ZXJzaW9uOiAndjEnXG4gIHJlYWRvbmx5IHZlcmRpY3Q6ICdQQVNTJyB8ICdGQUlMJ1xuICByZWFkb25seSBnYXRlOiBLZXJuZWwuRnVsbEN1dG92ZXJHYXRlUmVzdWx0XG4gIHJlYWRvbmx5IGNvbnRyYWN0OiBLZXJuZWxDb250cmFjdFZlcmlmaWNhdGlvblJlc3VsdFxuICByZWFkb25seSBjb250cmFjdFZlcmRpY3Q6ICdQQVNTJyB8ICdGQUlMJ1xuICByZWFkb25seSBhbGxvd2VkRGlmZnM/OiBSZWFkb25seUFycmF5PEtlcm5lbENvbnRyYWN0QWxsb3dlZERpZmY+XG59XG5cbi8qKlxuICogUmVmbGVjdGlvbi5leHRyYWN0TWFuaWZlc3RcbiAqXG4gKiBFeHRyYWN0cyBhIHBsYXRmb3JtLWNvbnN1bWFibGUgTWFuaWZlc3QgSVIgKEpTT04sIGRpZmZhYmxlKSBmcm9tIHRoZSBmaW5hbCBtb2R1bGUgb2JqZWN0IChgQW55TW9kdWxlYCAvIGBNb2R1bGVJbXBsYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0TWFuaWZlc3QgPSAoXG4gIG1vZHVsZTogTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+IHwgQW55TW9kdWxlLFxuICBvcHRpb25zPzogRXh0cmFjdE1hbmlmZXN0T3B0aW9ucyxcbik6IE1vZHVsZU1hbmlmZXN0ID0+IE1hbmlmZXN0LmV4dHJhY3RNYW5pZmVzdChtb2R1bGUsIG9wdGlvbnMpXG5cbi8qKlxuICogUmVmbGVjdGlvbi5kaWZmTWFuaWZlc3RcbiAqXG4gKiBEaWZmcyB0d28gTWFuaWZlc3RzIGFuZCBwcm9kdWNlcyBhIHN0YWJsZSwgbWFjaGluZS1yZWFkYWJsZSBzdW1tYXJ5IChDSSBjb250cmFjdCBndWFyZCAvIFVJIHJldXNlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRpZmZNYW5pZmVzdCA9IChcbiAgYmVmb3JlOiBNb2R1bGVNYW5pZmVzdCxcbiAgYWZ0ZXI6IE1vZHVsZU1hbmlmZXN0LFxuICBvcHRpb25zPzogRGlmZk1hbmlmZXN0T3B0aW9ucyxcbik6IE1vZHVsZU1hbmlmZXN0RGlmZiA9PiBNYW5pZmVzdERpZmYuZGlmZk1hbmlmZXN0KGJlZm9yZSwgYWZ0ZXIsIG9wdGlvbnMpXG5cbi8qKlxuICogUmVmbGVjdGlvbi5leHBvcnRTdGF0aWNJclxuICpcbiAqIElmIHRoZSBtb2R1bGUgY29udGFpbnMgYSBTdGF0ZVRyYWl0IHByb2dyYW0sIGV4cG9ydHMgY2Fub25pY2FsIFN0YXRpY0lSIChzYW1lIHNoYXBlIGFuZCBkaWdlc3QgYXMgU3RhdGVUcmFpdC5leHBvcnRTdGF0aWNJcikuXG4gKi9cbmV4cG9ydCBjb25zdCBleHBvcnRTdGF0aWNJciA9IChtb2R1bGU6IE1vZHVsZUltcGw8YW55LCBBbnlNb2R1bGVTaGFwZSwgYW55PiB8IEFueU1vZHVsZSk6IFN0YXRpY0lyIHwgdW5kZWZpbmVkID0+XG4gIFN0YXRpY0lyRXhwb3J0LmV4cG9ydFN0YXRpY0lyKG1vZHVsZSlcblxuLyoqXG4gKiBSZWZsZWN0aW9uLnZlcmlmeUtlcm5lbENvbnRyYWN0XG4gKlxuICogUnVucyB0d28gdHJpYWwtcnVucyAod2l0aCBvcHRpb25hbCBkaWZmZXJlbnQgTGF5ZXJzL292ZXJyaWRlcykgYW5kIGV4cG9ydHMgYSBzdGFibGUsIG1hY2hpbmUtcmVhZGFibGUga2VybmVsIGNvbnRyYWN0IGRpZmYgcmVwb3J0LlxuICovXG5leHBvcnQgY29uc3QgdmVyaWZ5S2VybmVsQ29udHJhY3QgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZT4oXG4gIG1vZHVsZTogTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+IHwgQW55TW9kdWxlLFxuICBvcHRpb25zPzogVmVyaWZ5S2VybmVsQ29udHJhY3RPcHRpb25zPFNoPixcbik6IGltcG9ydCgnZWZmZWN0JykuRWZmZWN0LkVmZmVjdDxLZXJuZWxDb250cmFjdFZlcmlmaWNhdGlvblJlc3VsdCwgbmV2ZXIsIGFueT4gPT5cbiAgdmVyaWZ5S2VybmVsQ29udHJhY3RJbnRlcm5hbChtb2R1bGUgYXMgYW55LCBvcHRpb25zIGFzIGFueSlcblxuZXhwb3J0IGNvbnN0IHZlcmlmeUZ1bGxDdXRvdmVyR2F0ZSA9IDxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPihcbiAgbW9kdWxlOiBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4gfCBBbnlNb2R1bGUsXG4gIG9wdGlvbnM/OiBWZXJpZnlGdWxsQ3V0b3ZlckdhdGVPcHRpb25zPFNoPixcbik6IEVmZmVjdC5FZmZlY3Q8RnVsbEN1dG92ZXJHYXRlVmVyaWZpY2F0aW9uUmVzdWx0LCBuZXZlciwgYW55PiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3Qgcm9vdEltcGwgPSByZXNvbHZlUm9vdEltcGwobW9kdWxlIGFzIGFueSlcblxuICAgIGNvbnN0IGNvbnRyYWN0RGlhZ25vc3RpY3NMZXZlbDogRGVidWcuRGlhZ25vc3RpY3NMZXZlbCA9XG4gICAgICAob3B0aW9ucz8uZGlhZ25vc3RpY3NMZXZlbCBhcyBhbnkpID09PSAnb2ZmJyA/ICdsaWdodCcgOiAoKG9wdGlvbnM/LmRpYWdub3N0aWNzTGV2ZWwgYXMgYW55KSA/PyAnbGlnaHQnKVxuXG4gICAgY29uc3QgY29udHJhY3QgPSB5aWVsZCogdmVyaWZ5S2VybmVsQ29udHJhY3RJbnRlcm5hbChtb2R1bGUgYXMgYW55LCB7XG4gICAgICAuLi4ob3B0aW9ucyBhcyBhbnkpLFxuICAgICAgZGlhZ25vc3RpY3NMZXZlbDogY29udHJhY3REaWFnbm9zdGljc0xldmVsLFxuICAgIH0pXG5cbiAgICBjb25zdCBhbGxvd2xpc3RFbmFibGVkID0gb3B0aW9ucz8uZW5hYmxlQ29udHJhY3RNZXRhQWxsb3dsaXN0ID09PSB0cnVlXG4gICAgY29uc3QgYWxsb3dsaXN0ID0gYWxsb3dsaXN0RW5hYmxlZCA/IEtlcm5lbC5LZXJuZWxDb250cmFjdE1ldGFBbGxvd2xpc3QgOiBbXVxuICAgIGNvbnN0IGNvbnRyYWN0QWxsb3dlZCA9IHRyeUFsbG93bGlzdEtlcm5lbENvbnRyYWN0RGlmZih7IHJlc3VsdDogY29udHJhY3QsIGFsbG93bGlzdCB9KVxuICAgIGNvbnN0IGNvbnRyYWN0VmVyZGljdDogJ1BBU1MnIHwgJ0ZBSUwnID0gYWxsb3dsaXN0RW5hYmxlZCA/IGNvbnRyYWN0QWxsb3dlZC52ZXJkaWN0IDogY29udHJhY3QudmVyZGljdFxuXG4gICAgY29uc3QgZ2F0ZVJ1biA9IChvcHRpb25zPy5nYXRlQWZ0ZXIgPz8gb3B0aW9ucz8uYWZ0ZXIpIGFzIEZ1bGxDdXRvdmVyR2F0ZVRyaWFsUnVuT3B0aW9uczxTaD4gfCB1bmRlZmluZWRcblxuICAgIGNvbnN0IGdhdGVQcm9ncmFtID0gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgY3R4ID0geWllbGQqIHJvb3RJbXBsLmxheWVyLnBpcGUoTGF5ZXIuYnVpbGQpXG4gICAgICBjb25zdCBydW50aW1lOiBhbnkgPSBDb250ZXh0LmdldChjdHgsIHJvb3RJbXBsLm1vZHVsZSBhcyBhbnkpXG4gICAgICBpZiAoZ2F0ZVJ1bj8uaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgeWllbGQqIGdhdGVSdW4uaW50ZXJhY3Rpb24ocnVudGltZSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtlcm5lbEltcGxlbWVudGF0aW9uUmVmOiBLZXJuZWwuZ2V0S2VybmVsSW1wbGVtZW50YXRpb25SZWYocnVudGltZSksXG4gICAgICAgIHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlOiBLZXJuZWwuZ2V0UnVudGltZVNlcnZpY2VzRXZpZGVuY2UocnVudGltZSksXG4gICAgICB9IGFzIGNvbnN0XG4gICAgfSlcblxuICAgIGNvbnN0IGdhdGVSZXN1bHQgPSB5aWVsZCogdHJpYWxSdW4oZ2F0ZVByb2dyYW0sIHtcbiAgICAgIHJ1bklkOiBnYXRlUnVuPy5ydW5JZCxcbiAgICAgIGRpYWdub3N0aWNzTGV2ZWw6IG9wdGlvbnM/LmdhdGVEaWFnbm9zdGljc0xldmVsID8/ICdvZmYnLFxuICAgICAgbGF5ZXI6IGdhdGVSdW4/LmxheWVyLFxuICAgICAgcnVudGltZVNlcnZpY2VzSW5zdGFuY2VPdmVycmlkZXM6IGdhdGVSdW4/LnJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzLFxuICAgIH0pXG5cbiAgICBjb25zdCBnYXRlVmFsdWUgPSBFeGl0LmlzU3VjY2VzcyhnYXRlUmVzdWx0LmV4aXQpXG4gICAgICA/IGdhdGVSZXN1bHQuZXhpdC52YWx1ZVxuICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IEV4aXQuaXNGYWlsdXJlKGdhdGVSZXN1bHQuZXhpdClcbiAgICAgICAgICAgID8gU3RyaW5nKChnYXRlUmVzdWx0LmV4aXQgYXMgYW55KS5jYXVzZSA/PyAndHJpYWwtcnVuIGZhaWxlZCcpXG4gICAgICAgICAgICA6ICd0cmlhbC1ydW4gZmFpbGVkJ1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpXG4gICAgICAgIH0pKClcblxuICAgIGNvbnN0IGdhdGUgPSBLZXJuZWwuZXZhbHVhdGVGdWxsQ3V0b3ZlckdhdGUoe1xuICAgICAgbW9kZTogb3B0aW9ucz8ubW9kZSA/PyAnZnVsbEN1dG92ZXInLFxuICAgICAgcmVxdWVzdGVkS2VybmVsSWQ6IGdhdGVWYWx1ZS5rZXJuZWxJbXBsZW1lbnRhdGlvblJlZi5rZXJuZWxJZCxcbiAgICAgIHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlOiBnYXRlVmFsdWUucnVudGltZVNlcnZpY2VzRXZpZGVuY2UsXG4gICAgICBkaWFnbm9zdGljc0xldmVsOiBvcHRpb25zPy5nYXRlRGlhZ25vc3RpY3NMZXZlbCA/PyAnb2ZmJyxcbiAgICB9KVxuXG4gICAgY29uc3QgdmVyZGljdDogJ1BBU1MnIHwgJ0ZBSUwnID0gZ2F0ZS52ZXJkaWN0ID09PSAnUEFTUycgJiYgY29udHJhY3RWZXJkaWN0ID09PSAnUEFTUycgPyAnUEFTUycgOiAnRkFJTCdcblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiAndjEnLFxuICAgICAgdmVyZGljdCxcbiAgICAgIGdhdGUsXG4gICAgICBjb250cmFjdCxcbiAgICAgIGNvbnRyYWN0VmVyZGljdCxcbiAgICAgIC4uLihhbGxvd2xpc3RFbmFibGVkID8geyBhbGxvd2VkRGlmZnM6IGNvbnRyYWN0QWxsb3dlZC5hbGxvd2VkRGlmZnMgfSA6IHt9KSxcbiAgICB9XG4gIH0pXG4iLCAiaW1wb3J0IHsgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSAnLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHR5cGUgeyBKc29uVmFsdWUgfSBmcm9tICcuLi9vYnNlcnZhYmlsaXR5L2pzb25WYWx1ZS5qcydcbmltcG9ydCB0eXBlIHsgTW9kdWxlTWFuaWZlc3QsIE1vZHVsZU1hbmlmZXN0TG9naWNVbml0IH0gZnJvbSAnLi9tYW5pZmVzdC5qcydcblxuZXhwb3J0IHR5cGUgTWFuaWZlc3REaWZmU2V2ZXJpdHkgPSAnQlJFQUtJTkcnIHwgJ1JJU0tZJyB8ICdJTkZPJ1xuZXhwb3J0IHR5cGUgTWFuaWZlc3REaWZmVmVyZGljdCA9ICdQQVNTJyB8ICdXQVJOJyB8ICdGQUlMJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0RGlmZkNoYW5nZSB7XG4gIHJlYWRvbmx5IHNldmVyaXR5OiBNYW5pZmVzdERpZmZTZXZlcml0eVxuICByZWFkb25seSBjb2RlOiBzdHJpbmdcbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZ1xuICByZWFkb25seSBwb2ludGVyPzogc3RyaW5nXG4gIHJlYWRvbmx5IGRldGFpbHM/OiBKc29uVmFsdWVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdERpZmZTdW1tYXJ5IHtcbiAgcmVhZG9ubHkgYnJlYWtpbmc6IG51bWJlclxuICByZWFkb25seSByaXNreTogbnVtYmVyXG4gIHJlYWRvbmx5IGluZm86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0RGlmZiB7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGJlZm9yZToge1xuICAgIHJlYWRvbmx5IGRpZ2VzdDogc3RyaW5nXG4gICAgcmVhZG9ubHkgbWFuaWZlc3RWZXJzaW9uPzogc3RyaW5nXG4gIH1cbiAgcmVhZG9ubHkgYWZ0ZXI6IHtcbiAgICByZWFkb25seSBkaWdlc3Q6IHN0cmluZ1xuICAgIHJlYWRvbmx5IG1hbmlmZXN0VmVyc2lvbj86IHN0cmluZ1xuICB9XG4gIHJlYWRvbmx5IHZlcmRpY3Q6IE1hbmlmZXN0RGlmZlZlcmRpY3RcbiAgcmVhZG9ubHkgY2hhbmdlczogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdERpZmZDaGFuZ2U+XG4gIHJlYWRvbmx5IHN1bW1hcnk6IE1vZHVsZU1hbmlmZXN0RGlmZlN1bW1hcnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaWZmTWFuaWZlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIG1ldGFBbGxvd2xpc3RcdUZGMUFcbiAgICogLSBXaGVuIG9taXR0ZWQ6IGRpZmYgYWxsIG1ldGEga2V5cyAoZGVmYXVsdHMgdG8gdHJlYXRpbmcgYWxsIGNoYW5nZXMgYXMgUklTS1kpLlxuICAgKiAtIFdoZW4gcHJvdmlkZWQ6IG9ubHkgZGlmZiBhbGxvd2xpc3RlZCBrZXlzIChvdGhlcnMgYXJlIGlnbm9yZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0YUFsbG93bGlzdD86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxufVxuXG5jb25zdCBTRVZFUklUWV9SQU5LOiBSZWNvcmQ8TWFuaWZlc3REaWZmU2V2ZXJpdHksIG51bWJlcj4gPSB7XG4gIEJSRUFLSU5HOiAwLFxuICBSSVNLWTogMSxcbiAgSU5GTzogMixcbn1cblxuY29uc3QgdW5pcVNvcnRlZCA9IChpbnB1dDogUmVhZG9ubHlBcnJheTxzdHJpbmc+KTogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0+IHtcbiAgY29uc3Qgb3V0ID0gQXJyYXkuZnJvbShuZXcgU2V0KGlucHV0LmZpbHRlcigoeCkgPT4gdHlwZW9mIHggPT09ICdzdHJpbmcnICYmIHgubGVuZ3RoID4gMCkpKVxuICBvdXQuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICByZXR1cm4gb3V0XG59XG5cbmNvbnN0IGRpZmZTdHJpbmdLZXlzID0gKFxuICBiZWZvcmU6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCxcbiAgYWZ0ZXI6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZCxcbik6IHsgcmVhZG9ubHkgcmVtb3ZlZDogUmVhZG9ubHlBcnJheTxzdHJpbmc+OyByZWFkb25seSBhZGRlZDogUmVhZG9ubHlBcnJheTxzdHJpbmc+IH0gPT4ge1xuICBjb25zdCBiZWZvcmVTZXQgPSBuZXcgU2V0KHVuaXFTb3J0ZWQoYmVmb3JlID8/IFtdKSlcbiAgY29uc3QgYWZ0ZXJTZXQgPSBuZXcgU2V0KHVuaXFTb3J0ZWQoYWZ0ZXIgPz8gW10pKVxuXG4gIGNvbnN0IHJlbW92ZWQ6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBrIG9mIGJlZm9yZVNldCkge1xuICAgIGlmICghYWZ0ZXJTZXQuaGFzKGspKSByZW1vdmVkLnB1c2goaylcbiAgfVxuICByZW1vdmVkLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcblxuICBjb25zdCBhZGRlZDogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IGsgb2YgYWZ0ZXJTZXQpIHtcbiAgICBpZiAoIWJlZm9yZVNldC5oYXMoaykpIGFkZGVkLnB1c2goaylcbiAgfVxuICBhZGRlZC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG5cbiAgcmV0dXJuIHsgcmVtb3ZlZCwgYWRkZWQgfVxufVxuXG5jb25zdCBlcUpzb25WYWx1ZSA9IChhOiB1bmtub3duLCBiOiB1bmtub3duKTogYm9vbGVhbiA9PiBzdGFibGVTdHJpbmdpZnkoYSkgPT09IHN0YWJsZVN0cmluZ2lmeShiKVxuXG5jb25zdCBpbmRleExvZ2ljVW5pdHMgPSAoXG4gIGlucHV0OiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0TG9naWNVbml0PiB8IHVuZGVmaW5lZCxcbik6IFJlYWRvbmx5TWFwPHN0cmluZywgTW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+ID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIE1vZHVsZU1hbmlmZXN0TG9naWNVbml0PigpXG4gIGZvciAoY29uc3QgdW5pdCBvZiBpbnB1dCA/PyBbXSkge1xuICAgIGlmICghdW5pdCB8fCB0eXBlb2YgdW5pdCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlXG4gICAgY29uc3QgaWQgPSAodW5pdCBhcyBhbnkpLmlkXG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycgfHwgaWQubGVuZ3RoID09PSAwKSBjb250aW51ZVxuICAgIG1hcC5zZXQoaWQsIHVuaXQpXG4gIH1cbiAgcmV0dXJuIG1hcFxufVxuXG5leHBvcnQgY29uc3QgZGlmZk1hbmlmZXN0ID0gKFxuICBiZWZvcmU6IE1vZHVsZU1hbmlmZXN0LFxuICBhZnRlcjogTW9kdWxlTWFuaWZlc3QsXG4gIG9wdGlvbnM/OiBEaWZmTWFuaWZlc3RPcHRpb25zLFxuKTogTW9kdWxlTWFuaWZlc3REaWZmID0+IHtcbiAgY29uc3QgY2hhbmdlczogTW9kdWxlTWFuaWZlc3REaWZmQ2hhbmdlW10gPSBbXVxuXG4gIC8vIElkZW50aXR5IC8gcHJvdG9jb2xcbiAgaWYgKGJlZm9yZS5tb2R1bGVJZCAhPT0gYWZ0ZXIubW9kdWxlSWQpIHtcbiAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgc2V2ZXJpdHk6ICdCUkVBS0lORycsXG4gICAgICBjb2RlOiAnbW9kdWxlSWQuY2hhbmdlZCcsXG4gICAgICBtZXNzYWdlOiBgbW9kdWxlSWQgY2hhbmdlZCAoJHtiZWZvcmUubW9kdWxlSWR9IC0+ICR7YWZ0ZXIubW9kdWxlSWR9KWAsXG4gICAgICBwb2ludGVyOiAnL21vZHVsZUlkJyxcbiAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgYmVmb3JlOiBiZWZvcmUubW9kdWxlSWQsXG4gICAgICAgIGFmdGVyOiBhZnRlci5tb2R1bGVJZCxcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGlmIChiZWZvcmUubWFuaWZlc3RWZXJzaW9uICE9PSBhZnRlci5tYW5pZmVzdFZlcnNpb24pIHtcbiAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgc2V2ZXJpdHk6ICdJTkZPJyxcbiAgICAgIGNvZGU6ICdtYW5pZmVzdFZlcnNpb24uY2hhbmdlZCcsXG4gICAgICBtZXNzYWdlOiBgbWFuaWZlc3RWZXJzaW9uIGNoYW5nZWQgKCR7YmVmb3JlLm1hbmlmZXN0VmVyc2lvbn0gLT4gJHthZnRlci5tYW5pZmVzdFZlcnNpb259KWAsXG4gICAgICBwb2ludGVyOiAnL21hbmlmZXN0VmVyc2lvbicsXG4gICAgICBkZXRhaWxzOiB7XG4gICAgICAgIGJlZm9yZTogYmVmb3JlLm1hbmlmZXN0VmVyc2lvbixcbiAgICAgICAgYWZ0ZXI6IGFmdGVyLm1hbmlmZXN0VmVyc2lvbixcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIC8vIGFjdGlvbktleXNcbiAge1xuICAgIGNvbnN0IHsgcmVtb3ZlZCwgYWRkZWQgfSA9IGRpZmZTdHJpbmdLZXlzKGJlZm9yZS5hY3Rpb25LZXlzLCBhZnRlci5hY3Rpb25LZXlzKVxuICAgIGlmIChyZW1vdmVkLmxlbmd0aCA+IDAgfHwgYWRkZWQubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6IHJlbW92ZWQubGVuZ3RoID4gMCA/ICdCUkVBS0lORycgOiAnSU5GTycsXG4gICAgICAgIGNvZGU6ICdhY3Rpb25LZXlzLmNoYW5nZWQnLFxuICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgIHJlbW92ZWQubGVuZ3RoID4gMCA/IGBhY3Rpb25LZXlzIHJlbW92ZWQ6ICR7cmVtb3ZlZC5qb2luKCcsICcpfWAgOiBgYWN0aW9uS2V5cyBhZGRlZDogJHthZGRlZC5qb2luKCcsICcpfWAsXG4gICAgICAgIHBvaW50ZXI6ICcvYWN0aW9uS2V5cycsXG4gICAgICAgIGRldGFpbHM6IHsgcmVtb3ZlZCwgYWRkZWQgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLy8gc2NoZW1hS2V5c1xuICB7XG4gICAgY29uc3QgeyByZW1vdmVkLCBhZGRlZCB9ID0gZGlmZlN0cmluZ0tleXMoYmVmb3JlLnNjaGVtYUtleXMsIGFmdGVyLnNjaGVtYUtleXMpXG4gICAgaWYgKHJlbW92ZWQubGVuZ3RoID4gMCB8fCBhZGRlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBzZXZlcml0eTogcmVtb3ZlZC5sZW5ndGggPiAwID8gJ0JSRUFLSU5HJyA6ICdJTkZPJyxcbiAgICAgICAgY29kZTogJ3NjaGVtYUtleXMuY2hhbmdlZCcsXG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgcmVtb3ZlZC5sZW5ndGggPiAwID8gYHNjaGVtYUtleXMgcmVtb3ZlZDogJHtyZW1vdmVkLmpvaW4oJywgJyl9YCA6IGBzY2hlbWFLZXlzIGFkZGVkOiAke2FkZGVkLmpvaW4oJywgJyl9YCxcbiAgICAgICAgcG9pbnRlcjogJy9zY2hlbWFLZXlzJyxcbiAgICAgICAgZGV0YWlsczogeyByZW1vdmVkLCBhZGRlZCB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBsb2dpY1VuaXRzIChzbG90cylcbiAge1xuICAgIGNvbnN0IGJlZm9yZUJ5SWQgPSBpbmRleExvZ2ljVW5pdHMoYmVmb3JlLmxvZ2ljVW5pdHMpXG4gICAgY29uc3QgYWZ0ZXJCeUlkID0gaW5kZXhMb2dpY1VuaXRzKGFmdGVyLmxvZ2ljVW5pdHMpXG5cbiAgICBjb25zdCByZW1vdmVkOiBzdHJpbmdbXSA9IFtdXG4gICAgY29uc3QgYWRkZWQ6IHN0cmluZ1tdID0gW11cbiAgICBjb25zdCBraW5kQ2hhbmdlZDogQXJyYXk8eyByZWFkb25seSBpZDogc3RyaW5nOyByZWFkb25seSBiZWZvcmU6IHN0cmluZzsgcmVhZG9ubHkgYWZ0ZXI6IHN0cmluZyB9PiA9IFtdXG4gICAgY29uc3Qgcmlza3lDaGFuZ2VkOiBBcnJheTx7IHJlYWRvbmx5IGlkOiBzdHJpbmc7IHJlYWRvbmx5IGZpZWxkczogUmVhZG9ubHlBcnJheTxzdHJpbmc+IH0+ID0gW11cblxuICAgIGZvciAoY29uc3QgaWQgb2YgYmVmb3JlQnlJZC5rZXlzKCkpIHtcbiAgICAgIGlmICghYWZ0ZXJCeUlkLmhhcyhpZCkpIHJlbW92ZWQucHVzaChpZClcbiAgICB9XG4gICAgZm9yIChjb25zdCBpZCBvZiBhZnRlckJ5SWQua2V5cygpKSB7XG4gICAgICBpZiAoIWJlZm9yZUJ5SWQuaGFzKGlkKSkgYWRkZWQucHVzaChpZClcbiAgICB9XG5cbiAgICByZW1vdmVkLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICBhZGRlZC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpXG5cbiAgICBmb3IgKGNvbnN0IGlkIG9mIGJlZm9yZUJ5SWQua2V5cygpKSB7XG4gICAgICBjb25zdCBiID0gYmVmb3JlQnlJZC5nZXQoaWQpXG4gICAgICBjb25zdCBhID0gYWZ0ZXJCeUlkLmdldChpZClcbiAgICAgIGlmICghYiB8fCAhYSkgY29udGludWVcblxuICAgICAgY29uc3QgZmllbGRzOiBzdHJpbmdbXSA9IFtdXG4gICAgICBpZiAoYi5raW5kICE9PSBhLmtpbmQpIHtcbiAgICAgICAga2luZENoYW5nZWQucHVzaCh7IGlkLCBiZWZvcmU6IGIua2luZCwgYWZ0ZXI6IGEua2luZCB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKGIubmFtZSAhPT0gYS5uYW1lKSBmaWVsZHMucHVzaCgnbmFtZScpXG4gICAgICBpZiAoYi5kZXJpdmVkICE9PSBhLmRlcml2ZWQpIGZpZWxkcy5wdXNoKCdkZXJpdmVkJylcbiAgICAgIGlmIChmaWVsZHMubGVuZ3RoID4gMCkgcmlza3lDaGFuZ2VkLnB1c2goeyBpZCwgZmllbGRzIH0pXG4gICAgfVxuXG4gICAga2luZENoYW5nZWQuc29ydCgoeCwgeSkgPT4geC5pZC5sb2NhbGVDb21wYXJlKHkuaWQpKVxuICAgIHJpc2t5Q2hhbmdlZC5zb3J0KCh4LCB5KSA9PiB4LmlkLmxvY2FsZUNvbXBhcmUoeS5pZCkpXG5cbiAgICBpZiAocmVtb3ZlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBzZXZlcml0eTogJ0JSRUFLSU5HJyxcbiAgICAgICAgY29kZTogJ2xvZ2ljVW5pdHMucmVtb3ZlZCcsXG4gICAgICAgIG1lc3NhZ2U6IGBsb2dpY1VuaXRzIHJlbW92ZWQ6ICR7cmVtb3ZlZC5qb2luKCcsICcpfWAsXG4gICAgICAgIHBvaW50ZXI6ICcvbG9naWNVbml0cycsXG4gICAgICAgIGRldGFpbHM6IHsgcmVtb3ZlZCB9LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoa2luZENoYW5nZWQubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6ICdCUkVBS0lORycsXG4gICAgICAgIGNvZGU6ICdsb2dpY1VuaXRzLmtpbmRDaGFuZ2VkJyxcbiAgICAgICAgbWVzc2FnZTogYGxvZ2ljVW5pdHMga2luZCBjaGFuZ2VkOiAke2tpbmRDaGFuZ2VkLm1hcCgoeCkgPT4geC5pZCkuam9pbignLCAnKX1gLFxuICAgICAgICBwb2ludGVyOiAnL2xvZ2ljVW5pdHMnLFxuICAgICAgICBkZXRhaWxzOiB7IGtpbmRDaGFuZ2VkIH0sXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChhZGRlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBzZXZlcml0eTogJ0lORk8nLFxuICAgICAgICBjb2RlOiAnbG9naWNVbml0cy5hZGRlZCcsXG4gICAgICAgIG1lc3NhZ2U6IGBsb2dpY1VuaXRzIGFkZGVkOiAke2FkZGVkLmpvaW4oJywgJyl9YCxcbiAgICAgICAgcG9pbnRlcjogJy9sb2dpY1VuaXRzJyxcbiAgICAgICAgZGV0YWlsczogeyBhZGRlZCB9LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAocmlza3lDaGFuZ2VkLmxlbmd0aCA+IDApIHtcbiAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgIHNldmVyaXR5OiAnUklTS1knLFxuICAgICAgICBjb2RlOiAnbG9naWNVbml0cy5jaGFuZ2VkJyxcbiAgICAgICAgbWVzc2FnZTogYGxvZ2ljVW5pdHMgY2hhbmdlZDogJHtyaXNreUNoYW5nZWQubWFwKCh4KSA9PiB4LmlkKS5qb2luKCcsICcpfWAsXG4gICAgICAgIHBvaW50ZXI6ICcvbG9naWNVbml0cycsXG4gICAgICAgIGRldGFpbHM6IHsgY2hhbmdlZDogcmlza3lDaGFuZ2VkIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIHN0YXRpY0lyLmRpZ2VzdFxuICB7XG4gICAgY29uc3QgYmVmb3JlRGlnZXN0ID0gYmVmb3JlLnN0YXRpY0lyPy5kaWdlc3RcbiAgICBjb25zdCBhZnRlckRpZ2VzdCA9IGFmdGVyLnN0YXRpY0lyPy5kaWdlc3RcbiAgICBpZiAoYmVmb3JlRGlnZXN0ICE9PSBhZnRlckRpZ2VzdCkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6ICdSSVNLWScsXG4gICAgICAgIGNvZGU6ICdzdGF0aWNJci5kaWdlc3RDaGFuZ2VkJyxcbiAgICAgICAgbWVzc2FnZTogJ3N0YXRpY0lyLmRpZ2VzdCBjaGFuZ2VkJyxcbiAgICAgICAgcG9pbnRlcjogJy9zdGF0aWNJci9kaWdlc3QnLFxuICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgYmVmb3JlOiBiZWZvcmVEaWdlc3QgPz8gbnVsbCxcbiAgICAgICAgICBhZnRlcjogYWZ0ZXJEaWdlc3QgPz8gbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLy8gbWV0YSAoZGVmYXVsdDogUklTS1ksIGFsbG93bGlzdCBzdXBwb3J0ZWQpXG4gIHtcbiAgICBjb25zdCBtZXRhQmVmb3JlID0gYmVmb3JlLm1ldGEgPz8ge31cbiAgICBjb25zdCBtZXRhQWZ0ZXIgPSBhZnRlci5tZXRhID8/IHt9XG5cbiAgICBjb25zdCBhbGxvd2xpc3QgPSBvcHRpb25zPy5tZXRhQWxsb3dsaXN0XG4gICAgY29uc3Qga2V5cyA9XG4gICAgICBhbGxvd2xpc3QgIT0gbnVsbCA/IHVuaXFTb3J0ZWQoYWxsb3dsaXN0KSA6IHVuaXFTb3J0ZWQoWy4uLk9iamVjdC5rZXlzKG1ldGFCZWZvcmUpLCAuLi5PYmplY3Qua2V5cyhtZXRhQWZ0ZXIpXSlcblxuICAgIGNvbnN0IGNoYW5nZWQ6IEFycmF5PHtcbiAgICAgIHJlYWRvbmx5IGtleTogc3RyaW5nXG4gICAgICByZWFkb25seSBiZWZvcmU6IEpzb25WYWx1ZSB8IG51bGxcbiAgICAgIHJlYWRvbmx5IGFmdGVyOiBKc29uVmFsdWUgfCBudWxsXG4gICAgfT4gPSBbXVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3QgYiA9IGtleSBpbiBtZXRhQmVmb3JlID8gKG1ldGFCZWZvcmUgYXMgYW55KVtrZXldIDogdW5kZWZpbmVkXG4gICAgICBjb25zdCBhID0ga2V5IGluIG1ldGFBZnRlciA/IChtZXRhQWZ0ZXIgYXMgYW55KVtrZXldIDogdW5kZWZpbmVkXG4gICAgICBpZiAoIWVxSnNvblZhbHVlKGIsIGEpKSB7XG4gICAgICAgIGNoYW5nZWQucHVzaCh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGJlZm9yZTogKGIgPz8gbnVsbCkgYXMgSnNvblZhbHVlIHwgbnVsbCxcbiAgICAgICAgICBhZnRlcjogKGEgPz8gbnVsbCkgYXMgSnNvblZhbHVlIHwgbnVsbCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBzZXZlcml0eTogJ1JJU0tZJyxcbiAgICAgICAgY29kZTogJ21ldGEuY2hhbmdlZCcsXG4gICAgICAgIG1lc3NhZ2U6ICdtZXRhIGNoYW5nZWQnLFxuICAgICAgICBwb2ludGVyOiAnL21ldGEnLFxuICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAga2V5czogY2hhbmdlZC5tYXAoKHgpID0+IHgua2V5KSxcbiAgICAgICAgICBjaGFuZ2VkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBzb3VyY2UgKGRlZmF1bHQ6IElORk8pXG4gIHtcbiAgICBjb25zdCBiID0gYmVmb3JlLnNvdXJjZVxuICAgIGNvbnN0IGEgPSBhZnRlci5zb3VyY2VcbiAgICBpZiAoIWVxSnNvblZhbHVlKGIgPz8gbnVsbCwgYSA/PyBudWxsKSkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6ICdJTkZPJyxcbiAgICAgICAgY29kZTogJ3NvdXJjZS5jaGFuZ2VkJyxcbiAgICAgICAgbWVzc2FnZTogJ3NvdXJjZSBjaGFuZ2VkJyxcbiAgICAgICAgcG9pbnRlcjogJy9zb3VyY2UnLFxuICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgYmVmb3JlOiBiID8/IG51bGwsXG4gICAgICAgICAgYWZ0ZXI6IGEgPz8gbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgY2hhbmdlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgcmEgPSBTRVZFUklUWV9SQU5LW2Euc2V2ZXJpdHldXG4gICAgY29uc3QgcmIgPSBTRVZFUklUWV9SQU5LW2Iuc2V2ZXJpdHldXG4gICAgaWYgKHJhICE9PSByYikgcmV0dXJuIHJhIC0gcmJcbiAgICBjb25zdCBjYSA9IGEuY29kZS5sb2NhbGVDb21wYXJlKGIuY29kZSlcbiAgICBpZiAoY2EgIT09IDApIHJldHVybiBjYVxuICAgIGNvbnN0IHBhID0gYS5wb2ludGVyID8/ICcnXG4gICAgY29uc3QgcGIgPSBiLnBvaW50ZXIgPz8gJydcbiAgICByZXR1cm4gcGEubG9jYWxlQ29tcGFyZShwYilcbiAgfSlcblxuICBjb25zdCBzdW1tYXJ5OiBNb2R1bGVNYW5pZmVzdERpZmZTdW1tYXJ5ID0ge1xuICAgIGJyZWFraW5nOiBjaGFuZ2VzLmZpbHRlcigoYykgPT4gYy5zZXZlcml0eSA9PT0gJ0JSRUFLSU5HJykubGVuZ3RoLFxuICAgIHJpc2t5OiBjaGFuZ2VzLmZpbHRlcigoYykgPT4gYy5zZXZlcml0eSA9PT0gJ1JJU0tZJykubGVuZ3RoLFxuICAgIGluZm86IGNoYW5nZXMuZmlsdGVyKChjKSA9PiBjLnNldmVyaXR5ID09PSAnSU5GTycpLmxlbmd0aCxcbiAgfVxuXG4gIGNvbnN0IHZlcmRpY3Q6IE1hbmlmZXN0RGlmZlZlcmRpY3QgPSBzdW1tYXJ5LmJyZWFraW5nID4gMCA/ICdGQUlMJyA6IHN1bW1hcnkucmlza3kgPiAwID8gJ1dBUk4nIDogJ1BBU1MnXG5cbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uOiAnMDI1JyxcbiAgICBtb2R1bGVJZDogYWZ0ZXIubW9kdWxlSWQsXG4gICAgYmVmb3JlOiB7XG4gICAgICBkaWdlc3Q6IGJlZm9yZS5kaWdlc3QsXG4gICAgICBtYW5pZmVzdFZlcnNpb246IGJlZm9yZS5tYW5pZmVzdFZlcnNpb24sXG4gICAgfSxcbiAgICBhZnRlcjoge1xuICAgICAgZGlnZXN0OiBhZnRlci5kaWdlc3QsXG4gICAgICBtYW5pZmVzdFZlcnNpb246IGFmdGVyLm1hbmlmZXN0VmVyc2lvbixcbiAgICB9LFxuICAgIHZlcmRpY3QsXG4gICAgY2hhbmdlcyxcbiAgICBzdW1tYXJ5LFxuICB9XG59XG4iLCAiaW1wb3J0IHsgQ29udGV4dCwgRWZmZWN0LCBFeGl0LCBMYXllciB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgTW9kdWxlSW1wbCwgQW55TW9kdWxlU2hhcGUgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0IHR5cGUgeyBNb2R1bGVSdW50aW1lIH0gZnJvbSAnLi4vcnVudGltZS9jb3JlL21vZHVsZS5qcydcbmltcG9ydCB7IHRyaWFsUnVuIH0gZnJvbSAnLi4vb2JzZXJ2YWJpbGl0eS90cmlhbFJ1bi5qcydcbmltcG9ydCB0eXBlIHsgRXZpZGVuY2VQYWNrYWdlIH0gZnJvbSAnLi4vb2JzZXJ2YWJpbGl0eS9ldmlkZW5jZS5qcydcbmltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAnLi4vb2JzZXJ2YWJpbGl0eS9qc29uVmFsdWUuanMnXG5pbXBvcnQgeyBmbnYxYTMyLCBzdGFibGVTdHJpbmdpZnkgfSBmcm9tICcuLi9kaWdlc3QuanMnXG5pbXBvcnQgdHlwZSB7IE1pZGRsZXdhcmUgfSBmcm9tICcuLi9lZmZlY3Qtb3AuanMnXG5pbXBvcnQgKiBhcyBEZWJ1ZyBmcm9tICcuLi9ydW50aW1lL2NvcmUvRGVidWdTaW5rLmpzJ1xuaW1wb3J0ICogYXMgRWZmZWN0T3BDb3JlIGZyb20gJy4uL3J1bnRpbWUvY29yZS9FZmZlY3RPcENvcmUuanMnXG5pbXBvcnQgKiBhcyBLZXJuZWxSZWYgZnJvbSAnLi4vcnVudGltZS9jb3JlL0tlcm5lbFJlZi5qcydcbmltcG9ydCB0eXBlICogYXMgUnVudGltZUtlcm5lbCBmcm9tICcuLi9ydW50aW1lL2NvcmUvUnVudGltZUtlcm5lbC5qcydcblxudHlwZSBBbnlNb2R1bGVMaWtlID0geyByZWFkb25seSBpbXBsOiBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gfVxuXG50eXBlIFJvb3RMaWtlPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGU+ID0gTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+IHwgQW55TW9kdWxlTGlrZVxuXG5jb25zdCByZXNvbHZlUm9vdEltcGwgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZT4ocm9vdDogUm9vdExpa2U8U2g+KTogTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+ID0+XG4gICgocm9vdCBhcyBhbnkpPy5fdGFnID09PSAnTW9kdWxlSW1wbCdcbiAgICA/IChyb290IGFzIE1vZHVsZUltcGw8YW55LCBTaCwgYW55PilcbiAgICA6ICgocm9vdCBhcyBhbnkpPy5pbXBsIGFzIE1vZHVsZUltcGw8YW55LCBTaCwgYW55PikpIHNhdGlzZmllcyBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT5cblxuZXhwb3J0IHR5cGUgS2VybmVsQ29udHJhY3RWZXJkaWN0ID0gJ1BBU1MnIHwgJ0ZBSUwnXG5cbmV4cG9ydCBpbnRlcmZhY2UgS2VybmVsQ29udHJhY3RBbmNob3Ige1xuICByZWFkb25seSBpbnN0YW5jZUlkOiBzdHJpbmdcbiAgcmVhZG9ubHkgdHhuU2VxOiBudW1iZXJcbiAgcmVhZG9ubHkgb3BTZXE6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtlcm5lbENvbnRyYWN0VHJhY2VPcCB7XG4gIHJlYWRvbmx5IGFuY2hvcjogS2VybmVsQ29udHJhY3RBbmNob3JcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBraW5kOiBzdHJpbmdcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG4gIHJlYWRvbmx5IG1ldGE/OiBKc29uVmFsdWVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLZXJuZWxDb250cmFjdFJ1blN1bW1hcnkge1xuICByZWFkb25seSBvazogYm9vbGVhblxuICByZWFkb25seSBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZjogS2VybmVsUmVmLktlcm5lbEltcGxlbWVudGF0aW9uUmVmXG4gIHJlYWRvbmx5IHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlPzogSnNvblZhbHVlXG4gIHJlYWRvbmx5IHRyYWNlOiB7XG4gICAgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmdcbiAgICByZWFkb25seSBvcENvdW50OiBudW1iZXJcbiAgfVxuICByZWFkb25seSBlcnJvcj86IHtcbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmdcbiAgICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmdcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBLZXJuZWxDb250cmFjdERpZmZDaGFuZ2VDb2RlID0gJ29wLmFkZGVkJyB8ICdvcC5yZW1vdmVkJyB8ICdvcC5jaGFuZ2VkJyB8ICdydW4uZmFpbHVyZSdcblxuZXhwb3J0IGludGVyZmFjZSBLZXJuZWxDb250cmFjdERpZmZDaGFuZ2Uge1xuICByZWFkb25seSBjb2RlOiBLZXJuZWxDb250cmFjdERpZmZDaGFuZ2VDb2RlXG4gIHJlYWRvbmx5IGFuY2hvcj86IEtlcm5lbENvbnRyYWN0QW5jaG9yXG4gIHJlYWRvbmx5IGJlZm9yZT86IEpzb25WYWx1ZVxuICByZWFkb25seSBhZnRlcj86IEpzb25WYWx1ZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtlcm5lbENvbnRyYWN0VmVyaWZpY2F0aW9uUmVzdWx0IHtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nXG4gIHJlYWRvbmx5IHZlcmRpY3Q6IEtlcm5lbENvbnRyYWN0VmVyZGljdFxuICByZWFkb25seSBiZWZvcmU6IEtlcm5lbENvbnRyYWN0UnVuU3VtbWFyeVxuICByZWFkb25seSBhZnRlcjogS2VybmVsQ29udHJhY3RSdW5TdW1tYXJ5XG4gIHJlYWRvbmx5IGNoYW5nZXM6IFJlYWRvbmx5QXJyYXk8S2VybmVsQ29udHJhY3REaWZmQ2hhbmdlPlxuICByZWFkb25seSBzdW1tYXJ5OiB7XG4gICAgcmVhZG9ubHkgYWRkZWQ6IG51bWJlclxuICAgIHJlYWRvbmx5IHJlbW92ZWQ6IG51bWJlclxuICAgIHJlYWRvbmx5IGNoYW5nZWQ6IG51bWJlclxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2VybmVsQ29udHJhY3RSdW5PcHRpb25zPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGU+IHtcbiAgcmVhZG9ubHkgcnVuSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgbGF5ZXI/OiBMYXllci5MYXllcjxhbnksIGFueSwgYW55PlxuICByZWFkb25seSBydW50aW1lU2VydmljZXNJbnN0YW5jZU92ZXJyaWRlcz86IFJ1bnRpbWVLZXJuZWwuUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzXG4gIHJlYWRvbmx5IGludGVyYWN0aW9uPzogKHJ1bnRpbWU6IE1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIGFueSwgYW55PlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUtlcm5lbENvbnRyYWN0T3B0aW9uczxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPiB7XG4gIHJlYWRvbmx5IGJlZm9yZT86IEtlcm5lbENvbnRyYWN0UnVuT3B0aW9uczxTaD5cbiAgcmVhZG9ubHkgYWZ0ZXI/OiBLZXJuZWxDb250cmFjdFJ1bk9wdGlvbnM8U2g+XG4gIHJlYWRvbmx5IGRpYWdub3N0aWNzTGV2ZWw/OiBEZWJ1Zy5EaWFnbm9zdGljc0xldmVsXG4gIHJlYWRvbmx5IG1heEV2ZW50cz86IG51bWJlclxufVxuXG5jb25zdCBhc05vbkVtcHR5U3RyaW5nID0gKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID4gMCA/IHZhbHVlIDogdW5kZWZpbmVkXG5cbmNvbnN0IGFzTm9uTmVnSW50ID0gKHZhbHVlOiB1bmtub3duLCBmYWxsYmFjayA9IDApOiBudW1iZXIgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgcmV0dXJuIGZhbGxiYWNrXG4gIGNvbnN0IG4gPSBNYXRoLmZsb29yKHZhbHVlKVxuICByZXR1cm4gbiA+PSAwID8gbiA6IGZhbGxiYWNrXG59XG5cbmNvbnN0IGlzUmVjb3JkID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcblxuY29uc3QgbWFrZVRyYWNlRWZmZWN0T3BPYnNlcnZlciA9ICgpOiBNaWRkbGV3YXJlID0+IHtcbiAgcmV0dXJuIDxBLCBFLCBSPihvcDogaW1wb3J0KCcuLi9lZmZlY3Qtb3AuanMnKS5FZmZlY3RPcDxBLCBFLCBSPik6IEVmZmVjdC5FZmZlY3Q8QSwgRSwgUj4gPT5cbiAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAvLyBPYnNlcnZhdGlvbi1vbmx5IGNhcGFiaWxpdHk6IGNhbiBiZSBsb2NhbGx5IGRpc2FibGVkIGJ5IHBvbGljeS5cbiAgICAgIGlmICgob3AubWV0YSBhcyBhbnkpPy5wb2xpY3k/LmRpc2FibGVPYnNlcnZlcnMpIHtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiBvcC5lZmZlY3RcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0YTogYW55ID0gb3AubWV0YSA/PyB7fVxuICAgICAgY29uc3Qgc2xpbU9wID0ge1xuICAgICAgICBpZDogb3AuaWQsXG4gICAgICAgIGtpbmQ6IG9wLmtpbmQsXG4gICAgICAgIG5hbWU6IG9wLm5hbWUsXG4gICAgICAgIHBheWxvYWQ6IG9wLnBheWxvYWQsXG4gICAgICAgIG1ldGE6IG9wLm1ldGEsXG4gICAgICB9XG5cbiAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICB0eXBlOiAndHJhY2U6ZWZmZWN0b3AnLFxuICAgICAgICBtb2R1bGVJZDogdHlwZW9mIG1ldGEubW9kdWxlSWQgPT09ICdzdHJpbmcnID8gbWV0YS5tb2R1bGVJZCA6IHVuZGVmaW5lZCxcbiAgICAgICAgaW5zdGFuY2VJZDogdHlwZW9mIG1ldGEuaW5zdGFuY2VJZCA9PT0gJ3N0cmluZycgPyBtZXRhLmluc3RhbmNlSWQgOiB1bmRlZmluZWQsXG4gICAgICAgIHJ1bnRpbWVMYWJlbDogdHlwZW9mIG1ldGEucnVudGltZUxhYmVsID09PSAnc3RyaW5nJyA/IG1ldGEucnVudGltZUxhYmVsIDogdW5kZWZpbmVkLFxuICAgICAgICB0eG5TZXE6IHR5cGVvZiBtZXRhLnR4blNlcSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKG1ldGEudHhuU2VxKSA/IE1hdGguZmxvb3IobWV0YS50eG5TZXEpIDogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhOiBzbGltT3AsXG4gICAgICB9IGFzIGFueSlcblxuICAgICAgcmV0dXJuIHlpZWxkKiBvcC5lZmZlY3RcbiAgICB9KVxufVxuXG5jb25zdCBleHRyYWN0UnVudGltZVN1bW1hcnkgPSAoXG4gIGV2aWRlbmNlOiBFdmlkZW5jZVBhY2thZ2UsXG4pOiB7XG4gIHJlYWRvbmx5IGtlcm5lbEltcGxlbWVudGF0aW9uUmVmOiBLZXJuZWxSZWYuS2VybmVsSW1wbGVtZW50YXRpb25SZWZcbiAgcmVhZG9ubHkgcnVudGltZVNlcnZpY2VzRXZpZGVuY2U/OiBKc29uVmFsdWVcbn0gPT4ge1xuICBjb25zdCBzdW1tYXJ5OiBhbnkgPSBldmlkZW5jZS5zdW1tYXJ5XG4gIGNvbnN0IHJ1bnRpbWU6IGFueSA9IHN1bW1hcnk/LnJ1bnRpbWVcbiAgY29uc3Qga2VybmVsSW1wbGVtZW50YXRpb25SZWZSYXcgPSBydW50aW1lPy5rZXJuZWxJbXBsZW1lbnRhdGlvblJlZlxuICBjb25zdCBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZiA9IEtlcm5lbFJlZi5ub3JtYWxpemVLZXJuZWxJbXBsZW1lbnRhdGlvblJlZihrZXJuZWxJbXBsZW1lbnRhdGlvblJlZlJhdylcbiAgY29uc3Qgc2VydmljZXMgPSBydW50aW1lPy5zZXJ2aWNlcyBhcyBKc29uVmFsdWUgfCB1bmRlZmluZWRcbiAgcmV0dXJuIHtcbiAgICBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZixcbiAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZTogc2VydmljZXMsXG4gIH1cbn1cblxuY29uc3QgY2Fub25pY2FsaXplT3BNZXRhID0gKG9wTWV0YVJhdzogdW5rbm93bik6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNSZWNvcmQob3BNZXRhUmF3KSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiA9IHt9XG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG9wTWV0YVJhdykpIHtcbiAgICAvLyB2b2xhdGlsZSAvIG5vbi1jb250cmFjdCBhbmNob3JzXG4gICAgaWYgKGsgPT09ICdpbnN0YW5jZUlkJyB8fCBrID09PSAndHhuSWQnIHx8IGsgPT09ICdydW50aW1lTGFiZWwnIHx8IGsgPT09ICdsaW5rSWQnKSBjb250aW51ZVxuXG4gICAgaWYgKChrID09PSAnZGVwcycgfHwgayA9PT0gJ3RyYWNlJyB8fCBrID09PSAndGFncycpICYmIEFycmF5LmlzQXJyYXkodikgJiYgdi5ldmVyeSgoeCkgPT4gdHlwZW9mIHggPT09ICdzdHJpbmcnKSkge1xuICAgICAgb3V0W2tdID0gKHYgYXMgUmVhZG9ubHlBcnJheTxzdHJpbmc+KS5zbGljZSgpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSkgYXMgdW5rbm93biBhcyBKc29uVmFsdWVcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgb3V0W2tdID0gdiBhcyBKc29uVmFsdWVcbiAgfVxuXG4gIHJldHVybiBvdXQgYXMgSnNvblZhbHVlXG59XG5cbmNvbnN0IGV4dHJhY3RLZXJuZWxDb250cmFjdFRyYWNlT3BzID0gKGV2aWRlbmNlOiBFdmlkZW5jZVBhY2thZ2UpOiBSZWFkb25seUFycmF5PEtlcm5lbENvbnRyYWN0VHJhY2VPcD4gPT4ge1xuICBjb25zdCBpbnN0YW5jZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgbGV0IG5leHRJbnN0YW5jZUluZGV4ID0gMFxuXG4gIGNvbnN0IG1hcEluc3RhbmNlSWQgPSAocmF3OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIGlmIChyYXcgPT09ICd1bmtub3duJykgcmV0dXJuICd1bmtub3duJ1xuICAgIGNvbnN0IGV4aXN0aW5nID0gaW5zdGFuY2VNYXAuZ2V0KHJhdylcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZ1xuICAgIG5leHRJbnN0YW5jZUluZGV4ICs9IDFcbiAgICBjb25zdCBuZXh0ID0gYGkke25leHRJbnN0YW5jZUluZGV4fWBcbiAgICBpbnN0YW5jZU1hcC5zZXQocmF3LCBuZXh0KVxuICAgIHJldHVybiBuZXh0XG4gIH1cblxuICBjb25zdCBvcHM6IEtlcm5lbENvbnRyYWN0VHJhY2VPcFtdID0gW11cblxuICBmb3IgKGNvbnN0IGUgb2YgZXZpZGVuY2UuZXZlbnRzKSB7XG4gICAgaWYgKGUudHlwZSAhPT0gJ2RlYnVnOmV2ZW50JykgY29udGludWVcbiAgICBjb25zdCBwYXlsb2FkOiBhbnkgPSBlLnBheWxvYWRcbiAgICBpZiAoIWlzUmVjb3JkKHBheWxvYWQpKSBjb250aW51ZVxuXG4gICAgY29uc3QgbWV0YTogYW55ID0gcGF5bG9hZC5tZXRhXG4gICAgY29uc3Qgb3BNZXRhOiBhbnkgPSBtZXRhPy5tZXRhXG4gICAgY29uc3Qgb3BTZXEgPSBhc05vbk5lZ0ludChvcE1ldGE/Lm9wU2VxLCAtMSlcbiAgICBpZiAob3BTZXEgPCAwKSBjb250aW51ZVxuXG4gICAgY29uc3QgaW5zdGFuY2VJZFJhdyA9IGFzTm9uRW1wdHlTdHJpbmcocGF5bG9hZC5pbnN0YW5jZUlkKSA/PyAndW5rbm93bidcbiAgICBjb25zdCBpbnN0YW5jZUlkID0gbWFwSW5zdGFuY2VJZChpbnN0YW5jZUlkUmF3KVxuICAgIGNvbnN0IHR4blNlcSA9IGFzTm9uTmVnSW50KHBheWxvYWQudHhuU2VxLCAwKVxuXG4gICAgY29uc3QgbW9kdWxlSWQgPSBhc05vbkVtcHR5U3RyaW5nKHBheWxvYWQubW9kdWxlSWQpID8/ICd1bmtub3duJ1xuICAgIGNvbnN0IGtpbmQgPSBhc05vbkVtcHR5U3RyaW5nKG1ldGE/LmtpbmQpID8/IGFzTm9uRW1wdHlTdHJpbmcocGF5bG9hZC5raW5kKSA/PyAndW5rbm93bidcbiAgICBjb25zdCBuYW1lID0gYXNOb25FbXB0eVN0cmluZyhtZXRhPy5uYW1lKSA/PyBhc05vbkVtcHR5U3RyaW5nKHBheWxvYWQubGFiZWwpID8/ICdlZmZlY3RvcCdcblxuICAgIG9wcy5wdXNoKHtcbiAgICAgIGFuY2hvcjogeyBpbnN0YW5jZUlkLCB0eG5TZXEsIG9wU2VxIH0sXG4gICAgICBtb2R1bGVJZCxcbiAgICAgIGtpbmQsXG4gICAgICBuYW1lLFxuICAgICAgbWV0YTogY2Fub25pY2FsaXplT3BNZXRhKG9wTWV0YSksXG4gICAgfSlcbiAgfVxuXG4gIG9wcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKGEuYW5jaG9yLmluc3RhbmNlSWQgIT09IGIuYW5jaG9yLmluc3RhbmNlSWQpIHJldHVybiBhLmFuY2hvci5pbnN0YW5jZUlkLmxvY2FsZUNvbXBhcmUoYi5hbmNob3IuaW5zdGFuY2VJZClcbiAgICBpZiAoYS5hbmNob3IudHhuU2VxICE9PSBiLmFuY2hvci50eG5TZXEpIHJldHVybiBhLmFuY2hvci50eG5TZXEgLSBiLmFuY2hvci50eG5TZXFcbiAgICByZXR1cm4gYS5hbmNob3Iub3BTZXEgLSBiLmFuY2hvci5vcFNlcVxuICB9KVxuXG4gIHJldHVybiBvcHNcbn1cblxuY29uc3QgYW5jaG9yS2V5ID0gKGE6IEtlcm5lbENvbnRyYWN0QW5jaG9yKTogc3RyaW5nID0+IGAke2EuaW5zdGFuY2VJZH06OnQke2EudHhuU2VxfTo6byR7YS5vcFNlcX1gXG5cbmNvbnN0IGRpZmZLZXJuZWxDb250cmFjdFRyYWNlT3BzID0gKFxuICBiZWZvcmU6IFJlYWRvbmx5QXJyYXk8S2VybmVsQ29udHJhY3RUcmFjZU9wPixcbiAgYWZ0ZXI6IFJlYWRvbmx5QXJyYXk8S2VybmVsQ29udHJhY3RUcmFjZU9wPixcbik6IHtcbiAgcmVhZG9ubHkgY2hhbmdlczogUmVhZG9ubHlBcnJheTxLZXJuZWxDb250cmFjdERpZmZDaGFuZ2U+XG4gIHJlYWRvbmx5IHN1bW1hcnk6IEtlcm5lbENvbnRyYWN0VmVyaWZpY2F0aW9uUmVzdWx0WydzdW1tYXJ5J11cbn0gPT4ge1xuICBjb25zdCBjaGFuZ2VzOiBLZXJuZWxDb250cmFjdERpZmZDaGFuZ2VbXSA9IFtdXG5cbiAgY29uc3QgYmVmb3JlQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgS2VybmVsQ29udHJhY3RUcmFjZU9wPigpXG4gIGNvbnN0IGFmdGVyQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgS2VybmVsQ29udHJhY3RUcmFjZU9wPigpXG5cbiAgZm9yIChjb25zdCBvcCBvZiBiZWZvcmUpIHtcbiAgICBiZWZvcmVCeUtleS5zZXQoYW5jaG9yS2V5KG9wLmFuY2hvciksIG9wKVxuICB9XG4gIGZvciAoY29uc3Qgb3Agb2YgYWZ0ZXIpIHtcbiAgICBhZnRlckJ5S2V5LnNldChhbmNob3JLZXkob3AuYW5jaG9yKSwgb3ApXG4gIH1cblxuICBjb25zdCBhbGxLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5iZWZvcmVCeUtleS5rZXlzKCksIC4uLmFmdGVyQnlLZXkua2V5cygpXSkpLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSlcblxuICBmb3IgKGNvbnN0IGtleSBvZiBhbGxLZXlzKSB7XG4gICAgY29uc3QgYiA9IGJlZm9yZUJ5S2V5LmdldChrZXkpXG4gICAgY29uc3QgYSA9IGFmdGVyQnlLZXkuZ2V0KGtleSlcblxuICAgIGlmICghYiAmJiBhKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBjb2RlOiAnb3AuYWRkZWQnLFxuICAgICAgICBhbmNob3I6IGEuYW5jaG9yLFxuICAgICAgICBhZnRlcjogYSBhcyB1bmtub3duIGFzIEpzb25WYWx1ZSxcbiAgICAgIH0pXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoYiAmJiAhYSkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgY29kZTogJ29wLnJlbW92ZWQnLFxuICAgICAgICBhbmNob3I6IGIuYW5jaG9yLFxuICAgICAgICBiZWZvcmU6IGIgYXMgdW5rbm93biBhcyBKc29uVmFsdWUsXG4gICAgICB9KVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKCFiIHx8ICFhKSBjb250aW51ZVxuXG4gICAgY29uc3QgYkpzb24gPSBzdGFibGVTdHJpbmdpZnkoYilcbiAgICBjb25zdCBhSnNvbiA9IHN0YWJsZVN0cmluZ2lmeShhKVxuICAgIGlmIChiSnNvbiAhPT0gYUpzb24pIHtcbiAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgIGNvZGU6ICdvcC5jaGFuZ2VkJyxcbiAgICAgICAgYW5jaG9yOiBiLmFuY2hvcixcbiAgICAgICAgYmVmb3JlOiBiIGFzIHVua25vd24gYXMgSnNvblZhbHVlLFxuICAgICAgICBhZnRlcjogYSBhcyB1bmtub3duIGFzIEpzb25WYWx1ZSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3VtbWFyeSA9IHtcbiAgICBhZGRlZDogY2hhbmdlcy5maWx0ZXIoKGMpID0+IGMuY29kZSA9PT0gJ29wLmFkZGVkJykubGVuZ3RoLFxuICAgIHJlbW92ZWQ6IGNoYW5nZXMuZmlsdGVyKChjKSA9PiBjLmNvZGUgPT09ICdvcC5yZW1vdmVkJykubGVuZ3RoLFxuICAgIGNoYW5nZWQ6IGNoYW5nZXMuZmlsdGVyKChjKSA9PiBjLmNvZGUgPT09ICdvcC5jaGFuZ2VkJykubGVuZ3RoLFxuICB9IGFzIGNvbnN0IHNhdGlzZmllcyBLZXJuZWxDb250cmFjdFZlcmlmaWNhdGlvblJlc3VsdFsnc3VtbWFyeSddXG5cbiAgcmV0dXJuIHsgY2hhbmdlcywgc3VtbWFyeSB9XG59XG5cbmNvbnN0IFZFUlNJT04gPSAndjEnXG5cbmNvbnN0IHJ1bk9uY2UgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZT4oXG4gIHJvb3RJbXBsOiBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4sXG4gIHJ1bjogS2VybmVsQ29udHJhY3RSdW5PcHRpb25zPFNoPiB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogUGljazxWZXJpZnlLZXJuZWxDb250cmFjdE9wdGlvbnM8U2g+LCAnZGlhZ25vc3RpY3NMZXZlbCcgfCAnbWF4RXZlbnRzJz4sXG4pOiBFZmZlY3QuRWZmZWN0PFxuICB7XG4gICAgcmVhZG9ubHkgc3VtbWFyeTogS2VybmVsQ29udHJhY3RSdW5TdW1tYXJ5XG4gICAgcmVhZG9ubHkgdHJhY2VPcHM6IFJlYWRvbmx5QXJyYXk8S2VybmVsQ29udHJhY3RUcmFjZU9wPlxuICB9LFxuICBuZXZlcixcbiAgYW55XG4+ID0+XG4gIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICBjb25zdCBpbnRlcmFjdGlvbiA9IHJ1bj8uaW50ZXJhY3Rpb25cbiAgICBjb25zdCBwcm9ncmFtID0gRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgY3R4ID0geWllbGQqIHJvb3RJbXBsLmxheWVyLnBpcGUoTGF5ZXIuYnVpbGQpXG4gICAgICBjb25zdCBydW50aW1lID0gQ29udGV4dC5nZXQoY3R4LCByb290SW1wbC5tb2R1bGUpXG4gICAgICBpZiAoaW50ZXJhY3Rpb24pIHtcbiAgICAgICAgeWllbGQqIGludGVyYWN0aW9uKHJ1bnRpbWUpXG4gICAgICB9XG4gICAgICByZXR1cm4gcnVudGltZS5pbnN0YW5jZUlkXG4gICAgfSkgYXMgRWZmZWN0LkVmZmVjdDxzdHJpbmcsIGFueSwgYW55PlxuXG4gICAgY29uc3QgdHJhY2VMYXllciA9IExheWVyLnN1Y2NlZWQoRWZmZWN0T3BDb3JlLkVmZmVjdE9wTWlkZGxld2FyZVRhZywge1xuICAgICAgc3RhY2s6IFttYWtlVHJhY2VFZmZlY3RPcE9ic2VydmVyKCldLFxuICAgIH0pIGFzIHVua25vd24gYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+XG5cbiAgICBjb25zdCBleHRyYUxheWVyID0gcnVuPy5sYXllciA/IChMYXllci5tZXJnZUFsbCh0cmFjZUxheWVyLCBydW4ubGF5ZXIpIGFzIExheWVyLkxheWVyPGFueSwgYW55LCBhbnk+KSA6IHRyYWNlTGF5ZXJcblxuICAgIGNvbnN0IHJlc3VsdCA9IHlpZWxkKiB0cmlhbFJ1bihwcm9ncmFtIGFzIGFueSwge1xuICAgICAgcnVuSWQ6IHJ1bj8ucnVuSWQsXG4gICAgICBkaWFnbm9zdGljc0xldmVsOiBvcHRpb25zLmRpYWdub3N0aWNzTGV2ZWwgPz8gJ2xpZ2h0JyxcbiAgICAgIG1heEV2ZW50czogb3B0aW9ucy5tYXhFdmVudHMsXG4gICAgICBsYXllcjogZXh0cmFMYXllcixcbiAgICAgIHJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzOiBydW4/LnJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzLFxuICAgIH0pXG5cbiAgICBjb25zdCBvayA9IEV4aXQuaXNTdWNjZXNzKHJlc3VsdC5leGl0KVxuICAgIGNvbnN0IGVycm9yID1cbiAgICAgIEV4aXQuaXNGYWlsdXJlKHJlc3VsdC5leGl0KSAmJiByZXN1bHQuZXhpdC5jYXVzZSAhPSBudWxsXG4gICAgICAgID8gKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZhaWx1cmUgPSBFeGl0LmlzRmFpbHVyZShyZXN1bHQuZXhpdCkgPyByZXN1bHQuZXhpdC5jYXVzZSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgY29uc3QgZXJyID0gKGZhaWx1cmUgYXMgYW55KT8uX3RhZyA9PT0gJ0RpZScgPyAoZmFpbHVyZSBhcyBhbnkpLmRlZmVjdCA6IChmYWlsdXJlIGFzIGFueSlcbiAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4geyBuYW1lOiBlcnIubmFtZSwgbWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogJ1Vua25vd25FcnJvcicsIG1lc3NhZ2U6IFN0cmluZyhlcnIgPz8gJ3Vua25vd24nKSB9XG4gICAgICAgICAgfSkoKVxuICAgICAgICA6IHVuZGVmaW5lZFxuXG4gICAgY29uc3QgcnVudGltZVN1bW1hcnkgPSBleHRyYWN0UnVudGltZVN1bW1hcnkocmVzdWx0LmV2aWRlbmNlKVxuICAgIGNvbnN0IHRyYWNlT3BzID0gZXh0cmFjdEtlcm5lbENvbnRyYWN0VHJhY2VPcHMocmVzdWx0LmV2aWRlbmNlKVxuICAgIGNvbnN0IHRyYWNlRGlnZXN0ID0gZm52MWEzMihzdGFibGVTdHJpbmdpZnkodHJhY2VPcHMpKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgb2ssXG4gICAgICAgIGtlcm5lbEltcGxlbWVudGF0aW9uUmVmOiBydW50aW1lU3VtbWFyeS5rZXJuZWxJbXBsZW1lbnRhdGlvblJlZixcbiAgICAgICAgcnVudGltZVNlcnZpY2VzRXZpZGVuY2U6IHJ1bnRpbWVTdW1tYXJ5LnJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlLFxuICAgICAgICB0cmFjZTogeyBkaWdlc3Q6IHRyYWNlRGlnZXN0LCBvcENvdW50OiB0cmFjZU9wcy5sZW5ndGggfSxcbiAgICAgICAgLi4uKGVycm9yID8geyBlcnJvciB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIHRyYWNlT3BzLFxuICAgIH1cbiAgfSlcblxuZXhwb3J0IGNvbnN0IHZlcmlmeUtlcm5lbENvbnRyYWN0ID0gPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGU+KFxuICByb290OiBSb290TGlrZTxTaD4sXG4gIG9wdGlvbnM/OiBWZXJpZnlLZXJuZWxDb250cmFjdE9wdGlvbnM8U2g+LFxuKTogRWZmZWN0LkVmZmVjdDxLZXJuZWxDb250cmFjdFZlcmlmaWNhdGlvblJlc3VsdCwgbmV2ZXIsIGFueT4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHJvb3RJbXBsID0gcmVzb2x2ZVJvb3RJbXBsKHJvb3QpXG5cbiAgICBjb25zdCBiZWZvcmVSdW4gPSB5aWVsZCogcnVuT25jZShyb290SW1wbCwgb3B0aW9ucz8uYmVmb3JlLCB7XG4gICAgICBkaWFnbm9zdGljc0xldmVsOiBvcHRpb25zPy5kaWFnbm9zdGljc0xldmVsLFxuICAgICAgbWF4RXZlbnRzOiBvcHRpb25zPy5tYXhFdmVudHMsXG4gICAgfSlcblxuICAgIGNvbnN0IGFmdGVyUnVuID0geWllbGQqIHJ1bk9uY2Uocm9vdEltcGwsIG9wdGlvbnM/LmFmdGVyLCB7XG4gICAgICBkaWFnbm9zdGljc0xldmVsOiBvcHRpb25zPy5kaWFnbm9zdGljc0xldmVsLFxuICAgICAgbWF4RXZlbnRzOiBvcHRpb25zPy5tYXhFdmVudHMsXG4gICAgfSlcblxuICAgIGNvbnN0IGhhc1J1bkZhaWx1cmUgPSAhYmVmb3JlUnVuLnN1bW1hcnkub2sgfHwgIWFmdGVyUnVuLnN1bW1hcnkub2tcbiAgICBjb25zdCBkaWZmID0gaGFzUnVuRmFpbHVyZVxuICAgICAgPyB7IGNoYW5nZXM6IFt7IGNvZGU6ICdydW4uZmFpbHVyZScgYXMgY29uc3QgfV0sIHN1bW1hcnk6IHsgYWRkZWQ6IDAsIHJlbW92ZWQ6IDAsIGNoYW5nZWQ6IDAgfSB9XG4gICAgICA6IGRpZmZLZXJuZWxDb250cmFjdFRyYWNlT3BzKGJlZm9yZVJ1bi50cmFjZU9wcywgYWZ0ZXJSdW4udHJhY2VPcHMpXG5cbiAgICBjb25zdCB2ZXJkaWN0OiBLZXJuZWxDb250cmFjdFZlcmRpY3QgPSBoYXNSdW5GYWlsdXJlIHx8IGRpZmYuY2hhbmdlcy5sZW5ndGggPiAwID8gJ0ZBSUwnIDogJ1BBU1MnXG5cbiAgICByZXR1cm4ge1xuICAgICAgdmVyc2lvbjogVkVSU0lPTixcbiAgICAgIHZlcmRpY3QsXG4gICAgICBiZWZvcmU6IGJlZm9yZVJ1bi5zdW1tYXJ5LFxuICAgICAgYWZ0ZXI6IGFmdGVyUnVuLnN1bW1hcnksXG4gICAgICBjaGFuZ2VzOiBkaWZmLmNoYW5nZXMsXG4gICAgICBzdW1tYXJ5OiBkaWZmLnN1bW1hcnksXG4gICAgfVxuICB9KVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxTQUFTLFdBQUFBLFVBQVMsVUFBQUMsU0FBUSxRQUFBQyxPQUFNLFNBQUFDLGNBQWE7OztBQzhDN0MsSUFBTSxnQkFBc0Q7QUFBQSxFQUMxRCxVQUFVO0FBQUEsRUFDVixPQUFPO0FBQUEsRUFDUCxNQUFNO0FBQ1I7QUFFQSxJQUFNLGFBQWEsQ0FBQyxVQUF3RDtBQUMxRSxRQUFNLE1BQU0sTUFBTSxLQUFLLElBQUksSUFBSSxNQUFNLE9BQU8sQ0FBQyxNQUFNLE9BQU8sTUFBTSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUMxRixNQUFJLEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztBQUNyQyxTQUFPO0FBQ1Q7QUFFQSxJQUFNLGlCQUFpQixDQUNyQixRQUNBLFVBQ3VGO0FBQ3ZGLFFBQU0sWUFBWSxJQUFJLElBQUksV0FBVyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQ2xELFFBQU0sV0FBVyxJQUFJLElBQUksV0FBVyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBRWhELFFBQU0sVUFBb0IsQ0FBQztBQUMzQixhQUFXLEtBQUssV0FBVztBQUN6QixRQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsRUFBRyxTQUFRLEtBQUssQ0FBQztBQUFBLEVBQ3RDO0FBQ0EsVUFBUSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFFekMsUUFBTSxRQUFrQixDQUFDO0FBQ3pCLGFBQVcsS0FBSyxVQUFVO0FBQ3hCLFFBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxFQUFHLE9BQU0sS0FBSyxDQUFDO0FBQUEsRUFDckM7QUFDQSxRQUFNLEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQztBQUV2QyxTQUFPLEVBQUUsU0FBUyxNQUFNO0FBQzFCO0FBRUEsSUFBTSxjQUFjLENBQUMsR0FBWSxNQUF3QixnQkFBZ0IsQ0FBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWpHLElBQU0sa0JBQWtCLENBQ3RCLFVBQ2lEO0FBQ2pELFFBQU0sTUFBTSxvQkFBSSxJQUFxQztBQUNyRCxhQUFXLFFBQVEsU0FBUyxDQUFDLEdBQUc7QUFDOUIsUUFBSSxDQUFDLFFBQVEsT0FBTyxTQUFTLFNBQVU7QUFDdkMsVUFBTSxLQUFNLEtBQWE7QUFDekIsUUFBSSxPQUFPLE9BQU8sWUFBWSxHQUFHLFdBQVcsRUFBRztBQUMvQyxRQUFJLElBQUksSUFBSSxJQUFJO0FBQUEsRUFDbEI7QUFDQSxTQUFPO0FBQ1Q7QUFFTyxJQUFNLGVBQWUsQ0FDMUIsUUFDQSxPQUNBLFlBQ3VCO0FBQ3ZCLFFBQU0sVUFBc0MsQ0FBQztBQUc3QyxNQUFJLE9BQU8sYUFBYSxNQUFNLFVBQVU7QUFDdEMsWUFBUSxLQUFLO0FBQUEsTUFDWCxVQUFVO0FBQUEsTUFDVixNQUFNO0FBQUEsTUFDTixTQUFTLHFCQUFxQixPQUFPLFFBQVEsT0FBTyxNQUFNLFFBQVE7QUFBQSxNQUNsRSxTQUFTO0FBQUEsTUFDVCxTQUFTO0FBQUEsUUFDUCxRQUFRLE9BQU87QUFBQSxRQUNmLE9BQU8sTUFBTTtBQUFBLE1BQ2Y7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBRUEsTUFBSSxPQUFPLG9CQUFvQixNQUFNLGlCQUFpQjtBQUNwRCxZQUFRLEtBQUs7QUFBQSxNQUNYLFVBQVU7QUFBQSxNQUNWLE1BQU07QUFBQSxNQUNOLFNBQVMsNEJBQTRCLE9BQU8sZUFBZSxPQUFPLE1BQU0sZUFBZTtBQUFBLE1BQ3ZGLFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxRQUNQLFFBQVEsT0FBTztBQUFBLFFBQ2YsT0FBTyxNQUFNO0FBQUEsTUFDZjtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFHQTtBQUNFLFVBQU0sRUFBRSxTQUFTLE1BQU0sSUFBSSxlQUFlLE9BQU8sWUFBWSxNQUFNLFVBQVU7QUFDN0UsUUFBSSxRQUFRLFNBQVMsS0FBSyxNQUFNLFNBQVMsR0FBRztBQUMxQyxjQUFRLEtBQUs7QUFBQSxRQUNYLFVBQVUsUUFBUSxTQUFTLElBQUksYUFBYTtBQUFBLFFBQzVDLE1BQU07QUFBQSxRQUNOLFNBQ0UsUUFBUSxTQUFTLElBQUksdUJBQXVCLFFBQVEsS0FBSyxJQUFJLENBQUMsS0FBSyxxQkFBcUIsTUFBTSxLQUFLLElBQUksQ0FBQztBQUFBLFFBQzFHLFNBQVM7QUFBQSxRQUNULFNBQVMsRUFBRSxTQUFTLE1BQU07QUFBQSxNQUM1QixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFHQTtBQUNFLFVBQU0sRUFBRSxTQUFTLE1BQU0sSUFBSSxlQUFlLE9BQU8sWUFBWSxNQUFNLFVBQVU7QUFDN0UsUUFBSSxRQUFRLFNBQVMsS0FBSyxNQUFNLFNBQVMsR0FBRztBQUMxQyxjQUFRLEtBQUs7QUFBQSxRQUNYLFVBQVUsUUFBUSxTQUFTLElBQUksYUFBYTtBQUFBLFFBQzVDLE1BQU07QUFBQSxRQUNOLFNBQ0UsUUFBUSxTQUFTLElBQUksdUJBQXVCLFFBQVEsS0FBSyxJQUFJLENBQUMsS0FBSyxxQkFBcUIsTUFBTSxLQUFLLElBQUksQ0FBQztBQUFBLFFBQzFHLFNBQVM7QUFBQSxRQUNULFNBQVMsRUFBRSxTQUFTLE1BQU07QUFBQSxNQUM1QixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFHQTtBQUNFLFVBQU0sYUFBYSxnQkFBZ0IsT0FBTyxVQUFVO0FBQ3BELFVBQU0sWUFBWSxnQkFBZ0IsTUFBTSxVQUFVO0FBRWxELFVBQU0sVUFBb0IsQ0FBQztBQUMzQixVQUFNLFFBQWtCLENBQUM7QUFDekIsVUFBTSxjQUErRixDQUFDO0FBQ3RHLFVBQU0sZUFBdUYsQ0FBQztBQUU5RixlQUFXLE1BQU0sV0FBVyxLQUFLLEdBQUc7QUFDbEMsVUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQUcsU0FBUSxLQUFLLEVBQUU7QUFBQSxJQUN6QztBQUNBLGVBQVcsTUFBTSxVQUFVLEtBQUssR0FBRztBQUNqQyxVQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsRUFBRyxPQUFNLEtBQUssRUFBRTtBQUFBLElBQ3hDO0FBRUEsWUFBUSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDekMsVUFBTSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFFdkMsZUFBVyxNQUFNLFdBQVcsS0FBSyxHQUFHO0FBQ2xDLFlBQU0sSUFBSSxXQUFXLElBQUksRUFBRTtBQUMzQixZQUFNLElBQUksVUFBVSxJQUFJLEVBQUU7QUFDMUIsVUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFHO0FBRWQsWUFBTSxTQUFtQixDQUFDO0FBQzFCLFVBQUksRUFBRSxTQUFTLEVBQUUsTUFBTTtBQUNyQixvQkFBWSxLQUFLLEVBQUUsSUFBSSxRQUFRLEVBQUUsTUFBTSxPQUFPLEVBQUUsS0FBSyxDQUFDO0FBQ3REO0FBQUEsTUFDRjtBQUNBLFVBQUksRUFBRSxTQUFTLEVBQUUsS0FBTSxRQUFPLEtBQUssTUFBTTtBQUN6QyxVQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVMsUUFBTyxLQUFLLFNBQVM7QUFDbEQsVUFBSSxPQUFPLFNBQVMsRUFBRyxjQUFhLEtBQUssRUFBRSxJQUFJLE9BQU8sQ0FBQztBQUFBLElBQ3pEO0FBRUEsZ0JBQVksS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLEdBQUcsY0FBYyxFQUFFLEVBQUUsQ0FBQztBQUNuRCxpQkFBYSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsR0FBRyxjQUFjLEVBQUUsRUFBRSxDQUFDO0FBRXBELFFBQUksUUFBUSxTQUFTLEdBQUc7QUFDdEIsY0FBUSxLQUFLO0FBQUEsUUFDWCxVQUFVO0FBQUEsUUFDVixNQUFNO0FBQUEsUUFDTixTQUFTLHVCQUF1QixRQUFRLEtBQUssSUFBSSxDQUFDO0FBQUEsUUFDbEQsU0FBUztBQUFBLFFBQ1QsU0FBUyxFQUFFLFFBQVE7QUFBQSxNQUNyQixDQUFDO0FBQUEsSUFDSDtBQUVBLFFBQUksWUFBWSxTQUFTLEdBQUc7QUFDMUIsY0FBUSxLQUFLO0FBQUEsUUFDWCxVQUFVO0FBQUEsUUFDVixNQUFNO0FBQUEsUUFDTixTQUFTLDRCQUE0QixZQUFZLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDO0FBQUEsUUFDNUUsU0FBUztBQUFBLFFBQ1QsU0FBUyxFQUFFLFlBQVk7QUFBQSxNQUN6QixDQUFDO0FBQUEsSUFDSDtBQUVBLFFBQUksTUFBTSxTQUFTLEdBQUc7QUFDcEIsY0FBUSxLQUFLO0FBQUEsUUFDWCxVQUFVO0FBQUEsUUFDVixNQUFNO0FBQUEsUUFDTixTQUFTLHFCQUFxQixNQUFNLEtBQUssSUFBSSxDQUFDO0FBQUEsUUFDOUMsU0FBUztBQUFBLFFBQ1QsU0FBUyxFQUFFLE1BQU07QUFBQSxNQUNuQixDQUFDO0FBQUEsSUFDSDtBQUVBLFFBQUksYUFBYSxTQUFTLEdBQUc7QUFDM0IsY0FBUSxLQUFLO0FBQUEsUUFDWCxVQUFVO0FBQUEsUUFDVixNQUFNO0FBQUEsUUFDTixTQUFTLHVCQUF1QixhQUFhLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDO0FBQUEsUUFDeEUsU0FBUztBQUFBLFFBQ1QsU0FBUyxFQUFFLFNBQVMsYUFBYTtBQUFBLE1BQ25DLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUdBO0FBQ0UsVUFBTSxlQUFlLE9BQU8sVUFBVTtBQUN0QyxVQUFNLGNBQWMsTUFBTSxVQUFVO0FBQ3BDLFFBQUksaUJBQWlCLGFBQWE7QUFDaEMsY0FBUSxLQUFLO0FBQUEsUUFDWCxVQUFVO0FBQUEsUUFDVixNQUFNO0FBQUEsUUFDTixTQUFTO0FBQUEsUUFDVCxTQUFTO0FBQUEsUUFDVCxTQUFTO0FBQUEsVUFDUCxRQUFRLGdCQUFnQjtBQUFBLFVBQ3hCLE9BQU8sZUFBZTtBQUFBLFFBQ3hCO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFHQTtBQUNFLFVBQU0sYUFBYSxPQUFPLFFBQVEsQ0FBQztBQUNuQyxVQUFNLFlBQVksTUFBTSxRQUFRLENBQUM7QUFFakMsVUFBTSxZQUFZLFNBQVM7QUFDM0IsVUFBTSxPQUNKLGFBQWEsT0FBTyxXQUFXLFNBQVMsSUFBSSxXQUFXLENBQUMsR0FBRyxPQUFPLEtBQUssVUFBVSxHQUFHLEdBQUcsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDO0FBRWhILFVBQU0sVUFJRCxDQUFDO0FBRU4sZUFBVyxPQUFPLE1BQU07QUFDdEIsWUFBTSxJQUFJLE9BQU8sYUFBYyxXQUFtQixHQUFHLElBQUk7QUFDekQsWUFBTSxJQUFJLE9BQU8sWUFBYSxVQUFrQixHQUFHLElBQUk7QUFDdkQsVUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUc7QUFDdEIsZ0JBQVEsS0FBSztBQUFBLFVBQ1g7QUFBQSxVQUNBLFFBQVMsS0FBSztBQUFBLFVBQ2QsT0FBUSxLQUFLO0FBQUEsUUFDZixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFFQSxRQUFJLFFBQVEsU0FBUyxHQUFHO0FBQ3RCLGNBQVEsS0FBSztBQUFBLFFBQ1gsVUFBVTtBQUFBLFFBQ1YsTUFBTTtBQUFBLFFBQ04sU0FBUztBQUFBLFFBQ1QsU0FBUztBQUFBLFFBQ1QsU0FBUztBQUFBLFVBQ1AsTUFBTSxRQUFRLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRztBQUFBLFVBQzlCO0FBQUEsUUFDRjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBR0E7QUFDRSxVQUFNLElBQUksT0FBTztBQUNqQixVQUFNLElBQUksTUFBTTtBQUNoQixRQUFJLENBQUMsWUFBWSxLQUFLLE1BQU0sS0FBSyxJQUFJLEdBQUc7QUFDdEMsY0FBUSxLQUFLO0FBQUEsUUFDWCxVQUFVO0FBQUEsUUFDVixNQUFNO0FBQUEsUUFDTixTQUFTO0FBQUEsUUFDVCxTQUFTO0FBQUEsUUFDVCxTQUFTO0FBQUEsVUFDUCxRQUFRLEtBQUs7QUFBQSxVQUNiLE9BQU8sS0FBSztBQUFBLFFBQ2Q7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRjtBQUVBLFVBQVEsS0FBSyxDQUFDLEdBQUcsTUFBTTtBQUNyQixVQUFNLEtBQUssY0FBYyxFQUFFLFFBQVE7QUFDbkMsVUFBTSxLQUFLLGNBQWMsRUFBRSxRQUFRO0FBQ25DLFFBQUksT0FBTyxHQUFJLFFBQU8sS0FBSztBQUMzQixVQUFNLEtBQUssRUFBRSxLQUFLLGNBQWMsRUFBRSxJQUFJO0FBQ3RDLFFBQUksT0FBTyxFQUFHLFFBQU87QUFDckIsVUFBTSxLQUFLLEVBQUUsV0FBVztBQUN4QixVQUFNLEtBQUssRUFBRSxXQUFXO0FBQ3hCLFdBQU8sR0FBRyxjQUFjLEVBQUU7QUFBQSxFQUM1QixDQUFDO0FBRUQsUUFBTSxVQUFxQztBQUFBLElBQ3pDLFVBQVUsUUFBUSxPQUFPLENBQUMsTUFBTSxFQUFFLGFBQWEsVUFBVSxFQUFFO0FBQUEsSUFDM0QsT0FBTyxRQUFRLE9BQU8sQ0FBQyxNQUFNLEVBQUUsYUFBYSxPQUFPLEVBQUU7QUFBQSxJQUNyRCxNQUFNLFFBQVEsT0FBTyxDQUFDLE1BQU0sRUFBRSxhQUFhLE1BQU0sRUFBRTtBQUFBLEVBQ3JEO0FBRUEsUUFBTSxVQUErQixRQUFRLFdBQVcsSUFBSSxTQUFTLFFBQVEsUUFBUSxJQUFJLFNBQVM7QUFFbEcsU0FBTztBQUFBLElBQ0wsU0FBUztBQUFBLElBQ1QsVUFBVSxNQUFNO0FBQUEsSUFDaEIsUUFBUTtBQUFBLE1BQ04sUUFBUSxPQUFPO0FBQUEsTUFDZixpQkFBaUIsT0FBTztBQUFBLElBQzFCO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTCxRQUFRLE1BQU07QUFBQSxNQUNkLGlCQUFpQixNQUFNO0FBQUEsSUFDekI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQ0Y7OztBQzdWQSxTQUFTLFNBQVMsUUFBUSxNQUFNLGFBQWE7QUFpQjdDLElBQU0sa0JBQWtCLENBQTRCLFNBQ2hELE1BQWMsU0FBUyxlQUNwQixPQUNDLE1BQWM7QUFvRXRCLElBQU0sbUJBQW1CLENBQUMsVUFDeEIsT0FBTyxVQUFVLFlBQVksTUFBTSxTQUFTLElBQUksUUFBUTtBQUUxRCxJQUFNLGNBQWMsQ0FBQyxPQUFnQixXQUFXLE1BQWM7QUFDNUQsTUFBSSxPQUFPLFVBQVUsWUFBWSxDQUFDLE9BQU8sU0FBUyxLQUFLLEVBQUcsUUFBTztBQUNqRSxRQUFNLElBQUksS0FBSyxNQUFNLEtBQUs7QUFDMUIsU0FBTyxLQUFLLElBQUksSUFBSTtBQUN0QjtBQUVBLElBQU0sV0FBVyxDQUFDLFVBQ2hCLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBRXJFLElBQU0sNEJBQTRCLE1BQWtCO0FBQ2xELFNBQU8sQ0FBVSxPQUNmLE9BQU8sSUFBSSxhQUFhO0FBRXRCLFFBQUssR0FBRyxNQUFjLFFBQVEsa0JBQWtCO0FBQzlDLGFBQU8sT0FBTyxHQUFHO0FBQUEsSUFDbkI7QUFFQSxVQUFNLE9BQVksR0FBRyxRQUFRLENBQUM7QUFDOUIsVUFBTSxTQUFTO0FBQUEsTUFDYixJQUFJLEdBQUc7QUFBQSxNQUNQLE1BQU0sR0FBRztBQUFBLE1BQ1QsTUFBTSxHQUFHO0FBQUEsTUFDVCxTQUFTLEdBQUc7QUFBQSxNQUNaLE1BQU0sR0FBRztBQUFBLElBQ1g7QUFFQSxXQUFhLE9BQU87QUFBQSxNQUNsQixNQUFNO0FBQUEsTUFDTixVQUFVLE9BQU8sS0FBSyxhQUFhLFdBQVcsS0FBSyxXQUFXO0FBQUEsTUFDOUQsWUFBWSxPQUFPLEtBQUssZUFBZSxXQUFXLEtBQUssYUFBYTtBQUFBLE1BQ3BFLGNBQWMsT0FBTyxLQUFLLGlCQUFpQixXQUFXLEtBQUssZUFBZTtBQUFBLE1BQzFFLFFBQVEsT0FBTyxLQUFLLFdBQVcsWUFBWSxPQUFPLFNBQVMsS0FBSyxNQUFNLElBQUksS0FBSyxNQUFNLEtBQUssTUFBTSxJQUFJO0FBQUEsTUFDcEcsTUFBTTtBQUFBLElBQ1IsQ0FBUTtBQUVSLFdBQU8sT0FBTyxHQUFHO0FBQUEsRUFDbkIsQ0FBQztBQUNMO0FBRUEsSUFBTSx3QkFBd0IsQ0FDNUIsYUFJRztBQUNILFFBQU0sVUFBZSxTQUFTO0FBQzlCLFFBQU0sVUFBZSxTQUFTO0FBQzlCLFFBQU0sNkJBQTZCLFNBQVM7QUFDNUMsUUFBTSwwQkFBb0MsaUNBQWlDLDBCQUEwQjtBQUNyRyxRQUFNLFdBQVcsU0FBUztBQUMxQixTQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0EseUJBQXlCO0FBQUEsRUFDM0I7QUFDRjtBQUVBLElBQU0scUJBQXFCLENBQUMsY0FBOEM7QUFDeEUsTUFBSSxDQUFDLFNBQVMsU0FBUyxFQUFHLFFBQU87QUFFakMsUUFBTSxNQUFpQyxDQUFDO0FBQ3hDLGFBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxPQUFPLFFBQVEsU0FBUyxHQUFHO0FBRTlDLFFBQUksTUFBTSxnQkFBZ0IsTUFBTSxXQUFXLE1BQU0sa0JBQWtCLE1BQU0sU0FBVTtBQUVuRixTQUFLLE1BQU0sVUFBVSxNQUFNLFdBQVcsTUFBTSxXQUFXLE1BQU0sUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxPQUFPLE1BQU0sUUFBUSxHQUFHO0FBQ2hILFVBQUksQ0FBQyxJQUFLLEVBQTRCLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDL0U7QUFBQSxJQUNGO0FBRUEsUUFBSSxDQUFDLElBQUk7QUFBQSxFQUNYO0FBRUEsU0FBTztBQUNUO0FBRUEsSUFBTSxnQ0FBZ0MsQ0FBQyxhQUFvRTtBQUN6RyxRQUFNLGNBQWMsb0JBQUksSUFBb0I7QUFDNUMsTUFBSSxvQkFBb0I7QUFFeEIsUUFBTSxnQkFBZ0IsQ0FBQyxRQUF3QjtBQUM3QyxRQUFJLFFBQVEsVUFBVyxRQUFPO0FBQzlCLFVBQU0sV0FBVyxZQUFZLElBQUksR0FBRztBQUNwQyxRQUFJLFNBQVUsUUFBTztBQUNyQix5QkFBcUI7QUFDckIsVUFBTSxPQUFPLElBQUksaUJBQWlCO0FBQ2xDLGdCQUFZLElBQUksS0FBSyxJQUFJO0FBQ3pCLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxNQUErQixDQUFDO0FBRXRDLGFBQVcsS0FBSyxTQUFTLFFBQVE7QUFDL0IsUUFBSSxFQUFFLFNBQVMsY0FBZTtBQUM5QixVQUFNLFVBQWUsRUFBRTtBQUN2QixRQUFJLENBQUMsU0FBUyxPQUFPLEVBQUc7QUFFeEIsVUFBTSxPQUFZLFFBQVE7QUFDMUIsVUFBTSxTQUFjLE1BQU07QUFDMUIsVUFBTSxRQUFRLFlBQVksUUFBUSxPQUFPLEVBQUU7QUFDM0MsUUFBSSxRQUFRLEVBQUc7QUFFZixVQUFNLGdCQUFnQixpQkFBaUIsUUFBUSxVQUFVLEtBQUs7QUFDOUQsVUFBTSxhQUFhLGNBQWMsYUFBYTtBQUM5QyxVQUFNLFNBQVMsWUFBWSxRQUFRLFFBQVEsQ0FBQztBQUU1QyxVQUFNLFdBQVcsaUJBQWlCLFFBQVEsUUFBUSxLQUFLO0FBQ3ZELFVBQU0sT0FBTyxpQkFBaUIsTUFBTSxJQUFJLEtBQUssaUJBQWlCLFFBQVEsSUFBSSxLQUFLO0FBQy9FLFVBQU0sT0FBTyxpQkFBaUIsTUFBTSxJQUFJLEtBQUssaUJBQWlCLFFBQVEsS0FBSyxLQUFLO0FBRWhGLFFBQUksS0FBSztBQUFBLE1BQ1AsUUFBUSxFQUFFLFlBQVksUUFBUSxNQUFNO0FBQUEsTUFDcEM7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EsTUFBTSxtQkFBbUIsTUFBTTtBQUFBLElBQ2pDLENBQUM7QUFBQSxFQUNIO0FBRUEsTUFBSSxLQUFLLENBQUMsR0FBRyxNQUFNO0FBQ2pCLFFBQUksRUFBRSxPQUFPLGVBQWUsRUFBRSxPQUFPLFdBQVksUUFBTyxFQUFFLE9BQU8sV0FBVyxjQUFjLEVBQUUsT0FBTyxVQUFVO0FBQzdHLFFBQUksRUFBRSxPQUFPLFdBQVcsRUFBRSxPQUFPLE9BQVEsUUFBTyxFQUFFLE9BQU8sU0FBUyxFQUFFLE9BQU87QUFDM0UsV0FBTyxFQUFFLE9BQU8sUUFBUSxFQUFFLE9BQU87QUFBQSxFQUNuQyxDQUFDO0FBRUQsU0FBTztBQUNUO0FBRUEsSUFBTSxZQUFZLENBQUMsTUFBb0MsR0FBRyxFQUFFLFVBQVUsTUFBTSxFQUFFLE1BQU0sTUFBTSxFQUFFLEtBQUs7QUFFakcsSUFBTSw2QkFBNkIsQ0FDakMsUUFDQSxVQUlHO0FBQ0gsUUFBTSxVQUFzQyxDQUFDO0FBRTdDLFFBQU0sY0FBYyxvQkFBSSxJQUFtQztBQUMzRCxRQUFNLGFBQWEsb0JBQUksSUFBbUM7QUFFMUQsYUFBVyxNQUFNLFFBQVE7QUFDdkIsZ0JBQVksSUFBSSxVQUFVLEdBQUcsTUFBTSxHQUFHLEVBQUU7QUFBQSxFQUMxQztBQUNBLGFBQVcsTUFBTSxPQUFPO0FBQ3RCLGVBQVcsSUFBSSxVQUFVLEdBQUcsTUFBTSxHQUFHLEVBQUU7QUFBQSxFQUN6QztBQUVBLFFBQU0sVUFBVSxNQUFNLEtBQUssb0JBQUksSUFBSSxDQUFDLEdBQUcsWUFBWSxLQUFLLEdBQUcsR0FBRyxXQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFFcEgsYUFBVyxPQUFPLFNBQVM7QUFDekIsVUFBTSxJQUFJLFlBQVksSUFBSSxHQUFHO0FBQzdCLFVBQU0sSUFBSSxXQUFXLElBQUksR0FBRztBQUU1QixRQUFJLENBQUMsS0FBSyxHQUFHO0FBQ1gsY0FBUSxLQUFLO0FBQUEsUUFDWCxNQUFNO0FBQUEsUUFDTixRQUFRLEVBQUU7QUFBQSxRQUNWLE9BQU87QUFBQSxNQUNULENBQUM7QUFDRDtBQUFBLElBQ0Y7QUFDQSxRQUFJLEtBQUssQ0FBQyxHQUFHO0FBQ1gsY0FBUSxLQUFLO0FBQUEsUUFDWCxNQUFNO0FBQUEsUUFDTixRQUFRLEVBQUU7QUFBQSxRQUNWLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFDRDtBQUFBLElBQ0Y7QUFDQSxRQUFJLENBQUMsS0FBSyxDQUFDLEVBQUc7QUFFZCxVQUFNLFFBQVEsZ0JBQWdCLENBQUM7QUFDL0IsVUFBTSxRQUFRLGdCQUFnQixDQUFDO0FBQy9CLFFBQUksVUFBVSxPQUFPO0FBQ25CLGNBQVEsS0FBSztBQUFBLFFBQ1gsTUFBTTtBQUFBLFFBQ04sUUFBUSxFQUFFO0FBQUEsUUFDVixRQUFRO0FBQUEsUUFDUixPQUFPO0FBQUEsTUFDVCxDQUFDO0FBQUEsSUFDSDtBQUFBLEVBQ0Y7QUFFQSxRQUFNLFVBQVU7QUFBQSxJQUNkLE9BQU8sUUFBUSxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsVUFBVSxFQUFFO0FBQUEsSUFDcEQsU0FBUyxRQUFRLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUyxZQUFZLEVBQUU7QUFBQSxJQUN4RCxTQUFTLFFBQVEsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLFlBQVksRUFBRTtBQUFBLEVBQzFEO0FBRUEsU0FBTyxFQUFFLFNBQVMsUUFBUTtBQUM1QjtBQUVBLElBQU0sVUFBVTtBQUVoQixJQUFNLFVBQVUsQ0FDZCxVQUNBLEtBQ0EsWUFTQSxPQUFPLElBQUksYUFBYTtBQUN0QixRQUFNLGNBQWMsS0FBSztBQUN6QixRQUFNLFVBQVUsT0FBTyxJQUFJLGFBQWE7QUFDdEMsVUFBTSxNQUFNLE9BQU8sU0FBUyxNQUFNLEtBQUssTUFBTSxLQUFLO0FBQ2xELFVBQU0sVUFBVSxRQUFRLElBQUksS0FBSyxTQUFTLE1BQU07QUFDaEQsUUFBSSxhQUFhO0FBQ2YsYUFBTyxZQUFZLE9BQU87QUFBQSxJQUM1QjtBQUNBLFdBQU8sUUFBUTtBQUFBLEVBQ2pCLENBQUM7QUFFRCxRQUFNLGFBQWEsTUFBTSxRQUFxQix1QkFBdUI7QUFBQSxJQUNuRSxPQUFPLENBQUMsMEJBQTBCLENBQUM7QUFBQSxFQUNyQyxDQUFDO0FBRUQsUUFBTSxhQUFhLEtBQUssUUFBUyxNQUFNLFNBQVMsWUFBWSxJQUFJLEtBQUssSUFBbUM7QUFFeEcsUUFBTSxTQUFTLE9BQU8sU0FBUyxTQUFnQjtBQUFBLElBQzdDLE9BQU8sS0FBSztBQUFBLElBQ1osa0JBQWtCLFFBQVEsb0JBQW9CO0FBQUEsSUFDOUMsV0FBVyxRQUFRO0FBQUEsSUFDbkIsT0FBTztBQUFBLElBQ1Asa0NBQWtDLEtBQUs7QUFBQSxFQUN6QyxDQUFDO0FBRUQsUUFBTSxLQUFLLEtBQUssVUFBVSxPQUFPLElBQUk7QUFDckMsUUFBTSxRQUNKLEtBQUssVUFBVSxPQUFPLElBQUksS0FBSyxPQUFPLEtBQUssU0FBUyxRQUMvQyxNQUFNO0FBQ0wsVUFBTSxVQUFVLEtBQUssVUFBVSxPQUFPLElBQUksSUFBSSxPQUFPLEtBQUssUUFBUTtBQUNsRSxVQUFNLE1BQU8sU0FBaUIsU0FBUyxRQUFTLFFBQWdCLFNBQVU7QUFDMUUsUUFBSSxlQUFlLE9BQU87QUFDeEIsYUFBTyxFQUFFLE1BQU0sSUFBSSxNQUFNLFNBQVMsSUFBSSxRQUFRO0FBQUEsSUFDaEQ7QUFDQSxXQUFPLEVBQUUsTUFBTSxnQkFBZ0IsU0FBUyxPQUFPLE9BQU8sU0FBUyxFQUFFO0FBQUEsRUFDbkUsR0FBRyxJQUNIO0FBRU4sUUFBTSxpQkFBaUIsc0JBQXNCLE9BQU8sUUFBUTtBQUM1RCxRQUFNLFdBQVcsOEJBQThCLE9BQU8sUUFBUTtBQUM5RCxRQUFNLGNBQWMsUUFBUSxnQkFBZ0IsUUFBUSxDQUFDO0FBRXJELFNBQU87QUFBQSxJQUNMLFNBQVM7QUFBQSxNQUNQO0FBQUEsTUFDQSx5QkFBeUIsZUFBZTtBQUFBLE1BQ3hDLHlCQUF5QixlQUFlO0FBQUEsTUFDeEMsT0FBTyxFQUFFLFFBQVEsYUFBYSxTQUFTLFNBQVMsT0FBTztBQUFBLE1BQ3ZELEdBQUksUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQUEsSUFDM0I7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUNGLENBQUM7QUFFSSxJQUFNLHVCQUF1QixDQUNsQyxNQUNBLFlBRUEsT0FBTyxJQUFJLGFBQWE7QUFDdEIsUUFBTSxXQUFXLGdCQUFnQixJQUFJO0FBRXJDLFFBQU0sWUFBWSxPQUFPLFFBQVEsVUFBVSxTQUFTLFFBQVE7QUFBQSxJQUMxRCxrQkFBa0IsU0FBUztBQUFBLElBQzNCLFdBQVcsU0FBUztBQUFBLEVBQ3RCLENBQUM7QUFFRCxRQUFNLFdBQVcsT0FBTyxRQUFRLFVBQVUsU0FBUyxPQUFPO0FBQUEsSUFDeEQsa0JBQWtCLFNBQVM7QUFBQSxJQUMzQixXQUFXLFNBQVM7QUFBQSxFQUN0QixDQUFDO0FBRUQsUUFBTSxnQkFBZ0IsQ0FBQyxVQUFVLFFBQVEsTUFBTSxDQUFDLFNBQVMsUUFBUTtBQUNqRSxRQUFNLE9BQU8sZ0JBQ1QsRUFBRSxTQUFTLENBQUMsRUFBRSxNQUFNLGNBQXVCLENBQUMsR0FBRyxTQUFTLEVBQUUsT0FBTyxHQUFHLFNBQVMsR0FBRyxTQUFTLEVBQUUsRUFBRSxJQUM3RiwyQkFBMkIsVUFBVSxVQUFVLFNBQVMsUUFBUTtBQUVwRSxRQUFNLFVBQWlDLGlCQUFpQixLQUFLLFFBQVEsU0FBUyxJQUFJLFNBQVM7QUFFM0YsU0FBTztBQUFBLElBQ0wsU0FBUztBQUFBLElBQ1Q7QUFBQSxJQUNBLFFBQVEsVUFBVTtBQUFBLElBQ2xCLE9BQU8sU0FBUztBQUFBLElBQ2hCLFNBQVMsS0FBSztBQUFBLElBQ2QsU0FBUyxLQUFLO0FBQUEsRUFDaEI7QUFDRixDQUFDOzs7QUZqV0gsSUFBTUMsbUJBQWtCLENBQTRCLFNBQ2hELE1BQWMsU0FBUyxlQUNwQixPQUNDLE1BQWM7QUFFdEIsSUFBTUMsWUFBVyxDQUFDLFVBQ2hCLE9BQU8sVUFBVSxZQUFZLFVBQVUsUUFBUSxDQUFDLE1BQU0sUUFBUSxLQUFLO0FBRXJFLElBQU0sYUFBYSxDQUFDLFVBQTJCLEtBQUssVUFBVSxLQUFLLEtBQUs7QUFFeEUsSUFBTSxlQUFlLENBQUMsUUFBaUIsVUFBMEM7QUFDL0UsUUFBTSxJQUFJQSxVQUFTLE1BQU0sSUFBSSxTQUFTLENBQUM7QUFDdkMsUUFBTSxJQUFJQSxVQUFTLEtBQUssSUFBSSxRQUFRLENBQUM7QUFDckMsUUFBTSxPQUFPLE1BQU0sS0FBSyxvQkFBSSxJQUFJLENBQUMsR0FBRyxPQUFPLEtBQUssQ0FBQyxHQUFHLEdBQUcsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDMUcsUUFBTSxVQUFvQixDQUFDO0FBQzNCLGFBQVcsS0FBSyxNQUFNO0FBQ3BCLFFBQUksV0FBWSxFQUFVLENBQUMsQ0FBQyxNQUFNLFdBQVksRUFBVSxDQUFDLENBQUMsR0FBRztBQUMzRCxjQUFRLEtBQUssQ0FBQztBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQVFBLElBQU0saUNBQWlDLENBQUMsU0FHc0U7QUFDNUcsTUFBSSxLQUFLLFVBQVUsV0FBVyxHQUFHO0FBQy9CLFdBQU8sRUFBRSxTQUFTLEtBQUssT0FBTyxTQUFTLGNBQWMsQ0FBQyxFQUFFO0FBQUEsRUFDMUQ7QUFFQSxRQUFNLFFBQVEsb0JBQUksSUFBZ0M7QUFDbEQsYUFBVyxRQUFRLEtBQUssV0FBVztBQUNqQyxVQUFNLElBQUksS0FBSyxTQUFTLEtBQUssTUFBTTtBQUFBLEVBQ3JDO0FBRUEsUUFBTSxnQkFBZ0Isb0JBQUksSUFBb0I7QUFFOUMsYUFBVyxVQUFVLEtBQUssT0FBTyxTQUFTO0FBQ3hDLFFBQUksT0FBTyxTQUFTLGNBQWM7QUFDaEMsYUFBTyxFQUFFLFNBQVMsUUFBUSxjQUFjLENBQUMsRUFBRTtBQUFBLElBQzdDO0FBRUEsVUFBTSxTQUFTLE9BQU87QUFDdEIsVUFBTSxRQUFRLE9BQU87QUFDckIsUUFBSSxDQUFDQSxVQUFTLE1BQU0sS0FBSyxDQUFDQSxVQUFTLEtBQUssR0FBRztBQUN6QyxhQUFPLEVBQUUsU0FBUyxRQUFRLGNBQWMsQ0FBQyxFQUFFO0FBQUEsSUFDN0M7QUFFQSxVQUFNLGVBQWUsT0FBTztBQUM1QixVQUFNLGNBQWMsTUFBTTtBQUMxQixRQUFJLFdBQVcsWUFBWSxNQUFNLFdBQVcsV0FBVyxHQUFHO0FBQ3hELGFBQU8sRUFBRSxTQUFTLFFBQVEsY0FBYyxDQUFDLEVBQUU7QUFBQSxJQUM3QztBQUNBLFFBQUksV0FBVyxPQUFPLFFBQVEsTUFBTSxXQUFXLE1BQU0sUUFBUSxHQUFHO0FBQzlELGFBQU8sRUFBRSxTQUFTLFFBQVEsY0FBYyxDQUFDLEVBQUU7QUFBQSxJQUM3QztBQUNBLFFBQUksV0FBVyxPQUFPLElBQUksTUFBTSxXQUFXLE1BQU0sSUFBSSxHQUFHO0FBQ3RELGFBQU8sRUFBRSxTQUFTLFFBQVEsY0FBYyxDQUFDLEVBQUU7QUFBQSxJQUM3QztBQUNBLFFBQUksV0FBVyxPQUFPLElBQUksTUFBTSxXQUFXLE1BQU0sSUFBSSxHQUFHO0FBQ3RELGFBQU8sRUFBRSxTQUFTLFFBQVEsY0FBYyxDQUFDLEVBQUU7QUFBQSxJQUM3QztBQUVBLFVBQU0sVUFBVSxhQUFhLE9BQU8sTUFBTSxNQUFNLElBQUk7QUFDcEQsZUFBVyxXQUFXLFNBQVM7QUFDN0IsVUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLEdBQUc7QUFDdkIsZUFBTyxFQUFFLFNBQVMsUUFBUSxjQUFjLENBQUMsRUFBRTtBQUFBLE1BQzdDO0FBQ0Esb0JBQWMsSUFBSSxVQUFVLGNBQWMsSUFBSSxPQUFPLEtBQUssS0FBSyxDQUFDO0FBQUEsSUFDbEU7QUFBQSxFQUNGO0FBRUEsUUFBTSxlQUFlLE1BQU0sS0FBSyxjQUFjLFFBQVEsQ0FBQyxFQUNwRCxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssT0FBTztBQUFBLElBQzFCO0FBQUEsSUFDQTtBQUFBLElBQ0EsR0FBSSxNQUFNLElBQUksT0FBTyxJQUFJLEVBQUUsUUFBUSxNQUFNLElBQUksT0FBTyxFQUFFLElBQUksQ0FBQztBQUFBLEVBQzdELEVBQUUsRUFDRCxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsUUFBUSxjQUFjLEVBQUUsT0FBTyxDQUFDO0FBRXBELFNBQU8sRUFBRSxTQUFTLFFBQVEsYUFBYTtBQUN6QztBQTRDTyxJQUFNQyxtQkFBa0IsQ0FDN0IsUUFDQSxZQUM0QixnQkFBZ0IsUUFBUSxPQUFPO0FBT3RELElBQU1DLGdCQUFlLENBQzFCLFFBQ0EsT0FDQSxZQUNvQyxhQUFhLFFBQVEsT0FBTyxPQUFPO0FBT2xFLElBQU1DLGtCQUFpQixDQUFDLFdBQ2QsZUFBZSxNQUFNO0FBTy9CLElBQU1DLHdCQUF1QixDQUNsQyxRQUNBLFlBRUEscUJBQTZCLFFBQWUsT0FBYztBQUVyRCxJQUFNLHdCQUF3QixDQUNuQyxRQUNBLFlBRUFDLFFBQU8sSUFBSSxhQUFhO0FBQ3RCLFFBQU0sV0FBV04saUJBQWdCLE1BQWE7QUFFOUMsUUFBTSwyQkFDSCxTQUFTLHFCQUE2QixRQUFRLFVBQVksU0FBUyxvQkFBNEI7QUFFbEcsUUFBTSxXQUFXLE9BQU8scUJBQTZCLFFBQWU7QUFBQSxJQUNsRSxHQUFJO0FBQUEsSUFDSixrQkFBa0I7QUFBQSxFQUNwQixDQUFDO0FBRUQsUUFBTSxtQkFBbUIsU0FBUyxnQ0FBZ0M7QUFDbEUsUUFBTSxZQUFZLG1CQUEwQiw4QkFBOEIsQ0FBQztBQUMzRSxRQUFNLGtCQUFrQiwrQkFBK0IsRUFBRSxRQUFRLFVBQVUsVUFBVSxDQUFDO0FBQ3RGLFFBQU0sa0JBQW1DLG1CQUFtQixnQkFBZ0IsVUFBVSxTQUFTO0FBRS9GLFFBQU0sVUFBVyxTQUFTLGFBQWEsU0FBUztBQUVoRCxRQUFNLGNBQWNNLFFBQU8sSUFBSSxhQUFhO0FBQzFDLFVBQU0sTUFBTSxPQUFPLFNBQVMsTUFBTSxLQUFLQyxPQUFNLEtBQUs7QUFDbEQsVUFBTSxVQUFlQyxTQUFRLElBQUksS0FBSyxTQUFTLE1BQWE7QUFDNUQsUUFBSSxTQUFTLGFBQWE7QUFDeEIsYUFBTyxRQUFRLFlBQVksT0FBTztBQUFBLElBQ3BDO0FBQ0EsV0FBTztBQUFBLE1BQ0wseUJBQWdDLDJCQUEyQixPQUFPO0FBQUEsTUFDbEUseUJBQWdDLDJCQUEyQixPQUFPO0FBQUEsSUFDcEU7QUFBQSxFQUNGLENBQUM7QUFFRCxRQUFNLGFBQWEsT0FBTyxTQUFTLGFBQWE7QUFBQSxJQUM5QyxPQUFPLFNBQVM7QUFBQSxJQUNoQixrQkFBa0IsU0FBUyx3QkFBd0I7QUFBQSxJQUNuRCxPQUFPLFNBQVM7QUFBQSxJQUNoQixrQ0FBa0MsU0FBUztBQUFBLEVBQzdDLENBQUM7QUFFRCxRQUFNLFlBQVlDLE1BQUssVUFBVSxXQUFXLElBQUksSUFDNUMsV0FBVyxLQUFLLFNBQ2YsTUFBTTtBQUNMLFVBQU0sTUFBTUEsTUFBSyxVQUFVLFdBQVcsSUFBSSxJQUN0QyxPQUFRLFdBQVcsS0FBYSxTQUFTLGtCQUFrQixJQUMzRDtBQUNKLFVBQU0sSUFBSSxNQUFNLEdBQUc7QUFBQSxFQUNyQixHQUFHO0FBRVAsUUFBTSxPQUFjLHdCQUF3QjtBQUFBLElBQzFDLE1BQU0sU0FBUyxRQUFRO0FBQUEsSUFDdkIsbUJBQW1CLFVBQVUsd0JBQXdCO0FBQUEsSUFDckQseUJBQXlCLFVBQVU7QUFBQSxJQUNuQyxrQkFBa0IsU0FBUyx3QkFBd0I7QUFBQSxFQUNyRCxDQUFDO0FBRUQsUUFBTSxVQUEyQixLQUFLLFlBQVksVUFBVSxvQkFBb0IsU0FBUyxTQUFTO0FBRWxHLFNBQU87QUFBQSxJQUNMLFNBQVM7QUFBQSxJQUNUO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxHQUFJLG1CQUFtQixFQUFFLGNBQWMsZ0JBQWdCLGFBQWEsSUFBSSxDQUFDO0FBQUEsRUFDM0U7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogWyJDb250ZXh0IiwgIkVmZmVjdCIsICJFeGl0IiwgIkxheWVyIiwgInJlc29sdmVSb290SW1wbCIsICJpc1JlY29yZCIsICJleHRyYWN0TWFuaWZlc3QiLCAiZGlmZk1hbmlmZXN0IiwgImV4cG9ydFN0YXRpY0lyIiwgInZlcmlmeUtlcm5lbENvbnRyYWN0IiwgIkVmZmVjdCIsICJMYXllciIsICJDb250ZXh0IiwgIkV4aXQiXQp9Cg==
|
|
760
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvUmVmbGVjdGlvbi50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9vYnNlcnZhYmlsaXR5L2NvbnRyb2xTdXJmYWNlTWFuaWZlc3QudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvb2JzZXJ2YWJpbGl0eS93b3JrZmxvd1N1cmZhY2UudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcmVmbGVjdGlvbi9jb250cm9sU3VyZmFjZS50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9yZWZsZWN0aW9uL2RpZmYudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcmVmbGVjdGlvbi9rZXJuZWxDb250cmFjdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQ29udGV4dCwgRWZmZWN0LCBFeGl0LCBMYXllciB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuL2ludGVybmFsL21vZHVsZS5qcydcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlIH0gZnJvbSAnLi9Nb2R1bGUuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRpY0lyIH0gZnJvbSAnLi9pbnRlcm5hbC9zdGF0ZS10cmFpdC9pci5qcydcbmltcG9ydCB0eXBlIHsgRXh0cmFjdE1hbmlmZXN0T3B0aW9ucywgTW9kdWxlTWFuaWZlc3QgfSBmcm9tICcuL2ludGVybmFsL3JlZmxlY3Rpb24vbWFuaWZlc3QuanMnXG5pbXBvcnQgKiBhcyBNYW5pZmVzdCBmcm9tICcuL2ludGVybmFsL3JlZmxlY3Rpb24vbWFuaWZlc3QuanMnXG5pbXBvcnQgKiBhcyBTdGF0aWNJckV4cG9ydCBmcm9tICcuL2ludGVybmFsL3JlZmxlY3Rpb24vc3RhdGljSXIuanMnXG5pbXBvcnQgdHlwZSB7XG4gIEV4cG9ydENvbnRyb2xTdXJmYWNlT3B0aW9ucyxcbiAgRXhwb3J0Q29udHJvbFN1cmZhY2VSZXN1bHQsXG4gIEV4cG9ydGVkV29ya2Zsb3dTdXJmYWNlLFxufSBmcm9tICcuL2ludGVybmFsL3JlZmxlY3Rpb24vY29udHJvbFN1cmZhY2UuanMnXG5pbXBvcnQgKiBhcyBDb250cm9sU3VyZmFjZUV4cG9ydCBmcm9tICcuL2ludGVybmFsL3JlZmxlY3Rpb24vY29udHJvbFN1cmZhY2UuanMnXG5pbXBvcnQgdHlwZSB7IERpZmZNYW5pZmVzdE9wdGlvbnMsIE1vZHVsZU1hbmlmZXN0RGlmZiB9IGZyb20gJy4vaW50ZXJuYWwvcmVmbGVjdGlvbi9kaWZmLmpzJ1xuaW1wb3J0ICogYXMgTWFuaWZlc3REaWZmIGZyb20gJy4vaW50ZXJuYWwvcmVmbGVjdGlvbi9kaWZmLmpzJ1xuaW1wb3J0IHR5cGUge1xuICBLZXJuZWxDb250cmFjdFZlcmlmaWNhdGlvblJlc3VsdCxcbiAgVmVyaWZ5S2VybmVsQ29udHJhY3RPcHRpb25zLFxufSBmcm9tICcuL2ludGVybmFsL3JlZmxlY3Rpb24va2VybmVsQ29udHJhY3QuanMnXG5pbXBvcnQgeyB2ZXJpZnlLZXJuZWxDb250cmFjdCBhcyB2ZXJpZnlLZXJuZWxDb250cmFjdEludGVybmFsIH0gZnJvbSAnLi9pbnRlcm5hbC9yZWZsZWN0aW9uL2tlcm5lbENvbnRyYWN0LmpzJ1xuaW1wb3J0IHsgdHJpYWxSdW4gfSBmcm9tICcuL2ludGVybmFsL29ic2VydmFiaWxpdHkvdHJpYWxSdW4uanMnXG5pbXBvcnQgdHlwZSB7IFJ1bnRpbWVTZXJ2aWNlc092ZXJyaWRlcyB9IGZyb20gJy4vS2VybmVsLmpzJ1xuaW1wb3J0ICogYXMgS2VybmVsIGZyb20gJy4vS2VybmVsLmpzJ1xuaW1wb3J0IHR5cGUgKiBhcyBEZWJ1ZyBmcm9tICcuL2ludGVybmFsL3J1bnRpbWUvY29yZS9EZWJ1Z1NpbmsuanMnXG5cbmV4cG9ydCB0eXBlIHtcbiAgTW9kdWxlTWFuaWZlc3QsXG4gIEV4dHJhY3RNYW5pZmVzdE9wdGlvbnMsXG4gIE1vZHVsZU1hbmlmZXN0RGlmZixcbiAgRGlmZk1hbmlmZXN0T3B0aW9ucyxcbiAgS2VybmVsQ29udHJhY3RWZXJpZmljYXRpb25SZXN1bHQsXG4gIFZlcmlmeUtlcm5lbENvbnRyYWN0T3B0aW9ucyxcbiAgRXhwb3J0Q29udHJvbFN1cmZhY2VPcHRpb25zLFxuICBFeHBvcnRDb250cm9sU3VyZmFjZVJlc3VsdCxcbiAgRXhwb3J0ZWRXb3JrZmxvd1N1cmZhY2UsXG59XG5cbnR5cGUgQW55TW9kdWxlTGlrZSA9IHsgcmVhZG9ubHkgaW1wbDogTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+IH1cbnR5cGUgUm9vdExpa2U8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZT4gPSBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4gfCBBbnlNb2R1bGVMaWtlXG5cbmNvbnN0IHJlc29sdmVSb290SW1wbCA9IDxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPihyb290OiBSb290TGlrZTxTaD4pOiBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4gPT5cbiAgKChyb290IGFzIGFueSk/Ll90YWcgPT09ICdNb2R1bGVJbXBsJ1xuICAgID8gKHJvb3QgYXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+KVxuICAgIDogKChyb290IGFzIGFueSk/LmltcGwgYXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+KSkgc2F0aXNmaWVzIE1vZHVsZUltcGw8YW55LCBTaCwgYW55PlxuXG5jb25zdCBpc1JlY29yZCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IHN0YWJsZUpzb24gPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gSlNPTi5zdHJpbmdpZnkodmFsdWUpID8/ICcnXG5cbmNvbnN0IGRpZmZNZXRhS2V5cyA9IChiZWZvcmU6IHVua25vd24sIGFmdGVyOiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgYiA9IGlzUmVjb3JkKGJlZm9yZSkgPyBiZWZvcmUgOiB7fVxuICBjb25zdCBhID0gaXNSZWNvcmQoYWZ0ZXIpID8gYWZ0ZXIgOiB7fVxuICBjb25zdCBrZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5PYmplY3Qua2V5cyhiKSwgLi4uT2JqZWN0LmtleXMoYSldKSkuc29ydCgpXG4gIGNvbnN0IGNoYW5nZWQ6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBrIG9mIGtleXMpIHtcbiAgICBpZiAoc3RhYmxlSnNvbihiW2tdKSAhPT0gc3RhYmxlSnNvbihhW2tdKSkge1xuICAgICAgY2hhbmdlZC5wdXNoKGspXG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2VybmVsQ29udHJhY3RBbGxvd2VkRGlmZiB7XG4gIHJlYWRvbmx5IG1ldGFLZXk6IHN0cmluZ1xuICByZWFkb25seSBjb3VudDogbnVtYmVyXG4gIHJlYWRvbmx5IHJlYXNvbj86IHN0cmluZ1xufVxuXG5jb25zdCB0cnlBbGxvd2xpc3RLZXJuZWxDb250cmFjdERpZmYgPSAoYXJnczoge1xuICByZWFkb25seSByZXN1bHQ6IEtlcm5lbENvbnRyYWN0VmVyaWZpY2F0aW9uUmVzdWx0XG4gIHJlYWRvbmx5IGFsbG93bGlzdDogUmVhZG9ubHlBcnJheTxLZXJuZWwuS2VybmVsQ29udHJhY3RNZXRhQWxsb3dsaXN0SXRlbT5cbn0pOiB7IHJlYWRvbmx5IHZlcmRpY3Q6ICdQQVNTJyB8ICdGQUlMJzsgcmVhZG9ubHkgYWxsb3dlZERpZmZzOiBSZWFkb25seUFycmF5PEtlcm5lbENvbnRyYWN0QWxsb3dlZERpZmY+IH0gPT4ge1xuICBpZiAoYXJncy5hbGxvd2xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgdmVyZGljdDogYXJncy5yZXN1bHQudmVyZGljdCwgYWxsb3dlZERpZmZzOiBbXSB9XG4gIH1cblxuICBjb25zdCBhbGxvdyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KClcbiAgZm9yIChjb25zdCBpdGVtIG9mIGFyZ3MuYWxsb3dsaXN0KSB7XG4gICAgYWxsb3cuc2V0KGl0ZW0ubWV0YUtleSwgaXRlbS5yZWFzb24pXG4gIH1cblxuICBjb25zdCBhbGxvd2VkQ291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKVxuXG4gIGZvciAoY29uc3QgY2hhbmdlIG9mIGFyZ3MucmVzdWx0LmNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlLmNvZGUgIT09ICdvcC5jaGFuZ2VkJykge1xuICAgICAgcmV0dXJuIHsgdmVyZGljdDogJ0ZBSUwnLCBhbGxvd2VkRGlmZnM6IFtdIH1cbiAgICB9XG5cbiAgICBjb25zdCBiZWZvcmUgPSBjaGFuZ2UuYmVmb3JlIGFzIGFueVxuICAgIGNvbnN0IGFmdGVyID0gY2hhbmdlLmFmdGVyIGFzIGFueVxuICAgIGlmICghaXNSZWNvcmQoYmVmb3JlKSB8fCAhaXNSZWNvcmQoYWZ0ZXIpKSB7XG4gICAgICByZXR1cm4geyB2ZXJkaWN0OiAnRkFJTCcsIGFsbG93ZWREaWZmczogW10gfVxuICAgIH1cblxuICAgIGNvbnN0IGFuY2hvckJlZm9yZSA9IGJlZm9yZS5hbmNob3JcbiAgICBjb25zdCBhbmNob3JBZnRlciA9IGFmdGVyLmFuY2hvclxuICAgIGlmIChzdGFibGVKc29uKGFuY2hvckJlZm9yZSkgIT09IHN0YWJsZUpzb24oYW5jaG9yQWZ0ZXIpKSB7XG4gICAgICByZXR1cm4geyB2ZXJkaWN0OiAnRkFJTCcsIGFsbG93ZWREaWZmczogW10gfVxuICAgIH1cbiAgICBpZiAoc3RhYmxlSnNvbihiZWZvcmUubW9kdWxlSWQpICE9PSBzdGFibGVKc29uKGFmdGVyLm1vZHVsZUlkKSkge1xuICAgICAgcmV0dXJuIHsgdmVyZGljdDogJ0ZBSUwnLCBhbGxvd2VkRGlmZnM6IFtdIH1cbiAgICB9XG4gICAgaWYgKHN0YWJsZUpzb24oYmVmb3JlLmtpbmQpICE9PSBzdGFibGVKc29uKGFmdGVyLmtpbmQpKSB7XG4gICAgICByZXR1cm4geyB2ZXJkaWN0OiAnRkFJTCcsIGFsbG93ZWREaWZmczogW10gfVxuICAgIH1cbiAgICBpZiAoc3RhYmxlSnNvbihiZWZvcmUubmFtZSkgIT09IHN0YWJsZUpzb24oYWZ0ZXIubmFtZSkpIHtcbiAgICAgIHJldHVybiB7IHZlcmRpY3Q6ICdGQUlMJywgYWxsb3dlZERpZmZzOiBbXSB9XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbmdlZCA9IGRpZmZNZXRhS2V5cyhiZWZvcmUubWV0YSwgYWZ0ZXIubWV0YSlcbiAgICBmb3IgKGNvbnN0IG1ldGFLZXkgb2YgY2hhbmdlZCkge1xuICAgICAgaWYgKCFhbGxvdy5oYXMobWV0YUtleSkpIHtcbiAgICAgICAgcmV0dXJuIHsgdmVyZGljdDogJ0ZBSUwnLCBhbGxvd2VkRGlmZnM6IFtdIH1cbiAgICAgIH1cbiAgICAgIGFsbG93ZWRDb3VudHMuc2V0KG1ldGFLZXksIChhbGxvd2VkQ291bnRzLmdldChtZXRhS2V5KSA/PyAwKSArIDEpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYWxsb3dlZERpZmZzID0gQXJyYXkuZnJvbShhbGxvd2VkQ291bnRzLmVudHJpZXMoKSlcbiAgICAubWFwKChbbWV0YUtleSwgY291bnRdKSA9PiAoe1xuICAgICAgbWV0YUtleSxcbiAgICAgIGNvdW50LFxuICAgICAgLi4uKGFsbG93LmdldChtZXRhS2V5KSA/IHsgcmVhc29uOiBhbGxvdy5nZXQobWV0YUtleSkgfSA6IHt9KSxcbiAgICB9KSlcbiAgICAuc29ydCgoYSwgYikgPT4gKGEubWV0YUtleSA8IGIubWV0YUtleSA/IC0xIDogYS5tZXRhS2V5ID4gYi5tZXRhS2V5ID8gMSA6IDApKVxuXG4gIHJldHVybiB7IHZlcmRpY3Q6ICdQQVNTJywgYWxsb3dlZERpZmZzIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdWxsQ3V0b3ZlckdhdGVUcmlhbFJ1bk9wdGlvbnM8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZT4ge1xuICByZWFkb25seSBydW5JZD86IHN0cmluZ1xuICByZWFkb25seSBsYXllcj86IExheWVyLkxheWVyPGFueSwgYW55LCBhbnk+XG4gIHJlYWRvbmx5IHJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzPzogUnVudGltZVNlcnZpY2VzT3ZlcnJpZGVzXG4gIHJlYWRvbmx5IGludGVyYWN0aW9uPzogKHJ1bnRpbWU6IGFueSkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBhbnksIGFueT5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlGdWxsQ3V0b3ZlckdhdGVPcHRpb25zPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGU+IGV4dGVuZHMgVmVyaWZ5S2VybmVsQ29udHJhY3RPcHRpb25zPFNoPiB7XG4gIHJlYWRvbmx5IG1vZGU/OiBLZXJuZWwuRnVsbEN1dG92ZXJHYXRlTW9kZVxuICAvKipcbiAgICogRXZpZGVuY2UgdHJpbW1pbmcgbGV2ZWwgZm9yIGdhdGUgZXZhbHVhdGlvbjpcbiAgICogLSBgb2ZmYDogbWluaW1hbCBzdW1tYXJ5IChtdXN0IHN0aWxsIGJlIHJ1bm5hYmxlKVxuICAgKiAtIGBsaWdodGAgLyBgZnVsbGA6IGFkZCBleHBsYWluYWJsZSBkZXRhaWxzXG4gICAqL1xuICByZWFkb25seSBnYXRlRGlhZ25vc3RpY3NMZXZlbD86IERlYnVnLkRpYWdub3N0aWNzTGV2ZWxcbiAgLyoqXG4gICAqIENvbnRyYWN0IGRpZmYgYWxsb3dsaXN0IChkaXNhYmxlZCBieSBkZWZhdWx0KS5cbiAgICogLSBPbmx5IGFsbG93cyBzcGVjaWZpYyBvcCBtZXRhIGtleXMgKGJ5IG1ldGFLZXkpOyB0aGUgU1NvVCBpcyBjb2RlIChLZXJuZWxDb250cmFjdE1ldGFBbGxvd2xpc3QpLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlQ29udHJhY3RNZXRhQWxsb3dsaXN0PzogYm9vbGVhblxuICAvKipcbiAgICogQWZ0ZXItcnVuIG9wdGlvbnMgdXNlZCBmb3IgZ2F0ZSBldmFsdWF0aW9uOyBkZWZhdWx0cyB0byBgb3B0aW9ucy5hZnRlcmAuXG4gICAqXG4gICAqIE9ubHkgdXNlZCB0byByZWFkIHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlL2tlcm5lbFJlZjsgZG9lcyBub3QgcmVseSBvbiBkZWJ1ZyBsb2dzLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2F0ZUFmdGVyPzogRnVsbEN1dG92ZXJHYXRlVHJpYWxSdW5PcHRpb25zPFNoPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bGxDdXRvdmVyR2F0ZVZlcmlmaWNhdGlvblJlc3VsdCB7XG4gIHJlYWRvbmx5IHZlcnNpb246ICd2MSdcbiAgcmVhZG9ubHkgdmVyZGljdDogJ1BBU1MnIHwgJ0ZBSUwnXG4gIHJlYWRvbmx5IGdhdGU6IEtlcm5lbC5GdWxsQ3V0b3ZlckdhdGVSZXN1bHRcbiAgcmVhZG9ubHkgY29udHJhY3Q6IEtlcm5lbENvbnRyYWN0VmVyaWZpY2F0aW9uUmVzdWx0XG4gIHJlYWRvbmx5IGNvbnRyYWN0VmVyZGljdDogJ1BBU1MnIHwgJ0ZBSUwnXG4gIHJlYWRvbmx5IGFsbG93ZWREaWZmcz86IFJlYWRvbmx5QXJyYXk8S2VybmVsQ29udHJhY3RBbGxvd2VkRGlmZj5cbn1cblxuLyoqXG4gKiBSZWZsZWN0aW9uLmV4dHJhY3RNYW5pZmVzdFxuICpcbiAqIEV4dHJhY3RzIGEgcGxhdGZvcm0tY29uc3VtYWJsZSBNYW5pZmVzdCBJUiAoSlNPTiwgZGlmZmFibGUpIGZyb20gdGhlIGZpbmFsIG1vZHVsZSBvYmplY3QgKGBBbnlNb2R1bGVgIC8gYE1vZHVsZUltcGxgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IGV4dHJhY3RNYW5pZmVzdCA9IChcbiAgbW9kdWxlOiBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gfCBBbnlNb2R1bGUsXG4gIG9wdGlvbnM/OiBFeHRyYWN0TWFuaWZlc3RPcHRpb25zLFxuKTogTW9kdWxlTWFuaWZlc3QgPT4gTWFuaWZlc3QuZXh0cmFjdE1hbmlmZXN0KG1vZHVsZSwgb3B0aW9ucylcblxuLyoqXG4gKiBSZWZsZWN0aW9uLmRpZmZNYW5pZmVzdFxuICpcbiAqIERpZmZzIHR3byBNYW5pZmVzdHMgYW5kIHByb2R1Y2VzIGEgc3RhYmxlLCBtYWNoaW5lLXJlYWRhYmxlIHN1bW1hcnkgKENJIGNvbnRyYWN0IGd1YXJkIC8gVUkgcmV1c2UpLlxuICovXG5leHBvcnQgY29uc3QgZGlmZk1hbmlmZXN0ID0gKFxuICBiZWZvcmU6IE1vZHVsZU1hbmlmZXN0LFxuICBhZnRlcjogTW9kdWxlTWFuaWZlc3QsXG4gIG9wdGlvbnM/OiBEaWZmTWFuaWZlc3RPcHRpb25zLFxuKTogTW9kdWxlTWFuaWZlc3REaWZmID0+IE1hbmlmZXN0RGlmZi5kaWZmTWFuaWZlc3QoYmVmb3JlLCBhZnRlciwgb3B0aW9ucylcblxuLyoqXG4gKiBSZWZsZWN0aW9uLmV4cG9ydFN0YXRpY0lyXG4gKlxuICogSWYgdGhlIG1vZHVsZSBjb250YWlucyBhIFN0YXRlVHJhaXQgcHJvZ3JhbSwgZXhwb3J0cyBjYW5vbmljYWwgU3RhdGljSVIgKHNhbWUgc2hhcGUgYW5kIGRpZ2VzdCBhcyBTdGF0ZVRyYWl0LmV4cG9ydFN0YXRpY0lyKS5cbiAqL1xuZXhwb3J0IGNvbnN0IGV4cG9ydFN0YXRpY0lyID0gKG1vZHVsZTogTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+IHwgQW55TW9kdWxlKTogU3RhdGljSXIgfCB1bmRlZmluZWQgPT5cbiAgU3RhdGljSXJFeHBvcnQuZXhwb3J0U3RhdGljSXIobW9kdWxlKVxuXG4vKipcbiAqIFJlZmxlY3Rpb24uZXhwb3J0Q29udHJvbFN1cmZhY2VcbiAqXG4gKiBFeHBvcnRzIHRoZSBDb250cm9sU3VyZmFjZU1hbmlmZXN0IChSb290IElSKSBhbmQgc2xpY2UgYXR0YWNobWVudHMgKGUuZy4gd29ya2Zsb3dTdXJmYWNlKSBmcm9tIGNvbmZpZ3VyZWQgbW9kdWxlcy5cbiAqXG4gKiBOb3RlOiBjdXJyZW50bHkgcmVxdWlyZXMgYEFueU1vZHVsZWAgKHRoZSBjb25maWd1cmVkIG1vZHVsZSBvYmplY3QgcmV0dXJuZWQgYnkgYE1vZHVsZURlZi5pbXBsZW1lbnQoLi4uKWApLlxuICovXG5leHBvcnQgY29uc3QgZXhwb3J0Q29udHJvbFN1cmZhY2UgPSAoXG4gIG1vZHVsZXM6IFJlYWRvbmx5QXJyYXk8QW55TW9kdWxlPixcbiAgb3B0aW9ucz86IEV4cG9ydENvbnRyb2xTdXJmYWNlT3B0aW9ucyxcbik6IEV4cG9ydENvbnRyb2xTdXJmYWNlUmVzdWx0ID0+IENvbnRyb2xTdXJmYWNlRXhwb3J0LmV4cG9ydENvbnRyb2xTdXJmYWNlKG1vZHVsZXMsIG9wdGlvbnMpXG5cbi8qKlxuICogUmVmbGVjdGlvbi52ZXJpZnlLZXJuZWxDb250cmFjdFxuICpcbiAqIFJ1bnMgdHdvIHRyaWFsLXJ1bnMgKHdpdGggb3B0aW9uYWwgZGlmZmVyZW50IExheWVycy9vdmVycmlkZXMpIGFuZCBleHBvcnRzIGEgc3RhYmxlLCBtYWNoaW5lLXJlYWRhYmxlIGtlcm5lbCBjb250cmFjdCBkaWZmIHJlcG9ydC5cbiAqL1xuZXhwb3J0IGNvbnN0IHZlcmlmeUtlcm5lbENvbnRyYWN0ID0gPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGU+KFxuICBtb2R1bGU6IE1vZHVsZUltcGw8YW55LCBTaCwgYW55PiB8IEFueU1vZHVsZSxcbiAgb3B0aW9ucz86IFZlcmlmeUtlcm5lbENvbnRyYWN0T3B0aW9uczxTaD4sXG4pOiBpbXBvcnQoJ2VmZmVjdCcpLkVmZmVjdC5FZmZlY3Q8S2VybmVsQ29udHJhY3RWZXJpZmljYXRpb25SZXN1bHQsIG5ldmVyLCBhbnk+ID0+XG4gIHZlcmlmeUtlcm5lbENvbnRyYWN0SW50ZXJuYWwobW9kdWxlIGFzIGFueSwgb3B0aW9ucyBhcyBhbnkpXG5cbmV4cG9ydCBjb25zdCB2ZXJpZnlGdWxsQ3V0b3ZlckdhdGUgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZT4oXG4gIG1vZHVsZTogTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+IHwgQW55TW9kdWxlLFxuICBvcHRpb25zPzogVmVyaWZ5RnVsbEN1dG92ZXJHYXRlT3B0aW9uczxTaD4sXG4pOiBFZmZlY3QuRWZmZWN0PEZ1bGxDdXRvdmVyR2F0ZVZlcmlmaWNhdGlvblJlc3VsdCwgbmV2ZXIsIGFueT4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHJvb3RJbXBsID0gcmVzb2x2ZVJvb3RJbXBsKG1vZHVsZSBhcyBhbnkpXG5cbiAgICBjb25zdCBjb250cmFjdERpYWdub3N0aWNzTGV2ZWw6IERlYnVnLkRpYWdub3N0aWNzTGV2ZWwgPVxuICAgICAgKG9wdGlvbnM/LmRpYWdub3N0aWNzTGV2ZWwgYXMgYW55KSA9PT0gJ29mZicgPyAnbGlnaHQnIDogKChvcHRpb25zPy5kaWFnbm9zdGljc0xldmVsIGFzIGFueSkgPz8gJ2xpZ2h0JylcblxuICAgIGNvbnN0IGNvbnRyYWN0ID0geWllbGQqIHZlcmlmeUtlcm5lbENvbnRyYWN0SW50ZXJuYWwobW9kdWxlIGFzIGFueSwge1xuICAgICAgLi4uKG9wdGlvbnMgYXMgYW55KSxcbiAgICAgIGRpYWdub3N0aWNzTGV2ZWw6IGNvbnRyYWN0RGlhZ25vc3RpY3NMZXZlbCxcbiAgICB9KVxuXG4gICAgY29uc3QgYWxsb3dsaXN0RW5hYmxlZCA9IG9wdGlvbnM/LmVuYWJsZUNvbnRyYWN0TWV0YUFsbG93bGlzdCA9PT0gdHJ1ZVxuICAgIGNvbnN0IGFsbG93bGlzdCA9IGFsbG93bGlzdEVuYWJsZWQgPyBLZXJuZWwuS2VybmVsQ29udHJhY3RNZXRhQWxsb3dsaXN0IDogW11cbiAgICBjb25zdCBjb250cmFjdEFsbG93ZWQgPSB0cnlBbGxvd2xpc3RLZXJuZWxDb250cmFjdERpZmYoeyByZXN1bHQ6IGNvbnRyYWN0LCBhbGxvd2xpc3QgfSlcbiAgICBjb25zdCBjb250cmFjdFZlcmRpY3Q6ICdQQVNTJyB8ICdGQUlMJyA9IGFsbG93bGlzdEVuYWJsZWQgPyBjb250cmFjdEFsbG93ZWQudmVyZGljdCA6IGNvbnRyYWN0LnZlcmRpY3RcblxuICAgIGNvbnN0IGdhdGVSdW4gPSAob3B0aW9ucz8uZ2F0ZUFmdGVyID8/IG9wdGlvbnM/LmFmdGVyKSBhcyBGdWxsQ3V0b3ZlckdhdGVUcmlhbFJ1bk9wdGlvbnM8U2g+IHwgdW5kZWZpbmVkXG5cbiAgICBjb25zdCBnYXRlUHJvZ3JhbSA9IEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIGNvbnN0IGN0eCA9IHlpZWxkKiByb290SW1wbC5sYXllci5waXBlKExheWVyLmJ1aWxkKVxuICAgICAgY29uc3QgcnVudGltZTogYW55ID0gQ29udGV4dC5nZXQoY3R4LCByb290SW1wbC5tb2R1bGUgYXMgYW55KVxuICAgICAgaWYgKGdhdGVSdW4/LmludGVyYWN0aW9uKSB7XG4gICAgICAgIHlpZWxkKiBnYXRlUnVuLmludGVyYWN0aW9uKHJ1bnRpbWUpXG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZjogS2VybmVsLmdldEtlcm5lbEltcGxlbWVudGF0aW9uUmVmKHJ1bnRpbWUpLFxuICAgICAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZTogS2VybmVsLmdldFJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlKHJ1bnRpbWUpLFxuICAgICAgfSBhcyBjb25zdFxuICAgIH0pXG5cbiAgICBjb25zdCBnYXRlUmVzdWx0ID0geWllbGQqIHRyaWFsUnVuKGdhdGVQcm9ncmFtLCB7XG4gICAgICBydW5JZDogZ2F0ZVJ1bj8ucnVuSWQsXG4gICAgICBkaWFnbm9zdGljc0xldmVsOiBvcHRpb25zPy5nYXRlRGlhZ25vc3RpY3NMZXZlbCA/PyAnb2ZmJyxcbiAgICAgIGxheWVyOiBnYXRlUnVuPy5sYXllcixcbiAgICAgIHJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzOiBnYXRlUnVuPy5ydW50aW1lU2VydmljZXNJbnN0YW5jZU92ZXJyaWRlcyxcbiAgICB9KVxuXG4gICAgY29uc3QgZ2F0ZVZhbHVlID0gRXhpdC5pc1N1Y2Nlc3MoZ2F0ZVJlc3VsdC5leGl0KVxuICAgICAgPyBnYXRlUmVzdWx0LmV4aXQudmFsdWVcbiAgICAgIDogKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBtc2cgPSBFeGl0LmlzRmFpbHVyZShnYXRlUmVzdWx0LmV4aXQpXG4gICAgICAgICAgICA/IFN0cmluZygoZ2F0ZVJlc3VsdC5leGl0IGFzIGFueSkuY2F1c2UgPz8gJ3RyaWFsLXJ1biBmYWlsZWQnKVxuICAgICAgICAgICAgOiAndHJpYWwtcnVuIGZhaWxlZCdcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKVxuICAgICAgICB9KSgpXG5cbiAgICBjb25zdCBnYXRlID0gS2VybmVsLmV2YWx1YXRlRnVsbEN1dG92ZXJHYXRlKHtcbiAgICAgIG1vZGU6IG9wdGlvbnM/Lm1vZGUgPz8gJ2Z1bGxDdXRvdmVyJyxcbiAgICAgIHJlcXVlc3RlZEtlcm5lbElkOiBnYXRlVmFsdWUua2VybmVsSW1wbGVtZW50YXRpb25SZWYua2VybmVsSWQsXG4gICAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZTogZ2F0ZVZhbHVlLnJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlLFxuICAgICAgZGlhZ25vc3RpY3NMZXZlbDogb3B0aW9ucz8uZ2F0ZURpYWdub3N0aWNzTGV2ZWwgPz8gJ29mZicsXG4gICAgfSlcblxuICAgIGNvbnN0IHZlcmRpY3Q6ICdQQVNTJyB8ICdGQUlMJyA9IGdhdGUudmVyZGljdCA9PT0gJ1BBU1MnICYmIGNvbnRyYWN0VmVyZGljdCA9PT0gJ1BBU1MnID8gJ1BBU1MnIDogJ0ZBSUwnXG5cbiAgICByZXR1cm4ge1xuICAgICAgdmVyc2lvbjogJ3YxJyxcbiAgICAgIHZlcmRpY3QsXG4gICAgICBnYXRlLFxuICAgICAgY29udHJhY3QsXG4gICAgICBjb250cmFjdFZlcmRpY3QsXG4gICAgICAuLi4oYWxsb3dsaXN0RW5hYmxlZCA/IHsgYWxsb3dlZERpZmZzOiBjb250cmFjdEFsbG93ZWQuYWxsb3dlZERpZmZzIH0gOiB7fSksXG4gICAgfVxuICB9KVxuIiwgImltcG9ydCB7IGZudjFhMzIsIHN0YWJsZVN0cmluZ2lmeSB9IGZyb20gJy4uL2RpZ2VzdC5qcydcbmltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAnLi9qc29uVmFsdWUuanMnXG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93U3RhdGljSXJWMSB9IGZyb20gJy4uL3dvcmtmbG93L21vZGVsLmpzJ1xuXG5leHBvcnQgdHlwZSBDb250cm9sU3VyZmFjZVZlcnNpb24gPSAxXG5cbmV4cG9ydCB0eXBlIERpZ2VzdCA9IHN0cmluZ1xuZXhwb3J0IHR5cGUgTW9kdWxlSWQgPSBzdHJpbmdcbmV4cG9ydCB0eXBlIEFjdGlvblRhZyA9IHN0cmluZ1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dTdGFibGVJZCA9IHN0cmluZ1xuXG5leHBvcnQgdHlwZSBBY3Rpb25SZWYgPSB7IHJlYWRvbmx5IG1vZHVsZUlkOiBNb2R1bGVJZDsgcmVhZG9ubHkgYWN0aW9uVGFnOiBBY3Rpb25UYWcgfVxuXG5leHBvcnQgdHlwZSBFZmZlY3RUcmlnZ2VyID1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdhY3Rpb24nOyByZWFkb25seSBhY3Rpb246IEFjdGlvblJlZiB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnbGlmZWN5Y2xlJzsgcmVhZG9ubHkgcGhhc2U6ICdvblN0YXJ0JyB8ICdvbkluaXQnIH1cblxuZXhwb3J0IHR5cGUgU2xpY2VSZWYgPSB7IHJlYWRvbmx5IGRpZ2VzdDogRGlnZXN0IH1cblxuZXhwb3J0IHR5cGUgV29ya2Zsb3dTdXJmYWNlUmVmVjEgPSBTbGljZVJlZlxuXG5leHBvcnQgdHlwZSBDb250cm9sRWZmZWN0SW5kZXhFbnRyeVYxID1cbiAgfCB7XG4gICAgICByZWFkb25seSBraW5kOiAnd29ya2Zsb3cnXG4gICAgICByZWFkb25seSBlZmZlY3RJZDogc3RyaW5nXG4gICAgICByZWFkb25seSB0cmlnZ2VyOiBFZmZlY3RUcmlnZ2VyXG4gICAgICByZWFkb25seSBwcm9ncmFtSWQ6IFdvcmtmbG93U3RhYmxlSWRcbiAgICAgIHJlYWRvbmx5IHByb2dyYW1EaWdlc3Q/OiBEaWdlc3RcbiAgICB9XG4gIHwge1xuICAgICAgcmVhZG9ubHkga2luZDogJ29wYXF1ZSdcbiAgICAgIHJlYWRvbmx5IGVmZmVjdElkOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IHRyaWdnZXI6IEVmZmVjdFRyaWdnZXJcbiAgICAgIHJlYWRvbmx5IHNvdXJjZUtleTogc3RyaW5nXG4gICAgICByZWFkb25seSBzdW1tYXJ5Pzogc3RyaW5nXG4gICAgfVxuXG5leHBvcnQgdHlwZSBDb250cm9sU3VyZmFjZU1hbmlmZXN0VjEgPSB7XG4gIHJlYWRvbmx5IHZlcnNpb246IENvbnRyb2xTdXJmYWNlVmVyc2lvblxuICByZWFkb25seSBkaWdlc3Q6IERpZ2VzdFxuICByZWFkb25seSBtb2R1bGVzOiBSZWFkb25seUFycmF5PHtcbiAgICByZWFkb25seSBtb2R1bGVJZDogTW9kdWxlSWRcbiAgICByZWFkb25seSB3b3JrZmxvd1N1cmZhY2U/OiBXb3JrZmxvd1N1cmZhY2VSZWZWMVxuICAgIHJlYWRvbmx5IGVmZmVjdHNJbmRleDogUmVhZG9ubHlBcnJheTxDb250cm9sRWZmZWN0SW5kZXhFbnRyeVYxPlxuICAgIHJlYWRvbmx5IGVmZmVjdHNJbmRleERpZ2VzdD86IERpZ2VzdFxuICB9PlxuICByZWFkb25seSBtZXRhPzogeyByZWFkb25seSBnZW5lcmF0b3I/OiBKc29uVmFsdWUgfVxufVxuXG5leHBvcnQgdHlwZSBDb250cm9sU3VyZmFjZU1hbmlmZXN0ID0gQ29udHJvbFN1cmZhY2VNYW5pZmVzdFYxXG5cbmNvbnN0IG1ha2VEaWdlc3QgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4gYGNvbnRyb2xfc3VyZmFjZV92MToke2ZudjFhMzIoc3RhYmxlU3RyaW5naWZ5KHZhbHVlKSl9YFxuXG5leHBvcnQgY29uc3QgZXhwb3J0RWZmZWN0c0luZGV4RGlnZXN0ID0gKGVudHJpZXM6IFJlYWRvbmx5QXJyYXk8Q29udHJvbEVmZmVjdEluZGV4RW50cnlWMT4pOiBEaWdlc3QgPT5cbiAgYGVmZmVjdHNfaW5kZXhfdjE6JHtmbnYxYTMyKHN0YWJsZVN0cmluZ2lmeShlbnRyaWVzKSl9YFxuXG5leHBvcnQgY29uc3QgZXhwb3J0V29ya2Zsb3dFZmZlY3RzSW5kZXggPSAoYXJnczoge1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IHdvcmtmbG93U3VyZmFjZTogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0YXRpY0lyVjE+XG59KTogUmVhZG9ubHlBcnJheTxDb250cm9sRWZmZWN0SW5kZXhFbnRyeVYxPiA9PiB7XG4gIGNvbnN0IG1vZHVsZUlkID0gYXJncy5tb2R1bGVJZFxuICByZXR1cm4gQXJyYXkuZnJvbShhcmdzLndvcmtmbG93U3VyZmFjZSlcbiAgICAuc29ydCgoYSwgYikgPT4gKGEucHJvZ3JhbUlkIDwgYi5wcm9ncmFtSWQgPyAtMSA6IGEucHJvZ3JhbUlkID4gYi5wcm9ncmFtSWQgPyAxIDogMCkpXG4gICAgLm1hcCgoaXIpID0+IHtcbiAgICAgIGNvbnN0IGxvY2FsSWQgPSBpci5wcm9ncmFtSWQuc3RhcnRzV2l0aChgJHttb2R1bGVJZH0uYCkgPyBpci5wcm9ncmFtSWQuc2xpY2UobW9kdWxlSWQubGVuZ3RoICsgMSkgOiBpci5wcm9ncmFtSWRcbiAgICAgIGNvbnN0IHRyaWdnZXJOb2RlID0gaXIubm9kZXMuZmluZCgobikgPT4gbi5raW5kID09PSAndHJpZ2dlcicpXG4gICAgICBjb25zdCB0cmlnZ2VyOiBFZmZlY3RUcmlnZ2VyID1cbiAgICAgICAgdHJpZ2dlck5vZGU/LmtpbmQgPT09ICd0cmlnZ2VyJyAmJiB0cmlnZ2VyTm9kZS50cmlnZ2VyLmtpbmQgPT09ICdhY3Rpb24nXG4gICAgICAgICAgPyB7IGtpbmQ6ICdhY3Rpb24nLCBhY3Rpb246IHsgbW9kdWxlSWQsIGFjdGlvblRhZzogdHJpZ2dlck5vZGUudHJpZ2dlci5hY3Rpb25UYWcgfSB9XG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGtpbmQ6ICdsaWZlY3ljbGUnLFxuICAgICAgICAgICAgICBwaGFzZTpcbiAgICAgICAgICAgICAgICB0cmlnZ2VyTm9kZT8ua2luZCA9PT0gJ3RyaWdnZXInICYmIHRyaWdnZXJOb2RlLnRyaWdnZXIua2luZCA9PT0gJ2xpZmVjeWNsZScgPyB0cmlnZ2VyTm9kZS50cmlnZ2VyLnBoYXNlIDogJ29uU3RhcnQnLFxuICAgICAgICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnd29ya2Zsb3cnLFxuICAgICAgICBlZmZlY3RJZDogYCR7bW9kdWxlSWR9Ojp3b3JrZmxvdzoke2xvY2FsSWR9YCxcbiAgICAgICAgdHJpZ2dlcixcbiAgICAgICAgcHJvZ3JhbUlkOiBpci5wcm9ncmFtSWQsXG4gICAgICAgIHByb2dyYW1EaWdlc3Q6IGlyLmRpZ2VzdCxcbiAgICAgIH0gc2F0aXNmaWVzIENvbnRyb2xFZmZlY3RJbmRleEVudHJ5VjFcbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgZXhwb3J0Q29udHJvbFN1cmZhY2VNYW5pZmVzdCA9IChpbnB1dDogT21pdDxDb250cm9sU3VyZmFjZU1hbmlmZXN0VjEsICdkaWdlc3QnPik6IENvbnRyb2xTdXJmYWNlTWFuaWZlc3RWMSA9PiB7XG4gIGNvbnN0IG1vZHVsZXMgPSBBcnJheS5mcm9tKGlucHV0Lm1vZHVsZXMpLnNvcnQoKGEsIGIpID0+IChhLm1vZHVsZUlkIDwgYi5tb2R1bGVJZCA/IC0xIDogYS5tb2R1bGVJZCA+IGIubW9kdWxlSWQgPyAxIDogMCkpXG4gIGNvbnN0IG1ldGEgPSBpbnB1dC5tZXRhXG5cbiAgY29uc3QgYmFzZSA9IHtcbiAgICB2ZXJzaW9uOiAxIGFzIGNvbnN0LFxuICAgIG1vZHVsZXMsXG4gICAgLi4uKG1ldGEgPyB7IG1ldGEgfSA6IG51bGwpLFxuICB9IHNhdGlzZmllcyBPbWl0PENvbnRyb2xTdXJmYWNlTWFuaWZlc3RWMSwgJ2RpZ2VzdCc+XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5iYXNlLFxuICAgIGRpZ2VzdDogbWFrZURpZ2VzdChiYXNlKSxcbiAgfVxufVxuIiwgImltcG9ydCB7IGZudjFhMzIsIHN0YWJsZVN0cmluZ2lmeSB9IGZyb20gJy4uL2RpZ2VzdC5qcydcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dTdGF0aWNJclYxIH0gZnJvbSAnLi4vd29ya2Zsb3cvbW9kZWwuanMnXG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93U3VyZmFjZVZlcnNpb24gPSAxXG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93U3VyZmFjZVYxID0ge1xuICByZWFkb25seSB2ZXJzaW9uOiBXb3JrZmxvd1N1cmZhY2VWZXJzaW9uXG4gIHJlYWRvbmx5IGRpZ2VzdDogc3RyaW5nXG4gIHJlYWRvbmx5IHByb2dyYW1zOiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RhdGljSXJWMT5cbn1cblxuZXhwb3J0IHR5cGUgV29ya2Zsb3dTdXJmYWNlID0gV29ya2Zsb3dTdXJmYWNlVjFcblxuY29uc3QgbWFrZURpZ2VzdCA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiBgd29ya2Zsb3dfc3VyZmFjZV92MToke2ZudjFhMzIoc3RhYmxlU3RyaW5naWZ5KHZhbHVlKSl9YFxuXG5leHBvcnQgY29uc3QgZXhwb3J0V29ya2Zsb3dTdXJmYWNlID0gKHByb2dyYW1zOiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RhdGljSXJWMT4pOiBXb3JrZmxvd1N1cmZhY2VWMSA9PiB7XG4gIGNvbnN0IHNvcnRlZCA9IEFycmF5LmZyb20ocHJvZ3JhbXMpLnNvcnQoKGEsIGIpID0+XG4gICAgYS5wcm9ncmFtSWQgPCBiLnByb2dyYW1JZCA/IC0xIDogYS5wcm9ncmFtSWQgPiBiLnByb2dyYW1JZCA/IDEgOiAwLFxuICApXG4gIGNvbnN0IGJhc2UgPSB7IHZlcnNpb246IDEgYXMgY29uc3QsIHByb2dyYW1zOiBzb3J0ZWQgfSBhcyBjb25zdFxuICByZXR1cm4geyAuLi5iYXNlLCBkaWdlc3Q6IG1ha2VEaWdlc3QoYmFzZSkgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgV29ya2Zsb3dEZWZWMSB9IGZyb20gJy4uL3dvcmtmbG93L21vZGVsLmpzJ1xuaW1wb3J0IHsgY29tcGlsZVdvcmtmbG93U3RhdGljSXJWMSB9IGZyb20gJy4uL3dvcmtmbG93L2NvbXBpbGVyLmpzJ1xuaW1wb3J0IHR5cGUgeyBKc29uVmFsdWUgfSBmcm9tICcuLi9vYnNlcnZhYmlsaXR5L2pzb25WYWx1ZS5qcydcbmltcG9ydCB7IGV4cG9ydENvbnRyb2xTdXJmYWNlTWFuaWZlc3QsIGV4cG9ydEVmZmVjdHNJbmRleERpZ2VzdCwgZXhwb3J0V29ya2Zsb3dFZmZlY3RzSW5kZXggfSBmcm9tICcuLi9vYnNlcnZhYmlsaXR5L2NvbnRyb2xTdXJmYWNlTWFuaWZlc3QuanMnXG5pbXBvcnQgdHlwZSB7IENvbnRyb2xTdXJmYWNlTWFuaWZlc3RWMSB9IGZyb20gJy4uL29ic2VydmFiaWxpdHkvY29udHJvbFN1cmZhY2VNYW5pZmVzdC5qcydcbmltcG9ydCB7IGV4cG9ydFdvcmtmbG93U3VyZmFjZSB9IGZyb20gJy4uL29ic2VydmFiaWxpdHkvd29ya2Zsb3dTdXJmYWNlLmpzJ1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd1N1cmZhY2VWMSB9IGZyb20gJy4uL29ic2VydmFiaWxpdHkvd29ya2Zsb3dTdXJmYWNlLmpzJ1xuXG5leHBvcnQgdHlwZSBFeHBvcnRlZFdvcmtmbG93U3VyZmFjZSA9IHtcbiAgcmVhZG9ubHkgbW9kdWxlSWQ6IHN0cmluZ1xuICByZWFkb25seSBzdXJmYWNlOiBXb3JrZmxvd1N1cmZhY2VWMVxufVxuXG5leHBvcnQgdHlwZSBFeHBvcnRDb250cm9sU3VyZmFjZVJlc3VsdCA9IHtcbiAgcmVhZG9ubHkgbWFuaWZlc3Q6IENvbnRyb2xTdXJmYWNlTWFuaWZlc3RWMVxuICByZWFkb25seSB3b3JrZmxvd1N1cmZhY2VzOiBSZWFkb25seUFycmF5PEV4cG9ydGVkV29ya2Zsb3dTdXJmYWNlPlxufVxuXG5leHBvcnQgdHlwZSBFeHBvcnRDb250cm9sU3VyZmFjZU9wdGlvbnMgPSB7XG4gIHJlYWRvbmx5IG1ldGE/OiB7IHJlYWRvbmx5IGdlbmVyYXRvcj86IEpzb25WYWx1ZSB9XG59XG5cbmNvbnN0IE1PRFVMRV9JTlRFUk5BTCA9IFN5bWJvbC5mb3IoJ2xvZ2l4Lm1vZHVsZS5pbnRlcm5hbCcpXG5cbmNvbnN0IGlzUmVjb3JkID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcblxuY29uc3QgaXNPYmplY3RMaWtlID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCAoKC4uLmFyZ3M6IG5ldmVyW10pID0+IHVua25vd24pID0+XG4gICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB8fCB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbidcblxuY29uc3QgYXNOb25FbXB0eVN0cmluZyA9ICh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwID8gdmFsdWUudHJpbSgpIDogdW5kZWZpbmVkXG5cbmNvbnN0IHJlc29sdmVUYWdJZCA9ICh0YWc6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzT2JqZWN0TGlrZSh0YWcpKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiBhc05vbkVtcHR5U3RyaW5nKCh0YWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmlkKVxufVxuXG5jb25zdCByZXNvbHZlTW9kdWxlSWRPclRocm93ID0gKG1vZHVsZTogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChpc1JlY29yZChtb2R1bGUpICYmIG1vZHVsZS5fdGFnID09PSAnTW9kdWxlSW1wbCcpIHtcbiAgICBjb25zdCBpZCA9IHJlc29sdmVUYWdJZChtb2R1bGUubW9kdWxlKVxuICAgIGlmIChpZCkgcmV0dXJuIGlkXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ1tDb250cm9sU3VyZmFjZU1hbmlmZXN0XSBGYWlsZWQgdG8gcmVzb2x2ZSBtb2R1bGVJZCBmcm9tIE1vZHVsZUltcGwubW9kdWxlLmlkLlxcbicgK1xuICAgICAgICAnRml4OiBwYXNzIGEgY29uZmlndXJlZCBNb2R1bGUvTW9kdWxlSW1wbCAoaGFzIC5pZC8udGFnLmlkLy5tb2R1bGUuaWQpLCBub3QgYSByZWFkLW9ubHkgaGFuZGxlLicsXG4gICAgKVxuICB9XG5cbiAgaWYgKGlzUmVjb3JkKG1vZHVsZSkpIHtcbiAgICBjb25zdCBpZCA9IGFzTm9uRW1wdHlTdHJpbmcobW9kdWxlLmlkKVxuICAgIGlmIChpZCkgcmV0dXJuIGlkXG4gICAgY29uc3QgdGFnSWQgPSByZXNvbHZlVGFnSWQobW9kdWxlLnRhZylcbiAgICBpZiAodGFnSWQpIHJldHVybiB0YWdJZFxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICdbQ29udHJvbFN1cmZhY2VNYW5pZmVzdF0gRmFpbGVkIHRvIHJlc29sdmUgbW9kdWxlSWQuXFxuJyArXG4gICAgICAnRml4OiBwYXNzIGEgY29uZmlndXJlZCBNb2R1bGUvTW9kdWxlSW1wbCAoaGFzIC5pZC8udGFnLmlkLy5tb2R1bGUuaWQpLCBub3QgYSByZWFkLW9ubHkgaGFuZGxlLicsXG4gIClcbn1cblxuY29uc3QgcmVzb2x2ZVdvcmtmbG93RGVmcyA9IChtb2R1bGU6IHVua25vd24pOiBSZWFkb25seUFycmF5PFdvcmtmbG93RGVmVjE+ID0+IHtcbiAgaWYgKCFpc09iamVjdExpa2UobW9kdWxlKSkgcmV0dXJuIFtdXG4gIGNvbnN0IGludGVybmFsID0gKG1vZHVsZSBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+KVtNT0RVTEVfSU5URVJOQUxdXG4gIGNvbnN0IGRlZnMgPSBpc1JlY29yZChpbnRlcm5hbCkgPyBpbnRlcm5hbC53b3JrZmxvd0RlZnMgOiB1bmRlZmluZWRcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZGVmcykgPyAoZGVmcyBhcyBSZWFkb25seUFycmF5PFdvcmtmbG93RGVmVjE+KSA6IFtdXG59XG5cbmV4cG9ydCBjb25zdCBleHBvcnRDb250cm9sU3VyZmFjZSA9IChcbiAgbW9kdWxlczogUmVhZG9ubHlBcnJheTx1bmtub3duPixcbiAgb3B0aW9ucz86IEV4cG9ydENvbnRyb2xTdXJmYWNlT3B0aW9ucyxcbik6IEV4cG9ydENvbnRyb2xTdXJmYWNlUmVzdWx0ID0+IHtcbiAgY29uc3QgZW50cmllczogQXJyYXk8Q29udHJvbFN1cmZhY2VNYW5pZmVzdFYxWydtb2R1bGVzJ11bbnVtYmVyXT4gPSBbXVxuICBjb25zdCB3b3JrZmxvd1N1cmZhY2VzOiBBcnJheTxFeHBvcnRlZFdvcmtmbG93U3VyZmFjZT4gPSBbXVxuXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKVxuXG4gIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICBjb25zdCBtb2R1bGVJZCA9IHJlc29sdmVNb2R1bGVJZE9yVGhyb3cobW9kdWxlKVxuICAgIGlmIChzZWVuLmhhcyhtb2R1bGVJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW0NvbnRyb2xTdXJmYWNlTWFuaWZlc3RdIER1cGxpY2F0ZSBtb2R1bGVJZCBcIiR7bW9kdWxlSWR9XCIuYClcbiAgICB9XG4gICAgc2Vlbi5hZGQobW9kdWxlSWQpXG5cbiAgICBjb25zdCBkZWZzID0gcmVzb2x2ZVdvcmtmbG93RGVmcyhtb2R1bGUpXG4gICAgaWYgKGRlZnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBlbnRyaWVzLnB1c2goeyBtb2R1bGVJZCwgZWZmZWN0c0luZGV4OiBbXSB9KVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCB3b3JrZmxvd0lycyA9IGRlZnMubWFwKChkZWYpID0+IGNvbXBpbGVXb3JrZmxvd1N0YXRpY0lyVjEoeyBtb2R1bGVJZCwgZGVmIH0pKVxuICAgIGNvbnN0IHN1cmZhY2UgPSBleHBvcnRXb3JrZmxvd1N1cmZhY2Uod29ya2Zsb3dJcnMpXG4gICAgd29ya2Zsb3dTdXJmYWNlcy5wdXNoKHsgbW9kdWxlSWQsIHN1cmZhY2UgfSlcblxuICAgIGNvbnN0IGVmZmVjdHNJbmRleCA9IGV4cG9ydFdvcmtmbG93RWZmZWN0c0luZGV4KHsgbW9kdWxlSWQsIHdvcmtmbG93U3VyZmFjZTogc3VyZmFjZS5wcm9ncmFtcyB9KVxuICAgIGNvbnN0IGVmZmVjdHNJbmRleERpZ2VzdCA9IGVmZmVjdHNJbmRleC5sZW5ndGggPiAwID8gZXhwb3J0RWZmZWN0c0luZGV4RGlnZXN0KGVmZmVjdHNJbmRleCkgOiB1bmRlZmluZWRcblxuICAgIGVudHJpZXMucHVzaCh7XG4gICAgICBtb2R1bGVJZCxcbiAgICAgIHdvcmtmbG93U3VyZmFjZTogeyBkaWdlc3Q6IHN1cmZhY2UuZGlnZXN0IH0sXG4gICAgICBlZmZlY3RzSW5kZXgsXG4gICAgICAuLi4oZWZmZWN0c0luZGV4RGlnZXN0ID8geyBlZmZlY3RzSW5kZXhEaWdlc3QgfSA6IG51bGwpLFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBtYW5pZmVzdCA9IGV4cG9ydENvbnRyb2xTdXJmYWNlTWFuaWZlc3Qoe1xuICAgIHZlcnNpb246IDEgYXMgY29uc3QsXG4gICAgbW9kdWxlczogZW50cmllcyxcbiAgICAuLi4ob3B0aW9ucz8ubWV0YSA/IHsgbWV0YTogb3B0aW9ucy5tZXRhIH0gOiBudWxsKSxcbiAgfSlcblxuICByZXR1cm4geyBtYW5pZmVzdCwgd29ya2Zsb3dTdXJmYWNlcyB9XG59XG4iLCAiaW1wb3J0IHsgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSAnLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHR5cGUgeyBKc29uVmFsdWUgfSBmcm9tICcuLi9vYnNlcnZhYmlsaXR5L2pzb25WYWx1ZS5qcydcbmltcG9ydCB0eXBlIHsgTW9kdWxlTWFuaWZlc3QsIE1vZHVsZU1hbmlmZXN0TG9naWNVbml0IH0gZnJvbSAnLi9tYW5pZmVzdC5qcydcblxuZXhwb3J0IHR5cGUgTWFuaWZlc3REaWZmU2V2ZXJpdHkgPSAnQlJFQUtJTkcnIHwgJ1JJU0tZJyB8ICdJTkZPJ1xuZXhwb3J0IHR5cGUgTWFuaWZlc3REaWZmVmVyZGljdCA9ICdQQVNTJyB8ICdXQVJOJyB8ICdGQUlMJ1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0RGlmZkNoYW5nZSB7XG4gIHJlYWRvbmx5IHNldmVyaXR5OiBNYW5pZmVzdERpZmZTZXZlcml0eVxuICByZWFkb25seSBjb2RlOiBzdHJpbmdcbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZ1xuICByZWFkb25seSBwb2ludGVyPzogc3RyaW5nXG4gIHJlYWRvbmx5IGRldGFpbHM/OiBKc29uVmFsdWVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVNYW5pZmVzdERpZmZTdW1tYXJ5IHtcbiAgcmVhZG9ubHkgYnJlYWtpbmc6IG51bWJlclxuICByZWFkb25seSByaXNreTogbnVtYmVyXG4gIHJlYWRvbmx5IGluZm86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1vZHVsZU1hbmlmZXN0RGlmZiB7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGJlZm9yZToge1xuICAgIHJlYWRvbmx5IGRpZ2VzdDogc3RyaW5nXG4gICAgcmVhZG9ubHkgbWFuaWZlc3RWZXJzaW9uPzogc3RyaW5nXG4gIH1cbiAgcmVhZG9ubHkgYWZ0ZXI6IHtcbiAgICByZWFkb25seSBkaWdlc3Q6IHN0cmluZ1xuICAgIHJlYWRvbmx5IG1hbmlmZXN0VmVyc2lvbj86IHN0cmluZ1xuICB9XG4gIHJlYWRvbmx5IHZlcmRpY3Q6IE1hbmlmZXN0RGlmZlZlcmRpY3RcbiAgcmVhZG9ubHkgY2hhbmdlczogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdERpZmZDaGFuZ2U+XG4gIHJlYWRvbmx5IHN1bW1hcnk6IE1vZHVsZU1hbmlmZXN0RGlmZlN1bW1hcnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaWZmTWFuaWZlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIG1ldGFBbGxvd2xpc3RcdUZGMUFcbiAgICogLSBXaGVuIG9taXR0ZWQ6IGRpZmYgYWxsIG1ldGEga2V5cyAoZGVmYXVsdHMgdG8gdHJlYXRpbmcgYWxsIGNoYW5nZXMgYXMgUklTS1kpLlxuICAgKiAtIFdoZW4gcHJvdmlkZWQ6IG9ubHkgZGlmZiBhbGxvd2xpc3RlZCBrZXlzIChvdGhlcnMgYXJlIGlnbm9yZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0YUFsbG93bGlzdD86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxufVxuXG5jb25zdCBTRVZFUklUWV9SQU5LOiBSZWNvcmQ8TWFuaWZlc3REaWZmU2V2ZXJpdHksIG51bWJlcj4gPSB7XG4gIEJSRUFLSU5HOiAwLFxuICBSSVNLWTogMSxcbiAgSU5GTzogMixcbn1cblxuY29uc3QgdW5pcVNvcnRlZCA9IChpbnB1dDogUmVhZG9ubHlBcnJheTxzdHJpbmc+KTogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0+IHtcbiAgY29uc3Qgb3V0ID0gQXJyYXkuZnJvbShuZXcgU2V0KGlucHV0LmZpbHRlcigoeCkgPT4gdHlwZW9mIHggPT09ICdzdHJpbmcnICYmIHgubGVuZ3RoID4gMCkpKVxuICBvdXQuc29ydCgpXG4gIHJldHVybiBvdXRcbn1cblxuY29uc3QgZGlmZlN0cmluZ0tleXMgPSAoXG4gIGJlZm9yZTogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkLFxuICBhZnRlcjogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkLFxuKTogeyByZWFkb25seSByZW1vdmVkOiBSZWFkb25seUFycmF5PHN0cmluZz47IHJlYWRvbmx5IGFkZGVkOiBSZWFkb25seUFycmF5PHN0cmluZz4gfSA9PiB7XG4gIGNvbnN0IGJlZm9yZVNldCA9IG5ldyBTZXQodW5pcVNvcnRlZChiZWZvcmUgPz8gW10pKVxuICBjb25zdCBhZnRlclNldCA9IG5ldyBTZXQodW5pcVNvcnRlZChhZnRlciA/PyBbXSkpXG5cbiAgY29uc3QgcmVtb3ZlZDogc3RyaW5nW10gPSBbXVxuICBmb3IgKGNvbnN0IGsgb2YgYmVmb3JlU2V0KSB7XG4gICAgaWYgKCFhZnRlclNldC5oYXMoaykpIHJlbW92ZWQucHVzaChrKVxuICB9XG4gIHJlbW92ZWQuc29ydCgpXG5cbiAgY29uc3QgYWRkZWQ6IHN0cmluZ1tdID0gW11cbiAgZm9yIChjb25zdCBrIG9mIGFmdGVyU2V0KSB7XG4gICAgaWYgKCFiZWZvcmVTZXQuaGFzKGspKSBhZGRlZC5wdXNoKGspXG4gIH1cbiAgYWRkZWQuc29ydCgpXG5cbiAgcmV0dXJuIHsgcmVtb3ZlZCwgYWRkZWQgfVxufVxuXG5jb25zdCBlcUpzb25WYWx1ZSA9IChhOiB1bmtub3duLCBiOiB1bmtub3duKTogYm9vbGVhbiA9PiBzdGFibGVTdHJpbmdpZnkoYSkgPT09IHN0YWJsZVN0cmluZ2lmeShiKVxuXG5jb25zdCBpbmRleExvZ2ljVW5pdHMgPSAoXG4gIGlucHV0OiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0TG9naWNVbml0PiB8IHVuZGVmaW5lZCxcbik6IFJlYWRvbmx5TWFwPHN0cmluZywgTW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+ID0+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIE1vZHVsZU1hbmlmZXN0TG9naWNVbml0PigpXG4gIGZvciAoY29uc3QgdW5pdCBvZiBpbnB1dCA/PyBbXSkge1xuICAgIGlmICghdW5pdCB8fCB0eXBlb2YgdW5pdCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlXG4gICAgY29uc3QgaWQgPSAodW5pdCBhcyBhbnkpLmlkXG4gICAgaWYgKHR5cGVvZiBpZCAhPT0gJ3N0cmluZycgfHwgaWQubGVuZ3RoID09PSAwKSBjb250aW51ZVxuICAgIG1hcC5zZXQoaWQsIHVuaXQpXG4gIH1cbiAgcmV0dXJuIG1hcFxufVxuXG5leHBvcnQgY29uc3QgZGlmZk1hbmlmZXN0ID0gKFxuICBiZWZvcmU6IE1vZHVsZU1hbmlmZXN0LFxuICBhZnRlcjogTW9kdWxlTWFuaWZlc3QsXG4gIG9wdGlvbnM/OiBEaWZmTWFuaWZlc3RPcHRpb25zLFxuKTogTW9kdWxlTWFuaWZlc3REaWZmID0+IHtcbiAgY29uc3QgY2hhbmdlczogTW9kdWxlTWFuaWZlc3REaWZmQ2hhbmdlW10gPSBbXVxuXG4gIC8vIElkZW50aXR5IC8gcHJvdG9jb2xcbiAgaWYgKGJlZm9yZS5tb2R1bGVJZCAhPT0gYWZ0ZXIubW9kdWxlSWQpIHtcbiAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgc2V2ZXJpdHk6ICdCUkVBS0lORycsXG4gICAgICBjb2RlOiAnbW9kdWxlSWQuY2hhbmdlZCcsXG4gICAgICBtZXNzYWdlOiBgbW9kdWxlSWQgY2hhbmdlZCAoJHtiZWZvcmUubW9kdWxlSWR9IC0+ICR7YWZ0ZXIubW9kdWxlSWR9KWAsXG4gICAgICBwb2ludGVyOiAnL21vZHVsZUlkJyxcbiAgICAgIGRldGFpbHM6IHtcbiAgICAgICAgYmVmb3JlOiBiZWZvcmUubW9kdWxlSWQsXG4gICAgICAgIGFmdGVyOiBhZnRlci5tb2R1bGVJZCxcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIGlmIChiZWZvcmUubWFuaWZlc3RWZXJzaW9uICE9PSBhZnRlci5tYW5pZmVzdFZlcnNpb24pIHtcbiAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgc2V2ZXJpdHk6ICdJTkZPJyxcbiAgICAgIGNvZGU6ICdtYW5pZmVzdFZlcnNpb24uY2hhbmdlZCcsXG4gICAgICBtZXNzYWdlOiBgbWFuaWZlc3RWZXJzaW9uIGNoYW5nZWQgKCR7YmVmb3JlLm1hbmlmZXN0VmVyc2lvbn0gLT4gJHthZnRlci5tYW5pZmVzdFZlcnNpb259KWAsXG4gICAgICBwb2ludGVyOiAnL21hbmlmZXN0VmVyc2lvbicsXG4gICAgICBkZXRhaWxzOiB7XG4gICAgICAgIGJlZm9yZTogYmVmb3JlLm1hbmlmZXN0VmVyc2lvbixcbiAgICAgICAgYWZ0ZXI6IGFmdGVyLm1hbmlmZXN0VmVyc2lvbixcbiAgICAgIH0sXG4gICAgfSlcbiAgfVxuXG4gIC8vIGFjdGlvbktleXNcbiAge1xuICAgIGNvbnN0IHsgcmVtb3ZlZCwgYWRkZWQgfSA9IGRpZmZTdHJpbmdLZXlzKGJlZm9yZS5hY3Rpb25LZXlzLCBhZnRlci5hY3Rpb25LZXlzKVxuICAgIGlmIChyZW1vdmVkLmxlbmd0aCA+IDAgfHwgYWRkZWQubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6IHJlbW92ZWQubGVuZ3RoID4gMCA/ICdCUkVBS0lORycgOiAnSU5GTycsXG4gICAgICAgIGNvZGU6ICdhY3Rpb25LZXlzLmNoYW5nZWQnLFxuICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgIHJlbW92ZWQubGVuZ3RoID4gMCA/IGBhY3Rpb25LZXlzIHJlbW92ZWQ6ICR7cmVtb3ZlZC5qb2luKCcsICcpfWAgOiBgYWN0aW9uS2V5cyBhZGRlZDogJHthZGRlZC5qb2luKCcsICcpfWAsXG4gICAgICAgIHBvaW50ZXI6ICcvYWN0aW9uS2V5cycsXG4gICAgICAgIGRldGFpbHM6IHsgcmVtb3ZlZCwgYWRkZWQgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLy8gc2NoZW1hS2V5c1xuICB7XG4gICAgY29uc3QgeyByZW1vdmVkLCBhZGRlZCB9ID0gZGlmZlN0cmluZ0tleXMoYmVmb3JlLnNjaGVtYUtleXMsIGFmdGVyLnNjaGVtYUtleXMpXG4gICAgaWYgKHJlbW92ZWQubGVuZ3RoID4gMCB8fCBhZGRlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBzZXZlcml0eTogcmVtb3ZlZC5sZW5ndGggPiAwID8gJ0JSRUFLSU5HJyA6ICdJTkZPJyxcbiAgICAgICAgY29kZTogJ3NjaGVtYUtleXMuY2hhbmdlZCcsXG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgcmVtb3ZlZC5sZW5ndGggPiAwID8gYHNjaGVtYUtleXMgcmVtb3ZlZDogJHtyZW1vdmVkLmpvaW4oJywgJyl9YCA6IGBzY2hlbWFLZXlzIGFkZGVkOiAke2FkZGVkLmpvaW4oJywgJyl9YCxcbiAgICAgICAgcG9pbnRlcjogJy9zY2hlbWFLZXlzJyxcbiAgICAgICAgZGV0YWlsczogeyByZW1vdmVkLCBhZGRlZCB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBsb2dpY1VuaXRzIChzbG90cylcbiAge1xuICAgIGNvbnN0IGJlZm9yZUJ5SWQgPSBpbmRleExvZ2ljVW5pdHMoYmVmb3JlLmxvZ2ljVW5pdHMpXG4gICAgY29uc3QgYWZ0ZXJCeUlkID0gaW5kZXhMb2dpY1VuaXRzKGFmdGVyLmxvZ2ljVW5pdHMpXG5cbiAgICBjb25zdCByZW1vdmVkOiBzdHJpbmdbXSA9IFtdXG4gICAgY29uc3QgYWRkZWQ6IHN0cmluZ1tdID0gW11cbiAgICBjb25zdCBraW5kQ2hhbmdlZDogQXJyYXk8eyByZWFkb25seSBpZDogc3RyaW5nOyByZWFkb25seSBiZWZvcmU6IHN0cmluZzsgcmVhZG9ubHkgYWZ0ZXI6IHN0cmluZyB9PiA9IFtdXG4gICAgY29uc3Qgcmlza3lDaGFuZ2VkOiBBcnJheTx7IHJlYWRvbmx5IGlkOiBzdHJpbmc7IHJlYWRvbmx5IGZpZWxkczogUmVhZG9ubHlBcnJheTxzdHJpbmc+IH0+ID0gW11cblxuICAgIGZvciAoY29uc3QgaWQgb2YgYmVmb3JlQnlJZC5rZXlzKCkpIHtcbiAgICAgIGlmICghYWZ0ZXJCeUlkLmhhcyhpZCkpIHJlbW92ZWQucHVzaChpZClcbiAgICB9XG4gICAgZm9yIChjb25zdCBpZCBvZiBhZnRlckJ5SWQua2V5cygpKSB7XG4gICAgICBpZiAoIWJlZm9yZUJ5SWQuaGFzKGlkKSkgYWRkZWQucHVzaChpZClcbiAgICB9XG5cbiAgICByZW1vdmVkLnNvcnQoKVxuICAgIGFkZGVkLnNvcnQoKVxuXG4gICAgZm9yIChjb25zdCBpZCBvZiBiZWZvcmVCeUlkLmtleXMoKSkge1xuICAgICAgY29uc3QgYiA9IGJlZm9yZUJ5SWQuZ2V0KGlkKVxuICAgICAgY29uc3QgYSA9IGFmdGVyQnlJZC5nZXQoaWQpXG4gICAgICBpZiAoIWIgfHwgIWEpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXVxuICAgICAgaWYgKGIua2luZCAhPT0gYS5raW5kKSB7XG4gICAgICAgIGtpbmRDaGFuZ2VkLnB1c2goeyBpZCwgYmVmb3JlOiBiLmtpbmQsIGFmdGVyOiBhLmtpbmQgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChiLm5hbWUgIT09IGEubmFtZSkgZmllbGRzLnB1c2goJ25hbWUnKVxuICAgICAgaWYgKGIuZGVyaXZlZCAhPT0gYS5kZXJpdmVkKSBmaWVsZHMucHVzaCgnZGVyaXZlZCcpXG4gICAgICBpZiAoZmllbGRzLmxlbmd0aCA+IDApIHJpc2t5Q2hhbmdlZC5wdXNoKHsgaWQsIGZpZWxkcyB9KVxuICAgIH1cblxuICAgIGtpbmRDaGFuZ2VkLnNvcnQoKHgsIHkpID0+ICh4LmlkIDwgeS5pZCA/IC0xIDogeC5pZCA+IHkuaWQgPyAxIDogMCkpXG4gICAgcmlza3lDaGFuZ2VkLnNvcnQoKHgsIHkpID0+ICh4LmlkIDwgeS5pZCA/IC0xIDogeC5pZCA+IHkuaWQgPyAxIDogMCkpXG5cbiAgICBpZiAocmVtb3ZlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBzZXZlcml0eTogJ0JSRUFLSU5HJyxcbiAgICAgICAgY29kZTogJ2xvZ2ljVW5pdHMucmVtb3ZlZCcsXG4gICAgICAgIG1lc3NhZ2U6IGBsb2dpY1VuaXRzIHJlbW92ZWQ6ICR7cmVtb3ZlZC5qb2luKCcsICcpfWAsXG4gICAgICAgIHBvaW50ZXI6ICcvbG9naWNVbml0cycsXG4gICAgICAgIGRldGFpbHM6IHsgcmVtb3ZlZCB9LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoa2luZENoYW5nZWQubGVuZ3RoID4gMCkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6ICdCUkVBS0lORycsXG4gICAgICAgIGNvZGU6ICdsb2dpY1VuaXRzLmtpbmRDaGFuZ2VkJyxcbiAgICAgICAgbWVzc2FnZTogYGxvZ2ljVW5pdHMga2luZCBjaGFuZ2VkOiAke2tpbmRDaGFuZ2VkLm1hcCgoeCkgPT4geC5pZCkuam9pbignLCAnKX1gLFxuICAgICAgICBwb2ludGVyOiAnL2xvZ2ljVW5pdHMnLFxuICAgICAgICBkZXRhaWxzOiB7IGtpbmRDaGFuZ2VkIH0sXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmIChhZGRlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBzZXZlcml0eTogJ0lORk8nLFxuICAgICAgICBjb2RlOiAnbG9naWNVbml0cy5hZGRlZCcsXG4gICAgICAgIG1lc3NhZ2U6IGBsb2dpY1VuaXRzIGFkZGVkOiAke2FkZGVkLmpvaW4oJywgJyl9YCxcbiAgICAgICAgcG9pbnRlcjogJy9sb2dpY1VuaXRzJyxcbiAgICAgICAgZGV0YWlsczogeyBhZGRlZCB9LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAocmlza3lDaGFuZ2VkLmxlbmd0aCA+IDApIHtcbiAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgIHNldmVyaXR5OiAnUklTS1knLFxuICAgICAgICBjb2RlOiAnbG9naWNVbml0cy5jaGFuZ2VkJyxcbiAgICAgICAgbWVzc2FnZTogYGxvZ2ljVW5pdHMgY2hhbmdlZDogJHtyaXNreUNoYW5nZWQubWFwKCh4KSA9PiB4LmlkKS5qb2luKCcsICcpfWAsXG4gICAgICAgIHBvaW50ZXI6ICcvbG9naWNVbml0cycsXG4gICAgICAgIGRldGFpbHM6IHsgY2hhbmdlZDogcmlza3lDaGFuZ2VkIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIHN0YXRpY0lyLmRpZ2VzdFxuICB7XG4gICAgY29uc3QgYmVmb3JlRGlnZXN0ID0gYmVmb3JlLnN0YXRpY0lyPy5kaWdlc3RcbiAgICBjb25zdCBhZnRlckRpZ2VzdCA9IGFmdGVyLnN0YXRpY0lyPy5kaWdlc3RcbiAgICBpZiAoYmVmb3JlRGlnZXN0ICE9PSBhZnRlckRpZ2VzdCkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6ICdSSVNLWScsXG4gICAgICAgIGNvZGU6ICdzdGF0aWNJci5kaWdlc3RDaGFuZ2VkJyxcbiAgICAgICAgbWVzc2FnZTogJ3N0YXRpY0lyLmRpZ2VzdCBjaGFuZ2VkJyxcbiAgICAgICAgcG9pbnRlcjogJy9zdGF0aWNJci9kaWdlc3QnLFxuICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgYmVmb3JlOiBiZWZvcmVEaWdlc3QgPz8gbnVsbCxcbiAgICAgICAgICBhZnRlcjogYWZ0ZXJEaWdlc3QgPz8gbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLy8gbWV0YSAoZGVmYXVsdDogUklTS1ksIGFsbG93bGlzdCBzdXBwb3J0ZWQpXG4gIHtcbiAgICBjb25zdCBtZXRhQmVmb3JlID0gYmVmb3JlLm1ldGEgPz8ge31cbiAgICBjb25zdCBtZXRhQWZ0ZXIgPSBhZnRlci5tZXRhID8/IHt9XG5cbiAgICBjb25zdCBhbGxvd2xpc3QgPSBvcHRpb25zPy5tZXRhQWxsb3dsaXN0XG4gICAgY29uc3Qga2V5cyA9XG4gICAgICBhbGxvd2xpc3QgIT0gbnVsbCA/IHVuaXFTb3J0ZWQoYWxsb3dsaXN0KSA6IHVuaXFTb3J0ZWQoWy4uLk9iamVjdC5rZXlzKG1ldGFCZWZvcmUpLCAuLi5PYmplY3Qua2V5cyhtZXRhQWZ0ZXIpXSlcblxuICAgIGNvbnN0IGNoYW5nZWQ6IEFycmF5PHtcbiAgICAgIHJlYWRvbmx5IGtleTogc3RyaW5nXG4gICAgICByZWFkb25seSBiZWZvcmU6IEpzb25WYWx1ZSB8IG51bGxcbiAgICAgIHJlYWRvbmx5IGFmdGVyOiBKc29uVmFsdWUgfCBudWxsXG4gICAgfT4gPSBbXVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3QgYiA9IGtleSBpbiBtZXRhQmVmb3JlID8gKG1ldGFCZWZvcmUgYXMgYW55KVtrZXldIDogdW5kZWZpbmVkXG4gICAgICBjb25zdCBhID0ga2V5IGluIG1ldGFBZnRlciA/IChtZXRhQWZ0ZXIgYXMgYW55KVtrZXldIDogdW5kZWZpbmVkXG4gICAgICBpZiAoIWVxSnNvblZhbHVlKGIsIGEpKSB7XG4gICAgICAgIGNoYW5nZWQucHVzaCh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGJlZm9yZTogKGIgPz8gbnVsbCkgYXMgSnNvblZhbHVlIHwgbnVsbCxcbiAgICAgICAgICBhZnRlcjogKGEgPz8gbnVsbCkgYXMgSnNvblZhbHVlIHwgbnVsbCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlZC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBzZXZlcml0eTogJ1JJU0tZJyxcbiAgICAgICAgY29kZTogJ21ldGEuY2hhbmdlZCcsXG4gICAgICAgIG1lc3NhZ2U6ICdtZXRhIGNoYW5nZWQnLFxuICAgICAgICBwb2ludGVyOiAnL21ldGEnLFxuICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAga2V5czogY2hhbmdlZC5tYXAoKHgpID0+IHgua2V5KSxcbiAgICAgICAgICBjaGFuZ2VkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBzb3VyY2UgKGRlZmF1bHQ6IElORk8pXG4gIHtcbiAgICBjb25zdCBiID0gYmVmb3JlLnNvdXJjZVxuICAgIGNvbnN0IGEgPSBhZnRlci5zb3VyY2VcbiAgICBpZiAoIWVxSnNvblZhbHVlKGIgPz8gbnVsbCwgYSA/PyBudWxsKSkge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgc2V2ZXJpdHk6ICdJTkZPJyxcbiAgICAgICAgY29kZTogJ3NvdXJjZS5jaGFuZ2VkJyxcbiAgICAgICAgbWVzc2FnZTogJ3NvdXJjZSBjaGFuZ2VkJyxcbiAgICAgICAgcG9pbnRlcjogJy9zb3VyY2UnLFxuICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgYmVmb3JlOiBiID8/IG51bGwsXG4gICAgICAgICAgYWZ0ZXI6IGEgPz8gbnVsbCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgY2hhbmdlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgcmEgPSBTRVZFUklUWV9SQU5LW2Euc2V2ZXJpdHldXG4gICAgY29uc3QgcmIgPSBTRVZFUklUWV9SQU5LW2Iuc2V2ZXJpdHldXG4gICAgaWYgKHJhICE9PSByYikgcmV0dXJuIHJhIC0gcmJcbiAgICBpZiAoYS5jb2RlICE9PSBiLmNvZGUpIHJldHVybiBhLmNvZGUgPCBiLmNvZGUgPyAtMSA6IDFcbiAgICBjb25zdCBwYSA9IGEucG9pbnRlciA/PyAnJ1xuICAgIGNvbnN0IHBiID0gYi5wb2ludGVyID8/ICcnXG4gICAgaWYgKHBhICE9PSBwYikgcmV0dXJuIHBhIDwgcGIgPyAtMSA6IDFcbiAgICByZXR1cm4gMFxuICB9KVxuXG4gIGNvbnN0IHN1bW1hcnk6IE1vZHVsZU1hbmlmZXN0RGlmZlN1bW1hcnkgPSB7XG4gICAgYnJlYWtpbmc6IGNoYW5nZXMuZmlsdGVyKChjKSA9PiBjLnNldmVyaXR5ID09PSAnQlJFQUtJTkcnKS5sZW5ndGgsXG4gICAgcmlza3k6IGNoYW5nZXMuZmlsdGVyKChjKSA9PiBjLnNldmVyaXR5ID09PSAnUklTS1knKS5sZW5ndGgsXG4gICAgaW5mbzogY2hhbmdlcy5maWx0ZXIoKGMpID0+IGMuc2V2ZXJpdHkgPT09ICdJTkZPJykubGVuZ3RoLFxuICB9XG5cbiAgY29uc3QgdmVyZGljdDogTWFuaWZlc3REaWZmVmVyZGljdCA9IHN1bW1hcnkuYnJlYWtpbmcgPiAwID8gJ0ZBSUwnIDogc3VtbWFyeS5yaXNreSA+IDAgPyAnV0FSTicgOiAnUEFTUydcblxuICByZXR1cm4ge1xuICAgIHZlcnNpb246ICcwMjUnLFxuICAgIG1vZHVsZUlkOiBhZnRlci5tb2R1bGVJZCxcbiAgICBiZWZvcmU6IHtcbiAgICAgIGRpZ2VzdDogYmVmb3JlLmRpZ2VzdCxcbiAgICAgIG1hbmlmZXN0VmVyc2lvbjogYmVmb3JlLm1hbmlmZXN0VmVyc2lvbixcbiAgICB9LFxuICAgIGFmdGVyOiB7XG4gICAgICBkaWdlc3Q6IGFmdGVyLmRpZ2VzdCxcbiAgICAgIG1hbmlmZXN0VmVyc2lvbjogYWZ0ZXIubWFuaWZlc3RWZXJzaW9uLFxuICAgIH0sXG4gICAgdmVyZGljdCxcbiAgICBjaGFuZ2VzLFxuICAgIHN1bW1hcnksXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDb250ZXh0LCBFZmZlY3QsIEV4aXQsIExheWVyIH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0IHR5cGUgeyBNb2R1bGVJbXBsLCBBbnlNb2R1bGVTaGFwZSB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9tb2R1bGUuanMnXG5pbXBvcnQgdHlwZSB7IE1vZHVsZVJ1bnRpbWUgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0IHsgdHJpYWxSdW4gfSBmcm9tICcuLi9vYnNlcnZhYmlsaXR5L3RyaWFsUnVuLmpzJ1xuaW1wb3J0IHR5cGUgeyBFdmlkZW5jZVBhY2thZ2UgfSBmcm9tICcuLi9vYnNlcnZhYmlsaXR5L2V2aWRlbmNlLmpzJ1xuaW1wb3J0IHR5cGUgeyBKc29uVmFsdWUgfSBmcm9tICcuLi9vYnNlcnZhYmlsaXR5L2pzb25WYWx1ZS5qcydcbmltcG9ydCB7IGZudjFhMzIsIHN0YWJsZVN0cmluZ2lmeSB9IGZyb20gJy4uL2RpZ2VzdC5qcydcbmltcG9ydCB0eXBlIHsgTWlkZGxld2FyZSB9IGZyb20gJy4uL2VmZmVjdC1vcC5qcydcbmltcG9ydCAqIGFzIERlYnVnIGZyb20gJy4uL3J1bnRpbWUvY29yZS9EZWJ1Z1NpbmsuanMnXG5pbXBvcnQgKiBhcyBFZmZlY3RPcENvcmUgZnJvbSAnLi4vcnVudGltZS9jb3JlL0VmZmVjdE9wQ29yZS5qcydcbmltcG9ydCAqIGFzIEtlcm5lbFJlZiBmcm9tICcuLi9ydW50aW1lL2NvcmUvS2VybmVsUmVmLmpzJ1xuaW1wb3J0IHR5cGUgKiBhcyBSdW50aW1lS2VybmVsIGZyb20gJy4uL3J1bnRpbWUvY29yZS9SdW50aW1lS2VybmVsLmpzJ1xuXG50eXBlIEFueU1vZHVsZUxpa2UgPSB7IHJlYWRvbmx5IGltcGw6IE1vZHVsZUltcGw8YW55LCBBbnlNb2R1bGVTaGFwZSwgYW55PiB9XG5cbnR5cGUgUm9vdExpa2U8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZT4gPSBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4gfCBBbnlNb2R1bGVMaWtlXG5cbmNvbnN0IHJlc29sdmVSb290SW1wbCA9IDxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPihyb290OiBSb290TGlrZTxTaD4pOiBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4gPT5cbiAgKChyb290IGFzIGFueSk/Ll90YWcgPT09ICdNb2R1bGVJbXBsJ1xuICAgID8gKHJvb3QgYXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+KVxuICAgIDogKChyb290IGFzIGFueSk/LmltcGwgYXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+KSkgc2F0aXNmaWVzIE1vZHVsZUltcGw8YW55LCBTaCwgYW55PlxuXG5leHBvcnQgdHlwZSBLZXJuZWxDb250cmFjdFZlcmRpY3QgPSAnUEFTUycgfCAnRkFJTCdcblxuZXhwb3J0IGludGVyZmFjZSBLZXJuZWxDb250cmFjdEFuY2hvciB7XG4gIHJlYWRvbmx5IGluc3RhbmNlSWQ6IHN0cmluZ1xuICByZWFkb25seSB0eG5TZXE6IG51bWJlclxuICByZWFkb25seSBvcFNlcTogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2VybmVsQ29udHJhY3RUcmFjZU9wIHtcbiAgcmVhZG9ubHkgYW5jaG9yOiBLZXJuZWxDb250cmFjdEFuY2hvclxuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGtpbmQ6IHN0cmluZ1xuICByZWFkb25seSBuYW1lOiBzdHJpbmdcbiAgcmVhZG9ubHkgbWV0YT86IEpzb25WYWx1ZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEtlcm5lbENvbnRyYWN0UnVuU3VtbWFyeSB7XG4gIHJlYWRvbmx5IG9rOiBib29sZWFuXG4gIHJlYWRvbmx5IGtlcm5lbEltcGxlbWVudGF0aW9uUmVmOiBLZXJuZWxSZWYuS2VybmVsSW1wbGVtZW50YXRpb25SZWZcbiAgcmVhZG9ubHkgcnVudGltZVNlcnZpY2VzRXZpZGVuY2U/OiBKc29uVmFsdWVcbiAgcmVhZG9ubHkgdHJhY2U6IHtcbiAgICByZWFkb25seSBkaWdlc3Q6IHN0cmluZ1xuICAgIHJlYWRvbmx5IG9wQ291bnQ6IG51bWJlclxuICB9XG4gIHJlYWRvbmx5IGVycm9yPzoge1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZ1xuICAgIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZ1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEtlcm5lbENvbnRyYWN0RGlmZkNoYW5nZUNvZGUgPSAnb3AuYWRkZWQnIHwgJ29wLnJlbW92ZWQnIHwgJ29wLmNoYW5nZWQnIHwgJ3J1bi5mYWlsdXJlJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEtlcm5lbENvbnRyYWN0RGlmZkNoYW5nZSB7XG4gIHJlYWRvbmx5IGNvZGU6IEtlcm5lbENvbnRyYWN0RGlmZkNoYW5nZUNvZGVcbiAgcmVhZG9ubHkgYW5jaG9yPzogS2VybmVsQ29udHJhY3RBbmNob3JcbiAgcmVhZG9ubHkgYmVmb3JlPzogSnNvblZhbHVlXG4gIHJlYWRvbmx5IGFmdGVyPzogSnNvblZhbHVlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2VybmVsQ29udHJhY3RWZXJpZmljYXRpb25SZXN1bHQge1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmdcbiAgcmVhZG9ubHkgdmVyZGljdDogS2VybmVsQ29udHJhY3RWZXJkaWN0XG4gIHJlYWRvbmx5IGJlZm9yZTogS2VybmVsQ29udHJhY3RSdW5TdW1tYXJ5XG4gIHJlYWRvbmx5IGFmdGVyOiBLZXJuZWxDb250cmFjdFJ1blN1bW1hcnlcbiAgcmVhZG9ubHkgY2hhbmdlczogUmVhZG9ubHlBcnJheTxLZXJuZWxDb250cmFjdERpZmZDaGFuZ2U+XG4gIHJlYWRvbmx5IHN1bW1hcnk6IHtcbiAgICByZWFkb25seSBhZGRlZDogbnVtYmVyXG4gICAgcmVhZG9ubHkgcmVtb3ZlZDogbnVtYmVyXG4gICAgcmVhZG9ubHkgY2hhbmdlZDogbnVtYmVyXG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBLZXJuZWxDb250cmFjdFJ1bk9wdGlvbnM8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZT4ge1xuICByZWFkb25seSBydW5JZD86IHN0cmluZ1xuICByZWFkb25seSBsYXllcj86IExheWVyLkxheWVyPGFueSwgYW55LCBhbnk+XG4gIHJlYWRvbmx5IHJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzPzogUnVudGltZUtlcm5lbC5SdW50aW1lU2VydmljZXNPdmVycmlkZXNcbiAgcmVhZG9ubHkgaW50ZXJhY3Rpb24/OiAocnVudGltZTogTW9kdWxlUnVudGltZTxhbnksIGFueT4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgYW55LCBhbnk+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5S2VybmVsQ29udHJhY3RPcHRpb25zPFNoIGV4dGVuZHMgQW55TW9kdWxlU2hhcGU+IHtcbiAgcmVhZG9ubHkgYmVmb3JlPzogS2VybmVsQ29udHJhY3RSdW5PcHRpb25zPFNoPlxuICByZWFkb25seSBhZnRlcj86IEtlcm5lbENvbnRyYWN0UnVuT3B0aW9uczxTaD5cbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NMZXZlbD86IERlYnVnLkRpYWdub3N0aWNzTGV2ZWxcbiAgcmVhZG9ubHkgbWF4RXZlbnRzPzogbnVtYmVyXG59XG5cbmNvbnN0IGFzTm9uRW1wdHlTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUgOiB1bmRlZmluZWRcblxuY29uc3QgYXNOb25OZWdJbnQgPSAodmFsdWU6IHVua25vd24sIGZhbGxiYWNrID0gMCk6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSByZXR1cm4gZmFsbGJhY2tcbiAgY29uc3QgbiA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHJldHVybiBuID49IDAgPyBuIDogZmFsbGJhY2tcbn1cblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBtYWtlVHJhY2VFZmZlY3RPcE9ic2VydmVyID0gKCk6IE1pZGRsZXdhcmUgPT4ge1xuICByZXR1cm4gPEEsIEUsIFI+KG9wOiBpbXBvcnQoJy4uL2VmZmVjdC1vcC5qcycpLkVmZmVjdE9wPEEsIEUsIFI+KTogRWZmZWN0LkVmZmVjdDxBLCBFLCBSPiA9PlxuICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgIC8vIE9ic2VydmF0aW9uLW9ubHkgY2FwYWJpbGl0eTogY2FuIGJlIGxvY2FsbHkgZGlzYWJsZWQgYnkgcG9saWN5LlxuICAgICAgaWYgKChvcC5tZXRhIGFzIGFueSk/LnBvbGljeT8uZGlzYWJsZU9ic2VydmVycykge1xuICAgICAgICByZXR1cm4geWllbGQqIG9wLmVmZmVjdFxuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRhOiBhbnkgPSBvcC5tZXRhID8/IHt9XG4gICAgICBjb25zdCBzbGltT3AgPSB7XG4gICAgICAgIGlkOiBvcC5pZCxcbiAgICAgICAga2luZDogb3Aua2luZCxcbiAgICAgICAgbmFtZTogb3AubmFtZSxcbiAgICAgICAgcGF5bG9hZDogb3AucGF5bG9hZCxcbiAgICAgICAgbWV0YTogb3AubWV0YSxcbiAgICAgIH1cblxuICAgICAgeWllbGQqIERlYnVnLnJlY29yZCh7XG4gICAgICAgIHR5cGU6ICd0cmFjZTplZmZlY3RvcCcsXG4gICAgICAgIG1vZHVsZUlkOiB0eXBlb2YgbWV0YS5tb2R1bGVJZCA9PT0gJ3N0cmluZycgPyBtZXRhLm1vZHVsZUlkIDogdW5kZWZpbmVkLFxuICAgICAgICBpbnN0YW5jZUlkOiB0eXBlb2YgbWV0YS5pbnN0YW5jZUlkID09PSAnc3RyaW5nJyA/IG1ldGEuaW5zdGFuY2VJZCA6IHVuZGVmaW5lZCxcbiAgICAgICAgcnVudGltZUxhYmVsOiB0eXBlb2YgbWV0YS5ydW50aW1lTGFiZWwgPT09ICdzdHJpbmcnID8gbWV0YS5ydW50aW1lTGFiZWwgOiB1bmRlZmluZWQsXG4gICAgICAgIHR4blNlcTogdHlwZW9mIG1ldGEudHhuU2VxID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUobWV0YS50eG5TZXEpID8gTWF0aC5mbG9vcihtZXRhLnR4blNlcSkgOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGE6IHNsaW1PcCxcbiAgICAgIH0gYXMgYW55KVxuXG4gICAgICByZXR1cm4geWllbGQqIG9wLmVmZmVjdFxuICAgIH0pXG59XG5cbmNvbnN0IGV4dHJhY3RSdW50aW1lU3VtbWFyeSA9IChcbiAgZXZpZGVuY2U6IEV2aWRlbmNlUGFja2FnZSxcbik6IHtcbiAgcmVhZG9ubHkga2VybmVsSW1wbGVtZW50YXRpb25SZWY6IEtlcm5lbFJlZi5LZXJuZWxJbXBsZW1lbnRhdGlvblJlZlxuICByZWFkb25seSBydW50aW1lU2VydmljZXNFdmlkZW5jZT86IEpzb25WYWx1ZVxufSA9PiB7XG4gIGNvbnN0IHN1bW1hcnk6IGFueSA9IGV2aWRlbmNlLnN1bW1hcnlcbiAgY29uc3QgcnVudGltZTogYW55ID0gc3VtbWFyeT8ucnVudGltZVxuICBjb25zdCBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZlJhdyA9IHJ1bnRpbWU/Lmtlcm5lbEltcGxlbWVudGF0aW9uUmVmXG4gIGNvbnN0IGtlcm5lbEltcGxlbWVudGF0aW9uUmVmID0gS2VybmVsUmVmLm5vcm1hbGl6ZUtlcm5lbEltcGxlbWVudGF0aW9uUmVmKGtlcm5lbEltcGxlbWVudGF0aW9uUmVmUmF3KVxuICBjb25zdCBzZXJ2aWNlcyA9IHJ1bnRpbWU/LnNlcnZpY2VzIGFzIEpzb25WYWx1ZSB8IHVuZGVmaW5lZFxuICByZXR1cm4ge1xuICAgIGtlcm5lbEltcGxlbWVudGF0aW9uUmVmLFxuICAgIHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlOiBzZXJ2aWNlcyxcbiAgfVxufVxuXG5jb25zdCBjYW5vbmljYWxpemVPcE1ldGEgPSAob3BNZXRhUmF3OiB1bmtub3duKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChvcE1ldGFSYXcpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+ID0ge31cbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMob3BNZXRhUmF3KSkge1xuICAgIC8vIHZvbGF0aWxlIC8gbm9uLWNvbnRyYWN0IGFuY2hvcnNcbiAgICBpZiAoayA9PT0gJ2luc3RhbmNlSWQnIHx8IGsgPT09ICd0eG5JZCcgfHwgayA9PT0gJ3J1bnRpbWVMYWJlbCcgfHwgayA9PT0gJ2xpbmtJZCcpIGNvbnRpbnVlXG5cbiAgICBpZiAoKGsgPT09ICdkZXBzJyB8fCBrID09PSAndHJhY2UnIHx8IGsgPT09ICd0YWdzJykgJiYgQXJyYXkuaXNBcnJheSh2KSAmJiB2LmV2ZXJ5KCh4KSA9PiB0eXBlb2YgeCA9PT0gJ3N0cmluZycpKSB7XG4gICAgICBvdXRba10gPSAodiBhcyBSZWFkb25seUFycmF5PHN0cmluZz4pLnNsaWNlKCkuc29ydCgpIGFzIHVua25vd24gYXMgSnNvblZhbHVlXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIG91dFtrXSA9IHYgYXMgSnNvblZhbHVlXG4gIH1cblxuICByZXR1cm4gb3V0IGFzIEpzb25WYWx1ZVxufVxuXG5jb25zdCBleHRyYWN0S2VybmVsQ29udHJhY3RUcmFjZU9wcyA9IChldmlkZW5jZTogRXZpZGVuY2VQYWNrYWdlKTogUmVhZG9ubHlBcnJheTxLZXJuZWxDb250cmFjdFRyYWNlT3A+ID0+IHtcbiAgY29uc3QgaW5zdGFuY2VNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpXG4gIGxldCBuZXh0SW5zdGFuY2VJbmRleCA9IDBcblxuICBjb25zdCBtYXBJbnN0YW5jZUlkID0gKHJhdzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBpZiAocmF3ID09PSAndW5rbm93bicpIHJldHVybiAndW5rbm93bidcbiAgICBjb25zdCBleGlzdGluZyA9IGluc3RhbmNlTWFwLmdldChyYXcpXG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3RpbmdcbiAgICBuZXh0SW5zdGFuY2VJbmRleCArPSAxXG4gICAgY29uc3QgbmV4dCA9IGBpJHtuZXh0SW5zdGFuY2VJbmRleH1gXG4gICAgaW5zdGFuY2VNYXAuc2V0KHJhdywgbmV4dClcbiAgICByZXR1cm4gbmV4dFxuICB9XG5cbiAgY29uc3Qgb3BzOiBLZXJuZWxDb250cmFjdFRyYWNlT3BbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBlIG9mIGV2aWRlbmNlLmV2ZW50cykge1xuICAgIGlmIChlLnR5cGUgIT09ICdkZWJ1ZzpldmVudCcpIGNvbnRpbnVlXG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0gZS5wYXlsb2FkXG4gICAgaWYgKCFpc1JlY29yZChwYXlsb2FkKSkgY29udGludWVcblxuICAgIGNvbnN0IG1ldGE6IGFueSA9IHBheWxvYWQubWV0YVxuICAgIGNvbnN0IG9wTWV0YTogYW55ID0gbWV0YT8ubWV0YVxuICAgIGNvbnN0IG9wU2VxID0gYXNOb25OZWdJbnQob3BNZXRhPy5vcFNlcSwgLTEpXG4gICAgaWYgKG9wU2VxIDwgMCkgY29udGludWVcblxuICAgIGNvbnN0IGluc3RhbmNlSWRSYXcgPSBhc05vbkVtcHR5U3RyaW5nKHBheWxvYWQuaW5zdGFuY2VJZCkgPz8gJ3Vua25vd24nXG4gICAgY29uc3QgaW5zdGFuY2VJZCA9IG1hcEluc3RhbmNlSWQoaW5zdGFuY2VJZFJhdylcbiAgICBjb25zdCB0eG5TZXEgPSBhc05vbk5lZ0ludChwYXlsb2FkLnR4blNlcSwgMClcblxuICAgIGNvbnN0IG1vZHVsZUlkID0gYXNOb25FbXB0eVN0cmluZyhwYXlsb2FkLm1vZHVsZUlkKSA/PyAndW5rbm93bidcbiAgICBjb25zdCBraW5kID0gYXNOb25FbXB0eVN0cmluZyhtZXRhPy5raW5kKSA/PyBhc05vbkVtcHR5U3RyaW5nKHBheWxvYWQua2luZCkgPz8gJ3Vua25vd24nXG4gICAgY29uc3QgbmFtZSA9IGFzTm9uRW1wdHlTdHJpbmcobWV0YT8ubmFtZSkgPz8gYXNOb25FbXB0eVN0cmluZyhwYXlsb2FkLmxhYmVsKSA/PyAnZWZmZWN0b3AnXG5cbiAgICBvcHMucHVzaCh7XG4gICAgICBhbmNob3I6IHsgaW5zdGFuY2VJZCwgdHhuU2VxLCBvcFNlcSB9LFxuICAgICAgbW9kdWxlSWQsXG4gICAgICBraW5kLFxuICAgICAgbmFtZSxcbiAgICAgIG1ldGE6IGNhbm9uaWNhbGl6ZU9wTWV0YShvcE1ldGEpLFxuICAgIH0pXG4gIH1cblxuICBvcHMuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLmFuY2hvci5pbnN0YW5jZUlkICE9PSBiLmFuY2hvci5pbnN0YW5jZUlkKSByZXR1cm4gYS5hbmNob3IuaW5zdGFuY2VJZCA8IGIuYW5jaG9yLmluc3RhbmNlSWQgPyAtMSA6IDFcbiAgICBpZiAoYS5hbmNob3IudHhuU2VxICE9PSBiLmFuY2hvci50eG5TZXEpIHJldHVybiBhLmFuY2hvci50eG5TZXEgLSBiLmFuY2hvci50eG5TZXFcbiAgICByZXR1cm4gYS5hbmNob3Iub3BTZXEgLSBiLmFuY2hvci5vcFNlcVxuICB9KVxuXG4gIHJldHVybiBvcHNcbn1cblxuY29uc3QgYW5jaG9yS2V5ID0gKGE6IEtlcm5lbENvbnRyYWN0QW5jaG9yKTogc3RyaW5nID0+IGAke2EuaW5zdGFuY2VJZH06OnQke2EudHhuU2VxfTo6byR7YS5vcFNlcX1gXG5cbmNvbnN0IGRpZmZLZXJuZWxDb250cmFjdFRyYWNlT3BzID0gKFxuICBiZWZvcmU6IFJlYWRvbmx5QXJyYXk8S2VybmVsQ29udHJhY3RUcmFjZU9wPixcbiAgYWZ0ZXI6IFJlYWRvbmx5QXJyYXk8S2VybmVsQ29udHJhY3RUcmFjZU9wPixcbik6IHtcbiAgcmVhZG9ubHkgY2hhbmdlczogUmVhZG9ubHlBcnJheTxLZXJuZWxDb250cmFjdERpZmZDaGFuZ2U+XG4gIHJlYWRvbmx5IHN1bW1hcnk6IEtlcm5lbENvbnRyYWN0VmVyaWZpY2F0aW9uUmVzdWx0WydzdW1tYXJ5J11cbn0gPT4ge1xuICBjb25zdCBjaGFuZ2VzOiBLZXJuZWxDb250cmFjdERpZmZDaGFuZ2VbXSA9IFtdXG5cbiAgY29uc3QgYmVmb3JlQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgS2VybmVsQ29udHJhY3RUcmFjZU9wPigpXG4gIGNvbnN0IGFmdGVyQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgS2VybmVsQ29udHJhY3RUcmFjZU9wPigpXG5cbiAgZm9yIChjb25zdCBvcCBvZiBiZWZvcmUpIHtcbiAgICBiZWZvcmVCeUtleS5zZXQoYW5jaG9yS2V5KG9wLmFuY2hvciksIG9wKVxuICB9XG4gIGZvciAoY29uc3Qgb3Agb2YgYWZ0ZXIpIHtcbiAgICBhZnRlckJ5S2V5LnNldChhbmNob3JLZXkob3AuYW5jaG9yKSwgb3ApXG4gIH1cblxuICBjb25zdCBhbGxLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5iZWZvcmVCeUtleS5rZXlzKCksIC4uLmFmdGVyQnlLZXkua2V5cygpXSkpLnNvcnQoKVxuXG4gIGZvciAoY29uc3Qga2V5IG9mIGFsbEtleXMpIHtcbiAgICBjb25zdCBiID0gYmVmb3JlQnlLZXkuZ2V0KGtleSlcbiAgICBjb25zdCBhID0gYWZ0ZXJCeUtleS5nZXQoa2V5KVxuXG4gICAgaWYgKCFiICYmIGEpIHtcbiAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgIGNvZGU6ICdvcC5hZGRlZCcsXG4gICAgICAgIGFuY2hvcjogYS5hbmNob3IsXG4gICAgICAgIGFmdGVyOiBhIGFzIHVua25vd24gYXMgSnNvblZhbHVlLFxuICAgICAgfSlcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChiICYmICFhKSB7XG4gICAgICBjaGFuZ2VzLnB1c2goe1xuICAgICAgICBjb2RlOiAnb3AucmVtb3ZlZCcsXG4gICAgICAgIGFuY2hvcjogYi5hbmNob3IsXG4gICAgICAgIGJlZm9yZTogYiBhcyB1bmtub3duIGFzIEpzb25WYWx1ZSxcbiAgICAgIH0pXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoIWIgfHwgIWEpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBiSnNvbiA9IHN0YWJsZVN0cmluZ2lmeShiKVxuICAgIGNvbnN0IGFKc29uID0gc3RhYmxlU3RyaW5naWZ5KGEpXG4gICAgaWYgKGJKc29uICE9PSBhSnNvbikge1xuICAgICAgY2hhbmdlcy5wdXNoKHtcbiAgICAgICAgY29kZTogJ29wLmNoYW5nZWQnLFxuICAgICAgICBhbmNob3I6IGIuYW5jaG9yLFxuICAgICAgICBiZWZvcmU6IGIgYXMgdW5rbm93biBhcyBKc29uVmFsdWUsXG4gICAgICAgIGFmdGVyOiBhIGFzIHVua25vd24gYXMgSnNvblZhbHVlLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdW1tYXJ5ID0ge1xuICAgIGFkZGVkOiBjaGFuZ2VzLmZpbHRlcigoYykgPT4gYy5jb2RlID09PSAnb3AuYWRkZWQnKS5sZW5ndGgsXG4gICAgcmVtb3ZlZDogY2hhbmdlcy5maWx0ZXIoKGMpID0+IGMuY29kZSA9PT0gJ29wLnJlbW92ZWQnKS5sZW5ndGgsXG4gICAgY2hhbmdlZDogY2hhbmdlcy5maWx0ZXIoKGMpID0+IGMuY29kZSA9PT0gJ29wLmNoYW5nZWQnKS5sZW5ndGgsXG4gIH0gYXMgY29uc3Qgc2F0aXNmaWVzIEtlcm5lbENvbnRyYWN0VmVyaWZpY2F0aW9uUmVzdWx0WydzdW1tYXJ5J11cblxuICByZXR1cm4geyBjaGFuZ2VzLCBzdW1tYXJ5IH1cbn1cblxuY29uc3QgVkVSU0lPTiA9ICd2MSdcblxuY29uc3QgcnVuT25jZSA9IDxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPihcbiAgcm9vdEltcGw6IE1vZHVsZUltcGw8YW55LCBTaCwgYW55PixcbiAgcnVuOiBLZXJuZWxDb250cmFjdFJ1bk9wdGlvbnM8U2g+IHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiBQaWNrPFZlcmlmeUtlcm5lbENvbnRyYWN0T3B0aW9uczxTaD4sICdkaWFnbm9zdGljc0xldmVsJyB8ICdtYXhFdmVudHMnPixcbik6IEVmZmVjdC5FZmZlY3Q8XG4gIHtcbiAgICByZWFkb25seSBzdW1tYXJ5OiBLZXJuZWxDb250cmFjdFJ1blN1bW1hcnlcbiAgICByZWFkb25seSB0cmFjZU9wczogUmVhZG9ubHlBcnJheTxLZXJuZWxDb250cmFjdFRyYWNlT3A+XG4gIH0sXG4gIG5ldmVyLFxuICBhbnlcbj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IGludGVyYWN0aW9uID0gcnVuPy5pbnRlcmFjdGlvblxuICAgIGNvbnN0IHByb2dyYW0gPSBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCBjdHggPSB5aWVsZCogcm9vdEltcGwubGF5ZXIucGlwZShMYXllci5idWlsZClcbiAgICAgIGNvbnN0IHJ1bnRpbWUgPSBDb250ZXh0LmdldChjdHgsIHJvb3RJbXBsLm1vZHVsZSlcbiAgICAgIGlmIChpbnRlcmFjdGlvbikge1xuICAgICAgICB5aWVsZCogaW50ZXJhY3Rpb24ocnVudGltZSlcbiAgICAgIH1cbiAgICAgIHJldHVybiBydW50aW1lLmluc3RhbmNlSWRcbiAgICB9KSBhcyBFZmZlY3QuRWZmZWN0PHN0cmluZywgYW55LCBhbnk+XG5cbiAgICBjb25zdCB0cmFjZUxheWVyID0gTGF5ZXIuc3VjY2VlZChFZmZlY3RPcENvcmUuRWZmZWN0T3BNaWRkbGV3YXJlVGFnLCB7XG4gICAgICBzdGFjazogW21ha2VUcmFjZUVmZmVjdE9wT2JzZXJ2ZXIoKV0sXG4gICAgfSkgYXMgdW5rbm93biBhcyBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj5cblxuICAgIGNvbnN0IGV4dHJhTGF5ZXIgPSBydW4/LmxheWVyID8gKExheWVyLm1lcmdlQWxsKHRyYWNlTGF5ZXIsIHJ1bi5sYXllcikgYXMgTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT4pIDogdHJhY2VMYXllclxuXG4gICAgY29uc3QgcmVzdWx0ID0geWllbGQqIHRyaWFsUnVuKHByb2dyYW0gYXMgYW55LCB7XG4gICAgICBydW5JZDogcnVuPy5ydW5JZCxcbiAgICAgIGRpYWdub3N0aWNzTGV2ZWw6IG9wdGlvbnMuZGlhZ25vc3RpY3NMZXZlbCA/PyAnbGlnaHQnLFxuICAgICAgbWF4RXZlbnRzOiBvcHRpb25zLm1heEV2ZW50cyxcbiAgICAgIGxheWVyOiBleHRyYUxheWVyLFxuICAgICAgcnVudGltZVNlcnZpY2VzSW5zdGFuY2VPdmVycmlkZXM6IHJ1bj8ucnVudGltZVNlcnZpY2VzSW5zdGFuY2VPdmVycmlkZXMsXG4gICAgfSlcblxuICAgIGNvbnN0IG9rID0gRXhpdC5pc1N1Y2Nlc3MocmVzdWx0LmV4aXQpXG4gICAgY29uc3QgZXJyb3IgPVxuICAgICAgRXhpdC5pc0ZhaWx1cmUocmVzdWx0LmV4aXQpICYmIHJlc3VsdC5leGl0LmNhdXNlICE9IG51bGxcbiAgICAgICAgPyAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmFpbHVyZSA9IEV4aXQuaXNGYWlsdXJlKHJlc3VsdC5leGl0KSA/IHJlc3VsdC5leGl0LmNhdXNlIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBjb25zdCBlcnIgPSAoZmFpbHVyZSBhcyBhbnkpPy5fdGFnID09PSAnRGllJyA/IChmYWlsdXJlIGFzIGFueSkuZGVmZWN0IDogKGZhaWx1cmUgYXMgYW55KVxuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGVyci5uYW1lLCBtZXNzYWdlOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lOiAnVW5rbm93bkVycm9yJywgbWVzc2FnZTogU3RyaW5nKGVyciA/PyAndW5rbm93bicpIH1cbiAgICAgICAgICB9KSgpXG4gICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICBjb25zdCBydW50aW1lU3VtbWFyeSA9IGV4dHJhY3RSdW50aW1lU3VtbWFyeShyZXN1bHQuZXZpZGVuY2UpXG4gICAgY29uc3QgdHJhY2VPcHMgPSBleHRyYWN0S2VybmVsQ29udHJhY3RUcmFjZU9wcyhyZXN1bHQuZXZpZGVuY2UpXG4gICAgY29uc3QgdHJhY2VEaWdlc3QgPSBmbnYxYTMyKHN0YWJsZVN0cmluZ2lmeSh0cmFjZU9wcykpXG5cbiAgICByZXR1cm4ge1xuICAgICAgc3VtbWFyeToge1xuICAgICAgICBvayxcbiAgICAgICAga2VybmVsSW1wbGVtZW50YXRpb25SZWY6IHJ1bnRpbWVTdW1tYXJ5Lmtlcm5lbEltcGxlbWVudGF0aW9uUmVmLFxuICAgICAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZTogcnVudGltZVN1bW1hcnkucnVudGltZVNlcnZpY2VzRXZpZGVuY2UsXG4gICAgICAgIHRyYWNlOiB7IGRpZ2VzdDogdHJhY2VEaWdlc3QsIG9wQ291bnQ6IHRyYWNlT3BzLmxlbmd0aCB9LFxuICAgICAgICAuLi4oZXJyb3IgPyB7IGVycm9yIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAgdHJhY2VPcHMsXG4gICAgfVxuICB9KVxuXG5leHBvcnQgY29uc3QgdmVyaWZ5S2VybmVsQ29udHJhY3QgPSA8U2ggZXh0ZW5kcyBBbnlNb2R1bGVTaGFwZT4oXG4gIHJvb3Q6IFJvb3RMaWtlPFNoPixcbiAgb3B0aW9ucz86IFZlcmlmeUtlcm5lbENvbnRyYWN0T3B0aW9uczxTaD4sXG4pOiBFZmZlY3QuRWZmZWN0PEtlcm5lbENvbnRyYWN0VmVyaWZpY2F0aW9uUmVzdWx0LCBuZXZlciwgYW55PiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3Qgcm9vdEltcGwgPSByZXNvbHZlUm9vdEltcGwocm9vdClcblxuICAgIGNvbnN0IGJlZm9yZVJ1biA9IHlpZWxkKiBydW5PbmNlKHJvb3RJbXBsLCBvcHRpb25zPy5iZWZvcmUsIHtcbiAgICAgIGRpYWdub3N0aWNzTGV2ZWw6IG9wdGlvbnM/LmRpYWdub3N0aWNzTGV2ZWwsXG4gICAgICBtYXhFdmVudHM6IG9wdGlvbnM/Lm1heEV2ZW50cyxcbiAgICB9KVxuXG4gICAgY29uc3QgYWZ0ZXJSdW4gPSB5aWVsZCogcnVuT25jZShyb290SW1wbCwgb3B0aW9ucz8uYWZ0ZXIsIHtcbiAgICAgIGRpYWdub3N0aWNzTGV2ZWw6IG9wdGlvbnM/LmRpYWdub3N0aWNzTGV2ZWwsXG4gICAgICBtYXhFdmVudHM6IG9wdGlvbnM/Lm1heEV2ZW50cyxcbiAgICB9KVxuXG4gICAgY29uc3QgaGFzUnVuRmFpbHVyZSA9ICFiZWZvcmVSdW4uc3VtbWFyeS5vayB8fCAhYWZ0ZXJSdW4uc3VtbWFyeS5va1xuICAgIGNvbnN0IGRpZmYgPSBoYXNSdW5GYWlsdXJlXG4gICAgICA/IHsgY2hhbmdlczogW3sgY29kZTogJ3J1bi5mYWlsdXJlJyBhcyBjb25zdCB9XSwgc3VtbWFyeTogeyBhZGRlZDogMCwgcmVtb3ZlZDogMCwgY2hhbmdlZDogMCB9IH1cbiAgICAgIDogZGlmZktlcm5lbENvbnRyYWN0VHJhY2VPcHMoYmVmb3JlUnVuLnRyYWNlT3BzLCBhZnRlclJ1bi50cmFjZU9wcylcblxuICAgIGNvbnN0IHZlcmRpY3Q6IEtlcm5lbENvbnRyYWN0VmVyZGljdCA9IGhhc1J1bkZhaWx1cmUgfHwgZGlmZi5jaGFuZ2VzLmxlbmd0aCA+IDAgPyAnRkFJTCcgOiAnUEFTUydcblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJzaW9uOiBWRVJTSU9OLFxuICAgICAgdmVyZGljdCxcbiAgICAgIGJlZm9yZTogYmVmb3JlUnVuLnN1bW1hcnksXG4gICAgICBhZnRlcjogYWZ0ZXJSdW4uc3VtbWFyeSxcbiAgICAgIGNoYW5nZXM6IGRpZmYuY2hhbmdlcyxcbiAgICAgIHN1bW1hcnk6IGRpZmYuc3VtbWFyeSxcbiAgICB9XG4gIH0pXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBUyxXQUFBQSxVQUFTLFVBQUFDLFNBQVEsUUFBQUMsT0FBTSxTQUFBQyxjQUFhOzs7QUNtRDdDLElBQU0sYUFBYSxDQUFDLFVBQTJCLHNCQUFzQixRQUFRLGdCQUFnQixLQUFLLENBQUMsQ0FBQztBQUU3RixJQUFNLDJCQUEyQixDQUFDLFlBQ3ZDLG9CQUFvQixRQUFRLGdCQUFnQixPQUFPLENBQUMsQ0FBQztBQUVoRCxJQUFNLDZCQUE2QixDQUFDLFNBR0s7QUFDOUMsUUFBTSxXQUFXLEtBQUs7QUFDdEIsU0FBTyxNQUFNLEtBQUssS0FBSyxlQUFlLEVBQ25DLEtBQUssQ0FBQyxHQUFHLE1BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxLQUFLLEVBQUUsWUFBWSxFQUFFLFlBQVksSUFBSSxDQUFFLEVBQ25GLElBQUksQ0FBQyxPQUFPO0FBQ1gsVUFBTSxVQUFVLEdBQUcsVUFBVSxXQUFXLEdBQUcsUUFBUSxHQUFHLElBQUksR0FBRyxVQUFVLE1BQU0sU0FBUyxTQUFTLENBQUMsSUFBSSxHQUFHO0FBQ3ZHLFVBQU0sY0FBYyxHQUFHLE1BQU0sS0FBSyxDQUFDLE1BQU0sRUFBRSxTQUFTLFNBQVM7QUFDN0QsVUFBTSxVQUNKLGFBQWEsU0FBUyxhQUFh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LFVBQVcsU0FBUyxhQUFhLFNBQVM7QUFFaEQsUUFBTSxjQUFjTyxRQUFPLElBQUksYUFBYTtBQUMxQyxVQUFNLE1BQU0sT0FBTyxTQUFTLE1BQU0sS0FBS0MsT0FBTSxLQUFLO0FBQ2xELFVBQU0sVUFBZUMsU0FBUSxJQUFJLEtBQUssU0FBUyxNQUFhO0FBQzVELFFBQUksU0FBUyxhQUFhO0FBQ3hCLGFBQU8sUUFBUSxZQUFZLE9BQU87QUFBQSxJQUNwQztBQUNBLFdBQU87QUFBQSxNQUNMLHlCQUFnQywyQkFBMkIsT0FBTztBQUFBLE1BQ2xFLHlCQUFnQywyQkFBMkIsT0FBTztBQUFBLElBQ3BFO0FBQUEsRUFDRixDQUFDO0FBRUQsUUFBTSxhQUFhLE9BQU8sU0FBUyxhQUFhO0FBQUEsSUFDOUMsT0FBTyxTQUFTO0FBQUEsSUFDaEIsa0JBQWtCLFNBQVMsd0JBQXdCO0FBQUEsSUFDbkQsT0FBTyxTQUFTO0FBQUEsSUFDaEIsa0NBQWtDLFNBQVM7QUFBQSxFQUM3QyxDQUFDO0FBRUQsUUFBTSxZQUFZQyxNQUFLLFVBQVUsV0FBVyxJQUFJLElBQzVDLFdBQVcsS0FBSyxTQUNmLE1BQU07QUFDTCxVQUFNLE1BQU1BLE1BQUssVUFBVSxXQUFXLElBQUksSUFDdEMsT0FBUSxXQUFXLEtBQWEsU0FBUyxrQkFBa0IsSUFDM0Q7QUFDSixVQUFNLElBQUksTUFBTSxHQUFHO0FBQUEsRUFDckIsR0FBRztBQUVQLFFBQU0sT0FBYyx3QkFBd0I7QUFBQSxJQUMxQyxNQUFNLFNBQVMsUUFBUTtBQUFBLElBQ3ZCLG1CQUFtQixVQUFVLHdCQUF3QjtBQUFBLElBQ3JELHlCQUF5QixVQUFVO0FBQUEsSUFDbkMsa0JBQWtCLFNBQVMsd0JBQXdCO0FBQUEsRUFDckQsQ0FBQztBQUVELFFBQU0sVUFBMkIsS0FBSyxZQUFZLFVBQVUsb0JBQW9CLFNBQVMsU0FBUztBQUVsRyxTQUFPO0FBQUEsSUFDTCxTQUFTO0FBQUEsSUFDVDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsR0FBSSxtQkFBbUIsRUFBRSxjQUFjLGdCQUFnQixhQUFhLElBQUksQ0FBQztBQUFBLEVBQzNFO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFsiQ29udGV4dCIsICJFZmZlY3QiLCAiRXhpdCIsICJMYXllciIsICJtYWtlRGlnZXN0IiwgImFzTm9uRW1wdHlTdHJpbmciLCAiaXNSZWNvcmQiLCAicmVzb2x2ZVJvb3RJbXBsIiwgImlzUmVjb3JkIiwgImV4dHJhY3RNYW5pZmVzdCIsICJkaWZmTWFuaWZlc3QiLCAiZXhwb3J0U3RhdGljSXIiLCAiZXhwb3J0Q29udHJvbFN1cmZhY2UiLCAidmVyaWZ5S2VybmVsQ29udHJhY3QiLCAiRWZmZWN0IiwgIkxheWVyIiwgIkNvbnRleHQiLCAiRXhpdCJdCn0K
|