@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,703 @@
|
|
|
1
|
+
// @logixjs/core subpath bundles for @logixjs/sandbox
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
isJsonValue,
|
|
5
|
+
projectJsonValue
|
|
6
|
+
} from "./chunk-SI5OKFFY.js";
|
|
7
|
+
import {
|
|
8
|
+
fnv1a32,
|
|
9
|
+
stableStringify
|
|
10
|
+
} from "./chunk-DT7YIIWE.js";
|
|
11
|
+
|
|
12
|
+
// ../logix-core/src/internal/workflow/errors.ts
|
|
13
|
+
var toJsonValue = (detail) => {
|
|
14
|
+
if (isJsonValue(detail)) return detail;
|
|
15
|
+
return projectJsonValue(detail).value;
|
|
16
|
+
};
|
|
17
|
+
var makeWorkflowError = (args) => {
|
|
18
|
+
const detailJson = args.detail !== void 0 ? toJsonValue(args.detail) : void 0;
|
|
19
|
+
const msg = args.detail !== void 0 ? `${args.message}
|
|
20
|
+
(detail=${stableStringify(detailJson)})` : args.message;
|
|
21
|
+
return Object.assign(new Error(msg), {
|
|
22
|
+
_tag: "WorkflowError",
|
|
23
|
+
code: args.code,
|
|
24
|
+
programId: args.programId,
|
|
25
|
+
source: args.source,
|
|
26
|
+
detail: detailJson
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// ../logix-core/src/internal/workflow/inputExpr.ts
|
|
31
|
+
var decodePointerToken = (raw) => raw.replace(/~1/g, "/").replace(/~0/g, "~");
|
|
32
|
+
var isIndexToken = (token) => token === "0" || !token.startsWith("0") && /^\d+$/.test(token);
|
|
33
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
34
|
+
var parseJsonPointer = (pointer) => {
|
|
35
|
+
if (pointer === "") return [];
|
|
36
|
+
if (!pointer.startsWith("/")) {
|
|
37
|
+
throw makeWorkflowError({
|
|
38
|
+
code: "WORKFLOW_INVALID_JSON_POINTER",
|
|
39
|
+
message: 'Invalid JSON Pointer (must be "" or start with "/").',
|
|
40
|
+
detail: { pointer }
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
const raw = pointer.split("/").slice(1);
|
|
44
|
+
const out = [];
|
|
45
|
+
for (const part of raw) {
|
|
46
|
+
const decoded = decodePointerToken(part);
|
|
47
|
+
out.push(isIndexToken(decoded) ? Number(decoded) : decoded);
|
|
48
|
+
}
|
|
49
|
+
return out;
|
|
50
|
+
};
|
|
51
|
+
var compileInputExpr = (expr, pathForError) => {
|
|
52
|
+
switch (expr.kind) {
|
|
53
|
+
case "payload":
|
|
54
|
+
return { kind: "payload" };
|
|
55
|
+
case "payload.path": {
|
|
56
|
+
const pointer = expr.pointer;
|
|
57
|
+
if (typeof pointer !== "string") {
|
|
58
|
+
throw makeWorkflowError({
|
|
59
|
+
code: "WORKFLOW_INVALID_INPUT_EXPR",
|
|
60
|
+
message: "InputExpr.payload.path.pointer must be a string.",
|
|
61
|
+
source: { stepKey: pathForError?.stepKey },
|
|
62
|
+
detail: { pointer }
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return { kind: "payload.path", pointer, tokens: parseJsonPointer(pointer) };
|
|
66
|
+
}
|
|
67
|
+
case "const": {
|
|
68
|
+
const value = expr.value;
|
|
69
|
+
if (!isJsonValue(value)) {
|
|
70
|
+
throw makeWorkflowError({
|
|
71
|
+
code: "WORKFLOW_INVALID_INPUT_EXPR",
|
|
72
|
+
message: "InputExpr.const.value must be JSON-serializable.",
|
|
73
|
+
source: { stepKey: pathForError?.stepKey },
|
|
74
|
+
detail: { value }
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return { kind: "const", value };
|
|
78
|
+
}
|
|
79
|
+
case "object": {
|
|
80
|
+
const fields = expr.fields;
|
|
81
|
+
if (!fields || typeof fields !== "object" || Array.isArray(fields)) {
|
|
82
|
+
throw makeWorkflowError({
|
|
83
|
+
code: "WORKFLOW_INVALID_INPUT_EXPR",
|
|
84
|
+
message: "InputExpr.object.fields must be a record.",
|
|
85
|
+
source: { stepKey: pathForError?.stepKey }
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const entries = Object.entries(fields).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
|
|
89
|
+
return {
|
|
90
|
+
kind: "object",
|
|
91
|
+
fields: entries.map(([k, v]) => [k, compileInputExpr(v, pathForError)])
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
case "merge": {
|
|
95
|
+
const items = expr.items;
|
|
96
|
+
if (!Array.isArray(items)) {
|
|
97
|
+
throw makeWorkflowError({
|
|
98
|
+
code: "WORKFLOW_INVALID_INPUT_EXPR",
|
|
99
|
+
message: "InputExpr.merge.items must be an array.",
|
|
100
|
+
source: { stepKey: pathForError?.stepKey }
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
for (const item of items) {
|
|
104
|
+
const kind = isRecord(item) ? item.kind : void 0;
|
|
105
|
+
if (kind !== "object") {
|
|
106
|
+
throw makeWorkflowError({
|
|
107
|
+
code: "WORKFLOW_INVALID_MERGE_ITEMS",
|
|
108
|
+
message: "InputExpr.merge.items must all be InputExpr.object.",
|
|
109
|
+
source: { stepKey: pathForError?.stepKey },
|
|
110
|
+
detail: { kind }
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
kind: "merge",
|
|
116
|
+
items: items.map((i) => compileInputExpr(i, pathForError))
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
var isPlainRecord = (value) => {
|
|
122
|
+
if (typeof value !== "object" || value === null) return false;
|
|
123
|
+
if (Array.isArray(value)) return false;
|
|
124
|
+
const proto = Object.getPrototypeOf(value);
|
|
125
|
+
return proto === Object.prototype || proto === null;
|
|
126
|
+
};
|
|
127
|
+
var evalPointer = (root, tokens) => {
|
|
128
|
+
let current = root;
|
|
129
|
+
for (const token of tokens) {
|
|
130
|
+
if (current == null) return void 0;
|
|
131
|
+
if (Array.isArray(current) && typeof token === "number") {
|
|
132
|
+
current = current[token];
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (typeof current !== "object") return void 0;
|
|
136
|
+
const key = typeof token === "number" ? String(token) : token;
|
|
137
|
+
current = current[key];
|
|
138
|
+
}
|
|
139
|
+
return current;
|
|
140
|
+
};
|
|
141
|
+
var evalInputExpr = (expr, payload) => {
|
|
142
|
+
switch (expr.kind) {
|
|
143
|
+
case "payload":
|
|
144
|
+
return payload;
|
|
145
|
+
case "payload.path":
|
|
146
|
+
return evalPointer(payload, expr.tokens);
|
|
147
|
+
case "const":
|
|
148
|
+
return expr.value;
|
|
149
|
+
case "object": {
|
|
150
|
+
const out = {};
|
|
151
|
+
for (const [k, v] of expr.fields) {
|
|
152
|
+
out[k] = evalInputExpr(v, payload);
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
case "merge": {
|
|
157
|
+
const out = {};
|
|
158
|
+
for (const item of expr.items) {
|
|
159
|
+
const value = evalInputExpr(item, payload);
|
|
160
|
+
if (isPlainRecord(value)) {
|
|
161
|
+
for (const [k, v] of Object.entries(value)) {
|
|
162
|
+
out[k] = v;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return out;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
// ../logix-core/src/internal/workflow/compiler.ts
|
|
172
|
+
var isRecord2 = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
173
|
+
var asNonEmptyString = (value) => typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
|
|
174
|
+
var asNonNegInt = (value) => {
|
|
175
|
+
if (typeof value !== "number" || !Number.isFinite(value)) return void 0;
|
|
176
|
+
const n = Math.floor(value);
|
|
177
|
+
return n >= 0 ? n : void 0;
|
|
178
|
+
};
|
|
179
|
+
var asPosInt = (value) => {
|
|
180
|
+
if (typeof value !== "number" || !Number.isFinite(value)) return void 0;
|
|
181
|
+
const n = Math.floor(value);
|
|
182
|
+
return n > 0 ? n : void 0;
|
|
183
|
+
};
|
|
184
|
+
var normalizeWorkflowDefV1 = (input) => {
|
|
185
|
+
const normalizeStep = (step) => {
|
|
186
|
+
if (!isRecord2(step)) return step;
|
|
187
|
+
if (step.kind !== "call") return step;
|
|
188
|
+
const raw = step;
|
|
189
|
+
const onSuccessRaw = Array.isArray(raw.onSuccess) ? raw.onSuccess : [];
|
|
190
|
+
const onFailureRaw = Array.isArray(raw.onFailure) ? raw.onFailure : [];
|
|
191
|
+
return {
|
|
192
|
+
...step,
|
|
193
|
+
onSuccess: onSuccessRaw.map(normalizeStep),
|
|
194
|
+
onFailure: onFailureRaw.map(normalizeStep)
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
const normalizeSteps = (steps) => steps.map(normalizeStep);
|
|
198
|
+
return {
|
|
199
|
+
...input,
|
|
200
|
+
steps: normalizeSteps(input.steps)
|
|
201
|
+
};
|
|
202
|
+
};
|
|
203
|
+
function validateWorkflowDefV1(def, options) {
|
|
204
|
+
if (!isRecord2(def)) {
|
|
205
|
+
throw makeWorkflowError({
|
|
206
|
+
code: "WORKFLOW_INVALID_DEF",
|
|
207
|
+
message: "WorkflowDef must be an object.",
|
|
208
|
+
detail: { def }
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
if (def.astVersion !== 1) {
|
|
212
|
+
throw makeWorkflowError({
|
|
213
|
+
code: "WORKFLOW_UNSUPPORTED_VERSION",
|
|
214
|
+
message: "Unsupported workflow astVersion.",
|
|
215
|
+
detail: { astVersion: def.astVersion }
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
if (!asNonEmptyString(def.localId)) {
|
|
219
|
+
throw makeWorkflowError({
|
|
220
|
+
code: "WORKFLOW_INVALID_DEF",
|
|
221
|
+
message: "WorkflowDef.localId must be a non-empty string.",
|
|
222
|
+
detail: { localId: def.localId }
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
const trigger = def.trigger;
|
|
226
|
+
if (!isRecord2(trigger)) {
|
|
227
|
+
throw makeWorkflowError({
|
|
228
|
+
code: "WORKFLOW_INVALID_TRIGGER",
|
|
229
|
+
message: "Workflow trigger must be an object.",
|
|
230
|
+
detail: { trigger }
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
if (trigger.kind === "action") {
|
|
234
|
+
if (!asNonEmptyString(trigger.actionTag)) {
|
|
235
|
+
throw makeWorkflowError({
|
|
236
|
+
code: "WORKFLOW_INVALID_TRIGGER",
|
|
237
|
+
message: "Workflow trigger.actionTag must be a non-empty string.",
|
|
238
|
+
detail: { trigger }
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
} else if (trigger.kind === "lifecycle") {
|
|
242
|
+
const phase = trigger.phase;
|
|
243
|
+
if (phase !== "onStart" && phase !== "onInit") {
|
|
244
|
+
throw makeWorkflowError({
|
|
245
|
+
code: "WORKFLOW_INVALID_TRIGGER",
|
|
246
|
+
message: 'Workflow trigger.phase must be "onStart" or "onInit".',
|
|
247
|
+
detail: { trigger }
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
} else {
|
|
251
|
+
throw makeWorkflowError({
|
|
252
|
+
code: "WORKFLOW_INVALID_TRIGGER",
|
|
253
|
+
message: 'Workflow trigger.kind must be "action" or "lifecycle".',
|
|
254
|
+
detail: { trigger }
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
if (!Array.isArray(def.steps)) {
|
|
258
|
+
throw makeWorkflowError({
|
|
259
|
+
code: "WORKFLOW_INVALID_DEF",
|
|
260
|
+
message: "WorkflowDef.steps must be an array.",
|
|
261
|
+
detail: { steps: def.steps }
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
const seenKeys = /* @__PURE__ */ new Set();
|
|
265
|
+
const visit = (step, fragmentId) => {
|
|
266
|
+
if (!isRecord2(step)) {
|
|
267
|
+
throw makeWorkflowError({
|
|
268
|
+
code: "WORKFLOW_INVALID_STEP",
|
|
269
|
+
message: "Workflow step must be an object.",
|
|
270
|
+
detail: { step },
|
|
271
|
+
source: fragmentId ? { fragmentId } : void 0
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
const key = asNonEmptyString(step.key);
|
|
275
|
+
if (!key) {
|
|
276
|
+
throw makeWorkflowError({
|
|
277
|
+
code: "WORKFLOW_INVALID_STEP",
|
|
278
|
+
message: "Workflow step.key must be a non-empty string.",
|
|
279
|
+
detail: { stepKey: step.key, kind: step.kind },
|
|
280
|
+
source: fragmentId ? { fragmentId } : void 0
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
if (seenKeys.has(key)) {
|
|
284
|
+
throw makeWorkflowError({
|
|
285
|
+
code: "WORKFLOW_DUPLICATE_STEP_KEY",
|
|
286
|
+
message: `Duplicate stepKey "${key}" detected.`,
|
|
287
|
+
detail: { duplicateKey: key },
|
|
288
|
+
source: { stepKey: key, ...fragmentId ? { fragmentId } : null }
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
seenKeys.add(key);
|
|
292
|
+
if (step.kind === "dispatch") {
|
|
293
|
+
if (!asNonEmptyString(step.actionTag)) {
|
|
294
|
+
throw makeWorkflowError({
|
|
295
|
+
code: "WORKFLOW_INVALID_STEP",
|
|
296
|
+
message: "dispatch.actionTag must be a non-empty string.",
|
|
297
|
+
source: { stepKey: key, ...fragmentId ? { fragmentId } : null },
|
|
298
|
+
detail: { actionTag: step.actionTag }
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
const payload = step.payload;
|
|
302
|
+
if (payload !== void 0) {
|
|
303
|
+
validateInputExpr(payload, { stepKey: key });
|
|
304
|
+
}
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
if (step.kind === "delay") {
|
|
308
|
+
const ms = asNonNegInt(step.ms);
|
|
309
|
+
if (ms === void 0) {
|
|
310
|
+
throw makeWorkflowError({
|
|
311
|
+
code: "WORKFLOW_INVALID_STEP",
|
|
312
|
+
message: "delay.ms must be a non-negative integer.",
|
|
313
|
+
source: { stepKey: key, ...fragmentId ? { fragmentId } : null },
|
|
314
|
+
detail: { ms: step.ms }
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (step.kind === "call") {
|
|
320
|
+
if (!asNonEmptyString(step.serviceId)) {
|
|
321
|
+
throw makeWorkflowError({
|
|
322
|
+
code: "WORKFLOW_INVALID_SERVICE_ID",
|
|
323
|
+
message: "call.serviceId must be a non-empty string.",
|
|
324
|
+
source: { stepKey: key, ...fragmentId ? { fragmentId } : null },
|
|
325
|
+
detail: { serviceId: step.serviceId }
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
const inputExpr = step.input;
|
|
329
|
+
if (inputExpr !== void 0) {
|
|
330
|
+
validateInputExpr(inputExpr, { stepKey: key });
|
|
331
|
+
}
|
|
332
|
+
const timeoutMsRaw = step.timeoutMs;
|
|
333
|
+
if (timeoutMsRaw !== void 0 && asPosInt(timeoutMsRaw) === void 0) {
|
|
334
|
+
throw makeWorkflowError({
|
|
335
|
+
code: "WORKFLOW_INVALID_STEP",
|
|
336
|
+
message: "call.timeoutMs must be a positive integer (milliseconds).",
|
|
337
|
+
source: { stepKey: key, ...fragmentId ? { fragmentId } : null },
|
|
338
|
+
detail: { timeoutMs: timeoutMsRaw }
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
const retryRaw = step.retry;
|
|
342
|
+
if (retryRaw !== void 0) {
|
|
343
|
+
const times = isRecord2(retryRaw) ? asPosInt(retryRaw.times) : void 0;
|
|
344
|
+
if (times === void 0) {
|
|
345
|
+
throw makeWorkflowError({
|
|
346
|
+
code: "WORKFLOW_INVALID_STEP",
|
|
347
|
+
message: "call.retry.times must be a positive integer.",
|
|
348
|
+
source: { stepKey: key, ...fragmentId ? { fragmentId } : null },
|
|
349
|
+
detail: { retry: retryRaw }
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
const onSuccess = Array.isArray(step.onSuccess) ? step.onSuccess : [];
|
|
354
|
+
const onFailure = Array.isArray(step.onFailure) ? step.onFailure : [];
|
|
355
|
+
for (const inner of onSuccess) visit(inner, fragmentId);
|
|
356
|
+
for (const inner of onFailure) visit(inner, fragmentId);
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
throw makeWorkflowError({
|
|
360
|
+
code: "WORKFLOW_INVALID_STEP",
|
|
361
|
+
message: "Unknown step kind.",
|
|
362
|
+
source: { stepKey: key, ...fragmentId ? { fragmentId } : null },
|
|
363
|
+
detail: { kind: step.kind }
|
|
364
|
+
});
|
|
365
|
+
};
|
|
366
|
+
const sources = def.sources;
|
|
367
|
+
const fragmentByStepKey = /* @__PURE__ */ new Map();
|
|
368
|
+
if (sources && typeof sources === "object") {
|
|
369
|
+
for (const [k, v] of Object.entries(sources)) {
|
|
370
|
+
fragmentByStepKey.set(k, isRecord2(v) ? asNonEmptyString(v.fragmentId) : void 0);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
for (const step of def.steps) {
|
|
374
|
+
const key = isRecord2(step) ? asNonEmptyString(step.key) : void 0;
|
|
375
|
+
const fragmentId = key ? fragmentByStepKey.get(key) : void 0;
|
|
376
|
+
visit(step, fragmentId);
|
|
377
|
+
}
|
|
378
|
+
const generator = isRecord2(def.meta) ? def.meta.generator : void 0;
|
|
379
|
+
if (generator !== void 0 && !isJsonValue(generator)) {
|
|
380
|
+
throw makeWorkflowError({
|
|
381
|
+
code: "WORKFLOW_INVALID_DEF",
|
|
382
|
+
message: "WorkflowDef.meta.generator must be JSON-serializable.",
|
|
383
|
+
detail: { generator }
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
const policy = isRecord2(def.policy) ? def.policy : void 0;
|
|
387
|
+
if (policy) {
|
|
388
|
+
const concurrency = policy.concurrency;
|
|
389
|
+
if (concurrency !== void 0 && concurrency !== "latest" && concurrency !== "exhaust" && concurrency !== "parallel") {
|
|
390
|
+
throw makeWorkflowError({
|
|
391
|
+
code: "WORKFLOW_INVALID_DEF",
|
|
392
|
+
message: "policy.concurrency must be latest|exhaust|parallel.",
|
|
393
|
+
detail: { concurrency }
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
const priority = policy.priority;
|
|
397
|
+
if (priority !== void 0 && priority !== "urgent" && priority !== "nonUrgent") {
|
|
398
|
+
throw makeWorkflowError({
|
|
399
|
+
code: "WORKFLOW_INVALID_DEF",
|
|
400
|
+
message: "policy.priority must be urgent|nonUrgent.",
|
|
401
|
+
detail: { priority }
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
void options?.moduleId;
|
|
406
|
+
}
|
|
407
|
+
var validateInputExpr = (expr, options) => {
|
|
408
|
+
const visit = (e) => {
|
|
409
|
+
if (!isRecord2(e)) {
|
|
410
|
+
throw makeWorkflowError({
|
|
411
|
+
code: "WORKFLOW_INVALID_INPUT_EXPR",
|
|
412
|
+
message: "InputExpr must be an object.",
|
|
413
|
+
source: { stepKey: options?.stepKey },
|
|
414
|
+
detail: { expr: e }
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
const kind = e.kind;
|
|
418
|
+
switch (kind) {
|
|
419
|
+
case "payload":
|
|
420
|
+
return;
|
|
421
|
+
case "payload.path": {
|
|
422
|
+
const pointer = e.pointer;
|
|
423
|
+
if (typeof pointer !== "string") {
|
|
424
|
+
throw makeWorkflowError({
|
|
425
|
+
code: "WORKFLOW_INVALID_INPUT_EXPR",
|
|
426
|
+
message: "InputExpr.payload.path.pointer must be a string.",
|
|
427
|
+
source: { stepKey: options?.stepKey },
|
|
428
|
+
detail: { pointer }
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
case "const": {
|
|
434
|
+
const value = e.value;
|
|
435
|
+
if (!isJsonValue(value)) {
|
|
436
|
+
throw makeWorkflowError({
|
|
437
|
+
code: "WORKFLOW_INVALID_INPUT_EXPR",
|
|
438
|
+
message: "InputExpr.const.value must be JSON-serializable.",
|
|
439
|
+
source: { stepKey: options?.stepKey }
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
return;
|
|
443
|
+
}
|
|
444
|
+
case "object": {
|
|
445
|
+
const fields = e.fields;
|
|
446
|
+
if (!isRecord2(fields)) {
|
|
447
|
+
throw makeWorkflowError({
|
|
448
|
+
code: "WORKFLOW_INVALID_INPUT_EXPR",
|
|
449
|
+
message: "InputExpr.object.fields must be a record.",
|
|
450
|
+
source: { stepKey: options?.stepKey }
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
for (const v of Object.values(fields)) {
|
|
454
|
+
visit(v);
|
|
455
|
+
}
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
case "merge": {
|
|
459
|
+
const items = e.items;
|
|
460
|
+
if (!Array.isArray(items)) {
|
|
461
|
+
throw makeWorkflowError({
|
|
462
|
+
code: "WORKFLOW_INVALID_INPUT_EXPR",
|
|
463
|
+
message: "InputExpr.merge.items must be an array.",
|
|
464
|
+
source: { stepKey: options?.stepKey }
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
for (const item of items) {
|
|
468
|
+
visit(item);
|
|
469
|
+
}
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
default:
|
|
473
|
+
throw makeWorkflowError({
|
|
474
|
+
code: "WORKFLOW_INVALID_INPUT_EXPR",
|
|
475
|
+
message: "Unknown InputExpr kind.",
|
|
476
|
+
source: { stepKey: options?.stepKey },
|
|
477
|
+
detail: { kind }
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
};
|
|
481
|
+
visit(expr);
|
|
482
|
+
};
|
|
483
|
+
var makeDigest = (prefix, value) => `${prefix}:${fnv1a32(stableStringify(value))}`;
|
|
484
|
+
var makeTriggerNodeId = (programId) => `wf_trigger_v1:${fnv1a32(programId)}`;
|
|
485
|
+
var makeStepNodeId = (programId, stepKey, kind) => `wf_node_v1:${fnv1a32(`${programId}\0${stepKey}\0${kind}`)}`;
|
|
486
|
+
var budgetJsonValue = (value) => projectJsonValue(value).value;
|
|
487
|
+
var budgetInputExpr = (expr) => {
|
|
488
|
+
switch (expr.kind) {
|
|
489
|
+
case "payload":
|
|
490
|
+
case "payload.path":
|
|
491
|
+
return expr;
|
|
492
|
+
case "const": {
|
|
493
|
+
const value = expr.value;
|
|
494
|
+
if (!isJsonValue(value)) return expr;
|
|
495
|
+
return { ...expr, value: budgetJsonValue(expr.value) };
|
|
496
|
+
}
|
|
497
|
+
case "object": {
|
|
498
|
+
const out = {};
|
|
499
|
+
for (const k of Object.keys(expr.fields).sort()) {
|
|
500
|
+
out[k] = budgetInputExpr(expr.fields[k]);
|
|
501
|
+
}
|
|
502
|
+
return { ...expr, fields: out };
|
|
503
|
+
}
|
|
504
|
+
case "merge":
|
|
505
|
+
return { ...expr, items: expr.items.map(budgetInputExpr) };
|
|
506
|
+
}
|
|
507
|
+
};
|
|
508
|
+
var toStaticStep = (step) => {
|
|
509
|
+
switch (step.kind) {
|
|
510
|
+
case "dispatch":
|
|
511
|
+
return {
|
|
512
|
+
kind: "dispatch",
|
|
513
|
+
actionTag: step.actionTag,
|
|
514
|
+
...step.payload ? { payload: budgetInputExpr(step.payload) } : null
|
|
515
|
+
};
|
|
516
|
+
case "delay":
|
|
517
|
+
return { kind: "delay", ms: step.ms };
|
|
518
|
+
case "call": {
|
|
519
|
+
const policy = step.timeoutMs !== void 0 || step.retry !== void 0 ? {
|
|
520
|
+
...step.timeoutMs !== void 0 ? { timeoutMs: step.timeoutMs } : null,
|
|
521
|
+
...step.retry !== void 0 ? { retry: { times: step.retry.times } } : null
|
|
522
|
+
} : void 0;
|
|
523
|
+
return {
|
|
524
|
+
kind: "call",
|
|
525
|
+
serviceId: step.serviceId,
|
|
526
|
+
...step.input ? { input: budgetInputExpr(step.input) } : null,
|
|
527
|
+
...policy ? { policy } : null
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
};
|
|
532
|
+
var compileWorkflowStaticIrV1 = (args) => {
|
|
533
|
+
const normalized = normalizeWorkflowDefV1(args.def);
|
|
534
|
+
validateWorkflowDefV1(normalized, { moduleId: args.moduleId });
|
|
535
|
+
const programId = `${args.moduleId}.${normalized.localId}`;
|
|
536
|
+
const triggerNodeId = makeTriggerNodeId(programId);
|
|
537
|
+
const fragmentByStepKey = /* @__PURE__ */ new Map();
|
|
538
|
+
if (normalized.sources && typeof normalized.sources === "object") {
|
|
539
|
+
for (const [k, v] of Object.entries(normalized.sources)) {
|
|
540
|
+
fragmentByStepKey.set(k, isRecord2(v) ? asNonEmptyString(v.fragmentId) : void 0);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
const nodesByKey = /* @__PURE__ */ new Map();
|
|
544
|
+
const collectNodes = (steps) => {
|
|
545
|
+
for (const step of steps) {
|
|
546
|
+
const id = makeStepNodeId(programId, step.key, step.kind);
|
|
547
|
+
nodesByKey.set(step.key, id);
|
|
548
|
+
if (step.kind === "call") {
|
|
549
|
+
collectNodes(step.onSuccess);
|
|
550
|
+
collectNodes(step.onFailure);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
};
|
|
554
|
+
collectNodes(normalized.steps);
|
|
555
|
+
const nodes = [
|
|
556
|
+
{
|
|
557
|
+
id: triggerNodeId,
|
|
558
|
+
kind: "trigger",
|
|
559
|
+
trigger: normalized.trigger
|
|
560
|
+
}
|
|
561
|
+
];
|
|
562
|
+
const addStepNodes = (steps) => {
|
|
563
|
+
for (const step of steps) {
|
|
564
|
+
const id = nodesByKey.get(step.key);
|
|
565
|
+
if (!id) continue;
|
|
566
|
+
const fragmentId = fragmentByStepKey.get(step.key);
|
|
567
|
+
nodes.push({
|
|
568
|
+
id,
|
|
569
|
+
kind: "step",
|
|
570
|
+
step: toStaticStep(step),
|
|
571
|
+
source: {
|
|
572
|
+
stepKey: step.key,
|
|
573
|
+
...fragmentId ? { fragmentId } : null
|
|
574
|
+
}
|
|
575
|
+
});
|
|
576
|
+
if (step.kind === "call") {
|
|
577
|
+
addStepNodes(step.onSuccess);
|
|
578
|
+
addStepNodes(step.onFailure);
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
};
|
|
582
|
+
addStepNodes(normalized.steps);
|
|
583
|
+
const edges = [];
|
|
584
|
+
const pushEdge = (from, to, kind) => {
|
|
585
|
+
edges.push({ from, to, kind });
|
|
586
|
+
};
|
|
587
|
+
const compileBlock = (args2) => {
|
|
588
|
+
if (args2.steps.length === 0) {
|
|
589
|
+
if (args2.continuation) {
|
|
590
|
+
for (const from of args2.entryFrom) {
|
|
591
|
+
pushEdge(from, args2.continuation, args2.entryKind);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
const first = args2.steps[0];
|
|
597
|
+
const firstId = nodesByKey.get(first.key);
|
|
598
|
+
if (!firstId) {
|
|
599
|
+
throw makeWorkflowError({
|
|
600
|
+
code: "WORKFLOW_INVALID_STEP",
|
|
601
|
+
message: "Internal error: missing node id for stepKey.",
|
|
602
|
+
programId,
|
|
603
|
+
source: { stepKey: first.key }
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
for (const from of args2.entryFrom) {
|
|
607
|
+
pushEdge(from, firstId, args2.entryKind);
|
|
608
|
+
}
|
|
609
|
+
const compileStepAndTail = (step, tail, continuation) => {
|
|
610
|
+
const stepId = nodesByKey.get(step.key);
|
|
611
|
+
if (!stepId) return;
|
|
612
|
+
if (step.kind !== "call") {
|
|
613
|
+
compileBlock({ steps: tail, entryFrom: [stepId], entryKind: "next", continuation });
|
|
614
|
+
return;
|
|
615
|
+
}
|
|
616
|
+
const cont = tail.length > 0 ? nodesByKey.get(tail[0].key) : continuation;
|
|
617
|
+
compileBlock({
|
|
618
|
+
steps: step.onSuccess,
|
|
619
|
+
entryFrom: [stepId],
|
|
620
|
+
entryKind: "success",
|
|
621
|
+
continuation: cont
|
|
622
|
+
});
|
|
623
|
+
compileBlock({
|
|
624
|
+
steps: step.onFailure,
|
|
625
|
+
entryFrom: [stepId],
|
|
626
|
+
entryKind: "failure",
|
|
627
|
+
continuation: cont
|
|
628
|
+
});
|
|
629
|
+
compileBlock({ steps: tail, entryFrom: [], entryKind: "next", continuation });
|
|
630
|
+
};
|
|
631
|
+
compileStepAndTail(first, args2.steps.slice(1), args2.continuation);
|
|
632
|
+
};
|
|
633
|
+
compileBlock({ steps: normalized.steps, entryFrom: [triggerNodeId], entryKind: "next", continuation: void 0 });
|
|
634
|
+
nodes.sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
|
|
635
|
+
edges.sort((a, b) => {
|
|
636
|
+
if (a.from !== b.from) return a.from < b.from ? -1 : 1;
|
|
637
|
+
if (a.to !== b.to) return a.to < b.to ? -1 : 1;
|
|
638
|
+
const ak = String(a.kind ?? "");
|
|
639
|
+
const bk = String(b.kind ?? "");
|
|
640
|
+
if (ak !== bk) return ak < bk ? -1 : 1;
|
|
641
|
+
return 0;
|
|
642
|
+
});
|
|
643
|
+
const meta = (() => {
|
|
644
|
+
const generator = normalized.meta?.generator;
|
|
645
|
+
if (generator === void 0) return void 0;
|
|
646
|
+
return { generator: budgetJsonValue(generator) };
|
|
647
|
+
})();
|
|
648
|
+
const irNoDigest = {
|
|
649
|
+
version: 1,
|
|
650
|
+
programId,
|
|
651
|
+
nodes,
|
|
652
|
+
edges,
|
|
653
|
+
policy: normalized.policy,
|
|
654
|
+
meta
|
|
655
|
+
};
|
|
656
|
+
const digest = makeDigest("workflow_ir_v1", irNoDigest);
|
|
657
|
+
return {
|
|
658
|
+
...irNoDigest,
|
|
659
|
+
digest
|
|
660
|
+
};
|
|
661
|
+
};
|
|
662
|
+
var compileWorkflowRuntimeStepsV1 = (args) => {
|
|
663
|
+
const normalized = normalizeWorkflowDefV1(args.def);
|
|
664
|
+
validateWorkflowDefV1(normalized);
|
|
665
|
+
const compileStep = (step) => {
|
|
666
|
+
const stepKey = step.key;
|
|
667
|
+
switch (step.kind) {
|
|
668
|
+
case "dispatch":
|
|
669
|
+
return {
|
|
670
|
+
kind: "dispatch",
|
|
671
|
+
key: step.key,
|
|
672
|
+
actionTag: step.actionTag,
|
|
673
|
+
...step.payload ? { payload: compileInputExpr(step.payload, { stepKey }) } : null
|
|
674
|
+
};
|
|
675
|
+
case "delay":
|
|
676
|
+
return { kind: "delay", key: step.key, ms: step.ms };
|
|
677
|
+
case "call": {
|
|
678
|
+
const retryTimes = step.retry?.times;
|
|
679
|
+
return {
|
|
680
|
+
kind: "call",
|
|
681
|
+
key: step.key,
|
|
682
|
+
serviceId: step.serviceId,
|
|
683
|
+
...step.input ? { input: compileInputExpr(step.input, { stepKey }) } : null,
|
|
684
|
+
...step.timeoutMs !== void 0 ? { timeoutMs: step.timeoutMs } : null,
|
|
685
|
+
...retryTimes !== void 0 ? { retryTimes } : null,
|
|
686
|
+
onSuccess: step.onSuccess.map(compileStep),
|
|
687
|
+
onFailure: step.onFailure.map(compileStep)
|
|
688
|
+
};
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
};
|
|
692
|
+
return normalized.steps.map(compileStep);
|
|
693
|
+
};
|
|
694
|
+
|
|
695
|
+
export {
|
|
696
|
+
makeWorkflowError,
|
|
697
|
+
evalInputExpr,
|
|
698
|
+
normalizeWorkflowDefV1,
|
|
699
|
+
validateWorkflowDefV1,
|
|
700
|
+
compileWorkflowStaticIrV1,
|
|
701
|
+
compileWorkflowRuntimeStepsV1
|
|
702
|
+
};
|
|
703
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvd29ya2Zsb3cvZXJyb3JzLnRzIiwgIi4uLy4uLy4uLy4uL2xvZ2l4LWNvcmUvc3JjL2ludGVybmFsL3dvcmtmbG93L2lucHV0RXhwci50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC93b3JrZmxvdy9jb21waWxlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSAnLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHsgaXNKc29uVmFsdWUsIHR5cGUgSnNvblZhbHVlLCBwcm9qZWN0SnNvblZhbHVlIH0gZnJvbSAnLi4vb2JzZXJ2YWJpbGl0eS9qc29uVmFsdWUuanMnXG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93RXJyb3JDb2RlID1cbiAgfCAnV09SS0ZMT1dfVU5TVVBQT1JURURfVkVSU0lPTidcbiAgfCAnV09SS0ZMT1dfSU5WQUxJRF9ERUYnXG4gIHwgJ1dPUktGTE9XX0lOVkFMSURfVFJJR0dFUidcbiAgfCAnV09SS0ZMT1dfSU5WQUxJRF9TVEVQJ1xuICB8ICdXT1JLRkxPV19EVVBMSUNBVEVfU1RFUF9LRVknXG4gIHwgJ1dPUktGTE9XX0lOVkFMSURfSU5QVVRfRVhQUidcbiAgfCAnV09SS0ZMT1dfSU5WQUxJRF9KU09OX1BPSU5URVInXG4gIHwgJ1dPUktGTE9XX0lOVkFMSURfTUVSR0VfSVRFTVMnXG4gIHwgJ1dPUktGTE9XX0lOVkFMSURfU0VSVklDRV9JRCdcbiAgfCAnV09SS0ZMT1dfTUlTU0lOR19TRVJWSUNFJ1xuICB8ICdXT1JLRkxPV19JTlZBTElEX1NFUlZJQ0VfUE9SVCdcbiAgfCAnV09SS0ZMT1dfQ0FMTF9USU1FT1VUJ1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IF90YWc6ICdXb3JrZmxvd0Vycm9yJ1xuICByZWFkb25seSBjb2RlOiBXb3JrZmxvd0Vycm9yQ29kZVxuICByZWFkb25seSBwcm9ncmFtSWQ/OiBzdHJpbmdcbiAgcmVhZG9ubHkgc291cmNlPzoge1xuICAgIHJlYWRvbmx5IHN0ZXBLZXk/OiBzdHJpbmdcbiAgICByZWFkb25seSBmcmFnbWVudElkPzogc3RyaW5nXG4gIH1cbiAgcmVhZG9ubHkgZGV0YWlsPzogSnNvblZhbHVlXG59XG5cbmNvbnN0IHRvSnNvblZhbHVlID0gKGRldGFpbDogdW5rbm93bik6IEpzb25WYWx1ZSA9PiB7XG4gIGlmIChpc0pzb25WYWx1ZShkZXRhaWwpKSByZXR1cm4gZGV0YWlsXG4gIHJldHVybiBwcm9qZWN0SnNvblZhbHVlKGRldGFpbCkudmFsdWVcbn1cblxuZXhwb3J0IGNvbnN0IG1ha2VXb3JrZmxvd0Vycm9yID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgY29kZTogV29ya2Zsb3dFcnJvckNvZGVcbiAgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nXG4gIHJlYWRvbmx5IHByb2dyYW1JZD86IHN0cmluZ1xuICByZWFkb25seSBzb3VyY2U/OiBXb3JrZmxvd0Vycm9yWydzb3VyY2UnXVxuICByZWFkb25seSBkZXRhaWw/OiB1bmtub3duXG59KTogV29ya2Zsb3dFcnJvciA9PiB7XG4gIGNvbnN0IGRldGFpbEpzb24gPSBhcmdzLmRldGFpbCAhPT0gdW5kZWZpbmVkID8gdG9Kc29uVmFsdWUoYXJncy5kZXRhaWwpIDogdW5kZWZpbmVkXG4gIGNvbnN0IG1zZyA9IGFyZ3MuZGV0YWlsICE9PSB1bmRlZmluZWQgPyBgJHthcmdzLm1lc3NhZ2V9XFxuKGRldGFpbD0ke3N0YWJsZVN0cmluZ2lmeShkZXRhaWxKc29uKX0pYCA6IGFyZ3MubWVzc2FnZVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihtc2cpLCB7XG4gICAgX3RhZzogJ1dvcmtmbG93RXJyb3InIGFzIGNvbnN0LFxuICAgIGNvZGU6IGFyZ3MuY29kZSxcbiAgICBwcm9ncmFtSWQ6IGFyZ3MucHJvZ3JhbUlkLFxuICAgIHNvdXJjZTogYXJncy5zb3VyY2UsXG4gICAgZGV0YWlsOiBkZXRhaWxKc29uLFxuICB9KSBhcyBXb3JrZmxvd0Vycm9yXG59XG4iLCAiaW1wb3J0IHsgaXNKc29uVmFsdWUgfSBmcm9tICcuLi9vYnNlcnZhYmlsaXR5L2pzb25WYWx1ZS5qcydcbmltcG9ydCB7IG1ha2VXb3JrZmxvd0Vycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnXG5pbXBvcnQgdHlwZSB7IElucHV0RXhwclYxIH0gZnJvbSAnLi9tb2RlbC5qcydcblxuZXhwb3J0IHR5cGUgSnNvblBvaW50ZXJUb2tlbiA9IHN0cmluZyB8IG51bWJlclxuXG5jb25zdCBkZWNvZGVQb2ludGVyVG9rZW4gPSAocmF3OiBzdHJpbmcpOiBzdHJpbmcgPT4gcmF3LnJlcGxhY2UoL34xL2csICcvJykucmVwbGFjZSgvfjAvZywgJ34nKVxuXG5jb25zdCBpc0luZGV4VG9rZW4gPSAodG9rZW46IHN0cmluZyk6IGJvb2xlYW4gPT4gdG9rZW4gPT09ICcwJyB8fCAoIXRva2VuLnN0YXJ0c1dpdGgoJzAnKSAmJiAvXlxcZCskLy50ZXN0KHRva2VuKSlcblxuY29uc3QgaXNSZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PlxuICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuXG5leHBvcnQgY29uc3QgcGFyc2VKc29uUG9pbnRlciA9IChwb2ludGVyOiBzdHJpbmcpOiBSZWFkb25seUFycmF5PEpzb25Qb2ludGVyVG9rZW4+ID0+IHtcbiAgaWYgKHBvaW50ZXIgPT09ICcnKSByZXR1cm4gW11cbiAgaWYgKCFwb2ludGVyLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX0pTT05fUE9JTlRFUicsXG4gICAgICBtZXNzYWdlOiAnSW52YWxpZCBKU09OIFBvaW50ZXIgKG11c3QgYmUgXCJcIiBvciBzdGFydCB3aXRoIFwiL1wiKS4nLFxuICAgICAgZGV0YWlsOiB7IHBvaW50ZXIgfSxcbiAgICB9KVxuICB9XG5cbiAgY29uc3QgcmF3ID0gcG9pbnRlci5zcGxpdCgnLycpLnNsaWNlKDEpXG4gIGNvbnN0IG91dDogSnNvblBvaW50ZXJUb2tlbltdID0gW11cbiAgZm9yIChjb25zdCBwYXJ0IG9mIHJhdykge1xuICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVQb2ludGVyVG9rZW4ocGFydClcbiAgICBvdXQucHVzaChpc0luZGV4VG9rZW4oZGVjb2RlZCkgPyBOdW1iZXIoZGVjb2RlZCkgOiBkZWNvZGVkKVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZXhwb3J0IHR5cGUgQ29tcGlsZWRJbnB1dEV4cHIgPVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3BheWxvYWQnIH1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdwYXlsb2FkLnBhdGgnOyByZWFkb25seSBwb2ludGVyOiBzdHJpbmc7IHJlYWRvbmx5IHRva2VuczogUmVhZG9ubHlBcnJheTxKc29uUG9pbnRlclRva2VuPiB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnY29uc3QnOyByZWFkb25seSB2YWx1ZTogdW5rbm93biB9XG4gIHwgeyByZWFkb25seSBraW5kOiAnb2JqZWN0JzsgcmVhZG9ubHkgZmllbGRzOiBSZWFkb25seUFycmF5PHJlYWRvbmx5IFtzdHJpbmcsIENvbXBpbGVkSW5wdXRFeHByXT4gfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ21lcmdlJzsgcmVhZG9ubHkgaXRlbXM6IFJlYWRvbmx5QXJyYXk8Q29tcGlsZWRJbnB1dEV4cHI+IH1cblxuZXhwb3J0IGNvbnN0IGNvbXBpbGVJbnB1dEV4cHIgPSAoZXhwcjogSW5wdXRFeHByVjEsIHBhdGhGb3JFcnJvcj86IHsgcmVhZG9ubHkgc3RlcEtleT86IHN0cmluZyB9KTogQ29tcGlsZWRJbnB1dEV4cHIgPT4ge1xuICBzd2l0Y2ggKGV4cHIua2luZCkge1xuICAgIGNhc2UgJ3BheWxvYWQnOlxuICAgICAgcmV0dXJuIHsga2luZDogJ3BheWxvYWQnIH1cbiAgICBjYXNlICdwYXlsb2FkLnBhdGgnOiB7XG4gICAgICBjb25zdCBwb2ludGVyID0gZXhwci5wb2ludGVyXG4gICAgICBpZiAodHlwZW9mIHBvaW50ZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9JTlBVVF9FWFBSJyxcbiAgICAgICAgICBtZXNzYWdlOiAnSW5wdXRFeHByLnBheWxvYWQucGF0aC5wb2ludGVyIG11c3QgYmUgYSBzdHJpbmcuJyxcbiAgICAgICAgICBzb3VyY2U6IHsgc3RlcEtleTogcGF0aEZvckVycm9yPy5zdGVwS2V5IH0sXG4gICAgICAgICAgZGV0YWlsOiB7IHBvaW50ZXIgfSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGtpbmQ6ICdwYXlsb2FkLnBhdGgnLCBwb2ludGVyLCB0b2tlbnM6IHBhcnNlSnNvblBvaW50ZXIocG9pbnRlcikgfVxuICAgIH1cbiAgICBjYXNlICdjb25zdCc6IHtcbiAgICAgIGNvbnN0IHZhbHVlOiB1bmtub3duID0gZXhwci52YWx1ZVxuICAgICAgaWYgKCFpc0pzb25WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX0lOUFVUX0VYUFInLFxuICAgICAgICAgIG1lc3NhZ2U6ICdJbnB1dEV4cHIuY29uc3QudmFsdWUgbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZS4nLFxuICAgICAgICAgIHNvdXJjZTogeyBzdGVwS2V5OiBwYXRoRm9yRXJyb3I/LnN0ZXBLZXkgfSxcbiAgICAgICAgICBkZXRhaWw6IHsgdmFsdWUgfSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGtpbmQ6ICdjb25zdCcsIHZhbHVlIH1cbiAgICB9XG4gICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgY29uc3QgZmllbGRzOiB1bmtub3duID0gZXhwci5maWVsZHNcbiAgICAgIGlmICghZmllbGRzIHx8IHR5cGVvZiBmaWVsZHMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZmllbGRzKSkge1xuICAgICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfSU5QVVRfRVhQUicsXG4gICAgICAgICAgbWVzc2FnZTogJ0lucHV0RXhwci5vYmplY3QuZmllbGRzIG11c3QgYmUgYSByZWNvcmQuJyxcbiAgICAgICAgICBzb3VyY2U6IHsgc3RlcEtleTogcGF0aEZvckVycm9yPy5zdGVwS2V5IH0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZmllbGRzIGFzIFJlY29yZDxzdHJpbmcsIElucHV0RXhwclYxPikuc29ydCgoW2FdLCBbYl0pID0+IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCkpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnb2JqZWN0JyxcbiAgICAgICAgZmllbGRzOiBlbnRyaWVzLm1hcCgoW2ssIHZdKSA9PiBbaywgY29tcGlsZUlucHV0RXhwcih2LCBwYXRoRm9yRXJyb3IpXSBhcyBjb25zdCksXG4gICAgICB9XG4gICAgfVxuICAgIGNhc2UgJ21lcmdlJzoge1xuICAgICAgY29uc3QgaXRlbXM6IHVua25vd24gPSBleHByLml0ZW1zXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9JTlBVVF9FWFBSJyxcbiAgICAgICAgICBtZXNzYWdlOiAnSW5wdXRFeHByLm1lcmdlLml0ZW1zIG11c3QgYmUgYW4gYXJyYXkuJyxcbiAgICAgICAgICBzb3VyY2U6IHsgc3RlcEtleTogcGF0aEZvckVycm9yPy5zdGVwS2V5IH0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIEhhcmQgZ2F0ZTogbWVyZ2UuaXRlbXMgbXVzdCBhbGwgYmUgb2JqZWN0IChlbmZvcmNlZCBhdCBjb21waWxlLXRpbWU7IHJ1bnRpbWUgc2hvdWxkIG5vdCBicmFuY2gpLlxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICAgIGNvbnN0IGtpbmQgPSBpc1JlY29yZChpdGVtKSA/IGl0ZW0ua2luZCA6IHVuZGVmaW5lZFxuICAgICAgICBpZiAoa2luZCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9NRVJHRV9JVEVNUycsXG4gICAgICAgICAgICBtZXNzYWdlOiAnSW5wdXRFeHByLm1lcmdlLml0ZW1zIG11c3QgYWxsIGJlIElucHV0RXhwci5vYmplY3QuJyxcbiAgICAgICAgICAgIHNvdXJjZTogeyBzdGVwS2V5OiBwYXRoRm9yRXJyb3I/LnN0ZXBLZXkgfSxcbiAgICAgICAgICAgIGRldGFpbDogeyBraW5kIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnbWVyZ2UnLFxuICAgICAgICBpdGVtczogKGl0ZW1zIGFzIFJlYWRvbmx5QXJyYXk8SW5wdXRFeHByVjE+KS5tYXAoKGkpID0+IGNvbXBpbGVJbnB1dEV4cHIoaSwgcGF0aEZvckVycm9yKSksXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGlzUGxhaW5SZWNvcmQgPSAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSByZXR1cm4gZmFsc2VcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2VcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbFxufVxuXG5jb25zdCBldmFsUG9pbnRlciA9IChyb290OiB1bmtub3duLCB0b2tlbnM6IFJlYWRvbmx5QXJyYXk8SnNvblBvaW50ZXJUb2tlbj4pOiB1bmtub3duID0+IHtcbiAgbGV0IGN1cnJlbnQ6IHVua25vd24gPSByb290XG4gIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5zKSB7XG4gICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpICYmIHR5cGVvZiB0b2tlbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3Rva2VuXVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjdXJyZW50ICE9PSAnb2JqZWN0JykgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGNvbnN0IGtleSA9IHR5cGVvZiB0b2tlbiA9PT0gJ251bWJlcicgPyBTdHJpbmcodG9rZW4pIDogdG9rZW5cbiAgICBjdXJyZW50ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV1cbiAgfVxuICByZXR1cm4gY3VycmVudFxufVxuXG5leHBvcnQgY29uc3QgZXZhbElucHV0RXhwciA9IChleHByOiBDb21waWxlZElucHV0RXhwciwgcGF5bG9hZDogdW5rbm93bik6IHVua25vd24gPT4ge1xuICBzd2l0Y2ggKGV4cHIua2luZCkge1xuICAgIGNhc2UgJ3BheWxvYWQnOlxuICAgICAgcmV0dXJuIHBheWxvYWRcbiAgICBjYXNlICdwYXlsb2FkLnBhdGgnOlxuICAgICAgcmV0dXJuIGV2YWxQb2ludGVyKHBheWxvYWQsIGV4cHIudG9rZW5zKVxuICAgIGNhc2UgJ2NvbnN0JzpcbiAgICAgIHJldHVybiBleHByLnZhbHVlXG4gICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBleHByLmZpZWxkcykge1xuICAgICAgICBvdXRba10gPSBldmFsSW5wdXRFeHByKHYsIHBheWxvYWQpXG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0XG4gICAgfVxuICAgIGNhc2UgJ21lcmdlJzoge1xuICAgICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9XG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZXhwci5pdGVtcykge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGV2YWxJbnB1dEV4cHIoaXRlbSwgcGF5bG9hZClcbiAgICAgICAgaWYgKGlzUGxhaW5SZWNvcmQodmFsdWUpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgICBvdXRba10gPSB2XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgZm52MWEzMiwgc3RhYmxlU3RyaW5naWZ5IH0gZnJvbSAnLi4vZGlnZXN0LmpzJ1xuaW1wb3J0IHsgaXNKc29uVmFsdWUsIHByb2plY3RKc29uVmFsdWUsIHR5cGUgSnNvblZhbHVlIH0gZnJvbSAnLi4vb2JzZXJ2YWJpbGl0eS9qc29uVmFsdWUuanMnXG5pbXBvcnQgeyBtYWtlV29ya2Zsb3dFcnJvciB9IGZyb20gJy4vZXJyb3JzLmpzJ1xuaW1wb3J0IHR5cGUge1xuICBJbnB1dEV4cHJWMSxcbiAgU3RlcEtleSxcbiAgV29ya2Zsb3dEZWZWMSxcbiAgV29ya2Zsb3dTdGVwVjEsXG4gIFdvcmtmbG93U3RhdGljSXJWMSxcbiAgV29ya2Zsb3dTdGF0aWNOb2RlLFxuICBXb3JrZmxvd1N0YXRpY1N0ZXAsXG4gIFdvcmtmbG93VHJpZ2dlclYxLFxuICBXb3JrZmxvd1N0YWJsZUlkLFxuICBXb3JrZmxvd05vZGVJZCxcbiAgV29ya2Zsb3dFZGdlLFxuICBXb3JrZmxvd0VkZ2VLaW5kLFxufSBmcm9tICcuL21vZGVsLmpzJ1xuaW1wb3J0IHsgY29tcGlsZUlucHV0RXhwciwgdHlwZSBDb21waWxlZElucHV0RXhwciB9IGZyb20gJy4vaW5wdXRFeHByLmpzJ1xuXG5jb25zdCBpc1JlY29yZCA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpXG5cbmNvbnN0IGFzTm9uRW1wdHlTdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT5cbiAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCA/IHZhbHVlLnRyaW0oKSA6IHVuZGVmaW5lZFxuXG5jb25zdCBhc05vbk5lZ0ludCA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IG4gPSBNYXRoLmZsb29yKHZhbHVlKVxuICByZXR1cm4gbiA+PSAwID8gbiA6IHVuZGVmaW5lZFxufVxuXG5jb25zdCBhc1Bvc0ludCA9ICh2YWx1ZTogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkXG4gIGNvbnN0IG4gPSBNYXRoLmZsb29yKHZhbHVlKVxuICByZXR1cm4gbiA+IDAgPyBuIDogdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVXb3JrZmxvd0RlZlYxID0gKGlucHV0OiBXb3JrZmxvd0RlZlYxKTogV29ya2Zsb3dEZWZWMSA9PiB7XG4gIC8vIEZpbGwgdHJpdmlhbCBkZWZhdWx0cyAoY2Fub25pY2FsIHNoYXBlKTpcbiAgLy8gLSBjYWxsLm9uU3VjY2Vzcy9vbkZhaWx1cmUgbXVzdCBiZSBleHBsaWNpdCBhcnJheXMuXG4gIC8vIC0gVGhlIG5vcm1hbGl6YXRpb24gbXVzdCBiZSBkZWVwOiBuZXN0ZWQgY2FsbCBzdGVwcyBtYXkgY29tZSBmcm9tIGRlZi1saWtlIGlucHV0cyBhbmQgbWlzcyB0aGUgYXJyYXlzLlxuICBjb25zdCBub3JtYWxpemVTdGVwID0gKHN0ZXA6IFdvcmtmbG93U3RlcFYxKTogV29ya2Zsb3dTdGVwVjEgPT4ge1xuICAgIGlmICghaXNSZWNvcmQoc3RlcCkpIHJldHVybiBzdGVwXG4gICAgaWYgKHN0ZXAua2luZCAhPT0gJ2NhbGwnKSByZXR1cm4gc3RlcFxuXG4gICAgY29uc3QgcmF3ID0gc3RlcCBhcyB1bmtub3duIGFzIHsgcmVhZG9ubHkgb25TdWNjZXNzPzogdW5rbm93bjsgcmVhZG9ubHkgb25GYWlsdXJlPzogdW5rbm93biB9XG4gICAgY29uc3Qgb25TdWNjZXNzUmF3ID0gQXJyYXkuaXNBcnJheShyYXcub25TdWNjZXNzKSA/IChyYXcub25TdWNjZXNzIGFzIFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dTdGVwVjE+KSA6IFtdXG4gICAgY29uc3Qgb25GYWlsdXJlUmF3ID0gQXJyYXkuaXNBcnJheShyYXcub25GYWlsdXJlKSA/IChyYXcub25GYWlsdXJlIGFzIFJlYWRvbmx5QXJyYXk8V29ya2Zsb3dTdGVwVjE+KSA6IFtdXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RlcCxcbiAgICAgIG9uU3VjY2Vzczogb25TdWNjZXNzUmF3Lm1hcChub3JtYWxpemVTdGVwKSxcbiAgICAgIG9uRmFpbHVyZTogb25GYWlsdXJlUmF3Lm1hcChub3JtYWxpemVTdGVwKSxcbiAgICB9XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVTdGVwcyA9IChzdGVwczogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXBWMT4pOiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcFYxPiA9PiBzdGVwcy5tYXAobm9ybWFsaXplU3RlcClcblxuICByZXR1cm4ge1xuICAgIC4uLmlucHV0LFxuICAgIHN0ZXBzOiBub3JtYWxpemVTdGVwcyhpbnB1dC5zdGVwcyksXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlV29ya2Zsb3dEZWZWMShkZWY6IHVua25vd24sIG9wdGlvbnM/OiB7IHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nIH0pOiBhc3NlcnRzIGRlZiBpcyBXb3JrZmxvd0RlZlYxIHtcbiAgaWYgKCFpc1JlY29yZChkZWYpKSB7XG4gICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfREVGJyxcbiAgICAgIG1lc3NhZ2U6ICdXb3JrZmxvd0RlZiBtdXN0IGJlIGFuIG9iamVjdC4nLFxuICAgICAgZGV0YWlsOiB7IGRlZiB9LFxuICAgIH0pXG4gIH1cblxuICBpZiAoZGVmLmFzdFZlcnNpb24gIT09IDEpIHtcbiAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICBjb2RlOiAnV09SS0ZMT1dfVU5TVVBQT1JURURfVkVSU0lPTicsXG4gICAgICBtZXNzYWdlOiAnVW5zdXBwb3J0ZWQgd29ya2Zsb3cgYXN0VmVyc2lvbi4nLFxuICAgICAgZGV0YWlsOiB7IGFzdFZlcnNpb246IGRlZi5hc3RWZXJzaW9uIH0sXG4gICAgfSlcbiAgfVxuXG4gIGlmICghYXNOb25FbXB0eVN0cmluZyhkZWYubG9jYWxJZCkpIHtcbiAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9ERUYnLFxuICAgICAgbWVzc2FnZTogJ1dvcmtmbG93RGVmLmxvY2FsSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyxcbiAgICAgIGRldGFpbDogeyBsb2NhbElkOiBkZWYubG9jYWxJZCB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCB0cmlnZ2VyID0gZGVmLnRyaWdnZXJcbiAgaWYgKCFpc1JlY29yZCh0cmlnZ2VyKSkge1xuICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX1RSSUdHRVInLFxuICAgICAgbWVzc2FnZTogJ1dvcmtmbG93IHRyaWdnZXIgbXVzdCBiZSBhbiBvYmplY3QuJyxcbiAgICAgIGRldGFpbDogeyB0cmlnZ2VyIH0sXG4gICAgfSlcbiAgfVxuICBpZiAodHJpZ2dlci5raW5kID09PSAnYWN0aW9uJykge1xuICAgIGlmICghYXNOb25FbXB0eVN0cmluZyh0cmlnZ2VyLmFjdGlvblRhZykpIHtcbiAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfVFJJR0dFUicsXG4gICAgICAgIG1lc3NhZ2U6ICdXb3JrZmxvdyB0cmlnZ2VyLmFjdGlvblRhZyBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nLFxuICAgICAgICBkZXRhaWw6IHsgdHJpZ2dlciB9LFxuICAgICAgfSlcbiAgICB9XG4gIH0gZWxzZSBpZiAodHJpZ2dlci5raW5kID09PSAnbGlmZWN5Y2xlJykge1xuICAgIGNvbnN0IHBoYXNlID0gdHJpZ2dlci5waGFzZVxuICAgIGlmIChwaGFzZSAhPT0gJ29uU3RhcnQnICYmIHBoYXNlICE9PSAnb25Jbml0Jykge1xuICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9UUklHR0VSJyxcbiAgICAgICAgbWVzc2FnZTogJ1dvcmtmbG93IHRyaWdnZXIucGhhc2UgbXVzdCBiZSBcIm9uU3RhcnRcIiBvciBcIm9uSW5pdFwiLicsXG4gICAgICAgIGRldGFpbDogeyB0cmlnZ2VyIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9UUklHR0VSJyxcbiAgICAgIG1lc3NhZ2U6ICdXb3JrZmxvdyB0cmlnZ2VyLmtpbmQgbXVzdCBiZSBcImFjdGlvblwiIG9yIFwibGlmZWN5Y2xlXCIuJyxcbiAgICAgIGRldGFpbDogeyB0cmlnZ2VyIH0sXG4gICAgfSlcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShkZWYuc3RlcHMpKSB7XG4gICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfREVGJyxcbiAgICAgIG1lc3NhZ2U6ICdXb3JrZmxvd0RlZi5zdGVwcyBtdXN0IGJlIGFuIGFycmF5LicsXG4gICAgICBkZXRhaWw6IHsgc3RlcHM6IGRlZi5zdGVwcyB9LFxuICAgIH0pXG4gIH1cblxuICBjb25zdCBzZWVuS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpXG4gIGNvbnN0IHZpc2l0ID0gKHN0ZXA6IHVua25vd24sIGZyYWdtZW50SWQ/OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBpZiAoIWlzUmVjb3JkKHN0ZXApKSB7XG4gICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX1NURVAnLFxuICAgICAgICBtZXNzYWdlOiAnV29ya2Zsb3cgc3RlcCBtdXN0IGJlIGFuIG9iamVjdC4nLFxuICAgICAgICBkZXRhaWw6IHsgc3RlcCB9LFxuICAgICAgICBzb3VyY2U6IGZyYWdtZW50SWQgPyB7IGZyYWdtZW50SWQgfSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gYXNOb25FbXB0eVN0cmluZyhzdGVwLmtleSlcbiAgICBpZiAoIWtleSkge1xuICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9TVEVQJyxcbiAgICAgICAgbWVzc2FnZTogJ1dvcmtmbG93IHN0ZXAua2V5IG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicsXG4gICAgICAgIGRldGFpbDogeyBzdGVwS2V5OiBzdGVwLmtleSwga2luZDogc3RlcC5raW5kIH0sXG4gICAgICAgIHNvdXJjZTogZnJhZ21lbnRJZCA/IHsgZnJhZ21lbnRJZCB9IDogdW5kZWZpbmVkLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZiAoc2VlbktleXMuaGFzKGtleSkpIHtcbiAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgY29kZTogJ1dPUktGTE9XX0RVUExJQ0FURV9TVEVQX0tFWScsXG4gICAgICAgIG1lc3NhZ2U6IGBEdXBsaWNhdGUgc3RlcEtleSBcIiR7a2V5fVwiIGRldGVjdGVkLmAsXG4gICAgICAgIGRldGFpbDogeyBkdXBsaWNhdGVLZXk6IGtleSB9LFxuICAgICAgICBzb3VyY2U6IHsgc3RlcEtleToga2V5LCAuLi4oZnJhZ21lbnRJZCA/IHsgZnJhZ21lbnRJZCB9IDogbnVsbCkgfSxcbiAgICAgIH0pXG4gICAgfVxuICAgIHNlZW5LZXlzLmFkZChrZXkpXG5cbiAgICBpZiAoc3RlcC5raW5kID09PSAnZGlzcGF0Y2gnKSB7XG4gICAgICBpZiAoIWFzTm9uRW1wdHlTdHJpbmcoc3RlcC5hY3Rpb25UYWcpKSB7XG4gICAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9TVEVQJyxcbiAgICAgICAgICBtZXNzYWdlOiAnZGlzcGF0Y2guYWN0aW9uVGFnIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicsXG4gICAgICAgICAgc291cmNlOiB7IHN0ZXBLZXk6IGtleSwgLi4uKGZyYWdtZW50SWQgPyB7IGZyYWdtZW50SWQgfSA6IG51bGwpIH0sXG4gICAgICAgICAgZGV0YWlsOiB7IGFjdGlvblRhZzogc3RlcC5hY3Rpb25UYWcgfSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBheWxvYWQgPSBzdGVwLnBheWxvYWRcbiAgICAgIGlmIChwYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsaWRhdGVJbnB1dEV4cHIocGF5bG9hZCwgeyBzdGVwS2V5OiBrZXkgfSlcbiAgICAgIH1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzdGVwLmtpbmQgPT09ICdkZWxheScpIHtcbiAgICAgIGNvbnN0IG1zID0gYXNOb25OZWdJbnQoc3RlcC5tcylcbiAgICAgIGlmIChtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9TVEVQJyxcbiAgICAgICAgICBtZXNzYWdlOiAnZGVsYXkubXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLicsXG4gICAgICAgICAgc291cmNlOiB7IHN0ZXBLZXk6IGtleSwgLi4uKGZyYWdtZW50SWQgPyB7IGZyYWdtZW50SWQgfSA6IG51bGwpIH0sXG4gICAgICAgICAgZGV0YWlsOiB7IG1zOiBzdGVwLm1zIH0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc3RlcC5raW5kID09PSAnY2FsbCcpIHtcbiAgICAgIGlmICghYXNOb25FbXB0eVN0cmluZyhzdGVwLnNlcnZpY2VJZCkpIHtcbiAgICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX1NFUlZJQ0VfSUQnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdjYWxsLnNlcnZpY2VJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nLFxuICAgICAgICAgIHNvdXJjZTogeyBzdGVwS2V5OiBrZXksIC4uLihmcmFnbWVudElkID8geyBmcmFnbWVudElkIH0gOiBudWxsKSB9LFxuICAgICAgICAgIGRldGFpbDogeyBzZXJ2aWNlSWQ6IHN0ZXAuc2VydmljZUlkIH0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjb25zdCBpbnB1dEV4cHIgPSBzdGVwLmlucHV0XG4gICAgICBpZiAoaW5wdXRFeHByICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsaWRhdGVJbnB1dEV4cHIoaW5wdXRFeHByLCB7IHN0ZXBLZXk6IGtleSB9KVxuICAgICAgfVxuICAgICAgY29uc3QgdGltZW91dE1zUmF3ID0gc3RlcC50aW1lb3V0TXNcbiAgICAgIGlmICh0aW1lb3V0TXNSYXcgIT09IHVuZGVmaW5lZCAmJiBhc1Bvc0ludCh0aW1lb3V0TXNSYXcpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX1NURVAnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdjYWxsLnRpbWVvdXRNcyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciAobWlsbGlzZWNvbmRzKS4nLFxuICAgICAgICAgIHNvdXJjZTogeyBzdGVwS2V5OiBrZXksIC4uLihmcmFnbWVudElkID8geyBmcmFnbWVudElkIH0gOiBudWxsKSB9LFxuICAgICAgICAgIGRldGFpbDogeyB0aW1lb3V0TXM6IHRpbWVvdXRNc1JhdyB9LFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgY29uc3QgcmV0cnlSYXcgPSBzdGVwLnJldHJ5XG4gICAgICBpZiAocmV0cnlSYXcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB0aW1lcyA9IGlzUmVjb3JkKHJldHJ5UmF3KSA/IGFzUG9zSW50KHJldHJ5UmF3LnRpbWVzKSA6IHVuZGVmaW5lZFxuICAgICAgICBpZiAodGltZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX1NURVAnLFxuICAgICAgICAgICAgbWVzc2FnZTogJ2NhbGwucmV0cnkudGltZXMgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuJyxcbiAgICAgICAgICAgIHNvdXJjZTogeyBzdGVwS2V5OiBrZXksIC4uLihmcmFnbWVudElkID8geyBmcmFnbWVudElkIH0gOiBudWxsKSB9LFxuICAgICAgICAgICAgZGV0YWlsOiB7IHJldHJ5OiByZXRyeVJhdyB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25TdWNjZXNzID0gQXJyYXkuaXNBcnJheShzdGVwLm9uU3VjY2VzcykgPyBzdGVwLm9uU3VjY2VzcyA6IFtdXG4gICAgICBjb25zdCBvbkZhaWx1cmUgPSBBcnJheS5pc0FycmF5KHN0ZXAub25GYWlsdXJlKSA/IHN0ZXAub25GYWlsdXJlIDogW11cbiAgICAgIGZvciAoY29uc3QgaW5uZXIgb2Ygb25TdWNjZXNzKSB2aXNpdChpbm5lciwgZnJhZ21lbnRJZClcbiAgICAgIGZvciAoY29uc3QgaW5uZXIgb2Ygb25GYWlsdXJlKSB2aXNpdChpbm5lciwgZnJhZ21lbnRJZClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgIGNvZGU6ICdXT1JLRkxPV19JTlZBTElEX1NURVAnLFxuICAgICAgbWVzc2FnZTogJ1Vua25vd24gc3RlcCBraW5kLicsXG4gICAgICBzb3VyY2U6IHsgc3RlcEtleToga2V5LCAuLi4oZnJhZ21lbnRJZCA/IHsgZnJhZ21lbnRJZCB9IDogbnVsbCkgfSxcbiAgICAgIGRldGFpbDogeyBraW5kOiBzdGVwLmtpbmQgfSxcbiAgICB9KVxuICB9XG5cbiAgY29uc3Qgc291cmNlcyA9IGRlZi5zb3VyY2VzXG4gIGNvbnN0IGZyYWdtZW50QnlTdGVwS2V5ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oKVxuICBpZiAoc291cmNlcyAmJiB0eXBlb2Ygc291cmNlcyA9PT0gJ29iamVjdCcpIHtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhzb3VyY2VzKSkge1xuICAgICAgZnJhZ21lbnRCeVN0ZXBLZXkuc2V0KGssIGlzUmVjb3JkKHYpID8gYXNOb25FbXB0eVN0cmluZyh2LmZyYWdtZW50SWQpIDogdW5kZWZpbmVkKVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc3RlcCBvZiBkZWYuc3RlcHMpIHtcbiAgICBjb25zdCBrZXkgPSBpc1JlY29yZChzdGVwKSA/IGFzTm9uRW1wdHlTdHJpbmcoc3RlcC5rZXkpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgZnJhZ21lbnRJZCA9IGtleSA/IGZyYWdtZW50QnlTdGVwS2V5LmdldChrZXkpIDogdW5kZWZpbmVkXG4gICAgdmlzaXQoc3RlcCwgZnJhZ21lbnRJZClcbiAgfVxuXG4gIC8vIG1ldGEuZ2VuZXJhdG9yIG11c3Qgc3RheSBKU09OLW9ubHkuXG4gIGNvbnN0IGdlbmVyYXRvciA9IGlzUmVjb3JkKGRlZi5tZXRhKSA/IGRlZi5tZXRhLmdlbmVyYXRvciA6IHVuZGVmaW5lZFxuICBpZiAoZ2VuZXJhdG9yICE9PSB1bmRlZmluZWQgJiYgIWlzSnNvblZhbHVlKGdlbmVyYXRvcikpIHtcbiAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9ERUYnLFxuICAgICAgbWVzc2FnZTogJ1dvcmtmbG93RGVmLm1ldGEuZ2VuZXJhdG9yIG11c3QgYmUgSlNPTi1zZXJpYWxpemFibGUuJyxcbiAgICAgIGRldGFpbDogeyBnZW5lcmF0b3IgfSxcbiAgICB9KVxuICB9XG5cbiAgLy8gcG9saWN5IHZhbGlkYXRpb24gKG1pbmltYWwpXG4gIGNvbnN0IHBvbGljeSA9IGlzUmVjb3JkKGRlZi5wb2xpY3kpID8gZGVmLnBvbGljeSA6IHVuZGVmaW5lZFxuICBpZiAocG9saWN5KSB7XG4gICAgY29uc3QgY29uY3VycmVuY3kgPSBwb2xpY3kuY29uY3VycmVuY3lcbiAgICBpZiAoY29uY3VycmVuY3kgIT09IHVuZGVmaW5lZCAmJiBjb25jdXJyZW5jeSAhPT0gJ2xhdGVzdCcgJiYgY29uY3VycmVuY3kgIT09ICdleGhhdXN0JyAmJiBjb25jdXJyZW5jeSAhPT0gJ3BhcmFsbGVsJykge1xuICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9ERUYnLFxuICAgICAgICBtZXNzYWdlOiAncG9saWN5LmNvbmN1cnJlbmN5IG11c3QgYmUgbGF0ZXN0fGV4aGF1c3R8cGFyYWxsZWwuJyxcbiAgICAgICAgZGV0YWlsOiB7IGNvbmN1cnJlbmN5IH0sXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBwcmlvcml0eSA9IHBvbGljeS5wcmlvcml0eVxuICAgIGlmIChwcmlvcml0eSAhPT0gdW5kZWZpbmVkICYmIHByaW9yaXR5ICE9PSAndXJnZW50JyAmJiBwcmlvcml0eSAhPT0gJ25vblVyZ2VudCcpIHtcbiAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfREVGJyxcbiAgICAgICAgbWVzc2FnZTogJ3BvbGljeS5wcmlvcml0eSBtdXN0IGJlIHVyZ2VudHxub25VcmdlbnQuJyxcbiAgICAgICAgZGV0YWlsOiB7IHByaW9yaXR5IH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIG1vZHVsZUlkIGlzIG9ubHkgdXNlZCB0byBpbXByb3ZlIGVycm9yIGNvbnRleHQ7IG5vIGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBoZXJlLlxuICB2b2lkIG9wdGlvbnM/Lm1vZHVsZUlkXG59XG5cbmNvbnN0IHZhbGlkYXRlSW5wdXRFeHByID0gKGV4cHI6IHVua25vd24sIG9wdGlvbnM/OiB7IHJlYWRvbmx5IHN0ZXBLZXk/OiBzdHJpbmcgfSk6IHZvaWQgPT4ge1xuICBjb25zdCB2aXNpdCA9IChlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgaWYgKCFpc1JlY29yZChlKSkge1xuICAgICAgdGhyb3cgbWFrZVdvcmtmbG93RXJyb3Ioe1xuICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9JTlBVVF9FWFBSJyxcbiAgICAgICAgbWVzc2FnZTogJ0lucHV0RXhwciBtdXN0IGJlIGFuIG9iamVjdC4nLFxuICAgICAgICBzb3VyY2U6IHsgc3RlcEtleTogb3B0aW9ucz8uc3RlcEtleSB9LFxuICAgICAgICBkZXRhaWw6IHsgZXhwcjogZSB9LFxuICAgICAgfSlcbiAgICB9XG4gICAgY29uc3Qga2luZCA9IGUua2luZFxuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSAncGF5bG9hZCc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAncGF5bG9hZC5wYXRoJzoge1xuICAgICAgICBjb25zdCBwb2ludGVyID0gZS5wb2ludGVyXG4gICAgICAgIGlmICh0eXBlb2YgcG9pbnRlciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9JTlBVVF9FWFBSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnB1dEV4cHIucGF5bG9hZC5wYXRoLnBvaW50ZXIgbXVzdCBiZSBhIHN0cmluZy4nLFxuICAgICAgICAgICAgc291cmNlOiB7IHN0ZXBLZXk6IG9wdGlvbnM/LnN0ZXBLZXkgfSxcbiAgICAgICAgICAgIGRldGFpbDogeyBwb2ludGVyIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvbnN0Jzoge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGUudmFsdWVcbiAgICAgICAgaWYgKCFpc0pzb25WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9JTlBVVF9FWFBSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnB1dEV4cHIuY29uc3QudmFsdWUgbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZS4nLFxuICAgICAgICAgICAgc291cmNlOiB7IHN0ZXBLZXk6IG9wdGlvbnM/LnN0ZXBLZXkgfSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBlLmZpZWxkc1xuICAgICAgICBpZiAoIWlzUmVjb3JkKGZpZWxkcykpIHtcbiAgICAgICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9JTlBVVF9FWFBSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnB1dEV4cHIub2JqZWN0LmZpZWxkcyBtdXN0IGJlIGEgcmVjb3JkLicsXG4gICAgICAgICAgICBzb3VyY2U6IHsgc3RlcEtleTogb3B0aW9ucz8uc3RlcEtleSB9LFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB2IG9mIE9iamVjdC52YWx1ZXMoZmllbGRzKSkge1xuICAgICAgICAgIHZpc2l0KHYpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBjYXNlICdtZXJnZSc6IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBlLml0ZW1zXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShpdGVtcykpIHtcbiAgICAgICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgICAgICBjb2RlOiAnV09SS0ZMT1dfSU5WQUxJRF9JTlBVVF9FWFBSJyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnB1dEV4cHIubWVyZ2UuaXRlbXMgbXVzdCBiZSBhbiBhcnJheS4nLFxuICAgICAgICAgICAgc291cmNlOiB7IHN0ZXBLZXk6IG9wdGlvbnM/LnN0ZXBLZXkgfSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgIHZpc2l0KGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBtYWtlV29ya2Zsb3dFcnJvcih7XG4gICAgICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfSU5QVVRfRVhQUicsXG4gICAgICAgICAgbWVzc2FnZTogJ1Vua25vd24gSW5wdXRFeHByIGtpbmQuJyxcbiAgICAgICAgICBzb3VyY2U6IHsgc3RlcEtleTogb3B0aW9ucz8uc3RlcEtleSB9LFxuICAgICAgICAgIGRldGFpbDogeyBraW5kIH0sXG4gICAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgdmlzaXQoZXhwcilcbn1cblxuLy8gLS0tLSBTdGF0aWMgSVIgY29tcGlsYXRpb24gLS0tLVxuXG5jb25zdCBtYWtlRGlnZXN0ID0gKHByZWZpeDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHN0cmluZyA9PiBgJHtwcmVmaXh9OiR7Zm52MWEzMihzdGFibGVTdHJpbmdpZnkodmFsdWUpKX1gXG5cbmNvbnN0IG1ha2VUcmlnZ2VyTm9kZUlkID0gKHByb2dyYW1JZDogc3RyaW5nKTogV29ya2Zsb3dOb2RlSWQgPT4gYHdmX3RyaWdnZXJfdjE6JHtmbnYxYTMyKHByb2dyYW1JZCl9YFxuXG5jb25zdCBtYWtlU3RlcE5vZGVJZCA9IChwcm9ncmFtSWQ6IHN0cmluZywgc3RlcEtleTogU3RlcEtleSwga2luZDogc3RyaW5nKTogV29ya2Zsb3dOb2RlSWQgPT5cbiAgYHdmX25vZGVfdjE6JHtmbnYxYTMyKGAke3Byb2dyYW1JZH1cXHUwMDAwJHtzdGVwS2V5fVxcdTAwMDAke2tpbmR9YCl9YFxuXG5jb25zdCBidWRnZXRKc29uVmFsdWUgPSAodmFsdWU6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSA9PiBwcm9qZWN0SnNvblZhbHVlKHZhbHVlKS52YWx1ZVxuXG5jb25zdCBidWRnZXRJbnB1dEV4cHIgPSAoZXhwcjogSW5wdXRFeHByVjEpOiBJbnB1dEV4cHJWMSA9PiB7XG4gIHN3aXRjaCAoZXhwci5raW5kKSB7XG4gICAgY2FzZSAncGF5bG9hZCc6XG4gICAgY2FzZSAncGF5bG9hZC5wYXRoJzpcbiAgICAgIHJldHVybiBleHByXG4gICAgY2FzZSAnY29uc3QnOiB7XG4gICAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IGV4cHIudmFsdWVcbiAgICAgIGlmICghaXNKc29uVmFsdWUodmFsdWUpKSByZXR1cm4gZXhwclxuICAgICAgcmV0dXJuIHsgLi4uZXhwciwgdmFsdWU6IGJ1ZGdldEpzb25WYWx1ZShleHByLnZhbHVlKSB9XG4gICAgfVxuICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgIGNvbnN0IG91dDogeyBbazogc3RyaW5nXTogSW5wdXRFeHByVjEgfSA9IHt9XG4gICAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMoZXhwci5maWVsZHMpLnNvcnQoKSkge1xuICAgICAgICBvdXRba10gPSBidWRnZXRJbnB1dEV4cHIoZXhwci5maWVsZHNba10hKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uZXhwciwgZmllbGRzOiBvdXQgfVxuICAgIH1cbiAgICBjYXNlICdtZXJnZSc6XG4gICAgICByZXR1cm4geyAuLi5leHByLCBpdGVtczogZXhwci5pdGVtcy5tYXAoYnVkZ2V0SW5wdXRFeHByKSB9XG4gIH1cbn1cblxuY29uc3QgdG9TdGF0aWNTdGVwID0gKHN0ZXA6IFdvcmtmbG93U3RlcFYxKTogV29ya2Zsb3dTdGF0aWNTdGVwID0+IHtcbiAgc3dpdGNoIChzdGVwLmtpbmQpIHtcbiAgICBjYXNlICdkaXNwYXRjaCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnZGlzcGF0Y2gnLFxuICAgICAgICBhY3Rpb25UYWc6IHN0ZXAuYWN0aW9uVGFnLFxuICAgICAgICAuLi4oc3RlcC5wYXlsb2FkID8geyBwYXlsb2FkOiBidWRnZXRJbnB1dEV4cHIoc3RlcC5wYXlsb2FkKSB9IDogbnVsbCksXG4gICAgICB9XG4gICAgY2FzZSAnZGVsYXknOlxuICAgICAgcmV0dXJuIHsga2luZDogJ2RlbGF5JywgbXM6IHN0ZXAubXMgfVxuICAgIGNhc2UgJ2NhbGwnOiB7XG4gICAgICBjb25zdCBwb2xpY3kgPVxuICAgICAgICBzdGVwLnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkIHx8IHN0ZXAucmV0cnkgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi4oc3RlcC50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCA/IHsgdGltZW91dE1zOiBzdGVwLnRpbWVvdXRNcyB9IDogbnVsbCksXG4gICAgICAgICAgICAgIC4uLihzdGVwLnJldHJ5ICE9PSB1bmRlZmluZWQgPyB7IHJldHJ5OiB7IHRpbWVzOiBzdGVwLnJldHJ5LnRpbWVzIH0gfSA6IG51bGwpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICByZXR1cm4ge1xuICAgICAgICBraW5kOiAnY2FsbCcsXG4gICAgICAgIHNlcnZpY2VJZDogc3RlcC5zZXJ2aWNlSWQsXG4gICAgICAgIC4uLihzdGVwLmlucHV0ID8geyBpbnB1dDogYnVkZ2V0SW5wdXRFeHByKHN0ZXAuaW5wdXQpIH0gOiBudWxsKSxcbiAgICAgICAgLi4uKHBvbGljeSA/IHsgcG9saWN5IH0gOiBudWxsKSxcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbXBpbGVXb3JrZmxvd1N0YXRpY0lyVjEgPSAoYXJnczoge1xuICByZWFkb25seSBtb2R1bGVJZDogc3RyaW5nXG4gIHJlYWRvbmx5IGRlZjogV29ya2Zsb3dEZWZWMVxufSk6IFdvcmtmbG93U3RhdGljSXJWMSA9PiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVXb3JrZmxvd0RlZlYxKGFyZ3MuZGVmKVxuICB2YWxpZGF0ZVdvcmtmbG93RGVmVjEobm9ybWFsaXplZCwgeyBtb2R1bGVJZDogYXJncy5tb2R1bGVJZCB9KVxuXG4gIGNvbnN0IHByb2dyYW1JZDogV29ya2Zsb3dTdGFibGVJZCA9IGAke2FyZ3MubW9kdWxlSWR9LiR7bm9ybWFsaXplZC5sb2NhbElkfWBcbiAgY29uc3QgdHJpZ2dlck5vZGVJZCA9IG1ha2VUcmlnZ2VyTm9kZUlkKHByb2dyYW1JZClcblxuICBjb25zdCBmcmFnbWVudEJ5U3RlcEtleSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KClcbiAgaWYgKG5vcm1hbGl6ZWQuc291cmNlcyAmJiB0eXBlb2Ygbm9ybWFsaXplZC5zb3VyY2VzID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKG5vcm1hbGl6ZWQuc291cmNlcykpIHtcbiAgICAgIGZyYWdtZW50QnlTdGVwS2V5LnNldChrLCBpc1JlY29yZCh2KSA/IGFzTm9uRW1wdHlTdHJpbmcodi5mcmFnbWVudElkKSA6IHVuZGVmaW5lZClcbiAgICB9XG4gIH1cblxuICBjb25zdCBub2Rlc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIFdvcmtmbG93Tm9kZUlkPigpXG5cbiAgY29uc3QgY29sbGVjdE5vZGVzID0gKHN0ZXBzOiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcFYxPikgPT4ge1xuICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwcykge1xuICAgICAgY29uc3QgaWQgPSBtYWtlU3RlcE5vZGVJZChwcm9ncmFtSWQsIHN0ZXAua2V5LCBzdGVwLmtpbmQpXG4gICAgICBub2Rlc0J5S2V5LnNldChzdGVwLmtleSwgaWQpXG4gICAgICBpZiAoc3RlcC5raW5kID09PSAnY2FsbCcpIHtcbiAgICAgICAgY29sbGVjdE5vZGVzKHN0ZXAub25TdWNjZXNzKVxuICAgICAgICBjb2xsZWN0Tm9kZXMoc3RlcC5vbkZhaWx1cmUpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbGxlY3ROb2Rlcyhub3JtYWxpemVkLnN0ZXBzKVxuXG4gIGNvbnN0IG5vZGVzOiBXb3JrZmxvd1N0YXRpY05vZGVbXSA9IFtcbiAgICB7XG4gICAgICBpZDogdHJpZ2dlck5vZGVJZCxcbiAgICAgIGtpbmQ6ICd0cmlnZ2VyJyxcbiAgICAgIHRyaWdnZXI6IG5vcm1hbGl6ZWQudHJpZ2dlcixcbiAgICB9LFxuICBdXG5cbiAgY29uc3QgYWRkU3RlcE5vZGVzID0gKHN0ZXBzOiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcFYxPikgPT4ge1xuICAgIGZvciAoY29uc3Qgc3RlcCBvZiBzdGVwcykge1xuICAgICAgY29uc3QgaWQgPSBub2Rlc0J5S2V5LmdldChzdGVwLmtleSlcbiAgICAgIGlmICghaWQpIGNvbnRpbnVlXG4gICAgICBjb25zdCBmcmFnbWVudElkID0gZnJhZ21lbnRCeVN0ZXBLZXkuZ2V0KHN0ZXAua2V5KVxuICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgIGlkLFxuICAgICAgICBraW5kOiAnc3RlcCcsXG4gICAgICAgIHN0ZXA6IHRvU3RhdGljU3RlcChzdGVwKSxcbiAgICAgICAgc291cmNlOiB7XG4gICAgICAgICAgc3RlcEtleTogc3RlcC5rZXksXG4gICAgICAgICAgLi4uKGZyYWdtZW50SWQgPyB7IGZyYWdtZW50SWQgfSA6IG51bGwpLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIGlmIChzdGVwLmtpbmQgPT09ICdjYWxsJykge1xuICAgICAgICBhZGRTdGVwTm9kZXMoc3RlcC5vblN1Y2Nlc3MpXG4gICAgICAgIGFkZFN0ZXBOb2RlcyhzdGVwLm9uRmFpbHVyZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgYWRkU3RlcE5vZGVzKG5vcm1hbGl6ZWQuc3RlcHMpXG5cbiAgY29uc3QgZWRnZXM6IFdvcmtmbG93RWRnZVtdID0gW11cblxuICBjb25zdCBwdXNoRWRnZSA9IChmcm9tOiBXb3JrZmxvd05vZGVJZCwgdG86IFdvcmtmbG93Tm9kZUlkLCBraW5kOiBXb3JrZmxvd0VkZ2VLaW5kKTogdm9pZCA9PiB7XG4gICAgZWRnZXMucHVzaCh7IGZyb20sIHRvLCBraW5kIH0pXG4gIH1cblxuICBjb25zdCBjb21waWxlQmxvY2sgPSAoYXJnczoge1xuICAgIHJlYWRvbmx5IHN0ZXBzOiBSZWFkb25seUFycmF5PFdvcmtmbG93U3RlcFYxPlxuICAgIHJlYWRvbmx5IGVudHJ5RnJvbTogUmVhZG9ubHlBcnJheTxXb3JrZmxvd05vZGVJZD5cbiAgICByZWFkb25seSBlbnRyeUtpbmQ6IFdvcmtmbG93RWRnZUtpbmRcbiAgICByZWFkb25seSBjb250aW51YXRpb24/OiBXb3JrZmxvd05vZGVJZFxuICB9KTogdm9pZCA9PiB7XG4gICAgaWYgKGFyZ3Muc3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoYXJncy5jb250aW51YXRpb24pIHtcbiAgICAgICAgZm9yIChjb25zdCBmcm9tIG9mIGFyZ3MuZW50cnlGcm9tKSB7XG4gICAgICAgICAgcHVzaEVkZ2UoZnJvbSwgYXJncy5jb250aW51YXRpb24sIGFyZ3MuZW50cnlLaW5kKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdCA9IGFyZ3Muc3RlcHNbMF0hXG4gICAgY29uc3QgZmlyc3RJZCA9IG5vZGVzQnlLZXkuZ2V0KGZpcnN0LmtleSlcbiAgICBpZiAoIWZpcnN0SWQpIHtcbiAgICAgIHRocm93IG1ha2VXb3JrZmxvd0Vycm9yKHtcbiAgICAgICAgY29kZTogJ1dPUktGTE9XX0lOVkFMSURfU1RFUCcsXG4gICAgICAgIG1lc3NhZ2U6ICdJbnRlcm5hbCBlcnJvcjogbWlzc2luZyBub2RlIGlkIGZvciBzdGVwS2V5LicsXG4gICAgICAgIHByb2dyYW1JZCxcbiAgICAgICAgc291cmNlOiB7IHN0ZXBLZXk6IGZpcnN0LmtleSB9LFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZyb20gb2YgYXJncy5lbnRyeUZyb20pIHtcbiAgICAgIHB1c2hFZGdlKGZyb20sIGZpcnN0SWQsIGFyZ3MuZW50cnlLaW5kKVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXBpbGVTdGVwQW5kVGFpbCA9IChzdGVwOiBXb3JrZmxvd1N0ZXBWMSwgdGFpbDogUmVhZG9ubHlBcnJheTxXb3JrZmxvd1N0ZXBWMT4sIGNvbnRpbnVhdGlvbj86IFdvcmtmbG93Tm9kZUlkKSA9PiB7XG4gICAgICBjb25zdCBzdGVwSWQgPSBub2Rlc0J5S2V5LmdldChzdGVwLmtleSlcbiAgICAgIGlmICghc3RlcElkKSByZXR1cm5cblxuICAgICAgaWYgKHN0ZXAua2luZCAhPT0gJ2NhbGwnKSB7XG4gICAgICAgIGNvbXBpbGVCbG9jayh7IHN0ZXBzOiB0YWlsLCBlbnRyeUZyb206IFtzdGVwSWRdLCBlbnRyeUtpbmQ6ICduZXh0JywgY29udGludWF0aW9uIH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250ID0gdGFpbC5sZW5ndGggPiAwID8gbm9kZXNCeUtleS5nZXQodGFpbFswXSEua2V5KSA6IGNvbnRpbnVhdGlvblxuXG4gICAgICBjb21waWxlQmxvY2soe1xuICAgICAgICBzdGVwczogc3RlcC5vblN1Y2Nlc3MsXG4gICAgICAgIGVudHJ5RnJvbTogW3N0ZXBJZF0sXG4gICAgICAgIGVudHJ5S2luZDogJ3N1Y2Nlc3MnLFxuICAgICAgICBjb250aW51YXRpb246IGNvbnQsXG4gICAgICB9KVxuICAgICAgY29tcGlsZUJsb2NrKHtcbiAgICAgICAgc3RlcHM6IHN0ZXAub25GYWlsdXJlLFxuICAgICAgICBlbnRyeUZyb206IFtzdGVwSWRdLFxuICAgICAgICBlbnRyeUtpbmQ6ICdmYWlsdXJlJyxcbiAgICAgICAgY29udGludWF0aW9uOiBjb250LFxuICAgICAgfSlcblxuICAgICAgY29tcGlsZUJsb2NrKHsgc3RlcHM6IHRhaWwsIGVudHJ5RnJvbTogW10sIGVudHJ5S2luZDogJ25leHQnLCBjb250aW51YXRpb24gfSlcbiAgICB9XG5cbiAgICBjb21waWxlU3RlcEFuZFRhaWwoZmlyc3QsIGFyZ3Muc3RlcHMuc2xpY2UoMSksIGFyZ3MuY29udGludWF0aW9uKVxuICB9XG5cbiAgY29tcGlsZUJsb2NrKHsgc3RlcHM6IG5vcm1hbGl6ZWQuc3RlcHMsIGVudHJ5RnJvbTogW3RyaWdnZXJOb2RlSWRdLCBlbnRyeUtpbmQ6ICduZXh0JywgY29udGludWF0aW9uOiB1bmRlZmluZWQgfSlcblxuICAvLyBTdGFibGUgb3JkZXJpbmcgKGZvciBkaWZmL2RpZ2VzdCkuXG4gIG5vZGVzLnNvcnQoKGEsIGIpID0+IChhLmlkIDwgYi5pZCA/IC0xIDogYS5pZCA+IGIuaWQgPyAxIDogMCkpXG4gIGVkZ2VzLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5mcm9tICE9PSBiLmZyb20pIHJldHVybiBhLmZyb20gPCBiLmZyb20gPyAtMSA6IDFcbiAgICBpZiAoYS50byAhPT0gYi50bykgcmV0dXJuIGEudG8gPCBiLnRvID8gLTEgOiAxXG4gICAgY29uc3QgYWsgPSBTdHJpbmcoYS5raW5kID8/ICcnKVxuICAgIGNvbnN0IGJrID0gU3RyaW5nKGIua2luZCA/PyAnJylcbiAgICBpZiAoYWsgIT09IGJrKSByZXR1cm4gYWsgPCBiayA/IC0xIDogMVxuICAgIHJldHVybiAwXG4gIH0pXG5cbiAgY29uc3QgbWV0YTogUmVjb3JkPHN0cmluZywgSnNvblZhbHVlPiB8IHVuZGVmaW5lZCA9ICgoKSA9PiB7XG4gICAgY29uc3QgZ2VuZXJhdG9yID0gbm9ybWFsaXplZC5tZXRhPy5nZW5lcmF0b3JcbiAgICBpZiAoZ2VuZXJhdG9yID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4geyBnZW5lcmF0b3I6IGJ1ZGdldEpzb25WYWx1ZShnZW5lcmF0b3IpIH1cbiAgfSkoKVxuXG4gIGNvbnN0IGlyTm9EaWdlc3QgPSB7XG4gICAgdmVyc2lvbjogMSxcbiAgICBwcm9ncmFtSWQsXG4gICAgbm9kZXMsXG4gICAgZWRnZXMsXG4gICAgcG9saWN5OiBub3JtYWxpemVkLnBvbGljeSxcbiAgICBtZXRhLFxuICB9IGFzIGNvbnN0XG5cbiAgY29uc3QgZGlnZXN0ID0gbWFrZURpZ2VzdCgnd29ya2Zsb3dfaXJfdjEnLCBpck5vRGlnZXN0KVxuXG4gIHJldHVybiB7XG4gICAgLi4uaXJOb0RpZ2VzdCxcbiAgICBkaWdlc3QsXG4gIH1cbn1cblxuLy8gLS0tLSBSdW50aW1lIGNvbXBpbGF0aW9uIChJbnB1dEV4cHIgcHJlY29tcGlsZSArIHNoYXBlIGNoZWNrcykgLS0tLVxuXG5leHBvcnQgdHlwZSBDb21waWxlZFdvcmtmbG93U3RlcCA9XG4gIHwgeyByZWFkb25seSBraW5kOiAnZGlzcGF0Y2gnOyByZWFkb25seSBrZXk6IFN0ZXBLZXk7IHJlYWRvbmx5IGFjdGlvblRhZzogc3RyaW5nOyByZWFkb25seSBwYXlsb2FkPzogQ29tcGlsZWRJbnB1dEV4cHIgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ2RlbGF5JzsgcmVhZG9ubHkga2V5OiBTdGVwS2V5OyByZWFkb25seSBtczogbnVtYmVyIH1cbiAgfCB7XG4gICAgICByZWFkb25seSBraW5kOiAnY2FsbCdcbiAgICAgIHJlYWRvbmx5IGtleTogU3RlcEtleVxuICAgICAgcmVhZG9ubHkgc2VydmljZUlkOiBzdHJpbmdcbiAgICAgIHJlYWRvbmx5IGlucHV0PzogQ29tcGlsZWRJbnB1dEV4cHJcbiAgICAgIHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlclxuICAgICAgcmVhZG9ubHkgcmV0cnlUaW1lcz86IG51bWJlclxuICAgICAgcmVhZG9ubHkgb25TdWNjZXNzOiBSZWFkb25seUFycmF5PENvbXBpbGVkV29ya2Zsb3dTdGVwPlxuICAgICAgcmVhZG9ubHkgb25GYWlsdXJlOiBSZWFkb25seUFycmF5PENvbXBpbGVkV29ya2Zsb3dTdGVwPlxuICAgIH1cblxuZXhwb3J0IGNvbnN0IGNvbXBpbGVXb3JrZmxvd1J1bnRpbWVTdGVwc1YxID0gKGFyZ3M6IHtcbiAgcmVhZG9ubHkgZGVmOiBXb3JrZmxvd0RlZlYxXG59KTogUmVhZG9ubHlBcnJheTxDb21waWxlZFdvcmtmbG93U3RlcD4gPT4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplV29ya2Zsb3dEZWZWMShhcmdzLmRlZilcbiAgdmFsaWRhdGVXb3JrZmxvd0RlZlYxKG5vcm1hbGl6ZWQpXG5cbiAgY29uc3QgY29tcGlsZVN0ZXAgPSAoc3RlcDogV29ya2Zsb3dTdGVwVjEpOiBDb21waWxlZFdvcmtmbG93U3RlcCA9PiB7XG4gICAgY29uc3Qgc3RlcEtleSA9IHN0ZXAua2V5XG4gICAgc3dpdGNoIChzdGVwLmtpbmQpIHtcbiAgICAgIGNhc2UgJ2Rpc3BhdGNoJzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBraW5kOiAnZGlzcGF0Y2gnLFxuICAgICAgICAgIGtleTogc3RlcC5rZXksXG4gICAgICAgICAgYWN0aW9uVGFnOiBzdGVwLmFjdGlvblRhZyxcbiAgICAgICAgICAuLi4oc3RlcC5wYXlsb2FkID8geyBwYXlsb2FkOiBjb21waWxlSW5wdXRFeHByKHN0ZXAucGF5bG9hZCwgeyBzdGVwS2V5IH0pIH0gOiBudWxsKSxcbiAgICAgICAgfVxuICAgICAgY2FzZSAnZGVsYXknOlxuICAgICAgICByZXR1cm4geyBraW5kOiAnZGVsYXknLCBrZXk6IHN0ZXAua2V5LCBtczogc3RlcC5tcyB9XG4gICAgICBjYXNlICdjYWxsJzoge1xuICAgICAgICBjb25zdCByZXRyeVRpbWVzID0gc3RlcC5yZXRyeT8udGltZXNcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBraW5kOiAnY2FsbCcsXG4gICAgICAgICAga2V5OiBzdGVwLmtleSxcbiAgICAgICAgICBzZXJ2aWNlSWQ6IHN0ZXAuc2VydmljZUlkLFxuICAgICAgICAgIC4uLihzdGVwLmlucHV0ID8geyBpbnB1dDogY29tcGlsZUlucHV0RXhwcihzdGVwLmlucHV0LCB7IHN0ZXBLZXkgfSkgfSA6IG51bGwpLFxuICAgICAgICAgIC4uLihzdGVwLnRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkID8geyB0aW1lb3V0TXM6IHN0ZXAudGltZW91dE1zIH0gOiBudWxsKSxcbiAgICAgICAgICAuLi4ocmV0cnlUaW1lcyAhPT0gdW5kZWZpbmVkID8geyByZXRyeVRpbWVzIH0gOiBudWxsKSxcbiAgICAgICAgICBvblN1Y2Nlc3M6IHN0ZXAub25TdWNjZXNzLm1hcChjb21waWxlU3RlcCksXG4gICAgICAgICAgb25GYWlsdXJlOiBzdGVwLm9uRmFpbHVyZS5tYXAoY29tcGlsZVN0ZXApLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWQuc3RlcHMubWFwKGNvbXBpbGVTdGVwKVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7O0FBNEJBLElBQU0sY0FBYyxDQUFDLFdBQStCO0FBQ2xELE1BQUksWUFBWSxNQUFNLEVBQUcsUUFBTztBQUNoQyxTQUFPLGlCQUFpQixNQUFNLEVBQUU7QUFDbEM7QUFFTyxJQUFNLG9CQUFvQixDQUFDLFNBTWI7QUFDbkIsUUFBTSxhQUFhLEtBQUssV0FBVyxTQUFZLFlBQVksS0FBSyxNQUFNLElBQUk7QUFDMUUsUUFBTSxNQUFNLEtBQUssV0FBVyxTQUFZLEdBQUcsS0FBSyxPQUFPO0FBQUEsVUFBYSxnQkFBZ0IsVUFBVSxDQUFDLE1BQU0sS0FBSztBQUUxRyxTQUFPLE9BQU8sT0FBTyxJQUFJLE1BQU0sR0FBRyxHQUFHO0FBQUEsSUFDbkMsTUFBTTtBQUFBLElBQ04sTUFBTSxLQUFLO0FBQUEsSUFDWCxXQUFXLEtBQUs7QUFBQSxJQUNoQixRQUFRLEtBQUs7QUFBQSxJQUNiLFFBQVE7QUFBQSxFQUNWLENBQUM7QUFDSDs7O0FDNUNBLElBQU0scUJBQXFCLENBQUMsUUFBd0IsSUFBSSxRQUFRLE9B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QixRQUFJLE9BQU8sR0FBSSxRQUFPLEtBQUssS0FBSyxLQUFLO0FBQ3JDLFdBQU87QUFBQSxFQUNULENBQUM7QUFFRCxRQUFNLFFBQStDLE1BQU07QUFDekQsVUFBTSxZQUFZLFdBQVcsTUFBTTtBQUNuQyxRQUFJLGNBQWMsT0FBVyxRQUFPO0FBQ3BDLFdBQU8sRUFBRSxXQUFXLGdCQUFnQixTQUFTLEVBQUU7QUFBQSxFQUNqRCxHQUFHO0FBRUgsUUFBTSxhQUFhO0FBQUEsSUFDakIsU0FBUztBQUFBLElBQ1Q7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsUUFBUSxXQUFXO0FBQUEsSUFDbkI7QUFBQSxFQUNGO0FBRUEsUUFBTSxTQUFTLFdBQVcsa0JBQWtCLFVBQVU7QUFFdEQsU0FBTztBQUFBLElBQ0wsR0FBRztBQUFBLElBQ0g7QUFBQSxFQUNGO0FBQ0Y7QUFrQk8sSUFBTSxnQ0FBZ0MsQ0FBQyxTQUVIO0FBQ3pDLFFBQU0sYUFBYSx1QkFBdUIsS0FBSyxHQUFHO0FBQ2xELHdCQUFzQixVQUFVO0FBRWhDLFFBQU0sY0FBYyxDQUFDLFNBQStDO0FBQ2xFLFVBQU0sVUFBVSxLQUFLO0FBQ3JCLFlBQVEsS0FBSyxNQUFNO0FBQUEsTUFDakIsS0FBSztBQUNILGVBQU87QUFBQSxVQUNMLE1BQU07QUFBQSxVQUNOLEtBQUssS0FBSztBQUFBLFVBQ1YsV0FBVyxLQUFLO0FBQUEsVUFDaEIsR0FBSSxLQUFLLFVBQVUsRUFBRSxTQUFTLGlCQUFpQixLQUFLLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFBRSxJQUFJO0FBQUEsUUFDaEY7QUFBQSxNQUNGLEtBQUs7QUFDSCxlQUFPLEVBQUUsTUFBTSxTQUFTLEtBQUssS0FBSyxLQUFLLElBQUksS0FBSyxHQUFHO0FBQUEsTUFDckQsS0FBSyxRQUFRO0FBQ1gsY0FBTSxhQUFhLEtBQUssT0FBTztBQUMvQixlQUFPO0FBQUEsVUFDTCxNQUFNO0FBQUEsVUFDTixLQUFLLEtBQUs7QUFBQSxVQUNWLFdBQVcsS0FBSztBQUFBLFVBQ2hCLEdBQUksS0FBSyxRQUFRLEVBQUUsT0FBTyxpQkFBaUIsS0FBSyxPQUFPLEVBQUUsUUFBUSxDQUFDLEVBQUUsSUFBSTtBQUFBLFVBQ3hFLEdBQUksS0FBSyxjQUFjLFNBQVksRUFBRSxXQUFXLEtBQUssVUFBVSxJQUFJO0FBQUEsVUFDbkUsR0FBSSxlQUFlLFNBQVksRUFBRSxXQUFXLElBQUk7QUFBQSxVQUNoRCxXQUFXLEtBQUssVUFBVSxJQUFJLFdBQVc7QUFBQSxVQUN6QyxXQUFXLEtBQUssVUFBVSxJQUFJLFdBQVc7QUFBQSxRQUMzQztBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU8sV0FBVyxNQUFNLElBQUksV0FBVztBQUN6QzsiLAogICJuYW1lcyI6IFsiaXNSZWNvcmQiLCAiYXJncyJdCn0K
|