@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,732 @@
|
|
|
1
|
+
// @logix/core subpath bundles for @logix/sandbox
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
LifecycleContext,
|
|
5
|
+
makeLogicPhaseError
|
|
6
|
+
} from "./chunk-YOBLFWDV.js";
|
|
7
|
+
import {
|
|
8
|
+
create
|
|
9
|
+
} from "./chunk-Y5I45PEB.js";
|
|
10
|
+
import {
|
|
11
|
+
inSyncTransactionFiber,
|
|
12
|
+
makeTaskRunner
|
|
13
|
+
} from "./chunk-E7BIWMQQ.js";
|
|
14
|
+
import {
|
|
15
|
+
Tag
|
|
16
|
+
} from "./chunk-ZWE3P6X2.js";
|
|
17
|
+
import {
|
|
18
|
+
getRuntimeInternals,
|
|
19
|
+
setBoundInternals
|
|
20
|
+
} from "./chunk-6FKWRVP4.js";
|
|
21
|
+
import {
|
|
22
|
+
isDevEnv
|
|
23
|
+
} from "./chunk-GP37MEGJ.js";
|
|
24
|
+
import {
|
|
25
|
+
make
|
|
26
|
+
} from "./chunk-LTWLVCKQ.js";
|
|
27
|
+
import {
|
|
28
|
+
RunSessionTag
|
|
29
|
+
} from "./chunk-RS5FFPUV.js";
|
|
30
|
+
import {
|
|
31
|
+
currentDiagnosticsLevel,
|
|
32
|
+
record
|
|
33
|
+
} from "./chunk-CVZPRIDB.js";
|
|
34
|
+
import {
|
|
35
|
+
makeMatch,
|
|
36
|
+
makeMatchTag
|
|
37
|
+
} from "./chunk-3U4CAKCX.js";
|
|
38
|
+
|
|
39
|
+
// ../logix-core/src/internal/runtime/core/mutativePatches.ts
|
|
40
|
+
var toPatchPathString = (path) => {
|
|
41
|
+
if (typeof path === "string") {
|
|
42
|
+
const trimmed = path.trim();
|
|
43
|
+
return trimmed.length > 0 ? trimmed : void 0;
|
|
44
|
+
}
|
|
45
|
+
if (!Array.isArray(path)) return void 0;
|
|
46
|
+
const parts = [];
|
|
47
|
+
for (const seg of path) {
|
|
48
|
+
if (typeof seg === "string") {
|
|
49
|
+
if (seg.length > 0) parts.push(seg);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (typeof seg === "number" && Number.isFinite(seg)) {
|
|
53
|
+
parts.push(String(Math.floor(seg)));
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (parts.length === 0) return "*";
|
|
58
|
+
return parts.join(".");
|
|
59
|
+
};
|
|
60
|
+
var mutateWithPatchPaths = (base, mutator) => {
|
|
61
|
+
const out = create(base, mutator, {
|
|
62
|
+
enablePatches: {
|
|
63
|
+
pathAsArray: true,
|
|
64
|
+
arrayLengthAssignment: false
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
if (!Array.isArray(out)) {
|
|
68
|
+
return { nextState: out, patchPaths: [] };
|
|
69
|
+
}
|
|
70
|
+
const nextState = out[0];
|
|
71
|
+
const patches = out[1] ?? [];
|
|
72
|
+
const set = /* @__PURE__ */ new Set();
|
|
73
|
+
for (const patch of patches) {
|
|
74
|
+
const p = toPatchPathString(patch?.path);
|
|
75
|
+
if (!p) continue;
|
|
76
|
+
set.add(p);
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
nextState,
|
|
80
|
+
patchPaths: Array.from(set)
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
// ../logix-core/src/internal/runtime/BoundApiRuntime.ts
|
|
85
|
+
import { Context, Effect, FiberRef, Option, Schema, Stream } from "../effect.js";
|
|
86
|
+
var LogicBuilderFactory = (runtime, runtimeInternals) => {
|
|
87
|
+
const flowApi = make(runtime, runtimeInternals);
|
|
88
|
+
return (stream, triggerName) => {
|
|
89
|
+
const runWithStateTransaction = (origin, body) => runtimeInternals.txn.runWithStateTransaction(origin, body);
|
|
90
|
+
const taskRunnerRuntime = {
|
|
91
|
+
moduleId: runtime.moduleId,
|
|
92
|
+
instanceId: runtimeInternals.instanceId,
|
|
93
|
+
runWithStateTransaction,
|
|
94
|
+
resolveConcurrencyPolicy: runtimeInternals.concurrency.resolveConcurrencyPolicy
|
|
95
|
+
};
|
|
96
|
+
const builder = {
|
|
97
|
+
debounce: (ms) => LogicBuilderFactory(runtime, runtimeInternals)(
|
|
98
|
+
flowApi.debounce(ms)(stream),
|
|
99
|
+
triggerName
|
|
100
|
+
),
|
|
101
|
+
throttle: (ms) => LogicBuilderFactory(runtime, runtimeInternals)(
|
|
102
|
+
flowApi.throttle(ms)(stream),
|
|
103
|
+
triggerName
|
|
104
|
+
),
|
|
105
|
+
filter: (predicate) => LogicBuilderFactory(runtime, runtimeInternals)(
|
|
106
|
+
flowApi.filter(predicate)(stream),
|
|
107
|
+
triggerName
|
|
108
|
+
),
|
|
109
|
+
map: (f) => LogicBuilderFactory(runtime, runtimeInternals)(
|
|
110
|
+
stream.pipe(Stream.map(f)),
|
|
111
|
+
triggerName
|
|
112
|
+
),
|
|
113
|
+
run(eff, options) {
|
|
114
|
+
return flowApi.run(eff, options)(stream);
|
|
115
|
+
},
|
|
116
|
+
runLatest(eff, options) {
|
|
117
|
+
return flowApi.runLatest(eff, options)(stream);
|
|
118
|
+
},
|
|
119
|
+
runExhaust(eff, options) {
|
|
120
|
+
return flowApi.runExhaust(eff, options)(stream);
|
|
121
|
+
},
|
|
122
|
+
runParallel(eff, options) {
|
|
123
|
+
return flowApi.runParallel(eff, options)(stream);
|
|
124
|
+
},
|
|
125
|
+
runFork: (eff) => Effect.forkScoped(flowApi.run(eff)(stream)).pipe(
|
|
126
|
+
Effect.asVoid
|
|
127
|
+
),
|
|
128
|
+
runParallelFork: (eff) => Effect.forkScoped(
|
|
129
|
+
flowApi.runParallel(eff)(stream)
|
|
130
|
+
).pipe(
|
|
131
|
+
Effect.asVoid
|
|
132
|
+
),
|
|
133
|
+
runTask: (config) => makeTaskRunner(
|
|
134
|
+
stream,
|
|
135
|
+
"task",
|
|
136
|
+
taskRunnerRuntime,
|
|
137
|
+
{
|
|
138
|
+
...config,
|
|
139
|
+
triggerName: config.triggerName ?? triggerName
|
|
140
|
+
}
|
|
141
|
+
),
|
|
142
|
+
runParallelTask: (config) => makeTaskRunner(
|
|
143
|
+
stream,
|
|
144
|
+
"parallel",
|
|
145
|
+
taskRunnerRuntime,
|
|
146
|
+
{
|
|
147
|
+
...config,
|
|
148
|
+
triggerName: config.triggerName ?? triggerName
|
|
149
|
+
}
|
|
150
|
+
),
|
|
151
|
+
runLatestTask: (config) => makeTaskRunner(
|
|
152
|
+
stream,
|
|
153
|
+
"latest",
|
|
154
|
+
taskRunnerRuntime,
|
|
155
|
+
{
|
|
156
|
+
...config,
|
|
157
|
+
triggerName: config.triggerName ?? triggerName
|
|
158
|
+
}
|
|
159
|
+
),
|
|
160
|
+
runExhaustTask: (config) => makeTaskRunner(
|
|
161
|
+
stream,
|
|
162
|
+
"exhaust",
|
|
163
|
+
taskRunnerRuntime,
|
|
164
|
+
{
|
|
165
|
+
...config,
|
|
166
|
+
triggerName: config.triggerName ?? triggerName
|
|
167
|
+
}
|
|
168
|
+
),
|
|
169
|
+
toStream: () => stream,
|
|
170
|
+
update: (reducer) => Stream.runForEach(
|
|
171
|
+
stream,
|
|
172
|
+
(payload) => taskRunnerRuntime.runWithStateTransaction(
|
|
173
|
+
{
|
|
174
|
+
kind: "watcher:update",
|
|
175
|
+
name: triggerName
|
|
176
|
+
},
|
|
177
|
+
() => Effect.gen(function* () {
|
|
178
|
+
const prev = yield* runtime.getState;
|
|
179
|
+
const next = reducer(prev, payload);
|
|
180
|
+
if (Effect.isEffect(next)) {
|
|
181
|
+
const exit = yield* Effect.exit(
|
|
182
|
+
next
|
|
183
|
+
);
|
|
184
|
+
if (exit._tag === "Failure") {
|
|
185
|
+
yield* Effect.logError("Flow error", exit.cause);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
yield* runtime.setState(exit.value);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
yield* runtime.setState(next);
|
|
192
|
+
})
|
|
193
|
+
)
|
|
194
|
+
).pipe(
|
|
195
|
+
Effect.catchAllCause(
|
|
196
|
+
(cause) => Effect.logError("Flow error", cause)
|
|
197
|
+
)
|
|
198
|
+
),
|
|
199
|
+
mutate: (reducer) => Stream.runForEach(
|
|
200
|
+
stream,
|
|
201
|
+
(payload) => taskRunnerRuntime.runWithStateTransaction(
|
|
202
|
+
{
|
|
203
|
+
kind: "watcher:mutate",
|
|
204
|
+
name: triggerName
|
|
205
|
+
},
|
|
206
|
+
() => Effect.gen(function* () {
|
|
207
|
+
const prev = yield* runtime.getState;
|
|
208
|
+
const recordPatch = runtimeInternals?.txn.recordStatePatch;
|
|
209
|
+
const { nextState, patchPaths } = mutateWithPatchPaths(
|
|
210
|
+
prev,
|
|
211
|
+
(draft) => {
|
|
212
|
+
reducer(draft, payload);
|
|
213
|
+
}
|
|
214
|
+
);
|
|
215
|
+
for (const path of patchPaths) {
|
|
216
|
+
recordPatch?.({
|
|
217
|
+
path,
|
|
218
|
+
reason: "watcher:mutate"
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
yield* runtime.setState(nextState);
|
|
222
|
+
})
|
|
223
|
+
)
|
|
224
|
+
).pipe(
|
|
225
|
+
Effect.catchAllCause(
|
|
226
|
+
(cause) => Effect.logError("Flow error", cause)
|
|
227
|
+
)
|
|
228
|
+
)
|
|
229
|
+
};
|
|
230
|
+
const andThen = (handlerOrEff) => {
|
|
231
|
+
if (typeof handlerOrEff === "function") {
|
|
232
|
+
if (handlerOrEff.length >= 2) {
|
|
233
|
+
return builder.update(handlerOrEff);
|
|
234
|
+
}
|
|
235
|
+
return builder.run(handlerOrEff);
|
|
236
|
+
}
|
|
237
|
+
return builder.run(handlerOrEff);
|
|
238
|
+
};
|
|
239
|
+
const pipe = function() {
|
|
240
|
+
const fns = arguments;
|
|
241
|
+
let acc = builder;
|
|
242
|
+
for (let i = 0; i < fns.length; i++) {
|
|
243
|
+
acc = fns[i](acc);
|
|
244
|
+
}
|
|
245
|
+
return acc;
|
|
246
|
+
};
|
|
247
|
+
return Object.assign(builder, { pipe, andThen });
|
|
248
|
+
};
|
|
249
|
+
};
|
|
250
|
+
function make2(shape, runtime, options) {
|
|
251
|
+
const runtimeInternals = getRuntimeInternals(runtime);
|
|
252
|
+
const getPhase = options?.getPhase ?? (() => "run");
|
|
253
|
+
const getCurrentPhase = () => {
|
|
254
|
+
const phaseService = options?.phaseService;
|
|
255
|
+
const phase = phaseService?.current ?? getPhase();
|
|
256
|
+
return phase === "setup" ? "setup" : "run";
|
|
257
|
+
};
|
|
258
|
+
const guardRunOnly = (kind, api2) => {
|
|
259
|
+
const phaseService = options?.phaseService;
|
|
260
|
+
const phase = phaseService?.current ?? getPhase();
|
|
261
|
+
if (phase === "setup") {
|
|
262
|
+
throw makeLogicPhaseError(
|
|
263
|
+
kind,
|
|
264
|
+
api2,
|
|
265
|
+
"setup",
|
|
266
|
+
options?.moduleId
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
const flowApi = make(runtime, runtimeInternals);
|
|
271
|
+
const makeIntentBuilder = (runtime_) => LogicBuilderFactory(runtime_, runtimeInternals);
|
|
272
|
+
const withLifecycle = (available, missing) => Effect.serviceOption(LifecycleContext).pipe(
|
|
273
|
+
Effect.flatMap(
|
|
274
|
+
(maybe) => Option.match(maybe, {
|
|
275
|
+
onSome: available,
|
|
276
|
+
onNone: missing
|
|
277
|
+
})
|
|
278
|
+
)
|
|
279
|
+
);
|
|
280
|
+
const withPlatform = (invoke) => Effect.serviceOption(Tag).pipe(
|
|
281
|
+
Effect.flatMap(
|
|
282
|
+
(maybe) => Option.match(maybe, {
|
|
283
|
+
onSome: invoke,
|
|
284
|
+
onNone: () => Effect.void
|
|
285
|
+
})
|
|
286
|
+
)
|
|
287
|
+
);
|
|
288
|
+
const emitSetupOnlyViolation = (api2) => record({
|
|
289
|
+
type: "diagnostic",
|
|
290
|
+
moduleId: runtime.moduleId,
|
|
291
|
+
instanceId: runtime.instanceId,
|
|
292
|
+
code: "logic::invalid_phase",
|
|
293
|
+
severity: "error",
|
|
294
|
+
message: `${api2} is setup-only and is not allowed in run phase.`,
|
|
295
|
+
hint: "\u5C06 $.lifecycle.* \u8C03\u7528\u79FB\u52A8\u5230 Module.logic builder \u7684\u540C\u6B65\u90E8\u5206\uFF08return \u4E4B\u524D\uFF09\u7528\u4E8E\u6CE8\u518C\uFF1Brun \u6BB5\u9700\u8981\u52A8\u6001\u8D44\u6E90\u6E05\u7406\u65F6\uFF0C\u8BF7\u4F7F\u7528 Effect.acquireRelease / Scope finalizer\uFF0C\u800C\u4E0D\u662F late \u6CE8\u518C onDestroy\u3002",
|
|
296
|
+
kind: "lifecycle_in_run"
|
|
297
|
+
});
|
|
298
|
+
const createIntentBuilder = (stream, triggerName) => makeIntentBuilder(runtime)(stream, triggerName);
|
|
299
|
+
const onceInRunSession = (key) => Effect.serviceOption(RunSessionTag).pipe(
|
|
300
|
+
Effect.map(
|
|
301
|
+
(maybe) => Option.isSome(maybe) ? maybe.value.local.once(key) : true
|
|
302
|
+
)
|
|
303
|
+
);
|
|
304
|
+
let cachedDiagnosticsLevel;
|
|
305
|
+
const isModuleLike = (value) => Boolean(
|
|
306
|
+
value && typeof value === "object" && ((value._kind === "ModuleDef" || value._kind === "Module") && "tag" in value) && Context.isTag(value.tag)
|
|
307
|
+
);
|
|
308
|
+
const buildModuleHandle = (tag, rt) => {
|
|
309
|
+
const actionsProxy = new Proxy(
|
|
310
|
+
{},
|
|
311
|
+
{
|
|
312
|
+
get: (_target, prop) => (payload) => rt.dispatch({
|
|
313
|
+
_tag: prop,
|
|
314
|
+
payload
|
|
315
|
+
})
|
|
316
|
+
}
|
|
317
|
+
);
|
|
318
|
+
const handle = {
|
|
319
|
+
read: (selector) => Effect.map(rt.getState, selector),
|
|
320
|
+
changes: rt.changes,
|
|
321
|
+
dispatch: rt.dispatch,
|
|
322
|
+
actions$: rt.actions$,
|
|
323
|
+
actions: actionsProxy
|
|
324
|
+
};
|
|
325
|
+
const EXTEND_HANDLE = /* @__PURE__ */ Symbol.for("logix.module.handle.extend");
|
|
326
|
+
const extend = tag?.[EXTEND_HANDLE];
|
|
327
|
+
return typeof extend === "function" ? extend(rt, handle) ?? handle : handle;
|
|
328
|
+
};
|
|
329
|
+
const emitModuleDescriptorOnce = (module, rt) => Effect.gen(function* () {
|
|
330
|
+
if (cachedDiagnosticsLevel === "off") return;
|
|
331
|
+
const key = `module_descriptor:${String(rt.instanceId ?? "unknown")}`;
|
|
332
|
+
const shouldEmit = yield* onceInRunSession(key);
|
|
333
|
+
if (!shouldEmit) return;
|
|
334
|
+
const actionKeys = Object.keys(module.tag?.shape?.actionMap ?? {});
|
|
335
|
+
const internalSymbol = /* @__PURE__ */ Symbol.for("logix.module.internal");
|
|
336
|
+
const internal = module[internalSymbol];
|
|
337
|
+
const logicUnits = (internal?.mounted ?? []).map((u) => ({
|
|
338
|
+
kind: String(u?.kind ?? "user"),
|
|
339
|
+
id: String(u?.id ?? ""),
|
|
340
|
+
derived: u?.derived ? true : void 0,
|
|
341
|
+
name: typeof u?.name === "string" ? u.name : void 0
|
|
342
|
+
}));
|
|
343
|
+
const schemaKeys = module.schemas && typeof module.schemas === "object" ? Object.keys(module.schemas) : void 0;
|
|
344
|
+
const meta = module.meta && typeof module.meta === "object" ? module.meta : void 0;
|
|
345
|
+
const source = module.dev?.source;
|
|
346
|
+
const traitsSnapshot = runtimeInternals.traits.getModuleTraitsSnapshot();
|
|
347
|
+
const traits = traitsSnapshot ? {
|
|
348
|
+
digest: traitsSnapshot.digest,
|
|
349
|
+
count: traitsSnapshot.traits.length
|
|
350
|
+
} : void 0;
|
|
351
|
+
const data = {
|
|
352
|
+
id: module.id,
|
|
353
|
+
moduleId: String(rt.moduleId),
|
|
354
|
+
instanceId: String(rt.instanceId),
|
|
355
|
+
actionKeys,
|
|
356
|
+
logicUnits,
|
|
357
|
+
schemaKeys,
|
|
358
|
+
meta,
|
|
359
|
+
source,
|
|
360
|
+
traits
|
|
361
|
+
};
|
|
362
|
+
yield* record({
|
|
363
|
+
type: "trace:module:descriptor",
|
|
364
|
+
moduleId: rt.moduleId,
|
|
365
|
+
instanceId: rt.instanceId,
|
|
366
|
+
data
|
|
367
|
+
});
|
|
368
|
+
});
|
|
369
|
+
const resolveModuleRuntime = (tag) => Effect.gen(function* () {
|
|
370
|
+
const requestedModuleId = typeof tag?.id === "string" ? tag.id : void 0;
|
|
371
|
+
const fromModuleId = typeof options?.moduleId === "string" ? options.moduleId : void 0;
|
|
372
|
+
const fromEnv = yield* Effect.serviceOption(tag);
|
|
373
|
+
if (Option.isSome(fromEnv)) {
|
|
374
|
+
return fromEnv.value;
|
|
375
|
+
}
|
|
376
|
+
const tokenId = requestedModuleId ?? "<unknown module id>";
|
|
377
|
+
const fix = isDevEnv() ? [
|
|
378
|
+
"- Provide the child implementation in the same scope (imports).",
|
|
379
|
+
` Example: ${fromModuleId ?? "ParentModule"}.implement({ imports: [${requestedModuleId ?? "ChildModule"}.impl], ... })`,
|
|
380
|
+
"- If you intentionally want a root singleton, provide it at app root (Runtime.make(...,{ layer }) / root imports),",
|
|
381
|
+
" and use Root.resolve(ModuleTag) (instead of $.use) at the callsite."
|
|
382
|
+
] : [];
|
|
383
|
+
const err = new Error(
|
|
384
|
+
isDevEnv() ? [
|
|
385
|
+
"[MissingModuleRuntimeError] Cannot resolve ModuleRuntime for ModuleTag.",
|
|
386
|
+
"",
|
|
387
|
+
`tokenId: ${tokenId}`,
|
|
388
|
+
"entrypoint: logic.$.use",
|
|
389
|
+
"mode: strict",
|
|
390
|
+
`from: ${fromModuleId ?? "<unknown module id>"}`,
|
|
391
|
+
`startScope: moduleId=${fromModuleId ?? "<unknown>"}, instanceId=${String(runtime.instanceId ?? "<unknown>")}`,
|
|
392
|
+
"",
|
|
393
|
+
"fix:",
|
|
394
|
+
...fix
|
|
395
|
+
].join("\n") : "[MissingModuleRuntimeError] module runtime not found"
|
|
396
|
+
);
|
|
397
|
+
err.tokenId = tokenId;
|
|
398
|
+
err.entrypoint = "logic.$.use";
|
|
399
|
+
err.mode = "strict";
|
|
400
|
+
err.from = fromModuleId;
|
|
401
|
+
err.startScope = {
|
|
402
|
+
moduleId: fromModuleId,
|
|
403
|
+
instanceId: String(runtime.instanceId ?? "<unknown>")
|
|
404
|
+
};
|
|
405
|
+
err.fix = fix;
|
|
406
|
+
err.name = "MissingModuleRuntimeError";
|
|
407
|
+
return yield* Effect.die(err);
|
|
408
|
+
});
|
|
409
|
+
const stateApi = {
|
|
410
|
+
read: runtime.getState,
|
|
411
|
+
update: (f) => Effect.gen(function* () {
|
|
412
|
+
const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
|
|
413
|
+
if (inTxn) {
|
|
414
|
+
const prev = yield* runtime.getState;
|
|
415
|
+
return yield* runtime.setState(f(prev));
|
|
416
|
+
}
|
|
417
|
+
const body = () => Effect.flatMap(runtime.getState, (prev) => runtime.setState(f(prev)));
|
|
418
|
+
return yield* runtimeInternals ? runtimeInternals.txn.runWithStateTransaction(
|
|
419
|
+
{ kind: "state", name: "update" },
|
|
420
|
+
body
|
|
421
|
+
) : body();
|
|
422
|
+
}),
|
|
423
|
+
mutate: (f) => Effect.gen(function* () {
|
|
424
|
+
const recordPatch = runtimeInternals?.txn.recordStatePatch;
|
|
425
|
+
const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
|
|
426
|
+
if (inTxn) {
|
|
427
|
+
const prev = yield* runtime.getState;
|
|
428
|
+
const { nextState, patchPaths } = mutateWithPatchPaths(
|
|
429
|
+
prev,
|
|
430
|
+
(draft) => {
|
|
431
|
+
f(draft);
|
|
432
|
+
}
|
|
433
|
+
);
|
|
434
|
+
for (const path of patchPaths) {
|
|
435
|
+
recordPatch?.({
|
|
436
|
+
path,
|
|
437
|
+
reason: "state:mutate"
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
return yield* runtime.setState(nextState);
|
|
441
|
+
}
|
|
442
|
+
const body = () => Effect.flatMap(runtime.getState, (prev) => {
|
|
443
|
+
const { nextState, patchPaths } = mutateWithPatchPaths(
|
|
444
|
+
prev,
|
|
445
|
+
(draft) => {
|
|
446
|
+
f(draft);
|
|
447
|
+
}
|
|
448
|
+
);
|
|
449
|
+
for (const path of patchPaths) {
|
|
450
|
+
recordPatch?.({
|
|
451
|
+
path,
|
|
452
|
+
reason: "state:mutate"
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
return runtime.setState(nextState);
|
|
456
|
+
});
|
|
457
|
+
return yield* runtimeInternals ? runtimeInternals.txn.runWithStateTransaction(
|
|
458
|
+
{ kind: "state", name: "mutate" },
|
|
459
|
+
body
|
|
460
|
+
) : body();
|
|
461
|
+
}),
|
|
462
|
+
ref: runtime.ref
|
|
463
|
+
};
|
|
464
|
+
const actionsApi = new Proxy({}, {
|
|
465
|
+
get: (_target, prop) => {
|
|
466
|
+
if (prop === "dispatch") {
|
|
467
|
+
return (a) => runtime.dispatch(a);
|
|
468
|
+
}
|
|
469
|
+
if (prop === "actions$") {
|
|
470
|
+
return runtime.actions$;
|
|
471
|
+
}
|
|
472
|
+
return (payload) => runtime.dispatch({ _tag: prop, payload });
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
const matchApi = (value) => makeMatch(value);
|
|
476
|
+
const matchTagApi = (value) => makeMatchTag(value);
|
|
477
|
+
const reducer = (tag, fn) => {
|
|
478
|
+
return Effect.sync(() => {
|
|
479
|
+
runtimeInternals.txn.registerReducer(String(tag), fn);
|
|
480
|
+
});
|
|
481
|
+
};
|
|
482
|
+
const api = {
|
|
483
|
+
state: stateApi,
|
|
484
|
+
actions: actionsApi,
|
|
485
|
+
flow: flowApi,
|
|
486
|
+
match: matchApi,
|
|
487
|
+
matchTag: matchTagApi,
|
|
488
|
+
lifecycle: {
|
|
489
|
+
onInitRequired: (eff) => {
|
|
490
|
+
if (getCurrentPhase() === "run") {
|
|
491
|
+
return emitSetupOnlyViolation("$.lifecycle.onInitRequired");
|
|
492
|
+
}
|
|
493
|
+
runtimeInternals.lifecycle.registerInitRequired(eff);
|
|
494
|
+
return Effect.void;
|
|
495
|
+
},
|
|
496
|
+
onStart: (eff) => {
|
|
497
|
+
if (getCurrentPhase() === "run") {
|
|
498
|
+
return emitSetupOnlyViolation("$.lifecycle.onStart");
|
|
499
|
+
}
|
|
500
|
+
runtimeInternals.lifecycle.registerStart(eff);
|
|
501
|
+
return Effect.void;
|
|
502
|
+
},
|
|
503
|
+
onInit: (eff) => {
|
|
504
|
+
if (getCurrentPhase() === "run") {
|
|
505
|
+
return emitSetupOnlyViolation("$.lifecycle.onInit");
|
|
506
|
+
}
|
|
507
|
+
runtimeInternals.lifecycle.registerInitRequired(eff);
|
|
508
|
+
return Effect.void;
|
|
509
|
+
},
|
|
510
|
+
onDestroy: (eff) => {
|
|
511
|
+
if (getCurrentPhase() === "run") {
|
|
512
|
+
return emitSetupOnlyViolation("$.lifecycle.onDestroy");
|
|
513
|
+
}
|
|
514
|
+
runtimeInternals.lifecycle.registerDestroy(eff);
|
|
515
|
+
return Effect.void;
|
|
516
|
+
},
|
|
517
|
+
onError: (handler) => {
|
|
518
|
+
if (getCurrentPhase() === "run") {
|
|
519
|
+
return emitSetupOnlyViolation("$.lifecycle.onError");
|
|
520
|
+
}
|
|
521
|
+
runtimeInternals.lifecycle.registerOnError(handler);
|
|
522
|
+
return Effect.void;
|
|
523
|
+
},
|
|
524
|
+
onSuspend: (eff) => {
|
|
525
|
+
if (getCurrentPhase() === "run") {
|
|
526
|
+
return emitSetupOnlyViolation("$.lifecycle.onSuspend");
|
|
527
|
+
}
|
|
528
|
+
runtimeInternals.lifecycle.registerPlatformSuspend(
|
|
529
|
+
Effect.asVoid(eff)
|
|
530
|
+
);
|
|
531
|
+
return Effect.void;
|
|
532
|
+
},
|
|
533
|
+
onResume: (eff) => {
|
|
534
|
+
if (getCurrentPhase() === "run") {
|
|
535
|
+
return emitSetupOnlyViolation("$.lifecycle.onResume");
|
|
536
|
+
}
|
|
537
|
+
runtimeInternals.lifecycle.registerPlatformResume(
|
|
538
|
+
Effect.asVoid(eff)
|
|
539
|
+
);
|
|
540
|
+
return Effect.void;
|
|
541
|
+
},
|
|
542
|
+
onReset: (eff) => {
|
|
543
|
+
if (getCurrentPhase() === "run") {
|
|
544
|
+
return emitSetupOnlyViolation("$.lifecycle.onReset");
|
|
545
|
+
}
|
|
546
|
+
runtimeInternals.lifecycle.registerPlatformReset(
|
|
547
|
+
Effect.asVoid(eff)
|
|
548
|
+
);
|
|
549
|
+
return Effect.void;
|
|
550
|
+
}
|
|
551
|
+
},
|
|
552
|
+
traits: {
|
|
553
|
+
declare: (traits) => {
|
|
554
|
+
if (getCurrentPhase() === "run") {
|
|
555
|
+
throw makeLogicPhaseError(
|
|
556
|
+
"traits_declare_in_run",
|
|
557
|
+
"$.traits.declare",
|
|
558
|
+
"run",
|
|
559
|
+
options?.moduleId
|
|
560
|
+
);
|
|
561
|
+
}
|
|
562
|
+
if (!traits || typeof traits !== "object") {
|
|
563
|
+
throw new Error(
|
|
564
|
+
"[InvalidTraitsDeclaration] $.traits.declare expects an object."
|
|
565
|
+
);
|
|
566
|
+
}
|
|
567
|
+
const logicUnit = options?.logicUnit ?? {
|
|
568
|
+
logicUnitId: "unknown",
|
|
569
|
+
logicUnitIdKind: "derived",
|
|
570
|
+
logicUnitLabel: "logicUnit:unknown",
|
|
571
|
+
path: void 0
|
|
572
|
+
};
|
|
573
|
+
runtimeInternals.traits.registerModuleTraitsContribution({
|
|
574
|
+
traits,
|
|
575
|
+
provenance: {
|
|
576
|
+
originType: "logicUnit",
|
|
577
|
+
originId: logicUnit.logicUnitId,
|
|
578
|
+
originIdKind: logicUnit.logicUnitIdKind,
|
|
579
|
+
originLabel: logicUnit.logicUnitLabel,
|
|
580
|
+
path: logicUnit.path
|
|
581
|
+
}
|
|
582
|
+
});
|
|
583
|
+
return Effect.void;
|
|
584
|
+
},
|
|
585
|
+
source: {
|
|
586
|
+
refresh: (fieldPath) => Effect.gen(function* () {
|
|
587
|
+
const handler = runtimeInternals.traits.getSourceRefreshHandler(
|
|
588
|
+
fieldPath
|
|
589
|
+
);
|
|
590
|
+
if (!handler) {
|
|
591
|
+
return yield* Effect.void;
|
|
592
|
+
}
|
|
593
|
+
const inTxn = yield* FiberRef.get(inSyncTransactionFiber);
|
|
594
|
+
if (inTxn) {
|
|
595
|
+
const state = yield* runtime.getState;
|
|
596
|
+
return yield* handler(state);
|
|
597
|
+
}
|
|
598
|
+
return yield* runtimeInternals.txn.runWithStateTransaction(
|
|
599
|
+
{
|
|
600
|
+
kind: "source-refresh",
|
|
601
|
+
name: fieldPath
|
|
602
|
+
},
|
|
603
|
+
() => Effect.gen(function* () {
|
|
604
|
+
const state = yield* runtime.getState;
|
|
605
|
+
return yield* handler(state);
|
|
606
|
+
})
|
|
607
|
+
);
|
|
608
|
+
})
|
|
609
|
+
}
|
|
610
|
+
},
|
|
611
|
+
reducer,
|
|
612
|
+
use: new Proxy(() => {
|
|
613
|
+
}, {
|
|
614
|
+
apply: (_target, _thisArg, [arg]) => {
|
|
615
|
+
guardRunOnly("use_in_setup", "$.use");
|
|
616
|
+
if (isModuleLike(arg)) {
|
|
617
|
+
const domain = arg;
|
|
618
|
+
const tag = domain.tag;
|
|
619
|
+
const resolveAndBuild = resolveModuleRuntime(tag).pipe(
|
|
620
|
+
Effect.map((rt) => buildModuleHandle(tag, rt))
|
|
621
|
+
);
|
|
622
|
+
const resolveWithDescriptor = resolveModuleRuntime(tag).pipe(
|
|
623
|
+
Effect.tap((rt) => emitModuleDescriptorOnce(domain, rt)),
|
|
624
|
+
Effect.map((rt) => buildModuleHandle(tag, rt))
|
|
625
|
+
);
|
|
626
|
+
const detectAndSelect = FiberRef.get(currentDiagnosticsLevel).pipe(
|
|
627
|
+
Effect.tap((level) => {
|
|
628
|
+
cachedDiagnosticsLevel = level;
|
|
629
|
+
}),
|
|
630
|
+
Effect.flatMap(
|
|
631
|
+
(level) => level === "off" ? resolveAndBuild : resolveWithDescriptor
|
|
632
|
+
)
|
|
633
|
+
);
|
|
634
|
+
return Effect.suspend(() => {
|
|
635
|
+
if (cachedDiagnosticsLevel === "off") {
|
|
636
|
+
return resolveAndBuild;
|
|
637
|
+
}
|
|
638
|
+
if (cachedDiagnosticsLevel !== void 0) {
|
|
639
|
+
return resolveWithDescriptor;
|
|
640
|
+
}
|
|
641
|
+
return detectAndSelect;
|
|
642
|
+
});
|
|
643
|
+
}
|
|
644
|
+
if (Context.isTag(arg)) {
|
|
645
|
+
const candidate = arg;
|
|
646
|
+
if (candidate._kind === "ModuleTag") {
|
|
647
|
+
return resolveModuleRuntime(arg).pipe(
|
|
648
|
+
Effect.map(
|
|
649
|
+
(rt) => buildModuleHandle(arg, rt)
|
|
650
|
+
)
|
|
651
|
+
);
|
|
652
|
+
}
|
|
653
|
+
return arg;
|
|
654
|
+
}
|
|
655
|
+
return Effect.die("BoundApi.use: unsupported argument");
|
|
656
|
+
}
|
|
657
|
+
}),
|
|
658
|
+
onAction: new Proxy(() => {
|
|
659
|
+
}, {
|
|
660
|
+
apply: (_target, _thisArg, args) => {
|
|
661
|
+
guardRunOnly("use_in_setup", "$.onAction");
|
|
662
|
+
const arg = args[0];
|
|
663
|
+
if (typeof arg === "function") {
|
|
664
|
+
return createIntentBuilder(
|
|
665
|
+
runtime.actions$.pipe(Stream.filter(arg))
|
|
666
|
+
);
|
|
667
|
+
}
|
|
668
|
+
if (typeof arg === "string") {
|
|
669
|
+
return createIntentBuilder(
|
|
670
|
+
runtime.actions$.pipe(
|
|
671
|
+
Stream.filter((a) => a._tag === arg || a.type === arg)
|
|
672
|
+
),
|
|
673
|
+
arg
|
|
674
|
+
);
|
|
675
|
+
}
|
|
676
|
+
if (typeof arg === "object" && arg !== null) {
|
|
677
|
+
if ("_tag" in arg) {
|
|
678
|
+
return createIntentBuilder(
|
|
679
|
+
runtime.actions$.pipe(
|
|
680
|
+
Stream.filter((a) => a._tag === arg._tag)
|
|
681
|
+
),
|
|
682
|
+
String(arg._tag)
|
|
683
|
+
);
|
|
684
|
+
}
|
|
685
|
+
if (Schema.isSchema(arg)) {
|
|
686
|
+
return createIntentBuilder(
|
|
687
|
+
runtime.actions$.pipe(
|
|
688
|
+
Stream.filter((a) => {
|
|
689
|
+
const result = Schema.decodeUnknownSync(
|
|
690
|
+
arg
|
|
691
|
+
)(a);
|
|
692
|
+
return !!result;
|
|
693
|
+
})
|
|
694
|
+
)
|
|
695
|
+
);
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
return createIntentBuilder(runtime.actions$);
|
|
699
|
+
},
|
|
700
|
+
get: (_target, prop) => {
|
|
701
|
+
guardRunOnly("use_in_setup", "$.onAction");
|
|
702
|
+
if (typeof prop === "string") {
|
|
703
|
+
return createIntentBuilder(
|
|
704
|
+
runtime.actions$.pipe(
|
|
705
|
+
Stream.filter(
|
|
706
|
+
(a) => a._tag === prop || a.type === prop
|
|
707
|
+
)
|
|
708
|
+
),
|
|
709
|
+
prop
|
|
710
|
+
);
|
|
711
|
+
}
|
|
712
|
+
return void 0;
|
|
713
|
+
}
|
|
714
|
+
}),
|
|
715
|
+
onState: (selector) => {
|
|
716
|
+
guardRunOnly("use_in_setup", "$.onState");
|
|
717
|
+
return createIntentBuilder(runtime.changes(selector));
|
|
718
|
+
},
|
|
719
|
+
on: (stream) => {
|
|
720
|
+
guardRunOnly("use_in_setup", "$.on");
|
|
721
|
+
return createIntentBuilder(stream);
|
|
722
|
+
}
|
|
723
|
+
};
|
|
724
|
+
setBoundInternals(api, runtimeInternals);
|
|
725
|
+
return api;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
export {
|
|
729
|
+
mutateWithPatchPaths,
|
|
730
|
+
make2 as make
|
|
731
|
+
};
|
|
732
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbG9naXgtY29yZS9zcmMvaW50ZXJuYWwvcnVudGltZS9jb3JlL211dGF0aXZlUGF0Y2hlcy50cyIsICIuLi8uLi8uLi8uLi9sb2dpeC1jb3JlL3NyYy9pbnRlcm5hbC9ydW50aW1lL0JvdW5kQXBpUnVudGltZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgY3JlYXRlLCB0eXBlIFBhdGNoZXMgfSBmcm9tIFwibXV0YXRpdmVcIlxuXG5leHBvcnQgdHlwZSBQYXRjaFBhdGggPSBzdHJpbmdcblxuY29uc3QgdG9QYXRjaFBhdGhTdHJpbmcgPSAocGF0aDogdW5rbm93bik6IFBhdGNoUGF0aCB8IFwiKlwiIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgdHJpbW1lZCA9IHBhdGgudHJpbSgpXG4gICAgcmV0dXJuIHRyaW1tZWQubGVuZ3RoID4gMCA/IHRyaW1tZWQgOiB1bmRlZmluZWRcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShwYXRoKSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gIGNvbnN0IHBhcnRzOiBBcnJheTxzdHJpbmc+ID0gW11cbiAgZm9yIChjb25zdCBzZWcgb2YgcGF0aCkge1xuICAgIGlmICh0eXBlb2Ygc2VnID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAoc2VnLmxlbmd0aCA+IDApIHBhcnRzLnB1c2goc2VnKVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWcgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzRmluaXRlKHNlZykpIHtcbiAgICAgIHBhcnRzLnB1c2goU3RyaW5nKE1hdGguZmxvb3Ioc2VnKSkpXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgfVxuXG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHJldHVybiBcIipcIlxuICByZXR1cm4gcGFydHMuam9pbihcIi5cIilcbn1cblxuZXhwb3J0IGNvbnN0IG11dGF0ZVdpdGhQYXRjaFBhdGhzID0gPFM+KFxuICBiYXNlOiBTLFxuICBtdXRhdG9yOiAoZHJhZnQ6IFMpID0+IHZvaWQsXG4pOiB7IHJlYWRvbmx5IG5leHRTdGF0ZTogUzsgcmVhZG9ubHkgcGF0Y2hQYXRoczogUmVhZG9ubHlBcnJheTxQYXRjaFBhdGggfCBcIipcIj4gfSA9PiB7XG4gIGNvbnN0IG91dCA9IGNyZWF0ZShiYXNlLCBtdXRhdG9yIGFzIGFueSwge1xuICAgIGVuYWJsZVBhdGNoZXM6IHtcbiAgICAgIHBhdGhBc0FycmF5OiB0cnVlLFxuICAgICAgYXJyYXlMZW5ndGhBc3NpZ25tZW50OiBmYWxzZSxcbiAgICB9LFxuICB9KSBhcyB1bmtub3duXG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KG91dCkpIHtcbiAgICByZXR1cm4geyBuZXh0U3RhdGU6IG91dCBhcyBTLCBwYXRjaFBhdGhzOiBbXSB9XG4gIH1cblxuICBjb25zdCBuZXh0U3RhdGUgPSBvdXRbMF0gYXMgU1xuICBjb25zdCBwYXRjaGVzID0gKG91dFsxXSA/PyBbXSkgYXMgUGF0Y2hlczx7IHBhdGhBc0FycmF5OiB0cnVlOyBhcnJheUxlbmd0aEFzc2lnbm1lbnQ6IGZhbHNlIH0+XG5cbiAgY29uc3Qgc2V0ID0gbmV3IFNldDxQYXRjaFBhdGggfCBcIipcIj4oKVxuICBmb3IgKGNvbnN0IHBhdGNoIG9mIHBhdGNoZXMpIHtcbiAgICBjb25zdCBwID0gdG9QYXRjaFBhdGhTdHJpbmcoKHBhdGNoIGFzIGFueSk/LnBhdGgpXG4gICAgaWYgKCFwKSBjb250aW51ZVxuICAgIHNldC5hZGQocClcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmV4dFN0YXRlLFxuICAgIHBhdGNoUGF0aHM6IEFycmF5LmZyb20oc2V0KSxcbiAgfVxufVxuXG4iLCAiaW1wb3J0IHsgQ29udGV4dCwgRWZmZWN0LCBGaWJlclJlZiwgT3B0aW9uLCBTY2hlbWEsIFN0cmVhbSwgU3Vic2NyaXB0aW9uUmVmIH0gZnJvbSBcImVmZmVjdFwiXG5pbXBvcnQgeyBjcmVhdGUgfSBmcm9tIFwibXV0YXRpdmVcIlxuaW1wb3J0IHR5cGUgKiBhcyBMb2dpeCBmcm9tIFwiLi9jb3JlL21vZHVsZS5qc1wiXG5pbXBvcnQgKiBhcyBMb2dpYyBmcm9tIFwiLi9jb3JlL0xvZ2ljTWlkZGxld2FyZS5qc1wiXG5pbXBvcnQgKiBhcyBUYXNrUnVubmVyIGZyb20gXCIuL2NvcmUvVGFza1J1bm5lci5qc1wiXG5pbXBvcnQgeyBtdXRhdGVXaXRoUGF0Y2hQYXRocyB9IGZyb20gXCIuL2NvcmUvbXV0YXRpdmVQYXRjaGVzLmpzXCJcbmltcG9ydCAqIGFzIEZsb3dSdW50aW1lIGZyb20gXCIuL0Zsb3dSdW50aW1lLmpzXCJcbmltcG9ydCAqIGFzIE1hdGNoQnVpbGRlciBmcm9tIFwiLi9jb3JlL01hdGNoQnVpbGRlci5qc1wiXG5pbXBvcnQgKiBhcyBQbGF0Zm9ybSBmcm9tIFwiLi9jb3JlL1BsYXRmb3JtLmpzXCJcbmltcG9ydCAqIGFzIExpZmVjeWNsZSBmcm9tIFwiLi9MaWZlY3ljbGUuanNcIlxuaW1wb3J0ICogYXMgRGVidWcgZnJvbSBcIi4vY29yZS9EZWJ1Z1NpbmsuanNcIlxuaW1wb3J0ICogYXMgTG9naWNEaWFnbm9zdGljcyBmcm9tIFwiLi9jb3JlL0xvZ2ljRGlhZ25vc3RpY3MuanNcIlxuaW1wb3J0IHsgaXNEZXZFbnYgfSBmcm9tIFwiLi9jb3JlL2Vudi5qc1wiXG5pbXBvcnQgeyBSdW5TZXNzaW9uVGFnIH0gZnJvbSBcIi4uL29ic2VydmFiaWxpdHkvcnVuU2Vzc2lvbi5qc1wiXG5pbXBvcnQgdHlwZSB7IFJ1bnRpbWVJbnRlcm5hbHMgfSBmcm9tIFwiLi9jb3JlL1J1bnRpbWVJbnRlcm5hbHMuanNcIlxuaW1wb3J0IHR5cGUgKiBhcyBNb2R1bGVUcmFpdHMgZnJvbSBcIi4vY29yZS9Nb2R1bGVUcmFpdHMuanNcIlxuaW1wb3J0IHtcbiAgZ2V0UnVudGltZUludGVybmFscyxcbiAgc2V0Qm91bmRJbnRlcm5hbHMsXG59IGZyb20gXCIuL2NvcmUvcnVudGltZUludGVybmFsc0FjY2Vzc29yLmpzXCJcbmltcG9ydCB0eXBlIHtcbiAgQW55TW9kdWxlU2hhcGUsXG4gIE1vZHVsZVJ1bnRpbWUsXG4gIFN0YXRlT2YsXG4gIEFjdGlvbk9mLFxufSBmcm9tIFwiLi9jb3JlL21vZHVsZS5qc1wiXG5cbi8vIFx1NjcyQ1x1NTczMFx1Njc4NFx1OTAyMCBJbnRlbnRCdWlsZGVyIFx1NURFNVx1NTM4Mlx1RkYwQ1x1N0I0OVx1NEVGN1x1NEU4RVx1NTM5RiBpbnRlcm5hbC9kc2wvTG9naWNCdWlsZGVyLm1ha2VJbnRlbnRCdWlsZGVyRmFjdG9yeVxuY29uc3QgTG9naWNCdWlsZGVyRmFjdG9yeSA9IDxTaCBleHRlbmRzIEFueU1vZHVsZVNoYXBlLCBSID0gbmV2ZXI+KFxuICBydW50aW1lOiBNb2R1bGVSdW50aW1lPFN0YXRlT2Y8U2g+LCBBY3Rpb25PZjxTaD4+LFxuICBydW50aW1lSW50ZXJuYWxzOiBSdW50aW1lSW50ZXJuYWxzLFxuKSA9PiB7XG4gIGNvbnN0IGZsb3dBcGkgPSBGbG93UnVudGltZS5tYWtlPFNoLCBSPihydW50aW1lLCBydW50aW1lSW50ZXJuYWxzKVxuXG4gIHJldHVybiA8VD4oXG4gICAgc3RyZWFtOiBTdHJlYW0uU3RyZWFtPFQ+LFxuICAgIHRyaWdnZXJOYW1lPzogc3RyaW5nLFxuICApOiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPiA9PiB7XG4gICAgY29uc3QgcnVuV2l0aFN0YXRlVHJhbnNhY3Rpb246IFRhc2tSdW5uZXIuVGFza1J1bm5lclJ1bnRpbWVbXCJydW5XaXRoU3RhdGVUcmFuc2FjdGlvblwiXSA9XG4gICAgICAob3JpZ2luLCBib2R5KSA9PiBydW50aW1lSW50ZXJuYWxzLnR4bi5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihvcmlnaW4gYXMgYW55LCBib2R5KVxuXG5cdCAgICBjb25zdCB0YXNrUnVubmVyUnVudGltZTogVGFza1J1bm5lci5UYXNrUnVubmVyUnVudGltZSA9IHtcblx0ICAgICAgbW9kdWxlSWQ6IHJ1bnRpbWUubW9kdWxlSWQsXG5cdCAgICAgIGluc3RhbmNlSWQ6IHJ1bnRpbWVJbnRlcm5hbHMuaW5zdGFuY2VJZCxcblx0ICAgICAgcnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24sXG5cdCAgICAgIHJlc29sdmVDb25jdXJyZW5jeVBvbGljeTogcnVudGltZUludGVybmFscy5jb25jdXJyZW5jeS5yZXNvbHZlQ29uY3VycmVuY3lQb2xpY3ksXG5cdCAgICB9XG5cblx0ICAgIGNvbnN0IGJ1aWxkZXIgPSB7XG5cdCAgICAgIGRlYm91bmNlOiAobXM6IG51bWJlcikgPT5cblx0ICAgICAgICBMb2dpY0J1aWxkZXJGYWN0b3J5PFNoLCBSPihydW50aW1lLCBydW50aW1lSW50ZXJuYWxzKShcblx0ICAgICAgICAgIGZsb3dBcGkuZGVib3VuY2U8VD4obXMpKHN0cmVhbSksXG5cdCAgICAgICAgICB0cmlnZ2VyTmFtZSxcblx0ICAgICAgICApLFxuXHQgICAgICB0aHJvdHRsZTogKG1zOiBudW1iZXIpID0+XG5cdCAgICAgICAgTG9naWNCdWlsZGVyRmFjdG9yeTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscykoXG5cdCAgICAgICAgICBmbG93QXBpLnRocm90dGxlPFQ+KG1zKShzdHJlYW0pLFxuXHQgICAgICAgICAgdHJpZ2dlck5hbWUsXG5cdCAgICAgICAgKSxcblx0ICAgICAgZmlsdGVyOiAocHJlZGljYXRlOiAodmFsdWU6IFQpID0+IGJvb2xlYW4pID0+XG5cdCAgICAgICAgTG9naWNCdWlsZGVyRmFjdG9yeTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscykoXG5cdCAgICAgICAgICBmbG93QXBpLmZpbHRlcihwcmVkaWNhdGUpKHN0cmVhbSksXG5cdCAgICAgICAgICB0cmlnZ2VyTmFtZSxcblx0ICAgICAgICApLFxuXHQgICAgICBtYXA6IDxVPihmOiAodmFsdWU6IFQpID0+IFUpID0+XG5cdCAgICAgICAgTG9naWNCdWlsZGVyRmFjdG9yeTxTaCwgUj4ocnVudGltZSwgcnVudGltZUludGVybmFscykoXG5cdCAgICAgICAgICBzdHJlYW0ucGlwZShTdHJlYW0ubWFwKGYpKSxcblx0ICAgICAgICAgIHRyaWdnZXJOYW1lLFxuXHQgICAgICAgICksXG4gICAgICBydW48QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgZWZmOlxuICAgICAgICAgIHwgTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT5cbiAgICAgICAgICB8ICgocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgICAgICBvcHRpb25zPzogTG9naWMuT3BlcmF0aW9uT3B0aW9ucyxcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+IHtcbiAgICAgICAgcmV0dXJuIGZsb3dBcGkucnVuPFQsIEEsIEUsIFIyPihlZmYsIG9wdGlvbnMpKHN0cmVhbSlcbiAgICAgIH0sXG4gICAgICBydW5MYXRlc3Q8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgZWZmOlxuICAgICAgICAgIHwgTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT5cbiAgICAgICAgICB8ICgocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pLFxuICAgICAgICBvcHRpb25zPzogTG9naWMuT3BlcmF0aW9uT3B0aW9ucyxcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+IHtcbiAgICAgICAgcmV0dXJuIGZsb3dBcGkucnVuTGF0ZXN0PFQsIEEsIEUsIFIyPihlZmYsIG9wdGlvbnMpKHN0cmVhbSlcbiAgICAgIH0sXG4gICAgICBydW5FeGhhdXN0PEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjpcbiAgICAgICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICAgICAgfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICAgICAgb3B0aW9ucz86IExvZ2ljLk9wZXJhdGlvbk9wdGlvbnMsXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiB7XG4gICAgICAgIHJldHVybiBmbG93QXBpLnJ1bkV4aGF1c3Q8VCwgQSwgRSwgUjI+KGVmZiwgb3B0aW9ucykoc3RyZWFtKVxuICAgICAgfSxcbiAgICAgIHJ1blBhcmFsbGVsPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGVmZjpcbiAgICAgICAgICB8IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+XG4gICAgICAgICAgfCAoKHA6IFQpID0+IExvZ2ljLk9mPFNoLCBSICYgUjIsIEEsIEU+KSxcbiAgICAgICAgb3B0aW9ucz86IExvZ2ljLk9wZXJhdGlvbk9wdGlvbnMsXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiB7XG4gICAgICAgIHJldHVybiBmbG93QXBpLnJ1blBhcmFsbGVsPFQsIEEsIEUsIFIyPihlZmYsIG9wdGlvbnMpKHN0cmVhbSlcbiAgICAgIH0sXG4gICAgICBydW5Gb3JrOiA8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgZWZmOlxuICAgICAgICAgIHwgTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT5cbiAgICAgICAgICB8ICgocDogVCkgPT4gTG9naWMuT2Y8U2gsIFIgJiBSMiwgQSwgRT4pXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBFPiA9PlxuICAgICAgICBFZmZlY3QuZm9ya1Njb3BlZChmbG93QXBpLnJ1bjxULCBBLCBFLCBSMj4oZWZmKShzdHJlYW0pKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5hc1ZvaWQsXG4gICAgICAgICkgYXMgTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4sXG4gICAgICBydW5QYXJhbGxlbEZvcms6IDxBID0gdm9pZCwgRSA9IG5ldmVyLCBSMiA9IHVua25vd24+KFxuICAgICAgICBlZmY6XG4gICAgICAgICAgfCBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPlxuICAgICAgICAgIHwgKChwOiBUKSA9PiBMb2dpYy5PZjxTaCwgUiAmIFIyLCBBLCBFPilcbiAgICAgICk6IExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIEU+ID0+XG4gICAgICAgIEVmZmVjdC5mb3JrU2NvcGVkKFxuICAgICAgICAgIGZsb3dBcGkucnVuUGFyYWxsZWw8VCwgQSwgRSwgUjI+KGVmZikoc3RyZWFtKSxcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIEVmZmVjdC5hc1ZvaWQsXG4gICAgICAgICkgYXMgTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgRT4sXG4gICAgICBydW5UYXNrOiA8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgY29uZmlnOiBUYXNrUnVubmVyLlRhc2tSdW5uZXJDb25maWc8VCwgU2gsIFIgJiBSMiwgQSwgRT4sXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4gPT5cbiAgICAgICAgVGFza1J1bm5lci5tYWtlVGFza1J1bm5lcjxULCBTaCwgUiAmIFIyLCBBLCBFPihcbiAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgXCJ0YXNrXCIsXG4gICAgICAgICAgdGFza1J1bm5lclJ1bnRpbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgdHJpZ2dlck5hbWU6IGNvbmZpZy50cmlnZ2VyTmFtZSA/PyB0cmlnZ2VyTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPixcbiAgICAgIHJ1blBhcmFsbGVsVGFzazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGNvbmZpZzogVGFza1J1bm5lci5UYXNrUnVubmVyQ29uZmlnPFQsIFNoLCBSICYgUjIsIEEsIEU+LFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+ID0+XG4gICAgICAgIFRhc2tSdW5uZXIubWFrZVRhc2tSdW5uZXI8VCwgU2gsIFIgJiBSMiwgQSwgRT4oXG4gICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgIFwicGFyYWxsZWxcIixcbiAgICAgICAgICB0YXNrUnVubmVyUnVudGltZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5jb25maWcsXG4gICAgICAgICAgICB0cmlnZ2VyTmFtZTogY29uZmlnLnRyaWdnZXJOYW1lID8/IHRyaWdnZXJOYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICkgYXMgTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+LFxuICAgICAgcnVuTGF0ZXN0VGFzazogPEEgPSB2b2lkLCBFID0gbmV2ZXIsIFIyID0gdW5rbm93bj4oXG4gICAgICAgIGNvbmZpZzogVGFza1J1bm5lci5UYXNrUnVubmVyQ29uZmlnPFQsIFNoLCBSICYgUjIsIEEsIEU+LFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIgJiBSMiwgdm9pZCwgbmV2ZXI+ID0+XG4gICAgICAgIFRhc2tSdW5uZXIubWFrZVRhc2tSdW5uZXI8VCwgU2gsIFIgJiBSMiwgQSwgRT4oXG4gICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgIFwibGF0ZXN0XCIsXG4gICAgICAgICAgdGFza1J1bm5lclJ1bnRpbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgdHJpZ2dlck5hbWU6IGNvbmZpZy50cmlnZ2VyTmFtZSA/PyB0cmlnZ2VyTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPixcbiAgICAgIHJ1bkV4aGF1c3RUYXNrOiA8QSA9IHZvaWQsIEUgPSBuZXZlciwgUjIgPSB1bmtub3duPihcbiAgICAgICAgY29uZmlnOiBUYXNrUnVubmVyLlRhc2tSdW5uZXJDb25maWc8VCwgU2gsIFIgJiBSMiwgQSwgRT4sXG4gICAgICApOiBMb2dpYy5PZjxTaCwgUiAmIFIyLCB2b2lkLCBuZXZlcj4gPT5cbiAgICAgICAgVGFza1J1bm5lci5tYWtlVGFza1J1bm5lcjxULCBTaCwgUiAmIFIyLCBBLCBFPihcbiAgICAgICAgICBzdHJlYW0sXG4gICAgICAgICAgXCJleGhhdXN0XCIsXG4gICAgICAgICAgdGFza1J1bm5lclJ1bnRpbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAgICAgdHJpZ2dlck5hbWU6IGNvbmZpZy50cmlnZ2VyTmFtZSA/PyB0cmlnZ2VyTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICApIGFzIExvZ2ljLk9mPFNoLCBSICYgUjIsIHZvaWQsIG5ldmVyPixcbiAgICAgIHRvU3RyZWFtOiAoKSA9PiBzdHJlYW0sXG4gICAgICB1cGRhdGU6IChcbiAgICAgICAgcmVkdWNlcjogKFxuICAgICAgICAgIHByZXY6IFN0YXRlT2Y8U2g+LFxuICAgICAgICAgIHBheWxvYWQ6IFRcbiAgICAgICAgKSA9PlxuICAgICAgICAgIHwgU3RhdGVPZjxTaD5cbiAgICAgICAgICB8IEVmZmVjdC5FZmZlY3Q8U3RhdGVPZjxTaD4sIGFueSwgYW55PlxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPiA9PlxuICAgICAgICBTdHJlYW0ucnVuRm9yRWFjaChzdHJlYW0sIChwYXlsb2FkKSA9PlxuICAgICAgICAgIHRhc2tSdW5uZXJSdW50aW1lLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBraW5kOiBcIndhdGNoZXI6dXBkYXRlXCIsXG4gICAgICAgICAgICAgIG5hbWU6IHRyaWdnZXJOYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gKHlpZWxkKiBydW50aW1lLmdldFN0YXRlKSBhcyBTdGF0ZU9mPFNoPlxuICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSByZWR1Y2VyKHByZXYsIHBheWxvYWQpXG4gICAgICAgICAgICAgICAgaWYgKEVmZmVjdC5pc0VmZmVjdChuZXh0KSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXhpdCA9IHlpZWxkKiBFZmZlY3QuZXhpdChcbiAgICAgICAgICAgICAgICAgICAgbmV4dCBhcyBFZmZlY3QuRWZmZWN0PFN0YXRlT2Y8U2g+LCBhbnksIGFueT4sXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBpZiAoZXhpdC5fdGFnID09PSBcIkZhaWx1cmVcIikge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCogRWZmZWN0LmxvZ0Vycm9yKFwiRmxvdyBlcnJvclwiLCBleGl0LmNhdXNlKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHlpZWxkKiBydW50aW1lLnNldFN0YXRlKGV4aXQudmFsdWUgYXMgU3RhdGVPZjxTaD4pXG4gICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeWllbGQqIHJ1bnRpbWUuc2V0U3RhdGUobmV4dCBhcyBTdGF0ZU9mPFNoPilcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgKVxuICAgICAgICApLnBpcGUoXG4gICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgRWZmZWN0LmxvZ0Vycm9yKFwiRmxvdyBlcnJvclwiLCBjYXVzZSlcbiAgICAgICAgICApXG4gICAgICAgICkgYXMgTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPixcbiAgICAgIG11dGF0ZTogKFxuICAgICAgICByZWR1Y2VyOiAoZHJhZnQ6IExvZ2ljLkRyYWZ0PFN0YXRlT2Y8U2g+PiwgcGF5bG9hZDogVCkgPT4gdm9pZFxuICAgICAgKTogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPiA9PlxuICAgICAgICBTdHJlYW0ucnVuRm9yRWFjaChzdHJlYW0sIChwYXlsb2FkKSA9PlxuICAgICAgICAgIHRhc2tSdW5uZXJSdW50aW1lLnJ1bldpdGhTdGF0ZVRyYW5zYWN0aW9uKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBraW5kOiBcIndhdGNoZXI6bXV0YXRlXCIsXG4gICAgICAgICAgICAgIG5hbWU6IHRyaWdnZXJOYW1lLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gKHlpZWxkKiBydW50aW1lLmdldFN0YXRlKSBhcyBTdGF0ZU9mPFNoPlxuICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZFBhdGNoID0gcnVudGltZUludGVybmFscz8udHhuLnJlY29yZFN0YXRlUGF0Y2hcblxuICAgICAgICAgICAgICAgIGNvbnN0IHsgbmV4dFN0YXRlLCBwYXRjaFBhdGhzIH0gPSBtdXRhdGVXaXRoUGF0Y2hQYXRocyhcbiAgICAgICAgICAgICAgICAgIHByZXYgYXMgU3RhdGVPZjxTaD4sXG4gICAgICAgICAgICAgICAgICAoZHJhZnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVkdWNlcihkcmFmdCBhcyBMb2dpYy5EcmFmdDxTdGF0ZU9mPFNoPj4sIHBheWxvYWQpXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRjaFBhdGhzKSB7XG4gICAgICAgICAgICAgICAgICByZWNvcmRQYXRjaD8uKHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBcIndhdGNoZXI6bXV0YXRlXCIsXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHlpZWxkKiBydW50aW1lLnNldFN0YXRlKG5leHRTdGF0ZSlcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgKVxuICAgICAgICApLnBpcGUoXG4gICAgICAgICAgRWZmZWN0LmNhdGNoQWxsQ2F1c2UoKGNhdXNlKSA9PlxuICAgICAgICAgICAgRWZmZWN0LmxvZ0Vycm9yKFwiRmxvdyBlcnJvclwiLCBjYXVzZSlcbiAgICAgICAgICApXG4gICAgICAgICkgYXMgTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPixcbiAgICB9IGFzIE9taXQ8TG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj4sIFwicGlwZVwiIHwgXCJhbmRUaGVuXCI+XG5cbiAgICBjb25zdCBhbmRUaGVuOiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPltcImFuZFRoZW5cIl0gPSAoXG4gICAgICBoYW5kbGVyT3JFZmY6IGFueSxcbiAgICApOiBhbnkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyT3JFZmYgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBpZiAoaGFuZGxlck9yRWZmLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgcmV0dXJuIChidWlsZGVyIGFzIGFueSkudXBkYXRlKGhhbmRsZXJPckVmZilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGJ1aWxkZXIgYXMgYW55KS5ydW4oaGFuZGxlck9yRWZmKVxuICAgICAgfVxuICAgICAgcmV0dXJuIChidWlsZGVyIGFzIGFueSkucnVuKGhhbmRsZXJPckVmZilcbiAgICB9XG5cbiAgICBjb25zdCBwaXBlOiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPltcInBpcGVcIl0gPSBmdW5jdGlvbiAodGhpczogdW5rbm93bikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1yZXN0LXBhcmFtc1xuICAgICAgY29uc3QgZm5zID0gYXJndW1lbnRzIGFzIHVua25vd24gYXMgUmVhZG9ubHlBcnJheTxcbiAgICAgICAgKHNlbGY6IExvZ2ljLkludGVudEJ1aWxkZXI8VCwgU2gsIFI+KSA9PiBMb2dpYy5JbnRlbnRCdWlsZGVyPFQsIFNoLCBSPlxuICAgICAgPlxuICAgICAgbGV0IGFjYzogTG9naWMuSW50ZW50QnVpbGRlcjxULCBTaCwgUj4gPSBidWlsZGVyIGFzIExvZ2ljLkludGVudEJ1aWxkZXI8XG4gICAgICAgIFQsXG4gICAgICAgIFNoLFxuICAgICAgICBSXG4gICAgICA+XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhY2MgPSBmbnNbaV0oYWNjKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGJ1aWxkZXIsIHsgcGlwZSwgYW5kVGhlbiB9KSBhcyBMb2dpYy5JbnRlbnRCdWlsZGVyPFxuICAgICAgVCxcbiAgICAgIFNoLFxuICAgICAgUlxuICAgID5cbiAgfVxufVxuaW1wb3J0IHR5cGUgeyBCb3VuZEFwaSB9IGZyb20gXCIuL2NvcmUvbW9kdWxlLmpzXCJcblxuLyoqXG4gKiBCb3VuZEFwaSBcdTVCOUVcdTczQjBcdUZGMUFcdTRFM0FcdTY3RDBcdTRFMDBcdTdDN0IgU3RvcmUgU2hhcGUgKyBSdW50aW1lIFx1NTIxQlx1NUVGQVx1OTg4NFx1N0VEMVx1NUI5QVx1NzY4NCBgJGBcdTMwMDJcbiAqXG4gKiBcdThCRjRcdTY2MEVcdUZGMUFcdTdDN0JcdTU3OEJcdTRFMEVcdTUxNjVcdTUzRTNcdTdCN0VcdTU0MERcdTU3MjggYXBpL0JvdW5kQXBpLnRzIFx1NEUyRFx1NThGMFx1NjYwRVx1RkYwQ1x1OEZEOVx1OTFDQ1x1NTNFQVx1NjI3Rlx1OEY3RFx1NTE3N1x1NEY1M1x1NUI5RVx1NzNCMFx1MzAwMlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZTxTaCBleHRlbmRzIExvZ2l4LkFueU1vZHVsZVNoYXBlLCBSID0gbmV2ZXI+KFxuICBzaGFwZTogU2gsXG4gIHJ1bnRpbWU6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8TG9naXguU3RhdGVPZjxTaD4sIExvZ2l4LkFjdGlvbk9mPFNoPj4sXG4gIG9wdGlvbnM/OiB7XG4gICAgcmVhZG9ubHkgZ2V0UGhhc2U/OiAoKSA9PiBcInNldHVwXCIgfCBcInJ1blwiXG4gICAgcmVhZG9ubHkgcGhhc2VTZXJ2aWNlPzogTG9naWNEaWFnbm9zdGljcy5Mb2dpY1BoYXNlU2VydmljZVxuICAgIHJlYWRvbmx5IG1vZHVsZUlkPzogc3RyaW5nXG4gICAgcmVhZG9ubHkgbG9naWNVbml0PzogTG9naWNEaWFnbm9zdGljcy5Mb2dpY1VuaXRTZXJ2aWNlXG4gIH1cbiAgKTogQm91bmRBcGk8U2gsIFI+IHtcbiAgY29uc3QgcnVudGltZUludGVybmFscyA9IGdldFJ1bnRpbWVJbnRlcm5hbHMocnVudGltZSBhcyBhbnkpXG5cbiAgY29uc3QgZ2V0UGhhc2UgPSBvcHRpb25zPy5nZXRQaGFzZSA/PyAoKCkgPT4gXCJydW5cIilcbiAgY29uc3QgZ2V0Q3VycmVudFBoYXNlID0gKCk6IFwic2V0dXBcIiB8IFwicnVuXCIgPT4ge1xuICAgIGNvbnN0IHBoYXNlU2VydmljZSA9IG9wdGlvbnM/LnBoYXNlU2VydmljZVxuICAgIGNvbnN0IHBoYXNlID0gcGhhc2VTZXJ2aWNlPy5jdXJyZW50ID8/IGdldFBoYXNlKClcbiAgICByZXR1cm4gcGhhc2UgPT09IFwic2V0dXBcIiA/IFwic2V0dXBcIiA6IFwicnVuXCJcbiAgfVxuICBjb25zdCBndWFyZFJ1bk9ubHkgPSAoa2luZDogc3RyaW5nLCBhcGk6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHBoYXNlU2VydmljZSA9IG9wdGlvbnM/LnBoYXNlU2VydmljZVxuICAgIGNvbnN0IHBoYXNlID0gcGhhc2VTZXJ2aWNlPy5jdXJyZW50ID8/IGdldFBoYXNlKClcbiAgICBpZiAocGhhc2UgPT09IFwic2V0dXBcIikge1xuICAgICAgdGhyb3cgTG9naWNEaWFnbm9zdGljcy5tYWtlTG9naWNQaGFzZUVycm9yKFxuICAgICAgICBraW5kLFxuICAgICAgICBhcGksXG4gICAgICAgIFwic2V0dXBcIixcbiAgICAgICAgb3B0aW9ucz8ubW9kdWxlSWRcbiAgICAgIClcbiAgICB9XG4gIH1cbiAgY29uc3QgZmxvd0FwaSA9IEZsb3dSdW50aW1lLm1ha2U8U2gsIFI+KHJ1bnRpbWUsIHJ1bnRpbWVJbnRlcm5hbHMpXG5cbiAgY29uc3QgbWFrZUludGVudEJ1aWxkZXIgPSAocnVudGltZV86IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+KSA9PlxuICAgIExvZ2ljQnVpbGRlckZhY3Rvcnk8U2gsIFI+KHJ1bnRpbWVfLCBydW50aW1lSW50ZXJuYWxzKVxuICBjb25zdCB3aXRoTGlmZWN5Y2xlID0gPEE+KFxuICAgIGF2YWlsYWJsZTogKFxuICAgICAgbWFuYWdlcjogTGlmZWN5Y2xlLkxpZmVjeWNsZU1hbmFnZXJcbiAgICApID0+IEVmZmVjdC5FZmZlY3Q8QSwgbmV2ZXIsIGFueT4sXG4gICAgbWlzc2luZzogKCkgPT4gRWZmZWN0LkVmZmVjdDxBLCBuZXZlciwgYW55PlxuICApID0+XG4gICAgRWZmZWN0LnNlcnZpY2VPcHRpb24oTGlmZWN5Y2xlLkxpZmVjeWNsZUNvbnRleHQpLnBpcGUoXG4gICAgICBFZmZlY3QuZmxhdE1hcCgobWF5YmUpID0+XG4gICAgICAgIE9wdGlvbi5tYXRjaChtYXliZSwge1xuICAgICAgICAgIG9uU29tZTogYXZhaWxhYmxlLFxuICAgICAgICAgIG9uTm9uZTogbWlzc2luZyxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApXG4gIGNvbnN0IHdpdGhQbGF0Zm9ybSA9IChcbiAgICBpbnZva2U6IChwbGF0Zm9ybTogUGxhdGZvcm0uU2VydmljZSkgPT4gRWZmZWN0LkVmZmVjdDx2b2lkLCBuZXZlciwgYW55PlxuICApID0+XG4gICAgRWZmZWN0LnNlcnZpY2VPcHRpb24oUGxhdGZvcm0uVGFnKS5waXBlKFxuICAgICAgRWZmZWN0LmZsYXRNYXAoKG1heWJlKSA9PlxuICAgICAgICBPcHRpb24ubWF0Y2gobWF5YmUsIHtcbiAgICAgICAgICBvblNvbWU6IGludm9rZSxcbiAgICAgICAgICBvbk5vbmU6ICgpID0+IEVmZmVjdC52b2lkLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgIClcblxuICBjb25zdCBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uID0gKGFwaTogc3RyaW5nKTogRWZmZWN0LkVmZmVjdDx2b2lkPiA9PlxuICAgIERlYnVnLnJlY29yZCh7XG4gICAgICB0eXBlOiBcImRpYWdub3N0aWNcIixcbiAgICAgIG1vZHVsZUlkOiBydW50aW1lLm1vZHVsZUlkLFxuICAgICAgaW5zdGFuY2VJZDogcnVudGltZS5pbnN0YW5jZUlkLFxuICAgICAgY29kZTogXCJsb2dpYzo6aW52YWxpZF9waGFzZVwiLFxuICAgICAgc2V2ZXJpdHk6IFwiZXJyb3JcIixcbiAgICAgIG1lc3NhZ2U6IGAke2FwaX0gaXMgc2V0dXAtb25seSBhbmQgaXMgbm90IGFsbG93ZWQgaW4gcnVuIHBoYXNlLmAsXG4gICAgICBoaW50OlxuICAgICAgICBcIlx1NUMwNiAkLmxpZmVjeWNsZS4qIFx1OEMwM1x1NzUyOFx1NzlGQlx1NTJBOFx1NTIzMCBNb2R1bGUubG9naWMgYnVpbGRlciBcdTc2ODRcdTU0MENcdTZCNjVcdTkwRThcdTUyMDZcdUZGMDhyZXR1cm4gXHU0RTRCXHU1MjREXHVGRjA5XHU3NTI4XHU0RThFXHU2Q0U4XHU1MThDXHVGRjFCXCIgK1xuICAgICAgICBcInJ1biBcdTZCQjVcdTk3MDBcdTg5ODFcdTUyQThcdTYwMDFcdThENDRcdTZFOTBcdTZFMDVcdTc0MDZcdTY1RjZcdUZGMENcdThCRjdcdTRGN0ZcdTc1MjggRWZmZWN0LmFjcXVpcmVSZWxlYXNlIC8gU2NvcGUgZmluYWxpemVyXHVGRjBDXHU4MDBDXHU0RTBEXHU2NjJGIGxhdGUgXHU2Q0U4XHU1MThDIG9uRGVzdHJveVx1MzAwMlwiLFxuICAgICAga2luZDogXCJsaWZlY3ljbGVfaW5fcnVuXCIsXG4gICAgfSlcblxuICBjb25zdCBjcmVhdGVJbnRlbnRCdWlsZGVyID0gPFQ+KFxuICAgIHN0cmVhbTogU3RyZWFtLlN0cmVhbTxUPixcbiAgICB0cmlnZ2VyTmFtZT86IHN0cmluZyxcbiAgKSA9PiBtYWtlSW50ZW50QnVpbGRlcihydW50aW1lKShzdHJlYW0sIHRyaWdnZXJOYW1lKVxuXG4gIGNvbnN0IG9uY2VJblJ1blNlc3Npb24gPSAoa2V5OiBzdHJpbmcpOiBFZmZlY3QuRWZmZWN0PGJvb2xlYW4sIG5ldmVyLCBhbnk+ID0+XG4gICAgRWZmZWN0LnNlcnZpY2VPcHRpb24oUnVuU2Vzc2lvblRhZykucGlwZShcbiAgICAgIEVmZmVjdC5tYXAoKG1heWJlKSA9PlxuICAgICAgICBPcHRpb24uaXNTb21lKG1heWJlKSA/IG1heWJlLnZhbHVlLmxvY2FsLm9uY2Uoa2V5KSA6IHRydWUsXG4gICAgICApLFxuICAgIClcblxuICBsZXQgY2FjaGVkRGlhZ25vc3RpY3NMZXZlbDogRGVidWcuRGlhZ25vc3RpY3NMZXZlbCB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGlzTW9kdWxlTGlrZSA9IChcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgKTogdmFsdWUgaXMge1xuICAgIHJlYWRvbmx5IF9raW5kOiBcIk1vZHVsZURlZlwiIHwgXCJNb2R1bGVcIlxuICAgIHJlYWRvbmx5IGlkOiBzdHJpbmdcbiAgICByZWFkb25seSB0YWc6IENvbnRleHQuVGFnPGFueSwgTG9naXguTW9kdWxlUnVudGltZTxhbnksIGFueT4+XG4gICAgcmVhZG9ubHkgc2NoZW1hcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgcmVhZG9ubHkgbWV0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgcmVhZG9ubHkgZGV2PzogeyByZWFkb25seSBzb3VyY2U/OiB7IHJlYWRvbmx5IGZpbGU6IHN0cmluZzsgcmVhZG9ubHkgbGluZTogbnVtYmVyOyByZWFkb25seSBjb2x1bW46IG51bWJlciB9IH1cbiAgfSA9PlxuICAgIEJvb2xlYW4oXG4gICAgICB2YWx1ZSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgKCgodmFsdWUgYXMgYW55KS5fa2luZCA9PT0gXCJNb2R1bGVEZWZcIiB8fCAodmFsdWUgYXMgYW55KS5fa2luZCA9PT0gXCJNb2R1bGVcIikgJiZcbiAgICAgICAgICBcInRhZ1wiIGluICh2YWx1ZSBhcyBvYmplY3QpKSAmJlxuICAgICAgICBDb250ZXh0LmlzVGFnKCh2YWx1ZSBhcyBhbnkpLnRhZyksXG4gICAgKVxuXG4gIGNvbnN0IGJ1aWxkTW9kdWxlSGFuZGxlID0gKFxuICAgIHRhZzogQ29udGV4dC5UYWc8YW55LCBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55Pj4sXG4gICAgcnQ6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+LFxuICApOiB1bmtub3duID0+IHtcbiAgICBjb25zdCBhY3Rpb25zUHJveHk6IExvZ2l4Lk1vZHVsZUhhbmRsZTxhbnk+W1wiYWN0aW9uc1wiXSA9XG4gICAgICBuZXcgUHJveHkoXG4gICAgICAgIHt9LFxuICAgICAgICB7XG4gICAgICAgICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT5cbiAgICAgICAgICAgIChwYXlsb2FkOiB1bmtub3duKSA9PlxuICAgICAgICAgICAgICBydC5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgX3RhZzogcHJvcCBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICApIGFzIExvZ2l4Lk1vZHVsZUhhbmRsZTxhbnk+W1wiYWN0aW9uc1wiXVxuXG4gICAgY29uc3QgaGFuZGxlOiBMb2dpeC5Nb2R1bGVIYW5kbGU8YW55PiA9IHtcbiAgICAgIHJlYWQ6IChzZWxlY3RvcikgPT4gRWZmZWN0Lm1hcChydC5nZXRTdGF0ZSwgc2VsZWN0b3IpLFxuICAgICAgY2hhbmdlczogcnQuY2hhbmdlcyxcbiAgICAgIGRpc3BhdGNoOiBydC5kaXNwYXRjaCxcbiAgICAgIGFjdGlvbnMkOiBydC5hY3Rpb25zJCxcbiAgICAgIGFjdGlvbnM6IGFjdGlvbnNQcm94eSxcbiAgICB9XG5cbiAgICBjb25zdCBFWFRFTkRfSEFORExFID0gU3ltYm9sLmZvcihcImxvZ2l4Lm1vZHVsZS5oYW5kbGUuZXh0ZW5kXCIpXG4gICAgY29uc3QgZXh0ZW5kID1cbiAgICAgICh0YWcgYXMgYW55KT8uW0VYVEVORF9IQU5ETEVdIGFzXG4gICAgICAgIHwgKChcbiAgICAgICAgICAgIHJ1bnRpbWU6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+LFxuICAgICAgICAgICAgYmFzZTogTG9naXguTW9kdWxlSGFuZGxlPGFueT4sXG4gICAgICAgICAgKSA9PiB1bmtub3duKVxuICAgICAgICB8IHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHR5cGVvZiBleHRlbmQgPT09IFwiZnVuY3Rpb25cIiA/IChleHRlbmQocnQsIGhhbmRsZSkgPz8gaGFuZGxlKSA6IGhhbmRsZVxuICB9XG5cbiAgY29uc3QgZW1pdE1vZHVsZURlc2NyaXB0b3JPbmNlID0gKFxuICAgIG1vZHVsZToge1xuICAgICAgcmVhZG9ubHkgaWQ6IHN0cmluZ1xuICAgICAgcmVhZG9ubHkgdGFnOiBhbnlcbiAgICAgIHJlYWRvbmx5IHNjaGVtYXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgcmVhZG9ubHkgbWV0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICByZWFkb25seSBkZXY/OiB7IHJlYWRvbmx5IHNvdXJjZT86IHsgcmVhZG9ubHkgZmlsZTogc3RyaW5nOyByZWFkb25seSBsaW5lOiBudW1iZXI7IHJlYWRvbmx5IGNvbHVtbjogbnVtYmVyIH0gfVxuICAgIH0sXG4gICAgcnQ6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+LFxuICApOiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+ID0+XG4gICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgLy8gXHU0RTNBIGhvdC1wYXRoIFx1NTE1Q1x1NUU5NVx1RkYxQVx1OEJDQVx1NjVBRFx1N0VBN1x1NTIyQlx1NEUzQSBvZmYgXHU2NUY2XHU2QzM4XHU0RTBEXHU1M0QxXHU0RThCXHU0RUY2XHUzMDAyXG4gICAgICBpZiAoY2FjaGVkRGlhZ25vc3RpY3NMZXZlbCA9PT0gXCJvZmZcIikgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGtleSA9IGBtb2R1bGVfZGVzY3JpcHRvcjoke1N0cmluZyhydC5pbnN0YW5jZUlkID8/IFwidW5rbm93blwiKX1gXG4gICAgICBjb25zdCBzaG91bGRFbWl0ID0geWllbGQqIG9uY2VJblJ1blNlc3Npb24oa2V5KVxuICAgICAgaWYgKCFzaG91bGRFbWl0KSByZXR1cm5cblxuICAgICAgY29uc3QgYWN0aW9uS2V5cyA9IE9iamVjdC5rZXlzKChtb2R1bGUudGFnIGFzIGFueSk/LnNoYXBlPy5hY3Rpb25NYXAgPz8ge30pXG5cbiAgICAgIGNvbnN0IGludGVybmFsU3ltYm9sID0gU3ltYm9sLmZvcihcImxvZ2l4Lm1vZHVsZS5pbnRlcm5hbFwiKVxuICAgICAgY29uc3QgaW50ZXJuYWwgPSAobW9kdWxlIGFzIGFueSlbaW50ZXJuYWxTeW1ib2xdIGFzXG4gICAgICAgIHwgeyByZWFkb25seSBtb3VudGVkPzogUmVhZG9ubHlBcnJheTxhbnk+IH1cbiAgICAgICAgfCB1bmRlZmluZWRcblxuICAgICAgY29uc3QgbG9naWNVbml0cyA9IChpbnRlcm5hbD8ubW91bnRlZCA/PyBbXSkubWFwKCh1OiBhbnkpID0+ICh7XG4gICAgICAgIGtpbmQ6IFN0cmluZyh1Py5raW5kID8/IFwidXNlclwiKSxcbiAgICAgICAgaWQ6IFN0cmluZyh1Py5pZCA/PyBcIlwiKSxcbiAgICAgICAgZGVyaXZlZDogdT8uZGVyaXZlZCA/IHRydWUgOiB1bmRlZmluZWQsXG4gICAgICAgIG5hbWU6IHR5cGVvZiB1Py5uYW1lID09PSBcInN0cmluZ1wiID8gdS5uYW1lIDogdW5kZWZpbmVkLFxuICAgICAgfSkpXG5cbiAgICAgIGNvbnN0IHNjaGVtYUtleXMgPVxuICAgICAgICBtb2R1bGUuc2NoZW1hcyAmJiB0eXBlb2YgbW9kdWxlLnNjaGVtYXMgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICA/IE9iamVjdC5rZXlzKG1vZHVsZS5zY2hlbWFzKVxuICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgIGNvbnN0IG1ldGEgPVxuICAgICAgICBtb2R1bGUubWV0YSAmJiB0eXBlb2YgbW9kdWxlLm1ldGEgPT09IFwib2JqZWN0XCIgPyBtb2R1bGUubWV0YSA6IHVuZGVmaW5lZFxuXG4gICAgICBjb25zdCBzb3VyY2UgPSBtb2R1bGUuZGV2Py5zb3VyY2VcblxuICAgICAgY29uc3QgdHJhaXRzU25hcHNob3QgPSBydW50aW1lSW50ZXJuYWxzLnRyYWl0cy5nZXRNb2R1bGVUcmFpdHNTbmFwc2hvdCgpXG4gICAgICBjb25zdCB0cmFpdHMgPVxuICAgICAgICB0cmFpdHNTbmFwc2hvdFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkaWdlc3Q6IHRyYWl0c1NuYXBzaG90LmRpZ2VzdCxcbiAgICAgICAgICAgICAgY291bnQ6IHRyYWl0c1NuYXBzaG90LnRyYWl0cy5sZW5ndGgsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWRcblxuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgaWQ6IG1vZHVsZS5pZCxcbiAgICAgICAgbW9kdWxlSWQ6IFN0cmluZyhydC5tb2R1bGVJZCksXG4gICAgICAgIGluc3RhbmNlSWQ6IFN0cmluZyhydC5pbnN0YW5jZUlkKSxcbiAgICAgICAgYWN0aW9uS2V5cyxcbiAgICAgICAgbG9naWNVbml0cyxcbiAgICAgICAgc2NoZW1hS2V5cyxcbiAgICAgICAgbWV0YSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICB0cmFpdHMsXG4gICAgICB9XG5cbiAgICAgIHlpZWxkKiBEZWJ1Zy5yZWNvcmQoe1xuICAgICAgICB0eXBlOiBcInRyYWNlOm1vZHVsZTpkZXNjcmlwdG9yXCIsXG4gICAgICAgIG1vZHVsZUlkOiBydC5tb2R1bGVJZCxcbiAgICAgICAgaW5zdGFuY2VJZDogcnQuaW5zdGFuY2VJZCxcbiAgICAgICAgZGF0YSxcbiAgICAgIH0gYXMgYW55KVxuICAgIH0pXG5cbiAgLyoqXG4gICAqIHN0cmljdFx1RkYxQVx1NTNFQVx1NEVDRVx1MjAxQ1x1NUY1M1x1NTI0RCBFZmZlY3QgRW52XHUyMDFEXHU4OUUzXHU2NzkwXHU2N0QwXHU0RTJBIE1vZHVsZSBcdTc2ODQgUnVudGltZVx1MzAwMlxuICAgKlxuICAgKiBcdThCRjRcdTY2MEVcdUZGMUFcbiAgICogLSBcdTU5MUEgcm9vdCAvIFx1NTkxQVx1NUI5RVx1NEY4Qlx1NTczQVx1NjY2Rlx1NEUwQlx1RkYwQ1x1NEVGQlx1NEY1NVx1OEZEQlx1N0EwQlx1N0VBNyByZWdpc3RyeSBcdTkwRkRcdTY1RTBcdTZDRDVcdTg4NjhcdThGQkVcdTZCNjNcdTc4NkVcdThCRURcdTRFNDlcdUZGMUJcbiAgICogLSBcdTdGM0FcdTU5MzFcdTYzRDBcdTRGOUJcdTgwMDVcdTVDNUVcdTRFOEVcdTg4QzVcdTkxNERcdTk1MTlcdThCRUZcdUZGMUFcdTVGQzVcdTk4N0JcdTdBMzNcdTVCOUFcdTU5MzFcdThEMjVcdUZGMENcdTVFNzZcdTdFRDlcdTUxRkFcdTUzRUZcdTRGRUVcdTU5MERcdTc2ODRcdTYzRDBcdTc5M0FcdUZGMDhkZXYvdGVzdCBcdTRFMEJcdTY2RjRcdThCRTZcdTdFQzZcdUZGMDlcdTMwMDJcbiAgICovXG4gIGNvbnN0IHJlc29sdmVNb2R1bGVSdW50aW1lID0gKFxuICAgIHRhZzogQ29udGV4dC5UYWc8YW55LCBMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55Pj5cbiAgKTogRWZmZWN0LkVmZmVjdDxMb2dpeC5Nb2R1bGVSdW50aW1lPGFueSwgYW55PiwgbmV2ZXIsIGFueT4gPT5cbiAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBjb25zdCByZXF1ZXN0ZWRNb2R1bGVJZCA9XG4gICAgICAgIHR5cGVvZiAodGFnIGFzIGFueSk/LmlkID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyAoKHRhZyBhcyBhbnkpLmlkIGFzIHN0cmluZylcbiAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgY29uc3QgZnJvbU1vZHVsZUlkID1cbiAgICAgICAgdHlwZW9mIG9wdGlvbnM/Lm1vZHVsZUlkID09PSBcInN0cmluZ1wiID8gb3B0aW9ucy5tb2R1bGVJZCA6IHVuZGVmaW5lZFxuXG4gICAgICAvLyAxKSBcdTRGMThcdTUxNDhcdTVDMURcdThCRDVcdTRFQ0VcdTVGNTNcdTUyNEQgQ29udGV4dCBcdTRFMkRcdThCRkJcdTUzRDZcbiAgICAgIGNvbnN0IGZyb21FbnYgPSB5aWVsZCogRWZmZWN0LnNlcnZpY2VPcHRpb24odGFnKVxuICAgICAgaWYgKE9wdGlvbi5pc1NvbWUoZnJvbUVudikpIHtcbiAgICAgICAgcmV0dXJuIGZyb21FbnYudmFsdWVcbiAgICAgIH1cblxuICAgICAgLy8gMikgXHU2NUUwXHU2Q0Q1XHU2MjdFXHU1MjMwXHU2NUY2XHU3NkY0XHU2M0E1IGRpZSBcdTIwMTRcdTIwMTQgXHU4RkQ5XHU2NjJGXHU5MTREXHU3RjZFXHU5NTE5XHU4QkVGXHVGRjBDXHU2M0QwXHU3OTNBXHU4QzAzXHU3NTI4XHU2NUI5XHU0RkVFXHU2QjYzXHU4OEM1XHU5MTREXHU2NUI5XHU1RjBGXG4gICAgICBjb25zdCB0b2tlbklkID0gcmVxdWVzdGVkTW9kdWxlSWQgPz8gXCI8dW5rbm93biBtb2R1bGUgaWQ+XCJcbiAgICAgIGNvbnN0IGZpeDogc3RyaW5nW10gPSBpc0RldkVudigpXG4gICAgICAgID8gW1xuICAgICAgICAgICAgXCItIFByb3ZpZGUgdGhlIGNoaWxkIGltcGxlbWVudGF0aW9uIGluIHRoZSBzYW1lIHNjb3BlIChpbXBvcnRzKS5cIixcbiAgICAgICAgICAgIGAgIEV4YW1wbGU6ICR7ZnJvbU1vZHVsZUlkID8/IFwiUGFyZW50TW9kdWxlXCJ9LmltcGxlbWVudCh7IGltcG9ydHM6IFske3JlcXVlc3RlZE1vZHVsZUlkID8/IFwiQ2hpbGRNb2R1bGVcIn0uaW1wbF0sIC4uLiB9KWAsXG4gICAgICAgICAgICBcIi0gSWYgeW91IGludGVudGlvbmFsbHkgd2FudCBhIHJvb3Qgc2luZ2xldG9uLCBwcm92aWRlIGl0IGF0IGFwcCByb290IChSdW50aW1lLm1ha2UoLi4uLHsgbGF5ZXIgfSkgLyByb290IGltcG9ydHMpLFwiLFxuICAgICAgICAgICAgXCIgIGFuZCB1c2UgUm9vdC5yZXNvbHZlKE1vZHVsZVRhZykgKGluc3RlYWQgb2YgJC51c2UpIGF0IHRoZSBjYWxsc2l0ZS5cIixcbiAgICAgICAgICBdXG4gICAgICAgIDogW11cblxuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKFxuICAgICAgICBpc0RldkVudigpXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIFwiW01pc3NpbmdNb2R1bGVSdW50aW1lRXJyb3JdIENhbm5vdCByZXNvbHZlIE1vZHVsZVJ1bnRpbWUgZm9yIE1vZHVsZVRhZy5cIixcbiAgICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgICAgYHRva2VuSWQ6ICR7dG9rZW5JZH1gLFxuICAgICAgICAgICAgICBcImVudHJ5cG9pbnQ6IGxvZ2ljLiQudXNlXCIsXG4gICAgICAgICAgICAgIFwibW9kZTogc3RyaWN0XCIsXG4gICAgICAgICAgICAgIGBmcm9tOiAke2Zyb21Nb2R1bGVJZCA/PyBcIjx1bmtub3duIG1vZHVsZSBpZD5cIn1gLFxuICAgICAgICAgICAgICBgc3RhcnRTY29wZTogbW9kdWxlSWQ9JHtmcm9tTW9kdWxlSWQgPz8gXCI8dW5rbm93bj5cIn0sIGluc3RhbmNlSWQ9JHtTdHJpbmcocnVudGltZS5pbnN0YW5jZUlkID8/IFwiPHVua25vd24+XCIpfWAsXG4gICAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICAgIFwiZml4OlwiLFxuICAgICAgICAgICAgICAuLi5maXgsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICA6IFwiW01pc3NpbmdNb2R1bGVSdW50aW1lRXJyb3JdIG1vZHVsZSBydW50aW1lIG5vdCBmb3VuZFwiLFxuICAgICAgKVxuXG4gICAgICA7KGVyciBhcyBhbnkpLnRva2VuSWQgPSB0b2tlbklkXG4gICAgICA7KGVyciBhcyBhbnkpLmVudHJ5cG9pbnQgPSBcImxvZ2ljLiQudXNlXCJcbiAgICAgIDsoZXJyIGFzIGFueSkubW9kZSA9IFwic3RyaWN0XCJcbiAgICAgIDsoZXJyIGFzIGFueSkuZnJvbSA9IGZyb21Nb2R1bGVJZFxuICAgICAgOyhlcnIgYXMgYW55KS5zdGFydFNjb3BlID0ge1xuICAgICAgICBtb2R1bGVJZDogZnJvbU1vZHVsZUlkLFxuICAgICAgICBpbnN0YW5jZUlkOiBTdHJpbmcocnVudGltZS5pbnN0YW5jZUlkID8/IFwiPHVua25vd24+XCIpLFxuICAgICAgfVxuICAgICAgOyhlcnIgYXMgYW55KS5maXggPSBmaXhcblxuICAgICAgZXJyLm5hbWUgPSBcIk1pc3NpbmdNb2R1bGVSdW50aW1lRXJyb3JcIlxuICAgICAgcmV0dXJuIHlpZWxkKiBFZmZlY3QuZGllKGVycilcbiAgICB9KVxuXG4gIGNvbnN0IHN0YXRlQXBpOiBCb3VuZEFwaTxTaCwgUj5bXCJzdGF0ZVwiXSA9IHtcbiAgICByZWFkOiBydW50aW1lLmdldFN0YXRlLFxuICAgIHVwZGF0ZTogKGYpID0+XG4gICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGluVHhuID0geWllbGQqIEZpYmVyUmVmLmdldChUYXNrUnVubmVyLmluU3luY1RyYW5zYWN0aW9uRmliZXIpXG4gICAgICAgIGlmIChpblR4bikge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSB5aWVsZCogcnVudGltZS5nZXRTdGF0ZVxuICAgICAgICAgIHJldHVybiB5aWVsZCogcnVudGltZS5zZXRTdGF0ZShmKHByZXYpKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm9keSA9ICgpID0+XG4gICAgICAgICAgRWZmZWN0LmZsYXRNYXAocnVudGltZS5nZXRTdGF0ZSwgKHByZXYpID0+IHJ1bnRpbWUuc2V0U3RhdGUoZihwcmV2KSkpXG5cbiAgICAgICAgcmV0dXJuIHlpZWxkKiAocnVudGltZUludGVybmFsc1xuICAgICAgICAgID8gcnVudGltZUludGVybmFscy50eG4ucnVuV2l0aFN0YXRlVHJhbnNhY3Rpb24oXG4gICAgICAgICAgICAgIHsga2luZDogXCJzdGF0ZVwiLCBuYW1lOiBcInVwZGF0ZVwiIH0gYXMgYW55LFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogYm9keSgpKVxuICAgICAgfSksXG4gICAgbXV0YXRlOiAoZikgPT5cbiAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgcmVjb3JkUGF0Y2ggPSBydW50aW1lSW50ZXJuYWxzPy50eG4ucmVjb3JkU3RhdGVQYXRjaFxuXG4gICAgICAgIGNvbnN0IGluVHhuID0geWllbGQqIEZpYmVyUmVmLmdldChUYXNrUnVubmVyLmluU3luY1RyYW5zYWN0aW9uRmliZXIpXG4gICAgICAgIGlmIChpblR4bikge1xuICAgICAgICAgIGNvbnN0IHByZXYgPSB5aWVsZCogcnVudGltZS5nZXRTdGF0ZVxuICAgICAgICAgIGNvbnN0IHsgbmV4dFN0YXRlLCBwYXRjaFBhdGhzIH0gPSBtdXRhdGVXaXRoUGF0Y2hQYXRocyhcbiAgICAgICAgICAgIHByZXYgYXMgTG9naXguU3RhdGVPZjxTaD4sXG4gICAgICAgICAgICAoZHJhZnQpID0+IHtcbiAgICAgICAgICAgICAgZihkcmFmdCBhcyBMb2dpYy5EcmFmdDxMb2dpeC5TdGF0ZU9mPFNoPj4pXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcblxuICAgICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRjaFBhdGhzKSB7XG4gICAgICAgICAgICByZWNvcmRQYXRjaD8uKHtcbiAgICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgICAgcmVhc29uOiBcInN0YXRlOm11dGF0ZVwiLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4geWllbGQqIHJ1bnRpbWUuc2V0U3RhdGUobmV4dFN0YXRlKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm9keSA9ICgpID0+XG4gICAgICAgICAgRWZmZWN0LmZsYXRNYXAocnVudGltZS5nZXRTdGF0ZSwgKHByZXYpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmV4dFN0YXRlLCBwYXRjaFBhdGhzIH0gPSBtdXRhdGVXaXRoUGF0Y2hQYXRocyhcbiAgICAgICAgICAgICAgcHJldiBhcyBMb2dpeC5TdGF0ZU9mPFNoPixcbiAgICAgICAgICAgICAgKGRyYWZ0KSA9PiB7XG4gICAgICAgICAgICAgICAgZihkcmFmdCBhcyBMb2dpYy5EcmFmdDxMb2dpeC5TdGF0ZU9mPFNoPj4pXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwYXRjaFBhdGhzKSB7XG4gICAgICAgICAgICAgIHJlY29yZFBhdGNoPy4oe1xuICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgcmVhc29uOiBcInN0YXRlOm11dGF0ZVwiLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcnVudGltZS5zZXRTdGF0ZShuZXh0U3RhdGUpXG4gICAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4geWllbGQqIChydW50aW1lSW50ZXJuYWxzXG4gICAgICAgICAgPyBydW50aW1lSW50ZXJuYWxzLnR4bi5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICAgICAgeyBraW5kOiBcInN0YXRlXCIsIG5hbWU6IFwibXV0YXRlXCIgfSBhcyBhbnksXG4gICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBib2R5KCkpXG4gICAgICB9KSxcbiAgICByZWY6IHJ1bnRpbWUucmVmLFxuICB9XG5cbiAgY29uc3QgYWN0aW9uc0FwaSA9IG5ldyBQcm94eSh7fSBhcyBCb3VuZEFwaTxTaCwgUj5bXCJhY3Rpb25zXCJdLCB7XG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4ge1xuICAgICAgaWYgKHByb3AgPT09IFwiZGlzcGF0Y2hcIikge1xuICAgICAgICByZXR1cm4gKGE6IExvZ2l4LkFjdGlvbk9mPFNoPikgPT4gcnVudGltZS5kaXNwYXRjaChhKVxuICAgICAgfVxuICAgICAgaWYgKHByb3AgPT09IFwiYWN0aW9ucyRcIikge1xuICAgICAgICByZXR1cm4gcnVudGltZS5hY3Rpb25zJFxuICAgICAgfVxuICAgICAgcmV0dXJuIChwYXlsb2FkOiBhbnkpID0+XG4gICAgICAgIHJ1bnRpbWUuZGlzcGF0Y2goeyBfdGFnOiBwcm9wIGFzIHN0cmluZywgcGF5bG9hZCB9IGFzIExvZ2l4LkFjdGlvbk9mPFNoPilcbiAgICB9LFxuICB9KVxuXG4gIGNvbnN0IG1hdGNoQXBpID0gPFY+KHZhbHVlOiBWKTogTG9naWMuRmx1ZW50TWF0Y2g8Vj4gPT5cbiAgICBNYXRjaEJ1aWxkZXIubWFrZU1hdGNoKHZhbHVlKVxuXG4gIGNvbnN0IG1hdGNoVGFnQXBpID0gPFYgZXh0ZW5kcyB7IF90YWc6IHN0cmluZyB9PihcbiAgICB2YWx1ZTogVlxuICApOiBMb2dpYy5GbHVlbnRNYXRjaFRhZzxWPiA9PiBNYXRjaEJ1aWxkZXIubWFrZU1hdGNoVGFnKHZhbHVlKVxuXG4gIC8vIFByaW1hcnkgUmVkdWNlciBcdTZDRThcdTUxOENcdUZGMUFcdTkwMUFcdThGQzcgcnVudGltZSBcdTRFMEFcdTc2ODRcdTUxODVcdTkwRThcdTZDRThcdTUxOENcdTUxRkRcdTY1NzBcdUZGMDhcdTgyRTVcdTVCNThcdTU3MjhcdUZGMDlcdTUxOTlcdTUxNjUgcmVkdWNlciBcdTY2MjBcdTVDMDRcdTMwMDJcbiAgY29uc3QgcmVkdWNlcjogQm91bmRBcGk8U2gsIFI+W1wicmVkdWNlclwiXSA9ICh0YWcsIGZuKSA9PiB7XG4gICAgcmV0dXJuIEVmZmVjdC5zeW5jKCgpID0+IHtcbiAgICAgIHJ1bnRpbWVJbnRlcm5hbHMudHhuLnJlZ2lzdGVyUmVkdWNlcihTdHJpbmcodGFnKSwgZm4gYXMgYW55KVxuICAgIH0pIGFzIGFueVxuICB9XG5cbiAgY29uc3QgYXBpOiBCb3VuZEFwaTxTaCwgUj4gPSB7XG4gICAgc3RhdGU6IHN0YXRlQXBpLFxuICAgIGFjdGlvbnM6IGFjdGlvbnNBcGksXG4gICAgZmxvdzogZmxvd0FwaSxcbiAgICBtYXRjaDogbWF0Y2hBcGksXG4gICAgbWF0Y2hUYWc6IG1hdGNoVGFnQXBpLFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25Jbml0UmVxdWlyZWQ6IChlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4pID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSBcInJ1blwiKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oXCIkLmxpZmVjeWNsZS5vbkluaXRSZXF1aXJlZFwiKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlckluaXRSZXF1aXJlZChlZmYgYXMgYW55KVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25TdGFydDogKGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPikgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09IFwicnVuXCIpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbihcIiQubGlmZWN5Y2xlLm9uU3RhcnRcIikgYXMgYW55XG4gICAgICAgIH1cbiAgICAgICAgcnVudGltZUludGVybmFscy5saWZlY3ljbGUucmVnaXN0ZXJTdGFydChlZmYgYXMgYW55KVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25Jbml0OiAoZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KSA9PiB7XG4gICAgICAgIC8vIGxlZ2FjeSBhbGlhc1x1RkYxQVx1OEJFRFx1NEU0OVx1N0I0OVx1NTQwQ1x1NEU4RSBvbkluaXRSZXF1aXJlZFx1RkYwOFx1NEUzQVx1NEU4Nlx1OEZDMVx1NzlGQlx1NjcxRlx1NTFDRlx1NUMxMVx1NjQ2OVx1NjRFNlx1RkYwOVx1MzAwMlxuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09IFwicnVuXCIpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbihcIiQubGlmZWN5Y2xlLm9uSW5pdFwiKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlckluaXRSZXF1aXJlZChlZmYgYXMgYW55KVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25EZXN0cm95OiAoZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+KSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gXCJydW5cIikge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKFwiJC5saWZlY3ljbGUub25EZXN0cm95XCIpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyRGVzdHJveShlZmYgYXMgYW55KVxuICAgICAgICByZXR1cm4gRWZmZWN0LnZvaWQgYXMgYW55XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKFxuICAgICAgICBoYW5kbGVyOiAoXG4gICAgICAgICAgY2F1c2U6IGltcG9ydChcImVmZmVjdFwiKS5DYXVzZS5DYXVzZTx1bmtub3duPixcbiAgICAgICAgICBjb250ZXh0OiBMaWZlY3ljbGUuRXJyb3JDb250ZXh0LFxuICAgICAgICApID0+IEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIFI+LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gXCJydW5cIikge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKFwiJC5saWZlY3ljbGUub25FcnJvclwiKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3Rlck9uRXJyb3IoaGFuZGxlciBhcyBhbnkpXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvblN1c3BlbmQ6IChcbiAgICAgICAgZWZmOiBMb2dpYy5PZjxTaCwgUiwgdm9pZCwgbmV2ZXI+LFxuICAgICAgKSA9PiB7XG4gICAgICAgIGlmIChnZXRDdXJyZW50UGhhc2UoKSA9PT0gXCJydW5cIikge1xuICAgICAgICAgIHJldHVybiBlbWl0U2V0dXBPbmx5VmlvbGF0aW9uKFwiJC5saWZlY3ljbGUub25TdXNwZW5kXCIpIGFzIGFueVxuICAgICAgICB9XG4gICAgICAgIHJ1bnRpbWVJbnRlcm5hbHMubGlmZWN5Y2xlLnJlZ2lzdGVyUGxhdGZvcm1TdXNwZW5kKFxuICAgICAgICAgIEVmZmVjdC5hc1ZvaWQoZWZmIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pLFxuICAgICAgICApXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvblJlc3VtZTogKFxuICAgICAgICBlZmY6IExvZ2ljLk9mPFNoLCBSLCB2b2lkLCBuZXZlcj4sXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSBcInJ1blwiKSB7XG4gICAgICAgICAgcmV0dXJuIGVtaXRTZXR1cE9ubHlWaW9sYXRpb24oXCIkLmxpZmVjeWNsZS5vblJlc3VtZVwiKSBhcyBhbnlcbiAgICAgICAgfVxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLmxpZmVjeWNsZS5yZWdpc3RlclBsYXRmb3JtUmVzdW1lKFxuICAgICAgICAgIEVmZmVjdC5hc1ZvaWQoZWZmIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pLFxuICAgICAgICApXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgICBvblJlc2V0OiAoXG4gICAgICAgIGVmZjogTG9naWMuT2Y8U2gsIFIsIHZvaWQsIG5ldmVyPixcbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoZ2V0Q3VycmVudFBoYXNlKCkgPT09IFwicnVuXCIpIHtcbiAgICAgICAgICByZXR1cm4gZW1pdFNldHVwT25seVZpb2xhdGlvbihcIiQubGlmZWN5Y2xlLm9uUmVzZXRcIikgYXMgYW55XG4gICAgICAgIH1cbiAgICAgICAgcnVudGltZUludGVybmFscy5saWZlY3ljbGUucmVnaXN0ZXJQbGF0Zm9ybVJlc2V0KFxuICAgICAgICAgIEVmZmVjdC5hc1ZvaWQoZWZmIGFzIEVmZmVjdC5FZmZlY3Q8dm9pZCwgbmV2ZXIsIGFueT4pLFxuICAgICAgICApXG4gICAgICAgIHJldHVybiBFZmZlY3Qudm9pZCBhcyBhbnlcbiAgICAgIH0sXG4gICAgfSxcbiAgICB0cmFpdHM6IHtcbiAgICAgIGRlY2xhcmU6ICh0cmFpdHM6IE1vZHVsZVRyYWl0cy5UcmFpdFNwZWMpID0+IHtcbiAgICAgICAgaWYgKGdldEN1cnJlbnRQaGFzZSgpID09PSBcInJ1blwiKSB7XG4gICAgICAgICAgdGhyb3cgTG9naWNEaWFnbm9zdGljcy5tYWtlTG9naWNQaGFzZUVycm9yKFxuICAgICAgICAgICAgXCJ0cmFpdHNfZGVjbGFyZV9pbl9ydW5cIixcbiAgICAgICAgICAgIFwiJC50cmFpdHMuZGVjbGFyZVwiLFxuICAgICAgICAgICAgXCJydW5cIixcbiAgICAgICAgICAgIG9wdGlvbnM/Lm1vZHVsZUlkLFxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdHJhaXRzIHx8IHR5cGVvZiB0cmFpdHMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIltJbnZhbGlkVHJhaXRzRGVjbGFyYXRpb25dICQudHJhaXRzLmRlY2xhcmUgZXhwZWN0cyBhbiBvYmplY3QuXCIsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9naWNVbml0ID0gb3B0aW9ucz8ubG9naWNVbml0ID8/IHtcbiAgICAgICAgICBsb2dpY1VuaXRJZDogXCJ1bmtub3duXCIsXG4gICAgICAgICAgbG9naWNVbml0SWRLaW5kOiBcImRlcml2ZWRcIiBhcyBjb25zdCxcbiAgICAgICAgICBsb2dpY1VuaXRMYWJlbDogXCJsb2dpY1VuaXQ6dW5rbm93blwiLFxuICAgICAgICAgIHBhdGg6IHVuZGVmaW5lZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIH1cblxuICAgICAgICBydW50aW1lSW50ZXJuYWxzLnRyYWl0cy5yZWdpc3Rlck1vZHVsZVRyYWl0c0NvbnRyaWJ1dGlvbih7XG4gICAgICAgICAgdHJhaXRzLFxuICAgICAgICAgIHByb3ZlbmFuY2U6IHtcbiAgICAgICAgICAgIG9yaWdpblR5cGU6IFwibG9naWNVbml0XCIsXG4gICAgICAgICAgICBvcmlnaW5JZDogbG9naWNVbml0LmxvZ2ljVW5pdElkLFxuICAgICAgICAgICAgb3JpZ2luSWRLaW5kOiBsb2dpY1VuaXQubG9naWNVbml0SWRLaW5kLFxuICAgICAgICAgICAgb3JpZ2luTGFiZWw6IGxvZ2ljVW5pdC5sb2dpY1VuaXRMYWJlbCxcbiAgICAgICAgICAgIHBhdGg6IGxvZ2ljVW5pdC5wYXRoLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIEVmZmVjdC52b2lkIGFzIGFueVxuICAgICAgfSxcbiAgICAgIHNvdXJjZToge1xuICAgICAgICByZWZyZXNoOiAoZmllbGRQYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgRWZmZWN0LmdlbihmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChydW50aW1lSW50ZXJuYWxzLnRyYWl0cy5nZXRTb3VyY2VSZWZyZXNoSGFuZGxlcihcbiAgICAgICAgICAgICAgZmllbGRQYXRoLFxuICAgICAgICAgICAgKSBhc1xuICAgICAgICAgICAgICB8ICgoc3RhdGU6IExvZ2l4LlN0YXRlT2Y8U2g+KSA9PiBFZmZlY3QuRWZmZWN0PHZvaWQsIG5ldmVyLCBhbnk+KVxuICAgICAgICAgICAgICB8IHVuZGVmaW5lZClcbiAgICAgICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgICAvLyBcdTgyRTVcdTY3MkFcdTZDRThcdTUxOENcdTUyMzdcdTY1QjBcdTkwM0JcdThGOTFcdUZGMENcdTUyMTlcdTg5QzZcdTRFM0Egbm8tb3BcdUZGMENcdTkwN0ZcdTUxNERcdTU3MjhcdTY3MkFcdTYzMDIgU3RhdGVUcmFpdFByb2dyYW0gXHU2NUY2XHU2MjlCXHU5NTE5XHUzMDAyXG4gICAgICAgICAgICAgIHJldHVybiB5aWVsZCogRWZmZWN0LnZvaWRcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gXHU0RThCXHU1MkExXHU3QTk3XHU1M0UzXHU1MTg1XHU3OTgxXHU2QjYyXHU1MThEXHU4RDcwIGVucXVldWVUcmFuc2FjdGlvblx1RkYwOFx1NEYxQVx1NUJGQ1x1ODFGNFx1NkI3Qlx1OTUwMVx1RkYwOVx1RkYxQVxuICAgICAgICAgICAgLy8gLSBcdTc2RjRcdTYzQTVcdTU3MjhcdTVGNTNcdTUyNERcdTRFOEJcdTUyQTFcdTUxODVcdTYyNjdcdTg4NEMgaGFuZGxlclx1RkYwQ1x1NEY3Rlx1NTE3Nlx1OTAxQVx1OEZDNyBib3VuZC5zdGF0ZS5tdXRhdGUgXHU1MTk5XHU1MTY1IGRyYWZ0XHVGRjFCXG4gICAgICAgICAgICAvLyAtIFx1NzUzMVx1NTkxNlx1NUM0Mlx1NTQwQ1x1NEUwMFx1NEU4Qlx1NTJBMVx1N0E5N1x1NTNFM1x1OEQxRlx1OEQyMyBjb21taXQgKyBkZWJ1ZyBcdTgwNUFcdTU0MDhcdTMwMDJcbiAgICAgICAgICAgIGNvbnN0IGluVHhuID0geWllbGQqIEZpYmVyUmVmLmdldChUYXNrUnVubmVyLmluU3luY1RyYW5zYWN0aW9uRmliZXIpXG4gICAgICAgICAgICBpZiAoaW5UeG4pIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSAoeWllbGQqIHJ1bnRpbWUuZ2V0U3RhdGUpIGFzIExvZ2l4LlN0YXRlT2Y8U2g+XG4gICAgICAgICAgICAgIHJldHVybiB5aWVsZCogaGFuZGxlcihzdGF0ZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gXHU1QzA2XHU0RTAwXHU2QjIxIHNvdXJjZS1yZWZyZXNoIFx1ODlDNlx1NEUzQVx1NTM1NVx1NzJFQ1x1NzY4NFx1NEU4Qlx1NTJBMVx1NTE2NVx1NTNFM1x1MzAwMlxuICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBydW50aW1lSW50ZXJuYWxzLnR4bi5ydW5XaXRoU3RhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwic291cmNlLXJlZnJlc2hcIixcbiAgICAgICAgICAgICAgICBuYW1lOiBmaWVsZFBhdGgsXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgIEVmZmVjdC5nZW4oZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gKHlpZWxkKiBydW50aW1lLmdldFN0YXRlKSBhcyBMb2dpeC5TdGF0ZU9mPFNoPlxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkKiBoYW5kbGVyKHN0YXRlKVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlZHVjZXIsXG4gICAgdXNlOiBuZXcgUHJveHkoKCkgPT4ge30sIHtcbiAgICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIFthcmddKSA9PiB7XG4gICAgICAgIGd1YXJkUnVuT25seShcInVzZV9pbl9zZXR1cFwiLCBcIiQudXNlXCIpXG4gICAgICAgIGlmIChpc01vZHVsZUxpa2UoYXJnKSkge1xuICAgICAgICAgIGNvbnN0IGRvbWFpbiA9IGFyZ1xuICAgICAgICAgIGNvbnN0IHRhZyA9IGRvbWFpbi50YWcgYXMgdW5rbm93biBhcyBDb250ZXh0LlRhZzxcbiAgICAgICAgICAgIGFueSxcbiAgICAgICAgICAgIExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+XG4gICAgICAgICAgPlxuXG4gICAgICAgICAgY29uc3QgcmVzb2x2ZUFuZEJ1aWxkID0gcmVzb2x2ZU1vZHVsZVJ1bnRpbWUodGFnKS5waXBlKFxuICAgICAgICAgICAgRWZmZWN0Lm1hcCgocnQpID0+IGJ1aWxkTW9kdWxlSGFuZGxlKHRhZywgcnQpKSxcbiAgICAgICAgICApXG5cbiAgICAgICAgICBjb25zdCByZXNvbHZlV2l0aERlc2NyaXB0b3IgPSByZXNvbHZlTW9kdWxlUnVudGltZSh0YWcpLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QudGFwKChydCkgPT4gZW1pdE1vZHVsZURlc2NyaXB0b3JPbmNlKGRvbWFpbiwgcnQpKSxcbiAgICAgICAgICAgIEVmZmVjdC5tYXAoKHJ0KSA9PiBidWlsZE1vZHVsZUhhbmRsZSh0YWcsIHJ0KSksXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgY29uc3QgZGV0ZWN0QW5kU2VsZWN0ID0gRmliZXJSZWYuZ2V0KERlYnVnLmN1cnJlbnREaWFnbm9zdGljc0xldmVsKS5waXBlKFxuICAgICAgICAgICAgRWZmZWN0LnRhcCgobGV2ZWwpID0+IHtcbiAgICAgICAgICAgICAgY2FjaGVkRGlhZ25vc3RpY3NMZXZlbCA9IGxldmVsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIEVmZmVjdC5mbGF0TWFwKChsZXZlbCkgPT5cbiAgICAgICAgICAgICAgbGV2ZWwgPT09IFwib2ZmXCIgPyByZXNvbHZlQW5kQnVpbGQgOiByZXNvbHZlV2l0aERlc2NyaXB0b3IsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIClcblxuICAgICAgICAgIC8vIDAyMiBwZXJmIGdhdGVcdUZGMUFkaWFnbm9zdGljcyBvZmYgXHU2NUY2XHVGRjBDJC51c2UobW9kdWxlKSBcdTRFMEUgJC51c2UobW9kdWxlLnRhZykgXHU1RkM1XHU5ODdCXHU3QjQ5XHU0RUY3XHU0RTE0XHU5NkY2XHU5ODlEXHU1OTE2XHU1RjAwXHU5NTAwXHUzMDAyXG4gICAgICAgICAgLy8gXHU3RUE2XHU2NzVGXHVGRjFBRWZmZWN0IFx1NjYyRlx1NTAzQ1x1RkYwOFx1NTNFRlx1NTkwRFx1NzUyOFx1RkYwOVx1RkYxQlx1NTZFMFx1NkI2NFx1NUZDNVx1OTg3Qlx1NTcyOFx1NjI2N1x1ODg0Q1x1NjcxRlx1NTA1QVx1NEUwMFx1NkIyMVx1NjAyN1x1N0YxM1x1NUI1OFx1RkYwQ1x1ODAwQ1x1NEUwRFx1ODBGRFx1NTcyOFx1Njc4NFx1OTAyMFx1NjcxRlx1NTZGQVx1NUI5QVx1NTIwNlx1NjUyRlx1MzAwMlxuXHQgICAgICAgICAgcmV0dXJuIEVmZmVjdC5zdXNwZW5kKCgpID0+IHtcblx0ICAgICAgICAgICAgaWYgKGNhY2hlZERpYWdub3N0aWNzTGV2ZWwgPT09IFwib2ZmXCIpIHtcblx0ICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUFuZEJ1aWxkXG5cdCAgICAgICAgICAgIH1cblxuXHQgICAgICAgICAgICBpZiAoY2FjaGVkRGlhZ25vc3RpY3NMZXZlbCAhPT0gdW5kZWZpbmVkKSB7XG5cdCAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVXaXRoRGVzY3JpcHRvclxuXHQgICAgICAgICAgICB9XG5cblx0ICAgICAgICAgICAgcmV0dXJuIGRldGVjdEFuZFNlbGVjdFxuXHQgICAgICAgICAgfSkgYXMgdW5rbm93biBhcyBMb2dpYy5PZjxTaCwgUiwgYW55LCBuZXZlcj5cblx0ICAgICAgICB9XG4gICAgICAgIGlmIChDb250ZXh0LmlzVGFnKGFyZykpIHtcbiAgICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBhcmcgYXMgeyBfa2luZD86IHVua25vd24gfVxuXG4gICAgICAgICAgLy8gTW9kdWxlXHVGRjFBXHU4RkQ0XHU1NkRFXHU1M0VBXHU4QkZCIE1vZHVsZUhhbmRsZSBcdTg5QzZcdTU2RkVcbiAgICAgICAgICBpZiAoY2FuZGlkYXRlLl9raW5kID09PSBcIk1vZHVsZVRhZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZU1vZHVsZVJ1bnRpbWUoYXJnIGFzIGFueSkucGlwZShcbiAgICAgICAgICAgICAgRWZmZWN0Lm1hcCgocnQ6IExvZ2l4Lk1vZHVsZVJ1bnRpbWU8YW55LCBhbnk+KSA9PlxuICAgICAgICAgICAgICAgIGJ1aWxkTW9kdWxlSGFuZGxlKGFyZyBhcyBhbnksIHJ0KSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICkgYXMgdW5rbm93biBhcyBMb2dpYy5PZjxTaCwgUiwgYW55LCBuZXZlcj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBcdTY2NkVcdTkwMUEgU2VydmljZSBUYWdcdUZGMUFcdTc2RjRcdTYzQTVcdTRFQ0UgRW52IFx1ODNCN1x1NTNENiBTZXJ2aWNlXG4gICAgICAgICAgcmV0dXJuIGFyZyBhcyB1bmtub3duIGFzIExvZ2ljLk9mPFNoLCBSLCBhbnksIG5ldmVyPlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFZmZlY3QuZGllKFwiQm91bmRBcGkudXNlOiB1bnN1cHBvcnRlZCBhcmd1bWVudFwiKSBhcyB1bmtub3duIGFzIExvZ2ljLk9mPFxuICAgICAgICAgIFNoLFxuICAgICAgICAgIFIsXG4gICAgICAgICAgYW55LFxuICAgICAgICAgIG5ldmVyXG4gICAgICAgID5cbiAgICAgIH0sXG4gICAgfSkgYXMgdW5rbm93biBhcyBCb3VuZEFwaTxTaCwgUj5bXCJ1c2VcIl0sXG4gICAgb25BY3Rpb246IG5ldyBQcm94eSgoKSA9PiB7fSwge1xuICAgICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJncykgPT4ge1xuICAgICAgICBndWFyZFJ1bk9ubHkoXCJ1c2VfaW5fc2V0dXBcIiwgXCIkLm9uQWN0aW9uXCIpXG4gICAgICAgIGNvbnN0IGFyZyA9IGFyZ3NbMF1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKFxuICAgICAgICAgICAgcnVudGltZS5hY3Rpb25zJC5waXBlKFN0cmVhbS5maWx0ZXIoYXJnKSlcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmcgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZW50QnVpbGRlcihcbiAgICAgICAgICAgIHJ1bnRpbWUuYWN0aW9ucyQucGlwZShcbiAgICAgICAgICAgICAgU3RyZWFtLmZpbHRlcigoYTogYW55KSA9PiBhLl90YWcgPT09IGFyZyB8fCBhLnR5cGUgPT09IGFyZylcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBhcmcsXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJnID09PSBcIm9iamVjdFwiICYmIGFyZyAhPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChcIl90YWdcIiBpbiBhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKFxuICAgICAgICAgICAgICBydW50aW1lLmFjdGlvbnMkLnBpcGUoXG4gICAgICAgICAgICAgICAgU3RyZWFtLmZpbHRlcigoYTogYW55KSA9PiBhLl90YWcgPT09IChhcmcgYXMgYW55KS5fdGFnKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBTdHJpbmcoKGFyZyBhcyBhbnkpLl90YWcpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoU2NoZW1hLmlzU2NoZW1hKGFyZykpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKFxuICAgICAgICAgICAgICBydW50aW1lLmFjdGlvbnMkLnBpcGUoXG4gICAgICAgICAgICAgICAgU3RyZWFtLmZpbHRlcigoYTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBTY2hlbWEuZGVjb2RlVW5rbm93blN5bmMoXG4gICAgICAgICAgICAgICAgICAgIGFyZyBhcyBTY2hlbWEuU2NoZW1hPGFueSwgYW55LCBuZXZlcj5cbiAgICAgICAgICAgICAgICAgICkoYSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiAhIXJlc3VsdFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIocnVudGltZS5hY3Rpb25zJClcbiAgICAgIH0sXG4gICAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiB7XG4gICAgICAgIGd1YXJkUnVuT25seShcInVzZV9pbl9zZXR1cFwiLCBcIiQub25BY3Rpb25cIilcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIoXG4gICAgICAgICAgICBydW50aW1lLmFjdGlvbnMkLnBpcGUoXG4gICAgICAgICAgICAgIFN0cmVhbS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGE6IGFueSkgPT4gYS5fdGFnID09PSBwcm9wIHx8IGEudHlwZSA9PT0gcHJvcFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfSxcbiAgICB9KSBhcyB1bmtub3duIGFzIEJvdW5kQXBpPFNoLCBSPltcIm9uQWN0aW9uXCJdLFxuICAgIG9uU3RhdGU6IChcbiAgICAgIHNlbGVjdG9yOiAoczogTG9naXguU3RhdGVPZjxTaD4pID0+IGFueSxcbiAgICApID0+IHtcbiAgICAgIGd1YXJkUnVuT25seShcInVzZV9pbl9zZXR1cFwiLCBcIiQub25TdGF0ZVwiKVxuICAgICAgcmV0dXJuIGNyZWF0ZUludGVudEJ1aWxkZXIocnVudGltZS5jaGFuZ2VzKHNlbGVjdG9yKSlcbiAgICB9LFxuICAgIG9uOiAoXG4gICAgICBzdHJlYW06IFN0cmVhbS5TdHJlYW08YW55PixcbiAgICApID0+IHtcbiAgICAgIGd1YXJkUnVuT25seShcInVzZV9pbl9zZXR1cFwiLCBcIiQub25cIilcbiAgICAgIHJldHVybiBjcmVhdGVJbnRlbnRCdWlsZGVyKHN0cmVhbSlcbiAgICB9LFxuICB9IGFzIGFueVxuXG4gIHNldEJvdW5kSW50ZXJuYWxzKGFwaSBhcyBhbnksIHJ1bnRpbWVJbnRlcm5hbHMpXG5cbiAgcmV0dXJuIGFwaVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUEsSUFBTSxvQkFBb0IsQ0FBQyxTQUErQztBQUN4RSxNQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLFVBQU0sVUFBVSxLQUFLLEtBQUs7QUFDMUIsV0FBTyxRQUFRLFNBQVMsSUFBSSxVQUFVO0FBQUEsRUFDeEM7QUFFQSxNQUFJLENBQUMsTUFBTSxRQUFRLElBQUksRUFBRyxRQUFPO0FBRWpDLFFBQU0sUUFBdUIsQ0FBQztBQUM5QixhQUFXLE9BQU8sTUFBTTtBQUN0QixRQUFJLE9BQU8s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
|