@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
|
@@ -0,0 +1,991 @@
|
|
|
1
|
+
// @logixjs/core subpath bundles for @logixjs/sandbox
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
makeApp,
|
|
5
|
+
makeProgramRunnerKernel,
|
|
6
|
+
provide
|
|
7
|
+
} from "./chunk-BUVHG3NJ.js";
|
|
8
|
+
import {
|
|
9
|
+
evidenceCollectorLayer,
|
|
10
|
+
makeEvidenceCollector
|
|
11
|
+
} from "./chunk-KDJR27JV.js";
|
|
12
|
+
import {
|
|
13
|
+
RuntimeServicesInstanceOverridesTag,
|
|
14
|
+
getKernelImplementationRef,
|
|
15
|
+
getRuntimeServicesEvidence
|
|
16
|
+
} from "./chunk-L4PNO2H6.js";
|
|
17
|
+
import {
|
|
18
|
+
isActionToken
|
|
19
|
+
} from "./chunk-DOBF6YTQ.js";
|
|
20
|
+
import {
|
|
21
|
+
exportStaticIr
|
|
22
|
+
} from "./chunk-4MY35XR3.js";
|
|
23
|
+
import {
|
|
24
|
+
appendConvergeStaticIrCollectors
|
|
25
|
+
} from "./chunk-2LZ43SWS.js";
|
|
26
|
+
import {
|
|
27
|
+
getModuleTraitsProgram
|
|
28
|
+
} from "./chunk-7GPAF2UK.js";
|
|
29
|
+
import {
|
|
30
|
+
makeRunSession,
|
|
31
|
+
runSessionLayer
|
|
32
|
+
} from "./chunk-W365QUZ5.js";
|
|
33
|
+
import {
|
|
34
|
+
appendSinks,
|
|
35
|
+
diagnosticsLevel,
|
|
36
|
+
toSerializableErrorSummary
|
|
37
|
+
} from "./chunk-SH7TP5CJ.js";
|
|
38
|
+
import {
|
|
39
|
+
isJsonValue
|
|
40
|
+
} from "./chunk-SI5OKFFY.js";
|
|
41
|
+
import {
|
|
42
|
+
fnv1a32,
|
|
43
|
+
stableStringify
|
|
44
|
+
} from "./chunk-DT7YIIWE.js";
|
|
45
|
+
|
|
46
|
+
// ../logix-core/src/internal/reflection/staticIr.ts
|
|
47
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
48
|
+
var isModuleImpl = (value) => isRecord(value) && value._tag === "ModuleImpl" && isRecord(value.module);
|
|
49
|
+
var resolveModuleId = (input) => {
|
|
50
|
+
if (isModuleImpl(input)) {
|
|
51
|
+
const id = input.module.id;
|
|
52
|
+
return typeof id === "string" && id.length > 0 ? id : "unknown";
|
|
53
|
+
}
|
|
54
|
+
if (isRecord(input)) {
|
|
55
|
+
const id = input.id;
|
|
56
|
+
if (typeof id === "string" && id.length > 0) return id;
|
|
57
|
+
const tag = input.tag;
|
|
58
|
+
if (tag && (typeof tag === "object" || typeof tag === "function")) {
|
|
59
|
+
const tagId = tag.id;
|
|
60
|
+
if (typeof tagId === "string" && tagId.length > 0) return tagId;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return "unknown";
|
|
64
|
+
};
|
|
65
|
+
var resolveModuleTag = (input) => {
|
|
66
|
+
if (isModuleImpl(input)) return input.module;
|
|
67
|
+
if (isRecord(input) && input.tag) return input.tag;
|
|
68
|
+
return void 0;
|
|
69
|
+
};
|
|
70
|
+
var exportStaticIr2 = (module) => {
|
|
71
|
+
const tag = resolveModuleTag(module);
|
|
72
|
+
if (!tag) return void 0;
|
|
73
|
+
const program = getModuleTraitsProgram(tag);
|
|
74
|
+
if (!program) return void 0;
|
|
75
|
+
return exportStaticIr({
|
|
76
|
+
program,
|
|
77
|
+
moduleId: resolveModuleId(module)
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
// ../logix-core/src/internal/reflection/manifest.ts
|
|
82
|
+
import { Schema } from "../effect.js";
|
|
83
|
+
var isRecord2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
84
|
+
var isModuleImpl2 = (value) => isRecord2(value) && value._tag === "ModuleImpl" && isRecord2(value.module);
|
|
85
|
+
var resolveModuleId2 = (input) => {
|
|
86
|
+
if (isModuleImpl2(input)) {
|
|
87
|
+
const id = input.module.id;
|
|
88
|
+
return typeof id === "string" && id.length > 0 ? id : "unknown";
|
|
89
|
+
}
|
|
90
|
+
if (isRecord2(input)) {
|
|
91
|
+
const id = input.id;
|
|
92
|
+
if (typeof id === "string" && id.length > 0) return id;
|
|
93
|
+
const tag = input.tag;
|
|
94
|
+
if (tag && (typeof tag === "object" || typeof tag === "function")) {
|
|
95
|
+
const tagId = tag.id;
|
|
96
|
+
if (typeof tagId === "string" && tagId.length > 0) return tagId;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return "unknown";
|
|
100
|
+
};
|
|
101
|
+
var resolveActionKeys = (input) => {
|
|
102
|
+
const tag = isModuleImpl2(input) ? input.module : input?.tag;
|
|
103
|
+
const actionMap = tag?.shape?.actionMap;
|
|
104
|
+
if (!isRecord2(actionMap)) return [];
|
|
105
|
+
return Object.keys(actionMap).sort();
|
|
106
|
+
};
|
|
107
|
+
var resolveDevSource = (input) => {
|
|
108
|
+
if (!isRecord2(input)) return void 0;
|
|
109
|
+
const file = input.file;
|
|
110
|
+
const line = input.line;
|
|
111
|
+
const column = input.column;
|
|
112
|
+
if (typeof file !== "string" || file.length === 0) return void 0;
|
|
113
|
+
if (typeof line !== "number" || !Number.isInteger(line) || line < 1) return void 0;
|
|
114
|
+
if (typeof column !== "number" || !Number.isInteger(column) || column < 1) return void 0;
|
|
115
|
+
return { file, line, column };
|
|
116
|
+
};
|
|
117
|
+
var resolveTokenSource = (token) => {
|
|
118
|
+
if (!token || typeof token !== "object" && typeof token !== "function") return void 0;
|
|
119
|
+
return resolveDevSource(token.source);
|
|
120
|
+
};
|
|
121
|
+
var resolveActions = (input) => {
|
|
122
|
+
const tag = isModuleImpl2(input) ? input.module : input?.tag;
|
|
123
|
+
const actionMap = tag?.shape?.actionMap;
|
|
124
|
+
if (!isRecord2(actionMap)) return [];
|
|
125
|
+
const moduleSource = resolveSource(input);
|
|
126
|
+
const reducers = isRecord2(tag?.reducers) ? tag.reducers : void 0;
|
|
127
|
+
const actionTags = Object.keys(actionMap).sort();
|
|
128
|
+
const out = [];
|
|
129
|
+
for (const actionTag of actionTags) {
|
|
130
|
+
const token = actionMap[actionTag];
|
|
131
|
+
const source = resolveTokenSource(token) ?? moduleSource;
|
|
132
|
+
const payloadKind = isActionToken(token) && Schema.isSchema(token.schema) ? token.schema === Schema.Void ? "void" : "nonVoid" : "unknown";
|
|
133
|
+
const primaryReducer = reducers && typeof reducers[actionTag] === "function" ? { kind: "declared" } : void 0;
|
|
134
|
+
out.push({
|
|
135
|
+
actionTag,
|
|
136
|
+
payload: { kind: payloadKind },
|
|
137
|
+
...primaryReducer ? { primaryReducer } : {},
|
|
138
|
+
...source ? { source } : {}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return out;
|
|
142
|
+
};
|
|
143
|
+
var MODULE_DECLARED_EFFECTS = /* @__PURE__ */ Symbol.for("logix.module.effects.declared");
|
|
144
|
+
var resolveEffects = (input) => {
|
|
145
|
+
const tag = isModuleImpl2(input) ? input.module : input?.tag;
|
|
146
|
+
const actionMap = tag?.shape?.actionMap;
|
|
147
|
+
if (!isRecord2(actionMap)) return void 0;
|
|
148
|
+
const effectsRaw = tag?.[MODULE_DECLARED_EFFECTS];
|
|
149
|
+
if (!isRecord2(effectsRaw)) return void 0;
|
|
150
|
+
const source = resolveSource(input);
|
|
151
|
+
const logicUnitId = "__logix_internal:effects:declared";
|
|
152
|
+
const handlerIds = /* @__PURE__ */ new WeakMap();
|
|
153
|
+
let nextHandlerSeq = 0;
|
|
154
|
+
const out = [];
|
|
155
|
+
for (const actionTag of Object.keys(effectsRaw).sort()) {
|
|
156
|
+
if (!(actionTag in actionMap)) continue;
|
|
157
|
+
const handlers = effectsRaw[actionTag];
|
|
158
|
+
if (!Array.isArray(handlers)) continue;
|
|
159
|
+
for (const handler of handlers) {
|
|
160
|
+
if (typeof handler !== "function") continue;
|
|
161
|
+
let handlerId = handlerIds.get(handler);
|
|
162
|
+
if (!handlerId) {
|
|
163
|
+
nextHandlerSeq += 1;
|
|
164
|
+
handlerId = `h${nextHandlerSeq}`;
|
|
165
|
+
handlerIds.set(handler, handlerId);
|
|
166
|
+
}
|
|
167
|
+
const sourceKey = `${logicUnitId}::${handlerId}`;
|
|
168
|
+
out.push({
|
|
169
|
+
actionTag,
|
|
170
|
+
sourceKey,
|
|
171
|
+
kind: "declared",
|
|
172
|
+
...source ? { source } : {}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
const seen = /* @__PURE__ */ new Set();
|
|
177
|
+
const deduped = [];
|
|
178
|
+
for (const item of out) {
|
|
179
|
+
const key = `${item.actionTag}\0${item.sourceKey}`;
|
|
180
|
+
if (seen.has(key)) continue;
|
|
181
|
+
seen.add(key);
|
|
182
|
+
deduped.push(item);
|
|
183
|
+
}
|
|
184
|
+
deduped.sort(
|
|
185
|
+
(a, b) => a.actionTag < b.actionTag ? -1 : a.actionTag > b.actionTag ? 1 : a.sourceKey < b.sourceKey ? -1 : a.sourceKey > b.sourceKey ? 1 : 0
|
|
186
|
+
);
|
|
187
|
+
return deduped.length > 0 ? deduped : void 0;
|
|
188
|
+
};
|
|
189
|
+
var resolveSchemaKeys = (input) => {
|
|
190
|
+
if (!isRecord2(input)) return void 0;
|
|
191
|
+
const schemas = input.schemas;
|
|
192
|
+
if (!isRecord2(schemas)) return void 0;
|
|
193
|
+
return Object.keys(schemas).sort();
|
|
194
|
+
};
|
|
195
|
+
var resolveSource = (input) => {
|
|
196
|
+
if (!isRecord2(input)) return void 0;
|
|
197
|
+
const dev = input.dev;
|
|
198
|
+
return resolveDevSource(dev?.source);
|
|
199
|
+
};
|
|
200
|
+
var resolveMeta = (input) => {
|
|
201
|
+
if (!isRecord2(input)) return void 0;
|
|
202
|
+
const meta = input.meta;
|
|
203
|
+
if (!isRecord2(meta)) return void 0;
|
|
204
|
+
const out = {};
|
|
205
|
+
for (const key of Object.keys(meta).sort()) {
|
|
206
|
+
const value = meta[key];
|
|
207
|
+
if (isJsonValue(value)) {
|
|
208
|
+
out[key] = value;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return Object.keys(out).length > 0 ? out : void 0;
|
|
212
|
+
};
|
|
213
|
+
var MODULE_INTERNAL = /* @__PURE__ */ Symbol.for("logix.module.internal");
|
|
214
|
+
var resolveLogicUnits = (input) => {
|
|
215
|
+
if (!isRecord2(input)) return void 0;
|
|
216
|
+
const internal = input[MODULE_INTERNAL];
|
|
217
|
+
const mounted = internal?.mounted;
|
|
218
|
+
if (!Array.isArray(mounted)) return void 0;
|
|
219
|
+
const out = [];
|
|
220
|
+
for (const unit of mounted) {
|
|
221
|
+
if (!isRecord2(unit)) continue;
|
|
222
|
+
const kind = unit.kind;
|
|
223
|
+
const id = unit.id;
|
|
224
|
+
if (typeof kind !== "string" || kind.length === 0) continue;
|
|
225
|
+
if (typeof id !== "string" || id.length === 0) continue;
|
|
226
|
+
const derived = unit.derived === true ? true : void 0;
|
|
227
|
+
const name = typeof unit.name === "string" ? unit.name : void 0;
|
|
228
|
+
out.push({ kind, id, derived, name });
|
|
229
|
+
}
|
|
230
|
+
out.sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : a.kind < b.kind ? -1 : a.kind > b.kind ? 1 : 0);
|
|
231
|
+
return out.length > 0 ? out : void 0;
|
|
232
|
+
};
|
|
233
|
+
var digestOf = (base) => `manifest:067:${fnv1a32(stableStringify(base))}`;
|
|
234
|
+
var utf8ByteLength = (value) => {
|
|
235
|
+
const json = JSON.stringify(value);
|
|
236
|
+
if (typeof TextEncoder !== "undefined") {
|
|
237
|
+
return new TextEncoder().encode(json).length;
|
|
238
|
+
}
|
|
239
|
+
return json.length;
|
|
240
|
+
};
|
|
241
|
+
var applyMaxBytes = (manifest, maxBytes) => {
|
|
242
|
+
const originalBytes = utf8ByteLength(manifest);
|
|
243
|
+
if (originalBytes <= maxBytes) return manifest;
|
|
244
|
+
const dropped = [];
|
|
245
|
+
const truncatedArrays = [];
|
|
246
|
+
const baseMarker = () => ({
|
|
247
|
+
truncated: true,
|
|
248
|
+
maxBytes,
|
|
249
|
+
originalBytes,
|
|
250
|
+
dropped,
|
|
251
|
+
truncatedArrays
|
|
252
|
+
});
|
|
253
|
+
const withMarker = (next2) => {
|
|
254
|
+
const meta = {
|
|
255
|
+
__logix: baseMarker()
|
|
256
|
+
};
|
|
257
|
+
return { ...next2, meta };
|
|
258
|
+
};
|
|
259
|
+
let next = withMarker(manifest);
|
|
260
|
+
const markTruncatedArray = (name) => {
|
|
261
|
+
if (!truncatedArrays.includes(name)) {
|
|
262
|
+
truncatedArrays.push(name);
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
const dropField = (field) => {
|
|
266
|
+
if (next[field] !== void 0) {
|
|
267
|
+
dropped.push(String(field));
|
|
268
|
+
next = withMarker({ ...next, [field]: void 0 });
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
dropField("meta");
|
|
272
|
+
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
273
|
+
dropField("source");
|
|
274
|
+
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
275
|
+
dropField("staticIr");
|
|
276
|
+
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
277
|
+
dropField("logicUnits");
|
|
278
|
+
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
279
|
+
dropField("schemaKeys");
|
|
280
|
+
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
281
|
+
dropField("effects");
|
|
282
|
+
if (utf8ByteLength(next) <= maxBytes) return next;
|
|
283
|
+
const truncateActionsToFit = () => {
|
|
284
|
+
const total = next.actions.length;
|
|
285
|
+
if (total <= 1) return;
|
|
286
|
+
let lo = 1;
|
|
287
|
+
let hi = total;
|
|
288
|
+
let best = 1;
|
|
289
|
+
while (lo <= hi) {
|
|
290
|
+
const mid = Math.floor((lo + hi) / 2);
|
|
291
|
+
const candidate = withMarker({
|
|
292
|
+
...next,
|
|
293
|
+
actions: next.actions.slice(0, mid),
|
|
294
|
+
actionKeys: next.actionKeys.slice(0, mid)
|
|
295
|
+
});
|
|
296
|
+
if (utf8ByteLength(candidate) <= maxBytes) {
|
|
297
|
+
best = mid;
|
|
298
|
+
lo = mid + 1;
|
|
299
|
+
} else {
|
|
300
|
+
hi = mid - 1;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if (best < total) {
|
|
304
|
+
markTruncatedArray("actions");
|
|
305
|
+
markTruncatedArray("actionKeys");
|
|
306
|
+
next = withMarker({
|
|
307
|
+
...next,
|
|
308
|
+
actions: next.actions.slice(0, best),
|
|
309
|
+
actionKeys: next.actionKeys.slice(0, best)
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
while (utf8ByteLength(next) > maxBytes) {
|
|
314
|
+
const beforeLen = next.actions.length;
|
|
315
|
+
truncateActionsToFit();
|
|
316
|
+
if (next.actions.length === beforeLen) {
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
return next;
|
|
321
|
+
};
|
|
322
|
+
var extractManifest = (module, options) => {
|
|
323
|
+
const manifestVersion = "067";
|
|
324
|
+
const moduleId = resolveModuleId2(module);
|
|
325
|
+
const actionKeys = resolveActionKeys(module);
|
|
326
|
+
const actions = resolveActions(module);
|
|
327
|
+
const effects = resolveEffects(module);
|
|
328
|
+
const schemaKeys = resolveSchemaKeys(module);
|
|
329
|
+
const logicUnits = resolveLogicUnits(module);
|
|
330
|
+
const source = resolveSource(module);
|
|
331
|
+
const meta = resolveMeta(module);
|
|
332
|
+
const staticIr = options?.includeStaticIr ? exportStaticIr2(module) : void 0;
|
|
333
|
+
const digestBase = {
|
|
334
|
+
manifestVersion,
|
|
335
|
+
moduleId,
|
|
336
|
+
actionKeys,
|
|
337
|
+
actions,
|
|
338
|
+
effects,
|
|
339
|
+
schemaKeys,
|
|
340
|
+
logicUnits,
|
|
341
|
+
staticIrDigest: staticIr?.digest
|
|
342
|
+
};
|
|
343
|
+
const digest = digestOf(digestBase);
|
|
344
|
+
const manifest = {
|
|
345
|
+
manifestVersion,
|
|
346
|
+
moduleId,
|
|
347
|
+
actionKeys,
|
|
348
|
+
actions,
|
|
349
|
+
effects,
|
|
350
|
+
schemaKeys,
|
|
351
|
+
logicUnits,
|
|
352
|
+
source,
|
|
353
|
+
meta,
|
|
354
|
+
staticIr,
|
|
355
|
+
digest
|
|
356
|
+
};
|
|
357
|
+
const maxBytes = options?.budgets?.maxBytes;
|
|
358
|
+
if (typeof maxBytes === "number" && Number.isFinite(maxBytes) && maxBytes > 0) {
|
|
359
|
+
return applyMaxBytes(manifest, maxBytes);
|
|
360
|
+
}
|
|
361
|
+
return manifest;
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
// ../logix-core/src/internal/observability/artifacts/registry.ts
|
|
365
|
+
var ARTIFACT_EXPORTERS = /* @__PURE__ */ Symbol.for("logix.module.trialRunArtifactExporters");
|
|
366
|
+
var registerTrialRunArtifactExporter = (tag, exporter) => {
|
|
367
|
+
if (!tag || typeof tag !== "object" && typeof tag !== "function") {
|
|
368
|
+
throw new Error("[Logix] registerTrialRunArtifactExporter: invalid module tag");
|
|
369
|
+
}
|
|
370
|
+
const current = tag[ARTIFACT_EXPORTERS] ?? [];
|
|
371
|
+
const next = Array.isArray(current) ? [...current, exporter] : [exporter];
|
|
372
|
+
tag[ARTIFACT_EXPORTERS] = next;
|
|
373
|
+
};
|
|
374
|
+
var getTrialRunArtifactExporters = (tag) => {
|
|
375
|
+
if (!tag || typeof tag !== "object" && typeof tag !== "function") {
|
|
376
|
+
return [];
|
|
377
|
+
}
|
|
378
|
+
const current = tag[ARTIFACT_EXPORTERS];
|
|
379
|
+
if (!Array.isArray(current)) return [];
|
|
380
|
+
return current.filter((x) => x && typeof x === "object");
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
// ../logix-core/src/internal/observability/trialRunModule.ts
|
|
384
|
+
import { Cause as Cause2, Effect as Effect4, Exit, Fiber, Layer as Layer4, Option } from "../effect.js";
|
|
385
|
+
|
|
386
|
+
// ../logix-core/src/internal/platform/BuildEnv.ts
|
|
387
|
+
import { ConfigProvider, Effect as Effect2, Layer as Layer2 } from "../effect.js";
|
|
388
|
+
|
|
389
|
+
// ../logix-core/src/internal/platform/ConstructionGuard.ts
|
|
390
|
+
import { Cause, Effect } from "../effect.js";
|
|
391
|
+
|
|
392
|
+
// ../logix-core/src/internal/platform/RuntimeHost.ts
|
|
393
|
+
import { Context, Layer } from "../effect.js";
|
|
394
|
+
var detectKind = () => {
|
|
395
|
+
const isBrowser = typeof window !== "undefined" && typeof document !== "undefined";
|
|
396
|
+
if (isBrowser) return "browser";
|
|
397
|
+
const isNode = typeof process !== "undefined" && typeof process?.versions?.node === "string";
|
|
398
|
+
if (isNode) return "node";
|
|
399
|
+
return "unknown";
|
|
400
|
+
};
|
|
401
|
+
var make = (kind) => ({
|
|
402
|
+
kind,
|
|
403
|
+
isNode: kind === "node",
|
|
404
|
+
isBrowser: kind === "browser"
|
|
405
|
+
});
|
|
406
|
+
var RuntimeHost = class extends Context.Tag("@logixjs/RuntimeHost")() {
|
|
407
|
+
};
|
|
408
|
+
var layer = (service) => Layer.succeed(RuntimeHost, service);
|
|
409
|
+
var defaultLayer = layer(make(detectKind()));
|
|
410
|
+
|
|
411
|
+
// ../logix-core/src/internal/platform/BuildEnv.ts
|
|
412
|
+
var toConfigProviderFromRecord = (record) => {
|
|
413
|
+
const map = /* @__PURE__ */ new Map();
|
|
414
|
+
for (const [k, v] of Object.entries(record ?? {})) {
|
|
415
|
+
if (!k) continue;
|
|
416
|
+
if (v === void 0) continue;
|
|
417
|
+
map.set(k, String(v));
|
|
418
|
+
}
|
|
419
|
+
return ConfigProvider.fromMap(map);
|
|
420
|
+
};
|
|
421
|
+
var layer2 = (options = {}) => {
|
|
422
|
+
const runtimeHost = options.runtimeHost ? layer(options.runtimeHost) : options.runtimeHostKind ? layer(make(options.runtimeHostKind)) : defaultLayer;
|
|
423
|
+
const configProvider = options.configProvider ? options.configProvider : toConfigProviderFromRecord(options.config);
|
|
424
|
+
const config = Layer2.setConfigProvider(configProvider);
|
|
425
|
+
return Layer2.mergeAll(runtimeHost, config);
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
// ../logix-core/src/internal/runtime/Runtime.ts
|
|
429
|
+
import { Layer as Layer3 } from "../effect.js";
|
|
430
|
+
var make2 = (rootImpl, options) => {
|
|
431
|
+
const appConfig = {
|
|
432
|
+
layer: options?.layer ?? Layer3.empty,
|
|
433
|
+
modules: [provide(rootImpl.module, rootImpl.layer)],
|
|
434
|
+
processes: rootImpl.processes ?? [],
|
|
435
|
+
onError: options?.onError
|
|
436
|
+
};
|
|
437
|
+
const app = makeApp(appConfig);
|
|
438
|
+
return app.makeRuntime();
|
|
439
|
+
};
|
|
440
|
+
|
|
441
|
+
// ../logix-core/src/internal/observability/artifacts/model.ts
|
|
442
|
+
var isArtifactKey = (input) => typeof input === "string" && /^@[^\s/]+\/[^\s@]+@v\d+$/.test(input);
|
|
443
|
+
|
|
444
|
+
// ../logix-core/src/internal/observability/artifacts/digest.ts
|
|
445
|
+
var utf8ByteLengthString = (text) => {
|
|
446
|
+
if (typeof TextEncoder !== "undefined") {
|
|
447
|
+
return new TextEncoder().encode(text).length;
|
|
448
|
+
}
|
|
449
|
+
return text.length;
|
|
450
|
+
};
|
|
451
|
+
var digestJsonValue = (value) => {
|
|
452
|
+
const stableJson = stableStringify(value);
|
|
453
|
+
const bytes = utf8ByteLengthString(stableJson);
|
|
454
|
+
return {
|
|
455
|
+
stableJson,
|
|
456
|
+
bytes,
|
|
457
|
+
digest: `artifact:031:${fnv1a32(stableJson)}`
|
|
458
|
+
};
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
// ../logix-core/src/internal/observability/artifacts/collect.ts
|
|
462
|
+
var toErrorSummaryWithCode = (cause, code, hint) => {
|
|
463
|
+
const base = toSerializableErrorSummary(cause).errorSummary;
|
|
464
|
+
return {
|
|
465
|
+
name: base.name,
|
|
466
|
+
message: base.message,
|
|
467
|
+
code,
|
|
468
|
+
hint: hint ?? base.hint
|
|
469
|
+
};
|
|
470
|
+
};
|
|
471
|
+
var defaultArtifactBudgetBytes = 50 * 1024;
|
|
472
|
+
var budgetOf = (budgets) => typeof budgets?.maxBytes === "number" && Number.isFinite(budgets.maxBytes) && budgets.maxBytes > 0 ? budgets.maxBytes : defaultArtifactBudgetBytes;
|
|
473
|
+
var makeConflictEnvelope = (artifactKey, exporterIds) => {
|
|
474
|
+
const ids = Array.from(new Set(exporterIds.map((s) => String(s)).filter((s) => s.length > 0))).sort();
|
|
475
|
+
return {
|
|
476
|
+
artifactKey,
|
|
477
|
+
envelope: {
|
|
478
|
+
artifactKey,
|
|
479
|
+
ok: false,
|
|
480
|
+
error: {
|
|
481
|
+
name: "ArtifactKeyConflictError",
|
|
482
|
+
message: `[Logix] TrialRun artifact key conflict: ${artifactKey}`,
|
|
483
|
+
code: "ArtifactKeyConflict",
|
|
484
|
+
hint: ids.length > 0 ? `conflictingExporters=${ids.join(",")}` : void 0
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
};
|
|
488
|
+
};
|
|
489
|
+
var truncateJsonValue = (value, maxBytes) => {
|
|
490
|
+
const analyzed = digestJsonValue(value);
|
|
491
|
+
const json = analyzed.stableJson;
|
|
492
|
+
const bytes = analyzed.bytes;
|
|
493
|
+
if (bytes <= maxBytes) {
|
|
494
|
+
return { value, actualBytes: bytes, digest: analyzed.digest };
|
|
495
|
+
}
|
|
496
|
+
const previewChars = Math.min(json.length, Math.max(0, Math.min(256, maxBytes)));
|
|
497
|
+
const preview = json.slice(0, previewChars);
|
|
498
|
+
return {
|
|
499
|
+
value: {
|
|
500
|
+
_tag: "oversized",
|
|
501
|
+
bytes,
|
|
502
|
+
preview
|
|
503
|
+
},
|
|
504
|
+
actualBytes: bytes,
|
|
505
|
+
digest: analyzed.digest
|
|
506
|
+
};
|
|
507
|
+
};
|
|
508
|
+
var collectTrialRunArtifacts = (options) => {
|
|
509
|
+
const exportersSorted = Array.from(options.exporters).sort((a, b) => {
|
|
510
|
+
const ka = String(a?.artifactKey ?? "");
|
|
511
|
+
const kb = String(b?.artifactKey ?? "");
|
|
512
|
+
if (ka < kb) return -1;
|
|
513
|
+
if (ka > kb) return 1;
|
|
514
|
+
const ia = String(a?.exporterId ?? "");
|
|
515
|
+
const ib = String(b?.exporterId ?? "");
|
|
516
|
+
return ia < ib ? -1 : ia > ib ? 1 : 0;
|
|
517
|
+
});
|
|
518
|
+
const conflicts = /* @__PURE__ */ new Map();
|
|
519
|
+
for (const ex of exportersSorted) {
|
|
520
|
+
const key = ex?.artifactKey;
|
|
521
|
+
const id = String(ex?.exporterId ?? "");
|
|
522
|
+
if (!isArtifactKey(key)) {
|
|
523
|
+
continue;
|
|
524
|
+
}
|
|
525
|
+
const current = conflicts.get(key);
|
|
526
|
+
if (current) current.push(id);
|
|
527
|
+
else conflicts.set(key, [id]);
|
|
528
|
+
}
|
|
529
|
+
const conflictKeys = /* @__PURE__ */ new Set();
|
|
530
|
+
for (const [k, ids] of conflicts) {
|
|
531
|
+
const unique = Array.from(new Set(ids));
|
|
532
|
+
if (unique.length > 1) {
|
|
533
|
+
conflictKeys.add(k);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
const maxBytes = budgetOf(options.budgets);
|
|
537
|
+
const collected = [];
|
|
538
|
+
for (const exporter of exportersSorted) {
|
|
539
|
+
const artifactKey = exporter?.artifactKey;
|
|
540
|
+
if (!isArtifactKey(artifactKey)) {
|
|
541
|
+
continue;
|
|
542
|
+
}
|
|
543
|
+
if (conflictKeys.has(artifactKey)) {
|
|
544
|
+
continue;
|
|
545
|
+
}
|
|
546
|
+
try {
|
|
547
|
+
const value = exporter.export(options.ctx);
|
|
548
|
+
if (value === void 0) continue;
|
|
549
|
+
if (!isJsonValue(value)) {
|
|
550
|
+
collected.push({
|
|
551
|
+
artifactKey,
|
|
552
|
+
envelope: {
|
|
553
|
+
artifactKey,
|
|
554
|
+
ok: false,
|
|
555
|
+
error: toErrorSummaryWithCode(
|
|
556
|
+
new Error(`[Logix] Artifact exporter returned non-JsonValue: ${exporter.exporterId}`),
|
|
557
|
+
"ArtifactNonSerializable",
|
|
558
|
+
`artifactKey=${artifactKey} exporterId=${exporter.exporterId}`
|
|
559
|
+
)
|
|
560
|
+
}
|
|
561
|
+
});
|
|
562
|
+
continue;
|
|
563
|
+
}
|
|
564
|
+
const truncated = truncateJsonValue(value, maxBytes);
|
|
565
|
+
const envelope = {
|
|
566
|
+
artifactKey,
|
|
567
|
+
ok: true,
|
|
568
|
+
value: truncated.value,
|
|
569
|
+
digest: truncated.digest,
|
|
570
|
+
...truncated.actualBytes > maxBytes ? {
|
|
571
|
+
truncated: true,
|
|
572
|
+
budgetBytes: maxBytes,
|
|
573
|
+
actualBytes: truncated.actualBytes
|
|
574
|
+
} : {
|
|
575
|
+
budgetBytes: maxBytes,
|
|
576
|
+
actualBytes: truncated.actualBytes
|
|
577
|
+
}
|
|
578
|
+
};
|
|
579
|
+
collected.push({ artifactKey, envelope });
|
|
580
|
+
} catch (e) {
|
|
581
|
+
collected.push({
|
|
582
|
+
artifactKey,
|
|
583
|
+
envelope: {
|
|
584
|
+
artifactKey,
|
|
585
|
+
ok: false,
|
|
586
|
+
error: toErrorSummaryWithCode(
|
|
587
|
+
e,
|
|
588
|
+
"ArtifactExportFailed",
|
|
589
|
+
`artifactKey=${artifactKey} exporterId=${exporter.exporterId}`
|
|
590
|
+
)
|
|
591
|
+
}
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
for (const conflictKey of Array.from(conflictKeys).sort()) {
|
|
596
|
+
collected.push(makeConflictEnvelope(conflictKey, conflicts.get(conflictKey) ?? []));
|
|
597
|
+
}
|
|
598
|
+
if (collected.length === 0) return void 0;
|
|
599
|
+
collected.sort((a, b) => a.artifactKey < b.artifactKey ? -1 : a.artifactKey > b.artifactKey ? 1 : 0);
|
|
600
|
+
return Object.fromEntries(collected.map((c) => [c.artifactKey, c.envelope]));
|
|
601
|
+
};
|
|
602
|
+
|
|
603
|
+
// ../logix-core/src/internal/observability/trialRunModule.ts
|
|
604
|
+
var defaultHost = () => {
|
|
605
|
+
if (typeof window !== "undefined" && typeof document !== "undefined") return "browser";
|
|
606
|
+
return "node";
|
|
607
|
+
};
|
|
608
|
+
var isRecord3 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
609
|
+
var resolveRootImpl = (root) => root?._tag === "ModuleImpl" ? root : root?.impl;
|
|
610
|
+
var utf8ByteLength2 = (value) => {
|
|
611
|
+
const json = JSON.stringify(value);
|
|
612
|
+
if (typeof TextEncoder !== "undefined") {
|
|
613
|
+
return new TextEncoder().encode(json).length;
|
|
614
|
+
}
|
|
615
|
+
return json.length;
|
|
616
|
+
};
|
|
617
|
+
var parseMissingConfigKeys = (message) => {
|
|
618
|
+
const out = [];
|
|
619
|
+
const patterns = [
|
|
620
|
+
/\bMissing (?:data|value) for (?:key|path) "?([A-Z0-9_./:-]+)"?/g,
|
|
621
|
+
/\bMissing (?:data|value) at ([A-Z0-9_./:-]+)\b/g,
|
|
622
|
+
/\bMissing configuration:? "?([A-Z0-9_./:-]+)"?/g,
|
|
623
|
+
/\bConfig\b.*\bmissing\b.*"?([A-Z0-9_./:-]+)"?/gi
|
|
624
|
+
];
|
|
625
|
+
for (const re of patterns) {
|
|
626
|
+
let match;
|
|
627
|
+
while (match = re.exec(message)) {
|
|
628
|
+
const key = match[1];
|
|
629
|
+
if (typeof key === "string" && key.length > 0) out.push(key);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
return Array.from(new Set(out)).sort();
|
|
633
|
+
};
|
|
634
|
+
var parseMissingServiceIds = (message) => {
|
|
635
|
+
const out = [];
|
|
636
|
+
const re = /Service not found: ([^\s(]+)/g;
|
|
637
|
+
let match;
|
|
638
|
+
while (match = re.exec(message)) {
|
|
639
|
+
const id = match[1]?.replace(/[,:.;]+$/, "");
|
|
640
|
+
if (typeof id === "string" && id.length > 0) out.push(id);
|
|
641
|
+
}
|
|
642
|
+
return Array.from(new Set(out)).sort();
|
|
643
|
+
};
|
|
644
|
+
var parseMissingDependencyFromCause = (cause) => {
|
|
645
|
+
const missingServices = [];
|
|
646
|
+
const missingConfigKeys = [];
|
|
647
|
+
const candidates = [...Array.from(Cause2.failures(cause)), ...Array.from(Cause2.defects(cause))];
|
|
648
|
+
for (const candidate of candidates) {
|
|
649
|
+
if (isRecord3(candidate) && candidate._tag === "ConstructionGuardError") {
|
|
650
|
+
const missingService = candidate.missingService;
|
|
651
|
+
if (typeof missingService === "string" && missingService.length > 0) {
|
|
652
|
+
missingServices.push(missingService);
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
if (isRecord3(candidate) && candidate._tag === "ConfigError" && candidate._op === "MissingData" && Array.isArray(candidate.path) && candidate.path.every((k) => typeof k === "string" && k.length > 0)) {
|
|
656
|
+
const key = candidate.path.join(".");
|
|
657
|
+
if (key.length > 0) missingConfigKeys.push(key);
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
const messages = [];
|
|
661
|
+
for (const candidate of candidates) {
|
|
662
|
+
if (candidate instanceof Error) {
|
|
663
|
+
messages.push(candidate.message);
|
|
664
|
+
continue;
|
|
665
|
+
}
|
|
666
|
+
if (typeof candidate === "string") {
|
|
667
|
+
messages.push(candidate);
|
|
668
|
+
continue;
|
|
669
|
+
}
|
|
670
|
+
if (isRecord3(candidate) && typeof candidate.message === "string") {
|
|
671
|
+
messages.push(String(candidate.message));
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
try {
|
|
675
|
+
messages.push(Cause2.pretty(cause, { renderErrorCause: true }));
|
|
676
|
+
} catch {
|
|
677
|
+
}
|
|
678
|
+
const merged = messages.filter((s) => s.length > 0).join("\n");
|
|
679
|
+
if (merged) {
|
|
680
|
+
missingServices.push(...parseMissingServiceIds(merged));
|
|
681
|
+
missingConfigKeys.push(...parseMissingConfigKeys(merged));
|
|
682
|
+
}
|
|
683
|
+
return {
|
|
684
|
+
missingServices: Array.from(new Set(missingServices)).sort(),
|
|
685
|
+
missingConfigKeys: Array.from(new Set(missingConfigKeys)).sort()
|
|
686
|
+
};
|
|
687
|
+
};
|
|
688
|
+
var buildEnvironmentIr = (params) => {
|
|
689
|
+
const providedConfigKeys = Object.keys(params.buildEnvConfig ?? {}).filter((k) => k.length > 0 && params.buildEnvConfig[k] !== void 0).sort();
|
|
690
|
+
const missingServices = Array.from(new Set(params.missingServices ?? [])).sort();
|
|
691
|
+
const missingConfigKeys = Array.from(new Set(params.missingConfigKeys ?? [])).sort();
|
|
692
|
+
const runtimeServiceIds = params.runtimeServicesEvidence?.bindings?.map((b) => b.serviceId).filter((s) => typeof s === "string") ?? [];
|
|
693
|
+
const tagIds = Array.from(/* @__PURE__ */ new Set([...runtimeServiceIds, ...missingServices])).sort();
|
|
694
|
+
const configKeys = Array.from(/* @__PURE__ */ new Set([...providedConfigKeys, ...missingConfigKeys])).sort();
|
|
695
|
+
return {
|
|
696
|
+
tagIds,
|
|
697
|
+
configKeys,
|
|
698
|
+
missingServices,
|
|
699
|
+
missingConfigKeys,
|
|
700
|
+
kernelImplementationRef: params.kernelImplementationRef,
|
|
701
|
+
runtimeServicesEvidence: params.runtimeServicesEvidence
|
|
702
|
+
};
|
|
703
|
+
};
|
|
704
|
+
var toErrorSummaryWithCode2 = (cause, code, hint) => {
|
|
705
|
+
const base = toSerializableErrorSummary(cause).errorSummary;
|
|
706
|
+
return {
|
|
707
|
+
name: base.name,
|
|
708
|
+
message: base.message,
|
|
709
|
+
code,
|
|
710
|
+
hint: hint ?? base.hint
|
|
711
|
+
};
|
|
712
|
+
};
|
|
713
|
+
var makeTrialRunTimeoutError = () => Object.assign(new Error("[Logix] trialRunModule timed out"), {
|
|
714
|
+
name: "TrialRunTimeoutError"
|
|
715
|
+
});
|
|
716
|
+
var awaitFiberExitWithTimeout = (fiber, timeoutMs) => Effect4.gen(function* () {
|
|
717
|
+
const hasTimeout = typeof timeoutMs === "number" && Number.isFinite(timeoutMs) && timeoutMs > 0;
|
|
718
|
+
const start = hasTimeout ? Date.now() : 0;
|
|
719
|
+
while (true) {
|
|
720
|
+
const exitOpt = yield* Fiber.poll(fiber);
|
|
721
|
+
if (Option.isSome(exitOpt)) {
|
|
722
|
+
return exitOpt.value;
|
|
723
|
+
}
|
|
724
|
+
if (hasTimeout) {
|
|
725
|
+
const elapsedMs = Date.now() - start;
|
|
726
|
+
if (elapsedMs >= timeoutMs) {
|
|
727
|
+
yield* Fiber.interruptFork(fiber);
|
|
728
|
+
return Exit.fail(makeTrialRunTimeoutError());
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
yield* Effect4.promise(() => new Promise((r) => setTimeout(r, 1)));
|
|
732
|
+
}
|
|
733
|
+
});
|
|
734
|
+
var trialRunModule = (root, options) => Effect4.gen(function* () {
|
|
735
|
+
const rootImpl = resolveRootImpl(root);
|
|
736
|
+
const session = makeRunSession({
|
|
737
|
+
runId: options?.runId,
|
|
738
|
+
source: options?.source ?? { host: defaultHost(), label: "trial-run-module" },
|
|
739
|
+
startedAt: options?.startedAt
|
|
740
|
+
});
|
|
741
|
+
const collector = makeEvidenceCollector(session);
|
|
742
|
+
const convergeCollector = {
|
|
743
|
+
register: (ir) => {
|
|
744
|
+
collector.registerConvergeStaticIr(ir);
|
|
745
|
+
}
|
|
746
|
+
};
|
|
747
|
+
const sinksLayer = appendSinks([collector.debugSink]);
|
|
748
|
+
const resolvedDiagnosticsLevel = options?.diagnosticsLevel ?? "light";
|
|
749
|
+
const diagnosticsLayer = diagnosticsLevel(resolvedDiagnosticsLevel);
|
|
750
|
+
const convergeLayer = appendConvergeStaticIrCollectors([convergeCollector]);
|
|
751
|
+
const collectorLayer = evidenceCollectorLayer(collector);
|
|
752
|
+
const sessionLayer = runSessionLayer(session);
|
|
753
|
+
const buildEnvConfig = options?.buildEnv?.config;
|
|
754
|
+
const buildEnvLayer = layer2({
|
|
755
|
+
runtimeHostKind: options?.buildEnv?.hostKind,
|
|
756
|
+
config: buildEnvConfig,
|
|
757
|
+
configProvider: options?.buildEnv?.configProvider
|
|
758
|
+
});
|
|
759
|
+
const trialLayer = Layer4.mergeAll(
|
|
760
|
+
buildEnvLayer,
|
|
761
|
+
options?.layer ?? Layer4.empty,
|
|
762
|
+
sessionLayer,
|
|
763
|
+
collectorLayer,
|
|
764
|
+
diagnosticsLayer,
|
|
765
|
+
sinksLayer,
|
|
766
|
+
convergeLayer
|
|
767
|
+
);
|
|
768
|
+
const kernel = yield* makeProgramRunnerKernel(
|
|
769
|
+
(impl) => make2(impl, {
|
|
770
|
+
layer: trialLayer
|
|
771
|
+
// trial-run does not enable devtools by default; diagnostics is controlled by diagnosticsLevel.
|
|
772
|
+
}),
|
|
773
|
+
rootImpl
|
|
774
|
+
);
|
|
775
|
+
const identity = kernel.identity;
|
|
776
|
+
const bootFiber = kernel.runtime.runFork(rootImpl.module);
|
|
777
|
+
const bootExit = yield* awaitFiberExitWithTimeout(bootFiber, options?.trialRunTimeoutMs);
|
|
778
|
+
let kernelImplementationRef;
|
|
779
|
+
let runtimeServicesEvidence;
|
|
780
|
+
let instanceId;
|
|
781
|
+
if (Exit.isSuccess(bootExit)) {
|
|
782
|
+
const moduleRuntime = bootExit.value;
|
|
783
|
+
instanceId = typeof moduleRuntime?.instanceId === "string" && moduleRuntime.instanceId.length > 0 ? moduleRuntime.instanceId : void 0;
|
|
784
|
+
kernel.setInstanceId(instanceId);
|
|
785
|
+
try {
|
|
786
|
+
kernelImplementationRef = getKernelImplementationRef(moduleRuntime);
|
|
787
|
+
} catch {
|
|
788
|
+
kernelImplementationRef = void 0;
|
|
789
|
+
}
|
|
790
|
+
if (resolvedDiagnosticsLevel !== "off") {
|
|
791
|
+
try {
|
|
792
|
+
runtimeServicesEvidence = getRuntimeServicesEvidence(moduleRuntime);
|
|
793
|
+
} catch {
|
|
794
|
+
runtimeServicesEvidence = void 0;
|
|
795
|
+
}
|
|
796
|
+
}
|
|
797
|
+
} else {
|
|
798
|
+
const failure = Cause2.failureOption(bootExit.cause);
|
|
799
|
+
if (Option.isSome(failure)) {
|
|
800
|
+
const err = failure.value;
|
|
801
|
+
const instanceIdFromErr = typeof err?.instanceId === "string" ? err.instanceId : void 0;
|
|
802
|
+
if (instanceIdFromErr && instanceIdFromErr.length > 0) {
|
|
803
|
+
kernel.setInstanceId(instanceIdFromErr);
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
const closeExit = yield* Effect4.exit(
|
|
808
|
+
kernel.close({
|
|
809
|
+
timeoutMs: typeof options?.closeScopeTimeout === "number" && Number.isFinite(options.closeScopeTimeout) && options.closeScopeTimeout > 0 ? options.closeScopeTimeout : 1e3
|
|
810
|
+
})
|
|
811
|
+
);
|
|
812
|
+
const evidence = collector.exportEvidencePackage({
|
|
813
|
+
maxEvents: options?.maxEvents ?? 1e3
|
|
814
|
+
});
|
|
815
|
+
const manifest = (() => {
|
|
816
|
+
try {
|
|
817
|
+
return extractManifest(root, {
|
|
818
|
+
includeStaticIr: true,
|
|
819
|
+
budgets: { maxBytes: 2e5 }
|
|
820
|
+
});
|
|
821
|
+
} catch {
|
|
822
|
+
return void 0;
|
|
823
|
+
}
|
|
824
|
+
})();
|
|
825
|
+
const staticIr = (() => {
|
|
826
|
+
try {
|
|
827
|
+
return exportStaticIr2(root);
|
|
828
|
+
} catch {
|
|
829
|
+
return void 0;
|
|
830
|
+
}
|
|
831
|
+
})();
|
|
832
|
+
let ok = Exit.isSuccess(bootExit) && Exit.isSuccess(closeExit);
|
|
833
|
+
let error;
|
|
834
|
+
let summary;
|
|
835
|
+
const depsFromBootFailure = Exit.isFailure(bootExit) ? parseMissingDependencyFromCause(bootExit.cause) : { missingServices: [], missingConfigKeys: [] };
|
|
836
|
+
const missingServices = depsFromBootFailure.missingServices;
|
|
837
|
+
const missingConfigKeys = depsFromBootFailure.missingConfigKeys;
|
|
838
|
+
const closeError = Exit.isFailure(closeExit) ? Option.getOrUndefined(Cause2.dieOption(closeExit.cause)) : void 0;
|
|
839
|
+
if (!Exit.isSuccess(bootExit)) {
|
|
840
|
+
const failure = Option.getOrUndefined(Cause2.failureOption(bootExit.cause));
|
|
841
|
+
const defect = Option.getOrUndefined(Cause2.dieOption(bootExit.cause));
|
|
842
|
+
const base = failure ?? defect ?? bootExit.cause;
|
|
843
|
+
if (missingServices.length > 0 || missingConfigKeys.length > 0) {
|
|
844
|
+
ok = false;
|
|
845
|
+
error = toErrorSummaryWithCode2(
|
|
846
|
+
base,
|
|
847
|
+
"MissingDependency",
|
|
848
|
+
missingServices.length > 0 ? "Build-time missing service: provide a Layer mock/implementation via options.layer, or move the dependency access to runtime." : "Build-time missing config: provide the missing key(s) in buildEnv.config, or add a default value to Config."
|
|
849
|
+
);
|
|
850
|
+
} else if (isRecord3(base) && (base.name === "TrialRunTimeoutError" || base._tag === "TrialRunTimeout")) {
|
|
851
|
+
ok = false;
|
|
852
|
+
error = toErrorSummaryWithCode2(
|
|
853
|
+
base,
|
|
854
|
+
"TrialRunTimeout",
|
|
855
|
+
"Trial run timed out: check for Layer/assembly phase blocking (Effect.never / unfinished acquire)."
|
|
856
|
+
);
|
|
857
|
+
} else {
|
|
858
|
+
ok = false;
|
|
859
|
+
error = toErrorSummaryWithCode2(base, "RuntimeFailure");
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
if (Exit.isFailure(closeExit)) {
|
|
863
|
+
const died = Option.getOrUndefined(Cause2.dieOption(closeExit.cause));
|
|
864
|
+
const failure = Option.getOrUndefined(Cause2.failureOption(closeExit.cause));
|
|
865
|
+
const base = died ?? failure ?? closeExit.cause;
|
|
866
|
+
const closeErrorSummary = (() => {
|
|
867
|
+
const tag = isRecord3(base) ? base._tag : void 0;
|
|
868
|
+
if (tag === "DisposeTimeout") {
|
|
869
|
+
return toErrorSummaryWithCode2(
|
|
870
|
+
base,
|
|
871
|
+
"DisposeTimeout",
|
|
872
|
+
"Dispose timed out: check for unclosed resource handles, fibers not interrupted, or event listeners not unregistered."
|
|
873
|
+
);
|
|
874
|
+
}
|
|
875
|
+
return toErrorSummaryWithCode2(base, "RuntimeFailure");
|
|
876
|
+
})();
|
|
877
|
+
ok = false;
|
|
878
|
+
if (!error) {
|
|
879
|
+
error = closeErrorSummary;
|
|
880
|
+
} else {
|
|
881
|
+
summary = { __logix: { closeError: closeErrorSummary } };
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
const environment = buildEnvironmentIr({
|
|
885
|
+
kernelImplementationRef,
|
|
886
|
+
runtimeServicesEvidence,
|
|
887
|
+
buildEnvConfig,
|
|
888
|
+
missingServices,
|
|
889
|
+
missingConfigKeys
|
|
890
|
+
});
|
|
891
|
+
const moduleId = typeof rootImpl.module?.id === "string" && rootImpl.module.id.length > 0 ? String(rootImpl.module.id) : manifest?.moduleId ?? "unknown";
|
|
892
|
+
const artifacts = collectTrialRunArtifacts({
|
|
893
|
+
exporters: getTrialRunArtifactExporters(rootImpl.module),
|
|
894
|
+
ctx: {
|
|
895
|
+
moduleId,
|
|
896
|
+
manifest,
|
|
897
|
+
staticIr,
|
|
898
|
+
environment
|
|
899
|
+
}
|
|
900
|
+
});
|
|
901
|
+
let report = {
|
|
902
|
+
runId: session.runId,
|
|
903
|
+
ok,
|
|
904
|
+
manifest,
|
|
905
|
+
staticIr,
|
|
906
|
+
artifacts,
|
|
907
|
+
environment,
|
|
908
|
+
evidence,
|
|
909
|
+
summary,
|
|
910
|
+
error
|
|
911
|
+
};
|
|
912
|
+
const maxBytes = options?.budgets?.maxBytes;
|
|
913
|
+
if (typeof maxBytes === "number" && Number.isFinite(maxBytes) && maxBytes > 0) {
|
|
914
|
+
const originalBytes = utf8ByteLength2(report);
|
|
915
|
+
if (originalBytes > maxBytes) {
|
|
916
|
+
report = {
|
|
917
|
+
runId: session.runId,
|
|
918
|
+
ok: false,
|
|
919
|
+
environment,
|
|
920
|
+
error: {
|
|
921
|
+
message: `[Logix] TrialRunReport exceeded maxBytes (${originalBytes} > ${maxBytes})`,
|
|
922
|
+
code: "Oversized",
|
|
923
|
+
hint: "Reduce maxEvents or budgets.maxBytes, or split manifest/evidence artifacts in CI."
|
|
924
|
+
},
|
|
925
|
+
summary: {
|
|
926
|
+
__logix: {
|
|
927
|
+
truncated: true,
|
|
928
|
+
maxBytes,
|
|
929
|
+
originalBytes,
|
|
930
|
+
dropped: ["manifest", "staticIr", "artifacts", "evidence"]
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
};
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
return report;
|
|
937
|
+
});
|
|
938
|
+
|
|
939
|
+
// ../logix-core/src/internal/observability/trialRun.ts
|
|
940
|
+
import { Effect as Effect5, Layer as Layer5, Scope } from "../effect.js";
|
|
941
|
+
var defaultHost2 = () => {
|
|
942
|
+
if (typeof window !== "undefined" && typeof document !== "undefined") return "browser";
|
|
943
|
+
return "node";
|
|
944
|
+
};
|
|
945
|
+
var trialRun = (program, options) => Effect5.gen(function* () {
|
|
946
|
+
const session = makeRunSession({
|
|
947
|
+
runId: options?.runId,
|
|
948
|
+
source: options?.source ?? { host: defaultHost2(), label: "trial-run" },
|
|
949
|
+
startedAt: options?.startedAt
|
|
950
|
+
});
|
|
951
|
+
const collector = makeEvidenceCollector(session);
|
|
952
|
+
const convergeCollector = {
|
|
953
|
+
register: (ir) => {
|
|
954
|
+
collector.registerConvergeStaticIr(ir);
|
|
955
|
+
}
|
|
956
|
+
};
|
|
957
|
+
const sinksLayer = appendSinks([collector.debugSink]);
|
|
958
|
+
const diagnosticsLayer = diagnosticsLevel(options?.diagnosticsLevel ?? "light");
|
|
959
|
+
const convergeLayer = appendConvergeStaticIrCollectors([convergeCollector]);
|
|
960
|
+
const collectorLayer = evidenceCollectorLayer(collector);
|
|
961
|
+
const sessionLayer = runSessionLayer(session);
|
|
962
|
+
const overridesLayer = options?.runtimeServicesInstanceOverrides != null ? Layer5.succeed(
|
|
963
|
+
RuntimeServicesInstanceOverridesTag,
|
|
964
|
+
options.runtimeServicesInstanceOverrides
|
|
965
|
+
) : Layer5.empty;
|
|
966
|
+
const trialLayer = Layer5.mergeAll(
|
|
967
|
+
options?.layer ?? Layer5.empty,
|
|
968
|
+
sessionLayer,
|
|
969
|
+
collectorLayer,
|
|
970
|
+
overridesLayer,
|
|
971
|
+
diagnosticsLayer,
|
|
972
|
+
sinksLayer,
|
|
973
|
+
convergeLayer
|
|
974
|
+
);
|
|
975
|
+
const scope = yield* Scope.make();
|
|
976
|
+
const exit = yield* Effect5.exit(program).pipe(Effect5.provideService(Scope.Scope, scope), Effect5.provide(trialLayer));
|
|
977
|
+
yield* Scope.close(scope, exit);
|
|
978
|
+
const evidence = collector.exportEvidencePackage({
|
|
979
|
+
maxEvents: options?.maxEvents
|
|
980
|
+
});
|
|
981
|
+
return { session, exit, evidence };
|
|
982
|
+
});
|
|
983
|
+
|
|
984
|
+
export {
|
|
985
|
+
exportStaticIr2 as exportStaticIr,
|
|
986
|
+
extractManifest,
|
|
987
|
+
registerTrialRunArtifactExporter,
|
|
988
|
+
trialRunModule,
|
|
989
|
+
trialRun
|
|
990
|
+
};
|
|
991
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcmVmbGVjdGlvbi9zdGF0aWNJci50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9yZWZsZWN0aW9uL21hbmlmZXN0LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL3JlZ2lzdHJ5LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvdHJpYWxSdW5Nb2R1bGUudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vQnVpbGRFbnYudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vQ29uc3RydWN0aW9uR3VhcmQudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcGxhdGZvcm0vUnVudGltZUhvc3QudHMiLCAiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9SdW50aW1lLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL21vZGVsLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvYXJ0aWZhY3RzL2RpZ2VzdC50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9vYnNlcnZhYmlsaXR5L2FydGlmYWN0cy9jb2xsZWN0LnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL29ic2VydmFiaWxpdHkvdHJpYWxSdW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0IHsgZ2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9ydW50aW1lSW50ZXJuYWxzQWNjZXNzb3IuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRpY0lyIH0gZnJvbSAnLi4vc3RhdGUtdHJhaXQvaXIuanMnXG5pbXBvcnQgdHlwZSB7IFN0YXRlVHJhaXRQcm9ncmFtIH0gZnJvbSAnLi4vc3RhdGUtdHJhaXQvbW9kZWwuanMnXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciBhcyBleHBvcnRTdGF0ZVRyYWl0U3RhdGljSXIgfSBmcm9tICcuLi9zdGF0ZS10cmFpdC9pci5qcydcblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc01vZHVsZUltcGwgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gPT5cbiAgaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLl90YWcgPT09ICdNb2R1bGVJbXBsJyAmJiBpc1JlY29yZCh2YWx1ZS5tb2R1bGUpXG5cbmNvbnN0IHJlc29sdmVNb2R1bGVJZCA9IChpbnB1dDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChpc01vZHVsZUltcGwoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSAoaW5wdXQubW9kdWxlIGFzIGFueSkuaWRcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwID8gaWQgOiAndW5rbm93bidcbiAgfVxuXG4gIGlmIChpc1JlY29yZChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IGlucHV0LmlkXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCkgcmV0dXJuIGlkXG4gICAgY29uc3QgdGFnID0gKGlucHV0IGFzIGFueSkudGFnXG4gICAgaWYgKHRhZyAmJiAodHlwZW9mIHRhZyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRhZyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGNvbnN0IHRhZ0lkID0gKHRhZyBhcyBhbnkpLmlkXG4gICAgICBpZiAodHlwZW9mIHRhZ0lkID09PSAnc3RyaW5nJyAmJiB0YWdJZC5sZW5ndGggPiAwKSByZXR1cm4gdGFnSWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmNvbnN0IHJlc29sdmVNb2R1bGVUYWcgPSAoaW5wdXQ6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgaWYgKGlzTW9kdWxlSW1wbChpbnB1dCkpIHJldHVybiBpbnB1dC5tb2R1bGVcbiAgaWYgKGlzUmVjb3JkKGlucHV0KSAmJiAoaW5wdXQgYXMgYW55KS50YWcpIHJldHVybiAoaW5wdXQgYXMgYW55KS50YWdcbiAgcmV0dXJuIHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY29uc3QgZXhwb3J0U3RhdGljSXIgPSAobW9kdWxlOiB1bmtub3duKTogU3RhdGljSXIgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCB0YWcgPSByZXNvbHZlTW9kdWxlVGFnKG1vZHVsZSlcbiAgaWYgKCF0YWcpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBwcm9ncmFtID0gZ2V0TW9kdWxlVHJhaXRzUHJvZ3JhbSh0YWcpIGFzIFN0YXRlVHJhaXRQcm9ncmFtPGFueT4gfCB1bmRlZmluZWRcbiAgaWYgKCFwcm9ncmFtKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIGV4cG9ydFN0YXRlVHJhaXRTdGF0aWNJcih7XG4gICAgcHJvZ3JhbSxcbiAgICBtb2R1bGVJZDogcmVzb2x2ZU1vZHVsZUlkKG1vZHVsZSksXG4gIH0pXG59XG4iLCAiaW1wb3J0IHsgU2NoZW1hIH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlSW1wbCB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9tb2R1bGUuanMnXG5pbXBvcnQgKiBhcyBBY3Rpb24gZnJvbSAnLi4vYWN0aW9uLmpzJ1xuaW1wb3J0IHsgc3RhYmxlU3RyaW5naWZ5LCBmbnYxYTMyIH0gZnJvbSAnLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHsgaXNKc29uVmFsdWUsIHR5cGUgSnNvblZhbHVlIH0gZnJvbSAnLi4vb2JzZXJ2YWJpbGl0eS9qc29uVmFsdWUuanMnXG5pbXBvcnQgeyBleHBvcnRTdGF0aWNJciB9IGZyb20gJy4vc3RhdGljSXIuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFuaWZlc3RCdWRnZXRzIHtcbiAgcmVhZG9ubHkgbWF4Qnl0ZXM/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0TWFuaWZlc3RPcHRpb25zIHtcbiAgcmVhZG9ubHkgaW5jbHVkZVN0YXRpY0lyPzogYm9vbGVhblxuICByZWFkb25seSBidWRnZXRzPzogTWFuaWZlc3RCdWRnZXRzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQge1xuICByZWFkb25seSBraW5kOiBzdHJpbmdcbiAgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICByZWFkb25seSBkZXJpdmVkPzogYm9vbGVhblxuICByZWFkb25seSBuYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RBY3Rpb24ge1xuICByZWFkb25seSBhY3Rpb25UYWc6IHN0cmluZ1xuICByZWFkb25seSBwYXlsb2FkOiB7XG4gICAgcmVhZG9ubHkga2luZDogJ3ZvaWQnIHwgJ25vblZvaWQnIHwgJ3Vua25vd24nXG4gIH1cbiAgcmVhZG9ubHkgcHJpbWFyeVJlZHVjZXI/OiB7XG4gICAgcmVhZG9ubHkga2luZDogJ2RlY2xhcmVkJyB8ICdyZWdpc3RlcmVkJ1xuICB9XG4gIHJlYWRvbmx5IHNvdXJjZT86IHtcbiAgICByZWFkb25seSBmaWxlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5lOiBudW1iZXJcbiAgICByZWFkb25seSBjb2x1bW46IG51bWJlclxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3RFZmZlY3Qge1xuICByZWFkb25seSBhY3Rpb25UYWc6IHN0cmluZ1xuICByZWFkb25seSBzb3VyY2VLZXk6IHN0cmluZ1xuICByZWFkb25seSBraW5kOiAnZGVjbGFyZWQnIHwgJ3JlZ2lzdGVyZWQnXG4gIHJlYWRvbmx5IHNvdXJjZT86IHtcbiAgICByZWFkb25seSBmaWxlOiBzdHJpbmdcbiAgICByZWFkb25seSBsaW5lOiBudW1iZXJcbiAgICByZWFkb25seSBjb2x1bW46IG51bWJlclxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlTWFuaWZlc3Qge1xuICByZWFkb25seSBtYW5pZmVzdFZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGFjdGlvbktleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBhY3Rpb25zOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPlxuICByZWFkb25seSBlZmZlY3RzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD5cbiAgcmVhZG9ubHkgc2NoZW1hS2V5cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBsb2dpY1VuaXRzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD5cbiAgcmVhZG9ubHkgc291cmNlPzoge1xuICAgIHJlYWRvbmx5IGZpbGU6IHN0cmluZ1xuICAgIHJlYWRvbmx5IGxpbmU6IG51bWJlclxuICAgIHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyXG4gIH1cbiAgcmVhZG9ubHkgbWV0YT86IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT5cbiAgcmVhZG9ubHkgc3RhdGljSXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBleHBvcnRTdGF0aWNJcj5cbiAgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmdcbn1cblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5jb25zdCBpc01vZHVsZUltcGwgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBNb2R1bGVJbXBsPGFueSwgQW55TW9kdWxlU2hhcGUsIGFueT4gPT5cbiAgaXNSZWNvcmQodmFsdWUpICYmIHZhbHVlLl90YWcgPT09ICdNb2R1bGVJbXBsJyAmJiBpc1JlY29yZCh2YWx1ZS5tb2R1bGUpXG5cbmNvbnN0IHJlc29sdmVNb2R1bGVJZCA9IChpbnB1dDogdW5rbm93bik6IHN0cmluZyA9PiB7XG4gIGlmIChpc01vZHVsZUltcGwoaW5wdXQpKSB7XG4gICAgY29uc3QgaWQgPSAoaW5wdXQubW9kdWxlIGFzIGFueSkuaWRcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZC5sZW5ndGggPiAwID8gaWQgOiAndW5rbm93bidcbiAgfVxuXG4gIGlmIChpc1JlY29yZChpbnB1dCkpIHtcbiAgICBjb25zdCBpZCA9IGlucHV0LmlkXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCkgcmV0dXJuIGlkXG4gICAgY29uc3QgdGFnID0gKGlucHV0IGFzIGFueSkudGFnXG4gICAgaWYgKHRhZyAmJiAodHlwZW9mIHRhZyA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHRhZyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIGNvbnN0IHRhZ0lkID0gKHRhZyBhcyBhbnkpLmlkXG4gICAgICBpZiAodHlwZW9mIHRhZ0lkID09PSAnc3RyaW5nJyAmJiB0YWdJZC5sZW5ndGggPiAwKSByZXR1cm4gdGFnSWRcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJ3Vua25vd24nXG59XG5cbmNvbnN0IHJlc29sdmVBY3Rpb25LZXlzID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgdGFnID0gaXNNb2R1bGVJbXBsKGlucHV0KSA/IChpbnB1dC5tb2R1bGUgYXMgYW55KSA6IChpbnB1dCBhcyBhbnkpPy50YWdcbiAgY29uc3QgYWN0aW9uTWFwID0gdGFnPy5zaGFwZT8uYWN0aW9uTWFwXG4gIGlmICghaXNSZWNvcmQoYWN0aW9uTWFwKSkgcmV0dXJuIFtdXG4gIHJldHVybiBPYmplY3Qua2V5cyhhY3Rpb25NYXApLnNvcnQoKVxufVxuXG50eXBlIERldlNvdXJjZSA9IE1vZHVsZU1hbmlmZXN0Wydzb3VyY2UnXVxuXG5jb25zdCByZXNvbHZlRGV2U291cmNlID0gKGlucHV0OiB1bmtub3duKTogRGV2U291cmNlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgZmlsZSA9IChpbnB1dCBhcyBhbnkpLmZpbGVcbiAgY29uc3QgbGluZSA9IChpbnB1dCBhcyBhbnkpLmxpbmVcbiAgY29uc3QgY29sdW1uID0gKGlucHV0IGFzIGFueSkuY29sdW1uXG4gIGlmICh0eXBlb2YgZmlsZSAhPT0gJ3N0cmluZycgfHwgZmlsZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcbiAgaWYgKHR5cGVvZiBsaW5lICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcihsaW5lKSB8fCBsaW5lIDwgMSkgcmV0dXJuIHVuZGVmaW5lZFxuICBpZiAodHlwZW9mIGNvbHVtbiAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc0ludGVnZXIoY29sdW1uKSB8fCBjb2x1bW4gPCAxKSByZXR1cm4gdW5kZWZpbmVkXG4gIHJldHVybiB7IGZpbGUsIGxpbmUsIGNvbHVtbiB9XG59XG5cbmNvbnN0IHJlc29sdmVUb2tlblNvdXJjZSA9ICh0b2tlbjogdW5rbm93bik6IERldlNvdXJjZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghdG9rZW4gfHwgKHR5cGVvZiB0b2tlbiAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHRva2VuICE9PSAnZnVuY3Rpb24nKSkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4gcmVzb2x2ZURldlNvdXJjZSgodG9rZW4gYXMgYW55KS5zb3VyY2UpXG59XG5cbmNvbnN0IHJlc29sdmVBY3Rpb25zID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEFjdGlvbj4gPT4ge1xuICBjb25zdCB0YWcgPSBpc01vZHVsZUltcGwoaW5wdXQpID8gKGlucHV0Lm1vZHVsZSBhcyBhbnkpIDogKGlucHV0IGFzIGFueSk/LnRhZ1xuICBjb25zdCBhY3Rpb25NYXAgPSB0YWc/LnNoYXBlPy5hY3Rpb25NYXBcbiAgaWYgKCFpc1JlY29yZChhY3Rpb25NYXApKSByZXR1cm4gW11cblxuICBjb25zdCBtb2R1bGVTb3VyY2UgPSByZXNvbHZlU291cmNlKGlucHV0KVxuICBjb25zdCByZWR1Y2VycyA9IGlzUmVjb3JkKHRhZz8ucmVkdWNlcnMpID8gKHRhZy5yZWR1Y2VycyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgOiB1bmRlZmluZWRcblxuICBjb25zdCBhY3Rpb25UYWdzID0gT2JqZWN0LmtleXMoYWN0aW9uTWFwKS5zb3J0KClcblxuICBjb25zdCBvdXQ6IEFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPiA9IFtdXG4gIGZvciAoY29uc3QgYWN0aW9uVGFnIG9mIGFjdGlvblRhZ3MpIHtcbiAgICBjb25zdCB0b2tlbiA9IGFjdGlvbk1hcFthY3Rpb25UYWddXG4gICAgY29uc3Qgc291cmNlID0gcmVzb2x2ZVRva2VuU291cmNlKHRva2VuKSA/PyBtb2R1bGVTb3VyY2VcbiAgICBjb25zdCBwYXlsb2FkS2luZCA9XG4gICAgICBBY3Rpb24uaXNBY3Rpb25Ub2tlbih0b2tlbikgJiYgU2NoZW1hLmlzU2NoZW1hKCh0b2tlbiBhcyBBY3Rpb24uQW55QWN0aW9uVG9rZW4pLnNjaGVtYSlcbiAgICAgICAgPyAodG9rZW4gYXMgQWN0aW9uLkFueUFjdGlvblRva2VuKS5zY2hlbWEgPT09IFNjaGVtYS5Wb2lkXG4gICAgICAgICAgPyAndm9pZCdcbiAgICAgICAgICA6ICdub25Wb2lkJ1xuICAgICAgICA6ICd1bmtub3duJ1xuXG4gICAgY29uc3QgcHJpbWFyeVJlZHVjZXIgPVxuICAgICAgcmVkdWNlcnMgJiYgdHlwZW9mIHJlZHVjZXJzW2FjdGlvblRhZ10gPT09ICdmdW5jdGlvbicgPyAoeyBraW5kOiAnZGVjbGFyZWQnIH0gYXMgY29uc3QpIDogdW5kZWZpbmVkXG5cbiAgICBvdXQucHVzaCh7XG4gICAgICBhY3Rpb25UYWcsXG4gICAgICBwYXlsb2FkOiB7IGtpbmQ6IHBheWxvYWRLaW5kIH0sXG4gICAgICAuLi4ocHJpbWFyeVJlZHVjZXIgPyB7IHByaW1hcnlSZWR1Y2VyIH0gOiB7fSksXG4gICAgICAuLi4oc291cmNlID8geyBzb3VyY2UgfSA6IHt9KSxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG91dFxufVxuXG5jb25zdCBNT0RVTEVfREVDTEFSRURfRUZGRUNUUyA9IFN5bWJvbC5mb3IoJ2xvZ2l4Lm1vZHVsZS5lZmZlY3RzLmRlY2xhcmVkJylcblxuY29uc3QgcmVzb2x2ZUVmZmVjdHMgPSAoaW5wdXQ6IHVua25vd24pOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0RWZmZWN0PiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHRhZyA9IGlzTW9kdWxlSW1wbChpbnB1dCkgPyAoaW5wdXQubW9kdWxlIGFzIGFueSkgOiAoaW5wdXQgYXMgYW55KT8udGFnXG4gIGNvbnN0IGFjdGlvbk1hcCA9IHRhZz8uc2hhcGU/LmFjdGlvbk1hcFxuICBpZiAoIWlzUmVjb3JkKGFjdGlvbk1hcCkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBlZmZlY3RzUmF3ID0gKHRhZyBhcyBhbnkpPy5bTU9EVUxFX0RFQ0xBUkVEX0VGRkVDVFNdXG4gIGlmICghaXNSZWNvcmQoZWZmZWN0c1JhdykpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBzb3VyY2UgPSByZXNvbHZlU291cmNlKGlucHV0KVxuXG4gIGNvbnN0IGxvZ2ljVW5pdElkID0gJ19fbG9naXhfaW50ZXJuYWw6ZWZmZWN0czpkZWNsYXJlZCdcbiAgY29uc3QgaGFuZGxlcklkcyA9IG5ldyBXZWFrTWFwPCguLi5hcmdzOiBhbnlbXSkgPT4gYW55LCBzdHJpbmc+KClcbiAgbGV0IG5leHRIYW5kbGVyU2VxID0gMFxuXG4gIGNvbnN0IG91dDogQXJyYXk8TW9kdWxlTWFuaWZlc3RFZmZlY3Q+ID0gW11cblxuICBmb3IgKGNvbnN0IGFjdGlvblRhZyBvZiBPYmplY3Qua2V5cyhlZmZlY3RzUmF3KS5zb3J0KCkpIHtcbiAgICBpZiAoIShhY3Rpb25UYWcgaW4gYWN0aW9uTWFwKSkgY29udGludWVcblxuICAgIGNvbnN0IGhhbmRsZXJzID0gKGVmZmVjdHNSYXcgYXMgYW55KVthY3Rpb25UYWddXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGhhbmRsZXJzKSkgY29udGludWVcblxuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoYW5kbGVycykge1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyICE9PSAnZnVuY3Rpb24nKSBjb250aW51ZVxuXG4gICAgICBsZXQgaGFuZGxlcklkID0gaGFuZGxlcklkcy5nZXQoaGFuZGxlcilcbiAgICAgIGlmICghaGFuZGxlcklkKSB7XG4gICAgICAgIG5leHRIYW5kbGVyU2VxICs9IDFcbiAgICAgICAgaGFuZGxlcklkID0gYGgke25leHRIYW5kbGVyU2VxfWBcbiAgICAgICAgaGFuZGxlcklkcy5zZXQoaGFuZGxlciwgaGFuZGxlcklkKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VLZXkgPSBgJHtsb2dpY1VuaXRJZH06OiR7aGFuZGxlcklkfWBcblxuICAgICAgb3V0LnB1c2goe1xuICAgICAgICBhY3Rpb25UYWcsXG4gICAgICAgIHNvdXJjZUtleSxcbiAgICAgICAga2luZDogJ2RlY2xhcmVkJyxcbiAgICAgICAgLi4uKHNvdXJjZSA/IHsgc291cmNlIH0gOiB7fSksXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKVxuICBjb25zdCBkZWR1cGVkOiBBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD4gPSBbXVxuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb3V0KSB7XG4gICAgY29uc3Qga2V5ID0gYCR7aXRlbS5hY3Rpb25UYWd9XFx1MDAwMCR7aXRlbS5zb3VyY2VLZXl9YFxuICAgIGlmIChzZWVuLmhhcyhrZXkpKSBjb250aW51ZVxuICAgIHNlZW4uYWRkKGtleSlcbiAgICBkZWR1cGVkLnB1c2goaXRlbSlcbiAgfVxuXG4gIGRlZHVwZWQuc29ydCgoYSwgYikgPT5cbiAgICBhLmFjdGlvblRhZyA8IGIuYWN0aW9uVGFnXG4gICAgICA/IC0xXG4gICAgICA6IGEuYWN0aW9uVGFnID4gYi5hY3Rpb25UYWdcbiAgICAgICAgPyAxXG4gICAgICAgIDogYS5zb3VyY2VLZXkgPCBiLnNvdXJjZUtleVxuICAgICAgICAgID8gLTFcbiAgICAgICAgICA6IGEuc291cmNlS2V5ID4gYi5zb3VyY2VLZXlcbiAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgOiAwLFxuICApXG4gIHJldHVybiBkZWR1cGVkLmxlbmd0aCA+IDAgPyBkZWR1cGVkIDogdW5kZWZpbmVkXG59XG5cbmNvbnN0IHJlc29sdmVTY2hlbWFLZXlzID0gKGlucHV0OiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3Qgc2NoZW1hcyA9IChpbnB1dCBhcyBhbnkpLnNjaGVtYXNcbiAgaWYgKCFpc1JlY29yZChzY2hlbWFzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICByZXR1cm4gT2JqZWN0LmtleXMoc2NoZW1hcykuc29ydCgpXG59XG5cbmNvbnN0IHJlc29sdmVTb3VyY2UgPSAoaW5wdXQ6IHVua25vd24pOiBNb2R1bGVNYW5pZmVzdFsnc291cmNlJ10gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzUmVjb3JkKGlucHV0KSkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBkZXYgPSAoaW5wdXQgYXMgYW55KS5kZXZcbiAgcmV0dXJuIHJlc29sdmVEZXZTb3VyY2UoZGV2Py5zb3VyY2UpXG59XG5cbmNvbnN0IHJlc29sdmVNZXRhID0gKGlucHV0OiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNSZWNvcmQoaW5wdXQpKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IG1ldGEgPSAoaW5wdXQgYXMgYW55KS5tZXRhXG4gIGlmICghaXNSZWNvcmQobWV0YSkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIEpzb25WYWx1ZT4gPSB7fVxuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhtZXRhKS5zb3J0KCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1ldGFba2V5XVxuICAgIGlmIChpc0pzb25WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIG91dFtrZXldID0gdmFsdWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG91dCkubGVuZ3RoID4gMCA/IG91dCA6IHVuZGVmaW5lZFxufVxuXG5jb25zdCBNT0RVTEVfSU5URVJOQUwgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUuaW50ZXJuYWwnKVxuXG5jb25zdCByZXNvbHZlTG9naWNVbml0cyA9IChpbnB1dDogdW5rbm93bik6IFJlYWRvbmx5QXJyYXk8TW9kdWxlTWFuaWZlc3RMb2dpY1VuaXQ+IHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiB1bmRlZmluZWRcbiAgY29uc3QgaW50ZXJuYWwgPSAoaW5wdXQgYXMgYW55KVtNT0RVTEVfSU5URVJOQUxdXG4gIGNvbnN0IG1vdW50ZWQgPSBpbnRlcm5hbD8ubW91bnRlZFxuICBpZiAoIUFycmF5LmlzQXJyYXkobW91bnRlZCkpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBvdXQ6IEFycmF5PE1vZHVsZU1hbmlmZXN0TG9naWNVbml0PiA9IFtdXG4gIGZvciAoY29uc3QgdW5pdCBvZiBtb3VudGVkKSB7XG4gICAgaWYgKCFpc1JlY29yZCh1bml0KSkgY29udGludWVcbiAgICBjb25zdCBraW5kID0gdW5pdC5raW5kXG4gICAgY29uc3QgaWQgPSB1bml0LmlkXG4gICAgaWYgKHR5cGVvZiBraW5kICE9PSAnc3RyaW5nJyB8fCBraW5kLmxlbmd0aCA9PT0gMCkgY29udGludWVcbiAgICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJyB8fCBpZC5sZW5ndGggPT09IDApIGNvbnRpbnVlXG5cbiAgICBjb25zdCBkZXJpdmVkID0gdW5pdC5kZXJpdmVkID09PSB0cnVlID8gdHJ1ZSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgdW5pdC5uYW1lID09PSAnc3RyaW5nJyA/IHVuaXQubmFtZSA6IHVuZGVmaW5lZFxuICAgIG91dC5wdXNoKHsga2luZCwgaWQsIGRlcml2ZWQsIG5hbWUgfSlcbiAgfVxuXG4gIG91dC5zb3J0KChhLCBiKSA9PiAoYS5pZCA8IGIuaWQgPyAtMSA6IGEuaWQgPiBiLmlkID8gMSA6IGEua2luZCA8IGIua2luZCA/IC0xIDogYS5raW5kID4gYi5raW5kID8gMSA6IDApKVxuICByZXR1cm4gb3V0Lmxlbmd0aCA+IDAgPyBvdXQgOiB1bmRlZmluZWRcbn1cblxudHlwZSBEaWdlc3RCYXNlID0ge1xuICByZWFkb25seSBtYW5pZmVzdFZlcnNpb246IHN0cmluZ1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGFjdGlvbktleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBhY3Rpb25zOiBSZWFkb25seUFycmF5PE1vZHVsZU1hbmlmZXN0QWN0aW9uPlxuICByZWFkb25seSBlZmZlY3RzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdEVmZmVjdD5cbiAgcmVhZG9ubHkgc2NoZW1hS2V5cz86IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBsb2dpY1VuaXRzPzogUmVhZG9ubHlBcnJheTxNb2R1bGVNYW5pZmVzdExvZ2ljVW5pdD5cbiAgcmVhZG9ubHkgc3RhdGljSXJEaWdlc3Q/OiBzdHJpbmdcbn1cblxuY29uc3QgZGlnZXN0T2YgPSAoYmFzZTogRGlnZXN0QmFzZSk6IHN0cmluZyA9PiBgbWFuaWZlc3Q6MDY3OiR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkoYmFzZSkpfWBcblxuY29uc3QgdXRmOEJ5dGVMZW5ndGggPSAodmFsdWU6IHVua25vd24pOiBudW1iZXIgPT4ge1xuICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpXG4gIGlmICh0eXBlb2YgVGV4dEVuY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShqc29uKS5sZW5ndGhcbiAgfVxuICByZXR1cm4ganNvbi5sZW5ndGhcbn1cblxuY29uc3QgYXBwbHlNYXhCeXRlcyA9IChtYW5pZmVzdDogTW9kdWxlTWFuaWZlc3QsIG1heEJ5dGVzOiBudW1iZXIpOiBNb2R1bGVNYW5pZmVzdCA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsQnl0ZXMgPSB1dGY4Qnl0ZUxlbmd0aChtYW5pZmVzdClcbiAgaWYgKG9yaWdpbmFsQnl0ZXMgPD0gbWF4Qnl0ZXMpIHJldHVybiBtYW5pZmVzdFxuXG4gIGNvbnN0IGRyb3BwZWQ6IEFycmF5PHN0cmluZz4gPSBbXVxuICBjb25zdCB0cnVuY2F0ZWRBcnJheXM6IEFycmF5PHN0cmluZz4gPSBbXVxuXG4gIGNvbnN0IGJhc2VNYXJrZXIgPSAoKTogSnNvblZhbHVlID0+ICh7XG4gICAgdHJ1bmNhdGVkOiB0cnVlLFxuICAgIG1heEJ5dGVzLFxuICAgIG9yaWdpbmFsQnl0ZXMsXG4gICAgZHJvcHBlZCxcbiAgICB0cnVuY2F0ZWRBcnJheXMsXG4gIH0pXG5cbiAgY29uc3Qgd2l0aE1hcmtlciA9IChuZXh0OiBNb2R1bGVNYW5pZmVzdCk6IE1vZHVsZU1hbmlmZXN0ID0+IHtcbiAgICBjb25zdCBtZXRhOiBSZWNvcmQ8c3RyaW5nLCBKc29uVmFsdWU+ID0ge1xuICAgICAgX19sb2dpeDogYmFzZU1hcmtlcigpLFxuICAgIH1cbiAgICByZXR1cm4geyAuLi5uZXh0LCBtZXRhIH1cbiAgfVxuXG4gIGxldCBuZXh0OiBNb2R1bGVNYW5pZmVzdCA9IHdpdGhNYXJrZXIobWFuaWZlc3QpXG5cbiAgY29uc3QgbWFya1RydW5jYXRlZEFycmF5ID0gKG5hbWU6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmICghdHJ1bmNhdGVkQXJyYXlzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICB0cnVuY2F0ZWRBcnJheXMucHVzaChuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRyb3BGaWVsZCA9IChmaWVsZDoga2V5b2YgTW9kdWxlTWFuaWZlc3QpOiB2b2lkID0+IHtcbiAgICBpZiAoKG5leHQgYXMgYW55KVtmaWVsZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZHJvcHBlZC5wdXNoKFN0cmluZyhmaWVsZCkpXG4gICAgICBuZXh0ID0gd2l0aE1hcmtlcih7IC4uLihuZXh0IGFzIGFueSksIFtmaWVsZF06IHVuZGVmaW5lZCB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIERldGVybWluaXN0aWMgdHJpbW1pbmcgb3JkZXIgKGxlYXN0IHZhbHVhYmxlIGZpcnN0KS5cbiAgZHJvcEZpZWxkKCdtZXRhJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc291cmNlJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc3RhdGljSXInKVxuICBpZiAodXRmOEJ5dGVMZW5ndGgobmV4dCkgPD0gbWF4Qnl0ZXMpIHJldHVybiBuZXh0XG5cbiAgZHJvcEZpZWxkKCdsb2dpY1VuaXRzJylcbiAgaWYgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpIDw9IG1heEJ5dGVzKSByZXR1cm4gbmV4dFxuXG4gIGRyb3BGaWVsZCgnc2NoZW1hS2V5cycpXG4gIGlmICh1dGY4Qnl0ZUxlbmd0aChuZXh0KSA8PSBtYXhCeXRlcykgcmV0dXJuIG5leHRcblxuICBkcm9wRmllbGQoJ2VmZmVjdHMnKVxuICBpZiAodXRmOEJ5dGVMZW5ndGgobmV4dCkgPD0gbWF4Qnl0ZXMpIHJldHVybiBuZXh0XG5cbiAgLy8gTGFzdCByZXNvcnQ6IGRldGVybWluaXN0aWNhbGx5IHRydW5jYXRlIHRhaWwgaXRlbXMgKHN0YWJsZSBvcmRlcjogYWN0aW9uc1tdIHNvcnRlZCBieSBhY3Rpb25UYWcpLlxuICBjb25zdCB0cnVuY2F0ZUFjdGlvbnNUb0ZpdCA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCB0b3RhbCA9IG5leHQuYWN0aW9ucy5sZW5ndGhcbiAgICBpZiAodG90YWwgPD0gMSkgcmV0dXJuXG5cbiAgICAvLyBGaW5kIHRoZSBsYXJnZXN0IHByZWZpeCB0aGF0IGZpdHMuXG4gICAgbGV0IGxvID0gMVxuICAgIGxldCBoaSA9IHRvdGFsXG4gICAgbGV0IGJlc3QgPSAxXG5cbiAgICB3aGlsZSAobG8gPD0gaGkpIHtcbiAgICAgIGNvbnN0IG1pZCA9IE1hdGguZmxvb3IoKGxvICsgaGkpIC8gMilcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHdpdGhNYXJrZXIoe1xuICAgICAgICAuLi5uZXh0LFxuICAgICAgICBhY3Rpb25zOiBuZXh0LmFjdGlvbnMuc2xpY2UoMCwgbWlkKSxcbiAgICAgICAgYWN0aW9uS2V5czogbmV4dC5hY3Rpb25LZXlzLnNsaWNlKDAsIG1pZCksXG4gICAgICB9KVxuICAgICAgaWYgKHV0ZjhCeXRlTGVuZ3RoKGNhbmRpZGF0ZSkgPD0gbWF4Qnl0ZXMpIHtcbiAgICAgICAgYmVzdCA9IG1pZFxuICAgICAgICBsbyA9IG1pZCArIDFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhpID0gbWlkIC0gMVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChiZXN0IDwgdG90YWwpIHtcbiAgICAgIG1hcmtUcnVuY2F0ZWRBcnJheSgnYWN0aW9ucycpXG4gICAgICBtYXJrVHJ1bmNhdGVkQXJyYXkoJ2FjdGlvbktleXMnKVxuICAgICAgbmV4dCA9IHdpdGhNYXJrZXIoe1xuICAgICAgICAuLi5uZXh0LFxuICAgICAgICBhY3Rpb25zOiBuZXh0LmFjdGlvbnMuc2xpY2UoMCwgYmVzdCksXG4gICAgICAgIGFjdGlvbktleXM6IG5leHQuYWN0aW9uS2V5cy5zbGljZSgwLCBiZXN0KSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgd2hpbGUgKHV0ZjhCeXRlTGVuZ3RoKG5leHQpID4gbWF4Qnl0ZXMpIHtcbiAgICBjb25zdCBiZWZvcmVMZW4gPSBuZXh0LmFjdGlvbnMubGVuZ3RoXG4gICAgdHJ1bmNhdGVBY3Rpb25zVG9GaXQoKVxuICAgIGlmIChuZXh0LmFjdGlvbnMubGVuZ3RoID09PSBiZWZvcmVMZW4pIHtcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5leHRcbn1cblxuZXhwb3J0IGNvbnN0IGV4dHJhY3RNYW5pZmVzdCA9IChtb2R1bGU6IHVua25vd24sIG9wdGlvbnM/OiBFeHRyYWN0TWFuaWZlc3RPcHRpb25zKTogTW9kdWxlTWFuaWZlc3QgPT4ge1xuICBjb25zdCBtYW5pZmVzdFZlcnNpb24gPSAnMDY3J1xuICBjb25zdCBtb2R1bGVJZCA9IHJlc29sdmVNb2R1bGVJZChtb2R1bGUpXG4gIGNvbnN0IGFjdGlvbktleXMgPSByZXNvbHZlQWN0aW9uS2V5cyhtb2R1bGUpXG4gIGNvbnN0IGFjdGlvbnMgPSByZXNvbHZlQWN0aW9ucyhtb2R1bGUpXG4gIGNvbnN0IGVmZmVjdHMgPSByZXNvbHZlRWZmZWN0cyhtb2R1bGUpXG5cbiAgY29uc3Qgc2NoZW1hS2V5cyA9IHJlc29sdmVTY2hlbWFLZXlzKG1vZHVsZSlcbiAgY29uc3QgbG9naWNVbml0cyA9IHJlc29sdmVMb2dpY1VuaXRzKG1vZHVsZSlcbiAgY29uc3Qgc291cmNlID0gcmVzb2x2ZVNvdXJjZShtb2R1bGUpXG4gIGNvbnN0IG1ldGEgPSByZXNvbHZlTWV0YShtb2R1bGUpXG5cbiAgY29uc3Qgc3RhdGljSXIgPSBvcHRpb25zPy5pbmNsdWRlU3RhdGljSXIgPyBleHBvcnRTdGF0aWNJcihtb2R1bGUpIDogdW5kZWZpbmVkXG5cbiAgY29uc3QgZGlnZXN0QmFzZTogRGlnZXN0QmFzZSA9IHtcbiAgICBtYW5pZmVzdFZlcnNpb24sXG4gICAgbW9kdWxlSWQsXG4gICAgYWN0aW9uS2V5cyxcbiAgICBhY3Rpb25zLFxuICAgIGVmZmVjdHMsXG4gICAgc2NoZW1hS2V5cyxcbiAgICBsb2dpY1VuaXRzLFxuICAgIHN0YXRpY0lyRGlnZXN0OiBzdGF0aWNJcj8uZGlnZXN0LFxuICB9XG5cbiAgY29uc3QgZGlnZXN0ID0gZGlnZXN0T2YoZGlnZXN0QmFzZSlcblxuICBjb25zdCBtYW5pZmVzdDogTW9kdWxlTWFuaWZlc3QgPSB7XG4gICAgbWFuaWZlc3RWZXJzaW9uLFxuICAgIG1vZHVsZUlkLFxuICAgIGFjdGlvbktleXMsXG4gICAgYWN0aW9ucyxcbiAgICBlZmZlY3RzLFxuICAgIHNjaGVtYUtleXMsXG4gICAgbG9naWNVbml0cyxcbiAgICBzb3VyY2UsXG4gICAgbWV0YSxcbiAgICBzdGF0aWNJcixcbiAgICBkaWdlc3QsXG4gIH1cblxuICBjb25zdCBtYXhCeXRlcyA9IG9wdGlvbnM/LmJ1ZGdldHM/Lm1heEJ5dGVzXG4gIGlmICh0eXBlb2YgbWF4Qnl0ZXMgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShtYXhCeXRlcykgJiYgbWF4Qnl0ZXMgPiAwKSB7XG4gICAgcmV0dXJuIGFwcGx5TWF4Qnl0ZXMobWFuaWZlc3QsIG1heEJ5dGVzKVxuICB9XG5cbiAgcmV0dXJuIG1hbmlmZXN0XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXIgfSBmcm9tICcuL2V4cG9ydGVyLmpzJ1xuXG5jb25zdCBBUlRJRkFDVF9FWFBPUlRFUlMgPSBTeW1ib2wuZm9yKCdsb2dpeC5tb2R1bGUudHJpYWxSdW5BcnRpZmFjdEV4cG9ydGVycycpXG5cbmV4cG9ydCBjb25zdCByZWdpc3RlclRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlciA9ICh0YWc6IHVua25vd24sIGV4cG9ydGVyOiBUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXIpOiB2b2lkID0+IHtcbiAgaWYgKCF0YWcgfHwgKHR5cGVvZiB0YWcgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YWcgIT09ICdmdW5jdGlvbicpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdbTG9naXhdIHJlZ2lzdGVyVHJpYWxSdW5BcnRpZmFjdEV4cG9ydGVyOiBpbnZhbGlkIG1vZHVsZSB0YWcnKVxuICB9XG5cbiAgY29uc3QgY3VycmVudCA9ICgodGFnIGFzIGFueSlbQVJUSUZBQ1RfRVhQT1JURVJTXSA/PyBbXSkgYXMgdW5rbm93blxuICBjb25zdCBuZXh0ID0gQXJyYXkuaXNBcnJheShjdXJyZW50KSA/IFsuLi5jdXJyZW50LCBleHBvcnRlcl0gOiBbZXhwb3J0ZXJdXG4gIDsodGFnIGFzIGFueSlbQVJUSUZBQ1RfRVhQT1JURVJTXSA9IG5leHRcbn1cblxuZXhwb3J0IGNvbnN0IGdldFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlcnMgPSAodGFnOiB1bmtub3duKTogUmVhZG9ubHlBcnJheTxUcmlhbFJ1bkFydGlmYWN0RXhwb3J0ZXI+ID0+IHtcbiAgaWYgKCF0YWcgfHwgKHR5cGVvZiB0YWcgIT09ICdvYmplY3QnICYmIHR5cGVvZiB0YWcgIT09ICdmdW5jdGlvbicpKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBjb25zdCBjdXJyZW50ID0gKHRhZyBhcyBhbnkpW0FSVElGQUNUX0VYUE9SVEVSU10gYXMgdW5rbm93blxuICBpZiAoIUFycmF5LmlzQXJyYXkoY3VycmVudCkpIHJldHVybiBbXVxuICByZXR1cm4gY3VycmVudC5maWx0ZXIoKHgpOiB4IGlzIFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlciA9PiB4ICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0Jylcbn1cbiIsICJpbXBvcnQgeyBDYXVzZSwgRWZmZWN0LCBFeGl0LCBGaWJlciwgTGF5ZXIsIE9wdGlvbiB9IGZyb20gJ2VmZmVjdCdcbmltcG9ydCB0eXBlIHsgQW55TW9kdWxlU2hhcGUsIE1vZHVsZUltcGwgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvbW9kdWxlLmpzJ1xuaW1wb3J0ICogYXMgQnVpbGRFbnYgZnJvbSAnLi4vcGxhdGZvcm0vQnVpbGRFbnYuanMnXG5pbXBvcnQgdHlwZSB7IEV2aWRlbmNlUGFja2FnZSwgRXZpZGVuY2VQYWNrYWdlU291cmNlIH0gZnJvbSAnLi9ldmlkZW5jZS5qcydcbmltcG9ydCB7IG1ha2VFdmlkZW5jZUNvbGxlY3RvciwgZXZpZGVuY2VDb2xsZWN0b3JMYXllciB9IGZyb20gJy4vZXZpZGVuY2VDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBtYWtlUnVuU2Vzc2lvbiwgcnVuU2Vzc2lvbkxheWVyLCB0eXBlIFJ1bklkIH0gZnJvbSAnLi9ydW5TZXNzaW9uLmpzJ1xuaW1wb3J0IHtcbiAgYXBwZW5kU2lua3MsXG4gIGRpYWdub3N0aWNzTGV2ZWwsXG4gIHR5cGUgRGlhZ25vc3RpY3NMZXZlbCxcbiAgdHlwZSBTaW5rIGFzIERlYnVnU2luayxcbn0gZnJvbSAnLi4vcnVudGltZS9jb3JlL0RlYnVnU2luay5qcydcbmltcG9ydCB0eXBlIHsgS2VybmVsSW1wbGVtZW50YXRpb25SZWYgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvS2VybmVsUmVmLmpzJ1xuaW1wb3J0ICogYXMgS2VybmVsUmVmIGZyb20gJy4uL3J1bnRpbWUvY29yZS9LZXJuZWxSZWYuanMnXG5pbXBvcnQgKiBhcyBSdW50aW1lS2VybmVsIGZyb20gJy4uL3J1bnRpbWUvY29yZS9SdW50aW1lS2VybmVsLmpzJ1xuaW1wb3J0IHR5cGUgeyBDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yIH0gZnJvbSAnLi4vcnVudGltZS9jb3JlL0NvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBhcHBlbmRDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9ycyB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9Db252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yLmpzJ1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0IHsgdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0IHsgbWFrZVByb2dyYW1SdW5uZXJLZXJuZWwgfSBmcm9tICcuLi9ydW50aW1lL1Byb2dyYW1SdW5uZXIua2VybmVsLmpzJ1xuaW1wb3J0IHsgZXh0cmFjdE1hbmlmZXN0LCB0eXBlIE1vZHVsZU1hbmlmZXN0IH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9tYW5pZmVzdC5qcydcbmltcG9ydCB7IGV4cG9ydFN0YXRpY0lyIH0gZnJvbSAnLi4vcmVmbGVjdGlvbi9zdGF0aWNJci5qcydcbmltcG9ydCAqIGFzIFJ1bnRpbWUgZnJvbSAnLi4vcnVudGltZS9SdW50aW1lLmpzJ1xuaW1wb3J0IHsgY29sbGVjdFRyaWFsUnVuQXJ0aWZhY3RzIH0gZnJvbSAnLi9hcnRpZmFjdHMvY29sbGVjdC5qcydcbmltcG9ydCB0eXBlIHsgVHJpYWxSdW5BcnRpZmFjdHMgfSBmcm9tICcuL2FydGlmYWN0cy9tb2RlbC5qcydcbmltcG9ydCB7IGdldFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlcnMgfSBmcm9tICcuL2FydGlmYWN0cy9yZWdpc3RyeS5qcydcblxudHlwZSBSb290TGlrZTxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPiA9IE1vZHVsZUltcGw8YW55LCBTaCwgYW55PiB8IHsgcmVhZG9ubHkgaW1wbDogTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+IH1cblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1blJlcG9ydEJ1ZGdldHMge1xuICByZWFkb25seSBtYXhCeXRlcz86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyaWFsUnVuUmVwb3J0IHtcbiAgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZ1xuICByZWFkb25seSBvazogYm9vbGVhblxuICByZWFkb25seSBtYW5pZmVzdD86IE1vZHVsZU1hbmlmZXN0XG4gIHJlYWRvbmx5IHN0YXRpY0lyPzogUmV0dXJuVHlwZTx0eXBlb2YgZXhwb3J0U3RhdGljSXI+XG4gIHJlYWRvbmx5IGFydGlmYWN0cz86IFRyaWFsUnVuQXJ0aWZhY3RzXG4gIHJlYWRvbmx5IGVudmlyb25tZW50PzogRW52aXJvbm1lbnRJclxuICByZWFkb25seSBldmlkZW5jZT86IEV2aWRlbmNlUGFja2FnZVxuICByZWFkb25seSBzdW1tYXJ5PzogdW5rbm93blxuICByZWFkb25seSBlcnJvcj86IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50SXIge1xuICByZWFkb25seSB0YWdJZHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBjb25maWdLZXlzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbWlzc2luZ1NlcnZpY2VzOiBSZWFkb25seUFycmF5PHN0cmluZz5cbiAgcmVhZG9ubHkgbWlzc2luZ0NvbmZpZ0tleXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZj86IEtlcm5lbEltcGxlbWVudGF0aW9uUmVmXG4gIHJlYWRvbmx5IHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlPzogUnVudGltZUtlcm5lbC5SdW50aW1lU2VydmljZXNFdmlkZW5jZVxuICByZWFkb25seSBub3Rlcz86IHVua25vd25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1bk1vZHVsZU9wdGlvbnMge1xuICByZWFkb25seSBydW5JZD86IFJ1bklkXG4gIHJlYWRvbmx5IHNvdXJjZT86IEV2aWRlbmNlUGFja2FnZVNvdXJjZVxuICByZWFkb25seSBzdGFydGVkQXQ/OiBudW1iZXJcbiAgcmVhZG9ubHkgZGlhZ25vc3RpY3NMZXZlbD86IERpYWdub3N0aWNzTGV2ZWxcbiAgcmVhZG9ubHkgbWF4RXZlbnRzPzogbnVtYmVyXG4gIHJlYWRvbmx5IGxheWVyPzogTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT5cbiAgcmVhZG9ubHkgYnVpbGRFbnY/OiB7XG4gICAgcmVhZG9ubHkgY29uZmlnPzogUmVjb3JkPHN0cmluZywgQnVpbGRFbnYuQnVpbGRFbnZDb25maWdWYWx1ZSB8IHVuZGVmaW5lZD5cbiAgICByZWFkb25seSBob3N0S2luZD86IEJ1aWxkRW52LkJ1aWxkRW52T3B0aW9uc1sncnVudGltZUhvc3RLaW5kJ11cbiAgICByZWFkb25seSBjb25maWdQcm92aWRlcj86IEJ1aWxkRW52LkJ1aWxkRW52T3B0aW9uc1snY29uZmlnUHJvdmlkZXInXVxuICB9XG4gIHJlYWRvbmx5IHRyaWFsUnVuVGltZW91dE1zPzogbnVtYmVyXG4gIHJlYWRvbmx5IGNsb3NlU2NvcGVUaW1lb3V0PzogbnVtYmVyXG4gIHJlYWRvbmx5IGJ1ZGdldHM/OiBUcmlhbFJ1blJlcG9ydEJ1ZGdldHNcbn1cblxuY29uc3QgZGVmYXVsdEhvc3QgPSAoKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiAnYnJvd3NlcidcbiAgcmV0dXJuICdub2RlJ1xufVxuXG5jb25zdCBpc1JlY29yZCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IHJlc29sdmVSb290SW1wbCA9IDxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPihyb290OiBSb290TGlrZTxTaD4pOiBNb2R1bGVJbXBsPGFueSwgU2gsIGFueT4gPT5cbiAgKChyb290IGFzIGFueSk/Ll90YWcgPT09ICdNb2R1bGVJbXBsJ1xuICAgID8gKHJvb3QgYXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+KVxuICAgIDogKChyb290IGFzIGFueSk/LmltcGwgYXMgTW9kdWxlSW1wbDxhbnksIFNoLCBhbnk+KSkgc2F0aXNmaWVzIE1vZHVsZUltcGw8YW55LCBTaCwgYW55PlxuXG5jb25zdCB1dGY4Qnl0ZUxlbmd0aCA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciA9PiB7XG4gIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSlcbiAgaWYgKHR5cGVvZiBUZXh0RW5jb2RlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGpzb24pLmxlbmd0aFxuICB9XG4gIHJldHVybiBqc29uLmxlbmd0aFxufVxuXG5jb25zdCBwYXJzZU1pc3NpbmdDb25maWdLZXlzID0gKG1lc3NhZ2U6IHN0cmluZyk6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXVxuXG4gIC8vIEVmZmVjdCBDb25maWcgZXJyb3IgbWVzc2FnZXMgdmFyeTsga2VlcCBwYXJzaW5nIGNvbnNlcnZhdGl2ZSBhbmQgZGV0ZXJtaW5pc3RpYy5cbiAgY29uc3QgcGF0dGVybnM6IFJlYWRvbmx5QXJyYXk8UmVnRXhwPiA9IFtcbiAgICAvXFxiTWlzc2luZyAoPzpkYXRhfHZhbHVlKSBmb3IgKD86a2V5fHBhdGgpIFwiPyhbQS1aMC05Xy4vOi1dKylcIj8vZyxcbiAgICAvXFxiTWlzc2luZyAoPzpkYXRhfHZhbHVlKSBhdCAoW0EtWjAtOV8uLzotXSspXFxiL2csXG4gICAgL1xcYk1pc3NpbmcgY29uZmlndXJhdGlvbjo/IFwiPyhbQS1aMC05Xy4vOi1dKylcIj8vZyxcbiAgICAvXFxiQ29uZmlnXFxiLipcXGJtaXNzaW5nXFxiLipcIj8oW0EtWjAtOV8uLzotXSspXCI/L2dpLFxuICBdXG5cbiAgZm9yIChjb25zdCByZSBvZiBwYXR0ZXJucykge1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbFxuICAgIHdoaWxlICgobWF0Y2ggPSByZS5leGVjKG1lc3NhZ2UpKSkge1xuICAgICAgY29uc3Qga2V5ID0gbWF0Y2hbMV1cbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkubGVuZ3RoID4gMCkgb3V0LnB1c2goa2V5KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQob3V0KSkuc29ydCgpXG59XG5cbmNvbnN0IHBhcnNlTWlzc2luZ1NlcnZpY2VJZHMgPSAobWVzc2FnZTogc3RyaW5nKTogUmVhZG9ubHlBcnJheTxzdHJpbmc+ID0+IHtcbiAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFtdXG4gIGNvbnN0IHJlID0gL1NlcnZpY2Ugbm90IGZvdW5kOiAoW15cXHMoXSspL2dcbiAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsXG4gIHdoaWxlICgobWF0Y2ggPSByZS5leGVjKG1lc3NhZ2UpKSkge1xuICAgIGNvbnN0IGlkID0gbWF0Y2hbMV0/LnJlcGxhY2UoL1ssOi47XSskLywgJycpXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgJiYgaWQubGVuZ3RoID4gMCkgb3V0LnB1c2goaWQpXG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChvdXQpKS5zb3J0KClcbn1cblxuY29uc3QgcGFyc2VNaXNzaW5nRGVwZW5kZW5jeUZyb21DYXVzZSA9IChcbiAgY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+LFxuKToge1xuICByZWFkb25seSBtaXNzaW5nU2VydmljZXM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPlxuICByZWFkb25seSBtaXNzaW5nQ29uZmlnS2V5czogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG59ID0+IHtcbiAgY29uc3QgbWlzc2luZ1NlcnZpY2VzOiBzdHJpbmdbXSA9IFtdXG4gIGNvbnN0IG1pc3NpbmdDb25maWdLZXlzOiBzdHJpbmdbXSA9IFtdXG5cbiAgY29uc3QgY2FuZGlkYXRlcyA9IFsuLi5BcnJheS5mcm9tKENhdXNlLmZhaWx1cmVzKGNhdXNlKSksIC4uLkFycmF5LmZyb20oQ2F1c2UuZGVmZWN0cyhjYXVzZSkpXVxuXG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAoaXNSZWNvcmQoY2FuZGlkYXRlKSAmJiAoY2FuZGlkYXRlIGFzIGFueSkuX3RhZyA9PT0gJ0NvbnN0cnVjdGlvbkd1YXJkRXJyb3InKSB7XG4gICAgICBjb25zdCBtaXNzaW5nU2VydmljZSA9IChjYW5kaWRhdGUgYXMgYW55KS5taXNzaW5nU2VydmljZVxuICAgICAgaWYgKHR5cGVvZiBtaXNzaW5nU2VydmljZSA9PT0gJ3N0cmluZycgJiYgbWlzc2luZ1NlcnZpY2UubGVuZ3RoID4gMCkge1xuICAgICAgICBtaXNzaW5nU2VydmljZXMucHVzaChtaXNzaW5nU2VydmljZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBpc1JlY29yZChjYW5kaWRhdGUpICYmXG4gICAgICAoY2FuZGlkYXRlIGFzIGFueSkuX3RhZyA9PT0gJ0NvbmZpZ0Vycm9yJyAmJlxuICAgICAgKGNhbmRpZGF0ZSBhcyBhbnkpLl9vcCA9PT0gJ01pc3NpbmdEYXRhJyAmJlxuICAgICAgQXJyYXkuaXNBcnJheSgoY2FuZGlkYXRlIGFzIGFueSkucGF0aCkgJiZcbiAgICAgIChjYW5kaWRhdGUgYXMgYW55KS5wYXRoLmV2ZXJ5KChrOiB1bmtub3duKSA9PiB0eXBlb2YgayA9PT0gJ3N0cmluZycgJiYgay5sZW5ndGggPiAwKVxuICAgICkge1xuICAgICAgY29uc3Qga2V5ID0gKGNhbmRpZGF0ZSBhcyBhbnkpLnBhdGguam9pbignLicpXG4gICAgICBpZiAoa2V5Lmxlbmd0aCA+IDApIG1pc3NpbmdDb25maWdLZXlzLnB1c2goa2V5KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdXG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBpZiAoY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIG1lc3NhZ2VzLnB1c2goY2FuZGlkYXRlLm1lc3NhZ2UpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG1lc3NhZ2VzLnB1c2goY2FuZGlkYXRlKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKGlzUmVjb3JkKGNhbmRpZGF0ZSkgJiYgdHlwZW9mIChjYW5kaWRhdGUgYXMgYW55KS5tZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgbWVzc2FnZXMucHVzaChTdHJpbmcoKGNhbmRpZGF0ZSBhcyBhbnkpLm1lc3NhZ2UpKVxuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgbWVzc2FnZXMucHVzaChDYXVzZS5wcmV0dHkoY2F1c2UsIHsgcmVuZGVyRXJyb3JDYXVzZTogdHJ1ZSB9KSlcbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cblxuICBjb25zdCBtZXJnZWQgPSBtZXNzYWdlcy5maWx0ZXIoKHMpID0+IHMubGVuZ3RoID4gMCkuam9pbignXFxuJylcblxuICBpZiAobWVyZ2VkKSB7XG4gICAgbWlzc2luZ1NlcnZpY2VzLnB1c2goLi4ucGFyc2VNaXNzaW5nU2VydmljZUlkcyhtZXJnZWQpKVxuICAgIG1pc3NpbmdDb25maWdLZXlzLnB1c2goLi4ucGFyc2VNaXNzaW5nQ29uZmlnS2V5cyhtZXJnZWQpKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtaXNzaW5nU2VydmljZXM6IEFycmF5LmZyb20obmV3IFNldChtaXNzaW5nU2VydmljZXMpKS5zb3J0KCksXG4gICAgbWlzc2luZ0NvbmZpZ0tleXM6IEFycmF5LmZyb20obmV3IFNldChtaXNzaW5nQ29uZmlnS2V5cykpLnNvcnQoKSxcbiAgfVxufVxuXG5jb25zdCBidWlsZEVudmlyb25tZW50SXIgPSAocGFyYW1zOiB7XG4gIHJlYWRvbmx5IGtlcm5lbEltcGxlbWVudGF0aW9uUmVmPzogS2VybmVsSW1wbGVtZW50YXRpb25SZWZcbiAgcmVhZG9ubHkgcnVudGltZVNlcnZpY2VzRXZpZGVuY2U/OiBSdW50aW1lS2VybmVsLlJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlXG4gIHJlYWRvbmx5IGJ1aWxkRW52Q29uZmlnPzogUmVjb3JkPHN0cmluZywgQnVpbGRFbnYuQnVpbGRFbnZDb25maWdWYWx1ZSB8IHVuZGVmaW5lZD5cbiAgcmVhZG9ubHkgbWlzc2luZ1NlcnZpY2VzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG4gIHJlYWRvbmx5IG1pc3NpbmdDb25maWdLZXlzPzogUmVhZG9ubHlBcnJheTxzdHJpbmc+XG59KTogRW52aXJvbm1lbnRJciA9PiB7XG4gIGNvbnN0IHByb3ZpZGVkQ29uZmlnS2V5cyA9IE9iamVjdC5rZXlzKHBhcmFtcy5idWlsZEVudkNvbmZpZyA/PyB7fSlcbiAgICAuZmlsdGVyKChrKSA9PiBrLmxlbmd0aCA+IDAgJiYgKHBhcmFtcy5idWlsZEVudkNvbmZpZyBhcyBhbnkpW2tdICE9PSB1bmRlZmluZWQpXG4gICAgLnNvcnQoKVxuXG4gIGNvbnN0IG1pc3NpbmdTZXJ2aWNlcyA9IEFycmF5LmZyb20obmV3IFNldChwYXJhbXMubWlzc2luZ1NlcnZpY2VzID8/IFtdKSkuc29ydCgpXG4gIGNvbnN0IG1pc3NpbmdDb25maWdLZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KHBhcmFtcy5taXNzaW5nQ29uZmlnS2V5cyA/PyBbXSkpLnNvcnQoKVxuXG4gIGNvbnN0IHJ1bnRpbWVTZXJ2aWNlSWRzID1cbiAgICBwYXJhbXMucnVudGltZVNlcnZpY2VzRXZpZGVuY2U/LmJpbmRpbmdzPy5tYXAoKGIpID0+IGIuc2VydmljZUlkKS5maWx0ZXIoKHMpID0+IHR5cGVvZiBzID09PSAnc3RyaW5nJykgPz8gW11cblxuICBjb25zdCB0YWdJZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLnJ1bnRpbWVTZXJ2aWNlSWRzLCAuLi5taXNzaW5nU2VydmljZXNdKSkuc29ydCgpXG5cbiAgY29uc3QgY29uZmlnS2V5cyA9IEFycmF5LmZyb20obmV3IFNldChbLi4ucHJvdmlkZWRDb25maWdLZXlzLCAuLi5taXNzaW5nQ29uZmlnS2V5c10pKS5zb3J0KClcblxuICByZXR1cm4ge1xuICAgIHRhZ0lkcyxcbiAgICBjb25maWdLZXlzLFxuICAgIG1pc3NpbmdTZXJ2aWNlcyxcbiAgICBtaXNzaW5nQ29uZmlnS2V5cyxcbiAgICBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZjogcGFyYW1zLmtlcm5lbEltcGxlbWVudGF0aW9uUmVmLFxuICAgIHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlOiBwYXJhbXMucnVudGltZVNlcnZpY2VzRXZpZGVuY2UsXG4gIH1cbn1cblxuY29uc3QgdG9FcnJvclN1bW1hcnlXaXRoQ29kZSA9IChjYXVzZTogdW5rbm93biwgY29kZTogc3RyaW5nLCBoaW50Pzogc3RyaW5nKTogU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5ID0+IHtcbiAgY29uc3QgYmFzZSA9IHRvU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5KGNhdXNlKS5lcnJvclN1bW1hcnlcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBiYXNlLm5hbWUsXG4gICAgbWVzc2FnZTogYmFzZS5tZXNzYWdlLFxuICAgIGNvZGUsXG4gICAgaGludDogaGludCA/PyBiYXNlLmhpbnQsXG4gIH1cbn1cblxuY29uc3QgbWFrZVRyaWFsUnVuVGltZW91dEVycm9yID0gKCk6IEVycm9yID0+XG4gIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKCdbTG9naXhdIHRyaWFsUnVuTW9kdWxlIHRpbWVkIG91dCcpLCB7XG4gICAgbmFtZTogJ1RyaWFsUnVuVGltZW91dEVycm9yJyxcbiAgfSlcblxuY29uc3QgYXdhaXRGaWJlckV4aXRXaXRoVGltZW91dCA9IDxBLCBFPihcbiAgZmliZXI6IEZpYmVyLkZpYmVyPEEsIEU+LFxuICB0aW1lb3V0TXM6IG51bWJlciB8IHVuZGVmaW5lZCxcbik6IEVmZmVjdC5FZmZlY3Q8RXhpdC5FeGl0PEEsIEUgfCBFcnJvcj4sIG5ldmVyLCBuZXZlcj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IGhhc1RpbWVvdXQgPSB0eXBlb2YgdGltZW91dE1zID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUodGltZW91dE1zKSAmJiB0aW1lb3V0TXMgPiAwXG4gICAgY29uc3Qgc3RhcnQgPSBoYXNUaW1lb3V0ID8gRGF0ZS5ub3coKSA6IDBcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBleGl0T3B0ID0geWllbGQqIEZpYmVyLnBvbGwoZmliZXIpXG4gICAgICBpZiAoT3B0aW9uLmlzU29tZShleGl0T3B0KSkge1xuICAgICAgICByZXR1cm4gZXhpdE9wdC52YWx1ZSBhcyBFeGl0LkV4aXQ8QSwgRSB8IEVycm9yPlxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzVGltZW91dCkge1xuICAgICAgICBjb25zdCBlbGFwc2VkTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRcbiAgICAgICAgaWYgKGVsYXBzZWRNcyA+PSB0aW1lb3V0TXMpIHtcbiAgICAgICAgICB5aWVsZCogRmliZXIuaW50ZXJydXB0Rm9yayhmaWJlcilcbiAgICAgICAgICByZXR1cm4gRXhpdC5mYWlsKG1ha2VUcmlhbFJ1blRpbWVvdXRFcnJvcigpKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE5PVEU6IHRpbWVyIHlpZWxkIChub3QgVGVzdENsb2NrLWJhc2VkKVxuICAgICAgeWllbGQqIEVmZmVjdC5wcm9taXNlKCgpID0+IG5ldyBQcm9taXNlPHZvaWQ+KChyKSA9PiBzZXRUaW1lb3V0KHIsIDEpKSlcbiAgICB9XG4gIH0pXG5cbmV4cG9ydCBjb25zdCB0cmlhbFJ1bk1vZHVsZSA9IDxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlPihcbiAgcm9vdDogUm9vdExpa2U8U2g+LFxuICBvcHRpb25zPzogVHJpYWxSdW5Nb2R1bGVPcHRpb25zLFxuKTogRWZmZWN0LkVmZmVjdDxUcmlhbFJ1blJlcG9ydCwgbmV2ZXIsIG5ldmVyPiA9PlxuICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgY29uc3Qgcm9vdEltcGwgPSByZXNvbHZlUm9vdEltcGwocm9vdClcblxuICAgIGNvbnN0IHNlc3Npb24gPSBtYWtlUnVuU2Vzc2lvbih7XG4gICAgICBydW5JZDogb3B0aW9ucz8ucnVuSWQsXG4gICAgICBzb3VyY2U6IG9wdGlvbnM/LnNvdXJjZSA/PyB7IGhvc3Q6IGRlZmF1bHRIb3N0KCksIGxhYmVsOiAndHJpYWwtcnVuLW1vZHVsZScgfSxcbiAgICAgIHN0YXJ0ZWRBdDogb3B0aW9ucz8uc3RhcnRlZEF0LFxuICAgIH0pXG5cbiAgICBjb25zdCBjb2xsZWN0b3IgPSBtYWtlRXZpZGVuY2VDb2xsZWN0b3Ioc2Vzc2lvbilcblxuICAgIGNvbnN0IGNvbnZlcmdlQ29sbGVjdG9yOiBDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yID0ge1xuICAgICAgcmVnaXN0ZXI6IChpcikgPT4ge1xuICAgICAgICBjb2xsZWN0b3IucmVnaXN0ZXJDb252ZXJnZVN0YXRpY0lyKGlyKVxuICAgICAgfSxcbiAgICB9XG5cbiAgICBjb25zdCBzaW5rc0xheWVyID0gYXBwZW5kU2lua3MoW2NvbGxlY3Rvci5kZWJ1Z1NpbmsgYXMgdW5rbm93biBhcyBEZWJ1Z1NpbmtdKVxuICAgIGNvbnN0IHJlc29sdmVkRGlhZ25vc3RpY3NMZXZlbCA9IG9wdGlvbnM/LmRpYWdub3N0aWNzTGV2ZWwgPz8gJ2xpZ2h0J1xuICAgIGNvbnN0IGRpYWdub3N0aWNzTGF5ZXIgPSBkaWFnbm9zdGljc0xldmVsKHJlc29sdmVkRGlhZ25vc3RpY3NMZXZlbClcbiAgICBjb25zdCBjb252ZXJnZUxheWVyID0gYXBwZW5kQ29udmVyZ2VTdGF0aWNJckNvbGxlY3RvcnMoW2NvbnZlcmdlQ29sbGVjdG9yXSlcbiAgICBjb25zdCBjb2xsZWN0b3JMYXllciA9IGV2aWRlbmNlQ29sbGVjdG9yTGF5ZXIoY29sbGVjdG9yKVxuICAgIGNvbnN0IHNlc3Npb25MYXllciA9IHJ1blNlc3Npb25MYXllcihzZXNzaW9uKVxuXG4gICAgY29uc3QgYnVpbGRFbnZDb25maWcgPSBvcHRpb25zPy5idWlsZEVudj8uY29uZmlnXG4gICAgY29uc3QgYnVpbGRFbnZMYXllciA9IEJ1aWxkRW52LmxheWVyKHtcbiAgICAgIHJ1bnRpbWVIb3N0S2luZDogb3B0aW9ucz8uYnVpbGRFbnY/Lmhvc3RLaW5kLFxuICAgICAgY29uZmlnOiBidWlsZEVudkNvbmZpZyxcbiAgICAgIGNvbmZpZ1Byb3ZpZGVyOiBvcHRpb25zPy5idWlsZEVudj8uY29uZmlnUHJvdmlkZXIsXG4gICAgfSlcblxuICAgIGNvbnN0IHRyaWFsTGF5ZXIgPSBMYXllci5tZXJnZUFsbChcbiAgICAgIGJ1aWxkRW52TGF5ZXIsXG4gICAgICBvcHRpb25zPy5sYXllciA/PyAoTGF5ZXIuZW1wdHkgYXMgdW5rbm93biBhcyBMYXllci5MYXllcjxhbnksIGFueSwgYW55PiksXG4gICAgICBzZXNzaW9uTGF5ZXIsXG4gICAgICBjb2xsZWN0b3JMYXllcixcbiAgICAgIGRpYWdub3N0aWNzTGF5ZXIsXG4gICAgICBzaW5rc0xheWVyLFxuICAgICAgY29udmVyZ2VMYXllcixcbiAgICApIGFzIExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPlxuXG4gICAgY29uc3Qga2VybmVsID0geWllbGQqIG1ha2VQcm9ncmFtUnVubmVyS2VybmVsKFxuICAgICAgKGltcGwpID0+XG4gICAgICAgIFJ1bnRpbWUubWFrZShpbXBsLCB7XG4gICAgICAgICAgbGF5ZXI6IHRyaWFsTGF5ZXIgYXMgYW55LFxuICAgICAgICAgIC8vIHRyaWFsLXJ1biBkb2VzIG5vdCBlbmFibGUgZGV2dG9vbHMgYnkgZGVmYXVsdDsgZGlhZ25vc3RpY3MgaXMgY29udHJvbGxlZCBieSBkaWFnbm9zdGljc0xldmVsLlxuICAgICAgICB9IGFzIGFueSksXG4gICAgICByb290SW1wbCxcbiAgICApXG5cbiAgICBjb25zdCBpZGVudGl0eSA9IGtlcm5lbC5pZGVudGl0eVxuXG4gICAgY29uc3QgYm9vdEZpYmVyID0ga2VybmVsLnJ1bnRpbWUucnVuRm9yayhyb290SW1wbC5tb2R1bGUgYXMgYW55KVxuICAgIGNvbnN0IGJvb3RFeGl0ID0geWllbGQqIGF3YWl0RmliZXJFeGl0V2l0aFRpbWVvdXQoYm9vdEZpYmVyLCBvcHRpb25zPy50cmlhbFJ1blRpbWVvdXRNcylcblxuICAgIGxldCBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZjogS2VybmVsSW1wbGVtZW50YXRpb25SZWYgfCB1bmRlZmluZWRcbiAgICBsZXQgcnVudGltZVNlcnZpY2VzRXZpZGVuY2U6IFJ1bnRpbWVLZXJuZWwuUnVudGltZVNlcnZpY2VzRXZpZGVuY2UgfCB1bmRlZmluZWRcbiAgICBsZXQgaW5zdGFuY2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgICBpZiAoRXhpdC5pc1N1Y2Nlc3MoYm9vdEV4aXQpKSB7XG4gICAgICBjb25zdCBtb2R1bGVSdW50aW1lID0gYm9vdEV4aXQudmFsdWUgYXMgYW55XG4gICAgICBpbnN0YW5jZUlkID1cbiAgICAgICAgdHlwZW9mIG1vZHVsZVJ1bnRpbWU/Lmluc3RhbmNlSWQgPT09ICdzdHJpbmcnICYmIG1vZHVsZVJ1bnRpbWUuaW5zdGFuY2VJZC5sZW5ndGggPiAwXG4gICAgICAgICAgPyBtb2R1bGVSdW50aW1lLmluc3RhbmNlSWRcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAga2VybmVsLnNldEluc3RhbmNlSWQoaW5zdGFuY2VJZClcblxuICAgICAgdHJ5IHtcbiAgICAgICAga2VybmVsSW1wbGVtZW50YXRpb25SZWYgPSBLZXJuZWxSZWYuZ2V0S2VybmVsSW1wbGVtZW50YXRpb25SZWYobW9kdWxlUnVudGltZSlcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZiA9IHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBpZiAocmVzb2x2ZWREaWFnbm9zdGljc0xldmVsICE9PSAnb2ZmJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlID0gUnVudGltZUtlcm5lbC5nZXRSdW50aW1lU2VydmljZXNFdmlkZW5jZShtb2R1bGVSdW50aW1lKVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBydW50aW1lU2VydmljZXNFdmlkZW5jZSA9IHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZhaWx1cmUgPSBDYXVzZS5mYWlsdXJlT3B0aW9uKGJvb3RFeGl0LmNhdXNlKVxuICAgICAgaWYgKE9wdGlvbi5pc1NvbWUoZmFpbHVyZSkpIHtcbiAgICAgICAgY29uc3QgZXJyOiBhbnkgPSBmYWlsdXJlLnZhbHVlXG4gICAgICAgIGNvbnN0IGluc3RhbmNlSWRGcm9tRXJyID0gdHlwZW9mIGVycj8uaW5zdGFuY2VJZCA9PT0gJ3N0cmluZycgPyBlcnIuaW5zdGFuY2VJZCA6IHVuZGVmaW5lZFxuICAgICAgICBpZiAoaW5zdGFuY2VJZEZyb21FcnIgJiYgaW5zdGFuY2VJZEZyb21FcnIubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGtlcm5lbC5zZXRJbnN0YW5jZUlkKGluc3RhbmNlSWRGcm9tRXJyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2xvc2VFeGl0ID0geWllbGQqIEVmZmVjdC5leGl0KFxuICAgICAga2VybmVsLmNsb3NlKHtcbiAgICAgICAgdGltZW91dE1zOlxuICAgICAgICAgIHR5cGVvZiBvcHRpb25zPy5jbG9zZVNjb3BlVGltZW91dCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICBOdW1iZXIuaXNGaW5pdGUob3B0aW9ucy5jbG9zZVNjb3BlVGltZW91dCkgJiZcbiAgICAgICAgICBvcHRpb25zLmNsb3NlU2NvcGVUaW1lb3V0ID4gMFxuICAgICAgICAgICAgPyBvcHRpb25zLmNsb3NlU2NvcGVUaW1lb3V0XG4gICAgICAgICAgICA6IDEwMDAsXG4gICAgICB9KSxcbiAgICApXG5cbiAgICBjb25zdCBldmlkZW5jZSA9IGNvbGxlY3Rvci5leHBvcnRFdmlkZW5jZVBhY2thZ2Uoe1xuICAgICAgbWF4RXZlbnRzOiBvcHRpb25zPy5tYXhFdmVudHMgPz8gMTAwMCxcbiAgICB9KVxuXG4gICAgY29uc3QgbWFuaWZlc3QgPSAoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV4dHJhY3RNYW5pZmVzdChyb290IGFzIGFueSwge1xuICAgICAgICAgIGluY2x1ZGVTdGF0aWNJcjogdHJ1ZSxcbiAgICAgICAgICBidWRnZXRzOiB7IG1heEJ5dGVzOiAyMDBfMDAwIH0sXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0pKClcblxuICAgIGNvbnN0IHN0YXRpY0lyID0gKCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBleHBvcnRTdGF0aWNJcihyb290IGFzIGFueSlcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfSkoKVxuXG4gICAgbGV0IG9rID0gRXhpdC5pc1N1Y2Nlc3MoYm9vdEV4aXQpICYmIEV4aXQuaXNTdWNjZXNzKGNsb3NlRXhpdClcbiAgICBsZXQgZXJyb3I6IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSB8IHVuZGVmaW5lZFxuICAgIGxldCBzdW1tYXJ5OiB1bmtub3duIHwgdW5kZWZpbmVkXG5cbiAgICBjb25zdCBkZXBzRnJvbUJvb3RGYWlsdXJlID0gRXhpdC5pc0ZhaWx1cmUoYm9vdEV4aXQpXG4gICAgICA/IHBhcnNlTWlzc2luZ0RlcGVuZGVuY3lGcm9tQ2F1c2UoYm9vdEV4aXQuY2F1c2UgYXMgQ2F1c2UuQ2F1c2U8dW5rbm93bj4pXG4gICAgICA6IHsgbWlzc2luZ1NlcnZpY2VzOiBbXSwgbWlzc2luZ0NvbmZpZ0tleXM6IFtdIH1cblxuICAgIGNvbnN0IG1pc3NpbmdTZXJ2aWNlcyA9IGRlcHNGcm9tQm9vdEZhaWx1cmUubWlzc2luZ1NlcnZpY2VzXG4gICAgY29uc3QgbWlzc2luZ0NvbmZpZ0tleXMgPSBkZXBzRnJvbUJvb3RGYWlsdXJlLm1pc3NpbmdDb25maWdLZXlzXG5cbiAgICBjb25zdCBjbG9zZUVycm9yID0gRXhpdC5pc0ZhaWx1cmUoY2xvc2VFeGl0KSA/IE9wdGlvbi5nZXRPclVuZGVmaW5lZChDYXVzZS5kaWVPcHRpb24oY2xvc2VFeGl0LmNhdXNlKSkgOiB1bmRlZmluZWRcblxuICAgIGlmICghRXhpdC5pc1N1Y2Nlc3MoYm9vdEV4aXQpKSB7XG4gICAgICBjb25zdCBmYWlsdXJlID0gT3B0aW9uLmdldE9yVW5kZWZpbmVkKENhdXNlLmZhaWx1cmVPcHRpb24oYm9vdEV4aXQuY2F1c2UpKVxuICAgICAgY29uc3QgZGVmZWN0ID0gT3B0aW9uLmdldE9yVW5kZWZpbmVkKENhdXNlLmRpZU9wdGlvbihib290RXhpdC5jYXVzZSkpXG4gICAgICBjb25zdCBiYXNlID0gZmFpbHVyZSA/PyBkZWZlY3QgPz8gYm9vdEV4aXQuY2F1c2VcblxuICAgICAgaWYgKG1pc3NpbmdTZXJ2aWNlcy5sZW5ndGggPiAwIHx8IG1pc3NpbmdDb25maWdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb2sgPSBmYWxzZVxuICAgICAgICBlcnJvciA9IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUoXG4gICAgICAgICAgYmFzZSxcbiAgICAgICAgICAnTWlzc2luZ0RlcGVuZGVuY3knLFxuICAgICAgICAgIG1pc3NpbmdTZXJ2aWNlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICA/ICdCdWlsZC10aW1lIG1pc3Npbmcgc2VydmljZTogcHJvdmlkZSBhIExheWVyIG1vY2svaW1wbGVtZW50YXRpb24gdmlhIG9wdGlvbnMubGF5ZXIsIG9yIG1vdmUgdGhlIGRlcGVuZGVuY3kgYWNjZXNzIHRvIHJ1bnRpbWUuJ1xuICAgICAgICAgICAgOiAnQnVpbGQtdGltZSBtaXNzaW5nIGNvbmZpZzogcHJvdmlkZSB0aGUgbWlzc2luZyBrZXkocykgaW4gYnVpbGRFbnYuY29uZmlnLCBvciBhZGQgYSBkZWZhdWx0IHZhbHVlIHRvIENvbmZpZy4nLFxuICAgICAgICApXG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBpc1JlY29yZChiYXNlKSAmJlxuICAgICAgICAoKGJhc2UgYXMgYW55KS5uYW1lID09PSAnVHJpYWxSdW5UaW1lb3V0RXJyb3InIHx8IChiYXNlIGFzIGFueSkuX3RhZyA9PT0gJ1RyaWFsUnVuVGltZW91dCcpXG4gICAgICApIHtcbiAgICAgICAgb2sgPSBmYWxzZVxuICAgICAgICBlcnJvciA9IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUoXG4gICAgICAgICAgYmFzZSxcbiAgICAgICAgICAnVHJpYWxSdW5UaW1lb3V0JyxcbiAgICAgICAgICAnVHJpYWwgcnVuIHRpbWVkIG91dDogY2hlY2sgZm9yIExheWVyL2Fzc2VtYmx5IHBoYXNlIGJsb2NraW5nIChFZmZlY3QubmV2ZXIgLyB1bmZpbmlzaGVkIGFjcXVpcmUpLicsXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9rID0gZmFsc2VcbiAgICAgICAgZXJyb3IgPSB0b0Vycm9yU3VtbWFyeVdpdGhDb2RlKGJhc2UsICdSdW50aW1lRmFpbHVyZScpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKEV4aXQuaXNGYWlsdXJlKGNsb3NlRXhpdCkpIHtcbiAgICAgIGNvbnN0IGRpZWQgPSBPcHRpb24uZ2V0T3JVbmRlZmluZWQoQ2F1c2UuZGllT3B0aW9uKGNsb3NlRXhpdC5jYXVzZSkpXG4gICAgICBjb25zdCBmYWlsdXJlID0gT3B0aW9uLmdldE9yVW5kZWZpbmVkKENhdXNlLmZhaWx1cmVPcHRpb24oY2xvc2VFeGl0LmNhdXNlKSlcbiAgICAgIGNvbnN0IGJhc2UgPSBkaWVkID8/IGZhaWx1cmUgPz8gY2xvc2VFeGl0LmNhdXNlXG5cbiAgICAgIGNvbnN0IGNsb3NlRXJyb3JTdW1tYXJ5ID0gKCgpID0+IHtcbiAgICAgICAgY29uc3QgdGFnID0gaXNSZWNvcmQoYmFzZSkgPyAoYmFzZSBhcyBhbnkpLl90YWcgOiB1bmRlZmluZWRcbiAgICAgICAgaWYgKHRhZyA9PT0gJ0Rpc3Bvc2VUaW1lb3V0Jykge1xuICAgICAgICAgIHJldHVybiB0b0Vycm9yU3VtbWFyeVdpdGhDb2RlKFxuICAgICAgICAgICAgYmFzZSxcbiAgICAgICAgICAgICdEaXNwb3NlVGltZW91dCcsXG4gICAgICAgICAgICAnRGlzcG9zZSB0aW1lZCBvdXQ6IGNoZWNrIGZvciB1bmNsb3NlZCByZXNvdXJjZSBoYW5kbGVzLCBmaWJlcnMgbm90IGludGVycnVwdGVkLCBvciBldmVudCBsaXN0ZW5lcnMgbm90IHVucmVnaXN0ZXJlZC4nLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG9FcnJvclN1bW1hcnlXaXRoQ29kZShiYXNlLCAnUnVudGltZUZhaWx1cmUnKVxuICAgICAgfSkoKVxuXG4gICAgICBvayA9IGZhbHNlXG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIC8vIElmIGJvb3Qgc3VjY2VlZGVkIGJ1dCBkaXNwb3NlIGZhaWxlZCwgdGhlIGNsb3NlIGVycm9yIGlzIHRoZSBwcmltYXJ5IGZhaWx1cmUuXG4gICAgICAgIGVycm9yID0gY2xvc2VFcnJvclN1bW1hcnlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFByZXNlcnZlIHRoZSBwcmltYXJ5IGJvb3QgZmFpbHVyZSAoZS5nLiBUcmlhbFJ1blRpbWVvdXQpIGJ1dCBrZWVwIGRpc3Bvc2UgZmFpbHVyZSBldmlkZW5jZS5cbiAgICAgICAgc3VtbWFyeSA9IHsgX19sb2dpeDogeyBjbG9zZUVycm9yOiBjbG9zZUVycm9yU3VtbWFyeSB9IH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbnZpcm9ubWVudCA9IGJ1aWxkRW52aXJvbm1lbnRJcih7XG4gICAgICBrZXJuZWxJbXBsZW1lbnRhdGlvblJlZixcbiAgICAgIHJ1bnRpbWVTZXJ2aWNlc0V2aWRlbmNlLFxuICAgICAgYnVpbGRFbnZDb25maWcsXG4gICAgICBtaXNzaW5nU2VydmljZXMsXG4gICAgICBtaXNzaW5nQ29uZmlnS2V5cyxcbiAgICB9KVxuXG4gICAgY29uc3QgbW9kdWxlSWQgPVxuICAgICAgdHlwZW9mIChyb290SW1wbC5tb2R1bGUgYXMgYW55KT8uaWQgPT09ICdzdHJpbmcnICYmIChyb290SW1wbC5tb2R1bGUgYXMgYW55KS5pZC5sZW5ndGggPiAwXG4gICAgICAgID8gU3RyaW5nKChyb290SW1wbC5tb2R1bGUgYXMgYW55KS5pZClcbiAgICAgICAgOiAobWFuaWZlc3Q/Lm1vZHVsZUlkID8/ICd1bmtub3duJylcblxuICAgIGNvbnN0IGFydGlmYWN0cyA9IGNvbGxlY3RUcmlhbFJ1bkFydGlmYWN0cyh7XG4gICAgICBleHBvcnRlcnM6IGdldFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlcnMocm9vdEltcGwubW9kdWxlIGFzIGFueSksXG4gICAgICBjdHg6IHtcbiAgICAgICAgbW9kdWxlSWQsXG4gICAgICAgIG1hbmlmZXN0LFxuICAgICAgICBzdGF0aWNJcjogc3RhdGljSXIgYXMgYW55LFxuICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgIH0sXG4gICAgfSlcblxuICAgIGxldCByZXBvcnQ6IFRyaWFsUnVuUmVwb3J0ID0ge1xuICAgICAgcnVuSWQ6IHNlc3Npb24ucnVuSWQsXG4gICAgICBvayxcbiAgICAgIG1hbmlmZXN0LFxuICAgICAgc3RhdGljSXI6IHN0YXRpY0lyIGFzIGFueSxcbiAgICAgIGFydGlmYWN0cyxcbiAgICAgIGVudmlyb25tZW50LFxuICAgICAgZXZpZGVuY2UsXG4gICAgICBzdW1tYXJ5LFxuICAgICAgZXJyb3IsXG4gICAgfVxuXG4gICAgY29uc3QgbWF4Qnl0ZXMgPSBvcHRpb25zPy5idWRnZXRzPy5tYXhCeXRlc1xuICAgIGlmICh0eXBlb2YgbWF4Qnl0ZXMgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShtYXhCeXRlcykgJiYgbWF4Qnl0ZXMgPiAwKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEJ5dGVzID0gdXRmOEJ5dGVMZW5ndGgocmVwb3J0KVxuICAgICAgaWYgKG9yaWdpbmFsQnl0ZXMgPiBtYXhCeXRlcykge1xuICAgICAgICByZXBvcnQgPSB7XG4gICAgICAgICAgcnVuSWQ6IHNlc3Npb24ucnVuSWQsXG4gICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgIGVudmlyb25tZW50LFxuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBtZXNzYWdlOiBgW0xvZ2l4XSBUcmlhbFJ1blJlcG9ydCBleGNlZWRlZCBtYXhCeXRlcyAoJHtvcmlnaW5hbEJ5dGVzfSA+ICR7bWF4Qnl0ZXN9KWAsXG4gICAgICAgICAgICBjb2RlOiAnT3ZlcnNpemVkJyxcbiAgICAgICAgICAgIGhpbnQ6ICdSZWR1Y2UgbWF4RXZlbnRzIG9yIGJ1ZGdldHMubWF4Qnl0ZXMsIG9yIHNwbGl0IG1hbmlmZXN0L2V2aWRlbmNlIGFydGlmYWN0cyBpbiBDSS4nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgICAgX19sb2dpeDoge1xuICAgICAgICAgICAgICB0cnVuY2F0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIG1heEJ5dGVzLFxuICAgICAgICAgICAgICBvcmlnaW5hbEJ5dGVzLFxuICAgICAgICAgICAgICBkcm9wcGVkOiBbJ21hbmlmZXN0JywgJ3N0YXRpY0lyJywgJ2FydGlmYWN0cycsICdldmlkZW5jZSddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcG9ydFxuICB9KVxuIiwgImltcG9ydCB7IENvbmZpZ1Byb3ZpZGVyLCBFZmZlY3QsIExheWVyIH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0ICogYXMgQ29uc3RydWN0aW9uR3VhcmQgZnJvbSAnLi9Db25zdHJ1Y3Rpb25HdWFyZC5qcydcbmltcG9ydCB7XG4gIFJ1bnRpbWVIb3N0LFxuICB0eXBlIFJ1bnRpbWVIb3N0S2luZCxcbiAgdHlwZSBSdW50aW1lSG9zdFNlcnZpY2UsXG4gIGRlZmF1bHRMYXllciBhcyBkZWZhdWx0UnVudGltZUhvc3RMYXllcixcbiAgbWFrZSBhcyBtYWtlUnVudGltZUhvc3QsXG4gIGxheWVyIGFzIHJ1bnRpbWVIb3N0TGF5ZXIsXG59IGZyb20gJy4vUnVudGltZUhvc3QuanMnXG5cbmV4cG9ydCB0eXBlIEJ1aWxkRW52Q29uZmlnVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRFbnZPcHRpb25zIHtcbiAgcmVhZG9ubHkgcnVudGltZUhvc3Q/OiBSdW50aW1lSG9zdFNlcnZpY2VcbiAgcmVhZG9ubHkgcnVudGltZUhvc3RLaW5kPzogUnVudGltZUhvc3RLaW5kXG4gIC8qKlxuICAgKiBGbGF0IGtleS92YWx1ZSBjb25maWcgZm9yIG1vY2tpbmcgZmVhdHVyZSBmbGFncyAvIGVudiB2YXJpYWJsZXMgKHZhbHVlcyBhcmUgY29lcmNlZCB0byBzdHJpbmcpLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnPzogUmVjb3JkPHN0cmluZywgQnVpbGRFbnZDb25maWdWYWx1ZSB8IHVuZGVmaW5lZD5cbiAgLyoqXG4gICAqIEFkdmFuY2VkOiBpbmplY3QgYSBDb25maWdQcm92aWRlciBkaXJlY3RseSAoaGlnaGVyIHByaW9yaXR5IHRoYW4gY29uZmlnKS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZ1Byb3ZpZGVyPzogQ29uZmlnUHJvdmlkZXIuQ29uZmlnUHJvdmlkZXJcbn1cblxuY29uc3QgdG9Db25maWdQcm92aWRlckZyb21SZWNvcmQgPSAoXG4gIHJlY29yZDogUmVjb3JkPHN0cmluZywgQnVpbGRFbnZDb25maWdWYWx1ZSB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQsXG4pOiBDb25maWdQcm92aWRlci5Db25maWdQcm92aWRlciA9PiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KClcbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkID8/IHt9KSkge1xuICAgIGlmICghaykgY29udGludWVcbiAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSBjb250aW51ZVxuICAgIG1hcC5zZXQoaywgU3RyaW5nKHYpKVxuICB9XG4gIHJldHVybiBDb25maWdQcm92aWRlci5mcm9tTWFwKG1hcClcbn1cblxuZXhwb3J0IGNvbnN0IGxheWVyID0gKG9wdGlvbnM6IEJ1aWxkRW52T3B0aW9ucyA9IHt9KTogTGF5ZXIuTGF5ZXI8UnVudGltZUhvc3QsIG5ldmVyLCBuZXZlcj4gPT4ge1xuICBjb25zdCBydW50aW1lSG9zdCA9IG9wdGlvbnMucnVudGltZUhvc3RcbiAgICA/IHJ1bnRpbWVIb3N0TGF5ZXIob3B0aW9ucy5ydW50aW1lSG9zdClcbiAgICA6IG9wdGlvbnMucnVudGltZUhvc3RLaW5kXG4gICAgICA/IHJ1bnRpbWVIb3N0TGF5ZXIobWFrZVJ1bnRpbWVIb3N0KG9wdGlvbnMucnVudGltZUhvc3RLaW5kKSlcbiAgICAgIDogZGVmYXVsdFJ1bnRpbWVIb3N0TGF5ZXJcblxuICBjb25zdCBjb25maWdQcm92aWRlciA9IG9wdGlvbnMuY29uZmlnUHJvdmlkZXIgPyBvcHRpb25zLmNvbmZpZ1Byb3ZpZGVyIDogdG9Db25maWdQcm92aWRlckZyb21SZWNvcmQob3B0aW9ucy5jb25maWcpXG5cbiAgY29uc3QgY29uZmlnID0gTGF5ZXIuc2V0Q29uZmlnUHJvdmlkZXIoY29uZmlnUHJvdmlkZXIpXG5cbiAgcmV0dXJuIExheWVyLm1lcmdlQWxsKHJ1bnRpbWVIb3N0LCBjb25maWcpIGFzIExheWVyLkxheWVyPFJ1bnRpbWVIb3N0LCBuZXZlciwgbmV2ZXI+XG59XG5cbmV4cG9ydCBjb25zdCBydW4gPSA8QSwgRT4oXG4gIGJ1aWxkZXI6IEVmZmVjdC5FZmZlY3Q8QSwgRSwgUnVudGltZUhvc3Q+LFxuICBvcHRpb25zOiBCdWlsZEVudk9wdGlvbnMgPSB7fSxcbik6IEVmZmVjdC5FZmZlY3Q8QSwgRSB8IENvbnN0cnVjdGlvbkd1YXJkLkNvbnN0cnVjdGlvbkd1YXJkRXJyb3IsIG5ldmVyPiA9PlxuICBidWlsZGVyLnBpcGUoRWZmZWN0LnByb3ZpZGUobGF5ZXIob3B0aW9ucykpLCBDb25zdHJ1Y3Rpb25HdWFyZC5ndWFyZEJ1aWxkVGltZSlcbiIsICJpbXBvcnQgeyBDYXVzZSwgRWZmZWN0IH0gZnJvbSAnZWZmZWN0J1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnN0cnVjdGlvbkd1YXJkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IF90YWc6ICdDb25zdHJ1Y3Rpb25HdWFyZEVycm9yJ1xuICByZWFkb25seSBraW5kOiAnbWlzc2luZ19zZXJ2aWNlJyB8ICd1bmtub3duX2RlZmVjdCdcbiAgcmVhZG9ubHkgbWlzc2luZ1NlcnZpY2U/OiBzdHJpbmdcbiAgcmVhZG9ubHkgaGludD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgbWFrZUNvbnN0cnVjdGlvbkd1YXJkRXJyb3IgPSAob3B0aW9uczoge1xuICByZWFkb25seSBraW5kOiBDb25zdHJ1Y3Rpb25HdWFyZEVycm9yWydraW5kJ11cbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nXG4gIHJlYWRvbmx5IG1pc3NpbmdTZXJ2aWNlPzogc3RyaW5nXG4gIHJlYWRvbmx5IGhpbnQ/OiBzdHJpbmdcbn0pOiBDb25zdHJ1Y3Rpb25HdWFyZEVycm9yID0+XG4gIE9iamVjdC5hc3NpZ24obmV3IEVycm9yKG9wdGlvbnMubWVzc2FnZSksIHtcbiAgICBfdGFnOiAnQ29uc3RydWN0aW9uR3VhcmRFcnJvcicsXG4gICAga2luZDogb3B0aW9ucy5raW5kLFxuICAgIG1pc3NpbmdTZXJ2aWNlOiBvcHRpb25zLm1pc3NpbmdTZXJ2aWNlLFxuICAgIGhpbnQ6IG9wdGlvbnMuaGludCxcbiAgfSkgYXMgQ29uc3RydWN0aW9uR3VhcmRFcnJvclxuXG5jb25zdCBleHRyYWN0TWlzc2luZ1NlcnZpY2UgPSAoY2F1c2U6IENhdXNlLkNhdXNlPHVua25vd24+KTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgY2FuZGlkYXRlcyA9IFsuLi5BcnJheS5mcm9tKENhdXNlLmRlZmVjdHMoY2F1c2UpKSwgLi4uQXJyYXkuZnJvbShDYXVzZS5mYWlsdXJlcyhjYXVzZSkpXVxuXG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgIGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yID8gY2FuZGlkYXRlLm1lc3NhZ2UgOiB0eXBlb2YgY2FuZGlkYXRlID09PSAnc3RyaW5nJyA/IGNhbmRpZGF0ZSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFtZXNzYWdlKSBjb250aW51ZVxuXG4gICAgY29uc3QgbWF0Y2ggPSAvU2VydmljZSBub3QgZm91bmQ6IChbXlxccyhdKykvLmV4ZWMobWVzc2FnZSlcbiAgICBpZiAobWF0Y2g/LlsxXSkgcmV0dXJuIG1hdGNoWzFdXG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogZ3VhcmRCdWlsZFRpbWVcdUZGMUFcbiAqIC0gRHVyaW5nIEJ1aWxkIEVudi9SZWZsZWN0aW9uLCBjYXRjaCBcIm1pc3Npbmcgc2VydmljZVwiIGRlZmVjdHMgYW5kIGNvbnZlcnQgdGhlbSBpbnRvIGFjdGlvbmFibGUgZXJyb3JzLlxuICogLSBQcmVzZXJ2ZSBvdGhlciBmYWlsdXJlcy9kZWZlY3RzIGFzLWlzIChkbyBub3Qgc3dhbGxvdyBidXNpbmVzcyBlcnJvciBzZW1hbnRpY3MpLlxuICovXG5leHBvcnQgY29uc3QgZ3VhcmRCdWlsZFRpbWUgPSA8QSwgRSwgUj4oXG4gIHNlbGY6IEVmZmVjdC5FZmZlY3Q8QSwgRSwgUj4sXG4pOiBFZmZlY3QuRWZmZWN0PEEsIEUgfCBDb25zdHJ1Y3Rpb25HdWFyZEVycm9yLCBSPiA9PlxuICBzZWxmLnBpcGUoXG4gICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKTogRWZmZWN0LkVmZmVjdDxuZXZlciwgQ29uc3RydWN0aW9uR3VhcmRFcnJvciB8IEUsIG5ldmVyPiA9PiB7XG4gICAgICBjb25zdCBtaXNzaW5nID0gZXh0cmFjdE1pc3NpbmdTZXJ2aWNlKGNhdXNlKVxuICAgICAgaWYgKG1pc3NpbmcpIHtcbiAgICAgICAgcmV0dXJuIEVmZmVjdC5mYWlsKFxuICAgICAgICAgIG1ha2VDb25zdHJ1Y3Rpb25HdWFyZEVycm9yKHtcbiAgICAgICAgICAgIGtpbmQ6ICdtaXNzaW5nX3NlcnZpY2UnLFxuICAgICAgICAgICAgbWlzc2luZ1NlcnZpY2U6IG1pc3NpbmcsXG4gICAgICAgICAgICBtZXNzYWdlOiBgW0NvbnN0cnVjdGlvbkd1YXJkRXJyb3JdIEJ1aWxkLXRpbWUgZGVwZW5kZW5jeSB2aW9sYXRpb246IHNlcnZpY2UgXCIke21pc3Npbmd9XCIgaXMgbm90IGF2YWlsYWJsZSBpbiBCdWlsZCBFbnYuYCxcbiAgICAgICAgICAgIGhpbnQ6XG4gICAgICAgICAgICAgICdCdWlsZC10aW1lIChSZWZsZWN0aW9uKSBjYW4gb25seSBkZXBlbmQgb24gYSBzbWFsbCBzZXQgb2YgbW9ja2FibGUgcHJpbWl0aXZlcyAoZS5nLiBDb25maWcvUnVudGltZUhvc3QpLiAnICtcbiAgICAgICAgICAgICAgJ01vdmUgYnVzaW5lc3Mgc2VydmljZSBhY2Nlc3MgdG8gcnVudGltZSAoZS5nLiBUcmFpdCBoYW5kbGVyIC8gTG9naWMgcnVuIHNlY3Rpb24pIG9yIGlzb2xhdGUgaXQgdmlhIGV4cGxpY2l0IGluamVjdGlvbi4nLFxuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm4gRWZmZWN0LmZhaWxDYXVzZShjYXVzZSkgYXMgRWZmZWN0LkVmZmVjdDxuZXZlciwgQ29uc3RydWN0aW9uR3VhcmRFcnJvciB8IEU+XG4gICAgfSksXG4gIClcbiIsICJpbXBvcnQgeyBDb250ZXh0LCBMYXllciB9IGZyb20gJ2VmZmVjdCdcblxuZXhwb3J0IHR5cGUgUnVudGltZUhvc3RLaW5kID0gJ25vZGUnIHwgJ2Jyb3dzZXInIHwgJ3Vua25vd24nXG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVudGltZUhvc3RTZXJ2aWNlIHtcbiAgcmVhZG9ubHkga2luZDogUnVudGltZUhvc3RLaW5kXG4gIHJlYWRvbmx5IGlzTm9kZTogYm9vbGVhblxuICByZWFkb25seSBpc0Jyb3dzZXI6IGJvb2xlYW5cbn1cblxuY29uc3QgZGV0ZWN0S2luZCA9ICgpOiBSdW50aW1lSG9zdEtpbmQgPT4ge1xuICBjb25zdCBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnXG5cbiAgaWYgKGlzQnJvd3NlcikgcmV0dXJuICdicm93c2VyJ1xuXG4gIGNvbnN0IGlzTm9kZSA9IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgKHByb2Nlc3MgYXMgYW55KT8udmVyc2lvbnM/Lm5vZGUgPT09ICdzdHJpbmcnXG5cbiAgaWYgKGlzTm9kZSkgcmV0dXJuICdub2RlJ1xuXG4gIHJldHVybiAndW5rbm93bidcbn1cblxuZXhwb3J0IGNvbnN0IG1ha2UgPSAoa2luZDogUnVudGltZUhvc3RLaW5kKTogUnVudGltZUhvc3RTZXJ2aWNlID0+ICh7XG4gIGtpbmQsXG4gIGlzTm9kZToga2luZCA9PT0gJ25vZGUnLFxuICBpc0Jyb3dzZXI6IGtpbmQgPT09ICdicm93c2VyJyxcbn0pXG5cbmV4cG9ydCBjbGFzcyBSdW50aW1lSG9zdCBleHRlbmRzIENvbnRleHQuVGFnKCdAbG9naXhqcy9SdW50aW1lSG9zdCcpPFJ1bnRpbWVIb3N0LCBSdW50aW1lSG9zdFNlcnZpY2U+KCkge31cblxuZXhwb3J0IGNvbnN0IGxheWVyID0gKHNlcnZpY2U6IFJ1bnRpbWVIb3N0U2VydmljZSk6IExheWVyLkxheWVyPFJ1bnRpbWVIb3N0LCBuZXZlciwgbmV2ZXI+ID0+XG4gIExheWVyLnN1Y2NlZWQoUnVudGltZUhvc3QsIHNlcnZpY2UpXG5cbmV4cG9ydCBjb25zdCBtb2NrID0gKGtpbmQ6IFJ1bnRpbWVIb3N0S2luZCk6IExheWVyLkxheWVyPFJ1bnRpbWVIb3N0LCBuZXZlciwgbmV2ZXI+ID0+IGxheWVyKG1ha2Uoa2luZCkpXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0TGF5ZXI6IExheWVyLkxheWVyPFJ1bnRpbWVIb3N0LCBuZXZlciwgbmV2ZXI+ID0gbGF5ZXIobWFrZShkZXRlY3RLaW5kKCkpKVxuIiwgImltcG9ydCB7IEVmZmVjdCwgTGF5ZXIsIE1hbmFnZWRSdW50aW1lIH0gZnJvbSAnZWZmZWN0J1xuaW1wb3J0IHR5cGUgeyBBbnlNb2R1bGVTaGFwZSwgTW9kdWxlSW1wbCB9IGZyb20gJy4vY29yZS9tb2R1bGUuanMnXG5pbXBvcnQgKiBhcyBBcHBSdW50aW1lSW1wbCBmcm9tICcuL0FwcFJ1bnRpbWUuanMnXG5cbi8qKlxuICogUnVudGltZSBvcHRpb25zOlxuICogLSBsYXllcjogZXh0cmEgdG9wLWxldmVsIEVudiAoZS5nLiBDb25maWcgLyBwbGF0Zm9ybSBzZXJ2aWNlcykgbWVyZ2VkIHdpdGggUm9vdCBNb2R1bGVJbXBsLmxheWVyLlxuICogLSBvbkVycm9yOiBhcHAtbGV2ZWwgZXJyb3IgaGFuZGxlciBlbnRyeXBvaW50IHVzZWQgdG8gcmVwb3J0IHVuY2F1Z2h0IGVycm9ycyBhdCB0aGUgUnVudGltZSBsZXZlbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW50aW1lT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGxheWVyPzogTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+XG4gIHJlYWRvbmx5IG9uRXJyb3I/OiAoY2F1c2U6IGltcG9ydCgnZWZmZWN0JykuQ2F1c2UuQ2F1c2U8dW5rbm93bj4pID0+IEVmZmVjdC5FZmZlY3Q8dm9pZD5cbn1cblxuLyoqXG4gKiBSdW50aW1lLm1ha2VcbiAqXG4gKiBCdWlsZCBhbiBhcHBsaWNhdGlvbi1sZXZlbCBSdW50aW1lIGdpdmVuIGEgcm9vdCBNb2R1bGVJbXBsOlxuICpcbiAqIC0gVXNlIFJvb3RJbXBsLm1vZHVsZSArIFJvb3RJbXBsLmxheWVyIGFzIHRoZSBzaW5nbGUgZ2xvYmFsIG1vZHVsZS5cbiAqIC0gRm9yayBSb290SW1wbC5wcm9jZXNzZXMgYXMgbG9uZy1saXZlZCBwcm9jZXNzZXMgd2l0aGluIHRoZSBSdW50aW1lIHNjb3BlLlxuICogLSBSZXVzZSB0aGUgZXhpc3RpbmcgQXBwUnVudGltZSBpbXBsZW1lbnRhdGlvbiBhcyB0aGUgdW5kZXJseWluZyBjb250YWluZXIgYW5kIGV4cG9zZSBvbmx5IE1hbmFnZWRSdW50aW1lLlxuICpcbiAqIE5vdGVzOlxuICogLSBVc2VzIGJyb2FkIGFueS9uZXZlciBhdCB0aGUgdHlwZSBsZXZlbCB0byBhdm9pZCBjb21wbGV4IEVudiBpbmZlcmVuY2UgaGVyZS5cbiAqIC0gQnVzaW5lc3MgY29kZSBvbmx5IG5lZWRzIHRvIGVuc3VyZSBSb290SW1wbC5sYXllciBhbmQgb3B0aW9ucy5sYXllciB0b2dldGhlciBjYW4gcHJvdmlkZSB0aGUgZnVsbCBFbnYuXG4gKi9cbmV4cG9ydCBjb25zdCBtYWtlID0gKFxuICByb290SW1wbDogTW9kdWxlSW1wbDxhbnksIEFueU1vZHVsZVNoYXBlLCBhbnk+LFxuICBvcHRpb25zPzogUnVudGltZU9wdGlvbnMsXG4pOiBNYW5hZ2VkUnVudGltZS5NYW5hZ2VkUnVudGltZTxhbnksIG5ldmVyPiA9PiB7XG4gIGNvbnN0IGFwcENvbmZpZzogQXBwUnVudGltZUltcGwuTG9naXhBcHBDb25maWc8YW55PiA9IHtcbiAgICBsYXllcjogKG9wdGlvbnM/LmxheWVyID8/IExheWVyLmVtcHR5KSBhcyBMYXllci5MYXllcjxhbnksIG5ldmVyLCBuZXZlcj4sXG4gICAgbW9kdWxlczogW0FwcFJ1bnRpbWVJbXBsLnByb3ZpZGUocm9vdEltcGwubW9kdWxlLCByb290SW1wbC5sYXllciBhcyBMYXllci5MYXllcjxhbnksIGFueSwgYW55PildLFxuICAgIHByb2Nlc3Nlczogcm9vdEltcGwucHJvY2Vzc2VzID8/IFtdLFxuICAgIG9uRXJyb3I6IG9wdGlvbnM/Lm9uRXJyb3IsXG4gIH1cblxuICBjb25zdCBhcHAgPSBBcHBSdW50aW1lSW1wbC5tYWtlQXBwKGFwcENvbmZpZylcbiAgcmV0dXJuIGFwcC5tYWtlUnVudGltZSgpIGFzIE1hbmFnZWRSdW50aW1lLk1hbmFnZWRSdW50aW1lPGFueSwgbmV2ZXI+XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBKc29uVmFsdWUgfSBmcm9tICcuLi9qc29uVmFsdWUuanMnXG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSB9IGZyb20gJy4uLy4uL3J1bnRpbWUvY29yZS9lcnJvclN1bW1hcnkuanMnXG5cbmV4cG9ydCB0eXBlIEFydGlmYWN0S2V5ID0gc3RyaW5nXG5cbmV4cG9ydCBjb25zdCBhcnRpZmFjdEtleVNjaGVtYVBhdHRlcm4gPSAnXkBbXlxcXFxzL10rXFxcXC9bXlxcXFxzQF0rQHZcXFxcZCskJyBhcyBjb25zdFxuXG5leHBvcnQgY29uc3QgaXNBcnRpZmFjdEtleSA9IChpbnB1dDogdW5rbm93bik6IGlucHV0IGlzIEFydGlmYWN0S2V5ID0+XG4gIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgJiYgL15AW15cXHMvXStcXC9bXlxcc0BdK0B2XFxkKyQvLnRlc3QoaW5wdXQpXG5cbnR5cGUgRW52ZWxvcGVCYXNlID0ge1xuICByZWFkb25seSBhcnRpZmFjdEtleTogQXJ0aWZhY3RLZXlcbiAgcmVhZG9ubHkgdHJ1bmNhdGVkPzogYm9vbGVhblxuICByZWFkb25seSBidWRnZXRCeXRlcz86IG51bWJlclxuICByZWFkb25seSBhY3R1YWxCeXRlcz86IG51bWJlclxuICByZWFkb25seSBkaWdlc3Q/OiBzdHJpbmdcbiAgcmVhZG9ubHkgbm90ZXM/OiBKc29uVmFsdWVcbn1cblxuZXhwb3J0IHR5cGUgQXJ0aWZhY3RFbnZlbG9wZSA9XG4gIHwgKEVudmVsb3BlQmFzZSAmIHtcbiAgICAgIHJlYWRvbmx5IG9rOiB0cnVlXG4gICAgICByZWFkb25seSB2YWx1ZTogSnNvblZhbHVlXG4gICAgICByZWFkb25seSBlcnJvcj86IG5ldmVyXG4gICAgfSlcbiAgfCAoRW52ZWxvcGVCYXNlICYge1xuICAgICAgcmVhZG9ubHkgb2s6IGZhbHNlXG4gICAgICByZWFkb25seSBlcnJvcjogU2VyaWFsaXphYmxlRXJyb3JTdW1tYXJ5XG4gICAgICByZWFkb25seSB2YWx1ZT86IG5ldmVyXG4gICAgfSlcblxuZXhwb3J0IHR5cGUgVHJpYWxSdW5BcnRpZmFjdHMgPSBSZWFkb25seTxSZWNvcmQ8QXJ0aWZhY3RLZXksIEFydGlmYWN0RW52ZWxvcGU+PlxuIiwgImltcG9ydCB7IGZudjFhMzIsIHN0YWJsZVN0cmluZ2lmeSB9IGZyb20gJy4uLy4uL2RpZ2VzdC5qcydcbmltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAnLi4vanNvblZhbHVlLmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIEpzb25WYWx1ZURpZ2VzdCB7XG4gIHJlYWRvbmx5IHN0YWJsZUpzb246IHN0cmluZ1xuICByZWFkb25seSBieXRlczogbnVtYmVyXG4gIHJlYWRvbmx5IGRpZ2VzdDogc3RyaW5nXG59XG5cbmNvbnN0IHV0ZjhCeXRlTGVuZ3RoU3RyaW5nID0gKHRleHQ6IHN0cmluZyk6IG51bWJlciA9PiB7XG4gIGlmICh0eXBlb2YgVGV4dEVuY29kZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0ZXh0KS5sZW5ndGhcbiAgfVxuICByZXR1cm4gdGV4dC5sZW5ndGhcbn1cblxuZXhwb3J0IGNvbnN0IGRpZ2VzdEpzb25WYWx1ZSA9ICh2YWx1ZTogSnNvblZhbHVlKTogSnNvblZhbHVlRGlnZXN0ID0+IHtcbiAgY29uc3Qgc3RhYmxlSnNvbiA9IHN0YWJsZVN0cmluZ2lmeSh2YWx1ZSlcbiAgY29uc3QgYnl0ZXMgPSB1dGY4Qnl0ZUxlbmd0aFN0cmluZyhzdGFibGVKc29uKVxuICByZXR1cm4ge1xuICAgIHN0YWJsZUpzb24sXG4gICAgYnl0ZXMsXG4gICAgZGlnZXN0OiBgYXJ0aWZhY3Q6MDMxOiR7Zm52MWEzMihzdGFibGVKc29uKX1gLFxuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi8uLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0IHsgdG9TZXJpYWxpemFibGVFcnJvclN1bW1hcnkgfSBmcm9tICcuLi8uLi9ydW50aW1lL2NvcmUvZXJyb3JTdW1tYXJ5LmpzJ1xuaW1wb3J0IHsgaXNKc29uVmFsdWUsIHR5cGUgSnNvblZhbHVlIH0gZnJvbSAnLi4vanNvblZhbHVlLmpzJ1xuaW1wb3J0IHR5cGUgeyBBcnRpZmFjdEVudmVsb3BlLCBBcnRpZmFjdEtleSwgVHJpYWxSdW5BcnRpZmFjdHMgfSBmcm9tICcuL21vZGVsLmpzJ1xuaW1wb3J0IHsgaXNBcnRpZmFjdEtleSB9IGZyb20gJy4vbW9kZWwuanMnXG5pbXBvcnQgdHlwZSB7IFRyaWFsUnVuQXJ0aWZhY3RFeHBvcnRlciwgVHJpYWxSdW5BcnRpZmFjdEluc3BlY3Rpb25Db250ZXh0IH0gZnJvbSAnLi9leHBvcnRlci5qcydcbmltcG9ydCB7IGRpZ2VzdEpzb25WYWx1ZSB9IGZyb20gJy4vZGlnZXN0LmpzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyaWFsUnVuQXJ0aWZhY3RzQnVkZ2V0cyB7XG4gIC8qKlxuICAgKiBQZXItYXJ0aWZhY3QgbWF4aW11bSBzZXJpYWxpemVkIGJ5dGVzIChVVEYtOCkuXG4gICAqIERlZmF1bHQ6IDUwS0IuXG4gICAqL1xuICByZWFkb25seSBtYXhCeXRlcz86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3RUcmlhbFJ1bkFydGlmYWN0c09wdGlvbnMge1xuICByZWFkb25seSBleHBvcnRlcnM6IFJlYWRvbmx5QXJyYXk8VHJpYWxSdW5BcnRpZmFjdEV4cG9ydGVyPlxuICByZWFkb25seSBjdHg6IFRyaWFsUnVuQXJ0aWZhY3RJbnNwZWN0aW9uQ29udGV4dFxuICByZWFkb25seSBidWRnZXRzPzogVHJpYWxSdW5BcnRpZmFjdHNCdWRnZXRzXG59XG5cbmNvbnN0IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUgPSAoY2F1c2U6IHVua25vd24sIGNvZGU6IHN0cmluZywgaGludD86IHN0cmluZyk6IFNlcmlhbGl6YWJsZUVycm9yU3VtbWFyeSA9PiB7XG4gIGNvbnN0IGJhc2UgPSB0b1NlcmlhbGl6YWJsZUVycm9yU3VtbWFyeShjYXVzZSkuZXJyb3JTdW1tYXJ5XG4gIHJldHVybiB7XG4gICAgbmFtZTogYmFzZS5uYW1lLFxuICAgIG1lc3NhZ2U6IGJhc2UubWVzc2FnZSxcbiAgICBjb2RlLFxuICAgIGhpbnQ6IGhpbnQgPz8gYmFzZS5oaW50LFxuICB9XG59XG5cbmNvbnN0IGRlZmF1bHRBcnRpZmFjdEJ1ZGdldEJ5dGVzID0gNTAgKiAxMDI0XG5cbmNvbnN0IGJ1ZGdldE9mID0gKGJ1ZGdldHM6IFRyaWFsUnVuQXJ0aWZhY3RzQnVkZ2V0cyB8IHVuZGVmaW5lZCk6IG51bWJlciA9PlxuICB0eXBlb2YgYnVkZ2V0cz8ubWF4Qnl0ZXMgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZShidWRnZXRzLm1heEJ5dGVzKSAmJiBidWRnZXRzLm1heEJ5dGVzID4gMFxuICAgID8gYnVkZ2V0cy5tYXhCeXRlc1xuICAgIDogZGVmYXVsdEFydGlmYWN0QnVkZ2V0Qnl0ZXNcblxudHlwZSBDb2xsZWN0ZWQgPSB7XG4gIHJlYWRvbmx5IGFydGlmYWN0S2V5OiBBcnRpZmFjdEtleVxuICByZWFkb25seSBlbnZlbG9wZTogQXJ0aWZhY3RFbnZlbG9wZVxufVxuXG5jb25zdCBtYWtlQ29uZmxpY3RFbnZlbG9wZSA9IChhcnRpZmFjdEtleTogQXJ0aWZhY3RLZXksIGV4cG9ydGVySWRzOiBSZWFkb25seUFycmF5PHN0cmluZz4pOiBDb2xsZWN0ZWQgPT4ge1xuICBjb25zdCBpZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoZXhwb3J0ZXJJZHMubWFwKChzKSA9PiBTdHJpbmcocykpLmZpbHRlcigocykgPT4gcy5sZW5ndGggPiAwKSkpLnNvcnQoKVxuICByZXR1cm4ge1xuICAgIGFydGlmYWN0S2V5LFxuICAgIGVudmVsb3BlOiB7XG4gICAgICBhcnRpZmFjdEtleSxcbiAgICAgIG9rOiBmYWxzZSxcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIG5hbWU6ICdBcnRpZmFjdEtleUNvbmZsaWN0RXJyb3InLFxuICAgICAgICBtZXNzYWdlOiBgW0xvZ2l4XSBUcmlhbFJ1biBhcnRpZmFjdCBrZXkgY29uZmxpY3Q6ICR7YXJ0aWZhY3RLZXl9YCxcbiAgICAgICAgY29kZTogJ0FydGlmYWN0S2V5Q29uZmxpY3QnLFxuICAgICAgICBoaW50OiBpZHMubGVuZ3RoID4gMCA/IGBjb25mbGljdGluZ0V4cG9ydGVycz0ke2lkcy5qb2luKCcsJyl9YCA6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfSxcbiAgfVxufVxuXG5jb25zdCB0cnVuY2F0ZUpzb25WYWx1ZSA9IChcbiAgdmFsdWU6IEpzb25WYWx1ZSxcbiAgbWF4Qnl0ZXM6IG51bWJlcixcbik6IHsgcmVhZG9ubHkgdmFsdWU6IEpzb25WYWx1ZTsgcmVhZG9ubHkgYWN0dWFsQnl0ZXM6IG51bWJlcjsgcmVhZG9ubHkgZGlnZXN0OiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IGFuYWx5emVkID0gZGlnZXN0SnNvblZhbHVlKHZhbHVlKVxuICBjb25zdCBqc29uID0gYW5hbHl6ZWQuc3RhYmxlSnNvblxuICBjb25zdCBieXRlcyA9IGFuYWx5emVkLmJ5dGVzXG4gIGlmIChieXRlcyA8PSBtYXhCeXRlcykge1xuICAgIHJldHVybiB7IHZhbHVlLCBhY3R1YWxCeXRlczogYnl0ZXMsIGRpZ2VzdDogYW5hbHl6ZWQuZGlnZXN0IH1cbiAgfVxuXG4gIGNvbnN0IHByZXZpZXdDaGFycyA9IE1hdGgubWluKGpzb24ubGVuZ3RoLCBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTYsIG1heEJ5dGVzKSkpXG4gIGNvbnN0IHByZXZpZXcgPSBqc29uLnNsaWNlKDAsIHByZXZpZXdDaGFycylcbiAgcmV0dXJuIHtcbiAgICB2YWx1ZToge1xuICAgICAgX3RhZzogJ292ZXJzaXplZCcsXG4gICAgICBieXRlcyxcbiAgICAgIHByZXZpZXcsXG4gICAgfSxcbiAgICBhY3R1YWxCeXRlczogYnl0ZXMsXG4gICAgZGlnZXN0OiBhbmFseXplZC5kaWdlc3QsXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbGxlY3RUcmlhbFJ1bkFydGlmYWN0cyA9IChvcHRpb25zOiBDb2xsZWN0VHJpYWxSdW5BcnRpZmFjdHNPcHRpb25zKTogVHJpYWxSdW5BcnRpZmFjdHMgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBleHBvcnRlcnNTb3J0ZWQgPSBBcnJheS5mcm9tKG9wdGlvbnMuZXhwb3J0ZXJzKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qga2EgPSBTdHJpbmcoYT8uYXJ0aWZhY3RLZXkgPz8gJycpXG4gICAgY29uc3Qga2IgPSBTdHJpbmcoYj8uYXJ0aWZhY3RLZXkgPz8gJycpXG4gICAgaWYgKGthIDwga2IpIHJldHVybiAtMVxuICAgIGlmIChrYSA+IGtiKSByZXR1cm4gMVxuICAgIGNvbnN0IGlhID0gU3RyaW5nKGE/LmV4cG9ydGVySWQgPz8gJycpXG4gICAgY29uc3QgaWIgPSBTdHJpbmcoYj8uZXhwb3J0ZXJJZCA/PyAnJylcbiAgICByZXR1cm4gaWEgPCBpYiA/IC0xIDogaWEgPiBpYiA/IDEgOiAwXG4gIH0pXG5cbiAgY29uc3QgY29uZmxpY3RzID0gbmV3IE1hcDxBcnRpZmFjdEtleSwgQXJyYXk8c3RyaW5nPj4oKVxuICBmb3IgKGNvbnN0IGV4IG9mIGV4cG9ydGVyc1NvcnRlZCkge1xuICAgIGNvbnN0IGtleSA9IGV4Py5hcnRpZmFjdEtleVxuICAgIGNvbnN0IGlkID0gU3RyaW5nKGV4Py5leHBvcnRlcklkID8/ICcnKVxuICAgIGlmICghaXNBcnRpZmFjdEtleShrZXkpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBjb25zdCBjdXJyZW50ID0gY29uZmxpY3RzLmdldChrZXkpXG4gICAgaWYgKGN1cnJlbnQpIGN1cnJlbnQucHVzaChpZClcbiAgICBlbHNlIGNvbmZsaWN0cy5zZXQoa2V5LCBbaWRdKVxuICB9XG5cbiAgY29uc3QgY29uZmxpY3RLZXlzID0gbmV3IFNldDxBcnRpZmFjdEtleT4oKVxuICBmb3IgKGNvbnN0IFtrLCBpZHNdIG9mIGNvbmZsaWN0cykge1xuICAgIGNvbnN0IHVuaXF1ZSA9IEFycmF5LmZyb20obmV3IFNldChpZHMpKVxuICAgIGlmICh1bmlxdWUubGVuZ3RoID4gMSkge1xuICAgICAgY29uZmxpY3RLZXlzLmFkZChrKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1heEJ5dGVzID0gYnVkZ2V0T2Yob3B0aW9ucy5idWRnZXRzKVxuICBjb25zdCBjb2xsZWN0ZWQ6IEFycmF5PENvbGxlY3RlZD4gPSBbXVxuXG4gIGZvciAoY29uc3QgZXhwb3J0ZXIgb2YgZXhwb3J0ZXJzU29ydGVkKSB7XG4gICAgY29uc3QgYXJ0aWZhY3RLZXkgPSBleHBvcnRlcj8uYXJ0aWZhY3RLZXlcbiAgICBpZiAoIWlzQXJ0aWZhY3RLZXkoYXJ0aWZhY3RLZXkpKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoY29uZmxpY3RLZXlzLmhhcyhhcnRpZmFjdEtleSkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZXhwb3J0ZXIuZXhwb3J0KG9wdGlvbnMuY3R4KVxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICBpZiAoIWlzSnNvblZhbHVlKHZhbHVlKSkge1xuICAgICAgICBjb2xsZWN0ZWQucHVzaCh7XG4gICAgICAgICAgYXJ0aWZhY3RLZXksXG4gICAgICAgICAgZW52ZWxvcGU6IHtcbiAgICAgICAgICAgIGFydGlmYWN0S2V5LFxuICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3I6IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUoXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihgW0xvZ2l4XSBBcnRpZmFjdCBleHBvcnRlciByZXR1cm5lZCBub24tSnNvblZhbHVlOiAke2V4cG9ydGVyLmV4cG9ydGVySWR9YCksXG4gICAgICAgICAgICAgICdBcnRpZmFjdE5vblNlcmlhbGl6YWJsZScsXG4gICAgICAgICAgICAgIGBhcnRpZmFjdEtleT0ke2FydGlmYWN0S2V5fSBleHBvcnRlcklkPSR7ZXhwb3J0ZXIuZXhwb3J0ZXJJZH1gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cnVuY2F0ZWQgPSB0cnVuY2F0ZUpzb25WYWx1ZSh2YWx1ZSwgbWF4Qnl0ZXMpXG4gICAgICBjb25zdCBlbnZlbG9wZTogQXJ0aWZhY3RFbnZlbG9wZSA9IHtcbiAgICAgICAgYXJ0aWZhY3RLZXksXG4gICAgICAgIG9rOiB0cnVlLFxuICAgICAgICB2YWx1ZTogdHJ1bmNhdGVkLnZhbHVlLFxuICAgICAgICBkaWdlc3Q6IHRydW5jYXRlZC5kaWdlc3QsXG4gICAgICAgIC4uLih0cnVuY2F0ZWQuYWN0dWFsQnl0ZXMgPiBtYXhCeXRlc1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICB0cnVuY2F0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgIGJ1ZGdldEJ5dGVzOiBtYXhCeXRlcyxcbiAgICAgICAgICAgICAgYWN0dWFsQnl0ZXM6IHRydW5jYXRlZC5hY3R1YWxCeXRlcyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgYnVkZ2V0Qnl0ZXM6IG1heEJ5dGVzLFxuICAgICAgICAgICAgICBhY3R1YWxCeXRlczogdHJ1bmNhdGVkLmFjdHVhbEJ5dGVzLFxuICAgICAgICAgICAgfSksXG4gICAgICB9XG5cbiAgICAgIGNvbGxlY3RlZC5wdXNoKHsgYXJ0aWZhY3RLZXksIGVudmVsb3BlIH0pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29sbGVjdGVkLnB1c2goe1xuICAgICAgICBhcnRpZmFjdEtleSxcbiAgICAgICAgZW52ZWxvcGU6IHtcbiAgICAgICAgICBhcnRpZmFjdEtleSxcbiAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHRvRXJyb3JTdW1tYXJ5V2l0aENvZGUoXG4gICAgICAgICAgICBlLFxuICAgICAgICAgICAgJ0FydGlmYWN0RXhwb3J0RmFpbGVkJyxcbiAgICAgICAgICAgIGBhcnRpZmFjdEtleT0ke2FydGlmYWN0S2V5fSBleHBvcnRlcklkPSR7ZXhwb3J0ZXIuZXhwb3J0ZXJJZH1gLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgY29uZmxpY3RLZXkgb2YgQXJyYXkuZnJvbShjb25mbGljdEtleXMpLnNvcnQoKSkge1xuICAgIGNvbGxlY3RlZC5wdXNoKG1ha2VDb25mbGljdEVudmVsb3BlKGNvbmZsaWN0S2V5LCBjb25mbGljdHMuZ2V0KGNvbmZsaWN0S2V5KSA/PyBbXSkpXG4gIH1cblxuICBpZiAoY29sbGVjdGVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbGxlY3RlZC5zb3J0KChhLCBiKSA9PiAoYS5hcnRpZmFjdEtleSA8IGIuYXJ0aWZhY3RLZXkgPyAtMSA6IGEuYXJ0aWZhY3RLZXkgPiBiLmFydGlmYWN0S2V5ID8gMSA6IDApKVxuXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoY29sbGVjdGVkLm1hcCgoYykgPT4gW2MuYXJ0aWZhY3RLZXksIGMuZW52ZWxvcGVdKSkgc2F0aXNmaWVzIFRyaWFsUnVuQXJ0aWZhY3RzXG59XG4iLCAiaW1wb3J0IHsgRWZmZWN0LCBFeGl0LCBMYXllciwgU2NvcGUgfSBmcm9tICdlZmZlY3QnXG5pbXBvcnQgdHlwZSB7IEV2aWRlbmNlUGFja2FnZSwgRXZpZGVuY2VQYWNrYWdlU291cmNlIH0gZnJvbSAnLi9ldmlkZW5jZS5qcydcbmltcG9ydCB7IG1ha2VFdmlkZW5jZUNvbGxlY3RvciwgZXZpZGVuY2VDb2xsZWN0b3JMYXllciB9IGZyb20gJy4vZXZpZGVuY2VDb2xsZWN0b3IuanMnXG5pbXBvcnQgeyBtYWtlUnVuU2Vzc2lvbiwgcnVuU2Vzc2lvbkxheWVyLCB0eXBlIFJ1blNlc3Npb24sIHR5cGUgUnVuSWQgfSBmcm9tICcuL3J1blNlc3Npb24uanMnXG5pbXBvcnQge1xuICBhcHBlbmRTaW5rcyxcbiAgZGlhZ25vc3RpY3NMZXZlbCxcbiAgdHlwZSBEaWFnbm9zdGljc0xldmVsLFxuICB0eXBlIFNpbmsgYXMgRGVidWdTaW5rLFxufSBmcm9tICcuLi9ydW50aW1lL2NvcmUvRGVidWdTaW5rLmpzJ1xuaW1wb3J0ICogYXMgUnVudGltZUtlcm5lbCBmcm9tICcuLi9ydW50aW1lL2NvcmUvUnVudGltZUtlcm5lbC5qcydcbmltcG9ydCB0eXBlIHsgQ29udmVyZ2VTdGF0aWNJckNvbGxlY3RvciB9IGZyb20gJy4uL3J1bnRpbWUvY29yZS9Db252ZXJnZVN0YXRpY0lyQ29sbGVjdG9yLmpzJ1xuaW1wb3J0IHsgYXBwZW5kQ29udmVyZ2VTdGF0aWNJckNvbGxlY3RvcnMgfSBmcm9tICcuLi9ydW50aW1lL2NvcmUvQ29udmVyZ2VTdGF0aWNJckNvbGxlY3Rvci5qcydcbmV4cG9ydCAqIGZyb20gJy4vdHJpYWxSdW5Nb2R1bGUuanMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJpYWxSdW5PcHRpb25zIHtcbiAgcmVhZG9ubHkgcnVuSWQ/OiBSdW5JZFxuICByZWFkb25seSBzb3VyY2U/OiBFdmlkZW5jZVBhY2thZ2VTb3VyY2VcbiAgcmVhZG9ubHkgc3RhcnRlZEF0PzogbnVtYmVyXG4gIHJlYWRvbmx5IGRpYWdub3N0aWNzTGV2ZWw/OiBEaWFnbm9zdGljc0xldmVsXG4gIHJlYWRvbmx5IG1heEV2ZW50cz86IG51bWJlclxuICByZWFkb25seSBsYXllcj86IExheWVyLkxheWVyPGFueSwgYW55LCBhbnk+XG4gIHJlYWRvbmx5IHJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzPzogUnVudGltZUtlcm5lbC5SdW50aW1lU2VydmljZXNPdmVycmlkZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmlhbFJ1blJlc3VsdDxBLCBFPiB7XG4gIHJlYWRvbmx5IHNlc3Npb246IFJ1blNlc3Npb25cbiAgcmVhZG9ubHkgZXhpdDogRXhpdC5FeGl0PEEsIEU+XG4gIHJlYWRvbmx5IGV2aWRlbmNlOiBFdmlkZW5jZVBhY2thZ2Vcbn1cblxuY29uc3QgZGVmYXVsdEhvc3QgPSAoKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiAnYnJvd3NlcidcbiAgcmV0dXJuICdub2RlJ1xufVxuXG5leHBvcnQgY29uc3QgdHJpYWxSdW4gPSA8QSwgRSwgUj4oXG4gIHByb2dyYW06IEVmZmVjdC5FZmZlY3Q8QSwgRSwgUj4sXG4gIG9wdGlvbnM/OiBUcmlhbFJ1bk9wdGlvbnMsXG4pOiBFZmZlY3QuRWZmZWN0PFRyaWFsUnVuUmVzdWx0PEEsIEU+LCBuZXZlciwgUj4gPT5cbiAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgIGNvbnN0IHNlc3Npb24gPSBtYWtlUnVuU2Vzc2lvbih7XG4gICAgICBydW5JZDogb3B0aW9ucz8ucnVuSWQsXG4gICAgICBzb3VyY2U6IG9wdGlvbnM/LnNvdXJjZSA/PyB7IGhvc3Q6IGRlZmF1bHRIb3N0KCksIGxhYmVsOiAndHJpYWwtcnVuJyB9LFxuICAgICAgc3RhcnRlZEF0OiBvcHRpb25zPy5zdGFydGVkQXQsXG4gICAgfSlcblxuICAgIGNvbnN0IGNvbGxlY3RvciA9IG1ha2VFdmlkZW5jZUNvbGxlY3RvcihzZXNzaW9uKVxuXG4gICAgY29uc3QgY29udmVyZ2VDb2xsZWN0b3I6IENvbnZlcmdlU3RhdGljSXJDb2xsZWN0b3IgPSB7XG4gICAgICByZWdpc3RlcjogKGlyKSA9PiB7XG4gICAgICAgIGNvbGxlY3Rvci5yZWdpc3RlckNvbnZlcmdlU3RhdGljSXIoaXIpXG4gICAgICB9LFxuICAgIH1cblxuICAgIGNvbnN0IHNpbmtzTGF5ZXIgPSBhcHBlbmRTaW5rcyhbY29sbGVjdG9yLmRlYnVnU2luayBhcyB1bmtub3duIGFzIERlYnVnU2lua10pXG4gICAgY29uc3QgZGlhZ25vc3RpY3NMYXllciA9IGRpYWdub3N0aWNzTGV2ZWwob3B0aW9ucz8uZGlhZ25vc3RpY3NMZXZlbCA/PyAnbGlnaHQnKVxuICAgIGNvbnN0IGNvbnZlcmdlTGF5ZXIgPSBhcHBlbmRDb252ZXJnZVN0YXRpY0lyQ29sbGVjdG9ycyhbY29udmVyZ2VDb2xsZWN0b3JdKVxuICAgIGNvbnN0IGNvbGxlY3RvckxheWVyID0gZXZpZGVuY2VDb2xsZWN0b3JMYXllcihjb2xsZWN0b3IpXG4gICAgY29uc3Qgc2Vzc2lvbkxheWVyID0gcnVuU2Vzc2lvbkxheWVyKHNlc3Npb24pXG5cbiAgICBjb25zdCBvdmVycmlkZXNMYXllciA9XG4gICAgICBvcHRpb25zPy5ydW50aW1lU2VydmljZXNJbnN0YW5jZU92ZXJyaWRlcyAhPSBudWxsXG4gICAgICAgID8gKExheWVyLnN1Y2NlZWQoXG4gICAgICAgICAgICBSdW50aW1lS2VybmVsLlJ1bnRpbWVTZXJ2aWNlc0luc3RhbmNlT3ZlcnJpZGVzVGFnLFxuICAgICAgICAgICAgb3B0aW9ucy5ydW50aW1lU2VydmljZXNJbnN0YW5jZU92ZXJyaWRlcyxcbiAgICAgICAgICApIGFzIExheWVyLkxheWVyPGFueSwgbmV2ZXIsIG5ldmVyPilcbiAgICAgICAgOiAoTGF5ZXIuZW1wdHkgYXMgTGF5ZXIuTGF5ZXI8YW55LCBuZXZlciwgbmV2ZXI+KVxuXG4gICAgY29uc3QgdHJpYWxMYXllciA9IExheWVyLm1lcmdlQWxsKFxuICAgICAgb3B0aW9ucz8ubGF5ZXIgPz8gKExheWVyLmVtcHR5IGFzIHVua25vd24gYXMgTGF5ZXIuTGF5ZXI8YW55LCBhbnksIGFueT4pLFxuICAgICAgc2Vzc2lvbkxheWVyLFxuICAgICAgY29sbGVjdG9yTGF5ZXIsXG4gICAgICBvdmVycmlkZXNMYXllcixcbiAgICAgIGRpYWdub3N0aWNzTGF5ZXIsXG4gICAgICBzaW5rc0xheWVyLFxuICAgICAgY29udmVyZ2VMYXllcixcbiAgICApIGFzIExheWVyLkxheWVyPGFueSwgbmV2ZXIsIGFueT5cblxuICAgIGNvbnN0IHNjb3BlID0geWllbGQqIFNjb3BlLm1ha2UoKVxuXG4gICAgY29uc3QgZXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdChwcm9ncmFtKS5waXBlKEVmZmVjdC5wcm92aWRlU2VydmljZShTY29wZS5TY29wZSwgc2NvcGUpLCBFZmZlY3QucHJvdmlkZSh0cmlhbExheWVyKSlcblxuICAgIHlpZWxkKiBTY29wZS5jbG9zZShzY29wZSwgZXhpdClcblxuICAgIGNvbnN0IGV2aWRlbmNlID0gY29sbGVjdG9yLmV4cG9ydEV2aWRlbmNlUGFja2FnZSh7XG4gICAgICBtYXhFdmVudHM6IG9wdGlvbnM/Lm1heEV2ZW50cyxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHsgc2Vzc2lvbiwgZXhpdCwgZXZpZGVuY2UgfSBzYXRpc2ZpZXMgVHJpYWxSdW5SZXN1bHQ8QSwgRT5cbiAgfSlcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQSxJQUFNLFdBQVcsQ0FBQyxVQUNoQixPQUFPLFVBQVUsWUFBWSxVQUFVLFFBQVEsQ0FBQyxNQUFNLFFBQVEsS0FBSztBQUVyRSxJQUFNLGVBQWUsQ0FBQyxVQUNwQixTQUFTLEtBQUssS0FBSyxNQUFNLFNBQVMsZ0JBQWdCLFNBQVMsTUFBTSxNQUFNO0FBRXpFLElBQU0sa0JBQWtCLENBQUMsVUFBMkI7QUFDbEQsTUFBSSxhQUFhLEtBQUssR0FBRztBQUN2QixVQUFNLEtBQU0sTUFBTSxPQUFlO0FBQ2pDLFdBQU8sT0FBTyxPQUFPLFlBQVksR0FBRyxTQUFTLElBQUksS0FBSztBQUFBLEVBQ3hEO0FBRUEsTUFBSSxTQUFTLEtBQUssR0FBRztBQUNuQixVQUFNLEtBQUssTUFBTTtBQUNqQixRQUFJLE9BQU8sT0FBTyxZQUFZLEdBQUcsU0FBUyxFQUFHLFFBQU87QUFDcEQsVUFBTSxNQUFPLE1BQWM7QUFDM0IsUUFBSSxRQUFRLE9BQU8sUUFBUSxZQUFZLE9BQU8sUUFBUSxhQUFhO0FBQ2pFLFlBQU0sUUFBUyxJQUFZO0FBQzNCLFVBQUksT0FBTyxVQUFVLFlBQVksTUFBTSxTQUFTLEVBQUcsUUFBTztBQUFBLElBQzVEO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQUVBLElBQU0sbUJBQW1CLENBQUMsVUFBNEI7QUFDcEQsTUFBSSxhQUFhLEtBQUssRUFBRyxRQUFPLE1BQU07QUFDdEMsTUFBSSxTQUFTLEtBQUssS0FBTSxNQUFjLElBQUssUUFBUSxNQUFjO0FBQ2pFLFNBQU87QUFDVDtBQUVPLElBQU1BLGtCQUFpQixDQUFDLFdBQTBDO0FBQ3ZFLFFBQU0sTUFBTSxpQkFBaUIsTUFBTTtBQUNuQyxNQUFJLENBQUMsSUFBSyxRQUFPO0FBRWpC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QU8sZUFBZSxNQUFNLE9BQU8sS0FBSyxHQUFHQSxRQUFPLFFBQVEsVUFBVSxDQUFDO0FBRW5ILFNBQU8sTUFBTSxNQUFNLE9BQU8sSUFBSTtBQUU5QixRQUFNLFdBQVcsVUFBVSxzQkFBc0I7QUFBQSxJQUMvQyxXQUFXLFNBQVM7QUFBQSxFQUN0QixDQUFDO0FBRUQsU0FBTyxFQUFFLFNBQVMsTUFBTSxTQUFTO0FBQ25DLENBQUM7IiwKICAibmFtZXMiOiBbImV4cG9ydFN0YXRpY0lyIiwgImlzUmVjb3JkIiwgImlzTW9kdWxlSW1wbCIsICJyZXNvbHZlTW9kdWxlSWQiLCAibmV4dCIsICJleHBvcnRTdGF0aWNJciIsICJDYXVzZSIsICJFZmZlY3QiLCAiTGF5ZXIiLCAiRWZmZWN0IiwgIkxheWVyIiwgImxheWVyIiwgIkxheWVyIiwgIkxheWVyIiwgIm1ha2UiLCAiTGF5ZXIiLCAiaXNSZWNvcmQiLCAidXRmOEJ5dGVMZW5ndGgiLCAiQ2F1c2UiLCAidG9FcnJvclN1bW1hcnlXaXRoQ29kZSIsICJFZmZlY3QiLCAibGF5ZXIiLCAiTGF5ZXIiLCAibWFrZSIsICJleHBvcnRTdGF0aWNJciIsICJFZmZlY3QiLCAiTGF5ZXIiLCAiZGVmYXVsdEhvc3QiLCAiRWZmZWN0IiwgIkxheWVyIl0KfQo=
|